Kst-2.0.8/0000755000175000017500000000000012362707010011354 5ustar synthsynthKst-2.0.8/README.kstScript0000644000175000017500000000455212277111530014230 0ustar synthsynthFor information on how to create Kst scripts in python, please see hen.astro.utoronto.ca/pyKst Kst implements a client-server interface for scripting. Scripts interacts with a running kst session. This server is implemented in scriptserver.cpp. Upon receiving a socket message from QLocalSocket, ScriptServer parses it. ScriptServer implements a map between command strings and ScriptServer member functions. These commands include "newVector()", "getPlotList()", etc. To edit a vector, you would call "beginEdit(Vector Name)". This would open an "interface". One interface is DialogScriptInterface which simply allows a script to control a hidden dialog. Where speed is important, other (hard-coded) interfaces are created. To close the interface, one would call "endEdit()". ScriptServer also implements a very minimalistic language providing: - if statements in the form: if(...) fi() - variables in the form: $a=blah setText($a) - macros in the form: newMacro(a,d=c) setText($a) setColor($d) endMacro() Note that 'c' is not a default argument: they initialize a and d so you can run a macro while writing it. newMacro(...) runs the macro while it is being written. newMacro_(...) does not) Note that kstScript (that is, the simple language ScriptServer understands) never uses quotes. It is therefore important that extra spacing is not added. Comments are also not supported. I feel that it is not worth improving this 'language'. If someone should have time, a port to javascript would certainly be better. You can use tests/kstcontrol to write kstScript macros. A list of possible commands is shown inside kstcontrol on the right hand side. To make macros permanent (i.e., load on start of kst) add them to the file "kstScript.txt". kstcontrol outputs macros you create to stdout on endMacro(). IMPORTANT =========== Writing macros is preferred over implementing them directly in a language (say, python) because the underlying API is not guaranteed to be consistent and macros allow multiple languages to all have similar functionality with better code reuse. To get a feel for how they are written, please see kstScript.txt. To give a language the ability to communicate with kst, implement functions which use QLocalSocket to communicate with ScriptServer. Refer to pykst whose source is available in pykst/pykst.py and pykst/pykstpp.py.Kst-2.0.8/devel-docs/0000755000175000017500000000000012277111530013402 5ustar synthsynthKst-2.0.8/devel-docs/general_1.x/0000755000175000017500000000000012277111530015505 5ustar synthsynthKst-2.0.8/devel-docs/general_1.x/threading.txt0000644000175000017500000000616012277111530020216 0ustar synthsynth Notes on threading: - you must lock and unlock global and shared objects to avoid races - KstObject classes are also locks internally, so you can just ->readLock(), ->writeUnlock() etc on them directly. - KstObjectList and Map classes have locks accessible with .lock() - KstWriteLocker and KstReadLocker are useful to lock an object and ensure that the object is unlocked when (and only when) the locker instance falls out of scope. Only put these on the stack. - KstShared objects must always be used by KstSharedPtr, NOT Foo*. If you use Foo*, you will not get proper reference counting. In most cases a typedef exists to make this easy. - some Qt objects are shared: - QMemarray - QMap - QString - QValueList - QValueVector You need to make -deep- copies of these in particular when using globals. example: KstDataObjectList mine = QDeepCopy(KST::dataObjectList); This could crash if the dataObjectList is modified while mine is being used. KST::dataObjectList is global and used from all threads in general. You need to make a deep copy of the list. - Use a write lock iff there is a possibility that you will modify the object. - Don't make your locks too finegrained. If looping, either copy the data you need in the loop temporarily, or lock around the outside of the loop instead of constantly locking and unlocking inside the loop. - Maximum recursion depth of read locks is 30. Maximum recursion of write locks is 0. Locking for writing twice in the same thread is a guaranteed deadlock. - Locking is generally "explicit" in that if you are accessing object "x", you must x->readLock(); /* read from x */ x->readUnlock(). x will not lock itself when it needs to read members. The only implicit locking happens in a few special cases, and in shared pointer reference counting (semaphore is used). ------------------------------------------------------------------- 08/10/06 How to fix our deadlock issues. Recent changes to object complexity and performance of locking in Kst have brought some old deadlock scenarios up in frequency and made Kst appear far less stable. Past fixes for these deadlocks were apparently insufficient and only fixes some cases. The most common scenario is this: Thread 1 locks Object A Object A starts to lock dependencies Context switch Thread 2 locks Object B Object B starts to lock dependencies and eventually blocks on Object A Context switch Object A continues to lock dependencies and blocks on an object locked by B -> deadlock The general solution for this is to lock all objects in a consistent order, such as pointer value of object or lock. We do this presently, but only at each level, which is insufficient in complex object structures. One possible solution is for KstDataObject to first obtain all pointers requiring locks, recursively, and then sort and lock them iteratively. The problem is that in order to obtain these pointers, we will need to have locks on the objects, thus defeating the goal. It is proposed to split locking into shallow and deep locking, allowing a shallow lock for tree reading, and a deep lock for more complex operations. Kst-2.0.8/devel-docs/general_1.x/appdesign.txt0000644000175000017500000000257212277111530020226 0ustar synthsynth Kst is designed as a multi-layer application. The core is intended to be small and well-focused on the core functionality. Additional features and functionality are implemented as plugins, extensions, or datasource plugins. libkst ------ This contains the bare minimum required by Kst extensions in order for them to cleanly link and be sufficiently powerful to perform their tasks. It should not contain any data or view object code at this time. libkstmath ---------- All non-gui dependent math code and data objects (equations, PSDs, etc) go here. This is not presently installed. d2asc ----- A command line utility to convert any kst supported data file into ascii. kst --- This is the core executable. It links to libkst, qt, KDE, and not much else. kst proper contains only main.cpp. The rest is in libkstapp. extensions ---------- Kst extensions allow developers to add functionality that may not be required by all Kst users, or is more of a peripheral or optional component. Extensions are loaded on demand of the user. datasources ----------- These are runtime loaded plugins which add support in Kst for loading files of various formats. plugins ------- Plugins are Kst-independent loadable modules that implement new mathematical algorithms for use inside Kst. These are often of limited or no value to most users, so they should be implemented as plugins to avoid bloat. Kst-2.0.8/devel-docs/general_1.x/i18n.txt0000644000175000017500000000213012277111530017021 0ustar synthsynthKst is now being actively translated by the KDE translation team. As such, we should do our best to help them with their task. This means: 1) Make sure you i18n() or I18N_NOOP() your strings as appropriate. 2) Keep in mind that some languages are Right-To-Left. You cannot do things like: QString foo = i18n("My first statement."); foo += i18n("\nmore text"); 3) There are three variants of i18n() and I18N_NOOP(). We need to make heavy use of the "comment" ones because the translators do not understand all of our terminology: i18n(const char *string); i18n(const char *comment, const char *string); i18n(const char *singular_form, const char *plural_form, unsigned long n); The comment one looks like this: i18n("A curve that represents a \"best fit\" for another curve.", "Fit Curve"); 4) Don't change i18n()s if you don't have to. It introduces "fuzzies" and makes life difficult for translators. 5) Be aware of non-language issues for translation, such as dates (different calendar systems), currencies, numerics, and units. KDE provides various facilities to deal with some of these issues. Kst-2.0.8/devel-docs/general_1.x/plotmarkers.txt0000644000175000017500000000240312277111530020610 0ustar synthsynthFor plot marking: ================= - use Alt-Left Click to created a plot marker at the current position - use a vertical dotted foreground-colour line to mark the plot. - all other zooming/data mode actions are still available. Add to Plot Dialog ------------------ - plot markers will be part of plots, not curves. - have a new tab on the Plot Dialog called Markers - on the tab will be a list of plot markers (probably in x-coordinate form) - underneath/beside the list of plot markers will be 3 buttons: - Add (to manually add a plot marker by entering the value) - Remove (this will remove selected plot marker(s)) - Remove All Add to Plot Context Menu ------------------------ - add a separater to the bottom of the Scroll submenu in the context menu - underneath the separater, add two entries: - Next Plot Marker - Previous Plot Marker - suggested shortcuts - Alt+Right arrow/Alt+Left arrow, PgUp/PgDown,... - moving to plot markers is a scrolling action, it will not change the zoom "level" Additional Details ------------------ - there will be public functions for adding, removing, and retrieving plot markers from plots (event monitors could use these to add markers, given that a plot is specified to be associated with the event). Kst-2.0.8/devel-docs/general_1.x/mimetypes.txt0000644000175000017500000000214312277111530020262 0ustar synthsynthList of mimetypes we provide and their definitions: application/x-kst: A Kst XML file in full application/x-kst-fragment: A Kst XML fragment that can be read and interpreted, but does not describe a full Kst session. Unimplemented. application/x-kst-plot-list: A list of plot names encoded as a qstringlist. Used primarily for drag and drop in the plot dialog. application/x-kst-plot-names: A list of plot names encoded as a qstringlist, preceded by a window. Used for drag and drop of plots between windows in Kst 1.1.0 only. DEPRECATED application/x-kst-legend: A plot legend. Contains the window name, the plot name, and the hotspot. DEPRECATED application/x-kst-label-number: A plot label. Contains the window name, the plot name, the label number in the internal list, and the hotspot. DEPRECATED application/x-kst-plots: Unimplemented, reserved for plot dragging. Do not implement support for drag and drop or copy and paste for the deprecated mimetypes in any new applications. They are almost entirely useless there, and these types will be removed from Kst starting in version 1.2.0. Kst-2.0.8/devel-docs/general_1.x/testplan.txt0000644000175000017500000002232212277111530020101 0ustar synthsynthKst Test Plan ============= This is a test plan designed to test basic functionality of the entire Kst application as a whole, from a user perspective. Only certain combinations of certain actions are tested. In the following steps, each action should produce an expected result. Results deviating from the expected results should be recorded. Results not deviating from the expected result should be recorded as well. The following perl script is used: datagenerator.pl under kst/tests/ I. Compiling and Installing --------------------------- 1. Make sure CFITSIO and GSL libraries are installed. 2. Download and untar the Kst source. 3. Do the following: ./configure --prefix=`kde-config --prefix` make make install Expected Result: Kst is installed. 4. Run Kst: kst Expected Result: Kst starts. Main window is shown. II. Basic Functionality ----------------------- 0. Run: datagenerator.pl testdata Wait 30 seconds. Terminate execution of datagenerator.pl. 1. Select Data->Data Wizard. Browse to "testdata". Click Next. Expected Result: 2nd window of Data Wizard is displayed. 4 fields should be selectable. 2. Type * in the Search box. Expected Result: All fields should be highlighted. 3. Remove * from the Search box and highlight fields 2, 3, and 4. Click Check Selected. Expected Result: Fields 2,3,4 should be checked. Field 1 should not be checked. 4. Check the Read to end checkbox. Select XY and Power Spectrum for Plot Type. Click Next. Select 1 plot per curve. Click Finish. Expected Result: 6 plots are displayed. 5. Drag a rectangle on a plot. Expected Result: Plot zooms in. 6. Hold down shift and drag a rectangle on a plot. Expected Result: Plot zooms in on y axis only. 7. Hold down ctrl and drag a rectangle on a plot. Expected Result: Plot zooms in on x axis only. 8. Hold cursor over a plot and hit left, right, up, down arrow keys. Expected Result: Plot scrolls left, right, up, down respectively. 9. Right-click on a plot and select Edit->(Curve Name). Change Y Axis Vector and change curve colour. Click Apply Edits. Expected Result: Plot changes to reflect new vector and colour. 10. Select Data->Data Manager. Click Vector button under New: and choose field 2. Click Apply As New. Click Close. Expected Result: New vector V5-2 should be created. 11. Click Curve. Select V0-INDEX as X axis vector and V1-2 as Y axis vector. Click Apply As New. Click Close. Expected Result: New Curve and plot are created. 12. Click Equation. Enter the equation: [V1-2]+SIN([V2-3]) Click Apply As New. Click Close. Expected Result: New Equation is created. 13. Click Histogram. Select V3-4 as the vector. Click Apply As New. Click Close. Expected Result: New Histogram is created. 14. Click Power Spectra. Select V1-2 as the vector. Click Apply As New. Click Close. Expected Result: New Power Spectrum is created. 15. Click Plugin. Select Fit polynomial as the plugin. Select V0-INDEX as the X Array and V1-2 as the Y Array. Enter 2 as the order. Click Apply As New and then Close. Expected Result: New Plugin is created. 16. Expand the listing for the new plugin in Data Manager and right-click on ...-Y Fitted. Select Make Curve. Click Apply As New and click Close. Expected Result: New Curve showing the fit is created. 17. Click Event. Select V1-2 as the vector. Append >0 to the expression. Select Log As and choose Warning. Click Apply As New and click Close. Expected Result: New Event is created. 18. Right-click C2-V2-3 and choose Remove From Plot->(plot name). Right-click PSD3-V2-3 and choose Remove From Plot->(plot name). Click the Purge button. Expected Result: C2-V2-3, PSD3-V2-3 and V2-3 are removed from Data Manager. 19. Close Data Manager. Goto Help->Debug Kst. Select Log tab. Expected Result: There are 13 Event Monitor Warnings. 20. Close Kst Debug Dialog. Select Plots->Label Editor. Click on any plot. Expected Result: Label Editor dialog appears. 21. Enter arbitrary label text. Select a font and enter 30 for rotation. Click OK. Expected Result: Label is created, rotated 30 degrees clockwise. 22. Drag the label. Expected Result: Label moves to new location. 23. Click on the label. Expected Result: Label Editor Dialog appears with settings for this label. 24. Click Ok. Select Plots->Layout Mode. Drag the plots around and resize by dragging edges of the plots. Expected Result: Plots are rearranged and resized. 25. Select Plots->Layout Mode. Select Plots->XY Mouse Zoom. 26. Select File->Print. Click Print. Expected Result: Current window is printed in landscape orientation, with footer. 27. Select File->Save Vectors to Disk. Select V3-4 and click Save. Enter a filename and click Save, then Close. Select File->Export to Graphics File. Select a Save Location and click Save Once. Expected Result: Vector and Graphics files are saved to specified locations. 28. Right-click and plot and select Delete. Expected Result: The plot is removed from window. 29. Select File->New Window. Enter 1234 and click OK. Select File->New Window. Enter abcdef and click OK. Expected Result: Two new windows are created. 30. Select Window->MDI Mode->Toplevel. Expected Result: Windows are arranged in Toplevel mode. 31. Select Window->MDI Mode->Childframe. Select Window->Tile...->Tile Non-overlapped Expected Result: Windows are arranged in Childframe mode, tiled. 32. Select Window->MDI Mode->Tab Page Mode. Expected Result: Windows are arranged in Tab Page mode. 33. Select Window->MDI Mode->IDEAl mode. Expected Result: Windows are arranged in IDEAl mode. 34. Select File->Save. Save file to a location. Select File->New Expected Result: All windows are cleared. 35. Select Data->Data Manager. Expected Result: No data objects are present. 36. Select File->Quit. Expected Result: Kst exits. 37. Start Kst. Select File->Open. Browse to file saved in step 34. Expected Result: All windows, plot layouts, data objects saved are open. 38. Select Settings->Plugins. Highlight Autocorrelation and click Remove, then Yes. Highlight Chop and click Remove, then Yes. Highlight Linefit and click Remove, then Yes. Expected Result: Autocorrelation, Chop, Linefit are removed from list. 39. Click Rescan. Expected Result: Autocorrelation, Chop, Linefit are added to list. 40. Click Close. Select File->Quit. Expected Result: Plugin Manager is closed. Kst exits. 41. Delete testdata. Streaming Data ============== 0. During the following steps, note any slowless or strange behaviour. 1. Run: datagenerator.pl teststream 2. Start Kst. Select Data->Data Manager. Click Vector. Browse to teststream for File name, select Field 1. Check Read to End. Click Apply as New. Select Field 2. Check Read to End. Click Apply as New. Click Close. Expected Result: Vectors V1-1 and V2-2 are created. 3. Click Curve. Select V1-1 for X axis vector, V2-2 for Y axis vector. Click New... under Curve Placement. Type 1234 and click OK. Check Place in new plot. Click Apply as New. Expected Result: New Curve is created in new window and plot. 4. Watch plot for 10 seconds. Expected Result: Plot updates as new data is written. 5. Select Range->Pause. Watch plot for 10 seconds. Expected Result: Plot does not update. 6. Select Range->Read from End. Watch plot for 10 seconds. Expected Result: Plot updates with new data. 7. Select Plots->XY Mouse Zoom. Draw a rectangle on plot. Watch plot for 10 seconds. Expected Result: Plot zooms in to rectangular area, does not update. 8. Right-click on plot, select Zoom->Zoom Maximum. Watch plot for 10 seconds. Expected Result: Plot updates with new data. 9. Select Plots->Y Mouse Zoom. Draw rectangular area on plot. Watch plot for 10 seconds. Expected Result: Plot zooms in on y axis, plot continues to update. 10. Select Plots->X Mouse Zoom. Draw rectangular area smaller than current plot size. Watch plot for 10 seconds. Expected Result: Plot zooms in on y axis, plot does not update. 11. Right-click on plot, select Zoom->Zoom Maximum. Click plot and hit right arrow key 5 times. Watch plot for 10 seconds. Expected Result: Plot scrolls to right, revealing blank area. Plot updates and draws curves to blank area. 12. Right-click on plot, select Zoom->Zoom Maximum. Select Plots->Edit Plots. Select Limits tab. Under X Axis, choose AC: Range, and enter 9000. Click Apply Edits and click Close. Watch plot for 10 seconds. Expected Result: X axis changes to 9000 length, plot updates, lower x axis value updates accordingly to keep 9000 length. 13. Select Data->Edit Equation. Create equation: [V1-2]*5 Select V0-1 for Use Existing Vector under Independent Variable. Select Place in new plot under Curve Placement, click Apply as New. Expected Result: New curve and plot is created, 14. Watch plot for 10 seconds. Expected Result: New curve and plot updates simultaneously with original plot. 15. Select File->Quit, click No. Expected Result: Kst exits. 16. Terminate execution of datagenerator.pl, delete teststream. Kst-2.0.8/devel-docs/general_1.x/codingstyle.txt0000644000175000017500000001175312277111530020601 0ustar synthsynth- indenting is emacs style 2 space, no tabs - all files should have appropriate vim modelines at the end: // vim: ts=2 sw=2 et - bracing and structure style is as follows: for (int x = 1; x < 10; ++x) { val *= x; } if (x == y) { z(); } else if (q < r) { } else { } switch (expression) { case 1: foo(); break; case 2: default: } rettype Class::method(type var, type var, ...) { type var; type var2 = val, var3; function(); etc return var; } - class layout example: class X : public Y, private Z { Q_OBJECT public: X(); virtual ~X(); private: public slots: }; - all include files must be guarded: #ifndef FILENAME_H #define FILENAME_H #endif - avoid inline methods - it makes things difficult to modify later - designer .ui.h files use designer default indenting format - don't use superfluous semicolons. It causes compile problems with some compilers. - all .c, .cpp, .h files must have license and copyright headers - all files must be licensed *GPL* unless it derives from non-GPL compatible code, in which case you must contact the Kst developers and maintainers before integrating it - no C++ exceptions will be used - the present hard requirements for compilation are KDE 3.3.0. No new hard requirements may be added, though conditional compilation is fine. - be very sensitive of performance (both startup time and runtime) of all Kst components. profile often - don't make constant unnecessary changes as part of other commits since it destroys cvs annotations - variables do not use "Hungarian notation" pchlzpstrMyVariable style of naming. Qt/KDE style naming is preferred: type myVariableName; type _myMethodName; - public variables should be avoided as much as possible as they eventually will cause problems (circumvents locking). Naming can be myPublicName or MyPublicName. Both are common in Kst. Perhaps this should be standardized in the future. - global variables must be namespaced in some way, and can use myGlobalName or MyGlobalName naming styles as appropriate - methods should use Qt-style myMethodName() naming style. functions should use myFunctionName() or (less preferably) MyFunctionName() - DCOP methods are public, and therefore must always be 100% clean. Do not use short forms, be consistent in nomenclature, and follow the most preferred and already-used capitalization schemes. - Text literals must use i18n(). Be conscious of the fact that translators do not know anything about Kst or perhaps about things like "PSD"s and "fit"s, and that different languages have very different geometry, pluralization, and word-order requirements. Consult KDE developer documentation for more information. - Kst is now nicely component-ized after much hard work. Let's keep it that way. No huge monolithic/multipurpose classes. Use abstract interfaces and concrete implementations, where applicable as KDE-style plugins. - Discuss changes of design on the list first. Commit second. Sometimes a concrete implementation as a branch or a patch set can be very convincing. - Remember portability. Kst runs on many hardware and software platforms, is compiled with various compilers, and is run in all kinds of strange environments now. Just because it works on Linux or GCC doesn't mean it will work anywhere else. - Don't use char to store numbers, use int bitfields. Char is signed on some platforms and unsigned on others, leading to all kinds of strange bugs. - Make methods const where applicable to allow use of const objects and pointers. Keep in mind if something may need to be non-const in the future so that we don't break existing code. - Don't use unnecessary const_cast - much effort was put into making the code "const correct". - Pass arguments and return values as const& where applicable for performance reasons. - Early returns to avoid huge nesting of blocks is -good-. It makes the code easy to understand. Do it, and don't remove it. Use judgement to avoid making soup. - Have care to push class instantiations down as far as possible in scope. Some are quite expensive to instantiate and there is no value in following the old C-style declarations. Instantiating objects that aren't used just slows down Kst. - If you fix a bug for code that has substantial testing support in tests/, you must add a testcase to avoid regressions in the future. - Methods and functions that return their values through references are -banned-. Do not add these as new code, and try to clean up old ones as you go. If you must return multiple values individually, use a pointer. It's too confusing to use references and leads to many hard-to-trace bugs. Ideally use a single structure/class to encapsulate the data and return. - Why do we do this? To make coding on Kst faster, easier, more consistent, and more efficient. Kst-2.0.8/devel-docs/general_1.x/objectnaming.txt0000644000175000017500000001161312277111530020710 0ustar synthsynthAll data objects (objects derived from KstObject) should be globally accessible from a hierarchical namespace. The general idea is to change tags to be a path instead of a simple name. A full path should uniquely specify a particular object in the hierarchy. We use separate hierarchies for different object types to allow, for example, a vector and a string to have the same name. The relationship of a KstObject being below another KstObject in the hierarchy means that the parent object CREATED the child object. Note that this is not the same thing as data PROVIDERS, which form a dependency graph (perhaps with cycles) rather than a tree. For example, a PSD created with the PSD button in the Data Manager is placed after its source vectors in the provider graph, but is a Level 1 object (i.e. not below its source vectors) in the naming hierarchy. Level 0 ------- An implied single root with no name. It is probably better to show Level 1 objects as multiple roots and have no Level 0 object. Level 1 ------- - Providers/Data Sources. - Global constants. A CONSTANTS namespace can be used (maybe with a full hierarchy of constant types). - Global (user-created) KstPrimitives - e.g. generated KstVector, KstMatrix - user-created KstDataObjects - curves, equations, power spectra, etc. Level 2 ------- - Data vectors read from a data source (e.g. KstVector::tagName()). These names will not collide as long as there are unique names in each data source. - Data source metadata strings, scalars (author, dataset description, numFields, etc.) Level 3 ------- - KstObjects generated from level 2 objects (e.g. KstScalars for min, max, etc.). - Data object metadata strings, scalars (units, field description, etc.) In labels, one can use the full path to specify a field (e.g. [DataSource1/Field1/max]), or start with any globally-unique name and go from there, which is compatible with the current model (e.g. [Field1/max]). Using '/' as a path separator allows compatibility with existing .kst files, but will cause conflicts with datasources using '/' within field names. For now, I'm converting '/' to '-'. In addition to the global lists of scalars, vectors, matrices, etc., we can view the data as a tree of KstObjects: - DataSource1 \ + Field1 + Field2 - DataSource2 \ + Field1 - Field1-2 \ - min - max <========== [DataSource2/Field1-2/max] or [Field1-2/max] - Field2 \ - min - max - units - description + Field3 - Field4 \ - min - max - units - description We have separate trees to show only scalars or strings (or whatever) in an organized way. IMPLEMENTATION DETAILS ====================== Instead of tags being QStrings, they are now KstObjectTag objects. These objects contain a QString tag (the last part of the hierarchical tag) and a QStringList context. The static constant KstObjectTag::globalTagContext represents global tags (i.e. Level 1). KstObjectTag::constantTagContext represents a namespace for constants. For an empty tag in the global namespace, use KstObjectTag::invalidTag. Unless otherwise specified, the context is assumed to be the global context. Display Tags ------------ In situations where we display a flat list of object tags (i.e. the primitive selector comboboxes), we can use display tags. Inside a KstObjectTag there are two variables: _minDisplayComponents and _uniqueDisplayComponents. _minDisplayComponents is the minimum number of path components used to form the display tag. It is set by the user and has a default value of 1. When a tag is created in the context of another tag, the default value takes one components of the context tag. _uniqueDisplayComponents is the number of path components needed to ensure that the display tag is unique. It is kept up-to-date by the KstObjectCollection containing the KstObject. The display tag is formed by taking the last MAX(_minDisplayComponents, _uniqueDisplayComponents) components of the full tag. e.g.: These 4 scalars exist in the system: - The global constant CONST_PI. The full tag is "CONSTANTS/CONST_PI". The display tag is "CONST_PI". - The Max scalar for field GYRO1 in datasource DS-dirfile1. The full tag is "DS-dirfile1/GYRO1/Max". Since the tag was created in the context of the GYRO1 vector's tag (DS-dirfile1/GYRO1), _minDisplayComponents is 2. The display tag is "GYRO1/Max". - The Max scalar for field GYRO2 in datasource DS-dirfile1. The full tag is "DS-dirfile1/GYRO2/Max". Again, _minDisplayComponents is 2. Since there is also a GYRO2 vector from datasource DS-dirfile2, _uniqueDisplayComponents is 3 (since "GYRO2/Max" is not unique). Therefore, the display tag is "DS-dirfile1/GYRO2/Max". - The Max scalar for field GYRO2 in datasource DS-dirfile2. The full tag is "DS-dirfile2/GYRO2/Max". The display tag is "DS-dirfile2/GYRO2/Max". The flat list of scalars will be: CONST_PI DS-dirfile1/GYRO2/Max DS-dirfile2/GYRO2/Max GYRO1/Max Kst-2.0.8/devel-docs/general_1.x/memory.txt0000644000175000017500000000746212277111530017567 0ustar synthsynth 1) Allocation malloc() and realloc() are defined to return null pointers in some cases and this should be tested for. In particular, we need to test for it when we do big allocations. However we may not always prevent bad situations like this. Actually, in most cases we probably won't. This is because Linux will allocate memory to us even when it's not *really* available, and the machine will go into "swap hell" or the app will be killed by the kernel. Linux is the main platform for Kst so it is the primary concern. This behaviour is actually ideal as well, since OOM is generally quite uncommon now, and many apps allocate more memory than they really need. We are a special case and we really do use lots of memory. As a C++ application, we use the C++ allocator whenever possible. For data vectors, we use malloc() and realloc(), and checking for failed allocations is important since users may tried to load in data so huge that it can't possibly be dealt with. Unfortunately it is probably more likely that the user loads in enough to go into heavy swap but not enough to actually fail the malloc. Therefore we have code on Linux that checks the system memory and tries to guess if we will enter this situation. If so, the malloc is denied. You must use the Kst malloc replacement in order to get this behaviour. In general malloc() is deprecated and discouraged in Kst. C++ objects (widgets, containers, other classes) are allocated with the C++ allocator in Kst. That is, Foo *foo = new Foo;. The C++ allocator has one of two behaviours when allocations fail: 1) throw an exception 2) return null We don't use exceptions in Kst, so 1 is not suitable. By default g++ doesn't do 2 so it is not suitable at this time. Furthermore, even if we did start using exceptions or hardcoded the g++ flags in the makefile to do 2, we still would crash. Here's why: It is at least 50% likely that this call will fail in a place that guarantees a crash: QListView *l = new QListView(this); The reason is that internally, it uses [at least one] "d-pointer" which is allocated without checking the return code. If an exception is thrown, we don't really know where it failed, and it's likely we will crash due to null or dangling pointers deep inside one of these classes. If null is returned, it's not checked in Qt and it's likely that it will crash since it assumes that the allocation succeeded. Furthermore, these allocations are generally small, so if they fail, it is because the OS [being most likely Linux] is so far into swap or out of memory that it is doomed to fail no matter what we do, including trying to recover, save data, or notify the user. We're just plain toast at this point. Not only that, but we are multithreaded and we have no mechanism to be able to prevent those other threads from stomping us out of existance too. Therefore, code that checks for null return from operator new is just adding extra indent and making the code messy and complicated for no gain. In most cases, Kst will be horribly inconsistent internally if we do check for null because we just don't expect this anywhere in the ~70,000 lines of code we have so far. Finally, it's important to note that failed operator new is exceedingly rare in the KDE world. Practice shows that there is no tangible gain in checking for this case, and more time should be spent making the code more stable in other ways. 2) Deallocation free() expects a non-null pointer delete and delete[] -check- the pointer for null before deallocating. There is never a need to do: if (foo) delete foo; This is equivalent to writing: if (foo) { if (foo) { free(foo); } } It's just silly. Never, ever, ever mix malloc/free, new/delete, or new[]/delete[]. They are all different and mixing them will just result in crashes. Make sure you match them properly in all cases. Kst-2.0.8/devel-docs/general_1.x/datatypes.txt0000644000175000017500000000375212277111530020253 0ustar synthsynth Kst contains types, just as a typical computer application. In C++, there are primitive types (POD) and derived types (classes). In Kst, we have the following categorization: Primitive Types Derived Types Interpretations ------------------------------------------------------------------------- KstScalar KstPSD KstVCurve KstString KstEquation KstImage* KstVector KstHistogram KstRVector KstPlugin KstAVector KstCSD KstSVector KstMatrix* KstRMatrix KstAMatrix KstSMatrix KstMatrix and KstImage are presently wrong in Kst. They are both derived types, and yet one represents primitive underived data (though it is not implemented that way), and the other is used directly to interpret that data as a visualization. Primitive types can be created by the user, or loaded from storage. The present data loading mechanism is flawed in that it only supports loading one type of data from disk: vectors. KstDataSource needs to be expanded with a keyed plugin mechanism and needs to drop binary compatibility issues [-internally- -only-] so that it can be extended to support these other primitive types. This key is implemented in the development code. The next step is to create Kst?Matrix classes which behave as close as possible to the same way Kst?Vector does, with an interface as close as possible to that of Kst?Vector. Once this is done, the KstDataSource interface can be extended to support loading them (as well as all other primitive types). The Matrix dialog will become an equivalent to the Vector dialog. Note that Matrix needs to be a primitive type internally too. It should not use KstVector. After matrices are renovated, KstImage needs to be converted into a KstBaseCurve and adjusted somewhat to be a generic curve with a matrix for storing data. It is desired at some point to be able to render all sort of different image formats easily with this class. This change, however, depends on changes to Kst2DPlot to an extent, and should wait for those changes. (they are minor) Kst-2.0.8/devel-docs/general_1.x/branches.txt0000644000175000017500000000144712277111530020041 0ustar synthsynthBranch: svn.kde.org/home/kde/branches/kst/1.1/ Description: Stable branch for Kst 1.1.x Branch: svn.kde.org/home/kde/branches/kst/1.2/ Description: Stable branch for Kst 1.2.x Branch: svn.kde.org/home/kde/branches/kst/hfi_calib/ Description: Branch for use by HFI. Restricted to George only for commits. Branch: svn.kde.org/home/kde/branches/kst/branches/work/kst/* Description: Branches for development of new features outside of trunk. You make a branch with: svn cp https://svn.kde.org/home/kde/trunk/extragear/graphics https://svn.kde.org/home/kde/branches/work/kst/ You can then check out your branch from that URL. It's best to remove the parts of the branch that you do not need. Simply check it out with: svn co https://svn.kde.org/home/kde/branches/work/kst/ Kst-2.0.8/devel-docs/general_1.x/datamodel.txt0000644000175000017500000000126512277111530020204 0ustar synthsynth A Kst session consists of a data model along with a graphical representation of some or all of that data model. The data comes from various places known as data sources. A data source is a file, network, or other resource that provides one or more primitives. A primitive is (presently) a string, scalar, vector or matrix. These can be composed with mathematical algorithms by a data object. Data objects also output one or more primitives. Primitives can then be associated as relations, such as a curve. Relations and primitives can then be used in graphical representations known as views and view items. Dialogs and wizards are used to hide these representations from the user. Kst-2.0.8/devel-docs/plugins/0000755000175000017500000000000012277111530015063 5ustar synthsynthKst-2.0.8/devel-docs/plugins/KstBasicPlugins0000644000175000017500000000724612277111530020064 0ustar synthsynthKstBasicPlugin Plugins ---------------------- The purpose of a KstBasicPlugin plugin is to provide an implementation of the virtual class "KstDataObject" via the abstract class "KstBasicPlugin." Plugin writers need to provide a class that inherits "KstBasicPlugin" and a .desktop file. Here is an example of the .desktop file named 'kstobject_myplugin.desktop': [Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=kstobject_fooplugin X-Kst-Plugin-Author=Your Name X-Kst-Plugin-Version=0.1 Name=Foo Comment=A plugin that provides Foo algorithm. Your C++ class should inherit KstBasicPlugin and provide implementations of the pure virtual methods found in KstBasicPlugin: //The implementation of the algorithm the plugin provides. //Operates on the inputVectors, inputScalars, and inputStrings //to produce the outputVectors, outputScalars, and outputStrings. virtual bool algorithm() = 0; //String lists of the names of the expected inputs. virtual QStringList inputVectorList() const = 0; virtual QStringList inputScalarList() const = 0; virtual QStringList inputStringList() const = 0; //String lists of the names of the expected outputs. virtual QStringList outputVectorList() const = 0; virtual QStringList outputScalarList() const = 0; virtual QStringList outputStringList() const = 0; Here is an example of a plugins header file: #ifndef FOOPLUGIN_H #define FOOPLUGIN_H #include class FooPlugin : public KstBasicPlugin { Q_OBJECT public: FooPlugin(QObject *parent, const char *name, const QStringList &args); virtual ~FooPlugin(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; }; And here is an example of a plugins cpp file: #include "fooplugin.h" #include static const QString& VECTOR_IN = KGlobal::staticQString("Vector In"); static const QString& SCALAR_IN = KGlobal::staticQString("Scalar In"); static const QString& STRING_IN = KGlobal::staticQString("String In"); static const QString& VECTOR_OUT = KGlobal::staticQString("Vector Out"); static const QString& SCALAR_OUT = KGlobal::staticQString("Scalar Out"); static const QString& STRING_OUT = KGlobal::staticQString("String Out"); K_EXPORT_COMPONENT_FACTORY( kstobject_fooplugin, KGenericFactory( "kstobject_fooplugin" ) ) FooPlugin::FooPlugin( QObject */*parent*/, const char */*name*/, const QStringList &/*args*/ ) : KstBasicPlugin() { } FooPlugin::~FooPlugin() { } bool FooPlugin::algorithm() { //Do something... return true; } QStringList FooPlugin::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FooPlugin::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList FooPlugin::inputStringList() const { return QStringList( STRING_IN ); } QStringList FooPlugin::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FooPlugin::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FooPlugin::outputStringList() const { return QStringList( STRING_OUT ); } #include "fooplugin.moc" The KstBasicPlugin takes care of providing almost everything, including the configuration widget for your plugin. The one thing it doesn't do is provide the actual algorithm or the names of the inputs/outputs. See the Line Fit plugin for an example implementation. Kst-2.0.8/devel-docs/plugins/StartHere0000644000175000017500000000441212277111530016710 0ustar synthsynthHow To Make Kst Plugins ----------------------- KstPlugins are modules that can be loaded into Kst to provide additional functionality. KstPlugins are presently implemented as: - KstDataSource plugins + These provide the ability to read in different file formats or data "sources". - KstDataObject plugins + These are advanced data plugins that provide their own configuration dialog. - KstBasicPlugin plugins + These are basic data plugins that inherit KstDataObject plugins, but are provided with a default configuration dialog. - KstCPlugin plugins + These are deprecated data plugins replaced by KstBasicPlugins. - Kst Extensions + These allow entire subsystems to be added to Kst without touching the Kst core. All KstPlugins except KstCPlugins are KDE style plugins and therefore require a .desktop file and must be installed in the KDE standard plugins directories. They derive from the base servicetype "Kst/Plugin". This base type includes two kst specific properties: X-Kst-Plugin-Author: A string containing the name of the author. X-Kst-Plugin-Version: A string containing the version of the plugin. ,desktop files also have additional properties. Here are the required ones: Name: A string containing the name of the plugin. For instance, "My Plugin". ServiceTypes: For KstDataSource this is "Kst Data Source" and for KstDataObjects this is "Kst Data Object" etc, etc... X-KDE-ModuleType: This should be set to "Plugin". X-KDE-Library: The library name. This is not the filename, but a name that is used to construct it. For instance, it could be "kstobject_myplugin" where the library might be named "kstobject_myplugin.so". This must also be a legal C variable name as it is used to construct the function names inside the library. Note: for KstDataSource plugins the name here is shortened even further: the actual library name is kstdata_myplugin.so, but you should put "myplugin" as the value for this property. Some other .desktop properties are also common to all plugins: Comment: The description of the plugin. To find out more about creating these plugins look in the respective file for the type of plugin you are interested in creating. Kst-2.0.8/devel-docs/plugins/KstDataSources0000644000175000017500000000235112277111530017706 0ustar synthsynthKstDataSource Plugins --------------------- The purpose of a KstDataSource plugin is to provide an implementation of the virtual class "KstDataSource". By default this class does nothing, which means that there is no direct way to load external data into Kst. Such a plugin provides three symbols: extern "C" { // Create a data source. KstDataSource *create_(const QString& filename, const QString& type); // Does this plugin understand the file indicated by the argument? bool understands_(const QString& filename); // Which types of data does this plugin provide a data source for? QStringList provides_(); } Generally you will have to create one or more derived classes of KstDataSource which implement your I/O system. Along with the shared object, you must also create a desktop file: => kstdata_myplugin.desktop [Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=myplugin X-Kst-Plugin-Author=Your Name X-Kst-Plugin-Version=0.1 Name=My Plugin Comment=A long description of what this thing actually does. You can find a template datasource plugin in kst/datasources/template/. It includes a proper Makefile.am, source files, and a desktop service file. Kst-2.0.8/devel-docs/plugins/KstDataObjects0000644000175000017500000000266512277111530017664 0ustar synthsynthKstDataObject Plugins --------------------- The purpose of a KstDataObject plugin is to provide an implementation of the virtual class "KstDataObject." Plugin writers need to provide a class that inherits "KstDataObject" directly. You will also need to provide a .desktop file and a configuration widget for this plugin. The benefit of this type of plugin over KstBasicPlugin plugins is the degree of control you'll have over the implementation. Most plugins should probably use KstBasicPlugin, but if you need a custom dialog for instance, this is the type of plugin for you. Here is an example of the .desktop file named 'kstobject_myplugin.desktop': [Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=kstobject_fooplugin X-Kst-Plugin-Author=Your Name X-Kst-Plugin-Version=0.1 Name=Foo Comment=A plugin that provides Foo algorithm. You C++ class should inherit KstDataObject and provide implementations of the pure virtual methods found in KstDataObject: virtual UpdateType update(int updateCounter = -1) = 0; virtual QString propertyString() const = 0; virtual void showNewDialog() = 0; virtual void showEditDialog() = 0; There is also a number of regular virtual methods that can be reimplemented as needed. See the Cross Power Spectrum plugin for an example implementation and the KstDataObject header file for API declarations. Kst-2.0.8/devel-docs/plugins/KstExtensions0000644000175000017500000000044212277111530017627 0ustar synthsynthKst Extensions -------------- These are presently private but will become public once the interface is fully defined. They allow entire subsystems to be added to Kst without touching the Kst core. These are optional subsystems so they do not affect the UI or performance if not enabled. Kst-2.0.8/devel-docs/plugins/KstCPlugins0000644000175000017500000001440412277111530017217 0ustar synthsynth***************************************************************************** WARNING!!! These plugins are now deprecated. Plugin writers should instead consider writing such plugins by inheriting either KstDataObject or KstBasicPlugin. See the KstPlugin file for more info. ***************************************************************************** KstCPlugin Plugins ------------ Kst C plugins consist of two files, an XML file and a shared object. The XML file describes the contents of the shared object file. The shared object file contains the actual plugin code, and must export a C-style function. XML FILE -------- See linefit/linefit.xml for an example of an XML file. Each XML file contains an node with the following information: All but are required. The module also contains an node which describes the interface to the plugin. This node has children of type and for inputs and outputs respectively. It may contain any number of these, but they must be in the order that the plugin expects them. They are considered to be sequential inputs and outputs respectively. Inputs and ouputs can be or . No other data types are supported at this time. All
nodes must be tables of floats. An array input looks like this:
A float (scalar) output looks like this: SHARED OBJECT ------------- The shared object must export a C linkage symbol: int symbol(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) "symbol" would be the same as the attribute "name" of the node "modulename" in the XML file. The plugin must return 0 on success, or non-zero on error. It must be prepared to deal with inputs that are not what it expects (empty arrays, etc). Just return an error if that is the case. See below for a list of error codes. If you return arrays, you must set outArrayLens[] appropriately. You must always return the exact number of arrays and scalars as the XML file indicates. outArrayLens[] will be set when your plugin is called, but you may need to resize the arrays. You must only do this with realloc(). Do not use any other memory allocator as it could cause internal memory problems in Kst. Finally, do not, ever, cast away the constness of input variables. This will result in inconsistencies in Kst internally. The input variables are const for a reason and must remain as such. HOW TO BUILD THE C PLUGIN ----------------------- If you write your plugin in C with GNU-style tools, you can compile your plugin like this: cc -Wall -c -o myplugin.o myplugin.c -fPIC -DPIC ld -o myplugin.so -shared myplugin.o You should put the .so file and the .xml file in a common directory. Then the plugin manager in Kst can be used to browse to that directory and install the plugin in Kst automatically. Matrices -------- C Plugins can manipulate matrices by putting this in the XML file. In this case, two vectors will be exported in the vector lists, the first being the parameters of the matrix, the second being the entire matrix in a linear vector. Curve Hints ----------- C Plugins can provide curve hints like this in the module node: Note: Curve hints are automatically generated for filters, as defined below. Filters ------- Filters are plugins that process a given input vector (along with one or more auxiliary vectors and scalars), and produce an output vector (along with one or more auxiliary vectors and scalars). The production of the output vector from the input vector is considered to be the main action of the plugin, and this simple definition allows filters to be easily added to vectors on the fly. A filter is marked by adding the following node to the intro node of the XML file: PID --- A special input node can be specified of type "pid". This will be equivalent to a scalar but it receives the process ID of the main Kst process, since this is different than the one the plugin runs in. Localdata --------- C Plugins that require the ability to store data across calls -cannot- use static memory. This would lead to race conditions and inconsistency. Instead, plugins must use a "localdata" facility. Simply specify the node in the intro node of the plugin XML file and change your plugin signature to this: int symbol(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[], void **localdata) On first call, this will be null. It is your responsibility to populate it with what you like, and it will be passed back to you on each call, with a separate one for each instance of the plugin in Kst. If you free() it, set it to null! For memory allocation, be sure to use only system malloc() and realloc(). If you allocate something more than a simple free() can cleanup, you must clean up the localdata yourself. To do this, export a symbol: void freeLocalData(void**) that does the cleanup. It will be called when the plugin is being destroyed. Parameter Names --------------- Undocumented Error Codes ----------- > 0 Custom error, you must provide a symbol const char *errorCodes(int) which will be called to obtain a string representing the error. Make these strings static! -1 Generic error -2 Input error (something is wrong with the inputs) -3 Memory error (such as malloc failure) < -3 RESERVED Kst-2.0.8/devel-docs/krazy2.out0000644000175000017500000011467412277111530015372 0ustar synthsynth krazy2 Analysis Checkers Run = 45 Files Processed = 778 Total Issues = 629 ...as of June 07 2011 10:33:54 EDT ==>For File Type c++<== 1. Check for TRUE and FALSE macros [captruefalse]... Ok! 2. Check for methods that return 'const' refs in public classes [constref]... Ok! 3. Check for an acceptable copyright [copyright]... 12 issues found ./libkstmath/kstmath_pch.h: missing tags: copyright (1) ./datasources/dmc/dmcdata.h: missing tags: email address(line 5) (1) ./datasources/dmc/dmcsource.cpp: missing tags: email address(line 5) (1) ./datasources/dmc/dmcobj.cpp: missing tags: email address(line 6) (1) ./datasources/dmc/dmcdata.cpp: missing tags: email address(line 5) (1) ./datasources/dmc/dmcsource.h: missing tags: email address(line 5) (1) ./datasources/dmc/dmcobj.h: missing tags: email address(line 5) (1) ./plugins/dataobject/genericfilter/polynom.h: missing tags: email address(line 7) (1) ./plugins/dataobject/genericfilter/filter.h: missing tags: email address(line 7) (1) ./widgets/kstwidgets_pch.h: missing tags: copyright (1) ./libkst/kstcore_pch.h: missing tags: copyright (1) ./libkstapp/kstapp_pch.h: missing tags: copyright (1) All source files must contain a copyright header which identifies the copyright holder(s) together with a e-mail address that can be used to reach the copyright holder. One copyright holder per line, with real email addresses please. For details regarding KDE's licensing policy please visit . A typical copyright looks like: "Copyright 2002,2005-2006 Joe Hacker " 4. Check for cpp macros and usage [cpp]... 36 issues found ./libkstmath/basicplugin.cpp: O/S or Compiler specific macro line#19[Q_WS_WIN32] (1) ./libkstmath/escan.cpp: O/S or Compiler specific macro line#516[Q_WS_WIN32],1541[Q_WS_WIN32],1568[Q_WS_WIN32] (3) ./libkstmath/enodes.cpp: O/S or Compiler specific macro line#25[Q_WS_WIN32],390[Q_WS_WIN32] (2) ./libkstmath/eventmonitorentry.cpp: O/S or Compiler specific macro line#35[Q_WS_WIN32] (1) ./libkstmath/curve.cpp: O/S or Compiler specific macro line#43[__GNUC__],567[Q_WS_WIN32] (2) ./libkstmath/labelparser.h: O/S or Compiler specific macro line#67[Q_WS_WIN32] (1) ./datasources/dmc/dmcsource.cpp: Guard #warning with '#ifdef __GNUC__' line#48,158,327 (3) ./datasources/dmc/dmcdata.cpp: Guard #warning with '#ifdef __GNUC__' line#48 (1) ./widgets/curveappearance.cpp: O/S or Compiler specific macro line#452[Q_WS_WIN32] (1) ./libkst/kst_inf.h: O/S or Compiler specific macro line#21[__sun] (1) ./libkst/datasourcepluginmanager.cpp: O/S or Compiler specific macro line#315[Q_WS_WIN32],354[Q_WS_WIN32] (2) ./libkst/psversion.h: O/S or Compiler specific macro line#2[__linux__] (1) ./libkst/sysinfo.h: O/S or Compiler specific macro line#12[__linux__] (1) ./libkst/math_kst.h: O/S or Compiler specific macro line#23[__sun],63[__APPLE__],82[__SVR4,__sun],86[Q_WS_WIN32] (4) ./libkst/ksttimers.h: Unknown HAVE_FOO macro line#18[HAVE_KST_USE_TIMERS] (1) ./libkst/datacollection.cpp: O/S or Compiler specific macro line#33[__linux__],47[__linux__] (2) ./libkst/procps.h: O/S or Compiler specific macro line#58[__GNUC__,__GNUC_MINOR__],66[__GNUC__,__GNUC_MINOR__],83[__GNUC__,__GNUC_MINOR__] (3) ./libkst/procps.h: Guard #warning with '#ifdef __GNUC__' line#61 (1) ./libkstapp/datawizard.cpp: O/S or Compiler specific macro line#779[__linux__] (1) ./libkstapp/viewitemdialog.cpp: O/S or Compiler specific macro line#306[Q_WS_WIN32] (1) ./libkstapp/memorywidget.cpp: O/S or Compiler specific macro line#35[__linux__] (1) ./libkstapp/bugreportwizard.cpp: O/S or Compiler specific macro line#35[Q_WS_WIN32],37[Q_WS_WIN64] (2) C++ source files and non-installed headers should NOT use cpp conditionals that check for a certain O/S or compiler; instead use CMake HAVE_foo macros. We want to check for features discovered during CMake time rather than for a specific O/S. 5. Check for code that should be considered crashy. [crashy]... 1 issue found ./libkstapp/commandlineparser.cpp: line#128 (1) Looks for not using QPointers when showing modal dialogs via exec(), as discussed in 6. Check single-char QString operations for efficiency [doublequote_chars]... 6 issues found ./plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp: line#26 (1) ./plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp: line#26 (1) ./plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp: line#26 (1) ./plugins/filters/butterworth_highpass/butterworth_highpass.cpp: line#25 (1) ./plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp: line#27 (1) ./plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp: line#24 (1) Adding single characters to a QString is faster if the characters are QChars and not QStrings. For example: QString path = oldpath + "/" + base is better written as QString path = oldpath + '/' + base. Same holds for arguments to QString::startsWith(), QString::endsWith(), QString::remove(), QString::section(), and QString::split(). Use QString::remove() instead of QString::replace(foo,"") 7. Check for unwanted doxygen tags in major versions [doxytags]... Ok! 8. Check public classes with private members or d-pointer issues [dpointer]... Ok! 9. Check for QString compares to "" [emptystrcompare]... Ok! 10. Check that file ends with a newline [endswithnewline]... Ok! 11. Check for C++ ctors that should be declared 'explicit' [explicit]... 1 issue found ./libkstapp/datawizard.h: line#180 (1) Make all C++ class constructors that can be used with only one required argument 'explicit' to minimize wrong use of the class. Do this to avoid mistaken implicit constructor ambiguities. Copy constructors should not be explicit. 12. Check for foreach loop issues [foreach]... 1 issue found ./libkstapp/formatgridhelper.cpp: non-const ref iterator line#204 (1) When not using POD types (int, double, pointer, ...) you should use const & for your foreach variables. There are two reasons for this: 1) Prevents you from the mistake of writing foreach loops that modify the list, that is 'foreach(Foo f, list) f.a = f.b = f.c = 0;' compiles but does not modify the contents of list 2) Saves a copy constructor call for each of the list elements 13. Check validity of i18n calls [i18ncheckarg]... 124 issues found ./libkstmath/histogram.cpp: wrong argument count, have 0 need 3 line#412 ./libkstmath/histogram.cpp: wrong argument count, have 0 need 1 line#210,302,408,414 ./libkstmath/equation.cpp: wrong argument count, have 0 need 3 line#557 ./libkstmath/equation.cpp: wrong argument count, have 0 need 1 line#157,182,232,239,241 ./libkstmath/psd.cpp: wrong argument count, have 0 need 2 line#467 ./libkstmath/psd.cpp: wrong argument count, have 0 need 1 line#475 ./libkstmath/psd.cpp: single adjective as message, probably ambiguous; use context call to explain what it refers to line#471 ./libkstmath/basicplugin.cpp: wrong argument count, have 0 need 1 line#233,388 ./libkstmath/csd.cpp: wrong argument count, have 0 need 2 line#393 ./libkstmath/csd.cpp: wrong argument count, have 0 need 1 line#195,401 ./libkstmath/csd.cpp: single adjective as message, probably ambiguous; use context call to explain what it refers to line#397 ./libkstmath/image.cpp: wrong argument count, have 0 need 1 line#142,799 ./libkstmath/enodes.cpp: wrong argument count, have 0 need 1 line#753 ./libkstmath/dataobject.cpp: wrong argument count, have 0 need 3 line#518 ./libkstmath/eventmonitorentry.cpp: wrong argument count, have 0 need 1 line#442 ./libkstmath/eventmonitorentry.cpp: reported ambiguous message by translators; use context call to explain what it refers to line#438,442 ./libkstmath/curve.cpp: wrong argument count, have 0 need 2 line#388,1594,1619 ./libkstmath/curve.cpp: wrong argument count, have 0 need 1 line#1603,1607,1611,1615,1623 ./libkstmath/curve.cpp: wrong argument count, have 0 need 3 line#1600 ./libkstmath/plotdefines.h: malformed markup (unmatched tags, etc.) line#63,64 ./datasources/ascii/asciisource.cpp: wrong argument count, have 0 need 1 line#813 ./plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp: wrong argument count, have 0 need 1 line#236 ./plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp: wrong argument count, have 0 need 1 line#235 ./plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp: wrong argument count, have 0 need 1 line#216 ./plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp: wrong argument count, have 0 need 1 line#213 ./plugins/fits/gradient_weighted/fitgradient_weighted.cpp: wrong argument count, have 0 need 1 line#193 ./plugins/fits/linear_unweighted/fitlinear_unweighted.cpp: wrong argument count, have 0 need 1 line#189 ./plugins/fits/linear_weighted/fitlinear_weighted.cpp: wrong argument count, have 0 need 1 line#193 ./plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp: wrong argument count, have 0 need 1 line#197 ./plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp: wrong argument count, have 0 need 1 line#177 ./plugins/fits/exponential_weighted/fitexponential_weighted.cpp: wrong argument count, have 0 need 1 line#231 ./plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp: wrong argument count, have 0 need 1 line#221 ./plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp: wrong argument count, have 0 need 1 line#221 ./plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp: wrong argument count, have 0 need 1 line#238 ./plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp: wrong argument count, have 0 need 1 line#221 ./plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp: wrong argument count, have 0 need 1 line#222 ./plugins/filters/despike/filterdespike.cpp: wrong argument count, have 0 need 1 line#155,283 ./plugins/filters/despike/filterdespike.cpp: wrong argument count, have 0 need 3 line#153 ./plugins/filters/differentiation/differentiation.cpp: wrong argument count, have 0 need 2 line#137 ./plugins/filters/differentiation/differentiation.cpp: wrong argument count, have 0 need 1 line#139 ./plugins/filters/cumulativesum/cumulativesum.cpp: wrong argument count, have 0 need 2 line#137 ./plugins/filters/cumulativesum/cumulativesum.cpp: wrong argument count, have 0 need 1 line#139 ./plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp: wrong argument count, have 0 need 1 line#221 ./plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp: wrong argument count, have 0 need 1 line#194 ./plugins/filters/butterworth_highpass/butterworth_highpass.cpp: wrong argument count, have 0 need 1 line#198 ./widgets/labelbuilder.cpp: malformed markup (unmatched tags, etc.) line#24 ./libkst/string_kst.cpp: wrong argument count, have 0 need 1 line#102 ./libkst/datasource.cpp: single adjective as message, probably ambiguous; use context call to explain what it refers to line#76 ./libkst/vscalar.cpp: wrong argument count, have 0 need 5 line#174 ./libkst/vscalar.cpp: wrong argument count, have 0 need 4 line#207 ./libkst/vector.cpp: wrong argument count, have 0 need 3 line#594 ./libkst/vector.cpp: wrong argument count, have 0 need 1 line#590 ./libkst/scalar.cpp: wrong argument count, have 0 need 2 line#139 ./libkst/scalar.cpp: wrong argument count, have 0 need 1 line#156 ./libkst/scalar.cpp: wrong argument count, have 0 need 3 line#137 ./libkst/generatedvector.cpp: wrong argument count, have 0 need 3 line#93 ./libkst/generatedvector.cpp: wrong argument count, have 0 need 4 line#88 ./libkst/matrix.cpp: wrong argument count, have 0 need 3 line#625 ./libkst/datastring.cpp: wrong argument count, have 0 need 2 line#170 ./libkst/datastring.cpp: wrong argument count, have 0 need 4 line#161 ./libkst/debug.cpp: wrong argument count, have 0 need 1 line#143 ./libkst/datascalar.cpp: wrong argument count, have 0 need 3 line#166 ./libkst/datascalar.cpp: wrong argument count, have 0 need 4 line#157 ./libkst/datamatrix.cpp: wrong argument count, have 0 need 5 line#669 ./libkst/datamatrix.cpp: wrong argument count, have 0 need 2 line#677 ./libkst/datamatrix.cpp: wrong argument count, have 0 need 1 line#175 ./libkst/datavector.cpp: wrong argument count, have 0 need 2 line#759 ./libkst/datavector.cpp: wrong argument count, have 0 need 1 line#755,757,763,765 ./libkst/datavector.cpp: wrong argument count, have 0 need 3 line#749 ./libkst/datavector.cpp: wrong argument count, have 0 need 4 line#772 ./libkst/editablevector.cpp: wrong argument count, have 0 need 2 line#84 ./libkstapp/plotitem.cpp: wrong argument count, have 0 need 2 line#3435 ./libkstapp/legenditem.cpp: wrong argument count, have 0 need 2 line#127,133,137,486 ./libkstapp/datawizard.cpp: wrong argument count, have 0 need 2 line#833 ./libkstapp/logdialog.cpp: wrong argument count, have 0 need 1 line#162 ./libkstapp/debugdialog.cpp: wrong argument count, have 0 need 2 line#41 ./libkstapp/debugdialog.cpp: wrong argument count, have 0 need 1 line#43 ./libkstapp/plotrenderitem.cpp: wrong argument count, have 0 need 2 line#439 ./libkstapp/commandlineparser.cpp: wrong argument count, have 0 need 1 line#439,482,523,563 ./libkstapp/commandlineparser.cpp: malformed markup (unmatched tags, etc.) line#386,389,392,399,421,423,425,428,475,516,557,584,586,588 ./libkstapp/logwidget.cpp: wrong argument count, have 0 need 3 line#57 ./libkstapp/labelpropertiestab.cpp: malformed markup (unmatched tags, etc.) line#30 ./libkstapp/plotaxis.cpp: reported ambiguous message by translators; use context call to explain what it refers to line#785 Make the translators' job easier and detect problems in the usage of the i18n() calls. When the fix is not clear, check the Techbase article at for more information. 14. Check for invalid icon names [iconnames]... Ok! 15. Check for proper include directives [includes]... 31 issues found ./libkstmath/escan.cpp: duplicate includes line#21,495(stdio.h);22,496(string.h);24,494(stdlib.h) ./libkstmath/kstmath_pch.h: missing or improper include guard in header ./libkstmath/emailthread.h: missing or improper include guard in header ./datasources/netcdf/netcdfplugin.h: missing or improper include guard in header ./datasources/netcdf/netcdfsource.h: missing or improper include guard in header ./datasources/netcdf/netcdfsource.cpp: include own header first line#23 ./datasources/dmc/dmcobj.cpp: include own header first line#26 ./datasources/dmc/dmcsource.h: duplicate includes line#21,25(datasource.h) ./datasources/dmc/dmcobj.h: missing or improper include guard in header ./plugins/fits/linear_weighted.h: missing or improper include guard in header ./plugins/fits/common.h: missing or improper include guard in header ./plugins/fits/non_linear_weighted.h: missing or improper include guard in header ./plugins/fits/linear.h: missing or improper include guard in header ./plugins/fits/non_linear.h: missing or improper include guard in header ./plugins/fits/kneefrequency/fitkneefrequency.h: missing or improper include guard in header ./plugins/filters/filters.h: missing or improper include guard in header ./plugins/dataobject/interpolations/interpolations.h: missing or improper include guard in header ./plugins/dataobject/lockin/iirfilter.h: using leading or trailing underscores on include guard in header ./widgets/kstwidgets_pch.h: missing or improper include guard in header ./libkst/kstcore_pch.h: missing or improper include guard in header ./libkst/kstcore_pch.h: do not include QtModules line#8(QtCore);9(QtGui);10(QtXml) ./libkst/stdinsource.cpp: include own header first line#20 ./libkst/stdinsource.cpp: put config.h in angle brackets line#19 ./libkst/timezones.h: using leading or trailing underscores on include guard in header ./libkst/stdinsource.h: missing or improper include guard in header ./libkstapp/overridelabeltab.h: missing or improper include guard in header ./libkstapp/kstapp_pch.h: missing or improper include guard in header Use <..> to include installed headers; to include Qt headers from installed headers; cpp file should include their own headers first (but below config.h); other rules apply, see . Use include guards in headers with appropriatedly encoded macro names. 16. Check for inline methods in public classes [inline]... Ok! 17. Check for an acceptable license [license]... 10 issues found ./libkstmath/fftsg_h.c: missing license ./libkstmath/kstmath_pch.h: missing license ./datasources/ascii/kst_atof.h: missing license ./datasources/ascii/kst_atof.cpp: missing license ./kst/main-vld.cpp: missing license ./plugins/dataobject/genericfilter/polynom.h: missing license ./plugins/dataobject/genericfilter/filter.h: missing license ./plugins/dataobject/crossspectrum/fftsg_h.c: missing license ./widgets/kstwidgets_pch.h: missing license ./libkstapp/kstapp_pch.h: missing license Each source file must contain a license or a reference to a license which states under which terms the software may be used, modified and redistributed. For details regarding KDE's licensing policy please visit . 18. Check for assignments to QString::null [nullstrassign]... 8 issues found ./datasources/lfiio/lfiio.cpp: line#32 (1) ./datasources/lfiio/lfiio.h: line#40 (1) ./datasources/healpix/healpix.h: line#44 (1) ./datasources/healpix/healpix.cpp: line#50 (1) ./datasources/planckIDEF/planckIDEF.cpp: line#35 (1) ./datasources/planckIDEF/planckIDEF.h: line#54 (1) ./libkst/stdinsource.cpp: line#159 (1) ./libkst/stdinsource.h: line#48 (1) Do not assign QString::null or QString() to a QString. Instead use the .clear() method. For example, "str = QString::null" becomes "str.clear()". When returning an empty string from a method use "return QString()" When passing an empty string use "QString()". 19. Check for compares to QString::null or QString() [nullstrcompare]... Ok! 20. Check for C++ operators that should be 'const' [operators]... Ok! 21. Check for inappropriate pass-by-value function args [passbyvalue]... Ok! 22. Check for postfix usage of ++ and -- [postfixop]... 121 issues found ./d2asc/d2asc.cpp: line#62,66,104,117,126,127 (6) ./libkstmath/psdcalculator.cpp: line#194,214,223,227,231,235,239,243,247,251,262,287,294,300,306 (15) ./libkstmath/curve.cpp: line#525,1121,1133,1263,1353 (5) ./datasources/lfiio/lfiio.cpp: line#169,253,258,311,550 (5) ./datasources/healpix/healpix_tools_pix.cpp: line#83,87,765,771,776,782 (6) ./datasources/healpix/healpix_tools_fits.cpp: line#55,64,92,101 (4) ./datasources/fitsimage/fitsimage.cpp: line#328,329,335,336,342,343,349,350 (8) ./datasources/qimagesource/qimagesource.cpp: line#121,127,133,139 (4) ./datasources/ascii/asciisource.cpp: line#599 (1) ./datasources/planckIDEF/planckIDEF.cpp: line#315,375,528,623,746,814,1320 (7) ./datasources/dmc/dmcobj.cpp: line#302,349 (2) ./plugins/fits/gradient_weighted/fitgradient_weighted.cpp: line#219 (1) ./plugins/fits/linear_unweighted/fitlinear_unweighted.cpp: line#204 (1) ./plugins/fits/linear_weighted/fitlinear_weighted.cpp: line#221 (1) ./plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp: line#202 (1) ./plugins/fits/kneefrequency/fitkneefrequency.cpp: line#277,292,315,320,325 (5) ./plugins/filters/despike/filterdespike.cpp: line#199,211,234,258 (4) ./plugins/dataobject/periodogram/periodogram.cpp: line#378,382,490,535,541,602,611,619,737,749,756,761,774 (13) ./plugins/dataobject/crossspectrum/crossspectrum.cpp: line#218,232,240,256,273,283 (6) ./plugins/dataobject/linefit/linefit.cpp: line#187,201,217 (3) ./widgets/scalarselector.cpp: line#146 (1) ./widgets/stringselector.cpp: line#74 (1) ./widgets/curveselector.cpp: line#62 (1) ./widgets/vectorselector.cpp: line#89 (1) ./libkst/vector.cpp: line#393,431,470 (3) ./libkst/matrix.cpp: line#218,227,230,238,247,255 (6) ./libkst/datavector.cpp: line#474,528,591 (3) ./libkst/timezones.cpp: line#746,750,755,761,786,791,796 (7) You should use ++ and -- as prefix whenever possible as these are more efficient than postfix operators. Prefix increments first and then uses the variable, postfix uses the actual; the variable is incremented as well. Because of this, the prefix operators are inherently more efficient. *WARNING* Make sure that you don't introduce off-by-one errors when changing i++ to ++i. 23. Check for dangerous or inefficient QByteArray usage [qbytearray]... Ok! 24. Check for Qt classes that should not be used [qclasses]... 57 issues found ./widgets/curveappearance.h: QComboBox[KComboBox] (1) ./widgets/labellineedit.cpp: QLineEdit[KLineEdit] (1) ./widgets/gradienteditor.cpp: QColorDialog[KColorDialog] (1) ./widgets/combobox.cpp: QLineEdit[KLineEdit] (1) ./widgets/filerequester.cpp: QLineEdit[KLineEdit],QFileDialog[KFileDialog],QFileDialog[KFileDialog],QFileDialog[KFileDialog] (4) ./widgets/datasourceselectordialog.cpp: QMessageBox[KMessageBox],QFileDialog[KFileDialog] (2) ./widgets/colorbutton.cpp: QColorDialog[KColorDialog] (1) ./widgets/datasourceselector.cpp: QLineEdit[KLineEdit] (1) ./widgets/datasourceselectordialog.h: QFileDialog[KFileDialog] (1) ./widgets/labellineedit.h: QLineEdit[KLineEdit] (1) ./widgets/curveappearance.cpp: QComboBox[KComboBox] (1) ./widgets/combobox.h: QComboBox[KComboBox] (1) ./libkst/datasourcepluginmanager.cpp: QUrl[KUrl] (1) ./libkstapp/datadialog.cpp: QLineEdit[KLineEdit] (1) ./libkstapp/pictureitem.cpp: QFileDialog[KFileDialog] (1) ./libkstapp/datawizard.cpp: QMessageBox[KMessageBox] (1) ./libkstapp/datamanager.cpp: QDialog[KDialog] (1) ./libkstapp/viewitemdialog.cpp: QLineEdit[KLineEdit] (1) ./libkstapp/debugdialog.cpp: QDialog[KDialog],QDialog[KDialog] (2) ./libkstapp/markerstab.cpp: QMessageBox[KMessageBox],QMessageBox[KMessageBox] (2) ./libkstapp/logwidget.h: QTextBrowser[KTextBrowser] (1) ./libkstapp/changefiledialog.cpp: QDialog[KDialog],QMessageBox[KMessageBox],QMessageBox[KMessageBox],QMessageBox[KMessageBox] (4) ./libkstapp/viewvectordialog.cpp: QDialog[KDialog] (1) ./libkstapp/exportvectorsdialog.cpp: QDialog[KDialog] (1) ./libkstapp/viewmatrixdialog.cpp: QDialog[KDialog] (1) ./libkstapp/commandlineparser.cpp: QMessageBox[KMessageBox] (1) ./libkstapp/filterfitdialog.cpp: QMessageBox[KMessageBox] (1) ./libkstapp/dialog.cpp: QDialog[KDialog] (1) ./libkstapp/view.cpp: QInputDialog[KInputDialog] (1) ./libkstapp/changedatasampledialog.cpp: QDialog[KDialog] (1) ./libkstapp/differentiatecurvesdialog.cpp: QDialog[KDialog] (1) ./libkstapp/mainwindow.cpp: QMessageBox[KMessageBox],QFileDialog[KFileDialog],QMessageBox[KMessageBox],QFileDialog[KFileDialog],QMessageBox[KMessageBox] (5) ./libkstapp/basicplugindialog.cpp: QMessageBox[KMessageBox] (1) ./libkstapp/dialogpage.cpp: QTabWidget[KTabWidget] (1) ./libkstapp/viewitem.cpp: QInputDialog[KInputDialog] (1) ./libkstapp/svgitem.cpp: QFileDialog[KFileDialog] (1) ./libkstapp/tabwidget.h: QTabWidget[KTabWidget] (1) ./libkstapp/tabwidget.cpp: QTabBar[KTabBar],QTabBar[KTabBar],QInputDialog[KInputDialog],QTabBar[KTabBar] (4) ./libkstapp/choosecolordialog.cpp: QDialog[KDialog],QLineEdit[KLineEdit],QLineEdit[KLineEdit] (3) Don't use Qt 4 classes that are deprecated. Additionally make sure to use the KDE version of some Qt GUI elements to provide a consistent look and feel for the KDE desktop. The KDE classes are not just adding functionalities to the Qt base class and are mostly not even based on the Qt class. *Please* *refer* *to* *the* *API* *documentation* *for* *details* *before* *porting* *to* *the* *K* *classes*. 25. Check for Qt methods that should be avoided [qmethods]... Ok! 26. Check for QMIN and QMAX macros [qminmax]... Ok! 27. Check for classes that should use the 'Q_OBJECT' macro [qobject]... Ok! 28. Check for signals: and slots: [sigsandslots]... Ok! 29. Check for spelling errors [spelling]... 7 issues found ./datasources/dmc/dmcdata.cpp: line#51[dont] (1) ./plugins/sampleplugin/sampleplugin.cpp: line#93[everytime],104[everytime],145[occured] (3) ./plugins/dataobject/genericfilter/polynom.h: line#60[acces] (1) ./libkst/timezones.h: line#206[customised] (1) ./libkst/timezones.cpp: line#777[abbrevations] (1) Spelling errors in comments and strings should be fixed as they may show up later in API documentation, handbooks, etc. Misspelled strings make the translator's job harder. Please use US English. 30. Check for strings used improperly or should be i18n. [strings]... 36 issues found ./libkstmath/labelparser.cpp: QLatin1String issues line#210,214,225,229,239,243,247,257,261,275,279,283,293,297,337,349,353,357,371,375,379,383,397,414,426,438,442,460,464,468,478,490 (32) ./libkst/datasourcepluginmanager.cpp: QLatin1String issues line#169 (1) ./libkst/timezones.cpp: QLatin1String issues line#594 (1) ./libkstapp/document.cpp: QLatin1String issues line#63 (1) ./libkstapp/commandlineparser.cpp: QLatin1String issues line#604 (1) Some QString methods (like startsWith() and endsWith()) are more efficient if they are passed a QLatin1String, avoiding an implicit conversion from const char *. 31. Check for system calls to replace by KDE or Qt equivalents [syscalls]... 6 issues found ./datasources/dmc/dmcdata.cpp: line#33 getenv[qgetenv] (1) ./libkst/timezones.cpp: line#276 getenv[qgetenv],325 getenv[qgetenv],422 getenv[qgetenv],518 getenv[qgetenv] (4) ./libkstapp/document.cpp: line#148 open[KDE_open] (1) Some system calls are not portable, please use the suggested portable wrapper instead. See kde_file.h 32. Check for typedefs that should be replaced by Qt typedefs [typedefs]... 3 issues found ./libkstmath/escan.cpp: line#45 int8_t[qint8],#47 int16_t[qint16],#49 int32_t[qint32] (3) Please use Qt typedefs (like qint32 and qreal) as defined in QGlobals. These typedefs are guaranteed to have the size in bits that the name states on all platforms. ==>For File Type desktop<== 1. Check that file ends with a newline [endswithnewline]... Ok! 2. Check for invalid icon names [iconnames]... Ok! 3. Check for spelling errors [spelling]... Ok! 4. Validates desktop files using 'desktop-file-validate' [validate]... 9 issues found ./kst/kst2.desktop: key "DocPath" in group "Desktop Entry" is a reserved key for KDE ./kst/kst2.desktop: (will be fatal in the future): value "Science" in key "Categories" in group "Desktop Entry" requires another category to be present among the following categories: Education ./kst/kst2.desktop: (will be fatal in the future): value "Qt;KDE;Science;" for key "Categories" in group "Desktop Entry" does not contain a registered main category ./kst/kst2.desktop: key "Encoding" in group "Desktop Entry" is deprecated ./kst/x-kst2.desktop: value "MimeType" for key "Type" in group "Desktop Entry" is deprecated ./kst/x-kst2.desktop: value "application/x-kst" for string list key "MimeType" in group "Desktop Entry" does not have a semicolon (';') as trailing character ./kst/x-kst2.desktop: key "DefaultApp" in group "Desktop Entry" is deprecated ./kst/x-kst2.desktop: key "Patterns" in group "Desktop Entry" is deprecated ./kst/x-kst2.desktop: required key "Name" in group "Desktop Entry" is not present Please make sure your .desktop files conform to the freedesktop.org standard. See the spec at ==>For File Type designer<== 1. Check that file ends with a newline [endswithnewline]... Ok! 2. Check for files that need to be fixed by 'fixuifiles' [fixuifiles]... 14 issues found ./libkstapp/labeltab.ui: fixuifiles needs to be run on this file ./libkstapp/labelpropertiestab.ui: fixuifiles needs to be run on this file ./libkstapp/overridelabeltab.ui: fixuifiles needs to be run on this file ./libkstapp/labelcreator.ui: fixuifiles needs to be run on this file ./libkstapp/legendtab.ui: fixuifiles needs to be run on this file ./libkstapp/datawizardpagevectors.ui: fixuifiles needs to be run on this file ./libkstapp/contenttab.ui: fixuifiles needs to be run on this file Please run the trunk/kdesdk/fixuifiles on all your .ui files as there are some artifacts created by Qt designer that are undesireable for KDE. 3. Check validity of i18n calls [i18ncheckarg]... 57 issues found ./datasources/healpix/healpixconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#34 ./plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#29 ./plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#29 ./plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#23 ./plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#31 ./plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui: reported ambiguous message by translators; use context call to explain what it refers to line#29 ./widgets/fftoptions.ui: reported ambiguous message by translators; use context call to explain what it refers to line#44 ./widgets/matrixselector.ui: reported ambiguous message by translators; use context call to explain what it refers to line#27 ./widgets/scalarlistselector.ui: reported ambiguous message by translators; use context call to explain what it refers to line#41 ./widgets/vectorselector.ui: reported ambiguous message by translators; use context call to explain what it refers to line#33 ./widgets/curveappearance.ui: reported ambiguous message by translators; use context call to explain what it refers to line#296 ./widgets/curveappearance.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#198,301,306,311 ./libkstapp/generaltab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/dialogpage.ui: reported ambiguous message by translators; use context call to explain what it refers to line#13 ./libkstapp/matrixtab.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#670 ./libkstapp/stroketab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/markerstab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/editmultiplewidget.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#66 ./libkstapp/filltab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#20 ./libkstapp/defaultlabelpropertiestab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14,164 ./libkstapp/labeltab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/layouttab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/dimensionstab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/labelpropertiestab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#17 ./libkstapp/labelpropertiestab.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#70,89 ./libkstapp/logdialog.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#92 ./libkstapp/arrowpropertiestab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#17 ./libkstapp/histogramtab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#111 ./libkstapp/rangetab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/childviewoptionstab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/gridtab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/overridelabeltab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#20 ./libkstapp/labelcreator.ui: reported ambiguous message by translators; use context call to explain what it refers to line#80 ./libkstapp/labelcreator.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#87,103 ./libkstapp/axistab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/imagetab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#14 ./libkstapp/viewprimitivedialog.ui: reported ambiguous message by translators; use context call to explain what it refers to line#25 ./libkstapp/legendtab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#19 ./libkstapp/differentiatecurvesdialog.ui: reported ambiguous message by translators; use context call to explain what it refers to line#245 ./libkstapp/differentiatecurvesdialog.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#110,130,250,255,260 ./libkstapp/eventmonitortab.ui: reported ambiguous message by translators; use context call to explain what it refers to line#169 ./libkstapp/eventmonitortab.ui: single adjective as message, probably ambiguous; use context call to explain what it refers to line#199 Make the translators' job easier and detect problems in the usage of the i18n() calls. When the fix is not clear, check the Techbase article at for more information. 4. Check for Qt classes that should not be used [qclasses]... 88 issues found ./datasources/healpix/healpixconfig.ui: QComboBox[KComboBox],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox],QComboBox[KComboBox],QLineEdit[KLineEdit] (9) ./datasources/ascii/asciiconfig.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox],QComboBox[KComboBox] (5) ./widgets/fftoptions.ui: QComboBox[KComboBox],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox] (5) ./widgets/scalarlistselector.ui: QLineEdit[KLineEdit] (1) ./widgets/curveplacement.ui: QComboBox[KComboBox] (1) ./widgets/datarange.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox],QComboBox[KComboBox] (4) ./widgets/colorpalette.ui: QComboBox[KComboBox] (1) ./widgets/curveappearance.ui: QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox] (5) ./libkstapp/vectortab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit],QComboBox[KComboBox] (3) ./libkstapp/dialogpage.ui: QTabWidget[KTabWidget] (1) ./libkstapp/matrixtab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit] (6) ./libkstapp/stroketab.ui: QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox] (4) ./libkstapp/markerstab.ui: QLineEdit[KLineEdit],QComboBox[KComboBox] (2) ./libkstapp/editmultiplewidget.ui: QLineEdit[KLineEdit] (1) ./libkstapp/filltab.ui: QComboBox[KComboBox] (1) ./libkstapp/defaultlabelpropertiestab.ui: QComboBox[KComboBox] (1) ./libkstapp/filterfittab.ui: QComboBox[KComboBox] (1) ./libkstapp/exportgraphicsdialog.ui: QComboBox[KComboBox] (1) ./libkstapp/logdialog.ui: QTabWidget[KTabWidget],QComboBox[KComboBox],QComboBox[KComboBox],QLineEdit[KLineEdit],QLineEdit[KLineEdit] (5) ./libkstapp/histogramtab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit] (2) ./libkstapp/aboutdialog.ui: QTextBrowser[KTextBrowser] (1) ./libkstapp/rangetab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QLineEdit[KLineEdit] (6) ./libkstapp/axistab.ui: QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox],QComboBox[KComboBox] (5) ./libkstapp/imagetab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit] (2) ./libkstapp/stringtab.ui: QLineEdit[KLineEdit] (1) ./libkstapp/scalartab.ui: QLineEdit[KLineEdit],QLineEdit[KLineEdit] (2) ./libkstapp/legendtab.ui: QLineEdit[KLineEdit] (1) ./libkstapp/debugdialog.ui: QTabWidget[KTabWidget] (1) ./libkstapp/datawizardpagedatasource.ui: QComboBox[KComboBox] (1) ./libkstapp/equationtab.ui: QComboBox[KComboBox],QLineEdit[KLineEdit] (2) ./libkstapp/datawizardpagevectors.ui: QLineEdit[KLineEdit] (1) ./libkstapp/differentiatecurvesdialog.ui: QComboBox[KComboBox] (1) ./libkstapp/eventmonitortab.ui: QLineEdit[KLineEdit],QComboBox[KComboBox],QLineEdit[KLineEdit],QLineEdit[KLineEdit],QTextEdit[KTextEdit] (5) Don't use Qt 4 classes that are deprecated. Additionally make sure to use the KDE version of some Qt GUI elements to provide a consistent look and feel for the KDE desktop. The KDE classes are not just adding functionalities to the Qt base class and are mostly not even based on the Qt class. *Please* *refer* *to* *the* *API* *documentation* *for* *details* *before* *porting* *to* *the* *K* *classes*. 5. Check for spelling errors [spelling]... Ok! ==>For File Type kpartgui<== 1. Check that file ends with a newline [endswithnewline]... Ok! 2. Check validity of i18n calls [i18ncheckarg]... Ok! 3. Check for spelling errors [spelling]... Ok! 4. Validates kpartgui files using 'xmllint' [validate]... 1 issue found ./kst/kst_icon.rc: 1: parser error : Start tag expected, '<' not found Please make sure your .rc files conform to the XSD schema found in kdelibs/kdeui/xmlgui/kxmlgui.xsd Kst-2.0.8/devel-docs/Kst2Specs/0000755000175000017500000000000012277111530015223 5ustar synthsynthKst-2.0.8/devel-docs/Kst2Specs/Plot Geometry.pdf0000644000175000017500000322330612277111530020421 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xXˮ6+.`E|K!ז0E] ;R$EZ}Pyș9sA:}<n_~Oo9aAkio?_|f}qڿa{vOr7;5Y\Onſ<~<-V;A$b>+>ƫPn7+F@묅bꢄ\ ?u>~;(7$.Q82lr;G[Ԇ-m" p5BJ,;6X.3:P#R^2^2s_N#"ી\hw3m 7DmJH~u3$i@r^ 1Hr,xd&De>=M}d+}ߣWH4JOPdbJ9AD~*Sahbp15x] (GFɩ7L5:+8€/zN6(8QB92YLł7D"{#)>6eט@{ nNԜPcZ0Gj+ 7Jyz3q'rvGyX(S 2"C+:BdB{MX{wT2BX*;.Џ@Kエnҝa?OVrzRn3:G)iF+\NݠBa/  6L`Tn36TrGY*V2H8;z[[a^R./i}IL2\&7&[Y4`TdN]3Кr8ƜzSlxVq <oV2{2EA19haf_="ԢpT.%&؟{O 59;m!!dO9QƼwt> stream x33T(*T0P52 %,JURJXZ(X(F&z ɹ\ . \ w endstream endobj 6 0 obj 78 endobj 7 0 obj <> stream xvK[+ J) R4$RѤ11MclUbAjLBpߴZO;_X^_k19ǚ~ξ9cfsfuqhf'&=ϙ<&bW0~D}ȓ>oz5xSR)Kp#NgAWO8CH3Ֆ{䏷ڵhWlãQLxhI$X?*Y`Q㓉˳ F<}6~ i_lՆ(I:=&dON禓r-(:CY$ض=ywSA87evbE=pHCaU{u'W?tLj dol==yzNɆ/ץ,d,zfy^ꦓZکj!c3} Y=ʎv_-mXԋo|,%5pNأXq̭n7u.h1*F21G|+@4wnv2]_Wcncчؑ Ǭ8z_UX\ ~lL=[6WYXw`{s1@Q(4Ү ;=-[UX\Lޝj=)z+j(s} F/vaZ ϡ/NoruP>׋W⦓2iG1Lu.qĦ"qZNoϼ߉zz>#OǑdWx 4ԝoﴳqZm<]ϼ]APMxzh1\vuc>~F%lcnWޙ k32 Gh(q&N{E]pަ\i:]`[}zKʹ֓C%lKne8`o4Gѻ qՉqweu\%綜;Nu=UaK=5qSkqɰ4״qn׮OK.<\jY.u{]{8wϿEF T8=v8=Lrbu8.dR\|e_{ =pEvisf]&9BcOW^c]jV5lwʿwBt]+Ng顲hx!1 CIuƟ8ouzoLwRk\F5S|urvL.Z "|:ZcO>i t /c>Ԋ]g#;"B8=(2k#Ss6w43I48j4ɺ٨;~sT]Kpٰ^}ȎWWlص@)9E;ivbCw]dlԝo9vuw5}ϲC5f>[U7E&vm$PqJuuNFc2FҾ*Bw]dlԝo9vu]z H˞ei̡}On6LH┖+Ν4;~e1I!gOl:.RtPzϲ#4&>ջU7E&vm$PqJuuNZ6NɔjTGka:^PnϲOo=ջ?Lh\Wu:ZcOr v4qbqiߪJ#֘+N>uֹ#`i_#siu>J)9, ;鱜l{MVUeWD2}뢭sSȧa:ZcOz'0lDю^;i~Ѹ״oUVKt^W7Ү vK;XN50)+R::%X!z-E^ӾUUDn[-]WsMɯ ԥO =^dյP ?}ŲX*`i_͚ROehkڷ{埊Vߑ;.Ps'M=^ܳCy1{MZ*`,뭻1 CXT[ƽ}`Y]Whuq{**Ү3w|ܳ1+=W-qrˤBS%OྰGWo=l^ӾUEhaۻ6BUqwdO,ͼ:HYc65+;o{z2l(ǜՍEa uR߾SEhߤR Tռ@׽waԈ: RiN#޻1j;<ھ\=:BVe>ls{oמZs~M ʥߺ.Tos'8Tߜ)18..["T8q#tݮ}z$r?-Rs}{z}\iI eu\#Mb<3o7=)2j1”5kzKV21Mqoz9S={ګnYսb?ziWuE^U+]8l.Zdb~ZFTG_q1[NoeZM m8EIV·xe;h;3[آZ:ꑿEuq\uCQiqˮm9¥SKcqn>cqUwiZsɰ_S5-3c Si{{5o=ze[j|^.Ɵ~xٳ|gO̿}nW^yD}stݯa{5o-ݵp6 +N&m͹O4xu32)9L R@K 7ݦa'<}v"PVf݊ v"-PN ЛŰ2Dh|ewv"ԕQ썆p/F1%M#+{a3KƖ/،[=v:jؒ:Szw RA玢/y-@,:G`z2gd fB ঊʜlUb;{IЃK v s;#_Ze Y#Uz(cQj)nV-dH8uzܲ5il QjҖ-S,9kKlScFEUTk-ł##cFEUTkDD +=>%&`J vjĬnlTJ3z܎ѾY*BƨF#(lwLf PDVJR-OwL Cc%0 K`0 Ac-',4x =Mye_q|vw`v&xzko񼲯9OffoPi~ʗ߂ggfoPixLx =My/4x =._D`c9=>681lFMI(7B &EmY ي1;_lRPlARe;0a`ι7J0lA_ZY]ᬵv+P/¥K}IlfWFP6م4ۑiߎo)v D 6,S4nѵx86S鳑%XDM\e*'^f8)n`,͔#3&ڤ&x4[4Tʠ9(ݣ` xnTc=_oM>u0-5!N(Q8z"zbR5D3NX?؈NѐOC 6,s9`U@MxJTİ#)a!d\RRVD lSr+0){46"ο&,;}P`+`0]h`oEvd{ MEN)jmqm-K G 6;k_}K'o}Im^omxv UTq6>hԈAeʎ>(b{3m' AŰ(~n+]mb-žX !kO*_*-_Y$N>L^w?T e?lu"iZ'۸3*?lu:N۸;o[0{?][m`;w.F[cGؾ{b+,l<~˾dq)ߦ-x"2_ە]fv=w8nx|R ௳Ex&cuYg;)V;7tu990^v6glTjHZT~0 E5ޜʇhңKΎwݲ"%#aM;`XCW eW=+*_bG'jl{k9SMW|spgc`gq;0:Ͼk Ml=أWpw~TK5*.\7h/bc;t`ߜ>ۦ"~J]QXƗwa!vRD 6FElvh;UY`tjק(`'^ءOh·Ai?%Xo=n<;N5G'lVbJX%C1I=m#Tu&գ(J%x;(}fDǛ:bGT1VGnPzL*vu-ų·Fbі %Xo=n0#:>-d_%H5KEg&vj|R}ٓ HL%\W7,S]dUD Mvp8j N)Ut|LyW?xlS%Êqo)K5c/J:HƧ"g0b(%42S2;f8(ve88>pHߍ6|8%IR:jKT-Ci H&^I"h q@ O{&6z<<(6S6Ƙ|ZNThw̤DYTGQ-m ;+;DN6hd;6R1]\: iGSv] OPۇ ULiz97J~Aѵx1ӧ(mL' %&_mIv6f` >{S*qQUw {fs+H7>X<79&fH4=]m=fb7SoҷJ?DiT37ٽYv6RCHu lAvs7Uml7 P7j=0F  :jN#`t~:(63mlGJJ*͔N9nV=!(q)(TD?uG.у53F}Zt*:%XQkV”`=u3l#擽/[R2ǫ')2ҶUIͲRP-߿ mE_gJ# 1N+MgXףҒޛW*6;f(Әʎ\:-a6}>^ܔ)R@ Qq]}J: 4ݒ]˾%ۦsɪ"8Eg#F?7H%\lA^Aaǩ/y)ڣY(O>D U"QElFK5deޘ>bu윫L͎KG y}YP#{[쏷Hnte)v2T*sesE /⍮,%؂Vl)* 1\Go;~WF ZPw>#I $Zf. L^}뾯? ."%6/J0 bmǗR?^49`M $u^ ./[ɳo=z['7J=T;Zv% {n],l.k, <{lf`vcd9s~ ] -l._, <{z;PVJY0SJlcJ_*r6zGpG V ~`cѦjȶwIXD=IV::`,J l^Ӳ*3Wq\1S&vp$dF VtK &-ΆLɡ1aҮSmJ#;J Yӻ:_I)J&]{Et.ۻA +ņ`KK0 =Twvv6ٮ+iة;U*<:_=_\ν͹W?#1@)p2 $۵r>ئ~ŋ/ ˤsq򪴍=Fe\w`x5{Q,ԯ㰏Uq(aǮq:%/^xx^9`Fu %Krx%l/@o`Ǫ?K¹+S;_QΜȹfJh#e&,Mk]=k ¹O8仏sE=fv}w,CE Nݵ!̵q 6;#኿.Fh%h` cg-{2Pd=? E d, "<^x« m͞n* 6X`'hG@<mfde7PyqQ#sŁ @ t.3BG?sHjˆdf{yވ|x`F/hdn$YUx%>Pc J0*s2~RGG#+(R'*gG 3/SM 8(.ktKN%H90Rྌ ,u,ѳf zJYEb>-_+m%0R}` WᄊQf;4VygX:$5(R(#a#m,LƄdMBx\uWە`~q< |{r vll0fxVT>1Oc(Lhc16?SaVLqe+&!Ջ>++_YlUhv:p@ =41^~Yٲ Z?:ڙxL;N/cFSROyf Al'eD&STە`?{?p?^Y Dq[~L,L9Qؑ7w%I{Ĕƒ- jL`U&vjhF;IP] o[%u ). tĥSV~R%ro񥁝rEZsQ('?яL^9=<(&cKBcص>RӘ:[ߍ_.p[)߈jf:7N?b-sx[uRS{gOj)v#kTe*1R| w(R޺=b(eD]jh~ui6v:fVS=])H;w@ Ypz,8R 81P\S:p_}'Hpb t g2J0 , \r]d]Nbuv ^?+|Wȡ]R7BS-;cz>z7`6Gj0N)jHγb³a6v খȯI#emߧpLqy_d_^}`߽۠K888d&u+|cJ15ZxE`T8qq|q|qmJG ! Z @M1jy/~쓿ѸM\c)#sGrH쥋OASz8!` B˰L|hk/wGyQ:F*Eͽ^,ЭI_HZWj`%.#ESѫS{8vl|#PP7>E Vz5z cJ+iznTG+)?FS@.wjק(LY{@kCJI F V}ɚ^1SC`cx3[zD{~óRGR1Gf@t*sl8Z9:`#6ڗub%HRU[];)v^A4vdTRWE`}-> یle VtjWk :yl.lw[ʔFNH@Gh|rS}!STvE 6Lr]PQpP]VQ{ & 1ٹ2y Rgލ`|foe}H)ͥ\0%xl؃QpXe °,uJxPi4} RSc6;c+C*QY@vΆT6M v@->-leDCG5@u 6ϭKӳIFU>"lct,MU>oA>ymK#'A.JWdME5K f4ޥ;r.-Q(5sDmF)U4]zt*smJ}#P; ;x~O)FWeqhmri)"՝ /]4#CJ*zeRi*lwQGGd'%Hw,޼r`/&YSv `& gZ10"+g}sqn*أݬt8};͆ϵ.>``)`h&r6~136lآׯԀ@Wua}Ȏ6={3W%Xu[`o>C*ߤRMr0,&W!)X +U'#,K0q%*E-AErUCPު81KɃ ;`dL S_`|QUZJ#>g߭K4Tіbn0,ܡ\ך:?vm~;%XWJ}QE VkMw_NJ0F`}VXp}/~W2{{j\%CR0LJ(D_? q)t=@ ~#I C 6 ,{:a.`7}Q].޽w]] L`PaJa4a%-_`_^F`vҥĆ)ڧ/J7þu6R_)W`6#ʒjShfRpqxn2qq:%X SE v׫W1(`5ʺ]uEvu2E M+hr6ς0%_`w{rc~#+B `Kł~D_ MB4Zl(]d1`+_o_z8%@n|ScX3s3((}sn]3 ߈xcKuw{u[]J0[Jna]sa϶pQA_}JEJuP;,Xx ֔zδKC DfWw%yC=7;^sK vK5Wx/AjPRjTU6GiL(l2J٬7"ѣ/J[V_/z f%-Ժz>׎/fb'r\(,6sOQl)(`M}򏮽#?d(M8:F>㺯~{=oSJ vsJ[_^ܹ|b[(޽I{QB.Bi9̎`v|,k_`|=]uRsA[ fP،$w^#G`KyԷۥKYQeib_fE,v_c~#oDG`|]ݺzŰ4w)`WlfϥklsYK6M|5¢6XX܀_J?`7Ta)K SJ `}Z]| r)<ys%M_۔`ެP/ƫ8`p1}e^STgX PG +lvF =vOJ:K׈쎯 Jg_'_ ς*( TGw*Ayuح믓%cesa=]?/Q@ȷ3[V7}ݺ{r{ vB B%0`+_]x]5J(M^-S(l&ZjM}P|7r0netoJ0K@ v}K0WJ0qSsA `3Ҡ|0dO&]KCL˹? 8`7}ݴxBzvuc*J0[J Y^59?^أd5(BMjBzltWci%-_w,~) R@qE0Ej#uъ*GNw5һ6%M_{`3ki3l4PRpߢJ>vbW{Ɨ`?얯ە`_'ǫP#J0[v].()ֈfQVbW#K0ȱ(nW F>`=rQRQ᠜9KJA%H(2Qjς @ v׍J0/3Y_1 %-e A9r֖`bpx݉>tWJ0 lK\Q`& ⢮v0"OcoF]QlPzںJ  :w/GӍ?&zh HUv 0S)%X %W^>zp4R،Qme)sdR*y3hjدN%?zmSNs9Z`}]([²Ezh1aHǿ DJ0]>ĤZȚ"H% uVu7"e,~wEכSb:J0ƠC?xrQff/~`pSwhJ0lY[(zS_o̽ 3kRzlYk=; awCJ05vjd`wY(Kա[HK0(V$9;8ꯑ^%z'ן@ (0ҬsG v+_Tm5ou*PR e?z}h'3Ɇ2Nד s)be/Ml4.6WK0oEnE&bS /] 5ꯉ^@N? vv^-S(l)\N =G#+95bςGoJ{YmK`se1vjY嘡QRt!+g.c/ʧ"5C%+z꯹h鸔`?vZ-S(lI)^#工L;Za7hدޱ^}`4 3/-BRνK)`#ƒѵ7%m@٘)bG+)g$;^זY9P-BoMqJe %-E`tnIE{P6-%؍M\4:^W[ѽrg)`]Hm8Kog"T$̗^}`77qѠZW#b2 m%u$vQ&Nғ@4go!(-tŗPSo v9!J0[JmaZfa\Wi_6d0K=wE%kYjd% OIU=~W`䡗m pZ_[ mxm.ٳ샐 <؞oUa_+fA k vsoW_`j)% f]L[0(BCRvolb=w\[0؍Lװmw%hPaY< lRKu_`m͞dڢm~{tR|AuS ծ1_kYV~`EJ J9Va`7e+ucFs)x%;JQ"qʘlw1)`A 8]w`ww0J0K /@xGz,'`VJ0gp/wK=CRs(Ė iZ( wT͗VX믓 V({N%X+&_K黢` J0ܗ͗6snٹ`@D -$ Gs"J0ܚΗvH Rz(*{QmKF `=i| lo+T.2m\J0D`Buz,A`_3A_2lP`a]Z}8Wѭ?j\{ë}w)#qӬ{ geEy)%X'%J0fm%#;yx]aw#ѷÛl``gGYJ0)e]߬guKHyPb>SzbzG\\#1x=^1v3;Kg4;N1q[?{8~8~8_Q\v oȴZ eJh/$[bfF84P*ݎS&;lJbSc*zy_=?p?w~|Ys3Ur:` M)9bϜƉvbzGlf;ӳsHu". \ʼncQ4=sN1gz{yoBUvt Y_Km1JSbJsx?R6m6ft8;F1Okdmlt]]z{SXE+R{zR OdW7"N7"xC2sS*@;,;lٙHXT4qbE:YsY UȎr7RO?rAF^1%XQNOـQy*Nu1}hV4Kp`3$:)3cw ``NۗlV1?\Rǹ2%r<,#aՎYѩosWff]平 jb 8`/1<_)k,롗 }BŮz__s_-[ь{vGز=gjūPt5+wuY0 8:zѹV}D'vG#%{ ǯrAWt=Q0F=wCEC|6oW6z z]+/ď\*S(;쉢7"]ˣ^zTaah{.:-D^uJ 1s`Ca剝v޼_Bp5omlm7C*Li{;rPP%1 (cς9%)Yj_u60\qL,Q5K/ѫ6/*iȬʹ׿=\gëP6gq8a 7 e#%T`+:rz ?<(i{]Ec]@(6`0zc_ rjO#o`of҈_jVHaznZ=u@ v0E<4ri5;Rޗk+ PUwH_pVH/tO)g&,A qsȥɔd/믳#Nj`?(*:bŗ3r[pn3/:-~4HUjJ.eJuEx}\?:&\뛸EOæ ̍aUKeੰ)lr0;"qX*&yi0rYUǼ)QK7|y]_:)#K0{@YTԑSmrbK.AGDTYuf4^g28򡯲՞~zY*7y@g2eX r$۠ݵL9+uPq$E9}B9bK S.)m Es-ېGCVҰ^>";6y|}~%:cJ02nv͔*'Y#F!1ak#!_}J`sDxSb:Ut|%x8\ZV\͢+ZA۫n4;|˴2lFp;l/m8alf8\ZA?E lwJ}kK_' -חL|Y1l=hfF(tDeDFz"r=)~K=#wX_ǡh.ӣ¬ M,} G]i~)El,uDMT_Fvѕ>Wc8~( ^ -8h```{UY]g,+_'Z/%^Ģw9T3wMEq\Fpd5 N큋F*a!tzЎ f`~̯ǟCF$ E&yƉvnƤٖ^4~ n\;[4&clf& x`/0_o%n5Fש]MT֥K삙S9F>SJu R}oK O^S7 c|7e|YTPy5z+5~;:#]0>:$_wzQJ 4g@ Gzb׍m%_Úiur5Vqq)v{nzmxtw rW`ûy7\͍]-A)7\ziv{,OGuRk Z;`+b͞\mS{[K 5NVɚ{nQᔛ`2zI *̫՚e**>xswKa;W G] w כ\G.*ifq 1`^`??:)\VJª;=}Yi@%}K7&m|)I`+'wnBދr蚶AP2u.L7g:-h` (^^ʇS.h{ :>^ڠ{#Nܶ\&r -8W>vbI n ѲŸį_ii7T;86vP[V:;' ,Ǟ;e+ꎗ)tY>8 .. |9n?yڡ4&V8ƀF35Vԣ>#.C3:|C]SY]|m_Wq `F*SwHtyk6+xnˈZN0+=v%츔O'"\\cR./`Q)nq)!J]J]"HSG8iz|;[,#1ԈͲ1ũJhOf]2FKeC+/a\eQ/;_+'ŗnK ` 6gO4N4PeU:F#`*{[FcqJUzk'cO1^NC+/a"syr$͂gK͂uR s7JƒaYL*FdU:Ɗ42][ccbNxu|r!tU16#=J_ohX*eL.)ة(YsjrhR-{s;X,=5aFJ b/۟+]f)`}7ߟa>Jzw9k5=hJ-IPM(~}S_^oT/AW(J0|oD^] 3y=º N=eޱ[pQy焛jگlX-hoіw8E5e%Rx\ϡ4쐕E_Rf WT46%߈8΢;uK"{| V6ӷŠ8z>`=R1l} A [%zV4H6%ۊT4ruszK` +*b?//קCK}G #FrϙEG6&s!uJHh.<ͺt*zϲYd%ObnzoD#=l,2^=Qvm31;o) 琧)%XHSjwZLlJzʈĮŃ#JQ DT3g]&MEmFnlbzJK];#*쭣*/ywkS_^Sc 05^i*H=* e(ϢIOy=lz) Sg_FQ76ti6սepMYggufv"OǏU.E2%X+=+u*sY6Ɋ(#5KsKgUOx7uH]P>ӛo))=~zO6%ٟ^M,?zfc}_%+:bǼj#v.%ɺIklHFOO`i6S҈f5+(q o]NT+*mqU$7tEqw5+;[Qg?2XsfpE/?M܃UKnewz]izbEG#ۧƞjͤ}u|Lo:=ܖdnI42R1No~u9?ُM/]Nx m_~/b/eÖ/mNa3zߊ_&C{KE0ƥt]U48vnJϦn8h[왉6 ͌#+Nha©?*Cy#w~{ntF3+ 5WhM_Z]ej%Xq8!tJ=B=*]iL2iɄҎ9K|ѻȆ-OD#K ^A9hcQ(#_wYѥW^7MR`hE,6N <>-E?DZ+^E>v)KHGTT3D_e*= J(]w|.oqq/`vt D um͗ʎmlϏ܃oD|~_Tr蝆|O2û .j(cy4Ės|ˁ[8bn% ([`^M/ZP)^)zߜcQ=:u\ %Ct(u}S9ğ'{ =pB ]/J]pߔYX(mςqXJ2,wRz,خ%X̼#'v/JA;R]2!SGPi6(mrdQa#D9[Ͳ=OѰla{;xKEñ3)^KS:h+r5\G3~L\]h?랉G_;B_[I8wm7+=h3.NCiOvr#3l{2>V`y\D3~LUb.rP"ם6+Mh3Y%TFk3yŻY%K/H V6u]~5ҕ_7]|f*Gލ!)gsPF89fb|;c8ƬQ>PP==pWЩ;dtcƔ)U^+'LOIo,(hJ8J31l4eJKw,X'`(mgzFƔ`G֢]nϞ%&v9"> ^JJ<>G8J31U%89@7MӾJ;^m .ăbxX^0=:T8qFfщv&bT49Ңf5  =юV4#zd#q66?l|{?+6XnUW [zJu)Je J0x,Ali8+uPQ tjike$&4g ;=gG{Z%{7JwI%x4rD4u=h3P}2oӞ{뇟Ez?(EӾQ5K]JmJ;M5+M&LEMmno:vv*ʉ^ғ7ڸLEagiw͞ ۟8K6)җ5Y%j5ճgΡ4[fg mϔJ7K{%~{-Kx`Bmnށ ,Al^:fg,8`l%hy·2L}W[Yn=w知`?l->VKY4`m=k|}f;U?uE%Q_roX6{.%=i 86ہrcK?(|G͞K F vsj 6  6{?{~.0,Ac可疞"}NtGϲ` xFp JGG v p` _6vNmhʵHRi\zJs*4E%ll >Kа~|6;OԩƑTEYmJg8rƖ5ǹ8ⴈUQ /ʍt|7xi aJ0m+8K"%ؑ~>Ѱ?OQ2fux|NRqhՙ[!զrԝ嘀%H]d!<% |6Ec%h| f7nÔ==ۣҵыLk̳͢=V.1Ͷ##={!1Tf琀{#8 ,A;`B&4IY.ˑǺލ|'Ӓ=1Ҏy*THEksHG2Ց`5Wp ;`.;?I@LRiV̦ ^$;Qb4_ɧz1@T6;mm%h,{z#(B0[R*8v#~t#VHvhFK;?mUY8-\/7MYvbL\νù_ww0"+db7ˎ+ڠ=*un09'Ӟ{,A;~YeWaWGB1v3#=+Ǣ6 D+&Uzʡ]rmlž*>=_:_>[η?w"fJ n6NmI Eh(E6ݩmA#%CKtvu)=e3cL&-CxNH@2lIOB 8s(m,ةؗݦ:lLVtm_4Ğ 8LUQb3ةޑѦ%>輪e j@Qs'y/徙0xrn}#MļSPKO^oL VyG 8go7-^;j{&U:f|>=J09{;xx %"n1oQy왘`0J09|;8fJ-KdhUIUV7'Hό2ɞ[\I^zBHy %ϓ6b.Y:|K悔ai(r7Ϊq>jѰJGulp(,<=:jG~vMb~JSmV7T!{uWtvwrV:J@E[xՀv`svP=7&u ĔQEGLZ#ӢTSKfhc*mV1#;* v+#xT{J& ^4K04vDq,b d'*\#OH탍bTrKLzPP+-`] j-J>WXQJFEe'cVfhs<#ĜzfOx67/QMa/ڇ}ڽ.܂Rɠ5K0=`H>j4[;xjM(lƉEc)MI 2v3BJc '.d`SZyc=B[*6gfXТW2WFYѲ*.ǥqb]pq.ͳHi;ce nct %6 WvFKq;=Gajq|C[*oDLw_mJ{L%_7#zթ1E4^K#QMe̛8d[fFשhfKI)^tF 6Q38>Rv4`gI @ %&V>Tla?ة8Ejj'ԹNҮ>QRJƴ=;#`_1Z%l3Y; ҏpḭAŨ**Y)-S3m *'<4;r[Am{b_JJآTF2䈣XlsKO 536egTRVPzԛfbR:'?b$JHيbˋ8q.Aٜ$)ejɤĢoaqeu>?bT =n$R^mD|/_Tu͔0hJnpG 6Q6K9k.1fOԇlhf J erSiؙTK4/S e{:r*}H J s'ҏdr*=3FF%YD\ܘLƒ(qa"ɱ_mQbHԢA){DgMY|RŮ+k,PEHy= ω%lAeG[Lx>_mWM s'j/5vmDeWc](ig.hqW_}nH$@Js) eꙭUtiJ qo$zNMi|:̬<|S'cLJ`#;+ge'sg.ǽ}1w 3Nx/x'8ѝ  㞹޿ ]1q)/ZcS״*8WrKhmwjH)%-`^` SH~CM ӎYOܝ7UR˔,6>AXZyY?Ex>{+'UM 0[Z7%aeIEx^y^Y?rX}ԱTi5ʉd̑4SS:ĢieEd.`x+)q<NĊ;RҔGp5vTڗ?=@SPLÄfiZWy][:@^q@9,:1TGj^TI:@GPTqJuuNѕ=kKq-@^W0q\RĊXwrKGS!4^ٛ&泥"H/K{uޛۭ@`x+XSĊXwr^t*߶9u)yoBڶ3ℵNs{^7ÙEx參\wK?]Iϓ}KшƀjwL?KGWci#Ev#eLϜ:,ZYLYI"Nu/S48Kw~磠8(kz5ClVZӬ(b F+8V_v4Phߵ;LNcޙVnja)ZG˘1*øhjo?"i|יŧgx+QȌc8VRوcN&Yl4=H"0fO"JW[bղϋH'ZmA':jfQ6V)P3ҍ"ۢzs\⅍Ӽo2ºqS$ 9L<:a#8nZ:%HSօU{Ίq_It{ISOæEXSiְ%<%%2/hg>W33xudrWҊf/f#VT:3)HJ_JWtoWsID( | 8_3m]dIE"Z\d9~^t9u nJk* DgDa=[[=MJ-ce^6}XG+v /vg G߃_8޷bN}1ſYXa갩Sm\u]-uj) iM51+FmE#z&0!\'NqB]ک1J³ %o ̛ji/s8Sz%R77@؋`Q3Z#R8;4M{#'zL+ Ni:NWpœA58gE.Y '20-*~4c6gn#r{t~\1DFͽцΚzpZpSƒ(vcRC"t!~8QStWYEQq}c*\ףϱc@H)Co|dGfR3ҊaSj¤9QQ-_>n Moz}nޛ~R?ѯv\ ~ }>Lb1/E!:I=*&͙lq~G1`z@+""^;2疮L Lc-{j& /YQΟN`U9inD1@ම.U'Ӟ,xarEsvR+ׇ3m6nſ8+A/_- m}  X:FeoE\}w } v_  vonO v/WǰTQ48|Y1vg cfqQ'rP;?sȭk`NC'o85#VEš]ힸ8~#GJ ! v+eLcG4F{}sQV_Mъٻ^cƢJz9?lG_~[ei쫡i*/ MGSyD7:+zqM`㺯iʬ;W{?8!ӵ`Y8V}G Vm<~QG3yz.5_ fJ<R/Tg?W̊㢎)W4MWƔcvM>C ՗/*RYaSӘ?u͆Q<]tGxtv: sC'VgXrԴKXL*fJ֏睫9;U;%,r]|\J+v r-cI療~a2+g鴚Xb|xHa}P|"8?|d2fER%Tm4;r;~ 'mThEqe̍pJChWߝ۝m_|-\n/a]Ɖͬ6cR‰9X |QJuaÃ>㊹T41zK>tXĦve[5'i4$T7j)Bٱ`mJ/au]0NH|mUL(e9)EwɊD=|ۻX}JQYH(19tL'~IӰ1"H%*:EC1auJCQPE@:vJA59r121=NVz1 #ҁ'+QH:>KhYdzEGk" m]TOL=/jL)Nsqe6b*n}''+M{ǧӑUL;7LNEwdةLLiSYg9|Œ95%J)7ӑs+tbCPtb8YQ4.4M-LIvj-Zu p,LG_U{ybړa:=߅Zx,u})h[TcV*>](0+d93lOh&*cJJoΎGpK/ӰiӱYwx^¢\X4>q*V:ftat sVv.S?%'J"1q ?/joމEQDHLSDL> =FǿKll]4m'l8N4Ve7wLVk3ylzX}Q=}vzS".ۋ^psHWx258lW0MyK0X67ve]8 :*e;OS/ ѩ-N^%uwqmDl}I[S`q_|!s}Gq,-kN\,\|a/.EfSDGPz*={q ]0]3|v8TPTLmbo0DtJZb Әq1--|=:EuufIESnm-8NGs0aï1뚭E1U#h 66q1ݵ)JsI "`n#qq @NLjlTGP)ݙ0 9DP'j~oJLNT:v%ʴu^D~ĊSYP ~$62U+ zq=FEΫ&4!>6]t\9B4_],{-ѥhhyd2gNp x@ӝ)U{¤< ϗDi5SS\*rV ubdg54}6}%WA9 M-0nik"l\,dX6x +SS=ՄxiYvBlsĦJMF:= ȧAE{"i;颣$ .妲yra1| \Oqq0L{Ny]#rǤ{d:SKf0M +!h*^Ki 5[Y7:{_~ḄŮ#pd4qZpţ@R+O:`ظ)z+EEmnsxP V|^))'%NLXZlD,M2rc٘fMvO1u1,GTamg" jn1C\#)}0W*-vtBE͉LYUF_bwq]];jhMSLK^C7at7x/\LjumT0[j@$;&6ZZqk"Mk/pRU񨯩-GfnM7J?wYrtҳY[y]"[vDZjǸrvѳ?D=3\_I] ޿/rٯMAV5vq}_1y;8z;a/S]sR.sx/~gr;>k>?2'}* Eloet7RTko{CR>kFFS~|$~$+Yܺ}uų~Z"RREd'@Ge}Xve-έ1~D+S͌vU٥䙵ѳ{fo͏Ӊ v"{I |]]=yU 񙵫~"u|[*位OY0&{i}]f _G8yY1Bii%]Z4 걼}S36/)u%]tV:!5U+)~98& L{C~xԡ(YE'{.L'f6Hs9vW/Q4 Eu?͔nL{f+* %%c.? ?F6ê}?i3 QEa45Nů%a$d%q(l G+8_/QP-W\_q8JE틺N.]9s3{4EEw8bRNiz9|Qގ8w:J:E͘-h39bުQY4`r4};Ӟ3 Rm= u^_M| ԛ3lD]u9=;fur'?_Z뷩MNWÎ2'fuᗜ*QҺ3jgE[iF'f}8|.@ӝ)ilPU u5ѥ#Һf9=CQ%mӜӠG<t&iQҦir0MJMELivzN.UJfފPlV9r6Rf| [D {F[2ME;9NjSϗi]Hsebbo)aFUʦ7(ˏ\l19]C"5stӎ=i0{Uzht vĔ gD$49a|%G^S6]M>d7Ez߷`KSEǤ%Uq}ENio)ZS]dMeNۥK&E-i/\7)kܕQ[= }dV){+N qgDiw0'ݟv4 -?8|1{@| /iJ-g~n̦/5|~*T[tE)ko?ݲmDgW oY_Cǜ>GB9zfO\^~睏$D(yNMRѴF5'P7L u'U{vGԔ(sN^1z=t̖1aR*Ŵ=l,j:۾Y.F/+é:NL=1F71tgeJϘ<.m-jAhȀ7R5Qd4銰ZԒnYKRtR}YoՉ4Z$87}UhE.2|^đC0"^kjc6Y-Mcjil.:+IݚXl l8/:Wss!ԄNY%͍Vډ#H?.:iL$bTäo\pVL:\\,JTJ6ܗv$SW+]augN6vp_~;-}2uGn$b):\9%=cpiT4iWi{M4Z(و}k3&;S$m{bG'F(cƌc&m<+jWĴ~htu nNWR~}zP׽*NzspKi`{ 8fb$i."NJ/#jE\"Jjɬu<$-ZOq\wy#mor%щ >q^5aJ]4l7-Y7%7.dKEuptI{2 ^Nhx'(n#^9H̐8[DU^9"uDq5J66N@ M(E*յJ +3L{(]3<X?Ս6.YN GNU6CƓsI&ZыVOaš[Y^v2CӃ6V:Ztd+mrb8%R4K 5.Z1ة;L˥CمYe]>%sEn#JE{^QS%- 8Dz#ŊY<2/i-)7;ava¦=ZaC6;56*> 0JEbTT@"("V|UY1])ݞyv41+&MK+MZ6{OO&́++gs"#^t$Q\㢮fVQJ zuu3"hr"Lۈ̰c@gm6/:1Wz"  9#5N;S)QzJOMQ-_g1ө.-<=\x񎍕Sz^jA$:uW4[ k0GǿK>N!qYaoشâVz{1mrO~[$kFĈ\NR3,].56DRdm"ծv*N`sK|LϩtD-tw@UJ'4xc>hwzFŁ4R;GrcloOK|Kg 2Sa0p-/%kg0w~oJgtv 7<3<(nr>ftW}b~(z3VDzgwda=ZIս]u]wsf9ip KRݺKpF'{9[`;#2zzx\?-v ? ˤfXz;ȮOPɼv]ǿY?ȇCmlퟝ/ئ qj'9DXIeE }~Y)D6ѥQG9nSemT<1uu{tJNr~@oawԔ6m4+VYzڦo[;I _p)wzi 3}h%JNGظYM} iVotZt5u *5Sn?00RTi̢CM.F-V+6}͘Ȟ p#i6}9iFLgٳ$L;s_ Ef~ZwXW5fUmh)Lj,= ǷW5i]їKL1=W͔76 Y=(STYհpp|ZYvӐry|Yfc6]~4Ʃq+kFm9%E1ZpyYtķ4 !ӧ=MZ$5tʥI&uQG|>{Nt#iXԑ+9Nf9%X$8Wf"\dޝFEE4a,f_ucN(5 1}EǥXKj4 q| Po{nRNtzb:)ҰYꔄHy]Lk.͎)%Yq)*NênM(xڅ3dma8cLmiKXKjT{>RIonzɶ_4w,KMjf_sz,Dɚ;u׋ik haH2m5儥R?_9FQюӏ0Hl m=?ѱ`J=ݜ^5Yqd0TEMofEs%'ʘBC|:j%Sfj?EPkx8JVͬX"oj9aO5/sH+>Fwǒ:f1_kM/UMVEJaB=dMژ_wY`SUY =)IR5FVdQaVh-fELUWڴ&Y/rуlcSShМ3iFz&u"aglJTE:laO;iK )۞__vFQ3~駪ch%(vVĞH/ಇS>}ٽ ~iN/Sۻ cWyNֺ@a{7~-oOdK?;7kF5zC`tŷ"Y9:ːDH/_p~7PHf)mnn^WwV΍o[;=oO}@~;o{o˻;ywarf8Ӻ3zFZz{v<۝ηvzj_WNr? jJo{6/-{'+w}#N:oeq^֩\lwy=m[FԾFOd;4u'/dl6Zލ-m޼8.~'Moقܫ^֩\owy=m[FԾFc;6+_gyڿxW26DWiSി>޽:"p>{:Zzhypk>|9#KOϑQ9s4ibj4R˥8%_/gX\3ER5 .Eu۵tʢcZH7TY[ډrE[)5ا88Vә 4z_`z΢yhl(UNstZn̶&|fmD9־,Q/lZaFvⰪ)RNX)=I/*uП&6. ە˵tᔨιqlEKBBз'EM}߼wnȬMN@NF}jz҉mlt2M;4QXoDmcQ1^s*ᴷQYNXaݤ f*8vk.6nnj:p:=[0-Ea>B!uU5_z}5脵Gӟn9[:mK(%OBwk9HG#li]M_^=hĉ}5vg:t0۬vǤt c/6J+:1QG׊Iڃ*B͉yY9|+-GΟw8[G>=FskÏakLoh:RQ?4FLCwZqΡsɀv勯{(ii;W񈄷tf/+`ɬ gK]D;JmO#]ƋFN!FKD:ՔN0g'lҘ$M)U+c6싯%rͰEL`-X]ܴ Šruδr;d~X29ji7}:azԍZ-Q]ldk_Tڹdp*ՖEG7 SlޞvVbOۈœf$%ޮ4ķ3^:4}iQ]K?+cJK4K8t6:tlFHUS**~_)Uǃh:"zgri?ij^%h_x}Myܧ;8I=TMnl]RgU5kԞeUiEoAC,ĬgQT?7o+ xfwQc#w~joWRnV\x*a>x8O~O ?e8=^[|7oy6MGp ۑٞ?k8=.w -8E4x^-Qn@ |ޞ9ܡ~՝ķw5{Ca:z>-N6R2߸t1Cu0Y57Ҕڂ+[v@5L3g&{dڈbE|)QO W*rXfムlL6r)NUcb%Z*4ؙ9LJ-fB$Rͪ:хGG 9 ӥKWӟ"L:2JK(jlP.Nt亸p[͘3yO ;fљ^mUmeA߰Ki8K›ߎ9&_/U J&gWpvp{?h8_ _gl93WW|ܾSyv_0OQGߨ +p+3F}0Oui'MG3~ t oo}.~lމs%s)w÷w^j{ιk[>{j>8w̶JgLLonv9R`A .9 ,ݳq^ v+xMx{|NG0rH`SJWuKަSQ|eVǨg>f(Ia4q-Xkg{]iX4ɕögbq'QqRFtQOuoj ֐Kc-g\Dq2MWfO Gc >tuæ"ʬ|+"xus ܪ[wGTOwBoq6uON~y틔ȃj3`X:z)rWL0#QW5WGN/9#aUBu*~TSebWUJʙbvK|cI}iݪ^WQeg>NJI6̢*:rfiFSƢن4l:1^jyӂN GX'ͣ3MKޅ 'f(Y1Bgکv۞jm7>GaJ*|T*jmS2bV=DK&cxHTaKOGsG0KD8ce},bjl9,bxV0cӭ"So]Gt^]3Q;3i[ZERqeŖ_VRlKUOBiUєp2v:0D:es\¤NWK):"?0bfX$>‘VWG¸ 1ӢbN~UGtꚉڡHҺ'״6O+:fi@#TgA_&TgjIOTx DGӫQJ[iJj)EΊ+}/jEWwAhQm fQ9RthRӜ@$[ *mv|:qWNM*S7Jri_/QQ⴮Z1q<01#~g5RQ4Cz9ҪcFj435NSh,k4)\91ъJ4{iخZv!JVuŦaDpC$NLH4%Ҵ*F<#'rB sQvL̸9e6װYӶֿDsQ?{H5}# 3QG)[Yl z#´gG=4tbֹNK}\Iףqi47MO#{y4G?Uӧp=bqU_2K;aGe7ipZe3Ʊ4h)*Kۉw޴^JvF-RKSRYCR;<{C'6RxNC3OMrU[lXҲm玦7sEzoĴk?q4XuL&w-܍E_|Frnn8h=K{iY]/v?[SgnܔO- 7QO*EtkUgx.ySlY0>0onov/o(_6oٯi䙗{  6{Ox |S_3[`<[x[^ʦ֏SЏû[709\e;Iowd8QW w1pM܍zq̣ȮJܕiEi5&90',;<=wpy F9=Gq;|x+| ` DĈ* )?9j448c5l:7ݫ&:Cޒky4uZ1}U9մl*ȶS͗ "%ϑTpEW6Wcpi+QʊD7Z2m7v#+-11Zz.1-V^`}((~ÉpzԴxҊ<'9g-59RL(QӍ~1Z 47ctbR8܁8QIMs'Iaǿ] <:2sӘUi ߢ914 \i6mGMcL6.RW-_]Y(̙ IT[3ݚiiX4g,ZjoʕrCՀvv .,1'~1é@,kHMu"儙3|3.:CxQ0TV(RWM$F%?-EES'L]acL:"3t)b*^5&L)=Uڑ8;uҰ:)<JDs2{DkɔeQԸtbp*$1D9xs6V6^rܦߟNtr{WCmp%8{iAta&TļDt^wmxS ^b䤡0+fQ9énM{8~HFKi*=MY +<ƓƢS}4P$64>*\z*p~3{}mԓzsF(4x F77}"^v; 9{w` `L?)־T|9[jy|-.whI.Z_/q?8}2>cGf9b6^[[ڸM_sholD ŪLWݾM_~o|;O/+}|:+10 6R4TRNuܢFL4]Q>}~2_Z {NƣFXwF:TM+Lm7> },TupÛOؗT/jQ_Jg:ё3'pOiXYm{ЮS*qĨ)VۙJzM c4 0j_A)Df&Fđaf"=IϮīщqNjQ-()Df&F]Dxu(RcUےKSqwK8 6sUpflNEjL[3[/a%lMFѱ)9^iu>U| ,Qyܞb,1{AF cs/+?k[&p7~dt£tQKt'yƜsm{p+S%ظރ8:~cYf ɖ%['R7h?Ȗٗ/l}ՏYN{ [ڞ~h^`?đW0[k{~gxMHO"Q1)^vS;Mp]JDӹ޻0+I4^z{͜W?x^2x{#Wv^3'y^W0cF6M4i98 pOEB%qSOZj4YK"c|ϼ5ҺGІ,sњuc:LX2{>(e9j."m'LJtM)"rtwY;OX*( %ӔƅsaI1΢YBE35K;:8iL-aφTJpZОfpJ}9SD,z|q-#\ !(l2.N#bL{ Iv)rKxOd ɶyGP>obz+%ώ3qWT6 N?󤑍c89Q1#y3Ӳcl)Wm^48JԶt痎ް-D(tX[*O{yc5Bai|opǿK>:Wr\3`ϕ =m+6BbJIoRF͒=szviQS4Sgzp*ⴐ#~ҍL3 )]"m9MQm)7^diY23zNeE{U.W c~wڀ3̪mI3Xg\ա"5̶y9Dzr"eEn/z<}G-*p7kp pc'`'a x/xk&^;/_,_x>=Xq+zwq,r'U{>;qWu4 şd=L,3lq]Sno(X|f`}4ϳ&bJURkZ6{_FlnJLY+~_&b<4r:5$+[ 6[327 ~9ɗ~JZѱQ?J5}ԉ`7VYGUf~4mݢ%9 @߃>g0_`)Yƒf-YqnĴ(FJY a6$RKǿhKN/Okc4eZ" sΙѹ$̌1NHd,7mZjqUSʍ%-j+fSU?e q Ҹ¦03MBȦE}iO, a`O9o65^S9KzT" s+R aqZ>Dє) NpoJq{j+fSU?EN=œb5\U{6#T\)=MO ьǞ):~kw\JHˊy+pfv7؎Ri1_m`Nq MvcZ7 DG1@D@z$s>R<;Mы(l9Lo7|Ec R/,J&K@td1ZDVSql<=.:i<,};Xb(u #=KJB,pfItmfINS;whAr/9of fou4F5IDu`z0,_\pZGκ"ojQmjO'L8?mQ0U7v~~az8 uE1Ov;ĆNBnXh~!iٱE]ԩӜ'+tuN^R;dvpN`e\Q6[!~XWR꜈gC(ΞS˷wtw9Um 4L)u|^ endstream endobj 8 0 obj 53492 endobj 9 0 obj <> stream xu`ňN!KKp(R)Z)^+AZ,@5{odnvOKrvwvvvV3$;?=Hm!Ŋ<{}|'SrNv zʽ3thѰU':eQ HCaxg ϙ*+m=|+?r= M.%x6$Hםy8b,xfwq*@[.P!?}mTs&$fzJsR \*%D6$Qjrb18g-Y7*As ~y&k(HX9!t:R\Dzem[v _bxQ_?ȳKq1hP&q#7 $0n?#{ :x"nHp['YEwuJ]4/fwG-(W5]n릣$ci*ZQyN%"RPy'hzTz+$S"arI΋v^U&HLU/%qZU $y*ֶ7&e ,@Rr!ɒ>u륫% )@f S"ߛۿIz}SbGYCH ЧBlh$GR_}S-Z$O}Pd+o֧_ I1?+1&' \E֖zBzi`u3$RTͼ=!qWkVKC a wZk+ 1%[TYh?UKgCnJNh=y6cw1ZYY/{}i4~5}/޸r uY U2a]buy3IHlXB~&O,Քm*h@5l:#'lZt_Jw}98e5YUogW!cWQe7KCͷ z^EqQ Eub$@K%L<:/j ?C=1r tӐbc BYcE'qO%C-Nd7e׮{f,@7sg~8p2;]y{6_& R(@ɗ`-E^@f diܣGcd,ђyzd{G7T%UU]?Gb4Ѷ5+@R3EI]ΊLգbQkg;]EyZ8@( ҕBlbr-A4KUV={9Iܳ1G $QmNY1 bz~9@y&aEnv_Z ?.|W^U"8Kqbӥzַgx fCL$NL_R+ŌK(sUpK8=痙j>*^@b f*@Eìջͣq5Bov&Joo+ƭRf!TVӻi!h @l;d1i#ZNTF>`ý;`W!峃WFS~jHa=\f1ڂ} %yXljV:8 /u ?W<<잸#Ƴyc$@Ĺs|G*Qњ;Evč9q!@a.}S=3٘2)qt硵 ?F P,}}MH+pNO  j޾D;"EMs @bp lKҗC&@%q#˟<<,FMmMr]¶lョO[HQf(+5 A˸M<.YBZ,XTFu:wD ͒0#,ݐQo"J7 º=&/ Чf",PE AA&V䡵A1 maZ51Y9A#3Q4Kq) /وn;`ЕƧFcd|QuJ9eI)@/Dr7D?,(FTmT DfOg.M~ H>6p5jvoVtHRȌ#bQNV!I8:<PqAhAiηbK$p:n+RGvJ\(}dBb$@ȢM J;ķD3X$~YO/(TH-QVtY8b4Dh.wYjN[GGU)s)g[Ɓy,H.1ᡍ$ 4n9ewچf(wJ > HXF/)$ףkN\} H-cB 5$K-45xF˟T{d‰Q::Ʊ @&" Yp86}UEl) P$9TENj cƊQ!N+TeRo !@Q?&6EMT#5&YuRSމ,YDLt$ rw~]7?$ d2)Z$`+^ʼn6  UQyyc$@u0gՎ˪$9.*reovb %n;)R 2RdE?BZi&Z W]VPXF,3@LYj6$dO_Ɓڣy*@yv Th2u"2!,3ITD<(f\re)qJV| !1E>G&qLD kL-ɗJeG^8TY{42KF֧b%(й!>Ht$w!@҈s&@YkUb>Hz50LIpRKv/xRl2AV^N[ˎߐ=IM Y9$Q"CJm$Ձ?19k iJgTr7$:-1 "F⸚R_hqtey JH 2% d[$iYD9 GFeD Hj{h8V9Og5!$fG7 ɈG[9sD=ݔ^b/@Eb6 IKb ]Bd$?lw0;Hjƨvd QP&z/r86cPBU&Ya(J2xBS?ML+H$w{T%ȢVDC!Vܐ(f;!Z0 "쎹* ZoH*(X+Hc2^ (4b0#l,j+R{j%; (Ba^jIR Ga<,f[+,U3){7Qv 4`"k0hSz%Њn*@ҨYY*ah^*b%@DvL bI>2&0uN$ftsgmli'$BkP~pS̑S3D P(5vP:ދm 'M#i #>v57 NGٶtGTד akf7.#@Ļ$a}ʴ,\m)v {1E ZXƐcHmY)]1T$i>x>QIu[W=WtI=F"b6ʤWq %hI_~ &Q,xPuk~`l"šm 2y)k*|6UEHj61z;kF>((91Y[ &yxqJ{0+. |tSo c:{6 T^YB@=CDIAg0kaIua*6[at+FScLLZG FÛDt] ?Z>ݯ"g)Bp V޴ug,5n}-f+Gib+VU42(-H[ܵΩM$2W~U`\HM,%@ZZuQU ^1*x$ul`īoG+c\X36`b}D9ev,(ogItwiӎ$ ib%1ߺI)."DXg7-DJDTNҊQuphl'B6ܭNꪹ/94j7XxYi D~e]\-\M IAuTd·B #`43g?1('JH*CzL31fج\rv y&ZPNv.1H>ىU67ML>_QzHUKGt63H=ijK>ۂ2v3[Mͣ n3_?S6 09$MtKO.m=DYӔ!Kfg[֤KU>0*ZIUCCPS_O<|pzi @hzVru'g=M~\ c<Ɏ`QѴz;|Ԝ_/%FaDLnD?|}&%<3.4+յk"}-c&v7 ;my yID{=B.g~1x/S VyΟ *c V ePYDnSim8k9"Vx:^ k{dsoהW: |RV*@#iTYCp}UΆgE>GzASUAYuɳE&MB=9EDYG`΃O.ڔI9]n'sBSq3)F+?,}M kѸ=6=PD%jaAͅ0 EO@v1R j{H-47$r{UO -j$IpNUgg_e/ioE"dkQaL+"ѫrmtA%Q ܱAU2 z+-Mc6W6$YnFm5q#@Wds1 1UI5>d?xI 7_v4ϭwc сu;#eg%ju [ă4jGxh  nW]AJf X!ć2DC%Lj(Nob>sk L7cICҎ =Fu3Y[L41Pq{yk$#vkӦϮNaR pc=?Ѫ੻Y|>nm_xL9֑=ڴ9nG Gpσm0p̌%{Ew7淫rC 3~voD\0֝Nj[vPQ? 6p|hbbk@QYsT "7F5XU;b#<1!,f mHHH"T˪-FL;#1̅rJC.@ " ŲAaʰ$KdJZ f`peٚmD /̋`ݶ72 [!aV]r~ATeOT>* e I0>ADY'<ۏ$Z@9Lߏυ $V|)Zʏ1$qsB(]`H7Б'!9!{_\v::7Hefn4^Xn]qnwљA:Ο: ~;V:cF.zTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$ވ~"ooJAϥc^{I<Y&LTl>ɶs,9?##8$B22e4Qʶ?U\Pil9;iqeAGFmD4&]NGBtH>܏+f4]=Exy//QN<=݊2=?F'@ x3 +hR7j!GS4Bv_ }Q$ $.@t>-?>k-{gct4 @.g犂R&h0wVlFD!@L*huY!aTʇ V P&4D!b&@ydpźԅCYXify0\9>A:GB2LjL:o)h \O"n (4CtuVqw."  5BKIЭZtl/X_`æq8?>tc."  P54p ݪ cmL @7C76P]sCqyO, aH^t9^-Y>K_6G5Ӎ$s^ IU"4$.9`$i^2;IH+Ql B.шH/InZjD94gi)̚I'?6Գ)=&cy,+:%Q1@e}ҶYdY6A9 ͫb8>ֿvyb)ͪ7;hIt9ޢfY?4u;_3QKAAA#!A\8:PGgAʛY-sF/JGgA*ZGAJ ӎ )Y@$/A7PYHltD0;UDR"(@q(@q(@q\R%ZRi8.@Y ="c!Ըpi9sIHr&P+YH(ȿe&[{nyЫ{ϲZîJ?LUv$2BE)@WӞlz-֓Ys̭mϓ Pe )-a%r$hI$Y㮣rQba{MH>޳pHiS>+H$Hh6LttR0j4 *lKMWbsVD,bI4u0뱐xBM;! 7)L"$n$[ݱctK?ӲOu@Mo*$E:xN@q5v7#ΘBҤ/( Zn"d 7q|!$H:: )^0-n>!dm{y_T~05~8%k``3F=^!qK#AFU@t1 xh?t3#dNnJ;g7|D{4,FN`7- Tye-:c Pv sM~PfleRl.i5QA˺]slR86gV!&ުaVP-J VњP Gtxv@u" Py{֟ S qpA?b V؆$@ΰ-A @pcQ=|M+DY"ٺ !ҏwy@v:Ҍ )BKnBV" `Ŏ>3DWPhN׻t^lCŠi} $!I*C|u]| {?ϤHT{\$kOR/KDI I zuH&S*aYPJ Ď|`$@俪f$#fbTI/.UQJ24_EfJߪ)~;"q2Il`~TrE[XL:|U;Dȵ@m/q0<=bVC9Ū*]D/jN+Kr 76?v*"ʘ+(".@p7&F껠Jraߤ#7 /'X穷;Kj8^9w.Vmlc`)~?N|<2" лlYA]Y'HsW,d}?>;67@NDpߠX^Zt϶e( pֳgGtE6bf&e]v ^qD܏,[ypEW/z6F~3?K+6B.9t"6kz|t*R绎f8SqDE| D4I h\yr6b/@ ->]ؘ߽X*9r>b5%C|)ely ێ>h2v @X:LY@$_'g' at8JwE||VxF-sKeM\Ҵ y0*ƞ=_񲶜}BuTh‹_ΰϜjČ ІB)x2ڋtՏOb Zn=DK!!mJEЭLeX9m!pZ &G~;ky1fKr]VʙEM HUIr];P;|z]NO`HȫtL3F8( YstBc$@`iMYsYo-6L@zfE? 9P*ϕpLjG?q̈e8YA6pl 29-\,RzUTTׂz2S1O[$8s quh!ݩdߵF~h 9(@HWՋt-ڜc a;BɄ/!(N]k@q *~K:/_Av^Z?5-@ u69A_?iUz?V3+7!;^зyp9ߪђ%A_j['@.T) ] ֖ XLÐk\u,\O<}Iޏ R*X/Aja_pfK@+vuN!@Ctm@xmKCdM~!A.A4ƨfo$@L<6YqzOK5P]  ׁY(RPԝ"姆'y|nsĹ;~{.@WsoC/IT`{$$$0/V~-)PzE ͟`huc!Buqt/竁y`~`%&@*o < ]]uў6Aok!& /{3TxA?9]`_p2a'}NMt߬͠9Kq 2N KW?@ua?c\C.@^1>' e~ @?ӛ}}} i3{uQf~誰6?Ӥ]{CuE|3[¼зx1E?̂:ƆFtFFoNPBZ{ڽgƋ9Fful%o4^ M14#(?}e4|FluÇ+{!8 PO^BBOgڕ~_9=&{G/2#PeViFԆW>Rhr9W.zˠY6TfՑĈ86E)aF{n"5:恺mx)5Bp*/ +)M?ɍL&4Nm"L`5 ?B94S_y{J&7@nB#:Itmۗ ]M3l [l%бrpR\69DNhjߩ`rW.b.JDd]nۜDV-dgn^yV˃rZC%Hy^O~Hgnu*lTKݭnw2:aW7oY19kuqnU`z?$?{&@aY yD\ʉ5[Ek1]e ļ|0E` 6 7SPH4X 8 6@6q @RR9j?dJJUGyPA"sbDce0m=/:Vt0N'@̈́cP0erA[2S-|ҟ&|q:U.V]02 4n:WXDmn40;SF %A7L?+\cv )_p4"Z0U : YtF$y 4qPEDVmpsyOt-rp"Qs| w \Ek:iupL^7[:H[t+A6lHqӪ4HӯGޜP 7 j~24U=ۄNqC_y9tTD8y  ^ߪh<6}dW&4MrFtGnL/)C" weNJ-Ύc=GawS oҤvbfw9n!Wgة<wJ@S {]1Fk:QP-;t)%q:(^w gL{0sJ\MM.FDvv̿ н.ՑzalvK?_4#5 (C$!@]M0K_j>|Y$@w߾% Pk l!o*|wbTk5Fy"Lc\HQs-DFIibCItTiQBOzM"o_Yӹ?؋66zqgبƊp̐UKa[l Q#' R.E ǹYB~Jw㊲5X\\Vh1 uzb,@IZ&BIh)Eqfümlz+FC;UЌP yH;4'LȴaBrh)\|0gseri/Z5H# fTO`7,:I&@k[aWtK_ZpI̼7䇨Сj:ƨ=<:zS2F]L#SK#UuFs-4)+ ֵeV~yc Tz$\ =kp.2*&V#ODvQ]{PD ??M>]6ɭQeҺpɬy.qEܫ.;M7NXTI]nL)^4)Y/w%a/= Ow:<ϣh?ut(pu἞GںlG]`N9 .EV5l > :zexY8JLf+w5m885)BBsi^9t~p?TaJְ5o}h\-3|_=óe_RW! \07 T0\}nb bן.<G[> SjB$tsL\ru=[ -@rlk k͙MFn.pz f3XܞI\VW_MQ4~q ̡7|qЀ6)ο7E>lN.ut1E޾Vmsۘqc,k0C3YW?'D.@@G JOWJ -@?BHJ(k u1Ȅ;C`G{ޜZ7I!Ae>0[Ezp ǘW,zEӡ{ۆ H`Zs8G pQt5 TIq>1sāLжY!&%=8$9PAbA蛢v H(HO#OĆX P 'ϋ$E{o 9(@H ƛK=7X$<*C@·cOPL zc? ǵV-OinPo@#+iEw-R>`=m 6B\ рjy;F|]3_)B)x! P2$h#;Mx?Thxhٸ"]YNSo 5y7]]>3!}:O}.C[ꉳ "oVVKŭDCWgs_2gTֻ^pG HziX\r$ 9iF7%|1ş)|W*pKc7!~3lѴ2UD K1[I\阹Lk%ߘ(@ɏpbbE] #!*[fڀ3y&̏70 u26^Zf[9%&;,O%?HR .HD]+s8 ړ0'(}cn_6`=DŽYld;U0')(j]~~o rǎ w % P#au} $ Xqjy`r " jFp׬D7 '4G .̹Wԛ\ ^0_ugIKa!q!@tOeD__ann0x Vzau*a>/YL(@pS s'h3֟^FDҰR1s=PH4OiՑ0`' EJ~ā=sVLOr9xs=gcXC4=OТ} r&F|0&4ZXAG Zn3 h"9EQV/%?@)a8,QXE[ {X#1s-WVPRm!T-h /+ $Кwf:cNVZ!D[{},G 43~( P#hX؇NxŽv'nN8*tt)TN{fMN-!Qu=7]ywzF]̰98!724;:8 @&P}I(S4&{@޲j8ʏўZlLr& ſR7<~k<+=0$1 J:Ny?N$B}"nrx;Lth's;X8N$@8݊$ٮMJ#! q @$MvZ L b!!!U!Ή$^ywk'GFP1 >8]jao~YyB> 3>sug\yE2 H*c pՎP/ک!T>-QsiaikmdImhVo>`iޫbZ;Vϭs<}hO(1s\. ,! 7z`j.]r"p%O7 :;(@D[y6p=#x.'[hϜ9K9U̙6^O$)gQ6퀧sH^-"6 (@kRGGg:wn ЊY[]y؟Jrc! ѹh+((4:?ح2JCN2(~- f- еyXWi ^z|ER }EB0(toAAG·~?tnsBNӤ).cSmAA+ڥ1]-[/ E'!h0Ԟl*g!-ӶBR$iʿ:p]{]%y oӿ]$}֗7SZqC-,[gڒƢ%.9 Z^h=&tbgҍv S Ӡu!{B;u^2"Ɔ* 5i,X i?ؑ=5<˰;֏Z87dDR0v7`V&34Pߋ;L(e6P-!=2Ќy ,_w\qIK*9H>Rn#'4Dgq4DZU"=X6:4cS֣97/@;{B^\x1gFO'ua@7oD\açNU2(XUw`m(ݲmx[ e PS]]w1o|;J^5PVjW9ĕr+uO+/ߚfWVDŽ: _ڭ'[79iqr*%'; ӧ) P}!i!o ާ/ sׄ-,U .|NV MbipPD 5 >L h|Bnzx{ќ/_+BxbüME.0BBR1WL] xeq%@v$u+)%DFY?$)8M Ѝe'P]. v BKgRy Nc 4%*$Lj&`ØR ɻpm xa0-])!G8*T8{kL,HYPCU@W2[mcBI~?-d Qnu( P-`E?EMc7?ykyqpĩ9[]vqT%sU} fԴB>u/V٩.m=*Ojԥ֝Z1dڌTbݚiY&lA Jc4%w#xyV1bHۄ^])vX9YDhCU.;rw ͎ z)t֛祄0BZE(ߣ&@rvq2-SIs ?vhÛ#R@!mj|:qF:p*@D{ᒮ$}RAF/6/7 (;\L_ħ@t!/_bK PP_z AC^'`$[lDnq?dXF"Դ6 V co]m`>/piB| }-42x}&B#hU:+ZymtPocc_ G{Jj+wÃA`Vzô{4`Ca/iUbw/>pze"|"[ Tl.CbsSu9A*{|QVoG^WJWڄֆ'[.ڕtbj΂ E[luL8NJjt[@Ȼ^{{) t؅U|R]*{^6՗ٶ9P'S l SX*{ޱv4i@T\6 Vy*{m%AJfo=vŹ7-<$qtN Vi0d·Q#8"23K21;MBD~u|0[ @}×VY: $K)޲hmׯPnzG5w%s 7cufhlX }t7u2J[lQGZ8}ԬP$g:WcT>i3f]VCs(Kt[6E,Ip>ٷaᤞHѽΙ WSυǟmKTɂuJ>+-Ql5u/!h'[h`x)r Q6Wo 9WKR_n?n'o5չ`YKjبfI'w"gljǖ nU9G,tM[@VC,fqj޻nTțFf)U~ZKO# OF}yTȗ*c - 8)$(mBGŲ$R)_ ==֪=w rD¨;oĕpWq'Z%ܵ?*$$V?/oh܄nwwN^;o\v6huV?2Fae=ɺ* vӭy?;DG}AAC#\P0l ~ 0N-;dạ0#(( uߎ&_9 ;z/W Sa+o6Y.ݜuw&tvI ! yS肗KpOz 8{qVdw__A1~q{yVb|16J4_icCqMP 2{^57-#tyxm͏4KKi[Qje{jq<,hD6>Z' _qIqM+.?LeL}Ź=\3>`Y)ʇ郉(>R9OwXny= "M'@-N,bԗ]͖\ga7*)Āx1JJkAʆ08 FbNȳ*N</Qul{LL @\U(F!,hY mbI*f)hsrMj`=XЁduH7fzƦϩ`܎9r+2XIE O."Y0^l@@U_֗U?WULI&{}j&g _?"V wh)<_ Pk^N!q*@!J1ocE#(K!t>Vka*4 S9ZUZԈFPВQy!W|鯶>,ݞΖ5+&,rTY?TuQoh]*j2 c. @? :M&m|[6"Ptݢj^/ >ͥNVۀUhկQ rׁ%qRPDY @O`fr8&Q "z:Iv> Z}m"^і c.@YWu{.u]'qSXkmBۻNDžGa6/&AfPPㄌe݁TZ%6EM:UĀ$@.KW F>h Ux C [HdK(#NhݛȰ0r}Erh^!#a Ԃ0#}pyR(9>9 Gh{[|&Q4݄伫m#NJD6-Ha6!;u}OYM@E@OSZ5&@F?=4zs ^HCH;~S!%[~ANq&K s`DݷM+Ctc!z*LVrxU.L\~i6rG~RX6<]F(~n0 f5 f9ڢ"KXty5$'Af{s&6Le0&(hEMZ2t8x Z:[x*d64&61/@Y~mXl,as]8pոm03njM5ROy S*@{&O׸~(vscMO{GS&izU= %esG$ʹz^5&oC Nh&z|s"L59 >8LkF_4ܷFd !7|20 of'6JĊZ gu3nJU/2!λLmBGN+o0j5Uzee &Mkudm^%O%boAm+B#o3y\ErT~ESg#qGQE鷭tɿ8)Y>MKvr$7؄&O߾~q9̆վoλ!99ϯ1[0Uer^i -SN480Oyf<,c{OxoñĊA$u&qREfW;uax澟&JCx%GX"iY'ٌXډ/I[r=TlB QX+oQqRJMFt (R7 1w@_BAAQ;콷FOO쨨 񬧞]n=ػb BvfS6d[ o$[fg7e?;{/Y@Yz_XgOo{CG1ie2`g_eTQVm+ @VЂzsU(- su;%"ޣ~]ϑ*šc*-12b~Oqx'&9ğ5$Y7=l8;>tSﯞ/Π1^?9  9NjXZP>7mpm(sQ)& (TLHjib+h )C Ishg26QݡNL-yݐ@{hca=l=. xӱ ?xZ^e/0 Ͱp3@Gs؈Qcy5q2 Y @V-->[64 t JU('i?hA@ytI P[WIb&B3 @?ЮN[K'CFbBc~Y$YJ#c I=(B}z@ ף"{z'@ Ӈ&*I~#7 tHM+$᪌Pj32tؐEe/hA6SD}2dRN=|`ߞIoZZa?~[ {dߕzm5[,@9&#\>6ETYZES?[ݰ#^Vd\ؕ@s ?OikL75 '~IHY$1!-(8!1(n3srWB-<*s>}6/!U0OPS'AI}Y!u q! qCe0P11D j/YgPaŕ9|Yu a:ƃX%YɿKHBR5] ƋJufPmiqɡtQ,]B{]fu 0%@vw:-f?T;- dXC-0U^`X)&b?7 obtwY uY22Yq> %녛lүn< z=}֍?ʋg(J؈S(etDW Q 2@f 3H Lo2DH$T`QˠRJv%3eHd&ۃOK_ ^%66jŒ%thk I&=NBhxJ:I jlz]fNIi%[v0qޕDH$eZ 譈4{?+f7-Ѫ¥R+V3R$KI@U`b5 G8 S$KI@joy12Ïf6ohuXL?^QP݈t=͈ 1Q @goGU12꒧)FVɺ5lMP&TІk3pyHtP ^": cB?fe435j/;*h#!<; r@h;ACI\6)X>.w/&̪RNsTd$QI5m(؋ G3_tP +P(`j9|12k%|8)J84EK|e*u$Ov6u(3=i q*s@Q $Y8jbO+JTwgtzUƣ+DvmZq{u=8(ѻ~SևJY!46312D*^h.a}jL0.ڌi Q@֙ @V,Ą4.Bѱ. yE>. %?ETfm5cZ /U;U9B=j/Q5׊PGXHԩ|q%R󟽼9cRHڮU* v;ՔH/N#֘ϨڨS0%`dbMLH}$ɺH8m tjWNZ]Q.=T{S._}4}K5:j`_v WT#]\̟ @U1/Ćd ҉5%O PJj%&(4]ʀ eK`ٿVP 0ME,=S?8: QB'83'U윏Udƨ${ZfX^-殒=&tŚYWbfJj%&[:>|4ƋZ\' q A7Pxv~+*9c>. y [ ]Z+od ]x>@XZl 5X u~C<Ţm8yNq UjdĢ} Ζb*Pz 6"\ZSiP\ExZkLrN@U-1@m` @OQ^ mN1FԚ5S*~&%VfT" [w\#kL貢rҒdbKLP677V=UzP^?wOv :oED pLQ4|&4;0+dbKLPNop= }|h@Tǩ^7PemChLka4P؇^V ɽ=W8k]:-,, iHJ^dXTR1D @,ĄO1FAm&DK-HVu dV:(m#dEko~bfCǠJ  fA!*]e~%gT Z*\xSc /ȊŞLV\ہ< ~jy B\r&}5uܭVm,cb}\{)~[P\={sũ ϙ H^; ɌDUf@EOF}u`2 ޜyʧorTg4 3c/6fJ91U$ /]߉( +)94z?< @b !@[?Uwqnh $Ibb/;%_)=G)@thM,6ӂk.=7("* I?OwN3͍μ!Xq|?udfrURX-sCwHd)(xA5x4DŽN"i+#bf!JؠhW (ҫxփ$R%”f:5i7?,z(@ zl`$YJ t6:v XM~h*-y(cK_ƛԬY"D$K@#t wpqztTd (?~)54rS [orV.yth$H .zi mEWVTz._/~<6'n6VQ$K@1cK9&yrDOz mz!ѿl]솧 ZWǁ+Y!""1,*~Ϫ]< o.MqI9, &i uxr@VZ@K,ZbYMTU%Ag4֗zM3Uj+M>@5&>lV (N4lz&/'K}ym`7gZ ȞCHdq`}Ey蘑Cѿq3?#c,Zю,:1>GO.YpH~yim Z.fkLhyH<;1 @}?x5=)Eɫ8B[ll1o%ȊFTy4x=㤁jegTהCV=_mx 4:"J:- +{Nc) &$Т&$wGħCZo1DysJDW:( @VۊbLIhK@_۸Zfh"JVB"\SzN%˯W=ϫxO\1X)i3T>_h0Oƺ:0!5WF6=֜3yXcB,}ZppZa%î04: f".X} %-є[Pe{?6K7W ǻ|WNZaܠ$/*PP8ЩNv30ݶDt #T@BQRGRꣳ?6ij:hU-@σmLEgG =$Y€ @4Ƃ"p@O}5,:o @q9[:DG~nJ\QP$>Vk'L9u.X;Ѯ @U+ Z Q| xP>O~z-з9pTBwiH55BWS7m?<'J؄,M? ygE+ 4Ϟ"+M NklCĘHU+ .IVTMU-;<#T(J =4n&zq( (Ci#T$L3 \=<3ZN1"KhYBuV >B8 ^hm>>,f ?Vd5jF g @*_=f3w<U(w*9q}O>sK譜QIw!NSl2$YDJh %y\3'snXPF/{v杙=öYQl ~MoT{p鎋4CU89xMB43Q,)Cs]b=@&hP1tU@ $Z@1e*PMQ)f 莢(-T<:y1۷\04Vu, {ZX[+z -@9=WTf x"E/M$;"i(^ iN A5`i_[h]}m!=,Zb;E ̯Q4Fn'd^ ?&UR|}j;*Q݊Վ)?e=PJ_}!֔ :xo"b&S _] `婗/YfR@arjM2T,;/ŢԳ+3\w\kjx*xQhT؆iLM.Xvޏ9ϓ]j&{SLaʺ{#:58㘢 fA^Ŷ.Ԇ Ewp<rS;6E`z~KҊ@tz^@h2}ǂ^Pm=4S *a 2{L-L88mI{rE ]Ea.?kH oxD/rn81F p'**I P-^gHI@/x8H- jm@ ^޲R=?X7K)*W^.8yI^uUDzh9lvzAt#Z5\+Ű-&ʔao`+7:"iZAaPma.}RpMEi@(q|4=<@@T( Ix ۏF|PQ'B=&(7NДOI; >xq&{ȉO$?dL>o`#/k+^zK9%]LY;]Uw8׮֣=˰ o\בt!Gi&еE@MrgĖj"uzWlgơ \nxS}AKM_y^)D֞!lgRbkCW^K0 ~] =~ +a)٨3?F8jZ((^kQCXLzh[{݇OKV`0<'4miy74ǖl۷ REY6n #(UcI" GBQP+2ӎ8xax@\u9P tshK2T"*:vҭG>kZh>.d1)`yĞoX-KﵝE'|K=6E-H$8` ̋&h'2T_@aI{MHfЛ,zi&b!F#|[z=;(yy֙khP Ɲ>!3to +=Y_;+?;bڙt΂dݓ+N.AT"}C4;].yū~M\o=ů 6oҨ~^h,ߩHyɤ֡4oz"-&:47"JB}v> f%55icL@ZﳎNN}OxeN79/ A;V\5ЁBZ1ꑒU30)5]wu{&W.?w( #"ѯ؊S}$TVϟxD\6SZ2on]k =QrqzXDf1a%@/^3ٞD( 4R%UJM5 A8TS H&?~+ZL跻Ь+i+4eB Ue-&7,Y @MDgUDz}ZkQخy aj^ adWU4rܜf~rebBWQc|Y3@.[Aڭ0@h-E" @?uE*a7\:+]?fu=AJ- ʤHJDzu&BY ŌYfs/jga}ʪǞ.LXlӿED1`e_Sg TO[zvRB AW]q ΕP~~Z+u*@cjL?;sE3'2g 4|Elq-G.ljO'd>}VMR+;.^^Wwj°vU~ou(PE.#YЏǬ/7 wh7N2b£ƭUO{f3 WB8T%I9FM@oFg d M.3azhMn4?B#,Ţ/lYݟ]a;"Dh5&|euٱ} nV"nU1qĢ$Z&1: fr9+@T[Y1jkϗkO'B~.T o1T8 kxm:.X辫ߌ9CH7Q$ae U.;EK+| MBo.@CYPͣ#G/3F_tRfG& hF;k=4xw6't 8-Ε@@I9məRzO@,$s$CgܤTÙB;C 9@$2hK}" 'h;8Q&:-1yN~ ^$C,UpvyG D4\@h#ICN|2%NhJb1t  S8iu$ 6J=JՎ_V|h=lekgR@!~E}l_pzFogzvJx?{`B?K @$8mtup NrMC\SG.NiBǸ8T2 "T[:ۡ5I*ts'%6PGu% hĉ@@A|ͻd-P<H EmĴDyt_`ޫi˿I8&٭: T7s,\lŪ57n֍?S0N32 Q 8ψ )ndcG2t@$psp`P"`F'H%* q~8!Ý@dh$%: =rA•4| y ?d&:h6k!c5^dF݋92٦3yVd.1C.k,cg 64V* y~߳jg22#DjVch+ n:Cώ7j2ڝP Zѱ 604O( cЈl&{{*/nD;{h  3@U[m[l޴Qzu"1mSUKKK.3b%4;ƜWa~]3"u^tΞ1}V)baAr(V.I^mB5kEz#G{np=kW rIN"!|> @>7 D_(N]CC^HNt*Q4й  ~U1}* %o!/6UT h侂>÷Du=}͠nYn"TfYrUiVMR^'o;f$zXJOՏE:$#Ci u.drG|>z{` %JCivUEjU` q(q5b|@ i(IU & &&UFؚRFx Hb?N הYpSϫtnGMUw&x*)HJeld @1)$~5pu=+Pd#u(zȥZ Eh3w^pw?B[5_ ҧ!낛GGNM:a{v(e99,B#r7!\PX>գj3'C,V+.ل [zA`Po\_qƓ=ky,E %y+.ـb2'8B.xd/^ckL%4G2(㳁V5h4(ƒɟ_Mk)"#,B~9{Wti}⿔t$z^P?:L,.j>mS~|:R[q Gf<:_{s>[Ac}Ou>$J^u*L>[4zv&JآYQ\yT){K -)* -EMV JnĄqYfҶ) %IʴJ5mR }Rqnz2uOHe>4 Id)@ JmǫJީ̲O2 _j9[h6mH;mB(L*7نJg [GFX6՛tმNa `[3@^R7)N1+T 6yp{DmŠׅIotIdz] +-vG][@ v/(HP7N/u&Hc/?Ihxe, $ @@ >-àNnTJza¾uKha΀ A}Z2ZsvfVݬ I @8: \K}qwi8'/Aw(.B4+jFbLр3p\OW0>/C gvib۴Tt܎n81!tI< ghz&˃0p(;W(MR&/_v X挢kSv_e5YM51,{o+cV3.%G_{!S= [@u(lQ1@q/JA¯=J @ L6"'<+(fC=qzc?/ʒ0W "T\HSa9@`ߝzss=HOTg8g$%~\L?/N;uBRܴ} @JQ]ά"D耗&# '8T2ƣ`p y_f@@kT"A | !NZ%zDq 4#+pj.X4Jnr>P[KS)8="X׆Պ@{(ũ;fzt2#z#.h^@(w{ĒF ^jТ+g XiV9&:z[HR Ms>w @iQ Z6i^ dW| w'zķtHi`USqZ5ȼ%%l鼦p=:~mmoDv 8PԞXr:$jt6ZSP,|ñش"cgЌE$ u[ b>BhY] e-2#wW|h܁'x4́@;9Xqy, f:$i(#.LG+ tqza ]IfWalUU80th =:L%q`%MEF]FYJF}A%0U⸮#7nzb K5Z㬀mJ4;0*nJDqJz?#q}b[9XժE/̭|ѤŞ57ˢ~*m37ǢB\P/fLN^jj!}*J@H{a"X&27 c~^jcZ…,;=&FoQR9#3"[Өr=¯x z'@'IF82&pVx́5\%{:/Mˣ+n5U;sag*/=o70~[ntv ך-#ЖC=@ZC@P<: qԶjUí|;~ }DIC'dKEa7T#-h-o)#չ΢][ @2R?z'wS 8X7G ˾JsĄ͎l[\xS/]0O_fIWH ociDdz.,se >% 2+0 M.P3tZ,iH2N4A@1CQJzr]coG,.@r\` ڥcBOrq*1ˆ+Zz.(Vf 5h-`|DJy;wID/}q2< .XHՕLyl_>=wuNg)_]&#M~f34v}rb>qI}ޯy.l}x[H5H [~p }T1 yYcU(͍A3F/@;8|s5֠W!FQlmM;,@~@_ao@MAؚfPm%V#$_ -/3NfJ^8qNCc6x^/N& @^PokT˖";VO,}|dvYLy1&U̟_"C8u #6p/uI ;Z}>5iRwV|qO~ȡu KF%IĖ #VGJ>S'S%&;L}<٨ColyNQSOH}a$6mNF`0.5Zk[~^ ~^!w 2Cp#K%ixP6h&iM@e8wUz]@M=Mt. 0ЗBh/͇2)ڤ =eۍZqCOy_Y~C,mgW1qdKpVGjR1>~t{ѷe,V=\uRڈ; e(ͻ(MW'@G:byE|˗{.΍k?5q.؀#ũRiTMNo3yr A d7~͗yj#)%jDV [znpꆾ\ֳfVE"b.?N|$j?E5 GuGoN1-"GPߢ3~J%3qLS7(GV iW ]#@şnk^%wڥ]! *ڧMo[QNKE=bG6sޟэ=>tIVu3L,I _ͩ"]STo'jRJ~xp8Ɖj F:qLSHZ @8{$qg@HJ 48m E]Rkb僕Сl)5{bߪP/w&;UN 3-Ykk/yK/\qDd)|6CcJñܞa+Љ@|4܉/8$M+qp@$`(T$j;p;6 DA8po@h먚օܳnŽZōFQu+=p8#{̀~=sW ^ b`(Њ) j  7]w$ Gc;|=Y]3q{7EP&4K tJ95h{ܼu.>6Մb͊o}oef_Z'f Z.{>^"3 8*Ac=T&h!I~&$O #W[s˜Ќ5.IacQhUk79`Lph_3RKxWqWlY0pYX~/Z0Xp@@}v$WXK@*'){e+ժd:5#6o m?.#>$ Ork5HyRuri {oXA05/\r5sn|dIh X@lLHoC J:mRu@a!h/EG몈Ъ&(:6 ;M&„g*:\*oIqϹ ժ<'=lw+(HV*zNV c F9CJ`/vr>|qnQzAF΅zHkd&VVGaL O0UQٵy\}g_t'iԥC^؇?N=eOrl%W Gځ9@^R&{:%tq].k#!jָy$TY/=%F|-OZ >#6բ{B;E)v/8 o[nxz: gդM&Q[05fiM HA/SлPڪ a|a+nED?ߏ͚a!Jp{r{8G%2d@4.*0eiѾjevh#*ně=2@>LM[d`ؑy $_' \%::E~RE:7*.$=bSnY!3n` %J$YrV<^>+͌(®bk1"d|Yō ) %; +LwIgxз-Z^h^EPwãT kdNr)T,f@uߜ Y@h y2cO8LhXܬ&& ̚EǕhD#eժ{˛0Pj2 m#ŕQ&JbJ(nx_wOʙeJe{bΣ7:/Z_HP~s@O3<}r9mr%L6ːX(o#rĭ>lqѣ^ hg\WkS{HbpeZ/4z(p~B.AH<== #f{ ^.3,(9t)4,LP"|܎ J4kaj`%؆ E{dCrU tnK^5"(\Ҏ~>rJlhhׇ.C zd_^%س TTppY.*Zk*̪U$h;v޳t@1=VϚEb>Qd?uEQ:Bv j l2h@gY;_u'__Bf(0ww=6Ws Pm`Ű.?vb>m !cYVM0+cM3J&Xەby.4e9H/,|`iVl7!BR@Hk)䚉5yNPP} r];#" *ZMx'B~? ;1aS\]<+ Љ+Ч$rƱMe Č.`[DefIw3 ZBFz9FV+F:>`U9yRՅb"mmp&db%O؜K@ *4@)P!Fkf4jb?RP >yB xk2@)HP$7 u w}qu(&BH gOB/!-딚),Kb*! 8[hX|{^0Wgm@9 ۱=kc H/RPb#31,pmQ-7Zp_рy?U9KMWcV(AEB@HBtM3" ffi0r.W.'qI"ۭUW4㱋J4{8;- q?.N(0J@dI@ۤFBf2@' SN cB}_8|7/)4[i*;Z4Q2\ųl^x4=pʘ}-1>8Yҟ}+k#΄&S מVhyc=΍+XSC޿%,0P[Z:S*[`AITH*97ݯs(&/rRG-HK2ЦzaBTxrF||.,M0 LaNENԃFqwz)TJDHVTmYiIW*C%AwvJ;H1{ta5&VI1ǰ H$-dŻ(c#)}CwIM.hA#=iւ3jE?ꬒ+_)f`eqØx֬]=m(VW'4_z:[ o< TTGֵGlt/Tۺ#+(@lpiX kgii&!\3碜m脹@=X"[Is55hr0)/aOkkN+4L^pY5Cʖ+C;|;iTw p1I?E2k6d-`S}sOo}1Ġ R5ŗw.0E9W_{Itv8yzSG!(ؒC2B)oHna%Ʃǜqvy~*K̥sĈbE60y^aTmATg=>wl&7DGRTEހMꭁ|}sى:Łj|t7O|}X {rTZpc @+=Db ]bD @H[oM8 ~ n[W$`vR5C)@aa~l[&Ƥ"L聻ӯaa3@Т6's:qBBu!!v>?C@ h g~(q}2:RdCMo&J Z ?*y:F S$qAz2ZOY'`'з.C&%П߄" ΎO_}#* KVucfS@emQ;F=a!,-J^].cf6IkZ@ߺ "~p}~"IQܶ][3==Ĩ`z`Q# 5 @GڣV6%E4-z$LzJP'J.|awc~' 7Iн#<`9~T@qN4 |3aG>LC^+_b](nՠOjh24?pvP\otc0OiX2 :@ {H(ɘQAITqOY^8L΂ix ׶3e8qݫ[q.rc}}ρX${4wcU7eky}/Sv{Zͷmv/GO1ںٮ53?]ˠX\6%kCnөtV\ת}K+7 ny#zVa)vUeI6^0ѬBEnM FF־^uoEF<&,ׄl)5GuԩxBMY@BO7c"ƝNZTRI|-?=+&,%}{"5bgf5Ȥ'9Jwɓ,~M7N{=*8ҧ:"Ez1[cy%ڸO#6夳A5 d^0#iS໡yh1 fweGPb@o@D}`cʣe2DF<ӦŰ$,@o@ay&lY,|}&tcNJv9"sǟ-8B? Ș1@3O9L_rIt)|x+{Nh/M z@ů泼tqY'VrriFQb_\})Ni:4iTѷ#dGǥ-sLضPo[A,oMfiqxKU{lvm$3fn{l6RݮPxfVJVf'J5kf5y>[_=ܮ}y#-Ǭ 9-sh|`X+C{U rG¡_*CU*Ibg(Ȥ> |d2±YV OTq}-o@ˊ@/k` p"!}qM+׭S͓@Wz e(J薒p#>DZlYH@S`lfY6E3(;΋,FX$aҒTs''|PxMz,}_$RuU0@dEl6TazTfkcpQtvSЬo@l-kR-49G/6/&G4%Iz? ͘ @z1-bmbaV哟9Qhǜ86UPw*-yJ0ld@М.;bL 0lل F-unXCȺ(|0Lo Zûf0!V"*&12ak&֢GuM]4]P\g|}z P${ 🦚(~-VH0ŻJ~/d(XƁ%DR_"A(_fXr;0 B1 !6q%gכm ihזDQM,b"eejBdA ;9U/(7pD'?J@E;A\?њ]?@8{`4+Fm+b!V H6;ubFc0}E@j#quzȸ]zLY9^z=c R씏,G+ҎRCM3m @aQϻ@άbc=\%Ϫȍ[a?.FeVl?@aB}ACrDg wG؀.hd]tu@ KfӪC^4cvyRu9w*r@@۲9E;#n==,Y{B29tQ,i=i[$Kse2-9y] Bcʦc!y3ƫOԊ X aRF<&]VT ?qa(y<4 ?yBpQ$(㈪t5X k,4QߍOGBI9lS+gH BN|KԽa5i_Bo|Z۷ 2 Xlv]F^Up.'GF`{E:bg#p] žbMX3~6\H]u $34y*66ҹ7}q6,a +~U'?u#p U^0零̴sY&m2@'q~1{ 7ާ{Vα'F<.(b#k7(3JvY2Axćuh5xKMqN08by ^mLc-F0|ңʐu^HvV|.ϟgbRT3>nT+p}s͗b6؟fT65S<}060{kV* 䡄  ?Rʉ'e-scA{qC}h07j\@XZ} I&yECס9w)NԵ#S 7"G[ຽ'֐PC*0GO`3⻃}—4AuxȕPJ@ǒ׎2)ik3_nF_ J'pX,OW~5kJ=u1ta`FVl `a:mn!qm/ؖҴ' wbu^^a P^ eCe@ XJ"Ip%s.i&Kk=cRMOI VSF<]XOus?4*k9-Hv?)snW ^#:Ί 0M,ng >Jq}J@- W.fK+UY-Qlh wh#07 hLeɈ/@\f-*L4 ,P.?9]^lih d]@v JpxkϯcwMc3u6‹(65 fz$ֽ"m'esqeaC^ø~%!,Ms@~ǯDGUdta'zB a(d3$,v&#$!l,tzu=)+B[uÞ? +_%0Fauhz,n_XA^sު̾[dwh[Vldi]oX}ᄒHGl7?+ٕzO߈YkM3Uιu.YC`){g~Ÿ ekt_^Ć4gBN{[ۡDŏ\ӼEɈ[Ⲙ88,& .!""=3$"Ɨ"#"RڍQcSJy e6v{;9ӻuwP.P5LGs@*mL5;<.JCLf@+kjyiqY M}; mQˮAi3r-2G@\eS=i D$d8 @f(= Y2@[ߑ.Lj.cr@.N\}qiݧgu" '}$k-}1[A?DzW;Xy%ޘ4ꤚ]k6NL??D̳yd8̚nٹ-^#lB %䂬l+[~#qm~ f<*} s`>sd,7!cUU1f~Az{u#?ӺNJĽ~2J/DyGz):趒mnT@: ݶMW#C[u'd>P[&w-'&MVV &X[Zex6eBz˛en`g5-"V /Z>$;okL2G@\hB; 0}k{YaiY\2W LfAo1Ce[+B/XRcB;;. 95|BWoHvhwT™SC$_#N=lC5!Ƣ"Yk`C0oȽ U-ɓ\N-oI @jB+-jT1ėr}O9H JWu[{588SZOesZ2?H?L,, D|SNC%fKNtEuhZ.) 8㺚`Ә`O*Fjܭy1]aPS.z&A'iJF7|E<8=B ]hI01b3n57y7Sfm(M,A]xS,, .3tStshwlj4,WEJ ",M8 '4!> @(01싏|Y)"&$1nh Ƨ,!@{ \$hbi$x| _ ]h&w 1Ӵ4hEI=z9w N@[UlbgΜ|bLY9/3#dT""}p]b,v$a(34b2d6_rky0h99Hb JaY9H ]h"]/IĐ(fǺ(H4Jڙ}!hsSz 0z$ད F\j~;gb=0o-:˭@YFehi4 AJSn]pEE{ Niߊ ʀnT&V W@dpW~m4Q#[S*g5{*mXq m6&  C@ںAa%yi,qF+҆׾c\3 {$-WSRSk! =mtI }+,y `u@.Է`zCv&@b0^WHYl0zIB6ꖦسm:,",=/@@?1ǚ P*Ч1* S|}f@j[8Px?3.{~Uu &+u7i6%Cn,\kE`/FySM 68i25e\aH MO/EɘPv*3z 0}X%~9)YC67hK^,e?Zg^;͘EW!ϼDxnc"V=D| {Km,ӆ53fJ(iju*fA(y჻{`E.]p4d l>B~!!>3]D:E|(E(?,!!Z c8!AVc"YEWV Ր|xe(42 8Tv .TU0-6#p"`\~ ̗qGјADuhШd [ z$0o3Mg]q]-֏- Չ=<)&t1=g_ezz@ؔS ̼HhLqPA|99j`FR3z+u.(Lm jߍ$ոs]s]}=XKzu]A|tm_7鄒6ɮiǥO5JrƣξtvU ag"k8T=W A(y,VCrZ '}sۭ^.wv+Ux3穗69`՟-ha\~,bh5곖>: S6L:ToQ>2YCX6,}<(|+ZDۉ89Y™".27h#?+ -e2Zv]Ͳ$AY7OZ<?kkDz0&Ԁ\Dˢ;.v^6d.>UȈb.נK6@_4taS@daOa"ª-/+o.[JV' z/hy_&)W ̚vS]ݥUw!ԔlcÓމyz1UԙK0;ŭ#ג8$\sO}0ǓET߼w /7cw˔xK0**iSAB Htth)c8h#1b/' ֺ!{ [?xA, Je!i~Cq] +tEB҅!r/P7H(5\a6]6$I3Ty'T;a~^E @3X{N:Gw7-gqGD +Y/Xl E2 -W¡)5fSURN8 rnPD@DrL;zMSJ ӗ/x\ ŧ@N. PJtqYX4$! ߤ)P6[Ѓ@ v970e VK(@81qgz;]}4󡾻ԅ&OuXCa$s(q":^wlmqZ*&}Q`#MXrbCIVe @#ά3Qq<7Lq?kre8ˆ Z$<]?!YiV1b슶z ܙ(6 ݅@OIg}Ӫo#X kЍPt}n 6ֽ4G.iAk4]a8c!+Z3O(D6OoȤ!դ1s5n?[j5k'ϱGaf3R5 8"7fcժ8\W68c^PlZKvR;?9؇sG ~wE p ” @Bj8 5@'QIuK8I4.@\Z]{ r؛F -ds[yuna]ch$V RJ7U\~a+H3D=žrUbl; ,?XJY@G؎Xd'LyfPou8uiy0iIe(ea@ʙ~8  h^?Jf4`@\5=Wy .q(CY]tcmL;p$_t.P*P۱1w"Ɖޢ+YWŹ\IU5kS{}A u5,l=ArQTzH.#% qJ Ӆw6w6}"3ƺn ^=P 4U0Gڃ7ϲyᯊ,($??l<;HY^#Bsc͐K#(Q*ϷjM-,pw8E~ D}'%}ZP$eur OR)jF&ޱ/V$|*TEbzQla u #tF<>q#qTO^1)ag(5h{>FYK70s~#kdEV̅E B4SU/:.PH+Bl8,%hpk_0S+~Cj]#ȝ|iZ\,}g:#v(Jp'ܳ>8Wvkѫ ,!U;'Ǻyhǚ5O dž\yA$ s, }d4~Bnr~be3Zйr:2n<3#6K_ %EtIMoeʛ1`w#",pfgY9?-!Ay+<^++)$Iс׵C|Kq(qg^ɜ^xjOї(~dO곐vIxL弤Ilpxћƕ8C-}!fKtuB`Y;z)B#R60l5 d"q8Pm9ZS|Գf} ԡ8`5 Ҵ^ڗ8Z}Ŝ{lqFYAK_6 3d)qއ\u&tqTĈ ?2t%P0K.Wx2vKRf%d\~BA^@Byt?xߠeb۱q7|J3bgh݃X+N|СĽw;:ьc챆3{O¦AuAu^._MgzÚ^ ^S(8ׄ)ryMljcC]_1#ta|h~ڀ"n:pQ{q.&  ?AA !s/+UYA&ۄFv \&,/_E&iS$Wsrأ;*\o4Ԓޡ@˕-oRoF4s*(Y ѴR-ImΞV͠=UB,5'U5(YZ"{W R2qVm'4"P8ر+Re.[t?~ -4ŀFҎKǔlHQ@\Tct/ ϕuU<1J_[Y>ʆXh"g@ɫ`c씐W}hi':_X1Z/Y?Yh C  v?ƺPԍM2w8[[+cP]9'8 D\NՊ@+c)P]6^~q% ed8GKcft\GG砗؆FIqG!P?L~iqq e.w%Si5[&#ƥQ83 JG35Љ1gd.'Jo"alv։ 4Ľ&C!PЙʃGe!Divh2 @O= \rnx āTn$.̯LރP:?P@@3 Fy+ 2S۵8X7<P]G(1="S.`5qqD<*` yL,D}֒3sXo@ uia)'z XzܭZ-̽ò@w!7kj⃑e`IjL]8ylK8M,(cu \e@Pf -x9BUrkQR 0QPUP3k5GH.Dnf 'b~eQ XwI5?vxC@Ob`y?16-Β$:&\Od"J ƑXOaHZxEݰjT>8^DhMTT5L$qa*F+(m2Hޢ 涀>PFqooO f-i"S$95q/4PԊ.p:0PEHD.T\0\7ls>QQښC1B9z)$:*>A(ۘmx%{h*V F8M׵Xii= JԊ%r*pu w+8PBNf'3#qZxZرQbo>։Aek:{`-n8L>4u17$eJ'=(xB![ղ)6ܻW/[Qf0In p(\e}K+M3P& d|.vGx]̡J}$(%ejwmZ5;fp{"_>P[;BgB/&ҚWcؽ1>99ŋ~q&N=U#NRx_tNEGi 邸RB~)E"q—/\ P4܀/YqqqS%k@/?ͻ|g3 /$...Sl3J(+ T@\\a^/wr!-Y{͍$ԾlG&wvWBq[ȒV /r~|ia1t%=DG_q´ 9%]nC- &+G{Gެ}!kmF;}%kK?; ^4,˯eRn{HW qrlHV"dlk7lEy`}+;ُ 'CIө h_hr-kmKKX#[Bc̹%gKz_"䘬*8;;mZ.TjOeʞ9bQy:l dOp& E *qfV@Q[2OFC۩FYޥsp/#,*#:IX_OJ&ۙ<! IHUFrE# 6D>xB6Bն䑋#Rt9QXKzbD蟟.^1ݲi$mXpj$Q` ]/ZZM9sħa*^<$d|Y]A,R^=[_gN Dc^^tV$A#mIٹ gJMx+d,]!6 喽IDg {Fpm=>:TGIr`dzDXh!]΁ᄨybUY͉tX".'2) lHDzyc*MR'݆[o,NK hLĔmВpqqeZ?hgْ C*3 X"/#nZ:N}\;<7ۡ)AaB&QNV~] & ]/6w; #e` @%xBPcئK5]&@\\èV$ ,ERꠠ ,#lbHT΂Aݠ+Й.zcp5c$Նh31%oDsΖ<f7;0L\}68vDO@\\b}QkbFoCy = @V#H@+sJk;<' w8Bm~!)X9_}2; l0XpS:+ct5nk0_a|+19Ӛ*X1`ֱQRQ,*wZm9(l_zak6a&R)h#4—YI]H06 @\\#>kkQ6uia,3 EԺ:)ڰ l4AuݎE-ѱ?!OBIs`~hyG"H9Ph_9\خ&.]$LVeH yPsF;q*ůp1@ZV VN"P^(ɖ2zxpto?֘;HN|G'!PjQ_rŵ <41\rYF cm'kBOR/5:MDP5&Mնva.Ig[͞Ozd+Xg`B:X|d_U;V;: E|TvᲃGBܭ~>Nmc=Le%*;g=s;WLŕI:&L8v;H %M=w=Hc?'|zpDս'*.{'o_QcT7O~HD31ɲ];黏9w܃sqqqM>NqqqqYHA6@K_RnQ=Upqqqqqqqqqqqqqqqqqqqq͈G2O/#""%}"'(f=h"/  duo{H6bw*0F溷;Z Ls\\\"o6RnQ*D&DA#]`U]|:+=t~-.a".iBt8*W:@\\\&u䞁\˷:LC.W+J.?!\N+Z 荁ѿ#}IȆ~J.GY!4<^ԧj/N 5!&gKؐodЭ}[/Giਃ,@~>A/i|=9;=pz{7kxIOqx<12b!=&W5?v yJC L3˸Q.?kS_pqg4_8T68.r7vr lz%+dPIV &5[TVz >2-殳|~iO[8L8uQISɧ߼0|M [ oϣPB'7M @qփVCH0l1-:CwUcø h>6%/9:B}N' #3>Uf: lV0iS%OE )VHHo+wڃ 'xo\uUxΞluCgzvιv!nPE@vث`Ôv6~Vfr;E^X*9-}~A-%to|d amK2x,ĨgM%V8Z<H 1U,0) o"(1Q,jR{^o8/]fWu+f MaGt^"%a7NS8M$UKiRl7!6`ĿBtdo]1e<24%s$'5.p9ÜlsaC.>hh _T,m(B&6>Y~0݆ԇ} @6T %2!>#*c=SmJAaZF4c1݉XA/6_2B4 i9fX±Bʥy*ҝx~I!#Z |R3`=h϶W >Љ S 4mqI @۵!i띃L` N5l$?\fo)wc @`Z6#X\&e>#ITW j<{Rq}s ĬzqGl5ПЊe(t]mٛ.kRalKvx,pI-׏d5M ڰv#A \SُsaXj .?sqqMH ,H!Ok3NYtyLf-]T+G<7NYxf@DŽ[Xj )ݜE`^XqI-7 fBt#{v0a@8Z@+K+":) [sf\ 0"J.JWSr`/"q_;ĶR֋ VplǗ`yFRFDCYJklcy:Tųht͚5+G8:{GY""^ȃv dJ8gvp.b \r,# IY0>~ E|ns-BI$Q* ;c&߁64Z<K9 KZKK<Ǩ5EDoS.S`5P y(?Di*v|l[ {~N ʎF?8V@{lXQ+zze7j!c#uwwvNDG|B>uM^nZQl yK3-D t}>ױt?j1< eRgKAge+޵k]bi3.3l*#%Sؗ"tp/([Ѫ 1VB-|;a\A* 傼Aߜ,Q?wlAww*Sbp9sC3Ǯfu 8Ln둴23 k[$w(W: $ѱn^aJZ?= s;fqցR<)xk,։d&ŸɧӝSI&Gk> ?L?SI…ɓT7A (" TFIWyÓE!.Gfp5;GF';b(U#\\\\],}\\\YqqqqYH=-}\\\I(ReIݷh_ݖ8"fz\ Wu: `DWnΞD\ː2O>`chz\ WuuzK9VMw4`C:+5NbX]Y:"9 82d0miq"&s\\\&R"4&y @=gwKWHų@^B$T1фĬo1N$ Ar9:5N._>ݛs: ό鯉qrzaKszG7=C& Ų{M£[te }јQn+ͯ dBP#k;Ė/D3jLs6 P ͩyfou,4/4WZ!+AD @ DëSS"bl++bGP Я+),*?@ m'54X$eRk!19Pk%' - (}w(0;Mb[n U|1FCR0jU .E C_\؂Ff$1b~*k}Ǹ@3Fgj kpW0VO|Ls؆}Ǡ:QhU_͍@bX#\ۛņEۑuՙ0 lҔ5`<ԥ,}h͓||Ʉq3Mp-~,=S1ShQޱXo77~͂^ @`%}E* c\\\U @D*Z謥y&(Uo|}*>f%:0hQ1[@֤)Kk$S+VB}ImϲVz\pTK8 s, V &T6m5K΁ <w 2=cq, 45[ 4R2cZϼGE:Z.zx˜}{JZ h#C@Oyt2kSB\ a.-.(wDT< hf<D?7a/KH^l@$gO@kE3v{XJ1h  uLl$9PaRS1j2Qg)~b)(D~ٜ@ӠĢ/3Ě`$v0RYrqq}WI"rZM$it-v҈z膬IK"EgѕpP\A3WE9 E+~Ś(LZϑtj~zb,=4/b=Zi6\F|Xgq#K16T\XI>שzqqq}%WO0!e y:M(_{om2' G$IRusD2Hbg'aru tqx1JR\>N*IrCE@CUibAh)9>8U|!" ǡ]kP+0<͢*)IUhTCP,gnr0)fC2VRtvҾZMyY$j`rpqq}_`kuq~E|kcV!, W9ܪNLphYתyOrZ3p`vUPLXn7ALS8 Q$ꂩgAƘ3{u|UR;_B1$n_ϿB E_Wt"`#N-%yg?*qqq[ڄA& 7  e~taT=hKHx`*F/i*M<6획 ЉM=k:O G2d[E=g.meL``p.n Ide]0 `Rc+`I\8Oc.Q\YŘ&"F%b1Gy@䨑6ڰ7&Xu(!\\\?R-DZ?mwqe@=U @qZ^tPG<{H98@^j=B=v 8>-yZ};0>'h<PdWc2*.},S*%`b68d <ը Ǐ$cJ  4X/[z\`q _JzWI 'a^ci P4.Ln ?"{jWF2x @sw@c(ns@q@7]hEȪ+)\ѤP+qJ'7yC:}qha(I ?#胻@6/=rL;fQߛH 3Kgz; qqq0}1-ALTQ%0z.DLQJTU $nJQ-~z $dTI:ObgX{ e(bDTM"$vP%BKqZ%D$qC-* 1fHB{J&dHJٟ$TE`X,(L g4^Vԭ#]3~:FX j9i-I$@Jθj!vd N{ؾ]ݪx:n:NlS٪=һW&zim_RR}[\i.................Mק !88B, >du0s߲;ׯaލ4KR ][mqA`޼x Ux.kK+>6L֝O;yYmWs =뚾]F߹\\\\C-zxaK:>rlBCO)Ƣ\H ~^4 g8]Vy? i]a\hKR>.TPIN4BTiQ~|vz 5oPA(~Q7>Н%!~A pٲS2e hXaPYe?U܁O)P(njUE.P(}+)) VTw@ ?oa)3ު0%䯆u<8AR-Eva"{da ]mUw6} ]JΎe+~OgC]]x]=GzȊn~WM=}{E0-`=V@{9 螧.F^("٥TQf&ُ&/txQBD%-h!坠PPM^: @neFU4Em:#VhgB*-}tl1*!\[ӕʫ1h>4s|D \f\@`@Ɔ_ XCW(-Je$C._-Ӻ~& 'dvPtỲŠ)C6ҵ2j„s } 䥲,9U7R{D#8|Dͯ1"8ax&V++ ^2 Y(2Nh oa\cvphͮ]3^=S !^j++;nzvp;l 5ڵR 4DEB7\hrx'̃07_:Ϣd Ԡ3D@H[" F{"BX0ʏv=˜uH'₻4/wV Fje[$&eugyDczK_>0ӌ @U) 8J ֘V֟`,Kk85 Fv8 Nao xlLgMQ@ )ALd u7cddSbt0nN,ܰEǜ"oc'>,YͲp {=$d0"X,2%b ׯ+ 2jnY8^2TLd{(XՉ@kAVwIf)ሀRC "6ʠFѝrMܬpe_.7cb^pB!V²pP/6YFi+Ԗm,p~>+=i=;ԁɸ\uxCh@?n@~vH_={ j| Xz`㜝Gh5璬9[0W11EG`r)^5:! )S:Q0/K:yfZQ3"QjXJɖhrTZަM 9Zle){<\aJt-TOGI"xÌu+l7WƏHtf+'%EU(>!f8Vp֐hz!> >g ҩH*==({JPMmJR+i[P\h +A/4e'#\\L3E$8gK:Y}7-HI J&,V`;Pzwكti?:M pNR̍}>UXOdgXLcC5~Cl9! fq.Y=e:}M(JP,/ k @IwD"ݣc%UL" !sfl qU%xNڞsJep ( S)D:\6qv{2feJMl3 (@[Nة8H}D_b3םf'Խ%c i{bH[X/W!!t\2u:뙼/TP-PP?swd8 8<L[&B8XwP0z * v_ox$ EjZbIplX !I3WؠͻP\8} %Z練3zE>3*q6`\{淲*2V8Տm,׿B._B<^bεf%&d,ݕ06mhXj7|A /^[՝kXyIo&+NJ>wsoh\Wnu7%9sy;][1ꆸvXgIW 3BpV._Hz^|YxS%]fMFolt$%H6?I?$z~F(\\\*RSTpp&!T$Dpt],iMppf¤ ^+[GeUe +"yAF !=@Ma !-It$('{=#눱;2TH͞0SϦОNGb<t?0 㛗fi˛z/4l =82=ާٚ)~e`K(j @u-k ކ^bX/h{i'W< 3f Y<g  K' 5S2%/94]llЩ+b!ɿΈgQbCНj(D20}OtK ծ^5:+nJ @{ht[""T(0^dߊMB,t+!y( bz,^87 =yIx5oBѓ~Q(b=4\)rC+B8GѦ'ؼELYp8G*#>3 V(heBKhG7]޽Bdn+M}V"WEt л!J<~&?[md](,KΤYՊCM?F'P*y-Vb6Wm<- KzAyגZ }$%] p rB ߂w~BhLűM0sMe4G'i,?Z\ KeqTbcN~#z˖OheTE>z8_t}U'W|G3]#2mN̵bL:iJuZY.V5u0YZ<hHBȺhHe=?#4(T*U)}8۸~ ~~4wS^uvUT꭛J%̸zD*RoKm/B,G}ey]cr&bɏ5آywfڔ%dhP-r̔^Բ~J.Ar}n _se@0Pmq1a.:Mt΍U0gEc4MAMP>P1@d- _lN N˘cuc, X %"W( 4>it/ H|MCKaf f2 kG@ϝ`o@wU"nաkXV\,tN #tm_zrB%Xᶩ"~*oP`8!ڔen`@Eܬ4yP1ciXP1P<ԫֱ Iz `1g74al8įh64]A $9)hk@aG^n<`5q>\5b[m -'2$w`=CW#0D,E!X`V'(&;rWhXHhH"l0jCN!fX ؚ .$ %!KfPj`M£ JTP *"wI.ޢMdK|_9(,W) xKu?;{ş>`^م_όa]Gjv onfw[ g٬<Ԇw.@J&W0ORQ[9?9kcc-J/V['e H*]{Nb@L jueR/Ďڸ학~*hKEQtHw8!;]X[չ`΃9v]L/œÜX5ͯA[ S)Dq:QzzZ$^;J3m .v2uBck@[vO"8);H@`C%6zs~k(IKp}YcǙ0S~䲐B;V("\";-F$U1S6e !8KNO!kj>Bl2|&3Ns>/*=]Up04 W͉m~0 !loWWԅr+7% p5[yƃt"mt|ݺڭoppKJ m.-~p^C=`aB8pc1uGPX mx/ ~H݄[<~]mME[]7YƓ_xN$mjO< (†~e83uz=5 M>;!. yLw55-B4cݯɭ!${o٭K~2!y8YHFG;q˜ Ypȏ4$Hr,ÖtłgͶe/d,9<.K)'Ir14D4xwMwϦ?M8!V _f:$*G[u)7wpqqqqqqqqqqqqqqqqqqq ʄ1-K~ӛDh/3N+ټ?8xU3[|"TdkpSeUw(wzq2у=ƃe4-9/]὾ \?fLHJ]|JGˀ WM?!1˂,Z2tRշqڈz4qi[0(wRw_~M+wkwYKvUجdbHW|r5A a烼ᶾ Եw3ʴfLH[5 ,̧^ipit{RBvDnzg B3CXE.M' ?lnszI+~ zCQeI omf7wzש5@@@Ѓ}xjKzg!>DQcTEwEc“RG,9-0Z%@)"R6JW h@@tO "FmTC׿GL@Dri LÏ],lf \ D #zWI8}a G.ʢ1 _'2(~6>2@`~sRD4~6qwʤ1a:R(ήP(ZBr9P$voRm6%[6h+(xg%O?;6Ԃ,+k4JXjH Ӵ.5 1yn .]?RG }R2vĒ ]'5R+ A=bГ>~]˹W.+ P:|!qioo9-wiu EoK8k{iv>iKT ) r} };+l;mEٯYbUG}P`*. R"a3`լ`?Cі@*y5YŮUYP%ۿn^<ةsfasc"߾Xcb&kYcϾ.dZSȏgOWmcl+ɫLBjk3-j5?P.Qiw歷:L3uG {֛)j"nNXjyԝMP(fD)[z8\ƽRL&({@#q+! aFɑmͺvr^iT*_飕 ]s;[.۟fR[;Z: km8*X58/fDޔɹ:1Y@1ԧGkarZ)se:?([Y(bNXYf*nPQ}dN gHH霫nm|ξ[vIw񪎰~̃)7cQY>R6BSC@H 0luøs~XVeJ F*]-h3LYP*5Qo;YnEl4LP*/ǎue^| \iR pUiv]-dTDԮCC9 wС3M:ݠWrIAIn+zzb\|þKy핲߅{3Gqz~#X({+Ƅ&Xfw5/zH75N[voⵊn?I"x9M0cCr1@,M'6V"fzP:b,N!ud%Y㉔^J',qg+hmn]QKS沫Rl! HoiY(ٔM,|%`X|׹.=M0DbX1GB*.b;b,&ء\_Bh&EQtz(%lZ|K}s2Ii`L1NyN[h'0BG!$Sk6<`c/\lS&X]G)*R՘ع=8w> }{|􂘙<73_@?D6&L ql鵱ޝ\/5X4s-dz bp 01q@,}G9^kGu!cl@>R)_SSnhVDCI״)ue/"1D>3GEIrf3YœJADY=^]=/dLgiES Zt3aP&T =c7l!΄1X?nr Ԧ;u?8&;I '`#~}0-^&|N}@OڸT:>OeCuYtJd^icAqKj_t>.}A<⢔XLл -m Q]R>@KJ<{:=rYe3i`M2]5oig:gm BV9: NDs@6J>S͞ @gY]?BSl$^J Pn5`gz̕QkCH| 7c="?h4@ G>>N=|fP~cB23@o=`ͅh;e[: AJ@7.>4H@_v*0+\ DFLO ORIPt/aLhp")%l ?8isO`<)`}@Kt R6ƎX oamkHFI,º$}ls-hoc*_R`8ʴ1~}(ngO=(ȶ?d+?i=gk'd bHF5a{U:וG,)wbC]f@S+9=L(La$;cϭ&A$>\,Ѷ5ZS^\h@ Fػ( ,EغdY6PoELd>>]%_ W @/ɕed=9K  f2mL@ =%df }G!'FF[jӮHڰkΠSY@sNkHY|Ιsc5 @(_⚫s܉iDLAز^q6c_j$z#X1GVSu{wv^VuPRI3O렖q(X`mE]M@kچOHܢ#;*Ƅh('7GJhctM.<ɫ ^-라5NVBE^ ~sx^IS&P[VzI#gCM,l \<6}@p#}?w?p{Au0>p;V~h!f+cW;km@SkAN9/RB?ja2Vh&>8^͈bΩ} i8XS{g3؝3(jWw S&l;.zB ްGоrWm&\gX[3y:Ƕu5Y'49j+O<4 IbV #o9,L./I^"K3ve0ScYq_h; b4ie7Jn}9?Q4yl:[z)šfqU\gPo2}C\^3zB<  a)rn&^ `Q]߼"thPsM!65{[)ԆjF=zqp*T?ysLG.o%]+FWB W=K&{qb;\ߤLX¾d:3{ŖW=U4+Ɗ!>oaV|t{M`u\U\вPwUg_;yD\\?hLU83}NZe3 z tŻ}"(@s,5q Bg @aEVsqʢ1?VwPV,㴆 U3S d"9.HY4&G_F4&$a‚&{/Y0TbJMz1|\bdJ%Ev1>.>/S~E 2ϣxB^+|BĜ?5Q(-XGru gE$MsF"ޓV^llG٬`L-ҕZwBN^5%% u8  yַw st5M-轲b# ~Ebu:ls(JQ>_WziB)+'֗C'>b:ʖ0԰웟(}[!PM} 9 4Ҏ;aQt'DK M bu{6PHrq|Ӗ2зچ}E~. ;x>,.^M@_at!ÜI|#Oϖ͆#dsY9UбOO,:W,Tb:,( @%!,Y(8#)`^M\ռYխ.K\ û,r3L2Ao9~e֘p:G绛lYɰ7ǚzܬQ6EKIR #_"@Q&Qo嫢_Bu@k'ӶhBO@O@;$A^^̒ g3]*=3Iz4W ,;^9Zn 2V*Miƶ6z@ř_X='DMvP>#ր-Kab`2}) ƄO\V-?ܠxMpA-U0LYA8"KritY2jg %(ܧn>e1ófܱd脚 T!!5pOt;J4PW{|x:"F֐X@PuM +Xl]Y->)sӫ|c_yWbL :>ARs٥T`ɔz &Ja/ i|'Cn)kQ9(3- 8\lXc!#9; ;;K`7 Vd<ͤy2MN@LFzܖjs`%XF׉5M?-nJ  b7xxlBS.UbLHDž+Su h ;C@@#W irEv` @>1I4PםP@Q9٨@ ]D[G=&JP6sUjO9ȩYO*m->9[_@TguL~Ze֘.v''֧7$˻Js#.{OgNB)O0̚u/[hDn,IO)~UGI˵L kV^N ̢@3`b$s;3pĚI @F+A!=RFP1{27Vɭr @1m}J.^5&lF'A׷{\s ƥ"\uGZa>$L5ĢU6ͿcZ:E4ReSha2t@ƴ/p'. \L@91SDv ?.JM28W|$AQ ]~ ^ 65O(M$)t9z^O~Zeژ7R>9Vsy_H c^Gmi@{I;]`Wx$ma;|E|n0ڗwq'dy%Tk[v݋yvC/Uz<lzP r.̀@?\ V+`խ'N!z'Bu#3QUlmS%@ѿIa5egBqz}^栱icB6ܽ7ے= Y6e򨕻yq3OaKb沗emwQ..K-e{9c+f;>ЖiusAQc 1t*_;47gv:xƙ4>~UK k1w(ޘď8˲3(U[Xk lLbV}p%ƻ{ G>u.`-tR{"[`$aRk*E8 gBZHYemszs*;f&V//Uf%ILx X_4!mRl%ý4vzl@l>z\\x?FVj- IJ(iihF6GFXOr{I>{q0/GV;v' Log+lhaUĺܙSC9& ]u0~87|mSVUf+c%T&DC\\\\\\\\\\\\\\\\\\\'tX_>8T:J% cHǃݰ$8@}.ybrs^U].]m r,@V^aF+ndwZAw o*/`^ݯ͙$G({mhwv-,P)Do:(te݆[@RD}J , Ae @Vf R<^ &F @$3_ќRx@oF6))7.v}P(Fj Eja՗|'ntC+0TԺ/hwlsY')`9lxvF'В~Ƿ<ބt7q5-ySx¨5dl_dl佫mW@YOY&h4 WvN>'-r^e#1D'# :(9# @̯]`#V;@s( } ܞ ֆmv3 Wwg,lf%5^6!S*~ucZ4#dIcت9D&XOUpS&!t+&_nXIZ1DLr0T3f؟j˴bVlt1%o, I0V?2 ir9 u9Tnp} __*c$CPovEc*a l} mh=z.[!!AI@8ޗ& X@Q0HZ,&`dPas؁1X@)Ȏ>gŘ*#D#r;ф^x+S)4+Δb!=S|ԮTsAaU],5|pqn(8à)[@LܲWl6{<z6+m@A3}`>5a,|QPN@c-4#zK]ЬKP#[4IY m (BkX@% 9H ة8«jr[?yehd :h.a,9DDs^LQ*atd%mƪ7 ܣ"\\4Ƅ5K j z:4oIG4 ?65V@{B[U,(4EqzֶH 0z/saE4Wh L㢚d,шk3B(<`@}6B R) ]7 ųFCڐߘ@ÈxelB zX0E@}/c >e6&03#Z5-'x$HBX]=PħI2»i؀Nto` RhPw>zVV ށ%[¼3q~tTdĨ0dȤ@&2M|h%hգkTI*Q*u3gM\\?Ca%-am"$ހ+Y#8 % ª"pln]7nM_Q @žJ@c";.\`-5z} my9&Y؎uGoV^]d@Mdc @`9QڲnWH"qKo/fhF*z%lP l5h~I%KB6%/- 1 jƛ#Wd"ƾ/h}ixu=! ZmhESW `$#f\x ȵʉiʼ9G'dɪvȡMr'۩c97dl,)vđᰇ\jK I$3177HlS8|5U0?f7ZGV_gl|_'):膎烣}\\n5ͺYUp[(. #EJ"]:jUEz%_?7/B?ht(GPqÛO{̫R"x fgn m/ޚaںC@6ޭF! MH$_ 4صBc%{syqʢ vݳ> f<=S83nI5`sM˭ǾT*s(lIN@A݅}T.|wցQ\]?qCOAwXp C3; $~{Νݝd7F۷;+3w\9M9T4Xs[}:ԗS~`6 y:^^O_ ~w\^|Xh*Q7yl]ya/z8Z!tb-㷝 hH<~R>MdnHt3;}_Nrch.UpK:݂5hwOށ㗱([v!۵35 6OL.ˉEOc= zD|3 ჋8WJ#!y3R[DO?j!Ckq+G I5E uug&'?z/=56n.hZO7n=N _ټWa{gs/9`~ڛ~t>cA5~qLSײw{47RTmxM;w8*b^?aS'_*?eT%č C 6V)g-|a,P: '--+&+; l@3 anvNcx%X5*V{c;,80}` =/ZBE:`bAZ2C6x!'&,0GeKE\wouִ2RӓP Wqev&؇r>{OMg5a'3H?8=\"#QCFǽ$1! ZAPtaG Z$76!0_׏y S.Pձɂzҿ@E=~:i}3nl8TbÃ4C9Ѵ@ͥ1TSd*!/}C[-&W4faM3 xd2ym[ƜH}`}`4F͈Y 1@),EEkl*g]X{4AgtUsh9Ff0.M0hdAioRX2Md]ˠAlXmjlh0.kv8C"}? v28/U,1!F$zACfFV1RtS#]M_@VFIZB2?h!VtYZ?buv ja_.hT*& ڔ֥Gv }B!cDS0 ZᦥJW ZDY!UjcST #}vhr 8hִm6:iŭ X6 ҅ٻP?"0[3"퉇zk[uQ%ۘollv"z8mPTv2r =m*t襊3*u/)+Е~u~ذLzrNPJ<a7ڨ$ٓU`b3ڽ"D4+۽Nhnx`/ Č}@!8*~ZC$QrvQՎ\4O]]n31(eD0v5@ahбBʱRSP,f݄4i9h3JY7&MvN.h`8 1*UDYtC]OrI"Aq4AU $ƊD4S4ZM9DD{ b=XCmrX5N>iY.$w*Ri @_AYJ!5(Tb3F} Ȟl8gg5N' Q(([.D͛@:i8Q5G)ʛA3 ]8Y*Uf%ߘC Wa88hnP5.<ώdP no:XKEOBAбY//M9Q0*rSy0{A=iBl3 ԋ8 &q>bCYs3+ @ 'Q edGKU.j_62a{uBs9}g7*IUJ4&¾E~cEo=DѾ5!S<c &Ħؖ{B\!?>!XHoC׶•]bVRBdxjxƞQ "EPIAw/@KOSd"=ᴱr3 e ?[L*Aa,z=kj.ي杵Pq,WOu}Έo%;g@vԇ։zTJ6&šIlI o!YrI98oP83[uΕ!]ŮPPH@c`Hv@`!кWe% ^ep0WfGB?7p^T _YKo^zn;#l @w@ak 3 @Ǡd,PcGzpm@g8^vZZ=:?md6>4>YC5d1h=K`?$ wςЗG*UV cBVϞm4c{]+Fʜ9-Æg`SR`_0;1jKoKN9{l>Yln1(|kܗPJ֊KSciJ!Ha=KQ{G̾.wXqs>#YȉJEaIo&T^>Ph+E~;c+=.Ftڸe޳?K8f~𓞲壵BIsp n3i scbh}}_'R5{̓^Ur6z:A?)&/= ¯GxmlS%`W:}}+%uQ#`J{?jR(Gf޵LCx̑sd-~y}]dV/9S~JWy35B<%d i 4޳zXi3f{V{}y>NHdb'gO&΅ !eGKk`]"΂vY? ţI/nhik1+:?Gx}>g4M7wvsme.ln(>R܃ïsk_:{%Zy6. G3YW!C[ u1u+6 xKk\7šlĊV:^Ӹ$dR?U2EͫOM\2w SԳ\ҿS*の9|gĐ.cOr25Hv!K˄/AU};ٙ5}8 f-i'xm ")VwbcJWENb.JwQo\j1VoDIY~{U}6&-4R S*f`iϒNJշk~iү3 [1re s+}C^M2a|K ~gK;GcZ"f%ϊI'4/8xwJڌ|Wk3UQ K.!m٫!拪/RRkO*#(+|bV4-ԳySVYh[P>U`enjU_byÍ۠ 0;ُw4UҊdemJId=%߃5GAKߦ[߾X/͠]JyA0ڌA9_'"aʕ+Ck9-iOo S:m@U <S,6G_J@ߝ]PohqmB@|6/1aV6H⛂GECCJ @!5Cik4"*R#ބ0{7,T] fYc7nx7(ֺ{ϊ3ڧj:$0XP&8%[|׆G_mϒ dJ |O<ߢ_D:k 4;]B /Y][d}g}gϚR*X2}oJvNsIϒAg ZF sWw.A%c?C{/;[v/OIO'oM1PxC>ёvCC ܺ>S t^^jMFzwS( _ь~67%ʣ 7tuX?B 6D5|[Ɨ>M|Kǚŧ;ƍ佸MkF/#L?^ktww<.67W3njOfM]fgs,LN7P{F_Ppm q<þNAEp~׀Mp56JNEK)C% }q<嵘[\=:׏u?)5!x99U싙nQBEyq^S̔ :>j*(nɳ><8h:S_7-Ua$:Η}a"yĈP"kG¿=VƷ8qxݬۤBў  ǰts|]h|yN 58>X~ԯ^oaruxߏ 6==4ϚOo̤@\ӲWAr-PPo@{¼SE\i_@S%[J @W;Z?u*wl3H*!ky2vj`c @7 E1Хnnmpmx-Vvj<ƶi_L! Pýa4".A='eGa@m+ ٠IYtCyNc/1U\ /os`^"j.9Mя|$,tP\0 :ȁK\+~bᆺ`>7 ڴj_b 5\ mm ]Z uE:hǭA1oWT |rzTrC<{Z` %j>]y /ΆB0p!?L6.  kitͲzzOdZC ˷5/h2Hlv8ܖ;SlZDzC[~xg {It2&chƐ[NY :Fo`2Tߊ ؋)u4cBͨ3`)me! A؁epQ/I;mɚ{zoI>`\44wm|B2iW4,sA6f=0 c@We#1J]:nmC)? S1k#;%]_3VqDwi<?9]WF,׆o֦>A/uv_ `OHmw"! ͋Ԅ;,Ya_=\ ڲ_Nsb;lu܆pA-p\) l6*}YL=+BĈ-u 'E)@h%1wuߦ}0hm,حB_PVҞ 53y`-A[KZ\QZWn``Vz錾{@5ܰǧ5&`wrx )ƸScEYiۘOs.H&&2:`(3!*?yn8_<hu|>Z洄2@g&X൭F[w]'Rޥ k: aua-?^J VxM0]Fgmj%RY"2۴./0>9yqfO HGqWÅXWǤ+1)Yza/^r 7"K! -QC~IpԌdbtxۘ.G@E HtTX|&QUUլRVQaMebk@sZ1CԤ*VLA @k ,. 5]#b@u]BwZr1 l".#m|avaIz<d2Ę fwp(< tz+xM!LDS`:=f[ZF}@i÷5x >wz9Hҝ8z )G 26F :ֆjGIWg`>MzX›$2% %# /3dF t뜿eP >s~>EwS%l1 PU`1|z-bKSKqyLe[w)Z%\ɘ0.W="@`D,PMs?w3'&MM}q 0f T\1s}|EG+a6%Jv2PT~7ѫ  ,J {ifeқɭqt :?p`~^Pd62J ހql=mf K:)1 8@eEnuxSZfEutZЭtŸC qBp@0rrsQm[,#vajAh: IF}y2^kUIWh ÓA^,/3E7'IJE#q7C6 QJQ<}ǚ{Ÿ^Ol]IWNF;4Z sn!TG'{GUcqC^d%{OV-Ƽ ki[ h` Oj&YQ+EJږmai= ['[B'7u㦪8\]0fdLR!݇|uJ;EOqٚ9\Ěie98;x$k3o15NPC7ȣ`67 }* ̢ZJQRjBDvZ? i Xcs8 &7 !l h=c@ axumt2Z`+k,6F% 祅:^"-l/q $+vȰ87<.;3DM1:-Pzay 2 Io#Ky "dQw`ORstKQXRu]MaAWhv7ylb":ںI@A qo7SU*/a ;@OFQfR](01$>fҘC qby<GD!Q#@$-Z ls/[YxOX.Qιi纹(ОL|:j#*s.*.ȁPYhy ,):l4flmؔJ>i3lMn. X(x V 6O@GIIKY^Q ;6 G60v8,:)ʜHK9PC(Wt&!,EmÞ Cj'OkqGP=O+$1:R9 ]xώ*T׎jK@O]ѥݲ{, %`E@!I Gf /"_U0 $tѦ:|6) R|I@X-A(ל.M8FL+h8Sϰ;/P7:XJ @QZ~s)qh߯h#5@l> !r  U){j]BĖ]&u`ܼVi5 /&z?%):3Pi* *dwT|]Ʉ:xeOO6$GR3$m/Fvs&fЫyjzuNۦxCZC)_[j##}<bҗG%lԕ^>¢xh,?a;? l[?P;ڷWjM5rs'"ANq߿1>֐y;J7hw#=+#ZD9U_M =d^׽{\S߸KRI4߆lZa?|>S IOH`i }{BNgϴFR*Q3ahiPI~!A;䍠ӭ[b9r^jp͔ هn*ܙX~ދV0"҃R9Xt5$_w63oe̶oDZ'K%gt:NpIEnǟ|§A/㋻) fu.g|fqtx>MlIeiOܹg~K)LpzV~俈M;= 잪1vhШy,)pKUl!eޮ<#R~3a\Eg8~b}+S?VcK.-}^ BF ^*G5<߇qaE ]t~*U'DwksWT瞸A":"FOɭ$,pmtV Ӊf13}lDFjo}529خV!P²MRq;$6Bkr Ii5,`[k_"!_hJc`wj;)M:d'$Aq _#SZG'?O/=R/N?N7ÓNJ*UTRJ*UTRJܭX(R|EOOy,$3^ mO(,ω&[,8xcJ>GJU4""}Ic{2cjӺ5 *hzHߤKA1RPM k )g/:B2cHK췼±F{׾ /E r_՘ᇤSULPUPGoUK ["[C% ρueE?)TF5b; #mq|aV{~y"shq3/T_r:j!ž :¼P_Б76ZQU/i-)DnXuW8ʘY|#{ ZmX9,{+\U9S=K̦4|IdM5o, @sE,lURoPta5LPb7tIOhp/BA e@J^?z@cDxd/zm_`,H.([S)XTq.Մi'ƞv.TvG@o5=0BSao`1̡{?-iT(g$6}P=6x]MԔlj[8ї{a7|YjЬ*yU~t9âxjڍY+/ёmcľ]m\O|`7OA=',B~g[|OyĎ3@k.4]iM #ENOhWDmMIt]B1a}zh<-1\ݍAgWP\ *)w{וξ:E׏V]}4/|ܻx%0ԇvPڽ~N+nG3;}wz샡 -;&?ws#DF!c @!Ż?]v0iVdxWfk$bJGP8Z<*}4+3/df9et`0}{Aˍ;,) Z `-d{ؒPݣm&ΧQ&. qgG={&d}UM 1o-CIphK=F!.\E 04y[nU>TxɂMѢ/5版n7֛`%##FC_3e3eX1SZ;\vA%K6%QPhb~Aݐ,rR41/OyWާwȕ2- p|kZe1s(a  I.5QF][58 2/>+ tȿfWUWݼ+B ބb!"WzYeS 2 fx υ3tUQvt{݄4@#Ljy>e%]9󺣷+`@h p ulm7v >;(>E̕>@|'09"]/:r>̑cz@)̢]C/Xm}:N#L*q|_c&-ܼni1J}|,A"$  Gq*Pj (>yc2VzZHS*kj>wd Ȟ-FC3bV(LOKȗ%uBw\ LN:VKҹ\KJdo1U0GG P8q4LIiH->\f݇l7Қ _F֒( ;p^ٛd iޯ< o|%2 zJ#cuPa("V)iO>/;sKH&KM KbEj[*e.R*/l' ^饊g&ٱ8hV@/dk&Tj:CBÕuXP=/&_+xTWY@o@BaĹI'2bnA["0 @~f[(;0VgM;aoW#[HԔXJ&TSa']؜/Qh`VDݰ)Ƀ9!@e @ w;;'A5'»~4`f݀l4NFbl=Oa`}n*F{u _3 A2j',~*Q1qĚAzO'SVm>: 64ԝ5"Aj"Ta YaE6U9PLw Q_&l?9~2yv/c(B!K @gmN#ȜܮT*fK'8=^ow,AM{un@cF !"p笸mZRX ޔ@ގlC8 0_c"ZEmx .vbHtTϪGro 9?ޗs/+Bj' H'C8X$WBÿ ^$<Sb]؂Y+ށW5ԓWԻ< V=Vz@䟇&iL*KaC TU{wEK=B('{ eN%<۠o"5JoJY[lOM2= Ew㠟0iU[) CVT*y9裍3"(/%dqPxi~PRzyK/SS<;u5`~yk{6v]W,Ü/k>њo^w1Lx*H׾J~OYl%}xNRcrȽ1phg(EFK! ~ql6'vܗ@끗MO\m:>|:8]JY?a5~Y6gϦڈ6Gt;q g=c/gJ[,)y~pK@N$UJ⏏4g -׺"y;UX}dN|Ͽ,^IPE^3.v(Qi=?CQa-[o tw7Q<4; UZN9=gG:8zR5F}'=;f%;εs3qw7kr\eBK]sb-Q0U&˔֓ysogO K^nՐ9H'sR֛aZG;ߥm߰AERgEBf}hYwCPhU8d״4vsK"n/M{hJտAon~k 7/J*UTRJ*UTRJ*Uf `5LRZlis_Z)D6:<^9Os`yPy ʞh}O$VS[? "{ %_LE 5HEk@‚Zi tA2lzH1&}CT.*qdE*R"@i5J6@à޵aO^.[>#At/➚tm0QW adi+ 5ߘYucx2ԛPoySCn.c4H!JE5W*UJǚ֚#ٕE 4E.l;9iƐ=ESbWMFo;whb^?:rbrh>xc3ZdW0eDD* T޵fPDOt%`ёWԛmh}cR>T'oMEU2L+xO]qQг|`z?5&W!g&K)ѡV~E[Wjy[Qt{+W:I9ۨm=8ioR j.B#&)b'gyKt*ίE)X<@d=[o1љJn~]7_mȑ^' 5xgV(?3§mq{[/kUz[7,%9Nu8Eee*0[(dU|{HS_ZGA䳿o c@Web~hq S Ijc˦Y`O^O\IX`?/C,Pz q.kTơY4@?Yg*^k *gj?+ЉʤYE?+ 3- "0_n\[N:̑{sjG*`0]̱6n_g!]?\5]l~=-Dg̃'9ޣqd N^ vA7nR11İۆT};Yhs3hxET/(gx!C:1pW>:;cqA|&6чUgпd!J*7#s8(NjNֺe<72qew[q}~&ŅХܟ;C-$|Jނ-/v` 43v"#9|>c?VDV4*M_O7 b`/ؓlFؔ ]Fy،+{y>c΀e(4x:&{ Ƃx w b'n(cVХ&xoQZUSyžfTn;,~Q;.2N ef35Sz/N~falndaY[m2|6LלidM_&XF̳~l!WJEi܅nL1t$My# \`wXj)G2}V`)dm= @R +?9ff{cU4@Z'Tp P2ryɁYP[^1)&X!`S%n^ndW+'z7 q,t]f!)\P3h_ )lD*#EI!ZM&d3z6xM:SvʬO/ASV=׊xĞ|Sbr9f[<i)BapԏTw?tf&Ÿi3 7 3\"2b#M..]^(& m!K/N>ٕ5'eDTy qrY =DPC#_y۸Fgl£aM1(@d Y y@]E,$5Th) e" KPa94ao "Fev7MhJ#Ql54c$7>z-5DVnLU⺵m +93C;Y]l&pʋq-+ʊJEz;},ea1~Nf 8Pg(c#^(B|0@:;s ,=8\6])( Xon(0hfCo@J 8dM4^]DG&y^븜ԩe݆ ȅ uZVYr[I!P/, z] ,ĭ D/Xq|i2F8]_E(2T\ mh/ⅦI X8r/yv秝k]ilҐK,Wuӥ.!B=0@8,yaŞ[LUZ\@og,IeZh~"{-+h!7Ed:  ,e*q,.&'<I@~k@BlEL{C^Џ =W\oȟ*hMw9֛Z#IJ.nBns2%젌0h Ȓ4ZƂ7'&6mlLչgZ-v-CcVpP!uiex3l7xb˙z8vGc1P N xX 19ݠ^j}:7oܗJv^ p& [(!+)uK5xT_+iAS6fom U(~J,b3Dk8x xpq7hx ˞i@M9W.]1d\[H4h )vQ<} Xy}W@P;a%VcUcsİD F?|D. gҺZV ZXPqXQ E%"@赽U@t>]Xq.3Uɓ@QѼJNb5k9ssȼڴдw.k+|I5تbYtax_lu}^iM7ܰp =GYk "&~mT:^)F@-6}bP,eEbҧ,|@ T82_nx*_ O]cl6?DLX,[R7+7? ,>H uzFs\n(?,u?:%z6gv)@鮿N; vɆ0ӛ-C1k\E\|u0޸dpY0ߞP192( 85+b;ӧS}QFl G/o bQp_eZ_&z.UZ žq5@hr4tbٓ^'NzIaUvt?1@.hyё ~XQδ8u.5FI%vr42앮L7\fIh}Z7軛] >/x}f)oO^Ώ?6_H~6}AW|w׶ԟg8_]j#{ߓJxgH?AZxdi0>OYz"sxv7A%~}Y CqY8eC{#Qxu= uXsb`s^M2g?r#-(JǞ~j{**<*,aa*ewmSښ~5U28F +t]\ _.#r(2bXQ:o9TIN&p*M~!S O4M,C6xwNQcQM;[뮙mԑdXo?L8ƶe4nM*P- z^6עh=g͍}S-}r~u4~S).>Ne!C&7$>U2־WsUu ϼT)O٤~\Xq.Sax8B1ureMxXE.=j؆U ~VvjUxvqȀzm# &m W\fQtK0/șdrm]+~ox`\ LJ`V`/ ?7N&p"O`z7Ɲc%K2h{q%Bp  P\.@(RzxZi)V =-gqH@q %X@7^rJB{VfgfFv dճt4lx6?\T ox"+g/s`+AZFإ*YJ"oAL5)ow, b8a?u*⽥l-?]_ k(N8"#UrιɑV7Yt u3| :WeDu3%o_O&y|;ޢ飰-)&kk]{2f\vr,ëquykyigWCo@c]o?9*L2Υ     "{ 懆|5#dLhh3Ü]2o{\Yև~7Ÿw?3p0A5BCg mtl+VYm77g/Bx2jut~9!>ҠU̒zY&h}]N ĎhR? b9꛰q4lY+@`0c}zUިib:ݳ E=aI+ߪ_`$í?NF+twfra[c߶*R=-d r'^qzrߨ2=B{EƔ=~ĀdW`va«vzLn']}C?4i56`3_;/3ꎯ!A ZT9<]3ᴡ@wj첊 ̨7x"_c 67" lK $lN'yݕcs#^c3M<%HQA#΁.|y؊-5լ  8(.6h L/.<x[e2`PCi{5l1`mZ]Ϙf&Ȕ/#vPp2cl&ƑWǡCR#'ٮ~a?xJT  Х٠"9!8fJQh&f"B27X-@ Fb?!W;x C\%UȖUEf=6 (@| }`16`f/xQ82]cT!X?~kI¢ DPrDzBo.qr)Q !@P9<^A+"dW`$&? ))F=ϫ,@_zhy50,^ @@?SAZQ P8c WbOPDT67oRjl \ꉠ\E|hahoKA-@ UT8l}8A)Y{[|e K/d#lO1>bi @('* ;pM  / 8$=Q"ˈP2 2 M_.̄Y6a,h%[ /6[,{FZ^0WSd:{@] 'V+*Tc[J0qed ]PFc;Dш[q׆ z.]GQbJ܄?{ j Gna0,@ %/ O웡Y}a]h8)_!8@4 /'Kl VpU*Xl`#VEGM`w` X0&wFAn)wa7aNu hSʌ)ܳp|vi @4t?ISz^bl ADY/(RtX= @u2-2qaeRK6_JTSKN!@I%]D̂=˓ Ÿs> =N{U 렻M&U`r5=1{c6U[{yU ^FhhH=uW 0 ,Q3In-, +mUPlଏ1\/\4f/q.LO/{ %^;!jYSѼ}O9!&G^_ e+7:s$eO'+O~*z1;&Li1cc]WX9}t`I%Ma)g![ءPLX3c =/e5̮*bC`tsާ0J:c8~q\L/+ʰ(k:4\Ib|TÞXa{!ּMr_ɲdh&=g/+>FOՌgF=! _'NޔJA)l/dOe_D ;N:yP.26EpN v n=E,Dv˖+ןd1P$' p`%R+n"Z-1>ۼ}/䧅'32ԟKqܦ@l~3~.߄O{|PjOjړg to'M_p,p$GZ|̾ƝEpً] ~c+Fݣ:' 5HQ)[8up\ k'Nߘ}+f]gwbYO\Pg jكpm8)ǞvFL:*w†sڨ*`IJh@43lngZ;~C`:/Q5xY7x0}ǽ>ś;/dC;qLTp%u ́b,S6oJ.A0Lh)F?r X&Hx؄o]F'Isr=cIc`Wu ~Qu4E!]Ģ\3g򰃇MIY۰,1 ȎA-{55=9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7CCC'=Nx vR'n_ASe[L{7kx]yBTH H䕕mr֛w͸_C󭏥وFuc t^]J}ܾ:Y [(16˶ۉ3F3v^ -| (.+Ch`]vςBz}@VK?Wpu(*IVvvݽ71ߣ!`2 n0+XI_P[er^XsՁ'"{kC '?;pP`[ƴ? " Ѝ0 ƔVY. p4_fc}x T .#) '<|_8Tc%L8ӠCf6K z[=M2 ƞ`!>n>D#i4foTDs\jVܾ ӔƤ?N$Ae qEBVO8fHjz^ֺ^JN Εv /BwTH m)@SʙbIaK)@Y"#,wKD(@5a)o4FnL%@Ovp+@qg2hn pQ,_pJ&")l;bFcpR;mjQ*: 1bGț -PWD kTF4c:& ;lmML;{Z-@̱c#R> (Lo*—(4Xz`u<_^ʮ*Z=!@g?۩i-+LNN}UAo&){Ya*}7.¿KP y(ץʰOve5<`Gg0֨@Ga乸۫J`씔=t9 A}%5tCcZ`T^:ƤN=-pاR"%yKO])c C@)Źlglflv `Qu2~'_3A+/eXl4p,U g$a~;\БrveG%=ޒGt\Ti1ay]K"&)1lz*z.AIepl& O՜*.o^=g=q|6%Φ`&R˽*b1W.%" H~$eÊed [fQ iE7UA<⻾      ?ɶй ./Y>g=S= - % ] 2O4ycQkƢC*E Ipq ?8gb_Hѿ䔮"LFXUw} yŅ"9p9o PkČ3&Ưjo!T'BJ6ͳߕOoj_;u3cKD{8a۔@x# xj9,lk9hLݑG~a]Kь"mp|WfC4e}1pPFb(iVbA21icjlj]@xtʑa:G˴ZWy12h"a U&%&A?æ$өDu=P^ʅuk tBoUկ"U~ѧ1!@-|䘙 K;ϳX a?7+Tի_pSաN7\Ћ>'ck0Uu|9w+_C.R; z-8jWEvmzFκO/n˔akp#Z.?:.:W^ZmD@G .Pֶ|R]wBuG l0_c{Dldc.@k.?/%>WCJn 蜾 ͓&BVŽ mFO1_MV.+*YueEE.&D(/a|o j.Z믭]^%JD0Cn`^A^iʤ \_PGBX5E4 ?p<lg;=kO:h.c#.n_t[zi]}دca y]{_d1v$I\_c(di ~}mal'-aUSr-Gv }\k KCSlY:rOC Zzyݵ+6؀h rŨ18_yld/˛2I^_c% ۍw;bbyV^C( rc D05|$ vhk]tυ-JpXLdagH}"/j"_z{>CwcŦ.M8oN9OWc!b7 = _j0h55. Xg>dW[c (@\+3t^s>Pe Rf srEDxž^ogsǰc) pHك胨詭ʹp'4ֹ9F{mDJ)@j}8zC%q0\b{1N,@r\S BLcPN)gtcksc9E 7b ]P0[u, P'1IܱUqveτZD#FqYD(ULθZ.ld4bk'a~pEA1(|(&?zزDgC %Jl$1D#~O٢+TO=)X+)Hxl }-mEլ*(218-j9Ens-, P^XE 3 s l(r)Pbs(gп&Adłphw0ɼמn:9E# PSDP$@k헚 C 4I/đ.1P|hN@"@u$PJtYBZF@Q9o3(.[3j;,X/PHeȖ#[ls}JR M68F!Ld p`(\[neLfpSv%H|/JCc[98ga-L;ɣ?y3%@?6ÆMx75KĐ 9"@8=wL Ae P'2gI;hĸJEW&\zƎ Xi'e6~m4\yk߻ s}'妄5~Z@9L9 |;ߠ(־A/t)GzVbu[MRM<)+3%@NaR PП!0W[+bY8j8%U"@X+L~tN [4KYsbK$A3v'Y¥=Gj!@\Mp=_4>ljzcUD[3͹QR : %DR51x;ޑ*wkx,#|o8}o Xł\΃z/3/ PbY{yU!6[F]YOK&ˣT߈ l|}d[KSBHH%@yJ'}hvESbRq,#=%#w_CsHwp=7rI'c0LJbLRE~MX M6@޹Wpȁނ`#BM[#%).lA k9p1'lO+68!]?OTfT.SIKA1nS\ +lw͆1OZuel][U6q;5sׄCc)}[,KRIͭvhn:VOgO:JJw_IM`^.N'!6h 'Vڛ} Xz|C* kN'JsƦ7ggJ3ih|mARj"b=ytK^7=$Y]xam~x}&)8o (=g-,K̖.OWՊQۿp<3h.ǟ7ɻ!2G/qKV]r4j-c;uڄps,>rkl춹yvS  jU#Ma %mC8ѯlcnkrhTeWsq^Ѧ⓰ܶko᪁ {mkmaN7+`_-pYv%vknv(jPm.[|3~|a=gc/pٖ} Z'N tq lE OQXQ ;yV\%bgQu723ސZӜ0tv-7nwqL⹚ { x Uٓ,%ZB̂Γz3brgOt-K,}OOς1"dHe uH΄3ADVsM sž       >,9j8Ol)4t~_^] ~'-9 L AX=5o,-^I#Uၐp9e]!J?}jTE`3(AH"{%^iHpcvU$LfRȋNfPA|1|fMtͦl|Z蕟5R ib-yRnڔ0 Gtݺ\z fe|5qBht0iLi!Gʞ́kWxȑvL's*jbWSX`(O3̯Xx^(9s6C6bU$S|]GM+6C6zț RL,fۈlЀt[ Pe4ţ QxIXcPӧٜd2Tzػ| yGܹ6m{~DLS~tƼ(IڠhfM-}f,z| l#$~Yx x PH UTs <=ˍg(^Sq,<-v0U4A5yg* f4k#?X|:WM[#LN`3D5}}Ao9b<ƱF.OU# ЍvNl3^4ʐw}?vҹU%Lg̛!qE+匸HhOg]i=n"cR\+d;z?aɭ˓m:3v_rC:zx^#8!8>||T6V(hXh}e5S(@˾GO<̆+CnP>uv0$xi Я"̶`3EIJbfalLelAC^pa8CBIV Ps`͒1)13\-@0HDzAE"lbx)1PvQɍ{#op(q_Jި ud1 [h )3 )`Q)Pmqu-1<ƊkW{N-@ rͶL1g]AyhҒ=v, Y"K«9 ,V66 _/G0[OvBf? Ru˷] ?v}%k&B4 ld%F+gNN)Gџؗ#PιM*l'7]'z\dؓKIKt䉲`ItQYpro"V}}Bc/Rڊס~-=# a%9I! =:m EU\9%CX7 ko#A|Vr~4;/Ma>Dq&W`d,=ӉY^ ٕNI% ШՁRrZ (@kmg&Q ~2h |F!(@8]-@{df%VF@(l' [88~-~z?W#pngkSpF)2{/ˤ13%4=CzT~CWOqUOѸ}Ecy3|ŽG"n)ha%iU;P+hhEY~(@ck0 ,3J4i5O c*ل;U l;|u`5[CFы91l̦"LUl+>?B^eKIu=ʡ݀XokrS PҾɞF*E ,q ыQ71FtPgZQς%06l% n~IB.[b5.`l FZ w @2$ExY\wD7Zjq{トS1zPT !f]vQ(QOO@0~=*Bɹ9KU\K9l /DԬw5+\TcBS0HGǎ <`p Pm8ϛ fbzfJ.pr(R"]t8kAAAAAěs0444ɩj$G/G7z%#ZMvNX%3 `~ u7/Gs7] ߲燡O\_VD]"ଥ{Jt6 (=ϝMza .'Ț UJW ?Bd/y&N_BcK=^1tB~iHNӤX>)uN7:?axrճR.Ѧ~:ݯ5`ɣ*}>Y_Q_ЮKZ (T@ł |huS tVⴆ UXԺLa8'ءH5+Y{:ݬh\.T8-dkux?V.QqiڷW:yWFI <nN̠2ƋurS;^f/tAMS5MY;|͓^4u-Y& ΀*]ڏv]ΞZ3Tg^^P1aQ(xY_{X4@7& uTvՀ3{h{5GAme \U\0PbX_{7=W\SԤ w{V_;i^s ~k^ {1 v.|m"^^\ND [lSjɆNC6Zs(#M_gfsryn!{ƖzjEko]J*~B" PwyQ]0 <0˗Wl2lq(ڤ7ٱgq"4eUQv/޶h̸G7@_lk\K91t_jl΅CP+_,(1 ~ qŨC"l0&OZ$7 ;6x^@sop.@)`!\]0_20K1Y%@xw CD89 P_g H`vӶZ")6N1k]"z=2Ԅ]*d"@wreu Kk){s+Vh$*V`{^,9\>!@2/ @q'<ǼyTH.`` > Ƅ?rTW7r0Na`"&NLnZw08d_9LsSTP኱YjT##he`ȧv*vӼw̸e띖pBSl{r0CcIhzzʱoduZ+%}ub*#Z$A1ZY])f6mW6p1 P9Caʾj0[ʁc'8){`ߡM$y);HCbIRv|ŇkbS9Wi%p9h*U|]IR5 sD=tŒ =Bh:~=@O1qk.ς Ig!@ל| Fڝ޶A䉖}UK B|'plk/׭V 54fkTJ\-ѱJv'nJ ;K/r׿2jc@ IsŪ&siZOXm2ت"l:~'kq*4+l=Vg%KX+6S.p2ۈ'θݖa<Qnga=5];@gL#W_iC1n)Fwvn6򲰚ku\uDy .j흋99p}Ѫ"?uSO{t,uӁ6:\嗺OID^s.O'cXGgsu8^7oDf]WkcMYΟ7@ljfpK1ӵObA2׳bMRΓd99eJt3:[>]ӫل3ZvA'I<9yXmzc?ü," >vؗnVqV3/1v@AXfSu+O?ߴ_ȵ5 ZD endstream endobj 10 0 obj 130529 endobj 12 0 obj <> stream x33T(*T0P52 %,JURJXZ(XX*F&z ɹ\& . \ 6 endstream endobj 13 0 obj 79 endobj 14 0 obj <> stream x콏v׵s}ڦŔbD0  J 4$-%bJ6m^!mے" t=3kZs^yr|f֬Y3f|;>ќP:*<4x-H/إ8:4,ʺɰY"(f5.ts2+hlo@V'@ʄiR?&`9H}=ؘ+Kqv 9YbeLі^8GL )ݞum[ѼL>jXV+snq; 0'c}{z_qͼeӡ6ըauX]0'Y<Ͼ12o d)$F9-<@S\fߒW\{sn,T[8gSL!7֥Ўs4k3ko-S}.W9 ;bH,j-cؼ[ܚRĥwWuCZPssO\iCxi}cJ.Jq7%ݝ7";#Ǚ[';,f.TЭ#i_cy^M\0nʚZT;#j[#?/oqLi0K3後4nlg* ݥ#^'Khr/zf{Gvâ騞;Ղf뺶G\upR] `rŔՅڥ~QCKƟv Қ=)c\4KlLYExa6fq5UB.ҍ:?[LSւKT#)ٚvk"Rc3 #ew^U@ĬfuKƙv7K[ق8n{p [yV! 6uXٷ,EKVdiҴGUTa]s nTFMo5ëx͂J u>AL;6-TJL5\zv v[W>p}sXٷލ+|-c {7FMӨ~#rۺF;4[OָP"MXzƮ['۬` F-͍]wsXW/Twc`‚KX,F,S#4i+XhڰfE]uiQw^v|9ozOo7Xga M5Ts4֭eZVzn4bc0d\b1bt`Hcfљ[[GQ C}BF\fpzFQkUuʂJ#:`i޴a[ P4Bu\~nW:;.]۱5MuSFZ4oiK؜?l^SeNjR7R[`-u.ai1A=H-#}v~Eލ8ơ^q K)-7j5[m [c-nnݎn nm 5Z1um]ncw`Rk>;UEFgC1&զ>h> >{„-ů}qwтwX_{.s6{„-u&4тwX_{.s64r7.4uC0gԂq&ю3M-xy>|;MGm`eW^ I;:XN }|def]/ȁ+,؇뿑pp/G?6)cK3|+zݳֆM?Et]u>o>dLhS˭ZB\F近pԂʁG1> kÃu?EtQզo>jd&TQ-uha.߂o.aoq6?6)cK3|+zݳ-L#zU~M|dLhSѫ٢Z\~Sa|B]ܖM5߷B]bnd lA¥^jH54۴ch{Ҕc} H7L8y,sXaܮ35j0ց!λ]m/ c>uwǮ)j')|{RPX{%h)S>{ GC*z}z/j(:xeFFn߫(Y(Tx|G:oo-8vZa˥" .Z{%nQ;>덻EO*z.ui(Fy^z4 mF7F9nX(jk̆˲u暚Juoe?qh\v`sSF|}۷T:t]R(,[V_G5-Wsۃ_|[ =w,mR wMڇVdmK[;lyxsثXA*z.uҶh,P_hX{߮5Ks?pv F'aBkcTm0@ V7 SHn\cү"8TE~\[  c/YfBLhaSPmes0ak@AK庁dRM6u!ԈN-Ôf mnP_HūJc^y;5_vzh8Tsۼ4E}g݂ƚ\G0sRl|gQq O/aː~tj9y)K]-}G1em{QS.ػn4T[ۼjt݂*%hooqň%,-\=hJzj#S^|- a jj{-F$4t.mUq{], j Ql|'uGԭ#;i:Q8͛^*tqX3_Ť4EDcyJkj{"Vڝ͏ܨ 7GSc鹀,m! 4'}K&yG%Mif \"a\,Dfdoe\b_(,(YDBd̆|1JBaL|=КPnT+)p7n:6)䠰Ƣ߃lR%0fpNpy  q{F_7fx} O;<<<<<<<<{?{Лigguz3<@oH6 ˡ``;!#l( @ȚSgTp'p $P,i}[HCN H$%f;6sQp'p $P"hdB ;!#l( :&mH Q:,$JR@>z$)BQy٨jE!/ju aCIkV)m-WVRf?ʚBp'p $PR}-OّkferyWTa֍(aY'()mj6@NVNTZS(,-ԄsIWaE;!6 $PRt> = ATE|eeGJ*BQJY;!LT†(S1YM.#;/LQJvFcU]( a4Yn~P@%~4zڟrC)C5ny7[Ԫ(: a6l(  H0z &1+;R+\_;!ɢ $RW5)4x+kPtқuNӲbaCIeŃu]NӲ?ﰡ$['Hœ8?03%(6`BYƓ8wBr H"*`׺@ 䬕P@x(,NPbCI `H`7P@ K,6;!," $2$W.Mup'<ϳ$2Аi@ZLP@ FGy|aN1sdCI4l)nY4ŠL6P@ OYٗZ0mwBX $Pzr诲}M葉_ (s&j6@C)*,jơ:SEv )º$X_P@ E2VSbJY-tzhb:! a]&ul( #LErM} "%,WQPԑ&X̖P@ KV55feǔD_^mA_XwBݲ/ L@D@Cэ(uR*hwBeM}<dz(X 5īmkҎrPФR0, =S5ǺH9ZV:S4:mu7S5-0iqWB5=M3. $'Wff$uʧC6P.xj^"a J р2\dEQ\n-{D CSmS1I+R_hR5wZWhP^<':e-)}VZ54 Sdip+e(G zO f39ڵ%e'.,* ~2]Y@ )y}){Ԧg+ -x֬e xE(%t\RʭgᥰlWr(ޅnRHu!&V $3+z8jg˅x}ISgyԖE/8D Ϛg:t'U'ԱThzIMƙG% @dId]Q7S-ԼT_3՗~Eр2d/E\ƍ#@?xMQ^pFhXu$ɞn5'rҡuL5,DKRq8#ok~>swl!ze l9l~H YXʚXL#eXB7z4"{xaOZd*Z?j]TWuJÝ0\ h^zPlggN> 5!!z)j'xk*"BO ~;גРjB,_yV;/.t$[lX cR @hGpu,q'ohd\-`3kDZG:U:Vu,)$vDO!'>wB6t㈽uu~[ɭlP@#/^יn=$Ј?op'_fx=aCI5]6BtNl( wB؞: $NO2 VЖcs5 ,6:͒@Efq}~8ko?].'S e8~QՖgG}O,͒$Gޮo?$uYk_yUᷖe#YYyxxqqRݫ9CxaLo 2[͒γ,Έ"<,DliM<}f-*"Ҝ{ѭCD4d$PlRwj XXծ/rjҟ&RЄ'Y@`iȂEqY|K%ĪB8!XZ; `Q˩Q&[db:{R+F%%nCu=,Y(Ҡ9D "+D֖l8+75(s8"+UCV^ńfl8agȂEqYN |{%h",{I";> vIp; FX: `Q"KZƂlEd]Adm gd$0[XКp3,`v(N ޅ1_L:`)VrLfI`XД$|ϬYPzfYaNFdɯ"VŌ]g,d{*4͖,B94HY]Ч _M|ߗE%÷R 9"ԩT|$ZА]l1^{KER͒<ɖƆߩ&g?v@dAvƈTD0-.z*G!1:#WHBjаYlp my-> lrY>K+jDx. _N~Wꇅ: | F "PSCvVaePb$0<^<М lfYO,2J1r /,\k<"WJPPhR7^@fI`dџp.U){G?/"Y2NL1recDPG)r&G)'T >*gMY^ h, L{vPkJVǴG" OgXK{"+R>\ m+z٩{a#GO\i9k‚PYmVp 6h@d6$z}ȺGIsϞkrM{aoكXnhR7뽬B^CWgyJB_{ %m#݁Я+TU ?,XtG϶ޓW*u=jQrI(QhZE{ un %2uݲb ͢BUc^-DVpveݭ=rz_*DQd/eS:A_ߊ.( f"oG"!l El"\Dppd >rz_8^+QzʟlC! WrG Ț-fa;儰Ƅ==v%k.X}Ϲ~W`eϥ;-&I2Â7 O| aՍ /j.`Ϲq .+Mi &o\~m՝uωz97v/mq#wa3YS#o5|l9&-𧷸_DAdkp?EPNۿž_ǿf'8ȚG,}ɹ?t$,z~\ĪWYpwGv~Ɓ<,jK/97x[fcHd%j /}z['9IݩJGEN"DDA^ɺɧ'+QmD [f/%rM#32<_uݾ{35,! G8Uo"#wg7NyW/}Ԃ_Jb5ԢlO.\ASȊ-gj!uAߎXa눬;Tۯ[ulvsC~& d`BdҁZֹo"рi!'ݎK+a`d l#6ZwvGsngPTq[9g7 WWXE,v-^ac_NʥGP %0,7Skl ΰeuvphDkyǗ QXY^A+E Y.0>=spzq=یA,]0{,Ux:dT%yCp_RSr :S5ܓwz1|nZdgAt]-UxZBd$^;T\tBzvO5 PMk~,,,d!f9 \Vd+H .D<ȓ/1J^]aYZ; >(x.Ո{-DVcvx=@C#pQ tZN TouY6YIB&QX'+ڡ_.` jr6ɞjڬݿF5>gyuSxZ8P3@uqwKX.{]洣p깃8_RhwΜ K0 ,Z|\0 SӫKцVqT06Yݶg ל)r*X: Vgљ D9}+ 㭼-'u)n/u>!0:?Ē%t[Kdiw\RJ _|"+{PXD PO" '΄ -D ،jpx3 B@7VW/X0OT ܤ."ԥ/3 NP\hN"kBYYNaÚ)Za sD/󧑦Yu;zCo]d w7%834ޓE;,%Ma~HnFo,-v[喃٭ޓu R5Z//$jG$-Ld,]KpOJ bu%:Yuj͊ߏ Mi:w--p:Egw)d조^ZdYάLoB*zp|H 'o}u8 c3u~k9^f|7љ!?dp)uRk:쮃L~ %EȪu4(H.O\p9n(w:Jd/u }Xa4Eg*u6d!SJ6}џ}vA`8-_n!{]/ԱzZF2.5KdHܻHV6K)FMťja){.};| w<"+4rvYz1;,3\^ehb2'Q5qW! "?=Ȫc<[:g\rv:bsֹ/`c" jv*ul/ιuo!FQ}hEq[aX. (wҚU`ہnnGG#[^Tjzw9ME/i_䒦3X]rFhVPdeNIT>*wr/)YriFuk>"%^wߵ&iO䢛ۭ$Hfe 't'\4v׫&EFm=K%ݘVdՙ嶨F3)OVXXvNYd-rɾ隊Q6~/WG Ғþ+ Y+6Q.4 ƅ |fY-'zBNցEd-3Ӌq9 eǵ" X/ QW "kuN(, {3IhY«Bu,."|L%_fYG]:4f9wGaY{mYj"Q!hp-YۧYG\!m9DzkGaq\3/RѶ.wBew$j=$ -qvY/@SGdsg`K|P 1E񝬺ZaNuGCb93Lux,W 6@_- :k~%%Ώ#,p4T/'}Cf:YӦk I2t= U/%΄ /xن«-DV;DrD֕{2Ȏs0 $Ek/A{qd:s^r "K 9GQdd:G묰[2M糸{\"+ՅX{.V̐/PX[2"b/ r^svuF(⹣mX(&-@grvB{ )[s.R%c(ѶwB %.ISL"fHQO3)>hWwKk*Z:SKR'{W:PdBt`DV)#ٽ u hfQ XN5Ddɧd}WY "PYM]hO>!hN*dTS" HXm+w]=4cAd@f&5b3T!^-23EjD-A)d*utV<t&0IGM}%YzSJ'SS6Zhh"b{-f&(h/R5Zs@Nҫ"QK|)&qEd&E*#BPRi۔` oBb8CО6pr>L"u$j;$"D\R"thaOu$PߣR'un֔VGbtN(T3:0 K df@X Ʈ"wU:l˝PODT6d]}US  ŵ~\(TKu!"Ճ [$LSp{Iٽ(G:X dlrru|<*ƒm%Xv 쌐?-ԊuI&s4 `6)Oբ m%{u^o<롲hT5GUԎ0UPNY/ 9WeAaF*r Bd=:?];w."kJs it! 襺ZڅVӯgД&d$5>gܶ^Ϯyk6Rs[4Hy [<*%jqiZEXٗ@{LCEl̓4ckPX]'Xcq̺d)FɘXYk1O^nF+svo@XӒZ IO:]E֙jBHAx-{0큻S%T~ Si{9 (i \3Qr"* UಜBȂ#TI S9Լ59kDV) UY'"˃ْFa㛃{lmwy.8jF^0NCKd7" ̙M{3,ZĿ$Cu1Ȋ+$QG Bd7 " Z|>űZ8bj/q[ )UX}RSu0l,wBUDP|\=3'%pTlXk]ᯩ,dU: Y/8r"k41۰{4."K/MzݻPX!/99 |\0yw1$j}tz+m2m8$.\oeDo+)EX s~ .w 3L՞"k`HD 6S!퓙5y&avfOV"R%KE8+7^Y(ٓ:6z_3 &KƐiq"+#n{F.XJ#Ed \dRŞ1YzUӨqH.S〆dELR F8nX9S۱YDV}D@E"q^Ld(ˏ@sTT쮨NCfԲ#pR [I*5GpE QX{.1ҫYBϫ-"k " vDCq-LV iQyX(dKNh#xE4RP\SM@F'ɾTm;!4{5jgS[lm1\ZOdzit'D}\dՎhIVVZDiذD(ѻD_G:4ȅB+$ڔRT'aAփrv",å'aQ}'3jHGFZMDmRJ+k*ٓTNO_OJ4%7;S0IQْ#לq(Ɖw`xF#z^΄ u-WV+i<#R9M SY?zDC4e`uQk,LG9"eT_@em H~W^l>9t`xɆB8"Kx5VH-HGv&\K;,"ʋh־\i<#4+NN[БrPhMꁔ_ SV'h#-[qv?Cac1{2B! QL6Y,,9'UV>cGpF9XҸTZ]sC0;~>V4UD2gcocMӴSEV֥X!7!ٙs9.׼OsVPZFݖ Qz%?Z_r# _ "υk"LC/fLa])tc:&W&kd$;1-4:5jfJ:*9sȣHٌv) !j*L@*ʏPp!8ڌ5p+ avO52Tt.BhB}Uh)5}9Mt!Vv KkvPr̅j*TPݻBH6J!I XXGc-V,ù-sLœ)%MHvYa%ܖrե\xje]E~f_ +gPR1C-BjUZ"["5n ^YhdQd ZBd(t夲KE&$d郖 r1[|K(O 柢t˝P}f ,%xpբFhT!"YTi_m1(? CFr/P9.T4Kg05-7 nxʯ)_(b4Ohq~'D}6MK}:ֱI%;jV^x5i ؗYNl;H>Y~ qig[`I1ꗖ_*q74UXsex1jJEkaRR4" & ,q%sIL5,-T񯽥?}FPX#(]qa17Y'A5o`N,.h4Ys-0,X"g!-9\ן}EVHkus&?X,#+D J ޓmQddiND"xk&+gQ#7;)ˍBda_N,,=awg/6e=dDRmHvح(CSl.DW7->Zv|{OPXx Ry+Wt>8އ8.֫IcEd"giس= mƺkt(6pPmגX"/8R"K=E0jr5kPK?}qi`ĹELS'FΏ sP*5F۔ _`埛ov'2 (VYRdh^5[9k5( DFQ~uCk,ip }\9/Z G#"Mm駯h BcRR%;aMؕ>]HUK9_j9ۯ`!pB 4͐`mZiꀆjuʪ}DֳS!ݓ;X-YaūE֩XƬQ )uGˋ\JN6«aꇦtEd f+fGNg&GMخPX(Cl.AiYNw+|Ba 6Ep"|j:4iS?ʮK>aMRW1~N$af=a_~"wv:ť/B?r&t g"TdYw%,u"Z#,hu+ \H?hޣu%@SqlRWB5EkBfs'˒=p8/eEY0?_ \.0uPju`)Q;2޴BF[VP QXg~{UDa*^`_zIzYBa5wۈ,$Cp!aT.nkΕ1Oڞ "+4u΄.=]*4xvi̯22Yg#߱6ce=s.'DVO 1KȪp0kf2cՇ%ZYax 6cQ+ƪ-(%es9$;6oT3oVM͟Hd927>a}^% 1z93L&uLe9E6YG߁:qBpUQ#'Q# 0_nAN=5C0}uVQX'"kk7"K,F!t]^gf"V*IhJTm%y Zn4ɶr[dYKd)O}p_WPnSfhfnZ˞plY2#,/&O\%ΏWkYd/T-)TS*1;3&ʫDW`6PcY34xAdULMv+G%zQs4"K('X͟-̟6]d VdKXSSlUcvDvuq=9)ZYY,qv_h_`Q9gW*E2\ QױPǿr܀sх5o% j(wZXیWP;MFӁ|2g7 rKJU]ץv [(Q\_u:XXY(7$ꆲPV73jzONEVώð\id&Y ,s/lnIaBdZ%Kbڀ9DVm #v?[) ju:ckʚ13Qm+.ha$^"w ±sTѰ˝eSH'w1 ^u+4JdhCЙRD;h_j@aP cuҒwY<- _|<@g,&{6C^EYnA@IDֵaרe''pEVsN"X@RS~6~\>Dap9aY.9eCN D֩Y!8~ũ>,Cn# 2"l =hCw4=-F{8\Sl.# 3'_~N Km@O(,%O%(kyRw^ fr2n!"X|1믩WKo45 sE^=6 vPJWNEl7YNY ,Fn"K};Ed~Y{2GU^g7 ǮJWBede!ɓE[NT$p;n/UgwyңQ^=u|pE!Mc&(9pgN%"]36C"\ۃ<#*,Yj%j۴!p]"JYCaDMr S}Cyݬ8YFQ*/"{>j}8 勩Ə if%7C&m}9D%7c`E"+Um"ZWb,Kq[t\ =/~qy nl&n c5 宰8V"Z:X~ j1EyOW)(uCd4%.i8PHd)7u@aV\*f3qQ&[G5 +"d1^)GP X"6Y˽5POq{ (*ev/ nrr$FewA+ܕ5\CqX N9?~8~A)nަnTgQp됨Ia zue |.H'謵xK>?z?\7Ъ*rIս$.Z+,NQl&~?_kuĵx}qα"vK<BdMjþIk&˫;ٸeC>W+dm`88~LyUXgZd(Ȋwȓ늬 0D/e(UuԺOa8~8q|M ªȊt~/~O|C}W'LX?(, pve3>g{ vUxGo7Gz4"+ڰd"k Z,/5'f"v%n=`#o?E(s_eQd e::l&黆 .K]>'2i%_6Y "bwu[z*, l&~wG]ȴ{$Ώ'|yEf&K~it BdٽJm> D=Eln)Z}>}}a }p ߝ(,Y=Ld}񋟎_m`*E#&]}{uM$j3_ է/j؃7A5-"$Q+Wyc`8G|sRA7"% }[G(,-F3$m`*'Qdh `?\NW;`6Y%ߎvd^Ƚ:!,3ފaQ\NA8~q|8~`6Yf S9o,BѩYD,ʜ}k?<~A0{Il{ct6YJHȜ6_q:"뱐Wct6YJHȄ}}8PճGAd=<<7"Iz"뿏obni˳#>vY@;_:<< 7Y<`f;U9/\gMBB@df݆,T%Hbf0c,Ȳ@dN ҈,T%BA n+,؆ Dd"kkD͚M4"?d7š~F-1FZbY_[Dr SNi* w{lst" f8U}!"uΩZl0Ei+٢Vu]>JmWԯþQEcL~K7xENRv" f8U}!H"z cKpYߔ!T PN9l8@;VT"+hS/i|WMsa[yslHWS]/ 555O a,DYbS՗ (RufS/e&wzHR`ƋBɶn`aPO+— џ/]nNbd d*u9@i-YӗE-D݈v!R9 È)Y\nZo9G Wf8U}!B=RpemV%P1TT[r5Xq&Ygl*~^ mވG:e\v5a,W^Rcʯ/ >~DpBH0l.-YhUԣܑj({ayQehNJ^Edݶ楬o6֢y%t/۩}E+t6,T_,UMnEӗ_4uJ92Z.ԔV "K8aTat))4:)aBS_ BaF)|Y0Tu&,* i +g6kGYS㉲Ga +F{uuA!nm% 5I_MsM2ą^Z;g" f8U}! d+}(u57I)]__9X0b'YvG"@fFS+-(eD q$vG"Wf:bY^Am%A7E 4P lp anu!^f 3Q4%GYz3DV;$3!`!>2YߩJSKTYqvYПS" ;UI>(," Dw|`,+f!D#DAh~؉" Dpx86Ԋw`,+f!D#,T%4F_,@V\ψ,GY8t`*V\,GYߩJyi^GyYl ,GYߩJyh",DYqa i-@;;UW޴!"KR XleŅpцZ1ʪ 8ov><-VVeĹ?_?8ny]l{gXY}~9?0 '?ʪ 8/v̛ky3Zst_vϏvg+oϓbeU#/+~2*O`i8/+Gh`F8U愳:q~aDM\ EVkX-Ђ*,L`u8/+^or Hv*V+*L`u8 ۓY=! PB7yEjqLd{*L`u8/dJ]SϷ&ʎRg] -̆hB}US(_jXWΜpLȊVHF$gBpit7eTY5meS]g]ʾ$KjѮH*3é 0!+&X/K^S?j maG:R*lYkaC)+S`BVL&:^,Ƣ CF`^/ةKJuq5:"4_EI#dH9U&< 8b0Foz$F-ósrs$0U'ZXEY, %k9{*,aPJQNU 8ٚ_+x?#šPQD- :݋Z2)`!Wk)"SYXxQֳmtt:Y+~_;^sӊa4Ct S.cw]s$V>*'h@CSD_刡pDž٧VdUQG:h0SJ$ät]urTYQN'guԩ`R]ߦ]8*?>!64z:AV9M@V %Rs p"?uS6_vM`O2EVt~rVŨ@:h0M&Y˓9_'Jg&˧+Ȫ+ Yk:>іKP-\[v4GI s剀A+fn&J /IZmWs,$a:N9xexBE+Yp vt? bs2w E2&^48g! Z#VL:Rq- N"U %}x쉄A+QrRdᥓ2JVQd]" ¯S߆gT0K e {P~~ُEZ18ᜣSdQS}TY/z"@>kI}VOů:@ї{4a* H->" 뢤5(PD<> @yޢ8 ר$p㢷p,IS]ɱaJVctvREPXQWd,*\/÷@y`Q{ٓ(x{` èwSda)VTY/;!Bz۬MVO=Z15{MEPXTTd]"Bzۑh4:(A:h0 ~BVi6uE4&>5A+vb" B9 )ȪtЎa<.Y/EEVȪtЎa N(0j+wdk IF(j+J,;?4HV줃v #E7*F_ĺ(Z3YX(Z3º" sFd)_Yڙl)L3bSȪtdty5Q^͇" 頕ɆE{8c9cyht0d:&7ΗUKllllma(.?|9P^MIb_\7|MvFO&KF;F}VOj L3YRE֭/&ݾj~`t l.ѓb@vQXWPd/ʫ(g&3^Ce !؏ +;\̱F, dg)0ʫ5)g![^'߭4Y:0VZS]VY Yx2,&+ydUUx ͗UI`;6QdaPd \Z"kGp0EvEV ű.ǵP]dEizH O@" Q^a2 Qjaw>M28[X3e;k u֚\OAlcz (_4 s@@ ~Qaሬj&C d` 'Yp '|eExz, dpGPa!dAkC zr=L28Ck(u {:,Rd u&KF,G,#(`ֱȢԚ)ht0a<#?.S qLU]p0=>Қ)ht0aL^B,yTXRNAMf&˪W8XE\OA #E‚rȺֱW'z , dg" QaACUx MU??mh~׾ȚEvKE" cQ^AIVȺ[>w=,>5Y?([-qAAʏ 6w ?m|~&,XșPda7YdEY E*ɲ¡ڂY<ӠnEFB"k,jV8T[pYY/Ǻ|ac"tkhZt/"U.!" "t>0 Y{Z`Fpy5TXdqqnH;' ,&ҹ kPdeV+#-ֺ#,括pzq<*,TU$;V8T[ϳd>cKD" x WPdq gvbM?r˨[|׾/z\ #EE Dm`Ye[0-WFͷ~i@." }Pd:, :!fz؆Awo_G GZNRlxh~[v l' ɆqxJ/yrt¾]x(X;aVwχ,{"玛g920I ͙ZU'(v~7;~fڪurku ~O"Kӟtdh*863U`lTË 2r b aA$kº#[-v{j,YXY}/nRa"" WP[Uvix:p0Rd"_d"k#-Tgta뽧T܁$n%KV3t138W><#!R zX_rUQoCyeMc=.epXIR* "+EO6iLdEΏ"&yIMhF6ӁG" SEV[YGabI+}uL" ", *,Ǐ $2|1Qh/޽կ^ݤ {39Y C/nR: Y;i-On>:^uetaȂ?|QZ-)NRj"RkAʫ'YE[Ӂ#.OG,$+TYi[^=YXϧI5O'm or緋Y×dMPsE[9+"))TX?|\t@uV쐅En-x~ں/(&`pGNq*)!*,XPWd{:UqECvLNROvFSPJ?(#?:-8Yuc`+Zs\^=da7YdN Qa~'>YJihHe)H(38W5S⨰`Gʌ|Yu"k#-FWG<9׹w(1|kSd! TYgՊ:tt0fGu?x:p0RdA PdblF0rHēstaȑRAq<92(Y, 3U^=Y{TTdEx:p0Rd!BBYw8EVm '>:ΪFp%IKJ7)-E)B 2[^T,N6R̦!`o{@ҫZȊO؝TX{uu_ gx|J9R,!`{אZJ[ ǦHc=/ cZ4;YȣD%[ȕg Kf?>w%NW&ʮNVŌא.=,̣x™ )<}kax-_ cl|2˺I>h c3" `!ORv DCb~<28W9Rdf",bdmfEEu WX;Oڕ"kHG6ӁGfQd-u&²bkfV=Eu. #Np彼:S,_OɆ:VtUuH؁Ye-&3YRiYǯOv2f:ha$N`L]̪Y=LVa=駌" ;E,2a)~6ꖓ>"uV[5r;E̘8a~6*EVvVz>PdaPd=lTDXj3 [Y칶N^Q >l qn/I!יӫX_,Rd]tz,G:y/&K+:}TQ^DX"k쏋LU]p8dFr=M28}y^T]d?;/]ԲG" "ޠȚ`ab?Kf˪V>-((,t lc#GJ5 29vN Qda7Yd]yHTV$ L?|JR OJK5 ]iPd@yY{ՌאzCs)#ǥ\j?>=/ c,(EdJ?βpҜ`C?l1218"ˬ՚X_2UE0JY}YAZ Q?oaGl#E}ke&s@_Pd*zc,5ta[lR֤Z<`b k<"=Y&)xTYx:p0^y?RCyd]qcϪ(8?))*3[Ӂ#FJmUmE 2UK!YCY"v@+eC?Yv}ƔO)YKiUdϳ^rB5Y+ބWxvSt`a))) ާh|(w ]1qT4I֬ c3CˢȺIQdejʏ (XDSdu_mErqf)B5cC>?|"EZUSDecCd&ZY "KӟtøTqHᱤCaE6qPd9ey\PGF{% N}*R RYQWF"kRd;\0Ι2Ȳ6L:9#TJ\RA ,d*̪W"K6םx+9SF}D}xmYuTIE;Y PTdܱ͗@yȽ#?PgYc)&q0З*Sd ZY"++JwQ "]JX/kSr3Eo+:t"Sw_ܧh(267&?#T4Y4 /(nR:JYfYI*=; cdGYuߔR?V EYb2Lڍ[_tH"Qى˟|_o^& {бzb2ڍ<(SUX{0u2x:p`U]/^no ~\&DeߦPr 2lAxNLATEG(f.4(nrZd" #KvM1ia}X/d ;O-*2w0U)fuHCKoR_ɭ_EJ X\"guU5K,_-c!E?QuSYԁk3/wW}ۯ7կ?τo{}+7mLukQVȚϐg^@5 yZ?H(l_~{~Ư{__W ×lllͷ[geUPuqe Ț"ke~ݯw_S~~~G~ӛoʨm?MƶV:Cxm˪YQaPVXYܥY=uEgyy-/~Ϳ{ݯϾ?~Jw_~?|_]oط_o#OW7_'`7_±YnڲUK5Åg [| v$N_YUdɎ'_W/y3ySXjpb `&1jo WU Wpau2cY}N;;̐SPևtQa?669f됋mfUy"\>Ekϛ?SaYS:%Y.Rda7Ydg`!̪:D |e/)[-CUc>"=EV`pdYc)&a2UR3^/RdM2,stƚ1OA ecש`Kt9hT[dm'][h/"zaG,:,~0UKG"kA|F͜)YGYbZy uo[^ Rh$(+6E5!_Bg L,|aYSIK71UqО"kE,ՆfU=A9I%O*?-݅it|-:EyP.Ǫha=x^MeZٛ?᎝" LΌg"CQ5:X4v&N`mƳjx_(>CEV49x:p0.` ՑJ+s ÑOvv1x:p$[WN~>lۿmtvz!ZSdAoc>`mw/~˶}ۚڶݶ!ڶOlۿmtvzmK7qhaʭ0dF,x:psEWlllms>mCzmf~qtHp+Ї?m?ߺ c'ʅ_uҲN;Pb<89k6r`cc[g>؇,;>mtvzmmmmSCX/yz+@EE֟,ы66_soImtvzaKHBDXd]z)bA"K~H(^de3R5Yxx~y⁍mg?|hl;>BmtvzIu0m pDДW?|/7@K=oE3T͋EֱenPgّ~wYGz2,Ǥ9ʫgZ'[=?r<}h>OgoD>:b T!)LJjxV=\͍ƕ?Yx:@wWmϪ-qgEVݾ[t#XxV=C?G7,6@hK KYdɷ u+fzwwnK` `2|YY<՚TXߑnpfQd̗ Dm5|YN)fyM_XO8#KíZY e+j)<֮ϳt(0s+;&˪=W8G V+'.n}YRsP^Yc<w@|Y7tXOEE7Ծ淩 #!(l2Ugdj;ԭs+4nN͢F!Q^Yf?֊0T}:|Lt5kYXGghQ[ /}sh{OցtXrc<:*ܚ|}nz\a=#\7Y!#;И,Ɋ2ZmY;EZS0GSbz|ON7BkT`He}m? S:~s0UOOWIPd}Mm}g-F=,;\d̡d!L f< t{[E֮\ ,TX0M9E-2f'5ʫϪa(D.*:_ŊZmWӹ_Nh-:W2UOEfqVdAfbUXJ8uUIwt@)ʫϪQd+Eހ+nj.\~' ydqY9YdR͖zZł_ F HZZ,:+f7 k_v,ʝ-q ag<@f@y Y9Yd=h.fcQ5zX,RdaʫeϪᣨ(RVXq kgI3!Egx: f͵gՊr'YuuVUa=sVUIF108cY2;YGwRoL־mZMͥ(F"`e'v dsYtTWTX;yF'YiCy;ʪ0| i[ t 1U?E}ud>ŭQ)`f7eA\08 c2Ƴj?G-Ou>"EW2eY,BƳjO5U[n^ጧd1j+tfE֨Gx:@S Ey!gB~TdNfuyB𬗍Ji柊'kCb< Ez3bAƳ"ٟJ(" 1vV,xV =EN@gp~R^VaYsI"+!E1W0xVD~',AyUڭEV@`OP[YwͬEn&u^,vDoeŏ ɭß"?+dWpxV W YO 癆bX'ܷfh0`&WpxVJi5P^ Gz~x: @y ϪwEÕ9ymEyU]Yƒ\ambϪEﵥ-wEVևt"% fV^,Ud]RQ^Gb5$~}o]Sdsm\aqWXͬYbSd(, 9}Qi}i@`g3Fߘ7 k`UEmeȩ7۷'" Yx8k0ͬڪȲ\g (#+yaY, dY²Mk@6j:d /!=yv}A, dYjf64Xd /Dh۾r۾Y;YP%.zR&˪mHX0]it, Ay&˪}ןusK!}?}◨<#mmڶ߹m?BQ7p7+@cw~Ƽ7n/u9*}t,&܇ Л,ۏnnǡ`?+OŌ樭 eտ tFUUd͑mmm4Eb@+W@ɲ~bx3 1%Y/j~&K+cuWEe}A #&ip+]PXm1, \+(&&˪DK*3wd:u(&˪S!9pȂL(Ey47YV7zx4bœ8,XD%j+>eoy PJL G (Eym5y?ۗo4fQdf{(>&˪W8wc"i2Sd`eLz,^:nYX? ozS46&K+k;?UoṈs ]D B^h)lYtvD(`A"K8W٩ZΐʳTQ^F]dZtì; 5Y$KmS4E~ `uC+nxAD5wEV"+" 0hTVNY=1 Oh)"k& ],*,a(U>ӰI #ۧrt?FVNgLs>z Ți8i:_QaOҗRf;O]H ȇgVUWNxsH(fr}Z8jeBQou{B gGOn `>Y5;u%\pc~7EL.N avӷe@MoD8dG@S L(0Yu ?8EV>7p+p=PdT/*(gMmTϝX=/nV='*%$e#\?Y38'<ͫkT~[Qu{qLqwd! z Țɕ]S+JW)ak҄U f҉9+Q}D5+B+Eyړ\,{9ٖ[#-UT7HN8C+Yct <)"k&uA6k*baWo3^sw=n1w gqs=QdͤnJSy4ݟ] ͢hS/lcN]ɪ5XF .>z ȚITRm4'"t%j9fXhˊTU\p,0rQqA ؟ D()D!:RS6W*fojp E@ ؟GxծX>/\p3{[Q8)"k2f HU͇W8vP2>)"k2f'G &gUw3.2(&< _)!(`3 fUՃ5n:B߼Ȃ01mՃ~>CPdfrY^ض}jw±3'c 0@M?m_am ǔqt ?SEd,Edܾ9gU+SHsvz Ți<EY='7Y)9p;s=QdM?7WVu±˘\?Y1ȚxtY"-=&K02+q .Z^=LU)b7'dTU ~^qO&T?]p٩iJƿ1G*4Y:~ ,MV 4^ eS9{80|zcݸ&K02{kTK@ПQ>QjS(RUVa*z'˪W861y΁؇)ht?D䥻pl6+ = FY.0r9-&{Sx'˪W8f1szG4Y:޷R.N͂?2T0rW.z@!QiNQLU]pb.wSdEV@T0rEkbΎRg\e=F[84YVu1Pr=MוTc{Z ) z$zR M3Js)c̤͛2YVu±;bvoT ʕ|EIy62Q^*ʕ oReU+˘Nz ,`Ə 4+Eɇ(kMs#g> eʮG'˪W81vSwtL-o 3Fd{G):Qxt;YVu±t\OA6%),rW5gtX^lS=Dg w^ٓ@ijoW_m3|ɶ}ybt; ^p WVǖ«BEѦ=|>,OUKlFVmcXn=2,կEnV@n(jIHϗU؞|,Nt+˪TllllmX`t.\k\^=LU/6W>i:Xv( )fͪWC˱˱׏ݽ5E;e ,Ȫt0),^^=U;`RYaz v(Ty@V줃IYXi#L/̢r=2rNU>TzO'CdkO]5!)(G"]PM? "JRLQTy1\CV]ty6Zx)XU0`VƏȪt0/<CyBV줃yp+Y@[WdUN:%2/+=*`'LmB(cmxDyU IS3Ud M^ U*`'L"k}Nـ IS:YZy-sWבU;`jCH"-jaJO>=6zH}N=)莻7BdUN:ڐTZFy!WNF+z)ܩQSh\}-H5ݽEȪt0QT^uOmR( QʁYщU9xeW_mSX@ײȪt0Q&:9'zlv(~9Q=G^`-FV줃ݽvʮNSA K_Z4Ͳ;ȃPtTڞBy8EVRU^R!M!x;Yv *:M")~k+;/)dnS/Zé*P'& &DV줃ZGeB1֐9Ep`v4eCv+\NCR#h #s};j!vFKSqآkI,Ss;qf#.'ա|' w Շ'=­Ȫt0Qk*a_Gi(Đ]?kUw4PFm/tPRg̎>P|CO*`'̎0%+Ȫt0;`d(#vXӠr Ic1L*`'̎%;dUN: 3)+Ȫt0gAe$pW5!v(n7rDy5*`'̮[ک zR&_b064ȪtՊ,aS^CtoŁj1EdUN:XfKRʫprhmaFWBj0ꮮdP I Wn5N ÝʥcQrhorlDOEW=idxGV줃-{r2Lum:PRPn<2R3&u *HOx􏁩KuaVeccccc?T,5N22u:+6ٵntUToEd{Ά$~IShb6Ϯ iWӱW'_9kxgccccNPhL;OD w-k54MK)~9Tl%jE!Uu+DG'q66666Ɣkcpq(,#sU]j(2զ"%GQt>5=\;:,B6zBE㺮*GÓ8mtBc5 {v+6+,\1;Lǐ=fLCSUF"VOҢC\1KO]' [fv_>Ȣ\pҊk T (-GѐfWqŞ~Nzlܙ\8^98S*OZp^ex{jПʁC|j٫s/労pcN3ZVęV8PӹpNR{ބ0OԴ)"[qgEo|=͵W=#,_dQWF)տ|-ٓkQ*6KžZu` <;"U(K[ax@>2$N0#xc-az^UWh=K:WJ$*,FX(YX+YTXcPdP"UiFl Cud'6QdUuwWי AYELk`)uEV/iV«!>7H(QrT˺0R 2JY[v) B?2KM#F'{l'SSwʳ!Vtd`VjAiکo#y_٧[t!Q~Rm䫮 tR4ʀɧa` S6q Ne$ra3a5FZFFg(,PnS_F h)?Hn#TlEvnMTϝP>5Fۄ("l= /;m{Xӕg_8QXNev+aC=,tfϘApN픛m&@i-GQP6|aO}+Ű/-8& @O^ovj+^T K#fʰNèm8&_й*K>P*Q6S.hKTY@Ҕ;=Do/{8=׍Kw*#)@@]בOql&+wmvU'|ԅ+w( qjN-KPv<& @)jeO]˫\͉m1[f/\'ՉsYh:CIf{)@((Rpacʋ҄K\c/Ʃl#G:u )Re#ѴMR&3\5N@&,G iE H(*^12 U?6#`_ EVC}ſZAGC k? ;B>oͲejOܚSk)6'ut%ObMT53SOf]i*u9ufE/G<`Ai]kQFR;Fg;)R >z9v3 'ZBV4VruCe RU~gQBx:cẈ+S!*)OX0Rd, `AYEdmirʣ`JBuѣ>lW١˶ ́a~IGN~'H#BHNkQF( {\EȕH{+*CG.mG]lF TW.)NSVDHEVQ ʢ© )" @%FXԕ0r$5EHNX.Օ]=ْDh-1; ע T偩6R omjqY5XDQ"?" zeMYK«J`9ں"+|U3`hn@(F`)';[ "f-" e 5*n_*.0²HP[KpM(y0;O!D$l €Yw]Dskh%,I]ˎm1>Spݹ銬=F~UyuTuãe4!R4}hցdQմ5*K֏G:)_?w%>YaFmè4ݦZzߋNz + Ug̾/ RRK_ D;($5r3M?!Etܲ=Zʯ^ܦ2`.uuG_o%(X '*R} UҫpeT>KaSd/AhGyM'cφ |E#qԁW.6{Tȯj® >4Kٝf)4ȗV|gExj)R') nSABFCR#TƐ}5;u\j%V_jg\CztW`5g;ܯ٣9r=MuOyg*Mԁ2}?rlfrWN}xq vٕfbd60ap瞺K\n6/_yTa=M.!|5uE#.af`a \…ȧk;Pf5 I-{R)vʧ+ BQƩΒ갣IЏܿrn# <,!Ҝ+;>ӵ(eJ-{R^&OW|}O%5aGB,3 R2B8\r!s/D>@jl 0R~yҴԴW̞(}40ڢF:ly$5fO )u^*kT=W酤/x]9-@KJwj- b`=u:փYSXY4dQآaI5K}]tu+*:${?--@GXAdmR;\nک9pExE$'KT F wЯ)>2luOtG>兔^f*<}*<\s"9p*ZN~}Gx4-5;# ;ufk{F \"\t<he6IfOQnYէ;T ٛmV <$l&Ǭ?6F,<3'Ej5~}ў/ ISyjmJ'7i&'Ej5~}ѮڣY7?{4MS+.s՝1GG8)p!ʭ^+;<WqlʨưnFr;𢊂ˊ+jV_|lkm ^~EϘkQ+կrYſ2ȧ_VRA ^^dN9{:5aɮmN_/ ;ShN9H_ϒ >zf`jEQV8^^gO\GizcxE)W4K%@`krMW)ҭU@ o< h" bQ/ endstream endobj 15 0 obj 53705 endobj 16 0 obj <> stream xu`G?]wŋESR[;|;rwkw0s+y p+]5>5~vl߉DZIs%aܲaߌcdZ]6>50ϱI%}Q/™/=U)V XITb߉%|@dOV}ؙH;`lvtm.K(Hqb ,`'z}I WYNOSS6D& U߻$A;/qL2o>rvoPJL)ʡW%o].56l8M8T3qH:ce"w)3SF_\g؃X<* C`Y"hCʶ)m%wgI;f&vY{xIlhP]rBϴgM)NHڃ`7|K 5Q[s̶) 'd$ن'70I ;?FZWtw64HAzqs69ҿ=sxlT 1sհ9/ |i}F<;eVzӋĈ]j;'sxlŽ.1^.HQNɐÕQsG->0/H];%4&PiӧVvŻrp2tD C~2{̬.k9YZ5VO4lLCR˰ɕ؉J uw(NoQ߁]s`7io^o&l?͓OZ&b`F;AIojlxfĜke25Ρ U)E7Θ_4J:ϓ^VX]EL+ ^~Az_ZXiŪk3U̷ª&5^pWe1ˎ'8Xk%PsIע]KC{df)lW#kdҙ(ȱ@tj;/@m]hp'PLjGTnXvq$Pq{8Ab$vr|w5cG7ݸfC>En3lη4J-a >w!LOI~ԌQX;1y/^Fۚ*_thQ#g휙+Ƹ_3vndİ;z_8 ʵ=s\6?q)vZΩR+a靀,ivpa Y{ʌVG; {hE[n1J JOzMRx$&EaSXN_z*M[~/E_E1 v^|j RNdk-R]lg4%[U{t:Bp]Y!qGzSDIPاj/Jl1дT2_za RNSCC@h\u)Whm%YLtBIK}*HB }aMHH4ސic8x*x]Frn'7CXFD! -=M$&ejp^vz\(t>YjT4 52[c G7kY::( .UR6ץU +3] [F}SIfH)}Wpa'q^v}B MBYߤc05#JI I׈UyJ B%=!A iK_p~w&HӰT K?HugnC$4k/~KYFgaհN;yKfƎ.I];?;ÿ`p_,F.N> ;]5f윢莇tfm*pIPʐPK?Qèd^iNc2XKa ;[NqU9ðsU[tX$0֟h^H=d$br3%a@qQш*K~COqeCcGǤ ;˰Y~ nTXQ;-da(X8m Aưc$"CuRou׎SB"-dO5VD A$} /c񗔵[VnAOut&]K¼e6:QM&}I (ӱ~ӥaTS*';Vмo+CQCެO񵍠>)NJ?;XFM0_OR𠭻ye!$TXn;TlXTai @) ]dt-/ݤZI>Ŏ֎n,UVe5.;GʢdEZ*wFUNg8lKQR %G{6v> gmc$J\Ry"E[gv~fJO˿xU-N1IĜ*e4tlzG5%ЀIbnժSE9aѕlr:H&Hʰ#&aApMvxUW޴’S;T,c/v$=!{XeؑЈuJ~ߊ7?>i $, cΖEH*COkw.*ZLiVg\AZȣ$<2LkAHiuPLaK}@ug,u)ó )MY[lI-(2 Fi.15cgHKL#$L%F0cûpud$늗mJ?擰fk.i@q°3J < ;j$<(Iɚʐu ;X g_+j7pI+^q4P:I e"Ql{VQeRݧ7K)ib׌$'c$04Z0E% ׌Bd,WX*q5b0M^$Pn.(fj7 & aC} V1U2S<;'hDٳbSi'rThIIE83y6x/؉&Ŏca. L*=xXv z+N5XN/}&%AئlD9e1N"YUFK,<=о(ع-"9-9K"im$#w@cG6} Fj$1MUj3Eۆ_vF1f=\\ bؑ*JI<;>aߔQi;{ZcMm;,+]=v#$ \x)$PdCE?|EYΕ 6z9$ ).JD&SFIV` }6RrᱴZd JO%m~K+;R:j# ,WJ= ;'4}AaȺZ1vXp QA"C` AUI>v#1;$4G(*nVWeȺkEf*\7 *;mr&Zv5QԑY\nҗ[ <:ՙFdP6d0)haA1 SǎRɚڪJ N:BrhtSf7-Q_GfyviN1zT"*eHQia7rB4P*аU$PaFn"P{d $Za}XIT +"5l,< ;Me'F섃J[E4bk؍M^ ; Mg ؑBYGձ#mM֞@vL+V;dnrA!ʨNCUy^j;Mag+$+ż[9TRfUQ[1NciU$PjN [Ǝ /HN&1c;{yML;eG7ވ&/+50шOEؑUPUW!1J<742.\5_;@S ;ÌX;0NxMKZM"̷;r>ʚRu4$2iÎ6I'VCwvi/ڐ8v`^H*UkgBSPwa ;Hg\4eIvsEAv`̩:lNiQuBȦؙJs!P*>2VXϘ N, Q|;̮+b$F4+_iZ` mdƺ ?|"8mV ;_hw5A2GnJC?؁}/IYrZY"SdFd²w$$lCXbwbGfiT v-*Y4 O^ k#+ $CDiI_|F2<"1D7Zu,r.+`}G]R[1fzs64n;&ء .pc}yH5H?Y6t׬&XAF 5r_}:`\ ղ>^/z0t~⦯˘ )ċʈBc6gd!Ayd>a-WV-LRp@c)DѭYAGg7X ЍcnӪB;ѩAЍ&FV`d[_]DT&Z$G$7Yeإ0~l(sv;)Yoǔd^_]Y|a"܎7Jnޡu5&fXx4S 'i,"}^:vIoyzJI5ڦQͳL?l jYe:AdwI |"ML]rYP$YB(v?@=3M]x.GK8:pdE1jq* V C޵W=c9޳xSk*vP~*<Gˇ+A$0kh;A_,oTXEӴx=Wopt"OZqO-i)dsVw,ZzOʻw 8F78*'OO.\JRR[Wgt|r%d{JJzZ@#.VJSO;zd4U GRlT/(ےүLOT~jYoCTzLMerC$M6Ɇ쌔cҖ,M, l MƜt8u!˩enwGi^I}ffÓ3~C&OEOKue1w͸LՄ1D5qrJCU 'y1-(Nø%L̋O$de@2yԫBy n;.E}Wp{UYzɎ=ebK! ob[LN۪9<ѧfм?&=7oͨma}3wjs*C%D9p|/8lފi۶3+*_mѭe^SbFxHrN. ][6Gn$Hi[W˗/+*c, CLT> ?fcQLw yO,..l qaʭ(u/\\\jnp C:wkf0vPs!oPVv2؏Gu7&n`5#AyBL%Wv0q."V7F!Q@\);CGtedWԏͪ̇pqY`Twg&+f{s?Z%QF-3~ گFkL2ۗNK·( 7|ʢ8\_&u4ݹ4 ̪_'wR.~I}K⺪%r-4\\_g s'ı;\nUUn1~i"Βg[ܝǎIq8G^5@E ({꣟՞,y8vLc9P :z V? YQ֞ıcR;Αb1t%ːc? Xi!wO,{wZ{GcǤ8v#NIW*C p*ry\/q<;u] t: g-9wʵQ޼ 5$͙1)cS .+#+r4ȧdkwb vBX߄I E~O>s!0zI C6I$'%o8NGI׈cǤ8v#NuL4^Lo:({A(""΁JB`\ ߚ7ͪ-v)~̓p)Ny~NJO8JWʟ፮:pSH>S:ӷByoqFĦ%Na8vLc9XT|;Wx3,"Ax?Ix=:aY3I K°RX{0Â`{jO8 ʉC ȂDGZ*QϿ%6A@¾Syls!q<; _~&7n. k# j,%^LaYtT.X'QáhkyRfUHvTy/BP7Caq22%q<;ea(#-1{ޢ (xLcUC6q٤xK ˿ZN-lpw"!tP#kiNBu`4٬sNS|J"hRq<;؄N*˖*VB,ՐԝRO6 !xaK-MaS!4 gֹЅ'M F9XHC?l +HsGg@X!4ìvy,vd ocҕ/A#HCP fE "5U*_ j}A\[S&F#t,YYEֳZCzGk(b'c Ӕ8v#N֪rhsP(d`^,dp/>Gqc%MEnm~sAYG=QDAhw1c /ҹ6z5V,Wx֎p-v* +Yc{:9v#NAJWH*"'-נ0<-֗V6gR޾0V&ҕCzcH+*@АDX~f?8H DVq'TNKv5p8G|0 pDXgM(#x @ uJ$e dLgoVbBhzpt/.Q9jHL͸[P!AoHPW} p:-v Ic9LD7mJu;Jɱ)%|wᰋ䩡Jv 0e:8#l%&v Hv=_/rGEwo߸zqkOCv}:_ρtΠJvom8vx^k |3[xi_z,ǎs4kSJ/dYV_A; q5vz֪^RK.=~[J1)culǎs9}A{Rݝ͊ ˕mGr8G;֓=.r̸xtƧm;Wo2ǎsı`'m;Wt6ceck;Αgbi3[] 4ueawm;ΑgbVKnTlc9L99aJlf{w._"yo˧P7 qT_vv9v#OS&w3mg u*KM'^+f2ǎsyw>(>uxoj˟'kNXN9v#OSFUiMQqU8{@X!>Peף;;ΑbU:UnHբ{G)R/l\ԝf!Yŵt&'$5)pгMf`3N詳g8;+s8G~prwd;QpW؃H?2y}>$;9lzܺI莥Ivm69tISyPђi^; ՂF'{(Xm̱y*v\m" = 3߲fL}O?u2Hݟ>UBd&PpP!؆zBw{vش+/]!D/=ې*3]8Xpd,׃9v#OM@UcU?zAN\aP[0r'IN( {QYVNQ0,NPh7BO2¯.Etɕ~P6>z^< `:ceSs hS_5R(ցp%/@N৻ZU)lC>P[B|%%?c`^dx1z8@K;m[ <2LskSh?#hZ6)t͆,5ص'؄x[ճXc9T,d7uT;) (X+Apx*WNBg]z ,E "J:tFB b˟8(iZ>J͹cŷF#X[$7NEFssXc9T\xlIsn.j3ƐXی;LnCI 5ZCG,>^H~$BodςxJZNe4m+Tl(aSWBͽ -C;kEu mI_tK, "7[F}χ+j2acORԟNTeKrG'@f2a.V+s8GsT~M l_u:Es\cӥJLbU/a!oBQK5/VOb\!H mZEۛ=NӨ̒y[^!_~]cpQ gPd3/e \PlզWXvcпejq t:ݔ /ED֍ ťjvXXZ7~-cDp.^Ϟ'B"_g9䟱Xc9TxEAZ{/$<)=QP:B)-Gu| s2C"ݟq /R_#d;[mRũ.R ՛{xTIϯ(IB ~^(^JQ?ybw}b@4vvS()(}֜NTUA8'$jeF{T0Tx^ٴa P4nb;pm_K :mONB4Սfk9v#OIVGQ! %MI2V6T/+'jkPX̴ⷊW.\r6t@xZ_:+M[Ƌy{)4t?u,cPz}TfϘ6e'b(B##>[GD4mVRLC%m _MtU'k~CQU"dmQlto/\bQHnuFݏPd).^&^P@aWCY]Px /Za̱y&v7Re+TV;<\Q0!߫{t} p'8LNj!ޤQ'ar"cmdآjs|:i ~$ ,Fq’ 8AiiQmR/x/Qw +5/}?&5u.h;o3Q-Fv"Ё6OlYqWt]lTE~,'lt 3م+qϻnƟϜ[/®ḠBOV _gfce3szAޥc-DH1oHHƴ h榄ɽ!}޷Jc;&Z.ӕgOpmz6tL=.dJMȆ*IɘFP60$$ǣy 734ϴ8-ةWs}(ZUA@V(<ЁyPe-,Ph|9_HA ˽>ahhkM1@Ӿ$|]  DvB#4 TEA5.;{2&Iw?R?%+qԫ+X]w4+s8G}1N"O8sF~SصmGG 2dcb[z)=5ը)܂$(-eJBwlԳCUlrݭUEHWkf]Dq-{Ѕe20ڜ-M̖sߎVUz5 9~_1?C;4|:+ϛFF}-J-dg7Iy[6+#4[Ui'D }6`  RX>̈́JoV";QCq7;EgCJZ^u6d;rȀzmZ6[^ܖ-#bFEw=&w<{p15/z/WښK%/#V;ڷ }ާXEl uHYj.c mVUYarq!`[x]KEe$&itP[PcҶ2Z9v#BKLk3D8&+:&",:6̱?{5ҝs[.\?|qQ-@OƏvG:~pWz40 4]huBfZy\]RV2ǎsıc^@vkz7gĉ ;rc06P{}nel;ǎYBA9qGt2Ƅi2Vq8vJ7>?fJ>3]ZhS;"~W-;ǎ%c[:{vUhķ-Fq8vNh2Vq8vRqz٦ű9;gItW\aư Ұc. ;o*]ڰs]z$, ZÌ*iXc9rvnWA| Kq@-vj+-a)]+i2̫B]ܘs#x\8f݅w޲4S)ְІ$M;&*4ʎŠ S d{Xo{X)o̅mF!|;Dxm5fA0R@ Bba%[1GaR`,+s8Gf؛HAM^Վ0EI{X 4;TK{ҨЯ6{Vk$Yޚ[+j&ۨPS%ư ;qlӒ'ce {ɧ]avj ]%la6H-l~ͷOKNk婋?=Aʪ9-+s8GN؛N B;I> h䰍Ѫak +VG[HÚlv~Xӭ1jaͭ޼7[ rr0հ=-p`̱9;r8u"lqCgI!HfXy}ֽX;!#c9;{z㔚VCkgyűMj aXAعXs:]Y+!Eygⲩ (`>AEܵm9wcG԰N6m tzs5s6tՈaO'YXDY0zW%M҅rvnt;"7qBWPp΅5&U젱fI_ll*f[e)ٳͨ qcr;qgErvHR-Zݙ.mRǎ9ce`秢 T$ˮ3,,^`,&MߢfervNQl_<;ڤsʎN//ʴM(ocЫl)`N_#֢ëyvׁ~ى;pLh 3ǹb)L`njCs.#ftb?ۜ<1%4$ "''M{DBs\%J 7, _K[iOP$Ve_̽SıcRK~;D;|KP3 ;ԏpvza5bm[ ˌ; 7 ٖyw;X4 E^ O.̠oŢ@p5%O[ʞ|| i+ H<űcZ1%Lh} M#?4&Ѐ}Lſc0/jT˾SıcNZ[ҍZ_(`FZ@/Gd;wʎR2Qv;J 5|r ٦p;Pe0L؈4zLE1 "'2b՟CZ|ջX; &; O*҂BǶ#N4vPuceG`DY?_ ґrJ;#4`j 9#̨%dO <׉wEO 8``Ý_Nv yar8$ wq|DT_p-ilqCfcX90on%=x3g2;C+FgMp}sƓސ`h &m/JxBclcG'ѦOT03ktA&N,:6]ztZP9ߜ"ufs4؀q4ix  Ie ([MX/O7$؉}CS).;_gm* ԌN eK*,fl+$?)دcLW7aP:⑫y~J?{śk9Ҿ0&ڛTFmj ` :z-p`{ǽıQ{a`R;>#?7wXnb"بO aV>n9|Dmݺyժz.͑ i@SI뎤 tb&()sP%SyVhc8,r/#Gӳ_ݝѨk2;HaM(,3)n}aÝB߻ukVW8`2:'ǀ8D ] qL;UdR+;X A;>:#ևUhOJrhC'ژ0Vvv>˝z'`GK9lNT r\fBuwTıMf;Љ._ bZ+`GKyQG9ӨSgux8v2v|!QRM;GYĽ~mtRj̱9;wޛ=*AQ>k8mҀ4Fbñ9;|)oIY2)nǎ6iXc9rvLR֡ {bij֢&̓gm_l/+׬۰?t3ntrߖv9y);XIعq['Ir`hG <;+5mӰZ|NmTlj49r-/-p>v<×r?K*#=p! ׄS&#ux$cϵ^,&8AQOѿIɴ^Ic^l>Bdf+;;;J;;=5ヽCDSM]!.^6=1P<׀BX[i=OF_/s4v1M'gV@,^lVdbv͔{{FYc",Ԅ<ݗskH5bm5+;;A%(}Urvӵ=SQѶ ?pbQ2FF}_/"k7Vv,vBրY^G0sB};iXc L.u|+ňxeƙ5j1җ>گ Ό٠\qrTěiu6o8]/yZ˄|sμwNWa~bU "D~~PyM{o'̓,h530^18 })_oe~K('k\Z;ceGW2@5(b*u\0B3^/J &9t:i #Ӻ?^y"m}/Z&B`> YejPނC6 )]{ʡ [;|(s. OhwlD6=_\Qd xSBvnQx@?:F-3z cGohtbȅ@2(~2qLLw"""P A: MC<3'oSyBkjbL'BwBP[ i8w^]VV ũɵ!m?!4z]j&dY^3-I8vխv hoũf})KŌ6oOulAx׉\?l <ކ%#q+;T^lO}21x~l#Qquu≣v6lng~)<8c y)Լ2dZ-6^qo;9{~ yɃ; g<71嫟PX;Ʉ1)'Gqn5J ;/A?nqBO36U 1भ5tեP{ua|!̻ #F~:KGcAbM" oE6opjB&6^a?;F`r@hJa JӄlƗ7DK;|/^n.XNW26^-?|]hY^h&DXiN[3\( nVQ{ xs00A@"wRύe8Nv% ]-ve: {s-kBb^tq. }5#`B:oHcb#is.Oq%N8;xd9dw #~MWt;;eQ[֎;;;Ñӱx6OGA/*~ҭj9'tǓۻwT,Wĕsdݤ}1S6&&g*3h0К(L8h⊹a4T5H.&@<#'LwOzWG\2cCQїS ?Ȕ#6 5~Ԕ ulߊr MkenX/?J^ƎuiIcn} T\Wt88fĐ,vFޤI3OJ*/Sr*+{ zU%vvT})kټ{~IɿoLj&]j>Bu vBW9h@ lLh gXӨd5vP8C3 B՟MC[H#cĔqkeP&\%l/kljGKV\6Mh=vyvWlsSԞڑYO)sw`EGXtކ;}DKsaQM"E v&B7^6s`mv˷oN C/垆`o;kϙ>嚻saQq;hLviʜ ׸Ƒv|6GR>"Vc})׳ e|4a*PBj{ |ʐnU :} )*%]5 u윝F-Vl>ẖ|fs"&sqfV;`AV\agwL AK.,tAejU.._o(x_:I})4\fy%Rέ q;\;_gTvvN1f R^bCqM;S0HJ`'޳x1BJ)r)` 1`'6vQI'A)* 8rd;g՗C'R]C U4`޳99),v ߲DA}ln.tBt_%JrKLE>sg1p.-z޾}0SKsyVvCkٓM/;U|a؉<󐉋x 8DZX>رrJڵSn;O #"YQΊ4.Z}Z&;spK tjKaA(pAWM d޴WB'LRZNΙ*wkNuv"oS{꾔lLdUEQ}9X@c%vq/ƒY5:;f!:㘑_\#眡Rߟfq#v/p]//es^hT;a9ƎPm^c"B&C?iN"D?~˥qvpOV;}C۰Z+9LݗU~zJy>s j~o=^X]8t rA|kAo 9xȱAou6˺%@cșnXs9QQ^(MvyRزJ]2QMDm>K0`>I!d ͯiMAhIX(4w^A]Ytv vbBؘ,7a~ SHN՗wj߼qLֳTil3V&U\XFp7 w`J>XgYKAѲ-LqYeGj0ONtS鿫C܄6<=TN ‚Վ bi=zN5"ٝ< Rw̚2mKqrįFOSTT[$g^B3tBigӇK`.Un;WVՎ@dr=҇b'-vَa,`n˃KTcllNnŌsC»ˋ:u;#s ! f |ĮraḼBɞb|frɌ0(uN;ctm1] {ydCkjllԃ2\i:rzkz[wA{zRGoOA X "e;y]JmmA 5NYvR67lA?Ѵ0WiݎSs)wڵjTٛ];GO6;(Asv"J|CxO#ǿ$a`BkR`>T#_fq'Z ڠrg=,ӗsC aM7`g&*y:z رXuda\2F uF/ա U)a$S畱I)iedX]_?Pjq|A8%]k(:)vi9jS֢(O!z_'X$U6z\cwV vl3V6*&Khw"ѓ.c[M)VdKYNĉAŬp)IiRlEǀ:vΧ<ތ௱})JK]qiW^رXK"v>{*P9oۀ3#pyݴB:ݵ{E\CK*Oi;(of[j_إx4ձ̧A1s\b)sR`gxz;+knüpX?3G#ommJ:ЯL$S;/YUP/etk#O`;+?dNg>[$T ,yf7M=Gy;BUxkMy&:5z "2dojhDY7RǮ͢U})dtajzjiKW2dhjcbNߤkߪ:{290ldG;O`nH4FP!RtyET{snwF7]O캧sᇊ넵v Z|}Pm3&c0f89SjLlPE5eѩfR+kw#| YzLkc|)]4[viV1uؙng5;aU;bl\ ]OY}>w Ԏ0hX޵簰*'pb⏆-As7'�R}Gj/)ϖ4֙kڟ_ 2=کK٤$P}@bzER/J9eJ<\ ;Rj-h˛ɒ/|_83Н̀5z8hIKo!EOO_KM,g0 9A:ǠʎM EfAU`˒~8WP|&/r~zosNqmWS#ݻSap뻷2\MkN&dPL4vl2Vާi'I9NdVA?h!ZTWuFaGC`s g4YI疔UJ$jg _V6Z ,:0jީRZ*)R;]-w}qw)Pܡ@LH#L&w\%Kcj 5c{>ѯ|CM_VtI>{^%%&*037~[0'hrmk𵂖Nt#̂0Դ(]fԲ3óvhZ5kT^j>K Y= rv?ui)}fsN=|Dס\G{&OL>z'=&eM8~m4&JXȮslk%jAY,%ɼq.Np Ν|ǮWNw-MT}r(ܵ"%F虷8MECq]%OTqEIjlز4W4bt7}欘7!.*F)/ڤIf[lY[^ڽW84ۚVRցS}65"f* Zvo߼a Az}𚗈z%}z5gGvNnazM_ +{ O^#) .\q{:_P%fz_`wBF{|{c6qjY_pyC7lC`If*I2W JT"qOYM7.nj)o5:v֫_YaRVGXc,ک>&OO;&&+oc:@䐆c :?Ge%x\=:T0bï_?yTSkH=!6 ʐ?&*d̆7Y^{Xt[{b_*$vxyEb,9rmU 43;xywfB.%|BS-}!M^7: RpN-<&꒠~ZS:bsƏ >NP Fv5f$,:>hx[;v&Z~YHh)wPwxI#kC;Oݨf&E;z=Ҏ!AMKV?5s> աן]|ZhLPrq Wpd@ٕ_/^$_/{g v/en46[&/tKpsWti[?j ORvτC-Vִ7+Rwvx խC3:s!ch6Z r%lE;s2ݤdePLR}09}\<^jv(hETtə_sf*8qgqIF[js5=NS|(;>&u \6*fk±NW Ťh%4ܻ$<p~'JV'iKIJYE,b!ôEN;҇ݡŋGGz] E9 , kp|E":-~ufFMR2ZqpU_m/^㚶 o{u6Ϣ|nWhJeeK~l>rin=VX){̼LL*)Y`”zwl'ﱬ}xY!=Y-ƊZvS<Eב vr XH%L=I:N[TPBرOp1LҚ2RЫuO ዺ˥ήOZ0$Y9>Ę:,vc~9xWT nj:ޥc;]ZW{w= ı d*>t4gl;veEjAYcկ.; )G;܂[ ;VpXf࿼= j[ Fq&.V>[KYSV.^")WЃ87 ׭^{G,|&l1IdrA;{m]RvФL+b8v椴sk͚KFA;G>}.:6%g+]Zʺa혭IՃ4?휱jMFCvj[ z(J; 6ܸ8վ8IT0vЖ)+! գ?6L2O%: l`x仑K^fHig#oLS 9l97]P ߬ M15Y=8UZkAdfS-e6rN8)ZɪBGVBmv"oVhl8F&C#@AeƘvl@;{c`Ό%ϐhDŽdK"9~V|lNڹs$YMٸ}x3!:y]Wg *%Ʋjn(:h'bbl@;.ۣC7sGIfZҎ aU{41!/ZGі X:iSXX[@>Rfc\L],O1NV7ʘJ(}|3ɪ@.m,?}>~{>(yZW}.QW[}`64؄1 $+M?#ʊ3*3uFcf,?e"&YgAZlD`ƍe=Ւbk.YaβRbd0LgqJ>L;ŴA;[wVaO;&&+rNB/|H4hrZh.߱Z s ڦB=ݻwnߺuI8ʶRf#AuZ~.GMdLIw()Anכ9W.uX (8" 9qŊMlB745&~{gSRt[.}bZp$J\pP7{>[.?!ˊqK$̫r{)k%"^)!`=m_h!:;*tƳ';d+BJ\0xQiiԦѝ;aa)w{-r\i'"k?ܟ|G:\O8A55LqJ Q\GT/Me &]/,d+e)NuUᱛRh?6Rpk+x~Eh&nL}× ׊I{mY{'Q2R.#ylWAMiAĸ 4$59(lyivh=; Xvc{N=7Y۞ YA0!4)RFg5A;ѣ]'wh0hyXXXSeW[]K H_gWP!h'+G@(:^=񲚌y $.T`V˙ǝDޓnMv/\ |餗c i_Ý^L,΢[Pt 7?$09'=>\xovYQЎoڡ}6]j!1XLKS~]F u O:ox?mt9+YR-,nn/|IIՋs$OjkԬZ]`m-N0<4E;& ^l2vXwBXwRnLQy-q~܊.$-=}2'og (.*G֡ 穀g"I8 QB5lZHlҾC/?)p/?Ec߾Wd't"i7 d-ȴIrm^he~$-KnΥW:0j)QZJPb‚/~vh3Hm_+% <^+J;Pg܁'8˾2{K!*`ޝ[7[ʑ>@ꛫEqcRY*r2j-ɌQW@rs0MB;zӧo~0vZM:eI'o$ꦹw D;Js[Lh풅gk,^^^-e^ڴӝbvNNFØN Si|pW>ZD7q=kosQ4+ (OQ v)#]7$JYwрOC:Hi?Cn8p<s-U,^&CB;a`1乒.Mk6auMESn6"@ǡMnlvq ;u'OA_[vr?H3RDf1eYkL; EdAWNP`g*i!nVx3`,A%5sGc1셩7S!CpRG1ghוZ*a_I2 ;hP2W#`5~s@qL: 9#&X' 4~-3yG5*m;5,߳ME'>hYƊn4hgvI^ೕ ]M8RmG5^;ipwR:!}z(JXv"o_2CS@;d4^t6޿m97ۻbN_Uձ_]tP&PnBН+*fWzG s&>iIW YGr-N\FRJѠ.߿n! ]IMg7ʟa>^B=W Ƨ?i~RM=AG-#;)=;%V%DXK@5)L "C[#ĦooM:_V;4<ȵ5,6pbL鴃 zQ87{vȡڶa%-[ݱ:"v sx Z,J8.wU!sHXX'X?} AD1 +ǣCeKj ؏1׬KgNƎcI ccNWNaVtFZ^kؙ`=ҏcDxqL%Ji_efo+ _\fU3':\KyQjiNRD;vtC߷maN׭Z-yؐ>qO,}x^YGc;XQHh YׯX7za}ݖs6ϮԚMCJ0v2]ּ,]+-ҎjYdTc!g':ߘw.4~Ä9&F]i"v6\xp2,EشWt7-=Vxa`-ei:MC(EA:vkŮXܡc$XC-exSHO;oo{>܆}eZ`L. ʬ3-Rؘ= տV÷8.7+/1j]ya J4aL;rtkYNrqDoDFHr԰G;#oM13Ge !jvcm"󵞞;+]oΜEt]Y?`N< VR.f#R>E)ͥ<\S6^.ZR:'V-ڷ">i.W|mکU&<lk]҉f~Rڃk2NNdXo% n߾sYSP}\R6*N/֍XZl$+8={T5:v73a Vu"M.$ Gd=xesB>q\栽r},Qe5bzǵD[9,n&u{_&v|3*:&6N}(e،?O!mLR5vr{SNa 3ZKΰ$ G# Z2ڹG:`BRzYhጝ[9UB pڦ,VZ.;򮽩hIyhćTἡvZ'IwN.aюF}zzZil`>_۟z_F.neV2opq+P5BAp0uډ*ThF qGE*檏gR# 'jcYښjYZ#߇ FxXSK,=)2zi6k?6G.YL$wxZ&< S0ŒqҤ*@s![8TT«2`F8jVYZg6 S rb0;Z 3JYrPA{u"+1cE-DՈo4>DGUT*|d+ khB/,K۷o?*K[YF;0qڴS&O4IkΓdDchNJ9xhx`N>b|!#Dk Ɯ󛼜M ?n;]M =]_D]̩+ʹ?~Y^leEǪ2%!Q?S<rˏ~0z?lؼ k?t5iݧ(tM}JdvP_-F7CIP4>pLQ=FAj" J"uwտI M92[Rk82Lgx`юk iǓ4]@2F G>͗}<sFL~|& k֑$1H`d7r/N=)8by;`ȯGr'V|ç:t3v\SmxV܀Es5\eYwh 7OwY{]Z&4u>ukb|r<{^7^Q֯z/*AK'9DI%rc*h$Z5XdQ7ApݎC/=h"Tf&S_çwRn 82f0 ^72 7Dx&>_Ϝۧ!@$vA(zɏE% Gk|4Jo]9""]i iיITAOm?.wd_t/n3vk.pkˑl=8B腂/^E;0T}F EN9Gt'=Й{A:~ wcSrS(9rmP(Rn n8G@sߺmy ]pgPmA{U8oM;.ܛI0!&9IM,VQϵzu5j YC}osM{y߈Lz6B]od洙Vu"~udVbo׶֯  G~!Gɢ~I'oYUєҵ88w8$':{ S*[ݦhI'wUOR¾I?NVM_1cʥqi'$^ G*LM5sX_X'4b|'aoz)8nRA C͆^-e&̥G!oգ?NEdGݱRK@6/?!zBƴsL{,٘#SoMRc|0 GʰЏ_vj7_f5lTt.ܼc{ޚY ;~\2`ºrF?c\g%v?V~89yf\MJKV)1;cj\]kE q FC̈xʨJ3MՕkB8?QpkNH@K/|ŽnH5?\#f0eravfLgfH:G,Bwno.}Ƥ/vN97KA;@UI{2>*}{oٗw|_?cF ЇX1}&$Y9&;u_ȵTl9Բx/ZZ@=WUЮ ~ZXDk K&=k_7zHbHjvEa=#iKĔ5O2-]C'B::h:>Vb\aPhN.6v(@o7E;_xjFKY)r&VI]qW}poMW8bt\yADKY;oC|5K`@yAvA'#/F-ڙWߍZ]Ԭ׸P^Zӎ #-.S[nv69U)}Ѽdm9휲si5ӧnvhSb SD^·4d]gHi Dܱg;`ڮ{ZSv>?#kYIK9M lфdUiK"S%15SN;hIlyW_F;#)"d(`-I7]}yXQm6%=7~SvB#J|?!SA;&CvVdU$==}gYVROOm y~eH8{=v8$i t$8+8:UD'|%B6P`0׍LUVk)ƙ! څ?W}M~|:ΟB|JZʥy`jga ~S.ry6@R!u*IAlo:S?kgh%Y{5WtHꠝϥsUh7Ix,R֡a.ėι!|Q^,*~=sTv/TY}3-sX>G-}Y}y9!PoXU܌o|R)JXCY`SQAx r;,ߧϘ?km9OSP> (hք P&6h96"uNhƚ5 oA;oSƲ}ZLsyRtp22㙪L_76<DžsyqyIrF:љZcTθ 1!4.? C r_h1lvѻ}=z$|v2g쫩gLwzHyFJCei'L&M5oѢe+:0 ]=~Q 6޺ ә.V/a}7MMM-Ң8 A.A$P런i'jRkr`rj}R?9ǯV9mP,RObQB?HУP{|Q[$gDR]cUTrj؅sN#L8/VRosфws׵a;W$G3V7³YPy]e,YoO  I.SΈܫەiKoܺc)K<:/с;NV k|5YgW&^>Md Vk>&&1K:Hi'c;p'YiGUЎeSQH Hn6t`K; |#5V^[DPDOSE@/;4C=H#X uOIL b[ $|#{qp}-iP{f[(mfQo $fZ}cy1,J ;뛥w;)/(~ z)([BNwkFFFA H*[F͠z&``!&-2 EGM~V$:̚FLȟߌRKaRBWH[ytt~A޽{7md ImOZ`/V\ ]_9]w_@y4)?~<ݺ/gvF%7%~*08[cUn"Db$D?B>ld"q-@bGe6l ϯdWr|INMʲRؚh`GWb9ѕvráz liG,&i)K\ yzt[xO˸/1}yO* cϫ [ hzM)}(j;oEwx@ O s?L6ą 3a9 IPolRɂ/ȿֳKs4/ԿN[=/8*qW]SJa{|ZMcT͑ǝD_ ~!n\;Qc̼98Bh)M}ԣ@<;NQn2U*B%!Ww8cgo]GKyMpaN5 /6shMe.,,V |'w$U({fR HW]@BNjBO͹?QA;䖊9hg=k&^_I\O;qrZRǝ ڡ3ilNQ1pdW8'0]T m+S{ʨO^=m=3.983~܀v'eUc^? vNna0b*PSj\59}!t9 )5t0)x/ڤye 91v ӻ0dQUw'>0O߿w۷nݴ3ҷs^-H4n(OcA[gonu,MzH>kAI/*AI}%^ fIig%vP%7?]^3qA;iGGE{KnT?ش \QFXkK;I&<Hf7qoD$F> sj%tڥ@>"T2gfJi`þ@1F5kqG/4g7tCm5x͋ڷ؉ 9b"3r)2ojr~th5]Oi'!$g'ď{5s7 LV)2 RN%D_PsZ@grn}ʎ4cCvX6ݠ2b[1GYJ;9ǝL.ؖ?56E:hg$Q1jy9ŸZ :|;S\ߢ!n]m`{Gs§-1jkF0JGe8j>ܿQS:vO<:G Jiqi?݁5%}}g!4KB·Ge.=iԷ!ŭi?W{(ڙOκ -Xt:gǖkWҢxn}|}3vw:yiPKY5ƅsZ)I"6]kQ%(v( >n^ l}u.ò"OA1@A;!sj7L%CKM;Ud %4xq.}`,7Vвfg9ܻ<Z^qt +DgCwOu4BeUIT\o7 Sv6Yӎ}eğS>ዕ4(F4!X*Fhm3mhLވ'y<\s|hwA-,t4B5U9Q|NfW)źcs̱|"f=3/u@h'NrFghs+0V:v>uD/^-;)yb8-:i'vT%wZ.dQ9tĞ8z tuU˹kBےg|s;(#5Mj1jVlHχʞzʶ7Y]D?:=Z:ƼQqS#^}S6Y*n}GϹ8I=j~6l79`r3ox+g6&dv&]?\Ei^\RrJ*VP|rʖu]-/˕Dj~+8-c)J9eHKI˷ TYj)P/:oFhlI,>ZR-ٰev޺Cv:|)Yln25| ԧ[ܿ#q~RO֑Fn;yqIF[D^ + +jZ,Br/.XY<FZqv?/Ty͈ 2YKZY, X8 n>׫jPJӠ=P$L4b*e>j)SDS}n^;r\wjF-WkHOF&[&iͩL tc !DM~8eY%t6}8etu n/tpo_{b(vL=QQ?T3.-GIK;Elٺu۶wܹk݁49=Z1^ƣ!l˲h/b! 3ma.dY3<ZAt}$RҩSs7B՞#H5XZK#=Ҩ-t=&ڹ%m3,,۰楋F+@GQmjfcu(dz -vPFJcsH[7˾ϴS&MM e$hx堃vTZD;+|I+y @N;hvEr֚G"4/uSI (<$UÆEtK+ =QA1j)ad'C;RD@^f]i[ U7έMVCN)e„|̨Izb ,{̸/4 /3~S"*Aj)o=_ ,Xp"EFюc  شsn O¿vM`N: ;_FjGq d3oZB".*bzmYiPV0s9 pA, ,L;a۞ly3 j ڡI'cu7trtLjF<8[O1H.k3j*b+@|}ZL<)c[ÜsәB۞v`2RVɲ!\XC& =;d{ R(\&NdݢwHug9c*bgj/"}i7Xĩe,mqQۘmꠝѫ0=CK9aeyQfN¥+߃v.Q\٤,eTh{35e%A|]KlSXpҧ4uKsVrꠝ›Psأei';[KY̤_+j 1OOfӢ+#RGih'֒2{0EH1vUFf\~KF:5XYN߫EO-̺X(v4Ų-[i6ٴtF5<Բ aI*wEB 1̇ѽ$_V/I+cj+.H@&s~,6v?ֈw`y>EW>dNN/[l$BΓguKi碓惭lM;ɝђBoxeRigk䓺 JȒ` h+hYQY!q=~ޭKuQ6/t{@:5^ zh|`i4q JE̅UeRy\m~dCc/.ؼЖfR҅ib:Ȓwث4,<0r \rzX֣6#QOECUͲJXNT–([uKbwϔ| *w|%ig&JPYz`6,uWnˋJܸe'_@: Ə`vISvNٕPt/ig J&jaig\LqUig.d5'<|̘/kaT'#S}C%Csy%yG9B\H9̐۷ag<j;Μq W@j lVwټFyċTZjN6m=^緡o,G;I)q}vCw^֬`FJho< qsC{*FE\BRр*U͍z3Ƅ $| Gaodne, =/1w{ypSȪPkk_~& eR ?$/9! Rf#@FtbvKNPduF#ܙm ~֚hh65tIó̗1kP#zQr6vZjii4BYu7r:QN Ry$q OW.~A/C=3PuT([gLY]8>:,0uWUÓk;MZۏYc^r䴓W @RfUd-qIgl5&)/mY` (n޺}{,Clډ.EvPb6vؘ۩Ujܲ5Lnb$꤂pJ˃JE^җ? ܠ5}KWTpžp3 6Қڞ|&ϙّ{M{mKn \Sh> cƍ;v̘ѣG+muX;$4?@MYx%N lT蠝Ŀ.oj!&NTQitHO$)7xǷ/m9,;RvVkDM,"-7VOe.brģҦ/hƋTI'E]5~AN;A RmY9\rvnbx*ai|Vv]LR-؛ij'v.xfpwq᛽EzYFKYc줆LzBr'@Nq/k""/WEj V;j8of m\qNuD$fTХ ЂPdo}{v:7nYL'.}8+ OќM%Ԩ"oO@x43DXb.ޖ'{%S\F'aN.KK JtPbzӧo~0``G%(u?-4S=QMG3:h'bn.cfLo M|N.v8^ D\j x M,uJggDtin\ U_Eh"r4Bw-nԩ/㞤h.8BN;_,݇pGu︃Q34K BJA-Ĭ[Vڵw>Qc"K Mٴ*Xk)wJjAcJˬӸ@a1cY&|{Q,}-,^_ OQl"⸄%ߍ3>K/N]i ́|݃D{<ۍ .o.pI(y[v5vB'M©)w j=IqN5dN+'74KZ|: AƕJvbq:dM5_Km'n'}[7ig~z]ʱ^ lo2T`1&<5L}vE~?yeJB#rf Vs׸䙻!rxߣCB fP~VmwrfB?Ϸ+ozJNQס+,kvgj:E <­\bW־`"B4?bei'@Ӆf~*,@C;莟%{wx/R>SU{dzZXWj$8f >=<˞,ډ*]Okޗ3z0Cߖj)QuBu ݌ּA;*Nܵ{wz ,@Ɵn k ShΛ9b$%7QI8O0Rk֟:o|>hJ\OfЭ>eZ.=Xd4wuB[V{_{n@oAփjΛ:X=,̊ 2 ׳JXC52v3٤>ib1ؤ7% 7 ̙X r3&bEW>xmBk1i&TI7٩U,:Y Kf˸;r|ڑ:,A;skR0vA46ux!ɭ >nNl2~Fotohx /= $̥|r~Z\TRDzǮ*nj- 8eK$ad@Xv޸gfVSK9<ig>% 0~i+{yi#<ˠ0qCDjLs'~V? dzDXd;GtFMK]h; NdƏ.kUYl W#hf*R+Fny;Y+K;8tN^̵m{eӐv<LaLJ?~/_}`IIDoRY6u`r JZ0-yݳGn]tnQitTY\4E;7Jk0*Xvg1ul-壯EFFo,pw:&lWag: ZsN2%ZrlLY\Uf@qyu1 ͉%^=wevl kjefY3g[I+C;Bw#Z@,yr5зhհ@ð)=m@ mas1~{ *ȥz%d)頝"UT dviMXz/ebN?U^:!V ŵQjŠN~HKYOdy݋մI)ѩeAIӢ#F+goj29$OQ;|Huj){g4.upw]>|p :llc.E6imZ5ד}OD{T:3|=3NzC3*2ic"&9Re8k^77X !z=cfB5+$D/K9 jQf`'N#:S! ;+񍥼BDc/,q-gJ9%Q;Ix`؍׹P[9fNDL\ɹ;R[_8Ո|O:]k11reJvSnB4[`=`;dn*(`QZ[iKҋ|:g^Iaԓk#hJv.栴f+PDe1.S|=Uz:V]uE1WeQvQВHv֜Ea΢;MCC~,T2%GPLNLXMzK#ϞfZ ˖>u(? ş5 M{vNj]rlҎ:SW ZIG,eK:tNIrŕvt6+gzz=3/uiP s8jq-MsR P xf5`mC(29[^RY䘷bPee0XvU+j#FDBT,eolta'9ϧ+6vQhF|iR UlBNCS)%\S9u wOb`OZAM\F%OPf'K$`ƴm7[VCҒvA]tNi]J ;c|vhK7R׽D*%.w W o4é!?pC9rC؁ U!#󭅺g&32,v+{;+Qc.?W,l@|_J9Q?t\Tc':oK͜4 8|)l ;? `'Ӿg($,Kn)7ng,eyUZc;'JrcHbag|!_QEdQQЊza0^Xɺ,?"Tթ}zzc=#+B){k(OuZTdgA4m:S!cOo􀏝=UӺiĽ.9'߁Jpas霺+v(#L,帻KBWYxCW,[mracg'w/yzdUN9b'q hW[v"r^r ;]GJښ#v2SɎ~*NiordnOU\,D©y9o-@El;^kzknA{$MwwU-q{[,tSb"tՈ]2zdR}jrq,Ud(6$qf/Dc= |MNXc";]:C0+-L$_tFhcg8#(X^m9gWh;ƕ ϟ?o9sfϞ5k.jruˤ*,w-] fag3$Qi^joki|ĝэAO4dy̥ciҁO͑g`\% 59)9bW|S=5"rg6oS*&oHj`YIKis; ;=b4aѮ+H\7:zZZfu-NN^KP祕^u\؉HսFuROx%čv*s-5f"$GP|K;ex,NGsbrlw/к3\\WU2 တv0RSJ: ;G=C-sMK9Ŵ;)Z'K:Y'_xqg:h`']o\r ;|A u[u7at7ވeRxوe=j]afTȅ~OUb)ilBq<ȧ/Od38B9%_`GNgT "DQ-Z +Iq:G "\Zr*éqagg߽=l~ԣ%vӡieV6m%] G&r13@`֩#(FyPas9ol ݼn0G+xi^-c!4Q%i{N=׷|mZzC7d`G9%_`1ı/i-.w>$v&b_QtNAC9޸t%6n*D'vTMCb,4QHĉKv3USqPc} sK,_yΠa! Y"KV'vEb'H#iV.Cbv^8=g&vf`Jr5B`ǰ7lAWv#[=葈ϳZ'AI{҉.HrzCݎ#RaqR^0={RuČKŽsJ#;e,\c p0jӭ`c};8Wm ܦHxƕoM2XLWnK#LdגY0KFH쐛:4 O Il" HPUcǁ?sZ@W2}UŽ#Gꗬ[;{4|o$N@㒢0Le`&lˬRrӟ;EaΕ#1;ɏlHߘ<5gD@1Ȣ}iRSj3}S:@גjs7 :I Vj8 7wά**`KmϣΚ5sv 26v"q2S`q&ac_u2|ɥƎ&sw7;~JѩؑA 1"2o[Z1- 5vRN K[Te"f 1k7H1;#1tRǐ6UTYo Nլ7rb艥l=2;bGr5Jւ -E#AK95;ϝS5dDolXFbqlbGr5JւoL~z0.cY3Dt\bq{%Kr5JփnDǖ)ϊlpÊl2 ;ee%GPd= :eTxڊt ; KEK`G-0nGr5Jփ{ _cx\L;2pәƤYf1A9;`cNdߓa'*imx+~[L)$-kk5j@`cGr5JV 1#xi}>wXʘS)f\KFɚ:k`bYxw( ;x⊥)4Y?P'ع'9%}\?2| %aO\5WJe7\Hɪ&vi-.aS9D-Ŏj ;u3uò&Ev09W+sZؑAuaEmo|ITUKY[#Q_9.v$GPde 42Z,9#aODFձ0#wjk;Ӯ#Œ0 ;xY@?\:H SRfhL;,l ;xj&v$GP#%vLKYfzXr'˙҉#q;&P-fzqrϖ'؉,+cbbGr5R`Պsi4W,h ;x2yK4H sRVErT7eج<HG#;9$GPde ni֑/2̀!9-v$GPceQNh2b)I7viaaG,9)N#*.Iv;x҉5vK:<،ך 1e']iaaGr5Z։xÜO՜܁y<鈥&9-,,GYNV8LY* LqRY'6#9-+\lmK$`+sZXؑAbq"5G,ey+g$,䨑zsV4q˯y,3እ< S;#;d,eGRNҡ%1f}Zfd ;rp,\:x 2rLm~xjy'y[#8v^[?$$'/و y76v'yy{i{7Kp[r5Z`!Mɖ;og^yq=;oyz:>o>uv<Y|!y-5+`vC~y+&X;ijH]k66B4BxyYqdד Eȹ9Eğ_:n\T\K﷛96\:όh0v$GP>r4:* I@YGP_z+BoqɼYȉU JG=7١#k4f_l}s8 ҨB(6kJZ@ǑWWr;a-2R#(z!FW"7(MBP+2uIGޒQoH58?;5zۯ$MeT f]A) >$K/Te;J9@oT:r* X=lԸTiuH94ec{RncOC$+eF`.2Dn\p*HmG$NxV͉vZفq^ZnO PGdHuaKey6ֻ5ϻU1r #CĎK"R m^TR:@I' :ջ 5:}gI:,B.IW#;M 5xxʻy(o#;+[M#gc#ڬ?u8S:lI*gthrRi~y5 ;GoQY?Ӛ=b6}Z܂1l7zκx@{ vgkKח>Tm0{0EoW !ʓcqXUY6D^M9wA_osDw@z"w_۷S LCIًvLtB^k41`ˈ-8[GasÊqog?+?M< (s$M O)[[%{=-do,`Ѽ7vzؑAyIVʥ 9*OGT2BݞP|ZzU$vQ?#=&IwSE1ĄsɝK;4BnT( VaÖQٖ[iWxXD @09֕<%{atϳ"XY}ېgmw?ABbږ}஼pI^`gYr9a6wq;@ĝ)lN\N7p  #v$GP~zqcFM%lڐZ_F_q"-rNPg=rLM.T򫐶 /JvA_?US.L&?BY\iM3T._խfCqJb-ȕCxcREz-JyEYnO})Uѭhhd'&MA?O)H< 2qozφOASpGF`[OM`11^45<Í|^[E`.ECψӕW$Z76'ѥMqqI!p : {`Gc;^#(/JKQoTqw{j8|4{p`ӺUN<~pkҸQÓ/Giq[ **Q}kNsB&}"Q3CZT;e! 'ۋ F-tTqƒN=,e.hX 1ac~(jNí^^ u{.M8w޶UHUk]t:wʺuC]Zߎ؀Tvy2q~?(wV \j+4$&rgH,5)h4KY%.9z=O'j,$MŽO"RSEGP,62ϯ_?}|"[ u)fS2ä!FVXL2Dn,VEkW(s~6߶=&ؑAyY@l"N]l, _R,ev$GPtIR,eH?v$GPB+eI2%ؑAJVu3YNjib*ieǎWbd=r r27ȯPG(דZa45$+eH?v$GPrBuu]MCvc5"dlŎ[R gO&n1rkQO)bFChIjŒSz#9Y+ L(sQ=tjڧͻvQ MaF"FkWH5y*c+B[>$J$ҋmP:|F>0u:2t`'~PP6+TjVdlN權MIVvTU3gˆy)w"P'#:DUg@2wF(A h3Jdd 5?",r4W;BAD9FL?MAI;#(o{6JVAhch+C!kиGftPtyzPژwrbFN=WRBqs:TPVgazUj D%g/r=le`vkΟ9s>ʤ;QQ[ gх7ۋ栧zB7dlÎ_d=@Hihu^ZR͠|vϔIڮ1Z{Et@i,7Ҽhu$D6JkPu6I=dwRbdlÎ_RP0}AizB҆pJEMF|5-}dv崈Z uB0Yԓ?QԍJCZZ:{:4Ve&ZNvtJv:H%Aֳ8ni3fC`[+ڣvăQ\*jGQ!2gM]9%hJg"rZj~ʏb)i?.y><6۞LI;#(JhreJ+R0_ٳd 09~>+Q!Sh@;}uB&{fq&Mەt'!|iN7pH@DKtC݈͉Ȟ~IrNTz;LkutHvb\Ѵ{nGS?y Ao^ZTRR/+aJdl J:Z |% L"=Yn.$dJYQJA+dl J\Op(mXBvtJv$Gdߝa]QoIV&AKdQ >b$+eH7v$GHVʒ! ;:;"3Ŗ$ lCI;#hr$f+eIM"ؑA# ;%Y2Ȼ=2G1qe[͊I$IB1v$Id^Iؑ$I%aG$Ify3;:&~.26rZ̏s=L$Y)W6d1{~E&JټY5XֈZ)?B9sɖn}C8 [nfTKWQ=0~4$+eA;&= ]}FE|=:}ຓ2qf<˾ڻ}\u͸ 1 BIlVٞ#5bDŽ 68_xF*DbRa5zes~YeҊ}R>eë^~3KTyEs)B6m}h'ĕYj)WR)t %t5Jy2&Ҥh GY$R6؜#5bDŽVʵ _RhޝCKtOoFtCZܴ,0OvQ[ñ?quwg:`uڬiњ3BZ僎!XaÚ$RxJ,+&Q^9629 zr1қ Z`6ieVٞ#5bDŽV~ #3 > Im[D7UHw'^ςf#6 L Dea z `lG V~ B޺U; XqW&A WxQnՎU r[/aS/1$R6loGPaʄ/pİfAeϙ)Zȝޔٹ')\ȋ+kӶ].=}wtn$>prZ:ǫb]x%Kz;R*d:+Ss~/  K\{+_S}.8:2 ;F*rY;O.X&E M؏ȁpZ$#11|3,1>55!r%J{[ NifW@KxL6]+t"jܦm}0Mc>4AJ9 T&@:)(RiLKLW1Jxv *r+τ&ס'Da  8V҆,֢'#J^=-72#a%6S7ء3;8@yp. rcҋ跹*ә|}֗u"a tRkQMܽ}9#H li}!3}NVʛ,83y3VY ;`*-c3=+tVN{^>ZWEbrF,֜:*o΅j:DTxie]=w$uRsHqwlDy ).[c<'mMMOI,$Mhx?z+]Z/# %BP+@9"G_.Ce?fŀSoXK1V6#ȱsd::+챔S,_Ÿq(H 'N.KϪ}o6*|8aCu/txz֫}iU}݆M[ xZenߖ.3f_`&'He 3MM1EòK$HMzr732a|l *clpGPc{#G4w,ۇ }τП>L Ko߸P.2a U‡>; junױX@?Y4JJ1VoKWAh;[{&}Zl B/AOI{ÄZ239J $F6*z@celkpm%av9;4sLhl ܡVAJ9FtIŽ1褿9;'dMf(4OWWVŽ1RdJ5õ;~{_=V %=֭b ;Fir JV"ΐŬ|nGҰR|]993q&XDN_[YAXЯ^S~V'DAu/~U'_Q}+ur$_T'o'FgD%禎B%uV1>(:y17/?GFя N^s#|fD<7k1u^|/ѥ ʶRFդvSE/6|uIY3(^aM`ntF )cR,|X@NfT ̢Uo||2 3z#Qy^e&[KL.kH5aMfefrZkYa&LN]Lvf2-LVLLE83[dxvӡ)YK؉g@]YyRZV+jR{&+ʻhf/J7hVݎ[4uV ůe@TŽqP,u\"OvUW0;3x3gTs~Tř wR3Lvg&fuoJLWL{33Y h;YM}= 3+zfdYKu53zYEW 5حt`c#೥k ĎJ1SvO8J>P'wGMq9\ؠNAaujGSE}2->Nmxw;fuH\c>onur{(٢NW 8+G[qpQ"$d}[~mQ<թO!lш>r{֖IN;xC{3NQk& _1D#vT%JVa#I9F#/lvĤ \ʄt+Iؑ)1cGfPësv$;T)#O.Iؑ)1coGړ.BUԿȠw.9gE&٩U:7lܴyV۶ةKGO[v󷟾E~UH찖B9av$;y3+f-*>8uFtiX67kO]hbg6d2- ;DGv5~t4UPS[V䳓Ǵ-A7Q;T+qv$;Mf^8;Y fg7LX)P/#7qg 1\ ;ĎEMaz\冐dnSPxm^uZa3(aGر×|5Υ,smuʩp#y=Meo1tP8Cرi:kqjc9vVC7W|&7ϭh o}9?/رaLB=WM=kT$&%*cլkIؑCqySA UGa,Tɽx3,P4g7û `]u1@HנE\"l$c0s';GwMF'G*kRj7nݩC֭Z4mܰ~Z5VXνkz{5?^]/-;9Vwه`Xnq ~:d.=akOEƭ_$[g%B0h߈{6^䊣b?DD%:N?BJ]G ~Lϥ rLKQ|$AŽwʨ JBn&{1+9Y-e 6GtbaуokA ;qYA}N`mDxNٜ,Ce1@R P#/0h=gt* Ox:<.Z-7WrݱS cGƓָx/0̿kO)_j @foOD E.3OŽZ7ű4vvk:dyv.^CT?-sŏZS+TMv_FȞG4"v, 3-n .6eKp(5&W %rh'H<:N,:(\_ e|#n˶b/]֖ "u][ӼBu\̆[%r쌸C;ofxMr67aΘ0|UZI  .":9Q<(dx.߼D^F{xk V62t%R=*9zm*]R+fN&lv/@ 6HԫJJeNSG=r[ ɉT  K ^y3 ;9(%_6T|Myv#sfVicǑMJ |sn9Rj+8{\%yH]u |4 jD+1dZU|ZG?'=)Oȡ~E~EAʶKΛ} .Q%Bt!SӴnӮeSI B9rS5XbΏDfx=EUS0ɇvNRt`Iy^Vu1Y[ny`˜iyf^Qd~z>hq70@%5㺪(m]b )=gC97f"2hVZ/Ye V:ѓ/mSO Plrݭ!=qȱ :-eeudF{n"}wm_S VZWZy\dqQýo2pw㷛}{"tqBT2>ti^>ÀZ-ZmOUH߮ \?zˏhG j-tQ1m _e"T&eS y&q}HoY@cϋĎ~9Z6 RVD:ˏ:k=ic~\8KҢn4|ɟGUų'ɬϞ:vxpoTϳӇ]66Iu܆ͪ:7Vnu`K6qsޚT:WN7 Sxf=k2W!uݹY+m\/&ԁ5S-8CB։k-ի'asE)Lp,/9%%g)#8?)O[BW*t*-aG׷*o\f'M8::E~`4WJkfb#IQN9.q6h04I5v憇b'|rJMȚ0Z9433n;v$aJAyW2&t2\bc'v$;:``AMdҕJSv$IUքNRv$%SVb=_)x.v{{4#8oV $K8oߓܼ,bU/?]g`?e>;5;(}H yBUΕW_;!0c^EX4w?o*;Z;꜌y=~N1 ;u!GXF\r:Uߤ0f~&3DZnڹ}fKr/vm>w:2﹀yd,]Jg%.mQ`wu7\ږUw0o/vdDz<22Z"P } Vl;Y{!yZƳrb7}w50+YRZ&ٍz; ,] ce؉.&OO<[Ŏ&tdC0/2<>Q.HWYLGOG󟟵l;y5<ngkniagˀ `*Bɽt y56vF=;!ݙy6L؍tH ;0(x= y+/J/;1l;_1S+-쬝Dbgd-潝ҕmcog `h BN[Me󏗰K +)NQe{o{ع,]CvXox%ֳ.XXjFz;v8dsع"pQjmu/.v|ZRo_bYJ Y)KsS XZ2Z^x%կrGلGk.H%"l:z~[|aeQcxS.`qiakK1 EU8yj[{YdC;iyb7"\vw&_g*-aǐ>&֟mJd/ɿȱ3">̼Y`h)NFg 5/Qv$C{λȱ1uW6_ Y:d 2{(+`':ֵ2uXNKK_y7}Q6vBQÙ|N|}5ufY2I ;JdpIk0a2o(R]+%Κೋg顦N?WJZ0lxc)'ރ=蠼IET[oX \mL|bOfM`g:ͬh v>Ib)F=w6.}U"4Ym_ sO̳?G\\慰`ND`'qf,?[ߟYtW.*tΧ2^G9_1l;1%UɏKLvu?ʎg+/ v*pR~Zl<gVC*f<+] J2NW85[I=&w&1kb=.NF'M+="?K,ϾֽUIpvvX.|čk#J9BVX:L׻Vbم^c_1 ū17Xh*T,!E#U#m"6%DS;o8VisdE=*YǵG[3XA>i 6ܲX7Xn U!KhY/pv0qUo(;tj^) K6Kzɍl+_zl8C*"?><Rs)k9Qw7A `VHk_Fp3,]!U"z *lZ-^ gt2sDu+*[ m2Pbğ26->4,DQ:Ȭ!5c'Mf{-]X@W^2~vheUI# &mĺ.zZXt[7/3vtȚ3Fd-]Ñk2e2F5 =؊Ce0G؎M&vs(ZL>z+Œsjb//Kׅ̏^>#cc)kcūNna9K5lU^t۽c kW-ڵiYX%Y ;fTdUt]!c'ѝ~0:1ՊJ6 6)T4va}\ٶ+3;'-FJ1UI,0=/44*c3F.LǹVmsW4nő_m'+zw=[vYKVvmVl:U;CTi>an?xU`aѿbJMnPkfvY^V7 ; ?jJb)^G>3(*+yJfCIWcF?Bʱsz:O=;+խW~결ߨKkfyx漢;*([ CG+}J3c)pesݬRTz= ._\YVy5G~Dk'[P˜Ҥ@e/?F/a4b)c~DF1)]bC} &ՈsuL;*bj"!Ţْv$9_HΕ4v}ڱq%//lrӤL#+3ꄉfFE'tJ|G-]sJ0"vV 0/=b.T/pRӭmANUѡMŽ_ID1/%1cg*ۧppt~:t]g Id:섵Ub)C|Iu{M79 ;QM;I/njI_8/P%'Nb!ՉU#> z7֊)]9>5YOk_\ M .[!v+VdG-V)^U&\Mdb`/ZҖף:SpYYSrwobg[QN04/DI VO';p&A_Z~Iɜ՗nq@y vlG~/a{ᄷVUopf"!~ I@N3~3rqF!"ǎj=ډekuyVXl!-[.X櫫(v!x?9 rapR4CIYu<ʲ6DR}7%N<κ}d+{b6;+A2 HV> ]Su#>)rlϷ)mD{;OøԈgmEιa*m: A.u(v>V39R'`JI(}E8(p)kGڞ:KE iO)x+p1ެ"/hM0@\CB:O:wCeb-`lqck:]V2RX`IW/^ة43glJ;w>Nd)x"-e_C}o6,\j9oY3 y2S?C"l%0_ݰJN9D T Ôj'Xy ^5 @,5cU;4}da`Ey[1E_I/f`gqL=bCCh}x ;T]#eh />)NBP0=wӤNGKqŌba'T&=O=q9v}ڵktgfY v.w,*&#%O$Vajasġ7tg,e\hN,u߃>;`W =BKܥ,cIK/_Ѕg%عJEҕTZSSVdd14z&`HͮN_^\ȱd!83:sEMf 6C}xa'q}3; TѫR;_k@'vGw3;_;tEOF yVU,J ;_)k5Ҽ3-5ɈOv W޺M:{`'W,Ĕ{=EW- 9rKn عZh--(@҈vXya-<lSKY^Qs-ОPOVfꭱs? };xamعΠN×[s2J=M&@bgPRfU ;5?F+FWgK,lMb'.~qcQ5~3OعX|hoe]0j)UWoX+9T)ԦZl;UNʏ&%v 8W?%X9v(i};gig{ᓅk ;3MtP6%vL|e)pRׂ9YX3d2?;5ÌY ЖZj=#m[6vj́9J[@jB&&DdiΏEb3jR;{c("rqq̼ŦLHь/KK{M"-\y۱QXa3AgZ@Dptgޅi" :(1=K%XʀΆ-q8!"[2-m:r VkNr 7T|&&!̢mJc&gc)igI(v~qcB 3o7`x&u ƟxG]Jlͺ59vK^JˢN]c؉^ M"U|^s?{gߴ3 w www0\[{^ZU4mnK?hsoo&rs.nQ,v^~rvg- :x 6|MLOS#?s4-BXRF-ڋ#&j:iv'J^V9OQ!3={HJXю"sjˈpT9N(g,ZL/J*p[Q~I JK٠BjmE+dGelr$ۻ_# ; i7;R)v.7 (?xIc _ʆ] #Fnz ,Eɾ .-,\+i]BWlً+)-8",K٠fv4ե0fG#.h!:Jg# .J;lP/FFzR'E%$hEMKā(RS!F^9#_b'R }*~,ݸdzS2ߒc_f#1?Gk־l@ea6+=3Ycy~7,Kِ¿Ly`jB@lu!ա8҇{~rt!tI%tc6ÒY$IWɠc'F>i8Qo8iKǺ|nKwt!a;عX6l`Vxn! ɹ\3p`8iӦ(-'vvEd)`J);ZO0J;8C4~f+K W&ń\ >\fă)g1ck[nj\XF;O&0otUtf0*n'~IˍT6#oݝUUpz?؝|c`Qқq{#ag[NZKJ;*QaT`Ο;U(Uf|Eas :IpykA3)(QWwkyI! 4e[F;Y K 3q-VEjow)jcQRC^{N{f-TemttT%"ʘr!EklW3 ufNP5Nw' ;S=Rkq.DݷI^S1LZA).%;*2Ǫ.9 ConޒUʨߓnΆ+@::ɳQ1tIia';'O\r OdOir&܊1Į(Two|E;H v-j.[dTÕ3[Η2ş{?aK9X+ҮZh̩Ǎ:o.4oҠN~܅Cl\urK_J?[vjap@?K[PJw͒J@(Fk!R>Ggi &Wʪg.Y )Yq-Ğp)(}TkoQةPTkxS&; n|Xw㥷sr3U# Ub+Y#Ǘxp~.wҰ38*\p)XY-@zo|DyJU' * ;adrj$a:ʢ֣}n6zf.ӦIt!8cR M. J+iؙ 77h.%o< 6B`罐n(DrR?Y؉'wLQaŽV ).N-h+9_;9%Mv1v2D-XkF8ewɀ?%~JߚO([[v;?)zc[A;MiJk̞^t`"޿/eF Dv'&v׮^|-,ܸ&IWlݶ}894PAQuA ]r)|2JOvjYc|.9KNY<.h.kCj.9?8D%nkץ!u0`.96^a:b'kEѿv݅%G^CuI"_V_Dc4ۤa'vX!;2KV.- ԊYy 6,f'_PsפIk 踯ᬽ9iKnmyFvsvͺSQNr;岇3al>vHHS`NrB1Nr7P)z·eGq#q;<٩8h%f4P&sGrνւ2+4.WA7޻R.a1pFsw~S>qk ȏlI95$sq ./'Yk-dt4\XTpe8*\T$+xsFwq_FƎ6<y؉nؒ ?Mv0&DEt_&Vʰ~.W+R\, n)O,h];i؉v&rijL_>}uJA֥RA.I%Q}r֮ڕj2%iO$Xc5.I?뒁ԥfKPϾ ]6Kv}KU]cu)z6.j9v X517]j+!E7U/ezuNJ7>"Uj b7 Q'|r/hTYaq֧f1y-Y)UX6<67'M:Ea G5!;G_ز:c:ъD_Sl+결^ذ f*IiJ!)؟2>v';:|mW=&(Zz^HN wȬ>h[1S t,+^_"UzQnF q3_5YR֧f|+WagūdLsE4dag&o DvিC~xǾ[&jk3Y,KY5U↎:5W}\GZf84uLlqu!ki_좑`_Y9zɈVް+~e=pj!+8s"g%Ώ;DR֧ F ~q-Td ]d3֒B+5ɉ?AED҆wPIvlػ N ,{zpO~[(塊UyCec'Z6%OnNCךYPMOo)@:_'5W#/a7C(v]1rHF C(W#V̦mV6/ux * N/\tk=m;ĥZQ8κu21T+@C+]Q(txؕš </cTQ9hūI Aͬeuo[@MƣVNknNZjԎ~;h2(:Y;gܟʘΗթUz6[Y4زIyA تy2Gl檲qШ2R$ɤ\kLh76_ꇚjҤ|bMϾ /ܬ0/][dt}Ϻ>U@GsLNw΢`@_3i{v @5U3 ?Flv5_;)6q)SMQ˖aD\E=u,`1/W<#|)<еa"^/^%[ddl-$zCpmsW&±>$PJgAtUH!U2clֽM`A5 6Tɐ*&87tצ g#+4yةZY|ȑuR/ovg꥽?b/ 0P+E:{kA͸֮=n?b㿾NW+ț^l2.=>a5Z=p$˯\j -cƧ9ܨ֠4+#ڈHC5Q lbZg~T* -NTĽ}]Nt86h][#Lǂ:TX=<1EqsfNamu8Q8:K{Ӷ?{m]!xKjR^c^5ʑzŋ=̺\`k)4TsVӌa+hz5Ja-M3̮+qs&( L_}%9K~ǦPԅb:pɴR ù\Ǯ5^{ Ecp=W[Shw_Qk&b>̛תT9z|ey5) NQ LFkRN|$$ ;^|WFvUlVv8K:TdNJ13c3Z.bN(Fb\eL8sޭH"_sepߘk;:C?+xv&scjLO8i,jխ['ײXghvƏ[Ή%#o [) ۠M$q~="{ǮQY5:m۲Kl) .-6(QiAdj vxިNuȢE;קC';3u]NIYۧoTITg|Z;䂋yܨF ۅGO!E<a`2t 6 qn9_>pй Q7RJv^ΞKYFUV7ޣYsI 0`KuߞfDvVi%::҇hQw2:<2i ?H ifTdjoЭ!ԗ>MfL#`Պ>_wlhy-_kQkYX4;AՒB@JK9F3cq!)u9,w ueJ8~Oȣ<7QԴ Klm%47ngΒ-v_$I1i_cu)$w 藏?vF/OaLJ]25I) ;;z4j(emF17"})mYa]Ct [Rǖ{j8dJf/%>(c„ 5!ٗrB(q:宎ab'n.Rh_H9Qz0S1^ⵝ tFg:HxT=8yup";N ']< rKs|T&v:⺭HeIH5Y&YX:A9v1Qv7d]Фm ;uqa CT$hpvޛ|)z߉dC8eoȝ;/ղ ];P%7΅cw]HZ= g'yqjٜU,<NOT3}zXɄΗ2% /2#pU!i f0xW8jVء;_wA2d3q7z]p&*hh`yjf@4n$TuuRPeW- *>2Y3Phbg~Z+r{c1P(wɐ`0Wώ7SvQo}SUd-7vӹ*N՞y -?tVʂ`Ucb*H6Z+Da`=JJ·/Cg'_C_'D3pFb{PPYt;;ԒڇT .v^Ġi+8) ;aUdY ȣYU>_qmVπ 0ht]ZҨ՜ΥnNCɣTm8액N[g ;w`Ust3GX$ ;#I'xT֏ 35-+CuY~]ua\> RƬ-󞔣Vd0,@.9/궠Da-zƓZ#&%z0^{ :dTբPv,%x=Ee;꼈O*wE n~~+aP+̮a__qHN9:$]pEFxfr虏l'%Vhtƻܱړ3@젫,] e/Da'bq8F5K׺;=JHN>5ko!]2ujώS߂T!e֪ }H#.v^L~J]IؽOX^@F})d/}V,9M7 JJ%:,IuAc]^ ?LzZ`95 5sj6 6F`Ǩ/eըx .;u3R1by[.\eD}2/6blk`R@;|)rٌi=TP+>*sVEd&&RdZG*BEՔu֨EW#!v{]U|Vb$I__|Vvȭmb~Ud>Vc'^Fma 3?ʩ&Yfmb@ZFA3AL$=|fЫ>'Iygyi: '݂jSRsp Fx~%#.E;JC~ 3LDa_ʜvT|`) T#Q$:餣N_ XG=}y؊6.v!3 ؙ ZQٲqrmFkϗr_mlTiݐ7*0:N6GmTՠɱJJk$i t\ pgD5G% )ZS7jkw#OrUbN{{Z?)5v'۱#܎-)4})kCi=a!0Hv'wK1 KK>* Qi N|k][q _fF&mi=:/UBkt]!ląкeOaQRʝNhkF.m{qbu,_2rj=4v:}P"S*5i=9W:V) ;PQثI zYP!jZ쉓N~QAw"^`'6ktR{$ez%QyHRֶKbBCW%|LyikEWfQ(mHTc|E0;3۫Frn H٦vD-/q3Yobؗ!E-SSvBbL1 4&3nh 68 Dbg%:Sl0.QYۅ@aZ6 rIiӘMa}t`' $;:qqK_&ISeFnPTrC]/Oΐ]ʆFl6u ;7TI <"Y 0s=ٗ8]3Dw*vZSvx|BK$s)TM'`սD~fՐ@39K, qj>v~0ˌƥNih\w$q,-j6)J]$.LMrW(i7؇WQtV/sfB:Jets$\cHNq2s]t*@cD Qع.ܗrB]t&zQpg›bJ3bG8y)X\Z6]V$ ;0oV/z{:IY>2ǂ /bfoL|rW J] )%UfժVI!ܗr]*rK~HbH;_YsY‚U؉U .#P< AR_%>DR֨bgR6ӻd`A !;D2{սvg ɫEI\ːxPm]\ =xj#I_Ζ G4"zW;iJTPd-.w ֩82Kӂt7Vf|)m~eAAU(rn¥XH;,8؉(5y b?5U[ s3RxI\oQ_k~/:%? t&Yfy^g㚭unk'՚P8nVX#5Q2waOlG#/JZ%ɰYy+)*4.o#JTAi~Oln.*N64")hJM#u9΋ģx{%d :JxSYB@eKAswNoߝQ=9WwA5Y7q.鰃Gܧ $]p]iËV@(aHB3HEEu@}lH"qؙ zfJ|kbEqkBOO-KҏN @F(vu`umv^vWWHk;;)L˚9%-zl_͚l?䮂{a) ™Jvοء5SMA'v+6iWxш#KYQLG7";aU ZKis6Os +Ul%p+gxc#KH*XQOz@rW:ev62-qkg ʳ-6t |Yυ:._s|K ibP Jc  )(1vkKn92Lb $[<vVRyv_*XGqJS rWÊ9_&Rc(;^ġni3[ٰU;9%pjz͘kb']k(|ivJnH6KȌ|,Rco*˚^nX}*HZ$R/el?3A:r6>"w5,QB /diu$Gx0dytaFX^6v~-^DU 3R5 ? E"S|\NȶVRz0V1[~B1gyNlDٲõPWt?)SXV;C82K±˸Eb—2K (a9MO6}4E`ҙG,u҂lHNrR+PՐG±svP_ʌNNq(e"k{#VA^/9ta%;͜I4D+r{'*9N$7?֙KK9 \kN0ėCUM HN3 9Ǐ/CP3,_av )gpJtߙqcq볰suͨSqvU/4TVh)N!CֹB:YoAMvj0 ry o!VK"3?$4wXxI-vReS 4]3>;a7M ;CG$\ʃjK8v~Wol@US-7ohsݗA|%af4 6UTQkk;1aa(zh]kjXk,0vKUJ LS@!M$ v)dcٹm󆵫/Y8_=~ȷŮ`)HңU,p|) y宂d "vA`Yp/r#.$)N65 T|ArWA"j6~DIN)Ow-׵2VR,R ^~aR POsjT`tIU)VK46ԫ[D9 (,Xb]>?#w5Ȓ$- q< ڞvfV2HR,\b'Ck`foi;sG8n3+g!mNI-ǗpB宁yz781f+<̑$,7.kYp62%#ȂN'бr*k`k yגWvIy㖳NE^m<8mf,X%9;]:Qa\ɑ$6Ia5'^ pGӅPdxWtC!WBҜ{Hm4 Wkogk㼙$7arWABdᆵ;sd;xSg/\nGO_~ыw/Kܛr@-{LÒ@Vibc,Ittm2e#d)bg5zFZII$ľj} \9/w ԲWrWA(H W$ v_OZHU`d9 |H}46#NizrW֌c춢䪕f⏝o=x3}(—1mn}0J*0W܇?xjǃqfJO-[X+H\k& 3x|!\cgO2>3ӗi}HZd`C 7 c lc`CŽ} yT2H7OG;Qz[ a%/^/]Zp7?"XHPa% E]y x`rf6/;-# ⏝h? 3RRg484^6Vd}mV"l2Թ <>jOH;_ Jv# _Tdϕr^2#13a'\ݺxyӠڡ#ǩy'Ն jªp(!ngqpj@vvz&JةI]J@tN|ry pS U4*[ kX蚋8R!UۑpJFj]zIcX}z\#WAF|El Ov竮&aG7]/ v^upשN*.FOTO-@1җ2brEb&J T}~{^6}n@wTxU[;uȁ,1OwyqIr@6*[;E!x4vBUUVpZ;F A0v җ2b#w=tfzj"oP[W`KHO.oBozT jTkVb}A<pQ aT fS2=ݠ&b설c3Խ[H՗\t=7{xE، ~0~#Z,UE$ Cq0q0?_aPNy]"OicS?(cz*oH xZW*|oq1(-n, QaiFim̻ 829#ahWx dִW粨t{՜9x7RW;CD1| %8u2ꝿ[qK(Zݽӝ~+ҕ@pTCRtfA+R+cr UUWz, O#e;?{CCb%\Nw#Ŝa YTKj$~ɘ V4וpg>N7P6o'tBzܨ*@7N?Wsj%`Xdvk `3+a /=Uvb5o4=3qwZoV=w!&}Y>u>fY?BwȷwZMEpv3*^<gUо oaPEf<ӔY J)IY~MρaXJM9 358b9{u(D\҇ 6Vؖd6w";waF0›?8{8kCNº;k.rBRiۂORM\MEV.w]S7ލ=Q1PIH:31S׮wޟ%0c%yJoVU;E/vo^ڦݣ̺/p~;IM=l`WG3x{˗)Yl.V˚)^vmF1'd]+pz95?L;E^saBDvN´i%UY;зbFnnkKk "YlD/M闈/e|>_줮hL{Z0kA/vx], ;MsCIXXܗ2KXL.nNG CR$o-RfL[V:0 wo;UpHz1)oP+ RR+jٳ,_Lhc(CDH:nxɺRLo2_, G1&gf2N"T'KaGYkd[_ԭ%ü?V95uD-}v^?u:RƓAb%Vp5 @+[i|RvKo,G3WrWAv]]PHTP#6v֔m\֗2y|ϿxUoJ['}ZL_N+UEAyl ,nowigL,G fpiKlQ2Stj2n})c*E]մeyT6gR?k]I/h;Q~i^Q{$\3)TtJn MZWI[4lVƮĶ]1h^}?wU#7pnpnf+yXlL'[_ʨtiʿ`ƭ2+bdCӧ{m@ku鷭  )(,d4i36ntx 4,(OX><;#ej3fGmtP nUWP}~y 9Ͱ!~hJlRrrjCm;Ӓ/D;).QP.A}U]I7h2'&NF X:w)y8ߠ_4ѝ"c9tD Btw' \Q̛:-/i0`n4^.-[XOZ8A },r ω; .{Co"Us_UF_q FSYcc{qÈ)גp^>:, nK2`<OOKG:(~A+0 M+hߓ?(h pl;?׎S:2S&Jh$P]ۿP\3?vu"k׶Яu.J\Sf]ԏ!J>fz<~p0D̘TCq9 ;\]֍x6@wG4;ug)NH-1`'(?m*VSJ8=5v.ԯg׎mu3MBܚʩh`A1-Q_;zLPӳL؛@(m7W0bz6:,c+:=jy\a7gn}\A(Co/uk*Lze&LVUjJ5P f`á};mZGL>?~Cow!b봋 Y]7vg}ex ; kR@l(0Q3&T16c;T4^g aE`:Yo41PMF::4B{@3z?;V+ JvI C+PkFåi=WSi0*Byr.JcK+R%W&zh80sfqhgA[_vIM7t4c| 9cq0azY}:X5PT^Q 3Ps\oC `̃⺌>D k4YNkYSƎ68bҿCLKgp(i.9=t&dYq0$+BZ7m &Qunv(]tͼ.ETz8fio^Vp|'`<;FlB#IcX%ڞU+kwFo^"Sye +g =7_¼發ܼyU:/xNDm`ehtO\W9-y"Û̉ݶikgϘJ .lVp(cRBL;BK"UkFy c䮂N_CF63m3ULNzx?։sn/oe"^y[!:qEޢ"yvz$c' :UMRZy!:$_EŽC6,)6 =_8D6vrV,f{ȁN,r!SېR`Cdcvb!-n*֜| 8D6vAJLšR & Cdc|T~;Q.d|ql O ,T`tr`!.s3~02޵VAo?N ?%u |/~#KR❍+pȧF4w=,FޠI'M?Ɲ{00,ڷtrw e;z`@fF;5#v>$=筐*<_nޯ:ѹ7H971T٣@=?V'pa 5lڙ.QhQ.bxFvb]\:26At օ(t)5 =8yiM+m7^U mk8ݚ k|M͈аJu3%o_yFV3`Xm:OԾ SīIέtK분uU4z"Ԋ]醦kA:ї mn|wL! ^#pnܣvXҦeĕI1.L7y' k;_G ՒG%O&`IO$òoQRdcfefI'jutC4Rڮ>FZz(w*z$/9s?5xx!IDc$33!tz1wt,8Wƀ2GM?686^7Kשp}h 5:XmNNGͤC`?tzʥ#/]hFu/$ q/PGV{C{+>Tor}Jw4&S{D52$ⱤM Z6.e'Nـ؊ެT"+EsoWCڻ5=ڟVD]cG[UlTƎ숸.KBLO]2I5#.O~Hj[a`x^=2u9ԄlI?Gm(I'}׵@y0!\/9C;өҢ bƻw չTfF/&[jZ1wSݮe}zGs|t|T PkN~Zs7@ܑJLJRO1?bjKÝS ok oq[ IOF|Glo oKڐs.+j!tv7L'N{:]/x>Ƙ8,W$تyORvt|{eaQmߝA{ :VT[^cgDcOT#z^Y`!8 TےRt#ߝ._GLqT]} ϯΙ9mc4inU<& i#78:g+[bD6vZ9ųUxsoe诳n\+birm߶;]7vE㑏^U+4 Sv<*^#՚ ]̻,Tt%>(^8m|WuU~vG|=#o;uese:,ScF4o_ڵ~:py=oR  y1ۤIWf݆9^.KuR>Q{5.wg[<^üll̇k 9d!}%OH}TND,Gm Ō0ifB8D:vzxDM3Cr)"u/ZAY6+ݛϋNLom8x1t?8|IlO˕`z x>orKXȘm?|^˒rW>H6%tAICcg4SVhtE+KNSv5pGi$`o{ԟ/VWNwI79A8'8dJMKg]}زc/8}˭Yt?|_okX4?PG<-Er_!Hw'v";sWkKV#[]^2|Fh}3Xtz~OnK[s¿TAe0'ڌju6FibT$PzU8!9u:Nd~R'wuG8qRr$Ea;upWKstNG'؇Qzk^\k.Q`߶QkUz|I?ѭVpz tڋ8,Pxۛas1ˀC ~w D _B6nԙ IJ~=T :(En+Γߙ&0RU/lΠdͺ` 5D;-PSZTWaۋo_$vٹTnҘq"FtP"wRR ,%F\ (4LSʾ@ |? cH}DTY)+,P0se~IMEq70v/Ug@qW'246R.ARtklI2vdZ_-5 &ZUOPN r<ա%^/5ۯ-uFGVA[]M&˩x72]JIO3]qKnY-& jG{!h1g*};eYui']n\59c,:SߤcozנiKfB4d}hCͩvfe =mVvSy+U <%ArA8!d@T+T}55XI532zԩyPDȬ"Ph|,+IK/s_Ο4K'C IEkUEAP:uuVjidc̑\ K퀡JY٤[燛n4TLxe'Ww+/n=RIѽCwzע^~MBc~/agvVjMuOyBi#ϐIlG^*|r0Mmj經/`q1H׈;\Clj<<-;r>s!;-]"e)i$v#Uݫ -C`aqo`@nڮ;[b21(h_Jؼ^.R*C?g27#wT0L؆'tT67|J@-SՅă5!gvŏg 5/}eIS45W>UtxHF>+9 `sd- MR%-u'ks=K-oӤ*g5*'jXvD/;-Ry*o,; &~+ wiΐn K ,;L◝ŵ7Wxz}z篥ALu؜; 3/M",t`Sb,%V|1@۬9JsUcli]mݻ~ ,;L◝ٴ{u* /#ZV^YT5|t ~saɭȈ;:[ohp._vDCNQd'ǨDֈ?TEJp_e= MW|V>w 8yzפ"滁xOeISʠۄbb{Q4_ @*78}YYKi0BEƓE}K0o.w1|IjvtQ-_~P~M[J_Kjԗ6@"r jQ^SJ2dP]w76Ȝ^ CWZa*~պ$Mj޻=AL>N8S6<}+ӿ.+oY$׌*͛TMjwȴ>c]Y}Uִ*TzG︬ηuپ]F!1N?008HoYlx֕z^B, CI&ʺM0{t_.TM]AZ Reơ/HJ4 9d'v&4t]]ߦ(}5XS$)*U(NN*dB9oNMs@N6»r-#OQTU,g@-²($fŽ.,c/90Ӯ Pbé:ɎXTK6I(3b&) 9+VY:{TƂ/{_^v'^r k&,CjegdKCafQ~=i/(>"1X֎B+5L!eGF!1|8?8 mIr"M|% ꌥ~1ɚ+B'ޘS_W/_HwhF>9Uϝ=szG((e+U]?ͨxUcl:. _@(΀&=V{ڋ>s\@Z>Q,j\{CiGŹ8Q2Ɯag)ҝF\e7U.mgNMA-pccryt`c8^v46\Mĉh2rA|JQ}mZj"rKxclZ:@>VH8vkBUfGu{0S)]N!?fbaC0[c:WϕvGvqSԢd% [)c?QC4 @vN-)7Qރ ;h+4QcZדtr~A3tD_gi;Y`P%ƭz0@[x#]0DlWPegz L-i4Ŗʞ@:iզ6{1ً*ӂU9h+gpKw\ [e3+s] ґUGt̰ܲ %<CZ6k6Cd(fdE)j `dof*CܖȤQ}N:aj8U;><3keu[w/ˈ( Jo:t;ƲWZgi8Z;|W Øo j(1ƣoO>wvZG᷼T0d`]|V]davnu"?)}W!!)G+`jؑeh/:#|aE-(Uػ:nFv^862ݚTӗoõ_]دAY 0H^$/ Dz'CGp5U=?wؔ!h>ګ +s( 0yi5,ewU1]*cIvJX;UٻQ$6 J75ư;vtk7E^?x*iX襝viðĵL~waN@WK+"2\>HMՔe2ͤ*Û鯫E+b!FlY'Ct:lUΖP¥%K Yl 2Hsn+ؚmsV~'gʖcExFWWoTxM-WbN_sS_ؾHY@ӚDž{o; 1V}oa/Nr pFkidK  5WJKfJ>r_lC/-O^X%> ldGS/D.D x56gr${‘Z?x< VѵY6h[~ncu٦dXH幔QF[bk_=QW6_^Kes!WRZРa{hF%ؤU"B?W]*( :kI2Sp ЇrDE}(,t0z% UO7q]ʼnaO j9=If1Fȩx/cQߧGmG듳Xt0IhOEKZM=V'RgxGDw\jMo}ɤP ̝DLf#j̓Kqܬ(l͛H{' LIiՃl"f&nQN3 ̒m Bp&fQ2}:Ťk(*û@ cZ8j,-74Ӟ Ehb4S@ xuҨF>8ʨ(bea> ҽ`0k{J/bCU$U(HERY]QO~W0 iH0zPGiԷSRsnQ Be?GS> hםL=,Dq*|(&8|FmAZd m(٭`zu(z&44) >Úȉa܇.Kv}+2usW0 CG-}xC 9RB:q'UDl*bI7K 7yccs $m$Y@vR\sit4fS`vN^pCqgN7`2Z>JӮ'vnZ["gu0?Y`VƳ6S/Ɨl#ݗk֍D߃` uf291#LJ=Hœm v#Qv֔2~UrǪ]EJNjeJeVrA9R=Qkn #uaL^r0<՝]HcsFUъ5]} DG}, \tvߚOQs%ZsrW"̲"gZṯ'9]P;Ym=ߪ]< `+k&kNMTj{gjh:c'i6C?391*Y |CID-|khgQb"3ʰ^I훩Øj9Φlr{y}ͦnlj_r:{ʖI2ƈJLdS2D) ܙ=`JzE# |(Z/G3pPޏ?ar]*J爊h9gdX;}qgkPWf Ohf|3|^Y$e9ا;J6ywp~:6gZqAa -c-@[Bcl<}vȹ|pW-ZDG^vlbJ b0Z\2.7@ymze0I7]hlsnџYՠI˟ h8n۹;bx'tg>|*eoyEe0SEq/Heނa ӪCJ> (+ۻ&szqF9ORĺ,wԜ:.OO=z%|NJSfUj*,' g0Z+A+AmSDz:7|[ 9ϼEuq'Δi\kU--ww@<&mlGf %:- dpDY Ve8k\9b07FއX^tKI7VՈT"7`11(-i[/OUnO} ǂ=2Źnn2,}ӡaTd#\4uu[[zdߴy}xen[^İsCpG+h/6Kdkx#+i3B,/<ȊAԊ}aX!Rdo9QАԖ"2Hm2~ؑP@Iԅn Εݼ:3E$`čСvRu5Oni6G{削P0b{83@[]+@C:/Q#<ɞ$W9v6+a0̏t|u788uVX)8VQ@ ÁL 9Biٻp"d#d )b{Yb~J8AZ:)XXkұTKI}~'D="!'JşdFWi3dRgQGH.݅&b{8}ꑍiڧNnN-^_C宏F0̏bGW#iگWNZ5'ih)bm8K hkRMExl\PKZr: \A7h+RvQ3?~ϵF-62E yFzgJMբ]OlUH M*7ܺ%;rjbTuZBtX@c0!UY JZX|f uN !v\la8!Eܹuڕ^ u*@qu\ysd͘6dm`B. 6SPzL5ԹKWAE݋mM(zlޘn{ x+UTk y<%?н_|c:HVm7OVAq.4tb )@`ptsڎ=o=0H<,OK8H v m%5}V|3K]BweUf {2 Ip@>RQ֢Ɓ٘aMyN 8׌IѰJfMI[ BUI'@"R(˺"R-r:z:u>A1 FΡjmVdoHi&OIO)+i>*'a~JdrD{apU ԫJXUE _Z|MmPT\vq38v>|Un`d,21lAoaBrᣡ=0>ti)OvWb!ܑ2gc{ሧn`\jM@*6)edsrE1 %tܷ{MܼbTX$G>4%jU{UE ;'S4j!N<+B ƍtK]͞F '}\ dLu/3- Co.kO< RP(i~B阱Όu%%Kw&9m^"2I|v8 C6/-l |nbwG?wO(f3{t:ba ف[atB:iټ}ga>MGw`aaaaaa'KW0%O_ta_.0 a)̈`w{a|X92pO3ad #XtS3a 0߇F%sJҫ(9V{\;bj(kӱae+PL(#7v/?uyv]0x0 X.C -E 8]*>g\D ʟ>qLݬZ09WVj(Vi9B(/fsۊy&e̖'K*ӂW~Gd&qq;Qx2V2oJsS '01X jJfP0>̺T-a(p+ETad[g:\{X!,e|FO# c BKI:p7@[L $j #qx'9é⣨1 ę }Z㴕ܜ㯱i 4+P^z,a^!9Fl"Sf4E> KD\򐵕 ]e^fk& c?Il3YPzbVrs!hFE3:NUa >ԃSL7^j [TR,6}rJ/?0 29?g9:Y39U>s-54O!ƵԞhSie[rdqĈC{wnYOvwnqҗoAm[659יv_-eHa+;윅Js4v$Ua[0a@|5ՐJE';st*kkAOt?܄-f >ct^3[ ٽ:NudڳfB;G"_3Jyyin+7LGBvVwS Zڳ\*`>2!ۅjڗ乭mxxymUdȀ;sBdGcXI>"*!?P^v{ymzU^^6ܮ`E_heqqr(0 8.쌵\AK4ʦE&[CO[SdCe"Ќ C͠@0)NjGd@G|<0۽j7bi+jv![{ZIv&-MgŽ7(PnQ({c,CQQ MzM,y<-;QhLRQF)4 #oBRf$D:hMtXcNҕn ɝD`[[!Po!);,މtFv\EcTm ԟa@jg]Otԯ>01Zy =ž?eq ;n";5]\>~DQˡڀeEodT8׼ˎh\J-W ﵹW3­O0zYJ;KȨI-&x"5pEqsRUbNf51~ ӿHFK/,Z#;!<_#;-ZLZy k;D+;Ğ";kŁC,in";E $_XS@Nc P& 6o$'2h \_$tiFvV@yFvdP^v& 7o0 ihe@!Wdg8hErEe@4>,2wkN[+߈1eBEʵ6FÑOˎ@zD6i}}`eH)&}Ivܥ_APX 0;ZyJqG7 l ;!s';+E**t"^"c<:tI#lHqї("!tŜ,,PCd); |Kvkm]2s vPEF:FЍd(%v@(.dbA$Dդi|2{`TPYXCܡcFzbE#`S.9bU}m ~s@cN7ƔmʄGbH$D~0K3@d~'FaFv^ٹtu2yp ǕAA|-Bǣ^;mP:c~PoC| 8 ]·D3IF06 UG$hl/5 [k4eguJG ô˾Յn1?BSH.ʟa D[# [?bTS0!P5ͷ}M7Š]aKSHK}ƣFYc@,fB7P8,úXNMF /bq?}ĥ&P]uW-Nxa᮸jL4HmOJa&B,;̟CM'M}B妲+JHH *:G:kz|T/pqO֪a]@,O莪"*9kӔ+HO4ORN I³-TEb mT'|NvZ h 6[?]X'}ˎgH)yLQօ_q#a+נ.dzB̓PM_ejK/bfx"e*h}M!_5 V쑱$HvE)CBvqxկ0MC:̐zzC //{^a<vi1ou0Vn"=z-ӛ^^^w̰`L94żB1 ҌmG+1Ic\M,h U.ʣߢF {\%H?w 0?%.ih> edawCJQd ΂e\ T.v:=tsصS'T.W NPa+C=Kˆ&W 4kLc{K8I&^sh+FT~O<=V,߅B(׻Ћ}לA`&pW%D1M+;8GѨ ^tf Ȏ J-ٍiBB҂hزsYH );F5& >h*x;aKoMGmxi١podp/Q*Z dyY.H 9G쬃&t0WZ>!&2- );tkVy e QWƅ7Jjwj1%eGd烵6CIÛheR$j`$;`dg.I)#qIaL:((OZJ)s@W-7/ T㬗g&D【"Yv)tL28u+LÆP;،Db3 ǒFp2&eƏAa6LynޏaD(iQ ݇aRZ) YWqz|hen!)\- RM%Coőzh^Iy U'\ٯLG}E],r4:i?ٲ@>.rN]]JD/Pt= du,4\R.I"#K1|R7iĎ!+n["@e # h0 #P; |o~鲦T^`φxqv|!73ԕ/b@]xB 0a~*^i U_ 0i, endstream endobj 17 0 obj 113074 endobj 19 0 obj <> stream x33T(*T0P52 %,JUR T(T053W021U0L, f@3 2Fp@Ss=s \f5 endstream endobj 20 0 obj 92 endobj 21 0 obj <> stream xvK~Uw9?2\ _wb{TxOE|0%ȰÖ?tהY dބ]P/CkXSmyC^ xMy>`P#xx9E((TfD)N>5^P=aaffK" ~Xeh G0- }W}nZʰfK" ~Xeh G0-z;kvR70]P/C3 |Zlo}}VNʰð=3%^N ?,2TUE4# ^ȇKɾrX$e،+a؛/}Z" |b/P25D@%\RC4{^ImQC/u_ZۤЮ(X1ק w{[$]Yg}٨ LcE\@ y͈U u0\>5oP[% @26JFB5ѣ4\7@SKʋIbHXCbUXc ؉CV??WX،Xy.WRV (]U3m!eQ3o Vo8ڤQILò9bg&17&c QՋU,0=0kR X0]n޼2sW/IFON_hye~TtEU=I2PsC"N7*0< %qkn͝t4F p>#hkWXzFU/P3vb`b]^zc+ߋK22dWŮ)Z8#h?*%wj!eBdBK@^p *](ޝ_m9%FGt )Gq/B&fCGOoG֝;ck>Dy`V2K6s`@p3Qקe[s2ТπsFknQu^IWd3$)4!49}!q[u'-d1cN t2I]n Ly kcJ& $_ܵLwŝ=73}༟Qgy@P1t+Әjmz>gH {MNwi;i}:ˤʸwMG z律&I $cRܵLwν n8E}! ,JT]z>KE%e̐T>ЧϨ3j& ?B1^0yf*p0`~$-!3}X~F3|@n֔y^sXqW!qgyOQqg$L@CK>pF*[6@jlMޒ>h)a|#\=Lڝ,upIS'R|SwuK ih|AWv( !& ÌEi/u2c*qMhc>3P5{!U,upISe$'>,3 ;Чjl"k2DFx, |^mKnU X1o`3`!]"ՈMLƝ7ݬ0Eߕ@1 .Ui^gjLғt;D+!՘QQY-)2@Ff,b 4$mcun% D9mj|3$Kdɸ5F@rC(FD2{SvpI]Ɔwzd_P ΨymS5?+>Vs"ӌk4gHhp5bqM7k<=|FhE-FATk= ԩMV;p|t!1{r5( up d5$Oym6C?k>Vs"/R"6ȱ)w'&Λnxz" ъ2U(x96U.(LOplϱA Cp!.ϳc5Ǽ- _gZ*IؔqM7k<=|F@"؛ɂULF+t` 0"'9+rv}D9mtźRؼaoI Ok &#Q]-J{ȋMub=>Vs:/O]ȇo9[RoY.˨+VQypIi%8f`zX꽲c>n z~#@W"P qˊED9m7ELؼaoI OeF,[Jj`=&˞w8\$Z' Lˎ̻,- cݶ^%_ۋ>PsK9-7e {Kj~-55*< w8\T5L>dw{Yܻwr26JaU,e+!}찟ޜkef$\?}TZޮn8:ƵQz<&+w8\7bf$f`zX꽲c>3nEWן>(֧ w٢E%;gצXU%~F"')飊vetga,e\ _!f 3ʃdd~~Kr;t32玊bxӧ w٢G";>^UNFI eU] 6"Ҫ5ѽN7M6f7>颓Ξrnc]Nq[}QpO fZ]3Wvjt}ܤgOgY V )ujIt1D>%FLN\p|ٲ/7>ϳ7>qT.W CVmkm+!A·H>hÌLTEDwMt/yM:ԧ! /Q brᲅ&d_$TkLUW3 (rxXu=Ld܋k+ڣ O0@tW;/ߤCq""fӯY8es3uŘ8,Γ%v2VgWpl+u=/LI>k-5j2.n j8yV&'k#\[dCM!9ΨҤՉ5YNW&4SұeQ4/!_!RpFl]n6F TUdݼN~A>Mg`']d\"dyCpm$k*As#^yfI0$bF=PLmku5ZNpRd^Ԯ!_tHI!b%C\3ɫKzˋ{H6POU,'/陂D`HČy&kX]yvY:@2-qgMzwuK6 ՛IJ쌅Kʋ{Rw8VR؛7h,Б^pLpbI?))d@yu1הhI(פpKyAO><5npV!)X1Xjgxp?y1y( R}vXis0$bFćf3p dWc[N t\G/ͣߥt۔e?o()4x @Z*; aR(@Z*0v_Ln ʦ5?T[wX )0SIh>|?>|~>:Ϲb>|snÇ/|?>|~>:n•\QJU+q-|mNM}~c`qhS~m"L鬹^_o9RV޵l} TZT4Lv*H$VXSb[5 D68fw giO[.'z ?bwVNuroq>ؕWT@pr; >N bmYe RlsLʖ-UQW]'cݞ2D7Q᪛r]RLޞhquFI[F CgT%ވ.ʇ2tQ))2CؙڲlsLN-G,sck׉}ȆN\A-]^cqCDV Yqpks`1*Wd8YQϷ^+}(QtLlZѾ ?VmD3m &5ϘP*W"ʬH%b2i0VV=m-uDz(#"bvFb)vaun%N4ў+d&vЦ=e鲱b5O~n,i60)DɌ|ڸBk[n JR.I-{UCNo1 @JSlvkdc`Kvmujs*.Wyڔb5o ʞXҵ]7qPqhtX՚n8l c?: z 7۹K]E`-K1z5}QOu*N4lR}퓱5ʈ-ޫ+TQ5SlAKF,W. %8phܖTxsz0G$o2+.۬:Ȣy+Nt=~͎iؾj'k֐8\[FijA#W.-oJ6&zevC赊و>jӫGYM/b[W+Gיac`?R}k{<0a6%(.r8t1pZ!6߃&22r_T tlNcn"5(E,-Jڪf0buj؏Z߫ǜrG8`_ ׀PUZvj.N%@io906͢rB+QU5ӣ`H*52f)ĻwLl-Uku}?V}*D6;bwaТ["ebku"t #Ne=+]%ƪVx[Z"Y#7DO\PcLTJ*Rb֏FJalC،wT[ ambӘ+{A;z+ٵ@ɪzEve(^abv5Cu2 "OlbIك.UjG Hr1 [T07.mkBZزa?c3:+wʤ@C^ 2J:NpL,- &y*xk pL,-Ax'išq[*4lRq-٘:5 J>6*-;on9mVnt>6`u7eL2*"S̐ h9vjHQn=_||mi?@-lsL - 5C EKu;bc`WiG~Z#\zi$^}ښQ>SZyut~INb%2*~e}܍`c`c^RwsBkWdRp{4 rubGO.Y̡xf]d Dx{MKU+#0vl)4,ZvU4 >YFFj|b!l-ѡ2 #mi]y[K2x.L tjzBtUu a;NZꈑZ7_aƨy+LPU8";ؕWTCw5$C[.(%^vRUF.z-nt;n.C1nUpdcA(-G]+ӫS9US.Nyu%}z ͱV8T;RsuWX֮֡")D1Ő-ʰR팺>Xcux!Bh\s Wcŋ먤V:ԫT$})WKvkҕ$:s,]smJ4~4P][֟Ɵ4$z"LO麵uk6JW ԎEiUtv)ĠԀY7W1o;'ܷIܻ_mROOKp|.:W?* T.g5DzjUc=\VE꼫J/ ~7Ya$ݯvj>b WѵGCW^L+5T+))W.NzdUlsL~3yy/}Ľf-gR>nϟ'zq5]O?j^F昞wZ-;'ܷIܻ_R64-Bn剿0m؉miZa$NKӴTw 'ܷI `'9ir/Oo8-NlsLR-^ s&qZ*昦[ <MT;1MKuxy/}ivbcn!7_6R64-Bn剿0m؉miZa$NKӴTw 'ܷI `'9ir/Oo8-NlsLAKӴThvbc -NlsLRS؉miZ*g?>HZ*昦x Kn `'9i6އ 9i-昦x6T0miZ*ŹY؋miZ*YXv3?~n9{BYlsL,=- }"&elLDzݨ0\64'ާ<#v)mˏDŽJT-ukU lsLsB\C?ZP: mR&r`u1 p $O|h~C,D~0+i?*QLXmi)މzۡrf^vĀ&pxClZ ʕnϯ-U5fѲMS~_KUv-[M۞ml݉CKʘe:x1ͦ0ۛm*jזF)\|j߫r@W\ A@]+%QX].#.m֦.h._mR疽yr[r(#6Tͨ\ysQ,Rjaci ex[mr.b8ڷk-E K!m㋻< ڨWTU {s婭Ru[ rRFtU.-3SD\˲YT/6.N-ØE{:ݯhNx{NV ctZ;-{- GCKD9wh QsZ*hi?VG. ӡJBK,+~[ӏ `4S{@K5GR 8VE$M T(:D{1dD۹͌ꖽ= o'-UựF[ù%F8Iz֓ҳԫAْcwFC3]Swֈ?9bh 2|Ѩp 5qJ+V,mc$ NLmK84Thû_RuY>UFn][,۬dd(vS3؃GN+nՠT6 `YhvŻ_RuSc{UmDZU.#IכQ9ژ0 I]ไN5{ fjc-UY>uݍemosY 䪀lʼn(ߥK7 XDƻ_Ruv=˧8-UxFRx7QZ]qFm, >4So_RuY>UFǽF2T@jxKW ehǑC3-UuMluUbt1mSэ (%jedOikiAKS_R5`9+hJ{@nMtJWFRzhу6cuD %RNTuMDL ~EKe`;G-)=\vS`14m8N&msAKuvυ~mx+Z+ηqg ?o`H'ErE؛kZ +c ~x+Z k )nhYOZ=8 VnT-^-eLmyĖAy!-_$-L-UYA-U˥/xRk|O*Mg:s_AE55U)>6\w2YX1w-ՉziXAl9۬6\@7|ms~ ~WT'Z T9zz=1 +(̓r|!-_ cO}&9+Z*X)j8v=ʶT*λ㧧].]{1WDQi\)JJ  |\i5pD=kHo@|`Yhwƙ؈n *@J.z ŸFeZ®VЀ!Ym*ei*l35IT3$߾+UĠ~EKu@tsyrD7 Li :;GW ՉkDϺ.zn2&*| p;KTŪOA~EKE< \#]{hS3<ۏ2q%WD۹u,+(^Q ! p;3TaOA ~EK=B#t7rҚOkMjxkPtE T^}ė~ -Q2FJʑd#޺f^,W8%2EQb fhStHm2 ( P ZRR ;P3.aOKC?6(h[#ĸ*mob^]ȮYWF7Q[X.1S\7\Š[(,BNKxOKC?6TowO oUfb!,ЕO+ԪA\o Q,٨B@SxňDW7.@觠wbS;`NGrW@7G~Zm]Uoɠx["@/_ͺ*,p݉zbySZdٖox+Z*>jٻ[V4DvjGmEJη ;Q\PoY+e{YS|hOwT.={搃򖠥 '+\-&%8vM `SݯhV"SyXHKkB?.hvNuqLw9Z*x"'TjLYmjTK5$(,\ oscYe ӭ^4d xc[TIh쩤˨R2;+8w C;)ݯhNgOy'kgHZN(2,Re|rOA~EKu^kt[T8~gH[NcA;LxiuOJWEKCKah<fCK-UGc V~ 2R G? +6=bQ+\COgכa ײW5 Vsb>=Yvˌ*}Tfۗ+.)Hݯho]3q#cMQXbKj@ywVקmffԿWj( 6 )Hݯh<ZrеLr~v #ec)QdTdW}2P0dZwu௨ w"V#gn++;w,Eg50]m&jR *K%!ockhzN<{Ĉ2>bћ~RL\1busW|Lqh?\0X |`{,FGPMHP7|Vpv"SJ0j,:4& 'Fӣo7;̆Fݯhg]i$]U- E%) c[Xdr[gHR01]n)]A?WT]zqWtq}fՉQL_ԣ{]}aΪp%îf1}$e O@-US/+q.48*ELLYM!۠gWڊؒq%(U+TR@-AyT;ju%f.UYDt Y)͛BWCխY>u%RogjU3y_FíkĠx+Z*}5reˏ.>ɐDFX:[LOʕBt@[aeOX-Օ\| 7z OeRĚǴOu\#v+؉ -d+؉1]G KᯨbhvbHKD'$)Z*_Q['-௨zhv"RF­їuo T~ JfFnN?VbmTik.#WTp mܬU DOrc]4 KelG^1Y.~ n_*J.pV{ܾde8m]IT/ô6]UZ+* ~MK;1}sa%ְZXoL^Ҧ+^ ܅wzmK2| [E*)ɼ* Ԑ oWTJë46,c6bvd<54b*ߪȨI՛!Ank^}̎.F՛[GeGTh jT_)>&&jvL#ᯨ^ծ-ɋ*Nn O)Ӄvt 0(ͨR`t?Jykw<=!/h+0{WTJnK'U堡0F&eLan8o 1M s n$|Lҹn_Qx][`YVd{kٸ&N fv{>5WL[ǖU+Qа Tp; -U`kV=K190)%hެYѓrefښn+Q k3!nƅmWTJf=y =u5jK*&2VRsʹ5V&R?k𡥂5WTJg}ɤa3; Lɫ@ly*] Dn (ПVĸ6`-RZkȰ;Sl?^3Ϯʈż\2m9e n#G /~ _mRvucW %)=TTy vvVYUJUs#Y%jWň@w[:VVfR;/Uו _jMETmt`=AQߎZIesAѲTqeWn')<=RvFr wڦ2cWrXuw]q/8[~K70OK?$q  »_bWסP2n 1=,x ST l: ^2tb\a{+*X Z*6s) CrLpoKe4*S T^c*OVō='f#iy޴d Ļ_R8-|O2}uCԶ~ܘפ UiBK*# v~ Ļ_R ƷCy p3U-[!oz^  s )Z*~EKu^k ay+ 0[ 1dLwK|T+S+ț<Z*)X~EKu^k wՉi|2ʻ%{ Z{+ț<*c2S/t+S2]ϣbU+qkfhm9 UTnL쎗ޤl~15&ysl9wUȕuR@9YkJ~ Ż_RU)kت [}7V =,RN>SJYVUZ@mmjxYY_D}F?uj To~ jCZ* ZNZ׽)`q֛90kcQ\SZqcb$S_W=U|~ _RUkcN'TQ T61S*̌c:;}=]{__WT"eztrnҦ1ݸ|mmŬjc+7FjVUjtG6,R~Alw9Tͺ#,ەN4KI%tr+O O4Ǻfhτ"6cudH\X)~EKhP#AYzeJi%A)1btew TOvX-\AR5f²Ox+Z0>bӭ#Rb{3VdNN8 QmJU]݊y-W]Ibel kbNs[@hX)~EK%= ymٴ\D,Uv\1n W|7 4M\%5}mRĴ\)a)`c-Heش㧧]%8,22̼AŦjP>C2 SapZpP-K3=3)Z*xJľv/]cT7f~@^%$#rP5bk6E;k]vY-8q0 )~EK%R-l9X,k=lb]a~2"Jlۧԯ ؕ ZW^1b{ ~EK%R=; mQX,ªD$c5r媡b&Ğv‰t(Qd͖*_ ݯh\ p2D[&/@ ϳCMݯh*˧ƪفQ _cRRV&파q&YwV_^Wk ~EKŮgV)^;3CXu2ItQ&0R=_2U'~jo]U|-^Yf w23#CeZSƝ^uYbخ\ĉŲZV-[62-]UĒ yɵT#..aL f~ ތw2ʱer%GLh_] b]Un!?\ַ񊱿W5LWT7@,v,]qE{ۼsO8PRKیE4(gcOg͖ʈr؈Őf~ CKz86cƿ!Z[ -،~-RhNR f`K?#Nib`3E?PBKu+4/3mxP$uo owc9i׳{˜ %&ouetu3 z˥P ˢ , if T_\gwO4SWݯhTr%5N1|EUqCXL-+)UVUnlzYQXI-{#}uY{%:)WT]z*w9+.|cq9EW^oI\7=k]QKF8W* RN `}-Qx s>RnjzKU20oUaNԳ˛h֊X ~t;w{C >&ZC`: ]Qq[Q:R--Nۦ9iJ^nn\Vz@Ku%6vMzx\ULAKo?N0)k To^ BBK20e<CJtKKEhv5Lj^FZ=8 V3e96;[ ah.cXpVl9_RXa-U_Xt@Fu|lܖQg^\Mx" J3ZjCrB`cz=@LKu^kt[T-6Z+@K)-Ռp0Z*1HKuc)R Ǯ@tE?_#bQ+\COgכa ײW5 Vsb>=Yv6tuW[ho]3q#cMQXbKj@ywVקmffcMwbT5pCxÏN{-Kc$HA$4 dcQ,wb3|t-S#VhWvXj]aL դt'T"n)JC lsLW:WTGAT foc:m庍KUfC#64;<~EKսbmF$ſ:4hgZWaUcѡ1q`81O_Ruozv=]ˌBe7A=h$%alkPBtt1VnU[I 9ŭv-Ui]\ߪ}UEv(^yWa-nCX*;\ɰ+JWT]zNXĉDI.31e1b7o֟] ~j+bK (6T NlsL1WTG 2XUBl3X"J:NìMc,l)Wҷ35u*mieX~EKeкO[5r'hpK]Zxi)]tbz^V1&O_R]ŧɼpccuV06_ˋ|f+ݯh`מ6`c -ӛ {1Ͷ O ^n])9ٙ)Rfs@KӴThvbc -NlsLRS؉miZ*x T;1MKO `'9i)R64-<Z*昦@KӴThvbc -NlsLRS؉miZ*x T;1MKO `'9i)R64-<Z*昦@Kon^珹߭-NlsLR0[[׮6R64- Rm pr,bxaecͻkRmgKuTO矢b\E?6够֗/"K0 y?T/cĽ-UyTz%c{qbg7^\,kRmW{TSM(iA@L݈8J? ײ1kug~owzUKet>(&hTm)yeckRmj5JtMIwE\A*!Վ⊘;P|94 m+I ݭӨaoiEzSX?T/cĽN-էXE:׾6{EU yUzz,ɸėS'WV ]>&ci"c)6MCK2Iܻ_jkgcF4H\SZ zh+Q Op^%u[Da![k1ᵉh^6{T?sőĮ~[^ULl?2VCrI$k$PMYOec V p=oƽ6-&q~kKuSkTq+ºOsQ1+ۘ蚵 MYVWL+n7kWl:6t`g؆&z$ݯ-Һ}XM}=kR\u+º΍ u*SB"#1G]jif*5]QXZ~lϮnj^7!vŷIܻ_-CIFl Ӹ,!UN C[aoe#mj3TȞ][cut=QVrmq/ǿv?o+?-[n?z} Pyy] 7q]+.fgJuvGY0dlLj)=cWt8>o;߾[-pn V߿[{ɿuQ8vpҡ%N|d&* oUƂvrwō4R cfvh-WfbgVH1G[Cs!O[+PUFwSq(WUǍLKD]+nj:]a1-}Ճb-VЖgȎe^SRIW gW`%ZtەjƧY[ʘf+Evj] ċ-Jpq] CҬ^OuK7~K_[-?ǟޭ_me\%W?WbtxZ*m^XoӟGj3C= +3Oyقp{+4wMVr-n|pm2W?W%g_v <”+rB~8'?o'W]mWFKpR{%@KM֛kW|ćTp G݊`01﵉h^6RMeqM[h «9m֣5'E2ۿtI9OߝW?TwI] Z2N}UV~ø^y֩mL@̣T@#֣ -GI_$wk&y>GD`be.-UV* y\p6duJP\5U:^QvⵉhUn:sܻ.T%vE~SnG]qyX?Pc\᪫ȴjS *#(nO^ )eƏ܎;WpWi!gۧwilsL_S5ymZDLAa^6Ru,(A,!_W] ba6G1bm[nK*G!8_a8I7^Oø*rM& acZ-kRO.VdYٮEe堲.ݠH>Q-(ll;M(i%@qS&3Fz쮟e7E*=QW 7YEIU c昮KxmZ*c,+KdiZjXQvmZ ڕa-2 ?̞%?8+@}΁JY8VVPw>*-o7.%UQlsLWW%6-ix2Z0Wh˳knϥjUxk[8U|v(rΨn12m)92 ٍrK e{*\D^3[-L@+h2!6BkRsufMU߈e?jJT[s/TiW1C@i:\WՉ(R ?J:jK%]6Ŭ4\U\}[*Z!Z𖫕 TQ c昞]ymZ9n܂b Tnw٫c+QbzP[L-ci:\W`ە"5&kL׫ݪP¶rmWdˡ("o~ߟqoo ;YV4":EV-gUGZf]W-]Tvm?{JQ"'KM+Dl=i.Pfo7輕B9+RU'~+l,TxkUd!)*[[xJ.הM*F aGK =ʬH)R]{JU(t \YsEIBK֧Bsʰ]ͼR[^iWt=ٹt}?J+Y蟡_ L;]k T0nu -뗨۫r (F^QT06S[*#q;6-p/jeERj .R2v]rٯ-\7yoZ^x@ e˛͂-UKLa8@Kf-5Z*XmR} "tt;s[oj긂Y@+TL0 A)Z{o=ռfKu^ i2RN&gQ5v9o,ԐH*"{¸xu>)}VTl #"R|AJas(*&*͊}=xƫq-7SW0p6fyDeՠYya`Ug9F}o > :H,9x%=:1v!;p,MB|گk&jUmnJFFU?rLCDQnP+hSwj"ށ??wu_BW8%V%ͺi*, ?\LQnD*uŞxnݮmo^ C!S@I3Ou Cy2fPiZwU0k hU Dٱ ]X+1#@pIu#f'Fj!ށ?_/ӀCTk>'XZifOc lt2 x-TMiޖuNKTɲ4J矯+2QiJTU^5(9W\So"-ͭRPݝo/^T-+Q}x1 ]LeaC\T4׺38|@U޳bOKբz Loj= CNp@'4IH)ؚ|RuaR`ۿ,?ZQ_-@{[ϸV .&^R5B,2kpJ e3[pVTybE>כ:y}+6co&X%{WT'E6?O *SjrdqyH `w:SOmά2dMSz^|ۼ'Cr'ZT'SOmάW[ S{m#iUrwqaMU&BKucC^9Z*x ݮ괕Run K%iJѣ?ұuɥ'zՎr8I*N)J2e, *~y`}gIK*fݠR*c*rM ⊗#pҵi)$Ŕ" BZ*roq{?aw/H1\l@>51} vВj ]3eEGwM@8T(1eY =Q aoH=~)D߯~7_?*{]]OcR+dD[&nh;/]^7WB&FY[+ѧnS+8($ӝԳ[B؛EZ!>}Wls=[{罒u#Umd`zZAZ!Je]CFW\W΢]՚(f!N|fƈZ@!:D=NbSWnvSv*iyV7VVPWVFfup5kbqiVSlo#nXjެR_H^ix 3f\>=du4zc*?61/CFQ").(ްW0&v Ep p(K.ޖ3m|ɟt?wkx+嗨{z;%Э*lVoש:pM0NZf)=EB,ZwȮJIG d7B؛m}Vy *o/ef+k6{LVfNVuP~ٝu*& ^,ԧQ|:z ِ,7׷T{~_=jlw~h aU},犡֟a'ybY^?-UKc.F8OK!RkSJ*ǻj6JcZfv5F`oolnohû_eZjЁ{عT콕vm?u囬@vn2Ė+54"j{-mU:Jw ۳NK3v{C=jHKu0bݵ"ݸaaʬ6!'mw98[ ani~&ۻE> 𖪪ʨ@k qWK5xY_NKRE{ Կ7ʧmy{Oru5[Bz+xp1].uwۻm>eZjכ|ٴ^7p w?U? ~2fR}N{URH`0<꺷F^^+ K5ds+7;W}o{^iQĄ=8ZV[#/2on/:l~PyA#!q3F^Rޙ5e,r|/Z SKe핷bq'8+YZyg1N-ըq{?r\̮-7Ve8[FWdˡB7sۛH7*Ԉkjo2yftUQjצ_O=v8/TX-ƕo{ihfj8l]zRAG15EX+'JWsbF%1.+ KuKd)A%Wj~Nk{Ecb`x+,R:ii,`R/R= `e,rLoYl}WoKusaw4y-zzmietAݲx~ ^wRUϑ» JnBU,"ރX]l K+WݯTUs0bu#V8Pb*_6X9]V~č2Rs/bKy4*x KePahʯ1 sQIU,ޜ.+?vs1}n,U0V,DK]p+XާzTp1}xrDZTXAbT9trk`,Uw˫W%R-Nʸjsy{8R}՜Aͭ%`+W@FW"u>R % Ke0-Bj5+ˍ j{N7r5]bK /+mM'۹\=ZlEWL@U2nNRZ-#㷆[$û_a G[f~(I텳F\5Ls2F*F5FJI[ J^v]kɔV:PغZF0FDU2QmnTpU~2vRookfCL-.lTWD꜖G>wɞZei}+fo;R+ ۚKx+\#1Jgyi1Z7t$,*ȁwRIkuuS#TףU]W"c]ZUE"[ʻˍUF]ZQQ1K[OK٘`h˰)b :jb)"aY0Vt82L#JÈ(hU*UsydOӫm4ĻtBuUvR#=9 #ԩ6dڔKJ~3Ywdn4X\<~2:L#l ܈/Ju*k 4@\niIjMWi\b]aBᤇݰb+ Ol+;Jk]pyRXWX*ΣGšqZWHpC|u0%{sZKg"L#]pjLb+ ]msz)ouݯTL-b. _aZzJh8-5ۺ“Ӱ[( ?pnnѓk 3WWz8W|DCƩIRӰ[~R+6[VF6r2.(]jOp *~Xwn/ sG4d+4,uo,\܋w-#H 01rՎ޺T ]W[1;ok㸔 oQZI%b#{#ikRo7ؐnjxWi݌F9J\ݾoo<#1i,, nĻ_,}=\1=~{eorOA^~1` Hj@FD"tJ]kɑ6NQ0>vw|Ng2ֱTSb.Ux* ~UT8;p5W9HW)#A1aZ@K!.H]CKkDw)ZLRN{IVsn)=TxCz/ J.42+Vw%)\^ n_]TgV?ڲe5؝07``0ºaǴ(mnL{NЛ9YY ir9P-mJ'K/WݯwF+yIL]¼w+Po,ŗY'V1XvZ@Rq5-[+;YH*N}*[/H?JU7=} os5^h¼MK+EZĊU 4Ǫݥ[^K9ޤk%4ьTs}zNvuCH y ;`Uex.Ux$ / r#`2DHLbJVoU폑N*J h.J:X2~ԛv=WZ* 9r4ĦuV-JC@#óRT>YY)⪮0f[{oq^ݫv1mz(p:%R JI7Nsv]ڄOVk}p+`{{~uyboKPoVSWXCY5wkluhVOk9󤧮z5 %9 4]ƽJczUyxĖ}OyKzX* NK 6-}[HsLc pUpXoط%lw+JE^: C'`w .~phKX./rLwfCpU0,oڼ-n.Ki* >S՞utoJNMN1=  &ݯTo ڑ2բz xWr^V{>ѣܔo)AwDpU0 ~z IgHj\ Wr? ves=%]є[R`` K :Kʼ :Jњ|vfe.=/ȚbKe\ \ݯr[)AZF^;Nu\tJJ2K^\+vD_b h%RzbwJi0*bu*#[8vdB{"C 1=~GN0wJiރ>% v䰤RXo@Fa ܻ@ U^Ɯ%Vg4[LW(F/S^vp/vXH!, \ ݯTvkMG[1,fm7` U.1LoRL9]aޅb@YlyrDҝ钧)UW^Q;!J=d{ZQM VExSU+L k2V <&J HLYZ%;K98Z8M)0h1Rbnj 3J ]**ݯ[ݓuGr:L+ jL n(&BɨNh4ttҐ뤑4ט( 1&qZk!ޘ`a(bS 1=~/N*ݯYZaka\9Ne[JEFt*Hzi:|f˳;c((M@7~+CnJ1Z]cz8 wRł&ƕx4qXXPI}p3;mJo]L0~-6IVE]@QQPok5ܕt;ؐnJ9z[R  x+,s0|΍/<7ʘ3UfN()W7N}SD=Nvɳ;#0.+Jv/Wʫr=sdnLkU~RM bcױAdo݀bN lNkRʐ$N(u?J,4E!hZ9͘h1FbE%0: X].K;|%3U ~Rګ6G끱JwBkZ+iK]uu)E[Q,+X5ǎ,ª;h,yk즮6%&JLfكv0#1aJ-V:s<@ \x+,U7T4B{BWb+)bk'#?…(bO/vP1܈\U"JRj0n] rbN W" K%TN@I2a(<;W5gH)l?gukI%WIʻxY2! ?Dx*PWX*)461=a`pU͖qx)}!TU 2Q}e{]*,epU/KuF͛ ~XLaX\`T%=Kp*hZKu.ЃࡲB火*XG8ʞ M8,`02%&') `ΈY?k-i7r)JZzZ 1=Ez܍/jS[a] pUwJflro6\{m `'@m^}~pUwaox-bn=%mٱ 2pUwRbz"ژ`7pI R\ v,ՙzwU+i&*v͕$|o]f#)5w.W*u* |80pMd0R- t(ML pƿY[(<\W ,N=tuą$#8L.epUWX*=f_tkX:Q?0-N p6_1E)ތwR1ldBWu'I㋩7[]wYOEU~RӦ:َS\F+ ڝt1$ .'Œ դb8މwz:os_;ATzW ;: v.Kp/ݯTS?eLSIg(y1 m`nqHɣOThpUKuq{5@z}LzT''=phBpU/Ku}v887!7Ľowb ^WzX*LKgY!,dWX*ex7Z}_RA2pURd.K~o0&g7$W,@&VKW,@&nT3KYUmncKU%%=^]ܟ۱T\U&T*X*L`v~= \WYU.ad0&'8\ybC ,+z.X*LfX*x!Ku +OΈ!WD[*vcxX*pU{Rd_Oabr;U= ,@&S*,8 q#mGɂ$.𰽙Xj֧⺰TUwJc?|(d}U^oBևl>i:UaTU-wzC?:7[ g hKd[:%{w>n\9NjrZ~RVVGرvR~yo#jM˕wE[~sU WTJ]9zCZ3sJi;hK帘~Āƴ;uarZ~R'}v'K.4] mA/_WۊS-Ja:ӛRu+Ya\UWsP1͞7\kBK;J/M*HK\jx+,1m띛FIҳD[|׳F=-{T]պG]@7uLHV.{y=#vR)1#)AB\e*_2"k"tqR.wJoąCWMJWVLEۙ8d>qVFp j-eZ Tϭi]]HhLk(yFbvZUy[%/WqJ:S2,uC#cWAO91Txe8L l iӺ19؍](Vgg wޮT_xWOTbQ:\gPxBK1孷ܾnKU[`עDΈ}wUukkauSZev%[%۩aޞ+ F؝7ꝷGnTUq҃~Rfa9K-g*bYv-b%WnM.%ALZd R՚VVozĪX](bwȫw.vK® c5~Rf*s%u C):c\+JcDhvgۅ*V1Y#mrI& pu[ƑX](? EpLǞV8WuYJr;6%[Z2S (5GLm$[z;NW]5ʢ6PUպY2ɭvj#RȍwUsʘvQ]*7W݂wz+&ޯjre VCAoz՛+ޕw+oo~%FŘJa#jSZ( H>ô]evKqF@usTscGxWi,UoKd8oUFVUv(qj"1OCu;{'*ӵr]2$)YZյ{NV []uLQvyUoNڻtW j>yAEE.լgDx+WX*;H+r5}5 ^+N6:ٽ6bVҕؒ8oճ:~FV@o:qF^,q.y-:f Wu*Z'W讚ՇpYG7Δ.~pu &< ]5V_2:"?w`0t/aUat >6w{,X ?.\9Oo[vZΞMX}󞊬7^3W[):ҖOt)$ug]>9esay&,wfŜXŻ_eTO/Nwo3Ҟʍ]ڇl NWh4$_uLoNQ*7 K ۠WS]1+UW`o WuF[ I"~&|L>[ @Z0VSWXuXg8ݽJ oĈBotq)l0l?OL7V9wZRlŻr&sR=1TKصl/)q\:[5v#આ)FC@֐W XNU51A7xi"G &^f2+,03գwZRŶm˜$- iFQRj-ZcXֈX*j.{I9ǐZ9]pwvNKSU ]gK!HZ^}uvo؄‰\yLeNIʻ_eT{j*6zc: Uj m[GJIԝ#JN֮(PŵPH4*\DԠ.y&I].zK+{3nٕTT_߶.p7V+~Rd<E~KB1V:&xB2{XjĤX4N Fou* X*N7R\9t~K~eV8gc: @2n7>Xl1K4`q:GRdv:f ,KXKۭ 6O. XT/vC44j31),vp[r%aczwr? |/Ե_i ms%Jnj1^Q,bcz+_okZR촆;R^jyRsL¡/~R[VeZ#ݢs`)9)J/nP=*ƱM9(W*FcrKyWuӃxAx9׸*jAK5%9ijZZt]sLݯֱTSY|P(/JpCa^cNWmJ<9>WY-xI1&2v*sZ3R,rL}E ~RUkV1PFRLU^XX]U*"8c`AjjpyÜrI5l.ٍWi kXwZR]`Q⴮vSwek+{uobcz /UKe;oDvwUgOpLOKOK)`)`21=,<'Z*6XӳRSRdczX*x X*L~LKOKۏY`)k+LXKpJv"'Jk ߱T/#M K4y[JTzu%V)Ux' w֩,[aLkU:9ݻ9A*Al01݈*cmVKc^F½-s6+/#zĪ>(ýՕlz*W]aF֠Q2S (pCab^=Kؠ0ZSFsu;MDR{w^CiR%൅Xp~u9,oa`jeIwD0ڽ WJZy2]\4BuPnU4E_J GSs*%1opeRW\44Vuş*-|R4{4jQ"1[I%JEE-;<@mCpnIq\w6jc7Qy\Vʕ)ZmI{ؕW*Իݍ2U~*XK2ݯTvVjL.;S"^#FvF\ _zꃟq6ss3+>M)6{y+`7]몢\.JyTʓ_[_~Q߻[-_?۶?s/?[_e߯Xt;Pa S)G$7X+sbY鮲'nG8dJ4YlU]x!n|NeoPK57ۭtKVTNX|^\tnBAX*vv+4oۯ_6W` #nQsm}?ųq϶ޭ;qrY_g`;Dx8rr 4G[&X x];$^{ݯTiڛ/'+밆ՉMNizkU떹/^#<,U^[֝wkޑ.VnW~j^yyX*xO=T= X9h\[Չy[2K, 7pWxYjM7tgg F%:R` ={XK5ZscLmX _KYF}k?d_5֝7^]%r+Iם,қֺ덵M6ymbC z>Kg9%ϥC̔ Uojc2,e>W,U}:& *)2\WAo-YŊsZ Ȯ6ͱcnڍԆ)ªe{3zWb_kVSY{R@>5S_x)jzК}7e䐱*61r&Fؑ[Zy(5[dRS-n= WK[Z║mUw ` +;oU2KuPbtCCWW}ȴXu; NW(1("*UT@1MːT-ӥPMwٝ k7|PE{kV< X*HN~RUG\3=Nw*6)u*}߭]V ؝P֕T;CWn|qQc|JiTbH+Ǖ9v!Jx=F-IUĘ4pҌne+z{U.w {rWiv[ĪAKq8wz:uEcҹj6{l?ZpOW44o^y"*իVp- t:aoTt;Q/X*x"5S_xjR괽hjwTsP-UnK 9vVRlqKrE2Mlk;\hdwѼZUJʶJ8ZWCiZYy sj+w֠X( Sj1H+Q%w#؝ Nsi"I|,WFih2Z 3T[\){ -bt>)- t?_nް7kTEeS_`2q/Q/ LɈ8>M`2-R8'8\t}rO\R}a3POWX*L~OK `>8%X*LcgZVR+.*ܦPfqoeQ( (  5U%fάfoP8!nBu^]zSl  ՛-Uja].^*KkUWX`djRcDfgfYOjLoϩpHg)ǎU.7Pr]˫~d0.ZoRu!- lp|*X̓W:SY|9L3Δ]>w 8ɭVsv᭣{_[f+2zCo?ǻyXr.en(0EjU*U1SoOSQZ)骭Ԧ7Hd1 _T+5< ~UT1GcLsU /'5La?3Lf9~RRv'Rk`ufVV^Wߔ[V ]lȾj[*%eRj@wgtFX;(;8?'U>ȧ)/ <9@ħQrb|0Ɨg䉝{[1T뀫ui<~Kmk'Q}Py rK! ﱰ<2bd@|Jyn +X)jW ROٌXm?R&XU]ݯ?WX۲b_x[6<,Rƒ>u,`L p#<{ݯugp93yKң)gkTKcpt13YYSx, na:eg Rj8/K}%6LϾ=:o=SOx* Te7bx.û_6n+9*{"Nt}YPؚ}Wuӳ/uC:D%ΰkJ7vws^ .2UReJtO3ى5wK3]::zE*NS'hGWcv%jy*ۏ/ՙU;NW<]>YoQ99AWb,NSv#WՖ˙ Jl}BdWcU87H7gl'[ά!ƃ,qmI`x.ƻ_l}gNt9b9ęF|eP҈l#XKW1'\8=xQz}@{?U<o0->LNN gv1*r[3(@)Ev(ӺZ9UbӌQaEjrj%Y[9h9JpEjӌ#e+t.¬pLwظ<\x4jM$f#zeUy7YDꃃȮZFFZĢ*D%Um4]=7MsY4v#`\J NU>KeYZ'N2Eivu.MS0(c+^\ vn@VH+cݎ+y[E%-lasƻњيfS\9ǣ.*8[WXv )SНW9nQc[rZZ1nҒKݪek?HKX7=ͮX.*9mhު!:Ǵ*ϖzX* ]x+,`,^#eFwN%ꤑ%y+Ѓt7+Uo7ue0]"vl#:~ﺝ6Y`w5MsYqc\̂gFj0+[ʛ>cL oE*2Q^ww E.VrPso5!,bZD, ^WxlV_T3 ͔vvd-U`RUA^pz ^x`VK;/To"r "w,U5KkT.xTKrw~g")&m,*9Y, Mߥ:<#OH+a.+ <$뀥D LT[oT; zx, ~Ѽ*0X ,@&9GԎ/UARd"vLSLOU%\H, ="X/x<  OL .Y5Rd"R5s_X[U7"X*L`W܂d`2T?w H j>TXRѰT',@&ֱT8zL,ynKD}Ѵ⁥:\-`2q˿KZXZ]vjXU] N g?z(%,pUAsc:lj KkùRdb_O(,:ΆKu,=,թ7tKpXuXJ8\y7fܬa.Wu%`2KpB(Uͅf,@&:~jRj"=`2qR N`!.pUSK5-U,Ս{oK3~r,սFooKu,`,ս,BTXRR*z'X*L,xU|abͰT+rA^ s=Š OرTˀKoK3,`R?oK?L0VݱT3/K0z5NmD\=,@&N K ^WA7`R{LOS5sR _`28K\7tRdbY,U)K[iR%UC ,@&btG./z'uU/,lTwvR!ઞ2S)`217';,U&^P#RdbʿKuӊ\U`,@&bmuDkTUY)`2ToT&WK,"KPLI`2qy5T XsUk%`2Ng( KJTKx5t-JmK)9m}zaWuIyTX,@&bD?KWu[Y_!, s?2\+_\ v+Rd{LWtX*b`21R$KnS0 *G.0X*8pWLX*Ltпؿ` ?1TT׈R ?^Tk7RA۝f tTTe4, f  Z*/b@E$?Ȅhf"c'k f K , l Kk\aT,@&TDcKOK44  ii,<,@&X*x X*L9TTHsLc)`2RSRd"1DcKOK44  ii,<,@&X*x X*L9TTHsLc)`2RSRd"1DcKOK44  ii,<,@&X*x X*L9TTHsLc)`2RSRd"1DcKOK44  ii,<,@&X*x X*L9l^[߭^{sDcKw,jQ8 ii, ߱T=GX*L9T/,|Rc2RKsDcKw,jQ8 ii, ߱T=GX*L9T/,|Rc2RKsDcKw,jQ8 ii, ߱T=GX*L9T/,|Rc2RKsDcKw,jQ8 ii, ߱T=GX*L97oX*IsLZA߰T+显 aV&1}esR 4`Vc`qT+1 8X*X,pL, `e8K2XiR 4`Vc`qT+1 8X*X,pL, `e8K2XiR 4`Vc`qT+1 8X*ᘆ3~)"Y90 `e8_#h~v7\.K2/2q;8RbjVt X*~-fU븪Sò`Vc`Z"X ,pL,  `e8_K8l5 dRŚ`S VaAT+1Zo׊).2&jV:K҇hT+1Zݷw{hYb@<"I3hvjRxX*~-WkUR Tء.G47 ,pL{ukĸ{i<8߸eR kymh{~wW@@5btE K2ӯ%^u"^#Ѝ:oF-J6=RKGX*~-jMKJ|55z\ՊӽͮGSlVK2ӯ^ux5`=?f Fx쫁].m X*~-{UޕxϏYўN2A,h XעW__K,1k`:E8L ;, `e8_^]z%8tث koWʌ5Y_kXײɔ[Aqck> stream xuGߜakqNKr{q +mP~h)Z\{N3&k$d3f Vf'wJ>mon<;3IW &Sbdrǩ=Z7߲Ӏq+O# BV=늓ze<?ٽxوޚ+aM7ew.w30I&഻鸨XU*Bh"^;k~r~XH6Y;"b7\s:S p 8ؕogtZہ ;x\-j~ =ϾbD]S<=g!Ω,cΨ&IB/MǖIAoS97Jɮ| 窳՗Sd⦕dAצf7U/[<{lޣ ? qMR4;·Gskxb[Q+nY"߹y,An&77&4pMh4iopK?P ยrn\MA 6%0p>QRy9Nbi]8A[W'_7e sn&GND,,ØO@DM+p؀DDe8h ?7Y\glpp\Q\G}")c {e;ق8YTU28IG8(.وc}ˮxXpPG#-$Aӂ{R[]!t$83vS@v9 #c1 d$>to_Ywί8W! NX{I2qEqW8B{| +k.{bN̑)=Wظ؝ Z75C.p*BÎ=-_vrϺOĴK7,_7PX4ѫyJMM۽\Λ;֨Ը䭉3"9 oP~y.vʞ[5eUun9p׍o[z!۝ur0c48~[7MӺխ t<^1mZr;o k]580@ƿd:38l/V._8lxn8sPil2V{{˓9龬Y#b$TX~h4VҖc1c:]Pʽ3d/Ƥ榾ߔntx`hyɈ^عHR遲do/UXJ,iY rϩnsbXs/ ai"3C1G6༜M2L9NbO6O+O_OVI>; cVT)65ՅցOH9 \)SAT[.Ove2[wܕ]ȏk{&Dtc3(p,T&MWkgʘq(l$Ȥ:} *iRQ.y\$*ޠu-JKkGhvC,kCAK}ɰ!hҪ~؊͢@cR %Mo3S q0-9i6d?~N>_zD$ß^eS5ZѬ~ ۤMKTMUj~/My%K{ rlhJ[y Np"ZӟYf/1' ڄdH{Cufy1al-w_s^*7+[A@u)(s+ Vm<s*CiIiG6 @zjΥFŜ khmunlaTkfӍ0h8T5]g:@P| !qNHuiK{.hIڜ%8=|*+t}er8!+}8;[Iā^Y{^a_SYN<. t.~lD` ]>DMwxj خ0OaBAjUTFO?;:gmF e740C5{J=i`1e_*?|c ΪE{*[IG+;^+"cTߎYL2ΔKͳ24y%'+,q" n42e-Ej?e F:"V͒&yNjq8ttZ ބV\ֽť2om855wb uom%h( 3ɃX'LCunJ-oHw 80ֱ\i$z@ +hڃ"?\G P`7A#ykJt8Oea5CBLtuB|S_KȁfUgA8QDqNŰpXl*4(**0eqxܻǠR:($(ֺj2|Pn)ULPDU]{꫽ʱeV|tgݯ9y&HtJڒ[eE7v+/v Sd!1D Wcǟʉ k1/-Nl^V4~0RO2̊9s/^-E P%ks8-IOT%\uip]CyM+ʘqNwE`(qt??E=)p|]DIsG^bN)KDZu'jL:mΎQGN3ՓJRvfprGsh4a}lB6:NSJPjCNºgJȂ\N8Me:"}S> ϔF<̊_([PeGU%}>p,wp/r#[i5NSƌ#pT#Ɲzdb;0cOre pVYQ-n-fAm̷,YYU]b@&Yi%]Kq>prU{]&[mfS~Ț3҆)ퟣ̟jb|" oM{/ŀViǚ)Y ƫ*ݑ8ƫbk{b/5[/nZelϯGV*V#:g2p ԯŀ,&JѭQ`dl* O!7r6~MQ<t*4 cbxICf,n/)_b-$.T@)k&+VR%ۯٯZ;֏1(`Bj}` 5kP5AFeV'.FtVnڵ\II͓ek$1E1nɯ mLCW8ISrb,/H}ۤfΖ.-S ^, :` Zo_~5֘!APvuD{xf'C| ̵!]v;uE[S &[<Wd,pbݤQ3fALڔ1yj}Oռ@VQ*K6;|A1pe  zzĦwH/|] M 5.܋qNU(+O:Tا*7锾Q9u]hèv.pc9,`11#z.؈M'CFV mcDWNrZ]]k)jb q 8vnzw\[tyUoY.gQةsQvlc߳3y=-dovbw\+o(HC;@IuGբ;d \^!28 T'v]dR>- mOs8=V\7]Aa姐Tr8|EZS>Z,NeZČ$HBGKlϥR1ਪjlw5VS'R^%*֞F:C?NNb%:^#O'eƧbN6sT_LEh|zv@j՟&tM7Ci!v%w6u=1BhDE՞S7Wm[3r8,~КQK rq~VtpHkE:_+B^!;p~ql Hd dʨjWltB7ϫ%4pPԯ5.k+_]5o]#د\aPnx N*^7tV8]$;0nr8}r& L/T&%Ԝ٩oYdeܵQ܁úHJnpXb=@|Ǭ ktMp`Gr80d=rݵ@3k6sU'NDc=$B.j6nL`q$Ȳޮ4(/FgGIwev:CV=q5pvMڐJ[|mX#mr!-Ab/Gewfһ  LTwB at 8c VvZץMqPp~"c w8UL=h&X٨cah(i68 jN܁s%V 9{#ggakTGXtЏĵ(|EId:b"h#5AQu8Ơp%ja "3EvЪ2.4XusY] ,n)vB\]6I,6* \ϑO'B-wcgp:4r8 I(Z6T 䡡ģ\!cD$' 9Ws*\weF*rٽ pob NbH{ec];yN֔뗍tq]f\-.5pڰߎ13%<+=sD&pbK: N֚1MR5JLƟysc>F]CڙFoX[;j pZٽFlEp|8c86:r$wßLZ:ts8*bݼ-(D1</%7ënD  йv}ݡW;YJ3.qcmu8|ȹz:nbo4]N穿&>GgT8N(, ࠓGO]uWnd4qDյyy%b~O1mW^=d|4cxטp^e pvdϫ];i7[XMb-I;P8wvޭ#eޚwn@ijkkIm;Fsmh+;>hzRsԦ3ٽ[$:ٝGB3=&aIɽ΄;ßrZK:kVmG+LN{lH#ڢ>;XwRv%CvĦ7샱f!~dB,uwCZ4R'X Uɱ. ="/>|ڊ׆golwG BڨS ?+r 8i*>(*yKnޒ'B|"}7pF +H,̿f&tpxM?%Y3'mR]6ғ ѤgAgBET>d?z ~,9 Xq/;Ҍw:G͎$䀹Uϩz+RMw`Al=4SK0=0w@oi<V'Nu'ISztը^*tSy%%>Z {N;8ԫ9Jj!ԋ (QRHflSp28E+࠶toIu BJ$;c>;C8NDļ3fp$.z R d.НsMNr.wVϕŲ ͆eQvB|,GM>Z320pxUy:1ʷ!uvvBP].+M)/>)^]అ~;w.$[V1ɑƼ'Xo'>5Pپ K*_7|$p3'g5!w?7Oe2.p+Qd3'juQ&pA6 dȪsLɚuT6Bd 7Bε4,,K^}d /a!9e%Y[SRPYaU9 AT_ ]@*>jV(,Н6w9c/Gk(% xe?j!-pxz'5R/f=oɹTdpIlʼnƚjgzpgCrU3 _i.|[=ԏi46^sHm>OƪMw}ݚCH0_Nr{_ uRd7.Mm"_d7hT{>U]jɪ!N3ZPc(+^b#![n}GjWR,o>uhƹICm3ɂM+<~f[ܴN5XuV(7 y("CW1)=QuBt^,E4cC?"j.zuBibT1^qڑ^lO-..C&hmD4866D&f6pб5.SXmGFWtLArY<,&>=^mVvfo*;Nv 3pmM\pbg+a;eqq9LwGʮqɑހ3&@RUTzY8vbӵ`Yc5M\Xc8Ob42ruTɒleeMe^2g3:BLA 9eP(=>iqh3튫5gNNteWv]>CIӕڒxBu̚ i:uYu`C%.W5@boʲؚ®ܱE_qb$.ٻClV hE }*m;pJ/Py07zծybiO2ޒ\S9C,zqp>_4os3)p=O-ضUbqj7wh/F=ez-kvZA(AD$ IL % yTd̺?<,2Cxc3!!!!Uc3!!!8)sD ֙!⤍Acd8<#2_H"~^xM8lIgd&BBBBq߄f2"BBBB/nNbːسkmM tϬP'DىQsF]]PRY(Y(:o4!!"J>o4!!~F8BIB %pAJ % ѻ_=wMXXKq;yxŰ+=#\<ۺv5鎞^W. 'V3 ?v/}wJ6pvFVv?o=Ng-.&t.8žB e- A-~ N>>/u]Q÷4Ţ= W3p:d[Kh-JGMy8KZ!+) $mku8p$ė8\8Bn Wy$65 8vȲy\9g֏&ӡM}Fc6wws{0ڛL[o&vv Zo\n}WRMkEۥ1co!Zg2kT4hqAKmLeat2'vڼtpm Zyyw_{礓}S;OO6C#C/"\=ǝ'ގZe2!{tn=f"[8~ed`z-nk79дΓv"y o਴G7Ag ,Y# dْƲycb{ :h4&YZzvHZe7>8$0~ec(fwcS5"U 7>=uO Ö́8!WCsi J)fxک(g .C&L&hKN)Bi𦥶CYu\jycQ؊PPh4bsj)Z1l 74L{K~o )T/Bgt~G%SƜh\X 4cCůC5ӡD߮LUϊ 20|!E|擟 8:aOW.C qB.G:x^F1}MOhs$a("Ur^${†~-1O "Պ w𪡾mٻp{y8CaBP 7 C]`<޾P1;I4ymmU|>4~%/s0VHz ş GD&,H,A(<>,.لCəI/^j+gqtDUX@}4c; ^>- N#Ο9*3U<Շ`]Ku)@2= |5)c8o&:1ReFkCÇs̚uH_8<`\My +/nq  d*ЧpH8Nf> 6 ÔiGԂVi(oQ]hRޠ22?65dyiƪ:w'ڏVAZ 8Sz^@v,4O]8¢$(&u RX8pi ⧇AlՅMh!4Ų\F[X S8=^ +y܀m۵(͂) lRv8]}6:䦿BI8J@zݚTl5m"Fߠ9Ï3%pѪ:aJUh!ހ%>PH:׌|iaB/  <)5 j v&{p^w޶aF-\-s8-^Y)Dؐ%@S@kXy{p{y8]J%p~e^ ̜8o? %{>wWar> p<g+RUt3e^91$J\2ϹÁ3=h 8oXEn?[lȊV[N dAHC44fCF)>G.͏0 ̽>B|Iڱ1N?m*S XS81ei[zd+g^X@%s *n+EƘ Ԭ2O(2Gi;vb֙0ӌ0&L#B st @h}4hJ4s!:GS0GYam$}(rLIyYS_yH4Ү| fYnnĘ+c0&0؀qbGw{xLpϿ~H$Z-o+Ϥ]n@'(\q=bIA QJlf-_hU_IUH]lAɯ2t^Pd+/3{B۠ Pc40GŘ҃2넧g|LUu % ioO^-^F8<ΎS2\!G}*&PCf e1e *Q= XKπYjӻ.0]'m)Ͽdf@;، =E>KN ǿX 2MRԘ%JtCVf[=m%2§ pi+(27d G|EcCSp k.KQTIHuԄ|ާR~v_VȖkOމՐPWSYKΝ<)ۉrgX7 qr*z7 gkey!X{O,52`eP6t_A": W"D |zgWG\e@qKJoOm3>^<($Kzy!8T#O}uNhDءGOV8ặߵɓ7F VyPԙRN-<Ӎ&ܡHOSQ:;~ꐺ<n>~ZesX`OP ~*V]<@*o>kFqRGG.;W^ 7_G mWK]XF8r3pbEbgăڻVKG()9Yr=wC/;.H罗s%,cDӝ0ӿ~S/]e0`W/DZ 'kIIyAt r{u`?i9^I1J罗ө4Q|SM|*ݽaK)V/u+U2( ߎ,f;BWԯ@-,۲/mj;2 ׸pB 1uM@~J#W-_^bFywY16U(- I=mL[uZ|}yˊ$ۍi FShbV͸ٺu<gF_gMSO\k8pv笰xAH٠]c!i4&ӡ J l*qzPOM_JĻTTd"B. Pg>ufZoJG:Zy^sq3WG~G=z׈gRZCl5Rs\o+D٪T#W:R I&Q* G3ΕLDh'Tp{y8/EtS:RrAv7^EeR~3>lS%;`.!5mV}s5W6ƻ &.{Uڒf.W1qaf~a~lI+^g ݡ\R DXG%^|Z S/X3SB>%nA"^8 c? kˮΈb7^m1o47)k \~qCS:* ߰N--]=6%_- ֖@zi V 8o8*y8-TY1ų!KORttϤ$e2tx]R< A/ZȜ[RǪdHqV(|R>1! xS=Ki d8prQ `% 8UW/ppOIf 8HG#g%1x }l'o/_GJsO >^PڭUVS.ywv1?+%d#X8H{ Յs+N1Z-Cڅ(`NnPG%zD}tEppv/\؁3 csK+j[_)kCi;9 ҬPJq'MCtpAmJcSYR؀N3 |Z8ul' 8:!Jt/ Lk6cVʒJze QdAL騋NP 3OJ8e h=]BMZSQĜ Ȝ)k5cYEC|H[p؊5裶?SNg2cyZ *xsc#t/$ Ftyk~6Fņu7P%A:[ I`12+|#>Fϣ5Nj C%L*41: m͖F76YPL7m.`B`fI12;`mhs)`mJFK8 F6|ƙ; hWP~wAIeG\[82^n!ҵE$`2@@͌fhmi4uH[9oGkCd[FR2/LSe碎"^Er4GyȗX Kdd^f>3:yM-I*ؚ#k4';p-@>AjDKqiG9אDe^R8n(]8zwE;}~S{{]>gueIϩv_Td1^lNSE=wP^ҭ"E{2$*9)}2JNpܐkqC8BBI  &7$#$pܐkqC8BBI  &7$#$pܐkqC8BBI  z8E:\e]Io8(v %]%M!+N8BIW8pp; %] $]=u_W/9~P6j/'_EK.[bkAֽFZ~?7m!%a $5;~!yg,PppO>q3UJI|YnԪ{LG( K'Qx׼.=8BIX8?Փa*#%Sžg  U:,,'ny~Ih]-8`C0ހsJN-xQwN]Ջ|88ZMX~b`{{ײW6w8f2mw1n1W8La~mE~7.LWg 3 =ԧ1t%wji&6אAۘͫ%=)Fhhi2BL?Q7+&ݎrJ8񬨝=2;T:[)}zpny_A`)Z3T' |N`M,;Tyj- }֏i.KPE_*B{`K0mY v̓5Ouw| B0\/~De8oI·ՆFh1E&bq` C2l'g,* n{bN|*f{ NƧHIz5#~3BK3ub89E1=LU9\Nw(a'c 2Z=Κ^ZA'Q2UUsDh07h2 Ix~*Տ*UvsbGVB3!?(z( w#ӣ&V p,VJJ s"jംMGWvIp6@Uv05TnZfYS>*]d|A(Bl΂] ,1L?@mTz2 9N|`[XQ>y<8^+)ǒ8ymR'0c̀a);(s7!8@k- d{=4B8w0^ָC)~ ٟd9Aht$1K8unAVDCBImYus$/ztIQtxN۰&@*ޒR nwzQKwUR ې~c5jz9şSk&Lڜw, i tGFv̈́w8]!%?]l#UCrTk9Z gd}7_7TEf/VU HrZ|+m~_o#,!)#atGZ)o%F $p< va&:3YT}Ol#U~u(\.?B^^!ɁsfwGp^C36sj*O Мloi ?s%\'$YiƸ.!/p*gwi-Ϲ$5pB~^7`ۺ10l72p.Q.-]2@O%pLM.z9pNBˁ ڐ]`2R|,?'_ xRG6&NdZ.3I$_lͣMmε`Rsd{{4Ksdy ͸Y[cId4N֏|X d>ب#1BY?tP`]*OU晇:MowiZ`K`42wjO'밅Cv|׿3l/oҺR?e4N|RXdr*d 5)cB)WEd:ǣmWKYS 8ͨSěJ(5Kh 0چ# 2+rFYvP,"6{%"Ti4+q p*UbqFc_GxM#Rz®} s˰&G Z~nU>b > N @3c[p<"*mT& p|un'4?u8`<߃8dßsv5  Xi]3/8?@+u֔iZ0Q#kJ^Kś;OJ%n8AYɀ5ԏݮƈg1t{rm pVBED-FٱJppp mѼ\}'F #3vpsz:BX=pGz/\L"Y~Mn2H,D36Z V`B8d#/ǩ39 =Iv01"mHϓgE8:1y"fm*UTQ?Zo1ڿ9p{^de]ઉGuxd֎pfQH N%L#y l@Qw9Ë́k>V[byƱK\#zY%i߄Kk& vjW"75#/4[5GY]'E oKա9b/_Mޢ_ N#MNde./"Ibw Ũk,1ߕ0. pnBuԮUf5M8d)[bHG Jvd(JaB(Sګ`izZʝ%yMT]FhC֜5J59s<\ ꕥZ\?Zirl$g4_vs֏svU}!{UtA~;zKG*`$pWW9Sq%skL7%[}h[?cݗ.}Io@}Wsq[CNr( pޚ4m[? #8Ol3FUѝVZ8B[oBxWr2H&j-=sdG8BIW-iP'Tɛ*NMlM %UlϝJ\%4e[4}A8+S#fu(4~}>/]SDO.Ƨ p IPrΕT{يE§1BmczT+~k\0ƽ$3isD(>`G-82+xS:VOc||rq|hBX@_gf0Kxs27oEg$|#+p<݌(eL): wIzs!7mݾ W§1u) (z<8_ډy]7f.o&}ۆv⁡c+8VvM|yN$ө=Ne8Ou+wM$& G(bОyKʀBh :2W42D4؍cbl }& =LЉ1ɴ3׊32>/\ܶ㊃nqO<"=~0O "ՊwȪ!loB'迌lS\3uV22v5`J؅2y-j^g@2 mykD\7^[7Pj*>dWb['#7K9Ȁ oZGEO~0؞v*:dLGھl2{- pv'&ڙL󼔜7$v~x?u iLJ瘣P:AS`!"SZ*$yj @^H.ȼPoGYŢ[0neW~>IQT͌>-iI);Xo/5"J<-ػ]M"E$PpՋ_8ľ~8o*y0}gγ֩^ߛzwyt--*]ݝ+s r\LLysƟ AxF6W}‘z}]u`uǓ3Oh!t'_7C'Pχ陌e Aح?BsO,Yɘ'op"yLb}Jl1KC !/qYjmDS;;uʓOIy5%9~^8a|_*-Q}Kg#!>p${ZQ$49x? )KȰM`Hn&MvWt$>T8ZpAkA.Çia? \b[@~`pp#EJ\(΁C]U]J#2u]8$dcV ލ$d6'%\JWy%JibnuIō|%TΛ {`h܃8phx5V>;4>5i,+E8ɧ8Seg 兺١20t9 839,"B9*w:_L&ΎJ".Fi!̖Y_X=/ 9[6 pvpA .b3yOjdO f!rp,~iHQG65{plc8ݥN8$84Umck6@R>t_ MzRvM8'jWYF3DȺd9b '6c8>͐. -ց:~2 hDV7֛͟+i dWgIDuƳ`E3ljЕP%_F1!K)ʲ+34PXOzZ8ۡŘ(5/̋n.b] 2K-0l2'J 1>FNJ@kn[/.bԦ6ͅ>#El!f?9 a{Ϥz}֬yY6qqI)PJA€)^`6 uۊ;ݭ{Ej6qܽwys}Ӯ>m=+5k+NؐBI,H_mB4rYVG-N㜤Oxƒk@4#nYbmr]* nK 1EkT# ƗSp9df|O.iӰRz Mt| >݅uGeJ֡dgN!$o=Iid$qӞmgeS|ޤ2Fcǜ~ ~EZ'pbL7un#Le1z$.I,ब\2MCN8 LlI8_ZQˎ%p6hYrKSU󦐈7M,ktK<)# 0d:KC +o^~9" YRe85 @6 ;kdž/2BL!f)s4^R'%^3R&Z8J^f3AlOe6>[zzz5#? EJqv>_h~NN8 \Tݣ|4^$TpڝYpbxԹIx'Fs%dO&x赱ˀ 4.'ehHfOqN`oE3^ě7|=Ccl`d$'db7l`lS^N5ke{7^ѦMeT7`)Y^T O IOQVouzpG%I&7}Vr';l?>NJQYZT &ror~=F6DyGD:kΌ6d \t4W &>&OyZϐp֔il[Fԯ@@W 8odLϐzhꈏ+Ԛ5늼Pw2IE!:M˻hs^Qև pZ6Z0iu?]ܮJJogb4.0gicC|W7x}&:Ur (ՀkymBn#-f?N,3uV [4ڠ¬=,kXX9ݯ#;8led7_2,Uƛ:3#4f* :.]{mwu+Bl (-U4 '=O]~ # g}tJlg'KiL3x=9Q":qnIuE9nSGu }0{BDCVx pKKߤ82Ήٳtség/PFmVDQ|=)AjƉ|Gpr@ΟE#rߥ˶uk`>Z817BQK-8o9mKQ^!}1zP?&m \aPlPε:Mf0<Ļ=tpz.j6!p8o5:{#!kwyq&4&Pr s,L\¡=pY}G;GJ{{2'lAz 8ڽ:܎c r]쌛2À|\3I-NȝE okοgL,FxUXƸ#!>rQ70/=+"8kL7z k7F~,nn\T2uk:_7ft%dJ2!="Ids݃J+S/hNCWSgse&1i|tԵ?N7Zqeel XF?D[ p6rdžU'Npxa0l[~ Bl kk4)g%!v)5d&}aZNa%)ۢ;p$tSqF 6hP^u딄_b5Ew#| Гpb-$|k% 8Wiܧoׯ{}!m"M2e'YIZp*zjsI+]:=6NI;[pD-8y,|tI+8j.&W^o8ę:3_( 8WN1Wyq:DbSK%G*yHZҰc9+jIf l֮8 c|$H2_8j)sEzr3ItVAhr 8]TS%G*yY@WC7%R[pmxk|$H2_8nGgqXox 8cROm#|^rm!v-8q~ad$H2_%wx K3yId2ξ9QV2$KE4$H2_9x NAyEw+jIFt 8KH$pbhf50 cOO#;m5A,8>d sNFQ3Zzå}Eɸ6xpw.6}gZBT ՝8&h>'ʒE8`u$i=EnAW㴎CMTz}u29{Ȗk  8:3̬R]sFa^^׮a37GO2A?B+}{\6I(^CW6ǟyﴧJHZm&ƱC9% f7?/Id쿾ܿD8p[>S:F~b3KMѤԓ[28_?N ~?"78^{O"pFR2\g5K1"p8N4Rpi(H88h/ЕT(c#O P @QiAif8 RtN1AK;8+M Tg3Wvo_hõ۹zlT`#[mS8Aib 8ǡ8A^_t3zH8zc,c8/!pE <%ߒvgbL*S&≽pe؉T8[fܷWR5C:`5*Wpc2G]W۾ԧ ʥl>:.6 f!29o׫zM'˛O 6ri@wZ\d6+u!'PjN'@UW+%G, ii9"f?3 fpY4!]rs,;d<^9Kw'Mh|!?8;5 cpbO?Zfk?.O=k:?C^-8}q * ?T.<,sݙjnr|JJR} 7U\'Oh(v W$UI2֓Zۥ?u8k,y ~FT|>dglCJ$"9.վ-Q:Yz^% `W_a6$>UB%UQ]q8"{r*xze U7]U!Y0^4~m  ,k.ю7`_&_+Fq3Lb)jF߸dr$7wWo0uK)3ݰoۼ;ϼ81} yT|=SE7+.-scmdsN'(ZzѩJ)1|9,q[w ^#ްw(`jSo 'M^#d%suFQF8܎7Zf_Hkw~AxK#T'o{mS%\H%%+C;6vB|u-8g`6WLU'ELPL>I/C)tnpH޳"SK(XۘrdlꉾPpSFCnu,l+NXj["pV q2^ڶ\e>p`A|ϑ2"8792uf2Z&3Q!diҝTipevWoը4HsI]KL ٵc)Lc' * 4L)ǃaw|NEVO5@h_熟RO_FvtH&{3mNjnR@nTU8w;U6uI5`L< ed8נ;%M 4˚ iY>0ǔ KSDCHQyoVX28nzب I/͟Y,?t0S Ug_eOHN-|vRX*L/ٞ5늠dxNE+^<$D%K.wXpi*@f+ 6phi"d pf4쀓'Hf]-(=2D&K o7i #biFc8( C#S*/.=kn;o@s@95׌5nX>TJ]~^)s(<!S$<Ү46~͡QbB\g%+9~#71nU{fm^xT%Ju+zOZbLV*1rH҆sqz;/W}?|Y:!ֱf;`ayUj cZT/9 M(Ijgh6YaPL*@b Zu^6m6}NZn0|,-Et߂BxJ:uj9/÷U=&x!k3rM}@ m8*7wKN& efQ`+*=(+嬀WіNeP殂e<lk ~c$^Q4`AE~6Eq=+$dM-(hO/礚l] gtHefrO0_p̝?È jC?F€sTc uyVBh g4.=p4ˁ'MT畱b}[K^;F8W\ 9ĸ23*sӂ b7fxn9yp"`.]A1`$E'Kf@Iyc> =Y֓.&N~NQFSe߶i۶N2uf2EY7wb ] }M0=xRP)t_ݘ7Fx :9 kwbJ2aȨױ<{vV >a~ ŀIfap |#wm 6ql S]VxJ3aEXԉ@ejĈ F- ,IDCt5x%N*ks7*f8IMQ8W܏6ؓ8YHk3>g=Ԋ j*pn@;: 8ќY-|ej1(ݴh%RgcNg(Нg[NLޠ%dhR4Z8;)fZwMՒ?#9Mks> Og c-%Iܡ2"!pD:&KN7Q*}uOˑi z1arSP$8.p6xsUp.m]*p/u7xG4AeIr։H;G;sQ^s$qW?}w)KpdOE<ܺrK/?pاce) f(V mq$Q%~v.]I S'-)Oɹ2͏ΒwYx@V(4?.fǣ(j[5!q8lʩJ3No 7UZ&1턞P7NR;L'xFlK>7ubb;lnsK%Z-?ꂅEP%07>SwJEe,Z6!Dᶗ絋 *2jLkr<@uZo~E7d_\͵uM yT'`"L$*S=WsMi%^k4MoCZƑC2crOz8QVrNWcpߌdk1Q7}Pe1pFˉ].Jq/c2vp;4M/Miҝ2|9xC#c63.@8%Ƀ@Zokv$ՓW5ōݺ/o-BNn@~g+6k`^a_(NlbO۪m:LfިV#(VV^(ϕLYuw>Ɨ$O߱dEd ;V(hg`mwp"X>J -3,ZkTMGafZ*ܱd%W%J!sG;V bq߼ulvbE/V4uZA@ub{HzXe  b1'MmkP@3t:i1MCFmVa%/7>U.0ֈy-/NCW. 0eb3F\lh{9rA~8!QNzgp;w\",?([}(8;e&ic:q珧3r$ъ/4j`ts}>%f~yc8UXįX p.; qOv*|$Ѝ?n9Xoֽ{kIJȗʰѸj>QڵkժYFիUZJ ·*S&%'u})pˎz*="g4uA&Φ3ʸPIF@_eGB6Mf\3 r6u.*/ WqS:{6SGe'Qt`XfzV1F?X?ko?5X,8DɝiFsG)6֚劣2dZ¬K{ڶ;QQ [@:Ι1Wl_qn؜GogKoddqRĄ?jmg}ZΕLJK9`Q>GBO `Ã%m $C؋O#tEZpNA?΍)K"2CۥG~lʌN`Q-,'H=Ny"dh,V6yb Σܢ/U4&,Y&dn KiPٌ/Ncfbe@g'17Ln,GUQtϨ08 ?Bve8pҪL/ 8$Cq֡w&70@~ݾ(:?p:;H=eJ. oy&,k~tp1lX#Rߣ9ȞvOtqFi8H>-vO=t]?a]GG>IهgZTŀvuw\-\ ?D=W;Ea3A/y3Oh$>wݩT_Ysw߇} :yGnC.+s1_l/CۦY[O}!״HXnN41oƚ:7,·`76 VWŒz 3V{jZJQև,I|?w0 4BBb 2"?EoG({x8iFΫeIRC<n"WX|} ; 7rRڮEaY~=*ϟW6?]9uƭ),]fXoϜ咅-`u7̨|_*˒z]&W(Fj M)R}ٮI$mO8[H"chΑ(t?Icr#ISGGAQZj8d3WrN\"ԙ=ljrcql=FGG 'SVPyD} -u|HCײ*Ħ7-}Da8tËn !gm'=&ޠ*E<_R5G!U82}hR-pȷmf]S?eq8sV2;K3 }nˌz1{'߻S M\!֤͂c?gLSZ RL (*7-`:FqmH3?g+XJ;^0bZtI$V̭W f 9,A(嶃`3k/Q QO0lP0f&ryg7V[M6S/`~1rt Y0V3rۜq ɓͳ>.?A) Ep-hfF1 8]Ar^PpW +1Iv 8 ;W:6짋P{:sοN"ا4jdw;`+9\19b=jYE&g @A#:^94^ 8h5.jQ<¤=!Cæ,Ax 6s; 9IWO7@ 6d+.FzjKXOq׽ ƻ JQڋH8aOڋ=8{ż1L, i c|8莭fnAg) XD8,Qrq} y SaEa-ֿ0TF׋%@#~Id8-#Pm|c|4=ړ[^]Gb,捾i[`nb)y*2ps8?]xwlNˑcXÇB5Py#1.6HV:i;] a8Ci YN4tthb7fO 89>2VM ˓DcX 8gE2Iغ{҃j6/pIfN5#8eYX r0' kS pp8$$TfE8Sеlt8!\BVb`u~6I8I:! bF \#=l פ,/΀sBƊi}^ 9#ḑ7>Jē#kI!pHѢ4~&R0[lsE̛FV*S`cGFR"~2&эeEUjUإbd:nIf3C{09 HY+ {cأ&m(Qc @Uͅ3 cvB4.$xz àUPX$}2Ԣ{UyN=j"UP^QhlD2ZE[ϷPތ%`O}xA]% z} D7ճ 3Wco9Û2VmI! ;?~=7lؓz..ǓP9lOy5Wҳvo7fp*X~Mp]zinť9PS+Wh }b`:'n'=i0ǐFG՜8Ni{y@=\1ԩB9pl1WV zwcɆj$_QދM)~t aW޵\Ħ-e$p.RöY|7TƭS mZ}&T'#3FޔN]e$T'g܊3ѫƜs_|Fz{~QdwմOo=o6k+'9|4gߊem"M:uʔɓ&M8aa@='pCSpAJ^ݒ2U)z5i4QAK9G3_JHT$DŽ2SceE¨NsfTUf oJVIIQ{!gqS"8UĞw|hNW=ںBaM=s:oBLCmB8f爕6;g4ߒ:"QQwyA72?|TԣTϛ e5k/]/@~‡~˦ơ8ktCś,΄0^χe,77pEIAi3^a= qrR`P+?bE07eid\5 ~ɠN5uG=F X֩N:4 +rT F>yaBlcfD<4)'&_gd~d84=8OESDJ؍\] _1/|h˛OLVGI@W=\_s5piE08'>|?6ǡhΞdW3}H>_?y2T~Ŭs.og^ AsUV+peC]WW&ߐr 8FeXjG4]ʫiFO˛Qog,o4怃>њYm"q13i9&ju huOY*?э]{qʿɉt=  _9lAO@F 1nqi'yldzJcj pvD_/AZ+iIgJh}xRy;sIm.>;HEFzdзja-_yz~vRf{ξq=cONf ZWcX?]6\hyTwLB+*=~(% O+rB b+EE?8&lo2[a6 &yة_%gV;!{a3gcVQFV\ E÷hk+D7f U=l_Bq&sL 9N? 8+rwBq38^'9Z@)޺] p>+:i,D&2B~G hklfrOWJ`^37wweoed0J]|lq30E0#0Ca>8jG 9NBnCyNNO lf.'u1v|ٳ_xo5+a{+L ̢1P//1PC{ >us{1+WOPN-#'fg\ 0T1lqdB.{ s.16üeqYBc^.28Di@KvpҠ4稓ކFp#l,Lm 8w;9Lh4nÙRoxU̫vۺ)49)) ,{N!,zMh? ++Z3D8;Ն}+ 8pWCgE=To'N e2/ xp9Iܝ3Ƞ{3wqҋp0KЭ]Θ<g5Gng$!9@8O4W#e`-~IG-9hqy|v

8Zph a vx2\|D8WT{XCC$};c6l?(Cp o&2ֶC>&nnrUJ;nV6QVCgGa*u:'$L)a:%PY7VBqdm `6 ?6&\ j5 e;c7fgq-Dn %~8R'8k_s^{dz'mvi'T|L4-0p_{50AG>壹Mhn|'`8Ǩ.$\eZl-CXEMٰ үnp'fn\~Ɇu9.{mmrKE?rBk~r%, !lhqt^ײAUʻn8?n%>s╡SNݘhRw{# 46G]O~_.3wׂBo!suBږܹX2T BNiZ`rrϩC4bSOV@d18-νFlK78נ;%M 4˚!!pv%oؙ^%q)jX}a:O2#GGFQmbDWEYUn7of[8ؿݞ,bD38֦@זو$*E^̎Ѿ$h6Tgwe!p珖fK8 8J8o':&e6pޮmhT7sAQ<]<^w6=4Ln8&}SJcxב-m,mUpi='g>ӸbW4|_> ϾJ<OD]-y$o|P7@f1I1ǸmݮI~ 8-4|Xq~_zN(#&}x(=\X$S@d3ELNzsUޜil2)pֆ\8ln|v`dA,`>6s΋ǯa3^M>)JAU"Õ1F};5!gb0navy S9hEIdϪڎ=$(uaP%Zقs6ve5-P'EU8Oap='|]PzʬB Z*l={a6?`+(/!_BV*w#U 6peJˮ @A]Yf^Db{8I6ƍ4?L'訐a}eZL ׉;KqӾ6}^?w+!|T۲}dSiTj2m8CJg |6a8wˮa`Y ؞<*Y7:9ǕȧjE[ *QTE]$i\[RQa}*z""d>4xEDpIRUw 5E/ޞ)DV'%-, CTk*R'<IX Avrho[0@M>536TFN6?qc؎ET jUG60J ,aXuJ8UM2y҄ #WRN/9m)S&O4i iλ'5w!9lE^򪑗2[8#oIq8 Zxűly;Xp8d`UY&Բk>9RGW-ߋ.nu40tWm_N*- dβkJa po.SHq i_5 > ^ݶM[vAG=i vAAM)>]Vc橛r]* nK 1+2$_N|W2Ů| [])J9]`~gL7bpn4oRF2 YZHJǀKuN%87>9$R_8, ]]{~䚱A]֙u(w`dOCO2¸ҏ Iю%NStYXCBJ(YTҎE);-*,UsߗŘ* ؑ)V*Yok9ycI>]X飻2ћ5uwNތMII8_ZQˎ% Pݝ啢7ӫ7Pƣ-R5eJⓗ:y6SwU)%etyS,#Xc[R/z@c}w҃i~s%Q_ɐ/e X>I?OȌ +%AP+s>WN$]㦕fx'hRR!;]!C^\$ЄfOڪT${ B_g V:wPkJz+B~K'&K&]]49(Cj@8 ~^ :ԝZ:]ܮJJogb4.0gicC|W7x}&4;Ur (ՀkymBn#-f?N,3uV [4ڠ¬=,+/pRW`8rvWG|=YvREGty¶;:Tz!p6YBg`(JKIOtSy£_HB.ȼ@Q뉥b^pU7BYR #$J߱Ø3k9N(F&,)z:H9}|l.tyI. n֓zSݰ:?`4zdkg1+3GΧ5pZkΘ"`u&,=/U:, R7=kB^9l>7,8\fU\s>md+ 8V'4(~ 8ҤТى積m:@k>l=!!+NR%2J#p4ŵ'V aPCof*6 Z-Pո?:2 :ћ8xh7)N$XӘ@mЩf'+?xD[*Z}g!+Y4"g0]l Q9yCa/N]Mfض,W2 {\$K?l4] ʹvUg xW&Ēcu2_OcB %]@dBGhgyd-G3 j;ܡ/?g pU27س5>ܓ9A` -΀3X߫c|8y.5θ,3 85$ e&F<*xhcܑ [9ਛL— xP=+"8kL7X$ֆo8Z{kIE5-cY;ucAWA`I8p+X}M .;JLckn d7O *hNl TO 3D9ô'`y hiJ8iI:yϨQ&n/ly HAdEQΨIpOi7\.9Bo cU$MB9ݏORudM( jdkl`M, UIjUO83;|$ pH8,myhJz ?jqA~5U= @bʵvx@t0tRUeQE`fB7z5^Eoʹncu2WOZCƳ47T* 閧"lyȞj5] 9yv\W|r|;4ǍqYBimwY:\Y,tTkyU+dLbɤ;=\b<9-]kG'p?ic,&_K ;T s"anI:Q%oDzsM{I}$cdS{t|}W I~}8߻dKI:pL,u #$́ӣp!%>S6T{o5u>$S6yKQ`cudΒcu#|%$GJI$I+ 8V' 8WpNp$$X$H2_I:Idcu#|%$GJI$I+ 8V' 8WpNp$$X$H2_I:Id2S\.O=5H$Xѧ$SO>mnq=DӛKp$$|fOO`"1**.=љ-U'4JI(`*5]>o -hTݾ$7)jW%OQCk]xa 7K5z s' YX$| p"a/V 0Ȋ ӛCHq%W i&MV'5p#Rdx2b].!5,×{]RIg(ySyC*)PP[I86"X;et֜ICFKp@8K ,*'˩]b'mJ8m^BiTlIX[]KAL k]QAĸvk؍݊ {f`0;;sfSr'}lKE ?pIޯ7l*gP>"/[=Cl0ﱻTZ}_=w\{BjAW蛓S|fܛ{Ȳp\ o܅ FXܠ˞.dXLmuδ~XBٮQNŻ[ o 8-3ha߱bnB4"6?a'A-Us'=3g?%[Rr.LƧ_KN:|< .Ag }F/ѧr=E}se_Lk7; [nKw+`bCn*p*-3V0LѸEj&Vl3\ |֕;/Z8nTM8RSvlto?`u39Dyhʍa1V0zz тaŤРu\n*pTtQHl`&! 8Oٸì(2 ~b{6aάg:p$_mQy5)qi%mD 1iFUd=joU#5$d15\3Jh a=? si><N/т}AL"_D 52Py#4/PtmD2gͻxˏAAz 5q$aw,)/oO/*W% *-nnPs'"$^RRGlX[H%d%ea*ܫ%R#ܒ0v!0&C bI=hKs?Kn#%H*BOiH$exѭG_6UC&H nJZ8ȇ<%h-oWZ$\1]7"mqq[ 1D+?$UkikOKq' ʶ'@,Uכ%h goQ^UJ+`.Ԕ2oar5kg/o9O)1Ӻ>+ `mH_ߺ&?;i[]:,gy6#5]w)?:У!z,sEֳwVdaV'yP9jrnnKXƕ2Ɨb Ύڳ&.^?wcvZcxcM`w[촻w6?Q'\x<֢,Tc' bՍ+`pR6J7Y\D:A'qQ/^8ypצKLدW6MT)SҞs A7(E}ojk%4o>6䡚KṂӷ4{qFǎ۴T_Zp?.*ử~ӞNlw y2}F;pS1}nq?xz]W/3ulP]6{$ ߳neq)-ŀS3P;'Mb4%Bwde_қ⫲:L3YtHpQ&_haP,N}A< 8MIz@6 OG¾Ej{XÝY9>Ӧ,ttGtH8/V5ɐ*Cjr=ks:{}'*=p!8 &ڞL).J5p.tst@%@hJGhP'Ѣ̫RMXaM5p M+JĈ8N¡!#pۥ{Wy*+}@bI1Cwpܙկt6Ex3 [uò93Zl)ʿ㠁Xb1nzon?`Nơ'\"~U8$gb'jDQO*p+DZ{Ʈ7w7_7Nz 8@|o&e.&o#NM?-!P,>Ů6wւci;{gw&;/#ɝcrMCG2pnN,2LW.;fK zC68vv-?L)S_zV Pp0e%p"EeH4gh `gd<_η&6Р1f"H6ƶVʇm5Ԛ;1zY,MfgA1 +XǙwJȈ?HM&4]LDk[5:NgZ108]V)ڥðFԀgU _ҌSNnX,'o+^wxWEc>ȗ1ԚY[ /wLrh{0QY|zЊ~n sEuUTtJnDj XMdRPG$Z@kD-l6&$JTXSPi`?aYdӮg䩁CQ 8CZ`PejFiܼYU$zKFI63.ME+W}w|Id6wnFPxf^EdWʑb?(ofޡ%R'3&w>ypZVZflqXE%B#&j1#VA_EJT*տ>z ъn1䥅m0K5ЛNtŔEwem`BUSK!FJ j"2epM0LS#T,t=s4G61hފPtsrOol SD4خrUjoȏҞ6P&!q:!XhJ%bIfGO>&FwI-[<&ؾ6,iªT&G,]57 yy ioД$'=p!^H ( `Pm4Fe Kɍ101j-%L?l&童 jxlbh8po 0(F 8l n֖T^8EQXeY: rSAYs5v}sĹ%9 IDOw"`f_D<y>;O8 `$!k~1-nO ~mQLpy! ˺ܗ \^u/ϘfhL#p)c֯V? cbTw159pjɎ'RBtY['-#-%7֒Guh9#D>Sk7U0[Zh3&o* 'Zx1#O fA>0SaNW`+ު "y>_!p>={; F`Yn^|k88X#R! Ca>~=puЋ9-NW|K5zzFxM=W$p#lXCʊH[ϋU)8ʮ 6d#3O4o~5;ʨ8 šq'{rTЗrP?TfH /),36֑ y l/`{#҅Ϥ,;{~n@Iycǰ$Ipg'BFc,7 *eXb[F{6}6HG$JJ#Z$U:.$ϞQ,sTS0ƨg&+?`z1o|*<-Hyjl/&LG]~^?Џ |HK5P o`ۊ%$n`j8Yz:7y#+&-^1?]rFDj7% JcoCGL&i 7&&]D!gI̟=$XO$f#`$HXX,^*oɻZ>2Nc=od' d!Dkp4*K\'/~D2F'cI%G`H%~p {b H,2}͂ƈQأcܐJ@w8L哮0B̓8٭oYy4'V).Cu:-:I_Aٯ7zd zw+vi 0O<ԯi8w`道'( 0/πF~kz蕂A{.<'wwzP3&?TX,o ׹'nXX$IbeBk~.|#彇Ф#^^rI,E3>-$O7ڷS,>-;9|Z5 p*/ @.3 wL0|‡zday+,FZz.Cur`8O*JB\H,:aM3eNC) "')԰$_ZM#Lk kE8]FB.,9ae$!hL?LL9%,0qeSBlꙏ:̏g4ed=3e9֑|hS%:H?F(e}4l<.v=Ck>{+b&?WB0ö8 Z:?@ytz$ 'ӥpr87yXf5p ɀӒD  GBm8TYz0>/XdJ3}gLFpF5H1#T9˻`m ӌQm,zI8.݀#-Ͼ)4'%6OOI 89(0 XC' Sv?mỦƲOGȾmnyd,R)SMFH|TLޠ/?%=p2]:V6道%?ȝN! ÞlMBfػ,%%0Yrf昗]q[lyi*]Bay1+#cBD pVrȡB187)dOc]YGp"U 2X̗$78S(q|$9 .e9t}nؚfunȍ2^"Jל-z'Ɏ,JO|,4:̧ 3&Nv<$،y7Jvļ [٨ޤtN?kCD2}i5pR9\JH|AEAL ,5ָOT5 0|6gÿ́t򣅆V^MYg*%*AZ%S/p|3rN g]X9 bXS˺VG͡i(p\g`< w6~%/7~e+ [Q7Y԰'̂bPAmVaEXn< c+7^!}zdwe5f5p/9J]G޸^#n=pIqgUa{+JGHN:k^BlTĶ>RՒz+EEo(fE6eyJtn|ʭ8٬ 8t^r_̹N"˲{=F~K3n*=e73kb<'輫N+`>Ϭ{u>C2V z7mN_=L!0+ t9M6TCᜇ kMc_q89C6ACMIMҫC% OH2f‡g J/8S,d pJ.0W]('HGDKzݚЄCM7g*p*s#iKXLp24 g2hQQFGmAqƽUh4XAZv1~Ls ″mѠ h_M2qH=prȻ 7-NAQ_wavy(Eob)!@ {@o>9g _;AW M ȏ})pb ˡޣO~[f3*m.ït&83{zVRcb^io-ރES%Hr(MYצayJϳA^pfnFkߒ' GR^HLHdw &П]qQ8Jc#w7-- Fׯ8o7c^!g4Z%*؊DlmvKI/;hP+CuކS(4DH4::5SLTsО0t\ , Z%IVT]2 fg!b9dkz[6MC\ 83EPkbTc(:{P_}Vs(ArtUU\ e/U侁`)HztĸV3Pg3`DCCkJ5bw'i1JH[h|*f6hNMB΄UpcW8T do-*( AKaZaYNK=FU㰐`•5Dp)7p6F60h!UErJ%(P%ta΄w =0JV LV_}ұJ-w(ʚt 0OTۘ *ʁc5OJs׊ 3}#k@-&̙E|ʊ+ <=ȁ<idxL'3@˙+ |>)EO p^F w! |Cmpz|:z{.plm_ܡн?Gk[W8 /ˀQ ItIfOB"xWЊř)5?_\#&cz?SCp89KZG?^' 0O.C  $%N |\*psπ-*y X5B  8CH?g +e9?S(<0jS`YU<3U04UZ \2BBl"6HBa >[#pO{D^fqӤ xIO^=yk^Pr q!,\ECJsǐ'n9ʻ ,p p1L"70eiN^*p;p}f92,lO^l"V)(gB]6fFRNհHyGbh]Oy vl9pkv(mվ{]b:zδDj%ݧ;p~>{Y.*39hܬ̠b穀b":*ff|͹IpV"]tKԺ,y>83?`W+%p,J`%wB!SI!EFU[6NEaأ; b^h/ Vj9.;ug6/j!vHlyg kIRŀS81rcMT:rtN=pĹ' 8ovq+U{O^OK=.\GNY$p0Ŀz)-*!UeٰZBB5[2b@>+CaY! Fkd"q$f ,!q%=gia/=$;1$6jH(| e-MJJI]D➏VkT*KX!,/ٯh<gZ4;"pTF: =&ʼEkX{ HdRz8ow h%s`}mì*5O+JGr:Idq/ȻWbeVB6"W>8B?DPZ/XZ=p==&7ft,t(=lZe'ݗ,pbȫ3i4g]/ 1Z<8 0/hh{Rŗ~iΊ,θ%)â)׼qv¸ G+m)]aZ|lVaV:@Rw!-ʹk-ZuʹRY*xR[{+hTY%K=jWӠj$бeAe4([^1jeOBƙ@qe5?b>\9wEn@ N^.;$vS#ۺi-՘Vר&^e _Y2=biUtpGgtN@K9t6ąLRJFh5qϯ–J=,Y\I]bmC\CvN⌇X%<ˏًzEY%2B9IosoN=V{/^4K4e[Qj^I?)GjPU=}|fn8Tߴ+YgkcK+u~8,ܩdžڒz 4n8FOh8Kf,l9`nyv(\ч=濺6%uq:p-jf,3-ÚN&F6ǿ]XF3_JXso*y!wJ{f.l2k8㲾 Kl1**0H9Nzy. 44#'jҏ'9y0gp$tnoN8kک5 '֋jtyGX@Xyl. Ƅ;hG˜_B}_aJ%/#HR"GR(URK CSK<΅\::ۑ)&a+ 歖8e"Oc Q(2٦~p]q91Á7j{Ot:F Fj܇y0V<6sM|~kL Ӭd JN뙣!¤`+Ğg$Js3hv%,t)'#pȉӼ'EB{[]>\:ӿ9 e41_w Zo=(8$]4ZcvXVV%{{aκ0ǩI}#2VVW%HKV,sS'ȵ81E#ޘqĪ;#I쾁㹧Ӛ q%&~8CÓ:J5l-ah|V7/ڨڳcI߿.H%ŧV''mz`(>]+V*e{];w1h~b 6zdwq^\ ZL":7KjG%vmΧ0/"ǀS2^6)'‹ W6J,xGWQk[s6\TUid+s|?i+)wmej~pڢ̹wso9s>oR\>m_"ً| q$Ɯg9rl/]d7rCcyŷRSV3*>لiՃakc\$ڒKHG+oMy3IXDS{B2)-P_^0f,|ƽX{>*rtchuOZ7#Z\} {1\չ$z2QrV2˓\`"Yo#8n:ydP7@ӏ$~;i+f\tA.2c (qB_JVlq%62(6PK˜11'L:ޗ2¹I4M͗kܓ8l8*u6gOZ((E,tۿ3ߑ0.߿f d_8^asTd3գRb0C13!8;Œ~q>d8}E!fV仠A࠙7 =p.5FSykJA2<T.UQ)V-W(ZuSyQI3߻PM:m71W(p582+8``d/;FibB pX|D40gCU؎.$Qf0R΀YΌ{ߢsoOHFFrg#h%|:MuX Mk{S%![ү֥:a!? 聓tN7C?51,c': /v-0~e p{T$9%tWVp+a 8G Usu޽vjI0!8̯b Halm-:BWn_j%Xfuw`ڙ8>o_~ͻ|8ehN9K61px)U{qs;VqA\6pXEY3B>7F7`'58 6|QX6Soc-F^ V|h(WRTg6Apbcmޑ [ufh 8O dA>,L8 닒u䈴B7,lž-q-5Ïgh."oL,U)`/;m"'41mJIG%R}Kۧ^K46!q7D )d+'3M #&q/D* 5u|+w{h!ő0Q=Zqmț„lidEqszJq.xd,W6Hxo/AR~0KI4#Zkⶔr=bIZsJgQ4S(18XE1vU7:OgKT0i\QQʮ3f~L9~,RiPTD|`JިW%|M=TiBpjw|ACQxkk`v;٫eC|T1 d|*''7QҩBpJ?/jiF9zMzd~-P XKJhiS(!s+U ~qk!?фZc3~1ep>O4):444Y/Ճi̝-2za| лdoD&KHUXcTNN[=|e81d_-cv> [u2Hy-!cDDc 8¨{4 vÄ ߗ_d}Kx0#_¡lYyY{VYZ=8x"+Ht9՜({˧A=p}[&6p+SlVOQY!Mg^ XTyfb4GyY gt ŪϙY[/֋L -rQ SP^hxvuNBB;3Bn,de=Ć[B&R 4ŭ 'ZO/S `^*3oιi_!O G+dO_V٨RA̢e9J(;&C|v3Ģt `I\YDpf2YS鲌)S0'C%=0G#BK̕$֬J!p^VlA ~:cWzcPb1̺<܏/aCR/eGYrAfM3!nzqF.SVBXV0K8zEVb'35;Ca(WG fq3,vsȄoTT#{O&-ch_ hBn uv5m858]s8ph; ;S?ոi,쉣xAL0-6_+iDYw+HSm?(:zOPk*2 oi0ZfT4}3x4Hۻ {}*ja.nJoI8 Jr.ɨ_V;6fX/՘vV*&&pB;Ax<ǩ"&Bg1Hզ?$Y~_# $)#pz>t798D)1qWew2MYq #/x-gH4S0Ƹ&䐨Ð&XYWp΁s7hİ^gl'5 e#jro&2vbϰ"#FhlR恳NT16ٿxRpf!3Z<5)9)Raul,&*JM򅉄M ,։v{>iH4pPGĄ[09Aԥx/ Pr|FEƬ8$֊tz:c\{-lFb3͢Pn=).6F(&?K6b`Us^A8/Q pxڧTz.̒!ZFrvb րhuAయ6+X"(Og}#tq6apIphk Ǣ]iNQN\u楈)-"pBee/P_rpB2b&W gnN6)g(S5\?ؠၳ }L:{s3B00?`3M 8fSyH1Ge&7LL!I:'އLzceg9y-&F`yuF!n*IXOºBX(`ڔЋJckۑpquˋ@1Zh &S?4Κ wPW"I|l8lŞ놹8D68r:=(K3;1쥚bͼvevvP N-N}$ ɕ)Z 䛦rzMJuG]!Լt1^ +A1ĀC"(l~I63hTd牬(V/gypd[es,{UU%)AU%K}K=)Rijd[=E˯ g,OL0ɠj adx_Ƣtsچ5YͲJ|Zʖ` _hau+BVd8js\VHVZa6'Z\{$"N_-!GpE^zak͋jhLC$R𳊒) Ax^JFW勤}7Er#xv!Vx"s>>i"ó;5+gS׷7f8{%B[ggqWgiH\Cŋ[.9/QϾr~drptd8ry͟b}.Fc M iڝˀCȮDSʸ=N\$=pR:tώKgb&긘U8m+# q89H\.b Eaۆ=,K/WI(j4]>L#5e8ZiiW4<wxhƠ4++Ab'Zt3r74Tck&Kahhzul44Lc#Ո#8ep.zsܙi&fxvn_}G .R=pu*]^RJM*GTw|Umeku`cjȷ:8ZaJ(o5_{JNkO΍]56Ĩ OIVi'Ѫ,N3M3訦}8䴭qjeZzxɏ_?t7۵ucKwybK+.7\6NMyd)%MO/C=Gi/TP\応AeLuCW2{`>ͷ<3|3+XD[@X|'nv_R _8שC+dUHb^$_odozOӚ qt 8Y%]9B (Sh0;G/?9~P#1wc9}F3<燡"XL?[$ZF?YIG,>̀#;48]B߹UOGtD7RuqebJpdT;}ޝ۰fM72pOϮ4oTV eJvccn^t" #Ht?yovJvbsV6JQ4rB~|Xek9Dy *VL\F1wofuOqtWm' T_\ O"9IfCIA$Zm$* uDE 8ʃ5?omSeL0E1^7(3S2 Ivv_O95^:@R î%(}6(8bEk֬5kk` 8GENG/hjxZ0<H55e,TNf4sW0|޽>h#䡙~9ZTW,P*:\JxQE*MbP:pqM_pjGu{ɫAiܗCUT{ -ZyR&OBE=JWZ^m:t&M55SHze#"MF~*y?_&ȠGQʟ{J5z2 JJ'$kΌ3oSO$)Ѧ5*XB+=eHEG3Dld^j>x* jO{[rLvQbwDy>0T^ʏv߬.Yy,/H5w#9^\.^*U#ReeuO2OoRFt^p<~(RwO/mAQR5 _jˠ%" _RVNel>~n8/GiڞC"=u;? m%K낥+nܺsc_ wߣ v|9#菠8ӹ9ɦ W|ǽ 3-RhE L I3 $~B!-hR;p(PF"tJas3 gOnI |Jҽ{r?_P@]gV^'#!/#g/NA^:m=Rmz'v6@ۍl"x$oU[-VI%5T24m! U;?6̡zzNN:<d5X6f%!pr o$J6M<`-n -pX9(qj#ꭻT% 8wBvM~2UZG'JN(ٰZ'vsFpMc2K) x`Wwm.Y{) [XT䋴3qtd%5}<+c}Y^`EIȊsk C2!prr׾8ɹ/JKN'X;RI`G ;I7Rmi p؆g\dgV!(vutRTli\,[ ")?գw58{Ų)mXb/<p]|` 0: yIsKf K+1H 8n p(p&@cx,]"rf C ~o/E>#&W³\*!AWt9Bi>\|[s4>ц&ܫek@5‚КWsꔾLNuOWyxahChp@}XH3 qt6Fj, V2UДrɪNH^ mu(y+38f|I4UFo8Bppp@:Do5 S{lidy~y:5Z: &3 jovtNyY\e~ʫ $EԺnZ؜ЄNHyY;YTݝiP1yPWC"Xm.)#p~; A-ZGctavՔ/l* Ԃrvཛྷ+J\i=V]EZCoF^vTxiKT3E"ÆtML΢={?pP684-PSzJ=Bl,K<(Lz/h[ EkAUQ$Zp!Cd`tbemG(alj'vV̛gnhdMѲ/驺XTȫh'0<׵F8AUvp]UE*Ro))W5'_!]4á d ѪUO=ֻGơ阃pަdq2HYtoxgB_94R ['f~t &/]Hsٔjo0R2djyn̘BU#1i V=wHEf8=lb‘8ŔYWwoXd pk'D=:p4])3wrH=T(R|Al j+A!1/z^JK.}=Tu-(1\YVk"פyr8$փ8gvAQONԋ߼,*Ż;ק_ԕ*s:;Ź|O[3mNTg?%^w/5zyIZ˚D.Cb'nrjQ[ϫ 0??g8LmU舴Nj9͚J ༅=7wzgUZG'J5LK(8zO:[L^;dקXO$Wz։ UaYϭ^Gh6݉oC~1n34$'8Sы8Rj'&CeS7RuadR[=^vLLhk\l.1=aG"24iF$e ?>`:.g|ےicK61:ᏭuDMO.pOގ0ys' H SOfJzM`9}n؆f| OL/O<@ :y$.OH T <'+nSÚEz.Y%FtOUp'eԺdk/hBl[s(5DN@Ɯ4Sl-.'\ț`JږoW̝ ^nR{Zhn pj:}.I!:6Rj< _jGDbI=%8#v 58Ұ$'!pL)m(C@INaZZB48h͠^ϰr}sF 807A๏ 3[@Ç"(Dfn/UȌwm 9:x5iDg߿tf|9)iT+=+!Gu5ۮRE*LCc`BQR&Gmr|d瑛(O,"O U>*,W=jTt8+8]1r@/C~&v0\k/t=s3Oe͵TɩC ŤGs ΐPgh$kt6Y:Y썞]H?8Ν;Yºr'&ڹҫОYTe 27G@^\n/H͵+a&_*Es8mɀCJ@ +22[0͔2c?8Z:?[xt X=)W^"&j@ü>pNXzVA_E&c:\ff?Zn Ydg]׷48e"Nj@򒺐zw̷}#NzCpפP|o^ 68U?Fj8a2~&sFR-q{?/ 3GeEpfTP+hΚjs6 +ά=Q2 z |%8&M~~~~,J OsB7psuם(OmmSʾgwb͊$ + 35A֞bĕguh31K6sZbӛDD #.~Һpn,MHH+Bn[CfgQ;8J[ǖuH_yG,Cʛ3Ѩ',-^#IgUWOD=DPYK=ᔾ5&y Ξ~et+"65zU0e 8~wr{uF'B9Q /ӑ$*SƨCP4Fݏ/PBo;M'EC5퉣TF- mԣagMm%}XLYI!J!LvĨ٨IJMI^U`z7G\ :-fNg-8:Z aF{!EVʰV gj!po:hE)B ޒpD{?AЎnlSo(Ԛ0e~dwn܀k"pW*.]ܰG)iTAc]|lKyی/A3}wXvo\WZb_wpCt\iϣ6}?4T~͚3NwoiBF[C>UEq!qNo۟h 2 P㪝+qړ™6Y&rRmϒeuV{K (պ2 ZmL՜\]jߣ^ yZ lJOǍFݺk/ebM1vmⶾc^[sŊP4kZ);&Hڵ+LdQ˗IPm ĩ; dY ^a6Ҿ8ClNlqtm臋yq1-C|U3[jYjk leo[nhY]&|^.8dp*C(U3Qm:p1nһ_#zv&w/q#&U8lx.e S蝓۳3F @M-[}MwE_΋P8]Dށ >g~rѮqQ.L0R? M19It\QD:BKJCNa]4CTn7o^Q_t I?K'Y}!N9w,l"_Z<p41=~p ǗCN )%tp͆?ǀ2&6Q [țj $N)QNVFzhɖY鋧1$d"pYOD]y1pHX!qj:jA*blK p>\qcI?LNЀ?|P}g^5]eOܣՄzP%O(\M28-YӢo%8z!qutU*'[1VX֫< [Z!:)*ҵ[^[T;W^mo]2;z[e&O;j-BN*=`޺PD7DGeiXXLYY}BfYu0ũ6o3`AЀΥѭ7 ~+ZZgiߐ.e"pn>G֥w֧ut` 4(RU`dsDd~U@8kC 9E$=m N-SwǢv K\i?z ն R'{%Dx%pІclLR4i}m&p? q,1l(GFGf,>ؠdfds7ơ[0g͙W7g5ĀmJBt6 h9Fx-SRs+/Onpk~znuqfP;gCT/ck4VVj4=O'=V43bPr5t{XFcx Vq,[w&jtfzztOƏ2@8*W(ݴ`K"WWW NF9繼8+MfTp0_`-pp,+&Nw+P XRK% AAn~w|3AFŻ_$3DE37QO_8N? qDUXcY|;pw$AM@O'gVJ^}l]T0Oޛ q 'K22WQyh_RjD4#-; !э~8u8p=PӚkz#Ldf6[3]XeH8-W@vMiɕ e !}") d"p:/ɱb~ ? q}nK3Lf19>Viqt(TRwNfM~X#HchHt\a^XnwJ] U7Q$tֺ"Xq*șh7,Wr Qׁd>âb&Any Xt#:Hd"plX|mw@l/As盢yk_Lc}O53$Ƚs?bG4Cu9+;sWTZPnB !+J5{ 3s hdX-4Rv>`BnWUOlsrdÍȨb~~ 8ћKNkĶywh4Oĩr״Hȅ|czi^Η<9FҝLNBe uCRZJNR8u|DenTu0єc"r*T$)!II Pu|dfD1q!M3mJy$4G#f &>bIO#א$ʐ80._f Ԓ$T&'VKZK?\hݤ$IɑYx띝KHup g^:UHy$Ie"p='C+:!WN\4R-(ID!1;?r!A Si"g1My$Ie"pl#AlݯR̀8%:BB8JQd"p޶CD~Auc| ER#Iœq;#Ys$<28A3;CR^!p0#Y^8L$I)y⚕̮,J_8L1 q6+pz7$T>+4MY~Flݯ Ln?fw.3H$LQ u,p6K41,V Q$龃G/u.pa;}B8;R$K&C ˊ! rZG89$I/Sk([mwU2p7H83#F$ie"p.nyYԀ8i!s'T,Q$R}k`@,ڥ?s%J$28p$yYl/ϐ8_m|1Y$I2LΕޟth_8,P'4S^-NYe"p /)G\ ##-m(Z3 7Owwr(^'Iyяɾ|WlF_q28}橨J1٪:..nXnBNnҥUed )*me󳽄_|FO}覢.c㒊z h[']iCd?fQ1p%z5h4]lk_w 8x3l]賊]2f:ڜFyQmqp<:'84L!pc t5p8=.*̐8i6?0/Y|`k`ssj!(Yfя.uLtKʂi7f~ت68 j{0[Hdmd VKaҌ4$I 8Lt.>%Uvs%x:!CYJsUZ϶{)V C6L_4ݘks\:REny'B"AM'ߥR=2d7H%Y!dJ/tԞ^ry ?zIcK>J۷Yoo%&D#> ׇgH?Ѣ^x`o?]dQUM`J%b;*/Pm T*,a<~6>S >Xkldꁃq?5F*BߺODsb,РX& ]➳_{nb*mԘ\QN['GKqmצE,Go}T*sAwP܊XB>a -^QYAFU-lm5PoM[ JY0y_F]eNjKȤSTFmRfTy\Uqreavj\R_tsl[ʹ;[='[ \CZێZW1~G(W p4{^Bzܖ߾h۷tafC*2XaAsbE *Z:-VZ*Я1o˫fw8._$69-͚o7>1Pf u:eaTEym5RlTfʞ|T mC=|7&Zhrp/GddAqOVֈ L T!ʪۤxN.Pi* ibMJ  py0GL94Y7˽cBV(m]eXJԺWNVuJ2}CO>KuBzhfC3BK:kʛh)j*NwCo W8ѐ6_ H` {qT8,UNd~w*g %S]UtVxfdkb4mH]w8@s"y Yrq*]߇,K:*u&wY1M"j(ReΎor~l 9OҩvvP3SpTeGiG,qvٖ&\Rw&O3[oAFZoٮt^>LqY?8!p!pObGApY H\T_ƌd:<+rt"o=dOM6QqڕS,U"hhG8 89 y/Xe nu , l~嘪WJHܑdFiv5}n&C}s8%Ϝ2F1ݑYWNfLQg _Z[݇K"@2%bps# -Ϻvc28:̌=8ؙI't3H}͂4>. q6 qᎢ)OGGhaHĕ8[Um`5t-_:b W%NPGIcz2p^Do1#jSPUt={i~{,=hF}+4a+2N X]W=}f&)U:koR]At5&c"%TZ攉ql qC]ec!JG$Zj;yfktjpZiep2>̊N6WEh[|8ӀBWl3w"qB6+Gs(bլ18+ڃS^WCܢƬ'sg#lp,w:uwnfiCK6 cTF [~) \Z^ pr~Hti/o89zPf;܎%GLSjPxo7.!VDpnw1Yp&3~.rց vhW1.pF Jx kauvLi|;;-Ȅ*Sܕb$*jpȇ 8@``pX8NEXkL.nFlއ 3xNu.\ Y8m8=G+xM@[sd.F?Gs j+?ݝXJ2JZ8EU q05Xm-p 8w,Ci8zىCkb('-g,!B̋聃Hq} ʀ ւ r ֒~p qSt4p t n\և5]7A:HP7 ް?@8TW3)W 3a_喊mqpО#>pNKh܅D 8Yn4cYok#4ƂDs*2( Kg*&KsFgA,!nU9~v]9zS`k,{.dJ:rW5*br,w″VOō#{ 3Xp$8Cڵ: 89q>Lu1a0KK"C[u.xͧO"6D5AM_uTwKohAb{{P+ cvE6 ǵبH^֐(oBrzܧ9s^s" d(/r7L99<ROƇhm^ߒ~Q:Vn 7#zQcN*2 _)&VkbN;D!X4֐I(ufw5w4z*W e{I\TzKy+|rriui:n 'RԺoe5Sًh=CTXGw\$-[;$v">UBNcՃwb88zM#P\ /cFIR܎S9[QwK$613'Cgh̓&W$iMl[L wMLos>]i# ]#;ֻ=,,jV p@àPbeky6;@e.ҟ{y!f~bdׄ&bYIPv YLCX# ,pSŪEApR "pZ-;=qiU/8^l3b o299(w(yF+o!s#\e-0&X-nq} ې5#,oQ]_rC )&mA \!\"bL3gxYӡkVr;mlD` o(d1+C8mJ\py#NϞٖ֩)l%q2Dж $: 8zѪfNYMD\_MgtE:Ίy5 ;tGypIK }|f= ڈ,Zm$O?S-7DSwqiOIȅ/{W+:.{<='vgˇ\MFܸe2~(*|=>{'Qk*&Ƿr:kլQaupĥYh9M2p[46_~RKA8?bj9's sh*ϛWSz\1.q}StN_}_R&S 2+178kt17~TQi9ns*)ygP~멗cӌR [=!{T=(Nw[''+8PBG<:y!L98Zĕ[M>)byM8yOH}w8`]#GMa8l8O ORg"pHԆ>HIDckC1 pfV/8᫞Y24a^yJ,Z%7Sǃ1Ic*pDu%~Ix-M/\fN  838IU T\n\ pf[|dm|Ѹ Ͳ7Rvq9;x/~lb v=,%|=vop>p4WutuShWhfyᛰU+gyLIXuPU ap']⎳R}U 9$Qn'hӱW:{pg4;Iݧ3\llJU TBCJm)p.u:54C# z俙Uǧ6H{zpΪTtXVT_v\ݧ…#*>{x9{yTaZ==ZpPsaRuw:ݏ\k&}c*k0|^s ~CWcF6]E":|ϠH"2835.JyN 8H4K{&U=mcN*@1r(΢Udy!6ȇsښMX"b.>e8!ʌИ&4֓Fi uZ+f+xKg;֙?gt)cMw]Q<9Aφ+g)p%,^0Nż`{MU&Pol&`Gu9Lİommo+jT-/R +:~URVTyUsw*YVmdc2WY:p+\Tznΐ5  %};UYF_)3;>׏DӛSZCEʴXZ6%YRy$XUף%I~4Z:*_#l{28B7[7+oV6ǔN@iߪg;ʪrnz]Y6*YQV>7D M&g%{qā #ޛ<r0lR9А{VK7sƳX+2Hú}yS,P-ut;5~>aE5~|3=t@=Ҙeb^"e5yyhZ#p>8X@v:B)xaeZS xsg2\[O,c(d~;AQfUɖ~O+4WO7Ltop3Au ff110Ncy E>a } Cmjq(Zyю @n9efpMt4##C'5{TynȾ#[!YpǪE3p"p΋V[J1UG ǦoMT$s=%ǎ,[EZ.5.i,578 2N1[L ^Wn p2]'5Ò[ɝ:"/c_8+eOd=Z$DDT9dgYINo*rY5 y= )aȇ?t֋eB̨j 䁳XPy io3`eBgGi !,nCOM'omحWry'7sv\G,Kn&&.i[b88JWִ&V`sp|_q~c4c 8 E)RA Z,|f Xj3.*#|ryd=ϴ끃㬚R밃Y/-pfSd"pEv$ݩ)B۶ײ4hjqYB\NSX~ fZPPpd,B3$xøoIy녜M2W-.;|!p` 3|f>!pV臟uCoXN2, x1TX"&GvyFM LD& 8exspy &p #qeX-ν. xKB%$QK" 3fNoxn }l;-W6>{1d\3qCLXaL%qY*O* pַP +4 7p|&0o s9q>he,MFMt 1\nxz?QPa+I :L,^]b'jbzjY$p̣ő&w"2p lM]nN$6ԉp^ȋ  V+=\QZذ09\gw^^mn񁳖U퐩_LNX ,wֈf^b*%sQp"2V9u8.TNl܊ND[<%&8h&:8Q9W[01|ʏmcps ZH~Sà656 k9zK s7.ǭS8l {v-g~ =Żhm>d$z3G'RP:DLӮI0Wϓ` c.eoz:pT,tQTE}߸@0+t E1&js`D܁vuun[T7X ְ#p-^BrY 7-&Dh|bHlgHCXSԦ18Q^Y&dz d&%΀)]vP:N⨧kue3Vϕ>F:;Ink Ofs9`ӔSP+ E&0>˞G24t!yceM5FeI&6(Bۖ,hY(gH}: ĩ' <+Kugw2f[?p(tDATK#q3y3Wwɪ*fΆt-[7G<4OH' CWboaowʟ[.,f6?TьlY1Eg}zX#_;N7u$pNl_hSˑmBZgT]6]ZMIcS[3`ٱ5)9՗Byp- >m`D)p}K8?k_?N֟bqv67ռcéwpl"r#rsN5Wa [%*28ѿ爭NPnʥL.W_Y޳T'̲Q6]{w $j28u]*|̆ Ab,V4936(~f('xJI1e pٳwgII&b^O VkҊ]N_vgw.gҙCtleN1p&B.m_oW{[bIJG28ϋrjodrSV|lI4r$28HYmm 9 Vefz+'K˔T\j\ T UN%U%K[V) ]vZYiږ.=}Rӗ6eVFS) kzk\\NzVWuOoz 83tIDIt v i6ϰx BYauDKft!dТ0,UENL14AW˒n#W%wIhUǒ&Ʀ\U7RX⽘(!["s"FӝN׀G,QJf[u1zVpi Lpһ$Ҽ<ÑQWKI21EP 4;Dv!`4 އ%%7tSo,93iu^~fIIwJp^ x즉.E~ʘՄg?n hĨsdRG 8NHd1 #X.ccWCձ䝕\ z҃$;8_dJf] vfk[mۯ0L6ή2?*t[%90:h;bUX2:wF䣍[t 8N)>n@u79|A۳_>:CKE݈& w$')E fO$qIIwJp*8&$Iɕt'Ԉ$I$;8R$$;8\jDI$^pҝR6bkJd.IIwJpb2TM(IKNS s ƦJ$I%')S%J$񒀓P$4$I)tǵdH$$;%8̵Xԓtg5:Q$t3N$I%')ɝ/ub$IVpҝ -$I/ 8N6PN$IJNS$$I)tdxT$IZIIwJ.pHINSrsV$I%')%IxIIwJ.p*e%$;%8j&>;ÀXZ(?`҆hѣ'u$뵿T?Iu?ćmCSzB 8NftiM,0դ %-swfؙVG&[ 4bT-7O#9 Φ?(pl5?w2!H%8SxWFѥʖɿ|*q]2:OL28ߤ@ 8(>Ž@5ifd͓ϥ+ywgl5!u=sks2PJLԷH`/Yci>5y@pq.BoJr0E_Ipf 8°EN 4.aPJ<:VNh5{N'I ZpL3*̀sF'Ύ)PAW*u~\x؆!{hԸHsq@u'.bT4'uB?7dWnSlfKuwT}ވ;"vRXk\1۹ʙiݧQTȉCrۄ3"=㠆JW}W`QW/zM~ƒ96ݞcglE||fe(Y{ĺpݾU`Ju.FlTX@guCJ6AÅ^}1Ϫ6S:"'}xe`F/^/q/8>awz]zO(=gLh5SUz@Cr+W6߻Uwvc1>W59 V+ya㟁 9Viբ"9ٍGu9J{ԵI1䟺ۿ++LE5=UL^ڞ~,bѓ"Pef!/XvUn'gڐGHV(m]p Y^e=,/_G.Ug/)H{h&Yt^; ;͎Ts<<3"ͤQEqSssՎ]PBs!y\U? Yڶo6.B>}l4m}'DJ(@y_%~7&4)J6|xû7 -ov eyRo $N El|#dpuV*{DET(=Ku:Yf64j,4]At`鈝c8GܤY@QyPoi<٫yߵQlq?R8 8kPM d;\M(2':[T5mNQ%'ǰDS Z-( {:druyڔ݀(1 Hp}"JnjtvNn ϗ2ˎqL8R(ˎ9~~|LUklAՓ[OzY80Po`ۑG p rK||K3.k,7J|:IXM^e'G?OEZt>n&(;ӆ% I~?aT $ܡ;YYeǒ[UUÍԥJ"Adh28_I6x$Tbk:}иT+ 8)P:Z؞D>~Qu[ %vyqp[8vݫGT<}|4#p8>;ЌK.CO6 8,Y7 XNn`Yh`v , I<'t.+;̷)̦+Q S5"^h%K H8:D<B[w>V p2Ý8P} 8@+>ixtpB8$1&8ՁBi,!H d4e $+!2l}ђm98d\I?l?OIIpIx%WYU 7N5eF=gf=P飨ͮJ?l 6FhˑpܻG!phK?L*Kd za籍bG'Xx,5OSfcX zs Ja"eip8[Kp#mđ(=tIxQt$`=ej*V!* !pVr9rtaўx /s9[2T1Ȉ n>@9֏. S,D烽v-?aM8+La!pb#Ull)F/x,$G˂P9Q (N1As\Er%g<8qv!aU t.̲Y SV ehKٛ{eӫ;ۉ8&p@Dyy5<ս< f R2i7;B#\>  @IN:u Vv:Y5 f$ tTg@| F$~LR0}T$tteT.'Ilz$ jl'wdےUK7$\6*VUQWFF1Z0x'~%W]c4~@bC :EmQٮx4 虡ؼ[fOy$^9T7 0L'9hUaJC^T&e1IxG-vr)4B5VPCHiW7$i+X\h%$q꿲L-3R"s$)^MKvGx+o.B!u,[B!4Td!I$R6~Gh-$r'F21_˿<_m/}G`k7`#V hMTDSꑛ`}sp1IIpkQRm%9_^ q?V7'{FVwqAjWYΚ^ܹ8-rvPTCDɏtyd_/f)N>YmS;w~` YWgW nH!42Л$)LtU(r3K,TRaIԝ籞%xvEq2!L)yb*gujYKdƹz>1{+A0Zx2]W\u| ;rnݺу du=y0ZYx=U+B_E}5h0L M,X7<77 h0їk];gћHuϛP F&_9nqp軔GI¹cvxRC7LU1/vjnZ?>d0:H|!/IN×ݏ'O34HŏN2:$oI9ECwf| =?xj.݄dO_4rQSwQҍuݎ Ac:pZ]5Sjٸ8TFIQ0%eimߑ$HJR8co,'y ]-VFIQk"%EGG0Jɾ2, }|zM3`XT}KeCeH/UM<2rdDӬh)šRY>Mgc'HOǁlڕ o"<<}^re`1}= 6i77`w sxg p )eiv dˎWx;IM4풀è6)V^ptӮ1?pN+ܤoM9T_(y{.^݊rwU|KN:U[yɡLJpxi$'"Qgf&J_ȤhF9xO8+PT>99]T"rxi7+w)<yl][kf}ྲS*/0[wIm5J剤Ftӯ2f]TN5ےA{ל ӹWts喛sLqc aqSkYT0S?+1τn__CFμ"uRnՅnVTK,㞇fБ&3lS*rBN cblJ?6 JN:EsyLMZCy{r,~٣\.o\v(S`OMr@E31W$iu~OZDEmE̮S=?xtL;ҩ V"BZr/Kr)'*p\= AQDMmu3H{`aJ375&{}}ߝf:ǣ:߭j:Gl:ʢr~Z([vW xvYn8}]\p0yV#pԾI&UlBɷ܀Y$&>mjNQ"ݪg)TaH$澆K,K#F:%:b^02{!t }) iQ4y ArA3&諜!pf8$3AtPsÿ]cz2܆hύ*ф^q#!vdk |emyQye/tgMGmsf2\)b4"!5d) AbHpҡ,XsqƂ7=p!ݗ88j/p3[}|qJ t _&AEq1~CtHİp#U^f%Mpҡ[lZyCqd|߶ skcwV) AsK g-x?>E3^VMcA[heWQ1{B$/P53+->nn.|eBd\ aޥ:N\LrhSzRZt?[Rx/)~Lz3CȒ)Ê ο](50Ͳ+Qm$'8铼ti ܒ-p"`nn&܁N;n9.1y-V{?dUSuE@Cp~Z_ A2?r^9Ge6ϒs~9I(]3Z r'ClDCQ\bIs^V*sMg"8ٌhs#iXr+L*Dx,879RIPB*af+spH^ly=ȇw-Ueo:e N^祲ߣ//3ר&ZI| UjJ \hMÕD'Xm]>!sǑCM~S@ M+76}ٖ尋.Z- 4}GrJpKDq8ڟg/ Ac0IXShʊ!ZDEmhϡ&rZgp}qIp4jU]xSxIIp~*&F HƣXUy=>n)97k=ȾPX;OS]D3є|Oمۧ\ .I~#$?32}kcR8 b)GKcO{H{؎9òn,Cl#bk.%ʹԺ_T;i h^W;rAhP ZYҊT`вO䠫xFUDpmG U(;ڵ9y,AXvUi^pً_^ WYGpin[ߚ}-'N\K/K(`aK#Zހ7@!nXxꊑIwD7ν;<(S㢍*&IX;n[Ox=Kqګ5Y}Æ6'_GKN)be60K Iv,'Υ1>,8dp@"gB\r}%O#IIr8،;>iK- 8YNOZ))INUI,IKNU9†K Ir 8`s$IVpNSWC$I$d9YUGdI$^pϋ$I,'kI0Ir8d! 8YN'g GH$$d9Y;JI$ 8Y@/SuW,]`-jX JKN;V8=C)I/ 8VW})aI% 8R/6.l 6F9|JKNŕdhC­M)I$'IW{*k1pc~%I$d*]+uPմ8kIyYPU8-sIxI,R/j n*Z }0ǶYm6ZLtc5Oф[m74c̡䵑'•ޫ̈́RȚMQAnnT9-PxUҨCS^Z}(ޗzd}MfߢG%'3(yuDjm;8vs,N]$#GMj0>6![ 8+ِM9CgB(g.6L]0i8<* 8ίde! j;+*ΥJĚ\(p <֏잹ɮpjka`6IERŠfB]GZ%u do>1ũ-1֚ll9Z F[146>]'Gǩ$Wn6f4#j)pf?dP0]R➳߰>N†}=Xk8zI f;1f<z9wY(p;{|+ M}_f^*u. M#߃uJ%WqC1CG WriN瑏4G&3ݠTN:b6/Ǯ0[gR}zߛң뺜o xK[GwnҘ<^} m2r8aخC~BU tP*ó1]'z =J*riZܷFyͦ޷$ǹ&mB]6}igEF$U;=U( `[ŒU ke\Gz-£y,X\%^BD@"!Cj˹lϩu=ݛiͱ10*q`~[y6J&`h4͠ՙ9,lbzX;|<*(Fy kA% gߋ3*͘O jtUN6C1̈Кˋ)}#CXTJӀ?͉c 7<>][CV|l! 8ά+uFb[[ lMV&%d>6, A\qO0$F{5e 8A`)dˍm=uY q0 pb7|0wT6? ?Ȏ34a-e&ԓq)ӽ?)pv7ztU~ p$]$%nn5YO=p?N؇drXK 2E~cQ#X)5c.A1ηkar(R"gB>"pXχ:qOAm՝~ wÌ6?;3@87 pFK$DcA"?솶gsDgfOXl5'rpBz=WA[.aM+?FR ^H 8Zrf9a!p>"7_M5 |׼dFP|ШO0TNB<@+ qz6=O1?6'u3 e(,_Llp9 p n@#Fa[4rxh6C4AJ0k1q'1,0wMF* 5Dցh֔p8eY8/%pfvIĸn鵖G ,&(K3 \•c6d_`= xc7%u#|cj SYsIW$”N<?Lp1l`G.z!pjp[|Eٗ8MFe6,K+9`'xcBxI$hJ ]5 T#*ϩ _mpZ+rTy! 32^UhJ8q<+k8k7̮%ZsI}V qAq`)&l(u-IZh$מy"~g{Ѹ"XM(<'䝯1a%OlhXʯ8?!hP2B 3`'8=LE\s.9`)2N9gM0 R1hNU$8UWo޶rˀ)1!+PURxZS+=TDU@A{@4R6ɉdW OIrZ(&0A!uiẦM0n<,$W$@Nhx*Eә寑-U,s!'דK`wݙvu@QÞx4aui5Z8_&J{]oAcc ӵň=D ƄUaJ` 9NШO ɳJM,V !ϲ꜅oha}#0}W04wWxA${y$J)JK^(̀3\QX<Xue)G|Ĵ:@N}A]p+X E#(f݄uuy}rI`ϲ={0sҗv+Naa ͵cI@]!ᐝ3șN؋)[ۡD=@h p9Λ=YغO͈lر Gi* aͦx vA7?".^NΈx oN]]PtV*u*%='a %0<((ߵAo0}Տ3-AdZ>(UF^O׏gpϡF+?T{Ƀz.~g^hǞyB7a!;vϽ(%pmNIbS*jwu ep^ʾHg>{0b3uE0h,]q/400PӵSnl"ǫS$um%B}Tï] | JCN\&D_}Xa>ht|չ㩼ǎycoYr 1RO@-e%· hlpl(XQ%k8[tbbv,vLrT k7N1+&ܪsvxbzG(a\ҖY7!8jMqΛrye_m K5Kf$ZzZ 86ӣ ޙH,N@#-e:VcRK*O^~Ǝ>?jzp|"tD7$#nF!V:#ZIפ%S4O{6ӓ֝6i?q.݈z'~̡Ka5sD)suFi+XixV*!nr$I8qHwc~= c0M:r8q"I%N+2k|maplM(y9K{B%IIa3FH-ŀ7>$y[Z}$ɦG׺B?$@ eV7E$ɱh}=ZkAcCz8[\}$ɦCm&Q?kxV8l2)o_$JuϞ#&c?Q|'7dRY7($1SM euUֶ`ȫYy:h0_m\ԘN_c$IZ"tЭDƢ񟛏tzo>; >/l4,pJMB$Y-p"4IGA-]Yu%NӶ|&כ:5wp^:(%I8-j~ }j8*- m@JuS̢fOXb$IR",ەGAguc#)sf=kԱ4s_-I%%-?FE"|&f?'&NA;kTpKUMI%pH8α8B҂(L0OlqS"YB ;_I-m2\gQ$CCf &;~*p^3Zue!r{f˨g?XL$>՝;M~?U\*JCN[DH|mkS1Ɇ\KH R9eڨ|hx4$7<vFn8=qߒ2L"Yݱ?ӗCȕ҆ ?\gvL Q'٧ӓ$rSt*aWo~Yf/l} §DfcO8`$b3nPz[!B 5޲QadS\k%IX"Dv"+\JwגU4 Nu  `ԁE&)$i8otIl@lҜ̮s`RNpyۧ(IgJ/{v@qUiwg?lT 9Gҕ̫OOARH8W!EU$I0@zF}-X*҅~P3e.CR2l4%ILb4Fa pȃBx¬5aJj앬$I(%pZDU7V<,l@n\;idRNpcWH(sHo@`xu! F9 iU*G/]IKU~YzPaP㋋VQ+CG AZٴPpy^/T/]IK ͿʽK+nբdnZ D} JIc3r؎ Q`kKjnҠgEG6J74p0:~탷W+t>I"ǁ 6xHqc0ߜi?l5p|3ꃰ^7Ş)j~iZlRo 뤑8ݖ-Jngy7=8<b)ֹ>g=9GET~֗:%E7؞i;OdE H Y7}Lx` n%;nw`FC?]e8*&iq7Ԩ] W ! Aڟp|EwaU`%pߛPP`r܇MГۍp/01д+ n)pBsD9n>Z򬄐8)RYO$Vsf)݀E;N`syv-ΐF&s:ZX= ]Bਖ1qQ_ZtsOed2t{hIXq9p:եU yRIvTgY/tZC)fe;웖iLَ8[BFBc~-d8uYNx6^>daqZ >Y $jhp,M\quAQc4Jp]LNGXAp_91i6sY# u:iC\ctz\)w e`ם]{NM]g.-O/_v+7g j̽{)s3lT*9YfR;7WVJ)7rr_χu0m_}Py B((B ו3k u&,ncǮҗ°'0*AA|0*J;( s~ImԚ7K'Ixpp@60 O6B(5=jZ XUj\>wk'+*=Oj_&DU؆?* /;' Hwӷs.*6 9 [:4U8EG1xnvl1qNǐ&+*j wyl1-*7b˶Iwi蕝yǑEQnh-рuT vLLm_ؔd!_0TеoP[YH|~&sƦ'^-p'1P5d#@5z==:mRme}E!(D? ?kЪʋtCqؕ3 /[7\;ȃ|܂ IW@t 26X\ 8;K7 T![f14~'WKv d*NYQJ,3 ÍAp0!+fYO 5vO$p_W N[D[—tiKkp0菛t~(pYyZ |i@"='ޭ+覲+b6>SXêPb~g#-7+NC)rfs3i@NAu<{*C`=Dkp`C~8l`" Nא?%dZihKWlL@Q܅ZP@t!֑n+y=ӷel>ޚ<ɏ\3cصŀ !w/_MXS;o,rA^sC:Ww8rY"wpq;X(SFRFKC0b'nïNn"t208OT``=[Yn`FGH!i= 8п4o ST{GWYL5BK3{_.GO ?j&"i[MZ2^2KFځC_@MeĨcL0 r銗;vuM{KQvMrpm؂~F'N6_(VA_)9mz6LŢtjx2;81E7m95ӝ~ HBoaˠ8Fg?jH#G&.TZ{-=4oo7A&ÂWM%mfuc9gN!jQJWFsڣtzXHDd =ߡY$h 8y$ehV xz9p#fx>_p-pЃZ/(iscA_ȗا:[n:~<ob10 ΏB'7npVC;0QV|Agd *CO# (^NJC?l p0`~{EuMd9B> )nqOC> _BƨRN/tTvڶiӺU҂Ս$a5IydeJ |Nھ 46٠!FGٲ?3lMuX#eZsVV"#Q#/hܖ!l[Ϫp9ڠUtlY7$Z ah/ yt^huP=+]}e9jy݄kOCΗ^+zdb2Mg,g854Mg#f#=;|)ŀ/pP*hI2yܕz|~6 zr0F0p&T^7%61C|䛣7R4!FuB=SD60U.EG7޺9ǝ6u7:-uttޚ|/k>%NO=˗^~7Ŋ"U"KϴmrU@I! *H[UmdEz"fь%+~r[qHYqRT{ɸwU,DŽG*r7gcŲFf3NT~V4ΟNa cx#GmD29 FmZF30,9u-;܇Nֳg?nuN=33jB}t2~+3>-<&TԵɎp[p~kAf8d.*yz~IUKEN~tfm?Mc`8v?i>끠A =d 7 pܡ>?R.45FIŅ/DO [ɦRoS(5Ed0p+OJH-n mc`8ΕANF|p86[T<,.4ѦqJp~:Ew\; 8)p@^f. ۷ p 5TZ!/'=gt|K (m䃲)|>Q$n8wbDQpR1|<^T^{' s}A1 q$%*&я}Fc!y0}ݞJnm+ԡ],a1]Q)Mgrs(pL}.ۺOY\.ǁi_,9|}^3i0Ni~:j{8O>=UJ]úa-#W1ܘ7d'|=MCFTTn%ɻߕf؞s/3עNz߈o mCq?Z֠Ju!4KK1a]i p_FZQQpz) r6^n9ʖK #a)n yU fT6\&p~ˌu" !7+/ʏ890/2?JfCe)/GDN\Q.*5=v!1{q_' W Z3ƽ`/ds-=I=8R0F95wcT5N|l 4֊mׄ}CԄt #?/Y%ٚ**:cڶ$.(3mNu"]TC3lL>Mp2 V2lfreG7Zg8_]/b-D9fxM06m){g v xKFۤ 2QKRk-p(ķ|c IYK-w9YOu\uGlO}`8[!s'z =-%}&U'`>pׯ48 gC/d~47YxB֒Cȫn/ 0 ǐ~lfc?T/٥)le 8X$0N@(}Ss#99DkOh+rvkRa^Lw@M3?rsg8H+ig7DUqD?Ή̀ch8>n>O|a>Meks>ʋ 1h=u q'ss jZe<Оtp>fWP-6(== C\ بs0ʚdCop-y-@8h=h8zmr8ac`8i3J#i3';O޽J e 8lyײf@pV8Ճ1}'pU)GG{'Ga]}<˞ 09Nm.hi\hpNA1v 6&3 `2_Z3vv'2cRh(7v!p 1Oۦpbs&0`Z^p}M8s@$8q2|}KpVr ~` XPyx|-Ee;]sj>K3D S}@0eΰIg5ruSǠRu>ywpQqQ_G8 <p}1Elиg=_#Aߧ.cְgo*FǻniwԤ1(N2j"mUD-]obz<0b}fy/x˞Zg$U NE3/X'^g_no]()pN[>vNB!vtϧg2l"3 f%&|wT݊1D;ei>5u# pr=1P%fƭpAٸTC}t⃘Nxy'0 ]uHWiM:nwa?reSZ/_?{Ic>G]L;ni_ի:7ol6eqA[/%o?lkw8Cp"3ĵcdγВSpf->Vr Mp|Զq[!83$p69̆ 3L"˼!Ef( l8WII"(ap,%cs/o T/ɵ3w~|dt>LJ+mX")/Pđ:8LSZCpă& 8W)~YСv v㷋CpeT&$Hr^Y2/+rnCmܮ!8Lp$9R'zd&4^ğ|۱'p 3bCp2-GJ _pL6u[esrDh8Π.f4L 8Wb|jGȅֲ||nrp 풄-Cp$Hr^!'-M_#c`8VO63 a#y%:Z}Ƀ C^y̲lݴ@pp lbA^3jI+ppkM `Slub[]C J>> ɦp$9D!OCƭK׽}XC@:'B!8ep^$Hr^CvfQ|/ }[z@yKPK~cJipN׌ΌIΫ! {~:s3`p #2-X!'=igϔ*u%}3tI+pbJkF#>̡?goUBt&6 b>%GJa&Ix[9t"~݁íK˾iA!82:3p$9Di]?g$wݾY/$GJF"Fcg"=:C1cehI+p:v{>{/_z:vSCx JuK+e>,0I'XBs#0\i|g~!kիgD#!8Lp$9Dy{~JC%79{Z,0'f,y>_>I$8ŠDm p p?dL5I$8r?PZFĉx-|A2~I+1pvia9%(M9Z|Yr!8Lp$9DT^@#rpFxP}ܜe|I+p"wǤ63!3I+>(u#ADSP}v8Yp$9Lgp^kjR$GJj߮]6[jYQ88H q3c"I+=pslT.ݯw$pfA!K֘#9Y1I+=p&/XEؾj*Ϯw(p88lȌ$GJd٘G ؙ?o߾{kV69GTPνN:.a. >oqH) 8W"\[۽E ?X7ldWuϨ\I+pLZHE+^D%K*]G!1{QnEgPK$i,o$PCT{ Mh82W1B+ 8WC'OT;8dq:C{3})WPIg{hHppP`@gEWѴgcgZ%HT$Hr^YP'Ʈ$CgSh>C%GJ?S/nЯ{! 'a69:ԝns 8W"lӭ`d_ьmc_"Hc@p$9DQ11\8%!HxҵTp$9LG]C.G1c}gpd!qpX rXK$8~]v_?+ ea5&_w8Cz 8A^'AZ# 8W"/La GދRaIn"$N$TANǤi$Hr^Z~)')v=5B0u 91JI'tPBA@0mr{W蓌yV@HH1Z9OlUwILkhVשr-бI(OM+I+pH2E rӡ-Hk{'FIgWNڤc@!w q*1~1K$8A6EN6]qʞ)Gp$9D \ \&h% g;`#NA:Nf Ig/ VM+g r↥H$8[v΍Ë"'=\8ڋvUMyyF$p/)H$8̏۱a@_hOw4a vI6#y%ܺ-%F%y {#XU@ rn( 8W"L=-# tyݽ'Fqq v|I+pmcƬDUbp%&. 8|_"4C*7y@t}etan&{ G+N|lc̀}o -8Vۍ/r 84&}<K)OlhnGzV]ӮHΚlt tlc1)8"%lypr b5)rckiceBp/]p> ?-1l=ya).9`@8d t+_Tv oPݎzuUW^Zv\VuӪܾQp.KB%ͬ3x~4w:>#N6u-N蒊S;F 돈k 8.8)dK n\r]Cz=.ì ﵻ}/]vҏWz+󱇊Ws +Nkݽo+|#VEOE.Mm$X _Pf!GovݷZj{p_:]7nۦ"v q{2-^48uũL?ι8eץxFCp/ 1~U oD/Yק\#jO/5+ruOW ܃S:Uυwm+kG$`I9.u>UJNjRv6ǰG š?. Z]3UmeQ,.-8z#2V u;q:p}!%8'vt{J Εd dsP7(qEq:m|iy4inC\9HG\RBqNC跊1^U 4IS_V=}#r=8Bl_brzGOiwn^B-:c|iHJInEDxSGdN-!&0&Ap/MpzˑД|t#91Ap872r'v(2wK1[p8~) 838Hnx5cU*9dYq2K2UHVvm9?dg`r&ѷK!|m.j#9#ob<!868:.u I_ω~g ΢֭_ц 7Nn/]|JzիY;d&[ݗHAS _~-R56ϐǢ$]:rW8;L[tH\N(r%hbZ(cгt: M6ȋyq)=b#hsF1k8"3ZJv22ZR, q@pg2=g QE RRF3W(FyTjpr}B?RL1t-iHyۀhr;?'ez՟x-Cf○ô?:NmB*S)8)3Si2l9iI!?~Z]o%z_zl]p"JVoB!ʫDT_NoBpG{ȑ#wߕ)8խ)Vن96M'%'pΜ9CP5vhƪ˟3rbY)/ [Sw!VS!"SwCpJc '6)z;(S֠]G.Do, Vg(y-}228R38H,Sj:dGSunpء kD[m@L&9^2M٧\Q Luo.'NCl(ERLA]\ B8ɬN?csiemr0&O<'3bZ飼 5蘼T NagGri2LyC)8JtKUz9C)AY1"{ [wL z8^4m miN=n9qoX:!8I>Ʌ|p᪁vS'-ˤsOy7h3oerZ]<%XԢ[^wwRjIJ4o5>ʷd5VcxMYVnV ^@p]1T| 8eqO<H*>.:>H!8E [uμ9@p<EzATcz@pʐݖ%e0|!8cyX| 8!8cyX| 8!8cyX| 8!8cyX| 8`w;T X,U6%Y endstream endobj 24 0 obj 121368 endobj 26 0 obj <> stream xcte]5vvRm;UTc۶m۶mUl[{y=;ߟvk{9}g_"'L/llkqgf`ț[:;*Zr+Mp*NV-\ hnk_@1*fagS `abD[!߷*U%ujZZ0sss Mmohekg q [YL@8 s+s;;[(d(3?v8r$w#)_0q̜xMB&@ & 6@'ƿ6ƢtO66bbnccg;FUs{g w`gbafe@7#36Vq W`b`67y:N@o7?Wpcs#'!&3pr0wh31Uw mgغ<9,\fq'ۿu/ a`=27-?F`t_55m26;_O0mϩp?:pT!(௢6djeX[tu<7:i'ۘZFsG s7s'#6@+s[G zf&/bfnditt{€6s[Fq#[csS_8;lWZt9 Yi~hdT{2^{hG؂}Wi=,, 4p A//XM}O^+|1Kn@emEIJ bJt?cjxcECCALo ƂAaۇSz3TheeU:-Sȝ~*$bE0X}Y<3gWt?/} 񛷷̜p^E 6:GR¾jJ>sIs7>~m0}R'Hw֜v)<+'[e&8#sYhb7A<}wh$=W4cU\-v/e.e {殴?n_օr' GmJxI74Zҍ0rCڕ}́}EbnzRTi3)M:/9媝_TݲbD di#?A4tPUٯ%]7_In-rb)~ɲEYb`*Ko[J0Amo"-LG*uU>-C6ޣSKj0֡svi .lI AS ltQ#'PSfQ9!!_ RML#ޭMNz"j 4)~E5ֽ>$Q/<ҫҺKH4, }Kq'%F_5ѷa#8+rK 3[>A ]P!tQ>QGrǴqX1Ey[A»T,iR%^̱PerĿ]Iwhnw*cțG'T̓rEӳ 5-v39Sgב{0,4^C`^/h5+B ^~],@8Æ=HoX_m.GpDͬi~ nje}!1v. Fkd v׺( WD/\ݘ$:ǹTa:vYuk46mý,oUv0O+hǙ<+ÀK%¥Yzд.}=;q~ů0:G3ાS\qOxk ;'n&dW<~g]:$8Ⱥb_ S8` \=ON܀aD~,$AkLiȣ^,nQcN]V;I]WmڼhoUJ %HfR&h +A-CE-zxPA0E[Dl<-ܓ49 ё"fkoTo9, 0g{cVLY TziRʟZ\)ׂ=l /U9!ʇ s!;?Qdƃ#H}Mt"N@t釩'hAOPSyAg*[ے3"DHCmЫYv$f_ώ+(gpk[\[W>(Ϸu68_.cQ]iaohn"_Aw8!ybj@& MLwF>HXhe46"iXdٵ O\?%0Ml\ۓ!1ZUmZW Y!41Ъ/BXos&-lt}(W8ch; ~ m10PUy (E+`;5 .+iU{J8 bOK#A_lpk&s!"3p$i|H\B'O7+g/.[|G9 @PG?5 %~I,7\)"ވB_CV,";Rhjv g]H} oMGiT8$~bP7<}>Sf,!M(9I^4L"#h+]菍-S^4#CTa1+IW[haV$QjYsq? 003,Oi4ET&7$[F mw=(LȜ>y1tm4)LJXr@]HK^\B9hGܣjhdpjVӖw `G>XEu4["Y#CE$V2$!?5NkTwP ià b:]ĵچ }*Mٽ]!(7'HHI\#"5ᩥԒ,x˥֕qO,2u>AZRvFifq%k8QCޮG\I2AsD:WxT!SI-X|o=?S,T#ڄO ȷE2 жݴ_9Y@*xnks) jt6}ﳴCgD9%Ϫ^J*sr/a_DZ3i ²W{XݳVLNggE92 &JS n ѿv[0<)N|. lK{m7F" (_I묜YW> ~AE-ɶke&z>}N)lϣ~mlǍ( ii+8\rB3 _,J(s;K9<25/q 9g=³/vM4ZHfL؊:l s$Λ֛pXG~w~/d,S}d+uj 2\p']l07AmqYs0qD~*MjtK'&S~#' Vc ( aS!x$"}  DvQ&n 1 櫹 :!ң'q޵z8 U*6fd2~T)sy~)3HŅ\_@A)^Q ,Oge R(;;AKfL+"G_BoR/3nyXv8!!W:ˣ~J*1x v:>]&ɬPߴ W[7`#\2Sx7ke6wq/ a־#cpnלu[ޣ~\ώK\-EHcFJ_Ƚn0>9f_L5U;dH3뾀 TqͺlѸֲ q68R!W^v [U^G{ ,8P]\A^JbaCy{Kot׍i4MNT!v_{L1 *iǼR-yQ,0ٲI}U u^uZab}MF/W)laQ!&]1EAB醯KO3R-eȳ`g"d+踔Qhd;b=! &sC#bA|C{fӻm+8܉S ,(o]bDۀNvRjVo`5reޯ')m fp$%㠡-0C飹X+a3=9|G]CO11|CE#y t0{hRQE'6z3ʉ͡t-\6 Xc '^(ҫ`83`ÔRVz_b:qVIgCRRt{̬4 -) -<3-&]:>k7E ߙzznW"^|K"T*k$%q)¸%RƥMu 0ebȺj*V,'iW7+܂ވȮV- ~Aq^Η,0.Aq4օBVJY},Rq$0C-gd2&pGvhΝ*oe&6(ن K)e/V .v|eX>⩳=*-/Mc VpV +=-h/r)Ns~7W0'U&QJ7CNVk(NȬwTbx+q!%`RAVW~l֯V^JXx{ E0[L(o̽"FYfs\>R9{9~k9mdMoa.).m]ӨЪ-VV{s`[/M-=-5NB4V)O m=lE]MȽta(M2ae|$9vB#:w4Ӥ->V-(eB&eyCϼUĻ.ZZsE,52 E`=Rq!Hqhڸ÷/]]yk;frg8%oG ӵd ohſ9R*kYutVu&qg7dRl\ v; kv| 73zZ>= F}^.LDÇ_b瓞/ |)9Oe׸:!Od혅*:\g.p7y**,?#zK ⒃j Yf8\^;cptH<~a]CmLs&Ü? {9.":2ae&>A#?l!=BgճŠxԑ &Q0;F쀭 έnj2m㨻&_@eoKHLhA^4մ3F`lv4tUd\#GR7xyL"_~'gx=4\GGS@`ҼDd#YzDJq3 ;.2x#? {YܔTUKǭ*O`Rހt]AK%4znҝt1c@ikOױî"IWljk;Qa#[Ǣ7Tw#A^]ݣ/gͩ]ȎjpX7v/em. <[e:Dޚ h0 b5oneM̦5j= E$]R!5]}gGhZݮBN NG ph Hjo4yϋ|b3bu;q7=wh5]KYm>KюPekN1.Fw܉~" aZov*u F-]UF*h SS:cE }=nԱNc|mҦl!NƊ7jo >G*.C]5Q\^ S31LF_H ̢\ ֘K ,F06"WoSg D^\nR[It)Qzի L2-2k3*y[J_[L^iu-3Iz.CKB|uqhK #}VН{ FLUlM%UOBW>KKE%w'V>ב|ݗT9/TUyXMbB-\qBvMsB ZNK51 kF1_o *ZPА\n>xu0%'ɰʮ!ʕt?ZdQv/ g٩/Czf{,yS">"Ƣ!)/oJT=^Upߪ4!0۸[ѯBE˙{Ȫh **S&GU ~SCӛ.AfnЅף }Ή_ wc-xF~CO;y  r'Y83 qfx!ݞkQTe)J~%% Gu, :0n-HbguI[=꽘; $jB(NyKDz1y횦.GeU! )/֢i? ˷b+G}%\ gkϿ1fSjur,N9Z Z~`0 Z,,'9܌$z_#i*xL!tCm:&Bžȅс> 蔶#6Љ5QHru3DP>#"?#<JA(QH sF*ecQk-`Z! H~hst@sAPC%c_ Ly^'EfJ ~^EhC&z%>7M~7 1kÿyKa3JuPuhv}n*f[]A0MWl̈J},Awv(ogY$xW!ٗ}unTbxu6QC1'Ih:[apRNE1)jb,(y% _( -L@Xp# -ZaۑˉA\}0#M$E(&ћC%ـ?B- V_JpB*!YEcYx:~5ɿY}m2p⚿ qȍOc"7Wc&xi-ז-ŭSMm_(%gWlyewOr1?~0jf $ܚ  X5ZK}kG.1ci&̻ʟbB{nWlDB:Ҳ3]S/(|N+JG`~4C %,0~5A\mt>Y3Y-iuN!TRa3Ц@̑xt’zPXo/ HPm+" M1.u"w,_C2Б!NimKrfiIZSQ з[؊o[2'Jdv[RtwFg;iMh`4VԂpbyA[_E /% _qѩKEB>+"s$aG-hϠ܏Nw}ר0OR+m6W Rs{6o#9#OYʅnZ\4GȾSx-XvG[ws,HPo^o +Iw5)8т3 5 npmnSg-2ÛiVWClNe';lSqМGo;:\C\*+gؓ8.91ם32`EL)q·+|~E(ʷ2y4q;v0`㼽Klbm)0 QJ2~'7|rx"ӡ˹bC88D Ok]%4#Sku#xT?A% Hgŋm\`fGk=$4+yPڵ֮h!_#"$u*bv[[w9@S;Ր|5?IbYWr\'k'[?]bMS ' èreܓn ؘǶ#\cH(ʶX"J}M^p"Хxlesht[}ι7qީ"'c{K@y>d](||#Rzƈ 7GCg{c_gvhf>FO >jCmo@VJ/8Xiw" !cZbRϖ]ta`fjg:xNb4T\XyV2cmiس1`1͠З:~3+F{Fb|i8B[5ؤ{ 1|h1C3KM(0nN2<Yq*=d% DQ03<bFYSItɣ05, zbBEAq|魎 {&!Ch{e m-мrBld.5B eb`þ}/m12rz'Y) 9A1_@e轲P1z`-W,L1";[1s$A~|YyQ6t"gLTyt-R-~3Usj 9&W~eo+ ܆)wLhp^ۊa&|}v}`͹2@DPDŽWdky,e>\H͂@Nne/n=";%tPzKԓfJҎJGcc:MODzkzo4OJ\/ _L, ܶ֏ }ej nFyR}8`ynLc%^cN~;2t6 ]}᠁7hg5RU8h>SΧEƙE* dWE㢰Q"qa$^]QZlD$Ǚv#}ăd$4%,_A%Z<,=cѵw^[P0Əo"TbuH9%67uTuTOKw =jh]VB^AB!uiU.ܒ{bq|?bNdؕm`㙊 L3}G*O\E.48]}1[8ssTb!r/`iK \s0%wPD$<$7ȚUv]ep6-e+ RjOdh0+RP´5eKA[WC9&QH8h-:2UDI9sۭL1Rs/#VM.3^X鯲siG: Rq6HC[EM3@ݮ FwP+뽩R/oFQnYDY6tFLDƹAehG1XӞ䟰L}.3Q5 :p*}e_e(FX8D.N0 W.Jl7Rқʈca ,KKDpd-HІb3=V..on|Ӥ&:SSGBͻ'J է1s6ik'?zkiU ֐ ^9E>/\}qݿ+W}}L\H[KmxNŵ!V,6[sCvf I0 yg,Ŧn!'AaNe ,jxmLDR./4‰k>޵f,< Lÿ`sgYot꘳ެe BZT& \ku"3Jϭs m1< E5iu"Cut^UQR 2y2#$S nM')Ky8LcϚB #b|'i'm`4p6zgp]kWg,]Ow'Xy͈ AG/@5 ( 5wVrf 8qȄJ $''0cP&U L:M<?p2$ΐR'fV͵Dr" 0*xQ$噌AmU[ ЃY}ɱ]iEjP- ٞyMTS%%wKre~|Kِ{-'x).s!ng\_l4Zv{rEn2'w#IcHOw#c0"17| WD S͡HynZWKu2o +'1&88i{f>)4ǽ)y%GV7DTN )s҃!=3u͛)|:x;N'ߌF G RQf[&sM$*Ie?TY:MUZ.DI%,oе'4LF`w `&O@'Io:8In]k'J ]յ@Ԛ{,-8봍ՓW9!o3--&m]A4nt?޾Ut t[#X|g}pyiwƆ&fFM: 5|OӅ.PpF)=f,[d(߸ .=vk1W;=N&р%y{c;*ݡݺՓm_~zR(KV荔c\)~>uFm1}6(@\^ؓ?4/:ݨ?L Q^z8o#Y&#X$a5[[j !>t:819ކ7wӺ0J uMjTSORMW'Q=iDNe)XpgMVl(S@:=tܴ L"\rϕBtI}۴?dPWEY$YFީ2\M8k896Ez~J)=e<nY7')9Q5;T߳Âm +KT^!U𠘞S.i:pd< -Oh{VFQ?@h!&=)n"zb 1a`0:d%ȤG%cU!S{˶=1;:,r4+S0h!yO9~Z vD*gSc \$"BBa%F3S>zҹOvh0;:xz Fi4h15f^*KIg;/M}hIqy tB;xk&ț44|E"OLAL7w>Pۚo40 G7GyĄ%B J_ vA0Sf0ܺi%ML(@Ǽ@ewR7l!  s+~hMOamx N|Jtb:IBю $3B0`CX w8,x p*Z~&$;g9tQ0f*oBCCa^,>j254H1\c6>eЕQPQro*ǰRڏ *P+2mmg$=9ZvX~9;; I  -Z GYDWH^۷H.K(A"NL瞘ِ̈́#؏t;nLv{Wj{=g EH!Y.?zţ-m zm)8k ǒP10C0ZE0u{s19<\,Ve"Źk鍂Viq  8qiϢCmD.4=Ia%HCo'-6e̢W[bP4;6VESQ(oIZ}m0YGʗ Q8:0oz=[R])WHA i#a$@/!h|>̧XԜ1Vrtjisɠg F(b+0'0F'X_7Ko{t @JBb!sm/?/hމ5~3, ycN5}oo2_儛eP7`zZD-b8 UBw2jUkFǎyR3\ȨuSЅiT_<)$B^uÖ>li!c.q5A, &zb8u 簹6ia3lN=AbdrH2v-[7|Eu{u3F&[No0uVc|ߌpCbHq,ڄYd??eQv%0" 6NtdAbf0!QB;;gyF+h˷d/W3Np`!i)9ptp!ۖ=W\;X[miNӸ]2 x qg B{3UG(%D,sdw| 9/#AC+-_ j!VyMpnVȻ,м(–zSi*A@{%R:fht֯hd^heI`UqssޚċCj-] rh.O."2@zxͼ~~{P`Mn 0Yě.Δ|bFv5hL~"R qk~cWa]k|r =>z}_ACYЫÙ_ ؍p Y"n dU hZi"sZ2#TKPtIY0.2 5`veDJRg `BEwc[ 78&5U$0QRTU g;_]*\_5|l_ȣ;BS~~TJVTLI+p@ )9U4{ng@! 9y |KL?ij'4Ib7o":2mccR,͓'blLٍNXZ7zoi._&ҧK$1|Hw7q2JS2EҮ SwٔACE3Py5ľxXxNE UcB&_u׳{χ=mM*;=sj=40L/1/`-ܯ!ѳ`+ 1]Ceb^ٯbQ^=}uwZwвFrĈ"Ͳqv:PZ- =0]N_cs0:TZnGWie7i93F9zl9O}6$2_xǖ"3hM-uw=9$T} X ;&WR.8dPܨΔ&n_!mFۼGYy@!-d 0rCRf^T1% Yl~ZdeDR> 6b*όjo&ga$]$}3 2UcocBU7&.4:H<ŮvcKp-6ڹ2lzS4=u&)rk5nyԩM q`l5(Mtz[FMWn [U R 6t ])$hB/UU&@ٿwqr"ܹ/ٷ#JSy-EUG ";{YŘ &ffFA+[F*/81bj.uuLFQ%HU' Y褛Ru )AQv|\Dp'td)P]5_ ڮ0W8=%D0OiL,k̖ڪ>)wXD&$6OLm׼OMHӌPv+(K K=ŠՕ bһ=S265֙sbPq1&h @gn5b{P`Wop)/JY Ӛ4g=;SOO=B̂z A o!D9`<٦fR)reK?6\/3^ )zB*5=Wܻe?wƻfCArP*U-ɢ=!SA@A&pEg` YK(5zuxo)LZ[=Cx0<\?j+?C"h6/^Y[Rgz߾Ž[*h_9]Œ?hc@v7 5TLT>0ӜEro>$0Z~ireەYvN 0;_ vhIt:P) Ee:_oGŸBjQQ B֟@xnZjzcvMdh4j|Mw ;Uc2f̖\DwgX hؚ4ΓM:ɷ!syAN9D r7ݱXnr NӶQmtzD-Gs\A֮{h4Gvoñ9➲ݘ֔0DAsl a_Hq*FWv@_e;5*/Le[r>gc:[.CŰE[A)G#,yw-Y.#%R¦[}c;W"tԎHgt,fKПA|<1ȗ?AiDz)cX`-<{/+ζ\ͮP}q3MDWz巹q.$ݲ%fU>@fm[4լ##)dr*'+yv2 ¿tYs͌Yhes_0ɹɀμA\ܶ2A+~aQB'zN˖5fc1yA rU/Dk&0\ɛ> 7#P0H%]Cu'k֋SK+6BRR}:w)7ޜ (ӯ v[0}>rvdE  H \`9W_<1Kco@=lCpSK߰iSAĆv4,nyo%LXMIjh$CI/9˲;{YNPSU/{= r9TKdw ;̢-ߟ=S|{::Nn>*S .۽ZM'O)yAAgU /ˊAsMR6F(F8=F͜BkzBb6ah>,U_]7ǟӅg#gK"Pmf+z|yk d:{<?D|5=NdE,Ojvc<eе#R!13>+Ad:I&'ΦPX{cY iL\{.|pV8K AD9rgUw&IW{I\%Is(9& V}iA.ZN45X ڣZ @W}`ABS@ )9 >KěAap |Ssqy2>d}pP~^(RVK<nbHTGw`uuEʹcU*74[C\h1"sR)=h@Hϋ ZWѯk^$ ~}4L֧;D$cz4U' $6>PCz`R)"rx]Km6j M\/b}<;fnOi?:BSp&Ų/7IVՁ@(S9q=.5FF;&YJOKWnVbh4¢|3EWNq-y\v/u|7 P2&ED6X9аBcNΝ ; G9'1 ptĉ>ev/"9AJ#/&F@! N٤ s/`E04*vR> I5uͲ!}͸W\e˪ВI۽ @ AS^S>1J$2\-P/WJ.Q5H \ 83>\Qd-zu :"mM 0%mx:.eC5gu.=Gv)i­Q;A J$ U(S8 ϼqh 3߉J;4>RS6ݬBR(coԥ-夐F [5 %‹RG ~ozrEE*#uHt%{6 4HL\WHҔ`ڷzSq|~:N$ m"=^`Ԑah_耫-}JtQD|/ɞ9 x2kGԣB+ *e^1ReDGKmyp<ꛫ~d4]XK &V@⯞#,PNm+(@jM1x Q֕+E21M |\fVZ%`/>t;V#,WE|k˰D zƌ|I}OIS-'p=|!CuÔGr2گ/_^Q\ 6,"n kwFB%&t[c(Wggdo&ߦlBX @UYE-4[:}A*%B2,!*8 ~Rō9QNHO#asP_D̊_*0g>ȭbo:/. #:LeTp{rv&9Ikx ,"ÀBv+OYZtqX5&M][!_֘($fMu|{t>T.)qQ# w+EK M{&>N\0d[2}üV?L:f4< OL =j&VarX8=XH* Ɍ-4T9%Ռ(^Q2CX,pFKPˋ)aEm.~).?c|նZŀSd*ѩ-ex)ls?H ߔC9hUh텍'CP06 cCꨀA>yypNrήpp],:IzK,s+iD7'+ qWBز.r}1eGAa E'd^ T{s't2kDR)_@EW,o^K~aela J-^%\X3϶\2?  ([* wV@g(U.mP8M;eCF:aJNbd`"6='иsڶJ=k 0S+.Yb|}m\&bCi}֭R)[ il2v*~b֙i^\,\,TNFsyn|dcxL#]/񋑠{9SNL%F6&dl6>㋟*N !e%Dc,Xƅbtfr[I0a0Kw/,׫}ڧh9PrwZn0>i_"@lV=4fP8aIa;4 : F+ 86Ɓ[ 6&e5Ѵ}<cr6FU4y BӫkMxڳfwNE0ڄԮ% NR:)*x4}`8)7anѼ_.#CaE. )4"y%®Clm!{=/7I@|胆Dxț9bLvG(D;dY.zMqegv{8`f``,1œ2~D^d!جnsMɳukf V8/GÊgիpbHcy9ln=QW(/'s&_X5."|CBNV ^ӿ_T-&LaRD? [\>Caq)es݉~GnU[Hl 43/GE:Jmh^.ңgp}-L|qlM InC{.@#PLN ; YG:[U@GQ=FSi/sܡThcœ:`@E(Z~`bqhU(FPΌFIBXף3`QVXv/XDgCU^0,e_3ǒT=Et'ׯz|smnju$ |sN;C3sY\좲t /RD1x$P3OMUhG8%V9d,J I# F[x474 F*0?loЙ椄О(s'iVkz*ku$bߍD6Qh[e®SJ+Y 0 öFM]><ՙ= hFY ~FUeQ>҇2ݛ.v0 lpj{dr䩅`pRu).$k؟eϭIU6o47l7:jL=0.,]."B[|w60khnb&v!TyTueS_0֎G EIACc9`r%O /6@AMfZ`_O+=}7.q2檑*l_\waWdI\ 7 _'^QeGaUYIpo%gS10?}.Uo_HJB)IفMQgNXPjcV(SG{Rlے2nkKmvwnFtF6W $]K4$G#+EѦTwر믰bpbA CFޛ'}3$6~q^gSs8ifC3:0 4 ]e{q@ߢGXZn͗ħ#ҋ#D8e.ZOxҷ,L恌"Q RDe`3se>Kxf K`zJ0+M=xժ_^_IP7E uW%r^X$sw) R@#'Kl?pc.÷o@ӌH+9B7$? ߁}\.5:7F~Wb}1}w3*Q`t'ymXe\GɟQ+d^Q?wbw|Qf xϐnih%;vX]eO#h$ ?T9rB孑wYj˫;[[RVQw{zAVIdscZ#3Q Q] 3ty/|P}+uD9pj5|ڮb EEП.^@p R6@\{ rclܲ_Lve3ߴH$x/e uIIYcNܫ{0Or&%F 7Gg@ݡ[/@{q|כbjU|xޝ{WMsNtKĞMN֑JSWnTN e/G%x&8v|ÉńάvM>M }y 9Z9#"`ǂjw&Fv32'GLf=EpxA^c=Ԓy#F`OdDPJ{YrHud>,j*2Fn?|Jd%KM?#LYF鲵8y̝]Ӱt_Ms=-"2d PΨ4 $[CsE0z GyZZԨOME zyF6 N!| o(y RNMg(MQ_ <:A)U4-u[$AHE6~i%Ō1}\JT-.ߓ#zr_a wFLTip,CVUҦ_ RiA%kȟos8(\tPÉ{ IZQ( !,E>\{UI+k^wLr#eVp%?̽NI^ }cRk'.;$5۞tNY}T.E'ZAĽP9$ <iWeKRث&dwwD囍U.=5OBFb@YM9{q:"qW}p% ޒΛ9yŗZ5[ۥ`vĻkmpI22GC9yw8c2y3V*[aD^YNQr~* 'k֌ GץEtj 8qn +Y5'3+b.[fl7QRoaw{#%SNi 5nRj߸`=bDtѢ`qrD c*TCcpxot0(w&SgGAsQh3/'o x=vg?)ըCu_Oq/::7O:Z9h*tNxO#bt<8#[#Aِdɉ̝/dM3OR9".*b*ţolҼJ]&,.K]Es.mPHԺ?{~s3~iq8ϑ?{( p+qwV[G#ʊ$.w2U8H!M$ EД_W3O|Se#%L%ôIx+΃٫57ιS( iUEE,JmyN` (Ku#r*dֶ аɦ'i+bu =IpO[O%}j;<FkdFޅ.kП3rts򡴃ƴ9uk.HᏀ- ߱^0N@[''"ti!(x&٥)Nr=ZjBK9o6yzO#z qQ gO&dbݗn\kuQH?0цVtsv4k E\h ٥6:_yKb,LƊ&?\4h gU1 t5_:,qv)/'Fu$孝(k _ztdv>7s{~br"͔ln6R άC T&hU/1ٱ֫_ 4798诋x5:/NR/x_ R^lC}Ҫ:>kcrR~LUW˛^z@rey1l<ÏM$b ,]]6ƨsl3bx&&-I5 ϱ~YWT=|(֗7V4}p\Se%U,J?J$]ӳYnhº~Nw:kW,kkWY#{:Y~LkV^ίo.uI|pm<<35oHx;#ni$aAhC.\=Fѻ@" +[^99j1?KE E4pEͣl2y?,h u_ZFӎsoU#N0A;٣-ցeh]`#d#duok{{tCEm9ꉺoص9+dI(4tOfE 9{흅SR+/v&"9"SxvqTDDTN Hl,lԐ)L4& i'>uQ# z={^TtaQr;y&:&ZYKal1C|/3O~2,38RiutL5PS҃U{)"uEsTeP?ٰCC2wԑ"TgvKPC^㠶~ nYt&|޳`5W8pyFaIjTzb -N؝B*,diVim>LVati5 ~OE7n]@o4 $޵eFWY)$}tn-l<_q%+ aI?R( U=z,6߅+pWomjLly{t(j̗h&FV(ow0Ӧ]5 a'jIK[^!Ue&V)/ԑO]!WpGK~h9dԏ %CC3|EqZz5f6J_xXYEقa&G\2ֈ7lD\<\GHr}wNd0iwٱ뜮b9&wB"L˫X@\(}^ʼF%e!M?đTGI;c[a9~ 9#k&COu`&؉ta E<|I;7͞Sk@a^"9Q&0ۿ-u)rCAnk4y $| ~W4j:w hR-+Gًb2G<8zr%1yyhC` s J|ѕ ^AxѪRP5(_=Us%*0}zM-.M G_tܷGc9ᩜ.b$}]^SDnڲF/4#x[n(,<ZqUkc4>l L M Ɏ34CJF <\=8c]|1PX㛴8d }$I_(@rZ:aӠbV;_C.kW'$4ۀB=V0@G$i TM*lC [XؚIa W?ˤh 7.)ѽ߫wU]ReEv8 ''O/&P\Pq$q,bR/Zٗ>̽%G;$ }O-#g*.&C>b<^lm KLfGX;>π-6fmQq3Mk4Yit/}~pVtBY4E djc]PpO.^+}ɣvUv/O3m | ;Yhn*b)ZspN``g^P? -9J&tܞP`mq)N_]].تyr{q4WL%(MHsl@2& YQ';blpj4\?2_φ?<6义Ӡ,`͘\Ҋݴ뀣(Z\K3GY?W,S[ 9w-A+Ưl-PVl@!GXdnt&c bu]cBsjsYi ?8îGѾ_g k =7׵*!oDe&T@ZDu"XJu?lO .!'-$(/4.柗[p]iBٹk;ӪV齺LA-krgL^m0' gXNﴥ͸`0ǯ**|?@t-\\žc/reCz˳(߲;*,X 9λoec۟[Äo2ܾWQI]mhw9k\k<~Zk$ga͋P3$Lpy!ASmsq͆H2DŠG~+k\$xS{bkzxR*O#׹ovسTBʀ53Xm]Q,Ok$PV?sp 2AVk̒Q~H eK<ﳭY^n#JkN;H/rm /T'|'f8! '%]U O|8H#A;ލ(3KiT#Q&@B`j[(}W:LF#;1DK9(L}Y*f8}v1ExK,5.` PTgL4 mB׮T~pzVOY1|b} .F 0sB(ҏ7sRZ2>ˁk\}Kkc?R80I8<i83*MP[ L FC7}E] ^~ (պX{xS#6^^ʫUgDwH7xdQK΀&od _Ì03D@i+DU8q²ﯵgSV5f05h='ytzPĈVvg$Yw. bXLkM3YGj3=edsu>tiXzcwez`O5p:㴥尃ٹ6Mz0 ';/(4c_b8?,6v7lW<<bj=Md$_5-W@.D ^_E>q,G4'^=fXVRnpfunӝvZtP+oPRj|$mG{B=i`z.ӡ,+z=F#7U3,Jh,-Dc݇}O1fҠQ}D@xDҰC.j˜g-ҎmD̏΅ԉ$0!1r&`y?R=Qca[rz$m]tt||{ $\\ (Zw@n:a`.X opQ`Ї#uwb^$3A&uni7aOoGim bQO9:^: '.WNsݥXFOxֈ5gQH {Q U(E_&jhZǣ/BᄼN@~͏8(tڇHْ,~Js|Qs]uֲOEY@ؚ&qΨA,p.J._z֢7?Qr580G2wt> aVuF4M{H (0F:[\hy:m: #W9D% Ӛ5ʳ#uUɵ=u ?ŚXSCLajak)i@MeMkoy%Qc7N!ʣ"{J:Z1T0WװG_4! 8uHc5w[>*y3u' OuߘऱUz]CG[3av͔4GGlXɢEB2\=|a ZT]dj]?e  BG3uQ3Fm0$nj6F8i]iA?Dvg.)Fd{ : EȬu @s:9(埈eSuP}&ugǯ?ȣŚEwG2F2Bf>gHzhbȭTeF --c%\\!"YX ʠb<஗aZ F8XVPgB0{KИ}F_}u6/y_{@:rƯS'~M6I THr3~vj1g`} @񤚭u鷨Vtes 'PבIQY=p w FK4I?N5|n5 #sDoeH{y5t,ЂO6z\!@lznOW{:3ŁH萛onXՇy볲Jo_u_2r8 gu;}U}d2~Vbngw͆pw|3yMy]xxIV4G/\PEH DKZ)dYy.a^pl1扮YI8\?[?]ȶ6ixiA[m*!j38DdD=>7<]祻_Cx,h$pķxLHw6ȣS.ґ.=pځ5mX*GacT2I㼼xT\0jo▻Tu/YU rWhwfa[ 8i0 ϭv>v&@K&xoT}3;{H2cRϤ=Vg53e6N$S9<={9 v>d$k ,DBb99w@_:²R7wYai%sD$_Fv)5>AtZCc^WTiu@ׯwdRKRDT|O'efR7C'j > ^x逌t)Ĉ3PM0"$C2 €s B@>$nt4LJ!5v_;R9׹A1wbPBL(?hлjN4☆FunO BM+2^\^S,h|vgݙ[QF1d R5نFdPMAw; (m b͖θPAcDA6TܾSI7*'cɒ&@Ib]ҭ[Z"mPGSIEk\ȹCt';Ԁ %'Rw'R5e@yΔ[~Izwe]j^qz%]DCQ$ 4Z}lRP!Աlm#PAQ+PM+NS$t4+ p]4ߺ:sB!ݦJO{-nRh%&ݐ 3N#o\,"sj! Z58~2${H=ߖ.K*a3,5Hr2_8 934>#KM{NL8\9fkfpSݱKD1!_ 4˛a_e+}~ؔ 6&uw: )C d"8*n DԎ4YoCaN6A&r?\~gz,P,Kot(?$N?0,n !}pd-_E>jl/ӀL+%*&0[ߖeMcZ*1dȥjûcIV8D|I֙bO9jZ}w|y=ڢy3ʎ:dTU|1%4Y YQghx4B)rt5# vCI8v֙VȁUw) :kOIfN{8ע n#4U82Z %o зp:2R0n6| r-m㥣 jޱCX@YK9AO$$@$#ֺ'.i^ OڟSv*\x1a{̓Q! h3y|e~զ_x_-пl5- DRij6f>%D eM|NeI (H)7b"mjRk4c |[cNXAz[DCΟ W2[Xhl<.&]쐁 tEj!7!yY<0o ~B5&Qmy}Z}O`vn^ ǯ$7<0YtQ"GJɅݙX}b iFHnj ;3;녻q?! O7=|+:?eӼR앷S k:w!}'lbӝH*fWo]04J]\g$ tRz2ʻ)ɑ:;y`F(+m1 8ʻ9!QЮV3B-x~YA){5 ĥ )En[ay+{z'?a(x,\Oh0$ $c0Oj].? ƿ=cwx z)0Dv,HN/Wɪy8j54^p>c)"Co8sf"]xn j}A0Me t+ oKͮ\zh]2%#"`Ӌ\|*(g[\c#'¦l0j3EC+ۜ&^~ip,V 4Q&=&[Yy[]]Ra}BLC(\''8k ~?&Hgx7=AD<^Z5Cv82QGl%KoSYIqv@X X4&V .^l,giG B0^ѬĺȊF7S#0wiEyc\^_t圄-SS?'1~t+A}cL*ӖK?M$P fhVu(bU)]=qLRuʘ6' f5 RC=cm CX9p{Ŷ83c1V,6εOR,3:R{4e "Zb`KpI | rYAR  ȎYTm^G:!6ÞV3|<\:^) .~dt=~z=s%RyXuwj iE*<Ȇl==g , .(jvrޑ3Z Р_ԚR8u W qzawtmW+xw~v B}hqڕ &R!ȤH+{M@͹~G(^`| 8U Cq ) xW &1['h Vb%h7#"4~Ľ@Z:.aчby5dΠ@#J%X?>v,*]c>I p۾<kٝе.bXR(Y ' Ug8o渘{q$d΋tX;G,cp̵? KKG+Qeo€sx"Gg4 1R-ٗotgT>^:kl\!@Q =W_&`UXmL̷q˪.vxzg7^YYgl\iTRFק3h/Hp h~Lᒪ^yyW(?M" |cT-5OWȝUP[ 尉Ip/FUs=ﲅCYL`](߾PS!ca"͒1<߃.% dIFH]98|oKz=IjH ;7 * %Ec->Ց^d]Bu 1iCIfgcM60YODG}mNrOwHUE_$&s=]S?nf"἗zQ%F\W P; Džo=Nؚ##JgmiYefdQN/.Gܳ-Ti&YCjEooz"5]zj̛á܌#§>cPB {:nJPyIfMVOz!_RVqf;`IN|@B}G|ndVp,ϐN 1-<٢j<*($ޒ =c}%;?!ve%k{<(O$3% iâJ?,i75?{/~&?&9~GKRïi #!ķ//Q95<ªL';И% QQ< O\Sn8g}sۮ-J~b/ N icO5º>B\C){$O8x Ɯ;ȎG 7 ,̾rs =_Jƒ|. & { Lm#/ZiRT @$ cʚSNiMh >I}[_0LVLeL>N\4.izT%l[mؼ gﯹ"V+e6T p"9Ucle,:A޺?!rZ+/xt@rQww [=_vtу|j/.y,f.FlEYl]__fKh aen6|h;g #ske09v m_@2`/ 仵UI6Z/9\TZU}ik _μTx ,%sE9,#4<qaJ+QL;:)Ԟ26N kroc4=/#pR͑j0ɑ$d*Lg|4-[>C_uՠ1ƭ XXTmGQ3G:uEHDeLPc=d#5oK9dD6 cDOןK:+h ROvlUZ[+3`{vr,c+QߙΚ ,)OE[$30nVw.Z".z+ĿU:SDivB)V(/"JaQTSK%"Zuw8uu=ߨi([u$ ا@7- {a^0Q1?OU8qY(DO'BPK]Wch#?vnEП4e":1؇P85 oQ}vWff Ք` b'AVVRINFCj\X$!l=67YxTikzĿBBsGI:4_* ߸SB !$4gX2p`Jru)NZ1,iS{*Ok%iIC2L@̟y(nV,hm"kB[^)GjI}=bW }-?̊~Gc/i1w ):V+R 2Ve³ߠ Fw(!UEn ?2~mO߫}j*IR|?۳yӭ9tCF=>PQ:uTU}ɔU9hY/_ʂG@qyy"E,T {n,/ :,s䙖K=.αEe^[(]a@DͣB[PE?G^6cץmUx1@3&-ervt?o_ ;1U2wqH 8+B> #{r s#-]q ~W0ipW|2G3WKF' ͉^4ZuTlfˁ qee=ۂnX/S´ ag[]?84V{Jޚj +yUW 9 ;x޹zaMܸVO kŹt/v-YO`AH)ڿ|p5H,8*L%$$i[R.#:V.`ZV :/%lk}R{B;(On MY|D͖q$ lH$!_qXJW E 6C9u -=Gr_ -?E' 0.lz=f}[]LEwnv"2z)WMPlνɏmh+KϨP*g,jBȍ_MZO˳;Pel@I@H@=7֞&/Ik,_7Ip9#sю@Wia1Ț]?sؾ Fz1L_>?C?\sFG_TΪ-ฝ!_8U=)$/=a@y|XiaB/\R^)Ȣ~i'GMrLⶶS ?-|+I*/l[`װwceWgĔ+4JۢNSʫW牲Htqq|MC.P0M??#zE&2O tBL[@DEy!v5M`ly5Eƀ*[Q$~.C$:y8M5eјҒHw '|Өⷋ9+Hsqn e&|k6U^ܾsSj|kU pN OI8p/-Ю`]/FM2SU[X#)c}2@b)p }̄ܛ4CW*cS)7u$扤|ShNQ,Zɰ?lkNQy7) W$Ej [=qOpsu(`WUב%L6.n)0cA]Ҧ+g[au0‰:GYm<0Sq%92}HbAG+7\m;H73ێkٍj#F#uIFprVeZ d&^ m87 u_H,o48"dWW?Ñ|o/[ ʞP5i?^z`M 9KZDgV.pӒBH:,vvXn>/qY}nqGb@ʅ/:+"XֿrkR ۜWy{mcsjvw |QRWtKy3's)fx@z,lBU/A[o T %YcOc(ؘ}茉FW2+nd4ٮR'd@[W M5IbvT{ O^}QTH&gYv@޾HHhL0`5RFнp1vğ[^o\_\6b}D[zG'lLo5^2T'kNS"Klhqޘ01S"p߅<(ZUFC?nF!,0 N! SJ:r-%ƣD\hB=)$:Y\35_YQscCT]B4 bq4oYp|3>-l\,4hR$밐Eo1M|;8pedQ.:[0d$ujp9w{pSD¸ w7|wx&5XadBJRk 3T􄶭qJPsaO/S] \+Q v[dAܮP]ۦZnjxZ+C Y2|) JޖT~\:Jᐛh\շ 9K2 ?nOQDKJuX5,|9WZ !p $MHΠFGy9t5)+ U|ŏsd}<͆aA\T i] ~t,$NL}&GyZ13W8W@@m' oCq "80x߻P( Rq|#88g-go]8'A뷤ϣ"D^vx:rSnPLHޯV dѠӫ&|CLM֕%= LUe5j.uVqs*r3]c~kiVǍh|'!F8;SXQTI D\ x +6^ӵ~F{mjOy9-"f=5NT)é~+Ђ,U Jh5j<ǯ- .e_\*`ǢH]OhK||aKPW y0s/U FW4<| Ufi0RD[>y'FEW`(n>"Ӌ)Hﺋ+ t̋!")bMC%$TtznUC,GD`in=/eyU4Jd*ܪ|#\+JXYx"@Bˣ]|#xݽ7# u( ?[ =ƑxMGv~OGJ!"CVԴIe3NWAs= EA(]_s?Q' $E_G3` VYڧuW~AB_앧?gD{l'|=HF=p3l.v?MbI$B9bÍ*J:ԙŽϣ__HhͷG?~kYmMl`j}[ingX|?| 6#?N/ +Qk|O SBm(J'v6ݫbiWEf҉-'w(kNV`e#vf9+c &Zv' %18z=ܽ&I!3SY#ɐhhh~`$m܀SyhT[8>Q\\2gv`o/oOPu5lD D F؟(i5Bf"5("A롈hCWMFZ܁"9EB~ۋϺW:{7/Zg}LzY_{XķjYM'_&Cm+&}pnXGpEA*90 lQYz!`٢%2kX$@lvΛEYP3 t I08\{1TL1; Sܿ& \?H c_9\53Tv}s“{eDT)E.g;k]qYŚ;d?ҷUNC~'D$r &Vۆ I4E;'B: ʋmH|E.T9$=r%+Ϳ;aycB \gQ񟡘e=cpZenGBaE[V V}OQQ;nyarX6r @1G;="hVqiM P/c)J^@X\6%s1=$^i!-<_?fcb4-ɿHozü.}}H`;eց\Kꖋ;.UIƺֺIgWq>|xΪܤXY+:xYe å~@4з|^%nADrԩ|a'0kkm`8z 0@F"?4Vy?`u 릐54}@7k4X"\cjǦU=-K"q!AIU1{idSeC j>YL$%`L> U)X-@\@SN JÈk|[gl 7lSjvR\U5E \~$z23m{rfX3m吕FY?dVgK/~t;6TgꬸʼXK~oVg# 6rZAnpJD΁ ԐM[Lfs9 2@<)ւM,UkH.e2IgX i)a+`IS |[^*zu&F*/D9-\ZE~t%A^j Tlr6_),U) cTXi g ;\h 1(OOo%b,jt k|1\Z6X<7m;|t H#ۀJ N}cTAM凎+ZVypg$[掁LY <hМPJ'u E>Q꟟*:[4RLP;J$5FeƖ8*6eDCrHMI{ %K ʾ/K_D`le}5_*}8GӨZsp .\/,Y[F pYZy\'Urpx.@6ҋ%^.i"$'Y3kCȐ{5;aE>iSmKjͿ9G\-?o~̍u`-+jxPn ۔~0`$# @)8dۿ*\D!5Jۃse4[Xszq T.ZKcAAg^A^:Z~ PÒ n3Jr<2.N+{ }]E.R*9b/W]1l,}!#ae>aki/S\OhT_u[Pi]9E(,`YS!_4HC["C V#lwCt:pBd G9~W7Ð Kg6(]HQ J313i Īq*z' 6] `Vxt|[J+qлvӺtgZ.?7B. &&~W䰼܉(r­mHUnSH ]ՖT Z~N~%)ENұw9="CN\ٵ/i'`6m#e! MZ Z)1{&}u; Pj&-T\Yb"ӘR8f-9tzlv=[)~b#U dӦ4.:D3zT xi}`;|,6`QB+\)* "X`G^Ԃ^UG7QTH|4ق!1f@(9opVMNjtr=} C)б@rA_AXH,eamK.a|^tѺpKkNi+QO/|2n^3?V] #Kp\x;+Bۙ84ٍ&(_/XQ| )Wz*G[ټ +PBoha#_h}nRԅ cم S u}`mFHxsk@||+(B@ k-JK %j8%^M$.I[N`}VoL$ʜ 8Mn)?/Ĵ{G]+Y ݶ ئb#UoɲuEȶvlWbɕ@E κ}B02zzsFMF BŮ'̱qʩs8R>W"fܗ ۰G.u$2644\3GAWxz#&x3D/j+ 5>{̄n=T0 mTKwuoDGɾBlIC+7~yx"J7$/v'Ò3dZ$쮗#dk9e e s'^a+yK2ĸ\7o:G&mb?E濅*Ш@rBev|OKfko|i`HOm7IrnuB$| p3*[_jh.R.в%8tP{gVKpw%btL jdP :mgT ӿm xU9QT(?n?δē`cE6ɉ$\mPkߵwb43hqЎTsZ0._m.)D[%=w1!(s=gR[w ݗߺ8l{I4f;_)Xxc"O0,k=YYg$T^g'<׬w8YѶV1᥈uԍifO!Rt]G`44(GrZ`Z[*߯Jp:)MN!abLcoNCt0\|E #ЙN2khֆOb IOb[\b0\rk\AuN?n$uz|t?V~4TA1\, mәl@Nr 6Ҡ3; foߒy R2JPߪ'$pn 9N@&,(RPƤoz.>_nPĦq7(|IqeȔEl'-^|]MKj6 }MR?Ιπ#D8S3!CgB $06G@6˨QMy X( >M=nb=ik1s^{O=U+p =>,f t\_D |SfdmqrG:m~ߦC4h" \g~ŽP +"HupuT PQ-'kYxRaKA:cXX]_1zN:txTa&M}m&A(K3GԿꥧd-5@r!J-ePm"!^|XX`M>v]|Ґ I-lZ^dѐ(#G8 u8-:ZNf$̨QbLR\ޣ)c_u2=DlBWʋ8HN-9*SL؃ZN$P}6U^Z[D_: zpHn~a4J)4Pj[`O!<踽, ΥLE7ls"x·P!ܯ02v;#i:(OpA<>qdPfcmU4 !T*HDU2 Rӆ19`}B} D&R3 QF6h_=RiD4!I^qV{T|$)4%]B̐8:pK:sce*K%D#\?{GF-7ɀ:y6EJ6]ۊUs*nba:~㕇pg~:e.Gfr\g{7 4 ts3WSVG̫Dm3²jk6efڹ8f%Ol|. .y!r|@{ %º 8٢Ǟҫx(o+;>h.,mdCtNvGae}Z2k ѹ3/!zLp}D]ȇjYn>S9`vFn|Ӣr$tAsedF>SDSa1Rxtt8ш(8ڰ#n& ̪σeB^_,>DSHq܇ !9edJi'=0 o%(r^ٽf1]')~΋7b.72kyn4R`yY1nI <]Y5ة;tCP-D䧰ژOvm17?[!G,k&6o^NxbA6i{Ƹq~>ssåT h{8Ɠ!(D7 iV`iKL =Jy73S}N0_Kz-u1cϵ˅kx;BQF:`y^C(w {5]| I%K[~:u瑣d$F{A ypwH =F;=E?~ 򭉽M?AIߣǿڦ_#-Bg'X~9jh|] J.K'Bj=iv׮! -GP;N'C>|Rt6Su򴹀 ,=ȥ+JF%P*r'zÁP'<~`#XH/Gpކ%C$kn9hsf,w,=$ZnF=麙 @mL,sDcaa³~$>IA"{x_}C䶥,<*VdL У,ӵe.Hwv=^thp=}gZ'$l:02O,XQQO'u蠭w1HEumZ|DJh{ A\$~D3PI' dXOZid#厉2~ &BVmh㓂:sW͚ q.k|e҃[ )€V0Nwe$ݳcm5T]ݰr£:8tD ,&'pl2Y-g+ ]H[/3&`ԈR8'&8V=gkc&|2J?F,6ӬeK⍺!O Z7E~ b1ȡB_a73Vk")UaXL^\ṆL87D.7т(slL\LPМ %8û}xBo4x$za8å1”|OUDX&!zmO,r ۍu3BjXY<ɼ2uaKzTX:qkp/Fr](j ϗ\ChtJtM>_9y]2>e Wg@!P цa0`Ua $Ay]1 8 60=1U0ºI鱕$qlY֫K md@2m:jZZ`KL?yVvC*e7i~K'>n$| SvݚzzA 7iCqgaULQysC7z߸[PeT3Y^1(jXָ۬l\ϐ":t`ܲnKњ$cuT0B?ZĿ3j-eVM@e|܅M>o;8˙s$o*@*X*XBΫ7&תegPѴ~|XLr81ĉвỶG,ЁF8o13,3l3=G|*@ֈUN*R !j*2y?̀CH xsckm%GvG?虌3s *#P3B(;v1m"o7",M]hM# 0P|CSV>T6SXUX aqk> e48ֳI}TK2v 3H5-CWz9ٺJ)O$;[,d{xU$eJP[a U7 n=Ceb~~ZE[։1 Y!.w<\h"Km +c0,Z >ƩeƯJHM뵈h=GCe4x7uYtB=;)9P6({p=[) >8!c i=X+3q< fv,{+7غ~?#fOZɣO5sMgh3~bzfR( $ͤ =O>D,OJ{QVX_8 m(` !cn_6BؾL&4&%ưUPikO>gRc ۪94B%?> Y;_,}g8m0Lȷ1HT.ڌswqBS  (C_%`&ٙ*dBlc9#Vo1I8߭>`u1t$ymDZժK΍_؂ LgWo>M7 h~FE"y,SYÌ[鬝kAg}=e JRTBLܽ}Jjyr~h7cѶ4$ڽTVnJN^?NbN">7;YnR"6dݻ- s;Z-ͬ:q=_\8ZF9q_&zV6cɶYS%3e"$[I[q# 4YydfzlNB8'k_s5].Ir]Dv@D74t/f{: Z<Ȯ&h*؈%qѰZFfی3^9כAfOY۶aQo&,?r݈4SQ7DiV֙2L&vaJ-i 2(0P¡JDid5#ދ;Ž$4~pk(C֏)X|^6ӪʎPGfF]=hӭ\mY;D7v>ѥ3•xA=a⸠ ?_u> i(R(%7dA93m&&iܕ:'n- ɗLL71<>U 8sQoi}kjGB0{5G+ne(qP&K&㯖Zs3/]zx(WzkD昕>e IpoHdEMh >p4Yiaysd*L8}3Ӭ)@GLȳAJ<9VBJhVOpt uB(_[->tzIF\B}4&79XA”"Ast:5(k 3Jnr ԨmK+=&f pb9A ^ȥsPvwΌf6"]BEWH@jATMHaRt]`bq"p 2A'ʵVW܀@*tStQrzxw֌&[ܻӶ[e-=wWՒۯy o` kͶ\u#AԽn׵"ni* n'ic/~֪ S1)&Hֽa Wе4/웣OHwoj-|ZQ|A6h<79M](dXR KJ=8ͺy{̾.*A_c*uFjT{GomHN[-n$\D@RhOxG c/MaxmGHZ{%QKziN "yI|^I@܀IV`Tq: \et60_ ;kgڇbB54B:⓪(yYtet dwm]*VW6J~Q.IJu3hz5j&+3jaZ0x"_5b%/4dIeFSPFU(:.z8tv-s'$ ~LNi7JO71ojqhtc~Gu;`OTaU?I +cV '`5?ڬ) )lZ8 -yaqU[Ȥs"%Gz7YuE*w~Sd!xŦNx4}<$m9D} 2Q Ҩo%-ӰK/n.M ЅG_ħ_Iλ"v9v'\ց+àMSm*TI yʲAtQN CԛfTɎɷ5qY%v f!t6rloC~`fIj8դv|0Vƨ?Hg10riŢ%wк5NO C Nu7um}k7 Rup6XK 싆GKsYh6JъŃA3=a55X{h]闠s *_)v4% koY0ͼ +*IS(ؗܠAcd?1 BxI ̷4zDGv-ε|CYHg W@-_"Bzi>~avj+RѢYY ٵ4X.:8Y7O2v#3>|H)}ldxAG4'竆q|!> "O2C`z Bul)cCǸ\ 3`U4z?- tO# yDGӡV7gH+L #AũZLKWg`19@dBozX`xsP [8Y;CLRrV]Gdp rXNd'%zx#X`Kh=U$܀A("x b~v#ڪ_ݲJ:;Gq~(o$~qE)ӛ܉җԔG^FyK3XҎvP6@ip~G;˲*AAq3~](Vg)+9;KE]_Yplge|諺c=\& oop/JOnIQ-dB"CŚE+_Ոp>=7fĎLp~mÃp\[5 T'V G>seZ6 AM`0Z"Z!Ix >^]ɫnQ[@(i&d 6wߴZPh|^L/vB l*$Px ?N{m~4rEn- qi)qtmJ3v^G&#-^p&vLa<zy2%_3w-!J1}A gF$=J8OXպV6Z{*pC1`7",9pE[kU XM Ctt؊@EiRLƅ1ӤOޏk;DS{i\`z]/y: y@?qNJ-7Ys@끻̟σ:)qp/L`,'4pQ>~(Vč.vB ,lhaØom#T~$65ia/q $.LJ);,`HjAJTD4p']2QXA.RZdwBߐѕ 'A4Gy+9’.( kfR g"jΩ )r-]B_iU?`):ߡˆbkۮK =zᅖ4O_ޯVh{ZB+oU6#¦Y :E6{gOew͸uݮ,K8!++./u?])4? Ι>@q),㺂;K,Q&ExЍez aSdrqĀʨ/ bҞ_-& Bv9G%tmJUFYD_Z7׌{7캐G^ K0(:}F!Rp +ϗNi(wF׳5嵸 g\Hb ?޻0BL3GLA>XiI9N:wX1@7y\l3kxxdـ܌ 9BGddt|:i(#‘T빢B JWJrѺ{ 1Ր)u]:z5scun lߜ"/I| BeK[*5d@}j*}2wW]hj7b5M JUJzb{!ݍmqWe Oi!NkK"i rԲuɐ${cH3'|_Akۼ':@ gT9LNhX-EEtf8T$89AA~g߾}BkPElIK[S?+{ȇƻ Jv4v"R9&|N}k'8) 54FBYRI 簾̷OPM{|Z߯Pd +S Jt>(#G\*ug}I0x^6"2_#K$ qFXSpOtċCNZK@j@16^6]>'C}p†|QkxH X dO[*|i B9Lbd4mRUoD}6[FjC8F\ qJN:zaDr^3 CaBYX/2)m W73Y36 5HK^ī=ױdt&м4dZr7Vtw(*4Zk xtyJ$h<`)5pԉ5EI~ԞH*RvH"=D.%;Ft?T?(0@HMAPƟ xe`u e݃S U%~4{ku[a34u5> |C> 8.Qe.GFr_?v\Gt< Ds}1NEřJjE䧷`1$~w4.̀ɕѱ ҾԚs׮et|tN?U*:/8!2-G&:p(g793R?vԸYzRloLN7h,Y~~ .MЌU@#와s͆dAtBtVW;Ʃ;=czS7(vTNMEK%3/e (p꾙oVNYLUJG{!a+=BgGw/+ ^zb5jj?:ɁRKغ׻Fɦ]!а6ٱ>[ѱƠk/N ;-#"J YkH&cʆ8Ty &Dh׼!#HVlr赉 34ɳQ!Jmہ3+(Lj~FK~3,)ǻ8Lp[0/zOR#?(wraxWz20Sm )YQ]w[Ǝ]`OS13QqUwpKIs\u;JTX{L}z @Ɵ"CZPjo= 9"iLu$x$"X8cpGk9Ei!7ӀB${zM$шrd3r{0{,_:yK]:RPD3ShY@I~MHdxeM|q| <7v'qɬR2sN\pޟ"z4|j^Y$ٰѣ>%QW*[ۛdR}@@iOvle{4?X Ztt+zz_@G^`9v 'sA6i]3$A5vu]JaCu?{vRmˆrq,B6Q\OSgPWKP[Dt`jC 8?zi2sfJf+`"=•v靟Z Ũ6(YKqVpi]o}g7Rg"6 (5F6~ '6f[Cq>l2|52hHևBefÓN&L"_f=8-OJZϫ$ ڶB ;k?xfu?}3+>WfiذgY4[BF&14hxLooIík/(^|Q$x`~^ x0v2W)1N w+gK٣U :9FEmmـyrZ,otFxa[d#>nDAi`%d7WiRֵBTd]J/6 NSWÉN#<t+׼ Ff͙0Jߓ~j,Rbm][`0Ϥ^ bsb3Pb$xC .%Л1qU~NT޵ײZ0vFvkTA[:]O ~*t/z %^;>-<!zTC"1k|xzV/E%:&AzvCp8wrϖyę /RQ #y:56&pI \e6?RxА\Y#p-,n}?_j2nnhyM$U?v]58 kB? fb͕gddRṜjfcFި0YD7kVICNJQpҩ-X74Z$p)\rěkʙ'N$E]5anS/~EI[?ͪ_aZ ƒb]*ؠmv)>oqw D>xȦMmhkӦMt]̽f4͘[h\9Iy_^Ǡ{zM*d%6 :UTϾoX?%(d?ɯk/ij^2 IɱCYشh *B4 PoQ,,^J$ݻ)75لB.KFK~ ~(; ?Q_+ijGyhV[sp!FP )Qנ$>͵W^Yt.C6qՐV ah 0Ns`cDWd} ("Rv@]Kt1dY]qn .0< oFb* \Y FZtZYEAvmvΝ LJ[ p`(p.Q+->/Kg!8x-*2󵄼bb];u; (F!<¼(7Li4Hʯ!i J3ډ5?e A=ű:B2xu^DtiYނt2%aFn>܊ϳ%D|ehh)t)d%ȿ#Ƅr&q$`k.#QD ;A#%km~`׶б*aK5$ `LpԼ_N^grB5rk%D Q+p&т(:@(_>zʈ%"ԨmB7}+6۫ W$a w+ g)EY Pm'k0w:P<!Fz0ݠFK~gh1pUNk%Zcw`ߦנ"'/` & ;A `[ f}`5BY^ȝwqhϟdD_l`Qgi痜o rWUC" @IT|&d@Ce%$qNAՃPttyӞnj9Kk@80=1,Dzy-ʡ!q3։\ewuC$Ƀ(> TF"Opلp] V\?@\>?VH{XO/J~uy sxΤv4ͥai3芬5D7V\pQ9 [[3q5ʂ.<_ rc6Tlo5XX 7Y[_QghiA(l\ITHFQO\VY).w;3&ow% r{Rս+HSNʽ3 \N9& I1C5'+U,пc Y :Sy@s9ʴI|\I|PoCy!idO36E9.Rjo;^"/ '7yxm=wن6- O on eޠ]GVlOO gkgiڴИ7yym[, 37V ɑ_,>9uNI4f"!x);l-vr#Q꣑]SFu<ԁ7Qv8ł4 R̆7I%{jƭU[ǽuY=uStO\kͭHćr3hHy4I$ic7Aަ-\)*/a cA <="|gVB(ƞE-U ] ݹqMU\ޏZo(݅Q>$D GxQ6>y4y3)o[z,W^+-AU~00'g2,_܇(y+[swͤ "^t{)sַNRe5K]7 TtPo;*^)e ` Q /8.>{HK#D\MA"MuUcFVgOQTjH3P@ m;2fՋLzOaY(9w܄{2r.K|~pKGBKQHެlC/.wCSűG@RFf}Q?Y eebgR'Uw7UG4q p&:|ͬN_IȠnF^3^:C 2&(..!G8PiʹlUUL:Ո蓰81K7,않?ۙʷo6^g3F6E e8JY^0) "HṵZ߅: fw!JZoShmOwdrn-zr?F r{z7 =gNZt԰_,"#5 |ދt 22@"t<҅65pEOi S+[:Ւvul/gkX>Mle0jMgppѥ]1w#hP(ͯTx:4gDT, t TLuDoP"c}B/O]^Ҍ W؃D~dr 'Fݹ:lݏk d'3TwwV!n(ؚgƉGX] qf1t4%'2Epg~ߣx!1(oL7D74 Np| 5*ÃPE Kyt+JyN>^ch=ۈּ&2FSnTezsɠB9sctqM0_;'mБ5\Rxwm[3?Q ܬS-_4%7逆 VxA &od^T[OY+=~将0Av[Â% bP.BYTJL2=8@k+J(Ҍ,a >JQ-v~E -hl nUMy, \Q6s[QVa/{"!^tkdܣa&f~o)*r0Io _<@agK;TGdG&DțQŒFr;{Ś]xL/_RQ ]ƛPc;q5? w,GNMh/VG?kY,tRWU>Mr[K݉`Z]3$4j \Krg!Į\MPN[@a/T>{yghip4+ʴCPmR _3QglFAU]% uK"XMtɥi˲ܒScG#<5* KDQ`&&CG9:86@.IO\jDwX ]01t&ϸuj@`ȴi .+Qؓ@љ#Pj'Fnܽlϗ>zd3E[#p4@%yΨ6nXh,lڈƨ`F}fbZ[ /,f G ?$t fṫwۇKs?Za{4)BUp2da q @ 4\;^I-{ bCyoUbHFbkS$#"2iRuJX=y _H0N4 tEݣ$ՃJ^9`$I ]l/$ȢC !ϬlI֐`:+ M; t_X b 7/OWYWwĀdnw}nSh~iWGұ|ɮKq}}j $&^As˻6s CCuy9, 0T5)iz7[X2n=֢&1K4 k.B_P;:._J"4-z|vG*:̩x4ZcLV~nAS{-DA(UYV{e9 G2Y2[v1|X80Obd4H>Sse:Q?+ZSD. lVYl3u@xLq}$9K-ӂDx&C? "WEo {v*QymNQ==ҌP D韼.DTXxs^SRE>ң362%ED:g %h?M(]e+|il#nLl崿0;t^zVq@ &vt2k[<d<k׆󖆺Z $ZRTЄfC5l+}_gHllBݺ/-1C:h G✚-]5ހw;E؈N6S침{\pz:׏Ւ yIU&c2+1_ ra&S{89/:jg$S\5e\h' C26hOOo u zi͗alï 4/;I;@[FDtq fOk 1?,T֋Bwގ[g Q<8b!- hscI{x4eȋ%OʎJDs6vo?R[§&ٽm4^^[00 Ѭj=Dr E+vT]5xv<-_1?_{}]H^Y1EUJyE'#P]$"g߲9*dUt݆̍RMر fiJj؊=.c ovm|-43̌$!m^R"hMBb|w$byE Es89ٝeKV(t}{$=a_>h͟w uVw2Q<+sa-`vs=Rp.> ΎZ$Izm%4P%Ȟ%3ЗFP䨖A4%Tg6Α(W{i$ܓZ vgSv$ g346+bAwrR?Xǁri Vq4Z|~@E7VCį0?u ~hFcTo\:&HTwG QK|$;{Ťޗ3p4?V w'Ϯp "E q4{9-vm[:n'*A=Ž;<{#Q[^wI4!lU>V){] ͊ܒ!h7)xб3Xc24+# ;>{bNPhG;MM};3'x W.̄Aci4BzG\ 9y1'1;ȈقdgP51OM$NI,5hMs6B`{ʶWQKa;9@lFabB=2> ꖕʭڪv|̮-b. Q#s'c?S$-kV˵ GE+=r^Jllx1}c [E߀|WI&2﵏r86v R`xluؔ|X yFLua̘*O@_c(s:ԥ~T7<^ Ut4=YIQ4D1TΥ}PwWVT2Н"΀D@0p), P~5%lfj߆ +/̕IAâESG2bvM!=S; 5eaˏe-@t3 <-43 IJ ۡ4tR}'yOM\s,U(D܋;fhL޽݋OpYYZaSהs0mCYM7E7j$K!#Ok*"iV=;e'[32כl+CkhuEᎅeRg#>M`.zmصJ"b}?_0X{(.&ۿ;6GZ&$>ݷ_Qt԰wBU}g mv( ɶlz"9&xhcp?np$ď7*,)]?"4J}tdߦ̼7I ^G?;Q ~+ qEvb5b$"3uK~8xJ](_\(|OL4J$FXȢ~u)8kjް`# 'vD2د^)(~Y81$eevc2y>4%J ęiyNjC0ج6zX㡻km({D5O(Q(u ~BHDVZ @6,b8%&RH^K?7Ⓞ|er{᷸7^Em)? s'П,a*} @ ]H >Ҥ<92"mqils=6u~_ 4yh*Y钀 T"XO&9:\ӳ3DxܼRi&;{q5K{&|j2hqџhwy!Sa5=CG?F(=䷽ɒpqODd.5@G(z-C3?Ig{\cpsRĖhc{h<0}W s!}Mp\?, 5L`{؋?F&PL $ho"rKl}iΊ+(E0~=i©W;76/*ml\#?q%|bA$0=OS8/}9N.ӑsARs5%H]VKof{n޹^뚔?m^T:nZqt*` iq.Jh7̼vu/rvHuyeq/+SoX\^w⓷b$Z7]}*҈Z}y/Lsk)7aG`bch(ǔT_呓o.zdƼx48u_;B6X]D\/Y%tiP8t]i(q6;jZQ:j%[4WɕX&s4kҲ p\;q.zWi"2쑢J0./K(=a:ljx:2rB Qk#HCW=`hAlex{elfr 6.1]%f qg7xٰvTL&U݉\k.u\hXZt\P̓}EYKx6'kHw[)?BZjmYl|nC[F0ORA֝J i P#uSlb̾r4uC{>w[],frr.px?HAWzc O+ <u ^bvHAT/8 b3P-2~EH>1,2GBkMEv11~5܄crcIY5Gyhv,2ױAl=! U6|딿1U"s ( PSsۣ{: P=`Rt ]=2r٧wN1 "WOd{pTy/-ˇhJM TBPmtQ OWEGfGRiܐO.` ` -}=S̄KJFAL}w^Չ-NJЗz5Vz`. %evګ1 @azF@XGC2a9'E=׿aM']D3KSG̕"qRXh5cpzspCaR.4}C~mrUS L;΃HT9'Ζ3bU4sG?)?h]~fy&PTp>:iuxVsk5} J u2d4t­RҰC3,t*V`SH'E,K.eTwZNT ζETEvFVVD\'akf#L#Q7Շ~tkZ[},?0$W->Sh]rEcb[q^< wcyY c,逝\ h7yu]^A^4ր!@*u? d†%A+vŞ=xՎ&Q%[0hF3UF+WᔛCKJr^.M^d}N6&ʇ,D#rM]]V/,RƑ{? *G/R?:'"`Q'߉ yg.hs .cR8 }ĺ}IqnJ!Hx6JE%e8k'4ZH/7hrgFAa1.#2PsdE 5Ӈ`=B3!gTٴ\\iZSm\O\Huw]k4w ^ cBP< &Lڥ㽛)D)PԍQמ-2JsVmHbL@ D$Q_CʎK(# 7,MU[5wKE۹U$-&x퐎{4k+ \eq-P*N:2;Tb4DK:f[Κzޞit;xKn%; nMMqiɴLDG)y:b}-#ߌIM丶8T (id aq1J <I= !qn} |Vʬ{R-v'Q6BG# 1reh[eL:5YdTR-eH" Z曦1aXo|CI'Y >ya՞ّdW1bEA+aQ0nHo=zT4(_%סoueydo#5U:+{/t qG'֫EOeݏΘI7[P@P⯦欯<fDkcq}̈́2swwqb1@/alN i7G"6; OHO%tÎ?-Ė ѽf3 HB)5+ܵJcP ʼn=5ywkRKoFQ(g`Wi'KBvU.6Zɹ-KEtK 2@=Q&>٬GAO^NٲHgn\^*cIcNbMd\ZdzH4l=>{XtYK4Gń̵21sp۹(sv|F!D'\ڢj':Nre,6f\RM6^K0:%UDX{^֠6NS3{0Xbg;0I{?^*ҿ v+ʨ[T}K޲wM2p*d~C_Zd##er8 V  U gSR! 0| @lr'%,P1w/ ?!xxkx2KV0TlC']K&E\EmjtD7~ ~eO*yCd$ IgFm+zOcDJ>a(F1#fmڒ2~5%ʭ6J?P;qD({uZ% Z9xQ<e邏4p4 2OA ӏ-͟H=\vUE$4E9AXx 5q;.\Sʼn^gFxmxI\Ɇ3~Ig_ r>ٱ~|t$O'Wl)>e}b+u<k7(α}0Tm,g ̌p+n%OxD=cTI-fc 8eĵgzK5"S_(VA%y~ 7k2.=3`fgqG"NZ@~qpyTssOa4-1hI^YVX3b;U Z}J?UӼ@eʛ`1mS$!yYd@L'"o'h9YiɉzP]0j)jƄmLlja5lV,b;;T(n'JK_ иQ:4zjQ_o5%k9$Ƙ 88WOOD@A 2rLI`?xՏ&鰋Ts0}-h4ة, L44jIv A"hD2r񵏘jGh%dMJW]'O!R>hocFuYx@S-)3&Kbˑn 9~E u5 qmyq ,e"O,yjvx.[-6W\wJ!A,Gms`X+\YsK UOn/DE7/AFDZo8G4kWZG tJLn[_z/sdTӅ[`ޯ6'G|oy~ <VQ_1=Ud^cU7V7riv\80x53 .D;ñCI)xTlyG("@JO31 i_&_#~"P;b8&›ś_5l9BTB U4 N]}E Hވ6#sgg.] C|hR/3BgY5.[}m?G/`̨?J1/H&~>c8Ri|LJXDzi%O6P0o0#!06{44מȣ3Eey%)_Ș.̊hʵ"u(<{!\+0CiRط0JstS0Y@ɟ>z‹U$~uW{@r/9 vS|cZA%tAzPmC=)7gק8@,;sc5By)rP./驙oZ[A-ʗ:2eUM]k&ܿߡtk8%#(Z,%$ z0jl.-Dӧ!a?m%(]|ae0&՝ Q/+E⨐aY[.\/?>& Xܥ]mMqT&tr`!)E pѼJI3y5' t]7DJ eh$U\0O8(2"{J3":t]µ oǽs9.ecr6}Y @}܏2y+MūWq/8pMZPkh{a1y&tMoN^J-۝[b3'[fcBlH(y;=9Idk'R6"dqt,ߢ]MV>@wM0^F`FղL((Sypӭ˒5y1p{uxO'7+ֺ! c ~EOab]3LQ`Bh xdce 7#,C!AF&U ́ ="+7zս }D6 ?bCfV䝬oJ˙-E4ulYORvTN~g/ǿ-;g,WMܶ|J̀ؼKF)$N\&^ C1s T2,U'\鬘;?^-|$L\|ݿz%a=x9ڮZ7("/t^ aK;"7n.E%gi@@:)[Ѕ .3u?C)tOsJy>Vq/Ǔۅ9[$qQIf<>@2>[ e,݊ih'|I$+cIEtit6E3;ݴ6qIk#Z<: J`d*(a+Z mf'h߮g[֗kx`1×7`< c$(c.=AfX.~q۳A8zi5뵝kRv%ޯ s4_ ;<$!wu&ʼfDfK>PVoN"ᑧ6{ ,"W&Ƨ&RTac\}taj)HyW,Z{EOpk.]3?5k]Al!Bd+y׬ND42мy㙘XLI90ƈŒC薤;v?v[_"<86<\fjq; PC}BUҵN5m]Pu|݂h Ptxq_ENUK FTk. Ki TO-Ez@$cxЫ/6p@VbcRMgeaFb1V&C͡_>/y1c؄=K2=R"o!3'CxHe f(u0C4aysSxU ) $<: FDQ+B$sh ,G5 ʿ`}tWc^N0 *k)}#mnKJNE vS5 /^b7it(>HM$W[s#8#!8z2թLkڸ@K,E M\n./eI aN|]%ʧ/Y2(jߨ>*=;u~ymAuz[#ǟl@xc-l.,[kC nkp5R=\>^bH4秉3'K2A:6Q?}Sτ1r>kfd'}#]>Ɗ~ϏenxfZoXOsmrTSV={A7*spqAiьG4n$uRNv č*h]^t*OTR6@9L>a6jf;% ) McnPCWzQi$ܼA ס<5i$0>; ]/G#+VRPkIYHpUqv9ךnOVQ%ˍMsUUKmLqҬ+ U_z,lkIaM>9DH+_qM :+; iBۃb_eʲGTu:iNVp[Mn(Bm8aIEH ֑^}IlGěrDZtRG)9hF2u: x'2jUXL}mMrd.ٰ[d܀q$.M,0(С=M}(CȵS |bDK6AD{u&pXgi}!q[IFbO9͸pZά~ަ?a'![ajPfqp%wŠrU,5S{/T |BCɌ^(M;CkseD dr^(FsV3֐(NpôlELPE/*!p"F<ɈY#ߧ:wnDQ-Uv ws c!_)"[Zw:pWV_ ;tOTq5W_%+;n6Y虼:D' FP>B_?G)J&d}܌~0$N됃cpVq+CppGe6G,f8z7S[S50cq/_9j%tQSLbkxe3SXGTJ@H+Wup`I] >W*$FZlEfg s*|z7>!I©; ao e5MB+ MFB6|fb }̭^A}Vn؆.j*-;&)AZ7*851{o:g7.L7.EcЋ}tI*I OWŏ'as\l\L6F)pm,PEW0dq]&dV6.c~LC(Mb#EnѻPV!ȑѵ jFJ$cu?4[&:1&O(yD~EžSF=RdYfGͧ;\uJ,J?N"{% vN1DLݶw7:+$)Dx U"q 4S+a:K Q*y5!< |ƒ6\U+ᬮ[eVv{L+])xec溰o?,ěX:O9T:1G4q.tтEHԟ׋ nPU7/cXnc]XPayGx.w}Ǟ\rf`@zJna'sNAGPL6IQk + KTD.yտ}Ĝi1J$d= vt5!(:+Ovl<ih^ j,QY?a塺7bּG PMoTowdy㷜6s\ԅR;Xڻ\s~=TDCCij`Ԭ\_$9jۢ_]L8hBJnXjY86؋YZttnUPGzA+TM1ex4A\ڇ2;WR}!0ehyXbKlw l_%L;88jQg- XAJd~Pl+470hذQ@s<ڶ}ZP񠵘c?ׇXN{Ҿo;@[v)3uEz>B?t_ 9GH|ֲjOHg,[$BC栰JOP_GUV'u/{#Kq~|H8pz28H8*Mw޺ Ep !}1{_Zl;u+,fo-A[HMt*9^щa`B>/C0iN˭ʠCH/9fV.6!v@ !wy;m$iH+]YA|D!j{EZQ5'vguxy#^Q 1AP'4RU]x'>t3Yy.4O߀hap(AX|α[Pkv}W(t?B'qMEQ.EgV _ h:DBO^kU| u xTtWw!BQENZ9PvsA$vɮ?-~:L340= PCV9I{=BK yѲTp~p vD52IaEf9-vImĻR vDo8t7}U@pܸEHՎ[ﴒx#7 > &2V6nNۅ6[TotV![ ]w?r$T]n9?OQOUY34Wox2J@_OeKն~~Y*}+rlz :έ>2yGm ),R~ 9e( t3WZID$hDpYG*qn7TQATFZ+u\7`p$SdSKBKe$<fpag#au.6 ?cQ!;di !SIAi7]K1|bie9:2)\)146?gZgr' 6'BT̰?_D[2-8?%_/1%2;`Q I #ǀFB P UwYd>-e@u^TN &\l6\PPfzg>B!/P>8#PV׫KD#_BQZlJh mO'5ↇ{1W( =&ZNt#2Da=B(xing:ā5ջͯ=a:+j9Q=\]VHYe+3L^_]cvR ґl{!}5e8rN&:|r>Uap/S$ o>rP$UoicYe}i124O.>9%I9ZXϏY}WZ (9|Z*zKiho۲HH6-/>N=`0-hx-#BWNڑޱ/ĉz~I{n]4uSظ~xѡ5:I ⚏RS CKXi!cz2v#+X̏ᰧl+b*#@8(E$I88= _|( 6,vzT2yab3ޯ8 6]H]_P赼=a7$[b呝VD f&ǜ+xb :h /X慸%p Wi 6|4JYƶY*1@mݧ(mN#(?ւ9Cm͑FȟB~£]Nm_RCO\?FIMYY>Klr3Ni٠;ř@7TN qL 0?)L 1n0VҬykKHf{UˌNf`w \>vF3@J}Ǩ?GϏ$g#_}}Qm\ävK37 \ΰ< _Gy,g/tBu6Tkq;5՞?gEpZ^vf( '3JkɖbX#G 8?l8K?Ǧ=w4rTͦB֬$,ɮXy|)3%g[׳h N kGd6:O@Ƈy//+*뤕E)_OT?WKY/@@ews"m׉Ǹʲ:$Vr ;{TS($O wnwFY[SrKun]g'L\ND65SiJ+[f4:, '{h|Ng YgVB+FRTxlHq Gr)?UA.FRiSmӘ'%`]4k@DWt7H+F qʊ{~,M$|F>Ǚwœ DZn#0o0  3~ 8,~IgۈB:̓E$gb/r )%7J-m c/F[C҂tjdü!mq,_Ѣc2?jjEj2Hpo9|}gW1jQ>}Yd:_@ F)ĠbPJX0_ endstream endobj 27 0 obj 100460 endobj 28 0 obj <> endobj 29 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 30 0 obj <> endobj 31 0 obj <> stream xst%o5vvl۶N:ܱmwm۶mn;jz\k=k͚U{S(1%\XyƮΪ< @sW#_BQh-x;\ h7rn q5X,llVffw9Q;x:Y[u Pբ` @linQ7-΅ 4x:X8LM4Z$-m,b4^o, Op)HtN @md2bt6c0I!ag*foO7pp$[:Mhomgnfvl0uu`ҰttʈW_0s t=L,i@$?ki{v6r\\'+8 hni?@\+8Yz13U;60pE#[ _QoN+3uTd2vf篐5?M4o.&K9ӽlO-*_%]mlCUTWV#;_e1r#kdkie_Z|s]NPؙ ,[:KZzM-]L,ӖEhؙl,Ζ|h13Iu Kk;ߧ;a373鿀hW'?7f=&pVMq (쵒o[G"Nb#ί^N8MY p(l3ՊL; OT˂bѕ $V~%.I *C+zn,o8JUUhS$fa>UP;Λ ?O $pltjUguf@,5Vq=E$ >7r@sQlL|//807F Lm 'ynNݣ wmbAy~3N0yU%,)DlY"5SRB.q3cP݇¼j; % ^Rʙ:%F(pHĬkI,Pk:sE\ZQ>?F31j pP5n.+1' ]t-dqy|W*` vE'2nc9)|Ay88AA?&8 {^! $IkxB[\:кS3EQ9402Ȕ  ߒc 0?TdgQP즅ƈ d{Δ*ڝ+Σpe:[KDùπ1녵A_<0 ROWM:ߪ!ѯФy ϪY*{ tѻϚgJ#S6@h.l 4|_@`1}d垆TШ#Qi12 0`hTQz&vh"4$0 Eq$6Q A-Ѽ"eڥJ/PsKz:7= 4 mOf/S9@ww({D ަgEێ?P-2LZ(.I#ee&+^LAXEs6$ طCH6}?Ux2u./ ePp w9azg8Jx-eb ߩbpkT q&`@4$13!~}d@a]΋sq1kTh$hc̑J̙':;w6*0bQ ea;uz1$LPiXA&Kp9wvc _bR_Nn4$|- e+)B 0ƕ1]4;cs\Zs^Lꛇ`b4ڌЎ!uY lFJϥq\Ú !Ŧ-Y9v/e4_ ('.~~MYsݔ=m H}z/072F yp,im$.E\ADLr05`;nC9|Z=OctZҟrp$Ʋ. hZz(:ל8|}k"Y8cO9wќW/*撑4!/=` FZp.G}Yh!ɲl>kJk2>\'t1npU(U?h HFn.(ؿ\d_F!:yHb[̆^ .o~Mم&Dg?\_ʥGx,^UsaWVR0)JN>O>cn.\kɮ"AZq]d͚vI/G)?`8g42eFd7`*LN]j%5ʥe:jYhrc~m lTǯ:ڻh^zۑ:HZÈ*{>-SIIHLj7?un\dzɵg.(!mO8ſ))Nw۔߷/ܭ-T~NDD)Qӽs%/anm3LDu}^xX!P${-w)o3$ La4M*)gju}3S@T%ȓ{u6G&E.z涁g'ra9 LfQq3"4eL96+K7r--4(̺ӭWmZ7'\zZ |(_ԨIqeGϙ+%o?D2%D rs_N:Arnz' JQT:I㰕ɉLXd+|V:oȱ7 mƆVWXZx6lZY<Ԁx٘H^ (75L\)_sIBA-ŭًBR1)'z$%\u~dJؗX+kWx`زTH^bIx.q}wme6E!]Lz.s'AVC `urF3<@0=tY枲޲zxMޓΖ!鰻 I_ljE÷l/h@T'( W,A{SnwebI/D]xm}v/2,_iMoJZZaj5NX Iea(|0IL4kpj$ʬvlr7X84aZw~d:hNnVTLߗhHʚ>;D-s?fT^-w#J39H#Z0'/๭G!~H* K~y:V9?7&vcA*KRRoיIo,y)y*jbqMQԛ!C|XރJ]?)oEڳ+W]( _J_XMQ KBkmζMyV \Ep=W er Q )gL~~sc ҪWX&eՍXl Sz2JDCf25]ԧk]@D_ OM>LoLA[[@N_t~=y ~Ȓ/QL.T O )v/ʾ6t}85n"\tzy}aip#v PRncq̳Oߤ]C㲈n[Ģ/3aZn͠FGRiT!F#*C 9#z-{#V&2-^3T@Mp<ᑺSgV: WeV# bMȺqW9ñ,#Sb {NUWo1aD4>ofd7k[llEWAR[ _A9kՌ6 r =y&gHo/8ױ.}R~G(uQu/UnJ(^H-[A[((5=v6A-nٶm `. +t> varq m͒;EliTdѼCs챎-y7nri$)٪ z~yJ71-NmSQw;/׌(g4l 8U)gʺڱ;׶Yhg3H(mC4"?9/wf[/&o gbs }I{uRIZSˆGK)9y(uGSa< Y-߇H\F㗨I݂ye -3 ]dґ͔EZ_8_=Nn|n "m ]k? jv)h̻u ^ij-+!aq_yF=0 V}Q& KJ.2xS451ʙt[ӗ~CK2FF* 6z/=mK4@|hF /I]8_dZqMX|2sA(YS1lXIXIu䛢TN}, Bnɘ4gR7ݨek}$>Nóqd;0 xo`u ĭN׍{bfW,h:GuZ{qU'4˭A@cOmԣM_ ;՘nߖE0Y=]$]2rħÈD5#;IeRGtmF0Qy(i3 Vm5U|nh}QNh]deBX:\HR&1[t&G ロcLP+ nuh+y/dadES z4-Qن!ԌE$³Dh6WQl =pwe~~χ D}1gg5Jb}R.8 ꦽ6P+\K~kg(i{I~<եoz69^%%^gJH$\whoQ0!C0!2~.Em*z#R0 nHn'3TTEP cPꠚm3P9RiZ| Hyef~(gF-a aRmAcR$i_f۩Zn}hPbE+RW}<+y&oPнENQ#IʂAuAc)G^߁(t$=XOVQ(Yqq8B]}XwxDEBȽ0&|gB~&O4к 2Du`F iA'xٶq~i?ը>~InXximzQN]c!,`#U "F9s+|v_ xG蘶o7k+:!(Aߗu]`X*AxB>LڽxL)QhDٔ1Q+}z J[8szщ;c(7קdB: ( dq%'T'!.ﭮj L(>Cx[ Bkgrȝ Ovsz9w &+PRƨY*_8!Oz:$z(M>v2?X7wI ݝL8vkMx~qT4m^#65ڂkz.$?SWϞ72ӟrV~ aTj[sxqCRݑXtN4j{ֲoݤW?~* AInjL|8ɷMVC{G>=*5n-CTxz*K06zJmq#%,29R {d~| v6m"Ň?)w\"sdjGͥ^ Ast{ԟ؅dWwu>`Y"Sk*Klީ7qJA4=XZr%HޝJ ܗ S} R\WmM/Oofab}k\ Yw谮P]髵O^Amzi/x>R)?=PASN rUR2L\%C'^P5jtKb:RwL-1/Ҫԑ2zy93x0AHT\AI$")}sה]@q*SԔˁޏgmr"8z 'y3HZ +O#ZMbt!Q 7QAk'9Җ[>{q Eǥ"Կ^/<ʠ3qnIZq vjEєvHEoedml?i ݒ2L ԙx twQ; 3m'@Yt-I:!l6NCr3ُT֊l%$ӷ*tVO&ŚuB|r3F#ġ_b7tzr$yUźQE I\xyܖsV>sg#:.tDs~(p\({ 5#{S seG%n 7rHq8eG^8n!TEF}"駛s^ن&] .p{ƺ _p@}=; g[9DOt=V>'ƇLF)aTY8ߦS7ڋdQE3l ;B|:VѬ|CbH_3c (zxCs]>Jjם=ui3 #6C i");Jpw^qǔ&BЊթJONH*9;](2؝{NnE+gvUND|Z5iP"2l'OG.X9Z''"mИY0jeܮjRno:5|s/< k{c^D9cF\{D>{^u)#q:BJ7|G]HGcF nYŒ7Hq|c`:`\@,UF+A/L2t6\3NKLxƇbq~7xqŲ%pm P;Yr T-S74Ü_$ANr_d :5InF_j1@4/Cc۳ sݏɝ4&ʨ;wsi-T}c8J-\'ოoʵ )'ږ$ZUhZsC/3ddzǪ;.gbp1 JP0ZF$7fN{2Oj=󪯻=` ?|F8nsfHs=_V΋OF2S0p(Czfdk&}Q ) c8P/o'`eE|ݑްr3dx2Ze~ߝiMӄޤP/Z+6·h| Wx16)" iL@K WQ7 3ZyWa q;77j"4`Ie F^"˄xY6߿=[aZ GxpT(4_?oZEq8Wzn$al8EdKӱ^o2^; t|>E% (ilDso/K*ԕYjŘ#J23z)qh6)&lg *9}J&99B?}IN6\$60]@`ꑘ)=RI)uΩa~7Q0eG뽮(Pd,Q7DDkmocWccִmDDدe$Bna+[)$|Lo: ל\HW#?b??`}/Wp mH8_e+U, Qj1ԏ'F8M S LBP i*sͱ: v߷ Di(Nb1]hBcff^]3Y ~/es-C{'#N:i]jL%w1n4g&=B'YA© ΟVqL!#n}4UƈN5P}w/U|bO&hn-fƂGe7—N}[1:T[؀]f/R^|7#qPy|3!DZ찷'=2:-,1{sqKH  [4׳WI8鈡êmW8[[_ &և:!mYF+kѭC:e(h Vt fK~mDDw=e*崤ftʇpp?Nr[;NRS*e-e;*ցA+|ܐ(aͣ'iZIj̬_cϸN*>"^.YBTtwc)=~Lqƽ9J7V?2LY+Naxk! 8$!Eܸ! f9}^ |-M0+.bXԦnt H3s.GT lM_o!`9qʼ^YJp꼈;"j>jWgXɄoQ{;jL8bT,r~H|%i^JBEt&F5zBj6s(? gڒU0 n~āFGunRSl ;H+=o R.iT'Ʌ*;?0) bCѭKQB 0 tPόhX"Rz^4[N@Ced9\pɈ,WyuL77C)q^.>zJU(s͇Ws/!ojy}c(Yr.SX0HpY0}dS%"y/Fߏ}DIòvH48LN:">q7)ްQv)X4_ӐгG12v.{Ōs8gysBSYILULҩlW2BfCȤlbbG#ԨTBQWD{[Al'Taҫ?3b='yVڋ4TI"le &uA=RYntآ@+恭K2BRq^b(vya'7ү:0@ȇsbvav6TAY'Uh3(z 0""_u0.uËTL8g=^G"2/b wOOH9cNalB\ˁk%}W$vڢP2fdy3=d̑ANk# sY 8~{M٥ l}g_U<ovC9=)I'eJ\b V8 xpB^Ѯ:V7[>X`QE3(:,_^NsN/,-Ȟ#ݚ~u蜓15zIĐF* ՙuB;f?ׂZa+EgOX'w?8=r8"?Ɨx{I!|Gxd6KS4.ifmύLBYv3iomޏD`sVŖ@7x'>#ET*\ahG6[3@Rϡ5;-btvkXޘj5tZrroY k,hЇjWOH "N-$?FB3іM1(ޛnwp% wӰ{b-,:_Z[A {I).}++usEn\dpOixdn0'+N1@[$۞~-Qno{E`B =Ak5 g"Nz<έNE^EUV~B[3K@hѼ%]4Db|AuE@[wrc0-ロszyG%'"Jҵ4-O7Q n ͇k 0m ?}C-Mq阤+Xh3`1xTqh}Jy\f_Kqa'R[6!-bq-$%ɔz}y'WšQw3{Xjv ]{trɜj3cv?X%͌qLOyEW),8*) IYG)VRn^^F{ǹ/V̶ @~Dʘs}Lsvʓzhnr܍;/e㴛_j to:k;:͐- QoƷ P~I4ĕ>hW*&THD*UbÅtDSg] LIUux!=` C{{*]Aruf0vI{cCƊ&hfo>뇳 >M1e"W7n^gOpa*^@|rQbsG'K+j5,k'WFG{N ވ=/us?ǫ{"< ^s/hύJoae^I,ԋڈFgAW#H-P2 LDhӃLJ5}w$$ʮھb4eѭZݟUdpu}PGy Cv}.u IiH}خl[.)c?ßk )!+ͻ+4wdh!]t[Vu7~iyǩpl|2 .xSﰄO^y^TJ4:oxWrl^w/i/ա罽i$%9~HSacWNyYN̈$ ڧ8ǁPl)b fQxղ<>-I""W%SqZ+\{K$C-{Ās)pL.`9/r.(+ 㦰UΥhK#`"eJ~>"}5EIUWQ 0U*aPGv΁_E@Φޙ7+]^Ez4"1t5sn*A|UBƾ#\PTHGΣ*uJ {:K~@ZJᏳt鈩[J𯳝7Ɏ+蔨˖pE(&A}^) ɇQSJ!ȤNBnR4 /• Cs;%R#)?ѻNS_ŲMQ|Q˴O~:4hl${&/ƠpuD{s4|]o6*{ c#e*:ivt:1wr /_XqyTTc [l<`ѵϘ).\u֧T|Wz9tB~~'~U\۪-pF2͊po W @x n- N¢{K 9p5a ? 9JcDu#? P yQwQDqfݳ4Ufu.x^;9ddI =y^|D:LET@6Hr6t]j *㮒M+v[8[=a"Y&&贇4Jظ<:@_|7y! ۊR$s i~bHAeS-:L' %\Sى SH dٕ(M2HgB.?'9t,YhQ/c,&C1S}yz\n: GS UƋ֔QS$^p)众u ) fFԗ_s7O@AںZ=&S0'uו^ FEz C.Er„'Q>&}GB^#`fm~i=*RYWEJ#ay=KnkU֚c%Cb_\lg^X S$CBKdCK!bqba2 խx,j<ʎٶܭ4È%nOCk?dU|ZI3ihA% nDkOoEf!TGv1džEes }FY{4mCwt9ҥ-\"AbEUr rY/MM QXo 9Qڌ B2tq{?VŁQ}Sqz .e "u}Gq<)ޥ Nq9,%ݻu9"ݩl"+^&;dU'u~ڧpo(CrXC{_6i[ CuHknBk>/SI,V"Uw{ Elb6(]ڇfP 5-^|/bCߓC6YSu7jrW}C:\"O@ 5[{!pFsC>KT0MZ߯e_'<!M[}YC]uR1yBϦӍk+hQ=H$8; Qu˷|y@5U3Lt 4"hXXc>U?f/yFޡΈmwS#JmlPpz `\RrH&VY ?5 q 1f9ïy飈ϓgAؼ>Bk^yz!*fF9S%{mp<¨i$h'eC{$us`4̮ YٸRtY-.CC.Ƌt@{( cq}f*g>C?/nUCc?R5/1\,:1mpz/WzlBd#&n į/:YұM{e̩D9ER>Km߇ǡa?uH6 a_cgKqwkW$;d!^~VDozH}C;wF*9d<ҧb ;[QD<ݔs@auu6Doj=(}=g=S{ Yd{?sg V.I-P~J$Hcns{sPYÁu%U%$J^3(w"3Wjt}.o@PJp;$xsL?qYP%3Ҫ>;OY5G^HDTYקޒ ,B(B m?*۰^a S?sye 2Y2_gj+Uݘv&pn.l# s{kۇH@_qQ'ցbX}<" m}qЧ0Ō3!nx[J#rlk5>xTvO(s,o>!,G7#1йq SDq7i[\lV"MLE(ʟ~/=$wӬ-/ X?zCpo0nP5GJ-saw}D*oS1"eHEnkl"q2i=ɌKEXgqO@{b䛏X ¶+ɩv! ;g9 l˦i4zg_{&P^T ݚf`g~;;.å̸G* \vn9uå2pb҈^QG\_\ԳYhv1\qC[LO <\#)"ŲU b4S3lIgc2mlf&f?>s D4AV<1 z wA0kYJ&Gʕ]tx>2JW ZE$:繩dd!#}Z )G_"| MLbM\#!ׂT;zw awiCɂu6 ["ILvUo)(Hk(8V521នWf~h_54s8u@XuGM-e rϳʙT"%Y,]zj*#}݌LC[xJGǍZ?/42^(rPd`U]9cn_5mmepP_ZX|HKۯ_ւB<~`:D2R^u'rg3݁FbUv`{Yll-/vapgU1C9LPdDͷww{c=2lfb<]Biin9.뀞 7ۛt*z"| a:{LE]Y7=2z|:]RL6y-5ٕ- qWVAɴNĚTEG2?yЍ{RV( A4P~4n4Q{ `: iONVwj5#y=rk=/R-FP$s1Ь꾍bS+ %wEhXosA%Y5lc:NXǣ)F ' 啱 )h1l`p^ UTG ۶C8|fXv> +D*^ҏ֦.X peP'7kNh%?wE? #3_&+V97eG# :Vv/8R&Z\j 3ATܾJ03ܲa}dc7ʄuX줮ZYR?O~?O',E; .?砣K@NOˁalpK$p ;CU'>È"["e%˻Eاz7~}_3N0\,k.q{!cTH{avUeh H>b"f ƖNp%. zcxQhQ,d8:++ZfClSpe֙Yuv2鿹ANHd]I8鷿TѕZtH6 ww/9YTRn%[>g3Sb ;4eR>Ӧse TmpVĎ 0SZk bRT" ߌtqy1k?:Nn8$MPKMtTܱWR ymŹ;h.4K|>V-R!v:h!aC'ydkRxIiP93${rcd 2ZC:Q  fOQ|Fh18*KtkG6-2d$ d3@`dzOΆBrFLR?#@e/ "YTm KRdX8D\D5⏟HL\TU P;oC>GTz1s%Y29 vI Wby/~Ꜯ!~Rx%*>d@hp(CKKT#3qТS{jij3C#;B:w؉4XѤ\ɏjYjd9Ft, МtҰ{?p1ft%"Nof> Do -l w.&We9hy#UP6DGlpnL{-* #jNT6dpZ \X+]w *2IJo8"wŁ6@?Nʟ7 T A}R9ZbZ¢`ba]aWk"5'M,w%/`G)v; פJPOVmb_:ge1 @&I`Xe/Ů ~<cj ّ-InL"8O 6 NrM11?;L_+(<)BT9@`3|A,hl1h$xo<႓&e񝅞l"5'rNשgEC?c2%n]DEz:is) M #eK X́t<7c~ˉ;;  CuB\G- e4⫨ITmI)i'-%{"hydV~&RCFywӺmqz}ᄯ步[OA`rF| vifw:3^ĴP|#I+G Kpi %9g t [).A$IJ/eOm sCq㉺8ݺZpEEvć>513bE,KE,_?h6Pc@I(2HMw=;!GKEz { PFhub]Oa !>\Phd<4e&a [eB_ 貒duMLBdU2je7)w=#=BI)z"TV5Ǟ%H3!v'%H-fo(nLkzWgXҪQG0V hlS[F?IYFwG0a?9U( prLx[h%1i$x)JcJfoCWc fK7ެگK=z!]kڌZf_guir2(_Ys9iRX$z\iU wyS2U3>GNB: 7+>\'M3]Ř~ #&@őnh._̜̉ H1%g<_g|u]A+zBRNN]~9ᦇ/8WW U6-Y2V,ւp}=0uos c"W#"mR(u?k!!Zk>dUF#ޙY6]#? 0e)d*z5IWzw;h$eiprvђ F.g4g,ǁt$$V"O|a]=Љ: j<8!ﲱEZ4+ϝ8<$΅m_OJڠ΍ۻ~%= ]U,!P o{isqК@94KۇnsM4 zPC !'Y[ӊz!yY siTF z%Gy+ F3;sk' Xf"|H`fyw=us/_0RnՃ׿#ORNjJÛnVd:5 B-jYQpi' *lOýTaP7~d5Q$$S ӈz$b-xv=_;2՟g <5U^|1 +8kLo~;B'KIh8ȌAʶ)$&jV~<[(1-xjƺcPc~N2-LiC7~ }65Y8?|{Ƹ HR.kJٽCmhcU@`]iXP8j@y. ˗h=Rx5?;6Pjz.xp!v̗"*yҡo6T8ݟ,vuΦ$WcD!KzGErmn$ )TqY{֔.:;]ߟnt~Զtsād#T̀ e>@=˸;S|āsЉ/)\{&A 34K>r>\gmpb'0=Ljm8CBTp[`48kC,6D=㖦3v;;n R1W.'ŦcMmJUhh=:vLxh^~CU 4*dN ?$O_g PK\{s!(=ŲT-54ISZ ptF9uz*QSjUРLW|.4t(e+rvn37_RB9JE ]뇲,I+W]Il]Zz5u$Q ;&[~<ٔD)^Οo{,wU]5"?%`ͱ9ȘHRV__": 'T~aٖu wWbH[lJ.; & J|FuR}_p \s5ۄM5 9& )*GLfITS{g=A2wvbG1Lhbx&eǖ0JTôS ~ oX2( ZFr{R]"TZ*Z[ YrMZBo?t@DPzgbPfbhIBI28BmULr·sel-]t1f.,Fv~A+;1ӓk=| I2qgscf;"G4%V= .`iUfTQr";_~W;Sn" Nsy݂mVϡ1Y=iND(`2c4$8HqRrv 3 9zNh_|^}0x99% ׍066fҟU- S l b){} 9@7VʃڈQ+, ϟ*@* =7t/YUU]h8%nA**>ɒInh3ߘ@~K(m{f,XW\^ !vk7U[GJ-b c%㐷/qonE-ǒ2KCkq}c"Oko2^IB@بnIg͸Ӄ²k lA vb1~('(i[\{].ASŵؒC*YԿ$,(nVbzn]&O[ z+IʪWn)p+d)tm묚 dnC]5$lЉʌSk v5]$a@^Hbȕe_1=BԱA+Tܥ{Vcbh+O }ݤjt#΅8 g3À`ƈz)+u?27Å ??EE2>RusQjYWJ\Ӧ54 |d8_&PbP \0y;FZ%V40_ X QcURb.jqq!fj]cKk٬K1= =jBy<)%j}eЀx$вVw3+f1L*wMSc|! d'+(ֹ͏)r}3<h4 {;ʉ<'pi*NeT&_)E`^X [']_Idzw+tH\ |9kDŽZ2#}J]y31IёO/tQ^,TKjeL!OX2DQm1uyLPK^-;&4FWw~f(B5u1pjw~o 7 L9ZrN؝xI`E28(+ sUxH+_)*- qGvJ| Uwk&g:6rq>-2NU^9 aܧV}Nkrk" ׋?Ž6/>{|#*AwP}~șcZ˫ufU%oH_E0uJl8PAu"^r<:ЎmA-%y,MkwB؃R(*O,rNIhՓL6hnjblbEe7dT,)|xv/T4ILw=P2P3XBO+}q໐J Dw޲5?Ti9k p.Sr_筵l>\X UZR_;MPdAH7%?sIhL߶\ꉜfq؇aGV#Cp>,Z/kW$&ZyWKAʯ4&hwhexN[Ԗp+X qݏ3SII^m8x C빃;Q&No& r8&B֣ JP{>=-;$Zj 7I+asCglj ?fv*(ʫ H6"*憂@d452qex 1&ט)܊*F.堶u9>K/sHRlՏ*?(+@K:9TĉÀ:g*f M=p~iyKw#'>tבFFO :C qRVde^. A^b&8B=RB{cP-o b{g=Kcu mܲ/~B.,4YpѱI,3C9xIGOZ>q :EfswW !`\xHI$1j EӖerx2}&KGVoLˍupU 0^|U:`߰~u/:oWJyw*v#$#M:8;);R8:O3\4l;52lzda0'L@s{{zm=.F5{P6& 33 U0u Wwë;mYŕw Ca% Qj*y aLDXt5˦7NYU?)WG[}αPL۶⥗]b0l3tIBHقA5#賰W'3$yT+wn @XR9MFocK&aZz Znq/0? d I 6beLbvizp/1Lɭd$%y ϴZ-–R&vMd/hzk!2ĭkX!?p*xh1$hD j]MmNF%^zp쪧s1a-|Q 3%6{d)T4GSp^>䓲]}LUR~kpNSqD?n~|?҄$% p6w"Zϒ=.\KI@P_EFMX`W f"H:0L mF)` X2̧9 4K>b"\. XC4t7{C17Ĵl֘Ɯj=lcE %QV dx<F.nC Я4po{)9+X(%H5Etb1gE${gO$Z]TsּbV540ɖ oU ҿZd߭y-4Nx `AH &hI61S`Kn3)AbL"0~\&h:K|˥ ^^~!U"M iyet=k+&߉[.w\02&U݁. EY~2h<:&,nrfVC)YU cqZZtIQс**T^群6*,1WwKi Z5e$3]J|`*'AU Q[ ?bdȔ&-TM`_o6š!\z̟T _bބXIo3juﺇ PMlm!#l%2)A*;:Yb_3K>=a* Nϋ4ȓCkT.WP P쾂wc ǴW 1qSiˬfVa7ST* vc_663=wGftBZ%tz?@xkl?InŃ]~#nq?Q7*s c)\fqgcn'|՞-$XhA|B#V5ѺCk1EPX߹͊8jxOJ)A4;oʹYۅY y(Ri5T=l0cPc*=W {!/&'%JirW*Z r=WneذX׫A?m dn>❄A >"{8Ox@~/kfL`"ui||F ym,^6LZ5Λm^L 2eB*q_I=;zGK"Kcz0E'*G .SyVdN'n^ %+ o_6,Q=I߇ j)9cIuW|YG 9#b_V^(^.3UX6yT+G(pzUgϊNmG(6*Hq2p^ǻ5.%vEA)摛׊=BkP2,j,EAdR2ޜ(ni(%|yI9'XHM] Cw?$`z)2ysqvRbyF`}N_dRݍɁ>p/]ˇ2Q^B%-1}vӹ!b dQx, >nGp&4VaϏ",}6L@lKo'7%=Pa+$KZ0H9tJ+[E7͎bjfd\,sƿ蠤eRm9JTUʮlj@\?a6R |"KlK=ǜ 9Vrq QPe)\ Fy~99a8sڨ54_WT~ߔұF%[gPDr| 8aӊв9ȯM5ː,Ȕz'ظ#![&7~ۘl 3O3 ^ÕW4G?<`AOEM-1 Uԡm~>{ye#쌶2_E *ݫR>If w;pœ WZ[ ,A_[߶:I췐&q[WUWAQ+.[@e{)C[3/=?Clxhڟ=L"WRC$ˢm;e?}ڟur? if|ћ[kQuIgKwmTJ,T=ܘ. $W[ZSfF2ԛj(Cӽ $&rJ\6]x'ٜGr^ˆՄ6%L"QGr] UCuJskY9P̬V?xMˆ)ѭ[2PΌeJEg$ PulAKxH;#<("p7|#v#9H x~֠cvBGB[0g`m5N7%\ P1L)]90yqdQy@'*ST` ݽGo2`i/`t/R> \MgkuDeN?cg>퓓v,#TԮ$Ҹ]8DȇfԍߓUWSUږA`~p+˾Kڤ4r鋊PPpd ''s՛-㑰tms'/҆)9ݸi\4DK'Qǁϧ5eU⃲o)`=)x+Q{$f#U9)8t`K87l l//Ζ\#J&| SPF2A>N;Q->ua J¢ߝdXeh ÿ٪> 0/D~D0دS tdS_Yk璓P`B7(*nți73z`PQ0w%$)ӫ@bi~&A+ vꚕxdB77hO!%ZXM| ipX%oK/3vC^5%Hb&Kod=43U j64ϭ_{8M̦,}.E&}kFr Q#}/7{4"/v5ĀV ~/BƙXm znJt7|[t*20~+L{2a"SG$: riϮka>S{ Hs/_p$)gPQ̢?!f!t7Ϻd+b wN9C-X8>BKPxz׈w::ڄqD{< [uQ]zN- Caf=eg+u3 iP(_S W}-.ΔD$5?9W@;4zh6".\D!=Ty]\ `+ؿ opX>ǜ9WIr05 sԃáqZM޺饈JKOxNlgIZ!'8Vi҂3"8IW$x$ _\z׶6 N cdn=Hcܒ!|i<1 q2gؖ%]}&᝹w6a&!c S~kmf紸I1 BO>rhiv  YuW ~zKjމI>P+E"4~=b،U6V슬;d9^ʋkx~Ӵq~TÍ_CB|rRv:t@qN\8\[A=ғV_x?rݷuXˮ.Д+rpw+峦;c+po2ZRgR30OfW lJ&vavLr"^wft|9S#R&MU 9`U BtŦEz,6~<&*[ev?ZLLAfk ?rM`R4t/YU#32ܷbzUJ*@Ht҆oW'uUokyY? }X&xͱL39dN{9.¶Ͳwl3A !R`NLUM[((bLRUNtǰP5a> ZTLl?j %qHNa N/OVC0ǔo ;E<`Eșqew> 0Zȵ% kW%jjk=}= Fϱ)WL%Qм0XQ7@K{AԳ[ջt`nV#Jk7_ VK=qXg|M~~HS2d*,|.W󳡻m+ $PJRm HNpk؂oNMN8Zo pp3ҡ #ukށt/Z`3D>Er}դ`-,HI>+$>MA?}%޹vu 9wۑWqrN}ۇSp)Bj80x5"x?/.r{]*t@4!bG4`^N9`'`/Ԛ>ԋ\([ִX*Xph29+"}& A(zOSgY&OS'w e@¥;WLƿ?×~&|O\L~*bg>olɠؙ+H+#R0-o 'ڠܶB]vD slC83뗩gso?g~5Zy{`*S$Ecqx].}2Oi>lYDAGPaD܌d2@,*qʅ+N̾./+O uBϦ4;՜~hY*۹2m945;VFɩcͼ *UY*e:s,r͒;9lLjCܞH1X@fzM;.:rfI_mIMxm"ԑL(483;s[~_10>9)`-r.YfigE-[ۅcN2OyC90:(]sr!_b-堙#nUL5rXaYh]O eX!r*<}Ku ).궾n]:n:m+'3+N-Q\pAf2iefPElЪCy\Ug@KUV׾Xn;#-/ v2G6x%%nUX q>oQܲDÑs@YrYT>=(Dȍ^\\!"^~CO2XH йxX~0Ď>^ qջVXSC-3$DҰ -|S =*|#s8b 5E+Ќq/XqSV61^JS"#TQ?;jpnwʶ8+BfB;D_l/SH3Vmڄ x0ra&> LGDw; GR?0$uJppM˜ĩ Zr<MLXTMQ&]˚ѩp`I،fs݈J.j#i'P]EpiX]sεNa6҅6O{8b}_S$ Ի/:f(5!ߞ$kw/C gK,*_YP=r2Gf]>0jrMQ^c NSȦd~oo aȰ]SUĈp6CwN~+cao>pnmbgẉ! [ŎA{d)ǻb*w_u ݊JJ~e{t ͞2`qtV Knf'?(S:Ncx!RR7} w.iS`?~ֱI7xF"U.ˬfIS#q@}%A!dPjPWgS7΍Z Vxnw$)O`lKT?)"P҄TH thF09skK"n $g$;9'E%|T%/?ϾfD[Fiku.@Ecd[wx^Ϝ[T,p4;+{=p C'YAvAk_2W|6͒0Qe 3S螩%P6BbpP92(㰧NҮ;b%nc,[p?InpKGK;>(DHfDd`k6C[) CnnfeKxtnm൭-߉\t0q4Nxw(R.CW\jΉ€ J!Q\ԫ iṠfMeLAUQ?-܄2!;>@ AT݀pA7Y4nAD #6KN g45Ӿ`-F2 dl.jcY[L$œ@z`ϕd_Q_@ S*@4^S:TR}1}?#眳'YO ; |U+|j{.X3KK楒z~4"s;@GA_]x4v1)6̼dc/gp`Bj9*{E;=Q8b7z8 ;|.P7`/Z=e4,PCԌG;0-R?8R(a}KGqz(yeO>w% d^, s%wIB'գ *o+0 G9>:#5cUb0z eA!t o 󠐲龐KЮKp2׵B T~+N#[|+SOs(j/#W*CLaӞߏR}ػ645*÷]cl"%ֽ{6MD= 4#97[< fWbyPg羺68Z~P4ƮOKGB>F'N7D{Cϴj'D/!W,R bWvKѲ`Sو| M( NOӐ+ڗÄ૔Xf%E ,7ѹO $d< A-H8 8TRhd?ʸF/!Q\Ldy!\2@iF)2t@#+MHYTKW-zļwzk# Outo`}J=yV[ɘ^9TQ?8/ϼ꺚UZu \z h&[ z]_9h8>ĭ^qVr1鯝<IPwCjfNi"­;R P͆d\΍T{#/")xu)iTJE[MCY 8OqU\us /}M D꧃# >ģL*sj^~Z$U;ȅۻr :Jy&~9y B{{fj\l01 ޭHI]7ԯ2ER'U\q~=d6X#$FG*I _RFK_@3y%#Zkc!a' r"ϲ4Ԙ JU뚆ym `ܤPsM*PQOze 2뛾=u±RlC/Оd0Q}k)+G"e624)ϴz< `$b8ŏLǎPI] v-}Y04j-H74 /ecbBýϖg"~,+EpO^v`}tq1z\>t71\EbAH4sȴ*=Vq܁ծu !*U>`]agE>.м@ N:PE;Bb=\#{YfЏ ĉF1fsd3#En0Qr##5*$&*h_J- գsigoe3tbȄS| ͛ʰDE]rԕ~EUvy: @o?׷Nw ;ny3kZY2\jm9~|tA>!t,[eH;u6"16n=oX=Lt\G6& DBEsN!f,6|rrysxIp*% 9Ec=L3:]}lVi%9{ Z'K  {c7tMT<0bud` E Ļ߉,ŗ6##C6, Yv|a̾CUT6!۟b05 r]гmoƨBLj,As55MT+p$AҜosc8[~p?1Vc?b%*U/}$ôt}9&=yߩK\.@Wbb&5(?韄ʖ?e<.4]k%:m\Ayq}kW##ج>75w@> oy̕xBDHLDXۧ[G s>? NA^\v&: QWK%zXW|ڒ9Nn\ځ@\H Hw --|o?m.#ϛ+ʹk P-lM;(N|fֲc#ώc)rm3Sw8QCBڒT ҔE{]"do $UhKB#s}50;k0ݑRy96rbnև> ˋ! 7'v5upbMwas׀_&'X$cN};,yM1Eg bXM컉WoɦӋ% E=P#jHh\yHj #~~g$R#eӦh3Å;IFXIFnx> SQ6MBЗ1#C Zh~֜&GɥL@f~mEژJ"1%b=dp_V64WDw|`V؏yxOp Y+ܿ]oBD 4zhD.4_s01ҢxeG[6?=UǹREأ>d}_I1@-~5߽m/y4T1_)M Mg,#Yj'qfW>FWXcZ~*-igfK=JM&!c-TJ!Go{L*n*7L.yc`E>:IAM1~B*@/TwAWir+[rJ&FQtNM"㳕6 A~8a&ςRL"iʃUȇhpGYnd̼[kMI_1w#11I'tg캏ڤ!x Gⷬ>HAZ/sT252 [ >0>& ׋1uͅ+(}*_< C NLTݸ dxxQ pZKY!j!-:ğ̢8ӊD0qdH&K?~g5\*;ƻq=>41M̖l A_Z hKg!%K՗[躧8FT1 ?gHDXQ0DqCDݠ[7Рc세Bi۾ȗ!\ye-ֿ3w/mӌʷZ5.֘"VeYD'=Yr~1MYߏ =сgKYSℍnf'qW˶j6fTNnya\Mg!daW Zlb{U5 ĵ?=Y(q5!̫l;v4*ٮի9S}O۶CTf|eYlThj5`ET K ~ځtl$TzGZoD2Au:՚,Gc;9?z`N:7|upgM()D?lUhpɊ ^5F,Q^\;(xqH8++^T/bQ/l*tyEew0kl^5 }l/_O$C\8UC̶冑Cސ._YԌfS3YHu-+ 4FÀwr `.qُqFOA0sעP;A E?u;6 jVikKԻJ4"*@\rpr`$CLƐ$eܽH.4\rBoxϢp3"n#J3/P_VC$qGrQTeP; :ٴ9%ok` nR 'Ȁ Y*  {Gcj^ǫ GKb==6\?3"nտt߆؀ad5 G8t0 uqI`d!|u 7ҟ7TNr#C}\!bm%cJ u&%\\0p WT99Hگ H1qs'UZX +a:bx3[ FA$ J\5y=0ZܴZFwi;|39{82v"q.DufaDJf׍@u˂@#+hoI?=,IeXSpxvj\Vi7#oEӒ%!g&s1z|;Q E7Mc5J-+m9ѻB }ź"'<רFr0#2ٜsΦ>%?mOtkRO֗ iqL$>}r[R I!֯a?~@T؅h͔Zz FSDz,L1/`UhD>W)%^d\ 5siyĞoK00xb:SG[yxoe<"| jbl%@x$mG5`cl(Q̺%XD Di#ۄй)vA)gJūO .JE䇡=@H^;cY*Dm%f XXOGeBY(+3?LY[Urɬ7It}b9=n`g[7l*d.Aސߊ!YƐ&aepA"jpo W*-G*^+PSVAd4+*"{],c|򹨵;_m{Ji6U&H?,ۯipt"ڻy6hA*+=^Ÿ9lr,YBG0ھ5c|KԊAjNiG(2ASR05 R7DGv+/zK>{SgP6r.0 #FkSO=q BGn*GA2-L82ro$"q6=R|H3P݀ VjWsҭ1gIt4ԊM=X5%::HDz(NkC;db YQk~gW&ϐµ̉[UV7ѴHA ͓­|0$]ߟ-ՁnI^LD-|}%iӤBttM^^|IYwEp{ũvavɰNddӆfa+Д^=b[c O:l#fͻ!O"O%dc'0'0o8 h zJbZHg7ɦn 05X#!mO:w&91:VtP=8 檌C` j"&5۱c5=IXQѣ.! p8)OfS/-!!C/ V]ɹΡa3+2O0/Ҕ?OF,{#!Z,VwR͎F"HIl͋DdGc2F< 1|dC=h&B W'Y|̇H*ˉ0 =9'(2^-s@g5> .lt2m!Ld˰~0}>(-ǮSai" =f/nED\h[8ruXӒ"2S0'Z3t 16އLs~;ɩ k JI׸w'oIJ+5%Ok票paJ']ΐçNY|6gC4` z> !CEZIq@u± 0dtK8$HFJ0F[˛ͰH( uήo/4]Da^sNq*ZQcAVna&D3N pWpW/ f^ł֗[J/?nXy hu sE}6ް+ bQ+ o?JfU~Чj+x:{OYHP[vʮXxڟ9iz5Ww$8df93Ôc9ݐ9 RK&Zv@'DlHvL CcfZְgԭM2 B9C"m}ǯ:d!sWŞ؄)fY aמx=xLU\v1gڣKOx4VdO$1bV?[* V]zRݙ º~2[K{#i~QKZ%qŽ(g;`a{SLc4;ixWo KRA8ί>W+gv5)rllpn ew'z(kL1JVK!]#ތ)N8lB4_()K^3x?:FcvIC $_HvJ/>nRr?yciylBR(_ʨ`۳Zwzm,-JME}ؓtb6aT0 F| COH.KEX~~GU5aH23yv=LjSqlӤПH KVJoK:=0sd)CXW CJc%,{AkǓ!CtF7)&,j;8y/9u۰vvy;M艂2!Λu숁w~vەC~uB趶wי!0_LQOPƙT͓u+ 5+ !s 4.|K}FgN9I"'dL7>YPm m1NT"# LSFpF P[+mFU$j{"x?QG:}g9螐Xt^'moE/YI<՛nn6i:۲SM2;|뫕54]nQ؜{U}ȁ-meK* U=7!RK&fE:$.}M)d vKrڠ-+0I0}c2?-mp/yF7̅漟_GWBjA ~rɠC7CY_'dQȽܳ$l37g? R[#1Ӵ~6aeL|9K(f{Q*pޒ Ҫf/vO4 yyǸ3w'g2#&s @(G&B BD-!1br32KD@Xe(^'푪OQ|Δǩ|8]r(PT*V9sXOq*.!CP 9"O2j݁kKNy:6dL=:H%.kTm yqbg* z* 6ui+vr#m(Z'|pPӯ0 (HzXWKLtq@Ŋ!2Mcb[W6Ee"iřP+|@@Vy. &}sC+WoGS֊"=BIًU{/,XBwM}=#?Cc/^Sճeli``؉WP1K.h)Aځ\oi7(wV᭗glɡqaD tHySӮe6OqFr$o~\WAfLu+[=(1 66!`h+hG1X0| xA%{XlyW`9~-k/͗?\EFSKNЏڃq 54>,ñDWAt"v90RbRu,U*MG0Ǔ3:)(i%F::j Bñx*DtXn7?/3]Ŀæ覫j;-I[IuIPmO8>+~?m Q"r|QY5gc_w,EMU6I\۔DBrc""5STm5V~jRc i)+wz7JXZ&+ h0cKf7 q O >IŎf/]gݔړ8 oXMh L_!A [yK/@ڿB'iIW#xu@fU_q^s[U|4ߍO;{1b$[[5|;1}6jyPn"8~,:ڸ݊ld荆~QL%-'u&.g n g/%]Pka1Vs8uAYR> W4َVh07lTsq5'v.wQ}j=R~ԋ&0;p 0 `/vDi`1Ώ[qߪ~$lj?7{ۯ2)U\i,RzHޱƍnm%8!dPH@pDM;ƛӯofO\֑Zޣ!7x=Ql&uKh,Dwc ]X˺yFAMZg T2txu'x q5A̗4ވT!I3P+?U:+7 IS=tO#n,˭\6z$A)T`uEPvIxDGQ@YGkyE^W~Mak4T &z kj;Me"0SԵ^'55leZ& aؔ\cVВga}P+M#zQ)Z4HsV@ w|9I |tZr.lqW aӽ\ť"tV!Gpov?iX,H ;}fCS+sn=N#MZQ-XXD3LB5a-@gZŘvr湝NsoPdj1yM"E6K͙d;#TNŠCV'YD[7C־^!Rsb?]1$a'=YpMC۝=ޟ;*ƈ-ʊ%LNm] J@Eq$V{76m}#6C#G݃4#do~gfvɋܫNr_{ݶL GAdzE֐d푙lA}bnܙGgR ^rNN fqZrLp -N ǥ Tp:!7y$ךhFS0jڣ68"iK戣[lneo ŸPd$.ZdFPJoϠ#rpd  iZg+= zS "HMx8E `F>_ș::|Vg aP~hcW(g;ʘX5D։zNlyj-uC[E2^!: ̭pN,;(xJ}A9̅qPj퇽`ܟFQF5{{*gK޻WO&yA[cϪ(ΨVsƑøi0?Wϵ:x\ZZi:{DE hԺi-RkJOgpADtlu#T6pчEgZU7X7ڐL<[fM yCX,_]PS6,z4Fݔ<Ѡ˜vHXjѵ5 ,qIP.Cj3yҔF/NmR)A-j_,މܐ!@RV/#*BCxvh]12nv/Xp ~ʇӝ@|0pYfbm=0 {u@7CsXZ.SFΖg@K|$*SK*)Lw zhv2ܢ ǩBd{ a\V;o^}Wfp,A1SV`C{9:3Hx֐z/`5JD]ٴaZ"?F`]OӢx\]y IlI>?MvUVZU/ET8ws JepkyIBY+j8yrfYa :BؠIsKo*\ ʵܢ|/|rbq|1 }M+g;sM.\a͖36ݭXd#w,3>놎3Nag,!2Q=`YYe&AS}R]>50|4BJr{:v:'@ `L3`O ` ͍sы>"cAU^"?C4sDoOnKRFeBuD%{ ؛pDY#Q}33?WK2I7B")-! Vϲ}pI%9YΩ]~@QF#pX?ivߑm尾72Or0Su;c4^`NK4r/ZA74,rdYOQr˨{yi[[%tл?ٮ4pAo9S_F>)}m`Le%=]"lތIo+.O\^HMT u !qUKhP撰| g]:GrLVxji+;p昋8ئݻocH0(ZzoxBS*fѕ%?Kp!{6*58}Ӧs[GVlc \~ U-| i?ۤ.Jq(Din$R3]anUK^׷Ewe1"ac܍LnܤuУRa%4'[Ro+XDn瓓YBgCz"T=6V%6cw&Ǩ E`x=7uI<po/z +>Ux],0[t vlCM ؁ß)-X)ANmj1B@K:e8(]H0)7ϯԧWffZ[:EP)O6oȿD~)`udL97׍IlKpH%|~75NaΎ)g\phmH fSb p}M/u=}!wfG+q-YFYKc'&2άx-XD: -XdJFivl֚ĂjɃ Z t'Bx$C̒^47q ^r^H`ZCjh'`A)ih;j~!翺;c^ ?S(quD kt܊IS#H]-hP]V 9+X]GSE])0LڽDSy&h#.8zA2j?,ſGh2 zU^Ar:)pbhME޵'X{o>n׀ْ/j?L~aY䠿*rkF:n Ci wwc6 ?[3c@t<3FV#-g'D.Oȸȼl MGBM&:a33RxTRs׫#AC {(j @g(RG_9HEAO_d'/&ZV&~9wԮ&8SO,?xErະnu/F{U@8'׽ߚX Oj-iS\~;wImf.Jtw%u|pS3AB  6W nFޓPw>±!cQF|fVB Nfӗ!o{>AgA_-?YR-Ukk[ &Ț~]T1HoB-#(&ad/񒷌En.r ^rx_雅 ݤR7_Q|0[eXG_g 45fSUPvu3 o źl5ւ .p`/8a-hJ熕U]P(dIX3\1$2|b|Baϐ]Ӥ IL  3ڽ(x!E:P/Fc7s A7Ky=P̮/jpƏ.n`+ uֵ7H[&P<$2V)#ZUiuƣx|#6L!wT U}#2<wYJ8v*9UXa : \͹; qFr=okzg,gJp ; Lmgz[sq; L?V-񀸑sv5:Az e":]OuD#>ky9@`cDۏZg#3R¤E}wȩP8ga/|7ҷ4ؕ %8w`X4ҧؼ%.0AOμػ :ko-@LF.Oo9e2 '8;SÒ 0Y:-;(exۓPVS#B4ǑټSG?R $1Tװ+HoSVW ޲ djUw3:vB<$Yi*ǻB|̐41P2[Ebpo@iss{A"!|N-w*@fyYӺo}/K8Ե= 2DOL殉>AJoFރG~ƕL39`)3y3d2*;xatZf{h)礔,G!S4ޟG_KB I,_&`A`4 Wޡ\8✵-˛:^f.ҚkD{$2Ů1)p aJqn_Q%#Kx^׀9vC'z Dm_9jX)|%iuhE d ܻ _Z6nJn!VyF$c{{|xvxn)'E%y&.%0ϴf#VˊbĺQDŽ?njۏ43ga2nݩKWZBhNۺ\G;j"cR~dKȯjH:Y'%*Q=!I'[ŋ{ K0n3pYA]dC0 Ii3#i ?~vY5t41o1!Oأ9Q) Mj~ږT mblg3QB27fTFf%s Zh뻼z@"Xz%^ԋ_Ud[$daGL b0”j2Ȟ@o{3b <b~H`K< ? 3z`|{%2٬(3&nJh ~TjH_:4Cdx#"3 %7C27G=.x:c ګՁyDs>oQBSKpKO[^s#~!9{ l!CI5UiW쪝=m ePF(Ч+%)0eހ}MX3 -wr 4s3SJagι Ǧr?{6~͹@A?QGt7V=$DxE4??=c3uftjDt[rud$ qPc,vhTC'[ĻzD/ژnu.si\9I$R):85PNGʹ8d8_շЦ !U =P$AM,r#4o?޹K-P[Xx-#՗^SķIiy*3tf`I-yo2q{f_u$\2v>Վ4CMODN":Mu'%IODδ)Chem`S Oi--1 ԀHPRn"/#$CIM<*u3Ns%On^@Qy(n/Qcz-XjPM7|~ܣ#S(Zr#(_* w 5VrZEߗ:B_k^kBRW QR`H\q`:<=1ԵyNuY I\:L/;*|ps? T8jp^.j2>] Wh2bmR%l%lFgblBT!X&2S"ŘZm0Wϩnĺ2j 9& 쯲؄2e}s $MC FebU;zk(ݵ|?VmT21q0KE}yMV Bdڴ˧U)dV[tZEb+Z\ zaUDotpHHN%"|g`NcDkvz{z1[|im;}aCU9d|PÜmNC` ȹ9Vk;mw<Ԉ=A:a= Kq\Wx.G! \Bg"fKiRv` sS/\Yr9]Y-KKYEҫ (rev쎛/,; >ulkmoZZan [Lp7p}`M7qlXq#% _lh(*0^>1NʨHxsJX4nX K+b͍A}rPE?v^g- P &nYӰ{B_Do1=V+Em֘'Q @ݑ Œ?o@턏q.$@jWƤ[w[jtDrH{N`/9"пv9{-lV߬Sl C1CO> zH/Ms ǯ=dZKt/v\y:6vѤ,zf~V!?)w*^Ee}F$Obۏ_ހx-01܄d>H]B?$wޘ :Q)͠g2r0E::I OQJv+>ICH%5g7aSrS8.q_Qof j b:6)n4#%$@T8{Ğ:Шw|Ņj'MOvĻ@)7t~&_ާ@$ "c{n}&. 32%5<,D=Hpp*. ]|nmٕUID{ o,(!W4 ? sO2jŹ/߃@> y5 k_sl#lKC@A j]զtN=px0.@8'\h^CyD6w܅K)1}<{TTB1#2ڊ-~o`t!ť[۩M-62kw*üƭB6a񍺯ZT5o%abl+%6iic>ł'I18:JQ#3Yb;\!P h;kf #= VSG"QXgEg#屟,[ĕPWz8!t~<ZJM;[P;K%LܸGwljTPe\e1!^s &J Z6wXN͟pކ%gꈀdC}*@2-JE@7Zniko|}OH;ûWֹ-a5 rrNy=&$0~L B9e7%ny䀹vTc1?>^Ʃ*. f;k }Qґ.UC+%Q٭xh'9)c~rn[R~%d)L&]g7FA-nID?Dd6g'CN#I}<nuv0Lg59)Q'S² Z* \g8NWa:M_*\`lO$԰T{h#Hj'tdbQ_.MQ F8z.3ЊF|\+E#9R}7]Qjz5ZxXJ[ig CiDu8HUk"FI.P6c'9%Y]!ߢ=1qE];1M]Kn=v3ooq2[S7BfUCEc%Z,u)@}>G=m:̵vf>5Kma& H+ǖx=i(Ln5tk}}^wvb"jMDGGo*h*bDubX.r{QO  ܑ,iYKeoVz#NV,uH?ʊXp=G?f$ -x dEf>U=/G0O~9:IvԲA<[lMnB\u]l)9vvt+"iޕ }t!ƤrgIXH^۴DLYkyM: K_w0[aˋ73أ^RNbn~WG$S٣C(΋Vѩ;_ոb:4/54^KN =kLc͏eo4l~*1^:|dAOggagp8vԄSqhdV{G-Nڀsە?n! ΃xr(҄4'ҝn\]7]!06GCHłh?2D\YiXN)'ߍLdM z\T9k$p[j08;B>= <ك8_~F8{/䀮 |qG +;DbT%}Xp͑<(@)ȩWPw|Dk/Gq>q.0 -1ٲȸA-44aJۑ5ΪZU'{62a4".Y0`al[TM2jrwd+LDBY`cnc6^?(#0Ȅ֕WHGԁt|2(4@lb]M*HdHs0ᐶA x};].!6yҀX4Z c쎰1@@K!z mbc=c6v*pbgqTN/k<8 U;#Us&_-lRpDȟOdψ/]oXJjIMu W,K3@yĈa2s,, |-7/Ed軈;E;oNw܅5|e3E7ypqDdMꆢVZrbF7=%oH%ñ" R0 ;|)x+@ku[x&q RyUȊEKMbyS(F:&.#B/.;GS#AZv0|Qx>x" Ɠ=mPLYOgRp"2R<@rŴDo3滽#9l'lf}Y# N!ͳe U1NA2fDHGdϬe18~RX*F\O)yÖBU$CQa^~7R¨'FjoYq h,ΦR7߫#QcɖYt͙AvˣJKW\n~D Ø SzT 1HɸPyatIݟP{[ˇ@ڦqTԎ\~ 50Ӑm`Ju%3AMvlo୼ pe\E-:5.fx-iзwm"œBo4[m\/2w;_UO' #0.?}OP*8lݒͩO?k玦3W$ujwWJZG'Fi4d<\v{9ȗj3G38 8p}k[bGEDo~W)\i&ߏ$3+jXB Wέ% Do7(SҢQJۉBjOw!#:[%)ۼcJ&>oqY!X}}D$Tm#gEdXOxվ3B֚Fϐ>x,iEq-I6TF?09R.dHր^-U=|ea:J.+sq|*( qP ̛?E4 S\դ2!7]՚YDczNSYI WіؙNh|pz.E"gN韌C"&xa<17 8rND7{r>bE?IɒL_bk!R}:([?HOSѵVPEB}RŋCx=k+ - X" o橌J4w'J533tJ9θш8e3<HP#IKE 8RB՘C (7ڔ\҈ƅW@D(J&̀V䢵`Q%YP69b8l$2H!,TZslh7+cHmvدvRr^DA*u٢n%-:Ey5_Ay_(=pL+Ic 3//rV܍^^5 N/J kȝ}򥋵6hH75p*F 1Ŗ ԥ#~Q# 36pL*% f? pA[rɋ1 B;V9k!%d.R7f~Jܞi G6 dtQB9C6#neVc<%':rl뵩!œV kr8@r9o[932dE46j֋?ذ pj>I$iPvF3ǀ\\u&7PǵH2+ ]I=5o4ksEu ւA[#n K>P<"s.eŁʼl/6' x7w3̽Bjm±[ 9^#F}NK .HR.Q) {r-@#M$ƮDnDM/.ad7R^Hv7nN5yV&ں~qed&  t߁4""Q[UQ<|5hI¼cSunƲڣdGH+1DWavjOTW'&&evӗ8@爉*@p= zX_M%@=Lua@WpF`NgUS`I\nQQ/Fᝒ۶p+_6yNU,x0ŞL0o)&KS6y@pمs2'cWڢ D)o%r${{p*&av Jiʤ߸ۛ,?6Vsk_׈QT9T%o`neu3m8y138)'ibf8{5Hĵ#*̲*N~8&`VMbsܠl4Em:hd83D9k =@#gRz; /_+p_{Е㿟@+[cdOf4]>FA*;d.`Ct]FRNz yLG?S~&*z>=%޻elJ?o/^e# "2QIX𺪣<_(|}Km=S4x9_ ޫ vMZȄ^{e \ EFmaZ7˾sA`I1+U)Bp2pJU)g3Z( -hBx4)kkҵrP#F:Iۃcwi=Z6BNOlK _ScFqSdIPS_1 h 31|f0R>I:ԁ`t\ dh3ߩi$לE&ٚ+@:њZM˜bev2"C};ʼkG*`J9 GmP忙AKHE3ޡ!')Ce ΄LRX[6#wV6hꃻD$$p؀ Gv.AEsdߔkԼh! CN'ean?X.cqG\ FEAںڈ:xNAJ"cYb =ja񱤧eyIUV%6QJOZb֒kKD nU38F:󵬈7`)anac2QPȦ%q.H0` \fio=BˊǏ(xL-KY SIW2ZXnK !0BrDRiuDb߳JN<P\hO7)H3K݀1\AQG3+I:P {0|4tLmm}+-xYg#d>l6\hL^T%*/yg$(՝%,+o Vs0.[x eF–ɹX/Y a@_ٴ`#x g)<-OQU1ԻOE"||# 4V"5FGC8Pŷ Ƹȶ8㏇Ǽs?E|HDSzeփQPgX eg6cfq ΦiA zɵ\Ŷ**b=00 k>.$z 7kvʙ s.B gK1}:Mg[ 6UӏcgV2"}GWLgFYƚVe\ ܔ%K Qޣ&!i3 ],X\D=ӨSTE'xYmu ԙ`9 霰c6mU{2p]ڱ]S  V̿)oCTʏ+{u%-GZ v< NHc_Z~o'sjڱF!lcXV wsThrԾC 8k55T Y#l9#;CjLFRߚ{GtB9)ZׁAH\m2GOehlr^(+T~AbVAB}{l/͛ګOtzϘeWǩb]Rh_q;G| i??4v1<˓AUi7kGoY!_e zH C%Nܩ05Vuw(EctւY+6A)_)qc%ЉZ~5K?M+\ 8KƒkTg6/+!|3X$Qv$)X߅A"?%uUz4ToWMd+(KX;Tc TwLJU?ÒI-|UvN oR1>n`݃Kҭ^b__, uo^x/PN+%Kwż?Åy:9s*:h(kx~91Hw|Rpһy5>D$J1ݖ6U:'咈%R;'>=MZђ76!B]{mTO%w`"j @rlǜDfWj.]锟l8&!?Q;*ɦ43Q@#O1]j4@{sFee+%^I*kS% 5$̑8Q@7`(;r%Qtv;d096/sZoA!]Z(I=*WVH277[7ŒvLsL1Ɓ l)\le8T⤵Iΰ*L/"R歍*=Z05}K/9iks? nsi_CwXϪ=v p]me#IGy#5uF*-/ҥ?va&>oG 1UkTmtc} Z$Ù0 GWMƼ NȢoYiXZxy7a@d:׭';k-*fՉ-(ecTF޾$y.>W\+TQþ~ 5O"TG9C'nN?γKݑ!}Уgd,5_xaS\+)41(J[mT;I>ҚX@Nofk/tiDY-("-. 0._d43^:UCoM+>*僭 wKw $?'.y1{bKhV O*kr%lv?<\荲d;H#q[-cF8?.Z5L!li,5 p)1_xo ٶE^|pܝjQ"YίLy +e R>a .Vy*ÕW|Lc܇@0i#ǯO Nuרnjsp]9x˺GT &]pLp'ۛBs8l;Q[Y!p*oիyqrk2RIFjhE>؏LyRO k ۝S.p]s6qbJ!qvI}`xP|5 88z;ԣx-y R%φh柷 +R'o'~G!Cp[@Siё^8,6@,G{ƻ(_3T_B`Ȼ`QSC$̳pϦd/4cŬcH̥eċ&ПN%i&|bo_6 {f#utSlu7nΡEj%zznY|Rΐ4.J :مSx˖qG3|!*ڄe'@>E!Q%Wc\:Cپ/ 9_lk k e6^Zjw|fވՁTQ|PMh YhLnE];>Ia`"ЏbktO rJES7)nU? Mj0ҨW2g$Z " $G6zpZ AZ/1Q0ikae+x"XNɘQXKnM/LBn^I?hhmM9$RHAo8s+Ūfza^GY;"ʚE~ y8i`l|L@pW-[2nSǚPzQ $08fu꺻~.0f:m%0 ||kmK7"/Ql=`y$!|'BPi6|E ҆qj}]6m}3K'Ka7P q/i5JOe%`Bf^~I֪0N`wC`YpېZ=r:r2}]PU!S8JMzC\x';f4Tü#bJГwv, :}lBGY:hD~2%@n*/ R ӛus˧v|+ĝy30XߩWXS۟]~\ŐQip q&TTFgqaD#=,ǰJ"ycrREބ?Hq6Nrf:8skI5Uɉ vqPvkŬW!WGc+mqd}L.o\PU%cY]>Rw6mIԟ!,\;ჹu!Z %nU҈S鏊X*c d>^F S(ҷ6zeL?SW|,B"9qPA& /pQ*ƴ mN@5t nYVcǷOoЍ[lX}#Ϸ32*tTXS_Dz.6y1Eb+R Nƥ(M~(F{nN`DaWn)0M_'+•@NkW3&+>;#S$(u+Cg`7~~9uƴ1 hfO/>ۺpS1oA4e A]iy8^EN8&Ҏ|2]08&*+#A;)N?zJP}Jexm9J,S般Ҫ@NkӍ>Ϲ X>,~@(򡦂tr%UMwBujik3H1a!lW5!h-<ċQOGٻ y|G sEqx(&_{@gSrc[$@mOqlff܌dLMɶko|Rj|"II}1o+a;_ҺtY` p{}" j[8\Wb0Ѡu@/]jQOchNS\Z7ftc *=:2}*{V'`[ a*j[a nfQO (ITda\[̢ΌƶVcszXSz}V_4 eHg N m(y&v }y6κXE#Ui9/Af? XC,ˑ03}ץ QAT&|v, ;ۑYY?pqho̮A"m3Dvl΅ث@{.^cnCEAn\ruᑻdXO-.τ)I}p=ɠwѹA3m Iפ& !6B/X5{8I( ))]\ъ]#p' Q>BHS+В׵ܝ?1nh©JYN+<2g?h?+ӗ#+97\e)$cOPXrz$dĨD4|)ݒ+?^aӌ IhHeʋJ}X3ZrFHafnOObAknwȇ4s䒋&ۏ׬PdZY_KȏH)LlW^֨#S1E_sԸc)Ókep0RELyω,QV"WR4TYcz_[)֢a[elqc4,ao6۸/."TEa~q$DOX*=~^XZhG~Pz"I]$@U.>Lk J* oIMd0`䣽pi`Q橊R#*3#SQA [`D@޷ބ%7,9l ^*oſ7/:kT/XQY#ܣ5ݔ^zPb"c-Ժ`!}jS"iF9L4Ik,n}uI+v:ą!f^ݘ,9NoSne;~ LesnʬN*qMCqL\B{r.lf_R/{r^D*O'ukגP<cH ̽-M+ diŵ_e#4c?vfS:>(5#XHE k LDmi6R)a"a'?$|/ ~d̕?>bAf1n_i^m(H>m vD FR"E8Sǀ 9U?#V}(o6#(?lMm#kAK=ܷ4C駧.{ C&G OS%&,{EBZ`H0yz&yIɫ3|K{ΓC-:Uv<({E牃Wͮ\I?fX`t^FK>\hŵQix#滅2j GQSʋ$.甉2J@v*s)$#˷kj 1ˢ] =@nr<_p|2v}?Qooo*Re)m6uq,?7!z⽢C/ C:>_fyρPˣ,A4q Ɛ cw!T|O[~6ވ8\IN4R&ޥn,䮹0:SǺEEPI!IReC6b{.[CtJJ)3Iņ~-u5uS($^<)pFg/\n#ŢI%9W{+iGצY \e-, cQ@\PՄȸ~wYfeX˾F]b`&q2w/9Guzs"+(> Co75X ĩW&ʲ=m6FhC(F~\3Cj>nK1S8.KLy乿^G{Mqzܖi #n;ZŚCW %n-n6!:;ᡜTʼ@|Z)۪s(,č'}O8rB=瑳)7JF܂Am}#0AVk=Y9 `^OyM`!X=VRvK}~z~a:#Ow!W kQ]UY{jZhf Xj%K8#w ŖC+&ul}xǬioDy+}߫!*a-<(.asϺϞ1s;_|q֒ak{F0Y-kL8|{Kw<UQ"а4aВ( 3ؿ| }ڄZ[yh6YrROHH4x 񡎨NN{[&:']n/a4J!o/me5j"U\̩9M0.FV u'Y ?x\Ns@%;[P+760~׭5 _WM숛=z]]7ץ/*3*)%O&.$k7V*sވjrP-BKD3'2zB z%RD[.Mu=\`j &~NIQݢ=1YdMQ]<Ό2,'ByReU|[ ^2x pr)+Qj8|ADmΈo9I$ lez[C%hC<*0&pJGq0lF8R@-L_G`LCcb<:HHfn&L'u(8ɗ )^8ͥ򨴞'l#h~}sfv߁),}Вm\h2) zBATNeXomR-&3SSetd?zE6wZOFgR.ƯUSW nĴYP5,C[Vh H%Zшi6|"C8f{z*Pq*]Z7ТL<'_ٶMh=ud ^#8qc=$f,֘h$| ̹P$oyҁ]>kh^h Lg&9kXSt&Aaz*yOLwbN @IK4uN#Nݒ@._YF@ _һ+O&M;;<&!|ޮ+AסΟ#찥;@}g︟ڡ7!%_t:dŶWVkXBchl,b[T#&(xg'C,*$Y7 ]oCq&9 u~xuHBxPDP_@}"Ϙ-3ZPWH  e0s{  # ||i2޾ >uDDBdl+k\"Z{╕Ko4N0) fOKn:GR "cܧv?N~n|G$k<ދ/V*c`CjvhRN}=_*Ez+E^2; E(<9(iItp>Y,Zi0,o h݇<"!OP؞{4L2jyb Z!SV1~8ؘ-ƫωM5uUkf KܕSV-fҖz)<zrkEJ\n٧ʚgƽKLjw1)6a(W^ M4Bz>/}(DZflkɕśhq&_ei'^h^cwH~< &o%>i r. |Vjeɾh_)9IU!ЩzlX@1ij/{Y`TeR y9|/tY!o6T CTz}DKʳؘFLR\)|f}ޖ %yq]]9|Qgs6u+hV 8<*F?ERrkienVS%_XϝM /G闈@ FA"`f9s=C<]񢷏SH8쯄NbVG_"1@-mmt'RRhuӒLrX)Ɛ. ::Ѐ|: >ddRpߛp6xT'P" 4)uqX*Lbelg8V9S|t^p*>]Q:ج+=%|7.~bWzh4:[ {N%k芮1+|J5iDYV~LTZ8 f#[a0tL2:L7#6 #h~8A[~n…eOEV ~ Շ/NWźn?[= Ĉ<뜲ou=Ey_nK7yܣf:dq) ,>[NEo4j?R*?i`$)%\k).ӅH:B"j&;[X1D6~k܉Y o=]e8$J]ՄaO-v}˸f%xCk{ǮnBS/2qBg\8wcCtčEâ_i츕LJ_NK4e/{I!kY4]KR%>*6/i\~J.vZݘj-+\sz9\93E_Ncq/3ew˔e;yZz ̸eI4UiX#C߽xe$@5i'מJ ᴘ f2*pƈeej5yU2xَըv_h2 v3ԒF@+ܱ2r>bq3ewe UԻx-Ys*ݜ"ݸxS J'f}{q_b~"w '@b1H>PdzOg ڍɜŎ)O{kUxqֲp~n)f#1jf@ Rn_sm<>SFҧj -7^g0ˡJI.ʞ@(+Qun GF]m~^yyUao&ܠďo V9CW+`aCԳFUx7}xR񛴊~:% h?ωF5(VVsMen)#ꌩJ>w 㟐U矿6o U&X\{Xv9gL\<(`䡿/"eT}oIH AVpe8+4wyLF_*C[QCrOucH56QH֗/ n!_.ӱ7V mq?[{aFcV皣',.NTϱ[k30賐;V B(3xdm{^l}VI\kR;EU3D'ce.tʄ ' e*-ZfHR?y;':gS)vReqvl bEc Q G}eW3icwrBx e08& ylz%e8?}TDl]sdlȣI@]/;xfSdsN *jA M '^d{14Md#xb->jZ啵!]~YJg}en:!ȑk%iaW?&Տ}]t髒c,@Jj$mw~&<8L$D%s[%δC8e:ա!kLdP6~|UQ%of2; Cýo!ٿ09Ц@F윰:-ńp^v bg *1&]RPls$Svά(soGQtx `Z  O13Od"ҝW,g6*J|&n0;W޴}̶ZnmFخjC\oRÎD$: ͦËK]?a1Y*WžP:Ŀ0~,49ӻ>ms6(tdnVӽ2ʞC^?}FbTOg~9 Q3PU? Ms|KҸF}V҃E'/K.(aī{3ur%rEˋK%۳2F#cj`3/VYԔΘ KnARU å8d")]6^ FOm/> endobj 34 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 35 0 obj <> endobj 36 0 obj <> stream xste_ vR1nl۶YolTl['b۶mOuqsZss!'VR67J۹330,m]Um偦89 #:9[W/ f7C jYyy,LLh0s7#wp4p@򝚖fnnn11;\xaK3hO #5@JV(3?v8r$w%#9_0q,\\xRfP f v@ƿ5LEmd1K'=ͭ/ v@i 7ft30q?y8E2ٙx9;̌l>f8/g@++8ff hni@X8Yt* `;ojog F@5#DD^\zV6fLY:B,G.)mgfQjT?m26.;_O0mͩ[u(jc/ACP_EEQZxexHEmL)bwa;sh,a4Ut1'ng t*;[331j&v@g/hg?e3735鿁hW'Bo@;rDXmCFk[uiZЏ ?p_|D vMOp ܧ>|Ry;8S6'w=qj*O;Y$$|^N}we b!hfXZKVfl0O/L>EErXe_ fN=)1l65kWlr{N:ac.q0]L5ni0hN 1kҙ7 EjՓ`SfE@Ļ]&i&˘Bʆa0b(H$=x~hDx2EcSL7e`(cSo(A7l~瘥 NMzO4\1f{_r-UW;9^֔ckjXIYNѐt4}8SpZiۤ@o( G=<@Z=x"*ϿժV嶡a$h[_(3r:"Y|Z``䦗$!ULb2ݏ!{}jYt4 tog|Qک] $NwH~HN=TpC(t"Zy" !j*kc K/T SX`koIFY-5ݝrs,=o'{l{2C߉H` ؕ5q:9$Ҭ-kR䢏It$ u)Х 1jpeObJMN8"$|tʂB2Ż-Xhƀys 8wp_6l]PnY)סr[|6$Q kFL k ʓ H.IO_|M/zh#ySkzu53AKl J3+rXw֑g pAuڇ<נKI*IՄY~zc,e)5-+/xEwfOœ瞨Un.gߚ51C.a/V=.Mc@5HafYxteH㳋G效ه8ڐ:c%}YL.bӇȦTc=SD;B}P }Y$gF1k>}hOayeоϏ¹1'< _E3RI * *@?/&$"3v, ;ȎWdZ($NU7qr W#|8. +5?6:P&?ְE&1 \⇡C\Q2rp wP]!-f/ +e ;|WߡP5⾦w xQHE ű3&\yaCE 7QwKwYCfFU?h>s'=,4eQ\@r޷2X}wj&(Jw7M9EAˋ~c=4cɻ`9^nmP&}d8t/ Ë ~?yJUlZN\Ycӧ4˞/OIpWGʿ%bM8,niApO3"$-PCx} *'׀yX~TC4SK;\dCOW<{EP|BfCfq媱Rwi[4qLD%>; M Jl;zT8P:\w wQhp @m# ~h?5:Pyo^C}j& enU& 7yJ|NEL{\ʌĸz\c;NrCg|ZT٤lق~ݿJc 1I O#Tg1\?b6l(~^*bS]D 4Vp/{l.v0xydx1X]zFxރ "Vg"_~l"Yf9(ƀVзS:Hvj'R"@܁0CH6LcaHm  VH*b_.IV%z^cxF84bhLm6`yG+ ֓ma >dRĵ9:, o3WVSQ@̖d- jɁd1 gpVeL70A2"vUgM!@k ʕE[>[3u3 ܔ>]SG>sVZ +Šxx*(C1CNpR؜>AU WGcЋ4#PG.Z*?St{iߣ{t\NfAϖ &AA62~Rn^Ʌ!(Ecv!F)Qf>)>Ks˄DC* ӼY^%" viVlt + pd^+1ʃvb cGyE/u6 7Ft@][)@CJR%$0$ y$1"p{[[; -5evuQw|(Dj.Csݞk%:kV;xl:Ŵ;ώצ"|LnϺ[HLpaA7LE>m8Rҙ GgR@K27'<BGo؋ufumSe7hRߧz0gqSY*vRv&[LsR: q 2nt2E.D"ǩYJqsEmxMg7s~N.{CpRncO Y,+kZb[6t=>(wp3A:}#eC}@U'jw'=U?nF@SnX&M˟ gYl،&z,J~)l 1(OD=ڋÖ0D\0ᦼ'm W{DX 0_<#F*ЅW6ex L& :{I2*^5~N[߁BtmF"<$FE_N,)F&K,#oiw nX$a%P dP; V:{+Y5EۺisKg%L9hfǮ4'v,S%bź>Xf3]9vG"varnړN6.Mdn5N,I8\4a oK"]g6_&&}=PQ8F B7wxewlP/do.̫p,,azITU2);<\ri,?tk܃ZL7# ȥ2%E)L<=DHt|L[4h`#sȚɭgJvs:`Tx:,R6rJ |P2=4+qCu۰?0iMb JavK녖yuj;XfUwDk)PǧO.X;]w1ͳhu]jkOmU}il+/aal +k˞;g,Fz+Z?|eH2e6BVkOᾛ=(*TgSYVʷQ}dyA6"@ dxh4or:hžY^bziΝ>j&b{FC18v6߶.VQ(Nd4먂J }%L4{?c#S$v}kuu tnF=EјY̏Gķp"gg}}=h${_Qh gݎL"[}:%dMwg-=8ǝBYIUhEr/K:,;p/UՃ(Hg_r.a->+${qQ&?g0R֦sZ*>+3Pny-t{u@L\@v_k,^ ud0*8Y+q=E{gCF쒓f,9G Za^0@-]@Տ»~ lDRѧ6DJݝTD|;mX3@aAɳ]oʏ=`ܮi7gF$i6fјAEY\/M^lH7um.fOvdӥO jq:RUojME/Hj-ǩb$Pg :᮵~HֳI_٪H\j+ |[rslބ١&Jϖ|DʛT#%.' q]q}00VcO͜S͔JiՕ򛚱^X+7gp'=LrB?9ros07} Kɿx/bV.]QAޒ*PCWP@+:Ƈ!p?QX,NM]q*BpRPEܘoilj&۷JYC_V ׭xbv(D+ԕ:R)&a.C|'23M!KS8F0U LӍ7Tu4i'2_}$h Ἄ$#CŧA޵X2YzPLA)c~74 *|-R,Ӄ;I9J,0@>}LEͰtRj W{ϭ:_AeV>Zw0FT,V iAtk &[ N.5qSfFR55 ̓D-Vf=彩g77m@CGx΍j?B7)n##DovE6\ac{:Kc$HwǾBUjεfL1!!*gB i2zz 0eã.N\b5%]$kfqԈCaE)GJqEi 8r3R꧳v6Bo1s\B7RB9bH{"݁Q{.B^ BOG;U2\\&ƳE㛺TmUtdRҷ.jмd".tzHd4aMq/5UUk[O%+ȮWI7]ٜ:46-|#;M7̊=6bSMp_8.Nn)OE")8,HJ6%=\Ǫpﲼs:m"\"pj2Ow!2?9`k$ 9맏}tu16B t0s'vaQIc~_wu{vҹT30)Yy{Fdmj g(zPt`$zcG2KZ< VSu|/֚yAPj7S6|lXJU:D T|1n8Rٛ4V@&[YETc_/$G^sFn[?v-k 0DݼDuD4K0e"AqJ;>r5JڬHNa:b_!")=Ġ=v^KZul\%FǷd]ZWLEEr_Fߥvʉ\RQ>vG,kOڠTlQPX].6on~A'"m6XaeCI~K?M4뫉2:v%aU%427QtɌ$Xpe}ke!X =q`{^"XB3&'kqzoyD3!rT2X/_4/a7#e_n1S0p𫖞')xM90 Q~sTXa+of6C8#3HxhlTCbsf+j4k/K:8&M0x[0[ md]/W/k/"03Q{H)8gl 6cNvLz5FmW35;0N2b?y t6/6^'A>S ^Qms~m+Nfh/2~Yj ʔS>*YD肤 +}e#e(B5&k@%?ٚbDDX~MiotKjPAÒ m\ad욐 Ag@Br;.w>jh&$bA Y\W ʜ7/fEߗ̌WE\D5ʂ TT.T !Iu5I䳚9΍0H{:D(4Fiq@ҟQ}v[SBS1i$X[yQEK~gWJ C@1G%"{tjC;;*c |ǣ:jEֺ" p7b1{dWt#t]ٸ!I+v۶Ί6~dRq-C(ݓ 07T^I6 o~C#-/LWt m\{t%CBȷw)>#)QiJU3$vBYb#=A6# E0Y´EtWU7F!ޓ#5G~zxgҾ$UO0 E;"/3wz;gރ!l=  mWlW9L}P_Q(k~뤯^Ѱ;ZS1FKZrQ|~2/-q"lW0y?iCpad+MJ `!ր$\/|l)0Vb+?*Ggiϫ(&>=z)d/KsZËSΛ_.<`\!%L&Z,@[t!{ %ƻ=a%1i_:Ek]R7TGXId$;sr8oYC4ƿW1FEiJmGDhpJص=-P MS*B(MZM֜IKGhlk/b5SjöGeg@T [ew+`;\Q|ؾ gr)0ʑLLd_ux{ o~ d?DB27LY|b[@vh)2!SKai.d} ("7U/Wc~1P~1J1{A &?,زG(Y5g2=L{};_GF_q(lfgrUTU;_@5Nb]Vϓ;z?,*63?Jd;u?gSZ{x9q0:xbl}15 Z̝x6[EN0 +:+z+2q,f2pzq iG P\VT\.ߔ [*,ri'ǭ弊O?pj:\1"qBRynMu xؐG~)`d\#;}`1f.miwϴx~@i5'vz-͡2&bAs8NA?2?fY9 X>)>wtDbW2^k~oTNy:+#ަMC֎<(äݼC3C3S;]&TŖ-n AJ7no$Ga7'{#Uϔ7 i%ZKq ǒB`QnχkYd"rKHc?FU ]?vmabG\o\'L]BCyY^`1fgRj^XԢ,|MXҷa2hsf?]{o ]YNN  Onf!쇺C+= =qnDO 3owu/ߜ4i<۲h$zdE†G-{~c=}9ڳIؔ-Vy["i +),1#ZE&i]$p+(O}`_GS#LD2@0\ngA"rZyͽ6x-Mt#'e yqSN{YY8N.)+ MEvR^߬C= I<5P~{:O Y:k#y\ 謺iz29֧~C JN竺\d>Gk&WL/~iA&,ɝQ^euNn=O \ٱ %-†H5v^*_Ε< BI ,DqS:&9ynFECxCļ>t  ooW젊އ! pNnfQםP\FJ&{rEX_uBwQ 8A| GZ.!{gz>^nR}rX A96+ N>ɱH4~PT }xpȘȑF[x\32a}tCORˎ^Jޟџ&2u"_Ӈ”1?gY]ǃ]Teb. H hDM|[M$n"0><2I0?-4 4v ŏJ.yGՂ6p_ $rHH#Z<l׆_o0Egw?(xǛqT_Tv'8jaY~S&"he2PD%9Z9-λ$ɚq‰c׵kPW??JSF(&-W- wlX|0ZEI&H8D|mA!GJPP ]TPe}(S1O4>^a)MV+G2 YrjiG80f h2}#-c10K}r؃Q af|!- H{zg|]cO@$Q(`BH> 3q>*B*sT'W&ڤl!mbL+Y̹B[D-,ұu_fŕeˆ %8č]2*º͔dw>rO#" T.*{~4݅q)j׌I?K8?~<kN [UU ]CkI%`3Ñ3(r؇f|8KD+.C5r{wH5+>./Ǥvo  ^RXR( U1U}dm V_qiR?ݖ}5j0L|r %x;:9߈n 5iܱO< }M'vqqV`Uēͽ^r7h7;:ȍMq>u>s:o'1e~#tu4Οy6.\:7.Wq$΂B_b(Mh[hP7UiK0S@Fn>mi`BSuwc wjoB}pj^lffp\s,c{aѬ!2Y}$*Y0@sa92ccGM!p$]fIlqW>wtrlz##B z81!y#-Է#: ة4j$\ Zɳjl&0A2:F뼱"h/U7SgU=B- qʷLYYqS[+pȡoeJ$#l=C4N? 9R}C)2|~" 4_q7m ² գtuRb(ߴeOg&11:]vR i35Q5uBiq䊇1ṻ%ByCI4$jk2ja\fpW_FIG@so'bu%< GD'[{yZHOx eͤIgpi M7X.iUJdA5|uXA=dʵZFLdm8RJ3QM BeE7TMۖ-a{<@NQe>"(\\yB偊Z7x^z\o cL 핖?͎m]#,)|FK ,]K3 $^..,;!hh1h!יIs^mKkSa.P/ !!|ǡz)2+mc1^FSN>* &Ŗ_CߠkrÃ$۵ԑDg{b7M*rz-FP>h¢2j#H- QngD. A+%q#6PהWIm%aO?1j}iroY*]$cM}(n*Ub!K$N))T1&<YaNObt##;8uWX %?z_J|V26 2)\[^]R 6}^ ډ*ma*BhghyqZyo:7׋0M0UDU6r e2f&YБC=s]ŠvĆ|!&83'21MC!GeB3n/UыJڊFztƽ !LWA<?W5Q*u23x)LjqwH!a2G3@=, Μ-rFXuC HUL}!|)BٟtQ8n୞B "OJcgJ!V)*zC;%?@tu#Xg'X㨮17ic믁[U;*'[6@[Sdj鶒;edI9߀CRײknNݾ=O~'sHEt=1[/gy׾@ɭqgNhQٻ$tkmR3Y04T=^NoQT\Z5yݩdhӏI_A$H3:b"ȷ$>AU1sIwg%L3BVn.4-'*Բ>h2"mS6xg˒i|sH[?zdG~:bcgtGNhVZx^$2HԞ'꨷3-O2.p~XA̬; V:,ޙ.B= d@D#/tfpuq%}PWjhؕ.|,1wmJoyioxG=a`^|5J:.8wÛ~Ԁv#(yvGY@?&%^[+9b( T.ykh~ֽ$7ߋ\䘪f Ϣ"ظ ҋ<^L@,AOopvkU Mp֥ףˌl6/lD ZEdx>B 8\c?|Š)@&7~\_ ׬)"JFPp^W]t/ôsC>=_!}[d=Ҝ#EEp1a ZN&ƨ/K0J-v5ߖ?U`!6ÐnAvWoy(q MJnH;HVy Ž)hD6ٗ#*6bR~:{Y>"-(}I_Fg), FY7 jgfTsZ=VAxXGc?7[-mU!de=GOpYU)ؤwiͨ8`yB,|X# JM_NatJ1Oe>QőP)M( 9/?<ED-h_!y?>yAezV < ^9jT^;^ojгGm[L蛋:h W~Mֶc=)VTYZ)+C-_BZAnlm~5ZHcDAS P݊)) $*3?G`{A Fpܠz M0 zIqcz-& ھfbi`{x`ꬺV3* ĎY`ےV~%6?~G xke93R-x|m;n16 +}0$Ҋ#3f0amh@1%;d=ujD:ށm DBHn @E(lZ\OOט˫BpI"]͇86r>4M8-T;jfȂ(197=nErg"xBu}#3<UtD8CֱprA[Q7$PhN&nҍʶD&44.]b6rvیly Z@ $@rOBi ^#w[+|lbf4qIv&蔱 !s5 bbA)Jl-TcoGrŏ30*F%>HI2cj*'Au,y5)q뜥P@?40o^\"]G0|@ qC,SD0k CB%F"Vx#X=ϭCkN5pl,>+ԃ&4L#mH @ķC K&}j52OCZ>Hzo2{IzC~~ژ' dj~\ƑzSuUbM+L҃J9~o.9DnPAaW~S#6M4 ixjж)D0Q1\TAE<~(ibGK'HGٸ+Â131Z"0w.2evD`mC|IRT nWb!t\^,Z8DT93-RPlUM>.Y3L6۾ ѐНHT/7PMCGvT-ЬޡïK"aF\X*(ٲt:TO(Os xm߇/TrO pB 6K?LFtbe-uêȗ$dR00-emkY\ւ^&Ȧl>У<q59 Ӟ-\Vs9֡6ۡ +=rdO7(:qMh>O`CvʽY_јw-Xmc9PLw L(C+=3쎫񫨗Pi7%0M ,Fu_|b;Ve 1'~ր?z,/l(djx@ =G9@ ͧqgԬ%}jE9it8oAUog|(h{ҸĀPѾq 11btQє*i{p/rew* z78l8A[5W&V@2t(ҢΝ,̀j"پƠuK3+Nw1Y(Z.O5>wAs=0,9PTMJ;KA^m2A:K"_U@2~MF?G<ߴ!UNy$šg!9sBXA|=C4O%rp>"H([cĽYN;Iethfݞ9&XRCrVnQ (SjU4cQPY)DKl0Ms| U`S,f">߮ Զ>tM.õ*RS[v?O'g7 0ExyUD-ީG9R6rv4:-(i[Pagf=; 8AG-"QY W,OQ}2k z'1A4NvG<,0=b@WxD+TgqG, Y- x? i*Ǒ|q2KiȜt-πҹfQ Ãr=tAJy݆O| $ڤs9LW`'> UPxB.I*)Z)BɸCdHsuԁA/Q]TqЈ]JczŶJ!,~zON'2óV4!@oVv=YMrV!16 2+vWQn&l{}7U`Ԗ]S<-Atr‚ >Ǽ'L*r22B'9{%}Ke ]wVT eǦDPlΤ=WnSq# @),v/nSap4sY|ˏpCţ+(Z;zL. vQ;8hw "tJ6Y%o`7  .ؚE5]NQ2%<ۜ8Jx۷Y.z0Mr4 j"XdTG))Eo+>dd#\6Ms1C7L&I ^|۹:R`-i6 {KJ^r.ygA4Q\~\s~,'|3 >N7FLKokU_D80ʷx}XfG&7V au0a X6UH@~9wLDJM@x9zKhW&(OT'ɮp4Ή%/CWM3h!3sT'u-QgF=?{il.өIԛaʲKCvRH(i:" H{`.p+~YUQBq&r'钚M(:;>K&MG;Lsned:HB P}v3Q!PU&ǂBumu*^̮:B|0[ ӔE͙kFQQYnZ 2HP}Eln?cB}ycrwTi j[vE{h8EքZ4ԡ9/8EfJ ]3Ra=`m"jpʨ4D2wh!\`ͥlw-`xzI,>wrN͘?#_a `% 2}\1DZ~u43n~Yz{rqPq[kRۇ<5 z5FtD#T+_ 5N,Υ+C uL ¶_ ެ`Vc=%]lyjQHeBM`(C>!>Cџd^ZF~>#g!Gqq~=Qؕ%.bšt+bHhRYMP#k57!Wlbgѽ4_fnM7pVAh9^3>ecs;|qdګ@Cn6y1JNUҺߤ#+f\(l2r_nky?0< p}uW\$Vtq4pmxV蛏+ʷNQNhfk{[ " 暰_/5i"|g14/|(v=IW>vu ʭ/21k}TW;Wv5T八n"zf@?&6WK8?P]NN*# VZB]?]O5bn^ 4wRVL]5*1J 6nqAE42nQi<}X횬]POBH_uqȕķrN>o_h!l}9 ZC zU7trf3<|?s*}O6t?%^U9)3E&4Qopf8P8+:?fjMIP'PAU[|qh*tY*͵"Rqtԝ1M;{5<e(TG◞I)(#ZI'(FI +BqO{աkcȌ7h"aAmj4#wwĠ NKM9` ˳C:^N_AԬKH6|]YHm(ř* 9n!KF>Vb{;Р8 E|W!HvhKt`΁u${X_MC#|.%r~]L-fۊǬZ.fdI\xrOA:.sR~N&|:$P8}f݁ELY{@ KgI;#RɄ9CЎNQ&hClSg MCY_C铥L^X[[?|Ǩ{>E9^^dų5FЀFfH.DI8!p#okdsD﷝AMZʤn-'_lY!{00}F h`_Ԉ2{8^NJH& BkS.³>GJ>f 5m` QxBs!X@ CMa&KqLQ^x3{\ D ֽ0x"!X^OQOOXhTFe4Ch%-Ĝ6ԧr"i(s[0*U{7;}#TAzTX}W%o>;=z[J$ RյXQ d)1`)dam?t)]BĊ]cRdfwJ:hXr*g:z5uq}תj5E9 aӮ[A&J?\؀ F$mЗGvE%}= ԟ^I;rXɸa+.q|HVc^SQ@-.uuIョĮo9ƌA ! LpG 4|e[-hV˰Q `9zR@Wn>ؐzKטR*} hΚ@Hf E`ܾ NP 1ݷב^'/ke0fj |'RKW,׆~ߍc/=@8sB)wyr.wMq]6@NYl:J@%fgKqMCA P759?}2l!>jL&[vCw-ÿK+N_(c 5+`ϛڗʤVڻB.5qL#jyRryt>yf鞊Cyֵ.$!Wö];.Vq>N9]"XM2H5t#x?6n؟,,'*B.A7xgW̟KFm96Jc1^ rPFd(N9Uk̑M rɠUY ~kXF mş ,jvy/u*@Ute>k6փ҄D4^;LO406ib > kDU[j%k1wTWYrAnn(j7٨HM,l .[ċL)=ށ **Y>մEpw,xO ,3CP_>RdamI |^0A":/Ӡ:f9l\[0̃F.0ˤ8 a uz_*幜mL-=Tp6{FGEf +ޮ|!ӼhHw+,@͈9<#__ߩ+=BZef(1ćw/.:/C5;^8=@?HPV?6Ĩ}| OB~ԡz}a˽&рw@) 5^: !_Z4OٞsḸGG>T PGtrLJjv4*X EcKY)" HۏbRoT@gHalgLalT2~FR]\:׷>A] z-J醀 y^2Ltٻ}kU7#Sc}&ZiU+$I!ܭ^CK ۂTLsdz\wLe Ak$y(O}=G륥ᎆIe`$Wό7d q?% u ^J"\N\Ĕ"m^/"W1 rBF̵蝼~'rlK=qSNoN5?@Jgv }AͺLlwd?jKBMfdy _FR#J/LLHoGW$˔s|EpJ/¡KLw͓ G|}kUWE?_4+ ^h.QƔǟ? ?rb,^p`P1-o;iE^^XErPݓo躄Kyش"SdeȮTO }}=hҢ$0S,Y8-OT:zZK-u'DQY!CnGaYnYDD9c"8 :0Pk[Y>'ljqkQc*QQLuD/L":n/)(p w>SUՕ]ÌX(Vx("@ua[E 8ECW>&t2=o6ZATBre!_U jP4JxRr~.ϊDzݑה|c1h}_Nŏ i/nN41\U05w]NwftyGwTxes3=!b!B8~ KJarתʈd&ruyYo5'^N.~$-#g^3usPV=P_2|cJ PqFO0W-Ud:;"eHDˆ^xM[JEԣퟀd-yӝXB˓0\Ao1=#\T8kfv{PhK]E1BK=*Ӱ~{Y_8Ҡ3xd94!):Tƹ\b4N7E 89uMb_.pQVfOkA\ϰsՆ|yt|s,nz쿀^͢BL'>.FH&m샬u~3o9S? ,iќ)҄ ai; JCHyd(vd71"uX sڬL)+x<=53%ܩ(gk5{gKyK^P FRlJWC;;IԈ +Df-2l,zOlלtjڒ.5|W7)4QrFaoX1OK=h8^d1C^zk8]CN8wgz4v-8 ZWR'PuO疒KN,GX0\L~h>7# }+PsӰW@]Qil4Viݪw^OQ:f A`˹`R"p;GĘ[OM`ztz\qī@\@;rŌQ l h:n=6=y]Sd}5Ƶ~`NJTR\CEX_jVH>7k[))ĥf_^pQݩh`nOa2G|klR[qĹ}5Y{ᐥڭD,Ҥf{]0u=\Qwf`"C$!\qD Hi&+_TĶ됦V,O,m>%m 3KZ" `ʢVRϋ=z~:bpwccc1kP?M iqq!pa5zZPwQPZϴH B93j㝿2lJ迟r-ߵ1*KQ0e/d[œo^pVGqB`],4aݱU{\.~,(ɬCLTjuL;I3&)Y,aN(S͌,ΕfU34JtD@ D i^l ]*b![ B.½T[;1LkxWPsMvsoY$! +j>y͓9D"ʏU2+=Nz8ͫXŒ1BM:y2TiحnufG1,@\2P>L%pҽCvV3uQ ܍]ru(;Z4$[_u4!PQ_e$f\? 0*}"3f2R_Chb7କpc%a mcǪvw/ M/zZ %MYVP 3{zOL8>Hp'* AR)!@-6mcWҘ8><b(+s X 2.G!#%o&ǁIh6QؾU);ƈ?'Hr"0P+{~E71o78bӅm@ߩ 5-HfEBiudCwu׮Z,JptT.g<5?f_B%'?R=+" t0y/HQJxSY[ 4|-l-WdҐFb"=jľf0mq "UpǩYkOC+dlTL·i09\6'ܵ7nQF!)CIfx7zХ4/O6m8Xեnl@DFqWB1\SD$nk&O>݇?DLnE; _g! SMЫ Ō_\=i'rY YR 89(b})릾%#jMwqha}}Nobץ,XQ3#Qg$dJ>6 %$K@E+MZ{9#l-Cۙy}~_A;ח5v:j?)d?ǏC_:D[״u}!}4'Jb).8CfA٘Am%8PDLwSuOݵ+oxǶ#^؜gݘ70VB,`rPEIkBU8`U"UI9 L mc˿7GAV?ԧ } -6juz3G #ͺbSx"[3 L7LxL"kDCRw8no_Y?t9 g0<^YZ\ IՋER6(xDc=0 \epv7Dl)8fyM~0V\ v^RHܠZ":O$J<բ-9w&@B}>y~DjGl <^B7?tq ``i\=%3;do{  Lk>I#P='"?ɸ G{lUqm#Qc~Ta^Іif8l<~Cg{G0J9R<ψvp^+b _hIew*!vw~,JsQa^\`w$^}*ap7y4wK'UtN O֩iDmfĠ[J'U p^*0޾i/sJ詬>/ipWDi(^kI &REՂ{O P_۞ x˳m W3lyɰG3~UVV$-SHޠ',F8<tiJkNi 3r}S'H{* ˇGOzd$)FvrˇU Ko6|U']r j AVHyZoԂ Fw? y{)S\a7qƙޯ[)_ќFf_QʒI0 {$!+xN?L.VX:Pp0fϡIbXH>i#o:%&#NZ*1?>GObՅ?N-֑od/׬(聢 :i,\w[|:9=kL5eԻIJh3@RZj[EWo9dZ~h >$T:J/Jb?/ v "\ż4b0{R!| SyӸܲ_Y nWS/wixg.$cOX8EN[epLe~q  !Go8t㉃(d@LMnYEnz-W{z)q2w?ajDwSM)jbUNђ##va G.Q9Y Z׶DK~n u'W85KaY!@Fk[aބ\yj;¥iLu:ۧ77mIiȗ-K S`+sr3x'A/[&:y7^Ӽ5¶H[2U5V$D;^4JG] "|`5 ?Iѱφ* '1wf\D]@|1gL6$ l8|dQi`ϗU1Y[#;x񡷙p< TFN--4m@8󕉞Ȩ]f5j"o}Rݧ;@:Y8c0%U& W\{88i+I*>/`RT'Ӌ7f|c^ŀ U\7.N!֞rsO6m*Wәpٔ{ҋ;pU;63xv%ԅVĒ ·a\"ٿh|ɚ- kƴTKCHPCU`;`)9\ Պ4R# Y fP/5 ^Ē1Z\R=h\qwv"k#Q.fS I;:HWV Q(cx jK Ġ!p,ZpLӢzw ys^EX.nu . u_s΄k!t kB=g Ǜ]_2#uQs2n1%v ֛FYmS%<Š}7$Yin~<!*H .r*Q_~*8KENI)j=qH߉7%փϫ:ĩkaLb^wL1R] 302jE B n0Q .]#^x)ȨO>(`9&m]fN8aR<ۦ,$]a7&jYMnMW;v2Lc W .@5lU>Hald0"&"ћװ`90oMj#o1@οmClG!c&X_l`I Yu,PKXxlyֆ@ŭԏXAof}E4/Z*:[E*;+M~.[A5 &iEv:G]BP\jIh>QsL935smtMI0fD 8XƈAgRa 垵kh w5|f/'c2;Ag{1~R0;\YG 0?cE?lfY {T`OzSq0zn$*XI@."|.uS*B16g- CCn[a:̨#xHAkg^P: jEpYqK=c'K.<o{.1r35|?+O*0#ej6A8-RpJ)qX<i }`-[qr>T#Y>@'\$Os 랩c$UoշFiCFnQT}ӟg+H&HIl4~:+k#@^u?d!@#ErQ{XAk5u;hԜ i7 =mԎ)brY,u^hJ~ӰY R#1v@uT:|(8kxcrkhEE_ I,LJpgX6w:!lkyߵIL5@=& XqtD~K`mxthZ $J-!Ke"s7 l!&# 3̦81pԛ):"ijȷ2\-P90"aPueAղ'Z,3'JʹG e@[}@4b\/ؾ'tҒ;]QPr`_N_j˧J^gm%ܽV-idZ[ʈnf{nGT0\:v&]kk$d(OXY)qz"JNMwoo:6@1.Ət~\<2~_[?77b>D^8ڂf7/35 0i֮)K0ء0Y_<$ -&\j!"[,q.7|Zƨ^v rz)#iMqօ/S+miI(2$e.7+^x&7 ,\2F l-^~ZQ&a l+Fbeu-Z\=9BH{a$de7wD/Zzk̜Ctk,+MқtگR EMu5y j:@]d]3=8mRa?[RTtM:tKus}LY*ynu(Ks%Ub 'w"y#@q|{.II"%[V'cmGvW¹%9-I+|{\+I~'յ2K{#忿A^ˍShP)ڰbZ}q"+t)oΆw74?A\ ]n /Rbw㺁lG 4;Q'_$W,̵\pkK <0cM8L㟲X9l3ѴeKiLo(HGZ6NtN[1S =t0dJ`T1ܿz:f΍\X(%ZNʣ?{Nlh!,ɛ3{~P=QϢ 6"9njX;+,-E7 ,u70VS`p"GYJS#bgy@ QOLn|Wvb:^`/ DM-㡻lC)Ls+Pp/$亂1۱1PFꖓ\a3^*9EY\"}@g2-}xf'77SH䁳G"bW[a3C, !=uj0kNW--nMV52  +ȉRm\@a/ޤDIil?=ʆA 6|ƭHcDAW^㈧XHv@Hz-N<#2lp&}"ÒHpAL)[!3@&mnNa`=:] JZ4UH * A2rap_M]iH | (1$\wH Kjok\% -1νDN\xű4n,j` }m^=0JEv cS~W*\jle,QLTGùr BZjhg5ӶXRQe̡t/ \T+Qu&R6+^my,쉡- Y4, 4Tئ ?3&~r @sߛ$ W䍸i[c G(DSbÎn0:Og ۺ!XM$NS?N>"}Tmg$_#HQd3pEn1YМLeì&+cҎ7;:V']pSbS,\m+ۯׂ֔sVnn,6Ph\CMN`)I~ Bn%obۥADZB+kJFucD;9م }FL^CCV M#ՏQ5uL+M*i.Siy^duOcfn~-Î%oDJ/X0\Qu C𸋰 ^G4dߛ@m~~"$0˙p-Qû]1e)#!h 1yJR!ӎ.kE":m&JPW*&p]0n}p|Al ,鍓 S;7-r]` ̚և)t Q%[f5(4gG}C1 f0^@px: G?(,5p#C@3#'4ywc^%v [Gp=̀r}02!(.?ǚ($P0a8"VJM.89 8%l`{q̖73?ƋWo PkQU8G̦ٲdazDBoꖛ 4!BL?t k_ؑ Z\0txo5ty<71myJb(b)]w}PϼeV(@48,"gL."$ EȀh)evLiEOpio U1mbQbI ޟKl{[PB"[~O:U`QVFcҼ9g&-Sg!*tۿ?>\9ߺb`'c;eStK4ϛתʠqsuHLk7 xsrm"WhMbWA{'r #nv&݀G8_`xk@A;3Wbːp·c1iԋo K7Dy@J5K(;BPbn!=|6n(3br&ӯ iŃ?}-={j}+X\ēE8-'9cW* 0D )n8C6Eʩi[,4m4B5?W׶Ijm}hTOOi8m Dț\FYWc uOIRdȕc&f\6.f΄r-(OTrX+jxp,$ab(D#h90\Cz~:Q3a;Z}XOqWB1^^W<5}[M/k>[--'LuC޿,Eɕt\gA10lxevBC¦?fyr*#H*(N 0d\NYK!d&S %F a~Ev 21[-g)gL&?&U/  ~a|*nz"k>na"%bs1 8ESp\A wqWaa Q&d'hq7{u//%#Vj| 䕆'KoeFɬ2zID-V!p` #,rܒ[,۠ûUNY&ξ%?OfBK]2)%}[O$WX';p 1 794B5*`<쭍(2E#Idϝo]<sL~* NJ; ㋞qFLhpAS6lVH"ӥ}d]#Vn+y9-*ŏҴ(1ov$d1nK xIF995O_3X2%> ְo2E%ʽ௰y*ëiIoNNþĥXۼrjvK&*%$2tcA5 Ɍ$.'K,}ye{O^;'+H!J RCm3E&~BʢUV[$&1}e8k12/Fh>D.U+yBMCQVv " who~p '.a դʟFd n2Vp܋Aق|u7u1ʯ֟t{~H 6DlΆ(s 3 Fa~" 0NWX'6xV OdZ%Vt\;sL^zWSwH[,$1B-S2xs/yl,򌟎 H`+û:t>*è^ʏi ]yU\>@frTZ!WxN(u㓐JrեF®8~u$GNy~iY˗%KCw: W_}lKM1 ^{XTA$ Px#-4N$Οi7ư`MAfpsvÛ6F}CUhp١k(p-uėKb>w|1Бo~+e+x}Wrg,f7͓pryVP9rGuNi"2}~ѠBei*]%ET9m7)"")0 U~Q4E},.ظ;t'yBVjPU (n<&2cxr^HC{0 2۹TmeƒMIKiPq b$&s7KLJKh1B{I{tc+o~-wk*3SFd;)$>>z7vI(@h吞?@8gf`~8= 4G+DKF :@Ε_" O'^͏!]'lo7mRZ春 Zc*\i2활?.k ņ}i(T|} /tC=yU%'H˕W",:l|f"_@'rK-p۬q^T+S^&l1$ >8iж*ޅIfIƋ yϪ v$B\mQ?t(`[Xp\v\ .cOP|}:}Dr-I!oYh5%X]TR'Nm20Uill G&UhR8Qs㈤Յ{Rt^뎗3T> fpĐIm„r)Yİa)@}FWi#l 2 o򾙂B H   ^,Cla٬!)&`BbאDRe3l%#od, !$G;Ua؂y.EϿ4?A.+ jj) $5bI~J$8ˉ)QA'ۥwt&*n=(㳫xυEz5--lE tD-DU+u8+E o 7}E=˺%~FMޱҥ@hq{./=\m91Z ?Cz?)7C26ޘF.6}HJŹ@?Ṗ! YT!I6.H6׹Qq"~r6#h}qK'q^ A[h{gZ DlWuйͳ ƥs!k2-N sG]2 dO(7H/-c:rxC},;uWkv`!Ylr%ߑ\M }9ʭZ- a71jmrYoP # " qF'sTnÚåZχM \#O%._^sc=1%=Ÿ~ RF _sNSc{g(':ŵ:dL0X=T'f+[ 2 ȧ=}]u5ZaEw9;m/Z~*->L\6vPW?g_%#jSMѕ<2C9 [BYj.$m>iCd<YJ?TKXy-m A#*YP .jS׸!<@2]0?`E0 76H]YiNPcx[)#+Qj5G`pr|AV;x1cu¡0؃:z3Gby\'ZtGΏ%$]ЁSW`CX@ԡd,!/%.C=4YG~. ;W/gnN-LA,,՞5"HJA=e}?Z1c0 M!Ud%Ъޮtx}3S>R~e%Tӟ&VT1/_m?O&|Ehb 8*5M7iڊUI@84^jZp = G%궻͋r2!Q/ְ#2Y+tܣ" FY4~KMxDνd'5{#+Gu@Z7JTЧ#U ?*6߿G@TA dחi;a d'OdlуrgfuyN҈Gj҅B J- XE;s!:b+ FD9`hi}*lyva=t΃;'KW T J}Щy\(q:+|L8mGHd3K@ /\'oV `.ߤZTôR~ʫz#ˌ(Ieϔ'_.rCEjM?+H!􏆕zW fg5-<Av>GyDck5t?)"ߔ/?sAd)_u' ̴4'OuI.?|^5Fsԇ(m./-'yc08\WHY!'I:1: |^ dŶ!`fNl{i0zvy$T<Ӑx%B 1+ l#w jVTJH*ȉÈ~\k| ܶ5n^tl69X.R.\K@xdc0]Jag'ߣw0xS:?~c M.\Iٵg2t$/xD3oMfD>::T98z A |Ǘv@ %p=kw|ntʃN^Y u?#՘jҜ:J^_FP;@e8LػzQgOQYIE\rjռ.4ƥ,8b(TN#.2Rr'+ MSVW\~j'ߠjo:3ܥ?[1̦Z H P25"aٷw8R2+?w=V؃*&D}39QΎފ4y琾GhdTJqO4xP\$tM)D@t 1HwwV\LG;NtLh?L?9$Ѫϯ;F l.ݐVƌWɸ@ҍb*I8SSեu;/=dqNk[v9ig@ub[&2&^d)g]y7U7z8sFV(3, E`l6₡ŋ^BJ(lT_{IN2ٞ Nc4OбadjP'~jmNtoK U*@Xp#TjҼ}[jvThQ.;䔩텭O4 G +ydTQs$mĕ ʩGO;[#{Nk=$&vDw2c|9Xȯ_dzφp㎩my^%jm XC^$,Ajj)?"18Ìc/r*19]I?z1HT"GL3-9. ?KaG<8U.IOUCmEeNlm ^$oZ5d3)(J_ +8ܬ$ddM5q)(3acv\ٮ<RcL4#B0aTyGWɜ0":Cs?IwGAx,?B ۉ q'IfOV7߄myܥǑ mHڰA`T Ng>o~&p%9;#;e4Aɹ7 t={sTa#C03ߟ^C,AY̩)*(CkR}&op LWg,D#*Z7𯟰'IÍmlu8U>=ArfU} \0-H~rح^!p*k]yYrϲ+\_֟ zo"a3{^Z0VYUD' :bF7],eHRm|:I3D]+ xgh[7=c xz[LBh3.&7#zRGbԝ u32*$nGp+֌wtDAτ8ɼuՏÊ_&<c0@Bc*ka[7qA=hڹua_ioyOP6[@+.b/8`.eWwOOJ MIz%, :Q2piToQX[ D'(TPY,H[ݢ TchFI* sNWe` 9]3GɫG3rLz/a;n6]q|JӧǤ:4!64ז5>CڻG V,ӻt{}-dAFNܐLs%霯A};x9H[?ݑSCpzΟ 72a% 4ƖAjREkP-Q{d9ETZȏ`UD\R(Wi"4CZy`ǑNGh0`+ส^`B0I-vI5ɝ45bkO;?:\q17Bhj{0,F* s"\7J|>A`F'hOEi ڝ|@"^WmDbئ: ۛr|pc6(oVgp0[mSZA*hzOSgܶQb/!#!{K.¸{JZ&pzG'=jzRv4Jfm-ʜzSOG>E~rh.ׂL #ikԋ9?f U-Rh]̻͙=?]L\1N\\ĝ"`W} VJOGS)fNC0d`3nWo(+*5rv"Wb_'ye¬Dec]y6l&ŞĶ }oe`7FbA'M;(MIKDP5euo3ׯJ28;9o'6lЌo& `$ggq,`~\ۂi4=35־ "2x @ҦP,`i)>&:a!^t?ihYdtkL' !Tt㪳zD'uoϝrz'23yo$-:xt&> (I^ S5rH %^Z]cȑ=T Y W1EZhi(|ڤS>[Yيg<`lCكoP_ޘ6EL\۵>K04Ȩ  dapP?` _L*+Ι%@3y7\,DQPЛgġy}4!iS;cƱ;li\E03YDVlr!8_*r##>}ͯJl݌,q_^8ʐ,ycσsw_BǪF=ϧVZs#F/Ծ6Y[c4z}[qz~ΗyEť^Bp \{Rqڗ=叹„bu"ѳ3;YR+n}-2<=GYh~zvBr녤*V;O/ uyAlƗ]Q>i箭DYNߴvq`]sYGMgѾӸlAd.u3ȜXVazU [_T1drHN~v>%Q` ]9xq (0MǛ.;laL-MeJQTZ.r'ay`~x=~3qJ{׆?b+\~*no}vok D0h9%64i_WPf c0U@+Hߘб1徳yU M؜4D}Ӈ=f<+l6XXKº"ۮPN1$65q\-llZl#XynXUCgu"Ba|j{t33%Y.ؘqXc oϕׄ=c([.t_z`QNbM Yd=yיF7O00&cC\N \rP-xQ|A#U4L2% ɼ~zok`䧙\wxm@ۻ[$1"5G]O:|˻Rƌ,2ګB)-R3\Ա램'zmڞA7Pph~ Y8o0&yD>k'M+&7M3ZKO&吸Qiùu<9Onj 7Y)_MpK| ZubƳ+&nMIG(9Y3$T6l&0$- [G+ޱF$az0TD}e8=R3'jGh3̽R (Ϯ_+<[)jSl1@|-) (^FH>0_}e`h LUIZs,5ߏo49*Kh#\D(_ vmp v!7Kv{<wݲ/ͨrҜӧGfNM]%Փo*o+lY+ǬZHTy 9a]pb O۸3s9 +TQoB$DN@vv"Bi>ek/;Gu0ַl Jק<^CEAq,*ʘ6*c$z_E(:}Q J[ܒAOTM,(#3!7GK3*cXRE[*T(lpQڌi-tlq-)nfk/F,֝";1nb νkLj5p*ײ*B`}ܞ k:+ywrQ03?T-2? zz޷h7sp%{JuX`,;iFa>嶇]@DSf-e0)V3&Ǟ;QP&2i= ܆o%)-zdɔ7}jD6es8@A܈eO=ȏwI0;]agNi&``WnXow#w6GRb`>~R@ƤpI/ 绠WqU^MDk(ƞC~cU)) P6ÕFY(}st.#% ͉IwinÑʴ SZj~:Gy U85j?HI' aqh$v @&T G],>#7(EN'P7{ @\ӪW9r5wyir'K )LA j`$W26ZŸv'qiq #Z1 $'\t-thW4;Wn%?'nCO(PǤ w:*XᤱQ)P<(X< #՛Ss1j !2Ӻ 埃~&8UK?Oe ־ U{&DJ0N -p׷fJ)ΏBi` ͬښ$a*nsJ2q5V@f430s e %_46 f8ɽٯt[tU'Mba=.QMk`:pmhKWuhxt&?PE9t3+!=SHiiB+pr%:#q#V"J1ky׾Js6~?F]I{C_ + Ymx*+_(hxdfmuZ=v9` ߞOua㻥_AT- 1JU(8^\]fOۓK]U9v)_7%NNj=W6Ʒ X~Zҽ!CJ1R+L[fs7.Zӄ6 ?y|>c7 F@a;o6!SDZuL6|@_,@ZP7tzJPBOf);,]I-'GU8%1wePÞ,2e FuO *K򮜷6P沬[18| j-14l F7Vn'9%9i/qe[6ɂ4c!LRo&j5#5,m",z]~6QJ;@࢘CfZ+gEnCwnf>GN>% /&v]Jh ԠC',4*%I:$ؒ?|T&pb,AB"K>gMitPO?sh .Gx[2{a-u00/ތb+do HX3_f )n=l%D~W0aY(('[6Sb X{?LKS࠾JZvj^mtbm&~u>!8-zkZY~|o^2f Uy|y<؋?ԗEj2r[Y*J=A/T,Z Z'|7Z5z~A1%MtUA !ɣf%H;=* &RՆGs 0tRo"Ac!P>@䖣&cږGHM1@eML>kLƲ/wfl !]L܉"Il kbnj⛕ dȵ[Jufhոl=t8 e:* =y;xon +n5Ds2"꠯2d(Z6]H ڞ**Jܳ$CeU*ξBMMk|n{Zڴzu&vTH3%-oE#> >XERD8DUpZ#" ?~/9yLIC!HPTZ!7rV*/eV`' En4|Ku|.Z5ZY*;^5ᗳ}8u,D!( V%8E ߳zb gO3ZxcןuOh*?.1F E *-sqN'pA?qeSEWne3wMXyI3CmQդZ_ѕR79oD;=pp @xRGIZ'c#!3l*(h/nqgwB/lcv, ,mDT\H<yc|{Y_D5%k5^5ěT (fi"MGeU]Ӊo֯@-exQN]4ABqj#>pES}qfv68QĴc$~c]qP^C! +CN tsf<~eDDUIx)eq@J^׹wZzT)hV"YX#1~&fSC]zb?0:FKd&cVtď0ia)Tm)x&}G+.*PˈFFP`M:+C7w3LC)UW5æ '?3S^il6ݵ &yz bxkiz3Qo.Bx߸*/0g!>5X Jj+@mV53f«cCQ9;\1dk:9BgsEזo%z!F{ZJ8 ZL1bF]W(>e  {jӺ$O![m3Ɲ9'T!K9[2 Ca-!FuPs)b][ e'q%3 |fbɛ8WAyLӺs3@Km+M0WG|mݚ{Gs)s6{KX[>̩nl $h vd,$^E>P,TQbnh* bACBdӴO(Uꌁ9zz:QI;--й e}ݢ1\xWFf^l>%XaŹh=PB!{-y

~ۨu!zw^6ye1'D [K Ϸ$&}\"Am]~০JL)AXiR|~! 22Wl$`򮐵{UFڭ_9t"<3B+u5n 繋9ҙϾnJ EQL_` *INQOKG^XT0}6 ;1gp@mfZX'<$U 4r5vJ1LGYs]*s^Җlj >YPq*^A\/(. 64}CZi7Hr-krﺐ{;-T"u u,Eid!7XOݢ4q<)htsjR.rIhe7E**̒Mr'FO[$ilwCu,0ZTb+b Wm1 B TBUf+i:d0B"fW+Sm |DƕK~yz ;oʘFһfQ~r l%^,jZq>qThl6''cAC盵`)ʪ}ýC43r< q0M/ Gn'I<ٻL~'57Dl1={-%|k O-/ AK6-, ƗXGږu!j^/n_cL#WUgdtEk`m0w] J@+o w"yZ$L]Z0ڣrVy6γ H܃E5_V烾2:~2Ikt]o1C} fYU-mlEůÑ:]Zd/,1y y;D컋$~jwϢp ZK,7PLjX:(&iajŰuaw lht^n/LX,n @\ޗ7]@>#d٦DpvvI tKMfoP+QtelP47<)+{(MQ("dTwtd, z;b~`E K.:moRÔuu`?N1s&$Z%E#TK]'"/^pߒW)y)cnD2T;8Nb*ҷzXk2qYBkw$OJ@&wy BR;`hOaF/`JXF9%6/䲥FMyO|ljEo`'XAeU}2\^JLMk7~GVaHbaR15zq\yL6/Tf6st!_V;IQ Ӕd(Jv)Ҏ輟0}:!S:r2 [\2!=C/d ^}sU $|fE(~d5R+HaīG;qčCCfn=(hLDl&AI=CA/f"\42c(za٣:rAVj{:Eu*̫1ÁvDR.. s"o VuY 2y)=>Qv: .'lǁ\' J g0ڗ Th5 !W+Ä֨n!ϐqR#BIBU1&߭ -nfԈ -Xbp_7n]0$ 3Uci^Q#j E͍í?4Yq(;H\/[lwO : Ø-K?gy2OV/C|ɼJYO1˰͒ҳ`0j9d\pSbUWkq,d/)/ `xXhg ¿nX`k>rozM94Is%x"bp_p*VoFs&rTuF=2ՁynGSE]rjڭ@Η`{iWˈ)B3gDNf/֗;)_t1LvW#\7$ch&N7*$cCSt,<-=PVL{%)CE*)BQэUC ߎ0{pѫl$_dATn\EG:誾Z+E-ә[Zi"c'J\Z[Msc܈z\#rde@Xgw')1iy )0'mr XIqQo&\ y N0&A 6 3_^zDw,OhH{'sE_eC'el*i ]iiڠRŭ[& ?T6m_K, 7ngqdd)Pz2oQG>ߋfJ}w \M+de}G>z'W!3fDRaIt"ȁxߓąa.sm+^EDX⠛M>X孉T%Po?pwv;{Àخൺ!lc^(bPy]l}ݍ(d7>I24"8!PV;TUt{nHmolCFńS(FzgP5-)hP7RjjFC2(13jA++d[[ ϩvrvq$x9wZ+WszDw8܉qrS&(\9gMZ>t> َͨ:V !n&#ŝg^$#Zynh8(:N1ԭ>]Fq8FR`,m({/aB+mN.i{6QOdMFkp)3oٯ`k ~E^v=J6sP7!:+>pD֮sxJct絖WK * . FT{W۸u[j?'ъuW>xrHymli$2Xnb8+^逭xPzFWCL\KGXt۩E_̊6xn]A0S8(GSN΃;TŎJCT>Q9>F7aϦ^Slۚuzۋ]*(|ƻG]AIҍyj6H+ [:2/]aڒNt སjU|;BLKQ\۟ 'NJ3F2X&=vw 9")>V7w72S(Jm[s!zx9zG=l/AHq/pnj%jjA틴.ՉCG}v .cve=s&ܨ;]:0\,Y0k0T}ݟH+)œ[w%)Fǔ74H}5*~MS-PeSUcB JK~?7vĆ~O,@v8TpH Oy?퐩iZ.N>ޏцERu7 gF5u֡ޖe4rNAB{+>-;-#}ѡ`{F{_.[4{Wxri0q+G(g>b*!fL{. Vx;6tr]7B}D-,I wa#14 NlД>wܠ 4ω*'Ece%Dy=WK1R5A\7j^ێ+n.JՙI5Sq3_>}haؔԱB5>mcC&:ewr%vQ^jv+vi.'TVO܊gsԑOT G[ ZioTsG8'NP{N1me9ޚۆc 2{!}aYZx'棔/{*#&7P2# nSw|<=~ H}cP&c.Dp)T 7?evTt=c.GADIn#_q[):<7e.ŋ1aa7/5iΞ'RUIOǥW=}hjIhpbM|6z x|I6¨enir>ֵXGa3Im*9aߝZ%=[#vQ}(Oҁ3h VXo>b"i Nj D]ưO%E[džQ p%%ﳬQUG+ʁoB[ L;Y]c;=˥,Y2UJ9``' 7*9lM7p қpIc6 lYS˜vjX3G)؆°H70 o>S-Ms+͌㵭c]&6 -X- 0 (5e 8>Q#E$t$Ҁ8dx2! %]%"C)<̾V+k~F WU&qh˚~vdGk:Qٹģ}yVJ/uAo,1lפޜ3d]()Ps!x5oH_/1lwr%5J(# rϾ V`紬ud7[sHkb+-a+W# AX0-+\]EH(uqhhx/ƿ{w{tFpN?^ ;x8' nI+åeazx8pĢB0!n]fa5L\VB-yc|Cd1_CRlS ߸4У@(XˊVԫQ;yvWI3#Qw[1/Ze6K85} @x|^GGp ܃DCդo c%s5g0YZ~ew6d;hB&R;!kKچǔTn$!/؊ Dpb6?Fǃ{$6(tO)}mK]#.4OBoEsbٳ>e< "R6K3WDJ&d]@6OsC% sQ?8 ([vҝ(Y!+AZ9Mf`;kn#mk.%j Y|5pQ]yeG3ÓxO"-_t3v|tgOm,( S{!Zj9,FY-\9- >-GM@]C0/QBMS9c1 놑(YtI囄Nq*P6*W"->jHvUDRw6A]^7mZ'~w S,Y(-쀾*S18 }43q,L?ӆRӞoe5gWH*4+JKȻʧT$'sDwS)#= *K|.k䜶]D25>1jȦށrt!$ŖFVJR`y˞7g\snȻFJwE&ek@ٜgEP6|{t+ǣX1]r[T;d"l7] NĹ|0ܴ, {;c"s|vRUGr :4? &eb+K.k1wbT)P7]gKDTxTdcw亜$LYRd-N.t\.~-exQ(=QlK煆8xMx!&:Vrk*#$]]xe5C>zYH^w>|%cТhy%T)fɅ녱bs g<ِZٶx !!cU|.Q5nך6J|ǝ:ld;9h3ҭf)m 5+t ɮ !୴3E JmoCVoj 3dQѢGhP}̚7egGXncXe4}ymxCArbY\:L)g?T%(Rz%Wp8mKEQg1#qrWY`>1)LYvح,͜NSFh3LԯKσDpn`%$Jdf48$9=[Pi5(~PA^]xr2jFw4Ghb20`I!s7uz/ͷ0 FC>DnHޕS<zD'~q8 m%^:\ vzrzu.nQB0&mU\q_D90dݲA\XO7.qX-^s9i_,^SP9?}btR v_ nѝ^$!I.i"cgϚYdQH{q F:R~|5vhV UKۊ_qq;xN^TİWMgԗzRg_֥ЂX}dWdp DV G]7SACXeH]ՠ v;q'Um5D5Ad>.a_ I+\ױ;bk[U9< &PWD.EjδOB~p q^Lv_ WalTi }y!5<ߧ?9rX1W՗7#h.p98Ӻ/u_9זH%aXr3z\֬^BdLOٖdžEAY19=B }4ϗmN^Iߥ׻܈Tkh[H޶#3#ʽM $]ST? h?(Ō잘 -ၴ%h{8oƍOZ6 D%D?>nmX+:JFtS qs6f/\7i&ۉM17iGt,YQkdԋw?T/P x*b }oa2}!HTzwTn&8A FڪU]"\Ub@*@pf)N,N¥"(4ث_/6nCJUFG*&NBwZE !ݴ  e'(|mHzJ BTrӗYT#%ٝ&pBsK_Jq_U?cV܌)6]Y|4-M1={EA/Ϩޫ+ro,knfƖ#=.z9qthG[0_i"{ Զ~*1ӽgP{w'?d3L+KN~psyŶ:,bY #*@X3f A%x뼽zZo헤!C<ǩI%˅&q/oG0w{2#ԡmyABR"MeeVG:佼37܈j8 @W|0Bǣ%L,|x|zXѨ%ґT`#\gC$CЙ-EM{͜؀F__kÚ(x/suSZţX;2l,a]ҥ5ENӍ` $1A))U!「,LЖ IԊ82s|"`BZo3D S"4d O`qXl]Fu$K{oOy\!\&15n->_=tML>aM{YؚK68ySWg=u'2 8"Iޢ9_@fgp/T=& oml <+EG859u)?Q}ݏ$ɣW0/|!jΑeqA3쇡"~wQ|Àzi_TnV?RsP.-1:;<H$bEIS:׊$UW Kxw:n* N!--: Z[YRr@!M!J`Tad붾5qrFe]Ф( uM *4#䮘E|" q듐 )"sfqzI7NRT .[2}ޟT/MgX$G@+z·Q@4͔敮<)(&TA>{jx|vv'nSx 7\T0Aӽ$v?mYC|. &\AhZP787Q^%>>%'6Ag_Y k(Pp NcO.~˜ msAI&W8^80*ipBTD `aywrL?5~ѳo?yڡ 28TM'n?Kk=to5mt?o䜾gǿQΗ]˭D/pl]RA-/gPw,3jD;TM ;OܛSˊ ȓv+It Έ pq[aHF foPƙzKxSwK#q9f8OPץ{K|`g_z Kon[#ƃ7G̝b͞ pQd ظφ0.^|8Rw`W77.ڈ}nȑ% ʣC]EP͊QZF1jq;ݩW6+b65QZT8]:wFbp^yܩodQ4Bti:ixoD22El$@akfZdY0Z"v4AA IwsQr"YbER2r뵸>TXGM Y@(@},R෽ SHYB*WYdᘀ4" H{q>i9`-3R i.-1P Ly QmgO=Ƥݝ~$6q8,g3ݢfNۮ~wܢ w>jW;N/`I @~|O65葬m=W=|)"$[06`RLjV-JL\۬NLB5NtR?~X#\]Gos߸~9;㝭8ٖ7.)l@(UkֹgNe}RMq"?$Ӗ< AJD%CIDHmbU dA_(,cY!ˬ#Q"Ռ6pJKC,E |w88uL'X45!sjA  Ht7W j_;MPk`}57h)7QX-9R*iH0;)CE u ֛1X-n X7m3Cpd; zN_u 9gՑNTFe& C17I%CK\_S1RJT!44N>+5[񑆥@/3,Sț\R%=N ڟa0AmR4@_pӊ&V}uƺ J:fr!S>nCMzeC7!$=.xOhJd߲݆F}-Ժ>:hO?bKc`훠#6ץFB\ʟ$4ZϚ 0Pݣ_*VLm:qpcJV/@z"z5w  :U]'▱kItE " 7dibXlA+ӶF` pGe 79q@ҹ6=I4PDIdR_,Ap6ߛZeT3^( 9h[Ā-DvI&tec BvEP &\EKigkAKC,3aTI49XQ}+ xGm?1x**D e,&HVzTNၐNIS|Ydڧ^#ۄV*V3ff+4.XԩK>/fB"6ZP1YEhZOxB><7妋u8B*<i^GcêcP&u;^g%jBBI#h9sY;SŸ?-y8Kv8@Zn[mGTғ+FJPFG!ˑX??8ín':SƵ̑#fA]_{iRAn.ޗ,Z֎ fn>BpFΏAS1ɢ}uh2N䐜ԤPQVEW3З ZTm8΋ /vH ΃e%1;%c+My~:x=dyU98>[t)(~Q2QJu"s`N9Q.2oڈҋ= F|RCh7 z8}ٽ;͙cgh!Pԗ6=%m 2rkVʔ`2 /_ Xτ䕸Qj qrmrJ'l;]9]TP]\('ʂV Z[ew>rߺxDL,\DT.w7ċSl?%7X &rZna7X No6yx]I57*qo{ӄ}Qg[LdNuAS|oB2utgᏉf+iSV4bġ8 Ḍ[MIo%)|WR,& vVXj _-mj\@?l,:/7hwٮa<}9Ц-i>*~\9%0ZI<#3`TzW%b(Y=ӂqww Xcazk ⦝j|YܹX9v;*7I#ɞG9Ds.oj#xLɌX(-&Pmm& G}~iкLźr~I[)` p= iVAinMh;v1u*Ayn BQ/sjG;WJjR*Gz<ྠlϔԹh {[U8npGC'yaDq# {} ;A5&.!hv3Ũ$dW{1R|߁T79XyA yjj-&|}9SP+FI `z7yqgv[uGR]RFUY V 1)OzFjr ma_ a"[ҚJG`~S}f$cy-Q*AJKzv9DZtCX0@h!w8/E Pp? {+^BC Ǿzc<?n|fyJ,Po}17c̈hċҢn/Z}<0dD!, @4cJӠ!0Y(N~JHx=E͎ KW|^.Cx>zGB+˥_@a͹V4BK\Ҿ4 @) w ;an;BzxNۖ}ctܴ#)Ch{/g J/4,1]Ycɘ0(?R.[ ,w@~02).o5wzײ6ۆ03&m0$j1 PwB3tfns|vQx/?5EASC8sWښ o5"rnLY~yX7_l0/> )akXzOyw2̷7z+ewjILfejH4Wִ/q \ uT4㖬B72>mv!WA2:;͆ sA7bXO ~HD؎wLx!n.!k3[ni v*Mrnv_;uR{X6Z8RTDwq<78-JdD?܋"Dad2`Rz\IjkemmdsбM4I~"9Z,_-x2V{~餜84xUӞ=AAe4W 1j<͈{[gᶝ?1}fv <&a鞴`0;?GJw8'9+Qm 9~N UFHy03$/)CǙ'A%]Cy6 {ٺo:*ɇj)[脼L|˅~Ƶ_ըvõ?FUgN?1=m2ˡz!18m{n- GJ@^#R0BC![#SJ~ն]t4N?~qx*$_^!* u\x ]s~7aQQUoXF œa1+bi锌 1R/$|-.MҪb1Bu:d%ҶX#lQQs\ v^S,(?1ΑvKĄDTCҺ}{wʩW\4pcr?X픃j1L-1T[@@;}SVO*Uh,mp vPW4{ >Z"҄aQtyS˝!E\FߔQ~FO SsYG8l*<uJn%Cca5 ś !dIm>3!b6a9UxQKUpS@y;B0m)@XE8jKz눧sxV6z8D<Kd%0w*z+]܄fՁp#&GN膝[\=H-cE~ZkhxZ)*{#! 7IKǜ>Q,}f4 U+G@ihVĈo-my|zma,ǥTR $'."ӫ^kJ4"wWH2Rh^!!Xs!q}r+ .W`Efβ`xX{̯P* F9z|ZGj RH$4$ü.4 t((tT2@|3KtɳFm`KJPiM^9'4R3˃j]yN%L&~\J\8P]$Ƅ5W: !.QLT r6 W;+q P]YC<2LmF\HDaw[twS}ghevVU54^%DCz oܟh!w$\-\y)~,&pk$29s#QF9\KqZ0 Z(8R/RfH5C| |PBFS٫y3(z޾wZG[WТ ]ңWO?AE_cߟLƎkbH1̑ MWȜJ]N0W)TXQ Ah)Ym ~e?rrr 8LGcnjtEwCX&8C/]0f{g8 +6Q;-@pV(i}7mRAf֖I畖EmDyFiɫaSWWؿjQe534/^yp۾=Ms`ɖMũFgf<]Q\`W/v?ukBpDD \) 4OpɦDQTݣ?@b $^x%ڜ1aɛ=WWIEwC#3QFv~* H~Nn7?-&I K^ ']|xOonʵma^_OE-Y/)`HWe ȯ{OaB=#ag5K~U"B%zH݅MDx|"MWӓM&sRT$䔄s!.2z47(0"8$3J  nrH5\,N=Ro@2$ڽ?s͑YDY4@]5K{At$TPEbX& qdA%%hM%Go3 +Y)lzЂ] ُpZ$sjDF.9^` SlAL(`ryta7g^h>˘YI4ItmzoֵppKNӋ$SY$5괽iy( G=H"EZ^i*VRԥsuCb'#@CWb:%/%uC.pƿMD"Xiק|o/E/"!68y:FD>}bua8"m#F4b%j(BY/ܜyGyGD:֣W!NRh7q *γLH1j;4l[_} +'= B*T-SQ ܈Pma{.9Х, LsMٵ`A+AYY-݁RUp8dSkwacF\g(vw10@ZJG8PB/7vle;G@eݦDr}Rk/`~$@8JDoLyqi`xq,CeY%kYnh)>XeI[!=: am hpmzbگ'B{KSOM<W 2ɘwg^ަW0Vu>;ޒڰJ9>>WĶNyX^Chf;S,\mސ^W:PrEK# Ԍy:$اO_pFbFq Iő2*'u"+- bLG b!qFeң/1\g%U\}^pLiІᆀttmӴOuاu|țdk*YGGTTa&sd/m1uCaCo.pM4_5㻜wB/Slzq(?>T\)M0; x؄Q7qFk2A^{I`7kܶ&l +::r;:G V#][9Wضk+aF(P54DE5.3Lڸ{%Raz+i*ݔXZ؟x  q  V*Ks= CEAF}40"֊xEgaOGZUxR?}͛ݞ/8/ z)bla!آegQ=T/g|U [o3$5 cwv֝Fq7)%$[XYxe;Ux\ؼQz(/'[ uP`Un 1mŴeh۰‘"K~i9J-{>xG7*Etݏ ny_b1?/YhZ#ôDسߣ :$8Vku0h(o˕#nCq{oexg]8'.39{FYP&PUݥX<.+rϛLB;gd nƌ]ox|7Hzg9@FN \a/L/ v/ #ő4:Ks6նAa5SW<؝NXv|wjJT3c h$~Npy ӺK7goAǧ+25媙f#u|M;<'VÓ46-)(+i߭] c5S)arFzATN2IHAȔ<#V١C|`z'|?5V¸m-幜8 lY*eS`JMvt㤞J4h:XʉhGw( xZB3kG|̀jiͿ's8~'rHx⇀`lJឥ|p#3d M,E[dYǿFc=/xP!Z^qLIAR|^(8?7ʊγUYw—.X>0aLΗ6쪨bWq&}.fjgS~Al\WY=[҉&6 K_w0W!obym^d#7S98f,NȜuK΅CIr 6bɵ$_AW;́gSD/XlC "~t U@u6 BdKF&P>V0pJ q++؝ G`*6d Q9JOp ĔӘ+5Z#0:vU=GJ_CjؑU׹J'! x6{ԍKy",9z[z[Sf۪&f5yo=L 2a޵k?s _*doÖjmE!` ],ma7!Œp tdJj"oh`Jcff".i6Z wZ)ze+Ayq44SO[ \])Ld%MCib.ܪ}UHve=8̎CܩI-$KP9z9N}b[OG ؠiѿKk .<_rÂ}*m1&}=K\?CU9wl2r'h,4\̀h2s\ZI?}UUwScr0  zNbG3g&mhA>O6bEJ⎮f8ۓS-~rnG+1?cF4qDG 4\UDv3 ٜpP(D@GW Zdޢ5y.AY!@z C55؟@ÒEFiEƴt :EM'fKcf;eQ"ʡdW$Nb%aֈzU\k[h8}.a$.лM\Cp}ݖ]l6CYȱ,F3^j.˲|Rx|=/]stY50 H0AtU0aš {䇝«1 AL5]Bb2jY=YfQށnCm;SE83?YqH 8/k(*Lur΅-.A=TXm<9n/.pڿIٔ(]=I߈9iqL76'. kU2' R@=  t$"וu6_w⎮+zjU?쯵>wC݃si"6? ;*=$";OLgw"dZr284-UD܇iVxvy=UJn99n" *3(,Ɉ- gvM<tt.iZb"xw`iu&R}9({f }3VѕϖQ/UJes#zݔCܳˋ%6w=vNƅ+[F*x4!yOHA>h]^Yx%]q\4prׄZ>^=FL~7ɖ9i>Rd >\ +vG. 9n考 ? [s 528^Lh񴡳|LY&֒k>.ϥjF0FPT2 B9  ĭe/,$-mLIIQR MN09nRÅtT>m7$֜j9/@cmZZQ8VE-[Q 80Eb;4ܵc˫Bg̀^=N k*(\l|QA5{d9]7~lUQcR 31my1~UShS~LCs;ʩaw!¤mBk&Xb80l AtW`VR NH2vϑ]t190mo/4@`7ҥŖ҂ _#{\JfWq!1MF+@Aʽaɒe- h; #/Q7:(R/.f߻*1BS@Ċ矔QBmyZwpF(^E$YYҙ{eNUDߝV-%}KJ\ڍ>bBNI[a0qŒ1} n YZw#w^@d*ڹJePj| Zꗺ"y a?2 ?,r!.0sS LNlg QH6%ʹbi#L+k.jM&VzA1}` -|J5p<'o:OWg`K1vc>bmvqI>cn02V :(^g^3lCs ,6b1QB8lA D (ۢV؍\%G;[x #>ow{ȍqfn)e-.%H❃cGx(rpf 2t&JFEn^8j$) cE@E#Z|J(Bj{3z"St֌>[' h<>?^HԼnuxWj""mq;9Ex&/|\BDzn$I$j0-\voñV~en='ǘi-s<}_1F'=G/ 19!g]&ZVhxmMKD"RqJ%.o^%*@Թ1*.܎~ϝPۮ*wO+O/mӞ&lYNOW+#Br;eXYJrif06pf#ԉV?/xq ~ }$`^f\FIub J;@eЍqj@m,uz6F*{PS'=@z5b"}dcT.,|:foDD׆t&nrə41!t f$N>0<)J{հSՍtpNto!.\9ScjoAUO:Ԇ> O 3X4$;6,Ī.Q4QyEBe[!D=AO(pA *ۊyז,~}f>[TZs%7trPh@>+ei%dhBJ]?K٦Ndž/@ ㈏$tBG^d9ŖGF=uV5.ڊ\gٙ S J8*Gr/Kªj%fdm1$~n*+Pv,Ce0XwwlFId`0O{P7gv ծ ,J*Avp,BIP 㷼oDS&D5L,A=[yfm$Fhe5݆@CT;hئ~6+nARaۚs"!!T.X0.`Ɋm|%k M Cœ6O4 롷¿t9.{X?'-1}H4SQwu|P[9g/Q!H°?|,[7(~^iF<Wy0+_ȿOfRf*v\RWӧІe3>Ϡ ^(\*NHT 9HG 6~,V ry)GR͝S B =yI;f w"db0'5X@o՟'BMy0l`&x=)Ogh"l3h89Ƒ5-X.eu@7 ,[L?4G@8}AV>K}T IoY?`Ri'wܠ>=1r9X&[C,n ~/ԠZ--)kLf*-sDP襤û\B/dh4_TH^۞fW>Av㻶y(%H8u;H7c}HBL;K$M!EO7 `|2[[ﭵwf&46 `@]?$]lu5_=$\{B}z-E$7$jOXAXiv s2AwKSwnՑkt{@#κT(ƻ2iBwJS*aE[}F/'u - &;^ ?|~!|V!24I#)r0VVؾ[1ĥ# {2I}braFCuͣṠ \n 7i,sզY۽}󚘌r ̲d})E9HW{g2t2;[T7{* S؉ yh$ ] cW%$f/1K "sl> ?3JxH+o<3`5ĉK}\^_nr`?I ȣG7i<g>fjAVZğəuq-5IKK1x7*W os7Wab-h3@ux}4YOǴZeݘZ5uL%ȲS)d> @s)*dLv?m`i%Vi)}[2}pFXH)0yuW((wچ8;nOyܫ .{yoب07%R(+hdmp(3UbjYUET%a^H%ZzA l/eb4~ji;,*'5_2$. 99H1 _RӆR;D$Imod >R%Lrj{MO Aw3/F2 >QvG-cyfv^?׉(uZr^ V`Iqoqy΅8U(aѿ0>/ٻXL/% Ouk0xV ͍xr"pa2M58V=p@OzZ\+o%B*.dJ.>ڊvSEfeH:'0RuҒDE}Fz*NY% +/t(I(-l%|­8+ܸKBԍ@/y 5! o݋鮒j(g=͐$҇8mtW &)ޘAthoC `H7jy_ qH4LQ\^킉ZS3j*d1GxkNΟ ^#bTP]Tv.?cR  EibnF1(VmM V޼$ /ƾn˚Êcw4YrpTeI+H@ 웁֞y0&Ai ѳWXE*E+*y{`$MzjHss?Y,3h~S2U *2Rju@$1oYU8 ƩDǂX_>J0*dg[3F'vz#sk' 7?s=x|E #pd$?ln}oi>þ Ņ/o`i87 ?Xcߵlk6(7lPPeDIm"I0mḝyxHr$l r4.t"f8Ap0j4' OQjwq$*iPBb=Ӆ?}0&NOo&>՛hK0 gAx,ή -b aCȜm/twǾm]Af`}OBF7* ' M (@>Wa1Tew8̕BA"b5ڋHE&O?G,Q( ¥kwX6(nfbM:v+zɪ+\cV 7>=vnhr_ * نU\"\:9>.FW0Bn*iYiUq$y'W+:eD'QW)"90Qrml'(QL+ +,P&ƆaiP.$\Vl1A3t@[V9%A_WX8(ݹMX)۱.N҉@O'Zg׼pdiU΄5]Bm`{Vm;˹+|j?"X0vJ0ehSgά;HߠL i 追E}SF}(-\ϧdͱIe}8S<7n~)_ Kߞf7 d&#G&k76Sʥ k& .;ZD= U &r践ί?MbxJ|  ě.+Uϲ"[n6'D9ᦂN~LugDN~G2B-bA`me: f#pbТjj[YZ2.fjߴ|T`Tݿ={20! ˤm\B{ ?!_x-\X8^vͫDpDjGx-ٳ'1\\ CGVF =re-2PAn^9fu{Y!xܻs3+3 ~V.0Ӣ#6aLic"̆Y8O$k=΁C4gGzgr~i nhc擨)/Nʨ[m`nr·=9 1e />=%_JvK`ȡ}rϾE]kæg%eۙ/}TLB5Q @!~4kZo vM٩a= )gI(``v$iX2^K X2A6SCύYT+5`)lې=7lM@I(7sx>:!@}6Fxvk1>`i8#h}{q;I=NJi(uC9]4>qQP>Aaq1 }[@ګk3"Q:[8}Ҁ¥P a*ϖ~8l&ZJPXXqóOf7#[0fLb1 ݏnMO:(DU u,)e+XA '>4S,yZ-gK~-qF: m+?B/-R-VW.EPtgMM˶EK(ЈBl5IxUc*Q`T""`["-U vqrg> [8ܱfqGƱh':*_2WJy=`3GRŽ96(z[cߏЇ[Yi6_7 WJ$"Mse 8Oڙvbef4xC_4/{]J )vXmG3]Y3_kt޳ŃkYڨ-0EcȘVv;tX JowmUvCskF?d-!ɵ5IbUXsf_ב+Җb/jT?!e| ⚶< ô9U|#"o ڪN'E~嶧1ّM9D jA聆HEg\86q=b;9 Fߛ;jBx:&e}`Zq5l7=Gl-U+qu 2 >aԷvG6se jؾ%WPDؐk%`ħLo%_ΏAq\ƸS$A'OlE|O~,TIG2PlE=W|SeSPe)Q`TlL7k,S!@Gv=zI 񍉃%`8pw%p!4|A8RT7yHX?vGB^ӨhY~ceI"Ӟ[#B(]I1̟t3<_}ʰ'? 'sM~\HYiĘz2vBik+]ѴMV&Ljljpʂ!;g g%.џ[rVSCyп!%p\}(xZŤ M.25xX\% Eu4m$hLĀFh2M7NjOz\vG8?>8C&t Puܜ`d6 *ĶŵiS_wZI/hF6]&SZk[ 76߯@p Dq1}Bd@9\8f6>[Ñg3)y+vˮ1*;OqƦ;POvQF ˆ- EOל|gxz~kb8U{DLLQ#x0q<$ mW _RJ eJ8{H&sRlUpF5S`Ir<~mA`9@ RN48 CH5b$"7LvϙD9_1_[cC,!n2 =Ø4ΓG/I,L!Q<&Iz'5+)H5tPCg M4QyS,j 껭íGf^N>tT7`y@^S+ !@;q7d|. .IEԪ!T|I[)p٘޺,/G,jߎ?AnlꏚY+ Yt O-л٢0/yYLV0Y|DSDD\>B5צR 懎輴O#-&¼ۉN ҊIL?n`RA}'Gwn3'dNR&F AC_3'ɿW3l0HF㣘Z ح$#O L?9QhGC=&Zӯ $)&im +X@=U`WvcF6,9憉EY_'$=%k]fnLJ~(ΈE!UQF8!* E[궃 Ḱ߫>g4ġCĈΎgSÑq:*`ty)^1' >~ 4X]_䒁3EA7>yO(/=RPoBpat]='֡ I a>\ JQ_ |)&q#_Ϣ<øQȺv9Zq4-׹tz͛$? eZ}hǀBn$̰|O:g9Dn$D7c^Ynge0hl50R~[W\3La;#^ԕP[te2cmF1d$(B ]JO.7pO=GC!6-6TG۳W>-1|{̢"u M[OX)gخqUo^X%'-J6<60SdV~qvvT XVxH>ضrء_&Kyep`h/I(/.Np=t yGG$؟_EXPHExӛ 1L XѨWx Ub{៉5@x :oo<_-p$** OH7Ĵ߉ыq3GOvLqvLMa2UnM+&rPP<l7._nDFx8~a{ pAerH Zˬ&8:|`seQѓԻrB.H~5W#Sk6Հ hvƫ F^՛z]vW&LC)OI*[ ;`-% <Ŕ$뿬 JY,K$SA_,O^nkW;6l@KXA@ϛS8M#TlWtL#ɩG\̻1?xe\fx.e$閄\_|M/Їҩgnx/*9fdY%g( gw}Ɋ=ߜu|-]y,6X,عrQ5ӹf" Ϗh[tfQPXV{jP.[pޒuUFRdzύ#o|Ck4, 8Wq3M؏߱g(Pȉֵ=SyBȹcRdB=>9a 4ˤu)nK_TC\z hj%ưq}FWCb\ NЃFriwMdYnoU!Z7c ɺ;rFKͽԇ.1H}DL7yBm [, 3Sff _9fP2(=uD( hIb+s^ BP[ 5/)rDJ16 Ke`g0vɄ*Bz)1wV]=p0yq Fj:twZ-l wܡ M{J2Q7"^rlQL%Dc5HI= x܍3-#m*#vj5)MY{ O.t$)!wENYP/Loͭ0.wlR5mL5N78w_%vxSb>/ 988r.aڒRpTĵ5&$)ܗ^ݾ@ӟF~??ѥ8Av.qFp~Њ[s~% ?Cig9 uDJ)g7kG-+!^,C6b9#Ǡ55F:Mi0~b.6YQAL9)x^%W5 dw5]'^(_J*\ƃc;wA_}#h' M/;la [sƾKAq_~:(/zD 7AU d %-gxG} 'I?8ŔDCv~)Uȕb 7f^}rgQ+ĮYe@Մ% CP(Ӧ +N[*ZLn$k|e Q`PtaKDQ-g[2^_Vnl R> LsF*]JowH}Ş1M==ŗ "-#ycU=2yiQ0E]NjD/UcP E5ɻ0Ь˖3jQ{yeӍ*[Gz=#s!N JMJ xgwT#)(-/xMvkeWQ5zg/ԛe3{jx3RdYKi?\Vgt|)iُӏum2sbavP@Y ʦgS TR}1^o C65Xɵm-u8Yq% RcN^yRۨ@eԧE@4J'v+h$܋!C!@풯2PUtZX}nNW_v+Cڱ3XՖʊjaL?c@ҠjNmm̄J;01 JdR{^.l'[o;Tѳz~DT$JX\Z8$!N@D64V >ZkpFʣ[ ʖ" d^QKhపva2pxy#䡪ͅfkwYcKem]lm;c-ғ=ZE`y%ҙf7gGȟdXdh&VUjf$*.={ 81y?>&cy vm; uUE }H̨…6]Ǽ+KΞrڒchQIB N6b`9J ;db Cv%]N̎SJ1 p|,N<3ރ+Yyc(+ q:W,&J#]hho^X~tV: - <Ɛw*@i60#ʪ)cȔczRֿM#BML ct(-SnQB/SfS|uB42_%N @)3  OHI=߅/9ߝP "JcJ\jm WE8SGC$R;_GJ%~k/6nSf >$`ξ "VZ2jFx;HAڭ;O#r4 iCXBn ΰ=m[MZ'0Apm,_0e_& X ~ݏ#ܛo3S 6 *'*({6mY81-(6@IqWyCKсr^AiQ 9Csi2ʝKzZͥed ;Rw&9p ub4V'5arr!1Hhl3bM|ٝ2:  ɣlLUJمcħ쪐߯0*&}7Mf\mj׻ Žb׍ޔeNw 8g«E42ce5}Pv.#5*[jpM ȳ{܌3U"¡7(mjzX8(Uگ m9 ~L*pӐ0q܎|<껚`QjKK>SㄖwYC׷19.n8&F(oinM}PZAbOJǎ%c$?qՊQ(9#HhS5{$VU쒚!vip\Uh5"VZ!Wb=۶n;=N`$a-gMzx5A'ʨ{/AN:)!۾ʽ p/ETݹJ&]mNS*Q𗖰UX9 0h9uizVѿ!^!)y *egT1)BZڿ;hZV*S +I(j}kۡww2Vܥ/j~m[ž(Q9O c^7-&klzvPޛ MEi(KN&fn5xD2wv<۟׽}*XX[L0$`{ocvBzEG *Ckrj2D#Q$u T3l %kB1ibʥ7揞tH HBiR_ܼX߱R Dv[!&23"ӥ lA[.KwB_@ʁcyx{], r26Qq#T!Tu 10B>v}\dK ɞFɮ'zаŒ|}m|pzdu$渱Ln[ HŸ&!]=Ư5mhqzOd0*Aߋ"705H*NGWTn^- قPt9ڻyO |֑csX2A\BN?.uCNjYR쮘@Ba(grNnw SQwFg;Gs8+c{Z>u0/Gko$ԯZ,Jև?m5 zv(81ۓiaz|hI%CTe_6}Uhɴ$E놼colPvߑ?~F8;׮FMUN}nnQJCyA1efNQ-AKOtKJUr,m'ol.£(;S)ǁsç_ =|1x0߿_jP endstream endobj 37 0 obj 100471 endobj 38 0 obj <> endobj 39 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 40 0 obj <> endobj 41 0 obj <> stream xeX]6LKHw !H0 CI ) H#!H#t4Htu_>۾lX#־ZRs ~Ђ-͠Z*nn8- @ mxjxDDDG(hA`nfP ;(00 dH?U7PT0˫` bn,`g g-A79ᾤfgGxcb8 gg g5 Z`labyC[wg8mpggWUOfmg XgZB,\`o 30;f-s ho_ MÀZËctvΟ8ћ9:{{ֿ@0g'6/|Mx́ 06M ( .OCyYBK6_PU/+W̿ 'v~\.`wf {zZ؛A6+Kr-A0 =<1q%j;/_6m&M@k?-mSO7_>yqxrs×#nn2= w!Qyndhq+m0+7 b/M@!Mo}+~X 7NK+1w7 .MCrq8¹^Ht~k;5۬aڌӇJ^:(m+lQЂOxcpdje*anH,i`jV+<=>X_Nh^~AIi"F2Gt#Zu_K n- u8@PK2TM6R*d%iJLæ<`n oP.:'k'{D#3:!H}]CdYa!&)Hr1`G^c %piTdZ + K[Tr 6W:v4ʄ,+(8hz7뎖Mbސnlp&UqL9񅐺V{Y^Q,̑mXdCH=3G̮?6:ʅ0{;fZG6b]hrpNУ#P/a,q083o,rr7[xTYJ&]uyܖt/4Vw9ݜBeoRkxn(qׄݦaȫ uSM"tBOe9sG*bWϿ,1) ^~Dc6:`{\As_~RCZzgE ;*qUZSʅ*y[5w=[05Uᆫr Q3?.9з^!Emx+q`jS"/ . (iOW8JfSHR*Lc.V4LptѶf5C4E3ezUlj~sn~UQX @iUfH[}0d T}BY]8}>F̛|G iӌseCw&{3W \}*{( %5$L.| ~bV'U>?rs~G$=.wJy~`iNE+ݙ0A+qAX^6>Vxglʍ3A}266`@]f&hd?xeSM5 m 6.fMeU[YɊ$-'kx<ƨ> k~_thk;QWߣ=#'-4ZIWs) v%5iBO'Ҹ Xt B`7*Y!71t@P S9)-(4~ם9Q= OP(psE_ּ6xh]ZNU_3Bq)Dt2p 悧̳3cԮccv j^r q٫r7p0IeN,eC+els6E6̺):|ٝuuxsG%2zB_! 4ռ]V!C]J9%Lʐ"LtЮjVSݸ{@*-Dul`1ӽDZP\)vtDvo_HXը8^:)&'_9` kW/o$:eS;V@X`G~R^ h!I[JhGQQ׿NܡIo!bcv|A'"c~$wD(*1ӵ#=ǥŐd}!39Vdߣ׀F@* .7_ȧ[%5A/uE/ YFsepO5E|>ߎ炕!~L<{0^f~]՘S'|[盤N뫐VAR|'/"Ap鬸KjAz뉞,/r#HǮ[$ۙ1Ƽn [Y*ȓ،{Lܮݥ$. jInOۋg%:%%p睊s"=ؕ ڻqO>mm)WzGDE%D}ڸ6 T\%73Vf#Uh縩WM<р;wds~e_,>"QMʚxH<ư80^'_!G|CQFF*fh&ݐ5PllJSd[WC! s7yl/ 4$ʭ,*wЁfޤ;UtkFo>"R@AUA t#su$" ̫\J=.VRq \Br80u-❙??xW&86äf~ۥcZ 4L5xuQdp9d6FՃt{eG E`xe꯿pp64_Oeƞj1>E<糶@=flk vlms(V19PՑH5x3O+\X\)浫.N,=/?kn[ ѭU2t$1gbbe!/,c0*}zL"kchtIA^qK-zɓZX?OK-r[1v(yqRW3a#\$u'i`8*KB S Y:!0\]2"SH5<^Ir; :BIZ2Qe)TKb&% 4zgx8S!wf340NiR;EwC{4ܽ~BGh?/slkl!\4ƄXH*Qe`}\] 4&oޠYEے~g|pXT:{2\X4(\0Z?PעCjCA,*r vi+Qfޛdy14<-mIn_I+*9X@[ $1iⒼ&Dv҃T7lmNcόmWH0Ѝ86%r``D'/LEMo\v&#SZv Os:5BPˎ$~rRd4Mw7=r"zSkbDgjD+O-]|бoOqxr۵9dKy_mZd0Ŗ>wQZjX#Ueu$U  sw 駽)p X  ƒIRAU(ܖ=o%g5˿jɧپ*pI-zyz9]Qq"UH.bba9zZ}%"_:5s'd CHӅ2W93~re{Hp/R^Z9W/&~7qoο b0o"G2&ҹg3u-*~cbe@1m $?=.qͿ9$暗n-GW[5 ̎#/4UIhu[T/zܼ̀Xɦλ۸ w`( - Py(YҸX˔BL yt)gTD:Sza ,r`$hoJqtZer[Pg}vFy.865vUTȱ}=ʵcGL4;2:~Szs $ qQm)uYim>̇&T~u8$}5ekq2#z\9?=2y):T鰱VyZvcan: $1P^!#ɈC_-4ɡr_y ga;/.PnѐUyf5wFb!O$CuYޘX6K'R%V!kU ˦Fr 1ӿmVcT?rpNutmkϙ{sSPB+X.O9'jL2+UY"9NE=Z#H'o~lR\8}<r_jC\9}”m+}㤇Mei[e/.FYz^7 _IXӲҩ?>-Cn}~n)sj3sYf7>xW9G ס$~t1ݰBGru8^mQ.w EEK7El@n"/C}%XYeFɐ_ "ʱynKD@0"ߧ.#±vگ\/$5J&yYsu6?K*:\6靖T %|J}y¥bqw|8:D sj3GySQҗ|, ǥ.%l=홡h9OpbƩ?=i-)X}i7D4)4A:gmD&O,$ˎ͚p0öwI4O]zڲA\׌%Xk^rHpH"%O:Pϛn¼so]gl-Zz2WjkFk> ,iFZEɢrM:z>R*Txњk:|MV^Ds1?I2baiV[\ᵆBŬa*h)Ig9xٝsw::uFZQ_~TקPͧmВq"ZŒqB`+i `pO_DmE}lض.CEJB&4؞Zqi̮BI FpG?-P| .}!,Eaw\0 a5W&ΰ2ʙ/꺅UNhX}[F1;y_ jzQ-M( mG,iGtW'P/̝ې$ܭ o ٷ:\!T.+%_u7{ԇ-ٷ6ՀnHԦbCHFRFPst-ѹlqM͋ڧy ;}m>sIȵ6UPѠҐI"HF{)B(ZƔslYΒ&NS_JrĔuzcqܲabk 6  r.2ޛ fgUX%N+^t-ZTBI($HկqSHVN Pl3jo&jto< rևm)c%~w$_=|z5n}$U޷,fe(5a{I;^S |I2#V(uOE4^\ ;6'o:܁@v;b-NEH`rLl,sQc$ hz4g>08wlH<ı-K?fP}p 9?NED.ShK4;th&ڱ] R44.בGRF6ڹj>b]vLCuF Tz/[]= Mf+ w{+ ZZkbjm1\ _"UZ⦂mimoO{?=eqI6Đ.m+c>MauP<  yoXk;} ]C>h.LvyvTZ 2Qs7{>~i뢳O/~n7&[xHd31Y%=Ve%\$ W8r s[_sXRxzP4 KX|!:]_Y$"{b/fa[AD1֊ ;ޝKhuטg䞚{kko3eΚ.I? whp+p94TIJ6^kGb"38>[;Q`ՖT:㢶hՏeSz{zkOT VIK3َa"/MdlxL-+*>J ƬQ)vm6}*I_IkL衒-?XPiumM@W4?(R'|lz2A@m=0^U{JBY&5Th8%pG)-~E ^-N#Yx@~0W8EF4} /8WS9z )Awkم֓PcZgz= Qί?Z\7Pf"\rʍ)BZd9hXC\#p#8_i`^Q:~B޴H SԮ~M޻d68s/?Q$4ߙ[pȧ`/ CnxC}*&U||Z+iaAM"E6:9xKBCZU.4iyhu-|B0ۭ34Ԋ6I*lg%1N9^^N|; O. /}RY,8--ֻmdH`FF%OP:Z'W')[Sz9~FDXrB.job4ʙDX%e*)T) 0vܻ¥RBdi.$S7} }yNQ@n&~fhWn UItJv%Vq~E:@R)os҉8tmUa": 5Ѳ &;xރ=, 1|y ڶf-(JfY764S8QgܦA n,s"qc?Wl^qփ?+Kft)%atlJ8MJ5_ȇ ^(o-{0ɱ}uо8Wc_g0T\zGuVQHn mU)qꚙAJ6Ne  ,us 6{Ռy}amh@c*SxY $ =޺+|Ly^^b.d+`)]jۧj~9 yoHIOH CS ˹x6QFX8{Q{=/;5fr^WK<߯ .WIFK2" 9dIaϲ@2>RQ@N&ޙ@+&y?"-y]O0񊞛x|O뛔X|6wIpWd`?Gfw^&f0Kg[ SIh=qE0\K:6=: H vO(l+ynjH-EaQeџUޯL3|YKmDMsXZj$';%m$/.Mc9kwkFRN2̗2UŸ#' c Q66->8|xd1K@ߵ}F57EL+WㄳyoK甔(8DD(4|fhC t8 K^&2m:٤; Fż-ɯl@G?;p\zsgEiN,-N?g0w=/^mT ?O; -M))p I1V8iR24˰tFk*WJ b##$-&?߷[B'3$b8j$tCEC)i!ڏXJB|jOH#Mdk :ӽ&~Pr8) qd`]9KK->0_t4jgs<=jv3?FؾaB2ԩ3OoCBs$:UbG{3Z$ȉ4+ո[fބ"rl,8!N3144"O v!=r|0`Ќ8VuI˙[oxvS`⓼:LOm)Z,)kT?rOGyhTg]cs+/!Fg$ّaܔM? _fgۋ Zs97rU2%q9B#cѿ&4VgoJ}OlPy{0P9i'V0k,);;xZ9QG\{Zt[dw6Uwk+b-5Cjοj$u%Ypjq%XSZ M" 9I3˨oG+;3{-o@$ɠ Kq=_G(BsٰW,/ݘ4-d`ً[SCk)ʩ^IĤ x`Bd #mKhA|tldFRs6KIbCJ?tR+ep(Jvmm1yj:wqLV˄ߺ%Ȃ,|\/f76yt(yG^\S gIXŋ;G'e;*8#rYNyGq&cK)IUUtwHϋ+&>E+Mw 6T.HTJmYPAսDfOtt^y=!t4a ZƑc>wB'\8D:931U K 2Gb<4E"14 ;AfG6Ns3KtߨF rIndZ%H<[h"|aF.W,)>=~/Nᢈ#7zZ.dEa٤gWCӗ>~ewgrSPl>*zI+I{]YpYya;SqoD7MNtA KOsHUe`6uӢ՞+ ? wߩDE]4Z~t0:%OBeE-QEw->, X*Na*sX`h۶m۶m۶mִm۶msnwO#yଫ6uX栔+".ufR͊}q>i_z,aICM~QpP\CY8ʲdL LDPS Ftn2F@k#iƟ^-h@_?MMT^_v2 yk(mBYeJb6b$f7TcQꞱl0f c! J}YB&ں0s+%CܽbհBی3fDl u E"vuǒdwmzޡ')YPyd7y<6IbrLkF BM4E+a)5WgGO7¿2k'ݴ.iSQ*X7 ր4Tø?mCtBz}4-Ff?O-'Tݏ&r]{k ysZD J5<0d{sCKd1BIx%?YȨ -V&X[z{ܯ6"@r7%9`՟$5="hq9mNft`0B^-w׬1 芍#%Dq1=RN&yk@:71\E^g66Sh D~`D_)V5[(S8ǣisf$'Zԍ;hv&qfZL' :M3D)%·7&$vpͺ/7]1nLܻ2B vyC ͉m&Νm] 失 sAy*bĸr>].P }xU{1ȟRTXgazUYO #ʾ+M@e8!IOa=pg:9[zO=[U%K9x~]6^ԏqH^]&s10Z##ʬ"Dg΄F,]`P'N.4|CsS=oHppIUf[p5>Gզt5Sm`/?S`Y "9T쑳P&p>HNxo9K)ؒX<ЮSȁ6\v6]+15pn 1@r}1z8 6R-7G%[$)]l2;# JYa ?>Up_(w^!`m#M?g΄Hts!N~L]CG2+)^Lzr55Hh2]yw\Dƨ} [daG :fBjjli(y 5kڗl8VxvZs-z&Гsw7-' .I%zy (5!e"~wlt^<<ҧ/ū`g- m,)ps-Ueܿ>VfJ/5vgj#Wj G'nf~9!SvN,6 ,9!Dm"BJ%GDr EGX-3~~paWjfw_Ņ6nsJP nWMcxő*&mKa2}FXK\ Q j[AgM] GC15D=]3IL8"{b/x DѮ"m}ǜ6nۨɔmeř1>Fm F[XKje/&ʎ?M/-㯞FK{gC MG` -J\M}NBX&8j܂9ȓ1͐3?sS?32[,q#35݋kK|0"~==r%_=r^=ga89'7.xߤ =bw6^~ԫAY$$<uGwÞgcX1TLax} څ &`-h"^T?98_c`w,g`_p9*yHxL;.7cft(kzXMJLʚ*笈y`;njxTHԕ)(=ֽ#Hӊ-بjsye?d6e ]XX{s7tO9ͨ>В*2TO@_4 \e Ǖ3Zy]*P:ML#hWDY#!>ma[(DCV_ࡦnD /zp=גT`bM%0| :K?2\Iڒrp+umd&J>7.| %Q~ygIj#=;b,))l!LWF_3h=Du& %KկQ?[+"1ovT[+ w>D@"iSJ$l8=_FR欜O+&$c >| Pw,rYt }ye @-MfbOxcS# $8׎o?c9; vџ]zOs?fm_AmWALƋ Y/o* P{+>A,|$Œ4a ]K0yB|wNT ms+bQ'P%5â><8IâMϵ>;&Ќh&ȏفdͼ*+cD< NlT) c6a eOS5ߤlW4D715m?l$R›W˃p cyXyMWK`p%uA,l~B5iĶ:xrk&) Нގ"%~"g7O?d4׺ HAZ# f& A1R*)u|C`&AZA*>̂oT5A;p{.ӭzSeY](땢<*l)` g]n׸sa& | }CQ]yT3BF6vVNC ]?TI?3\Xboo}|*?< Ӯ7\7?HtY6/a樸65KLD vR5eELsXy􏂗 RdؙhoPLG}svB >-(ýn\6 L%4l0cK4GحޖA"Nds5[WPi)jgވ4s\oMǩ.^kQAve@f pD]cd]/S/T;eG_3NQP/ UOw?Lyt.+]a|uqCU }zr5ɝZ ,܅B)u&#@W@_*e*"U[J0St0etS9_o4:I!?5Tx9Hcߜ &uY(OΩ4o}cƊ62z&;j Tˌ9z5Ѐ6V./8r0_[YWy2M'&=) }s걣}]N1ndsA R̋n~#"AuLHt( {T+zDk5dpH MǨ( q6'6Rgͽ$.c \5owCae:]u?S2N+-, hni#awW8!TV?xՑopALLd!;L!d`ȼT/;.J95qbJ"2M8('{o$4k;Pq (M1j3'?yZK ξ YtߛEHzNn&`=d)Z'O[F~}^U#[:ꂏn6IM-&^k9, qIjVANp,#H4cV6R,89/ɲ <U;1`F:]8JnJ+8T7) K" hlǣr(3:esα K* ӵ>@m&"B -4vٱK`NlPiaʟ*pW?M,<` ˦btE4sxLO(+hCgS@6 $$>k[T *rI=0o!nK_5Z 4S-a*n1+<2-Ӫ)i 2>I|FvASRAzݛ˫e1S!JE;ESw`r^[(\4:240=uF<2CͰYxIīGo^#tؐb1l9FЌ+aP1CB>htGM؞@G%cZ# W_K~ $ɵƏcw,5J%N?w,й{m|+3zæaO#C"D-f-v" ;9P#+5r*^t ')W1_8y.>S =&(8zto"3=,yT{õp;8R=,*`E}P0d-F@ݘ7S1<72Rؽ&%_wlVnCX {O fI.ҟA]J.WC~n*3 ə),dݷ5i)nNFݔZ% _rE1yɎ]kqPLF alLQxRqvǚU~a1z8`)4xJsYw&U'=֣d˷JzZܟc:P@,B%qxUm(9c>U Ҏ##stDᲾF |+K5S$RS2Qt9Ʃ2}#3J|Q/x7ڎϾfxۊ֬Rua/;Z+wE8&A8,[nRj?u4cl@ N7 RIacwsNܝru ]4|!+ i=~ 'ղ3tԞA-OǕ?|n+#-2BV,UН"|a}O|(?/[R}ɻ)ic/aB.PqٖH~FR{A *D+]} hJ ]o9͡v[ʮ]J?XXlRQP^zA@Ne!!t\-.9dkH8ο[K/vFdurWT=ݵ;u`ZeBCL wyXr8Nt,/_~-Y#A .X)9x"س{*Dg<41jSո[ ,_uF1;6FXtʒZ`vx3=Vkfɸ xA϶6jՎL7#5.Ig%̵P>hw!Η6qYQp5X"}b׫w`݋#[odS`+ptHv2iAp0Q]MV~zW\2}Z)$4 jVp=i'M\trf{˵QVwUTA=ݮÈ_Bct [[mKV0pSﱾLMٺJ3 sD)*]æH+K^0*y fADJ/VԫRĢtT"+ = _/BzX} (?ReЃ/{&4:m+јn d$nk0L싟̀bva.Hm=^"%v:iGSg31ٽ; cr l` xw=|u"F[I{0uة+ϟ3"f,z8_4^\z S_ϙS9},M}J &:p%ij#&?ȋj xn5Yh9/G'cM׸U+/%]?aGٓGoғ,?8Og{2, 6N+^7ybjJ;EZ/[qaUDi a9d+X:鏔GkLY2ddy.V9/U"CAֵdx^N3 {Y >Vݮ6 l(kaL%xJDPx8(,ef]ҲL91u K8&.=MhŧIG9 U6fA\d޶ѕ䩪3Huh=pKiOXhT})̉\G9 'rJoB)VION6覍 3?ƒ}@5ӔvW {GVgײA`i- ǔb BZIznPyݴZ@#n?' bH\ŶΪD=F9j{²g}@ߌ=6DUۙ:dH7q@5O7Mk{mO [/1%+ZbG%$]sؼxIXa {s. ݉\-ʄ1;쿠qWF]١oHU]p@$CaJRR7,FZ|O{W8 DgW\I|({en¹K5\VĚ4 mKF_FoqCb֞\`Ve;XAaitdPT( BA+r;ȇ\}=4-NbqGQonH+C=_Nl$#]5˒ra?&RnYn{;]SPXS4ĤCY[ }m-]KNO 'k?b\R8vE "ij^?~˘=/ Gt̖Q|ƝHZ0Yw Wj l"C66jj3H:WhC9< 3˵EX\NU!%!%fsrݑAf3?#WkoD S_;ٍv"!gK:<+an1X;9!xˏ>|PМAV\9(% P Wdih 1)La'wq0CDv)-ZBy)__ <N8~wFAF}|nGx!2)ag-2 TzK3 ޅhw1LOYvbX۠NpUc3 @z\ ?rҢ?$>x9g|lR&e&琨1[L8o{/5CJ<䕤V(&" YG01GtJAP)w߁o] ۦb#D,^gd1:twBsPur꿩ȝfwPeK,V2&Y{vآ$Ҝ*h՝큠ل%93ɱB# \e泱YdEL ^:h&n΍16F=^DAIzLlؤY<0iZq';J ڊ19jAumۤ=1@ks}PK}^^"HVk af>d\A=1'wq{HK!a Y%U|)ufg'w+A)d 5<ugg ':-A nW P]i#6eJz ;Y]!K3Ӻѻ_R$CP7"љ 71z&#e^ӯRT(mM/4m7<.'h3ک,v)&rEK(@61Ɯ;Y%WBUOQV׬ⰓOϜFЈ֮8Ҟd2Pβk'7`+Ga4M+*Caoj\yu ~Cf =ê|M/NDFN8Y ?ni:\IN:Ó{O U^swW1۵SƤM }>6֦9EbM!0>8vϷa ۺUJ+Gw"ZHPk8;ѧIdB;kޖܫ-Pi.s!:ex[ȝusxOzPbi*hLC2aX%GΈx''*n.~/F":~e.:(AVf&Z-}p+I ^7YV KP Ŗlr5C aП'Sp3x[;vDiQTí8뱮T$ч.ERf HkҎZC &;q3WLQ]ls]\ (Ij ƗjŕnӓH lqUsߞQaJ8|6(F*seMG@wm[sQb `7i9e=.M]*X]"ъNi$=$tB"Is'c[ 2"dPT~R bw&)B`#B[Q6o^Ʊ\,JQ+\շ[Sf[,kV8OrfiK~!Nn9#Zȡ!b g9MEdw[A%dW;*:WJc)~|\/`3m"%޹_iΧ?m7.g Q1*mlԇ ={2߸;1%M^1lc\Y-1-^:i^j[Nx"&lnyx9 JENXO rs m{ d$䑫/gtrG3$`IqL0M"GW[JzUpO} ` Cl 5FC)ĥNpFSrsN}.ed~58D r7Ge4Kؠ#\axk/a#aDǒndkG$G?ٖdAȔo.M=.9JLg->jlWa#Fꁣ1Nq: ,CA2P3nQS ?' ѓ^/aC{F%?8IMu"0.M@idP谑:,4aN^U+4I^[bpLgN;=fj`1 dO*mQn<0 d5C7c90z0B 3>3t1UK{ %8m)`CP婻ȷ:<$׳(Vwug(jZW؎JB:q ɯ6[ fYa5ҚΩ#NΆC W7o 2 T b+cKvS5">]LCʓk[&BOiJ@J H}SrI&:-H ,U{ ]`0`ػfNS8HgPNd]!1ʻ5=@|H_\SP),!hDNB^oIQԍ:$7j(gqu(kEgxH!դ "΃*̩ղ6L&w&+oo%tK(3Yw b@1 Y:l嶳\ ,sQ*ڏXj'B1BGO[/ j VLe<Oog dRv [jP<l`},kz e}@Zb~Խ<);)S,hpvӝOiU{E:Ӊ0] hPK5BIF BUY:ctb-DѩCDOvoY2Ν t_|he vBl֢3^Jm.lnnfBG!%ؓn8X rǙMukaLZ +Ѧ6{J_T=YIKV NNf3%RR>y-$&`@09'1Y o$WdP.A:׻52n;ֿK_jڝx d]pH90[v;{B᠌른yf[:įzLqk'5`nLđ8u21E\HFA $Dz`sa<iG齌IF:#$N=/W 2>LNX,=WuW#`*~anNޮQ> endobj 44 0 obj <> stream x]n"9=OQ˞E oDB|&3@AE޾gnHrUw\VXOtǴxZܭq}ob9~O/v}:}_~_//WU_> endobj 46 0 obj <> endobj 47 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 11 0 obj <>/Contents 12 0 R>> endobj 18 0 obj <>/Contents 19 0 R>> endobj 25 0 obj <> endobj 48 0 obj <> endobj 49 0 obj < /Creator /Producer /CreationDate(D:20081107191244-05'00')>> endobj xref 0 50 0000000000 65535 f 0000859662 00000 n 0000000019 00000 n 0000001350 00000 n 0000859806 00000 n 0000001371 00000 n 0000001520 00000 n 0000001539 00000 n 0000055210 00000 n 0000055232 00000 n 0000185945 00000 n 0000859950 00000 n 0000185969 00000 n 0000186121 00000 n 0000186141 00000 n 0000240028 00000 n 0000240051 00000 n 0000353310 00000 n 0000860096 00000 n 0000353334 00000 n 0000353499 00000 n 0000353519 00000 n 0000407257 00000 n 0000407280 00000 n 0000528833 00000 n 0000860242 00000 n 0000528857 00000 n 0000629431 00000 n 0000629455 00000 n 0000629646 00000 n 0000630591 00000 n 0000631556 00000 n 0000722158 00000 n 0000722181 00000 n 0000722379 00000 n 0000723324 00000 n 0000724291 00000 n 0000824876 00000 n 0000824900 00000 n 0000825091 00000 n 0000826036 00000 n 0000827005 00000 n 0000857219 00000 n 0000857242 00000 n 0000857430 00000 n 0000858495 00000 n 0000859476 00000 n 0000859539 00000 n 0000860362 00000 n 0000860460 00000 n trailer < <7344FB0B07DF8A142983DB375391DCD9> ] /DocChecksum /B47B21D30A8614E0432CDC69022B7D8B >> startxref 860689 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Wishlist0000644000175000017500000000166112277111530016760 0ustar synthsynthShared axis from the command line --------- Smarter ASCII reader: should be able to use huristics to get information about the ascii file. (eg, is it a CSV? Does it have a field name header?) these should be used only for new files, and should be used to sed the defaults, which can still be changed with 'configure'. ------------ Fixup line/arrow dimensions tab: x,y instead of length/angle -------- Edit multiple for other view objects (arrow, line, label...) ------------ 1.x kst file read compatibility... --------- Thread kst2 -------------------- When you have many plots on a window (like 35), and the numbers in the axis labels are large, they often overwrite each other (so you can't tell any of the numbers apart). -------------------- in or zoom modes the line cursor should appear in all tied plots. -------------------- Some automagic way of deciding if plugin dialogs can make plots. Kst-2.0.8/devel-docs/Kst2Specs/Layout mode.pdf0000644000175000017500000217620612277111530020116 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xZI7_[ahA!'gK~$vg`hzUէRG2e?#?Lϗ P8I*6}x_N3Yit=if끜fnb+;ʽ\cKNV~M.kX׽Ṷ 0oӢ7:5^|< 3XXhE> +U2ZlDѢuVpkv=TN q%lkc٫ %^c7oxIB%%׎\1I5CI$Yǻx%ʐd2LB̠7T)PY\Y"0OF, u !h+܍:z!ߓ=nO<=AjW[cIFX9fkb6_v)wg6CB#=s vb,P` sX?X#j5c z~gxyφY,leaǖhV1ZȮ4Tfu6 4եG] M@I:Ww9U7nQTKl̥-~(IV2 *ZP!JAEd4FNnJ'W$ғPr?*0 ZaX,(v[Rr%)5w ݯ+,թЦl@էL0'$9DEVU4|0xVB&ODK$ǘsrdɃ@rdeVރB)=y&O8hsP4.-KfPxDOvOpu;5O#w*o|wwBwCKcnezL=/% M!4+)+*R<ϠZk E)қ:yLXӈ])X̺Y9!wf3&2-R瑉hٕSᡮ.;ڨ0]H%- zxzʸ]{kc9h֙5aͩ.]$ng۾w, sAMY3fmZˑL+>{R]WT[El2Ry\+3$\G[M!Hl)iBM?&+ FZ'4)ʣހa0/aPصH38]6XPRY+;B,jGG"@4[Eh|9ݏOOyh/0>Fq̀K wȎ )KKߔ䟢$zNbq )Bg,e k3s}ւwG=@ȯhӦH$f2BEYmxrʻY>|MV|r/ϷTK@ҏR%Bg`5&Ԗ֩>N_|bt)Tho}2M>|3nL6WˆYcmy v-%q5=P endstream endobj 3 0 obj 2006 endobj 5 0 obj <> stream x$Gy'gr{ao DYDl hI2cdAda6Hd!@!H '#Lw{=~JVW72 )@`ZB:cuj YuIKC/R C6[udF'8xx xO"cՁ>?V/Rݷ0rD9`XO !3$9Qx Rѫ"X."‡{0+Eī[6řU6`Ln؈}PUR:{WcoBFZ85xyqDa$N!A+M GflS06nsRFD("uºaːʶO\µ"΃%-u,K_$+.No40F."d[XA\rQ5{BR!R'IT,ػa_>;"D!돽tY4"fvިkSrF%^Vu--V'ڬvt(&p Qܰt@ NވHq9 g;nY2vޠh F,CdWu4َVKrpt8kƎk,C:7,S#p䃖L,,ZĿۛjvƞm0Q4%W5`r"/Xff-̟f6L5K*8!$E\TDƦ#К#]B >Vǵ'13%@Cƞ;̠lTڔ, k44koؔxefʃ!j5`ovن03%@CDLKN{UD܁6ݖr Qo#"i "85CZv?0hpn;RDt]DH1zAݖr Q4éK %"VMC("z:6DUDyY}f6}HH3Yzz̀jc&咍Mor:MkP>CXv񽩨n @TL*.)zRZ7]/T369`lPnX: 3h-.p3$^dֲm0 ,>8F.A{,iXcͺpF13KOHE uMl ڗ K3F8ZDД$XF3;K6 h9,> ^.A{i[3kD̺p&%}HTuuMl 8 K3FDZDД$RF] RH*Rh9,> F.")D^3SZv̺p&KHZԺ8Hn+(Zpᒻ{ &4% >,Q^YbYu^AO#PZ RՔȫgX))0x}~ZDѬٍ%@ʂ$pnTKZXV_-bE7AB$T5u#l`G%Q,`բ+%f5ܰ/O(47".r$$pn˧"DДJp ͤ⒙W"͊;#UAwF,c$8Fxsþt?-hހvna-c1gE;ᆠ D5 ͤ⒙WnQwFʠGXQ~}GtXoYD!h*QMB35٤GֱdVQ<)O(47T@>}hqEޠ%[c|ϊw ASijy*m:jzc~ʔ!9epH~ZDѦٽC4훨.aLW|h憬TG5xxe72)댠5SqIh/KīfS# $>xs !>8N#oо6H3<Sց5j*"nf]ئ3DLY6V$,A{=?$ći ڷ-YQV7"\; ؀QuQ{YˬȫI(SUpfCpQcWPv)4Q ZVܲh]߬q]tˆfU!9wkUձO,+nЏ'L V-%  U}uq^e%Eow|-k0]{llfiRf`fgJHCcM+zӓ+%bJBłASRqID׵&뀙)K\:=0ֲq홮:`fG؋GUHȫOTR^Nh]19 ^\{[ďa1s XB[۱w#xE떮re6aĬ.ʲR9j>UѭS;8f^Z>D1 N7.IF9mͩ((X`nB?Z8Ue ݊+ZDLvZbW53b|o6[QE)嘥n/Vw+eގ٨#\8^J߮b$^-7+Z=֎^8}{ت81-bD߫;=tW_x foG[Zpq)Ќ ufZVAGttu Rxh_X먈o޸'Ux{7 4}2v@h&WUopKW`_MXKD=݅"Qw֢/TZRt@CűcƵ?l1gմu}lq.eC{(X#-݋(TZ VMcM VV"$C%"IsiA*%‮c'o예q wul|pT5k-!t-;iMekܳ{%:H9\*D]qC5T$x5E S#z8`p;&bܿ\iY UnYn%fՔA u}+"Bk Nȵ*>,O+e\ٽRx.嘠qo>ۗfYzi惣$RٽRڠ[S*I6" ,Dz¿ Հ Eg76\l JUqN1-[_h6Ri<@ HIC:Dx~@GI@+''H999<@BPLΛ]F\"i dvtB2=U%E;R~h4>],)]4(@C2ƧmA}R_-YAHNd< sDkMl@0X y0`MDl@$依XBv \|şg>򑏄vn`7 @ 䎝LC6*@by^V:mR q`ޫ;|2l>餓^";Ke}F(jT,YLf* 6<򑏬ST)=.9DgMd.233S0p`g-ݙ]7PSD"@XsH[[M7TǯL2p1Ëg*.;^td:sW?=zT*1Q]d.l''ءMًLjY5-oQ]4eMzW*7d22٫xfggG?3B {2L&+>Y5{,..^:ϋc@Xu=t솖Mjd2Y)٣ns9'b-cix52ڮakhԌF&DP^xa#GՌGupC^]ӢKJIhf[܂nѮ P=Y=_uɍG !uj:V(҃2CtpJCߜ̚po)؀ȖY"zzֳUN ;ŵ\rb`DA+GGXs( @ H' KNw]/ 8\&UH :/誱h43;d4>ؗ+땍?E;#eD400PxR!kSE#^(3dVNGh;.B9rؽ4D1T.vOSyqOM&hӬStE3 ުhGA/ΈmD<>f V9: m*:n2d ʼnCP [" [ŴzWo;{6m섺nfyˊH퉠ϱd2qg,5li77[}{]ZӸzYZ30ho؂nޥmB-#.2bѦ˲`KyqAdUGf K̇uN=}scW)c]Ӈi\MZ`ľ neMnh$ +-bQM[2,dؙpJ~Yg}z><-kv\m鳻⚕n^A7ĉ!auUnta);*#kGT=s`3\rIq0u]`Qі>{.NˈTdM٣e ". aJZ zl'>Ǐ3d^sY7P' ׵&Uf׬F,oWf`,xHXT$SNm@y^V7r'}}sqOŅW~9 -Ocy ~3~HLk`PևL@fX;'DLA+9FK˷LtU60M0+\f]Vnq hO/Sw[bw䳥}4< @fX;!DLunZ3\mrxL!pF7K ~J-EB=+UҪ`ZM>;o DLnU#GjW^p+V<3Z<mm|.jk3v.z\s=QRF ԫq: [nr\ǮS xLYR9<-o7E lFWM7Ţ]7+ELoԭ}L\DU SgT5 ܽpyrgԯKf9>ݞj~NoloɷaYw"xmMw:\ Nf> Beօ6ϵ;̽]6J{}/ǮݥnL[|0K;?Zu.̔zu @$Ƶӽjuჱf7:s chM s-o,|͵+=}_N#ɛG!mxå%,ڎ8~Ҋdt…Mq`S;[nV)8 Y>lv#<2$,>Ɂ{uToWZg WE<뎈#.,:Ȭ8A-k-U> Beօ6ϵ>[9?\Oa41E0 ;RXW:;]6!UE2c"K*䠘{xq~K.;fei9ެRDh动Mī/.Z-&s%✄`KDnI* [af07_W-4b7+.G5ni9 H?DiAf3"P)|!Cwmdxr0eӻrE]~C$NǸF*=AĠKF,mA $Cp֨dJ"p, Mq<(Θl?,65RDƦOĝB=GٻY2b-¥f- dnX"nV[l)OlҠx@#$݁Z`voXY)WhgDY ڷrhS7;ccAEll@ |zDɆGɗ6TȦMI2 9|Z۠>2di'x.,lH YȠ$^kmetxfN$.b GNN]BVʲ4q!9呹&0ģrz.oM?o(呡2 M#{.=صkc}CTF&YjT=6szn<2TF&i<fP{, VE%_3|FyU 2  K_Q**ii]E#4"|Fi> ߊ`n$N_QZT(}iWƂZP37sJワ(-:J~*to -jMy3xHuH%S{pWQr$ (9Ӕ>4"d3m@#+}iGGPMs&<D} ¢i馩|IO+E.9L_[Qd;J]Eh"fNui.4T:m{??;5TAP&qt_OQ4 ?m}`pWP,>V /TcTh4>2Ҩ҄҇^<U=s|f};(>ҨCM$? ݿ3H]|>~>y~,"*ʅ&҉Rɧ*}i+Pf?Q?= OxB}\,F+ @*Q'r2T!?]E(FǦۙ9Rl=gϞ[®"TҪ:ik(Jnʷw|9tTpo֦3T&̏~-H*kJC>CAy?.Pf/(toy#Ql/R27ٳ\V簖bw~x,J~<7Etߝӌ]{[oU]. |~T_~ꩧ/cy,5?ppWTN|>پ/WTwjE/ZVW 3Ro/(*TO'P3l|`}v~_e. ###?Wu]?>_һ\^%o&ƚDGbǦ"Tǧ Yرc,{ Eo~Ws9g׮]**'{PSm{҇F+5Ӗ7tw3P,{օN:; =Huچ W5ē>M]Ed7ws饗^{\q% R=鍊nZyE]t'.@5w("JGxpWj.vǤ===]vY}=Sb֤-"@Jŷmg>Ǐo;N|oWH׋ҋG*h)^:?Sϟo}[czoLD*{ԣU?UW]Ї>mEi(}i]U:6UL?wf^n՜tIW%rqQ5h?,`T###~W|ƍk/.Ӡֽ҇/J:6y޹4!_:t;Vގ.>a핿ϜY2$Ss RJϱ]6U|5mN=a|ɟ,vwK Ln|Di⯔>TJ{-O*ޜv/G-2MmAw_z 2bO>OMQb3J~~H>|_h,8kX}_c*Rط|ngmߕ J-Te/(EZ>~IWՌg;.VwrĺtTֶBg~k _}$XaI2op/R؋;wsE" Gio/'*?Ϸ?[3{.57-<@њO, OQnT1OG,F3|K=G*#RNбmKz?Ff~x  ߿|[CrPbyO+CMߵчsMOʶHO}'~izct~v馩 Y(mP :֋ B}^4b=#i9O?7N[žىS0[hϯY%\fB4 4[=o\s2>F7wdߝIef4rgϡ2#)N_,/إa;gh^P5|nڊvʾ^s^g}橮JĪBK&:0ICZP ~>JVYD_|qAm9{OSDϜR܌w.\0ۦ7kOi(i .M Cut<^*?/t巼ջ/=|1+GY"+Ţat<Zkğǒ/nx}e]f{ْoMo:ccaUSP楻;_;PHlGY(=sXFHU۞N߹^x玶NMu|zN)fe; *KEk. XҺ(a箘S{|5oj#-LxX CCKs?)nLJUΨoF3P@/=dãt?>nf_ҍSOP:]J.CKC`9fb|FJEОt.#plwZ˓ŝ; 2^V;=Q jJ~{[*ѫb]Km֍пБw-\cyb/Ru3?jMֽ҇O'z*OY۬U? i '#D.)Akn >ᣖ>Sn=sGNM)Vցo)}iI=1M4m۬ǧg2-:RO쨕-J~ި%~4wjJ8O~\⯽~uci_WTPP6 A5QkJ~tnߖӌU k} 7pwOǢIw9a0/LPb{nүfݩ} OoT);SӠlJwi[i/ fU{}i\{ Uڌ|[nK> k)}DUSŅN,@ZК߂҇6f`Ս( ߱mߗǂTЏ&Wr-eŲ tS7BS̗~r_]ObܐGv-۬+5pOUG+x!Mf+]  tyY뚻r;B۝}xB z#V",߾Nu'g-f-ֽ!l}OUN3pӠҶr.Нմv Y6 ߾m0oԶRt4^\4b#ģ5ekOsEFֵx}x'! tW*ts2Buul16J ݿS?lpB>B-.1G Fw >#T5J~2w<{D:ִ}iF ? (npȪ 0B+?>M!7[W&ۆUlip4Yk28JM?W0yѾsRzepoJ,<$y)ċ*9OZ ?3iKaEۆ W<txax%|*ZUJiޗqJݚ HU҇T9T>xqRf]?TN3 d(u4,|Eh|v4_~M=wYRN3X i2jX]j+Jqϧ6k] VJEŊ$p{R-\;Wm^_h~,?jf}iO-BJ&NњpϨ= osv~Du;M0w4Nwnj 6[|vt!K/drxUx,BGcj-RTNSMt|zWƦwꯆ_wTb Oe;HQu{KMsY9oأT vɧUSzsz^SR&䉐Mo|u˗Ƌ?1޷8؈b\+4Ǧw|p.=?GoR*usU_nVi3'cm O}+)G[d;͞Ov( &+WCAiJ"N#'Ltlzk6.oc>{DXޜ'l季z@;'jAv˅l=sk--u ,^? JƋo Z9$ P jSUȞp]eV9)I#ts#B-'*oK.j's{o `^XfF_|VDӣ9,b7|i4ԾplP*e.-*O'CZPjئnzvoUgrkwI|?B~d.0] (gBZPOQLtNNs.4^{Tw p ^ZPK7LulQNZ4/fzoO?`OΫsmsWXZt|C5t4'E|J6uFk*a-S!cko21B-/)n8)t^,dU{}s3{Br|@КrnܮT|E !Ԃ+4=Ja>_|Ix?|3-2ʭo"%jAʘ tw/r}!ԂZ>:յK̞gM¶w ˺͇W:)$q|B5|FliV\8U kG*m1oN<3Qfeװ <:P jj/Kߔyt]JE6_AY8bDȝW|£5OVoڧf eބⱖ ܽ1á]P]#ª.B-(5^y{4p.툐k iB-KJOͷ/fǓ{xs%.g!?2jX$a|^B|tA4bin:CJ ]Mg >&Qב? ޚyVHI z:ݵ|TtcN8||zUk=\>xcgƔxR9xk"Y4{Fkԁoji}_vO(f?5Reu/SSБ~V?b>5۾-x"_YA4 hBc=seŔx9'ɧëoxcfhtAB6E(< U[ZS;m8*]KK7 m:6)mvqV_o^Bc|9}߫ٸ4~QK2Uȑ$|A5M% i,px#pgAO 5oϓ-os)+&[ȑFkHpBUDwN-|▷5&Tjm'1{Qw1:wox?ek' 9xh BWFxcmK7InjJ~O霙ez}E 6;p|in"9x@q<dB?Gʕ{,_͜';d68ԽЩX^_(˷MFb^"lMX*\ݧ#A%P^B p]e,'%mv=fg?w+6s2׿<,ǧS 659B>e!BwXBsҍi{GQӛ^7Px,+&ѳtCLM;R5ba{N18'^cybgut-Z- UT+DwliIS sW}=HБ6%FfE kgP((bwOo~@G|>7_5x,Cww:~1A+ix>BY^#pX > Bijx]>7?5Sq#K~{v=NAva@cV-7=Bui|]Kb_K+\w}Wbpe]㏏x?m,S`+ך+O:tYv Ɂ{ŜTqF~^i о˷*ݳAMQ4sQPg PX_k5vQw+ڦrٺ|p6B?et3;jPfeoԱKa@B(O~~<9x_rU.ՎfAz.v[F)!u/Egۜ:Cmz#~ GYr>6b\B)bFj8^2 >9 ?I[ 9{H:987Ԙ9֝_ű| ;jPH7hU&B(9Zum jûb{Lw&Cȳ\%̪U&B(Q9o,6w]BF4ue!tv5eH;RODiboL}P Poå1#hu0) d5&gP5tb}Ǿ毩<4~KbO~ jR+QZ]DkjfADQ%~5{f= X%A.RDqu|tjn E-<6%ߖ~^]{K{]?Lc 2c!P'xG ݯgܾXhSjWw* ޷c=^70s%POcdFk\iX>_톟神|jOfB(iFV + @G:ʒf/Sڋ}&Vwi+dUmoXv5Å* ?:Wٌ簣2^V|l뚉J|V/'"=A܏C6OX?M];jSǝhgl Pe԰ˉRV>QS;r,MҾ9;]6/ŷq\y醐ۢTwvP3쨩ƼsG[m?{7C)4 KvXǧoH{4=vŪrzJ3 =3+̻?5VԴʏ/ʟi__R(MfVanV-.(9ogԉӵD2DK7NulS"ˍ<+x&/-olx{>=[c^<2un^yRC?#=QSçuKSck:l۷hWi(>/Yn6u,r%޽aFm{P:/b4J[k.JO+yK~v(>k RhHs&6On/{&}wQ35UyQ0Jn>`QÅwI1΅Hf6QZ|۴ȩդ]ׁk+[6w@]"nQRcӣb*8kxۇ3_z`~|1Cd멡ttbw~{^,t+ckeG zÅ#ȅz >Qjt|zV{i)W/}2_htީLyz/ѱ7Gf0 oC&d+R-e+i7@m~S_ܕ3k*QPgT=6gָ,-I|}dGmzOш zObG jf>kNj >|衴hgG·ɗ0Z{=s4~{(Ҩ˛wr{ia]Sݻ̓/,]{wlxVgzw}t$M8J 2]bBLQ*Μ`ʞGpi؟vt 6;\83Mw1)ܞ>2MBn'A-'|)GJ=յ4ݳ_xi\u'8&}mV']㻝:qg^o+UUhtT?uۃ/Bd5YgaVhu Efyf Y'>@ĞRyH!gi_Wt}M|{5vԜ^v@a9a燇/O[O-j8CЎb =X=k1'֚OF#N= 5A:Z[?R|wߓyXԎ|173~"ī&;^R+&ܳ!!_"gVD{i/S=vN}GꎚmRkoiAOK7NEQ7v t:y].Bб;k[],/:A9|MWw2O"TMY׽cj6_*.^sǦx6t8WwUٖߓA*U.5&hBЦj߹pm)iiܱ'TVQiS8nGgh|CmӆqK_y!B&SNS2n|ThI]5 $SJ?svtwYs{{ʹ5Fʳw5gEL>FI_w Toǁ[C,Y0iJ5ΟZJiP!7A Uv~xTݡЕ/O}1t|}]y2fJ]ws_ěu뻆\e=[:-"At @UwJ\d+?[_3_RM>#kҡN|8CA3_9'iOvSB"wԔ.^;3_ʯ{Q_dGHWWdQ JnجwPSpB5? *J&<~7{)Mwxz}=nJ=jGwTiŮ@ol.F;)(-FDQmyJ~]ش03玵 Z,F'9fGͶ |(2KjXrкhBR)WwOZUh8h5VsgۡcOGBG^_t0f׾X[.R/h;RсҢ/SL9jL>-}nt"T}}1(!bG`+̫n.ֺJ@n{qyTL?o(Q:0 @iuGK7oV537-:\fйtcP2>:5P1jP¥e.9he[GBJvLFRjSROV|zQH*vE~V/U@(ʲGN|,h&]I4kzOe{kOnGM5<5~V/Sdg| R#$LvW=w;Z "$fu,=2Z$@)3pQt>*OoYOah6mpk*= '֨kDh˛cF&76/涼]K3hMt;IRYGp6N3P-V׮Qsp#'v^:ѱM5.vw}\oOZ`v|qmX甪jݻ)Yt4\2˪)4H3)mQ-j_#Sx}cokO.Ҹ4+cZt2z'#vϑjN)|IWi!xG#5Nځ[JesRqYj馩.]+ktli!H0mt4ƬѾZN9[ zgQ|~_ğ)mZW;>4C ]-o>}%=sM>yw5k|`OU@iE-*]-ANҥ=gΆWw^ޣRݟwYÇ Z?!'6(oEWM+&K{tۦǟq0fSӾ!{)ckG2@R'+崹P|w}퟇e.~] IQ5+M-j ߛK7N ?w*FwZI=1[9ܥLt[?xF)ɧwXB ~cEdmMW^m_ ϳ:٩w1˶WzUƬS9:]o%t8j>xFӁo;/i=Hӫj?nL!MVl"9tdNsפvCv)EdFmyW{+%o4~?͗_gYjH.Й6?=g[xw*M7nPe䳈n+(R:ZEETOd~I̡{?|kƬѹetEopoboޑ?FT6lxeF2E[ޮ+!wm_<"k&ebOWn-z fhY8c`RG+TIOBjR=]= eΟjo4~aǪn)R.25+_ҍBH@"oh].RMg|Vv 2Ctt*\:K"~쨙B+꿛+\7Atp;'Jޱ-RͲpm4fKNL˷NWNh>ǪG޾aT8>ꜷNUSHk7QghARham͘Ngw-|mX>%˪7E3jF-_^d3U%!l5'lL9SL`=u]/E"gx;ID:ɉܪ_Yq 68ˍ.6?Wڊ=N46?~g*!]SD R~Boݏo|}f[˩}Pr"?:&!=9ѹڪtc$ ߚ[=VөM*!")"& Q~AHZ7Vz7|:^-ɭu쯥 "GpYq&6"ɲ6ׇ&ȧ!t)b)'PzFxu|-O}RjӏUUt0$.J &9Z D2?S!䖞:_oKNRFu%>;zp  QS5&3jj'>[of{5?kbK^/3UBqIla:#/31O%-.T3WgXC[ϣdU7R-[[ [7KN=RIaf#zr?S!xCno/sWI֜'9ѐzDVPxfUO(|x Vls {ͷSV0\+'05K zϵ| N>UeďFN.4$&9/'/̨ps"ZH*?@!ELr /*='PIr3T'OoN$[B _4pґ&3j64|e^PW…^q|db*0_NЫRf}t4') _)[-UFS=iBE&>4.Oz TB]!k2وCodW]/s]N"Z7vOAZH'6َ4pu?7 Ntu~auʱ;'],14Fj P~ A1b5~ᄃyLLߖR_}ǥ~@[U vʘQ~e ҿn `j= lgw TN=zO[z%^ut &-],aPG esLXYbs{r`L7VvrէIHyjmױMYx#SP#mNU 4^">'ny=曭O]OcKl"*廐6S;w`r^ PӔt'QY[B[K۬QMFGG=K/t۶mu9]|`Can"i7Z]_L/aIbD{Οmvl8#>Btj=j;<`^{֤^U;m:m}e⛡eG[ZŚs%ȵ>&g=w^KL=?A%9"J~~'+%I2_/ذVZXEٕ$MJ v'_W`]F'FiƆoԖ.+{C#+VHkb:iN}B;_< /3Eo~rH\+ĞdإP~_-J29V<H!O^[q//wVMe%FCpHFNٱt/odi'fP=_xf:M.{_gu])֭[/c9fxxشK'+v -5Dx|c>NG%|j{kԛtӋRޙ$i:ROr͙'Vkk!m7r :\KDbnn?SkpeXrcAo:qsk)Tjb5AZ}rrNib_clZ"6N(0_o!,guB&o?묳^Wwvv 4$%Hx+C5D_:T ,1bINgIȇGo,ju*dJZ7X^Vd0<&<G /6nAt1md0pC%.eMsTUOH<58?&ZjbѺ k/G)ĆBA̷ =n˛&,.y'NMMBߌ[lHiLxy>Zq2u:%h;cV=St=5E"[Y8{\ X~9$OϜ3;gݛ"eEB؞NoM'+vrʷw|A6o裏|fhX:A:ԓRNfr_e~iof9>:4M(GZ^XrdYJP:dLsvGu9a ل ~h%Vǩibx^8Ywy%~JLY%ABeN}H \t!]WǴ5f.&Zz1`/ns@?RcΗGB= _Rjuڊ85E H;kkJN5Mzr{ O.$ю}_YU $Gl@q_BWȚ.bYe9@3ĕ_*JwzKuevJv,] # @V%=*j0znUP[**u:©Bj9RPKs]CZRMeNI*4Ľe}A;C*NNj1ByKAKt=q\kdqw mhYϺ $l_gb嚞/tP~IBv& 1W]@:fSxm1vG_P~!Ѝ*c?m%(x l)o.#i^Y7 y_[FA" [ B+G )_BU;:F kWZRL8KIlw;^RklzCRF Z‘/ZЫNSdKWIV45T}t.oϞa: ȑX '4~W޳e4e0[>_/cD7B!кTXG@LW%뜼Rd_S]hQ.B>FެHXT B}U ]i*#͗ VT,G!m"GȕuCH<4:6[uAh/Hw]t:6 {򥋬"S:N>P ,䮯qČћh+*̶jtͳ?]5b%!,k4p)"Uərx8bvʌ*I5֒/:q/CYsBn)&!t'"Z#V,q|ӏ|uꂯEz<8BjrB(qʄ9N>X ئN|mj&,ҙؠlFcy!#-d%2DE_:9*\Yi'vHzB4 hEEݠQBg:NǾQj')VoT~:yGB:Y@ 8rPSWB%ZJ@qJ~[?:rm!l=Y)7R´Jk0BH2Ab(!ڟTOTU:tIΞ '+ӗU^]DXcXLB984x@t7WG$|9>VVtr*lOx:R]qbN!r$o|R.=]|'o'$'[>NKQ7JCC"u7kLBf927kCtVdLT6n+Y̓~ 92R4K*?qBF94q[B\wy NofsEJQu:Mtup LBf4,xơiw7V;Y4fSa)SY[9a>ido-4wi!ݴ(m`;BK]i;̮Ywy>T3E R{4Bȣ\9indN?V MR`]BlLozlo]5 *?/B:Y3 !uW %"{>OJq^y,?W[NX!9ߓSӬ@!|#`q{BK%HNQ|troeJ[_ ͽ7 yG7_KFmrv %nݕ)Jw?}>-xiK\<_Kkv6HΡybZ4-N!%`MxkItȷ\=>J̈́SX0OݗxItfEHPCZw9@!W#8G!Z@Z45'%=eN);4T^[yZdkcFԦpE~Q{>1tqn.%!T+_őwkILkz6+-#gga9iwV'Ȋ?t٧k+]ن>B'jsP^o"%Z=>E3e|>xw3|ۺb骞ߚ ~ Һ &N#%O(d#T _)9A7JpUi/J?:H|};YBn+ MMPr2bd^W$𾳩i•ԣӬ@_咃Xp7rB.9+ KVrΗSis*++={ʁ o C?:I=Hh/sz_J6Ėݏ:&w4fz&p\p!|{4L%( 䃕u{>Q;1]z{"xD彩S3?xkuלKNSO=$g:ׅDGP1@kB+2{GSV¶բ, i.YKP~AU'Qf rsHz|j/z3O>]q4rua7#j''!-?6tI.wPg{85ނ5Bږ)`|;B/t_"9?ߕ|'} #gB -͋PBIW- P:rӔN2O )?;^rlJ zC7&ݕߕ]J]șNNz"HmQ.ة`]MaʗV؇uХEf];zCQ 3LSGtJ?KķkCy̯\AOt5@◮B9P%T Ox3OTcAb:ZH$gS(=dA+G.đKbV~B"sX+Lab hr~;9_z aN7zCQQDR7wT~B /$OO'a:Џs 9af[59a YY@J$Lӑ;B';H%\rDV2fGJj߷Q]'B.ތ '8ЙDNRj"ϐ?8>Mo壒OEr:EV~C4[%LpKQcxYBlYqfIp9oA]myNFv!N?V1@>GJl]NkcR>kO݌\]P~!5!5 L]+%rӌ\S h@(ūņLNL+?BˑƃqlֆPkFN-a:n˄/'ʘ5sZY~w8i!| {6+i:wW~C t/˙Nz U.6GgS!Jᕵ96[<:&󢈬J Raeщ{?RBqBkEP~Ch3@RN=ZLER3{R>?1ƧLe`^%uW~6!Δ)[KjT# >~QڷS{N V:|BnQ~B!D82 H[|6v'\S &OH 2W w3hǑCKT3Tӷ_1mէ3x+?4BX/_•Y#{eY<:M2v"u_X>5'kr.RP}Z!/EOho}c) 'R̶q9;+NJÉh+?֪D5+gOړ0}/NRp\i6=$¡qb+&6=ON7\d {i~'!j]Xn 屮]^&+,OUe/b80cy}gw<_rէ2e&Bj]Xq,f]yG!&Qm}_&M=Ra-y-i%HMכK5B kžhYKP]6tj:XƞR?l?Nl>|W;1Ao-m H?Rn%l+kO-7Qx|G#{+ǦLkϿ:1XLM= ~%W6-B9xhX,]lGo(.@NA\=ǵX5ͻf.W&7ȪOeQcf{c':3LzU֔c|`-vvGq`َǚ$z_z;uEz(yu`b<ݍR{=z΂31i[oB=9BHMWy7=*d2w`|ͷ#n/YtiE-bOsj[x#gx,J.T)}ǔ_B 5S =GWd+ѾԣK0Y9|_I^}Re6i_ 9~K3XiYKPޫ@/9#&qH8|%/9_BG #HQ^(vgCM+kB-v<F dAodM?Ϫcw2{=7rlʺ\>}0]d]IЪtzV_v^¦2%@᛾]=dJ)+}gus #LYqKZ:)3Ih%3pE!?$YŒt^JeL!kC&"Pʻj|#d{_ȪO[6?שG*KX]}M{˝Y~WffeKáL>` r$9@C'}w t'yh3,\^ѾqP_qe@ooU£)S i]Ĥ) !l/sAߏʻj.KH)mB-*nV}Ή{ʝ/|,/W٧=-#N慑e!KXs\oItӏUJG&f_64]}|tW=˺?%4}Wh&⨪s -gȥz*xk)w`(rmI٧p2PE3^kmjrv?"5 DssX>hRA;RT(gZ- gRo>'v,YsyKƆB;8S;K 7 \ (iUu@ &}_=t;kW|>WdyJ|5N?L.Ι有Ц9M=bͷG~]n&< WyO7pQĀ+JɴN zəU=]XxPE&leamZ;d[v7[לt:ɰ!l9R`+ⷭ B{\iHNg%򑕁-<>_1|z|_:E]߶(mpf{@>gdv8 /|Nm99|(ed^ɼ0 c5cJd|p3| B=Nة*>4?Y4T ޙA}01_wvgx SaIiWnc!p+-uvg-fKէC?qLs>0|Yt]ԺfUfVT>*iQq=k8&}w9zSQ Sm '-<>t %0Xׄ#NY4 B|>{pMMBw_ZdibY}_EgWa\Z'T]U _]h^[Zfzs5ȿ)dH+[19JPމAh;k=@S壓zOuf[=/kgB o g BSױ4V S!{3;`86‰=]b}:G%\,q~YW"_WiCx,-Dڀ Bn}1 .Di?+"۔v[~%LѪ_I[MIJt-.J]y\2ϴK|$4ruAy؍vQaTՎ}IƆB3-TzD;AX'ǀΛ\CӁre}ʾ(tUo=9'`S~WREgvnC9yY'%Fs2{9%gB끄V@zqr<9˲8q6-l۪}/k$;̚sCG7s"~+ 膛nփY)+J_ňmx >Ay,'QNN1/¡_+3?y!Tj֪-G(1tgN_7N|6P&uC}GV-a:beR-`Bz\ei'>t v2֍81P v6)ĆBzrywuqNSGWVް?j~it_7̓N!H5BY]E̫ZXK?/nߢeK&!>a}B>0oLcf^FJ3P󵾯t >O#Zl رoxxbBԧ7WIog%Ԧ缃0;zj}guFUefUki*t9hy{ Cy,'_{}\03;uߚPތu-[>j:=+/Nd =3'6[: BLC"l:]:wrbE,']1&>b"̯.VtZϞ@O:F w^y#@ q﫼{Pk/˥Yu F U#lmtJ_Nsu:MMli[M,,Gr@td*Ay? D"OQ+^aIO>;zZ4wZ {;*%O Not9b14%(*!놛ŷ%qI.).5$Y5Ǟ2HԤbB,}&rzκuW v%VY"AM^u}_d[Sz^1XY(9!±J$kd0F|UVuʝ{ۯLDӛ1:BAև44}ZĽ/w^y<' OSZX¢k/)?7aIjݕZ|m-E=/5_Zs:,q\yS7\L -T| @G7r 4~)35a8;?X>\ 8yVr 3#(Q!t3OV)YOdjXL0?=Cyn£xÐ(Z!tejs5w Shݧffw6_\Sd$B~_T&>P1MMcT3WK͊NiD ǧf*9塐GOp"9"gU:5'S3Yf춒?NN3L_oWD{~Sѐ{('|良~gwTͧ|k*ZzOtŌK?/ʱ=/ތMK>p'}_5[|K4Vg4wJkWޛR]r |'qd]y My =i Z2{St`2+7MKIN}S@7qw4Ļ5}8SBGJCNb'"]bDC|¶cC4NyONo;ͧ$3Ooj]@:f͹ iz?cp90(@9Byծ8)MroM(Վ}lʾy:MS WX^]u Qiw;9D5q$i:I[WsJgtȦE c7S vsOsČRPv_u4M$O=4Ak<!/"o4_ne M6e4/*M!)!- ijNU1'k4O|_! i<pw;|Eg"#Ľ`u:MٝpVvuʻ};xAf=gЂ{RN{,/4b: t|נޡTBVG}@(Ms#&x6~@G7f1wAJ:)^ }r0KNs@GhŸ`BfV 3>_l әL#ƙ;v`;(w,.ꕏJt+Յٝ9@%E{;`=#3?}_yZ<|@(˙'gtDֱYNW9j;@wdP<(i@] Ljwfl$N7ETi<-3zCt3Qk``AB\[4~<~^DV:=v{YDG Bn<|ZW{j)eTY 9indУP=.8"mvzk ů8@ Z<{ׅ[,}1B1c?ng>s٬`24x_mѐ4peIϔ@LV)Іcxh?{xࠃBG>$#np?ʦP )z::=ܺg?YOOx65k-qH8ߝysy. =Se~{'x 9A+ӌ}+ʇK:eI_O gwbis=~ItCRDDLЙ͟v|MBɎPlrtt[3}O&x= ^oHZ\Ӫ ,<;fw(j|$zG}͛w}+^ kUxntLC U`]P Bϸ$j /g>+^2CRiqG?{iN0 ᒙͿV}00C>UMM U_{)~B /۷/> GZBx4|eg6iٺuk TĽp622 B%\V^}W,u_]P |,C3OT}&i4Mꪫv|׻eqXtPEV^ǩG*C8r!_|\p 7HQ_ǠbQG˯k$Aʿ1|lmMlN- 8\X~i1(PUVmٲeq۷ o'7z7Z2}q= C߀-?Mae] '`s:.:y99E}uS4PJ裏.ncǎ)mnLNlmo-yC.a PrE-r'nN3W)R6t=8^PF7 K%|͡g3D8W[4w96َ!=pSJRG>wߵkĄ6~gI !ű7{,OAyEv¶t Gy-~in{f1Bk=_$Z>T$t]>ÿ\s45>WB7:vG)w5mNd-xbq}-277{oHhcc: t󵾳:e5UyA [&u#HӴsYO7M{Ntz.w䙿:߅4Mi<qs{w$&O?iw\xx L uUe{# \1?|>~oPeE֚8a2U9\.v@s9gxmݦ~b^1BZ٩AI0(SBl4sph ) o/|$Bl-ȁs!t Wu7ry.;)ک YZ QPpora=m\N-)_B !ԑJ힁5-E#\.g͛ \$#W>Brg&dehM7p5zۼ[EAB-뒁[5ט{# orn9-3xrʇZ!B.T3FVt^f\.g͛ \(p!P|'{ Kվw^VD4f 4(X,GMaEcE@k h 5r.JtE?"1hKuIKq! 6i<|T*b Oo lFPw_!deA{!iĢGnPx!d1JԺ4E K/Ё!B_HV 70Rn#1r9ancHC!L$c 2"0C`زړ9.*5؀;S$BiFYLBd{VЦX6dE޸66:+5Zmc ǹ ntKqB)vہ͈\9|H sY2'l&R(Meψt;|tBcY;@RDTG$Y׹ȕTgcj(e58n?eP>LCa+A#r(a/u)#lE{2E˽JKM+2͘Ʊ S|F:@N)"E9 dC|kqӊcKYfLcE +A[m !蔏B [7aX9fx3݌};FKfL%LѱBhHV`# YIKlԞqtW"b!ZAYNsX@$+"zr$nԘ67ͬ8e^B+!m(GAvGB"br$nԘ6  qfLeOS;a=pc:}ָzGԧ1HDN[VCqDeO`oGz2ͤ1ndB[X;4!)vp/r7E5U*7fmL<W>ChmjU9JkUgPpw"6 fsAܬ}h<Ыr]Ɓ "YT#a բ)aMbTJ7FӢw'BSnZfgi =c`{E>ڑ| 8kRʑec5ڞ~7 n&|ЇzI:L ;rO 6爜`uLQ3ir7X[!BkvS!w+;*)RcʶD}w'BŠj3@M\x;(O pnRSMU2дXMy&!tLtRy2!t=xASyV!t|=WϾBW#wi@ O38"*O' ,BMR;$Pi<ڠuBc-| E!=|B(W Ga̖%vHGW_!lg9z {4} :.}hcT@E%zM e|Y؆F鴺ڒG<Kvz /V--"Q@Y%8\{ր]wmf?:i Į/Ậ ib ڭWyr! "eMH Nk}_) @#ew]X4!|=W/pݕﺀ u(X urnu"p/4"M-E ǥȽ.7_96ܭдLYKTQ;0/YњVDκhR;#~ wW7<@ix\ctG2)q+mUG$xx19{'Օ)^Bc!RYwል#*$%[U'%NHlirf?QB=pr,+d lOtX :L%B,>JrZaEH)Չ_04،~LSb mD^yJa[iE?D(c%H܆6R@ n,Ǖ1q6LaHن^˷ wB)XĨv]zv"渣xIԵ۬q L40X;j5n`l"5Bo;j,M$*"%r vv]_<Pη;eK C|ݖL7Hƻ vYСBurqKeT6#4wTu7Q9|Ǣ<Ɂrܼ苀렌E*lW`<HX6tDmi]8*F5@Wy'sy;i>W#^M 6u `'&5F%}VSZFGu ^JTL[]BwH{|4[J6WJ]ap.RXh.L"%H͘(05WH )5*DA)| |w. ,GIqִLew"X @IiQqwRZRFEGhxN@?z@661VLEhZi-ƺxL-z7c xQQi.`UktuGqʳ ݫ4jm:X:vslQHH<@ʁK$JE)-E `{ MVNaBQ5`cZDb(GRX3EB?^qbj96HNLա<)]ޕ\5b01ql "ʑx'& 6Fe.ЏWeDGuу^Id-JVNLBqKrȄuے;`.dq;3q-9`TXnws7p(o Bw?r܌ȅc'/rjiwuLlFlz ɱ1t}rqKȉ[J梗fQ`"5#U&AdY6y} aiYu"KkU}3 ķfm"2|狻:͌GrGELb.'K:P;C|v9jatJۊ)ӫoF^vo [RFYQXQ FDZ@yoYx8 Z*k4݆0kLMW/hq`뢇d 1K5= ӢXwXSHt"/0vn w!~s'E7)@)w!J ^H Z$ }֒[RJ!Ew7(#ȉpLG%F!~'tb؃zR龦U8 nFzR1ݠ@ct/‰pnH`ZBʁ+ϣ T%Ǎw`RD;GUY`!r{f)^ϗ3w`HYXJy6p薁ᾼT)݄Ӣ[F$PYAh|w xx֋\yM#*2JY㮋Xn֦ S˳#qFbZ)w`ڞ)bjmXghlo(|-0( zrʠ4Cހ%_  +eXji܁m,46Z-YAdC n>p\:S/<WYP2 8%dWpZ8.J|x-:V5݌R6Ŋ70=(x/^\.>l1PLjK[Du1#r8RJ"lZxSX!CDGKiL;AN7 R^TzLq7 |!KW'"'x63aWk4B\? )χ(a?z-.ENHyV.N I4i"m~ؐtҁ(O"y;)Xb#vN-mcVu,_Nj rr:hܼYӪZA52Cɜg erj 4TY SǶ$+\ϒ>Y+P[sɡ] Ia8MUK[ )Ͱ{G-H2haC]yخ6OTnɐ|yI- p]ڂ20nUhe}@Ǒm*5Ӥ W6&Qs2ջ̩-6w˭)^Xsn <TOw 1Ӯx@IsrS)Hu9 zi9dE*kw@x>j"yth71\ʐrb\mA(h}QXf;^MEw@">j<8 ]fUvQ֕UdQnCjݴ[{y+nʣx ~-ħ!ep;ZYT}Skܯ8 $C$[x7}; \Og{+Ex"]0F5YWjCP˻ISȝܼ"[+>|tTˋ{@ 猰^|S+=vOBw+v $wZ]<}@A ^J~O;vJ~]Uo(PU: BCA@9*Oa3ا.|Ir0~R|ZR>^Uu *s"j"&GumB_~!o߾h-Z@̩f(BW+l =/1O3_5asϩSZxM| l(|X>_2q+W 7؁U2< 0>/tdk?>o7OF߿?u-MͶ N'g_']ߎǷuտr}`jÙ hEA9r~-.\_̸c|HV dx*븓wp7?n=<=_uĉϑ 3Ff>~nq‚0s$4zw ֪oyy9*w<Ǔp6&կ̏wލVVVI3H埖n>vҥlx Ǐ+;F#gϞŋdx8 ?߾} G!|qq1YȿV)a` ɓUG^UZҖ>2;;_{yUB nhh˗7o$%3u<.Ioo/(-_z5011AJfO/?|pjh'ES;w[8bHٌnܸ*BѣGQǏ@Mckʝ;w^ c3gʹ9b<PY1qٳg@%ϣ+ׯ_'uF,--:C@&FyG߄:1Y endstream endobj 6 0 obj 53324 endobj 7 0 obj <> stream xxE'HQDl *vJQA@AA({Bݝٻi{%۹ܖ;;;GDgS0Nr -uwW@u>T*Ow?_r{(qN&8L]|$cWyOɼӇjOy('ǴM %7fʶ0žfKnһGK/}ۻT҂V:?'츗N'EndW>wٿNŰYZy-ڤiљvPp]l>Ş5.){Ob?jgd.,煅 5'v`_׻Q)b_Eڋv7}{/Ғ?لT`oc 9U`vHN;'g\qF㰱#ߑͪ6w!YZ77 o :eÑ8F.܋SZ73 p^uiN[hC̚_Tw|QӂȊ*=1I[Y<|$+r[Swz\ bg^e_j[FyI莛V_xB}xW|9|^3xR2#N/;{fSPX} QzɶSUvK6&Fz|8\KeA4ci9p|mK^<,O|#kt?>WҍYuA~"80UYf7ko+|}(c,:t'))D$_(n۲_-I0_b ѝP؊=t?wH<[@;XmbwW!b/Q' Kq;-Xo9% T W//lRI NAUTQحľjPϊWl`eb;m<(>~ (Ni'IZ.B}+;w圹eXNg7.3kb;nZi_ĞU_׵ '58~ns+G6>k֣W<ud[=w/ jo A3Հt/S+Lv{un"lx[mf06VM! 2ᎹfJ7}x*e.W2N~[|{l~oL]L߽9p׈`Q:]wgfzŴݺ4nRwE_/bN2C}fb])PJvr{>|2'WV߬BMt/qq #}L"s=Lzse܉1.iy9GK[7p=p3yjur'y~de3C pvB}b]Er~?|-0xҪY:'e7l}Q.Wy?:`+\0$K}LYLMz#`\ܹTǕ+]p[M A+A}ϛa1;H[=qn];Fk;,*(:p#_~gd%۾L6V=rrG{ΰ"b]X|g|DrK@0u=;&]ǂz"Zާq3~)gp~ro}G we)JdBIK_ oIV6!r%M~'z}:z%{I9U|L(.ICusÿC [rM N_w;t!b7Vku3yy{Rk]zE_ uIL)S fj@׺*hϟ܆=RP|Ad'uj>278y Y92ɸ!6$Ul%cM'/,pq[;g&[~TC'+#yW%o;x q,=9qĩW᜞Th^M+~Y !h ?uGuA=LCc5)Fzy/_KEJ`rM'{rV|: csJjv to˝cqơpVC]y⊫Ř~Bnx*_ŒB3[?0-y`qQ*/u0]mo|6ێMq.x/y PGp^OxC쥙nXrĎeY%ܓW1U94) jXiLG,OEDZZ9Xs5~4;{xMw8@'zq~0k1,{oQyvt`y76|nzFb'OaLF~ju7KB:sV */b?[ԸЭ!ο+pTG'r(;p[`'MiU\4n 9#yn5l\4)b/v!سq;?2p&c"Gh~]MLq[3n`l\?=*pk44T^Z (M #2 ƍ 6kbt+xz:}0$mcr=}0kvwb][nm>8sd| 9 سȀ7cg5lm3I{lIȍfeqI~waGA& G7وxi {n>Gq~*m= 9sqYUӅ̝lv%/3;TG&#p~{&ӣ؅jWp|g=>D&U=OEx:z^ ~ft)L.-v)=r[pti dbwdރJ=E?L\I>BD._gȍٍ:•/|QQ@Z6욍"b!RYxf@̓7F_჈lo r6 /jPx#5 zwՁeH؅p~> ]iѕ &vkۇ&YY0nWa2NY.ȃ+g$Α F띭ފ9ލtꮗ@_\ EF}{l*ho\45!҅s+*.|,loyTfGIoľOeɈ z$b//NӉ[P&W"?"Zd-*C [I6I Iw:O&v2Ƿ4b#%wx)%d3mJ hOwK($";fcg%0d7`(d`i1gŢ-ވݜXڋdIXd2%b'=od{qbP]-6r`ߤdb'~O"q#3 IZbbE<+f#Rh;- >+S$.I!/?b']UWK68p.7b'1QY/>L.K81$bg8pSq:N65hfaЈ];eJZK#:? !;iζ*G$eN l"N&] {|Li\ҩ{ddDb6ȇؗ,㲭N#y[/@?"'YcWd//zKis@%2B6OLi&_u$EH bhfG=pMN~ eHe]jb_1zB${'͜KD~{#]9#@8a}KʓIyI i&||Ț'vsm 6'LHb' 4BW6sڏ ^G[ x$kHE9j~$7d#ՠv+͝\E{؇yQwq$K܋OېȾX.bĠ#ޑIt(vӗl4Y^kW+s5jh#_pkez.r,e.j>^oԔxΏd#N'&kZ3{?/8M Iو/b7Xt`}܈NN5^\37I=?-v8qO<;%b'Sp7 #Lb)d7,g7ob?H>R1dh@<@ٕ;wbKpb7*\$)*}P v湧]Ƶ܈R)t(vjKp=W=/*sfV*/ 9j叜.ѕ[?'Uqch5%vg|.0=CUwCWkyaV^g2E.\ Bpt(v2^"A|-v?1G[ M ]>QL 7b'sw}<%0!$dq69/{` ɟF#;dۊ{/vӏ2[\0m aKOI()D[Tͩ?y.bO#&P}8b7sx'.;"J #F`nil'd;#~7BcWGʷmF<;Na5$wWH`5ZR',#btE=7t,n˖09HO GC"$cif6P& -Mu.Uٌ5aL~uZdHODll$~v{'y˘ibMd?TKO 0W2Rםah~.IfIMW2ndaq"/HXfLd[f]3C%H8J}حǤ.⏜' Qaba|28 BP3#L2: ;/)z|Y!نr&d䦹_~LūD5}"'s`dh944va\i\bz;\$A$=t }{|t7d ./mmyHْg I,5dcX2אT.*n}Ґ0ORY)g'4`%Bi\g1蘐.xqgz |^dqҮzM"jPYnN`hI i>l"!=t~=Rb@;p I+钍/qq2N#5]!c+v;iY"Lj-l!b9o0sK8vNe]\2V,i ÂQdoF!ْ6:Ŋ8)*Ll,w⏭ҒЫrį7K 0Ɋ8F_"^r0."yH$Dg" t"%z' <휵sDOG$y4e.DËWs)gjُ[w$eF7`W:L!FUfzVG %fɷ 3*6W&vԺN9Ho_&ëStNYր.ux-3_G-&Ь[re"Ɠ%4 mUcf^w"_fopmHB,sSݩf8y* 'Cko&W9-1{Tϋ.9HrxHSFE{ ,#bs c^$^yƤ3E&Rǭ0"ۙf v]#֞EY?Tеy!M6IHY*~i`m8Npb3iKDQψm#?; ѥQ 3I\/埶Oly6`H>ZeB]3#NvWa֩?La 7v,T;*gthVy'M&0cK)UҸ;:eUqˋL4eNl%ʾבMԙ>;&)d>hsU: !ڔ/؎\Vٙ:$r#A}>K 1E Ȳ/8hFɘ,q0/gc>I: <~j3"6{缦|st Aw(t|Fʼn^;//'즷 bxlWr6tQ ZuM~62 l}JorCUC OKwߠ5K>܂1JƂhoI!FfsoY:mNj窐__#rxbďfzɷ%3)Rd5γ;WcgH xq,K|g|z#]wUߕ) gb9E]qky12>D18Ne􅳑;LZ8NSZYO.c/AxgPP268{{2GZH~:{[.?y(?˪q7M>ӢC?nwfxxڃVP2 @N_w$خCKew;u;B95[M_y FC^w&x f ~춎mrVZ,/lqo=vKLJ_h܉]w}lo(`wuvݭ7A v`X$؁7!%.ر >iX=tcb6- @(ԷWu: ]TRV F{˫b)!j5_8v%"8|:އ9$r~|#_*%!rvƽ6O*Loz1p厃Wz. @6 7[WPw/pljV} [Zh/w/Mf#¨ꓐǸm^UB-55q=+ԪMox&کa)ҹo͏v$2og/#t jH, k3/V"`E{N-!^)ݞñ?zIgͰtP迮q#\\BN~"hzͮ@ӧbw|<~O >gt㩔ȮbPk*&іՎXc0ƿ}T`;M)^p;BSTSqRbT^O'ކ~ȱ> {{OEw; \ .vhm1?/(ߵ=IX2~ڴ{=5zi?\bGK<,bw|!WGgh)d%vcish)MJݗLsX쎛]m>YzPI4Og;;Mղ}aø;m']Y컍GtJ' CITmZ/8nvW8W`=c'sJ' 6}5ot#v?2-W,v: /ĞOyaV{<3#iObB@8m!u;.-'w{iq &yI5,慊KiچR 6duY0&ݕ_V݉}:BؒKs=em7#=1Y1]+>=@Mq%Sa2܉sŎK[]CNYIzyAo6zndk\O:oJ7ߡmȋ&>7du3s.Ǚ?E|?j1&/ @Ήs1{w;&Ք?[)%!ņ%FoM\x~F1$,UtjHOi%…~I.b>Ot@\iFÌ"g^oTqAXr$oEVsx-21g*Y ĊsT_ȧto8)}q_Ecoq>G"gvw N^mWyQ|OgG\6q+M5F.yB BJ/(QK%~".}![{6i}-$Խl8B*/4CxР,;s1uYyr~@Q&KDE56naWiw=yB MzQ9]L~ɀ:-%%|L ږbH nbӫtO&W엛SJ݈y gɟ.;KMMuJue\>vw@mq#sq:Ysb ٓWEFOOI7g?(>) &sf5݄ic ϩ8EW>}ίɑ,:W';gv%dro^ K(8z>?@G! _N 4w} _hM酒8  M9# ^5|З, b_dҟ?yt)2R0C8!{u>} ʧє$%#1Z=x+x2ZA _!~T3X`h93;\xԫth~%g6qyQXXd4moDpv'VZqkQuɔFO2)kqfԜx-d0n?U@﷫a6-NGYsV4s2#*򟍷%x@¹(7$B?7͞Il1Y{Z"*,n! &l^.p| b$F -2 ؝2 _e>:M;3HX{Nbcn.<_l ΁ױM$z`ǪDoeKz\ddVuֈ<<- FJ4; ^)$ >ެ~"]yirggvД19EN:Qޓ潪wt32\ lכў&:).07'y$K![?ޅd\M x'HjdlQNxO0b7f%%3y-!]d_eUDvT\6CB\BIвoxM~oܓy^c5nڗ $7s,k2+c2#\$r`$sNoIn 7bAˢIWOÙ_>&~\W5;i6rCx־ҡ7~p[\HK3ZpIH/w%> :})Y 'OHΛ$א\7l!w %cx227fcD[i`OWhmEማZO>k@&_,|<}թ|+B'x{-ԅb?$;x[w,8!_a-;';,=${Z=NejfKfpҨ|/M+ֵNOKau}lHYp177ФM7N{H 59{/ -`shx7AXK֟c?rg5T dd^\dZ;h_ }^(W|%&3VJ6\ٕpg~q2>[$xRf^wӍx;9pJU.v!o4o]+ɊJ܋ Z5C- d潿ZȖag#f1%a hە_sj["Ğ(qd#nNgw>(`ɐ|Fi5|wIiDdJlq P0VoHZAWgwhT,Q,~ѕ^.Ǟ|ydf^pwb7ŧ6vq# q6[%'̋5\%=fv_xYQ7;/.+go37.V,vK ߖR$#2+|vsW>p9fW0ZTt#/m4\R(=ߠ s> i9Ra~k9 wpH5ulN2bu'݀?+=9#^cb .b%?P6C+x9}d{MX*3f&khz$Ϩ( {:yX{/G'.ג>ŸU6b7cUզ{922ean>-)B D\KսԺF=U{?HGhgY!o}S-s-N-nAdƗV#; 93IJgIu n kWXzoeY]tYƮdB~qM`,i%v2kM zs8qK#!w=[d k#pz#/VzG@R-2oڲ >? *4p' 8Sz80`_BOIi!g 뀔b d4B$l92j;-[( BbQs;IzR%Q/bd8c{Kt_2|D|j]kgmIDd?0D1Sj4-!t~| c["W̹MH,&/W͕}+~hܘ-N麗m`E?o;{x3@Į'+kKj]n w>j[G:#gqxNki~v]RKN%0rBǢ1SjٕI-ĞGu\6lY("ynV2$I6a 3R˩eS]/Vq+vLP)֜绂b'gÿgfHnm 2b_ X_"ro#z< MN+BaQ2δVV[ $OHt.#|tUةV^V݋b_´JK|:ؗvMB#vsPz4_ wTX=U@.v+ĞM‘Q~z}-l%b7ĀFE5مwxwMdnb__S܋SekXu6YhVaSn9Ou5 壶ōTa Q2sZe~4SVqݷ/r2%٩}[OY20;'Cz[I~BBrë$G'hcͤ'TH}CJ%kWu_*%pG|<ϛ^fNxKz#$Nu{|OݎStxysMRs93x~&i3L9a0f#;:_h;…6^(~h<ؖP=|˜P|]FB$,{60K٣Uob#Z4Yͷ禝rb㯟YQ9ՓJ[׬-'o+v}iHyDطSޑ 4!=E$jGcט)TUBK>/q.f?ozhg+ x##hf^i|NzS쎟d9JGɯkJ% n]')Ws~cUCIe;YEk;vBļ(n~܃kTV1JY&#}OwVk.;2G~rl&YObw8~mėh͙bwNU%-9܉ ]:])0{6'IwN8w7sGI7V~3@\# ?{uʃek5I3-4 @Lo9oTH) X`XQ?WmuJrӌ|ۏ+Jq• +u~> mk*ɢ9ͺC\~#lqFc6o ,ɽ[ds01U4*u oj9-WS@~K8PMs}k]vѝC1c3@8kޚ"3bݶz Z>(%\} D/|{!yV~949-u[~Cx?{UC;V卯0/l(­նUw1%XfR4`9C,״Gգ-kg^H#2{P3u)c CrZi)(O0*Z ܢ5%G9T;JwU*Koϩp+ T ptB,ac[P(Q;/"Q4_bwgky3^f@d*O)P$ tl/"OlԺF !*m@9yIMW(}n@k}ymֺFΙk} /ή]4~#7`xjiV?zZ ;B+lyfMhPhطNW@%^.J*k_͝=RQ(v:*- ?U5r PK@`ZG(evef<>ֺF\1T`.BQ{vB7#,m3ΖGZM/δƪY,rbz"ss/[=>GV*yjTίn5 CUeߪ7Ǔu[!z8tJ9KV7O%qڝ6V#]Tk[BO~}YhP%vU [JYjc=@K2! `ؗf#Sh$rO04|JP-؂j;suyt]/0D"!ԄGZ JPAy7YG(n+Wj[kӿL=gk@б%ʨZ ~L#z]V,iҗUO4^䗩5Z ' w+;d*m2a2֨ @Shzre*9O:VR딉g$jU|ZXAI€Dβ>@yzTHQպ Rm*N_u϶^@AYlO*}bM/¾t;BŏߨT0x[wߖ@K]oj6+yjA5d1w| +*@Pw*OžT:鹣@ ZZ`A v l%W2j!D0wa!%hB(/T RhU_5y bԜuE1ߊ8g@@nZDM\P*@ؓ]`j,f36-D yzg8i\#ӊl5 RD3m&m?CO_do2B([#3.Dž\?O!E%ӏ[G[msBiW*jX`o̪Zf4B@(wM>~Nufs" ->{;'jsp!kr_e0|m#T;Pc r;s7nC*o!զg/7i>S!y4+zӕm4!TMj+psP /ͬ%q|VcsVˆW]kU[8@9~uA ?cU7PvUrm}aʞd p͒Vf H)xw/r}8kvԅJߠڨ+ܸ1rVJRU[4`Mq7/x]E3J31 ^>O*uZ[4F<¦g1H-* bNk)FB)fӞ֒Ji#3UXm¯ lDR'9mQ ļ鲌ܸ"Lm 2L$VaMw$樶H `D6. ]XE"5g:a4:vUmc@0HI"vqWABi@D WwxgWm@OBoҧ4È w& =>G& HBe6 ~mܩG2T$ ^n羗!,Rm@'b6@qBJ/1s-Zn?Ԙ{U$Hr=N՘s_`n<@Sk{˷/s֍8@\%O*s2{mް_JңM3{>Zϭ"<3B C U~~%-) mT#h<}EPP;:I1<|lC+_B*4V=7 \pO9s[)лTFMՆl\+Z'6`73^^Rm=ŚߵQOZѪn'[evc)6=~:˜fQ2o6<@ŦVc_C&"ҕ\Ȥ!6.Y}u)h+@H,Foj.@shx[급`Ncc}jRx"` =w"c˾Ui}LD%@豧(jM5@5ɟ/}S7iCِ'=B8զl?ѼK |\+MU $Xr+/6?STU[$Si{E.PZJmWmc@Phdc){;"& rl TBAD팩M]s a *Frh-7;`'&BO)N@X=1զZq@psBc(Ն#7f3YVK M[JLTmV@P.q.yocvs%s۪6* Xi5߇VBιU[ľ!^Wl4W oR/Wj7Ur9f!:71e&3I-RnO@j[:Y{|`ⳛdՖ?/'O>zz zF&ڎ@=GX5ı bGڈ!K1[F|^v%VmC@PΘ7|WTFQ\tgW5a[rC'-T+!& xTETj<~q#%߁VՖ%K>~]3 .rbST 8[֘Oo`J'(.jФϜeݡg-I!?P <Ď]z!T{pÙr;J`̏u}uT_{pÇ-JtoX3Ά0ۨݪqJ}'41 W^9J}T^>BAj3K6 ( kVG빼 =.J=20 OasT$¾sE$rT[\`m"ė~M[?嬯[8Z(jUAL>'ELf@xIlzjsšB#Ti>B'fT]?p6~/`/#OjKŸ!}bG&J]Hf0I Aih1xJA{٬s+rN@YH MI2خUU[9ľÆ<bGRѻt9(ak첳\iеTz 4[7ʌPlAV݃\=q[y=qWjH}6Q}$U.:1 ^)?Q,hHj嬲b"/fR}Ӂ%o:cg}˪o9X"۞L]?ЈE"oF(e;ZL_W}H'NuI= LN+ҫbTj<҅UPK #UTgu1^D m,+AAXA`Yh3Nάo08)kG07?MS}fGA'7ĩPz&k+y rE%h;FZ BSTW)?pscjF\JnW}[@=G9-eMS+~zW ׬nle6W.TTA%fl7Xz mM;JlKP}?SX=B+L *3c~Ѫ3C'1߬vRߨ;W/l\ BS\cU/QahG䘋sQ}gTS玴Ug շlts#v]H x<oaK -]UposܰBe?8 JjuӜj _*:E]iGj{,j-b0G4Wr;灓FZN 9qNU} U)' aêBo.[l@|MZn2]ӻ}C'ϖW}6SeBP ˣQ,USuXV Ff(ߡTW>mE\yN']8v]UW=Ld0VZkBkֻ|Bu|$R⼄Q. T:g.깵[>o%|J5tJc1b37V]qlt[#"!EQ+~7#9wvBKT6$c1MOcm,BnE= 9"ٕ^ x IŽ_s+Mv﹒5W3װmyh>dUW2 r컣!ĴԌU1 ͷH23I3dV]4~D*^Q]L4)dpuЈ8.:UT[e!J^j hʹb}gNQ~7VqBȺ3B1\1Vy#jЫTV}u I뙜v.hŹuAͷ\R]NNM=wbU'//2۫jAn6 wUC."`ϻTzc:Oa b\i z`EME%iO)M2Xu%@hPe+Mz(`rbWrK*P.>۫_X]J4W]:TU;忴wkB⒏n6؞ (?WZnU-@'sZ99>ͪj>xN!{ )3_̡v* n@$ZIFX/*^-{s,{mTW(g{ܜnvGMʟs%?R]aw\XC!n:*!D/Quu@Sb:/$-;%m>T-}> #!Z+j )6jFؓ |Ug-NQɼk IksG5I[Xq>U 7KˍzfG;<5w_pD.:Fvjdv컨 jkŠzn'#7U6*M E‹Of3cmqZ_Tuԙ\ܬN Skfy8ulf_T y,b:%%`ѫc ԩSQ42nfC ;.m4~de0܊&|lg^]`9.M󚅦yle0mވM4w3 3k2&kk<5q~f5f0܁(..{؇7XcT`TJ ,@**"6{XL 4>*XogZK`J "n2R86xi/6a"58r4Uhw} x%Y_(^9wжo˝EvV-T@˯f_sQBxZTξL~a[5.`OjuyIJ8-E}̾ VkFnBO1$aM%qi;?/=a,?Q *=|M_ f_{Hj%RxC%huo-73x. w .>}70MQD5"60[ #̾ ! $/of6/QwiK rR6725Dc`0\LUjq%q 5k_$f`0\au 79:`.>[k=wp!⾟X0Lr&r=fgM`t'Qz3ɟ; ̾# k_4<5`]xנ& ϥ;+ .Q3jZkZWn̜fUżf+7^ija0K?BhWpQ:_C;9 ).눥1s?.4E[00NgUș^"-'ifb0DolRefٷp i1N\Ɠn5yq^y,;4TyizQ:Qr[NvNkVɔ~.;}}9 OҦ;}`٪.ϏK|dƸٷ8=9hWB˚DWī3_cɷ0%/Zx_uE̾e FLR۳O>113MI*CtAlx{|20_Z'kvHk5V2)Rzl7c7H/Bghó̾ CޣJPH Cv7p@TQ%/Fţ ڈ7 ;*Hx6pZfTCzm20xe5aDВ^dC~޹&fYC"M]6A**Ce% --su`woӶSu̾ BnUrln4>zjS+W$t`mZ_nX,ȵ7 E ˍ+Y[va%. Ewb{ ."R33ߵ7o{BN_4>@plp6ը _53wBOY ^ϮrnEe0U#ƕr4\ֺܵمU@3N,m+ uY]>ރ!tMcKAҪ:ϛ]B^tٺS3UMdY h˳.# 3s 5CW=TPK oNf8`ޕ5C.( ϧ?UE7Kr[iG]RNjz:bk>[dgM1h|vbe +ӌY@z?QdP5\݆5(6%dvax,eUn`qf\A4C%x`d*1܃xg30<5%FeF zņၔyjB fSX']re;U63I"h˅fUzC&)-xJnUo-yZ٥Iz.>[-s ,Œ4Swf`٢.;OJdg=nɝvն3ivbx C,*tb-7zexD *Anܢf#'QS}}˰_4@41ܟ.WF&xܷ9oaf%S)ŕmxm.L fĽp7~f{?]nTaPȨ ޢcngvb-頋~_&VxڶhMe.S 7e5UPj5\=Y˯6LcovcKNBA$O~c5.} czjBc>_.~ c)0_M[N21p~WDBq'.qLŏa,%7s\T*s !^{x٥a0=hD6 2 &.WkM0\%a B{{zf>d|cK™$Yښ<)0? -4^lhvck1I< ;T yz BL)v 38^qvfB131nrۙg42 Ea?lor0Ɨ7Ll=S#fD9a&ɍop]oivQd6D 0K#uX}TBF`[Ir;h7ۘ]".Ѽf4<5L2\C>" s0=F]* Mu| ~(ax%UB5R^RMe+yj-,lgȋ*>&L;+mq!`dv6\Ö ~ rS ee. n\JDZn​D ݈c X'MkZSKíD2p^>/w@oXHXlibj +;<} ݫ:daW-&{ӏI {-%.A/X0D1ܛ.LK};c fVar:+g`ό2%apX^ ,etedX~urr ;?NWƎ̳3n磪˔kMVDFv }Od(pwGFsD;9/d ;S@r]7\2[ Xvjn[(H) K2(vȰ b'I` q>sܙʅq2d#D)Ğ/v4FޜH3h4|1&vgQ PDNX࣒z5(؝AFXOTiu?# 1 2*M(?4HT|MZfJ5EJRb3Ğ&2*v JabqffFkRb7qeȾæn*(/7hҿvL9`vms>15?^9.5>z~&NÄ1n| GDόعkocik@3K4 8Q3`rٖ(5Gf~!jW3vE\azs8<C}mدt!UU|Ns~G"W5nЌևBWZ;ϙ">h$'j92EG]\n"ž[^P(=ϫC5~wyYq1sؗMc蒂ح!'UlEC"R]E }_~4iVȜ hKcw~nő6xbU&|3:zG>[vv\|{h>u @~fl셦9'qw&(tFI<';A6)k uQXٿkM#/ `9%q9cl\mPf~Vc=]HO~s8{x}|wn&}0dƊ$=P(|y${=&/(|IAIXG o`YW짃ꋷ6y6_{<W=Ot4J=APoWUp>[QrK/ kU\",8RE=pmZх`O[z.X0e@%>dծk_qjEZc:OȠiUޜDS=-%IJujJ2֛lv2|*$S+g]N5j'GoU?R  ?#zwWk_K~lTE uՊZp) !ۈ}d,J:C] rwCD0!TFtaFnX~~lq+_0ZWh7ٱ< pW")b!f;{OPS X~dy7Ļ e|hW+@).F!kЏwH8|,I.I'71NIwC!2Hk^Yad8ԥ߱Y{3$(mZpg!o&șMVo xwG%E[SӖWM:?F6\97<F| bG!6ŋdz1 u2gMS~*/.˞}kesltV.Xa=9i%;G3]&ӹK}Ll5[YPHϮ]p6^:H[|j_l>:@ ';MȀ VӔ{pex uo''n:#k?Rf 8ow gsan~'_x`H$OMb{%ᵄ\2&30;iӯ}V2Νru3F3_2h1[lYx% )6(`5NMFėsE=a0\H >l^FD]A5-0 SX\^a$O顉u&boaZ|vX\3aFo}e0츉K]fk[7a1vgZkT1#u^i8X isUC/~0C'(adRxjSO0n8o+O}FO6[,N VnBG~\=W#3#ʒ™_8&lx4'2 N:ܦt$.K܏bUr{t]t H/< 8Ny{##ǁľqדs.z ŧ-Y",%@[Ϣp a5jѐ:夜Ccr>]%Ha:;yjc=ɢTXǻD&>쪎̉pkɜN~ BsF%yrpʥG5jpY'=SټxbgSթGk]m, )u?ŞV,y4q0U9`OZ]NyLuĪvKK^nbv<8>Av3ٺjeUno\x~;5¼m W.fo#LYuLصJ5bĞmw,xjaS{C".]<.zK?9gH?OV~FJ*܃?=>GRHBɎ9${%ɦoUtk-%IWU}G6RO'O1l\Ϡ'OԎn.|`>~fEKk]9¯MS04tZcz< _tO(KIs@q%Zʢj?@ʱ8(IMB4T;f]{L%Rߕ .6"Q<{^HS,{ƋI&\g]Zil vb&\OSܱ/dbF3V;nzPDzfi3:*ǒ,H^<  x+%j7}>Kt=|?uNwH @_CV56їi4R E9ߓsHx=ya%S~ytbM-(]Y|K],=p;&_5Ac$ra*$Ub_Gu]H_xu*nbľ|TM}w,]!?ImZG/%~;A_싈TPK,{?>M L8{kٔ jhp@Yj(v7[~e_XLGP%9_{IP{W]E)}0PJp ߅4B6F?>Dm_l}ͷ*=A_]`\C4{9~t>q:BІd WUITca0|x~rz8?6gJC1*);(`'z q Ћر~S&BW?(z arr(vlۢTc@_XoQ9zD@.ݾe;pGR{ҟHc|J3SǓ4Rt zWsޤs5G_ߦ1GcBou bǩiIX&.ר :AVϫ,+([p B:9+v|IPH [K#8A"qSDbRjwDJQM6jб؏J)+yePPN5.͏ߵѠGOBPGChwi;_QK8ǡؿu=OBR`I/nE&ݚAs /!6Jg}L%Vy  @;M[(sBzL$*7~Iw9JH,@!Wa)Њ{ߕv9C2U˝A/-C\Jof)}N+FMyy;@MsjWVj~/X-/ (H} 5q"?'j%ᅡ.)}4'OTZj-gOZ+{*\^Ù&恜4$ Qz٤K|Ydb? mE8~v9rXG2|FGaBTGa%_>n Nu7leqқEyr (ЙW5ڴMq پjyRn  ycf>/:[9 |7~E([cvDUH5 OHi \mp(DnaʱT>Ut ֮6Qt i"-FFB zMYm^x\m[$KGQH5E_@@^.=w'aZkl_HXK] NZo][AAH=ߞ[[H} do4V}d)9z@&z/C9:]PYWmD/p\v@t_i J75?`r˛^~US>dϵY#P%nw+~E:$6=HFtԻc5=y ;Dޅ~z$lz3$P[8ek1B_!/Nۻڿnn( 'm<gohÿv޷㨮  ئoZw^{I߲PCD_vpضhvH'| 5n_V W_= ?D뼛]4YV_ ^[Dv7pw=Em-;S` Y:@A ^zzjL =;s4Ywe7/d1Xd8}@\j `& 0[{&A<YIR< ](@,uz~{x+ D^J{MqwZSDJ^ > tmO/\}:oן|0KVe06dIdvlP` ͎g2[.bW&F_`x/mٲt te,h2MgiVuU u=TtY 56/-.ojFn2[Ng61?Nʹ3 Yp ~ᤁu?*ˁgD}i;5,U&ϛ .$Z9mʪ~xÑhqJ@ UEо ?XKO-vE t=SDQϱ:n[9b BOh1F츐uHo(PP8=l;1bSe1McuS?)> N|abOƈ{ڋyUaSu S)"Li vkh;Sg$( 8;{x2xui#~^vGm~jRN?mp 4A7QFQA׸C+ǾQkG689#yFk(~qV8[dwYBcmQSŚY&P?/Xt^ 2B?eb }6t>R0|AOUWJw 'Lz[6T } P8>>44LH 'Nܡxt uCh= igRIjL/o/|8@!QM0~o*h*lɋGª?й( x.hgn c!f…ôb p5b)Კ`VU>!H+vQA`S?ųus.~/+:FǷ6~!9~%-#vE{OMMh)._'gD E~[ôI~d,ѓJ䘾5ƍ%Cɖlن0fJٖC6'! >m1h5;cODNjm&l~DyO@b2oȟ D":f[ o${oA*|O%xlM&x4.xIA)[.) Xl[qWS&#Tn- Hon?@޼-ɫlgO՜vޖG-B\H:.9k::9䘅G- r쫔AҊA?솴?B&䓲>Ob_8zO()ҧOYD=~E;yk5(}ieŲ6H^D`}ڏ,/ݯĴ^qE$s(mAk3'EwPC!f6H$'o 9Y9$ "u/Qu{eHTX۔=R׈IϐW]U<%/P+}H*sōAeoXE'?Xw( &Jۜ$żʸ4Jo(vܼ1V`giR@Jk~+I+άdbo߿#f6ӟf%sc"f /=tJ H)KNbR*S=JJ%T%vW;R^7`Q|5a_GjrN(ehjcRiu5%9ާ:i<"b޵O*xE4.EF_P,H PKHl O< ͥ*vrIw3Ú (cRFȠkgC^cjR)%'c2Y{XOmB[Ik>Cj:W;(Y|Su+'EW'_1  JM>Ǥ᧼{mO~J?$hĎޥʣ uU#IF >T9\3;TjR7KK31Br-P~r+ BZ z&(C%JWGޒ(wOl!}P =g":pP`7 ;-MBFR>OUgAZE+t7IM쵤e{O_I:X[(:Թ(t%m jjEHU3=Բa2lP0X{ޮN B No/$KRo*' rh"h- WP^C/)m/]oR5Y%,ZHrK8=/D,Z&y.\NGKu@? 544ֹR=(;6٪}C yvc=< Bc3<ುbW@l5!skkUuUy,BmG+>EpQ_t.0Zp y~.%E]'ފ:?9YM[{|wPQ*bfqX}z{a91?@Ik;fX948'w9vҐ+4 Wޠjb¨F쏟'V<&;ƌ \2;X>.S tv1[]dIo=n(Έb-qգر}]*?ᒋqgj\m"U=AV"~:m}^ٜ;-@Rɑ=;vI=4pwjn$UQT$Mp[Pu,G yJ(N+ZHA;׎Z(f8n\[eu7ŁJ!PUouϩž.4}r lT{IX;h&Wc 9?=kȆypD3D}jn37:vY I$_Q9`j݈%l_c'@X@Ǎ_tP*]_=i&;hD݊Uv*Q6HH1ܐ8r&:b5%V_K| DDL=gEAP;&GϽ]nx aXMtgt- Y j ^TTbn'Փ A $e8tͻrg輻\=E2bUYAI.WQv '@=y?G v?*J3+;}#<8?kJIAlN<1xUwh>-_PuS-5'D &Nn?Lߋi7T=o f%p<)]"0W#)'}Ii ay`/GRȽp&D'grw[,٥.ՙ,y $z؉y9ɞBDX|Tǹ'$,=ZE@|(ZU"2H:zBU΃^>R\-vIS09@,Ƌg0_I[Gw:Pem\ 7tmXz|JyH7?ѷǽ@vb :vO %P0ly^7b~RɁb5(`&vbWqRwշ+z% `w,v.2Xh`C-ȃGY<$5CC-vl`s4xaرGdmh},& .&Ǻ&ZB:N~yo&zj#5T-=pg{87N*}P)?j Ob䋠jǣ |b{mUܙ9OR;*6dOHBu;VkJZV Ew흄gA^tW0[ww$VPq Op};,'}Lϑv [ Fmm*e:W)gKỏg?wXM]jSlw=NҤAF8TLK/iVKꑧLjݭ (e}>uo&q)1+ji"Ņ7Zo*XxP#N-v.);K~y Vjk@ۼ^Ѷ @) l&M;OVM@/ôrN +E{?8 й/-ʑK:XyA헧 JjhހC{Ϛe giv3/;CNw/ul'r:ߗvD8r}u__qwbEK= s]mIqTX`?uTkɘ!qOM~w5sOWz K~UB R`QėZv?1ot__R۬#~,&G)3Z*g}+ѡN ]tї:#fquڃ+r: go8FujNv;~ק6o=c黻]~GGQw@۳qS.+۷F9lLr諴|}MQ.V}r8؈V#cJp'1Z419pjM{r#7cփfF&K\c5d:eG0XÆJ$\KCA/z&trAqYqO]vM9bAչ-;{Z(!EvCZsr-uLd{C*/MX78OGZ4HiK0ܑ!E;6#+4ȝ SsuV|$nܯg6R b. 72S=sB> #FcLj;=C=a$ŞU<&{FHxQ󍏫/ZEK1( 8{&`b3qFZr.;zB5{`bW hK}ɏ&Ğ3Hz+e|繩@JlGb>oȈe'[Ǭݸuɽ?4:7]7l-ߘU)#v~tI+2gEk-q-ߩ/nk _Mb޼%i7&G,gEPlyX &*|6> vn?sU x?*,c褽NRUR[ܻ3'a4G+r|VDSEj\jaO+r:ߧm_HSBSM|Gb"U@1'@᎓G %`i T/AIUޤziKb/[)QѕRi~ܱPԊ=K{f\RռYj=? 1&v'0 \9 \ L+\!7ۖlOɕ:gCD#{/h8Ujrsѝ/fl6,*R| g:\DN\Fir*9ND8|*Ho~#u:o"Lr%_䑖D$O&5=Me$O&|>ߌqٟ'mDD/>*@:T,2.po/ygI !yڈ B\Trt|F;v> b .^,v)IIK]ËamLrI@+{Nzs긛3G].tb=IN)IfGkR2'S?9FC٠Gr[4;l9]^#$|zDeP L *tdJϠ2siw&s@!b-R e 6209 eI&v h޹ _ՇLz4s {/un_̷([%YD߃RjJf?!Hyg>}. ;|*1lPBؤ)h=9alr)iMO.cO2uɽs$Q@5MnS MK'W*BO%tH[&v\uq1adVg9nUv(N |A$w#v>] V9Ty.[#$ͮm ӲZ,ʏM ,eeLN""kK9[洞MsU="gPVs8R=̧B|*ǩ<4fRLt/0@eVDŔ EY[rV&Bo LNbI^3/gJ3} FM4Rv 3aSΞ SKURnӹYb0I1b'RQMaDI$b|_žZ$V hǏ '4!{Ƶ`FK<QjԧsRxJnEԣ3Wܪ15h jxW!%RkpCSUBHҾOžزPCC_\&Ps~FbH3 bGw4jqLm(FE>N+zBONhl>JzNz yNBeBZ;9*vt:&v:6%O ɘXwG| i;6x08=ChJMR!/!k6]$?YHW>؇Až|tb[f&vg],ZFސj̲k3TUH6'A7:I`FR ؀>FjA2U;GZ %!b(_ Ķ?{,I.u9P&vrCrٙgHփ/":Us.svN6|Tl*zeBD٭}:%t38ueЯP^Ё.`dg/8y@UٱEކK!ՎeFQsYY\q}zЀsQBց$BP= |&*'T.@]9s"7 Pׂ"-簣@FTn >X?Tf\ZBy"GiƟSTf&#e0qsrKJ>p0(La,a@#N&SԾ-Uv H[;4 %CkEz Jϡ$SZ+b/U>Xc<e':/cщg e^MךCY[a3N9Gb OZ;r4zy|Fz1MدuE鵿Ud#?yJ|OEcǚK8m'Yo;|ޔ)/bz!@ 1^lOzK8Q;buZo@sJ!aXXVZV+i$L0oy8@TQ}C~%޳V+Nrio[I :|1>P}(faNG{:;H>䔟=Yy5<2p;7|S%pJ~8#Ayق!6}9(MXtxfrp-]eS7I `F|KuBr!IWiWN!_%;ɣyecb8p}m*w8]Z-w壜YT>jsIBDi'Eo(%޴U>q>m1 ft-ʓ9"#%~.H7e2|"g۫|bΎb"G 8>]+4ׯxޥ^Ԣ8(|i'J5V/H{OUO * unpvqc8XoMP|U1g$_gyOyE'2k]Z[#v}kQ$ݹiwfn A!#C$t}%RS%_/5צH#[!_cToOYTȚ$n9ti ҺU0%ӕb5n繄p8gF*2pˆ!OR+(QLYNN9ʶ myu^גּ<w waڣ,͈C>[qպ9gY8"@ws@M|uES{1PF _^3LO4TщÝ0N} 7c :[Z7HA5/8 Ý_Yo^`W`0BNvC& 09Cmլ)h=%ȼ3e04)h=}A 0RH b_qG6qpCoBSzS 'p(O^^-`x<ױckJtJCcnc Ϝ ox uyl+}Am, $M]=Jh$ qIz;g0aZ5 + nfp 4k_zb0h\ϒCR 70 _zCz/ȟefp Oq4_a mί,/ϙ}. ÅZ||O`zڛ9:~wς`wbZ uaD endstream endobj 8 0 obj 49742 endobj 4 0 obj <> stream x ,Uy{}ܹs4qMhиED\#[Q܈ "* \ץN:uwΩ~}$UGuW@):M01f6N*,1ߑ;XZ#")IrLO}VIAHߎџmVc\"[Tm d8UD 6+˱tbޔ|{xB<7@.NG%,A-҆Ż2I<="IrgkO ~Zc;(韭HVcH ҃$}dL$QX=y0|" y'#M4P wK, eXL[Ї,w;ҰDfU({l461e3AV`.>\riY$7waLUq\M;0=d`>cIUNRDpӷxV'T%U/%@p16Hڊ%LO&;DJNA^J8~˧%Qd" 5Nw@);x)f3.-PDŒ%l2i){^-S`6N?ra ET,Yj擆B@<\ S`6?㲾a ET,Yj'`FL)K 0j?5|jXBKZ2Rd o0w,MF?^o Cy]դI-%Ӝ! !o$u~:4VgDV>5OD$4ŠLR(D#:+ "k9~I?:;ZaGaGN*4z5@pW&,sMF$zA%VԪr\#!f: n ?-mT*LDǎ]2e%DP'4x W~\,qPGI>%C +;# 8=.89(q |ܟmkv"sӶv )dWZLSn3SNxN|D evLC'"k y4HIv"RΉDKzDLJ|fj8EbI8Z(P.2YI]F<?f6 h?`^'OJid6iHMAdO2ԪO\"c\$fD$yYIqnTP\Ptfs%?۲ȶ/e427N۪K@j,MQܽj~WOf)`HPHXՂ8= (vX<#2B&"@8F׉UM"#,qDO4F$ 8Zy ~N"8= (gM<$?}Nډ9]b_UE%4esHGSy iM@dE2QD3}2N`t.<(m]UȢ-QzRSDpmBYf54GD%`\L$,C ь37 (꤈' LD6yH,`FWU6,'5/Ld9H&W*S9x[2>,7q &os1>=+NL㴥F>=yd"A2RI˜]`szFO`i'cvRD6O J8mQfiX()t1DDV )6 {l%#$ h9qi'P (6p}ܬLD<9EeR`沓L#fp Iq*L@6PɈIZN\ dNik3Hu2ixLYvRiLyc,O2.^0# 9dNJzP.VuΞtix(쌌 48w#ZҰL@#`6/q4;B6l\`P( eq116q~& M>f'*FteIC9c"邘MGjN$ʩH@JIWi޳ܥa,.8F*-lcvbDNY4o >&ϕl."z"vlVNERDH:q1^(E.0S s4fcvzđ,i0>~c6 H!S(,#,iɋ#;fqBd\n!HJf'_qd,Krv|X1>D[i&M'xҹf.!3IĀ럒ԙxF0SaD1X|i!`69&\*+f/ۉUZZ"gnP믓ix U >}>'<u2ix4љ/TjW8bj:JdPmd5s" 9 w[O>b1>D' C.W5Q%aw1^؜H,Q^KӬDM2%s/f>s҆-lwaa8j9G XfkC.W5 />,JlJ-TY[H:\eӶ\GrRO mͶXh?D%`CPF:aY(,P1@T&5lΖYhH@jvEmf44OD<P~V b:NQ$z 6P*bJ2.V>i4 {~>/،y" IΑ]UCyC)،"IPR+fxHOvه9]|F\Iѥr6H ~4՞?/UL`fYUU1i(IeY*\')؜.q\Q2:fN?/,ӰZp"69؏$:GyUb6?v@Wj1(68S<: P $8BE ~4& kA)}hFV>Ex&6y$|VblJfAj}bt̓5Gm`fQ"a" H~b9%J@G}A& X9;bQ #>}&asbOߜ-PgYD]?BQ&%5{:Uw e|ɪ 'WD'yǒMPpf'M@dh#M d)RR5 x:(Azp媺 n0|HW~Nq^i N> ~7dG4\,RӁD&e6/n \i ė:Pq L()2LJdv>iK4!O8|]Dtz t5YL`3;6]m~f$2)NVy&ZO\ǷD*aNl,ozh4$v"ez2$D'am@uI:O׋|'8t. @mB?P䃤m @>MDAy,;.ADպٍAb >B3P 8t&t .Lk!}f+gH~5eωV?)97o9DPҪ'X <tAai dNmb d=Aς1}c63fYm)5aRNgV!7+Yd+U 0=WO iYr3px XPQKvLe\.٘Ԯn)Afv=+lYr6E ^PGN8t߲l: :A||~'~W:CrY7#Qࢠ|x~c7srY7#]"2+;Ը#˒I%+{;Ƞ%˒I1Nk)_!2hFu^`S$|uQ҄*ʊuN:8B=t>Ϛ iap]*;-Z0` phfQ-CS?bRC;0\yH3+NZA5Ge twT]#N2.=s> AvH?]L%_0U3ey8udMB%>= T| Y:ċ%J,P*FL^6[dH:A͆PD$#R+0Z}JCahF|9:ao%Y\!D"@VpZl8BL2eCsmN7NghˉǞn9#(r6Hx,iDzh'-KI>2d e(s-39Wtwm0ȂMDLs6}4dl(5[4,HȖa CxdPFIc1(9e6C!fbh"OJ$DAsPD<u>@PH (dJe,-sNze؜":iXۼA3H5Iu2 2zrE!dPIO]hj JG4s7^DXxC!$:&d "" B9].bs~2,Av\ 'Qh9/KqdG<%ـRkqph6h`CLrm `ۂEsxtcܥ$[Nu1p_,w` -GKO-QqNg'@_+fgķO2J&Q@!Q,O NL8[?$+ /#%`A#&dcl0BM.fmSgvY%gsf`R"S8dcH2brEfy#d:(IW0Z'(}X9T$lBRGE&I9eC/R+`k&&d N3_pAJ?bJ^,RE`D&iOfb2H 3sǕ,P'UI\7˱Wr\;w+<xN*6r%ʿZ9 O:.|7M9#5鿦Mjr;SG?Q]] hЇfNye{ !jJYrGb]Ndu~rpr!1CS/~]ꫯVsAD.xk缻Ass%\R)H?n޼Y2z#-yeUNٳgsDĊgYR~+D5KgQ)Ev?^)(KVڽ{<AD~ _('?O"֚wWk]5ޫrC==mX1<˛5\8~ܿ|k_;ty[ޢ_ZZdD@TU}T~+;u]8~֜|{'xbҥ S$Qʹ<?"b~s\ya􃈵~*J|.QRwi)n7pCﱏ}l~g~-!?"֚~p͚5wuW޸ڒ-e|VY#龺`?Qz "VO9r 7(D5-R4nJe@0Z/^_{y܋CSbl?x'woQq bW^yeƸ;W\iP]Td vٲev[%3; b?OoYq bm_*}7==mV.[fժUwqG%Ա3o 9i0<Ƶ^8~|7{pD2[aڵof޴_8CSKzڢvk_T}̖  "+^S.Qw{-i D3: ""bϞ;1" """b)o`{fcokA5:emfmC? BmblB? HmblB3On|GDDD@ """fK@y95 """bԯpD&A?SADDD̜" p?DDD̚ 2XQ!X1t$X1t'v #"""VS OJ DDD̜E\O1sW8u@ޠDDD)R """fNf """fMچ~@n|GDDDY|GDDD[|GDDD[ [+)j'gcx"""fN"Gb'􃈈9+Ѻ o"""b)o~3Hy3O~mC?Fg #"""VԬmD#"""V-] #"""V-]h-oHADDlR1ڸ#V4xh[lxO#ڋSFDD̐+#Ђohi㛵Z?ŷNipR֭d_""fHoe@SV;,J\/[.?'x#_ytPlё+#Ђo(X:Oj=vmKCTѝ$|3vXm ֛ >2cg,r*&|B?XnAa L׃GdKM -""S`m&ƪiQ]zD8xð7]9WtI=:UDz;=?xTfgV;&N;VסԆ϶lӵ8VsOlѩ 2M*A-6j5omwOat#[7Oz4j'Bچ~@>ể:UIJ %>vp '#oy x^kF/+:KmzukN <"꺅~@>eUNDضA+SQ08 %R}[tmmw>Gof(v?pz6|w0 1Ɩ.mC{o¨)!^ttcd~)sWOa\:t6/:5_ux`ߺ.'hzס ?d}rX (2DqLm]8qHQ ‘W$Y^\:7-mKt]yyy70#Q[o' #{Y`nZ증ӻ9xh@ivl:k.zwoO nI47߃H'Ngc' #WէY3;"K2LU?zn-?g_.5˴O4a~NTƜa}t侫oZWAuRKJcCgN()u-8K}w̻PG{{5٬Kw _a\)o@s ;G_RKqnߏ*HQw` e9Vwv}o\/Q+'2ާ'~O7!~&NhHy33|Gwn;A[źmN>ҲFw9X*?8r_|y6;- K~mSP[ѩ퓍:5sNY= zl?V~p#-+'atY ;'Dݟ@{CG%,גּs2e=^exqT:9컋ų2q'Km][26yza%h#W~P]M.4&od_(mZP7G%[cGzwS#7^{My/s]:b2EqLm]Ͳy>tՐȈAeK𤼨_m@n7H^jլmEٛ|o;n@4yaQo$[oT) sG5N/>DD ޤ?8#u4DmZ:ۙ /CWĿ(ԮǪQlkۂ:2/kY@ST;,\pTglQj.nM6RԻx%rÓ'kop5u|;eᗵۧL3ءkSQCD][qz?DUƜBa}[F zYQ"\no'֙zW?\WJ>oQKy]x旴V߾m6;1>uOSPz< "7aя]uc[V}sW{6=Zw}7\:XXǘ_"~hjh/Eb37u(◚;{꘺js(5Hy33|G?<7-#Ky=[D>g?s,mS,zYOm7Mվ]uٵ_y7^6.?OJW;5~mSP[я;ֺ]=p%5h~~0jtVIh]/k~lߜ.|׾;+5.U.| ?.2("լmʈMHm9r7ԹcTkrs-VDnTac]'_4 {/oXK1\+NeDG9$~&eu˜?=?@ 77@kΕSt[?8 Ƣ~pq,_w,:xa䕪Q./\upC?#Е@~*covǖ}B#UX~E?d,n斟 &ֱֲQ/-&#갳,8и;co4*rlM y[o+ O'3Zlz=>rn^eцa[8b7|'&f׌\rج8}I싘W}K9fNR>zv_Yߴc14'~9U稾۲*v!bKk 2i ʬ9AO/#u\}C?.thLv{5aǔŏF7Cvrߺ[ .,2;P)#Z7"} b*`wl磵;d~a0yUHOoi];^ߧZjWxyej>J5`\[ )rLm.5i^ni]ª3^aqLg},h>?g?K>?ؿ??1?[bVoT/ԽU9l?.49La cK2 1Svexh=v4c+un9 uzc:?=jlU֩ )291{="* ]JŢ8&P#x1yŷ|X'TO߮*>usboCu ļL7sj1: (&"\wnMW<谚A͇Md?XnȰO9{7MvTE%CD>kS@ST;,m^Uך\x̯?j\v֏13AI,NksX˜rm>M 4~"֠h7- c@3Q "{ԢD+5߭3L`Nsoψ=1qURsq1WO.Mʡwt~"֠" hn} /GZ+rj^2+5]ޭVg~0u\W t1%]*ܘ}eV9piLD4PGՎ cX{njf|g>PG΅`=vEt)"L;VlP]\4b,|Uu#M~@n|ǰ:#Nex7–>a\x4_]wT͊.׺*y"߫.2Y MѺ  cX+ŖKޯC7~Uq.wd"0үwrxEOz~XvQ?BTPfqX9~%||/mލ@7i(q?=݋u?#ZVL1muUAh̭A}_w s(cD5tz(rOm骡ҷ̦+ 7_eޠLp{]OҺyΖyopq }t^vPx;_j\2EqLm`!#a;(nsV "3]侎y]uz\V.}0i Έy[oT/ c\Ao<6wRcmvh]`]v)uc昷A0y~86Y~s$ST9xY,9KÂogDKԽ~L3kq[yK UBblV_ Gnsj1%j~S7Oj=vpEm>lGSswsusmOYqroL7^Ѽ> #X47>D)X_$Sl|NͲau_h?n`살{埌3#I3f*s;"^?h ֚" hn}L{ƛh='b0zc[VZs/η;mHݺV't q=/Pf^D$70E1Gײ| }^"GD5k2u@-|Ǯù"\}M^~p-?:h6rMkg&FǦŪ k U{" [I)rLmS"F^1JM/E<<-k5_e?n6%ǫjϧqEgXPf55tX Ɩ.Ge@ c\z84_1b֕U_0c~p?m;zxGWٛ#_!<_>z U{~+?rVe֜|am ?T 1}L;4V#;;*~WQ3"Zީkgϋ7w|3u]7^n1o.V[;/b(IfNS>͡\W)gfJz ~0yEs#ռɖOvCAV~cu dҺ^}V;jY,9eLÂo67\uXWcߝa6]MWͽ KޯuR 7 b4ը.3G++#n̡eJDTƜ2a}LFY}OOPWڶ+~pѺvQ7 Ak0XՍ њsb9L:7a1F^la\xӻ~oXV##&E8/8ԬcVS+* )QG47>_ co9T~WpкDXl(=?w\uF_Rw'W g1hCD㚂'b-(R E un?u }:?C+SV}N- o9&F}g2~A,zwM\E fmSFnEoNW)>a/yw?ִ({epW-N ?P*ßŵm9j5!ҬMcB)u˜?L?@ c:~haHQ8^'r}X`o~Ub]aỺw{]u >~pp/WcGd~y:XRe>_#Ě5taz(rOmSe_!-ѬRDȯNztݭk^s=/~lT&ݏo6NBD` ?T*1}L}babA;Fuyת٭[_ߌtoϓU.:+6^kZP'ɢctڹ?K>2 )f|41ُG%c~0rF58kZwZݑuꞱu ,8}{cW?o^_&+҈r%BĊ>%3vXmz2?|m4 Tu\놧U=nGc|{mkPR༸exojs#)Q~#Z79LÂof-߂b=<ܙԼu]C -+ԕ sw?zRy$ ZS 3)wf|Ћ$gl~0r#QfpNkOܴFx&K?m>O EAE0or]dԶ MڂS>斮qF<9G^.Ɩ ϶[/S"Bf(wyiA ݲ>|~p{߲`Nx/=W"d_m^w2bY۔j>߅o7ȢtϼlZx K{ίn*Kj5_+C/MמkGu2/Oco~b$si]n0,s/qؖ oگrtS{W޷_("" """b)o~3Hy3_fmC? Bmn%X1t$X1te """fKoe@9}K9~3~#Z7 ADDD̜" """b)o~3Hy3_fmC? Bmn%X1t$X1te """fKoe@9}K9~3~#Z7 ADDD̜" """b)o~3Hy3_SS{Ś୦+?v*%skG~0t . ""b(.2ΞskGA?hn?v """M~?ADDDL_􃈈6@?i~:eDDDREDDDuEXbڵ6mX` ?F|̣N_~W_}p rßzHzysK3F}l| ""bl"EUW]% ǘ}}s """\j_ڵ먣o1U>}fi_8 .8s/qz>O; //+?u]w7zwqǝwyww}wyz@DD|H?sCفpQcof4pWĹw@DDQ]h211qtM_O~/䒋.?s:N;O'?y '|}`п-Ugmzhc "3tetZmm#+?7 RlPj,vM;|Gk1$|3xvXmSG|cѰSwU'587jϴ" "gco cj]}vumŁnPYDĠW8u@ޘSU;,s65$DyJ?~~*R|T5a:t?yφC- ڸxEiV 3)qmo\Sj..|g+D{Y}V_<170=1}L+?oqPgnhxh# Z_ cXw =x Hz| H?9%?@ c@'5M[>}!OB?H?6KL=} +&QUjYY߶;msCRk|gI磛h# Z2O^1} b Z`{PuFw|/F}c`uE}b٪=jyKH?H?6$3÷1}M3XV||Gnʰl[n^l#:;Mڱ1j- h~#Z79 O'587Q׶ଢ଼Sȷ` ={zνV~FAT 3ޜ5fp7ƭ?vغ Gw t hHyfm96n;.Cn w hHy3Og3ɚ3>dk]gi-omj* h~mS&h{Ȕ SC?ψ'6@?h# Z[漗K9&VkTXuFRm -V+ hilRy#y(rOm]DՒwMxzx6&+zADЕ@~|* Sw5-JpڃᎬu]~C/i=vDAj$3÷1}t겏wUvn:njԤb}aMbŠD~-Y)9 ;kZ{q0j6x(xγ].#_*5. h~#Z79 ;~[ZvWw7wxǎFmd.:wGbߢc1s F^z|iD%O>;+N]xt/kx^k[:W+OH4;4ڡ/;g1omWh֑Wѹ迺vHPDKE0o=M u/6EesåS,Z[w7#-+_JΦu CJBw``mxlr/{}GϺBh]8w׉pۣߦF-|{L[?=ѧ" p?ڶ-5a{'\ͭ7  ehl-_[)8Vӽ>^K Zw7/l*DvMݓpz؊{۶&ݮB?>?j5[N)C??k 5}toF $[vBz/=HmlΦֵNJ? ҴQO5k b-v5VsjY_ўϋ'n?;b$6=AtnS,>pwi//uDš]RoԿi@(r4TѫŮFϓ'~u&͂#.E?-]*2 х4iRoukcM3CK tSN?86vK? u yx`l̺ 5te*co(F?J3="옶h~pzXϓo(H?6;IF6%^r\֟mvY [{fbV;&Bfղ>xnyXsRQ.&Ut=iAW-a~pn&_w@]GH~R1s>1|Gq^# o׽ZdyKDUmua &}SGKRs* VƜOjQ\o`l&^d`z~pyl,~׻޽[眽nǥ?9 +?:?M(IݮP~=] ouG_ٶf;1!y.F:%/NwR$o+&^?>_;9y+ +fm"jtv~g^ ]F8f a?xk{|itۮܗ֎{y3#ߑ:W?x͟)2o)~/]֝E>豹twK}tq#6AOtS{/΢[\y׈~>򥁚= CU2ʤᆙ}GbS٣ ҹ/ 82 AM ǶBsЧr 5[~/ٯ,^9!Yя|u}RGfӗ+O]2~ŋg>?羴v;wv`c7otů5Z& s?gKy3Mm;+ ?#7(v}[mk}I)?vwD>wv >jvEShʼn]ҒG6_۹3ΤDy%m:d8#,,{Pr.{2~=MqUɂ+fy6xQ>٥NG޻KőΕ|(]N|]?eAWeZXh1ٷ}d+7N޲'{:"iװz6(1%?cv/s_\d6}hנb؜c^0ȉ?;^1oxMU< Yy?M?r[tRe@ɾ#[ oY?:;ě{2;0EݨoBܿ]#>+&l"N^ xA E>}O7##U-W(R+#н:loPg>#Uڿ+I(~#:{w86fad2.yAȎgYkrOGƒ?\(RI[f}G:a[w\S'GOcv~a~Y^Un GОeM̱GX`{ J T@r-3˾#Cya+?'+G;{0*Ciʴ[DߨcӓbukF咟x{%A)ycZ7-2>2ԥ\֙ԼMljZ#'N`wS:=FǦW.~Ͻ,Vѧx)sϙE5zS}T(R& 7>2%ϗ~pڦu"A}O0ѳ6opOjS#eow߯hR1/.U:q;H7 0oP?c~RhWS ӕy8sTq;w[- (ZڦC?MmjǙi#s!߸n< _?jlnDMUJ&x]/nǂ8s0k&E?"2h+& &2L{х~go[v3nj<Y\{pWsyKkr^(u[~EJ^Mmcŷ, {I=91 OtMnkvx9ɀ`ctZN,e~pwxϟu$yA/}Lrg Iy 3 u+e&~25jR8SR~PFFO4}hթ4oKn0Q?sA^W~?fI¡׊n^~̧zEgP(Rҥ*(ZOmjt_dxv^bw~za?x yqwJ‹yXC~L#엤+eYTD]a}G9,>es|1F~NUɂja?}bC3M F`q:$/W(RI[f}GZ~Ny{k"ɭ57yJ#cP+#O|\4~!A\|̲oV-}EOk^9FwC̓#}>~>xGvKo~BS 1ƖoYmKa׸;m#Q羘E!- O 4 5v#D 0oVo޼qtfy:7&~g_/zkM/z/DJJ&ߑ?2]'{:֦'o/}{~<碻6<|[٫KA)ycZ7-2>J#.mlGL*&c8v>ιC~ˣ4%g3C Iy 3R鮀O=:}n<@.w`v *jwWN=R3-~# *Iy 3˗$&k7F xȸGhѣU9D$ ^%ZU_=vѧs4+;o=NT[7d^o_/觮_ܫ&}`=\v[IBb?S<w''GfyWemtFkث~^o -?|i?EI%m:dQR]//Z1o ]é4og>*i%w|dYA?Xh>d=v\H{2t. $֓}Gu]7-鱿>/-|蓣M&v̪aa`MVw$1K5`q'ϼ;fRg:ݵoos'&z{bǷ"k完Cɾ ߝurA+.`Ї~3?=KIQM?x!'yפ?GQo%o*;gJ${-ɾ tW%{22ֹU?YoCwc8 v|Ϭ{nyTi9+#Ɉg>: Zcs#'>Lg?6,x4[WnԊ5LbUY)-2>F^#VO%Zg翼a /^,S< Թ/ 1mgm7[Y?X蒟~X66֚o.'VNY?P5/AWwAK^Mmc˕,*YؽwsFe̪]kǍ?S+:[$<}]lG,.ymӡ&W ooOQ+޶ȊNkwl௭vh?!I?Xa?ZӓW}8 ~wm|2+ۉ7N~bO-g&򎢝 }WdO߾d<V`>{tZtgݳ'?m:}Y797Mctfdf.E_L-{N/g+󥈲]lY<K-&Vw/##ۿzjߓ~΢,ϭ^{pmsL8jl 4੿;6Hg맊ܿc.:/Z>$J?gMMe/OJK_]٢1Toh]3¿}1w|hC'O,}11x[Bc,Sҥ{+(ZOm҉L]}2[hl3G&&ƶŵo  7-J"-=mwww?=E}o엖m(Uw3)\`[`behvZ([t[Wuw-yEx م{OƊ!l !OHF[=Cqvy|_ }#w|o%<<}n3/!S=t/>ʨ3^XXaCH- ?N4`M޼gm1 \i;V<]DK?>UV&+fMmUdDgtzkwT~p}_ё}Yyw|T~Љ"<_/l~l~ʏ?4J lbeQtůS{ԤR  }7o?W ҟ,t׉ N,Ns w[&3eO Ǵnhfٷ}T'KّK~v*pO2wJ]3qִ7C?6~XI.NŞ,8b:j'fmJ~c܉RF6nr=7mu>?๤^T]{tW6v;}?I$DEuFg5¶nG/!O& 7>syWG;3{cUAtt{~ 10ZTdV঎{y9<~ST¯nѩ[݊GV:wIs k`Q~S!IyO*j>Xk4gR*jiϳJ^հ7OWyӕnvd?X)ކ#;wbҟ_*Z3:-d>j~hI7lM~w̾fu)*Ң\~w,#L}qমLƇ5ImrM=y{ FO~ؘoLy s۹ɋO 2|ŋ{9tm'|be8˺E[bW1 )ٷ},{{O?8tYwvgԵell~Vgy?U%Ţ>(L̝EcrV.ܕje:W.K4 iOBV:>jDUI~+ɾ#j_|rl~!JUVJ-fKVf}GJq/f!V+Ӻ m":W{q"*B ]v{3DU& ":Ɲ~pDU& s?P?wq"*ymC?ŻUfBʏy7-f!Vy ACoZir;޻+{[}GGg>=TP[2heBсeB&:1o?e!bUY)-%\Ym!T -L7-BW8u@۠D u_vତ9ŵ#Z,B^]{?wab,Xy(_EIyl 7t,{_~~#kx%\BIyO!-H?t='j V}GU~ptj-{O!zy ACo i1,B oB?`Hm!T"MQPE]_ϲo wBhHTYzz+2>B)ξ'lpWBã*+%+3˾#*>4~חG6+Ӻ m" /?e!42)o~!ԕcDBeR BNoԦ=M;kf{/_:~n5{!t~AB5Kچ~w̾#Bu-l ɾ#Bu-] ɾ#Bu2heB!Lh=O!BR@y!ji6B!87@?BɤAB5N& s?B5Mچ~w̾#Bu%)lȾ#Bu-] ɾ#Bu%^$Hz}G!ꪲ2 p?B5KUVJ-M BqW8u@۠D!PdR B!'B!87dB!4kA/2B!ԕ"B!ԕt0$B!ԕz Ym!B$dB!,UY)7BI^Mm~!BIy!jLD!PdR:A!P$mxw>B!PW†~>B!PW҅~>B!PWN@gٷ}B*+ZA!PTebxB!'ycZ7 AB5N& "Bq2)o~!BIyO!BM-o!B]I A+o!B]yKACo!B]I:A eB!Lh=O!BR@y!ji6B!87@?BɤAB5N& s?B5Mچ~w̾#Bu%)lȾ#Bu-] ɾ#Bu%^$Hz}G!ꪲ2 p?B5KUVJ-M BqW8u@۠D!PdR B!'B!87dB!4kA/2B!ԕ"B!ԕt0$B!ԕz Ym!B$dB!,UY)7BI^Mm~!BIy!jLD!PdR:A!P$mxw>B!PW†~>B!PW҅~>B!PWN@gٷ}B*+ZA!PTebxB!'ycZ7 AB5N& "Bq2)o~!BIyO!BM-o!B]I A+o!B]yKACo!B]I:A eB!Lh=O!BR@y!ji6B!87`~߻~],!BIy1c eڶg7?~rykBbyg/8tɳ6?}"'\xkֶ0nv}WP]bϞ=wNdB(~qw7ijj*>%cbؗ]?M7~AAU,w?x7nnrÌ~!k_ҭ(wLN} 6'< N^Przֳ6oaF?АI-*MLL-TWN4zz馛Dhgn_f7߬n Me@Cm}ҮرGGG; 3͍;t"{M7+ Jk)&cnwwgff6_DhowuÌ~!Tn=Py866ZTZK4ݵࢋ.O|WB>=~!/-W~W~EnR]Q@B7ŏoփ"4rOyS${ BE/X^n2EAee@N'''wx-6 (B`K_ޢկ~%htdd};~_ BC(w?'=u8E?//-|+W/TWW4^}C"4rO|[-`瞖{+C m +w#}#kg>̒~!|=&''B0:Wy^-]zh2]]wյ|k^0Dhw723A~sOK׾n馛+Kz…/}K]{uJ=q=~Be`X} ^:vnmSY)\Çӟ}ݾ}c"4ryc\ Bvi Wy_f\]p6ҕ[nkO}jmmͱKovWP5Smn$ef#AՁe[29y@ )&S}#}=v{fZ{OOt-182cbbo}kQܱs~%[4/pGw-= a199=i- nx+w} ̮ 0G=Q]˥%v(C^lLMM]=~[B3q{|sfN{BLwey{zJ?%A;3.pGt-]78%^k:[^wuwqGoН]`q ûvb2U^'7p{ @(OyS/tCn2u-WVV= ]177| >Ov;]n2?ivm{@c~~w~w~-ln׽noK/T!n^hʫy_u?UzѣGfuZkz*g۶mЇ6Ege/;tPH^Mj׀WyHjfU^ռ155<ʨxcզ5U^Uɫ7*ƿk]lںyW4UD^U^*_U_m @[q-C 6~@A\lp=crp=br\pI~$h$@?MK ,$B3@"pUH JA?@pt\b 0 Y0 Y00 craQv1 I0ᾒrdAr @?P%k(\AjrjH*~ 1N.P\:@eXau A?Mh|>WLh W7~\@p\p&xB MD~20Ah"/t[~qؤ @$\Lp)4_p1 Ah(\bJ K@ \Ip +)4.ajhpPJ MK@ \Ip PC3ͅKAh.\pU @ Qh4\t @Bk(4.d:@BeW14t h M Ah:\põ @Ph\B 'Ph\B @Ph\B Z3Pz@;r hApv K'WOh"\ Ah\ +@\:5pEC3 &6u @HE&4.jrn@k & .jBhMp]E5!\4ep]@3mA!f`oA!f`BhA!f`Bhf~`BhA!f`Z6nl\O [V 4ju]hj;nx-,?h(&BkxOM lPOX{P]XCmaZ3LDH+䗰/vF۸ 9?YY4Ah.0Ah4;hjю 6n뀦C3Eq ,YmtXr\ iVmq[4AC-@[iM$u)<~rkቂQ)7*WU#σbDٙØi 㱚-!B!].$9VP[ /($Ɂ^t:XOgŸ1;$:.EH!m"Tc/{l*U D8L]TRKTiR VRA1Gc *@`R5,Ƞ,\h{HٿG4|RPf$##Mە7p&%P!&u^K+B.G(%M6̈́;)k- Zvijdh]xQ &\NPc5NJ8\:?/BRWx]GTT gj ygCd-/NG.u1I6t%&̕%N"$PDhp%Kw j xePi$D8.02AzQxN6h GȰ0"P!Id,yn#%t0$]fx- $A1; Qa& 47!K l*K4DOhf0S!8Od5d^BB-Az :cÎ" jU(A!Y j>IB; ʦ*8 I%;thlἣrj@ o Qxs4?qM2F7ITx]&!LR:a3BWGrE{DaLV 0H-I 7<&nq°G7IBt!BDsAQ8 dN&+V$VcW&膨 -!/% rei޳Ћb WNкr[z]2cCi;A+oYG8D}::}ďhx$YE0$E<&CXN>NrˁefޔZ}HpٝC2vg^kr֕*h,DX\ Q @ R_f&D8AE<>M|TkY['_%Tv&(NnPN_ mQ)FphSo8k!R}PbHr(dkYpc6\fV8Iηm歂Ͱ竚-{->C Ah.Ig ~S6vHe/ =TvY2)b)-FzT)fphÃjpc'uQ$?zp+cO3hh^"psE$9Z!@O,$ar'^Bz2?NMۡL1I^"GqX]EP$0x#ʓc l':ԅ[0 Nl4O{ ^+Yl1NmVS31Vn=>EՁmI` CeEٸ񙑌%7Zj^c۬beCƶEQ|@D8Vd͂Ά2ueN@|mƣ0,LFD.xW#LHoIyrDCL<Ȁ(M!f$@+QE%ڛ06u1tw8QBÅȏz&I X¬)3 h Z(Lz,U'&> G"~8ۀ$j儆g@)4uQ$9P^)̄Ro&σ~fB%~8ۀs%?,92@CQE΅ o1Q7TM@N6ZEVMe9ruQ$9Pܶuu L2cDGȌy :cu XUMj EC]I4޼c TOa&Wd<X)' XUE$qX( }"Ɂ¢K^ C Q8Ge"W&Ʃm B:'y^Kۉ w,bS0!K$@_5YƵ l ͊ț3ơ>SfA FL2:A[E&]f1(re;VM(s~y:l5\e\Ҭh{14y#~ [>P:'R{+3]c3^3@16AmƲqݗ@&1̳òӇId06IJ*r[3äS2w_̈́D)mn?S::A8,cuϕܬl؎e:}'.hD)$V>n3@16nE7 1#Gn,(BW񹒛U2[`M-()1L2JM[uCnցCtfAq >trofftw8 X L@BY_fDb(uBݪP',t.ea{Q+20>l|䠑djBcI))1L2JM[uk,{Om& @0\ Te##MM% %AXuW#(&ҭ u6v{zPDofP?V{4K d=ؚI28fjV$YP]cV]quDŽ?`f&Ic5hH3yz5 Yvy&S&XͼCDUW\%a q$9ԏՠ"LR*cBLL7rp C"dCVkEdz^+nncr?^K+ǫc8)Ǽ:} Mm:l*r[w5/DiFg@y[Cb_qlPץQ7l]r 2ɕL>T2/Kj?=@(YYP!_< 'uV9kɛ4-#q0ɱ1nxo0p6msO7\NEA+\ ̈́ӴJw8y/10ux:EaLηX*ŏ tJw@㐗=+m(A~Ř)3Ϙ:0EN"3J2gFn;:@q7'2u[zNJ1.EFt:m(M#c6"rY茂PLj23oe|*m chT :bh)/ڃ残a EP u͛ȴ[F2#&߄e/ OaBu,{5QCmܘJmlf"S @K*N6~y)oOl t%QM=Gw\yB^Ko0-r\\t~B_h.zIb,4h5˃OpNGt#O`鈉PU)IJ:}8ڇF PRd4hdHBtyNbf;AODZƝA6N06ЎW"O?"WŘNm 3v cw"^^cB'kdhǫ%J"`/V~jEhT9&Ӽu@$fTtUPnAh+ Lb_7΀p:1~jEhT9&Ӽu@$fTt$TA:jΕ׾2oγGtbԊz)s8LTy] FB?1Il'8ֳpЁ ƛa`ʼI :W1~jEhT9%bO$fTtk9tȁlk8&y 8UZbLTğ.dv cm=bPeXÉN06!Q2cԍt5[:-&L\g~'P-t  kڛ$jo^$$4Z撮sx -Q4~'*Տ(Yd%xh0jotbr,ddӇRm#78* 00᠆)N*yYr R7 !y]2 U! -+0h&$y W`,Mn ' O.xIImf˜c̼&X]"ͥOt*MX8J|vQ$3dE: Z!y,!YHL!I{q *;[fr+σU|Ďw6o w̨s" Ls$x H<8`ǛBf IU$u[ B fl IAٹ! цRMҬzGT}`hl1uP/1P,2`z,0l8nٰ6\R=-Wl6:U.: ϋ@QA;YG8pФ΂C&m`^AO|0PWnaUZ S%*l?ت΋laÇc6\)'wh1LEmZ3^x lVR3H@(>{mVvD𡭤g6\ْ+VZ/mVvDRC8zq}HK ***|*u(G>y?@(AeFh]TeV H Mpvy#eh0Q`rRԃhrN*AϛauBWɘEZ -t"6]p^jΩ2қm& ώ"~om PFP5NQlefnQl1 W"4sQtVnHT+9gG7z(#'),~ueb.EN"8$;Vs rc[4TͿa<Q;HP-NR.&5f¨f171I`£ra; r+7 $jWA @ 4IMYL+1 '(wv>0ȭXb&41>{oOו~* q%E&.mG)!X&vtʍ%fBo94Ƨ"~oSc8 q%E&.m#ZB 7ڛ8u̗yQ?Ьx2dLqK"m=Agkb}UiJ+ǠoU")y{YFz3_AtX*L<>p{F CJGdͼk>Q1jOCNI5%~Żoo^OYaT1f )J7|F&2SGr"$fBoef1Y%@nVY<@NuR4T+vBoA+>#u[x3]Ig'KlomC 2S̱ߏyH&tK³}!hy'D~`hjWAGIF+wde],o$, aH0xKVF$JuJ%)Ȧs҈)7m>0& 9"jTwv+#Ш$l"Q"="̤.fo$Y!-9̋DԻn;uXf!MRPpQ$:XRdHޣlr$-դaxgP} dGK ^WC-w6O*]B"uHA1{܃HmjIg Bw\q4w1%f:W{mw%  8,@cyHz7[W˜kf5ďDB3,.oB{dG1Djnӌ XgjTvPG00,.oB{ӡ>*#rIJȃP4i3YLQf;pf.o$nBB|&Åȏw.&<v`UBaoH'4WZ*@Vʑm]HɏdazF!H,I;@*fA5^7t`'4WZ:$0 ϶ډI$cƓΉ 2y$դTDkP+t6s%q+ R1bٱ\GWA{(KfPKw Hhi$,o᱊-,jL<(&/g>.E .uA*tYUzSkBibl/&-@e[ԅ j:#+ #h )˳Q =4yG C-h ]Tޜ),;5Ä Mi\Lniʈ,!,6!:dlHnǧk.0@ "DJpDGvI(B",Hz׬ BS Ph&A>8tB7T@cp dᄷ0p6CyìU"ʘjuة^P%4.opVT)T %1(hĠ~PA'*rX8wT1N$Bp7 2\fsbbO\=#L4S؂z:D|Р9>)yυp"Abj~c *TDZ^W' Ĕ '~S@3@?х#0]y(f.PZ]m9J^FT8.O|⒐~Q ODU\\ymLxq%[ We%s1)l⭯5xӍ?L'Qtj\% @1bj3oB 'HhVpv^Å{hx„GQpѪͲ,uiz5G9uU@ kAe.HHΈďd8wJmf2/MYc^U2?¹= Ghi5SxIvfFk/29X#d& 2r&{dCH)@(3n࿤8;bHXR۵%q܈ $5 %YێwH^xuXq9-_U:1C*Li>8ʅ]URwW;^bԊS#ƤaưI?Lw}LOqe?U6sxY?aJ[ mղrbΛtUWooƍ0 e"}jRL6a?wƅwxks}?>gFkr|?åzkBeRڵvk1xI}ˈưe7]ץKĻpӷ|v&mOd|P%[UwYB;p<McU0=(I~>{>X}ZFKZoqIK6m[#ͣا~̋cKZ캾1swa%뽶̘3uT 2NmU)-9cc؟?/oL]xoƍ3ĜJWqpeTݪwڷTcHNSqNe)=w47ٵL;RcY}*6RIF1SaAFf_p&M 5KˮK3:[֧[y}K.bV,c^VyAr]=7`&t}SaWlXkvBqeLZR=/* #/W_w}.Em NAQl`,ZqOB/\짞Pho.dx7Rz ]x֎qPNE;rB/b?Dq2,f筬^ʓֲ4/T9ή5NwhZ_ePQ짞P('M)JRmzP$o\aƺxRNo {X 6a)1Si+ZTIef k-rtx:k9aߵL;8QiVLUKղJ}.0c]_K|‷gjg+ݞwa6ߠYY!Y8u}zJ7G$ ySj+t7> –5|dGz8fӌURI3Z^"f,Ģ(3<~y'"mGѸ|_9{E,mj4#k3]3U -_#^ʜ8vh ;yaϸʣh<ɛb' =۳؃TTr7 h ZJ%7Smv~o_Wik{>ƝBWghSW;Tu vhF E>qWvDwݗF|.Nb~Kq5  ؍ d(ۿβyZCoMxE{ojFT8Zz 1V.%:hǃczÍSΖk/Ւr2r]FqQcdO1,W<6e*-j/fϖH[g k0<3IZuט7R^OiE;o3wj7lS._udj >kxv7^wqW)qYȳVxl^]%u˴zݸ1`vm 6Uԩy)_qLy$z1gFtqYl6ۦ[-üw=?N F^.9S ER}.[m\1M(j\Z6Fl~e"1jgP ya[+iBpezNK?o/ɶ.f3tU$l\fWTD/ 72OPkY 7%W>`/Ob®uST\(+vm7a3mkT!6 nj5Tte=;cToŠ ܺ.白fo9Wn)6 .4bq/kv.6hTV?2MS=k_e/ %l(f~iR kgo{-z;J*]z_Ƶq 3=.evjÂqŮSˋ gV2v+aodmTq,?bppߏ0%+Vl^=ee~Jل݊1zXeW7y* #| gG\$˓,O7]v"ftMxJbf4`_%.T6IHH}I)u'.]w=oV9꿽v/E7co*&i]޲Oɴf*G1><+*=IĄzeі %/3 (>+I(]yil-Es^"aТr򬜇*1J m\Q̦W"gY5 hQ9vƇ޷b/泝R]e>LMgwm?yV9s*'ƣo yG[vVi*6(ofTrV9só@,W9$\}m;4 52l$81Co s\1lٹO;5S߃ŝǩ_gxʁS<~MTѹX"^kd+Vu{U̲Vc0`8[ӸwP;xav--VXjTpEI}3ź8[9!yƞ[R+Q CI}3ҽT-g揜<0E)a46[K%$ke[VT8[9E0޲(1,+qBe*+? 0a}抩zp@ Y,}E>u_b1f4uò'X4ԏ}vl=/ 5` hu>rB+a-IfvTAl'BKt]Jwb֒dY ;k`vGV.of|=Pzj^+w{ngZ%LO*S,:S]U2oƛ8)}rC=~K\suRn[#l S%v^I/%zWClI}輷d[=5Wwͮ.viiFٞŝfK(]-{+nt6ώ4V,Zl~>Eusw 4S5 nކ/8Fxzz%*zX*t1*e2'X:;'4oʱ75_ nކ/8FI;\OuU{-<<ّ.w~Sw5ۭ >FKWFKW< /jګ5]0ZI4=xWkvAp)G $6\2fHw JGGhղ}y-u?YVjJ^r]7`gn9;-MG#&jS] uY↋݌=($o̶о.Su5cO nփV9.zUl'*92OtW'JrPc?-3f.vsJ%rʍ9<ۯ%CHO6s=7e_S㏗(v ,2&DoXG̖eIݛ=&>sb]ΈԵ4i$ٺ8XB(1#%;,nf~R&lvEǘRkRpq7~G/GVl,Ka-T!=ț95Q,:4gЇ:_<-F/5)3]xb#ڇM-Pv+^=%g[TћXt5^nU<_<'o$bG@LLQi<˰[׭^dڤѰʾ5FL l]uIm?xY*9<˰}te4ܵlW3Mٺ/nl #qwu[&W|8N,Yr^dvbN1OlfJby'դqd79ǭ.)/O .냧}'eJc19"R'Ht%gvۗJյ}q&-0ΰU¨(_mRY 'ZIJe+D̳ ;k{XҾ7)Zʶ&[Q/zI/h|xl]s 'ZIJeSy{ZGlM#c,wm()r]yVv>= ]Is a?2*az۳lAZk0+$+)mI[EAYrnפz ۧGe+?|p.WD)'x<[ u\z<2UƬ,TUJi@*OǷ8톳LZ݋T!}!ŞMzY_"|AKD!ľ=G:n\x~bW趱y>3H{c]~̓A\|v?_876ێx>'7>|>m]Ե{a4&aK彭 K76pAKR.sv57lӵbdٱg%RwnU)j.۝{i&>0olaq }aW3TKn;-i$qQOFXBm_I0k ħ8Sl Do2}m;o)lzE[\٫(;.krj%l|i9Ys,[;ƲY^r+}@%,h5ΏMfZ5jxB|_ɲG唥ײk` ,hAwloټAi@o#r -Pber[nx>|0S\%2_%N++ EZ1A-“(F̼f@!UΎGhĘ c-נk@qú^(nN|jgGGJۆ7akrYzKV Ϧf1hg5H1,؆7a{䃛)IZNRm<~4TNbˣ1BV Ű`bb*#̞z߀EEvf S,)Ċ~R͋#{~x}U˗[/)'$͛hYwJ>njrAJ9bVS.vE.G> ³wҦR%mW3-IfZiEʞgzo_W:;|[]0;K1#n(f݀ߌw#D;ʹYfsvӒ$0]멲 6U*f-K;4f4|l÷q=Z)O׵~s\]1gp95ۻހY5t~Aųw7ಾ %Sl ]nr%Sm ]nr%[>ۯ{ _PyZCoMxE{ojfNf\55؏ѤSo'~xIsM/^>f78K;k/Ւr2r]FqQcdO1,W<6 (7_d\Yi.oпY굲=[uu;mhz]v'kl6Uw jo|gCryZ5<P;s\vYqXe6/.T罖u1-y`}J>/D'' ~QN(aF;pٸb9]hqo}d#[͙)׼gT^bؤ |'0O-Uc7'T+VKlqubTz6b3vbfy 6$xû\"NG-$v͘U8qub]Q6Khl&76ac~1N4$xrm3/)&Z1E%'b׆{8 3Z-Nbs$x񠥟*Ǫ1>uʖ7VLصmxٲcܻ:1hWWlUUT)>&3'Q$+[.Hҵ%ńAl]Mnʫ۲hKW[0M{J8 N"6)V$xcUV^^Zb`TƅwLmLЌW^-fɘR:SM75 ~ʊy.k-^RLָ̘#I- tK3:WJqI&#'Ա*[0T64Dv&fQe3Η_}{;w㊍M ll<3CZK`K u&]%kýzWlSzߍ+6f4)V? lq(dtڗqu5A/[Kpb;jIݸbcFbc {M|/Ǔf,{ƑTٷS]2tUd+vm7a[j?ڏ?1zNTJ{n1[cϓE7hy.P>\0 #R/ %IG)]PRDF6}꟎j/1wkfo5OY@6ٌfl1K=|v3W1?0%Bת$]5`*l-J,1I WyA1: K=d+?|vgPy'(dޒY@pUˀJJTfLQ5kS̘NZqEڀQ]f4=6>[/<%o#w?'k_(PffS +uIBvccob|6mS02U{|Kbx\k$FJlke 4^'e"fqpg1^q@#sq-I$lFJ%˺YހJd*݉AfP-U8'Y|<ϼ FtKqBހb-%pwYz;˥Kg*i`;>HM_̆e Oxw|N~`$[QO6ÁޯG3{<5K~vgZ<]e@ѳV=] V3S9[gs4;ގ}*Lm^b%-=!r~5bK>z6;.SټRIgy{0c$JYUt%X/۝NR^~?{.l 3gC_3u,Of^X%ٵa^cŴJed1}!Ŷ-Ϗ?u^~Pz6g)[Ru5w7YGgx0c(MhK#o*7[]Z `{#MSN"HGQ|\{K BRYV[ڌWmXпM1zii/O7x$H=w,OO] b–]T=1rqY!y |ӝx*H=;'H?Jd*嘛"YkÂTWTOխ☠Ɨ9/mK7R!UΎGhĘ c-נk@qú}>g7Ja n9vTfioCLeS]ŵR'@deXcAa%`1fOo@}Ɋll-JC,,{LcArm0{}KmŵR'q9h D ..ކ7d{Q\K*ucw4ВG 6zmCLeSX5(Zrx ~hb3#y`6TF=u%+^b.<}=9waY-{S S%Rik~6(F?A%Il]S]J[^K1Vˡ>.c+gb1K&]Q\2V<o!!xf=u=aK^>KccbJoq>NJ>Bccp ݧ ?>g <^v= -{ IR {/WnV `q [G }xn=my=C=$o̾~#e_K`Wےab*qLbcJX%qlVv՘>MH$f۷/q?Fo3r,ɞ[OJh*޺(U=݌މ!h5+밒d_o#b-ov$gxU2;qg}E[+UZbdqe-1R%wev5f;@c7 fX?靧k %RZB6[hfT߲l**KJ3J*{qgzú:oil)Sʉ-aٹyM,2+%כ\j1еye ;o K-jGŮmPʉ-aٹz)T1EFZ1آg\Rƀʖ~gnNRyKXjQ;*6.N%eZƋ)^mėaqg[6q<"#,ttvU~z)~PƲ #\b/qem|DZXUކήbXjQ+f1,JcV+^K}ZRƀyE_gzK'R:_0Chwe/,ʮ׳R[{-ENuaJo;SE6N-^b[TX;[6wykp{0Ɗ˻G)/EAku%1VQ[6f̂$zϕf_g흷K=Nik]>S벯"ginYJrSٔ`;dyU9TsA0ފJ+1 xe-z|V\t^ˢD}ňZE(' 4ƮJU1%RQJXHlޘ*[U*O7=LbӤ\+ٌa-I..|}- +v/O{K+QnavT9{f8bboAAry}XrRY'#iNBwtJQ6oӻ xUO*̛8f~7,΍\|YH=8 lANoc[c\k =nCwnϳ=`;}d8~3j|juMAy_e߱'YQS=3{;>CYr}x_ _p|?NnODGVpru _p|?^.#]GV/kޗ@c緽dtCpS?%.{d/l6߃]y n߃OYj<A'*'I1C*kT8p?bWٹJAZ*m+S{SˉvS{9A>Y[kSɻZGʘ+t_6QHIޘm}'o]jƞ{=>m=Yi,OB1W%v~>(xIVsJ%rʍ5=;m=V)i zDzڷa-.ӘkdƏgvQqRef xLѷ0kiHuiqD1r:Pg+<Ƽ]<[pdj<=EߖVيe;cT*O1ƟEdSoCJ\/di5zIi-H}aS ]nw?)Ȯ-UVH}]7sM|lG@LLQi_<˰g/ {7el%zM|Lueg{,ӕYw免7F>[D?7dg]gԑ/+[΋̎Y)ӘY(vU OǧqK,K<U|˄*csy}7>~1,;cU`;?)S}XȷLXi2f1'׏~/Z*]ԌqLjQqҤ%vIǪԑow9/2[Sl%bWŰ%C!޷s%vI)>.5V_V,EfsyaiTfv)oDovKK<}k9|yFJN12@?oLkte(.յbK%vIN ̓VL5gv .h_ SNzyyc-e[ڤBc3~y..v-G˗RRTⰖ$'Z6/@cʶ΃XPn=oʰ*OSpOqE?e5mϲU7iI"vS?kT~77LirSk5S.f'PO"*7;ܢI?=(^uBeR{1>~J;^7l%U*x ӻsI=Z"B! ^yetq2fe ޘ'[=p+%mx=ߠq2ݎwsyyN3{ULt2+e/{[|5[ߒA~px~u%x .̶_(KͰ̟DoXPtwYFZe'-I C mq.D<7~.~$˗SmÂI6lȦ\m ș0x{`r%ѱl.~V=,;L͢e3dwް'vN*6P2&T s*w4 / f*݃oW)g} BJeb >x&Գyi`$fy~J}4\SLd]l RXDud5[?_{(mgP"4\2Y 6M@E˹QO6-lגrdkuޯ {HgPYlc\VLs*_+]oÔ?)]5"n D6}pq&LEŜb,ʅ;*֚ hހ׃TŖžm8΢bN1kϞK Ob## qbe*aconA8u3M,ֵ/\)}" "t b;]SIb6/lFѮ񜙊Z7)NEnYkPGo)g}vlp]9sfAfi~ SM1o#=ifb솳-1 v2OS?&Ϟy_fI.9\P=B1r3[N̦_ `nJ35W8x;L@z0ܯ|l`q.҆q7ٵlg%HcPg%~ ^ްe?~nx6|n[}G5鴷ҏQEX.\i%WN%t Ⅹ`e"mv~9-3>]S\~envMv[*3qq7)Zy۽n0ЎO\V~jn^]@;>p{Xy9k@b}.k75j5FǮt\, NK*]-gf3 K/pwn >Z7I?ke~N%^{ 92#+}yfvA͠tmlFpy%cEVŮ<bVg45A1o.X\W^'f;7\QN-ӎ[g<ؖl#7Xͫ2%ހz1ϟK]Eg#Zm,yav?:-*J12.f̘ VaR"-{:Kr2F 3Ic]REx#*mO m 4Vl$r1x(aH==^(Xe6ҳ<-KHͤjܶQNVgC\"3՟J?o/ɶ.f3tU$l\fWT.cF2%%*;WPԙrm~\gk]*ʟ]flxDomk#bpWM0fk9PyJvk^N -Օ%I*UeWƮz{ޗ- CWV\koK ٺe.We3A3^іD-IRrv%8;W- ʞI[Ue/)& fLek\m~$^ݖxE[$IRƕ.)є`cza?Kl^Z*Ʋ35.6cnff-]ZReoܒؼ]K ~;N_gerG&#OAlobvu[6||~$I:<8]KKJkgKo*{Xfk)x^24ص71ﺭ-]v~]-נؼ]K nܹB޳DZ4ص;ekiwub}WKT8L('fk;W7> #ј=|7@G.Se_D{6^v˘UYkPصlƆy5#ؘ*DGyhL՞ pˀ3<*o ++*^YȦOq[%7R]Zvն׌X͞NYX\#g?ڳnxG;xeGkU̮qWJ^V_%uܘJa_Ɗ0f45e]1-~y $bLWgU-*+yRa"/1g (nFXNSd1@,7ow%J>R x0II/xavm6>հRwDA,d76&gƌ> ?m,SǷ˦R-Kl,we7ZK~΋;>R x#{3DiҳA8xɖ$TzY6zs#|Gb'r  |ާbS*[u0إ[T.ky-E۹XY}m-匮ع||gcS*[_UҌX\%w{Sp"_vUs^Ato4z ] m7΢ ]g[ NhՙưX7lKl=iI%R=mwM`${Xo)7rg?H%js1[h}z#2a|oC=[b16g(?seW {aJW Aóql|Jꋕ2(xql3M">0F3ŰucBnVl~a|Y7oecd5Rxo7&iic_>nt ooR2RLy8|;6ڈ#W3~s"JSP],wKE*?\D\-&)ZRhYZ{4wղ<Fx1[KXvƟl|VikBRq+1^l&#*K Oڹf758 \_rl-aT6뵌Vכrĭx1[Kز >\,E ǣuMrjAQ9Tb?*K{5u]nEZ7seiA+E /7' }$gxd ~)(gd}z]7s%,Ov/+$ A*W.!UK]7PY pޑ8N"ꊩTS7Xs%&n۫յ@/7~M :+j%~ةREJN[Wq=/V e;ٗDy؄7M&'@$d>{'( lF ۧ{N%16`^7|8zn=,sJ1v/UO1M* R>r%|wARG߭I<_+=,}œ m &7J>O܊/wqyl>+[Z B7-|(}O=ifAc7=[   yɼ$3zW-3xEFk)6c(IZH3i[ NrmeixWU2doZKŗU96k*}M%w\l)VX*[q]٣{]tgL ֳ;4y~y~_2bܒ2RLCճKpW{L͢D vbm2 ˨y얶~jŰʉTI5 J[\TD)J-%~)1HoŮzύmpK{b>ۏƑl%nϨ;#e 8jsǹZIhmk-S4]G360S'ᮢ>[x{rQ8HZZ˶=ν60_z{b> Ĕ$J%ٌUj,,~S#;5W`Dj$3ۀr8WӧȮH+aٶg[wߩ'R#Io;VӧbDl۳;OYx^ O=>rWLZlKl۳5W`j$!܋Ĥ.ZRE+aٶg9ku"+1K>TѥƊqk7tهhOr7FX7Rov8jѫ+AakS[&:lqd$΍;kx˙VfɆ+:Y1+Oj6;Ίcx-WPSߏP_^Wa=/Lt应}zyFfrx'*ϷkEĺDJMUF(*<-uU.2[M.SՋ.{PZһZ޻l}-/]\\*?-{ .i9^Vκ;L],WO/w-b9+ƺF֒mFQ: endstream endobj 9 0 obj 70927 endobj 10 0 obj <> stream xw5sA 6,(( a+ lX EQTT $Lfovo6w2ٙ^l&y02_" 0qJz_6]7{ 0D P1IY'A&u8X. Њ g} tcgn%MB&g(&%Sd{ҕg(GHk?@UOڤܓ}oKb'@'>?$R2tV̑q\F-3& bRV*7pwBkH^:S{yD&Iԫ# bӫ )Q8,z%S 2V;^CwUR9J9 Ы URw6T^E(^ zuN~)^%U\svUb:rMPJ?YOlO z1yG3;nrx}}ޚXS֛Q}>xx{>x) _LvUo=q#S`WAO)'b{{ xsj56*q*?hD8R]{mKԽyL[?>tdGϝu|~o{:^}[,\J1j>ӹH蘯b߯qXBRCnsyhl=+%,udA5avW+nd=A՛9r17ECTh7(߲dEL,Nozm H,ܗk'DѫO(&n9MVۏ羐ΫSٕxN=ґڧFJxX,|JϤEV8Bl).='&x^ $eّ{˄䨹(O8R#zpV82=8_*}l79սsR0gAR2&W磬oz$rVsŚdNuפY"ycX^}U_qVk7Rc֫Vslâjtmdf!^5!^f K+^#r_$rzUEՊV uʒdLޔQĐ^( ߩ[x^_үhem'kԙWswr7}&2&-f]u1z%v&\#y,IbDΌmi.9(#yVzzU(zAּYjϓ$ekyۙ{vja纒޴W염=gq-^¥\G+O]^g={z{i'?M۞R Dr/;gL[IyGh()!^ 0/"ޝZxZ+IrAKUzO=Lҳߖ#5 ۾nLa+(jQ6™+]Zq,}wU^Dk`iof-:RIJxGD}]>OgeC/3w kwOV˹8z™nKJ(?A|&K"%L- nu C-_"0;r(wן S !b~a/{r.^iWU6w3Lc@Wb$V%35m%[%x-b+i'_v}FzV-^Uo&:J(n [A^itygU:Ǫ j-6^ufN+1LUK1$`Lw>ʝМf^A{8J+xRm"5OWybM1|'UEU?0>ѣ_( *~DqC&\,]|Y !\+ai։^c6>-wjެGMU|Q.AoDvBī*)GT1GTU*vYqG5"ybE9MW3%X3:z!e?jB)k_?v+^YKbSV$q-bc fGzZW%BpÉ1<5sYީ {+D^F/s6^8޽vOo P|X : T7Y <KJ8+NduYTDyԜbMSɵJ UuUv1($#2gJV.G5.]jPWoO蕪{&r5Ӽz%Xֱ[cU;FNʑΊ֓s,3S>nnM/M%Py׫CT'fk;1]`[)s+JI.1'e[\_JX(*O\y9ͫWւ7e8~jWzۣa1^fbYr<*+1~ӡ*f_G-u}rURq%+jqň ZKuBp‹p(g_ꁹ*<[of FUTCNzUru=zeO+ƳAؘz ΏVHh^Z*o)_N bӅbDqňCj ԫ#.(\>_1;)H_Nߵ:h/ D!J{="ҼzտzY,]|^iOٕ!2H:#/>QU M/ϟhzu}"59z?^eO2tVgV;.5fyP/L6q#D9pPM s"*+JvkW'_q҉|k4B}>93]B,&b Eu_KyVx%++D>9S3'3e?^ydzq:*(5wC2'ez(rJ9L (ze^W2j<ӓABJb(ȯ: .!fDtyeoǃ^_b5!ғb?\[Jz%|ZG+S O._{uދ0_U^)EXޝQyC) h3=W V.Y{ҋ"qd2]׌! JPwEgW|JLsUk&L +#h.뷥B;_c:~+};Vh Ek'dݓ(W֛ګW =lY):kƮk"lVPp\<#b_,L.bM8WA)YyŗJdŸ!QhsjһY Ħ[U=79A(j+D*WzeMYtQ il#sЫc~c^kK+*X4zu1|'q7o0zu ?K(wYBmE fkm+qT1nؗci^dzhsN^ cXwaĻ#JtëW[{m -1d^ fig- },b3z%Vǰ_vk^,!pI<_ŹKW8Bu{R蕘sR-*rbnBإR8|1GogzL\"RpQJ9LF׏U'&NCWKIJ5 ݾNjXTqkIڋ&s-;YWb,/ Tz<GM0(0ex#z[y\uW{?P GRbQFшeVL;@RST8b9]HJcH^c]Bh γwuW+m L줷8صVްoCMb,WcK@ű B.U|Z̯~pֶ{^^)" DH]_u\Y˂g+Pva*\'‡T5yWoB,VyUE>*\v^ɳ+1ֿDJL'qrkSQA: ^-U}7DF%0Ͷ :*1wH.l9c9x\wV?UvJU ޮy@U'Sxf;7yi#\J%k=".<rM/unl× 로) Zv8қU^^,uf(JlgPOenrGְ+#,0SWg(^] ÜBC+ul)`-d^d.1Tpy_  W9\@ڈVv/PAFKg8@Μ Yi~" SH&|r̞(5 Ty)#/_Xx{_.Xi/R_(_GlQs:c#w\=+:\M 㿼7_F݋=KL!n$ZXKUPU7v ǝj |9fI~k>FXE^lWv[[«^3=l7I}͵ecb6S]ze)c7Fvڑ~9]i>Y-簡 Kp|^%~4k|E.pP^w_ymm+jnxjj1Omٿv+"7y}+6%t0_p5Ayk9cLw}iq֫o,u%\r {ζ9#}`.Kx.MZm_^EoN*hTpIFzto?*n=XpwUt@K2^>zex/?_ܛ,SDɾ65[ys':~$ H8ϻMڝ iȜʍL+cъWQ UOEvHSz. =vzs;~S("o镱4)W(5y7]yZu); u;wKxVQze~x|Z?I}]y Gc14Hs5L\ze)[\^owOjL؎!=\K4XrQv]ze>^)_?H퉋#Ax3g-*a[‘&EP(+VrY]~xv'IƱ=?a+Kw5ħFܾۿ31;r_vmc?Z§]"?K싅{u߯~z{Dʝt2޼5LQW]zYY'7^xlxzBG+G~E֍af$'[&ߊ\&+?ĴsʲFD!CM^Ͼ̢;⛦}2S/;3jF L w3}̠'G y_b~~{Lc}g_7Kz1g;^Q6j݆o{7V%fi F=WPV^RbE ׫"b@=l0ُE*zl(uga\@@z%ϫ@z }w7' +!SN* ӫVIgp~D&1zW$P$/Eə%l۝pUE=gWך̏S 5?^D $3$j# !oKFᚋmJܸ<\G ^qĩW1|ƈd2ڔRyh:z]~.OB7/ 0?v7+m,#cn Eg]YU|WX-I:=[*,[EԳY6 ze 6P [լNCTMR/_evJNHzUesc"Yˮ^wE *"D6ڭ:WƗiMN(QA=3]WWԜǧ^mk^e}VJ(WFW&O(qvTzUukJ9˰^E^OLH+)UeF4? azeD\X8ͼH )IJVRWyQ+ҕ^͟z7SSA>dW6!E 9,`P}1Uo(0sP#5gv @Y]hze5ʴ(/ؼ?roٞJz8?slsƬW;|.p%ǢW[y:/XXVe;M~2kߺiri|Efp^^1qnV}~'f秷T?![uBC?֒ψAviizח{z~3f'^נ"jˇ7?VjxuG;e鋦WߋFY[ -,RFW+h#GN!+}ns/-'l#jaxh|Gϔ[]^h-fRƚK6],i ^@i!`hzh*97{)^~5QM'[ ҫuwdsPP^׉ϿՊjW74[nue?3^wҙ.Оs|PP&-'w*^#em_ꇞ{Q"k>t#G9ndKEՌxjvy*j_[/q?0'^}R^9w4Ы"͉LXڡXX%6(W\@oe^}r⚃Yb?yC&KiΣ߬Zf^cs/ $Ϗ C,l >F4zH4 \'Vb\y#)-_\bsW]/`iiӜy?Yo>IO^+Mz?s5Wټ xC>#[ ;Ov>U5w"rOՋ[@#|3ն|owZSWi%֫E/"-\g}+*,;ФWW'b.9Mj:G:/-Sem(w:qg^`Uf:lwb?QdzAkvHv|;_A5bomot ,qgMSń^oU}J?>lWNbNw絼!zf{~?^WGDŊuQ( Wu.вyyhN `,' K{2(^!r gxmQ"Յ$f̫W䛽Q!Ky~ԫ'y<ٷ?WmW!(slRQ/}%PIǵ':zpԨQWmu~{^1Bs#?c.^"F`j>zN(b9]Y-֩WD?cgTgSUO @chVeUV˓GS[b^W.y2.U@xG8h+.V$92ewn|])f% /\yrn;J=)|v7_NXQTW>Uqtg/R HxR"b+YscZx4R9++v/7is#^SQ݀{Gcz"k?^4pZ9RqJl{ @|,AWg̛2򩦖bݩ9$>⧪ Yh&ޞڻI*q;z"X i .S\~TT~|" RyWO`5+(L ^qjZքVŵ-\Sz;K$ޅ{ǶCK)zgL_Zl 2]Aw^WPh`bT_^TJU _dR/ŹծVR^E &@Qgi(WYCsHY^O^xK\'Wd]׋(sm7S @XD;_t>wa'-MFdz)Ym^^,EQz_Cqn}x^MnnYT,PKl~8_/E'V֫y1<+m; PZqo&Z? E#}w\zӅEqRR4(ŭW3I^Y['2XUFW2 Q]}&}P{B 8\I}!z&?; [ 񺒪Փ㽒u $WTW 8XFT2}ZDիC(Y.^}S%^$LgsjQ8/"x5 +cDJyZR& NhnF6:Yտs4:yn" Vَ1Cur8r+^2NvWT`8;?\(U*-OpW*V*ާ?$N7wkQXvl|?1E扈[BЫqGNSze9(7qojܩzOY|KT9.6f׫"ITHbT$Kn1nWzj>kz৯)QqdzUx-,gn^mO1%y*_C{wT(s|3Dn`9ݦ @3NW=ON׫kEvbF{9%,N^ uY#2]l(hϵEhf~equ/Ol6(e ?Eg&SyW^%Et+V\DXKNw+pu^ֱ]Q1Bi ;ts<ǿ7m?/+Υo!0QLfF%r`?)ZwS0"kNn0ckTzeφz<|j4O}뾶"5 wyƿs>Dщ*m>"^):Xgˉĸg% ~uԅԘ_@ѫb|#l14PU#^W[(w#2q@{i&ٻ&BcTgGU1*1*{>^VgE}>2J=1zU(\ӿuXɖπpo*?<(rY|׹7x +s?ORUx 5g*P*lnQjh8%1%EW;\z%6#z'` wgɶ^Gh^"*zֿ,ZE)YsR-@ʯug{BQPklQʰ9;O]􈇐WᇰzXmT^MW+cw?/1!h^Yu&]NOaL8@d|t8gm&|@dyVm*jXu6ӡWb3ܹFFWj>z僯^mW˻N 9CLȺ͞t~oE*^(NPax})땽#tZ,UZ;@g.w#vBD_r蕱D4M ty0 +c&hxm[G+)/>VJs6!)hX?EU1۰A-?" H.쾟ɞ|PRЫĝU zeVrØ\(zoAgUG'3GhWֽUEȑ+ze|(|.eru;Hqzy|~0Cx1VG-~vgik`Du.tpˍX5reW${ki^h<1F[(h+cbaXB3ഛs93/ Z\%{Ax,NNXg6YD|oUt=ossK @c #پwJگ={l{Cr~SEA|7ΏkIa>1ze~'GWcX$^]<_Nv7F=\YkD+cK ́E̲VͿRXTWO'XxcuGOyEe R687z2wAR+qg[^6a:hE+Xյ$عwlpV}i=۞P/3Jx}_߿|gCke̚ZF{=Iz^AG̛pffkv?Ebz퐋NVɹi/Y۟X?T>脛m_#~^nExi@)]0륚ضO1fŋzP@zVZt1@2;] 66~nz8 ytp2j(8UG'%(̯Pq4bP"f2GJ ]JȚ3*h*ǹxK. ᓠJ_2@q$*Pj} r* =MdMhx]MTKџ%c/jv]0WU7",+|2y=;VZf}MԺeeu2vFŷS-en3`ZwQjJ{u ZNݨu!j]жMn6ePkԺO˺a}{NV.e[3ij]mD~ZNyjZ_Gk#PO5>Y9:Ym՝Z2~j]̬uvYP:fLu `VGj1Rc=`u:Z1`zY-sWr[S cO97RҚ[YFzN#m0ÔobjƬa:Y/SfByLySҾc#f^Hi3k5>HOLkCcZK(pm|~DHՉX1j /Vձv 3W|llڲܤE%ӗQ>_98M73MMEW*Y) *@^6RiЫdJQꏠJ%ЫdJ+q(*@E) Ы$J~zՒ4t@ɀ^%Uӫ? hVmJ}ZQ ~7@I'@[W;ڲe~a _Q593J $ ES8*5(@{/ zکoOU|,]wH6ЫT%/3@ٲ0vJ/ڲઠ#6WdTүa$ "RT=²W@[WZ哕 "Jz8' hWi08>+-^혴3FC^m@h) ӿ;zšWK@B(^u @@@8jA{R@WZe2ۆ^mv@8{"/@|l+-Ղ',leuЫoi _Y.#hk ~W HzDk[+-Ղ0 ҂ /mIV h<~ i;V hW[oml#@_T zgv?+;ZEA8Jram  A8%UzFDz+-o{}>+-^mxs` A<@W:`OW@[z>- $p 5^hm ^E\R?ˆ^m^i76 h ۵zEooN D"ћkd >GLjA춶 ҁlBY+-v^) EA8zrEm  A8K*¿J g+-o{]>+-^{R Q-Xbۆ^m^A8pն4/ WҮ ^p Zz5A8MKW@[WZ╿mzEҫH,+-xZH+-^.F _T TҶW@[W:_^N~K zu[F^Khl nE%^d+-+-_z"7%5v@^mjkkd a@_T ^qmC@t 8j[H@֫n ^pv;Ղ3HBˆ^m^i~lzEҫe:"Uoy~p520W@[/k^o+-+/O/ hCr@"(^u+9zW IÀ{Jv/-H|ˆ^m^i6 h ۵zEooBn ";hiPm $juom^$DQdzbopQ-hA2z s6 h ۵z^ h>׷zWZ0ö ҁʄn@@tW z|'hk ~W HzA6/+/M? h J fuo+-+^m*!\3 zE+ ^mL8qۆ^m^@ABX+-+C@@@8pg x^p+(<0҂_nk+-+^m̍53 W@[+-xZ/ۆ^m^A8^@8jpghk ~W Hz _A8^i7mv@Hz[dn"NH+-҂gmT#/zz@֫aG^p B@@@8ELzznW@[W"HH+-]~ +-u_ۆ^m^A8^@8j /@@@8@@8LmC@z"NmJPm $_ismV'i Yn>8zW[H9@@8Nȯ h J -ۆ^m^i hW꒴53 W@[ɝ +-]$" h JJW@[:W:vWZ6 hK6JW $]W 4:zAǠ(!^ z$i ЫW z-FJ lu@@(UJR؈ ЫdE6 UaaMЍ &@*.j@Rt%c\5srO9$(c9$ÃnxD@@9J _$z`~UJ) @^zB*E?!Ыc5pIW?2JD۠IaToO{V R @t @tzW{j*6J I Łx^p0<+W:AW:8 z58+$ڑN*m ́W:0)  S+-t^i h^:"ia` $ _iN6 h J 됌% h JL'%^MW  _@h@@`lz+-^AH+-Gmm e^m,5^m^iA=̲W@[W:+dOhk ~W Hz3TDkW:PP>|ˆ^m^i hW"f hg+-+^m3T!d3) he+-+=^mv@󃽪t{*83rmC_T N%UY6 h JW+' Hz{j :WI h El҃=o!@ҫY, ">RN>+-oׂ.A)J jvˆ^m^~:^mj'_ٿ6iDk:W h EGF ҃_ٿ=45XW@[nnhΩKlzZ @t zaؿ5?@o zu _T z;lʷMI6] W@[{Tq ۆ^m&5vZ6 h JW__EA8*>94_@Yz˿}N K^yBW@[/NC<?+=v$ژAH,+-`=^m_i+-ՂsJWG, (!oOQW ]E9@Wz&6W@[߮+-`+ߞ@8@}ζW@[/Zb*_X+-^m}gUm EA8*9) IùA6/لLW@[/]ɉ[-zzBW @SzE%ēI}W@[W[(OZo+-Ղ JWG(oOQW ]E. @WztmB];W@[NSՆo66 h E"R{eC@to:^mjGm}/ ~$i zu 7J,S_4UtM $Ыe񌠫IeT!@ #@Rx- /fJ ƺ [(S]}H*nt\Bj]}H*Ы%7-@k<&pcQoOQW tCߞmQ2@R]}H*oOe/ kyoOUW \L4V¿=U砫IU_ 4UAKS^FAM?nV.LӫiP/:"*WM1JIWzTo+ JЫW# ESIU^%~1z,WIO>L# J8U^%?z MЫdJ*~zXW)J'Uߤg >ZR=5β/5dm4v muZSk&Ӛ֛Z,3^XfPUN7j=ܴxʲVZlY5zvm-0E}rri-雓ӗEIjeZ~99}f,Z?'_ֺ5ݲզsr̷奜8m/Skm}eZ;P k(v{^'iNQNk[zi厤HfkZ{zUjoYM#j#U"~NW"UgWɪYaY/؛ZݘdVOjdzYRP?fu fH!̺Z1jj˨.hfjM:Z3 {8Y- N-e*=5T̘ YG59:yu(0mK2L6Xʬ6*6qZZkuYiU~GyӪ0vW2*K02l슋hgVVϗ^zKYZCC `v֔CY jάĴҧQXfƴ/[j,Sd_—jͬjìjǬՁY$]Ƭu%^5zZ3ka2yZ]LN7jfVEŨ:#u]9*6tذ{u(cYu@J+mԺY7V%ZW0aU+ՉYu+.0J܆Z]ʰ*zY- dXUbVcҿé<V%O̪kX6άV%oUT0^g*qNK2Zҿ ;+V+×R|I -Z”P?#|S cC6&VzvU`8K,!ʭ, eZgUo/^ՈYuBHjìCyZ݃Z1A?SseVUuӮU1f`Wc4J: a3ƍ_M;ƿgSyZl[ZSRh9\j];ֵV{S6[lk[jGYfGaץ:(캬Iƭi5^IVоj9ZugʳN:|)ղ ֩NGSCS5n:Pmc7nn6smV!䱖՗Z' ƍoZ@j5k WkP~|sۚt2nNVgTf)h[?F_mkԺΰgR%ԚgVSulk: 6V%*~:Ǯ:{+ѪH)V9}e"Y9L+b@tx:i<@8X 0'.YlsK 9y6B ?O)O\ Xt  1*"$ !Al(@@)&jt@Pf] ;ˏ+rmЅ)"Gڳ _t@J]?{.ӫ.HHW iwQUK>ɛ] *긠<2A=o Ttgbe^ PLb5w H ,>УW.(|t@hXrt@eHVpֽS.(l{ K%W+,{].( T+Hr7""} z_I;{Ku$w $ s Vի\t@d=+(r*^EH_=C>l@Yfa+T!$ h,(XI`i=ZӆGןdVk:A@dȑSv#f@)ӡW 1L˻Li@ Q+TO 0 x: $3詊@;_z<H"fd#6] |GW^0ֱ: %cC=B*%-@@k&fRiVХ)JˌBk D@gfW&$KRT+P,1;RTev6! ZG@@) 'RTew>=r7: Or9RZql+7.s.bp;n  UYXk. 9To  Uל4L-K.HY聠 BT=R *W'c?]~HH7A,j;,Iat)@RКv 3  uyVNAft.H]~ KBAT()!A\t)@rA.vKRWu\A&RTfۡd  :] ֡.ێUKR(u{\t)sSmХ!] E+cAhMk:Rf,Dg] ?1/Rfy B/ @&A4g'AϜ  yU gAt)@j}:!M] =[r3Rf#ѫOХڳ%' BZ] =WЊ67bf EW]?Њ?@\&ѶK hmХ#%Ry7Z /B& ?] C<؀R*d`[K +Rc YZ.t)@9!igJl>c1E )I!RiU$)&[eIZ*(2][vF:=}ތafϧs{-,l8UՀ'Iظq!=ӳױ{6/Hv"׆# Yظ"/,lqcsz6nv '?sz6:ѳ9= 7;$?{sz6:bNMA,lu. %ga&|A?,lyhzc_1ӳq3`S9=79NT!t5$gaÆ >qrz6lذ 6lijbh6l~ "tuɜ 6ldBWmo/6l~, gN† 6|bm@Y͆ W9= 6lc ]YذaÆO$!t3gaÆ >Қ9= 6l]5ӳaÆ O9= 6lO ]<ӳaÆ ӳaÆ X,ga#OOf:~1>.BY9= y7ಱ/}έ@ާ̞kh]L|oaة'}gtr '7~NFEH|/ëYWePف%))Ϳ'$,\ Wrz6,ҟ#?3_ծX^,_/oYqqzY2YztϾ 㫫--=jۉ*ƒЫgW%P#J_P4ϦBȎk |圞Y[sZ_}Fd2X^Nx!f7p5>Q(ZWK {QL?o*fOK̲Me-U?6lv;֘R=#5!"_"3wS XYCص8H1& #F˚6Ujk?GtSjI(YXL/%|jPW'꒶7qP2#c_޾(tC y *e߆VBL k|<"$_(v䄷=4ٚčVhN竟B ~a6P hbjKG"G:y Wxl _b4@-gn$z p^JnOZʚW%bZJ_|CiOP޾T)UZ_#w BCW+)_]"]Q*Bw&}>aE4!_sȭ};@: ٘RTLQOOJm1Zm~FTZʠ,v9?}DrBIW] 쎓7*]Djς yʠTn>SP ]F^desq;A/ U*gRDU@M ]\_ܙi[?V|5X)_A*WQͨ')73W M#f|Eֺ5`!9H+|5R]jg E$7wUpmd2ƅW"\|L")O['A&iu~FwUTa#O!yrXK*RBJ[ _=+US }ŽjޓGҊZjf@WJD .,,'j+|Ո$_#_ۇT䫐|5 ΛIn=S#_oIeu$Kx_Ƽ.(tR)ٰ!-hhQ+s@-lq5CAcƴ| o_)֜xȑ +zt@/S|u1v/"h;K H:Yt {ai7^1eE4;t,t^%J<ᝑ: *FYʆ܋_5:U$*N({ю _SmM,:^*̸6JYZD۷x֡+prn& @EvƜPLt-~PE<4`[n:Wڌ yzg\Wb4] vXLBŒJ( y W2JWWLQ jf+}m|%lW!j}~'OӴ%|FxRoHWbs?|PűQgSP+s}x@c7!J0cHWJj<*h&ep/ $]H{_֑͂R23գ,yh!M4yg]_y6dԴUҏ4Vt+7j[G M(AԤl쁢MSÀ곒E,dU9_B8%S+Z_춺 7No/;4a?,ԴZgi l<=iTe(|UL0Sx+yduj;&J!F"oWI>Vڋ$-fO5폸4и_y=hЊ>0T%h}+y{pS,+KH3g?lr¡#o˴EJǤ?&hU[V0+ 5NJ<0Wv*khقLN|{*t vL}G_7_ C7jK~a ~y =ƄZh@/U Dy`}l{W4F<Pw3 K/=Hf̛y p9ѕϕ" sp;V^ꏟy?("3KU CSuVJ_1[T@SJ?7Xn{8e0ҽ%rBc/iB#ZӉbTm\iL$RC iӉ$T|Tu:?8ÜDC;ӲuS r?lNN~[]I+x~m΅8ntRvKX!r⎌̒4N\EӉGNEH$(P zy4Q0Km3OV;CkOASnl1Q/ N''ca9霪]|]JҬ8Rޅm m% Wp \ y.\A4zK𥈇L@^v\"p щa?n!)WdT;79.ECrj EϨ+"ZNAןq¸j^&K,Fx4D\I]\uv`Uv+..ֱV$k7--C{(x#_s a+.7-mUw˷E1 %:$ 8 5y%:i{DeM6x^5sмk XY)<]-CMoD~Ȣma];$DrAU3EO=ZVZm(cr}  mj6_el!A~S$3w!N1h&wOq;_>ﰉی禯Q16Z7N(u~>M|ɻMr\s0iHߑӏk;.2,sķx0 :>罾C<7oOϰ*c%r Fv'_*)Ъ =}MUgq.oW곁+Mӫ֨'Q M*Mt57ӡSd.ʴeYkcFD8/5AϺ‚E~ao8\iWd8-apƵ'_ft7>ԉ%zG#k% i$ͷ4}ϔ>uݚ-1Ijw<}B 7u)57Kd!- $R&vԂ1K;WGoWcׄ?ٰJ3@Pjyb_ҿUr7l :Ѻ r;:@cҊ|۸&oї(6=))IN&\DY c}pd?KB^Eu:y3m`:t+foN(mȄfC1+/Oo*-&M6.H{a.##R&J*[쥢;[z$V+kOSC2P<KA =JԻh[P%t`|Qb2"v;+4!x(X&@BS;Mt 2GQϐQ(+%$#Ae1Sc-W)^^JFfO = aߝϠEJgW[:O `:u7s:!=&W-e4ZF؛d>z%vW~{HEX c5 _nw$c,fQY|pnswGYUD>++B2Bz/hh+O+ 0&]Ѡ0X3wZkxLHGDI;t>謹U}du ,yaFW5y2|_VZ Ku [CgѪX8s6ma?{ѫ@zJ ]H"P]qzޜN,zaHi(ly -_c~mW"&C>FBS % V2|RKG tE6_ٰ_jW!Wys[iD6FKfcjW(GvI6Y_$NjgB[Q^s|x߹7uSߓT|%Tf( '5#_a1r ╼m4Γ]1#`FlWP2 Cѫ+3/dW3\ ΍ߚ{|7!MHߍ.;Ͻ= G4lCJ7LuRol KvR 7z(+Α|FJ.4 {Q_̎![[JF|sB(vnuj N{WB/eW8n,LIOv-̶ᴻn > j  !)c1?'D0 ơ/i}´|53Fx 4CVV7|eÆBCbjJmW,^R%twy 5U 1zGս+9|pij8\WV|eÆp? 'RK`]P O9F7W쟇Iv;$QywO3l7mB^{WG>”V\i&Y?T\S}&0:Vt_ #0?x-#]ט99J"_mOHpfNHxٔΐ Q&4Zk$E(@$bS+/pPV$k dRywpnC@@Կk)r`&&,B!eq,Ə `ƅz؟ El \4hlѾV0*W|ej],\G|q ]#*ӣBPJ,/⸡wwOޤl0n odGbqJ!4?ngݦ$ qa\+DtJ,F}W% .Fcr\\\>q 4Ð,;gq\fJs=[i*MTUT{^(E_;-Fjir`,y8 bNŏtBm3opH ߴGtܥ6'+5/G^W>np9\%]֕t ƫWG߂n;,s+</O 7_-Y5EYbL/6"u8ak~5Y&td?O蓼eJ<8W57G j 2xUpjklt漏=Se қ\v/*Aa竜_|e l0 lN|u=a 8)2-Q݉xl{m̻l孭W3lI^4?:ݫj~i6|)Z7xegՁ756=OnJ:4hmy 5<մ/5nn+oPOCYVOj=tTZ?H+ok|<&Y7}Ώy &|װG7hk/\6 ]W)ԣ-xj+?C竿+3wwCmvZTɽ|B) /.T{8gWo]ijVݣ83K}Xڹ_hqe)>LԱ0cX j&oZox:7Ȝ<݃gϦRÚ y8ȫC_"I0(s"h%^D^|$!{ͯV~gjB8Q0 "(_6|}A竗 %UMJo!Slo"/x!\trP?j PWbbd_Dr;7KԧH읿&|:P;?D,FĔ|59&^11xwO+jƃ>^=؟Ws2s?yT=coBd/yvm݈(Qjo0z}YD8B3ç2vV 3 Y,zF Z$iS  rL$tRZMЈѣȮjwWUrJZQߒu= L3&ő^Ndhɹ4$WEzaWk ]NՋUZH# `,eFFo ]@E_EER+dUl/T{ _ ="/`R?ͯHE֞F$+ORp'SӗY૨"A v9 gp H&*dX~ pD1tFWG[UY0Qm[w9So{XtgW+[J _ nKI V07U#ċdU,R!]-MTu(!i'd`.*|YmWDIDLJ/Jo0k|u;`Ѵ|„21 ̦g-OϤV}l%_aqWT8[1QR+\2p& ~Ql &(Ѐ6PKkBW^%*`d" qWx2҂u &Pj-!Pq_ ~7p\0C_`p~WY۰AFlx0w.+!|U'^NSkz MUt#_mBuYzpodԯji8+dA1^bq$8aS(G%CW(P)yNǏ{[kF¼0!ȯ/6 !RWD*}+me5`I'?PW(v0ǝ 9WL.8KiH\Jz7pi&+0,9}&a#`P+0-54\rW ZIP%rWZE|)l`׹bl+=\_hns:yRRȦOO!HDi|5 acimFBm]C{vdv{޵n(PAّ |EpnFuGL, Zk@E+N;&}W긶J._MWvS_W,UJL36 lظ07h+URQ^+_kZyF3Г,pYT}[V6 (=(= WߪᕯN~T`V%P;GYalظ SwXI AZ*=AS&qMJAR"૽T`S7074S+H&(WPϿ_BE3| 1ih[A fp+.qW4&936}&@fmGдƊ Wj_,S [[VYʉ}Wc rum ,f3DNIqoodWQْ)h/w>zdٝJq{fX63Ay/orڱ'*n?z-J7?rS-I2sw zú7Ө ]G6s`|b=~ %_4Ôߺ- 3m =2)*HQB4QQ3t]RcLmm@ЄJ%t棽zKqzCWcAI8q1#HeT31cq=q yjC Īސ@+\ 'URaq4 7~|V_P~@WK; $xL.W#Օ/:^^;+|r|-6ӏ f|ʩ u+\Lf$BPE&RG_T\bO]hMKp"?h*[N:h.x9u`BZHJe2^7Nl3<2bRy>" &|]z%Uh ~85QƲlη:huE0j-]&CRnZJL PdZB댒-`WYG+:v2P8*{ǦAT<\BdG!m*8Y9Ti}3Iq% +Io[-wtP=7&ChG1yk!' v.NnW<J4|* f-W6l*j|u\w&ϱʆđF4~-PƲ1'nkS_hcO^ﴡo[fWwM)+KEO0to^Dn~_|e$_]?oY<~ZZ|eŊ{>cf6j@˯CydVڳa#/#7+=Y{3PW Ck1l~FM`9أcލ(D|~KCPkw6%W^'_&6΅"K [58yb 鐁_,)@Xal탯LFJK 1+0kq7<^- 6A}`UAT84Yl+jrB]`~]_((aZ!'%%5|u.)+rEXXJN$#D¡k1(򽄭Y$|q zP$_-vHg̿&pzQW6nEe6Y'*@04ϓfv=>`n8|Q ^跊åf-\XW% 6-YIieR2 K|%⍼/K\Zɡ6"A|Ub.̝8)j h"+>UZF|Ib`y6pWhʩ;+ڲ'Ƙ]+ URLjL,$T1_) }2y4d;F¯@J m\rq+4|%\%-Y@EE b}:˒<ǥ*AǙ%૿=gGÀFm.g[.(axv)+x_8}%C睯D]Wh"|[UqN5ݿ=l_2 1d2з9NEK$1% -3muW6_ٸxJ)DLF Wq52Q=a&VE_Jz+^lֈSڞ1竎oi z˷] 򃯶rUW/4u2G2 4&1e(bW^#x;4bPA ]*0^Aflܚ n ͉?_0j0Dt?H*Wi@QO? c\v]:e0m7X_Y?I+&\ODM0!Ow2JG;#QLYh[_/x V倡;,DlDR+3C_Ҏ;+Bd2}$30E2 qBƜvI"_=.3xYf|Ff `Ԋjypw鉉~Fa## @@" a $fCAɫ<S ŋE+L,W{ .#|ǜI^=o Yl$fAwV+'O%@˅(|Aw-k`ݹPJb؁v74vXX׀t\K`-7uN.4z e`~&zҴ޴׾{^/ &_ a* P/ PŀZ Ј [ͬN4,UҗqTcjLU=ah(T$W"+uY=e 7^3X>IWͩ=!4EQj_%fȇ)$K|yͭHlI Fn,(y t\}ٹUk{<ӱ~f{|.-?th7\IJ\D~As܂#*1!aW {#0_i?R}P֓)@4Cz]Tܒ{Vpc6M0p+Er\:PcAӝE "**$Gf6_z jBDg04KPN(3Z6Forͺ Ў5##ưj|-&F C^4|Ӧ6I,ņRd1ГCӆYi04m6G7i5-Aڂ`kdW-kpp{O~ʀYjڂ6zfӹ,cOI&Q dIGuf+-X݂51ݡѝU&+Uѣ"Wk5\ |KefRɒ\mWڳ]S<_۰xŮ4,gŒ!&,myի&e%?}<斴5ŭ.5'<ɓ~^W7_=~C]uĒms/yMqekzf0㹂l_9pxWs;eR];_W.n7xr"nZ@kYW6n >bΉD蛳S%у׸f|ebq7/#-}g#O|<4`|uv p7nQd(5-c35qm>n-zK[cgƵP6\5E: M;4S&%[4cPJD6MW(C{F|\8U6Qj=SMyam>`6K!~O&a)4> \jr Y"fxAm{4N$x:DZhGRquu%m_2}CX__K|1G2nLFOIͮ/Ct |Bk5R>]ZMgݒzCi{2 WeKF޺3G=.߽*_r95)<5&6AqW/SQāp"Zg22n"!.΢_o6w|iW;Bt%E)qXV6K}:F&all, JWĔVjy;^|kİrW[ ׭rB6 5 f2!-nxFܮեpZm2:_JZ#573ַ `lw=Dj؁t!|> iZTD”7 0݄ª8dl1h)M; TMP__[ ]ēV/wMW]h^U7d =&C5w]80nnМZ:#Ս򔖱AJnC _i=!`۸qpc Bɏ :B|ʾ*+%@q?摷H dٚ3x#iN鲗_e +#n=GPBy3WgBa^,Q,!_E=~ݝ.ᙌ|E+\"Toj:7_CHNUJ(oyw6l!`Tb:_|T)a#ϊNd%K oV|/]y;؈җJ+<_Ms~-1GuPSPBaw+l9?Eg_WIµ6=ڃ.£ yz~kYEgL-+Ͳg*\Dj$*W\i|1Avep"Ă0܆DZ8 &S&D b,|I+-W /|7>% ur3& y "#/+96%#y6.ĪUg^+ 27j|$Jψ']p EDG/|J-_3+յ׫Yտj`F T* a|Xaœ&C i$B R_bMkmW?pF`|=uB,E?+7+g-,u+8yŚlb J=5&)_aa#/pBJx%G`( |UOTJ%pϛo+^}9'XL^K<]}J!KWKŸ%-:"_JBvy`;_ eP2Mʾf yIFb@u_@mh/sԭFw$y bL {ma,vq~{h,337Jwt׬!=}$nZ WS8Ltj_v~9_i("mhH`R_S`,T^ oFz 8ʊ[8j*q0J돩-n?ptopO=[?33lnzЀCf24c?JZVL>G\2=mb$|9J*'BF4Sf}WztQǔ&! y{JG}Rx9`*x+Lۉ_-_1[iܭv8̻"&-YUb Y j4T'+HřMsM Djƌs[&*q#1c>D2UZYB?`@nL'_S;'LaG(@%̹s!RLƩ5 |J|tyqȈ'T<=\ufy*() &[tWzBYtc{L~wp%Kg4GWgP " 8>^O "|ܙZM|#M ,5pѪj2DU$?xGaW}66YLL@9y-q9N.+T39ث;/E#_ax~.a/}.v:|m$3eFɵ!:vB]v/O!}MrZ!31;_icI,Ր3s ~e;sIf9 yZՅEX]P!A3muDhY`^ |NHlv1J2OW)%2' kN$W /I!DW@>}!^|'?|u]{5uӻW݈r/s:QR9&;ӹW8 Hy߰# S{Sk%n9v|<: J~ Nh4dj+h?sv"?(ew_ztR,>ڼwOn"-kQ]c.(q$8ө\t>ur:;((p:QjtNдNL餲pb5lO{DawV99|og ޞJ6"JۻFV'Md_i;_^Ge4&tKPda" aQ3ܤϏ>V), wsEnXRlhFb_ **/塚+o+DT`wP )L3(SA4mD5jMEN2-1*fi8:I!?X+Kr,q$QN`U /R!ygl[OORzdvB^^$^lP5/S>QΊmw= =F6)/h:~ ƊYKBA`YmyEQD3\Ҳ\`pzop[C_l~3&x;V Ӵ2B6_AP 8kUT\p0Q!s߸_ &2||u{L=S*]uxff?>FmE֍a8p (3i#_+F]EY}5zb -'ss =RKkڪkVO\WW"{5OdB#N*yv?XAiD'CbзS>oU|Y[dlϣ׳Tlխ"!Y4}Š&=_O7᪆n 0Oo+/ЈW>'G'&%Q߳cSF@4%0%<[)û.&%6=839Amg:2kII$_:=LjKMh]lW]xY>W|"VtrR^eFKOs_o-XUт] X(3M0ߪ],JNU+Qn|E!d4t̏4@T4-K_OrP +!={0I_Aϖ]2ծ@r ɕ`6c_mժ<#5%|fNO' Jܽ{*^B+(d_ ;/oOQpPWR,u}ee|ӿ2aJ(ROnsHcJ{/UNW)⼥u0W|uk c6)MDx5˚t(*M&06wҵʆ +$+c!Sk =j+Q>^3^fo%Wmw_|%ԅ-B᫇I1u/x6RUHȃnB_ǔਫ਼})kZ o+6,Jl$ ZJ=\rU{&h3,> ce)zHBNf_VA[Kžô'PC#8@+_ͧ+.Cސݕ.+13²ʆ "* 4Li|-6 J- +"@6UJBn]W2s[9?J>45pj))jWA~ b ϡ0H_$lO+6PH¸=՛  F^+!d:fS PxH@J33?_ii[:(c5FOI'}Daz!ɽ[JV= QK ZʆL͓HfJ`!7w D$_H\v?գIXiaJ^m{qХTq܃t00kjIf-kYs hhG&4'nT|hLYN4t~Czmࠛd;й9׍Մ7+Lu&Yb%$̼&J'V+ T_ބbW)с~_.=c6-=Z_/WnPXhTFSB29 Lh%zA{bڝ g$CTEAw>lҲ}ȿXhN?B.@ZdS@N.>AvPvf^j?\lb-v7^jZLզx[ICEc ԒT:ܨ`m'VQ}H ѧZir f7k&֬T2nv`^73t: @,ԩEK=FV˭'C{jCqn#U5 YNP;]Ζ]аҷ[Í!a)NÖiBc9j-WYCߗ<{q_65;ߚe{1Ʉ7#ڙ{'$u5;%3H-tSFvlJ™+6n)0ʆ[ 6_|eF^W6_ٰq1 /Ut[uԴ#mqw9LvUzZ7}=nkأHxޢ~ܵ*Ӯ Ӝi4xIZ٪i'ưi+=Ӳc}'oʸg=o]t;Zk  SJ[P kVWkBu[M&.;Ս~ύF$Ɓ n)dy"Mφ [eOA^Kne+&m INc h%&& 4L;ðGfzr%Ws7!w~ay;/6@_|/>S&(WR &|u,:ׇBpmX>bb|՟T:Gk'Xt;Ϩ<1 _V%#-]j p>M;元R Ho_Az}P+ N\WI<=AQF!h{]֢8]Z&ɳWu1R m6 SXxjWvz R[ӕdRnzO6l |UeTՐo'e+G RS'LD25A; 4"4D9J}X*MW՞_ zٱ **f}PwI0#D`~Z[)H&.|%( d$2b<&&Zٰa _e ^ @('E!ZH% k 2ilQJ /2+^ =W[p)*$fWP= }T*T 6lXo MDNWN_;ca1+A.90ϴGA"I|1 A5I:A+`u#iKf%WZ J3%MLJ}YKd.C>5AaÆK;(6N{QZE@""*DA@zGT@>D XE@z =߼3;ev/23;;{d}  1 JYy9h.8a׶A0啈YL0bP#ylkx6TnRhs#޼ 89MN`arѸoﻎX偡W%CURUsj%T1V%wuk9!/G-=Ʌ[.LD"tFecFWgQJ tGd*PAKCa(y%a>sik(.ZzOi3%WE(.[^,N%<枴5E"2 _' .n'c Y$j8Ӫ*FJ3R]B2Vy>$b6+!&7@8pWQsW8R,*0w:8ÞW.a@vVBr`XRKK0.dHLzzʛW܆ZՅ2X,SNJo{vD`U]*G>oקlnǞATJ^3(5A,Y^؋F^۔΂WV枴&fxez s+9rG\Vh5ʾ0+}-2_ I񌵫S`2R a)TYR!Txe=W".'ZGkhii 7jrӧ@yXۗa['AYTFUx$G^2<yEtrm$и3NpRY틆VBla(p9x˚@˅P+I\JC^hON> EfWD_ #6m%%4yuX(tly%`^a!Ga }9;4,P0ubȫ٠E:+C2yj5)H^zxշV.fejӦ+ٯzm/ߕj>Z7FG,ʫ䴂u,B.!#MkG49(xED%kN z݆D+[fWpJf,yL ߖ <'6GL8@Dmal?⭨/N3Ӆ9Ӆ~4T`fc3D!YӾѺ Oz1aѺj+:>m ӊr܁WԤ[|V(>J)KTOC]«0@bNDwZxUrq+> 5l.gSf^Xby jO 2·CqNgbr0yJb{Cbh1ݯ,nK&O~Y6m0vHQռK/Xw!'+*{, W*^ &u1/l. DgA( īY[a ]oumeEk^v\tvq B| ۵a U=ڵkBNI1/k׊4E&xU^LSyoW7G}N7hv;I>ճĉWH!s`C$g wm8+VM fY'AodPxe"HQMJ~->h I_ {8̢ͫqfc,g{$5|)\UQ+iyMdeE|?!Gsf#󍒌ly::G;M A%x>MuxߡZxVR% '%sn%Qּ-j7纅" 4sZDvt e9L kìEW˟K}]K\hE5W{ЦdtOv5ڔ7/{B3_PiFg+xam fk x ]\!$h ʫmu|'([J>m2dSYmU +N)߆ hIa[Ն!ͫVu|gu.K5י~N׎~rU*vv~o x;+zҲJ`Bls`C#ԀRxU9΢/|xe,U9<:v0iZEgpl8Z^JE}Py5U׵s\xʱWd+xKmDfZ&'f|"^k3~y6;BWP@MF--EO|4j/*Q-F^*Cf6e_g7#Y9i9 t^Dɫم=v x8+a+;bO3m-rƒTK2~aKFyzoKf;umhi ]!$McS|rs*epyEhH+-A^e\L*XMP3b.P&[RY̻]Y9L:S+R`>gDdM.5r6_q~8X"<'m 5NWu #\ )TM{PdMBϢ4*|. iҷ]P[ JDY6A&0gu&@굈zPXґt J:+#]#9s~9lAb5)\ɓ,va(lX$l&<2ȫ>BP˜.E>OhbH|z4 epH;^;9J}mGu Yl2i{@dPVP+_ix *r;gW"3+M#f=(C ݋;V'aZ0)L4F^f)pZZwv« 7U'F we-r-*AjYqNeDiA^lV`vfVG8O]iF^SZ~zdӲ y%&s=5|t<$Us[LpJqMWnØBpSm +^67jL%e)W[VbR^}+--_]=|>Pll %ESks.RLIVWkH)at aplv|xZNTXIv 4Wvh6I.pwB!ĵ ͢|}\1 s8yEz1ӥ4e1-|}xf}l:D3H+@)5 Fj 3_a)ѐ Nr1%v~ чW􅁒iไB=""i^ii ] E?)5j!iy]TbyZTƟЄ#NJ%`s'l%=&qXH. *|&+ = " f#݌yuyFn6Tsy'k!UO#*D"Bw%ۚW@ؑuLVs^uȍf\MN26U(=ā~ ;[ hgFٟ }yN3߉eز`(58 #r@=ňͫU'ε>bc?\շf:Ts@r=VJ(zi[^-xpקY #Mr:#"xLDm sTGp_'i:Y0 ]fu%y|8M%por-FۋA=@{<zhٲj~hbF8Oiv>7sOuIqjÌƍ;:eƯ4vԇ Sѓ, |ibu=CDO,{js#|YyM9m8:1ʰy/$KdQq+USY+?(7O_FW#7u̥3!!Íמ,.Wָ%]?9~??}yϪwZ?tQʶU˶[>{B}ne]G^;?`:2*п2+c@ o5} 7)Xx=ɫXm6+F-NZw4敩aMXr\AlҼ HW\/>OjXf?KYO6լ57RWh_Vx>𙖵[t6|z780mն^l>.Aia$yA3_º]1#_mnr^k5WjoR݆q0a=Jˋvjyu:d&u~mMƫϻ[k"h?;|p7=ZjYە* #qzgξbuM6[\J>uiB6ώ[ɾˬ̯G'/zet7פ N7Tژ=iZHXe~CHf6ol,J|}r7ɓrءt_h&uQFn6(?;{uc̑RQ^\sZ9U_65м@z| 3~)J5v*cifTo[N߻~9+Ҽ|^gG:~Vɾѿ7OoSiez._o(4IW:F;[y`6Vbgzt wNj11r a,'?BU^!Gc'L4;tB^瀠 p8I-bcBA#9.&Hz?/-Ãcz4%bbZƌ*Яͻ~P cSy JE("}qhU`Nll-yP^-#yNL تHH9јOxAD3U| RJ6n.Ϋ# e q}?}V)2 J(Il6;PZx5QapCdZe 叇UQWثo!uWOmBy wHxv/-K{@"ϰ0#\VQ;;`I|*n<cT+.Jѹ4o>ƃ1 d*!{[5ӮLK+[\εLFǻ&B5I~d֍imxyrA¹h+1D\ [/x0lh?(Py;aQK~*eN~x1Sg5ȫ\,n C^EwtNp2wc"$ Xρf+ܯy]< '+n`y*Ut$ ށWE2 4Ȩ\L**x^ M_Zn!Z$L # /̯gI:LKrL@K"yURp@^|=RY<@0"Q8*L)qw@3QASH!D#pۼe%VN+?zJ\2jy@|{-%pKJM^̿I%ާB eٺ=.ִfQxd<9d|"Q-fm+!=q\ȫLaU#a2-8^*sRíefa^OZKŝwӯyUl{ڼ4 gC@^zx*+7w/)>{%0~0?k+k]nWOFF/iֶdL> ?ٖ«QWVtՄ-0S8aȔfZU޾AYXY6^W(ʅ<܋4-^Ky%gϵOUvYÌ]YyU٫7D07\1IJ ~W(cV&V̠R#dTaW-1m: - %(y%bpKf^E#4.ebLE&NW}[FeޛBy-TϨpQ%+1 8@Y~wp6"GK '7D^EB a«8ՐjOpë `Iag.6 B^=1U}f&pW_p+[yWmpW†_^VzK.:n5 +"Ļx8ނ7 ~+LX.B)Akl/?l@LnR a9*:n3VPxs>쏴m[?¡R|*y'n uډWJuL2W }i8oK]/&ַ8P^'2N4r94hm9~ %:{l X.ؼGFoϫxMXeY1p^)87txESb,CSWdڹ4^j. bɵܤ΍ +%W ԇ]NN%y Wpd? oyew&3y4ZU2QvrZ_W>bߛWe/9)t}Z^UpRg"-leVBTjlR F#W܊0'8gKNdF.v";ӒW_C6iPtwS͇WP0@2Z@m  6 3ba¿f$wQD>6(0&Z^Ѽ"9wr=FXȭ^Q 3eWyD\-;c*,Ҵ2ȇWSQQ2ZXWXSn'3* 5%L77ͲUrfZƟPlFL޶dP.2%Oc=yu@^nN}ҳ,8pd2=zw WUC[ \5o%9!ʫ*ܶ}{B2qCg60:P#YDxYj\@Poa؈mO4Zﴐ6ۚ`C$.hΨz 6fKFp=F(@4.[l_)(K1W: O.9sCaJ=;h*RzB0gT?^iwI{ёbgф6+xD1^-+Y1cL١iwX^(XQPV$ps(Y؋4Q Ҽ{@E'G5\:C }e@T1[q|{r6z+BjS=\.90e,J{|jiie] ٗa%o¦ũSKKK-S{akXQ"f6<fe7yߓ0mٲZTΠ~7׸ErChii0P^#ޖGN xeC-XKKhA5e Q'˫hR}Һuy3 ~ 6n4;/ Һty5Wr*U"iQO ëH5\-Q1ʘJx}gznnoCzS~Q%F^UpjsJa ~ѴSɏ{d/^Z-}7bgo'͏h5Xe |ZZZ6Nmh_j9Ex; ūqEC^]G&.Cae:JM/|Yv1aFb{V*+i&US3l^zKXiҬTքR*󹼴R~#=:MWD}(iRGC,#ddm敖V&_WgW^^L9"*+c 9R<9#XqGxʫ7 eHȖrꞫ畁ןW'9P5209)[0뎼JiH Pk!o^1sxME~y#ڿd{b 2.;jv Ax'G^]) N~[Cn9"G'N>D+khN5 NEPaG޸r)Ȍu\r޸%@ߙn7E}Gi}#$z9rCV#?1̃e04hq6?Dz5ݸT&tF'n' @y;ҌC ̠midTf'ŝJw\#ikosi^i0ySa$vߢbΉ~%-º}gY/űQVN56Koبp(ʝؖi0;,V%M5=d(*LK.VϾǜQe/+u .{|8.*x=#bs@hfk;jŀ|h[1/i K1Sf-?lku8*dѺHT6]ӾV2zc@L3EeaDƫEi+cqCٸ؝Lf棍UʌcrEC 7W&dUWs\yZZZ7TNJ{?Q䑿 . <&ʫ)j!ճi 96WT$5†w@mμ:U *“tiB)oLPt) ʫCU=2XBnx5O/2DjF/mGD^-*=%$xeфƌ%!!!C?Bwցb'HTr:9,TjqҗЏ 4%S(䂞۰ŒWGMXKK?`>ByrtJ (Uن4b>D%G< fi[6"\DήhnI- q#%!+@${[+ *zgʫd=J?\KKʁWPt8|4/8x4 x-~…{Y\ E<`q'U ^a(*o@MZ-/f+ć/([]֜ZZZx5,&O/V<}$$$Y- DR2dڍS 'E,ǁp_N} BO-vRץ8(o;oUI.q%9mҺqr╰+" e/B\ȫ6Q!1pV| D'TV{^a֤0itð<ܩF򾠬 E$WV1KWKK뿑!J>df_xLutqD*6 @fa<=rg|AbE P3-oIҺrUNQPڐǴGӮuy%I{. =C ^N Ɗhz=pP^ӆ?I?%Wod&^orA}jjii(9Jd7 ^5euv«pJ'ã&xk丏UJ̪Yl]z RKKʏ?U yL+6iS /AW_'#IT0=.lNR?7pi172tA(n憖 !8ʁWJ˻xE6v JZd6 > jZZZ7YZ@ +^#xEa4՛8ŹjJ'z 켽O^!OI4#x~b+)Wd5֍Wx^(~0-ŁW=AT+^ gtIaL`Lv @ 1G9 ":ȭrm0TKK+JH-vƫәx t o@"a 3M@/ɈaQKKSxeŋ=mxfC.4^ӉWB*98HS^j-`᪅Uh[q4ûVhMw@1s4~O^[i݁]ջ)>N3>Б"n΁W|zL@\MiC S|`46DV9/^ ^%6ˉdݝk){GlwPgʥ?Npn6/у(]/=*W/Vx&4Xڴ/i=?7^x/C0!7<= Pt~ Ac1e!&`_ǃA>x[ǃɚ!Ű Tx$ 7Z2ˤBfKxN«S֩!!?^kz䉓}pЃY_;U0aU?lӷ8+.qס2ƫ}P^ ZdDloī?MUj+xN lt U(?̶8ou|j>. *Aa /l4F2A4?k`B^`a,ڶe)r/Kñ8Gkg͵wAo*u ^E͋Do!t.(K@x|,\,Fx5eˇ3x!{^ U~2+4qj6{a{䣌jQ˖--!I^ گ{xS3RyHto>LJ~n.iD\/.y2eKD3ώ|c_P#`^ Eƞ1lK^P_69ct}j<~% ^@pS+U[ QyG2tAWw꟡Hy69ap3xuuJ޺>A?mJN.YOYw\9%[.O0k؉U@"ӋFv2~onf㕱V~ud$^iiȯxy?}U1exͼJ_W7BWZZ'qwp>*@q׼>ҼҒ:45f4n4njݹ7Z--&Ņqd-]\l{w>"TLW̆WB=mwUz?x*o* OXH򯑞Z;qV /*`У lyzf+u@~Y vNvXᎬJ6ZZFpL LO9|la'x-@zL`Q\ڇWI@v(TFݗWG ?Q ?ɢp#PG5Y`˷]`lN]|Avl­ǣYf@%WȎW"ʔgny'2, (?MpRmջ`oDzMybKrl5[^xxUϳ K 9t$I^r|+y@3 '^D}3ɫu]R%:+/xy *^%}̫*+G'V)WNEqH F_*WmٖVfq.*0KEySs`d* 8 _78W GӱAYxJN4L%^P^ Wye~Px^S%0e+Ly^`fǫ09^ #e@͑ Uz2=O J0sx0ʫn9 w,ڍ4Q>3C`]z~+/Eϋe{IQCNH/WQ)+P$L;bw]6xURTrmVœ-h 'V/q \#!i(v9v[%: : -qYFqoA^g0 UmۣW^=.` y%iZ3w͐_B)տ6_n*ZY|~c?(y5t8*3JڎdF^1zɏ.%BtxY3|lu2gsK,!K^5!o1%3YzX [GahieZC:[+\4(|i^ <7[l0' Y%H^Ņ'+y&Rtᔛ^ Wu|p5 BMZσ6+*e?\J pNU6ȫg2bY8WV+W$`btxEIdU1P%"5, K(\VU=V۞WIp83iʉWdB#T {rb%J?-?xEUkǨ+)L.4%fZ5/kʫ7\ P_tq Xl[kp΋{KL+bU-O:mGccwB#Se-7ӂ.ײ%{[(q>#"vm򪴺:,yڋ^x5i #y7XVClx/aLIy0^ߥꭡXC>֠|b \.α!|3*Ǯp1U,`wCջ9F,Zy +-̝kCd^ B:xu2 ؠO+Xdw߹)WU[uAkƫTqifVq0ƋH^' Vw-@@o YV5^i\^^ G`aL5'՟-[uTɓd^͙<-ūw.rUxu8@쉂|uh2boL}@Icx1zxsIx/«c Kqμ Kh/V^ KtE krttVxEils?rV7ϜxK|~J'ڵkWvnEp/yoYQ>yE4~Iѡld.3gg+CHmw_j9M=99#bɃm7/33d6EDl~y3 "HWG03u:V7ۋH8FYVɴ"[Q/~PC2VvG.^ Y!+?9k2J_ۙW'7.}i2%VzW>pʦn7s9vKvv ,):oGqhZAL%h)vE'.4hjoCΏV^aEԝ,::o|S~?7?lXko}͑>l{윙?fx423hL(ռMuilYXVnڥjRʢ|qT.s{Ha5x%Ͷq_fW]0v|~he%3F!%3HAbRƏh! c ZC ~HF)L/^- ˗XcUuP/Sȴ<^5sFe)KͯfͫU%?庽=e(ˋJ7< VLWW:W9ٸNX˫oʫ ?4et(*$^}Ưd5*«C(RC=>upp2,WI)3!U7w&9:d~uy1sylS"ԏK4nSSn U쪴lī-d?KYU&&&% 1?EƫsUk*Z -|sk $}YcxLHH4+laGwW~, Wgb%$EDZh-)oFWp,BH|bڥ*>I~ rb"Ƥ[%ː?n+tQV;`=Lf f"!kQt5nOajfF$@A} yhW7ΫKd;a އL=Aɲ- xgR-c?l8S]G_0 (vjҹ{sE do)AW^L#Ac*D +eU7AfsUk*W%W˕7+/KFB)%/aſryB4nO ͞x:דXej8:seL O>Hx#W ]ZxS~LynAšf*Hg+ⱷd~F $7pv@%% `὆3EV05C ȑW|9ݎW"# 74|<^C W~1vweϫ¤(~){j!x%0.IȮ|1#W}K`b3dbLzWux&]C9y2 Pap!s;]  1y[M^{ yCe'8Bnb'h#K[ދߡ§>M^$5dE -Wƅȯw]c޼A[4ltna:!&]l%8iLr4xYŗ)«25^ItPfX#䕏d3RT 9<敖~p+lIW9ϳ ᮖ+7樃c^ ˀWH9kā%Wاu%EkQ+ _Q !pոKiQ4JF+.n}Z{3ռr.e8|OxUUz"g$mojX@ ou^Ȝjngw"V) Ăf(`rl'%㤯Vnah 0w0Y0yr+--o^}ާbД~1UuA >.K e!޼Rl$d}i+E?Q+?W>蚆` Vڑf4+/.ѐ0?.Z("U-:y䏃%(rBT΂pC[[cͫY{N ^+W U)Ӫf_.+J^!t ta#؛ŗx%K^~|m/e85XB4 Pn))2HTGĂ9*&^ᓭ8  W4=xSK R*|ة W5x~ze+|XUCP^ƓxEכdw"yn mJˡV+BNyYP^ K>4Ec#1BZ^GB`Lb,UqA3WS@xRԼr-) g4oURV2({ 9_^K qm..A(+^Gb>ִV2dzT n(:]$t l7,߷Wh"ce2WZw_a mq_o^a8}hZ䆈q3VsI9D@xEײ*:]X~*EXbYآ`[tP|WK,DAJKˑWhfىWiW|x3I:Cy.*2qМ4; ^J; ohˮիzdbsWNNv)~yu,W#]4--~O--Gd).|xEȽf.SZ CB7ϫ#ʘq* dDKWt نY,+c1aEâ<Gr,4^_" <`FDAvWkiՙ估|+53]ur;m\{bRYQn.y< OYo4"S ir+PP3#?)9%/׫.Y &Aka *JS `24[Ϯ|FCpS6!.|/=r̒Qt2 f')$N#Tjpے&%?N%H.U;2W܎s.d u>x4LV-x5^1rh cMòjdLGHV\ܦsA0h'9Be8W놸Jfg$ 6'KʹdbXb2Ey+x9U"Gø"@Z[Wk: .@EW#H g^i\UBԗYϟ4q'j욖ST=x~[[-[T#шrQEi!Tl9l_^1&7Nv=;ݭ)Jܽ-TtPPt%'(4RbI<>pyRPLzhc-.ery<%x8;XauO:g1`ZEʹ:ғ@g@Z\/]:5 Da7Q{$ (y%8ݻfF舉ލcn~aO NoYls ;Vjm,Y;O_ f3ky1nlZrD{#xgJZ?jWrԘ*o5heJ]O^i]-pZnIKKJ*U>7kw]KK*xV]&к#jXf?'j}57RWh_Vxœ]L- eFUaW=4oqxdm6}]NHx}go(º]1#_mZj{IݎCw%vZTˋvju:d&u~ٱA6x+t*,🩝ɏF$?H#WHk$@Cv;QJL+㫩=79i_מ)m'}9@ZV7o|!ϟ}x2?j41ow.ƵEX6EMe_ycc V`kf/?l4mNj0?ktHVR)ώlߙ#7&~k*b{7U&J!hwYґW[$=0:Y]?\MʅbbZƌ*Ż~P :k7yB RV@(#7Z}oˆ`zcP6fԋ)GV411 N 0gcb0k7OCGXNu|C[4Zcx}11y9vQW&W]V֏yj;N ceJiN:` }n_3t" *Rq_UxQc6+ToOEݕS2GۅP|&pz4*]0R2^Kx=xP"YWHZJN<.S|e#u]):JW2yYEu@isF[U>2uKE"w4_8C9_B5%z5,Oc__;Kc;~WG+Q0`OT W䧒iH9>ZιȡW\죯?a y}ґW8܍~L8BsīJ9,B *´m/GAr:AfDϱ\7R3fs+פ.2fNHxl(2FJ1WwBIj # IZ´ڹ!@xu9w|2W,G&ѫ&W!ۂ.OAq&N+y^a 3Յ.]N"LX,0w݁Q]]:^D !t+R4DEPPRl BPA*EJiBr͛w{Kffggg7_޼y%u!+eKdՏ {3W2M0zMY=-*K}SG__ $ek|<Boy-Xm WrrA#UA Z%~.W٨SA%q)h~ Ukiy1O _ <O8/xŒx Z)֥"b=Ěԇ@RSZ61x9) + -U\FeZ--K,Ɖ& MGZ[fmd|ګxA*/1|Ǘ@7k!G>ĴKٕ;~ W+F(g_y &E.znh R9}XJ%h1E~6KG҆?_ŪE[8NNk*N3cfJp/fH+4c*"ѐdj㇯؎/!_틼YCp po f)<1bK/&d=pCPrG" J}N šk`ySOoTGb䕺 O.h]ЇXrXA+YYeup(- 2WH=Ў`Z?|ucD2|UigbW8ۼC 59+ǧpj%:4 Ϸ(|UlaP}f!*&:U2޽IuCk,<|Ւ*YM-{"_iY?1A ?3|ep3b .';vp|C)w cLT 9(ۉg[ Qe q|Wձ+[4ӧ29]㙡%Wzp(vu.[U}l,+l_`(kز._͟D~Mr B}O|쳮 DOq"ݎ71K\vOjp0K:*¯=יl SW4TCgPo ^l?| /QVSNjJQ) şϏ!>_W؊enRTEr Aj/"N曇 Ƨ3nsaرՎ{Bwf?7s|0vl+Wj?F TStA?)yMc~pZk?h ˙+79X~5?frw [E]|"O֥y+\GFtE٠(bqd cJ7dERt ZIK>@6(e ה,!T ;A[od:Kd79#XO;ީ`*r=N,Ғ<~c>SZGff(4r7]2 wZ~JNe!wL);2skSG\nTuWw'[}[p |vSd?TJolhZL$boxk%_}vcn7#cSࢻI+GIM6xn7Fxnv3 5Aui;Ǻ y7kI~w6gu!=, HY .i|5Nh2zi (I!;R@}uϹݨzvH+%] bypZX\|BS@aW-vA@se6d`EDg4$Bd=a;&箿U#LREo05dL0a=gCe4VcI}OtA0LۜE(3 E!ܹhBM'O?]va뀘\Y1n`S%B@Q3xQ1Jtj<*Mb̲ $JQ87mPW݄Sx3\r.uHثyx/eh~"s~P$yݯ?|A ^~2|e63: x-ΕuNC|0~H79(]ZKC&ԶkCWN5}cɛ.xko/t?8>1`)v$x)aǼ4嶿5>|ux[`qG |3~_zʱoyH҅wx7n X#Vh7zz'`c>*k{Z$RgIKSk;q7oQOS" r $c]WXSbDk+<ն!^> JWkrcBf5V"Q17 i+`d߾ M[둯<0^|5@|`+<|u5yyrE馶 پ嫟D>LWs趤9'>_)fzmLoiUdWis+ơmփ5ANmm|A2]'|7 \6|L4|uh}WdԔN޹4G Ճj?ɲ\[!Z\xU&Cqk|w;㫔LľpcglY˃|uRH.]縳o .Wӈr=`E8P:Nՙ&%MA }gU/C~̪h+QJrT,@WYP#,N';>_YW74fp_۸x1Fx;g!T[ _5OxQU*b44"Ӗ8ڲWof';{~nФ RV̿|HW 4!Bu+&?RD3P` mնazN2ˑlNP)Rt0?G68b4~Ս ;vXv嚟 YFDs=+D1jNF*Jv WA|h2<9"s`kCo|Yyf T|%۔2 TL+B+ը",1OY[.͂ՈJ6 _H[3@kOz<~,K~ OWNhf9D#;3^^4 G/Od櫢\0IٱT)dU9A?rB6QW(&:Feld~Nn8iW›?yS94w}z7>z! '0Z=P0FY|[晓n_=zv.խ7_UЗ]$r d6IfjA,WAw'**WxXu"k%J5a?od'KeW6ji+[܌\1ng?C3mZ;p|w+fEq;iQ_Ѡ )WppxꔆVI6*A]x՛lhEuLwJtZxZο_f:gEWMvVkd jAl,+N{+P7_i,UJ~ S"4+Lri{oMD rpW+I)J YjJ" _ `$Wze%53 -$O%+T$ŠJQ|[X5f~ml^:vxI_xHӎ+Bʋnkc\)W |5Alhi񕅞8+UuҌ*.ʩ+r-VuYQf9L"P{W K܃3_HZ۩%P5os2bZ~UYݣ;& WKH)jWor3R\Dd"ܔg 2f+gB 6|ip"HU WxΦ}C݋V2Vt|u;l911Ԗ`jdd$UWS::HP* #hj.=h4<{W |uyTp0 , CZߓN@z4)8 K9 罛ղS -!G 7hW@"HC>3000: 94JWC$0C?%ZIv"rQdK|x^QC.+)U%K 5FTF"++KEW#(JHIHј *~;nOM$8^n ZqLi25Jè62Z;ļ/?)t6lZY*ҹn=쨳٨{^#`Z_|A& TJJ>|EOQ:KCe@ωW  */5nV0|Eam+|u_o ˉ WEK4z|D;<|gf0P ұ/a#he%ԾlN=sU3TˈxӞx "OҁF!<w+@ 򟦙GiM)s|X,5Ycs*-2 zۊ)GrkҼHw;{ؚ!lswǣ84*>c.޴3%61D@g]mX)_V.GuڧLE^-L٘qf9xfAؚ*'11sR$n8_`:fSL'U.\SdG?ϫc*&B# ?ݥ>ƅ[!ULl BR~άY Zj?HhV 4 QM1@sN.}ch}&k#eesGh_}-2IOwbP^nz |x\Wlc8_Q sOq̽SeCnAMJۺ+Σ7u=ڿ<횷[sO8$bw+&t|ek'~PKn[kY1y͔nC O5#co5ak)̟9˝f\?EG|ȼ(c;1 !e`ᫌ?,?x%= W.XIpZh!]9ɧ5工?Bˎ[.ꠑ=}9O}#p1-S 4K DrN`7ŵIv%&D?PHqTXfj7&e׹oӇNt~h|pg \2m?deMJais+b&+a.toBhsk6oK.诚'?[Lǒ]vvFKe5W ܄Qw#k|uXrbc;03-|K^}ǐ_lh E:af,͵.'+ɚ2n/&P?@6O*Qet/ H+V0p~欬DKRݩmej/$a&;W%E!i9㜁11y[GZ^lm{A⃚j >@@Q%Rb8;5ei3_s]V\2t7([c DU%{0Q_F34D̮K _\o ‚We 2r'wgg@j/*SL[d!g EhjnqHpJ݂lә0ϋdp[/րJ[WCN|S1w?,;>{Kr [Ɗiإxi0MKuoYL65|eqx췇`f=뻸Nml]8q(^NO.;Sҫ*;{>@=dz)Y)v p+"egdO/Jr+{gw`K?BMbVQoU>R_-Q0i glLWYK0+}JoJ}=#U:6WdtJut+WvK< ~$:H!M$S1t Yb`ztjfQ?Do8UsY!1CR`YCAW QG0`_&ztAVy L WrjZ i8{ /6 V6W}׏ՋWz nyPSOfI,xzͩ8$_E>'lsJ RQnA5!0Wo>~ WYʴ:+)+T+(.CH/Du|kW7@+,j $w; TIScڿ1| ,V C~WXקD%$fn uʵ2*|u,;?džC|5_a-V)'eEF٬6y}cQŠp"` ;Z1lq MgQ5}9Wy3>ԡAy2Wl[` >V=gE졂C| -{"5 jz瀍dj̋wV KӧT+Z@JF _diIu)>R[™pg7 NӰ!ő"mM2:&TŸ;,_u'b]!rB w_%`l; WY&+gPV&THI|) Ңy1_Г c=diՔYk^l,ys%8O&(olЁ[Yez5*Wf/ eXji.x,1. _da&z˫?'s$dB"*Mm{W!\g:&\L$f,?KL5u~"$uljK0 6 eʬ#!TH t]?n"|vFۍbvbNz9TUooKQ`>aY{yCǗeIO=  5>Шt@ ^(On^c֏\ nn >7 4͍12t\U|Z97@x.p7F_9A2000Ȃ Ӎ_yh5000k'g````````````````````````````````````````````````pU4E`hlk3=fzG}hÞ-~  $:o9ɦ /=ыR'79׈fmcmֻPC0a4Z.Ϲ~/AVvu&fĸ01j b^/7'l5iUՄj:_t%omAoLhZ_=11^</pU >&:N'KZ,&^;+l||/=9{׊1r,}!11ȐsG:^hALߩ`rW7'^h3,o/Vmʖ%Y.{@Z'r+:_uVKw{~A+>h&5ljK.Wk㎮<ݠSuWe`i\]f'r-V^zo%20q0 &dmwӀNb#55\t Ƒ^O竏Iyqa_(lWy1=_TY 4GZInwz #D"0 'BopD~(Q͇xpI 房n_Jh\ _|D [1O*Hr_<7wo7yR$|uOsKVW=aK} :zN|KV 6d%$1WR}#Le9OS|n'H5車x9U2R)|,؞obhQW*Bj0ZՈR fN‰Ww~mhu GtFӏD n,_{b&#CG@3Ex48~>25}{jLe{|;8U$_e```y^S|QP롃嫝 'bWtO+>/_Yopy -T+2ڿC` R}@~7=_qXN8\W簿&^i+z~+}cя!Kz|E_氿gKWa`psc?xQZ9))<\|B::3oGZޡ?U7庤0a+螐_=FZQݞ|E_IfG|aN>zY,{*B%us"cuhWqtH{ѿ3_Ybt _ ˤ,_ m(M +%I\ }b)MۋV"v+bWhdN[?1. 4g)M'zsҡ{+*BkiaYU_ .I$嫵Z뱱-a:Od7CYʔw_qj CtQD:P~7 KY! j|ԕxW䠅Ӗ{v(LZyrI g4g^(= ,`E5[´CHK—)&8L"7$ba46jڶB4HرcKd"Pe;A"' .A^MǩWKB)*ݡNYrm|!)į@] @_V4fҗcx%ajKl[8Ao/=ck,_mph3l)׮_:qK1&Yq;MϚ㧭+RE=.֟ӲjvJA s:$I4y,$EqB[Tzyϋ֮6R#=>}GV_|QIdF.䫳qf&FKrTթD_W:R务C9mx'BDpLձXBNzSlWjz;;?=B֎@{-[N`_"6wȭ@*J Uoni5A |>UJE4wVs DH_kx =)*_3Dl,HB_?{)vڻ&?dX\~Fr+=A1;̫~%_S̽x*G rWpozboѽQ WLJE K2~"e6,Q"4"őʃNisƅW VM gA&_8~]0Jrwkpyڷ'-Z9_Ѵ2Qu<`+C ce烸F 34ICWET!3OF)W]䫼70`j%$[7 H̆P~bkt#^|Z* bI|op"+"8GL%2Y IŶ:L:D&ot'\y9*"ՕSHϺ1Rd LtB?BV](=%T ۽A*hez+t~v#.bAjY c@} ߼o6 zdz$+)HR `C{l 2!3Pj Kp$|Uu) \VNQYdjUda8ik9J+6Z".ɹ<0)wQ|>+ `ہҴq\g|h_hH~} %C^{ʐ柯ƀ/x /EJizi|5*ޘb%*8qR30{?D+v#|:(f}+Z𤠼t =btNդTķM~=IEM,$ΌNgvL <ѤE9<`<_aHSDs @C }p! J`0h'qt,MZSUJ(J Ҽ_]NQ&M z P:+t&먒|T27mԉX|P~GL('HjOeܛ0[Jҁfߎ|i ~%0wŸIrgM b+ { տ~nBlr8;@Q|IǗꣳP(WLj85mRMp<39VieֽCg=Wn`mAKbe|Q}țKSLO n(뱷P,M+LA30E;&y|{x|i+rMa:_@ tW[FSx'hPq* Pr DE.|E~v36@N]~=޷MsN2{stak||j5=O*-1ctF$nNބxG\"t հ >0^Hi͎<&>A)oe]hX2KDq(R@1xCM:U3o2ke|<B,1L ;bxt4>9ꃊ@9Z LE%&f}wZ#H(_A]t5dgp 1q+T*~Dk/1㛆z1r.Z*<-a)a'bƶ[W'&xT5e]h e]PmkՌ47`rj45LjH|HeI]my#_Bb'O}AvyѽNvU>m[0 tVO ?)oƄP~dKߡ-ЖIa˽1L;ch\0V4|5ہTM#qxMP|#M*cy5#oS7`PIARk,gWP᭔Tέ9V3ad [z[n8}BvU$UwzgV2EBz6c𻿳 _S_>wAN OKW_fvQ)?]߯ө}dGſ[pb*o6OkؖS[_w _o|e힚5Ϯ N'D}ٵƕ䫛np{E!`g _1som浝e?ՍZyXpNiJePjXM=_#wmvgG>w|j@ǺھCV'j7o (&lc}vb[?"`ȯB[rqYKȇ׮ >;{;;w{unTWXvZtlw϶n*:3>XYtOxɝm{4竤׽lS̵IʦikSxs uCo1m[C7_{R==b 6rQړv*1ǪҔ[._o 륎e[ŝUSԔ7vchjYXgiuq8M~{Y[˰Reh0>cf$||b FɻXuRCM!F(?oȍ*T<*nu5WrwWfB79Ր{ ֐J~"m(<#=^sz 1X}exqx~њEEi<-IUH{W l9^]{( Dg;_afSPFMI)6, inPZr_WWo~3rUb^L[JҤ<6Wdߒ]VzݵtTQ`|iAv>xNꅄ9ErPAWhM]ڬ$픷H֕Ҏ Lv܊ ֥EAe5/&VY"dz> M r{qA<ٔ4*|lVcp&_*7fb!ǵ̀eD9Qf'.xB竍 Crre} ֆ$!VgKɞLn'+{#_ g|e5ASeYq1:x_}j- 5￱2UQ~NX,+9Wkw(F&]t B`OkHQyC Ei* JrbZ-P1]S RXڷT W=ԅj!_ٛ+T4u]e (?;ʮL/W'5L7F~lj|w|?J+?}Gڥ|%"Ye$ol*R5wՕ|רS^2%v `gt_A0EQcP]]|%mZ} vh0r}ۯ|%>;PƷgW1V:u'ˋ|jyN9PzaaWb Z_|l}H%%_b~+{uNsM0^`l~>_3]GQ+W^&?V 005+ʴ/{1uhH`nn7NǧpKRO uP)~t**gg&3W{pFx@U*ޤ5VV ЌoBkE{0|lJ;Y#K>/R9zǞPI]UO(#ewU}E Pdí R<b& D3_if`%B2~r$!" _Hܫ)J,6?IۅZ<:u=ne#_PZ)ږ3WjW*f,jʻbY1DQNW[lX0|gԸ=vɅJ.Y }QB.e ug2+C6DN,7A_'ӉWhVTu., c|Ci'jy3Wc-UMm %TM>MWcI[( (cq_zLY_ED _ZoKػp[|dwurfj _?؅ƾ4aWNڅrlBN 2*=ߟ ײ K:%2s&0|=mmP|C~2 YPVl.۳S~#WI9IiUzbi4懯BR )=[L:|;7|~?nYǎWƎ[ȑ3KմcBhρT5PgF".>0,w Qё,梟uMWW˺XW*Rv u\_Dld'LkŻ?;YZ:_"*oF# x2d(B"^F櫳wzE}<]g5\׸u)?ZFq_Fv&¬АZ{@MRQh.*Y _t}MiIac>SZGf>n[̛.;-?a%'v22BXx"o 78ih anPb%GznMrjp;kۍnd:vF5-UK@@.Zt{E~ZW߻ݸv3Z1kܤ>&]tEe%=H2qAK H2-eۍґt)<S7#.nzBnwe0Zgɢu+%m* _:)ԝuqunU<=54jd2P݀-hlvcޢ\zh I {a$ȃcyB (͓Cq<zrOkN( J'QC|Q%LoCًCs=Є6x|^b ӷĚQ(I'd>r$:QT  ?9Ҙ>,񉶢섲E\tnF<ŕ'`|@(BE]7v W:lum/Q!伭"7fZ9}IWH=r:wkQ>[T ) wiە=f.SUWt5>ۅbrAdŸ'l* xݏrQۮWkWFod'""mu)<)>zOI~n9j:%H֩D)"^]![NVez\?rM_lV[q0|e˗/sksom"+[eTf=n,_x2ԛ"MO^^XR}gpBY k=gȶ7z>O0fNRpcxչF̺._I;|t7ejW||'COہ)_޽׿)|WʱZ'!u16@k7XyPż%Ocr{DڬguW^br>)=ZQT7im#,6Iؿ]d֬"GYԠ{YZkwWC?N:7NVGs-jsmyLL׉o!pduAB6-@a"p`QLE[UpA|a(n|'j ϔBj;d/ WTz郩/ckQL3W{KOCAΥ 2~S<dw-'y4rB~1b1FǯH7N MJrK:_]Dj+?)_E~HmWm|EdYDP*JUhK1pa 낦<ӌPU"I|u'D P~twW'SlY@AAE |"#XbÚ8E{zdϐFB h[x=`x̵}ʲ.XE#'"/;(7a`la5 | 5e Ҽ#Pa=UKR/^TN3ȝ4R7t0')jCX) w 4Ǩj 0fN.d9.&r(%UJ84B9j1##_M'r*$̿{R-51׸૪ZvD-1ӥ L?c|q֙ 0R)3EݷAF25I/7W j,p*g@Rv^}R"sS#_} 梁D̞ 8el|&604zօy B!vڀH> uhIi da))eG W҃bXN9ְ8x&L/x-2ʥ uSҚKA77G:9, 2gGk|uwu?՘qwI$v%@#]-kxQs@4@ղϣp27>vJ|<7RޭP->>ru|<*?E9LGܲm ! 3oUx Oc2RQf [_[k*G"%=/@Gh[IE w'aĵŷ(Uм,@e|og}J{8I 0K`kYƾM z>gL;5BIEx~ W‘ 7@mbY1 G-\+(rl降ߴ۹|^Dh{^uJ:ç hdUgdB %,_eI200|200|20fؘ 2B<][\|uDz.Nִv\\j@zNɷ&$܋jzpʀGmihmJHh J.)KkSnVHo˺i?oHc~$54i#s=R:&<4o{s'W8޻l``pphNj"sKO%x?kKJ Kԉ;u]rxޯecgCg".W/H+#)=yv-JOVUwviysscgϜ{sWj޽vp95 Ƹs6ww=]+v?SD@CnEE32pYyp R S*+%R]YW2rֶpX'r_Ȣie3|}LȺ}}ͫjYӶvWSQ]jK*.w9st^U[m__ Jm[RTɄ[=T0;|FftȮyLzfמ#ߝ+Y3?kݼ5,P?ԣ6&f]#Y'$TΫԛz0~ U+f|_4dݜ'oʯdWgKu!lg Gn͔_V[u\07V8"S*X @W.DJ,jI^5`./-u=-6+7TDGyO'tm"*uwO[¶U·ܰ2w*y)4/Xޜ9ux5zV\k嶏4/zH-T +ؕV^碍Ez6k3(5L:ں9sKuִ~ʫ=UmY; PG^\sW4V1NeV&|i_}u^3twLS'\Yi) !$>)נoᢔNWKղhP'^|bg5:j~櫦Ά@OϐVUxnT)|Cv3O&ڼ*-G?φd^-L^tYi͑Y:J^9NMқLS~!-O}$;&D4h+|VenT6Qv9h @HR$w/ɫ;d@]7ۛfJ^|kͼiS5+Pٵh}LSjT5hgD9/:Uo Z2jtQ,@]%k#~f2S_@$Jjn϶Ş$; |3}N^UV|ɨo–2ikw(y}TZnuwr+ڼnb7(wr !W;S))+Lx|J?hsv^+]9h8ʫc}@օ8?p0+Q;1敔 t̴ ɱ^vӻ'K2.WGg[x SN^D?#,RT+dVihzyyY㳑i/}zo Gn _޽t R2K͝{n~d^SU+X?ji+ɥk.\>a{H:hxɼNiWjsm9y%gM)Tjɼj'3zU'u3զ m.rE%>m;tsBh ɼzH GMZN9y%s <)Uy%_r[y5R9̬pDꟺu֮5'œ*w+h ɼvʹN9yY9|=LŒn\Z; `3/yLMNA["agr|S *+_N}u2F|&o{G9yU#_h+TRM9pKךz":Lq^S*ҍWU-{<U1dtGC&W Zhwug9,Ui4g> ɔIߦأ̛[¢iUPrL!W5'V~dӓzk`t}n^Rb|V ,ȩdWtGO7Q Mu>hޞu@,'~س> Nn8)7Lx ^QFW_TfBT6y,)8yU2ie<敿H^ )orn,7&׼vvfV]]GaX* N.߶RU1;=xny:7X/HJ 8诊d&Y]tC26ӻLNฏK?zjrߪ[C<:qyɺ@3xyXy_[y<ϙVxz,O+mvc<,Bc[U}l-}e Jƛjyp{Ti4E%Bȣy: trd#RP )U-UrLT.(O2my>ZcCR *ݖqئxcX{EasQVsTP<(> stream x[K6ϯ9iCw $BNyA`v/Q$Uɒ,l6!0mIV}UC,> ,欇Y ۓn4yxeU Box﫸rQ'quO0l?3Yս F ̳-㠫`X^֓,<󯅂/4WK[iK%Q?Oo?=} - 6鈘e0OK'{(7䤄XI4'!XXY`FqI^I:M ~VqK8b1 TS{@UMTՎQ4* lͳW Ʒ SȐyE0y2bFSX&VW鬻msО)xڝ{\CXF(|& OɝVL dFDe/3wjeQ\2Zȡ H˘jǝ%خH"'em!÷eւK /KmI xG*X J, 5oǁ2>@lyl+ {~r"*3!+tQkKN\ȘRBveǰʔ3,Kdd"Z<*w/0yl1x

IK> IN1;~H$ \nI K[ 3`Bp' M>@@l<k%:6x%:8LIpԐ[)U:e6Tz: 8mgiEܤO[d3Y ,xXq V-o9!XȆM2VvsuԵQ" %W;I*khYx>b%xid\+/GHтTXP9! \:uw#@>_ 3S$N=6>­܄h&_w2(o9AuxNm,pϢLʷ#≯%+Lx=^J.d֤ i;JB0*-c6XFo{~?JUADsLcC4MO.,m2X 8.Aкy/~ٴxMB텚7<2PݘaՈO -Ʀ[ Gi*`JLNn;}^i{ƣZqiٲP(s⧿2LZӂeKWӃ,?;E]C^=f܂ ?PU*At*yv_)o Q.Fn/S\9%DD^>I>BFeH]k zPۊL䲟S̜&ms:f!Q0:"r)NO=wLWJDD7,FhƓƮ>ú[OkwRٖ=mSS4={1]@8/oՓuBsmI jϛKjЁG>xC|n]sNMk=Jz` SV@)~5 $vy'bɅ9C PB<-ᤂoSvQcxlNݱz_u<>qttAJ:ݗpQ®6k:vHq91; .YQ*|߶mkK.&eT\]klgPhTh5:KNYRz{9 nK2$g8jևwKs;="`-KDq;>_PѽԢ1ٮL?W$A$jx_+~rqo*L/W)bQax9J_s$#~ {%M?545tu('o8vEBlt ::ڜ)5(]E7m˾$FlOr wϋ…&(_fϮd0_CXD5:)ۖ=!,_a5KaN1C$ǭ-Fj3jMMlܷ dŧ^Vq endstream endobj 14 0 obj 2447 endobj 18 0 obj <> stream xێ于 A3օLk=rP$EKnL鹧s3:wx77*-5dvCMqwf>7s vMtwN>7syĝR?Cu?s9ɺSn݇..1f0͹H֝t>O>`ˮ8?/eW+qDZ1t>=gK^_ՙՋ睽-Ujֻ.?K7h4C[O>7%\_n۹tb ,|u=oi٦rWzpW7d(O4#ߛLҋįVah&RjيvA+x12޾nsy%0x`sFK8%B'I;Rhb+$&&3}Zzd+kXNJ^^J׽N 1T{a0x6WwU?Hb喸h_ĪGW\Dd&~C\ɤ"M*T[1/ōdVOL>7f?Ϻ7-,v:xrK\}(dc؞L6>dQӫ4t" ש:aJI woP,|]£LXDYjsz8\9 tHOH||!+ҘN~.9Z+S >/t`w"kf-Xx3f#K'(FzRڦ`& \b(M0o2.%FM< ro0F*S8LEݎ<7fxY"U̡H|rK٠:]`?O41PqmtU,ݠ4Jm}t;}FYf`ڣ f3d&ZXKb-ښN'3XzBF\IWL;E s7[m%D޿JJ{S(Rtʚ!9џ 8Bdt87/ YE!=TP $}F;^ճ EՆnO9LJ9Y=Ya]#qva"x ӈGq*իO|n&Vd:ZD mxC.~xo?;WQn[Eһhr$ζ"Lt)An)z\A+R |g`+h\Wm:tܞ\v:nSWϊUBn`Jhiӻp0Ξ#4͎)}{-M)7R޳ʊVg%-=mv:MYK+Zvlg!M8O: 7; ZҶKNx*+Zض8{ x:lۦ e..XJ!3Yq6$aCunvL!o|o ,s:7,_(%`Vbq;Ջ|KNm꺭:KL }2'k,ݠ2kwg 늙_Ml,0+8+:).U'1ojnCz+fL }2+#l.ÈoՍEp\>u딛hCK/ JJ̬h΢nG\9N c܆,--Xu8)d$=g]+"l.9sc!M|\s>kZh=c^Z"%lVzsqVg] SHz ::SKJN'm3NJgF3Yj(ɋg"qzo .ÔLn)kgv K*trJrO-ZLԒsA;'kI #mIih&K %yLVE/! i/yW64o+N*$YyEK{Oc("d-hkzjLI)fZdIO{] ea4 @/D0Ѷ00*YKa4 ,d?պhkLI)fZg*L7$ޥ|].mx2{wJAקĺ&K;JV{hԆO0FZe2Ѣj]]5Ye&ӱj3fYqr^aCuN>ƽ@ē! z77zۺDVsqVjO'qwmӷnkһ]$xjГjOYqr^aCuNB__m.rNl¢8+z ܸ;q۶[̂]]5.O)qndllEK7(+ 疞NB`Ȋ!6後a{Z+؁9Y8ۿf&u]D+u[xu:-\d;VH"l.ùdxz"羌a;Z?Z|!Iiݢhs6t&۶`WnMbtlE[DYqVaCu-=E'CJj(ZʢǗ(g/'%&p{-Lr뺈VK&b'0d4ubR.v4ZYUh]d*C <}p⊝т'vo+%NV/LT4muKwғL6j]oFLms&붯ќ%Yq&Xdh50@?\|NKW0z$^x-1Ӄ$ sM'_҂ɤ0?hsA1ty:"bC'6vO-+N饫48ࣿ?\isˊu:EK[Z.ݙ||Ce5:EM^g(3OtF5 [V\YU+qЦOɼ?z t`<\D\ZF xY$+r '66WL [VtӉ/"{zhr|'?(?[HKi/$>Ϣ۟?fc""r;<RY_=yO;x9_:poNYu:>** ua켿JUT*8UvyoAwnp{+* -x5wqB嬻 7** x57rB主 ErJ%z.bb#7pRg;&)RQdFχoO&5+6ޱ˷QC>xg#c,[\J'xׇlTcEaK$o7}{[YJh#lq)#+:UKh1, ?{asƥQ"3S$㔫Fo\J%Ot1_v~r؈78+UQd<SGq** <ёYqUb#7TE':/; ?NJlƕT2DGSeg)Wx#߸RJ浾Xd֜ϧYč6t坽.~Սiބ{Qa%6ju;W]b͍Zju-CauNEv=uWҿtses%GVoVannCF۸"u9̅ai+rWH3k.|YZhK\qZ "uue5'%ɼDw-w_Fםa"d&?^od {:6AYնB3_houfQK/J81uW2ZQ3ºWsy4D.̛ u~n[3DWe:x)lNIi!Y'-rq=?xuWdҹR -,=y4hVLLٵ$ؐE#$kJ#OIiTԷ 矛:bFC$NǏZ=++]tWi?vu>YQBKEkF 2EYЮ7]TJCRdNz2 t)Ws=q(s$'}~ ѶGú Zbusv]VXQKg9"e Uį"ݠH=ilnHYE{%z0ffNt#tKw3N ܛCJK]4pݛkຍHI2Rlnɬy3O$Rt?sldsOrH)0Ҩx-DOpnƟEu'1Ů/fZ} ,suMג=iE^D"\39#ݵ+֝8ۂ|bz_rNIx̬| Z΍Z(iǟ_э"\4vu7 -o1|g;sV??ɬ[]8ۂ|{E)>-|]'˶>H2q>f^ѷVHgCeU[̲ ,jh;svo#*IlE̚eR*ζ RdO۹867Y+b[W$Jz | s+{/bM si /fT|ݥD̬b,:I8ۂoJ]>UVo|Fbf3!׶Ռ xg͝5tQbFdֺMk̹"i\ؙatcI+s::cf[gѡLJdŦTSev.ηiY10x.ECm3:3tQbFf Wט'"i\ؓat3\Wtz)uu*΢C'ȢM˧m t׶Ռ vE ^W$`b)vXDf Ӂ9EҸ!Oci~xK؉.:I8{,ڔ |D=aw4"kjƌlf\bsr.[HFSJlNO>TL>Q{:0HVg8}+\W\zbťeR*Ξ 6.*&RVә_VW3f$`O‘%;g(颾Ōa4oSέqž)ƅNlܺ$XqC'ȢM˧m錙\\VW3f$`3*sHti۝ ɧ=R<(ƅfMº C[_t(RqY)vTY?01YQWĶ>K5Pn9ڈ`9l؝^7=ݞ@4.0q RۈV4?ʤTmAVlJ]>UVo|yWR]);AY=w6=tzڣ[J›ؙõu&nAJu1ފ'C-HSev.η o$fV>+Eyfus31rؿ;/gC/[g;sHcge9%ԺN#YsѡLJ$}Sz;ΘY" $r07= UŦhL`giں #Z}a$1#.]t]Kl }z-3u"ד芋?`V!̀ܙDeφ^$?hں #Z}a$]8ۂ|bz_r30Y"܀ס?hJΰ9$.,C=zp'әgE9[abP6"^zם^z.TVKl gS30Y"_{Z1\+ʹ+P)g v9%º #Zr-ZV; 8;$nʷPst"k`I,*Ŋ|Њ릷b4ZJ顦m(gSuEYmѢ)F#Dv?oQrWg|8;|+$'UVoqg]F]:qRHQڳV/҄X||sTD 4 "D9 LYmdڔ8͙$ɲ"EX4kS BeRt Y EHVsTV#_E \$+ KYHbod_eyˊeE>+=) DVqBikwG"Ƚ %|/x ?};w>%|U}E={xru= `/uWw< +w< +w< o^+w< o^+w< o^+w< o^(R9$n͵ ZwQsHܚk=xH87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P 2T`sT󇂌"Cܰ H87,@5>((R9$ P z(V΍!eacFTyݭaOsD$=~.X @A5GM68'CPMww?^v 6y7I q 'Zw R8qn~^uJ84PיbJ^kĹa-ٴd, f[w''/U{GqϢ޵ĹaqdCET,IAq9s{ˇt(2^Ĺazmn@^F ko|^ADܰofA ko{o_)D^~þT,գ[F{p$miNA:o2fkX#ް*6EsTx(h(xoĽ}O+4gF?!+FAG{H$7jܣ9< sYyO.Dv_-S0 EAG{%oH$U7U'=^% <uo~Ds\Z5͡ QnnH$%7uל.PQ|֜{=wr$Ȣ9c6ᕡ9nH$ 7E=Qsl em9nH$ 7y="ׄ{#o9ӚoӇܫ#o9sWCm]ǑH7IQ!~{F!.H$Z^쁄N~{F!ήH$B^ౄW[~{F ڦs$w {L!upµ3M6#So3#G.4Of~{F &r$w {Fב jfH$Ց h̦H$v5Ofs~F p$w {@ 8otlo(?8G"qGް@'f "9;}zL8oylo(dD⎼a?fީy2g0o4G"qݰOϟFj&6<ǑHy7'IS4Ofc~Fm퍞H$='f ROp$w Y 'e ^r$w Y9l͓в߆Q|x{8;}tvҨslbo(vĝw>:y8i9Rd6a:y8u࡚'id h_p$w 㤗i6/7Dλa<^,͓߆Q4}#nاO5'=Ms$r8 '`mh缤oDpÞW:5dHd6sDpÞWg;M_d6s7D^rÞWg;}y29|N G"q/a,Jry29|#ܰGVry29F=9{ {j]wO͓Q4gwϑH{nS =Gdyzg#Wݰ?ֳ͓Q4D^u\/qK_͓پQ4AD^uÞ]/q{ʏJ<=:{ {vuK7k̶6i;DvÞ]'fh;4Ľ=@% 5Of~GѴǝwh8{ {|K^۷ivOqXĽ}Cǫ^ޗhOqXĽ}Cʫ7h6nE⤣ÑHkoؗɫ>[dw('D^{þLUo'me[Fg9p$=*/|1t$U*/|<&2f>t$U6/|t$m6/|<#5f>g#87m^?]dw(\O#87/ NW'dFzz?Ĺa|}y2>q}G$Dܰj^/4Of{~7~:sy7<8&?s[H$ ?-y͓ٖ߽hs=0q$7ۼey2/wM~'Dܰy{e͓f߽h=DܰxyWlQ4+ +}}͓hyVWoCFx!'@ְ͓_Q4+<`0<L~͓پ_Q ,VC {A7x'lSد(zyPc+!O熽^َ͓_Q 𠳥hnkk5Of~EF[S[dy47lZ.͓^_Q,C COx-g-'`:-X'L9ܰ=735Of~uF[#N:ssa; of7k̶ꌢa3<f'_Q"Sur^Mdy+5^unk搇r^+Gdy+5'p-5<vr^ '_Q=Um9ܰsP< ~Smy"7]oR͓Yٯ(VT{[my"7o:͓Yٯ(VTES9qܰ 4OffX!SOqF84Vh~GHۂsa# ~ 4OfMfX$#9<6HNjy20"i`{k!↍4"j~5GN&G*ޚsȳaS8@5OfeX'!Mo (OdX+;9OC EPɬWvK%sj-;<6/ ͓YKٯ(J<[yy 7l. /BXdR<9LVC NNj<*b|S琧pîEh̚~GZ>GpîwaNdI+>S:IC N_ޅ ͓Yٯ(L$E[ f_ޅQ͓Yٯ(E[ ~a\dC?5:F֟CsîE<515:F>b) aDd={(M 987 ?^n͓YX63Th#ܰ{-E<2s;}Rv M͓Y)X9ާ!aw^ڡy2=h+v{9,7f: ?^ɬcQ,!ead"\j~=ڽ9&7-~5Ofbgb >k {/͓YYX?GϚCjrHE;'FF~u-}R[^?Q|VϲϝCpVc7Ow{=ws:ܰ^7O=z쟄G!Eaky2!TQ|\CpÖe;x7d~[Cb0<} [^;͓Uݠs~͍}R8›v'{ZAO';97l}7{7O:Ň]0 7{7ORŇ]0 vz7O74jf^ܶ1 6z7O74jf^ܶ1 ,z7O;@Anj⣓/k[WCn};j'S1caNN|vt(>=9.nYKfy2\;e4OϿ=]=ioo̧Ne%T!p>]m0͓©Q<69n8ioGVMqU!a`xGy2Y5ŝ7gTQʆ7=U|^w(SHy$v8{ԛ'aG1ԱG!acyy2V/p(TKy<8xΛ'IIT!;aOe+ySy2T,Oq(V69d7l(op7Oc*AʹfRQ<-msnVwx7O3Y*f=};|@ Ԟ!qnXx;{ދ|vu:~Oy"8;kTCܰ\1Lxsehϖ sH|?1ts-ݻ`sa/u oKF@AFwa0Ĺa`|-72 xI0Ĺa={MwBAF$pB<]w17" 2Gzq]$ T7߃. xۥj6P`dߣ^W΍pT<gE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !qnXj|PQsH?dE*0ĹaCAF !q=,}{:F !qkeֺu"C\uE*0ĭXۃ׹{Or0ۃ׹{Or0ۃ׹{Or0ۃ׹{Or0{᫻_`/u~3xgw_[}]9+(w;[Q _~/>Y%;ΪpBN?gԢ/B宸?]3+Cw[=UOpE ?\X8R+ʿyowͬ7oe6x`f͊? vd5ymAGAboɟ)zvd'0ڽ"fȥ8XKܠP %6z''0ڽ"füe9k{ hm tH<`f5р,1l&V|Kq˙3k>{vpDQfĊo~)n9Wtqxڧ{UޓU~0lX/-gB4CtfM/ۿFNi4hȊ}C5>?BJQ_c-p4B^HoAhH |"R-8Kv"xJoSZ̡3t2\3H?I6T u(ҴC E%B'C1e>mg.wkgUL'3SJ,?x$󞄯eպ'G-1C3MԘ^g?@O9\ޖVL۹GkC3V*LkӋ ^\󁞘vpO6c%@l/6=Gf>|d:'\1$%ČԒqvd"-ݿPl?ӵS"9VG# I;h JdhxKOR:?ꂫӎGV4?"&ySb'#%|dO̡s9FkUWe_u5~>3'B@өN ߿Ov YD:Wk銣mP& di2?Rc=mnDF0bVYDΟON-mr_w(L:I٦CG|豔MǹN)v?ߛ_3 zfE'J>6TOv 8ׁ&LɼĴ9y4xĆ4Îvci2,\-H>ۡ$*)g,+ns[#=W\Ju?hu\]Oz 0vB?Hu4'Z)[6TQ =3gr8O1d4`־,OVYɉ<k hݹd"_<ÆVʰEMX'CMO2e8k.ɡhE2 H9 2І^gմH' u`.\4=6 +yӢMxC}pJΣ"ϬZ:SuJ2 5\+*oء$'* pޮ1jcA&njFƅNdHV .[+>ptY2$h>*<"H';-ġNW:S[:~+jv`2Iq!C#7Ҋ&Vh`sݹޮ1jcA&nv9itf2Xg5f!^¯53B 圕LJ96Z@V {dE8QJ 1%;]\7Na:0DCkmE`3ԊZ&2kQbbqơdFU-.J'ӏ4qP2ph?-2DSr 2tވoOHfp TxlEOvZC̪Zt`. ~*hE=zd&UPMYq)NK\3ԺǦL<4;3mE3 d Y9'.du|8ϊ؊#ah:U˵K։>n=ed&V^whoku&3׮nϧ] 7ߗOP<O^?s~,:רx4;]Xxϛmb󱡪'x:ڇotZz4&nP2ۓ)5vfғ?W:p;OٻE{~>q= ҿ)s6tJAFãw^MT3C _DNbg'-tovxOn~,='{-`ɋd0|Y D9 ?Dq&~2_)5dc*m2Ŋbm_k(r%.7u'>Dn|{2^\_<|f՝UwӳbgCE} pn댳ɟϵh妓(-بȯRĹjΰ|g'MNq~}`^nEr:#;= u.\]XEa"HӅg~3N3O#y3s|NVPb'9U~ |&%ȷ'ki>sZ& PsK2e+h 2@3[vFYƖ?>4'ِgRj uFɪ󙋬-LJ>*L3xO9y,%_GؓCgCʪ3/ u`neysY%fҌI3Z;lT1LYu.Z"áZFCE*8É5Ͱ?D\%D:#gRcz?|̟vhL"=g4_w(B3-EkRrh? ]DbFVOi]Vsa{j>9P k|~((:l=:W0XK;dc+\>[9ץ Be0?'ȫKs[_j-Elzbf:7ӥ]\wi;Kz:H'++DCW5gΟtOxA.ӳn${ܯҋVOk>38WHV&#qz$o'ܯ3i*e},OOS~{~M1jϰ~ϳzl]fi_xGm?˭]iLwz]#6\1joHyv#*^yHsv )*wHsK/.Lk9RlL, Q`v^= mzo/º-p~_fl;5}|@ k"ASm}[%s(eTh6׭/Y@)%/:gƜl{ioSPr2H"%c(eTE|Pc(eTE|Pcψ8;ӻmbIPo|u}؟cڙgn_gޟU3x0o_VT;.^\ȢC}g-D L4a(%CiiI."]d.x|`.y&R8si7j&k&VYk4h8=k0R?O)=F պ QPpe*+JG]?F׽Ni.^3⌦Y:+틬l[zP) .d:ʊ߿ߢErHI 摕rE̡Ү3~2ҹf>h3Gy.)kz =|&Z]Қ/Xx푔cÑx'PQY]sJ3:v |6yv=? 5LVy[ziPu=1}3`bVә>0Ң 3~c])E4PV-m(?)u \_5CR96+${?ɉ}K)'$?3-ҹP?)}{Z*OGKO/=K[ɬY緷/u fP8묛3q7(Ul'R3E2yv6gc\Vsόvi*YE%ԓs'EZ'M 6CRpbzC?:ӓv m }F ƲTR_xk&ŕGERw1]R }5H!SWY6ykVV4AYjI*gM֝rVo(>R 0a[]ȹ 4C?J9wzW$; mfZs25ËȺsŇnt'7_cVMd6+9.ЏR|EΝabm5]zIˡwleEfZs25ËȼvJѧ"]}*0|ewU_V}*Q;4C?J9wQg;t&/ ~|"ʎn%>'^3HL`/2)>,GR #Wv~Y5GL3eW'PdFsG{"01 %DrHV'2ϪQAtk }Pj7zCa~inY~>x/FWc:˝w p~+rߖ=r#kN$_=/ 0ITdg yC_lŭvFo(>,D #ˏQ'lD7E;;eߚWKQ 0yVj2q|i*ޝh7z=Nj(D^\ ?_yww'nxmYwn䰋CkYw wriVvM;Vu0z&DY*L]xزHk]&YȋPdFs|+mū?/NmN$]!&;+2۪R#^/[wS[hZbBteى^Hz;QʶyZLMӻ!jÂƬzbgL.ӳo+t/HX)S<^e(`j3[:uSq!,hխ9|e1:}tէ*8iw9Ŏ7-l}ʞa>xFc;&E?S|unPS~wΓ/2TzOH oG/f?>H7 sHK endstream endobj 19 0 obj 25627 endobj 20 0 obj <> stream xy ǟw5{J$R!SJ)D)m?$")ҢTڑʖJHג;ٳ//29gΜ3sܹ>?x3<3ww 8CAb>i,A"wЀ%n66=̣)@gwo<}I|BﲜE%C ;-+5wv9k/(?5OX߮Dy[D4W^uxjRBCiiQTlaET--hmm݃V!N氇UΠmLz.1ei(*8W9r.۫>XVQ)r/[ggu*aV]\DL!i(*11ܾ&LrEV s߈:{>5tF!Nヨ#3(*nb"*TUYMREٴRc7Yi^Alm9en׎9T dNbh#Ǻ.I~fOE?}pq)'.$ME%}KLi0l_|\ss3S >}K8QYLoFA'}cogT}>(yߏx&CXʙviE.=ZqqŐS)$Gװ|ՕkO{[L:EbI?knoRʷtɜee1("&QIöޙIn>{:s8e[c9G}.kw16!$H盘RHS@$ݕޱ`ݯ^V( W‰Sbcc+_K]%{NqFTvf[k)5 (E\LCse1ʵ:3N 8sFT]ΗWC]q<%;-* 5]%*ZyKQ5#}x;G\7|Y_>Ikiٌ/E rYV+*ʙ,ʦj\ QI_J ~%}#*?ϬѤnq5I@od7цҥtQޒPos'P#*J1A!]iQ!.*h,rGTfsR (g45rY_?(u}~"\Dl;rJX2`̬!P=7(q uVTnAOO&K}DJI#*SHgPg^Mmgf REڷ "~AE\d _ζHuVbΗ+NQJRU.jce9$(]=HG.CQ "2oke69|u}$֗J \?\M͵􊔛މ[4_gUT3U"n9KU141eҌ )IRcʫGIPGvo]LMAE2-ISK[ˆƩ^r&i߅$m6NY F0\ cF5Ƞ+*op6CmzYzv5w)1-]v#1'IeDT՟]'*z /*Ajb5$\G+f=8O*ÒV[*APE&@}K$~6IJ:E~\CJ|ٗhDe5iU rb2;LEEG[ٺmfrJ&hVfF&iIʇwNN?htYTc^K(yd_쑵 ]qN B)$B-ۢr[Vf]‹J1^EGNg3IB4Ea CSϕ:=QQjn8$$U]<ιMXi'"BR{r6 tCrƷtET^gROdK;BE/?tg䜶TQKz?l+&Qy0=$QǡOv2KE+TTRh&RoϠșWG$'l/tޟ~ *̠1ReF$]\٫bL ܹɼ} 7.vkkƗA~wsTTSn۶M~I|ƷRmKTDZ3Er'z\HeUЁ]7M걏bΏITՒ/`yІY*"^fTi3ȷbu0Q]( >s E%k޽.f_(dbdH6Ozld:SP~rU-VDGo>,dڤNEu "G%RQfnaKThjGjҥO0Qahd*9;c)"JJw/.6בυ7E6sAxn*&K/XyQFLJAjr誈e{CEe9u0(oP ?MHgRm }{lHN&&]̞lyćiT@CE%%$:‡&CUԏG KdQQf DQ6.IR‡; *o2,"OEC=ɡ6JI0 .`_. b31V)φ"ùSWD\@bձyXȓva,Ev6oz L~Nʬ44xJDQQ wL/*C];M@A jNb0bPknVaGp}94@X 1D>!yjI"*qȮQ6rܔhhJhg䷅U oY,'[@I[E0ۚ]CFE[M=QYC&H7a7А7cnYTpE~*9m7JnyާBSnohod3mDi/j?pat}FTS@7CEeU75| CtO=2&5J+6Bka厦7**\쌨AQ& dAj6UlvƋQT,a{ o/u?w#AT`)^T8Wz@+*hF"{!rwDebHk83ŴFQߤft\TTֱͱ2uJ j$A^R'CIT&rrUoQVk$;CcNBs0>9= t^T^"dJ٢.^iɋLщ ﹦և){R#u0+V7A7|,(d rTT"u|$4]\ϟӂB6=*QZ@i\|1dQBE`ރY#oEOچlb6|O-*D)*˕O/>pŇ:!kųW~u?щN _n% E/N}ɕLA5U)CdDeNkvILQ9HGfӕY?4GFȝy?,s'*hPRc0#GhDm5`iQj:ly[amAZa\Ǫ79-M>TpJ|RDe=]ZOdQZpQU-'TP8QI3LYTP2(|BCL-Q12_j/1hKTrQ7kvz%*<ʈ2~A08'QkNº$QşPyoGY '*4{_u̢*mE %*Fu|۹i+["Шfވ@J5.ؒ}R]-ᓨ(/_MТNХ*Qa^FUTRu梲Ja\b%Hj Zɖq#%qk4|`m ͯC4#Qg kR%}XYz?{ IT3.JtQ9IWM=Pثn^k**h4ҊeE%7XIVw̖t18D)O3 {De)9QZ,=)[C~cxDzF-*k;ZbuL3\8J̢"0_Z%-Q#?Pg|ƞ !gɡG"TOBI+BOMz?qNl::9^&[ҵT]#]_۴f8!.*/4t xχ%*z< zq86EE (͚ Q\?NbN$}Ee@ECbZPک}Ef6QG?͙3rvt{x !D좢s+7[O RB[C`:) e_P[r^&ҷJT3U^ ӸdOM2;*E(U) K|dtF'鈺VjfplVRnXTv5Zedd |]T,2 HͪGm a.=nB1|֖(- cԍ1nxdhrRSNδ\cQK,*DFH\QQ{:7,vިBT_sM й92Y{s"9!KBnm pH˦k:r9'*HӰQxyxKt::Qou"޻T̈́vߒz? cQ"j`ɔP9fQɥMlKc&Gz*h%k ".̒kх) CQd:7De3Yc6)r/BThȈZl$[`~BwPY=jOTAɾz}NT+e_LMB;sJ72tRET[=(A$ڲL`QQCiS.~jHh$'/#QD+.:Ybv*N %d$qыMZ ٜBJgbYG'*Yn0J),yWӍV5RADEtf]>YTPt O̕WzW Qncr [k[k *h3.wCT1ж@d1jr=3`щJHxZ̗$e,4jQQwf>r(d#Е{0Zu(I\WՍcSq 9)QGi"ÊoxLdwxʕ)(`$}%#1Gkw~.X;OiUֈ/4:sciƀ]lNTzO@ftu4ܤ)+mOT~+%sI+W~C옴4 h"*NQ}?GbYP9{A8Q|OE% uhD>a}I0ч6y͓Q'ԗ͜ 27މgx$t"*3hJ>J0]MdW[WjL%e}s4 OUe\s$*eeryW7Zt=ڼg\nY!%?^&_|t VdM1?G>Ɖ]$D'|2_{O!p4[#WO8`l-KR/!I:YlT.#6*+hQg/Ib [)"[.0p{+%lUGH[CLxUyiQÿ%R|6 qiEe= ,?O|z(5|}{n*z[>XX]a(k`Xrۯvacs҅4Qnl :w(TiF՟" (}]]"vme䷥;bZsse]mW5{}9=ک.kT>Iݵ+V7oQ~F?#̥*QBk,7ab!xC@Q7AӔ:ɷwUVӰOG>m8I`+_3 |++A=LeG ْZW-=QQ-)swd ϡA@";ԘLS:(*º),inقvרܯ*Aez,YMt7sE JA5I='ԛ{|EJk2 Ԅh:S8K¡OH v2Xp}!S5?ݻ L*ļG"Ti̕uIzgy?6ZcՅJq{! ‡r-[]8Ɛ)_Ås6I7 !*`MX%:fy/֘T3i@7_uݝLXgٶYnCthRbVlp}8ɜo>۾ŭ]L1VPԬ~Mf;[u{qe[iy? [xWg6dzgkym] I0h\o#t01j { H8%s~ u׮g 3Z i2TF_8=PT$_ |2qf0 (*/Df0PT$_ GiqZEm|K H~{\vd%*N O+YD*rtfE^Ս tPV~{LYy';qg#,3Z$?i"#*pWltu:.;S&(*8]Wd@JڼNG΃                    (ڼb~tQU~e^Җ>b,mv+l|S'%]9"E4km \kw9xn)+}6{k6Mm@|2)y7#fJ~̨/w'*Ǧ?KuP31[i⻽ݰ8JO|%WDbkPT`}Lxm"*duɪ=%O ]~PJTs_@j\JEɞb&Nd**]rQT9W#E%*C/(*2(*ƴoL3\IomCQUC~0Y6aᱳtdwNT:gs#l"C)t7~F ~p)iD <[=RT3_m(*B >ޚI')#\'ߗV͛7&Ԇ`_ɠ_TZJo=I щi1s%\:}(*A٧ak]9'8AhPTz&XE%@POB<"b |_m (*(*@Q (*AE (*E%蠨X!QE䢯^~Dt;}}fǬOxUQ{y"*NxW!d0#w׺6ngGTr7}ƋO>#=!kΚ֭F*ԑ}})G"e9)#={w:;"*[&C>>QLx'g ϔMTNs]_"k'R'^xŜÚ #*[G.Ȏ˧/w{o+z+*O 񲜲ROܳ;V2Bڵob3|)Z)%we F~)#*RԥULVNړ79y>OVQ'Kk-Zl%%cGIъJ!- AJGwif6L+õuXJzm%szIaDhYڡroQ{On;Q޿k~些c5| .[yjjIYRPW+B}5lD.YJwR}%H,^ڼĈtU5L@T  Z%^ϮSѝ;,W}cAKh4z\[үWɑG/qN}FsE|+-&Qy~V8&$cٯg'nZ9|YXzj3 \ݱWvQ%y,*ϑF0B2LTj]>lF7ȁiK/oOY"8GE<HUT6Ki7樔Kzv&JazZrz{VU,I$?C$,v;lCTM#4^_ӅFVVBInG>>Jѯ&̤{If\X1I(1w-لGHڗohpwa*N)ҿz|4uNTY:q1 X--! 'CEӼi9*ъ06ӤJo١PHW?K\M_S|5QJ &{Mr ScɌRu?P.[$y]bKSVN,4:%D+!5_$*UO:Y_>4;2/O jqlVM-|'KJT'TսV4 CTě;Z:XL]ͤ_n Wk_gh'*QJH SI+!h-B )(Dkm"y6*2uxR!#镴K'žf}SJuNTzt!{\Sņ" c"wdj6irj+ sEG#*4w 3gl!*bKG9rXע=ӧTT /]$e)!Y$fLd˥ Ri|i$>Qs\*эmUe؜LTg141ɪ{oIR]n:KupNT s6U J2.lCTz{ŽRI&BGJM٦VL"fV%.$U3z]ETE5&F/*vw Հϲ&LRgRҮ/76UJ>S2UEKd,*ѩ2E|ܻ6iAu3V:y !SE8y$Zq8Liȭ9ET.g/(De )9WZ/Ry"ôi[-!92Pʏ9Dܫ[6ц(ogC. ⧷shBrh<Z 32Eܙ3I")vuhƍWRQhR:'6"GBz5$ NJ6 gϜ1a UEJGM>7dpAx9G 3 ԑSS8BTȨ\YCdD;I֍QӠ.JaL Y6ю,̩K6Jc˓{t2Hj撤G#LE#@u0v%ؚtNAIQ:/^T7Er9T$[Ɛ|iF nm"*ۘ.*{#ETѸ-4x䡡jy-Q9E N B D˼Cr5(rVVz}&,IT2 U렢 4ՐJs8r@et U^[SXHNc#BG-*{ ;ɖI&F&[zfʸwuQ^ 6 P'/_DW i3ԹsB_ЧD**O0孧l*]e5nVΣi)@wyK8!*E6%ެ|?:YWCIz VIT٥PQaGݣ:ih{n68lp**׳/eluQC5O/Qa;t$Y;;1*.ѵbpseEƠ`OTԱkWu*4r(_LUI%@#͟>iWITGy`ռi5jQԢBFfҫޮ4{ b(NE 뇨s7?# iTT.6Y SlJޭTs m^kP)m!*tiEeaN+p-:&[2X}&"Wz#XJCgIԀ:H&[ꎨ!*\pQN=gt093|6k465س?;h ,$t4Ԧ.*RDt+ XJ΅1:FփYe6{ E3{ϐpW(~#n$ᆨN +$pa+]e9Xx|lDnc;m ^ ck#I]tNiSYh {(h+B"@aڊ5 d**lJ^Hta=/7DFدpJTL] p~!g'*4\y#ɡʹLG_iEe^,! cL?sې qk(ƚDEqa0`Lǒ+*t{*տ.>H0?HH}'趨PtŊFEb>W]t:|C\i9)rCTr!fQQf678K1ͫ&%ۥ{rrXQCG' f~WQ[YF8-H1< $Y3t]QQrZQ2*2jl'Mݜkh*ÙRr v,Ъ ]c@xQO|YQDcfѩ,"?B.A6JwyȦNɁQ:rO秨ȻK^?feI6x ; B[K=EFwS"*Q)`E`y0ɩuJQD-<\Ќ'7F>zZ.N oE;}İEY<]ɊJ &hՓHTN^l'uV DhǸ(*JV.P}]XT6Gnݡ`짨I~3׫lgRqקҵ>K VD;CvDBJ)RAӵ;T~r󥵸EKUU[ ? /*81Aϊ q y_}^eM2&N׻X̍fˊ'ihAP:mV-~F9?^5@rz`9\X+9ly 嬪ÍC MOU+47c_$nF=jsaiB4rDliflDwUR)5X!. =y?V U%cOl1R@;.#`&B0O%R띪ެB͹4J|t@PtH:7N [.TK-jN\RW7P$}AjW$w,].-Ŗ;MBM̢iϒG&wVJ*9+(!Ct2IY_U|-g-K=C;N5E@NK\P }SZ _#ؖn>D*Pyo-^JCP"-WbrBJNx4qm9۽W83JlHm`V:W ?{[OdyT>|0y^?Q"mAT5N7-ϭЏV=˸/~VRt=Kmxcj(8JGT6 UmoltiN>_5cPKw/oß&rݵ|4:8YAQiyCvU ֖Ƃ=Q;O$DEAh`ԐVkw٣HDeF.r1VrQ6o m$QQb}S>gR2ɓvB٢d?ˇ|"wFTr3Yɭ"̪i`̵F$L90O艨Wf8 ć&Ø%r$*c; k-wE'*¢KuU^]CP Y8J5AFͻlˠ/BZ=cdz<\yur aQTouvuy+Fe &aߴFFTu_B3ҳ⭨LI:Vs^z%[J+b9;g @6t)4lݛ3 *;";^+<-x!~mSB)Iz|B[D%7j2m7Ló*?Zn[ƆL*2/}Q%[X%7\-|\~wK!KZK{N66RUW~Ue''t ͒ j6W2˞mg.ɒ^d-Vc z d_vϙ8Ԣ ~O@eQ_=osAGNA94wC zgt9Z&?&{.pvO?o6FmuC>oܲQo4 ʋc8Xg~zFN7 OFwfByG4bǏ(a!01jAEAGAQAQPTqAEAGAQAQPTqA ~!- )\ AQAQPTqǛs0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk!~"w%v}gcdCNu7qι~?g.wM7ﻇx~?gΓ[*3{x~?hγ{.}g~g]z}~?iTPT|+*e3BQAN~4u AE%^O;PT$*6q(* dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AE%AQA J8E 2(*q dPT$Ƞ!(*HAQCPT  AEňr9PT쒽{cM>ɊkSPTxTj3@>s(*Qr|7#^xe%|cܼ-Y^8>+jV Jܳa %np{o6mO!kx_Ν9eWNO=i(*4K-N%MUgvmWUT?9g\8g[WIN$2(*\9oJ|匃JvX6P=1.tIZ7TaaE}C'?9d, ̽'U.xϟ9?kO]S4joD̹V}8կ1,FPTk}R͓_Zy㐥zP oD,n'+VPTLA.59Nˇ}`:EEoj-٬AQ1R_0-[I'+9߂"s9kw3! ߽VPT9ZH_o*t;PTDAbE]&!+kH?FJAؘ Y.{(;-&bEň UXy<_KNcta1EEnOGQRo-PT xC*ƃNgº )->~1(*¶d*~:q JŢͯ7(*B8?ʡל}\1Hޙ"cU4…{UirLd/ӡ"V bI~v(y2riwMC8=(*_Cơ苞[2gU젨0MʼnϧJk8_b N·avNt=;th=%0$X`W"@ w9\|]Tც/1 adg )E%|c%XUPTB40PHnx@1AQQ80fMDVs0\nz;QNc1b "g]ޖސrtG>u K(]\eCdt%ޒ࢒e73rZAwkQT(8d+l"Sm$ǙN5B˜)*2(*bk2%6ve@=~[-*`-(š"ByhTX!Ȳ̧ PʱʶZnrP!dm;"+&H<йږ&lB!eM[{`RrpH<҃B2eV-J]G}SU'3Ewi5y,+IlQ:Z#Ţw4O*K/: q{m %6;Z!(*+7O&HlQvC=kQTd:eG}tu3nIlQ ^pi"yPToTr"8_s߆GbJ3x:G]TE@=,W~g^آ^w.>ZJs KOO"$ԃWJE.,Q̟p-*k] zkN((]~I~-*53L5 Zǜ{vwZnIlQq#2 ;7U@Q!t)`e 4$xAvc#E Fy7BI7chE0^_wv8Kb+-\\8BxSđnR(a qn0% wJ@Q!|E6o;$E6Nd zOnHlQy M:{*EpD<Lɲ/܅m3$\sp FER ,Oal;M[T@#j wdJuY;Jg$uNnj^2 )Y?9 K70E+(b RB@QtEA`ם)ˉ-*CzCr7EQ|L"ݓ|d%Ee6?S.qc] ES!񇥛R[툉idB(* $/xo;b EE( ]YHRQTáv}4o;R倲keَ@F~C 1tgۨp .*-ޣ$+(,;Gۯ>o;l = ce(dI"I~6JSHpQM\d hthnuĢtwj/;$| 6$x"QTTw1 oOj852R]$MΖ"TYIc]#5XQࢲ NTfήCQQ9H+io;%E%'fn/N/GQ Z>Xkª{tO-EHpQpx:X夲BVR#]NtQi oǁ塨8["w"ia~ .*/y89/K}ۥtg-JtQ<0$R?b!S0))u. $K%(JCQR\wEU;f H'I߽0 qn:- HCWk$5a(`4U-R>ݤuNr;<-@c%QTt46Rb :4@ /*zOlmz PTtH{1Apk~<IxQ 1fQ|PQ(*:{1m T)QV^Tx]Cm(*zZ:@9gI5 3i0kp{EE,w('w5] /*BC1Xퟎp@8;bR kp#0|#4Ɖ‥,P~ў8LʼnrPTr/Npxے"6PT9 ;1ȆXTGJun\FQ- 1Gl&9 El%+)).PXbf"\?Ce^0(*oE߁1B0EEM=Fbk: % x2\$(*wΤf< \ O,g&ビȏ@v"X9K8(*< PYqAޠ$]h(*P >›dOlqo3xPT.5poe#5*w ^,MA{a e<@FQTxX,-!.u5'  ,`yW51b7(h/~J t\c+EŐWtt[k2Hk5*alr*@eA%. w-;p֨,uc& p`g]+PTDVl;AL}(j_#6#H^sTV|(*&,K3w7dPAQh ܷFÝpI,M3:$x' PӹUI{EŌ 4Iie!~\9z7G]pq )E~lX)ԋ"Su-%Dgr @Ζ̔Vxo3$PTd֮[nc?$92_r`E9/ ¯EEs(mtu}2Jvи`K-~V(*2;b_%m JV4.V8Xm 5z$PDQ G_W/5.8ux홾 B ݶ\dDžu$HެE`Y SQT²,%a;@0@i>;עrny&Jx^H j PT(av2dI oǢd89,N{'D`,Q;@¨d|4Er<=6:E%Rh+%_4ҿQTnܵ#x։(*Ȫ abxg]xEE]W*|n:JD$|/EW(* [=wC;硨DX.cEEN0YV 33(**pi4 H: [?Bݵ|γWE [yE5U sw}PTT,s׊> 7!&QTB<i!ى+b2xXEXVBO{_/Jk4LjI03PTs@m*QVaբhv7QbiX% V EEC/EkE{Er5|f AgQ!$v1a}r*ChAQʿe jgV:@ǫPTܳƄWԙ(OAQ/b 6 cUhyjg atX%.lF%46+3DŽ(@QNub%\Iy[%ףc¨W2Db۵}.ɻPTt 5\Ɣ@t'DÜ^MyRv{V\3nj!@T'Dim7uoEEEO}5.EuJT x;[pW`(*z^Rg2ǔJN4QT`u<(i!] =)NLhD?ER/ov]AQa nsɚ0Ɏ-3R󤪠r"nw*ɐ%s̙l5UE*aXi O k\i9/M6L D;ܭEGHk~윅bbwzVTgd.u Qy8C^5jQTrX> Ɗ.7k@Q1Tm6*XE6AX!#`Nx&gSyc wx p1 wFZ@9QTbii b,HZ9iGDQ~,To4׊GQ1(k9QTbbkՅJttCF@17Xˈ~xvpCa Z\_+}Q]{Ke8sښ-fUE%V g$N(*Ƭ9lq}J.ٟ"nwhZ@[ϐb)JtO ;% z\Ik#9(*wXyZ \r.FQ1! p < ZɆٷ_ZA$RD7EPT\ic&$[PT@_DdySQ[/EŌ}ievixB6Gjdы9_2Ij9)kk,BQqZ rTSeÎ1, 8z^>d]&ހo.EŜ렙X! E)5M|l)P-9QT̙ +w7h9ci$paÞ,^pXb$G@QqcWF>&q` ^WqAsp |1h!ZQͅ8r%9Z$JrA7ͱ.b'9}hFe{rDpG s(gnhy|}w@p* 3&EުEYζ )o3*QT2Jye\,(*V~߉WJX3HYPT&GZ\rf\q(*y {rH(*hK~Rs(*ٞVd*DtEQq<ɤL R^JCQ@Ž܌ GȁO֤x<H;Ov02"S!-B W o+PY* E%mMS"3PTѠ '|+^S(*X҈HN3OEn~ psh z E-MIGag&X!&"(*Y c1*6̀j6Lȅ@/Wb(*aIvѬ6{(Ĵ26ح:KfQTE]~[= ~܁rPTjxT#FQqO$G<^ڋM4"@Xas*|9ֹ?|(.QrXiuo3fG&bMϡD8/^Y\Z-~5ͮPT,5>ˈ sE}6+fxɊ3+E*ٵ#Y&a~E3N#bh%CQΔd~ w J˩?EQN3h(`.%SfM?Tu$yXr Ӄ(*F TW˝K(*Qf9UV$n(* ax'Δ.PT`k:TYhfEcrzJ>|o;RV4~*G3<E%z.҈M۟(*>Z:=5mbw ye|LMdZKEީ(*6ȮWp kAQߤ@cx+- v'PT0/6˜K@(*` ~7REQE(RjPT@Ҷ@Co*(*8RntT[PTz\o;!|{²G>(*l ?wQTlr?F^fPTZE\o;` @)[rbC堕jQE%8zR-:o;\`xahe2ۙ fB(*A*uܱo;T! (*i %}0^}(=(]HiAJc0 m6L9 `j E%`PNi+8y(*:{V( QTҵT0SPTb(sЭ%j'(*c\ j'9PTb`Oq{}N`E%Rjd#6NCQ\+\:Æ(*4 _6NCQVPl{ QT6ZYqJLMs\+}0\gT&Uo8ދQDAbARD mҥ"ݓ=qu~ս]xv2doKR+WX V9G6JcpY iS_EΕe}?8cΓ K[p-$MNo$*aK5dvjf> {/WYv1vex;lB{삧M/Ăamϓ*˹1270Ɨb,vYҐ,|=h{D%`IUvAV3vO.#Q)}Z;)wM&Qx.=#xN"%Qu U!聨B u b~M_%Q8>`[U9xG.3LaQ:ܚ)2wkǑj(TFXe]WKo8$*éFUKXJ [ӛ8+ Kvޟ|J8,圚2[$*&g6Ϯһ?kƓ}co 9$*Ɵ5s, Qe2\*ꂪXmH ?'IT2K2vVgI/Cr+s}^uxuL:)vLduHT2?;ŽUfalCrsoQn):o5q9y(9l"J00cw'˱ D2"f Φ.M#[ױ$Qd:2v8%YdaJ>ͧRϭ.kOך#Qtv?UvUlXɆ@BhҡN.f%lz~Qv]}3k߹;PD% X#r J0cR`BBoNŘ'%|^6oK6}[\!QLO'.\O4vOkHJSr5 aǩE>_)-GnJsdەQM4- ȵ˿ ;IpMޚbC*7tEJ#Q!ơUE;okۦu˧8h-'ӳR Qb߱qՒZDgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%!Q!DgHTŸ!Q @HTD%DSNf⦆D%P Q!@DnZQ +vQ@ ܴrBB;$*F;"s) 8PzeuaYyDfdV' esVGo:x:#t:V3:vߵ:V' aSnNՑ.&$Od(:oDFjğjsr"#FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlbv^ /peC6tT:,G!LӇh+^Wd36$&Ī3A%qk$|V/NTԉ,8UTc4 < .o +)*euo @Q8t%ʴqNLl>m=Qע$*tM;De-g-M~n'*R\J U`XQ~ST]DQ,jXޫ$I>I0)kDJL1ƞҮԋJ,\O܄!*+#< o˼GY$@ԋSy܌roT6=hNryӋJ FDşE%xJy;$QCHTbQ^n_oqџ3o[|K&}1q?v/ }>KQ]>i}{WсXb>N>Hk ז53xD/ޣǰ/':yF=W15ST1fYx^o]vϒM:ʯv5|G~w}-0H8î#:3u7X7nt.Cfz%>SI? '~ul~]G㛜1󀯖G}]?>ZwUTxp`Z1ۘeq~jG]GТ"*. RֿX~NʡTp^ZK; fYƊ*Fߕo[d~nq朱8j(ί/##*R!Gwman}4@Pc﫧:h4FL\p>?cX! j}2 XSW̃UO/#ܿz%֔JGky9.*Y_Sx {VO9$3^%4!*ǞE*!SJu|B]zV(CM>廵oqi5O Zw hXYT"[+LUg<&OܚE%fd#m)q΢rh}*Rk-r'zXaGlJzȼ\ɝRv[DMqK)nM3/>K.DNQQLowSz7oVw)Q4xV>PcF4*(Q*o'DeOZTtf [ HV=~jZxv t xٟ2M UO`\>_HVT:.C =w{~ׯ嘗QoNXk #GT}hO};S>k8EeAV]f$Ee)W}2MDDe \#˷%s8^Ya 0O?BHuME:H%0ޠa)(Slc'|_4o&*A›о2XN| $cY~j:C"7}ϴ[pđKc׃k:xKLR뷘Bj4ςF%#* s+ۛϵ h& ],0 6܀3𮵣,3,b5U{F>\cǬ|+FE-^l9TTO czA\RJ<,%7ڃWg|%BaV|;ŏDףk#OQQGeGùabRJfMvdNIN:׍v !Pc!m4RL GrQb(u۪{35yQƮU<|PTF3-Akϛ.!mU% S'Q2PT>uѵñ3S5IT6`mp~U@{Q6Ee]8x-ȝa^|OоOD/_#BdplOn: *,dxXM?"Nc8]s\@]#O @3CBVKX6c-*\kQg?/8zu Oo}:yRU]ฎ{p9c߲ $C+HS٠x<jl0]_2%梂s/:7+[-6??쨽hʗ PQA.S);/)j*_/&tƬRTNQi j7S@m=Cþxٯ=`2d Û>LuDRQql *7?&;`)*0WMlh#*:L'D$wv5Єr gUukJTbjC%<{8)*uTUq5K**OC)Z$bكᲇ: ue% !nؗSF mDF%4*+uğg2KG.-*lDh͏% ^UJDZj\i^KŠ6 ʮzS; m GQzWN#Ki<󘥧$i u GQBZ?lkԈ@%)*W&8|X]UrYEU}_M[u[BLUZ7t]ǖpp:D9iGQarnǘPp~T[L:Iz_%*_X.,S^RmE^Tun c=EHQjtmrw+TX = oS|)*Tr8v` }lUT 6pC./@$)*w؃Ovy{fPZ5Cg5m AOޡ40U90U#բ]MƖ pdhTKT0-pz3ut|#bl~솣ncmoe#*X˘\/;RiVTIs)cE%&Ij'ḬMRTN㍎Q΍bgBޖv%]TNtk+ѩ!;TTg$ ~vZTK{zb*/QAoD,Ս,r8@b56Qa'oLGy~cLxԊI1ɩ̭7cE%g E42CᯇX+fk ;|&*P`Za^ τDN \ 'ae[̺JmE$V3 PFҜjQRS#*P4s]/QB#\iah[bD'Qlf^t[wi/*r)*5wl.ۄf Ο24SHԊQLҌn߀6nJy=L;-`%)*=rC"Z@EeJ3`%n=ltх-#"x{JsJ%ڬLn8u+sm8bY OEesȿ4"}AsaS-*8.lNQRo*Tl^CDFYʕ_]8X СbXOK4hDD }06oo>Ee?*:VF %q%{փ(/VT j}i{dAݝDѫUv7!*t+ .Y ,LW~TWGQ79i1877[3u6tbnVRQ$ Lez~8}E'񾜳haj8 ړYB½7lZʜ Q8բ›r(!t Dc2!l:UDZAh"6$>rohMrsmt;u7e@.;QzYs/E۵k%4|%&+w,ơ~iZqOwj^ʓjQf~E c- 'QHڐnKKHT{L@:'IQ1`YcSudGQI6nbEFA{gϴ>ZN&\ ,?` 2$Ex(tw4+ "!7De-&X3]1iawGQ١2"`R44R^pLh=URbUN3: fx,%(D% %M>oĨtj6`z=LGST;ɒ8./B?H~Eܭ magťͯ$B;)9Qe^`>g;`;sdK1-_㶢)j|6ԂN=Y^_ XiUXNtܪǩichzVTxZE'nj@l*j/*WK9ƽQON\2m g)α %G!E@ f~,30p .j?眓B=GZ~t?iS̯';Z+qN+\+=].Q;I<$c W "˅j,r*0V_halk'έB\v4G%X~oHج~'3.v$rˮvE<ܦ2$'8}Tqrq5.&A.&.*Y ٹ)\.εwL:zDlM-֤Qa5 PE7F4cJ0v:C1|ZTq T-K<}g靝U~k[*{K͹.Wuzf;C Ԝ*KBX9: ZU"hA觡rmF6h}j=װ8rzls=&^ 'n|-<;]doJ0mO+] &o kaE.-SM<콠.ulo[JADr3Cp'Y0cjAkۈ8wV jYZt8Cv@wP2@{"e] MtibJiHTgc&}B\;Z FȚ\+r6^i",jOuXKm&v ,EF*T#{636PkMK5ݹ|^+y3´'( 2ͫ84Hqڹ i?0Bm un%6n4D4v;[nKҜ/BGkgPX7mxL+軪΍uopϽS\--5L6-lԎМЎeI;Od_8,O_Uۥ;77;$sֱQuĚu~1;RRQĭC2~W_ny3%>vw[ꟶFe0Ƌ f^i'6{1HxR5{qXY4Wpj)^m.#_Ά1\et įʵNR@eNpCso82ӏٻ= ^ٺhm ,Y*4~ek"m%ixW+VJ_ͻsé-s8oG%HncmwVTppoRйm7 w-_~k:j=ӟo_7ӋCk=JOZ6]AӛoN7vX5'Ňݷ|ٞlrrN:<&j-ҵ.A̳w<+ Q1]٨#6 mِU[ 2Qb 2.Z= EBcֻ%O(S݀qf6_ `gK()SsY*o@ g5kc~MZpd1 Q!z;z"nT2yp{~ǖ _༑Ϭ= &"=NmNQCiQɗϬxV?Mhy!/$7$Dq}ĉ5DTfMETnq[=@{z% 2e0bfn+xq >j "M:t佹.r3j b%Z`ykG&+I[Ћ|>,*'*WV'XpdWLz"@EZە3}AdD喢GGe44;`Z3y{߷Ӏf3"A\s#O|էߜ]McgT˖9z}qkg2v98w'ྸ ;\t_?)*ggcdW֭C8͠C~u&[ݽg- lj+pܣ_2U^YbφjTѿN1ax" Y/ί.OlnE+OUZ|gp]6ݫyC1_p@0]۽lѷs@Z.osyuvYD8;dƌ9.}7BÜj1?j|~VRO)#U'O†1F,o[ү3vKtuRn_9-6w/ZiqJ\/qCVۋd޴[g[qU_$ZiMɼ*ϚyyɳBJd9RqAx|2}kQ5^ 4 eA5{6nb]]MJMihȯO7(>{u|Ej[]D1*FbTTONk8Wc3 *߱g8Iە<,܉p>w *$UA~v]xS<$vE <5nʰ$ 5 qP[.'i&wH(MO[B΢SVr#72b0vs⧪hTҀ4Ǩ̲ YU?SbA;QOk/II6a p{.9 x54ؽCp^FI蝁gǦ7df(X.'~MLpNpQjMWoydk(ZWzWlCT `ڏlm.8>7cϊørP750f[!X6"G4zT$$(\&]SQ[1+qRs#\fEE8lZ&XD^b]\ Uk6gMyeN-ZQQ՝p_X@64PV M ʁ)F&TT6Wb҅RQݴ-\D/ֲÈ ldVT(k#)۲e{K*v6.CFys)zOgVWޏ[F]5ø/IQQouoWܢ#7-T jPO8罂)*g(pE1G9]CobA1GARIR+**qSK$ 'O sa͊;V?gL#Ϣ0~$**ŨvkdۊJr<룸i?wڍU]NҀL_&O.G7 bGknMDˆjU+<57b.$3rV4$*~B,>fz؉Y,5 . $*-˗g(R**Xd62ATv0:xM%DS[;LAӠ[LE՞Z,.d#/QVxG1 S2QH탰ta7xb}:IQppHT;MX] +r=#"8J"Nϵ,p<"´r z;0Fg۾!ne:H>3e *Wf\qfavȕ%ڬh#uM8E·0C=@Tp3KDǜ`R"VFF|De1s5DDHkMGዑpO}"Þ"#y}AT0km_p>4 5>G SYn,AѬcr}E+̰j 'QihHfrWu%U1k8]ػzۓa+ *QQTP eX^ʪ\o lnĕBS(*h+W##i, :A\_uE0^fܴIT1s`38ʱ/WK5`Չ|5:zPy>/OTÛyбw*(*f^B,1VPſӖmg9'?%X]%!*8,{W; ?1]p(* Γ'd`C>4[\hwbdg]y)on9у$ek"w;Ն]tQNA_KUX΢bgi{TXV 77ə*M+eZD{nqa(*" 6 Ycu[qX7 U..[>Z) ftD4c ˶pPf8o>o\Ѽo.$. hcKh4UM֖T3ra{u0\h>k\ .1;\ SQx{s.v7DtB}*s4v Sm&2Ptza+,g~noY·L!ۯn(a\ >އp*su KObx9JQ cл?Sco+émxXǶK_@sPWhYn˯lkd{nZ+,>oAGvڡ%>{Y c@v Wk)?١!12]|N{jo`W s*p/%I4CKfcǼ}bQГ=g W2.$CZ&Ÿbgu9rym ch-sU&h ACJ'[?*jdN"3mm\C-Era)`OؿfדmsBnXD4q|-~pŊ xh:$Ⱥ{Wt膅k'Ń?sjn^PUݰhڕF4&fru˷9\0PucAzHT)$*A |n{Z'> stream xێ$nxcUԅbH#(Yg?әDrnPe?3έ깙C1_,hPxzG:G'\@CMJ9sYb*jkk}sxnPe OE1έṙC1%2Hrn,1@⯈7osKwnPe (r[svnPej aXw? }v@7_a>?j|{/DneXR5wgqY k',2Ž6.m .+.@6k/7jc4搒Ͷ2{7.1պm#}ǢT0go/NV`>neO2%籰pnE4\|z]|,`+FEhuOL1g*0{;dK7R|cas}%kuKO{ڏӾzedNV/E(quͶ%+0xSK Uy{v2pZ*NWOӘ@e]wT=_NJ~z+~+PcWJ{~_k8j5o`gna,/~ UsJOgl {[|nGzb8dOD}}G4F}~&-3o8wћI֎M)f{d~ ,}7xr A4Mև&ky}]ۣMn%I3fry)d]K sŮP)L&Pzjt Rq/Np'}k2̻(E^ TfޢY4s 5CYYQ [%3zJ3q_`[_8Nz8)Kϼ>znq"ɴGκ WfޢYLs3_72d>o%j,Jܧͦl91@ YIN7H·BWx/Aj^Nb2d;"܀Y7ƙLxrAǪnád& ;'% Vw/T&3SugrhY5~&-M)7`Y) -^ꬬԔe8ڳˊ󝉓J83dE2EoYE`+_.+RZǁW&w7p*+JXYʤAe,p'C2p3Y̢|J ^X b.XK,*uVneqj2pOƶJ8ɧ@JdVfw7e{-sĺV_?eY I̊R؀o%7|)A*d%0= 梔>=9Cb. |2hr3lKg3+8YTR.ڟ㴇J>%HY-dQ2a{XV.5ZaQ2nYw2f]pdME%ZW4R%Q+Lf,ΧkŠd¶?ӕFbMn5 )Vӊq62YyYTu5̡7řўOLWMRRƬUd" Ǚ߸hqt{\PW'ǫdZgQ}8dVgRcJ_Ί3vJ8ޚ)˧[XLW3I>J沂,d\b]ړjMEZ]XQI)}M8+L)A|zk,oaE2a["o$ql({|G(w&U5eT,UA{WtԒpc6qiXA& %@]ٗn+ǶfJ,Nzj?kVƙV1'+1¶Dh ޒLS.MR Hi,frY9I/WY x|/cY5fg8 qH L7l=dҿw*oEc~V'^j*= qH Lb8N{8{`O߻ONO#kŔ qV| Kx|/ugr)e:8^.Ld&i <ĺR͊3pJ8^LdѺo~kj|2k̃+d"ڳ  8Y 5,1Ju[Nۢre*1 @8Yq8Ԣ?YM+Ժg>^z__#qp&԰vK H+Ϭ8)XP[%+xVNn}JRf7gVI{خ,K%4ەsQ-A3Sݱ͘d,lJ X&d+~bV<-]73io0~ d̙뮰;%8K 2gr2؋񊍲SӾE#t=s+) b[1+|n~#~DV>[˪dJ8;eͤ%3(H}Yqغf62}T To%S$IlWw.klxS_OվnVlWJ>+8'޲n:u/#O.8AJI%kx',3,Vog8c+f%OVn+ el.+XjZ1%Hb-[p Kd`(P&zO>ɬ[}ymr~%oGT_[vX*.j|8\v(0קk/ WXVX7p'ng0fOg i)U2[xVShdMoY[MUgm5JxnV*q?Cn[M*%r[\܇o-V%*X/u?'Va[˲UJ(K` U}xֲlUeXsovpq^,[hdGXsovpq^,[hdC9 ;/ZJU2[\܇o-V%*P~N.Ëem pu?'Va[˲UJ8Ժ~e٪D[%j U}xֲlUDoOo&H`Y*ϥ*uWz~id^G 4 $s{Ʌ&E$籷wY'^| `-/&6g vѵto_{J|Mf敬" ,5LKaי+ûH/}_{㧬ҾhKwWh|V@NW$@JEGcdf^*B_hua oj ` }]fVؾՃ)ȳ}Y&6=+6h+YEX(.κEim]t%ә_\h:Mg^#;j<@ʦ&_8)Ƙ̼Uj_w"Ԥ5,[+}ljfZ73oj8T['_h)>1]tEMefd|jtzW0e]AZbbkq3/&h|n3Ê/p/`SOA"׾PJy.Ԙ^7!%c)Z=S"hLVV" / &?=A8[+Boz7dl$gtڗs2BW_cG 3ARrLhXVJAF&3P3 +B+Boz)uNɰdl$Χ=Bl>U KLi&NVM2V8̧' )?7){L1& J)~+&SMS̔  !1T|/p3 f>=Gg&NYquOc7HLVJgMGZ I`D3v]nARv$+m5 >7_̺qa6r4eg.s{ +;h5 +NVm8ɷd]zqF&S[kb6S䬀釕p8z_Ĝ8اYq o қɺ l$~Dv)jZ`C_8c_ܺOdJzq&}Jc^FlyLa5&#%T|pQ{"83>Е)HfQ'H=|b[\] (DvWV8rz4~&I|}SK3Si|L%"] (DvWVp/EGd (^baH)uFj*WV¹9fkcM-Mb+QyjiLd}W ^b1V?n#e$V,%dw7fkcM-Mb+~jAoD13][eLI/1ΘOd+pn2Cmfrx|SK؊jZ-7m#?]qfA)uŔI\ٍ%)L𙘹$FU;$V'[= Zn!F8L&<d&I\ٍ%)L𙘹$FUဉ9p[qĉ1?EX6w>]_CI&gLn2,8hV7hdzw 8-idoD"1*AfM/1Θ՟He2g`n~ ۛ@nw4f$kG_#߈EVUL&^b1?d>?mLCn-&ۙr s5D"+*A_^b1?d ɬ}Mnjr7صhKO9[˭IJsס3w ]/M/1Θˊeu2zMuZbbqM&˼Ĕfd$e/]&oDV%Z+k 8zV6ҘnK׭| )Hk]95%nq&$MC7"+tuL= BFZR*X"ni?ߘRʾ)Z[[c)z7%%} eKpcztuL1ʍdUdR~2Hknkҵ|z[.Q@&sKLM,$gK nl}2|>csiӸr}ʰͶ{JghLn>Eɡc7%-}ZK ^V\3YgIL&+fmg8dm`" |NW'9|YpAAOXJج⤛Is~I.g24W|rz}8'wZL%5>W1ˊLbnd,|!}ɽd1 /^+NJ/+:[{6 ֆ9c/&f;N+[}2xozcI| 0.Zwf(H㩃^nwc= *<4OR@?,wyƳdOX g O!K1렀[F(f@ehKM=]2bF1DgO7tpˈtyC4'n1v϶2렀[F(ELo:(3iOcRM=]2bF1_mLo:(3jϮЮM=]2bF1[Bf7tpˈMkuP-#f)͠oy'ӛz eČb~uV'h]^n1NlۘuP-#fs{@*7tpˈ pM=]2bF1sM\uP-#fNO7tpˈ뾣n1?7/-Lo:(3u52렀[F(~7J7tpˈon1^x/23렀[F(~&7tpˈ/~M=]2bF8?Lo:(3Ks:ӛz eČWq9M=]2bF{8ܟ<2렀[F(~ 'P7tpˈoXc:uP-#f_ϙ6n1n+ALo:(3/@(0렀[F(tn1VrLo:(3ln1>1Lo:(3/sln1&oeC7tpˈpvKn1 VLo:(3/ʸ#n1tN ӛz eČ9zn ;0렀[F(>zLo:(3尞,ӛz eČC9M8bzSOAQ|"ǴGuP-#fmݡM=]2bFYж\uP-#fl M=]2bF)eLo:(3hⰨazSOAQ|rW7tpˈs(rp,ezSOAQ9'r4wuLo:(3w8.ZM=]2bF5,V0렀[F(ޓE:ӛz eČ 9+_2렀[F(ލS%M=]2bFV1YLo:(3o࢑n1x*Lo:(37/1n1xZ.Lo:(3/1n1Y 1n1A}2렀[F(~j-Aӛz eČG(53렀[F(~:0렀[F(|2M=]2bFq1Hn1ŕ$`zSOAQ\FmVM=]2bFq eɯLo:(3 *M~2렀[F(^MIIzӛz eČ⥔\ډ1o3ROҹ{R[F(^G1YUtSTU2bF"*Rn+7tSU2bF HLoGUa5[F(Nqgkynn18R̵}-ӛzX\[[F(Nz<}'ӛzRKaJn18,67t]:eČJ᫘u5zK.3ЍazSO[F(hlE~ ӛznz:keČI*Ɔ70떚/㸃[F(\luM=]Nb%2bF0bsnLourP3(Gp/fzSO-\n1x*qV7t t3{)'rczSOץ[]=t"QE8M=]t8n1p:=|ӛz.QeY2bFq;5Lo,EsRqˈōTkw0R=eOMo𪮻xkep{ncnŧr7Wizstݭ^rv(>:yA^uWnY ׌s38zlA^uh wCӆr[19lnY[Ƥ F9Û:jvs8wM{e ݷy .ӛulds7"2R=n⮻cmQ|PΚ99wzs[-Y[FCG)ynʮ;=)e:q'stut-#q$.7N&/72V8n!0r7uݹ_q5EśL CӾC;n4w Ȳ Aӛk\u'S;n2M H,)ӛu%*'vT nK1 Xgq#7^~L2VoP`ω79J7ѷ*m8JGw)y?uWso5v[%0n'vb6u-؞x43vnuUGy-ކx=m2vzguι1=z-6änӛ78MIo8SnOjkQj[Mo^⠮3+RluYNejLo㔮0%rxYesNoiۮ!uSyǃXC^{pzZ{v 1ņ<5u#{>vOMolî{<rG?v#X+{v:=OtV Տb}O^ݺNӇV bMԸW=m5?S muzMV 6?T@z{v r-c+b n@szsmn4x-cb j4vzsnLxE--ch<]U2\o]| պ >wnpm-q?g8LKӛueVg1 8u&tݞYq:SF(VMoqVmG+諃n8w!@͘:kzsn8NM;u˨w(3Iqӛ ug)[F FyoS9NޜЮ;"I6WB'2*1wNxthv)y9QQp6ӛCuV[FG3AtDwYٲG[FGO{d]09]w\tv2Mowe] 2ra`CL+76i+ondrf[ww5a> p-#{F;H{ze1UMj\?n'~-c G5*6F0KMɆg[ƌw⛶pdztݭ/{Kn^;/Ξ=ӛ}.|sQ|tWMo6񶮻{w/1=Yvo]w_h}-Q|NaOwNoڮ{_e}-Q<]^os|-Qo<]|-Q-_1^>y{~/sٽQ]2Lo?;A3 7tݿ޹룝u^n1_o;𯳆M=]_q;)Q?/>q˛~-#fEN7tO*CO-#f*wӛzWs-#fJ)%ν7t'갛O-#fpM=]P}n18 p/M=]SM~ n18&pӯM=]BAuA2bFWRu)wT-#fPk2)[F(n8pk.M=]Eq*TjQEh7_ӛzԸn1*.7t%ZeČ ǹښucTi+k3Ǩ kzSOPt[F(\p+M=]7IrZOQun3) l 7˥z^R.QK q/7t]:lBeČtz4Qï^U"QJ#^uLouT2ʸeČEҙuK)^XQzB]7ӛzn5; 3RR‹fzSOPzg)2bFqyLo-#fP[X7+o޾[F(.w+ھvrˈŕT6u^X'Q\L!{dzSO=UE~Nn1:$tS^R7책[F(~R t݃/ݻ30M=]}ƸeČg)8tqe{ܕrS32bF)ezSOm⦚k2bFTrGbzSO߱\n1x'ӛzn+qˈP{+ӛzn7GWsˈ[q7ӛznC9qˈŻq ?CqpV2bFq1uA2bF1ӛzns-#f̉Z:+ӛzn;ιm-#foΡBzM=]w=eϬ3\x;n[>sˈGp4>ogzSOd'SeČS8ûugtv,n1 ^7tq? 1-#fq%=;Sg7ƸeČ8&.ǘu?&1-#faq <;Zan1\΋ a7tjKKLrˈGsdM0.KuI9>m-#f 9-!\n1>=0Lo[͜H3(ِezSO]l( n1VNt7tzO/3/@ل>\^:u2bFݜ)Ӂu/LRn1zuLoՉ3]M=]*.3_RLfzSO׽~3_RC0^YsˈoYM0Asˈ/YGw1^)WrˈYD_1렀[F(~-M:Un1͜8R1ӛz eČsELo:(3qL?0렀[F(揿sbzSOAQhziuP-#f_zvY7tpˈEB<n1t_ǙuP-#f+@@on1O0렀[F(&%~؇M=]2bF11]脭uP-#fBovczSOAQL#f~C7tpˈŴ!dzSOAQLM6N|[7tpˈ'⬷ezSOAQNyg7tpˈŌ-s3렀[F(fݟM=]2bF1}Lo:(3sn(OazSOAQL sxӛz eČb9uP-#fH n1\PN87tpˈŤHq^'2렀[F(ft'u(ӛz eČbNsF2렀[F(f)M3Gs4ӛz eČbVW{r(3렀[F(ڍ㸀M=]2bF15t>Lo:(3)vazSOAQL%=,M=]2bF1ŴكT&7tpˈiP˘uP-#fVIczSOAQ̃\ EM=]2bF1u)Lo:(3y[Ga/fzSOAQ Jz7ӛz eČb6rLo:(3ه̢o`zSOAQV4a 5|ӛz eČb6g(KuP-#f'8Fn1mi^*7tpˈLOS1렀[F(fsڲM=]2bF1ә1y'ӛz eČb9?Q2렀[F('5y3ӛz eČb΢EK5n1h)˙uP-#fs"  eČbv}/ӛz eČbΎ}M=]2bF1G{[ӾjLo:(39{%ۤM=]2bF1xCat1렀[F(wwݻcM=]2bF17Lo:(3}m|vbzSOAQ}nk6B:ӛz eČbtG3_1렀[F(VSn1҇M%ӛz eČbvbW00렀[F(zg5A,ӛz eČb^>"I6azSOAQ{lᛧnLo:(3y|ؓM=]2bF1ogo3렀[F(vk7tpˈż>ݾIn1ڡOsuP-#ff ӛz eČbx5&uP-#fß5uP-#fÿE#M=]2bF1OpHazSOAQ bd1렀[F(Lo:(3w"M=]2bF1*:Y3렀[F(@ʍpXn1bbӛz eČbjjSczSOAQ -n R7tpˈШM,ezSOAQ j7tpˈХ嚸G0렀[F(^MqazSOAQ >]727tpˈ0Aڏz eČbӛz eČbӛz eČbPn1R53렀[F(8M=]2bF1Lo:(3NdzSOAQ p"ӛz eČbuP-#fn1D7tpˈ'2렀[F(8M=]2bF1Lo:(3NdzSOAQ p"ӛz eČbuP-#fn1D7tpˈ'2렀[F(8M=]2b_G1'z…tpˈ%L`/O^n zNO^M wz…njl(ӟ.tSf;F1p01 =Ԁt wz6 tk==@'W{zp{=}8ӿau?<woR+9V ToZW}n`s>UNۯEܷϾ{z,~Xފ`C}מc/ *,OMage{\~9ħzf^u K)rrVns {|_d)UzY*-qz=u.PvXYJyܽsVú-\(R7_5^wsu?? 5^׋3&;FJKdg +*9sQ9\uUⲔ]BUq5řLo}O#wiCW>1p%I$kOq~v)C"[)t]v;߯q~>В^o[Z&Z\ 'ƶXZ?J{éI/׾hJ)h@JAXW9}`]i-5H* 4&,58߮Zx`ze׳噁 3_Ϣx.-=93{iy&屟l~ ~s|J` HKހ_Km[ܯI̡1e>g8H㓍biϧwS{Oƻl櫁u=l[5Bom6i\論]ɤdB֨=`_iK~[k\trm翮rk';SKjK5ZE!>V{?I77 T7Ǿ>q%m~>R-hSJv@Bד-Afr*>OBqV(| صt>;+8ZNa&84J<ϴ#X.@F|xee>7ہ'S4s3_ϫc;jɶ%8Cl\3i'0YWa~ ]e8 V)IzMQN'NpW{O$1Wl᫁hyf>W<֢xNm ZZcqɖuiLXʦƲVTcY T" DߍΰWoƒI94t-su=u?_KZ-Zh+<8?1pz^qc>\{I"qG>+ ޵TE荜$[D- tOqfvў*j96mb-qzcV5mŖg6g88pz]XWjO1h5Tofӕp]ۘۧh`ѮLfvIt_Ȱ*)O$g ҕFW3{5@siކpW|mXȍY <@[Lr[W<^̬zׇ+uP] Ong,ĔfkLS3Q~{hýlkBo+΄j̤+ӞWHx.A <־p]]oV5mŖg62SO7ly,^+?s 3UF:zi_+h,g;ϧ8k9^+Mg'W-q2{7 ldc)sxտfյTyP}Lꉡk_tsnJוOCʊV]{jRj~L3ɍ6v{2?Km7ۮ׿f8kdrs_+rcY5گRƄB !W4CotLc)v:go9+''hWRV},]2\SR~ϯ) DkəcOKm+LzcmၔRvѵυrs_L׸LJگAڗBT/*Ov]۽3 ĺKBKVOgmdEhWRV},]2\]Eɧj{FцޥO+Mv%ܥ}_<YIyRW+M g۸D{䯙47@JpoU[H/Barw[p}%ד]YЛ5f3O\tfݸuk?^X[8NJn{γqcY5FkYn~ǔ|LPo2{w:l{3xѯN5eޒ~]exk (X2N'{{[ ݯQK|=wsH>x7k q䁅R|V$k4X ۵Z-w-Y-J2XWo`љ&k-Yrh;BMv&E 1yAUZm%JȽdj>H׋} ՘gc]LJUMw+^Ł^@j9eG֝mɂM'%ހ;}7~> ϖ e1ⰱ6ؒcU nVW3)5'ǶٶNJ~RfNs 8xƁтsع7Nޣqys4Q׎ڹ7Nޣw6t|N~vm"p: ?q}6Cnذc{lɭk8Oy~}+0Jʺ3_cղdį$ưg+ëǯ1-o`ݮ៶3-Q8*f%Ӿ-07e%R"K'6tB<:2|kLz75~oy6םp-+rci7>?Oӹt+]l0]׾6ѯ+ΧƖJÆ>YįƑgLr ͶqOO6I-9 '3TW*QjI~6{wڞjJiVW3 /d;ʷkޢZи@Vz1۸@} Wo_#<`>I3_үAV_os5+ܾߖ'nvfٞFj/˰$3oZ-o2E4 sR'$<ܻgM?Kݕ^ooЦuFN>JˎK[T+wԾװq%ޞjc&h ԢN%+zi&X:r$h&3lz#|z ?+0\gfv?5&U_ociX.o\n Ľ3g~S˩eP+1Vӛpe;ZmL>kKzw۸Tkn_ jI &5jӾ Yk,{um_l`__N]3_i`Yte޻z۳m\t8'CWYf!^.qjnaD b2𒓴 'U#ӻ9]V6 fqRD$8+iZ`PDBP} 7yy@G5ڑɶ֒ogwYxiΩ55){X.4rX3JX!ʂ{|zzTgMX~KeR-l 2͔㚗 a_\P)YM!܅kk}t)5VrPDM+br5nTPfSe=> yYc.I05MsBĴu m!j , ȓ$ ZNկ&%כ`];,ȗ[L-*_щ)䲮dZ*7cuE VӨ#$ |BASʻiTVit1JGb^F5oM!WaR#*>MY!F3槰,ȧ,;KT|ϊ-w_BHC>oߦ4*.)HL3V^"u&Њb<&˴CŦ,9q5/SV8 jAJ?2]w!?ctQP!7^_]e4=)>'A Y)U/Z׀H&@A5tVS#<5 #x"j,K ͑%y*m?k,ސ!?gLvGxZP #7ZjtdȩtK A0Le/" ,Z[SӴ >(%.‘ AHpi \nҨ??^澩Wk1wGC4RxbB06 HQM*Fƹ@0m/"F H t1UԊdYJRP}G+ O<l{Fc ?s'znFM?_xJ_3iѨ_ԱE=79Wj4F7xxJ4iѨ_ԸK_8vev<7yWj4>pq}WM޽jѨؗnt/,nxn,^1L>>sG/d.p{.HG^MX{~W#xn,^qgw3x_#;~1BvFj<D}m sxeo^/7%w{0R'?mhS0V<+K5~W^8zoҦ]>=膑F?Q?vm sxeo G/_ 0R'_Ǧ[grN"YTDbM]")e} Qpju:Dur7)v$o}_/vy[}=iS~v,ΩzYf*o]k @À#w둌@ e̖)pV'*3IJȻxZ$֋k.@^믔X\ SC"[);5^l$0<d%[NBZߺ~/*h`:CH`ugiHpJv|jGbeTɠ`XΉe\Pg^i9=`JS.n:'O\F ;V-6lZJXi|k ؚScQm].i-|'SrZD(;*㾖䈯&ZzZN V*#TyJ 9}˸m^zaC!`P"%.6Wp#=>b4 VbG{ X2ʴ(.5Ǜu)aU9=5v Jgrxq"R:fST]I_!TkА Ӎgq&.eIG) [ked%40uѐ΅Ht𔀃 d&"yHJrIG><\p YvXRZ AN.o\8 l2S/Lj.FK `e}8Z) T^ʩY NnHi:`JA/"f{ RYA[Ѯ]8r\߲0He!H !+ )GV *I^Nq>dL݊)w,V:Z)8`e]PLKѥ[95PZI-٤z",[lp=!K1 1UKq5 >qdRcBJO;S wZ9ʻ ˵Rbþwbhit޺(hɸeRʂ7bRq>! yjwrݨ&_Ml'yj*e=/NvLErbrKqɷ?;O1A 9bLH T.xUPÏkþ+n{R4cJ6:Fiq; \ .f黒ՊHcԣ 3[\&P\̺Z~"ي&dzͩw'lrTN5Yo$\3 Uvo Yh`;Lcl'/&`XYKt:("oJ>PfRzTԊ̺:`Ԣ }ʬ{,8B@+,? ( E`Lcx ZҨ1v^wVi-4ZeOt$#vb-FPolll]@ԴBf:IԊN K)˛:/&䡺 .GD3f (M6)R1MK]GY73Up9"13U+툷JklѨv8ői~m!VRj~a0MS S!MeR+]f(jE'ŕ+Rl[.056JMf )ؕ\{nGǫg-Fx̀)e7%Z[P:̱FvZ#;`XYKm17MEVd6L,77 )NQa@T+EbMBzPhM ()MEv"#,jA*duS-$-pGZʨUQ6$ijﮘyr RT? i dZh`#EZr9<*9Ȳki8R7")Kz*/hj:r4ޅt,]c"b*$r4mkVD]W3M-Q+jq* E:,ȷg3FA1u_(^1ԩZŷxBy 똺dGfdjё {i`78U D64}_;-:*W4-^%H^qd4XEvwFĈ: M+d*?JauMe[9uPV"FB5i,}-`u,9*.1VN}S %# F@9#juMeWMWNr%C׌R)SN[)Cˆ(h|!L0:Bz_]H<uJƨ(h|!6Ex%xe )Pc8FpViF\П?<޹8ឩFi45W_Lh4,x?2m=oV>eho4L?yoKո?D0R?Fџ?} ո?gp8 h4snh|1iLѷ_DGdUFaDh Hj_J6/FA@OVR&7Os7?.oFcxV&o<5O>_r`z} Y.h@3v#;8 ̗=o|=q<)j4v#A]bHxOs7[×sMb552.+kF*gMxn;0.t/nKw:/揺 qAp/ Gxaѳ.Ft~zN潄xw"nGX€y+S=z=7`.t/7xw"nGX€y+S=z=7e d|!ޝ4?.V0G T~uGM~t1z}Nvyt2nu_3(zj,O=0fy퟈M1[B{n`s鲋a |Ό=1n|+f|Kȯ<0w> OoBq쵀i5^vL5{:8=̨IE"yZ#Rk 8i΅5CF8OK,bJJJrkE`sLЈ-T@tRjqX(VM8c3R > žh)x5HPWmȶ?l0alEm(ı)GfѱtghY‰,AlgJ .Nq̕9|a:KT*wdK!R77 pQlJ36EHxik- l\*hbG@F,N^ ᾲuXQ1\PVʩP RK2]ij/.i/!L@pA)P<:#F5;V<]haLXI8cFq:dQAJ ˕"+#GZls`ZNdP+{zϘl; H.NKAk'ƋvB5t`/}(ܩ/o<7 p '+hnX.ˬV2qX55Úi](㘚ھW`r89=4wdY컦v"H`ީ)mHZP/O_TEh ]]SL;i$0vH] }NG ,߻70`u* NdO+>clӟpK]5kgJD+> LNpjr)ŕ w\([He7="_%.T0r\B,5bcfQ+/ ֜뺽gL>2?.):BtOYc :Fzda⒲{$&⳸+}!y"T+} IOY. ]އY]ԯe J!3W`[R,}I qKk1t4%zw|;ΊOelRІie@STF,}@R|68} !G@bKSP)S[@hhSAgA PtckOV3rIM_dp CI 4V/b&p@)zw|8N|$=e)B"pj1M,INR}W:ˎ3FBN mʈSc)+vBxViܟ'T(zGΕ59+p*ׇ`KĈ/ iWEa{R%Ndă iq,!d0A0v6x[,eHȊ\m^mpGR ^IL9娠fUPs L9X}M+(^Ee5#׽jr}882BZ)(|֮\95{"- H }KB}VDEdAǵ"#;>/䀆VBƤY(]֖qp'%NhP8"gMW_Dg*a)>)H;mkw}4[j*`SbTtCnVn*pMƚZ mzqACd!A;> stream xwg78zM)EA@bA@TQ](( ADA" ({_&;meLf^&)o)3;IpcU JQ,x;Efљ vΣ_DG/Q>s(̀C6U[a??=y>_:{]͋D ࢄP.MufzO&{OYAcEǀ(F*3YT>`9|Eࢧ}ܳnJ>Y_Ӻf:z =z^SԢAD"s*'/;TxJ+L*/\MX(1̕TZ-{GO-zQFQ뵨*V}`u}٩ʽ(,JZ*J={. J%J€(H>tN! `1Di9mS@XL Q:EE ]+ tQ,&(D z J%&{ڬ?nm{we~;(]ݿfw5}E0R]ЛrT}i *LXWK 2^c-GrzkaYBRqqer;*/ qV?_oQ;V9,SĆ#lH{c^J6.M'K躘L@Q^&7 y狢O;Oc f( D w{I* H!ba>vu_^~J;qP@bI8OYaWy JrGYf kgbCrOwK +W%`G]Y8ogZx| ]1(PV+^`W^wa`^A:z7$|,&*'3xzi> ګw DRCV;IHX-ld)}GŹ>SP!y8"˟6FhTW^y [}I,J(?i${bs_(N^\A>Mf4 ,խ).n9Z,a@8,J9q 6W7A> ItG]_ӿ޵C}E¨Ib-(K[_ LQMF˟xLhDn&'ҟ*6G(eо$kD`QJAOV&!̼|1DIKo ս* "xzРX{+_)("6+.kdD)7mWd)ҩ+g)S(MN(.0(UNiX \𨵌IEJ쯮_HV>Q,A&RM/MKѳM\XYQ:CFAڨ.gs_o((UG5gΓ⣀w{D>4V,%DiXADiN' hJ-I]$J.Y)HgkdA}~fK8(TUl+GQ.4/C$Gɉ{Bz2tB |X$X ^?9!.k7~[/'==]Q%ӧO >B+$D>cgBZ,%=ΚDIED( xL]E||Q:,ӎ:~O*=Oti##JtQd~J׉ 4\L TwEEQzDagHnd#w:霍P|[*J= IENߊYɸ ;)H,Do4+;RYi_4G QZO9H`cZ#W"Vb9Wr/+{clfWAE)) (ERZ`z}sbgߧo.\@80y'$O+Q.'y?EQtf ARQ:I{EtM rO/BՎBA(ѫɆkXc?Ald%mbT3I-]{ P=4qJzXM }N<Hbef ak&QʻQ*J4?Ktį݉UN`â6 9פĽ=˾& Цmw, f`G^+k(|e**PMn$Joc˦4Z4Í7qxŰfQPI[NCz0_OgXYzQe{~lo@.ÔJf{[VIWE)NōqJ1ڑ`d/z05(͕&(qG2 W5Kgx'h doǥ]Nz#̮5, fL%:ƽ #s|Qʤȝ ;;bvO7ׂlwTizsA޸W%|?e*~UZ"HRtbT 71LS#J(ޥY6%;k7,H۰;WSgְ(QOqI*J %)%B ].m-.;JvDoE).ڎ< 0Rʰ'JtE)\%ڥ׸(mL$_PouEi<9 틵FW=ÐrBD/}]ʈ ev-8 #$*MF\\V厡ZQX^D iJ0.JtW̾ՋREъK=4B;*jcY$S2Qzؒ圡#},Y g'{Mq+){ KF[TEޯtt%%Q .|-%u5ߩJYhtsޘ]cK%a/ b(Q! |HlQ&1-C(](@[,qO`L0;n4^Yl I\tQAvZq%R^a^V/JSS'DŒsЦ]}}=.SM%}/-(c Lv+I y»t_% {,=A $J9tR&ݔG)s>fJؓt"766 odED UFj%S@kl  Uq1.JzHo2Dkqg$)m?E{'7Dr~Ml2khyXD]7a&/JS#io?c(Ѱ1[FX I£Enj#~lOx gQ"{Qd=Rb,"풣dJ%ۚ=~\JkV}lDUшIb'(WL%}!]a(ݠ3$sk%]+pQS@v6D)~7g_Vf:Q& ^QwugQs+<&EIC X"JjfoS!,hvGE+0dhnc(q;yg/,9tdM®w*҅G\"y_iGt5Wao2x5bɋ}a{) R`+ɬJH&eO.{D!/G=gv:?Zc!W%-2cs#D~{T% k\% r^!w~6^/ZK?7F'!T/|&y^B Hșhdn";ݍk|Kȧl_ PT;ʾd)~Gښ^ÕMʷw/K#\ !$]rD,gMfȤqfO)fxJjcWOV6"6rwDWTʴGM&27΀J=7tufvs⼤*OSG n̗+/sL)gTb&>s7Sq 4mp¿ Ti$WOI&˺QbFSKy$BͯT-JjN/.7WqjM(1=8srF%?*%;!ѧot7?6&%ȑ&~;%)&rRl#L$JLz_ѣE6OIgF,J[-ٱ8EQ+e#ZXY5G[$dj/» <\n!֡qnӂ}VӏI}hɺǃ&grv+Y_7yvw n!ˮ> -2z5 ZǓlv ӟ+}fdډݨሼY.'a{5/w'/?ï3 ~n.g8#w݈=5н߄-ʻ3G7=o!ѯwoA㏒C˦+?@֏¸S>bWe=ڵJ!0"JXoh~x7; ߺv.FLa`?v>tƤN`%(I#-(eeC~&+Jq'Md('<xֻ&4x u#@Vl5`-4pIJԐq햲Ip)hJuz6w}0D#b^~,mH^S8 ֎zjEbR[; [ӓ d787n }?%-d޸Q+}O/?0'iدDi@0'4 J@?r6WX(9 VzʓV(9DqŒq,)ǝ4\eR|D [^kpTr^.h)h >-D Jٛsd%^+(D D J`6 JQQ2 !@l@ fd%0M^z)}˔o6KfKi/?3`؄Wi>?jD x_G9JQ`W{M̯wDi=֨N;ݯ;_5lgl7Mg9//J3#J꓇BD"!|rXˍ|Ey|+ȝ1¾Vv[L;\gwfįw٣z w L?eh_QEOP<ZYQJ׈+,t僎|"`d lj�^jJ1x7kϞZ^'˱_OU%zO,U>/J Jϯz޾,(mYweɚ)J\aLȯB fKZ@շ ]) Ҫ,U8bU~dh+>? +TzD/kI]n(-(|GY{Ţ(7UWcEyVރ^\(SɈX_˜gqQ3tR+J0StO/k{ !(}C,:KDoj#"{qpҏV?@~QZAƣ\e2~'҂njט3/C e R%J?fҶߝťN Hn;};c2W(=/SwtNw*EOG+G#mQ$l^l7{U&WxWYa$_IIUVaN.oޟh΄ØpHD+5==[YhM\^f7 (M#TjT;>wֻD<սk5{TRPo^Axyl c\DZc.kNQʘY6lzg$lgϊi\^)'Y#V|1 2{a<-#Enij+/[{EQg=~,o:O 4_֒ L@oD>ض%BRVwRY'F}ڟ7otKΡƽ)HQvIu8}GC;9w]F q{ 7kuu[zuBN$fD^BC6ÊJyA] O7ѫ"1+ ~Uzt_"IziI0Ql{bs Qʹ$ٻȴH䮯FQBОA/BP³Bkgw}؏BE\xT`./͎-oBkf?5@XJ'(| ("%$ z`Jb%ND'v~#i-fhheCLDY4rm<o"F(xC> *7$J:c$tY4ANX/_t"$! )o`4Vj&D@D_N'3R[5ȼS1\^Y2sL=кNe{&KG,C@ҧ$}1$JHgIIug|}-"|9,t Io $Jy2sGd JIRQ隚Ig25TuNQZ I$?LWZCi)IJQ!ptLwR4BEQЭooDbE% Ri-"Zmv*JUȷX@&IHS[7zW.QJ*^Z%ː%uΙ$4gNg_UYz2٤+,ӌ)!Vʉ7"J v cT=)B]MMdq"~aYHFWQzY*mL QʣZ&!5[o[ͳ.Qn:nM])1\dÉ=?jJ0e0!-S:[/Íx ~FPQ:2;W|-a$=T(ʢV+6yK#]]$'JoK k+)v:sp;¼Pl~ć%I1]XvN7?eS,ېx%7V{wLYy=I޿&ew .Q!:u,M߆ É-vַ0'~HDOVo;ɍ)ކDI2EihW6{FK7-Mv/n36KW4+GY')r5Z2Yg2Ih-\zH#Ʌ^$oEzwo]qAg J6"J?joo{u{MZܧӔU㙂͏P|GIJJ/Z$u -[nx/Q~Iߒ9:Oޏ$)[qN~9pȽЋ?KRىl[M.;ihCkvR6I(J Ӈ<$|x)WLM!MʣvKA{r8v-/9L ٿbl 6M:f(!It M $Jt!*6\0Hԫ5 uˇyDK>Пr CvI:K7n<:ݏO{\ï#ro#n4X]BĽ &YQޔӡ ZE>I'k e(t\17ib/4Q! ! yDMPƻ}LJʌ:%JtaTQKKgsP Ey&eQ!k Q}$vD_*IS$p]r)-@¢Җ9G&u@ 2y.N~}H}3Y:Q2l(O\" M Jt 'hR)To\YKf$JkMEm9H~"M⢽aJvb#5M=D l$z(yI}L%ګ&J7.h3)R_"]UH&tBLxNqWtRo$+^$[BY&JQk|cQnϾ̍AvHȸtD3EiB%+_Llç(Jhfi<5S$7+{7ca7D$3e'|tb 6.tYJǀ%V(l}<;M{!Q5>$ 7Ub2I/[6EQJOBIcZE^U_uuHk~-%J3߹eq^BHK-"Z-px ٱ~@g:O| EQ"oSθ((-/^1Un$2B9CkӦ߁ϷDkf5IJ {wA'HCk<)̾劉Vtzmi)kHJ84 1&ɺHm;$_ 5FQZcT%:N:|M(IoE/|NoGtbdE,bї}o:#BׅD;KNNQzTC{yMW')O^*<\J׀p%<4cwǮ("?_AHhP7@c(}BrƋfR^dVyp2b}xX$y}dE)C{1%ҞqIȕ9S"œ#` :Kv)Oq&nwp wgWظVA&"M8dm2DCHQ0Mw QXif +Q,ϹoI卵/QĐ R{v?:* W'|QkB6z+ q[KD| dqaϓ]d|EW6j-_tRC6~E^Gzj]XIDm^~ "¾n'Ǡ.Z^Ha(ўTn wpVc(-~3 f(1H&Ibw)\ܷ}B3 \r;7o Dnry2& U}vo[9~.Q_\]xQvzm&/⾢=엤27^xy]1;Ȼ$܂<[؅MчҼ[,ޝؿ0]? ec ýEHA7c-#OSH_'zn~d9h@Vezצt.R9yr/n=Wzބ Nm/4"q~X^i\Tr4Yw7֑14Jyfot dTva,Lj7$TYr?'.m-:*Qc֮e o?m_"?#p'k//`5ߐ=ݓb|$~.-CPE \N<ǖ2j y>9u\?& xp!_OY+KQFƜ=ή5fЗW}/9Ll_ Pu;'{ sp ó R~N[ӷr*if:;}˙njFN7fL&pMgnB[/&^pۙMg;ݒz9\Mgn|/@Gt2qK J#\Di 鋥%>@D}SQjg4ȧiWKwO-dQBp/v%TQB%2 J.D e@\ʀ(% Qr! J@(B@PDɅ( QB%2 J.D e@\Rp, J.DyDrڇPDɅ(9ά|O(%YMpiGB%0 !)Ϥ9] E@\,ObU8LB@J|/3;mrڝDɅ(9If+| ]rn>iB% y4;/w$g =@\'P+1{>jtQr! J1_Q|s J.D1~ Tp'߲ Qt E@\S,A(vж(>q($Qr! Jo B398C Qr 6 Q@\#\\8%o U@\7î?'$NfB%a[g)%S=PB@vUqlW_\ Q tͰˡDɅ({YSgjyB%d7_,מjáDɅ(?IE 8eC QűߨyjB%d+bW7;: J.DNn܎]~Jmqt(Qr! J6{^o_zoy QgÍ46=CqwB@c0ݖ^ơ| Q bv4>+(%PݎQN*gC%dZKw,l J.D+^߱lu(B@ltEz}9L J.Dî5P0v`G(%j=} HSq*"_B@'vΛ 3 r s.v+5@\UANkʾzRk )@\EP JbbU QmEj]yoDɅ(Y‘طQVuoT B@b ڛW[[ŵ8 Qwb%fe*q%d>9`Z۰.ve]W J.D|b^ںr!@\|ݪpڞ.ĕZmOeNB@f^j`Ͳ:Qr! J& ՗Ǯk_B@eS"BsmrQ延Vi J.DT>}cs?J{e\=(%39W4jJնf{6B@Lz#T]5[ Q2ء|Fa׵TDB@)O}]Rt3[ Q2;U9UθNUo J.D,aopvuKD%ds"J . Q255eNL-'a/LDɅ(žBؗIN{,Hnt&B@Ty'N{(ori7DɅ(ؓvNyCNa J.D8`G::;0 %dǰwLGuv^yNa J.D05.:텟lvfyNa J.D(_a/Jq rϧN{a J.D 3"J"Ey)Dz B@<vBʜx6g8q@\!vJ?9,kٜw9a@\.p%9ks (% ;0 QOFsyz+ΔNa %GC39;i7 B@teN;nDɅ(S\{U؍*fp@\N~ď{Nծ鱸t ݀(%},F(vCkay n{8^@\.@(WgȎҸn;:Qr! Jz8TW=ڑsMU~nDɅ(B5\NԬ8.@\vn4?q =(%tɲb侈]:Qr! J郫wz );a} Qʇ m(SOe;V@\F&J ﵻVX\{nhDɅ(ic~Blu m(%MlH@(ru!v&CN %}EqmLγsnt -(% kdg&s͐i74B@si+4g)D}Qr! JnE|N{%ӹLQTi6.[vʾ9N%l wpmUVu䁛N%sD)_JJ)=:U]N%SjZKn [ JA(yŕ8ljڸ t e@ ;j (7ۼP R@ u8喸 p E@TEۨ@lOAU8MfW܊: J&0 80)F`Aps+k^'1i7Q2(%@Ė ̥[pZXA9Q囡 9aE.~Vty{\Q "pj.?3}"$7"Q2ʚsDUB*([B;kP܊D ;S7d>^ JJK}ٲCmlY܌DGˠ{϶()0^UG 9!.P|\du(3ˢCM^b@p zDxDz(ɲ( Pg>qsƇږ JnV)8"A؜PDοq{Fئ J^Qp ,4(p8.k+Jm>a[t^QTIӮ%Bg~ sUqoYPp3 Ci`%|yKGQ8 % 7rN?{YϽCU)h=&oJg3Q&$7bF J:Y+ŘV@ƥ p >*vDI#:pNz%pCpjmk[fݠ(bOa4Fn/Q2Y8$ Bd;`%=(}j%y%D'~7ldK5ѳp'Ѩ J|% N3mڐDI;79F H2q(CL7>خ@*c{ڥ)9+p(}Mufigbng,/9@0ޑ{xgY5S*n> ﳧ+DIYkLqI#'N q(mLD(7}r7y;QRdE\#|C\FQ>S_퓛W `C644JCÅt2rbiiXqnX_KOrI_,+}t!>L4Ƶv~DIsUѫўV:Qnjkb#QZCW$~v(=oRY\ YmP;n/fm>i+|rcٍ*kIQ!;jdL!U`8|H[3ps>d J22#WZJVj-p(s( ypdZ nnV<Qqvڹ:|5qKDKAK}r5Kqb~ J~ۣ{BtwQlJs(MIl//F #jpL`|dhr(-E(j>Qnł(X$H4[ o hy s)nBM.Dc*aGOl.t4g^U@f[(e'yU.[P3Sv Qt+>/kj JQˬ4.5Gx {QJ z0$RÏ!%yAOdtC6/&E)a!?ٍ*{eW ˞h.Gޛ(xpq[ X^ (aNCX钙2\>YJ'b6v 0j-uT% N oQA(y=>Ueߤ@MOtc1-P a-JYjO\c|]n00NgnVC- (m)g]>; 0ߔ@Bu-XSh)[DcQ:TaOqGM4(׋ۨR,T+J 16PE+T̬9;돒}t؊ҍ&8[rQSԽGGRN'xwFqsd8vEiqt_6d uWQzվlO%hr`)MIpAO{+SQ';aOE~X!nmq"WAt(}SRw t=|Jl1TET=.Y;P-='(͏D(n>Wb#EW.Ae|ڪp E̴'@JEh׊Rzs9R2*P1Ȑ&VQywFFD}3m}d/KUid)ơA ;QV[{: ϯb<]P2(1ŖD;s]LOp(R,̏Z5Vd?Mo;(>K3ńB\݋*/QbX56Cl`%p(1?x>u%RW*(1ccB=`%@&Qbr~bQJ ;Qb0G0mR%fgYt0hp%fM!l&\Jw(1'뢆n W2'M<2=`1E>H.sv2r (J)V6=`9y&JLӨ[v?Q5KQbID߀]%PW|ɕ6LH%&;2=`ez Р EV#ITX<;LE{ĝ3Q%E3Ķp% {vAkQLw(1K~ ')2(1 mb:*ܪNQbF'G (1RMJ(TRQbF擣lH΢[y&}dvWI)[Eꉊ''[MZc"_%4׊ Dq3qINCU-J̥MJ"7(bQb&FR8V *1(1#}vK L]d%,J̢$jxln侈tmbRvPbjQbDS܏fIa/J M{/RE9Z.zFr@)z6le~$B 2\.JLZKTUE,ɻy9DYc{N' LE| FRe\!J?7ld_|}Kq(1yw#y +QbUC7 {l|.9☸ I.%|m{64%ٔ9[)-4mbEV[|eSIJz4V+&(&FgM}%YSSAv(1j7l|Qʎ (.5GY\Hv(1F"՛0_ʏ%+**l&hDnbQNQ{%̈S&X0>4-%/rO ] JX]=lO%E:n)@qcڭ>?R@VBmB~C%5*s *xA@PF!Z J99aB9r*z[ J s.vylJB(b#@p*bs\kx&A\Rf@1jQ F(/SJ6>(侀eJYV~G1 J=ŤL'Ss0%P7Tz#Ľ4ؐ YY@(piJvɃ(aE*z&$XQXkxC*@?OmpMQ J]ݫmg>@|l.˫{ڼqV ߗ J8]S.F&sUqX" nڢP]fhUQ:DƸk,27 :QRKNTp%dGAO͏Qs#.2~e 6zQREhi7(޸o--[uCA4c'&6r8~R@D bKU p~X%-,MAυn'tQ3!tHȟ\Y(ibgYj&^t9 J%r;¥ Z76NE O0'PculHsBǍA4rNJU?op%Kr])߉DI+Oԕ#ǃ(q.PpC8x%|bUmi=w*DImpى )Ë@(`r͏[e%yGMt"FJQÒdϩ}&D} @[lXU+Q!ϏQ~݃ ]H4Y J|?=Qn 2@q6j|-.DIp5i5qh%\i*(,.ފ^2^ RVheKFsx}QKVOTx5Hqj§R vU04­>tŀ(g *dwD3M(D) 'j:Jnep:bƋQ2ĨVj`J8i\n+I}Bp>f%#,JB7R&bN:R2ŵlu5aTB)fl d%уvԌ44uR0^xFX^O8$efd5Fƪg'yIE(g^*Ud~Ym_!%kz4΁%{@8*k#MlH0oDI %Z^|υ긱TaA-co4μ@T$ {*ܼ7Uw>vALȈіVp<lbq J8RWVvMcr uS輀(D>ѴZ(❸6CfiŁ(J7C: DI-7;l7Ry7Q25PSqw(&/w D$.5GZRrotC@ J-Qś4D,2b-(]TE(ia~w s6$WIsGAL# 0RGbQء6,?ō?sQ2cM.r'iE(ieS1\i=WÂpӼgr Jf27ijÒ%fGQȁ*֊ y5 ٥(ʆb#e<+V5~5Q>#^,f],GW2,> JkAa$ ^,\hn1)]sJpő9ty7Ie Q2GP S/߆zQ%=V=ȑC=ZDtr_C/&?x1r(H\wo{P+"Jbf0jfU]%}̉ǕwtfgcuBQ&D fţw N x2\ NƵ7>TB)l%KX[=n( Tκb Jz[W_՚5pC|dQ Jְ 2ڱˮE(T]\q'3U(Y&QLgD(jk@"=2[FjD:nvFt46zQ2@؃N4ypa~ J*/dϏf;#Dyo> qgϿQ/LeRD 3bZ=ŃP6kDRVB,Z:*QnX=YPtx(YJg2[/dQ2̎2؏[t_ jm Js}\u.@s&vvݰifq% JVs*jX8diͱ';톽\Vd99ϣd2v|(A#ؕ+",)?b# |V5n kVdj}a@L35lTm4Q`j+"m dS;] Ń? ZF~@awy.vS69dK `Zzh>ӂ; D&NGuOH?\ %Z;TۺW!"Rܖ@zTV\U/=*i7fsB3 D6r i(Ʌ;KvZ'i&2(#?A? jm!@LاNa%S|î@\5Q2Scv:n4'm J4F}Uu %umZ*d/;ˢׇmuDt~NzsxB(ɺi;bbs%#;ΏpϬ)+QPݼs#Vl,=i7g>{DvF~Z9n@`eZvlE"*ACEؑ^?%m}+b}.9 =$zj 5\;nE)}cs J$=0jD"E~q">DFn\݆0~2(Y{,gՂ(9ڨQ[tadQU># jϥHQr+e%QqߒzgH<@#k@Of(YBl˞w 㼅ϣ( J.DR>V=FϢ'jQr! Jr}-MT B@,J+eҟNaE-pn%d5ݱ?8~v'`Fb@\:jVfs,cjQr! J6%Qe?'r-{_ǪQr! Jv0=Pn &(%[X}mvi74(Λ9B@[:V^^׸ J.D&݊-esc>< J.D..݅U܂4$ɃPVG]Qr! J07P_1߿DɅ(GaHPdO;B@d;amHIQr! J2%-i7TpFH Q?w;O 7~vq~: Qctڍ <#(%9T ]nwNX+i/%Wd;o~vڍ@|=,{i/X@\ܸ;gWp^xQr! J,w!z/R^D^ *UCQHQATTl(>(* AZ^CONٻI.G27;;7o޼#tD00SS!CRB?z?d!hRStSa""%iT B"6;f(R @(R3ްC.b5GSEJEJgᐍn moHN+) )|4>Txωp""%cOyH~M%5 PP p6? K.܊H)H)7bJ}@~ë~g(R @(RHy y_^ rBfl/KϷ3""܂ʱh9|9j>) )| 镔]FH9YߠH)H) 9]Ks>CRBR.ҐZGrG7g'r Y*+P 8:?xPPp^R ^h}""܅ Saskkr^;) )2d< P{ ߪy>gucPP05!'.y>TЍCRBR`؀l6B ) )B|9k{)}!k#7 EJEJ[!k1'[b[(R @(Rʕ8T Vao6~0ޜl@@RBRę"e[gC-,""\k]!wgW ~9wPP[d>?[Nn-qg-) )^L N̎Cu/fGY EJEJoAfqS rDz<""܌"!w_X߅H H r56<68q~ W,2H)H)wJ*0M }Wfa EJEJ'\ߜe/ee7) )v\Mv %(""\EYוא<`4ɡH)H)91v:fAL9EJEJy7M0V(R @(RXy7&cy "t*KSPP7dɹ ?Y""< 5o"`1ғCPPWpd~pB) )\l 0N&('H)H) /d8z) )!8cۋ7ź,OPCRBRl}-5r> L΃leO\p]< T;M ^(R @(RkQ ]u1^>m V(R @(Rs6wٿ|FHԖlLPvBRBRB?zm(!!ek CVve) )E_!俥!lOPARBRt!yOcr"AEJEJy!SJjn[\EJEJyA]$iS)(R @(Rʳ^B5r,AEJEJyBTsr0AEJEJyg(_wh2v"o )PPA_GOPVCRBR$,Ine?'H)H) (Ϡ1$(KH)H)(WGWQ?S{<EJEJyBA48mm5!KH)HI!7CRBBn""% EJEJ r3) ))f(R @(RRPPH)HI!7CRBBn""% EJEJ r3) ))f(R @(RRPPH)HI!7CR"R 2*R b>͹"%_ŗ9Q)2x"=CRpHIZCo]><3x{XXs_>P),&*I酰g՝7D(Q)Rcx>7h;{!+}K5 iKx FRQȞ=?=T8zDę5yEJy OA:R끷J/)R~"%h ƩH)`;II[Ҏ^R;EJ7 EJ\JJe"%ߡHI! 5$.a.$<& n֤L;HH@JiW]H5yI)%Z鞔6,i#ɉiq景vt|#8vE}ܢe|zO ue堦 m.HÎjBKo>[^UhX/s鍡ybF4APaLM8h+Eۈ=G+kAjdFjIiĐ/zs4گӪ<Qs<*GBJ[ _, dMTfMOⓟBgd`"kPLO.ķC1R*p7z oj3􉘶Oq'77x2XNN s7TK>4ă!Y k>uxil Q BgCGVͨwM6)?3y.zP"*_&k>u>ƢuɚWDn$zk(RM  4`14PxF|3U4U_k׫\5,Sp! ;}WXtHK8?@fС[ Fp5j}7~(O?;YZV#E? >cC;'I y牭0/I)'Ό}˭@ ; ;_Z>t83VOsx[: j,׿>`d_W|#RGe_LQ?NI3딜ʝ㉔0I%B)I4"Gq_06:AkK&Gagڏ Rl²!q vO39QA'0*N}ac-`~AJ(,Ο`ؽG5&A0ƒFƓFZ-X)q (%=HV9I()!@ԁF4|W-Q~MٍWN.%H/W_CǵFJ )aq:0ѝgacϿ&^I~'~IiONV뽐? ҵMxYAqH'&0UDRWKݻI u!")O~Kz{R D4?)նPg֤GHiDܯb0&Rp^{!`}Va g<ehn*I~Ii @ mT/rRZğB:{̍do>\ 2%f77CPH,RP2r):TQ|3U_:7@crG2EN Kd%I5^:jPJJ5 4@lGy'z %`Cxx/1< t~ݤdȇr7RQ4`dxHJ#zAJؤobg}xkMJK\?) RDxdRzJ<'lASV [Ds!1鄩x>λϐkxU!)5 f8R9M0~J~3W[1e@"֐d" +?d| !; R\iCR 1,[ _K;#A|347R0$'c*<^H(z{̤2dm+Tg^@aWR!?bȩ<~]BGԷk'Y5z#tQZeUFuK =͐RyBp7R )37 uP;c"pin RBFVV+C\=LJ(OEf xdR*ISBDYY %$q(`h^,4d4|1u")AW7t .B&֘F?{s+dkN X0y͈>~?O`[Jig ^RuLeCUHΦ0 <ޝ|0cdV4uI {l%u?x+)t$Bp0pwRJ_c[cAn%H:PV\n|獐R9z_ # z+,Uw.xw)a )a|h^4$lPpd[ WfŸ! Am1Sv()$p`uъGfㆊOo߇g`OH$>pmk>qHJrv!k og.-żT6=TËԹFncoR(ߗ0\$΄ fVbK#jբ[Ts5 W 'SH N[,01'q&%?V*C)#&h7蕔d&]"dD6CXop%d?el~Y%/ M1s2#IvG]|<6 % :T=+C_R:̬;6YF8n.g)~{N hӗȱ1\ $\eo񊕥)II/ 6")}#Ÿn3Gi#!:^9#,Tm/HJj&Ik?`F1X{ݓrqpgQwW|G сͻBX*ȍGJ|+ܾ9ӅvNX葔Nw@?6]VO\4 pR*^ZBJ#Pn'5~MJqbPbܕb.42?l%eTؽzX[}uISEkk9IBPϩbP&ͬr ;7HA3>hʤ߲*t4IiE" Ii2ɢe2ۙcl=,S!)}ꒈ4.X|]}oHmL˹"ˮo."!aEWS ȏACZ.E%mKpyM枯Ĥ:4C^6N:w4˝OjHBRTͤ#x&%}bцt'1 $ AmZfR+]>HIߋ@Z'RH bǀϤuZ[t-ҙǨ#nA!w[w4RMbȑ)SRBfwRbY9E)u %X{:dv;"{!%TLަzc6F.7%ZLJ#3@.IY)n?$:^/&EZV~yADܮW dIJ^ӟsd|2pϩP_{JX<@J2NĴq9r')i[h-m&R¡&LJC\H%5) -H} p}$]A\LJ|rTsH 3 -H)&큔:䚲>.I۶q )?4HiKRBGSB&Ï1]],hMSB/?Iz_тPoZj c)Iigf7Rc*Fejq4ohtleIJNQ"/5F8Q$'*pق4d cT6:pZ׉$eQAsG.%C$Q L^BYc%3#ԕ?6}b qWU>})IΞ;)&"ބlD*3,Ll.fM򁔖EAJl/6A @Jΐ3)}>&`$%tk%11 Re6Ig(9L1"ٷeh`X3LJz_-Fv * ֍qeE33)0OI2SɞIɰX a VnH;G4Cl0+&2ZY͛E*,5:t wW RjJH&4->(v݌qaT(}`Z )Mʋ0Վ %%9!6[FfHl,RPZ}7NJAAPf ڢ\C F~̈C,Q32%kbgR- @JU6 Ϥ4$48iHJFv6D(y[[Sjg6=MUε8y6]2AR*X!͑~K|]z !eF%ʔ$[oH&; xO&1{bϤTF9*,_lRD45p8ߵ/One) [R@J(TEv.*ns! [3b$R EgoQ8,xX|™8JSIP<%rt6~FʒIɉÿ`F16R./yDJLjrY+uRjޡ@k|ōBKm9v+ t*&\Oݚt3+*yq$Oʺ*B],RkG:[T8h¶^ #JBu1F,ny cp%%]cJ3t[sonP'kW;S= ο]>Y4H4>*Kg!l3Az~M+&O_TEb bbp,"ޅgtyaXf4oDz0o ْ_M4V|]1鎇|AܩČ[xNOtpe;%rdF!G߇!{7=ddtYBiMLL-V f'n`8wϳGP{Hύ4cE&%5U{~[NbpmЂ?lS01-Şϫ"&Ϸq&$P X0Bp@?kb=wcbp"Dfdzrľ~۶|X0 rVM-mC}[q=jշ~ܻA! h=g;yucAWUѨz7UT|Q[ۼ sa)l7(}C~U(ukt3i*qi$ONRe#[ǥH&?f?_ bƱX4)@іXQp?G̤4FOT[H=>~:kyO3W7pfB5lrDJoI`,{8q~"==88l!݉MFL4EQR.;eX>$2i|YoYO'g2ψ40(mAԫ5ҿ\@n.m݅?-:t#ZBo.4Gl*PeweW]vzˈTy[[7pgF՗H$U8}Y׭Q>v_=6ep×rH[>w}%ӷ:{ѴkR־Q@uURulѻe.sYW~Wթ)b;/>آey oq;+;; &j&ukqIVo7A?>?C@65fe<“MI& sLմ5̤9ګE!W\rLF]ƽnH?CAӹyݱEФcy=ۡI;AGDɮu hu.;MyWQ|+6m;ٕg'oմFi35k0voy_Magmt3KQj֭s?tҊv-OϪ!ڣ|SkvhtdW-ꗻVWcgՔX[YV*Tr\I)D+\҈>X![zҹ>BB jwУ?qT.$D7,p\݊ZYv@B mSRwAfqwBk:]ysIТ }~\Mw8^LH(t;5qw[ج_ql^M:7 ܷVgVّ܄ )nyue4 n<9wvÓjCJ^yмDT̰qtȪ۱2 ׇ}{u-qPpߍDp5 $x0KrEM6 D&r[]{SYg27n?l?dr-QaNKH^k[](HɄC-jI肖z&76:1їH'`:)]&C"׻G2!%)~ <d6I|Ny㳢>!KHaٟcC8Tu+Rr!%툻?Q<2X {CP-l (RNJ EJ"[nEJyWL1gRJ?lȄVO3 lf%] z#ŒJ.fnϤNWL+-?|!Yr]sF9r&_tn-g=56!`~=KI)=U+[)9/XFq:ii/FH?ݺr(4Wp8<1}M{$،O[R.jY>"))uA 4 hڱI5ˆ\JTc:4egG8д@9D {ɑk ZD{k4G%.n0GjII)i~L8)Us2CADQHy 1ؽү_m#U~#bM;3v괁E5BW..F\$WhmKs㓚s=фDǰcR>uC>N5u #$_Gv?P4X*!4"z#CJz]NHB miy3_οIlٵR1O85}&](x^InХ)_nn+'xҁcx|yx@pSkg-v]hͬ:¥q?ߊC܈wWRV5_l*mMƩ.GDm@()2>O }a hLpQih@h%c۰.P LYЛ !RKL؉q~Y^ߌϟu< )}ot(,wتŧ9O'BIip,k2Khȃ^ ڀy[ v;Eߓ 40Jۄ7~٠՟^c$zALpNJإznMӎ."Ra 9)-*lmvv9xJ3e&x$u55q`m ^.R^ ޺Rkg&?JJ_.㭁Pvqo>Q;1d~!I<-p@\e9j<3ԭx={t)͓Hi#THI }eD,R6ħ#1J$OЖڴBBx׾LjyDJV'ރ4yrRBԆ\YR? qa~q2#u;?rNil~O&-V8>Be}AT[^;l&nr/nl"%/aT+r~K,$3P񲾮":7c9TT'dz%V's0ʺum0LJxxk$5..襑xzLw)i:c'Ұt?$ŋdORh$B))CA{ZZp7WRcRmDw^n:%5`34g=oTxu*s}m5-z,-0ޔjj+AqP#~1sJmsz%$]W@(Tጔll9a@̼huP,C@wչX6$Y/rbNJxf}>p%%{>&yek\(F٨߳;)x'/0լUsxVэ l݇[LHJwZQ$ ;ߪd~A!TL!3%%0g FE_K5yH5? oF\lҴLONJWEokxa69#1i  HJ@(K _9;)sJH?R:zH;)2 n&%PJ}D1_X[ n#(AI.|,fJJݧ5_:)qb.ȧV\+Rrx:Q.imRII1?f)!Lͤt\6w.>EYӘMh$dNs0~%8: /{ļrW闚 WkM? =Cl3K)S<@oeuݝPR2uq%%c,:|uuXר㽍P_xGHr,X\`B/(TTy<] jԉ$O8,;JA$[h7So{wRBe>mHw&:B~e"{H[`:mu/B1ُ\lA5CaT%b߅LrXbEFJl!:M %~ eϞȇ.[0 H G/mxƯģdq: IApa~Xf21:JTu}nh̕ZFJhhḍt$_F N~\ōLOq#$3YI\D J$ )Y"͒2~SҴRu#4[3 hS͈ 'T3Ѧu ) R0'eI '$YyK5n\9I dVp$EH;/+HthgPAf9.Hg}x7Rz\_YgSCi3T*upR#GV?qC>BeJJ$GJJͅ % -=ѡIEWh>dX-\HtCX1aC箋vI#Jz6~FLSH #=61xJ{ R:e`+Mw=4=*s%%m]{+IX5Hh/-I軉m>8,n*:y4~Ws_wӀCa%w$EJJ(^ XgS3ٵ )%bBJh^xI nz3br!%4ԧNSю~ˇ(d)1\3Ɨ1WRnH__7&[0Ỡ'>gOJJh$u],jTW=һR3; JJ-,{Y'߯ / %p%z|$%4cZ39Cv}@$].>EWRBUh&?3BJ`2$:$q7KJOBt&&AOXD䕔t%YDJ?a-A !Z)|EӸlY#)eHMruZ7Dž`"eMJhWR⻃̝b7R*ia -.A}܊mp%%'PP+Oc߾-츱 T2=Gԕ^& wd|z&nVf&%Wp1r񅔺fI +>TTСnnx암B˸+㈙p/t90.)-3qgut˛.Vp%%dہIiLJi4M䍔ƼsPy,8F# .V$V;7.m&7_FJ1y_6` J:vzgfo.UΤ$C Q ,L#yKh_HiYvi|0-E|칆ڡ7R2YjE PgROp#%A2H/C1m7*sӑD^ԴĆVӳpcRwI 4Y令Õ&& ub2Thj㑔t兤!Gqp&6C_+)x_;4-xkv /o7\I)=(^)ْگŻDJ2z+qs۷o7!I 88m /Ű4AKJJJS uki6#u+ʅ2%%o֤t~X'R¢/y@R*ERC3p o+bg 3)grͅXw3s7RJdM|5fJHZv*4EέTFŪ]RH)d,/;Ś)%6;-t\qBpc8Rҥ;/v'R>=UR&T$J8-&T4;)i 5,'(Ϥ{P̛"ANJ1: ؍ρ"6Qz;#%]I~%#eIPFGb"L ?DGRa,T/dFJ1hV%hmXC7v8k2MKQU鯥dRB;Zi!2r[j,c>θRV7R ڭaqI"rHuhvUd%FZn^t}qD=EOm4RuAbb?Qc>ܹ||Q(3cY{8&(ϓxK;@[t6``\547fH.4ǵsc~'K(F-ܺ}E)&ԋ<ꘘ:C "I11hFZ iJӱK4+"p7ϲ_S|qL (+ӐZ]6fgày۳~̳1mo]loB s%EHO)ӣxh( ?#UWbF)ɴ%D?ZP \H cY=A^d[g+;v!:ޚd}xq~24|ˣU㟾0b]U=2vBA{ ¦]Ը~ $3_o7:O*R11^WWi|l1)4YӿfN88\"/1 mmGD#Q]0 㥽 lRf&ȫAg>;kSXH[ϭF|/ XBF6m/o<ezTUy&HJZTǻ5ɩ?r~w{dtw=0]Ys ܭ=gGۿ@ U0w\-n|Hw/ٸi'Ap\|֭yuOh翵<'Hz/'v%.U󄞍;dԛw} 1޸(Aqܿ߷Y~/A}q>7Kû]mvJt,?r74j'17C2=Y)֚pff> ؗyL)y\ۥg Ya$̃ehA&;ð;C(RR^W֛=LJy0r'ס}$"%wAsE7 +CC3J\kۑEJ ٌo~{:ts7h]pNN5"Vot$g^ {KV(Paaz, `Q+r="%t鍣˕I"`:aZ%hZz!kՉN9!$8fzOGH /Wd߆_HIKFEJEJڹB^̗Rz|iD/EJYH 4 rMJۈ$g<Ҟ`EJYHIk*U+ؤAZ޵}sLJgjZBRGRTDal7HJW,8͂ ˖.z: 7RYf 1=X'Й`q/" =GRJ2[>3!s&ץA0Ip=ҹpB{2sRr)kR|]SPoÙ૥EsH;ouEߒ<7dQ#d/e))폫Fno`x/NjY=/.&!A"h'Gz .#M'w>ra !;ySRr^F^f[JHT(и8tnsQHim:Q$Jh5M0BlMuIPV~cј mt`B vx\+*mG̈+OH ļIҴzz$C:ֈ[L^`x }aEv#*A ug5xF7jbqK{GB#?>NfzGІ m`qqqxz3E}r,s3nȔۈ;5f0 ?^H-B/dW?h\ܣ۝nG(38-IQ:;C[zHpor)n;lV35ꂆ^3> ^'fb2^ڝ-V4-vNlSW;.3DeuBj5 8[JJ}g#z #E= ;œހ0zAw ]J'\AIi2{VHeq4q_:)]Gӹ(~2jmy8ls'K$~x{-~z}iLWxT9IEv ݭx>=$%_T>`|3n'e*8^/jvXtm,eghlQ]ć`( 41t|rk[|rSHCTV=$Cgׇ̃)G{i5c$L3gs*ZtUEYI|Yy^ fo Q e@0H+-ߵokt"2$9 #BKkML46ZaFe%bfC3e{ o!^PPB4sX؆=:?I)AߩQ2j9R9)?l^AIiÁlk[A]=; )Fԯ 4`{%8iHE7[NJ;/a2mc{kbsk'!]|`AK@9~tyo0 čq֊οˆsM$zw8a,"VN{"tZ_ќG gOv8Gi^g˺$8fhf'<26q%5xDIu8>AJ@\vDK\W["XB{ EN1{|K*A ޚv{Ha*ȽkZ.,]X&ͅ~ ? `Cbuv8p/1ME][ѕMJ 6t&R:^~"PR*]ؾ ~\AJ ٯ[4< ʝװ+ ?\C14q I (XkG3f͵smu؝fϡ=R09hn&i4g႔;:hVڰ^)OzZc8_d]D8SwǓxrNd) u)$1tds>BG߸sC0%%MΨƝJ2bq '0{",HIs)I WO5W<Ƥoa7Jk /2SoqpkWFW8fjj8i3r/k2;<ِks< }^>8 y]5זga] !zI Ncsйv /@zB[&S_'<_ZހrP:wsg!)ޜ#u(W HDM^ IIPK*Y(ǂ7WvL*${)+wዃ |H_9KxU7'x&.~;){/.`d\z#yB~ILR܈53)&hn3&hejBY(M{zIIџuKRôh5mS\8BAԒ8%AϤT@(qR-\!А_ǪtcR;-ݮxR+#)Cy>y;w[y&!ܙv#aȨE9)=!QL#% qN{HJI8gdf!)e~T6,mtRcB#?F11 Xrm%)5PAzdLJcJfՅvq>Ɓ 5PDdcv0v>d(ރ=c^Hi8?,^'.N[ቔvvzVHB.N,RTWEM3 z!%[ˢFaRWk j`>K F^v}$%ęz" x_m`j.$v'cw2)G=/˴ȈgDUTi)L+EX+~Ϥt_ID&CD`c./vJʞbnTv?T]؎fo_wMD96b1fDu1K,I WLcI ' ɢt)an6yZN hiB[_6dZ-BqG 7Oz"%+7QSd"i'V RscrRzTCWR]HJ*"nBR=_u]"k`09BRoxqS-”ДL$LHc/Yb5+O)7*M-fZ~#U\)iy$ 'Y3%%u煔JB7 '#nx2Z@.lMNଈի^I)W+_?VT#ExrKЁ/NZ'Rc:GRJj=fxf#)Թ㩫4 4>oCEM&n |uѱȳ}h`=/{1{Bh u+ox %TJEe^2xL%iS0 II.8Ϣ ؗp,x-f[HJ 6s\O"dҔP!QW{5E_<塎Dl!c&IIS> b8B:#+,))t#:cqu%3)|H!ߚǝW~{k|$aBXҎ=I"~a,>N?e(i+)-\)ŚF w3ߛKǝ}XZ:Ҙ1 W֣K '$%Y+ ^wbv}NJOyPd*" k9͸r& { %kkήn$&hoBR=;)*c µP M*O~g3GÀ%B$/<D$dވH"hʼnA7R;q€rWOѡ&03)J.avܷZ$*WRJ^Bн:NZ:3ں=3RTĀmQ(m4~T-I '&$_I*kSn.N"okOs%MDJrp`")%bTuTEU bb/Q%J]'qe+45Pb!x0BnaVzꜦ}B\ӧ0H\e}bbIIZ|UCxhHi$/4E|"o5q*mewyNL\H<.J|AyAEVVιAjaQR%dBJ2 _ýtQL$ÓHf:WRҴNυΔǶȫa䓗&l@a-e- ע]q`tJ-Z 8a1 =\) c<~:OZqTn'P"!`(jJȠufX̷\H Ц(D[^ƑJ> whyT\:%I8 .'O'ߚQ=a'ur3aH uYd:hp~7쑙Q72)۩9:$Pf \jfH W䥡ڲtA $'RBrX"?𝔴oY+̤VOjas"+ *M@hҤz(hI+EEQD)HUJB7}.#ݛ̛Wa7:JSKwI_?,Eaȅ ۙ-<(Y6Ĵ4^g @ 71>@nqY[lS7gk1( t2J;7`!(MUbq [k}??3Q qI(mnJ,pWdgİ]uP.x|*5Ma=r%$$;DPdmU뜒g"r N%|ARh|(0PKMABnli%Qm-p 6O+3ApYrIAiw<9Ѷs-<5)9(a.ݾeL-"-묠Ji#, +^+ǃ;2]\Bis}DǮ&QYCte,6J*P=V.}R7by{ձNv. @laav%JRAEbw9pDMPTGWyLEl3VӇVп7'iVl Jc)J AI -16= JLr4rvfdT`Ղ-A oA8?OMr`G[@ 7Om;t͙@Jy$v@A~Ai{6tG&simI?҃ѠL1!},J|Xeo(Kb QHno&6j{ADj͹{@ _@-9 APj$Dk0w%h1 Npjʅ&⨑/P:u9 n&R‰c DeH'/'o QjNRg\ay J'41m@~4?dٕi@`dm4\ gK kcoJ2Qy8.ZyktbT;zR!Jn)#;8n3NyMa%`HܣoXPt"KwV(E!DܴJ8K:(a^K\M0# :7 VPVG!ӦDeڋ!x AG+K4DlP@)+XiVs;sFhF亇l pud!2DZU)sU_DksLi-s͙c8AVIx7;"`pxq$0P%d JQz (N,iPfKHrY!n p;)r}-uP zmB痜*=PB/yܹT^Js m J{ҞtU ]$J J0\a5mVk2kU]! V`Z KiJ lFcpJ6qgNR1D/4isGng("|rUTHZRP=iXXڨMJ??,JE%NEx`9thCzʹBJ]{Di=SKkb),'(}.07 @>$(]IL(=p皫g`+&R>pZWbxүhD%bp5R`qfgWp:  @ v-,R$B f@)v' s %W84x2N #Ìq9缷/Pکi|̬҄"DH~/bWs0+/ZLFP >9u?;~uaZ-PP+@N.8!0X4~s"CY0fSP" _0 )=Gr7yv8m`'@dgMYѰ#!?V&SVS\$ss6a·Rw5',~ۓ'8 = ]7<@g ^;V6qJGAؒ6 \yޅRxp,5F#C!|t4ԬP߅6*[iYG{)8>v6jLe8j m7n?O w1Za8`}-a`d2.m?>iЙl3ya}w~$)H eF2y C:i-5!]~ȩ0;-~.^ahQpR.*qRte1_fuϐ%ȷ[+괕a{$ѬZײV<[XG.xrc?(%? RUصvC*iį_{pKd8\"3+pzuKR6.)6{"yԆHb$Z(]svh ipQu~8BX#ޢ| [qvvډOG\mk1}1[&]u]dT-HoM'-I[ uᢵud>A~@[FkM)>/s5;xm, ^I'b\,%gTPs_`&򉇢Zh랺 ]./2t2pKMw5)6'JOMMX>Vw`3gv,~n$)~H> 5$/-]. '\ెu:>Xn&R&Kj~Lƽ'YyBIŲzfEh?M~x7"9=.2=O#Igz9ye@ɋ鎙--r&sF'nn_~0JGnFݷ#%lGdn8<͂z'ppexx\rCA2ad&NʸPB bY*,0S@ɥ TW0P%RdwB !p&'J7Bvg\Jg頄sߨʲ@ɤ|Ye3adH,@F@(%2>`Y䋞&u-pAP1J7rÏ,45wR>HYL f;() J)Y/` v@)Os~܍ .:Z^;P諘~͢eIgyv+&R䁀Uۛ#oPJ>oVJEJ):xvJzmz =jm_փQeerlW+ òwGQ7Va:LylL)5SߏA 6(>x܂.^[H w[,nV<50*)ꩩ ViVqe;ܔnkpJb58(kG Yܭx^U- R6/@Hö8\!O#xN(|W 8a`a򝝁r*qkTW`ZQ}< 7J~A(^,d(U7->GTUXzS2-_= Bwԙs(ou*"Hqՙ,e.TR +uzUOcN/@8^'"l:ˎFǣ[ozq5ְ0|/>7qW%J'tUZkZc:k|8_2d.7OަJnGeݱ4w*DB*v~ GW}H}=j/m/>xLR~#]|fjHF wҐE$gxhUC(B}޶XO[0MI \1+&//>#}*f4ȞoWoUj&XR`QPJbZ0/sPP:+l"'0K)i02>+}I. 7YdEԘb!M2A`)š'06U+%O>q97n/ۤ pr/,,azXWAG9*VD8\_xKb%7*Χ K9y~\8^m~~q &` $icFZp?)OgΏ?w9{ڛyRR+[II!bяc0'FAym$ˋYB5wIx/-'(AJwT24{ǜHi%Se鿏Caq'䥣]Y>>E ˲~x:ك!ɗP[/Va@N=zc6/P ْbMx@y[VXꭁ |,A${ޱpS }Kք  AiK~>;DEawļ}O>N=C:z0%p龞^ur/׶# rZ vӈ& =BSxBSH*r#~yǃ*{Ş!ø% 177GR {9-7b0[<#nJ]mەf^; VŁSLeo#Jݻ栄}Le$Fݚ$_AM1tqm<6pZu jރ[@OB E%󠢝pG?1c=0!rh=dqLiۄ !`Qjz_.LƓ>/;ke2)Sj_ K ;`S! fPS) J\|887)e>dЛL0ࠐ8j3PE,E%ObNҧ-)!/Ss$Zp:HbeA("B9 (\`D!( FdF3 JP6Rzf&qWdܝNp'~h?t;i,-W0!Y֋R-TfD$DO 'Q`vA1qZCj& -$蒸GLH+YP2]7)lQ"̛H$HHaܭ~L}IhH1/0dG?_ҥOŊGvL]SghWHxNg'Prx] c$tCe֖#(k1p\ĉ#*-~[7DSbP{ MbGd]ϻB֨] a-cJi!DP*'CZ- }=ކw\19ΫD1>]BIP""B  Ը=fN A-j2*Ǽ}e)̴$>Ӂ{I[_4zy<S- Rw\BBiPBOB K)=3Y @c^6v|" MF[ctPz GSE[vL W|Jի>j%h?G` 3uSexîzk\jh#(IXE[ Jbr'+רJ؛1M,y`g1lES PijG1JC9u:Ь2 J1d('Ka&zukkj `5O#s8h9=?vJ ,pL^ ?/9k:?PJ(|@Y2aNj'*"0T_KSgu ,ISꦭs@ w _y>NVd$CNӏ[d渚OĭEZkjx2ܘl6Y8ui1L(,w[ Jj!;BZKfrn1qinfJtczn .Cfj J=Sux< 6߭7jEt"HWo )9X^!PP&'PR&7OśV8[P2\EžukB#az 4D|6gReyRMvOIC~nX1h2RAݚ_qJsOPr @\8T̢7iq}'d2J”.%(o $L/ZmVqMtmS!NCm *cfAig7K, ;B|+Ui>RZC up_ ;͵]~A*Z=RG(Y|> K ;ʹگ/ ypJ)۴~޵!(iN*kopfL>/D/FV\C$lC|(U$^%FY`K_pFrIw14Ejۜ$}SC$6߷m d]%,DÉ )yJ"]wˀS# &yW'<ʚ:o2 "af'OsyW؇ROuB|o3A uXn 8 J(h ˪ "ȿG; a,@>LEcSՈ/-#CPF1%"qldSQzhLNmk'5PB#(Qm̏ZINI}Te]鰱-YFp,Z9m߉ZeupÜA"c!PJ"C _M>1\aԃ_ M5(jY;J4Fdu؆pXJq X@AiuYWvM#s㡚, _?PBU Jǃ)9/?&%iCY&n; JihE:Q~A ۜG(ٻaUdcp<%u}+夎JpFL\ -\S_׋Q6;Q ?b4 tQ&)q)+GsĥpRbHY Hp֔.M f0[((5 R$9?)Xiҋ[ClNû=K PB0b.j< DpJ|"(S^Cr J̾ `2JtJ+ĄwYׯ"[F3B^! JZwa& F#Np~@ ޹.?G/P:; _ mry<\]\ިY@/MPZ"ffW\:?OPwXA CĭpE3GM'(sS{X yo#Tly"NT}߳Jv<ۥL(:(qJ^I5( .$LI>"+zpiqh1ݲG<p(QZZݤCm5NBGrDԦt JΆZcS8\/e .=B*m[d^kL|"Aؿ* S@kڵIPz /Pһ⇣IS> J-9+77(<e { /\>$9Yt'.ы{^sxP7OP(EnOBey3~AL I1JnLi|v(uk_-8Xi4[YIP +U+Xb0 ;\DG{aڎT|(7s(C૊ޑr%? VJCI S;ELVsG@(Sd.݀mӦaPeN,qvcl}R_' J5+3Us+EHN|#5e3\:%c@)8,Py* rSPJQmrHkB} uP̆#pM/)@V8:7줾k(G6ު{h˵`$;Jmȃ[`VZOSJHpҗt(QsG8JIJk 6AB6/vPKY4L5]9Dڏ[阋9xğrLi:'fˢW&~"/P2gAɶ6i`:{x"fq"z$*%*m@(w|RMp}?4҅,C=it;t8Ɂn N8.-Vx=fw`۹m/{v=ޕ/%6 0ua7Y  F]ۉt}mH[!O3;|h1bh[}7@Ս޷:;m1%Ms3 R+aIZje O@OP_P_q'rQ!&Lsu1,~6 C NRhb7c&yQrU& bBt"_hX0TM)L12c|5II/;+Uh]>fma,mo{0kEvgݣjqt-bm|0К4ݽkIv( -~ ]}0S{>EM WE{J 3Kw^MG/VreeHS_l2 ؎&I0=R/{Xaҽ_̀ỉҪcSی: Ϗ/I\kajhjP`L\(\f{ּ\Xj=P0`ym /wlIȫ8&IRC./aRhGe"giŭeA>lh]mBry0bvwSoPkno(1Rd?rv[ig48/4q J߈4m$7K E[D[rQ2~ {c/Ԑ F^̮10}ҍ;TUsrrfi'=nSEHMqOq/mk[R_x=pz%`W\-6v$ ag#fG4; з1d~IQ4VcEȈ}>W˱>,*qJoWJ57b4uQz"tL6 .bE&Ev%0W(FL > K˾H^c8QmNu'=yvAQJoӡ^lܸr}#{DLCnfz>-Z!l2}ӎɏ4f*ifu?!vqY$'f^^>Ut/nu)_uy+ nݰcT~^o|qݮϼa J.1 z=6Ő59VUt#[cz64Ue1L6h_^hݬTʇ70riz1Fws21,mtpuM <V#`mk7;e/s hQ-̑ղ"Ѭ5$'5aː0XcS`,YTVnc>h0PW/o>}# *eS7Ck}RbfQ]/5uVeJ,ʢ;*|,i5`ٔJYtRL[l>=\JYt)I?2,( ΥS;3+fxRf?B;!YE1<4w SVG ΢,R'Ȭ{IwJ]jz endstream endobj 24 0 obj 66605 endobj 16 0 obj <> stream x?oG1$z}@&ZD0((ZhgF% ilB-R(DJD&7pp=3kٳ~sgf˘݉֕bx8`ߏMlġc1_˯c 'gLhgmWЊWRidS@o %%9F6m^o) CɶM#6,oV&䄿GhX736IU1L1?GȆ89I @Dc/~qus>cT5C ) ~qus>csVأ)G{_q`ݜ؜Uv'nX736gUS| ;u| ;u| ;R\[[ 5lڶڵwGUU> Z']p O WnJ^^R>wN|j ;~%LmDRxq#վt޼VRVU9PcD{ T?^Ƥ hD[C O5iFIq[U{zz{ fj&I^DiD^CN5::U}qo j1f96y#U6/"o*YUU:ꈌ6U$?^k9F/^^T+!#*U%c_&T$JXdwkUώNr䈂JUI;VX>ƒl!3$CJJjH7s_ZIQݵD.ϾV҈$W3ݕ 8S#yRU"ɉu<|*^}|$^XlUGp$JU$'"?yDf;[HVrbk8S6M[ԜJ.]䕧^;C#|5NrJUIj{ȑs@٬$gTvF ,[S6M[#Tuo#0`Dt,^KXCuT`S@yRU=IoS0?g0먤^@ h%!:kq)wHoڀ5;Fv$RUU) xIHezl"K?}G6-9xQZUIN;0gp bRY$}JUKxZc` ݲhNE%XU%9t 8IUA޶QиrSE(XU%9ˈWG#Y(ec x#񄑍$uqq/hD.XU%92z+ɻ;AʗA~KreG#Ido%喐]e$I+VUIj{NRe @}DWYZӼHokTYʋU/U)IE~>aNWڞ{qPw?GqH*k}QLH(F]M+CoysvJR)ďk𲗽엿嗾8>/C$n4U#wXSw%*nABR)<3puo~_\ŋo9 9G/2mid6%(WkEjג#iJu8?x%u~C:[CMR3ſ~Iߓ25;` kݍ/5RyI1T3︼뮻g9]s]pa~~c* ڼ nSnb}t}'>qv_YyM7=# 7Ϟ^׿_ۿ/^ܶ/۩}>wv?n{G/]tiX^W_:]O_{W~x뭷>#/Y΋/O-o::Zxw}7|_.mӜ3K|g_|x;,`anJ?3X0dL(uIrHŐYf@2M>dVv$ "iNK2! ϙcLK ,Gys!6 Ґ=d /J[8ϘțSeC&l!`*!mCfe I2"Cfi#a8|!s5!`6Qpؐ` 0g2KX iCfeU8FQÐ 0!9fdMɭ>aJfBFM9U?6fL̙gF#1C&l!`BIC`ꐹŐ 0!(8ldM3-$ ISeC&R@Lh-u,c:e]Tp˛es&2F1C&S%Nd&MLH.dDT S{!s5!`6ys!6!mCfiI,"Fy s&2 s5!`BQpl 0g2+[H7 2K 4(L ΁ƒ:Є[Yʏ .oH2K49̙JuRd!S^-TJC.dD ^!3j\6@+u03 :b,"@а/odP:d2f:bPYi{2K[c7 2K6όeC&!`6dVv$ be 0!9fd_( b:b,J[:d0gL(oL2i gNO@NB2}N X;w@勣z*%°︕#Y:w p{qʛ?qq'XO/`(7jԜoM]Վ?ϑ/MoL{1^;7}xW 8x;}V _-ud_;:SjZ>&ǫE:7JGZI^^uwwӁi*KIsd)b5g_o4uc_uwwӁi*s`)S./u+.|-;r]?yWv}Vz3fJdk qg:Py5=jLk ~Sk&$]VY\r } &cוgR섚i?zKrv/]`$~F}Ҍ+{ӄ˸L۾{SyN)ArJu͐e9k|Qrpޞ6v4WWvhc=㾾‚i]Zxs.ӞeS{tn1ب7Qey6:Z]uŎ"GfyS$R9|Λ\9;Olgk5E=Xtljw̙T2[_eYFso#cTי4;JʻػkL>G~u[ߛ348Oz+l߸Ԯ"i %K=榖WR!Ŏ珝Z>JQ{`W~P- F, E8)zUI%Y{="ޑe;ی'8ʾ1w՟ۗYvq/kIq5t-9ayTI^j1܋]khw.#]oi0fYе̮7~gb7hܔQ}Ao J|[=4Ջ, <0>ZXUjϳ]]S}f%껸wHeA2@͊q߈el)Y~w%ڠQ}f͕Zjs/^_iXmׁw7[hU<ܪc-{8uo4MtVI}ߌ'oLڷc Չ9NIuP$ k,2[ I^.|} I9r?JFoAU&:+wf/U'!fY9_Ij3j.Vc+˚W֗dp''=`81p}q3M 6JS;~Gg\,=J{w,]|!]vm[HG?i9eM7}!Ū9<RS]{y' S =˅&<kwnTZcX{Z)ָ^ֻoW%$~ f_ƍj,/w#w֯ .kkĸ]K9Qd^w57hđ:LǎJwaӈGi S%{kI왥 {{Z_ImM}fxww9%eC,݅O2;Dz8XҚګ2lAfdwvqX=x#;)?uԧ'0I9AUy0ymFv]o3\"[z%XpmCד+k^nX\}$Ltrs|~0rS:p0j|,ejeF&ɥ΁` &T8Y" Ũ `ysڀ!0vDmF`H4Fˌt 2&m-ƀ7Z@\P1<⛃MywG<-I2w/`Cf)? ޛ}|4vx-GGISˏyįE>8JI/<|O&Ql-@he_Ʈ _+\;"&ޝɄ=:J΁py 8ߓ {t4[ >fڇ'#"n1=GGIҭR%#U䃳DFBZI6-+V<]g܂1ݝ_o*_UR꨸ I <' yɪ] q4Fr,A-eZvܪ;zGyz,[c(xI^r_ngz?u[哴7^K+Qнh>!Ge'WFSc Wf'<`;6иW::̸]5ΉqO{^y <&jx 3G][4UXiY$ޑ"%YJl.3l{P2um׬zG;]dхھ45weB+[o4Ηӕ(ޑލ'c.QeʃswDe9޲]}5plm}{{<{eu/a26{79q >rʹ HUz1ߝoWE/IZ6Z]i/@s뼷&]Ww%Ir|wHR}Bo[M"u&in_e|[DEYLNZşxzo~%TrK3:ɮkݻD:R) RdFNy uݗX*RգqY5W:Epߌ.I#L*S=ʍQ|Hv^O^[w?,X_v`龎Vt1.vtq4XreԹ}P6>{e)YGT>慾خv$RLW`ׅ=Gbeor/ؗ5n%e|] Ug+}S_VRu41wd_fJA=2m챾L{QeiZtqG0FS<-Q]ݩΪH '_4G% ^|3`ɏ8ݲe»8vT]$խ'WĪ.cq"%e]Tnz$ge1XL]s UjeJ=pyix#kB2wq}׾㻘Yxwc8d҃ayYj.z,UOrc,g)Srq}x˺rjAC[e-r/ں+rd_K-שׁd!Gs;xdY&2n]QQSYd")۵v-CʵeT,UY<]܋Y͔Wv}̬>}re'+tKQ*YF96*c6EK:JEY prYc]쎱_w22q˳ɲƾkҵ3)ź/)&u/U돇׻lV\\Yꫫ}MT}Jj0{2K[cy!*949k_|_8 <g2KLH if}#a8|1\.Lk0`90u!#!|N!Hu!*^-!su$7wag\F1 2i|OnKp}k'-@/Jx0B Y/Yf#3_c#,:H%V߾_/;Wi>˗ HT~9atWn,/GExvWU+<5=*3a#Yvi֕eʻ*QpW(I K^?\xn^>؝Kѻ`_xƒ$|R[WMQe#u6XPY>?xvC=TYy-|ͫ$/5|6+5ewO굍X[lK34n\PrO:瞻prwO\Y{ѾUcM\ٻ]}fG]sv,ZTmsi,_؊{xۿ]|GۿBz./0.D_y׎RkPݯGGߴ믿oUWWW~xm=c.]:^Ї>$jH20tmodb_Nw8ryaujN@<م_y+SA;/7 L^\_`Y,|9r;V^RcvY~\p;]/\SOmo૛ |v67,}nc*ܣBIUu:zg:W?+?|;߹zIQgo\wC=M}WJ*o/i%U 9MZ|ӯvM7}+_xUoR &_`Yo%/d.㲯T,^fq5K2+2rΛ azU{J_ 8/roX%R=ghPRcv$Y~^?g3兽>{}wzV.9w̨ɨ ԧ>`O?/}7]Z~*߁w#TGr,ѸXRwڮ[sb=?ǮzSO=ub܅-_yMܿvqUNU=d!޳TnY)XNnً>}w_~o}[gk_9}jzN.**U*/vU^߮ɷci*KR \ZP09}~Wz?x/5|5Op߬KceK! 7u3I!NdJ twqGsSi |!5{IBVtu.$/Wr;JsvdSboқ?xsS_w'1^+EȫʘߵLҲpq7G?ѕ.]]Xq'6, ʚzrq ֵ,{Y^So}[}np2mu_(i> stream x]w`E\: IKJAKG@iiE)(J*XQzws͛-w7܅IΛߴ=EI9kͫaJH/1G6=ZK 8$L6l-_>ƹp[+?/_7^}o4&7dP𢤨Dj&-"݂xRqu=?N&$Dj(* =$H}!m&lȉ3_'\wY.&^%PTV"r^‹4>]V4ϋܪwxIpsz5u>$H,Lw'j$NbC'ycY=ԅ}{HbT%v dcVm=x5niΒ>'gxWjEo4+ݲQ;BbYwɎs.5~4 \Gxo^M/22nz+71ЫHb ot6!+T6.5:&/*:D]Vu1lPtV7ۣx?5@O/nL70.*NO&e8^k׀شxp겨iᏘxO?+}FQmE9Fg;~6fl]|;$vcKPvز=rB2SInwǛLaEF/K4N38D[w,ɹ6m3oJEhao|ST_l])==vK_У7%rHKCR2M;D; WJCє StA3OQuxNqMfu@ro47DVO@:LIbO=CiDl*N *Y%O=SҔΜwx;#]De=Qoij7^(x%^pl7d*4q+cfҴ|` Ԅ~d-',Svǣ/[(yW&MnmLcMJF*K<K=[8[4):5H;ݤ3nyɪ+6&؍#KE(c[ShljQ@#*h%^,{?Lo<ֹM^ȜTɘ!^3])9 )2C?@H8fYs{6w@spH^-M *Ƥ4NS\"m l`\= 8;ĊSDo*Ssl{ǂ6H^ ^Ѹ"F"̦]56c,8ěDz2)F8wBHq8e/X>xv{\ C^V]ҙh%^;/nc AM[fO@pTd.>+d۟ͱBrsOckSh\&5hu:^rp.: K]!񜸣j ƑHS<=DB}xѐ릌r&%'V휄;Z> W'~x% elX̾CMӬq [iKHcO4k~:#L C++pf,YJOζe'. cJ_[(pVAUċqHk *v;.WB2>MĻϼ FՎT87px3Eү{OOzXr}ԡB(V ;l,xg3nw 8fmrf JS ayv©4 eP\!(tjب:CW*rg'[%q&(ˀ (9c$[MrPOY=/[%SvʒXtr-J2*-îU"N>كVi|[fWik.mK۞U"kVzx&;BlZ}&:9^yյńsJ8 |UL3tPyģlr&7VYjt@a3nBJ[x9Kp4yE{Z8<#~Ńe{8s`3 X1m.L~ MAfbZ~%J|N{yJ ViSEYcŭgX=2=Վ2ާNj>43.O72eJO; oCuְɮtN00WĿYd^ɽh~5CP*%cȒZptEWy^dl3. i.V;{ɋJj!rZܙ`0îtU/p{{vEdSRBSJk!hZ|Ub6qNgGꅒzf3ԁMQzɮt@fI ߷s$<^ې8Кv|L%K.5nqkZHcjoy]C_zg6!qp/'bV%?uo} GÞv6R%Ϗק{uk-tV/>]?_Zw|Cb"WݲFܔD [Y瑿=OZׯ֨ xlJhP<8㶵kyK V2<\~~*ݞDʼ$5"N SΛD<L5<M՗:4vEV6E#HHHh8I:|/ y~ACM\򩤝sxy~㹢vcBPq bxꑻ>߿Ӵ$6$S8Db%q5~>R, N!!!>= ݉pJ\cpNMv"HS;>F Fy$,&Ws++&!^߽M#1I{_$ZVB Qm7 A^,,8ʿPp dkOow7zCY;.w HH8Ye.(404lN! -r~zΟOm]@ׅpC,ys^ H}ef#V̵@ŦD|JǷeƏo*nn+usm.OhncGAgٕ5p;,+K.,KeL㒺IH+bqeݟ>7-+k(!ᆸĪ{'YNӡsY*IH"mM Q 4'j;WVPB|rT ]_"+]V? wa-|VQ^NFhWlW1wloWYVPBa[)\ѳ ꅛ ?! 1H/yvFk}<*=]&X~|e nMS1{0,Ю0HK,IH#,|1qwyڼ~䒊S s#ԟЮ\鎞{$$$CZ%{BKw`4Υp?<.H^M<<"[UrKHHp MwLGJxr e$4Nf xxE".\Qaj{{~I 1;Ԝx0y{"SBy{fp$"mX$$$xChg Ba\B?cNJHHKclDhCԲ BRU.!bFkX.Ø'G4KB!^e}_.$~!DZŦ Z+ROJ9Pv *= }ٶwr͙u"Tڈ.k]NBky#z}Jųa>NBBBW#-+m?+O.ZlJHH+\сdEŷxWU,/rJHHpq<+O!~?z3A~rgڄvX\rK&!ᮈ$>F T% OM^iF)!V6T.Hz!fYFrPw>#*'3eqMv\Y? CԢr#Į*Fhu)>b)=IH8m0o',+HhsW~ yY5IH#^䋸΀ %!, Ԍk1'']e1 7e\Z7 ef7pv/e%+J(Xl.t]$$Q_Ci]y6>yX1yu=IH+zLGhW'ڼTحW]YA wD3|>]*|_&\Z9 ai.riwgp]݂ˇpaFB"_ cNJHHpx[^KhהDw)\XA w,̫\xF-Xsi -!4Nȕru;zF_}.\W= w_*kC<yu9'ʱ,6vI$$}WƒF>=/qf?Ws-6%$$DHʠ/{+T[Gr;u 82.CY;εuQNf~W)!! [d*f 5U{/Wd ]z!j~|Gb@9v'ul=IH"{>S\[ \ny=G0zQBġE!dk&!XA>hEMhW`17r䣑Yʀʿg]YA wLLN$3Yw2v/Lpi$$Ə|(OޞOLhW8?\Spw HdLB2?=wwALJ .^}>lA6sW>( 1'%$$Dʷ/$nX ]+wFK+'!ᆸ-n!+p^L$$ƙPz/uX B(dn'! ԕJsnظUsbG(xnuqّoĢ,it)!p JDW|O|< Z?YQWsYTDNBBB@jHs$(?EA0 b:B:Eh0U@ԥp;XW [wĥ/W(h@\SOBB-2rvF#iUw,6%$$8 !M|_qk̈́v&<#^%,ʓ~[.봗+7&f.!|No<[ډ fiABs"_zWPB>5 BeEҨy }-T<6!AI >,^50b6 Gԁc.;ηyS[U/<4/+_[ut|FB;:+V M$$i#tvPbNmX$$$G"N2q_Y]m\?cNJHHo WtajݼN![0rc G>vM]绬zKw0N qђotyuG g$$÷@췸<Or#pL($c#.WviVMBQ-߉Z}x0yIp> gp"YQ'l*FHH8g$npۄvir~qkK{; PoF۫ڥw@{fvi$$+ۃןZ7U Pp=l>upCXDȓE&0V+Pb*1XܚvY&?#fW( IHH0]\26ʝ=rm'3Ov*Ƿp،CwDKLPv `lvEVp]<j"L[\ J  4õp?<Fszvz0z2:=]TWVPBp#4?{E0]-!b\L»SrqFr)SB)\upe7?'ׇnoB]Y7 ED ty/]+ennrL:_M\4?(< \dupCnၐH~3u҆#~ ꣬S_zZ@wk'W*pſA @wX.p>6{ĕ'=IH~m?+FQ \nBVT|{]\ޞZIHH*ЙCo EJ; gfoއ]5 ꅸjv(1+6I+ 08kkeBau V?p1!L땦:,ƲvF}>(D"fI~FqkGhiS;`58#8Ʈ,Jhm׵X҃s Q pD/y.Vvm$$UQ:{u4OēpGg@;y EvDEt h 6@ |1% ]U\} `=8}{~I 7鸌vsw.ۢ!z'x4"Ю ws/9Ĕp ?楢nʓ,-]m˃׮"#`$һ@hW -c= IH%J~~v _'ښ BL ӱW30`)Q]LzH|P0n5{aLGF^x}:xkT!G N"Q$N?pG`n2=E<<"|&*4F ix?$mb\E Unlpp$55xT{}bn-Bf89 t5H芵IGb(g'٣辤( QO 爷e|VĕWs\FUV90Z};֟OД^ ] kpj;SQ9r1.l*y( g[ӌK\_mn]s-!x&)YwZ7x~(*:kHN~񯾝sž>xJ'%VSvBS56Jw#H1l*Ptۄvi CuY5ƄxI k)Kn!GxUF FC5}k;lH^_\Qc$!^K|e7K͐# Q |?W 5]ZtsjIxBwy<_J<}q<ß"_~A#^ υDfԇ A_SEe})B c??H:ḄOyB`ϖx|\S[ˏsOZ&C0<2E~1\s|H _*V?f@?[>} >4Bƫׇ1|OFcΧhi 3EpBKIs_W"ƲUT'?/< }ilєoeqqbi ~{FCK{Y=c|{pl(sNkwWEbkaa^ki8rBhtA/||o]1pEJ ~Rz)<+(j K=;@VȻTזi)F'FCSb:*]-e ֮ ͇*''@K(wl}];g0 éxPpݾS.!Wyq&eF$Nz/86cAwT[8:7/OB31J°Uu{Xc>xxS dC9"83j Vݘ5Ļ.!a_X:fȂԗ/fc*R1:-e \9 =`UR w- &u^k=!X{Xs9xz*kO< .]Nb28Lo?)D|}׻5}uI*`nl"EP`1?݅ 5w Dű6&$UoOJ`Z8vG1E򼮖4!}d;♚e <,ѵ^`Ϯza6iOI5Pr4N mR3Z' |>cOBevT*GOki*ikPegz@6:x"]vW=`<_Z?Z0x-;♺ѾeԀG#ï/g#D(" -1פ-x61n^Luy=bNW ]jCXP TKpcCPihG-\",.ˎd].R5_C'z6uf@V =䰽sL~@mcei[yS,ݭ{=jm${:HbƓI=ycN2NMDsBKZ\ĺZS3s}:5i ě?`?LۥI3bwukċNݨ425<܁H;k-ELF-'~dK ^ Bzj:> wZQtq̏ԍA9?*_֨דl>eMx ?h)Uox+*Lݝ2`ٞ*)|aeR yT+d+ʯH0d T42kwBϻK< $'jȠk܁8lx ifdK_'*(M~VM Lfj*o4Fxzy VX/*{+}P@ƚ\ JjqceL2!އqX bF£_oRFka7Z!仯!Z5t\Wng3 қ53/3y`xx/:KBV'"KwlC[崳+wh+3zgpNyVlÂkr=4VijZM3z֜&4$= ؿ{=PgЪaNkH.~9zTFq[W$Oh]qh(賤dZ#f,уe=rN;<*eʼw 5-=ivx 4xVj{ҷk0Blg0? +SM_I ?,U%΂;L%oLR|X8Ӳ\boVS'^Y1 b 6Oe r/ ʱ62F{{7X灞eX}wKf% xX\ V*6 &&Xu&kE ݭ r66=%yXE`E! ^%\d&nBFr*/t'>Ox6j"6`"B˰`腗#4%.7 &װ U3Rbs:b⁂~Iv}tX⍅hW-tKNʒo2hMɆx|[Y- `8l>mƱ9Qj3k|+L+)C"׈0EO. c- g՝mH6 I. 01,3s(TMN ^^a?Ds e6J3IBZZS 6l]P& Zn9H3̜1Ԫַ%>eP 숷U j56,$' _"gL \R ݬEַajWN"{q&C=`Y:c*GZ,ͪ2Ľ_ q U%' \E5H$MRP "+2391T R.hcf{r f8C!]G,޸꭬8n{/9EѾ tUy֓Ge{,EQ_-,P;D@¯'Ccf3lcl6WqO21Uh&ٌ|悈W94=K. Rha}Uln>KaW|F>s9taEP<2C ށwP_)i5=޹[ H:hw0s͸5i6[h=<_8}n'U'i[9>f3,44ŷ ~wb|k/'49Q \ۧiZl]gmIs-~֬4S̞OWy_l:voXVMZv9$]6Dn-G!7LqC.:G/>YjO ?]U 3sZ_$,W.jUFeFar%nG~\ەڄ-juc֪BxN|V=ƹ3Z(bݳGW x~S ;-)mjUy[n|}r rn,t{ veBlDn+`2nolL 6xfavpCDAtj$ܤH \!jyt|o!wllB&ϣeI&єk>*?6_ kr%]Z9$$^u;:Sd_-p0JBI"VX:Z/V@^$L cfXf39ʈ]NYhD>BhW A+;hpI$5Jju۫zHɵ74-U| _/p 0הHb&ȿT"Ipe4%(@Ꜧ{!hG%1!pc }w[ !:;y v##@Y:FpTT-[3>wڜ c\{w>!)`q/Π(ɂE5YL8)Gä~pp+?R Rz.ľأ%tL6,wenE<yr'ɈnzR>NH,㹃SW*1kEs_ߜs"^LvmwZ~I9Moͭk)x#$iI~xu D^+DQw/)<{'wlq8*5װk8M<$g‰g!q4%S;u ~]g[lv9DH.`I<'?Ol@h׏+X*U݉! `<~73* LڄviIlȗ%$x nmi_|?wr*]ڡ"=M/ & nO#ǖ:yd'aq{\@mKg; }[#ޏ5 [Py^g=ALy?}fchhw Tjcl׃<^hg_ v%MPX/4^hh\PCd<Z@y:Nc̈BaG3IS7'49#"PX*JgSnhhdJ#B5%q_9Dy^ߐ͡࠷%}4Jժ V@}*N0yJV x\y& 1h<762fupcؙ\ L^xͰ&~.5_xP6[\>j+ >vRh@ɮhS#9Fit6.*?@\[:p }VO% xf z t٨py p-ET)yhB8 Y;!^_$55̻)į[FsxMuxM)'07NQ =(ěE1Gū6;ĕJ"g*3.`c:-M0”gӳqҭ54e"}gԗRߊyW.f*>5%ޏ8s7^3匑lFfΣΞ0LjlID<3)-^xXA m(kE%-_-4x&q$4D3fW3ե Ѻ&T 9d ,_= @-[N)K$*_B#^N vƚ NЗ#=ZR\k%mկ ic"Ü63"aTw Mx> ;J8BVLp7)ҝ.sD@r#cYY=`-z2PXhuK,OyAYgnBLBүۃ%4;<Ю8o.xZ7uQ8Z`U0^.cWX=hgS!>) f/D{N<#jmBj8K$BEoC0Y}HbAh=A) S|obQz6/f'я.a&'ny | *wռ` o*.\7IIZ!{*_`X]-\ jhk 'O)`zb|o faΧ[ln5hU"d:O:GDeGj=c g3x|1٧W MdgMTv,g A46:: 46TWo0r82Dϯ,LBմ@<-VxPS E;2PW ȥYvY vgwu%TZwo#"^[ {ԉiK@'K tuYKS! #P=~xCμ 8ik= ~F^S7#qwbpK`XqZj[ϩ).*f@uU\ۉQp(w)FjPSD2vvpxtUH=mOt äORLYL džxҹb37t :! W\2],D."u=~& vpx`6[BRo*)xg(2\hpxd`G9@<ķѯFK-oo;' "8 47JOQ"-f6hh 4zrɃ(."Rqi² )卫]Gŵwx`׃[$$^<Ќseg:r ʾ5TG*#"x_amRGX9Ib F<GMٯUtc0]yW;ïq]bEdÈECb7 ݻ 3W!椀xdjbG(6![lD%~>8;8ކz0o ͘J*qxvֳdCy{I޺P\UIGeՉEM]'յD)m 579/כAQ|}~OGo~#?M z9Aj]s D-D9IiؽdY7hUfl^{CT/f`rG1-;:jF<>d͉= J!Ts-LFO"~&fƷ3bn 5[7w.8R?)T)<Ȕaݳ@fQ24~ޗiB~&bD77V@}d oO]β8^%%76M-Ȫf"~M&t1CϲP!ؠĹbB9'i ~Z" yE@T/ I< lo:Ft(>~O08ŏ9BO1&s{[ԻݵH@\Fpz{Ou88%*xO-x/UGt>"ݏm/3[x8j @xT!iup3Wfxe&\obWL;l0|۶;VTm3ba>/䙻z親aakP@3rB[mx27.dF`vS#Ň-?iBI䑵;|çD[k'~.725,-< ׭Dˆ5}NcE; DCτ 纔-1FV<}.Xmޅ\iPz@s^;$3Z,$^\R37;2ïQv/6xxe^vi»%s4.ߡC[qq{DTHVQFvYU2; 6|[ œNy!_fdctWD(XIZ=1ocKpzK{\guoҢ}n#|>jD c㸇̡M #Tlp8ږxl` 2 Uy[;s<AFCCv9fqbB_M/* P}韡x{cL6SZ"Խu*Cl5=4ǰcrjeL=3yѹ[\6>L pz`|Z pǩ{s !wy "}FbgJ>F<>RH A⟈>TxT[ yrj E7Ϛr u ~_:s4ױq)kcA.Bs <ɦ#Pk #zr2^|Lw aZ}\HV 2 i'}+x!Ļ-t'T x>^UiA$sP !lWOۈokjBse"tN|©NGD1&n}3[nKk3:cXO> H=t>U} `yŧ1D Ja!*&gS%CĀ/CZ Mf%3_5A")D y.YbXpcj0>'aSV==| C:r"C+:%G}!z(-t Tyh xf >0mL9yYx9!',@0dc'Lp98-O+!زE'0 Q6ӬPy.$^-q-S'a4&ޒ͚x,zk{5L1`K%ݱE3^iϛs-6[>0bJKs@WA5᳁Wjm "`-f?a5x'lt-4z iPuTOOܦ7?I { PRx^שּFgeăc PG<2ܮZOsCI< ̛L| t#D > у l`ڧ2 tT{)xq)&LlHh $O2?PIo^e_}$WF+ֈև+DDA(+&:.6"(#WbWOt ;N$zz.0]F%HSa&<(dXoGXկO{G>@5y Y@%ߴް/B[Td#M'xOu`ࢮS'x°֣B+PB|DhBU4X;Qڂٱm5a3jr ڄ,B-D&6YRh>}k_-o PdX] OߦJD_UJ|7v#맛%4y8@<4q7'a kxvxoTf,67.Ol//Ɠ辯GvA@zl1On_>uCX)?#!Mdd]G38_2 ^k|Pp\Çy f9`mA`n҆#@B_jh{Aho6!TƠFy0VckPmA1'Sef%X?a|l'|8AM_:EPJq\]/Bna|3~9uxS<8h~KF˼hBT9 s\fsiB%of*4bp%ұ՗cXs7{(M|l룖}MG2N(N.KJV H ai}Ɲl N֗;K۲vY=eՔ| )Xrh}8 MˬN^~a5urCdo&NO5Q85W[ĵ'Ai&ި-2%DRYJbG[M9^+ ްB34?5# jtfލ+\ zԩv S\ w6|#e|b} fO2c4|K_;s<:j3!a"4t>L7:BǬF/.CQ0 30Q0 FV( ԯn'xҌ(01Ea?Q@#ۛ3&ae`p( endstream endobj 27 0 obj 26048 endobj 15 0 obj <> stream x$Wu;LOy{lޝݝݝc@haDc$ ?$c"M09c2&Qݿf nOթ{Ͻ;U{*}]u֑#(Y9BX} Ez.(VHg)ir@B ԬBQ6+|W4m i*(=9k;^*5S_P6Cʲ-|P6eojP-H2(FJ;rv?5G/P` r[ʠ,vL^VpL8&;soE@5͞NKiQJ(;2M% je0F~jj^T DCU=+\䃲#>Y13pH%S) %̦m( UB.l_hmfJNuis7G/iwBiB\x11Gǂi-) %Z)w4^dr˩~'*hgE@9ڻI)Ji$xgQpb5iK)"K9C)JiH&xgQXt[Ahk:ݫ` 9n2Y) +?{nC9HmM{u~Dr5S2M& =Eg7So.#)RznݏRw&PvJR&<`ZAThkr\`MLhdH7Q(5okO桚 wa,ɸc**Sۢ)trhzG |3l7}L T"aV׮㫴.\K==.7iVZͥ,o %G}L%-*+YQiȾ-i5k2Or}F#* H2.iE]ZJb}QlbVV u,M'©"qZ-j% >JCZ"m;CL&gH]w#ۤa%yp]\)nUS&ͩҺ kb(MaL\Oۖq,enG͎$F_S-tָ2iQ҆rW(Pf Ȼ ZiI<7'o]J+&/$#65Ql]/WI%N &^EGp]LqUWT,\$fVsbFOjuie*ՅW rO,7횥d>HM 뭪1 ؔEDMQ,;huy9'պf*B'`z&i&CY+Vn4Ѝ^U9xVnZ]ImײJrn(I P8s Z1٬@QLn4GiVU? ؔHK1JO_68M=cֵdK4 ^= PLn@̍0hLxLu`"mWU7SM&Eʛ6$mKY:+཰$q h&v{aztD71J b3i)> P(.t 8[2g9جXɨo-;.iqrt?Sf+A]]Ur+m+ˬ#БT n*T dDd_(w9dBI nG+umR2[1EC*.#ՎxE14M1wJ*6+8RoZ=mV X$ʠzv|>+A}h SB/ƅf%YIrn,]j6VO&u?# g92^v >{JG.SB=m\V811aiJyG]mI >Ub֍,i%;xE @|YLBI#ƅlu -Vj4U4[W @L."ĬYJxb>+zHs^U da3 uĸP.*vimT7m˔ R|aIEdu#[nt2d^Hshʪ\1%ƅ9ԊVi[feJindam&Y)҆}USԭn4Oi/l *ǃVJQnZl*/hq0N2Ȓ~ .fz/^IPEhF󠘄]w*V?btsfbAcH^P=gGnlX1O $.dUu׊ilZqV(JJWQSlE1gP6W>m4BY*r.ۯ>;b$rYQdT5&qw<(>mw]lE7Iס "k#I6>OG7"4Xİ6U,TZ*T&mwEϊO[ybݗ7[L@>O >}ZJӴZ޲-mz^I%JQN0EMϩ\Pi#X6g_8Zy:dQ>*+KWHݘ'2k(GJSG:m(Sqvuʬ_`#Ӳm˲vxI]OuD+zqs݊X0pN )Ӯni\Uy6Mhu31PqBrhu9m3 hJGTr٨~iuS77?}TG\$Q?Re%yM0D+l(v֠!IYHsg=N1+?X*xG'ࡹU .WH]2u<$$RO lB!D\B!,B! !BR*BcaB! !BR*C!BU*k)BaB! B!JhVZ CB!$ >B!PxB!셛B!V !B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BcBBn+tR5P5BfjJCX #ԔjB UcP3I~,*;|f+BfPs( $^>Kg61j"4t5 i*VTf]wt,i%Ub:N+e.-ڴ\P $9v%i(Gh,"PJlCޢcB9٦Q]ݬllZV|VP=]Be9?d*&4g޷@^7cӺ<>\W<֒Vi[1-~E]娃nAc|ZiU7dd\$mZ=p7sbI24REP)4%A-gAfm+Ȗ2^8],}XV9ĴMS1 f*)1 WW}2YNȖaZ=p)6s21>M8*qqVJ M۸!Nn)III[XV<DN!69#bGsWdn8%]!&14&BJq3>q4ݮYi4K YJMkkM7h~14&BJ3$zUR"ݮypK@LӶl¦;5h\(t 5" 9.%g%e~je"_xmnKVL%' BMBTOFE*Us'd"_R}|8R+zN&PO6yT%oK=mbdjSξ YR>sPOi2" l"\d^$zħVw,*Z8qE}ѪMUr03"0Azm&[HGi3O58j.r0 yB&Jg}XG &%琩t^i[gٸ/ZUMEcq!ϽC RiB~"bWFidGIˠuI/ "1ɸ!jpi5uQ?هeV*v)E%i,%+5VISmT [&` yB&b*}L%>IǑ̒4Auʾ *$B{A؄9DDdV7 *Bb>6ʎz_ݘ}Rb8*"qy8t?59:لMFw*qfSˬG151}mT1]`QAt ʸ<DM\&'>}c0S2QLYt$b:*!BiMEmRLƾ8샤$>〙qbʢP%%y˘>sPO>!BiMEmb*&5Puv2""GS'U&61}z]?~e\"Mfz>p*;EN2}6dAHuSU !BG"MSru?f*bbRY7M4,Ww*T>Y`M1a⨤jCۙ$Udݬ\$IP]I&fݰ6Tr\EPge4S1MnN>ŷpayV 5I.󠌤q|&)l)'>TXFHӀfiPO6vuF YҠ&J-1Yׄٚ-IJ'=LRdA(=u[4& B\*ǔl/K8*kz*;z+}Ci[tS$I՜A21ZR9TI޾uݱ2u3hKKIgJ՜ni#x+-4,"eX:?h}.b\>spW:TTmf϶0X ,#`s,Q2f9MC2QƙXMK8e=lV89-m.brHOQn $ #|Cz\ ![Y5P !X&7jJqzGȳ8Bĉ CP9t!@ .Ajtq&G(#0Dp#FjPqF!B!B!B!B!B!B!B!B!B!B!B!do2.__3e_+uՏayWG]ZW*ف_u]#~eл\oW*k.򿮴@#FG*&+_._WZ׆eo~yy!Bͪ+raaGyT yttEʍ7g!jb=5TukӨT)(篹暚O:22M+%wS{nm /pݺu1 m{ Dkt'p 5rYgfSI7Q[>2_4V ]ȷ]'|7|ȗF4TBCPm;w]%]](տCUÇ?񖖖yL^W--,>vko-'-,'< KK/f+` CH/x l^:+ nq{,M9Gn;J 46 ~y _(Y%j|_nkkHc ]+${|>wcƜz1Tu=_>A}C 4،}c5r?YpS{s9]tц R։}KE_j^o>䓳f kI"}Ao-H=Bsg 7p'2QXwСC'tRZ7ձeznOw944[暥ϸ7TK3r)iT%=sBQ.;:u9)>O:tH1nj__~hzu֝qv&_|SK*qSȖ~b&{[LzZ^vh2X|@*4Tr[=Ӻ/841>C[{S k3ڱ%sWi_޷ی?OC%TԈ7-uSG0T} ж.xjH$|t5$0TXx]a{Pa!{ @]ƿ_,xjM ^:%n 2CoPcRfP@cmtBm.ro`"6>QIt5MKf dD߂'-# ^:~QIt5M DߒM7uC!-# ^:~QIt5M DߒM7uC!-# ^:~QIt5M DߒM7uC!-# ^:L}c6myNo<` a5sIgG< `o+ A @C!6<9T}X};>QGG`P L *\0<۴Ll\Ի\P*Bm0Tύ-Ǻ6-g{7}x|( @!6 PK+J,G֖٦P"Zh*"޴`k+q><[9;>lj|@b4 @[馎`"1hxX+?wU%1 mHh႗l}{KY`r]dG) h xTZ~Y,x-xHђ~av}qDC@xIraVWZ Jmt}aQ@ @mtZ%?K@rd}B?%[/ K1T xTU3GMH(*OM?U8_j1T `@]% iߔ nEO1xv|z8x _ VRM[ -roP t`hGfwB{vH2PccLi7-*p"7R_E72{I9*t[馎`>/,>/p垳Ƃg mHh႗TX:!wO>Ѹ=;xTZ~Y,x@dss ~_:ԆW&ɅZmL=.%k &-rwx]aV!='Ⱦ۲Q,X)MxTUȦHI]_ʄT>2$y'~ɑ{ cJK4ò2!E> 7"6*pJ$؝&T3I$<'xX:wey‰O\\^pgf ^:eחG$$Ҧ?!9?殮Ⱥ=mm+։b"}S_>='޴`'[$OH9%~V&?#5VyJOt)/K޿jxF%n_Xr5m[B{$l#fddܾ_[V$\/"2BK;1(+ʉ4Rp}D#}CA(& -C;~u\0!ѱ!''SŮϳi7u)?f۴;oݳɳs[4a s0 ?)1/`+N`R-Pi]-_H̚R}fKж5{Ž9׿Ot{+6| o6IxbK.N;f<]_0Sj'#+츖JEiv~.ŇWoɞeΡϫT{T/@~g!A2Zˆ2bnlс-ARhKV/ܨk3#69/L 7Tvbwv|rxlL16vބu~Eߠs|M1G$Tҁ;f/+'l?+`dp) e{k:F]ӥ7 mdlv}e$*i>qȤYvp-Bgx57PH-KGJKN_Ӷ{WZE7UFP2T#U~I}'g"}cV NY>UgLވYA!5*'-c<~Dhug|Z_C b6!}ZzN #2"deYP0).O6qg_?(jÏGJybKn9Tm[+`>&꿣hŹ(HO6̧͙6޾Am]+S]?5]/97fZ~,tU]dΟnlx, USNUI̅]Ӣ(ljɏ5v%\?{t¨<9Djr9fUѕxⵠ7jEO[KQφjGԙx4swQyMɷ $Ə܎e_?{ !HCmDmrC黭󞃭NȤ{ajW;D[;?;"8pWTO߾AcweUrq˸Ρ7 ){ ҡq5!פO~ ͧ^QZa'dsO{ 6}cIK}S\5] wß8dnM0T*0֤2v]%~R\Y]sT~UR2@frK&d~&2{7~1̅ 9!Wx6hz&0:jZ{f6m̀}ͻm ô ŻY9D}0-oZ98% ZM;>ĭFg ȃ_y+uHÛf3H~-JD^n'$6EB[;)!$o^4*^S5˅w)OqfJH>e3RvL=CV{}o/cI/ɡ3 mhH_,xM4kAd Мj&6lz{R~ px9 Dbb}5'i+L 'd/4we9k|)4+~F1I[o4x'L4Sӻ$z-Ү8:CO"M}5w5d}nnoPw~!agS!R}Dʑ{PA8nTyMоv.`6=\!73xr?UKh[TGK|bKALD{ նu 'vv&׆j'7 myR'ZT>7=ٸw{FusD(Po YRiQXA$eմ&_@<.iw &ĵVӆDC''ρ<#2//4}rGٿ &ɵY,x 퓢 +O1M= iAsm6ѷ)n%M,OM3Kpm՟I5iqޙtsvwl"hCEc&2Jˠ߆ӥE$DjG׆J7²M^|H i~q؁X9Դm7xȓ) tɇ}#uMHu9%I3=}ŵZJ[~Wi:$={+>j[c^mNzU4'V9e0R)x ,{+{t}PMA4oWw-WԟHj9ISH'y ߹0!R&2HKh[TGK~bKڛBSN꽵/6T[?$F&dao|};Or^{&j7 -~EnoF}GG|L6#>.qm"oJ˫<%M5=a&tl_W`CV3roc*R~ͧ">Q]`zdke)ٝzou8DթolݶM1O*Dmr* 6T:~=ʃxh}xz18V 7Ho~$6LH j{ 2IYyޱpsuBֽ`$kGU-޿5TGx 7T?m6mꛣ9j@U26UAFhdz%ebT 0C5}k;7YDpW?O9n?)b ^:cJFdHO8Am2:,?_<Ac?~=oLsȭPěMky fृL1uѝEJ@:CP{iT~Uxb57,NQ>5iiULFII5b"7zIb|KYc`|-OaOMԵ/ Ogu̚~ZNC~/;w_e&ޖQjkȽMy H&}=jJi4i`f"F!z`ibN*'ތoLX)27@0Tmf.H[5H>&PEB&U5ҟ0|}:1깯a mYݝ > UD";:j~ְ.{4v|WcgSη+y"s|c&2ȶ Y^}kǧB~̳Z[`ʼn#|nח+ӥґ9 VӏS*x G%Zj-}'tƩ0 u՜m-tW"XJ1/dtxU[^1T3'eoK.W>w={՝+;>=\}fOt)SCѹP=iT򞰒"[D7$AbKe kӿ]PE;w4b8p'߲0rD[?84/^V{YúRrm&/x¯xz]@noF2ܕeJuU]K UĞƭ^ss= Z"s֮RǶjfjrm} H6mD0> {PA0򠸏k쑙PE?ockgP]QΧ7.}t a`"69 4;0bpikg<C1{iMkC=z<^d~ӈɴiDVp`B&p}ݕ:\ۓCȡ Y U߰san{=!kr&2Su/ yL}c4k\w|lOd~\d2pWgnQo@"#ԏS*x D)܁e5LGol|]D6jޙRW )n ܭQ&^՟J;߰eR)x !ݏ5CUcNJ͑jR"~GiAk#8o*Bۢ:Z:'/t}'C~(CoEePX?{l'PsG]_ iŵ/gΞBo~fZՆJO 1/d+k׻29/ĜkLl8m7=kӿU'~!jAa&;?>xIrak+S_vvMZR"'־mc]_x @F1I[P4.Ś>{|WFv|fxGgp nym 7O0TXȽ .roxFLH46A DKP#ѷdMP@fmHh႗J J›M C9&i*hކy"6*Ƚ .royU2KP#1T/@DߒM7uC!-# ^:~xXbWv#16 DK)0T*Hoɦ:S,ضmxuV3Gt ?sQ]O>g6':>}%x0T*Hh[TGB t(]U82TH|\cM}utᆌ+  #`bKgyk_=Ӛ/PĶ7 ^^`wxIr-?,tM(o|] kЖ:cۇKy^Pa (r{瘤-7t5f/)W[KPNZ6m`P%vC{PAV\yjO=Xo|@Uc ]_xf/փ~roPA&ҨR+@**!:xw]_ 'da cxρoU31TPA *Dmr̔Ybc 0:6 c  X"16KsL ^:ơjY*` VC$ɃGJृ ]U[Bn {TC} ĀKBۢ:Zu ^:ܕ垹^US{&8#gՕwUP؀K&pi,ݭpa&\$CȽMCsX=mvvnÁ':U5]ZA?C  *Dmr̔~Yڵ'W|9{I{&݀5џ C` ,%9&/fKR.sWWTR~C$ɃGJ;w<þ{v7 '֥O=۪0  XҮXҁS2=[7nj%2VM1[P؀KxTZ,tے_;yo΀JNbi8P؀K$1/g!x- r)O~ݿMC퍞chҁ#bXnHu3.W^ܯ9cΟ ,{P$%{7Yyطɷ itnR)]ށoRu/틮fonL}ct+9U*v%|Q-ު䞭}y }'tG}is|RT5L澟;CȽMC~'doQájt}C 2Tn掚Ȇ\:x+^1wMeԑvc޺m 6;?;2~JPdӵCt;W=Zw3 !|Ӏ:roP{KfP^T.Ulo56t}DKчwZU+?}XWGB[>%j|jOˀTZ7u y r2Iȼ@)3mE>퀋u!I5|`6jFYh3чͦ}Ii?ʹv%2{?6td{cQIn*p,I1)(x@w$|t$U=ob9ƆjGUdP^Z{L[+L-h >-?v{Rh3P;}#Rҁ:wN9̽wCY>Wk {SMlmM=8a ,r{瘤-7tKhgy_ő2YN%7TE-}8RߴݫcAwk(/oj K+V+:zv,Eme]O{{cQASؾ%:Dim_00T18cڑoeyWNliHjW{oXkoi|glsWW)ݒQ@AZP]Y6sSŞ׽oꛣөhn#3ZR,5Q37U+ ܱS(џv9uf)Bb&4(ˢKRVZ=#nj -roP3. {5x8dSVpzЩ;R;HU&8vf۶PEQv꟔EԨFFoҵ5t/ۗ2wEyU!7xm2,;>9<&  X"69 8ckO mZ7{gsFb\þ։ⶏNn0wMeq\U_ R.P W紌*C5weY>'?id#,ZNtБb;s;1yJCaI-K;JKs~%勹iDzm^}Fd>TPE4{chooV0_kT:ߒs=ɮcIkљanbжvłX|O-5`g.6mPonBc%><$yWV6.PјpCݾUyh74_ g= 0T`Jޘł;րŎqc40TR~\=B-?I:GedgC5trk}ozboLvbV7pSHcV{ X&ɵ|Y,x@ YFxg¡6W|CU}{V'E(pv*C}Cնuɚ L2TZ.bw=%P΃綧#0T`)P~Hg8xf>\:gѮ/S|FHo?1T~.z#uk<=w~VHi؈cїP%c$=Ǥ-&I~$Pi*{2&j1Vp1TNl3ɇ'򓺃Z X[v$){lL}UShޙx4ncMZ/g\_ԾjV?jn$Oũwl;Y`жvł{0}߅PM}ӷ/~wr|bOPEn֯+ʒICZ X#7f-"L{4?B[@-M5fs`#@!O/]_ Rr(0T`7$7f-*OJxK۷zg`Wd 6䴖w*[ nxhƝd X"7zIb|KZytڄli#x PpO1PU:]{3>-чn;pB쀡K&]:{0TwOvŞߠ<Xm: *Dmr*pI?=%UgPw$߿5w# U׾dOض8ΈƒoAGy~-(}:"} {?1x[EZ'QsV훒_rJ X"69 aGi :MZl)#4Tc,zU8CU)H*}M}MNinAv*]0T`)ܰLwW5CrUT7wBCaƺHU8kC5}ERކMҙa4 %9&/hq)O<@ŌKEWH;(4Tsׄ8$ߠsm&ŧ3ퟐ-s<*DJhҁ"~.k3@ΝV# G#H6C4(}ڌJZZޑqvFD1( &[ ^:p_:kbtK5<Ӧ!<̨~|/!:Of-}Q?7YdO X"69 d蘭pz#=_+1hӐPMƎy^'ٝn|}3&Zb*t-0T`)\]$Hn E#p<h\OI~ձ}Sq|׆jƊdSyN3Lqɭ;*tKĉ܁Zyol8M}ﲺfݓ@*{_ۚ҆ j9ImN8;`D߲#yHt5mxuc<9!]SPjsB NOo#kq/1'P%mQ-/3[[p<{bno@UChFM|)yS]C5&Z,GxTXT-P%~4[ r eE[v;Gz0T_)zMu.`4> ,fZ,t}6j}\8oi\!7w& z`wrx0TTҋ/hq{(2C'7،ǃKF1I[o4xيtrRvOn>̗*_|\nǧ}yaY8jJ^VuJTBGOB9cP%*FWF\0{yYri8y 2qɐ^nOZChݳV>ă+Uc*D1Sxg*Ь#ȽM= 6=#7䓔4א^_r;m1Tk<=iY>ŲĆW<9l4S&/\8Q) 缜m~9RfDH{,OKC%|sR\ywh谝4̇TM򍸭jO .roctE=xM4gf h~07unOLiSk+ CѾQ4[cm5kn&LY~нmy3Tk+zfjEn,ٯ\0|W'CD߲#yHtu/kʷO OL1+ߚcn U˔ 7V7lo*u<#f/)D?+zL<>-jEhbBۢ:Zu ^:pMծiTV{|fW!Қ+WNk"~e`3Ǜ襃Bg~~%F$ 'k_#n ?ÏGJ{obK󝱼~*~?kӿRu*ZNk"NPE*;?7R>m݊:r:w6sp&֣C)*`{|A*#;7o` ,I1)(x?6*w[}aE'?w|f򔞮*s4毭L}mtG+W0T)-WP!roiK`YvEKoY[0x*,yHg}xhꛣ8PusXTMoXޡ{wDQvt ۥ'\<#[?0yL^^bF;ƁND?@v}ed o8?:$H2ab/yжj\2K#Z1SdIP]QnߜΕFpZ,ln5TW+OT^kwk9:OĒ~Wnn[Nz[Ό.sK"o{Nf6^>ϴ?_4OIbSd ΗF?yogճ%=UAh'mu7K5kR?6t2YOZ[֗':X|4<}Yne-bܿm+ /2`8转SG`+k.⯡'N­RJБ|-^ZW˾kk__h \a ߹٫ZwSzJֳs mv|cGWTOw<=cwKPu/T]CNW/liY}U|WuySEX{{r~K4^,N#\܃GG~Kۼ!O !.۔9_:M޻+M4?|rފ-F{dQH >9Vpl=?G/  oa+s#6kۅ_TGNAR7ݜ/ȑ( @FYIP77:'Z%7tD w" U&PtPPBuEyUncSQZm Vɻ @j-y;P ZyUncP|푅j|_ encP |GqM!PMDdoIgPǢe8Iuߦ{{"T8L ;I)2:_:ih늦BKESPì$y(TQe7zO@ sI:" @K)5TC>@ AFPDZ{xU)/~GzHXT*|cκvo?ZYlɻ e9WH/T9_:I_r t~!j,T8_:I_~U%mjBԁ몖_z .۔9_:IS/+)HJ4B}M˦iSVPi|kn]ezc1IGPuNP ˾7|ꐑnc6*>Q5tnn^Pv>auKmu* _cG.#|auySO,Y)ɻ /T9_:X$Η[٦f)T 5$~G~ C$t-j<*-zc1IGPL0m̆BEmx'@ yPw*|7Kv"{K:, oSd>ZMBE^o5&* FP@Ȼ $6*@ncP||nccT8_:_doIgPԐTm S‡@XIP@덹$B2H1 y݆BHmݜ/Om,JK-lS*bM#?!v RP:k5I y1ט#R@&6fC"6< PɻB QI||%mjBRCR])~2NAR Jb&C"7tD #l(T [݆{w @ y_wst>a1*I//MR@jH6ŏ@)HJC [$y(T [\cH`ۘ d`O@nC$6 UnΗ'6?F%EtY H Iuߦ$#:_:v>ZMBE^o5&* FP@Ȼ $6*@ncP||nccT8_:_xiImPԐTmJ2YhGC [$y(T [\cH`ۘ d`O@nC$6 UnΗ'6?F%ԶY H Iuߦ$#:_:v>ZMBE^o5&* FلZ4ҥշ;[ώ:_IPsP=M|ԕ##ww* ;|m@ rjt7z{TW$)TmO%rg빱K]GĄB5?=ܲeT;%|@-ס⚂^9}6u9?~饗jtU>0c+M}oLyYd^xQ۔7c.]Zmoy*7Ŝ{~O7l6gjjO>wPT״8 @mtue{ ;~{9yW\QPy+O>oݭک&ͳ_i~-^+qRp >|X,*ޟmsB{C9wz{{|M9sk Ucǎ .[BA{/-gx:1xSR_ٳgoƐ]*/v*Oҏ{xȦꫯ-ܹs7tS c=&/Tqr̙:2Y3>z뭑-T^v]OlՁv!vmfPr'x=#w8E@?Z )/I.\pKjI Ƨ~w9%w%U}^Sss>[.$v*/---/7*l|Owyrum*=KGGkg]wu!;VWd=rM HO:m۶4LB!5F8PPjS),T ѣGN8199I"Bo 8R^X⣏>*B!6㏗|mf3Q'c=:::J"B#!!`7;hIגj !$%q+9[wI/|Yj !ye4n6'e?ѾL֧n6G!'urܴMՍXczERC"Pş^ PC"4IRBUϡPBE!)NEJո)*<*BIO,w* 88\o'"e?aϬz`yH% ?C-!o)r#?ʏ6sÕN4ҁ <ڧ(Y'K$q#NB63FQ^xFTc\-/Ҕ>Q==s= !$>YW%'s 55x!iLX3ObD#H!$鄿!WT;E\~-ov 3x`f,uJF-!㑼+ih,*#WQyHZPXBV#9p8372 h4nJ{*^GuY VU#9pĘldb+ !!"7ָYHW:UDϦqJ3~`YLTepb O !$; rӛPň NXc7ܴ281! 1~sg3ل5³i\Ẻ9P^lqfejb_5B!~a$?ޞ&(!4D;rہٌ\-OxG3u!gӸs+(|"ǒv)+B!l޺+܃:Ղ?Tcj*]Hrˢ<'(? 9|LLi^B!f-EmPr21S_&!D,yG&N=ҸM5,zɣ}B /لsj;Ĝl!$j;B!K{V;VuА9nʏ0zS;PxHȩåmb ;pkJ!T7 "9u?|8jjJ lUT6,>!;F-<ȍ@g3|88& U![]cb;ǙX*?5 endstream endobj 28 0 obj 32491 endobj 29 0 obj <> stream xwDMbC ETĆ`᳂bGlXQ<"( 4 RєWMKvLv+d$IfbMR j ʽssPAyl'vfB#zb/ʑE#{ȓʽIzm[ D1o=qﭝJdc;{u/5-W#'Wi h>Ma4y ik@otG)s%'JWfzߓSӐQ6牢/iܭydO:Ҭf&1p EΔ6RtOϭT iɓyoB|y8uPHCMK\a.?UN.]uL@xN|qXPQ]NoLۼǿ{YʫJ`ܙqq Jy.ST0i\*Ocڛ-x׋VAӯ*^3sHc;vؼ2KYb$"ViN{9%Qe "DJ?:[˂rÂIyߘU# ҰO٥EM-&}8CY`|+{&g'jKu{TU)! ɹP "REM՗(tn8*zSJ_w}0idJ7yȩoKGP"e6=7&iԀ-]6sk^2Y`,/64`0:vss@DƝ<6AdYiD" ƽQe r3=s:mP!QU68H#B i*QwV 9;68MpYD[]1ǩ4yF@0Im|ꙂW^ȧ09/;|+7qJcҟ iX[R7Kzho =CMŖ4zgQSтXZoVMb06)v8{a% pv܉2Gב39wA˯!e#L;$]Xz?m:4~9~=]ڞ$]ZDʼn&t=>A/ڎա׉?B@iX#NaQSj=%}vH~^ҕlIDdYABi|ZKj%GW{jnƚkxpa5ԧ#X.t=-Icez۶$IS z£t|dgxx;EW#]Kc`b1G~ƒƊKܙ4HIU󀷕AX$JYujIC,IWƐ1.,M܏r,>a_ӰQ>r?fo1.|ITy<fN5&)|IcW+v|$ªٳ<ϩ4XWa]%ޗU,w|Y5d5(vŋ.)~Kxw$lq)OwgG/myʔEmMWS(a2i<."X+IOu]vf#GVe}o'Ѿ"}~)qJ4ԩy-*b>9#4 WSJv]H}AepM=TsEᲽG8Gr*+h4T{)q]J4f-,=lKMronGב75HGJh+6WJ+!'6Q(N9'j+W}ۤ!1(VM4 yd&M KcSn-T]?jT=4_<+ W_FK0 i`4֋WK% ?rz [9)2}-Q*IX )7;ΡFN;q_B?IC8|{Qθ 4!*7:B E '9KҐ-pGa+eqBlWVDڿD5{<LơgLJ5i7GzWױs04ZQgy3(Ҙ/421KSi[FىEa/6:i|)SZ:#5[Q~</M$Y Bf-i*3l1Ev-$ҠP Ng&Ymz}hR. zs$n{V:z~QQYD plWnVϿ99)4nSCk\^7P#ɞ]ĔQ3DؓJ)?꧊96} Ͳc^2 ;YR:ijm+tecYON  ֿqPViNJD֗ƒl0ǦHG`NK_B^q(j o'ͬ cmu5Ґ_R7<*c./JBjGB2J?^C$)֛?v, >iSr(L_ tK#[t?\:eMjĻ8d;hʵhaVYt+7ʦg:>I[CDL/8]ѻdB.a<,ﶣ6,ХHC~8+˯`5L=GzD"Y6%82z%A7wpnMif˕nVX$Ϫ^k(6jiPr= Ӎ4||ک-r2{FHLj4wکS] ? ޱ-UB]zY%E4~=IgKi6sMce,0 I9.EcvkWv->(e?KsIqvbvHyڊpKìECU KɩZF9c2+H6 ˤEA“ۤ!BF[rehW%yE/0{_M?s FlW6yG%\ eI"}J̔rer-44Ij7- YJ|غ~^7ʌe.=F͚ԙ6&Ґ-aKỦf*ܤI#[/ezjO Ҩ`Ez5:[6~bF}P@rL%/6QJ[W- S@>@p>\ʃ4yVe.안=22dׇ[rZuC'!=*w0gL.iPZi^Q#RIJ/*{Su Klix*!F;rDMj1ͽJl*j|&\O" ۮI-\:ѭ贌&zd^Y҃͌*4c[54 d SM0֧JZ}e랇b wM_ݐ]p>LsYfiaHm162Zb"z4k.#~MV;533k04]]|20)|%.!'=fZ|f>e@YOA,K󞶚 Hmy,kOvE-O5r[ig y");Y>Q' YW9KS#6h ѮJ5%q7UŊ5Y!'rhYnb?zZiEݳy-brtk2wTdMx\etwoґ|Ds,4ȕ4&Jcr/ʧf*i^-hs_τw rښhMi$̷%g:zP2x_QuAّ"kt>ն h[+#*VF;2!WT-XUia(g;'DM֕qX(pmjw50fS+g[9ٞ_ְ-=tFDeL_Pqzxnvy(k}pC7ނtՃsk i?ɶ>Y<1P+Dryg{7[X/°GDR5'ht\6ǽ:;qVyziSؿsxu=Tbml^<.-.'t6pr}M֟CJ0IcSHRsNAK_i oضmʒv2$>k"~rz3ٗYdOSdN |8!\l-r|OM)X̡󱆏Hv|Id+H抷"kg"MDk~}Mc>ulb狲smeZs@ YeH%ĥ㼤^`cLs61Fv_n3QY3Ĺ(b!UoNJs! \5SX{J:{Ws~[tL '>#9a9{%#/|eD {lX6jO3(W|"ƚrąҟ#i 햽:~{Lq\gt}6EdGDEi|RRJi,_!{bCMms?fxvA(g$z !PlG;gyqɕ6\ǺSd6Ǖ{61mfOyHV7;$޸ۚB㞎! ct_溏Dgi%( >-O QL(^9E1x_&V؉pl \:XGFdyXI"X뺮W7mZGh+gʡęu+jkPq+5c{vw&iȓ4I^#hKyl'U=I9N\> ׼"<w#=']. ㇊΃4{xIØinD7:yƺI|ziJŤX|Nj^:^~3%˼g+a{o3A!Yv,^ 4;UuOJ6& s}}bJ0VސLP?J^ޗ+hوɡA`ӾB0֝e?5yJ8rۧv,;We_|[W;w#ϋg9j9oՓ(gHhWP6FnźxLF7nlպÝ}~:o1e^se֌Sc}ycqxyՅmoݟl{nsA=>`V~+ZDtѤAYkѦC^tc7_{Nf7\va_twSbHx@˯Bjs._N @Xb+,<-rY͞0i aw= 0i(b>I#)2Rs1c0.,/,p, \|͗SJa!AzSκvrG-ݮ}D\J@<:74cp⃿rZdRnfG$8fQ<)z4g ; w ۳tx~_~f*{y3b?ҸTo ̭A%zR)^sruT?uZ!g[B`3x)Eܴ/yts>n?\e{Qil S-WȝA ! BjO/,8Q&.Ѡ!GiK_,s>eK$dU*G,MR-N(=+OŘdzPfM4t^º1i&M6,Y~?qc)U]\ʫaK?.ߞ+\dzP.'y- #if3 &/yKqv-K/{F%hbt`lۥOi1R0JgH_Y #߱&駋򒆑ݬSӵSiTi|'0>La>24 |^~I.DI8Ɨ~8Fvvr'Or'#I,$ǝ4VιII;ag7_:6x}f4iIR.'ǝ4mk[rq!YJʗ<{#Md!yMuI/ƪ9)aю iƬ-;WhJX0nG4Dijh MGMF1YFteO?I#~6w"X)O| ?DƑQTN] k#ZDI-hd>Bw{ăHIU[>gzD|#x#hULi,ڏ4a#4&M^^ɵl Sgѥ1z|(W]+ijMw|ߑ[m߃x8!1SEޟ4dGUadbJ I /Ɉ!TR4#qIRhZsZ?zݔS{1)s+&kcGegۦ闧d,շ[meC}4s4YڮK!Nyuc_C&A;rK jk,3#4&i­9VRv'=|y;.حX"-ۓsI b^xx..=GD,lsg^9mfH波$V-(ÛNU)B+go˭Gꉔy߱6|XҰ|J37Mi|#>B.Rws%:wx.GJ/i-F[!Old];Crg(A:{́$S{vK}D.ʺ?sQ{6K1uV~s&"zXm+HR ;,?8>+Bu+TKcuiqJFqEJ  @eDn7=T+֑84ʯІҐ}JclR/'DN޼U K^MOi/}XSyh}B9>Bhqlbz=M-{:k#Yo-f;Ig<>\Tu1ufG64\cyh~-p8ҐDkYIc|*̀+Ґ^?.N5xOUu9GqWO l;J&8T 2^sꦆF84G4zt=Բ+ۤa6kM%Z iHc@[u'1aO0<לGoQ4-w$^ʃih&Ygݑ(ǻB|s72dg _cl_L/GGt'.6[;<4~"Y#@^pEg7D4F@)o_%uCL+E\YSւOD*>nT36} b+fCGO9ìhMM4eZw}D(}K|FC(v㔆ٰm5>-V]N/ 9Jh(#G'_ۇ}ܨO슈~P'?5A; B:a`iUAB4Qb]߅KfO5a P#Ґ20dMT#.>nTyb}!ƀQyKTLl_D+,:Osvot%@__ajEyDǐDYNo9>UrS}g7jRzlTUSDY+/Y/CE}%bumb#a mQ/_ad`ÑŅQeTKJ$懧GZޒc㜣"K^)Zg2eOͣӃqf;OpHL(2JE99dgNXۻ8!r}JZ|N"_N4b\ͤ]2d{bXZS$G\怙S޴w+'twfu)ic+{9/?ܞ HiӼDC1d_;?q\V[E7r.[#y)]唩4{N+glSEŽ}=*#Kv3&ۼsrݭDto<{N࿫ih s=gPe+erO;c'p,mxߵgb.PN=~ĢGw,yx/j`iZY) k)>मHdyѹ!MWumB9`Y| xZ؏ZM#ZCwڭe`ZCڭR_̭5Zjn֠vkc;g֘nmhZ[nm{?-rcpZ{K-OfBvkZ.[>|k8-߯v'ne|jfۭ#5nEV:7%u1[V1M{[Wlζ mb ׈b=cݽ%blnֺBOq^'^['lK-/­YVNUVKov6%o55q>ʲjl~i2nS՚jjL jT?q%-9`[Z,(ËVb\Xƕb}.: s#G2XK%v-a{;uzb-u=:PFn]c^cawe]blWG~'[Msayan07jbm XVjƭz[ը*枰Qkeed;O=kU<\֚z%RW$37 Lenn<b;P[ۆBVZЏRa-s]hD a͡BLtXn}}o8N!.bDnDIkTb{Plvy} :*VNE`kKkl|Xm$eĮ&o{idY\@b|$y"s=oЗKr~eZԎlɟQpϖ51fߘu%N5Q-{,?P%Z-^yZWYڳՊ}әՂr6MP_lfj^9[v]~a/%Z{"V*bmu$u-WӡM+*j5f{ #R{I`Z7V֍j8YRB} 곽=o5.ԪǾ9wqOԺ|㽖0j~[M jͬ'ŷvQ#5 zβzQFV}ɲ^;ZY jU[5ŦRV[XVZzfpfNMz?~hYꤦV9L$Fgj7Qm&?i߇'(3@߹ kb6xcW&IIvؤ4M '.{}QٗyI/_&9H3 OW twp,$=~Guc / s Eod;|0{Ga>m9 Iai# xzl(BGqro 0-y3!q5Ko]z>\~53HagO[2So|_Z>z@AkK| W(PP(S/k i@l0~{} g;wE_HH;.@ [2A (8zg>E94z! jKcmB hQ P-%_c .*xpؽoA kH HᚴHxo8Zy/ i XHxo8ZidS@/7hɅ7 p(YV 瞛*%_cI?Q$,4@7-7 7-]~'2'4^z6Bh7-jO=6TBKpқA xТH#iiDB4\x[7ҰQP$ o8vFuiܯC! ~KDppk!{HE,Hxo8Z[P-pEOEs o8xВ ox p(RTV vjiܯ# ~K6I\ io8ZTo @o8Z5j2 '4Ɲ=pv+=5i8#_#?pO@Hc!Bp @ h7-7o8v*%@ Fpφ7 h7-"ߖ>hQ/X~} i\ h{GhiDoo8~| i\xo8Zۯ32 Z @ h7-4r^;gF Ki'2 @Kpi:AxA7-46! 8jTBKpƿO4@ .$)p>4~L4@ .O{pTBKpƖ ~ @ hQE 4R%o8Zr } ERHx=T#:P-۞i\IH\yG?%4k3ޟ4pk2'4io8Z @Ciiܯ ~ @ hQ1In%?4Rp%hQLJhk@ .P{92 Z5v<'4N'E6A U\ o8xܯQo zKʝB xТP}ǀʀ4@h lHxo8ZTi||n%?4 DHpE' P{P-{́4@ .fHxbەi?%W#} TH\xó@Ao8Z @Kpƾwc ;pؼ7L' @Q ר@א=n9xAo8Z P{P-%4!E@ Ucn3EK pFWO.[@AHcu")qԇ4T ;j;- @ܯq! ~K)pxܯQ=VA  ;Eʀ4@h 88d!Opi47E~' @Qz-@ 7-ѧ oxFN.PP(X@@z iܯ?q)'W/ zTi|}O?%_ !>EpiZ^Hxo8ZP-/4@ .xpҘu?i"  @Kpip~r ߯OSP<;C*} _xjqFpƑOWB FRr'BOpi$2Gƴ @o8Z5JBOpiL:?@A o>xAo8Z~_4@ .K hQ |HuD(GH#%4^Llo8?ʌ؅} EK ) o8ꙆTBKpFu?q9)f8?EƬ' @o8Z5JAɅ7| 7-%_#kzHho8 @b px@ƪDr*5J2'47 /o8{*pHH$d,B*_[C.?(Xo8&%pr& Y v((i,!aP)PP=Tւ7I._ i\א{! z @ h7- i\&! zr G v(( @Cխꐀʀ4@h Ȟ'4xТJc }HEkSEҟ{4Zpo8 #O.E>"?I7Cuꀀʀ4@h nOpi\O4@ɕ7KHU z!  @Kpox1T@< i'8p=TVx72 Zr ٔ %4n7EƢWW4%gC @Kn 'D>"$gJagB\߀ʀ4@h 0~ i\! zK# {x@Ɵop7]~]I-=/L׀4@h7-jUR}*%yP8 VxA<o8ZTi,C.?(P i 7- i\9`*i'$ pjM%^ H\x3 򻃤FQ.dB4@QWu>A /o8&E iw'/BOpid/T>-} xТPu*;2 Zl~Xv((7Eƪ|HEJ! )x ˯ Bh7-jU*8Kx nFag"W =4p$74xO7\x(PP(ҘGH!R7-/Qv((#C xb_i pxjV@ wJm4@ .s qhQ{'=P-6oLH. hQ px@ƿeExВoxUxAɅ7|ֶȏ>"_ I7C.{@e@ }aU6Opߣvdy>Epi2GƆ[}H^pL{Ó @pH=1Civ(( @C6ɀʀ4@h5|lWFYo8'u p px@Ɩ5@4o8&o8?q#? ;4~!$!jB" BFNsr_@e@ }Av((^L8-'42GƶI>&ER pw]G i\{Ư(PPތt H_cl>Ep_ p>i@:; >(kxjÇjR>cyƎW>7M+,hl&c^e) 6'=K$=S ơNNeY_>ٕL-O4l>Z[ }n-Нvk>nbV­Rk VSkvk{iio[5h؟Z5[Pk-ր5vk@j[OKnLv ֟n0-݅vkGԚoY1ii~[?/ZԚawv+ j}kZiS5ִ$5ZVDj[9Pkli˚JٖZgڭݚE5[?Z~Ȳ=^XKڔQiYcOwJ]qz;a8n]EՖZu!"5}$?ίԚ#[QkNSF֙Z& c _1rj@:x] PkêENVnUa; UnnRu㏱fZVUq#-eUZ-(Me[ךVUTaV ZFLMbjͬ;@04_taV"SyZ1+b{_ |%[ֵbKaԺ[Cՙ[S+P^nQanMn(^SzZݹՓZ/pyjVwjʭ':Q/Veֽȭ>:+0qg)"I8ޗ4iϥ֓4ΤjbYS"Pn156QnUnUA*G }o|̭T#U>VQf[)~$ZV.Ø"n-3ē]E?4sE ¢EybG`h]`Zk5OcYn}}o+|і6.b2 L.S2~:/>T1_Yn V9n Z.RjX'yZ'q5zZ "NVj5jʭ s#Ժ[S%tX*nDku#Vjȭku+vn]FVkjíz[5c1CEql_z{찬]-Mkֲاwo*g~:ЖZM_8dYWQ1[PeYQhj5b/M+j5FEK}KCuitV=ʹô{QŒ{U>zZzzjjzY/3GԚ/09EcU^>ѴޠV2- [35cע?[?vjjÈUǴS={lguu''QmgYSf$˚Q+FV7дLlcS#j]öAٲ6֕e-KRG)`&ljRr,OE Z-z̔FEA!DB*˴7iwȷ"۷o##h:u:餯bmҖY4|[47Cat ф'?>6#z,Al*?4ݿq`iH#G& [rm6s+ cŇ}H䊬_v{!AF~iܱHbdviQ4֨- HκpgHFW4yczh!3`̙DCg2̥vw|m-k"Μzthn\^]ԼӏEUq[/9!C_tץ\yf+hoԜ޵M:ֽٱy!-Co䜶]>=p,3uhS;ц:sI[WPyԽWuc!/I6ʾ-k@s#x]w {ŵ&%ҘpCIE[76vV/dt7Rrx4i~6F ˸}lx|4ڼn4[TG }n$ObkB}5VLgδS>ҩŚKB/vNiiڇcI7 ^l3ige Fb=G J\ m&>CD{IW~ushCz g̍V^N(,F_ٻlW&viIjDFk劽LIews%_&6[ZX?4!Yi`yiWֹ^gI#,3/h%LѤтM;4X@$3Lzf"M5'I곥+E!-,E7X۾! DD?UrG$b۳3Y495طx^=)u`M" R[? IxBs?X1×YꎠH6[9[[ҘO+DRcZl2FfZ֙u%=O]Xg42H58*D4X4%ϑjmNQJt6V }&^^hpn3oz?JeIM4^bQu.^JUҨF&F"˗F>f>dʴai '3vi@e|:yܴK_֓S hǑbT~I6""n?`_I˧C?zi07h}@pxYLlHY14~F {Şuf>I5ObHݭ,V 4ҟIrRԾ*ź)eK-Oi#/PIɊ#WmziLأ=pe\>! bHaKn[?i0`_wOwƒL̩Țf)= <81NN6Ck2:6Cd#1!Zl%i ?ׄabwD9E]rR>IGjbN!l`)C1r͞NiEωUP Ө3NeeTs2RHc[T&4ψ_d觥OMҦD๰F<^%Ƅ$mFlB*X ("'Hn;"!*6kOU9YOd K`MqtӥHø-R\f-zEdGYTp.liKKWZaPu0[768sZsP[ѐ4`/b"7؟bpBj[qfAWWLXmui[=wf֧e캒$/6,tZ&_g-zlmU47mal֍V?[~4k=/g&F_BKvNRlԃݺ2rht5Ez[Tz};3I'ҭ8c?wU'fi|_Cf[qD]zN2ħݠ$g9c a P >!rt a>{Vvܑq_ {.oa;qaL7D%iJ/1H%-C^^DiOo)+]a}UN$N}wۑ:7*P"~4zI c GN &To3EetҧUR t+Hnj١d\_?Rظ()ݲ1MD5rD}_=]TF*_D`K p_i F;" endstream endobj 30 0 obj 25771 endobj 32 0 obj <> stream x[K, ϯu;gUA3ӳ@!< @&?$[$!3%d}z3_oL[^/\AO_f} \t헾'헊ے\ pWj}>}>*j߽⏓ OJ/|\"wrr>>#X:79uZ0xUS$]}̤S>Aj<+r.q5߿9x>ã-Hܳt|D<sH 4rED~!NLYG.؞Wt ?CP^pW>f}4=xt$4xDπA!!BȀ8R< Aąf`s҆Y0ɾBYf%Va53-ckt {na41 gq|W zGJ#W5-JP5SCXBd@S n&^<:gPJ'+,'--]8.Uvd{nV/Hf@z83JN%5'8Y,uBƤѦ+| %ȃJN:|%Tߌ l L!M7"Q0I:zF!]kOvM؟li}8gi?ɉpRY |#)ze[CvPJj`JDa X@{ xAVg|ۋ%Wwm 115*.m/^d٧LWe*>ܚZcɺmL[ Z)8=Oѝ.m\ov\ju[. }PQ%וAˌFsG7ӁlyiNt>FN>]l7=lwgJ%n6x1k` ]_I,hRk ܍i2;g`۟ӗw@bC^D p2hrN~&IK\~U9rQYT JSf3i+b{:v;4}2/hYxe+A8l,oZe;x;猦3Ken0&$rQ}JݳTy͈s!Hs\+zN""N Z=::KL @8sk^KM%|~^E]]CxCM[.XD[upI[nNDyi)N_>&sGMoE܎پߴk endstream endobj 33 0 obj 2752 endobj 35 0 obj <> stream xSj0S%=EC.G&$E0͛l ^3`|3%\ N\mJXZ[[$Ow^uAHmʣ y4I1"@0qaZc!_%DW M'2 Z-̈ emIr2ጜonY290=LA (^E5C᾿:.eW搥&؁M Z#9$3?60g\OR 08OĊOb^>wM }-i TsY_ЬEݢ-߶o)> endstream endobj 36 0 obj 338 endobj 38 0 obj <> stream xռ |0|Μ=2X LBLe7!!$>QDPK"U`5ǪkV+VRԟdxn.H} s9_ #ڊ5vw*L:Jţ|zӽWZ$ n լ&n/^2ʩI7 hg4¢Q١H:;tv(nM'[x4& +/[6[rM` !m "9M4ZQ/H3PżK\|Q]_" +gXgY},ɊMCG7WΨ#ruփVamrA5ٙ $[xilI);_ )?J2ZAwQ8&ަ'~N YOj,^{i.h2˝,]0w  bŋa Z$mI:DNJdd8TKr)zQ{(nAÇ~`][__vV1dw#~%%JdNt#aa1n7mnszPXN. (_^0g}[ɛM&a-tf7T0!m65Z~'=ݤ޿1v?1wV-K9eGq2g*;$ R] (+B+ =KD$^$R\LJ| K>s,cӬL"ǀ,(5KK^`4LN`y>:(t}yг۶3nl0&'1YMҥXmTT]/.Z݅`Zhjc4Ve&eʙə)kk kkLkkפJݞ]ޞ=e{꾤}})R''N9蛶eړ'Ot?diiiihY33rp6.9 xvFp%Фd[]wrݵ鷿=]}Z/{7]]rt5;HuNzgޘG ȍhQv8@@/ .>-LJ96!b)Ӂ=wCT3|R >…?7*8O(o pʓ.橎1P:sr:$MFutC:̔`F*ɝëPuUË[o W6=soC>M/Q?(SKB,-o<7<{l!CE(}6'F>{)lm.*&`JF}.^rהWkG:NuJ$/OM^1 ]V tp LSQQdrUvڳg K~˗W3?ic_){h%H2v@֯8ⴒ{u(,c>u~ڃ2hUDǴ1E: m%~w@~=dNkTԨQc=(g.3o6Lymdlcs2BS9d;=-AZ hE-@Xdmd1& -<:`vd2:QK*`vJg_wҰ 5_yZIQY碮 n{iثb K2}Fv?. b3/ZF5E';褑nQ%M0]v#MY }a4՚npEBn!Y/jjty99BG *bD_b(3JRk^U*TUBJ[%VUG:O|P։udopԹzFm&>Oӧ}I} KkE콎uwϸ6Ba;8U6혼mPV.+x@yӋ~E%4s iNDssя}En5&JHfց8Ag.3xek,t_NN3Ӽ3مXQ*y)7vN ;'9̀#_s9wNܛ7 oߌ;[}b4 ~ w.鶃=s,{aͷXYyv-`vA-]h䳐zޢi荓΂S[?K#lHl>W1gNEyaayŜ9-s*+|= =n$$d;co<=XPA𤸦f̅H5sbK!p4Lnrf*? >Ý!0tgğhV0!:SmjwF»R]wv]=vi]3+W~?th /+y-ox'+LcI4i+h'f(Ϳ==uǃ{/8'{񢜜㉑?7 ^$;gѢ0"9an"~9?pg2d6gC-a9 @l[tDYLsXQ4c96ɥn;N8L =\dӹ,Cy!7P`.7Wq1Ԛ; ~󭆈%b GNI4x]@ug7g e,>͔a.fY٦2TE/6,5.1oB7U܍&~a&::ium}c p YhtfCo [,RÅG k,HX+LDzQΏ-M!rҷK>g\S O|UVJ8ا>/FDHzO/:vz-ҒH1{%iM- ilfheH9̌X|(V P'Ғ+ FgJBǔ]'MMZҬ7kJ8tixfmSCOnn߾olB~7b?~U٢@9lao@ 'ZHg֛ V-il̲di#;v!I=A Nhu6${V>kY$&?Hovs:j^7ͫMIbnq=f8љ4!^h(|zҾ +݅ڔ^evk+^{)0jJTǣždraԆ n}HN  uG Y ɞJƐ|AchipLqyPT2PAFO;,N 4EbbZ4@HXH2Ҕ#wpqF>s=o‰O+Hǔ)P+?x4MiFվN6Vmn+u8dj ūE㰸]ƜY.(>n]O4oy^ئj٦M;<["4POѽT-Hw!i,|#7=F5d>|s<7KXR>/U*S`Fwޯ({`!xգ`uz 7'N5j"٤KgBJ&5|Lrtk:$ɸt,ژ;uqsp5/JZF:V%`u5{Mȳ#>p>ǗgOwK6<(Z#mV(_~LL#8Mk6jMeLdŘ4&qa&cn%nⰽ4 қ $4~-!ffogƲm8>1rEc#yFʕ +=q{OL?f£ϟx{>>xx{'O?t/we}%:,<2rz T,Ag93"Jp3F<8&7CG|6fV *voY ZBB&!i%;rHYl4*eѼeR̲Kbb_̿H7}R&NG-,jB >5ܩ˧X32V[OcrɒHtnWnʧ%MwAeɄJ*7I{Tl;jhnFI;wur!]6hak.͊׭$#Ǚҙ3B0>D!u7]9+IO=iEE.c2,KkU.o4͖fWWӵzA0 &5nph]6]on%Ӓs]StSS ,tiumr$222JB„(Bu 7ZVZWV[tM&5Kz[=hr%0֍ ~={w9rNg'=;?a8eE(+a-e#Çg> \گ0}7l߃q   QcY8ӷA HƱW@ՙ{:mW,N΂,6-1 YkBRկHw$A;jZ״jZTp*{v2dLYIYrVrV]~aq\8yn\ynraʜ2}aTT&%֯666W'Niյ 6S[RܞܞLݤddd3oJ$oJޔҗ:ണ8>=}|rJƩp}Ob/w>̣?^g/BqvGf+zǧc4Gwݶ~9{yЕE1MY9g ya:ףU яxP85p9iȪ%iBQb=s}\Sej0iOţ1_aDΆė91P4tEYK]ѐQ@ ^+de@ubbY MCwJ z1 dQ<=B;R!gć,m|jAe3/x!ޜf)mj+%꣨GKiK_S^cCWD\.7$PÏ=cQl'JS}V9⮆?=rxg#8{Hy~SR܊}ӌ#Oe޷^-uW>4ӗnۑn H$(d\u6el8M"V]8 1$]> R$y:).,ZܗpV&Mc(YFVt+=}O_R.+w6<ē dß*?Q'*9[[Tcs 9n΍Qk~Eߨq[<{ۨVE 4#398 [ŠjԉfIg_44<\Xq:SgAk/qܩTQ"|pw䶅O~~S=?7f<iPOx(3bn-&qN\_oV);Ր4c4hSP e7#Ja%!Iwt*a&qgs0h&='=SY".+LO[ۯT'PjY #φ:8Œ9Ag'v{v]J(` U/X;6{rpZ3&|_\+Pvt5 ?}Ш7ez|d-f'= NjhTV*?ar2:r 0ԣI+ H}3 4td% 7:F l t[)Y/ׇá`='C=H}l)" ׄ"݁,Iw;i 00 l&x`gc{bz"LG0߭ra<%+w]= pw^fN[@0:FɿjiDYm u|}CSOw',`!9ឆ@c۫քq&bdye\ƢbF^lI9SeW0vD.\-__V+.WeUeWV|Œʥ"WV./(( zq)\-*+/]Kj+)Z$WUז-^Q^T-WZ^S 0ʲʒjX@W.[ZZIkWU_.e6$rJ:\^TV[S[]\TAR,\^AyrIQmJyQ1RX HY\^TVᕗU--[3:aiqequQW*^\FDzŵl$8Q]bK@J@@[0cWNQTn,)Ee5.'̠4~RUF2}_EgG \R\Tk(_xcc+B;j䪓dU^35^ &4@!xNpJo' S6N7f#vX fY£hN4X`”`\\hH)\w +!ޗ ci\c;BQ#sc4"73~ <ݜB}!mA$)e92\!E0&FT:zP'φVjCFգ*~u82ZFCPQTng|{h`5h챹ӿ5^AF?mEXyݨ B_Zcߓ 鿵T5觊`1-^ J_3[Q,)&v70b#̠84CbXv] Z8BF^9JOc1]+Vnd:` =Vqos#jKFa0 ҹ~v3aN}>>V YN?Mjgrc8@A#OhO|`6~FA\܍5 ^&7*vI/ӃQtwOMC8vgL]0l?;Jg@ꆫ0QN7S㜊mרFGҺ1z?: 1khٜ웮egʉVc17Jgzb>bL:a|$j cc2Ƶ~`<]VC3cr$L)dgt3- Em%N1|'ƭoO7JC gGOQ|xS)b<(l^*?ÖʬsGa%=Η3-Ru8< K:MgrL\j~\ 7oTl^zw^z£ZH 8˨)׈)t_=Eޔ4MbM8|{h#ugԢP#Y=e¼(M\WT6j"Yy͆1Y$Gs茉fwsTjj|d:?9U Q[DcnbrT WtpUn +>rj@&"vOay#)h¨o {5P2WJEUlbVFV3[8:c1k^hvW j yZ[u"VelfpU KwvG2Nv(%QL(d s1`Tήh 8W"Fm%3 TI-sMG,jtH/ҳͧ^zU̖GLcPT_9r _ =L6E?7;KQ=Z+b|XVXQ.R~'Ō_Tn%l"ƑkR6Q:Ҏ K}ŌSlt ƗXh] S{U'qw1JX8SEwP-?F*q<~eTGei׹r#b6ɺf %~+a19Q&7fGqwbkOOQ kFbq||&9E|@K؎ƍ~Z_c5\,e#Wk񙰟jNR8TzݱVl/U)θǵֳ7)R]]1vدڑhB뉎WUWUYJ1Z5VqQ(VrJcGEW祔0G%bE6{0 mxW yN^L^}`yD^|!SxO^$g֒ӛr@N<NxBU3 B)䩣K.Kɓ yb3B~j&?9b~ GyG~dr(1<'gNn Q|/sp@!}DHd?o&}C0!yh+L*=&~;8ts#_w,>I k%]5礰S!ܽV$g+]k>.trpdr+g|WV 'Kp d/lUȖvIOnln#M;d!Hlԓ {l$lI$I$n2 e"]>>tv,:Hf%Ҿo36 K^&BP!-ke+ܔ.4%>)`P2I4(^!u벅:&7+dBs=i3YK*ܨ' IܐG[dTrY'e)P摥DIsz8,Ylŋ$a,*2$R Ec pYOT;'2ӓ6aZR8*+m"R0!(df] yz!Nf<=S3CGrs%$')đ3|d$[:0}Ns4 bLS~5%W*"S)$N ɘKMqBZjjH*LKT"d9NH^K$  %YIV~Ld$O|!5>) ⒈ma qx`${ $-"߲Y!&`#&oT. 9mDcODUDk%!Ol&rzkR>viC_#O endstream endobj 39 0 obj 13824 endobj 40 0 obj <> endobj 41 0 obj <> stream x]͎0y,Qk'$Ab0$ a}q?; o}n}z~H].Ik3%Y=>n^'̏iӍ'%ɾϝ>>M%͓N;|mog|~y<ɧφ*Դ~nOy^NG3RJpu`Q._\r%BYrpu Xp]{W\߂7d=땬{nY;r~cW&ӿZ_`_п,uZC 9 r3sp_zcýBatu0Y4NofT endstream endobj 42 0 obj <> endobj 43 0 obj <> stream x{ xTչZ{=#L2yĀ<$ HHB0QѼ&$dL(&*jjĔBQmA^G[jV۔ZlޓR=0{~Bԏ 6u4D2gw¶nq7B7=Y?%Bd;ٵ=ֲoݏoA(mSk9ZaLڮ9Oi޸ڵ ~p?~пac߅ GxAhuzdXmv3NNz4JiY9?fO=[Zc`V܍f֖[ .oex+|2x`܂mE{7[~3߂. F~EɄ[i'( 0Cb#CZO9|`-aׂA(S*œGh=| AY \i5"|~]h}^ft_'"#gT6IYJ}#NS u Reփ?FA+FtCЭתI>{*Cxs>ařhƥK_ Xy<}!VAoMVvc/KԾj|, Еe{3S"%$L!'5 O&b"'仸T3,ťdZ.~KVۜ9@/IoHg#s9ެBgaB00i"/K휑0g3}>/ϧ_Wck3͚ 8_qt,u*9g=m4qjZwt8|75}]PܕO9i()xyŌR F:%)smOA) ۝ M(s%-fsY,E'& RHA,CIC)OJ+i75nţBnMmX.X0@ZîE:7GpcO|#F DNA|"2ZLH; 'O)I,IW;V%JJ5C,@W*ibLً˻;:sdѢ 43ʅi^{= 4.'CU`UzBӃv4`P  D9OHLȰR˖`R}r]"ZP{rG#ܼ~U: / lN\!̩qs{4JvfP[П`aȄi"x$.M-\*1-ԩ._Oj09=NI3GS4,$b_zb1>y/hU9JCet;HCr-XT`^ _)7L#n/I`(?!nlM .J; ׷uVE>F1(o:Xu~ɱGc;W,d#ejOE΂44ɀ{XhfVU x 9=3``!ͩǽvKhvFs̾~' K\ljz #* gHoS/rA.5ئZɃr)oSlS2TőM/l<@p S-ˎYY1d^t[뭻nnu_ۯWSa|'!!56{]_Ng^A`)Z43hS iy4dQHg|10,"02{3cz"l+;~X,&&i+%)iNz@x "A[|;WBR d W~pٌ:?CloM җGNTvu6zO =K\XQ#[<'?-$<iQHO<+ h*S<bUԹx4RJ-DcX3jz^ zޤ/$SrYbNW3Lu:.W_][_kXk\kZ]+M[[ߩݩ۩iii)Lߧݧۧggg'K?=;?l8l$fB&%Y/NNZ޴gk{x/n{oz@{8X+ҟ> [K|7MYpgzc^~*6^17 jC Z]匐o'T%Z.@z2-5Ck~-\^ WTtwscik},Y!Vǂ9ndHp=LYF{Rn1pE21RrOz$И T/0fxw{y+n' Јd5][WkFV v=}; 4~7%kЧz9'^4-am39CG99؝3xȜ'Ÿ).w7k;(VwRU^/C0d3L 1#-×៫kkk+Mk ZSVMיy׉xGҎONONONzO'NN +gVMI )}9ݡΣy< }s/=H?''w~7>u׿#5-}/~*Z!lr@Ѕ\h0hI$ٔop#U B+ rnq79O 4ۦHu'b-vje/b=MYY;:O\<{ &#Zې㐅Tn.%Y°G2k޵u.714ZdEE8\")UY`=,+ v;Tϳ0=\iA% V䉟4y:P=Loq+):YV\?ht#}r\ЕEF]ϽbS}ɨ6m;:;,AL wYh71V*;-j1|:9jAM#(|o5+dV0{Mi?n\x/R=~_={ߌϟ<'?nul{v+~(|`AkPVfħ`z_rQ{YiGKj +Nz_~kӜGR8_qK#RViwClO\O<`B<:dʛa)lT䅠4rN>vXߡVgdg W6χh" _;ܼsiTBľ{p6SmΒۀV#M^UC 9Z/ЋJ<"ݩ&=+╃v Jg'Kp.LZЬ"<86 m4َ=cf*tpFd*ͯG C@m T0r\_z(~?L*_9tUB8[UUqc*uMIoW#~.0`5i<~+6^Kq :߸]N:\+*xFІ0mwnNmHt6ԗt:|Oo(:('ܺͧ?}ĉS4ȏJշx. +ҫ҉~ R3xު~@# ? Ж\l7* ^e58*eA#PCdj*#Yϙ-ޑUXXa٤Rx-Ќ9|_&"VWZf-b#6»7K;3h=?%@-4ZM- 7:BZ$_0a+-$'fc|ˎi8vwHadW &v`r`Pia՛̄G(]rRxxCygoy6DO!'xz^_yrZmpfgL%eوbԂzIT&LF^a1U>A'Bšұ:d%/T$;a7Z[ń[!L|s]ϐV %PQfoьCf_ꐨ;4vGxCi&vf~U J9q)0~))g9f#=~|ˌnHW]}m-mS7m͇4h -CW٤֨XѨ Up ڞ*șLrse , BƝ@) D3d%'ɨWX6YD٩\W;{uGfLtz^g0FIcPAy^טb&Yt6d3M$ۗ< 91^o*Xg%rR;nƷqUƛ77:7l(4e |vŻ.Kukҟ{Goxҍ{[:83%%J{Sª*#竂{>7E\ mnU6Z1 ; IkbcdwjT2vK!FE5ޠlŶ]iуO>mWMWpc>)iٲ/={?Hu@;qv3=-]exFc'_ DƼpJ9iz_╂h`I= ϓ~,IҷR tÿpG7I-`k'Ӑ^| (-BmoG>~/[*,5-^U{&wxܛ/c[T.1l?3-b%Deuد [_?EܳPSߏg=Σ7~(=-^:?q2<[qF Y:QE0ACVw^}B"lLMȲ*&Єq^PyINy/]^z>!`t/<0 {vs)ȩчb-f)<`yU6"L\2 C-J\IE,O}KDKƔE35?vlc/_Χ ^D: H`wk__p+/wCm}T=˂wچBflb^^DS(fryW_4ۧ&y&Fra?fOUFx ϣ *a/{@?㷢Z2zM oQ ]:cGh@)>JFgn2/v/h߅ |`r^uZk>r ,^ lV|}᷸tnH#yOO.>U-U=G4+WFM$d(466d.33fg9H*̈́)*)5T3Bl1bs6xT D*C{ۮUp_i)m ?Wz>QFRjx-uQnFwTiнyhNi (QU(Wը^֠)2~_, Gb]mkZŌL1/6ąmPCGXٔ+UtUT EC]ܱ5PWXjkYnoָUPC4$̝7aK_co[TlC ]p36lؐm w|#捺kqogI2ꌺPWG[4[C]!;Ԝ#tBtcSkCךP:cb$ ζ5 +[CbKkh~".nmMNjef! 75>9nb6 ]!_&+ 746`;h!Glljilhn t1m "K&zNb\Gzۢ9pP3]b4m@U)q6Bݭ!N@bb4#F{׆,PSKZ A%F˜!tAQy%2nmmC܀NaN.#&bw,jiDq&w4(ps[K5n0?h؆fƽ,>@izPmM'#dM{,64((z5&e5_'N84 =&M2u`+D(%MEB`w! F}y}@;e4(e76FZhc754=J1 bkC :'KЍx٬[|2_(DIn:FHCӺ5cgx,|sӚ joZZ,T׈%57UbeUŪŋE_Q5}9M5K+VֈN(esʪjJ,]^YVZ cV..-_".}5bYZS*J)UBhaiYiM]XRZSNa"tʲ*reUeEu1X `KKKb`-*]&6`XSUxyQղJa\%%@%WKą55UEZ*%˩V/.)(+E ˊeڀEeEsEˋW#vA7,)./**+ȱxQ [ I1rUWX ."Fcإpj*jH8G,*$TUTIWKuDǾjV\\\T)_YxcS(M[qr9H*Gfr03^ +&4@r\!(ApJrn A$Ґ>AeC[;Î vۢcdNvxbt ]mRĆjۤ.%e]r5]h2V[o= kh^cu:֙cio]kr"FC] A(5LxCТ@D aM7· P@90Z:a}.P;|D㰢w³V~V Ъf6 ;(l-U=S]R8omufw1Dwe|-s4"7%]5A fg[\Ho (V al50h 3*;U0j7̵A~(4)fTP\a[滉뀕28ZMS 811 ҽet5?t.:O ڙ(8?P&8.:g0:ǩift3kn610Qî1l`v {>*668I)Sd3A;uV52Q؝7s@^ň1mT'k빎KN62fWY8G<:7]Zl8f8rػp=fS~L/fFqB1Qv60zƥՈ NZqME[dMH5:Ŭ(Hj1z[X$s"O㡃yaxdw+Orm'saXd/U3sD:Q25!60+m8jE.Oc]$Kk`zLsFgBiLa.Xw%f,b<Ԗ3J`^楘Q kBh+7]aTPL5!g1O.c2ei{J"K*Uce50RtSp㶳AX>fG+EL B6GHY6jV1yQQ3LEL"$mveq KLRelu5ȱ֗Xx]V)۽leH5+6Ud7 C(\(R&l\v麂YWrbzL %+`aq=TbQ|728\LzLx*?c{r&XIWkќ 1wbe G%lmUG8-3ZW#r J+fV5atJHxRf|:`+& YjXr*-z i~]a_Ʋ*ף㛮:%w]u{:QXmL´Uvym\&T-l*[6]]R@y0/rC>Ey^1]& 1lMzaG:/HD%$LpH8tJC"nY#Y#k|K m! ۴4 [HDnK faDnZP7zMJOjBR&Un2AXN*M2TEʗ[R<,el&YFq )5Kt-d)^lXVbY0QX,L$EAPgi2d&72y|7&K$s脹62GGmBff2%|uBr]V.k=B4 4<^K%3d 3f4JX{Hɱ %YS5BdIfϘf2i06J O)4aJ&/!iFHӑ~^1{a֛E/Z s'l!NID2:Lt38lO#6kBu:t,1Ü9,9Ġ' 7,՝ ZѨQۉ D!&.b#$s$#oxyb endstream endobj 44 0 obj 11455 endobj 45 0 obj <> endobj 46 0 obj <> stream x]n0 }ƤP%C?ְJ#B96i/~ nڮ7;͡ms =;X2m׌Jͩ4O[$}{1\Ͳ|/Xzw/>MTi(_!k0 ?> endobj 48 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0"d:yf:BP|AzjkqۿsTw> endobj 51 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 12 0 obj <>/Contents 13 0 R>> endobj 31 0 obj <>/Contents 32 0 R>> endobj 34 0 obj <>/Contents 35 0 R>> endobj 37 0 obj <> endobj 55 0 obj <> endobj 56 0 obj < /Creator /Producer /CreationDate(D:20080627214510-04'00')>> endobj xref 0 57 0000000000 65535 f 0000586532 00000 n 0000000019 00000 n 0000002096 00000 n 0000105587 00000 n 0000002117 00000 n 0000055619 00000 n 0000055641 00000 n 0000105565 00000 n 0000176694 00000 n 0000176716 00000 n 0000283189 00000 n 0000586676 00000 n 0000283213 00000 n 0000285733 00000 n 0000495304 00000 n 0000456467 00000 n 0000357115 00000 n 0000285755 00000 n 0000311563 00000 n 0000311586 00000 n 0000357092 00000 n 0000389632 00000 n 0000389655 00000 n 0000456444 00000 n 0000469027 00000 n 0000469050 00000 n 0000495281 00000 n 0000527975 00000 n 0000527998 00000 n 0000553952 00000 n 0000586822 00000 n 0000553975 00000 n 0000556800 00000 n 0000586968 00000 n 0000556822 00000 n 0000557233 00000 n 0000587114 00000 n 0000557254 00000 n 0000571165 00000 n 0000571188 00000 n 0000571393 00000 n 0000571959 00000 n 0000572381 00000 n 0000583923 00000 n 0000583946 00000 n 0000584150 00000 n 0000584643 00000 n 0000584996 00000 n 0000585657 00000 n 0000585678 00000 n 0000585869 00000 n 0000586161 00000 n 0000586322 00000 n 0000586375 00000 n 0000587235 00000 n 0000587320 00000 n trailer < <53D5D9E1ACC687C61D7675B33DC00BD4> ] /DocChecksum /95FF5C7A703733EA2762F25EB6924660 >> startxref 587589 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Zoom Modes.pdf0000644000175000017500000035532212277111530017704 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xZM# y 0 خ!a!@$T*wx."rpO# }NK?~:/?!|L o=x/g<;>ݟ]p=^pn/ׯ}~~?8ǘff_x)}KywzS /zAoq񻻺/L2}Q.@핑q౽>؋'ސY<8,*x'ZܝW5$Ȩ!h {8w2xe|f}f,4cՍpc85o=I+Zٲ*D)0 C w3]ܣ~^kqMք쀴rLmuSSyY5@Ji'OqGM"*ƠN ٤u m_y9lg.VcC' zG|%(sC0UP!lV@k68meIRIL6Eh#%ɜ8LGf|lq1 UXg-]#Rϕg(^i$ f g Y dg-8*)9j4XiLiK&o2oAHW8d |ϒ"L??u$Cf=HMHIzh$F2rNOf/gv>I ZIj<%!8H8, +$e^cFTV*Ҕ)ta*1KYҭzCU0j [ҭS'9&WvB*_[b:9K+{D)HSAt?&fuCKY CUeC"RQQgV)!Pt= 44]o䲤 ҜEo XCj  FEoڒÕkn0R7Do=,D#4-QqaGdZJhz@M*d3iY%NW8F؋;Id'> r݉% ,u_Wkݘpkڑ[׉WllD*(r%.G҃KyQͅ5 ٴFN>j" s-Wd-2^ZrԼbbi&̴muI~B>=BŴ'k|O-0 gpeqK>iˁ%p{aq0fT2o5㒪PtHUC3# 5b3I&bJh孨@+υފfReDCrJ5A|V`EX6nhTƣr٦{"sSֽ2~ӏʺC5DvSdmoZ9 =Tj;*=ef6;vwR%^jaVmVu6u 7|VpV uI3*qrCdB)Sw%9rB.9έny\ˑcX~B!jf1 G{ΰZ$'Cza9d}=u=Ӣ7oP;˥-jt2t܉&)A>c9̾u^==#+(ۚR7&j =_/gۼJv'd{G{mes 'ĩ]YG9E<7[ }M%pz>6;gƹ`B;'YyZvĠ(YC׃oxX%oʻ꾧7H(!k>5䇙P4V}%`? %,ϩ.f[%w>R>4,˦EzsDB:>6z-)dRt驴$=Qðz:tY8jajrZFk{m _Iz<ˤ 9uϻ2q+Q7WXw^y8=w?J=ՙD-=_;w?JzT Or">{ZTz  -߮)Uj=H`Q쓥,s1_rlQꢑ!?107%,EA`7k:0G.l{ɦʥԠoqx<mwq7dpS9mO`M]ؾf8x{R6\E2c1wXDl &_ZviCư)f*5U#z* Ч~g&*$fӵ{NFyi)t|ɞKwG9ٞ}i/ncOp֍ endstream endobj 3 0 obj 2634 endobj 5 0 obj <> stream x[K$RHTBPσo > {}Gޯ̬Y0f,=E ?~?ӻ|z?vIf{Ac"U}> -)~鶾36Z8vwi܁ -ﮣ·j}s$4JSH3U-v]H&Vv}[؉&]~DZPY |eQ(jN78^0@Q Ɣj.aP88h,1#pS^=IMJyc!%}C-i4jSY'- WY;3O޺nYL;zLE|LIW~}TbUgXNM&SşA>Duبj0H-H zgt”Z3߱ݣ@Fɏ#ZGv' حHvqBQϋv:#޲<()Œ*䋶dπ곘+y]#&6?0zx[ UK+>cO[E5$ ˈmzU*&7\ZFBhMA\k>NVRAxB}QINގX%ugLGnFMJa gˁw&,{x`5a;HPZxh"\9C%&, qB.\}G药Y>#q{mm@F.i3E7~()ޮ?dM1 ;d=}-T`y;> n=4 1QFCu;n1}ϰ \=r|Dy >ʿ:%Z<;]g=T`EN+ Z>-(?YLlş㷘[͙ޘ׍O(¯ iB~P4pi>XNAcTc1u5&(L*3!L2b< f&E:Lf~&doA!L /Af |xJf5dCeč\SL]goܱ{v} R Hv N,m!} SUBz>u wQ$<|M(N9Y$5?V 鸪҄#f*8TCL?+<ѷ 6b.{ez b@5\D.!e1^$!ـ .lp^8˺ ٲGAT8\:gLSKU#5hA;-3qC ]yaëZ営fMwiqaw$I6G((SȎc0؂4'%b5%UpIpK=f GaJe_N>z>2RjZpw2H8C)&2- 7;C; +In:󎏳9aST3O'! ^>LQf=* (y^G?DOOYՇY3rCQ v~zS]/ax9#m/݃*K,Ԓ-r;NFuEԸ}SY8+.U ]̆jfrN9%WdUTێ`5x&/RHQMҫVd-+,8<R%vx'qv4_EnqXXɫ(;$uP,Է'-h+iS|y'ے.3%WOL.ҥɦ%n@CQ=dP`aL>l]ŗ*C=m;-iF:ְem"A?i0/]ԶTlPF(׸F :t_A}VS3ΛuH ث [LFAvw#Ԗ;ʫ /]Q3 dC.C_ *3zn`c ӎ%(*ݲ,GJ IѶe'8Wd'{+E8-UH&=an1DEMsM8ziG2"cOpeXT3UG-.'"zgpYFvݨxt%k5`@0!:{w C4{u:xY:|^OidddtkJZ^JM=>p5]U(^^598*a.eε-]ڂۈڥIA$ ;Xvov"L&.vM^BljDQzK]6ݐn`(Tؗj4YM 5]l7d)9QZel Dl(y^,ԉpo=L9 ~߶V1[`NZ)@U9 #!J [EDoKr.Jُ*r9zį~ > stream x[K$ϯ =MBwe ދ# )2gJGD|_Tnϛ|9şJ?폿#~H~۷ff0Ϸ?m}뛁߿}~a70of^7[o̼5qwg#fivoV,U^pk,8z{r4;{va{Y7k6Ȅ=|nAI>-n{mGpMki; Z&=NOt\ ןxst2|G ҢzZp/?p"xgYFrfҽ{Q"|,D8tɭ>,P4!4'=%4]4-(1ƃ.d? h:"C# l3(#vU`_rpCf.my(f>^BV( mbDaH̞-lcPl@z|Yu0{| q u-Z=u9j.K` 7f&g|#nt%4K8嵂 % %g<mt sA&Q0[ p=ˬ)L&&D< !aKsyR@" 0~ I c3/gqv+0_ꍂƔ/&P@\Btceʈn#ʬ9fKfİ8#{\Pvp;,)yQbe++łR+&˞52iHɮ$hqh1nŘcq'7Q*ee:KQT W;6.9XVtl83-̢Gکv|pSx<DeFtKTXEUTX\׭by$7c8)yЅN^;Vu~2M$ͥ*K e`Y~(xiҷ+]+!Q&۱F4:;4s`r> HZgMݑ\];z^m'1_sF4!F@wNJ: C;1^ʆCK!fJD|TZ\hR.گ+  Sԑ.™{"~0zZ4 fRt#'2TP1rze"P5zwwUcG;;*ҹMqLJ_M`uIQTIPU}r{wed ϒ24Ipb$ p KWK~`F z?SgGB! wIxKdL$WjR"U*:mlId5x cмC,p3Fe0LP)7 v~(`ίV.j:PdUZI,i=~De3T"(2 }Y.UEo{v34|sQ|5ybr|H@rmiaJ8]jz֤;AUD>w9$Hvk>ƱJowi&xI*X\pD\˯B^SI\"YyWx@*Ec3f;E' @S8TBB/S,NgPr*I+Z%|ЋfmQs-i\A6g!G]~ܹ1,\3[HqaV;y*![ u+Q'XOjl0 ( 掛t +lvmpy jmtayugb,@6R471!CAr:Q`4s:5j `'M 5йj;L^i\-ZMBFg^ )`ع@sa%qgdׯpS=Ϝ{(OKqwgI1mc-`dm"p%\XV=>+ :_̔/ c׮9%M;yܸ]3OW.KY/ѭvRR *0FEZ{7!߮:a7}K^i\7j컨@תQ4]Vh;TUWk( ȗNan;N*˒u.UFX3xN ڕk5mkwx++U:oʢ}9K=^ .fN%&wi;8\ȍgoZ:L6!\ڢQ-u륊# *6lf9+:z(Wq {gqzq @4iά9XG9Hc.4 6qu( }5ДJs;aqԧ|pM)?Պ$VP/0-['kAFCYBj_T[kJ'B*sR/qoKDD^SYʢZZz?;*Hz)h~->mW'"Ie{xUF\$1bPT7K/R^(u!MT ~)vVA%xO5*:o99.{PZhqIb=rBEۦQ. \TgllsS1ZwlF:{*jx銕]kNmX阝2J^!Ս&d y" w'9H0dɱХzQpVu.H;^vi7܊V@T ]y&| F:iϵ0}ɣtGp%qG0aTRsSi:_b:3Mr|Lp<|oYoU/O;P\j Kmm$Y_prNckR<[H r knMN1 j۶YUT@vRq"#(* R9^t*$E.˽̛urHU*T/Uxzi?vAz1ͧL$V$HȩŗlH bV {=K 2^_o^_6T4w{88~!C%*9'F߄=i3Rٗ|{\nL endstream endobj 9 0 obj 3511 endobj 11 0 obj <> stream xWK0 ϯ\i$BځCoFJK~;j$ğ5Pc lеr;ѧPƑk*4`o:xMcҀ ;s֤-1vR!,5mЁϡ+\FyHJ_ѥ"O`$6٘%@WyNչhCeyҗQr+"›iK`xA0)p^f.L8{ _ҩk/-[ ]VV:9 v2Ҋg3fϨ&6lTd%ABơ41B&݄7C z0lPuC* œ/m`uO/@osg?;(䜑Ck5%9!|o(e!y$Q,%<lx@n0o wWrG~!5!?b)p\ldZXFbm˲L3B~*ڥg'՗\&-9Qsr|W;.:fQ鵉[܈2̡j :+R|n9LaiR'I\aXɰ'I +hѡ'.# -J*[6mu\lPL>A.NJ Rl(5|fw]ފx;Ԛebmq.`Jט\耴8|f\^9L@>Qǝ|$[#&|L#Fv+ 7(CH.<]zw+U JAnv宲UHMc1mLlzɨ9,Yiqz/jtnz8X -$i,k>t_P7jCIɿ* ưo6Rܳ |HsjbX=ϳ?z:0䨕/> stream xԼy|չ7~,35,ݒ%ْlqq$!Y 6k(iLJ\8e+YNR)ҖtBo[M)\pZnb} 4y2˙s<9@z4h$fMˆsB?Ap[fHB;qekmEHmk7lze=N6^fU=  [9A>nj6i Ӻy˺5p!57?!lf5\Th ݈ :Q8M{oh.^ t6 K5x o{xߥTߠTt-ɎZ6|z^xߧ؆ømSj۷7;=y©Gsӻ\6z腿`;!Pi#-:G7Kn.>5g ,v}[SRm y@F]@YT s%pо~-V r/ڇ~ BC 6o_\^~?%U [F@>$6!2ain)\ϭUTT **>ƾreT>PT\'7_y)՛ZDIxZJo^ EoBނS/RW4~ucKq~B7R*E1 DRCvQ-~}9Szz.ڍ,{m~ {u.{NPPoZ ݉*1Pz2=׃oIq|JaHKm; ;U ?߆n̬ eHL3H>a[z (W!ruj5Ul"J'eh$ J[qDnMo4uZS MahIc1&?k`%}c|1O9M2y?)ϔ/Օ'4Ӧ4W.WؤnW#Ji.1'5ܰqWs_NhB[@:H 59XIPRQc@Sh"-Ck֏u.jnr1ܸ.v qԨ~1zM7y)ms|ynnnMjvnHv׮ailKk B-}ZwC-YԎ1( T|+ͤ*iLظ>׮1tVAK>:} ]Kzw{Ml!Q/֔'b03 디r:I]v_1iQ`ØNtjk] n W4i%B@cCB@ L~Œ53% "I% /2 \#(qϕ'nuB߮MAdxwh-dƆwZ>T{#5jlHЅ+ֈmL vK1lT_Qo[h[Kj7ӷmK+\IbtZֻle)?6h7qEbrʭW_3tɽJX)R˘7xO!W)fi6/<.̄+w~ծ]-eW߮5Ckuv7]cc-wwKlĵذe̡>N}p#Gt84r$b19cb#*~8~^"cu+>: o__'G3S &s08&?FZF=g Mʪ)aw3?5hF‘p [H=ߗuB!inA+%SKNH5\W\RSm):ZC UH7ӛ۽Q{<}>JG<*]ryȆל(yW2Ik+l;ݚn'W_jԇ_d^Bs:33>=!ͺ >ILό0cX/CSFocҍxXtI|/"= 鉚Ʈ!] \e+?>t_&QddEq\K!c yڐ*lKv ,An6CB" 8pVNgdxT/R1:0:,-29"K$KC'@b,[{N^ޤޣB)w uc~nr3iO0^S=uS&やSnX`0&1! @Uq0aAVVUU?DzKG!G]൛W0[8sCG_Ȇ |pF(il$tks>׫JCDϐYO00J dC+1lk~@@At5rAb01/5.Ô 3a)6-`A@/cy_{}s T\.q{ݴCStϘ"ʵ[!ZV,"Q LndJ)"Z jF5|ZneߣV۔w\0 G/|p5\^RxFKgC5@KH78a5>Hk0W1gЛe/:L/M:#ԃ,*Eǭ(a@qZQV5wÞ³=ƪT\ۻyRu`Ǿ}?^KQ%{M{ŗl/Dnt}Wk 38i)hLV>L8vL9uߴg VOn,'$TX U0f6h! F2f,}gw%$#zh4$T (|6Hp 2.)2v&c]e_c^.esbѵ2먍~+/[Ne9mMl>ćjFj5t\;kjI\%35Ӽl*-y#ژWh c8m\$ِ暰B$ppd31-QZF;N(ʑ?w3C#r|d9SWvf:nHAJ>iVgg (0.Va+z0vq% ([;GYQfΌ!zT oaQbԦ\}M銫ZmB\{ܼ|VHNO0 pI_0h,gcK\Zk =jEsGC}ַiV)/8D/&DZK69n‚KrQ.R)h'fs0`1|D!%Se`8WD9NV{2먟16?}|??8ňKLXHd(BKtҁ }r€Sզji IEB= " O D*m0tVA7lLƍۄN$||vg,̳ŴT'IIL~V^⢬+|'4E֜>>52=xBqRaÈm5-}00Z'@4]* N<|$tļ&*汬S|" .jI(J(&zD`BPEH@X x/s^< 0\sFy8ӂc 78# Ӥ_S} :P攍"TL{.MqNR#[K{x6T k+1^}PơG:Rܢj*9 =ˆcqA;o*gea}UˎNG1'rk-1*F Ɇ"4gnCʎq#}3zV~[31/ύg0ʗB}}e9]Q6kX^S #zi4[P9NE)hټyix2ۗ &RJQ(e/ŗKp|Kj>4CvgSb*%0/jL6.o! ?b݂ x]B8#s: c3pr! %}5=h!U^]%iJRĨ~8`k/9]q6u3IUݺTWͫ6>yq=0|~ks?f'1*V!:zOÆ ,70w̓jnk#mG)>v!v?K9z~ÈØF Ґ04pu9C_tq>XIQQu\Xvi$:uzr>/aQ[yz""?D gޏ>xYK:Wv>:SfĖ5U\.J}z??{Pm-JOOE~[yV&IU+kK]U"-$=˕ٱƖVW@S$s)V֚ΜXjU/4i&꽚ov>V?Mb>=|A<:(}S9W*4^QXUh$R@L eѓKoAxgonewjjYm֙wtty8^ rK^d֚;%JNQLkVFv5uUF bԃT.Q%Wm#_iY6YAV4؍$欆[,Q!/sH34#B)*-EޒZUr/quM:,: C,"fN%X4KDqRZn @5AӧshZK^-]q X",XG8T 1H4YkS8+G}JPX *PSbP1y[fRFMB>ěg5YWo,٤}}ѰfviVWX4A*s=ϼQQIҵν1qzvx:MڝC!̓UxIIG=D|DA=oA=;FG4҃.(Y("9X]A*()ܹ\1ۆ{ mBeߡeܑ幫RP0cܒr0ҥ.O8z>\enX.}CY՟suBe MAY\.VVAe~,hBJѿH#}3AV v)B*HE)TN3浴b^sk$I/-#*#T,fYioъV !D8͎8q9#}3Ny0p 8Vl`z&0ꗬ3.Y±Yf}Eh(46&JGC*fSGx I,/s06'92ҹ\_?7c,+!ȍTc9j,`"G1/_tb`k:5Jb@Z)kH{+<(P\ sZ=ȍ~M5&F;) b>p=hbTLq~teii*'0Y݃m n{޶͒ݨ[e3ZtF2 -,|my-+|a;n+KKR@t0:~|a5זgQ faKy,K%R67ChCt Tyxs72c18ߦO{S:*ռ¼۷[ p& " vT) X?䧐_KN?OOO +K1#;E%Z5|Iħ=zJPɨ4&)!ε]T kehcA%*YŪKR_+.j O L P|<^?991Zq:'q9bɳd y !? S]Xg֬k D,zG?w+&] 0gŏ\:W?zlNm7kV"LO;a+ljEٕKYMmh[N[;*1kzFY.T5Kͥ k%jPܦ][kn]0{nn:~v;ﭧKʳIpM^v~mNw)}zZR zF_$;-N:_ Xyt\G%r<K ]rPƠgx؂!x՘G!_h(4bЙ5¡T# ×LulK\'7p\Ƌ$d\ W$d٩=\4&-yEJXKuMU ҨjJ/J)UNAf 3xpi`uV¹@9¡VU!|C@b xYYqI ɲNcz3&&"A+Ւ 9bWKF‡rJtysZ(ZZF=!j%^g/2h53ހy_ V7+ԇT*J޼hǬuVeE-~0Ѵfטۮjhiyp略de|H77恦:1їKfm0 f|`xoʅU e7,P*lWwR}}f{ܮ97i~νQmN:*Keʷ}JZUFvFbqŪQC*X:Bth?&C~lD|S g)VJ"&ZIPk[j8Ω6qB֋ڔ;!_~THC:Ҫ8q1^Hߧ "p̣v:-;4ޒޓM\>I-KC(v8\=QNDOFҪ*y>v9îgW<Ђ[*$;7_z\_;iƈh1e =WқV:oŤ=Fm8ʴ<-AㆬW'kSpv4Ld<;C "y2ug:.v\7m<%'fáʊLEV5;PYxyh{fy=-.^Bz,oK%le|EINwB +Z%֚F t΃{Вb 5;=8??\eEnU~xGYWfMk7'?s<TEąe9mQ&0lUŸ ªKs-]}7*7֜xi^O{6gU{yGΔz|&_"9RZvfeUg-v:Eyl6Vqb8fr!{ʄM9dThK`{ J&bL'α,9. Ys3zk& HHդ䲰SK\u%REjl2/`ARh-vlO0D,9r8&ψ ) b8U2P^]^KTQ=\xO|`,:S.ɒ,DV®OИ}$ct:MzDP-CS uƺaP BNOp@PJ]{ @J nAm^7>4@zHp [wR*[z *%r(OvIImk1-_Ivx<vrS7Bq_XxV~f<윥(H|6QJ'ʾ:7ta\UXBghzSyy᭠;r⻭g<gPq:$OƷVp8P k-qjNY><򘑿E< yaJibLYYmULW%Uo5mMܡ~PƐՕn2,Rј"ż❥@Gċ(s哰ᴝOKvx=o%2WwqB3|)"1ET$"?"e[2 hXudQY*.Sש"E&zʩc[å/.7W-,29\䚇QvJkE'?U+/RXtɤӄ,i^]6bP\]}xxt'4:l̈́w,Df[ f@J6+טՌeF gqu`zCEU';mq-e{IC BKr%zu4ciQ F)#b6mЫ^iLidD 5GN89 Ivp  r;:C)x+h?{zi l6F]=cb-~ !p [*X8}RրpP>2@I.hӿbV|5Ir98m$$y%|MLz۰պP}_FSE?21PZU !m #f $~09MZt}NN_\L3 Ǘ[[#;#*UJ8[TJwYDmGrH0J-XN/]JoW3}Ze!<#:T6-/}䭒SiijҘs R_XrP4F>(q{a "b(ΰ#( ;YRYyNR֧͆ Д#JHSJEB ⮩:s&8ܚ03 KDT󸃁,,8 zp "g} !y4@*`eUZ]j%؀ 5UJ}rp,15^j&oc6vcm]IU0\fj6_Y(qU2 6˓H0>yK=9{D$S("%{4CFGTON8h)edl}U(!h%D8^xZVG:B-P Dڣ!a]ѻbCɇɡKBE =!MЄ&B[,SG˹S+tWx(M7Qh4jPH ł+X‹xDHm %5pXEa(BZcU5NS!V ih[-NZaDr2e- 'I"%0U(2`T'u@W$&S"'7DZ7rc B+Z>:9ATo0lǰ疵pit" 1)&b1.W~˘I/&N"@kR8KK%(zaU,Cw//-[Y,.k&s`דpb⩶_w\B9ȇ}.2rV2/dC9ΈﵪOlE )cz|s"vmo\d!æQ ^"Č^kWʒޫ%W{)iI7GoQ- qjBhp`y]'ڏ4NE_PkJv_ܫj}^{";5qHZC,` A#Yi|VMA5WdTuusl (_;IsTy, K_r;RS/h +K^xhټAhFރY4)Ju݈a#}CZm^̻z^SoŴ;飆4__?>'M1ԯH~P{=NQe©| 8 _&,>W4hC:4vW5Ssy[ .} 5TKe[XjZjQ|I׷bS&">WLƼHx䳮H*jyP ,|V S((,!'D(^+N-XqB':V/N.SgOUjcԉ._$ R()$ǒɓI3#I*W7/ !~Mar0Hza^}n>(bA$,Ve+@=@$kƪD G0YT,0^g|7Vž(@=Kd(uĝ2qD!"_6)D3\Y(O:篡;>lիa|e4|tPSh ?B%`Fe+3a|[MfZBIn_`, P8]I/s_1`al2sZ\Fhb[;4G&fHYYc~˝ܐ Kh7Xyp K*ҁXZ .j-FP| -V0 4b¨QRzK*% Ee?(x~n",1U'?iPJ.b`*" |])1Tbhg/,,ڼ&c {؅TϪ {C۩ɡ?0,{5VȢ&_5h3QcҘjq|NWuU5Z:u7~_?S}n0l?<̆!kȕdJ%NQ|XyfC3i1MٹeKu +Q/Z\*.uuWάήέZYmuEtRXvl-F^oˌLXUO!VЁUC=eoic_Bzτ%~{&4N { $~)tNrrM()% Yp Y&"N Sbz%U]UU0Ya]BA1>A 4d P1V22HReV/| ޲4hu+ uq jBjuׁǤ|⺧oBf\^BLa)㥊p0|il*lw|mެ. \]oH__x6oqZB|xɴm?Z++LxpKeN\L 8_nqȻJ,e5p׽{GуtX6:. LNk!o@0Oʫx-ů9*G| r\}.Yn6x?'F7ZWx2nDEb rJA+xRcb)\,vyM!%kup<ʷ n~彊 l 1]0l]Go?^+w>+̛mn煹PnpVLV&//<&j7aa$Z)+y~<| W w==\ygku鬵eDq w=K>\~owD|)`eޙ:Cw-fC!&Ob-Я+=C1G]X%8|u?h詒ƧKUd%'㴋y oI4e[9;S7 3z3% DY17BB1g$Z:XDh"󷟍O ='HgfBs9ȗ<σF7 V S %AK?Fuu񲺺ܦ5~gyT,^W_鹁@[Z5إVT+0=e4Qڇ4&`gC֥+594ȇ H8s-^1(ˏ5Jx^=-˒eKӺz˖mɖ| 0ybٖXF &!v'$)Iȫ$ Đ4vۦi!Me4l3slClw9wsΙ3g<*ygEWr|?{x:uy|2) gB%@QA%7wab\ >:e9d+9^{HhMγ~;L6,q$N.\Y:3#fOmV-3w@:` ,w%VstR^5ӊܶ;cE./ظr䁻>%OsrQ_Śk@(=9r?WL]Y,ŝz+9*;~T{sht3)X1+Œ]%i%i%.ys|*_傏+aF-O2 G@\9zۇ0 /.S{9z+Lg!#i]'xxoSz`2t..: 4/L 9v6** pj+[aNAm\X3ksg zcLtR;kdWca:\.nݭ.#CM65ߵ$dt!gI1]z' v/ "w(nx_}{{Oq\]g^Xxs%ߝXh1L0O/ qڬ1Ӳ}⌾B/-|P2&-oM4f́ߤf f'u~s;?8b8l>f}*pBǁ7\ s O¿7끬da"#/W[\;2VrYł @1݇6N{[7;'LejS\?0Hک81Hgtr9^\ec)t+hxXF<蹧 V nX.g˧K*m/pOpwڼe:k=w={R׆ǣUU{aYSAt㺚s\z!o@^̈[F1w73ww!7|}3`z%?\Pqͯ^I'Nh 0(˔[Z»`Yl݋=Ϳ?w~#G]e29;6zxio?ExzzP24#V+7sDư9M;s|usuIdmА,aNXroVsG|#cU[Dv#VRv7̫,ENYҐ10E~#`iTQg!qF'jJĢ%f+N YZI^YPLe:^rH ΃3KsN@U'ȁ"t *h mM;bw\h d*>; %GPOsRY,uXn,Lu{O7T9(/cW7̖0qHZF3rKز0m%`$p<Gm3!9 QwJ_GvHDg=K"o;5^ɱVu?pԍU_wKg;N 6Xgr^[ZO+(nF.G bGw4}E"% 0/ͯ_PYT۵kY+eߡ}0!,?L0fm\0ߙ29rEp8LvF1 40iu.uR]=d-UsQ7XH97ԒdI,RDs5z'ۛf=XL:l2K!# 6m _jNڲ\z,r)Jx`%87;ǿ3=ˑu1p$ؾg~[Mx|`9›2<]dUr]1*]eB,N\ ʲred + ( TtߜgeURbyjEAAњ!}yCW)S{,[C!ِ|(m;,;m{w .!սY2?hœ'UOXZ=O(M4?~#G˶=hxRRiˍ %QyTѣd+AIe},oVlT9JcU*!oͳ˫TJժP*ӬV-7Wd؂^YLΗ+-UW&,4nJ)\Jh\eZy{X)P0; rb cqWUJKS(ydˊE0T*-W6o.n+/+SVZe9eVe8d*r^t6y mC1i1j>֟+q9,CRq(v͹]̨!KrA `cz \bq!d9>wBxZ\\X'>]e sӷ4cyCcYeVfuɔhݕX;_-uz97$]7瀖 9]7Oə;_(fu xG7r NcW1B9hI4=M]tx$'jx=+K؃0s*Œ9pջs:ȕ` u ˎ tMe- ƈ3"'äk4\7cǸ58l|? {}Zmi9В[n,-5 24PFld4!l2;ό91Pɔ( B!_,r¬pq/%,Nx^L_yf6USYF3}E:e(EN,AK[e4fnHa$ܯʩ +'( ڝ) y1w d94'0zE.f7p"&Kgī%.ҹ Oo?wM_|nę=qݛdU-WOٛڷH##2C%_0^ Ҥ%M1~FkԚ/o+ߡ0v33Lk,/27-yJr\ޮ:W.S-?;uvwW)@mN%~f>5)$dڴf/x^Pֹ'wP#ϬR)k/ϗ;G<ٵ@Z!Rr'+*OFmK(_ pl&]pqdnKk}WZ-:zR!\-/LOݱmG﮳׭fԦU_yh]?Z>ʲ@C ?4}~UzK=[# /}w1O"l2k зxTceAcҒ(*6>>72O[Vy|^@h{yF뿘~i0{-. ED@:"w@|.d mZWq|yB!fhy,57*/*|Xsn'` Sqhop՗lfUߕdvf7^2o/'sMI@JvX7/,Yc< -ü6鰻I<Sz8ZH),>DzWN=^ɶOuem=,%8=8j/x*I@;4-훣h"CǮ Jr~T%H4C6\%|^L Aߑ9z:u[iKn=x|zK[ȴ݃E_ydn/ T:}LaVe֎7+<ԁ^i8,ѝ]Dwvta:gN|CTbbV,y ݚLNZV{^r-0ci<#iGDF =-*(.!.pՋm/:.ע*]Zی6bN#(~ud0 )r#&`#Al{ciS!t]Ճ1yCЦʮb lSoM?׵3n|f׉e q}ϛ?6OⲜHחvK_} KIDAwXIѴZv<,),ReJc )cC,J8s62kJNhv%lQWjbP-k fo7#=Yg2HҦ K꯼3S 7t#~jAy Xo9{ӷſ/~ԫ`ރkWN6qdg&_N" A<#ȯ˺ۭ /S3 #lTWWt-6c.##î(,r`WFc E6}:@fyj) Z2"V$gCE  $3,M kY\6Pv-CZ}|GNd6yML}i/E^AKMm ·U'`p0™6]]DUٙUg(C8?+y<kW&ZP~(rD%zUwX]麍.`qO`})-z pЈNFdD~tTmyd2;%; Hj~u&mV`h49y5x3aDRQ '뻼NeF|>?/7 k$ܚeʒgf?-ryʩwo| JOmNl^`(u6kez^ҎӼتڑ3,4|ZU7a,\UUG}Woz _Ú2npwxMcOv/05mo- >౏ɥ$%h>j5odX8C3ɖ,1,["Fz)|A4B|6k[^[It@Ir\z:%[PRgMW32$^;X,PP|YA`AVRY bO=S*'^]U#W*4꽲ooȄ=k7Փ>D(~ =7d>`g쓸,lFL{M>/4L!݄, >+Auk[+Wj? N.&P_ܘ(^YZ`v |6<,fOx}*'VA7K"Y^O\Ǐ_3zl籭vmŠ]urdX!o7غp}Ƿv1gvk_ӳr79_mK{j}qxxG|"_>'ٓH\8<.8t%KU67ٓ*ޞU,/ maw:X?XLn h|VXRmWdWjY|k?WÞ䅷5*P}?L^'pbmޗ]/ ' =*,Epo72 {rwppxKuxzy}]oߐ܇|y @>M4lP0%Q.K ϺKls1GrQqӲ3r䟐? }DOOaCګIJFҍ9͎W.U/fꥼkdRQ*/A R,OW~+GFn#@RlA֢P-\}|A.r9 ( z)uP 9䔄]܇Ly)6d  {!=o֏/꥜M?K9x&Pc6!c Ϻ+zmf%6 WF4 xI*"|tVU_͜t(u;orL2OY޴3-iM /VV8zfW7f]RGY.lfVW,d2` i[tu~+ڍ!ɼ~~voEaRЏgmKi]ҽ*i|nz~{]Ua$'O *gP6jNb r L0* 5K4<m"|$>@xY`Ԓ uet@0E`’[5]$ZF ]%Y19٣-eXyCyWޥo|un4_.AP0M7^@}EtRRU9U#hd~QV :#o-!ڿ.+N(9x5?XQppqQR.Yt]-}l9a&(Fڕ%Bt/!֒/p(MtPXOQ@G(lifqRNSvߡp>_p! SX(N´-F 4PuCG D1&)"xLA"ScNqh 8 kW(U_P }ஆ4P$MK!;^qhiE 탧'ZP_I_ђ3-%5 }%v@h c@$/[̦ͦhLiJ5BNJH`JMҚsL$\B 9'I!/-o%MPv+!I\=bnER'bP.wIV3=b֡|Evx|ݮ9֡&ym#)A1.˸94̑BRMi;}-pGIA(gOP/ͣcNh?OIŰ~3~D Rlj(v^O5D#oMaU!*}fu\,;>C-39¤{Ȃ3egi+RY୔*xhV0Wʦ#sư gGh-tL8yXCoһWrfR:vq%}w +兞%r˧+&`,z$MO)J83]ܱ%՘ƒOr'K(P=|VKq"JҧMV#1etN(Hl(Es"/xr褘caϙ'ĎY1GF52}6x7dl4AqL{z/?fSh}hZ,Bh%D8̴O0Ԩ2'P<6t;DP%Th #U %:N`.E/çP [Ic$%ԡ\8`tv$!`lH+8rur0'@Z-ۑD:#$d&&>7ubPa(r0!I{,%A+5M\BHCLXǠD9җhȰ9'{I[zɁ`pE[ED{[[$!c"w&#HjjiXҰi״[Ѱ~՚znZi4wf: {(c̟eizɀ-~ñA#6DE$V"\ G(AX z"@X{2]U"ɶC墽"uZfNƺΤ"$"5TSsXT$8 EH$EZSS60%"l9X$̞d; {= +/|>_X|aV>_X|aV>_X|aV\X,?-kDz/"hޟg9ϒ\IQT2쪫J 2o岊"{1M~Qt#u9|:<]q@;sD}} ? n0n|}9<7Xhȯ.J/,y.5#5&M5/*Xތ4#;:+ }c-9" Ԕ$:2>,!;{=%,Au 9_sE0c@#`9F4`4{ 8vL ^0> [ao@NH{7wR1p~ s&<$a!x6>p3qA.)x][ Pw!0ؘ%ܭ 5pQ1B)&!N!{Ĺ qn GւUH>5+"Ovcj7{øL=Qŗ>vykd+;L#njH( N(Ӊotl\.@7aP6n0`, mU >>Œ#$^dKPKBTkpEr@9d1W6+1v˲}-nf䐘:L-UTTcsdeeRfYl@6*';$S3mըժ8UHūURm'Gւp9`656*HI 5σ+' @< jWCMBCe3!4$EK",'5.d+^\ #+ ro<*CS&sIn>s`" v0A0`b` >O&0H!SDĀmÈAF \B㏏WV >il:A>O?eJGF*6B7܈jl33Kћ` w`#a7zv=gXoG LNˤ/j?HԮXpۗ}0~>j;xU:uS:N R3zjˈߧ*jGpPos;H:+a5Mm~j/W߳vuP:ZH\j[f)B!'<^gdu:pk35^sk??th߱AB,1p/ aT=>6^%QH0< 9$7Q3Mw7Po>^>2^0 > hk} 0^o͐ÐK\9TH\?^@R-&LEbp|cj]6YXVڂ<Zy5rRW1"{5ϑ`Cc!Z0=z{+T@ >e? H >m?QmECwA(`MFCxyR Z[ W/Lbk ijW^ޕa☽=It ^ $K4Rј\y\ AL37t543M:YID)('+<ᤧ vy"-ǃ[i9 q 87хx"ΎU6vPqlNvpcد\cHǧwkIQ߲d]<#։#*kLYF>%"RO n$IYFRa0-qBؼ-l]tN04mGBv`ƛ-g%-Uu,ݵpL ֑ $(5byY|D ҂wk! c}D"$fp0vrHikǖ\qXXM߶l6k^ab5#5{k֜ENf3qutpHN5tM8 ŴAp<&䇠``ц:'^#E `$( ŤVz%-TN5~ԕ i@,?߃-aKh׶&P"v$$&uad"@ 6]  O\xP"QI6H[' endstream endobj 15 0 obj 31797 endobj 16 0 obj <> endobj 17 0 obj <> stream x]͎0=Or}Hd"e5 H ByR1; R|n}nC~ ~Ȍͻ]ҕfʊ-zj2?M7§:waKc{4 0,yyqB{=x_ϱ˿r׆vmj07%d\~aӹ̱Ҳt~ȢN-+͢5۵[W7B޲FwgόqL _"w{ml 2F/I~> endobj 19 0 obj <> stream xܼy|T?~=w;L2d&$CrYّaU! "(UAbhEK ,nj?mkm_V?T)Ek+|sg~2,޹g{?y\~2EA5ztO¦%^1AV!dV޼)dBά\x֟M7 aqWiB;r5>^dp/ ^u4h^fYsz-#U[~s {W/[xsCڷ!> }>rf++*F87[6r{> (‘h,HәںlO ;B JɮBBi8yoe+ѳh֠[ բ'ћ*MCP}& ڄHDCȊZ{mM82oS4b&W -A#9zסj.5ߠz-RYKh". .d]؆߀" סWISzwL4@Y % wv>9SEP E Eͨ݊Gxa#btk#|:|xѽyz L&Mɞ+}h-W7}ơI[}vϠ$>oO?jn*u/: DWmhQ>@_c+0=6w(Fh]vs_1zfnd3] S@|"h:Pu+PN {*?/YUx7>3fE9od_ ?2|i`(2YF@~]8o;q/ރ{Wmr/yeWv>OS,.[zpގߴ.^<0!t w ox:߀ow{DfYG0Dm}_E)u W#7jfx9Y]g72P71@g 6 boO}gcLs揤C"4ZtȺ}*%ߥBC }PҖ,hiFKs43/>)I*E 9h2ZEFwx~t9>'@Ϥwwc4 [ϷïM k!|_3&gL3La3Ke:fs?4s9+Lmd"& `D6y|DaFV`lPqZ*[%5U~[OrEL1Q1Ub$?gqOI_!v. Mw.-:93Pn!+=?@Fs6t9P]-J{]7>7!d~GX9~Ogp%ǏQy-#1lg䙹$nF]3D/{q?Ɵ1k03DdVc+cH4!g +#9iy?~!I"sόÝqx_]c8fxnV3tF7|TImƆ&kdsZ*iAe*FXo-: qAO70ӐwtMf8Vg\ئVd$AEo3KάV aDAME55)Q[[F l]mM&]]J&h$qj1&#gJX`j/Ea*C:kI/=S3˙bLP*o}5Nis~87(;\oËm}]۶h|Az0v*5P@&;m-X0 R¸>0>A -^7uڜq@*Շ.C˜>CR:n'ۧn㿒 ?:{{CW,Jj KϟGw{pq}- Mr9;/>"m+ۻش9 }W|\˄/= BJ mg*J#]C79;sku ]ǹQHU g,AR.,;LIZÉ }%~x9H#-kDK4pUR Õ}z&O9% _ڳ#s_"ZqH/K$(_(![v*umCÇ΁˺0Fism?udW99r2>r`Ò`SF8+߶[;f.mKZUj}9TjHG?6h0%N^ZT(-XwWIŅ*ה|Ix`6t̜۫xP;Eۯ{ ^_ﺶE#-{JTEm,C\@7 z_Ef#5Aj5F\5CxR껿' C˸Ρj:wv51`  #:''ω2o~$€ZxlS]wn|b)яF6j`֪Z)qJ+=*>e0,6yxBZYi@2ACjFiLS@ӟ6T72ᓇT8sw4eiyDk2,E\=yU:vwM쪿mmdY~KƦ];<3eRGřHפu&:5FbHav8|9Ϩ|-p/fLw;"L xlqH:qQ[}ѵM@n*2D4BYtkqT5V[^l>y"Cw8v*T9IE?\$5f"%5E[:]~iw̌ۚmLu{2eR>00x`7דLv@AA8~I,Zk"ʝҞӊ*P"{c*<*ܗsK2gٵl(O!oу-9\بX`?/T&7I}|/-f4R#r lzFbe'ВBNҌ◿ussMcl{ڔf!\vkms#B:>֐H^7n+^:|]UdWiԾ74ښ)%\s1MKo >56#d£jyCOnϙ+.=:66~6WYm4+)`0~ʬmzSPLpq_Y~Gua{vxzHăe`祵XfIE=1}!{=^3J:]f.JyM<[Y s\NS񓇝1?ݓ&}Ȝ~6cN| &(7>Q*_|!-E#|ZgsjՅsC g2{sF[~ \]p8\6RcG ښdr>{a̿I܍y0-S(7X jt5H$Jxܱ4"]cԇ>m~4ZZ 8(LS&2;.P.[{Ɏd \AvʹWQE8\-hW͊ΔAiԌ >bsahՈ6X_ȪNcK\R{yeeeV{`S>moU3w/~itG<9L#-v8UMϗ.%sD!wlH_ *S.Eob$VIw |&j̄G()M||󑺐_/țI*9k(#9kjz,XQM{ whF?E`x3r.xH e]c9Zl Եϔlg`+ʚI`LR~7ioeSѲ۽NATேZn(#%KvjE]ҝdPK;ۨҙS)oM;&+/\Qh -皔tfL5`Xٞo.M:"2>ݼxY:*SVeФiU* )U?uJuq]!BhMXQP,eIcS["|>=;"e$ P9uДO P 0*H5A?< ZQݪ Z-}歛/R dFK~Vq܉l)b=u}͵<ō/n1yɨox-}İJSce3;;$:V2lQyvëTJ\ `e,* 6TJ=b\#S +#iC&UJ2B :aJ | %U1;-v{ ;a{&3h̏hxnq$$-'y bREw V6A F4ut\xTWx&Z&ir 79% S}/D8]wj꽛(gA9hWp܂oII_BѤ&*ڴ'O0I~Ft`,PiM-Q{^ "D,Z5l%U^0`)be}bÿZToNNcE,W X 㩭,9"osЋZEri-B4TA/.tv;@rlxFIbw]mחE/1i9( [ljNb"S P+Zx|VVju`VWOܾ{6,58qq5!ө8-<5xԎj6ڇ)NZ.*9nhdƓ{=TkM9;F9f3'c웎7vWJak2̓:kFFy1KvV\ofz jƔ5}FnQ۶lTv[m#pkÔ HQ~\Cq eyk9SCla5wH Bch; ֡[ gڶ[IFV1{ 'zl-HV3lߐ#EжI֊f KtR j4r}s4J.ݝGG:%)䆆EՍ1zp}d䛧9F┷JߕEE,ha<2N52}-&GcLYXelb}#OjVU*aZH=*X@,gp>[˼\(*u$ژoduFU\~O* H)?*wxNݫZD*ȋcshwdyђS>^ƃ7,j.W{Mhj@S?.fKLeRtl%rxT#KKLAklB;( ntUw oEHv6` >Xo5yKŻm-(^u`F>⤖ "Z/ 0 :1>;eFC]4:j1uߨ$&:ftlAa :a p`2V۶6GRBqץOk:¹.ѻzMC2]zÏߣ]> y8=]4䟔aѓY^&!O'l3^7`VP Nk9XDV)>l:1#0dPz'0F *'Xk7j ḑ4(,3ZfR 9v |O*\DI*^zY)H:@.B#11>8F3{.{S֡C F`^iH֯eFZe[@jcD'*"F3$l~|QZ"lKo8 T61] ddRc tb9[0ܘ##5>KZꈆM8Zo:fD:@}1"6wd[DOe_'б:ZDŽ"6bt7` PgO°Rfuh@ځCPqo(\%E8 lZJ膷^Lh0岢|˞s$*i^Q0K#vOYih=w,к!yx|,`O!^˧h&Myɮl6-9uu w8wvo)>[$ӵZ8^ek8۸ȹƿG3!UˬH8$FmW76LIєKWKl-07;hHZELk >o\o"r^ uD[E"W+j9+T*𘽢_n5eM7aR):/ꤲ:NsX.rSHE῞"WuR,/o yZ=b@T#HdO˶V𛉦xu33XM¸ZYǷ>MfmJě㉦҆a[9!W'v[ݚ(іAAzF6p]B[¤!E|!kDM5tدZv:AHnEM.DyfۜRkm- 5Y⭷nJ3 t tkk kmmU۫=PBY"ջ;;>[,zQ{@TsU׸^k4T ݼil3ONOntլ")-g a^z|ފﯲ& S3-M"? Z}QNt񖉉YebǕ/Ǐ'pzA٠օjjzբ7g,B`FD!`18wz$}n$U'v\N.u4:ԌTN!rSXTLUS<8)NfHK4{6vXpygsڜu"i:8 ++-nK8L7HQ˗a+a)ˆQJzJ OQ/5n,=LՖTѡ!^revkV:}=+Ri2@c86n#g]^EtԴ~Ki`?Auxx6hD!h֨vC;j|S4Zsmm+8f35bFcQc y}:>Ӳ[Xmv_(b"ň-Zcl4Fq4bfQC4LZœx<1w3$ΙQ@hJҠ8@1pCW9KMjRH)wd6))syjW@OQk' +3N0E2fP^@ҟ{$/q 4h]PT/BA<2)c.+ ѤRQw[mh6 k$l]+Ɠݲ`9_d8HF:<'Xuy߻qŁ'Ax&&04% ~fE1"Fe*yQ]ǩfJm22 V|1A0R3h4T>UZMuJnϫ(9Z˩H4XnՇ/LјWc7T6O}o<}\=S`QQZvPQ^f U i)2f/Ry(/_dZU AilJAjoUU-^ǧ| tS}V\P扌XgRי2ZJ?;0Vz3]up̓CA'DA')0xU)<̛[i+r14;M1]5;Ϳ__t DD3Ϗ\\\?R~jwj|vbZnuLGt'Æ1H&ooe;RUPCB(꓾T9J%v<g4VUІ%}>xC7^% :"%M`Se?UQ R 5U) :3)r4l)s׃g/(zAo\4A b8Lwr)>6vFG_sd01]GZlww${ۏZf A."f-mOȨazJTwm;'1eSd]"R6g3'x^ *R,dP. "eaZAk0Mr? Vv{j5[&.lQa%8wkN c_; {-|D͇%h;܌6ˌ-0YR8]F~s@"Ͱ}QM:Z&uFm?ԉ18a a+bNԱ˨DTQ`Dcȡ[U~1; X+!؂d#o;j TO&pz!yA:tKA_)&N)ab(#g4 ZUZ}iuH^e B1ބq4i%'Nn )Ty}\ԋW<g:[xHLTZ$GxC~dE٬vfbx*hTX>2ƃ VcΥ=-vKW< *\Oy0"Tlr T*5".kF Pݪ)GP5 *pă^yq*/HN@1#8 ;ys:ksҖ*}Ayj$,l[m^VQ@P9JW&4αnrZ$[wm-=Dg'i>L K?6i (ͬ)qyjvlaF5I69ﺵtiov& w/ijJ-^^ v y8l9Ct&"ʼn> :CA# @X&NJn sLtwg2ggYzxYVW巸ojOaÖ%|ZOS][M&+( *pyLS`G0=DFAg390Bg0se2y9d@(AG,T0Nr*σ@eqFUX j8P餔#m`ca(wVT$/ t=$$NT3cE/^ -bfir?ltWҰL=#,w5tWt45R@gu{+Z= *?q}tƌϯbIKz7xx(MLpǗO 9ԏ4{CriJʡ]LEF'Qs36ٱ։1F)VZP nD[b3'CG|!·uȜQ_L~koF '$IU*D;cbtc=!"L\\+|8J4 :GT}F.kM-ԱO蜉 MP|||.L'?)G.;e?GZxRdu>ɽ]=4*0z9/!'KuX/R); @q|=5#/nHyO_op1-`ܻo\:A»@xK`l2n-"D^aEXGXo0 EJ[(]N/y Qb0{,l4`=tu0c(=ɟC QQDFLDL"KDy݃=4VQ3f9wQ G'^=+-EMtG4҈i92}> 5taɧmD_ԳSRIY; gZǁ̃nSk䎘a}]3gd-^Ѵce'm. QcK+ք1 =fI3l k`(gFi4 Mj1MO}qB5Kj*nUfnsǃ/tȍee$%`{ERw(f#үׅR`2'2iVԷN1BjeM%5*mVG7izRG=1DbY.߉η&K9>OAn$%*JY|tA1%+oGJIIH,VcIl4NT $JȦE9KX^Ir,MzhUjٺ͟qO䓮|MxcQUgĞ{-+(~η:V7[VS0VEu6/%P26޲=zL;hZ5c-;ZУx "u\$ƣ2#tr( 2C[oE4w,RA* d\#&Y;Bkksm6;lz.FWr`4#1b}fظBU |@P]!7.qML)hE_Ʃk{~Zuhph|JZ ymevyNɸS[^]Pao+#̭`ݵWguIhnE9UAo\LVE%nt _]p \8)giH5Ozb!_ԩ9Zk\IϘRG~#OV^PW-K|<561]]UB&JB4KH/КCc %x^*#x#7ӸefU>b+sg8T10 Qk+nXA MMcAw(za܈c®zJtTp7jX'cdNxON-h)-8T[,Cv=?WJ~}] 1('#aI<(el7,S8WU HUK0t##岕ȅ 'ͬ`e!dJlf`qcn4Z 1zCh;#΀ R84g# |9NT\HTпDb0NF3`CDE Їmح>F1% ~@˂\AR9E^Wu CC΄%H٠d+ٷ$%-b4Hp 1mhw ʄBv񲜵?Q>Ii_j]j{* kl7z^]GOX>n=?}d"^!:::s2Ld9=؊FJJz:-%=U$z[P(Fy1aNm?k(Lց9+Mۚ:抣:WW|M9>X҇(g+WVcޏ5k4 H02EfV=ަz | b#Pa՟ `e)*a-$WX:!9!X[? fca|_52h-p$=.TC~f=cc5Z+MȍEUX+5E~4VcC ;"9 29}'WLyiWR$U#Kpj7@ F&W QP7>ݹ}Soen:U:gN_e)7ݼMwqNƻ>(~\t3ȞDUǑ{ΘO'/wmnIufG-ȃ]n3[j]3::f1sdpS~P`4NuSj!mM36SZ2Ւki(Š [ejVl5l5+lN~^ƈkwzA!gMaKʢ l*K NiAcգ6w~dYz?`19[9Y4|c/}G/Phb.n&"T]W-v|1bɮBAw7 vPՂ<Z)BapGxPxI+F P&P̘̄3G)WڝQn|S &sH@GjƣwǣJmqy܂" Ie ϫxnZ$Ac "!`1XS$#-:ٯiZd1 M Vyl9h"#5e 8`#BOd*OD%&ɳݕe2XžO`CU =WPRPg )YGV5`)Pt&X ݩ6:4jtCoڞ-hJk5z֑MxoY7/ ƮoSsҀ̭d{G^}Uϸz=b:>V^ֽlhw:ѕg#[Z.l0 l8H4$MxUg^M{G@[l/©pғB5 SL`[GjC9X~%Ҫc YwWQZ쾪3UL3< ϡ8jfÒ Dj-6BPdv%)We򺍭J^bCչ!~={i)Sdr ݝ_G=z$e#_.8T#I t%|$$%0=-IuM7~Ywx7.sLݹN̰yQF>dnI%RӬ_IͤvI6 WrjZM}pVt+3!p[;O)U j) +.a{</֬0_zOۚe78nlo`i- B?EiZ6gˮ5R ]Z^qҪĤ\ ]66W+qkתO+UEH:Vê=FaOefX^` 8vƫ:V ePWy yW咷CIsp]ͻ,%Ԛ)X /-|%qЏmӾ<]]Cp<)Ԫx_KGr2M.TxČ3;9)_y\6RaECK 1Wd{nyW~a1^O|pd]#־[)̕OmHMJ`ӛHju{҆oUY{r*>NQ#LL5z 60Jmg4;e;oJ.SoT3xSosdX%A2h:-#\c5jZYRj5VП Z#D!p4juLXyL#/1aaJ Q !LV$#*j1 %hu:࿗H4Fi8MW8@jT-\Iv(MҀJi`Prv 'nKH|\n+YU&H.sP^};Y]* diiڸ|3#! aȒH`?iA,BRfF$m4={ۦMNj,Ǯ=ݭlm߻4:iOntm$$LO1w}7ҌF?5a[Sn!Wlw߻akL:'KVKgoj6.KJv]Q/n{[ZT/ DB =Ol(yл ;0TY唯$*6rX"):m:Rk&?8 "rI%?J8\b?"}+|åd®/px%9Vf2iȪIQ1K|6Kvx?pIVW9\LvWsD$PMʪ~7vaFYϫ"@_ 5zi|70ķ@_}!qx/s⻱ߍnT9 ao!5s!g9 ݼm.>9 >qW~o63.KHWmdM˨ W#l\C}? "/r#(/qrAj00 a?0 TNa`~ۆ!S8~Z rؖLF 3)[9 Mc\r85iFFJ"*iH $IYJ!UH&~@I9=qј -Ws(NC{xFA <6L> cdq 9$$hGh"W~ ^Q͜T6+d+Ȧ4_ I/ 2>}kM(QAG5~qVAtB;h\84zU@kʯ{m:~G0TCʧTuqi%tbqN)zO* sMVqu>cVQ 9G=@h0f1b~zY%(Yi0_zOA[hȏYl#%Г&TQp&Q\ 1*ʊL:Gqe/8 3zcu@q0E04+ۑD ǹcq 8yMyuzEm"o &2KDJ4sa 2"y3b'l\|3%V4VCW܍.њ@:G BެWYM`U km"4˹ 3u2?Kg9N4CYTx5*| ),&ZY8|\;jO-qYi6(,ֺx.q^GavS4Z&i{b(- /V3#<6|}Eq)z2c\W!Q؎# ͔ZAsI(W Y*d(/1* m6\-oF}jgdWF鍰PIP6u>52ݎ8ąQ,YpCჀgVL?Y-k?b~ ºs jA{y*Wo]Σr+[0_cR' lV60gˬ,hW.6{y&{6W\:_Lٲ.1fEy%1pscG&\z%Wfŕ#|*9RT\'4KKMlM",N焬Q =*r=1Wx.fh޸vDl=f!Gmy=Ǫ/ 륉pVy Iegi8q^%٬JX9t5c/~ek!;3a+MXc$Sx.k =`Puzu1+82o1 ,/5Sz䆴]#D0?H+kOV}I;ް_U` G~x܂DI?1:Lz9e6CO [=D+r ݨ[ʘk\z80FԈ< 4e2NZz2⑀ҭZ50?OSM_ΝM~Jg<GcL͘Тf*IPr\MԸo_ԫ#a!u1frĪ_<)|EO)UcLI\fFu - Jj)^e`rpd$Mm2d$VrPS|tꤞ:Ư[j"Mn& =b% ejD.b PḦXٸi)j*\GJN[j3lܗLD6iԔf4(#0dLR&USj>Т<cM4RHr\S ʣL񨩌'A3h9jJЇ&HizB+QfLqND5cBE0S} 4A!#A\nKKFj4$U\4OH 6AcsxKD RMu_ y8x.DDiriFJ*J_\MX:YgnRbZSHL5Ti14USTTF-!GnMT&u+&Kr| Mjȴd83QquT='4e 24XI$f*N1dtB3,YVqrr20iYq2w9dA>tFhu2Njqr={ww=x@9GٷwwρC=={ J\%8wr1x y)V`2xT2M9# ,,e80URɦ)ꨡiaeb*+9la^2MU43<iܲxJj,Iids|!E@4gg^s`\cXU&xKjPÌ2lPU̔!E\/E^5 ȦطZwn*yYwHz8 d^B1<:N._o!Xd7G+=!fk-]|QiEJ/*-_TZ|QiEJ/*-_T=kݍ|SHK!}#xUw[ke׶9ztU~QIUӮ)YOkZ@m`m :mm8 h{oSB#)c+#IA꘸R'']̻<5oMPr;;tn'6>:6xwΑa;۫@9"&JSp&̺jtuq`Gf,țҜtj#_Ƅ/?%w Ry6miI:'=gFچP~K_OeC9ĥ[na&k7*f܌*yp lҦzg۽OiwXv<z5pH_?Z,},["ǚ<.>D`d*(i`9 Uz,x[EmRnf?T ~s[ݳzmvҳ>汝/qpJw )VbVF/"Zuq!*gC9%u:5i:S¦:e:SP k4; zB%?'O=De?۱'XK`!$%lpGZh fS>&Tm 뼡6/ ^| %HE`X@n:SK⫢qdK#$KRtP:!C{Y-G r { z)A{!H)#^ @JxC@ )D$(w;Wn8r pߊ#-Ob-@-Wg K{m}ooP\?W\+)KU\C[qu681ۅ&нs"/ 9K: ]Kdqm"ωk2hsrgXDja; m/fZpگe9Y֜2; O/ hJNfl_ɸet 7 ofC,`LH)B>&6ZS;ȿ 9ē9^/eKp^!Ήッȯxl@B3~͋B$?|'3mFO3OW˟Kr D݆|'u58> ! ^-<*w7"SnF޹ƱndV Ɓ&7Cx6_8v#^G;k2Jgt9mNIk_ CѦF6DeE)R5si~ |vPy9Bzw %~tf*zI@W%ψ9ar)teI9iK1ҼGc/#o 2n=l $͛)@pzsvߺf;b'X kQ]BoN5kוn<(~/ %+|3%.Qtp(6U~ESR@xI iJ@]&)Ur8y93cиIe 1/NETT}{Sw[Wlp̄4})b8$%>3R"&$q}Bg.=p"DӢ I0QFfo endstream endobj 20 0 obj 23795 endobj 21 0 obj <> endobj 22 0 obj <> stream x]͎0y /Qk'a$Ab0$ a瞴}5u=}7?9ٜmOM0pĊif^F\1IcqП:IƵ<=ӦNK~0u<xp lLqTm\s,x-U nT2JB;G=Ũ,7UdQ.`Gށd\|bf ~o+Y[#o^ftv`p+ҿ,:ORcq?^_=韫y{8_/gY5C_iw.wSpF .92ncOGy;ѿXis.]6;OSl}}l8oY endstream endobj 23 0 obj <> endobj 24 0 obj <> stream xܼy7|ﭮ꽫z߻zgߊeaATfPA@*\*>aM5HbGaC]wW~_xҫl?0 K/[Qx3?8+_A2BwƒV Nze4>0|M a9No0^`H GR,HVҙ,ގDv 0w#?B_o~fOkTZ]>abm(>DыGԍsh`"[L, 7bU! Dȉfa3ڏjǸ]hElBhV]DZh-aBmh[{ X*#\觨{}0J?:]^>ErMG{Ѓ[hߌij@uX8jf?W~| p0IFSC .nz^BЯ70SZEt T=[َx?c)? Oӄ-#]&d+@+0Z\V*zա +mC7o̽ W1#x:~F~ S _BluPP1ѥi2νl _![C̯4U?˯ ѓ\?@z>S {Sy3o؆AGgzl l3>MD" m寢J3WЍ0za3p?*މ_%o33Y[eiʾ\a:VM0#}3؏C0R#-+5x~GOCn#wkmr 2if*&s`ҟr\_U .4k mh:'@w+Q)jE|o;]a:5ŧ "&o4d1f Lbf0?b)9SnT׽uz{%Tف h2 Xhzh@9tqk:疿CR?߈~h>Q[X5%$_=:<]M 83t)E7KS+)2 ӭH9T d(@Qw_Ntq8J0`fU2t gE/KB[h AU ',FOows:g&:V (HAزP؂ɕp=*gw=+Hr_ո O[FyЈ3|(a6ʼ~b]'> mXPUf%̷ jh<ws#'JP ح}DΎ֖榆B}]mM>ΤSUD<&E#a1 }^tmVMF^X C0zÉaMBҾ6,=kp6|rXGp9RVp;jVJhhu0<<.mv$'=@{gSag)Ҕl5z`ZniJ[!HgISTzL{ #aHuw[ E¥S8Ўs6ad>c+ Ɗ3r8m!}0؋dr8!Uc:E\x2O&3dQ5.Ym-<J'WL` Bv/lU o o֠".3 ƑƦz&B]ӠOt$y yUg\w<c/=TrDkz*KfFy9̼p[dw|8i¶u#;AYCRȉL`OMf6(4R-Z˱Lt\"H6YYz@"om&7b#=UjևL1>lhS%.g šu95a_m͔T$.!9N;Ḅ? x ǛmIx`hIl5Y8XBnpPu'"I3,kp F;m1m[VuѰE;hxvj;=:\Dšx\`h9)J 6wUKh-$ \Vl;]?m1没ّWzM)Nv,'g!]+Cf4m6Q6t&oLt=*hȎ褘.Eh$9119B=,m)&A[NKcb$iƈkBu+5Fzna {隟Pc^ ϋ<>3o{ٻKE\ve]og93K!Il"MɓȾ`00$oc<'1zGȹ#SXRb"ȋJ]lW+. c- Hv\TH*fIl.9m a9Յ a,g>hM a](ɊH#:-lAp UlD/L1S$afd7ONC}hBGP/+LAō~aRk Lm5ۡVQBGY܉9;#9oSw0ұ3oTXBФuSE9@yNb  {*Q[:g]qU;?+f@W"i=ℳ%$,=Di3qk$|&@)(:>LAzi09{{GG]OUloڬ<<7ҥ<'bJNL4TIb-$스=rS=eKWM[spռUϭMo}ƚ'/dU feHX{~뿵O o+HtCgLwTA#:Q7 8LGѱֱʹ³ѡ#7?$?d5+waGe0Yɬn`Do`n|lЩO.3 :FWd.{\#Y®eGpɨWlL#KF Keb0dh-{ ȗvEDD):b )uȦ։B5& Ubl < r*zc'Tn#F`R($d MM !!?N(Y\.(KX@Z+tN8^/^~Qstk?y?Niß)^?ΏzjVpS1]8dF{]DFk %lFYPDFRl/),)-l)/pA`pڊRUPY孧-5naFNJ!`taХtڝ8tU§Q) ý0BB8A@a ah}HU  ٥ȋ^( ]oj Gwdˆ@6GC?6$1C/e+/y(Ya (zxn @j YޑЈg]HA"A=z$) g!PYe]RjkXWi]bꩥ@ _cu*_h R0Ng>`qEh=5NWgM[m.RW5wn?{wXmkKL[|βKydɓ52b99#<"'h5 ДU0L6ddEqL@ENP 6e>/3y0ʱRW_RQTgq*)m:cǁj6R&J;0|67d jL[MLL2 yIk5y7r/̐j CC0@8905ӋJv -]ccԄ&9(=-+%U>VMStBJQX40A Ie}z'~?7wݼaFGӘw0Iv0.ęX kf[.:9;1Xyiؿ"fZ]r,0&A? گ-zACf^Pj9p mܕ!FZ`vĠRvn*Qb6$)&!%C/ڻx9_2R\(hp/A.q -fQوR[twZ  J+찹 Ǣx0QT/ҳϣ^"]SS  WyAQkRM&hշK@ƺƶѺv1q#︿7p.}[!X%n֛oM-DHj! V]d,z$oV ؄GpZ,2=o ?ƨ?USEc֖fms7>SH̦;k'.Cq(KaNSs~Ht`*a9`թsR!.؄cOVzϖv-~?Yo—w>X]ˮ)G^s#J?w6&y/>S }q{5NNZ4aNnZ.ҙ ZWfn?}=ngw> +u_C{!^vޫ/{uw.s tsvǏOtt+ۘ^qڜ^Uw˟p]Nf2LuM}G}__U76.[J!6,&-t\7A9!f`|[/ۃ<ȩL%<=/z{9a<"<]՚ꩩ)|\]-0T=яeAI΁N;ʠ2Ih"Mu, kOYRl?;jXoGyko<@Ne^*iq_;SEeka?5,Ƭ6ZUR "A8#P۳5 FǃHܘhIX40! E-Dq MT<*xP)X-xC@WцKEuHZ9:2W\5) $uof?Tfj"ƶdě۱9kM3Uݳ{oSSf~ Lؔ y忒ݚqEȖƝ&FC`hiy\Xcq~Hl Y%lrnt82QvB0ZۏُG tͨ-.-R 1x akS:3EH0;y=>!Lj =pհ+L֌\6|pزni)OK/eWh[ D`;&eVEyybby G}~s2¦gUpILY4sax7[ : Jmw+x#Zn14iNh q@Nh5U(PSjc ΢ g6E\I.EM)i;CdRe,_Pj/kN{Bj4M 3Ds-zg34lbe8qr la~oA-BD_upD~RF11"E 1"I!R2&f$)]I ^r8K`4`X gXv:rdRCh8xArC[ZEM-,*(q! ZA/f$ِ̒UAQZhJ c)s>x$RK&n'%'`SkAJ-냱B[=[0ehʺ/Ø lL 1(۳ ÅlƮr!@,<-J Wn /")F+,umQ6oһmW;dg)lɆR@8{ڊ-Aiex%%/9Ja2aזQȁtVΞhB6Qd/eVp-OFN~V-k+^Zs%5rm`fl5&o:5ykf)2&dLGŽ͔CkCk+֞u(ĢPS.|iD'gD2^I%q"EڗM@MQK`i[<[B[[5W:xH-I{<=x"dㅘm+[WqBSqWhR@Fkz|sm?^7iER%!po{%9{?l2Yv'2 ; ĮaEDV;3+R(U8@%k@HeQ "մ%FӈQ0fѶ6lc.N1 k 'Z VETSV􄈆Xyψa捋_=>ͼ ˍ /ܟf/pӑ4fz}[U}'UWۿx~ҥڳ"Z3/+]Hm]D/ h&'XJaA.$=i>,hw IEA,ƠFDԻΠ (Bⅰz$Z*HD* Xx aGqIh[⣱*GY@e^ǻ(I8'Ka&1ؚD pBNÖ]ve0ACB7QfW vkK%#؍--ZU=Q|5$yZh38Zu*lإv&%df^)W:_؍gd9aG{_mr/q㲽.!d'StG5c(O7'kAGTʅkj(;x\#* a~uWb$[W?5# Xx87e!r$G ƨWDI~L hFaѦL6"<&q.Q\<"qۤ,΃˄'QIm(Kՙꛪ.<CE" u!Bn ZUN |i=s.O- oVP!ds~ffξd\esXqo-WĿ<.qQ ̧̭^E:Ay|L5bM\X* } Y.1^Z{ ?->>"~ـiY0rI* jib jV!w-%?4֟[G0<;ҝS.{p :NOKYG|O8S^<0xz~}j/9c"Fy+[_a0?˿+|(8zVec$ 1!W#@" \s\9Fkqc#UF5Kp-j@@E  y , %/].s41"ݼ 2&legc,)JLÄǷ1lSP/% !~"BxU!Ѕޓœ1e)|- U[l'*u ћ ћ%ͪbGR9i`DM,9jn?0C鵖;zܐmuͥ7'7H>} H ]<^O|XxIV~\fnv~_POAE--aȄ"INBmp [v+b?,{צ:J:͖WͪmDEvvR6[-]2.Fu_ +0d^A5sPwu|]4GRr>j0-<=>%6m{eb{c#G@L6L&%j ٺ:e[KH:)tNOmBMvtLN0%qZg3uَќU]W/Wt9U+#-q2kۖu.ۖQ[#{u7;88?[ņsgLZC.*ᜀs/MfÿU@јGz]& 4´TZ \eAncv?y3T|w-L!$ְmgߛf'Kڬpyٶ|yngͯG^AC0cFzH,1Gl6M 8ReA}9C6Z Cz\eL2J­hA2`.TFd-%櫔Dnȍ3+ pɡL߸7?m58C6m\>˃0P8F`bq9Qs$K|#n7km8Wŷ}F_&XZPLJ>O3msŌC8t55&r:'w*:}!w@恉߁?4Ncvdsblҫb+Ԋp/ 85c+V,VCÜg)ť7d6{(#](y-f:yM̲Ǚ]!>qDZjO~Z(gP w ƮfSp ͛ b~aV"}QP)iCO;.Q bK FDtІzMȭ,򿙸D[ +*)n5RI9ڪ}v\g+jW{B]:W5&s_$I =mjَggN[2u<%a4ӻiT2SAQϕy[NI5&b )y֌⨬Rj_m~@Ӥ&%S}aڔWoj'ވ9&X[ؿJ@_K^ +CSCSg?$P/1X OhI4yC@tHb9B]($t%@vcݨ'[4[ [-hl/$J٠~"mOlzY[FL=fOmLNv7jWhkI|mz'~JW3sXM eryu{NH3}ӢKˢZb_Yz=x^wǾx>~c:ɳAm4А[#?+E"* hdQ8P;Jx?#%P?ln"(`pdބBs0Dvb8$dM~36_8Ho%y20>V'o>6^̡un)P"=W$>gܛW;yAqe8IEtK lwhjL-J =2zcJ3JXK"aJHk]v_{dt^i–[w̹AjM=yEbaKdd5w7{7gG%C$g8GCפw7Dkjv/_,ׯ7 ?m1B:Jގ[vc G'P@px=ZQy dp% X]~V>< g'qxi+PUp 3Zo5w7N1džv%82He%ّrXQq%7JCҤ>bwxOϹbM0oz\^w.j:{y[?ertvZt&K|,jGPfD"d2 },Cl|[h%o0/A)6w4JZ$+XQ*p0"ܘ;D8"+L=#:Vۥf3kUq#ZkM89T\G_SN g@jbRٮU=6P&]h«X% T3 |Zl o܁v»"Ϣg#fMXIkƨ=@_pգ֠Hp`A؅Q ):sJᄬyiJl@ ʴ [b*xd-i/RUr|]E׬d>=Lmʴ5Js>ߣCWE2ߊ5F G;ƋYLjvIbƘ/*Ǥ(bŅ`|k|_#T`w½M$$Cɓl; zR)MIa7[ 66ge]ӦxO=w`]JEݷŢ> a%zxox hZ,}r_TpA*g >byݪ,p$!FE/G>ȣCRRsTTBp.1+vcӴ:o,ښff_ [SL8}mBEïJge*!D"n5xHQ%jJRdb˅ŖRFV;$}#vz^3B"Ӵ|P$Zd`[&JHIӏi/9ju3ʋʍV +w?;_q"lLZ0yniISy ><o)*_U!+b1:DctA;򮼻rqqq/`.cWWָָVMk]׸m _ܙ'.!qgό,W'8g,jBr?7cLl6ݎ Q4xB^ѣIdJL9wpgvXL# /Qu8S]##=D.C i= \DXmж h! #j ??p&)fb[5 6T'AU3s4RUv8=^_!G=A UaqgA+>(ozF/ޛ͍ ;2>/3{ XTg_F($tPMld`-%^ 31pj0P wC3T>A]JTUkKhqON2Dh}^Gs[߭of~s(j_ ;s?GÀ(6ye)G]3K48p͸Z9Op1RT/]1qKjfq[l[F_K7@cvqqCmw8v8q8m*MiĞc7_/aРzGCe[ߠ:hQxlC17D*t␯ACB[hx/'t9>hU,;^Tp)p)iL`$.x#,Q<Q$}Y"dyKCϐ46OFVEUVȐ"h#oQm8@_Pd"1>t{;oZ{qV"wlח~+M=gl}J?x/v8ןO(}vSkv Z6WIiDL/`=ԆuuM*5OʱTА(9|꿓<}PD<C+J;0 cH$^|&s޵mn +K7 Qg=!{yTF>FofFc9LB0$ 0ǸҰp)+9 h>0bO %3M̭!Ud0밎l:F\B)XT 9fċq A[D tP(:U1RLfsa qT.ҚPE-O*1Lz7| *dY_j U0 抄HO.Z7$I'$`L:e4w^6~KKKw=T|6?wmU{_1q$[v'N_q'$֕-"Kd)#}ZJ%]!PXAZCHmקKڧtIZ::JnS֒{d918==ysHbxQ|a_^-ϥ}՛M9C8'$'rnI3Il!{4k[faĜ{rζ**6q;;lV^0^,o#tB^H2yoq:^@ x%k7*%͖OSzeeu윜ۀ[C|zEEG%Zޅ[Kʶ}Tŏ|񺿳=>pzS+yae]yp?_& icbmjʕ \aA{[XtTYLx6Vi3xXy#[ڥ EsE ?&[ t .%VTA2l֔ |DYlA1g%%_x <+\Nyt'Jx[xyV.NfUn]2gx"Yx +narY=^[Xm?-po }A+ v bߊ.CgńߊVFJ#KS #_8[SG~&<~Nׄ^ /sq8w ^+q-ŤǼ~rq7 {_  V՛Hx9_8L[n8jaܟ 4!F 5Q $\(piư[Rx.?'Kr8S}.0OӿG8KӘyz}dž0 bKeq!ItԘLe;0d4w X\DmDv ‡Im>@c>a(AB;]{rjZ"kzzvܻhUV!WN˛ӲcCƜ$eƇ1NqOjHVc4ל'&*<*%{[aOr9 Zu}HhsYKa>E;\0%vb4PMȇ (c"QZ.]e[(~jP*|y^Lg8(~@3^kj!?s[# c"FI?"^){u =GŔf/ m>_r26GRlSyuy #IFfE:ŮHވ6F;_l6W?Fg3-kq2`aot[Ag.F]!j|s&E ""cN\DJ~cT)|#wls= ga^Z fev/yљjV=_#b; N.;E&u6*N\{`.o$f줩5{=I_d&}),*kTEt?>}sB}iv<;i)cW{Bs'Gl@"WsUbj̰EͨwTve{ySMi0x;8EJ+.i\UQӻzMfK杝1.AxOk ӽO%|&)}y:\L2fY>:Ne{Y(_ia@ܿL4qp4Om|RX3[hWW N-80#ތ$; \{;15xYaXD{4+jߐz¡p $#X R#y`j`Stusr+֭kj@rm=08횮EG4__`XmTA_J{ec*l٥Eun\RDz8T Qu7B1vo(?T>S>rviC>(oD֫~X :UCϩc(z_CpLÚi\h8pM D5mLm0U9{]EaA|Z(Qm?vyLLQJCCȋ}0Ij<"0w! Gx&(|BxRd ڽ:bKB 9:pb`\WFXKb9`9NU=6 y^B[,0q3?^75 -F@l F!u0Fe—%ӐȸnI8|@'CUհb )rfoP/G1Ѣs(46:E (ơpq8qXC=FtՂIgkM;6oQnRlѥݸgͷI/Q uy%K `ʈ/pKGh+0KAiy w0i<`NuĆHV?E=m WTf#I~e/D;"M! h%pSΌNaCUG8m)^]bNu'V$VXj Q^Uhȕ3WE^$|cG\(Ŗ˜ ҉K=fɼ!np$?RS2i?=9 df@ obևq,֨6ks>dR:k` U>c>1?Zr9-0_K)o3цCnj MvvشbŪUhW6kV[Κ]#j:?ifk?䎱d99lDvbsr >cIoK2D? @4hD? @4h { zD)čsJ6Wtݙɟc|GZK争v23{ŝ@Pv. dfm,Z۲mY7wڿMsn\L— J\>\8 sc {Eʭ$(\i;܄DѺX\E>ߘҍ"٪>f@$׶N(=4Vml2Hps0r N']㲡[hJ+ť(q"]l?8  .H;O"e 洆](Hv m< 2MQ .F9;SCMh 9v(Ïz*Eee[tX>:\|$׽z8ySy^$o< yj̿-e%xivʟx~yˣ6>#j[@ab\QT )9r칳*5\hPܞWs,6Q(m,rXOؔFe#j R0^-P hDT邬DTzgGdzfζ4lqg[.u/"&2G{bB{~v%m= |mTc ڣY~]#ר52.HkȉyE>C^g3Ǡ):EǠWNZVk[㒻{ h"Fž"uy"hlE>+z] %KpNRۤ5] ޵-Jj!j[-rT[Wmjֶ|fVEj_wakX>\c=!Ī0}mU~x****'V.u_ZZZZZZoqxZԮ*mrn3X YncV%߰&gYu9rKss sfZr\E3󋲋ymᭅbc7B[ўhvtO\ڞXN޶{B>GNL ~5ƎI)ۭv)Qͺ?6)ݓ%.qOE1$so7s=lƲ%6umWg93*ѽcw= G.UN,ߡ|Z>=`vN:m=Vؘw`V 6iΉVi4hӭ&SG& :OӃA;A7dv2h [g&-gpՂaEۦᯚ_Ó4=ՒZ<×GI #]Zu. ?񉑡xNFPj ޫ%FDSذ{|xCuշ{b[467tU{;${=8ӶEl-sp|:mz=d{{ݻ{"o>)cX}IqeewU%͇ A.Cew_V*ʺBu݌u9st8bb'p:Qxŧ_tG ,Y;0 : 61k_B7KV=;)ǝuTʔ{2p|,> endobj 27 0 obj <> stream x]n0 }&$P%C?ְJ#B96iǶXnڮ0;ԡ]p -={i҉S3fy]0,YSe76_BGGu2_t"?"k!yjD9WmxO׻X~I>kQicRhEQjߝuR?M:[֑ sτ`l c/%ǂ+agfKR }8g%9(9x#Y- ,3EEO-tqওX-|WxN\+e}ߢIc?|;484$$݈[[Јq;ӈ-yyҖ`?Kq5c6~qQſofAԭ endstream endobj 28 0 obj <> endobj 29 0 obj <> stream x| x[̽Wnɒlɶ+&n%^q8-"Hr  (%6BI)-KI@Zm-X Ҿ}{Μ;s̙͙+%V"wg8/#G7|!A{ &/c9B!x_@&Jy+<. E3ࣆg\6!P !Ϡ鶇^g)S m uw8a̰$F*+*uFH bd~%#}3p5(zN9&/f|N QP ڏ}e( ƈW"%:}Jo8jFf܎rQ8P@h #Щ &h1}=^A?.2#h}×G=nFf⚀^GQ98~Mjf 9N u菌K&tܳџD*T 7(O0v>zm; ghHu!t@/Sӆ1!f [XS)Z+ZhcD?DatC'0KqnajIQ" 9 p:xHc'PREې i ]v'C7Gjr c?`._f8݂xFpڊ֢~4[5^KzM`)4\/ŧً{ٽW$O,SABP;u5w O_ſǧi3ZXL&z1m-̽#O'2^c`¼jJ}5;߹4EIrI?cbDbޒH6C_Kt!Nu>;>ۘqMp݉pNZlFV1f w01 .<Le 9:^b/}=nh/1Ǻ0.0RY^'џ3͸#\9&t7Dň_^ҁZ Duџ? v\Q ģy^h/&ĩcR4:2+Mr?vjk*+J rs]YiTGY-D1!ޠi5jR!Ic$`hia.ͱpayvx33CS\0In[tOcb-_sF>#xvolpnn ahoøo 7m(z"'P(T6:`c-cl<  '9ÉAu6zzm59a\ #EQP=&SixY >uuT=0YCs a3G o>7hq|e{\hXԹ єREyR>,wwT3ǓGQR#seKv4c|ܞ8Ab5"R}jY>-NL8r4n8iwBI-G; >k0 |ay}Nm%kĩu;?@v_xĖD@bSp geփ"Z\)¼PP[; [S2ۉVwEܨ [ Ea"J9sSda.iYvNŜ&;;w69;=.u<cnh$خp k`2nD  >5(I8pyE )(Q#9 bqcɥ|ը`9( q8'2s<{[>A͝9ؾ_qls%˰ѽ)թU-@e8 *WjVZ q֥Ֆ-=wIOSQ]-ŷ>l}_9uD(TJqK4tNg=pd-K #l[Qg[ԕg8!O8zt+.,r'yٺ|3~ߌ͎rQWpOlFp#=qЪ3G'%BT\5.@q%MqQU6aVk'&΀VNÎ UT*pXA4ulĬT@5PfqHHWVZT`,9R1j)' l<ީp,766_mDf#>'w~Mi*^z*'eOȿ[R,+^9eE0Wq7# ;$7HMvMEfRi3<kRT l͸MviҤPi]⺤,xY?k 1!vK▤+mۘm쵚]v3$w$=O<L)SRI!RdK&ɶiػbv[R\x8_ \^]cಸ0绵X7f3ҽ:kԧڭ?f|iW .!KdNv$(Lڬ}˔` PVl'1DERY;JK˘%m8ګ)t5Zaycf>qQeÍ%ˢ+nMFOEI6b3wS.Q)ӓlOI[ i>ѥ#'Ned\ls$Krb1#q)#dsb 2:fഏ1鴡 Υ*"-a%x vZj`4o"ѿ5حq9VmEFTF^A: DW %eNs9ߨ]xiV#S(rC6֩Jw^cFYǟ-L\\b})tL>lc0Rmw׫L LXsIŬɖrNYy-ˏeR8Ev%fDaZrMLPt5E=T.&HZSRZO2H*QK7tvD@P帥:w{,+6g/o{l/k+ |oX#]ESt2Kb/N3*Χ>pIQ.:h+o1yjزjilP_PleJ[-Efg-hk(2'qJV''&pr,gjyJ9 k-[*oԖXb:SMF^&e@Htƶ!3 ̦7zu `TÍ~fĶw b16B`F+32 z͔gZjbMZQ&0#LX|p^B]6!Yzɨ7e)"LQSvbHJvI&:pBw\`5$l2Q"Bh - 19gKA .NIiӦ&0ߩzS?6UϯS F3sym Ť[̵8;ꗪ$ϭgsg8ssɝe綔9 kXwrNk !}bn{tlM+Dʋ)mdJkss$hi*{W=JF鰓.+UVvPgCWOQ|s">'ssdtdd8TkZ+ſKJMtk櫗3y=#[dcզOppfC3\٨o4dV+TJp2# :g]Vk!Z>=ꬫ];ޝuS!]Yw}8+:RU; CjHU(c\=aVǺBNA$tNF(&-'GQAnثVjqq.2$/N~NrYfY%uj39fCI)8mң xV"Ap072'.s@qGmZy\$Ƈ%Yi~K߶`qzMTkl7On\xc KPjK]Zs[pʓ+gRՔݓؖ/AwxfqWW.x9S%p!sȋdEEFu2TAE8⫝̸n=ĽOJ);%wJ) 8.b5ѓڭ?Lt\J=jc[\b0$>x!9cEOxEs$M*:&H"*ȇt#fu]Āҧ76 km{\Ul{:l!<:/emê]݇ՐmL*NdWJQ)*ԑm\-kƺQەYU=+.CF&!Q~7lSrxj7! 4Yii!Fr;n=3OvJ"v wr']j̰kl4gNFBO<3蹘=9 ,:1s?kW^j8"...嶇25jBauMjrO+0Qsё3HnZ3r#FJyVU9)JT+55:"/04Ǐ_iۇ=1Y D)BTpk VT:b.EX)䐑&NӍF]) B |bFf^ED!k)3%.I䙓N0kk3bx) 43kQKBͯJd}݂KL86!\4D;zպwe/(t.gXh53dBeAi(4喫 Bpl 3ҳLi k5ݤIȰMh4eRQ5kәtbt2cAɨiU85m-,F1{bǰ1IF@H6cXc\Gy+5Wggު ֩=:ช #QGsBR`DH}:.#J[HT$pYV*TvLõ TR)&4\Øz=N \9q͎\ҵ _qzӮz2K{ia_rr,?bIÜ{~o62?̇X^/7xISBY\/]X_ߢߎ5!؇3vk3TBZgkIJʣ$o)9oY +\jԢ2x+D&\&hP9p-8UxEQREnI1g$e8Ceqeh{<(b1h(V8ޚnN>tvN{6k3 鄖:S %ՙe;3 8OWoFk4 ꇔ64CK8:O-ӗLfdTm[wI#UV[ ꪵ[KZ7B^9ߞKdG_Dž+U8I]Q銇=Iuj+E#/[SQLn)#1%BSXTn.- hk2|~}A~~~|ɓ3/TrLc,RZgf*]Μtg*bSplXxxsAɵ'Jc= ̭ދ2r,xۜ%u>mpSѤ2#y/RK4eڎ7[  œ#I퓍dtOb*YtPShS\%q@UjBAF8p[%N` gaaWpgLs̫_ɮ_SD?Uj?Ң<4jO@n3% L!k'Jfff\(v~(dop *LPa9ad5{H( W ʯau#3"k;-+gE#M\PZYTws(99 UܟD8*R4S uc",GDXӽ JTyWEEXͮoEnsD!Pm @{Rs"̡3vCU9TTHa)KR..IaaUJhO^-jLaY{" k~±=G'ОMa-0젰$99䜦͹ "̡\A!~rM" 瞥p"7Pa޼N&|*g^by0@$mn/a/0Ҝ<("LF DeT0_t]׉0i*MBj'*Zuh #/E 5{%p+!C")0)=< \hR4gFV4ݟYIP?N%ZM9 Np^%V ܽ0.ߜf&Кϙ6w+S@i Fxh}0kK8STWK-R~C-9Dy1Q*B5ZVSmb*?"!&bETwt )){POs7ՄOBz=)ߝqA)=$@CJz5R^$tCCiP?(DC-ﻨ6$aʮ y)_Cb=F)Ċ AM!j7L^x%5zwEަ$"hC}-XOC*5/B(!=#(ۉl 29n#1gL^+^t!MOCAFB0;%U6(i'܁i mO cS?Ϳ``{JX4B.Fi!h̊+mV7ǚ9F9"ut@~G8o@wduA9C%7#Zn5< .(wcGh(Ҟ~J3E A^aLxEny$D$fC,ev .!?'P)P S PN5f !#d@\5f[du( Pσ2D#<%uB| L#8J51gfY^ zȌZ4Ae$wZ;z#\u%R#g0Sb(v]D- 5ƨNIViVV0;N#=CA!r{`a׈$.}%yFoV OB"ΉS>zH?21D;/JJK>k'(,~&K}K҅&_%ž2]z C9Qmq*͚Ď*ia?vSF4v`%_,5|3 `*`WȠG |ͶA1J jXh:׆hE3LYMBfaZ e>?zĽ e*|O|+s)zգ -a!q/Oi)YKH3t[4#`@OpRɀ3b1*S'e<|D++`Cop!RT' r^S}y~rl+|&4^_ =^#A'5ѮpXbPh; {|/0}!~{A_ߐ' z7c|?C)=A~ G`ex @0K yaA~oRH|o7UDاe ^0p4D^xe!Pз 4VAD&zG0:@HnJ_4A~Bd < znHwFdd70 x xB>гO3XO:v{ B 5"&C~{Yw`,xl7 #4 }~?X&/xA#AN AРϳ7 V/Xh{DX"A  =5?  "o0xI1@<2t~ŁbtȒ+l^_/no\`ycck㒕jZA}gaOTcU` -b~c2ۿd  0{^/X.{@Y$ ڛ p฼G-P0yPR/e/vhvz(!i`SY,2^2-{MR<74{t. <MzOE_$xk`x<"׽&KY ;E* ª`S(/. sU-И_PP\ eYQ_VZRQRV|}3<=}ļoD|7ONG_~GVгlF_ f2jDy&yp˿@那Sq( ==/#oooooooolm )wQj7?f*4% : ~e?dz6aˠ%W}ȩل8/D3?SX-!3 ѽT"軼m3y ;̛1?W1:=e9WUq\)Wι@<-nn~DAx#W~ȦCB H?Ο _JƵ T֐cݳh}aqM#OGO_{$jG?ES p7=8X@ʥxFf1V8{yrx4<1L{?_J`VN=q 訃G'ŻcvK#ѭ3EAsQv^2 0,@nHwSoIU_ץR)dP3z,)Ohy/-/s[ZoZկYտGakU/2.LI:Lm)SGG4 $?ģ \=jEVTeYcL!je@Lf<9l .WCELvhclx[QGYƋyP%slV+T[o֓c0>`BBq{6t?n/q{T/)F%t-dcx Rʛ6gCM7k¾ԽNۻQ&xUu%*EL=f/BvJpj<`ҫ1QqܾP[ǠJ2^ [nvmeŶӰ[#~GmJQz^=nMN֣Wvi{QL=YTeIQ :*# `۽{J"v7,v %g D8*{J2mKb6ՙtqM (:51|L.K֖-k…ZִWۏ0;0INev4.'8a S4< {օ \EhE_L@^)%*ErP)+F8,LF *+)4vItRA:PU(EU倮 ThwL]nhwLw!tw@;+6V-mdhB@͵ɏdҵ&p+Q]ɥy-aJ;ˉU8Pp*Uvɏq?HY-v˙GkHW,.UvAK q0 'jlF"EAW=BI1\.ɰr5˲ endstream endobj 30 0 obj 13316 endobj 31 0 obj <> endobj 32 0 obj <> stream x]n0 yCE]%A8F41]xNI;$9>+[}&ف6<ݜ~6,͸#[o SQ=f:,yu 6Ww7k``e so_r[/` <8_\o !J^4Mt-A~.H ".E='xAE yy5kC4T)|@#WȧX'Cnb}ԧ"!`rys.FsÉi;Eoj endstream endobj 33 0 obj <> endobj 34 0 obj <> stream xoUϛq iA>'%I8-i*AU$jc*lO3_GH Y-ک*tn*@b ز@ $r~q?{ޙ7wf< 5ລ},`{#74ĊfAߧϒyܣxD7JP%+XzuZYC9oi E Y/8Kv?'@b9G =ڞ&G塠B= t{R=ϧzR 6/uQ=:VcuR|t$yr*%qnX7;p{}v /o{ṿTrtdx(O`_]_[Z_ZyJ(WԟEthtS'Kŋ붕ɼ8͹g;;ݧS͆٠U E&h^"Cv4*xpr}/1<'l=O۞mFoڠdԘd/J,㔟k1 X̰K`E$Zj?鿔IVыMVhHWɤg]~*zxUW$3tdZ,Y3judd4_SgXlŧn a*ӒcįI 9N18Ce?+wKئ|ñyz<Ξ1M-Nܒi'QlvcYdL;σR!넁ytM?< _/ EK5n*τE_>xFn:WҕL3U͆A 8ɷT[p6$(lKxWC"..,!lk+L5ы} &)y8j(/EGT1N/K9f'K) +GEѹ䞦}/-wIWh endstream endobj 35 0 obj 988 endobj 36 0 obj <> endobj 37 0 obj <> stream x]PMk +{XL\z@öiIVhT9w4zP>x3;g^`D\5€u`NwT~=8ymI8wnR2NܒG<2 F&8|=~ gt *4`p /jF^\mv"˟c z%(Q 0twèo*&xhI++Oy>d9-#5,7)r)l*rX endstream endobj 38 0 obj <> endobj 39 0 obj <> stream xz{|E=W&;Mؐ@t qƐrA@"D2ȸ hQ]F:{]|8QtTu{w|_թ:|ϩ_޺*FonY~@lV{KVcK[J( ʉFIdN9BQ()Xfsh_gsX/_7sS|WԯmN7R(,{WD˯tX.PM+Ch 07F쟋k#e#2+SAdE F٢Ymv3NMH ?&HN1vmKCoN =9P|kY V-7!o(whdkЏ`WR2xt`fk1=oǧ}{ _oVXLX|DQVCm'&N?.p1٣F3}ތ#Oflߝކ6}D1YŞw R+U{b0*6}Cb8|mM- )q|#q@oz뻯hXhhSl~&Nvͪ6eqpXo@Ҁj>L*'Nʊ[SDd<+㮂=Kc:$xHb7t SEbrYLzct{;H C}U1y< BVEtNl .eR- "2[hicwa^bS{ w:}Tc)ڍwUq5bi)W|6.\аGץ*?$PgPqb;wjbi9{@qGϯ+/FBX/`* |el?|O ?e.\1\_^Jvφj_BgU=]^K`Ep#.2cBD kQ!?+_5Q3IYu d>>Y#giʺJohBWw>`KݞX#1.JnEY3$T'PC3PQѸ4!fDx+v0']ٷcc8 慵~ %EBq>js> {TcH1kz;DAYu kk&N 5P[?i?S";CAUv={DG͢H|/1a^kxB] ",DP,.KE0=Rz,ңny,XA{tvŎa$d {@^?.( ͙E^#%W?̳9"yt_C{RGO& ^&}} UH^*A'kH Ff*8D#N v0I'u͢u(^%,KV za~0Hg ^"[:PQ"6BB#m[t & q"+2Q| n 0Ld2#%=X`5xZjb V cœ ][̰8:^;ѩ\4fPBez5>_«^#ھ=xD E~Lbxx:KO+hn.|x 6n~5( /TU zP($ d71QG)1  = zS9DQJ*^'. lJXM'DY4Ez;\ExFx6|\Ex 3Ot`Zz==1LO#bF,I[| Mҟo#Qj|.QŻЎ2`݋0rhZHIbIsEǻb+]Y44pj AI+U{hRMaE= k&kHf[L&>Z~1ⷊ'N!fh:NQ""2Uψ~cD"Z⼼( ii a:5>ۏs!ǿxx/1ׁ5z\MPCntm/()=TNT+hz,=iKrX{\aTd'6Uuc*UԨP:ŒܑvrrMjxLjf׀zD2ÀV|I%빌b 0GW3:?!ɴk Gv:D '}vWn;:ecaضKX}OΜGAxg<_ϨQJ.-d2! DUp TŤ׻i.lFtP (/7ȋ؜5Mz?|GO</xOCD! 1DJ8)m+ sgB5j̔3/1Si=C'*) ҃`zD>jI5DFEX4Y}buDG@`sHE %U$),z+-!hUUՈ*"Ulq8S46:h@9̲^I恰f7 J^vf*?(9Zв D PQG/OF("WdE, Vj=6%AK..pY",XmWʁ%#\>a?Dʗ"R]%@vaMڑddE76*F#* eèwmFw[/^^[c|U>eܾiX|6̄W15m{h׮|qK֐;՛o>{dÕ,|gpQ V+URKQWOӪ4JUr#^;[IN$E@Q0jk֢dHarcgf0LMsȑ)>/mГ;g!;m_]tݾmx{!icч2NEs1]/bF jgXxҸkih_)'ŃIK gE_E^"/O4M+ 9,NQ=/W༎,W!߇uӭ<@P lS|1y|;KH&x|1݇G|t7¤DD`3|EtT%q";EEE\Ո$)N@=UI2P;,B0z2kbYٙN>\ WH >ӶW" @L -9 9oe=%SzzTO臮+.*(tK` T54zCR1eJ?F%%UOoOI d05kV;^jTj=وـXh#H)V .ssLA3 c\-GA POBIV"x48I?%=sG\ j:;lZO~>9sebkӺgҡV~xu/=ѓI2s?x4澭?lxUA Nnwճ[ZR3q325>Fh[?6/eX.ҺnomDeqٷc,8mHGz={n،=с% rxPuT AoxˢD$Rpɭ;%!* )xD'ºd {=KOU+% ! v6(aRPEW.*DMʲ7T_Co^#7{(x  'p󇈧MC/쀇*؊>G(Nro$1CBoI=?MdU~ߠ'|)ZZ!=*]kg?V&)#:U?R vq2 5.5mHXcXs{/X"Q %i쨟 Z>'i БeMw$i ED8-1N2'N+>* 8ÙI@ s$-hLxu%i $-6&iNIZBE(aYra[6@U6BTpzqƿ%^q_qڎM崃i'G^_T>6ﳆO'38ӣx'9=?ay~'mLӌΕ7.ilo?mo.ZټqI;lwbQQp<&9шwʦ#޲+[W6x,_#ڼHHCΔ"KV-oUs#m87/g„D5MPmzo{k}CdE}2ʍwMqQԻ~waYiŽ56yEZ1_qߖwJhPˑZzlhǼ UDž«($< ЈFԈр"Q^X35:zE cЄb>I`3p62S3OjGLA.c~}6^`|5*%vfai roWkKr4&}oebF3;v컂 V"lƋ7"L|u/#Z~تE/Q^n}l9Z3^qu\"\M,s.\Jlo>6sp)E^<+qb^ێGp+w \5+syI.b紉pM-?YFMr3ܖF&گ71p#̹,'1(ӢV`m܍jn {i*.guw )gb)Lδޙ3gΟ3W\-;l_͘,_ɲ;MM>ij`پee,kК爿\Ť}&KbHϏNK߉Fl碟D74GGGv_[Bn(w2J^FN)b;ص[ ${b=@ra&dI$&'9ᑹGel؂OwG^Ffw?ًbnxo{t{ǭmPСH:&|6vOr:INKis&: N! 91ٖ[qK6~UHOMxӋc~?XжXV=c{978o2),`¿2 endstream endobj 40 0 obj 7915 endobj 41 0 obj <> endobj 42 0 obj <> stream x]n0 ֮W?3̢0 7o@\ڹH%vfmfP{^ڵCG[؛fxow*V9Ϸq,dTB<5sCLUچn^֡/}A$Vb BKY%\ZB0o5q!o)3#q"wĚr'>0SkļGT_'_> B ہ_w3tP쟖9(O|oݟr_kq$xg~F-0fX4_lÈU|n endstream endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <> endobj 46 0 obj <> endobj 47 0 obj < /Producer /CreationDate(D:20100331100512-04'00')>> endobj xref 0 48 0000000000 65535 f 0000119407 00000 n 0000000019 00000 n 0000002724 00000 n 0000119551 00000 n 0000002745 00000 n 0000005762 00000 n 0000119695 00000 n 0000005783 00000 n 0000009365 00000 n 0000119839 00000 n 0000009386 00000 n 0000010450 00000 n 0000119985 00000 n 0000010471 00000 n 0000042355 00000 n 0000042378 00000 n 0000042578 00000 n 0000043167 00000 n 0000043604 00000 n 0000067486 00000 n 0000067509 00000 n 0000067719 00000 n 0000068246 00000 n 0000068630 00000 n 0000093274 00000 n 0000093297 00000 n 0000093502 00000 n 0000093994 00000 n 0000094344 00000 n 0000107747 00000 n 0000107770 00000 n 0000107984 00000 n 0000108351 00000 n 0000108591 00000 n 0000109665 00000 n 0000109686 00000 n 0000109877 00000 n 0000110181 00000 n 0000110350 00000 n 0000118352 00000 n 0000118374 00000 n 0000118561 00000 n 0000118991 00000 n 0000119269 00000 n 0000119352 00000 n 0000120104 00000 n 0000120202 00000 n trailer < <2BB85BC05F1163FC23E079C11EBF3C1C> ] /DocChecksum /316B24F469E56525942ABD7A0824AA9C >> startxref 120389 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Automatic Labels.pdf0000644000175000017500000010762012277111530021035 0ustar synthsynth%PDF-1.4 1 0 obj << /Title (Automatic Labels.odt) /Creator (KWord 2.3.1) /Producer (Qt 4.7.0 \(C\) 2010 Nokia Corporation and/or its subsidiary\(-ies\)) /CreationDate (D:20110207133730) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 4 0 obj << /Type /ExtGState /SA true /SM 0.02 /ca 1.0 /CA 1.0 /AIS false /SMask /None>> endobj 5 0 obj [/Pattern /DeviceRGB] endobj 6 0 obj << /Type /Page /Parent 3 0 R /Contents 11 0 R /Resources 13 0 R /Annots 14 0 R /MediaBox [0 0 612 792] >> endobj 13 0 obj << /ColorSpace << /PCSp 5 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 4 0 R >> /Pattern << >> /Font << /F7 7 0 R /F8 8 0 R /F9 9 0 R /F10 10 0 R >> /XObject << >> >> endobj 14 0 obj [ ] endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode >> stream x]K6Wl`h"g< `rؿJ"%RdٔZ=nI,VU_{k_ FO˷}m'}H|kq_G)qxK˻{_H8H)ls$Eq) ) % iҧr1`#l8㪵ZRm-3e_h1/ߛ'[2}l ϲ}}>Kr{eȡCARt>G!NI5P6+M 9 a"$ swL=ZiXoL#> r>2B{ME̓yy|}݆EL Fz`ԔO} |fJRq_M"4tRt9XC6NSj7&~?N0 F@.&(C Сc(07så^Ky Qȧ%R׏BWGSO^ 'HH'K಺ ]Ġc?aw.G9)h0L2:Kfl LXW9$HBrC$A~(J WfP@?C,|qA(vPΡ"9:0 7X%|7g}h(Ў6vf`Ή:8 AS;#(VC*Lf$} ƃ(L SQ㐜cƙTUNiPYu55@7S/p Y{-:Mn(X$|vLu#]PE-NHQ}d3mWަ1! i;a:ѹԑ[F5-;-cJ}iBE!](=ke:F ШrR J}iֈrApVzԗ,o(YQ=iE{K <`ՑSXƓs n2dfyB#y?d=;%%(p[G(z3M*T[)5pxJȬIl &>TϹQK&rwX&8!%엔bR!Õq,C$”20:1tı -s2eHNtDTOo\y~˘K[2Ό>t 9f;U@ u2u+w_մ҈z'%5MEv .~%',H6Lu]Kwh<[ Uk41hsD:LbrXe'!i'cx\gQv4p[ ,BJ(Lrx;SAj%G#13iC,"PgT 5u"WrTzפxV|*Kô$YbJBš /p ,pdi+q zUQ`d'\ZͿukZ7+" xnͿu{D ^`콩IyaĬ3W1d~si_ʘqd&p2\#|>L1|C0tD1ɶdNtDTOo\y~҃(s9<ٸS7*gPD.9xp.^-Yc:4 KT!̷Nm ok5$%0)um;FFS/QTr%NM;%'\T8La9!tE;"2!2Rc>{*9JHtKcJzȕ}.-k]kMp>if27Tn`[o8-\kmMKK8Yȱq>r,KG-{"kF1HaPr:GbpڨdLtDTOo\y~Յ)p8R*ۻV񱮒/jvllQ+sV,w18 |UM.ʫߦ\r:Jy 1\kxSCe`+DAcsLmuu;? ;Qz)?\C,=oj4J.fb 2`8n @%KnaŖ½3%BWo(4NJ'd'2uV7SB;cjNXNO9nq5>>8d:Bp[؅;b]&'os y]ac^0u~so]T?H-|vA7ex,y&nk\_!^rYi K1j5 6 +JM T ʠjrq#$&HD'^Hڒῤ疜T4% %ȹΛΛ<* 9 p"ҭ,re[ w$,\uLv7gV̖qu!4/&vbhOvfyj_wϷFux4kF.r}jendstream endobj 12 0 obj 3203 endobj 15 0 obj << /Type /Page /Parent 3 0 R /Contents 16 0 R /Resources 18 0 R /Annots 19 0 R /MediaBox [0 0 612 792] >> endobj 18 0 obj << /ColorSpace << /PCSp 5 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 4 0 R >> /Pattern << >> /Font << /F8 8 0 R /F7 7 0 R /F9 9 0 R /F10 10 0 R >> /XObject << >> >> endobj 19 0 obj [ ] endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream x\Mo6W\@d P H=Ybh"ے28 'Z$3Ù73~[y|L7E%HV[ް^Os\wsw5\[\~=Tn?Ot%^\/.~ffuCI'U%Օ7em 4a/RVߐB2j{70ڷpBf{kaiA5ږi0Ms-oE1kWQCq$ˇ?(UT(-jHpV0WVjOmo\`O{EAKݴ(ᶳ:27OeS+#@MK=0I}dmB$r&Qzdl۵|hZ՘i*5ӆWzVJ!mhKCܡkFttQcNIuL8']\0I0v#ֆO98 cN܂i 3R0C#6fSк/廀G>3_F0k3w69\<1y>0{i+:DjTMoSoNLX06%LVuAl)`LJj9aAL7rD6b`LLSuuA0X> znsǹ~ڧ_p -5lѰ;vf _ePV~JI*tcVr͐G& 2@}T\2Є fJM0wfS"&D2)4\''݇Mr)ʋx=:'GGFc$7]%A\)pQ.pd?XNG*QF݆Θ?JOp`>6Z5f6$e*Vrٚ4m.{9l,)%R2?"64P4LЋȨ=կ])NJ>4lv2#-ݤEVfz|PN0$#aCϳKm5140KsBQ}xw'f0/1'k;u7B[ėsJY @2rDWgJHڤF]5,Z7Q\I7< `~ '<GwÉcR %b#vSweppk\VqNgqt :Cĉ0V?} a,9N ʰ?\Xlg+qPs{5X~ΡΛ,=YoXoyZ< ϒ,s9 v 8Ebq9ad\a3IfPMऐxdNB{pUNa;bGtozy5\%oNɃ2p8/08:I̔<^݀ȦՏ$6,Q:oNL"wouS_[iendstream endobj 17 0 obj 1743 endobj 20 0 obj << /Type /FontDescriptor /FontName /QUAAAA+DejaVuSerif-Bold /Flags 4 /FontBBox [-835.937500 -389.160156 1795.89843 1234.86328 ] /ItalicAngle 0 /Ascent 938.964843 /Descent -235.839843 /CapHeight 938.964843 /StemV 43.9453125 /FontFile2 21 0 R >> endobj 21 0 obj << /Length1 12048 /Length 24 0 R /Filter /FlateDecode >> stream xZ t[}>Ǽ|D,4ٖmYr$َiJr-]Y7teݫ8ԥRqB!ene==te([S#н8t wWLȡۙKߧ ZAfᎮ鿿nXy~'f}rb@hgF#IXM?ߜH̿LR ڼ `9%̠h3U| x–EȊ(BcU7]ɶlYM&t19_kA$7#rm9C4L(-Y3e B5mhk[|7U묭 ľo Z@cëmn4wۚ;M]a|]w?cgyL>;ySi :.n҂> :*Vck4\ukus҉7'4PS_ĞF2sr!_{-x6|K=x,'FB{]PCɮ=t'[wûvRצ釅@~׮-rlv86vv똼nE`ͨ,-Ow ir=n輞 $Njԙ){Ҟۺlߖ;fs|Z{XeXtV~1چęgnߍ/lۺ}^-'X^x][.|;s!w>r S@]tmXos1iL ,Gc;Lh:AhAvC]S6=ݖ#͹7{ Zy.s Sm{x߱ cJ\s[.1񷿎'gA %kUFGE1o9ϟoKz:_r¢ٰNOMZ-=;^ß~}nC69gS1؞un[Ҋ!Qk痖ZËyV(&$ay ]ICPL(K:=mZaö+CO9-u8'OGM_^3@F&UC|1vXZ-ڴ7xx.%Mio(]߹0֛?;f/ JC?ЂNT㶃[7<~#OODV7>w=YWS c,^3->?~T{ha}{ASxE>ݫ A1_3_ium~KkNԻzuB}n 増4pۃlr+`,|s7᷾~x7WkoZݔJp*_l>~ ~C~Q]=ٽ|1핇PxfN-N?}׺ڳFpK䦮n+9uMX +֠`t}Ul0kyEVY/ՙIӈTQ0OjJɳ~Dk>}?gkm۩ N|d陈ܽ}[8Ȏǿamloj}W!`HqQ[,uCJזCs&2m֩CxՅs]xe f{lŕ7AԻXM7t+iOBzYwjo}47 kZM ;!biE.P@D-.+~>LgV {;͜G9wM$yc{#-mdʅ}nM&uwímKK؊mZo -SυCxr_MNp[ E/ѭ>Wx/w7-G}מxUkv· g^՞=`weΞ(D|E|󊼂Nk"X:w{8t3½ dgavc-лɵ Lq{p,)c=g͞лǎ;_ڿNp?p8Cq<0jsabpNg%vUe5nRf/<}B B*Hzk ]_<h;1..\4O,6ŷ3:"+ѐE̵h 1 >YOk__@-=o} -=m6! fTc VJ>^L;x%||UW?5#됅Fl6N]  C+ ePef B*tV'p{nMA@"~HDJ!P0$ e)l&§<=hFAEh2( |Ri+~ l9J3 FHצMd:O%UQr_:$d(BB"f1g_ȑhBHψ "$NJQSÆ$dH.\NJwN$IRxIt{h&}9{LS߰'.[G,*Dm3W82+g")2yYs'%T5#B䜊FŸi,0rKsѼYऌ恖fNL]VF6_Zk?wyK>KE),~8~vDdtG2@N6Sh*J3>KJbv #gR㥘XIFmWyWtK)gq~Q-:^9"0>ã+] Qo|-[C=z:Q>Ч0h9 .oIj\d|ezw ٗk(4y+"0ϼ1~2碽w57N]{Y:gYex=82 9+:/Xgm|$X'S6,?_tt7Ǩ*^UR\y ?l*M'FEo$9*%fXF ~.^MQ/"5LO`FaAp =υ`gf:a;tΪqTb3YSSBe6@Y׋v3^f!&{VtcVaNÈFu}ڡ|VZc Fa#|}L@!naD%S`8|]a>Ce-1M)jpJ3֝lU,ȣL%)Nn9Ë0#a|C;Lh1ƙCig{EH*ËƍZ>4y"e=1UFg04 3 )?^W|1_8L=;|Z<< J/ #e(:ȲRT&Y-z:\Da(|,Ì8 -ר#Jz.]AO~na{ε(v]~{,J^[~л0MUѕVY> /FontDescriptor 20 0 R /CIDToGIDMap /Identity /W [0 [595 770 721 458 662 1050 643 377 604 345 698 694 631 377 558 591 366 716 694 523 576 937 694 756 694 721 746 694 ] ] >> endobj 23 0 obj << /Length 553 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <001B> [<0041> <0075> <0074> <006F> <006D> <0061> <0069> <0063> <0020> <004C> <0062> <0065> <006C> <0073> <0078> <003A> <0053> <0070> <0072> <0079> <0048> <0067> <0045> <0071> <006E> <0050> <0064> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 7 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSerif-Bold /Encoding /Identity-H /DescendantFonts [22 0 R] /ToUnicode 23 0 R>> endobj 25 0 obj << /Type /FontDescriptor /FontName /QZAAAA+DejaVuSans /Flags 4 /FontBBox [-1020.50781 -415.039062 1680.66406 1166.50390 ] /ItalicAngle 0 /Ascent 928.222656 /Descent -235.839843 /CapHeight 928.222656 /StemV 43.9453125 /FontFile2 26 0 R >> endobj 26 0 obj << /Length1 19056 /Length 29 0 R /Filter /FlateDecode >> stream x[ tՙw$ 8ql'N$;p NQlٖ%#v x,,ŒFЄGi@iK,1RJ$ǡ@SNna)t<$a;$!e[w|s-#nG&<ںc4~á{+0wKb0D `nI&]Mއf%gx3pGr@F?Iv 4#4 i\IG:v5/B dYn 3LŜ`~ՌGwpB!G-Gtt4S+{(l7,O,([QR2鲓d_чJsEbVUmVsxѣzVP 4FK*m%UYEȼDGaFcUQRURQd #[`z0yU//s'J#T<ۼ-% KʁyUEEa>8zo{&׷mߵzn2mmi#J$zkz,vaml}6T/4MeZ\@Y i᢮xUY\TltЏ#R/YvG9WL֬y/مexLo?K__gN<lcr{5pU w٬R_ pa|k)dɁ=zK>/n hmmO/ՁoBW{v~Lp^5^gǍ7l%]y}A\kgO"~u9fVUf@%L6mz`uˮ;Z ~]Nm̄GX7 Mwټ RT3@z^ 8GPzt[w]ێn{p-MPɤzsǎ{ܱ ];L\cLв Q!̈́A<7d7'ӟ͛-2ؚ~bKuc [ [A+Ai6uCh]|4} M,"gm_.޽׭ew!|X^{o]s_ׯl6ۆkbc$?흱.q#ҲʙuU%rSe9r]Xr@@x%ϮNO6ahtqǯ0 Vѷ+Ab9Ƕ#p YT=e_~de8gU J{:oY†O<Z\~=P{P #;%Ӂ/V5+wñ6Z7m +W5'rpronݙ2uEf&u\.7ӪyWk,/mza1~~^lhQh+\Vm*PPP]dƯsƛ<9hM#nwnN(oX:v#TTH_bm&U&SU?sOͼq>FӷLakټּݼiՖf*#*ȸK1濁1FSX@f|LTLaܨ-W!"ܥJOEMf윿Z_ZڧKKy@"6C\E\:cTcMcg ؂.Zq*bx SQ>6E}|! 7~_%h@MHF 4A(“d-:^6E+&TQDCVu8Ȏț+ %X3@I&!uIV$ &L|20Z Q (@+rn_!r(pQX/t#5ɉa%Nn"+"I5HbJ@ G˨TTI5d%l_t>fi؝T**i"hP8hVh´'b#LF2G0pCRԈu5Ņ0HVs|#ΐQGIZ#<Ԃ4'%O>Ad2X[UN))$+RM\-y1bl`XIâ0Ʊ9'P+'hhW^ߦߵo'ݺr^Νa83M_.x:mִusZfkyBӨ ;A6h&ɯSZ=|=z=4^fKMwVa}c_#vZ97htq1lyb~c7sIvoBK nޙ(:HVB+rqjzgvFG'IZŽPv&CnnOOg'rs,ߚeE9^Z_)nIS'@;d&ezgKl1Ox }`2Q琏П"aO|d<0ahn1^Eֈƞ*0 4r Lqٟ:3y)8y}zAd zσȤ΃ ;@Nrr'\;W"w;ayD v\Ly8W"+,:?J4\OzӹS& NvD8kmL숌;;9Q ?;"t|?ݳ#zGC'\:vf'>$t&9r;i \A@}T}-8:_$'E5tlDXXBVR9F4̐?H>H/nIZx~ۛG4A)&*TBH"*\DaI@V"t+f2@L闬4)S1>L/ E@iɰdȱ3dR\*9$ Y*""#A9Id"Qp|Ƒ/>9+pM)T@l0,җJJLR nDSAP$SIP&1 %M@̱ҘĬ&<@԰5OɬJcD3m$t\PkPJ@/ TTMI6 Q6fP@#?A[EW q9 nPYD.{T (t@ N9qИHM )$M»1q# 41Ѓ0AnKPQRQQ!LPPR#qFE&*[a裎X3z丁z09a(XN*H bNR!Y 2LqT䐁g\zIIk |0#YŤI*&^b_Tb74ہ3SbE8JLX;HSpNU•, a'JopP R"+Dfd(L-0&k{U(U,8J1 Ԭ E0D`ɐIB1b fȭ6,`RrA_RA):\ ˸&xHVb@h3I"+5qu4y87} z&}A 2ҋ|sR=c5װ镨+GD4?|jz%r{%J/8^WH^P$UDvUD ύe"quDiDyDƶLLZ&2aD?IDvSvFY~61#z6uGdMwĂ Q9eC?ACNI4>7>74I~9oH ՜ sggAWaX;FXIz<_=endstream endobj 29 0 obj 6643 endobj 27 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 25 0 R /CIDToGIDMap /Identity /W [0 [595 315 387 387 606 276 966 610 517 689 607 389 608 629 334 293 630 587 742 629 630 408 598 811 630 630 545 276 764 587 679 746 521 631 315 571 630 ] ] >> endobj 28 0 obj << /Length 616 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0024> [<0020> <005B> <005D> <0054> <0069> <006D> <0065> <0073> <0052> <006F> <0074> <0061> <006E> <002F> <0049> <0064> <0078> <004E> <0075> <0062> <0072> <0050> <0077> <0053> <0070> <0063> <006C> <0044> <0079> <0056> <0048> <007A> <0032> <002E> <0046> <0071> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 10 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSans /Encoding /Identity-H /DescendantFonts [27 0 R] /ToUnicode 28 0 R>> endobj 30 0 obj << /Type /FontDescriptor /FontName /QEBAAA+DejaVuSerif /Flags 4 /FontBBox [-769.531250 -346.679687 1679.19921 1242.18750 ] /ItalicAngle 0 /Ascent 928.222656 /Descent -235.839843 /CapHeight 928.222656 /StemV 43.9453125 /FontFile2 31 0 R >> endobj 31 0 obj << /Length1 13480 /Length 34 0 R /Filter /FlateDecode >> stream xZ |Tՙ?#Q!dI H A$̄Ixnfd3;C@Q[ R- *VYm (Z_RڪRZlWZ 7sϝG=|8߽at+ t/0~"5W wQ{- ss0qyeS ZeW[p:*K٨pDŽដW~)BS?#BzW8sW"^qw7B8[ED|h!GGx OAh*_~P+ @ZQyr4W{W~+AMMc Ш+ʋK]dzql?~z w:;1ҞOF.B?4 6FUUzrٳfG~qݲv'6^?xŊwt C#&3J(ġZU!b8m֊JdrYi}i^_WW@W ss-^Ƞ߰v0rɿvۯmwv&ư,هzVkR\I[shrU7 g44ʊPDn(/70H[M׬Yjh"˳xㆣ=.߶/ڼ 㶖m5ϟ[G \\vnDcCg<4η',opͷEm@)^!4H&M@` ױhQ}u`~ߩ-[n{7ctw;F1IAe7&+SrJeD npՒZw/p. =mw'\&(8oL,44F~UTU^¾ڄ(-8D<y D %޽oO`(DB`˭ѝ@f)x8U\Y^;X[^ѾCgUVTTΪ-4L1  b{YI%ReO pI!mK= wqаg*oHgӍ7͚u76I5Ϋ5.=kɿ򪴬}F1\z$=j|SK-KټPJZ0$!KB5j6fS ,-Rhǵ᥍6l|i3Gٷlikmm۲F+yWgx3g3{B8OOf6>NBʈ|m 3 m_sˑC5 g9OCEwC%=6s╆[fͮsVW | `=[NjOXLύ5 c~1|/ОՄ,[I|pB`5o*GG>;rׅީ%>.trN"L1rɈVg-{>9oby\Wǎg(o/GZWã'i9nȯ7cj^0ͨa p:Ѻ |in <;<̵ b A0TbQe1Ǔ#>>4JuRiHC+,r `3 %cbZܜP0ûs#y9A5? j0 &jB73MVY?,Kyt b_Z57ͩ_zZji=h &vW0hszUy,ڋiJ9;:8BS=zC{afa(>ۿ{U.TƚY̿Q0rn {9. l؈!>ylmzH>Ӈ؇?CxHp6*I7Q4 M*oZ,֡O+ý#/xC؇'6q _p=5rz?J誁? seKygz)mj 5p׏v ө?v\L]psRJ~aˢ˧}^< =OQe9T:nځNQ_\ӹ}iՅ/j/@,2%a95G#{U+iZtSUWcӍ3$xz劉:x _HLVB3<|\q |`|7{~7 #LդQ zj4J+L9IܾY.#[t76qwpXM^ R֌A r*m\[]UZផ|g!0+wIsD?Ԉi-ܽ/?u+v/vѓ= 8S1cNޤnk笯by֯aP |YPgIA"P * ۅ]<ĉTٹc+xxvyX8|z1^΢;4z4"~\$G|^Onu E| 94!D4 9!6JmBN-Gr~ʛB{&75|EZ֧W ]Ϊ 6v^םW7Ev*RT|"#%G;ksu@8xt!uR~Q- ]]}TJFU1#MmWj,e qbҨPl2U)E~^@`UZ]$%9QRA=GUzyaSb Q\RtEH 8'|AJG-HX]Ue|%/h\Lh hMH1dt."2/*mCCw8J:6|.񔳒 C5ZEN6ԘZ4@^5ƘbD&2 JShr8ª!/4;=l2d}[_ b@b ѪE,TonTr3gk~\/R`ykȘԅL3Gii.bUOQ4%r|uE(x@_4X`sɜ*QbW1 mʭqšx:#t_U=*HUgLdy3Y<0@㜋 [mJ9gzistM|P=V &u(@+ّE gLVz^%H#EnNVӔ*PsYVOfQdz$ۑ1A#: }cʹ؎?/*[r$EVdrwD3I%45"=CEF4RIf{\KTn/:T ->ERG33J<کS{%&sеPgT)3. %CY+ٷ%̻4Ge E2S_3(4`wD.Όfy]LPx=h4tgbJ;L?slWrjmn'TJCUrfeyr{N.)Yݯ}([y6~}OWzA)ӕ(G<ә 왮< F)ED*َR&NO z+R8:b_ђ[<'e1!(oc>­C }9Ǖ7iDf!BeyEI^sf^o3$Q{H|_ Mcaavsxs5j ~ W~ ȧO 0RX)&AꀘAV_RD'x'DBlOI 6{S`p0R4LD^SzTHbL+($5 zQ1RD0 IRL$㾴Wl|A0,؛NT 7M@<eA&'(mZzbj_)`ȑa 2kI^@UcDmbQAx t2E祸ҽ!ћ"3 Ib7RcaZZDU x )+l(k^j@ yvcI>Oͧ_AFEը0HG㾠?HM `LZ@GKH^鈐|Q5"D6D";T}) c}.Yb,2BLJ俀SZ27jwb@#_?h-[K;G}gF0CA(댉@/k࡟endstream endobj 34 0 obj 6763 endobj 32 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DejaVuSerif /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 30 0 R /CIDToGIDMap /Identity /W [0 [595 662 639 587 315 635 597 591 317 317 509 399 560 639 941 556 635 315 474 635 716 335 639 315 392 849 635 560 308 387 387 334 662 273 635 367 655 559 836 868 729 706 795 680 667 759 ] ] >> endobj 33 0 obj << /Length 679 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <002D> [<0054> <0068> <0065> <0020> <0067> <006F> <0061> <006C> <0069> <0073> <0074> <0076> <0075> <006D> <0063> <0062> <002C> <0072> <0064> <0056> <002D> <006E> <002E> <0049> <0077> <0070> <0079> <006A> <0028> <0029> <002F> <0027> <0071> <0066> <0059> <0078> <0055> <004E> <0042> <0058> <0044> <0053> <0050> <0043> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 8 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSerif /Encoding /Identity-H /DescendantFonts [32 0 R] /ToUnicode 33 0 R>> endobj 35 0 obj << /Type /FontDescriptor /FontName /QJBAAA+DejaVuSansMono /Flags 4 /FontBBox [-557.617187 -374.511718 717.773437 1041.50390 ] /ItalicAngle 0 /Ascent 928.222656 /Descent -235.839843 /CapHeight 928.222656 /StemV 43.9453125 /FontFile2 36 0 R >> endobj 36 0 obj << /Length1 10096 /Length 39 0 R /Filter /FlateDecode >> stream xZl}GQĎ[V[XLdIkȓD"ڳ}ŋ;(YI휶Hs4FvƐ?"4+3em}/+n|L 3/{f=MQsSigxtL: OJ {fNXFXRNIO55vC$ҟv?*!'w{$yϣGVy=/OzHd*/䳄޿[W]'](I?;E;wU!7+;YT_w_K KRFǚm'9B{ %GKۖ{꭫ץ թ{zlw[zFzw{:|kn#Þ [q3t3Kŷ_D/F#^F6HM+7᯺X77qCm4/WUty7xO^f`:c[|-ֵ=~I_Hϔ&u7ƏY{g̞s}!{-##C#׿uhX8814 {幱ϟNKҁWx_w_3ӓ'ON?bN9TwgPt9?)iNk]RgM۰aϵukmS^ 앺t~ awҞYy\vmw&Ly1+=Ʃg|WFzb_O`HwP_'/]gmiGkտpgv Hө `F}#d518N"{RiɐJ׮yO-.\hD(Tgg:um2b9" J`Bc9(:v륩Pp%ť[RaF{B&V$YvTުxz⪴]~9o_>7nѱ<۾3|>P/Nf۸i}UކLADbZ/S߳WRϔl!nTԙPN/>v\ϟ o2lX!;H\$?VCNI=4jXM[5KKcJ(m0bU1n'I?cYY-ƫHb(yYW?r}n6{*)-m0c/LǤG6J)ƫ߳Q%{=)1^vx )l.1I,dC(\9.x ( Clx[D# )ƈA!"ENհl[=d'@!ȁ((Ia)Y, Ga z\$$b-}mt`׮A]c;4f4\,iJ5k^SQeBsŘlX ZdzfI P4<Iabt4`fM2ӜHa z eA]T<:".io8;$/U`FmA$5ij0A`)8Nyo(|%h+MkV ,50pss05 ,,cܹf FNx16‹́zuLqaM!^ yͱ fQY"NW6ame"CEp &:":f%'XC@RUds=)\E.Քm}h0nk¾DօWծ8r-[(=S a֠QO#πDLcEt#C*2ӽXKD;C=;;tQ v[+u5}mVD 4 "%\SE&Odƿէc-qwD3)Ƭs/( s-R)YcĜCVjScS2L-`e&Zǀ{+tuKt pnݴ"wZS*95[w0y7dx9ź7VD=U}i4]?ZmGc9+-8jQ/ܺz8[T*m\c ?j=3^unE;b;˘s9+"E}zѱ>تG&z$WLO20Op-sR2WQb\¸Xad8F >Qa!O+#C4J{f- 9#3pݍr} ؕa4uͬbe6 W)a!@OqsL0 2Ì8^i436s a ֹ-22"=8 )#$h!'C8˙%Eٸ=G4QXmc mrL<' ލ,OVYT}lƿn@X|F|V~BD7RuAZQ*N׼0;)O7difu=LXF1aKs-wZn>w^x'8ʖZ과?3nwQݯ^Юݕìݙ,jLK({Fܲъ/[`e =ײcGܙ0*B?jUa1pm0[MdPZ}V Ujz=^z|0\OҘNBa{ɞ֞mѬV4C< vv7hB9rk:;?YڢYԱU+)5(SUm| @׬haljT1iYl`f0X7fAKH3IJ.g 4%RŶ͜>`R Gq^ocͼ>oG&VLF0=[q4д!Q+*c;.1y`+63s_h`:CEm :P淨fסYzp CbPÍIm3@J-"$3(gvvf`IɚZ Ԓ0gYT k.(`TV^Jyaђii˚MŲW@Qj^-) dz^gH=h9w/^b"UYimbf;\>v&q*wRlh\.uDhޔ`efdqKDӸ _E?.P?+]? 5ՠj71UCrJL55/* o+~nJ"l  B@e%7̂aPYXMiEg&d:Ldh:99N4SL,*G?ke& p"s&h8q%*J4Mhlr*a.ħ8}dc fU@4S e s @t*"pNMi0%RE$bldfR<N 0I09EQ$,3lsz"X&II&˼3HN2M'L,2˜c Ot] 6 9hzJKɑ JqI&0r Ȅ*0Afh~e8d*Sr84Txf4/!na`T0h< %ie(nMRx܀s8|“wzq#9 /kpkmJ>LLt+)=[)2U~a]\PXtز`4T`ҟG%V Vfbd-v!țVI9{YWpӚ _ECx<9<.F0oC -szHvx:X.C'%endstream endobj 39 0 obj 4520 endobj 37 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DejaVuSansMono /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 35 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 38 0 obj << /Length 448 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <000C> [<003C> <0051> <0075> <0061> <006E> <0074> <0069> <0079> <003E> <0055> <0073> <0071> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 9 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSansMono /Encoding /Identity-H /DescendantFonts [37 0 R] /ToUnicode 38 0 R>> endobj 3 0 obj << /Type /Pages /Kids [ 6 0 R 15 0 R ] /Count 2 /ProcSet [/PDF /Text /ImageB /ImageC] >> endobj xref 0 40 0000000000 65535 f 0000000009 00000 n 0000000296 00000 n 0000035768 00000 n 0000000345 00000 n 0000000440 00000 n 0000000477 00000 n 0000013305 00000 n 0000029885 00000 n 0000035628 00000 n 0000021487 00000 n 0000000816 00000 n 0000004094 00000 n 0000000598 00000 n 0000000796 00000 n 0000004115 00000 n 0000004455 00000 n 0000006273 00000 n 0000004237 00000 n 0000004435 00000 n 0000006294 00000 n 0000006560 00000 n 0000012372 00000 n 0000012701 00000 n 0000012351 00000 n 0000013447 00000 n 0000013707 00000 n 0000020462 00000 n 0000020820 00000 n 0000020441 00000 n 0000021624 00000 n 0000021885 00000 n 0000028760 00000 n 0000029155 00000 n 0000028739 00000 n 0000030022 00000 n 0000030286 00000 n 0000034918 00000 n 0000035129 00000 n 0000034897 00000 n trailer << /Size 40 /Info 1 0 R /Root 2 0 R >> startxref 35873 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/BuildSystemOverview0000644000175000017500000001133212277111530021141 0ustar synthsynthKst Build System Overview The Kst build system is built using qmake. The build starts in /kst/kst.pro which triggers processing of each subdirectory triggering the named .pro that matches the subdirectory name. Building the Main Libraries (libkst, libkstmath, libkstapp, libwidgets) These libs are all built as lib, in windows as static libs, and have fairly straight forward .pro files. All include /kst/kst.pri and pull many of their settings from it. Kst.pri Kst.pri configures the following details and is used by all libs and plugins. INSTALL_PREFIX - The installation location, also sets the default to /usr if not provided. INSTALL_LIBDIR - The installation lib location, also sets the default to lib if not provided. QMAKE_RPATH - The rpath is set if in debug mode to the lib/plugin locations. CONFIG - Debug mode is set if appropriate. VERSION - The version used by the build. DEFINES - The INSTALL_LIBDIR is exported as a define to be used at the code level. Building of the Executable The executable is built using the same Kst.pri settings as the libs and is very similar to the libs except that the base template used is app rather than lib. NOTE: In /kst/kst/kst.pro the LIBS are set separately for windows compared to linux. This is required due to linking errors on windows when in the standard order due to interdependencies between the libs. Building of DataSources DataSources are built starting in datasources.pro, This includes logic to determine which plugins will be built dependent on the system libraries that is determined by including config.pri config.pri config.pri provides the function libExists that is used to test whether required libraries are installed that allow the building of the libraries. Supports the testing for cfitsio, dirfile (getdata), and gsl but could easily be extended for more. Each library can be enabled for Windows or Disabled for linux. If it is not disabled for Linux, pkgconfig is called to test if the library exists. Only if it can be found are the dependent plugins built. Building a DataSource Each datasource has it's own .pro file which includes kst.pri as well as datasourceplugin.pri which contains settings for all datasourceplugins. The .pro file itself is very straightforward. datasourceplugin.pri datasourceplugin.pri is a straightforward grouping of settings used by datasources and serves to put them in a common location making updates easier. It sets the template to lib and includes the plugin config. It also includes the install settings and lib paths. Building of DataObject Plugins DataObject Plugins are built from plugins.pro, dataobject.pro, filters.pro and fits.pro. Each make use of config.pri to determine which of the plugins can be built on the system. Building a DataObject Plugin Just like the DataSources each Dataobject Plugin has it's own .pro file which includes kst.pri as well as dataobjectplugin.pri which has settings specific to DataObject Plugins. dataobjectplugin.pri dataobjectplugin.pri is very straightforward and very similar to datasourceplugin.pri with the main difference being additional include paths as DataObject Plugins are permitted to make use of libkstmath, libkstapp and libwidgets which DataSource plugins do not have access to. It also includes the separate lib defines for windows / linux as references above under Building of the Executable. Build of Tests The tests are built using a similiar configuration to the executable. The config is qtestlib with the template being app to create the test application. See NOTE from executable regarding lib order. Build System Scripts build-kst build-kst is the main build script for the system. It is a basic script that does the following: 1. Parse parameter 1 for debug/release setting. Default is release. 2. Parse parameter 2 for build output directory. 3. Create the build directory (PWD/build) 4. Enter the directory and run qmake on kst.pro 5. Run make (either using Icecream or directly). install-kst is a build and install script for the system. It is very similiar to build-kst with a few added parameters to parse and a call to make install after build is complete. 1. Parse parameter 1 for debug/release setting. Default is release. 2. Parse parameter 2 for INSTALL_PREFIX. Default is /usr 3. Parse parameter 3 for INSTALL_LIBDIR. Default is lib 4. Parse parameter 4 for build output directory. 5. Create the build directory (PWD/build) 6. Enter the directory and run qmake on kst.pro 7. Run make (either using Icecream or directly). 8. Run make install (either using Icecream or directly). Kst-2.0.8/devel-docs/Kst2Specs/PlotAxis.pdf0000644000175000017500000077626512277111530017510 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xTˊ@ +t^Wa ؞qH&d/TnēKc(IU0~;o_}/} %x2zbaÖ||ā#b:'S?T߉5Z/E?ZYb2b:H]\hgVcXmyA\{&)@A",򙧗[%dȐ)*2awQ#/c(#ujbxP4צib`?# *N6< V45 4` /xTohJ"KTb#n7*2av:eƜ{{0wƞG|&17+P kBL2*zHWWCS)O t%fRzozB||zk!Gxr,ĬL['OWGt}z,ݙw:6>t$ܞ;+UpKܪdި5TEUO endstream endobj 3 0 obj 540 endobj 5 0 obj <> stream xUguoL\$AdcZpqL4Zn@q3:ZNN[ʹFLTRM1'*!Tq@Abr%ݻۜn}Zϻ>s>gwzzz߽$MB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BB!7tCvv)m#ҵq݈tFܥ6bU&uX'\.XmR|ZR7YݛNgϞ`W_OR&%q-aZ %u}㏍M4IvG###`___XU㯾_{Їϟ6Z]v>7?%R-Y TN9LH%(dzO8шٳkc+"Ol?w??wy_~> 谿"*SrR :~OۧFw_^1~ɨ>_bE:x7cy WDr*UaB*AOVSN}T,5Sj K<+R9*0!'o4dߟΙ3cA X.WDr*UaB*AOV+WLۺukvHWX`׾O`<`>TN9LH%ɪO[vmvp͚5M<oo/}K#G}ׇU8fÄTGGGg:u̙[o[nI?Ƭ*mNzueWY*5VۂU ePY+0!'om۶mذ;2eʎ;'w}&{ >|رc]w>dz̙d2,sJU7Ν;.]x >٧G>}3:4>x 4kJ۷/uַm7k׮ -IՖj! @QTÄT|wTU eP`EՃo҃jj! * _B7SHPo2˩?H2\jnёё9i^$K2\jnё?)zPWQ^_B7SH`SZH" 6YfizTU _Dya& L#UOуjj!(V1!T.\ߴ`SZH"+`uj +*zPmW-~R W5i=6Rr XhGTU _D`,ԣUaEZE U7|@J5r!GFԃKw`EZE0&T.(zW8fa5r!Ga#ԯW;H +uBCG`EZE +uBCG`EZE +uBCG`EZV`_Ub*I*bUjmSW:. +*_ܷU\3_> `Ui쯂GMZvͪVh _* W&-;fU+ WA+'i'W٧ qY_V*xԤeݬj嚁*Ur,H`(ށU0!{-_9oPB+Zh /_wb|F@*aNHWѶ 9{ JU0)+W +,z|W`g0Wb>+ W_Y;_t^+o*++,3MWJ*Մ J5b}fU9__YJL1qWu5b}fU9__YJL1qWuE|k$Qrlg}V{.H_S e5lTWtI9TNK#JI_#OГU۵kJN>ԭ_AWv쯬i/v6<-i\xիWϜ9֜wYMWrBԈU`nJ@񨻰R6_m߾}ʔ)CCC֭6mݻ/[2YOɓ'Og%'DX_UUP_хW'S; |pBm&wEIRh7Jy$7Lp3$tOгhXc$0o޼s福O:??\.F;QT uߒf9TK\,٧Ձ+:_хW'S; |pBm&wEIRh7Jy$7Lp3$tOгƍVZL{>ĉ\AU3Wk68GN; -LiZpWՁHyURGD\[Bߓ\ox ; ^O-7ES^Pϖ>-t3_s(&|a zַZ|yݖ-[7oNG G?>K.\OGq GWm ZkV=Y֕;N ; (*fH_[Bߓ\ox ; ^O-7ES^Pϖ>-t3_s(&ng}Yfݻ7;8<<Ξ=cΜ9sgZ\~Q+vkV=Y֕;N ; (*fH_[Bߓ\ox ; ^O-7ES^Pϖ>-t3_s(&ngMI&hdd$KYW_L<1n8{lԠ<Zm ZkV=Y֕WzWqnIJxS$쯌At`IFaoLyK|FH<"pjԸI-},[gt:kk$p9qD#I6Ɵzꩨٷo߂ ?`Hf)zF'7i!8>[׬In:T ΍b6I o5,=oV}c3%*v9MƅOlc*=<n\['Y*m O YvS,V%.YLs u3Y~p[~%RPJ߿?3gBɓ'c~f+Wb[R.YLs u3Y~p[~%RPjʕit[n>+<rWGI'+ZKZY㷆Ws=nJF  XHDY6Ht2QMh-Q,;)ZS幅,]{A8VU? )ouѭ]6;f͚tpӦM ?gzma~6.W/1Gu_zFՁHvTK]kiYk#+|\_ )rtpGkh-I;N2 %`e8Zv eT/4|ZKԧ4yxNnGYliG=zlkOdB _l۶oÆ wy)Sv1>k4QsOR;<7o^:җvY=z}_+|+ ;9+JNUgwԀ[)}L;7 8֪{ճȑꌪGH!0n9ڱNA  -`91Wx^_EOw*Prb]ODv~v8k_ܹspppҥ/^p>}zȑӧϘ1СC',Y~ݷo͛7_s5^xyWo/6`:.W-kDSfc.cYNʅR\rNk0D/I묑C`rRc"] Zrc(6*:A w;ɟDT&8,]`f8_uTee0bhbJ,}e=IPʕ+_y&#|CC`rRc"] Zrc(6*:A w;ɟDT&8,]`f8_Ȅ7_\5w\1q漢\_ H"b>V\-Q̃sr^%>-'U;)(p  -`91Wx^ŷj'.*mO-?֡˥3A A .k _ϬR?Wח£,([XrEG1yƓ#:TXi*D, 8\Q x-:~=7Oo0_\IWͅG@|-amN+v)t\W2nFdpaA#Q7U'◧  `D!KZn{/| Bs^T@<r*0&W 5huc=dɒJÅgMpo`ߊ Da]΋&K># -ACi8l1ReMCrRFQFnjYPwG:YZ;oh- jkg@PPOVx3gP5H4N LSW3g k%Wuu8/ p,1@NKI)k;dtZ.KA4sZIE`D-jeA PRFd/k Xٷ A@UCu>ZE㉖zKh B >X@ Ѥ;0M:ڴ=+kTqQdxwZ%H.F<8'5[ jD|ZN(#jȍT#\U V\HgJ2"yp[`?} FUCu>ZEjh@<<|YgǓtq)WGG<}4666v7 8F_V1^`0.3 hgpZ#-FT +FPN|Z{(#jȍT#Z$ZB-dD4`˷>ȬU\'{ .[6ֈegP5x44 _9|[=)WuU1@q599bDb +`"0H5-`O%4pRIFd/Oر| Zhu *@ p \ecX6x&x 5`YΎ'N LSNWΙh'%}b+D+ RUo<PrU LYbF]21kVQW-7@ QTJ!z ʲ%Y0rHQ`̷ȥNR\AfzZ\'8(2|Bi:”vڳꁙ']V ӔUOJ>A-VPIU70a8XaruA5227n_W5L(W٧e;X%Za7bVJ;Ö,֠kiurba9ZL*.`% >0h.;Re@CۨVS5S pZ\'8(@|,ϡ$"naJ;R\')#p&œ]7RO<gΝN묟-?> (^7ћ$0tk:TRݶJe >˽7t@`t:G040[!XKg[ qB QVZ2LvX׉cŎG@=偳&*ЬѠdDGH=2QGTPyC>}̙3<ȷW\qE:~wgl _iD$>ׁ|1  ^r_T P/\[nD gnc.TB f順`/n,ĕw%+Du[j0q?`_'mb+v) _ƅRu,BA *hx\p-?U;_mݺ5u`'N, (*==/R 3;WI+}jʰW .'zVOq2PFiکX.1 j.x=Np @w`+Ȕ,5 Ψ,y,; *`=~Fe.I\M?Ɲ袋ӧ/Y?[B9~lM 8qV-ˈX^9Hݢa"ݥ`hBqi \5WG&A~U12ٌ*!*Yx=Q0Yf\zSlMרV3Jd9n b?9ٙm+g&tJyGϟoku[.(ӎ-f 2]J &G-U0Fk,p/:bZeU,pCjULYkzƣY%+Lf)&+"%j3s0-AǙb0';S]z̄.诒շwݿۿ}w]7GGG;]`nݤ֡ "by#uwR- QKe+pUk+`k+ ˁ VlF ܐZa,Sh{VIJ٠6oq H`vrڌ+Lk`+qΔnGc<3;A I&f*ZK!Ne6a[E%Ig,ǚq:tAD]wlGfTCtMoABqi ܣW]FFQ:˱V~U12ٌ*D**Yٴ"QPwǕ&KAmKUAW,EKLfTg++vu`+q8hN,J?h-f kgĪL9M:c9֌ê?2.k;#u,ݢ U88jl.Y#jR[ہ%+p5Ύ%TO~ٴ&+r͵U@.s5-[=ovؑt-oi4W/A'[+\NJI+'*iTZٱ2kRZ%PuSuyTg,Y0=DK%j$,%ʲ SFj/y|U3K Y;Vk7K4jSi MV0'k$\j~-:_w`p\pAzk^#GI?^AjEcNUI"QwXRiMV9ɒNbǚDji G%ZoVRy駚rPrqX fJq<{t(y;~x0ww ǖ.]zĉ8&YϬu]WYk0&ى~A%QdrpBX#RF,)`e'Ȭ̂e\)9Q< XE DjCn*BԷ`G˔P_X. zGZ ֿ Hj\M3vqlCsY<`h{Wתf|sfG/X6R?se._YK-' 2bI+;Afe,L>)Q.Z R+rtU;Zr5|S?(gM\H@UjˌcM(<`G+vEuأLV5+3;_]verߣRBØhg'A - EXmP'5K19 4Yr9q`܊TBu2+'dmȭnjeB+[PIy=#-K 0d!&86!Ԋ9!{Wתf|sfG?g?M7ݔկ~xƌt%J&gu:*r|4 EXmP'X֜UB l.Z hh& dmȭnjeB9Q,z>ȎS?҂'}@+_)UdI'4k4 jV8^V]TWZ)3;_,F-vڵhѢE'e|ƍitV__Ν;w 7)ӧO2|4-[d7oޜ<]'>/| J8鑼n0u-R Laaa͉&ݐ2@jY!qD"8j]?UIݝJy'r  UbþY4J+ }@+_)Y W_Y ^rjiI H(˾孬7fו,3:={fJۻwovpxx8={nGWQe)l4AX{Xs8yI7 0PĨ*tVj,Q2ƥr@OURkwgR^BuȢ~XAoA0M/HʗjJCoWVf&Zb;jR=`!7R+ʲoy+~YueecNk-=&M=H:ח=k׽ΔCIz$vyNt@.+`#]aUy|LȯV-|IkP /Z +MI=#tHr5Y e=[FQAM\4PAuSIu M .bRR?jdj15XUd+X`SBKoԦCKOy-ٳ/ 6x?'NhDwx1SOEX]ӹs-Zm۶LŠgc%]5 >Z{ΙEj( /@CUarC~J`~0!Z!V%20wӢ+xjCsa h& 6xW+d8VF$A. Lbz R] vbdh2v%jolZW؎ί=k"lG}Ci[/}M7t0?r>5z*F'OFX]__^3S1h9NbYHrfB݃bw+p-5:QXnȯYi&D+$*DZ`Z4A~Omq.,Ud5F5jʨ$Z>ȅ)Y WOP.bRR MUmU`UkۑYgUh'K.'vmO:UQi w{ 7NRńEj({ gMc=eS iVδaZEH8QU Yj3 tF5:L`#˚W~BV@X>P]VUSDTW],Ť8cɫ.n(T3HqZ*G?׿?Oi/tWU &tpΜ9 j״půHc̙3ϟgA;_1*6G5(xc5k2A`G߸p-5z9eQ=e򫪛TC3-YKeu#U`G[<#ڐ;JgTSY 6y۩Ӥbd ,N.+)Y WOP.bRR MZ[Eƭ\KwZMUd]{-b+WLlݺ5;+VXP~ȠgVGc7v0/+k?կnf030N[o@db-\2)AP jUgSrGiJu@&UJiQӧ֕G|#\U[3Ue8v'.\( *,>{::zUW͟??;xקvԙ3gn[n%,kG;:>`u֏eSFpqɳLoa]TRU$RAjt@D)꿺5F&-DG`hn$JU*S ȋ;XT;LA@&2O\@K(qP9s/gP5jʕO>'> /Ѣ8z://߶m[__߆ _)Sرc|}{ >|رcэ_eg!& &+ \?z䨟WUDHfrnp \r&S вq?Vz*AQӧwv ҙ #8VdM,e'T#8Pr _`jo5\hN~7~/׿0Ν;.]x >٧G>}3:4>x 4[dIu߾}8WjIDM#׬V\,HkdE询>Ȩ#)e_u@&;.UE?@%'4PQ?@ p̪%%^+wO=&Xb#I\34%>QRqTRF:`-ĻHRf%KF΂'}A3~[lSW_Y{Ӥ>dEaGo#J ~UI&oWɎ sU+pIFɩ: TPF:jIuI:SO% XHabҸW: bGTTd\>UX .RdTO[Uhm%?'d~k+.8}ɊŽFngQ,p[FT$ŷbTݐɎ * q%C˫*Jj׹P@:+2^'`*\.wıkR[&Nʸ|jn=X*"תQ|B).$punٲ(X*6N*J:,'ë | fԆG.Z^U]rUq{֪7骬15D&.Uѧxp5 *`2P.>qFR$FCE TWsAkYrew/n+˂4鰜 N:(`*UlЪpΣ gԂYn'?`ߤd5HWVyXFvրZf2;xTC$ǥ DVKŒ Ȃ S o_u^Yĉܽ|j_4MWI,&=Tw| f0ZX.Z$*PVUo` 5rM\$+<,yOqD;k@-3Td<\}R"bId} dA:_Wպu,0'vD~v g| vrZXG5KOq\@dT,ef dA:hu|"aׯ>ga9rʚ&"`@ =Tw| f0Zec_UOEYf-ZѵvMlfS]%ӄ{e%o).hg e& >XG5KOq\@dT,ef dA:huW7X__>[8/_e/z`%z:^Krr^q~Q G9S5 t)$UӬAk#*E pL~p`OqD{j@G-j(DږvxĒιual0< byWG}{{}AJٳgO]m jW|T)bD?>VCis28a_9{`-6UCB 1߯f E})˥@)XWY_}*H9SktU1:3F;804(E'U5MAI{WK=ZWiЌ3FFFi/ԩS#gϞ?O~;b_UCد =Key]X `YWUNՍҔRŁA>ze\5KU#dkT"` ֦=uv᫥-]뫌4ꦛn`p͚5Ν w7,EU+0'ŏ0܉s߲uد pWx<Kk ODjhxXh}V=Qe#jQYF-5,gKzŁA>zW޼Ot[,}Tрd`VeKCdTkG2eQs)hVw+{`ٳrӧ_Ta? @VMK eb&],-Mz(GբNՍ[jXD lYWY_}*yZ>XXe=HY˖ɨ>֎dˢSjlu%mT lfŦzX-Qw'$.*>1+* "XT+ )cVKD}`-\ uGC\&{jMZCNHbggP4pP ,#OF4ɓ<{Odq9_J0ٺ(Ԛ>@` A/zFYZ#ReiXUBt#P@UL=\XaNVOAeRbr %?*NSE k7d-ਭ壨Vr,]u|3g yf~3I'۟v? &[Z٧"V㖰bߌbrR} 8puz ,dgDO.QTQv* 'Wh8^K 'kGm(Er+vgZ_ը'hu7e/կ~򗿼+U GT㖰j~eiXUBt#P#u\kqdZ-5 +&W18DSEih2\x-F2|ʑ'|˔ dMOWo|rرci.qU"r*PRaUDK;θzFᚑ\.NbYe5Frƪu\kr\=#W].*3(`\u5Z%F5w]`=-onEr 2%Y_K,I}Kozh_f{?O]ve鄴rMnUtZHUA-8҇kF^2r! ;e1 (rUVrq$"@^\u@oqDhIvCSr)~ʑ'|˔ d:~uzfϞ=.—ӧOkxx~+9 k}'EyJ@* b4_U׈"V/ I9A&U э{]*kUZʯjIXabUd3pi KL M sТQ+G-S2@n8:3R, }cU"쯢zWG`Joa^ &#b's]yoμgGޥaZ cWڳ A9GrwVLLPtm"S'ɖ,j&Q>K7Tj\ցeU&U|&쯜FvK_JIGPMXA~͉/ y$kd0<]L.&~x|ȵIzP +DY.MIږ[z*dygp*I4v뎵ctW9Qdbt0N L%j^qkB\kQW V5nmDKjy,?U`z'>UնNe}j (|y%D!~#X/mkm-[j'>b^.f7JO?ʏ&+49[[n$A5HἷXk܊*W]? `4CFƭZ?%X o[lAzR7W )ǍmOv~2 MNnw>IzP r8-JU.OlXmp3;q VOn ֫4*XW )ǍmOv~21Ea\L>IzP J[%Z\VUrkX(V[}2C6Q5[d0<֫4*XW )ǍmOv~21Ea\L>IzP J[%Z\VU4_ߗ5vZz^G>o]nNy+!el Z]@ GL5VQ->d'^Mn\L}h{;LN7^QCWҵU%rfj70&j.9~S{T5"U .ü7g`kNTe(ሩwX)Z &+T~UOJk^ cʣzTҵv,rEziߗQ_7Q#-t ̹ȸfTHerUB0hvOgwyO}_KKUA*"\UN@_y|d|4-[d7oޜ< 8vX:s…Q}_%;v: yK촜}B 6^ZJ> >GMuWrrg<&R5kV޽{ٳ=wWȑ#Q}\_%<_쯢 =ccc&MH:7*.w4DJ:VWI' UtmOWOU8qD#gfӯz*j$_}sW}{_4!aU:쯒L__SWхk_S }ΝkؠԳ_<vgJg-V\Fu<Xc!W'.2lczWU^;3ʳUWڵkk֬I7m䱐O~N~{ߋ zL=;USJ$&,LieUW]5_?Ϝ9s뭷r-`ؘ_>}G ?\|?0p z*`Ym۶mذ;2eʎ;'4T==|pѱcǂG l߾=yg?{Wa_to ЪcR?)_`W;V&1;w\tŋ.\f9rd3f8t_-Y$o߾ ? /}W_w__C.+bntXU2ߔ$W/Q"ʳ;B"`U*zL_o`GWyaEgrHkik%?'y*zLZ_5)_Eײ2NWj@E `xRl u~mԻ"mU `5$+Ͼb[쯺 W.ZHEڽ]7Wy-tj›6_ <_ŧ*Wj:+WiJ)@+ޡľ*>+WiJ)NcU|aE *`SX`D_(JWUaՅ"] +bݰ쯺WkaE,_WՂUR?H* +bݰ .N?"] +bݰ.@&OZH%$Q@դ5Rue*Wi8.Z_ WU`Յ"] +bݰ쯺WkaE,_ aEWĂU 쯺WkaE,_ U"] +Z_U`Յ"] +Z_U`Յ"] +Z_墖UKB_u!~>N]jJ8I"U._U>N_J4\.dUAX(jWiJH3rBB_ 4k *.H3rBB_ 4k *.+H3rBB_ 4k *.H3rBB_ 4k *.H3rBBjI]aE5j|ğ?!6H3rQ-__"TTWX\\/M*+ \TK.Wi|&i@.%+״wڵhѢfϞ=΅G]z̙3?.>ǦO~oK/رcQQSt )jﯜO( ;w1~ɨgu/`t!]+BJZGfBGRk`jgҥ=.XmR?_R:2k4QsOÍGϣU'O~_>=ÕW^yE}[mB!$ sK.^x…>`#GhƌUܹs'OF"BHjƟ:uF}3B!o4dߟΙ3c!B P7ʕ+nݚ|+Vx,"BHjڻ?(>9MXm2W9uYhhj2@%1|@uv~s82^xp|s==ܓ#nÆ u$me WZ.&&fa]^SS3ww}W8-^__dd%Gomig۷ɭ[(5x@17 DI~uxMhjjjN:|͚57npPXX4щ'{e^?pw7,--uM4vh[tk&~/sR;4YgϦ'N3f/CiΜ9#0_#qF5)oDGܓ&Ksڵ}>*-""XFi;+G^nnn6m\3)}g4G}':w5!!!ov]]LVWWK;۷oP;w_*"8`uXAF7s̪ر#((H2'OPFlԨQ>M&;;[C z\JcFYW\"ǎHTT4EF|ff?#}P&%e=4r^HHH?3رݻwUتJ 1nܸ#GfR[0 ""VFV_jΖȑ#$/2+ggΜ`~٬| ܺuK2{E(K?O2E}IileT^]v6ZYd߲eLJO?ݻwӧOJ_vSC]׮]`@@@}&s<Z..4v3)ŋZYY6ͨ4!C̟?humƌR5wMIIQ RsjQ(͛7U:ԾrYVQQ&)LJLL7ʤ4v3*M=$. :kK>6mDDD? Mz+WٳgFF6GewUq?͐7%u떕ObUVV?jJc7ҬXb͚5&nnK`SSS%@igVSS3o޼P9}tLi࣌yu~+i~c٬W׮]4r[={7Iil4E$&)LЪ^h$-ɓ'Ur||cK… `IIccc٬WW^lkmiƎSr fnK#Ν;]4EF9s$o>}_kz/ߍmi^~e?SK.m463:j$^TT/Q[V]*##C7P&}>''G6l׭['l9h6j۶m .tj._r4ѢQ&QiVZ%͛7냗.]$QivWP}L;u@il >\6lXi2cRsιs:5W7o|ͪɼ4N\3)}LJ#TPPs=?jԏbi41?jԧDi'OJTVVaO;lnݺ500f0)ݻ;tлwoNTTTpp 4JcƉs yimֶm˗266vҤI](mKsz(..N"G*2m4IU(--1B&#NiJJJJNN8qرc(p]Xg^y3p (e3?;,f߾}cƌ>r 68R,s4hиqz'|rNAi*,,\hQll_ŋ=zСCf`PPǝ v]BBBRSS͛VաCΝ;˿C}O.^ӥK5U믿޾}{mٳgoڴIͭ[d3<#vM6m˖-؀nūU7\… wܴiZdٲetnݻw駟,nHo)RՂ իW;%N]Ѫ+VȬAݽ{W WN*64jSNE:uTTTw2dʕ+b{WGm۶sM*EVէOjAʈ)K%$$:JII0aB]]ǼW\q8[nΝsMhrUu֩oQ5e眙LKKKOOv AiWPPL<Ν; ܞ={j֭[;w 3oнK.,P_~AM0YB5EZ@hhӾz#<"HKKSꇧ_EڷoE>ymۺtbo߾={ !d vرUQQ̍"F_K&Yڰ3g5j֬Yj v2cRx^N:u֭[eӵQuA眞裏_~5DDD\|dJH[յkWƟGj„ 27++KWJuuuEESp޽AAAZVGP<Ϩ)rPMNNv@+Rd?_yk7TΝ;LMMUټy 6NYZZ*A?[~k+etvYRReDԩS!!!ZDL||E[n3g4u ={Vߵkv3f8RuQVV"dffN:M6G>>… *+W=z8-XSS3~x?P+K.U8pTXXxbuYhѣG ͛?Sܾ}{qEEt8 PС,"wyeoܸ!,-[o?gUW_}O?VURR-ջw˗۵A}߰ endstream endobj 6 0 obj 32660 endobj 4 0 obj <> stream x}y-J"R I!"PD. c[,:&I,RǶ&ꐡU+#r % LA#"""wݯO}<~}k}}/{Ϟj@{ 9cUFҊK&..XXdbb풉i,+Xdbb풉K&..؞2_aK&..XXdbb풉i,󕝊׶ժVk :M,+XC05XGc]&E!`ky|e"yFءFVX."y5C]SD5O0+XgvЪVk :M,+X;ZuЊUX;ZuЊUb0_YѪV:hѪV:|ePP[#\)k'P[#=5EtM]3nJKD_rb+?+J%ը򕖈&]H.YdA*[ V,VZ"*\ݮT2gHmjN`-bhA+֎VbhA+֎V|e|ekGZvkGZvC,j @ubCmp")k`CmpPD5Etv"utM05XG׼e|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`WO:&`k2_aUX;ZuЊUX;Zu!E:hѪV:hѪWv-Չ5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎VbhX+; `&}[YJOrVy?rpqt6>)k'pE1 :&7Wv,bhA+֎VbhA+֎V|e|ekGZvkGZvC,j @ubCmp")k`CmpPD5Etv"XGc]ut͛X+;WvkGZvkG>2_aUX;ZuЊUX;Zu!:1ءFzS]SD5O0ءF8{(k" f;\et`k :M,+X;ZuЊUX;ZuЊUb0_YѪV:hѪV:|ePpxϟlٲŋ۷ ~{CCCͪ75EtM]D۶m۲eKess[~֭[ |#"yf &\wuٳgO6cǎ͘1>ʇ(t`k :MlUWׯu뢋k֬  hen3_YѪV:hѪV:[UUccc|]ܱcGrʒwn/W9ѪV:hѪV:[UդI]#`ky[UԩSkkk;;;0cƌԻ#`ky|e"֎VbhA+֎VbhX+;5-+ڋV V69gVVZ"|؟+?+,Hϔ+-L.YnPCVWZ"R9 j @ubCmp")k`CmpPD5Etv"XGc]ut͛X+;WvkGZvkG>2_aUX;ZuЊUX;Zu!:1ءFzS]SD5O0ءF8{(k" f;\et`k :M,+X;ZuЊUX;ZuЊUb0_YѪV:hѪV:|ePP[#\)k'P[#=5EtM]3u|:F05XGc]&E:hѪV:hѪWv,bhA+֎VbhA+֎V|eCmNvTD5Etv"y_Y:>#`ky|e&}[{їJ&'ẘJKSrgeRr%Ʌ?+mjJJKD65sWvkGZvkG>2_١T'f;Wo*k" f;gEtM]SD< `,butM05XG׼e|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`WO:&`k2_aUX;ZuЊUX;Zu!E:hѪV:hѪWv-Չ5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎VbhX+; `MEtM]SD< `졈)k'Dpk/VZ"[)YnW*pFDT69Er&' RjbQŸMNv9CڭDnSs:\nkGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`W`k :M,+X;ZuЊUX;ZuЊUb0_YѪV:hѪV:|ePTfwTj+75EtM] =R[9=5EtM] pm =WO:&`k;_͚5 ÇW,bhA+֎VbhA+֎V|wnٱcǀjʓ~E:hѪV:hѪ-r׿m?hѢ~ۥJɽ 'N櫒}{뇝k{MEtM]SD< _6{RY>C]SD5OT s͟?ٲeMMM/޷o_ɻtww?×]vGx+Xǧcc]utM05obmڶm[]]ݖ-[/w{|w^0͙3gРAAF]rbUX;ZuЊUX;Zu!櫎 &\wuٳgO6ؽ~髯ɓ|`~[.f͚`VRSSk]yg3&<-g>{:uj փ[+@A;vW\Y^4[ikk 2vg$TD5Et?O kE[m*X&M cCӧO/?ȑ#]b?gL*[RW%+=ZYʙRXdX)geEsfx{y睋/8؇3g~;ٳg;;;|ݻw?Cgn P;uuu2ߌ Θ#_Y:>#`ky|T̳aÆm[# 0bĈbWWWPQF3k֬믿fWvkGZvkG>;_͙3v֮]~7taÆƍWfHssԩSz뭒[2_YѪV:hѪV:|u󃿎/E$>|8(Œ3Ix嗯W_}s "+K^y]UVѣG暃pWF.))kw8qb/,0aBnÆ ݸqctqڵ֭[{EKSNV.WF8{(k"|gO}Si'U͕W^?~ˣͻ c^gg#<^dɋ/] [sʹ:>#`ky|o}C /޽{?{y͛7ܹ3rӦMC ٽ{wa W ǎTg7xc{{{^wUz~ΏS.wUɊG2YʞK{o,Qbv{$~GUݣF^dTU_l> WcƌI.^tEgu֚5k ֶ8t_D_~ogdE7uX'm/};)GJV5Ŷ7 >HɻXpM2vS_N>}=#|}g:jӧ'ַe*)z~ VOMW~ޭXn@irJޫR5,dJOO&Q8tS ֣gѻ>"d}zlr}?W?Tv%HHFXtpU^ɣdr,rڗ#"C姡ĉ—oƌ3u*!m ؿdsωmx^7KaJ%;0gwmKjb'wMŎŞB4<{bHݷbO6&_s~}IVQ]fN&c-VbGfvZ,KJi~fQ}ܦR1\ڳ8T,Z< $7Hn, ^Rd@RV3M>z9trߊݔq/W g|U9gNɣ7v#6:җs 3i/H_f:۔ñ{=M{KX2N#W/["os0$w8uLْ_v?vn)m!>\b;0>tj1cf%\h{XlW3ZM%F챢gԧz$˒LW0uh\ZR7.Cj`/ԕL'Z+y`$Lʞ%R[32ם~-v]F{';@4%z0>_ 8pȑ }g|7?yfܒUƋ3yع.(q|p%J=_fe1ћRo=7%{QK=]O!YSqj`eߥXL{tb䎥>bI_K6+%d~l=Y(iHv/žL}ԕbRvUM>nMUFOM$g bq(v{+wzmc/*ѕ.%ejOؿe:\uUN*Y{{Ea*0_e0/LW,vR*⊭$oM=gjH)%b~v'NJɝ>ڎfƖI7M23idA9SqF/2SkzXӓof$$  'VbRSk^"ע{RFR7%Vؑ L@"hx,ȱ}K.Xb{XrM<ݔ;SK5ub)U(Vތn`ž{܌";_M[X(6T&nzpEÌsK 6q^שJ>SM.& O!YԍܙԚdp=/Xz_2{t%(MK-H(gF{Zԇ.src^RjˬIj7| 9ܔ^;2w)3^ײ:e%"'w مԻgɝEjlQ/S_h^'v%(Up^Y4Œ ymޚK\]`ƭ%w}ܓ/c+%bw,v>gomSfw+Z𪹒gC| K}AsL>sOv,u72Kʊr?#'ٻTIcO*Vnb_gQtosvܙ[WE7|YG/bŎ}Rx~?JR/v#f]+i>HeG{Ro?2{A;fɗd(69*R;[wbH}7e/puiuS=:;rz\lf6v|5yW_r|tk}Riߓ\,RrHVtT|;TNzzQ3/\73^Ƨ>QlH3-o_^t3M}y`Of%{<_%7+|a#Aq;bHW|ZFl3Se|&ԣw_Iʜoaw;ur7kʓبifo\X*ﱩL%V7Ʊʹ '|Թ+:PEʈ/^|_+ZYgx#GF$^z2_^ PoRml걝_c8RKUke+޾(zAIBW7x㦛n=z7~_UDyADzwyΗ|U@Oz|cǎ/?i>`WWWa=~ӟqzgEtM]cmת?UV6Ї(ZuЊutM0yܵ![ Vm-RC ~"֎VbhA+֎Vbh|'x"w}=|wG7{w~;}=+X;ZuЊUX;ZuЊUbn'|cXե^oo[^s} ~_}wmyܱ`2՛"y‡ /w"y"j…of`,butM05XG׼w5kVggg;`"֎VbhA+֎Vbh|9>5+X;ZuЊUX;ZuЊUbFNp++ +r&x{ѷoߞ.T=3p")kp_*ィk{f졈)k'.=Çr-s\+"|VWO:&`k;_577;p 7;vW#F(m}w,bhA+֎VbhA+֎V|w뮻>ޛ馛=]YfUE:hѪV:hѪWW^y/[lnn8qⓟdTp) /,sˉ'+#\)k'FYfCޙc2C]SD5O; >ϔs$466[N1_YѪV:hѪV:|;pwwwn^:};+X;ZuЊUX;ZuЊUb~ . ؇3g~ߏZ'Onڴiܹ _N?я\UG8q1cjkk NN=Sq")kahmm;vlM{{ɇڞ8{(k" Of'O>Cf o8K8p ]=u|:F05XGc]&֓|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`WO:&`k2_aUX;ZuЊUX;Zu!Npk/VZ"[)YnWpY1ZiaJlr ?SVJDT0geC Y^iH&;lP[3jk75EtM]3jk")k`O:&`k2_aUX;ZuЊUX;Zu!E:hѪV:hѪWv-Չ5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎VbhX+; `MEtM]SD< `졈)k'pE1 :&7Wv,bhA+֎VbhA+֎V|e*s=7e˖555-^x߾}%|ekGZvkGZvC,U9mVWWe˖Çݻ7^ PRGGDŽ ٳMݝqGjk75EtM]3@Iׯnݺ5k;Z"yƠJ.ر#X\re"XGc]ut͛X櫒&MT=xС`qwI;C-ȕ8jJ/'^|8(݌32HmpPD5Et%+]vVʸ#_Y:>#`ky|U҆ *mܸ1v`q֭wdUX;ZuЊUX;Zu!/_<8o޼/LvkGZvkG>2_c;w ܴiӐ!Cvޝ}/j @ub(Skk VXظp={ 5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎VbhX+; `MEtM]SD< `졈)k'pE1 :&7Wv,bhA+֎VbhA+֎V|e|ekGZvkGZvC,j @ubCmp")k`S­zpdX)g%W +g gWjN`,butM05XG׼e|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jkO(k" f;gEtM]SD< `,butM05XG׼e|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`WO:&`k2_aUX;ZuЊUX;Zu!E:hѪV:hѪWv-Չ5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎VbhX+; `&}[YJOrVy?rpqt6>)k'pE1 :&7Wv,bhA+֎VbhA+֎V|e|ekGZvkGZvC,j @ubCmp")k`CmpPD5Etv"XGc]ut͛X+;WvkGZvkG>2_aUX;ZuЊUX;Zu!:1ءFzS]SD5O0ءF8{(k" f;\et`k :M,+X;ZuЊUX;ZuЊUb0_YѪV:hѪV:|ePP[#\)k'P[#=5EtM]3u|:F05XGc]&E:hѪV:hѪWv,bhA+֎VbhA+֎V|eS­ +ʙRs:Wo*k" f;gEtM]SD< `,butM05XG׼e|ekGZvkGZvC,+X;ZuЊUX;ZuЊUbP[3jk75EtM]3jk")k`WO:&`k2_aUX;ZuЊUX;Zu!E:hѪV:hѪWv-Չ5՛"y5C]SD5O0+Xǧcc]utM05ob0_YѪV:hѪV:|e"֎VbhA+֎Vbh*{/[i+y~.8pȑ#8P^UX[oضm[]]ݖ-[/w{|w^0͙3gРAAF]rĪTD5EtU5tttL0뮋.Ξ={ڴiO_}'O |pP3f/_uUj9s}E1 :&7g|URW^y%]UV=z5\sw{͇&X;ZuЊUX;ZuЊUb 6wƍŵk[n;-ZK/EO:U.WvkGZvkG>V|1~˗G͛w~{gg#<^dɋ/] [smؼys}}Ν;/7m4dȐݻw6xǃ <ԩSJ[[ܹsN N2xjmMEtM]SD{ӕ:pȑ`O(Z^ZWWחo|ѵdw3g P2_oʟŸPDARk?O͛7`g?DѵΫpzrk@5||#1bDl1baԨQE$?_͚5믏еdwm+W &[ߚwU%ks0w ]K~NV߃k@u|1~˗G͛wۉMet^dɋ/][XגeߴiSmmm +t-/O|]k@:~xpBmy;w_ {+ޗёsN:s .2e}W،b]{7| ~}'McŶk3dArrt >'NN/ vO<=xlhmm]`+o{Q]JvkMdGFѵ~ݵ/  _СCQtߔyJ]9gϮyϼy/ggÇVlpw# 6_;رcg>0aǏ=zW\q7?ݱ+r]?I/An{{'LpKO>dSSS~gx6l@7x#NyOp3f̡C f۷V護 W>籐}]]ܸqcmmmt*ضml'`;ZF[O|Nzz,&__z޽;vSFY.sO8ܹ3%\nݺg Я%~Ne!R੧ nG>},.OXO>dʙv:sk:;;{:_ܹ3uɒ%% /dWw}?񶶶 o6E{[o|կ~55R6m=zt3W_}5Y9JW᯷JZxUR2櫗_~yذaSL.zo޼裏{|Ww Rr-W~/s=wϞ=e%ww_җ _G·m߿Я_0p4 MTgg?\tA(\zOtȐ!=ɓ >_>\ 9s7.Do{C=/@իgΜ's /~qwawy &iӦۿk6ihhK.~^z7SOV,aڵs9gĉ~3f̀ų:رcw?OoRZwp=+V(riS-:? endstream endobj 7 0 obj 17163 endobj 9 0 obj <> stream x݊0 ^hVa)Lfg>@-e_Ɏdf%-KwxO8xby~|Č 6" 3#AӬqB;<a~'$d4h?k8T"IwsNI{bgKB'q{#JGw&2xCY<N(kD%֌NJTTnQi;Y7/USjXҏ#KćuO5,jl:TW&͙&F91UlaҮtgupUkߛ(7EHAD,mW. s> stream x xTUMQb@FEE(Dƴ ҭ>δJЈ4CCZdlli#؂ "kϟ]ϵR۽u껧I{9USBQZZ:bĈqƍ?>??֭Vxᇳ7ϱf͚fqqqVVVYYYV^JPTUUum̘1!Cׯ6 G4hPFFF$*bpB5 O}GBs-^: a7:N]/H PQ5?Uǣ?^@k۶m׫ɓ'}ܹSNU?x?Lh UYYioܷoj8p`}w1x`kUP-ZVcѯhwY~vJ"!?GO;/XGzzzFF_cyylNBX]]};9~:)cEX",D[W-[kQmݺu~_~w|EEX",D[W͚5k޼_usG9R0_ 6",bE&YrssҪW4hP]N<9`{WXXa+2ɢMd|UTTƵ{n{ƍU)S^֧3za+"VdExjѢEj\/7Μ9S5^:.'OO:U1}ye%EX",D[WUUU]t),,7>O>WWWϞ={ڵ!X*.9T|EX",D[W+WfddlذdɒM667o{ӦMC+k׮9rdQQQAAA^^͛C`Џ++Y| !_9'9*_a&"VE$6sCeWF,^YIn&"VE$6sbW!n$ha+"VdEx 9zxsW`|!_95m+,EXĊd&2fv,,DXĊd&2Br 6",bE&Y+Cr 쐯0_mBrNTs4JE8m",bEXĊLho!_9|EEX",D[W!_a`&"VE$6s+ +琯9+Cr믰hha+"VdEx 9+,,DXĊd&2Br 6",bE&Y<_hAr 쐯C;+q3In&"VE$6Am6z_Jr6",bE&YC¢MEXIm"-+ 쐯C;+琯9¢MEXIm"-+縒BU++-DXĊd&2BrNs:AHa+"VdEx 9zxsW`|!_9G+ sha+"VdEx 9nܢMEXIm"-+琯hha+"VdEx 9.櫰۰F @>+縛BoF9)6lI0x׏_ݒWIn&"VE$6s+1G-DXĊd&2Br 6",bE&Y'_Y sW`|!_9'*pc_%EX",D[W!_a`&"VE$6sWX4Xa+2ɢMd|=W|0\D(+琯9z믒ܢMEXIm"-+hW1 ha+"VdEx 9U̥G-DXĊd&2Br|e,ɐC;+ \ROyto_%EX",D[W!_a`&"VE$6sWX4Xa+2ɢMd|=W^|!_9|vWa m",bEXĊLho!_9|EEX",D[Wџb!?=j&"VE$6s4}Y sW`|UZZ:bĈqƍ?>??֭aw9p]wնm۴]79}tؽ◯|{$;F+ZlXSSۺu\r*Y5lPmƍC+,,DXĊd&2bdj֬YW;wHYYٹ瞫v2dH-WX4Xa+2ɢMd|V]]moܿA"|rKӦMCo|fh{ԢMEXIm"-F櫢"5ݻw7nܨLyT:묳BoWNj@\12_-ZHkƙ3gF\Ӎ76lX❯ۗ| #UUUU.] Çӧz ճg^voK1,Y$--m͚5uqW!%_|Uwc6lni&ͳV:uJə;wnX|$ha+"VdExJvڑ#Gm޼~=tК3&NZRSS{5~|߾}WX4Xa+2ɢMd|  m",bEXĊLho!_9W`|!_9'JgMp9z믒ܢMEXIm"-Uv$|EEX",D[$䫔XIt 6",bE&YHH)>qDT|zn'q B2iҤhwsXBvm1%:~3RJEEE {?~Ć|n=j&"VE$6 됯hha+"VdEx 9+,,DXĊd&2Br9+Cr 쐯+,,DXĊd&2Br 6",bE&YhW۷o_ӟB¢MEXIm"-:͛t颌5~a}>+3\ve}O:bŊo/P1*F5 @:MFw^+++#_Ů&_Cgݸq_o={lUXXm",bEXĊLholJJJƎ{17|3--M[7\'ʭ⑈$֢MEXIm"-:jƌ555~wں:+,,DXĊd&2ޢ3_uҥo߾/Ν;I5b#\%, |muM4} x饗ݫ?= zժU&L8Nxw~w3!] MbD|գG:{+Vߕ^ \TaIEX",D[#GZN%][PWX4Xa+2ɢMdEf~Xtu K.%%%u8+Š$ТMEXIm"-ըQ|?9rnd>|x;VB+d@\tEO,Y}2{[v>˕W^y뭷.[;^|vd&VaIWX4Xa+2ɢMd[J&+,,DXĊd&2"!_n9cƌ$6WX4Xa+2ɢMdEB߿SnVUUuM7iO HW 6lժUvH4i"Ē lW`GBb޽;jjj~S~׃ ۵1.&_%EX",D[$䫩S6s=D 6",bE&YHWy`cЎ}N$<_aIEX",D[$䫠X zU> @ bc؎B;b ] @ U۟}w'jXEEX",D[$ݻڵرCq}$ʢMEXIm"-{+,a+"VdEHĒ{6zҿ'OݬsLHB$䫢H1cF;+#!_>deebŊӧO';Q#a}.#ω`&"VE$6 jݺu&Mj۶g_b͚5~_, m",bEXĊLho,WZ5a„lիw}~m 6",bE&YW>.]:nܸ͛u_"6hIXUuY|رcU?srrX|?~|޼yyyy7Nt_ $_꬛+x"_8rH!uQusha+"VdEx|pDw"VEXIm"-%\gϞD"vd+"`+"VE$6 JI&Ǐ_n,--1bĸqT[Eg͚ջwo vv/9?fBwmHW?я?=s_+>|a5k֤X7BuwkNCȧ&M6a#V}s< @ӭz-m:ǯ]6YNnƌco2dH~B\|^;wCϭZ|U_#|_|n.z饗: .TZ`Q8;Jt_St1NO$rk2Drsha+"VdEx|eQQQ17m[o"O>uճg^v}Սc~F>|:»]$+Mrʌ 6X7,Yi&ScoڴSaÆh#//gϞ/bGU]=?."!_ʼnk׎9@Ť͛7U7;05jԨS,$a?4"!_1դI{]UWOÊ\WƟyX",D[$ Xzn}#WwEXĊd&2"!|Q]]e =n "+'4]",bE&YHH)͛7ώVZ5h@B-+}{O @?RJ诟A;wW{~ hHBbL ,+W;l_*1̻wEXĊd&2BrNSW%+m",bEXĊLhiɻq*BQb,3DXĊd&2Br_n+!_9'yU)@ _9'UT$'+x}U"g޽+"VE$6sWZ\$6",bE&Y*D{l1ɢMEXIm"-UEEٳo;޽رc?>}:] Ez#|iӦ?? ^|_z  _8AHڲeK-Tg}TWW;vtڴi͚5S%!_y}"!_^~*D-_<;wٳg~Ԗ z3cgU-DXĊd&2"!_ZJupecǎ{O["'yU}4Xa+2ɢMdEB/~q뭷lڴi'NПh!_7%c$6",bE&YHW?}'zПhIW+>슊UWW-5'ZWuCp k׮n٥K$6WaH*$ /-ub+ϼ{WEXIm"-U֭;vGjJC~)Կ",DXĊd&2wut f{}$AHW|OT6eX",D[$$ՇFj*~Խ7@z/WHH,W]uU$5jDK`JTO\|3K/3f̈kOb|U"GB:z3チDxƓWfa+2ɢMd|_$;a+"VdEx|cǎ7.YdΜ9?|MM~ȑɓ'wڵSN~޽{0;_EoX",D[$+ -[|ve58pG+3t믿NlWbH:wW_Zjjj*~YgWEEŶmۆ:a„u^W>y>UV[fΜiZd*\|$|HW͚5T9*;;[u{۲W^z_ "VE$6 *33YoZua-;v쨽w!_ _ "VE$6 w_eec&Nh>}f֭@W>Wa+2ɢMdEBbYbEjjj&M6lh$޽{7hРM6?UК?~۶mNև_J`O$ L,v-[#륥GItw@ W_5~+g#ϼ{WEXIm"#-)Gl+|u",bE&Yx+_kEXĊd&2|U[[;n: 0Uee믿~%=I L,|ꩧڵk'|3 3lٲ;LOO2Uff  W~D2 ƟyX",D[Dڕ+W^Vq1kٳg'A!_AX",D[䫊?z2Uzz]wݵuV! EXĊd&2"!<sڷoO:tȺKB+?Hr$YfYG +++wI^XW~0  0Wݻ̙3Omϙ3' EXĊd&2"3_Y־7|sw}.Kt@|i",bE&YHW>˻ᄏq2{@ Hfd&l߾='''ѽ*+EqqqU L$3W2:6_ݻ",bEXĊLhiI>f@Wa+"VdEx 9@Wa+"VdEx 9 d|U L$3+琯l@Br믂z6?]",bE&YC ʣ",bEXĊLho!_9ǚx+|Q",bE&Y'_y&sWAaB i!_9|&Uii#ƍ7~[F믾7fUPXQ",bE&Y֬Y^RRb,..*++ ]1'ƿ+"VE$6#UUUUnƌco2dH~jkkC_>q5-+琯("VE$6#… ո,X`o>}j AMM|EHNWj\۶m7_^5N<9 +W`N 912_qUVVۧIhU ugZZhZi I0322`;uIǯ쏬WDX",D[W-[kVUn: +W _yQEXIm"-Ff͚5oܯ:~չsH*ܢi1]",bE&YrssҪW4hP$+´@bd***Rڽ{qƍqʔ)Tz};)HBW-RZxq̙qՑT _3IK.Çwٳg]6hʣgY9",bE&Y+Wذausɒ%6mm0o<5M:uoߣG"tB@X",D[LWk׎9 //o{C?>w|`SN?uJ!_&X",D[ W`UhH6W!_&0o`$+琯BSv |_&NIa+2ɢMd|Uh'GĊa+2ɢMd|Uh&ǺioLzja+"VdEx 9 o~NAr*,X讷;|P~T^'$;Wa ?K&ФDXĊd&2Br94eWX",D[W!_b!_ a+"VdEx 9̡+ l-X`d0nA3 8WnY\W&&"VE$6sWnYWDXĊd&2BrEK+-Mzja+"VdEx 9̡D|WgȄlEF&W@6ps.!"S]D,9rR_^=EX",D[W!_k Bﮄŋ",bEXĊLho!_9|%+, ha+2ɢMd|uR*[wl!X|"%޽AItw<s(ȁl_ F,%",bEXĊLho!_9|%B’6",D[W!_ɱE,O%Q",bEXĊLho!_99@d0r _aEAC6pDYX""VE$6sW, 0",bEXĊLho!_9|%BCm",D[Wa%r,9̡d"C 89 4C6p[⚯xhܢME$6sW/b$EXIm"-+琯a!)a B}Ί*8< 9v-ھc ÉỪLW,DXĊLho!_9|%ފQA3UY˘If&"VdEx 9+,,u*Z7c86#ľ&M$hd&2Brs:9SERaN0@2@6pshS"\tc9!IL$ec؆ 8WX4XtZ\?6{TtrG;聧E&YC¢MdT立\<_i5F8bxgU#֢Md| m"S-8Bo<1[VjZ@ 4!QZZ:bĈqƍ?>??֭awaTΥ9#EW;q7s>h&Κ5kKJJYYYeeebĢ . cws?a$nݺ38dȐ~ֆؑWX4Xa+2ɢMd|c…j6,X`o>}j 6",bE&Y|ضmqq!v3)cEX",D[W>rrrlTVVۧbǔ`ԝ -)w+(Q*[,KFaᛴXmdz7EYό|Eό||I~j:ubGB6",bEXĊLho!_HMMmٲ_cMM֭[Ѥ'6",bEXĊLho!_h֬YW;wcajCǎR`Y&==ĺY\\UVVW\1p+mlٲ%X?~{U7Vʭ}ڵSOC6iDvڴi[Ċ[cٳgOnniΝchB\gի]yE[ݱX-Rg޽ .x뭷b1re,o={?-6 YYʕlڴITx KSLQyE[a5n暚uSš}^r%GY*汄}ks1$-UUUݺu3fqȐ!h=o5Zn[_~gP5oyrk8˗/kOu9'R?"~y_-[|嗵rk8z8qߪ.Hg5o+k~s=J}jx{G.4*Rn g_S=رRnEտzj{z Y*ϴ[nE' :K;V/Qχ^z\ʭ|'˖-[^wRʭs9Jm6_SN:5aÆ5hРR]]kҤCIO)c b0Hf ugɪɓ'k(駟Nwy=޽{և[*R.GE ~V*~MݙT?T<3wܩS竨J;VѳgO:KU(,,߿R.+TEn9sUsq8*lүK/U5re, 5cطoj8pR?e]Ti֬ҥKR%!*~Q|71XMwq3@=_j.GUhҤ߯믿^|g5re, ؎8,>KF='*{ W>\N?ٺrx6RE>|#F|'K2kktrqZlwoTٳiӦ?яGT<~XCNJ2?۷Wz%N9NԾ썣GሜRNR[ QMG&Ӳ[_J=Ǭȑ#|ep,~Nl\ʕ+'OPÆ U)*޸qcBJ9f_$_9/jrkcԭZ5j\)CCub.|8j-EEE~GH4Ws2S;׿7^wu1m, z?xeΝ;'[o'HWu 877硜rk,s=WU2dHJ<>H>Lmsrb+sS-Dou)QܚL=z)'Ydy?zO9*gR-|WjU3gNEEŞ={yLU-ړtna, >wzj RAT%*{ B+ٵk׀\Y(뤔[6m4Qbɓ''0Pb)wV*Dww}[ܚL'/pXal2Yzn<1tíjN݈#:,WXa}/?]])X{ks1$3֑ݻw7nܨLR*|K6=b+^999 6;,RLmֻwoE\)p~Ç}-3fHW.Vs>w\5 ,X{ks餈+bN6mR4Is91tíjn=/'W_}R16A2SUUեKB{Ö={ڵk>~:33ap *9qرcSI|hURKiɒ%iiik֬G)ϴ3:AKu,.VT\c]رCêŞܭ9}}װaÙ3g:T<]`Td 3-??z:ucpRqΨQ-/hkFR*cQT5U_Uի ۷/~4<5_u,.VTUm߾}ǎwq7|RzfخsUxGWN?_?f'5aixzz 8a[ݱD.b0ƍE-ӿ C9g޽{׮]4i>ƚɓ'__.r .xnjm~P7ZWUTTT&M+^8F[oUUUv~= 2$Qjޚ7o^[[koo_)r5?.8oq[w}SLņ?z0"Y***VXq=VUU=jսѣGw~E-[v7\^zj7ou:cǎj7tSÆ g͚bWW^y^8jԨ3CmӮ]Ht 0PSScǎ.޳Z֯__Z5C=j6mڤ~8pR(=b?y睷{n;N>ҢE p²k׮?fffqfϞ]RRZTկ~uܹӺ9h {9s樟 BO[JN5GСwߍPҰ@ |R-_,}?~xmmm޽_uf*rssW[*pR]]nfddl:s~f!|["yy穖w~E֬YyϞ=* i>=zt b vرcVKmmm؈ 2iٲeJ=6nX7p?OԽ7t%J5M4P?wڦ&BK`_M:5w3kfߞrf|g"Sj]o/ߙUVw1gΜHt j/;|pR|F{,z)kALrmk1͛7[hĈfz |x>3<㻖Bh7i|/RͺTjjСC-E ilof} <)U0p ]*OjD)xG.i7x] /olĉc;*t7hРYflwժU}QySN<ɓ'Ca^xJb?=ڷoߩS[:e{շ'|rT'zhϞ=֖;>lrrr^yh1ziӦE8cM7Ҡ_|u^+{h̙j>|u}Q5\gԉ C%hD!9$|\sMۧ\,H:Hֵe#G 0$]X4h`{(++;u(*++oiԨѮ]ݝnݺ&MX+Əվ)6Txtv dddrB yDsQF{u?S# endstream endobj 13 0 obj 17887 endobj 11 0 obj <> stream x tT$SO=kNssszzzccv.''#GhjjJMM5qyNzyh*RmذA\˗/w=MMME`kkx5k.]*~qҵu9N.IsWǎ3g4>~vn}]gdRK53#d>&Gi䙏+ 19Fq+/33#Nzx)Ϫ}>0#.vܸq'/| mj V*SaÆ z<qyyy' ?7+EP:}05~pgsD@eUaaaZZ?~\\lQQQSΟ??cƌG+EP:}U]]-v1dɒ5ޥ.9r DOjB8 6n(kӦMZ1 swww3);pW+˕_UU,))2enUZZZ 'ʿ_5qE_@_*S;vh7333w?`ڵڇj}bԾZZZ̙S]]]^^^ZZk.fnnYa0}}8zyXCVW PR)5 vEbɎTF_Y}ep@ҡW}e}++G_5QO_+@eW\l뤜Wn P}}++G_gBE_L) HjT+W+@eE+@q2"У̣}e}++@qT+W+@eE+@q2"`$< WW@2/E'8THr޿G_*cE+@q2"У̣}e}++@qT+ĥ 3 P}eи+ IW+W@2zyУKd_`WW_G_*,B_Wc_E<@~y++G_H JIzqH " +mdC_*,B_W}e}++G_gE_<+@e쿲}(TF_YG_*,B_=ʼ(0.HRyУ̣ű P,C}HbJB_*,B_=< WF_\){:IϢ|ᛊ+@e쿲}(TF_YG_*,B_=< WW@2+@e쿲}(TF_Y$}տG` P}eUҢ̣meeeO9q׿#GM0__.\,}@qj_577766j7rrr::: N9rHaae֬Y3\~bq{챈;+@~T+5qyNzÝh"{\۶m+@q2ujÆ ֯_\|… MMMQb999G_*Su۷O?*kjj|'N}وGW@ϑ}UPP O?x118sh|k_wky_J(A%##~#0#X=2%0===bǍ{$55uٿ#W@ϑ}%hذaG\l^^ 555(n| }(NT}Əttt\uUb#+@q2u0--v?..(yw)C5>̖2⋾TN_UWW:|~] .Y$&.3>z쫍7ڴi~V |ɕ . <2> w.}W.+??J?XRR2e-UV*f㧳 Υ#wfddرC)J)33sΝ֮]7O<%Lֻ[PPf͚E_c2u_iZZZ̙S]]]^^^ZZk.fnnY<Y .#7tSee>{رhG_*SG_*,B_=< WYW|L`}e}(Wʤ_vO+@q2i*W+@egt/5gbQWIJYhQx^fu!Db >eY2\cW>27*g;w.3 PI*W+@eE+@q2"У̣}e}++@qT+W+@e2޿zzz^|_׉F|W+@eծ]34_ӧ֤~z iӦ||Aww-[ϟw^1{W|j $2l W_蠯Id V _*}Ucc \Jb:?Ӏn[d޾JSIW^{1cĮ-[*--kV+@qT,ʺ7~aW:[H8 PY͛7}}O},Yjܹhod},))qb =} $4_ #Gs>޿XnzȲkV+'g’ }(WʒeUҡWʤ_~9#WXaLG_*O0u&`> }%0pÇ2d F_=%%vO6 P,&M:pLL%vjQ1XĔ}؋Wʤt{N+@q2i> 9{Z?W|"+@eUHN,}i'z2d aҐ}Č+@e4iҡC^~0xbNl"+@e_4+@2+lŒcdm0޿z2ϟ?ޤ 9rŊVO+'C_9ڲe˅ Nd?=_*v-Z4rH1#F|hnnu2Wʤ+޶mۂ rssŬFc|o+@q2rm޼";;[Lo„ O=IZ2@IW~===_y@W~Ν[vmiiKUi7+,)ʯ) y_%~j|k@bHjÆ vO P}Lھ>wgrUw2iJaȐ!۷o_lkk={vEEx䲲Έg_rɓ߇X^^~gWY׿+oxiܜبݬ0>G5jYfsWDLpkhK|&H_2˵\.ׯ~+6]vYeeeKKK3qyNjo>x^+硇2~dp d`{}'W^yԩS1aq]ׯw#[n;$pOͧLW[o:tC=6ʷu۷O?*kjj%j*`G2n8KX+@eIW/w͉྾>c̙3'|"N 1XJ(  ]3d<#|aČ } F/~ɓ''y׿꫽ќ0Qz)jz*-,#C_޽sWW׋/8fYy睛7oi{jja=xGcƌGFsp2OID1jBWǎK/}&Z<Çbpɒ%O?uw}(G_*ƏzjܸqxM6kkk`SSgΜ߯x8'@d諀7⢡!##cǎ̝;wXvCvwwk#===wuWaa=:7p/l\IWP^2EZZZ̙S]]]^^.2i׮]{Yfߘ;wn f z+/ W?x?2dHg?8_*v 0s}sGIWL_.ٳGk|ORUR\ 2iJ!;;;7jÇ0` 3ׄI|֏(BJ1Ϥqڱ䩔嘾=7 +󒺯|W~`2i_%Y&QxĴeWrbJ^x*M#TWI @_`}e:}r|^)Sb:5WWVNHT+WVNH2") +@eUooUzĈ&Mz^ .=5#k,|0X;*/vy5ׄ=7x'VȾe&B_`$}gϞ/\L쭷:q>{l[[۲e˲ĽvO34*ٯ^-""w yoᆩS#|xnx0`J_> XO@Y2wt\sM|bWv$+MzWpرc>+?*IWӧOΞ=pB˗}vfSڡ2 P}e˖!C 8PR4h;6i$fL?+g~SX&O<`+⩧:BZ֭9r^6N2q&2`X~oۯZ[[[WW cT r)[' @A2iGB+Wʒ^ogDBX﫾^{sfWzrɓ?Q$-F_Y,{yӵ\`A]]]weBP ɿ644|K_ҿaٳVw!WXT&s_?馛JOO׿)WXT&m_};߹+=z /p).}E(NYrUUUU__.}E(NzMMMeee'O=6.'IWhXd .]tҤI˖-;|l :@5T&`+W1M6]pA_z :@5$+o~s3뭷MfBP },?|G,l`,@erKH/(({!WX ʒ:},JNi[WP _R.e뤜P },yK R@)2"U02<*KP}e}P}e}u P,B_j@2"XTF_Y (2 (2 (}6{슊ʲmmm;< :LW鍍ͺ';wnũQ>}kEW+5qyNz NsX<W6l׵~zŠ- &GUyy}[[[`MMM4@_kP#@\W__~رcbp̙tsϜ9#ɉ+ T@_*S9sTWWڵK;k,;E_c\$ Xdr)x*" P,E_*,}E_*,}p <0^H,3汆B_605 IWe0^+$) P}e0O,b Wa (j<m`kG|ӻEX 汆eLwX 汆bWe0BT$E_*,W?>`/ P}e0z)ʿTht m`^sq +?Qb0r)XCWy汆 `_*cEXCIW }k( Wa A_d@ʃȀ605 m`k(~3WeP61}1)`}k(' C_*,ʌ$m`k(3$m`k(9 `y+XWe0)X}k֡Wa }H H,ER.etkD+@汆ɅBܱ P,&6#+@eEXäCb!+@eEXd%m`kEh605t}hcɇ605t0* `2_Y5T2""H,C_*,*DD7hXCXy,hWa Uf -Wa ѿF 8J^2"):v6> \$= *d}G"ෳb '* m`k,~Wub P,j)B6e P}ehWa Hq8vZ4o hXC8F-N%\l D‘,h]Bqzqg]ˡn5t8Z|κ']Yk9rt->g]}eZÇbpɒ%':l t9N.Is8Z|κ']YC_۸qXM6kkk`SS[C']qҵu9N.IsW\.W~~~UU~dʔ)@lI& ;vngffܹY$9sTWWڵ>ɭmeeev@Bm޼9R ,{R,zw009==QYWWa$ԭ:stcXܹs/NMM ya`8qySNzv @"m߾?c8ɇ~RRRBa6l+~zŠ?\8[iiO?}' A<O" ⢼\ؾ}􃭭bƮYH߿ꫯ~'=jX.\_qQPP VO?x118sLf anկ~uڴi *+++kv a===bǍg˔O / J?dȐ{P" "55uذaDzyyyL ?=Z̙3P" BjvvvǏcFl_J2pp}EEaaaZZ?~\,cQQ]`#B:`߰vOab>looK,kV%vԨQva7n+i&`mmljjkVl'W 'B0 ˕_UU,))2e _ 8|gΜ {kV hhhرcv^ܹYHw}WƊndzf͚*~NNN{ xiii3gNuuuyyyii]D]pW\z5׈ׁ{ԩSv UΝ;'3L>K[.D}ѦO>pƌSpѤI&L0d1XRRb-]YYYMM?.F_[n'?by{⋃#>EooxEz\k/ &w\q>Z\\lĒXl׫<V >Auww\}}@p={2.x. .wt@6}%[.I.`I  W 1f͚={<3SN~pBk_;G9eʔ7x#?/[>%KO?,A=Koo-[}BsωO?4A~{GK_ߊkk׮>;vù{w+W4Xxmvu͝;kV3jԨh& <ρMuVmk''N1ckΝ'NDGW_}Çof@$\p!`/g9tsq333bժUbDDAk9xvH#bOzjު??iuuūDvu~3f8歷ފl+r?[ϝ;z'OkI +,,n655䖨H v͌'Oj#G#'N 8eu։ +1+-i?;ait}e ଷ~sUU8`?M@ψ\ٿ7߬+?ۻΜ9#{D}gS_E|GI0R\\ŁOpŀ#O>uWv1El!oE,E4K)}O?q ~{GK_@J??v… >t70 ++K<{ァ?w۶mSL1nܸoϟa]w(/gΜ曗.]}vY߿xbmn=\EbȓO>yȓ'O>#FUPP05w߲eˢ\kOzkP$޽{/mݦ+V766j#%%% ,,,#w6~:0k,Ek|]d|ǧ}'d^:`匄3f466F:.K__[i t!g۷o2d2sStăX1s韅zN0`oi3g̝;kYxHf endstream endobj 14 0 obj 12980 endobj 16 0 obj <> stream xTj0}W9Pgf$Yډ Ґ{Fe׻AX3̿ÐF-{H6?h8׆9@m29^^r ]O 1ќ~Q 9bO|j@m !u:rhdOGx>dk^:yމr=#zQ] HI!Yp$vaSVw(Q zLi;; q߅:yb^6dK#T)Fg.c" HNKe<`D:~*a#8j{ʹLOQz.Sj. 1+8XE d|LV~5ߠws> stream x xU`X Ap0 EBJE\; eYT;R2S T`@RW6Z(b,m^s.onr=<}s?s@^Ink׺}Ddffzn0%\Uuuu/URR)'77וݻWÇ;w([sxүN81p4x3g}Z-Ι3}jb?.\x5׌;jzW&O|UW8pZnvQVV_~I&]}ݺu/Y__ojyyyoy_/[+**ɱѣGMvw0`Dk8-x@W={{uŪ4ƍ;vX 2a:cU-Ǫ#54۷:u?zH=2eJY|ٳxՖ+W;wn~>soi?rtxo/1bsU׮]|I}.A ]h/ ]w6mڴmw>+-2p@cՎƪ ^zVk:}z\苔>|8UVW\qx˖-'q]]KsxuP;zfYlGi~o7xG׮]{챠~vڤbUVV7N}_F:r^'Z}_|qϞ=۔m ֬7{l?~|ҤI:uR_}J_m۶-33S7}t_W+//zkUԎVXM.//owy:BZK^z`AAj)uۜ~G-v̙I*_|w~{JJJ|(_Ihh{;rr_9/vd;2GN{;{AŽ\ّbG}#w侼#_/ȕ9/vd;2GN{;@L"Hb$1D &I@L"Hb1׿korKGbGF">kwSp>d>2DgLUUU]t3xM#&$oC޽WFb2@L"?Яd>2Dm__%1+ +ⓕH ^|W ~W T~+/_|d$1ȺfpGF"iBUK8ۈ@L##(unݺ^WW̷a/[Ym۶󋊊4p>@C߬ن|@@ZGFGF"[l׍ZG6"HbrEZG6"HbrX.[ZjYj?4O-kV|.A+9?h1Ab2@L {uZG6"HbJ4o^|Dl#1D De Amq/W 0*W?h1'.IP-#w#@L##)v mV|Dl#1D X8ЬA+cADmD &b.WIߖyl93o|˕r@h D &%7{?h18ۈ@L##I6o|Dl#1D &=U) iV|FCS3YYzGFGF"izG6"Hb۬,=#g|d$15 =9 l@c>BJj?4`)Bc>"p7d>21 l@c>"l#1DUL|DF.b26+ A0z'IoVl@c>"nш|d$WcRj?4%cAD^=x 1D^LiVIཱི'H/f|HCSqfe?1ۗzG/ݍad>2AtL~hVA?|d$И|r*|Dzb2 .&Y\5|h16+ AmV|^Ma>"|d$1YYzG6h & HcUA`d>2̘5z=jU( YEBc>EҠ?1̼A|d$ 1ѬDc>"pA|d$1QAc>"~A4|d$1ѬDc>4p٪zs4?1ѬZd "nGF"8+>1 1Dp&&UzG)@L##*.zqDc>?YA2!1Ѭ|Dd>2!.1q*z1+3hV?1ЬFc>"pӈd>21QGc>"MAb2ܘhV?1 1D>&.[|ѬEc>YleHA27֭[G?cƌܒoѣM6yA-\̙36|-kkkբz*g=쳭[V 8ח>7c|YÐ!CWo/^lĈjΝ;۷/KOpGF& @D&OBYY}jqĉ?꩷z2F=#g|dd,V$f6ol_,**R0@=uYӧSRR 3qPCUUUzz̙3jWuuu{ ܠ5l0>ظ[njH/}>(Wry?_C{~#ҥK{\h_V,X`=TիUVK,@t[lə5kV~~~vvvqqqੂUVV 1cL>nXbE}}}W|<D & lV$AFb2.V$AFb2+=H4$ʓz 4+?1Ab29jV-+W$AFb29#V$AFb29 = Ďf7=|Dn|d_%A b|Dl#1(q׬Id>2D@D?1@ Df^0@mc>"p7d>2j1@c>"pGFe+b|Dl#1IV+4|ǎ(BBzGFGF4+b|Dl#1B%h1@c>"pGFALkVb| lV|o̼lYz|r?1Ab23Ҭ|=#g|~HJjwLmD &3#AϘġ?1*q x Ec>=4+$A".[!&?18ۈ@L|F(W >zG6"<71y Ah^jVdr'%}ۇc4Ѭ.D &y&#o+m=#g|⍘<|Dl#1OzF޾l =&?10լP AU0Afc܍ 1OVF-Wb-d>)YYs=#g|"2yjz A =&YAwq ܍ 1hV zG6"ʈV"?18ۈ@L3'#ʕ91A|a4+xA37%=YczGFVF4fKId>3U $AFb2ѬZ/%zI6n xII@=B܍ 1/qѬ/%zG6"*R|Dl#1/Ѭ/%zZV3YzV@)GFcF4+g$AFb2_,Q×=#g|-ˈf0D?1Р\aDB"?1e+@|Dn|dDr_J"jjj#=|Dl#1ɌhV&KIg׿^paiii|;Y8ۈ@Lde+s$7֭[G?cƌܒ4hЈ#N8XP@(**JMMݵkpiii6m}YY%\rמ={|hV@HyyyũSfddB۴ish^_|(W@I-lذXXXW^ƍSrK/}>>"ѬLƗW^y%^/5a.F߿_-"mw_y=zXjW"pgeD2_J"\]]To¾EURO=Sj?{V #~R [ +!J6&+!ثNO?4ӧz:bmmZTOnߦM~M6-Z͡~`>.[qJYti׮]?#PuDykȐ!-ml] sիWaMMMvRSS#> qw_]'|2z#Gn|h^j-ĉCҥ}[nɑ^~(W@"֭[wW\~!bر|5k[ؼy}H-njSUUUկv]a8EL mVd$1`B(..nӦMn SM)==}̙|h={nz饗}̙3m۶ Yv&Ml#1#5+2Dp? 4gΜduݻwݨW^;tw^aiiiZZZ7b-]TԢEC/ةSCEzqmD &Ch~ HF"Wo\zTR+A7s=ѿ-[rrrf͚]\\x %%KN<9eʔÇO6mӟ4L%j8Õ0lذqY?k<͚5k?P+}쀓WJ6my䑠_]eYs_uv~ED &W4@L".cǎ9_Fbrլu劌D &\֭s~-C䤖mEF"=@cL@c>\?1RЬs܍ 1%N.[$+^xo ЯDl#1%B| HF"nxΝ@W"p.?$#IW 7PSSc}<~ر#~@Ε0}?_=QD+\s?,[ /ݨ}Ctݐbca@ ÕPWWcsI ea@D 9PHbYfrzwnG}>~e+\?p@b}}s}>w#@Lp\$îu]IXl#1pيD &\wqGɓ'?Pl#1E_ #IԩSz3gX?s;t,Ҭė×\ry׳gϋ/z:q℻fq}>fx ȑ#SNUUVw}A}Äm=#w#@L6+2D?18ۈ@L _"#Idxj #!I;?1YDc>Zr9Ruum>2g>nf巌"&\?W\8˗w}j>DIe+d$1zxꩧ1j~$FZjG| 6"$&Ⓦ#&\]v}gN:e?ҿ*Be+qzC'hݺKG-hVn#ر{WhVB֮];gΜÇ#{oFY\"x/&]^FDL"}Tu$m۶Mj4`cǎ}\_KqXg<U2*b2Vҷ}8_+//_vŋz 6TUUֺ}P_3d>l#b^x)##&۷o/..v(f|œĝw^zΝ;>Y!)ղ=0`fq?{AZw}nA4A1겕ЌDp?לKU,&A48ۈ 1&4+Č|D0?]tG53 mD.[ȷICeeަMk@\#CGY\'Ѭąu֗]v3\~Ǐ?r䈻fq}>AGs}>w#`rL+!Dp?9s&zYYGA48ۈ`lL4c31`lxg>;qlDp?X" re$ @8~Hg0! hVP[[;nܸ*6555vqg5+Ds?7ؿ8~%w#zL4&AL"}ݟ'n̜pŘhVQKIbpرI&~{ǎ[nY\Fb\E/%I??ٞ."8*|)@L2xΛ7OàA۷o?s޽fq}>g׬bǗ$brW^UW mDHhLKIb|ѬȕO8Ӗ_&\0+_| 4 0 \\pСCgϞ;ѣ_"1&.[%_J"~XѣG,Yҽ{Ç[#iJ6"%&UB$1J/nذaĈ\r… ʜ? mD=&U$1`Nطoٳ/1clܸr\g|?YNzǻtb~Ç}D_3g>oQcB8r?|Y 8^2v, P͛7[|GyyyڵM6;HЯDnF+RDp?L>}ƍֿ6رG$mD>&[RDp?is=wڴi& ,mD2&RDp_Λ7ѣYWcl3\ Ϝo ЯgЬx+iЯDFغuQg̘[RR's={lxw#6&ʕQRD@(**JMMݵkpiii6mj7nܨ>8ۈ@|)@L"HyyyũSfdd4xĉ#Gvޝ~mDD2_J"CAAz 6l/իWG &ny}LCI-8p~Y+W|+I4+>!?dffPQQa_T~(KOp1P}d>2D֬Y͛EEEj h'x"I322¾/ 9*==}̙|h={ݠh8f ׯС޽{iii߈tR-ZsW@Qe˖Yfggg*((HIIYjUO_yw#fEL##IlEL##I[Ab2@L" Z@$=>vУ?1  Dc>"p73blVd>2D?188 Vd>2D?18$T~ HL##IqAZ|O4+AqVd>2D?18KB&HL##IMۊGF"=ϳ7\@l> hV/IhV =#w#4+|d$1@c>"pi.[Hb|Dl%w"&$AK$Pa=Ѹf?1!,1D &zG6jVb2@L"mLl@L##I,f6+^?1f?1|7r瘤 #IgAϘd!#Igq1CF"=kV7=so4=CЬ@w#xYy>& #Ig/]pLAF"=#W6^*W ލKHbdG<֬1(W AI4+w#Yy &##IAA~L~@F"=#賍EtL>AF"=e+!APzqGϣ?1܍f%%&?##IAAHL>GF"=#g@FB=QzY?ZVg=#Qw#X͊rʨ@L"mUĄHHb|D0l5&Hb| |$ A@VzGFY7D &zG64ᛂHbd "6\GF"1A %ADc>\|DH48$A Fs"M|d$1@c>"lCJ)D &zohVp /=4+@܍e+pӈHb|Dhن$0)D &zGmhV㛂Hb|fH4=%4+3zG&Fಕ i|d$1@c>"6+CM|d$1@c>"D:Ь7$7֭[G?cƌܒ~ѣ۷o߮]뮻n۶m1Y\PTTk.ݻ6mv>{ӧO;wnVVzmڴٱcG||rpPYYg_:ujFFz*tq}jK5#GFz}CAAz 6l/իWmW_-[̾RVV۷oח>F\FGF"Ä [8p}qjQ=WVV-srr"m }>>64+M|d$1 ?dffPQQa_T[-"mACƬQJ!J6&+!ث\}QoξX[[SM~Oqi6>o3IC Qoھh]nqqW^W_i>Y%?LOpÚ5k[ؼy}H-DÇO2ח> [?|d$1 ?TUUϜ9ӾUWWg ZG;uS֯_K48ۈ@L##IU:tw^aiiiZZZ7b-]TEY;6`{g_̛7/77wʕa_9ۈ@L##Io-[̚5+???;;8TAAAJJʪUǧNׯ_ߠ<~C7#w[ġ?1wѬ[l|\f"Hb|ֲVmD &$A8?l#1D &zmI4{z'(WO?1ĉcn|d$1@c>VmD &$A]"~ Fb2@L"Oq'z'.fEAĎfc͊D &$A/cVmD &dosp|ZrGF"=\mADf|D |de+FGF"=gBjl#1D &z'Cd>2D?1*W|BѬУ?1fDc>Ûw#@L##IiA6"Hb~*d>2Dyh#\`?hs>4+b=͇$@W۬Ab2@L"?#YY8ۈ@L##I|^ l#1D &bHoV!F.[`&|(W$WC$ٸ},f"Hb2Vҷ}8F|<٬,mD &$C"xf>.W m &$gCxc>nV!qۗ0hCoAb2@L"75+ g|d$1 ?8L||ج,mD &$<)e+$?E|(WEDpY`LAb2@L"L`|hVA8ۈ@L##I39 *g|d$1``0Q" d|(WHaN0 Y dχr FGF"ù8U8ۈ@L##I+Y5g|d$1@s~>+_9<@KI쎸ldI͙Pb"Hb~e+8ۈ@L##I^c5+U\pGF"+͇fѯ>Gҋ|(WJ/Y%w#@L##I^\eDl#1D &Wz1·$ 6"Hb~|UJe~Fk|(WJYD &$J/pEmD &$J/ЬFb2@L"Я@f>4+֭[G?cƌܒƑC_ڵz{M6E>t>\2w#@L##I_<ԩS322Sa?%h>+3qGF"WnذXXXW^SYd>2DU0az/߿_-~z4UffzEP-<8$E'K`cVXaVXa'+*D>}/֪ETO|@\? 2Dju*+++j>rLcHbWa<'NS|5Ib2@L"*5k֨yfbQQZ,(()\$1D &|SUUUzz̙3j13d>2D[LׯС޽{iiiAoD &$cڲeKNNάY󳳳5p>d>2D &=9/vd;2GN#' zaG}#wؑ;rr_ۑP vʎ;2GN#' zaG}#wؑ;rr_ۑPIv)//w(;{ }8HJJJNN1c<[[n5jT~~Z-))Ѽ‡~8z۷k۶m^Mi8c{LvsO޽)^ѡC 4bĈ'N(b7Pg<ɓUX9s|:\ve]vYwޝiӦt}sR֦M;vطK9(Ƙ6nܨ^-Я)FgTVVv%\{gϞ .Ƙ֭[תU+){Omf߆44mj+++L:5##C=ƍՖGiF>gS'T:+bQ/믿^vAF1CWtڵm۶m  ]: 6ط),,TWܯjٲepe߾}틜mw &n,1E)AYoͮ(z )33S=n:aEEy}Ͼ 1GBZ բzɽ?-srr시mИV\O74&BjedmZW^ܣGUVmCFKPLoS;vܶmʫK.}b|%ʳ326Z}J]]}Zjr/?OǍ&z &;;CU,Q6mZXٴikoCFKgmݺf zo/?Q_ݺuXwom tf_4cqqW^W_sp& ꫁fq&s9W^k.55վ i8*/6lg}6bYΝg߆o{ߢtFÁz뭛n[#G}،"qK)##K.Qrr}4WO\jooCL$Ew|͚5jembAAA?|)S"[mxHqf})=ZW]voCFKPL PO~AӧSRR EyQ3gڷW={oW8rH^^^Mׯ|&z)B!(%(^z̙3ve"%(aÆWXO'&W<44V:ݻzXZZ0K.Uh"c1o޼ܕ+W^MSѯZ,A:W/bN:dA2^bz XUjժՒ%K/HLDQlْ3k,S)))o9uT~Bt3g%"Fjet)S >|ڴiGӟjdTXXxUW3f7pÊ+BL"∳M|d$1pFR">~x^ /l#b2@LaެY/W!b2@LPWW>sn֯_߿Vu]7o<_,]SN?y;v7΁.,Uy;w /؟nzZZx;c=UPP0l0h9O?;7n }vСt*c=vUSS3iҤ?t'|ҪX}}}ر3gάw`_̛7Ou'AGMOOW)q_]zMW5 &#馛mQ,-NYZCںuQg̘[RR"YcT:s9眠;K,勸կaGӧOSʕ+ B~\s5a񢢢]vYwޝi&4m4X޽X?~ /c?~.++Sx6>YU[o|ٳg[駟\V k׮O>P . 333جfOBǨ(?ܥNqA@}P-^Z͟ رcϷ1bݺu n喁Zj6ׯ_٠zBlP^^zak]=lժW\v;¼KI~<,Xкu;e]غqʔ);w|WΝvء?<䓿կrrrᄚsĉ={vtɆBu7~/{uyGN4hP !+_YFE. $>¨4|7GjԽ{s=wGQHNN3f̛oiuո/_nѣ?۶m{Ξ=[u*UT_[[{I&uI}JWZ98//owye˖Y~YfYǫŰ_0`??Gm}j0ShRLOO9s}1??_-Sg?֭[ׯС޽{iii.%Yl۶u}Ay˖-999f...,W?2U endstream endobj 20 0 obj 17826 endobj 18 0 obj <> stream x xU$EYaQAT AQQgXTep Q@A'(dGA" , Ⱦe_hMݩȩSNu8f…vmyyyn(tiСnHԲeK"'|FdZvnW:;sT|;vj޼y #j߾}]t#9Ms*.._RF eٲe?Q[֭[uGQFկ__6?~>|3<ӽ{oq޽رcΰa.۷355UbΝ[nnݺ)S***̋[pС'O+W:7jϞ=N; @\:-eeerq:|?S7H=j? ݳ>POO>dϴ_|Q3~x@O>|֮]?'ѐd"VAA7߬}С@=~\Ag}KǞ~g}y 6uu5_s`ӽ{ݻwzՊ+nٳgmv;vlZ~p7w;@{h>UOE, EEEjۇtԫ|͚5}Z䐃VTT5o\_~w߭Q0mVaܸqjњ5k|UP@=~\Ag'_Зk_~! _|͛?ڴiӶm[vکWV?C عsI'dd3Ziii=vٸZ-|E}1W_n{1$c;+HO~hYrjy뭷=u'|~qaǎj"޴i_|ѼTo_fܹs}Q}Պ+T8SWYN?tUj*ZNuVx?'x"55aÆW޶m3F)..V?[7RVVFuO4sy믿VyO-z>y橬e` =/Rc~<3SGpNZRRⳝ{r-կ :tP1|N:v^9_?@;|ϡ߿_G W_}ոM1bJ^JjގϏpWa+..3gNRշ8pĽF7x?餓[@"s;xĂ16;p$aG1KvH#|Gzq8wᰣ%f;p$xbŊM6(ՋÑ#l/1#yGɷq这XQ2#IFu$:ڌ3{~|=TG2#HFuJJJWCu$:Q ɨdT{dTG8 $Ց _yՑG$:Q+yꩧ:Q ɨda+*~5ceZbb4 -T'~Z -斧-^_yipH2#SҜ?W <*YW $?0@0A$ '"_y(HFu@QMV?/"|=LAQ(dT]K '"_ySdTG8 $qKV]`p"NyMIYY ~^``_|F*dCU,XOnZ'xb֬Y60J% Q(dT'B=m 0J$IFu*d N`%c G$:Qb{8!8a"U #q-sV'l`8}I0p((HFu@QG8~, dLAQ(dT'BQJV?o`Q2 ɨpH2&wA0pB}ERnDEa./FĊey'0qdTG8 $ձ) 0J$IFuV`Q2 ɨpH2 0 n 0: J#8aEBN[`%ɨpH2IKV dLAQ(dTRj$8a)H2#,#6YiG0Ćd 0m24$G0DU$+`QDA8#,q_J#8a,qxDu@%Bu1YiG0%pH2oW'.`u`F0p@4#L |yxGu@y:~!Dnw F<3yIx#YY 0J)ȫpHxWF0p}NV #vx`$YiG0% Fu@Wu'YiG0hpHxNB2 0J/SPb:Q W'1F0p3  #Z'+``Q2($2#LTuHV>`%5I&:\j dB Eu@I*#F@B!YG0pH$+;`ǥV 0J&Bu@Ÿ:$ 0J dTG8 $Y̪C I&nxG$MuHV%xN[E`$ 0d#FɸD2#pAG0!I`uHV#8aɨpH2G-C`wUC0p#6#F@\ Y d\@"Iju*`%B2#,ꐬb`Q2^ $:Q lVd 3gfeeu933GK,𢢢_~K. [ju]wm߾=3 Y@aÆ5klպe…u֝>}ݻcǎm۶ݰan/TĪ_'|bg F7p MDe*sIRRR/_^o|s TcvTxv F$@08~xF:t ׯ< x`=ɨpH2pJ?uQNNNe8vX͚5j 03G&]tE}0!IfTd%AQE={ {G*xOKKkҤɺu;$+=9rDG[.[L-jժU\vez;W^yEڶm{W6@e XZhZ"oJN%K9į[()).]fZTNjs}c2x`;40`i&ơ׫Ev6u38ÈX۷on0z:Q iɊH`ǎ:Z]~!##5kZ_o3--mvmLAQ([R=8tui~~TRQ////W?ZJ_3hbv#އۘ$:Q !5H`b˖-EsUz| }Q-^hٺukӦMu>|x}0R8`0t$˗h'NT'}uQso7n\m<0QHVq@tرEN_O  0J$."YG2#F A0p<`$[3NvwaK$:E@$H`Q2 ɨp+*r<}$#8a)H2#\4 Dr O`Z\jA0pP`  d\ .dG01IFu @\j<}$#8a)H2#\x"YO`d`HV`Daa jd$,.< ***fΜչs=z,Y$Mm޼yȑ]wԩSmVC<3% Q-E<}$F0Pjذa͚5[znYpaݺuOv8pwu];w@o W1IFu ^ xH`0m4u *S'M|rQ٬e˖ 6\xq0zSdTG@ⴕ<}$@08~xF:tPQQan/((_~VVO_y _|E}0$+Yf=zuQբUV޽{[h^<0ױy  8PrrrE/nMֵkW;g0@* $͛7WGa뢼ӦM6@efLK[F!IU]Hhiyߜ֭[QXYF-SN-t]S^ &|wf~:@#qH`ӦM:_tjjQrrr-4iDOҥKSSS׮][m7}{0رcW֥*U{J@10`Z4tj$+9 .ϯT뭋x 3Ψ> pAzz:-[X͝;W-իW;_\ҺO?՗W qdTujE$:y  :8ĉբ࿁}QY˷֭[m<0$qW(dTG29s4vXW{v~a+VEaLAQ H`PXXؤI]4nX#G KKK+w]vVWϘ1Cs=Wm<0Z1`0eu \ոxbsk`޽͍O?XWB%,d\ YT'N9q dmOo$c ,Awʐ STG2WFJ2 <_x,=È $$f@ H&!?~^֭[暷~NF0p\ž!׃#G222|8ׇHV"z09rdƍǏqƢUVtM/ )$+s=ta>v È DA2i!YV Q\wq{'=È $SN[%@: Nk/w&l#` LBuHVAH(: 뮗_~Xw޿/gy#XH\F!\׃]Zly'}٧~`6mnB0 @Hw뮻TJNNnѢ<~; &h#8aK$quvPHF0p(Sd* <}$: a}/ bSUxHFu2 #  +`i `QHV%'-_L0ŠK$s:$+gHz0=̘1GQv,$#` ꐬG2#_V}HNN6뮛9s È $s:>Q\Z6mڑ#G=Q-:tpWr}E ;;ړ'ԣp>@"Y`p뭷SN 6tS!s}DC //oԨQvR=)//_zu޽տnB0".Q,p*xHFu$ ^yz꩞ԪUKRcǎ? aD LATUH&$>|8//oر?{WXXXVVvB dSdCrOɨd2;TTT̜93++sΙ=zXdI0a7\_0@w\XiӦ^z>p5lذf͚^Z,\nݺӧOK_|K% p @r=$RL6M=De*sIRRRBcǎo^|og\?ϥV~Gln5СWԯ_?+++>|>K.QouHVrHz0{~X60k,uG.߿Zj*֭{+/a ̧:$+ixHFu$ V^ݴiS+8PrrrE/.--MZ)H2:$+xHFu$ n5k\y(6l`]ٳڍumG3\j{\o<\1~e˖EZv;cƌQΧW!+*_hʴBb$+!Zhߜ\n?C۶m {n;ߺu>5k֨Eu ?XѣF 節hs=FM6,CׯWlСC*\H a$+#Hz0(..۾sN;߱cB֥k׮ ~Joyܸq>+/a zIFu$ ^y;xСC֥z/rw)H:Q ɨd;q|ZYŖ-[Ν+c۵k׬Y3ktjݺ13ZH4}Y܇tСC,_M8Q- (  @}0(++ ϙ';ֺhIܿq @r%|'Wضm[TTkҤI׮]}KJJ7nahJn_}Q+سP#H&3|)SԁsssUŋ͍}Q{A0XH笨pH2#য়~[?| 6LMMAhҥ 41V\\l\R+/a 0 Hu@Q\oדרQc!mGEܬ.]dfffgg/Xڃ>Xvz(W@H \*/HUH={qc!q}`z0xg?֬Y3g+Vz]# z0ۍȹ?䓢'|Nrc!q}(DSɊG$: {1Շ ?XٍnB0" g9{ΊG$: ?>hРwy'++K/قp#` rJ4.:Q ɨdG0<.\ 'NN|#Y@\ z33I$++QF]vm֬ȑ#wq曣0VTG8 $Ցf /gϞqƥw߭;%#VIX:Q ɨd.++{-[>3;w}"G)($1 IFu$ n:rO?}-ߕ/ #6 G0agj٫W/{9dΒ v㏟z:Y]tEov|]%a0 \ /زew]vm?"]J2.QDB:Q ɨd{wѢE7pAo?}OB)Ji+#HJ00n QNJ2 39J:Q ɨdnz=c{ޣ|bvP+cǎ?c=+GXr%̟??;* d {B\$N@Q`%K)(.J $Ց`QD%YiVC$: 0BJVaG0p D!8a[R+HG0y$+W(dTG2#Fɼ:{ҼZϠ@QH2q/) ޫP ɨ4I'r;^0"6`m$+#G0*#Fϟ$ $Ց`Q8<8N@Q`%)(nwI4H2# # `KsVyG0 <`Q2ɗ($ԥV~I*)lTG2#FNA 4ՁF$: 0J&p "YVfH2# #l"Y@" 8a+HG0d `Q2/Q YzuHF0p([S^(dTG2#F\HV6!HF0p @0pd$8$t" dѾDd . IFu$#8a,zS*r@G$: 0J)d^ @Q`  0&#Ff`%bUppH2# dLA6^ @Q`% o  pH2# ǐ 8a  rG0@83b̙YYY;wѣǒ%K?lƌ:uU';m|gѓDK\$Q ɨd* 6YfW- .[Iw͈aS]@G$:y#L6MTI&,_ڇ{͛7W׭[jժ^zq:bv:a@SJ^ @Q< ?ިQ:k*((_~VVVsP~JS۶m376tN<0dYf=zuQբUVy'Olmck׮mV@08p:[^ ~)cHV@0h޼: 6XE={ ck֬Qر=0SO(dTGxG߿ߺtٲejQV9%9駟ZefLK[F!O!q%K9į[()).ԩƖozٳ>^O[G$:{0شiW~?$~z(999޽[I&\?އ{ E vءUiiuڵk;uwׯ>^B.ރAqqqJJ:CYqՇ~رcÇHgx زeuܹsբ^z/]v c rڊK$:Q ɨdC~96qDo={.r{a_2)H2#H`o0vXW{v{n:j\m$IFu$@0(,,lҤI׮]}KJJ7naNG_}bcǎsŊϛ7>  c:vXSLQonU/67G5XTTtW>hʕ3gμ 71^y#3hР7ꖥK6h ''ǼZqqqWBXZZz1c7Q>< TҥKfffvv =k~衇#F W}{0JvɨpH2# cTExΊ)H2#HF0p=5)H2#HF0p8./#Fgq`)$+ 0:"JɊK$:Q ɨdG0i+ ɨpH2# cbA ɨpH2#[ݗx¥VE1T\0#FHV#8aí[rdTG8 $Ց`Z.b G$: 0$:Q ɨdG0~p `HVG0pèLV\ IFu$#8a4 ɨpH2#Ć1~O[X0'A%ȿe($x{K$:Q ɨd^ .0zSdTG8 $Ցu>^MVSdTG8 $Ց,ރ;\j7H 4HwH z.GØɊK$:Q ɨdq $aLK$:Q ɨdq ?4 ɨpH2#`$c"'+\!9H2A8+"0#QH% Q(dTG2Q ~FSdTG8 $ՑLN0kV0IFu@Q$pwIVBr[Ø @2#\Fb2aUHDA2#HFrD̆d ɨpH2#I&Z)H2#Ht"Fq|h@4a$YWpvY\ IFu$#_9a$Y9)H2#HFrSH ɨpH2##KWdIVx  # O"_9"a$Y (HFu@QWi9mcLAQ(dTG2#l#LAQ(dTG2VQQ1s̬Ν;gffcɒ%^0Hʪp5lذf͚^Z,\nݺӧOH iӦqP8iҤ˗Ba |uFuС^PPP~,vHK$:Q ɨdYfA=zuQբUVU0r3vi$:Q ɨd䫁A?uQNNNFb@LAQ(dTG2U lذ(//O-ٳgQq h 9Te֥˖-SZjUvz+B -B -ߜ֭[ XYF-SNIaHFu@Q:6mׯ_%''WFᨎdTG8 $Ց,cJKKK׮]+:Q(dTGNqqqJJCYۿ!TG2#HFu lٲźhܹjQ^(ՑG$:QCZG8qZd@ 1Ñ#l/1#yG5g5cǎ.9;;wQ43`+B{رſVDŽ Ԏ͍T'h#GȸNm6Nju^~K. .HOOoժ]wݵ}v:THdO?,RϰaÚ5kzjݲpºuN>ΖӧO$'bise /T++:pwܑ^wh5 dݻcǎm۶ݰanQ ׯ'Xק:@2 iӦv5'M|j|6oW_]nݪU^zƍ}L#z1;vX+W ^[lٰaŋ_YE:7pzx~~q]vTH@Ǐ7jԨC>sEAAzoUi+~TTҥ$(Uß}} 4Pa$E:LNNV-..yޝ8x_:t( fRG>jѪUw'O 걵k׶s:fyyyݺu+++#_YX{hBNW@nUgzׯ7~fOį/TϷ>$'''dPJ+[17iii6vmj]<r:ǎYZm̙3G5^tE֒%`u { j޼j44SzF֬Y۱cG=0wSVV֭[ٳgLVҽm۶-%%EfTZ X >s߯GU[&M[~Oį#G[l2UVaG{mܭΘ1cn6ITW UXz)ԩg^7md'ӧ.۹+-ZԶm۫￷q-)h֭}N:a[nWޞ={l\^=j3 XJ Խ{wzL0o---ݽ{ɓUK͚5x =6w'Ǐ7yMA=n;c_^-JNN35BM\&Mos:JOO_r$`u*+P&M:O,]T=055uڵvzmOngaD~۷~Oĵ;vF5|;TSPyyx+Q/+7|qBLVҽO 0@-:tx?qϚ5Kyf=/oߞd?O(Ob}y>'~Շ~رcÇZS_~(,S)@Jjjjoq>.TV+H[TIX_3hb>{:}Y'uF|Gz⧧-[XwW^K.d׮]A$:ڵk֬9zG[?vu*%HwpO $:/MnڴiSÇI?СC,M8Q-zꩧlaϞ=ꍞϽ\K|[O򝗗g]/[͞x[ٷoެ!ZT7nl'WSرc)1cWU0:թt@%%%Qɓߡ҇~qMJH=*s_]Oܼyl;&`uϋd {.]$;;{|ڵk?CFˈ#dI$VuLVUTTݺuk޼yǎ/?'[Nz%y{nӦM{[o_V'!gLD9"'r9=3rrz"1Q !gL@O| clÆ LA>pH2E4{@ j󟙂|P(dT)Ȑr)>ޅ:Q ɨ X";;{ӦMV9sfVVVΝ333{dڸq]GaÆ5klպe…u֝>}:k͘1{ᇃiӦ*W'M|rQRR$_?~QF:t0ԯ_?++hO5|WfRFm]ԿhժU #H8pZ4|뢜sH5|W͛7W6l`]ٓ5|WGыo}ԲeԢVZ%V֭[֬YթS' 6mڤբ_*Pڱc^TZZj}ڵks8&U|U\\:t|D^*PRբ-[X͝;W-իkdmĉjSO=Ś>9sEcǎ.: ԩSzhԨQ|E&M:SG DW-@W!)))޽FcA6l˖-jG͛7/..p:u̘1# * 0@?G5׬YsNw.X@Wz+lf3*֥'O>>ƖyiӦ:O?5n8UU"6mcE@tE۴ÇhB=N?t;vK |.]ZK/MMM~g|>l6m|W\شjժڭ)mQ߾}߭[3<'̑CvkְaC_[nٵk^gffXfM 2o۷Ooj;:tPs݅^ /?~ܼj<Ԙ>-[T>sL6{;{͚5:tzZRRvZϟ5\S~:ucҥ֭U[G/v΄wIq)6@Ϧؔ2x*օYw;fqZ7_'. v?l0 cZxwzi˟x hЪ-ԩSՀ[Kꫯ~eGcU]8йsgL n=a竼RG9^O>˒~a^?2gz24Nq>ciԏ#FG~C:gg}<,Z vFGG^L_|Ed\:k,c2_`zU/b^|⊴4vA5jPխ[*uΨN2f͚* ة[x vh3_9;Q}`gS,KdօY>o޼_U[R׮]u?aLPf*DdҦy'|aO 1we:ujx\ջ>C5c7>S~}*To|vjၬ[=TǮvTV38: 0#<4 5_-\P{FI6mz d>jY|ʥ[V^~ecG@5՛Ƭ,ըޞ- ,^oWmn׿e^MpI'vu毨בȟauN}6Ŭ:f.V22+V07~ᇪSN1Z" FnINN6Ȥpĉ#tDmm B*JؖTu aopge;%h"c;w?/!CG}4FUvixWFxhvju+h/4hPPPPPX76xiFfPaڷolvw}V_O?M:tzHp>s;IUyVVV6wܛniȡo9s^_QFU{/fwڥ[^\:o<^zF1ی h1hgsIwte(u #_;Q;/ [glW hݺuI5\F޴|>PIRիWv6md\'o( _ +!?ܯ@GIh۶qE}Y^^^6mL}"<4; #_y뽤YOe_[/HIbEYWO-}u=jvF5P}WZK_U") [glWzǏם_xq#Oc؇jQ"W?jϹz;7r3|@@/7AVMվ?q+3WN?WHMMUIMgj$j6~Wʸq㒪.駟ճ>Y7k ;E(O_ve;vػwo߾}6lW_Jۣjת]ߩh*}9HJw?(øT˖-~'Zռy󒓓UjL[O\{ MO>d_~R/--2e s9'Ȧz-}9^"94 /_8p@_0f̘zg ~ A6f3}uSO=e]_Zdc/*_խ[7wUJۣK,Q2_UsQW2Pb A<'(~% ZӂuM>P^ڼys ?o߮~^{6(TA5뗕 2ĸߍ_~>+IaРAzS%%%ɡoxOvijJ Aj7J:z?}F/*NˆU*.E#WQP70 ؔ2PBJ{eGR=͗pZPWV2ZB*Jȑ#۷KU\Y4a۟w7,ָڇz|$U3gÇ{곸F6͇dKr9P_pUV0Ǐ-{]$ܯq- nصk6 Yn}/F֭oce>/^F̍gϮSαcwڮUݲ~z8ЬY3WȟaqIݢ^>SpϦ2PօY58g63nRal6 JߡCk&jN g}jTAWp4Q/C (ƐڼZk]3;uޝ{#.7%Y|D1nCW\aݱcn4y0|^g}ݧ2ߛ$jժէO6mlR=zy6Dxh6kU]j7{ ~$@U/Fj*V}}Ȟ={{UWe|ȸ#6|ݮ&|+T-zjVV΀+xע2ߙȏZ zVW[֟' lY)uPo]HUiSMk";4mTw80& ."_žUpު|gvکu|ɡU[e|I nO/\0'OWQu]›o9|pu\_08g:t۽hժUj"5?RPPyQFTD^V3$r|'tB\3ҬVǸK$ dddȼWzmܸq҉B71c7C&J ƍ[r_,qqvv~j\_w}%k!xΝ;x2O^iÆ 3Zn3[vmnwvQJpuq{~N߾}gj׮}u]K. aE)ަ^ξ{߾ @U" endstream endobj 21 0 obj 23060 endobj 23 0 obj <> stream xUj@+lX+qa!ĆK~?3I Twӽ2gXYo?;;.sb\"#Q!Ow[30MOObX<l?;}xN⤌;qGC]-xVb Rθ8kkA{ iW4=dƊ,h騅/^'Z"~S]8nI#{,Njah4_|U.k{p\Ew`ز/d:"Uy;g+ȥYBA*ҴfYƒGNn=k$fHiHh&bm-w>J+z &bGb|{7maE->>cmY{SY5Jz)жДFD¸eI4 ^,yVy2V.3ħ%0úh6î5U/Pu]N6t#0/=$ޥ,-ripJtѶ V3jV%a]+ʵT"Y%ZզsZ.6_߷e}^h G֚ endstream endobj 24 0 obj 627 endobj 26 0 obj <> stream x a pY .J;A("c+UWu$]o 常 '*q =mEpKmRU]]]o}?ÙyK?OMozjzR)rwx1@!U*Yِ䭰!6T⭰!6T⭰M#*̆$o o o ElrQa6$y+l x+l x+l(e*騆p4H8$=ΈJ:! G3AFd쨒jGA#h;;~RGA pb3*~ǽ BA#h! 3N2$  wʞ,՜Uq GG‘A0JWP%LG*3A8$  W֠J:< h|H853p4H8$=|e T*Y"9A0JWP%w&GA# |% Uq GG‘AtyA p+kP%LG*`:=_;h J|% Uqgp4H8$=.WP%ghp4H>z$TIǙG8$  a*^"9A0JWҔib竲Ef[Q%w&GAѣfq5Ύ3hp4H>;zD"_ICtvy,FA#J0*oNғ*^U (y qW^+iR[$N܇<8+/4UKJŎ{{fG,WWE*0< n#J%%bǵnv(wΔWְJ\P2l@,,Wy#_Ic_d8؀XWW%.y(6 +tS*FUKJŎ{{fG,WE¾*qCpq="_yJ\P2l.v\fGW^+i<  UWW%.y(6 +/U񴵵͟?NҥԩS.e_d8؀XW3{=zL0Сzݻw< ͎Y廆D.]:f̘f0@UK/ ^о*qCpq="_yd_~>l2U={/h_d8\v͎WEҔkd޽z ^о*qCp8_|U2[lQ8qb2?Cڑiikk}9#ڷo߭[N;mƌo>Sgp9r>{JUUՀm۶ /0eWQL<>}8;1#2D9PGrZs2ŋ /7>w޿Uڻwoss5kno}[:uR#K,]۪UTAJ߿nݺh׮qyfz.®]~ޮ]vޭ>;1c\ЩTo _yU]r%YW%.y_d 0GUXr">xwrꩧ.X5w/r׸~jP=4po~=zX|!_dG[y7|U C ٹsg֙UK^13?4*D|jnrMޕdƍ~Ycڴi۷_vmzԄI&yk\={fZľ*qɋܠATI]UHMMMݻwW?w ؿTOCѬG-[̙3ЛL_|̞=[ !C?8xUJv\fGW"_b_E+P%osSN9eY N?w _EȎ{{fGғʻZ "ٲeرckkko5k֨в?g>}z*++~ZW`o~9rk .֭۝w޹vC}߾}{͊ŎkwUxj݃BJ\Tw*8qx ӟ,cs].[lʔ)}iH޽U[tin1#ŎkwU+W%.y(6 +=Eq*vUKJ E@)_$(U< *L _*qCpqo*W`_d8\v͎|WEž*qCpq=*^*{D XJ3c=$ VUxr}@*U"Ll0:_]4T ` UWP%)WA"_E*L3z4H8$=%_OA+Uҙ~ gnY(`f1UN?j WJ:s< AAۣ+}+d5@DK W|&$!_7_wsE¬*|CTIg AAۣ䫸"_E*=$ gn|/fWJ:s< AAۣxUNA%|Ϗ=_Y! /!*?+@L*}?(RʚUbWς|/u_f.򕕨; G3GaU׸rZg*dJ:s< AAۣo _kX{>!3̓4H8$="_YJ/8?~W&xW~'szFy$'f r'9@>_0NI'r r'9@ c7J*̽3!!hp4H>s{|W֠J:s< AA#U!_ň*=$ gnW!Õo H,y|5@h+fSJWyT&W@%!_W2Q%w&$ gn"WOsW)|UWJ:s< AA#Up)*oTIg'!hp4H>C{>BdW3szR+ki|BF&! ^<`U! NZƕ"M"E-N! |Iq^aBJ:CLH$ WyJ:CC{$9_E;_J* =$ ghW'%UqP%gA Q*aT \Ѩ1I/~*GT \왇|u"$@UHsCcܺ)U* CLH$ ŞvA9Ex֐cŸ-SvSL)eCSײeںwaaמ>u<+3m=>]|gV >egݷOK1kpm9ǷPY9Ӵe ޢ>?t2E=|?-Nڝt- hy'm0XUc?(kPk<:3mO-2Oy֐|u 7ĸuWJ hHοTJпXU]]]jkkπ}?}w}[þs-Ly:-x7l5'ڂGm`NMW)[~Q߾<̴_ tz]wGu9Ykk9x?v-=߽u?2[[vw+ݜYK_֧[aߎ_eʕeD_Λ6m'Lf]ĔW{*}^W_=gΜր9;v?~|${嗫_|Eӆڵk/{{*q*Rq d3cOvR*봅 wĉYg5tжc(&fM h|&( T|kJog}uaoh>߯ӯhP%9L<$ gbbB6ꙒJfԩ~'ʕ+UW]`gDA LQA(dD x*ު/PÇX0?LFaFeDrFrԟNREwJ2-U˓5w^U^z,*L MKy^ {̔ZPŨwאUKK3u@cǎ-|sӧό3s=SNF#_]u ?N8H /ԼΧK,رի"_#_]uSO|fVʸqfΜ9u0HzgBr h|(9_]["&~`ڷoO&+gA *⤬W]wRs8O&+gA 푹*VE ;<{`9k׮}]wlWRHf X$˻EbMMMMݺuСO˗ٳ'о}?͞=[=l߾=$_ {]k΀  dJ+**9~{ڵK>sdU w(E*vtg{ETICLH$  !K*W6|܋H۷o;wÝEWu]|MܻTIC_e]g|r?f}7dPJW^9c`UUc=~ty G3GU^$0wܚWAh߾wv=8;ڳgxonORZ{"gA 푨|r?LWޝ/ry晿կ_򗧟~I}>|͛ڽ4b@HUuƞP|uXC׮].ۿ\#_rϬ3sZsO$krٳwo׮֖OJ_n+p䫼H5=?0`ý;,#_ 3!9hp4H>C{);ٗu>k.9??Oڶn:bĈW:Cs{T| NW&ɓ'ǸW:s< AA#ϭR"U4|+y. _BUڵk7a„-[ĸYŞrՐ3WknzWt}…/d}ǥ1@>U֕$$_\`ժUC;v}g0΄A QB_夥ի}ښwgɩy G3GW3=_XrhhhJf'!hp4H>s{Dʺ͛7?vTǎ?XYYI *V|㏫s{Dʺkq۷Ǹa5F!=$ gnWYSxʴi!PWWDȗ|59K1n=<@>U$$_*#_e]OՊ+7Uw&$ gnuظpqaV)Fy G3G%W\bC$_j=W_}g/BzK|3̓4H8$=)_e"_xj&SLijjJ|UQQѹsTs;$_KH{Wz~#kSW\qŶmooKk!_LA XOBgn:`CCkd׮]JS>WS2_!gruqDžٯ_I0; G3GO Ή+_WyҥKimmm:u* _L?X G3GdYAwy'd+3hp4H>{D XOBȑ#gΜuԩSNF+)"W)pɮtTIHs=mmmܹs՜yxt+)WIHڽ{aԨQO> K,=zzk׮d `櫜DTJTR?UUUߪ{ٳgEEEzw];{D1 h||W!+z*S]]裏ƽ"$g h|v|]OUOx:TUU ;zD]UQ=DJX Y_Bf!_|% U|*(TIgǝ A 5KWBJ:;<A ʋ|% Uq gGBxW֠JDuƛF*B"_ICf!_y#_2Uqghp4H>;zdquU|Uc1$ ώ|I!P%g h|v|E*bqJ0 ʋ|% U* D*3b4H8$=*<6DTTTIgǙb4H8$="_ym'tReee.]NؘuU)g h|v|E*ٳgc„ g}v޽{ֈ*LgqH.]:f̘f0@UK/ ^0QUX|E*ӧȲeTz`ʋ|U$*MFݫ*ЫWU3b4H8$=8_q|[lQ8qb2?C-vg&a$a5saF$A j$=z4? HX/Vx%J.hp4H>;zW^~Zd'K.$봄W `UW0dȐ;wf*LD"_ 6 6lӦMaVhe#_y m۶]pׯ¨`vܙ`1$ ώYJ;v?O?ښiV)g h|v|E*ݻwO4iݺu`KKu]G Ɏ3hp4H>;zTDrg0Ia޽G2dȅA͛7/`DU `UWErEXUUնmLT _yJWP%w&X G䳣G+Uq gGW^+iΎ3hp4H>;zD"_ICf8_|% U|E*Bre*U쨒Ύ;,FA#U$_WP%g h|(+k>$3p4H8$=ʊ|Z !@_V3Hr*FrgU |Z !hp4H>z_V3HrLď3p4H8$=Nl*;\M# G$9@0JWP%LG*3A8$  W֠J:< h|H853p4H8$=|e WP%L'J銔Er*3A8$  WW)TIǙG8$  GUq GG‘A0JWP%LG*3A8$  W֠J:< h|H853p4H8$=|e WP%LG*`:4TIǝ h|H8F&}ghp4H>z$|UvVk1# G6_EcmUt+i#_IC0Jhp4H>z$_Y*8GA# iJ# G#_Y*`(T DJX|% Uqgp4H8$=AtyA p+kP%ghp4H>z$\*1*^T ːbG *vT ːbGtܙ  GAQ%ghp4H>z$TIǙG8$  GU2Q%,CU2ؕiޗqgp4H8$=NWepͶJ:< h|H8강BJ:< h|H85!_Ŏ*`U!_Ŏ*3A8$  W֠J:< h|H853p4H8$=|e eWJX|;eWJ:L GGq53p4H8$=|e # G#_Y*`U!_ŋ*`U;A p6|U$7xc׮]NKx\8GA#W-_|+< h|H8dMMM#F!_LM2e]:9Ubh-ZnPH,UGT.+uG$?F~?0#ю _^o^{-`%}P 577{_r={2-* h|H8/oP&J.yA p+Wy# G#_G WJ؇|/}WJ:L GGq53p4H8$=Έ J:! G3AFd쨒jGA#h;; h|H8#dNƎ*騆p4H8$=Έ+J%06ĆJ6ĆJ6aDِ䭰!6T⭰!6T⭰M#*̆$o o o ElrQa6$y+l x+l x+l(e qC&LpUW]{Cy7mڴӧ ~a}W^ygڵkwZ:6N:K.SNmll.е0slV_2oѷz4hÆ ?9sV\z[s_>~xU#Fs9 A]Gyv_~_|vڵiwV̞=GDqgwAM޽+b-P/_^^^ *mڴ/ׯSO=uAף|z꣎:ꗿ3k{LF` ߣ}8q>xYg :{o=.]:f̘f0@ͼKst.kYԷ555i4d*bŊnݺ;wzG[:52Oz믿V#L Zx'_ #^[ӧȲe̞={Gt.kYL|4d2Uf͚5*xoU\Qi裏V|IzDe`5ҫW A|Sseʕj𪫮 ˿>[O\#{uytΆk-Zt 7E+ҥKkP EG $:ڵk3!]3Zv$*t6$=! y:tr]v r|F(DfEG $ǫ;uQΧih|G[l:9sէׯ뮻~:]vYyg9s=38&MZrIjB.] `Ν7p?|jA5PmmwPٹs' dZn]ܻ?aٲe7_=|;Gy۽:s.\F)A?Ay.ӣy7mڴӧO0? XՆ ~9sjouo۶M.9?O؟0+9()5W_UUUNףk׮իׁrW`]v]}*d:پ/iCCCmm:zgnڴ/ׯSO=u._ܵŶA :tS4=z9rk3?~-[};vHW 䫯>}^sZ[[3l/^z'_ _Q֬Y҉'ܜusSLY|yC҃%^m?oנK 󼢚THJ^}ܿupFn뮻8 _yX,vԩ!>rJ5xUW9\4h 5ꫯfТE㯿M6 ?aWTs WVr ~ԡwxٳƍGü~_}饗X,V}}˚/B >W:4VG-kR:wΑlٲ.{^v{N?sO@UէyJ}D`L'Ꚛנ^Uի^>1cƠA~KZZZƌ;kr~IPE2Gwv WjN~Ca'j Pjҥ8kȐ!k֬I?>_lld[^^޹sgנsVnݜO9w߭TНTj}CPqHS=kRO>q҃a'j Py/nN>d5һwѣG3s}s@L'N:y䑮AuRu>m׮]0Xp0vȪUTJ ʖԷa~q*;n0yE5:o߷oߓs^Zt>ywׯ\o/vȔ RQQgej#OUq}v=4776u#zpZdZuUQ<=uB>|We`9j2 S풷z+=r>}=Jٳǹ=r֭A!95^ywq/̙3C_ rjkq>߿:M)*̨s+<}^{͵'tRȝԩS=ҟfݟ+9;v7o^]]wyOU"JOPjܹFr&=Z}'~*G~?S:;w}>[*,uW5C7ַ0hР~={TATj@eWO?zgR ._t֬YS/of|c9:ԡou:9ssiӦGOLՁ3c }s=S?pIcdjb1{9W[TDvm;vf<REŏZG_xᅚ7xtɒ%*Ϭ^Z3{.]8!G+_~|MFwPm{miiimm]hѱ/fٟ0+9 9vڥ"ʄ s 7<[^_yq͜9sԩk:si6iҤ.h֬Y[l t|p[n>o߾/{w.͙3g۶mޙ!'pLA endstream endobj 27 0 obj 16072 endobj 25 0 obj <> stream x abAA.]dFXP&]\Q 5xKVL@D%="a;uEUuus<ޮgkJwyIb{,'='=ݓ{w_A*ݓ{ݓ{=rɻӯ_=rvO=rvkWADJo W .~6W .~6W .&k orÉ.6]lpEvD/9Z܇ѬIlvb+$68*Uf\ .6"HF/y.C ~6W .QWaH:iX%~eV _&6JpvE2*84.6]lpEv N2 *lb g\]$ӯL*t_EVhAJ$4IG2 _Mlvb+dTpiWa]lp%8"~eUf\ .6"HF_U WaH:{ h`H:i8*lb g\]$ӯLC b+Wdɨ+Я&6JpvE2*_ײWAJ$4IG2MMrv*9Zg.V6W >HӟQ7:_~6W -4.6]lpEhѯWabH2կ͊~[ ZqqWn+*d qЯWf|{?sk3 /Or 'oCN:ڵ4iҶm|lÆ GUbСJD|I۶msX}FgĪO)#Y͜a'ٳgX`fŷJ!ٰaCnN9?J۷oϞ=+Vێ=XDzoܸ~zdΜ9-[Lo>k֬/YfVZm޼=/ƍ{+Wܵkݻwݻ*t+;pgbWn~*fѬ0|WY~ R]e|E{ul_UUեKӧ;vq`<~Cos_Yf- _Ey7 _ܨ~N:}_!޽{oܸ1wqcu:3୷??򓟸'Iwmذ5FYVUV;+W ⾨cǎ_|ϕAr\=Z+7U֯_ߵkM6٘~x \s6}ťsƍY=Iz\7%W^\͖.]OA* ٣Er_m۶m_n]oWL/ieee^{z=zF pwznUf_|gLonοǐ~eUv9pԟqY{t*Wp:tK_}Mݟ~i?߮]xny38C~'fYΝm@hU~ݻw2KUUդIWGyy^R3ۃ_w~v͛tvn+++ҥ#ի7x;fxYĂ~9* ٳgN.0`@N#_!5j%]=*** M4WJ车O~С܎Jo7+--YkYQ\=Zӯw{>7թS+]Qz*+E6W.xoϰe˖ᄏC6lؐQܹ3ׯ>Պ _Y UiU+ױcǒg:|sK/1ީS'=駟WbjWds*QoWwu%_YHj۶mG?!uT=zل 903CUWEV{wz~J]HJDtMKCyWVXρ/ѯ<_V0?Uև~Mxjٲezq﷏6}`9vn TUvA8sǽ8 Alݺm۶v(ŷJSѯR|-ĉ.bT9ӯH *ۂA_U$E4*CBJ4ę  g\=*F+wpU_~6W T+Я&6Jpv٣B*~~V AjCds*EB5V +WFaIQ~h+UqUf\ .6"{TbW&+_Mlvb+݅| _W[ѯ&6Jpvqj*HŢ_U~sٯR{ѯ?S 0_H*H-Я=}X%WA*`_Mlvb+~UL_ѯ ~6W >ϧt[үW_Mlvb+/~9UU* X% W>LD*b|UEH*cW__ŅU/*WE&6Jpv_{+9+W_Mlvb+/~Y3W|rnO ~6W >UyW`_;'% dVrZ,g*4X%W?Ȭ&g*4X%ׯ [Ƃ_)6W >W+Wa]lp%8_2ѯ&6JpvW~\y<W,X% W2D_ ǬW`_2_UOBʭbѯWa]lp%8+Hrm+U1_Mlvb+/ʿ/үүrF b+WdY ݯ|*T㿻T]W},xȧ_L9+2P.>S!V `8dUi|v uqw0 㿻TGBs&6JpvCffr{P.S *Uf\ .6"{WZ_A b+Wd*`- *ywE0u}JدU䰻_eU.*Ȗ"Wa]lp%8!3_Y ~,N+UWa]lp%8!_vq,ѯA b+WdYaUsh5+!X%bRQ _eU.C:jCd+V>*]8sUf\ .6"{bo;Jiدy)ͭ]t6֝",Q_L7 q$⧻>?/Byn*]@R;[,#qeM%YtWysp8ݥO7>3{\7PWdv[űs!sdf2WϽѦ(h}q ?$OJ3ntWjt+#[n%kw+3Olv%gC+cbWhذas%^G_y_stw%^9vw *o[7? >m?aQS9d[8sXEntG]ܹs7|nݺ ,lذU}{_8:؛î]tʸٌ3򿮃nz.s9rώ`f\ .6"{b/B 'TG{Ҿ⋌͞=[}g탏>L~6W {T1Sׯ"3|p>.^XN0gGUf\ .6"{bQ*#LcH~Q۶mu^G~Wz[n>;;ڒFaFbWsF=B }$Wnr}"hgGQH<_h*Oóol8q_{_UUU\s߾}s=wѕzRF?1xaM4ѐU kʴ~v5=/-կ_s Z_r)>;rUf\ .6"{H{{ATAUkw\]YcՊ+tyR_)uVZZxMlZw#*lb g\=dzIWaG]ڿiGO>~sNvر|{좋.җmqRznƌg۰a}pҥzpĉ>;ү&6JpvCVBϜ~=۫\*ukҝnݺ/6:u}uY&|~;9_8UV{iVk?~yyk};gΜz-_/pG]ҥK護ׯߘ1c>` Wa]lp%8!3_9߯r^[.6m1g9|p֭#8tWa]lp%8!_8y8ܓϏxҡ_Mlvb+,'}\Ut?V\ͪUN<x r+rR>%~ }Ur^[.6۷7iҤv^{… ݛh?Ə/ر#_ 7v|N+R^~W^yғN:M6'|r͚5S/r*/sND~W_}iӦ8Nƍ_|ŸB'6JpvCopΌ~;vL2[nֿE~ѯ&6JpvCߩsWWY p.6]lpEe|)I֯[dwOtZlYמUef r>[*UȆ'eb%_'RTUUM<94ܯd*c"WR!j#FhѢ'wyܮW)%kG b+̨~R}0ދp|8O\p{]whȐ!ֱumq^J *ȜY+93nկ>иq۷GtJkq `8CUVǙqˬf9Hqnksh޼{SOY棏>zȑg}q9ѯ_$ 89k=ح[7?|GrD8=lb g\=dSJWGmvr /L}{ȑ[v=#;*lb g\=d9WʶW%و8#y\ .6"{Ȓү|6vo|SIWeee5jVZg@+id܂*6]ݻ7f8p`Ǔ `*6>)WJ^xx6?>}zG~0_f8~6W  *e4LW/Wn*lb g\=|a+ЯگG b+Wd}+edJwT鶤_eK_ԩSn&E~?s-W^fAmٲ%Ȉ~0_*C %*[7|֭[MΘ1煬O?4s_G8~xbe˖s9}]nMlvb+~Wz[h#>|85n\pAF b+Wd_JݩWWRAif\ .6"{W'د6o|W[U^zLB +ngRլY:#4hu=p}_z1_ٯmI*~5lذogyUǎ{=-Lѯ_O"_έ*--[ߟn͛7Gy`6W U::*կZjoxѯ&6JpvG8OcZqر#c"?cG b+~qUim!~UQQQUUWدgeRQ67x#k~0*Wa]lp%8Q)`JmLJVjذA> ` *lb g\=*+y /p̘17>|2IIQ~IA5Uj!GC9rs=>eԩS#>6; )W>Ww>1瞳,Þ={̙ӳgO}iƍ= )BWYU.QJ?QNG7mڴM6͛7/--M >$_Mlvb+GŨ~U!5~[-Z(Rnݧ~:_Nlvb+G~GZR>cֿSN;|k׮*lb g\=ZAjX%@үW_U$ s*QX%@Я<_&6Jpv٣eH2+E2*lb g\=Z+ϩWFdDx#@b+WdsP3 uEU$!* WG`B~eV ,+ϩWF.6]lpEhүW_Mlvb+G~F2 *lb g\=Z[WaR~e3 ~eV ,+7iX%@ЯW*2.6]lpEhүW_Mlvb+G~^_@ b+Wdʍ~eV ,+ЯL*~F2 H0UV~eο b+WdV {uӯLC b+Wdʍ~#GL6seee5>|ڵk3E b+Wdʍ~7klРA_|qڵuMfXV t+ЯB2w޽{ٳvݺuڵ+0bEЯW!5j_m7o^͛(jE~F nS}hѢ6W -CQ7:*2[l+0x`J껍%%#0#$h$ Bvس[mʞ1̞Ě={^ oWa]lp%8+|^cPvꪫ2n&|cH2 *:u3n)yIDr_c6ׯڵMLX(b+7U2cm۶[.>FFI1W -CQ7:*T;w8pnܻwÇB b+Wdʍ~ݻw2d͚5I&ѯb$6Jpv٣[x+Ǵվ}z٩Sl СCS(jE~eUH.rOSζm|vJ"@r_U$ ʍ~eο b+Wd!ʨ~eUf\ .6"{Wn+Я&6Jpv٣Er_U$!(+ӰJd_ѯL*~TqUf\ .6"{ WF+Я&6Jpvً1 *Uf\ .6"{_9_*Wi=iJЯz `H_99Wa]lp%8Ez ү( ZFLlvb+dTU=\x*lb g\]$iX%~eV _U W.6]lpEv N2 *lb g\]$ӯLC b+Wdɨ+ӰJ$4IgoV~eV _y_!ο b+Wdɨ+Я&6JpvE2*84.6]lpEv N2 @ѯL*t+ӰJ$46W .QW_Mlvb+dTpiWa]lp%8"~eV _U WaH:i8*lb g\]$ӯLSb޵u'b+Wdɨaj"Wa]lp%8"ܳ_u]X%~eV _U W.6]lpEv N2 *lb g\]$ӂӯB b+Wdɴ+JQX%(E~eο b+Wdɴ+Я&6JpvE2-8(.6]lpEvL n/TرJUX% *vE~;ο b+Wdѯ&6JpvE298*v.6]lpEvLN@_ŎUЯb*PdW+ ZL~:lb g\]$_3+ob+Wd~;Uf\ .6"H&_ŎUЯb*PdWc(2qUf\ .6"H&_Ŏ~6W .W_Mlvb+drpUX% *vE~;V "C_Mlvb+drpUWa]lp%8"~;Uf\ .6"H&_ŎUЯ*P|Wb(>xqUf\ .6"H_dɍ7θ*lb g\]$Ãӯ°p5jЯL 6JpvE2<8o޽{rs p2n,v(bš9s-ܢ_ ֮]ۣGl~[ْڒFaFInc8F~<䨪ݻUoz~I#6JpvE2<8_=_Blvb+dxpUA,[_~Nկ@WYEٳk׮6moI@,UV<1[hyhτ>*{qe5+{ۗ&6JpvE2<8*$~6W .W!_Blvb+dxpUHW JxJUX%*^6W .W_Mlvb+$68*hVIm!6JpvE"8|Я&6JpvE"8|Я&6JpvE"8|Я&6JpvE"8|\<c=G =Gq#;*U#g#gvOKޝ~wO{BwO{\'%N ~UĻ'='=ݓ{w_Q ĦڠA&Lp7׮];nܸ5{zzR߿_o 7\pzƍqJnO>w߽xbk M<ُٞ92mڴΝ;5jhG uiBK,KFWN]аAԋ}G=/˗7h஻'N|g޽;=)6m+۴i__ro- .QgW鳏?YfA/]ެiӦ'YK o֭[wַ 6\jcd Bԭ ^GhѢ&Mme<۷w޽裏+Z3$[AOysWUUY#ӧO#կΐG~С:~f0aϜ9[n_#Js1o߾"PI[x0aB cǎmg\ xnt &<Զmq&Nꫯ`n݂`8c.[?ESmp ]{{wI'K6lخ]?8y]v0`ѣ/8uo|[޽{sN#Gn~, &<Ժu떗;ӽb)9d/lKxG|9K,UVI1c8~ 2b|G:n7 Kws?6yEEUW] &<5jÇ덛4id߯{琽8~ .qKwϙ3gΩq:W{<5k֮]N3J`>^lY~lj$yeeeNIQ{j;8Ǡ)dٯ}gh~ .q%u=W^wiӦY߾u[> e]9~߱cGI''79{VӵkM6H֯_^ ;óy.s)7oެ7޽{LӠA_[,[?F/y}߳_tEw$mmۖ.=-zw\el۶֭v:f=aҥKĉ`5kػ>fkIddOO}7zp?>;P_x=K/x =p 3瘋*{1g{KxG<9/Y$5uV=ҫW3$[tF֮]G~_|O3(ݑ޽{Ȑ![UU&MJ3ӭO ~Q?#vs{]lp%,AH^G=QFyΐb+aE B.68b95k8?oժUɽ.6]T $/b#v j׮p]vwL}Olv!yAf߶5jԫWAַ mOl.F飿]n<k|멧6իC=G?2kNj[NkժUڵkj% cj՚1cƾ}O^ZZX#[n]ߟDW/#s1_}9rcǎf}]j|z]  /رc#mvȐ!/5IoШQ#-x^kvg66lԾ{Hͳs=WXvqcgƌzGw̚5+x0tڴi;w.++ӿr>|ڵmȸq8jԨݻK9;C?oַK,KFw4hիWUUw+Gq?׿do;KKK[j_СCE?TTTx^̖ɓ'T\ֻ9z &|AǏc}s߿_Ǽ.^Q|2Lׯ@:uUVh+(2Ǐo֬~⋭M6mjX˗/oР]wݥc'Nԛ=33TÆ +|ͺu.XR_~StÇ>33,\s<+(=~աCLݻwӯ|6 C:ggicǎ:uJS<׬Ys}4w޽{ٳvݺuڵ#I'5;fҏcƌ__`[n=x`]t9眓z~RiRmٲN~? үo5jԽޛg0~d#͛7OL=NS#iѢc qٳg믟}Y>LҳgϚ5kH(Uj׮KH3:th…Kø3 6 (J>|%aÆIWY1 {6JHXjUݺu ;g"/~O_mzY;'Md}ӯW|WUgڎtcL>]Wr;nܸHÇw2U}R0aRcs=WoSYYwd}~O.ay̙_]U* 5cmڴ))=/<ղeˬv /{ن K~ٷ~;bg}~zo߾E[o5U,of}uW_}uf}[fڵk;ޢK61rN?;V?guQgt3'>UVZvm=#w 3+Y{Ν;ԩ]~*^VV֫Wm۶Yg7mڴVZϣKkl}~mjO̼~zA]GuHRWArgWV+f^7?cG5cƌ+V\}+z5ƍWb|$ݔWASϭ:ȟ'mzF]n%G}w!1XP`?$S˻v˞ZJ;V`]ڦM>RJmf}7tUwEfGUWǗ,YRV-t̘1ClR]esS#/@?[6kLGY7IC>_4u_yzSNٳ}l?AO5eʔ3@TVV!'P͙3SO}dmXaЧ}wq)_LC_~ٰaC;}ntgfUV|z6˖-ׯ}(w!WrY_Ǹk:XӦM{?;ϩ&3m^x=dɒԈis6oެ7޽{jDK.csVTTk:^3;Xodk a3μgºUn*p 8F9̓_=wy']իWreU}:NOwzQv9T̲ԿWϕ҃^jDղeK}W{ A}Ek7dws1g.X<0ömn:E]t)9i}K+UVX뽿Y.]'N0fΜ7 >n"nϰg^hQWT,V-WrY%_w/ɥYT^^+W;w:uvGzoWU7)SX/i={"zGڴic_Gy駭ueIϙW"z'ׯ5X :t8u׵^},tv}P?Z4mڴ>N8vsݭםRE?AGH_/,̪a_8EGg،3?vhr+c{zaqG͟?Yry睧7>S3 + 2d͚5I&Y=Uv֬Y[Uhٲѣ}9묳>a+Hsdlo A_vUZj׮mc &SVO꺫G{6ۿ͛7믻wJK+@>׳gN:]f3`:o GS~nA+}k /|공mۖ?4hg1tK/tzĺhs9[oկ_1c >\׶^)~W>l4xy檪qG]E15;t|g:veI[n5kVр3"ڹsSN9qʓg3su 5CI볭4]c>ӕ+WN4zdرK.SpVȈb~>R_Tռ?TVZEh?Y endstream endobj 28 0 obj 18293 endobj 30 0 obj <> stream xVɊ0WGbAؽ@ lK~?=9j}UZ9<+뉔'g|>S{eǬ͉wI_~Yp{.FQ&m4TןSI[0Խ4FgiXѐcRQn9Naqn?=qezkѡI0(E}flpz%%d7/LM-@ҌˡWoMD𽥋_yI:ϻç'6[=;'r;wN.6>Q~KwiQMgƬ˥`a`W$y$,unPC-s֚o "*b@B5}y+wd/"WH\Zmٚق(L] c4jLU: AB1瘩't?R=bb&_ ͛W^6F̈́TVߘsRS%q./~il4;|pjN8^ڭX"`YǷ 1.S?9JosI,EkwӹLK2Dsm;n(z&7WyyݝK7ˤ/66§\/k endstream endobj 31 0 obj 907 endobj 33 0 obj <> stream xxU}q.1 8H3Y'4b1iȆZbmΧ:ԧfST *bJ.,nX$(E`Jk3NsOr}~>}r=~pr 2dQM\t5ayڇxiWz2h,qrF{͠.Ac rF{͠.Ac rF{͠.c t}0@Nc t}4ܸx9d#½fPNϤDK;;;-[VUUU]] FNƂ 䐍A9=3BP}}} (((Ν;ڬ7o߿H׉eXpaB<^3(g@wwg%n}͛b {%K.\8<<~ d JT_mܸQ-ڰaQ5Ffܬc Wj:rq%Ԣ{ѣGUŋݯ蠱@d5Zh%-FMC -m4jC[&nDUVVVvvvTc__ZΜ9ItQHD"!5rz&%iӢf̘~D5„x9d#½URܼFknjܹItQw胜Wx񃃃cǎKKKݯWjQOOqϞ=qItД;GN+Q}i&h˖-Ʀ&ոc$:)E/7!Aوp/0T*KJJoON „x9d#½fPNϘ^]ښ{ncKKKNN޽{GN,Ƃ 䐍A9=Bкu5P}嵵ݕu0?'`,Ƃ lD tӖ 䐍_ɠ„x9d#½fPN@r> d 냛dXp䐍A9]<Ƃ 䐍A9]<Ƃ 䐍A9]<8zb,Ƃ lD 4\ lD 4\ lD 1@Nc t}0@NׇA/=#!'Ƃ 䐍A9]<Ƃ 䐍A9]<`,0h,qrF{͠.Ac rF{͠DK;;;-[VUUU]] Р„x9d#½fPNG(qWعsgVVV[[qw-c ~,ŭyVXao\d… X 9}tW7nT6l`olllT d ZR-:x𠽱C590] 7!Aوpu***RGU/va?YZh@KQBKz["ЖDUVVVvvvTc__ZΜ9;Lgd4@$^3(&Q}Mh=5c R`("Q}h_͝;yi 9}WǏ7;vL_ZZC^ UZ$jkkբ{={Tիw.z lD IT_mڴI-ڲeI5رy\ lDJDU8.,,7y;&#!5rVz{{Wwikkkvvݻ---999{u'c B֭ _CCCsssD˗VVVVTT۷/鞙T\c t}4ܸx9d#½fPNϠ„x9d#½fPNϠ\ lDxJO2X 9]2aM[nC<^+=4\ lD 4\ lD 1@Nc t}Pv=4ܸx9d#½fPNϠ„x9d#½fPNϠ„x9d#½fPN@r> d 냱@r>  nC<^3(gK30!Aوp/+=4\ lD 1@Nc t}0@NׇAc{GC6"k:iXą rF{M>nxtF\ lDt]wݻ;M~_:::\ltw}H7֡BP}}} pS3.F=OT'kt* '544$=#!5rC䐍A9D#bjBKZ"ZiԤ?hEp@NԨ<H;2+ r_D"䐍W#u 䐍Zs૯juU__?,C䐍_W+,,TG4i__8qjпWA&sUW]uW79}mV\+_W"K^u^.%0e2O4EГO>~yU(Zn]0f2 ={D5>3k֬8c7!Aوpe2z뭧NjO~2~uC[W>rF{-9k E-zg2 mQ_ !L+G9|pj\~=5<vCWܸx9d#½IN 3+.Qq#rF{'Ƃ iD/^$[(gd,ɜ~ z(cVL)fF:I-@e2 _Xƺ-RMyatgh@L* X7ePi\M%36=gD|8:rH_=ГeUq&Ԩ{37.ȁ!½fPNϠ¤ҙ)y)"½aN}ڵk_xᅗ_~ٗ.eca )0Xd0Ϛ52<<|Сۿհi$҈)1ARiӭV\;D-G>K2CñՔl,y4\rٳUh۶mE~*4D̍{g(!~{ͬJQE'0!^T~YQbA+գ>rӞ+XyÎ yXƽC}hѢӧO']-x_} j'+Շ'N>є)S|mgge˪`WWm;::\X:q#ܹ3+++\͛ߟtP(T__TeX:Q_c9}7FuL-~WZZɎyX޸dɒ ;lY,DWܸx^Mvqbv;oƍ6l7666F7oP5!`( ׸tobvW^;RuƎXWWfW2XƽmNסcEEEƣGŋHX -B -ТCVOCDzT̙fRSXT:tmiӦE5ZOU͘1F=50VmַˋjΝfR3H r{TYƽCN?#Gx۱~;g(..?~࠽رco.{"u e2ȓNUQb!5毜󱷵===={իWW4 rJ,.9}u2M6#nٲԤwfRe| -Z{%]?9KJJ"w3׬YwRŹpj|CNzT"?םښ{ncKKKNN޽{#+_^}SN=}tԶjQ~~c0jJ% rU*k۶m݉޾|rսʊ}ٗK.P(nݺ`0h644477'!Ttƍ{yGKäZLyJv;<ՙ3gy;wscc&X",5ONܾ}U Tf͚/}3 3IqaBw}„ :<$f*\tF3. '+"1;;;-[VUUU]] һUGGGYYΌqrn|4sΝ;ڬ7o߿Z B@e  nC<\C~d+5rzzyX޸dɒ :n%$:,jd i4fszQQ:{ѣGUŋӵHX -B -I["(6,hѼeLƾ>̙3'][1;g .4fsz 6mZTԌ3ҵը\n{%Df/\Ct^i比ܼFk&jܹJ&#KՈ7nvA9=Ǐ?88hoZHW8sTgs=o:uUK Å555򒒒țU֬Y>옿DuE :tU\}ժwÇ#q5ښ{ncKKKNN޽{#+_^}?SN=}"z{{.Xč{G#qo,nJ[^!o߾]u#Qqe9t*c^x}嵵/U .]:44~3gu5CVXM*:„x9Rڇ$1{nH{Awymݖto@Xą rx!#[qMj6/:??yW\qE)י&"?8]Z\9}̙IWTkf?~a,;h>*KϘP$)/BkziuI&ׅ.'WkmݞKӾt qrh"ZIo &zIי!Ϙ1ԩSIW>}z%R#ȡ3p\ CND :;R#a:˪&zjrهI&M> 1t:;c¡ LWTgLzгmFwM7ݔEM7 Ng9Lm9]VC:{嚏?=c֊;0J{@<%,w a=,¹|{M;+a10:tlsCN?tО={ZZZ֮]o;ǔOgUhr-X'NZ .x2GpI H;q+ErY_%ߙxeX4-җ400pԩoݺ3ڮ]tw :;/L -r&&C<Q55iӷmL2qDr[>;;5*&FW͛,X0a„_WPZw&oV/hc,׾SOuvv3L L>00SO}5iT>;sz?ߠ gءgN?pwܑeT999Vڼy?q;\lYUUUuuu0JVQVVzE\ܸx9d#½UNnmmԧ>eSNY+Yvܩʳ6룪ߟV. @AA>k5θ0!Aوpi]qVM ]yVXao\d… U V.YWrF{Ms=תf͚o~߶{7nTnذب#NjD{Z_:'xš/]*++Ն7vttƺT鞩4;v ,hjjzuHmU=zT5.^8FW@d5ZhZhE[7>|aw_OO躗ק6gΜT鞥_#  lDO~'OTuo˖-վvZ7iӦE5ZOC9V#\n.LGC6" :_ ⋷rٳ{rannn^^^T54wT鞙 EC6"kF/| 'Ov;6/--MeYbUW_}͚zzz{QWNeYp`VN߼y6md=eoljjR;vHe+C Å555򒒒[׬Y>ܬc'u lD #ښ{ncKKKNN޽{#+_^ԩSO>~+Xz{{!]٠„x9d#½fPN˗VVVVTT۷ϾT},((XtА\ ֭[ †樷2hR 䐍b,`,nr䐍_ɠ„x9d#½fPNϠ„x9d#½fPN@r>i xJO2aXp䐍A9]<Ƃ 䐍A9]<Ƃ 䐍A9]<\<߮'`,Ƃ lD 4\ lD 4\ lD 1@Nc t} dXp䐍A9\\rɁW3h,0!Aوp 5<<|} 0Aوp K/ r~_lذ 1#G]aΝYYYmmm͛7߿?鞩;U87oފ+K,Ypp`,ehh(Q}qFzUDccjh"# -ВH&D5鏡- PR-:x𠽱C5ե帩$3DC6"kIT_EWZY=/^RraB<^`Y*+++;;;O?gΜ7ߑc%iӢf̘R`(毜%rsss帩+Q}U\\<~A{ci9)E/7!Aوp/0,Q}U[[٣W^㦾„x9d#½fPNϘDզMԢ-[T;rw\ lD  Å555򒒒tIE A;Ϗ5;;{ǖ{Ќ2#BкuUv644477GMTioo_|ymmmeeeEEž}0h,qrF{͠.A7m0!Aوp/  .LGC6"kt d 냱@r>i xJO7!Aوp3h,0!Aوp3h,0!Aوpc,\<߮'0h,qrF{͠.Ac rF{͠.Ac rF{͠.c t}0@Nc t} nC<^W8}t__ &#!5rN:oձ_|&#!5r?YoWf,p8\RRSOY@rw:;;,X0a% B3@Noo~s`yMƂ lD F{'W[o9cXpaB<^3(!ы/Bj9x.m0!AوpӍ>77w``a:::-\lYUUUuuu0JO?/Z?Rw|\vP>]aΝYYYmmm͛7߿?wyԩSWXo|cÆ IX 9=w Sqɒ% .t~1K7!Aوp3chh(Q}qF(j&Q5FfR1.?YZh@KQBKz["ЖH2vttƺ7d=rF{͠1ꫢ"(=zT5.^8-ǥP_9KT_eeeeggG5̙㦾;rzDU 6mZT֌3r\^ DUnnn^^^T55wܴ7d7!Aوp3&Q}U\\<~A{ci9)E/&#!毜%jkkբ{={Tիrw\ lD ڴiZe{cSSjܱcGZNWpX^^^RR3?蠷W}'qfgg޽Ғw޴@rzD(Zn]0Ά樷*˗/طo_:`Xp䐍A9]<Ƃ 䐍A9]7Ե6g7{ +A"$p#L6-Ѻw?c 7{ +A"$p#777///osY 2ɐ$Q<;Ǐ7;vL]kn@V D2$IϩFmmzzz{QWvd !IxNw>76mڤ.-[T;쁬dH(Sp8\XXXSSco,///))wppp͚5q@V D2$qx{Ң5;;{ǖ{FVX~TNzm{{{բu I9|޾|ʊ}ٗ꿃.]:44i B֭ jhhhnnzg?"g-ZhĉΚ={vYϿ L֬. s=jޮ.ke^kI߯v~wcS[x{J e*[>UZ뮻,YWnja{{gUGjѤIN>=cW"??_%SNQ_9KTL>]-,CCCjZ!Q);n}477g3fIT8|[p@7P_֭kmm|O|3<駟ꫭEݫW ǎ׿n=DG߶m]wU\\|A7;D矿TO>Oٟ:Gո~zv\y\78q'xKW}u^z7tSK.Ds9MT1044tС^Z:::/ZO }+_ַ6kԢ{|Mj.袞>U$Q-sNTqp#GG?Rsrr֬YVQQZTe\|Ň>uT~^vc}_]+UvɓgV\n3|D-β&{l05~I&E,J*QSDa'{ZƙOgY{9Ko}eݸ|?ClrO?OFy ksU+D=Ŕ5E]ZGdΝ_uU ~~oo V+`aaS%.Ӵi%xٸ]lr?ydǏӟ>vZz7Fv6ݏjL߯~~wGАˣ-qg>'|ޓ+W;|sXRQ[E n߾=xСk׺9Њj?w Ɲ7zCY^gzJe˖=+HXxjO~/z?Gޥ|oS}TfT*,]vѢEJ UҨoc֬YQ4[DRUnjBHՓC3BIx 7X?G}4ꆔnko>U8]~&LU{կ~ev%%%ޘ3g׾{/HPeإ^*|3W^yeCCî]W_v:i|+_y׭5?~w̜9SXEEEjE7|}c?7UI+X<ȵ^k-UjjjRmmmVKyy~QuŪ_v>틄KF*2|.u/: ?O_\;> stream x tTսBL!%Qb@J)REKR@E ZZHie-""U!U,%( E2]qLN|?뮻sfw3/ X=A>V jyI`“_kVi#j}V,WL(X%xk|eo9 ;S )}xyΔ>Cw<<~g1~@i\J> ݑ<#_y}93ܗ>}93ܗ>Cwrg|1 c r+9}6RY #_Qc ZJ}E-W`J}&kAM+0|%}&hA)+0|%G}&k3A EZ|%G>A !+-Ǭ."+0|%%}&h!W`J L@24}PϤ,$Pd۞R}&e6`IYܷ%eLʂI+0Oٹo3@)>mC> - hgRhkM>W`vs_S7׎}&e" C빯I6ZMIY6s_q63) l6e>W`-羂g#b|u}v,<{}u8ϞYKUNeKh9sZ"d5.;%nBK( `s_\ iwGcܗ#̃յ(dit3@W[؏Y]#gBx"_y}93`ܗ>#(Z(bAtdx5Dٷ\s_te$.ܗ>C?b?o"_Z/}%'B+G) @rg؃#U0h/}(?BW:vrg، $`c)qC/}|bI!b rb^1`}93 ԛ,O8W$NQ*cA4jP s_ 8~Xrm,ܗ>Cw~`P>GMZ rgNw @u}93`cD,^rgވX<1π 'cUXܘrg|e /}W&\dB b`AG!bܗ>^wrgWE/}W~ _ܗ>Cw+gbA"bܗ>NF/}0D/}W#_ܗ>Cw䫠 bܗ>0'pߺu!CƎg 03OD,<7mk||;wybqq)SMޗ {sܯر]w8p={\.'8pKDWp_ 7e˖z.Λ7O,_򡪪|G!_ 1ѣGǾo>ża111ʕ+ccco>`ҥ?7.)):ٳG&}P/"Ey;#++kiii;v611155ʽX\\dɒt#Θ1#'':9ϰ_Icܬ獓Qa'A> _㕩j; Xw}yy{\y^jWyTex@u*[nܹs:oUr yꛩjE?yrT<3uSagggq ۚvBjSRv1qVqqq+  WVjS s_ ݑ/}WEܗ> /ֈX@0tGcA;_" 0/R@Aee+,Uee=/]UZZ:k֬>Hf;,L5^eɜ;vHJJذa_O6l?l8%;NIYP̹߫W=z|w%%%k׮7n޽{_~iai$z'R"s7l۪7xcΝ+QL IEȜ)))۶mZ-Zdacj$tDʂdQFy; 4V%W J E""bB2~UUU^?a tGĘPDĂ%d=z̞=T+G.b2ڲeɓ[nݧOs9rDڽ[|y|)09wY2+++7l0a„-Zr-?q2d%? oRQQjժc&$$XX*W 2)2KKK.!37lirg|`;Qdcc|9dݵ{祕a ( dI&NZj2~YYY^>zWa t+  !%yԸ~aeGW#rg|!_!tկU^^xuڵ˒`V]Ooݺʕ+=W\.W~~k5I ,،ssqƝ9sG]t9/%Z//йs6mڈ®ʵkz(--ͪ`za?(8 333/ ~dmm~S@dD,ԗsVZe{|X|`s ~ㅬGyd /^ȂI 뮻… ++WlݺLҷr"ܿnjzjE YVU }+T YMoґ^}crg|Ԉ0̙c燴Q@ W@mXN߻w:6lzBA>B7 Q s_STT Gu"_ s?>.OV0O*N:WUUy.z&~?OniAB@  n*3fT_YfKpp8P'6b9j}wk,l޽/'$T3` e羲fP.*<-?6{8XPa fX7_ }9!B@ 6b9 sSN.szaN UW@}LE?*c0L|>8Fjo@4*޽{?|gHYN*//7sC]LgHYΡ5Njv .X]NHg *-[L;hy<>~iiQFEGG:}d"h)K_\\tҴFY]3@S-5 .OzNWG!e)Bl2K9||he >n8|U }ACIJ s_eH p^Ȳ sn裏{+WN>muQABDĒO?o<㋊?55.ؼym^R,Ԝ{>}zͯs:ufK~YYYNN-Ҹq1c|gr3W=Py4~n(?g `D, Ԝovn{7ʬ.OjLDPSaڵuaaYڴiNV Xj T3 s_*)S*""{׿euuBp#b se˖ 7U\\ܴi +T3_C mΞ=̙3VW|* %U0E ۷_xqEEյ }A슈 *޽{;w*BK>P#"VЩ0WXau !B {/}ON%~PaO6͏^Ig CeB%Qaggg˥BU-P p ꘲T#GwޭBU-P p&٦ƻ.b0E M4I4-!!!""BӫZCwhKܗ>Cw+Y{+"s_ ݑ +eee-;-ZtiԨQޅ .-PJ3 D,uۯ?go.0 2rNQ'|eM6Ť'Ǐ,**ںu̙3OwiuSNYJBQ$b0].׍7(BԚ5kj<]tٳ8RrmB@ |sGjP`oذAQ[2Ʈ[NZUB@hDfĪ1:0z1cy̙3'N(PP@ W4"a>U?O>:믻v*PP8G(7:-Z(++JqzBA>(AX&_sС#BZIg&[=EHըg )?~:M\*͛yٳg$ * r5 ~lI {*(T &$$$NQF*T}+|_U߿3?XQQ1|p }d~* sܹ&?~H+  y_4d!eA;_>U/ܗ>Cw+!æU۶m[rŋ_z饪*c0;;Cڵ7nܑ#G3* Sa^h֬٬Y Ǐw m۶-o*ȡ5owTUU__ve_ۗ:a }r0E 6l\Y`ʕ+݋'O1LvqAB*8VDQ?ud׮]4*<~llliiZ#G4c>}ȶmJ.8T3ݻ>Z^^^TT4qDyye_vmxxxTTTddWi0=zSN*T}+_|yn""".'xEiٲ,,2VKz'|ںukaaI>`aA;_y}93tG.Oz|2].ܼys .}S[7p??y?ߪU0Oߺu!CƎgϞ7`Ũg\jݻw?F0a d6m$N5ܹ3(gO2%<<<11d=j0W`Rsr_o|sQQqENEEEǎ.Ł;^"j#_9W`"s7ڵ|={W޲eĉyĢϪ"_QW` sg+dպuwN2~_yG'۷s1//O,fgg, s…+W?dqM=zT,7Xg7_UcVXaVtYqyr6nܘޭ[ ?X蘘Rqkڵ Y~j?x3:u4sCW^xxxfͼS>PZ߳Wp|Ss,\?(oŊ.\0/^l&Mx-Do>Xg(+0Or>ӑ#Gifڴi|I^̜ҠAJcǎۯ_`E<-&MԨQ#fee#:乸m68u`E5h߿?99̑~Ƣ ƍu H|r3UTT$%%effz.<{+WVV.Zh:˓g0y Јg|Ʒ+Wݾ}K޸q㒒g={Vo+0swqGVVѣvSmbbbjjjUU.^p%Ktƌ999^W%}C<#_y}93ܗ>}93ܗ c3>Cw+0/}W`s_ s08s_ s0<#_y}93tGrp1Gp`A;_y}93tGrg|18s_ s08s_.8ݱ |g|1 cAp`Apcܗ>Cw+0/}W`s_ s08s_ s0;_o||#_y}93tGrg/}9rg/}1 cA;ܗ>}93ܗ>}93t+0/}W`s_>P#_oa?fu9@p`Apcܗ>Cw+0/}W`s_ s08s_ s0<#_y}93tGrg/}9rg/}1 cZG8s_ s08s_ ݱ cA;ܗ>Cw+0/}9rg/}9rgW`s_ ݑ<#_y}93ܗ>}93ܗ>Cwrg|1 cAp`Apcܗ>Cw+0/}W`s_ s0`u- ~r>}93t+0/}W`s_ ݑ<`Ap`A;_y}93tGrg0L93tsw9 ;S )j}V,,)G X'֬FZ=>(X%xk|eoYz|PTK"_2Tj`Ddɯ5򕽅':zmmݺuȐ!cǎHOO߳gON/((xן{U'Àr-\[n GϷ(u|e˖ 4Сo .X]iӦ\˗ܹ̹G{" SL OLL@I&jJ5555***,,/'bi)))3g\dO?ݴiSG.hcǎwu{)->y/BY#trg/Wp5kֈ_ϟ7=x`Ν ƌcma0cɞolذAkҤ%Aw˖-Ϣw}sq޼ybV꫘]nUUU+8JFF?๲n:񿂶mZULpƍ=W\.pV=z o>ż<]YإKq̖-[B_#D4RZZ*WЮ];KA ?.=3V%''gQyyѣGb߾}k;+''Gгg]p'N+}UUU?^s CtttLLb:t8 ---33K.7馛> p -/rC 믭.Ϣf͚y-g7o^Y[ߊ'Xiذ!g 7`{*Pׯ*22R޶mEAWqqqDx}e+;#NBT'C-_<%%Ν;JKlV] 4LJ±c_~%•׫^gΜY|*((ӧϑ#G.[f%ָqc SСC۶mSNȪ*E"""BU(tC3:u;ܹsFK?ONR\K1\A6mcbb>s[񤊍ݾ}KoC'Mwދ'OkN>-xI+^~'NH/)...1cFNNlj"ez)/'Nc.<G۷o_?~\|]^^.r83b7ꪫ:d|{ .x4m+7|S|;vE榥1yw@5FΝ 7\rur&"8,%%vƍ^qK!k+y/ۘ'O++;v:eժUb`%2"ݻ_K߭|:k333ƍ3w@5^yFĕ3_]4ܽ/-?={V0tPΝ;u;WuK[ke"GyޯgagL0ȑ#"KYHaީRj /믿.v"5mk{1s+$Z&M7n| /g\fMN1 _R}ϝ;7[jԠA wv;Ub6E%bE72}tq3Zj\,;6lp//^Tc|Xӧ}voܱ￿UV?۱c p—^zH\^!o߾b133wynj3 k)6i7h|T+یJfee@"҈nn=x-ɰ)""""..Nڗ_~y w.Fv|W "]{"}gϞѣnj3lRYYY߿ʔ)Fm=ܞKD?~aȓ'O>-Z+99W^ʊ#F̜9d?^{mذa4("޽{/fϞ}7?w`k <ظx)))be׮]!!55՝$(:`C·~{뭷?>5BJZW3$'77)DDDx^=tvܩlUˍOiذaAA-[DEE;222unq#(^WSLL;'DDD|VW_gϞ>|W_=eXz endstream endobj 35 0 obj 11715 endobj 37 0 obj <> stream xZۊ-}gCƪL`_cNyJRIս! LTU.?fa _U>o]?|xOMmؾ^mIx'$=ŠL?__\} -Gڟݍ7Dz!)/<>~JRT`a6]vj Ӣz wi"[~Mt7BFl; 1<#2ΰrI_"U">t%LCu bp !둩ZnCgYewv"c,:_KkuS܎N8^c4'P -zbg5`Z&'XZ(dٙ9N5Y_3NvT Wf\qME?-B&3m}6>6Fkۗu;bˬ4=4;,;ф D=xGLB5GIs GssȵZMt~= ӱټWJ:NSJ椽,[lS䢺42d*_\40\N]g ۹˱:ɩnD8PH*c?7.Z=o .p+ uب]ϛ (J*ب 2cXT"ul(Cejć$KLԧI sjL<Н*v$nKS|72zI%ZVsUQ)$-J 7j\LUe~nU{dr}Jw > stream x t[Ls1PIx!ZֲlFeƤ!.)v9+뮗Y-fqq)f e M`M]Z$b2ːϟϙ[&3<~?'s.%E,"%™#N3>a~Rr;L}pvf9̓NSa RGOžWqٙ2O:N5JI?AN_ŝ ggv \.?8(`*TN3gƍ F0 ]3gwLBeD{{{iii .r8]]][y{g}Qe; a<\6*{R8κܠvܙj=lllٷow^rs4$Ide?~x_|q߾}W6?} ^\\g^{m6o04:}ns$-o/9f̘-CAWRs$->裵k׺nMZ– +@)9G˖^XXxW?NؓjA (ڵ:uu]O {v_`T۷/_|7pڵk?$~꠿$ɭ.k֭&MJ2N[#eS ${ ɤH"% ; a<\6*4$Oe(H[#eKpe?rHcǎ%rBx$lUvi.Iy)X khhhÆ o￟%ɦ`@SNmnnx<ۿ[W`epٲe}ߦ+")KM()X/iӦɟɶm|7'kUR)Pe; a<\6+驮Ⱥ_ 6%wm(P$a9G˦`e6Q[n*,,lmmJ\#eSvmޟ{zzXodw}eeeI\< FDM~嗟={wyԩ3:`e㎷zwFVVstd3׮]+u%qv0I. }ܹ#Ns\zk_W`D*TvqM4)74V;ZWVw#0#0HE_j-޿nT3gSoo8TBl~> ]}v@˦Be9s#G<`N:38΍7:kD044t QajJ#oqy"eSԿ$r@HrT)8bje0⅖$ PΝ{̙ ;GB($],DyT555>gڵ*D!:x%~$6?*Tv/Dm۶g&{9I(RVZE)"2 Mj׮]^(3y~;waTw.I؁7c負,~˦Be޾}sssŪNttt}oFjrCKv.33jƎWWnW*D"ķo#R_x%%%Vg9r$J!nQ De)$M8}'x>KM(DKv@Ga7貔B˦Bek(((ذaJZC(DKv@.n1aHrTsϓdR! 0RZcP )KH2 i.P ]DFI;'h6[aqY*Be+---+I!nsx0Le䲩PkkkGQaѹpIspWO9hw$l*T%K߯EsᒄwZK֋$M.֐I&;VNjIfMFM~?RCT)JƤs-PoF|^5=* DAij:?* 4a9,]QI|&w'_F`E; ϡ[0_%<~A sjT Q;Km~WXmXЎ(6 ^ 2wl ,و"A bz+,̦PExo CeWQ,L?!A?"X#yjȧLeWFQs)S-C5`~#7yS+AGoTvi.I@3/ZQyuec…UUU+^{E~ϨQ̻$@9G s0=D]߼'O;voF1/}__8`˗'o/*Tv۷X_.477{O<f֚ QBesG抅{~3.-ATBe; a<\6*{ffh,Yb}~3O% Q$88+zRdyit\#eS?\pYM:O:emRay `&T/UuuА&69MlBxvp8u֝9sWdy4 *ÇgΜrʣG>yyyӈ&]SN?s挵sܸqAwIDTvfΜ)*w}W< Qe; a<\6*{"ѱpʪ*P<=c>s4$}ɒ%OOnqy( \#eӨk7W\!ڪon3gN% ; a<\6*.R|dff>3AwItT7LBe4֎ VVVVUU9Gxo~1jiiؽ{933;W^yoooؔr0L7?ص-Z|޽[C_@ ,pAӹqFÑrN}}}CC߷Z aS:o~͝;wܸq)L6蜙3g^tEiiib,kT9|P'?k??}衇PV#>8}M앛+@Dѷʽe{?~egg{<3gX]#Gw9|4~Q=N.rrrD룿 /T3i$ɯﲸnILՈjx¼aj7 ظqcKKWZ5gΜo&L뮻M /pٯߡ7o}[kM+V 'Nl} eppp۶m{oqqZz x> o-"Vr78G1+XO8[ouܸq/B.^_evms.R1gʔ)<P_3v:t5׼H{{}g}j>*vĦNç~*~}b_|Qo$={okN<ˑ#G~󟋇ׯomm-//#=K.Ò1G4{ 6~VSSW%N:X?L6My7#|:%FRSS}qN\uU/wh Ĵb;-6 ~#~Ɉ2<<,fddk5M81%ė ,;a1syO-W)-/ҋ/軒e˖|EX¼3}vC6lN>~Zʹ=GyyIIɊ+L2gz{Z  ?q5 տ/YOOR,DK=O~Jm֗J.XfܹZ ҈Wcԩ~4C x_R"zBIO!(% %~8[nZO> );Sdk]wގOD4k֬cfeewgF~~~3g6 D'o}ꫯߵkr:kmW:G,1kɓ'ɓ'g-/^re/`g?[ݠh)?Ck'뭭֭['[[[2E ?||`oG4/H7"`Rdk]&kmm|q.cǎwyۧKehhWiƏȑd/ٵkWZZ QCDN__>aرoFWvm\rI]]$%J endstream endobj 40 0 obj 13543 endobj 42 0 obj <> stream xZK$ ϯswD=T?|3@@Aƀ})QJK`x1jD/h1s)BLIo!^)Ys?>`8}snn ,jOǿK}pُ<̚'oX.^qB:Z9rq%.h"7x&̘c@k7@YekEZ*:ob*.X_%>.[A̿4Vdfy;0)2Ŀ\w˿;sI{Vht¢/  {?kE˧ZXICy(2Kf: p(9a5-V>BÙdډ}زm7\ӗYW쪺}0`."֜-pp~_`N*CGol@_O$P;M 6[bt5l(܈B) ݺw:cuvhobj{EG&U3KQXdt.*4lٝ`$SgXxF~Q$WYͲ']p}O4밤1ƧBC π,$a4"KxsC- "ߠDTE m\ (g7&|bt<NZX6z9QY=YE&C欐-#td!&mz\ɪ2v4!Gr:ddR걐m<)*O?>48VIJV(bm`G^HA$}qj ;I?eP&w)ͽ򢔖bnGA m )f}J ӇK$xxHع L7߸ٝ}JW:_Ml'8ab0FM)ke^eUMr9,:ʱ{f4xח;rׇ }|{ d-y1\=gRNssR5R@2r.Po0-lSԊ&{7N1,Gj"ZᄝaVL_[HBUXnrVc=rJ/)dI}0e_ [zX^4)1G.}Bq jhzjvu; {;20""}fI[X6poz``^JHB-,lhBV^@%܆/9VKzA[3UM%mU8Ȗ()n6S]jAqnDm>=+(Ħ}GeJb;Tl'gx C &5U%x۩iE&zqz9֢XQ^{\{TexSo\\R.pBy6#wV9q;]詺Sjnz 8zE#4"y8_MM+OW,b3$μ#C!79i=M>C|нW'!(źvN)%c?>K0 cKPz;nXjR_ìKmfs%-Rz2ڊZF5 Bg.rZ=2g*}_ZSk\AjlOڮ''aIb%*^ kQmu/jE+ id*Hj^xb܌\+yVz2[IB^ހ endstream endobj 43 0 obj 2911 endobj 45 0 obj <> stream xVjA }Ws[I#iv ]{Ph^\NO`vΑ<~;pa@Hb~|p1}Cat.Ogwy8O<,  0"ѣ!x &q)8plVBn!AUVUl`s}+{]xD% u,^yuO^+Jca]| |Ps>q#+k M3X Nv\Θ\c"jMUMxz l 6m{3uW4r0].,,qouwWk>a endstream endobj 46 0 obj 712 endobj 48 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0"d:yf:BP|AzjkqۿsTw> endobj 51 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 52 0 obj <> endobj 53 0 obj <> stream xռ |ս8~Μ}̾fɆ$7 K@BLc7dڐl "E@@D)Eʥ->-mתbVoUz)k1~sf6|?/9s|ߏ3DzBȌ6"V-݂z !h\/0 gwSv{(ٶGErs>!-b:4C:=vgT"wrsGh>w{lD;C%2;#՝;Bh6\;BЇfh5GxA7EbIvx} Դ̬9s*(hig̜5{NdҲrQ7 *BԂV ?FX @00: p 0 vy׹^đ*hU 2zBϠ#-j6s59ohZ(-v|V}-[:t>8W:҄>B@&ŎRFJǭ5zwl> u#h.G'Az5ktfӯGpw)QZOjB%@mXS:'F~Y2*ݐtMEr}YZ5,qֺ!ltE=۵wwwʗ,,*q;^NK+'3}??5|⤂v(dZ|j}g--̦.oDtK /!$3װәrWڎ۝u~+/ɩφL/Փ-]I.Ŕ*>t b;p8?.DrNh6.,?mcK{ljCʡY[ `MI7=?>v~nW-ה?w_lx;;]3b|LP R$N#к@rd":[oO:{tAo^~I*O;e$\;]7ZZHmH8G$KX n$zE$Yv 8d~EPz&%bohJ B>gšCqO3nA/z!Siȋ3@^hOqPZ1wT[}5q{9r ]W+m΀xC`9 `4XsgK6jx܋<6@M|nuK"\iaNY=z!W%Igӧo] 7{ ) 4p<< 4Mcz >ϓiȶe{ي=m l<^S8ި&,XtVd NKq4;-du\qngq8єiͶMr9I.;ۓ0<2Z,9sʍRK̹ܸL\f޶ԾԱll27YVYCUR })eo>][@ː ?ڪ.?Yk71гlN$-KOm6%%slٴdSx:(}2.G6S 6Cƞ sgtlGw7?:>V~O>bUmQ e_UOק7kզ[kuD;[Ӟ`VFdJS5}%*/|Ћܯ[[JiQux2 zqRoI`9>a5aCl6I6t. aAgs^dHl>y,F&~Dmٕf7e&WYJJU&4g*+U* Zmn)[9,k-SZk%BDW/qLנ^GϸּgHkk|kLl]R^L݇xg_k,QWނD/NpX rNl~ge:鲐OR+Mp68Kސ<nxAFҶ_fl3ǠAhD[\>hSI?O!)cO4:P1Б)PG6&$'fvԛwi;O6N' ,TOL\TFwt 43\)wC@._ecMc /:>qZnV,<7t|;Gp]3Ӫ̔s%2 3Ah@#䝍gaܸ%î{~^즌GE3HH&AA'NXDt<w##0YVsq4XSA"՟&d՟F8Ϙ'T&6DDz1)BQF!.ʯq۝o_sg%9- ]fAQ. aKe1{:UÔy5T|~A J9`@U@xìx jX XN9lU~gV6sY=s~~5g~^wB9Ԏ|y#wQ|?'zX B:)j B:3E :9ΉIȫ3&E')42EZ9`影kl7eD`nlp7d:HBx`6-%&mIfH2Jy( bQ^M CRmypۖ)_F}j>xVl-Z*uHMOW.~' q]{g/]LZ&G ((tdy6Gx@92d}}vMUhLIU:'m$ϵ.&&Qtm6g[iN7M7O['ONK+Lט+, +䊔rrrryycfj3ZZ䶔p:qiy$OR֥M=8i`G=w|>~ DxP³=~s[/6}'_yǔ?*ZwyGޱ-:uFɋ?>ɓqSg= T?+&l qwXA'y8ǴZ4mڢ M+^x"-~u͠;A'Zi' u!Ga}F4I+]qD9-n"Diޟ2 \=cDNq9/,,9g?GJg_ܳC̼PRo7ংHhyPG'yqoow}DH3㇇+Ⱥ[*̱ `dYOo,i6-)ҹp 2{xHufd7O,sxm(KbQ͇|ߐ0p8T2˳mOW/|7 jy-ϵD^y+nދw?~c^ĭIP3yCɶ( eHV7IN2&e(M.9I꓏Xu;,&\(wq1'1>=oGxUDN{⩁ {Y:=I#oO=ݻɦ]ܾm-lAHB x vvYXn8ͶYYf:t 4#f]NUx#@RG;mfb跋 nfFfotx'@ޠ]ݚĕ},31R!S;IyGՍ(:UXG[P7mV-:/t >|$oYܶx;a"?' DK5 L{v|/+9d +rn9Y-[ؖz/-Mh-\ Yo65gSZt3ܬZG]kk<==;VvvVVff;ݑp α&U\;};m{'ީw7p[qakҫLmi{7> %!n==-z ҭh'U84H}=q&uS:K⋿+/wp#wZ !e섀YadBvMn:CO߼_|Ђo_wkKCWP\B\lh] (HD`$ MgM7(]I١4ܱ2s@@$H$$iX-4e2T̔g +YN0RƛO)uJũ9\K/k5z`0& T!ǘ#X|io̺ 5[k^Z۠LK?/)}vdۃ*=[ V2wƯ.~т'#pYhw!y>.@c;l&2$¡uss055IX,j[du=Yg+o~t``̻cm][[gO6{*.^EZԃPM`R%H-~o]#~S(gIg1N̷ i~{90ǿRhmc \z(F:$,(8{tE-3+97.»_^R )G*mn׍&/}3;+8 {?@dpAhAQ4.¢u[A_0 -f2p♙Pd*@ȘmgUxJ6J.}:R^98L8΄}xp)4q>@ScH{US>rw>×ogCbW 7u\(g᯳S#pJ(y#OxqS6']F,xdDY3)W'gf93$!G88wm<]0 -oCq$6lpR]~z!dHRL4mK[b o.H0F+ɘM=lv^:bGlO,ROǴ] lv,2ck/YSYhb~hӓO;E}/y?^mرjciǗ-w7 {TEi\bVW=nmú}3{ $B_w!407`FtrHM.yMPXNddHF~+}8­ϿX >|{K/ܭQzw l6@8gmq>MAho*CӹZ~L'X4tc 3ًe*|bJQߵ*ս} 4Ձ \n)ĜN'8 6%!> zEE85$]H܁$ B8Gg!KӀHMXLIe0Q72OrV##,K )rt9׏8^?}!.{ _ha|ɝzMhj%"E8#NGv=IRuS|A~oY:--,:IA/~| 7epLhV ެXDzAa5Syލ^TJ4)iVg@٦*P{j|>TA)p,PFrPB}pZ8p^bLA.$D "CPJ&UsFCVg.t-9;8tvճ5*a>n׏!K_Q[3)f#%e dI\KzEh03>d,9Cg~aq8Tlc.̱̱α͑ʍ7XPF0X0Xk&;p`G)l!x_lǓ8rClݝpn h] j}8Գ)I2ZR>CDC*(p 4 H5#]ȆBn}i.S(e|{H0،>/158nVh18)g٦u.XJ@bti 6"˖)ͿW?V(nmtKz: :Qg`Dߎm$=H;}1ޘwKt.ٸcO_@mʎd%DMU|bw{[} k3_|lWJP+&>;juK<@:!lsyC6 !?tKDãZDo_ J,ߣzd' IrrJrjUZ{@2؁G*3yN熱M9Ziœɻ뮽?ەCZ:)PSAP!-M $:6؂s%m,3X:?*^\J$Sij"OuRQCsW.s Ry|Ǯ3ϟ{>4O< (?zS؁x|x:X`lhdJ 1ݞ挸AEl:}|ZV^ $[uB<*'2L:Y$U_Nʣz91.Ge8N^:1œC VqwRA op?{{w7T+e-;>Β;u;+v LF= ƍ@mf0 a0pD$h1;E/헔m~5,H5ΆBm0<ׯoGFN$q, [*\ 3}t<7aȁmqTsW in.%M'pҡ^Pފ_{Qu qĹQ eBbh}<%Cb>b+غj|;n||r7'?/g6Byc톰n6qFOZIgVkʼn8 4!  ~ݼE٢-[*z~n`~hyti{[n lMDf:c/nd*_ķlŁt96뱿P5 io'|l3 wu/[Q7v)W"B0;J؟]Ӽrud 5/&n]Ázh]ï|柃q; ;(tf50.g|uQz 7Sœd|v K>W莣whCh5B[Ga|~~"Fu-h9%8듨%EkݪKF:ܯBZx^&~SsHB@6 / GVwj=9μR3&>j؛wڏ;|59stw>)TwK/ͤ7MC+›~ 4"opY12jmڃZ $Nk/hmz0XS& M36AɦRF- Gkd#ijb:)W6A^CZ[~-Z[3 |6F, |0im9K,M6D Mk"M^yj6ä+ 4` 7DC q ƶ Ť7mDߥtxJ_n1|c5"]rwÀFKSl'etTc[9 T M=]`M F_ih 5Fi6PIJPc#ttOZUYbZQHЭRtjzOnB PqtF:@/HWkɖ}zX(WEj> = 7շEA@AF:j_]WO[}[(`hjl7n:#O+TV6@y1\F!m}rxI]!WMIe3]H%7SGl1!RMel,l!D(k"Bk`5r}g'X}C[PW>*7wPxr{:©JJI;F- ^n%6~b[ jkH-(W5k/.+jK+JJԒNW.XV%rIrڊR\F^\-W,ZXQ}.)/υyk*jhb6UUQVC-*.KV,]+j+)rZ"WTV[ZZR] `ʊjXlQ-Z^]1A&B_.)-[TR}bHِ\`eK% s+jkjJѱ;+/jmngsg(iTP}0\^6ʩǧS2/Z_HXmP-떭ރ4 5P@1+2H1X 7WAhnA`#KzCp\x m1׆@veԎ~@),׆5 `:NбQrgH{tQ+C=d:>#ԆJlu sB=4j -c\j eÇaA5Bw̓.FP3"MD((Bh5ͅ1Q .Bu\h68dT=]9k;#ET F[PV2)|tw'ia'[] FMioMKYv`{zo4G5PD(6~ υq8wU!6џ 0B0| ?br=UA0J^_*5ꕈ&ot9qQf뙌W[/GPʪvmTT^Hk[iXibwC#V0 ;NM"5I8̴BQt fa1^aT#ӐN z jR5 N%Lrtn^0^OFv%6M'8llAs(OhO'|G`(6AFAZ܍5yfKY@3ƙv7qZbx#ngz~aЙ k\/o:9^u2~S+ĬИ웮ggʉcq%cjdka :kY1<è Q|tf lecc}y2^TÈߎ Փ<#,Țy3,nkԷͥ<Y_ṛQܣS{TL)Ocd>Vb񋮢Գy1 S*1X(5Z_ZϴGW4iX=a혌_J|~Mml^[zB qpc=#+HHwqeTԯ#t_9E1ڦ+L\{4{Ib  Bh-sfѝpQyȌWqvif^fn Өon5_Uy j{b,fm#9H6cU+4ު0UWubc4R^i:Ux7 B(T(Ѿ٨+5be_ب&.3]adD#o̎bߡŠ=^Lj֌pU}WĵFVDG=6{J1vl&zllF{UƬњglu+V%9h>T߭Fc \{$+QGd$3ewGcZ cnJY6JXj~YϲZp"ԕb'*2J_6_Qw]QU#hGbj00's5](Vr@jBGMGW桔`$5#{]~@_w򲓼4.$/t3 y, y!^IN'ϙȳ&.򴋜( ?US yR!?Q1<10_xO*1J0qﱒ={dw pogEI9#nQe!N`ݧg]Z;۞+d۝+mϒm;fw$w e]ؒD|:pl'`MA|rܶj"AaB6I†xrzpKYo%7 7;:CdHzB%gF&=H&EHB"VHtz>[h%I[YhHFLZ| ,r i^Rh~4oW5eVU)`P I4(^!u7 u )ܨ εdBe ^!K%KR$.r]Zl֓6RYK5ARj*d>NR e(œyN̛+ dnI+Q(1(k9{l~0{5%̺̜! 3]df!aJR<.;4;j!SRtK(RՅNj),B')(@UF'䗒\GNI&Ơ0yOr k$ bL 9zNdOKD@lb>ɂSB2 K9$-H'$r]|OŒ$y#$F&HB: PIBW!].J\NrWw:9%v`]!+ܳ*,q 1)00F\OAbD'DyB?PN$ 8i?%"Sa endstream endobj 54 0 obj 15814 endobj 55 0 obj <> endobj 56 0 obj <> stream x]͎0=Or50#E2Dʢ?j@I@,R`_ɶݡ440opSSt}$mfW\1ɖmCV$<#}ڴ)|JSO?x_9͓:myא٬C<2߀RkGJ36MU~NB9tn~2-CK˥CV g#+A.-K\G~WWfE0!q~c"sLgFM3c]Gu]9ߑ/QE?r+WCC_+Guя:Bb_)e QbKdK˱Kc_B ա__H~>-/0(*jjà{8~=*6{x~oko-4G_QG?/GOG<x=KlLɼO rܧi9eF̲ooYq endstream endobj 57 0 obj <> endobj 58 0 obj <> stream xz xT9;L l$ $@2B :$HTAMQ -PAPTjUk-պ@mmk]9d)\2ݷ;! J(G5,^[B?G'5_(!>mu]"չ ãzd.hF#4:,Ln3-B)9Xh=s4ڨh]Ll\$88yДaG%gd3q9y'L4pigD`#uz *dGf?v~\([<^8p4)?~ BF:6QF`6bGM-b]x[cNvPߧ㱸,#-xhფV7!; ,v~U}En7qD3A~9*?%ghpb5n;)5#2AB5mC F QeVZn] z{jNG1A+vڮbwoo~p{0dFu͏r..M*U2/>2M9O-r'" OLMLMLmu?vr64ci0~yvaD(@^JojahEoO̲`9}Y{u|f !?{RN8sH+|4Ƀmcږ-vҕsfV`ߓ}oΜuKl`ǯfnHҥރL-Z( Bipw?}ry-Y'#h>ȍ8vd؈n)θ|]Xysυ_vޏ-v^jn"B`$ƒZ/^4ewL2[]]ΫUk_χ!#M+7u!;k ?ȯ5rƮ+x F{=]ܺ휟pȣGGٞv;+VH^/B_!!n8c_jC#>jsu`rjE+ Ih jɓ&fQfQ %$m$N޺qa۶x/-0AK [3ߓjY~G[m*_Xj}3BAfe"8/N9b6]8h>{_r&T (jY6NF*&lIo6b=MMOՠ ?eRl~ı\-G._TlB `lY\(8H/7ܗq`88Y\+&n\q w.>fw&(RGrZ6tOz\dHQ#1qKܰʈ؆O*.NXo'H~̢ `_С}jGZҌS {ήY}U5 =nifKicvjZq(xlGH ɋPȧCA5TrpVfgA~rݠ4O7'+ *UF3ֵmz*)2TsY& Ӷv&P P3*dE%c}dQ+O&w1ȧDSCV2o/̐_xI 0d;^ykK/`EG-o%tXS" ʹ7ܐy؀[.X;eR24n;e@ios\[djCRs7(~ᧀ_iOL!n923krc GdRq##@Ɠ_mj4F)m~HDSzc4hBC=7VpMF s2%.YEnqs/-8O0*ʍ_{V uJwR/(2o=*`(dPI@{S[lplTCɩo{Sq15:m,w[>ǣy=xךJAPwVIO24qt\Kɚ0x=1M1mX_/9v^ EsߓpǓQs'd//Ns G*%'<›P;x,Div4x9miCX2+Qmb76&(]CE&-+ȖЯca1w L/Z8;&fqTڏV3eqiNU' g+sMB=GZ"'xkr\(c}'p GjPɅIPɧ7=-byKǏY% -z?A֝CW1G\yz eN{7B,b'Fy:6^ $$}X/$_TȽ]Ə3 ':&Ny+z񱫦鏶ek;޳x]i+ۗhlpA ړ3*~8RoKĆϺ^j?eH3ZK3*N =tz0j1OR{bhOa3o7PccXMg>=|J-vi#= O I|e*IGYcǙ.uC~ Г I鬩b=(L6v?hg?e|!7=r\h2A:a(,YKj<3pz޴s6mc-8B7t%σs pI2v&\kw,ǧ.|&ZTg?;Vx/‡?*w?ybPoڅhiGǧo=!GÅ U:%ムrɣOO߶N&[#ZjCgzl~VLy:ٖ;7޷N%`Y O=̐Z|]|a#'5Nx 􈦙!NNR!$ {0׳mYu'-eSę5/r}]:> 2wWjoGJ˿eO !\89CɊHPC^虣zgf/>8sy9=h=}̖Qg俶Ymv 7slX3pO\z/}Kx/4  顢TC#T,RaC/3y{w4_VN9QclӫL1'ktE!< 0j8צhϏ=+擛2}y﬇w Zc L H!mP? ,rIiw^NX`҈])n F};q\o2c'ݱpP*[}7(4!K힮w= wsr#S~p[3?qGg䆌 _iϽ^T)a.5(TAja(MvH{|jg 򾮔a=v}tlӏxB~~=js=W;sݛ$ yqo*}va)hPf fHBq[768j#=[gFp/_aWqޟ^CP f#}ԘdVzRXh tx/񌢢/_GէlALSMAj|+[gZc;mjO?45Sm,o4oU|I8=8RIm/-/ǖ|By zȋZK1Tyxv.M!ۨ qD VcEL3X$8O\ Y֊ԅdըFٍ\k Kq=u#_njcu)8}==Ek#{pYe׮-u!o^=_fK%MRK3I\j?`rA䜀*j{'BSfLuv\9q) ^9i2hq:w|{u)EE-!‹%"(X:3w.+ߜ6tN3iGٗR.YknxNJ_;LCSջ¤/xJ4Vuy//<ʯޗ]~?{$lē%*A9ow =Fv1TKf/_h޽w>&yA~Ý윟= 6+i`G}X4 o1\!W\=S߽z jpwnA3D ~~BEQ2%3J3ZmrQ0 UpBr7QS8.T ~O Ws ,ԤDĵvXcSh>? %|;-GMh>l/[~#KA3 -+ VM7*8;w~(۬Ifx34vh j~2BȨwXf<.~g-5>Bvtq.J~׹\n [2,"wnrɿJ[Pin4ik^js9ըiQMQOF*Z^5T MULa6$"|uED  OX=E&P}*| [5*L'T8p\O*&֨pVD՝P`;E.0e&(QQ (>&V5(6&E()f413E~L UQ1M* *,A1%BiGT8MKũp[k[@+#䷵6?=D# DDH@NJYYQυd"E[P|/8 ~jLPHwJ¹Fy64il*5g$&J5~J‚I549%8,~(EU iJ<8if3QGYD' /!Dai ݞp+(Z lBUŲ:XY/̯4MbZq=Y lkVS[@ ($:m\ >Ϙ$67[.UufP ,Wt^[islPVzۼyj8I'^L56$K BVZ}@UL)Rq@0f5Xlfie%VVZT 6!VZq#r 䯅`JC F (m9ow+t64'fA AⒻ٧^X+A@;֧,k@$`S%*I9t+!zm F,Q%?P)mammVtHnC՗0FJNӺ&Huv&VX*EEP+jC$1{>W@M! ?,ȅa?bKDuaZ~$]3+ :d `42L`J_*nNе=ҩg\lը'úOo>óI:M@;sS.-bjUj= eUW~.y[H쬏Y-hHp,ZȊ!o~{tzFb@FZ ԗg4%)>/|zK'i`9d &+Y qHB}R6l ?C_?'zdcuGd|PhT͵YNh%ʆV3ݪRG+<ٝZ͌NJEրs"٢z)\CXC䖛z}E4eQ5g6YŲr9TѨ)+ԦGF]Q.@΅42IhOsϪgge]( >D^lU=E7FZ59PbKRԠjx|jd۫5:ؙO&X51Ʋ6)h)4ҾȞ\Z-`<@a1` f(Fxp9Ө¯N5ܡ, ǵTcHyT+b]Q(\LوR4KA*DW^ x̞LgEjC+'J^ )F9Tl!Ss٪"Ye QUmA??̹_obrFa^8~5C ۣV cExًJnbEoIZ(:Bʙ~ff*]v4~exEJkj[JLTEXH={+p51Ul_ %C}Z((V?K#ljջa_װ(UnchfXa+Ja!?6Y}CywjB+ĻM,T tewݿsGN}SiQk#' 3\U>+='rQ %+3}>ڭENV6+?<(LVݾ FU4 'RK (7 y5 e%dB t}̀b߀僐.>oNecdJׇBg}6Pr z_Qj9ڠ5Brq2SZ~V6) k'IzCtnn}чe=9RpJ/eȹY9+9E^XLtS1d 9A8O3|Sɳ29&29U.J29A~"ǓCcCr0($SOZd3^A&ٻJ'$O%{-#ddwydWH&xɮ"p|g<,$}oLܩ$;w ;dg7.*w<vđU/= 1"~@ۦ{ $'Sw1'lٜ(lItPoN$&+xq0l!VaL9uCɝ#m$ՓAdM'YHV*Y.Ip8 H◉O&˽qrx㈷tkv,t \;bKUbk;)dֺXh;I-BbZķd j%F$L-di.Y"2Y4, wvY d2$iIȭfPAjRCXIeZPI*I9I,9`JLz % B% (Z(!EѤڱIf9¬yd 0s.1]'0Et65IL(LM"SIa,I $L,  _'Ih!_GL&M$/( !y/#uBsBN'gq8Wb%cnj1 ؘ$ nY2=d 2$!ñ$^ħETqq_GQdz~,GȰ 2tROա$d N FA0:A b(zxI'I"7Q& pK(!@A$e←">V&1S4At VM DH4B  D9wcmx?Z@Wp endstream endobj 59 0 obj 10110 endobj 60 0 obj <> endobj 61 0 obj <> stream x]ˎ0E|˞E p"tRФ8i ,[3#"ѱ]U?*qX~nI{ws]1)LG]9Bq[0*~ӺNK}xI~ma|󧻺qIiޝCL}XsH]jt\PzwvdMčkUL9և"湭Fz [eKe1 u^k]Fރ7-Ycܓ\_ "PU_ h.Kͥ}_s֤Es_c/&(ӿĽ2K:O5t7C=[x[܅/ՙ{Kǽ-{~tg(p[(G܅_[ͥy۝>?vwCki3kOy 9 endstream endobj 62 0 obj <> endobj 63 0 obj <> stream x{ xTչ{=ǞW&_&BBc(*>vk~Bo]kzc]  ewe? 7ti/g>烽={>|Y@#B9@?w8ކcd><߳e<01p*bW5Z`4fw8S\Yn1ۓ3-w<Xf }h-U0s;Os7jc61{ݎnF?lw FN*`9mA{ops]&igv1`dW>nM0N`|ԅ*Q>Oa>3:@'L.} b4˻b8 D1X.>NUOA0G@}ZR\"sx-r\3Uځ!GvA(7K.<7+\tD7iJ} 21aRe-lrJAȎ^RfT( ܚ-⛭ٳ yx57W^mh|q9&?pYCxJjU[%5H`ƫ*gp]AjHu},^ KllKn%CW"8GPSOC`[|ː!3 *Gltk3--XK|{ʂ%u<˼yQ%輪RK t̬.-+e{9ɶ:p9 17f_K|[1؟x%s "ʎhϪՌpheʐe|pr"l?2^ӻ6nq=Ϭ-ud<{'B?-9@9, 0vX©x&B7U<~q|imi V0=ǣrS"(~߸mݺo_'tB%q1 3ͧI;#I)P3/II"*uLNРQ7UTAmaэӂq g_W. g/yA%̲euh9Rԫo̽;ӆj[m1斚޿|^|B!c?cn^M \u[vLUZ3|+nszhY9!Ŭ5bŘ5Xcf dh"NCbhS!pIiq¸u^ xZ͟@(kh \8eca#wUn89gc1ft>7!qp3P:S XּM՚MjZo`,MVmH Z9Ri.66%1aR#NJFSaـ5]z!MFaZ2W3.&.uZ=/W ̬f`6̧As!Jw mp3L4˒ cɓqy1rv.7ʄ2 i7jת*͕ۘ;;m7MVafa?q7-ݲqI׳;M,&#U=Rcrǽ9MT|Tk &Le,36s"Ehbgsrm ]~$kP0UI |P?pYPj0b5VdZѯřzͥ0)Ϻ 1ᙢ>[cdi2;S|vY&4oBΣKEb LPM?[=>^zި7Շ /+|]P!*U۪kշZVwؚiY][_kXk\kZ^+^YSSSӰӸӴSܙӳ3gvn~aqi/{g_Hϑ`,FLSF1rft3Y lu=[z#5{vǻ[iw|MtU7n&eվjWn=Ζ.W-a#]/>%FPT!h'nC iՌÌ\Qrp:QǸ<-yy瘓%E Y-` >/5qzlJ)c %LS)4"=,=$ #~poQ <*tЬ9wÙ-ӪʝL` pN(Ӗ5x,n c1<::>9=38CN&g;rzo|~*4.12Ŷȡ[k~29 󤷈Y,.9s6Zvp8Tjp!B7] _+gl ؂"s1An?tQzXC yΞ-&0=abL[OΏl2W \bhm oO0jG-9,aU#Liƽ \ ĄbTFUwv8DBp,gNjשj:3Q(yVTʦs?nydGK_,⫁GA| d긃.ٓ5*szsA,S@iq_xiR KJ4ZŧiJisՌ2q ͐b\ڷN^Y{2έNe_=t?t,i9\V4IKi {/~dD1_ˮ6:<;HdŖTe. jT[ED$^$YԹK&]_Bn7r3LŅ͢fxR>&RO`TlPMRw-U+{:&Fsg;?x7c˶{FʑkkW?dq>A;0VUPp+X]& _r$¡~rՅ𺺺ptˈ2}&RF yl$\rs44b\V'Cz^zYʬALuiR1qfP5\ ȷԼM0k5mZ&֙b6;ku yfYGU̎[ʹNeIAK3e\г-8O92~dӤ~tRC9'`v@R))w mFٮwhS2i4}m˴#3ŝ^^n[V+-EnnydԖR'[H*bf>t98Yz[y%}:q:M-ү>ClB3j_9DܴlAf3E74zr/uúL`Hcs̞iC+P½,[ y' *> 8-.er\ p$Jr%/yY$]";/G+qN38z̮;mh)`&6rĕn}Rͧ'nf8&=[{oUj1?oįc?{{H<C&x=_lmD7\z>BY r|Rzi0pħ-ѕK %F.b~,  &丆^&qr,Nl'6 {I^Dݣ8mrD`>}oM9"Gի:9B5ˎߴloI:I=h0FMakB[@z'q;ͽ4LR#`їg |ERVd,fU֜Lъf +Qy.Ǣ|9A_]{zo'hQ˝E K|Kߗ;{Փ Gk󖻇>|u;2`ӱ(±qY4q~aM#]PZ쳢 mHPtӆ҆Χq r|oLMc:vĉSplfe6at;Y2+҉(ǤN!i)QLb隮NAVݨ=H vaSZZ0!R)\^p ^TPkMzőIb&ʌ(3P/!_TcTyň,jX西tb|:^WWٲ#vimx7@Bg#QHnnTf\^&]SsțƌxF\ Nn Flј+Zwh.Wjp{TA~M`l3#Fur.uU\3I1W?q'}⻝PȚ!:emx<)LA&;pӎ4atfF3a35.B.MeɄ'yKpC#zb? IY5&lC6 Y;T.ilpre2i \ dTV5ٚRWeN ~~f/eIlod&?So2 򹟢.ڰUP3~f߂ Yvc')0mA-QDow.ߋQ5{BgTwU|1 u󗑓@Yu־M>Z~t[pݦ1jca߿Ux*'),0z}(>k[˽{sUjnVJVԱ]_E3ÿMYש&lȠ7$ 5B\?8DXaUB_w&t@ߩȂB <_BȭoR`(0m 뿫jJjH _*0FN < BzC`AaR  `U`ЃY9d3GF> (0+0Ԇs ӭ#(0hS`59 SfPHcR)0FI94X tBkEh5E#l"y@@lE:b`/ʔ?d񚝃w=bZ*:]C`/:@Z3: ŮB111 Z(_t3P4 D:(){J<@SG" v (+ :#)]:SNP`G `h0eA!Xwp> FU d#O)TjjHwadЀ ;*_5aȆFC}_\@58ΐ (u .Iw:]3LCC*E` uQp=J.ėЍ:~ƚX;BwY'rNu &.$E`7&:4 Jq !$H. >4=X SL{P;!Bc QC{dB(_cnTGb^`I;=SG, MMG {Ix#=5 b(?~ǚ$-`1EZZ%V5MͷV4V5MbCcʪJSϞB֚+EhknŊVqYM]eXX$75jk`nqʚ%"XWW,,itB[^ոx)e/Խ6U ,ȗ^XI951<%QH&FREtxk(N"QZ`O89jCQ;\$k[H&5!hiФUA6FI'S $P@f#V2l|ieпXHR6_7xmA(]_@\^#y0iO $DbS F:ar5P.{2T)f`dco z'o @OXZ40ՃT8ڀyNq>ms`. ?܃ i_V C7ד$袁`"/)* %>( i7'I!}TF2.J@QQ ZQ(u|{Q \k!EE@G}FkP?TzQcV>5C :T Z F)L@>Àt'siQp_://`c Q~ l4gur]-k$hh( Gpu*C_x!vjh`MuV@Z2܅z%6?c bSuw(/z4|}mOT(y?qj?*^d ^62n:PZCwIt@b7²7RB~>CF WȲt(ӌR.:q []G$yZdTt&.z?K8vbAsNH>C sN*AZ;Fl|/ߡPlRu@7>:,Q:,L=㶞.9 rӼ#Rr<ȴVZkN65^7)zkx4tќٯHHڱ~= }HM$q%{wR it6+@1D3ä sѤ ?DCd n?[DA0[~E)D'}44U<"sJtڙdd/AuRN4@RS}7ǵ|L9sWs2ukr= uJ PЍDkH@w)XO=ש׮ I69vj34CI*@ܯDt.if $V$_#fz# Q_/tdvbM*&i.ن٘(HxD7у (+R S5Ou{m#c}TJDؕRTEGuDft+tDaf V!EL~"kP ݣ 5QFJ{9½J#+Jx&DQy:XLc#Ȝ6S;9[O@2[k(=!|V+VPʄbਖ>ѕpo& *meY(%dý&Kf٩Y,y*z2:*sVXT]|JD寅K7H3MЏӍJayVR*"gm1*t J6:K|UTS X5k4e}6IIJ+`*ŧ*J!GR $MZNℭ멗}Q+XXM -T]p2v\g}Q2S-XIV)+*kM;{J¤\ Yx orTr͚<$p׫\SOvC(} F]\?Bd=ib$"t_YAeŵO[: u 1L뽼z G΄7ל9U} |ʙ*H5L"&uB4 GGDk8T,.)#{7ޯS}o1屓v~E ԎB"og#vw Tt-~Ӌ8_?>Hf<*'7_$?t| wwϻYy~q#\,ܞg ԋX"|xX‡`*OE3 (FO'pOJ ~܈oF|.᝙xǽVܻKaoo6<2lG$.K›7Kni ~7VO#\lC.[c>nC.^?<p4G$<$Ό׍pPpKO½Ypוq}wؿIZoWKڒɷ-V/^M.ynrF^ѐ¯ &oHpw|f/}\92/oٌkxt3^UFڋ* |W&4ŋR{T\3-3aW~s>_~/f|T~4ߔx8߸υsxwe{-?'j3=؛om%=_sqQ/³ -=Zp+5Lo>.oۃg kp.=ٲi8n9A-jlD }f3,,>k>q8͋Sa:UΔ|كS)%;xTl%۲Z7c dЎ a3̙3I?=68Uwk3Fm5'چU@VeǼ>VsbnÌV} +3fF8d+L=3oj&2G endstream endobj 64 0 obj 11525 endobj 65 0 obj <> endobj 66 0 obj <> stream x]n0E|"v 4REj 0IwRc} o5tuj}BMH'ƪqRIk@?uEŵjl#=$Kh(&Cn}EIYNq.rtvOc_ޓ<6Rw ]P3% Kʄ|oi)9*ĨQ3]F<ށs| #QjK>+d0g606̳%X-5ﰏfLj# ,׎X3/lo;|7#n=G[ϱ{џ[wwpG+Ŝ`hOBl/nh+tTG?S endstream endobj 67 0 obj <> endobj 68 0 obj <> stream xZ tՙm'dILdlm(IJ-"d$96%W48JbBCPBJ!4PJݺ }8ݳ))[zwvӳg-<{Wz2R2EtJmjBȏ {u~7X01}OyEAUe87Rm ~Y'RC6]#Z(+;q*KV.8cJT}"kc8n}'jn 8'"Y@¢bkIic!}g7PI'i6Wv 8{|!½"; y od;3'M @B|dt|_)bP p5&yo6Jia3~If0>*HP -喠%HIW)FW$-Rgk 7BtX.z%'ky7~ֳO/EG#MZF-zl<;q!ٓpDilK/W B[ +RPOnj%!Kȳ&gDhh-ʕ 2|,- o/vVbӚ_k--?qrT^nGp-.ƴaG[SPPɻ\o򿼕,̽|_DNj-fMgLB,VXy;WksCKϰ`Fژ216nv*Hq;K^, k|r jõ6T\k:;6tv@t4jo >Y{Q{3/ڠDZډJi{X>,ZzpP&6լַt@h1B_=Mp?[­ƾ ֓tt6HM BC:wGˍS83s-M{CBbRMu`-դA'ni#+n6 з\?7 p#qC*S5ebIZVX. DWe(dY %Ta_|GFV8|'OGիH/`-?DO!\:wFZ;A-Ena\sPvv^| …va O_I9iްtѽ.nij\$wA? Kg).UJ9 d9ഈqNZUN>1K$yeş"9]N.t%)*_4i|Y_@i#*Nd %R^ӅJF dӈ_44%9-g8-/r~ӅdYɏ̪GCɯ8ԖZ9-NKHspT XZz-RTqPz"))+}hg8~">Vijo9m!i@ӜʲRNKl1e8]Hr'˶qZ uK9mA@ഄ\RF{UYÈl:A3giV 0d-S*E3úHxR]mYO'ԠZMF4ŏ`ѱ@P%`KI]d13"DHBB?hT"cPYq3`J$`ؒCDcWRRA`h0in2[DźSM&ɀ&7fb#՝Ymda =3n)ubo<5Lݧ㮑D2Q?"/HLH吢!TJ2VJhh9B; cB+cXqx#;szGz~\n<rfR!gnӷ&9}.هvy9{Fyx3:a]NW8wx> p&<^ǐݳF-t!;Ra}pPv>>Dyit]!Wtnbt+=vMޜɅ ;\}&{=NJ`Gqb1z'/2`*;,c]s{|YS9l8Ԅ>ͥD Ɠ&9sgWrQi`>^jYX]}~5lƪlX1ܸ#qgpEdo}`uid^F[ 8m&at<q~iJT A1-k 90L$:6YIl2I~T-jYhRxRt+&y, 害Mc <㥬U6GkMmQIKt"WD/k}IOOQΩfYz(zШeG.ް2Ǝ $hњE0X0G9gA0Vd@Ӝ!df05 k.7FhO(5A1N{JۯZ,\h#9c^X;Bڤ9їG²/-@AdpeD>GSySeiB]*ކVWcxs;ƹprQ<"Q U5~+GTg8̪#ԙk\A.?G PnvTx7UI# 3kЏUe(:['T񆬍9 Pu fSЙ>%Y`FqUg`{ɏ V!u((W)C[^v(e:5[6wdl;̣:?:9DUh#4dvCP`O)O*zgy8»d&C~;,sK7R "Yg "pv'!w67Wrr2YL0;r|#G;?O.t<-{:/R瓥1Ig폲f{9Ѩ:zi)i /U93^)DQ\ƣ+1ބ\2*zX=}qy-f-oa\art$@*/:73e+3o"*w L0Lqs1B ʟ9u; ΙQy~db/J8N<YլD~MϿcBqUVQӻz8]M1^,r^sAU+s. "$|q|bvc۫QGt~. M\8z8mx5'xVl/ˋF!Mda|RDf2w!uLѼðpvG%zpfǔ'6js*Gm1-|N|LcƲ!y6)JvqK,FbElDgG=|^O;ٴ|ūiQQ7G| 9mCO/ZY272s(<4[AXn숟N?Cf"`ӓ/7jy/dg.Im~v~柃Ejq{1wfgzt2_{xlML͚̋nfj5egC9/ '/fxv{v*;;*^t0.;˵7>#yOwֲ &VF zzxo\w9\;zo?o[iӖkofg|Y?gV;On+-ټnۇٻFwA-{+1Ϗxf2Vsgm08iLYK,2 -Pm"< b FfBKq^:oU/$w d+M\Lh̿nEd=W}mYx1˳<3n=m[x(äEr Yg2/xр[v,|o{3 ` <\$<'/oM7K`րouf*Y+|u)<btO?Bzj * x2NOtKUvx k/ܷJ~Zz>_ (Gz鑍0}v9>*4f)M]pKo>S%ݷ {kNL[ vt = .O- Hwp'3w)XGJHe'2UYpۭm܊NK*7H7pӞ L22Kr|̀ɏ& j8V:`.i,.Hw`qH+uz H"rҀ=gJL[V5 R [z+ Xlut,(ۀk iW;K;Z`{=lk%|]p2&._Zp \0,VP8XRv 篚g [IBLkGo(R鮓z]}.+ʡkJ|Eyו TqE3|:#pj:a>luVHN)bK:idctItK\&pq9\TZ"] 6Km`ZWAJjت%n, ICs4wWIa=έ]"hBYX[ m5Zc@#6NC\$5XaJ@W UU-ҪMP+'ႥC.PYe8Z K%t, rMTl$TKU-Pѩ4*VBy%Oe\i(-.jz(*f ` HVD%) D R L!p[' endstream endobj 69 0 obj 6300 endobj 70 0 obj <> endobj 71 0 obj <> stream x]N0}.ׄ xDoo;jMmjث]DJK YtIiT*¼Wsǥ({ٝ* pC؋`|m| QNʒJ<30t[GohuWl' %-.zI-(>{륉r93 GM5Uۨ=G}>2Ω"?~sk9p-5B?PYLBJ{~ؚ endstream endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 8 0 obj <>/Contents 9 0 R>> endobj 15 0 obj <>/Contents 16 0 R>> endobj 22 0 obj <>/Contents 23 0 R>> endobj 29 0 obj <>/Contents 30 0 R>> endobj 36 0 obj <>/Contents 37 0 R>> endobj 41 0 obj <>/Contents 42 0 R>> endobj 44 0 obj <>/Contents 45 0 R>> endobj 47 0 obj <> endobj 75 0 obj <> endobj 76 0 obj < /Producer /CreationDate(D:20071011083052-04'00')>> endobj xref 0 77 0000000000 65535 f 0000258019 00000 n 0000000019 00000 n 0000000630 00000 n 0000033496 00000 n 0000000650 00000 n 0000033474 00000 n 0000050823 00000 n 0000258163 00000 n 0000050845 00000 n 0000051477 00000 n 0000069574 00000 n 0000051498 00000 n 0000069551 00000 n 0000082720 00000 n 0000258307 00000 n 0000082743 00000 n 0000083424 00000 n 0000101460 00000 n 0000083445 00000 n 0000101437 00000 n 0000124686 00000 n 0000258453 00000 n 0000124709 00000 n 0000125409 00000 n 0000141691 00000 n 0000125430 00000 n 0000141668 00000 n 0000160150 00000 n 0000258599 00000 n 0000160173 00000 n 0000161153 00000 n 0000176050 00000 n 0000161174 00000 n 0000176027 00000 n 0000187931 00000 n 0000258745 00000 n 0000187954 00000 n 0000190466 00000 n 0000190488 00000 n 0000204197 00000 n 0000258891 00000 n 0000204220 00000 n 0000207204 00000 n 0000259037 00000 n 0000207226 00000 n 0000208011 00000 n 0000259183 00000 n 0000208032 00000 n 0000208693 00000 n 0000208714 00000 n 0000208905 00000 n 0000209197 00000 n 0000209358 00000 n 0000225259 00000 n 0000225282 00000 n 0000225476 00000 n 0000226073 00000 n 0000226513 00000 n 0000236710 00000 n 0000236733 00000 n 0000236938 00000 n 0000237491 00000 n 0000237903 00000 n 0000249515 00000 n 0000249538 00000 n 0000249737 00000 n 0000250209 00000 n 0000250535 00000 n 0000256922 00000 n 0000256944 00000 n 0000257153 00000 n 0000257504 00000 n 0000257728 00000 n 0000257801 00000 n 0000259331 00000 n 0000259416 00000 n trailer < <64EA35B1599B42F4651C9CEC548635BB> ] >> startxref 259603 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/src/0000755000175000017500000000000012277111530016012 5ustar synthsynthKst-2.0.8/devel-docs/Kst2Specs/src/selected_r_handles.svg0000644000175000017500000002150712277111530022347 0ustar synthsynth image/svg+xml ViewObject Selected View Object(Rotate Mode) Rotation Handle Kst-2.0.8/devel-docs/Kst2Specs/src/Plot Geometry.odt0000644000175000017500000250450712277111530021231 0ustar synthsynthPKH:^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKH:Configurations2/statusbar/PKH:'Configurations2/accelerator/current.xmlPKPKH:Configurations2/floater/PKH:Configurations2/popupmenu/PKH:Configurations2/progressbar/PKH:Configurations2/menubar/PKH:Configurations2/toolbar/PKH:Configurations2/images/Bitmaps/PKH:]-Pictures/1000020100000481000004573171E9D8.pngPNG  IHDRWgQqsBIT|d pHYsgRtEXtSoftwarewww.inkscape.org< IDATxwUCBKH=t)"E@H.Q DX HA:IФ$ qΚslmwk^3gΝy瘻#""ef ձɅ~@#cf7ױɩVGDDDDᝮPgf+f(` 6TirZ\'b=tw[?j0ުH VUD:Vff&Iqzx x"""2($f8 3,` ,pwt_PV.&~It}8E;!x;1N-ڧ 1f6 -Czx;p?V\-EDDdQH@1s< ~2Nf:zw`Ɣ͞v4±4Y2"`Rw&_ؠIw0}9-rhq`X+ХUE=<Hfvp0j L1wq@=NM,>wLi3K΢}vקW6Ny/o3 89g k&af#C ݼ*xMB~`BZM?3pTgEDDdQK &+ʋyC>9QA_v歲0,2^ଜ%xJ3r, ,O23;8@9jmh_"t],j`,<+b3*_ˍveg"@";ρ_ qWWOR7twp;-A:tS>ln<_2-&+{D9f-9_Ӫ>SÃ/WHم\\Z≈ I3t"%vȚl?%SX`-"]ܟ3]%2d~!wᄄy.4amt3p"4G˺+CS(/"""5PHAY5wؔ>8xp3r'YwwQ Ya-OٱsM5? K%LDDD$IA ƭ|!& q܇HqI']8jW}slB,vާIjCA m_е: Zp4))_ty"l5ҁ_Z"MDDD@"(1E^&"JoծH٬ 4 up$"""z 4nLb-ڟ@" V5ԹCzwe˾ﴩm~DDD($Ҁc-#-*WDugyĤǙwsUw'po'"""cx+ ңFUXqAv%Vem۾dykgE+CNj@"XaءO$$Rl`U`)`I`&F>Mu PWwңrqL mƺNճU:?@l`` `8$ONӽ >S6f6ا*nW];-6>h-bptnB8&35v+J0'>, Cn~p26'|~6s]{NYvS+f6o XJ7 $ )@" pIf!C[\q3_R_2O[U:)~#}` L3suff`{N`f'fvv?Qwe[!x,Uf?߹-\K \mEZ|hf繻7 rj,)wߢ4icMu;}s Up<|e IwE'g?K_,XffDw~ YyA&~ɳ{wWNs"Fn)@.f6m`*Ntiusi9RfV눬%] ,^ϻFlAqw:`fqyvZSfw:VD5i< xb:+7[CY˶\L,1…e]_ǶX۟Ug0 p(0Ϡ4㽆DHj+sp85@3  M75=ҁsTM^PpN>h~+7oԹm˶<^S)~ͩz Okq3!rqu{&Yi#gOֱ3m7qMk_j܅:}ҤII-Dw;bbfvt`6̶u'ze`VJ> X̶pgSŧ+'Vyp |Dx[iftzZ EKVYj[jQ-J]JRp+ &r~BW2hfwwoI=ڶZP=U“HpVKY9 qSsf\Ga,yz`M9SrD~x3s&d"/CehuGB 9.4OW ru5g/-K,Ipo^Of &ZtLu8Jl; p,0{f!3?*%>A~2'P&5WdLUz>df3[oB+.»n R] L!@WMD'uةP*?ft xW&]+z-swFRDٗ$ݖ4* X5ga #qV<3qX1QՁ*&H]ϭ|$!ؘWNq^Khľ!ʿ)gEB>[i֯w]4U]{iX&MJENx^ê0l3|xY#y;w#$}2Qޮq$j$y>V?A2p{}u \[[TkYZlI~_.}>O.v%+渐aqC'xh ۙ״TJwɈS2ge6!!a z10w?ֲ>BP&lzWU޽Pwj){* Lo~.!g[3k&䏘z{g ]Zϻ8w~]1-7*7kJEt)-"- H/5n$^5lߘc!̈́ ]Euҹ'!`%F Û^y}+B3}N?%cSr$.*w ]>3YBBۺxx_Y`PXe==u:xLb7Q0=tM׏'p?ъnt[ߝ"f΍A"L>:YC%t|%nm?% _Y<3TlB k G%$&8R#uMl_wC uʡ55ijX|w٬HPHy[c8!;?fef_C̄ s T%Iql~ v1BOܽY?"19gfZZL#YSR3[tKyyJBp+k&R^Ztw m^x^v;` SK+ݔ]ssq_?uH;)BZ|pZ)-uX|2K28v4Xfq?ֱ-5sq!،M4G"ͦH[V-;rd̊ N6X@LwnJOVމo'5P^itO56E'D7%w@'Ȉl]a}C1AfFSJj:H;:듒zvqіqw<~SW D:C}86d?OvzG>wffS10eu _A9'}\ 3 O*fూ*7tA-PaYQ-UCA*7 %P;95ڽ*-ZaP:[32 d%Ww-JoRG@SCkM38ظS:E)$auYYW #,SeY{{!GP#O5{1ge rtSrц:ӆ}`F,QI{MS66 ˆ1wcʬ՜8,L{k*;ݨ- P[}2 HG)1Hq(B>oRefh~vt7ԨXPl[Tij^0**ݬyT̬gkFri~ߢ*3NhiI:W*Ωݨ>}פ4سʶ_f`sݽE Lf-!b*!AU#VΩ/pu*囘!gN,~+ Ȁϓc"pgw&nJ|=EtT:vLW)]y\zM!}ẚO1s̎v+! HsfvpEb>=E>l&yu+UydXCK/I:ț[]E:R;+R7L:+t#*}.3黦+L~hQ`3f:!`=2($;Hp+~4,m7 tR nh/So? s*HijQJNtLws黦 ll+?V!Ddf_53;>]+13(b|env_!}a>{b /UX6T*RH})@Ys:T rbkG+&fx 3ةlŭ@"[ؙ0-_*Om{@t)1'ʂ͖ .@b /"=LA :0!1?\K%fXMmfH*361`Q;wXc+,+tzM,^&䋐:} Ec+,#A|pxZb˻9!8DJ˟/1w² (hVaY]l]cfזM(|i >[>>?}t5w82x.6VY&Z5fV-Y)|Ik'sJɩ+,+K9S&> `T&"- HqZ=ii-Pq8E$nݢ2Zzy,/p?i㲩lzNqkfsa>M}2"+L/EFfbwʦg>q.^Hu]:,wC¾k ^?4ݟK,fg")bfVSMֺWbC?-xC3Ѳcbmݾ 쪒䲂ʖĜP\67˫5 8βK̯:"hfMT]ȿ }yZ8- U=_+8x Su$^ E|LN̯x1%2c^ |>ںl+ "2ʅHyݏ& s(JeD{tI9G6[|13x&uߜo5Zh h|?*.Hob=(b[ ~^pf/i7?h6NؙL:WIV*а5(>tI H*`5[OYTY̶` B\MzT xBPD17oY-0, IDAT.W$gf@3[f*.6GX;hRwqbƷ_>3mktx(w/N:?.i&0ɂo)¨͖=vNjU~'[X619!x2qoI5$MV=e^=7HG0ղmߧQyC1 fg$,~t/L"EH*3K%f't1R~ _l5$dM9X+3lw=Xs@\XMs*`/&p-RkAf6N,MD Jpe2ϝq_`$ƘY9ǻFP$w]^ qfvt3Dl^3tnsDIwklz3] E[n}HNK%0O=`GsIkfGٰ!wm|v &3yx3nf?~YI% $՝>ٝVgh]ǓίU"CkB|jHhyq?j,HH?Pc=$?aIMrdʽ/V$8̼[}\|2xR[a~5`-U >P񄧗؀]n6rge/LzW}*[<0 Nֻ {^H l6d. 3[A΢ R]k3N̼710vIζfϹݫ&ɎY74'?Dg/S`[w̮ Тfm5RBAB.W s.{*d[6ޒֳZhOj!Bw5wS.`Yz Yv+yXS#tDPB %{CDp k/af=5/ C̝d`gw-I螻lbc%?ZWܽ,2lnc}@43{ڮR*ߴ0eégԲb ؿj"|Jh5ᜳ:vfU2-up;}2}ë*q7?}0w?u6swM451ZjHx!ƹ)`wv),2+l<~XV6tl15BN&t=mSY+T U &k7P' O;~ Vxo FQ1Z%>ق/\\@=/+n5~HlL嘜rkfʛz9Bf!a9 E஧Yna ffG_"té9W8qtt%+?ls|،0qOa޷$$ԳDpZ|@ٮoy|=wxmNN1YFWfv+l->˺ewDDZ(6]|Y&7/J>f*B6Fw~,Xif63!!3Ftస,G7߾-ڄn!1}I{9ƺ:S-L})B9-[f$Msߤʄ`K阙bc"a ]lqSV E 0^'| [F17ѧ J܄-4:UL@hBWɄǀ;.h"L-oT}Du)=Mвs{HDDDn%O{*8 /"RD3KBnW@""X""""0Y8CH_yV.O-O%Z@""""0W Յ]dhSHDͬe(o*lVF;R iu~f l~wWK i93ffsiT D awu5n - 0,gM+"""RU Qlfɼ]Kj%"]EA w^u3=oMt3pY3iH`B3[ةl (!H_PHD~gf3պ 7CSr?QDDD7F30?QA[j%" H73-Z4GYU`+wкTu3-bf3H3 Xl;SEi7Ӄj'{5i *lso""""0ՁZd^M"CCċHl l̒Xo|VMEDD ͘3CK ef HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD($""""""" DDDDDDDD@""""""""}@A > HPHDDDDDDD tDD |UV{v 7 Eկf6/0*Hf oy&6[!3XI>"vmU6kzHoPw0i֫3O2[x:^.vsOS;O#| fm;P HS}dG/@Ф8߀ߛg=uBpwݏ~Vl5`UPDDDD HŠ?fHYf61J9{5+lflzv`fs٢f6KݵPHDD9k5Se]d3{v9Js3{.N6X3_nf'z hf3[*P3[.57 3{N7zWgd6}l Т \ASԸDk#cy. ])"8=[ȳm9Sfv> l(O@q& w[;3}j0@CċHhf3=!!r{ eMH\C=Ah]IM:mU\D~hfsەz~_X*e$3x """"}LA i :X):wRf6sl% [Z' |̶C2g-Obl"""""($""s2ȼa\M3)9 B:l2 ,VgMl"""""RHDDY6 q2~_nf{eS/pd&(""""2CH7Vz>-^) f6 MrVNF*y-yd0 3+u?ٕfvTnf3U'""""OOF*ٰ-,_~@Y&șX])1!$3T`33ˆh%Yi3p%r[˶̆ޚP6It}^F3$""""? HSlN3-c7 ۮ-o)~ܮ4!pff{3". 5^eomfvU)@Jc0:7ٹoپfv0p!]f(}2=/*[I3_DDDD6BH>3 8*omWe9vɘ7! (pV잕-{4!a$B}bv̶s$?W20weYY, 't:_Oc ǀQ?U9.NHLl\uZ w HPw0> >ifw"""""RuQVt;\%ZH=v$$WVHDDDD%f' G> X6oD.^ë"""|n l`mחHQN ʼno)$""""қlG`]Tw;$H `*H#Wѝt=wV +nwt}DDNWBDDZGY:] ۀ%ZIDDWDD0\>u)$""GVEDDDDD 0 H}EDDDDow=-^mׂ v>""w""^ Ȕ-t%;٢]t:H4[jbf33+37K٬k]jHQw0)w08*3{"3B9-if3lN?Ƙf$3gf9,GX}kfB*l3{vKA 6 \^7v>""~, , \`w?ǀO1=G%oÀ{f6i`Vk2c g>F8,03{̮.,@DD3LꈈHpGG0``qw>ga&~W\txm6'p:T663{8iݟ/ZK܍l>k2,o%"%teDDQa/{jV#38x8$*sP3[6?U&%H3 ڈH::f 3[YkL[-_ݏn`fKG|v%O?uqނ@nv?7[58D$tk\ X xB@Dw/SƂtaf  \U&5wS>_H `B39H|#7p'Kw/w?<_NYG>U -~V 3؈pϻYl\oSðiHSHRK %08teDDěk˯gRgG AMs9 x07Q<;z!p!8hٲ M0=02N* n^g`ɱsź/Z^@3X ]dfY}ml߸q'뻨%N'Zz ?Ӏ Q|x̖.[_q'jKB!is-VsqiLwcv?~SDW?c]RD$} t>yfiv:wt.""Cӕf25 /t?2lRBe?Vr-3ی&puOx_+? ,'qeFJ}Qk%8)BR*u-BK>-ߟcXm6sKp/f&s?gGw0[@y>~#`tu$C`sw[f#$zbu[{}g/\|c}>>w3O.c:'m <y/rYy -j $"ҧlT7 ( V3g4-c.f"T)J-q^~Y/KF|;y%fɥsp(=Vo]-sv^( Z>W(2ZAѭcd'Bw7!GA  B?߸6wJ"mD:[)6)>hK IDATZvhk\;@ Sɗrna ^Z=Bs=.SCa/m_޲bf_.|d'#_犉)ټCQsYi{f%3-~f/YHOPbh>C """8Bec3/BVcfm`g`]nO~W0v6S3Y ]'G$V[A5Qf{ff-df3/RwRLdf2$ܸ~ = l ) OA銈Ȑta%P_Bcr} 8"=o#ل0% cɞ7aُ"$>(5QɎf)mʝGll%~9'F@1>UO?e.gfr쐩JꄼDcX%s_~P20ZiYZBUBkFZ-`""}v!"z3f澝0 snr. rB+AAlM玙3&=~ݟs\`_3{0J0¨cG=9^B>L%u+ne7ٱ Ň*>|Bqb2=YqwgYy3ۇ]/׸SfX3;8ؒ0r^>C:fv)!5gi< |%n#$>Nwݹf\8Кjow?{g&G,@  ,Ab,.Yd AgkŝAKǹLdAfXmIDZ*6xv/l~ ^WlWI.!ia"nfc%mG4-cg*f]pA7"@I'!3 mOOK&;мMotPh$7T WKJ:8n oC"e5Ѩﲆ (", iM!fo?5֞2.jKrA q[IG"yNiCqn[G˖Xt _ANtOtz,}p~/]Uzs*>xZRRAOP)4#bDҜfe# u(`"GFfD LHp&2y'Y8z.=C PZD\[`1l\(.B8 &b$8 )u =ćfl,pkh̶m4چ &6  hW) JA 3{V~,Ӥ'p?[%$_rAAKG7+X/X_c*۾:A0qInC[}ײ"^IO'guA.4-^tS73:=':wj\ W3OsI[3ͬ2b'{v7yA[1Vv^T:]d2Ch%`xBk~AAP.&iC5`g30Xx !tI:; lVX~0 .v0>;E; :I +FAЕ0tRu?fv._oG*SI7H_ & DRՆAfv^^:fj#Z}HR4f9t=0"/sDFz8دAtY=`mIƀ<I3QB+_p<-4̾h&Ii3{?=MnfjG$-[t} s (%@zRr \PlgfHnK^KR&iKn$I9e7ZxGfSADZ8F7ژ ?^HXch7Iz#ffL i>& 3E3/0.0/ޑLS?:wM`.j|b*N@WI31bK-'v4XҨkn2(iE9r\,.afȵM}KcmI Y| &th:1xTɮ$Mk{qO²[`5 iVP\,:K[Tr$Mk $MS>S39ױ)5%{-[s)#4]`f1f60@0  O')CIJG2m{#i/IJZU郏Wl! 2lIWkr2lWScf%{Gظ$m-% e-(Ns2uC7Mii'05 }s99m`l/M?x|UE$.l18njqVxZI$9x{JDN7 jb^fs;سLJ$ l M0ʌ/Jʕn+s3?⳿s>>qQ4^?x.Er;Sl9DHD|z i6Jc+G)IׇGG뎶0m4/n]sǧ荟ލ6$& S2Wqf1607%Waݏ [ݐo@wٝiݍ߁p鿦 ?O`e3+i(bcƱ-,4N3_ N/ϘY6s{hypf(.00^j2~S BvrH?dfcד*W% m~'=DmO@~}+IC~M6sJIs4ʵxxFtA'>qF f>pUz!CVMIz#fN݅ +] TVq-ZR4Ҟ,,<YQ91+Įڶ3pݤpG^xӎafH(F@ۤmJwfz7T!HDrD_scܾi]h6ǫ#=\- "f6*AC1o+/NS(IONWx>Sv£ė#_'N& Sj.6Һ埙~iɔ"ILG.} 6^ pe_fe~< 3../x$fX iIxDvϻ=~+⿕>ot]DizoѭgNWzڬbqXyfIKn*46D‡fkfbJeoB_>?V3 OxzuN::;i-qpO~i$MK9EL;CH3t`UĤ4Zn]N;eV푤z)LumrI3a:wt}l=cfff6.5%}: ;%.inHO]8X78x$mfc$Ǫrg^MÝYCx}.E뿙+%S8Nd wh %*ٸ@<`<"rJ4ٔ_3(k }ǿ[{wI͊T"9'jV{xx 5oS:/m͖nOW*V]VuTe ㎗rW4KP3B R:~? E&jfIz [DR\z$͏*dAGquIwHi=i{ή=s/`l :86]뱭 :ofJJK7sMR4wvS|0yf W-w_[=OffW6{=R~ΥVv2;^&`g3N^7)t|ƻ͓.N5P8IK1}hf?O+0x$=[G-[)iM\k.A{*f`\,g̳( Tg.?Xi-E݀l +blks4>09pZr:>GݒΑ4P h}B%xa f6dܞ߅;͟Og͇TD5ET>_릢Ɇ&^" CGR(IsೣәY\t.z8je/<%`3Oc *'p[/p~4IUm/3fĝBԙko^?< M^I'1~w]`3ay K}ݝ~_ CS;p;~nOJ95?'~6g7i +3jf7v=ַ?m$*`ɃqjYOԷI#o Gc~~>?])>40^;כEM Wxc% 9\Wۥ8?)g{ߤʸCh%3) ]">MgE3t6=vEq"γ4˭kv%A# sv4 '7qQE5C]W4<`<ڴjQ<U V/'s#;V&=f)JǦ(mKlcnI!o$eUn>1|iIZFbE)d~%<E|^aq€UI_Ҝa*ٻɈz28$i2ӽs츱vl3j>ۜU.Zк̮ٕɴ3 4xmfvQ#+IOq4wH;3s?YTTT]MN(ݓ2Gݖƣx9ĝ@Prm˥] goӧwG; i_BbA0H`M̷p#wX"!tIgʜR ꎙ(i `wZpLJW:jȢOGHqxU9^QIH:Ϝ}{;ryYfSf¦ ZAq%ZQxT˓n/( e:WiLD[pamxHwܫ8ցtwI fo?eaUʸRfm'w,.6%ݟ_T-W̮H3C$]'̊T3K~OgUo /KzI)=l=^DAtGǵNJNB6XnBJdܫ*42}6Aō-IGZwjfH &zQҽb~ q4;`g*\H|?g0R>+D)ڱVn7_nYfSᖨN'~]h?Vқlw4^`t`[|.MIWh$tq(+9-SN>`*Zi y#:@IY@rQNS|l`*׭F1vPʥ5OˉXɮmAP|"*\(rZx |̚9r}\*3|Fq&\ z1PټYIUge_)*imI"3Yu6 AOi*iz=a^ѫyC$]q{xkxlV*R6:(s (RqS$sJ5͖45,v]kIy%3-mSffvqGw1uҤ`u0IGYU7n#IQ!(ٟ LhZ ukڭJ̎1e1aȧLﱵjh*wL; ]RT(ҧ*iM]h&HjSz9awp3pjO D3A:C!)&oy\[LSdS~J}K t)'PF x2ha{!n-;65-%ZjWIakpeNh1(~dTh]33 ZM̖6%i%A_kƦY IDAT*wT"M^wlWo܄uq'POZ, @=lZuw2}$mW(j'hZJF>YsZNo)~㺯Xsq ZT ¼ZSf6̎2f̀t/gFヒ] 4bv~6W1kZhvB+2Y>2렼xf&j_y{3܋RJ SD͙xjBc0E3_kLq^deIJe$]W+m9/ljKYR/I3H WnEvvZ='.T?I9KI]LjxKGO2!\tt^4Xͩx6Bj$i$-"w4G)s"id8\k2,ߡoyZJuɕWYe\ĮNtL̅xֶ)s>ÅQvfvk^6%ML}..ԗ]GsbѤ95VNNA 'P3DweUjrA}xGҡUqSI_'_PY尿 < fvp'v9VBfq<4kXmyrb'o;??ΡqL-?=h^wJl; +R'Jxbf_IZAx6ٰ Ycپw\l]?G5nwbL ifqVaY5mZeϗ=w\x .-k(i~^į;Qh/<6ّOo(iI6W0'.iA#i g4ɉ穴mq] L;/Vɵ.s xBf5E:9vv-$WC_À4|"EIKKZxX80m{==;ΡMs!.Wb1VOD9m97I>,,x}.'8!XܢAL$ y_lP[4?* ݐ/\of4^F309qaOˀF_٪e YV8p[ 3}`f} Ý3k}iy}3;AA)+X,Ofd$M)+קݎM0Nz͎Gd@j9֙k)P+M-We5CRO<]k5~V- R׋$ԶE~Ux5fL_.vT A 'PA4-.h=AA0|We]6k:8(=/llkJrb߄ %)GcMȿKw@`9Lﳴ偻[4#izsj-kWT;f5/6N -ീC l;0~6,Iu{I_5[ڦFzY6Mz%|g`3k"x-i2Gik;k{5.CVrR ! ݈.! `J<,B> 0e mܑ9,(0y73{ywr),-( }m^mxu52^7GQӨOҭɷ]^Jn0 p.ǵkƋ0fk~7KӅu=huʄw4 v5t.7s˛ CK w/3;}x5쳴l$$3X6R{l2ǰX:XI{Ɇ/A.0tݕ֏CHaqH W:ɕ1O$'蜱 p1~MhzXYR|TmE.oat4D$-;–0}&a6kJZ&=@ I}RۡVD:/qA+$*iJIGʞMm ;t%$Lv5͝πlwHZUBMMˢN ǵ?Opy0%`;Oɾq`WWZn_PmԠpAw2lOJ)6@AЍM ޚ~Xhiu$ glY^Q/sg,h66+j+d5>mGQ45'' n p ݈pO>V2HL NCҙXFHٵ6nȄF+*1_XN8) h+Al7xhvx5 3"}9q5$MR `B49)U͜D L8 |k0AP3{K"  ~|H A4i `v\AhVtjRcI£5FA01af.e?%" 讬GSGxJ? hTxaVvI{4֪  j D AqL]fY"0I;'K[Q~`  B.L3{vY`ܢl?Iv3H XX /Ap}f+ޭq_Yu1#i9`G03At'K` q 茔Ӏ ] `Q@9]1e}mx/-GvvHZx wZ.']if kzNNAҾ餳;;NhGz vkfJk$hϟ ALtx$P9NҭZxEfq/K efӪq [;$gP`39ZIKW6#:rj}`e@;x+ 'pY 6ٯϋc$|if4̸ (q )>pmv"$ ,>~of5Ҟ LOFA}h&PJz wDUc34 e$޹5HN~f3}M {fv}h[ vOKhYA7m*dQ3IGJz^{_]d`Aht y$@mk=SfEqp,j&S_a쩴~zr 搤s4W4$-^x"uf^nM,:Ò6F6~>ϙ.mfOs@Y-SfJ㖴0Y 0xFtTueɮM˗ڙPI MsNȡf66׺oo6.ɵ[ץ x) \/(~of?H~ip:@?i fhYA3Oif$ 0&^Ol(KKķ :3;-wiA4:0G`I+Y:0psnY`{"` <{ KR?礿uUܲR~gIZ:XZsB#$k3G&$Q;M^ŵrl)E` yLfN.}^#}k;UcuYr.|%lE%&-5#p;p o#wg Jٶ'O.'*x< ?lx}OxO_[8A3gfGnfm]Af74xFtcJsgRUi?ӷ0F%mp~)Vf)9_Ɠ"B3rƫOz\ݸ3{3Uw`fIw l`fc%2pY*?&}кRf%J9qƝ+e.=WJ̾Mggtt4 0S:pIA;5/f7INҴmSr^;w݌J8JҨ31U[a0I#=lL)XWY,ii<^3۩p̶-? AЍ:?nIA7oso<tҸyT ho Вū]Xvɡp\xr~݃;Av(T&ސ4 5XMt)bYP_;?irە~0ʇȵ?5~~.?aa49唞w^ I=R:=efcN£NHpIO@X x6At+RTfv]'$N]I'H^4uyXےn/'2I/Jz&L+$=!i$d햔4D)9[ב;y5vxZ7Ua1}/*IJz\҅rIZkdiѐ~V+] w^4L.mP9<8*L?%=*ioSI:ZҽFJAmAPg:^>^!cK\ |#i l鉧e\iZ_4axu4|='BnӸdj?KcQH 6zؑ]df jfRgkִ8;fzOx\fKgxZ醻)Ӻk#A͸UҌT #Y1`C{FxI;brN IDAT}u}^f|W*}~:}~ %#ٲ@j7x7-[Gt3ړ6HZ,mDޏr+NdIRhHϳڟKA܍{ZXGC GAt ĚӕS²ȟHX5EIW3D҃0wqGE"Lx Q{j0[zO,˄YW$;Ti3/O)~>Ko@啢>¿羔n\-bf_Tg}$+Ulr~t%pX^;*;>")r{=Œ=.]"] pljf7H&lK7l;tNt:65Kޔ.//\n3#i}`aR39~ɶI=;n6 |u%IDZ>YseEoF5#Βtw^3{x]`nb{y|{pdr);C0s4_4rVH|b{#I33 &HJQ@ΠëA"=RXx4NdLU^'GnKHkȫmm߰iSFɡ3-yI,˪!|_C9Xg?.jAc̎c 3!o*oW3> |;^W+KV^a0"O+6~&i V`fYcy> ]M+ƵO=;[ZZ+, iM+އF7[nBϢ,ʸ Ko39~:ek|4NJ8Yu]É,VJ$9T;,sF\ LhS2OV3.9|W*lee3ZL̰9fHboWj/鷒sn㓗 )}޳㘵ؾf;U,t |'xH%J/fvuOG8m3!iIRk@M\EGVYMFN/5A*MH4t;$//b2#.]/.Ƴ _; %Y_6`lS."l?{'²lb{ܲ;9XO˲( h Oq!5۵iM1% 'i4gqy~\tv&f4)m=X-⻫]uYxDH mi?oCsW_ҝYȦ~7:ܯBC[lI;ٷI4|tp8ޗtpasx7^`(L7-~M&#+UT{7Wߴ݌x,d~͈l? :6_o3[3EN'J4}6D? "iw`Z-l-!p²^@owR*.3m+$O0N]( Z=Iqe{0wBM[\!XW:N3OtjJ c`kY?\I CA{yǛO4 9wMv3+z-S7p^9I7fvXaӝ>%Sk5@-2>|ą?Ӳxa)On4"m{V+l{p^ݴŖ2|*G x`M<5k 1@ 1Ʉ}$=Wϼ'ұ;;N54wZlElW{CRI `y?!ipxxMl5B 6 E  le/\\)5k4^Eʷ}-E,|m^U咮8J&7Sf͂̚$ny[Mfv 0|Y>x9 :/fóknHZ!i<<}.A7"&U '0)+ ;z\`jIi(V d&+*>Ý p"JZXvsp끧 '(DgG/\/i`3Ooދp*iN#Uo_<cU$nʹ)a iCAԁN'ɹQ];;| 4J\9pN-&GGE }+k6%Sʭ d&iC܁yW<4phh74!Q /0 yU}ڈjӛ!; B'RK B1-Pz wSlSelǜeJJ[}==wWGsf~H:/: I[IM6uE h4ֹ͔ɘoߕ4x[o#I/db$fda;3_YxxD$>zp5pws\s:``=3{w욢~kM*p4j\g XmsH_ioiA"JqsN!oV \eQĔQ+a3v Е#i1|%ŊCAH#^5U YlXTtC3ۥľtq4wrf|;DL3;{)EMWs8AѡىixAep)q©fvvj?pIs,9OJ>lmEEHeM6qDŽ-|F Q< of/F|yZ: CMK 6^l$p/Iڊ+հcfRg{Tpw>bQ3,I#)u4U^@)șk9@JK i3`p S8`>vM1;%-hfc$ m5kK3=f*c`qeƅ"S:Ayi'V{ einISv`%(H\#Kw+[' ,^-iA<>gAP$:菴r3$Kܙ9xpC C L)%M8IkUeO0@x:c!]; *!@A`f pjfrp=U󨣪,=3^)*`VIs F`fH:8I;F5\Nxe Q^_5Ӂ/i6KT4\K3,i/ ܕq  A1p+=F`V*w-FzIg"l{ fV3೤w\4zBQ;nmA;8 \"D}\n^ٳ ΂p55n^("T)fvp$E pA TI&UcF7U$$ W"3^ IzTL*ZHg?Ix5I[IOSTHPgd]#Qu"'iV`>3{qkLےhC#xi;IZVrCρՁ(TXiu CA4N%mOhD- kf7UpcJh^)f« N հCv.J (p/*=&i(Zt}5 0v`S7TVQYx3FRl'lv.ITZ6{pkn9[%탲|>5ؖW6bf%]xIʌ\n~ggxǠL`ۂLwFa6v x\#I/~UA;_y xNc.;+:lIKU$큗cJ,.iC-0;q{jiO3CҮfvXkfW;f`E? | tT${n`)<ܹ|Gup I/I;NoN֗,0YGF l;afH%.`:5X6 5M[v0.r זQ՚\nv`-ڢ}hEo\4C%&KkG*5=(`V _6ڌ3{Z2f6Ii{f6Qrs֤U2sf/v$Zp,+I~3fLcfSJyN3[f𴶛J:v&|š/l/tr}ga|=XfrvI23h8Mx7L9oWE;9^K:"=^$~.vtp/Q;4㟥H:\Sc+AI3Ig$qК͆)ţ~ET~TUK>_35+t :[ix]^["sYtnZҜɺ ^uXf&Az Jm X_/M;^I/㎪?&'{J•j'NNDf^\I?5l[ [8!3p2Mϔx xVQڽFE6hqe$]Sum`zd xp>lR;STLHzbfU ܎;k:~/bfc%G͘tx̸gG_Sɜ$ <(3{3lf$jbf{K)pC64䒤&tt\&}F*~}_nS=3@y^5jk.7X5\z~6O)>IK>m7[ps@1%[請w  *=}uj&3{C B@e3OABnӖʱ's^Jc~.\p$p.۰8UVrÒNldA-M=Mm]5>JOw}R9 4g{/Rzę1SyS,"TBL3gFG!#iej*j5g̶Kؖ Luྖ|>>ӍgSz<%jc~4>GX hlf6c^vK=@1oq킸p߭^0Jt]*ogKZٜ;E>Z{A"1'w _4>ٰ>+!<(i:\s .֮X}'RT&ISܬgfoGjxqS-|OJ LƬI1f́O𨐾$ fz.'hݛrs=pf {L̺Z/IikWH2GPVfT:3{O7f̈́x*xіXA{4oGLvfzHܐ,=+&%lZw,SY %]ᱥn*qXKxT5wAigO%S#Я |fLq]RjZл&;_%-r+҈9{skK#6Ҧ"FI҃vlYApŦ777ۚ]w__%ߠ%?%"@jcq}vI%W{Jx[J->a`zK)ڷ5[dO hDKROOKZ.9Ӹٓ5< z!}Jڼ|sǪ<&ue𨦚A/mXy㩁aVQU53{byA!9W.^˽~;m7jt3nBZsqMp Z|MpÔ 2edFY0zxVbY8wf,QtPJ!+GߙD oy{1WwH: w"iݛڏSL΢har2yρſӦI:MHZ*/`FI Tr#ݳR WIvkfHLҡx_Nj`H ; 4ʊ=wH\)?w>麎` )'P=rr''K z33Fk.7^0,gָ8w|i6ʉi"=ӣҢaO&- !P{pvT(ũxT϶^|*C|hʹ=s;075p<{\h q9Gḓ OY Y6~fͬU xDόxA?kx7GmgM} ǯ<')~N8v~#NtZ jX84s%I$Ox Lk.7O:ڟݒϿSqг06J*p9xMm5&TH2Gx!jVY)h& #Oe>OI궲 ;IQ/#K0 'P!P,|UzGAxh[ f]rAP ZxaEʵt+ZokwP'7/#MBV+0 pbfߓD\FLH!(Қ N‹LD4IF:a3h8{3e)ݤG hS!j9mٱ R AK=f6*mk%.nAnZs-pmZ~.z3'LhFb`Ѣծ,~̀ o/pL,z.m"^{RAA 'P"`IH\$?AAKI%…~k8\䴖|+`ـ$.XAߡ_ظ]c[ $ .$ 8a^-\$ APop5;l|b` >h=AvMT *5[wMKGӒϿ^#3Dҏ+I+ YɈVIWךCu,  K箆^!7q1Y2?puT$3m3/hRT h \ޒϿZ\ C3v}@YjgyRAA( >=Xz-io3)M7Ah嚀c?AM.hk !)a`WIEAMfmcL ; qIxxX90-p]Upbx) EX\WbKL疴KוOs' EnS }pXaf(8f$T"O4%XX(u}Q>6l{fv[ f,HZ1[+v^ <kGУhn+4~׭3E?NN0ѵ'4Yh=>׽8A(M #2@ҁg%܉ p>p)ʴJjto`aa qReuY=c |wn Mi Ϙ< _; `ރIGΤ%ˁ;$֑]xI0;00m+ ICpxGe$CTCK&7x©ϓ8Ok?|nAϦw@iflff0 3659Qô )oAZsU8>m7PFZ%p wxl3k63 9 gf ٰj 4$(9n4X>w\of{f}HwQE3ҶK% <̑l8KR++%3ۮSPnL. p5~dts:OqI@xf6\Nv03xXw0ffߧNm~TAtQ=] xyΎ;F?-:Y]xdGֶ)]%E]qtm70<`6WA_5 4M 8%6Vu(it_̾A_ )bdzA4R86gljy f3{nҧ4p NQqC-JRO*pei3P\PR_ҶS 0pnNf=xx:[9>V/pez80+pnS%R@FPG?sAJǣ:i< )SiĜ=O5Ck=NӚMߚ˵:~ђR/P݉?A1ͬôbI+ nC?UcSg|ݢ4+Ԣ5p-z"'Ki069)J:E᡾:8\?>O#~ +qzH+6lmk[::㒖Kţf>-׽LT}#=TmyszFSx:C0&1 O; xogcK>߰Kfۀ6#+  = Jݢyf* c!kQ-j tnt?vVՌpiA\t +ᘂקte  zםGESD"f6x9횷Tg);gftѮu%Ι2^ICJLe+W&`{!YE*#;׋JH:ח!x)ɤs|2˝tff:0?SUTs4^I`, g?m}\n'b:7НؒTQmYCI˙Y1܃WTTβwfYՎ m |Q$\LvI %["0qn6W:_5 -OԬr*7 ?!5O6N*l(i\W.|%F\$x ڢY "9lg6ȉ)iO`U3Ai+lߒW[jKJ)~jfO4ڮ_ cG C2H ؤDq  M?9 9E _"vãΒ4}j\yZ>i˝$Dktc^Lk.w4czmH k mQ&Jzؼk(fv)pC^ŝw i:+~Qzw~Gտk|6*$<I)8W ǿ3$׷iIx%G[Wm[$?K))I/V{X9 /i׏ N.ŝɞ&`Ac8_A TA/5Sk.w&j/۲afKJ4R#Oa_LQn/£Aπk0VAt%W]`T2~iG3ri(x@2fv;[/I'^6 K4\_#cf2NMG+H_q_fG<Wx-]˒IIrf6gK:77.v;mG?+8웴3+A0k$݌fksAM rp:q- l//cw e&8lX[i}Atu6 A4 T}GU~4S3oGt|rj ?|nj‰Nr !9c\nZئ8|yK>|m?fviI*-z?]|D۪H  葄nJAFk.7^ء35(#9VċUT}AA- 'PCIGhi\-I+sXAԜv-V-<\hC  _t".+e# =vہZoʶ$ $ X  Z9AAO5 s' ؤف7$ݒ*lAAtA]4p<A?5;8 ?8`rхu_9I5ؤ HWʍ# :"@Aԋp 0vi8|~|_U2;{% jIAY_A=IAP/S%JFCi>?5[ Pp`K>DXIeG7:~&<ICmPAӧ@|z,h{#)'( x8xW_$-@{e[l!AhVTq$`ז|`fp`II'7ڞS4;GoIE&kZA8} Wz8t{^eM`xm z?{JWvr4l8xxx6A_5WCm/z3KZцU n7X̞FT]mf/l.A3 Cf-)UUIk:]w8`(<\xFÒvJnA1' IDATpS` bi/"οGvI3-i5I6ڦ4{36G N.`fwٝ#z)MDpQT3̶WLo>t@7 >A/ @5 5^o!A|0w?7ߴ 2Jئ`;ρi쪂c6KL < `fS\ˌ;?oQ`P^3{݊2@`q;0vZ7_ѰW4:_1 \\ xxnVOog-&3<5X]DzU$ L653Wc6˦Mc=N-٨rf&ǒǵyv?gQ:gtKfqOҚ8k+wWu`mI%jfQ9w1}Njـ   :{N?+Mx.C|(UpϾ3I|>Ig5N1 0wz}d?[}vPj{ϙޟ,j'\eA\epKH;-!~͟NNr̐wqi瘋q%Qz 8x"+-}4% qaxh<\>RFњ͇VS y`|ϲ=p4> jG) .IZ -tf4K.e|;z8 ԕq  "S9n4X>88t'(8)c .K3{+m;;uɾ++%Fv%N@ (vyqfafq9r_p~OpRم.W*eow2mEPI xYfu|t}aj7/I%J7ڞ^(c7i ]  ӝ@oHjQR% ov$m.)A G;RH2TJx/en-=NjAԉ\'*ض%Li;ΓG &)*AA#h(9 $MFsr<^EpA49L)=ySif \H%5%TQqEb?\I%$idifVD `<ĵ K䤱6afbh[E̾KL_9]S\Ruڙ)mp0#pJ=&$66+AhR}|aO0QuӠ&4#%YCn~C a(B>5=+lkf&+j ƔUJ^M$z4Cp-$;~, w2]G} /u}u Mx J`f/HZO{CҳxEARǵQhxd;x A DgFzS8W'J)H[ca` >>#vJ$ I%WYT4S`?3@t.& `5F+зƋTJ 3,}~(i`a4&0HI2Iyzq FC@f6*ٻzdҸu3"%yp'Ň)-fvSӮkhJgv/IܒxղQXŘ5^1E;K㎭W5ji=#f^QY>sQVy:IQcWN˘7qƱUњ 3f~RI0h G\WkIp#{CAз)%+"9rbJԥmJX3LoIU3x+}$¶ RŰˀOT\:Kcfg%^6e[AdJDN҄Z+ Ow]̾7b\Wn$j|FR ZsqJ bf2%m(in\oGHIK-: X6YRb 43 H z-9T]"\F\LI;UifĶo0nalK~\T6imfwHZ$+4ПifNǪltIoxhkqE``WIj_Ǹf'vfvk{qi`AAH A]s 0;32U[xx_92# yA̞I3s"\gLl * Sojfc$\ />1\Oj w,kf*+Uq$/ N A]]0fv451:M͆ë Ψ0pp藴r?ƫfV-seOPfW࿒fUߒ5U}&3>.af_ٮ( h A=h+jtf'x,K d6,) tFUOZsK;S:K"TQ=$ w+]"<ʴ#B@= h 䁓s7u$hN~"xl?L_8X_w1A1s$ ,i+3V&E  dfl\G zA!Aԕ&*YR6ncKz(f%.0DIIk.7^!77u=AIˀj]HRsڶw',oHΐo bzVM3'//|Tvᢴolt74Sm5R z'f À};qY*l5Y z>7 50 Ә4}=^f`]I K<HMG#,4 k@a|x)m$. ()JOI{JiA@@ޤޛޤ"Rf@D"ğ(PA@Ez-Qޤy'ݽwo۽I̳3̜y|:hRRa/=#<%isBrm_,&45` gmөDUWܜ^7%s d2LIL4N ggJp I;g۾k&ad7<۷ڞL -_Fe2GIZýرV É|(pB?ڒ66"a-!"1WasLk%KՄLh(}z-$uo&d2 38e} Dt!: L8uvǸA~%NE&Rl?!hrI3~f mWvc}w%x8˒FuOIF8嘆1I'$U@ 'sG{k`7mq,S/d2LЙL| \ ۟G߷~g66l?*nIsڦ>`jca9ee"[qI ikeOHtI$}xpX 88z{sZD=S`Vd2Lմ$(u7+ͺpHm\i?=&S-/-{jbTs!&n'WΰXii_Oھ+#S$ٝ!Чx5ldZD';yj*فF84[(j-QTt4Q-ld04Bd|D?gH#.*zD?^nV*e2L&RZ 4 0<(|5/?65$] \LE1/#R_}/>/>%:PjwL{5N`St fgfIBK#GWoX͟1XdHjFkva{&R$%YI7M/ II:^R$LK}*2XҹkIDFlX{CiL}XI߭+;,$ Iw~ھ5k<{"_}O8j&=n Xvq"lْ&yRD'LtIOtT:>S'v=`UojRfb@΄Ң_z$_̵ Hl)i=[Ľm*ln>t8]]&4;p)'D!W}x'4ؖH}oA8^!~KKZ+=:d2^2P4-@"$F*;EҊD%K_$g~ ⡀'T2sbzeiގD$e%PCL̬ll*I NSLf@cjV4gm&au,3q0{Wğ9mJm) }9I)EZed&d2 pywוX " O+׋K8t'iDXZ4i"=Le2":̿0>U3~PWN[2QadA$mILjAHMlYo{i`fvMn,Uh8&vk{,p=` d2L8Nj^h`ujW"{'5 '"UGLhܛpA/+y 52Mr Ćڦ Di)+ڈfHӿm@:`JDȉyOTǼn4/d20P@S֘WtP?j`Erk[LvEjl+xX?9CTֻ4#mLϰWۣ$+iVTJeVB׏dZϱ2Rt'{DqH_)DE֣n`QICӱ1t$M |e2L&D֘7wz}c{3LB8i_o` ޯ$mAGg2# c`.[gko֩LB>aֱ]sppK逍Ǥ%?~ ikoi3d2 yy;X"dR$v*-*BqIt9cxnޮeO > %Ą ۧMmJ]ZoP&Rl&A[o?) ¯IDfX'_ޒtYZmSJeF`NЪyz *[g7vLm@% j}lVd2 ''i]S$ NJ!+B$3rmx= éCچCSOـ%M֡$i ƕM7vQt %/wp?ѡdo""}VҲ_^v}AЏ$H8 8T?QB2 ``نp- ,m{\4aۻٞ/--kL& 'aD4s`k Q-WqMSՊ/K(>{y $/FT);wJ6|-}~%}^6`4"":h8KpCrٿ􌤻 ,wWM]DMcPnHfqA״̤KT_H'UNj)m4D*X#% 2P#B}ꕊd2L&3(@_# h{J_G#:ۈy$G>e{L6 ~WY%T a`^IfoB5ڟ"T©47ZDՎʶ>YҭdL. t~CɱW&;$_lfm۟Oc2_Κ5L&L '0.>+DN#mǫDR#mMTRz,Ɍ=B-`=1QbISL&dӪHD\[tB&1ט7SӭL%4΄&]#4&3`{c%_ M`)ב4+9XXophSD&d2D(?ي}g2L& l)D5EJLF[n7eKfD%qؾ+ûl?ZUX84.\&d&y&P&w$M[#w*x} kI3Hҏۖxo komLؾvN,e\5@$>$M/iT"d2LSNL& zHڬdZ퓈?nQ@ID,^g |=V./Ԇ IDAT9x#8y/7pl;خd2L[z&L f %0LfR#Qz̽R XkomLR \b:7F>$M \ &v{s҈Ʉ~Qo L/h} ,<}g2L&0 d``%52]ۖ /oFGލ"XSl?d2&@L ޴$^r$Pf_l?"i]wr{݉:fX{{~4^4_4u*s)p F8yxDF3F=^[8Nݰ9L&4d2`0=xmdIIH:{JeeQ1L!lQ7`1Ik I'[VyfVD 'Pwu#7ؖL&d꒝@L d~%Ӌmt' a I:VL|.<"K"rz$ m79L&&;2L3LTBd2u1!.m6 6 33Cm4mGU-U &ue2Lf"`P d2—LLwߨ PmOI2$$Mjy#d29(49dhIkoJs۾u*Żɽ433c IƖ'gz}d2LSɑ@L tVhA@h"z:I3u튓2gn4TR?N Hz1MڠL&dj#2L3x8xH(a?nLl)Gߕ4l[ 0~/LޤT3O%]cV"lG֜L&dj@L߱OKi-LMl i6vUxdۗ6f&ol"i{I,|b2L&INd2MAJn4F҃*iAI34{OQ ^V|m#خLwH:M[mOTNI+HC-52d2=9(;I6`4+HIھ8.p[M{ $]h=I{#mF۰Lf,>0 t}>7؄ ,%-[5Vf27a|m`KG~_T*z ;0[8}m_NL& '-G+^4E3R /4{L'$Nm 1~3.3ֱٓV@k"AGK$<)iYۏŁCO/{}lնL ,N8"Ios>"}gUˏc{d?$- 8s]48NFX8晁@Nd2`1*ۿ틀+=4wl:VSD⺙L|ұ^ g_Ieb[Z/={De ]Rf</QSՙ6katq74k?c*hoKi2?p .^SlS͔qIA~_u_#2L3xxj(`:I^#F!q#5RUL6? r& 15i/)O LB@81auI/#EL1vn_!S*cz~63uoږ~D>֬2-&Ge2fp70j{U^j]DG[2L!X>$-&7$m=K3#?V}R@\otnJ`@ҜD3c6/}ZmRI ok\L@d2<`Ia%X׀ÁGl*#3KBa$8Hx H'%-L`ےEhJ&b1P0:=CN q逥% i$] D<,b{"<"ecn<8I>IXrQ4G8ӌ _~W!izIBwICrTMk{x!Dǿm@ҪD/$Ąv `Y`˻N"}!DBed>ۨ6Rff=͟}yذp2JI8{ΗdўplWD5H:lS88CGpB>V"~a{VHJ5)\``Mvn "Ve[I/Ἵ.~n< +e1\K:wI~5|J#i%~Lk{|$scupS "?wO\{~vKO} !OɶeNQfp)ri kߓ Nm1 ɣݙL γma{U+~ulwORYA7V9tX{{gM_1/C3F[4b+i1p1utS}Cml G@ 3+QHZ^WrFD\R)('#s03Qb=: f$ eN~]<& "8X2 P~pɘ~L8e=HGJeX* ̇QKWEa Xptx5 iIMse4K]ծj+hh"ehIBKdbBsQ|´ET'US+? Q˧3~D~$UJS1P1eU=q_kI=ek|:Ӳen4 vD[wfVbnBݵ G5Jտ->#鏒k54H߈Ȭ:DkIs KZyd'P&i[U&DmB % iH0:bji!`%ۛCC$}/l *Yhm_HB+kP!y&iNiLN$-jCy$-'iIKIZ\Ңy%-iITV]˕OSjOr 6gQ`a5""5r!-׮Az߶Ll{@BhBxװi5"k[C h^k߁i[M:9s5!c ȬFk&)aI+ɱTMgFhe9$Ď&s ez'0]KaF(/oz@e2IA%B4yiHZXẼS$?#i-"w5jKTh'ª3FhiWSToPc j [h&&4(^4' Y]z]7TQhSg&RGYc~D)?lBpx$SD<(.i!HN"*bo#BBNJ/%jEQc@Ib5&lwQ=᜹n6ӡX-l'm"m"LӏC pI!;NW $3kqzz>C<;SQ@ቖ d`"$z;b[8nw-z'n⦓RNS|@Q&XQP?f'DH[:QQoX{+IKb~⡣;Kޜ5"n2>):/K3pE!Rc>^%[. 4>'l"'*T'-n&R64AYkI Z@{[";M4c$/il_ӷp`s2!KƗ({zR%JQ%+GoKg kO) axeDTɶ5mGk2*r<Wn}mF(6zNw0N7Mu#mIC%)t`c#:q\c 4 k4!qgl";2L35Q~vDS &!$HR6ݚ-K߳}uoXU* 1F+=AJ<zG@HBQ "&`y۷6ny&Se2 0&=1lob{'^=~(4moj{crٓ+Ic*Ƨ NBz$pKI`)/^lMEV|>Z![?pו(J|О{C,kDE`?uHܹ_z$K8c!e癤臫p`[H,}i^ [cTZgJ'<}ߕ!@Ҷ:uZ}5_RN?:i[S$o%rHڹ1U6SyĕyjQ\WDZS$Q}>Nm,s‘xj? q}^:&EIu0-(~yG?bUq(Rkg8=AR!U ӻ5p#ѡ{ Vg+'>`3mfmCݔ*޾[i3'=-D$[!x^d]oO': JzX`$JPJmª)eAiouѼDwp\֛H˝x8}5t4l}ε m mvs_S!UzD\8^RDmT_0p#}IC}q%MMF$@;Rv??]U^p=kvЙL,C))`QIS>57H:X^BGwxR/I"F'Fb;7~'%tNq{@]G%m u*CH!;oؾ/tkILwD.Jw% ۟5 "vOq~>c G*+lw'u9I dOjim dSi?%Fիv]ӏh #bIGk=]'SQ 1",iI{E2K[3QNQfg l?"VIv־@ԝ4_z v.tjd%!iVl)/'iB>xe2L&ӗd'P&ig@O%]%m*i{II#k oY"oMWHF8 "{bDlz քDx9qwm|BR8 W}m&yDSi.$<|}bwɴ_~5 Xy H_LC 'Г4zJOXH-}#$-gmEw˾f0Б0c'[iO38 \oZ`Ҭ-&&L&D)9lOGpQJ4$(i#I;JW/$$iyl? l|[RE v Qm Zj>R8 P}X{{vDXWLۗgJZ p= lbjɖ5X~aXXP2BK~OIaD=-QN'>HxCZghY\YzO1:!i I'HfC?ԔBı][Nd'P&i;?}ts?5{j}%BD:LXAa҈_%6BɞՈuN7L?V "tj' ko?}#WF ۾8AIt*w`}D5l?%DI{ニ?G8G{rGھ7b4IQCIۿMN>SR w`{ BۭOxt lE8o'$-O7V$ՀT$IGI:zc:@LHGmqLn<ёDWwM`ğKyXҌ]=xWҕn#F&O>U %Q?^IڷO@D}'Lc"l܉4b+)110\rq" *}Ll Cg2,H\؎~!Gu";2L3hc :DND>b8#1+4la?T$폀jL.VSҴ~$,IgJڬ2VԍUځ݆wH'f'aD%mo`;@gzM/[غ  TJFLۋ ,W5oI3ڮd29k:Y:4ǀmqcIS 5ߴA`R < |- @w ͟NSlltk=mt?aMPXDSۏaWf)M^#lū>H8{O`WIg.$Ӂp Iw`zዄU*{m/LD`.Ob ?os)FEw%MGX xz^ypFɶӬmJھv "Rneb ڔNYˆ%z16b{kdꄶ5nNRDtӫoݙOb߿ԶqvRfAFl j;uM R.욭֎ H?7#i-w2pZA6 ,<oɖWmJ˦ *f4odW#Dۯ]=)i>"viX^Om=̥ksF`p}M6m{8It-!Ge2fp"KI'b%Et6~"z$=踞Bt 6H!XْtZr:,Yi>΄oU*bC-Dŭ@zVv#%u)!RV!E - s~YjqU]Hݴw~F}&B4ǵCk iѹv:N?Ҽ]^+T_/mӤ\[56>1]{U6J9FsӲj,~N84˖A8i)͟t0nu,^?#X44|,mgXˉ诙\PuUmHaҼى oV9 ?u8ND,Z5ov(#G7uҦ=]wҼ%14߻AoU54e@Ӧ2gUSME}?.͟!].aS;=?s3M9(4ۧ# NCm_*ۺe$p\Ft #:dGy|ĈlMX뒆W$ֳy-ctW)X9!{XǵC?&:KV[%rU `o.II0W44۟H:tmoJD@浽kdƥSpL4x:[0 XE 6_lتm`+"-ַV.rղ?GptRFGtߺ2r(q9e` wLw:Uh}k~mqե&q4L(ZH=|jqeST˶/.}".d%#MQh(W@iSD8Ԏj_|JLo=LۮVj@:]'t"{ODm?N8Ù xg2ޟbs \C]D&[MRϰRrGTbi˝攫Ftwp.#iz"2D';|X{aLXѝI@=3 1M Is#Klws'W&^=zW}~K)fq"c*ݯem)i43uI~z^e UJ RGg-jiܝ^toI+)~s3KJΈĥAIF~E ]y#՘EQ%,,ivwԓy;^%#54{i*Ġe3xH,;h%Mis&p p 'ߑ񎣮k.t't dIIZ]æ?% lFtRִ9TC%ͨ׮vc nk16eR&ޯ&dOb$ښ4 Wx=iq TgemX,6Ph-;MjoHE睷;73τ3j4 JSw -TD/3qMr-ܢ|EHL0%U|CitW%&ivqt<|ۮu;Q컃j4j Y⼕kj;:Ottu .!u s5=1ZWm8V}9ȑ@L,&i41%1P~藽t?'01һnFKuJp"&B~;wG M* 1p/!8`($].irH}&ߤlj*D؜z ֑g^JTc ̨<":qߔj,]1ʻ#_TLڟpQH=l7rO0:Pkp}ˍ%u`Ni8%4;$kԴ8{ڮNE_bڕifFU7}w488 N\OT[p=j袂ag|2L3LG:Ju)t I#Dg$F$j(K@P7] N4)VJj7PͰOlN&Bd .ޖ4 Ph_t7r$PE7w~EҌD '9UMk=׼B $i] q-?4O{|)WY#'q>t]D@W%=<A'khoKTҪ:L*/$-,H|.0X<XK`ಸ{{Nh$Tj{fzGezZ#YOx6υ[sSj] b80_TGط{8Fz~+R`_f BF 9/Kdn 0Y`r9}&( ؜oG߷skqx0%`mgJ]3q^޷ʼVwӾ A`@ݧ9- Lm ï sWzN4µu}VuxmHyGȽIYf22w_`[e-0oZ=룰H0KgKF~1lZSMʻ#s~ª'& 0ϭ%nv1Kh^Ax+#eҐ-W lVwcI{#CZ>+,fmHUFIӨɅ͆Y}Wdt(NsPCkaO\hyB/Eȷ_Is㎞kW6ٯ%炍Y!i~ܡ}Pb/O-ߋv.; (;L*gدgMKgχ;>LtI[R:[f9(/qZ"iz`aɔM_+Ծ<ѝ@HK#/)>=fM:S ts%VА-2]gt>_sF"@IWf X>))e9cg[>=6wkj%K`e (gӲkh?6|i_-ensPI̬]kftC?Oyw'^~[$t%&| b0z텙}gf;?I=DEځ\nqC:S  lTXen[ iZVT$!D"DtE".u%݋oWX\0. xH 6+Ґ-F@NBe^2x`a'=0l$<͹U)sZ$D"]D:=J_pkِͬꮌ}*2.i# zxږ/źz}>_T?r*q{ t$ ^ 嶔h8HH$D 1(tZ$M'`c= /;y&0֝@ f^5Q֤f4r:ާD1 fv<{i$ҮxJ-YxQG p"H$TD"I% 6W:of0!,4rrKc] wHĴ,^f6F|-iۖ/;|,"Qj$@5fzIڲH$DJtE"vGShsJYJո?ȊfvJ9"+f3YҶjmO6^ IDATg!,܊PvNٕfvjmOpp%[4b#-`mz`D8XD+H$DDD"`f`MI?|1428&߇w964}^kc: ܢ`V,!F}>~Eꠘwʷ1kkmS/n.+K4(᭭8VlҿmR/D"HfD'P$ue;.#hl +\\0nvTx ŒX6OC.1p5lG>@U֪xմni--IH/s3O JS hw]+i$ Ht0WXf&fz{W $ N LDR~ Zӕ9ff-uWλHj҇f6VD> DAp #|f_Ư4=^e_`{tl3Jj ,<`'I+DGParh]ǸU fI%,3vE.L 3528x)SI/6N|4e, п=  p}ֆU-,^*}_{hjI٥X]r^ͪy%M€Tԛ0}6`4TMmu]?Y5%Nou D'P$=B3C_iNAH3Jvv'.ëvԻҐMGmUR޻15%ҕ1%m&|ੜeu]hp 鏖,'iEhN`f 'l!:NjY9'w;99ʹ]F3#ie3xn.r6˃fH<\e`몸8q3{0fkDwYb$P$iw$(,=,(d(/p3GbÑlc3U`K|~ <ԛ3w*m5OڂSO3͡;5qp1l:I'O9t~e@,c8FH+ti9I5Zʊ 8 =_K/I:Y{FˁÂ3c}\r`̺[ lz]\r< `<] DڍPt`GD'N{%Ba+bk (ƙ 0^X$]mXבta! D*!Ӽs{%$bPmϧto>5!\ҐMאwF4X!:ZăUjlG "N%-^ ?k>tmS'<2"!rdfoe8^m2OXǙĮ7ۀU)~I/ ˘[iX%`:]pi%i)p~.o!}Miu"W;&~" D*G6CCWw;ϳࡼeW ?ࡠÝTԶpGoyR4r&!-D`|Ƕ[}0l]IH2Hk0sFGǣ4!"7H# ψcitsP|V@/;̄Nx eSHC, @' ãmncuj~#xr}aM+Q%ZbrIt[/0Lj +ɻs;xZi4O]R ˢϋ1ncz;v3SLͲR~KRޖKO~J]Y>Dk. Ei=AR͚;DCxi^ #=#T"Ge3\RGGKJ҈G͆gG,ICfr:$ ܂xhp[x)3E*ґDZ!i?`|@+;i=?(N!%|40t*Q[If"[>A-T߮?xL֙؝MoOĦGlf[VĮbi<[HZ]k|;3˦<kcR"]ֻDI͇q~fvDX( r<him[ؘ)Gz4"lxh54rrҠ[6Џsfv#.%jmO@o')4or J:IJtS@(\W}kHSWTb iITz(L*0֛vˏS&Y`^Il*dwRmPޞ/!/%9%ۊ}KNCk|vpzB,tO:.퐂;GݏQg!:"HYHZ!T!x8.`fYZSS>y40J3Mi,٩1gyOC.7kC.w6~H;/cJ酇f/^kC"]r*,Uop l:YK@'Q@if$IJ<53$hdO1j&4=OR_QHTa9IkrH@7,ӦML!YY3~OR!QcQcY&ͳ ťKM+tlm\7433wPn]@ԸvQZYm/ ?wͬMZf|ƙ)NH$RI=$m"Q̞ٕ(@$rFh*0PgU;,ME'vHZ zH灏}BE]0S,1%j2A$\[hB9 Nl'?}%Lm?G pq:$$x*ca䷬.l#wON:ᡓ}!4Q2ǫG3ǫwbo qX&Z/+^xAN1whfw6}%wv,5-jiQw 9 %O.KjWu&:V1/h ӌ]tN&@< LA+'%'wx>>C{^ßq+I7~xŸ~i͍#7Cs#R4r BU$Zf&Rvi2=:z~Ova|Ŏ@tE"&H+iw<&%"f64- 3 /'yUKȬ#|x5H9aZ!!; Q=ԈW(F?f6^6rHb{fv0٪͉xE#wS9=[ S|GLJ̀;&uzW Rf?`etGk/5 Sx4W^z '\j]{D&St0´$= \ "SjWz2E]aKFo}7Pkssd?g0` JJL4MX+;o_=IʛCۣK%OH{ӊ8 ms>;c%=(]`g3+dבx7ؑh}Ԝl0`A^Ɔ%^/I\r||/kX4"}QmR89sw%=?4tJ>x8QR3OQwL-L.TѬStiVfхgf|%X&݇+i Vʬ҈336lLQcf4rsvr?#KTyizHK4mvm>b~'\ m(i#\/c_3KX|W#~o6*Pc攡f5:jmaìx5X39 bf$«7-X@. La)3X[R/I{٤RE"`foJ: 3c+#mmnQ_fO|cl+MTM*zima×4)orMREhiOmXv"|#<3@c4V!!d0\@@H zy~8ҝ0:snjҕ\}1$mM#4r3+π*HsfvDЭ>Fl怵YM2BYl3D 0DX3{ (Z8+tR#݂cԳɺinMQv#I]-(fT(8]E.dkUt6ٵJس=Swris ù|$hD"C.)ߕ)-;J#2^e,wԧG_2l*v$ZS2:H?vE"-MIJq1]Ku6-MKD'P$M4,CBn 4۴[q7G] p^2C31fvOE:k:!w4?# $-!4\'Z𱏄l7YmqM'0m \|6[>IGE_/Z/3["N%fǵH"HtE"] 7W0t_ pw;Pѐ0z?>ºpcFc ПvGLtV`=&i3{_ m!.9U%̐KXT:RGWn) / `|>R9^!G'xdlV 4H )PcmHӰGtE"]I 9"o nMhf/!GwُƩU'I+t`h3` 쑖,ߐ#66īEkR&rlIWI"7n[ˢxP3"L;ocfS݁6n?D"V@HC*AFcxK\b{gf/N5aʡ]ss2>rK9r9qxg=>~ݍ8Qҟcvٯ>24}]̚T Δ$ D"@H o;]&nO7'vcj3!<>0 jsyfJeN:4ݖҼƝ>SjpwG/l輌GvaHB˔e~,"0B6D"H$*(H.3~Y OsIR ղHE13t,pazDk4,Ns'H;$ 3[jmSs#Ieo jHefٗ>HC1mpc!i``jX3VDQs K$ tB$k ̈ = ̾myf6^%xZǑfDZҖxGji= \Czc!k}ӼFGIp4 "i%3NH ӂ «% ia[}sƒ׵qۑ"@0 >>pw>0}W+IR/tq*Up"`]/?R0IxVxTlw ; IDATh1HZnllt3{$d}&H8y lwm Vh{k[ fx%#ĵzwx5ڗ$cfuhk87w<>^$3[:>\%;[ @t՘D:V~6ŞƝ&uQ}qgA,s8s]KMJ ^0ӧ M>//zS%-D/M΋;t=mz=KZ8X l'{sOuX;v5Z+sjXm$HY52NB4Q3=+cV3&I[NKizo9쨌2Q?Ɲ@ONœFڟD:(Ay _\C_I: ŘWz$ GtT S:|;;]⒮7JTxt_h۴3{?&n\?"Jr g0Xx%2md0%8)5+;(^ϜbfڎSH$! =σ(=_CZ jÆ{ QU!뉧%,;xѱ*}^RPkc"-Xɕͻ?(1.I!ieŕ6$-;fh),jhfvfx: vbfm0Z3k%iV`XXnpY$IsC(ׁ̬qu~]]Q`aA/Ka@`0w3*LW V쮌}k⎗yjgUq')KxZx:s5|*4Sl4_7ُ6c3#iQ`W``fxT a7GR/5:pGKHXF x{r$6ԲݗRam92IQíK@H!싋=O?D.2oji[XnVXQa%iģfkUU"4rJqiGO򙇎Oǻ>D:f^;m*| oLSWd/͵1C+bgq-.Bt`O:N{ؘF(U~iJiOZGUV|>IDJVND$9=N(wHy(j"O#ABIÀA!g.i`GIǛهEv3DIO B~;ev;Tz̶.Q&fV w!Cㄔ:%ϲpD؝/xo<93QҦdҤAAI/IݶKR|nbfU>ŏË 3F8̶l [IFaHSp H׈| X'%];HZ̾3$σ_c٭!L3B[+͖!f-pgՑd'Pp\;0OqGޥ0ip'ˁf6"L\҃_]>0]gf[wH󄝀À,}?=h],y\ҝmľui :$r)y$0!D GG@bϭe` I0ɟLnmSTX lvdveW`ZӐM̜d%N[,joH|ښlY^zxdIDGPxu?9TU& (wnSEx4'ޙif/WȎT!3Xsxjf;ߐI2[$*l3ku%V0 v"v 488sVff#h\0I *Y0,8Ʀ@ >gԯKhy%%p' 43d༴̾ Q$'G?pGݒ|6-=̮H#~,iW<߉&_#SGQZ|:)i?mfh<2lw3#IdO;C:;S \Ƚm/ʰ2 $?c4 ?K ϭ}/+foItzs[W(j/?ȮŞmH>$O'Q`^=!ޙO9f?ZT/`H UOj4$Nh7QX4J9N?өΉEE]?ۜf%.P4xm$9[O14B ۊ+-;px_ _G]C:8g6U-x@ ?Q| e^I=5$g2l>_IJ8t=̼4 1/DK@l |#\|[g<%qU=9fOj0O3ڣ䉀l1"U "½vs`?.Fu{fZ J6lsٖdppG#1 e}*|4/>*u'T0*iuʉ'Qf[\WP:BFʻFc%}iW-ʱW<50Ww9̈́t Pl.R9\_lfbU t?OyK$5Y`f$M߁vtaXcʽ}*ujfOHZW;sT}HICqW Z^q3[B#i9<X~݅#dHk9>h^I3E$-.iNy~lkfv#3ZwJ-F u4C}>?>߱>8qW]7T%#h1D:f -X9~arIFq,2?)IHA% \{TCG9jd'QI%# 칑OҠSMAayHY ٚLk2b(i<3<*u4{g!٧hfyecfI#JhtPH'A:lsxܻ6^֮&ŝ#i!U]xx/<1 =C4R=Sm4 ˭,TR$%כ[$;'V.j];Vɵ' dAN,cac4pXj YLJð ˴Iֵ4p(u=:א[r2K$OO ?gs&:r3xz`tDA HZ5ra$n,i[W&q=OYXE23'~ ,)-+~ģ!O8<v76Ga\i\+ö j"2-[X~ \$10'4i]N3!1wM|m?錣UzpF{ԛjïp5 H%i;I/~4uZ14#$/IH=<^4RNCC&+y9 ?>P~}zkvaf/}U$MޑT'i<]C`Ηc| ~&+L贬O:0}SǣWlDT{8r]Vڋa>3KZmbg}}%-Z]fvCS.2[};$4TSF]<ڔM&Np|v=C;I֑\sapZ *iԺzGSYX$_ژ0-}'SrSFcRH\ɱZ ?'gGO`I[$]6+Gȿ"3Cx5ysmpGE$;4wNN2t{qffj=πE2kO̞)y܋?`fS=݀p%0%UI-;5 w<$ꑈI;cn4Sm?pOTӝlfeetکi Y_I\lLjfZj*:3*5}F6ŵdի4%];glmf׆u>[uƹ3')@:wLīp O/3|eh mlI.1>ϚxipG#Tis~U0?7d`<k-eꗤ2 M[¯fD$efSdا' :i;/Qf~\@yLff69 Jx×nsro3++eWE:ٕ]{ /Us3)iay1=g,|[ă71wzSE?A ktK: l9̦v jS)'EfGj_HlAIfz4:Nl{(^l̶[ANMO@SGjpf6!3Xmf秦r݌GXmlfes$.}%L _i-vО3e ,@_sdw/Q_m^? v1/痴_j!aϭ;/.)0H F_.Ӌ#js;̬I_{^\FX4:wp5%u X!i`gez#J:{ xtAṙᝲAfm[l T x!OJw=g%t"VAAY/p=^*יleV igxg\GF($x3h:{u]EIU#m0#Lzǯ6g}Ma ςm=ar]8gg'ΆxüNx^fSX$qzH$"[$*pgKpQh"=Lx{KZ?3/4Xniɋ <܊u/>> $Ǭd_g*0Ec^|IS3ww!^|[Ri%]GC^\@|Ħ'r:>ԮN*xZ3+TsZDU wށGF">4Xzfj}H,t,u$=JH1/rڎŖm"8 OzveJd#^xZYxH}hU"[3q]5 O8'&0tpF{"_i@941$k͂;%KkH+yOSd>0ٓh삇fyFCI'pTXG+t̚L |l/|dxIwYn搂v  p7pW-:9B 9IᣤUqu0M_&ɟ|P儎fdɖH%&tH5X .(c^f<#:"H$R3zUοȎ娐S5R˦;+=R:5md선S;Z2bpfȴ+m2;$%)e@wӦ+Eq94m;b6֗4ǣՄkpͅi;ʸB݅}zz9WI읐y5pȠmq!"I ?9 #-e,I#uh* n<7i\Ntxݞ=GJSΝ|=#4W-%3'C։H;2.3P f-^6D"NTұE^WߏoCrۄ*adG@=?I7e[D>)|lqf6I^hr.~_b)\ߍ&>{2?jЍO[H{`xgIszt$}%|6Iwii3[^/H$D@#=[:fu?8)!J~A-ABb[ NpŋLv2;wݽ3F IDAT<ܽg^9ܻw/iy)f``QIKN$=n+!g`I}|zIC$M-i3+bqg1IIIR?IդFuU$- ^NеGq 4gx#b'HZORoI*JGޙ$ 4)cGu9 8Z. 磱En I30KMܱȍvu$=FvXzXNr9I:B|%\U%$]g'7 @m'S;VDM,QcS6I[D"8, @Pø+E.;c~"H$U!3˼ 39+Y\]VOJxE?~)&֒{_o<f+"8|7<⥌;J9.-7xcrxݟ˼dTR">ojaCtx5ݵQYÐFN線"'^lXzJy,jyDIt?3 KV-It~jY"~qoAúK:;O$D#I=Zy#Җڪ=k5G5ccǍs#ͬ44 nkviFڬ1(aGzwFf^ݏN} [o}2u%(H$&NJKăi`|Q˹8J<{f6}o`^`\g?z.f6c&#iJ`J3{;EXb @KvlJ%fz>Jt$M kfip}1%:;᱘79QGj1$"YGl-6GTE\ẼK>&/> prc$=~m&leށ:L3%MUMDL畛}HԚK,H`f KZڑ#6a]^f0$͋j {yF#uf6H莜7 @REOleI9ݘdf?5xBD_m;TkYUҝ@I˧D9/`z)$5^e*vꐛD[.+' &b#P"0zUݎ½m}qxXPb"~xF9bfK{&&Nʌͭ5@ez࿳gVo"=aO$:3{HH$ڛ/G ϊYʉ5bf'͗}Uo݊qsݓȸ{1z+Wx1 >?)^Ph\,Wf.)&K& >5%-}FdG"fV_Ez3o+\7^y!*צ'kp;:WkBрw;?1*)i#`?cfc6,0)n\)MB4DҜfPPe遱f\戱ǍV{am cѐ/ ,r3JZ?gOY7#z58ps}> טُ6+sO손 w{S% +"F~];nZ$D]1f]1~t$&R$-L!`_$48lϭ2i`1p2?*'bBMu(p$q=M_L-8B߭oOKZq'=K$튤M4[X8ytGIt?"$-^K]aoH#oΦ7|y 3++msKCaD}lL ps3O3=.2%-{ /~^6C~#fT~ ,y^{O޸غp,))C2IGa3z -!afJZ 7>7UV!|IO=%_G}% ?%}/鱬qܽfJȧ35 okJz/}'ig_TsH_#e쓐ω'.,p^k,Qw55,Ig[|lByYlㆰ*;R4VztL҂Zs<HLܖX'Z ` ISH\RIB:Ꙩ3fkhSR$%o'""\<\9  $'i]IH3nώ/ N TN=9pP:cf/^≊ @ )&i%܋恜(xXS>cOL<09'ÒWP{^}AZ 77Ev)9gRa4IFn5_#OFU'ޒÍ@Ef?|nM/܋=RDgnͺ`'-ER/oxle4S*2cYكOJdmJvg7Fd:]#e| ?xd_k>YhZ) HF7\oE ^ وsMFDsn3Hk\4f D%zx̎"]I.=f{KIߚY[re4["rÜ{1ifV _ㆣǦO@l h dªzՐU:N}W۬N|{IUssT&/U<9?盦:̬ ڒru4&Mp#pVHt-"J܎6af_ g"jV3[ ,* +᭖{ef4{daM3M] %o >}=.6z,iRI"(x-zcVzqJk/[i$=^Т2ghAvVf1!/wjlKr25wK*Lh40҅$=$/4$=+JIH!i?IJz&4a.i7%=%Ry|sf[طLAm{JMҵ^t"C~si c ;8&.Whפ1MRoIK%PTᅱO j!0'ۢ0V/I{I_tm%M֔V9ɧ/踲%$.5QSҲqݬX&n$]/wrD'^3FDSď DM|eD}ɾ+MZ/ }z#cHQ?IƚlhrINKy;^\Z:ov>f of􏶳HcYdzwωG%zhOZsv}nTo#쒂m|)T?+].܋E$"^`eI(5zX>Ȯ=-{dǖ֚L~ggI[4xی_x~{9.0bM`yshH>zt8\Η`^y};쳔qv߃%-Jǟ2cX↌,_4ncnTe|<ٳyy[7z)+IJ\QOc3ޒ |T5:ͅhRoU74/ivM'#ж?nd۹J3}D>0uN}s4\{wp\;d/}8%fbۮ+l[zlpP8 )+m~KuI[G:4zՑu07z9y1￈{ۀCfw傼,q?y0~s>,Bsaˍs04T(DKeXS3W87vU y΍~d[qNʵ9׾?x'B=5"cYVҴ IK_Ϳ,?j`uQ}h(3;n{%EMUu# /7kYDbż$遗,ubU+py7qjƺ26f2/dPlwc. mL4)nxz%cIbN\㧀㚘ܸ54/ {cjks9py측л8W=^V)9ٔvݎ?/3G ?g!Tg30B>^-[h; G++npDzyq' }* .i_`ܓ KE#7fqŐq#~cjv"6 //c~67nG ksR$gZk1?ㆳn:M@do gf_K-i$>3{2.cqT":Dh,Y9yI]}o7/+HTK!'~z>>MK"8C^aZ=نՍQThvKOmߧzk,&n4n O՗2D6W澎9eiHm)]B2N]bcDβ7Y0=df[А`dbvKگ{j^0}?qӍ*D$7 ~4BA:)a~FR[*&x/c%D"^Fu*u=g畄UvGrcwP+U;KHAҹ*[yXoJC +iψh434ÒIj}H<~.+ lTh6`%Di /8Q[FZ޹[9,9H$D"ѕ!i A=!4{$y$M,srrj4UJʪae_SB&t${̀/&wI&i/!,i\4 I!/g끒v4]\??.i qUX`3` ([p}po+pob܍t99lz蓨IlzH$&ȗy {ԃ4PRਖK"rL%TSeD"i"q|"QKsN\DT | n6,LI;Kц}$*iZI8ϳpeNTАnY.Ά5%fB9uVHvWYD3ԳB\^cǘٿZ1x~Akd"H$:%Kފ$f#0.lxUDW(I+XpX,^f6 ;ErVsPoEH7}lfcЛtYTْ+3㼦*]v k 3 [8xD"HL<\p$しz+hOk)0O;WN`Wz+RrTEfYF⿁:9p߅'P"H$.Bwk*V$Ѯ̈́#wFUL$*bfmofv=]K-~2 llu)axc̾0gOP7OD"H$yu%M0_% =qMtO.7ݚ-.޾ofIZXp!0u)i%` `ptVEoMŁ_kt6p=ٸᕋgSV<`f_%b|=Fb-n%0?;13{X[uq>xkZgY`U`a3'?EfH_BDj#4{3<6:C qqfV8N7uH,,5; o0ѡow*%l,&i+3+J0)p.kmW^0*O H$z+v*iϸL$`fB`м 풦Y8 t0O<Ӗ@o?|yxiyVҪEe$m~K%Mx/tX0Yu/09p29o7BI*1n<8[x^Ҏ}cCk׊# %^6􇶎st}~H{K$e{} h`n!')ڝ l,k[<ǫkW๲܄q;P= !1O/I#qcրXIW<DžQF``&Y 73]Jf% 7Fq%&4*t ܋tMh-fm"ٮ+l[zlpP8 )+m9L L^o=}6K4zՑu07g{/}Ǿ3 s^Gy_<'o$wd9Ox9y;ᩂ6 ٱ|+'{+1'0fZ0N1{9%58O{}&)o~)-LkO!ߣ 8gChA~s._!_>e.ϩ!Qh%79q-pp |{ɾb uB~~I/l`\SM~M 7eAw5}Ę䇆|^ikHҖliDI=s퇆`k87vt]st$[]O"^HZOP[uItE~zHLdpbA6i]RBP/djp`fZ:OqbM|sd:sL݂|P{QG>ץ'7| [~ym<*a{>3̮=/qV i%͒k9"-63{!t 72{97f*3{%k /#/)T6[po]$-\}r}X7ւ)#Ϥyqc1́&ވaQp9/.$}aYc0N%2]umӗbazUҊytKm30J$Z$bRIt;IٖDVef_f ~ٛ7y`ɵ73{: &Y X*7V$fvU1܋{B^ @WuUcHxdߓLPbWp/高Iм;IGH:7 ~+Ygz~,~LNv~|de腇elWl)u}6^+3*=ߊy+nh|(V-|bffB+ c>,Ȳ_KF'K>?yf`MDZ`1ܾ7nlܧX?u =c2ia ^6yŃqWD")fmjf[Dc}z+HLDo3>%>mb,x(J~2 PCyJFWC/VGns%VCw#Q7 (i}*y?GC>mqaf_Fi &3lώ{DeZB:(^x[v %[J K2>ẓk >s6'OԐz{%Q|fvfGMH1eVD"P$-#BD<"DD%#B +y-df-mOzI[=cfk^FƽhlޓT߯n[k 7-jfCl8pFoqgaVE%UeoS+7-ugكchuUxP>io3m)3{XIF.LRy?5oHtj(es?Q{MLd[fv\o]Y*gז,>J#Qe&4 ̞4xNUt[IQ|fQ#4+é^fxy{zB64=領>%da웡TVc+ d5HBҠT![!>37Gc|(yY“ cA?h撳.oZm&8̉?MxwL\~x"/ ƾ 0W0*˲x]H_7*?쬐?'{0^e{KK26Ay;W'1SC=F!L4^\J^EHgojBIlLffK:ؚ" s7qr I3Lٻ4q㉅!EU^<n.VɃueISYxj>3Ym%OƒS1;r}Áğݍ[OhHxg,_ᆉA5<-C#CM/UqGKcqc1F# nzOn}6Kaq^rd`g`ZWF(2<pVs`b$͕eN+coA;3v.kӄbw| /So"̆}%7GhpI#7'7l-x̆)\u= Nk0^E6wے-e[p0kA>ޚw4{oN:^}$iW3{_txóĵz#ZL&lfQfWI7٭&LXj-0\ҝ'엸KýToIrI~;ľ1f8I9r>"{;3$ 7:3l%<(z74S?H' V3DCx$ƭ=cز/9[>F%S:]fC)x8~]~mt>x,JvǯQ_׾O/ eyESq^TW1F~7j3.v +l-LFfFE{K*S|^Q~48Cn>5Dfǁ;)I/?˙S!JnfsO+"*c 3ۺum66+B7]gf1r3qcfHz~n`RYl|8o-fK>ff6/?l̺/7nT6V7 ;㕲np6-ƛxǛlXg)KÁ 7/J=-]k+1ϣf\AHŽ_8.~W[ 1R"q<9g n9"c(<כFt8{n`CgInLȄ^1GFkqϢ̬XaRϻ=Ȑg̏?_0 Cuf6ene^|0Rϖ U$_ۙ٥}W5oA*8o~I^jܱSK'GN縺pnȜ ^3^fvSY4@Atw˳;f6>\.!/ƥ삖藨5eXtXu <3=df+=jNA $o F&گ 5S }(rIzwAlff֨qi,[V03ɻ_J ȹShU3/'?7mIIZSR/ĘMh[d=J23_/ fÞßdԊCx4^.0ͶJU4D=]+`fS0x?sfHsh=nfcZcx1y3ƶ ɔ[\Y40cfك]$%1we}-0csjfofԾ pمGܵR2xL,3}=Hw{7l|/蔧R5ˮ> Z7(a*Yr.cG"i7@_G*I%SCB1o;0IkHYé&`Va-V!qL1Lf.9 Gsk7W$7쉒Vjų#i;K>X^ҏH}zJ$x/Ibs$^Re&fs'D"H$D"h23x`\H7sfi\-l{gٿK$/xy2 &{y102~4_'28^F?%z7{|{49SdW܈sg2Kt[,tx >l昦6 z/#6f^hjf_X OpTJҜCfv_+\/ aȍ7kD? 1I}|#<(и+~=Nv⹾VsS=1}[e`+[׾!;zƄ~aqcqs.i? x7~n.YҖdf}PoҖ-miK[n# p0n8 >WwJ7. n9!۲}~-<, 9QG. &9YOnU8(ȗ !6'ؽn^ܸ0WNjgB~7dSBTygŜ+5l|dۦ/q\Pḏ vC_.ڏ,,]X>C BiW)O,{nP6'?x(qCQx$+w {5Qx}pcЧT91S1|sb諾5 $i[ICc۸F9}\D"H$D'"oժWg@][wܰpdN6cN^h{PJ3{.~o0qB&Iq,]7a>17"ma].ƕ|Hn'BIkvJUKfviɸWO ,B?𞙍 74.T4_*?} Ga*YFv~FZ.L̞Ž|]WuQnlyI7I:FҴn ;-+*=VӒo=/H$D"^Ɛ%}oПP.0k{)IKi3@^pC̔xHKv7E^eeʟJS}_\2Ƹ8 X8̮˄aV,Jίᆞ$= i,,FY-*}-Ow{ffx3R#4+ib3;׃xD`q<9f CQ's={vףzx.{HrL=+7n$oEg 35y'%>OM4>,<qϞ˾=}M/oK#̳"i$.4O<1%SkSg| ?*)- 0Z҃pZ([%sQ58Hta$mWi(Wk|eА5Of9f3MxVxKZ,?Jh3۴_kK"f2M{.HZ̪z,i1<#`8?6gE%t"4xGIkՌZ?[ kT^es_bfۗ> ell6̝f6}&Fdǻ5_Ӱ7~-o絞t`Y4X wu"Htg>ݐWpCq6J:Pٕb%!weO=1~x_&f]0lpN{OHI$:묑HH"6Kـ4HV~5;F}.<G-x^Y:yPJ;̊j࿳T) b+v% n4cOMk11Dc 5**bES9 ܻn{~>;w9;fZV5:BU^5̅it)\Pm,&ȵD'cZ4c%r̬zP~~]bm~4^t쌦p8.," LtH빵ڜ:t{EjOaK,&"/߅?YDwD^9|s$-tEa)"CD. ڜJs~Ey:XT*"7:"SzlFNR'>POVU=GUaяa!cn!w RofkG>@kLֶU C2}|[]흗 Uy~.sux@)zod4U5Ȏ"qjJ͠`fIIDdtw0m xPMD I\`d,d8TPww9ʟrlY_mwn<^|ά%>Tk,Z\Wr͆a5ش2̵Jc7ﻏX@^K<ߍE.KY~ߦ^VŊ4lݩu$Zs;L7}DsÊ"aΑ6BmݜB&=ˋ1& Wz)ï웫+.ܹ; E?B0/s]EXe󥡓ܮ Lr"f.G13lVnEP{=\#"N v~TC :$XĶ?cKiBr{`,p =y5Q{F{w.oD>3*t[r"(Wqh>:=|>v& fK;5˯V6W%Rj>l߉H9D͌Ȯi ^-~Sr/w쮃+}uT\r IUgla&0YAƟ0E'.3'cg[Su1AZG% tJ0S~~]4V{Ss=7 \+,_&ma_|0Jؗbvkoa;$y_gꋏP.M`JǟwҸZ+R'K v9 {w` `\%]/4Ͽ3,2a:]a~^{y:+uϢ=pAA4o`Aa?n,Xߤu)oJ_¯<`2vfu b16`ֵ7qڹ6`?J7(oL2G@;s !%[:?ONm駙 Ω|0~ 2g\O1։؃za/w z{){2Mg/P/=L]PWoOmd= a]nb Ic i/yGW?~L,515(&`k__pk3ůwaRgo?Q>W3RHr0a%ڮk0?e)gdnڬiec}Na¥=})E얫m9/W瀂:WaHɂ5S mW?zu/Tc~c,V&HBnRl ,myw*nL4Gp&3%צo-1(/_"ۗ f`_VSM!ivC)vW0 o !P;M!jBނ;f= <27OnM7po41o >@|`ߤ\;8E+oߌ53?^??TPTb?.0l | 1!k0s?`¶pW+߁k8bE&VGUzqp_$u}l{S M L޾v=0۝E%76&/W\_0tLd_9f`a{RÇH?4 TL槧" q߯zsc6|յ̋\6WPw̨_ m@ڒ*{a;^WȯsO)BU/ZcK~9u\{!{rc"&X)y`~6z/2a}}\׸'P邲[l$ϻ {OI|)ѦHt][̓^}BI?ju+h7)XLj?O B]=Q )ε {z&1$k[>JN:aڎI`X>ԿX;ϿDH=+pO3=7IPF׿$su[]]]׼@'M `)pL.^_r+=L(sJ=rm3湵yb!X.?{VWao/5&<]j="E()RHmSD2Kmq -_,<6V+zuc)7Y-,jOr'cgbj Sm`q'b3wf%!:Y,)92q}L23FMǠ~]P&AATMCeqU‘M|9Lڮf2GD"栱pRS>FlI2m6ٛ }\\+"ԉ@L &eZ"̬9-59Y=}T]yvw^ga`9^Dzys }>tu LYD2%+)qϹԛ $-?.HcwZYDdn UW;cUՍ -9?5& ID-Rճ0SMS)"7|Xn*)S Gh?f׻GD4`ZSDH&ǢeP=]< *\5}'=^g7P؛ű1u'LU}X3Uz{w#6k]7j~p TK y9} {-,:IyH,"̊ PUQf|{>Ͽ.{Y q|'|=)t,X0_ Tu 9fIc !5i<] mau~eW=_x*ƛ\]Lg"\Z "bZ꿱h`$"L>Yh3fvZ]_`N4Ag8e ̑3,ݍƅD3ˍ֩<_;q.Cu/kD0y {,Hw`S$?UAAP̷yzz|\UGS^=,(#6`!~ ? [꿰J ΫXe?qD#]=dwN΁79X{>?k/EFU*p)HY[,I9^> \ϊU"̠>NIέ ~i:HWw܉z3:?ds?ݿK]`X$~`, `L~2&d E#>s2G]cEyuh%EȟL*y]V$"]TujZ|\&""$Of'd"r*zwLs3_N˜wMl]S5hrGbDdon]0AwrL "r_{Ii YPo&)۫jƎ^\"";~ŞXZBޞtMʚ\  'zZA PyS[T?#"16i$-od93Iӌ8R^9LxtȜ!㜘YM7`U}0)DLQ`H^w'#0/frZ8"7jp,sgyUNDT83~4A/ƴBR8m)h%[JuFU x>~inz4+ǝN3\^E;N@U_ZV)! @!<)(pS"`@?UF3˃ӁT*15hmɬFD~gd@等kɶ}//[lE~AA]k7`fYjbAЎy Rq ,͜tF-gWlMo:dlsz"#4  c$#<9vPՏj5 ha-"HAYܼZ#2BAAPzÜ8_r\n\wƢ=f7L}nY7Nlh0-E=g/̩}#<_v0375qg%nV^0翑Ime:Ȏ c~FI1*37J 0^3}@` nFY myǘM-=!U}yoMwRRޅA#^"nt:{f~]Ue bku-f 99zIbZU.ucA#HlT{3gA%`{Rł6ݰ{cc,ͪZhtzI{j sbȷ 1 RA6^IZk #J.mz J҂NY{!"aJvNKa,>Z|skLrK`;V8W4:o88vo{D$]u'asXA9`N}̡ ~|nRnN|e[k:BDMaMLH&JUL5>c{>-0A] yOLsvbB!qw9^g^2e w"ݗ'J쓕am8~;SEȱw L7^}hgl?aҿ\!"cBN]xRD.No??YXd<:jmPH"t74z^"E)RY Ω\6yrü~].v_{x'fWwُN;}Ufbx,*UzLL+L)i6G?| oLr8Oo]tΘN1U67{Z<\ɵ%}4&k&tY$?5y Vo!zKs?6b\mV(Q<+i c-/ Z /9)&$<+Wvruw,[K:L\ݾ>{V  Ǚ4" ,!"&$W+1\U~\(c+\L51M!Լ`??@҉K41Ry%pP~B?A1U90pZU߆>O`>{83&MRU?:m&|{c\C0~.ǵp.7[jci<EY5f:v1f~z U{48L h'PAA1Ls`96p.D]&s4?Ǘh :MMT}]s\ǏxtÔ~\̬z?ya 湼1[Ԃ1LV´rry#0/aJ9 +cLcfe騪s Aטt-09b^} ZWs_Ä#Z{R _4_&ydz֠"ID/˴^kqDA|45g`ѻ1m^@WLؚ48gȚD㽗 ^Rƿh|MRB0}_hx}:hiY|?f+{wa/<GijMkEdږAAAPkn.n Ki;E-hULt;m BFƏKHMvK8-._EU֌ȮM1mڈ`>c`Ѫ:{5ٵ({miS齑]-\P73l1~}4ѼԽi|l_]ľz8U= mjV(  Z fZA>S@-L! _+PU$yS^{`aj[~,6&"3)j'b">EMEDxR: "sHQr,{EJ\dDѾipi/>w˲XD1"vԾnETu3_;R;M   ).̹̏4܍E^e0;?ӽޏmWoEiu_YÃi# a$;aSn,Tw\S?B9'PX:/!+=1')U-"-}SK @D#TsEj^,\zK~PM¾9-jX Dd~w(7,'"ߋL; j\>"\*(  فLgL˪qȝvŜt F1q0BCҧHW7EAUĄTۉLA ~1wnEdwY@D„ 3=|gOXK""1-gkCEdXwgb2'^ ,$o$1~ekR78/[;[`u`E: '*Ddc`t]f꥽nOL^Wje%&SD~S'"QSmTuF3'1!RDƢM4,X.9͞5 )kg>Y85s݀'ץ zOSUMg& ].=zWr7E-5ژ"E񦻡ݠ4)RH"t7 .MpN-Lce`~I.(;44)_3x{˦ Vώi3%oI_c8hs,p`&y?ZnW"LUy̩W*f.5zy $q5&޽3翐c,X̬Nz :`KaѷbE};0vv7y Ƽ ۜTPvl2V_)L48{n^L7q}Y00AQ>Iu'Þ/rsWпK{>W1F:4W:*8lo%汑ǧ&b:@L7&cQ;&t `4vP49~;վOAa`k9XooG`4u5-ri.\u=yW\ aYFj(JYűYt98X[UB#"0Ȧ֩9=u} &@eB'm WoR~&>ׯU*錅Gf޵BVՏZo0 jQrZ;1ʱ:cbL6ҞsyUjos   6CI6w:QiO)7X6CUǴJ""}=TU+^ӂyq˙c|i!ZڗbZ s-f Ԧo\ ?k&+V JW&Z\ؤL1mw5ڔ AAAc>b%tB5Ylik<.7 AAA[̟ɍ"r,9`&y;Uo`K̯j9A   " paU]EDǜovfAAAMzUE @AAAAAAAABAAAA!PAAAA; @AAAA퀈CEzAAR:zA'@At   %    !    h(    Z9A0 *ҵs `dvk= !PAAAA;    !    h(   B    v@    !    h(   B    v@    !    h(   B    v@    !    h(   B    v@ZO   Dd.`$mUe+P󹪎i8sTLUj5YUՑJhAAA0 "E2mjk7/%eWwz-`f뺂-"i8? Dd)BDz.(7W("Gjغ \]۩̾(  ى_*ꃪ:l-`֘Ti%Zcz"U}#d9\t&!'|k'"G@{k9;`AAANLǞU\e`vdvr)pW'T~+"SUZGρ]hAAA0[ "++'y5NFƍǬBU'i4UOUSy#4   ]8&ZVDRf"2/+20vAihry=!`3`K`4pu; OexxJUًg7>WRAߝ03@OCQUuxpA?0퉕I>:)~N`.`{L&p~[vX`20M,sWU[ XԳnR:kx\UGI7z{ҶV^n-/p_6HR/lO翉75|u؞NU'Tπe4UADV6^nΡuGU%u=D$ۏ/Ռ9@AAA \L 2K\ ip.تzO`p40YR&9> 3ixCD1Ѧ[DyukqMDc!Z8> x3y xT] 9׀ݱOϗDdդꂾv{_~yID"roLx6zM%,9PR9Ws= 7+rI̟0̔pfV²> 9xAD-ECDd wckv]_}}L蹉Dè?NT5RH"E)RHj0 1@^PL0ѭDKj= Ǯg$]1Ae In<?/ |=,goK.8?4Ls/>u:$}1@\y_{^LEsôe$|T5^=`)?;I:aO }%Xh0.ɟ:?.\.@ѵkb6+m:as5Y&?WJcH AAժ:@Ud͉=%;bQVgLUv4D2Ƅ%kWdf,|NC.hZ"DxUM݃?e+=s;s14q8WaZ'ǔh{bޤ|U35E8 bU~M+:>IY&Kڿ~ V~cVsm T=p4o,LTu*o1`*TY4{xX=Vc1-!yŮ9UGI   )n)f}nk5X{;J/ KVN_H,ac0!Â4fx,rVfDDVUg&io3J딝'2s24F!"W01MDXD:z~7DD߈ȩ"rfD+1ܡ0aߴ$o?^Oo5D5EU_)8RM{QI("_<ǁoIB   j;2"2(K ܡp[=; oj~L2<2$KU8g1ԜK9#"{0j cŴekt.? ZεąqajvƋ,x&"|̉iue³Tu]VD6>`/OF/i|=%Xn_B5n)E}fפC%Ȯs[0 ;-\i)&kp̼ w#Ek9ޏȜUGG   5cPҾ|Yde8ͣ,ȴSI5hEaѪĄOU|E0/y2푯 *~bcHk;aN}UucL>3 ȹ sLUUؚ2?ʏDs``J]N&(3Evk0eTu#U=ׯf K$VQ-G2S/B   jk] WCO"eјD IDAT|YPDzȀ\fTU 5Q1(6KZ~ŴƴSTpzߍEˋW4F㹦ayN"2?fvYZ}K]%Ed^8 3WDlܛX?U*"yp,25s/(n((#"*"%sWb=7% D4W_0 ZmW0 1!LfVFv~6"[e-L?ީD(\+A !PAA "`hn,>Нvt>F2M ?f~U}35k}뒱`ަf*Y:O]1)9:Nv$Yqi2FG 3:كqv}lIƮKNM}.]1ǒ58^6Ԉ6T>撵%vPl D*b5.ŞI^ML O6yQgiS4RZ_1ljɹ,\Biĝv\F{9rEf*ӘEd?,"|u:55{@v^ruz0:Y1wɔi2e֫b޳'s>RH"E)RHJMҐ Ul {E [(i*%bؽ RWA'm} e>9~A_}|foU{y* ^K}´>'gz_P6`5x*&hx Wp}œAO4˞>] ֦1ҿm΂qDŽ6}eNZK>tL٧>O>ua2IM4^ۑ^nAْWaqqI?W=1󍴐q~ݧaBIݧ {R?plO´z$kNoI   =" NhDDbZ ie%"20 PU?hf?s+`oVcG,Ԃ`=U>zb>`ut-Ł~yE>keSqMԟ~& fkB(  ƈ/E/"R3mm3;7/HK"V@gW!Gnؿ!oYMGl""\-x95(  CCm DdULD7PMϢQTuZ+uGgV3|h aa1G6nNc״:tn͉6aAAAP{Q7scg}p,Y@sd[ufL   jXyA{DUG#[ǿ[i:mJ   ""EQ qBqս#U 9P~U0.I#:OU~왴5ff)p3&)U}vUEd?kU IDVbkp[S`YL^w`_`y3jl, N7\ w \bN/'UJWm1*OSfl, }2Wg|9%|<T2t$lV}"*fb8 S{+l6SUFV`%Y[Izq_Uu/soh`'`e? ?&M˹>BW=:%MĂl}-~DUt#|-6ɡLѹVJ  = &`NՁAL {8@DVƄ0'bnّc[5)[6II~G?vnOm6$e$.V0Dd `&ysh$p&:xWD/ pf2&xx y]M0X.IYr/.X5p\R0F:,"XG99$"bBk`´=%tK''EdtK8\e8h{LRG"R'"gc&,"C+t"~^ b̟6+zˀ }> vDŽȒ3y' d4$"k`8L@&)@Lhq*=N#";x)Ǣ>=cL<0LD]ݽ|NńOjH"E)RH"$`i^&,h3y=v.&v~tw\x3mvqI<6x޹<[o/| [:&sbQy@F)I߁bbZLip.*%0oA/oހ>N`F.oYI^g_ ik{V_>P\ʞ?8<_Z  \ZDUg`o磡NJO8u'U0s8p~7L=BFC>bfا`BTuzf33MuI0 ~bBTl=/pnWuN XDC>1M$Q\[iLp:Tki똞G#Bl+W| f>w,V<`&h|}'7XD:gcez&0? HZ%(  cl'"Gȩ"rŸ%J4Ӿ^sPGe&LC̴<fo+kOYf>H߅iּ&"H//{PU"zRDZ|,"[ok J]oUuT.U?k*&zYUhk „ 4w614{:beA~J,3=+b L6}~yӊYyZMU멪o$KDzOg{uU}VUhjj~ /"ݳT[4Ul/?33"^z`BBAAAAfĝFPH'ҹDFW2#7bo-YЮi0GL\'{|kpkpLC23CDu#i=!3JDUo}_ќ4T3"s$]JJJ@*攭m굔O._-WDUD?)札ISs*5ǽ̯sy/u*BU?R1!)*sY.5z fB   j4Q*m?=z%Lc^ "ӎ(xQOT,DAu8$UIU]ρ=*АXZrS2KW&k~X*I~jNTjA{m|s`^gô(+2*&T@ s΢*t3g㩨gœs3 fAň(Q?mf}7 yѮ1A"S0z 0Uךy4eg;TY[-˪j(    o (   ` @AAAA Oh= SDHFV+`AAAA C4_Tа(   `    fAAAA0 F    Y@AA4ߪFV)Ȋϟf"04>:  FADID/]% ,UՏHzGD.s'jl= "C9ŀ>z|#Ԩv@`.*D8XAAşpp0 CE7\<,dzWP0݁[݀ ُl)"׉j ό@AAA(`lU\tWn€RՉ"rЪQ Y0CwW%<   h  |ͧgF"<   h\7N,F"2Y3@-"aӰ7"2t203 m63B D . fybgv{gxY6&^kbWD$E{ ['"KDڈXMep!0I럂}{I~ϋ X<ǯx3bȍXl͉"2GNꟘAC̠Tm͋] >^VE+~`'칯 <+"׻'u1`Fozs.u1#-@oYm>DdK,wզaC"rFA{bI_tS no==K)_cv{[3vE*޿0'pc* x]DpćGqGqGq4(0;.'k |ytHͰEe[,t ._hy1̙\[,kF~Ղ>s.&'3Nܵ}<+Pte},&y~9.?:>̗\6ρcXb[vv~,3sN.(Su @|}&3-?6J}wNK{um\wmW+s ^.{3ޭDu^eN~O)w~6#<   hj yܝ(`p&!H:[4^VC'`#upI \XN'" F ?S@b`ߐod/=KcZkwGnOPWt3u_BԻRQϘGRs`J6: 3 R&ll_CR J_hfc~<=iaQ5o+gS3Z2 1kשif̶O983wXXz"2{r`KTdxYdX /9f Mww\6:XU3."ֵ@  IȮX(%#Vl'5DYf( "hP_$#K\VY[='f%i LAjCmeA~9`! Zy_BL0 IDAT.S (굔Ϩm~o ~F>Mș_DUE?\锆EzUrds|)J>Zu#mz34 AAASl̻f>^Y"[l*p-Y "ݷ"޻cQ+"KU7EH3&"sװݔl J齀oUm>5BDf'aISJr'eEd}P,7ߵPVndy@m7\MO6BK @N s>Pm|뼜ﻣ{sՕ*I䟕(#PAAM_\YbC~ޮl\?o/pAe+U`FOa0eѝ"UvҪd4oa{S9\Xv'X^j_.V-|m6K}xO†nJQ0)m'= xױާ'Y4f" ŒaEXN74[vɞ6u/X.T7 #PAA4-f"Ҧsw۽ f"ADBFgOK*U/`h c5sĸM'83n]}|<ܤTxC|9s,\-s~$ц4"-uUssyVDp}gLձ7MIֱ~+[Reﭙ'~7/pCf-IVշݹe;UG@;%f@MU@7de~59^Mޣ>8#8#85#EsKU?lWP ZO̫U(@^uccü^^*zXOIc1 Y5_ (lY3^kw\uQ,, 3[@SlIIa[^oP}c7)里<=} WÓv&gz 7Ywr ,kI@?} V7`[A:=E,AG kCf   4,]vG:u[ c{bƒcdybCap]0c0UREݹc]}FcZUGTS=fg̠E븨vϓ|^U{,Q{t¬>Tբ]tt[Xkak~Jm6mwKQY5F    " ^غAM#PAAATLV+Dd1`i`P@,     ̈'PAAATh +:U ZF    Yf@AAAA(   ` @AAAA;XAAMYCS, Uԧ!\wgcSD5L"ZUG7>AxAAATxxux\Ⱥ+" OG+RDzgU6vө`&@AAA4"\'"{Tvf:@U7hl= ,KKsW݁3BTu3GAAAA2p0u &k큻p+깟n4AAA4eg@Ug'f45AAA "ϥDd_%YXx CU: ϖۊʉvog[` ,ͪW~DTeluͨ0rVDdc~uv{*5.{EU6͂ :()o\6 xYU(G9MRgv`g` ?UYg 9_UJYX!]_r;U"AU鱩66o\ Y#c0CmM AAAc{aGrTBDz "BD`ɤ<&"q:t=.no\%MYyU.>5EdUйkп ,<,"H۴/"Oac9x3#"i~V!6CX])o9,OA0DDvOQ1?櫢]znn:z 7ftkHV^i=ӭ5k'"wcj́@'U"iJD_XhZ'78ZDv* GqGqGq4ʁy(pKu6.[BQ[.?&'@ǀ9\x/; ں-( Id{!خ_s# `% !촜~_9.!_ f<[c^1?'fj5ypn׽Mkx?Ck,'G&し湺W{ݞ9.ߧȚc/Wwamw3O   fZ,Bļ&˵q#pUW?_W\| ۩vLahyU3NrRƯ9ٹBv^Uշs9%%/(Q7p`)vU9]?.WU'}Ba;?"]DVNTտJ"8>3ϔ1O9RZX(^Ԙ0AAA00ٲzX™c9bjC +?쇪*ɏf%HU'7 |.Kk$m4/c`1:2WZ]?%"RM;5!?o«V)7Cwq&951ܻ9yo6Y>w #PAA3ꤜ,K웮kyM,MȒ /UG~]W~)M(Q6*!όLTVˤ~J~Lʡ53uׁ̗ d8t.U}RZEU,Ͽ'pN`""s #PAA3cJG;XՑ"ϙV gJ~vgW3^ *3YdxVzAѸ؂oZDrLkjw ST_t/lUյAP0AAA03.*"-ˉd:EӃc+?BWDGς{ /"?""b; "UuȜ>Wz>wf: %@AAA4&YmEd?)+WK_` "CE^PkrB_DVl>XYD$"cxuoV""W_g;]AY&o/̋ry\Uu,]9,F"ҮGd%[QD&|!/4u՟ODj* #PAAIyWij5IDǎxYP!"yjyx2#]vf"%ppf;$}gkI߭1ڷ5yZYVDV¶jm׋cs7˂{o3y5 D3 C׿1/xHIX>ɸLAUSzIK_kC9gPz^+bl=︼EnۈHd<Ǻٮ:9]&kPk:΍ѧ"APG}qGqGq1kY̓V-ң*(k"֯wX"SeuLB}lܗ7E^fJN>$;^X\ г%k  l[sjau>Ķ <̗[/->みI y 8('+rަXُ>bW&u0{?l}I;m)Z>ѴQM.   s,cT \R_-H /}m[Nb؎Y#ZMRuk, |xgբMUuυW}&JX~a:׷vf[Êxk `*a   f:F'(   ` @AAAL)"Á,I'"r_#M   f<98U1 D    f",   ` @AAAAa    h vgUth^WշE@K9HU4> U}ȊƉFUU9b܃   D"`sUݶpsq"RU>݀529@/`UUK[gnW@P6U}!)[XǾ@͋Ł-̍VƈFD_gw# %?תXAAD`7bƆ"ң}rןϯ?ʨժz0D׋ȧ"Rd<X,\&Զ2988Xx^D%\T_ ["B5UuK}""7_c=N e@k`=>L5ZOh<}?þP]x_D(AA TO U [pUY>ͱʛ`G_bd oEd>`W`k3YU$m@;ȓf:b9NU8`Mkb16u[ y6]Ӓ/X^ToQvyxH.yP8~" '+Cl3<#Vv{|lc62y?f ;9n&Gb!nPDd!%_B|6+c?edE )"QDd̑En*"|O0Lfa12<{=X~-;#}kɿ+y1H7xl̆͹;Tɤ~TNJd%u5  Um [_D6*(?O3CĹix~/+'h& Yr>T,>uv"Ln,ϻ"ҹ =N?"9[@|Pbjr~L.z;56^c 7c3[2`9̍%>K_;f`scc.l¾_{Y0lvþ3c߻aؼ   U$:aVB^绂e[>(?,/ȜLE6Swr0A֣ ?Smдxcف[UUsewbFR۞dJʨ ^Wx1o{2V9o߰P:zg 6&x - =90ߔ\YY970VD-XX%X<{ t ˛<-VŕaZ)dPUDdI$`N/.V0,|nf,yקXU*4g4J/y`UMXAibڋ\>)" 钒c2pp IDATD)\d$ɓ1D']0oůA~^ʡS_uU=xX(4ˌD ¾S0﯉mAALA9ʺ8 ?ʥμ-:(&d)b Q&ieFP,F̐ѹUv˽Ï1"r1~U]r׬nȮwCXX`Y,ĩDU+'˼ wȗؽn"+ȣOrF Y"  ߪt,5 P<bUm׆>Eϭ@}^AzK>͸HiJ 9%tByPNrTkJVʤuYNyAYM<~ƍq7aajQiAg?W2"2 3 .}c"r"p-YCAAMj@\_ra?m ds԰TII/ 'ۍhnT/1I,)jؕ& + l:`rlWY_sW׏r_l1UU}oxB^{kS1bU=>-RyYPυ } S̒4uN[DoU}|%("  Du92.4pi^ x(`){%,UG@DZ`>P.H`6_ۚMD.kPN%Dd<O$Jϟ*,zUs圅B\h\Ѹ\K1ӢM4B,Eu!JC2̾_CSEH;;~y[AAA,#F9˛pm _-(t:2"\UDVzaO:-.(;,ӓL= B7c "NJH(f*:3@"lU }ZHDO|ɿw}qp' <آڼLUͩr)KU("T K^*1mk"%zr "ς3yXףX"򩔘Yx4c,"kP;GMy/Uд"l} SY+`F1z4yPgo׿SD6pԵwM祘̯e TR=R?Ffm%؜C Ӻ %`AACMJpcU[atɿ5mObS_ntmہU_y{]NkOc ^mlzaIOʣ^_{&I{szy ,şX"ف-ǑR[Xeۍg9OUq~#^~l!tX{l38G5#g/c^: `[3+w!,Qp,.[ ~9)[Z\:O|\/kfϷ^X8Az6o94_? eZXO^ X>$,TXo[bz1<#o-,Tf ;;f׬dQ̠{_vv<vҚDy5zO<6, 0Fm,dse776{<ߥc1~>fm]mY, <}K<8G`۠t*q}_SHlGzI1C'bl`[aHZş֮/>⻜&8r`>}FPSWi-8vvUջGkZD!*4pVN<*8Ym+ظ.-~i.:i{]1˪X(cYj;m-@_a`WjYɯEd09x x8CUI͆-ącATJZ9ytcO׵E<*$"$hNE-}ϯ˩ [^-Vn%s^7c+uĕ;>@UT쌕~mƤf| ٹ\U,S])c آ p"fkSMq-5oow1R5!"`ffy Ewaط9x3kU;f'̫gA,ͪz[Rfos>;|w=E#/a"fWUr!!"SZaU&=eܮ7 6e?UJDza蕪ڻ  XK4Lg"RjҐmF Uݱ>ӓOum1Ǵ!nm7~S>ַmוS)oHAAB}ySGU]ri1mȾz ԭ)Cm۫uo [.3AAA0F@DC    fk8Xc "SywU(JAAALLo    fp     @AAAAa    #PAAA,@ٙ 쟈W5EDzOzWcTUeoɪztie`DOU'MgDDdo`^9TUhL}RDd `YؘAAA$"-oz݀jN+\"Ct>h0#\ϴ)7]C4 ^vyl>L7#fl , L5?ˁUQ#@17F&쩪o7>AAEm[ ARCkqݸ3, m"@UΓC'"B}\֮߿(`Yz?=mȵ>U=@~o*tzDN"?jq5U PWxZLUT J -؊AA3u {VUf?D;0HUIGֱ:__X} G{PDČB6`Jcx Rկ*ϊm`~L٧cMllEӱϖسZkg8v f 7O(  E'z2 T˾7R9?//"5&AF,\x  V@/^5lp`}`$p>X^we1p]4r."݀pفiXY8XE}T2r  "8X xDU}Dy0[ݪ.Bo΂X|سyT|܃Dt!G@`Iu~%"]#̀KT餭mxU=4)ަ/82 < `Ϧe@{>T$F~ZUujs_U$͍͉-w`Po9X/YQD'aN|l_INؼ^{?`ޢߧS\9:\ػ09|ϧ,iދ~3l~o=ׁ/u['`9̖.T%k#˽'j8x6;45"K\884`M`?,coa5[U_)V犮GGܫ26BG{/+WdݾBjUU_J?k `-x{\  "~QDd|E_%Kfgr~. @<FzLDJ 7/l=E|e7X-س[>Tf2o._-m=/at˗s(;b,亩|f8Sow""Ԍ9N,Vנּ3M0/ųR |@w)Q7^ T+yĕJl \c߉X}͉X `` 7He{\=\?E7R05<3D+";s":6w?;a샽m]v}{83n6o%% x pAAہ-28zy^. W{WC|N,eel"Uw*$>ʮ>z䏹|*묈hƼS9i5]"ooD!gqDvz軧픓s\o-.X< S _sXNqA>9"5|?.ɚ1D\ZmytUخwytr̕r\~IAzYDˎ.҉la=Qg '#ҹeguςɘȕ t R}VQGܼm.0'וW `dN 3&VnjsU^ 3+f[ srds7?[b侷%F+d+zY\f~aklAzjGqGq1s NUsIآAwaiQPV="r-'e\,CP'ˁtV-x3ŒT5=q{P+dڧ!Wck6m)"iXԸʗTzrOuDoy/Z2XCR.Q]Tl 6s]룟}݉?S}mkrfhlHi񢖄;nhBhExϬaߨ39p̃FD6¼;Tհh}9{x^pͅ0 efX媩琪N!ARUQyU\X^E?s߷[K}K]Bcsd*v*'?E R)ga>ju=   6'taUzX]la0ON-P|,25*?bY>VՉe^E[fg=ZF+]GkT1vJ(~RRU )ǰ$)!Rwn*<-ΟUX8c'';r}-8;c`^*P1O>[U""P5bY="rfא|U,""s'JeA[E+,P`ayDd^U]P^(0 vfqwlTB0HˬU$"c"rf }QUG{(述Bp-ɞE2COooma7:MO8~ tny$u: ݃  rCokMXк2d)2tXJ_k#u\Tvs:mE˷:墪cC'a9jrQ( "{{YJBq4,/"8p~\e3{J\-9pmT0#~XRr̔'>A09v<f> IĒ}/Ri 5eLDV]i"2pݐ;%m,33QX&~^|T)d{*ו;ҹϝ({?f/(U=ҟio`_?FXb}G=m@MY =sf*i:8re{,Y$ɷK!"`F Xf~^bY=AABcz$!!%D9' M 1`s4L4`l9LIgw{zkz{kn=0n[%FV4#s"H$DG6lRuLdn'8.Jeac |5¥sQeJZIҦe*iJIIjiE>IsߙUfnè;ټ7_n(n%gdflw\IޘZ"`7kBr^,xdOY9Kl<>0bdI3Ū G3̖Ѿ65*mI3}Oĵ{ (I;b$d m撴[laI%~ef4-qC;Xvn)$ӚzPz%uЪW"هfvb0XҒUsb3@RߨyTe9IцD"H$!]mZ7_ۡleJ,BxwZpZvn<[G\&#iz|ŲqKyPƁ\X({>IݿH 4nz5iO!YquI %ʖJm5/yWu ӿh 7H^]\cq*oXr0D"%Q.=U}[r,L/?;{~|/_o[rlG}5۹ go.ۣNo'ݫpxg|7 Χ1خt M$D"Her.i0@,!f2-A HZ5 c݁>q@q%4Mmkr.yLAG>WHZi,r= (^$mIs+# >ڳJؔy4n8fVDt]_mf * \/㮷+e[li^ϥ!W?c㓓E<ާ@L˴!L3$x=p#O5Dž©"1)zvt%͍n(i +{ۗNW;gc34&syB~^ͼs6\*> guS3X}Wy{ple\Z!(3{$'Îx̼* 6*] P?W8-l!f{;W|~d\>#^nhLAS}K3I$D"HLE HR!:Zk5jO͍1w)UmIՃ+.1_U}jOVst:*J3q=W}]]nD"H$ &P3m-ru5Ԛ~[7>)ʡ-izPoke9S{ʴs'{QitTqArK$D"H?T">H$Xe#m]*U"H$D"H$JIJD"VF[^~mlef/vTD"H$D"(e H$I=pſm'D"H$D"1@D"H$D"H$aD"H$D"H$D$%P"H$D"H$D@R%D"H$D"HLtw0IS;*OBf]!KG!in.z3J$ ߛوN{M`;.물ۃ=i#F#])OI>0R f>0VDkHX=toyG\m U#18W3{4'v.ڶo z̞h|< +zH$6)#Pʛo``~`y`6n$8Dz1s:[`r #]#6fy/-NS3GM@6٧(Wk̆+%.׼N@RIW}߁I:Y ډTx 0piJ I ϙfבQ54QN'< !"^;MA3>f/q@[܃g@]@4a>`RINdf?vw63$]uee$ށy b{ʻ_̃c;Ic;l938,g쵸g/)FySG3^JԞ|: 3ep;ӱH̺V?#;*N`E` \H$n̞HOFπڙWXT`fwwHx䘛N|S['&5 0cis3_HL7c71Hc0KΛ/Ȼ2tB&v+9nV34_ٳRjq|+3<5{)6˫|X;]Pg;3WYfA`g|g[ɞ+G#oŀ)쓮$H$MiJ_ j;wKژW3{#-[?fy-R}NP"^sg([Ƙ]-Gbw#|E"(d*H$Oڴ~v!~e$-?nwɈ 0&@T0H2'19؝v!+ V 6N36%]K$3{%W[7v \f:~m2o{8EWyƌ%ގn̯ Vx\hG)ce̶xhffh/m'feq`Z|[>(_e}.V'OV ` 8+oW' l;}?`U`fJI>0>Nm+ǖ d32(@g/fCi|~,U;ϹF~l=>kfJo[ۇkUKD_9i[u|\d+΍o[ >if)}x̮nY]o+Ь_;k9 Ό_߁3]Qm|vp~.ڍx?yd.l3kZ,A}A mq^?ᶒ)44Cxw7cMH$ ]"~VCWn !i|4mT`*+n9(G⃒ Ib7>->^߃m|@yx;!'H],.!ǦQAp pJ='J3mgck\(~2i%/";Y|m}` $ >ƕ;[HY׿Q1l+?2pF|rt.9_ Rޤ^|GԒ*my)w%'?My6q" yG1+F8Qy:'TJ2:E.ᓠqΨ寥]/+ut-Ѹ֖u_!v|{vi;o>Vx셷 5/|D= .Ґs5׶=>Ar.J˶ 4lgu%>C uExᅬ'0O㓌%Ax]8[rdƞN5f]7F(;vnvz /Rs-z0q_\9aUf"ʁBnEL)=G/C^6.dXx$#kn+\1l<&iuN ~F:kNA], Jwܕ;{ rp|<8W+ێN'ׄGm(J̎?F}3QIS#JZ/Ak |l{+)x.f8rr9#lE\ve.P\-Hl/ZHkvo߮86۲ʷ>b[.gC?ҟW[ o 4uŘH$fV>0`V>· *I1|0?{2nyQ%Gycisᓳ _o|SǶ/K¯ G#6}~L!|1/2pxsQ qp'„2 Xo(/W Kwʅ ?΄+W- g LJsFB`B,^ˎڅ#Gr( .ٵ+ qo.-Ș?#TR) 2@\( }ay^W~o;}uoq:?5`\xw|0Cᜃ"~s8Vlp?/p~{./w0gs6v}Tr^6ؠ$pEhLf\Wq|Bx\q60Y3q9ng\џoWDMk(?9ף a='Ŷ+/,X88vd.lkԷ"ZK"|/&s)=465Bo,з?s*#Vh? ³q ih|o ~̗'z̀- dci-IIꧫWdM]bgK?//IZAYA.7ϲ?fv+~m>^uЕ&-΍۳23{4̲U!HZVf6>9_7|yz7#'=`UWBAh|~:3yšn%y G2ͬ~oy-3[\#N -ff⫗-ϖ7V݂Oc+Yh]u85xT*ȶ^47~l28rSl32UyO(dy)( DVƿqSa?dȯ?~*GoeoCeFr*ob=.% z?/>{U|r>:<,GwLJ/㫽⸱MĶ >egʟ(Ӛ3`ZI}Cyy+e*rr|ئ~6C_.;F{Mݡ&yYs/דw᫷]+G$D*+ⓒqjfDWzKZrA? ?p< rm÷%+'ߙq"u+2v'9I}g%Z?V6Hꋿ _IWn#hT֓Kš=':l>:̾ %擁%݊/5^4I606'.0"}PZ(+Նk![ Vɛe[62RތtJlLIWi-){} oC-s@|`+706^$-7?S «UsV*=k;bU|; Jhlu!˯u_,ުj-vnWLK/q3+D*4: VL)oKiRZknسqӌ=~8IwF_lL"HL\T 7(ZynxQJb1O]b1EIXGZGJoϦ)ěɮy3[Ř@Lϓ{oZWT4Jnlfdo%Pl+^6ar}͈7I:W+]֒4x@/I*('>^0?nL\6n߬UXm$SMD[d%a\cfGCXu]I3Y&3s=tY0Zٱ_y۶TmZ_0_b |ST/m+_4W},S#iVN/A,[E]mɝLvo4ZԇZ;eۼt nZ9K%DE6lR|yu&{[?젤eHJM32#z2$,fJ"YQx%JvJ(i7Iŭ$FR_[l연[]]fңhIfxI$ 0o]V mT×$hOYۓ3,c`f/-?IѳY G(;V-61!ٶb{`wvIUAI 3ss/>Z;${Al>v-Mf$m#Z:LÈvzWݦ{,ĪǬ^gۧ^W PSgno4ɽ5ut~%{>ܙW<for/ ZWVquⶋlWIE%휳_VcOIKfv-o솯L$6 ]-gmVt% Ol\ǒ[!iIאFzvV0V;qM _J _F/ܛDFwڈ]_%-YI&߸UPw9c@ qOAi \:Ӹ*{!X{ZxO{ڳsZ"[]ͩ娼e(:j26Y%ٛŢlSQn םqrRDqhe u oqù=fI * k޲G742QdFvH؀ *ynil.Ձz<\.$g>F\h i*-nl]yG ҇FWlZoB)uD{JY•N8magN0(6i[۔=_bf ~G$^ËM" IDATf4)ӈ@ZW ߦDaʷM-a*K|hRBҕ9V-Q.ïyK5u6Յ E|.w>Y?2J\;(;*bfOi4g!!ig[f'vo81H$&X.7 ^]v=لk\߀8?s+N1;^Íd7{  5Kj1i*;&\H8W`|ݼϯ4wG_kqeM.qMGG>SqXi+{w-d~_h!@Y| O N22ǖ'چJ7nű-uܫ/p#Iڏ!ÜG5**s~6zn?\!|q[kK|\iR|@nQ|g?eC޸W)36up{[Fwطls*{0$YWR|{)x2yr2>*t8ot?Wűz+ގķm_ m0-O#n/|0WvReQ)m9!sϸφ{sZ42X\p36@GYoOB̥ 5~X!w|*ʼgkp%ԖFгʲL'G{vN"eU fȹs5?}N%m 7ޣ_Tk+E:SUY>F';qOGo8#&c2ܐ#k%w40+~nF[/߅~/xܙSKF3#q{>^ȞթQbvƐ2! pE‘R4乾筐oOqZ^-5j}?*;>fz˺qB^?stǻދ_f㽣BMsyz\l\IO߁4ƕy_6 cq6p9Y gCQ>~'t6k%y}A7Sq/ϦԍqqK_q:|u 4 "#""-ǧqzF csqۥ| ;~sw4\EhzT>>̌"imA\H˹7 |of yFٸ7 დwYfQIVl/I f{_ˏqܵn%Y׿;^/ (fE}u\s:m#~qr|bx)s^n\)=32>_#lT.޺Bֲ=iBA3;.OՕV +X!ʂ x[WgW|}+6N4JZ;*" װ@\dv(V,|rgw3ivrtOF1kIPMlܳ^|x^? oZPpcof"I;/z3+; Ǖ"ǐsSI#@=G'mZkJ=;2|ħg/ yJ$LJ 6,i% ։D" hIF/m]$D%sCq-p[D"1@{eD"$ƍw*;%Dʍ7$-i n$N`soD"@`m%D"Q &=M 1wH$*7!H$7I H$D"H$D"1%D"H$D"HL$%P"H$D"H$D@R%D"H$D"HLt{qIS;0;SIKߟ])YsA]%OG#i>`\feWӑHPif#R"imLgm`]nᚦ`=U<D"H$DI Z7 ``~`y`6h;)HJ ^.K  IٟڑT &@uV&h%~=3'mRDZouULk&(%M]-O"H$D"QںL<ѹBf\fmne)"`IHZOp3{-徎ʻN ОDɸgj9OdqjOKI:3u@݅jqάC:#"/Ui?Fy|]-H"H$D"Q/ڻ^3{6#i>0̮υμm}:09P$fA]$B7}Ew&3ڳItk]-H"H$D"Q/ڪ1D"ٛ]-C"11`fIH$D"M&%VCʎIZp\!w\5afVIsSvBn4g q'V튼8̾/I{H{I`vC%QnYp`n.H\}zim|?# zn c܎Hĵ ,<T^2}lfΙ 8$ΙOpqNOمoHkyo3Mfh+A-s=쌗IfHW셖]׉ ]x=])|kf{9%00 o#G條mfJ]282/]v0w 2’6W}}߿\ X6l3B>F>R/kIYVO;}S?Xov]3+p\.;6nlfV%6I~|SrnOP`(/qN` OD3 oG^7as}<ofͶJaK6n| 3;Vҙ4]T|<jfcrq֌8s3`f-״0+cߐH$D"Hv?+p>>W$ibP<[lT`*Icv|2p !|}o!Ӹ7Ӂay)I A=7{u\}' 䥸"$͝KU\9 `@9%k]7ĺ.nd\w5*bb{|By>m+J˝37: _ vdx>/GJlr8 [IZ#p ʲWzyJT.\q8#c2㶶OQI^Or\o_: +~vt_ЀOGgW +eL!Z^F U P`Kc{x}Z#<4*ϪalY.wZo}ɚRI=~ oskJ7~k3;c\{V\SG H`o_I[eiwj%o7^ޗPKDbd8~ϗ/ rυx:o 7-Ioo#v?𼖑=DZ;x,ys%> 7kD"H$ʘY>ƀ[{ *o*x$IUwxD!|OB wBZ~v.;>A!7.ᅸs+.(}saݢ _WP} ٣>, 7?vw\ːBBrIű Dx*W-?%{ ?"O/{)m\ ? 2 EqK@B|:=$Ϭtυ_{OW`B eW(wr;DUC#Q[.@2dfc[\?(=\g^sO=ql*e[)XWZ%i}-/ƪ奅5#~8srzԉ[>noO٩>>>>>tJB%i\O"{MIʅ_+4qo7^5&..|n2#G63;A=+>xx5\5T e^C-2hkU\9JX]^a|LEQX-Q7 }s%Z#P8v|̏US-Wrb f3c:|A-\cf:̶i圽pf6,̷\XEYӭBMf ̷o f66?[m6o0Ez#0sCXfν̊2ZG(363+6+QffO6X=_(ާm[\%n2ryaf߬]Q_]'i6| '2(n?T}hӒPėۄo'S2YX!,ڠ ^eٷ]"$}D^Vnc R+OV~_V(/cV|{nF+^%? %9Y|WS/zLlw2 oS h\iQm"cj ^},Ky^Pv3Ej통.wBa8<[>6+ȵ(B|X]۹OKJ iFWd꼸ʹn ƈf&mZE'୒(3`H1m4$]z[5v-go(H$D"h ؆Y_=|Q{i20%߬C[-)?U5Cu,>!= 8Cv y;>jfⓥYY+3Z6k+|MJ,JS^~ħ8웰t8: 8Imafl5R;)i2يJoPېw5tɿma[(u7J8< v ^{$xe*=i99rlKV_ok+ŕz;t8Ġ,D"H$DUQ݄SiQOw7g[f>qW$+m f*VNJ, ǫ!xpO2mҚ$,3۾*bfH#n@ܠZf/nh[Ic̬B3թZuGq$ b} -+\i; WhԻ ӆ( *?k(ӷ6g=%d7<u {f)OVclX҇wG߄Z0ν"h&Xz"H$D"Q32fJS|ѼJڼ b3÷.܍O֫2vytJM%-Q[ʠBj|U"KToYJ2K߆K"iאU$ ocٷfv mL{ *wI$$iN#s+?]fd򒰶m2ISʆ(W ( )T ѯW=T8\IɓѿB۞#mA/NYvī9DPV7(؂˨ڣ}A >ylfm{2H$D"H6 ]-gK WRMq#"eǏI.fmMۄWNiO_ 3 xc$dIE^l"V܄-ߨ BB%<[17߯- 9-F%,75%e[500Y6q O)(~o_{ #it.WV{]\OV%QWʌ㊱pi4ڕY߲KZ n0s[Ҫ~/ivH$D"HH,a(4{sAUq٪Aq=ӄg"!BٹR(IGWmD]oQqB1}>0S:MҊ&^x99~)/D"H$Dþ\q`ɡ#up&f iK`±f6n'mWgx*s!`;|R4"C\IsB6pOVķq7g(xԢ[X '5 y IDATtӼ,?5s./Ni\Qk-y 8$w#`Y8g8x8 % lo?8̞w;?W| =ҪʣY ^wW LC 3ۮBmf7:7^/i9fvK.83Sp#[wkz/slpJ!fvhJ|v{%܍-]cU 1S]pX3[O4_tv(㲭g]rNȝ]GZ̿'뚤#Eq9'PIo?[ʕ=~v|\cfχ̇me{uv.x?B WX==25s} x5W9+nnW'mˣ3|I:;N df[Z׹c5WfV6%D"H$y&@ͨǠu'QuP tNIʎgZR*Ckq;!ɰbCQlK?vzUF̧ڒ_GE{jBIqv0;$@D"H$z2*ʌ^U 逮.֜s6 r.;7Y'\|:Ib;Q8HO\ qyZqm`Fvrg !|wg"iѸg:f#SneiaH&uIkw,D"H$o0)"fj!3(书e!i\Ցuq?Gz ;M!hf?5\Yy0ޮ'J:5c2 ׁ}-^r q?߫W%yQwsw D"H$o*$>&6gIvFՂ'̄GϮl["c3iftr|ղ$D"H$%hkE_-D"H0̺ZD"H$DD Co\W-+iR|!i!`- fɀ 8w`o!];I[h<4gķ݇D5#헀[pW32{ ?N4יٽX ff/l 1%l < ff9X,$R#w0|kNƁjͦ!fYU]mwKw  wKS8) Kp+)Zm}ur9w;,| N20wEC.1>\zh&f.PķnUs`^] >o"$`c@)7ݦԄAUXwz'z$p<8,o;[? -}`~] 8UR$.x 8/?0UՁKX7&q09 KAGFC%e;]R-Fa) މpquoN+Ov 08S?$ү+@Hkj~Vg-. gą /IE?0\RO,ᶸA~>I'ټ xߋߟF:IHoo"..PXoυ;o ~{x'/pWS  ^9PwqUfux)x93?]qIC4?XDy OC#mīy{\pܑx{<ѵq9mQ[§/#########c,8{mqĹ3L7M}z> QhDu+MUfI&CiM1V!Е@zѨ÷|p? fP" &"q'{&bsVD#pO U&'ehǗm}pJer3;Au7GR0*0I>Y[>nхvnpIP=)p a~sqF tfw?8W ):]^@GYz9egk{ M i B1oيex7'UJ[W"oY_7N_Zlt7х_c3{.{d+\Ufvh)-a?#;fv `'R>oL? WЊGtHZDT[fvd 0xpYwU~!\oCPkouxOLUm~0]>V(p37Gآ[2222222222Dtpp%v?_LN}8BX<?|%zظкm<,N\+jW \ltmH>?nx__F2G96U=s]T%.b'ؼ#4H;2F[\kl\Q'+θQY_3p}lZ(in]55't22&}ۭ_۸/%B㌌1]ϛ=p+ߔoR)XS% 4o8w-LVD|E,!HVҤ㇫a9$FI[H#nFsNI?E%-+i~IG႒oV64$G܈_w.7H_}) ֠?_௓x,8I[k^߁%9m#k7:Ԡ8"]\#ŷ,i!IKBk 617xX( gf>&.+1<+oGZpqIHCі{f1W4QpdžNlq(Ger0I|Dž= (cyZhm5 -G#ɢ>V~vK1U8Xv.IŒގ`}$-ihwV UBQ?t8)O$ cOH 5q >r;pDU[)xi]?2ipm?|\͍ 41^쏒Ρi1 ^7G'Bzq5Gf483ce)\.;̞IŽ kfu!;%cfF 7jJ.~sZ}v7*Jþ?-pQUwfv_oš*!_gfWUu \Hn)I3&xypϕ'Tڛ̮*-km^G\TEh#Hkm6oEppJxu6c4,!I!;7!u~wde!J[ViB#et'N+6x pAȸ.y' L\{+&kNT{ sxL1!lo[c+1ZoWA w`pۣc畞D#>$-% D͈ɻ~BDgBFu#]+=.1f`f`?I(rG=w"{1c@kd7Ur=#########4A?9`.pPblܡu=-[>c̅qG+>]FNG{g*? m"=X! 222F$;x:+cF8Ϟw>J32222222222zY@ @eddddddddddddddd@?;:2 `d3N҄%=fx$d3dd$$-,S"bfߎ.~~ 4>st= %%fng=t1T">hec$L?]d%fToYHZ 3'########kh&$='  A_++ԑhe4 iIwHIx_仹$-|x.DI#vgn?X%YdN@ 4I ~oQV`.AT[ I':]$m+G%x3_o[{~N҃Η/x5xst񐑑zl'`n`GI? `f7N Ӡ|!yI!6}IH?bK K+$nn~\ ?mU?vQD""N<<OFZ,ǚnJx7P!*Ñx<\2f~8fv[7x 4qbnICUxXw~*?yfvy)TO2aft0ktBߘK  2%pudG_3;/~Y >n7pV8.xH\v;=$pp}׀>Vxa$x_Wc3p3DB|xZ~7EAܹpg_wuEYE?\efwq50Z51tTtfZAxُ^EԸFJ;N44|nfV9&ً̉5ܧx}gfOw/.ytB@uZg`W`9ߥ~N3 clf#}:; 0 }l YRWuex<k9͍꣊sc9Q3KQo0++oގ.;zv+>jX Z $i1|}qlfMcYpdg\r cM06O⛰CUC1ww=wMao4`M y7~I\$މp`F\ "\ʑ.Llat.p9=W4LVF7FJ^X|܏1TqM<e- ?YP!*b(mo{=Y1݋ 6F@}\za?  4O)l_fOqx3.̹#L\u |e.ʴ&n,&0&@M|<O} lُqW5b4ukpދuR ^ǩt!c'&yO}qa[߅e1rZK 8  L؍Hw\#2222222~07M[ua&L}NbyD?,Ĺ'W4(M} ~I}&Ts*0I~`H˶c/NNli#'e }o]"Ϊ쿇Uo7s$YCG@?Z%<%A[3 [?IB_4gWw;NZi-K#Iq@`@B_7SE#3D%A?) ~ЯK?щ>trY4߀kʕi}Iޭ|̖;>D? iD:&qVYmZ$!kuߦ4'Նk[Ίu }^\`7K6#.xN,Zu_/MٌNo@ӻ>εy3p=ƪa=s27k{׻j&)w30'y:,eVlfl]TбCc :o:&7ʸl&%3;~Yb\cn$kg20*L"ff)C_DuT/{sS2>EV*nOႠP׮Dž֬xOZ'ykfо5&%af$Bbm+dn %@l8n/7F3R> ff)+ϝ}Kk|c%Afmnm>[ ,T[hf$MiiⵤAI MAIkѶ&tY{POrsf GgήqQWgq`3&AgDži-xb oSYs=cITjI}R]f@p,nBYܸfH\UP/ݜef_Jz}53}QG T3䱌zsZFFFFFFFFC4zyvo6ƪ(%iZ+9>AsHLRgMErPPI2=СeB[A9Yt\t\5!θMgahe24nRROknO_ͬiwVѱMzfT{\Gf Ah I38NPΪOUKqh%H:fdqVꗥj.+cj*m mgl?o$݇۰c6>֎ffy .(= 8LҭMΝ6;4<~^'{&ڤWs5k[gKM4I;lng! ~3 ]ć'$ѳksǩǾ6z{Oi^ԯAZXw_UM[2222222~BhFt%kQIqA1^5G[zTЊ/TKQlP}a" a^pPnyoO@qf|Lމ]Wt@5 Pόp\%(#NTKS 3{nº _gIZԮ."^6ff֕]Qfb3,Iy@2M…ǛYS8Pv f0%Uw7I+eBI6^5Am>+J>'ٙ]FQk/IKCI | ,js&NXhZYnQ -F~efoYYYgUI6b4q>pM3̖ڂ_k`3ϝ]it]}J#i; z<6  Mh¦UïO{ֲfyl ;YKfe[%uԴlFFFFFFFFW-бڊW_$\"6ui&f.B$m1CJB~rc'~ 4 Ҟ*HVI+m}IFBV{sF?q-3>^|0~ #q";UBQg/iNxj<}-q QhQQU>e)\ඥcC` ۩3O11*iȿ!t?-x[I揹oKvrMoXz7 C+JZ:q(.B fYo~ đ -uGBLs9fiBm#$͓̝E"iHco]h=.x Ps@_̝F+vI%M%i\yZ'LoC݁ONQs\=U<Ÿ0x=/%)ijIH37~:y`g,qD8_ZL҉D7]G͊ze/ݨߕ0CP<50 z*g9 9I<6CJ淜A:撴-.Y joQ2y+i|عp]}u-i%jJM)gdddddddujIkH٥I~T 9 1?Tm`Y W׉yI|6??SJ%i+\lRzG㇇ipu[[k߸ߎ2y `k+{m,7rֿ'NM0CVxT&v\=\ز'Lcf$,|of IiqLE^D{ߊƛ8owqM_dz.LEnkthvt%Rg)(iq'.LHٖrS;x9M\3'lwIAQ5fvho"3/\u&wǚ٭%ǵGM;0zr?͋k <ʎ&:w~Ădfv{Lsz\HYh5C̬_GQKz~ce|?q7p͔;Ki\ C{U AyoG;fuwlk6)aTۣU/_o;_);*jf[u0wއϝOG^C&3c7r= &w>W"CJļr>>'܀TƗffq}_$ %uRTס;IfV^q ne\dfg¬مp{jNk 6h*{JNM@[M#˜q|ͻ"ϥpen|z~V {wo;[ܢ}z'[Q1?ޜGz*JhShb Z^iк쑼32222222z cHw?5Ӡ>\+_24n)H(d"F7#edddddN #iNM;dt2;hVv;;QsNu|1yB:<}Hw?>An`q3{{4򖑑%h|e Y22222~R}qn*d!PFFFFFFFFFFFFFFFOcOB(###############'^LҤ6%fTo06BҮCJ'Ώߚ)M6~4k3N1oVy0e|̮oe|+3=W+ R%_{I;=R/J'IsK Ow!i`N3KyO )n6{#&/M1 ɾ^{vV I[HיF??-H8~>mfN~u63{y, ,W"nf_2 ]I3`~u|G#p"¤f~_O[9.p.cǴx_ 4qAm@@TLY@K@Pf@˅@fnf=Z_8 *7r!P)uۆNh 3=ǒ~ 0p 0 y]^GYf-ˁa&ֆG^@`S|k#/-0^Efsb+OB$iE|ﺷ0b p>~.Q @K@;X j&`n߳AwB 7w1 rV&jf{Gy=18$23v"Q^-ATtu3nz HٍQ/$O~v}b+ғ$ъF$2?y)a>|._ I4wA٪=ꑞʣ' 쨛t30sQodfoFޗt^.OZi~0ߌn>F'$6;1}gfDz2yą{fFX%̼X?5H7ez23;?cPﯗdKafx-rM9?⇤pKKw3W Cfـz+ߌ `  pvDFaj\H70^ᣛfWI5ºqՂ~l^5M0+^z~36/fc!cslDINt;-#ôxO(٩Va0g/ \U&ÿż!@|<32p{ff$#Ma~FFFD%Ȍ]N,c$-/ȞbF3$njxo$Kxw.7m*+*!Is?%jpt/>.7W(C?F}5Fԙ}p;p#p q_I3O+-n:pHX2x8>k(@)KP *r3K'I:?^&sE=pmyfv{)̬Jɟk;'?n?se pǛcEb3):>IiJ'T]%7"4X^ G>] լpـGu\69c) ߎ-o%HQ}=ׂ¦|.+Yο}/q5"fv\_ۭoqQ~$L |Ja7xA2/ir\ |Y|-;FA/էvߟZ1V`|z 88F؃ړ$vWa >ޖifVi%i1`7/]T!q?k'Y?罅{痝v^fNT/ר/kQq +u#iBW#q%y_ŗ o΅~,\843qKۯ}Ϝ|%fvu"Lc).jxߡꃉz[27*5u}Y^KY"]mfŻqX}~KܷƃoX)#+9$|+X_47έ;4&W[魤30}?%\(?Y%3;"טٵ%f`|^jfWV2x9^5s4ꭟ!f_)D<,p޿0SfFBaց3Q>py]ϩ4SR+kB|>lų>&$܏;nt3VJ7\{cN3 0 ?t j>6>Ug$ǜV>$a7jA|N|ho}SK:ص8H5J[.at_? ńpUӀ֏$U ܌X|{h?#)+3-Cp|o-ɧ8 ǵ+'/fw~:>ufȷW`^?0\9*ySN;]rl/DMao|{EIx_i~Ok?>4g#̍`VñI7V/LsK*8GUMFd_0" !i0. y?m/G܆%a7ʁm:GE~$X;ޮf|CּijucPlF{ϊ .Դ1#=4W!ax =vx.Қ J_k6wFg|?.9?h>_3x,6fRѱ"laW|s9^&}3oY/4~|2KvSbYEGQ.ץ:?W7Q'$V."kCH܎wStj3cSXoo\Ż_E1M,Nqx}Z"LV]LҠξ6=|쟆oKkm6@Ŝ0~*׀@?ߏP+[r5ޏޗ?V\67.t4ObR콞 7al7bq|}v\xb-"x];x}*OjƑC6 Iu7s?| !̣ib>;/!x?퓄kWCU}Bw/ǻ t8>݁o;AZqpB]4])d"歄V`39..^ S+7u`(y(2M "9xiGm5>}^sZn(c |\}b\ܓWůh??+@jc~pW\AyD)#oA \./F 9C@nBާ6HZ+74)<9.]?_. Kqmϓ{0kس귑\q_K/,;9x{D)H:o8S *_jsi,>׼ax i\p x[0Y̆Scifs|ّY\s.>ug9f{u"xle1;&'Ļ!x~IaZ اA]"%_ߞtWEZY&yX*-^ZxwZv1.IMHWX]nZпHkx~ |@;/,W]/'a/nh\'_SC4CŻ?VL8xO}։>skB/N;D+Һ=]ЧS;G'qJǛ#iuF}v|L_i렿L[ ݀E v1`ID=%;CBI{#N* e?&6Vn*([1W0%e8_Ļ{p`BޞSk/. Z's~URNy:?ۖ[EC}u=ڞ΢Jg #WqSZ|@gR3[Jkk UO:ίH|ޭ l<3WB{_$'hHZOnmՉ;`.UdO^kީ'v.6wdz=>ݝ&^feūCBtMNf~%ġ:80"mwkSK6f67+L:ޟ>ɝx 6%7 hws u6;1N+o׉{~kfu=nfɫKn_}L47zIëlx_i ux]z7|痉&h-Ikǡ~ݟb%Uy3[:sCY<}9߉46/UDžDooy>:j1یUs9hOq.%Ph@V^2rmu~7>ĵ`f'k;:mEٶ|W_Pr츀ܾ{dO>ơ7SWa 5D\Z8EB/T&P.mj,ad4}6ˇ&p6QkvUԳ}%%`nI2E=†\⛱[$oA!M"L`)Csq%u r)}& }.=ېRi;O#)6XF\\6IwM!DI)]A\B&EU]4DOQ3|ݷ/Wڴcԭ73ZHdinjp+Y3Sf6P3h7~Fm* e@aUWK}t*6U 7*dkd~^뿙RIӕyt;_ƿ+LR{f;wGh)k`II>L?Hz]&6 @af6b}ZUbfH?>nEz&^U[*@Uchnp5Xb/9#|R)\?e6?{\L>7UYN=K'n4~h >p s~G+xY>+gЋ5xʄ”<=Pw?]Ofwљ𱚞9Mdv;hɋjY`w/.'@ @B% = ./a EAw~Ꝿ}{fsu9gTUwWWWSm4o'e:ϟ!x^g/iohb7,sbύ暮]Awj2|J Z1>=~['oSUEdU }Pwd.CJNPUK6M" '#&+;P|!p&vRBUG;+sr16^ Qb&@Uwﱫg+ȟ q!ؕg0}m5lSOڑZ& zZB ;GM<51aKG1FP;U UFpX=՞'oM@LDdHiȼX>o}O"I۱[ڨ ru1Gȭ75aSn|O zآ'ѕn?v uf? ? ΡFrHltm9qؕVШoM46iLWP_I*M:t0T9wckk0Me30M]1Ԟa·`^Q?6r46? +_Oj"h-ML!*f`̶ۑ"r#KUmvr;bau~{.tUBD.xImJ5T1QvފC=GX{:׎!sꭢJI?\ ƒFͿν~hxr-ȑRvX,E_>h@<  vkh2`4[FIJK]Y4¤if4tkbu 5Y'=1bRJWj/(!Θ:aĻb"2#6iWM[7`kx˿NOC霈o>0Um0B0fhUuŮghuWS5v/znF6<>"$y|G*T|#g2mFm\Nk CEHV/IfUWU Nm;>;v8}N[!X#=6x itzh  roUmvRZ d#Y BzqҬ/zb }UuԌp7ccP#U ~Xe{'>@n~ ?~)" #0:C}4z.Mk&$ 6Nު >^"rޕx }9}ϱ8;KMgn=v ySUɸL+ 4 '70kau!&DmV1AD zToLի1sۊj1>{:FRՏU޻ml.\z3Wθx>Sz8Li"~U}BUwT7=5Quy-ýnU}UUN\mH &/9QAMo}Ed4JЖ /x|L!0"2MBDGU_QCv{XɅsAGruuOh:c:dCL=OXQQz.M0cDg?%}םTpEd\Y:p]eh}U_4fHEd""AyL`4_& !oǧ7jo#-("HjOrqVKd]6z;y`Ĺɹ&wk&Y-[6Cϊ]jU͓b؂  *v+q{6ډZD{b0!Z)1 0Ln jB+k$/TG5o;d` ?]1yǡc;J T^&9151P_zw)/diڢzS1ȝD4·_% oK{{~]3{z3K^0)1&=pMv[[=o 8|[+6G"9㭼w)szlaNuCB>q '/x"!Ln\='mm`dֆ0_.J{"-<|$>U~;[$-e OOLm`j'ϦϑMo%12s'/6[>^a|gh;6agm,aƣb^8fifo/E#>wwqZl| .옚򧞇91c#Ūz]P`(l rmw7#=qj?@+'Ƌn[qbY8?`m"l1?n< 8O/ÄKc\?Q[Liͩd:Z_ 8*r?Ä7= 3$~zz5jg ϽNx'L8<9UZL$;Y.7~em$:c1A-u|]۴cPi>g)[lm^X y{&%1F0Wdܦ)Izc6&/`:݀c^_xRM0Fq d&Aux $e&㋢0G4Yt6ܷ&诽攳I߹ ~@iZo㑟W6)MLmc}Cڙxæj&/ޢv=0y 2-V_ztL{e8'ǼlaTSnz(u^Ody|%3}4l^Sgۑ؆CGͪTil{shU~Z=c2n'ekb8L]A3Ƨ4t2n`9`\]mvcDy͕Ga܅3M"5&i  ux؛X_y,N[[ۦ{J=y96Ȅ 7<뷰Oq"֟?"%v>%lMp'ՙvX) (3/x;6xtV{1Ӣ2O4Uzۚ-f&LYIu^Ic&t}kxM ؜{&Ş'Hy8k_Z!PAAAABD&{/q^ژՀ$z}FD6oW3ا}Ac  +Cu { cj7qi=Dd;F?rv=yȔLk^jjtcuEj>, ?a,f(O v|f%{:AA fa[UsUPP0CD F͘pf[hUG?i?Q9="*((((h ;E{_Up!"a9tĞwyYU,9GbG"*((((((((((((((( ~G{9UWr9TGoAD~ NSկ{9ͱNEd`t8g֍H[݉ "FTv$)韪PW-7bD:KU>DdK`*^۟.8/(((((((3Њ&l > ?N軈ȳ"2w?e1907p ~AEd>H'0!VGcu4{9l8{ scOfj 9RD#*xk{U9<,A'"OH[DdiRD>>DD2$}b:?D䂞{Ac`A]wʴz?祠GB 7JkU0>Y<`%`ӄ0'0Gws}V%}f{jXg.$q>q<&{.>90i=)"TNLPb7DRct{"aLGU~SȌcTxUw]Ul7Q6>_:2"|wS1BݍĚlnr :3>؁IzǂcB[Mh귪߾ n:cA}(U}~ neU}7W"$t%DžSD=zPշUSPPPPPPPPPP0`m4Z"~\U)McUیikVS7ّ?DQȴɟ-{`j3NB;}+jJF"'0- pB>e1oTςQ=Rsto%O+&G7d%g[SaZL+C{b&nP8wbv PÀuxCW?'Wߕmcm%vIPU}:AصNI^744r'fu`XVUz^`ck}%4xܨ~ŪzF>9BU< 9)ymmDW]?IҺ65lwڱ~:p~~fHr^b6WWS0@FUD^`YL?>sSc.3Oa|:i] ؕ0c读i̝%"4A\4x<4(/|+y_VxUy="~JU+ӎX|]:_3oUNDBXz'GD~xάN:GD/=yv.U[/S_U:3bVʗ5Vg=#?'G.+og<` `y~b40M@;BU? h} ^&8;0'EՁEZ & yq8^[`ѧuGq1O_{N$W#N9:[}w?><DŽYb6˸u@B?xŴ_)0, 5W0NcS}eU `~3<zw~wJs{j*yE;7>̼ Y1aǃq y0gD_gvK39򄾺Hj/bu>fCuӷ7}iB#ve?ڸ\GߜЯ c O O0Fy1s[&?͘2ʴow; S'U -mL3LrN??[e넾y`>)?&͵ӕ2 k:y'ϸM s$nyzEU=;8asXgSb瀁<-pL7UIdy\x }12|X%n:VVOOOOOWm?jW&kEðWS3D#UKU;?-@g:ﮪ\61 7"ҞWlR_L?g"[SwMWc'1-ϸ=IQhulXVE5T5Fh/2m!ID&nH|~'i77;b'b6B^8:Nm&>S3q\5]@ 0?&tADJt!ff:^H~."/3B @]钁i5;abת4G Bߠ9gs`BU27;my0[(7:}5]im֧u{|X /xs[^d֞>v7k lܟ/"aTj0u'u.BˌLkv%]Aei<8Ŵ|9^ [>Ą@S@n?3kMMs*]@͐iq#zeh!+T5 .&tLFeuz[?:xA;TUπtgU\ \1wcU]pW`>UDkGUa6T~JM_0":CI&qj.x4^Ma0c`i25ۍߣFƽ70=UeN +kCO0ZU6&μqfSY@%7['O>h.oׂU@U64m9GYND̹2j↾z$?!h>߳y,w:Ed#,.Ed :ti4s.uLhU+` \ IDAT,fwjWDv*W=B۶e\DuD_"m[ ,Xx}L#/Fx͘Bu#5r 0\]o:n ^x_^v_x k?]Kьgo!"ڳSD6`SBAثo1c%v5+=9W #ԞͿ]lUҫ7O+"kGFUۨ3ayVu\&asNs-%0MЗR@ jSH\ -˰6ϓ=~-y=ݓ6ZE[׷o%B7~z^9vsƙol ҫ1]E }1Z6i^&qޢyPjsn.Y ~Lo"؍lMmܷ9jH=cܛr8ӿӺ=#buo%~iM=xpbχ$ hÀU3( Ȟ$s_aݥy:l!:hv6wb =\ s&"rN&1pAEWƶќ"D2$-PmUE~&"3aZ37Tک H󽙈sL'wE ס^|<2q~&ړHm oYT_JG\5HjiKeKIDzW #~* x+ `l-+&hh'۶QkawoNu?P799XGLMl̕>~0+b/nc!{sI|iLm8.7*؆]L`Ne;u^3Y" f^)xfO'sa̜zz;s2iOONu7 6 ثpb/Mu:&Jm8_/mWOLoAX[[}rgX?Ds[ym c^{ //<v83l[+̖\ O,)))}:l>vuOg>LhҏKz,ꋹ#?dݎɸ͏]HV*mGnĹpN;xk3n+c lfn`-+b&afv/z3{١N>4n!Mv\m,4Ą i^xNθ3-[+y6L6 { X΍=̡%xwD`a$vlf(_扟k2X%Cۈ%QZbML`bpAYwqNcA ۔zt'4̸mi,P!?6a=#q!fL=g?ʿwVVngžԠGX&o L ll Lnb³GA"OP|N˴ߟF`:iOBżPT08%v(L31wP@bs:ih&Xܥ8())) 'YPnB>6y@W뺧HD~'$}0fƔ0'E毻i7 /"#0A$iV18Ӭ^U:]D@L)"mH핺&<P:XAAAA-ݫ05lQ1ϯbn|D.S}#?y"\AAAAAAAA ~$paTkE秷ŒZPPPPPPPPP GM G"*(((((((((((((((`YX~8}2`xVU}WPPP "U&vHý1"8tD:UUWߨ}vA@D^PU=?SPPLlnW'+?]A>9}C`ZAABDDdKA%`c YXD|KTcA!"iEkgn׉c|?Tfu!P7Wk _?9+ Bilv!"=y.n\c#Dd?/r҂/[yzxҿ'K7!"׉^mrsU s8}\w(~G,nqݮ&F:.}8wIGD䖪U=6\PPP0\+(&GwFٱE~88SULj`Dx1 Ex`(G l]UHsC`s`ACI0|։{ 72\ \ 7KʲCD:X b뱺4<6^xɪ`ggo_kaIܳ`cuU˷X8{ +/`q5j`]S^3S`\Q HxYz_wa`oz8[U Dt4QU%hUYk0 'Kb"2 1sl ̭ļU6rbs3zALL45U=64]DdR. L۱uglk=;<|16'N#Uv"'V&BDV":0.c2v Ed(pd!fn66a?(g4>ʵખyq- Pg^n6+(((mt&}#=)i x [h t.6a(h-.Ƅ?7_b珰{mo}la0);DDu` Ͽ;ClѺ7(c#{pl140n.+X>`m3躏#`u 0^x,܁X[~\D~y$os'H;V`́[} ͇zڱ&p1>83[b".\`a3lô &lY7rS:0,Olq00ð^r](L-+yEacglö"(7<&*;c=/'Wrݱ=x7Ob 6F|2>2+`y$)pO4lu'Vӑo hD(<̼x1`nmVjEG < WgX>}"7{˫<[]Hrvsy>;}xL^G|$ oe{&sˀ=3vcoo9"X55>{`r"OWfU`tscu?+OZW 6c4!(O-4Vesy6.4~ A_aullAA@/~ϟ0p@lnbsM"r@i"̻`<`sUئP]exґg]6hS{ 8)L2#:}ΞP&ظc98ygSXYXљxc&oX\Bs{B~ ̚=|aLْb'a%c ࿉Eܯ?OKKkpFm#Sb:qf }i2N$bBK0m{Z+vj긅^-;! ŷ؁iEeYFɬ0׽wt> ZUuD6[|OOtjBw3 0p͙z<- m -DfCid7*uqkU g&UӉU]hiI#N/vHM:&[uZhbN Lxt^?mQ9z2!оuܧv づ@aY6iPȸ<&(lτ ޛBT{򜟉k-FF HP ;g~N~!PV]Sౌ` /(n$ZňvJ\ (̸-n/%p?4K IsH u"ޟ%N&Z:Yo5SuC Y` Nm)]Mm`^3Oo_IFntKN1&ׯJ =>?^Nz N>o I0///Ʈ U.O>l[@:t'z /s%&?Uh;9`p}IozƇEm%FBj'tO~0MIMŒ Bz88 ]ުh:?L ̸nGfS>S>ijHD4&b<}w"`򈶀wkf#L|^:^j`1Cʿ'KvŽ)䴘*L`[/fKa7l1oqb5eO6tTNϨ^}i;>][Pﵒ1[#`5wϬcUE^"r5v5jtepu,߃2e޿5\k0Coen ~w _9넩B|P߽iB5!/5&"/WHruYDךʹ30M0U|Ddl],!.8/)9 +N$®as`h3m^lg {i~ҿ»i~#\ͩ;ظ 5b+"r1vexuL 6r<+Xg CDîyBuz^kDdvoa>\P3Tؼ3IU=_˽YwMG%"jW`0A/V_\BD;Pe5x֯SieLyc&/EdbU$qW0jv&p=SWZ'E|ZfOGCUî?~S{ǦRU> ~Ĩbzy5ƹؕ99Z_'@b|9C /,ԸŮ|^&>pL՝}q`EUIwEDϜ|7ߖqݫ[˂FNS]Ul xxVDVk*\~h@o4H17sqͿoGrfr6m:a h9L\1o!E1F~ӊHU/ɴU0McEw H33ۀiw0h#`6{6^wzO\ ϸhFyze!cgLLcE9j)F`W(R|S}15`;l6붕̄iJ0rZ{3Lxbb9nd~j1l) IDATܩ4ګ;Ԍ~ ffn0Ps3ֆW`W7„cB1{E"2Qkƴ]v&&ϻ)<wy3 v]Fj_cVyL2% 5` 0a=1JM=4CDdmNSf?bT]-c43ᔯބM_EmhҎ/tt"jz;7iAqf"ͿjLBcj {]; f|_̈"K Nq(Ccsb/pZ؆.ꊽƐ -ii1߻UuˮgS|j=c1Bz 7HNGUՏDrLb xM*ʹ#]lF Gz7ЩNT2>.{ha)aء ܐV0œ\]]k } 7N";@c1!뱪zp "9aV3˾` EdyK/O4sa;"a~&"7=1p\]&"b3i]sLk, DעsjE3#k"[>HC5wN+ a0(C /{qw%l6fyKUm/fc)&ǪLzrCP5u1]cuxf$vB3e:ث)>: {E&t ."57-CӐxKUSmv@Ohw=UD:I bsȑaW+Huo` -*KB_ͩA;+e!"WU~U݌ڋ=1?kG)ń~)E([(O>7"93O/5&b\U9@ej@v.] ¿7&q>f)b~f:=t ^܋9B:ҷ;}ɽg$+ea9ÒӒ_2(d$$JADT$J$ KD@Hp~s;wnt|OwJ֭:]u'܋ )ɝe=3_&! DzJFlk]w,󽼆eMO# S^8I}4&ďR{V㮬˄ĩv}|`bSďuS˦nW}~ ်8R#Ⳍ=3lRs:X180ML0c3_3UI(b+GgzNw'QyKqҹoPCH.ub-N*Y439_JcȰN-=0Xv{l鞩Rߨd*~^LKqנdsm+O&Ǽ Cn넏vi&ׄO]_SblY?颼92s\}1>;;fR3R' AL*N"܍|&E>Ÿ1~M4_UH_iOu#RZmK.]uu/qL2U' U?#V<|5y]3M2š TU^>>M|yDRS=j-YQYޯKV_$6q/fnP^fK챼?hP`yoJjޒ0Tg+j:^*cul4џ:Mxp`D4?5 M:I?#є~5.*߻籔6 f<֫;ԣ0-I?F(-Ov_A&iOe#/ q}bL%|e˜6w~mYLLT˺oXԇq$ AebRQk*!pl+}ވxDaݡ&4D5b~ 8D1AEh^'&s[sϰsj¦m^h^ݟy)ݻ+q& /W$ǡgHq.8Ӎj3i6#SLjIPN gwƜJgu˜?XչAqi 91!0^KLf3OOT $cb<8wߛG5wUh[1ko- ހJ$s8sblMy_P_ ;I3=a,0~TFF-^!~WwcMV / jLS! Nܿi6s^7HY,5wٰ_6IXU~^sMXy _(ſ NAo7}$w쫉_.їm~H8Qҡz+z]3^Z?:˰8Ebd·{cf)]-̻RNyt>f651ZGu'l5nwҌ.fv>q\|LO?&FYĤifӴz/t7_ -/۹?HoٍgĈU4/-[a_2zMoi!ĸM_<җa3X^]q.|6AYWV]7 3;,hT(|]Z4GoygOL&HO=5uVfwv'MOS叉x֛;ވX=ps)s4~Ivt @,Ooƪh[Z1n3V!!gt;*q~AsDbcI$3s#-:QbqN\9Њ1/lg$ַ*=٤cg16Ncfd{ &0!UtFzˤv4y'juy_+"B+7\daM{D#,ޛpYpx݇ꍳ2{#f6ks/iSlK[}O_cf'n\3ޒ?smP%!BG?_+}Gg"NyY3pU|!Dcr쟃!bFF !B!B~| !B!BdB!B!$B!B il` eLwz1m̘_.:55KQuƴ~bw}z<}w?/0ŀŀA{g`wgy w/B!bX dfg=f6aѧ~ K*He/1X%D;8æol3ef.= < \M#$}}8uO)֥d?&>?(p?ݠ _oX3[؅_d>'8KH;~owA{y[&ij0p?_π݀u2N5~M͉w63ޮ 3L~})>D8̊g2w/%I什K}d+z !B'WoψҦ߆{ C?ͬpEL*p%p=1IZ%mdddNn> lIL??ɲ?iR9ʕI}d2U"$f-fT3,'FI_h!gYb2d~A-AL"&.#lf6Y΄S{v9h^zNOiǦn,{{O8yf¨wmm3D^QӓX$/͓aNt"Swڿ s(|Cf^8]`f{F/3햄V3;mC)izˆ73%R]S&a&k椭MʆW #vY.g}bܙ%P6(.eoG۹0poifTdf'}@ύ~E׉gv'{'E?,mӼF&AKq/"ƒ́KS⏊Cﭑf(]b])[oݞ 4mEwrGğ$OיYOhkW31aJ #W5B!qo/3Va{W;`ΒENf($ LV_.ϰ;]+_e+SrEW?'$.>aGfKyI3D%RgW4߫ 3`J֙Ms0pCZB5ɉ34e|RpER//Os)Q =iuSLin$&!)߭"xomAg^'WƺI*a_WdFOؠAf(lj_5[?]tҥK.]tk|i4Wxi 7ȏ <\DLw)Pb9|[lYb+^~ [.v= 9Y!ؖuzW:ȆօV.W2>&"beRQ4$C'}ofu|ݴd>`Y3*fXnBLu'Vʖwz^t*$ 3ׄᡈucjbkeB9m{™}M[ZJ^/Fhr?#Vr!hP|[_#B!FFӆ!3J푽]fzC?۱H!HCf6k)~9y|}Ƨ:]-_ٰEzXQ-Ώ M Etp_Eb63قfv 7[_Mf-]-ɮ#V9mRK &@bSSF w|KLX lZ6ޕiVWW {?Ȋ~\E^ռo}Vy+:y2;Id(ucOQ91CtFN Kz-ElŻsUx31^a!¸dJƿѤyu޵vM C%_ fv"Ei5MbqL}+zdt9VҊ}=ї&G$u.VrյjbLڝ8~w?!q~)fyX-3C3vz׀CSfͱf6],-[wϊv*VUc̆]w?>XFgB!Dh3 gF9ea:؂XBtXbG+;KYOw:&Bbu5G OG[ގVŶ5~kAׂiEt1X:Ŀg{]Q+>U a[p crfG1%NYIq6. _MfqnW&dfrs%=ߓGGnϓg˼M8)o_8qyKpٺ&buy4*s ~fi|+j[w 4(pqȮ..i kf8[@;L{c N gS? H'8sRX̊#uoWzٴf-܄B!b||TmG_ F8)JGÀ2ͩyd.J ֍/#~N,Flsa5 g/dN\'|(ـ8z⤠2LȲ/!|,ALձRI e\meb[ɓT卵h;&{5#  ##|)0 a;+Xf0a@$=jmJcL=3dU:CKKL}g}?'T>*e~C88M? X,ӬEqL҄aʑ)}q^YS~gƛ&&!_I-JW2͡s:qxf_煚(cmŷ!NG~.ŝ>'ٖ|vߔ_&FұqɁ_uҥK.]tLkf+NǬH3~ytp+9;!gCtr5>wwUtC*OOL'&9ω?ڿ_ua8,ř`/KLxx^%0bՌv+S#JQ7̲F8"ݿ]M'ELf%%yKUJ؎J&QJ35gV!NJ{XtwafSeUb+嫄@/9c5MJT䷺fv W}k1t=sL\?{aco2bUȚﻄpSwZFنij648pgaW\'4Q{+'$)#ߺx+Ѿo2?Uv"&+W䗻{Eg_NtH:C\0B?ҨmG1SceL;8o,KrL?3 G C58+5QƊyymfKeagqksB(aht*o &G?+(=)s]:qo#`vW9wuD_̖! @_^hg}SݽcB!8NC#1eH=Qh/[e'L^=Qޘ}q{VWY\3;0,ٙ髶ϭ/f^^*c\ҵ'-@>']kf2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B! #B!B!D?@F !B!B~@B!B!B!B!2 !B!BdB!B!$B!BH!B!01YDWהU(70U%~J'V:[ B!BW-{a0lIlg-} ;#2oGahxfp ax Y_l)K 0o%2I*00 |/*盆cikNU`# lJ.6+*?mmc:Wۿk~;YΦQ3;gq}wך2B!Bpvp Ċ~ M5\FuY"/TfVb`Mua`6``I~B^?(U(Ź:^X"[(^]ϯ3lXjl |Xe[`.ҽ]#?,Qou^\^殄W:ב5a/6nˊҔXϕfߒpAȗ˼O_ީȆ5yU)J]R~^M5tҥK.]tҥKW:[ s38ۉәf~g5"20(Wv!0ANx8ݿ*}~8_P~~KEDlW` >%V ܛǐo6Y_>ߝoC%y¥J gUt$e~-@Y90AMV㖬 ~NlݽVabosݞXUT!B!Og>$@Lyx;]$_I_=}׉lX%l|]Aڪu<~K`%X2hN`F~|Zv0=mg?$_-Hl՚bU>?U'wFFVZ臣U %'s 6gaFlj@ueob;I*(B!Йfws;5al#CuSjvՓ:,l.b~ph` cj{tꭝFQ7 [:NdSOQw;qDr%K}҉^lr3߯iɑ:;;B!BVO*0% [-y8on=;k[q f69ϛFh[}3F6y9&I^)hfSa^:&f(tzB!Bѣz:X'xMX#slI+j"-ϼ3]HZ6Yׂđ=I]{Ǡr>[?D_8sL+7!VqA}\ض|>sօj'|-bf52 !B!P2|y-+(h7_ٔf6Mr${$_ofNm&NZN4lb3ۘ8MwԷAB0%3e=[r0yl^3f6[9}[̖ lfqzeM3jfSe>|GםqTdf? 07`"b7pR=aua3fJYϖi&53 `׭bN03)fYƂפ6 X*;æH Jy6YF2{bf60{&m mu߁ l1w]xMkfk#p8k`e3CIlW`ĶKMU귨affegٖ(B!bĊ(f+!)fb!qt"aqtwKMGoۥ87ǺGgqJf[`JOsf$aTZxp`OQ[[8Xql/Ê&7Ve O۳ +9n%6^I\Ua8۹"sq<5?臙l/`J^F[k{ca_R9>YpmfS njUmJoˀ[ ueSqsl`NsoWXla<02 $gL72m+a'UF;{5!B!(VzgJoSw=jLS6mج^%B!b>zޜ0 Ԉ իU[߱B!Btx0Ii >N !B!b,b&3ۂ^tB!B!B@B!B!'B!B!>2 !B!BdB!B!$B!Bf}`h~H ׺-O;WcJ.w|,uJ1%?R1`fs7}B!2)3Y'f~$8uSW1cfl}3|hff6om^,k|h=o#A~ǺوX`>E!Boj;؞ffuwx"!Wcf6< d.=Mu;ŤS7V{oD~fv=_222{uIlla~ 2WfOE!B2 @f((ƔRCYqlg QZLW~~QeJ=f29b3gb)6cZ !B!V:[ ppA<'wQvk.?B!B!DR&$l llfSX3p p?w/ \IS'g=)8*w =66"|LK{pdK]0[x23g흔smk~ %nw`S`:IMRQmqe%~7My,jf疲?lT{O ӗ 8$: ,\ 1NX4w`C3[ ߿eI~3qb E'z,@R{3+:ww$*1jw&1p>$pUitm$p?Z3km "m|??~[Ef63/Myxmg Vp= IDATfxU0p`e Ou/#fwoj Pǟ#JoỲu 3ʎlbv#-'G9Bçn%Hbl|Y#bpS!B4Z 1}xqUObfdF0ƬDLf$ [~T}i?ֻLCL.!&ԥoe{ 댑Lb+пf:1]0LB-9S?x"=ߔ0bnuOV'4QVyݯ/}~vfJbe̾Kݟ.gl[FV/TX54>rw wrvySnZxۭq0BMSlYrckP^v C^ڪf-M X>[rnmLoX6E]Kwo#V .w*|F1m6xunfƄJ( c̊9E}wd^tP݉U&ZyXՓs)Fb_pqϯ ;hCȧ;4ׄs*bMǕ.w_;b\ *vf4KOK#lْ Y8'gO)+w"V1}!B/ =pG UꈝNwiRlZW?jfOkd99܀qa0ڔX!fi;gM o(]7hgtq/YbI |Qa{zF h/+Aw; 3۟OwF3ȞHL[-j}q.𲙝E)u:O4 uv}`3_D7:b;fv NwkׂATVL^w!V ?;_[Xcf*akfy;y]G5A7Kjf7[^N6w{MAڅ33jz4N[4 Pgt ..ŽM ROyhW<;Ux.0o4N=MZXffk߁&VRMm{tQ5\!B@;*G6fv`M w`Q'-^JÔB,v'&I+y$GLB;WW8@ fK٢mީ +ˇ@%V* lfWmAH'%4tul@+k3V'|D~r%VwiNEԭ(ل0 #~]4w3ۊXA X58jR0$_W~R~[=ARW:ِ|]p ]X15 1&uƆa^E$3[#x8hVbig V!_7S^g: XS06+]l5jLl&ySb|LB!Y '8phVn-GĊo1ɉFQ20S-_ObҰ9ڎIR]=xԱu{\a3p򺂙s* +Hvu<73oFSu5V;e'0p:W`32ܙ}]22V3ӀpgoEl:&vӢu)f Fn SѶW3pMUm)>* .eݾCI5q_" yч{_bĸV;m,ŘVg$>8mRE>u:c*7Z3D|O5Cڏ[> }G#% cpf;-Q?'qΒ|edw 8v0-*fB!,Klzp@ 4kF:b@+'fh!Dًx6cF =wd~ <# t[O' \HmY Oe" _q!6ߔNI<ò>N*twf?_ bf3z7wD H-"e$J"D%zI0dA(Fkg=c.kϙ]k햸xxg(7(5gfN TI?j 5v(ɜ8Xߜ=o5Ko4ֻͬh[_ ናFc:;傷lOpE(\qxUXKA˼jfە͎fW͏'Lyf|N4% qnoffǚ"JquqV:+Ύ7U6"]ܚfvs[ ifvpu)i3!UŔǏ^V 2XM\:6>W]^7p(x[M 'x2G ;sf6qmeOqϼt,=Df}ߠ?`fN+vÕ/⊟1/Jb PiL̶VՓv8,,ݍN3K;ke}7߅+&`;3{5/,~UfII7q99`Rڌtjve|lUzy}6$m.)IRF5%])7M7K".t6X{KS`<0A$m֫$I$I$Iҗ`'#2kK[Ưeop~ٛ5sOy3mI.6q2;kI1>kv^ٯ?IC0V!i)6D3[ʚXXbfom/sgiNW~ _{S| Fk!^Vo |8#1 A*II$I$Id QIO⊠asfZXJ55qy4}=%0{bf/K]Aҗp-fvA9^~~vGٓݑ3[ҐHz)iԿ1FLvUEJkfuMnNt;cM$I$IdOC'cÚ"-J;kS*fv•eKf~v1gQ5fvp?p\%y`Ӓ\Y8Ka$I$I$S^u`G<?R6&lJ%q7E/1G;q7y4'c  ^2Ev:Yxw :U)7.0?),p]W#wF+`j@bIÀM?RK8:=0[sT}(iܕRZدVE%.nq/7먤i ,~_U*fKV>lK҉73Ew+uA` 9Kf栏 /i93; Ygw[%I$I$I+c|C?ŋLIsNQJo7Wq0n4}[MWj ظAHt[/73Kq[}\lP ^B^2|M:Txz$rBa6W4l <ʚ;<ܪl}bj[fPHeO\eN[ɫQQt<>_t9Eq]o%OS{I17o7x6ĕ"2E?W DgY + /iv}p+<`jǀuJDFF$1b}܋:vyW`~o'&Tw;;w);gf? <} <#Қv{wq%H߮^k'y57: ' WS(sQ,+?kvyW^yW^yK h iܥJF:-|_7@Tw=oqe\@Wd[PX&Ҝ@_ٍ-s6V{WW< |=:ME;HJ]f՝vtnd)\lYefng͜3Fvyj7{Yj3۫&^.}/\kj}IynRٿkdx,*.K䕙BGIGV~-~Zp%Uu]$Mmmct" uGsuTI-Qyޚy:j+ Hy;f(E{kT%I$I$R)3>tc}|CJq%P  _k\)WfJ| NSY`{I{nm?JZէ]-{ifkufHZ fيC|uu4IglqnPWD1S܎s\U/X:Wͺ5U_[Gw b4)v㚠WO$I$I$I>GJL 3ofWfz-T, wM*(,TTYP xFUm/HZJP3{~[܃[ڬ q%\^gjO"u>/i3{߰N_"gIKIK>wԸQH"ihS3djA.u}I[5!Y %P}i?%iэk ˖k^@Ҁ~ޞC%՝ו\KuBJ]dfktC~$I$I$#+04*y6ƙ)\ ?%x@دK9nzxL][|'i97Q\E$-iNi f G[wvMP"iA܅%7}0_'xJsn/'gB!5w-kj6wgʹ[7*`&4˓"hو12dۚ:bf|&ZIZXKxpAJuVoZ6FR]y>uX]pܞJNRnoW$@$I$I$F)"Ht ʇJ5J &Z:xW݌Lҕv4֍,Z$- i[X,yŜo)[FHp*w` I71#>S~*U$G}i!ܲ"ff!Tݐ$j]y^ZŠgd_}TznAu%M#iIդ/㽏MI3JKwq%Б4;~,bûzcII*iXOK?Bn]ItnJ^՞T}\IZjd=I+F*\FF.Db I'ԬF.Gٛq9eE܅yKp H_]RYr08co+42kIZ5ƷnE0g?kݒQgeHvgER:zT<7O4Q3$-iX'-fvm⭥סב+R<>&I$I$I2IOƥ?p p]@|#{@9nb<X$_TvG;?&7,r+ӀUq%8\1(\,^4o6~(vs-iMWkf? eƒx,_pI_>r#Gxp ]M1ʀ6A'ǁZߜgfwnETx}'nfUŃ`oq?i=S3[Oѳcΐm7>v.[QH?VfvS'cRw*0}% 2lm l5\zDN5v0mKc+þ+o=_?O۩\ɺ2~b8<QY3Eh L^p >~/^=qn89IsBGl`82ibşC/VKZlwXwv4*Vv T]8X| 8$I$I$i>w3'$M=\$LzI3LҢfA6=#fL%3DH`=[Ԡ=Kk%M \.L_$I$I$_@I$fv3[]8qz:hI`$I$I$LJ I1{-z.1;}Z?/!R>uH%l ,<bfՔ``Q`|?]*wk8S~M(4,nk3V <0'p&e כ٥"PvUڹ'i0ohrfÝţC1fj 9kL^n~_?IS_!}8ެp ~3Ff\%[HZ ~,u3qpQ;!c`+`1p3pJ٪CҚΥ+;nK?6(*088_.ǚS!;fvZFraя&a i0(lPgM{RoK.7k]js` `1z _l+MNy_f\jfd/U64w5tw)(3{6/h]{\6SySϙ'I$I$ICLvGKZ')]"oN\tIFG싛p%xLÁc3Wha'\at p :c`ߠYc|vÛoeѧSu ckR߁w+oț6f`;|ӿ6pIXTvIWo`}+)$k=6x:Tt0G`\>p1~_4[lm|# c+B v-p22܏+{V(3k0|\S|<DͰbW(m}=4~Ϸށo}WHm}}.d=?cwCROu1ǕWqEc~\c?#9Q5~Ep1;@a2 p<hf,/QBpe_1?TBbnw+Rѿ Kź{팵V[0U}/K2U)f$I$I$]7,ZI?'҇VOoRАqS;ee._[Uߩ/+nO?.ϏoƅH| , lXI}esbMޝ7U)mHۻRvHQJA[);_&Zȹ&*,\)I8~Iܳ/լ[K !]QgF~K%}A೸/j5q++oԹW^;?WIr*ltqWO*5b\~H_>o%m({\3V{V]ZڶI9Wk!++k2Gῤ4gU/B |}AZ*Qe/ʿ`fF+Ϋ;\ѰO30!fvS%I>|[(떭~ZmV$D?sk)~̦p9*q#6nS3`\V@`-pKk \7f4'nq53{Ubfٜ6paaמ%fqIfsIVcݕ:g>=^̸Ҷ*h3[ձ6wa[.\ ̊zQu&5f6c2M[xV0bYT?7Bz=)$t)n"@$I$I$S<HBۭ&N _Kw^i|G|.-| %lQںS`funhcI-9K2;DԸ͚|n0fdun>/H:0b.#Cp+Q5sXl Qi_Mh\Y1h+"~]!ih*=xRŽMYXf)]gL| F&s :en^Ǫf3Ǟ=m|[Krd+`=Y)80nIXħ*\)یըAw=PxPBTge7"kV K:94t|UMcScxB;U3?\ZEt>mᲷT%IIU6n 72Eשpה5r~ou4p:s  K"~e\mY [X\ (Z)܊fJB2f"~bټq|}x\G@ o4;4:T$-R#w@NuV6~YoX %@: 2_ʅvY `kZQQ 4gu tY vᒮ,VOI$I$I_[pO>j)߁"2+c;h |C24#|9OhkQgUH}y3ኀd԰Km/+G `hVkσ88cb3[tMu1CQMݍQ} \qOo,eSb]⊘eJr71N+Õa:5~^qo拱lQ*W=ceB`(i[|#;8 Cfq㭸*\0ɱ̉ϻSܷi#^X2'd;\< w%|8ނdx``P܍ƺ?Yc}|?kA*`R=㞟}WNח{A7u;p7qEo?"~H.mNܭhy*rVߏkWyߠy<3 I}CK7 ۙuKDEk}Sο'yW^yW^yW.}캶Y9M`-\a3P_ hfMYۄӱ.5$mS5mO5hpo9֍G$3*xF7zx8#/vbͻѭ ,+7[J&d ߃qE1QN3;,\v7 7q1f@E!Rj$)pu2K[}ߔfvs𠿋J1+kfHZW̍ zԞlfWdx?3{cW /g.|+J6j⊟WpaBG[+^5D ߓY̬M IkaO'+D N<[v|-N4;~F1hn+_3KOiocl]7(sw? W~[[y6tmv]ΨefHZW.&I$I$I4do $d-xq%=yyVᱤXJ7R$I$I$lvPIENDB`PKH: =X)X)-Pictures/1000020100000477000004626EB760F8.pngPNG  IHDRwb.3sBIT|d pHYsgRtEXtSoftwarewww.inkscape.org< IDATxw$E]X$I\rP$Hp$ *AA$"DQD,( K$,E"JZ2,Mjܹ}zgzf<3~S93[lWV""RĆC,3 ,;8L 32Y_Ι6ǶX?13 ՁM \u`"""IfYkL?ZuVl5v֏mwC9v!Zla;`{X{8DD#w78j!f6dwm XŧsW -pP"""2 pi]9Z |861dwb2EDE,| q9_РQhN,7vwۚgfs'̚w>U1y_TB0&2 ?v%ɷ?| Wi`:̖tg[z"Ìl3k_HLm TNka<Cfp`άݮnXw=og̮ ?l{: 7yR5͖=|>gT/;f^`!Qr Ͷq''``{“:-Ru?`Z'"i n#z]~VwߝE\bfwv2ă7ع xR>Hk*"""mؓ[ݨL;g.""2)SM:o̬hHҟlmjBˁܽ'] 8DDD9ffM,:أw"¨Ӏ ^MDDiAAB7f)w00o^""N 9$>a*b:X$gRɒ+MMHs }mtCLMk;9`ݪġDyovr!ɷt T7iUhn#""E =H*"efZ݋ZuUݯэm`w8`lVKDD$Pp jQܕU麣yu"ϻ=& -j;HDD;{`b]t- |*1w&ty{"""#L)I  `T,10rDCB;60a(7QJwW% swݬO6;@z`#`Q0k ON&[(0kp?ͺ1+Fa  T4Vbc{jʙٜ"*nk(1u2҄+YB+ѻ}z9}~6/07:[C-QlL.G%ooȤ.ŀ̀% &O~O7cYcigfuuj[hB)q`?ٳJ6!^[YޥǞGU2>B ۀel\p}xpOJUcS>UN8>< L$|/Cjf%wk  9JҘ;훭`[]EAnWೄׯp!pTJpBfrfV&IwlZ?ý 9KU:0DkMeɜlmBȭ'f_{]Mbl58X⺍ksyp3ǖEupR u30o>-󚲿&?5 7;oQrm}dk׭;k xqQOZ(+]<6%,X{%XY~b݁v-6`ɺ~XW*L>u]< `oNlw&׿w= v&u ^˩%?oݺWe]>+BK7K$NA}~{XS[ܯjZ~m\Y7ul`%y\Oѫc9{N-7[H-MJ,:v܄\A2<]l+wuF@+JWb y4B׫ Mm$<ِhBˍgdfsNYB Bq tupaD]dbӁ=ZXuf׵6&T8~7p.~{kv5m hejfwRm3]s(׺D3gZ /,\cf-?Hz9Ng7w~Z|e[lmf;uU/F'[UBO/WV)k ԭM&)9Z3p< W W3]S%\ԛЕ&k&H+l+7,;f+X}:=$[w%DŽ.n0m66jٓ͢/~uh~.^>uZf'00*p!.D8'e;/M&\p. N+f@- 3>W+qiqbf?VZ̶tǚB+l#'vgδ[>I)-LȥPE@W 7y`p;+3wwwsMmo>?(qgKb}AY Fا&OR0KfvLqt`58nG~  \LY8̊~cr;M$;n$!f6^nBN ݳ!=SR~lSBWuLRl5](vfxQµ܉2~EhԖ.$K!̖f`K+b&wX0px{Xp]T3Ps!Gֳkfu4M:ݲSf(nYv7Le&xyXź͛(h؟,:VwLo(]-m. d^貔S܄rjۡ~ \89e,JxStlY#.{x f)s!BmFWw(1`&CV8 ,7nOlomMɄ 1!Ξ̞Jl{2e'wEx}dr&Xم*ل&DHu;z~'M(c\AFt"</,r% KֳnYNOR,B0< X2Vc1ڭԳn[S.@x8Pש!<ʚI] 9s֟gQuAm{o bFxH;wOK|3]KHӁmo"~/͓(g%NlqD7oW+7F?%˫4ChWgZ(Dywc[(;K|l:&ڡMu=%s4oM?EKu+7ܹY9nk1뤟}C.n=> `HbQLw#+kǯ(k Aꃖ Of|xS' -4ndP=|p0fs%㄀I: +S#!zҹRZ<(eBγ6QB\{~gA]h/$zLw$qqfP-,#\/Y*3L^=@G\g;_/q>Pʂ;Zlbs@Ol~ W;^ױ6Z,s,p^j/4*$e ~'{Xf*Va+0+❔hmD -H_}2ŬU*~p%9-edyI4\9>S>J'ܹZN N3如;`p% Dy3 [(o4EpMWuHw'z]F ;ܩK&}c %ފ-JigZk}vϗЂ'آ(+V?O'X^*SۇyyY; lGBCC6XK3G6"$78ptvIJ÷zȭrXb7cNl,\G\|6U=_, 2+^.eB~SQֲ>{{CzoPC.-UÌ;ثn+`P6Qδ9 ANMs Hs힘}!1Wʮ7De)%nvp#ͧϔ-0nVK5팒rۍ#ꄱfW%/dw{z<RlCs"-881}3*fWrWI'u/}Gfv!3~*-W{,,ӅQ-%7ZWjHL؛K0r!Z8Bf|DrZB Q^*?DY*nn$<̚w.3[9Nb ffVXp;ݟ*΅ l3NM2 M% _Bk,N'$St?5髵P;4V lnˆ95S .rׂ)mj*0BbVD:wMud `tB>Φo*1eʊRAļB7 4y`\F0wl-`f+Nfv"G5>ot96+@<@jnw4ߗ-wlkM]̦_AHj&>-IZ*AFIwz"7T/0iw'#'$- I|X B#OCBHX/DwݗvsBN [l֌V[?51}q3)&Wl `?8{mgsgG]*Rzg<H̾4^'ߤ{])>Hv)p{+j1:ّ,kJ]{*Gk#J][[qsR6R;˘}@_ ix%`DyNhj'%5 =m$1}lnD3f1 ڮTEV#}OuC)+O@EOtִb!hɒeI;^݀dJ@Ub^f(8=f7}ԯu XCKwD3r>D^ű lT7IͶ Z22:qVյǧH?hOj)#u4axy-sܩuaBlCEƓn]u[M*PUUqn`b:yzRnu7)WU^n3 WL7hbKTe+w6+F7ª[槵!j>7̅d\f˴)P:NV̡Nޞ9s<4 >L;`5Ћsk3&%w5WuM]{ڲ/uQo-~*n2M;*PH F!syyGKsg%/x7bC؛ K~_3"!J+v,'ӭ#ŭOSM UO7(gl|nEOIuc)sQ Buۓ Go㷣<p"ByӚbfּ@h:Ҕ}܌G5 nVw$d)u fsbT )myp}Vub uꦼ@LQVRe,Azg'KfVz' ~$}bw&Ms/"wd)̫FMe^qfD4:TK,RtJ<5mr'OϠ'9K°7UF#H+zHVP%..y 8x3[nO3"jd2-.OHй0!>/RTNvsݦ vHވ/;f_ ;f. L1'f 0e.JjUQ lapyՖ.1EbÑ5Z= \Vx^R 1*Qf6{U9J(9%z6邢_ͧMJ%+[գb׏y#跾&6̣^N!?m7' 6ra[.dCLQwV.Ys^c:^Ѿ&U+8jFjV;"Tw0*j0xo'bf^(7ݻ1OJQݪnMST^Q=F=wF8RϽwb 3_w-;o(Ӕ Uyl33$xңZug U~f(kt0^^M̛ wp;dμ9Z}_Tˑ1*g^7Vu3&9.X;فrwoHklM&zw|su=O4+jZϵVoN`ļl}w E*~TZStMOPpgxyX31oIP la؊ -`w+S}k( ,3{A3{:z hхpp,o{gg)ҡzZ-O5OJU$〙 |nT`gw4of`8w*t}M*kyOĥX0o 8y[v_a'3ˎP33C!h~Fu[tg+lVZ-$)y~nb.S- \"j5nVdkwW+*vdMᄪ;>afUH "zVAF G;Ip:[EzJebJ; lhÆ?&1{^C9o٩nX0eQ9En$}ݬJYؼF!?lܽy۾3̫غJEtg3aq6Csth=%fIqKf$2t!#;˝GٰmOݑu(!gͬќ:ibbz%lS3s٧?TЖپ9N8M~'ߟ> 8Uk|U9r5uڤム-lyuĶ)ʂEy}CzeHIokf+T3{_ε); #>d(ϺfVE_T'Ie~qzblngOÙ׿VpI_nWQRo%-{u3k|(<7ժcH'[\tZx/T.DUt>m*( {38pvꔢVApVr>c/TC<;U]|:򇒑~4lōc`l:*>oV3+l^kf7^{n~ܐ53հHݪ؆@?&VO fV&aM[Ӂvb;.vԅ]7 [kXgxӏO'?`~"Ti6B׌;ac׆T묥̬ݖjs3Qf/x;sR-2I?taݟ~]u蜲^"/luRE 3(ǃU%YT2'cO~_ױe]bWYW& ncfUP~ }gM;t^o\'oa/VvRbͬ.yQNkF[pW٠{.~OVowQN 74R jڐm]%seZSI'9س봡*08rJ##OvǚU+ . dO)`ȹ1:iߪ*%)3< 3^[^|#1RY&$e~mW"ߖufNm?5ζwD1km`ɤ1!q3k)Kْ׺ā;48aDq7)̶epKE5yݞoڔZͮj(N)Ej?uL (̊[uO6MrՊ}QMWOs}nf R>k'Hjf m꽖3m8L˺R^' Cq8%flKt\`ќ/WI ]l/"t8w :u)V3-ff'ؽo}lBKk'Mqkm nL '`4_>3fR|A^:dY3;s ڴ&kS<- bOmNa]&xocHmӎxVUuZ3r+6+ǖΟ#?Oʼee1\VWQO;_#2pz) Dzy؎t.}_$w4OQV3[NaHKUr&Nɚ p7&%ݍ-U+^8̮o ml3;xd(?QBx`ߕCG!eB/;S]\3}9؊z-BbhHwg~kf)>Dw/-T๜kńyu쟙|?Fr~C ifBf6]@E|Ysכ^ʉ-4bVn +f'N>]VBۚٸդKщ0cfZÿA:@)ØMx[a7ASl12`̬ 9Mr5n3+fC3rs=B׀7)N05oT%9orT_mC/r֝0b![Yfa3^>7dߒЂ`6L-B~M諛Dq1%!$' -5uM+3ۈ?gÀMAK_ dRN9 aN4/źt%~7;.. W;{q< n4dgپV',wf=_ɔyQftC@6x7>ɚH/\_pGhL=e3wgc^ڲs!gS7ޘד EW"'XS-c 3; 8` ~(]8"q̈́әi7 }3;xof2ݧ <`ȿ湑-H/uSsnSV[ wF-~"!gz8!P>5E3ǔ0pܕk& wan['&.sw3;Uۓ?Z ]wo1:RbLහ룧8`m|gwn򒀯oN~ˀyvo\^uuwX-]ճ|W߬"2ɿ֚\3}_w߱gp9#NeN~@pw7gd 8 ,Pهp^nif3GepK={݁;g _rfldߟnyAE8z:X[*%%I(Uޝ'&]EQN-@E1mL'\vI?kBਖ਼s*~.fja غDNmM:B'~j_+hwyF'o7yEl%qE Q2fw6|JAy/Z۝IBxDb*o#앷cN$\?X϶BMc=~GM~ W#\Lg_Ghr^w9߉zX3O;{X=%u^*z*m~{i~/z=SK+( lo"P,2k7Y]+ϖ92g A+(sL;UPf%7SeM#GN$\KXs 0g:\})Q6tJlA2^%~N"j}).[}K6gҝ(sEYvۆ OD.$tzkj@+`\ |݇t®x[BΑO1!Z "ɳ;1Sݬ#4n&W …^-]kf;8oIsC6Fx2;“Fo 2YyMM~^f'gmY:?of?&4߆y^'onɫUx4 {}щ}Ulxfv%Zw?/>؏pkwe~'y;O۬d7q& k6b~&X:GE>:zgE/'^'|햕7>*yEfv!u4Npa֩ _q\JxH5Z}MhTR)mFhӪxY'KΚF8`#0J ;Қb0ݟ] e0ụ ]֟"5aqp.3bM u׮[&_&_wwyyuF3pNO55+t2;"""#HzS(I*"/ gh9,"2Ti(t"`R;"үlf|WevDdQpGDDd'w_%RX*aEDPYDDD Mz0HGl l5xo&wNLED;"""#ç9>k8&!ipW&VP'ӯlnY"""}1kte0,}_vv"">nq4Mrf[HQpGDD?KZMe%䦨TDD)&CnO˙~t劈%wDDDZf6 8$3VGDBoblB: w)wDDD>f6Wbwu_wN""EvNɖbfrf?VUDD;"""oqJ3[ƚh3[NYOD$fm3[$-afYI`w3{])͙t i=EKDl &}x<&tZ X`v)"CS}UGD$);!W }13w^Ay""}M>df'nn] }f+&"R6>l DWy^"pOH%ED;"""}̖" üc#~W'"R(Bk,0yxGAj| 1%"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>HSpGDDDDDDD)#"""""""c 1wDDDDDDDD;""""""""}L>f`^WBDDDznX|tۻוgc3z] ie1wDDDDDDDD;""""""""}lLbY]V"iϠ<"RE""Mnpg{\顋&28 DJm;""K{f/ 05#SG{TU)#ՀI~8m_K~{Y)3[8ݏmmDDDDDDӔPY-wo']k1zT*ml|fueaf43{^3)f=cf~""""""C;2pSwGvZGg>וiI"|OqiPnY2Ԃ;ffv/Fj!>8? #`o3Yk4]&0nڭq;NaV@hwn/ͻ >ffӀK}2Vy~o lOh 5.~^pi-;9wŲƺۭ+""""" HШW -eifqߛ߀s׬N̾<lwZ,Cf`B(8-+B@*7`,p2]2hGc W6Z{2k'K_1k1Z]Jmaf'!S{E1 ㆄۃ|f6?Yt`fA.3խ!X p=᳛عg6%|FKNDDDDDDܑGL'ԯhfvpߚ!]z;qIfe8LkwxjO?;n?cc{ Y{u˝Iܜbfe>3uBhTV-w|:ݟu=0V|S&|+fl,^[%'3 G~ NAsH IDAT7u?N ~{*H;2 JVOo䬻"!<eȬ 7fWpla(EFEk+ neB%-IGjUdf?&|v6':aun5k58>ٱw-w-}:`'wK~!?Ҍڄt#~M,3=ϼ/p]E7V($""C|Hܑ&҄6Yw&`V7}Ow㤃;y(BZE[ cZ7Zޝnlf >̞$|ݽme_'fr`vb@-._v vN ֽ̮&t!瓈xX 0̎ɜ#EDDZw,&Jvqg]6;Нft$@ϓRɻk(jS<) <^P7vV]Z3y]uY;;^fvw'&T^[h!GݿmNpr"$Cvrr;ޖk+E;;H{p5=9zXDDi Hlم4V*lj:(XfTFںbb璄F65,y4uCȻw~BwF:."t4XZ Cȫ40b+b`3AwRbٺ\@:HxY}牯=l]wg5MB{BݼZQ`3yľCj-FXwo;-ww^!9ON-X19v6x[3P<XbB|sywls/s5 Fy6LRج 6ٳDDx] |+NF-j#vwXYcό%yL,S-空&H߫=Txݧ$i;24fim |=y ɋ%8nϯl,j]V53PVe5ܩ jE&f_>G~$)Ho/,[ Z4$ȋ'_ʖHhLDD֠'$_85aCl~Ϭ3;٩fvTvywY03;!n6361C h[cb <~nff#Bry[ 9{~gfZfܵabkfs4 O^gffgGxNK<a`x|oe4-kt2s-qJkb"[qy+Bf ""}_NZȰ;2\!+JJ]lD@Ǜ5'{Kno>wxMv4% ^ lԶwkw53{ -Q07}3;p:ssm\GX!tw"|']fgVEl;BUK@$(Zjfvw7cso7;3'fPH؇73}2}/%"Ժ?]ol"""M )ۻ HbcAwn턼0۸"taZӗ&$[ uj/ #$7kwYXB~"fvdo?}ոrq3`ɍ!O[tw]E(& &a8.vّ/ZnsݓХo ߽b{gO@#.6ȬJۻoڈ !iFm\cHrG }:Gj2$qclk zy^o4ۄ>Eu*cmf}/p|ϛjlo8YZBCBK>>AQ"7kbo$=nvIH|7!M|N""҇gRwuH~Mo -EEC7[ν1^''6..N7ڨhB(y>ns """]ff7oI0EdfyZ߻U'>Bi=)wDo-(SV&tI-CڢX_Έ 7. mbR-Kz]4Bٖ_uK%s p]>""GrGD ~-4aG F""P&yNiSDD):iݟ~zHs[PWIDDZ?{Y]ϻ{#"U4EDAAPQҔ" j!(6dAi*U*JY J"JUv^2;;dN69r$$IaDJw%jg$Iw$I$Id`{" !i$I$I$I$RLy`-v'I$Ț;ɐDҢnDݺ51,cLnṋ jkm5c&I$I2K)I$ Uf>\o.-?[0/FW⎤25[Dm'I$I-,'I3v(I$ IJ8!ZRi?%G;j1t>sVB x!&Z.L[_ Iؾ$I$IciI_iKI$ %k$C5ߝcNNՎ}MkfWA`yBH9> b?$Id(XKڻ$I$wN+ĝ*"n#wj/cFMKʬ-%m؇1S[H$I 0GJ`I$I u AD„r?pl EB S//i6obթi-4ya}_}-pmH$IvΔni$I$@F$C>GH7p+p,0IØ%&)*iIT7.+\I^$؍%463$iI_#IJں["iVIJ@̽(&I$O5C[N$I2Hq'LKZ'K=,p&! ,E^^~R$#^+Na~M˪a $Id(I_l$ \OD,TI#$!UI/JzV’/IwHEұBٿ%.i@1t%$-(.tS$J$IZa-w%jg$IC;P7)G͸ I :%l]5/lvҚD}/[-_E7c{Zj|8:Bʶw*p[ ^+?N, ݁G?+{ԺYf.(>|!!`_$Id@)X;!gH.%I$wNmTT ?i;G fVb` eZa0BD}ucKC=RĹVKqI:xX=wj7>B41Wk~~,iDvk_)7}m?l{Bdo._Uz0 0.o6"H=Wf l{eӓe]\$}DipLJ\ٗYʸCR-ёtڙʼ%-*iV4Ceh$I$Iq'LKIJ $UbeE "NT32v7ȝ{ޱI1]فm`$Ct#D+ؾvռo_ YҒ):iF"zؽE5=]>f(| w j3? lO~k: 7qF'"!%OqƗS;%]#8-iΒ{t4$.iUI+*٩/cFl@_wUI$IZOvJ:}J*i=Wk)C%ʌ$ďz&_&Ďe6 N6&D.6T4pg1"m_'cK)Yt TIh'/7H j_Լo_,[]m9md`˪)MdE#Tw"8CrDlPoH8~ )l|]nJZnΗt%qn*u圷o<5B&?WTGDi <XMeS id붛݀$058$IG;PiYGοmYP"; U\WB<5o#.VG[qrR_R%]QvU C kttitĬ6YܡfzIMl/`Y=`eEd]7CD,=,#dۿYk`sIww':|}-޾ܰG_~dߒ~,LM[f=Oy~]HZ(!4\H*Cϫǡ m?-i#Xu^JtS;fR9'ĝUQV4It_xx]|JZI$0%ŝdӫr1}(*Nv6e5nuS7W>M-ț?[^=wězqjQ RkOSPԋPT4z*tS$I,#i/B yX: I]9;D-m_ \ROf})l !QP@G<8fE1~Oef9^Hش_^llOv_x؅8z<(L"YxP-zu\^/s#]GDy7/Ye$0sw+kl!sl]g;?k=#ifD" Bŏ;7_4F۞ЍӌK}$m9^$I2xɚ;PiYsOmZ:6xOX|NtX2Uj {Y4SOh.] D*˳ԭRP6lOVK%i^&iҲ-fDx>ut/5YHIr>Fk7V)wKZ_!"g Km?[qJ_] ۷kAOԜ_+V%gWؾ8y@"D%Nf ͇?b6zE+BEx"DzsIOʞ$%QZ5GarBI)~L/՛Fu(K% v"BuWNIk,߅8LxyJG$mPn.t$*t$tC_fu$IO;PiYHUx~z;El$i*qC1e- (?i vWN$B$RjLWi :P.b+!U*+ݫl.QU:ֿ,k&,Iaۗ>q=BҪ5,LD|KܘFwT+~jŀL~|i$4jsDtH`II:8w"ăG%,,:x>I'Eb" :,-ib~I;I1!|pc4G;پ< y8wmQl(B}n7Ŵ+aߍ|8PY&">mbg&"Be{eBDtlj{cK櫎N/Vu[lo| ؿSEL5E܉8I$I)$CITW\%fI7J[$. uV/] ,.iE"F#iӜzk&S JS?##Øizn?" ` Ӊ'|NF8HfQez=UfLܹE|||lJWDY~3qȝĝ K܅DG銈8n.QcDw$Hu~7"i7ܽ*+bӒ-E#R.\'Wq5Edd<{o>mDz_Dd֚97I$f U^#B'5K$mB< ކ-^%.6 .G- N`2Σ]$EI,SνJ$CUKzT oJko"%b׉K69љ!r۷Hڝ=͟K\~0t!4I_ jf -۝ډPIWqY[\`Q+ވ;$G}Dùp4sIO9nH/U}ڛ4L~@Q-/BQ/- zQD{.(|&W3FOUvVMG?S`/=\5J̚;88_+N'Ĵg9]BD%toZt'BUVwc$]XD:jCAlj>`eY=w{(?Ԥ"Oߕtz I$: IUDYy+(hǒ_~;'2,Ge8lSr!n<^!:NS:  kߪ{b{2IOza ~%(~}EJH:vWۗEIγ}lKz8Nkh?! UDQlϒn$n|V!D*Θ֒^$ҿ-i+C(?t7M"گ|EҶı6$lA/Ay]bDjl%]MBQĤĆ; jDRdI˚Q|n FJOOo.6dT75I$w$i"FLDJ6ݹ$f 5qr.Uz(WۄT}<)Em)Bj:"r "--"fĵJ),DDX.MD͜g>I'jm?XJD:u5)bFI"]wM"be* LD|D klX KD8Mv#"nH'R"!Ҿ'"] :mB/{JfU`!ŝ$I!ŝ$IZFy~P)ZJ N⎤%q`7֫dFAr⑤㉺H[#i4i{B?3k_M=MDd޶}Q?0!VTE RI$N$-\ >"lUIs.Na'IiDQ!Ĉ{U KqgyQ3m uoi0#piI{N%$I< =IVa"li GB~|˼K$I>Q\l]3ДTӀ%j$I%#w$i S#:I?ѤL$IL7l j?t#%]Y_(I$:$I)E4_q$I$Iz$DukZ'I$CLJ$I$I!끟i;I$; ]\o]coUg_nP뵽 !oo `>{{' Z{k8FOHcW擀j-Mt꫽/[X6V؛ #ڲ$R7ч$Id ;`i4*p/peaZxر;X7M/_g{G/CPQ~p:{ǰ /)p,$p{%}m|nKl?8=;._|:MX}_~ Lu' E.DW??-MeNAn4DAgn?fj7OtZEaikq p }WޫT UWںb+TN$iYٰmiMk@[X-o{36^vdڞP׳k `>H &!_MD>\e[{ v`_o]xѧWҍ=>5m>ID^aifCK,lߏ~%I$-$#w N#¬/F.&~ g{ޯa0b\r..g{K{}WПn 'APDZZ4][E[mmσW˺vS^l?>uKF$I {ޘ;?g#YLK?{[󦽖#p>q}` _{_,飽ޠ&{|G(|(0j&ϝDXoDJc7KqI5v! KeZ z2w?"~ZP~*E$Ii4&,Tm#I#3p/~%ɴ#ݖ kȝ$rg;H$.]n~-T`Wk=ܙ6$-,L$Q=I`Śt$I9-b(s\RIMm[fe]I;J_̭1I$I^(pZLVWI5:يHVE c_a}l$G1N$SO; /!^ llZdpb&%-#iy$I$Iw~ ؉t,zl |GR[O,225աr"Kh1iZIj4@!iIISUX^iʷ$Hq倱h`z$tMO$.I$I Bl9pH֔m׈h-{ؤ&6? m?Q3KOŒ>\;SB|XhɀNcEWIcu$ ؾ|<$S+}K$I)?nn}h,fZԐ]6fEJ%iIQ~"x&imII25$ɀbwJ8 iz$ l0Epj;$ɴax2`wIk?Ì=?ڮy+ӝf m"rٶXfb{QN̾g?$i:v-F\ TE@{Ov87@5|^w0!$\U D$r(!o\Gԙ~٧W4NJ6I7)aפ$tKD^r{uc[Vs9qqVepdc,|n߬.%p`7xr)9I?QZoG goJZɦR}RP2WA ɱ>*<~r}w$kygͪA;^,mzڮ4"Jcb϶o BqmQO׈aR5۬KtL>&)c^ȣ؞(+}O|~ , }H!ŝ$Iߵ&q1r1RtyPLvē{7ԩa4v VQI$ӈ(S[pa{۷T3JϸY(})`2ݪ6c AD9Dj0vW6x6g[>@VDk\R c{P|Ylm >Bj_$t}) p:Qx9Ia75w.*gd`<"-hsI{؝ -IJ=;z"r =Wĥ*bz#ދh_o7wIyKEv:@I{YVL5qzVm[v'$IGU ZukH4v4 7Qhr4vJ>k#I2 ٗ1rdo &}CҚKKf&-|"wҢz*iYDL\ZzЍ#3'OI[* q6} q__҂evLYu'IyG4ד~!ŝ$IZ C࣭*lDW狊=ZHz9/I~kNpfȑd8ml{B`۞Ҳ3oe`mǻSk6[K NK%dz.%&Tζt]#47)Qf~6-(l )$I2؏h~/Jڰ%ÎF 6$I2gZ!-vgQSHnV;L?WZ"-k>V7ئ~HZk5G$--}s"*ن{SG+ \ To,z.l?L;HIҔw$4f:$j$Idpjn$;c J냈$M`?/ڀHZD(I#WJQ--foIs\M]BSE=;ִ-iWIdE`/YPro6S 8mM&7w(Et="=_ȝdQjKoI"NI$I2ߕ ,B%@D@9ԱW/ֹX2I;@hҐ{¿Iŝγlͺg&iUDmcJ.I98,;(*}0n &S ^W/u)cHZ9d哤GJM$uv4"0N(}Tee_%m*Jz?I҈we<)x𛍥Pc|+KK$iۧگ$I$iEi7~a?5=}K1n DLb|ޫcA,\;ƿSX# PRfjo6a3`z P2}/KV$ڲd<&ž!Gl,vJ ŝ؄Hxa`BYM!$i$I?c~ $N۷ح$I$\FtD~t{WndI7~f: <>=D"gZlIvE`6CljHuu6I@;y .iV"4lIIZ&p.oI˷ڡ$I$HcKةoz_12v N":P#m$%#w_=]xU#Q QNؾ=^K$I~  Y &I$-&ŝHcG-w>|~ 􈤏I23XI JZ%I$PuD{赀CZN$IB;Ny#i4Eؾ6wKXҚr OlOC6%V$I$ǡmAm3I$Ý luWmY٥.϶$ K~Gi\_4ZWtL^&~4sжuMd6/0Qxa6xL vnΐR2i>TN^B+IdNcFr^gIc#Z#I)$I}<5$n5hkk,VZŚ9jF7mm/bOUGmfdis;y‘$hkKtE]ŜDև˴z=?I:8%4q^8$0!ŝAÁKZ oھe%ɌIUhkM\.VsJu:yq~4ajvxIAev-'t G:k7FG+5X3wLZ~&> .B[PF瀍mOU`{"w=͚$0"ŝAgȃ9%&+-t1Ifl_/iْ=v|,UΫ7Ogxi/Jc'D_cbaBG[' huǤRf`Wn>C`lDDqɈ.Ӓd )DG$=.&ɠ;3FK[,KS :ү |8GC\@'i"V=[V2Dhk!@7ځ=sSϴإ2dyUJ"ŝ_4+`M'd v p#p %i/.I?Eꎤ?fk=:"ěY[׌H_qF=ӲZS4pr(Zt-DuH鉇[@O>WΒV447V'i^c-+q]Im7=Jv }u0Go2pn}O2 RRܙ.{IK`/Hj6H'IS:w.i@I MG[>l\3{mwlY~D ?eW+#"!i˪/_>@@LHZ&z꣄!C!k; *Fa$G8W[_ FJl%}j_mm>E9Ou&3R$¶L(5pf1rS3-g IDATe&emm#Hg] vׇ糃$]jV;4 5[j: wY;^!ĈZ>_W4u}nEem?QƽZߩY4j&R*^%RRl fBZ/(v~@N_W]}K:&EBD~%}{åvDGlR>p9V#"jc+(鯶_/^S=IR;pIS=$i"Z_wwQ_ጔv$ ۗNtZKG[G_".*o^k2}鮞{vDbڧjӀl[ZS˝@ͼTțj[/K/m?E5lO-e4ElTo+DKuv6B`'J=p01T[o{Bf"mJ?7 RBخBv'GKmw]4_hk[y;<"\zxe6]BO^^4o]ZV$3mmk \zíDmZ%4nW{ ~fv}_J8%4A2k{ըHA38^nԯ5:8vuv(.$;:;w^e}]EM [K5hhgIS|ig+V"ڂ4w+^5YҺL?U違궩[7<_wfR>PSKZY .ʓu$[*҉me'"WR}=1sP)gLg;t4m'I@hCt(1o8"eqD%]h{|O wJ:S3zHi$[S'FfQ_3YOH_(2I2u%-_Y`(]v rWG7;DLjZ1fI$t"x}tF+RF4v }*z;(=VѧhK3:DJ"QyKTJ:N ^ sUzR%@n&ipiQ]YLthODQI3:>4Iwٕ"jU<|HN'Gm?Zg;A{n$%wz%aU!Gص$@i)I+پw-A ͟ 4owlw$I26Q dөD*i3q} -9 -םjflN$^݄0Բyfc$ܒIH XmkmIg7K:x(F۷¯ʒ:W!D.(86./%$F;|fRgܒ!j%Lt$sDje+!+*OJ- {-X7h%$UB|/yuCǩ)CKps8,`CBԮf&+=wsƥdm;6"dI:Gڮ :/Ies":]整4$$ԐNK!C0Q҇I," {Jɒ6.-'ծ6+z/Sv H&$.`YR$IOFDu O`1LۯJ3 > 9y+_!目NIߠIQޚu:>iwʫݷ;Fd~eO#%(o>JD)-\_݀z%D5˶KQ2Aiae^E,؟~SRQze()i;R@$[oIIqw⟾(&6drL%L(/OQ:$G'IwU3*j$"Ūst7I Is7W)*&It}(O=}]U޳kyf_Ɠ;S7"1ضjYMyMc{wk]3r'L=κEy -2-';=Y/mOuQ+3(&f}wcDg[pLߨeP sWVx,.0gDGs|/sH# IK۾? .'0qL}qcdjѯ⎤ف*~2C⤕Z-^M H7kiPL?Q*bzMbٸ2\h$]FvҘ%vcfQ*ETt߀9aՈ͟"2GMPrr_o: t4fQn` i9^fQ*HdQvǕYV$$'ߠ |x/ece2pi;flPRz %i3y3D}6݀ ߻[T&:J]âM/mMwf` xneY}%|9u6ݞ"(4}B?i1^t!Vsmd&~ZP҂kkƒg>H&MȪ ,2A3 a*_#1#" N IHFәEG,+A /V.4ffA{%5ҘO6aU@Q`e~IkfG0Tڑǻ㴶r= ;Mc<0w DEG灓%-?lFd,Ndi-h2LhJ掤ʼn4lO!L4cIH:(waZ$U,IafQ*O ڛkSNaʔw7aU !2 8>Z9;,OM\tJ<=ţΒYo #|"wulODl_\. [> 2#'5@uv6PR_R J:J ie `&O^9{m,i&;Z歱lbx1`luڿ훁ᖡTZ a[{挝%`=+Q)q@aNbbx B/-h0Y ck]lH%3hfa{$&K ߤg%MD7m?g{QJpUpLf84ꅒ6vTEԫ Rkތ޶|6a=Ln63}wrN&3Lhst3#iQ֓M:v؞,i-"uwgLetJ!=br.ֹd2 HzO_ 5e/4`sݬs][<3 8KV, uN%@X* I[_#QmX6u!.#g[ ;̰Y;{צ;f^Mk-*R:J6w[˓ A>( .Z_CB~=Kqnt%-ǁpr8QgzIGW Ѵ"I~p?ntl$\K|V'gK ,+v4%sIJ&1RzytqX>-kf73UPiqh@G$`O¼/L%cGpUl  ˄3]kIgkʴRinV{غ\f\,lj!J!|xM3/t`S`WIپ17mW L-ti=+yS9ΰ])w "l?ݴVnqH@GQ f_k^;ؾ%#)eF4FIփ*'32H+!!:0Q nN"2oƬ-mon{{t4a=&xLxݍM]xOvijUVFߛl3(yL̸*k,̙;0iNX qf#Q[>X]Uc O:JՈV.oV.?ڗ~:e, qe2CI%=#Ľxg/$<ör/PA35aέX _&2roU̒4Vҕ.a߫~"j,zo!gd2Æff`Gs ^%]tl<]$ J8VRi*wT x?Bع)E?6kߙ`'ep m@f}(3I7(f2#Y}%m(=fJS_~u!fRi`nVۭ\~j LRiHEҵwH:$<"=2E nkOe-eŝbLWs/Qz9I&$}xԛ3YNq$G^ vM9v c1WC/hPcFT?~2#Ri&¿p:)=`r ǒ&822a@!e*430G%&'؈b2Ilp=$\(L畴,31~EV3d~7xI۞$i^"D6T&&4[Y"ǃl&{ݪW$ lRhַoM~T5qC[l+[SiWKvdmT@g=mo)DVGK.ge_`%HZq.V=c$LlOtȼX*U/Cۖ5p"%1 u-XRD‹S>'.5qNHݑ$=En ,]td2Cf;oki֯4 '?;JzM"ʌ, R. fujmTFG$'bƿ7hk+k^TDpk'Kh' taFϾ!Dqv"Ls(Dd~kqS[|D)H.t;0W*ב V ӁM]%]gVW@=~;XV;De-7d2ͥYݲf'j7wJveԔx2C 7%ߝ}tTZ ;N1[$m'in7 7ktcIK:X*4듩D%=OxK=/"&z*kX nq+3lX2]5O˶]\x+nPL&3hVYlqۅ#D7Ł5)ly֜iPAtJsb T?`{% ,[Qn(8 X8('Ike T.NSK:O.6$2q .uqC(!| Fݞ!BG4 R L} <0anv"/=G|`d2-Y2K ҬX.=WG\@jgF^. IDAT?}9 町!tJv NAQ R쭎)_ѻn˲$I! 4--D!A>m[!tS]i "Pfв7MX2;9w.BYpZa l_Ndnh2LfD,q$ik|KEw7Ofmw $5+,3H(v~Or^ V.9? }Wפ!0 p4 l1i%>Nkl{5=A%\#voujU&y2Rin"mn s?g@Gވr6)|&uK> ɒz|!dwt]$%iIKZ/)?B3cX6(ۓOfc{%B̂1eRi_s"Gm7h?$ֱͱ=nL۷U-d/b$qD?,は2.7mpYfqWwT0nX͝5E,I^m%y20Ɍd"؞ lN$~}xx3p")`GIkb x0FLku@Q*t6rGIK[cق lqQf3l8r9(~N1^II8m?!.F{aDIl&ɌH֝ LɄi5oGY;č'ңnIW_H^Kr)ɟI` 𠤏:Ls(煞:~[\%1dI-N!:}'idv # %F &|;,/=\~rf\< <OKpM6XC1tnPdF$MM]Lt(q,qyx?hf ]0'q),34 YrЦT:8@d\~unS1Yg5o#5$Sc4AX_,Udh^ND+nIcٿ@7rF̳Q*mJ!V.! V@.'6`7R9XSFڌS$l O]B>:JH]:ዒW4c'3,hf9 Uuiu@DҒz*_}$QF7|i"UYal?ڈ2]ѬBSFey2RGLSs 퉒#nBv+RimT7آ\1)ֶoBJ5+5o 7_nnt] MDQ#ޏDgۆҘ}<&Ko%J#w٣۾/Hl;5%x+^ésq`BuFQ۟)3Đ40Vw-–$u?pF%CzۿiqHJ ǧZauemm/|z BVՒuV zU#qPms sIx le{Ñ&._LK5eIG41 P8iRXʸ_v)pkaZ6" fHa%w8Qd|XgdqgpF}x'X vԧ{sI%Gk^o_j7"kfV Ir4SDFUϧ~A}lOJjOAFGpL|`r ^.G'{}mIwJ%Zh|GyY25^ (hGTt1ZO391 $m"iêUG%!}IJq&iI+}.#N۹raN2XMs:s?cӔp+gn !imIߐ4]lSʲlOmIw~F_"{ˣEƪIٮ>g*ʙbI~l@@e <3>+C&έ I[WfzRժju,++{GKITE]M4 ic`kPe`]`[mH~d#:'W&J!g"<*&Kڒ8|X@R{{IgўV4h}W#Iߖ"韄)8k- |(}ǕetL?!1Cdf]KdQnItj׻uB($o;p{oI}?hUAN>fk3DlO& BXX |/K*>=(Di14[l2Jk(,Zl֗c~W-DzU7z}4 ĉnD El?-iKDo(Q*J\x{Z[j>A7XYXA 2V>&XAI -DE|r:gZ?Kzw<hgdtpuLޒ6"k.VE.L屶)Vp!1o-*B?O4X;(0|Z~D:s2 w = .h#1J:Լ: I+V{rnLWkWשhJƧ[":iWO/QP|NhGw~DtڔJ)+%}6M>M<ku6$&8o۾=:mOۺ4Xz< 2j`eA;]*io:7o iDn",;]$o5b(D=1ة\3~SH|M`VǕT`%I7׷.~/7 SCnVKP2k:M!2JXHx4qwH:(CF(1 qB@s~HdCg9XMR6M_tg$KGV /i |!`?$}w6h{؋6\*\&\Ĺ 1ب8ѹStۈlߗ:-KdIa'Uk.7^'FWı?хb"rv<> UEDC}sk:dlw(`Xw0Nv߮[}YL>|TN- Ot䚉JdEdc[ 0EҗڒR%~itx#*E>LVϜt%B̺5%"b bx' tW'+-Iil&}%_̛[SU0O9a8x0Nk+n=B>VsݞCC g[f@9`-<_$IS5dg!SbHSʁhFr, Q:JYmsu^ "҄شI1Iڻ,p8!N"i\ -CD6Da!0CibV? x?F; U,yqCe6@E״z;N$kɒblh,u}\C;=ALOIP@@9 ?"ĝOVgLW$lDăNϣ$ǾOQÔ-5J>MB϶wX~pmcI ĝ5lyƲF /腷aDi IS$bB#| 88r$X"kBԚ@Up躀8{J3Ӫ+gk"We{^(5(.@B䚋8*ɒ!"cFIrw&<L-nKZmF7Q#5Kn+idO5ZU~YRVo'3tJ{Oxz[Nk`RII4qč1MĄD }8E[HLҧyj||G#ݼ~ҀD5fm ”!zàŒV=X;p~jo:ŝ2wjj-+$Lg6B!.̥&eB oOKT^;1Zm<=A +)~*:SN3M6pv3k)Eu5^G;Q[ܩNB3Gק)w AX'NbeMVr"񲓤l+[NM_!$"%]Ys"1S!s\w T!{li7ӯW ݫr?~_oH: W."W[S)J۫TmS|%2 ޤˁ%GhLbhS&FnJ_'f^=H{3L(YgиS+ç[̠U"ӊL?Q*-@܈;r۲ 8II:86 1cu2pRW7 o3zxI!fNpLjGsؿ#nttJR|mpFV(Lt"&HߑQ2s:1 8u6ۏScf#]G9\YՈQ(jkm;[z8sFWV|D#Z˩GZmgI>+P[yYʅ=XII@L_h*헫֟(5d}"ӥhҴ#Q=6"{2YhWyn@DrtrL0=KTl@L=XQ%G|/f}hųaڮz湠Yݲ'hYBkSnatk/~i6j 2K%t7;D3ݮ$ΥpTj6RM`Nu7KGH읖t]P c{IgH}>; 7':vHIʷY뇧>"ڣeN#JS+H ]fMY H*-޷Ft#J~Ax2+:qu DW"r_&1*EJ1+ QVvu jXkOGZƶEv31(¨7l"Ck\Kńt"$Cd~]lw*teWx!Ya>^):ֹs|5jy1Uk\5w1be%YU={?LN ,3x8ř1ݫbͶry|kf#`H\Hʩ:wndƛm-֦4yPzoHc^܀_co2}g:MMEYm`G{uS\7w&c%-TAI23DmSY )^깇'^`tuwΒGmBih޻pz%t*S%bg^`mb} Cw<鹺 `&IZ6_(JYPEfWO^]uuF]gbl_fz]yU.WVI}*,DJlt%4bUZ!=ϐѕyjb3lg,s5ض'g7ʽ;3r}-a|^)@tJ3mm-Ұfj6EL'Qݱ1`~ُ81wNΐ @G o;Za6f|>(4Zif`%Ptz^h1twY ӽʃ e!iJbVIL*)ʥLOZ6;uwNύfA {(WI[$QZ V䟫Z1ysWbhŪ兰ְ(`/I.144b]>Q `Dz.*j `P_% KZehIsTLJH,Ht)h-`?IE0!:i*)ʊJ/$}h 7\"D!t$:EZFBB&iaBh|ΌZIjDIT5V3Q')93kMi;`KkNJZ=S[@*jeW̝F(oqGҧ3Տxq4r܏J:8aO(~ ޶%%N0^|v.g훉B&`GJ:n=C137$_TY*&jIU$-!i%I_KCxKψr#Z$j͒fRi:;ζr:g;QnR^mR;؇#Ѭ׉OV}-䬄"Q2 q,h{3rTp+BbpJ`b\zW1AQ$!x AKo"鄘17{"sTQ |5q'&M~Ȕ}&Hz ]%uHb;y%m-i oK %mJfUoH؆fIkHZ4V* Q+ 7g"ϊJG;U܅"zi%L)x`O&nNh$DwN(rQQPāuQ~1S|nbI3 iNI5sP{:azx0a=(>4;52ZaNʩ9$B1+{%a;1fv`_V. =. CN"ίyT̒% w$IжQY;χqCI /7,3lNGD-bHf:5`wa-Im@I5> \cYQExqOUFuo&>^t]Bͱ>+iiba"h*kJZV#ơ?#Scw% ңr?!t !YiBMt!q/q}8oC[At>;WkOJsrXϥ HBT8BP:EgɳՈX$M?1 }R}%5H"O&iNۧHZ+ى ݀l?b,YQ Ats]LD܋ ~Xҕ$kI* {SK`}r{"HZ!izܶXOn:\5Q?"B1|1ZҒw7V=2#htW IDATv:۷HZx0g:S׺]3%qt'Zݛ/IzH׮U8pxMI`ضiÀsiffPL]€23H\/&Q{Rn=}q!$ߥG#Z :}jj&#N4gZ6p򹴑`:%JVˈ:e}KķEە߿—^#Dߦ86xh> ߥΏXO: LM- {(^l~ߑH49^'oڕ$I[EҮ乀\wȶ;S DYxva Ic%-ꪞ1Xt+ֶ:3:gF(i椦D6nڨҬJܓ)20^BxI:ڒf_OiFڞAL#i`7=fחmN?tG#/3RiQwD\՝$jM̪9]$Xw81:DҸg&3d%4q&G>XV&J~l4G$/2}crm&vTn)`"_}隕$QvS:CD%"̶UlH\[NG2WZfF/9>gguE<o[~'v4c5gmל >:J]p|O _ΰ۳Zs8Uu2L/HZȬ ؔȠ6MIfOwJSiC!0ab{k)I5ICriD{Y$]'SiQ*튝dqn$r7v@I// ؖv%Zή,Ot\#r|㚁ѺDwKZqez&ԟ쪣M!:*Y?&{$yLTPk#d2C :Nt.{8~/mtH+ؑ0bČmz~γn$JԿ- |؊(;-2#SӀ+ZࡣTTn3gef m3[kIzMPf@oTeZHX}!hf2LHI,}Jd-MwRU^Bd8gx̿Iڗ8=j{z6|P &QNؾMҧm?-i-1V58uggPP&ZU6K*ܔpFhYw5@_ŝS~ng~3m_%1 TL슫*"5-ݛI:(Udw隶lzeوFLf,C.qOlSs䋉Ʉ˶Je\R}}>C+& ;_WH1Ri}bQo+[Zg' ,kגZ辯q Fҧ$]#i;I_JX+WKw$݄c^=AW뼞K2ɯǗ /e#}dc$-`!i-IJlsq}gz.<"iΒW.Wd7PO2c2tUmXYl|H#?l8b=Y7l+银ou\MG4 ]h)L/Hߵ <`f7ƝFOn$J;L?1y79Β-Y}C0j,?%L 7"&f2z%Yo{k=%L6l%0D:`䇄]w$\Y&|2p"qjdxQv|!?/cLIm3>1 a||3 _.}CJӍ>Ҙ_kYi]:{~@ҮDV·m_T;n+G~cIc/I{~7٣ŃMtLs掤EwkIW͵2MWo1{C19mv/a˴RiYUm+Le^&i 's<H-I}{$2ahqH]qox]b7mLă$MLަq&5PBĤ߮xĘu{B ؗ<%id'$Gg>!5wҬ"ĝɼhyo7A~^8Vsݞp#[Y1M.tJK.ri[|sœ4mw9L6mc%f~5oJm݊I`[ \[-+L;9mӪX2=Z~;I?&~vBKkekHgVT''k4*=׺WAib5| &؞ ,,{}K;t$ѵz;O4sC/;{a@eTksUI3/[rX;֭}ES;3LH_OWIza-k 8 hC-K9,@?S,|ha}L2i<ş b wHElRd ]GL!Fԅp#Dk[/2LC $?$6`S+% ؕү؞$ibIn<%!)~ p[%_b'bWO`1X$i)`z}iXv4szʛ_E-ۓ?e2[qk3,'[!7=ܑt<=I;ھ6-u hzj,ˌL .:TZ*9\~4OHB\ $o>?^fK2 o]%-+vr8!n#\#eOsXة5Pm W͌> ]81;HZ 8X'v:4y`HRtj1dch ]J*i,CL\[KȀ]XȬݸbowoe0@d8ݓ윚<*ٌ0bo>ωfįׁ;Ÿ9%٧N"D|} x8M^uǒքui{ӈq?%^,T!i~IWOPoH:3e1$)Iy%=#IIJ]%Hdȗk"iyIkE?tV"Nt{%%KU#iEoIZBG$m&'v oIJ&=پ$mT0\K ֊;=;Dk“*Mk=m/`{Xyw2M{I5?hU~TZرէ{˽.̴_]`E‡`EO.Jo1D\'lo>5EKmY~/ԚfMb@pݾq2zԿWe+KY_/ ?>uDX5x*e X# Y8-+SR۪]u5PqO~3eь#֟@`{lF]"Ģ,_1(Bi}͈.a>x7YQ1n}N/Mm+}Ċ*q=ې(iةrI칓8w~&7 =HZ8!2!ƿ#8DQ:K >PœG _SX$2 l#ۡf;1z%ӡ0+v~DY}B5% #MII>B2$=Wє3w $]҆~\ΞIÀTo{b)p+Z`!Mt|~դ^E6i%7[#/>Š+˶GW:ePg:!MȌ'+5p1ީj-lw$UoA~ H\D@( `Z, T$uI%/Y$(93 vMmuOLNz]u;L׽=;mYq>(_,H y:3^gf w&Z˛/!쬝EcGd@x&m:}=T`w=gWI=,|o׶73"-.DHD3!!mK|E\~IT\8kdݛe.%8\O|'V%ŽL+q'Ǭ4oZeN඿er?tk:IN>1mm Gp@/vmI9i;)b;"TQ@>LA V.$rOc{kBTV y' v&18ٌo?4 V. VG_A+d斴«bgbuQIKSt I 26F{(Bu U 0l?e{M}jw_a\}mI[б^_xDtʤQ;P_鍴,S x6w0M)7[KN3)Mb]45;G;|Yr%i IPKm֤3l[1&^Ur[}1\Ϸ]h$\mLTM/ۿ=;y"z*"Nv"S6ĉĸx1?dBme(j"^LEJqi2裻!WԊW˶e_)l6%*vEdirϴR>[`ևCg|kS(t6)ZDU s?ۏ"V&Loh )c4zQ{C>p*a=EFBڴ*ap]Omoيs6ɼwej^$w̝?@D ZKԲ̓1mmPÒwV%Lf4pgƶDhI׹c.a9IK7#֗t=!Sr"weu5rglJQ_$s_k5I&^oMB9=t.BHG +܆|]À "H/O"j΂hAkiuQ qtFsVc1[PT^~97cab%ىthO9VG>MX#6#og|g m2r'ΒjL+Bw%+qϱ/@S_R\r0`ֶ[ P[>6\n6a-CٔB*YnL H:0}2X]!+M IID{=XH_y%IZVW#wE߃a`dJ@R6a/; ˖Xp;ϊ䌷 =gXddUB'c̖#sӉD*Q9E|Dh9ϓ_-=^@6'㽛G41E} vsF4{::fЕ$儜Ld+_Wc1|ZU}ٶi-y޲~ĤQC]5dj@d_@]>T|y0a$`;J"9r3l+pVg?t0[$qpQI^w#UyO:5w$ +2Q4obhu{iw{S(b_>B'3=/NeYI[Кշ O$bTV{(ާ7`ׁ5m)jߝ_1HF2{6 ۳ nO-4p0JsKeEޡqyfY34Ix\%I_!J$&FN7MZ1A82y[`=IPUD鞒.ﮯR<"i")h(%C8UnZV̏U$MxDœ*g;^;vjE}$͙lgWRFUF۾ptDXi$MD҂DmOKf'~<tQ!%-AWIZ x^D yd| I㴚4-Oؾ$amx( BYJb`ꅒ$&KvטH2q^H0d>OES45XأKw'&c?֙}o$eVo8RpӝBaxs7 EdOӱ)ll:>,"b"ch:bFڄ8nCb Q}, IDAT^t*a:\P,EO,ϐ ;pL')ϡD%N_(넏],S"I"MR CRXҚDEuɇ QoojE֐4#TnCҒ&XJ}WҾSv'*dR|F L ryn# .thΤ̦{s4;`SI~e䠌nZV8¬z l?$li/I.B|+*ZNvA V"?ͧK6ΛU Dlcx~f+T[[I{So›iI;>FCV%F kl ImĀ>.ՉjM 5+z ߑUQqZ O!"fNdh]t ]=1Ύ!LE{$ EDz^U~3C+I=3c\w=OB+I|Wn=O6Ww0°%v57Q3-4i+=bDgmOQ RUo4ܩd B$-| \0%߭)RéUfZܱ)> eܶ 穲J# c/+фsB ~=/vyߩFٛ~MҬDI4;0퇛9aS7I,f痴7ۋLɇ0mf:ĝɢ MsN&H8O{WQQg$t}πMʰ + klb89΄Uit%+*:8'O>ikضT lB;IRemB|#]]鵎?b%|80C3kkQJTfʃw2c$OTLI ~7pŐyV:Q=>8l{{3$#3ו 1Wu,z)ђd%F::H)ܱ' '6iBW%/d=>֓M9$~#}l"DXi}ܥABĝFrDu mݪs1hˌIيВm="'1 UmzۘvL[DJV3T 0$KX=nzCƿl?kspmv!ȐMAk]v=esI##R/ΑU/jSȹ.^ATcNBߴlӾ&?lq[/iQQF#yڨv4=xn'oڞi0N,{~)*#$}F].E=+}p4S(v+ /V%_ɄF=eig`bEEEܞ7OT4OTęS8Dqv$NF@,jtu]lL^'M:3wkN"VSH 1mmC MSQۏp%}v1) =mIMھz4wwo٣>/7IWEƠ` It&0lخk@ݿ$ޫ_IG=UHܩdMTN1 l,~CDo LY(F,p m֢f1͵%!lfOl{d{p͊Ko#Ym}GI_4BM ~lNtx>ݱ6pM٬xQO09h%~Ix>,iM79ΰ#$mo$b+lsۯQ*D!7'fV lYbܾ>P_R/K'[Bͣ~"FdB]L4e[%! Nh7~f=GI\:m{vũ56LIDI%O$t'`Ckl_EFw9\NC`Rl$&TT[ʶ?,H2. pEoIZ0ݮDKi[Mַ^OOʌ%f*<6@bOĝ}*^IC+Xd> vŀfbBވk'GGPy0elߙ&ڟ+τXwTn=12;q5v5{I~>'m}dzʹ^!tfNiZH'QiuQ3 8 DldRI>uJz͹I|YN&iHՕȝD~D cR"Ηt!4ML-!~=Lh'3H"/+wl$"zm8I?/$H:*e>-iTa"V&DoJ@+gUSD65>\n,I{B|8c88?/+;IJK#=׭VWq%c#BpeOpِ(]T娨$aG߁ђ-_^жکIܮm%to[gNGvugAJOyX-'z|^J n/"wOj}+&R |NzwW[uRz4E`^hq!;{?y]&.'R+ls !gwuXFh5D5%|q ;9ʶK0sq&;)OS^Z7V/q~;EBfn2>"6#ę߳V}|{(Xl⨾5#?[G88TkZZyK7&"iAJsDz [OODJuW?!tH,MKd&ݓoK]~F6;ADŽ?ՒLXDkD5sǘ \mJX{ޒtPײl|)l:ۯ\N &!^l+3?.h"l I0!VaN?D3٫ǘU ~Y**&rlC.i"+Nv7@E ҂HR/Łi1Pi{6@ R$MKmR҈=R}ĘD=S^bB0Wn[O"kb{p #R`9}RYLWYqLx"fy ۇ3\8=So$}W653?9EqʲI߽XE^Ťd ~D,f4# 86~Ld\dXTbyio {Z;7I%} F$\Uz' #͵!a?\ս=M#ijBTkfgJ:Nh{ӎNxNeq"ƶHڈ bsS#$FV}K|OuA,\Y5LpmRN[mrI#ѹ]ѱ"Л**_^_J׺ v*ziA?yJ+G(XY4X@Ҍ$M7_ZY{7Kht=ȝ~=j4zwBkFqE1sLx#gsz~mmܶfӲ&oB fFKYV5{ŨlIDq1q7p5:z-f^THj2k:/Ҿ뜣+/\L!Mևqq:0,O7_gEBxےL瞗`N /eW ǝ|Ҽ+"`?#*IA+ދ3WhW`X&4޺DaL.$ĝ~nBDL~Kl_NW(l\܁f'>'l$i$ۻJI+vUT Dn'~.K8my".z**:j>X؛| xS"~ZGYtԲz aF $] R#L:+G٣Z _1"I% ЙHgzaHHˢaS`thaP'Ǎ|r! eF%,_rFW[C'&n*9NwJ%J3΢V""d}N#$}a}ز˦"wh>l&wʞ,! /I]X=& \( ]w{P~cZ\Ҽ%T,w$DIQgCIϿ:i$@(o/?%ݚ ZJ5PV!BMI=rVT XlnǒNL\GNq\`+*&Q}C"4n{,LV:czbp`n8b=^ !uJޡsKuMw\E \'^S ҵqfa߂)jsw$Hj[t5L8'#> ,˒!R:Mneė*bv1radGJ^v^+ONGϱ}j9$MW!u=QQQdjbPP'*Ji*J*iyIgΝgzÏNҒ>Fmo&L+qQVݮl2TU 6!*EJ,A5$&k km_@,ح<~~̅)e|`CIWQ'r $4[{ͅMj$ECXɓG IDAT"iFMIɱmU}(*FfKZ .&5^*3m^Wı[mM2qj}oiQLe~֓(Q,z!Y9/g:]Vzl (DGY)[ߣm)җy|g#7Inp=Wmz1mmkprk{X1cIs~W4H/>% 8ۈPl])jV{{C46T>_k6 u]1Qs6U3UEb{Os/ڮ[~eIXX )u4zX{TYfEEca ԅC^ 1µ+e\U^i)/N̓tE `7kR9 GvyKĝQ#6_1Y ;K]rD]a4;wI9?Aǔ޲6ٽUE4:YDJw+&ll\{&Ŭ nTз aR<Ǔ)i "ce^""׶>.PCs'~͞^$ ϐ!,"jb`Ew!\KlCMWf !{m/ν7HژZYgEIR+x0x$51oѴ$I7>Xv.!e-`b9Is+&Ԣ' 8!"3b^IO;QSJZa ;Yin]H|$&mI/۾تȝـwePS+4)pTnp`5I ~%4G|2M?lFADNG<Nˉ&QieBz x]C3QJ Sv 2پ9E {0;s;I*Vb% n.ӈ]EE?& 7uA Y Q)2tצ(VdL(Կs邠Ul^IB׳4(Y<-Nh NR-_6(SM;!@5}=nc}IHZ5.ȉ;D}(~H'VIjaD&0vwöD]ÐĊ"n7yi\qEE+8X]"J I;4loW{`f`lG+E}J? &*?TR>G+jɦұoEEc=`-t5I+8]WlH:0$ϜGӭftգH0XI܄8.ՉyaB;FQ2dXEE˱ᘶS5?loJU$V ((a?:Tg i"*%o?NT{x=g~MK^&W}2qkK ;~QO( De[ALT +&V]Iw3t)HZG0qt^_vLܱ}QDdADt0iܟHzx.8vE`az md6! ar)wwIZQ7\(O@\N~"~l a|b+Dn(Wd;Q #+cd s Se^!aHީD{AQLkXZ92P)g8vwCMch`ʘlV!9eEEaL[l|aM|Г Q"`K$b1զ3K:ʕDDWsۚOUOv$E_쑙 K:PҐ"$mA'ڼ O-%z+`{`o=9_7yXUQG uQH$ G1:<Ш#}mDi5tNEEEo|t3ذGZ|<~}ASl?e=:=vsӷ Dz\IG ٵfK.鋒L+*~VpWf% m ,I<Ib/oCa{go >)I\d>ϛŕ{ה v8!,`ۄ Iܱ=H^v$U8X.}GD$`)Y 菀å ݝRhs]wu+LI}؞`97'A!@IC$$tb@g,Ľ;t&P&_תH#"{cX EҮS~ǘeҁͲ[ %{Xə?~QSR$*+f{!{T3e7&ׁJYZr1*V5Zhňԏm}Tx|6!&9m>L$F՛63T&UJ%-jI7d7bbЪҊ]%`"Gu?vޛD t`t#5Lf%n u4He/n8ِ4 yvev;IƘмX{\%O |/00WTd ;%NTJii:y$-cNx>qiDO~d_'% ATSRx8]Ol^xQ4U6";bܻpIbr KbXaw%WT xZ%d|'ޢE,bbqD6_`N/3QV{^^OW$]|^') ;Hm_VJu*lqŸi">V'HZX8>TT`3Ia~"|k`NOI{g"iiIM Kx';~@lg,BH²kv@㔬F0zR_X F~&ڷ]h6#D?~+3b`}^tz^kd^b8/IkmLOشJyyn}fxPhoI+_mI'"@&,S 9 ִF;*$[яØM}Ac<%LbhYI>'L]+*!"[a%f*۟KZ8,>$rgV=.` I.E.Dq_EEDFDdLikFG3eh2QI=EW %AGŝ4OyER:p;!LՕ'Iڄnc>H!/{~?ibu,LxXNHXnAwiqnmryXބ7ޮ;}L~zmůwp<0wZZQniq pmR3`?I/"U8⯄q3|pڸqyy?v&azkVwLYS~XT,%s;F]BvgP+}Q-7}QSҗtoҾ)jGӿ)KnD!`_IWWJ* rKzz<1 1~)LOO}m%)rw),- ǘ4j$]l hj_W xogI(ԟJx%+i%"*z$}2ؤ|.ƴSz>eI?}VI*pIZ8$n.b"?  ~Z|'`kW 查 F^ ,mEi>pHE[)`)tw"Ԋnғ!Rug":η}I 5T46GڴJÏ~6m T⥉2$ %*$w֟; SA0"ZbU"`G"-}"ߖ}SѫRYq׉2Ecԓ:߼ViRDpGÿI\N=9_E"Ӆ.̟H:Z+o󜳀}#%mdeI 'ہtu;?ҳzDH:ri6u L;|1%޳UEe|-ka' $=$=A緟T^s01bGMF<5sA>B @>\|؋ZyIÉHsAf~B n3B@$L\3Q?i,8?~j 8׶rmv%t1G}sje.iGmgs'UO\`::41^.o{1{6<E1*&$ kf?oZ?1~O+ŝC9ҭS)bZ 8A iS&ϴ|f&f] ;``ۑ ^* )bSCYIbռPEE\C] i/)qGm`sGm#XMJ[-< ѢawXD9yK}ӝ)1mm5hRd ."&G٣z%*=v:hW= ,6_>\KIn#6B#雍דt l3࿄3?N6!.eJ6OC V"NlKKCppcO}cSJVVxix\\ ,I|%FV/ TZ)L B_fd{c ql𓌖O ~8Wmy$} X1>A<~E3mV"YN!>M,Kc$r)NQn" =<]\hH(\$m *3EJkݍqYIߵI z}ܭ&ާ Ȝ#>фMj:!=M|gOT4%mHGyf!כxMDY&KnVJc }Ys~\!EoLDEԵuAEv_"Ձ'3m_V8DR/w`s8ȼ QuS> ekņ4›dpm7ėP8J$Mҍ~9\]+[8&iTX^ۯlocJةEv%V~ @ !RV#V ';w&Bˇi62ջtLsN#qWL># ;=đ40R^xnUjV빚p~<)i9]3㟇ld/K4yμ^E76k~mU_ͬ .9GUS'6WH i~I& b(O$&[{k`Wr(ͼwmiۛ,LW<n ,FMPxg"iDVNY%1.;!F>w=W5ޏ9 eYR1n ~oB,=O,H3oJR_i}9(S!ܑ36$>Nq%)zaBD; 8SQQ." XeI%ۖGEcBI뷁lj( +%ض4aXVbimR aPZ훒 PIzvgJ: P6k-iIK:U߲JEfL[z,^7\/F[W$ݞTzJk"+Uldb@GeſBc {t-:(0JzٍlV2cڦ"&2Rl]H^3-݀S[pIXXȘ$x<[x7gRF4y"w/ 1^|J:[҃J:aQG{Xhrn[&.Ztl[&VNQJnz}==]6鿘x] N ̋'XHL:>U)'4-lkq΄0e˜-B0(&"a1"J3#Rю}{STVV&=F4[پ&] ۧx%=okxB9n~AL7cR͢Iǖ;&M*O ϵGWڲؾ9\_R]D~O9D8ߝc'iIg? ;!f!JTkikHk;kd=I+?PkdIw vl<S?} mIubU%e)_ԭ~.4IH:o%$]@ݝs?a`_vj bEG|VΔ T]/`mvm "'xhi&+]nv]f֫$HZ>1I|68#{YӇ>?YH+IHz#edqmvgAžg}[Ԓtg%#M &NNua}xO(g櫹|/!F]㜑u#{ya{c5_I}vj_r og$7~hr%I O eXDHH$qnmT4OTݪ3]uwNr'状X)%p")+ӟxI?CӸpj4˜k߫=S)TjN=<+bsԻf3빠s1IK+0%RM.|gu AҬxŮ=088S!m,2Sjl>_kUqa)N5JOCa kf_qQ.2%#<ǒ0׺ݙ@16dқt, IDAT?WW7>H8q_a߻ 2L1}bE"Қ>Nt>v?nV"Yڨu&ޡ3"Y]iY^/I}+OGbᑷc%G3B6#qߡ%WI!U|\yo<\$]#i%3KR HX&>$ɾfjz/7j,)(3y~Oa.xᘓ C B|k`oHRD,dwem+ۏB wJo2R~#.:-,!N2Ũ)lIWH.VȽM;淒'S#/ x'v>s f~P9.dvo>rz6z3'^ Nn+QBQd[:B*Nxji\$+0 vøUc\빀);~J:ϓ?pt~@MhfF Ɍ'帡$<')nivu(1ӇmI:OYRsiMKYSI@A_a>5IQyF^Zrׄ }$𝰒T>W 5#(DJ襴~~vަhdg݀3JIX*R`r2+E%$Xcmx4"IgY5D`.Lйqx}&;Ӹ(RZt9>V2F9+ wDkt-䆿? u|L13uژ]rVuP)xHc_ ﷙Yq]٧a^cs`Iˇ4m$vH&sVDw*&A2şdUNid5=Ik8zG$pm/G=<]>#75n*cY)1V#ةMhBʾHe2q쩪-bl>s\rHC%^E,vN )#^`Xk\,X@^ ۟_t ~_ 9Luxz,_,k߄{D7tN#Z[WQ܉w whz#wA>Ɵ ?6L63^Y[|^`3랈ot>;]ܒrh]9DKJ t084.N5M#5bfh+E߄}}2?l Z3wX[x׼ a;|2Uq$a!iy]Aic:?ԻpP+`KBwpy}{x$ f֯,o௸2He2G,TMcf_0jvXWPO(DD"1W奼ϗKMt+O? "^ spx)ìq#xlk~.X;?>ؽ٬NyQQ;@?28+V ³aa:BdO2\3ۥq_H'6e[ߧF*|P|6& AtF W4DE!|"y}Zp+H]Jqϙ_T̬rg_ ̏&[q6$}7\ 7jZ^jg#dL2<굋MIKez?¿#pR#agIXJmzxҬGy J!X!% K=rsR/_ۈWCǕ%?Zm[RQf=I~lF!?Ȱג2SXG|xF"Ìy KfvIi!aLRSzdSMITK6i8hV觠0,I>4k? f+meڎOv߈`vl2ՀS8d"06ϗL4!\3IjBvi%-GOkٹEi)xL. ƍg ֐z1%9kx̮oWkԜF5?Z= ONmTR60"VO#_qb"ns?nVw;7-'7Ύbf/j63{D"xBx.Z'ijjG<7Mr]e2}Sqa|]9O(Dnn4Ŭ\l Y=+M$<Ygԟ<^k0;i}LLf W҈Q;b}*n KoIj8j>  M#n괬/H5UA"fq:}G!^K-}QKY~HZ7_ɹ76)ő1K5Rx c 2^F20\ly=*ϕQRh?qM^33t :TG|+&fv'^IkGdbfgHZN^\3UUIϽ4ei@d1Y_&i64C$͇WWz[lAbNTG"-S\M2mǸ fY E}Gґ-…+D"hcfb|axf6IRO_WK^yafIZ=.?$fI \űdtExVfvA),v2pz6[;S+A.pߙYE"HZڼ;B5CViuA}0/wc{)pn:i-f= i͹mEz!V;҇J~nmw$ՆOk _nfvE4fxn"ÙnB}ŝUͬϊJ3w`rDg%<-}%iKvd_FExo%,M}+w0p 'ם2tD&cf/K7L oj\BGfv~X8X9b֐d |Rl>Yi W?ƙD!x`(i;\i:.plRz8:"@~Dm V^i"MGI#cS`pKmCÁhw$mW@Hp>!ၰ5Z^Ңsk6RLf|6u lDjaxX iW 3_w{N/Ğ-&lj CұҀ3J#6f, d>̯?#!~Ϭnv(#{[3XGM;I> {:Mtvt .4'i^`o^3vIHgi|5"O/W\&sCѧx%~Iٶ^UjnoK8OsW+\myh GrLg)~6O&jϻܝWO؏Z}S4!ez[~/T$"5dfSqk6Oi=R Nx"wV.iFn9my=yРwe~)ÞVFlWcl+K,Gܑ4&VoE~l*i:O\J8Y 8i /PV&cU[v࿳%pQi`$FN>+u 3{рWWfv}6pXX4vTNQ;9S^DZdDʸG f@A!xx|~sqj_͵iElwbSfVơ_cgS^IqUPomãQ$}jq'mG*DB.2Ix2 7CC$̬T$X1TN.is|k fvq忛ٰJt3Wu3z&$ if wuɶûԝ!G./vu|a&IEүfvۻ!I"F̉~ Tf֧UqO1SQJ̞ M? 3p>^L]3If[߯%؎;.߄$=5ݛ45pJbb׶xuff _1rGx&Nj]azw?OƛYٌISc32/@=if;maJ f66tG>w2[xΊa [35kf5Ι PgSPx%wkۀ?o'f3mpYdfąLfmLf. @f4}OCImgp1⸴H݌CqZ6QT$tO Ng6ِ&Kvmf)*5D(t*~Ol]GSI |\γ^P (xw/<BS. m.-8,.#971r7[Q^>II̖~sUIcE$'vSg'S.5J%ܛuu\|[oPnc`F"aGpqî%ǿ,WXwq}&i1axDNgm| a' Nq;גVs2z`G_{|{ G$DTWNdp(p$i)<`A3{MFD򄴪g'a'D,RP|R_q"g |}$vIp$]Gͬ4c!9fvb?%́";ے )g(RN Y\T\^}?Exkf# O3Uҏ1%fVS&$`\ ]I!mi|E`[UlVoxvxdsW(c+qJ5c}Ͼ8X6,J6<5I{$ƌHsHb$Hfv4>n쇇WYa''.G&SzxI ^f#o S$"A 63]MixA9.709^Pn{<1q[-!#Jgg)s%뫖Fq4Kb;cJs]_=eiS-% Ɯ~ܻ~iYN #|AsI󤜗ȟ IDATHd^cf#rgXGn|e{7+09]91M3;f>3+Q3of'TE\3+{% |oC?(^MI<i7k߶:Om>Z.'!Ky$vYףhSrH_N3!3)"U!jpOH,f%݌*)EtBzM|v'%ۓy<.)II^ɹJS3ӢY ﯤ) $V^9,nyOMٗ-U=MZ_Lԫ&̉}VSɊH>EjUR?%3{Hқ~"6.~JWş9TwSu$dfW]>4I2/8>_^mdjϝuCx^qz{ڶDke$Q3c)+ ilyu3r4!| U*LّvSe^HivI?خ]̤G%L -?CIٖwYffKZP?q5|p2>3 vjQ;WdG;ՙȠf 3{0΀.DJs7 ҈ !w.#QFJ'iGRQ/͘7y>E$*瑖&24+/4Cfxx/ mkD}rO&ioc*_[&lҫ>G#;#wBtQ1ONZHiqx5JCa꒦Ӱĕ9/KyֹK/+V@h1Lff|jmKDZx1_? zI?)>M!7):I[);↏#B?hd\iŝ@Q;v7y ~I%D\O/I{,WqӢ%JOgKS2Q RU*9רbbq߶JH#I'J[SnP!\k4q<MkKETbF+ŝ*gZJiSIgٙEgo4/HNo/'x~աbT\e<%]ˠ&ɬk.6mM%flBq,6bRxxN問ոk iYDQ%3ۨzƣL6z1ٶ=\i"p.(<^Lha6Ջv#ŝ4orO&"Ţ6'O"hd$- cNt=7-npqؖLĕý]N01ᕞȝJ-H\(Sd~K<)=Ҏ)=Tq !BýE$bn=ިj)](WZ -G(DtZ"ySkN5$ Ol&t/RVNn ۩hf,sbh&|e;\/s3;̎5lS||&.lW{l݃F&ʸ˃Oܗ&Q4>^BxIp\SI9InKcCߊSH l:E1a*,$\IB6Q\(^ΒY=.@05(bK,A+ `s,l>++}Lx_zmEq'r>~xj Eu;HC_vp~"%GHO{*IŝF+#wZ8l9.JYj}"id11[CԿ$q`!dmMai6򃗐4E<#UfPA\'kj-SU u嫛_irn͜k)1bW`RJZ˖<vؐdf~_Iډ\p9g"/y~޲}ZP]sN0M\3rǾVj;af{K>I<] 4ݰ.N$%+xQ#kTXt.x/j,O?BxzNI&\7\><5's|{vYi娇hB1Ҫf*.%bY>~z._%i/|<)l풎#6 з"ִ32ǂ!k%L v% xc=4bUjZVXP pr\ʹD s:0#eiPn9L*ƿȑt^W /Q29tFDïͳU[wp^2tIcJVJ"bfHZ); SX%FZ<|1U@"L>C4 a(oa6H瓈h1dHJUtx4QS|]3KPJ+ 3{*^p!c")E$-WMʕl_5sqyIBfvG ܡR2LN2$|RofU* IB¸ Jo7nZrSU!VI'ṟokN;N⫘ 6 cSBG{#;_eI [DZș힠sԐD?Iګ+scI_Qfvnxps۴i,:rG.Kx4=X] xqfVe1/E]@a/>NkE傸kH*3튗K iFX!)v[x3E؁qC⎤ fvkIțTx iܑZ8 ZĿ?ƙقs>G~=_Cƥ:*)y^&²JYHٍ ]RdRq'!:{@4nV{鶊NT~nf_IGbft`:eT}0i3\RfV6OYwA2"W$WӔmOjRM_};Bto߹ Nr@4u {f=w5s°782T*. `؈;>)y[K"wcZVdH-Eiff rJjp";`5@u|>W0Kb~lf#mdf;U=~fS[p͇%-af&}IiN6>gFB./#_c;pvwmbz@VD H ~\//cQf8E"H+iV.03%]^.RD6čky QB+]q6sO`a""Z-`l>okz5,8OϺ2wF"`U`I`9;5 /wbޖpCvø&hGLf \8,;ӣ`Δm_FiƵCUYD-w$}OXhM}A|qIkRi59*絰!.'|YϰUVI[צUҢhJgfT;٫18Fv e[M"mf7Hz t>m~AҶLOYO;9N6gN~"C3(47, iJW@$i\݋D"ѪIw_/9~5:ˀmjihs^f`3l5XW\H+e2k9a`(ԏffJBh|$R3F%ӿLc#Js5qaugf@'Vo œ]O)xELfS+l>FZ=^fבHw8X85yL9 HZK!GI7m*YIzxNZfvC+.k4—pŁI#z.jE_9?FٻlhWe2+VoTC?d8Ii%93OD+ h4ef=$- ˠ%,Y/;Н&T xL;ףSTz`KĝhDwVvIr+4-Hhe.&^l3'iHZ~02o+QtO\_͟L4(H'zuaxzVjf%pb#vRa'l{J c$LfJ< ҄:l72W[^iE vh:HQ'˔4'.Z\qG1J 57m2&inIمS%rx*k~^7*G"ucfJZM&fV(q.V ^ p%^yofFqI 6.+]*Gn/ᕻ&s KWXo7Vh4l;wRfБdy9$C,i.KIV #Ռd2Lf\&s'Ű+n 󓪶3W>v"Cc̬?aq^?f=x?-c]VC) fvTcQ\̎3JgfW\ߩbI%%M4Iafk?(au2=khڛow"sNO`]IHm*vP|&NA;Hdʴ,NK/;ᦎ6VNƫe='iK3 > xI3ӄo#zCIٻ`.Y_ŧ8ku)%mfd9uIqf6A <@ᾲԻYUNeXdвLV$U'/ x&I6iEZ?:qJ|)iE3{Ju{Bۏ91vKwHx>th1iA].>;?]-]$ JzO1w/-#<xOnb13E"HiSRi3{/6>LϿn5{^*Z:e2vFlf?i#M",SK>G"\D)mf<彯*Q IDAT4n+mRo+ w2f4_JS:Bd<>Yl:K._CqZ""VO`LJŻAy(yم:XD(wxHH$#i&Lf&@cmZk07<&Ͽ׆GZ}&E5I# D07$ P-fs~t so`FhfvMqDJp|)NjfvQ#J՝cV=;> ~\|/{ {f=w5sBI#U|tpuMQ'#JXB$f$ 8d/\|4hml /пyS}3IˍÝQ4l>le|1Oxdrp1LE' Bx:զsI3{ӞKs P8|Qh[g!g{]SKe2ߪ6m6} %1J0/U:V6`zIٻ](y~9NXx!tD"FŝP15ܴv6ROh1 4Lf`wVt6KOl>?`afoI1B4E0tzJ8QS 'T2{PR͸]Y|%iS3{Vm4ЧdfūlWL6 ?ԟ%]/-'gy_#h]kZ}H$i;#xx` ;P_͓Ȭby@.7,sji/|~ 7AI I;3} ^$NEg׀)(E;ob7|&|]JYLf$z^VDaf$/Z33{8X^ԪjQV׋~E௒r? ͎K.O/ە<u" 3{HxݜZR|z ͔#Ȁq\nd6V=,]ܑzNŌޑf= Xtr̜J&EGw3,i3@LfW# afJ ̪ݟ.Mt£&ןly:Exo /;֫:e2ρiw,i!m)y /=]e"^%hH8!xlUd";HdӌJxc F&%xzJk?ĵB(: .Af!|p?X.\r"H:yGw9ʗ󙔔}wFh`_D33l ̎)iu՛̞HВYg䪫??4zP Mޥ RT\T (e HQ"U&tA!zgdfޝz}f{f6rSXPe\F1}nI_z6U [w{G%of\WplXtwx/_vtC3;]kFYy4zEV$i4V*`גz35G^ ;տ:BJlHg쟒4}RlN*ٷ鹑$vB}\w;gnYfA}41: rɝ[:y߽'OxP:^] KZ&44ߨXҒ`jO? ٠L ̚?Zėk|j\BU3۝*UvWt dZ E`|1+~7}8j$U3B0kn% ?R{ p]k$|Fd7+z/kxx ـHM4pl췳ɾJ:MR0<16^jY٬ys! _F.Ek:^t 8>nwJZ`Q[E6򼷧Er'PDe_3QI5Iqx"N*5Eb'Ԝ$%= }%LY 5k}=O\>\|xnIwH-^ZfOIo%H«zQw |YVu`\>#fe рG !LfZ:uoͧgǛXώ/ZOgqQ)~k+W"~VPS?rNTH1Z|S)}*煮1O% lcfcjiR ]! ;aߔZV1k~+1w}h%bq3n虴/I<_ |ؾ鵷7m(6]>0n3L ![zuֻ !efӁ~lYTL%#,(Qx$W!+;eLʝ4|,#%ras.%n7sf܁fעc ua#1WPe-rO`x-6dfIeOIZXx =e.۬a%R3ߍim!&I 'ڭ\`lg轑^A2>zT$wʘVe}THċe~^a_n:845P+sG%]ͻC'㫩V_6vJ#/t 2)2 61٣(^%i9{*tF_Ŗ<y^|ymgBa"ST `VJ3'p&im-Hf%]qQƓ}m $O^Oḫ*sIwJ+g~[チ/YkH3M8)< 5BV -`-~0\$SvJFocfE6,_O|E3Bɝ2WrG7&1s1}"S|TI/ᡖ1IKH8̮-:$]/gUftxo,p\/ ~M/T eN2dr#K3]cZ['uK.[9yzM l]gGBu#;eLe`Ʌ$Mϻ.oLkk]No75ґZ! o)Z!thK|%__ISffI{8KoH6O <12\ӣ.=ÿ}y:ubm 5OZ~W\WUI_™y/ؑlf-G%P0Q4&eH_5LLx9i2КޣL%REJ$}'FZ2I5%mfS{٥م6.T \R`C}^fA~bhV L+!ͭ_{Kj?f`Efݩ<P2n9`De;ܡmfvR/#QB))o:Jk5G־gP/ζ_Rc um|b.(tz;uЮ%c|Y!7~Xj*5[+bN L2$:2V;[fvŋ'4C;aX˜NkfYΘ=8I-KҖԍM~ o<0;00+nlS.y#ETD$w+}ob~/Hwpbf+=,:Pׄ/-'[&qs/VBYEKtc{ǘهf}lf٧f}nf_Gvcz8 'mefB\sɝB]Nygܬϼ|pݖwIj*:P*%L:eJ)MI]Z-xIu>9uUByfX'ndO]x!/;!ɝ;Z4k}B ǒN'PC&pp2˂ qaw531T+*wB1?|{w^z(`2 !>/;Sr~brwFuES@+:P /)mKʝl(~DK x x}V]_!ԔW_t0 df:e!)OTIK"L2qEc쮮QҊST,X3;}6Sgv-" !tӆ„`x_h i~pc !ΊEn(8иBс>2}QR]r;Zkto5sYs$wBCV.6kulI` PGr'if68F"7?Sh8_ _+:'L19rkfW37ULj3ջiHfH-5]tL!( nC؈:%)NTzq{I3"Ԕ̎LGC?f !pp]ASR0Q`,b# !t΢3_pH5*>Wh! `k3{@B4'Ǣc }c8Y_}y3U@[s)>p3"*wBu'e`f v%E}$D~Oj < ̗.LjYŬ9˽ X P@,!;8N(:. mfH!tVT!iVt4(1sqJRt<0іWD lzBF_ZoFKBu& af;kF!w?H(p%(IOh8ӊ$V ZgI-QKROʝB]Nh4gP3fv5KqOGnc/:FL=4y R IDAT\6GBȍ<; :PrENhT?PkHBMFOKF#&eENnEr'4$370%4|!Boy (Xug-6y?򼜘B{ *:PN2%쥢 !5O~'x O#*wbYVnŲ~y@B0ɒ ef-EB_, pYldnfXFoEBՊʝа!!|g/\t}|0HB!8EjY Q?'ُF3XBs 2>IMEʾEzlxk9'I!H-K_/nl̎vꚤ9E%Y!:ɝJ3E|H`Pс:y$'ÀI!K-Q͆#NP )B)lHF5`w5w5 4WWlׅwH-S;͚'TaZno+/ҽu׀ϗZ{Uer[ }&~^>B ͟Z6/{͚߈I- r{S&6r_3ȍ<7,;! 5S%ëzts9nnd{ j;sՀMkZWq{__ށZn^|?AZof`^ƛ5_kU[n6Qr=ۚm۱H:8X^("Bܩh8"O%nζtlDœw9jZWq{#V_{q{Vf^n\m>p%l{,xbZ`lC5;صv=zva ތZz[#sݙ10|]dt?Q/; XIOnoD^r#FTq|Dr ?LuҍjJx{̗>_-҇7 ,X^-{T0`m`<~x%/ u<޾׼Dn5z{!PKQS MawJ{RjbFU+̚]f`m.Nk.5k2wWބ'Ӽ5YMfoJ-#m 3k. Acn5kjkZl/k ̚w y~aщ>h8^Bu/*w*MA3k#!f$i7R`3xzZ_ !tj}v *wnƚمBܩ^Ǜ;BvL!ԍ8yޞTT^- 7$IHBEBƿoH!t2 NaDrIEB*B.HZy}|3{DNADrIY#&C, Oxx?4VMxX)V$ 4'о!zX8̢wd;$ dUN!PbYVeËјf tmfbf+B5;$-YHpY؜JBξWl4u#;!˲*[ < ^p,)Δ0$=l/kf*rqBjuE-EBٕEBɍ<c!_M:??=IrG\f6; F; !KZO8^*43x~ !zɝ ub, 8X0ץWJ{GmlfO;[خ~ Lf{/= '[{,\Rrli~ `u|Ź <XO4eŧo='!G⽉ސ=ZW*=<i]\ҙf ˒(\퀗EZ%>\Ac̒`UZ Ifvu~_K߃'fKζYoi}xs'l\Wo[F~Z_aK8ye``!4HT iRcw!^XWIxiT7Sdf֒_%M-ݔO>œ;3TT-ԒO7-wݭ)U%fCIC{S̙ӷUHZO<(i's>=?UҚ8`-.{ j7x#9xmGIT o'~ T  \ i:<1  mrn^N^(ox$LXupZٽz&ii`Rjdt:.FWe80hBh 1-IslxW?;g]w|y ̬3Ahk|N“P>aQJG˔ڻ>K 5rA&cO|}I:gበ/'I/ܜߩ=NvYVyo34p|xlپ$͍Wkl`f[فf.^-p{ k׶Efff>{ca2v ,!I:NÒ~o-%m#G%U-4tLGɛj?u[+N3;3=8ZqpZOߴdOvxߟjYp#f7M+733;"Knٛh9x̎BS쳒h|fv}~fv^5:fsviFX6KlHΰt+={fZ.ifԄ/o]z;t ę!SVu5݂A8Bc0Dn ?o%_%͋W>IWMǗef7J>-i`>_msi 'xf{}j5V^j b3"-U](4ú4tfvu^Gم컂KW}W{>so셚E?d; !4ܩl~4jxс43/G^9y,fք{'7f?͇Od<򲫒޶+kH%Kc#I'2/$f`GpӑʑTeYft,nf`xl-(}Dѹi3а$.:P@`Qg|Ye`[6m815G^mx2hE<1O-ο dS?ן5R,|"ۃ~mXx_K܃+p͒&HNc^}I_t%d{JAM.\.gGާ1*iGIH uI3?H=]9%;C R|w;_WmDhMl6$j%*w*OD#͞QqXE-O23 tvn~,Rb4+9/Cf5K0ɒI΁/+U6򧟖ZI7[ɡ%Y[I:tgT,3!3"= UG ~^pi~_fM^LҐT"~WOj'5|bO'WKj='~$ia3kf3$sj #B,ފML jfvo$Q&Os𩉻Cjࠒ̶߷<ҤS1ډRs U$q|vIIA}[8sx2kln{Z ^6 0qr?:x,Hd !ɝF+:֙Cj]hfJg"Zt5|YRܱ.xsB(At:"0+mKtt}G@KeZT$͚t3gxb]mG({ՀymdL52rWʖ\n'h;@jff}df6@~DѱfH~6[9`f;ٷl31s~vf|o*}ϖ&s3I_'}Oh<oB< q}Ȳhh34 3,]<>e7me]]eYMiIg;oVA۬Va;hS*l;$N ƿUL• iYҒn i[IOgቂ&`}f|m@[3uii(KW̬NLЮ-3.4*CKB 1xGvP*$65T&)vf-͒ۗ&I:[m{ ̶Ǘd&`ƩuPd4+ecXڲ31?SnUfe`9j|grd1S1@'+{s?^=)j{hBhPܩ|eKxa^R}:~ */o% Zf6%}驴ߵ29*,z2pcA.@{\O4'x9u~b$42-sH҅vO*vI{2Ǥݒ7܊m-K.iIl{M'H!]H6oHH|>'_~\PI_|BMdrf1v̧dK~XawDCb >'TLkJe:J:)U^ oYe<ʗs]WtIJ # )<P8“;)tVu?K򒞓0%^'~痚{Wެ/K};m{N|iGKϪܑ􇴏=lbj2?xrU=V3;NN{}FWP'MW R؜fvtn:3V ~S~]9bH*ʝBCH෗ŨI_GRrO0+~\Jܘƭa?|ٴn{w'~G:xu^_fYvd<b?5mÛ31H''⯱ OH.hN&NIlfYJTK͒$-k>GJ)ea`WI<' oX֖^9"=CC$-Q`>o*;~p[^H>5&i>Nҽ׷Iwwtdqp[K첬VIĴ^J$ fDQ/{7kӤm\aY0Uo C7MN6;}h)quZ>Iէ% 3'Mqg9$Tg&m̋^?R4nN|ZK3]Xu>62MU) xYOh]kf;Vx &xN uDnfv]y=ۚmKtE3EѱtD|xyMK'xR${{o(;8]E\ IDATvJ. U⍃W=<}Y3f*ut#Lv޳m|!XR=w7M407K/{Fx]fv`nvxB\z^Pl ,ffc7ēU4Vė} c|"[xEU2A}6īr/7ifuҦнZ#I`-CDr'׀-֢ >?q,~$3Yކ~ %afOO䎓+||{fvQ!nHɛAʜr4$ WUkf䮛hY O- mfOlktx%lBZ:DϳfvA.&txk^{:ʒt'YUIOe|;B7Ų $71`bbV!=Isn):B QSm$}!ic !P[EB۲~;L9АrIEH$| 7+ΟN5ВV1xn~J|$jyl! ޳iຂc !=L9"S/:4 ~\X X p0SQҬj̘ZrsM3^ØC3zf!P"Bhh,IKL׋cf63wV=l=ڒ+S{b?%\S>`><<|&qI(욐$St,!t7}Ѣc !m)EB=!; vHj}bf{i=0U'M`Cr'ÛW9-\&鄚]?-:CҺ4XB!tH,N,˪`U>G9g5$??3sK88T%fdqaX 6/:BՓ4o pkѱBOʝ?/Rt *rC@I+KLҖIoܝ $$ *'KT'*=GxL3XB3ٍ̆EB[C~;!ɝFHrGʕǁ"Iv'9UܒΗoUҳZ$ mgKKJk'w'N% $ $5I-Ch,%%BD3BËNeHβV`U`A3OzK; l?{üO[|w3xe{>Yՙʝ|BgBHZQ#$|y%J#˒CIJ7]wCF旴SG$mU nJq';媨$m.iGIۦ*y+H:DO%mPi_!th&Bʒ;E!S\Vt 3J 87% LNti1>w0gWH2r- mfO&Ix+F3>tuWJ<]+]p5 KI ? -o}6h`:oL$ =,?sI{TxB}x3EB[FӨ !4ܩ@LnEҠ:(f1 \6 hfׁJm 'iGs;g.ϲ}~:)[;Ul*iI{I>^sZJu>u,8ABHefǘmf'`}<:̚}3{Nw,zXN1K`?Za t(F iYUϝ#K)nwv5/``R"?UPߐzÁdʕ;gxuN*%Ξhf3TыxYݹ'fM5+uۗ_ض@B!t(bIVŲ lu?]gDuc%󒙍oFあ3^5%݄n7:xͯaYgk.3ϊ6y/s+Ѣx>CW_` & *Iwu^P̮.y>&6 i`w3; 6g֗4N.-{@CBFԖ~\lfGeƃVwJ/>pe 6֒1Ro=<8^yc<!LCx`')B}Z3en|B’6ۚYyB]Kǃ M`X;ELZ8p/>sf6Wfz+])ZJ
7_ +rO*\oQ=5!t6'x1+a׽vQ2+"%e5'm EiCU@SzBgӡ~,+czIژ8kl.'Ұ[ɯdtB>j9ߨ(!zN{ {\a};՜Tҳ=1B>GŪ=D_ Y*UE򞤽IqLu q׊鷥" ߖR%#ӏ]k7K%4r|&Hny>_j Z:#HdTUp_C!HHٚ;g0Ary]^wMs`06[) ]T&Tx)wLe(K[YZ+Y%}'t,oe )2d,ٚ!kU} &-9ŽaL;UDqu-n# E>r `vDe ;xmj|6hAOL0W_"hIZrEߚ6k\S!u41|{5wBu/ }B kZV02R8Syx;t1|vlDŽ]soQXkgma;0Eg|fv q&l#!9CZʋ<˹k% ,{@}luzȝ*tZ΃I#g%&[~j "-p 1ZTW$ʽDcr{%9#qI:wCqE@A2 &FN݌runhR1P[( !K'!3q2, 'GUdwtMR:Da[&>[?Q>_֘J/ߟgAUv,Kvw`ejZC3DG/Nds$XN4lk<:uMw??/Inigyj磛HDDQDvp2-ZY l!|cA4NK+(yu>uَP\b1VKϵʻ"[/8)?/(#7~w.ZR"C o ){nj`\0k[]Z3丨K?#qN y1R\<<&U aQRnqtJ@\2~GJyS|b\ZODuwCKUtkV'Mm1~^yhը+Y~Q`ryf$:{jn9̬@d+xviZv/@S-RX,Y$RpLY*NoN&0[fa6Lv1ޕ ;̴H7$S@R=O_>дk qV n)&DlWLv`BL!.TPbg MY{_%.7U[_!L@$Ee>M[SIfD,ֆre/WϷ׃RML65Q#"O¤tQߛHnMTtɪt= +8'{H4 }I[5dDb6x7sl,ҧXp.B9H>_~u׬pZ+ȊD&ަúaBKnҩALV)1@v_a,M&6{}  ;bY Ev( {>vc[>X JK S1RY >e4g9K ym ʲYPY(xjpd lp~GĹN=Jgr9: sdCㇹ$e q8^(:8f)ڈ9P]'uU uU+Z}ٴ*'j)jW ړL?ݗ3  irїInRn0& j@c'⼱_s]cNPKv5鸃GHPKl9 settings.xmlYSH~;y+l\\Q(n߆DߞIyB_= H5Da$f[}mui@3 Ai:B5^*ETSTSML@5߮nZeٓ%7:iVt8E9///zibU~ _ aZ|㚺Zam~*WT" I#͗^oFz jWm KT|iz^$%e l^xzvGFs\ ! Μ DLx--S8LǭhK\(vI2_YRDK}U^v\pJK]e2HJFVB2)#TE =vY[]qָRJtƸIfQ.Xlv~`p4]I(䂇orЋOBكT2M6p$3JQGa\p~ H/4zԳ<&!E'z5`nk&PB7JpK (p."_IU q"Ak76q#2t\ 3w% ɀ% tKa ŹtJ@WC8o5660H0{٢$cSY:J!w0? (a3:)*}!P[ y@x! B|+я :]Dt}[R=I' _=*7Le ̮'QgVf46.VQ}11HESWeh&(yG#5GãWm/m$-]TJ Ijw &|@aN%HOW}aX- qqࢭia{VF-K !TQr K$YVJGM>s8D^ȍLà[IߎӾijЎW։ɂhV0ZKTE'ʦ *ٕRVM&8=h3e.mJGӕ)=)m G!>Ƙ]O8fʱu|rt6Xb+L7Z_ f+Ԝ /ɯ*ffLb*v^;˱isݨ9K~D0?}7W>Vw} nPKus bPKl9META-INF/manifest.xmlMn F9ަDj =$ ő6@X)H;ۈAhky+zX`uiP}F`k0 լjѶN-ןדi(.N,0J=67Z:޶U]+*.Sz]#wnS^tñzA)4.HCݕE'3RJgL6G/q'k^PSE]kj|-" TLa'8 NG\ ͎alⰵ I> +o6ӛ{nR~{rWPKOPKl9^2 ''mimetypePKl9MConfigurations2/statusbar/PKl9'Configurations2/accelerator/current.xmlPKl9Configurations2/floater/PKl9Configurations2/popupmenu/PKl9JConfigurations2/progressbar/PKl9Configurations2/menubar/PKl9Configurations2/toolbar/PKl9Configurations2/images/Bitmaps/PKl9>sy#5 -layout-cachePKl9t2k$wi content.xmlPKl9mr,@3 styles.xmlPKl9Q*M'meta.xmlPKl9v5鸃GH Thumbnails/thumbnail.pngPKl9us b gsettings.xmlPKl9OlMETA-INF/manifest.xmlPK(nKst-2.0.8/devel-docs/Kst2Specs/src/selected_line.svg0000644000175000017500000001462312277111530021340 0ustar synthsynth image/svg+xml Selected Line Selection Box appears whenthe mouse is over it, whether selected or not. Kst-2.0.8/devel-docs/Kst2Specs/src/PlotResize.svg0000644000175000017500000003666712277111530020655 0ustar synthsynth image/svg+xml ViewObject points inside the plotrect are placedrelative to theplot rect. Plot Rect Outer Box Bottom Axis Label region Some projectionsmay put axis lines and labels inside the Plot Rect -10.0 10.0 0.0 Top Axis Label region Right Axis Label region Left Axis Label region Plot Resize Behavior Kst-2.0.8/devel-docs/Kst2Specs/src/Zoom Modes.odt0000644000175000017500000007364712277111530020517 0ustar synthsynthPK[p<^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK[p< content.xml]sƒ_VRFH)&+Is,%sI !91A0({V^_30$iR gwO{zk ƃFհhpϗ?6XL\qgcqxNFq"kC&F1 !T묰p6}ͅ3>f兛,1 攉 kgzrѐGqFQu ܲ^ɺHĊ| Ǹ2?gƨu6H? iİ"sM_,<jXTk9b49kd7G85GġM:xR!cK}Ǒ7Fk38 "-3oww0?ފVr/KI˒f.Ʉ >0F-T~bG/4" |E{_oUPoV3t2! %B;]G솺ێtጇJ\t7>̓;9<,\I {%4[;\*ܟI/dޏש$$1t*)t0/=ȐDdpfQDn#m8 A(fTX#.oxl ա4ӪhQ)F'r䕵s 戲ID_YFPƶxlJxV[2n]#hΎ{*%VWGLћYY&w$Q\h u8]s;H?uk-h A'_t*xMQDM_Uoӧ-L\h7g "YBԍ~u63_3jyhl:Tb̗3篹3v~74 >'{O)bƧG}O)S[e]!ztb7&!OlZ>Ѳ1/+S"[ Z:VHnѩ)Hnѭ H[ltjx bku`0[jݗ+4-4V.NjxrqKZ.\h.#һ w)f^.!/qA;wWPêqy:y1L뙰eA7=㖬60)UV5T7ᛡ/mllXֆ}pLxqK;:.cRHe!|;() (0ݲ:Jjg-tjf9 n،Ѷ͠urɓiWwA(Qא{r|܁}8),dhjH'ڏA7k?{k1/;לtF-{r@w5tS k^C?D:н5tީ{ kTCнN5t{ wk^C?h:н5tCS k^C{'5t{ 4j^C!ҩ5t@нN5t{ kTC^{ e?MMEq0E_yOxU Et{R9ASP%&Fs 4a!YBfY Dcd=i?+p}}ČrwڷUm#>I{vkQOVۅ{mhwkC>bgjwl>bgɾK&ۉ~6Qۨ}Wن6ʾ[Xc|FޏZgs C$ObД~1,AfH~D'qވ6#xuq'Oa͚.@\͑є?\xbC5(#&Ob/;%q=/qD{0h 54i>`jZFx55fx!c }=CC ue}q2>yJ=mBIҬ9~~93UBĺq*A}|!'-84MtiA KcMʛI  0a3LkƣԱ[ >x|̓JSMTOQP0ɚ!0MDk[a9pHyeZBvMb9`:%b昅2,;H*یjbsڋD]) ,}~]Inf"T2qԠQl ֊o%;"PQ nji۫2ȁisSNjܞ?$KeV{p% o'nT̗ꅈJ=$u`Ua/WgDD|GDxKart pD@&PfR$͢lP{E%רYk+Dh.Z5u5ŁW>}Y~E-LmS<ܮ\ y $5#&ݽ!3pD;<T218TKKgGa<gpZr,{poS5o1Tcs9AkR:L|2k=l&t\&= *QTvd3oi뛿Oz:q5 򕥔Z;IєT}8'&l7#.Rjn2,p#K^1 a~ؚr" "BN:䟦O_Cm 7?VW.8B%J6L^+* KSA3|fS_E?_)ᕘ\t+q>7BI:s)kbRkc3!"DMnѧNy=Ί#%S1ȠQ3+ >#35F^f~Օ_7w>.U.]Dg9}fᾹxGN/01=*Tmr܂-kzw(Y߫v/Vj.'+ؽI^u$rGZ6l@ˁEf*Lܙ} M-*;N҈|l8ʡ5_Ts.DK)\ޝjUuwm^1 ICVb$Z借vSRˆP%yl4HŻgjVw+-Mq3MBp /fGReaޟ 3L)&S9"KpCɖ2!27Q8Zs&LAȤ ']V0‘367Ӕ\,RY$0v̑8{IO$Y@IXS&E:ylE>R~paCs*oK|Z8wN{9ws?~~ʳ!ż\\<\H#V:wSe /CxCG1.ʍȸm)fGpH 8?LӃ,jD,!'-!Txd[~ݮ.Inw۝ \dic5L+MUn$,,9]!/02Β2Yl<q! WX2O!Y nؽnEoj4XE^ш&(&M&;(}IG)ߗ{S{bg'WUYZ ^ȉ5 $L(O,Eτ!}P gGI{89*a0t+]!WqpP&+UN9<>>XT"A=IS /`#4hbhX|Õ<kmaeFP`ӫ3j,H{Lѡ R. VXSq瞍8dAٔ ỊYy>U5-tY^'JCPis#^t.P;,4d } Sw|M44VVz;,j+W?pqOx1v州{j3:(㉘k<5+pl)н3pm)!`_JG( | S`Xi&(s,{Adam\(^s1ϵڨ.bMIEQfIz\>͂nZ(J]w /(F:kNZgvg%AP/8.E\<;dD%%nEGJeBWJ0 W:3s3Q(xlBل8Ix(}Sy0hPdX:pO 2]ebDxNWFܢA?`3˷ǹ ]ۦ&PKd5PK[p< layout-cachecd`d(```e`P2@Nh4PK'!,PK[p< styles.xmlZ[8~_Qi:302 +1BZ.M֐ؑ¯s8uۤ >\||۲\(O̸XECn/~{.lɴ.0D];]T+1Ts=dznҹB{nMle ۚ{ K-[P:St3Ty!x. ouArIRYV#ۂ/wʘjǛfKl[j 8mZ+KcV04dĞdŇ!$Q zU^'4銪a{ OUʖԬzrrwf_ j yB*^ vqR* jN'7g7,{J,|I L=B{5ĊURH>AAt,cjq'($5.h魯.Ӕ~vy~#λ5+F#(vTbJwr!-w^5t%Ktp%m/Fh9B 8j4:0dSJ_o7)4oYHPi&.b.~#32:A} 3Xۘb xd +㾖ԬYϣXN뢙Rj6II*ab9hWPz53d{MIrpH^}wJ6cL6芦0WT+8@ ǝ\^#Z`']ZΆqjN dXr$'6@9IJjզXIOqJxY cr.+eG'ԚA&Oe!aN4"_i2]+Xt KL؅T(Z|aJXNa%$pnS<'㛪W_[Oj yC)NzGJ[jږfzÆl6قЭvՊ  2E %o=XwU-RS; äC./(qءL׳~tn rw0ECCϗ\p[c-߰%XI xu7=aj:byް,,w_H[ 7LA+EPD͑qX9ڔ_KfVxiMwphEFUjpҩ@4|ZlEaVݑ=($͈t Q]jb%Ua bm&fm!;dNXWu8a=}=NXqJ&!)+aNe~H3[R݅;irEE/I%57ZE@ƍv9h8B&>W#2;07o)+<} EW}l#նS ~[B{pWeu0],e3~;7b|B'^w%b_8t6X| o^PKM%PK[p OpenOffice.org/3.1$Unix OpenOffice.org_project/310m21$Build-93192007-08-31T09:24:202010-03-31T10:02:5510PT68H19M47SBarth NetterfieldPK[p<Thumbnails/thumbnail.pngUTA-ww .%@N ,{q{߇{ڪjZ2k:JUYC^NJ: }w"#]#/%}\r>d0{(D`h_D ` &Y ibyނ<6Nrs'O܋ i[/rrđx~y\\ZDlqPFRt44((8rr(2*U-~;0 &2[dS^ E{9|mr ]e}Y?qgf!dt~˦12 \\p Rdrb:7y^Fp/q3Yq; `yoO"պU]޷y~.FNtA6!za=fl> RI ˀ7ُ/llݏ'ϻ{^{_o{U B)'K׃k&+ǥj*×;r7w3Mc-`8{{HY(jw+7Cc-xM'tE1CM] E=kcwcsA%7{f56L$SI.Rr>I}=)+-ELIFħ8Y ԺG|mU ԧ[/˄Hrp7|z).x ~xzidꟖM^kibluUח{{o2bߖ^o .S5Md _xhq@هB2fؿTNx̂>C<ӯ "E3cF79%ڪ4޻ ?vIԀ4EzD$:*َjgx:~8KB s ;@>/CHBNzDDߞoneQSJre?3BAɚ+ B|By_pٕfܾ1D^ o:DKfx,xMffr~@UDd{#G,!y W~A!._(P0ZRFA|-v yvGgS5=y}v'׿Z1mc^dq4ns'u/$#'W-ON LMm;J͔lӚJ8~쎐sITmHB㭒MN3sGU|(i]KRh<%o Lt{'7nKX|knW;r/e"iK^ؘ7'AjZ74:gKndNNge !\*]u;Mv^38Dũ+Yq&܁YQpR+֟z<9RaBIB&fA|?/L|ָzOq M7w,~`Qnݤ*ˤ}0ϒPN."p:T#~vsXXEP4\wH"jϵc:Nc9)DӋS$>f?n,tzt_,~J ,;@JPfx*_^ KB,p£buߜRޤ>l1iCdU @_mʐ}2X 6Q oݧ9lTkAIxmWTT(2 lU.~}8ETїaCUUtI[]o?eMShkjngJEj^[k2X|YjKB?TI QYx0Otp*.*-?"]Dֆh,*0 G%oK猸;^Rc]E?>|ál >;-f.FhT7]z7ijkSz!CSxʐBB8w)!+P~HAT!dJ63FKYl>^2D"~ 6"ɞM]ʛNT {nnӎe?4/˿;cU~1sp!\yg4Nј*ςgi5nF DbShUIG|1qmcDH)&x !kfar3-~[Sz)$\߽+*J3)>AGP!"R.: ;L; <%h^7[nX!.iN̎6e0꫰*oC\Ҭʹ-ŗhgʭ1z9Ƕׁ8ycIQ Uik1=B45R7i+&IZaP-1d+1'*QMZ5t9֋/`TH 8ҝ) @ҭ@1na\K@ j]%M/2{hSE[ JI}1:GL6:ey{䷚YmtWw./VfV)۴ EZCDNrIzDĪTܼб~0m9*cxq)2֣]%n+fYz%|k x<ߕ$k+z8xa} 6:IuىAx$JvB5F/RuY+" F_P0؋Q-qyb8v( ADg9Z“6FS%I)#N@8}r!5M9?p p-wOIc/@VS1NF2g 锢BLGmS?J!,`_`T|1m 2rڲVWGHrk.pF OVÞz4#u~h'm蠃h/(0=Hd+N!0,Ǩhm'FC-pժ.'Jգ p}q _k?H#9 /(}*V)C-ϑM;1 hq~u!`7qR(>,8Yԓ*Eްs{w@y0`sv7.#+p$&.l@c .;wS!<ǔG^->B,MKt;at_/~$%Ψ@)=`Г?zv|&咪(4),t3]F\; *D9ߴ __NV]c q0l* ;J q&5ΚH]",ir5%l"Bec:G,Ka=L\\@E/tl~fw1_ 8A?D:Z3Ǿ麁Mky]^㳽oayCRHv΃ZHnG8\6JDrk5Wi2 ݓWe@$;F`swz!B+^R[EI ÿ鎥f쐓lH/XTLf{dBcƄ7X6w VcDeEH Hȋcd8_0ܸbMe8?+ 7̭0!8a*b* /Vy˵ s{e?[PEA 8i<$ `X[^¢ cQsHƊ0 I;g>kYg C*iIKJkOc"`-^lrYow`841bA1xhH@Z1~wPBZ}WdcG:0D .7-n^$mt- y@V(IQ/m1 rK ro֯yP{˧/`T0rD<:tz(n 0x6<6>.ıw^IPiSwwHswŪ '_&ѾTԴn 0ɲV0" `t֨ƴ 1"U-X 9g ,x %eJF Kc+F=!r" V7M#?]>$MJ68Z~ؾeHR&OҳVf4aKĠ"|se[jh7HLׯIdP$:C5TGYFK| y; dUgYVv4 @n /'+%ʭ yetuZ7TӫD׫%2-6=\2&&`4 ,;;]$TZ%c2(r rN'\K.6wij+6s-؊X{^+Yf'ni ʠ}ҕ9qd1n#S+q#;rBnXekRӕiA1D֞Amk%KVMΘ+62CNtIC(w0a!{vhT~nu2hl>-OdoYmR:1,XA {z2͵NϼJЏ|aelEM.^27ۤ2[JӏNeօ?ǙJglf p3ǼrŘ}zݬ :y(鈤`,QTZ5# ccyNE 1w, a(xZ٪2W6RO3CZ;%#n`ŗ^~i:grj6ٱK{ǯ>{TĜPdybWA< d-׃ V:4ӓivPRN_XHvL3+6V / &Půz-BΉkBfLXtǃ[EVx5( ,3qEPP`(o;+@ݰȉs^P&~b̀)\N&3Qr:B'?2NKms]B~h9TŤdYS9pDP߹S/pTGKsTrrkL!"(=iBz`0#D0kp[hAg-|PS5_-eyw? vgWˆ놪%ĨϿUmsFCԝN=2;&4Rsxحm Z%(lƞPsnYe="V"St&eL 2Ze!,q C6އPPn Uen pZ ?f#0Y@%2σ(uAa818ߌS'qYd (JB7xۉOާ)le?B'#Q߃L?'6ႊ$h^OvRR1px>E&+lG(!i3ym<+-iUa7R4/D$sCgc>Y &8' .cVz=w7䢣ׅY"@jF2ÎKc8l9*iFa݊&bb3az*R)S,z|'_^ Ssm37V;QV5/'d AQ=?dp8:ANd唅]cK+k~iV-S|*ރeh>H"S';k<VX:7`> e<+z yX K:iz ɫBiЈ0+EGiiG٩g`P͒Rշ Ċ<$ҟaN`٘C%OSBp56"[rMt<7Bl踎L[+^VDm ԎT~i#uepiVę{Fdpb n*oh<yop= 2#rV\+X o8~HX"7BO\8LPRtCNd^x<(η]ME܄_m~:N=G[=Yv7UPP Kb}5mFWPEW:ͿPhixb' V&t͹4l5{xgE /-Ij2 XUr;C#K8w)~2EƳPZn3&0xQ%mSʗ/fBIƏ,h VKrpu_ h,~ Y3s1qQM U/]j*tNDNW]0iU19qIp@#_7㗬rRy03 ΏOʾ%Xp-LPĈS隽E_= 1$*{!ʇ+}?<+"8d|SQAl*5tY<.N.?#⌾ :ks74+^;0צ_IRH7TjrZc/7x?vd-vI(>ܐ9; |%)M &wn G!xZXb_OX0VDAԗB@g~JSUvc"u*iR0g2kmz د6vnF% 4<$RdKY /*;wCu,H3,*./,h)a،{T3ÎJ;P j'QG9~a>7Jظç ^?yQǟ \RMr?d ((J@D2tmE'0$Ř6̿ ˟K0꿤ne smgG574S J1in-}f}>;ݴWR3}*ldc^ v7Q4݄#EZJeo'e-=}".lE"7i*sL -+GBa00hFI.D5 +|$s7(TMjSud8M:k:6+Zgr&i2OrjT0MLvTAg:mLOO}mM$.Ԉ)*Cf`shc"2`n'^I ?qk\sĔI!*A^i6x}k46)Ag yR{#r8#Ĥ*.BĞ}NCu;jYd哱2$ L98tL4YHdt~DԬ97~#n<'|) )^9U '` &%xr:?lgF c=/CFFNJGA SF:"%@^恙#00fh.&m\zCL"k;j% ߏ:ZCLc3,447ڲuBWx 7,˜=+Mj_/%$"9B3pʀv +< x(9 4W39kh8d l١SfVNZ{9PaBtJೝH^މ -5W`<]m{ 2XLܥplDJHu\vC\1/)0eͿaA͕|q{_J:/Ov9m^sB|(K%yXzs3"o8_{JؽƯJ@:1Ej{x:g<ggK7TCIȧ28#~Croީ2?F=?lpx}w$?=ͧCS@_</WD7{/sg==J3C:%pF\-Tr-Jl!|FiIߓjv@.S)E^aJ{6W27ukQLB ̞dOF2,MK9HyJ &?{Ҁ9AL <29`h5ǽDZ3gћѧc߽~UDBm#W,q h F# 6}G'ԘT{樇w}pAkzz$=xnͮKx4q&Bc{DSgT`AunoȊ+h)Z`>cD}MAH :JC_Da׸|̝ԍh&U~XmNJtBjKTםeБ04zMW*˱5cN_/E}p.Y*NᡮQSpUKr6} ɚ {y=~A }fibQmaOX= C}1!meg)wХE{ \W2aiB,޺k7E5%HRK89mR;B8 NjB*„q[1Kt  ['F c4:Zur3'3Ь\I$tb6jqy.I.;|"+Ϳ *&, .E (^Q[bKN> } CFOwK~hIi~cD RtD!P MDl5c*5 fl(͜\{rmR(Oj\חW]@ (zhB3as{̥3z3bs:I/*y#)dck4+u {mt𵂯t~XNvbhpP GNV@yקYAt \& 6(*O8"Q@;po))Kzw\lmu q[K 2'$Sqqi+n|N::K龠 ]ܚQp$Uh@ETs=D:yB`c1?/փ=T(\ )Gywal88FSWT ঳Ow ַ(`2%_R-R_w6_2@$68뀥D^PU'>]Eۦeipkү˺GB:r uڤx$'#Rd`9pv.pu(u%F/><'8s*S|[^v1dň_ nVYJ9\7"}0܈*3^I&C k{^}RHl=X:T8swr[lqN3!S1nn2%|@k[ǖ{vo*e2]46Vsx1G,m1 B՞5kjZ|{ɗ,"?LQeÔR@c|+l ɷX_.Y>* }a-XV1ةd[}-cF{4T>wzB,𺠡B1#BMi6akN2a;CCF & Z)jq| Ʈ;Id,PzD5!Wt>&P]!ߜ5zRcp(sv}<6ܿ%9Vrkēt1h'ON2gd5Y"8-!Udfi›o.),$-Iɩ/ԯDSj8wzgyK<L~|[ya%#~d0ԧIk\)r=KOPvSu+a v]M|k}:ϨUfU`9.7 x.dodp) 2V{f bVJsT>Nv6U;+;޼N '>nsVçD/ 7RϾ!ܑ@0vcBqZ1xyψjʽYv"cw2iq@\Qo*"OfoAO7/u/${\LP#0,tm\UG-s;~BhOΝ"w%on^G.%\F>q<ʱ9!WwG&r8~oT2Fv L6I|'b,0ߋMyVG,GZƬvzz/K WWy },Z;RX2a8~uյYJ.|Cج6ym N?#ۤ"mdSuet,*L"Q(}\,~ -gxJۿenYoaSe&CE!w>V)NQrXc2I4}60Qa1rdy5\?k~LwwZ;Gίnw9~d~-[\\gu"eBT.N ~VT{Ι\>OJ&/*ny1ע{j7}?Hrٙ 63`*qe ~?9W-x풿m_i5 Jw~t9ƒ{!>L +3O]}LƧhއV+|nAoGe=Edۏ I?X>a{bKWw[A[2/9x35<^x/}6Eޯ0M?'S77zlyN{Se \,2ZWʶ7l?k>wp?qdxc+Q[N?xrVS+_%TDmٱ յ.)M{PR5Ve?Q[IW m{l_m{x}%s= 1,_!+:坎D{ޔ8MU[MsMP 0*'|*׵N*xsJhPKao%DEPK[p<'Configurations2/accelerator/current.xmlPKPK[p<Configurations2/progressbar/PK[p<Configurations2/floater/PK[p<Configurations2/popupmenu/PK[p<Configurations2/menubar/PK[p<Configurations2/toolbar/PK[p<Configurations2/images/Bitmaps/PK[p<Configurations2/statusbar/PK[p< settings.xmlYr8}߯H@H*)CYfHLjM h#]eC6 f5-ur|y%(Q>xW5d!eҭy[lh$HS` -]fKl"\7%@7Mn[f,{\=x cfZ.WחիFQM(g|~lGUnȌIkj߻5u D7ִT6V^{Z+`@9ZwꡘEafreΓC\t}{}?f_կM/p5 : &4L0鵌Jl+\ixI1O_X\25Otڜ^g6[g|ܻ-.X4?ͧ/TN%։d=ݨńD&$j?YgLLE.Kz>KUW®LyaނVjA&` Y 0I alFm*ghHaiȜtT, ^PFx4]T`U}b/qL^K^ U WALMK6^ KT@Ծ ۂ7M["D0]͗(6G˕64=,iz9RDS΃`+v(!|é Hj2ES$d1 ,L!E/k d,MN[Ģ͙DZؼhP̰-%Ȧ.lK,ܜ)ۛ :/%G(=Q)#Ǿ~(_d-ؤ<DžߺD2:Rw[%'}Oi;9D&q}璠ol0SSA)pIN χ3.'g8ms>ptM9hxg4Dbo= @mPXWr+PWnOL&L7*9;j.aYp4Tv& hcb?jYZ^3_P]WhbDXJA4FL9(Vf`rN],x!5eB?A! 1{ m:\a"^Fa/LrQ|(-G.A6*"Z 1v_vѫ7걯_PKLv5  PK[p<META-INF/manifest.xmlMn0">q˪H $XrƖ=FMPEUAζ{㟙ؙ>hKx.Dl=bA6pV"z*-JCɪ*vH\~/G"m0}]Ű֐s x)T'b*Q0Y\wOZNhLBaC"i6ƀv 6r@qV{c;dxznGM|ڹ,5ta)A)48L*z;_+ 4c*E7ԋ? [ku-|i$a<ʟ%D?gu1oaF_JJOPK!c[PK[p<^2 ''mimetypePK[p߹g1wGRfv/A_YDD33 X嗝-?"""9h+f X  NkD`Rxx;wfQXP^53[ں?"""t7f=*տbfOc[<:efDAjkV̖.IM4꓈HL"3_-<ѿɱ?=A+cgo,Z㾈wSX㾴*摯92*ff.2.~aLDD$N̬p<O~<07wvF׸;"횻?>}8 ^rwVVI-sׄѷoy ; r@%yRl JNv/jZ#m>ZkBegfK%3Ny8ݧVqv[I6kVE2=m'e}N·ʹW^<3Mvw2pLK$r388)"u,M5ߣB::[늈H1u gt4uZݧv8<43#ix.H/3z(""Mi[5Ml0 /if8p7pT.֌-Ax"Ծs3{9śp3lHwC oL7Ow&?> X/m- ǡִhf Z'cʻ} \O֪Ҙ-U嗽Tx>FV~Nt3{S>ʸoI]9 3{:oA%DD$Ń0Z9ںW3^Oз91+ r-xXm.`o@To1{׊f#00 {Qע&#>//|mۂ*J ?o5V&$B^F`< x>[C=УG=m:aZKafi:u77]h݆9kٍf Yo3;jV^nKE3wMٖK/٣fzKf+>^R}4 a@\by>3c%#Fƪ(n3̎r1ےQ{)XLtf60}1\ fVîn~qdv~z @?`Q´@5lswEH^qWQIB5SH,.fG\bfFݲF |LXWޭlB̲^K3Ni}>n>I_K6[0ޫ}.`{tlf6a68=3I3N5 a}F;}Sn+`wv)P$yN !G$5N:ݳF0/N680 ѽ}q13kZfaJӒ)Ӏ<{QS'GCWH7Z. \dsM y!ٛ64wW&})oU^V LܛifG)q)p&R%o7wDŽ8B4?!یI3xNw?Iivw:&i!1?""|>|Ce^#}*0)z_#)Z-^ۚUЊ5fy.Iٚ 7Sk؂>NϸL/|so/X0JKk[ .]X #Y֚=ON+^sSs?Pɿ_~tɸGH ﹁2?عɓ%gA=У^&w0Pk4l73[U\ s?ExS b_Wɨ5Z> 珈5aӪd 3۞G o>abǫIgp}%U͛6XݟB>$'tlvXwYi'{/`]h_B5N'{:~U5skfF{'3DD$J#O֮] |jfwٰdd0]3os[r]w00͖fgK[# 'y~_K. NfO3ۢk@ vºw d+m}0M;͞7U14`[wf4ͥ[RNH{_Y~mf-^|@nj\ݟNhސ0 DDD"$x_ލEGfkfkdDl:+CCZv̖!qhiޔ9MnNu/Zpm1wL"faG{1mtI#llfd{$llى{.tZ:bG\Tuߒ^<(ިjV.yךkH]8^J>(#UZ؟ (:y~tt.<;NnNޒ X5!L .0!;u%!rQPYlUw9=Irj(һ1U 5ykypUq,UkÚrڲeJf) m|& ;Ű 'fuKd}<!d?C̬ES~"=댕z_?9mۚY֨lɖyD^uUG;+m>J Gw/tNcY-zN[pYgdMY_֊GDDNg>PxGX'HR56i{vKvq{> bi" }Us k l7rj]0975`pLwOrk}H1Kr9QQZf"^K:V^'d,fΓ4hkTDD*ԩIݡ}/f#?%v+/8LVVzTO&yyoVs&3O1ٻBIN[%1/Ѱ^|=8b,}q|j.bf9רTS&y}teC ө4g߅/ &{-K1#ǫFsX3 ͬ;u$|Ӗۗd erNi)ʘHS3W7}0;BߵyE㉈tZEuS 5~ ؄0RWC!wڢBʹa_7JyυG7(JvkM o>ky:9mEǼ$)Яk^st,YKU+5 3kf.YVn}1ࣈDD:-%y9..1;>Mafw'Upj&BsaH?o̚o|ߜ$of6kz\Kx/S -eR.5 y-5aTO׬Op v {GR"T?֖l;s\_;fX}l.ɋU~ד#VCGzHU)ٴ:B]+*+tso2k-vAGct1$O=hoQ%y""hf l9(5m0=ӁH"oّ&iyJsjt:xe*l c5%y'`K.jf?p7{1=sTα{TՖu&io"_O%ust0J>%,\cD֣ˆ5eK֍4lb_O%p3+JxJvlm^qzӑZz֑>hn$/vJՑ^""RJ3iflF+x-5:ӂ\DӜS֪/Ps} 4oYڃ*UGօާ;D-& VRf|U%βB:RGrږY/ڟ 1YL)cgN0fv~Gmݯ>9ݼFED:[ 6,SVGO^9eZB 2zJ9tN 3Y*{w~FEDB5<lfV]w*cf*;RD*4̬I"" IfVvffsNKB(HE,+ӶrPʱk}j_NF۪fQzԾ)JֿUcRfK$#Qc'Kw|I[ǫ[إEJYW`Dk!RӀmY`^'tf8aOs۬S""%:C78NQ qpdOq[VIi:&cp[5F3ہ9LN>82甿kR4]0˪UI=S}u?@moi}|.産ZAhigiGňcfk>2nT,7̴{ΐ(f8#yp@ /=x+֮0+idz]{ Y̬Ue2Odl_d<`\ՌJ{u;A#a-+ ^mlULْkw5afCZsd4jnv$S2^,I9fvIZ2pM48_h}20-'poKA%S,kOX ߮$SG<k tGGv1[1mt`c=[xEͬpiy5qɿ"MUr(kzGw)e v0SY$x2gEZH֤39ZEz_ZrZ0fdf`3 KYv5TVDڡz/P mtz\̺?'L]Y#k[QV$4OeI!fπ f;$onFw?Yꑑ\OO9r;0v 6~ ,T4?wmN6ty +)pV%-I#*7<^hۖutR KOxmL lDHj2j~ p(Cx!{\YO{]stdz^Q]kԨLoa_Jdes}X{/\?ZLwڹy6wv\vmm\,[4 ع#5afeFW+2d1c*p𸙭^?ܽnOʽw7[v\@//o]NԱ^ t=mN$#+SKd|"ጯ >W}$ sLX_0O ^/ORpU V}ۈ~>9*ҵxc]*dq?3~=ᵜS>ß}Y?yޯmE=輏6@o&1> 7YO V%\&o/U<Ye_U%<]+xA[ !{DֹS#o%XS_!;){]]%7(+$/QU^P_kO"zx?k*}^{gqwoW>X=Уs>jM?? ]DR/ ~y5Z_$=<ބ)1vq B]-?HB, u;-qwa`OtL_WY7> gE+urgҍPjEҧlYbw}ON]rg"r MHܲ"Z0#&kL`4ocbfaff]G()1 +k={*S -_-"*m݇™2FdUI#\7Y$xZgܽ:}G8P-^ L(A&LyܔƨC؅u0UmU8BJï[{ ׼HJXx[vWمݽ#fByIX%tLlgBYMvx'~L Ks>df Ü 3޽;-:|,LT[o{zDu$\R}e#~"|G0=:X3MHV l8s"ׯߔaÆ0jԨ멈Ht$ODDD:3KXfQ={ӿ>SZj)LIkVcmeʔ)Sz a#5y""""f KgE-q}83f{{ә-^{-/"mfFϞ=vl7#"R%䉈H0e PS`OycfwJ5O>|?A1}t1N;t IDATD׮sJ;wuFG(k[Eh$ODDDꂙmOwBa}_2kO8s9g_|q.Ǝˮ(9r$C̎{i 䉈H]0 Z5Pafߟ={aάɆ3>o o*aD&iH禑<pvuE%vy ^2cǎ-Cڊ^<TM,HtfaM 6rJ&*vV ,Ùo+/oU߸{J%"RJDDDKjJHJ[wݻ7#FJCrM~o̶2WZiF ޗ_~ɡ=z_o-؂Wv""4'"""m̖^-kݯ* v\KXx9s93o23d|~+`aw֒AD$<iSfCO'Č5!KIxm|O YXqko,"R)M0l_3m8〟:1<3v^Ao0X ؙƛ:g.]8òN(/0qDD<)uNaÀ)\V:m.4Θ1cXk1c >hh88x8pϬFDDDh1'">0} IՅ4M"ԫ[/HYw*͛`_(YS^$;+|cfsx1S.]&͚5w ۿ""(V1k_`>`Qp> SF}SNy8K5urlpaЏ+"ZJDDDŒOX\I9 Buw+K؜_J8´}-NhL%w"ҖjHB}#"$wƈߚ߁K,LsYɹovis]SDDD*bfY&7@w9fv:aT4Mwc%x%6jNI2wl6wPD|AwGC(N>ہ}sw,VR> ;еD0w""5y""")AN/r= 4a}.@fnF )9p$ppO[D$%y""");)]@#i );<_/*H䉈tRfpNE94{dw_W%H< ݧŎ-"R+]SDD -E3^` M %Y= |ifW5%uVI˺EJDHH'efo$K(}ل0raJdB-q"5pW쵅""6^ct_Ox{FnNFbޒܭ<88td.qp<gSf$J/oӀ_6TY=/3jQkn!l,swqEDڒ<:dfÁe'+Gk1>vlz$ODDIMlwoa{rb/G#a ^8""<v^&L9bh!rܥ5~t/kvVBr\̸)%vvۋ+"(!3K5`%MK]05r'= 8!);v?]8|¦2J?DVR'""RCfv a ZGM}zV Z<pbl=h`3Bɇ>5vlLuDDDj4pAV~EÆ>\rcMbn~VrxU`0`w/vlQ'""R3ۄ0}B򆩈Á׀/kq$$wۤ4O%L=?4NK""R0%y"""Iΐo$)]05r)EŎ IHhg H$ODD$3[5fEn1!8[8`eӀ+Q^̸IU J?ǎ%""FDD0M!>6K}jCS.NvŌ[phy'""FDD3 #z g)+zc3L"l(0 \{RDD:>䉈Hff'꾕nf]}fA1FH6Hi88 ] l \O+LFDD 䉈HffKz?W@!)_ĝ_Ek G$gU\DDU#H0f-k | <l3fpM/ ߒ~L/q4p9s<eKDDFDDM%v&D1[t"f&ҷ'[9唆Zs䘱SrYɡ?KE5y""flQQBͷ+ ^mG:280v93xݟ.iv|~$}yq xdBw"""-<i̶n*;ge``^LVZ'"ɘَ5e].0bfJ`40 s;%Nnj#""h$ODΙټmɡg/~q~{Fwj)'׋̺F+7*kZ4v,F#y""u̺?qsJ{qv<X!Ow1ccdc7JDDꌙmNؙ%_rX1F,r8B!c7yc=uD̸"""핒<:bfeM{8 X*(uC9*""Ҟ)3f 0 _1.r[>#f$PZ'ܽOX"""6^递Q~fI``G,rk ?}fe.q78x"""FDD:dzp$9, ?4CW3 \ oWDD#P'"ҁٹe_,++5o aS[ g¨n ;r&xnƎ-""ґ)@`ӀˀqF&.O$q7 8 ^Ҵ?;Hњ<v)Yg`)pfڶySNy=3n{{ x"""uCIH;bf 9'7@̓r=䮼xf7i*b.""R%y""턙-<*kR`%5vzra^o:p4L 'Ď-""Rϔ䉈8rb2A@f']! p B"1p<@i㊈tJDD@2շl#[% cEHF v5 ƌ[Yh'"")!3[Pn'AAqW!۞?gjͽYDK8GXwyqEDD: %y""5bfg^m354 ” 9,pON? K(pO[DD3S<HJ"Svx^@F#e.Nv$l+B5C㈈Hvl̬o١un{KNlC3P<06+(;#%ǎ#"""4'"KڷՁ}.k%cޔ0r~Jsic-Cw[/xءJI$OD$dro ;ܭ5p&0ݿcw^rl`o.Ō+"""S'"= );|W@ã)|IYD ԗ LC]t3d1)"w L?BrR)d2b%5P'""Ҷ䉈T%yG`'=w0rܮK9e

Ŏ,rH^'rJ`Sp\LItjIlYӴcKHFˍ!ljrGOb/F(Vbt+Bi+رEDD64]SD:53[PTbߑb- ̗r#~̸Ikv%wMc<4l)`5R`szTwq]0t/g)Gb-?anw'"""mK#y"RGB;]}! 0G)wBk%I$|5pa]aREDDm(ffÀ h\2 IDATw_`́ZveBXs\WwK  l&#"""uHI53 (Mvv ,apGNo7_. O[LĮ'"""퟊H0~ffeoJ9pDV466)MfW+o J<lCH $ǎ%"""FD3̀>5rՀm\5\EXvFSOJwWDDD'Hef>QB*0N.Ro}% LQT=རe;83u3yt*"26 pVe]Yw,w:`wYLE/UEʎڰ `zS2qǙq%qN!(w Oj:"bX(#=V` Tbk(S88S7n8N\lW2 =+o,~)"`^nU88δ9%K,Cq`NMfdy8  BU\,qq >8N=!jv8p`#3<OI!I{3t%qqR \Rt 0,(yŢqq+3y3""}1T)X84\{~Ky pY6 $6qqWg*BDffTD6V}*%͞M9yh E+p+p~T\qq.+y3 "yd`e;#k 2Gl^Xȇ+"T/0brqq:9.T+xW-HDGsfdy8rB0 ~)sgEtqN8S仰vs' ;3kt֌,'<=ȟ x 79ԳhY88W!"bEpU=@U_ŀ>Eǚ 3gdy 8QU(RnVg,qq! "G`KzGw&5!sN4@_F0d/, ],` C;Tqqljp%q" #Jl olp`,wc]Edi`g|EqqǙZqsM"X}>YNJ? +!qqgjg !"bUտDf6Q H'+9\5w>]ܤ o| NU,K88Ԇ+yabہ9_fpY8ؕ*'1Xs"2~6>N.Ro8835ӣqq:khQF&"ˉu+T+xaS +"wcE"2RMUTtWqq9N V>\Rt9Y8؆j*Ϫ:HA)jM%W+ lѲqq%\q:x@U'8tW)w[d)7i.I` UT\qqi W?kG%88TUvv_ \ 88N㔌lFK"s#L[/#+}pU4 4MQqqÕ<)թV^Rg$"cZgdp@0Mh88N59NAt֘C1Ë”_gEMڰ!p=D 88N}\sv=?3J8X!#˧i<j!8U}d88N+yD_`%  btFh $]g”TpVx` ,Euqq5` LU,;{`,.U 9O3$ߨ?+R88~|&qrfVWGXr{{607HA~/-nqqx|&q "Coשϓ<3-(Gfdy57T Dd(I[T:88mÕ<ǩCqw ?J3(/g7ڷW$."c3v#T(Tl6U":88JAD>ډ$ UYÁ3<š@"2T RՅ88t &q8UU?.Z881LI75T/0}Fr+Br1H`SU};:(0v Yw\88] j'[ٞi_LL8hEGDEa1"6#Dz@`4Qe+:0|;F;-݊`6_U88MP+[;)W򜩞0u(=p )w HY8؍Ϛ7'sEM8(ȏysm}/l'7W^Ԟs"Dd+|`@U6u5DdK6| |yp_|ǙDl %TؚYU.LONXs"#pC+pIw5 6'asc^Q^"/%7.L^"2LY銈V*>R`8ݷTgJhgDDLb>*QغiQ*+LB0^1O#T U1 UL&x#/-G1aqF*NJR>ZUl9k=]O`czc!`[o- '"۩?Ki8S*9S+ Qཏ{hA": `H@kg#+;~uWΤES`gUVfU8UD.<{ [+ M*h"r,^vf͛%fj \ ՝]%"E&8N7Gg7qڋl*" bJl΢E}"rg x<`1Uݿ$o ~fPreu6yMz ^LXk=p; UXHUwLJXqJm-EI91UG UHU E,Xf3ETU}((0K2Ybdk,x醄gTn ]㬼8Nƕ<[""bV(Y" |lHU-l퟈E<FUG?m,%DjZVL^IF889ݎ-5!z֡SlfV 3=ceVUoXz]ԁ|o ñ+Iߩ%_F:"fEd&p4g~\9`SOW',PU&y]C230g_Dfz""qe5 )'ޮ&U=WQկ;CVU[,\s4" X xNUP "r1I,`;L[)#l߹%>gNҾEvJ#FUNhVpx9Y S&ԭC~v̅" ;2 0G= |^ǔj+YDf KFȐDF6OU,]ͱ>![EZU+I=;Pm9s> 6j|q޶wK&^]Ddlm3,q rGשc{`Q)aHD8ǞcQ"2 tK ΋xݏK9;7)"2=s^^)9dbU}yCj]1E}2IDFbίՑ?KwK`U_H Mֻ#f] >gp+?0F "fqmš] ^-"2P]YG$6o >F,U'"sbqQ~~u@֨{9O{C]c@O-G*~!\}-hGobN6z^E#+ UWBMzu`@_|8_*||Crmz]KҾNFkwy69^ksزask 6;Ӿ&ͨ9I1 Zu\='Ty^1%L+kXN~)9ρ7yɸHS2eun $}<ѝyEֻkcjC\:8->3bqTj:g9֨QQ֑se?Q?Q!mE,U^ m: M IXSyŔZm<9 Qs!̆`sOl$-|83`'{`#ߥia5p8u>)1@,TE1rV21%sR\`1Վ!I]g(wQz4J PF_| ,Σ̤j=OMup -cV&y,yiwVRn49#l6}dVbZ_K2x9lZ+ vMʜo~ kd/}P81yW(wTλb3 yƔS8>5y *Wq2U8K8_bj4M~ I7 \1w`z埀Y,\Muzzmͪm_SB+2>SDJ ɹL`+by~+c^XF23ȷKTWee<eSrAi).Mʞb=bQ9jԹt$uo\{ *R@-7ߚ2LQʐP50 {zi {йc:7?D`emȸFE0(nL oJÔǣPG@#yrW#TR'Qm-fNΥK_0CsiŤMb $>-X;ߦiy ?5clѐoX 5V֏tŃ&upPi=xj9F?71 D d:yWz@QϬJ> ڱ{Ҏ-r%* ~`J$JV/Hs:zS=.%/;2XAE ֠t zn o gɳ?9:y7LdܞM lvi_~ߚm,[o5af<%Ș5OGA+ۛIqQZx1:oZ31J3`hY%/}Y5F(c㯩1{^̯Fy'NFe$9d\٥ATɛ5fH*X;T)qv9*գc0J~"Dr.).s*#؆ZQ`o7+*y ۠,T[LAHW)P2dKc8#ks(yG>LMBk%|a(J^: }BqAM>$sP4+y0Ex:w`˵Ĺ35JOIuNu_FQoMe ͷ-۞H,Y13:0>xv$$r'gt7l].դerh2YJUV&Rg56q~ybXy+38W[m< ,odv{w?sa!9 IDATRf & ZɛLpSߚeVoY6.]2gF>IVK#sbƆFoغ[娷'fn͵~Yʶw(yG%yٞ~I5=ICE*J^:pirR Lfh=+_W1<#scs2pkf@&S%/)?QAr95)wUFTKΙkl-V\z'nL5T2X~J^Iy08x NO's[NgT`! r%U6Q&V/}2}5ޟih5Ӟ̓;J9w tU[P^(l!u0nEUA $"y;"15 c){EɝP᪺>|%y-V&&|9nF&k,׈ R}rbƥnm`aD28yuysܴ-:$c;VUwUյnz5z6F2o?9J8^݇uqP>ϽYTn*dpFu /h~xhgPD"sw RmW5C\2`<8KU:|mzgs=P<ڍs:j.Dd6,`Z[uQHqy^"OUǔ!{ZBU_fXv?%;p=DdN8>(ou_MflnM㏱DpbX?I?8IQ^<}@fNBU?5`oe**Nc٥װi<"Ĕo16#5[{uޘGJ"IƊL4O{G,Z"~ a̜i|κ ́ͪ,mit_moQ|y[epqqyYϴ<-c 0,Tj1l."3j8~2jiw|FK۳*}]l[Σݸ甂,='j!Y^[3NrL~Ev'ܕZD֢zld:灓Dd1,؇j,9̕!"ytpj""}h*"Y j 'az|w) m$I?rkSLBWR`/Z9{$fhŴzϙ+BU'.s^y.*[USpD/VHl]j4X|)v41Ӗω9c 3\sCD~ ޥJ\yΫPՑ"7\m\'l6Umf`ٶ܄XQDS)W"#$Eɛ pST'},D|rۇ߾"]f̴֤u+yNN샠0 cNvsrft~ŝKSj^Z1ovl/DOZ0("ꄤh:2kB飪߷|V{\yd =h|ҼY"ݩaTd""&KֽYVwDX< c7c.Dd&t(S#xҾYtƤ5+&d|)cۥs-d*"[_zC::؆ mU0X8JĖ `!0lg[k1%l=6q@afƴe=,o~np)h79!"3`3u$*QG޴F܁)w {]XkT]Y橰M3̓EulAⴶOg*el9i @Z3]ȺV͜OYtpO̳KQZlr+ #g23p1Su4EX7j|T9tinzM7tTxC.;vBs晷ѢMƾ֚hfTU`Ͳv.d녭6 k^f| ;PUMYitvK>Z3X)skig-ifY9EwZ_gaV EDł3[wt>SiY1vJla 7T[J}ej:TuyHϷ]< Lk3-w-Mu}&Dz 3?jYN«13k(o{k^wI܏MzeFXrfi{p7g=,_Ef_j" l-IiQak oML5S.Ezx56!"+a:):XPUXȎ,%"C1PMfkVTmPaNT]GNȺ"<*"R,&]#ڑ[> OƕaƢfm5"Q~(tp7#S/^]4

Uu<Ճz3zK<CUEUL5o"gt WQc&+s2%7Ui {|/{kDD.CccUsP6-\,04I,"|2fa&EEdћ=8% _#b[欻+"Ec,d<‹|$9D,hJ[&Qd LaT;Zrbe- HMRwؔTeXquhR=4xZџ'DŽFҍX !"CE>I"8:9;I.eq7NPI)rՍq%iw)"kȿmS_\U-!ޖal2{Ϫ/UvzNtƞKv4&3#_;u1jډew?ߌFzո9$} =gQrؠF|bf.b樯Fymco{kiPfzmRԶr2{^⃂'㓀C.גߋ:*izR x>Yo'6OV׀MrnofV;` $rygs7uh_.ZsT`3?Yg|Z;r^Ԑ*yk`% !<{f&&y.R8Xz,\X! JϰYݰu?-j|G[?, 3=+}?-Dy'G}W3]\gޯ9m(xRf, ѵ&ҟIoj%ߎr Jz D2G&"gw2#c  ˾|fvQ6b -36P;KFٽ:[3{[uLq9ZCbHxlT(u JvC6mGk!k{}ΘT8KrֻfTXJs^/݉/q٦!GIZwol-cu~ jПT9~Hܢ،G؈x;͍:gFnQԱ2fz؈OTuM-FGa(#|Xò965/,Cl5:U:g%1sɡ`N".4b>@n/Li3CUk97oĻV(3шU5K啓6: fj-ͰgsNU}fVl^-Y9+ "c}ВXȉ =X0&[ {LP[ֻ7k\רܟnsnL1sqf;ǩ>m(-66;6f@;EkF#mo_6YtbL~ST iƣUPߒdP5UMck d>5v߼͖ܤXHg4Gi,Z֥/U)!DdMjGC83~^5YaDr]xw•itiÌ~z{t|~̔-]^=?`i)aYj.؈o`2:8N)yTǙzp"6p>6B>f>U}H/F[}0ET"--"i̇hv'z3WqqZk`t5$Ȟ~kR "\4MMDNPT0]?[3&88ӝihmAzSBDd9- ;%To%(x;bէ`3z`ꧠ?88LLTDpkŠ_*[Ub]I1}kmC_lf2vqqiw2c1`T5uedySnn7&&m"YUG/88Gx+\[a( ɶZDIb\^.*˟8+yS"r# ̱Hx+ðYYN=w({جժzTtl&,Crq"aR.S}(cU,J~Td q:7ל:X(p%pl ^td,c݈"3`1e}oElU Vlq)a<9=squ#=U?Q:јcU΍;r/[ܤ # Vqeu7"2'1iGqq f |§jD7H?LkKx|& "c&B U} UGaU~,pѲ3!+< W 8ƱӀv`[""egř:9|P.dpCXxƱw5J^GDVDJS̅azgdS,A((Pǘ%UѲA 3wVC"";g3iz\g龈25 "2FUfM |Kn:o'L;/Ӱ]9UYK`fPf$U}ك͢Tʢe9& mlrLADzbO+#^L;e/$l7JIU*DZվLCBr"B|?lh`<YVDZ-; Gգ14""1a@Ֆ%,2ID΍"TuvuDdp0YxxND~Y9eTuRYYID?~\,+E`%쭪(Q}!{84.R7;UN749lIo:KLv],q20Pt@X'`U};x{eo B<XRU'-qiU\̬^i,,Su.S}8 a"v{ӌKA V B"Z)q)Us8& ^8%J^""}R/sה|L wEq5f3oIqqg[KFDzȎ" rLU?UաE*x" @U+XO3 Š`=17*iap*)46NDla7~"YyrBl Ƌ0D'kzv<.HsE+)_E1OY|&(& U,T`y_tfp];3R} ߪ||OwkU9rU}7̖:5ʜ'Xsx a =E ,HNyz>lc,"שꤼ`G9Xq:.s*"c5R㤉@`o'@>} \֩Odǎy\UoINU:r -ssHz];TUթ^Pտ|eR [ IDAT$ܙBgѹzSs% g^&'tAE$WU/h}mEDvmeUFTO5́=GAUPؽ0 "cW0'8'4G%n lU=3,X?C:6eRb~x+TwMugc=û`X;esaKV *7~fؠ=k/|kbwx k$,[I_.N)I;`[L>/Avo`pS)p_F9:mؚvc%N a^k-_ (NUl +`PTg_r`&ۺz&`iw ԩ:m[F3Y*Go`<|_-:uC0'Z>ƽv0g }HDikYk]_3-Ѡ̕5-4vuÒu yq;æu꼯Fr\t{{y#GnQvFRɷ||K5ό2$y~ \Ҡ K'L&zظN]noy'-V~M^1/q=cA6 {WTm0gel#،E g;a 2YFc7j E,m|Qz"2FAc4q2=56j7; u`a``/KDI'RDC(7;Uc} l)RzD޶7 /̎!"?n^/`=E̜Uw1/bc Y$g/#f 7`kWLu xTD6W2m۰Q;0ŵb6"0sxN82s6u"6 76j^QuzLU3gcR]"AZ}4Q, 9L6NƔ،r_4j`(nYL-/XID63a5w}o0Y艌/ e'B4&\Õe? oT6OؑYҊGK-5 r fiPf8-3]ojcA"T{,[l_*Y|N˵S&c@iq6 ?_ 3}t,9BvZػa֐4 OQկêX"^GUfTptgM Q.Y@ u= Dn9\HKG?xMU'Ȣ_ X13Y}pl h$w| 3-p:lcjݰ!Cd<$S{4P`?Q]|6ER>mCt&*c9`$oI3gr}g2Q{tVBثkV$xX<t@&TT~Aʨܱ3=3@:!ϜK9C( >{X|R=0K3a 㱸E?%ץLճ;(*Ҩu(V@'77De eFkX`=5gJrwFGa>1@ImL^W:ˑ/>oA9\9.佷At& h=Ire~gßF)erH cj&/`댼;`**qB΃]/qG7J?;%yg^ &vѝ7(+,76ZV"7t5;[U;wm(^ɛ:Ú&i`&2ybd@͗0k{+9u^3Qd u?*9g5?qGm {3G1%Laotzf*e*iF;/wy7$m,G2doB!*Z(SsM7mPg??GVu?+y+Jc)= xޟl//'aJeQwrQ4V榥TV&vD _w]9ڔATɛY$!5ۈj? [uo 'YFb4EZ"PD)"F,[Eu遅Nxu"󦔰(ml&jb23S9AQ.&j&:GIbߩuT*,٠ b Qsz`JYĎ7ʬc1zX#ڿVU_mP(lYE$VGuL u8.oxa}1{ÜU,ђ؇fyp(UQЇ%-Hj#zmu >i3Qmj9yBC|}Zf䚡p- E<:Ed#̔?Ӣ #l-ZizG[x<'5T~'31 (8V{aq+ymgn"E\׾ ,iEm 6*x<6 6w58NKQG=J篓w|/ri/3VH^oSՏ +"c&}>n=%mA:R"B2[bt8dY!(GnFU;,ͬ3>ڨw boS^b\~WU}F_ӲF~zU諸'En 56lM$ؚ>>GB jX}'ԏg|hQi{yUU_+|RT+g>L-+."'z<5YՕl"r'ձbNF$x;SNzlqNX|aZІ1q܍0s"cd?dI|V1TIfˋkU}At/ zT>ӄAb vW_SUTUGY*¨IrY~ZOG_4Qu52,% ?"N3ﱠƎ#3dB8lv/#?G:J9Θ0NcTu4氨VcPDf|3+H٣W3F~<8[/In}Z+|MY4{W("b 5OF껪 ]4)w䞂-yг̽"3OYM3bM9N7$KWB)3[#I~vȓS&VL/fҼ H2sSa>6y! 6ۮ yQh},+"}_gRm~&%"I$'c d:rjEXE8gf[`=*ljT؜*mfEdaKdd4؃jk ݏ/M#<XDDfhyeiӺ<z&amS!s6. aԙ/v^s";Ȩ|]fsB.33$i׊HAîa{c擮S&Ι7cvw.:UU !6TXO?w3ituUW[E"RˠA)jH0ڬ;RX?~E&L#0MDE1{:鵬K.`Y?UMA1q $ WI3R.ұC?ןPs1wc~A;2%&=9j?*s^2ϴpYPwd3 2ig`T iJKg0nD=ۍNtN8Nefw\dg鰤ת2/&8@8XDN\&KDB('CmS*zl4,Ǟ:,d )"QՊNj5XVJݘdavh W2H= rN,N慲0Qbl.B6"YblƖj֛9ҾJ='xڒp f&WR;s'"+mǦJ5/J.<0L+9NT tFu9e]\JzRReh>)uȳ'JË0/5= "4OU?U}8 8ID,GTRD>WՖj*bZa^7 U&"7aXhgKXm8VJV;݀yqwckS ) y]IIQ2Ϩj{X;^`NxWM{sM@ n܈N Uuz x"x{FRqt#e%Os3xw&k8(&TuXڎZ,\)NUGDUGј u8-G.#d9/jµxX~RG4{&D) x<Z7XAypv1.!"YKtLuBt6ڈV[xvPm&puUs?1'2WNSյU1q*d#":2^ YBwYZ޳cUA_7TQ35] Z9u'`>aԞRF$Bq9]U=Sz<}q@Ha6 dsU}*-vW;RSspun!Ol^QyC.&ۛ-("YɘfKQVq*3s0 _?g?3EdY-oXuV;k@>Ci,JYs6ٸnGD ץdw=fI&w"$6[\B-AsNcP4g8L^˅iֶJiP9W'ٮ1̓_XHmS]]AkGgYOiS YDže9&P}{铕QDN%CjU_]iY72ۘ=gJUMv-exgOCgxA$L^M$7hB 9 k6;Mo.XC-S߁Bz @o?"暀h?^5gQ^0 揢y`?o<gSjr~BNS3(u7lMqBmd4ȕl4|FwrϏU4@j+Xׁ%@XWtdҘ_4y*͔ p` ::P)9c60xND6 BDl fkeqJv9eMK;Ed uǴS5`Ddp"9 U}`LG967U.i8U}z/ K02Eb@0ZՎJOÔlCqL[O]NU!Kcww(4A^[DrBA܏kߧ4m=fk2 xOӲNQ)\, Mz5 [3ҷ" :>9h{Ԩ GHo,$İes(Ӱ2j{ jghkIOcWg'l>.wPN21sqբQ?_v#*OLѱ=2FOIS;akP &<ކ}@ yzݱ]9%ӌf^otM7F̔su`{ WQgy6q;p Ov3HIt졤ܗIQ&jK`Ẻ廬A_kgp@%}iA{w'uzey{<-L?wń{p7uULtE.yU#+˱I~m7Gۀc1XǶw P:hPC~Ak_0 zԞQPW(ߩB8=*N2V4hfB޺<2,sDT&˥*u%,l:>5 1-a 9bB^us NbJUꝉ͎WE9냤FC>ؚ̆}0:O&5mm G u5aOr}m&'J˶5b:Är>,Sv$.zޒvOyL0TζNy}GeY &LQ?!Fu/BQJc2rC)~ו-+| 2Pי9rH "cTUmB`n3lo,1S˵ L$Dd^4]iH/lhZ0QޅjLP3*7sZ1mG_4TGVB' rd#C%BSCYɳxFo;bڕE0-uz[:*/^Lk1 -7o=`pm[(w>08l4 ߫º/TJCy)zކrK/h5϶(ZJĬܶ֓N>/h+W0F=?FcqI\ϹFk=Iv[@i-^2:'"[`x}t`3UwkTC0uk%^,h+.Pݵv[qq>M̴HUBǙ#\=KbJ?[ nX~O3 fmKg/fp=o=fqqTd{\փIDATsڥ&/„+4Tq%NTש:;wds}t܂>-ԍUӁUF883'!"]Q (_`}UmIp+M<ʜ˃-d hh@]'c Rbqkni~PpvqqEy*=w[88̝&ODƩ2mnoL;X #Hଶ5'"_b1>Zom888s'm&},(GDL2ho, h?0,H^o%Ivg1eM$|_euY^i88NkhK!o$E/GU[0{F'1_ooKL`QUm9Ӿa168TUoj8e۲?8&ODz%)k U:8 87#CYf]Go s6ũؒvqqjȪ"r%ZogKz x"c=})o5Mq :PU{j/`'?:p>88-.Bt[WB;Ȓ|:ZUGEfm` %:]>_vzbϰ0 K lq!"Ȕ(u^q:"rWl<8z웈E@DV{\P oֳ&UUPPC#B08SN8NBqA5㙭iX݂PjDd x sl:p3WoOD:G`YFq>U888<JDY+: p/&lR0[uE%ӀU`U}5mU`v̻Ԟ888NDdyx,"Kh,&\2U)"9XD\,Z믑70y`^VQ/ܮ888Nn y"(0X/޿;l0hР"r8mԛSvJD'mÓKeTU0o9mEy\D,Sױ@+MCvvDh@Ho " HVz-"tm"2_-TH׶"]Di>P&uy*`-#~qik?9CUǔ "aNM68-p%pI#ƘJ[ !C]c9Y8 O4$"_c1-M v,~Ŷ`| < VknEdE ``yd|M]" yk=!"cCUuZF3Ed:WU"`K'WU}-y&u/11?xU}zAy {CUGTgy2G!BW}@7@E3lT c=w zWȷ0Z;w0UZnV TI0w3J=f<..")֒~;U%Y:aL,`:l0-0uT]b%zC<_ӁӲJ ⋌OhT,aLN U˓m,g`?"^Cs⤮0aO+I+cqʜ8 ߃k:V!)F}sh.T= ks(m *ز3lO,~D"tGu.$69|7/$hQr 0f3xi;6i_-sٗ҉÷5 Kx1L`9L)l 8ω'O<$aU֚w'w%6Fb 8n X଼O`G_6ZkСC7n3]v٥p}̆YU\U'iF^D>8oDOY* \W%G]E3904YolzEUQ/X V&_̥`^7YDḏL+U_aJe4v5kh sޒDUgb_Ĝԛ&Ϫu%qABA)?^x^zqG6˷ꪫr=/;гgOoﰙTUӨJ<} sq7k,̆2?Ot`Y[Xv<\xBU'T+\GDBl_Sj^5m]U<ZGDVz`}~kPWDGѮ/)BU`zoqQ6UսU4٘9i̒C4GZU}[XqӤy p LPp t VXoW^yv+?lwiY@f.51 dutP)Dv"M *N:$z|v",O?ͩ <]'n@tTu5B\D9G?U_E%E$pєlU9˗#Ss]"N5bҾaQtzI-&T"[#=?yҏjhiɄ:rk8ӡ\fYwλˀ6 x?c-"]jpHR4%b#5;i[PDzQ:!UNI. ZHJzk8ΜMJ?lbRٓ!C0vX L{>89y'BTp""g`Sċ.9\WU,q~/"&%-5''SZ7`=0.ٮ'jֲGK=~yg;:i~~'8,!y?xƎ˙g9J3p@ύ7߬ly1HD;SS)u5=]ފǙQՙz/fPWIiPE&GM"2oH2K$HO%uU ciywλSF\BK5~$=ZGhVkȴ:y˭u4򂳂 K.K/>}9Yn>}:\p3f3r)y댏g>KKy+vc#""RTw~_g*Xg)k2 =4ެObB嘝V,"ϊFD*M֗kHE幌z>Ҹx7 QocZ]ٙH=6yK󦿑n>q[6`%?s D+6c̘1~7xc6d}9$"v +``Q +sgdML:gt퍌<$۵8^,_SCsѮuEd&_Dv ZbqWէu>}F9SXfeK<9udf{'ju<\#2UURǙ[9)0x1͠OR:s!"{͗U?9X 'O'hWЩcZKOe`]ZD:cCM򞍙8!}>#j纬u٪9D3$+k?k Qf0)8usܹo'V*h Wx⤫9DŽX("b>8zTjr{GcZkeO^x?\S!ج{!e4@_Ul\5{@n;$ǹ^&oWLS{cO~^&'GyZ͒~.:vlFv!sbvL)[K7sFý}/=`vF=()GoEelyTijM9KrQ梤e4_'L=9G'e6J*:o'>xiKZ})E0y qbYgf3'RUp.p6k8\< Ħc˱x6@??U5֎u/ oop`6^BŬ۫iv)5 uUݟ Dd0)h^ y[c*fRXy?&=P?͓7椤;8⺴Z%䂈ǪJmEDvh.&?`\{ CjkPvH;0::U4vb'RԊ=CűaX%EM[wF\@q,.j`gJ%WsrSWlRM|M\Maekɢ4qT؇'FVU3fwܡ=z &~4nד'O/aB +̄+SQO,>Uꝁ WPrqd>m1X.5\.`xbƼYﺔjFU:VLڪi@λ&HTw6HxBW;1ᾙ2kќϠb{ gODeYfTwTsY.TY̨{;lb\c NFT{xF'O<&/*MyL6tS;0N?t~{ jqr#"kb30K?,NV-:l% 4>1dlHCU*uDXlߨ*u %4u\k}B93&DG&iyG+9Y w }ZHzVĴ<:+aa&b15?|?,^[zݱ{2xxLU'U a&ճ'hӰ%YOU_ eT[Um6i8&&??u/iWĞo{.4_no;qy?S{ T:888DTu"t_.9884Wn ӱE̕xnfgUn:888y+ޓR/e&`Nm888:r y2tQi"2KrY98885Q-Iz:94s-~"888l#,^13ΕTujqqqRf"TuF888㴂)X-IENDB`PK 87Q%Q%-Pictures/100002010000045500000332A5C6A400.pngPNG  IHDRU25sBIT|d pHYs.#.#x?vtEXtSoftwarewww.inkscape.org< IDATxwU'!B'#7J E" ,RD"ҕ"DQz ]K-B$3K6woyI޽3g{=ETqqq'<sUV8N癡 8NOED^T/:OYKYqq!"%NAdqۦ))A<I$"$W`DUSj9"2p# $pNr8 Dp(p40SwTN8S^oT6*".Ww;@DF <8MD)Ѭ$u~  qu 8 DdU*yl۬8=9UDdsNQ"0^y'T6Dd*kqqއ  rF*CDdZcQ9=^OFf"]U 9Sn?"p_ti'Xp8vD?XmU}8XAQv@8USF8NӃQP@#V X*0 fQv^Uϸ4B-Zf^SqrڨSV7 ;TJ7$ 6GH,fsUM.ɿIfUvN l\ \!"=9崎mmoPw;7c1itq,cP[ۨ8N%UV%61p͜&ܞ{yi zpjZplF86Tu<֟9Ǎ*-FUGaoEV8=91Tu2V- n,ꪚfl5ΘUqq^%x M4🞀CK#""dkGU'$t^\i=q齨];8NJ x=>Ftqqqq$nTi&m]qqq)UCMo888ƍ*& E qqqqJF~D[4qqqq^|a_.J9|-q+uh fOdyMUzNـ%űa 6RK0&-y 77TN)DD9,vDdF\-&0 x)y_GŮaJ7] vΞnVʿ"2n}w'aﰱ7w\lq,,KUGvR/ ȼ5뗏FjEW#"3`<)}LƌQQqF2su>lŎEd`3``K`&? ܔ,Ыn[aƥ'JJ!|9U}YU̱r*>T;szWUɲupoLD.MDj.gwJt G">p p>>#0,?P;snRDdv`c``U``&+UjYY X>fOK),MLUɹ\ȬFu\ 5}yW 27𵜛Ț9Y6*;x,YN(b$MV+"a<ܪZ8 3o4ppޘsaZO#("ʱoc+H+ufwm`!O?IDfp SDd#/rCR!|i3F6Y2ސc$}ñy"|]#ZO+Q/}y\ZOɍN pI[h֎OOZϙɾc@py a !㾇9oUfo@ Ⱥ'1W@ 2.*p_< 8`b|&py&|xc;A od ,U1 .r_/*kQW r9ulX`]Abu5#v`O(y6[ibt^!=8*EМ^PL"aȾ sg{M|$"stYNb .٪rŀ Я*fD\* ~>}m{Ed)r~{<"MoC'E$Ī>b/];DN "r&0҆0(@Kwr{P?9N*S{ء݊8$D`y{zLYDDnČ̿V@`olL 9N%xO{YI{%.}IGd*1X^YIzpyV^QRǣ_?B9^`JNYEpmWK8 NLy%[)7\'"꽕(f QA<sU[T/p|kU4_HǓunX8XWD.5{/f3 H =f޿Z{4iVL7AXhz :?/lo3Iޔh3&"f 4,žaUR8+ 9HUjH 7$L sjZQ8o'">rD wȊڂP2b㟑X_a,nM58SD9S8NոQl֤;H/¼?Ҹ WS.O\y,ܪzFA'ݠ2Dr/%:FDx8:+ZSVdO'ca i|H&}+c!c,yz *`hl076_6 EdUCnc!$,bƏ,ut , v/ #F:@sXN5"2'euEd3[F#!Y{7 *_`ˁR0o}OD&! /a3Gpһ0հ*7ZY| 3["yQFgf^콴&2#"aߢ4ac&^gc99GD] L lHDL1-||fg O{j9ͱnY&2b7`µegɤ0#}Ydaƿw:o%سZq2,Fu q<@vS7Lֿ%p3%fnOt=MލjXbuvRr '?Bs`X @ sed56@ V@E0FYP Ix>_ ͩrhEM_9U"1=0 "oul#v@%$ Q,u~„dSRG3M,N:MUߢsh:j? QX}_ = R@f6MwTKD%VhNGrghY3`^!y]3~3 ݟ;T?j9]J^ɵcIZM )J@'f1@j?P] :}OG+ K4۫xN6 "vN.`HGױيTIyqɿfOU}lF=ĦI z/x(z}cI3"X[Q'.!kz6rf,qYed3fෘ7e#s!@NqJ 5uE8p|E:w5Tu8yvNnfae,.F!p>鳣(u)k؇iUk΄ɽ*C(x9>yE)n<} =1:ɯ I<bȷ%S]os#blɿϐ?}@VaX4WմN&A %݄1Оy hL!2*Zd:U(G2pm"qdcvlh/,<;Ypn`D>^#$Ch"@)RUqJFHJ7%"A"2K֕ct$Ld(Vm,8Eh$){ί;\Uv j?"mE=Uv!\b"Sfu cIzkd7(+ÌBQ ZʖgFTu ġEJaIgf%^*1Mk4*iXUsA`<<e.ȶ?%}/';g+!-W,5<qڎW dX%{i/_˅4"mt7l38w2|\ӼTħM@ WSڥO([d6I3TP"mL"e 3m|YP_.ĥ\U TDmWk } Ӊ;3w͔ueWU[p_oݤO,o-ʼ}JTEy2LDr@QYҽOJ]j4r8Wbn|foL%.P2=g*?ȓP/fTy1,r#Hޕ`3l:sTX^>:Μ,ͮclt.®eyl&ľjhcɛl] }U=55@ZEỲ Հ~z.M'@?% <U|{TOoLhō*NGpJ dyXDòdi&Y/P X*J0kc%cy=CDI?[r!"KO$Ք)TZ)(=WUUޭX^5xe,t- < yfn{U9oPv5JU;va~[e3TTUEd,鹢ea@Mjd;BK`9x!tY T0*42Xi,%9rڌêXX.Ҳw*ГWnT3z*Cj N&=h{"F KU[b[./b%-,{4z[ XvSnTi%Mcn%v ES[Ed9pl0omAr: YA63=3{^zY3 #P4ه-KD| Q9MH+H!c.S%tyRo=d:{GUOD|KIT>~ԭ7N{]_kF6766JXj5U 3ǧO 6 q"񂼘A%`WUwrFôUe]4$~^YPv[I*ܒ$j͐lE>K?h`I^U Q`PՇڨO7P5nNV+U&ۨ]yx{狪zvqzWnT3zLcTaZ/XkmۓbTaJTQz PUlVZ<`9x)dEhfT UѨg:\Uk(v=;LZzsqVUQB-$1ΈHI.ɍ>L8"R%شOWGH}CB$j-WӵQ}N<ࠤF^b Tu +b~rq$?Uv)LC,"ҬJ9u`( :'͝ HM8Y},O"`'TŌC! Q< V7`;= 7 U8% u'!&""ȃ mEl!"2n*7ëh? "O7UqZO,j? rZM,TYT'0_Udz*dױ8!^Zyw(")fKN%D'JN?poMWVN*TI1ޱ2E Xay'Cw-[T~Jܳ X"[**k:V )c9)2RZ6;'U/U$Q=|x+3XUnh7wk`.J9 i!@۶UМ$cEdy6={Ҭ2iUߘǥ7U8- `2''DV9f$!JiyJ|t-N=OEުp?~XbeM4۪^>=ؽ41MWVP8GTVTU)+&"R!.*ŤTهi+Yn( +žPRI 'a!P ~!<0GɌedt'"m_/+\DvQv'" {FVsƁv:n\6jk*p]yf+\ZGlR]k̳~Cz$Չ9-"(yPU(,`W.FO od}MRtUڌΈ2'4 Hi:!մ ~Wr~:4ŪznqI_Y%gm럑|Ae5=/*pY%2 R>~/ 6)S&1n׺~:4Ox;@yHo֦Ox"wU$mȰZZ~!^I r҉Mn"y/<1ܨN&xD"zZ7DY2~>ИlqpvA ".s%@K*> &u|D8>x1"""Sf'ԭLĢ&ٔ g{kRD$ʁ NyUKFD֧XBU h8ʇ1mΥT6ddoרu4 U}nxtcOgWSz҃7)7p-H8eqJPձ  SlpC,iN%rSgPٲiUUBh"'>2c$x?T ݩU}C 2W1DmUxD$[yoL _8IDϳlM<ϿT5{zYxldȒPk0yGU$t_Uuf"X43 UB*z19"2x 3)=o$ƣ("OD~ Ô6'=Lv*DD0j/3d4LH}J3Abj!\G{C誾ݍEOE]Dfs;t+qcX@=vSߓ1Fog<6s/s=xo%F={|u1 WICE?"e߿~Kzk4.W^{LD~j~F+"r,L&"'W0sLj^1ƪ+Ԃŀ#ۏW l?֡ K&{tz5Yg5_@ƜX*I>Vto˳oM*'EVf$93D˿P`~,.$NCcL\LN3 汵( 극T9Y4A:=} gne~XChﭘp ,)"ط䅆K{gOrb˰\}~%Wۆ&[d9N߯|jgrL;c4\CHwF=#rޞ@\!Ǔ>[c(}폽?JY)|ҖW%[7q.6I:3ê۰ϰyS~}KhlʂXݼUsc&d} lf_C?,x'r㱎jm?zmhQ7-,nT /*~`Ǖ/҉ܮ3$z Qkr-{v|d1'hQYDU}WU7E<̳e`Ul1`9Ut3$@8XX\zXⰐ{jǓ:U{[Qp`m]> BrvS=4[9EU?Wc yZNOb¡ cV;jcZTu#΀yy,A4~Q݊^J<@,Nz_F} sF$aiFUG`UCN,2=|SUtT*1&+Obôhqz{C0Wڻ[ 7r+#9 ^/"퀹1K y>c>c|%96K  t}aWyo^@zi߭z檖_(93wBa XxyzKC[,KN`Vmf$A7wz~\俾`FU;0#w1cs3>fOUKX>;Țu܁f_`'u"uL<@YU=*M&"_î0]:nVբFS{2TQ*#nθXyU+:IDN±CO'񭲔s,!gkFcĈ5bW 49xz&¯mx>Ks*8 ]mq*B,װA2!Vb,Dx1Y.`exxKf^Jlt3,jAyz3rݠJYr[̂ym *͎`IG7j%y l3v? bv>B_Faʶd8s`kUlW I!vmk0'|f<;{=,oS-Ìy%c} 7"8jM;6! > GN9= "bcb`ߗ1XX֍jUFq"VN@+KUqqs8t"m!{qqqznTq,+~Ln8878tU?ސqqqPq0"=UQg;]9qqq&Qq'κε?DClh^>qqi8~UqqqZUqmXVlh]Y8878cp~*zsQَ8878gtwC ;)`988&DU;8NED.v 4 c#2c6 :0TU_.bD{)M;UTsqq:Wq)o_ȫa l=0Vw;U֪T `,,Z^qqQq'E؀xC@L<|8VU'qqqFqI؛Ed1;XZ%ĎNPk888N'*89zwRb x]`"0xRU'Ymqqq*ƍ*8$uZqqqZUqqqq Ч 8888t#nTqqqq)Uqqqq FqqqqQqqqqnTqqqq)Uqqqq FqqqqQqqqqnTqqqq)Uqqqq FqqqqQqqqqnTqqqq)Uqqqq FqqqqQqqqq3tZǩ  ()𞪎nNFDd>*}qqDd~`HFcJ97{OUo>y97{WU_l>NyDU;FD6f p/p%|HIeU]U88ȁsnv }z "*hnTa'"86.õ}+q*NW""Kۑ`f̚C`i=3 ׀/*"pBTm8~Rb88?gd$9JUZY 3ԸGDvTշ;ƍ*NWT$cvY9`< =M3r C^etwz4g3-huqq=k/yMU/ZN{x H ~u) \52DU'g5u=7089UADļJ*1Dd ϩ҃qOUu|hCU}, yXm&_p8tFb_;|~N}""ۓ>yWUnf|NЬ *NWx *5T%*`Bl8Nds̰+3Kˡ> TnTQՉ"2 X((78]DȻmq*$cqz~~\CCX<}488㴂X咶i8h{Rq78G8pwVAUoc쮞qqp4pcl.SU} VPUk8#"}ucR7#EXT L9~x._)USz!"0eП) ߪE4ND?ZXs[sADHmƩ1?|WkAD \Юll lup RU(97;GUm~f\ :1DdiJӠfȚwqP$"{TU[AD6)UًaXQ{(%"fd JU.؀6G"r%p>rڌ YE~MSrUٰ߭s>sȂt6Xr=ƉMXyNZN!"aadnLb[UhGDdՏoԑ㐜y͞QsȆ{q{FEX+納ɀX^UU(l(Ŭ+4ʫz:e+_p<0G =(a 2^, Vؒרҷn_[ pRz^'cWTOJ\ՁJ$-fy.`}Ks$[lFgg"px ux"}Gd1n{~Y{X ?hwKNx ި}Ɩ;N(oA6%IM[l[98y; ú)=+gfe6Y "?H/W!𨈬Wb@DNP ftIUg-+aI7 0tІ{V7u]Wՙ1#,rFf\MVzvFb7~'"GWL.0uTud1s1/FcB # 4þ_@U=1V1pbFuj&f .)"ߩP IDATH^Obܽpu;oN}?BB!&a],[!o0cżt&46`z^r5ZOMo心a / ?`gbpUȐuچ`ic4k:XDN}7n!fXmF<1e[#HAD\}Ӭ?R3Y{`B jXHpb`-` jVɘz>;AXXG"GrZ2GL$Vڴ2on"_U\2Hq>CUbDD R/k#"czbPG]5CҿUEum""6vRj:qUuWq {s/aFwCl]16 Wwbޘi\Ĵ}fUuX}<^jmиcl}Xؗ)N`LI7j^ebV xW1kL f[x, ,W6 0! XNy3`U&0Q',OUďcNح<9U^#>|`anOfNy3`Zc?AHdȡP'oqX 0 flF_ Hs t =W%=BfWtݨF=lf*wn,7Iis+L6J[/ 󔈼3K޳_fd? * sd4~:`:R`&6 L9UA_ѐg ̌yh`ۣ}<^zʩMd_K~ f ?<?6( f d;3 lD^,C}Qܲ'?G%s[3nնS+EUj46Ȝx"ߗ:KJVA04MJ3Z+>9ƒux]mTIdn@XxN( oA3F!'dbwQeL y}1pY dnWBf?,zVUj$ f➈W"z{bABԡo{hv.X9P9ED,)-`ࢼUhK cᚮ9GKS+{֑jdą5"fp^CnڽqpO1wR ~= e:.*6 ݲ楚yIxSfr̘OD;pQ cg*7`Ԋ{U}jhOr9 <, §AU~h4~,H͐> Zh ƌ#͏n`E 苕؞= :|+GB?Ӄ(bT2KU/,X.EIUr I@sY都|t32!e1w,bUDk&$uLO( M7rhMbuDV6)h•V:P'?7ƵeLu#}XK2X͘'­&n,tNw(1@U"u! C|pe1̲yk9yyaa2 ] 4B8rCs%IxojI!"N\ˣRQxpU}\0CGEV41BU/:]J2'#6H$_FB?lUKDZiI' sGOc>X$YeLy<lK U|F2WJǼz)cJ-Jt^SlS^BX(9lP~UoyfI[/Ӑ#F,^Y.,"u|NTsr ^L4P;WxŪxLYjr?S7rUϹ.HN3+IP 1Ocz?lEzR]0c=+)> w` ms bِKzH,4S5gݱ)G9oNz5g3uGKH۟+V'Eg>Sz#` @KxtX eEUYA9@, \Y +%,p'#o^ YbY7b$P(WD$Tk*Ddcn_Ps\+5= P՛UuHZ)* wֆe }I3V`@P~ #"Up;\VtCU%NciI&֛MWY+*Id]JQJY#m74vgy1bK HZM2<^vLب2sPZ~e&OcFdY8a+)4X(JӸěe*uzH<޺zlj.ERTBBL$=2ϙdck_g5^?kR'5PD7_xBj{>2n \ƠZ*q*ZJWRFpm3]FV5o;mĚylgͼe"MU2\?ڴ %7HRNYlviӨl&-5߰ ̽_yMk7fkWD73ϟS3o爸~t؉hm2uߥy8T.{} ?Uv},3Z{g)Y3$ɶۣ0]Msdp+&тIKiReI+k *5ȝzyIDڽhw6Z" Mt 3όwx˓"⫔ S_XnTu'm.w}J2eXRx3򈸈2LM)Cnjh=s6k{9g?`8R m\'Ucyn;>K5v1q[~!TDlN 7ژ᭭wgR~;\A}W&렜t!"n Pi'skӬwyE51]IRQ -_('kԼ]u/w0J?}?\+Ǵ |󚷴U~ΰQ@V5Zww1Ix$nS ׺ ~!xLnH7q4p\fպM)yOݱʥѱ%nO}ReXQʶU3 EQjݝj{?,;_60||W'ːӸOjㆩEݹg7TJ[} 6ha9.ESº}Ra<" ,hd!細O΢sw^61l}}XDuU]2O@AT;{$&""3gP"[/y%ʈ 0oPwO|1 Q<+"a\%UA\0jGł$"x rhBv a]ֹZbM kg*`4dE[͸5\  m|m}F?F(u''RiFm2m}bUMNi1&?pjn&kr33+(:*a5<0Ik],g+H ~^Ii2qbf^gNZa'6u{¦RPmێ,Q F,ARh@`J-&E <"^ Ke1nݟxXrX*dp+ĕQ9PqWLQr+Tr?VOK˙d*u}׎Dz2Dĉ Nl 6v7I-~02g rD?ȇPx|f~z$3<%"^sǚyg,iEӁLP\`gd%%5ob?e$"Nқ̻rgf (>R [k]c6 YJÎKqdg][$WvxMmmm,!s϶׍ohLf!C+/ם,"nL}ymP7ynfED#[nM oiCvpM(ŁA]+ɘUWA{EDonQ3~v눱,aɶ[MAN~2(pm`?|Z{-ނU*-^Khԝ{nU/\@l*Րu'55ly&U >p,Wdf9"3 |f1GDM/Ƣ`c:,f-:m5Ef -ZPD\ؾ-MlKҕvMf-TξeϚ'S:cgVʻTu ;u5i7A@r9f޽hm_ͼ 2?K}dq=uC&oKif_-bwoj޲OkZ\Rl3ZwCzT ɺfmv}zu#u "˚XX-N]אEĝ"yT#KuEهu[(`Ԩ]&]KܮEuc>Gj)T,sOʑ ={뙴xtfm{fg]5%3 |-Kq߯ϴ3s!'wذaL=l[&FݝaP:w^WymwhJq, yK]{hi_x{Dܟ}|a뒓r.5NӶϚoִ ZVܻ|o[vGۍ:w1?C-ÿPcU7HeifD*њD-26>G-"?3OZ؃#ދ-5!"nܧϬ$ِ.I{,v9cǚy;hG dvVuTmk?91C L6Bi66 OV7|z!?1`Z'˨0`D%"^6qc%ur|u'YF\*e~qۈؽϩ;?n gj-~\}GLj>P3v[ q_f-L$U*u'lޫjjU[faI}dk\[a-'eUW޿uDNum#bv U !lF\^+3yKyD׻Zϸ|yZ,J)}fb% 5_W,f4]4a8x1ˏ[QNԑy)Z"3Wa3I#b~"ddq׍wؑE\3`Nbϴef =}vfש}KYx? d`U}mWdZlt~:`ރ[hB}pfv9j2rʺZ,¹\2p&Tb5oyhD,E;/ձIT^ /FwC;xkNL^3)'U$3ϧRbξ&U-E0{g=M;j-ql̬ky̛k&bݱ(&ˮ̽Q`yb[&DĞ Yvs #≣ruu猞l0h .?ƚ 6XS<a[Ou%-dqͼmZ^A3jٚ<&"uðZ.bV)/.2_h 6"bp"g';fpˎYL}IV@Gm/3{J|hm/~k,Գ)I.4*$Ԧ-k2EUy!80_foU74"__Y=#/̱ .s]DD]ad}%o2`\3/B۟-WZ`I'g̓3պ2"N)دP Fm}^x,P> rB9%otрuU̿Fċp[XoZ=U%K8w?|?j,ԓG3~UC) &71t(-I^O9rw x.z]qfwsW aZIo[PA;iy 2MS#Q0̛#pvN|j^yk?WDЯfPU"bGw9Mk~1K%EBrc+NJWA]nx *u g ix*墻9c#~-s-V{_{` PeMպVfwDlEΊgwS/I9+Ow&AfZ?š/G;WWnZ`>Rf~JZU_mAjo~ Ț6=V |b˸΀zϲ :Θ _7-|ޕЫ(IS.F^Byj}k_TS(rLsE~ϲ#?D1hyRSjOֳ~չ%ǹ/rܼ{=e9ܻ>n8jq}/y˾e׼eT^侔6ÖKG)ʾEB`j1kV|$0I곷lr_/ۤJcRew3֤JkQ.矬.qpם)ͱ/]z;uI*?)Jm;(rg׫s8XT޳.b~Ңf)ևgRh8ĺ3%!V+)Ji)U,"ѷ'9UàY>O9~ݵTYR닋\ܟ)r4at݅mrLҚ~_jIPV²ϭY?%3T#CɭgB O?g=zwÇF+бXD }(BRCg2K*U-Qb݇mRZ vt؏K9"EԖj܌5s.Խ_*1mQaN\,߉uRc?q?J6 r`_67 7r|pRIe>twqQut |0'jyΞQܖ}Mfg[QZbQU?1>ne}ؒUFHX8 8o.=;ק$/>=]֥$wev4XD|ӦJV܁R#=>1j;Q.Goͭ?̺JBF|q]J2sX̼ǩJܒUuS1jbQ-*=ؿ5e0wyQ6No&U$I$I"I$ITLH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$I:] IR"bc7FĦ}33i'2I$M̮c$3q phK˒$I҄$I$IR&U$I$I$i;e]r$I4"I$IԀ$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$IX]MCer\u Ҭ݀uEQeoB%2$"n<x4cH <;3u , m;GeޔgvfT$U"bk:EIQ\u ,g:i1aZj *$M':iT]~^u2plJD xTqH<-CAH@a*@$a^AH3 @Z:͆iHlu$i :I.Mʒ$I2'ĮV=Bͤ$I4~1%6 $I$I&,TY \u$̀@$iRR|RAH4"b+$Iv$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$IԀII$ILH$I$5`RE$I$*$I$I T$I$Ij$I$IR&U$I$I0"I$I:] I$ivEz+3seHRLS%uXfsi -IԭTϷ++ߩg{>'iژTђM]*i2تz>nED\ znEyU %Iyߋ7yzW?_ߥ$X>/Q*jMDl Y=n =_ضz R,~AJ$͒Xx Ͳ9TϗTR/wm [=_|4IʤY=S Yd LGDEIIIĖ-$IE77&] |43[b_-k;^U_E2*ID<x B\\\=W|:utc힟ץfc+6&=VDX՚LL$i/^^|xSf2BB.T;-OVTPUGPir!p2ysi9wЌ*15k&[vVٮfPj _;Pl< xlDxGf^JR&U4PDl |^f^6ZUu9zn 'Zn˪*w[E.C*HiRZ[MzSfr\_ur@JݕOGI 2q#IsL">sdؘUIӫUޛܛҢeuUWWTC%YNoJ$c/gUB|GAT砯#w/˻MdREsC! xLޗg\jq@Dl ܇`*ڐR~",I&ZDk*2`psGģ3G]'iXȨ(aLJ K77sBe̼832s;Jgݔ"x$IZXS࿺huy `'q`XIe*"6Q۴gA66+ϺUf~(3 lIFb@SFU%xlD"IԅSF\ Ww2|;eu_: N3 En̛uo]r8)"a!I"b{M(_]4)]W#bN4sL,2J9 ;3/&*d湙܍R`>o]'p8%?"$I3( _8F27=7U |?"nYPfIe "^M1j?35GUmyg`;E;,9ONs#⠈bJTuyJ̜25"O9pjDܥ$ *3."C1J࡙Beo21R%Oޔ+?GĆS$Mn}X!WQF[X9ĊQT=s3+:G?e2sJ{-#D"bq)I&])V8CV/Ů@F`ReD{LzOfQ8 yJf>z@֬rCH$IZ^̿uɘean>kI aReFDkz&fk{fR1{G"bq(I:3T?d{W/X1"Ipʅf"3?wR_ۍ9DIԾngwz#: G҄22"z#2̫2ܕ}m[2"m$Ij]1iU/C: G22Je' D+3n|X3{]yئ%IҢl_=T'3ԗxmD"2IgRez]t4<+34޼ٷ_[?:I-*J񵀏G#iLLIv@f{~=oވ$i1y5%fg-\+-&UWoR n \3kyX$IZ&*Wt߳pF$i\LLޤ]42|#>`EMw?u$Iˀ-UZ^P|dDe<ä20o#䈸$iTiIf~H-fIeRE3)38s="vI4TO;  u%dRezTL;〟G#b.$iREyp KҴ22Lhe< 9_zfo ED<$IkW+;bdEQnۈ$-*ӫb໤C(ɕ3{kS񥈸iI4Y=oi3&3O^Y|fDe-[f?ID,"wl$M]jm FRLLޤ֝E!u 3{.陵!f{'I4}*4 <"k0iAO/*Z2X%hPDlIp$M˫g[,̼x\e/Vu 4LL޻[uԱ̼,3 qϬ$8I-UXf~ 8zڈ[HjIReAgH 3OZy)ptD|#"v$8I&I882#z#&U^H^f̷N7>ڈXI4,T;y5(n#*ˤ4@f^>ppVDܫ$I@s5Ul2󫗏t3222ʞI&Uy2x{=vNF'I䰥eGOU/GTn$ wN7 BOt$MkӁ (vMI֛Tٮ()U͜|rDܸ$I_g[oIf x,n#ԔIv^& f-͛_$-C7:d^w2I͘TnyWe&3~3kS˟֊$izF]  |$"6I22z*kaki$yf$"sQI4vMgQ,Cy%pmWtQTb3ҞI{v4BO.陵9p|Dv$IK/3`U]*c?^2"ne3^WHMf|gzaوش$IZ-U&/M*螟<@(3݁ w&2Id "bN#ѿeJ@wi@VcRedX5HDfž'GK$IPVV?ZeT-b־5"62IT=kJԍ@.qN$i̼U7謫2y^F9ƎcT12{z**i̿fCzw})݁Md$ @*Z3"]#02c2i=$u,3݁H4AhN{RL̦*m:Dy*;L^x pBDܰ$IZI V}h흁v$*X`EZ"Ruz(bV@JwL 4h훭&uˤ [~g#b⑴|7pA'F+#}$+?fU.Q)EkoXeuX7U ֔Q}g/8r$ @gW/ML̼UEk2i9322z&$"*Ik2s?Ehy7ISg*CkulTmoy[1]"i<;t Ԉػ$IH&U&Xf^VDܯxʤl /u5i2e;陼)edJL%Un;tjeeύnUC6‘4DUd=ע$t$i9{U&߁!o 3y}#qhDMd7Tص@`oHc *{>@$&3 <x ݜ_w$ifeEw.cd_7V/MxTY&2RȞIudz?{f8-"v&2I krN(Xe`Eڔ&Hf~+;DCJ4~P=;̫(EkDL,#=("s(w O왼1وxuDD7IfqfLjضH4O?~~{HˁIլuP/铙gr>u$i\V|.efV/}Gu&U̼xsϤ݁vE|=I)`{n"$͂\ |ziRedw/V/XYgReyzpaDF]#iq2H^qN$͊g*]Ie(3^3^K2}J۟LADܪ$I3`6Sh$#C/- *Tf~ ^Ϥ"b⑴x[`Oߍޝ:}C24%IiP$(e(ҨTO9*3DI"JI Bt}ggw{uy^uZ=/{}u]sʤ$uo[Ǜ V!,K7e"2v7+DĶeRI>z_CWHRee1}퀃K'Gʤ$uX\M}SIP}$H#REbY @f i_\z窬 xT.?CuT liX_GҥH< wczG̈XL*IRxk_"RIdT\< x_8Af<19pADR&$Cz[ꝭkREdׁ4#22O~O(JוJQ;*RIM{3KGEbH̼XYcT3ʤ$ +zҒY4%k.E *؟lLmۀR?1=8/"(Jg׭PkypJ=[TdW4v4z2?ˀ6Nˤ$ 'Gģ&TO}] 2i,U4̼UO HQ9+3HU,|#"-K4~R?xGgU[24 ,U_2R$ܟL$|n=\nD}}vDl\4q*9mZTI+3`XY 8."v,J4zlM2zji ,U4Gy/z$<ؕRߵ\*IҐ9Xxa,j#b͢IT\eϙ}S} ő4y$"r$I"3.nӀ?R}w,RgYh~~6 iez*C"br$ICwxKT=1"V)G*KS h$<xG{ E$ ޹*+ );j; g:REUoS@+iei+{ӟ$Iy +a{Dr%H]d?om@3 E$ jP? ^89*Z stRD,S,sFA"I*E&єd激xGu#,U&ڳSDTI/՘~GD$idf'Kfeu~_Jf^ ֘>U/noLpŊ$v$Xؼp3,U2oT, ˖K%iP2R^$I* 3\[]qy%zY.TQ+yZLp%ieTJsWH2z[ژzpx8 Sݘ8zIഈxFT*kDS&єe)%H]`~981~uDQ*#w5{Imw-@w`I!gӟ ET@f~HcjEXP$I`VX̼ZEKMf*,Iuʃ˥4h/ppcjB$IӯW<."6,D[]Dl4I5K Df^ 1KDS(B2f`;=P$IRe/_C'zYac;nvscxyH ܘz,pZD,Y($zU&QU_J*38."6(JR){k |PIR,h8 },аTe̾lpjH n1PH>[n y'z f"2D#TXP$IniL*I?-@Eģ&QnkM" K_oLmI$̼jiTGGʥ$T\8|+$,UT끟6_(GRc`B$IS38tW?8LzM%K/cL|1^8!"~%Ieڷ̢^P y"WH \ژhD>R}}ADY4҈Xd4K 5"ƒͤ1wS)5[$I<=Ձo)Gq2p'8aزTP̋WS|5"Z#y>S*J4ם=+@Nە"f;Pj(pbDlV.A{4f'Eb"I;(_رp1h K &;KR^RI<811pP82z=_bHcREC+31,pVDW(2~+"^Z*$ށE&Eh2>z},RI*jfNJ9B$ XfC_z*#1RIVf^_V0iDjewXTQ'dfg4Ύ劄T/ئTI̙apwW]M"`Ψ o^\ }pP*3{B$I p~hnzo KuJ}`gߏʤ4Hy DH7FḌ?f=.@;*̼x1pecz#RT)3Oa7>U($i^xI g{ƍ:)3o1Co&whW #IZpy)ն̢ ]wXhi@,U4R2n`kໍGQ+kI%i24#եH׀[VXxv,@XhK_ޘ^'I%i@&o:8"V.F4zXdoT IDAT3qgNi,Xh$e}+S*V\&V͍!HTP8REcRE#+3goL?8/"Z&閙bm@FvH.ſẒ)ZyM58TH? 81xfT`Nۀh iYhle--#b2$Mww׏>S0$iZ&C,jȈXhiYhe%3?77~I%2o6^/-G4oy%Z~V?vF^f^EU\ژ~;ycX*+E WO,D&*RCf], |%"+KRKnL%IC$3DUU:'3P=WE#RE؝ꓑ#J-3$ 3;΢ 4Ki.2`?7Eăʤ'0-?[0$i2CV^FSKߡZxkcz+x\T*3 |1yDlU*$izUKX+UV\24,U̟Qr%2F>\[,Kpk\8Zy-pM=\Kiԇm \ؘޒU_hL PIG-T8e"-̼ 81ň8<"(L\("-F4wy=zXd-""JREZyf x p݀DeIj;S3p$ O7PnY}]Xd,U2P`sf?#)eRIj#3/b4wLSf _wu т ~Q RYH-eӏ.ʤ TI|' gW>d,U)̿ј^8)">Q2{卩F#%ieL}eJ`v@6 p:k//D4oy:z~ ReXh,U>Gބxjkx\d)ՍBIPxZ;΢*K "G&nL?ʤ 2s𿍩 #H-3/NḲy̛CidXH}WP}81pvDY&tpScB9$I }c~*Va"Mb"+td%3>טz~Di$ ̼8~0"V*Ga9*4Y7SF$4w4ƞ"I eh>z:l$RXH,36nlL\/Jd激/7K$[fX̣y0}S gRE̼ؐv`kqM4t> Q0$i~, -Sf\Q^2/*ҀduNzj';T$3onLmK#I̜ n R.WE *eNe?OMh2$As KK$_f^W?+̣S4'*Rm)ō饁Dın_2DuH{(>kFGyO,6> dQh"$5x∘Q,$i2F`zGDlP2W, ̺!?õKfRE݁6>ہv~O*LRs 3"bbI$I dҡEJ%Y,U!2O=j;eIc&)JRW}ՇVR?"6.D0&Zpe}]>"^44E" | 3*Wnl<80"/N/gh]"I0ڧ{ f֏NT: 3<~cz1%n`ҘSGbH\}h'"1%2~zV,TYH7[o<>v}\*Mg "IZhQ8*WWK.uo} ؈jpǁ"b"S9HNfxS=<"v-G>h i,Uˁ Y6.ED 'z_ō)KI?(G\W_NT:*3SSe/ߏG 'my)Iv&`y˅JKuqy1չ*xj37K\҈xޱ@:%3ocn@[Ews+RE#REkGF2餑Sf?(-@1MzyF*W,3&RE!`=IOm 6"^5P56)E4%onV)e\]xju4b2|=UrS㩇'G RtHhJI̼ث/3z u42 `]&jʖO%* $MAf|~)"R2Ϙ\u42Á3#xptRg]BHkC/2,Uy*V5݀+]*-W6$I7輻KCsUβTDf^[3`UV-N$MYf|΁\44*Ҙ#4yʋ+"I\j~yp"v)Mb7L?H IR}0?>"V,gs:REy)7[GEIIU$Uf@fQe<,U$̜tꤧKuG#bGfJI'`zmDV2ψ}/u:RE2s[_O-A,"d"I#"bqFYo\Isߡ:SΎGo&5,U$i\ ,K3j<^X i ,U$Sf'36~2+#bX|餢,U$ie濨W |lJ*$KI $3<xp{WD6%IXH҈̋^u<#RsUI*XV"IwO+$itpW4GXHZhysfx>IO?yD<48+6X IҴ<x0pZD_?!Su̿gNF8?">W"IT딍i?33sV$RK*Ef^6"3j\"Ic(3g:v:RU*,KI*3O;"bꌈX=*4F2Te {giegՁ/3OD7x?#&T1[U*<߼H̼-3ΘqTʫ-W46il"Ic(3C<;SREÌ̭_Mzz-D7a֐zZK$NT%[RER1yv4u_G+-W4d6n<"3],$WKFē˦3HSb"| 3vuS#+RRHBfAu_2?+"S6U'V_-AKIC!3ge1T'IeAz"T+z,U$Id ۀgGJeS 3HSb"id<Xx#Mv}ഈEDt$RET/:'Xz޿jV\S44*R]|x;rڦ oG#bˁ8۾ϙbI$IC'3/^  M5|"be`zxm(ҔXHjyfAUmK6ΌER\!ur,ᕙZa˚Z}M33,U$uBfޗS2Q ˈ1"xH6' "In-o3V7f%HSa"SrreOI/Y86"q76!3U,$ieyڒ!TIyof <x;pä | [D|)"tFx2]z+E)o]?XD|d!d4KId zK!"N8F{)D9x%pz=?Eg JfREHO6΢:'1sW"b5fa2i$I]N>*'׏/C2KI#'3-uLzT[7EĊΨ(л}g f$uP]lD1>vzMfN)*FVf.3w2%:wX}?CmLו#IFzط`Rz۱γT42x4aqen8-"^X՘e/7ny$ibe{zꀈد`S-Uyi46CmΛEߣD<1'3o.F47#u0R?>`/,U$OGWG9}D,9*'"ј1=$MY}WWSNʥ׿f%H`"ie噹j&d }."> 8,"HU>1xSf$I Q@p^D3l =e;??D>ꀣBlYwI$I7y& pxmTQoiڶZ2O*4gÁO>=".wDģU۸٘5]fN&IҴˀ"^OF,Rt$ Tf+3̧R9`I/ Rވxj{/јifV&$ieߨ~~=/xDTշ޽~-3-G'KIjsОT[Etw_Fć"b9N.wtGT$Afl |Kj-aH}e"ISd扙(`/GT?8L>wqEDO`\DD|8X"$Ij'm33# dt &"V pXf^S.*GϥZf\`^aOEĆ;"T=OS*w>$IsgO`OgVT A_} gREIfޔ_́U]5?"☈9"5#-"Vk663ߝs*$I*.3o^H_DxA=.4,U$i2Zfn 3 ^rhD2"f ,􈈈5#ξi9*TPf;3OWQ,[_/ n|GD\D&@X!" 8jtLz1t$IC/3̝zo;+"++"Iu`)!3o/EKIywfou \;_8,`_ඈqD|)"vER_JTQ-5~ܤ꠼'eΙysJ42"`CM #bAfR]v7<{A+^J>fVL WϬpy+3oӧ)T=jܖ:_|O$I^yyxD @Yq%£؈8l;2IRE:"3:`=& 2!MRݾyF^\Mim,Xx:%TѼ |[|$I"3 =">lM=8RfmBS[d/$uP]zlzcO:wIǬZm9ip{IqZjӜS~䬘Srpf^9l$uU]8"֦Z`#Tg23g-#"Vڪ;VNTP_@u;_ʖ8Uy恈Y|^<XdN.ڻ}!̼?KSȰgDؑ`YjsQ,:ggP}^;CƤ!b"I#|DD+[V3/0ePn*O.jIF]f88>ը/q/8W*4fpϪeGQun Tێ..t)$IS?ZBD< ؤ~ɒ7?~ \Ok`iYH(" 4¤W4nn[$-p|EDfPJY.EBQe"IZ y/K$̼ tKK$I$I4$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *: IDAT$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR *$I$I-XH$I$`"I$IԂ$I$IR GKG*CHq-@$+FTٮ$I$Ivn$I$IjaVH$IqcR-Q:F$I4V:$i#I$IBJ_ IߥH#. K}h4tT9 tI43RE̼8ti T:FЗ*ypv$ tiR:4f~(B+CuHFH$>.ByZDl؊|)uÁJnlገE݁+#IҸja$IAgJXT*IF-9tIaҹRE$I$i_S$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjRE$I$KI$I,U$I$IZT$I$IjaD{WQ$$wJ# H RDT(* JHĊHUINy==sMI9gvwΞ-32XX  WU'uo<>WUoK~"r2`UվS%_<~^UؗL =JAUޗd借<v-JwOQ}Oa%i"=`'O*"8e*Y8XmOU/iPvokɳTIH, 3K 5=ہ?r{akL_ÁRM\( rAy>t\"" U+zRXۀ+UDd_TTTld$agK]HBDβ7p[)@bq PTq_Fs4(0>.?!aZ`OYDU?O!"KcWGs7vG^:1C0gB#{g,LDf~Q|DX{!L58k0Y `}`n0}-2g]36%$g׹Y\l XC| 8J1Su0G*ʌi(T~Gx^\"/^\FUo,RHJi"w\U} ݚؐ.V&t_g|[^-"33*βhsօZUU DYEYBP;; ߮*UuQl/"CBKaX.+U_ػ^D !w`*Ty" IjPADRYlZQDW'LDD})vgFz#݃| pBHo4x8ZJB4c]S& l8λW1JJ4<]XwzC'JBBB;1 CQ[jW~QU_(;3lHHH><퀟3? 5PDd3`OlwQBBBTulTU?lଚ$ `fNSUg~n)U.Isʖ2KBBTU|$4|$$$TÙJ||$$$$$4L R#w~C*Y39" oyrрBLRImSVűLM ],Nzm]8s&"C+|LP)Zڎ!KͪPe,~cNM_ +"OcGbN_a>֔0mc`^Xno$" +y,2,ǬU:s!7a%}Bc뻤X(Bt_v1X Sv'UuT,̊QxIUG Ys vNU}7v ANms>xiwvΈE$[g〧TvOK` F`a᧟vʝ(ge`l yv(_puy, X_yZ+#bGv::^C9kI̹X7xk#uc &OMrþчm2=sG1(S;i86w1Ty΅w\92&W>Nݻٻ:3"M19`l?<=b&lܧOwAXdu6?~jk>0yQL\6|Ώͭc1_׫yܺ"6 "^Нu<.!&4UcZ`sCEdl{SBVTEXf]*hwhc~ǖW*iY $oK7590 7U9:(eh6&2D7+Úw ݊|u4[`H WJ}|V "{mȊH0v_,r_(bG38xvb Sk6{,t5 !f< ث.yAXm|-ɱ,p ;lQTw߷=;ul _}T[F]cyj[8,00K7 1ٖ>pR7q` .ls s~>;Y cӍRQ4"9t lǧiǽbϱ|pq5uz\IL6O){5<b-~0$uSnݍ$-o,]]QST;AZb%?+1,Xˮ(Re0 WKSS ~>~hUuaN`".St?@! ?` xeϱ`*fZ8K76Ho kMy~=\{2c3_}w0!jKl&yaEB{_ݖ 4Y@7(h+"K1+®@E}qDnlKü ,U`{\A y^d߃3#y\Lw%/of.WouxM=S&-Y(uJ (Qo+v(Lwv.#Nkۻ{R? ڨK*US/pFnu V(9-JM˔Js(Q JC 62츢:wm=k eU̪|G3ZiT|?|$ V)Ee@{bE_?Yć^WRg֭+4'akY=pL.Ҕ)U1A1 LaveɔAyjt2óp;y¢*iG{tGw>T<>FƧ+/i8? ~PDlHE;K3+ c=;ޑqLObBK9<6Ԛr //}Cbѿ2(#\xUv-YTGwoDއyV[< 'Qi[&'l--&R3cJF"+3y^m؎AU@~P;T +$(UJfx4v 8"MRS>owtLKPNR15 =Ǽ;T _/IlAT(Oc!-1M}#23W(*뇘%nFwQ;֣/T` {=Uk]2Nr5֊/ (K5Uͣ \C[Odh7!` ,U>,Tn y;\53VI,yuR_*UEx\sG?-x:!Ebn2ra*TiW *U4_ <~f]׮1Ej2 ]EӫRE7 5V7?K65K/NbmB~9% }? |L*UMvZn %o>f^PR _T(hU*JztG==E*J ӟ?f0_t} /d腞]=jh;T, n[#oN8(ܹ*'4HLJ|Wч;n:j^"a&4M*JI?Gj^}~AD_$C Қ6Ȼ/* YAG+UBy|爲 :P*Svw~ꥩSdWdh f"_@څ#{D_t[JTlzC[_CZɓ){DXnU)WD8wW@-"N{pn1E؆Q!&ql~Y\]D3Xù1 e19rQ?Icczu8+/ӗ+7tF:pÔCB: o-;_:i.FD3Rwe.ŕuD]&2:/a~ !"`>|$yj9B ʭ1?->j|, y,K Rz\_X# *Tiŭv KuPH> vIKBP1'|vchU{4>ęnoʉVU?PѪw{,춅T$ A-F{o("{%PCTuO 1|D4U~pcZ c5>;^bc]}5W-%UU|DLi$f'U G1- U[{D)S0 sJ)8ȔGaU>9ê::Dd!G-/8/RX Ҽ}7_F{@~,ǵJKr~Y{F5NPս\ʫW<[~Lt6-*I'W(tJ3&"#1 ˪32U1ﭪz>XO oLݧ0 Sqnlsl %D[s/]w<`7ZND^AӘ Lk4 a۰q(׀ ;~>܎F`;O3"w :"fusE<_.uNFBg#9>`3j9;Z9Ay]I޲.R.vF5ØHXo|*UtZd(y 2A%_\5ADuSD[U((C>DW^:a}13uӰcVס|X_]q=l!r\X"m\M,F_hlp=/\2J~G0Ec^p>̂mO%8[گ虈̎)'6S+ IDATʕ0sMa^UhGn cK>oX9>)UZBFY=$8&"-zFm&Jp'n*b'9gA;fM20~fˋHǛ(U̧J6- 03dP^+1f6҄$z@U?c3l~DOM5GɺwDJw"vzߠW pL5O0kJ1(36-} *|"! P\(o;h*@kA\c/ѣ <_(X~d썆[lmBGѷ c ,gwZEBAwP~/CSy/\77#̑X7c~ 'KǍybA`QDDfL7SHޛf(*|\ bћ~D$Tulg<^;] 8[U#)>+vNr5|o>9℩a jV붃d%̿ЄvjF1ݯtb .@Lg_a+:JDŽ<^'1.Z^үT-W_"XMskRv̇=܆|X{ $N|1T Aј7lZ!x4ۨ Ѫ@/B>i`4&v. |cʀjW%cK]{T.f'7Ehr"ά]B92ي8GeDdrV!osW{WE,[ 9K}΢#3vd /"bf{]fm7܊EhgW #߿&t;qv:6 q%>8 |'!?S}I=55;SNQ6lJ~fep39 mvƖTDmpMY*cdOFIK1y9'[Ѷ:Q>d]{T.B,@C3* N~uB@U1Ù-"a.VuDd5 a^;@!VO`NȖ 6lgx  aUC4 ziGӀ+nqg"(kWZ ÔpocxWJgɥ77C]WH ƔD Tub;<~ʀN7;_Wh7V W'fsQ07壮]J]觠 )eYufF qtU}WUcu]ੀl!>gGPՏTN\Q@@6'psQpŗKUXӑo8y_AϴJiRz}8VzS>g+[cULUSZ`YfɘUM"6j\ߓ;:P5 ލ{RZ#t]z*ׇI]u ehQ ;mx:B&BMGB%}ʟb~ Vdy.e'Un&BC_BBǚ3;?_ y}9U}\U CBXC1U(BYEۤ=BD_ЌRp 3yl~ܺ҆W: yno~D:o՘_gy*#j%J)h=K6CDD1dX=' Kyx`)ر^' n ~otL7,%:"qFU'zVg,w "s8\}UZl򡍡 wa !"Dd'xyv6^Q@ropVl hzpspFl}5{ˌ nԀa"r3wVE$ve@ɍEisp*_"oi8H%n*gk:EU(~HY 6:q`:\;LD<#ʕN1m2V ޷)cѵ|N"lCU"2׆v9EE3qH]CgsMmFf[N,v ԘTZʈ?-(U|GY- 9e8?>o)"afKvm@^񔪆G,4#yX%Ӹ zlBYCqE}b~iƥ؄Hqqc~ݚؾAamPk2^ձ"=8`䕛Xۀ6a}VoEJ"R+@lF[*"2_6 GyNgD$ 9Z]:4ۋp-ps6]5W5ޭADԓ[(8K,,zZy&0Uqcn֯_ f"N.q@>w,}yvmPP)tfH&ޭE$ mжTf;EWm#+I'p.ӻ9k:|e]Wp;bgx'W3#9[3nWz\P'C;5m,86U?)k|?8m ed#ñCFU_-gDK[X<\oPgId&EoD> xڻQ܎ Mnx?)HoDߢ WjX@8,{{j-4wqJR8 J+iM2 v}_]J Wbo3&_CN2CwEg'VD:i>"RP,W),_7L`X䭥cm>@99|_\d=QzΎEUmlelg?<8mջ$pISDVwJ vK!"zn.KmXzU Ddyz䳷w~Dul*/Umku2oe% Pl 3{ U}|$5D䰪4] Ȏ\!_""a ?[ݾ h,"TOhگp[("_,wl._sJӯ`Vi`sn,Koj|K,TyY W|-pwV 0hh'{fvc\ \8WU\_^3~7cH;!x>CEڱ^g;#aQ|>͆S|rnwwgxV?4Hsl >?J < n#ՉOs^ҬcA[Al |<͍Tm9{ ̻ Ͱfv4>{^e=>|?y϶9P _[gc;g C[g6w~=S@Q )[03 GN޳%4t/`Y8riTAЭ|Aw8Ɗ 1`&b}d1Yl][mw(fO`|<1ywgxioQߝi&?f Y:]oC䌧 LX͖M^f/꥙߻\Z^ aI'6GZd ̢頜QUbj׀lmuBP޳Oyin֬ho`lm%= 9%2TAb Y^c3t3`Y;XbL7%&fݚ>^0l`Gq`VLK|o$ؑ(+~e<ݠ#k7v}.-]SfvFy35_K7*hB7uq\:%u,&G/dTUXD,TvPYRU?g*rkxk[oc \m("+VT~ȹ76AOhma*wc5Xn?8̚U}+2wJakMﵾG6S82tSn}}0+ X>ֈes & --sVL]2U׫S/Ddn=͇Y^m* 8],~cBKT %>+^*kDO} H/8 aޯ`Vȍw(vtmAh\2%VQ|XߞkceKaln1n0vgnUmZKBB~ .6 s>I"o;Jx>,n= < 9+ =A~N=XyHHHHHHHH8Z*"2wU}Xe4$xX?DO?ooh66. XmݤwEMƏ>|Հű `:^U =Ez 1PDfriWb$6rs'V7#ü^S]ö?b+)bm/lj[FU)a5yWw$K=cCQ^OkO*EXܥ0!f^}IòScm X Ás(ꞝRE8y+%tڃKS0acKG{VE>9{L^aEڏ1'ۋzgE:|_SƦyƖKK뿟a i@ p&ܞwv@*",ڂrvWa U_(گF|rݠـSc\9V%(RJT9B)UEsw+LɄ0ˡ~Sߏp5#[,j- 8S<V_R%^*+K78 [T)[n(+\L~y:@%Вj*u9.to`ʿp<;ceFcb\]_U4T?"|X`!c1oCҾzT`$e I8啷Ef21{\T`VEuK@YJ]{;S.!_j*ދe$J__}l'oN '䃼geb񁅅ێ/ ы{NSE~9 l*v"l=H#1,h G`:nf$\o轀EY[xm~Qތ}^ 8E {}lDzLBegYC'/oa`C>E̪c MRe64eJa{XPf["P1!yfu4St|3[#` \e=j )v'^իK0+ؑiUUP Sک݈b4sx|RTv}KJh׿(VxJPҌgz76n/)bUHD{4-EުNߠ ?V 6w\Y90wǻcV)(1eʘ-jwvs@k,ꄯՃ;&J ABJ䂶g`y1E\F1p8ٱ$o*c4_?0? =g1y+>o|MR{)U|$35,.}ˍw1ccdh @; =N+UNޣ~cl<Qσ2;exyJ1nLŊ90RF?X&gN6) |%Kth'(z ۫WT?v}и1 y}1Sdýs1ʣʍl!+;(> T ~~7:9=̻5 3.މ)2l/"u.`fZdO-pl7j)pTF)2 ުrӰXs[UN`~*laa皼Xp.N6U[C ZRU96F`5g{bUsI~` >WUs#֣ `'~Z`K`oO,zLb0L\Oy? sEdp53HDlPخZԍƗOu.>(DdYCT^n,2|QD4o-5xaV(UpV8gvώn-Px/1 ^Îs[U*קϻ,]o/yǒGbG@3HʠXO, NO~Lݴa !:R䣡\X$ ck8_U߯x~fҚa2B'f%Td9v"@]^x/u/@vQp}|!U71guFbsE{sZl.=ZE)C)BDF 9:JTW; оmDM~Y7YޭW8_>.zG) K!/·"1 UuPhY.N'.y7uץSDĬ2!bG,3SNȰy{1"0ld:͎BMؑq"2/a,pͰLg(2^'[ELHHHHH(Ep1rYdBm*h}e%t,$o% m:r] b+Z}/`yQXM׼gY!FwI[ 1 Qj,X9^UTj̏TAU9uM%n̩*WT}pq;/iS| PTΩ*vUX{ [}һv[PZ ΌmUGUGE1`to{I^U]SUYmYf_LŽeN¯`O -REDvO|) ᄝu"h^^n|<\W-Tc&EXSe]c#|T^ %+[fGTW*xhPH ߷ w&(;!T C-Aae|~wEB=|*=cGYv!" -Om]n^+*FNN:X k)oK`(f O#9B}D 9d36eS W+Ubbhg""1=BlF? L1:WGNeU~ Bˀ2;M7#¶0X|WD"o%e\not&(f/d S):T Ϫ0}H_y}Cs"@@c'z_UԖ?a;"*E'`2 R?wUEjjaݼ[HUzV_)Mo Qy~ʬ^"rX 诱+VU'"B>|yp+-"{*>͋GS+X4ZzXO "_!}U,b%Α| 7 vnؖ%^I7=Ώ ]F'*?_!}1"|KT~oU7 RE̲`Nrрu|$"W[Rh&@BX_ϪHB,"b ]i]|xHD>eO2>q"r79.<{oћWD?`r5ܡbc5 W"hLb HA&}+tvm[l?@*0|ZtR ?-A(lK~&:}ޡߓ/)G!,5s υ14°zBmi~g4MAUUP %L[us!g nsÀNRտY13 z]N n,Z:.$霺74 s쑴a"aU`W-uoV[ QT =ɷN`Bf z$_&rU}?2m bin4|> M p$p$o݄ |ap;̀EA;VA+AVG8PS;S"ROt&m&vI؂0׽y`pNKuaa3t*duW;LCh7EGќO;q)!Q") ~<{9Ӭ(3\V@Y&rZu۰֯n:Y<36uBBBBThŤhplE~'_܅{2pBD&y_c,yO_1DdY,0mhG>Nv`3("P-NS,`!T|_ǃ1KUutd) ppؙZp6WHxe)ѿ D҅$d8aߺnޭ7ouSuy&y|!~:0:]ќz-6}vpʧ_yG&AS; _"콿d xaD;DtߦRy+, 4nd@U yWGn^3|("ȕ"rtaBBBBBP$h#o]X/3T,'d,Ud99#Upo E;V;=vj/L)"gU S_t.AU_nNt&Ʌp9~~XF7FpVS閕J<_DJ+"u,TcI[a˻trcHk]_DN9{wkEig6 ! -&up$g׌qG?&#Uȷ95''ȌXI<'d;"qUY8])q)eAD6" Z/4Xu|ID7Dd"[wO}Hn^CS>|6 S ZLUUEZzBn'"g±Ge? ݅=YDq~Wp̎ x/ U/"s&y'~xX=b>_sNti6tuXAXH-PDVM<"%VǙ^[Rd gE$Tq.jw<2l)"s/>:@`9frgϻ[걍^Д!N Oq|U}CDE')sݽݽհa aG2l)"̚-ڳEppCU}ХgT=fK1e‚{gcGU߁B(Vp" h1!nVJ!FTSFQ1J`XJ Ԡl-nRc8q윙t=K&ٝ7;{=ܹ~M6.k E~dp,vGa9|a`I9OrGUI2382NyIUX+[EdVLJ"҅[CdR;K`by}LDGj/WtY귗慈H9.U:fw\I仿i̺̒_/ Ƥ"u~!>i2-gr1"=ӀoUi4:("K10ާ]\ d/W`6TAUSo!w|bk/&/ `.n)̷4 oS՘Qw5NfkIu[M77H R 6`o/_ks^;dn)&~)~[sD:`;On #0LSu"@9/G\~([M ev)7|~2og-> _~Ե3O7ݜ/.Ix'fbIDATLg̲2-_vcZwW!xΕ+~WCVU}DDN>v%.mMZ X4^`*'c|D^o!v~iQL-:}Fk(7j75;/ȍXޝDqi1 8~_5eJ Kȵ:]DU_2/J]'dP:%.wҹe&>Hz<ơ&ix_5ev4AUo0M]c(jTusxL5e 'RޏRSNIo;y9>fv[U:u9=mm$׹XyК>D^$9N U#bm>l_e&3Lfam[;7KR&_lpaօ-= <iړLP`uߞ>Dzވ,l\T-"-S!-VlôMIER:8;L`|`z~kM'&3rwNm@VVF3h_3B25<+]oNM \T  NE  ^}9f2    (*AAAA U    &A?AAHa?S  h6 wjH  9aAAAA0 ^"JIENDB`PK 8?J11-Pictures/10000201000004B0000005DC7D79E82A.pngPNG  IHDR2`wZsBIT|d pHYs.#.#x?vtEXtSoftwarewww.inkscape.org< IDATxw$Eaw K($$9`@QT^IJ H AA%JeaT_U=3sy~`t:eHS0(%""""""""4X""""""""h `H)%""""""""4X""""""""h `H)%""""""""4X""""""""h `H)%""""""""4X""""""""h `H)%""""""""4X""""""""h `H)%""""""""4X""""""""h `H)%""""""""6~ f0q6U{D?^GD.fV`*۸=j "f6&/jHٗ#+nӋxwҋP,Sl~`u` `5`A`.`lyx~rHl ``&zw瀛$'\,,, 8p uf6smT =3  X& '^2[?g˟_]7RDdX`{\S]WCbmw# FBM5cܽ}tfv"XϛEB}lL;f?1fHE `2ـ#kvZo2rJw\ӾMeInRfRg.Q/ |/ٿ]O43[<(0_ U-wq 0w+ո0yۊ6NwDD3ʁ%C̶~H$S]~R3;@Nr`1̀+"ˁef>USu"5Յ|*Vs꼕0D+d)df3L:5p26e,XHqcs`YүHK|7n5ef_ov)<\;Fg{Qh{mFCZZIIaXԞWs^{Kbo29poZ03[ 8X9 wWYx.E8oHl45)c zJ9En4X2Ts<|ݟM/F/ф DaHS~8pxkf6xM=nw﴿nfr7*Y#ґɄ"3=R+p(pH*?G8Ngf,*c~JŘpA#}iu +n0efߊ?bz`#BN-J#"cQڇіvf(E˿Pi]N"?x"A~A*xO=~BHn"p\1,B <fw! 3awǃ{a("2PPluŴ(+la(yu,|fv'q[G*w6# EsƂgڊU"" !a7ot{ܙlf^&q.9b گ6Nzۙ;nNswZه"{^Uf!X;c*^Ǚ9PO e""RX2,va6^"aDD ćgCFط!ԞX.w?$['lcB<ӣwv' K#3ݯUE6[+Hci4CM,!{I^-" N3[_at׿Rl>Bp7/pawpsE'ƉSK{ } ?\XS2&m/wJ~,)/c[bǶX2 bOxx""V$aw,j#^#i3{cx >6wLH}!3[_d,(1%zvC'f1`>ׅpn0qw֯%!9y#NDDa0wl>I- .JEDz_SOge5<Ϟ&n3wB'=ww׉Uif="""u,2 K;j(3p#`L$ |x 7pXf# {17އgefoVhYx3||YRޢwoP'ʷ3#e=Wϙ\:qZ{x >FJRWCrAȇq>33` `qo"'Wn5% } s F76=r,1 0p^X2 (qg֚nvl lƴy`b1+K3pS3[^lGr=ffB( 3؆SVS>"rwOk BUGfX'kv%1y3 o9fPhf~Nνef7FVmf[SJl.`늻<3qo@,3{0dC 38v9VeȦ,Tl}:>]vWyl3[w2m?Uv6yx~s&,X}G~yy\N\>#@ȑ-4_^2?~f&uքsׄ=LﯰkfhmD]F/O,G ]}O¥΢A`OjnɑЃb"U.ߋ٭MxM[GW˳}B}w-v|{6 p#BϯN7 ة뿻d LJ ;{ߝ3X_ۧ1+Yr9bN[Tl;l9]?+mܳzs\zow^,aw`_ߑWF!,=>VOr'p00_}Ǯ/\VQ-.ʁ%ͬɅkgfo''TQ]726mC;5g| p]af6.X5d9؜03;쮥gf[># 71e>W^ml=l cf_ }p!(Ӄ׺~jgfe:|:p]mmv!}sA}iEZQՎaؗ_\3ְ>0j\W^*(8 6y٧ C?IǕ]h7fv]+ED5V.e s#V2>Pfp%\NTlŁ}B΄U["U\ofk1r{n{Bތ}&Bo-P3En `fKE Cv'Ywv`#˩aB 5jw?پڽJH?5 =Ts4qY[>Ng89wd°+6/_8Pp9՚l{:+fv pC^^ 5݊Kfl0k"Uo \o=w̾ccNH_1ʣތ@woҋ܄; ?#xp#AFfwZ;3[#*5~!Dúe |5u6{*~ӶkY %A bf" H]lHә"_{ܤGo|\P{GL˶4/f4]1<7T#u ESG.P/!?@3pCz۳6v#o:o~&ZW'#sFGN{9;)uzw±tzJnf3 ɴA} +"U>0wzLvOw0oT n.Kg_wx]w Lv,DA`Ӣh9pc#>@H2ﻙM$|c7s+ꚋR?csgaE u3$V#<;>%?81b8!DxVwaXI}(Ndb~RSk%U,B)VT! K{-RMژ:?G]b!9K-muPg*-KN*]2"Dbw+kzR 2{X:ȣ A<;/?~~hECe(c-eyCf]3[?{"9PPR(wɤ*uz荲ǽOl%B<vtW#\DYFЕ>G}Wa C )pSivLwл027L w߿l{uw?Ă0c {J-lCF6gT?ٺď=,t3IUoU6OU;ws=R_R+!|2e7t[oM4x:av[{^fț]{pR֋23ۋxeJ4BvSKQY0:B0fe6l_7_C"glȦ|?~Nu4<)4Rտ3$!Wݽf?t$lfw1Nv3#Y'9\~J|̈́+q̥H)'Y{;` e+nX?};q!]]}39ݯ# 3ƘJ<Wirs~Z {9/ v#9~JEY^Aq2E|!⹼Ft\9n'ozwtZqHDYىv>?쨗-I9i9)/a -u 0~w r|xgygn~NJcf6oF{{zH]HnAHڍY O~r晇phO?;}<" hǮ f&LR-)~dU0H(%C_vǦ O{of4l;0[ xGEŒ0u8=QMґIpZuP59j.!~Dۑ?S#)+uL tx&֛`ևeumo $ݴdπ yL%k,a_몯R]h:W5)2+1YkBbforӇ]]k:wA}aْi]B60¬tkNg+еߍ&/(ڦܽ_ꜼvvOakGڹ}70?YXvoD,H-:<u8/JfAum(-G&v3X}uƓN[ʭsCR 4~·=GkٰԅsjJ<\@a큒VwU'K=LA2JۚYWRJ{ *qVb:]aKu~M}RgOs^iG*Poy }%hmAyk? 2I;L{Y"R+dLȦ?7!>E%RǴטal,IUӪ;eoy_UAz wuKT T w?nY"  ~1 ܦ/8wr+( dosR#=R2)޼llHv-/\妌ݤ.N'>>-%~^]4TޛyiX{͘ `eN (1L{1tHҬc>,X#R3Nnʺۏ`AxX `L;,laSճ mx:s ~ |==uֳo_So<y}gmƴ].K:+[?.4lqG$HvaB#+ mBʀ?Tinfn]<ӏdRIu#"cX"q"b7ɭRHgr+j.fh{Qtڴ:5s,V'KMPs`jj11>pXz_A8Xްc>lH{`K%W?8.W"E/Lpd[EVHH>݊z]TPމԥ(2\E{/f&DQ[֛ZDDdӺfǚ+ZQ$u1AREM~tLO*(;Uw}M˂=,خLy8V0^௑lAYҫ2 샭~SP~_ZVԆ^ Ѭ7\:VѵAϒ*N1"2`fنf vrDITlBbzo("i\)uL7?Ǻs5Y.D{8ja:w/&2ۄiA_ECRizsb-/=K0#߳M# :;ʝ^ww?:7_84,wwR `ɰT:BյX.e9ĞvXd[Ƃ[eYAe*AX:j1`+(oO*ޭ9kQ󆙵&ו-蜁ޭM:w-ܷV#`j IsH>qhN rMH?\~[- {)u.x~AIwz! Tk uƆS(z,I3`A*P\@E jHlf}kU[B-n}e.unfK%]ry\u`K6YZ#6|peՐ%ʞN~k; +k_U'i5]ܵټ"26)%M}Oɬ{v?A:֓3`f3-63꽘"uט`N:T>Lwe'c(k՚kw#JZ> 9ڳlaGDy?:n8cgdڞQn&5UQ/^W[1y)N8^f%ۏMjL~UY:|5ā lLHC$+uv8ՉԵ'ďSͺo؜3܇LaQB=?Jmif&6 xnPYN2:Q+%%?Rf67DYp1B5^-uEcgtRWKl{r|NfKN!#iy3[|X^QE- KKw {x,x: 5Bxa7jX_J~4UD_>㞏\5Օ:'_i?:x2EY{]NQьdAT~Flô1sWW#CO" (׃[;&.*[I6O,`2SFОs\Y0lNyI _KRgnrG+ԑ f%_N6x4OP;MZDfkZ4~!$K`|<}<XF$?)g{wXɑ6Eߗx/3\s}Uc"dSjhx࡜X%2gKj jx{6LA>}h>D"X}[t~&[Z_ x}2߀ 5GoyzIꛏ04/Ek+qj?vwuPϕv/l۷-ZvQ,fGiOO?^DeS{(+_N'hc3gPkܽu,AFёW~=zbC[e縢=s_~ !Xϕ=RCwm=*Ի2Kl{C[]x4Rֻ&TNa8ܔ;aB6`sٿ-Z ZY(`9ؘ\8/4lZ߳c`u-BF|4pa2 !q\츜'wwv>2}Yg ey{Z} ~.@Q{R}BKn*x?[wk `F_ǿ@ hҜ3'=K[c͖q97~|Wgٖ< WUkyKI]Oe&#܄ ;2:? %3aw/e̶%<5 z0ńcy3=lM}2!!ke۔h|!>#" $~v^0n=l]ifk9й˜=Lρ ݚ$v*޻ Mo|[9 |8ߝa(#a ߹l36 M y$ĩ 8x ~csf4q_r 3F7@'؏4٬&<! kke9/L蝗7c] = EM2E<{,U# Jd +f'= ̾^5j< Jv|M|(gz=DZ؁KP_!c*BNx_W$\7輧ri4̠#hZY?n fsJ1G25uB^Jz;Ն;x/$|/^63!ru|Y}AiE=t9m=p޲B:S=bzq~Bي(u5kt 7RuѰ5юPROvQB}: =hgݩDe\ Mד5M=ղ9yc=3;]!#Ez(j1:Hiیm]F`AhR$2woN8W 'mu^>+7mۨ_vy;}4aӆ@׍6Bg:| ! Qw;pwNh0ew?ݽpB[o갊ת 7X1'-z]CTB=o&ڹ- =Joe#~PP5ˣ!e{ֽv$鴷쯀=5sld=8 vuByH ~$g\^'L_TC0g2-r)RG{D94P@NB?Sy=v޹޿{uބ0kk`M!Bdw3t7xٶL LKuf(GEqV!!$/z82!/ f6E& ۇ0 %Lך?0us\f,G8ﯣ-)KrXmO|(+^o86Ois_XqF1]r^¹yClfPeaBxqacNvx]AlVa|윸<>a]ه#C'>K02!{Z7QB@WSBIN& -YOmpw6_GjB[7'=ngS8+bvH8'?5BgKDA,s@by  N1PzrݿDR4?p5H#if}Z^~P뀽#e{IȹUx`NBm%m"ۼ܏lsO!7GV>]7Ց]KYB<fx>=5$EDeC .fl+Oq?!~szWe /E6pwE~Mlyc;0m @8ݿyC`-D3 x9:40ODzo@DDA4PDBH:W׹`sUٟVI fi$f6 W"}?m{y"p-;&H(%"C-=D0Vkw?J>61$Ip& 0lww?u` a0;aֵz_)4сcm ""2RKD[s^/~T)w@B1vPUZvV~EYo|QKD-St_7嫙n@_pzV1uAl%}WjH_er^}w{DDa]ׇ?\]41Qc093Xok"%'s0sUX"2ly`眢ssz麂 ƃ\}1sOS'̘)$g3:nft#"" Oy\3gdyf W?sC79q3sV|p3p1p4؍p/,L8~/)f67% "o'?WjO1+]s"?ѻQ6RňXgfEwqszrwߢm \XIw_}fݚpRNum3a5+7Y}}ݿVve3;ͤ1lfGngCn1(f-2/dw$dA3WFf2pG `fU{w \B8YsF1M yV3&>ThwR 0#0yu-} QN ""2i -e=q k ٪Q=x0/pY3ېГX:^A=5Sl3 9윙-hf?%L<ՃWnn2Sl:MU{_lY3;3r+ ~٫&Z BJ BO7ڵ73{ \Ov2c&¹ofvWg#nnz""2B6!!}kڑ oHD"Y"e`{3}{`w7p!jsob7e˛i(=s1axiW = y#^ л0Ds6֍'L:mw7-Q.=ܷ4X"24ĸe.ڤwu?| |]:cC>CI{88%6<, (}$xNfw0Eߓ^=FYw180;!6|>>6CNLll2Zfw]ا4kѢEP,DYNShe5kľSh| 9:*Ե#!M^] vоy =A}$@k%C*u@{taF^VQxѢE-ý( aj#[+ mvdjfk϶ˁ]y^%yztGWð:hXB~*uC,WǿMyyz܌N4٫B8fB.n:ﯡގV'K0o̬jV_){ ݿZ\!Fz.A~rZٚ'ݟ,[_OS7SDd3T{OiDd,(kCxs9nvxbi}jzSo*f LSU6ð$380)$=J:'nΙS< 1xxIBȱ䈂Y7;bfocڼS0SȟY`[/9#h+v j73pf'O3{;!S^iw=ۉ0h\A~RW=;ZaD$ oX"" DdifE.Mrw?% s?E_%$m3%n.!P{ ra#pxDHDwxrw?,RϠfpw+@b>]+mE}:3ߝV7&yȳ,1k+I֫5˷vY^nzzg T01lm3;7Bu .afyjv-6dm. se>:P_(;# VtJ,5,"WؖQlt[OSeyKr-0,'Q.#$ϳ?t&*KYζW{M =*zp])jyR=nPW >y>ɜIg_3Kv ī""M -@RIEgf8*a,{U~fvXV6 K 50ݽ)?NFĂ&t)Ӷ򍲙I1sd';}޷_~_Ҿwo^0M?;/i!SӒY!H:2Ɛk_+A+#S]SC-i"U_&RpL{(lIhh{|Sʽ*G @1j)`+pSvsexCURطM*`m)3D}O#g{GSD=v7M{)WW;F{uYs|.b:?%Mh`Q=9 P0P ֓ S~6V0hIgK2%a2E-EeLW̴A&HyDȽ~ևCD=v^sΗRDu WUwB#!T?Vﵦns$qE=nʱ.WԘ;qV_ޗO|}zofQ(+0 XPjq"~^uGjw?GZĘ'(*q,"OTRɗHEOG$)icff*unTԧci}S0n>:EΌ<3$s}Ϊl%E/tAИ[ِ."z]SydQϋ~~>cс`wFoW };[q2{e uz\1./5u8NBcT4Afv} U`}$-4Lżz.I>*0ǎ$Jꦎf !!+u!T/'pL^5N* /֏SִR $I -IZs4#(,,FuPJof{HzBWZQkД}?bu$m]d(ӭif)XVw/洝Wq?ۗk99_Qgޝ}m- -UxkL&YpJzBg~KBF\PB`($u`05.M`*aVv~0vkIA3;W0f/MPIgb?(驈 %y= PqtAH :DTU(Ǫhr<.`e\+)Kc 8'KV=%FA1ϒ6lm뒎Op9@򿹙}RҤJ辒*+LVX9P`?,B`ja~lf7NRyV;31OK:F4K8~+h3;ݣ Yq̬A_UABQq*$3>evI_tsfG ր?]()Ǘ:Ur*o%OW/Sr`XT X/`InЊkPUn*?R#fvtwm%fv?ptFEB %x!c3E:W)WRM9.tяq4]'G"eS ީ+ VE+LE/H{f*gdݗk .ojIV1ifvoF\$|B oPs$+"3PY-47SVjJpj~FǷf r $3#Zdp%%"Ӓ/qBu+iUIGK[I_+}qw3H#B^-."N*IuxBg4^sفtIWͯQ{}oYRE @fľ~ˢL,qB럌.q܊-~,i=IRBֺ*wn2anQ ֽJf٢?USD +z \ehY3=E?*1ayF_%9r }[TQ0 X׹.aي.nẃݧfn#CJBFve<~Դ|)3-*zV}%w/镈rAϧKw:\2h:$_\e점ml>>&鸐}(fYX?/R3.|! [ۯE0\u0 .C$}Rхl$yJnfI@hu_eyLtjba-bPI\|&qzD=G5acfI:>.Ige’un" $Q]3IKR)ΓeIaXRֽ xg_}.өR> ĬvrhEqMwjTlJj -Pw_VKFMźfoWхR 9Ms$|Jv(Vʡ__ľY~}@$qr<'W#io'I:B+>GLx%I7%* wG;!ԈP;"Bv4c9G䈐D׀2FI_̳[d{1bߜST?KZ;$[aޗp#iB_D+a:o+q*w+(fNVtW]oBQ_p])*vUݽCү#Bs4l3iA1I)ᴔ~`G>_MwyV|`qml>Vr{/N8}? :&œW27Jf4T3.c Kz+r;\,3dfr_`f41dw63c e̢Xbf{J8NE_$1VSH8G @6M}u_tODȮfM1*|ΪΈ3^3&)T_ .۟Nh>1^>IS:e*^s{1 dcu.g4*ϐtM:Y $s+v wIV`f;)8w_(!$%Ji]WeIZ " 4+[3~VhR%izȾ3lu)jJM#>#I25$W(tI{U*rwjffvO:cT>_ڊ]ISChf%/hnf$}%d$Y°_ܶfSQlߕrQp|28튞Z-BnoS*C x|S?`a0{ٖ1ǜ/mgU3;] yv}ݗ:_YԂ̬^ DZdvARؔIdIEpvŢv.u|3Up]H} $R:nQϗquL33R1lu {m[ܼY PIC;X0Q3 >(O1^|qrMdfGK/lVp3WD7(]9jiRUtT3(fI'^&*IVhIK:E|~3OjP4$gݽׇW3_ݒʱUusp搐G%]$Awo ^z@ߕo=$W9Y¯:Zҧrn{QA\gbfO*!:r7$I๓Cs7CwuUҡI,pofc%=$)HUV0w _[K:P/B)i;IoK [I^wb俗EՇ.RIpS3c_Qw%K#)I녽,@pf}#^ʕ3/(oM͒FF͒%VwEv7QMI:=MfEBIzAE >"iuIIVvpݽ״W3JU%I)J "E(xql%} ٳZӤ{Ρ1e C#6E0/KzCFR"J92E^Eґ~Qx+̋kʸmjD3+xn`|F)X8_N̮TP=w(*[] @P%x3i F7$C%cطy~W*(}] >VS҃\2 6L.1]2,?sl/!Ozq{wgf)i*z?IV w6QG+U-gIWjte9 lռV *YWyv4o;JtSY7xNɒ6CJ{)%@?C*? Iw<7tSnC攲<?ʌޖ)q3% g 3])亊t-`J Ag+$ޛFQ#wݬ5t9 ^?_􄻇-jdn :d1]P(`26=gusA惏UjwQ\fV[iQ29⦙Tbi?GZb*.iGw"̮Պ[$mRH sɗ{Ui,VÒʗmrv=+ Y*}$v[Mtyg0Ijx*T tcR/N\Y0PP55Esv~f6"]%VJX*fIzTAQ'z1%.i]K:+@6:Tw)igIٵso?X_WPPܽOt7D= wJ;@塀6t$| xIi'\`0QFs`3OH[P(`1*,T4 XhP(`Q@EVv$]uUߞ:u;0w 2lx2U֓^c׿rv> 'p/Kr|F 2es馛jҤIJzIvӒΐfV[Nv%}_YqS%--Ɋ@$}"+nz渋;f}2x;eŭ0+no3$mS}fVܚ6Ɋ%;9qe>7[i>U=Ȋ+ wZB̿w문y~o?zV8IK&+nђ'iv -Ľ7Rw%$27/t?_Dܹ\VpIJXم㈸SYqC%}[Yq-.pNjˊktZ%Ίkt}qwr_fˊ IK&Rw߹Yq.Yq.sۊo͊5IsIrr⎓t+F3I'fc9FK.mݦw3?U9c&HIMIXb4$sS[wEw=4+NwUN4<+>wߜ}%םENܞ)idVC~~qy9q*x.s{ʉYsxLVS"vɉAk̸{V6N4>+%5^ue}Vk*Yq(x[VDܩޙղy)xȊ\{Mn\:aqҬssΉLˌ7u}gg{;#!:߮O<@|ɪFmt_tS;@ܝ~Ry[<˵^555.ɟ+鱐=wAN!q;B~wKHe9q7_Nu!qs >'!q7.$o9q ''r~pN!qĝϜ=wzHK9q wJHk9q {;'k!q#Bω;,$CIYq_ -!+!q$ ͊;$nYq-̉XҸ !qKr kJV!qK%eH\6s.?ӊY]+$K&YqEmNn\-E}>+nL&|6+nDDYqC2Bqy=3|qe)x; +FA!>_!9qsB⾒1+$ȜCΉ{;$Ĝ7B⾕JHwrwFN !q?ȉ{6$.\ɐssąU_r = ;'-'.\':%lvtR϶n:~I5oNItWR9-ylaqaǛou &rr3=fwk,2A+>{d}77'.MS^erǫQ'7骹a b+=޻*}ΝJ;PSS^|E=#}fίcf\zGtIn+] jت?9q_gq(RC='JqFS?Ͼ̾.{uLq{d'KVWmpWwG((Em-.Ix֔Lܖ=eK@N*"3S&%)=S+]=X/!S ˊ{ oɞA&nxV܃ :`>`戬Q). vS זtRqkLIzB+WNqŞWp4.+I:74W\gO-(9[ ޻|IVꃕW^YO=]ӜiӦim̙3? ITY63t O~O>yݷ)(}E>e]$IO<&LPݶu.%3H:6L?Vϟ^,ג,$)H[Zw׉'ɓ'yI'/N%1@ytwVJ|."tAn;VIJz<`91,X@/V_tt`@8SWYgDG3>7 XH[k7ovuWM2emuuu>$ at`@e8uE+йסuY#R*sĉ/ArcR$,H߄ ?w߭o|)f(`Ln)w5k&Nzkm4qĄ$,HFmo]o{u衇+C$2dsŒz>@'NԻᄏ!C;Ԏ;@$сYuUuj̘1o:uge3}Mқ}򡀅0c } _Ќ36tP}M13@, XF{Gk>#^={v_?PB[{[_\P):ᆱ/| 6|p;dw`1G]Mnfmo[t/7Hmw_`F.Icۚ8q>巍6R;h$$`/?|m/az*Ŭx*3$|׵.hΜ97)z)C/WKK:;;u mWo}[!6Hr@fP̚$e?!ԩvܗThCFhmW:_R3 `K׸Q+y3_4d>6Ak ܭ.$]|MDƷחMq1vs9pT)`_m5sUԤiz>7hfKz/O{" k@Dں lH^5Dl-ׁ ^T{{3%b:сJ0IDIϸ{پPrU qt`!u>ox <3S%b:X]vtw. qt`"sPw_sP(`!uf3IY31 zXTY%%jBJbf뤝E iSFҘ]1@u(.iD3 |T' XH[wm>g{h*Yj*wtofsSLT!@M}FeY6*$, >-\Iz:7SL@ W{HQc4dT Xf6}@b !RgfHofO,*3I&i{I;ZizQB$gmJ+1$M3{@u(&^f^N6/ 5lO% UR\$.I$.Iwv2bN% U,unڹgHz.9][)Jс=$(ޚv2,T300|IBΖ33K;PY(`!UfV'Gj%Ms (v,NR}P3YL3;\T' XjK3ՉTdQBܽ]3%b:ե i}$=N@,]9ݩdсԹwo x}2I@(`jOIK[N@a !* }@ 3JZhf,*3݀H1Մ̚@IV"JcfKef D P23[UW2'@uym1g{D*Yj*wopfEҿSLT$.ioI;i' TPB}_o x}33%b:,@_`!O{K>L!DE0wH;lI7ERgf?H;Py(`!UfV+駒$ffRN @ lt9^zūJ@iZI어sP(`JffJ}2|T' XHPsGF rvIg6[%;t@K;@w'dҕݝJXHtմsϐbfCIo*Eܽ%dT XfVϒtmy^L!DTI쎴sRef.4LlB)(J;ՋV/!k{\Z(]%i]v.,@lIGK2I_1u@5ym)gG rvIe6$7t@K;@v2bfVсԹ wv.qٜ#/$R}IʹBL!DE0wm=0N;Ջ,NnN;Py(`!UfV+闒KmrJJ`fC@KjV"Jcf̮J;Չdf$J:I5!UT!9ۣS@UT{'2@ui'H:Rҗ$=o XsU q:wGEi >wnf*D WJS]8dT X>qi.O;ՋEܑ:33T XHJXI)f֐v,^RcP3T3sP(`Jff+K:Iǘ:&*QBڼ66$g{t*Yj*wofWSLT$!Ii' fU(; XHOtAy(tIHD|ISM@5b !dt}q)Bt`ߕtiy^:3)i o/:~΍ZW\ (`!UfV+7$M2KjyƵy Yf1VxcP3Db3,\T' XYHjtrJ/6/ Oa״~QeJrj> kNUnh *E rv3{F%-z)a0Vw[j\_(^`zI٭/ Qݘ/LHJ5_;4!P엒@ujM'Zh]VҷeZώk>fX̚%&iZ) QBr&UBh%^\}Mu.>gr+d LIV"W] `psvg$2 IDAT3{F%uIz=0 ۲^6W˝7grtZtV{V-C7zW):q-T#%&w-d05;L|{ALkȝgݧoS]|lVUL?`bVc !RoOi4TjF8q5_S@PmK"zwK@Yh0U]Ke 5Wj lt-}a)B G)w>:^ߪ8>o/sP(`!ufvofJ;@QB2öװː PB̬V%&83\)R|q9=֮ʐPiҩ%uľW| lxA%eW VK+ [I\=J龪i4] i*\T' XGzucc;e^8ڗIs__v`ef%}_pIٚ) B4}Z>^lo}m+V> r'5ƥE r6I/d6%b:@/~'!}UVݛʐ |*Γv2@a߅-Kյx`#\Q~G $!%u-V]Z2Sm,Snu `} @Np)~v@>Ӭ+u&uԪ8S\*ZحOuh3j{kڦ.SԮ7kG֨iZ5[i]jGQAnKj4-tT# Xav :-}}Y͙< XL9QM%6^W.uj5zρ1}qs{R-xMS: 1u-VjyS&Ii w;dMm}ټnͽii5!e()ZXGՏѸ+?a׈ʘݻlIIC h>f`a,z]mo-KS.-/wk>6(S:5ߐ.`uߵhujZni ZB`FШgawO]:j~q5Y}uboh 51!zR wUҫiz133cڹ?r6fOnM>2(viE4:sxǢ'>s򖳴kEMiNZ\ W **OV~wi,S&颀TY%#kft3V԰jFe5-%MO{]B۸CvXvT״/ԋ҇݉T-/vjʞsa9w<)T]j{(7!ԩa,^Rvji%DYY‡z\jSc66z坕s᥹׷ō>2*fO>ԷC;*fdf|3$\T' XP16~|ٓOOLAF4%I.i ~s>=*iY6[~qfölP'Pג+_Z6:I1~$ioٚ) Q"Xi>uUFҨ9simZ+囚]GZP{YM#&Pw6$}I T@ uk4KCbo5e\]s_?iʐﲍޭI<4^yYG+X2lz}(m*A!ws_&y8;r4^M1^?FMLKaZ7y>tsIkһ'%yʽւ d^=nq ,j$I'$df[PШj\' RM/W_T~Y}|u3tQ6jW[`u>tno4-Zx5kմ~ϑw%X>vLY}q]Ltu^`@ ikֱfZE3R-[<ŽN}kQ?MV۸f6}b|5\~󉻨xۼ詟?\]cqauTH>2 @u%h>zsə6'"͹Uv5oJ66Ϳ'~oSkGlmq;=֞x)43vE_tajʵnW|%i䎍Ew@JΖ4VlSP(`@ ׮-i=9OK?v&Սo.8+16iKF!ԍ׏ŜvaBc"Gڥד/z:^Mi EO[h{bpQ2}4fpN薥jy)jfq/04hFźGڵ֡Wa&Wؿb;ov i B] BW wjbN7*Q~)iwwO!e4KYaZ}p~@~I|jUtO!׆5Ov->*$NiԮA#whTMcqän(V7f^\@-CO-Rvsi2kCsu{kj>E;rnRYiH1"]f_"%x ']3ͯ'ך!VGM7M=IS3&iFRc $]Z@yѭKK`>8:MՋ9[KOnZ܈ +,ow$} ׍Ѱ>.Z;p?-^H܅G3}@p.IJ}^FoݠƟSt(e;6i+WEݚ{ci+;TMߕ5VYߗ\qvi6wu?\؂ȝ{[36'?\H%3>%\T' XHlfo(Es ϿM'8W+B.-|8ԬR˪f*w5f!ܟlw`ܫ]TVo!vg19%kT;4-ʔӂHj wde?\]@HFɃ .Ȃ q*.u]Ew]]* +(D"i0αr8?zaf[uyn>yKB)cyh޽eqFt'2 m[鸒rts LC| ,-`j[9 '}W@@/7ӆ ;:N{i˱lS-vߍl,4hr {'ϹMi|аD_Ed|v-DOMDTz,#x,Գf;ݙ?*0 ȭ7"fKlh>,H>\' 2 Uww+XD%" DDZ.| ZCdv˴yu~|IMG?xO7i=f%%v7X5 [LÜme^* rGKFtsL^aG7DDU4uǐ.[1"T5`ٔZ*!A\QצzbR1'̂`þm wuf]h)w9VΕ29~gZ[sLVv_Qn]Tk!rI\4^ߤP0%4fX {{ fMQN'0אz&f53`|"sw_( nDA~po7"-`u\U?] Q%{tһ'P僭'ƌv3fX̖j @"RVl-.#4ܕUZ>-1]c3͈fz/o:`Zȧj7Q>?̺xnɠ0XBý)d^.`>z^>X(}f6[Hf}c*@(, T޶Za鲯?rggw&Q,: *k#;3Mƃ"D-ZFU],""u?9by)r~2nunYE~doML(e_1S=Nu2-+rځ/8" SEIZ*ltaޅ2Bi~{]o0Zf7Y4u?ĊBtaSkȼhA;&dnVE^c8/`U"p-\""X.b;XFD/Ydט1|`Mjta/9Nc@n&@ *h:|0""Zh"4El7}WӅ夛+q`jcGj1YYJ䩯Snhըa 4\?ǖ2;_M#KMD."e۵?1""'Lץ+^8Vog2{ x'{wJx]= A V~'SQaZED4 n[1"T5)iR\DO6NUtNCJUDoday!O1tzQQHܹ]&@9ƃ9X ޣlC͗ )|)+ ⭜Gb>0,// ͗;ʬ`B£ѻʛeR/4s? ulAw0X~ yR鯼~WyAeI !R?qQ(e>vjh<м(1pJvAӮ1"LXg"#XDDU"A9 NX%?`/f!]Ll] WRZ1P-kΧc-GW(MiVnSȫT "nTA5𴅈,K.#,ot_2m0lqxVN:rsrV~^3jzKrpʤ^w٠9Y'"'"۵-_OHDDDhry[UK9 V~?w;pC A;` XSEg͖zҤ@Tkw]MDo0*{PkOD.E2۵?1""P[W͗v$ML]f`9gގBbٝp-K+/0=GvФ^-!K}D7,p̲\,"}yiv P&-o7`Yc=hl^#9(`9bU@d7;h9Q]}|jꊊXD:Xd[sS.UQ5.!:lƒkw>(V=iy`PGݟrltWDT6X–DDbEDdI)q{yAn1lw۲T<8ԃޕēlRY몱^#]R IDATj ο"ڢy}Gj咈ȇ`Y"YX+|T>o=rF[0%6}oųK1j+Aef;:%A|LuƈEURՏök!"G$NDȃ"rZfZU eh:yWc9Sh9&h;9PK*N(&a,o`ⱜgv&4%^K^jtlȶ&ëvJX'\zj`;}mlYޛ@!4-ƃHAd~HKȬ* \ H.!<ə[h9>^5CAP( UFfaDD3AD. ?SoٮegʧGPJ9bpMv{4) }Š]BJTɽ! 6 bP*4(JY/^Ѻ4uWs[3Zbt7DTD \\6k"" ,""˂tݰ̆x\|} VS8VBR1xz:늾 0?o #<;|Nղԝհ+*f*ٖr !ٮKYNȱ"r\f"ۺϫ{ &>߄Vƒ;(`e{0M.qvV4jJBVv4D|/gHC؁EVH01"{U}rYDִ+upphW.C/5}&!8:ό#ߧ1tsfy'?`3]Ch>*"h>:bo?^S3f\x2_iFꩼqk{~LMDNS՛wv1DD5Q$c&!lEJƷ%! :? b0 Ov*b ^YD>"רV,"WX"""ME)TJ+(PLPJ+J)&* $[wM B8򌈈,6?rqoVU{mDDqA|IXb"""c-S  ȶ,S.oUy,J']FTG-DDDDDDDD%d~u#3@iDDb99g)UrIDC""""""_vD_"DHKD.] y;* X>g,"""""""v`mQLW X 9 ""rZȟ؁EDDDDDDH+& EU\ ; s-BD>lX5&[7q !Y*"nSGlDDDDDDDDSջm"""""rdf-_K1U8AU`؁EDDDDDDQ;i"/v`u"r&"] y;*ֻ'ȭ岈C؁EE1^b-DDDDD䀈+"ۮXDDDDDD䘈br_DnT~U߰*ъ \a1b-DS ȶ,US.oUyU"O.p>b&"""""U N{ѻG5+f;+hz:1iu՚GZ78Z](9wBDK koE?1"D-"'v-DDDDDDD=NV@;w_Telb2Zȹ[v'"r,""""""rCDv!D? -1lADlX=r:ȣ`U.GÖK"""""""".dmADDDDDD^z{{{{nݺqUQ]pяKvY2m D .>-Q\DvH@䘎]ֶƴDDDDDá8j|ۯjw@Dud)~gr]sOZ:WˆT3<5kܨg>ȟ؁E9HDDDD46c=(uljGTպ"_/t.%`"`m1"۸,""""""rS`8UU7.AU"ȟB r ##.\jooq8#D^ ᰣ`f/wHDDDDDDDUnG}7wqFоպy""""c(?{ svmUvXdU{{{{5o@UvRsWA+H3aLXܢCK$".XdG>oxbyyrW߶׬Y/MGiNDDDDTExm8`xfOV=cK..iNDDDDDDT_8vU !"bEDDDDDDj ཪrIDCDDDDDDDQ:ȿ؁EDDDDDDDDl1"۸Ɖ"rm"'DDDDDD䘈4 Gm:l,"v`Q%:ڹeBOlPry3NHtApA97qQcEVELpojig1陨j[ @+'nE-ǔS՛d"m˾ X?JU7 "bE։^>nUv=D61@g1@ɧN'ýR`a$"h<$#h>2#!Y%"^> "v"ynLaU40sqHh=!s8 vg0"ۢ `Q%3;27MU2-`B8| v """#"'g7!"aED4JoX1$mW:ŤKFlEDDD&"Mn&aKEvU\ ,"4|[?;s gO )֓bXVėW՗ߙ@jy˺g]܈ƃS]k;',\ų-`[.Xj%K.,߯s/i9#˫~j81n;EVj '<K[Oa^k2ڪQlc2ODDDDD-XdޤoUh/l+B~Oy<}D?z] yG^d*u [ij `&l:)V]0?>-خlS \U]o$"!""rYrYϽs ŪO%HO @ &(J(% EncV7g!DDDLU ׶ "bE։zz*\dz0PkFz| #pOp)]_D&a,Ϣq/k+ND!U,{p5@T&6|(a""""0:Bȿ`9'Fm_ێ_k7:>~ MXy&1Wuv+""?bEDdh nt,v+:Vjh&O ?PDDD}zWۮY'"DL۵MGW.v4nEI]M3M:аO~at+,\:YhYp7[-.WT}`:4wu .WEDDDDDY%"1\ 8b9D;99:6,U;1o6h*_ X-FDDDADDt۵?l@DT+zDvy5a_gbΧ043>~%E <+ ( PUJ(e-p{%!4FlIq7UEd_."JFRJ!1A0!$bC.![.]pRJ]S@vMٵE6QP'J(%"Zl: aDLj4@"rr_gDDR6|cѡAlY "*6R1 oI#D/aAaC)1$`i^1@f1PPq@l@+Tcg1&#|0{iNQ+^!4A QdzhFtb2&,WV邨B"-#Cs 1MWM ?Pc^:/aZO{K]f^TJ+Nb&ya;2#5agsa#:yil8Ogse LAB@qt_@1HpUP{- ߑJ:h꧷w.!wtlO6?򱪅WS6ԡ}H=3i^[x|&|ȌWo.b%xb͓o "I;""r_)h޼%9jttģ9~81<>V|ԡ} j,߇՗"o3&[ʳ)me,:/0rWwnc:>DT9UM8&WS|TUY.|4~lZGk{Ў4EÛ Tٻ#t0}yxJiŪ CЙoyS{[TZU}v-DO :Y,"lBh ;;<˟W[urjӼSww8IP X3Gcv>۶| +NǦYg~k67#"">p̷] T#wfua_oq9Xϡ0l9׶^`÷z/\%N0 ^%cA}[v)e"ʧGKy{X~P/uEDDD؇d7Yq 8C#iu_C/;\{,^:v6=ޛ45ok ;yqDdFD_ȻlBD]9 ZN\7ͻ]FȢ}F+ƌ wxP=C!, Ea/`JÀR/7W|[~3P+1{}b @3p{1E|o "R+ tǭQDqF7 _+qkb% `B0TB~P ^ITD$.LA\vJȮ5? 4::nqo,*+V}ΦP[=$qfE2f2{:ߦr MEzR}H,wV^[h9&棣h9&~ԋѻ25?e.K!{4@‚ַGvr GFpY늘{n9'k;%pwpH=[RʞJ yg B 42{1"rto52',MG 8hzyԊ45R.o7"`Vs &h=)֓bȮ)berE^0nN( *]Ĝ4 cQ~jơE'IҘ.bRioyZʼTs,$. aguvBΟADnRF1r{Ici¬ƃ"AN !m`Ci興~*U-ڭ5' 0n9YWR- 44ќ"uJ5QNu'p 0sMն v]yǎ{XuPEuB xAW:{E/q٘FW# Nv,̻Q@YU/V\KJ0< wp0Ɗ« cu8c2$X""_d^TݞAU^>1 ;[Φif}['"M;|T= 4 IDATx - A3m'0zWѱmİ=:R^``W6_{fjͥHpZzx~KTV &h?-=o w_DQpU8 X{솽X=`Ģh+6o&޷wxg!ώ/~޼KI¯`[:jGQ{n;^Hub,6}o.Z53XnO|0ve;X9 =$ "OQ 7S5K""bEDN1*Gvw.^ڄ9T 4̋l~ Uyߪ GPLw`t`M3:aP7=f!V<~RU>2:lR՟a۵?1"Dd|GDN] VJ3!iYv]UQ;bXՖ@\MX6|kFb'}p ve{ú+LqU!%׷ODDD_c7"2v1D,\Ϋ+:V[+nhߎE!Vrz]:^r󥃳>ֈ9-~ά/,ѿ? Tr|+nhEef,JDbopr^u{mU}߹ExmۆEW"egyVeղ?h 2\<_i1^.c:jw"syZȟLhzN+2]r8WCt`Ei5fK=Ǝ3`w/Vgv0_4 6P:zdH>:P:"r,"(8;a wjd0y%\ivlz>l ܐB5ޒ]]_f_GQvy'g啩U b>kG"yo VoDT.LfX|Dȶ)mB4U)lrr>Vo'!_oP93%oFI 0;%4xxX?1j'@DDDD}igj %^ڭhRb ^g[n:n;s}bCh=,Lˮ. 1 ^Z3tI]4 (53rG(-C0swyJDDD6XdRUTϨzm3+JX0Rt`IDuvUs2z{]:^ZGvټ33J"#_X,PݗEq, .Lረ& WU`mӥm`rV1Q0ѻUƾ9 On-ǚxl|ii>qP5K""G"ЬaS$ Ow5Pr[||0᠃t+79TD~&"'ڮɣۉ 8l<i8tsK|v ~KB` 2q%mVgnNS570"Hi\,"pT1\agwrVl7XӬzWYW6[gv 5<)nk!"'-`@ˣk!zUY+aeybo]WIUK<iN $oSv[kެstTY1[h<Qy;ERLq K"D8[_Pfw̶˴f.102 ^JYEɧC`iXdOmA4U X-$]T`3Zp!/oxAD3 Zȧ5"0i6f; Py}~H8ZsUv9,2?4<%2Qv+""?bvĸ!Ba򄻎R+w7|V.q@%̼Oa+>NG6{T~h"::"9"59v-DSE,"A;R KpFOҝtt9k,|DdbJvt@V9J\ӑV)ЇXps`U"h(ث8;x"r%ޖ\0rF2u,7":{YQD"v۵?yoTT3/y,cͺ\wN"iV! }Q'3>Zdx"O"ҀUQg|UMZ.|G98)AC(h†}Bt 2,'Q~?~6=@bk:<8Gfьdxmv䎄DDaE ryb-D ZufbtvYKs\`o B]M_.UK/FD]NBsꂪ\`=c3Z, cJiiG9}\ݖIz~>M{m`3 qA,zADDD?rfUu~TUk5y^;-,ة%G%,"$h9ӎzotǑ :*u vuiѬ$6^N9:(-]` ʼbV_dnJ]d=Ω1p IU\Y_PW,DD>3"" 6tyM; xjE.tV 闼`_0 /-2J`=fύ"y@Uߤ_] ,NDEK"rZ㴸~DqŸ- #wdwtJaV|fj=u{^'s#a y,\Ve7z$`~5hUk:< Y& zrYj8(w:X8{k Զā杤cq$"""`EVH[.Fb9DTg6}wf lŞ'\2ޢ񜩙2 > 1^FeGHD7U"rZȟ`m~Y'=; ^2/cgJ^󣎆;g6_P槦/{z-]B;ܖ1^`Kx9f/X咈ȇ`[N&4xAdV9 w,W.ű6qnxofaB)Uc-6_x.wv w}TN UWڮY'"""rZ:vΒYaV"^jnL!-68 f9A4W[IXsyMy͈ +,MW.2,4ͼZj㬂/"mr,`fGWjlW:JKvTRylM? M̾+ pKf}Nqͥ4V˼X0^LDDDaEVH[.fX|Z^:o{ W<{|v5]ŪfFɼ% Af'&qMSB̿bREI0RQ g UQ|OmKYՔh>"m9v-DO ȶm{ 1J0W)_Fa\]WijK0pca`̫ͶuWa&]+H.3h#B|ōf86 ȼRKqu_ú/U'PuQ#"s_"=vJ̞oCgEGDbi咈ȇS/olP&^L,{_Qu5*~dvhu<]/^_-n䱋sǸE?8:3^4ٙw":UIF1z:7?+;wyE?%/ja7f@e{EL#Z_~rkMyN3eh zf2eOZvZ;?SW墕#,<Ο .Y9M->3 րiKEܵVefu<#_[>,}}A(a;9Vнt$MY;g؋MZqH}Xqg't>92oV9d2N&8uKu-a5m<#z7{5si^2v+N{dhwӞRgǿZB炡4L v<<`z~gns3*v벁#b&2G2I ,;6TV`oEs0-x$mu S~#ӽUb=]%h+->/м5 c^>/J')Әu`+ ZÂo--~ŧgc7XP,Mu@+& E=ev>X4ߏyjD^̺:Nf.̓d+n`,׵{l`=6>Q`ٳXp " 7>MyN3;r.;d!]3YzS;Ko58A&+=ebK[u o^ դ#3[NXr};Koqj0sILݣ53iFg A{qmt.eX댑}d68mb_:Xm-l{ź}A5֦kqO^'/+-߼^#hu&7led{Ӟd;t.n:nVHsBKwvNzRӞMLڲi\fWҵQnV1CZc^*)7qE!~R"b6_MysH5efv<9j!K~1giU;34lp4}Pk!uHQOhk Դ=ZμXY/keW.;fяk26zth9&j/J$I\]f1bдn;\7 ^eZ/|k6Vhfluщn>ƹlT?ⳳl'ޛ]$I ,*"&ە7[X46,4_oο]ʈjluyMLM;z^ );51sIE2mp40ږ_ul?(M@]D|4",I#|Uwf>8~7L 6L۱Xk^<οont<&mjjZ6ldǟe$2Tme"Dlw}}}5ኈV+#br%IC6$i 4j`Î?]kAү(5vk=6K`K&sdgΌj@~Ʋ[Y~['mfLSvhb.Lݽ{O*(v! IDATN*tеh@09MMOΈp "N.^Y&*Xwl`i.hhUunz'+{YLZ)Ag[4:֭JIgG@O[NVd߻^C{YIԠqz4֭C3Svlfsnm~hO_ j] {XqG'_ݴ?MǿYO%4HAԠynMsi͚hݼI[4Ѻe^Uww]ქaneJӂi 4L f6:73y&Z7kF4 %ImYW݉u2wE#՚hԀKv-ih Rӗ1 Wv3MQӴnC.5|ZPZ^$iݐjif., ID$IFUDy0ػr$Ir-5I"b8?"Wt-3Tw;1 lKT>){`ƈ<3 .KRHS$Uc݃7B&)5-Iu#MXZB$I=8V\+$i I#M*3%V$IZA܂h• $I4:l`pq`vfT;dk[X4A-+UeK5!3{A_0eQDT2s1!1cV$yT$=Cݬgp3 ,I2CRr 3#xnѵHJ^jPM4B$IX7;+#b\XtA4u/O>o٠3EFI$X*XDLԼ]`9XL݃zZG Ix[E"bkTE?ے1ҳ*y-x╃z\Ô`l`IDU>)};089"6F ,I&wҕ|b7)4L$M`Sj^l Y\9 ,Xʚ?x+ Ec_XN>ϮkIҽǻY9{ i#S$i I qp63ƂK,{gV Ĝ0yQٷ$Ipq`vf4~4L 6=FAIR[ Wl//IjBfv]$ip6p&[8[&\ ,> _lEG$i3 Nu+IRIfG%IX*\DLFĮE"Iߺߜ]t$I@Zk`W`yDl.H{:7S`$IS~P1R `ˑ$u&vfoJLEDUF3Tg[TMliwTŗhI3ED `<3; .KR%I]3^>هLfK&9Jԟ (5V=pgqHG6T.`9VX$ե{н<ގAôqz-6ҲQ#ib4δc%I4l`P~TpITwzN%H$I)V.3? 2X$I\jEQH_6T2$I$ ^f..+"IK%I$IÒgg] ,."Eě#bk$I$IX7,M2sqI$I ,*"&Qj^L^\`9$I "6wG.E">9KEm$I8-:iyfv0I$I؀RjX:eKEWl,I$ICR}UE$ ,*3 6:b+$I$I Qr|@f(I$I\czI#jBfef]$IEǀeE}V$$I$ KfxbZhE8>"+I$IC=E ~5] x,"6%#I$Ij3TDy0اr$I$ ADlgFE">9KEm$I89[#b,,Iuf$I$i86ԼpgKEVTl*I$ICR}UE$ ,*3OuMV$I$Ij ,.3fd$IjRrͫE"~RMUE!I$ip2)S2poIG6$I$IÒfd=1-i4R"5"^[]$I̞kT.@DĦ$I$IRp -W3} ,G$IDqZDl]t-3T&jc!UH$Ih2$g`I$IcCJ+M ERu*ۊ*D$IҐD?ے4l6T V$I$Ij ,.3 eE#I$iPRbU}%il`&d)I$IOځo[zdK$I4,v`FfiI -qtDlYt-$I&3;ARj* 97$"6̥E$I$Ij3ThԼ S`9$I "F1Z$'g`hMB$I4$ Xx("̮~&I ,I$IplHy)cHS6T.`Uv[QH$Ig[ UZ ؊$I$IRe滁yz$I$ 2JWV$ ,Մ\E!I$ip2s!p |؊$#X$IaӁY)I -ؤZ$I$ Mf,I$43\$I$I!R"R `%U#I$i("bND)"6/IX*Zu*$I$ ID46[{&I#X$I؈R ` `kTl`h]@[v{QH$I} ]~\lE$I$R2 `wf.-I$I\󪭯$ ,Մ|҅%I'3B]V$$I$ KfGgfOH?6ThWD%I$բ\Yt WSHuKEif./ I$IT;BED :K$I'"bvD] ,XH$I$";MDޠIHs$I$i86ԼرZ$)X*ZV^T!$I$})i¢Bef ,G$I$ X*\f;3]$IAYTyWPjBf>E!I$ip2I@}V$$I$ Kf #3z$X*\D4Eġ^ѵH$I\Rt ,ՂW)E#I$Ij ,*"Z7+I$IC"QѵHOME Ϥ$I4DD#G`sྈu$4g`I$Ic#J+ŕ"^RѺ펾$IjRBTl`P |y;pKH$IdKSd$I4(+5ڋ*DRgcI$IG2sp1UߋHR=%I$I|#0;3_E#R"1"^E$IиdK_#bJH$IbKu ,G$IDČxMDlXt-SSh«n3)I$#lffO?Aq$I$i86ԼX`- ,+(I$&Ul, Iu ʛwX$I$IA6ToJS_w%IqgPU{QH_6T2$I4d/Iu$I$iX2 <$3GREDCD4"f]$I)ĒQaKu1b$I$IRmBED pHys._H$IGEļkT.@^u*$I$ ID42IҠ8Ku6g>h-I$^mDy-cHSRѺN̼4"{P{S&OG_>{%9/#V ZIP6 6C-Mԇf~қڏcZ8'BefgD|8?u/yɍ|o0k,paV,IW+ͭ\~̟?w\zi $y.L\qwq䡇?oCPKUg0$iyDZp%dw~Hz+{l7Q ,I-gu3J8#ַEc7 Tl`P ^m}P&z+{/vV*%I ,I=gy&ԧzuQ\r%nbEԈxeD֎$#7_TF`ȧg͚5\k'x8'|r$$ WHRm:3hllN{zc?~W/4DeFD5nw鱕+Wr!X$ $v~\tEƎ;8zϒ!hRE:/f}]n>hn,O43\Kj˩ʗ^c<_]Ւ4l`P |@w׼)W_=rIXT2O>}kO_җF:IP8Kj_f7/&>fW@ 'IRM̻r~8{]r%$IC ,Izzzxȥ^k-oy geϯ>rJRG7sOozts'X$im%IGOO'p]vYSO=O}SGf l,3FJI ,Մx>06pUW؟'O>=śthBkonn/xE?g~ &3XIUFh^555~W󪣣?|(+Ir ,I:;;9ꨣ{uY{k{HQjK6T/pA=p W*(IҀ$oUkzO:9쳫sYsy_ƣIx]J>lN:^c~w3VuIX4sGpu?s9묳*_]kY҈Bef'+ 'ɟ>6IXTx+_^93 JDѤjn1/W^y啜vi&Ig`IRXjv3 x;Tw]u& X*\q9GSӚǿo8cq&_Tۜ%Ieʕr!x㍽/B.]~3Iu)]b><ܘʭS*%pKflo3~T妗ss*r̫J^E̼*7۠"wWf^1_2{UVJ?WU ߝ 17 x-i}ys͔~/Gf^k*s&eE_{\#pmEr#9*s (mG˹!r3c~uʹC+r (s XgmDr3c%k9&1 =#dp\wu/e1QfsG!3s@>袋r뭷Nܧ(XW|*waT>GcU}*>r_ʽܗrGrfU>rߩʽwr'AU>rWU#w]UU}~Y{ErhȽor/#wXۧ@SEE}Z*rϣ:wWUn>rLmOQ{*m3*r[RjT̬mG`vEn#J ܣU -Uffgͤ-6M@-6M%ؼ"Gn0"R~ `\SJo+vȽuNxx=~cϫGn֒^TKr\K Pi-U]ܱU_A7VGUܥ}N}U/;*>rTjXSUs h:չZ?9\N_DTzL4c'?>G9iҤ<#ˈHu?FX[A'+7m7j߆=x@sۮ55ͪy3r>WkQz36=+^n,J}<_I7#QVT͖UoGn-YlY3 J?gkYKܔ&%7RjͬmRզfF^&%7*Qy`]zyUҬY_]Kl_ss5?˹Y:(ςZ-F*^#bʳ6M6^KEY<տ }XK.*_yzzM΍kj^?Fv}X%3z#"GnrU\qEI4l`iLE\V5vJoU *w:7\Ue-4K:cw%6ʝ[;ҁEeg% BXKlJ:mI7ItۖޗMg{?BRrRvc>TDEnuQ_֒ Kv-(] (Lz)rڣ"g} {mׁ̊=Ͻ:!v r:W.K ^\[By[>_6T>mCÈEni9"4jsˁRiD| 8`-E(]zRf>U!".tV:"wcD3/ZV\^Go;"}.5\k4 ܟ"ݔζnxuP.JpUHK!/z:@DAi@u?"tJV7躀)Z{$"Nt:ܿ#JV7亁+[*r "⿁չ_W Q!Cs~D IDATK"DL4z("2"Nz^"*"@uzu0?us[KUSzZ"S֒u)JeW~A{_r'Rj*Ψ\\{Yr3+nQ/JչVN> S1+UO%ܛϲN(ΝRέ[lUcTq-S/J_JXgYU|*Xg\|qI:=&@u T{g(B?&cIQkF[叶<$I$I8 ,GRZry%I$I%X1)_Eˢ*nL$I$I , KDlNajJѬG$I$X؊53C\4Y$I$i l`i@"bk̴mq$I$I4XSDlKa*J.X$i\euE!IDgKDi$Iʳ? oL#IPdf5`kfZ0JO\l:Ǹ$Is| Qzڼ$IE"c+ITl`iaJw]{$I*DD̍/S̋G$ ,nm`I1qp/_x+IҸr=Cf^ <>B%ILD0r$Ipw)"n)-12UI$]Dl |8h$"$XSf>@p0v'W$i4ËYW#ڼ$IT":0yAI4*"800r$I(r֪|@x)veK$x1; ~W$=X˧#+l|`%IFTD\Vt-$il!".z33//j9033{FPI4!E:Ȱ$Isz』V = y_^gwۼ$I#-3e[]]$I}6OJ>˸8$3f揁 e^>(IFMfޕ NiƸ$IS6@D |h.uGgozLf؋?EJ$Ef^ $9`z[2[BJWs$IٞЫ$IuT _>2 `~V{*3"%I(37n-I42l`M`1 ضbk+3W}J$ QfFiG .G$ Sd:z"F Jw\+2{>h g?$I#!"gQZ#k'p33OITt*ݼppWyNDL?)I42seDWH4n9kU 왙 *I$iD~XzX <;Kyjݼz8$IG15ǽ(۹&c IXHDT]ppw $I(J ~w[>#3̞]> tP$I XDD\ΚuϺWgJ$iT 8bbe 3d;(F$ "bKV`^3 *I$iTO 욙yV$IsV+p-Wy%IUnȗy_ 3CiVyI46l`ձ\MimվIzp0b̼e̮_JP_$Iy aFWGdfw1UI$x=pq/ffOA%I`NEW*nU$I4"b`|$IH:wPW$^E$J^n^%p+I :'T = *I$i,\V̼b$I:We>⪒$I]cU +3; *I$0Xu""Oi)NYqUI$X< -3/*I4ҼDլi^%p+IT"5+ؼ$"b=Z`NYyIA%I$Vl#3UP-$iy 8Ӏ_W >3O-"I{S:Z=$IҨ5NED_^1}ՙSLU$I/"fwځdU%IF__w&6$I54iJfkW 8,3 *I$iLD)++U$I^B8D[* 03*$I1;ZCf⪒$Ic8`̹2OU%I4"b `P7_f$IXq""͚Yp+I4A|5+l^I4q8k퀛塤`wJ$ilDk_S}]PI$iqp+Y;3‚J$I3%G`Fyh!u.*I4ּE 'n^}$I"̫oy%IcFؾZ1]b*$IsW̼b$IRqEDxyfS$I؉QxB$ML6jPD| xg]2sqA%I$X0<=3)*IT$/!1qWڼ$IALyçڼ$ibUC"U*Sj^P$I(^ZFAH%5""^ \L*SZ⪒$I;|&UPI$C@{eߊJ$ilEĦ:⪒$IKHD5ͫ60W$i"FJ'֩>$Iz66@D \ z(m⪒$I*Ĺ^_+ K$[ +OT$IR!3үgIԻe⪒$I Q7;T 43SPI$I99 #3Z\U$iQUn^]ULE$Iňhm^I5 "wπ)o$iypP$I㏗,pj}2sYA%I$""vnalv%%Ig`xWټ$IMDL.cM 8$I,X#("^|bh!p@f>VPI$IE0b$I㗗x)c< ?3o-*IbD)-ܾ\T$ 7CyUqUI$#"L+=tI4T^B8L94Ny%I&hUy%I0Dĺe *I$hvؾ03ZT1$>x Ed +/3XPI$ICU 앙$I !FaefW1UI$'"6--vJ$ /!ӻy{6$ID i^$I)6)"b~\QPI$IE{/o3j$IuK!"|bhgfWPI$I_塻3seaEIck"@*</3W\U$Iʼn&6⪒$IK ".gM 8$I:*$I GDl̫>)3VPI$I5%"^]$IO6ED̥Լ_1<$I$I&X}/V %3TPI$I?{/GU=Iz/7қTMPOA"`GE A:Rwj q޷3;W󹟷3s33w=q"2 2Z} NV8888Oޘ37^ݏ%mw8888N/9;Z<~!qqqq5B!"aWoRqqqqgl\ >6T;8888!\Bx9qqqq:Ϡ7`R o?;88881 X"2p0gz^Trqqqqm, btU=C*98888 ,,Z`'UqqqqF ¿Po͍W8888}Ag〽Uۨ88880BE h՛ڪJTrqqqq0h X"0GTi88884cPDd]f`xX5RUoV88 ̌}' }ˠ X?g>zKo8c=s6g>bXh7",p5t88X-,"ocہ[h= l7OIzAUr"3`&Ddf\m \ S:U2{Sg1=Dd~`|PU!qqڎWd3ij1ޮ,"Q{ Z83ڼ^ݛDrP 0XTU_JN?!j1`"IqC?ˁF88NW TEUT%U)KVw@_X88NcTz`c,W889噺1ƵX۱88g 2yuqqEJW2&m؝<M̳:U};cwSiŁת=.`K,|,Xׁ>FjԌsEȆ9}WUĪH6 U}±L0XgytGTYX0g ُ!_\ 8pINjP`SUHvѠ2رL=\wgvlNlU ( FU_1cT 7Ŭb>PGؼms:n3Q+B0;ϰvCSգ+9j}o%Ɵd<P8KtXe`g_g 28h9&XPnH^cTa߈t6"?vǼ3FDbkqc*` 6'3#z VadP5 t=6g5C&">Lq98(Z54xX 3dF_vK7%kvom{\3.=ir{nE}~SXx ߆Gb_5O&P-=Ϛɳ*C-ڴO[|`ϗ3߁O䦣CdK b|$&0g=/kL ءX1S7sdg^{m:mt(fd䆅46Ͻ7[0끅d3aFLW-hܛirMc a^lZ.?mkH_ Ǟ@ ؿ~.-%xl qy͛7o޼aF/q{8yX3 Ɲ,ڤϾ. *3O_^r/JoL0*Bo 3Oj{]0G~6ÛޢX>wO`[JWi1nd$.yjdR& v~QQ~8' 4>3ȯs'쫬kH3r G=JVy!WSԀVLax f4/ci\~d's4zM>ȍj">/5ߊ.ɿOa`Wqqg0u |#=ND.Djj]_3ɩ hD=&ZE»EѪԪ_7EzpRXGmhS `^^}̋(cl!؋ae|UD? 1Z"9 B2#UbyrQO1c_,X8qf Jw!T}U ,Q V5"b0 p3X ̇ 饹6*< !$O lڹDG0 pbVU\$v,qqZ^5<<ΊF/Edd|i \ v"*5 ,azYe {?Wws:Xeƚ"V|ޣ7d9a950ǩ꼪h:Ή> _**햬>zzttN,,oU"2gpsg;Bf&V:jEA_T;@\7'Exo̵\cj(J~`jXX~*LyшN=3;qq %}.b^,a3"w`Hdr3T IDATrVRC%5cdTY{UZ^B^LH^Cyyoz"['5jLzXE>|t "iEՓ*רұT!,Qj"r1YDED lVeרZ7 -g.`C,hynu7|o+Us888&pR!ܨ6* 3!"(F 괫lP+iTt%X*i[eB2 sya9D)[L:'><[{'[zXvja/1}䢪w0{8Vb_y7ut0GV?~mx!p~е{iZyzs]MwOdvSE y<w5~?nF X88:wp, ˍs\ $ddy n2؍Њ<OV񀹒&p'O*jӈ|lS+*&gts.ʋ{BJ=[@?Dy/r1wYyI{3"p<6r ڧ"rpzȧVV^^k:!v6dF>84_DDVS4d9N܀883 Oڻ ,p%82}w?RS X:~$zF񤲃}"=wSz0^aW\UR?l vJ YazFuxADŠf1^"rpp z{fFmq X`[I0(88N)~ hݒt5`7UmԫdM.TVUcKw䜫y.XDz= 7Ϥ--R/4̵4V+I{CU-PU5po쎅F"2 :<&"cyU9XRD6PUm%v ۙ` [ÀT5>xkkϏDdu,4x&O883@%E"rC~ݾ-YH4/N=XZSzst!sU V mH=a='רUr~VX>#Hr6aުae/࿉ڥCzuF""Y%,ptGZ\DVNTS7`98 ª Xc,/Uw'}Nf?;N`%,7UU_HT"23"rL'+Tnr3R!yrXBܭUlN;PuF}fT |AR&=WeH`AN[c+ϗ/"bφϨ7)B˖UuL\GL}2)1 6z֡oȡuZòX̣:ޞkWS_!tg`n`r7ݕwbJ)Iޞ\]80ͪEFd:+tut鯬E3 XNa n[=G,A["rt|}xBU*_oªj_e ,WZ̈FXޤwEKPQU'd+Ddj=6`58Wð<7 (T_"/jߋ$"jZŲ88/GDj,?ߥU= QD"fGFǴAʺ"2~Dnd0+|OduIJthf R\dM̀frZH'r`MZd>OdJ3%;i=3ŪU%\)Uuj&>i-"(*N7Pۢ]wW/qlQFPDŒR)5"U*lX8V-4x-""Œ6dx׈coyРW4sc%=W?Ed_q9-УN|,'Rs\DB΍V-""7`Kk} -gk UGR 5qC{ѪBch78GDzxFK"dPޞkWap;ɺVᴐ^Rwe9Z<̨dE"Rսtt_N-:8E/XkscIߗ>gGUP;|,m"+|_˩Ӱ_;LD>-r=- *0o CέG!JOCGRWaQwWU_!XnC1%" vltq3KX|CU'BXXp6]X,TU_su0 pIȕzf$yl0~F!"kb>c62ݥq,A5f("Wʃ!t#9bgXt2 %#-Л32+"?Tσaw#,hOZh KQ 7\x@D.&X#aMש- ;)FU q3XH>X$LrtڞGbùw>ۆK&}-"ۅרjrnCUqsbγPvwp@}85ϝ\|VcpqA<ۗԣPD֦CodEdvU"YZ5â^ol\CU[)048O qx6lti}SVHwuZ'oފwwjhbb<~ @x ɺ灯ucI]-c:76Y7 +0W]gY*`~736fS9J)%pO˄X`Xx{Ԩϖ%\ŒQ`ъc/KVcό"5@Y~q)y.-mn,Ԥχaǽ_c=NF}~PϏ{0w֩0wVm|=m~`DEµ~>ꍼkW<1m>\krR%lٷvznhU4B883@PBh̻b=`E#֙?_OOC'2TJV{kY{!2fԚ3<>͹?kqtʗ1Ϸ͍!VL^+ڈ:UD<6ǪL` 7m#' SMsg <^+7y|>w Z 6?m:͍[-V]szÂ\0zNAʝϖHކ6̵"eKi侞ydgJo`]C%CM= v_UU%=CU58=#T_S$YoiqZAȳ2#𙪦y>Z!0F& a=j vϑN͍.GDNVr$Mw|BCQo1\y| .qqgǽ>ch1.C[}wzЮ{Q3'AgZwj+!TYs%<n>gJ.lxs{'_BBu1Ԏ!daI]gÒŎz>1`qυ<ceCsh$v?hĒD~X=KwXBٖny͎1ׁ>kbVgBnV1=׾n_Kcua,,k5_'0 y /x"^ !i'~X1oŀEdG-Hrx 1`/գaP`E{63xN͡/[tX܁%};gkaJ_F(`D퀋d`ǻBZ?4v܇MYsbU2џc9JwY)"ǩOyce 5u>5\,-X9)p]}31aվGc cXb1#jW|XB=EdK 4.S<3,r4)88"r'rz897<`W:=`!X%_<3솽/bIΒDZkD́wyZ}⁅y}dSE͝jE$ 0ka{&{yq;`v}2v _9cPQdܡI3܉w(-.ԗ9̱jOGO;+fd6j 7 +&_9}Hקbbc!z+c螵>$64w,o޼yk-zR X{[+[j NE2VU%hj M^ aR]B_i~6h2ԿXO 3Ap$ W9rPoZ9zzs dcƚF>٫~s4-~`D>DEQTb}MgKsdǂcKh~F}x~@}̈́ 9$h>~g12 dP}cmdwDipX~=}F˛7o޼Z<5ic§c^/`?gߤIJo޼y돭 t5`U5`mZRhgsmۛavLm2_K笥,,4)~y~d}&5[5ѣGI>^VoΡxKH XXhTd }ŌYqͮaswCr\۔yV54`[&1..f}m"c>'KЫ'[UOU,XĀytYB?|Cc2 X޼yXK /s07o޼6`,嶒qM38u!c`_Oi"sU`+!"kb>3nWJtC튻QU,~*67}iqSb_B~^?7XUƼq#dUYUQEKc'b6WUWڤ8N/&q? #^*7"2W6Sy ܍OH|>LU@DހjvI)dy+dEd[U7^Z͡4>M\ߓq~ɾE,_SJ3nnbexzVXΉ2~up$=4w5QU-!]%*ΗeMS;X˘;QD\[29^%H#qq)ɠ7`XB+c./"r4V{з3$˹9P5RR&iNT2K~ ]-`7ƈ>zCߏPz=>ZHYJU:BX:F[DzoP>\ "2]V=azzއu*F!^wW#&=ƾtqq$ހKDU~t.i* Ka;v$"k` wkD{VZ.?Pz=^n(~."O2wH6UݳEc&`xqT'Fv^/6}888NItZN""ÁmUctHzFP1 RTBXS[QTp,g(=B8^D@gs(E-{Ty4n_8^EUyHPZ7W88dPB{dP_dBEch/TUQUw֦ݴXaOOs( ߜ3:I|mnM8]RY9g888%;r IDAT!NibN@HhƢP@U'%|DMi_`ֱzb}0۪t];e+o搪-"OS܋O/"?/-P6,~F"*xƚ{+ +YID _Edn`TU8+Y]s"꽒&"7$"V,=KOG}9t"(""` BU KLyŻTbün2+A"pc~m&jtnj/g+Uu p~$7/[}(i7Q՛yHDV)<]OKfϿa=Ev|lUp,tZV!" { %iDd0;4qLs3 X!潔1;<`T0KUc/_ Ȏ؋v*=,es ^|N13,ԼWmO8iRc 6@BOb^Zˇ0\(jFߔ m7Gi`xY!Xp GHa݃a7qYAD*ܮw7S+UlqWV[3yDyLDmF`[gHdFUz 9ɂg*G9$"sI"0|wu^EDE"B)1G 㴉^!"c2VLD8']NXÀU'" %cGU_Od(U`Ka`9$xY3>nVVU~!]3,إzKDfƝ-lmUq> l] DdpH>P_U? H>pMKmg]``Lѧ-Eh2!Lx]y < "_br?}$C],G+0 ܇}j8*cz}<ig I"r3\>7r#{NcΗ3`PlA}aWS?n!,+Ȭ G%Czm ȿ.<ɶR0Vd]=މONlüR`:H3Xxanp~?^. >X`+u*΅pt.x׳m {!YH¼v޼ n>cn(z&6#.qvCaNӦcA2ONt?I{6gL9\N+omXڈ6SYwamϐd?vZxk:gԇ\5mS*vz,yIWYC{?JU yCC>ߏ4crzG05yHd!G0,NdȤد:`/Dbǩ꿋vx[b/+PRb~1URc)M*bjs:/뱗1CrH}UȉcUJ} inrqqqq4B88ӏ9K(ϝ, ̜3h]mT$wMar5$Vc3][b]f!*߂}̍Y˛8+y'pNbZGbyGG`i^r3XJ~ z,L}^Rջz0Xu97;7obՏn^֠XXہKT.Dd6j S>PGYX}VVkdz"h~"43L=^nk4Ecr75gZ+6؜H*سd%Y2 VfUUsey͛7o޼u;R_ ?/vNq=3֒X2ϝ{{/X0HCV櫆xnL=qq7b =>'&}fp@n8pM${fqwKt*ŒQkO3dM=0i6OMh˞98'qwq8>ω_Wevjgke%3`̳iU=[ǃb9tb/=Edt;F'`o,knvOU}+o^2e f,cy5BUౠ{m /LD lpDj+og[/^@e7mmUQ~9U}T{=߷CDv:YUj$`ªy!oVKف `dzӕ{y[Dd`hqyjy[`jh˱sc3f6'99#ȺUt X88 7}EfhN}2\B*l% x8I 0/*(y-̳ 5ojp`n0#Z*MەPs!ŒCbF,N M_6\`4U}FU ˘ %8VġUe ' 7WD1U} z@ zYp4~F-UI_c^`Wܧ,qq UvB%ŰF 473~À5S"WO/Y6Ƀ D4WR/KhU^<͛ cɶ*O(U}3oc0LjvHOk(UI{N̍yfLNo"sK\tlcKqN|@>M U`_]_⡀B?1K=*g_JE?AhՇXfy Q,qqElX̓j꿈 ^Y૪@O%ƨMd% Xɤk({&<‡rQ;U\UKğǝ%dk6oH݅r3,U҄7IuŸRWV E!*ݖrCl(\]DFW`M,D;ɼ\,o}:3"R½Ere v f?DDϒ!{p*,qqE0l(RS k%d0U )ٽEEDVmE;"r"n*}q-'EtV%^!b|3Ox!Ynt'e-qZ}ߥױQ4CzͺCX座 =ԧSI}C"rl拨rjB7:F_+qq "S QDQHcF"OR"2OXDfB}g1K'ŒZgT,=wK`:vEdFUȧW1dD+aJT%eHuٖSEd,[m"ld|X~wE\ Uo U{04G+ X88Qil=rM9A\N!wz=FD~z 8LUo,% X`yDdY`S@,7tϱ}jm$=S>?N#Ro^F﫿>x +V=8_l칰0c"6}{0ϵL=ePӯoqq+<V턽< "`>EF`jCSU Y">H៧bW[ZU_ΛDdfkow{~-" ֣$⛪ߓ[: _O&5R?'4h^CU遭0i"ao0C[޺kt["<88$64-,"Y̓ZUXg(}>&pw9R!"2_Fס%vRTuMUMWϘc:: 'JV1d$MJUIU."R_ͮxyTBf"EU'hU<x/;XDVm{p ܃~8%q88dTUjvd x`5>N֕}Md׽STݴ,Ϧ6m}/%U XU`ױ*>UF{߯ᮌ{"!wCFzʣSF*`_!%Dr6_7>Nr^ٛ8GDJ.L8{G˞y~7q}3"$\X\=>kZ" >-B{(g`J+W襸 mDd`%UHVU_SkjU ,V,"ea'+TD$}TD4K/"Cf+U{bHw;̦e,Z=18{W(!DdxɆP=~."(%` KtPj2/sgȾԊBUoo' X:l{%}V!:KDbUI) 6 TdF8-,Ypp] XSK~%AE`5 p&+mŭ>iT.)y9z>K;>JPƲ;{b2s LJ_{S `o-%M؎>Տ88Z7DHUmZPDVƾyx~("P3H }_|wawW !Xpm{q()PPE Nqw/ 4H A%rλw&{ywݝ{wҲ Y[seluYD6,ƨMnasr"21WDyuE566߳Yr?2"7{cYζk1#OnE,S)sc fzCD&;4/z`dY?͛e/ۛ:+<(~A-Ʊy]\Dd!`[>ʨx*Z ӈՓ 0/Q-?'S<z\B?`S}XDR`cE;]QyoEؼ6o,'"8*+hܼp)𙷽,%Xq mUS^y^TF ꩪz*Gz ?>l/XH Aޮ IDATUu'U=_UoPAjyyG_%c؍-85'DdW9ԕݟHDU_s> 澔Z>82^ ^ .]6 B,"k;` 0o{/Y.Q￴{a/H,/ڂ^wn89:Gz"S퍀K|no XxyD8 ͐Wښl6o#}^&9aQ29)\AmOnY̖%wuin_G`NKċZ|UUE䌬{ pe`At!Dz.RG(&b /PD!F&UnŮ={s{D]ZK1r=+o R ^TD|+c6MnP~#"s'_׸cKEd+z|CUrufbZˬy U-wtyZ1!& QN9~-"c $;ŵ%[x-ujС>y @D`/oŠF8 tw*gE"4\$"k؅>e{/=yonL`6yl-W fb?E$y.n\Ug[oomTuSPc F{u^R ]梢 2WgVֹ9bEw "r}=b*mtLRUHDf\oӁ'\LXr]G]ʿg*pZ."av|rOS}/Ϲ]%XX @ S2ƾNUBk>Zm/l_A>T5|RoK}<-.o wʑ[X}޹|l|϶?Ģ`JUjuf+Is kXy_F{`2܏M='Jՙ`g|/oy XɏΑ3~LAlxn i|X!:Qչ`-rJ<6徼 Ľ[(EosdNcX:)0^:38g.*_L}Pgz܈)6ƞYk6SH4 @T5 pDdN(2LVY򝎈\DUgkgz:O.1(D"H$#qD"rLlǷH$D"H$d:ʅeZ 3F> < LLb}mȢX9|uc?b1 ^8`a} ÖiwN ?f!f>{snw&w~XE,9ջs$"X`Iع~vaV̌|x$0^_`.bvÀ{m< <{`֣w *:ؘ3 7t10\ySU?ɩD"H$DMp9ՁG6 b5U^icY'K 1nZq^f(AjoA̗?-fRNfiGr꿝SoTFǘ%XK:5sq~{nNPw,tֹdYcYSgWh발6ʎ >͓A]cVfuQq2L~XL*l:] u

=a։3ۊz_v#qk=i,@,J"_Uk Z_Þ$uXl?)V,X-EdUh'UaVݾX& DdMU}q p9KRܿz~;cVY';ȯTmO)vk Yhz -":O/D"H$3+p"^^OnUӐ~@}7?aʡY13o)ayRC 11Xf=)j)_Թ:E-ohsbyX{uY`1IkGU?nv"[YLU?,P`{ ?TϿH$D"HKM}MJ$aA,vQIi3%SZ E/%KsߴHS>,"}҄Ddj,vq[m| pUja;0a^,wD$MUW]Tug i[PmuxsY@}t.5O^[˃MJ#?VދF{7vMu;s'D"H$D"- ,鋥EQP6T>Q$S֧\%.Ypile Ɉ퇲eo}3UƢ 8-TՏZZ]"/`{rqr,["\D3R TգU\:H$D"H1L^[,HWY͔9[D0:n5* ]iܵDd2FǁvkV#("ySd\`qvWb+5pq߮yr~Ap.,K11cEk}\OX~AkD"H$DH;X3_@E Mb'"JΛȨ׳/Yuʴ_Fedh\-<]S1r`E]9xOD.,5Zyc=~*]Ѵk˴LPik,;Pw{xتF"H$D"6V`dP>mӘO-fjdگjʌ2݌Uq U_Df~ jɰ쏫j.@ZR^ɶSѮyn|w/W%ʴ_F"H$D"6ю,TD0(o\%ds_U}nFTf-R+ӿ2݄fPU?UsUu-`pA $?Xϸ?ٟzh<9W̖eEZF>gH$D"H$Fڡz&ؗ!.P+!fE|)E`Y׿5c߸ c` _VntTտ ."sJ;ɢ:(q.gt͠ȱZD"H$D"m , `Et"5j7r O>l0ܐY?[T"ҧFhj_ySHZ4fF1@T"Õ0s#"+.h'{*`2ɠUy,4ϫ%Ec07N(F: "RKDCEd2}D"H$D" , ۔%ꈆ,+"['S.:nQKurYq]kըx`w~4۩Κɀqw\YV{:;݈`7Rب9To]?5?ҮysecFD"n۾4SNN >~.y]ȱ#H$D"HXühT:"ol]Oؤ`8F6Y.^'"*tX895%O[Pq㺴F 黜gJYwإ@խ+U5]6"Vx >It`pV0kY8 o=vKLܹ&1R J/.`^{fLslt6͓0 +Dd4p)}62cTg ƧXS=AƸRFkcY3PռŚo8k bq#NGD#0Eձ[F%̓Q:-AO?7m}0E|KjFD?\,{4"[6m'ӓ,Dtf#eMDfyXD֯%f!ӵ?6ڶ숹+2S{2 h殜;lN:>_ǹ.嵳{p` {Ĕ70ګ.R<1 =뤔]Y} Ld^y gsxu__yŔ W{k{<:wZz|)~%uSraJwܷ}ɐ]/k34x^c,0YU0%o"1LFmp}s`N'>A_ N7_c ^/#܈7ǣ^ yi$*+S^f)y̔e/TL9Gv7 l:fo؏%V3}Y*q*|m//)j@Ͻ7Sr}/ t)=}>Tݫoݧ:ϧտnhsf ^mĂźMܮ@=O --[CV[X {X61˗)rڻ2h+l 0Ye:ܜvM&뤌-qEWRڸxS8\ـ' \?;'rdVڽ=ԫsZ:;f,98nΜc]`Ww7)|m̈6 EZ}Sﳏja[{wu ,Фyevwlx_aqbe= i]%;u~fc'3(?d_LYJ)\17J_v=ݟÞ&Phԟa_(BX=1cU{Ik̈TJ*vB}T`5^+]X)unC lw}Wip>#ݧMW`a18rvsBp?sXQwAEEDVKMUv{#4+ a B&_ Sa|T@&7r#01Ѫ:*TTUYXA+OlnsYm" p8f8FUowϸ+'yYNSOݹecvLY+ :y~aiR㗩"<] Y{xloB͏B,֘Rۊ菘?}4!"ar (4 ~u̖uy;swDPL{Ѝ)>%"`֜Zybb=%?QDǛaʽ\;a Ec7,x:9UL_#d/̚MU "(|E"擖hM[ޛp'Rt}A.Vp`kIURD2WW٧H{&sS6 S3I m>L44TUȭXlc*(J?#f a s;/D/^{dMDfb̍K |؎g3;ɰyeͭءrt1cn vJ+"6 .ٍ6fgŔÁؼ;=6^ڛv0Ef)n#V""ObJe[TiJ*9{0_^w"/ o~-T2QG& IDATuՉrGK Ýۖo'@Eфcm=YtH,^ۆظ_LU:)U3|`n5JUFU)ܦj6<ȻL%[3Rolݡ6NV3LU+4Xǒ̄YHFnv}!6ˤPUct:@;a]n߰4iǞLY;` j׮V9Yr땼^gkh`S' O} 87%eW;v7y眔Wcq < S&#OdNqop#H>m)(u%z19ܹx25>X˹ S`eXҲZe A?dȽXgk%Z`E"HQL<,"gb_ܳaAd7_j "$Dd\Nx [?|YlD:JY '4Oe'eOH3-=-LqJ60v*yT=.411ˬ"f[RrƳ^91z˵=Wgv.YSUu.dL86q,"-s+1(1eE>eA"+ͱss`6rp4f1,pvm!;ö6fUfu~%"bY nR?rb7A۸1ϰ*6vm5N*"MDy(\/>KJe(L qP=ϷYx\D쌪/al~QDbv_YH>SN/e=*gol,FQ=?f5\Y^1 Sɭ [E<ڭA%Xbgm=sU_K,B 2dC뛳 ?uP&Oh{trnq7~(po`1W7J^0}=فks1{ )EnaL5pkPXhWg(00Cv? L!;9'{dNdq۪\穔VM>^E:=8T\+S9)xr7oVl-JK,S8yǹSd=s(d1{n2L)ϣFN~uL_#[+`P']= ~9˻{_#[_%8`f߻I H$ U}RUY}-wVխ"H:":pUUUǧɫQž"Mlwl+U}>97UJU/d'\UŬUyl!(1˅ TtU;(U[@&bd""PiQ`MygELaq7_ *l1f~Q!]P=}ǔ`_5M#"3bLyR>YʵWPU[UAUFx6.9T[^m7:AUmpUVc(&fuֵs4HN_UVՇ~FA w_T,aU}r5q1ծ^<ƤJT`E"H!;z{1z@őH%w?=N!"h!밷 h[,uUF̚l]Cb͑<<$ kNkx lm_^Y%!+x(EP 2dc$~W})uӸ(^D\0b0\}Qqv uN,d/p&Q慨OSb;P;555ӱqVDdq+i-ܚч1+`.k:|tH$D"HADdy`opz:Z0qC:4'ەSQD"H$2q0O]Ha!?U3(z ,)"k`i7U("u$L\s{X砧'#R q\&"KX1I0D"H$۞#K0Pv,͊?mm!"]OSBekn>fRrtm:BT`E"H$L<lYn(5fz-g2f\"~N ʾԋ$P/Uۢjo[}M$|f0(y%gOb6>nvz&SDnr?&&ZBp\ꡭOdDD֣&nU \˒kF3FD̅2|<H3ٿ(Q7TφqMjz\(kJ0呈,vM͓/~6 ]Dd#`yaUF_>px,ҏb-`^U'"r{W,\GUu'k^:XZ,ڴ,|UN5c Y ^HE9XmotvwhbEKX"{UBS̛@S`οj3LT]2UAM/F8 4\g#X"6w[H`+W`oGcc. hGgiqZ͓22M.Pn VTʶө@T`q"rߢnE&MަXEDW\ĕe5K9]8Ei)`-q[\DV(0go53 (Xw`E1)omU`9B Edr`Zt>/vV`-#"KucsM؍ ,e['~ns>RDZG""r)iSIyp*X$"Gjj7ongȺTӱ|Zmu:%61 c7 g2VkaA)#5pofuq_RC)45Tέ#pڏRyMz=DdS,-wx}gp]D|/FD.:%0`/'"'屢lAY`"r6 a?rܜߊ,` n{G}#"sWB""St?~"~oM-"!5n*"2ۼbnRmד9oӸDd^US7thb ,U}MD 3cW*zg]hN5o~7`9*DUmO+֗XRKꇖ~&,A[Do&~IbF_P1VZDVCR`lw%ފTԽ1`l=郥>v8q=z8zXPUbGQAـۧ;U:iIEyu7Y t}4 Uj߽DY"%Ֆ-Px۞ P7GDǞN83 ZZ&QN-5pdrYcaj,(ľ2qj0p~ v_Ubaֽ{_]Se1WgZн[3*ݵS'\ySn6:E"\T[v-=7\&튁u' "_S(E Zc.^&c=% s7l؟!"I;TMXV0"5ׇ]̙7Uu )p$<S>"0{6<`UԖ:TmJcÉ~m&} 8%Gꠔim mf. ~7{0zI"-s 6؇HAU)tWggxYS^.Yތ0xZ?NV񞅡z3+Zsu;z ]7;"r|oBU_az0C"r00ԉ&cOTuߞ}@WE$֘gsO qAU ]fp,fD קƸU*$~Z_HR^l@%IH*k[UU=HqTePŵ%}^{oxNnwzR,S&Yt>Su q_kkaO~|]sj_EbJq^_)U^C2dd./Ц/lm~!73f~PˤS0Ա)Ŕ_vԩUw<Κ^ "x+`JZu_\ȯʑYĵ9WW:\ŀ q,#]mYLS ;'kcc8lsL k?f5Emk\wJ{{L7bcX<"휖Q?֨? SfO݂)n΂Ԃu2+]f'`;Li4&z> "iAK,l)15jMi~~I,ŔO?sNw1Z'#EdEYpzM%zF[>ݵADN\/cJU *rs|Sբ['ei[s[Zޅ07~Bv#曪F:luST5W("R GKfש(OPյ#و,؏DnS%w_l\/|,P`U\DP(5NUk&p~EU$Nn, - 0ITiPyH' vᮕ͇= 7_}RG"K;'DܘBSɸxvK3cS%LX:}>j 7YxnDZΦTϋE.R h 8S^tTb8|XSrē,3ˡ{(nW?sԲhTU/6rmN8v"^fø`R:v*;}>EONKXzR~Ty Q1 Nr={sivl33W; e-H?9U  +,4 =WDf=/+LD7c&_bn!#`5[O2fjm&"{6͎섙rA>V49֤h gf] >U}݋D"H$ \P𕁇j@7cHn&X"r8K7gEd;U-ba1ADn,"wSYl"Lc׿&8)Y !"/P2Ek38 IDATYwd㸬wKU}F_VT՚5,kKZJQ"rYV`A9xGf8Xs_D~h%~ݣ=L3J4^]r#2\ ޣX<0:F;ǟ{={Tz_&)3aV_KUsƔX`!y; h~Ջ̉&O`9 o9.{ѱH$D ,Ր; vz|sDKvwS^= -6~i)zZUORSTu,U}N7pdSlSc>t͠5௘K?`%籚{R93u={4ˌX¸Sи]Uꆪ3Z?_]~ %TS^ lۑjY\F>>R)eh UPUaYW|k4h]%/k"9gePY ؄Yb`SqSZV!"s`WXzTϪzAU \'馐S\ӊD"H$R);DdôuYDn:ުJzDJ1Z`B=N2TDn~Y1 KDR&.PVUGj9Lx<ҕ_{F [=`{)~~{-p&UϹlsG #.ms'NUL79'៪֗wݽ 8Hê .[AdžQU}X`܎&Y wc楪_%CS;U+ gselYnFDb lL169ˍ}߻V "b\;j`J ])bY1Tu|݂Exۉ:g7D"HcnȫXYG8l]xE+;D1Z`͊}Zj]h;3ؽN61kf*7dA`@ysM#Z_Dͩ3dBD”5 s m5d9QǯyT42U \e: ]gif( {w9H77U}m.쬘Xp7Pc9V[#6moR^y |mrsL$D"߱ߖɚg,c `D:IUpf_=LN1㻨} U ;cP`5XRgYn[azQ9rec}Q}N`;slj T{]hEU F7Z<XPDnn)Ύ;t WU,$"A",5 R<"oاH$D"-@THU] :?{+,d̺:ﶱˑH oAuxw9Rmm2fU+Uڠ1WTe˘ٟj+<VjdBݧۘՏ:ۘOn:90gYFTugU}\I¤JBh;vbu6]c5UGaVyC!zX N%;bܮP,ޑX7]Ɇ-XUy\lge D"H$CPq>75zdD"ɤ*e?ϕ$B~J%vEskCjel4e.pAlo{Vryt›/8Tiڝ&+f$" eUhcA|`9Ϊkj?U]KUTRMݲEd9,8,:=A[5%4iH$D"HLA?0ʢ1Z-lO2!t[ʵ3CQ\v ̀5TpnI0϶W31wiPƺ% g;H$D"HL $E Fu2]g_js?hXDzj¶&f!f^LDVա.3ZhVx/C6.kWiR"H$D"HKTX&\ g'TXӹouۉ%Ս":* ,0+Kz.^g-Q7 )s׼ 5Ab. ""6H6I0qdPJ=2˳\)Tp;9[ȂT2 "T"2 L+"sjYp>. mID"H$DgRHBWfu@n8R[C:cq8>]%UxDrPՑz,HWeV#7j"үD~,ﱌ|=pL I~)[U\Rޮ8T*Agx]ܮou$D"H$I!*vT`yoצnjpPG,~VR"2PDf2AsX/}Eh02ʎH TUU=s!- <vhStUz;ۨTe H2:f-Ddk`]yI ەg26"`8ϙ*άT[&O(F"H$D"6X`{2EdwrT$!;JH) QP@TԟXh6 X& IH Ks{ߴݷ/~>Ξ[fμ3F՟M}0 غ}HU$Uu=E>Q"N""U"Yh\7.[@GDF7)*^T/s㋕VO?xty!{ 88\ng#"+DH0`B''֏0e[R]Kug[k۳R+_Dkѝm z`Jt(x mUDG|.=]b GӰ0^Q*UUhSTc4+"G`J:|qq adauCbU}s/K4+_n(h34ڴ&Qܗ kWI#3b+ƹ ĝ FԔ]wU"n>IYKqZ|h3'")"Dӝ6r4kaqʈ-$7-s-`P}3NY"2 :%8"/(v{~ȉ%~>"2t"sLC94+[ڈ_BZ06ЈNڻBZ i'EFȨ~"2S@8D U4[ռ NBS˴X@?>@fOz1&Tv,bF|8gb-ER8 eZZXDd#"Pû=DD{EwSMq3C(>vq^3Tܘ^#"9v"";FU}H1XFF}Ema0gfdQ&"G'xnT40".Xi|uD$SY!iV^7i}8rsɊGEdH,z: ׋ 325+83nDz꟣9i6d )WȑzgNc1Qv^YQ),?E䳱TDĔcæk*=REd U+W3ods|_wg5FÊꏪ6z\e]^DNToF}nC#xLAIƮ,A }c*SkzmaP(2sVNdtg,ͿIN6\jveD~2h]x8C ?v߁4_vTg`Z\Vϩ5Xs ƜS";u.Bk>%pU\FhWjC2juocpVA06S5}D^hUdFjy\x28Jfݞ侞q0d_oq$|>-de68+:t{x(X`aQu3EufKe\]DvŲM.eL3zN8Us-E-էE3Ц_x/4UB e;JUncPo-Ĵ4\[,6Uuls#[Z3]Բ~SDelYMqZ"ޥ= ;833a/@l??37eT?[q Q-{vz,=4̈́?tubN˄,bFǘy5ZiE12h117 lWnZ!Ca> _ }<ަj "҈}EW\hRDS·@s|nZq'CD.ϩݜӓ S8U> ܪWɷ9 EU}_WKT/E}E#FdUk|85kP,-}EU_c= `˜:}Yךk쫫;( qq* gt{U}P$q/< 8888ӯq8888ӯqBqqA,l[+!}Q:Dde`n߈ȜX5D wJ_Y0"" x ؖ"2 v>24^LQ՛j!o=`/` `fQX^mBvXL؎OaծU+(;e ?±XludXe\W`!7R4'l@Uoi37RAWU ',%y$T6!v|bO> \OVǍuv9 aǒKڡqf6ż4ŃغłX\chNl\VنkXΑXGWص&v= ^m.d&m#iyBkcM,jq.dÒ%oŏ}(;6mv.isyYSMZ5ϧbAӿ̛G%f9}*T, k {Y!5uZFwV$A6𧒾>W!d}.Gb3zk`!5\ s)fÎ՘0tC#[3XѦ/ak]0Q+GN Bl |f]xjg^4:˰{81k_,z\~J?4;n[N6= s]Aŋ/^xҙdo -=HfR`v )\f s#w?{v)8@d.V92!n]<dk~>,"x`sS*d.F&`:0O$ d%~h`Q`>zXhLŕDVo~\^R4߽Dv^L٘~'s)܅cׁsf 2'm*-%m)XÀsH砤& ,łD{4[ʽ1B6kw0@ˉ}q=y xŋ/^xLz%E$+Or]1҇Il+&VVs^[P-\ ɤ+=|,B6V ]0JLAJ$8AX&VLVȧ Iے_d%ھ^8wwqc)p5[֤p^7,:+>+HsY- sW~#}XD^?\O ,U2V^T!/k|^V`M,~X"\2f+!0{_FTY2% UBaX\TuflRֹ,f\V:EJ; ls,"S`]T6N EBro" Ѧ70 RT0N"HUXQOhX+x"?K!P㔊 +͙.W\_ 5d+ l]U;U}UwhVݨYe|Bi8UU eX,kѦ@ah簘skjUgZ ,qqz;X!rR_8WAP /a;1 2bŒ.zMk%"aAbY[e_UP IDATOlAVv79=8p`nhamuG4|ZűX2Z>>/"uWA VY \mivT,Dh̵?SzuRF,2W*#]#l8W`98 RDd#""`AcF1L^+I}2aUfÝ҃5~zzPjO,.NFafIuay0n0nQT5UJԡcYv&{sIɕʧ>tkӂVu`qbβW3m<""?Uۜcԟkm+c0p;NqqXZl8*s/DU>H_DC5؉f}B,}gX",Zpqy9PXΑ7uf<-ݏtUheӂNWT85=˅MI98M""*['/B]ۺT}폡9X+LqqgM2EoDdNzT#rbRWd2"4ssۚ=?C%>[ vxOYHKwפ^ΥtgRϲ/GE>S|q xHWUۉ˖G:Nas+Ƥ +3q͂YɽtW`98 B!@4 ,+`A2!~NˀæDdU}9f/L^> l\q Rm/LFFKUݚ@!(O/.=MtbKUԁS+ [/Q+[h?^14qqgpqR?f+PMۈ""23 9Ċ࣪zIn" َ`_uqiU}UUPՍE?I"Cja8T>UHc|]7g ,qqA̢ĮC/ϻs@4=qGsEdH&UmũܔC@kGUPկќn.` qWRoE*E{qs-V%"KH~,"+w{} "XDN  ۧۮ/"g |q>ctRFV\ŅQ}P@Uk!hr즶,D}0>X>/m/ȭl5fs\"hKvp^KD/"Wɪe:00q"!A ev].VȞsk1|XĹUiE${kb ^^SDd`֚ⷫ%}B#o꿓m@9"6+%boȁi4-8+F쟜83yɔ p[En:AU?_F V\>π"W{ \|'{V௽KGQgB¦E@!!71WiiĂl-"KU C짃}7~^5SkvLHpo+c_l""`qi,v">UPD ܩO0ns氜?U}CDd{aAp86qڧ_)Dd ,nour,L 89iNǶ@Q`RL{@ .ۡS)r0"Z Dd쟬MW`?&b?ƾ ,5NGya쟒83fNT+tG?}zK/)hUW="YdmnU^+:ߧo#>)o>FU,`^"_~?UM (3VȥiU ͬc+^R)j߅MCCQő4:.|TapBl>"""c+d e a0; S^=F"l`ohbxbMiox/#˾qW?LܮO{_E_d%߽uo=mZ[›O0%տTmUWz XkV({TU'Iy8o9GHcDf}>,qULU}TJW5O6_4iE>Ǩ9@l\FDvas>^d pH@+oU i0:?2^@:o*XX93q?RUOls'h[U L گEp 쫪g3qR0%υ˪a[֑o2,| n-Yw2, ͆4܅\ ǩjr,ovEm`ZȧiV>U5)4P>,>CCqrajh`ް}'oаZnٽ:,K]|Ph-Y}['o-ii{u~C`JgcUuRx_q`Tg9̅)Z2`N}iX; z|gF'Q/Ӱy<|~CUjעbC^)byBQզ" /a7Zڎ.%`oՀsbe5DUI6p|`hYGM.V.aW՗>{|!T_6Sµ]̻9FHi{qtGDXci:NU{SȑXx'PE eH,ٖzc8Uz,4}j/+nD =WoQC0[9}=`^CKo۷h5LLk8?Ssd_&lX`?9 ς)߁S"soy)myl]a?יo>&R`jGXŅ0c[1'ސ ̄"$Tu2^.8Nˈj4A17_U]J)GD`^t{.UQ)ݞK%mVwO#88 mW>CU?(ܪ+ ǨU:-Wa~Z nƙLP/!"K~8$7G_ƖImZ u"TUEZ,+AL7f=uqN̄u r f>Wڰјq3YUդ[p,¡̊dfjf"fB 0;WY>q`0}ع*ވY·x kzk)"hϋUx;)"3aKc}nq_'ogUqq;9Ѧ^U'ȿh_F{:V\Ll*N)7P`-&"+}1\N ydJo]2N_o-"y T;95#1G6( zt ,O*"M>c,Dd ̾z&"bY)"rf zsel7^Bn,[_T代4~35S;eM]G``LT vDB cbB&Οh!+G0"{ 0e졪-OqL+/$wً?qqA@7-6م6GO/ d Oc|"ޛ8 λܗ7rvYKEނYYdm?\#\Y1Kp6),50ER'@ c {uӗ^.lzSP=_:Sʷ0%IQCxzGb2,]8QDSղ{U:|X҈U붉.ݯ ‚ĬRo/"WO|Ob㣁EdvX"Uvpk̉Yl#"&֔_O88JoXURx;"ѶS>U~m)R:ߊ}98e}pWO^5:6sIrf>gƳ2!jsM]Vf>)po.p<}.u1Sdl*oVsΧEm> }I4C7*e(-y";tߩɱE>~ feDh.ǂ)\35~Wq6,i|q|HznÔXuu|Zan_ a4roEڋ/`5|ugu{^xŋnZ`-'ځ>%"˄MñEd1# >f ,]!קvƹU}[D;FpP7'uۺ@.{pSU__X/Ě)c0=S.<^>/ܲ:4-z ,EP$~EV~(>FUֹQc0VjFEp~U s8DDbØZ3EUIy=Dd.**MLVj WU=>U.&?Nڡ4JFfA4 6k gG6]EUֿb.1lqR{TqqKWXA!P"ʤ@' 7Ff$GDEt~qhGکDM+c4{'Oy 8B賐8;cZS9+fق7}^29іq f`eUZ`jGU(jiWZ&c.Usx i0wԌ+TxŤ r@U_(2!VR/T$8NCU_W0-bC]88][.SoR_"9ԗE4JY,F6 <+[$2c U:%uX;SSzCM٘O,FmmMI]Ze#M)xMTp.vP0=o9T-𻷌>N\TW}[ #LdP'MG SmBa5eQ\Df,rj~2Aq'ពqǙkdROQDF]QNc1$aA)G Vk݅@; Tu|5]IRBTvZL!ZH.'$"ñ1=sxnbO""õ9U;\{ \->ry|zo)u1'z>4COV[S42BΌn9VkZuqqg-[ȕ+25yJU}XD,""+$[!U"U`PiBRY1Y: גz}cI7=`-Y@>M`T4ƲXV¶Q{D UD,5e]Z9JY.k3WDDpa?N*D%88tnOvhﲙ̠zq4?n< "bޤ wX,|ԡ4`hRuI7 , WkuJ,iy{6@L=5c/"b1,}|vsRyJ;aVz^w^etr:883>sTMTyFܓ0Ed4L\eS4 3صRμQbKDN iFtmKjW7qՠsavgYyk`Mj_kez??`. \&"{ N쩭9J(|Ҿn5NWqqqE5,W5ќl+,`|z d+؛LAWN=J*RE!"2J OQՍ19qqq:Ɛn RAK;ʥʧ-vl""bA܂i٣ϝ'͟+9=IHIC]GU?TqE\)c.YCF:υ:qPq:ֿ888N]Q`>ZaeTȂ^z*z(Xp8%3QUPw$XcY IDATC.lFM+z^Vt?_;8`'}ѦDdL ];ߠgws>A!],XU;qqqAL7XW':I={|RUgQ[QjYUz0Կ+!"V6ݦI7Y<J\ej=$|Z@]M-GڴfT_O`!}~znQ?6.";ɋ\4?PMMiȳEDW>? Dp#ܓŭ@D +µI]k}&&=c=ba4#p+?FD~/aL}87c "s%ӬP=ND [*>o1%jL,ZPz@#"ȯD>Z ,BhsE"KI}f_D~TpGic[*$ U}`1r/O sȎQaUM}mYAO+I_OT@>R ,).?rEayDDFcDK:0B<0hX1 /E#NShh#4ʩu'D$ v6)TL&";pOt$3NUM~7i`;8"l |ȽMUo1Kq"wj$"'sbSJ"3?Fy=,U52,y/"+'Ǭ2JeU}EDv\\}YÁCoyl!,|)6;?".85wtnPד>Lk* qo煀wq.#_mft"N"r 3EwEUXj aI1s?~F$},5 xuϧ(+GWuo }ܖY,Q9~)x./ovp_%Xl^QoԜ6{lsJ\7&$򓰘Ta y:|YRsλ8wĔ7u6k0Wl%]O-aXzKqQ8y8N~ya8oE= ځ{2Qj?e":0G^xY0eu|9ʨߘCO^F~CM=\x|j~sӥX|5l:[,k\ZuQ} +ښWLs_߁=28GjbIT]s"+0` =!RL1t.{GG ^qб7[")d{^m{z}~fkCU 񯾊YUYlY%>? }+,զŹ8N ȏk孜,eϖ3bNa/Ok (2.|A}Q "`1^\M_6![Ҙ"of m+φ,ϋY=5 FUfa 0'΁el};OW Wb#"U=K4ǫ$I \XW kgUl$Y'DU},|$- [=Ḁrr~!"scg켆 (`gㅱ*,iOoV`͂_ʻkiyر=x•ZDfͧ9BUdw?NWG{t{.^:vN2xŋ/`$Qn2[فce|H¾n(mZ<3b^U^ȤjFw.{ecY_uYKQ$0jJdX7=yl\ ,w2Ap:ZDϣKNhankj6묒m+u^?<_sض>@*;? 2+bY+5X0%m 2cKnx.\[Oa n.$9aZi%|1%_f6-?&W%}yeWXjٰN<ΡW`oeq#Bk)Ǭ_L̆?E0ra;2q̚gk؋ȯwhӵ؃a \D1ŘIy%1Sfs:#)Lqf 0o݃+%jFԞ/EFEMa1,,~,U5o~/'sZ5o5L0;ty9#[EdYU}lmC#p ބ)L,6)tv^/8WCkFhMq[`kpX3ќf,q1w.{̢@^fcYZQ6ESL*v;`չn"k5vNJY6evnZˁI4_+Re|ԦW޽;ѰX,WYFPlZ:MD6Hx_T;&aB9, y$6xs fYdJzy"10;as"8;9Ƹnkмxŋ/^`ʁ2`yi~1Li ,g0Q<ǁn 8"i`H܌CL,_E3?P"10R<Ȟ̥J  v2柁 dȞU!Iwc݈,0Û_5Z}9} >ݐ#7m`1\2w>m`˂|F9?isX1[Ҧ+r39 Sčǔâs6܍[`+_΂)P1/1W)E#h\+s-y_G+ӊc̑+Oݳ^M6`{_6ˑ S}uUxŋ/^`1EOՐ_-/S`]]R-*0%Y0Wc_o)Mk*iVf2% mNNW|V,fHX1UFk=U`}3kZt1s(]o(}"?'c*ڤ Ie||z);D ˓6߬#U`M lT kj4UN83 iV( v Yno z[D~(fAKB881gULRHKUOE` D]WMj8sꁈƬ2^~_0E4Ic{N]Fy_~>?4 sRw ;faZADĬ2\ Q8OksnUW d3#c#:'Ef­0 X0 ,cQ1ZBU`V1 2 8]Uo(v̥ELiF?Wէ Ѧ)N,Ldev¯)|U_їjAI6-0qqgp@yǩ/a؊fg c'wx{Xy%QDfʑ;(ZR0~ lm)%< a}uuϤۧ/8BGU_Uw6)=3Ϊ&hw+IwU,Y_,X8UTc&DB<+[*p?3߮ͅ,yQ˄uzO zݔVOƥrpD屎X |QU:"4cV,ȀX88GϳWY>ժzs~;o\:ךOxXi̅2eSX@`ӘW~}1^U'VȤ oH됮vMD),xU[EzEzk%c VXl+`TF7ϛpMًz+Gk* U V&I==6EIljH U}&ﻬq3So:rqfGD"NhZI}L&{sIN\QA,UWUS;ZS_QR/9i_eY#$ys:O bZs&9't"VR1ԡ}i_?ʹrS]J8TDZ,EeVzuAD>[?Z,VIn+:yg%'`p0}h%"}j:@o""-XvW`98 T85==˅MI9S$  o 88U}UUPՍ &^4[^cJ=t]`ތS2?ӛJ #+qqT U:a0$5C>v>(57%)TEzf*LT$cʾi_ds'Xw%VdwO3TAU?\k,sgXC'+LK;F5֧+qq"|_DVUՇ$2iU["rB*mw>aN? UDҬymȸP n ݗ Zhʦ}MODd\">{=Dl"vW;6<"/bˤ>x5^"lWiI,Iގ6d[8c%s,VSv@OW`98 C5/}-g_``mڕOᨾzQaa>/I58{0_UbY)GDv3v ZCD֬jv6˟^9k_5n= < n;i}:Xlwc)"b%C:;Q XOOEdhae}?XR#Ѧ}aByW;4n1MSk} ,qq&u~K&rd.;Uȼ4^:h]U8& 8fimAE:'Cٙ%rRT A5-$XYT0sT?IUCP'hv9Zة|;tZhIY EN< z]EƎ kq0t;L@\ҒsHf%)Y3I$HA$,E $*A2%.MsۮP==3{g޺TխS'؟ʀ#Sv)Iwgf?cj?vjaU ~U SQ"XM~'^d%j}P`AA ,VjbfPj?b-1 3(:9,n <%4cf[GW2)_if{%T|o_ɕˍ(0G*c/5MsPm8r 2f,`D7HsT{ljl"QF|mV왩H5yZfv4VoSĜR[hOҚwW̎ ɻm1CH,JY97C'$U H!W?CKʽxpW'Ri)U'8VIo'wT2@R[-$.j3{ h4{8#~ IDATMҁ}w?_.?%e[l[l[?ȿo~߶o.8R]U픭{دXWT1 W}X۹0 ˾Hsn!&n8dzWVV=A9>Cf45\ ~0JwTHG[qe맩Ln cj"Ϻ$mf4wSo)ܧ VA'FU0J.}t&i|ƟF[π!C 7I4XҸ*zKl^7{b'>W}3?Qܙ]ois3UmB>'j)P3b`AA p:~waBaוWi I:4`Yϕj7tg`j*# /)Ҽj}F   .af_1eŠ?kXAl:B[E 1   [42&uB h{ k8ųA(   [ْi>óA_gZFl=<yS,"VAAAtG~g0:ZG+Kgf_I$ 7|}3Ji3afgw u0  K){g0'4(e% änO? _K3fi3`y$tP`AAAtdy-]ǘXFӱݽ$^̾R<"XAAA}3 ;ĂsP^3YoOHE>N(    >Md!    4    4    4    4    4    4    4    4    4  1o۱ݖ/ `H  Ό5ڛ6fC' #ilywQ$ۢl<R&K3~]{-L% ܼ<]AA5BAA().wQf`6]#mW,0hvffKR`nI  LRe  ڄ|%?U3UJAk٪Z2Sp ߳uSϏZ`*>p   EO UfE'0,?4$i,uyG-cA"X\ &VKHT sʫӁ$-iv`aLl6|l $i1\Y=1eyKzX]%.ik%[GIVkH&{?PA.,4*4]M'CҤ4:oL (B(  zl -i< KI P3vIV҇6[j0̦mX:BRP\Leܟ[%]Փq I$ѠmOXvm{O<`~^NG_tne2wKzCh`$S̀KnkHd&ikp%n%VM-&[KzZtTB SƭI 2㿄ǰ{>~W39 zP`AA 8OcvJ*j5X&95S58i"g!`Rl*3N]8J'W-R+ ) |Vܻ$vPqw0 ycGffwX<6C@)nUy(S5Ӡ}iK3U5ac-ݳA}P`AA-mA=o+ẀGһTZ"df3jF>>lղ½+~Vꥇ|)M &f6:o}cIVVIqY$yohfzϯݧ.w5*\ ꙪTEǨ\y(c{6O  6n?ksiV\ 7Ȁ՚*kI9̀* n$}2W}M;xDR>y6kgӼ`{rogDeF,#dFI[`|\kg UAAATZFAC{yKe[,VoHo5;w_K+/Ry>KQp5$ZAA02S^fvl"H# 3;XLvr q0ksI}=0w^5W H$ff.kI&V3[eIRKf5aů[nAU 4$]ؽF穭PNmS[AQ.lf0zE2?:!Fl9`T(28 #Hz~ U\9Mr#W}1]79XhQnz+Q?~~NdfC$}A D9kA`3^ҧ 3</zU%#3;8&Ù9 ¿5Xf;yM1㿗3%ڂA @B1H>gVӓ &(=R̶` Q`Ie3P`3Lr}v$XAAx%W^ wf;/NU6I埙hI53!vx Ί2ʚYSI]gJ "*>3{pOll2lFfpp =: `/3{TREx 3[ r lQEzxuJX+A4[ c$Q}JZk?  #p0S*nf{$)[}\ S2ܚ1k6ҋ%̉)yIYٝ&6CokeK̦ݔ6Jٮz3W<ҶE1g3cW`كc+zJ:{5ٿ"n@e;_`3s\Tώu\WX| |R|Zg#g}3TxIuXZKCuڭZe溌-ئmf!  RK3{X(x8ZR֭%#}Y9?4_JM,m3JlAYXL IVx\"hQx9W~% ӘOKo ,|}7-דZDef[a>->͗+U?٫;3_vȳdfŕK`~7nY+f]<ù) sS&&+Hͻ{K.K;fK4+$ajzE6af#RqI jx/   muZq/:0vAAAA%zU*8xlI>6‡OJߪLf6XUq00x]Gl()n<~O(n1O-iqHi*i @g{0``=n}{)Pi;n٥54#1pvv <;j*:cZ> -oAAdzTe#fQUsFl7#$v].篲u3YR fʹ}A;3knOv|X ~"V   bX$`"knnF&)[]=Z~1n8nŲ05p}Ku=<" g$~r{H'U)H;K}~M8.}!c]1S~!S> W^3> @bX/Ry2I?W%)SJoI=n0p*`8K:Ƹ(+.+iBYe-P}ڹ.%³ٔ8W^ \gz_W'09([ lWryd33I'א7   Af!lf/z`&N`zVX)~øHi%}X`\DZNқW#d!|Z{+1TOo?np3s.Z .`f!e$S\#ݺ>Nt%4-?eV+m[MHB3 +h- TT:;[W|\/曙m[ALEz: 883)'R ހPVhOۚ)J\ [C#    ]bv<>dEa8i.v(eZ`uB IDAT)Wi@i4FY)J2 lRM %LJ٘]7US^$%U(+&#)%NUZ/q:jhf_Ryu}w֓ҺTFj@͸%\58YI?ώTZcJw(}AAAP)UpN Ղ`f([[[@XC%H_^SSx5;)nZ=]fp׼4S_6_ygoUhK ]k)GRe]V1j e2/b5Lmmҭ5tb#;3ubE3x|٢AAA3%+To%kxqiJOOffpwǝ*7&Iz@M0:bM+I5y%]ik9ZW"^0Aqx %3LBc$3*ꑿ~o5!K3m%/:ikkA|;mc2ܼ5Tؔ];}AAA (TVC?H?X/PFKuTk<+ܴ   :BʕkmlHz-Ru|VW ˻u ƽJNf6Z`=+JN4>bxv$]ۿ,.9Jƒt-^,uOkx,KlBqly`TK_: cAA$,xk$@QN^m`\yFpG_\y3@퀩: .T ]?9WPpsjc6KYCuت!~Bz|Fт   ̾^9ᮆowR\;f6nnٖfG iDZCNTef듂_LN<ٺfvUfk&cO XI0ix)hwwfVW`Vj_u6eZz̶iԾ E sP8/hf6efOݖϺc)3;̦msS{-O]@bjjy(W25 =8 3˺Cz(/Y̞5,3$I7dl[1'Í&35'3;8Kҧ9ٶNAOvf.0s*qmaf%ׯ;$}d¹>[YnIc$of{SVuqz#yC sof;7I\g|>c$ݝ$.]0cIwdPfvT5=p[g=2=ܚZ8X?(/ſc6Ws/3J{ӀKÁ;kR&AC<  I;(_qA\x1]e OlMkN톂cN,0ָ\ 0]9.˵Ⱥff`6ˇ 2-U; ˷}{Y!:Oc~soF֙g4z|ڿ+n^ԏ~Xg{j-GM:pws xIy x)3c& g׳] u$}oUt{]S1V*jQ%KX}l\u\ѱk_+YAqD#VaE I'59(''mcoԾ.1kS(Z;$cf~mJ9`^y3qfL9_P.&yN4 ߐΟWJO f 8Jbku9&[=%qk"khj'?wp]X(m%!f 1f{!P㻔ߤ%. J@)FQoZu{|=])zyxvx_@^]q:oCqK*MfAʟP: AHO㊁pjU_?WyR%k𺤚ʯƭf-FT0K뵤523DG+:Aml$ŒeYn?JҒ956E x؄wP}:FҬ70EpKU~ka(\3Ⱦ4:\҉ݒUR,ֿdn3%afשw]a{q Iuhp#$߉:Ey{Vj%IM6p`%.$ր$=t?)I ~OG-G-$[s//4jI Oڂ $fe5mooJ&D &':yrAO½7i_ܫ 8%dAAP3̾;J֔ܙ!   |+/p}AAQ…0 `=e'ͺ=%i 3[ ,Z=>JFϥ8f,m=-,_c]Zƫ.9xx\Mjx̪5('s2x:}f6-z?OEenII.K/JzLym!| |'x?ަQwqX,{3J \;qkY<͎۫4`5`3ޚ_+c'7wU4N[l[l[g7?dӛ܋2ݜ&͉l=N ƨjzrΪ?k4$n;u\Viwl~1+5xsVݝ滺xbZOuǕ%W3E3vT?#-VMǰpm'W(([cp"dwʟoJ,fV8 }8rsVW߆VthQٻJ5h[l[lunN_-+:odKr5e+yXF pV?!sarC{t(i"?i[+gxOC ,\slKgUԶVx`]dz XJ?6WT_>xB2mפ-kM\S՘opH$`rN+^ L]:WvZW\kWrt.ϴ]W$d۟`q`JL24;9 83'KU͎+gih\iGvRiM9Xkb1|1*,_̴87c=`hvsmҩ{[q  廦Œ&fݕ}r-8E֪IU:*d/bf[gtr`1@%ΐtT]%) 35pnA#ͳ8ptj Gm%} |Wb#+%]qS=ߔ4NI$,C ođSp7/qn6+nZCu>- nX5)ؖrkWy̶}[f:_e`*̳WJZ[yօ& ¸e鮒~L|BI' `3۸ހfnyU_*1ҽ{,gO  ۊ7ո0WTͳ5W 56%.{`3[|4*Br}yj"nQI!P {eƒnhU88*1 y0$3'v 5n=Ub"nr"yf_1Vfdre1>+ W 8gu>9<3VcpEIHzE ĽENu(c cMSqz;%}F9Q_#Qis-=9 g,AAz!B*3-ef#n3rf@ây5#Rw0AL荢KkNiFhэ34~ wHR[Sj\XY1ɥxA`͘o+׋9$3{O2)rVB^)..M ;MorB/+Yu_[m(8/2lĻ=HK-Q{VVAddeUIٿ2{7~/+Ocf c&%13KtYת()U!٢©=o@k$e[.?XüDZHef_}ɮ|zzNH[\^ ?$F/%J̋;]nԌ:{יּ,[abj^{}߁5Oh{r\yB(  fڂ1-R͠%fɕz{={T5(A![(+W2Hf2S?SS~6+)\xFoR$܀} ;=nIoP7d]f>UeuX3{ 5py?{c-*o)zo]'sQZ/P`AA @%w80W̜ٗqeV*k(neBzc-1Sd{AAA>x%}^tó^{qo< f;`4x(W=w7di+.&KX8̊ĸj|*fA{rg<~<'}IJؐJpk떂烮XEL 0mݖ71i꜋v[w1묇f~A0%q /ipEz73SZEkT*!!f=V6s|ִ-fȿjHzʘMlxc`bS2m(y}q'?hpY 3;&H8/WD_]ͬC5.fY733ߓkQ.)ĮUI7up De,?:pQgPG TMZu{? IDAT/S؄|?_e?6?mP>?uf+UIw`ÀRy3;4)kʆ7heMQ.~F9.fv`iܚd {e$.a[,\lݓqsscf=BA< ,)/Ace28ʆٜA^s 4FzHzg;rKU_=.Fm3Y7֤x&/OV\yy3N%s7Dcfv/+:i̦Ɵdl}nB x'?3GJI4[XrVٿl@I%Io 3얊HX}-lV%  fv!fs*>DqTf68{lT<'rHz/Ulgv-eZ^=E{fK'jeܜ+eh8% l6?> `o3;n\ ȔҠϾE]_sSMG,)* ?ltyΠBw_3]rmAuMFR̊l[Uu۷@^ 8S6ʺQ@*/J.?*+ \Ϯ ±x&V5kA}Δt&-d1il$/ʫY:Áz=Y$/t>:D6HY ww[ hM$o779z8fH ^)j.ٌ $c+/+#ˡq~cf#j5NsS5m'<)efjlfR6ǤuBttJE;j+!onYAʵ}lZ;^rY2=jSWv15HkLIWfVnH ƼT<\k٢`g@$9Q3fNv|7ہ2U[yQU{B)NB)*]@@zGH"M?{S@zGkPZ BK9?}S}If;gf9%/gOGBKU?{-"RNTUWD뼆H "2`T i8;0Kϙ"VVD"S.~NVՃJv7bB/l{R|U}żӼT m0>Q r6y8|>{):l^V t8CUJٽSsZUuonRWBUqtw`[3wcq/Nvc1Ykb = ģU=ِZ[kf]6`?AD6üżn1c :=oy̆6UպIY ̓ fBUj /oQš΅9Bc"\kb7yc*DoY)1[ݭ%ܯ7)ȁX* ǛEb,U:Y 3NXջvFjQU?0|$"kcƋ9?V!{ԼQ9/!OL9Umg5Ϣk5U=p }= x+ vͰ׉wc>3IjY0z927 ^AK*o1&K橜m]NzoMVseK;\ 3e_f9P7a~k }?@U0DQ=ϓqlӒ$G}OR|L[uܚڑ+L0Pgr;%Zv$D1 ȢJcZ,ҁ+?"U}RDV m=va+#ݫ4?t{D0`Q%@,V򁝄yl ^5cEo*USDN ͙ K4vfBD{ +٧ Ts#j]`c$ תyH!SVEJ0~}U}qKn{YσOrϨꨂu0Y0O6r""=}ZKtBw06hNwãNQ[_`Kʺ`.cj'|XAQKӣXĦsa4`祇Vr=̊y]< $ s{K =ܵUub'] ҎJ#H$4%@3뭺E"nOp`w,؃L1O1Dxw+a8J^=2UWG58[==*gxc#Yϒ{9GEo_+k99}Nf̨&Uw^Q5i8JISMUY ص:9h8;l5-~ *뽜1p2a,̹YaB*cǰ=l_berxɈ;w2ݣ*߫%$&q-b-4,oqCJ0G#b6%{`Adkao޸?=)Vrt-hùx\UT;3VaUjp }`iN{EdUJvWao7XYMꟳMk(.Xd~<رZ;&hTo"sxVDpU[L8X)jżVƌ'Uз9ӔP=&*Yr?S $6#ޑH$DZb B[~%DbmAq#GrKPt\,1icBHޘ<ϱ c3b%YXx V' %V"==R0е~{#,19f8<4/f y,:"7_pV8{y` < ccw~XEs%qDUy}~X 遅y+~qNdҘ3]T®[Ȑ]2o3&'s+h<}2sKGoe1× >{ZIb/Ks+?D2װTi:-VFsHq{3`~U:oF 3$N~aC?_H&>U Xqyw= r= 27 ..!$ʇ [--z~ᚥ ު3 tz[.MM/ 즪f|~M"U=3xTh`;sb?VՔD7o.6y%9ajH$D"MDU?~NKо6#+2;,e#UvH$҄SՏ Qs]<6_C g@-ˁT,}!$|y{q&veqv<6NVz<kR+UB"X.G12 z$O*mg[%X=#u kbaȝi 4tRUwN#24r=5 Q / f^:& Lص?8GH$D"H$MfX\\}(Vo={_$D"H$iS]Z cJ >!ueMDz9d?0^,P_+)sL>w kVɄ7 FҊTe~Btj";'G*_ -K}nF$D"H$i1SKU/"?,l`tiU,"_PP7K>^v;'/>4'{c 0BPJ'Yt?X{ c4B $b>tCtjDDfr-mZo+i EdNl{_$D"H$iSR);3P6X8sӔ>'@*2g'.M֧.nkU"p> Z3dȷ(WQ3^j2 %F$D"H$i=ݱ aCQwN:xieN8vfY&?gs4XO7(X.{f()Wu]y~o ׯؿ_}lt>1TB!"uUGI0"H$D"HS+,>0~t$}6`,Wy+Q\Ы3/<>~="ғq݁V1U='~ME/|x 1UCYړj=Щ,,?28ЕF$D"H$i!S`y )[9+w2xoyJED\*c||aî"<?7<ȾU@c>u'R+"ae,*_U}jk1|kkNp}AR]Kñ*O7ӌԇMNM&?׿يt޷|E"H$D"ۃxP灧Uk{|AS@U'{z0oC]Ku#UDdAEdUh&Qyg, ܖeT`&6ִ s]POgپMx[>JDœqeٍGvaJ2IiU}z4Ӷ'm~ƈ`yޒo"Ns-!"+uKLH$D"H$Rր86Xޣ{pK?7UtNt@:.WNn]jX:KSa{2-AU_ o CJt5NQrCϒ"ث`y'W ŪnHU?6tfUb{uȚIުKUьmA}XJ"d̈́|xO c҄-Ed|8:5BEEdCۊ~Mj 4vDDXvn~H$DSKUVm)"̒wƠU_;H:Tũ*a(pt^أHխ:AU |/Dd YDd/` 귊SD$DD~z8`w^"!LDrfZ0f ?xn>i"28ϯZuETn*Y;Q`n;RzRU}T^1totl vfB(ϤfL{#8OjǞ-"g`l?;ui*"+QK87?Mf{,Wb:DDL3/ ۑԇo""ߺRO\?lޜ| "P3x ADdv_3w]3xy]E:Mb IDAT"HPD"/Լ7FjJeݩ"2,{9ItjU/T5,DJ "+%>TKfLҊmNns;e7wX{{k77!W?(&!Mo_&K%E4VF@nqpLx<~1`,Ɵ 3<8?#7u%F^K.c_L ʻ?*yfB9?> S'm@}<Ɣ[D<%Ů;Y0uC9ˏPy䴕_Au.+ ~."Z ="H$ED? ^3F|D QUs7hBeHg]+g$콥"84 Z32ԅVDǼc+Y*,{'s[ ?o.0z!Zx ܙB l)ݾߜؼ3Vuۚ a3|V-P!X17t $ c᧟õ ; ,}oiAq$i .̀_v?I0%#"'` sTX\V')Kq1~[$L) X׫䛴X ԊEZ4iGD=U#D"H$Rh/P#HdJH3UW!#"KH`=O^\0 6_H$D"H$D"|kYYݺ!K0D"H$D"HU#{'༯V%kD"H$2 "kc~nRwN`c,``&,GX[TfCI}z8/*V$e8jqy\ "@C"㰪գT?r" UD$-xU} ȜU}¾jqLO,O[X%绋r#,lN\XNX+ZGQDVze|~ -Wp^xO6aa=ښ ';]/7?NXƗKTM'X1coT1'7;6wT )bCg :<\/WD`b(7xތ9cݙt}%%pϬKV;&cs"dNf&ꟿ6evwhkt`{VdQmҬNn,v<:J$D"n0v;ֵw[*+68?gy1͢nx̘(楽8%qVv`]YO[XD[?j Ł[Ez|c& Wcn {x^}f ڏ%(kxZtyU}?t˱*"Kck~"N)Ije>"w`/8;?cG`|~nMEdSU}Hin܇?~h)sQ.^{0*v-ͅk턌at9/`v뉭<*"CUS큋]OcDZ}Yp\,"+юeq ]v`wz_9;y}+s_ ;ƪiʐoR>2?]1##uKaؾ":KC?"iFg g8>Xn}̐땢A%S #59Z3{j406;jR3 at?y` 0Dagk'.`xD{]E@Ǔ3Mf i]tsssf[l[lulQB~iO>πumzՂq s T4`aF2`tG}̛#{LO2Fnc¼[c|hDZ"C~z8֢k"4`u ըЀ` ;W"Xq y ?'Gi UEԇA}GA:bsfE?s6z#Ыv|$`0ÒRC}Pf : }~qH|hR iXÌZ)рd˂mlNszꞪzMUoUڭc$D"Jn>K:Dde`ko]Pwaa| DCTj ꀈ ¼><ҋ8 {nΧ{"4!)vd&RڇjIԯV0~g苅jf,g!Q"2 0 DUGcac +R!H7갼cI=m.t;yewfL_UÌm|+ny$Ņ#c9YjI}l+q{kq_`UuDAK„]B*n; C+ncJ^#siL4B4`E"H$L TįJlg|~H|NTG6:,%uoXeF-UC"3~`W ~c1RKԇI0~g eD"" KNZUJ5Jxo+yaU0UP ӮՎ ٳIO`|:7¹Gw?Ye*+U#";aĵ$?DfzBW{`\G;:X>,qsDV$D"T+"/gdQ~%"a|p01PP;1r@^&ܟA0PV0#)!eMD™CVU3T53ay|9œWUQ*t4ntfLɹJYZvQ/*_bvr{LYգA){HDJWҺ%Uv|}|OfǢ9*轂=u%U %"E={3⅜ - _bX>s+`wXjg*jYYNUV}%˟V;6o>"r3WĆoUNˁzw *"V48疷*soD%vTulV͏Ѹ3t/ B]mq/Uu+;38ȣVΐg'zb2$׃KoU ~E}b;r`/ LN=/7ҍh s/e{b_$ "l~ȁR7Y8،l!DD^n.W2kwX06lH${B ^$^'D Acho+UU9 :`܌_[U OUwnjWȅF™R֝́=7lJ9V`կ=S{LTM;.`-?x!zr~zBZؕɻuU}Eޔ{GYXU-4NW/ .G "t~eyE#Dd ?WE`j/ cVUլ*aPE(U il_TՇors}N*] ~M>V.roDHw!亄ɸ:D>iKDs?^~ Fc?/-f,{b1iyND6>g{#5G" ~y"2^y:__U=ʆؽK Tj!Hǀ~8-Hik%EdY 82湒;BX b+{2)jW?K^D~PJx{0x[>GDŠ!+UiB*Ǽ?̗&/";'tM(=E`oՅzmQ#i)TqòWEgV策Gc5Kvz*/p8{FNXk~ $\TD.37aF͉*<-"J ] {`/HDpۜDRYI/sC18 9vUyw2"2D˪z3'5d U=CbO/"{墪_9q;f {~AUqa?d!7w̖ny(\yFyAy _~kM|wܿVUc U茿cy7XtrN/8zbj޾wݪz45/0/E$}$hy5E&kTiUy-]{aqZgT EfNv)U̓ɄSsFoz> "a 'D@r̍0Cu܉ηv T kTu8$ئ3*{ Vm?@Y}b-iac/5hcwQ,C8x_>oX祌^C0Cܸ~a2>@9{ |{X[b/muGedl@[̻_78蛳kV%< k͊cς=O1$X[hccEso`YXѭ/eBK7> 3~%u:>sn6d>zwf˝1POR ^gWז8>cr^ 3$}>ׁmKp?6 e+[ XpMmKnOrwl+/|0LDﯴ-U}WD¾zG"Ԏ"20fOڿy\y YUVOD$̫ơ?al'_v o\؃Jcyp9v~Ƌrd }?{V2Hv1ϱٱcKw&=nx.lnU Mvq)ߓZq_i&.<.U]m=^S{XU ~ӮȔKwL.ðiT`ai#HdGU'!;}m1+7x=qJ|n6^q'<|,j6njVToՁ]mRǷWS1~ qcgbnwkJ*N%\F"" ??`.bnovRe0AیXނ$űCb_K6<+5W{T5ӭ;#"ca07's6}[XxrKRvX!U;`8+;s~_z.glfƮ1KθkgloIB+"{c@ӸHUwu}cUNY KnfgXlyNbucoD ,qjf^/Tu@FH?^Tuތ>S'gmU;'+9@S?OU=#9NUOM]NW TU-(#+~ "XUͬ,Ī]Y1)iyoD)*s&j( unF"H$i*a{rUW=LF91D"S0V}%y*6 !"b%=%| KS̫gEnF%׹J}V 3o=XđXΕrK7%X B`=V"[ $Kb%ٶ9]˛4[acUbՂݪ v~!"Pۚzp14f%Uuߒc.ŨƛXaA8ٯ*ۃF,Cn%W)O.3%|xbH`gY<ŲxXa^1."a^"{LbH$D"]"%~7 vªF:rfUD"&ݠ"ܦb߭U(^2`Ulq\!' ^{2V5!)O0='{d0n/7k2ʛU%>Jdz:=?ܙO ļ ќl|-UKʒ~/[)X/< a7y}>9v>ӧgc1f>3ΎRO yp;^o"`@np@ dX5a)H)} Tb#g) ϙ܏/!4mLz5s,$q慺)Vk¹[l[l5a/֒ߑ} NOv2u-a)w6p蟼ϖkMY;x`=5J-\$*\{ñƘE[,t̓1U=-S|["΂}nvPU" us,fH^UOCUsT4yY;c4(qvBW/Tul>0RiCU39IZ iƫg:[5ZPv1KX'o0;}{[Z![j9jW+X{50έmT9EUVեKRyz#fR:_`y"ުwU:\,oS_B~Uu Ly䶞\8ס(U-PL/ Hۙk]f./oU`Jv 70˛睴QzRRԻ˷p>pGU?}%6lN//zVx}뮧G"H$:^UTՇTߪzޭ#ۭ[$bJy}KUYԨK#>x#ETCǨ `ɗz˟2+OU%wq S%}@9r~QY[A"2#`veD"H$D"m$q,,Wq,J}hZf_UX09"yɾ3cHU90`52Fg_((sLBQO'ZHӉHd@Ds=Īm'Ԍk2D"H$Dbjr> ;E#C) K#u1,z`|c[8~C\#YT:&.$.yYi+Up>hŧN͜;H$D"H$%LWW1T%U]ㇺW9aTQoD;`zo_UBU*u]r~Usy X[[AZq-:*"=*TeK$D"H$}p:pnl*QDf-ciU҇0SGj}e]蹖Et)X^bF^G]1艅:E"H$D"H[TNU=@Uh.OcΩK.Tx!X?OBg_(/)ʕU ]o[ލun"ז?wE^ j>u:zM[H$D"H$t V7>6H},?_J6U}byE8vIy˻U pkӧ|~V1a!YhP XAfr%𭷼3""[xt,/X_kW˻c:x[>XDX[>*C.>v)("?V4zn@}#:9*E"H$D"H,^DvGE Y:y,QADxFW4S >EDdj)H~Xy,u'sYCU?ˑo%("СLyDd)`RկͩE׋H*PA8_W]4mwx)?QU'V35Ddt:It@D"R2DEddFkFEisl_BNt>D"S3"Yv7""ڭ_݀yxC)ުD$3.Vq~:- U[5p3q>53U c"Y֘,.P o(Q3z 8`w{ۉ*)cnKW'yfDd0f l(̈[ր-"?yFl_:G6֥Xt7pNwSndTflkE:`m`;"2c+DZi7蔌|Ә!GJH$RL_9ڨהN?kKҴ`9WD}ZHy]eDdYU}:M؅l s#"놹FWUUkNkO3 ,]ye6ZG">3[.|>W+k٘Iڊg[HxJUkފ"2]p`?3g^ߩw""=qIF 8Sc:ػ 4+Fc}\2kZn~ C $Nm(#yWUnsNKC*i>889x[F.fȫO}R1-AzfXO oSU{`T='Fu*ڒAr9@|Xx8(`3& }QDeXrKN)U遣qpΘ3NxX5*\w3I>iAK{$}? 3 ޳'hi:#L_el`4ƨ&u@U'9RBx p~PRmsQ+"b*cdsGbc@hU]DƂeJϮ{wT1"yRE^'g7lY:@ GUmh~$"b~̟<Y0bK}I>y+r2鮃1Cwp6?Ɩw!X]z/ccaOlٰ:̸yVRMnތx~- xF 8Ϫ긢M5 vsbYviN`Al-'A1u0FU;q9{1~'4* N]$CNjvvFDN^f4wt*d~DUb62X+0';O]c=V%l@-Ȑٯwb DQD##i,ʪ!3jGU_'[?_&ۂާ'|WE]a0$n88LIU `ʈȒ"B c>{g9888T XN# IaYЮnR888 lf 3Y-lG2~}88N?6]X7?#tƠ~x7M7+1ǒy/ťxq*qLDd.,s=6Qw*~fGȲئ9aq!?vZU?oV "[k-::CD/{@DVb-2[bcb6zSU}v}ogv~שK}YMqgQLNYt~6:n-h U,ڲP%I?̗||ZGP v"XȕTbf]Yuv-rw?˭͚f6k{;v ʯbcf ͌wzyIxMU_h@{b,v>cDW\ CgkX(׵(fgc{wzDOOFeۇ#7 c&;ج{ɓ'O=a?ԏbuh I?ub J?`;.m2lpaFb;֖1eu{qyY_lf.*97 yq۸'*3vλnY8Ġ=tIIkWF|m*SD`[)23䴹po6_hOvlDeHf^@UMkq7ΏmCq 6.,b'#xX^TDPՇ۩GcPZG9{ClgmMu&p=~h2#v?%xj@,"wuqb"W[`}= sI8Ha}x8gV<̌Xg,[DVs=w동k1YzbLamqpl/7ؽiu`-Dd}U_F = Cc^/q87+ pY(wv.,;6~DD]4͆_y{( IDAT2F,g&8+Nļޞ)Gv:)ϋrDVN+iLۜ1c7pG?4=yɓ'OOޣd 6%z{J Xc0%ǕO0ctrL~"P伯2H~>j'J XqH3`2Mn9zƈ1OaˬbkihD :I% c˭23~_~1ֳ,BQ1J &#دH XcB#;8\xLoQ 3&+sY H~TunϦvy<%eHUgBCj\65`O'˕{ʨQeĀ:MOժz\UP/wkqqL&Wj _!l OT2x)Rsba*͜&4;W(2UQK@Ga"uÓÿ卨2v'(㏪zI?ѳ!t a|KNWrJQ"1~#v- 0 s EqP{ʑ-\)!.wY5\6 3aS(:$5.~vmr c;Q}lTa/j]%KT^l]%0BU}E"2M%,a8:t>VRJj~WDfȑ={ U0,qqYUQ*y*ɯjr8_ v /UK+p&#C땕ᴒoME=IUW+%3 X|d٪:XνѡJ?$D>z2}Olgz3i.jDd:F)wtfN-$Qk`]U%'XFUh.LxDth6`ɣg$j L3{r"2grSl)hUQq88ΔKeyy`YAssoǨ%2& _UW*Am;M/G& Ju{KOyU-xl͘M>AR=R/2O1'TfC+x_eb(Ng+aEezAX>R"ȳc$P%66/"_RX&:~uI~cdo>h>?DdzjDzbKPYEܡU3ŖlF7^qq<خ_ bt"=m 2$tR)`=='6!Y,y7zP]JSog"]y *^H@VS5(K':8\~P7Ql0chKAUNJȸHsHgn@W]BJL)Ξo>捒'&2ye1y}$zD b[n+0+:gbEϩ׸P+DO/cE~5DZ˩/"ӅCEώZl#"֕Ih_z-D5֫  W$C'җI TɒFu@,qqBXbs#&ObƖ5dLME*"/{]D'6}2<=5*lI&-U,IIjk%^KQfE;'m/b$_S%G>/B,hw6Q>ly%%#؈`P{PUwq{q"LҲ+v?;v+UVxrb\qs0iF#6Kz߇`~qqg_@Z0U$DDf3"";ae^ /?TտygµKȓo; {έӤ}hs;U}?x4 uULFDVgRzm]M {."b{ÌV)+cA]C)ZM9fqm1(Ya|qqg`09?X5n䊈v.TUEj@H'5U=MI};wS^1Τ`} pG?(_U˂Omݩ'iUu.pnX& 'l"p9P\JUS:_\*p QOCbe*Qg[CKUʆ0lL,N}À^ƭRCU!5L "2\DmaUVD*y#صUs$j=SUHuzq@,Nf'〿4Nm<+G_?Cs[T{8f۔|CwqhƘ i} ܀8830H>m_́PI{ ;a8$>C7"2ƌIrHidYq>X" iJ } mQCoSkd,#5R; `RQr +{ Vuf#sp> -CUEP =U2^V(?ly,lz 37ߣg0wl'x!"޾wȾ ܐ#z,ܾꞕv/SkxU x/:Toc un,qqn #Y7OXDvj/ "ROXD_(?vDzaX,Kg4+p̒W&y gi;03_/z߃3Yn-@Gxjc}:߯N Dǖ!" *88tU}XDN Y؄YM0Q5GڈWG !B!v"2>|>AU eER;~ԟ/y1#V}`u94X;C1#2A~69%jHU8L:bKubTU=9zC >yGUkP=Ddu`%`Wh`azb IozwXO>/?U}#3Nl/"?^ ;cٱ ^zBm_=["_9EWO׎)UchctcȘrU7RU ,~WUՁbK j]΢|z] xWUcIǮ{7٘K`@"/Tw0 ~&K+GeFj{ b^~aiײsmP`2T&#h#̸p-=3E?vT':Ed5`PܯcFER;؎EvMD_W~^x@DN [?g-i8ٚ=Ϗ00coѪZfX1|^SD6 Q0ịxNq]fc'Oj㴊e+s0>2{X}25nT߯aTw1o% ƌt񱗁}k{?%uNExz NEOsqqЊXc^WTGT^rg;T ~zۑ@-AKTUEdOjĜ/rdb^W?üPCoaVaYccU5ONU oYA/T5w _X"-fMn^b\9Kay =3/U-[i::xT663kU5 8^lymyMO_\+Wx]̀-*%"/a^ugebKb_żfϳ׀GST_A/cơ0#1X]Y/qhU=Dy8i[`û^ǮcXaE <3sa^ba}xp~Y{1U*ȭ=?7ÖM 3dU!"[`~ RHnjo,ꞑ2vo]1I1}[$\10lc6zNqqg`#"hLĠqڥ?2’g|HUb#M1Ȱn":jeSZelRA` `ܧ9EdZUd>ZK[~ωZB]=uz ,qqΔh\&UkG~Gl9WaRUu6$jwjpџ㺏IOWe ukx|Bqqq:V{8vg`"" ZAe٥S7`988Ų?aAsco9㴁٭/e$T{qp888cUudg5rg fÜ;EGavCxwqqqq8DlgT ]?vW_K'Ã;8883%3#p ,Ml7^urqqqgCDf#4]U_s,qqqqXDd*`a`!`e9U}j9 nrqqqq߅qqqqj܀8888t5nrqqqq7`98888]qqqq X8888NW,qqqqq8888ոqqqqjtZqqg#"K7|n؟!"{40 x>9 [=UOȑr>QUO} "|>ٟtYk׏v7nrqǙC[TB9ߍ+!"GS|CU/7l_ ȗETVYT"2?)Vm0gvqyNnTzNX82܀883ey_=  ;MLVq<:88p88GDfvsU=D̗:8ӵ.88]v.=F-5EdIU}kY X _ ^U-c^K<"~bϩaalCsO "2 ar!`Vlg׀W+-lsa`ᜯ_Q՗k,ңkͪBjsy`wT&ۍu,L>=xxe"2XX $ͫH~z/tnTUo@0o0yp_v{fg}m%.I׫\u}4֦3~LHW4SDw ;xN_Uɓ'O͞wch2f ],*SN[#;~#T8} X88Q wq88dơ}˪gMj'Q#UulŲr[RgAXʞ(l0BMrzI_qJy`;M6UTRK Ks^#Ed4kU|#^U=Fr\U'L-%V>R'fl$,#k%/`={-Ȏ88Ns|3$xY墪G2ir `FDJc&fH򋊈I,>ǵJNۮ,-\$on!UTZU [J +X[jy>ѨI@W+L{_I~qln'}Xt4}+"֕ I~7`98 0Dd-`ɐBDfPrj XU+$Eh~GX,z~עy:W<(?UmnUT4 Uu7`KVƻnĘY2 0ofeM1Iw[6KJ73,qqGYrX @_^Փa;@"rfU=]Di?*Z 쪪B*" /ixtHRzJU9) X88e-n:oUc:HgQo[ӿcp]U$"? g.B`)Uu.p,MD5[dJjlazcLU<;Ew7j8S8qqg` =513miEKv.鲢mߧFKeN( a9vgUf7GF߯9'W SgpX(=/=3%?CN,qqE|ZU}CU? P;'"E,aWtB>^vl VS]SIwGQUu`s P[`E1`sϸ!to/9N8UpO,Y^8ӭ!{nUsz{\%"[!'@})"Q-W%ɧ[""?BJ}HUU@U_ ""6[䆈&"LjHQUoK335#"T,LcnR9ȵq mdN_gѳwLtKD6CںjIFSg !"3D8o"h$@#"ˉ"q)[ _M֑NT~@Qf0L"Ixn|VBUXgU5ȴX)"Dߧ:BDv<&ϩv'@AzM֢G9Zibӻ83LDSq* NPDdK&9:)[jo_3Xd7or>ذq,UXP"-pp9N F]0/1C6Z3!;mVU=+YoY6 f@~7' "=L2Q1I>}HU/ ,L3 ]>?Q?34|L.xn/|?9^"\xo{m p\܇_ 7`镣zwU&_t܀-QD~=c{UȺN(OiǵDZouL͖: {GuN#U$"'FuņŢ2T:z 7""<ê:*,\ñgMTutyW8NETLeXCQ]wT:iNk6"^O5Q~.;}>mnuj.0}ɓV'l2WR&6P%ui&t]7(竘*-fYP :uȎލ[|g&VkNJdT؊e+zlZAGi?#/a^XFQ<]`>mr4TuK\T3vTիiDdBUmd) )}qqqk ,Xb7qqqqg f VՇBP"}[V!"KayVDoS՗[Xͅ0w1ǰ`7P옛"Q񙐞,p.O`D\ݧ5Z@'M\ij:n N `Xӿ d`ϵE0 {X@;7+ vݻMַv.Xl7W1Ƿ ;884Fp ۝c,fvt|7zٛ6Jc۬V DY lgKxؼ*(^"9 M #58۱eUǩ/b;n,T^gDO-;{`M33Ku_T`:rZs4.*s^Hy],-S&9<OIk1n%U#sÌlŊVÃQg ״Qi'z` d&au&PnDtlH"?3#M{~8\Szy`Dv,:ԛrlQ2Ձ#ùͲli>8Gnq=yɓ'OD"L-*U}_cqZF̨LW1RDd#2㎲UUǔ+zgT[Z|ea hY~ļ26dFdqqq*,Ѓ!e, wڧY9"ɗQТf ᅧKB]|m_DVSd mȖ!XPAUGPϪ:6Gz0&ؽB\B6qh?bJ2Rg*{!fZQ'M/,E0-ZBi|888N!]a&bKl.( tSyDd`pnpǒ 4=ZUo.P՗UUB}ה|zѪzZm8Y1U&2DdM,VY92`12>b}?eG1\b/A{G>RVUgc2zթ}jchZZOߺR!>DdUu)H888Sn1`3L&tW'u*X쟌Uҽ|D1a %Re~$yfEd%Y?Nqbu[""92y?Q,/㧐ѡDd"ٹ>J67w]%Tz[Zz ܀^l#UxiDLY.888NiDd,8^"Xs],OK%DdeL6nIkyA1%"3a&U_Ğ9Wt|Y872~p^Ebjt3iՊJEdZl|7[w*t]TG'H,Yq0vGת 888S;?*߆y%,8zYT"2SUFU/*T6"'.1oR`Fm oSctR3>H 2MD~Xg|]㏁[CH6hݩl#U-"+cKH^!cE%l韂Ǟ888N+fN<`JI'q{:aI]>WŀZY"rA~ \V/wVjTuCNqb^Je2aj ?o7LȒ >fly|+U}KUKaަ1?wqqPt+l[cȞ7) m}"2w\y0wCLPq plɔ193 vw,n};55ǰPԝʦzv a7ΣD$ףb88 :遵;3,(p\CLwӋ\U <"r|Hhz! efh"mf( [Z pcz%WU/E/ IDAT s;خcv$Υ1;ގzߓ@%zҕޫtP"HER*UEAQzQ@齇 ^B I3˝;ow}%9g>왳3{ߞ{9DD~#d[M+ ygm[L#"k Paec๨z̚qqq1=iʖ^6XU?)J,rDd/ \6qwP7+lfN'fyKN/$\3pF̰[ؾ@U%eyz>nj5ѕ͟vjv/ GU1VNƒ,?}XD>{EdZT&pK>1CܝXR=LJqqqbzĀ-6 EBVh)GL8qY3""S3x|@}lX5˻^ñ*NoE{O̍73O&EWi$"Q3v1 h"ykȹ"P.+&NR KU'룪y,~#}/bEYLt#"r*(;tqZIיǙ*)U:.i t7odK^=NTu,j>c.K+!_9ZDJkEUnŏJޏO "sY"q"\)"ȶ=ݟ?`OmA܃a3y2ZÛEfy/ڽ\(M 'cHy$>~," U[əQID,ݘUU/EBπDdwU3Ȓ2MC%XVtkDU!rdLݩH`*~1gzkns ?tFmRz dqfFȯUuB=>93F_ ޕ3yV . D)$"Ɛ[":xU-)q_)'#B`ƃŀ_j]7Y88IU/HlY<ԛf(VZ%hxS ٔڳmD{c<ƞQ❪zZ8cDd(pD9 `nIULj֘'L=">3:)Q, ,6Iv/'"Ϫpj [+Ȅ%U}*g8 Aߜ>-2c9zǙ98;|?r9 >&"=!Oq^|ܙ?鴍a]Y8S/-#fT**61"[3{r[XpJ7Ig pC(/D&ai t}1\^Qݤ m>9tu99xԌE,m;iEGgT<41O=Xlk-efE8+Qqu=ϚwXÓ=x c=,ZoKcƺb{xe!%8#6Tlsjfz`dy^sG[umx2e0?;~}jXЖlwr1yd zr>yWJy`/y2e2WxU_wȚXi^[R8W$p-pr"><(bd./AVym."asZ,PAE|̨4ԃñ%}`/g 2Scta:NJ 5'"0%Z`fs 5xӕ8jP^*㵢;(L\O >."K`/0;al6`H3m7jvTm^>gaﶡ,=O}NP^8S9PalԄsŠs"rpXzn8YDU{}|o~s `v0T3[b3 fyUU?je_a)9 xSU_iaAE~V؛9hobЀ R`k2S݊{yJ;w67bst҆<?Čoq%Vyrk/wس{ר*h0vB,{EdUmt~{ޜyy-`Ϯ N͋/P愞/^x7g%C1B&{L5  n=_6'@4دD,nc U&^II_*yS$:b/XWB|+i dNd/_<#Di؋ڽxOG{O68>] O- M,מ)4&/|Gw\&[t? x.My\>͈݋#qTX㱿,#7 #F޽Q_U40ҍ$`si`#ُ1K//GaB_R t߼xŋ,6H䗉 XW'/6л^"_jIf$ F7W'UqI So$5,Hz@9# SևR/A~fѦ{"5`}AQ5D~ ;WW&?cqWJ Gi q0L~?Mj{]I? ?]c"h6B̀4g3O,X1d?U]3fR<CJO s#~~-#huD_*#;2ۧ97`B8NCTMU/T-v1vqo4V0cH!"]T ކ[*N~Y͑K gt $'90z[vӈ1Eow'm:C[R c/PDžUKY-_BKsUȬwMXl`!:[Qcf yK;[FX:/; ڲӣi1p3 o-H1̒'ƌ7se }uB'73kU}@A-[ X\-QՏap],d tB-I<:14>c>rY~/cK=܀883e!S#v2EUW2"^2e~""MPHnfL/c2VƂm "3dÂ'W"fq;Y#ٮ<TWUHTjhT:X̵JXU?woYXCake, MzT]^guj5qMPժȘ9xS͇y ǼuS황7jUq!7]Nɞ> vbZ1S X88SI}̙!/ ƤD9=W#XqWz"2b4B\en bIeRl7=N{RC m7=ipnSUṕ,NqqTeU%a0}63C/ۘ>ܛleCUߦcĹZHU3cIeS]Sꉤ/$ͼ1Z:Ҿ)00~AU{*\W{m)UPՉO,+ug_ !"g`A28PUk1)c,^TUM!p:D$S׆;T2ِzpc$, Y?À#Uu*p;ppҟʈȱXL0]T F۫jU[\DTwr;li* C641&c " y\>O9GD͓KZo_ulR$,"DU\POP" IDATP5>xZ""R[ryqgw;..* Q3T_p̔ʊqf|j8ߊ6e BM- qz#/,YX*sNw1qq6, <$"#TuRKT R"j`xKUO R~!BQU}?Öl#"!p30/07fP8{y>~{Y%ePwh a ;sVjK&~Dd)2˸KoeH͇y=-L=l}=6sPHJA֌ڼgǬ,6WJv-"qZTF:U0'nfn/̷OȎ{{q͖. 1/7<`/ob]D62 HvU5CU'gC['k\WliAVƚo+"w#" 5my '"cK<kw8z#UuL͇ð00wQ>:̝IDr|ڒ40"'<îXҎE|ٱXPF:,ԕ`ӑԞA+Dgѯ!{f}ɘ>ic'5Exlw_H 'vN\-"b{g``YpjawFT2 xBDNrcUUplnd˓WkaBU҂-Ҩ oq6cd,ҷ d-}ŋTȻIRp ,VQrtbuc:?GO^yD`rڍKdl9d'uKUԻd,k;)wrTwD"_\)0_cb/1ﺸ+,1]?7Dm.n|դY1d:wOAuOHu)soDR#*J6*iiC۷bNLoUڜwDq}|0KáQ==OQy0KoacedH}=j`6 w >3׫xaƯ IIzu_b˽g-7 p&}K`lα>sEZ9X88Sj^W\6X a؋LMyrpu%Pk:A:A؋Zl_?( p\ly ̆UilipRTu,yẆyǖ\74UutAcǨjFY:Ʋ*⣂cN s I7+QMBW+)N62fa8^mFZDW߆7݌G AZƴLW>"r)SmCő{\U@]T;EQ"rH{#Klf=TUnp*)t6J'ֲ]o`F˗BNmzlWl!Sl׻cb#GXqVӨ-t(m U{aΘ c5jTR¹ `?9Kvކ`c~fU`߰vṴ(92ܻe^S=N/$[AU $-}^`H`U}I+c)נcv1"r<e|?!y̖ADnbw?Į(;\X=ɿܳXJֿV)\DzkLAp{88Kt+8}d`%I;eS+ U/^Č@sc.vRUO+ѽ 6K)pcX:uK,0>RUDdv,ܷ]c_f `YBDIJǮXoS+cRwQJ 6qlN=\˞M"A"2 9$T=\y]}CkcNau U3b9X0,9ED~V埨 ,mwl<R:8Ll)"yc3,ۡL)"*K "cXfHgJ] lBi#@NH̐ur"{R޵Oo<=![v@0KZfpܤ̀ g򃰌8q;IRF\_O&6]~ }3RH$;؇i7pW06>S-k{ع-ǙBBWñ{c^jac^] A AEdSدłLggP}j UāQD,vPYv00dNbTlh7)!wwEU{ ۈx?UA|׺BB@=W bHe\붩*FU^qqe8x6-3]_h 5WTXR1Xm{c#`>x"p0>=u1`{aˬ2RO3T%lb2U}\UAr%EdFz?o(3.,i#o d{/6GnW`h}8= ؗX<\d=#x-}@d~\U~/\H?#)qqډNVTU]{OZ -},&:Jgds>NP[TuU[YX 5&Tmqvs7ڤM{}xUnыj.ܜ鹜+}63gqqq)0`=|ԥ.MeUIiӸ>yHcꪆفQ%5!'tjKgѹYRuD$ C>k̜qqqq ݀_&yr! Iv'ٮ.wȾlZ8x9D_:à Td*B"2#3=ow&2iF9RDN#iW̕y*Dd͜{U'&̝OP%5DDfk?sx0G$WMUqqq , 흫4?jf`L44dHQ1d{؀/skv;#٤%?ȥ'U;""GaJ64;W6euc-+ߘlocʼnLs 쉝ǃqe)eh888LY@S"?:޶_VCWx7v#ÀLEa VA.C <U'"U=>Ņ Ε;y+KQ_D?Ed05RU $2~QA&O+"rl88NDdTA98NG X!WjaC8pQ>"fa{7cQ:"uiEB` ʗ$vqpo" bZm*DdbEaf$H}̩Eђ}[U(O^!ED%*]8."TSR9U}z<ɡ}n.hTU@(`lU{'G؜Lڮ ]DqADE8e&,tF^)qC=tpһ 젪%rbE%Ok}%z^\U_;1oR91-s-{lө.6 l L PWfGR=+!KLD.~9[o0OoG{#SA>ߪq)hX3\d }9 ܂_X ؅zoqjBcn \E-04"2;p(op5rv2Rl<͕euzeH~qU}54y>8 JU''}C`)"`#F`4 v-7UjCYg 6?Gkc#qiGYq)FD?d`AUs=r*ASU+ǙBQlFc0cB졪V; p<0saH[K_K.nj#e\ ~O+zf6碈U~G&L`?l#rV'*"r&XP4 Lc'6mڬ]8ǘܻ؜APx^A-#X/ wgPoGUώt <Ɍ wcXP<Y?ÌS#صZ%ث$g{#̜J31uPպKDvzA9eD0`nDD6 9NQkw8o֯z8CU "R+ })1jFUu,y|}1ؒߩj~0#ρ[T5^R1ghlFQa\UUyR/-ge:N, <\\/Y"r +,P|\2,ՉrAM"vNٜ-K~""S|^^jq0` d~i=,FC/;aijЉPAi,Q88m=RDd`80fzIUIDa"s`qjX`Q̫5*^(&.`6K;X?Œ;ob$'67uUse1P9*es%7'0O7]=/f`F- [;C {8G3U\&94c&U""WR[A0AUX[H8]=ǩBoE`XhqAU/Gڡ+;fZGгZghQ\ycVϷAkz'Oj}pq>F}B#qi;=qqqqq,qqqqW:886gv5 W%ï|y4K=,-Ȳ}Q9U}+ ’K0*p~QLŐy,9c{ QYZv빓ݫH^OT0̍B>B. ""a]+gC_./4CԗikQ9l=,]`$P vtXb8aa j&SœZ`]wl avlҼeSK$vB2>s3aI`-,eUW<8Kae=|/;QU/^xŋ/}`m@jXFz{Z<+KKYKSֿ <^a|Nse\Q\>҉߷D&vK,Y]?4Ȭ`~o񼝾x@,sٜ[5ѻq hgcIʮDOM_33&poy5رۋ/[qq+f"e"stj&y|y-l -";j<^ h`^K&}3obo4R,"FU歳!f4\""k{j:A 7S$,9ڼ-` ,yU0zYCUMk$Sk86}q"86oOK`XFZssǠ/Y,6_ļVƞ!#4"Ԟ.ĮrVKEd%`_mAsqyŋ/^xi]q0k:`P/k4-3 dW<2]&-8щzff&ƹlI`H{i]gۗqz`L)<}b٣+93 E9oO'cކcgO|0_$7/=nĖ66)@IDAT)ֿp> :vo.]ɾ/Y| tT6\gU8ocuͽxҾAqqDdI'n`+U"O^Uy2 [S`UDUE}8qqbK28Q"2}{V̘gNQ[01oQTuM^b5Э!*>U}Q#U[旱q?.m sG,sZF&۟ Ws(3c~g@OWO)cUCwUq̟ȜU8N,qqlR:H8d{t6ѷO7WU"BމhەshԮwFVqi+[Jx+<{XOsSRi̞ smEᮌu`hr9 χ8B88@G1RH Kz:KҰr|$"aAʇc$soyn=4W4:5)0.,ؒ7rVv):YDަf+v繈fUsy9^K|8N X88XrIegӼߥV+7S2XmhnDo[]s*#xAE#T:ެ3F,KWG&{e&d'ˉHjK% 5q\qz7`988P`lmdimZ9>Z>>-~x3fGW gHrWF.cfRf='%n@H6O`0{cqz nrqq_56O'"SozEj^fcz ҕsS_+@|:Nꪺq^888ifs6 <||#Ucqƪ2^~)"_9.XFz{|tϓO^Ts4{&dޫ'7q>Jo['88 rx&о僝Y:WW7Ei `2)G+ۙZKEDv g8ݏqq,F' %߉>MTfനjk9@"&pfT8pPv30H^D6^(="0S،?𷁈o}l#Fp*2Hj8/VU{G_DU<%7ly"23p#5C$`{U@; oݓ797H#"Kdn{:88L %oR~."ÀaKW7<2.|ūY8wSFz uvk90Oۨ_rwhtKD[1A!`HԼzܧW6PZBZGUlh)"r04l,>+ߣTC84M<>?clG-~ Dz?<8f\̖> T1O~C-l\]~@DJ!t$26vƇ?U0ɪz@1ax>ފϏ"2-`ѽ^sn\2lqڍzŋ/^x /f$P&bI. tiT _1ؤ~1#MK?&oh\rM*i;˜O><ߦ)Ns^fmŹB W&:X0#hǁU8yHMhпјlI +vNw3~B圇g/^_qqg DDV¼'R 1HU}Y1/1Y1ǘ-T`Uզ/M0/YEuB't//̋y֌ qU`̛K1#%zkݟ8[I%X83 îز#THv%`*Vգw8RQE_cXPx,X0lI$c(  q\q27?̾gI5{B|qI`wkܝz{םngGrɼ[)4ٓٓWy:yof? mf>ΎZ'9cgO4/?NJ]\go~oTۋ`@&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`&`@sIENDB`PK 82-Pictures/10000201000004950000037264BEEAFD.pngPNG  IHDRrjsBIT|d pHYs.#.#x?vtEXtSoftwarewww.inkscape.org< IDATxw$E%,iA2$ H I 3""f""%)q Q%Q}ٹ]azyꮮ}ꔹ;"""""2lmƊF{DDdf6V3 nK/ل}Ow[DdxfﶈH}"̖xx:[ns{鐙- 9{U3;ҿuW<6q`0-&M=a~\_e#` =!A0h~az|a"""Rf){,S}&orۚڧ]MDDA=D_K:r0J"܂w"""""""9T\)(߸'ɡຽ|'-iz:u"""""""9fwD$O3WE[laBk1`QEёݟE;bl ``l<-}l ,X?Of$43~O~Ow+k lycy1z񗵭1ٶl>f\K, Lz⚚ZDd($2lN%7\V;eɂ..w]- ,QS-M˫%|&U6o{?~k["wv""-ZJ,M,ua%7,>gg@Ѿcg ]L~!Zwu1p:'Ϊ+|= kSy~_I|=0`PUB^}1|zv39=#  pt㷥 `#˩:.jwnZhђ(Zyvffz tul&`f|O똓C8!3ed^L6"<7_lfh]f&Z|5X 8~bf7ڸ3z+Lh̀sl@}c$^ ch&лqgf40|zN7f=z@h#4l[vym,Șo"k?{CaSQ|3u9C%CV ڃ#O#N=-O 9'B])R|t!דa`Mʆ]L>UfL,T+ԃ<#ǀl+wT{l/ꇁ!Қ;q`CB 8݋fbâ0CA5_ٓ~f3-3[W,e¹!bq`F;>mfyCNTVyBۗv"fA=E""ڶNw`fFx*7r"z9t.#lQw?fw! ykȿ>Eiv.=v/DJ#žFJzbN%+_LD}7sh;ϫ>m~ x]otf-Zhib"3OxJU]w~"^)?#L_U|W^qF$wؑ0f`f'?n!i„ks bf]s<lg_qÁ 7JwA4W }[zj d#:A˥ˠZ00B0D4gzج=wݿB4B=sf,6)H/Kw|gBJWf%A057XoH)$2@-]ʌY8@stYf$MH:\6vTj<4H Y`7wwjg Ou;+laH٦Y1MU?D0wwݍćV}9;~GY(( |[j[ĺ`l~Л1`wF~By#:k1m=i=^{? A,oɿx0C35?:R 3sNyEoCFpC<RPId@dyX.%t͏pqpi#<Ć|Rgf {ֽXЩ&nqkkLh 4X_"B 6]7pZ^z\ۚYsER/:{3`lrU׹5mu:ݙ BWExm&75xPjnQPIFV_ftGO>,45 &ra\(ۿ֔\jYοd7 }e?uzS{{RZ6T3uL6t2 o w8[nkybM3SYϑ-Wڳs"N LPZ6}k6,HUug=}Ry:w<Fd5KBfLVn U(xdmjvKIDJ"e2avgh8uclDوO p%MrWT[b Y* 3Ձ֔w '"u *4c/[L$LpXvafyu"uIJ6"5C\A,BzV olЄԍ#LZC1ElB8 lP);&.of˔jWf;7܄Vr1za:w0뉻K YXR<QWe\,z9fU쎥Q *?7gZbԑ RD5t/2ojs!𠙝if;86d A`X eU6f}K1t,>gfmfJq|O-'%v1WwAR7J㡵wD=1A;w(b]E>wbM4=zMA`w=3[,eKSIn_&"RBAiNkf6j ٚv-|J;Gؽhcw"~aj]2..r&n$R6Sى@g+]OM%i#5TI'hY"{K9t݀6΂ɭ72:/ޥӄ "`fa)cv`YTTo:R=*{{HA5 )U΄#i{xs_d(f3H']WDd($g~-Ye90⁧M&ec)ΚHfgŒH Ht_իH7G$fς©$M}̞zf<ᘝsfv) lyV/ofўf6?uKl?5n^`ۂ&ߠA * w?(f[jnt%} avF233SA<߳ͺz'`f'`j> ZoZ/=tѹ@,q4cf [m7S#hfw]Ot#TyݙCWq]ff*ZKM%"7&28~1R^S l%R9iONN5#酵.pDótUT`*/Sk,wi+/S$w@~lIwϛ¾=˨o-hfɩcŅfs%ފTWtH TrNۋ꬛j$7nё튆=f;9RDJ""q #Vڻ.87159w>NHV;az*&#$ ^vr A-9bȧ&En>$69 0sʪvAzf *a7axTӚ:wM~эYkv;w.)(/kfw$rF L=Edhh`9K$f3[fEkW_zl L[?Fff;KrW&APgli'*9s4<&zC^Gs63h;鬇kw]GD7{EANfy:nGF:'˟T~&+DHֵU_Y3sw&ծ%` #AmUZ ğ6GӉUe!u~1!gJmf>u'r{B@8>h}!M-/%VԓM nzrgõRyEQ3VOL.{;v5MDJ"LBp =f˻T?Ej9iwolPbCܬڲ ~a, KH)S.wOf5 CZRtC;sGݿ1M;Rߦ|Au+vToMl|6-O"p~uҭSPDJ"Do5*Qi_Y6dX'QAwWQR ˆ4j,([1$fJy-sC$_D|]̬uIrԹt+eu駬(vX; ->`ۈ72FKC%D餟cf֨7y}tـzԤlCU~=2ԍl4~UFlvB) cGOl'i{.R7>!wkRyl#u=1wOCRJv$ć !`*oH)$2 o%VzCRk֨3V7-ךY2׌-ff,oI(_4VR]|G͑|Eynp_F(XaC9@Dt~O# YnzVDsf,i==Ԑ =uv}r^,"ŋ0z(K/zncfE)p4o'ʶo0\*o .]S>7^ IDAT }a`; ;Q잉_NѿTKDd($2Kw!auT/H`նמgUt-Pؐ:Sfa9"< r8z,Z-J0b(z-gb@|VXp/3:7aNG m/}G& d\s:ڵU7#m3[[ԭ;!5U^DRnw^DJ".˙ʃ4\+3u쫄^KiVfVNk27݄,ozسҠA7nY˲᭿gt?%D"fV8xaWP' otpbMJ~';G/mc}>Tl"sGl M"w5O6k"24J'2&d3nR?$ӜV__b>jf?!?+l3nX[ifkv42QSg;ݏ/SOeve72|2gSc#=r\ٝĭP,(<{zY/x+RD.^ݯ6/r3p}8$:>w>[ Oٛ`fwMklg̘ C){ 3 窼My\#\:Q99u^o;Q\9!nI~Ng`qYrOcdMoezEb)gcM\ v^y_sTζNMޖ(_ +>dC*bW:qz2On45QB@lwܴ C8CJFپ׮g7e 0H}x/o{B~IO\ŋ>-Yko}l*Vu>G3[t2uw%2+f=V#]xq`uBpdfOtwO%ws5 G0*B7Kf?Xe?'Wlмef?'{wXلL! ɂ2My6< RuwLs%>H8wC=f`Fs[EC<{fs =dwm ; Prʶl}ꟗ3)W%"/$2<~NxhY"_33|.[^2 SMʖ"~.yF'TƞZ/LSfvaXY'lm=WVAC w |Ymd"MMs65nH-v9)3C>@޽8ANw@v=8zbQB.G[[ ""2TY͆܉r* )G<ֳV0I͞vcZ!""""J"""$TJ&""""3MDD!f6 =twϛm"9g'RPIDD9{&*6Flb"""""UhHQJiE^8HlofKvZ|,R]w}THL.0yV`fK%o-"""" DDDkm:%3[ X)`WwԢHmofGٲlm`fnxtCEDDDDo"""1?ifv/p?!KB(抈 """c | _~ |ݟknTi- M10O= 8hy"""""PPIDDlv`=- |٪/Od݄Ws{jb *Qtݟw[DDDDDPPIDDDDDDDD*QPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD*SPIDDDDDDDD* %3{#tnqǺ-3{=bnsў*l`Ov=""" *Ȭc+n3 8 mޛ6B["ފl \օ($"٪W}nJ"RmGe""""""K *HUn{m6;fvև6Uq%0>%{齿?m1`s^_ةmܽm!bfwDoascfo#LrwTl}௑ Tef;DvwTPO%)%PX},S4~=3[ "R|? "3+RWw)CA%)ݟ5ǀ#nJ"igہY>,J3" qūrb줞BDDDDDDJA%0 /79z J}l|fH)$"9I""""""2 7LA%LA%LA%LA%LtVVޘ-f}zf6XXX ?[̖ǁ~szsO>ǁԆ7x <(,|xݟib#>%f׻mj0% b` s:3[$k璄Q~Nw_Tfz|1¹Agw?Կ:gl1f~ ̊TI0KwXdws}n UvjfGsVj]DM@lDdm[qR] |F{- " X _r>;lJi3j[=sG`q38ݏlN`7`{wP^6U۲E/@3۩nnr*k~`Kg!Vvǁsۿ:[V $6! zf7#?{3KNPIhVfWonoPst38`f{gSe] \/GH'kCw_gikѢ%zxˁyyN?gk:~PJ |E[*|^oKu$*ڞp|)oy&0W_{{ O|NG_s[ol9d[fv^nhwx?{;h p70ӍupRgC[\]~/ Gfvr V 4;|GvP>ִhѢ}QN%=gXs_1c^̽*L,Hldf 3b=ת߀$fp_3ۻ-Ms!W%Y1p-\̶$/t 2Ƙ83pa8i_ٱY1fzH~[ f33+[43۟0ӄ1N8affÏED FdV+] m\JzJ>ynDt`.M!8z0kכ&5w0ׁzM C֍r B>fzYL 5l`^`D4hBi `>wp.lKQwdNG 3{/aZ^`49}!7ڄ@-lfk7N%זXu*K}w p!N$ߩSړÇg0{=#IM,6z]*ct|6?!iHךzMUDDF3KY觵.dIIvw.%wdznߴyw7~^DHW;PQmn H$B}z &ÄE Cv ʉyX*Ӿ~0R<8srED%!j)anh*' =A6݄^K&$Ɔw±wc=wLA$ Me!w?3UGVϊ^N*?>%ߚ\!UyR7yucU΁qGvdf;Y&\aG׻13(z=ǭE^pTh#?op17p{9Mv 9#9 2pɂ _%G kqu fpAxk՟vssevNȡ}e1Y^9\ K$4?&?y33 x Np3% ZHȇ70&w:z;-Zi!>ú&< w[k׬vʩzow̩D-M$\r#t{gqZPgs;0N\0ȿo-qݟSW2Vyf'$R/w퓨{.|OFŚͫ7 9.{${0w6&`ں9WeKmMaΩt s(}\B0S=mmL^}ljf0|>ئǔ-Z]f"q;?Q䝉م5K3[p5Nw;`V9aqSTw?vbݳYՆŵ'^uCBAH\nM=m|6pH00/Os}US_/gCq2ef܎xhQ̖etVwz5ܸWxI'UafKzŜm?" VӶ!mfP:4w!S7,5\:v&*e:"VDu.ബWe%ftb}U4|>_R}""Hu#E2VJcCfv`=B5K<./xSIC!'yF?IBs,_aJvD<<7!S%fH޾0DW#SHngC9@)"24T.nԶ(J1rxlXU5(J8ੜWl~GH&{@ʬ%6Wa0VB~<>I}'wzy}3[{i0<̂80'O,w츇0CF\7KņՕo93[ PbfFXNgqO?+*$l*PIqQubU;euR!lAݯzz"/0O !!y""@A%bPO{ϣm-MX*I@cŰ.'`[*|[û,jBY!J=tzThWkQ&TS\YE^79VNMێ,dfK0c_zɉ 2E$d+("uK3 dLCy]v#= K+ } ԑ5nh{* Oc˖yAuݍ4j0>Q1^°֦tgArM])D3Pn(o:Qp*0yӶ]mmr ﶼ-&OOM˕:?N .KO3m"|̮$ {[i !H)$Rbfdfsv'5a IDAT9#]3pne3[c cfiM}?'b5-=T*f:a* 9!&e-pd.%Yڹt3WK , aj=mrߠRݓVMz8QV4m%ҽ!HMoRjn~VTtTDts?p7PPI314x&feL~P BodP)fə4qBu􅙍>|XdOu|=M^\gΗssAXgf7eEgu=p}"󧮢 S`7E8?gf{%WDd($ҙXP B'TrN7$">+ ZI9^Fe e0~mM(paIJ#C`>7e!zMN0z9}oY7eEFg~|`{3܉J"p`Ŝlvw9Wrn~]G~lwbf+1ztv*Cl'tyuF\O^9^YR-f0uw'\Fuff8_tV¬_ߢa;A: - !r*աHMɬTf;M͐94hmJ" |!"۵ThAd+r/WE_ߩhfN<ac ww3{a6"gfv *t.Tpc؍>=z$zؐ>)JtLsl| ~o=O; X{Ll/" *4'֛ha`?IOB*ޤ7ZDyA%`9apK&tWQP3aUoPs݋lmJI?+v>+O~p3[6J"I}v0 =F6ˢ=ͪ9J/'VI太f7 mK cKffM~Pk؛/uE^Ϯ͙L3{=aV_mnI 6c9LDd Ȁ+p_lw;F=-w-mfoZvMT~L&oMŘU\(K #5 VwO%(@luc"QQy'0mPR3.D̨eymjol&*2Ih-Ř]Į }$ʛ0e>/\޺^``O vͷ"N""/ *4$^HbۘyhZ^D0j}[MO,$ʚJx~ͬ&;$\S:W7}qYƘٺm/O*YӉ붫Ƅc| Օ c|s mHHC:|PF8xxo^w'D]{;lHϕv,"M&tqγ/oԞ.X"er6D^/@>,/}P@4RSAg)>Uv#'B,IfQFw %~47wsy:ڔAD<(+>wݯ6?T5}Vk.ݟ7ODVy}S2pAN*?ԒC0(;[m|639Oڬ7PPO%f]<){?:^BwVrwMF-~A ]"t;o]2+H 5٤Ӝf*]2fU%~PIhmo̿嬗:~話 3ۿ?$?"QreI)aj~([Ц63[6%o'VHS,^X3[pUwaچ[*FnaobBDQ1`ƭlŜŌ96T$?CwT:ӽVS]Yo?TUǮh|0+qy/S65$X/@MaZ;?/ÞwV*In>y,a4FB ^˞+]FxʞN2W$j%iNTfL~UN C\ ~B&)j>C6+8NFQ$[8>}9a0 aIjNI WU7v9$d OLInwvF[|?S;dc/ЍbqeN8sé.XgRU熻Nx#D7d.zP"GKZ$fBKq{?GNxǝaVjt~8O8 x :`+-w3~w󯲢l\>n<c_LFt#6=35y ؆}@-))v!(LOt>XKt#݇=sP1@ 7tS]K|2,}7 L7o5ضԯh{^<&ڑF;̽]cm>t -G1~r_v;%t#n<9nTz_>ۘ4tΧ{xp}GT<AtLUM׌KalYU''7^*)=oOŠ>^2d %}??nDߟF_ݎfkQw=غ~Yk>U { )wϫj a4//7{חg>~:/V1q}țX{s?dMoqݶ3ox{N[M3XtZg+e3`Yĕ;g_x{5=S ƾ[;f~,n{Zذ=M_B ]d:7ҿoL>On7dL^5yO1_~/TfAu|eoB+2y)0_T7e;&^k`EN/*,.'ϧ?U_PUdꫪTu}iy-|vQUEo`:l%t禴Q+UU7b[S9)OjkSY#fy'^gLUO7hUիшtS}!U SU8݅ӿKP,"tӶ&sp$4~;ImK6LW5}Vr<淦݉ndN>M7jx:t?63LLw˝g ׳ғM\F7KtfH.:YMG]%)sUu4 S<:cs>O]k%KL$iAP.tk~MF"wv GG5|+8MCKCl%#@[u?{V#5}HހvL,ݴ[5!.kEv[IrWtMɻn7,/dnto=ڀA?XQ3k=v{ +7t緥ݚ{.ݚT?˦x|7{>mUYHIQ6$I$I44T$I$Il*I$I$ih6$I$I44J$I$IM%I$I$ ͦ$I$IfSI$I$IC$I$IT$I$Il*I$I$ih6$I$I44J$I$IM%I$I$ ͦ$I$IfSI$I$IC$I$IT$I$Il*I$I$ih6$I$I44J$I$IM%I$I$ ͦ$I$IfSI$I$IC$I$IT$I$Il*I$I$ih6$I$I44J$I$IM%I$I$ ͦ$I$IfSI$I$IC$I$IT$I$Il*I$I$ih6$I$I4U[h!ɽu[$I ]U]:$I&jaN$3T`a$IҊ\ x_U]:$Inl$JIn G'IxjUuiH1 N,FZZZ$ISrTU:4% xH,s fUuU0Yd9$IҔ]ܦ:4_% 3`Y$i_Z߶m@$M8XZcCIe;5 M I>HU;!I+BSI$IZ:$%hfT$I6KZ(Vo@3 I$I$ ͦ$I$IjiB%CH$ix6A$$ _nBҢ4l*I$I7U!$-NIZGP$I$IT$I$Il*I$I$ih6$I$I44J$I$IM%I$I$ ͦ$I$IfSI$I$IC$I$IT$I$Il*I$I$ih6$+퓬:$I$i~$F<$olG$I4TtIv> .ɧ6$I$i>$K9p07~nxpt}*I$I|dSII1(pAGVsM$I4TDˀ{}~ѫ=830$I$i$oKzVջ`sNX9)I$Igl*I#,Wʇ{ݨ G~tSENI$IcSIQIxZU]٪X6plgrTI$IH$I҈4b< xOt稪;/Hƌ$I$k6 JWMy窪{址?ݬ$Iͦ4"܏n>u笪7HrW$I4TF@e^Uut]Uk,}W83{~I$IdSIZ䒬,n+>8SQU51NM򘙺I$IaSIZfܻW"LWU]JxzuI<'I$Ij˦H% ]UUqUuMU W^bW}J$Iڰ$-^vKU]=w\U^@8t}I2$I¦%xQ`d2Tǀ]{$\$I$J"z %Uu\gO%Yw$I$I M%iI^r`eHTՙ9ӒܾI(I$IҴT$ 6(] xZU]$"PU-^y$$I$i*l*ImxbOFy9^I6jJ$IJKJeҟF)^YI&$I$-.69)z%UF^vI&$I$-69g JW;VOۥZܪvzueI&$I$-69uUujTW^8$^mRI$IgSIeI,/74r/t#ޛ=$I$IC$͢$ˀ着64Ҫ]_d$I$Ǧ4K  l+xuD#w&Yg$I$I˳$͂$'{VUI1UupOcӒܮM*I$IZXl*I` d $IcSI$\UoI3.d6$I$i~$MQэP{z]HAU5yV7l&$I$6)L:xH|mi6TM_ mRI$I`SIO[nxbU](fIUl+8#Cۤ$Il*ICJf`^7UuiHeUu!8^V7l&$I$eSIB,Eˁ'J6$I$JJJ#p@t)69VUV acqUSI\]$IH$$ JOKVtS kh1Ǔ2a$ITV sjYHst#<J5=H$IJ$X+vPЈ=$4 %I$IsĦ4$'w?:$0.c6Lr6$I$iTƑduHQ$|6X}3;=KjJ$IfM%i9I|xl|&𔪺M*wUu>h`i|$[I%I$IǦtcһ `Q-Uu)ݟod6$I$ivTzxet.lI LU]SU+|>>bI$IҌ$ $ xot1uU(xpI>^I$I l$ o*`aTZc@KÒܴM*I$I64ܗngYU_kJEU <O8)-ڤ$I鳩tu?ܿnIPU lR>8}$IǦF`RjFU/M$IŦF`=>ԏ9 ثM":O=݈-ڤ$I3y )ӫڤҨmudF$I$8JZ4<xct(4c @A'pLI%I$iTҢd[cvUFWU'[F7ܺM*I$Iʦ$Ʀ] ^UgK%͎>^3ܽM*I$IȦ$_XU4$ͺ=9oލ6$I$JZl,n+>(4gcc{[HuT$IFM%-HI+^(42`g޳M*I$I¦_W>6vڪz^yU3I^&$IKIZOI̳SVXU4#5WUoKP7'hUŒ$I(I\cKk6$y^7vUuiHҼQUv.땟d6$IlHr 1@э?:͚4Rl*iHB`^:Q$iީ\WZ ڤ$In/?Nlh#IΦ$; l[UmI[fzM3ܩM*I4S8ت~<8nѳl0aSI^s`nTVUk,}W$lJ$MWo.@U]l|3pfG)i4TҼ^1sjYH҂QU+85cۤ$ISd'Uꚪzݮ'%yҜ42l*iJr;` T$7^$OiJ$ +#C7w&{};$sQy)ɺR`^UFgWM$I_sW+:fp!v[Hߕq4c|RѼdu+{壀I$-U/uRd7$OIL7z]U=N[/t {%ZS҈C$+<(I+>LKCܴM*I4$N[CUa1n'7zFJY64޻ E% +mRI$kl窪?[5En{2+i*|P3I6m:f:Q$id ?蘛_J6$IIn]}V2tk8<ɚ}Jj"z2v="I#:/^I7j׉&y`I4Òl|q.?v[gsu6JsI+ w~ȠTƼ `7I4C;}SꔹPU6[cqSM;69$-<64|7Iq4Pۉq In&$I`5VՑTEtk, ܝI<Jkv1SU]( $pn8$iJa2`= UƑXxp+IvjJ|fSIs&ɾ {?[v4 t y &$I [ ;76 XxGiTҜH m?vKHVRUC7e^I6mJ*ZtS6 mUǀ6M;$-Ϧf]OJWjF$ .vT1;I%I’dUF&7=꺶&VU`Il*i%OU^x^ `6$͆=pi,$7kJy&Ӏw|Ƒl0]ow`7l6l*iF F( xVUUTfKU-[6#%IYI>\MGMkWq,ITLm]Fy$ͲJ]ۤ$$zH3> \ |$;K!64cxv{`Q$Isd03;݁@J42lLàGUu4h|`$7mJ\1NutZQ$IsΧ{cyB<’6$I[Inle0gѪo[o$M%iTҴ Ht]UQ$ITեtGY863ڤ$in )'GU;g[g$STM%MKMCUkݫv$TUTճ7ʫKbI4  8 ū7<8 /pvM%il*i<x46w"IZji{Ձ/&yET$M.=6YثiiAˁ]qHǷM%i:l*iRI k'TK%i1Ϋ O:n$ In |fRU]WU9w|g5%il*iBI ܴW~NU(E>\+1`2gj߶z$֟NƑ$MM%+-zTՁ"IZĪp`+^I#Ij)1cMx ^.^IVkKl*F܂ߑ#UF$:x^QiIn$$i%Y8n3'UյmS-.Uu:{tiJJHrSߑaWI$iTOi|?$nJ4>L`iͰ% K^PJE|𔪺n$ifU՟wNO6$I&ɛ6UF(K7$kJ TR{zPUW4#iDUE/'%٥M*IҨHB`?_G UuȰwض$MƦHJmǜ , E4Jź?+EmRI$ѽ\ l[UhiTյUB`$OoKl*$O+] l]UlIX֠|$ooL%y rUշGYU.)t&ٯq$I㰩4I? dP ع~.$Ӂ{W'[KfBmP:Z8ȫCxSO%Yq,I=6FXGҽpB7 Uv$i|Uu-pI4$kI%IZ X ]U_hIUu*9plX_æ҈Jr'1{W!"I UIt;TW~mSI4b  l+ xED4pv|$kJ$Y8Aq쪪ɏRKUo`FI44l*$}M龀JZh1t1d6$I AѽM5mSieTյUk['vԀMrcFy$iZr`g+cJ6$I ݀VehHU6 ;Jo<Ҩ4"x~'`WH4#zW,_+|2ڤ$WI^ت.lIS4v p1$ΐ4Gl*${o ,4$I3<O_x}OSyoUUjITU6hIn64:l*-rIBv5$I> 12f_U]SUϦc=$OjKZl*-2E+6$(c6[kMBID[_n 8`g}=$mIME$ɪtk(WUUUmRIR[Uok%yzTٔdm/oH-TՁ6% jq$u]Fy$i^ &^y5$nJ4IwD^`]Uu2/#4sl*-IB7smW%I@U/z{R$%*~l`ZIE JT_Ey><W~px5ڤ$͐O~lSU6Σy <8x(lJZl*-pIv]l_UjI潪 Uʻ^TLg~)p.GHgb5 dͦ6x<XePؽnJ:cp$wlJ4I[7"4yf`kIvmJZl*-PI6_PU6$I NUQ|o!kJ4$mXsCUq$-U:9aIjIZl*-@In ,XUlI:x$^iI$$i$od IDATUuZ6$i񨪫4fuKd#D`=UƑUn㎯%eT`SiHc{oOkۤť:/^Ԡ!%I %ـt{zkHZtx|tVM%6w]Ak`۪QIZtϹWʯ$5d-ӭҶ;]ciͦe+{mF$iѫCX^+,o'ICIV ?3ܮХAł+7!ޤC ( HGz:Ċ"%p#H9ܻ=J啜\ulO*zM8a֯*s$}8UzrBJ"");B hTy`Mg͗!<Y$}rRkVYAU glEV#ﮓ*"|rz^`'+>`1TP\ *o߬ \U^ EҲuREDI{RFA< n#E=Xox8N%rReF'5Z[am? .uREDtI. \+oFt,ۗͥ%Z5TJS"IN/۾^~*cuREDt>I3Q6kH̝5lrsf]DKSIKQܔ lcz""bz' 0U^AZuREDtu;A]4liEVIo*bTQp*iJ""b~X8UTuREDt&IQF@"ED큃[噀$_)VDDG+e,5l?\9Rtkw8&Icꦊ>i* ISU>أNNv&I:!ї$mraf{$S7UHSiI p`PDQQ>TU^]RuRED ?I>r N9t7M1TF*=kו"EDDevk[0*"b4'2oN_DuqKwH`T'Ma"&[ھ^gsWJڪN'i62&1IM1T+EcE`k*"b4ۏVn6=nlO+;0vcEL4){_*w+Ebo`WʉVߐtOGD7;؀x]UQll ,ʑ"Z>!IsR6ZU>>"EDD} C$Z'UDĴt0ehۏMљl_</TI3W1T"? W(""IrukcjII1$ X_+Gho>Myn"PJC$`533"""^ r dpDt IP?e#Et('%nזtVOOU]=j &}uRED6Ig)7WR9RDW`e^ޘxMTN̤Q{Hl?,LhDkbTp)e6)+~.IM14 ){<c1K"":ŁlS9RDW=(׸,4倳xÉT/UDDJڵNIZ, |V3llLN_H%Mi =\gk?oJ""Gٞd{WJ7%!IED?kS],j{׸$"(t*NJ4E)o>RʭV=3%R'UD+IK(wپX\ҜUCE4T '>N'O[cN U[)# &MlX0 i"TZ_+>W)KDD!+ʫ7eD~rl_rJIﭛ*]JSc@fYDDĈ}'0 ]AvI望*"A3(x'` ۏUWl? @yI+U }-Mstyֈ[[%-S%TD4I;PJUїlO9`_``-*NJ>T}2Vy4pꤊ~eʣoJZNE6jDDEj^))cĥ4l2yG$NW, )HREtp6``c?)" &{f+HJO[)Iu ~VyFxIT `6@WdF#;?4GP7TFk< 7Jk^j*I3Ub$1Y , Xvẩ4sP:U })0eDL _yH1@9alᖦtmC[噀#X`^XbMX""(Βw<1y|8x+eDUCEOKSi*0U>X #)k?JpxTlI|uIsnDi>|؏rIV=*M!dx`#VybI*""UXbV9%"bپ2/KhmDg5`s$}rAi* 1ۗIZNW,X(ܚUBEDW}e љlAyI>@ eos< U[kd՚pz<exuRED7W@G%-Y7UDLK$^7U4RIl.U'UDDf§Z噀S$}NfT:xꦊɱ}7]'i#DJèV MV*""PRK" ܍4IX1>F9κۥ4l?AyVy.`ꤊ~f8`cVsEY,)/ΓGD19ӵӀSN.S5Tt4F-o3gHګNg/KG9e0Tl d pDm(K6+T~ȏ{n!阼FDH}+ep2o*"k)<|8' #:(3ϗ[Dэa6oH9&8>V9Rt4*}>0w1py뤊~լ_W.XXb:"~rZFuSE ^%LJؾXEқZ,qn<7euRED7k~ U7UDIZ |ݕ#EIS(׭{)wrW'UDDf,*"Y3x6+"Io &nReB9|s&fI+IY,;\,qX""P_ iʑ"Z3vepoT]* ;ǀՁZy6*""́Z]sX""퓁g%Fuk62^8r#)bxIVyVʇɉg<{&>uED=2WoP֘V7UD4#e~rG>mۯ~UT '"e^~`ʝ#$^Go?jd`N`i`#:I M7N~ldy˥ԁY JNGm_)NDPNJ,CYTxP=Nҡ1)z@J'[-(箓*""36)bq` ,` JcuSE&IPnX*GR} p*pE i `Vs)"zÁ%W7UDop480uE/IS9H[R伫Ne~}|*Eb_sE5KBX=A'Ӂl]9R4?wonLTы$ *d:"_>XxNDLI.<ƾ #EJSK4ϼ \*\#1$ \|Urz "bپX2aO\IM}s}iHѣT"6Nl_\$)#"bzz#`DD3`[M=)s}k\1T2'8U8^!uREDDtV  ^,&mUCEtIP" U=.M.e ೔*I3U]H>ɺረcӓKR|n%i6 ]&~Rk"o \&i:""H8Uz ,֮*H82z`+ۓꦊ~Rk&Iy]N/yTb/`g`6/QX DHSZP=_Nd\F63)"U>x2OpI+:I;ִdHGT@i,U^G뤊N$U|>Ϩ)"bؾ Xe,IMQyy+G>Ri~DY9`AIkV  sX]_)"b10 =eՒ歛*bI+G>Rо<exuREDD'h_Ul.c>)[)o"FUP!n`#EJS~6L)Z)VDDT9Ȁ[-&"GՀ P>|n'i)Mm__9R4z}// H:Y9׿ֵ\<ӭ)ppS>D/k1] |#EKS. 9"I*""F=Z()"b؞d{w`W`v؇T1$-L0pH14틁O/IZN 6hMi(=P)RDİ} 1ẻV9RĐ47m_9RR߰} ,1252EDjx)@ywP%H:C̕cELIRf( RکnGlHU^M뤊 4%}CTϼ[$S7UĴ4e*` 릊xYJ}_E V*""xy=lW)RDĈ}/t-\7U4eF]dFt4s[幀*""q򑶏)" 4.!M1$Gy~`t=.ԧll* @җꤊ!i62ݭuEDeY`#iE%^7Ukp0O` )bTc.ڀ2nߍ.>a6=""zIw|RҶcE JqSۿ)bPiZzU84X`(^GD3K)(IZ8ld#E4R,=*o4oT1%$ |UzX\їl_<  TI3WgsY)')5Ѭ^k"7IF6ңa䒈fV`>Ӕ~Ջ"Qmnʑ"HJ _M>vIﭓ*""&GhV9ʺ rIDDGo*"m]9RKS)(^oi"i:""MG $`|DDV.>!UCEߑ4'0X8>#EL4bl?FksI\P7QKS)e9`c:IڥN,*nA.Wa{흀$m]9V8INȿ ꦊzi*ū= JF0""F9('*n{A.)dljϐʑ lXDL4b>= AְFD ?I3m(">Xx 8D҉߈!#i`/葈RL1ۧkO[c%U'UDD8z3`Z'PҸ1$m*|.SYz0rsO䒈!Ϥ ~8\$E4eגuE 4b>؁ƀ$,iJ""(3h; a`Y/Bf.>FQmM1 *lf{䯊lX|Cһꦊ-`+wZR wj? &i:"":7-[,CeI`mɔR>._5TT#KCͶ숞R ۿ4~*f:"":]/Jm?2%Ald{{`>IV#Lnv IDAT6DS\9RĈHS)퇁kZ兀%*"3H8UzcO\YiwsS+$<cW#E4b5ǂע0pOW Q{F1UlN%$MIJw&ip> `S۷T1.FDS#fN:"">Mɔu ~UDDtS \"ib8Hz7p0;*Gqi*ňqer'"7W>sK""ؾ XXyb(5>r*%>FcOϵʟ.:""yqZcmcK""K~XpwMCAқ>rjT*l_<*\)fl8X^uS7IKWs;۾rRt4+PX Yf9jF@ |2S"I_/IZ8*Ghi*EdzKsmOyuREDLҌU>mۓ*""l< #ۙ):r$Ki(&|i*EWg`YV͔KI^ذy!""bپX~w*o\)i*"Izp0GۗrIDDtqex%vI 8x cʑ"RJl_D0MP%TD$I QV /*jJ"">xodԓp:"A3="AJl2Ȱ}a)@wIDҜX=$4_䒈!g2`e ս%Z7Ua`f`VTaOZQKKI@L[qg$~f(fՒ櫛IZ VTb;7c[20"I~i_1lGz+pMչ$-ˏfʑ"zBJsl? *NhCTѭU۴Jj~DDDTc`5B]"i 'JH=#MI_VyFIU]٬oO` rIDDĈ)pʲ1uSuf\X7QDoIS)z[%H,IiPለ('xpYN胤[lO|"bj= Ff*":e)B'_>i'_QW3'hc C%r6~k1T`#Z *":wS*h{ DDDt ۗP>$R7kF^<@ytʑ"zRJ7l, *)UBEDG(0U)"EDDLs(^`K`\3/43P^C#E4eꝭmٔ$M X|C*Ef QʔUOƔ[9RDOKS)+׶ 7JZNy,euEDDL?V. .uS I+gRllG#E4/~* \!i:"fn'b""4é7YЋ7R%-Eilg{\H}!M[_hgNoTQZ 1+lO /Hݮr!#iq#s_}fH}#Mk.v&ӡ+)F"z݀[)b䒈eH`S%fCZW002[]9RD_1 Ϸ;JmWED7)$$~/Vt+ǚ&梜PZ8ثnRDy]xUV*"Q3 @ME`Cw~UDDDo}+e#}6f jhl\ ,"OJ-oln@(fiJ}WEDDۿF?\Eқꦚ2͈3)K66RT)M(o怜`䯊n4ilA.Y\{ [`mTѷT ZE%2"IPZU>7+Eilyw'i?`gʓkdFD]i*E U6Uщi/v(""s؞h{'`o`.ʌm*/vlk}rRīk9"bT ͆1xILAҧZǁ5A*lX90AҢ~ВV`ek>O??"^[JS íJMo*"^AIU)RDDDױ0sX;Es#bꤩ1 l ~*]{&UDIlv)M}ST7JZy8LIsRYKm+Mid~ʳ混ond/a%n/)""ٞh{G+GIr8,I3W*"jIS)b:~X2S`C/UQSJu'ʳHyWEP4;YuEDD&g'C% i!61LT͑3J:R|=X|-mGDD =7P@L{JNwЈvi*E !ۇ/_tF|xD Z$#""{)c 0-À٥TbOnh6YDt ;~q'# >!S{H,T'UD]6nPcHlXU^IuRE!iy,^~z2CREDDDDRDh * \!SuRE,I.fmw}UH14":-o3KrT#Cy[lZ)RDDDDD4":=ᒎs$**Eא/ff*bI!V$)RD}>0w!pꤊ:*ln{bT1%TpojnXPC(׿ֱl<1TFn.uRELI{JF~R i*Et PU^ i:"-oJOclRJi*Etۏ$mZ'Uԑ*p*;륊RDeͱ,9v*bH p1,mm_W/UDDDDDL4"ICRǑlԊ(n}vH1Tbl*-i_1$i*E锦RD`mVy3ʜ'Uȑ:r]hDDDDDt4"z+7KZN4#pL|IuREDDDDPHS)G90 }vIﮓ*cZoJy"""""bCl XQpe뤊~%Zk~RBi*EVhATo$m *=Ni(=X)RDDDDD 4"zg[ـ %T'U Ikoֳ}OH1 TQ'8Uꤊ^'飔n35IV'K!Mg VyIIi"wWscJ"""""blDyVy IsIDB8`VS)RDDDDD 4"+(*(i:HrBiVLuEDDDDHHS) p_a6IKIݬy#5v]'UDDDDD4"?PK?oNi,}Nbw$EK9D (  *0>  A%ݽ?NL9gΞ}kSS]ӡj`; C*DfC$y OfJf5fv0$v`wr8%񤠒lݟ$nf{ T20G!IDDDDDƙJ"1wwI?3/ X2;&IosT$Dw03I̦X2D`^wbxaPPIDpÁw%~kf T2+3y䏺T$"DE~*f$lJ&3[8X,ItHE!SPID:%;ˇS*&3[8X!Ik-٘J"2 .I^Ndl.T`$,#)L *H)wx=$yB3{pJ% 8 Iߐ$"""""Do~':$yyblN'-ceTRPIDF l6I^8xLP[~Ev/uLDDDDD'Ddw'ɟ~mfs P$=lw H"""""2 RPIDx ۀ䝀lJlKD/2JDDDDDfE *Șps̀7ٲC)lN,8RȬJA%3~51$y-r3{pJ5{2g &ɟuT$)$"co6LW.5MSً-,$?wΐ$"""""J"2!Ibfj`fVIONDDDDDdPPIDƅ?$e^3{8l*@0I3P %"""""J"2n} |5IafXُxORyDDDDDdQPIDƝ0#I>̎29TI̾ |(I RDDDDDdQPID l<$af P $= l D"""""2)$"Cg$[2SY qwא$"""""J"2T~1p[pb85نS.~J%"""""J"2t~X{XZ8O)C*Lr *ȄoO$f85I7C*T ݟ *I8vN&bP󳀗'ɿNDDDDDdvL(I)dfs&{T"""""2PPID&_>N 6U3Mtv3`;91LX$f6pJ51!Dۀm!IDDDDDf3 *ȄVcIljl IV$"""""!Ddsw%ي(ӰgMC*̦TY$]$ \nf T^v=x_1RJA%e=D e lj|jy!IDDDDDfs *,&I^8vNƖ-,$ݏRDDDDDDTYO $ kfNƆ- 4I4Ddg/ }fNHNDDDDDDf..If6pJ5zfffI_wJDDDDD$8`$yG<3[d8I IDAT6wfH頠L }IK%)U!IDDDDDdDdpkՁ)U3f$)~됊$"""""RJA%T`$%fᔪ3{p418 ~ %"""""RAA%tI"fᔪ;3[ -0W;"tLJ,$yn3pJUVJwcT$TIgIٷ*&7fp\|2"ԢLzu`w`zWf6WTc~2I-HDDDDD>DdGO'2ʧ;f68T}>s#"""""ҔJ"2p̀́ lq.w&ݟrEA%_䵁S $ lEDDDDDAA%-D`$yR3x,mf_Ov;r""""""̖!IbfXm$=l׍DDDDDDƒJ"2rJN1,3[8x`Ww #"""""2^TٚOw݁kX ̟$OEDDDDDAA%ݿH4_dfKK%u;O@A%x6I ;3|j4gHO>3rL *$t`s$ykfTT#~$GQVaRPID$'#`7=?B J""%F`c$y%r3[|`f_vOv^P!QPIDC$'3ۺl3$Q`+ww *"""""2 *tOc*$O 4m $=l󂊈3DDzp]o's0l#nSgsKƳ""""""ea@DdVPsfv]A+yI>bTi LKwO>GDDDDDdSPID!w? x XǺ\$qHB`S$\`HDDDDDd|iL%>f!`Š""""""J""_v9DDDDDDƛTTTTTTTTTTTTTTTv&laBDDd6 """"QPmeG.Ȭ@A%bf !""J"""""/@""""""""T1Ȩ """"f.C.tJ """ҷ_"zȬB='ITrǁ]A~װ !2]Lv!DDjgA.4v]v9DDz 2B`̶crN.٩"'3{p°!"őaBk *LVfvg ,""Do]]/ޘdT$ln`_`m3_DˁˁteRPIDDDDDDDD]RPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDSPIDDDDDDDDcxGdVbfKV|?0sU|}OgfKU|?-dv_cYDf5^>XT|oc"O˄;~|h""""2js٪}c&$pm1l MQkIDFz?!` #f1˔ EǹL*٫ pp8OٜI]=Dj0)$wWO1df~$SV$]k r2k1ϟz*,5PMaYò[ܙ_8̪wfw3{\<֤|vydafOlaIDJ7ef613;8Y}5;/32p7,C~VLs( :̮sW]|z`avfAd3}`R^3; %w!k^\/)e_MJ"""+O."""""}XP gg+Z\Ȭ.nĈT*$5c*Vhfhf X6iF~۰ ;W|}_Q[ x 0^ 3Xx+yggG}}|Nl [Qgͬ{(ۀww!E5~kyO)| Xnf7tZVɲ!Չٽv;ݯ.T=wC2سb߻%Pf(-؎=Gr~Mm EW^J[ı?4k5b뭉u"b9W﬜IeG)#=t%VvWgez^Oڿ:+Nľ3'08vn~ݟ+1#sEAwnEy ND=2yOum9Al2L%~˻52,GܔifW'/1~{~Ji}UؠbOJWvV#Dk \I 6(}xsp77Qts0r؅4q\Un3{دnN."P=+=,$ppc9{m2G-E͈sƴs.s,c-uJ/)y-vZ2"ӊD9&kSK}f.Aפvhc>m2r|%Ήo/lіm3{oTvO!͈"#걇 }b81S; Dݱ@S?^ⷚ~6m+fu,D[~9:cq XErwgyq^} ۀ3z{D{8?駼2p@e*}M6֜vaO\_,W7Ka}O#֥l Q6<~]/ʔOݮ\[=k *M~e(ϻ,EklJ=h5i/?iP%*GKҟ~l};wg1=.E:_y@%{8VҴ7Qsʦ_]yQ.v=-پiE9ߕA\?*Lo%iާ~v `AgIxdY&OX2}ȒW_W1<w)Ǒ]pI15hdW+uY5~Y%c˲S&Yl{nx-?]ʹ@9z8.pIi7'ݶe3fiOХ-w> x|P] |m'Jyq.::ۑhW|Ǻul}Fݦj \]{Y&X?e>K{stkԚJ$p\6wYm؆k~0seUbg|ƢRރdUMD!v[;b'ޏ٫yyT0=O12e=֧mE^Iv&|XDrkٓ8YC\b0w` ."? EC٪^Up"P8кqD`iEa 4ge=8 9PݸRE㈻qؗV&>dB &. NfEۋ.G;w.Mfwq77N;89$B-=.v2-Ge+R3{^G/f#p,q3X'~盉a)3[7,DD`UfkE;Ն>8o@G\њⱢ]BKuᄡ{w*:هwif+猯mk[*ɴiV aEf祿́ų|>Z~Ͽ,dڗn_OPNDMqwѼ Usl+kvO7+sqq ?PcߤN= ^`[%f R5N4tA;/M.}޹rIgcj$&=jd ߲tХWѐK4XNzb>+fpKϥ5 wgȻ<{zyiVһ4+gӌEO싯".[Us.H"0z Y}@H:#븧-ߕλ=UFTK/ܐMS\߽zo}tމay/ ܝXK*5X;p{t}?|KObイwХZ6mמJYރu_;[=%_Wt1uRFnszH LyM\Xqߠfۥf0$4#znLc6@VۋʾB[y ظr˖[yA\퐕HzyO}#=Aήn7Xq]$˻xq80=I9 ֶKUuHEޅǞV~G2=щGkL>@sOS61ﴷDu^uv*o2Iiۺ}{kȟ^%!oWܟ>JDt1m(Oe9$LM="Ե1?]P)>#AVgV].3U{mYy * z>Cl],I.OeLst6V]ݮ7MGPiӮ3LSLfn"y f5C\0ܛM3Ju[I}y?EN1MTA\"I@jL?{yP"^c-c@l2"ͻEo*43{OgcTڳ^#KkTZ+[%{L vAИ($CTd݉@T˼@Հ;~cbI<24 S{.Wc;-3Ҳ_Y&n|W~1qQ3~SgC},s d|Kԕ2c*-Ӊ핊z=9+y؎^[NK??)D/1{"җk~s,@k'K㓤t}+$MޮOU]gGD<E-{|jPGgҮoDpxei9!nhTo~-Zvʛ}UiեghO3a-$X{^0h?6lUg+x^/=[݅OT |Qgx.L굇jNJѷ:5Mlri-麝@C1z^lYcwOXvmy<6,JӶ#\Ug/?[C/޵xdC8 U 7[n!<^ZS""MTWk T:{B8S6JFʚzA8YU:@/q~\XWd彵osțT4C|VWUބ4%ϹYYwel~u\Vuɛ={tTzW}TQ&LF',^'1U8DQO%}j|T71`A $NO{WGo=b2=ۢ,<.+a5=yO5IVSϻaTfe>Ӧw_|$O8{>{ jN,R/7_QAwJc?uԿGOɏLmrN&w$,@ W^H9hϽM}zrQ.GfOs?{^oZ1hUv I[b4f1 SDA]߸z~ [`zjֲ]neطƺ[7Go {/Y޾X3[EFx{ p]Jw֍Mj]:im;s Y}fv&xYE[֝o6~^˴WG.1E˃^2:Xnq5n dz[qqu|.!St|79Vu^5fC`fKmTk1;S7Tt=DD[!fGY:wvFc9vъ[f5/ޝ˟=̦לŊg/b}c<93c*5}|,#is>YgՓ)55 OXC{5 9)z㿌9I`>:/}yr}fu{&uINOٝ8G{4FqD&=īV15=-^h T|j|ĘO DܫMwfGL+?df'ssu3c\|}B _w>L4ORSMzݏV&դͬnώeM 1sϼ{5˻XVMP =Ҫw55y~|T4& }qNHPgSG27 wwv?}#M>nhe޼v}$_\e˛P 2y*ᴣs6@fy@d&GK463[xb$ĝ[y.N^dĀoxNO\KtQ{wX<;_37}LE`|:/$z[D|!`FuxufT l>;W44ą-ąD^xmaFwa4&uX~(Wb^'S~mH@Ì,ˈ' Á_s/ߢsDZྏΗh Aw/tV}x*1S$A%3[ ^K82r}i>teob٫hߩv mf#يΞSh_~NoX~W}Ө.n:͓%W>UCFjݠ]@?41xvh.=og sO7P|b0#s\y7})^t%DP˶Tr_մ0xoܽI 6HYHňf(s8䑠3~$lq{32zmfe8p$"',,^)ml%w ?= cq|j̷luc`A%w5ٯ=,{2BwA:?Ocb{gtvQ,D} wKs٢>rT\:x{I⑫27ƣ8({;ǁ49V6Hٱ\?Wxz"Vou(Dʃ"d,d%߷OJ|?mTj:[~,|;;J&Cg4&uX^~=Ⱥn:^1,%N27F1Fxz vDOKKzmBg#@qrⱎ^=:֡x I{|$i{7w?I3r(oXv}XE}%~|"a" ={mG.]|ג(?A` o6X?MռWvCAw3r Y@J Y]gɣ9X/l0mOEӑBˠu俹4yO>ȳRPipj;(+I:P׺u]GCr!:/30{l*d}Qk(y#˩QCR/=^ݯq{d>?n9x>:Yo=[ :\[=xy릯x 4pq3&|GtG{|u;?,~YX\T|qeV'۶Bl:_'Y &|3{̞5m{ߕ;h >;\u|}ev,8UV{h+ݰfmNws󡗼o(ULR+ꥧͬBz>`f.ƹK߃o8)Ko[6!Ɲ*{%}mb~9oQj|Io}+zb#~ TqZ3Izl1w;p5Q=A6O3[&) J{(.R\.s s^]?]wn`Q+&IGxS!f:Ywu!;괳kfvR/+\{3eB;ؒWsW՘sŹ/kdT**~gt>fVy9q[Nʤ/lq3; />^$5`Ҥ|%_Bg7lŚ|#7W*.fZo(.ӓJԿp]"{罒 }T6n:w#%V_;?L˲<ٲL`It1u2'p<qJ܃xۑ8x:xTͬۇH6o5ҼNyeT*Jku5c\,vR3[؜.+zS/}MW$u6SkԜ.?H?'n]eLE9]9oY'_bmBJ竆9/`٘x?^U> H+|v/oldOeľ[רdfzqW;YAzˉяNX(}Qq!]~vp_ Z1>T^},oKqIR^O1r6(DjP p/0| ߥ}~/ۋt<ʼnAL{b2eGfjfZIzUtKiz7ukY [vr U+{ohdsG%z7٪9>_XSiw&"Wnzڣ~wl|ŞҶ cY:=^Dzln 9.WV9AWhaOXҞ"/অ_CgpmM34W~S4M^w ;C\`{9,_vt׈ѭ3}+.@DtӼ;(A4d|A12[>X2&8 k,}UK?"[9* ;8G6$NfӉmz>>+C55|t=by ES{K>%nI?svɻrV[o &g,c ,\'F)rNC\T=%y7"xX-*_kg݂Sv>5]-__%y&pv=BMhZ$˶Qwξ_??3> An}vsSl>'/n}Rm}~|"`q}4j4/̢RYx U]2N%ەE"=╔K߷+r:/Ct^j@u|`QsƯ1Sxbs'KfyʯFYOsC4%iV"@c7'7&y.G>16žv~ 5e+ʻZU?IbItbhp"xvEl}YUYz>VO4UeAc$>N R|ߖmZAbY'fqb6:12wO[Nߟ?界 pI컻#cd'-b{nGo.íIsN=DPn/"0ZEI54h{ѫo5٭#4iPUo}fb-b,?mJV~'ꍣ=cdGmXԫ*oe|}6+jLB64`f:bN?GPlsEZXV<֨a1~]oAԡ/ll <6ܣDvq.cH%sj۲nl~'o#ͭm_V6AL'ŦDOMqݞ΀}D=$7+Xx EuwsV۲u(dcYvm}uKH;`ߚMt}DSv%>ߟdd}|O߿ir1~5;/%n8>:JnV,g_:7\.y_\ ͩ;qo'%СvWg@OiDyQ߈ {k`F?6?y+\b-و?7϶KtF?;]#ټȋsѵrj/yn'Ȼ e{;5w}Y1YD #/T`(b>/W^ \<^ U?$\e=,^r~`"Ay3Ul:qWTJ?7%OU+ʴ*10giJ\muۉ@5|1UNza"]`%z]rI{0yS:I>e-hqq=3<Typs3ng2Rq붌qcd9؝f)Xswl~ZU^4EfW>{;D#9 p1ĝWwHn'"Ϳ.clOnZ =iZvktU|ew{;gS[lۉ;)%O9yElm q~ IDAT ыE> <ї9^c8W+61p::Jۈ17NxX?.%Nr7Mnퟻ=^Nl; yO.i>FcuObwz:/1hf+QMV77mk˘Bs!z&/Eԋ65D[ҭR$z82DvםmM6dw<ꞧ!˚py%\S D;Ϋ6byq^X7""_xv/y6ghu]כq6 ]Xk\O=7sϯK>L3ΫŹ~w)=@<Sy+L fv#q!:ohJ"ҝDw{]L,UA%iu?@pw ťX7H)P"-J-RH;ECq$hHHBx2?f_ΞsϹްy{λLEDDDt,hD,4"""(fyy[ypJ./"ߥY3M@9>ADߊȖ9dxTt"""#-?w?/GDDDDDDDJ3zbrʢ2,|mDD{((%;UDDWꔲi>>w ,JUDDDDDDD'AT*EDDl89̄EIplYG%s[puDZ!9ymN#""""""f """WDNK"HO) UfLU"mpw`."c un:V"AF^qEDDu( zz&"$?Tc,"#Fp;b}L>&KP-LSSh\gqf`{ yCk 13CDNn͠ڢ7zNr8-%HQ NDDDD`̒4.#"RDDDׇ; [ ,NE}D#ϻco;`V1Ovw}k8<̂)/SZ[#ѽwHDDD.QRJh=#ߊRDDDDׇ x\h#"8E|>pVJFXؽDD~ǟ7jT5=>-%9sz_3'&"4DDWN8F,3ZGDDDDD9"r'0~j~""""""":k~j"": TVﶚrpQ=DW>"ԭTYDfgb("3t9{H vs߻gn6\W>"2{)"4:ߙ"KDBDfw\oJJH3o/EXy`>žeFY}:=%jXnW\~c2&q)<,<#pU쌍?""=2?"QŪ𣌬|X[c>v󍕆SUuL ݥ>"2;{kre| \ךwA}c3.|ہsU lamq=iX} [U 借e<~KU/qtsvڪgdF}퀵D>MD>W xȽ{w9#20YD?շXd!8hqQU3/߂2xU [a.-^U=2=:\%<6_oe\R#\73`CS;2vPV1f+`)+"waV Y8X9#\7͟ hgyWUYJ""obt^#"_a.LNI,QbTQFw`Wq:&Fb3ۃp1 禵a7 asN"pss|v;@/x[!Wpk]0p 6#k}YݽρgKk}w:v?ƫ".6#wVlXy#l.}<-QZ/[>3+ɮ`Q;ҮAX#|(FT:)t_`ѥf;y6um^ry{y KIi{ lZ&ߎ0Ar\wܟ XDȔ|?~ bpٺ(MF{ډ</QWAO'cÊARN2Zg?Kʡ*y/̡E]C{Y^„shҎvOTF~gt}E= ,P#?J?I')n`I!+Y)p 6y? ,R9h68^C3K|gm`^S `zࠂ:\ilOi2Nr xx-#9!Ȕw$ϋo槟wZ{9_;ײ9d?Dd{zྥ/Mqx18旜ߪnȫO@w}p"Srg)mx˗ xi/s37^]ӨX*mKհI%׹vβ~74`_1k1`.y p죪f1&,$={x<#KpVVՐ4pZ˩r}R1bǚ]"rمJϱ]kTu{X[ on)Rw,]݄lPyBUG:k51m؎u"/Y^fڴl܆|q7w @Dٻu3pNͰ6= lβ.#>ƾ ,D<k߽:u@UUDxO 9%w(&R`KafO=f{aV5OcuE*(}E/!"bu L6Yds!=^kT^-4f)Ɖg0J T,B#܎߱[TS%b}b3U}$yDu{ VOau 6=ztA{RyGΰ ƬOv55;T[, ]kbBboL|] X5Y989nNq996l/d :)0d/pUTTρ3/~Y\@łdUlX]`Ű+[wꧮ '։?Ed)LeTY:렇slf^"6G$cطZUpEkcd5la쥪קd.4jKDZRmOłLZUrC ꬬSr,o'H0 6O%xKa1!2aMLv hW] -v'QWd`"m6|RF / }VK`J1f]76Вod;3OqtS ?e|,n-QŎ她ʣMTJIj/&5RhP1!2]4i#y>-p w7ͮ:-ƺ_ЮE۝UKVvilAо kB]1[P6Ƞ_;Xfɡ%hc#t:7w#ŀw<>_Y`ހ;(Y~{&̃^>uKX/Ƹzc$Je 0?Gκ9ѮJŚdtx(cN:-+N$G梭i9{t/ 5.X`nB@=1ܥ[;[j˜Ŕ)~}N.M(sB珟6ImaoEEթ[r6űՄv0_N޳a"?ԓ~7G%WZJ1JY dP 'J _.:]U*a&K/\FSJϊ fJR ʾ0^W4vjtl` TmQ{zlo}.{MEٻJ?y>OqگT,CqWY1m]['4JQ*Mv͡-1_zq@ς4{e uwm ҬЏ"_YJz1"vX|c D1Ի?[T$cRi:&gni.QA4Se G;PtZ-[ǣɠ}ףۥ;%~T¬F,~h#՛.3Hلptwxtǖ?VٕJӱ͢K.s5HO{l 9|5./=US8Y>,F),A;uJaYCmc{/Kp9eK4:A9S:mtdzOW@.n6>'EY'GjF}ƫs]e<YYdz47tvVTu YN} :{Q1s{ĽޭL;9"bTY& H<آ>A?L [,H{bBe(p6;/Ŭ?(Q*j !"`ʘ1ˉ(B7|!kKd:3ߞF4aGcp;&'X28'P}|N3R;wk0! `Gr)*\Kv(JnQ#juN-OpSS$G,@-VPN08wi&7ѳ=Pj|gͳXDa o߸;z_zy}wLI`Ǟ4bGo a~͡em&;& Go Lt6R:8?@H UE㤪~Cu.YL7 OaN[s^=sN-؉jd T 11imF+eT+>F vKsQ2͏Dd'/Zsr5JU(#b&@e;BE]Ta}G[*y,c ݧ䘜7}Kidi"d%yDYDrvn:ާV'RJIG˂:˵ sioiM>lK]g:ǎZ_3JC{-#>t|^m]2͈k,m U2)AshCKqY㌗f %x JWՑGxlԒ O eB\]XKE#: ?rm@_꘤K)4){aWwG|mU޷pi6 C{H@{VIf }zseWǜ Jtk̡mR'idycHvÒ59)4K4_S^x8H;Iuk ShSmA%Ui.)#4Gʘ*cB1IC޻sӌ( v ,Tu;ڄ,:"1d"KЦR^;hӚm"P^+/YC˺Fy S(GEdqLQ`mkb K;gɝӝJY.P<j kQ(+sN{ eͷ@6IrpTou]# B3?zTEN "~!w-M>goo :T >>,#Gk$]9DL&J IDATEuL:-8`e*֣1VbDi^҅K0֤,'"ðox~PC_Q}4L]D,8* rC3h+YHUuQ >";C>H^{cl蒹p0#],|TBUߨvK6È:҄Z5h۞cʥ۱6AF{jB^Jc2lwE^ӅNeaoQ: - 5iAQSÂ;A?K˻:CDFcV~~iYIh 7f69,֤hևZFC8("}hWզ` lkKHp~}vѹ3ׄJ?h҈eJy~Ir!"cBwܕZMQz0oةH;-{ɸRU)2!T֡Zl>e0KM}8}'o"v*-8hȎT19|.)H:# ߣR* ,ER''°yQ@lu WHAV桞q+}QoTO;*;Ȭm׈Hٱsww89 ZDd۵IuTI|/"ǒElڼ{m$}'\,"c!үCYJ/KAg*}/MeR3F*^FRݾ&:#ik9V*yIߠ]~#{]MVjgJ O0kڳVQw TFs&?x9b&DR-J "?aq5XkZ:M1--U}\-t:FD8E:BKٱ d0m'P{EdULnj "_n:K[1ZEw_2S%fYa((KKDAhJT;(osY']EIK0 {ۅ< ؠ>B3g 2ƟcfUGD{yh̷Y1`W`[,Z5A{p2Gìr {E5QD";`oLA@&(c!UA7}jor"P$)fȡX]h;9w31gMcnsQՇQ^np s(B|ڸ~ Y F8E1Zё3 voi s(cn]DdU}N> !"nv):!`Ax;}qհywgZ !"jaimx'n"E>-N-71,Xze^ %k2w vx,":4EFy .pV!}ґpβON0k{֌~?l CΔN~Oifw “|i`Ol:<9?IKRNwʺ2, ]K3:| "2 -(A!mǯ/1v {j3|U7NffsSS7ƢY"l#v'pΏ/n,\k9~~>m9)O|a?VǛK'xZS W[O^7t}Q֟N-8|{Ĭ_igj)3mJ ߿7^d"php6J?}9r¶,r "+#4a'RH~;xi T}U=XA𱿈, 륯X6;]ԁ() `I.a͈6""x>BwkF \H"H6PW@8Nt7i(iNVzquW'U(AF3%F:YUoU>pf],\}OuoG U}PUbrT3w fkPvhrD{FN7[36 ]MV|ɕAk2m#ߵ}5_LϯBB3g/F^I'r `[5Vt5H?sTDzvj(Y(RJ pe=ҾNB|l#E/V,"GDF3P,;),^c9fBV;g?.|ȉ"pn w&;ߥY=|$6(uu :Jb"Rˮo1}1U37ܪ(#nOn7lPn "m3*EsZ9,US[kTx-/+m/,IC)y5.JkޭA"R轨|YEg[ v8 >#$'"˸2MToMs㡙㙈GRmA~*-ޭ~L* bò m[w8fkoelCX7.;u97ab'a#W٣TUZQk4e eRh"*m;m]o0xSTK,oLrtM@3JPdIg\Z-(ag Dd}]qMQ2]Q!ZD*Uo4 [e'Д3/˙ymNKfgzz$L$X/4EOdkTiK@Ua?:msicXaG2= SE'7tTd,җ+sa5M LHEdv?߲j]k7~EJXYc珆"e-\措k VkHb$%N@=B[,u8mzȵZpp#Nwaa1fpUv-@8NejY sz7%Q9gպ ]"s4b8/|lP!"93>J,6zF~nCbo4t^%\97U x|N,0DADkd W*E+ޭyi"޸ i^/ 0C-tcZya 0lDdQQ{f\l16+FY:!s"nQ ߣZL&TKL'Ga~QF9("SYP^[ `o-qXHvCDm߈;)B#$_(Nڃ0XX6 m:GmqF\^T"S\=j5 ڗ3=)tsԭJHmT•T[^fSDv~~I¨8 - zKszT[Yp(;Gq3p=)ڃS舢 .9EGRVNvjam9VwJX:yQԆ[Ǽ[y ͽ[c cޜO~De }BBjȊymM-PHt'sTYSD6.*PDVx7dd~;HeTOZUC NzoW"LB85,.h>1IZi": TiAkPHStagǷfc;`\[(珻g_R&(sv`/3h&v,Hw:.iZ?'[|o9}13v"uN{JP/7^rʸ-]`ZϕA翁^9y.)^|fPǩyc>#zt/I*^GKy40 i z 4n?Oח_HFg94X9[:T̉M <~f`&Ӂ#2 ybA X v7$ח%cvT"8)6C 6k ?xSK44Gi =[Am頠ۑ׿NgAG3X= Ekk]f<}M,9<^A7k.̅^~935)@|D#@SbqWcW+f-Vv׶txlp~K3;w{TODHd}OXc`f~[9 [< d<}Z[`XH賩^G a~y=ͥxɻ;/϶ti'zi7xg3eXף,Ѥz JsPQмE59j%Ao; "h>`gֿ _NVZI9 Hkcwx4cP,cqA]Kw4g9$=X_X;n(krNx(;lSCixҵdۄs\#of1#6؆w&R޳4C:&edJU*2~G vLp̙lBs; ݻ qgPMz?)w䉤=¬=ߟNYr}_|vFӘ,wkOT6zǗ =UcKR='|õ~uGx2X_{󔴡v:6$8;51k \9`WjXK0 D-J]7Li6kwc2b]wHuv Fa ǸocJIÔm`1A`@F~Wyqzhu??)4E&Cռ+1ڤdNβ,qL]Q9O$^U=)sVL 6 `Xz!Y?$jǶ]ch+ d]cJ8,J&Ej߉}uj6;.%_;+o9l!VI?3hw?e^sՐnwfWBŗVu c*bJ DdGzC oKa { |dʳ?6N,MeǏ9>U}>')5jϥYŇIO0{nlq:W|6Ƭi>l̻O5OprlɅ:ɣmYtyy O¾L w*3뇅h̃bavrSLpWsYž|2q%ϙ[VK;bmD1˫4{-2GNSY3,3U7s{.`gl3?YI]_"2lg:@oo=v"fNLzjoɫscc0>w'*/̓:і]W/)*.SսKI #03F:xN`Im&"A,|wuFh J͇lA% 4` UB"jD; Dd;* B;˲ϩP*C~#"""""""""penJ]Q B2'!6?SշZR3;&=\*"8s2`QK<""""""""""Dd!Q*.<.SճZRDJ΁1w#UYvwCUБ$(;O>/ , D\ࠌLJOGADvx|`}UCDDDd,@?hv A^4fvSDdŌTu'&c\@;+0EU'wsC37S:"r608)Х0]qǢό(5b<b^:5D$]GBD'"‡l X  CA.͙H`l; mѾ OG"G}X*Cg:38xKD6"ꦪϨ<2m`.X#"""Uқk5?nDWiDn,Dd2|#ʌh6Dol{t6^\c@ww"rW߶)N64vPh^1̢U]CEh|8XOU}L"U !:QDŽK+$-""""""TulT(Et2,E N0ĪIT("p9 8::*"""""T~ ٔX8*yJi-=%\DQ9p~Jf"""""4;^]RI HTJ"2K3_D")ʊHoiJ3MDfZgZg1YdЦmV&<5/] "ҧo沦y൥N3=!Xѿ|  "щ{,Mȷ[\ݺUt4:ӯ|Ԋ0xZ\$p.BDz5XSZDzE4h f}14M %E, j$"Kbv;XsT?x"VFSTu|JP {۪g8,{4oN5p>o WՏj|7ƜomN<\ DZN 7c#kUU{5`O` `qs]0.iVym4zH`Q ;x|~s|{aEzBX힍^֟Kfֿ6. ƥw| S)wzq>T+klaXps ;acXnxspF p? ۞Wj+ .p6YI;=mBbX{k/ ܳ/Uud?y|29s>țRWxα)^I[;u<녈lDsT WZz}WU/oB1ص70s \D~Y'xe^U}0uv0f94͍qñ1FzƠ4^gwUSaB+9bW$QDd9yȂ6{u'b]f_iy {o溷kͷؙjG%1( wrݜ>wmDd3@Ɲ)޸ 6 H0~%QϜwxKU/oN`GlYKgש; "sg=pVEsܭ6,q#lyZD [זE6KU=}^|]QF7'X;fhalܸ9Jfq|mUyk?އX=^ 9↬k?d&믱XJKvt?7N&,QkSUuZQY)eoܽw&yЌlƨꩵ]5w{_a%\P/E9*߽ Pժ [$^q"h59+e 'Bi^(3'2WIגa}R#c*ܽo$g{ꩀ~ ZnA`\E@-$# KwSR9{[xJ/j.l1=&O]J9@omB 9)) LP8',3Ļץl;O!HwynM!ݷXǻI`nGӒ&4 ߬q|)lTvyCJ>Q(jjOi}"oN]7)iw,HsL@ibǸmw,3.94mw7(7SOҌOi0_ MsOy_lR+cL4e uw\.K"i~|R) Ng lQ+ O3>LI^ ,戀~alcŧIƝ/RE+md 1= O5GkOyu|ZF,_6=19 Muo.k~vLO`<%ֵ2dp|kޘPT` 94d m A/j@l0݀9DdU<%16ShB< }`ֺ%\ !٩)PT[0 Wei39``հz>_%"Ϫ/silKv!bUu1<"Tv@0 MEXYjh74Z@DtŴ;N f=ruLۆӽPv>}ʻЋ/i.:ؠp% }LĄެ j/Ӏԍ"2؎bYցM<fEd3/c1{xRN̎c;/[*&I9>& @[fEdmpa%xrݫyJXUJBD~M(#', S(~ODS" pqY`e4LzwR &M~gg -f p$&NTwyN~@"`8^ʼVǥv2|}T#~Yt.UZ*l$rt`9kk0* 72(pV i nœ3.Bxx(TujߗT֘Z*N,!.Y?US003z?xNEE'¬ۋ`ж]Mz]^`&eRχ')ucu*)PeTyacGcq>KbXll"?9<<EBpۯK& [ԃЏMzbd0k4q4Dd 6&Ug`ɸ3Qy8&-k uK*ctLO)f7,`bT[ _A<CKTo;;[,H)^l5Tg0n;J"SUo7;'0Q{X0/c 7OY*Ka}"Rĸρ+LY5˙ؼz qwewI]As,GT_QYvDe̲{=KUG:YwETiyozi|KO}X2CSջS [R)KT IT VաՑ>T,> hal}2fҼ ,Aۃ85BK3)}ikeE.M〵 ک9? y^_xWkS_T?*=yB1@E>oӖ<ڕ2?rA `?,6X.YAݬEx 8(!nD#KN{0g@;+Rɟ?)(shPft{i]7 ͵TUp2v0YA6[]}e:^^@{yK;7[.P@wPWXS|˛oMSP"SiX*mm ^?kl[\_ TO!^^[*a>/#̖Q옢3 󰠍\H9>ݥ5_ba>ظDd) x<۵ShÔ>%[U` }\~)Hd)ОGdJP X8Hlcd`ATN*cʒԅ3|e\q 5:;T*)lG,<24YA\5nˠK3'c2?.TaUJJKG=WcoKG_RIh{*Rpm$O \ІGvs ^6CuP)uٕJc6+Aҗ@Kf#}#Qx``܂Y5%^"SmJ$&5_('wʡќN>M}/T{4v7 +Y{iTmٔ*J丏N4tp 0 AJsJ+WIm\տ@_>(2QcX5'!ՁwNnz[:H0cByՎ&Nu&"cAQ9K' 0!b6q9 n1oAx3u vd?ޭm%#;m;iq68/v'dMM fJu߿IUd(FIVއY\kYGC;i7+^r' :jcOW ET a;qp~ m;RM衘 &\8 zSul K#>n1q}v̷X:t+¹3Fg+cq4U\wr Tl2˜Ҵ{a QȾՒޭVX]PD0[qF7ltSY* 'vZ\-\{T*/0%OLW/ia/ VS l #>NŢe-|a"Y;6(OP0?I0s*ULUBU*?; sg#(/ah2"5>U:PD$-ϩsCI~¾O݁ K䍪~HuQ4{y[R}䜔%GAArQr$TE>DTX$ KFDIمe?gB 7ysT鮮R]U'](? Ec_@.V1x)ifK]g4Wcr U}}#ʩS>ʧJC?BBsn΂s 9:-2oH><[8qb>:3bFDSwkZp?" ;PՅM/s6VrBUv|緑I,Gp3 9[}Ł_i۰̒[pw}dtn⤢zGu־YLR*/ݧ14|+V9=פ} 殟?m*qۛpEEH3(r1NkgȤ2\N2CeSn!jvmBSV[+ iü:Gz'tz̉@͉S1H"$CDw+Uw.UZke.t5KP&Tu{Q?'c/3q"}a,8a4`% iz!軀)o'/D8[;kġh$^&-`)"=ot1[r a6&Fy6s“ckWۏ qSY& U5t|lSG4=ȟ*s}EO.z&T>wƎ$(;O pbVzM>!E +T][VT@TG#p7v ËV#mE[#B-̬7ЉZ@RiƂ4AKi-ss&FuSE#3-"""(Eb?T*MEł۱oACaDI뤥*~QI*FQ63敱(0Îd0H?\Hk <0ڜXa|Vؑw.K?e-v쩈Hz쮀9Ml$Q¨v3p u)|>Dd>KhOqJp}H[{pz%;4E|(i4sJnS ҆}p:"Rf`:ay~-12`laZB4z!Y$߇Ԙ/A9U}c|+OMD~.\=#%aQ|S]mϜ2H3~U}VDa5_'훮 xĺg9ei۪-z*BY}6\6M)bw>t|G[SZ%E7MDfq$(,;1~` ϶"r=wNDhKwFM PĠim""U>`Kˁ51U F{,8mE$\W 5̠2REJv#,.LC-Y\J g(AU_=I;Rq-d1ƽ@@2-6I)"gbNl;,آE5,:sӭD,A*܆f bmy~㿢x*L(xODWb#Dd]ҊWfgnke7< IDAT|-4:aQ[Kh ᬒ7ᘅ|4ۯ߉: "!ҁ3d I)t;,6gmA鏰 ׀BENѿ;mjlu "67k/bV},@:IOY$SW*OɁޕ`8^$} 4LYp2tҲ.~}gCPQΟLTECypgx<%JBi; wYp(WBAJS$ 1[T,9 m38ID8ԥp;LcaWo,Hkm T}GXf ?vTZVbTIUnWP(Ms}~됾V.z[lY lL3wmUNy E Ed,ՏOip<3cTbbY볛ѼpIDvRпeEDJ-#l$BTlWMJzB lDflj'wb"fV Ɣ־BX,0K|/"_eԷ cQ Yk8RI,ZVU:w6'΂)w*8_.{/PDv!x8'yPόw͉I_ BUsQHUWyhs}"GZC*U*U̥%qvը{ .CPl9|Ϭ~8ZfKEdv-on !& OZp4#J !(+$:gE >}8&RTa*B)sfsw j(F)2ަy(R\oZ֏itUm{9&1)9]?HkPձzn}SIii4r~xM FU#b[,:?vr\aI ggRd-|ﰯF]JcT2USNLYLvw? %&X)]ɄZļV:dX~gu&ߍY%#aTpI;t.6CQ-T UDU7;IU N#;tC!;3Uu ϞDoN`b}rڷ*c0*Kr]'`!wkp>y3"^Q2ӗ4N|,<YtU`/܄~W@SEIҖwSOU*`?drkPշUu_lGA2Dd6cHGٝXQՏT,χcM%/"'%}i*;,OpZ]gI; b$#-t("SȷckA?]MhO1˶؆o2qȐVyz|7rJ0x_ 4 {*z{b|L |*>w)DdNB:wSIȏS:Z㢣:c7QQ#"C/:z>a!"vrJ"/i* (q\_!Oi0 vBs[m+t XCu ;ЗʬЧ̪T)#ccEec0 ƓH.$&+t CgTUG߱ #-Ȓ"r\Cx* 9t2os&مPջ0V c d;cjH{S܅("˹rA I3TZ;3RݏsmhtX0["가k(nWvo "^{N =2Zlzic1^tY=VK9?& 8VkZ]] '|lji Y_ l~=&gcJ?.#p;qxb0"%EBk| ,ABD&"aaDdZW޹ֶ81=+X4lCcgmDӿ1"FAݠY!$Nljʰw*I;L2glҖEdz`ZLIXcv+F1{Ձ#G>+靲>V;EF4LM ?{li(pI_)‡n,pޭA"Ic2?+NX]I9]-zRw=~Ȳvw;'mqSIKcynJ-%^7Uͫ0ɾ?wk 1\IFLC#LIXTC;pcW8vȽZT5߿[/\,fʶĠ34KQ+"ww| }pL cSamUFs"yN/"1ʪvۯ'iUHt 6 8w29gqol5#ם}껺q&۽,xjp&̹۶;`3m(VKh~CZPyt$z@,/w|#Uѣ}0!e/+3sBvBU?¢$"2kw9CrL<:Eڜy9~RTSBFY5]P =YT(.£zz,OUЈ>wJ ;Q9:ɆSv[SD Ê:Eޭs x }#Tn׸_Y,F5-On͂E<ʅG{x|tB=Rh\CŻV„}"ś Q U} . kΙ=,#Uu$?m{$ʹ#ጴi*i )O);·ԝGD}̪6A/\/D4p!NwR_NP y},o[KcǪi!;X6_Mm>ӻ]NDTzf'y׆W)>iT&,Gcl")_,Y5B:&"RvWu$+1p|XV</QyPfi3{;j7=n",HN|+^eĔɳU2/?(ūx3c>u2 bl~/0[N;9! 4ȡG.\l1YKe~2Wk!M ?ɠvT 쏅٥=ţ??{>_FՃ2))o0fЏ-caN|#j^ޟKɣXv]6 ɀ'g1f~+[h2BEt_R?|,۩m v mٜ]y[9I˨#yO-Gױayty兲oR5=v394dm:^9ПѿOh{휾)deL_\B[l/ |H3`ץ059<lw_{։dwWm35/Su Ӑ>6`s|L9!CY^[ݳtI 唱iޘ6h#4M{FPP3` !Fbַ~"UȃrҜ9 Wɠɖ2xn>KaG0 '`0e6ԯ{bsv1پ4i^?~K86 4/S 2gĢ%eބ űE^w '7gziV?[w9nŬlvs6pl; wuܛ\]cP`۳Wo< 5iE8rik^ܽ_uPlyxAxL-Y9߯!m~#1MVu;~Y/{ހE[Ž* 4+1| fK*waoL`aR{/^Aqryo5{ڑULڵ՛ UNðEV7-crತ_1 isb^=^ EYf^ vtyߴ^|bw!lۋ2FY;9y 1O NZ VL Xd-M/7[A'g{i;i2x4$;Ӱϕ4t$w`OT䦤엃4>͓CV's/7_  ͟+>9=!U_ReN~㬋2>]lai_4m0hOk=͓F!`ˊyO)u{SE39`6͉U) ]f}Vv@h.,(g%m`FA1ʢ*o ndPKVI; ۔(hs94/Wh>dWv06."W?;=,W1Aڧ#ӝO)"󈼋䞥ɶF oc*|}ybw~O`H m)X>2)_?vv|'{]Uhߺm9[_LSlP9Ʒݒr1Ly*:_rF=BEq/Az>^AEE3vz?D&L9: 0֜;l6C;ߊ^[#_^H~gaQx(Ӳ[ԫ ۼ7жTQ\q7݂Y `||7gƬW?M+ ܹ_;j&|; ; h'l/LFq4팣Ұ\2Ǻ2SϑJUfFaXٰCs=gƘwZ򜪾fṉ[9y?S:1Y0&zU LJyLCsYSTUm+̷;CvllΌkN΍_(m vh4}5X.Mv69{$R0j^] }{_U==VY̌ twJ.1K\&0j9#S ۾v}8SlwU }_=l?|Srܠ_9gydQgJKKoWKň6>VD7&\[oː,{|]2"=^~- ䷱UjNbDWtQ~CzBL|&ǔ bѤ-oWrc%&7,O\7U9YpOV\DV?Eܳ8r}lO(7^cҗ"g!+y#OD!*S;hD]Us8-1>?W' I-X^cpXw2r}Q}s[?MTQF5jԈl."?u>B>dj( 'ޭQXV̐8;wQ86ŢՕ\˻j>??W!]TQF5jԈ>XAsr︞T1P0WFֿo.&QFWAx:ɻ2 ijF&gz IDAT%?` D2f=--"s+ȿ'5K |B $m?)k_( "bNW{-T^VԑkԘ$1 cE P\v5O4Jb3"2۵}oTLUH(=TuYQFDd+Pw9SU/\*I?UG ݯm߅ " nz$iyv$2`/`J޸_FUIzMPF=?%lZjL۽[9UI"*wkDcDd]m2)fUݸjK/hڞ+Dkt"2pw _woI -N&Rk Dd' ڪZefhp].[˪SUN@D~eM0g}Ƥ TO[U=wj?+PճEdiU=(sZTfmEWy] (BU '5j8L>X sn ǯ;>;rk)sO 4(O "23`;,4(QOg5-;;!.^]UͤpeS`K,|#_ˁ[]ԭؼv69A0ǣje9ǩh ü0}[We,$go)"$~P@`` ,J̘ "pppN(g1`ǜ& Y û-0ֿTDHU?pKS_/# T|~'%D،d78.*k(eFZP]`3yxMQMDd#`k`McVEn_XcY`&wc,9mϕqƗ`mzp~TN%EݧWyi&RU=,%J1<ykQظ BUH?騨LATUSű=`.`NaW3Tw[X;﹇TuLvGaf+ƃIQp6\n-? _SSDdvVՓv*WzfsbU}(C׶þ`"!pp-p~^RW|` ?o:*~| << h~,xՑʯ``-L\ ߳a|c <HNqG7Ddd CUɇ WՔ|uAT켇o9q| #+#EG]S~%uZw{# FNIaΓWF_`(aΒ0pA_  m<| - pY]R;wIr/f*o>MVv<+m`u_+gS? [іWV(kl.vٿ_A^WE "鮘1?DUpk6`>J->d~9Пضi(I3o@)|)>367Х]Ɍ ͈ mv4o<߿ES-Og:8o-(LvJI=?{r,Y^,}({Sh&`TdGJ<6O6 Ѝ(H>L~d$M97 sț{ꗮ3ZhK ~1`5-Snp>+o$Sbu\}򿏭,eYtr\_Tr;b/cJR`O98Y8ҕ'l&],^Uw[b1y}cYNYInv8^q;À}ᘀk`l2=vYl` Cxc~{4y&y[v[,d~w 'cnw[EdUWF},lDdE`ʊb}cp>'FQqβk l.-"j&S=yl!ă-WAY{؄*o~[$}yV2[ 8kqX?[U?;F a:B[l,}$fScV4x"XȒخobApprqYW,"Àyg_4g˱v'HWL\X;"mȺX({>X㗛cou2/Ix?,uRΪj)W׵}Lew %VTb<%An4"} X]uyۅ|=0`;+#kѰ{ -n[~;>X=U= ە/,Dk`?+t ml3nlL.mDڢ(6q ~??4l\0}^b5!X_9|YyìryGkqmOӘ_v:1|pwӘL Syhc`3Wvp)$S1+g6\MM4>ƬoRw7=CDS ޡ n`*޳q" ED~ ݺ!PDd67] [D6-{2p fm&V+#o̝Uٿy9llOyl ֧u&`BU}ɛcv䕡b"-ice/WC1~*pockc ulXMx{1ES:(`k?l\'"db =gaǑo}1a5l 7/1(W7Z> &mu!3a|EW4x"2fEN},:!VD-VϠcnߔLQƟ4( ܀FNk0ǀY "{H`RBYV;zÃk_f. >e|?HSi 3f`H[|FU SZ}lMh۶THx>9f4MozeBR' h')lYv}^5[d~M\Z*=W9a??KʘNc(g1ŋp[N)VzZaJ˄%yuK7Xw^9㊾A&\!X;c-ޟh?;i奿;_͠= Azi6,!'w\93^w!f7hXRH[tKu:y@F{=igyϾ,(wDuǠu!7~“AkKxPJ 9"S*81eP48~Հ:Tr}i/^EIO8EZcYĹoT”~ۜ&<7""MV*v3nl"DqsPJ%3a sDJ;T*)%l E_/j+lwcPorhOu<Ŷ\+tPlSC#ha.Qeak~Yh,jx8`` +}(>E1}g}M[l)&'y̪?>G]PRi},3f-wxtMJdԌD>IoM18&T*ǔ1`0kvZ~(_Q߃4kЇx m4~8NR/E9|T  _EŶ|9(=&sҟ{>U|j`4]cM|S%T)~՝CX ;O?01nGgD,H̕G<`fu9^wfhDd%L`[T#SQ71)vT MECG\8s{OF` Px8vlh;tjiޮtYxS:Mv4?:G]zc*hyߖIϥMP3ɿ#>5ǬxIwl=JU sBwZh_hT|l> ;\W!OO`&۱" Wj)n,#T  ,˂,;&:8x<Ʌ|7y6q,Q0]eM:_bnEunNwk,86!Lzm~/>uͬRU$tv0Ð?J}_#U{&naVF KJ%șT2gmoEUcbk1{*6EZ 'lm3 QEfiz6 aX1Ӗ'z< '`YB%H67>ɛJܢgX[`_қ{: "IOHLi,MLztwj,v7j0'/nT$C:Uқ1oѼ'irDs"tM18+ޯ#.:|뱻TԗZdUnS[87on |e䁼!63^71N_8~H".=#:7*Y@˵<צr~kt}MDC5Zh1N~B=°ϤtxchvH[$|)w-[Turig!˹ls"v%܎m{I/kvVp]h- TfyML(UӼ >qR(e HB)+B!q͒4בv<p[^>\Uc,Z"]&VQڅ@m t>k B>y`ؖȞ.D&Tcז!}r{Z#Ddn;!v:fa*I&X6c?t+M{EkyhGCS`{ .=g=+=f%e…])Zo my: 1XF_@(,*hIxk޺Ad=G[ȊNY[3)@PMVu= }F KJUrT(2UE -DZ .|1Zyɇ1C ߵZw}-&eRB* &W[` doUH/vJ#"WD*oI@;˯[x$6Hi>#$BZ!)fYwPD^+"ȑ"r("w?<©ꫤe?%q {H/|WDK*OEH,ZPR>6 nG1nAY!n CoEBޒ!"Ⱦ"r\("eo꯯ m [{ј&8˰p369~vXdFrߞѻ29gGcOUiU>ADΤlFhjZ]cYja,"UG\~Ftp^ 1}ȼ64OB;B,u֎V;JRfUY=D#,1UZol~/"?,[)y~lCzS"*yiX^nO#J^O=Y{4pPy kp,cNiyB*ps3cppR+mN?,О|TfKl|/[B/u4`U Quʕ@hбq-˹}k*Gz|~±9$ol*1 70nacbVF}i=:ɢ/):|54sZA'oX(ܱP`YVyׯIwaNE"j3Pc!vOLLJN^ yD#, =/"HmDD48TgE{"gʀd!00wY7$"`.uf"8$.(Iܸygq7"dp~M*x!LҗxҲn1ZE 1iҽqo^PP2<sp~7 дIDATv>WWNq݁T;꣯n]JGWaNDbu7:j>`}%5"01++D̖Iz޾}ڠB:{lm>-pgݞFIq l74τ},D9y4J  $:8YDĔK>v$MN8`j"R8 DXNZ,Qݡ<"2+w7E6[Z.ܑ0X$ŘY U -ZEG |Dښޔ [aG|GN: y:vs'\P,sJ'KU<5N$;}TίBڱuV*ǻ~~]@_riNٗ!,4y6(P?D~YzwDZC~ {8s6 kySp{,"2@D^o׫U{~NkC-QLѵb u#}QlHy-qpބz؄αXO딅9x>y }dg%^fJdUMv#_+G!b!x(u۝>v\|U6҂"23٪ZDDrmypdG=n *U}ؓ`2<3} P!-4H y٪ߋgtB+߱rxێ":vx<0"2[EXi ZmI[%3,w}$ B~Xu,_GCwS91*[Y&9?yדG?̽7 i=>&ZusBDB< SptbPpwWqR8Ɨ,Hsfo"<5EH "[ȹ/=B85mj:Rr{Fc~k _H;rzgaݧv{p}L q&;8Ov$-Ȝ`d`,R7',LڗӯDdzT=zuoj?Yk8!ݜTvÒؑw ܲ ҂S$7<}_U9_O0 8$-ptʢl9^czfp&8Kҹo3՜ed)5Y"KKU;1bc գTs*XEɥ>o܊Ny*""Q6A,US=Ե7kߛ8t&fdGwc.>JzjIY3&;>SU=@DOZi9?AeA@Kp}4+C36jVO"f='-, &zLJ%#H dGNBXd\8aߝ?7$QV ʔPhr@!v.Gڪ&+jeȲ.?yToO"Dۗ"YzQ$~zNg֜eDdngct ;ޭ/1MpnMYTw4;b9wk pSvHtWg)޳ icE%8t ߛZĄ{^_Q[iL?0H7ؗu^"TU|J0#.0fQIG4[/Bi{8텩 Luhiڝ'=W-; :>϶Y- QDs?)K'"u\Y1j-Cw({Ģ-:OUy]ļ;-'s^f 㞟HckDd: RxUAFۯ(]GFֳ8,qHQhXezm|Yau<)ޝ2~ݝV9jشypdǪ|L9vpG;{eLM |?v0W7'ye} L<;D?ң.#a>2>5q~T m>mF_.y]st^>7"-_<ߍUNHD6s电&&OSv᝖ x޳1ʣ!ܷ~=Ρ)+ B۽o;B1?M?ߋd̗uFRAh=n$G G{WJiv \Gih!̓CqϚt"XT;lח~ey6%?a1Hg_x{6&'M K*&nihQL6f/~_@ab٣dLm˼A{^ .Ka E^<+޳=4{_(Hs`N=~k\_]Ďˍh tjWP׊^?hc%bʜ)ch}l7W!GꄼawDwGl׳|Ô87&{@ AާcctYlJ%Hیwn9ۧUO׮FJAQ" |6+(`)H/"37&xK&~|ݻ79y+6g+fdo܂[X M b|}9͔`OWm~^ ywTrn=+|t(ib2#L/͗eCH(I; Sntiy}iŕ7#l7}r?F .\rN /`Lfӵ:oy4ʏNH+aؼl,}̟~ʈ1q]1{^YNwxex0$rIy'+斂zN1G3!7aC>޹UUqŴE[@4NCL(LX5@  xJbbLL<@%!M XBAR(:&VBȰ|3g\v֗d휳/묽Z{pYvkyi pVG՞Sn &Xۭ ~/HIW'׷Y{OŌLXKHN<ꯟ$z`^&o'u^UI;Z\)Z[E|5F7S}c $)h`0t ҼQºy%6j-NFZ=Ϙjq38$ Qz~7IS_ȅr|)mY,HKyWE1(hakm9H%*<ߒſ̽S|6r og濆`wr5M 4hsk)It1_\υ#H;4M}wX'imPKjuʅ{ Ȧ<6bQ=)mcGNEV4ocFzsyC0Qំʠ)h1o$SdzW5| !EY=,|JҼ"hL-߀+c\ibwV0pCGChhxy)EwO=]ź4l4 Ӵh}Wa;{sP*k閛"szeHږ͑7%y~]'Z:׾־<K0͙2+dj!!Ιvo26:][ظA7$i.Ftmڙq!&.4lCZ!4ZBv ]6 8 G]^d ofcKQb!%㢋̬n--{%{cifuuQQ?]{Z9 zi4fmf[mKd\t R4-aRDjRNcBA3kP]Hx,pycf6ZX7q=%Y"t$t!RB+x)!=&â"fvC63?'ujXqhGh^[! i}}sH&Y^$̞N$qfdʏyqc|2Zi^v5{5? sgɴL>"<Կ9I4^oI\of ս^9~fr Pm{u値67}D zOYe4w=o10es%WO^luQQBr(zZ]Eu9fiU*983{! 8*;8LN888Uy>uqq_\88C@M׽uqqq\88‰!oV7v:2 gqqN_;8s|^v`,%݂yrqqN\88!uWoU^qX#AIKC?NAg39po83 !,@Sd(z` 8LFO1C3Yy';qgvp(0^䵮PrqV6?-s3+?V.V,]IENDB`PK 8a -Pictures/10000201000003ED000003BBB7D11F66.pngPNG  IHDR!esBIT|d pHYs.#.#x?vtEXtSoftwarewww.inkscape.org< IDATxw^EC @b@^RD"  k@@&HDJHH $1璛7gԷ;ryOٳ;;#8|i; q:xi7qYOVUwj>NDuqNg تK72- >4y -pf}ǙwKӇ"2,p$ZEqY&ȟf*{80Gmp1w"^͜V!Uѽ ѱ֭yzZ l+"5pMzkU8N#"ˤTݤZ"'Iq8݁\۵Z:Si…VբqR !"wTݯcRy7Uogg:+|)c^=Gs +a+Y, l.Ai> N3'p죪[v!"1AUj>,BZq"p!IơW/`[~a͹=#1ia.ۊȷUAcH݂$y_*Dd@{22hBDd$p#fl }2UP@\#𩔿?b]oDd'^ٸ7g tl?sFwȶzSvC G6kcI'Yi EUU@~) LD6Swy?~JKp2I&C߮ +e$QFب>8L`䜋Dkgq>͂&='jy\DbyboUulq !"GaR= 7@jӁS ODhQn&«ux``@9U#qGz*9vqjDU'%.k` !.OA94 .fHkQuD|WWYCDVDєO&חŸE,J|BU/[΁OьUC)C=L-'"f5YC`#2x7U5vm ɵb]:{@DaFHli(03L^$}[ErG`פ癞ÎyąE+:a˨CDf+""Cg(6aF~_""`'e vr3D5/nuB7oL^e{u`!w˭'Kud7(mդ},P-flɌoH~ ڧa1hގ w=ɀh`1O"pmRKft[``K`≠6_jvcHFG" 86~>RUR 2LDv*p{@"2/3?!5<!3oj1y8/smfhFt*In 8IܡS+)0ϱwK|U%|V1{E DJUuaݭI҈ؚpZ>fw껕LLmۚp7!<>F|ͥR$e 퉡-p0WЉ"7Lk,J' v_33Rt{1(r$}V'FrgwlŌS8~jU}`%Tu: 6reu7"~k<lݶU[ QkIXWVמ2p6QvQCYe e>L ?lۂ{/6S^TR=8V<5]3"&eƵ_ڜZR}8\A:XZ@ؤe؊Lնov^H*'O?i75EŐBٿK7N8 ܻ2K9pk.~%,^@0JW`<+CU?>jh3 VUBz)PqSj%lQT46[p9ulўt$)?AJ]\Ihl /Fr$ t;/"/xx WΧ} p yǬ{G7nzm^.]ؽ| 5? :HNoq553'8aKwEd]l5fDdT"'oPsya1!lAv&:~.4'0>饀EdLAO^.,F=q7lb5G'KƮՐ[DdgU)^]~;1ƉGY z}*[l߃j|gEd~l\%` h ,L84m4p"o-Nٲ}|/y-ڝL`oX&d"'ԏ v`߯fxd ]`ڭw䷄\8eR:Dxl%gAykއ.]JZ,TPlߕǚL"}+&k2`:ODt}8;cQ셻mkH[ k;`cxتuHelƈ}+ F 'qtn{7,)S${Cr>m'3tўavKqnPBfh)f%dQGF;ڗA zZkWD &B /n{)ylpSCڨ&gf aM1ڱN!WαJ檝 ʚjF;/jz+>ߊK[j!t=2G?Fm \bYp!dϋI= XN0ڏAf(԰Nv,R‰Ey{MIJXAo:h<$Bj}*C}JȌyyRAIIRd7h-87'o ȝFɲ7)y GaGu:`*E: SDNu}M'iBUr "`ٵ-eZN,$9p.ӊUugHV*>ӧa^ i!+*/,kY~N>D'AD6&{{p6'eOCse58ldiltאA?x $^@ }o0znAyp~;X\5B.y~,@rYN$ g k%@D }6~qȍ>w$nw!犢VV^DdG\U;c4Ҋd>ƒ鬀1<lRtap̍+"27uK׊UCf+KDüB|ʀ[-eˈOD6}XD؇Uu-ȋ,M8Ddh53U$/82+`y9;T*Uu  .!w3"2ᠠ`Iݖ%!-R#d7Hw9d.>HcY5,YpvרorԎ]NQ](͡HEXKuW @D6An#Dή04jWADPTdZ?`$r&[*l"V """Y+'={{r5ЦL\tc#OrZ׊LSIdp!՜NK6o\c]ÊVƀe $#7,mcvm#ʅ amED TOǼb렮qh/Ʉ_eYZIۍz1Rp 5*".uIzXWm@U_"Ŧ8V 7'X$կՓQ!ܷ^Gj!u=/aX %񠉭R[+g@x+ <1u_#bʁHUOU_CIYXܺEDB+ީ&έeKlqi " 鹫&kI<@XNDϒl?\䐺)5,& Zm_Vq;$-C:+̚GѷF{-rHJ>b{{' kWqc UU͝6c#u (JZ]c[Xf6&=5U=a:ō>w'*|/ X>Jq6;k`׉̋;Qx5RW|- H vVǵ(1b?DEU/Y# FTX>gYPDy`m%6[keN8nR.2rvBܟ^h'!hюCDơݖ4b:M@U]MU]~$hcjI_~]𜕈索z\nOXZ"ֳH#!naZLύ_:.y݊NSUdu1)WȰ:ň^7}2R7Dʮ@D>-"G%"D`#,8,zq\_f:A~+ye3_-RWo$ Z'h⫁wjM=L$A\OqJ,jo9H7],]MgB7ǬՊ,C˩U}8r1?ތ C7K,v_򪺶n+X,n[l =@dEQNjƠȝ>848&PbuDdpUGvKk˺oyr}>Kep8S$qle*C3ڌ VhUua VEdݷP$!N+-\GG;ht >6%wV)^7ڝ,,x`Wn';IQf[M}>M2P "2h3bŦ//Oo._8m}Q_g=m#J$EUo&dl*d3Nokn05^otU-!84(^oe'blౖG]BV1W IDATlr]@DŽ+ N# 51ɺY߂vH`.'}KR9dt]i'+K!pU5?Mb݄6tإNn˨Т f5ؽ3Ym16@hN&ٓ!#CKw3=︕vYxSZKmVwݶwynSI#IA*l ьLm 9ZI6Y}OEDdLD{-jE⫭(=4!1/>-l+荜2b*tjTU;#tJbm0o_'vm:>fz\ƶ\#{{F1؉=G1]H][Y]VS>hj,9Ml>+]VȨoў;~%rH_ZHhnLP[Al c[*Ed?\Rw;% .r-b{=LFD4FĞ՛ "8~@#פ"f9TM wacd\ " =jcוb\!vhxDDJq}[ԡ_j5jpR) ݏ 'MlNc5OPĩH>":{LdR&|cA櫩. |:*6қf"u~7CF9a+JLOKgL |h|Vb1F Z6&9iw˦\Y$BltOTuDŵDNs%΍~ɓ!"-q?N<~9XU}jl,"E܈Ⱥ@:jUQGsQhKN|(qlS#9qzM/(jjC*K : =`&v{.eVdQ_pIY[GV%e. L g熂2\Cj/ ʹ*9wʹ]HmX6,p@l[>[u]f k梑>R ʜ K&o:z z `r'd%ǹ |qFtxm`06(?7S](pb6^KiNu? OqwOƶθg' wBDg#nφ72f^VM6EKy-g۲5K+\%\D T?<(gN,"/,7&Pէ  ю!#{E}s}3I{Sd%ȔSբ!s)=@57Par ^^jx}R$]ٜGY ػ̉s }y='E/C]Γc>-JV'l9ڊ.uQ% 8U}wѼw2"*pU"("E%^mZzpr{s8sN~̸lGHUD㲲 o(";A膿MBU? W{Ddiҷg1|Ǡ/25Ҟ&&6jsraSdN6FRRf+ܡ5+^H_5c#Ԋ8E%d}=gti<Ɍscظⵙ#y~eWBրS;K2wJ +IaS 2V{z==Seش,YRQW\zJՕoGdGDs8glއzϜXFw5x8r}*!wܬ+V{s#`њL;U~+{,Lܛ׺ҞMأy*zb^SdhƺpY@r}y%BhiR4^b%kb%i>]R>FOVз)F{"{%lK%#4DIBrLFy۔q),GKa6'k-sb{ޓeK\QxJX;z'M>'ҶRÂSuK0,'dO'ܿ:ʸ?!Խlhg2=. Xl #C-DKa~+&Qo6]Tpk586"hXnCF<~dC3Xܽ"r [Rh,ṡKmKu20ܴ(?a5e{EE(J7>`6n{6'}M1kˌ >S o,;Fsr;v%/-,nn/l f4M!K|?Lӱ~e {3 ٱi:^9o(郯 s/LQ^ &gZ1/݁As̼oE+dx_JyZ~/UlC\9o*j%c:`Ȼ>9S` XV9o5f|6-E2[3`5tsO|`?#ME󆑾G4נ,M8m`A6H5صstD{sƻ3؏=? m[뫑w[1ϔ}y l\q?~[;aO0Oq {.\C Qq*}b' yAyKmJN .MId͏eJ+Bz9o9fܙWK|F{OT `Pͅ,t~s`>y3XA`E1yv֧~Q`cgS ^ *~}Z,-ؤJ8\]mVpN9Wo\Ds)V ':܎`k1G< 6xSk_.&a{N# @hn5\4:5vAɶ!wy҃Y7 [, 3 u`̘H3bp“d˃X67S֜Sߩ}qzbU&B0X6G0Y bג}HI㚿D6C ѳ`*w @턂&Q "s46!( bՠb%}ɹۤqNK:#q]wyWvJ]K-3P>:-˅5^BF{J3v ̻0#06ɵڠ6 H6joO$I.VݼIiX«Rb[6h3o|cQPV6t=|?zm77gm4TDDBdGQV̋!l_p8)ScƄDu2$a1ጥi .SL"=IMRl:X ^i?ldUcї F{ ̭0S>¢,V@5 )/Pm POXHU>)5"a<4F{-+dL=-O[q-Z&OBUFhkvl0kB2V&bFQ( 7ȹ (@lE؄p!J8ph }hV.SSC}+퉌O}JGNM7ړv2S& XfJޓDìr|ͺC| V$.FD6ܫ7‚IsWT17"2;Q0WߪS%&.Qsʞ,"C$͠?ˌkBY "[`6c^Q-Gz- <80WUڟ "3Uu~<[|}m+韴!\ZaU\J&k|CU*$IJ*Ui6a.طdHS'aWl"&rk=obgFc[Ŷત͏$Y(iCT"'ȢXS0xU}~iωMV~R{;U}.1Dd}ɑ<a7~D2l?t6o;S7I_9o+leQ>=16{k5q]Uʚ[sw-b[܇ϗj(Ym$vgOE0N`Q~ [0= F{$h.VR̅Mƌ2s/|TUgADb *0 X*؞u"27\E,؊C2V7\pGb|s[bNF$:Ez':tI:4>=Fq_g}|zsQlhIl_59{k$Lc{Q{?Ǝcm͘hˡػl&&`.Ob+*cAF`+ӱkfߤcW"2f4ñq@O<3 g3,hTVUozsPvI,6AOjr}dwq 6\ =22c<OaU V"@{FzxF1MĶ|&azftBDcZwFbA$9~U}Ez-}GƞMz oK[pqqqi~qO!" ۭ8ӿ 6~ }:y:N88] oڬGA"""[q 8xZD "88Xy MQ*)[Iy_UkNIDdYR`^즪nZN!ػZTuYKkTuUrDdOU}@7q=󀡽<{N\%,{ y8 XU'P'''"2XjE/"z͜&SX_DTkӦ:s`QDdSU>Jmo W:NCUgk9?~-".#׍vq6r)~egz/l^N{`ضNezcUur޶DD- ) VaKo/D e$zyCw"4OC6[?2sl_kע2=z8N{?N2zٖ_~ DzYz9CDNlT`U} *BU U= ēwuW '?HD6j$AUDdhwi"<,﫯:"_;tsڇ &q=͍g W Tr2P75"^N;jXD{cP3 srq= XiqVy DjDsZ fNjFgfvr4i37,Z7'%mU6Զ;!goN/"čvq#"{l]L[ٱ5oOjc!$0ŌgAU'PD'XviF{rPß;r]Dkoam}nDdy,"I _VȪЉn;4X(vرc?6ڇ K/ͳN=Uɒ*;%w_1<>k%" 69< E9lu6!364y w p~PM(;m N-F|OU+=S"2 {v6'=`d#oȍ}LU߯C,r{5c^vRˊ&$1ß[$KV8|\yZܢV & Xi ySvF;ŋ/^TaG娣Dd`Dgc@Ng 39mSs{ "^Wy>݄p{EzDl9ڞD}Cjme˨ f ͊: tbn=7&5C1WEt:ks*e``u s˞XRd9~Z; %(ps@cvq&!"slc0VpZr)E2'ZH+I4j"r,3 Y8ێc=XD86~G8}lPc(Y:E١Yyȡ dmQX8xXDGÎW4dDi`W 1-ױ QտFaDd+l4`DY"ԛ$U<+i< "M:X6"#fx94X2|INl }Ի1c"2 ;wMٓ2)z@>"lɫ kz$ƳFh`&\@ ibQA:dg+ X6z:g`o,:'c,؀U;Ed:u2jnŧG 8Dd>?XȗcE# | $0Wf%lހ倛4Ed,fJV"lR|8g9.HMصi$wteVtZŋ/ߢ?=ke\>>ďQ<Feӷ7bxl k 1ƥrr,.oc9S0o=!%lVu$frCo{"M"jV@{&|k~o1saBb\M.Bz{<ׯE50Tƻs%%JoIDWSug6}{ ,x?lUllƇqrWhoZh&؀.bzR3G8EhOs"m _DG ysc{eM6//h q<4P}YT{4bOuߨeg9%8,\ dlUTՇlR=?pny]1(I*|< \^QfiDdl;M;k, &# IUCOS!eX4M ¨s"2LY$UOEd$.F8WQ9_ގLcfOj!}M6̂85!"[`<J \vlwN{H rC"2@D\wz*YSU}`@[ TޯCj ^WEFpb)6?UȷiL&NB|^D,),XOc1*ŗI4nQ;*IƺM8[[ dikL<[VK*6mZƾn;Ԁ̍RQ^}Uƍя4?`q=+P`[iUDdeuPDvuwN"VU+~iX 9ᄷDԱ:ug 2:?⧪U y3cQ l^N!1~9d %VEdNU~79o9&,  Ue94o¹8 2pbF8N ^ {}bذaçb+KY9Qiz*"e`]US/"N'rkbyijX6؀s'2_KiDȡ@h*{jyY<R U}5Ȭt,RuOy$ّCҭ)`@jg.Rט9x:}E0f]I V"ٓx iB]{|Y>n~Gc['O8IVzs*hV[-jyRU-"_U_T߫ǃgY :QDJ!;%-x}io+XߓTۈv}./!"FUoTO*mNSTu^?›y&/S=;wجH(77OogEW^rj#1\Z#uז|g!\y|)}#u seMrz{GQՉ5߷o;:>pq:ð`p`J?VrӸ=d]uk<Ё1Uu|C`),=!c"YENH_ڶ0tLUo۝UDF$.ATC@jO'Kxt` UvKʜU}NǾ!7N#_eUdm!q5ݯV(OY;rȵ5 S)6GV0O4Zw>u|F8NET%`',26rT `=lYhy@X  m=FUIs33.\/"!4:1H]+ *`c+OȮMqH'JODxP!٠V}*eS%icf Ă4I`^ "Cj9쒌fbHY.{@8]aLI"Ʈu8@UUc#&{Oi{9&L*h_a ]}P?m< $wk?ϖiݰU+RUՕTun`uݿG5[izΕ$`^,rA/2WnDd$TDD`+!NDl ӈSF{iķe1ez"y,}bPsT;ΧN8Tit$<%t<^aȡXVC,鱗NV@ks,8"rl."N+$yH8uK*NĞ !Qs[m'q7hJ2a5G6v ^YlH}Vcm&6ֶP/Hҩq3"r 31yi=wrT?O:I0I/ X( %I(AP"""eiB -PI q&ٝ;{w9Irw̦RxiZ<^5 Ϣs@ViY]'f'ǥi>P."mF4!Q:]oK'3{ʼ^[>zh 7¶ZD{(TR`aV I`4*_UE31a{9Kl U16w5Z=ef?XAz#={WΛ~~Ҷj;]EUX9{8 ,y kiԞh^̀CFy(I9{lLMOH/^2kH 0[2MrI5{10:&:&&&l杮0Q꒖d·wGK&lJ78:xLF!kI3li)f-p|KnwsvUunI/3[ñ}J \w`5JiTҞws7"@TĒ b7}>{?eܸql/Xw>TLt2pJb)q~ˀoT֭G!3=+d ˆy5~ɝgUNJA#ٓfm1R"{G\92V0M+9~j]*SNؗlFŘ3a+Jvia^1 0杍pI#A3~nF;3cy;G^(ii3|g~f/+L. V6̡խW7ͬ-z>KvY] d=.X3WnlEI9r,rMW`}[Bz1T<^Z$Hfz4wd!)ӂ;#^8-Yv#jVI{ڿudFRJw/{}]D$6# 3KZVLe>j-Ԙiwx=d;5 )UҞoݓ6{X},w=)^p *q`7D*)Bx;G>"coTqg;9loOv2a7JJ~\pjs37Wa:[3+wr><wwkRΕ>P."$HYDJMe߻Po:gbMk/"-t=q>mfy(*(U3T` ๔5Qev)v=~HMj/7W=X`tsjoNwϓ;i_-Ǿ:tTӎ8-yGIH6f!!Y+mrNV/[(DgD Uk J4s.iw" v"N`C51f6W_SiZj_hd ?߇ w3e~vZr6DD&tA,x.y欙ruwlH)3JrjWҐk~&7+HxRE%""e$~F!V[L%z}6& Zr*kqn#sJөɤE }JY-)s*w"O"o*3ے^SS_WE|-NgS/7[q{{ܭ7m`fʳR9' &-PkθCTʹ}Lltu:""5I*S K=&<&q2d/w謹LsUmomVE!l}|S7%(5Iv_^&h3kt̖t[=m9B%c:z0-⍴!.D3tS*fHdGc4Q2za)]9%E+335),/g)/'|v3OܑJڋʻќ{t`2r} N-S."0x4s\hF֢D_ݧ>t=3;7{r,*YZw,FW$*Fa lf f7}ײs PZk; r1zsf` /I(OoNy%fj늘C IDATٲMwp{GwgrgOk'@DDՑ#w*'Tg4]E15ai{V¨fvpNG41-aE͒J7V:k[34U7;\h3;(WkW4rhj7ՋYUZkf{u6'L)ߨK*Wm??N&OB)}fտֆt2"~3qnjEt229=*lf~KW*6cnDwfLklY_fpit-Ъ#ϝMftsy`wl~HWlgOޣt|. "Xf,7zLJQSҞij1p0Q#rsn`:zm Hړ3w;Rsߣ?O+W+32Pnig]D]cWgNOC`bL }JP~0:Z$.)sjv@wְ~' 3…e=f.Wu%D80鄟UI%[FHj ')]0)HXýq ;? ܌œy_&tCmDžt34."=^R(DNz(֔0YKinv,ϥwM =Tilןv4ݫޣ8C{oGP͞\sj\dk94ͯlS~GXamYtI!Q9_7z:Hf$lEH෣BnEX ܙTh=U1w/MSAَ5JC(cf ֨F6;xϷdR+QnFJY5-5msVՇvbwU3$J W̎" 4g#F %ع̩CJk BLXG>xKKnެA(u%_%躈rI%Zo&{ݧ6-Hi9fa͒5㓒Wݽ\.,Y [כ݊Q3 ~*m79o&& |F&z Z;(Vna3 U#kgf,/Z."= 7GluU9Ǡ=bzK=W?d⧄RkEDD3[mhGi]Dzdj@LzL1: 'X ]LtGLT >ai˳ Sd_ofoz̿ 7֪Q."=}DD}]SOa=C>ݏ!:`3+؞`f?DDD$ ;&_e+Wi^H|ݧU>&:8ATw(YoGIޫ [ 8!N-n7g ؜DDDdT[S5]Dz 32@ԁ/CմFQK>+PN@^p=6}/ԙQ>Eo"l1Z T."=FR~H)^ըyLԛP4d'p/ObMUlPݐ|C|Maf+ ܖ:kBH"""ҁ= lޱVM&Z."=_t&쉟+|]Kcw"P:̀msie-Ls"2J/Js ;(iIq C+bbY`S/ʏkn5&Hn86lv<"""Rv)ZO󜦵kztkfaAw$KۘaM:59pibMlw9IzwO]v6pwPifvp?{JE2-}Ր$ _#3prw~EDDDEIt[fvMɡ>1*|=44” knf+z *4i*inF1o~C18x0&Z80b倛 LDDDHwo? 7J&ok(9'DDDD]DW?4F4*(Z& aWrNDDD$GZ."ݒ jDF(zEC|M*P]ogf$pzvDLt pa㐚 س@qB= q%~ӯHHafmc =0*3 gҁNHKloHfZ."݂jf6J]?$ɘhZ:plTx"""")igfKWžy%MTLo~#&Gg QDDD:/"mn[r~G5mcMn,aZ@\rl9`ujw%FE̛Qmž %:1I1Q}Z}Q^3^~OIOmE~czצ%qXafCWDDD,Mgf+#մ&Cfmlfw8uW}HDDDZi?w]MW'  <mq= K2&S|""""H81яk4<dmlfKG9'"""]Dڏfi-C52 ,35*2M S_ˣ_陔H[1,e3& ءI[sBũtdfOs } PZ."m#]1a?Ky \g_/<^nO4."m./9_WMۘh)´Et/\Y8%kc3[8wC|"""҃h]Dɖ%6aO\v?Ddm^ׁbroDDDD2H 39p QM{otoW?+P(kd_e}f5]EDD$vi+f6D'&Z,+([oGf-p7xݟ_4=^DڊO82y1Jإ~pOLtmLTvv/c:nJ#"Ҳ̬7;Ƭc-y{ط@ZYXé/u&"""݌FE~aLa]$owD27t"ιf|HK2/Z8c휵OuSrODDDMcf|>}xI'RAљ<3WDDDڏvi9f#CմM+OlDl")(PNlaC=z"ҊsWKs,ݞl5X̛ vYD>,7"wZb5"tf!,Kh;KZ>&;&O.C(PifrUDDDZvi''w%gSLpy#}GɟϚ)6]D6-9XgH,\-WG?WK i2-Ӂuմ Q4&%vsODDDZvi*3{Q~z5b@="~`W646~MαH)i2큟ë]D(ZF;Jvc8~}Hs(i}Te^ <*Po=w[K]?_zJED [] or("2 8@qN-քi^vODDDNjH2fv]?{V]yC1*t ,Rrxy`v2fxX;9tRmhK4-^zOsju7vvJyanUb(aep&hLz -&Ainf}/ VDDD]DJX;3-8kP"c記(SDw?gydiAJEl MtY46lT`"m?1Z9M2fv-C"""#%"U&'v14AW"sm<mnpxz|"XDD25wE`iw?;CӓH+&B-H>BHT=^DZVL(f&aI366a*:(i15/,mcbu5"6nhgyto?0G"""vi3[0diوDY ̮JNukODDD2ҔS]󵄄BuDHЇ}T)%1۵HR."pa_~SmØ?!Wb R5Gc3&%p[cd]D᠒!\W뗄CD8x6&b |[-BhM^"l5]L8agp>pl'Y'E^tb@/w(HEDDdJE$wf2at wG5mb~SڍM{Ypٲ?zy)ilE6\ U8Nk%yDDDvɍr9YDO}JD*xU@-lq1`DS{U'""" щHl3ffgi%TW.ҵV.pj<@IV.%$Àof(`ݼ0>&6k މHN4=^Djff"9>1ڄsdupxb.l` pΣ_DIvn/9tTb>6hDl"Rׁ} 勺#3{<}ݟ_DEk<~0սZG]- %&.&Zg_3Jo~EDD%"R53 \<}GT6&<lֈDKCHo3;8г}L=t'/"U1a9%OQ.],>&Z~ lx}t+JEZ _ jD70<i(^Wfp?W"""BITU&&Z0u`#c`V&YCiJE!i[6;iWw l?_'8vBt"R5ml JEzbDҁ?Ot}9'""H%7YDÁc8z%y'""ꔴ|{we3vq08נD-\ =&Z!kcwo<[H&2EDD%iyD`$`uw1Ѿe ODT(ź/B0 E`w[}HG{y}9̆D%" B1J9/_*3[(~EDDZv_^I+"ҙ-11OczG(–s"""݂Nj_^hitT<'Q<&Zξ<^ ٯHP.َ҃K=ˁE$"2 b_D&ٗwt8=`""JEzK]mØG$"2~'cu6vm sy"""-ODz(3 dXMۘhI`"aJHW T8#kc3[0;8FHHoW'.E t>q1цY$w4a7f;3n1 XDD^iLb݀x3_(N3[x!od4vZL8aZb͎ED$a_40X`DS?w3 NDD^/҃jfv..F ՁBLtfL4 kcwF 8DDDꥑv%vmވDDr<0@PKc3 838Z(i!r`Ci-JD#biythfoy)""R-Ml+MŅ(a )06&">#|jfԯH ,y<˫f|!Q41E1Ѡ:*x3:va\CjDdiG< \Li(i!l3`MLtE%"e8@㬍bgRBv)+&q5`Ś ʙ/rTDDVJE)3,!WvmeLt%Wi.P|/kd)WDDD)iFl/ ?_Mۘh[j""$`ځqY%χ_!sYDDt;f p_MhA`|#ci3(SO'fxX3QDD;%"BLt)_iA(RkɴOtJEzhk5;v̎Nzݷ#8T=^͙پf6~kf;ohpJED:301&Z)jJkztJ#"m6$tm]؈DD ?VtNDD%"m*{ X;94X'U>&'eŇљm\ 8>]DDDEA|!a\vZ -C"l kf Я9%"kS2=o8""=7 1^u3q/@!.NDDz0MiSf%OG7}L5bxݴ}fmhfÀ%VpW ODDڑv$&ZxXٱtSS# 3_d٪}Z!H;Q.҃Dg7;`ŗjilf>F"#>50ED)iiff(`Yw(KhSŋtEJ?^v<]c+K4=/"uD+r`8p]l)""ݘ.EڀWr({E$""| zW+2iyJEZ掦.}L# V8Yþ-!I8DDiMH3KU6&lDl""RO K.P-Gq28%"-̖'մN"$0@qBCG<R.l5ꏸմ426 Bݑ3 gӑ&Os;ODDLIH7iv,""Rck3r"R!:df}l-TcǢ]ؿw~icg6; >TLt|rplfS.b̀;lh1cHWl'p_Ԍ01;?.+DD4=^Řف%tմ ei>{> }YE^"mippb⌬Bk x+""|ii!f"m #: %>~ldꘙˏ,=F1FY2 AC3̖'Ti$%"{{U#,1Zq L|,xď$EDJ_QLאDp>]ݴ3$^;f2sk]zބDU%n3 NDDKIHk988,C# H2zfɸςOObʓue5-? A=3W/`@NHHV6)to;W[o~P>hpiI/# <J#"mdZvʭgOasHK[x0&:/&&f0{ld Ri2%"MdfKٟ̬`f+a&y%,+WcH{VcD[ߖV_.af+ЯAEO߫mL*,Z(ČgTV66pk@Pz<'$?/PRKf0\So(""HH|Tmۘp Jإe}:}RKo`GÃm '"DJĔz8+C_5(&˺`/jjHÁDDC6v{5 7fei"%"ͱpjD+'7$*&Zֳk@$">kYdw,{zffhH %"1<ﬦQLdя󊴲9ӝ)N#""ޘ蚘h]wᛁGnfi0}Њ4lw24=RciOgd+oXo/߻At+{b;}e6M\`f#rWDD*P.$>ݫD/0膘hN_]ZɁv.bf!fqֶɴU|E.e~LvIK] 53vUZvl)1bYw:33("s϶PD3ہ]J-Zx`p#biԦ@cð> JPx{%[^| x_ΣoJ#" ffeބjU(an7꧄]$KDDyLs?13;X""S.x{<~ؿچ16G$B?HKu19 <*""Q.x;4"v:"ZmUN~-́IAV]dMlehw%01!9:Si]v"0c# R$d}V58FD̆FWHKRUO>}Yo HD:ط@ʹhi0v9XD'HHΒƘٝLba9G&zj۟]"]h¨^`fk>aW^]t3 4V!NnKIHn `fr`ܣiAڟ]- Mtt8R|Uz]wŻ˓O> /<̎M@IHl`CCQ;klߨDZMMI{"t"M5`|Lf,r!lvll]$'fPTx~}1`D(Z2Wx;SbwiPD"'牡olVm#F0vX'|Ù4iܗNNsYy-"Ҏ4.멜CHƯ3?ٲe_vAjٟ][}ԉdH͌++M'ligJEr`f;Uf6jHzv (Qh{7[mgϟ|I;J/_mfY#iJEdfFɳX~.?2Vzv%"M7^s>~.˙g3f0rHfϞ֬7p4 3DDz%";Xƶ۾sô'޾lꢨ s9SdKڭ1xC%"օS\ve 2't&LO2}CnDD`f;ʣψf}N}toN6 nҏ_AH5>,]̙V~nϞ36ڈ3gfs][‰Hv]tE#\s͛gox)h];m&҆^A}%Y9rd} 13]H?,.?~?0lъtJE22.#_zy`,X7Hrrͳ||P쩾E+{mZWcJR޷RÝ8[6lǏ<oV733s1fs9FḐRHv{{ުU8#8묳 99Sz >F O`x {ض_M+&Y4 m"R CDE;RJ~5HHWBy'7nO=׋xxWwXٰsHe4 Zvb[AÇ{)eP#S디{NO svLܠ2>,yuq'aQ̩R=FvIi+]o'O[n˽iiie޼y~}|߻RەvCJ{-,RN[{Ϳm`aI9 Gy컴cB SN .Rg`Ԝ<|)_)fkceco`"tջyRJ5 ?cZ)#WM4ٳgsA;.~_ҸG)<;ݫS*1[0%L_zFŰZ>丛v4dKs[Gx9!"z?q4v ߽.sJ)_$D` ۵aTӤ]=# 7d /[o%;;{ff$Hzmlfՙծ8͋;XyJ5"22}X6z\PC+{rQ ,,rz( :jc QJJ1f.Kjn<?^xa hV*Ev>{)r_#*ah]olh*>$ 3T y^ z,MՈ?XGv'w͙<,"sEdǺ*TOӕv\ ^9}tf~PմJŝ%4-ta 1{tTY= cB>i`ETܲ 8F\EcJ)kdܽcLtw֔Rc+ ufͮ 5͑4d Fh4|Ii`ujڷ<~/Ig=9uo_jfOk p=exSyw=pn)eG2XDwxR*ƴ<^0"("`ی1c̝@ ^4F=UQzð:ӄ=!ؿ3\ O'ȀS(YZLš | ̵fXf5ƼL,Մ])4iWjG lm'cgπH^lٽW)'";dml!T둬Chȡ`a),R!1Jy!0ti_I,Q|aه{o<`uہƘzc̥Ƙ)Ƙ['"?Edg*T<^."R||ACc:.᭖8}Òf}镊_ˏUw{|XHƁkf^\i8IWY EVķ]VJֻdNObԜ  4|j/UH߷4X Yyj5Ϫ4aOw |m {{l+T_vzVX<=c蔊3XOXyp;98-R-MڕO 5yЙN A&^ȇrg~5:8gDRF==og?ǘgǼ]Qv}=-9ƏY46`O[NX'h cVv]eƧRv`cMnnmj_ %HXsA 峛\1Ӿ1ӫ =ɜĘg~v 3NV;Y~|%k/%V3< eiy %LQ8йghi3:&)]C"rP`c>t2]eWj | >à{UgTӾ%%3~ĠeX6I)H/Uv _J&/&dB[骀1^̫t]GƮor'eJ9ֲU=5t_Uңy' 3&d>?҄]c |n!ͫg4iW1S`0szRERߓMZWux667Ed?[&2l|)hLD,^0c6k6֐( 6 xKDnrNT?J9`c |!J9um}d{œͬ@w4a=9ٜNd4Ɖad_# v]J7L褚v(cSJҮ*",]P;ixVӶe=P2<,$Yz~ɚsj{R&0uA2zMc]_ƕR{+OJ!1k pq)5|z_xMAzRiž40IRF$0F*yPDRj4iW}ݏC?t@,^*+RDO^|cw}4ڞ}+Ȟg@E,)fùdNײx"t(ƚecE=x~T4/ P.9~,ܯۛd0B&Nv1f-0X 4BTGX>aW3URE}YU63'DLlNT5`+RNvu;}Ӏ1o{RѕvX{:z{c[WZOoP9ZJRJn>&y4[["{4RѤ])""2خ.UJEm'{Sf^;Sʩg'a?X}{gWSX &SC)'6u]'D#+D(TJ2>CD,BIw08?u\J'5AZVt?Laݕu,;R*mB"S>*d_߰fH+NbitV骻Rq* 50*bsDž좌^)շiҮGGNvr)4|:hdAׯ'e0BҦlUleWW> [zAWݕc%G6֍67;c+oa4iW}BיG]z󁓱]esXĦTWTӤ] _6*uwBg*~>=PdY=@w3o=-5RV [|RJEh2&uXcck"2MDDdiJ!S&D71:gci1 O!n&P|7}j"SzYyZ5m:F[$ 9Agpw`r9fwy'2|DuU*-fRx+߮a^.2ƔG3R*J1ƘiƘ.v!T Rh^*aȜb)og!&c~!U2aY+&XwXќ#s bNTѤ]g? +b,÷zw):7)>gl냍ԿrlD?p%ƚƘ- B(MU%""2Xk8p[ Rߊ(iw9-,ZN;I1|F>?=^Cu꺈Ǝ?K?ڕe~gc3Ƽ@hYxXmJ{U$"Ou=\mq|G,uMjحt^4fY?Exe̘Ht^,7ߠ(Ψ91H)ՍVRN/"r5l FT7bKn.@v`u;%cw-t,w;P)4iW@^8hc <""Ͼ&t[id*hYmXۥL`ri!ɌO뮨hȇsIȉ?R-.X.2d_4"JnW 1eS4Bq;d8XHކFBO$t 1NX=1J)]`3nFzXGy/,~}$v...lƘRDDR1;42\yR~x|Oc]}8N]dϤ7 rsL>q-UʀkYRjOh E~0x XD>DxvpWNw:!XRw/ :4^kϷP|#J) ?XkHϓDWQΩrA{R=*6cQJ9dQ&O?]vOEubc[ұ*gpjۻ %=`)|Ƙ7 N)wҮф]nѼ# {~IL'k/(a;1UvT4mXc7(>^hҮↈdȫ"ADNv;:^ BSJBgmIL.ϕL~1tz[|>\#Բx',t;a5p#p1^5-WqCDz3XkXĦڵ>Ə۞4?}Dݻ*t\d^K@>2M-v""@xG սe|J n'"B`4`C1s::gSJeGGP!,)&yhW^gW72b9uo~_RʕJM71&o]uRqJvխD ҰK{]`ORJ) gL2жӷQזV47Xz66\[hRaR;l nc3GʕrBU˺c;kcؔR*Ruom ?.ӅH#>lgŷ*騈xKj:4q/瓐k Jř6ExH0H26H觠nk~Ež <R*rFsk\'Cnˎy^FKvXbomw+O1dL >9>|B-:h]IˊNF5Ng TD:Rّ"mढ़.olc̆(SӤ]=`.1jRտƒݗ҄E]Pβchs>!GO3;1iIߍA¶goD؟I2BwBRD2XD~d]>)իiҮbND"c2cm `10블R*fÂ)崮qs9 s-utFWO^2W޾1@MT<ք=yX- im8Tn~SJY"080,6DzӮbJDǾTDn`Є])_SQži'1%5APu^pz3lO% 3\.("蔈h[g'Wa:tA8\|bcv1f18`0!&-ljAz{6֝6VD{c1;]>? 4iWR@h_48jHbcpqSJH5|QbKFɍ٧ngUgEvV<:O[@bq7x? +aôdߤPJu+pƲ#s!`kؗ)tO h16V*#CF26r+fXXRN Cofcʾ;UT؄<W@ڄDro5?,o(ƟkJ"A^Rʚ\`kwhҮ⊍upYOǡR;[:6~e7$&_h-|J02}%{b: ˎt/?7DR18LDFw[1뼘WxI6A Ti*\/.IO IU@aos TF>#ұ-ȧ#hp$i#ڷT^?/1D]&;HyFDNy"򐈸՘dwR)gLa ;u}fv ETl{ujL$\5kmG-SRGm#, B7^nz=K6쁺 kέaQUS?}S =_!6c6 cN!lٞPvR=Mv元~ *T\xs͋"(kbͼPMS mel}1ߣ>5_S?}J1gKm4tcc!)V?'"c UҤ]y N7ƴ:dcGRJŕlnϋi'bʾ@ײh]AA4HqO4iWxzʍr@N6@D{4iWQ3R11;cc%*Ort՘"}cWP1)oFǾ6L)g=1_qk<^> B'F1)""ShҮe^!֍Y7’r6}%8ҾKR=2ncZ1W*Pǧ4iWȅ }nX c[?RnaL{eWe_R Q A$rro$ YLi_]*":)=جIRH!Uv1cƘ{1q"׮)©&vA!JG)< %n:MHd Y1 jGOl%iaCnƗ٪{vN`o#gWn' D"|G"25y&ʭG1Q@k2J)ONdY1NIs|ès#NzhYIZwq?y'~$k2i!FV)` g4-vy{m!>Jn3xz*tLUaYQƧT4iWK1;kc%*}RJE!q11| ,3d׭w\)8#Q26!2l|)݀hZp}}D[ ve8)5հʈ (I:̟GK'DRФ]~^\bU:v*TwR*.-]Mu4/v]pTsU&SyPzWAMoY|=yO>lm](ڹ,6+WJu<)6  IDAT1 }_ GƧTD4iWc6Ų5>)T,$T>AaK>x^īґhrMJ$uD6u\-d]R#5/`A`kd @'d?78hǵ,6ZsJű v1s08("2\DtR**+W1ch6PY|rl#SJ;!EYFGy=(v}Ed<&h`aI9 _u{JGzn]6L)g=;'96ֿlncʻo("gZ=&jD'""zRJe!TvY.;FJSF'0ߓ?=U:Y|pkVK{v0NDMl6UC*hYJűc\3O~B[?̫iҮ9xm)51&Q)Tɞqx:k/fL(xIS}X7,RN{ol3T"i8 3w^Sw* Ylk54y ^QE^hҮvKDfzX s:s#SJ]4=)#f#M5,9|@Wݫo!PϜ6>w_iL^p[ ߨ fKll,odƘ 5v9Pa6,B;RJEMY9@ʈZ.P|Q%Kɞ᪻4`Vj~6Æv1prOpmt;?͟!%27mnc{:cRoCTjG9cW]킍5QJ)*Ys^[mt}zwU?)L ݾeB)ÀE6%nWݍ1cƘ1;|KEeӤ]ΰ2ƼdPXYvTJ)M#M*:/%E*sM̟XNͫtVxDK'&tw?ЏX*"cS)MծcVc1Ɯmqѵ/RNbj{/N"r<՟iҮ<ѵhӱ(T#:&7u4 `HȍWSI]=nzmi~)̷\c&o|q Xa|Ҥ] "9"' `CK)THXI{ۆNmW""۽ރ.t:j.!GΑvWJųv}kƘƘLny*"R,"ZӤ]}a6nX))ΟE Ɓb?^g̳y${u#2DPR*߻>9bYh < l6ȷ=Sq+Da:U(3/RJH7y)17i컬y.07{ CߵkR+e5Ń/uU{04iD$x 6NSiPJ)"$Wu.BcI,ǀSIE5ht qT6 ƺƊ ŝx9T?I =1@k|R>4~È?9 8%m a]9FRfWn*XV)%XF21B.>4՗iҮ>vGc̟]} RJpdwM{R7Kcsy{)b߭H]x@hxG6ol,5M t>p>F*>H T!ls(\0xs~"fx:u8wY1)sI:KkUIL_ wsͬ1,q;'p)KjJy9=Ò=&i6RWNۊt>f_A'v]ҿՙ {Ł 󊶸:~;d+bUwp1gT=F~FDrE`d)w::x"6){dTBO4 NK#ywϩb >J4(оUL_/꓊'Y}}_6*Ț k((o X2xH:-C1 > iψȓ:V~Sd5XhM^ocBg`ۧ:su&9GqSUۺN>Sp0c$&]/-]ꃬGbZJj Y {?uJZ>vg#Rnpv)eF2XDNcgƧzM9x%ҫƘ㜎y`J;jTnYUw*$_I޷R}OuWԱWcNJe_{M#ڹ4/`9:ȼ-n~L~̯®4-`7+غ~!~F>KQzN8~QJs%l`}֮fuc?zMp|:`1f6i6PNUKGuu) 3[3Â崮rpJ5{,?Ěk??y aD;{'Uhw³l^89pN)eoE;dsc6D;o߿rMHJŧ+Xq4/`ѕ|*[|¨r]WYT?rxᄈ+mfٱ{N*41bsRju\qKD"њ>Le&pp1 bRqh3,\N\W[?~+oׄ:8mtߛ<ArWYV^iw}SWj:k?B)Xlc͈b5]B&pys8jl8 k~\K峽+YߕIsi>/˿UJkgydo}R)#8]^#"ȇr;1SJpE)envvy1 QqXP Y0O$K:X峝 z)y6q,9|믮sWTIL$شVZUб5oWT]uW*Ν,q;Sg98 xTѕ>LD^71ooc=Д+Ϸj}0|4Oۗdh+=u\#%о޾)W6N]PDTꃬvuUŤ辽R{=\VJ=AbiGH&u鱮;rXؔ'om`õuwR%×,H 62HGU0&K`H_;YzX;@tޖMba߽ɳƩcwElJ7X~l%M =N2}Z"S?)tNTLm.(약>s/DcB1,v^s4iD!Kgcr2Mx`:a5T̉mx`?9G3#)N wQ;uoQF+݉^Xc+8ΘVϋݟ! "Ag{ TAOº18ZVtm19asUlηWJSRʪ#@D>]j.6<mpghX`Eإ7mg"6 ӫc>GFڤi;T¶'7Y_0b9??-@In~J*cSD>HDlo8Z{IwHX;R6-QvZR(P(-,2 MI؈ لleyqNHb^ɒ}>ӧ{}cl==ܦ~=qr =m!ǬMϘ}C6'nZgŵQRc3B:6`Y.̠4ɷxZM_G0l^k]j|Mm}FvCΡeCM^ȋE3R oCkX]l4pFOCXYZ];6ܑCɹ~+iffߞNq/ij]\CRI*yǦ2nܱҺ:#3ue?FY]໾ d6F􍥸&!!/ˣ# HnZ[[ SXJv@D;B$m6BK:T=k@^+CU55o(1b*+C9t'uS>E4ic19&MԳȃ)N&/>5^ay| OKfn ٲ<.&~$BRU埋fԵM]ZZk0yEHK(N^Z?kdw.X=6Q%UؕS1J/Ό~2hroGgNw1[r%V%bf_Z"m{K>A8')q1IX4eo& 5WFfj֬<7,pEȎ? $W3:A)u(?kV`_ ',&A{/|HD(ZG\ƒ ױY=uM%[R5 ?1퉕d1XHD',;9g(4g2CcZӏaP!="o/ U5OEP<7*x!w^|tޙRj 0çj_bqZWAF@) <-ہ:zp좗 6i=ʒ=c/'.I؀ &_ֿ4RbUErpx(&%豀_~3vE Sn*`(Fٙ4կFKsPBySoxp0:XkX ̷v*'?|~:Ń;py!zu„q'KfT'>(Yh|k/!P۔iX2vc,$sZnH +'fG_<fDB?KgTвGq )8)ktO{pet:Ek=Fk}z{JKR,]0%@Ew v9B$[( ;eb3Ǖ=HbWOA,h*P|VGF?Qg2®f9\] N&~RLBZ45GgH.ypk\w.m`Rj =] FhWD2; x$_TG杵/$\*# NL7`X۲La ٤0zOϦŃ&̷w6!&~T5s[#j,蕲=xp13zp!F7F T@#x=!D|dzp7:Xk88lk'";J `RЙt Q ؅uԚ:K F=Op &#S9X[h]-WbTڠ[rE1Tg+}`KWJ "iz!6Uu!9yy 3'3͕X-Z"{=뉪m,QڋkYoK ``< ZuZN)uRQ)RPW,v A{hpMV~ j݊HZ3>O9;06Cϲ.ȵ4ܝÄط~KiE^]١-ATAݻƏ(b3,kϋjKQp||_Y-횾xZ9?֛:/t>};  zP)ibzUDD):K>(KDžZ5k/xZqi b,k_Y3W3{ĸ0 }H =eӼβ=Ƹ7 )<}7!jEwDJ\ԽƲ~N5YO9Md]v؃R; 8 JwUC]>Yk4HZ襶ֵS ,%ⳌUWhH ҉$q;KmYR;/"gfGU_i%ԖxuҮi%^v݅H`i{{=Ͷq蚖7UdžɣkE.>!D26j`~#KX*<-pEDw@R~vD9cW[X~xj$8I1S?3ls}V} Y\]~*(- =A)JW:Xp IDATgt~,Mjl];ow>i,F]Z#ԬJo2ݔPN?ֽacbvӱ}keUPNt(A_xpY1zY~( eO?8N!N^fg홊-Eo ZvE2p-U!ZA\㵔FpM._b9&HPRc@:!B)GՄctzoZ>C)Q)RĪF'Zɠ_O}w Q 2>طHJp/C]$PUUk緲reS;q1{GW[0^j|٣Mf4܆+cjxi/jz {V O>o"DVe*t'{8 XY^B*VJݫ])e&peG!z7󪝊ءs_6MmA]R \/RH\xM6#ԻnD!(sxtE!Ϭ.4Q[/Hz#=6Cz(~qM)sJ>b#W=EC.12ރ{2jBzo6;_v; rj_{M:_NriKUFx&4 [.nx EbnmSN'[m`= +uA00𮻩w)twRâ[b򒠽F:ЃA8-iHDf/43:I+&6l`,ޫM{'C\Hc^*]o6FQ5i3;V\Q̧B^c<}(!YQΙ$hAJ]Z <ʕTK%D3H,بi`]=YLݮxm=K-y5կjMj#EY]F׽Ʋ*hb,=ƸRSy=BtK("0Z ![܏xp>[^L?s}=k9ЙwHyp *B ԌIN\kn5/5 a忚zYelR/ԄY4#2&;I1icbט%]v0W5~}Y5 &~\Dd9b$0`QFj>N|#pz Lt"iPJM!\)kC/hYB$S;9Խo \ Okm>(ɫpZ4{pᒄHHmΒtήLH w5+fY1XHTi]Ÿ31[V#|)8%-+6|2" ؅V5][04n#h M8JgJJR(K"vȟK~ڷ9^Rڝl)*C[ND%gg0b2>}Yz6>Ǎ+<57GWRltgK` IO7!DL^~ڃ;?yV>i`RjߨV$hjKLL{ 6A{0tT󆹖XYŷ|F* kLx]6m_>ɤJtK[{{<)n{Dۂ,;ѝw_GƗ".>`B0..ݫH_O02Ѓ{4GW$D0C>^*1|_n"-~KZ|_0,&/,&sgm)QPzIz7/G/no$ tFM ͷ;Tvp xBh/{p?]ht#`2p]bϓ=NRˑRQKYfBdi^f^9 szW[ Ց/qN&~\s9ڵ;ScӃ}wY;<崮&_. s!DN#~сZ؁@):U)5µƝsyyw~̰v9B$mHwv2˞1sk/0W-~5YO 0,&/*mjksH^Dz=ucY5s[Y~X6ƿ]Dqq!PۃEb!uN XA) O׫ u % DwڥqXESdG/gjMȘdU/~(m3n> `=_Ӻ&=d?ķWj6.eBnDxt NTJ`޸+ p?p:"t܊pZ}vG@S3M;#ȷelN&S}P 0"R=SejizV]6O11rD g=_.b+D qqbaO1XILx{hz~ͩCdLNd.ĚLV*+.k/u :.-vߑݜJ cꎿ:.aC2g:˜W bދ^!,pp%^|OR#m'wx}Zc+hw6ƁFIɧ6e·5+ZE(B#L- =<J)$݋(_R=$AŴ>0uzr5*dL7+B4/54UU33HpE;{m5hOcKx|To]dbŤ߱B$%ܗxpw^6"`Rjw;1#A{> 8!D˝igm1XIb ԄX{a;ނM5Ԙ~?'+셈ꗣkSnBBiܣvxzs+TJŭ=[@)uRvc=`YB:{p 4v\,'5DU ?_#6^UGZuRG:t$"Tv+(#T|Vc^-Ė.(B,Rv ݀Jâ\cD$hRx_+cb BtGA xf*PL6O4E\jWW.05?|lidjYfcy(ɈBw^]mCJR1)A{Rߺ-`8cjѬ>\Z|L</nQ՘ -W2Q{ +ypL)# ݁ѹN{pY"!zS ~pYF>ؤ*!\}epq-R;'IDɫ65I*ƼX@ bA!z)Ƌ$uoAwމ]$h]>1c,^C%.ReADjvXsV5K?<+6 ^|HjFȳ1n~#!ö@çΙ̙3ꫯذa)vWK.}OQS`:|Jkܧ.0!ؠҽ`];XÑ{Un WE5Gz6ߢ(ԪY++C9d{>fLd]O7o__lh0qoRj,PެpnwC>p{8!6ˍ6;rmLyϲvϬ@L4ӲY~g0A)!zm> '1|l)r3K!h]`Ѥ2Bͻn>ۃ#˗3|ϟOSS8 xC[hKnR`PKx9Vx8{,bH!,ht0?.Y\) ʨQ q0eq1mM2ΔgI`"z`ful{táJ`!0JòC*_5j C!''cy[ne̟? u֝rʖrSJB8:7 :k堛sBETZJ2nQu ʨ[);Lx8flg~h*$wV[ P^-ж.Yj'mQ2ۅƊDU^kήum7ߖÀ+b*!轶uk(,,d̙AE4GSS|e˖| ^? #J;˶fˆHiB$5&2f!΢ªzU?FGz=l^m~HkO+ys2H Sl3Z 7~vI%4J^$PfulKkR(bģy2o!DO Wd_<άY:u*Jua ꫯ1@g_+wH('WSjt?P:;SR݄HUtrF9BR$4 oTZ OKg󱫞z6Toxk)9)mϢR%z{˪ޘg*FX@);E\FLk׮;Ԙ]>?PkvE(n Ȉv,6*!Qj,3R{Z ~ZsXfdbEb6-d2o1,1Jɐ"Z4Pϖ{;m}i9"}1y_w]6oh]ITp7/Unʦ,կIUZ)pynA𽴊Y7@5=]LW~͒iZl.y,dd_Ț!H, _3n^B(ynOl嗄B\cA;> Zڮ #|ňHkB9e7|{9@Y?kd5klN{b{dߍn0w ]ɐs$e^$P&Ԥq|! f^9oޥx񿗀`i$hR|/ŰcG)oѧl W߾ſ`m98c/zj"jk=C1v^!X6ΚY<O NF=OxQ*BfQdLT5g@]PJ+?aИ1c8p%C=۹UqL4RF.pUo3++[ _E`S[Pe6FmgTع]`ɾe'[bRK! jʚskhd'3& wA)u;pyǧ\}?p=wj)$ENhmEPpb?M'ԨBԼJ٣MԽfIU)b+g1z6^AvR9p_u!|p+8 ~nʩL>E?B!Z>KL ޅϯ]kb=}'J}mZ iiixw'OQ_`0߻37n!ĮU~7*6IUuK#׆ljzwR;0gu_N̗>IK2)<=[,P&6@soTwzժ^j!'i=A!Hd_8n+훂'F.>B@J ڻPJe]s=w?Ckۉ]pO:p衇nGќ@/b{駟~0ʬ] JM:KTY { 7.mZ xJ;];sgXe~V^MR7grOa[EQ@ m_&Q.,\-B!Ď{{R۶]ĞV@vi˅v}'No{{cGjժAK} 5eNw1bI"Nj液Nrp^| wR 1`.i`*(`zk $h[ouv xgfFvVYYɂ M߸qcO*&}\P OM1k0|R۷_f>->}1:4[!Xsa ekϱ1m}??-|{bnWe1,3 B}Q)z1o;>XRKvPJ][3g|fZkk+}Ea8l^1I;k/iaruwpߘCs3v|+Ui-^Haq\t=Z s_x]TX8 YE':DӒBa2`_)J)8kIZkKzřv s s=?ضZh"ϟς imm{gLu29o(DA({M Ű[lK2xUV|_TN\Z|Ρ)y6jL+ek=s63x6c.buن+ !I,eR̈́SZ/]$ER|ML۾oSQQau*&YL$I"QZ5e6ΆhzwZʖ(E:&epF]b.,k?.}/8hp $s2b( T·?}Z8lLg?)"ϸ͋*ROځô^:$hW6``s:dggSUU2"1!ɑ~)D_ro#z&mYl߅0gQ hRficL8ܿu5|G:&|XE'Pb2ڷ42=B! `_AJc׻<+S,ҵN4p"sZ2&;E" 4-S&*j4EFIiqiGZApۘeq|EeemDzc&DS;0+B!Rx}fdR* P=0VkE ڿJڵ;S@Թ>/!c LtRNuu;:cһ:A ǧwTjlDZ ƾQHQkf7GTRVHF63ٕ3gO]I-w5pnC֪ !D46YޛߙK>u>@=_ҋ3R"3-'Bj^$hگlZ?Bx|^7Sn&#B75ey\;/^ R:a{!);?3N+B!z3bE)*WJ&AZEZihxꗣ3-~^|M^|҅[e5*I},4m?e=bEl%!"x}`bܭ@pKָ8 Hvt:^|{0MX!Ӿ)KU/(qI`Psb'@ 3n^!#Þ[?:,+!ZGx!J]Zlي,"A5V //Ko-[BskWȵ1ڨ:aƕ{~%Nge0uy ydžwݳ<.JgKZB>3-xxZK-[E$hu]>WZ5>NB(zbY k~WoL$Gk2|F2RCRw)fw A{|,|>:d^|~/ _Ysa-j`%dXppmwc=U/{ !I\/z#: pnƛqQn*𿝾45yƷ}RT|`hR(G ic{6|gU< 4B!v /y&;=D8ZGp¨xn!\hBnfO="JtM5V.soWVCj#/渭A!H[Ύ=ؿ޳hM1%A{iZZZ|\)5@)uR`3z-'|nJ䎑"^TcWNrHh5Sh19/`~M@UΨ* B!z@,N7X {{J* N|jI^t(>ΆOr_n^z+ƗQB!D/&ǮZV,($hO]>RP3y} xWSFB!^Tkb"!"a]WedRϢ ړ;}~,Rɼ{ÂB ,'9:ԪiZh|8^֜WcFd> e+B!R5pA4h_Z6s>HОĴYRj44B)u9x%?!DqL>c^+2&;xU8hgyGfnkkGzxZ*7|κ͝I߅;޼̏D%{l0ͼ;{}{ tJz^)LV{#i]I@?VudVv_Y{R*μbaA;]i\~H4,,ZصIXRJ °z_yA'˿Vի? `^1%,ag }K؉Sk's4aWJ)54gw@Af#^ma^wOSJ2 DGѦk5z_n1_ϊUP/02w|;i\ŏMbZRjP 9YDD s48(=(=JTrG3.w4tܚK-3>/laUtJ5],YAyY׊=@WٕRJ Y9$";_sa']iv @Dp3tR* E^:<Ƣ); ΓpfM+gu$E'ePzX}jzf&J)ftDdp?]iW#"Wq s9(=ىcb N)oZXw}ڒQpT:>1鋏MtNj_lvn*<:I"AϦ7vAf/J0˧=J)T9¾ ym p1 /W ckn-4 p6wJ%'[Yu|m1I$U&B0&~Ɣ")}bɌ -^-" ]eWJ)5h |vK;O=Ƙs ,iҮ>GD+ݚ53ֹ(x\JF6]aZwәxTXqP w8ZrF&!(wBZwҲ8Ddž00]I@LRJHDڄ$2f&:RI+0^t ÁcL-M go2<ռef7ў J%kά⁖dbyTšK- 2{yIt^6^jsi=(oXt-RJ)CXw,"zS]XOv刈J72J&zRlni0vH0\_frWS_Bޡi>DkKCl}3Onrl:E'g+_sZ4iW&"O{\8o7QNE誻R [pEx$$nO_$RM+Ʉ,ml;/w#cf2#͐e'RJ nm, ] #cL/%MUH>DeC4qe&R/5'ҹ%#b{P*X@_]P kNw^2<%$]~'@}o/}R#ʡ mER%mNSeƘ*#K[1 `,kaKcWJJS듞(`ګE}wn wߟg {!SXwe%mZSI˒PšR_ 9h *JrT|1Oz1wsOb>Tߨz 6йo3d1g}j yY|3h}Q|zR-9ayY>`.+̶W:$"Àֽd[ƘMڕk{aR 1~@*49pEJ) nhfn f CbOI.b?GϫOdG%$4Ƹ7IILSY{w(J)s}A"2ջ&S"pjc\.t`7)BW}[rG3yқw ŧe2gsKS+w O~}jHaɵT?P>')r;+s Z؎oDiOcN4IXW{\H|m7Q H=BT@]| IDAT;yڿ9*f 9wH6n>9ڿ9/r|,>Tᓣiz㇢3P>J)5@t[,"Á; &S"r'  XҙD[Jк8D]5aM@T }rӓIWRh]P ˄"85y ø4ؕܯ2/s_RJ)o MڕDd K@1&2Js9!R}"Tf j'=[H1wDX*ZzgH&i}3)IR#E]4-VBU''3>o,RS,d Ѥ]BD81u.tU^ͩR_f153!Ǧ3B" 7DX~@-bO؃° zV&)#gvo6"+0"YZ*R ^dÀӌ12MU,Ƙ ZVJ hO.^1Է& VM+HJd9$k2Ɵ7P` eRJm RJ9s DY0mXOkT_nER6D_7رwz$cNسJa'%=ϓ{ߛϬ%%yjlxRJMNȱlK\=iҮ"2d'>%@bsJvWt>{[rgsLsHrvƴd<lͷ6Q~+TX؎kHpWKոHMU2Ƽ\ vN ;baSJ)<!!]ngk.痂#ҘA13ع:TRs7Y؋] x=SQL&cL}X׀ XSJ N]5֞Sj;H.qȭ"U'`:da )9=v.m\3)fqƅ"l+T[r{_?hyڛmDUwȀ1ǵ<`ιqDEJc Ts#әמ]G- Lz!;K=e`5<렂!/!sw+J)|ExN "IDsNxt]+cLv {:`okE7Zk.OԠQb=)?{+{}#vgJD` ŤR*Ēc4a5]iWqEDr!_~dt3gxP)UйYeX@I$őVâtlpwZwU8չ%ҹt~˿O|o͟X<'dHgRʑp_7ݶzIv~N'"t {}CR T>+{0'+ Zp#:O]jWN{JRJY۳ź&*:xG,ljAlJn29]Y[sI-,N^e6OwPZ&J)Տ>aYDnyț=M%~C Hcg]F;!̣kά~2""fjEY|imf-*aĥو uxFoݤߊtn֤])Nb,Q>6hҮ)RE"r, x|R*5A=ͻ~v?E[4/tpmr>:&U.3[LSٰv~=}NvάWJ)+Xow 07j_h>]„/ߪ]glzoҟ BMtdv܄`{yᠹ\ڕRoaf1mD+_3Ƭ zND`L?]Ƙ/PF!D**PgaϬym~Q߬wGXј3Gе, ZZ k&8hTXw~= ov8H&<\Ч%>vW<9_u$yU>,&k7iidJZ:PdO oRC+Ni"79ۏ&j:Xu0? "-w5|ז5S~:09ַ bY5@dc51=3\V[Xwj$ѻU]9ɮ;+ڥπK}V~ :0I1K=kwu^ >8X|J F~ȺY:\uԻ=/ae %n;aZTL.Wݻ` ,ݽnWTW!z|RJ)n۶t@^Ӥ] ZƘ1:`$0ϟ)Ww[Lv|9XeannkYb ]XOW]Ը d-藣'ӼKڷJt1%nս˾Z6i{8柳6SJ)qW{msgsASiy"r2_Hy-V B`?S"Vj`2!ç~,tEf _vEX{v.wḽM찳]5)o3y2ܭb~UpKD2j;$`RJYv˱/tp1Fs}+"Myg=f+0 (<L-B%!έt}tX'1bY7ΛV9_뛒5]>Ʒw*m\̧6 '>^@ RJz>1 Dd8Pgi(&Үc^2.0P0O=!L~_v`u/ObE3w.VXEǸ;^)ԗΏucfM(%1HCc:\^FsD;nNuNgjeQ Lz7us*m_; a?<5Uw1Ot/V&Cm誉h7E Iyy DƴdZ¯Jg[صNuWc!&%<^)D<` c̿QFi p5p9M BX4?ߛOə^'Uoe}4kaå|w'ꡤ뛏ǮSvccCQAN!4IYRJi Nρ_^da/IR.Ⱦ=.=\bit3_suAxJ%G[1e@W]oQ|J&1]fuԿC~' |{+/Q~o3ov`<ܸ1=2(>9bݑ UT ,`"Ƙ+N&J "{owyp1#7sQ Z]P<̚s} 3_/pB9kvF cj2Wf3OK%?J$VM-7Q~Oܐd4]gRKkaI&z߻uq)5,:8cW)1(HGn細Cu˜T*$ 2/L!)+)fGc{`֏B]﷒2ozwzI$Ӱfƫ}OLP6WŊWz9Mػ}Wޤ {Ҥ])137^: u>Iҙq CB<3f$3b N:Kzk)#L& N "ۦM`87:Xo\MGӀQ)5(]pr ޓTiyR11ngÀriDύ9PL۪.k~uۭ Taeٌ2I]5Ir(_sKgQ7w{ݽn0lͿm%I0,F%Kdo؎]||d wU;edGT{vӤ])`hKMuܪDu)pL4YԽN.}. M"{^ yHisoXLdJf’^6z{ӬT[)#/f9=PJ)hrIq[1IR>ہlcq;gB{wcR}$nEH Gmq m[Y7~Cd=cWD+Ot&}N&=Ugg+,ǜ $S /Mڕ v_2:o}cK)̺ {`NJ~@*ºuT?UAf/J0+UG[ڸڿD0')>UJN=.c K9IR>DrQ*|& ؔRD Ǘ;Zm/i*B`6֞SG;j#L:ѿ=(@ Eh0#"=19:q/5![I՛o1,rLC\:j_l)a{G^[ga@حƘ KIRDDWgQ:x8(Req{UbB~W!?x׹9ҽ*,%o1\2'{YT:&_uwn=@2p~\%]u@GF`m,"~,N7ƴzrGvdmG_ 3[YnSJƟ7闍Ǎ<7UHa>U4<o/:w?lFߔqT *cɻR&J394s1+cR~u(U37s_w~=[liRdWPͰzmq5~y =wA9aAݓGQ^~}pIRq@Dr}Ƙ=c2Jȋ5NTUGX: md&=^@ޕ{Nj6?1so=U:{%=Wد rk8 ׇ;H*UwA3Ѳ NH۶k${NMڕS݉<_Ƙn*t8p-TJ֥!}pے,^͈rHUEX5'7Bcc2 Laas2HDJKM㐮+1M\z˼v}4ѮmUJS.xxu#Z ͯw=~O*a _,$TG1rN[ kNu^ =1J)]4avk4iW*c1g=;3fST^̧;2*&upa|8W6й%3¦h_ȴC}s|@0oCSh_{d|O+哷߻mwc^&$-W*0<Oc\ݹQz ђbSJ,T#kh^>uIK,R<{0+'%ml3?,-e*i]3'3b$ſc`/J0bJp, { Ddcػ7RjW-"Lba?GtIcSJ,$7(9-soic+dnlOݭheӍMv ' >af RH0gױJLx$ׄ=jX}$ IDAT[vse, ;13M+D`ڀ1t;gGCc O)Շjmc͏T:}J2GwHR L0 'p~Rzmj_h㓣kv,Y6n݅lIZ\B {Qj/{e}1F%MڕJ`"; 0fcLL](~)O~_{n=w;O3$3$onneLKfž&ō`~U9PfXdUv|N,~A[*%pM0㿉<0,Z%M| ŒwɚUq_ t褝i3,UjlS ѿ""pdVcLT]J2ƴc.fe=\0 x8 R}9 surжW 7vZ'@i C49ww4U޾uɵ||x5|mUI>"(@ns:HDN`[g>+J `"2?p nCR"TJeQ/JJ. 0$>i_y RMޭ9']iWj}ׁ;1K[FTJ7:t}# {^xL:=[|=4bј{J0w`$l|x.Ϩ`0\ׄ7ۙqIZZB0S+yq"28XhyTФ]O0)y(n]J). fh%^ 0xVK4Ur qu&hx^+"]eWDMڕ]Ht/ƘZ/.t?!>R*AtG~ZХ7&![pl1Fji惊ZX:_г2wOCAj B/MڕDdO`?Mċn(tcR }MϴQBw.n )S+Np|IgaM ^>`\)E^D`1f7J b"R ,D$<v}!5`a*H$F^s0ߟϐg= {|C G؀\`%YJ{k+p}80LR%8]iWjb=} eqաtEA+B4INt2lN,~WVb2$e!VRGη?LiPuNS{\:OϢRBv99 HqƘccyDMeൠp3]/fS1Lj g4F"2gEɀЯTY ia;*7o1hO#SB?i1wz\u^ ]`(QJ ^(aO +y)17lMؕG# {9=&$V)1f%p$pnbfawXW=D)k-ΟeŞtSa3؎[Inl8mꅛ-E.>OtƘ@IR cL7cƘ=cDIDtw#udکrwK!(&Ɔ+XwK,*v`Ѿ@cj1{c&>EvԮd3ȃ"xxRj1]"֏BlѓZXg%uIR*aevTvSJ튵ӀHd"`.p-LRޡ$u40>Γft3dmdJZǺR.2."svn4iWJʕY@SkӁZ! :`O`al)" :;MyͿiy? y-KB,ݫW5b:u])>&ለ FXtxfVz=WH_0kήg&1|rR [o;("-Ƙއ♮+:,cD \%CMi<4 dC\bAU9p."A.EdaxIRW"\'aD7sYksfςTJ%I y9i/R~w3o(`]?s2b(u'`_JʼnuD_ M}0+[ࣟJ)cj1mRbn Aeb/{1R*H_h_7Ѿ˧[-4,> v]H`ғLK!%~R|rV!eWݗ  tCs1"M/TJŃa=X*"la  6TqY6icxMPJqIoqRi^QB AZM%J|+ g=^gH -ǁ1Ʀ qzՍls`ٹ)KuDt|TB8R١1;"2DsDɻR})}J2-@\,wbpd79Užwp&J1 {0ǥ_j®Ҥ])V=^>}LfaX'xR|' (pu'c`mM,XN-{>`0|"RJncځ;%J+1fq˩kaH\GcG)?N`}˅"9%WPìc~G(ǮOζ]7}{1[;Ԁ{ڕR CDRvpc;^]F}/SJZY}z3{ݒ(q&'gT|z*U4 ;+ IR*H04OƘun-4 p|DR5'GU{{ U(8:3Z*rle%I!*J`]d Nlc}L +Y B Ƙ(=x]J)ⓣ]eBWR=0ȚShj9]5L+fR nw^d`0Ƙx4iWJ "d17Q 1ZLTˆ]Tm0`6!qIK"m\qIJ ߏ߫Ye92 -W'u:HD~NtVc^.,5hҮD<=ce2J2Ro5gyR.+}: !^ZBx-WD⫝̸ @reƘNSDvYQJ)1w{Kz\Nu^ 5e)R t|24zt C:WcGߘ R4av .MhҮ01~ppZ|`s*\`|1?ۡ7_Oy@vY }Jy ic7ċ^.-WJ "2yƘ C|*8 T<+\%;o*,v>Vqta'*R>%Z_v`1.,5PiҮD~vJcN@e$o"TJH652KJH_Rn1,ZNưcne%>DN ࡫DJbUEq3m[>PJ%@0,v_5ݞ-${74Jس0"Mؕnieb&a|tR+JABD%u/Y{SbG)?VjkUOwYKkX4>-*ZTL]YAVTaĥٔ^tK=Ѳ-NL, SQHvԠ""-k*NcܵeTZ@0RyA'5϶Qһ'ʾj|rq++Òs1- 瓵חV#"ADOXl&f5xiҮD$4ƴ6 ,aDWݧ{R߄4N?o9 ߎ- C,y=Sn1 ڥuճ/\ $r}nN\ ǥ1W:X j+ "~ly\eWںY)ȪP熒1]ڕƷ;X$ JĄ J @0Hh2/fc]-mDRQC&cWDaI!;fawZW-[]J}M:/va&JBհԺ&mtlJ_@2rӄ[> rCvz~e{]skGiRS-ϣHWa(5lYC{ۚxdE"eN;l"i"GAU1s:)>s8xf1a@)YO0fAd$ѽafw\afgީ*(U oa4.KJ*z)u,0( [4o>i]MBFavb!cRlV.1v0"8h \T?ΕT4.ca,eG wJ>m7mNOVDp=yFG8U}t #oBU'zf("-"]⎛ 8A:`SrlFg񷺮zF~|V9v5]`T"$DdOf%cJaFtYNjȡ 9'̷jf欰F>zx߾\ ]`촴Rd q:Ѹ10 #:;OȠbJ\ y4a0xVGqa99Jl;o6C SN~ MOD:CrhܘnCCu+eomsyd*E|kbu%sEg쌔q܄ꫯ8yq{w ݧߔ$FŔv0dU8WY U :^&5Y5ى5qJ0P5'^86[^vǜOrceԯa٘"~q? /d633Ջ>;vV9:/o”v0{xDD3YWp3^ϔ x+~Ffu7cxgQ5 #.R;fZ-'cƌo߾y̞V4i™gg}:X a Ul<\zI)ArW`V1c,U'N/г`bm:NǒYf40jחpΌj0'_clWUUŝwɆnȰa2UTT0l0yV^9N0aJaFQiz7p%F9N|(jܾϟɂdtRv .2wxp ie :2V+Z3ыt}e&Mb_8vW_q) "wFLLi7 èT%U=ZURե"r<'"'H7l$HNJ8db9|gϞvm:uc,aVwèNVҴp ŏ=F..*nСC` {JL-sD=z>FDLi7 è!Dd=`?~`YX Y_n㣻7rK IDATmڔznj2zLɬQ]ӂma.SY{thHzl.YfqiQYYɗ_~qo߾|g 80lu\҉ a3BDv-f_$ekE3Y01z;6liy :tiyKj?i,ff=èVf9o"v#0dfa kFqmcDžG}Ħn%\y\~q)s$천0`JaF ݀Q !\~; 9YwuꪫΝ 'G '3yElFnh-E4eg=n4.̬b93p,*y F%W0E?5p3si}.U ;7w40j·]ЯeI4v10&Xo={La7j a#D9p=_U뀋saO,-;>}hѢH;ԒGt0Mz~t&Uϵ^FwI+ڍb`Os5~`,#_T0 aJaF=BDR^Eoe.]0~x:w %Kj5jT$zJ5"0jf~tf Z&iu p}%H[:\Jzuu gQ1x0e@u5A-Un ;` a!Z݌tiڶ|ڙn4㶙DUYwsga:fi7 èG.%SQ蜵S}ݗ~iow̟??;kF#>Xè̟٭iF1]inbA:A8D=ppXF\nQPǕ_=8L:;v{]Z㎋7m+5dyS Ӫ{36z k ^C7-o %8X8F nQQ8}3;[֭wM"|ծ@5-0<]OjKq+ѱhr۔q0azܹs#ܶ-F}dsx MMl4hm$?IDZ?+FK3q l U&)Dd_`_!"8\.l VՏ%Q]#r~CUIyJ`9B ;8= 'Ya ֺ!a5ˊǶecڢ=Yp)F]llYz_Uvvf vr&&~ͭ0{.޸ؐshP_?7qڥ 6L/Ykk>|xQ^0jS؍w*0 <M*(̀py /7|z5p,BܼJ:rDKkrswp )gM(KѨ 8w ŋha~Kf$\ Dd8|!Po• K*(aQ?$"E2rb) 0SXa ܚA(nfaQBH{}QY:3raJaFca c}^$&H^?aFDM|~7㶎tt"c0 q* AR+U8&Hu/(`a20n'81P5\U.PQ4q?QMa1Pɪ8' | $AT0 swBBè4SZtf{Wk\ɥ$"~qQkY3wT"kl uEb=JUjAX| |3Jw߀o7V'"Xw͋iUw,"kyUZIDX˱ ΅OsU-*JnM͡?K3;ZReOwmWHgaXX㎛ 9qe0 0O^dߠN, "s^-Xܷ"=o a ?8kq_8̠`U%":&hpsV;"7\Ԝ| 8<noH\>_쪪giEqjZcll<ŹοrFzQgE=Ŋ{`>p)nΏ~ـ' U:"~8{s<[ oFξ^-; K*xٺla$_/4)a0j=2B^?U8*ԾVDN%\MaPGɴsE?n/z>ߩz#|GtNZFaPS8(+BoY.PջUSUoI8%,EK"LNăd*엨9aW]US#YKAD-w^9K<&"s weSp׊Lεqs(5V.5N ̡mHU깸);O{ToR: /502=С J7A\sX9u 0F/>"2 QהupJ'9?SBSeED:7~38'"] )u!X^)z%P gVO)6)"gad2SA\`ɴȍSs5[Φz-)nǹi<ꭷ:-ʛ$;08%SpWa'uqY8CUqa2sDZ#P5 "+ޫlܖFG,o*uɪp=:ah81A2;mq}sa;>g6+^A Z~ZiA s "!s TSAϙCU ggD{q:_ ]ɡrcUBJADz\S|E?uZ[;oʫl7.-Cp[;-["+ tkXvPIUT1UVUw QE$_Ĝ$H~9s0 0rW 7[qR,KvQ9TYBf }"ҿ$'B:aa 7l",U0j=>^ \듎2 .َyYH:uKp|1)FQYmO\ Hpr~aK䬭kNէ~B5{# uJ)̀33E3`(0jqspQY*^ ϡi1XҞUU9c -XTTIWR n+ 2 0K 'E]ߩbuGFM| c8 %-DX Fs>=h,lY/՝;6>aP% ̼R՟D.æÛ׈8\JADR qy/1(PW|A*=Ib 3k%iaK&gsF)M+*}  }J⨚-/^.%FIfJ8d]P|pv!s @P܈7^͖ND<j0ԋGȭ8φ"ҪP\$H>XIk,0 h e10< YiP~!HM#"{Z_˄Szcu @lTuNe_+/} ʲ["k9kȡdoħի/P= XvTS`2(1ArG%e_{a $n{_zCU.XQ;Ե@t$2Ry#ʧ3~1i[ a +Uj_\\ԃ@] 9tV=Saߩk#pnMW^`U@ Œa q;<  hJX`A܄"rkr UF(7z.h8N)e:Mx/}]:jS FPcPe-O-ArH j*K0 qzdԌA,OV }#"r "WCDB:EUF5_z-2(P|ұ"rW7s[HKBmBxG?W~K{jA@wuj/,I`ݫ{5xTA`723H*$H>v4 0<&H>]D L|S=44XP|\{%d0S`<L:jУ,N8BDZE;qh"nQ)毪UK(1h_ *-E$=NWx2T+sQ=p,q$''HsHa ?SL:tq Е'ȴB""Q^O |\>l\ MTD%qo|OeؤDUsJ8*bcsmq`JeZY"T.h檯I#s`ɛBLDz;UTU꺪zR0Á'"zŌ naQ8#Aش)/9UuAƆQhJv"._?SկOjaX|G>eWDv^⣪CUa<DdmKip!ͮ(/"[ҨK6$OsDu1W TQy!T)۽쏋l_PoqS^ε/CĹ  95AP@rP4 0<$(۽:2FmID:i]?ԤObͅ-*b-D$ey?>k~<ݸE=DpUͰ&(WpAJFDVŰҹN{z؈>l M:5'"r#"]\&k$0GɎ"H#"kb3JU'ۇ˗o#qn}q9;Ο AZ+^HGvo&")A ``r nnf#xUD.TՑ^|>弿/ |*"/2,[8eF9uOq{̷|Ig}ϟ'EޫJmg\-pQk>0Zg%pp쩪m#IZI; iaT3ӁKDUǗAèH>\j<"xŠp1 bq @Җ{|.,Ks|3" "+zO꡾8Ŵoj`tY # IGx7w~Gq Ev\+Kdw_Lzip  K1]U;q_v 2o@Հ̝G\@H/L]g"@`N^>C?zL) 8;bHx+P܂HkkG:r{Y)O~AD8ZU}Gs^;fCq sDU%1#""dz}|G}p^7%caF}Gvm:d2:E!W;1ƛS #9)9JK},oOU6?xλfD~ Wo?g 펳jYpUUu"̑]>Y][U {*Aȗpۧ|AO/X!9Tg tE{לTuʿc@F_ܠrR++ IDATwa> w})h\`qw1aB>dT"3wL2p[h^}H3sHD MyV /TRp77 0&/6DDNV.a!Z2>5j}| 62:w]P":k{Xh[FM!"mq8e}"5~!bUp.ٕ6n{,'Vwy +Uŧg1o蘔2+9jaF2 ]6[Ur guFau q~J*:/aQ H|p4~kۤTvh S 0:Ÿ@PIŮ8O0 x-A2J\ |&UTeu0 è׼ X&XeT$e0 èyfC0%cuau񳪮^ؕT(ҽԱ 0X @E\fCFCǔv0 N#"RX^\(Tn4~aϛ ԶQ00 èD\-QŌSIv\v0 zSm b naW.}#"3H@/5|a.(Fa \BF}v0 )y]]$J<aKy tI߁I"ұ܂F} 0zt JUG;n%@%4 0@ q:j@{_5QU-x(1KaQ/Q߀Jyz!0q$'H^_aqv v$a;na{DdM`w`]q+h 8+0 È{  Xe0a i 04$/ ܂x:DUgS8èOna4HD/AgxU_1UR"ya4hM0)aFDDBPNj8{3 h|l ii4 X :0 ÁCۗ2nh` \;0 #|`@\]D:ȍ"r7a0KaѠEh 짪r]IEOսO93 h ysN"/^הW,è0 hШcTE("[3vX`+܂HlQo ."GV3 cv0 ""ov8[U,fJ*6,ta& _$"+_߀Tuz3zKTEdoTGkR0]XX X LELԢxuX7P58JU(fJ*VKhQo8A򆸝D ࿁TuX2O}U/q.U=&OsfmcD) ~X"ùgtZ$~COU\ʸTo]8aQV Kvaq0;Ui߂PaSs "{/kM2"r"p_~Y[ygwc8cgf#"+}U/J*gmJ0  Y;[< cYնŠH32vT=,eSڍd?""7 B`sU6QY#TW`r^IK`rkQǸ@U+0-VPre4l=>?RS<u=^Ru"DbM-auρbwDCֆa޸x8x8 FRՑ+NFDΥc@U,;k|Q 𰈼""$AR$z#,aFm86ArqN"NxEDWpѐ0UO۞!#PUG˵-ʓs5TTjaY;0ZDz: 98]lau cw'`QS 0'kjC>^gy/ ou Q?d3"@Kf10 ~4T@ "/`0 $N,u<0b1-~Q}/ |V a3z6ǹT_Zd8YXZMI@W4`2%"R/ t. =H+Ӧ5 xKU(ᬊ| |m~苻?Zqsf~_o[=6{\s_s]>e2}UU;n9ֶk+-)ۥkYWsE^X?U9Q]pgڞQpV՝L>P՟kQjCUgNJqyKQY |#"ArH%R*Q. 0&HEcY{922yEny8e"O ltl\<[x;9O֋p|s4[ <\#2sEyߗ+"r pnTrkGPDY8l(pO˗k]s~WUu&[~wT5Ep2=UY ;W٪\W]ס@Y 2fpp.8>+dمjV"

uAiJ+@w_7O-%3ժzE*.Š} 6VURq8\dU}'qI$0gN)rH=tgA5o25{eܢ3n/ߝccȣ'6DBUnh?g2wY6%_D, رvSSUP偧pJ$薇 &ʗ:'Ԯ .н&Tu@#CS¨NǞ)HAiJ{>Syk_O;T,c S}p<g } i NAH_U=$5o~=g~wpXEiq_ͥYv;uU5Kj~Ff`a:)Ю 7g@Zi?EUV࢖C]D-дU]k-qs3Psޘed.6|'Y8?8oԢf8*Yh98ς'EdS5bMe6]D:^ 瑑ܽfrV_@߅Dzk.Jy{уzB)VRq80Ma5?$/m! 1T7R in{9˩`HrU&ϸ{r)nU򴏥{7Q8#uUuzMqV-| W}"5NIÿo\\J{ 8+E~kcgͅJW>`[s7pjodƓ=~m˸ "lxH{TQ Y8pU}-K{I[?-+fߓ^(g]cU'd/T(3<{a7F@UkɉE2%"H+7{Op#pi%svϵ@]|IZag |;BITV9s): 4EOlmEdC2V pTuge9]Ű[MBCT^ɦsxHњ16bϹ"' Yr[,y 2 <<~'. I y .ri*`@ {ܻ8oA6h_7 |^ջNO$Ӎ.UaܠkyS2]LFDZA+\ձ/g SU-]+Xu*W=dkD]Ut _˹?T$p B}R>@0(U\L+%ɡ1UPmHG[b-R%H-,0 l,[>aRKpSlq#K:R6.H}$撎My6 [~Y[.K8{pw*V8o1dkl*ǹpۖ82Jy$֜#TD[1Ɯ .z|S j@jIsgeY.i?珪%O?qrސi(ܤs2.9wV #Arpd%Ou+0 #.$E}SQ BetKбp Qϕ k9Rބe:+<ᱡnJz\T\jMTk[Tp蚠1os`nQ"2trSɦvƭ"YL,Ž8e-*NX^\0 p `=Qgq6m*9 B%)ax9/>kYx6N#K_/",+A2J O6fF*"OS{, GΉ4E):FCt<7cE"/6H_w/j4Fc{@D̹ ߧYġW#GgV ϟJPu瀿6 U*G5dܽ{- qbD&Arv)mnŤ4 qq_"]Kf [$ab܋*<*qlp}yyV/#`м-D$2qȞa2-G4IQ?Wp"YD" Sj݁#v?&T~X9O&"^};qspGU2TQ#+7t+"9=^ԽkʣU5PL gkpCPU/6\[$-݅Y E=,=1 #H6r}A>Y@y?wZ}` URTկqQSaucR ?1[GpAp}|b".mj bd@U']QE]E$"9$ E_.8pkuUl }E$lAFX|"M9]@ٌ~`QU|U)X/"gHBD]Qc 97A }5 p|"8\ |(_&"um8L):|?7S< "Υd.<2="t/𠏃Q,b[mjlF|r|ODVVՌ^> M7U͚YUG}|#A+'OCczkni%|Ecq{[CEd pf288cT5W?xT|^>T5_$0>pC {_hϘ"Rmh"('o!`"64.1ōc-fe skL~r&GErQ.ܩ}RWo)qsne\D$iU]ď2p:m7U hrzN{ȕŴpn}p[<ƹb<@U `xQ*w^cgi,8sCyH;2=XDV 4-u?ű3[UU_qϘ9DUZ9EnРL~f "+b+2c^ucpS="!pm+HDླྀ6tŖyZ= ,XW[K=ͧSU5'Ͻ|n%yQU w {Pi/BhP%t)(U.H tAtD:HG R(!!s';;[y;9;3;;1 H.pgpx+x{8PHq IDATA"RD~@̽=r^S"sLѼD6^VO㱲Ba/`;R8'7t𹪦&D ÁcS0/"YGjRP}<)K gjÄ{aAXk+"bM~r_"3>rŎky V1 {j2`O]INK&"ScǯUQ],XU=5܋b1q%x2gu,b*5cZ]쐲{ :NQDd|X7)nܗlʪ:2e17b͓ kSQDjj1K'Tu0fAs$yUUgED6BV >`ρjѢRjET?xOU )k)"c3%vrp,-}yؾt"HjkQՍZ\*uqϖ%u:,e= ^v6Ş-ɘܩXk+Vy ˪zp37]k;L `W칗|Ǽ0i/"=ZX,9H.<%NPDDNchNoѪzfswұIgpUys`ZGe.Yc|S,Ks{ಽ,P1SQB~C<뒘{~^79 N=e(¹ZXS> N;uKcq  νB;cݸx= TVQ'}}?$!`q90Twq Lab"}3eBn}}`TE8t- s0 XDy|A"6Pb:@U-8U韄cMY~BT.ﰈN:YDuo\qa9*IVs~w"":"xHVHv{?g'Q8NẼ {`W* ;;NJ}6Ô?7cxrq.D, ܝ(%coq>,L3,i,ω8݀+X7KGL;3^vqG(*Vb1bFcDyqX q6(gN"Xiϫ8N6 Ѫpb9Wqg ";QikU=y;X<㴅JsyՈXݠnVpdó;8@U=(lY':8 {R* ʼn8N^88 YofƍT/1E8NKZ}A"2#NR q\qq:*43oX_M)8fW(8MvqqB%+ q| +Q""ꊂ 88X kD-`Sr'w)뮰;NvqqP_cc 2g(Vke.q21[(˅%"? 8-8LCD~e?FU_(jN:(jNqثD9LXc\Uop4+84DD>43O'[(8pOrkJU.N,qZŕvqq""W{ρK{cl`Btͧ*%$"/3׀U˂s5 DdI#Tq(Dd3VUkb \ l%"۪y'+Qx[$ TϫvOqqzݪ2πׁTubwi:5 Uݢ8NEDf\ϷP+R-dI@Yk;if6t\Ӣ3DMZ*B qEd}*g.VՃN&Dd#asNcU6f`h,K7Eqމ 6Km8Xc_}l__xX[U՘N:۷: >6z֘!6UZdFw*ƚ>TNnD``0cSU/8p>㮹w=%OoCD5=O?ѻ%tvp']g+s{VBFTu\MD, <%"{ȼs(ICs3yĐ 0*^$qtu U|8Uw DnL2#q4=,?SUu\w靨ꇪzK8mŋzkΐ|#˃n‘)pؼTUq _Ԙ{ΓALȬxs6x8FU8oj7YSdx 8DU3eOkCU јғbUU731B@-FnP's쏝,o71ٜٷU!"2BƁE0vw,yuD}Gԑu'eMUMf l Pg)"S ,]o"=X#E-0NvL9UfwUM1g4PmDd7j(ߢ;)2Ee`f{;_A9No%M Dd_`GvUPi+,b/c0zw[D/6d"1v"rpOZYEdo@Gh0z5 TDSզJZ,{E$Umە,}H1 xY066Ses&%cLY] ~ RDUHXe;'QhR?1%bΪ"r;~ٺu{D܄e/<2[ȎUe@Dcnƚžo`nbߧn%cϿ`"27XWDTS*JD0U D%ʼn8/}UTqBdD/Y@AaYtƉ:!XŁkiǸ0 s("GgPM/l^(={y?N*ax!h,QqAY.:r U}1o)tXLU=IK LuMUsy 0klڥ~rf6iki'$6lȌ%Aֈߨjv?R"N5kؾu17Զ2ԓcMˇ<.N\S/b iB K{}OkTRd8ףcI7ذ 7g\8S(bs=ME:v+"C1yrK }om,670컝F~&U)=F;mZη`=W_6ꘔ+b 3\+Ed3(=;@)`O\{=̃eWNt~#iir}ƾ#sc5OжEN31JUieN:fers>%]ީLcK؋dNѾSbcw }BQ߄< 8$ZwTlX=9盘,AZϛfߐj|1 \.BaS"`dIQ"])aꈸҤCH¦ؘ߅Lb!*į_C} p]UR}'u_")/`]p;SHU9?oM)SUuRUՋT_/S rl{4=p)Ջ%^&O2„:秖`G)#Śv}~QQMSqb~#~ k;&ge<> BD;8}iUCuH5"2嵙Z.jG<`%XS5;1 MD` `VFcjX}UU)\\ܤ1HU_scؙjX(=j鑒Q Us ,y)\>l ߈TzRk0+kġ"7>=}LKjvleX˰kq\s$s 4k4&RoޟqY&M 8'N-$nl/" Oܔ(?\H=ۙ-^D <[A6qdɷdRDk ӷZ3YlQ;;s<w!GDn S6ZlLP5)^`[iAd zVmDV>U}'""]2@#'c ,b7OW7$EBo/"8a^pIjĪŰ9^8iG{<"iIFpg^|%kZ !,'>k37[b۳V4AD,埉9(%_(}lUpBMy;EXUqZJiW˘bS l>(kJ^'8gVi& 5cFG$ZBҮR*CĢY tg3u\gR<Hޜ?/,vTFrNaxU=Il:JU_< BuBv%,ymO4pLYY^F߳ϲWK;z3xDdݣg=XhEnoŀQ1ia6 OlwrZe3xzlZ!,(Q~ X s+S`.DdG-W#8};3Rdsd2X{sե> `n{q=yb/qu.[c/('v/w`Bkn~>,DrwNb_PգQ&j S]emP="%xfg.,"K"2${nũ8٢ +b ~Y ŗFϿsk+9,/% rƲ*7%_(-7 rd-gߣ0q0i 5Xo|9kz>K@=ȶ&-&"jJc,PY"7?BU-T`;$EI+M_u9NCwdBY0(yL˦G򞘜HvqyMM>ɼ2+` uڂᯅdM3q,<M/("skqFYw΍weTs V6o&јk|Ͽv^>dmá:ʕT|gW;X Yqȉ%/7-O}r$tEiW+v_hZK &RF% ̕^jWμ̃YҸ-3]ZcyLuĔvk|s&(Qi dS?lecEdYN[|RyRڒY +乆T+ 2(S %A-EϲBvU""ECU˱n%̛(bWl=W>bI+ziUE6Y;`%WK$N:F`i x+YQEd~`JqG-K(`{}~׏ԔZ-2Kb{V/Y김ߎEVVڣ[c1ac}IҢjHOS{Ed/1kYC~3Gs%?lU3yC4I~LX%|fQp#%OX<mAEiLA:/h_|ɉ>q=r-Gǩ"ޞG섕[UJoDtb<| UQq?T<@.dRы^VviqPODA`CEU;cc .Q%D;e/a_EMTբK.-؁P IDAT.lˑ̔`2!"sۃhv}jޑ#x)mBi6"z5?֜,߯jwvsZr3FS]bq7H>Jӱv_jtv\d&{K, vR5,w[9UI-fa9Zàk=qRQՏV|8=YT'ZDVFmʤK> SDU,Z`Ór~f(7ۉnț5:|sԸ~gپdgW*9eFUy'勸7U7^~_gHkv~r~m/%ƭhED6',|T47u Hk*E_dq=yra2zfޞ`cPO#$}rzU}\U xyGDnf嗀ucd.{(71JޠqTWgdq/Nf{@X8Tu 2PKXz,K&MMyPo3TqwjJe90LDADZQ)OĚq"{[~"FJ*uϩo,/~i};6GoRm ԏ T'$ՓèF)՞Bg8X=}#sNzt:l/%@dO.$` ϵ_K1vND;I7%ʧk.R@ljqVH9к~rEih&k9 TDm7Hrz#XCQ8ˋHdHl~B i/Ϲd{/"d+Y[X'4} Sx&^ 0%ʯGbmS#iѸOiutDN5 "ìHU^c}0c`ac7{7QT3Rd\nr 5R^R̉Z!Ś'cv 쮪՘"*BczbhS8U,("PQJONs-";S;8UGc]Rvߌ]k17}݁&že/o b$waG-^4 / NQTa}vVYVU,DC<8,%b@p4R#ØE1ϑFKKBx&=_U oItXS^9N^*Q>* 9{= Qմ于32)">n7re0v&Nȼ^JW-5[ɕH=6`1lx;;Xĥ8)XQ—'XėĮ(L>+"Kb4JU;v~_j r}V-"‡?˚$x,]0y8q({}<E:Xa9( miaEfq}Riw"IuaŲ88c3`-jC^bL_xAa1z$DK4N8N"K":i'\q(ē\."D,(kE4N\8UGP]WgJVD,"c$}=F2Sq\%C`f',Q~ qfu4^:sIPjtJn~ lv;8NNRݰĶcCE*i4]b(Or@~Uɸأ0xLVDdV+`xyPTJ|Y;8N 6ƨ?c킽#5]R}skǹDq+N[)O`a}V՟t8SADfJpn<o53W'[&yXD6 <\iwJaS$Sc:~3:8=,ĕ/_5;IytMظDײYy `$lh|[U_+Z8q;8@DfnRo \VA"쭪/73W'v.H<)(O;PD걯<҃\iwqɁ܃ 5;g'ahQ<٢Df@YU''8}Wqqr "++$vͬ_6;o's ӳDyߞqt=-88N_BU_xMS8\*)7Et%;EuZ(쁸ɮ;S,a DIlUuۖ2{:ErbbMgTm8cMEqi8))0i%73XDfF'r]v[ 8WU'Td4`tg?{H$"PǚQ#>No@D6Iyq@DSYӀV`[zZq?i?m_8=~-"b5[>:p'J=%H7p0wNvq4|T98VU3O!t XpaZ 8݅g0_887=+Yڔ(?ZN=>ļr!"+"򉈬駸PUwz')qTu^j;;B^Ie1)J,Q> Xok: yy Z,T{:ŕvqqnFU/Vk% YbkMM; X#tA83pqqPb_S%ʓJF1X^,/AQu3#" KSWWT<zDU'M>7[}BUj,|>70 <^<\X`#;pwߣTF"\X̿6}xxxEpTd ܩU{]d'kb Q{_?M[Jo}Vfrg`#JNcS5S'M)2%U2oުA!DdAd'TB%\HCD~\D:)a wM1e$`/LU,XZ+/^س=Ed{U͇,oknaJ"~5c:lq'*楲$G`lEY+ L$f_[! "awGlvpXޭ8qhD,yدUIv%VRphlpU="[PyQU%-dX%4M6TՖȜ a"0EU?J;f^UwA2)߁)s瀵B bk,k/"R"P`9U}=ø0w"p-+,yDUCGXoT]_FU-jBnU=s'&oq6Qkˋ\Hum=UqXTNU58F\iCkÉXxHfkCWoC垮ȁű#XxvSU}ż6ƔcbҞc*wiq#"$p)0;~꼝t ’EǸDyDd`(xHtGGv`ѽ64K V3(`JlյO~y$ = ͸]R* 7Tg,킪!ִlZx,!bPVhI ̍5@Ŋ2"* vUjWCLxV/Ջ_ >m2|kXvۈ#5=](` 5vU@qcy{+" \(O)Q> c|iɅ,-qJ`mZEd `X˪zgz*.Ƭe0E$-4=_RoDds`X-A)oD+iW[F{Bx,3K;:qX|yv ծ4T uDb{xFrgBvԸy {)Q~ [H?hقUrM4ٟ$G8;,H>MelOu`m;ִ\P[&XXzYRդB >qKXs=۰laTgr-t),A i}Sss,gqUb(7f?Jvehy B(qK%9$[E7%ʧc1O(c_+w0p7BUM 8PGe(LVύhHbخa5{. ZdHb; ދ5}%T-k$l%J{s15oq^r@\1cۓjrS^3ϸU*Ϛ!_!w*H<8S$چ҂'a+@ 4F/Vq%[QUJD[ I<"nfN5DU"r7:"zp{N3?+=VAZ*ѼD̊2]#ňYab~LulP, amQ,kMbҊXwǬqr"`ek6ęL%A`,Gb8 -XUyîɵG5Dy*pN'wbnYG(7|+`/j8NtҞZ.JlC$ir).$_]<7S{&Λګ+8FRihEiO~xKHJ8N77"E[Z'`]O(_RTbDrgJ{$3?Cz,J.{Ԫ˽&V,5>-cTǪZ;TYh|KU#w @)FDnr\5l֟5{fWqMhHW<|n:8-R]%9Sqg`u?= nos`V&uYs8d/*ǶܝT 8-4 ""+#j")L;*J,e$%>8s5吤Hfk.h$K޷&ǫ78㴏s%_y')Q~xɾp8DDd5`zgPPuQ`X?ҞG-RHDd%."%#,8 8TJñwܽsS'~w2eꗹ<ړ| -> ъ 8HSړ eUb{=Gp"blHIW!"R Պ;-zgȏ#ȷ W{VUM5&'s:pQv9X6t㰌WZ 508-MX$F%i pWD~K::2>k""7'T,wkuǟIiV]L ^&wc {Wq|MMV~Vd4 7(| b~&QcK_of`y(n%q^H8ՉEvI?.6NlB}E!V6>fc~0bTlXjңPjvҽ,u0:7[$v;?}yFl2l"r| 6_~%sm9K֍^ߢri速Pm > 87Ɗ_2uU/lOcŁZE Ly)l59oű]B xqf3(<{_Lgwh MݨxPUO0fcs|vۣ퀴Ja3yfřZuo~{ckL'xVs+aܬX4cOU'yט5H?1k̇=waz_'`3c(۪{>8AD6Ojaot̏$PԜ~osuYL?t,q,_"8G("rVfU=QqHUڧxЅ0f&̚n˕X1Ef*&owfDȜ007fyo{cWUp>P+)E JI-`ZTIT AJ1 `| DBPh!N| EYj]ƘBQnri.*ҿG8q]8+^i,a̙ I51">x|+󙶈"Aqtig ŋs]p 3:}wYx_GCE#|Ed{O^c.i芈td?&X$ Ҏ˚gfU3m2vwPe}/dΣw}7\pnGN߸?p<:*:X:YO> p$ nfKJ5kXQMct> ,O,\:6e*V37Ӻ5kYc䍋> l}'%?3`⨛$5?qz7]kr~' $\fNHa pfƭQ$侍ng#hoogܵfb}VW?ᢈw%施~ 3~IvihG'r{IY̦HFQeIhxs3wz߲uKyFͬYzfMQM=ח|Tu4NQnMlgwoנs x."FI/ A9nwTS.Noʚ^+G6 &@v^>v=-w6rH;v,/sݭ_47ef[D.A4ELPzo+3$Iq1p+P^ }]fޟq3m˙7~{ǎL0֪c),* 3v@I{!*3o_Ǖ+":;uU@OVX3h3f 3gdժU>P>v0I(i$IR2oV.%"m~<׾7]o~՟%i K$_2%3o+Dx4" y 0Neߠ_Ao&ಶK2jb.IZ"%跖u+">|/ܼ󺂲o6P_ovLA$Ije] sD[ZZxWw^Ϟ=#*x{qfn).ήtIvI$Df (/~4pb7 R3ʷȏ?:̇:.2\- "Id.IJMoQ/""Nίt~$\z۲/Iɠ]$I5k2s*'3s'wU3A{گ<#{/I:$I+2눘 ,Y͘VQ}\i ^>̽$ 9K$iLءʠs!ǡާ(v^YۓZ% %I4X^C{[%o8q"3f[ŕaW%yYUjJèˈEd, 0?0n=0 xxoO۩u`淢Д"1r tM(babu1~2(00 030oO]Ro407HjDdf`.U}׺#!"V@XEYn֦0 ȗ{^UH"7c  r7|BDQke݀mJ p-/\U\A,塪zbo53A-cCD6l HQB~&1r`^~`T a v^̸H*C"Y%b?XvYZDTջjg6Xe.a#G98JUo ""׊f STuMU]snoQ^f[K#tYc""6%Xe$nfTDO%XUW.MG9 v~!"΀2QzeCDVsFv{g܁> n~V`aG|n0  0ΰZ9`03Ȯ3L٧NPV8DD>߁wU8 4p^CՌ.Qԍj磘 ENaU}[Dm_ uj ".n;Y1Q|%Q0r۩ \:f \ " 8blp¾v5URUWa f\vsUi\b+Dd\0xV*p'jR/*V΍0,Eܨ$γpˢa_Q.vC ؽ'׍3]/Sw #OHWaGF:"\a`_weYbNR߆QYBYUVuP1Td 03XPDBuRi\Ot_(h_F?T.⻄kJ̋dC"ƼS)*\ѨVzaF⃩Eh83t9o0zv!J'4H"2[1~H6Egƒp9ۻSm&\Uu\u"2)b:y^RXή#"mm  ԛغ:zW6WyUn'N0Lx\ mS_RշzQ"m/cHgfem״iÿ[ezxxa[[Ɏbʻ`U|u.j}F2eKW؈ 7 7k"2bU}+Jv Y w.& &"/een[X|ƖȺLc^YChc<NDV6rvy3,]26٦1dY+")G\W 41 ui 6f\4i5˔qL(AwD^8fOs-u ǀ+y㯑"ryí\;cd\%@6t.ݸUD\ypf+VU__ |X`o3oYF4| ꟡2}t/!o16}O&8Gw댾V/x boG*D%)c\Qo956pKOǛk2ínl,{j߳;ı=56eq̩/ԡƧ2.@364zusrs G܋SalG {I q+]U8wflQ"[ڟ DDvRWo@ " Cq'qu8 snɼM{mn(uqb./f npmpnVYAf>*"ke]fvIO8WEu-q3YUD6Tлxpc˭L{[nVqL"HׯGu55+?_TSKTLe1n7p pwO=݃~*|U/:TaW\A,LZ؅pY ޿.x09 p\ƏV|B},=x~ X,ņ~ U)eH"r8;U ~ Gb,p'?~a_|qKWD>F qGg4 |8.,[!<}`p{UILDfo܌dE s[IJicz&\a,X+JlY7C?\ǥq.pf \$";j@rqC-\l `p.b}f}[GHwx||=ܹ/ʕN!72+zvDDd 8`/sg"߂q M$$p@Z">SDn0ө; vp-zZv{E>yƪ ŻԆ8˩He'{3 ]"i~w79"8Z*X0U =_9pc[NDPGk*.ួ+ڿ} ŽK~]FNMwrHg[½ .,Cq缢 `;j{R@vm7*` \,KwXwM]WD +)sa\xHF%/? |#"n. Xq6c-d]pW=fDr7_ˍ 1rM W3n991u<:"sÚ9j_@kȎ#zcZ(&CfЍ bߺfpn# = 0CnTIgr6+)og܊zG馇 YJʛ7 :~*tn2l L_p+9lPQA:[ h ,[Qn }=#/J꺱y| ]~/¿BT 1/&팩8Y7 /󺁶U˸,%(#Oq, ;38b4>=fe\Pm?t %dÓӪ`%؇ߧ8㽢| g`e ~jSW}20P4 U`>Gf<$"ȯ}q&@hlIz/n6( El& &$p΀bwUp9EU+8)nO ߄'>%"YIBHk꫌XGF?{2(0up>{ MdRWSp.Y'?pVNJ.L-|XQ9H\ yX0"\U*Su+wqy%Y,Ygx%w)c@]Up]eRȍ"!"%!>sԞf%]؀ |p7pjgFO4πR%ܽ0 YtBD&0Bq&8ϜWdjh $O@D!XO֐4;T^S?@Wy!MǵY3ƯFg{7"2ONc&f0u mo={>={лx R-L&@zz1Iat˾G1!)EgQ.}FDMh2l;O] v|:Kq'+mϩdlP{Uu\I."'H[Q]YSv;f2;W%'V`3nYu;Z<5]gpgkKn-#m)X,JJ=%uDU_%'L䭺~k8#}V}KDd1)#m{w2tZuH)ӅꟉVSPSQGW)1ccⓀ *U'Dy$6 PK%L=y9J$UaU<0v.q > 3 W%T؀w&x8n/FQbb{.9xibbu*P5 .Ҿ n}W i{~ {ϗh$9lVKȪےe<; ̓CEdmG<`qc#7;P% |Yb2XJMll t?\8ӘUQT1UnPJ/S@4Qȧ(t.F%y4R2{N6Rjc#E~tV(XӅ<̡{;Sg{֪C]Kؕ~#$6 mbjօ w1׺.1-|#q/svK[ncb/6d 1H$9(?sv@;.T>Y ֣3?)}۟e)f6ϩ 0\ni_+Z "sEvyju8,Ӡ/f: co?*["rœoGXͼ ت`'vn'ntC:D\"9;OWNOMJ]Dd/WU("]qYQUhۂ]r.ʾ*"_ϐ1B՞Ugo"p-L6Ec.UR l^%:E^f~ 6NDZ]ǼUtf{3.Ubn ~us5^Ed잏q6YFvYFK4.@ݐ@U>U}PDb"236.K_ng*Jll08ky.Cf7nT]f"R2;2~*m=A9qi :c2ZnJw{=rqӸRH+Eȅ -~ŅE"/5lJURO@Õ4ϛ4߫NU,1Ȍ% vCOYG@2~8 g(@DS;]Pէҩ8g/4 "vm3~F.Ui 4wV GDg,To~=5@xp+5='L/Cg&_Y;%^jzq)"ϊ"2QDV̓yF^^6sU]XNGySg/o__(/Tn:"8q>NYػI7P&kTU>\RkH^% 6&^ ԳKDzYaiR IDAT.oL7:V|ȌcJ;LMl+;[Y:ع(NqTY.tK>$vg^`Og:.X^?Acjq]Qk"m¥,>4. ՎmmPp̭EuӘ[5~i[LD&*͹/&{,]5u!"8 hXqE|}#r &ns{H)zx^ޭ.u ,l.kَ}:=t?[Wy67MUU[=1"2Sgu|8O~ph}n)Ҏ7vrd$[\]RnwGvo@ݵDy"4FFR-\^,!'v*!"'ȍMUU}ss]Cc"HҠ89FD6MG T-.Mݧ8.ɸc ~Sm5>߇&9~rfǹE: zh枟ED˸S': ."Ӆ_/Ev/4#KdִU,ҦvecMƻH8fzE䠌q)nڶ +rl ز/%l3Xq3ϝ}]AI߭sqp~& 8v6&s@˖rDׯ'>F~>-p ]#~[wQM"VAEw'f܆sY~z^B0x :S =qAuYW{"6 8'"ᄿH?W im5hm_^S?J3}YRĀWՕ9*[#m.v. $nivS,-'"+T5UMe%k1U}"m2DdFYc Ν h[IDRf]kT5wQ]敘K'*k551_Ae:ogVo BDRWκԠPwWíLB PɏR 'z@ojnpv"yu5n:߫ N+" Dv}NHc*ȴ_x_Dڒc_Pe eU:1+r:W6>5l,j"0[Iy Ȫl"; u_6)~>vfSkǏF,bہ[P})"E`rlxy1H}ܙ1%s ^"=ޏW}3{hYƆIu13]_ApKY;$kSqYfQ,%:GgQRί#zɐ;uqBqD1Y|^BHL:_S?GdflCx;k;5al,NM`D_!l3#F|6".k=pY# omO'}_yd`ZCvRcZfF{e~X=#^@ŀ3d;zU,wv266JqA;;m<gy5dзOv\3ה /*ȚbadBJ/+{ g0pxq_9fȳr0Sy:TJŸܪeie|;ͺ[rcˍ}ϧo$}3&k,uk{9F7> ?}i/K%3dl {V906 "X.NS9ּ/ʐYi[@g Cq'8dl^T_$4=5tDTAr"{F*.;z'telxߏ˩r:1C` 2G|.;=BEc %(KqD^ԸG2u\KЊsO:qu%\켼]27 YD`46 Kֈeދg[qMYEWPVl^@~6'%mX^\9j ac%v 9pߊػ ^6 (& w!'F8 l\Qo2M |+r9Q㘱ڮzo {վj(yIy^ː*8Ck-d  ~hq"6J,U6dRq6#{Hq}2ܐ!g"VJbA옆{ 9tDž?:~'pF8?z}b- q܏qܝKٺ^oZ=s>u:l{ֹ ť%~L^=GVQ)wΌkJDRͿ^GqFI+]:3K^jC>9Cڷ\F /[ )i 7 m|M]W .-n4pF@kTZ};rrLQ"Fk{Pܬʊ"pA ܍[=񛾘qRڷ qŰ2_|d-UV-ѯ7> dwf8~-UgɸX(u[^;afER l_S_Eu:®J:9/p]YqT@]S :|Co2Έwֱ7>1c#-纷Ez%r?{"}0XjNgG~% 5]-qJ_sMU[>XlTן~O}\xd®%ZL-y7nbPlX@!IcƆ'D \32L>d'QܸcDbaܸ( ^ib}q5pBFwyghw:1kWJN-fRߵ]b^MffJ鑱g|7_,w"^&>q/&oŠΥ^+}'kv> 2nOV>}=G@:n Ɔa~8e mj X-GI5Շ}/Mq>5Qٛ6Ck3cMqbEb0=8 #}NS՗Sꕅ < ?(:.kt[z-᫸Ο*,suwfF. ݪj2ej "|5岟W=ίuf"_)bN͢ܮ{( " ]AqqnUw^pF M,"^yqHf= SM董pźՙp!_MD, _A@zʆaaQұ 20?0:*XkC36 0 0 hs2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FZch "3껽0 %{DUjB~FZc#" /wza1t}K^ׄ> oZcpanTF#Ȭ"a``xU2 0 #E<_dd$GD*y2M(5- ^^nnVWaU o+?]0BwlqžJ5b\ LR&]֥ՀDdOUwj0 "#?\yQUo+ c9ԫÓ:׊15"ra o4Uǯj,]QxU=JC 4pjylN)8#dǪzxo2aFDDG&bAQо3Tू} F1r-pN,xܠCDvfhz^U>l̗^eu~g ̔s( ఄ:Uew I@1QDXdXDFj?[0j#"ƹ#saƌ "2#. \:nFQSߑ8;%ԣwVQ߆ 8ɆQ36Ўȩbu]>ng#ja)O[,"3wKjMvahڀU؍!FiDdEM'5(panmE%]Z7㻬a8x"GHV=Ø36*LcH\ӾeW0 #%?b+t)\=ԶuTu2eGhc`ƆQ _x/k`ᦜ|J0~2B`EDؾ}FID I`(ט6(t\E[i *5 c`S1Yux҅~ pqFL~]VaFD 4g2cd3 QՇGvؿIDd ОBӈFID CVP쇛5.(f8?3lH\ƚpAMo"Gpãqf<.8!6U}Wz "2$^2:>zxYU%?v'{P9^UkUT/PJ wsMoDdF!UL7"LyFg;OgjM26E]Fv 6 FJzC}/˽?X粕w T5ߋYFD~^ꄒzX !.»"r ~ %"IFRCFU8G'J[ 8]7>W~FUqX؇ZHm.}TGDFq"wDJ;lU}A?ħ*6"1YD.N  ;[S5u6>%"]~0bmnYI8ע]SxI#v%z =Y"ۼuY x~ .jq {h_ O#뺎~h?( j7ogvu > hs `.=Sx6p70 HX>e%AD+Vp3|ȩ"Z{DqxC 87Dd'"2JDNŹ;_3)'T⳱{SD6 "eUd\ŵ{f]7"2/ĹTa^2F:͊!" X\-I޹!Y?~9~021c(hl~jNDd:9? zT,HKqf]= /-Mا6\Mqf\yqC.eH5\[~{j\:b,Ƚ"J#rڿ݊Rqf=]CDnU>۸f^(`ܽv!ٕ Uu8=52d7bc:}pW"ҵt>`._ŹƝ9qM"d(plTi #CI0^2".7R sT5iZX5zF>F>Yb Q  7 Ț@xJ]"z}L[g>ʴ9>"r15])ґ5 Z|l&s)g%UW[TP7YýXF;8#͉pWrv9Ń\~\C쫪'&g#c SU:mT@*]~ |wBD!~n=e_J8#}t nPj@zz]rk2UeIk8X87:F^lE:~A@l ,K:t-f7S} ^ 2 `=NM{sg00GY#q,$@4q|iyؤYp3{sǦ~KhoѺϻglu%f7nKʛxjӜt80pFup!ٵb6pټވeK[(̿s5!Яm̍(ґLX )gC~o28I$ IDATdq])@U/ƹe8pRY}8`[MJ,d!|j=τcZ>cS%lk.NjȠ1EvYسN"SL¹N@}`'U}Lui? ~v4~.?Ujw⼸Sg*}">XF>lw2 Br,flEX&6h  ]5 4*[U%}G #ߗ f:I W o=WUϪ"W]:/"9<{5 udOUՐ1 #UPoAvp -w=pK)bN*ꁶ#U*BU1\ ~+Es덍!Fb/dzn9A~_]S#mH9uUM#IyiDd&zqgQseyG?(Pq.p!>YEg>|@WpgQPd 9ŭ4gM WK| "K&8xW\%Cc ˜aW6ȲEdmJD""g⪲: ^MU-^5oh~ S U(}U  ,4n9E.QէH'V7/"UY^HodA%'K 0BّpWk}\R眃3@U%>\صL2U۟&S62"ߐ އKE Yyz/2VFD ZzrbYx%ҶX36"Ă8nC` U]JU JZ ɎMW}}5VB/>.@U[$):ܡQӐD~~sU:qG ؗpgT5]Gڊ~66s(V {Ryn{m+H,{b1Mm36"i{kZ48ѯ+Rj'^TskfmήiQPQ0Tu\¾nW. "sY":SagH[jWd FnP7Jꔉ^RǞdǫľČ 1WTn?uxW*][֏ʬ˽~wHM,|XeJ)(IC6H^!q_un]\8[UﯨSm`V*jb_,N/c.7[lU0c(M(a+oEw޿u4,\'"iT&\+b++hU@] ,Ri{cCDf>%uq, t9[OQ+DzƒUqi3+۷qYB<OVmH}"ȻoRɻRgB YW!\PDR />/1o~ĝa N/@96{T,YpqqEfmIkKl/+>k]{iLWBG9xFⲾu^m] "y. Ue˻oԮ{I=yUh웟$s10c( RcK`KNۊ֪zQ>C}>Hಶ,m(oo]2f 2"r 5EdKU_U3u?j@;t:1mcツ-+>z=d 0nŀ_6UՉ"rBx?J^&ӔU|񱫁Xzc}2oh ߝQXZn2*6WNM;haw{@U_( #1Ig""sF>X;q_-bgTEd8 'Ak`Ɔ|Pn wLm)"+)u.۔CLdN=eXh*&C(J1'`nj@?go1VЀp^;-m#mEťb8U)´q7u9p&%D$T"2#EFS,msY"pcHQR&a B$ _%<6M#q_53L0 6Wk,3z(H)cKUh8#ý"-`@z| ts[J"r6_:ʱ%#ȉAnw{םLTc}uʒ0o;XD*Bh &j^eY#B.n>D`URz'@GDjS T5h~wU #F }́Ll@'M8!"?4?PF^Ϥ>P?!'[ #"k\$t[5@ۏE$ED> D88ٺ_哸N/ǛE8 wT5BDU#Be9FDbu=>gk;s4'P$0١l2{)3t&-V 8C?Ev1~5TCD` X'mT53̄ eKUm&\<l''oP>G;йB-pٯg;jQ!"Q8gtDVwpsmU5V[52Ri r~nX\gLV.T9qF_q&U " a?Aӄ T5*ju@N| ro~'DWbr­H.8cO3B܏[>6g۪xH@a7 eRGi/-ݽN.-U(e -F $o˟GJŊ9|$|<|lsu? !q7r: -F@~7ǁǺ8 ?+Ʋcc?{N[[p2YzoJ=wAxX<7±1NzLj>Ϧ o$"c}+f6Xǿ{P|fX(Pyx߅xM񮢯:PcxEn8U>k.Z܈7vd S}z;󟃷eu[7:t:ŭx#xOÛָ2/;{<5}G 裼>FAo8@M]ņK}u.^!R[-HI>T|ο'a>='ıTw(񊇟a| ݇7{P{f)[lw U.o|͸ߢǙW0Z?H=|CZ!Y'\lxW]&%33i%ź_syw7ۛ',׮W0!X3[W'cqkx>q dඐ> zbfCfv>ޚ CB 3;Ц6S-61} onK35䲘Ywp`}wBr3;oT=0^3SQ 2_L{1ِR7ʑ3>m!||ef{'̿wدw,P_ LyG,CQQہm枧 |u7zWif7Moֺ[8VdـG3gR/'<7o^/?sn u Gr=)qG9#cw63ι9!]ZT~oQZ =˱RC8u7òvysmO<}YCj-x.do,ǚBI\z^śV9XǗAņ;d$ifk% (t{9mJy+!rl[^ixs<>Sȓ[9ͩ8E,?MGhc9zx=P9l;}mlЃ=kf"SsnCO ^1~WDZlh{|wu3[]K5ۊuŤ;xbm;VN6`3{hbCBsڝہ&PDDD 9ޔߚ %)SZ!k޺)C_vЋIņfmιGx2u32bCbfm=_Wι#HIDDDBr} ˽_$eNņ̮Ҝ))8'{f>dfOFL*6 b};Ώ&+s9w ۙ.2;L&F% 47EsR(ވ{L&ِ2 %6 _Q*4TlHr3;Q#""" lof1ᨓ!u2yٽι݁Q#"""cz=u"2h͆QHQP!"""""EbCDDDDDBņ ) """""R*6DDDDD(TlHQ8 lW5f|u35g|y%d\ 8 4oٍ>6ƈ;l8<[F{qʈ[F}]ofɬҒ;>K ?ST@ȸ2,3<#f2+nW`/uzBOhf]7=p`F܊. 784#72nK>&3kk=w-'y8qཷRnȸ{qmfvȸx/ ٛ>0Yqq57Ɖ#n&qNȊ^ ךN}i^  |I}) kf/^̊|͈{̞הzi5/7 2|:7>\lߏg1=7.%7P?N63u9Nˊ&GܙYqhVe9ɊmOeg%9>qˊY/e0GW⾟#Yqo~VWr(+K>.ϸ_gŝ#wYV9Ȋ;3G5YqSV>wKVܱyݙwdw/2@V܁9q{<+nOq^̊&G@mFx'q̊,Gܿgm#M)#n&^QvV\[q 挸x^v"%#)Gb`z`q̌q쌸jq˲rus2*Rl3nyF\,f[d9qc#6+nqYq7qCYqϏ7 ϊϸ'LjɊ{|$ϸ#n84+qGfm8ʊ3GqYq7;!+.׹qv\Ƨ9 t<.k^δEr횺ʞeEuFSv,Me!o--N=G2m7/Gܖxoi rcMOu%WYlꑅLeϸmX=in[4X=i rYǥm+=O;Oے# fissĭ+=ucĵ5xXqxPڦ"i: ׏׈Wxmui yMϊk#gֺQ ƈ&JsjeqUxE:5(Uq3Tq `Jqxlq2fufpl5F\ #α,r7VcC!quoxX=Bm:Eһ.ɯd|5,fe]:ޕuU7J}- lUw5-3/Yq{*^fd\I6Fܭ9^̸;Yʎ> IDATŻjw]Vܼqgm<w/sV>6Ɋ-+nq՜9>f]Ɍ{+dLlfc}5gqgŵ'3I־3n:k*3}YqûZwxV47̸X*߸:̸զq-Yq/'fUn̊{JU7K]/.>*k񮈽wVV\ 2+5c]#fŽ#xqMMǽ?Fܯ}r/s-㬸71>F܅;qo#>++cIJ3x#AqYq_̊[wvƈȊ +]"2FRqtg &+S9j>Iǽ 1qgfLj0#dF63f3xQqW1;gx#38M Uq }Nciun\*o~|ǮfLtx/UU8[oݷ~?̙s Ȕs{mI69Waf&xW`B9s7<<|%KZ?JDDDDdR;G}s9~ t],w}w^(cn}ojG9ac[naM)fͺ(j^DDDDdJOH~s'nÛp/v+ k-s5+qW022gA2<pΝbk"""""SsٳgnŸo*o+@% ~39U=\͓$jbŊ#8^TTTp׳>sx$7U<>N.~򓟬}կ~5;loǢCDDDDd2rMS &ގxwRhHX_ʚUi7GW^yڋu|b߶|)lwcV瑩W_}ۏ0nfjQlA---,x ===AʀRlw nUFoo/GuB`œ%p:SN! wޙ[n2*" X,ƕW^Td2I'3<DDDDD&1{hnuӟH$j7Wskm  ?O8W?mVDDDDD& n_z|s[uιuz+Aw|~vu_׿.#N?;Ϊۧz*?!KB xq;.hk/ˡvPljG;7FqQp.pWsUWCqg:Q8r35gwy\qnk_ .rNԋ ffji>w\nfjjj?ɱ`l>|y^Smنzi`_3 ~$\8}O>Uw^ޅKP!""""SS P%-]C=7|:fϞ&p\f+&._{wtt~\|y=KlfnڅJDDDDJ˩{p\r%|cxxxW3[pXBǚ[cbf8f:2mXc+fD:/0H:~kfs{Hh1ИC-fv.FqThdi9^]Nӡո܍GG%FJ}Ӏ9wK5oKqBMۭϛF멵LE#]2{Iۓ,}oxusp/M7\3_ t8إ~~#˽WݦiVp`v <<'9>Ό/5JcUM؛ K$hfiQ3 0)yf;8}dR!""""R)੨s9wAɈntmfGL1B#m^@)=su:u> CDDDD 4pUE**6DDDDD[v/g^U""""""2$O#"""""d7. 3{x0DDDDDD$'x̺#g5)cf;uB+;Z :H 4u)#Y?u>ODDDDE}%ADL. Sy}f#"""""At{{NDDDDDDBQq)TCÁ:L*6DDDDDʜ= <ubιs78Ώ:<xsݣ"""""R .""""RƜs osKs:Lj'""""Rv>Vq)A\DDDDD&t5?lDDDDD$(ux X Lu/ j'""""RlspPͬtF6N@DDDDDcfDGsn;ܟs:<x7"IDDDDD&^"EDDDDDJu9PEDDDDvf"""""R@%AQ%""""""K|>A\DDDDܔt;vSĵfCDDDD2࿁A\DDDDD :l16ιs:<{PEDDDDA\DDDD9ι;.JZ .""""Rv6.tUF**6DDDDD[cM@mTdSq)t/"""""R .""""Rޞz:`m:i͆H3Nh ."""""cfEGsnKUιFL .=yOq=bfFL1B;F  .""""";p0u* 2nwFL. 3*DDDDD<%PA\DDDDD /A ."""""cfDGsnssgGL hCLܣ .""""""""""e9s9sQI EDDDDn?Tq)@EDDDDdu .""""""""""9ځhYMk6DDDDDʘ-~A|4VQq2gfwwFGsnSsGLs:?ifEL1B#ѥ""""""A:9:H!|u*og^U""""""2Ā'FL 3!DDDDDD$uKu?WEDDDD`Ȗpx̮6ʊLJxKݾbo51#)w >~9:LM#KGy`w|EfaȺHKusy܇'.M]o9*"g-]h:z}gx -L:rs.j*RF"""R"fd|]岆^RA\&N Fk7:*gŋW m~"qX_lDDDDQqzg?h:XzCvVWDDD@bfvaf_2*6>B,B*R3%EDD瀁KQqmgV<6TJO] l@[Q#);':ؐȵY .qSet:GˉEFDDDJlf+Q)望㜻9jNƃymH(QP oQss#G0 œݣ,1x9c *- R6I}v0f_C)&Ta  >R$""")AιA\d jG5gw/.}/ FDDD֮](*6d=i:. ;ŒĠ#B%""2ŌA$iURm}/:>fHYEÒqaӡTYv 6dMNw '\| x/tdk;7/ t#<gBם /[Vmg9%s!DDDD&v2ϚYK"zz-"PSJX%ǘqlu/"""R:5ƌy]}Q20~`SkUieTcfPqH0yr踺 ^8U""""C)w휻9wBɈ4QM_69v }PA%˝l\R \ZйA*}lS."""( u٠=$pWh9-.T"""R޲:u>fCJR͖ |\L׉۰yU]f]ME^"""S.H0a<{M-mG."""Is答P0|b-[_Z=7C No,"""2b灟Fji_>5j}zF-.]@gI&~Jfr0kkNDd,mg 6Xz}?m)EWa $B\r!V>9# zot?TMPYmYE.ĪHQDD" ^MuODȺ4[E 5踎z˪h UޕlQ$]w]񀪂=~1>;L5}t=@X%Zk\~~%-'rb-ycYP%ߺ*۩deafs.**6䵝U_tL ,z}v(t Ym5PSp(K.YIǕ}XˆypflzI-_*xc}R1v[Ly(\f" 3 )<0, n3s4X>#7iGlSB# Ko=y5F@&B1F.Qz^ŠpKY-EDR*gi:,2aCFE%>Mk2og\¢Yh_t?yqrF&n$`'ߔ f3QP7""YA\B^o}iXv#KШFܼ%,p6T"幭6(gb_ o_DPι's'GO&]0աjɯz j%/u;|sbK58Kw+X{W?`]ʷX(|,.x?Wq\Wҝexq;_verD'`EԩF`gXp^WQ'VJcw Æ-RU8](d|ކ:fdOP[ƼS$/A];?_~(թT+*HRͷ~JC *p1 .%v v>*~Yi!j:SeлI^ܿ'xgY`[9t*Os^"T*%c <4#T-+ u<էP  Q4PEޕTNP%F5F19Q$\A:ȲvZx jÅk%9xbJ+UB  P t%3ǸtξD|h97?`wUpazk$fĘqftxμ *i4T5nZA 7$xlΫXXtr7KPga84PŲ5KM~d~Ɗ ֢׹H9ٻιӁ?5 ^v4:`t^rivlrV<*]>^zša*6d:;43#xӿN_V~ A{Ċ T[ob6E4ٟL3GԹd9w9#LtW=7TBt\nM8>6wthal`P[3{VmY^WR7h3E$\i6">4\MFIT aXAN%e|'[_ wBxH;<^ѷ$m<mz%|%+)vVPH wonŁJij'"[ 2ya."Ġ#/bZ ]TxCJzk+3[f=(wS|M2辷8#KG|Hu;N "R:RĿ{9wRdҚ )KmgB)ңFuJR}׎JGiSƲC5>\3 gZh (S3ͰAY+Pj=@3x8M.j*BBTg.naG7#(V.+3S7MPe.^)k Q|ţC 0=Ee|>;IL .m~>9\rT`'sĪKy5X!˼<%|RÝxp]A G|Is%1F|LD{W=ZQOJ TZNeg0:ht^On-Ue}{%$c8fNN>:n!hSC?nM-j 8~$!AU,q87MSDTٕQ-ku}9W=7BzZ-r^1*rfE(6Tha;t\l]o[f+vp@b}W[sFH;;TO raw8O)T-8> vk^=i=P|1vz  b6^"R UQ=7  wGNX%`T`#%0*`}o%s-7M(f5sSw)qιp;.\2eO92ypFg7?o\Q# ,Uxb囦bCDJXIw_q'DD rvCf LJ1$f/LbMZ랂ɹTvԞ("F *6A\& ŗ<Ȳp=_ ,-̂%4s"%H;(ȔF;LUΊSR1""X~.DD m1ވAXG;BTΎt/6⍓xD z}38=yzSՕ:ՏbCDJZx .21k!rL(6FAQS) wn@,+l5k;F}~x~훱qW_˅7MD:8A)uiLjaR|fkꭑxmb`dKJ]}b>Î4X/V!,AFVDJ]afǛQ)kv}9whɈZݎW4a*7eDkkËí HN.A)4 oPܮ2踲H(n [lmwzNk ۜjF zĆswJRvT(**ߴ& EDdm .^iĪMneNH:mk|C*62U >M`ē 45Vssɤ2%fĘqL>{f|b-:2%fĈ7ocjR߇Yo:[ӑ}73Ѭ"Rڜs;~",T0ܹWYzkJ6W<Ou99t* Wlj{\giڅJDzBE&VӡT6MdžΫ׽ kHPfnw K6hط WtmC$W=]o=*O4T|Mkp;/BeAG&k%5mNA bo6z\D݆~|/x1G~gff2iUxUR߇`hQ>.ghax.a&|Rx|>#jiVO+JDū@zqi͆Ls挷_6FK@r2Am<8лjFE]wy=4G:иq|_CDʅ 8ŧbC0 ;[ke,9@`S͌j`+{a՛&]lݰ_p#~dw2t=u.bιι;:bk` =7:FY~ۚ')WaCzk$c8Z;یLj'QzJce^Y.w2_(hT 97+|D*Vh9)\F鵁vj`SF%3=^_ ~ S *;&_HU*'\D&D3M{ag7.T>9ۃ/%ZT>u~?TŨrWwk ǝsHf`m:F7Œj\A?ᚬ>ZG:Qr༮"e4ym_AE{ FZsi<(YA]}("#AQqhUEGӨF -1ZN >ݭ~_T8iѽBX~AOD̔tΌ+JDd"}5,UөU9ZC8Ou~XMK >MLuAs=~:pWmzs/ B8HAĀxE&q|; |̌ckH bPUs!c;YJAK -fI #] o$o!74M)3,2EsqҨFXTOM+P&ZKüvRDӃzn"`~{u-2"fh+KrvCu4xcfҒ/彟 4fBtmW-s,Ɖ{G*_T-u"":x:Whpqn}N<5Rj: o^Kuw%y+ynb^~_'oH+ڊ σJ4Ǩ۱ 5JDʕifEKs9ιNFd])NNS e50mݜ,3-:%Y^^:g/ 5'[ mVSb-hxsٻѦ$2qjUPG%+(b}4@\c[[xavwnIGJe4Tzgtd5ž'{FY= z>\2R13N6aXlM\Ż?*FjAxmg]rh1NR?ͼn аO{URs%UP5;NvE"#G^d$}/ pJAU+6&ja*\ÆjbfʋLYqfרI˾쪝ei9w1_zGk v, /XXu߿f_xc:G΁>cH4F:F,ኀb/U:b#V߳ﭢ]D\9v~sn3f?,!S^!F 5t\Y[N%^ڽv`Zy΢-Nv.<4_{SQ?P4\bCD3>"e .B:dToR- [bFmie44F[0Xk1N۽x}~#)v$ޠ}ED MEԶQ _k`ۇڨٲ+WEowL}bm 5"B%"e5 = u)=hzzkLL6] z]ߙI΅mPFޕĪÏ4_HSS[NV""`f "%jx šr}mNcg4ϡbfc=ίdX4U{V>#~""~efYI-9s_pu2"Q˷G/^vyk&[\==K$v^P϶ۻ/ܴ,TQMGݶ"V>ĪJ!"2 ${]A3[qN"ql ~!\8|bl`j?/)?*-rJ-$YvS?nA&bpzUQoTQqi\rRM&y;鏄9?ib?܆}^CDXkVlfvߛ '_7+FY+aN24x_ TmzVPC;Th,U˞~s~kf+^ZL)ZGޕ>c$IFmUp WpoWI4p3`!""T婛H:jL""2%MٓWDDDDD[  ."""""0Ks1#EDDDD$jqJ TĵRDDDD̙ٯ_EGs9wsn~ɈEEDDDDbx@Hι;su.A\DDDD9guݜsJX H^6|^e*\b.FL13lfǚF6DDDDDK8@ .""""" >u1#:HQ${:olfK"IDDDDD&^^KEDDDDDp}9wssɤ"""""e9p] ."""""2+9Lv1 VA\DDDDD $ff?f .""""Rv^M(J%ePDDDDD3ׁu8UA\DDDD̙OFGs9ι]NFDDDDD&p70Huo8'bx@5PREDDDDd| .""""""""""R,%A+v_TNh"ff?f"DDDDD$ ^2]EDDDDĿT/'ҹ:93(<ŜsιO8v:<DEDDDDbxHYr眻9oԹdRq2望ܐsn 3]1EEDDDDFJ$:HQĀ ~.A\DDDDD $ff?fSqoRS bf_NQq)3>sU;>6dDDDDDdHR;#IDDDDD&^P a."""""sh9:Lk6ODDDD:ߜy:HtQ%""""""K 0=\EDDDD bfv!lf= """""%EEDDDDRĿ <"""""R0fGGs9wFj,Hwu"""""e9wsι=%:1Vwm"""""Rs -PqbaAA\DDDDD $afs7d HyZ 8*bFϒXbxczNED:;`6W)?f mGl(VQq= ,H2N\1J5#^9uشFgwlI%MT"`"xU\z(^AQ(H%BB*f{٩°$~wv;|Oy3HNČDDDD\^\XnI֮-tD g{0NϽqz["1 g/DeSF!!LX pp,0`k,pD "1Ŏ?!S Bb[Ķ4w} Gi` i"""R:^Ik#2=v\e5QJdVML8=nԟR Ln_DDDxcN>Z z72%:2li?-?'㋀M2qK1:YdVJvVn %Av\5)%Օ'yÅu)֝Ŗo1j?Yrzx2ӴU9A`?/"(>M7Xn`o< T.L_MY6='@xgA{#27X,B#W =M_!H.gLzhk/[Dk}bfSXupBwGDDDc8A| ާq))^^:@i^LmtZPwO)A\,/-tW&L'ËK{~ZZB%WN֮+tD#ݛa=>Pi>}B| Ն@SngHYR[^J{)%<βd`7zIvdXpQ]WDDD$O߅ĥMDJN(0&dv>P0*;!t:Ȏyhi?&`ڼT7Ox4]A/`T`ӗ{ZHٓK,up&YRTv!i< 3әqr ~ZDz M>hӰt\dGP?k\xF=Dd?ԭ͔/ y~d{5c=)̱~hR ugw>U,fڨ'LMD!a1t7zC)[rnax6UΈն1)N3ϫb_vRa:{{}DIW"""o/(A\dץ- /gO2,[eI˺OveIHI^`]b}cƘӍ1 xߺ=/~[V4evhFe7r|EDDDr[cWtvhZap"ڣ1/w6snW/"ϏWu-ʦT OMiD"""s1Ƙ ݗ\Ju }{xFgz_8J IDAT~nj"PU\:cקHdHY *@|qr4|ɶ M)}LԒZlb N!Pn6:D T:l [S$Z2d,%`0@SmT5?N&;p+EƖoz7AjN ?>[$ٞa/ $T XM)ï}gu'D?T Gɲ KSIHؚWRjv(_0o SsDx\*1E# I0d)Ү0la^4HŲBT"PY/"-@?P5g%/? oXM1JZ~O9Gڶ^:/Uzp]qCīIA6}ϩdƹf=Ɍ^Z?ʏ}r ; l@<{#hH V3Z6qcΛb$zxs&,DOA;"[F~鎫}Î N}5[vXsmoq < `ŴL?Eze&"aDmvOM[e%Z<1er٣x*q}lŽ5!CG+³St4<:Ja]dۏiKt-p M`UWҴ\OHulkfٕ4QiEq' 68>ݐ呱44ƬnϹ/aݎ?&c)4D&[&jicl;13U%UhԟbYc[/+~l8Uq$iO-ΖozJ>?`ͩ믂#9ͳz ])~bwv\Ac<ךor6C3vj7{|)#Af" %Ցcw}GlmlMDx %}ɥq;=y[bTTvJ2;~[x:^lmgtxm1aC 95'b =קoMmOv=cEr{m':d4`c`!cIIvdvx@= ǵf J$&fT Pip* 6-RR=_w1{zƘJEz2!HOڷy*6g ?E+pz'FX V{[iSTAMX^z^2!Tj,eSF`6dϔ!WyP5v뾔DSGQw\9_ρ*CO0G2ʖozN OueXNGS&MK_a`):#Ƽ <3ʙvZ9X{,r$d6xzW /d87S90r?^A݊Nߤ&FPcC^X==J<='ƾswk9R"~?';ypoa#򺁧+p3-vYOȩ -%n!<<3XvWmrOWrK3jgyG)nKM|v%9zΟ FHroh$ϱD__ |qKo`ک TVDXty=dm4UIV'8 P׫W如C}^|iF]>U2i@ajYvkK|u{;u* ~5zʗ5oxz:3~uOڱ-{.ʗ&]12ڄ3~W[dk 5J]˦Veޮe)ծ4ew6NX0c݊Ӵu컒lώD ?'GXd3UOE\\Ǽ׺^lϰyaIi {  ˆՆ_3Y:³Il] "c02`¯jp/ԟa0Q<IJ7ru:sK=g77f7}O_f+.8~?0?#}La1{\XkvSnU o (cگZk^VRRz {|[EALxj:uDdU0T3Vb?lVo;s?^i!_vߙߎkc=o԰7kܣ1aC\nț9ͼ ^[‘=֬@dx?&d ti73Փb>%2~b:4Fs[:[fU 9)uo˧So%/y͜zWLxbcWLxZ" ~mt1x:I 1Wdu$n4&{.߹MuD0{.`9Ƙ ݗ\oܷ1. /ygLmH^NTm`-u'°rHuuHu>nhޓ[.v_*Mv[&*"ccY<| _!m*lOl:O9ߨ[6W'G>Rt\j1JgY}Xixg\ߘp"Xߪl&"c%1 aSh'x9ƴ}ߙ<_(<'@'v$uD|3k8E]MT夝>5" '{`rw{j.WDy*6lrv`Ǘ."R@ 3Õ .~uu]Y00 =,݉)bkmhnO*p\>*Iud} ~B4b_[DJޫ9o'oSҠ:1U 0Q}h]mr=[ltʾ oPOg1R?>\M"2*ksOMd}45y^F5E ?lԿݠo2/ N/beQsd* G} }^c5}G~"k[k5A=ƘkZL|)7Dk)" sx( *oYl$[}^_|,`|+ oq7HNlOldv};mۼ<LTE¸B|IPE$_;"Y^a`o,moO6F{"v&)Mԛ|Tu:ggCDdkBwH&[Jo7^f6BL''[ _e-=b#ّq,'oSҠb#>5*~ P+awB.g[B{Uhb#btl % hӸ e M``]n7߳i A}4NemK&ꋃL|a1P]!<+t?Fr11xčBwFd @hp#Cmj]Sb`b?2H7xXPDDe8AN`O*u]bߊ} ;?r0=&bR^^G/j""~q=%;ʃ 揨ݳlS5$3\'1Pc̷1K ݗ\#2hp5lxMIdl+t*{>yّ7$JeD c X J3=Ml'˗ &f7ܚS%/KJi=R}DPQ!<۴%Qi"b`xി1ZS SVd :TibkS/.Zo8vVcX/Cο}ײ̆A/V37BmWF͇\:ty .~be}`;Owz>뎍'=mDʔԞb#ॠNN )M|`>J;۠/ Μ04^;[oP-6B%.-7-@q]phZrn'a&ko:%2렸8m=6ĚCI'oQe%Vlq4[;5"1Iv+Kh_JQdA"{/2ҮXB0T+QzR0S:zXD\vB%c343";SnoXAo9Կ?wذ)\nf#%([rf6Q?xMCE| xSUIY{)EmQ>O+_†xֿWc@*)_TyMX#Uy {D?xzEd*QyA6r?KnOޖMmD_HF>a^QuY*^~,͋%"211cnYR ^zR{lne*&dhd{AweŮ5H| ͞{X ">1 OnF)IxݞNm/##}&K*=|XҸ^H&s@6]ݍTWFnM L.M2Uo6}>a\G7{8A]Z1L;v\R6gꯣq"2e:A//"586}r!FjԭjcxS u/ ׾$oe¸T՟dc:Kdjr;?{Nokg=mȮfoLKgx= 7-ͺszn&fTl Jb0+nt9HEuguvuՇsVc؎Hk=b ׏ra27F~ױ~|L`}fnvEJPNJ(0ޯobwѝ t{$j†y?]JY]TB&-~qMq?,6ϭte~VW?iD ;A=PaJ|Cq/kg ڋ ݗ\ Gc3"c1j*vJM;ҟǭ~Z~}6kT,+M6wi'zK/&Ns}n ړSH=U K MwwzC,{uJb`iˋ'qz5@l8+ 1@3LInO׏~N%&\K<)tz'-6Kω3:HOeBZ"~q)a3,ٖcvo4AXxYe/(]: wvraySMaapd,b>СөT,!c|SgNױ|؋I⛵J&cƘ4,*t_r)A\P6SVӉb_azurּ~S/b<+r³]ky?ʼn/b*rA21gVٞy郝E:GAׯS-:Fc< EÄ Kk`/=ugu+m?qA9WJ,)Օa)$wLru˧LHP6/(/tu5sGv&fDdQ:vtO}>IC C.\Of?$Y ~E$4#\2R<&X&n>VJ7ĢYI^x/1^Hjί"ơ"75gκW!m?Ι [u`=³ԛfT{{֦xmmlROaӱ-ggxbv ?5'g9â+aw`7{=o_ty}ɇ&0˦yvfӰ}<`;Kb m8Ó Zxz`apՇ]}^oeUQOXEW'^ZAsC͑evɹ-> heE&P>W.졟V+X.8 Sw|F7nrGgӽrUɼ^ 59sO|DK'fSnXzK#/kǘڇghd/.v\50Vuޟ[>Pi8Ͷ/{8ԝԟTN9?[ 3qIz@{ 9Y>EoȖG[4;ڟL\Q!%֟5W3D Owp'bHG- KbkKό MF*+Ar^ãYN}e†cʨ;1B[B/ 5)zu`^Tb83Q /`7pbYʃBTl^Ьj %dT{4iD_L["r 5YņMZVh- 68QF[D)[ <#SiTl*{ YR <$gMdl2? *hdJqUlUsZ"|V%eĝhhIh)Z}N?8/: KAW>Cl†`D >K/-Xzkdk1!xy*82nH&dXrs#kN_ysΛ(PTB SDc x>eHćj^'SupqfMf+ަ/4nm$8$3$ITHzO_˞Ӂ̾Or!z*jʗ~WDq3n7+ *`U>:n|~W_c%M,SamTAhf{Ko_89Ò~Ne;Na- c̾Ƙ/1Aw7Q6O"ğ~E&_Qet|'R\YKKnl Z)ףow63<0b9v,Ҵ\Oo Kj(rN[G{2l~YN [Ia}>Q:n[3q[dc>=zkmtcb˃TlH)i'Ύt\#;Mb" TwKhŽ//V _-.-bcXz2J#\s=wSbķdl*dNPsTN {=R ")Ez`/ dn'HWH̠8g<9@] 8T-LQe >s{k5F1( Ns[aƧ+93#b+ђAnhT" T2j.ryt\AKUu'QBcʊvz&nIufHwgijmb]휐I6A ?^bCd72'^L1.MiSf" - R(HdaBT_BIK O[":)RT"T, QOwQ} kW })_K=cB[DdJ ;qml^pHiگ!"2-#[hPݕ b_w""2UI6eIXR==x;syꩈ)&(A\D$}K+v.[F[9\DD[k[ #""RxNXk˺.PDD?qB%ȸS""31!km}5 sED@A!Ԁ '""'~+4 ~ بq}WlQ""RC ."SNİDž5,4""FƘ1f]R"{jPP|8=z>DD@aO- 39CDDvk_ NTH90e4gPwCT&ԤR""2fN8lC퍈H :WgEDD&|ķ?"""""EDDDD$o = ."""""yc}1&lM/ .""""RVh@6A7 CDDDDD!{(A\DDDD(c4| ꈈ7T`<TMRDDDDD۾d J/dgr9dqql8 ."""""y2 ~8pEDDDDNg4/TGFNZ9zskc1AcLmK """""E < 4+ ۣ&CDDDDD<9lp1ɥq6r!P^DnxJ<N/pEDDDDNm_&d\ΈkEDDDD$/x1fv{k8Ay"""""_~+4 -`1Ycf:DDDDD$/+dG """""26Ƙ&cƘB%W34;oqv 0}EDDDD$o| ~EDDDDDJ|xGDDDDDuxkBwFDDDDD\{xdeJJ1fvsk8AVh@6A@1%H8C%cL1$cLeK """""Eng c^6e c_A³g<0 륈ʁ+1ھBvhXljpč1oN^7>IC{"4UI;F>Q=ë\d2aݾL MN# ~p1fOi`1p72Ao߂B Nwoz*""""R"bkR: v[h{pm]žO6A/fRh0,ooo稣b͚5F5!""""HOn';w.w;Ybkm1fvc;. 3fXVʕ+_&cݧ>󈈈I^8vBc}ݯ׾V f['w>~';٥Osaʕ477 db bH,k>A&jGo<Œ3Yp!tI<浳y_O?{b{wy'"=;+""""R6~S?/^ @,=y<@nclq}q駓Je_8[oq=^DDDDX 7m4l28}{{vuh9;[o嬳bxGu]G(=;A2qSF"""""a]NjձrJ/_@2wuT|sIj8W_yڟWXW^>UzwcEDDDDY-WWWswpAJ836&A_^r%k>3/ wFMDDDD^LlM}ee%~;vt}c\ ]|;\tEs{/6YDDDD <=rqGd8ӟK?Ww81/pW~|_vRݾEDDDD&XHnXk9sKNs5O}o~p9bfo=DDDDDUgC0]wwkwy\ve^o6J;@Xi/ 'tk\r%^d[8j8z*w}7rpUW˝w9Ο诈HQ1ef.p.p5pꩧv\=.XkzL7E(w= ̴"""""S1f6upW.Bon=ifM cƍ[oeBCDDDDk#cPh|o0OOwlwqf|qwhѢ5Ok+ocK9묳^ˋ. . _g1*Oyaݺup tww0}tV\ٳG6E)jW3/ӟkq%p}3ϣn`ժU|DQϟʕ+ihhnK&""""R;cg?]vw^:6NOd2tR~Av{my뱈Hްt{.y֜2#'XZqc̉-@';>5\8%O"""""K/=ZH4=ꫯ&[nOѷ;1 .Z 9ww?'vm桏"""""%S8cO5|Z{1{Yk׎ydcϹ 8uagމ^[rȜzzlw p4ٍ1Zr9-i70Ԯc#4rNEwnP;'M'崋7[k[<[ G 4vOXk.2Ԯ!<+#ji9V[kWzlj7+k흣c;i^`(Cȹ{ohw 0/ ڛ?{:7Ue텮@=2&RY mXO*lRRW ϻ~yt1 t%lIDATLuf!fݤ%umݸ~C31kQKx0!iWa #gnujGIƓsPaTG!\QHCyPqTGc: ._a VK0Hs=.o(wRa:wGYrtK ٲIFEE7ڑ É@e kԥ}éuk-A4"mf!Ddm3½8O71G=?_!n\Rmt}ywW[87VfF.+=Yn9O#ݘ]JvMt!*Vtsth钺#N~Ȓ% c݈݃ᄑT_<=LQaFX7WK??&Vt>k czrFL{a;G~XRwv^Ii [9SstCm]NѝTRwBkvH;>=ْh;&08nX;:SD3u/eA>02^>#҉&tNmn?o'],-ۋ0.VJt((oTh/YR+anDstK&FQcݵnĺq%u[uK4({?a. 6Dϙɲ V`Danb[ln>+[LtkԭAx6uӁm99Y%tw%9#rnRg^?wˑA\!B!J2!B!3r6B!mAΆB!-B!B9B!B gC!Bl!B!B 3J-B!@/ 3 2!B! fp!s> !B!0٘Dp4V~ef˵$!B!`igO.0-J!B1/FI}7G!B1X蕳o{Eq-J!B1izxMc5YQ~e_ B!B llٖoYB`Gw7ӄB!>gw{2kB!BK w8&ZwV/B!xpSQH\!B![Zld?LmN!B!bBK($Qfv|+#B!~*v+Z~2!B!DWg̶6$N>-'B!Bt޳.~/?(A0B!B,p_3$W!BO[ w? 8/ZB!bvg#KQEtn!B!Dh'2[8/!D`f*x{O+(п:!u`fc !qWp 0oQ5`eRde.vs;kQafg4[>1.lM%f6Xu}n_ x@/JBVѯmN;*zر[Bmu0p_ޢDjlwwʞnhRx leMԄ~Pbfs6R;`최 !]>%\gf[cmO^N[ƀՀq6Yef٨HwC> U/46Iy[@F-PpgT'J~QwϢ#:XqwXB6L5B!:F;~}8-Zwkw6Upk+l4~Vf6 &at}ziZ+>O!lH}K6B~ }lf#u6ntG}ueB!ࣿQOFUB(h2 p[Giq"38XݟIB!-s62Dr1xB->/t:mB!LGlçlu c&u!B!:Ag6pW=GǛ2S}+ shʼĎG8`Xr13z. 6NqUhar Ts/i @m#`w6y g+ =$G yBnC ^<,oP% `fN̪*%Dm1F"w=sT*p/; 7|i6mf60AV:=>vzk=;ExB 0:z( `Dp0=G2ǖhOn:LsN͑Ik3-;f΄%ľU{ų g6950@{RD90Ww&|wL&}`~M6#j A{amH"=g9.M=G|x+:Ax)ߜ _ f6(/Iyr-Bѕ˨bܽ_"9wOZif6# .v(w::Ll4fq"kS͇եE֌^/Cw^f O3OФzw3[gr_JXMzȜMRsTzI3S~-KGe8eHg43벿B!w6]hfUBglfw%Y3)MC 5GilB+ʒ>0vy~?2(p.YV%gOBDhzRG:&yjfoC;MoYʞ€3}J!bl?Z.c٤܌,a@xF\KǞ$(ad5.K<.!d]l0O/,U'c>!I6TcWJʎQ3F;lv-u!)lw U"Vm8.F6:-nl࿣9:m&нFyV^`f'D~UpQQ/3;9&=IzڍRIB!=6eV]|6, un_%W-G5xQ}V.><̋Ԯ/} -Pu4 piHg'Vnƒ^ޓ6O!aЯ ʀo6hooEm+/{^d2Q3{/!?M=oK kL!FNJzuw&fG%%if-}r *-ƽ.̈́ !6QQ| :"nv3VfV6Ӈref7uJc=/ *u6'YYff1<KWafwMDB!EF{Ig70YV8{J {lSӽ.f3tT7Ym#uza2>d)Ӏx)ئfK聙- |*z,4}_eljCt[v3sI3D[Qe !XlFDUCc49ڐ_,q=]qMi19Ӏ5r k`ۡ4 //kdCXaIyK3̶6iI͓HG0FcnI1E叛ٸ"q3{<6&b#g|;)lf Nj~?bfgeK-z`fSr>Շ"҄r$}.Gu6"^>Í~RƾlfA^__IZ`3;HofDU'd_Feb=Ȣ]DwaD̬G?3nf;hQ\%Cl6ޓj2CB]Qc8#ݯFcV sOQxw9ΦvJB{ KvRؽL(3,̎fpdw8!Ju'p*a9̋lфoeBX?Fp*_˳6s?gvuspt]EBH5} 6a$}g3Xѹ{$˂UʼnLX𰻟Y꾞IKus%FT9< ;* MC=p*<{&p3Or)ގPr(.ҟC 4=9gF ˛^\D,?ન,f6=şep##l8~H Rz̖v bW7]:y1 a+dvvw{p` PqFNpBR蠺Q1DZNC 7mCHj`&>NK3,mw"dunt]$ټfs| Xe-$ZBOJ_H׽Ls/iϯ6J]M\/MkA?+c.Q>fr%mZlvC >ZMٍ_FpܿZGsvJM\|_ݴͫRqC:~=фaiw̾BO #+f}, d \M-pfaDzKъ\zAVpw5I8x!$6A%{TdZ)2z3ۄ0idӄШ'o&l^{FO6 |wlFBGg^I^?[MԬY+y >M5'Ì$3ۛ00nG¨F6Rz^پ ,UݢJw̶0K>z \79+:tLll`{3 ؁0(0]>@~.q-BGhE~AIENDB`PK 8 layout-cachecd`d(8& $@`(~1H2BAZ A^ t9& 20010h" y@b R@Ea'І" ap) itK?::8X h PKPK 8 content.xml]KH L cQgwyc{ưg6H))$ˤJ%=,{/وCϢJK%"2HJOwgH0\Zvf. fW_nՇ?t:viׂށWE9LS11i[\ꊈW^qwL⢝Z_2)>lFdY3Pݧh;էPC )<|87^vlhԐwS]zy2b1r͝9)k5Eޢ@= u;m,ܽC9I֘߸.m͏L\4 Sp)qhݥ'^?lī_?YI`,00ϼUrvSu8@-*I&1O9-qطua9u9NMk~lsi!CYDyr. mo.Z2pکFਢQK] =O2Slw:1\+ix 1\gN}71yNFDs@\[R6C~# ;ìWr{wuwNu^uo!Cwq=k\5Ѵ{禋 ]HݓϞ >ÓtrT8-nR c3X`­z1` f^)$t&@>5Ov݊ '] :GEUTg0*[QZgPJVTU EJ8gEQTɊ`U*=|I^mM[ܷjNf2m}Jn}ZO ~zU"jD3=:Zvw4rZFlR],pA}Q ߟY_%@CȽFY(QVz2zZFYRVU UFY(he-/ [F crEqyC-Rgv.̺>+ŁE߻E*q7V2^K]&g?/8HKFߏGeT\ԨLmT^n Iua<0o?P{={z&ػo?".BۆJo(0)C 7PFPzC TJ1PzC韀IJo(ҟ7RJo(RJLPzC 72PzC 7P'`RJo(獔Jo(?2PzC ?o 7PGC 7 Jo(y#e(?*Jo(O 7PzC)C 7Q)PzC &e(JHJo(J/ 72pz ?o 7pc 7pz 7pz ?3 ?ӛ5pz 7pz 7̐2HNo~Apz 7pz 7p3Cp#9 Y 7pz 7pz )8}:&$f!^oLJ`w%BкS`/G ZK[Â}aΌY@)a.l}vCV[@t]P.GVu=кV{uϞq` G vC&9^<ț,Y0ˬ`54&Fɫ,"9"HyTW!D_FeB#ۉv:h~n{m'1\l2}w^|`e<9"j^?ޛ׃7aDZ`~:Ĝ/jV& MbhɃ pmĵsne(jdv9Dv! mXh;oߨ׃7ֻ~CdA 3CkZ dDlhd[j:f#ىl4dvg!;[6;{&9l#9Hm{wFVd%68|OVí㴓th1a]0ν xc0 =ޯ:?0ӈZs %| -Ɩ,W}%G5*b%,Y!>qRh@ߕ5GǥKYc",k,rD{y, ]ف %˿/g%pR':FtGzTB5 b[ЛvZ_.aϮ8 l oWWΈ4dI=Cl7(bts.vH@nIX sgA`?Sw!!lKK" a{{pꙴ0=pV`.sxmIǿ&o D\*omB^˂Ka${ye &49_0bL{DΎ^`R 24sfpL ,uP(M[zXV=.uxV*1 kɈv*&QMN-.Њ䍒 \yrq_v)&.!I/w%1-%F.WS^(6%PPj 2d\3/bX{+1l{f9)r:.F|vi;Df(=Qa4j?u!(~ !?VXt\/ӭ!>Wg5ٱYmJ3]ٙ3SY<)^UDg9He?(ۆYM]K?B/z@Z ]5d΄P!1>fF@#dq8)D UGC+laJBg<[ä-ɖ2.&h}LSQeROМw3E@1Yhs_`%8MTsIVst&[yte<۠jHE)ie\Mq +ʫbN`/>> /t<-MX+Io*Y=%4B#dB CYBK>Nd r?x;_~lEu:#F,2/`运鬬 :Ѯ8i'GgpSLlPsn[0gWisB#ThF~T#M7g9y1X5bd Y^bpNf k)$(8&4CrZ~| 7!. :+y%׵DUp0i~c{x/fē7 ĻUfLwL4Ӗk䠀) Dd疙ro۶/U% VNGUN®j`H忭Ode=*E塓g=4 [d>G :8Mn]%h U+!u'dbA^[SWE`f 1W٦.ZG)ZzcI$Ul=pu[,!̮T.&-D9^-(Yຒٝ:doRg͎zج,I.xB kZuCH!?衎dT^ԑtZO6Cga^Yp t Bza/#<\؉]>ـIX†ssA]"Xe,xox5dR- zgX:n V )Sou*zUq.(,HEUu# ~r%7*)}{Q.<`r.tZR&9$RIio@eD>S,\d-k9"dr$P? v@r|%FW܃V=[c8ݨ;l?G50zҺ!u,htu(бq\+QӴܼ,`IؽS!|8%skɑIjo{,`M>BD+q˾ϔ{ )-eQj>: jAZ3+X4/dO-"yR(M{{kz80O$8*ߒJ6GPҏ3 rߜF[1'9KM$փsb,G >/wCɻd:>J _?PKwTWTPK 8 styles.xmlZK6W*-ɻil7A^I-TIʏI=(K4pAypt^9l'RQ7A<H)6eb Y" 5RĈ0WkGkUk :YFhsVn**n}iMz-/J|*lxNL>*v%(g(/ ׺\pBfaZBKm'-_YIf$$T-S^-M5xU.&ɱ޻t{R_:e'_ł,ex{J$-'qBp]D}=UH=ʞ`Řр/ `V^zhrN@~ᄠ$L=v.ܷ&xGmf;G & B2duAx}G 6#>-JKG"HuF;mbPF809[:@cIM{ 3X1Wy<R0Ҥx8si =tuW)e\C$.s oJ Yj m)nkTWD&w !Έp 4BE*qeBү3úX^eɐrTY@u\e幻[q$ÎpbD8VʼE 50MtC1@+D L"E)1gY63EZB2arvnp{ىu"cdf"P+ k ,8k CnT.FLPkjcLKƖ:ْ@kgroZ.8ʊ'FGpt2TK8iR WMjEX|" <TƈQٸ,d7ma$9DĿތrsVȔH\Hj`4~Hr+_)ѹ L?aI4x2~Y%\ ydnC(iW ֶBkӼ6Q®[h:\)Mw''&kT愻kpjhChpSOm8ڨGToq%,E}X GK[hakFsqfi,7qIp9Xvkv,Gj;7D/f//F2XO`IiO红`V"] Ѩ;ԁti<~+Qˆr>~TK*InhTV*?cb鉄bO蓛3B+>!mv&1?K 2in$". 8^FqMAdTLﮍcBo_ѠvSIFc~ߧ^*rMKz G>ن$)j)?uDdvt~WE9 HSŢ dm/3񁥭YD{{ȞZ]d`Яբ>(L[tM V n]}"ō⺻Q\7FqQ\ŵQ\qI>Z.4QvhVIZG|2a ؆.6koKK{2Кk~0'@:Qo,!OӾ^,ƬS+`&Fy"O]&'1xvi^yE2ISgmi88)b aEh6O/N(]©TJVcn/أ SJ&; `,Ä;q;D4[..=$I%8U1U^CWќNEo\!~_w} (9e\znZ.xS^ymzymOϪ^#XuvOe5`{es4i Vq;}|:h{E&fXeX{\%rF,bʏoj mrɿ_PKjkPK 8Thumbnails/thumbnail.pngUTMЮ7!wk 5nܝKp׍wg\LwLwUOMu 'OUNVR W<+oG֩/R[mODPJ~yxb՘;JSI:"SSPH:K pEDHhn ‚_qc4]]&oƎϳ[K[[+Z=eb{AvDr4aGDY>4rgN"'}Kݢi!­$~^_5yM; sCrAq-M4-tp/KrJ\E Gf C]ҬWRX&Gr ,`"[*8Ao~jYXYx۲uO RF mƫrRLO(qyrŮMic's$ Yk=G4:zEfiWFvN4~ ` gn!,v/a'4 !ʸq}o]5g]ojPNB?,BN]K8ϱHNaVOh/OKݲueQˡ?=~I݌?>oV>q^гݯ{SYJ+ϖLm;U䐜Iä¶Bn|R4:?9d %c'p4+d,q$d^]tNkg獧&wFN ߢpYb9$7֚ICX:;k:fx\f)ʝwe'ع N|}A9_*Ca𺭟bKBCث?RޣU)Hƽzy+eHl-Ʊ.I<\g rZwqW4Fn5Rjit z%$&~F=8P22DBX w͔3&ɽEN!9Xh8Sc ;q2,.5"1˔(~=y62_D QXL=89|<p9E?[D{ƹVӁ:-SgraXs" C0& MebP`Z/cR#EFzP)`F_ ֋<1WG-`ـT˥ƙyܢ$%AX{(?`r- DOK2Pvv9 )HQi-P_vC_9{hj=W}Y& h| QcB8`u]~BxO70#:b*Lvrne{ X*Ps}x!4@gm{i\`+8[ǂb+-ʎװm)Ɗ;G)i=ZN7湵U1 vȆa{2`UQ!I=q6l5z M>{E>gU^PEVkɥdK B>,u( MB,Vy/mb;ĘԜ>U&}P|ySTBvQ`YGfm(&&m2.wB(ѫgBM|*u6QUK}D 1M hf}(yt/+.%n&NzJ#t?ac!r14e2 )l(X"!#45,y+">x􌡬!5$ؖL2Yݐ J:$t09#Imn [&H'^3U V>d4l_2c򓸙Vho/f)$?4~7ĵL[)U& Q>LxA>45 \CF#$8pq}=m':X0xh%ZWBW\VuILen_Σ;lQ;VUK -2IaR-/LWٜ dɧ1cka"\h,)OmxwpA*s+z_bRV80T*oп{gPh**.)Mx!Y)ћ5=ߧR9>1;U܊]LiH>nSl믹b\嶩ʙ.| A UvQ$EjϴH)1qh=%rrE#eُ\V\^.7`zXR]c0 Uh1tD!U}C x` г*]m*~ |]->uMks-xE/p22hss`ΞL\f>l:Ĩذ_n^خr :yE o o%XrMrTnkΨ>Wsk46I6Q^ѷ,{9g|ojU,+O vzޫa_\ +hlSx*3ױ`}L0*6ĄB]`W{zD(Wt7m,*e~*1&n9zdP_uIK~UE(M>/U ?9p4"TyCyFidX,zrvՙuR8^?dv)?p7X\Rį9IªCOV_goZv(6K2AuhWQbٱ'ZL'MA V 4*L2 $a'ANS/3mӚ[V^|e*{\ 8}YӅ2?2&-[D=r* wեW$'79-i*X[ٟؕ1ȵSzv O66,Rɗm$C= !VeO}GSϧMGŸVqṫ;|4J7LxG[FMA Mq 3ꖔ93|7r5WalIbڀYзo gmrQrYo7RԘAH\4A>N\?ҺYQX vWTqсR1ӎ[¬~z#PSoEC@ v1oQbu]8^O^Oh =& 9+[͖Ζv3GTiMe+=o7\c><^ 2 8[P@=ꔦlR}ʁ`I\ Y.b$Qϩc@ɖDAuĒv"-J|tC 8'5eO͏R*WR2^0VrqVY+,9@p=P(_ZM٣)8%~#ڕ*s[H7u7N^7bvw?♽fuFFͤO!Q\I{,I_?4U(7)OSxh$Y%N !8꣓ 0犍*{Iv*ika%2!p~PM"S 57#dV3{2vMUVaʘZ[|; N.?}rٻQbe;yhNdCfD[ꗲp3ԁ_~N K'Ѩ0+cLX~AqVC TVټ*xDqZnaCfs_=11#uvO 0Z}Yn5xv |7.7  >i)1>l oo1I`)J`jfQ9T(rMp`<56GL,7M]zъ=ٙÅ~ ݑUp$*$6!jp","Y b/P7 { 8/2"!}L|mnS_?8.:qKc*P>#0IIܚԖ$^|{9>5b\:({lFYJz\|q^l"{] R@ AezBx b֩odа]0sEںh?U`El-yU(HKX{B8(z, _Gq5}TW=/N]+5jdw[s1z9&5 |o=k-E)JYrv__\csyKΖX7{UXChFR 3m9!x=BxieB K"}3,#A@XRP򤭴"w!-ݓMTqӪBdh9gNH5heaxcsUrt%u׸8ا6# \ybn[Yq[I7foflDXݧD=o1]b/&9rr6I|GAFhAZR)a4&[VL1-s6N;1<,1Srd)$ҍr/&E5rS4rʏ*AF ]OQLIK?/:sJJ\@+ɚ8ӶJVTiGR\횷°V~Zo5]w>r_uDsm qgQw@x-pyИ!w5J / Mb}Y;T V qrXqH7W[;;76H<^P`F(FzYovNHWv [CNmtmx -נA|tHɴ}fSG.M:/ GiF-̐-t#3kn>7ѷ8M '+Dmc\pg";kS>#3Uwu6.*a9'JMОC@ Ƈ~I>v#̪D?}5WGFGuu{]AÆoU>GL l"pc2_eV@.db΃,( 2qCnfrϔap&Q f>S?s}ҸQǡQp"f{:ir%VQ:ÁP)auj B ?rZp8Iq/59\# 5enKKXEm>}rUZ!?ϙ:GYmNZ'b K?aֲp$2+qؾ涢D0a2O5@ ͐{[ZLG =VcT6ahOy)i7*ޯ,Y.3rI*‘$U9dTͰao/|&=*!ṁz P+wy)gʗvo`LQ#ZD B#J&V= 5tY8Of3c. g9φo0[ .}4Q͜"lKՓ.\ކ"?9f 76% 9q>ɐwQG,TV6/c@~2pNJ460TBcU`d0ž4_ (آ,FĢ| ` )]%k^yzǪ\3_;YQ8N^ /"*YdrQ%Xk9(rQuQS>&k`QBPD%GObC9JtmAaJXkNPbƄU޷s(ط7R7:aF^kBlll63uRm \VLTO/& AiA)DgJYi*hFXQ9A~?`S5SC tg~ *rc2{ xsDC[4@C8$Bax0T+P'eL9+ql} 3rs[0p1% 6IE%cYֶoDl`M|xntO&M%] asB C2gbyZ:\9$UrqXaBCTľ*'I$9Ĺ'+1Iwii}grc0@wbyp1ۇ1= ЦewمWn% ,Q=#{ e3!\DѠS[`!zzvJ?~lګĄPlٍ ~MQu8Z:4ƚyy\杘D^"T ʫ(/0p^:XBBS<{@? L +8I%UJ-b4-=y|umNu.Q?!Ƣ*fʵ NwB n|l)?H[LH5/og`<bP+LJp[/ f@D ro/PA);Z~4" 7r>hf 3;RJ!LQ'iH,Zd!z.Ds2GJ`aoJ2T pF$kvRD@L~2S*oѯx&','#<7Ĝ4Oa8_a6kdKc#|IUkAǢq.9XBCooR|Ԯ紌E/4dJ&ʱlGtvP-M%?ԩxTPA 1p_~31h7,PV%I΄=9}틡SY*$ig;Б{q?s3]OZ͒Rs9fcSHMHya֛Bs9e{{% _ Vv10,M`P.0I-NQݑSbP5#WPNHES gnWZ:sN^ E5[la^3KEK'Je `Gpu c}jv =h3o0'_;jcr?^dwqhze'WBڬ,~4A H_(5?ƈ]dt׆zýg7D1\;˴?cyb2d2}abQ0LmAa\C5.=aIWdܶkͳ!rZ{[ߥ,{rI+S^~/ *iTo`1e@Ϛ"V񣐍t]ĨzfG{i sY'ߚ.0fQ:(ڰEU3;m?hگy;ɤW K Q #0hb뾸Ў($ɋ%DZ!ԇr~̱:9[~!\naQS6 |uwR~}؉J Wf(kKM&҇n3&pI9.jcRw?i?\NoAB˓f.]@bmnD'p?i;f~GTZ37` IY2GJX«|<;aa,Oj/ zpe*.י[kO%2m5PȀˆ˲NTJ+F\Jt'|tU:Y'f{n/uˎZw"?u)\Gs#&=VM`њ垎_mwbv ܕoK[4c؉qsH /jW[ĐDKtTl|Ww,U|HVf,ġ=,1C]l>LCDZ>`b]/s +T CG3O/ڡQ:O5܃l-õΈ|'H3 TYHQy!lpg/jymQ-cL-K< XΞAT؏s CB:6 e!/mp_P^3}Jj?yet FOCS--n.珂*hRS&wcԔ ɨzvIV ֩@7u`o~a=3m72A\j&=:J(?U'wz1vf;ۼ\^TTd"PtMfHx]v .C2Ư`8$ʢr$j{߹[tG!whf: ]5n' \D)4*ob= N#D>m2XChɋ*[Wm/7eqgA1#buYHIC*0eyOhg{cbcN0p-#i"^z$rmiS)[S氚#xrob(/%+3?(A{%+1bE;hTMyݚlONz,{e)G>msVzwjlQ!˅; }ΟW9TUuJ JղsY,\~/{wxǮfW/Qz$᳿zGgËZ$%ύCr*kfjُflYaf9rL`(>5FUX>&\K"G(e7˫ŗWY*9()LXVB,&^nkp)mQdW<>_lR3cǯм)q̔ʤ)w˰؎SWc $eʝ`42Kl)1Mu)$Vo |ղ瓏 A%։:*kRMֆ"p~ Mةes5 R@%ӈ4&k(=8YxϝލS3X:!Juf2[f(x;|1=ĢiW=񿠻:uGDgl30SrGCrRfݍLTCP,a2+ŢB,IG4;_Owtא!^)->wHש.!zBpI};'Oq.~*q3RAaFNpI^;gJ,Mdr.]ye"[Fz6uR~?= ܳ[o\3NWz窅eHm e5Oh.Ԩs' 5xiY؟kR(8?) J~pLCE>iD&r\sZxNQ34su!dpןEd vP]"1vn{tLm2Q|^ >ܔ-6:[fA쌫B}R DU*?QӶhNcm=j(h_i2 Ulwfz] QҝfDMDH gֿ/LU z++X\C=N9Š祆4⫵a P!w;UJ Z`cH/[ :Ksit['OCf,4Qpw ig_>6gD7AD[BM.iMT}Q;d7tq1a>il0hH>Qz*WpMݳ2|AxްP m_la 4mb3ȷ꫒ ]19 Z rFgH,7^__q j#+gjނ+>܆ـҢ!׽{]年;5zt&?quFL+k%%WSjz@GqSsd>~kx|Ca93?Pv.1/Zv0>ϧu$%Dlj:OGmgbF'Be6gNq5N zez%QKWs͞^470P?}3!S;C2+$=c!2Cɰ_.%YHW Z\ev0/$,+YXf"xo1e>(4}{oIJZ]O^QPYaނ:syfg ؋Ga6# NYِ7Ol [QʦG2eYڿHGM*hj͢(ϱѾ6V'Y5XiJQ@݌nCx*dd1,#h/0TĎ4H%lzN@l>9)ejqPK ߋ88PK 8 settings.xmlYW:~,*GSpˊ\ݷk$xl(1 _ˤ X e &{6h% xKc2\Ν)ݦ8ڨ1  c5 B9R!bIG.1ЉlM/3^ZQ=ݟR R5(gVO긓yvkKÝ1eԊ6#`|o "^яЯuA s wQE.WA6zsq-̪b.,1*fS/bͺg6Np&'zbx gSplC?-r2^`5VK7nЧ'PK K PK 8^2 ''mimetypePK 8MConfigurations2/statusbar/PK 8'Configurations2/accelerator/current.xmlPK 8Configurations2/floater/PK 8Configurations2/popupmenu/PK 8JConfigurations2/progressbar/PK 8Configurations2/menubar/PK 8Configurations2/toolbar/PK 8Configurations2/images/Bitmaps/PK 8&&--Pictures/10000201000003790000016B51FA9215.pngPK 87Q%Q%-#Pictures/100002010000045500000332A5C6A400.pngPK 8?J11-Pictures/10000201000004B0000005DC7D79E82A.pngPK 82-Pictures/10000201000004950000037264BEEAFD.pngPK 8a -GPictures/10000201000003ED000003BBB7D11F66.pngPK 8Zե__-jPictures/100002010000031B000002F3018B2D7E.pngPK 8  layout-cachePK 8wTWT ݿ content.xmlPK 8d  j styles.xmlPK 8jk meta.xmlPK 8 ߋ88 Thumbnails/thumbnail.pngPK 8z!  settings.xmlPK 8 K  META-INF/manifest.xmlPKJ Kst-2.0.8/devel-docs/Kst2Specs/src/resize_window_circle.svg0000644000175000017500000001345012277111530022747 0ustar synthsynth image/svg+xml Resizing a parent with anon-fixed aspect ratio child If the parent is resized, the child is rescaled accordingto the new dimensions of the parent. Kst-2.0.8/devel-docs/Kst2Specs/src/MultiPlotGeometry.svg0000644000175000017500000010165012277111530022203 0ustar synthsynth image/svg+xml -10.0 10.0 0.0 Plot Geometry and Alignment Requires Large Label Region Requires Large Label Region Requires Large Label Region Requires Large Label Region Requires small Label Region Requires small Label Region -10.0 10.0 0.0 Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region Requires small Label Region All plots with -the same parentand -the same outer box height will have their top and bottom label regions grow so that they have the same height plot region. All plots with -the same parentand -the same outer box width will have their left and right label regions grow so that they have the same width plot region. Tolerance: 1% of the (Width + Height)/2 of the Top Level View Kst-2.0.8/devel-docs/Kst2Specs/Grids and Layout.pdf0000644000175000017500000007076412277111530020765 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream x[M4 ϯs;%W삦`@Kn d/%ْvU쾄B3.[֣Gg?o> ~O_9߯}X.ɁL '𧯿|`Y:+\i=Ou[1}Iحnkx#>ֿ|F;_ Hvr'788WP4vp19I s@ {[?[7( qȍz 26Jj J:A.=^3+hgˆ*AؼX,OzQ{BpZpKe,_mp2 OE .Xpъv>vUJ]݊=FXgiaNoพ5h~)I)pd:q۰6[3e:׵K=$?ЛYAH7mHapEc4L޻gFCQR_ll25$~Fo~Z1MݜQ9vG70sRTFS~J^;!GFYNy3rো6ڤ#n}x.;#=G'ۢ񥈋~q""=ʮ3W&GoFx)'mMAu۠xZPQb@<́ 4e߂"д-J3.==&Yl udRƌDϗZs4RL;D8Tu~$@49,hf5mk"Q nIjܽbX~$+rP(~K|3jJPЇ(=ti2HK.%2#Ũ<1EZW<>q rStx^%#ƕ6Ùc.؇WL 'bɰzN*6O*#2rJ(bCi?M,i Pҁk;d ZeD@-Y)MNB]T6cy9 TB4gf]h!'"Ns,t+UlD징k!>2jɓce< CHٌu ?Z)L$n Ž_&4GX,Cx =:¶G!7AS=(t?ǽr+CKC\(6 y>i#_)]w:3[֢QF?^g#p7̳3 X,+j<2HAp)f%r%BT)I / `/W`|Jp.wTt]XU=$I\Д,#!"n Zv"Ts,uyHmP9 )@UBDhWEiy7b%_ctkPIӑވ\.ujƷ$[ '_n9UYvʄw+o]6'K#<`")猖 F/34,GnCvaJ+!b>c] + Zef !XNc - vQD{٘Nho#^B0r:ɽ;yݪJ"J,J:3g6KQ {_8 kExSnFzBmiˍ#j܁T8(jT )C1tvuM#B?(TܥKz咪 I]҉2*U܂s`'fckۛV.ejq` 8S킏@etu~<"\|-0AqeEh 8TjY nO479%4uB# am㔎/dM{K:SՃN6YΗɗ9hT#<tk|q/[5>9;hQ21|`Y5D۸V?YoJd=MŦZ_sRSd"T^.ͫ};OXk唞cbv wjkɞIZg0\HZ/m;<(J.]zd|oK]rۥe:#CYB>9&PdX@=7r4-c兮v/s^>.N%4{D >4*$OahlȖS(C=;P}foVضŊ#RATqH.;+C@u& dޱfqP߻DoՉHRSW\)3T; [Mw-Dj؎pvSƒ Z .GuA5G=μR!+͹uGY4 @&fPp]lA:Bu*T9M=] :1~ nV ː>O-SNOC,@/j0j>[F`EqD}H7z.6ր]y'k}U7t\ Ng endstream endobj 3 0 obj 2624 endobj 5 0 obj <> stream x| xTչZ{=Ǟg Iv$& L"IId$ׄ$!A(QGPh5Ӫؗ|="lޓ{wwNk֞  @z9z/t;!>;z-BD掎ݳÏw=$!}&wDܧg؃2:{[Z^{xD'{m_'x> 7ó ^@BDwK,*M4n9 g>s4Z`4-Vfw8]O✤)5-=#3+;'7ow6I\Q BntlE^G/yG@'q.qCbXjez #è8Nlk4:N 5ZدEϢw(~ mCPzJ- ok28R,`?\@ZH;^r8Y ;QW6*| 7q|6>t(7qt G'# %/kjLX݆`u+)jP FCCumI#$sՁquZ:{٣$jqT?nN^TO֏ sInLߛ]UNIe>4WṾvjQZWU6r<*8=yOO,tRmv] O2ɅsB-;YV_^0Ռ`V%Cg ''\8#^ LUu!K,\"ņ7¢iոz q| g,lGl/؄%ŶTW:0^j+v/[r ]q|OM]4O\ Y,N ֌vȨ9n!x԰WDksבm^{=l sg&Μ<#B,9{6d+OlOO!q* s1pI[.`}uVz>4ǝ?vToݱH_^qW^{b> DΗ\H0fC߰5]=ּ9"0`3&'E`/-٥$_$&zɽz3Q짺 -8= \6-|ÇF^X?0wZwҽmbZ~{)Um<ח;6$CFD]mZ M'-cpJmBp,r"yQ][ <>>G|Opܾ8_ HsX8mf`[:/fYK[u.A36>Wg])\Be\zs;4.#uɘ%IK&c$n-tDvu3fߛݒ'MIyV]*gEy⹉g&iԿ۝ŕBLkE˟`eקbѷ.;%[NNN````ސAڐ!m]]Ү]iL;~,t,Xڱ$ss>zXc%|_HlD'Z\UqAGq.UyNw N.&=-+[6=s_>t[`txk?ڸyޯ}̛QGy7]Q#Cs}4fҌQ׎'W;ܤlp7f2br"}8p|$'|1N?3|ke\$L7 |6Ƞ/-Φ1N}yԊ[x/xlSX9s̅%43mH<[$<,yGMr?ܞ8M)>ʜ`V ,*aȽ=*?XpÛX/w=\i{_bPdd;=Qfr؋+ Ҋ.P'.L3 10 p) eN>ŏh}Dh/͋.ShmhTbٽ.d9C^5l@g>=Jӷ`Ϙ(dĠx\#['+[(n?y;s=]]M.B/w\/O\e 6:.ҢkOKeo(L)~w'LxɁ{Nay4G `Vٻo},MMOϟ)p }ZzW/{xJjŋ4t?7vv)`3h}Һ0Cs͢iԩ;dћ>w-Vm޿£]T'O>rp-\GQ!5eBb' ;:p7[7 ­dQTȽZ^_qP9"`OsW!ȗP}6vf nKNk4q:p>jDR\nWK\vj]-u.O9&\d9jz$83U?iEݟٹivyTӛ1. Jd< TmYj[ֹQv;,Nsz7kB$zccvY<d3M9lK5K̲&zKe\)YjRe]֓ h^kYcmv7'4{pE:NS'nA7ɍ%jQ[Թ5L &B{{{M{{,\vyv%^OAc+]M$1>}\sG=pܭ\- R%{?ݭ-RȊѤCZ~ afҡyyd4ǚJ<y4itGvqrAxyvm'\gmH%|Cֵwm{;cٛ<{ΖMM'c^5SoA㲢MEᢻƋ:xW}GXWMqoƟ*oW?>0ժ%c2w%#Nsey(p1np͟6%۷#v=[#^WV-!GN/F$PӒG%^OtPFi=P-$e 3'آgg‰fc;_(.N'g/Q[ROt>^ȉ(p˥cQȗ,ƙ>Ν8C%nˆ7|F{J|@1g6KZ-LhA_?6@߆ϡ.zƌԠO8}k(On׾[wz'p| _UP(ynFy5t_b ds fbM邺5 .eYGp4zN i7~IIFuj3;3 ٟY xo]a}묇ENu'gw-EuJ;UG8fsSa]p 0hln݆7N-xIGd/=SpTs$= L*_]J~>?&,k"MXz.έX=,]5׽Z.[im֭v:θam'u^ J0 fY4VԺzatfExW;Gc1fYr U:\wA|||KX(u-KW*Jz::ZkPΚo[Ag%q~aqTbbrpK RM.V_m>ڊk/^8O={Rx~軀 FM]~b/`pz>'z-9|@$j-ڠ6L\`s)ڧz44nÈnC/!  ؛+# a#e0 PI{Ȝ s;翽|.sўӂNJ zNP-i/pZ1kȤ'M9,f( [\\9[*ϭF:u[6V|һ p|<=4P\VWaruZ!aXEnjjFK'Ȭp ^!!Ex QckIXha&el\),:2~Y8:+6ڼl~yn]Fv^t-n_)3>*5f DA_u GPķ̱Bo:=:Ղu6tuxXrq1K%LZ8mmZP!dɘ%6.qw~'/v@7w!r6`mLB0._BY5ynTsH? &QZPؗm@<aRX̂̅i5p^]b;xQ~ HW r⃾Ih2r̙E!ѷl'rZf BNh2 g!V=6 '}ݾN"jLw ~[yidvåp)F%5fXqK%ce5cdZ: uz֨5,:kJn'N(Kʂ"|9R]M6-0Wj\-'U|qҕx\ϯ37]od$nmorlrnr rAwv}n Nketr2$ 4⍶g3};T5MkG\xnzoǏ?r{>}RkEлwdn}sӵ84(Z-C7Ρvq^T1e//o/sWϣ_l` y9)rȎ]hG@=U6NʦDr!Qy,Bݨ40M:‡5bc/x f8Œ3'gQ;9s$sM9͵k !?b"\|[9w8=;mG$ǟ&u g| ۡC`#jSQ eOJ5tƣ19 UݝT9,}3kڎ ܱCWzK7N&(2۾~ã=㛊{ݻ5 }gE8?8DocM`t[2¾LY|[-v #K&idYGی[ ֔.,)]Xˎ kk u^JF4hºV9=@6-RMEJ8YT3-~aFMO/>b]ZΝ ld^ˡ!L ^g>6?8x{ˣ`їI4I[jSFϢv t-m&"a--b!)p8o[Q_KX{]yRxnV8_ϵ;#B=,ziV6x?5J|9?ĝ@o\ih+ .Gzn "7w%#ϚfDsN{LtxC1Û?5图cW2s)Ӳ2fA|^[m窦Uňi6I rgÜJP1TFuøC [ձţX auMul_cށJ51F91 ꘇ/ձ :֠B[kQJ1ul6^Rf{p@3*JER눴<D^Tז/H *"5#`  Fj@!=A$(]U:]f+RtpNӧhQAp~kl!-6$el0H$ E> ҍmW%߈pk u6`BF;R{<N'UQ\@H-zR 6PO0"Plni`@80dh!-: 2fmJd8 FސJ(x 'Π4 R$ic;ý@>8lc ,E^)2lE==a*P[/rDQ65<d2(Xrp Qf]}@Y"~5  IY3@Kё`ؚzÁP{:' @x80R`$MKm$Bw8\NI񺀢4ϕ{b|LczF,Wq "T6 6ivlAJ* SFMk;P¡)ւ[7 2tR?}}< Tf4E/l$C/,1u;@4ǾT5$.`2ӮRZ]$5jZ[P)U7J +*+FxNJkV^$DCY]ziuTV^ZU]W*7T66JJ+YSQ]BZV7I5յMi5۪lj+Wc^eR}YCSu~MCJQhJem%Wׯo^ `+55UT֖5RW .TL77,W7565TRXukU5UW(ek*@ZTQV[qSřVݰ+5WW豺AA5u׭ d$@2qįq) MSnJe Ս.'2}RթRѹz@ݪe5X_[ڂQj+I%T%z*xE2dž_)YnvU0M#P$ B&Д1Ie8a7ֿ)(șbsvP c@ R$ FՒ<%T. 释 kP_{xW-(KRCQ?A(n'a*\AG[a Z0Q "?E^F}2pESA3Y<jf~5Q0W1S A9@OW=wW+䧣( 7a. LW[?g932|eQn) g8{ z '[ u0J}rIq6Ay9/-̸cJ! X'PiS5e\PZaF[=B+ vޗ')îto#6WCgJ+1èٍb8M?FNL? A47&A\+FjS2QNt G5fJ?07n3Cǽ̞1[T+ϑ;%g`=SCVg[iNʣyݴDL_B,Agb4N5m 3ӏafBmvqR9]4MN?` 1myiZ }U#"2 6/Zf~ZfMHM)f%g 0/ Z0#v (hSLˢ0b:(Q5)3 T}AgbRf}34pTNun`F.3/R|8FrET.0N_t.Ǖx6aB_ d|Lye,n."A5gi~I`ӮPӦ|U޴˘ uL*XWdd(P8*{=Ц+&ԤBzT R]fVVi,.>(72kM0lScxca5L2ՌrFHY30*L_n FiİͶΕ#FaiA7+zjFj&k[On9Z:ZTl)OKXL[>Cg֯S[>e>,+TuX֪a1;QsgW `Tr8/;*ƵOt*Ϯ3;uf/ꝑsgvJ6^`{/UR@3{/z'ӝpQrrV XϮ􄑩.E#NeNwt f""٠r\Jg6R]~bg_2QK t~Se/AL/wz 1 2_;biP ˬ>}"ty_Ju1j0/ 條W͜v~L~ Ld+>~"l&/- /fS ȳF9t[pH&xPD[2w9};rߛI|P8 {vd2dI|]r)~,M{yQF`o{3^qFg;d o$=מLrnp[2SKn w ɭnrAr2# M,MEdܸ* [d -2<$ aH"sH6EID&2o6ˤL}|x]*uޥ$gm"> Hv'gL:;6 ϐ|G{бtLy6i_&-l'7dL\l N&ke Y#ipHjP2rRc$HuN>HVDV8HTr2T;nR\dyQX.2^(3eR~\)\,Yl8@څEIBPj' md̗IND&W; ;HUz@\'Ba)w l]$?O$޹N!:\HnN[FrB ld-"x!s#H $IOӑT)^HH Rl$el >>)̱ I(<$&x8Er:W7q:I> v?Cl^LDˉ$X M21ƒѷưD :'ڈF(4ۈ"2~FdO}xm_B H endstream endobj 6 0 obj 11743 endobj 7 0 obj <> endobj 8 0 obj <> stream x]n0E .E qJCcǀi:Y]5%޹J tapGfaNlN9st'VL?tgwi$uv?U{9ú[ ?_C\n]M4)ykť0cʿѵJ7: ?deYvM|^Q2x~!hEY'pN.r-RY2pxy~~b\s߀d녬57W\_kf`Kf` \^Kj ^ke_֧_З]_Ձ5z/p^_".|%ޏ_Ћпп,W_(??\ZNRgk> endobj 10 0 obj <> stream xz xT{^dIH 01 Ʉd$DL H2)&(ZE5RE+葪,SlV~)U/lg2hwwo_vȀF>_FBgb#opwh}kNٻ7}_PZOe=PV؟Oj-m0<;}#>8d> FWY8cY*F&`gj+=#3+[͛al#Y>gztl|Cmm@7]3XAg3;s;+,Mh:@ius۸n셕#{\{dT§uT}1to24aFhẁ}Q#\dwAs'0B1]Z{*noBSؿXMb@,>3u"`;2n&_G/P}0oFOoq9 ݤ6LĔAWHv(נBv0ˠ"Q8uZ#՞3hTqt_ri η3|q.?ïpnъ5w5 VXkYC2eX%~-Ð1pg,X>76 ΍,9KN7#8}ciªB+Ue`,T1Xvߞfef5`TNcpi. N 񋋖'IdL1Zk{K^yE"7;|'Xҏ:EfafzO̡73L`=U}$o,׃SjO>Jh67XGR [jF0҄KdK.^tK酖R1Ut5nu T %rX9eD̝oR5GD#,w͓nʤWy^9屟7jej*;#ZIOh##aĄVf.Tc R%c_z:>q'Ϭ]3;쪼&+U`s灉3[Wz<<P3ȒtY#qr 3$ʍ%Nw.҅ cľ~J_{&ʯ) y• El : 8.~c_`q{04B`.3^~왏?>رخULCʘ ]s˷ mn&&JwunX31̣=[c 枛ͻ~W/9BS䲫NGtVfF#\oX2c-]*ʂr_p_@< xIQ*U+Zf+^kYpm %geɹ(HI-I۟{];7vA[[Ļ[+R^ i"pu^ƛ{fY csMw"k~~-.hKuRCcY+FG1zb_"BL>l)QȚ,HKe;3PFNG LS)flzA0NTzlZ;XIgf:S6Y*Ҕ\L\y4[NccN )zn+";7jL؆l؎riN`#%ߖo/+iڴ[--- + .SY1[0TY>һ#.ۄf ҼdL0v|2Б e\y,6GFS4Oں4p||$n|%oX7mMנKc\WI>$&fdh5S(RtYzD p,lh; 1#8uy 'Xn׺;E[8,JgXq\zDF (8/x:;%iuA# KKJk6vf7ΉM1Ǐ@x2:AF8VxȸRGRFׂ.3N!4~A8} L2Q0a62R!ۘvk`^ .+ǡ0Lfz^"_}t^z!61Ƈw~QT"UzrB N J\\Aic6Kcq1d2!rf\T觞[Zfi4jGJgժtxlݦRsNy9aβMS7x -$K*NCTLZ_ĝ.YwYTkcrhxNݖm/P lm&W}k@EٶJ!C(.&#nv<c׏NSҼ R|h#Eg➘ggj\~O #F4K4ݮa{(S%ZUӝI2=Tg 'gOfqhT5ՌjGugYYYYY\h4g2|CqD,"\pM9W1=(qkc[h~mMPܣ+2N*$?~O+@D }}n!K=:C8.?#һ9EZy+ c ϳc'۹362A6:}-^G*1x"*h ¹3 1F[9`ʙx4#OL਄XD@:Yu#;#mZ戉)C9ZZ0#RQPq4$lpCE=5IT(3K.{W&CfeJ?iVx3zoO,xW4Ȏݱ]?~foFE()<#La;6y{-SgfU,Q璢\& 4 edhtYbi[DuFii}Jr~${0IMT9o~d޻䆉wSusN~Xr+&R,Kѷ7i^~i2bȋ5x]-=.iwP_p#8wR2s߷'>Kwm['l@֫{c>6$嫌yϐ K3춴m2*.gF^+$I6}q]̟չsO0O#f!/^9)Joܽ@z ͦm֪qVXQ>7ER%n8G,InE`0HQ޿aī|yBZ-c0/3arICA֕ifm/Űxdch22&蘳"6eM=s-ynIbd3k1bPG0 fѠiffU倴*HT\.O^2Am$eBMgSLj¶4*VcHCikҵN}IH)` 3MyBԲxiٓʬ1`jJIb:AaGwOGcO? R&Y= WkͱFŇ193W2e&* !nxj{HCԴp|Z=fѴ͉Wolv\3)U٤#ԌA7lBYj,AF((/! hŜ(d;Iq49zT!.Ր!ZNQ=jmte]&ne~:F}x,v0`|iLfz;&NMS^ \ewBD Tz`4Zo4ft X*̎9tD۬qfF-;3oJr˙e//20XN\uTCylae}3eL5j5n@7h ătCG [{{K>rBL*ї_=u)ibݲ+xZ\06!T5T܄%jd+BZeWݤڥڤ.UWcV[Hw~O!bXo8A%GqsA˜zYHC1hV7*cX>}2VC|Dk RQ*X64A0B/4KSH;1rN(cƿSԇ`|1P/|D"t懧l.2QZ(.18A쥰Wb- 8I,s!EJ3 =?ΒFƶ$R䷉#8W[O)>%Mw p֊(oAe?=" `^fw"O8( Rڲܝ eq Zp_Y&pR ]|u"de)O7z8H<h ՈR Y w P>'Duni|5"j7b^8Օ==@ѵdS|Sv(:dGu:(. 9r0"4G&pNKלm(i^7)oD! CzkE "E0~L Rꤴ(EmUNkI;$I-|9#|TxLj-9$>Zf&MH}M f9g-S巛fKD/ }4 4㙍U"sKڕdd%Q*KE%6Oz#(k\^$ptELɹk9SLx+RlK& |M_$27oS4JE^nM=߼[JmSx㾳bXT*FJa)#Z$O@6'Y؍p^C)UQ\U8ֹw),y)t u먬Պne>Qj*#*U|nr'-P|W'l un^e@cK[ZR|uZgS8728Tpؒ;pu'SoJrBMErnre geo䪜kJ\OVjDr\ wњ] #*EGJe ݝB$JWl@91\gh@Eͯw!zTqTR| ,YmZe-e[S{+@5LboI tӽiV>m^OKx'>AWy\8+៭oK oo?O($2xt>U'%_2ty>Q<ܳ?v?vϸY~!#<' 7>jGNjCY ?#+X&~t$~4?:c$~avᇌx|`-I<P>ҕW=W|x3~=~}#4I> q_w׎>{w#^7ޫ{2%|7{;ߕwdySwl2wРzv oV6]n;omm'mC\lk>[cnk>޲o7x \Lp0%Ɍ7 q`1pKO½޸o ;. {܈;NbvN·z3V7YpL}.^op6=nmqq 7~U>n2 |S nG7uF~e^|<W~v\g˗2Z7x{epTz?^<&j; q'x,Yũ|/^dE u"+^.0n 3^0T|?f&i3]hg¥=_Kf% pq/s,Ypų 4L\hąnL ?k? k3-x+|@ϰ3 q<$ sQp'ja7{6Ȳ;ˍ8S%L)q R ,lO6P-[u;HX6Þ9l 26XX5j96*;upsCf> endobj 13 0 obj <> stream x]n0E|"L$ Cb)R1Ȑ_ m.@p6Q57<ޭq[o< ݫe[] Ytc{ۛIWx&ve}`+ s}}v{Wx_'!%Q< lknAP \rgk]ThY8$B8="1r™9%3|A>rĵ3r33µώe쟢d%?C7!ղny 7oԟctP2ԟ3l9OByO:hq~FFn\h@iNpBz3<V endstream endobj 14 0 obj <> endobj 15 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0"d:yf:BP|AzjkqۿsTw> endobj 18 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 22 0 obj <> endobj 23 0 obj < /Producer /CreationDate(D:20080627214547-04'00')>> endobj xref 0 24 0000000000 65535 f 0000027975 00000 n 0000000019 00000 n 0000002714 00000 n 0000028118 00000 n 0000002735 00000 n 0000014563 00000 n 0000014585 00000 n 0000014788 00000 n 0000015282 00000 n 0000015632 00000 n 0000025548 00000 n 0000025570 00000 n 0000025774 00000 n 0000026224 00000 n 0000026542 00000 n 0000027203 00000 n 0000027224 00000 n 0000027415 00000 n 0000027707 00000 n 0000027868 00000 n 0000027920 00000 n 0000028217 00000 n 0000028301 00000 n trailer < <4B0FEADD998CC11CA3000F7E4BE7F1BF> ] /DocChecksum /2B298114E92C48373BC1E71405276B58 >> startxref 28488 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/FixedBugs0000644000175000017500000013503012277111530017030 0ustar synthsynthZoom Mode Plot Bugs: -Zooming gets slower the more points there are in the curves. It should always be fast. Zoom lines not updated on or what happens: Put the mouse in a plot and depress . Nothing Happens. Now move the mouse. A vertical line appears where the mouse is. Move the mouse around. The line follows the mouse. Now release . The line stays until the mouse is moved again. What should happen: The line should appear when is pressed, and disappear when is released, independent of mouse moves. Tied X-Only () zooms adjust X and Y. What happens: create two plots (eg, 1 of gyrodata.dat col 1 and one from gyrodata.dat col 2). Make sure they have different Y ranges. Tie their zooms. Now adjust the X-range only from one plot with +mouse. Both plots end up with the same X and Y range. What should happen: Only the X range should change. Rotated labels in boxes drift on resize... Create a box in kst. Put a label in the box. Rotate the label. Repeatedly resize the box. What Happens: The location of the label in the box drifts (so when the box is set back to its original position, the label is not in its original position). What Should happen: location of the label should stay fixed relative to the size of the box, so that when the box is returned to its original size, the label returns to its original position. Note: if the text label is not rotated, it doesn't seem to drift. Label Parsing place a special characters in a plot label (eg, \omega in the X axis label). The special character is not interpreted. It should be. Note: it is interpreted properly in floating labels. Plot ranges don't update. Create a plot with a curve of sine vs INDEX from dm.cur. Read from end the last 100 frames. In the plot hit 'm'. What happens: As the curve is updated it dissappears from the plot. Hitting 'm' recenters the curve. What should happen: In 'm' zoom mode, the plot ranges should dynamically update to cover the full range of the curve on every curve update (As if you were holding 'm' down continuously. Try kst1.x for a demonstration of the appropriate behavior. Crash deleting last tab: start kst, and in the only tab, select rmb->close. CRASH! This is especially a problem since this is what TabWidget->clear() does. TabWidget->clear() is used when opening a file to get rid of all of the old tabs. As a temp hack (to allow file opening) clear() is not called on file open, so all of the old tabs linger after opening a file. This should be reverted once the bug is fixed. ----------- Editing a slave vector from a vector selector should bring up the edit dialog for the provider. Instead it brings up a vector edit dialog.... not what is wanted and won't work anyway. (cbn to fix this) ----------- Editing a slave scalar from a scalar selector should bring up the edit dialog for the provider. Instead it brings up a scalar edit dialog.... not what is wanted and won't work anyway. (cbn to fix this) ---------- Cur files no longer work. Select a cur file from dirfile_maker. It thinks its a ascii file. -------- Problems reading files from the command line ascii files can't find any fields from the command line -------- Only dirfiles can be chosen from the data wizard. ascii files can't find any fields -------- Update curve after editing equation Create a plot with a curve from an equation. eg, x = 0..100, y = x Put the plot in auto zoom ('m') mode. Edit the equation to change its Y range eg, x = 0..100, y = 2x On apply, nothing changes. Do something that causes the curve to redraw (eg, resize the window). The curve redraws, but the Y zoom range stays at the old range. 'm' resets to the old zoom range. Now edit the curve, do nothing, and hit OK. Still no change. Now do something to redraw the plot. 'm' mode now works. ------- Butterworth low-pass crashes. create a plot, apply filter with order=4, lowpass = 0.01. Crash. ------- When chosing to filter a curve from the plot rmb, the input vectors should be fixed to the right thing: eg, Butterworth low pass Y vector should be fixed to the Y vector of the curve selected in the RMB menu. ------- Entering a numerical value into a scalar selector should create a scalar of that value, if there is not already a scalar of that name. This is particularly important for plugin entries. It can be created when the scalar that the selector has selected is asked for. -------- Ascii file configure button troubles I: it doesn't work. Configure from the data wizard brings up the configuration dialog, but applying it does nothing. -------- Ascii file configure button troubles I: it crashes Configure from the vector dialog crashes kst -------- Filters should have default values eg, low pass filter should default to order = 4, lowpass = 0.1: see 1.x for defaults. ------- Problems with file selector If you browse to select a dirfile, the name of the previous dirfile has been put into "File name:" entry. So you have to erase it to select a dirfile. Of course, selecting a data file replaces the old name with a new one, but there is no way to clear it selecting a dirfile. If the 'current file' is a dirfile, then the File name entry should be blank. Either: always clear the current file: entry when a directory is changed, and don't fill it in the first place if the default file is a directory Or: Check to see if the current directory is recognized as a valid datasource - if it is, clear the current file entry. -------- Change data sample range tool doesn't use defaults. --------- Accelerators for the plot edit dialog: 'E' should bring up the plot edit dialog --------- Places where text labels are entered need string and scalar selectors to aid in the insertion of strings and scalars (eg, primarily label editor) --------- Missing tabs in plot dialog: -There is no tab to set size, position, and rotation. There should be. *cbn* Top Level View needs rmb menu: -set background properties (colour, gradient, etc) -set tied zoom mode for children (?) -cleanup layout menu option *Mike* --------- Axis labels are not transparent Create a plot with X, or Y or Top axis labels. Change the background of the plot to a gradient. The axis label backgrounds are still white. They should be the color of the background (alpha channel?) *Mike* --------- Axis labels should have configurable colour. A byproduct of making the label backgrounds transparent will be that if the background is set to a colour with a low contrast to black (like black, or close to black) the labels will not be visible and there is currently no way to change them. *Mike* --------- View Object parents not preserved in saving/loading kst file Create a plot. Put a box in the plot. Put a label in the box. move the plot around - verify that the box is a child of the plot. move the box around - verify that the label is a child of the box. save as a .kst file. load the kst file -note that everything is positioned relative to the tlv, and are all children of the tlv. *Mike* --------- Plot dialog label tab has grown out of control! It should be shrunk to fit in 800x600 It needs to shrink. -There needs to be only one scalar and string selection combos, and they need to apply to the most recenly selected label text entry. -The per-label font selection needs to be drastically shrunk. maybe: only the text and the size active, w/ the info in a label, with a button to edit. or maybe: only one font allowed for a plot, and have toggle buttons for U B I. or maybe: only one font and UBI combo for a plot. UBI can be set w/ latex commands in the label. -get rid of all the per-item boxes and use more space efficient separators. *Mike* --------- Missing features in edit label label dialog: there is no mechanism to adjust the font, or Underline Bold Italics (UBI) in the edit label dialog. *Mike* --------- The entire edit label properties tab should be shown when creating a label, not just the label text and the string/scalar selections (ie, incude size, font, UBI, and colour.) *Mike* --------- Labels should have configurable font and UBI. *Mike* --------- Tied zoom problems: (see devel-docs/Kst2Specs/Plot Geometry.pdf, last page). -The tied zoom conditions are not honored -The parent option condition is not honored. In fact, there is no way to set parent options, even if there were parent options. -The plots are not automatically re-sized to have equal size once the axis are shared. *Mike* --------- kst settings dialogue box should select "General" when first opened to indicate that what we're seeing to the right is the General tab. *Mike* -------- Double clicking on a curve in zoom mode should bring up the edit curve dialog (was in 1.x, but was a little buggy). *Mike* ---------- Edit plot dialog format issue: The tab list on the left has a minimum size set in pixels, and is not dependent on the size of the tab names. *Mike* --------- "Change color per file" changes are not shown in plots until the plot is moused over. *Mike* -------- "Differentiate Curves" changes are not shown in plots until the plot is moused over. *Mike* -------- Accelerators for the plot edit dialog: clicking on the plot outside the plot region in zoom mode should bring up the plot edit dialog. if on a label, to the label page if on the numbers to the axis range page (which doesn't yet exist). -------- Missing tabs in plot dialog: -There is no tab to manually set plot zoom ranges. There should be (see 1.x). *cbn* --------- When displaying data that is constant, the range is from about zero to slightly above the curve (meaning the curve is very near the top of the plot. instead, it should center the curve and have a range of �0.1 around the constant value. ---------- Line Endpoints drift relative to plot contents: Create a plot. Put a line in the plot. Resize the plot. The end points of the line don't stay fixed in plot space. It seems to have something to do with the 'centerpoint' of the line. It rotates around an end point. This problem doesn't happen with boxes. *Mike* -------- datawizard generated multiple plots per view have the font size for the lables way too big (so big that, in the case of 24 plots), the axis labels take up >75% of the real estate. �The wizard should chose the font based on the number of plots that will be in the tlv when finished. -------- Clicking in a plot when in *layout* mode brings up the plot edit dialog. This should only happen in *zoom* mode! The way it is now, you can't move or resize plots. -------- No way to cancel a drawing command. Select a drawing tool (say, a box) Change your mind.... tough - you have to draw something. *Mike* -------- No visible feedback as to what drawing mode you are in... Select a drawing tool (say, a box). There is no visible indication that you just selected a drawing tool. The tool should be clearly shown either with the toolbar icon remaining depressed until the action is finished, or in the mouse icon. *Mike* -------- Export as png with a set width and height shows transparency (blank) where extra space is, rather than resizing the view for the export. *Mike* ---------- Should add some more latex mode fields \odot -------- In labels, \textbf{text} and \textit{text} set bold and italics for 'text', but they don't un-set bold and italics after the end of the curley brackets. They should. -------- Negative size drawing considered invalid. Drawing items beginning with any corner other than the top left (negative height / width) results in an invalid viewRect and the item drawn with a nominal size rather than the desired size. This is happening during completion processing as the objects are drawn currently during creation. *Mike* -------- Tied zoom behavior oddness: Tied zoom has been implemented as a toggle button, setting or unsetting all of the zoom ties. However, when in tied zoom, it is still possible to un-tie individual plots (which is good). But: when you un-tie one of several plots, perhaps the tied zoom button should become disabled, as you are no longer in all-tied zoom mode. *Mike* -------- -Superscript and subscript size and position seems off. This should be researched more but wikipedia as an almost reasonable article on it. It suggests both should be scaled by ~60%, and subscripts dropped by 16% and superscripts raised by 44%. OOffice, illustrator, and photoshop use scale 58%, raise 33%, lower 33%. msoffice uses 65%, -14%, +35%. It might also pay to compare w/ TeX. --------- No space allocated for subscripts or superscripts in axis lables The subscript is cut off --------- Number of major ticks bug: Occasionally there will be too few (<2) or too many (serious overlap) in the number of major ticks. This seems to have changed from 1.x *Mike* --------- Plot axis number rounding bug: occasionally, the axis numbers can be something like 0.499999999993 instead of 0.5. It is hard to reproduce. *Mike* --------- Kst should ask about saving the .kst file on exit if the document has changed (basically, any change other than a mouse/arrow zoom). See 1.x. *Mike* ---------- .kst should be appended to the name of a .kst file if it is not already there. *Mike* --------- Reference point (see 1.x, 'c') should be implemented. *Mike* ---------- RMB menu over a plot render item in layout mode doesn't have raise or lower, but but does have the zoom options, etc. the RMB menu should always have raise and lower in layout mode over any raisable or lowerable object. *Mike* -------- Shared axis Box Behavior: box shows in data mode Create a shared axis box around some plots. A grey box appears around the shared plots. It should not when in data mode. In layout mode, when the group it moused over, then a box can appear, as with other data object. Otherwise, no visible box. *Mike* -------- Automatic layout behavior: there are gaps between layed out plots Create some plots and apply cleanup layout. The plots are aligned in a grid, but between the plots, and between the plots and the edge of the tlv there is a gap, presumably to make room for the grips. There should be no space. Instead the plots should touch each other and the edge of the tlv, even if the grips would overlap, and even if the grips would extend partially outside the tlv. This applies to all layoutable objects. *Mike* -------- Shared axis box creation behavior: The shared axis box dimensions are set by the corners of where the box is drawn. This is inconvenient. It would be better if the box dimensions were set by the extents of all plots which have been included in the shared box. *Mike* -------- Shared axis box behavior: resizing separates box Create several plots and put them in a shared axis box. In layout mode, resize the shared axis box. The box ends up on top of the plots, and the plots cease to share axis. The plots should stay in the box. *Mike* -------- Shared axis box creation behavior: no visual feedback There is no visual feedback as to what plots have been selected when drawing the shared axis box. There should be something (eg, the selection rect shown in mouse over mode like in layout mode) *Mike* -------- The size of selector on left of dialogs is too small to fit the entries, though it is resizeable. It should default to a size which fits all of the entries, up to some reasonable maximum, but then be resizeable to either larger or smaller. At one point it was fixed too small. Then it was changed to be resizeable to larger than some fixed minimum. Now it defaults too small, but can be resized. *Mike* --------- Formatting/spacing issues: -The spacing between the X-axis numbers and the axis is too small. -The spacing between the Y-axis numbers and the axis doesn't seem to scale with window size. -The plot selection buttons are too small. --------- Data mode (see 1.x) should be implemented *Mike* ---------- Shared Axis box behavior: different boxes have tied zoom. When more than one shared axis box is created, the zooms seem to be tied between them. The zooms should only be tied if indicated by the tied zoom box, which the shared axis box does not have, but should. By default, each shared axis box has it own zoom. *Mike* ---------- Pointless complaints from Qt: we are getting on the console like "QGraphicsItem::ungrabMouse: not a mouse grabber". These need to be found and killed. *Mike* -------- qgraphicsitem_cast is not setup correctly and causing bugs. A number of bugs are occurring as the result of qgraphicsitem_cast failing. All ViewItem objects will need to be updated to support type and casts re-evaluated. This causes context menu bugs. Object selection bugs. *Mike* --------- General drawing 'flicker' and missing regions in drawing with openGL enabled: OpenGL is qualitatively much faster, but on my laptop with Intel graphics, embedded, and running opengl with kwin, there is lots of flicker, and lots of things simply not drawn. Notes: - We are doing everything correctly according to the Qt documentation. - This can be reproduced using the Qt example code. Corruption extends beyond Kst, and can be seen in all other apps showing drawing problems. while QGLWidget is running. - Sample Qt code: http://labs.trolltech.com/blogs/2008/06/27/accelerate-your-widgets-with-opengl/ - Performance will be improved in future versions of Qt and is a known issue. http://labs.trolltech.com/blogs/2008/02/04/qt-44-and-painting-performance/ - This bug is a platform specific to X11 and is documented by ubuntu with a work around. https://wiki.ubuntu.com/RedirectedDirectRendering - Sample app from Qt runs correctly under Windows, no reported problems with Mac. -------- The first pane of the data wizard should be reading directories in the background, instead of in the foreground where it steals X focus until the directory is read. �I ran into a interminable-focus-stealing problem where kst was attempting to read a dead NFS mount. �Required an X restart. *Mike* -------- Bugs in Build System: -picks up libraries in lib/X11 before local libs -doesn't support 'make install' nor DESTDIR --------- With multiple plots, when zooming one changes the size properties of another (due to axis label changes, for example), the axes labels on the non-modified plot(s) can get garbled until the mouse is moved over them. ---------- PlotMarginStandardization is applied inconsistently. - Note: Fixed many cases. After applying layout, plotBorders are set to Dirty, this may not be correct. A number of margins are not updated within the changed plot currently preventing full validation. *Mike* -------- SharedAxisBox plot sharing occasionally breaks for no apparent reason. Have not identified a pattern or cause as of yet. *Mike* -------- Fragility in moving parents: create a plot. Put a child box in the plot. Rapidly resize the plot. Sometimes the box will either drift or loose parenting altogether. (Editorial: Fundamentally, I think this is because qt's QGraphics system has been used to track placement of objects, and QGraphics doesn't have the right model of what we are doing.) Note: This is still causing parenting to fail. Updates are required to prevent reparenting on parent resize. *Mike* --------- kst reads live dirfiles less efficiently than before. �On a shitty computer (devlin666), kst1.7 can display 200 frames of 24 bolometer channels (100Hz samples; 20 samples per frame) with a 500ms kst update timer, and only use about 20% of the cpu and the computer will still seem 'responsive enough'. �kst2 under the same conditions, except with 2000ms kst update timer uses about 55% of the cpu and the computer (and kst) seem more sluggish. � ------------ Y Axis label placement is wrong Create a plot with 24 curves from the data wizard. The Y axis label is offset vertically. ------------ 'c' mode doesn't show difference. 'c' mode is used to find the offset from a marker to the cursor. Currently, if 'c' is hit, a marker is placed, as it should. However, the difference between the marker and the cursor is not shown anywhere. See 1.x for the correct behavior. ------------ Plot update problem: -from the data wizard create several plots. -Make a change to the plot that changes the size of the plot (eg, change the font size. The plot you changed is happy, but all of the other plots don't get automatically re-aligned. -Move your mouse into one of the plots that is not properly aligned. The curve is re-drawn to be aligned with the other curves, but the plot axis is not re-drawn. ------------ Equation update problem -Create a curve from a datasource. -create an equation from a vector from the curve. -Change the input vector (eg, with the 'back one screen' button) The curve updates, but the equation/equation curve does not. ------------ Plot is not regenerated after 'ok' in the plot dialog axis tabs makes a visual change. -create a plot. -in the plot dialog axis tab change something (eg, the 'draw grid lines' option) and hit 'ok'. The plot is not redrawn to honor this change. (if you do something else to force a redraw, the change is displayed.) ------------- Loading a kst files does not seem to work: -run kst -with the wizard, make a plot with three curves -save it. -restart kst and load the kst file you just created. kst gives an 'invalid Tag' error, and no plots are shown. ------------- Accelerators everywhere. ------------ 'ok' in arrow dialog moves the arrow. draw an arrow. Open the edit dialog. change something and hit apply. The arrow moves. ------------ 6. Unless you've explicitly given it a Unique Name, the edit curve dialog gives no hint as to the name of the curve you're editing. This is a problem when you have, say, twelve curves called "2 vs. 1" in a single plot. In 1.x I can doubleclick on the curve to bring up the edit dialog containing its name to figure out the name of the particular curve "2 vs. 1" I'm interested in. Here, I have to go by trial and error. ------------ 14. The weight of a drawn curve is apparently calculated as: (my weight) + (sum of weights of all lower numbered curves). Being unable to specify negative weights, curves just get heavier and heavier. --------- Loading of a Kst file into a resized window does not adjust the loaded items to fit on the new window size. The View dimensions should be saved as part of the .kst file and if the newly created view on a load of a .kst file doesn't match, the resize logic should be triggered. *Mike* --------- 12. Changing the value of the fixed range limits doesn't active the "Apply" button. ------------ Layout issues in data object dialogs: some dialogs, like histogram, lines up nicely, while others, like image is excessivly indented. I can't see any difference in their implementation., ------------ 16. Text labels have to be entered in a tiny little text box, making decent sized labels frustrating to edit. Furthermore lines, in a label are separated by "\n" now? --------- Auto-labels, and '_' in field names: When plots are using name-based auto-labels, any '_' in field names gets interpreted as a subscript. 'solution'. Append a \_ to _ in field names so the appear correctly in labels. Down side: they are less nice looking in tag names. This is acceptable (unless we end up really board). --------- Drawing problems in resizing view items (eg, arrow) draw an arrow. In layout mode, grab one end and drag it around quickly. The grab point gradually drifts away from the mouse cursor. It is much less pronounced if you move slowly. *Mike* ------------ Base / Offset mode logic change: Base/offset should have three modes: On: Base/offset mode is used, regardless of if it is needed (same as current 'on') Auto: Base/offset mode is used if doing so makes sense (same as current 'off') Off: Base/offset mode is never used. ---------- Error in choice of offset mode. Create a plot with a Y range from -0.032 to 0.041. It goes into base/offset mode and shouldn't. ------------ Crash case: edit vector button is active in vector selectors for error bar vectors which aren't yet set. Clicking crashes. --------- Default X vector field: We need to guess that is wanted for an X vector in dialogs which take an X vector : ------------ 10. In the content tab, double clicking on a curve in 1.x would move it from the list it used to be in of the lists to the other. This saved the tedious click-on-curve, click-arrow-button, click-on-next-curve, click-on-arrow-button 1. data source text box in first panel of data wizard inevitably moves the text cursor to the end of the input after entering a character, making it difficult to edit in the middle of a path======= --------- A spectrum curve created with the data wizard should have the same color as a XY curve simultaneously created from the same data field. ie, if the XY curve of [sine] is red, the spectrum curve of [sine] should also be red. 17. There appears to be no way to change the colour of the plot border and tick marks from black. I though the brush colour under "Stroke" might do it, but nope. Axis Label Rotation: Axis number labels should be rotateable, as in 1.x Edit Multiple for Plots It should be possible to edit the properties of multiple plots at once. The UI used in data objects and in 1.x works well and should be used here. *Mike* 8. Removing a curve from an autoscaled plot and hitting "apply" removes the curve doesn't rescale the plot. The plot is rescaled when "Ok" is hit in the edit plot item dialog. Adding a curve to an autoscaled plot and hitting "apply" does rescale the plot. 3. toggling log-x axis (key 'g') doesn't do anything until you poke at the plot. (My impression is that a re-draw is being missed.) toggling log-y (key 'l') works as expected. (cbn sees: the mouse needs to leave the plot for the plot to be redrawn) 4. toggling log-x doesn't change the x-axis tick labels/positions, even though the curves are drawn on a log scale. Zooming in and pressing "M" fixes this. Again, y-log works as expected. (cbn says 'confirmed') Legends don't appear to work: With the data wizard, create a plot, and select to create a legend. No legend. Edit a plot. In the label tab, select having a legend. Apply No legend... ---------- New tab in Data Wizard: There should be an option in the data wizard to create all of the new plots in a new tab. 1.x has this. ---------- XY Plots and Spectra in separate new tabs in data wizard. If XY plots and Spectra are both being created, there should be an option to create the Specta in a separate new tab. 1.x has this. ---------- 11. When in log mode, the range reported in the range tab of the edit plot item is the logarithm of the range. So if the y-range is 0.1 to 100, the range will be reported as -1 to 2. Despite this, you still have to enter "0.1" and "100" to get this range. Smart selection of minor tick intervals. There needs to be an option to automatically chose the number of minor tick intervals: If the major interval is 1x10^n or 5x10^n there should be 5 minor intervals. If it is 2x10^n, there should be 4. This was in 1.x 7. Adding a curve to a plot in the edit plot item dialog, and hitting "Apply" causes the dialog box to grow wider. Removing a plot does the same thing. The result is an ever-widening dialog box, which can't be re-narrowed since it believes it is as small as it can get. (It's the list of tabs on the left which is doing the growing.) ---------- New Plot Label size mode: autoshrink. Add a an option to plot labels: autoshrink. If selected, the font size used for the axis labels will reduced to the largest size (<= the current size) for which the labels don't overlap or are not truncated (only text width is considered.). The resizing is dynamic. If the window geometry or the label values change so that the label would fit at a larger size, the size is raised. - Last step after base/offset & reduced ticks. ---------- Placement widget (eg, in the curve dialog) needs a create in new tab option. 1.x had a 'create new tab' button. This is similar, but does the creation of the new tab after apply, and uses a default name rather than popping up a new dialog. --- 3. Very often, changing the range settings of a plot does not change anything (I did not find out why it worked sometimes) --------------------------- Shared axis not shared until a redraw. create plots with more than 1 column (eg, 6 plots in two columns). With a shared axis box, select two plots on the same row, so you would expect them to share a Y axis. -the bottom axis is suppresed on both. (they should not be) -The left axis on the right plot is not suppresed. (it should be) until something is done to trigger a redraw (eg, a rescale) at which time the plots are drawn correctly. Sharing is happening however, sharing is based upon plot projectionRect, not on physical location. Ie. in scenario described the Y axis of the two plots do not match but it seems likely that the x axis range does match. This results in an inappropriate sharing of the x axis when the physical location of the plots lends to a natural y axis sharing. The zoom update will trigger the tied zoom code which standardizes all the plots. This proper fix for this will be part of the logic rework for shared axis as it is related directly to the above bug. --------------------------- 'I' key in a plot with an image should adjust the image color scale; see 1.x for correct behavior. --------------------------- Change File Dialog is confusing. It is not clear what the two filters at the top do, and the way they do it is inconsistent: The top is applyed when you hit the all from button. The next one is live, and the button clears the selection. There is no way to combine the options. Better: a file text entry and a regexp text entry, an apply filters button, and an 'and/or' radio pair. --------------------------- Problem with plot range and offsets: Make a plot with the Y range from -0.75 to 0.4. It goes into base/offset mode and it shouldn't. --------- Missing X axis and cut off right edge in tied zoom box: create a tab with 6 plots in two columns make all 6 X axis the same, but with 6 different Y axis Create a shared axis box that encloses all 6. There is no X axis visible. There should be. The right edge of the right collumn is cut off. It shouldn't be. ------------------------------ Selecting 'share Y axis' in shared axis box context menu does not share Y axis. create a tab with 6 plots in two columns make all 6 X axis ranges the same, but with different Y axis ranges. Create a shared axis box that encloses all 6 plots. Notice that X axis is shared and Y isn't. This is the correct default as the Y axis were different. Now, select 'share Y axis' in the context menu. The check box is now marked, but the Y axis aren't shared. What should happen if the Y axis shared box is changed to checked: -The Y axis ranges should be changed to go from the minimum Y min shown to the maximum Y max shown of all of the plots in the box, and the Y axis should be shared if properly aligned. -If all of the plots were in 'm' auto zoom mode, then the shared axis box will be in 'm' auto zoom mode, with all plots going from the minimum Y min to the maximum Y max. Otherwise, the shared box will be in fixed mode, again going from the current displayed minumum Y min to the current displayed maximum Y max. -hitting 'm' anywhere in the shared axis box will place the shared axis box and all of its plots into 'm' maximum zoom mode. -Doing a mouse zoom in any of the shared plots will do the zoom of any shared axis in all of the plots, and place them all in fixed mode. ------------ unselecting 'share Y axis' in shared axis box context menu does not restore the separate Y axis. create a tab with 6 plots in two columns make all 6 X axis be the same and all 6 y axis be the same. Create a shared axis box that encloses all 6. Notice that both the X axis and Y axis are shared. This is correct. Now, un-select 'share Y axis' in the context menu. The share Y axis is no longer selected, but Y separeate Y axis are not restored. They should be. Note: the Y ranges are no longer tied, even though the axis are still shared. ------------ 7. Even if I don’t modify anything on a kst file (no click at all) kst always ask for saving the changes on closing. ---------------- Font settings in Settings->General do not appear until, eg, the window is resized. Plots should be updated upon 'apply'. ---------------- It is not clear from the dialog that grid and color options are defaults for new plots and don't apply to existing plots. The text should be modified to make this clear. --------------------- Drawing / Standardization Errors with inverted drawing of Plots Draw a plot using the drawing tool in any direction other than down and to the right. - The PlotRenderItem is provided a negative size and not drawn - Plot standardization is triggered and all labels / axis are drawn incorrectly --------------------- LabelCreator Dialog cleanup required. Missing Signal - Object::connect: No such signal QPlainTextEdit::textChanged(const QString &) in ../../../src/widgets/labelbuilder.cpp:23 Object::connect: (sender name: '_label') Object::connect: (receiver name: 'LabelBuilder') Title missing (reads Dialog) --------------------- Make dialogs modeless. Open the „about“ dialog box and click on a link. Nothing happens, everything disappears in the box. If kst was started from the command line, you get: QFSFileEngine::open: No file name specified QTextBrowser: No document for http://kst.kde.org/ Confirmed by CBN/linux *Mike* ---------------- Problems with shared axis boxes: Incorrect feedback in rmb menu. Create a window with 6 plots in 2 columns. The X axis are the same. The Y axis are different. Make a shared axis box with includes all 6. As expected, the X axis are shared, and the Y aren't. "rmb->Shared Axis Box Settings -> Share Plots on Y axis " is checked, even though the Y axis aren't shared. Un check it. The Y axis are now shared, even though the check box says they aren't. Tied Zoom behavior in shared axis boxes: Create a window with 6 plots in 2 columns. Create a shared axis box which shares in X but not in Y. Select the tied zoom box in any two of the plots. Make a Y zoom in one of the tied plots. The plot it is tied to does not re-zoom. It should. Related to above: Create a share X axis box, which contains some, but not all of the plots. Tie a plot inside the share axis box with a plot outside the share axis box. Do a Y zoom on the tied plot inside the share axis box. The one outside does not change its zoom. It should. Extra tied zoom button: There is a tied zoom box associated with shared axis boxes. There shouldn't be. Tied zoom boxes are only associated with plots. I have moved the description of correct behavior which is broken by the above back to here from 'fixed bugs' : ------------------------------ Shared Axis behavioral principles: -All plots have a tied zoom indicator (which may not always be shown). -All plots indicated as tied will have both of their axis tied, regardless if they are shared. -All plots not indicated as tied will only have their axis tied if they are shared. ------------ Bugs based on the above principles: -------------- The tied zoom indicator behavior is as follows: For axis that are selected to be shared: -If any of the plots inside the shared axis box are tied to any plots outside the shared axis box, then the shared axis for all plots in the shared axis box will be tied to the tied plots outside. For axis that are *not* selected to be shared: -The tied zoom for the *unshared* axis behaves exactly as it would if the plot were not in a shared axis box. **Shared axis boxes do not have tied zoom indicators - only the plots do.** Tied zoom indicator location: - If a plot shares *only* an X axis with a plot directly above it: The indicator will be to the right of the plot, with its top even with the top of the plot. - If a plot shares *only* a Y axis with the plot directly to its right: The indicator will be above the plot, with its top even with the right of the plot. - If a plot shares *both* axis with a plot above and a plot to its right: The indicator is not shown - its behavior would be redundant with the indicator on the top right corner. - If a plot is in a shared axis box which shares both X and Y axis: only the plot in the top right corner (alternativly, only plots which don't share an axis with a plot above or to its right) will show its indicator. The indicator would be redundant, anyway, with the indicator in the top right. ------------ Vector selectors in opened dialogs not updated when new vectirs are created. Start kst From the data manager open a curve dialog and a vector dialog. Create a vector in the vector dialog. It does not appear in any of the vector selectors in the curve dialog. It should. Maximum zoom problem after breaking shared axis boxes Create a window with several plots in 2 columns. Each plot should have the same X range, but different Y ranges. Create a shared axis box which includes all the plots. Only X axis are shared, as expected. Now, hit 'm' in one of the plots. It's zoom is what it would be if both X and Y axis were shared (ie, it includes all points in all plots). But, since only the X axis are shared and the Y axis are not shared, the Y zoom should be such that it includes all the points in only the current plot, and not all the plots in the shared box. ie, the Y axis should not be effected by being in a shared box, if Y axis are not shared. In the « edit plot item » dialog: the size of this dialog box is not scalable. Problem is that the size is computed with the longest name of all the curves in the plot. And these names can be very long if automatically generated… It needs a maximum width Intelligent and useful window title: If a kst file has been opened, the window title should be kst plot dialog bug: -doesn't properly fill zoom mode with 'mean centered'. -------------------- Plot Bug: Mean Centered X range doesn't seem to work: create a plot with a curve Mean centered X range -> apply. Does the right thing. Now advance one screen. Plot does not advance. -------------------- plot dialog bugs: -doesn't fill range with enough significant figures *cbn* ---------------- kstdatarc is located relative to the directory from which kst is run. It should be located in the standard config directory. For linux under KDE4, this is `kde4-config --localprefix`/share/config/ For linux, not kde4, consider ~/.kst/ No idea what it should be for windows or mac. --------------------- 4. Reloading a previously saved kst files seems to forget all the “configure ascii file” settings (in particularly “read fields names from”) so that no vector can be generated because kst tries to read an unknown field! This may explain why the relative path names did not work (see bug reported earlier). In the meantime, it has been confirmed that reloading works with the appropriate kstdatarc file in the right place. --------- "kst setting dialog" interface to global ASCII options. kst can currently read default ascii settings from the kstrc file. These settings need to be settable from the kstsettingsdialog. --------- For extreme cases of base/offset mode there are rounding errors related to the subtraction of the base. Rounding problems in base/offset mode: Log axis should never go to base offset mode - instead they should use scientific; powers should be relative to 1. - LogAxis are now using only two significant digits so that scientific notation is used by default. *cbn* --------- Crash Case: crash second time opening config dialog. Start kst. Open the configuration dialog (settings->configure kst), close it, then open it again. Crash! --------- Hitting shift changes into y-zoom mode forever, rather than just changing it while shift is depressed. After doing this it's difficult to get back to xy-zoom mode. (I have to right click twice to open and close the context menu.) (cbn says 'not confirmed - more info needed) - Tested on Windows / Linux and cannot reproduce. -------------------- -In the data wizard or in the data manager, select the data from a file by giving the path relative to the folder where kst was started. The plot appears without problem. Save the kst file in the same folder where kst was started. Close Kst from the same place and reopen the kst file. It cannot plot the data. But if you go in the data manager and edit a specific vector from the file, it will be plotted. -------------------- Offset mode doesn't work in data mode. In a plot in kst, go into data mode. Then use 'c' to leave a marker. It is left in the correct place. Now move the mouse. The offset to the marker is not shown, but it should be. If you leave data mode, then it is. (behavior should be the same as 1.x). -------------------- Showstopper printing problems: - 2.0 needs these fixed. otherwise, another beta :-( Labels in Print to file are not vector quality... they should be. This appears to be related to caching of labels... Increasing the printer resolution to "high resolution" solves this, at the expense of huge pdf files, and very slow print rendering. Printed files should be all vector, not cached pixmaps. ------------------------------ USAGE() does not exit cleanly, so there are issues under windows: For the « kst --help » I first get the message “Runtime Error! Program: c:\Program\klst\bin\kst.exe This application has requested the runtim to terminate it in an unusual way. Please contact the application’s support team for more information.” Then kst closes and and I get the help in the console (cygwin) in the windows cmd.exe I don’t get any help… --------------------- When a new plot is added to an tab which already has plots in it (eg, from the Placement widget), then the label font sizes should be based on the label font sizes of the plots already in the tab. (either 'vote' or use the first one). All font properties replicated. Use the first one. -------------------- Problem resizing plots: resizing a plot from the top or left grip points blanks out part of the plot. Using the bottom right grip does not. -------------------- Save as default should not default to checked in ascii configure dialog. -------------------- The Y axis label drifts when you resize the height of a plot with the top grip. Then, pull up the Plot Edit dialog, dimensions tab. Enable 'apply' by selecting, then unselecting 'fix aspect ratio'. Apply. The plot moves, but the Y label is back where it should be. Enable apply again, and hit apply. The plot is back where it should be, with no problems. -------- Reasonable/sticky defaults for the export dialog. -------------------- Draw a line in a plot. Resize the plot. The line drifts away. ------------ Sensible filter in image dialog -------------------- Rotated axis number label spacing is wrong -------------------- ASCII settings are ignored unless they are the global defaults. -------- Reasonable/sticky defaults for plotDefaults See View::configurePlotFontDefaults for a place to do this... Currently, new plots follow any existing plots, but there is no sensibly set 1st plot default. Probably need to set defaults in the plot dialog *Changed fields (?). But need to figure out order - we want to also save the viewItemDialog set fields. ------------------------------------------------------------------------------------- Fixed after beta 3 ------------------------------------------------------------------------------------- Multi-page printing: The code is in place and commented out, because it gets the size wrong for pages other than the current tab. This bug is also hit in the export widget. -------------------- Need to be able to rebuild the datasource list: Make a list of all dataprimitives and their file names Erase all data sources from the object store. for each dataprimitive { find or create (filename) changeFile(newDatasource) (adds to the store?) } -------------------- Datasources that are browsed are created, remembered, and saved/loaded. ---------- Improve behavior of data wizard selector ------------ Names in multipage graphics file export. name_2.png, not name.png_2, etc -------- Printing from the command line. This existed in 1.x Note: printing still requires parts of Qt which require a window session, so pure scripted headless prints are not possible :-( -------------------- When you plot 48 plots on one screen, the default text size for the plots is way too small to be readable. -------------------- In zoom plot mode (hit 'z' when mouseover a plot) the text does not increase size as the plot expands. This doesn't look proportioned correctly. -------------------- Change data samples range is clumsy to use. I don't think that it should default to having none of the vectors selected. Rather, I think it should default to all preselected (or better, all preselected if you've never used the dialog before, but to remember which were selected from before and default to those). Certainly, when you make some changes and hit apply (without closing the dialog box), the vectors you have selected shouldn't become unselected; they should remain. -------------------- Plot widths with live data are variable depending on the axis numbers position. If, for example, you're plotting live data as a function of INDEX and INDEX is in the hundreds of thousands, when the major tick for INDEX is near the edge of the plot, the plot will get narrower so that the axis number can fit in the window. I don't think that plots should change size at all when data is live. -------------------- 2. When in data mode, the status bar shows the backslashes used to escape characters in curve names. I think that maybe (but maybe not) the status bar should render the names (with subscripts and superscripts, for example). The status bar should certainly not show escaping backslashes. -------------------- 4. When displaying an axis as time, "offset mode" turns on (good), but only displays offsets in seconds (bad). When a day's worth of data is on the screen, the unit shouldn't be seconds, or even minutes. -------------------- 5. When displaying an axis as time and offset mode is on, the offset steps should be natural for the type of units. 100 seconds is not natural (120 would be, or better, 2 minutes; see the bug above). -------------------- 1. When the x axis set to to interpret as standard C time, the time is displayed correctly on the axis labels, but just displays as the raw value in the status bar (on the lower left of the window). This is both in "normal mode" and in "data mode". ------------------ Cleanup layout totally sucks! Kst-2.0.8/devel-docs/Kst2Specs/UpdateConsiderations.pdf0000644000175000017500000007575412277111530022067 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream x[I3 9J0 ևh L sߏDjy*wg|OۮRQ|\Iy>}N9)^տ8~N4Ev:]\렷xFz5ֿL\wng_Uzn>QQ5!OUB0Rmшnō*nZ NB>XcNIA8gk^36ePb'/<}[mIhnTp;\~GU^@U˼lS~8WB 񸐅?:EEs&.5DON$GEaAf$CORA\WBO%YprMV 4J^a l.F+! >#[V`ĎͰ؁9L 9EuF8@)4὆?wU |bh@k MdRaѢwaKԎ`VJ;@+P0 pŤSjQrޚ/RC߳4ER]ͨ(|ÆtKtL(cB˭kf \ 03^l@0@W1)]'D[GUdmDFc|D ppr q~?sffU3 f(cO#6r_vS۽R@9ݬ.0ѕeGQV~y# w&QLFA 份/Co\Pa;58VJy ϝU$RTvt-C&Shh̻ Zo"ZH3u1)xA`wSAR8?\5TS<i| "Ĝ.3K4lP ]|Z%}CR>K)fZ+crcS5дo~T Lҭt# 0j5Z}*FR.w^Fn,Hk6UfkZ1|T3!ni\d^U(^[ȕ^1Y3w$ Ը.BR:#pXes"HeTJ!jW}hݨz j}lk=WEM]P%c|CMUme.~ѰC1由2Lېq5ć mHj A po^s )`Gfkn +z+0_B^)VGU!k;"%)BDY,LVY`y܈m&o-v9[" XeSj;Y@wHK w swt t%bI*)OT~5 es7lS@#Zp` i&WuFӓ2c<5rG@Ov&N]|tXŧQ&aˍ wjMfPk y?S39Sbxϭ: ֋'_Ϋ9x ʲ +aMlg!6i҂gK2 sS_% ,>a>U6pY+691S;EFU|fHS/a^ὺR}ƭ?=9Cr. qakȲPxva:;NWcqW#?U -< 5 hm}2niG\0}<#p-e_YX'jRtHLl96 ]h'ZE@;!8Yu{gx_IE:sD;JGh"2kJ3TJO_ln\ AA}AR"]E]Vit?lK_#g#A%˛7NxOՎr{q2q>~n!L( I+3 pK;h{jPeK]5*-`|-?g`**ߛ5ZpTבAGUU)+bkyHkD{p:^ub4bjlx$LGICT.X&{1eޤ!g<Ahks|Lq-@+W^SK_l;Ј^>kDUNO0Gny|j3Z<"D63O۬JJ }Z?!GT]Bk52R#q[LZ!;vEɺ ^|wD59~.Ij&wU,vyey U95phԸ#ɨON[DƁNHnDI 3@'t>E㖐/;]P/Rwr[4۴3È5-4Xm{vҷVPu?yG,UᱷuGgcH5ߕ$n`v\H n:Ӵ!@t胧TVwœ)8F۫;}x:"`^W5E~u:4itq,:̚ow3p>g{>BTdF|<8յN 1MAhz Y΋gыaj}A\߹UAeTq mr^[3N v~8JE9{5U!8Ü7gZʟA5N'zGoL|aFcGw9Oivx8'tDμy@!k@'lF8D_;Mf endstream endobj 3 0 obj 3031 endobj 5 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0"d:yf:BP|AzjkqۿsTw> endobj 8 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 9 0 obj <> endobj 10 0 obj <> stream x{ |TչZ{={fk3Ʉ7 C!&!$DE;L|EDcF h[XiX'R hwf^[}k ! ځ 4vw?u[agcDVh~7u7w;;Nv8o  ?D1:j.sjKgd\\Ͽ7'" !wP+BIUPw!@H0\M}/DI2[6poLl/~FD%)9%5-=cVflo;%ԋ8tA-nta o/б?C'q&s N|xo#LfcmnqZlt,yf݄^BOѶ6:{p-+}|:EK%`IxxiC »#[ ܰR2P?L\EH^r)zw6 v348nEos_2 Cx?n~Qt8R\i` a3$: ۃ*{ r O8<¥G7Si}5,*#r:zr/f4`U:e͒bjI]1U&}n/)CԤ",6 8匞΍I$GR{IG1d"%_8D ܌A3κdĉFFf gFq5gl1>lhC۬f0L%{SxYt~,&ܘ0e1yO6>KX||MٱfYYY6cӰ mI&<7IOH?ƥs{Ͼ}{v?t9:ã}6:y\웿~ۏ7?|Y}ssPoo\ x3?=H6\F!!!d 4fX8Q0ŋyï; 2DeA^9FP bXpM OͺgU\#%MPGT~/YP}^ynМF>StM#Դ n6:CdFT!&l!b-.ߑS;V1x3/ ƙym3&{cYN99+Ƅ-9K~> u. :E(R|.+o $CҒbfA&S&n$#pjXsS\Z2˟dsoLrKceN+.]Sb>%yy&庁u\\WcΉɉ}GzN;gL0Sz 0a>mw}1;Rj5Wێu}mm\ړt[kQuS!?KB큜$s{ȸו@ʞ{w\$[>;0 doV|i " YHUsz?(8 YᬭfCY2ʏ QϨw4lٸ>+uӹTV.& 3}.Bb\=sp{"{NUtq}=NysW|?n]Ylpg_}Zo3 La0,~CvYLmvhGbsX0pbë ݇8Ƿi57d9yl(B햘9 I;Ab1 jjJlgE 1z܊b^{L!Ӑ%e3lty ZCZj-8QYghon'!b4ml}r?c`PsfϘ?=T Oxaw@ 4j(\Tϑ_I~ymeD+_P_ 9aXNS,7:d?F ~3,9>ljs6G~r!4|(d}w, G⹉hha%Mq#= )ܻx3cO?cx^n W~WWPqL~(%KMZl1Lfy٢$^-tD؛,lIJ0#$,3<;*b1s~"'<*41Sh(HP223R6H,7(6$KٕKٕ+yWʁʁR%S%K>}g=zy6ٸ33331gb tcCl<pGOno"57.l1'͑e7g~{~-SܩQ<䌞!d|Tk݋ιR7hP<ٳfl[d"SI$lO w;;w#ISˣ7<$2ADv'?rA{;gwemώ|uߨK?8$mŠk1lL4勹'pTix2q#e#>Q.\qǥ?…8Oo3g-tыҐmd6x 4rǑ _Zt>iAs>VwgN ,vbPĴӼ 4u![q7v鑑lR!nUŖ}?2/Q9žc#o9l2z{&l7&朞Ųl/ٽ^jH8(aK[{ȉ@L"^@'b'$FgΘB=g*p"4q&e.)i lo&1k}tc=;^-Ya5bo66ۛ-1{/cy(f"X 6d3؍.[:M.evY\VMyXOwi4˜n˴ϑYn'ӛ?2:V(uzė-b[ki|Qu,Mf[,; [մUj::]C]~@~~+Ǡg^tP}u߱6!6nloW ??Ff[ :Z 1{ݰ2pu~=ʁ8YDܷ4܃:4RWe(buxQ0zD1]L7mw8N't;SNz؍+rwvR}ʦn޷k?1_N@݁lȐp(i#xH-#M~ʰ.>Cs3P+ w]zpA:x 9Gdxd5.-s_(jXdȱ*n tt笤C?wP!W1eB0d£!QHBz aoKK+mGZ]5s32|8o&c#+3hnO,f͡jՋ۲/TnBrlt-Enb 7F'b+M]|ֳꜻ=ݨgF }~ 8׀>ӽYVsvi;-5@wa_}TCk/b'Ժr?ko/MW~-ZuD#"+jHt5 v KWj`^0o` У1{Îݤ.6Cn!+"[mV3(@j4 :B6' {G .K4li\9ն[dk+7q_3:Akd͢h3P<>græ6gKG8K'|563h)2\-%|y9lcW6xw ȯ3lmo7;6;767{Piᛅ&cYj67Y֐&9Z}\/}P,66ǠdY qGէԧpyoOgOThko9 Gu!"ovYZILݞblx|.Q4{b 91HӱΝA琝.U߼N .[~^'_ y=Փ?XEše$eö)lǦ 洚RaNsh獐;>gA7Ӄl~"{| CV?SN^ 61ٷ>z6W~]uW?44oq+f1Ĺia ۹o T]NuTwO_ҎȵDb|]`12n"7FX ]s9!d۾K}ІلhkT3C7ՌIٌ n6B s&"hE;5Ӝo,/7`͵VZV~b˧4=-B:~ x<hyv}Qap6t8p[ Yq "}^%\v 198BMΘ_hEZ3of:.=G̓m-GeݸE\o[iBMb3hD6q&b>C83Y|V=..牟24se5ÖnOqBn WHGJ7z Zozkj}mk#bŽⷢmm6àuG#w{ݖ{˷+~#=wM=6k7=r5ދݣ~W=w}j.ܽ8]P bUAϦ6pPϳ)\NqHE\!;O|3KgnYML~ vOlȘS2n4~&G?u٧nfevݳwdU#nY,eiudipd&e&7J , ™ ( 秔Ie敖22,,yjmai'v(Iɭ)Ұy2l '+IɃ)Gf'xN?>㓒O ?~,]jls?⏿^?䞻;" ^ ϿT'X}A7Xm&!6 3ZyuEܘ51;bǰbe2Ӟ U?R˪Y \B~[51#Ɇ s = s],s$6ɒdZ(la.'n.ųc)lF'Jǟ.aYc)Րu+i4⃸ AEݧ>D^)@v, q`vr[R%_-+9dȇ4ψWE?Hܐz g}K@ZO\M /-/fY8;WnoC pOqi}џQ}wsDGOO#A8zN5a|m$qw?@B3ۋVJ5zY@|<_矢&Sx>-@ 6_ Q>_jGGo»B$QЀN:beWxm}$mBq AFO hPІ c08+^yw.S;dt*'d9?NH3x"q´tZ2H-onsu2by6mv=h?''=ǝ='R3n{>fyԵ<Q, ֡mOb]h۬Gz@Xo9zیгzjzmF),RtaX&x:-=15m̓z@zz[szۀ7%hm+ݲPoPKbt-&F:1e斈21SWHOӯu5f+EJիTzC=`TjS[껚CJ}OHiR:Z`+::ڴ4n<]m w)y7jS4`t/ B_vo1iew"l2!27RBl:[&'gFyBWҜ]5+J>iWMRPOgk/Sn `H(Wz@xJ$w *ݠpn]ͰJ#0MGFZBÝ0uPRT ĂJ}oo 6u"OSkx&(<9q CLkm苄&J}A@k%f:[M@SqJgI⟲QzC` _4evSEGtձZ_@ `X ޾Pch:5TT!&E ' G Z/Jhޖz!k '&g G +5BSvR`kS+u4h}0$TG㫾a C]^:zh}#3^qAMaS\CDe"1Nsu'D"KT6 ߅4=^%y"J2 d6N3 !&J@N0Q껻!:B&?P0-(N+ɚ_eplf:jz"Kt`w}c{}3ޱ-,:(S+J55JҚ[JjjMmYqI\T ~喲k(0fT)X*(+%*J5UJ+XVbUQVњ5lN[]Rl<--+/YWJj*(R ZTUՔ-[[^TT\S]4lEYEiRBT*[jӯT.Z6$JI-\\YZVS]SURY^f5ڊ⢚5hiyl_).Z]zr:LgRt򒊒rR]Y6@eU%jH=hlMEukE(aKEo㌉_R:5kj&XįUUSJԞ0ʸIWKmD0,.)*Ք/*Pփ[G~j . WcMg,y4 .:Rlo?(K#LdE:ΰz;`151 N9=  FL>iSqr-=nTlC㤵 ʭN]tȂ(FfF<CQH_Y Fmnсښ-r ԊQ B(y(|h5-1 =(Q'Co*Bp)jV/{ =soFJZm@F[THڔTo7i0NaXN5[5aڿײV/l<T8mQibs4#~" WPa\= Uag)B-]h8lmV?l뭬ZSy_Ih᢫w=)sEg6dZm0X/B%d:Ihw!]fJ ކ&V,yfvݺk+jDp+ MF]QtQCuQ tƻI!=8y$3ѹAve|5œz]>+;{O:t?5 4)銓:=7 1>' 2 "m+XjM'ZXGttELJ>Cv'g֓ _"B; ŃFUtQivOxthZ! M 3t CSV t ?SMFFO3Տ;tZd.`YϪa 6E"t FceRcS1`<\[aiCCgE}'O_cHV.Q4M}\ ;YX"=֣qJub^_tM_}@͋JdR{uMF3Ҵ}=S0y5O_i*yX=8jNw^ǣ_{ޣ#P9nw3qsm xf&UON^Lt|4&O6-vʯ3 ,Sx!j~xzV.=ҲX=CČxiaH{cyԗ&0ckzZUhn ֘eٓQ(ZAtL =GfbZ^bX_.U#=/6Mhj*aADYO5'ػ2S7T .E }̢hSkZFKQ)Ci+>@-A%@bWCo9Kqt2Y ϴjT[fհء(/5?t؊QVS_-e4E|1Qʔ2ਜ=޵pqLELf &C)d)ah8ZJXX|0.J5H?SUW^5i{JKډp)La)QQY(L"5l"gȪ)VYEF9/f+1T_W(ֹwDWX+a*gA%0lG2&2]M5(eLFjٛaݧKER EeSt6i ݺ&lyr 6ٺzB ,~W뜯aQ;sg踿;4Zѵ[Sa62] J 5NdgdU:OکkMj=z+Kj7Z}hح퍦VAVk`DUDe2Ntm7FLu5zV-zͯPYV`^P]q5d,I=i֓:ݟMj@;G-@֡TS8N|-~sAVe*W-Eu~Nr;yC%kkAZM%?W_^ W2M6򲙜2^t /dGU}Ws#˅.Y<|O%Owu,w3<AI<$:`Fl#i*LM3S8{L.<&GڄGAwFG`#n_]Ci}VAy$LoH>+w@ |,7M{> endobj 13 0 obj <> stream x]n0E -E q;uD;bIs!93<"9;ÒSwtKz޻tKO2%s㶸axOwuIӤ;:_[{uf=<,/1TtlMm|;^\&]Md}>i`\+d "5Y1/![+u~Kރw F~[69`W5_r} k+pטo1>ҿco7`B_//u|_.%M/[8 -G܋пPu/S/i_l|?8SQFko]Jm|x?mvwCKhj/ y endstream endobj 14 0 obj <> endobj 15 0 obj <> stream xz |Tչڳ{2d${&2$aBD" y@$$! h& af|-j-Ո *}ETzV96rUZ{d;{ko}`i y`BmsPy~w"kn!ֈPdBYaR p̞Fi;޾Po~]<Ѳ~\E({&{ ޫrC U&H |% B01p-4]YNPNo0̖4k-#>#ˑ;]19cDPNx tݍ[f \G(sBlAP+Zt7ٛnvt2;+2΅ "mNf**@ݨ wxe;Luw?#g ^̀Q%R8~ üx8}v|2?;^b19MyNExƥO] _@^Dx%5xgjLJ7X hz؎9}l73\.*/?{yyqi!xU3쌓3Xf [暌饞2/#Þ3?{2Is7V|*=pX3YEsXXՂ(2P1+{WO5k̙m2uW=ƍ< ֶh&=fO]mZpuWe̫{6]XӈegyDLBYMVgYunFw3_/? slYG?G[[V _uve,'\< ttzo^BGPTэL@/-Z%{"w8\ z&E/Luov0 {¿&𞹠 짟eg I>ge si$78P>;/{1YLΘ~,2f2cʰ\6&+6^ki<Ƌ!NI yB7TB7/wΜ kEz""squ86 9sإYz*5e=eʒ6a{v #O<īfQ ww[71?We]\g'~~_ #cм˟'Ȇn:lj2cmia`QabT37Ϟ~"rsI FM+ !"3hDf )"_j̼%s8䖕BR;NAO-|..}WsguKիoطeˉXc_)P x]rF4*mѴhB U AY"KF#{83ItR~RqRyRuR}QQQQk3 JB\nQvn"o(~' 0EQ2vY?:#/{0;_ {Q0kרxd<_6kY̕FxWo ṷw3ó=/g~y 0J׎ ':uI*c-fbC붧)t6qգ3žqt%kPf1jYTfe$jFC=GA9 A7 idD9~%n$"">0WϿ{-5zwqY|-?{gx\V5SBny3)`L*NfЮt*LY;9-dә6td}ytvxq**+EFLG#2xP;=@ tΏwhn-,_aM:Jh4ZN5ޑ OU@ֺurkrUvM]׮oi۝uuuuuuu9uuuU5۵u{T{{4{{t{{===Tԇ4tCCC Jq,N$slHYkVz-}Ѻ_m#}!o. uSaZo=`Oq j\ؚWȎL//` +ƛci1=Z.וiC2xyKBhrlŶNQǬPairQF+Cƕa!(\P:0!1q Ԣh7* L:՘F=_ ^7VFm2āNbkip?S]^aobLДLe~>'j--~|C*)I~쭶d+ sRB>jV`)hQ!Y ֦4lV*ߔ4eL M{H.$9zrE%Lad_vs4Y]ي s5b [\[iVy%'m|baј)CF.*bKO]S@%CIV!v<r7 ׁ6^j *$aɂ? ٦Q +a6B3Q[\S߂J6?sq}*UdY#Z4k"3E8MN^P:d)|uEHBgTy%V:2eRoHf&tdeҭAiWrdW&@!v pA(He \ytW1P.tJ= NCif6bLZy2KY"ۢEf,ʪͨlXmH.[2E FC }ȆK۸t=l7 0ts;ӭfV\+-$!Z#׆l۰δM%'RrZ,.tLP!l u/Yy-f>cv0l=[n3/=b4@;g;?وgۣ6tHfIՃxm.j!']֬/Pitλ q$ FДʔ%Ja8rOlݶM˶n#!<1q_Z0K1%zݖ9Ex)EBFa4!T0^\t4N /1|sکuѪ|HUtk1L?<:s8uC}t˶Թ/[,Hc^W{3!}TT j@l ^qK. NdMFY!È/۷~8uL`d P6L S~ja0VC s3GΑ98%ΕۭMLu:6UfFJuLJ3ęR:RR~C9TH6{+_9|3ߕ[.הkurY*mSiڴm6}[Nls{5^]7uzskk;W9wwϭ()l*Wx +ə'&g;~y{cG>>3Q=8C:&%2C ~_-w5 o!~1OdGFeJ!u EHWvD]uH-`흩gd^R@]vr9 U?zX~TKn:z_>rlFu iIdBG q%på7OOfľ3T*:@,W|"'g)U/&?SjAL=H3RpIټ[LNn|bD9Qh4klTL4V&vVf83(rtƁ<-y<[ rZ?*hf L- ))]c-}u˿@nT \1jϡy F>Fj=TnAmX 9WLYA. |N΢hr)Dx=fbweE BCߘj-Y.^7W;\:Ɛ-HNqY`MO%}ikNie.&~o Di!7 !3%iiፑfWjcdB!B{Djs@Ԗ*Jm%<-5'NtNj|6"zLj~VdXP?' KmRj4Km zJm95R[\Z֠rmYfi{|[jQFRۄ*Gk{b|~W)));`,|nn UoDH]X[=w/|x/C@% v/ S+vD)PcsSC H ~,#]Pdmh dD,ZR%>?𝁾І"PH xstVF槭X"|{:)F ' Zk#X#}q> V (X tЄ2, z;)0I\PW1_tm $@8v( vT)८A?dC00Ai!BM l@Oq5oǝY p6L LG,!>rum!I DhZ CPj F !*'#@=>P3 Y Ā M34qCcp BM ?$AA~h:_5Ѕhpcm_<%HIHq~`ӘHLr|pJJ/@4Ę7 @D6"(J梋]$u]lz)g:M (1 & lApR ycz|1v&#%]Sq%jMBfSG> / °׷\%)Khn"ԲoimkᛚWUTxwZ5j偢o+u nolV4@_]CU꺆׭ktĪ0[Q\ ^+׵ں³VMͭuU+UM-5656*5+j@ `T\tY&BomYQټM$lyJRRf5ܲ_R\S,mh\Al_RT.eU+VKkZ&!d: 44Wֻ:;5TRJ=X[Rrt]b pȲ(P dTPimlnMr}]Klk!"67ğ0 I K|D@EfK VT"Wh!j6v1RrHTO7Z @} Ew&ln ~ |@tn$¯((%P"`!`H>X f%/}}0-sjB%6p$S6D17VU DðS}"Jr_R+V2Po׊7{AEpKHT{QZԃbG ӃJ*&YjԆv?gדÝԳO9 JVo:a9Qp2cӢnR  l覘9 iHYOd 7}bI8P2.J$-*EIbѤ@!:6+Kŀy<'y3ۉX!"{ />'E 4}'iT4R4$f_rш1 QRbSS.UD{ O%%HZ#H} c7tDNa>+I͒L]o]$[{THO%ww)@+싮gĮJ61w34C)J`H< et.qQd $g_3"=OQIQ+a8TS-|%)K?Q%MY(RA%k4c*0^<&ԶZuJ9N#j7N#롞lcuC= #z_*wlڄc#ZEyMo"tvkO`5zI–56_j`_XܩdUZS6Qx)F7+⳸gMyRk+\SXOVCnlZi.ւdU"deNiRt]QAit^b}Y-zk~5ڎI oP%N;G-Gҙ*H-L"o%g6!nOdnhzJl6ErqKYS}ڻ~~Z*< }S+ʿK)t+3~w9~GoO-~~.C.S'r6K||3~M U7b/V,?e}3gYÇLa>d‡F'A;7Or'bB<c}vqtxcܨ}d 1GG=&no6SޭŻK ?>~|N wީ;qN;ܽC;{6s|̸g3ߝ<;,ܝcÂGu܈ux xm9fߖ7z$[k[[G<.ǽ> endobj 18 0 obj <> stream x]n0E|"W"!E*Rb,C}=3:ϵ\a_ְ~Нyn.ۊwz+OYono^*vnƒobQn]ߍ"/E;1>U綇eݻ_j@(ZKVifӴ`}/ \de{{ađk~6ֵJq;Vi'r,czuʦĊ@>rO|z rgR# ٱ JO.yO?> endobj 20 0 obj <> endobj 21 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 22 0 obj <> endobj 23 0 obj < /Producer /CreationDate(D:20080222114944-05'00')>> endobj xref 0 24 0000000000 65535 f 0000030527 00000 n 0000000019 00000 n 0000003121 00000 n 0000030670 00000 n 0000003142 00000 n 0000003801 00000 n 0000003821 00000 n 0000004010 00000 n 0000004301 00000 n 0000004459 00000 n 0000018230 00000 n 0000018253 00000 n 0000018447 00000 n 0000018980 00000 n 0000019360 00000 n 0000029451 00000 n 0000029474 00000 n 0000029673 00000 n 0000030118 00000 n 0000030420 00000 n 0000030472 00000 n 0000030769 00000 n 0000030853 00000 n trailer < ] /DocChecksum /0DADA992A1575803CFD639589D0682FB >> startxref 31040 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Bugs0000644000175000017500000000024112277111530016043 0ustar synthsynthNames from matrixes are not properly escaped (eg, a field called flux_89) ------------------- More than one shared axis group. Tied zoom doesn't work right. Kst-2.0.8/devel-docs/Kst2Specs/DialogDefaults.pdf0000644000175000017500000012370012277111530020610 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream x[KϯstE 0{sd88@|O*,v<%])]]e~寿>|].-p3<λ࢛\r/|K5Bx40]S(~#^\S`el[sԟga->o݉?%k^x"oVd @XW{;ݱ=WC,ls/le,&z~i-!˱_n&uU:~zNUH$)ֳ͓\tD4~oZ\4:LKLh/PZ5d !uUN}V1(5 D}Iɢ#[,s[Y"k;Ѐ$+ ~%ZNGs% b[<@q62V#)sC ˪fW78.U>'smw$ bU{OWSXPʼni :Mb-P^1UXcoR\"x)i $|yz1Q |@/hIW<<% )j}VDM[B4);8Y`#:nCU7;ضy$>=w"'1@E_E8I,/Ѯ m5@D \S4TOL#iȜ̚[iV'F2)HW6Xi*afU1σ2_rr1sV 8Z 'Pec4ԎWB@&SL`aʴt\B{[L`oB}[l*VX, YdVY=YmVgk2R(VX YX*kD47kc&¶ϬG"lhP&El4.Cڮea ;k#f%–W#"5v!&y 7v$FZi(ajǦQ|OQr>[y>ows?QY*T{™=h1:b7[t vķ3NXmn6pOvGM;&ߎ]nZ{ӑMZ|ߩ F[CЩh3t*5_`(ChHb0J5^/oc3k}c. 7xaJGZ{+.P_K\2*/Qp@65ŐѺ;3_toe;hnIM+w_zs6N1&B5O}߿r<9׵3 e}EHu.UO=\ /DfBF8nbх5$q^qұ#%rxw];qwԗ0+!H w4y>5]]r Fr䖋Pi}3ŏbFssz)*-^H/A1]?> stream xZۊ$7 }@:Uӳ3yd ? l`ߏl$*@wYhǖeYG5ÿO_3|k.vϸ~~fa)N@f3??Ǔm/C5&aR%2Hd-xZ&XJ\BFWb"&&ΈшDdɊxD(1 "ΈшDdɊ،L ?3i6 Z xap56JҲ4^&ΈшDdɊxLD(1 I111Y1IFI1ΓHよx5"6JERhD"2JLdEg&|W#و-Wc!a+-[HHDFi\(1`j,Dlx%f+bӸ &F#Qb"&+b111Y qAD %^ي."NHDFb ⌘HDFXgzEvI@sA JX~waU#D. = މ,$Kd=T%IR8DVYd<=/^Ve:YL#W d=\,3%-rT~SJ*,N6D.=ݟ~.7q|f aխJ@^<jpCJq[[m8ݿN[.*Į6]x>শ; Ua;ڏGUQoA5Wt`PE V{z%T'Y7"6V7-%pdGn*|pS[-AHy91;3ؖi.%TeY=ʩk0+$|JD*YwW_ )žLBȦY 2Q7Bq#î{Q^rIBH4-ڑҴ]eqfk ռkiݶ`Rˡ['c]WBmL#6wC][`j[f=EB^VΖ?>tYhKssm(teMm_`A݀Au.7#푁JUOo \QQV`nF6=얥i)t)qЉ{.B/ZD| mTUƟih}jl]ۆq?s sYa>GB7vnݾG2E/.y9.n@'v[hyrk:؝n s5nA[ރ_ۀ^noܾKmvB_®Gs)>p>6wllݾy6^+tg_`hN__Q}D/Jt[bsGh v~ 2S_ {?e] endstream endobj 6 0 obj 2127 endobj 8 0 obj <> stream xZn6 }W@ٲEɭt[}(Kw&s#c'f`uwwd0E lOw.2Z Vt*(+) Njrw1լl'j5~":ַj+[+7M+w>+/ww! i/VDRX+UNzRTXsw< |Ve/wcr;: / ?<჻,&>8y{7?u#PO-[jSu0u ㎇X a<\sit8'd |2@}o6(2Rr$)f~fs-$\,YRǃ iN4'gVSJKʓdԦE7mr*Ls<{X~섉̳]3:NׂՈoJ!N4HT0EIT?.+ XΨ i 9 < AHpK›wO[" ۧØ {('tzHwË')Um_{9Z cJ E * +zfYj73~Ӣ>~)ȵ> aA"xg: cr@ $ >]&e#|X6 j7~)0h=cMx֦|XO iEOx#F͝WZOZ/דaf] nz*[sWkL]LW*\=<;aڸ}UD})kDA~JU>}*٧^J HqXexh H0S] M8ΩjGGlG0S>OXBtt#r^gI]+LYSSսWZ_ZGƄﺾ2~u׼sx GŤq{ȧz:Isl=a߼rrCb:{%{J sH[1߃ÿޡ endstream endobj 9 0 obj 1933 endobj 11 0 obj <> stream xuJ0Fs-XfjPvo|}'mc$9%} nQ0[cЗ(Z.ɉ!ҙT(+&ȡ3EKk|]< lw87>υ拷ӺпKA!<3)QIcлn3cM2ofO%8UL-J",5Jtyg endstream endobj 12 0 obj 244 endobj 14 0 obj <> stream xݼ xTչ0^{Ϟ'Bv$& L &!&!re&L. D DTFJ=(F=VW+9`޵\O=lyk_!3څ v7z쑗B?G;Z) G9n-B$skl[RHB<^:Bu{*{+="/Sz Ǻ? Q S+~{w޷ [pPɺ#pgvFcS> b9pߋp3a?3:z^ЉzdXmt=ބD_Ҭ)rjZzFfVs)(hEŋ?a#G:~כUڂBG~ y=`}904: x 0 y]׹m#ղGI[3tz=IautաZW;tvZJF-%Z&3o\S|Uq#M 9$;Qo+]?5~M\}'u@oPZ?|3(Vufwx:L cdԄvPc{Q ~vA.N _FHu?OVDyՎX哗/׮㓄#¬3__NyTZT cw0 eڔ|p"|3*ҽ&GyƮAҹscN{=3՞ƣ~4rP~?t9c EГuDQ b VŐTtq|1{1\+k<ޔY(#RqQ=(U×xS+NiVUx\FԩlUQb@j`IxʀCCyȊ7g;m~{>Pt`L?}}Y{M@ (iφM/37G8 Z((8/];.W.|g@bGq~ C}ٹМ,w¨n=M8xg.Oa2aNZtm<Ӌa}tc{OU^wvisӏywP .ȷ3vNoXBK@u8tC-<e/Uhᛦ ȄoK~ѧ&>|D"B 4F@&ENϬcnJ >wgw1B 91ȁ,PxPѵ]8d:*ν`cʕrw䂳`;٠aGZ[qa_8a&O<ã^;Gsy0CG? n /] 6u*{^;n^]( fsz?*3'C_B7}( g\HޙL@o77o$ 6SUzRf4uZ%8~-?TǞ?̝{of玧G@3ZgTX_zQo W|<;dH8]6sR Cܒ3]zႷ`-6/egH fgåljnOnj^ov;w>Bŏz~W"d*K#@׈$>$!wՔ Jv7偭/IQI@tZ( (P峌΀[[t,}^}@o=՝j=sxr} yVtWw&{&>}578lCv$xX CC&$Cm[UyFiP 8+vqEID%ArK+%(\Px@d˜nӔR̺⺙Ty3"\&^ZZV>GxM #i8i<^9@ `F2iv ,/3M&{7a_#>LMse95YN^fg36T6cjsq{:d@^v\q3.;%[NNN````ِAސ!m]iL;~,|,Xڱv=~鄧ϸθxx$InBjQeE,zݚ\<y?7?z=ÿqض w=}t'۶nZ_x|W y#E~KhX*˿en. )hq{.X>m w!2dC M<{cx/e|DK)g+](P rM\\i{bgH7ɍqTN_j>souO)>̷͌>{|eHΉ ?M@.<&(%hrnACbe% h87\q3v~l|LKf,K;GYէQO^NR4-}##SY)v2"cSˉ|v$ (}N ,Ire&L8K{ (iΜP!{Kvk4:?70PjcK/)т F )[iTy[=>zL4Eo;OY[u%3o 4ߥB4Ez| ꘝ`0 LJ9l&|f59aͪ?,V̠tp>qC|t2_OVA/B$Y:7J/uZ뀡{ڟ~?G^^9$uvBRҝh`46]d-p FX\N,92\4b[hIr:$D#= V7h)u)V#&esf`q_g,vJƛA610!FXY@^4茢hֹt':uKz0L fBsp!˘n+͵g:\[N˅bCqyecUpPn,7U+,RQ,w݀jq-WKjZVW+k u:GUi/l$0$6 -Ơj xAv nPR [[L歖֭m66G̹uYv_vKMX5b'&oc?÷mUFU.)6/`/qoR[@̶e4&=텘df-HŪCF;0qpg :'cw?؍8n(;o*GZEd* У}}=):C.nnǹqm΢qM'%񲕶4|rGhKCw|n߇?yIt_Ǟ]eg?0ڶXMvVcqVE v.Џuc?Dy%o7UEZlu%}{g2E',:ҹG7;a_TZt5i64]IT/vHbUšUjj-{Vo!$-EFze8 X9?>zF..*KG h!jBb(dZ!z<҇sF:TSɾ~~.liL͞ʪB7R9,+g"qrOL}Z**ء}@pԟ&GT AtO )?8idq83Y=E2 a">T$@;vvY!c d,4qNB"|,q'em<4%CNƤDdB`ivw뷣jrMjTgi<2Z( IҺ UBZQ\o]nCmb=ht߉ O>GMfmKLL$ӔicɶfAіeIe's˹bTJZn[֓:ruӘkL!bailmI-rnвŤ=H $F{L{Xe˵۽;qowFZ8|ҤIв;}ѽ{>}Wڋ3߁vv*۔^Ӑ2sPD3{ؠv{ zaɦ7譇 9$f[fQ{lzY PF$$ZQr ,{DA)f ~#mgo֛QSS;TeB:6?&M[M* 6G}6'Kc,{Fv}ݦs>7,`YUg;M.08N8mKr%999,km>˹y.;ǓZ,9˓ RK̹ްθtIfncJn͎giJbiHnruϾsϛNz@9w v<]Xr'Ə㳏wUFG'.>q:h.W4.]^{(H-y$sCCί$ ,e[#zyFi#?'7ɽ򴳉)pw۟M3`M%y+CUܱln㍓K(Cn9z*57MoIY9ٶ,D.Z8jIf8f(asгHEz`eT:i7~BfӧW'aexX}is◊"U߇X+yd$ԁNz=;A_#5-tpS[}OcŎOl?ǿuk_/W7[yKmsh~|9-U@w.)T$f)&A:t|g%i[ՋUWWU/**^T Eܨ6DcO-(H2& 3qh¨]C?j h< ŒJ BW\TXYԂ&GMq+:II8[t70_ MUK"6I(qԊ #C2e6 dR]ڷW^(~*GIZ׸{ݻ܇(_4΃,kx'Ϝר}uv^שcV`kAگY6 +$PFGP̷-&`LS/E 7d%fYfYps-s&iM Ӹ ?O~?߾?q᫜,D>CMG@H| I*'eVT. Jj!Hz# U S$^-p CpPʾ8<PO1"*{ ..0+Jk?m> as$ G#ǙZX(.Rpqvv96;687b#;îmNGNS.h }4 B}U.Km\+6:\A1:[]1q@sveLzjl9!gWL< :L>SS\rdi0B7`zHVͰU_pa,'@6Vu~jG7/D4pnl\G2k&e8p`GUv*rzHIjJ}CCt4vDB)g3ih_oǕ?Ox6=#gzAN:SP;Pa2Y/ZϣY5ݑ[M'&'lAU'$5%e2Zڥy,h}]5HӃl ᩃd3S'UγЀmÛGAQ׏~01~w딲ͽ7LP˙ǞwwbQhQ ׃täifJF^!s6mصYJ~B )%B5iQAמZkЮ]8Byƒ{rok'˷ͽ8 (y埔?^+@BЍ  l$A/ 栺̶X-XZ-o Bi ZL 8$|i3!j7-hGf6+>6n ?pQOdtKMǥp)&51eXsKME*Suwm Zo5Ŭ=M zA4UoKD}z%њpEr K,0]k^h>[A2*(+FlAѺٶYliC!Bomvcw~UL1ˠNFA_ģʓʓG\x!nxoO=ğtOI 4VQ={Q]`.tM3*[uJ[MymBE+۱10qVB;t82 %5ӂ@Ǿ#-UÏ~YvГZֻ١R;w$'hU l7X6C L_ՔlV=9KY)4L0ջ&ge9_^zF2DGD* BJ_Q$;ןVR~?{OP9@|j"|[ěx3nZTymy4vzr'WAJ<<=,zS/iKL=8+j7hkwxYҹZcd)(g.*q9b5˽Z.k[A ="a(& &zzy0=XmnmOGClecͱeJ _^/ZيbBw9ZWqHrUT&E'z}\ohѽ޳>),u!CN[et 9N'Eը7r 6HH"$[e0wX3>T U? .UtT.:h%!; 16]2xשvs~T`/tot}k#}^DT+|. CFCaC^&Tʅ8spDx뿺UF;P"Z _^"E[a}8z_Dck`ZEw5t( x9Bu`>}&qoB'p>⣜>$CpφKM'G,euzԪ$Zzuv:M\ R(yśm~{)ᦄ]LK5}SIID7͓zuf `^j0 ߥ:p4vk %5bx\Zc|/ v0J0~S12Oi0d7<`Y4X5XD74 4h0A)R am f`(M_`yLT_'55`z`q y-,BnN`0_n HoNA2 ܨ tj0>n[vN7 kSڢ=s za|@nt5kbl2Ƀ=`}rw/tU`o6Uymajh]10=is08WEGjcCFF{`oG?]D-qzI*i@2H3LX ѿ+gs)OIuw]He`[//Mb;@Nک|%D([IBc5rso/XsKW>PW(9&w4PLvSzi3Ji?E=*Y%>_NƏ߰flA H uQ*55 rKznMceiYVRi~ʆ5kdQWRӰ^^S.Ԭ)ej5ureumUeU֬Z[ZYJ^j4UՕ a [,ȪVVmɊʪʆ~,%rmI]CʵU%urں5eT֔.ee Zv}]媊?,jAPWRZV]RwRXٔ\petq}EIUΥYUhmMiICyERL XYYURYKKKVOmBiL.XUVSVWRkVVRXYWك$+ԗݰ`^| PHE(V25.Ӱa+rI]e=%n K +(kATy5TGtjҲ*@XO\m͹B?j &Wc 3x8tiE6KGֹFqU54ڕo\tzuiO֤(LL0~-Za>w{jg0 2㺞~X>|汸#3̪?ÚTgjKNwҢcWXGۘ<bfahڎAgTsq%je{a;Ù1"ÔǢ) |6 3}eJbcu2YTd܎ۚ* 57>,ȚT{t{Yj8ʝ!/ZKe28I70xDǴR|E`ifT_=Ӥ(7Xߴ̬GWʧKy3,j|1%3R.Wѯ齋 AT"P=o|2~se i.4CWA>*y1m+W6Tߩ"ϴ0Nu@&U$Bۙ{4Kb,&WL׿J{L2h 1|{QZ OجTigY){ &k>mL̢;w15/0^YXU#1-/MJ}֠t#ԓuY%PF+R>Ocx#Rqo{=P2wEזul2Vf10Ze^ 3 z2WۇٔLӭ+>e}bteJe>qio1ywO1*\V̊S *Nr|U!8ˣAr ?^^ M򂉜2s \d'<) 9gFV \"# yjBo%{,|E4ɷgOo* ALrdQ8I_Osɡg $k1Cn?Hn3]K!;$ag"uU찒[m-N2l#Cɠl7m[ea%u`U&H f~)dKEآ^ {IN%]|tlDB:7 H.-ShD|[& % V7iQHB6 M ٜKnV&t=ٸlPRN!7*Y s HP Re"2M/T$dUNR eQ(K$+Bi'YBV:ɊB"%Pb" P9e|aY5nKztQX"K#Y\o"ŋB,@!E׺"\[uP$#)Ps%$/-%|l&0 s <`b sA3'_)!s9$>dZM$#!dԓtX >MOR!uS삜@| lb')F2;'Y6A|$|/lUG"nKpw)\NyS+Di Ϭ KxBLpc ,$FcA AED; n`P@x@'3\OBIs/6_/{T endstream endobj 15 0 obj 14901 endobj 16 0 obj <> endobj 17 0 obj <> stream x]n0E .E %9!c>P K# Y^;m.,3Co/ylaQ~ps)\!Fu}|k3ey=>nK^gϸv[zt)|s~_caXTյ9Lߚk%~y<ǔ)(#cMvmj07%d뢨z0tSNcE\/`K`Gނ=y.6xy~!7•J6-قw_8/uG.;0+8kx__ ӿN7RgCgWpD6w1J +a;k%`pvC{3p3wW 7+C:6#&,'Դx?6K|䏳[W;`> endobj 19 0 obj <> stream xZ t\yo{5ڥ4, #YmfI`yof,`H 0 !j7T,!vICKSB)ImЖ}wph{sggYU#?.B?DΈ|3 [{o ~ 3s0#$B< 9H7Gۗ!T&ĚLܩ]_ /xi(sp'a1KeJ`Ÿ'wzPf\H )t\w7"TR\=!N )ɴx)ؿ8xO%dlPR:X^QYpF"BP(v#@9䁙7Z@  At|>i2a#h _K^A1ti4|<]2t}=ƽۑJqFu%F{tL"%&8Oy8m 78h|z >E WZ!6N#hO@ǿ@`3@x]VzYIWR`u,B;~ n7 2J8dk& .yvVm+,3bM8'+ũg &y$[ KVq:w:`λH2iw:V< > <vj}mcmscmcG&JVRLg Mk1m\Iߝ_ho۷fӖ۹of;SD@QWZ3FhUxՠ~31on3,[ 5\wp\6t'M'0_ u5.?"Drm^/Dͤ4XfmgIiHT]:ZSi5W5KR›/y8>049^y~th/[ٹޜhm~0c J+~']jҁ|FJ@HgL\8DϾ 5k2|;"Ļe_)a Zєxw+U/)dCZ\}߾شێ򎇂w^6flh|J}6*o޾i)wS jo;Dfn^f}bZZx-Z}ߒ@Jh/|_<4,ٲnx0Biڐ!8/ցy0MqIu)U<Iϙթc&.;{W[7ծZrb$~!dq} H&eu+†:@o3}w5M]ε+kwﴗmg,ErWqGmvOkоMim| Iʴ<)rZ:u~i߷OZj7p;j8j[>ꎜ$Mp*-ڊwŘ͎4p"5MڣUיIItP{o͎6+]3ߏm^ξ~ c=&\d::}PpJ?>Ė-`_@Gs@6NDvYBqT,[[a<\ZKi6i'Do$9m] r|jv[}+\{tv.y\nomsT=r\Χ'ԐƭF s }iw5j5F_w-^lݸ"%0T)2CҌ"?qFAyFC5+A*ʸ5$kQN|㋌PMF~h?b+]*/`t)+_Fi/_h_>h_-)e43Z@0Ք?R4\Pcˌ&h<(c.A3T4FshN 8Tͣ TYqϊ{ 8TVq5Re\N/Q6tpYMtR8l\#v8<:AԺ]Xq:!P=4Y@;vOx8!{Db/AB}`n!G= 1@r{L@B`3%z|C_ޕ+\^E{\^Bg% Ifs4 B/q^.ʐf[oBVoP½ ظ%agѓGpEd k}@ui_y]P%G4Jw:$;T)@*RwstD 4Ql:ivT͌XZQSpRw+q+yF= 'gS T å*{_k GmaQ{P5YO%V =G2Ypr ԉ8S3 z'|Jtm/F4$v\gBWT'Jj|Azy C 76xdƿwPlf iˡ#k$3 Ͱ>&\d8eC bϭF#bOQ᳣]9PDsFa.IkȆ8VF]w), &S=֫BJRT>*^0 =?C:3C^pi­W*`sQi戬L*2OA?TejЕ>b},X ;9X̤3 Vς72 CkmV3t5g-X^gYEd@ C&N#OOJ,RBi>s._-%g;"լ]w:=:m*_љUWhTr!@{fEY'aoD8TS\1%sS28<@wII1I;C!Ž iR@ˉ4fej4߷swrMͥzDGݜSqUDs4d棅=Fiց_|܌ܾy()20Fysќ{ϝjsfdYr YSs<)&Ϊ%|^oЊzѣ,嚎lEYvܙ]uEn$$kLъgeL?ۙQ=ab TrR;C #bgF>t'=ts"<Fuм Y7xDt$!阌 m6K9=T D7̌нFu{nѽC/>/XZy6#cvy?{vLtvGtDfG= |^Ƭ{1zgB`p_>c!A~:{6IJL+R%oKG`Gsc9u4BS.FP$x9=EYxԒ"5ٙ:rzi|NNwgztXN(BH2{9XuSG! =v]Y!n|ht/:)ڛGAHQ8s(t|s(iz+g{z<W]N8N&߷ŷ­i)7 R ¬ޟ37ɕ CwۯL]PJ#™S{*Ge3uK5u4wBnev3!e/;[qzƷOA.O?Mbߩar2i~V u+>##6PAse\Kio}6Lo~Vz O$]g߃ߣJ4ϔh-^K6{K_U"|W/wx9>I8ց7- ?oj ?&{>/5~ E>zB8jG*w'dGek~T_ڌci_/[n^,|IZlU?o'v^ swpO3Jz|gwiwMq4;OCח w;l@ݾvp޺]8x> endobj 22 0 obj <> stream x]n0E /E#4BJ!H,PI?TêN[ Й{GuTu;tJXp=R$Br{OLym0jDnXE=<0RtQuV`eiLʒ ܞg_w[n{g6 4ugf S#"KZ4MI@$ ~8iqs~F>>"g+c 9ȧo=Rs@5r\k'"0(_q1`2RY_. endstream endobj 23 0 obj <> endobj 24 0 obj <> stream xz tו~Uꯤ$ZB! $PqDxlm@pM83p'q>glNC<3*Wխ؛=sl]u{Vx4!!#CȦۗCշ+.>x+|OG/peu Z-| d'4 D|@1 a"0s8t\oO#n :!_PzC]0DX$oC_GIJo]J#B(1p-k0iuz/MfՖchځ>bh%fXp`an;ݎCt 30cNgzC!%Ycz ̬fT&`#XOc ϽȔAу,1fM?E1HQD( ޣaGI=m#kiC>F03NbE<jF@$`$^M=`QoG!wgk]6ܛhTkfju`+-B57B9e-b ֽqVOisPij))rzVvs{ϲeT;wnӬRhLüE|N@EСB=԰¥Ezid]V^j+gѵsCj+h!12wQ.[[e2,De#zuҤm9|IIWK/0]Y6ame "YQC8^#33ʛpq2kS$ARG>-p6 m|!k"8aF뵦5`kQ.]&&1YJjv=w6cg/^Rʵhz{"kpsc1y70k" I"x*B W܋kϔL?}2{<qfB1c\i-PWˬyzlbˢ+dungI劜չV.X^Q9ZWkskFQedT-uۙ팍hbf@Knc/shue ze``ɭw-aږ3g^ԫ{džb#w=1}}C:&{;_x;/ϖKSzoX$W/ h;K;cфi@VnyZapVH8lY:Lre{T`_jw67jdz#x6*+"*&W^ v`ZbWS"5g"62r#߄2U27o3#L%S!Lc=z R([fa*Nd"q\ǖ(8^tfvP+nZhU\W5qUDIGiԹ|~!2Uo5^4 ԧ9lcbiџs"EVZ_nЮsk /xgJt۱xyt^{^w^p.j/./.F0UJkٲ/qC]м?U本~'O?gjg 5[?ڭY ̥g?!!^&u(У'cP@rL=2UҀFf @]X{uť$ Yn>7/BEXf[:CΔ0TR{- _G=A;S+;~oho/;^ 9q] P]kc8x_w0>6vw?ӧ~UT޷RX^qϝ.)C5KV?ҷ4K$= DŖ=Q 0u[?yPS(_ܭ߯9I>%do&HE{XmbU[u &*O98Uk@:c^{:UXW)Zk߸6L+k%hqȢ_yJK^y j]nWK AѮ2JKpіq&G]u71{D.ɳ~37ny]R=ö; !}]m)ҖXJ1.٘]fdXZhn`8rԷ"P+KO55RE#2mj#c':.W7_T:hnOVJm3^可_'㯿`^[p B:#ԏ+9 6 m Us s1PGr&զj3<6k&,,:%s&HaΙKo۔qmg t'_`^0xFq>*elҶ0g)/aעLnb[w-cv5S&@H9 1__kp]0u-֥96MArM+ϻftнzckb^(1 , J PMwP {ɯ ZָJm{!AB)l̢m D7m׾wL浇G/rӹ;A2KF^Br硼ql qdXrVi]sgS]v*_{24B)tWe-f1m"bBk̴ܹf>#滲Ro8scm O>.G6!,6&Ä/Cem[ p^e P!Յwb6lͩ&4o}wҚNgg-۲/DO${s/ _`^(;f/xy;_G󨅫E^܌k s#h5ST_Dh*zM[v?f7ANM+چW_#/9 zmS/i.5=;uiO贺zT<jmY;U(bI΍iN@[5S1 0qTȗb׷7A.k+(Z 4OZ[:ڽbwGwKcGl;:66{EGc7NqKw]&]Ell׷7;E.Ow%nlk\k{SۦZ7znUIz u0l\q-vB6]֦Mm]b禮Ύnh-]ųJΞֵNIjllhZ$v]"E)L6wklk״z] Xgm{bM͍֎vqTi\QdU[78 k=Lδ9ȆvOWcS4iRL=Xٸ &/CYJFou oG7-ʖnSlj&"tuğ I׮K|Dn"U=m@q.DgOV[)*IV)kC!!ɣT"GS-|@ti_. `ȏ0)&1p  3ؕƂzm3*u Fز;C1} GqT=fk@̖?*"pRvIJATU닯Hи8@AqhjDZ@mjԞ`V-[H&y04AhZ$_<T|rzR) i.b*ljks7@ XHR$n @ Xz"P"/epN"x1%I)X ,n86N8Pjb6&b{%X % nKviC١ךhhFDh/U@jSX1x`"c.bL%HkQ[qnngkRb/9Tk  Si803CmҰ/d6Zr*z&P J( 4HD Q U[%87$CAV0\"JӊёO 삻0y P،>2@1E }^<ͦMP?HO\06ӹ̆<.`Z N qv+Yf^RC ]T(0?OW47J49\a*apո E>)q*VJ=E`++$|L`GF8^?}ƨ\}ǧ`DeRӕ}VxaZi$ۉq% i%A圖O5X8]MdN5@d7Aq2A:Q~tFT*& !p3n'LYKH)+V[k"m$YQ7njgʆ~Z3CRG?NLп0@x'3*PTIW|@1L+ô2kѴn!ʕieր}"٧z7]SXC[3LQ}>gE4s˧jT3RKlLhDZERbS3.u~.@G4SIB<͠:ͨ>=Jx̶OSuʬq>d&vNt_U=V A75KGf*of"ZM޳wԩȈ6%wf34&|Hybnb1 vK9|JWdu J/gLQhwNVkofU1r>[s6I*RE:tUw̤ǔs1Dm;Q>Y^5G؟:|:P;y'Z+̉uf5l3K#]![&;&JKwBfmh=-׃RM1( 0OGv4&x-"ݨ¯vyi}DER/Os)U+嘒l:uhRzD~'r6RʄfHFGdv<;ڳHNuhuE@"Q<;7X ryWtR >t?ẞ*u^&4ՖӜmpT/xo~n*vR qHA9kĊĞmi̮ 4Q{ɛ)Fjj6;7T?T;z5=c+յIBS{%&2Du$\=jL5RB"{Sͦ߮z)e7Ze EjN[UM&5>;Ғʹo*Rxv(RgzS*awNW]8N<]gܙtW:3jmf'T78 ozVʙ5ΓJ%+=t>ڭev~ڧ+`,ݕ(G8ݙ즫g6{1W,MK/}[ b7Noz+\vS8v&DKz+z4t4G#;UZ5*(JMۄX@u+8G@Pb Ǖ_OZj2iWC(?WHVs[oSos_(^ߑ<?>tc|0)7ί؇ϯůï _ ~ߵ;nor.g_( O\)>KϞqϺi>=~:V̝odq'7g3"*<s eT!~҄?q;.'=q?1>rq7ur|쨍;Vr u 1#n"|X_3G exȏAt_}}5?`_9s_qC<>XǿaǗ/ b|\/fs#xlčxԄG 2n?_{G{۹16KnI7^w];qqdQX pkpHA[xǃ2/>엱;d|W..X2 l-z"Ņ7 ]yBU7vrquxt s}xC0opm\"׻0>jܺ}x-[<&Ņ=Fc%Fܴ&k:Fk܇K یc+*xڎoWs+m+<" /n>v/c^fs *8Ua\2^duF+Ƶ*ڥjqUNa2zWp]-<^fq9(?er*p> endobj 27 0 obj <> stream x]n0 F#q[oO7G3y5 No}?Gooу^2>gLݼk  ~ endstream endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <> endobj 31 0 obj <> endobj 32 0 obj < /Producer /CreationDate(D:20071112091704-05'00')>> endobj xref 0 33 0000000000 65535 f 0000041158 00000 n 0000000019 00000 n 0000002815 00000 n 0000041302 00000 n 0000002836 00000 n 0000005034 00000 n 0000041446 00000 n 0000005055 00000 n 0000007059 00000 n 0000041590 00000 n 0000007080 00000 n 0000007397 00000 n 0000041736 00000 n 0000007418 00000 n 0000022406 00000 n 0000022429 00000 n 0000022623 00000 n 0000023167 00000 n 0000023560 00000 n 0000030206 00000 n 0000030228 00000 n 0000030433 00000 n 0000030790 00000 n 0000031013 00000 n 0000040181 00000 n 0000040203 00000 n 0000040402 00000 n 0000040797 00000 n 0000041050 00000 n 0000041103 00000 n 0000041855 00000 n 0000041940 00000 n trailer < <28027FDD67B8EE519D78ED0E6C15E8F3> ] >> startxref 42127 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/object names.pdf0000644000175000017500000025032412277111530020256 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xZK6 ϯ@RQ/[@``2z[`z(нW",N-f[)G8_N_ZsvӏM/׏cd>~zU]j=ɋ+\K>3e㇗/]9,C /9Az ' y͏t߫cSt#<0GMlĢl./5 eZ,Am$|'$Ofk@xOjLA :zVx5u uR@'R E謎w 'Dž;q$ҥ oe)ͻr_aVGQA`p&PYC1Ij"y)dCqd eKA43WpIIB8ſ Cp4@h`wXu[nb U" !& ƙ3 ]FcS;D$[QYuOܰgx)>> T-BiuTY26x )\Ō32gȠmx;c+G4_\Q 5 gcyֺ ⺐mѡ f$LnJLЄN(ڗZPVF+c%xCg$!@_*p=W,ePc4 E0W_91 )HeF]"(]CHFxl^%,LQ9:A/١-S-ڧάe暊yd  f].U.5&#{S0|jJAOI0*[s#6D hOe#7w1Hd ̓uN%) ܽ4Z}۸pen H_b((O%'elfpR 1W2ef=R]lHzB<PMtd#elUUInH^@ݦbz':Je;I{/a镫SL³hi*b%Om .DAJ$i3.- QWBn'*k,t٨:zOW,T2t8ێwiəJa mfQBa-R^Pv-^hM_)(9Lj!F,lߔQTOi}S I7cTy8 @HU(lqu?Cs0(BK}PILp$\9 s1[Řn#'ףK/7s EJY^*;easWGDthʖ[Z仰߀g 9"11@cNׯOU@!{*:I䬸ݯH] quYZ`%H^[|ƗDm $ ^y7܉Z1=gqi79Pͮ=ޓ e%zk(NJ]ifdۇX%mNC="\Ն'Ge |~?z> stream xYˊ6W:{zz݅,Bv d#U,k^cIGuqJ8I. պpO_/\֓ڿ<P.oQ)/j=:Z$Yۅ.,=5 8ż+}&Lv'mܯqWY =CM`$ގ `eU4N ]^,CFVGf;D 34ؽXΜ"pq !dXh`}.Hw#0(w8<SIޞf)!:Zff12h C`&$?CϘs$SXeG}`ys0J}\RL" =[li$a!Ǹ8h4q~t"g2 nFi*3\˻6f vu_þe%r'K+g8;fX/ި~Ƨ= }kacZYR6]EW?/z0>|gdm~"Hҹ#1[( 3(%O1Z'^NLe T]{6y:i1Y{Q a'KSkqל.D*OhWR܀̒,XL-1wuSKG+$0xM2/2Ӛ endstream endobj 6 0 obj 1658 endobj 8 0 obj <> stream xXK6 ޟ_ua1d.tBM~%=s.ʁ!Iw#}cyZ[;_F&}:Qy FQq>W{.YpPOϏ/GZoЁcaBZe "i˯.B[qTYb$i!!̘9Jqư.QWU%*I/;>0+^H&IIHsFRZ}DV.K2Yݤ: p'ϥގPRL]8$V"`X %Vc<.ϏcA. 1X$-n&HGIU-w2_ e}, |Jf##'e`}L'E:Y 2!X&bmD Vt"3]Lu4c};9T̹$J lSjuO4@1QpRY(E fPx>AW@92[ v$5.c% -u5 Q8ӥt5 גN{ԟ271DK%㶳hwW% N-VKK/ uhv,|@&$<4_ՓOG|t*H9m{TsCd&|%WTM/âWeK/uT endstream endobj 9 0 obj 1435 endobj 11 0 obj <> stream xYI6_@wT%Y1{96 [&K~J%'ۋTW韏OtVtk<_}=/X??&{O - OYv9Ui/gB<_ms9B^XRmFߘ6-uIVqY&&R3qLHH _@n]Ubi!8Q">ݱ[w.SBV 2=`'zY\ڱxUxgKʠNhсGfe^dՃ_iHVsDZ𶳾!dc̠*.b",Jqu2ױ5$)`2NdgM\iLޔ|w$%(@lwH1w+ s L_ d, `L1w<_]PpBA$*P?FDo;\"Xx"9g+`PpK1l>bƐҖ].t#ӠxP7Vj - )&g:"90َVb<4r4Gz&SVo]I䙘0* <ظm1_qy_5F mbzޡlUr))LFj&<YNCm5e R ̮'\@Rfbʅ[Xv5q䬐LUck=qDwн1}Y&Oo<d'Pめ_(Ёgo(5Rrkn@r9oJ_͕9V,fAi7 ij0!gnIL )HN#&.F ZwINεM1;T`+9N}z U h2V5 muθS}J?tPʦx7!|}{8<m1Cߗ o76*] l2٫])XjyԴwPv94u$1m0 )MJjSd TSZWU9b}~;߳r3WJRLW;dMN~ 8>oDY}pY39Wݦjl*jE{<ǎ ,1Sg! {!_<= fu<4{d#^b3@)x$F%>{s׳p%وW 8fL8oOAdy~''C)w>6GAj:!+]8kf`#9ۃ#VHH18r(4C^Z;鴗 2 :؛@6Ad=F 6I!qcIwZи1pHZvR p%څw@ Am&]F0!U2zZN+7dY]q{6Q?OV!=b=Ҍ/Im|EIwjHP:瑈4uZ> stream xRMk0 W> stream xԽy`E7^Us_====sI&I&wCDPA.# DvuA cl%x~ՠ]]3pt2Q?!d 3yyrxt!]nB7=3HƓ ȋZ4*ڇ8ŏ YwK9#U߂C.h` '|߈oc 5ѐ}:nޘ+PdI0p9n#IR`ܛO/ͿEPacDKhz }l<"#T|q%"_, ^&ɼNdݒs6][#Ё ":D?ohqu$ {'\> 'WHianf^e%ɹ;s-i4Mk_|= #]-v'$<ŋb܉/×U[.KX%NSE"K09t21- c*v ;T4VԿvuta޻z_U]KܧyS~g3EUpp݈x9 wTǭ{ D<ρx>^7s/U #`L s"I~$?3qajVf:U̼O˹ikct)Pg$Ha.DbOad4ϟ֓ y6cۊq4y>8L#kk A7RZt+ =A[ I@3@QjP t"Ny:t.{/z m 5q&7͇AC]pzE%32H.$ЇCeF v): E)\V߆_+E^i}ڡkm;B4756d3ښTeEy$E#a9 }^vN9b6 zV2C]]l<2rdGf@Ì ӻB4bpt[hpOz9R\5WGB]S&AaɡV퓖g58WJ&(aL[zn2/ AC〶3&7Ln̈́JײS&!4ӻ ).2ys=H#[T{٥qc.,ó G}ʔI+i;zZxXhxIDzδ2VeY:=pڂC## d,'uѳijL7 =Jn㧬\itlH+GDB#VN_9;lf$EVn_xo5bdxLFl꺱y jXZ`Q“ C<m{#I?2wdp擹#cfLU] * !up0c_6j`", a#-ۡGvT܍݌SC Qdlb&w]MmW)ģWq$R 1@OCawA\_[-TW;Rm$`V&>z1%I$'%ȍˍs@ acS OM7zݮp(K n|,B²@f6<®!F{c2sxd2xkܑ xG'q\w74p-|CʍB*aGwmy}6;2Uͦ؞ oRVLFخIdDx&]ds١ ZG: kX[SǒA'⭟%uw~q,t9x_dEG_Yk߁ˀ)fX!Gg8I JN%҇qh|e4FyO \]»ʻƷ&vݷſ{5տhBc_vXn24Ex1pQ7LqCMi ;7}+HrcSCjis=UI0߷x`t#c'HT_d;-eҨ┊:gssU?^~n6NYz˭6nj&bOam\y@כ}L7 \'$0} {,X9^ǻ⻭ q У韆&VԴNz}icJv^v~ӥ+VdW46 )di$^4=nU47tMUY͌1v@;p|f ĕeԤ L , 0ψRtSDԦL^TK:F7ʦ33|V'az0q=\O$T`/+64 U(|s\ j6q}~(T6wܭ- z ؃%0ݚ N+G~K6\o0RB=p}&PP6bmM$Y誸9' &H$&[^(C;=9hyVJdE:.@Y.1ʎt"Uum swh.Un6c/Tn+fуkO95u'],9D!i.#`x$gea'RK)> *9#J9^v~ ?_:UBu&a11 ؔ||i^lr4rC8yNlNGHSʕ1Jnuu76Ib譒euvTgj}rI?ym|.HrA+6C8ŃAJ]7 89(\衢ွu|vZ9ّ`\0^Ǥhx̋tPK xGg>]xewl⣢٠=aWx`q˞zf^ލ*.\_p+;:t0UX+`0 Ɗbn&cؒ%%h8i ]Y1kBIYnF<HEmqe#k#"ڈT{ &: h` 1t.S:pѹ[ 7tqU M˭*>U wN쬫+*>rA.>Fȃ }0ZTNRw!sp4efmlC9"Isi\< TQ ]eR,,HttD=f& Bآ5&i4anw:>Eҍo{ҧ|+VՄc,HS06ry3qr|RL|P}PQ/1eU1F+TR~IâӦWY"vvҔ;ݻ{kO*7:.rcn-o=o4do{+*G*_xɃƭo5Zn}]֥:* X|ԳNƜ`p̥hFuM#YLu`3<zC(.|/[Xq7ڎVA8 6>ܠd5e z*clp<ЊgZ[x;~E%c / m swֻ)33)z:qfm"my H6D;QDW()z12L!sl!5,CζE6@GFӂ,%ea,'-60Q( 20՞AZ {ms}rQR ;8BAp8Je^4 HЍ+&iJ};ؠXWPǰ Za$k#G5R5۵-H?w` W=0i!GpqǷs>]^M4crBO@t$+a$3/RD=#/lZ^d&*&k)oy)u+*%%%rȪ]tN2~GP뮤~O4@a/?%WEȑbx4 OzC`\hz/qE\elc˧/*|_SI4"MC~ *mjSGkX^ذ^(i mw:l7 wt㆘% zojnPdq++*yKu NULGudX]swpVvzZA-mN#pf!UQߩZ__O,%ba9\:Օbl(U>_W2c2Ȩ+_\Δ6%= 66y$Yhl$KfOUgA'T~sjLT[f% 0"~y"z3/q{JED )_*Ъ5W U6_[dMYhX؀`SQ3m պ|Ar5u*{n:`\㒛7zЪ}\ _S._Ah܂Cb TriNn)zT}/F u aM 7M%8*aMbL.JO)x**)-^i Dp$ٰ<RAT7`}9'P(P/VJ'"KʌNb3L6V%b%uOr!glJ`$U7tYYUYձߗu@\SW^_@x cK]sUfUU:Sro/~Rv1\Ôt@V;Onݯ=heeIFYY"n؁a$oG͖=AdžA&?MML$z#$:ةϛt*A]cCh4sp&$qr75Է>4p9ܷCg>qE(YZԯbHDTxK4ZЯF#Yа6Eync4,]a9|YU@H?3i(~_??=`4G>+W){I0S03W<ӂKdM`n}L$1iS^8A FvV&L_@e\)K`7^4{"Ѹ'B&1qoG<ΰְǰpȠ1dJTUnܪTG >Ku͞f0|`R :jC_(:ij2w8 Ӣ~,ۅҎ|OO |tw!\.X7䂪O+嘼-FOS|Ki0J`(Zv>l$ӮNJc+dO1O;*O0+[9#{_?n; J7zsa jk0n#\8,< s\#`\C8mq#x(oxSu&&+H̨H.l-LwokfoiݦIi4c54gxM<[sKOfҰ8*gAHcs)RFs nWITӃjua(P?=Nj8UPƅ@g#rM5xp 9p&_l:OM/aW i6ͮq҄s& i¹Aׇܭŋdd|=80+t5&8~鵹uGUju":3iIn!2YgsC e% h:gx! s0zO̪qN~S &/\;=' ʒpHmnJN`YOk~n`:ӝD(r .%R\f&n ˲l"`=>fT\$rNst2No΃Ѱ_DgsGuPA nDtU?6}oduuD= 7yKXnpmu+׺q+li6; |5Nq_?ܸ{?)6 ^;e dw+r?kڢ^:+l'u}SHcЛ%" W"o(FtݎF!Q /ԥ7G}_#lMc|V0$^b匾 Vkz" V MI iXDbd$m8a`T" cPLfǝR?8afo:~{om<~a<0מ% SFeC{}[#>7PŸij'&l E{^W eRUq?AwmPx\Kp,2UPS[WSLez 7ez17., -~oeIa 9.Id$_|~40֯x0qL|>o0θTuTd2YOd@__H(MLLK,JlHLhJ4P-qSbObuO?ar~`}>LKbX u:e `Gz> Վdv)ނDY+?T%?iaahR Kz`h# xF1:+C.- Riqh  _+. \,F.j. d@Ssfu kV4}!'|ᣫ Izd}=5bx՝oqۏw[݀M3jN }3o޽"} pz"#G^gn3Ȃ @7a :|0x{%e|;]Z_=H|ɢ4ɢO\hFP ۢmQAyR8`#9먯ER׺oŒds`r1wzf㎇fu5S}ri*xjFk<=36w<0ѫr%k+N*8ƟvqYQC㨯ЌJvUIqmX9<"z|z!Cѧ6͉H5ǼEF/4CO_+Od,DZ4 " L5F S .VWk #'ѓe]|i82LlƯleLhoRxXٻOhpQA3^d$]D5)&N.d3g.h|6l w?W206D 5RDWŸ)NOY<+|[x]SheC)KO eJY-U57st<_\'kPՕND"S΂M$YY$\؎PqTǓx,/1 ̯~힅bP;Bno]V$RM59MNÍ~^ r{O~ \GTUzmHRNɭI̜ ]zTϤ%%gnȬ+{;CT|WSЫ%#2 ۿE2L1$ %em<DuqInRJ N*).ԻK#2zN.EdbA 6Cq[H|kmAa<.6'|(̆fW8q r@uG GfKHQHS\ p C4dZVC3bt;UQ'e)%OjՄB]sϔe7(r?~vS$së7L=j_(x33X<,i_?>s}IbKݍ:G}m7כFW՗Yfa32 *iEBL'm_1=.Xة~: U4tfȹOywHV&E&~. ;n&ԟ;hnDajڜ! @BW/6>sBsf.nbwb+$0-%A6_ nױsOD^&0Q Ϣ[;gvvńo ֭{[2'kdl6_Ha`O ^FkDxثA,S7y<^%IP,l̠jI7N>6;U DLjiv\;--<4p1/k_GlKJL1,\mzyyKޤѥ̯p\ؐD$B`5XQ<ђ0u~TYp7^P9yT7߮XRNŹع:kVǫ;f*{6MFa&ݫQ|A+T;xoF3Co8BRXݽ궗Onhy-{ExJ_K t=^yZ0|i_u%=yj'Di ԛD)ǻa7!s`CNRl~{oeno4wSALff+f#U$%"Ыٜқ}Vtn\tiEqtD(CmBHnB  lzCg 2c rtJ9{HכK`ըxSD]Si;X&`AkN–ZGq>`'Od'lQő_+),ܓ__SgeONtXkjOhqDR9'ҺCJ9%It}M eCHt{CL~٦ݧ%ZOYd<2Pj FJnJ+D`sL(q܀ץEM?߀LUJN/UHx])t.n^cWzVM58Ot:L2eK+ۃτD6мٮn0mQa3|ksģ᭷~Ho]C/;6r~svGw+Ӗ'ZCrMᒇcIzBRQUF7vDNOtTV;!=~jNOgݔRpȓ*}oR819iNK+J2%me 'FOH>quZQww͕W[J_UGG諫ohdӵULy< v}( 8M90V(&Ƒ&V*e"r~ M@L*Fʫזk/R`>nRqwu_=p@ >gݮczwbFD%06fd $ IӤNrmi_B:A@   TA3ϙF<=>N2PQXyO4Yn8ӤӤӤ]4PkI y[9bޝߵK@! L40} q/)d"d-2.sr;ԍ#=u>Y؋( s7DKѧҐ{Q,wza͢drWW@8T c7/҅gΪryigeRtm試VǠ ajwsvX]-IMD!35t΍5L3l0iE zH& |seAF݋Zߏ(!._~yo䕻Tm3KUN,rt}k `h;"RG.^҇J*aRfF1cΖ@RHJ"fDß-_=^-I}T1FJ > Ȅ-[ Ӎ"5hL@{Kl,Bo" Tk¥j9\>FsL_0ʻX( rD vQH b|d}_SD[I`)HhuHKQI:G%]͸ so/ӡ.;dCWtuFWlqfWS,GP&6JnMEIJ-U#nA颵 PD/p_FbHe(stQ נR`+<;*bv HU?cTҡ4V]=пiTVWWw)ŭ @,dt;8ץ]ť꾍}F^:꺖9sOVnæ=C^$ K%?S&V/o||8IEђ~R8;d1ښ1zbtT={.ήܑ]y(ͱݵ۱[xorSvzV z)YbgR0n˥nrS&VcCp,@wJ {/_Xms/# vh f XXLf;:(ۉ 17b 8\c/*m.~g<Hw]>rn'^r$[g3m?xͧՕSϼ9-\\I˄wG2zK H@>zIY$3]g!Y>0! >0FXPބQ#"N\ذzD9N΅y3U1 Re?n4#:R\)PVVk7P|h;#أ\kp=m5lD![`G_ؿ1?I@Jnf  2GŝSM^fOဃ.?JK6a78!N+7g}tU'wq0mKre]p]<*sum@ ,o7ϊĜ_Kțѳzu;KH)[Ll9N&9'IJsعγ]gKg\^SY>\Jv.SS%/>&+&IRLKKw/i^>_~"?owN9AG1J9DKk{(hʚh4QKYKO(fXj ;`iGFc0h5a yԭ~J=R8$o'+ԝ8Y&$hX6S(A(["08vA3!=D8~?*BE1fƳDi 9,& Y,f"7v aLՒRdZRb HH$$6{ZjR0]z%N JuC~# gOngŢ Mwb ZhUm6jPQsj‹Fqfjn 3ST:=&G::!w0c:<\/J\oS8x =܃c^5UOj6/L@_Fu!XXgc:I0ǭ:qmusu}17i>){xo"~C:>|oO7ٞ1z+C P.h@?3'}VUo%\dQZ9RY0P'4p*-^xZ@du*Ut׍Q*ՈL}ZA-N!\-$QrJ~oD$^/Zh6fYea{TA!6 6Ml#A7+@B`'y%w Yj:&.08!`X(  QIP2A)$3%BF~L #$"-IFqA&`1rVMu,1N3\}1p%CNZ[g/}ר+m.(20ǷI% 'ܰ=.ij-hO.oȷ~rӗ^zKD?7ZRݰ{HH1MzIh֦7FP~T1Wh:H@|{:kmҷ)zm frbVH:ڝ߫)ƃz u,eYV/>eFhT|%Dw8F?4}mqF i-ɳCgɗȗZ\9]ƃf~؉!tDKܖ0Z1S܈R R]LZ-j`u[+ZP`I,O-tc-{jCO[*UY|XTj>v8RuQ/&c!up61Zd!rL!G?8Q$-CcRS`GL8fI(TPag,X_I<|2[> t압n{g۪־s[[Җr;߿v)qko]7aĻBn[O޳aՏVʮP緀5\Khsj$X@NKt)Naa#es}¢,VbZĊE 1c-\Z@fl3.22F$v,2c`ـ@;Y) AۤPE(B du܃cU4$v>sWT fdUgA/")mto&ϟG /|rI9~!Ϝ堯a[7(&d?_DŔ&bClAq\`!1=x$! a,,hi`af<0Fٵ8^;%keycgR,9IyH !嵶֑ejkrJNv7vٕJn r;|{s=s=$Mvȁ"&\/X߷;8Gy\19բW #Ǖp`yY>OZZgk3ﱶںM9nWfTJyBᴁ*{ FSqnPZr}qU}C!=9y{E/)=V0q3Wp\**ϷVVA8 d46r Uvy6kBer;Y'&b2v  +|Vj$Fc }3e䈱q1G?]iQl75tS8>3kkw|hBOK ^j,}Tn3}{.DIs|WGYn.=7 ,:Fu T6`&~Sy#哅L(4i%˂@Ҹg7u1w% AaxV} %5-I}8!e&cͲ|;\f!)Җpy`&pGK[FLIM1fdh2R/s ?q>/ㄓ{Fs? S;XcZm2a>+m[p_L}>2_:y6 i$4}1@}$,42D$Sy ׉JJ18 '3ؐ|1c0GR 6Dkg@lFk$f08bN0XGn0X4_0TzSɖ7efA; N'v ZO[p#Ɉ E a;S`QVFYn e`Q e}`Q 6ʎ҃`QnF3l O#BeVۦұZ(^\p:eEk6س ls߇p \4lI?p ҟEWљ!t(?վ~N4!X>!}d * 7D H})DI¨D xRC{;@͈w/99bjd9+aZ:T/Fena`# h<?XLAH~/^zP ⌒?I(_rKP5D0$#2ʮ,YFe2?ʫFa//PyGO8Z6G7{Ti81c4nJd2<8=zJ+%I`,]=_템RDn+IDg[Yx5.0J|ōۛqXG/ΡIjO:≄X2mU?ʣҫGh !nH1Ϡ>z ([k&x$1>{0BMъ++ĈaǢQՖ:c),vJidGoK6!eF{F|a"f Cwo{Q Ҙ;|ҁai'+RX򊾀Šd{!88vF'Fa!)_ 7Ko$ݲ)i$"z8ۛZŨ K7ġI 5 b< GQADEC!o'_!$̋dp'K^)yG’Da٨{BCԥ CH%0 ^_ \`%8"!I(aиALjQwb5QgpC~[%%]KQ$qrH;\-_`ۺ^ 0+EQПT(o̧tdյ!QR=A~0Uh*.>ڇs&%9H,^>)>|,) t1XЁ(qӁ+Ec <1(#{m`_K*ĺz[j~_ kj6onSXvkVC-fݗNF`< ^bSBz0s/~~h]/% ޞ' W WoL[FVoL[z3mfʹ՛i7Vo'~]+'k 55Mf[@ct✡G(7=+n2̞"W[*\ݷy mX\H/8ETM.p t B~ab3«dUHBˀ ˀ F̖J6~.HpB8J,V8P>c  H>=惘wa~k D8p# #!7cAsG腩lvc- Pv>-;v, mX|.@grЊ O6u\ 7 S3(bC: B~5HRrB3l`s .hNqApNa';cP5@O i4(ԒjHNHݐAJ>VhgЃUe#YP4GI!Bӥ/nH MgL,H]!tyH:Ҩ8SFQ xwŅXnڢ֫eZ WX5UӐDF̐xp2r5H@ /e2`eо SH p2࿘& [!9Pl9`aڔm9`?qHWX]:s:g*i7"Y(ŏr2\u.HPmI쀚FFqyHIlV[lDB!Xq؎m؎lGY竮T#kOמR}wv?L!99MF]+אb~YØ;1_005`xzs:`p .qCεU_T22l2V6U* .#G70o|#E5ktx|́ wX?əhm44nmm^!;rߺ~7R`a}hW80[Z:ZK[z(>e?NGD7 -K :J*]!.aiiX4;fb4#H3hƒ@N,Hc^_FSx4VIЦԴ‹?n~cfPqщ!Q#h8--]+w73/>Lw7ϐ-}f;- mʳhw3)JW6YYW Bԑ]jyOM>T`o Don}ಆpϓԪi$Zes\ fJt}p2<_p,+ȴY/5BJ1G!=1Z~E]I'B849yk?|  sJ`C*? endstream endobj 18 0 obj 23734 endobj 19 0 obj <> endobj 20 0 obj <> stream x]ˎ@E|b] 3ec%/P< m)n]HYl{vʾ}}Sznf>1=K%NҦ͞l=>nSsZ%mӦOS}8%}=0Miis̲sʿSwGom8V%&<_~Į[!L9894uY Vr{R\rJr~3-sxGށf1{cAM_/7ǾL{?XMx:+u^l/{C^9 } G?P_/ /C}8п-/qvYoup^ 8+Q+΢WDﱯҿ:WD/pV+u?.Gt?> endobj 22 0 obj <> stream xy\ǵ7><v"0#"@6[fq06 1d# ؎Yv&ikڴहqoKۼMm{妮^'m z3zmę9̙sfΜ9sf$`dhg(ҳ{P)B~Fלg'~W!Iem߳k OH3ݽw޲Lc67-mGJ #t߼Ahs>{}8,:ujuW!B<<;H;7MKBAz|z m'%(zr?eQvH7qG^1Cj ^_&cMd |C_{Bk䟨bo-In&{btm Z%N-LnꋱH[Ƀ4zt@S@E$D.%/GOe`26V0H-8;ȿi=}Ekc/~Etd)EE46Gt_dh}) $BCxD_$RI/?|U/5:2u4VFo'j!N@O/#}A\>_=|2&B/'G4fRѥU;ӯ*a+WߊmwHiJi!1 شK?ͳO~m)a`3eŖ{3\.WaM]Cj1S/_\y6h.ӕRz=4}t m/C?'+ z|EZxXxNxA, }ֈaZfA?Kf)EKtMrJnM{v9FAv`'b?o&?IXx_O: waIߢ (A{"K_Hn/!"6ZBo!!ezqt9.)KH%[/"z 'BzFۭJw )EOAi79D `o%qaBZ =+m*AK6!H!EaUX`:E IFo_y+(yNS{B).5t(%߉} ݌u5oߒ3R*vR!&Lm&oVcYŷE6ȯh/5u7mdV7tokkeZJӫYiij4Ʃh )-e_/`HQ|u61"Cb l2[>~#!(z؏c_ƖR>za걩TϾu>@?|S`81֛#ؒ~G&~m;<"\Dd|DNBC(y6t6҂ce~Q0|Cx1Wv!hbɥDNC7uq/Sy$^fS3]J'Bڇ O׵]eՊ%5-_^V,). }vetf:R6l2&:FJ]rދ.*fnt*(jK86r|ؾǭdsW=*vw0Gӯz'cu7Ϯ5dq߾k=,|]!vŌ :ºφTJ.Iem.„d5{Gha! ]&}\ʟ+v ǽVGZѬ:{ܮ DhV5frL,ufy:v9VRq:x&ڊM^Y,<5qh/ZkT- f8 >&S/jEmO9m6.>kN_/?Di\]Ylo]{TanT՗86hK?XW'l D?6-..#^܅e۷(źW |2][jrAD6b+ٷ+7=앭}G41m`CWbǞ-+x{r.FVbmXG+.44iӢ(d&Ӕ8WgVYԬYefuj&kzl %9+* c%ttI!E(2:- ņ$R Si$%Q]Ji\اXuYg F%Q~4bd ¿I]<9ى.93'kީWUQ{zZR#@ix7'{d-8ZYS.\4u`^QN I4S4q؄ƆG!mWdY*1Sk;-[ `jP u &峹Y1$W`)I@d%O@,%Փ9^>2c%!3*%dI"9ސ1%ƅ P]RN4, LźZ'1y+:M\yfkNc>(+ۣdxv&yf$7[݄4zԶG& R8=T95ǫ8P6]vR"eł)~o6Ց6|ۤVnޥlٻ"Z~tНw|KcU%U4G/SYY{kvqfufr!Mr}a>x:GYiG_噗x*t~}lFLNuQ=&Hau3bT^8GM{R+]ʒ-WX]Tq.J%QQ<@U 9c 'bq8BONX]Bٝ pyͭ8L3)Gt )R5stVN If*1<KqzBl G|GMs;abevQ"^Ul!wx1䌜0O&}a|Ҍmgv>-V ~7ik_RzY2GuQ<_M{ jibŽ7lhNE" ?P*J=rKMw_D %%jxݤ? T%../h s-3$bzBhě_l .잲oIIAcizØvfګoLɿ߭m_NKs%F\OY*ȥ,1^WT^]igvAU9=Һ=ׯh#筗ijJr]e)KyZr%)3F4GiiYs7m8 ZZwmPeAekKhӕ+A H/K~,ku`;<;BX߱eUTgGSzŔ2$%Yls͜~1-moႄ b.P|ЗW(N(Y}?%>>u4uw[V,ͰGJ+o˴\ZX䒞5uLL 薧eJv4ˬ4XWXǭ"$Š$+FŤqffveONqvBFG1K"1I:]MFn6v9fd=9WsO9 Xbvdy(cGMK6@ZbR̂`#9Gazl~,ai|, NMl+aI1;MD!w!ϗQw5ZynV'ݻ4;nWpi7.y/ݎSJU : n>mI#Q6Vn[ ZᄣDx"Pu!s33>dl5vv$n3@v"F *,$jķ-I!{XmI2R#hDԃR *})fIܼ RvX-"hes@=p$V>Pb\(W>sFuw^*Gnj#)"Krx PaLlT&,Aُ=}l엊v`OqGJw/9>X2(1'MN2W,b)@+HE傅/yN88[$V\k]=瀧$>IvCk0ѮI|]RL4~ ZVϩkc&Q*\ŅT,c(H eʊ /7c{2=M)LcW)ꊟMJI]iii${8=\ԍ97?g1W9?旺pA6~p#%h:Vc]oSC'X|zyebeIbRbhr`5x-6$tV,vօKˎ@#tQaatc'v `ۖݧIb@?;mH.c 5JG4F$Pi1OU  ބ<3y>/+ɕM]z39=f3 Sf6A2?*x+~b4rF$Gؗ$}ibVCc:~$FcWI,o3~Ό`-usgU?haUC/S.]B7'WQ7LasKqWTTX*`0(Iaۈ$}?9NYSL4I7q`Hi"F'. dLm Q?xy:7\(&{f.:M|^DEK'5+"yf'ʇr2K?d,l ,YuF](+e4 ɠ+oY',/Z|G.M wguȋ ʖ2Ke89eIZ*-{^˝"?h`hຂ"W!X>$i eYS\^c^diԻ t%$ 'FS`jR졔#ڒзZ-lR696> V&l|*<3Ҵ ~Jl6XYbl:<{!.ILiVKaNgdhg`cC+j1So-.~`;\lĔ)PtDOOKӣ7~gGKbͶN]B@r! LqP5{ol1{\穽;µH qvy8ٹcy3d;3 ?`KxY5u}Iv#n˫jC6; X[ $s7;DVSBQ$N8L OxdOEIS 7PIW,JT|_IΜ(kslg ;ceם~6$U {۳z&z YXWPw39gEb r18},YG:>)+m[( I&ќl6%Ӿk]כq4%=]E6\aޛuxLUHba yV.{ڭ/EQdC'5KH`%cBD`WG1\JU/NM~mS˻g'ws[nڞc;z}m ߇2ov#}A"oVޞjP IvG&> ؟*'[cd ~2;EʾΙJ$ل-rrI/Ә4gtOW$]lM^mj1γur )"*{ sl D?ttaa)giInHz<pUq ɠT\Kt\uA_Aœ<;*n\‹*LwTHhZUܤ}B󔊛ɥ˧uSljPqHVIM%b5ݤb4ݭZbZӓ*')f'9K b.Pdh7[T$n|Sͤ zB%usJKğR:U\"9)[9E6V+e?ul^R☋'9G1*.ܔr<ͯCTQ'թTg*M}@1ϩ87w*MU1i87%f|_::Uq̯ḁJ~Iš+M'ߕc*.BF6bG=u73D=2>T3C瞷8`|ONSQ Drr}NDwro8Yr~ⰁfZTr;_A]\fM*^B~~py*.%p=4{8+ Í>׭(-8ܵ*!$Ln҃\&6$2QdRCk(2JѾX=/)83EM?9M3&qye RRb弴-AoCd^އxe2Y|7>{N/@/O| #1֛EHe~}j[r\~s[BSųz6ʓiۑ\"3%^z9{4+M q{H< $ޫa\񹏀+8YfЍsNlT|&GT=>.fQГ"udm> z9u7/kխӲfK`QtʄFd5wFͭy +@72Ok45AoՋ-/WZFԞt̖vr#\5ZN8aޗ8#&;u O3UZmG瑰>Z&^%~]2KGޖnA#\0٤Zp:8K[J6ϝ9aÜwb43۳`S{AW~w,?Yf?/&ZݥK;wڊ`ČuJ[z;s%1fivqu,(&,\D*BĜ22<#jvR\*NY2TB2Z- 0{{?3&ꂟ~ضg0',?"m +#uPH_d@)GQ1FwaiʪJȵ򚾭F5Юpo]dP_xH^޽,ߛ\=\fջCLLyɢr9e_Pd8eӄgѩuj][ٷEߑۆ{ۻ#[־PW{C#,}dP=EvwᑑP}xow2#=2Ȑܴlen ޡ=rmP_8ne p#C#\˸t[mr/_$og 0v<pfb _d'<8fa$" xdޓ052\$toNߑp϶ޙHӒm##ݻK+ln>HOp𦞸:»KXgl;܏0oe(_Tװjm\|MCʆUm&жoOa CAf^>>X0=eOd]mfLȻL%rm#I1m oQXِ7 #ol&a$5Ivr]/voF7PpSiUL7cƺg~t{x8<2un?<<G1F-{: - lm{{]No(bC\7Nm[&c67-n03ss6&޽GF1U{f44WGӖuw s1| #R͉EvbUCb6pf21F7=Ft F{Ff []n9`|H5#XV.U,,-*.(-MJZ׌Ҳ /.2.bdOA{|+V6 ]̥!; B.|!%$~q!*^E|N<C%痀_~~ %痀_~~ %痀_~~ %٫3T#[n`s)so2|F?FPv\D/eI\ϱ k/^n?[^v.U3_{.|̡RiT'-IDj.m>C7umfe E^7F;ȿ^Xh[tbd;/&^GcďTה\?"ih"K2vgƪk #5d~lZx>zMօ*_h 3 +?-R4vȫ+jKoR|@ͷz5_K|רyOs\Vs78v P\HgD/4%sxN!@p X]UH) E{^}  J Ey 9 P ^+~ԯ`f? &n~s0c1*xy ^h*Zy<1=.X~pԖu`_À7eP1'lgj2P,Ð\ ?Z뱍xfyX*5_$*!'G,RXa):n𔇧<\<墛Hs2|px$c)Nnǧ"%ωaYIJkvm#Te~PlzkEaFؑvd2#ݮ ?˝ce {A)pP:% SpP8%k nmHIjܺn.ۯӄ"s K;Ca^Dx6@r_W5W5_ _ ՜5W5Ws_ _-DKյ1j\@  ! ! ArAB@|A??OOp??OO??^a+ Qc0Bl]nf^r R@'2^l%kmu|귒!'D '9ȉp9ȉ@Nr"\Nr"D 'D '9ȉp9 gYlza^ l%.t.%F^VC$@R $Z Z KjHj.Z ZHjHjZ #j.'9Ր!€-n K.\ \K6d- VRe!#ArABF2\F2  d!#e!#Ar+.c2& c2& Ș Ș2& c2& c˘ Ș .c2& c2& p5*X585rkkfVr:Rb"<VEVDjq [s x'^7CA}߀.GO+F?<ۇ堗V*N0(iR!r@ r2 ii6R.,}ye<]j%\i_)jjh55[M)r(S3uL^gZqiuLUי\g i ӻyzK'f׹]z0~x[ivwi#քáa1 1Y-g-LV?d(-\VC[}dYGݥlwey:Y%ؓq]3@G]5XUqmq-gUf/>Ԫ{UVۼ9 BI# }9O`LՂam*Z.v> endobj 25 0 obj <> stream x]n0E /EMKBH)I$}@!Te_'m.@gw4ͱ&d~T-=L+dεQ:Dzm)~,K=^e/^7u `>ys7@TFDz 2Jg> endobj 27 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0"d:yf:BP|AzjkqۿsTw> endobj 30 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 31 0 obj <> endobj 32 0 obj <> stream x{ xTչZ{=gk;&0$1GaI I@1w2!DPE|*T)mhQ,F{hiUғҞsk=y ~LkXk # چ 6vw B qcTVh>{;FDa̽Mv1wUK>,_[j紖Un HcMzofY _o23#5+LW{%(w^oBXiQ4IffN$NMRSR32eM{]^fϙ[0o?XBC'zZe m@wmf/"}}Y00:p'0 y]7~đ*hU 2ɛڇ9mMUZ Зt]jJĒ.҆wg 2k5a6%~HYԑ& (SdnGm|\*bi4pfX_}3S]MmL =Chq -n&1C"C[H-@] 7z (GMX<3pգ"u@9qJ*>AX}TrG37VR-.ҡA_*h'⢙TNM>I8A Sd)ur 3r$;ғM<% #/ǐ0:cdFTsн_ 1XL=卜 sFy#nG=~W΀z u̙u&ǀ,~05KK^h1OMflQy/6:(~sп۹3nb$'ąv1Sʹšw ˌٞ=_pu!FGh)ǔ ̤L%393%3uƼƲƺ&i&yMʪI;;RvKڧKޗ/papé[gq;}s{w:tmZ7gVTYgl< IƔgno5mws~_6h;xxg?oEuKV^73wML}szMg*Fi"<~SyohsgAnЩ$&[--[ :ЉdHoѬQ~22BʑϞx|y1a][9$-G|u_?9jr& :  r82$ JQ&e`PM .M7njzfֶ6!Fס|IѬ=M[r6$u ?r #0dr$Xd ]TYFT|1Qvz?=x葇Nj:$+\;}駿eF7~PK0'!ٺ AjweLr dyCghꐣ `|CA⮜a|z z1Ø!o ^ZJ;=Ɏ r̘'xQ__l1wxߞG^jGYbӭ6tnRq)2B`o ǕH<ץ3)Ǎ?wÏ0Y/CMCmZ'mݐPOmQ2ZLO ـmuNg<<>Pw." c Pu;5`A1uzO&>2C_|1Շq;wٳkG;C՟]]:܆Μ׿Nkz%1׋RQMpF#H+A;:r{ .f%ӨށX\<g ș? NUÌj ^ԺT̺ȯ[ G1-3-a5NfDjdHūQBt3G9W>+#Xd!i`NB9<ە|_ꮩ3v <3QYxgXLI@܅s?eQ@L<=2}Ӵ3ig ⇄!Ðg;;w&Jά1&4YS9c,f:$w+ڻ! ۟ c][pŇ#߇_%/C ee}b>6"mՆ~f7V%bcrBn9K⥣iQϒy/5ep^|#;pw_| H&N<`Y FF a!ƨ܈,@ G6I4xLv3g g`S8S-3}_h`3hh4hJcHh:?]n.ME2Ժv3ZekF-F߰Id$mNt?S&Ɨԁ|)<8wYsQ$#d84Pp$7%xoBA0F|aQ4]Evp΅V%a": y,]Nj1KZ˜̛|'꼔OW^Ji+ ruMWJ(du5 #9+h4$Y..Zj>QeSr,^˝,Sj.Ow2|[DEEy|S42:9U.AŸX,6H%R22ycs}U\⫄*CJ2UKUΕw:.DB|Pg3։u)dnr5}hඐ-0`0FiϲѺѶ/;QW& 4SД{XcУ%T_>};!½Mu90ݘIRxs[ YwFn=Y36~SІ`ы wo-nqd3lD]vr=)e#bġ @5 DD4,[4`-$bZK=B6Z7<ѣG_ђ+6칻}q7Bb1v9`$bl"o7D8XsndREuPMM[%FDX22G#Ϝsvtv( L3XwVK7 ٛmN=xml߃ xWD$vPaIt9g, mvS6ĹeNb51S\.hi!9,p v?ֱy/sSoO_n>b=;^--o7fo_˻Ǜ`56z&2,.&<wf&M3gز3Owp|t0$|QGW]5m;rr WL$ݖ0v,q6MXB>K0pƅDGh47J<6!;L$RW6(RKf fHsAWvmS5ڨl@&9K2@cδe3U[!T + UJi8,Cƍon%Q!j0ml}FFƄSo9!Vmb;);4}P`ΒW%JkoY+^4j;koarJqAޗ r]L֐\vaߕd f@A Q-HvFXp YLV!:),NfL=\oLĩ ! Gˊ_nK}.`*zײ5HEٚ75A& `XtҺX N5Tow3=} ?U~8 I>lvȜAaB .ia( @2m!F'%,c3"^{iGC CJvy(,NM~=PԱ ×+L&U?909#A 6(lKQ)T7WVyP x{mn 81Y v!^I9z~O4\-Ӭ p^,fB+ 2TJKj Zo__І۸6ll1XZXHiJ؄np[ ~[{g/ߗmiizN;;51 ƏR?e;?=j.Vn_e ݋OQh[XN!$l X RJ׬NPY^z؝w>v/ԗmnkkT3LgO_l* g8٬ɖø($tezzB.gaّ1%f!;wølGI0N4άȝQ5{ƶu`N"W*Mgit4=v&e,Y֬,%+9+e.ԇ,) R榖JR벤R44eڼڲںZY:!u;,##5uټٲ)s8:'{䓽GCqW8y Ͽ#v勝>wn9A+p-~]wvD/|i wݶ}p~r_idžC+n1Ļia عo-bӜ8Mpd V ڦ񤄺O6O8H7:dZP84O>9yq eGᩄ)^#͌:QjK&͙LO5/>>%r0$ҠXXAw@Y 9HjȲ\/]+ݝ #b|4*Mx9ߤQSWÉ JF=w-`]IA>x8'w IŶcBs -gny97\+ œ 82v%#nɢ&k__l$[DG q0.aFVvxgxRY0漍ޜmLsRڑrY&L3LN3MA|Ϳdc\zat{oݹȽ~9Mhe 2 $^9lLVdI2cQ2pA6Lve$>ўyk)̧y(Kf`R F6;d]\pabt6ʼaҳ2Eos&99sY,\"g]j\t.w-w2rwqq[goL2uDݮ cp6拳\%bU^aWj!cH QcuO@_sFr=`.6:Y8 ~䧧GOR.i˨x[ېk gN 66mfi 8fl -m()9dzHw~QyNmZNݿT7پm&HH*4{ nӭ.䶤I~C败y% ʼnߔ~GfӤϩMJbwӉ1&3ԙ_H\bl#SrRfr,GK(b|Rd; Iԥi^0?uh=Bt/(zimd!}KX|h/~azwO?#g΍f{B«+dM]n51D$dOYKOXYr_р*. @Ak dO-9}]UUl/֩s7Ϩzv3w.}r]7_>][!wMug3Oe_=.'Ehd (¡ \0}`Co=C`?O?<8 Z|F8pV6!7rBVBnl1LN/&"DcAnz,fIԾhw.7ڎֱVGxrY$.췥sY4"ny\b[}\k4l6!vh2F! +/xYm(gp$Offqד-sPCsI _l^j).Ek*f_Zzzycsk{ q YhLRm-6zFO3mu~|c&"@CSSԁ\x}OgO]^Lg/Qr gΔi2v^.1d IhpdJ3:dsn_$۹d7cgگ_>(~CAj<4#Tz=<<¸Ǻkb~>t,Jg9;0Rt9&>BbyGkn2If(r&IfX NAeOo9ds9PsC#熠a9-v!j`:x y"bK=T!ұ}X%U Rq4IH$MXoEN7Ns9"seȺn9%RJjZZk+(R#:FFqfQauuwVwr3}{.u6. !e40N sXJCw%26cȣ)1ߑx D+6^ ^ B< --M8cFӊm`PbY0PUPIWdI6Y 4ݒW_۷GAp˿񇣃8X}ĵZ-nsq{6c}Q;ZB4&wC{gZ{hdHS!vN1T4f r$^;\@YL|;|/1|i}@VItbH=,5XD'ME>iCs aaVC=.9T*|%#E p5Vd#t:V'1N]F;Xߞ`bOO"" %YѾB Nc%5Z7^q'WP?o`zǟ5wZ){HMKS/)W_y+ "W<`ōVBjw $;͉!j1g>aߴ r]LeHCF Fv < /~ylSgQ"}#7m=TW>PN<=?u_,MyZQno6ik DnLCGXA:! rTXn~qIW7["ؾU9T˭`څ#zbDK ˠayڗT,νV>2Tͣ 4ɹw(.YnA7Y^*!-/ՓRzuR}ٔmo.iI^jOҋ`bsԟ~v|DR2<eZVnTTpy鴮AI"W%)tG_7) Tja_Zo&n7Z.d˿Q_&>ç _c>mۯ\2t+a2W,_g9{i)Tg؍zc]W.gX|m0\BP! H2"]9o0;gsP6paP jC@?r%_sBpφ ïU7 }s0Z i:[m_{z]^շҷ÷Q\@Bt蛦u<7Auxᘼ֏^P&<7mwm6=Yx\of8zۆbk":/1oSғz8sho<5"J1Vo< VWe޶Z2Ku 1%斨21KWŭhO3v5f+J5իT{=ál(VOilj*=aKkhmTBؘ֮pOkH}pOokK'itQ%힗}ٽpS9aJ ʴpXiwDlI +1^I3G\UZPT=pg}Oi$U{:[{`tK' k5wEá4 Pk@ÄHCnjUi:29^t@]ƒ,R{{#p3R|Z;(D6A4E)Y pwO$f`B@XkC_4p4!Rj QL[-( ٪/Dh}0P:Ìj&ޖ5t͜H9V@U')r2:-*.X0&"Jo$5Gq$%1jtΓZxUfhZSHЫRtkNm: PItF@/zHOd+сpS=,!5mg 6REAևBruԾ{P(hn饓7^:#O+iV1U@y1\!]J$UzX̤H. *)cB׎PR0tti5Q} JHbMQL#L_hRUZ{bk2_`q )}]!~%E$頖DGUtP]^ -vE߮X(;(RˊʊZbF\YZT\sJ@vYZFTVԮV*KŠʍExUUuqMRYWC_iŒEK0V)+-/l+/^  ֮(%f -T kK(+VVTWU"[QZQR hIeҥj0:JmuaQqyaa%\!ـ%PW5 ʔť5Ņt,ҊrʣEb pqY<.-_g,T/) ciuZ6x(c.)it el ~0@.S[Y];ͥ5PR] Ry J '^/v(:[' P44xSc;Ju[7n=2WZ /X,EÍ R Hsaԕ}D3oea3ǽX fYzМlP S{ZL>iCqr5=nT03Ik[:}y1UIY"}mޚ >jSvwKw(H׻A(R4ԈrʇVPbEAaT:QzKQφV!KAczSa`V>cJ3@WJ1 )0?ֳwWéa&4WW [;LUPʃ(P0o0.*0FLGL._}Gyf "Ru6kZq^IhEW8ͭ:ɸq" ٿ dƵOޅu*]LB N{[MMWawQ]­L+4ZuN`FuF52 ֡ &W Z$Gؽsu4ldPM?Mx+P˦G4=+t&(2]kQ6Wm0cP43ha69&R3I+5lC۝L1Yo/|1:sQd4ح:W'K멎qNö{LWi8E 1khb>K0YЦ+ KQ )Ca+>+[V5Z Y`Co܋qtYϴlT[f2ۡ(.?dJي1/R`1֌q|W1ĵFVD=1{J'柁 vb&yllU{5Ŭgbw~9 Y }3ʿψ[tܶ~]䵡4y-W䕗3WBLrf9d&'‹y79G~UJ~c*yRKRrD%l!?T6,) ~^|w*9G|"$<'Bl·Mp0<.oewMO$Gl£<}6/?N]W%>L' 'p0h/ {d  ;E}wYA 򻠵kyIaJgpIr6Ӆ{֑{݀;]S]' ^t\rܾf&B!aJvxrpkb#l f;GdD7*B%oQ!}SH&E^dCUؠn+-sN:v!m|6Xim9)yrl㛛҅u970 _"iԫn}P*YoHn!kTR*YyPIMTMy.Tm!vRQ\LdyB>,,%EJxR%%ea,.4 eR4 f4 c hYn$ K7YKd^SuN2AXl̺-R.z7ϓ|ɻ$I$Ou&'lGrS%!C3M!a>7@ 7C$kZUHbrI&2U1[u$-)ՐT$A>E$J(IA#> KrmTL d$|!5>ĩT╉> endobj 35 0 obj <> stream x]M0 xl®!eC?l'EjrȿyV!<0; sn>¥2+%^)㶄a8un0On7ӗr=|~y<#>S0kKvmj07%d뢨z0t[#scEz# 씥{ʁKƔy x~!odoo;g/mAF~+0+_ LJ/_._sҿT[ ),#K?j =1ē7I/5?KPZqZ_Wt/u賣 gGC]G1艣%1?e> endobj 37 0 obj <> stream xZ{p[Uz?wȏر ؎xNJd[D$Aɒk+K+tֻUfii@X`N LwtL98&Cٝo{9=ϹF<⎥&BشI$SD0Dj6?"DG[")/6-l%DN l}u|$O|nN1Y)/{Z9}OɨЌN Bj- LmL?`مϧ+ ^VN RCΑS$NxaA/aJmmiklkiKSB]G%yk4n#!{n\}:Gֵްgu[bԢ{k1GsޘTFɚ ߾l9pCLa/Jkj9m[{\m-i:qݞ?mG\oXs}*q/ĨNO= l='ٽp ^nfv:B[]pa鵭}a ܶ;5u-/ڈn+:ّ6oX:жf1ټjHY*0!uƊVIkUKfg g8iZV g'٭稡a:PKT3p(6m qE3 =}) C<ˠB3:5t'5Zd3S̠Qn2Ok+8Rdt`X,*rXkH(hԸ&00ɕ*; EԜjq,PիieOj2dLL=PEUX})9ĕO)9HՌDy6a0&J X8rD+b)KD,MV:1ӲbS, N sAKth;+v6N@̸Ĥ1̈i=Y3jb))-X%I(&M(J2~Au Wi> }ݲpzU6 BS` JlJ@ð3z\ybU¦TP0J#AOG:{}^sGCcQaO0z'xN;4E"4р߇s@`~ 4GQh4Y(/„N:Aꡣp?0Xx4 / a(h 4z8:)N {Ox! aI\ePD>e FƂ^O ~,lh@qRg3䋔02aNa='l~}QNGO8܁P0} '2*ȸA4ɉI=aA .'r0П,xAň]HŸ^'# %]c1-kmGJYk5L 5LJXY|:\ؖ헵n܍Nk J>tLftӺ %ʐDOC b6D\fB<8'0-K4#;UrZKͺ63$VZ3=Ԥ\E+׺gS$cl"-GI2@t|W%9$$ALBv#]x!8RP|?O⺁шBĉ~Az<$ŷ,?ixאgU/&QG*(eSR3d;4(7tuԫr"\K[<_7psl=hMz̻s q.)צVecT[0:ES/BWωq|*źYhiUV}}dRF_u+ͪ}f׽^5/i\M.1~Έeb Z2+&;=wC`xF]>_,l5ϩ=Wi*cEkݳgXQ*ArZbg~OYbvc]ުqQ#%O "A|bzB%<k~x |⬗Wz;ƃ8fCd˲d>3L6i?QC\E8e}q >aQK_vb!|Yk5*?XD6Oa?,V=(1N)6p #&@Df>tOB6 e#"a!(fC+Q0MQA2{ig-d!e6.Kq _Z84G(?3Q/-0Rʣ1n!55E@2\/75yG"ZRV岣a pчҌ~n%{+'6ގZ}"+G?(;Pug٥^9kǩ<<֑ycVP YuTa*ꮎS@ r}-wR߮޹+OSiYk+OV%tY?[{V U|Koanݨsu4JkK'Zӭ4|3^˲X*:_Z 1m2\iZeMq2a-g[qn[Šh?TIavt 9R|?+yu+$cs(DrUD~_O7Ǩ򓟋³8W}_% ?s5_»lU]a#6mo7|=C~^sZ{|wqH'8Q??+6+gWp^V7K= b^P; Mw:1| $?_o>,s#< mOw³Hl<떞Ag̼ n:ԃSxVNxdT+iO6s6KO7'9}-[:}ocGأcG1(zyE~dZ\)¡,0V a5@@=ܦ}_fyׂ.6wUN@< z<ղܫJ;[G`-y~f|nqK7ۡ例rpc m gCSݽnV~c+>ׯ]]^vCk]v׼s*\;ЈᖾпB]r#`޶`kt6;t [ZpKێ"@ߔ6-y^dMnic\l%_ (u.X_Q9)p8Rk+ERf5Ŀfp(q=4C)#}VE^债{9O I;R9 ێ?FB endstream endobj 38 0 obj 5176 endobj 39 0 obj <> endobj 40 0 obj <> stream x]Pn -/ 싒B:]bEvb@k\H)@3ڙK9+yc:C4€uXzV%ܹ7 oiDp6~_ Y7'ޯ!|.`R1> endobj 42 0 obj <> stream x{ |U:U~TΣ $$$!"1$HHB0Qt $& &(*cḚ Qa|p]qg]yɰ3cMSI'3Mש$ȀFFP !Bc(.;vh~tE7= snMty;B'u֓_ N5 ﳺ[[;C{#!?>C#"!_AⷠW^Aƣ=[{7B01! TwsJ,X6JKwgdfe{D?+g?6 3F@QuL;}h=9s:t#=y0wlvfᓇP%C'c(AݰOaTx1] 8ED X;Q@eg?V[>fFbzvgTvsf$l;[!(7K. 8z0]?M::ZLLztTYhۅ<TpeRe1[W_xu2m9E`/" /{xwٳ<ĜHS,gϏ$O҈miS _?Uّx!OhcaԄV%f.T+㗈|?="z>Iϴ^Wp:*o6SL]]ԯ2w<('yu$_ &$ARO[KpȚ VjE8Woyw>wgw;+C*vHSÚ•cϏ b ՞piҘ%ŵx>W-~ M5nz^ zޤBm'2Į5iTƐdh]461fr s̴o658P[e 1ZzO#IkdfL&b~r+u~]"13}K|4}ԙ,U=oDv=ݡG=[F}8 Yhۯ{$GF(0 hT#x-Ị\t_pAl&~65~J|Ҷ;-3hsb[m_pylq T,-;ʝsu"gk0l6 =wا'fI) *41_S2Y>+wlm=Z=W7vO%v57<*߱O}?7rm3r|Ѽ,B|(ǛfѼc~t+ t 9.]VY%+PPWf$Q`dGNeIٴIQ( DĤ/Lol{xy/IK5C#|fߜ)mk; Ā6 K;g#Q{})`*1>Re (`l\Fr )"O+ 1txqd}O-}=G%_I U<@{^98p7{M;2]r7j 'A,IW(~2?'xa[ᇼ=f-[uq$}uǖ-ĨRVwXe_~[K>AmY ix!dP9ҬfHkk1e}nD串кr4dD3F2@JXƴgq㟘҇.ѻQrJodN<෾G}Of\:AF9fܨ=&-00w.'%6! hHCiJQ~{p:n]89طX{18ϑ>,( .a}GMKko9cW?!`V,iYN *5uF s#풚gLyFjZa%S,NK?^N'ǙyB~SWC!ޗgy%-& 5E5Ke6a= _S8W%;Aބw K_|=0OR1߾o״Z@>W7J0]=}x--foll^3v۴px9f{ړVc,I4~* x`3$ŴDvAF&5%OE ]̓/,f3{ҚRr6[:bwmb߶ ) 3,Hp^sX8μS0L5D(3=uDΝ':k]fu9.;FӭYi.f2k!Kܚbے\QI&\l~y)oԘ 0dDҸtQ v̱Kl%2WYZYz,,::d_6=lw8!xZђiQꃍ>l]/[Vѐ+H blx1vg̪wp%P<LZw6B,aI?u{-Vgf^v~E褺t@ +僙].WW^! r]'jD,bqz6D3Io Jץ7Sly#R'Iy+t=f"JH)pNIkj߀hs0?KfSo< 2bT& sEx5+yE,4KA,AS3|8RWNx'5ټd(oG&+zFTuV$.?y ?rVΪG*VD.5^__[W(%r-[[q}}͈vD7׷J&a7.3(b. cu ,ǠYGo'w9;m>Ҹ֊46ǂYY6d/'_J'+ȉ]2'`^Uʣr\c)ד+zs}R]Pj,5zJRoߢkѷZ-Om767676y6|'t'' ''L'<'t_3f|55kЗogMCYx;SFw7q`8e= Ǒdegո"l,^6?A?0鏥̹ġ҇$ǁtfG"`m-89$V;U7AOr3Gè]s#cV%Td WC-;I)pk \Ȣp! e%5_;_OY H[_-G5+V0zN>zЯ>Z3Zjc;v'^?G~pνE'ͫ[^бHÕ ee x@5{c*m|o)m<̿UHԏ)m  J[J JhmV&y@i (Ҷ hZ&z6t܎<10~؞cp@(+z{F2+&6cၡpg21vPo@X=bg/ӟZL}ٱ6<@J%NGVǹMc>hJ?0+en RC}ԞI[Oo V|rѼ#Rr<ȴ{NKԜmtң3nJ-T}h9_0c'&{ Q|rN*Y2iw'GᴔFg*#43L 5Mi˙ǕhM)u"9X}2o'}MֆC_c1b>- y֭"Q4M}Z$}4zh,'3=d=G3^_dY_@%D%%ꤜ{hc#t+})94DG32i6_fZ<(vz&((LF7d̬"a%߅Y` ].&垹OV]_ɱS;δӸ:CC0s V~%XfT<}tL/gL1L=EZ9Y5|-)K6fc IQ( z'1Ȁb:(MA\ng뫥jWb$ŮIM@UtzTodzxkF7lc5'kV .th4 mBdMhB-w- =ZHiZxV)ȊeгI{9"hTޯV5!/2?tjIV[#_VJ_@5Eu|V+VPʄ2ਖ5lyMTTf:*C5˲TQdK-gMf,)dfefSIד]W^zʤ=EPѥɝLmStRX5Gk|TtthvrfcUQ}+NT#Mה$ImuSj&c̯ʺLѭLS{'jSH,vR|nr-P|/Kٔ.u=/kfUtVuӤiR8_aI;Q~MQr_;dZɽ[SaӤ6<]9wUA]dޞ^S*Mş)6 Yx97cT5uIpת\So}ȹ[>Ne,D%rL"-tt˧>:#ʒ *+fҒe[ 5^e mdBT;ff 9P{G3U0 Of'sx֋Y'[|܂pOce$|,WV|,xSS>O'N$m#oÏZDzc/_=| =GtЃC~xk}Av|߷W{uxO}v~n{Nxwe]]6<2lG$> endobj 45 0 obj <> stream x]n0E|"W#!<,P~IT 2d m.gxqw>Ѥ.mդtmmjzW_wt'EqrwX75Z{UɯOa줢,UCS5> endobj 47 0 obj <> endobj 48 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <> endobj 49 0 obj <> endobj 50 0 obj < /Producer /CreationDate(D:20081215111145-05'00')>> endobj xref 0 51 0000000000 65535 f 0000083869 00000 n 0000000019 00000 n 0000002017 00000 n 0000084013 00000 n 0000002038 00000 n 0000003767 00000 n 0000084157 00000 n 0000003788 00000 n 0000005294 00000 n 0000084301 00000 n 0000005315 00000 n 0000007104 00000 n 0000084447 00000 n 0000007126 00000 n 0000007561 00000 n 0000084593 00000 n 0000007582 00000 n 0000031403 00000 n 0000031426 00000 n 0000031621 00000 n 0000032189 00000 n 0000032599 00000 n 0000047706 00000 n 0000047729 00000 n 0000047929 00000 n 0000048302 00000 n 0000048541 00000 n 0000049202 00000 n 0000049223 00000 n 0000049414 00000 n 0000049706 00000 n 0000049867 00000 n 0000064288 00000 n 0000064311 00000 n 0000064505 00000 n 0000065065 00000 n 0000065470 00000 n 0000070733 00000 n 0000070755 00000 n 0000070959 00000 n 0000071264 00000 n 0000071441 00000 n 0000082718 00000 n 0000082741 00000 n 0000082940 00000 n 0000083408 00000 n 0000083731 00000 n 0000083814 00000 n 0000084719 00000 n 0000084817 00000 n trailer < <8F045A6BAB361C4C171EBF99AAE8AECB> ] /DocChecksum /91350C4023DA5A616AF5292B79205F27 >> startxref 85004 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Updates0000644000175000017500000000733512277111530016563 0ustar synthsynthUpdates are done by explicitly looping through lists of objects and items. Kst::Objects keep track of and/or provide serial: the serial number (from doUpdates()) of the last time it was updated. serialOfLastChange: the serial number of the last time an update actually led to a change. minInputSerial(): the min serial of any input primitives to the object This method querries the inputs. maxInputSerialOfLastChange(): the max serial where on of the input primitives was actually changed. This method also querries the inputs objectUpdate(new_serial): return NoChange if serial == new_serial return Deferred if minInputSerial < new_serial (an input hasn't be updated yet) return Changed after calling internalUpdate() if maxInputSerialOfLastChange > serialOfLastChange return NoChange otherwise internalUpdate(): actually perform an update. ** should only be called by objectUpdate ** ObjectManager::doUpdates(): The loop for updating Kst::Objects. Calls objectUpdate(). doUpdates() is called by: -datasources, by their timer or watcher -dialogs, at the end of apply() or equivalent Algorithm: loop over all datasources set serialOfLastChange if there was new data do loop over all Objects (except data sources) retval = objectUpdate() until no retval's == Deferred MainWindow::updateViewItems(serial): update plotitems and then views called by a signal emitted at the end of doUpdates() loop over all plot items: plotItem::handleChangedInputs() if any plotItems changed _tabwidget->currentView()->update() -------------- ToDo/shortcomings -The object loop in doUpdates is inefficient, in that it may have to go through the loop up to D times, where D is the heirarchy depth. The loop could instead re-sort the objects as it goes, so that for future visits, nothing would be deferred. In practive, objectUpdate(new_serial) where new_serial == _serial is pretty cheap, and probably doesn't produce a noticible slowdown. In practice the heirarchy depth is 2 (curves of dataVectors) or three (curves of PSD's of dataVectors) -The updateViewItems loop only considers plot items to trigger a view update. It does not check if labels have changed. In practice, it is rare to have only labels from a data source, and no plots, but if one were to do this, it would not get real time redrawn. The solution is to add labels to the list it checks. -The updateViewItems loop will update the current view if any plots have changed: if only plots on other tabs had been changed, it would be better to not update the current view. Not common, and the update is pretty fast if the plot didn't change. -doUpdates() could be threaded the data source loop should not be threaded. It's to cheap to be worth the threading overhead. data primitives should be looped over before all other objects whether data primitives updates should be threaded depends on the nature of the datasource and on the media it is being read from to avoid disk thrashing - dirfiles will suffer from threading data primitive reads, but data sources that store their data contiguously will benefit (eg, ascii). Using flash drives should mean all data primitives would benefit from threading. other data object updates can be threaded. suggested algorithm make a pool of threads parcel out the data objects to the threads -updateViewItems() is probably the slowest operation, and could benefit from threading. the loop over plotItems can easily be threaded as with Objects. There is no way to thread the view update call with the current architecture. It is possible that the refresh pixmaps stuff could be threaded, but I don't know how yet. version: cbn Nov 26'09 Kst-2.0.8/devel-docs/Kst2Specs/kstfile.txt0000644000175000017500000002225612277111530017434 0ustar synthsynth File Format for Kst 2 Base64 Encoded qCompressed PNG Data Base64 Encoded qCompressed Svg Data Loading procedure: Documents are parsed once but loaded in a multi-phase routine. First all objects of all types are created, with no data loaded. Any objects that take inputs are loaded in a state such that they know the name of the input but do not have a reference to it. Outputs for any of these objects are created, unpopulated. Then attach() is called on all non-graphics objects which obtains references to the input vectors. Any kstfile-stored data can be loaded as well. Still no updates are run. Then all graphics objects are created but not rendered. Then a render is run. Then updates are started. Kst-2.0.8/devel-docs/Kst2Specs/commandline.pdf0000644000175000017500000012350012277111530020205 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xZɊ$7WPeJAPo^߷"B I=C3Pd+3X_qى^K'U~x}fayjǻ(WGFy/׌bx(h턷=\/]Oo/K8oŒ$èAC Qp >)n#>˄h)<\$@;PE*i:co.s#bk%lm_ s*X;$Cx!7h1[tCXVi $&E8^ H܎%Ӹ%6} nCzrKr#aA4]K34z9L_u ?sSHBҹ. l< G)?`5G6ǥS >UB x _ȻgģmūR %CIR^Y2.}B+:AlFI[<菄tV`)9{#M|(a58+BBթN)g;ڣ݊dŐ5R-#hT0*ٴdNuSkB1?g4Rb+G#ÝTI=cC6O! OP RJWYV Q)piTvy^Jnﺡ!qARqkʡU piĜ|Hyx_ eCO ss (TU`#mm0 C{UtHNKH]vt(PQem1W"b9K9imUXOb&a j*!4%!=.9AgnHellQӦҹV/)1{fDOa&{(hɫNCU~T5?s!D, ٖs9 fnU"GWTDvc~8-v!Цa t |j&JPBS_hVnc|4lȬf_T(Խ4M[%E(󗶛ʁʰ4Jj^^4QXQ I駠kF11J'{RmCjrECFx>zqjMS:ן;fe0[t6.o gHr]F{>E$^t2;HѦDȜ`Щb^'x@sfgշ[.S*']^?݋6>F30ibr|w endstream endobj 3 0 obj 1868 endobj 5 0 obj <> stream xXK0W\H* B[Bҿ_ClGNnYJ qhdͯF5[~||I</6Nӗ/34˷O{e{_[?{qLOO3Zgh01jyxmwJVj^hCZ8y+AAWp*rc^QXb1qn!q@TVk|wF;XeHG(1 'N&ڳ(v;Kxg<1tPhOTy(B[2cX܂Z\E3!QDME?_BTԎ%Q-$d%OkЯn]b zm "(A9 l&( o ^Bu~Lø4IPmrp&L*FBeC\1Qg^φh)bh@2IY>goH2N)Lr#s% 1lYkᕹ0u_w E---gMZ,,虬i(3fk柛CQD8t5̽:4Fɯ5":_yhmچD >mtSʾ%xV႗S,Qtŕ@SJ%ۊ6m7{.E y]ra\7inn6G>=J.j?}UPj =%>XpslYZ5,wa~I_SM0Z]#"e D83r.rLwŋyw:'oG Eg>ʗCo޲poܘp\dbNTޥrGK:bZJ;lD׵ZsnU!8OoB endstream endobj 6 0 obj 1118 endobj 8 0 obj <> stream x{ \UUZ{ @^ D@<@ GC^kZ`Ե 1s*!B1eXd3<,rZc>GVs9Z{{ڨمP "Z]hw>GTI@Cƕ}4!s^YN迈Pp=PL?'"sDV7CLfKhXȨcbıIOFAk^><ؼn:~XO^ӡk+xmGvL^DxP{` )n =z? 7O;Wh |}m*&9Ԋǹh _@g@]J۸wD;&ԋ |& HghL6 u@Ct1F6@nوB/Bay((E2+WOJѕL0*=NJ>FX|X}$iII)J+naWV`y%4iaܖϞQ$8,UJL5sؼVk}4(EcP8 kMNLIZ{ILϛ 4N0R5d0^s+.dikfXy֬#w uKL3D1'> |QzG ߀K lнxujZ8!".V4ظ1zClZ >5DdoK1?FoѠh׈a 񦫧.-Y_g]1]bȂQ]'T ñ8>ߪ[юg#ߒ?'k4(ws]Zېttw/LJ'3[gɕbX?An5e@( !!;"QF4125H_I&.13,!m;lٱs;_ \ 2hrgz߃-Enan͐%Dk$4NVIЄf !2J30~"6'~k\9>~MHx͛8p@4xjhQ:V$h1eGFz(J9>ʓ^' o g4 (4|($V낀A _0mYr ?WW<ߧm@Wꭣ5Üs5AAO֘QŜd( 9 Ej&pɚE[ikb2 `ĵu< jKb+;_SBW7&o~Ie_ 26Ij@'A@h{2ӌ;: c`N2Nd%Of]ׯ#I#Z @@4G7?404ytYV}B}~8=7ooI~c`C)*gϫ5bm 5҅hD95LsTɕ}&}vog=4Bk`A.'I=A:A 1 LW2,4M@v`+ŏ;W='MSvܾ?k/|u(Z]( tRxRdP5F`|VsK,N33~p|uw+I.w8 }W%ҟHga9ſ_ʿg*a G͚FomGua-c FtDdm1;&80ſ.KBn2=܈%d6!aOVwCJ~KE7OeK_ĉ8 lpfSw8u x GY@Sp;>eX-m{m??|:w{/\}]f{O4s|ceR:#Ab˼COD\NDaYVJ7,(3 ٓOunGN~ꮧ\·΋lë7fTZj 3أ;ы"Z pNۿAnM2!6%$aɜq)lEVgKQ).5-K+iţtz]GߔfYzox_qa c}D4ktPk j:1t=dGt%Pf3=ɟAU`K'a/_I}g}g^8s }aqK93?[o8!?)#/w˞Ƿz$XEZBt5Am9e svXlR<:r~-tu᠊ywTE_+3,̘u,ZB8}ZΧ b&]KקGeGdGfGeGgdBZElѴh[t-CccR ,MP} [<z k='㫳\9}z7i^_bVvߍ,vOI=TWh.o-79Z')\u-+/L@11; Y-4#C Ks2V`^ׂC __ف?۲mgE}{"W䳋w߻{X^pDZ3m5ۋB:gYJJ˗LjÏY[JnJ=Cz5%[Mk+& K"z-|qQ"ćVjD"@' -V9*CZ`! ֣`Ǔ ^8Zb N$$_g5 \;'$fyeZW9"`k DX #D1zsCm2VQtlUuࣔ'j^ם;R4(eY0'E )! >zx8 Æ1FjrZtRg׊ꛃK#ѧP1ZjaQSݚ5xF[#3)%Bv)^u~3u_&{pw/n+:Ѝ_9\?Z@W cG9 .1GXbBf6C"\Sh024ƓfSH0=XJ7{NYYoՕ-GͰ0MkL֬DE'Cffeqz4F<OIjIV'>xY(Em>.9x|qV?O<4'aXu.ڲ:Dh#8n z\KH;8@y -&|ER"dVpZNIMǸMU8Hr 9ԅrx Y4CS ̒ F̉pnN@Q&1I(OwuC&= &2v'ׂX4"cqBt>+URa"7s7ÑS[xq+ ذ9gp%{crV{]=Fh.lՠN6Q%(@J`/,ԤLZc#)?K__=7uϽ{ an} [OuؠȎcccx7jz l_IpF4!MLӤiti4C6\6泅l1[e %p%r/vx7w ݚݺ݆C>"C!8:sqp\<9=;?n(6aTVd9\X..,.QFh,$)/Bo -zG(-ɚ1om>kW+KK(.vɿk8}||n߃[?:|:a<* N1U?3CԄQE&bIB\.n#xawJJD}ɵﮬU#G߹u#/]=,<@ƽ~<)~cz_ ܰO٫kh`k$`؋ Nf(Vˋ!Ac󬴣7mYO.Nx EI"{} OWlB'y9–̺OF:>$G8hhCNS/W&ߵʱYu4ty%GKr7HUujws ^i96u{ԌL}4dfx>_̴4'iNz]5MbQ*I.T󬝐*JA8P@?zdig7(NWiIE/u5ջ A]jrM˙"4 R$Gr4sX3}.qGu Z p$asJSv?@s<5:x<HZU'Ew1})CxPi&;l7?56R}*tZO7P3475C[H^OmZ:pIPzxgQYb(^8Af**<Pʥb;ih=M-5j(Ujz:Jt׸9|zi@Gr59#^XYKQuT/];qN0G# RIa*5?[asiK Υ(J XL 6N3U.&J@Xqs탨b:}Gj^j pTNW ˲^Olf:j(TG3ċbzc%( ޱ"jPslRAIqT^RP(&˥Ҳ|[SibNɂ fW,J <{q~d,-K%e}~ic⼢B)THE ZQ–rJl,otsrE)R,9RiNY=oAQNT4l @ WR^8"U`TQoS6/JX*IlJ*H 4$B|NNQk((̧s):%)F s*%R T-)*yE9)R~B[ :MUgVl+)JKmyve 6$y%̱1@1ɘŠ.SQRVeܖ"˩e% .':.a7Rүs M&k^ {}f*0 yb(%k>H&FխIݪFj@mʽU.6Inr^UWϡ>i%#š(KYuv!GݝXۘ&Jx#ZsIpBF *!\j]g T hyYwYW'ԣ|h #Zh7[`%FSt0O`F)gT(0;/d{ɔZd2CWݜf UQ|L8f50?y:&N*p!hM+g.fI`Aka.KPoYA2hҿ7&bB@+|0۔)T Y%SMs jD7G,+_#ezݽ.Q/v7i35ᛡ* An 1eӿgF?hQA)62^ וŔ}a;]*5F|X@j1>%zO *"'3;IPϕˇ|f>O`Ѹڔb Zh)4Ji/J[b}ڛ]kC e|-MGWv!ը¯VUء,0>uTv/|9mg) ).YJ0)<¼rgYP]lLDyp/tF!U*ԙ)LCO>[Ocd%i{J"as9ӿ>ӿF*mrw ?Za80EYY6*y /j7*y>)&~jís3s(dRElv9hvkBS{'tTa B*rk_Z7/`eDeEl]@|UCO&}_~RH>> 2˟c1O2|$?#?. F:d{!\x_&{w ~'n3 'HޝIz;;owd򶞜ɯeփf?G7eFy5Ix]&FL^ɯdrfgpZ&drR&/;F =2yťKK-ǒ$Lvyt%zN&p#Ns#9l!dl iBF rHoOOM~D~"2L8QG&C=%'2Lv<*㩤wvǎ 2y |cчGGvL#Ih!mmN &lܿ,/f2$sdr7½2g#KM&dLdL}ABsi "BVI&wɤQ&rA ~< J& R{> endobj 11 0 obj <> stream x]n0E|"4REj 0I3RD ~퐾>РNo][IDմ0䷾T}~nHҷxv]MMw$} ֟c}íB~PYRSTՅRIMM> endobj 13 0 obj <> stream xݻ xU0|N^=RIHBBg11v "IIdlҝ$"qqF2sG".jtxEGf"P|9Uљ~|Sy:CȌv ͽwBMu &AQg[vo"1s殡xB93sۡQ#T}hV{wlQ UpAWˬw}[{#U^i]V)Rz#t%Lzb> 3CSG9 :(M;.ǛK<3ENMK5;;g?7/¢疠aE7Pڂv#a/zA{+tg8^8pES0ja/ yDV-q' x~ج7"~R:>IX?*%Q>#ï{aU:yr jES9կ&n(ϥzjSm£0?EbQW!g T{F=GQ4GFnMѬ(b &ā8tt 8HQ v(:W@n>%MHFu= asS*&T:P<)-v8ĥqvM䊯v,E28po_{{[=Шk*|rTyFyV9l3y'*#O)FZZU@I4D,"[+Fz 鈷:,Yd73JU(\ s6%a-:3=ӋS yOOl{/_^ (?{?pu~ҩ3h@Q0ł#Hx:`Y:NN;#1z+ Qcú KK?b2WV#.RG0ۛ{'T`$՝FP>vT*GdܤKF3ȓ;4PI%"E8#z2KH5K)B, Kka9dсܩ‹ax]Nȕ$^lZcDDŎ#Vdw̒L6 fI6.ڣ;#[xTY>Og}1 X=.pvwhcJVɳcHv_9CS:l;;/ /}|!geJLf.YfS,,vwg5&sjkss6dvg%g##;{YrC5DEУ{5vBS9)<`N9;`ΆV10sA9blS9ے-gf3M-ҙSSKWk̕)rejezqiye>u}ZK2u;-)]rWjWZ8}D1G,C֑y$u$m(97<\|Bמtn'[i/F'쫿>ۿؽ3 ?Ə(\Zc+YP9isxaɢz7>/_JFX`3 o`fSR:t5"{B.<tr ~Dxn\1޹4[̒s,XNݢ#ܰGM!Y&hӴcn^/\x[8zSo^2|~;ө=`Mjbs~q/KҹVa1aqy!=6pbި&Ѭs9%I$H:I5H]te8ۘ)r{35-K%d DX[oXv<21YZ*p¸\\n4VW:V:E%|PjubiY&IotM&CE ڜ-&O?ڊmd?$ Æ@ʐq@b7XAi>9]woOy1S HF _],} i@{@=ʫ!Y/s/y1,j>F/1:]%or$in( f^¶tԈz.8ۥKOtNϟ.[4?ٿ?q/]ؒW^t闳;:H]'XԁQ h~'~@T "LS"\*?O|it_j&EsN׬mnJ >wgI|4<-'F9Z t<ޛFEB\ۿ''8Qx_Μ3gҊ*?W-ꏗ.f;FpbVYl'WV 0xrY-l:flmvnپ ":GV^o0IPํn19B1G̱CJ²ºnF~@m5l5nZf vgT0 OsCx2,{]\ sJB5= { {wgnJ MUg% GiA!''mmI5}@p.)B8ԢgY7CCIO?bsun~!ûovt44V}37ȯto `t HMEa2`PA)6F^{ kRK`"D$ܒGJ  > 7,cm4Dfp>Y@QZ!jVݶo7pn+|QIGo.^rߒ_ovnA&nwK$ ܰxOIq ,G]PBDэTS"x8^g]{fl$% (57PIyrYxZ*R_9Oҹ)?R峤H٧r٧)DŽ1ݘ{3=p*B]x–eCIUL^Dz[,ʣw>?ν{v,mjz#7߅_ˎ5_8V `H@k%bd=tX؛2dɜN^l3drm%Y9^1ˬb^%gfeo767X6l7nH[~kʭ򭩷ݚ~ | @ځ#)G#GҎ'lsu}s{4hIIIIɄVZMri"/ri^v{M}?ix?6ac ظ~yUj?ϛcuuˮG~U%`KCLD4]g˰ 46/VeΧ34P/`,+T }̛}ȧyۓF 1aj Mb6G1A{{By'obnuԲ:"˕v^oA}"lÇ>w/g׾׸4%Ys>rÛbfcQ󖄦/*hᓳ~7J ߟCt;0x/y-t __|{ӟo|tz( 1'CM9,]}MͶRHZʲ̢ ,iΞePDz{hTBX%Ouxq]2K1{vٷo{CE_@2|?N.\P^T:;X/@(}N >YIf&L~8NQS\dNXuK~9k?*-Q8Ga T9G[ >0-)T)vh0ObVs\ڎ3_7{6};Tq#rxD3QM+c GȺp#w R[4wh-3Ж@ރ&nbe8h5Zp.Yh.n{A2$3Dc4ok(Z !Aq=sJq$ *7[2C&c,ili77lݳ}e.Wlw{yلĉ zOF<㉖%$HlIɔSZdcG"X=d4x=Fd3 CFŒd-<wf &~X%%:tЁ@n,Î &?)hHCtꔣXl,Nu^%7cJ6E7h3z ^gy2 ٶl<[ԻhXkllin=kHzXh f"fp\z&iqX%ۖJp{=٦Lk-99.;ۓ4<2Z*;KKrksqδhotfl 6KfG3j4%eiXjpt}go9lm_Io/⮹8~>Ye ϸ S ]/Y\}GdLl36%8tjӐhp?M׌%SV)wͫ*-WZUU:}^M tUscZjC+/q{,hF vYc4e}mOs{}[T^Vut(ەGG}^ L!۬I38:dYM"g}"ws3 [*K<94WkT?i-yyvfaq/` OY|E㟄Okrܺ&Wa]? #/_}{ӏN.Ȏt*)uMF}`N%H/ao[l"7^.b2gəj -3?1ى,mr("HzCjyE _d٩LLzٴRUiIMMIi 1%5;Hx"X] 2MLzZpĹt#m:ãYΥ&_5ы/9 9>&QHcO$df:ی.u˽8BK(OB1PBy w@\J£ 3!e=dgͪ7Mfβ@9|HסCIH?1r{܉>.i1ͦn+Нr(1 ŤDdB!advFw7c> PW70}{E+ b+-fՋHQ5XWJZV޺݆vuȽiuѢ O>GMfmKLLfl$ÔamɲfB̴g'fJ%\)YBVJºܶ"i^ϭ'uвֺiLl5&ulַ,Ŷ%mE7 !ˠ5fI1{̵=O'݊n66nݺ˶u[}&]G@kR5~/~`Sqw(]{p[۹qdA2beޏ_/8V2R Vaka#g*vrPՂM,`=ul{:$j(SV3V+}8_ǰʑܯ-cN(OL^O^vH0 -v8au%oAJqoѪWnS^xoM8x%G?>1?,| Ia4S>8Huʈ7,x;TQ9Kyя%?dQ믳`}H3.z[ ~súadD+zhle Boԗaވ[ޡԎ=̵9 wca/Gi-l$mqz/)P?>xQzBf]; {u6vad~Oly,)-ǵ7ZeTy\2ڊ=8Wڕ}J;@7I4zi[Do4/MD~ "1 ‚|$cw ۧ~̖ QXJs %B%#Yzh>Úk-vWXk(oChX#= z=oz!m!AcIzmJʓeLϴ̆Ta8˗<}mRĽ-+BWaYet-wWz*֠zI=zC\ovk{g}Rq .B9huI]NWmJ%|hsdX72l5m5YF7nK7LjskٚF{e95!Ƹ#=/)Javp)~ዣǸQn!/]\1yfb WpTO(J WM&TX̜)(%1h#D3J36~f  Y}gՏEmq]R7rk_k7k7uP/+{ `"fb},Yr9|||CqTj^b.,,.-+MYPrDX<fC[-{="~jR?(KNvp` r߂o=>ҽqΈJЩ@jlfxnI;K9#GRNNvuqŹ씫r#[J`zOR47"fg9y3 Esq.gbwfBX(f 3 avX!:ES7S%m_ܙэ_5+QߟYP]YQsK&v'$$,o_wkx3SJ;E)*˞nټ+VO?sgڎ|};?-ZzDZtnٰhhj wvx~'5 :jv!Ÿ/$-vE" VQS2HԗVT LM\DOU,7/@Ew]Yqƻ]Xg ʳXͰOUyYEW{[X/gǕG؁/ﱻ( GzEts`t;x,EFG \c-S0ذ$3xM nb"& u 86 u > w݁aor0;K'jGD#fD0 -Ο^/cB#er7B@xV6J%5 A8ȡK#;`><Wb^y\n[) nK}OZĽpً>z '+}/]&N}@qkcr(s[v 2Cr<Ә-tΧ3Dof5y5lS+c}tV} _wCX==䳣 ]Zz`3E8|p}wr9g&Obg^Vxx5W^A@zO.(C:a= b&xv%b3 ]M)Ȗl5ۓ3%՛B)u3w(xV lBX7jr+v!%wA:e7*3;*O(ayļy΋Ǜp  ;𩇟MC)vN?3NWGa5a 9Bn%yˎBm$ЂE=BAa= C^t |@mK`5B B%,T6x@}z>Laй=6@>.߂\n軆_g_/%Cf]л't Y{ =J 3^ckk䗼 BK]6Y}a0hi|V7:LM?70nYg }=P/0 1XDn{A0!=K+MGCě[[#ݽ0tR' Nc"I`A9H;kQz] " Gb lFI_/o 1000n鏅 &AK]AJ`81a ߧGaaq ȓ*F}:`1X^QV)_ U59Y(U㧟YW} 2&d~il@` &(tH-E̚ E'ȜP)}zZ*RP,B `lgp[L|73A`ѿfaLGW)r\F.6/ QO@!F_4e,]hWA6? y1mg6Tߩ,ϴ0L_&i  L=G¥ffYC3_=EzF5C̢^T~6j$UyQ=9{E+O1b/NެiL͋=LoDE󑘖&$U0:xw[RƞiBB\0X*:C-{z ,:c8*Z=Y`WCoVheгi{ըf50ߡ(-* ?u:U cj+ehfeLF2 (bww ¸z&2ƳJm a9*8,gTQX?!W]Zz'6gdU:OS+5 `c/7٫g5gMypW\UZOVChjduZ F'5D&*At2n6bz/k3.֗ͬZآW7eW,߫XY;U&~m,lUw٪ ߓw 3 z2OۇIP [ݗi}(:`ʃ՝2S?_gO>1*H Bv . Y𓥐$Ò dl$¬z$=H n$r]|Od)v)>9̰YėX I"@M, RB<q\N"ts v]!HK  VxfUX%bS`^'aĠ ۉN(tۈB0>PN$ 8s?oKFul@ endstream endobj 14 0 obj 13566 endobj 15 0 obj <> endobj 16 0 obj <> stream x]ˎ0E|˞E \[HYC ऑ:YǷ.3#"ѱ]U>.Q;ݜn}jBz OmJk=&Y=>nsZ%xvGnSdߧ6L]I~mq}g~N6cLm_ןH4ő!Yt};0"K^d endstream endobj 17 0 obj <> endobj 18 0 obj <> stream x{ \TwwμsfAA| A%" DfЉ5`bbX45&њMcc|dknRof6ݻn4Mxw 1iȜ7  {/-;1Ρo:~kvwJr8B9=@o#S s{`Vܡנ??k:AP_3xطol r@?{Ch jUd> ׶y0C~tT>9^T5Z`4-V=͑tedfe7gZV :)cBP5Lv^쇵 h ݏƷnf;<'(0rVj P+ڄ75\7f:nfm\i3nT| q8?`rQ\g l7EQ`EQOA 6Sk)u @߄61 02Jb#o]^ TsVl[ (n0quc\t7N Zy+Qb0 )vq5"dC/+x *L'ܺm[YSI)DM'q7ڸ $yNr9_*\&|ZZZڠIz0 5ճ^tn0x%ruEȨ~C.]L^Zb5{̹Cף8q(WB~'kGފ΅l }铫ޡ/rUxį/ e[[]Oe* 6&qsNe&Ko<ӅDQ|@c^ac|Ou9/1O3Ay_%>i=xy+ȁȁfhTԅ"B"/b]+y;9167lUmi 9ɞqMklE|TɸE_:(&Y?$~&OtA.%kJesMcY\OM+椩ӪYs48Ue:4Yf ieӫf>^qUٲ`6*v+L`6uo0{SKKힲRJ:9e;]}x+/9|K˝=㇆5{ӢCߏǙOyHm;@,Ξܦ4?q?J{:qS X0pi,'M\.xCtP]YnWU:*+ \3gj iŎaݰ~0lv Þav-pRm͛^6gBBS,8LRHg=1 vȆhd1jV46w{Ưw6^ܾ+^ v%u| ]61`ŀ1 of.Sˬ&}-\ [ D:8DHb$Ȝ Hh?W[lGM1ZЃ[e4jڗ,~/nGcc㤃gZ%)@W^ 5 3+C!|ڠ,'5;%DAWƄT6<:h ghjZQe}#\Ҩ벇ʾ͝CT4EEEEE_{$+Up9 pu{|3veZ2<~ȉ̸ֿdT ;jUZ#h2Zm^o2gUիǴܘb$fVN0eg̸ lHtxt_Ry&oISmEaK4iƴ4;ZVhijƩͲY6-g33*3k|Fzf>z퇶BeW /@v{OW!fLF3#Hl ZXvsx  ^*[|w'%L>9(Y(KFT 7\!, 5_Uk1Z?v>\5kGU;hߢSpheʐI*GbXNW{R 1/7J9D`ϯ_ltաt%'$O 롆pq !<1a``d1FF!diQ2Fu*7qxC>cG! JSҰwB`9mL]ś+eu$0?Ow0Ԗ|rHnkIZlQ`FftJ4A`ٌ EPLddJ*D[Ώ#WZx{|}=C&3h$y/yٳy7v?}YM#xu>jʤUmED8 ӵO.~zTKNn̤诌<_::::*x'wzA߂)l%^]kԓRO.D&!s΋NT{jo=kΞ>}V)21[8sBlY,f3bx:h<*|枃 )h?D ^RB ))rpQÝɆWr+ss_2r $7@gHߵ]Aȗg:<ޱ]+W^g}sx.lD]0AD5Im%)^64sT \j@3-* pHN*4!:K?1(^~D%~[.=np3" ԛ+-n9R7sllch`٘Ց2㵏ܜ~Ε_Kτ6 θpt!߁XoթRr3HK~xEc&2A }[`tOmwڸԿ=ȹ@9S`}o_ْQ*XNrՠ!kѫPx(ZQ s5$^ G~{s<W8$`KGՈaV8hZyΛӳ1< aAK"m-9M://V0$&~2պAtLߜbܢ,a$?j;Ll;5il (b3FjaZuA) I$TUnк@H (CpdպSnX`'VBm(sHefW!/+.\\WNjpԶk9jiZzV{Rt5[RZU*ݭP*lnR1nQbhIm5 U*cّgu0h[-)+e kߧ[yݪl$]tK=bUBRXu6fuۦ++[mMn:נbr:d F\O ו!udPCkٳls9?wngg]_?ς9{r> |qEߴj&GR% 'K!:oT3-߇v?gwN߇"~@L?vfa ;;VAe N#@Q=ivͨOKϴSoP`՘YtMF^XԖwbj"˄V%|MHxC%!#kQuFΠ2N]3ȭuLiv3rQ@Wuy30 Jv e2\\W=SzEv;s'{']Ѧ-cq}`Aih -0(IQiZ)Z饖#1g*}xq3;=¨q~Lyw '礙xAҗq& ˌ&|zB.;=`/@$)H䢩 (Qs8N*$1hr<&**$ⶍ۹כ;I >nEf?uGi-Gď1U0o/?w}ys~Ư~9ܸ".~:~_CPNv Lg;2Qf{t'n ,B &Ԏ Ɯ٬tGj0\*ST 9t kbu(:f˟3oz+lĦz[Cv.s:&fr2kQ^pUdTd֦:[-髝F= 4y-O8*e[eK޲t^)$Ύap}w;?gVܺ3+w(?8 m;`Ok?"}u98~w@)\tOu`hW$vܬLxlٳ%Nzv7xvITȖ;$Pw?dDiJN%;ԙ'='WuQ\jr CvFݨfM̳G:yNG+8h7-~0^ѣV8:Gh'whW*ʐGG/ט <5:/sp"SE[RPnPRMWT?Wj5ϴl~ZȎz\CnLk}0pهY]I1H=Fšr#3 m#rmV|YW}( hf@nN3&͈<'2E͠tmXniyߐyXIn+*Uȫm-*muGnPrۄݟm3R %p<һ'&u R#.,Ec`P,f**4PHSX=(tB z`G_o$ִ#݋C}]}hoh@JI:7+eqwhz=X ƇHg;Y,j2!-I `_hs~QLl9:ͬhz& SNX$D6 P4`7Jy{ > ۀ``S ÆPG Xtde'(s<r ЁI(0KY`]B  u<``p |{y" c|I$;LW/1 R&m()u vL6zB1@W>HQXO)j*hOaPDAPɟr4A c2A{B_@=tcWH `dž`gH<$uz r @"@R B1CT%R Oh4'D{@TGPJDgh"""-`w*<^h4hR.W x "`wEc}_<%:HHzq]})%p(ŅI$EONZ҈f$L$ztEoĄ%l6k"PAPoX}A2!'zQ8nBû.ad(*FeSA>A^ Á΍@@(?rŚt8-@1MZV#66 -U5u-BSsj[}op[]Uhjhmkvay]CuP\"46 u+j`aI꺆b*׭kt [QӼdt׵ u f-[떬jV575jPP Ԭ"ВƦ溥Z aS+  U5+ f.),PlnYVU_/,kmimZA,mh\AxAX\T-pRWխ(VT-i8,ə`ٰPhiYRGǺ%t%8QO]Rr  e5 -Q\5mu-5BUs] A%UO"_"#2EUdL`uMU=l!h|a-hW͖`8Ft[6n=RW*B^:+&3X<0. eKh7D#v  F+g7J-`H{@_`[4dJplA-R@N$ C ŋ`m3I[2} ). "AZލŽࣶ{ŲB%QEP/Zz>DxJE]@aM E7(Q!֡X_*w gԠjhm 脵M e>ð: ҋy?b5h |ԝf} n[HLP +Gt`} ;4Nžh n%E)9" d Ͱ$L57=Y^Z8Q4!Wh͹=AsE)W7XHֳ…PDShz(sAa]N7 &O$,iS!+D1òK'jLp/ N 1dN!azY-.iRƣ{SK%Gvw {2}vVS(1:O7d=K8qv lAsrOH>Cp s.JAZl/?PNlBx@̙~:JQ~dVJRH<(.: tS#PȒ=H{eNWSm8ѱ)Z7Afʏ脄5tS9 SL9~3 { PKI>K&$IʘSlwbz  | l Ik2TO4dIu$vB$nH< #Ȳ "i MW%<'Km91I#])2OպD"H(/AQŔk aGIwgLOҔ&iXf|5&ϛʗX(˽ =P? nb$̄L"A'I`3$.ztOA'7E$۩g:݇Rp!!! ǂh lax(5ܑ* 篶8F}ḢAj2oU!s2km6*翂LIE2dwL>r:dq;ɩeӈGi^+ f:Wcs0z0ZMREgȼZm&* K v;rXFϨh-te3F]##;*RDQJm#Hĩ'&0[fLurxʘVQ*x7*Jm%Zj($$ &+^ rRRH試ɩ騄Y,eҞR$RƒuJ=<FZl~nBwR+zWEHOXL ?+Sȍ`^MOi)% hs3HWC9UOWk`}]rD:JLI%OJ#J8F֩*ʻTHBB@$go$)Fe_mk**$j1_a 91d&(/ٓ%XM^ư%ɍ?W]5:iKɑ;5{JS_ H^x)]?eĨ䟥5Qp7\*Y'D!n6J~h.dV"ŏP23Lg'bT ^+Q6( K/4[ EoͯPS+0)i;&g&Ay-{JURU9$hsPy嚪rE2Jg ŧEVįs/>?_p9>1W3}-G揊w,, >L4~&?S5v?}?-C.|4PO>4~r{۹k~۹fl7opxse}Z}Q=?p#ثa{x=uޣn ޕGƏA6ߟw@gwOn2ZȰ{`="57M_sw淊Z.%q?%o`F<p, GEo2M#\8TćE*"q o\7hpkz?mK=qi؆׉4Vk׊3nog,|ߺp lJW&oJÍjt|6Nϯ+\1ro݆xR l^5zևku|H"%%t\7U۰%<kZ| qK>XWXr 0/@3y{\?W6'/ۇ9Tŗþ|=l.il\<-/<(*4BShƅ~@gNW3pf>oc3x¹"4fqrD}#x{F8A?YL?mg,܆3NNt;yF|l5=ұl` lf < ;&aΘ &l@3bjNcuV)4VZ*l`qs̍p1؂cŊ ySF`' /}[ endstream endobj 19 0 obj 11092 endobj 20 0 obj <> endobj 21 0 obj <> stream x]n0E|"W#!E* %Ƃ endstream endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <> endobj 25 0 obj <> endobj 26 0 obj < /Producer /CreationDate(D:20081112112703-05'00')>> endobj xref 0 27 0000000000 65535 f 0000041397 00000 n 0000000019 00000 n 0000001958 00000 n 0000041540 00000 n 0000001979 00000 n 0000003168 00000 n 0000041683 00000 n 0000003189 00000 n 0000013290 00000 n 0000013312 00000 n 0000013507 00000 n 0000013985 00000 n 0000014315 00000 n 0000027968 00000 n 0000027991 00000 n 0000028185 00000 n 0000028723 00000 n 0000029102 00000 n 0000040281 00000 n 0000040304 00000 n 0000040503 00000 n 0000040967 00000 n 0000041289 00000 n 0000041342 00000 n 0000041788 00000 n 0000041885 00000 n trailer < <09253C500594D283EBAA22861C746D73> ] /DocChecksum /0EDD51417B459ED1DDAC65B6585DE01B >> startxref 42072 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Fonts.pdf0000644000175000017500000057324312277111530017025 0ustar synthsynth%PDF-1.4 %äüöß 2 0 obj <> stream xZɮ6߯:uHÀE\ wIEM~ : gKuN9 '`~=a]q;|r~dXp2Ӟ7D2\N8v??_?6`ẽٟg?yɈK7~^ލǴ4ӑ7嶴CɃ>)Msy:$i}hx!dlV7-?GZ%ӵh |~m,$ Vc΄P OZi%~_G tAD:-ܬ a"Bs cY`ERLK"YY[IpgKDnL C`9 $?/:``HѓHcrw1ztAWU)>+^H Cm^0ƒ?f tk tah^PyoZzf]OU.F$n1#imupCKQ0|ݘNMrSĤ(DaK7ԣ#ٷJaA5+j_"R @CƧ~n]]jƍF!R7IW0 l.9~ڒ5{'$]ۛ7)BsZ2g!<'Jƶ!@)\,kWo0W %lڼXPɹ?wznu`Y:-U/K*yd 4*qYMxI/&荦ӌֻճՀGy#Kmttƀ&A.#v>j.Ve qCW+e0eXZJHUv:ApMZ%? Q)7Rpfb +na08>Pmmmt)>E[BUĕ^aJ8dַzmyX=ݰzaCYi6u&5rR.T D<뻹Xcc lYki5tf')G?޴4_Es'AיRvob"^yP i,^g%eMPcƵK)CA+nSиyruWE&}Oiw5S+AkƺK u VVw>?R ՅHy_aMes}t%xNr[Zlǻ8-vX[@74J} <(]B<:~#~??mD 3 S 'sch:z,"pTDyA,OvCI$*!b6>}T dxNouIw"YqP [ĢAũ^T4Ղ(4L)d(4:*|2g@)pPIi13KHNjCKրBY 32}ޏYGN?O޳}> stream xoUƿ;c;iMLEitATAR*5(R$:iy:l@bú=ڗ?gm:>~ cm/z+iow۪`h|ʮYW22svҷ<5htG N*҇Y<+yyxX* t[jr嗪j(5-6ZB|S'rX|{bBy~Ϙ|őbg3 )n34klo<_FV08ApyQ|=33)xg4\Y&i.\:D;e@ML/4g 4σ7cW5ӚM\&śE]3+M<' 쎈-Y/5j6+# h4 T fmE65_R q'N=w1TR[ KVءb'emVu]YA+¶ce%iE5-Pȹf$X|;aX&< MT,ũr|J55n+5$s4PߊwȳRS;Lz$JR>T 2t|w]\SHB(O)r+ \YU/iR|^X1:'P8ϸ9^>#:R=-fpaq^| z"vhesט^Zȼ=iG|4 endstream endobj 8 0 obj 865 endobj 9 0 obj <> endobj 10 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 11 0 obj <> endobj 12 0 obj <> stream xܼy|ŵ/^U=ݳfz4ffFȲF7YHƛd[X;, 00Vb,V l`$$|C'qHrmͼS=1Vw-UW=S~ ҡ! y+{V^Bؼju_t!~!ڿm B]qSF[2:Z5+WVg#BkF!C:n\l\] }bU+@zO=BfCZfksHG(}}k[Be‘h,^Hҙlm] <<<)?.-Bҕ哌.Pt7 Ӹ4u,.ڇ h ~(fgQA3sh-G$v[l紡~dG'plGwUԊ^l xq@C8TޏfC#dBQ }ѕsPŷOP<;\ MA/p;:}a&v@e1ZO* J|'iۃ$ASѥh%}-%]$ʑ@s 5${~?rC&Эo@E/q@m9P-s;n=8~y˖Zֲrՠn(n 5qu_/\G'OzwVlPQ#Mh3 g|w7n#({'\}74{&,W4KexމcQ Ɍ20a9O#7Bm,zm8SE)dl$2w0;sܝOKgÈ)p=zjOe+AG!L)0әLsv}7[ɽ,]Si|;(rEQQZ| [W0>*z Zyj;/m;9H5l1ROZH+I֑;`{ / sE,˖:fsws{U1~6s5=-Pʋ[aBi(v(.a{$>`/́;q! ւg9u-m ^ J|^61%i%*W8k䗨lɛmmWP{IIbAVo'M?!ݨsgp s {&HO5~!r9)q'ԏD2>!eyD5JLߏ9A=8Bl&N0%݄9+k@ Q6@:Dޟ)}"6>w7ٓL]@7~[7աABY+z ]69rKL,ԇh~yoُ5h}y# w<3|Ӳ,L͹~4љ̀jZk4$گBT QG?vLJ8ښ$PQWp-(n[zk~w O ГJU+FQQcB*Uk k{DtE_B:zQfe})1$<ڽf͹A cOJMjo0NFt#k.Sb4~مzŴD9 * Joj5hxU#\ w0n _ra1( A?rUXQ*% Ο&55T@VhQ(4%]H%7`(AՇnW4eڼw Hﮤ%t3QG?ƶ:}AC7b"Ҷi/Tη/_- Mm/*/ Q6 55'wn\xfmClP5(㨥JxQ /<&uYlX1^Vr4sT]9hǛʧ]Jm4ڔrzʗ_*nҾpKfX  J3WJbp(tow{Fg7Ӷ`ϘG >F '@;F{AFcTܫp Ǒ_/G΄yD掉fqjSxNb9tq?ɍcC7˽9VpVV ~ T;s@PA,8]~aH8)0eg.O`VDž#C& 7ĥށ4'WM$¶@!WƔF`yduqXvaĩ,i]q5R"k.S{@Sm-4}(җ?+ BZvv^js}wWnܩԯЭɩ6gm3=e1쑽B-t!iߵ}hz~c39)."U@X Y,xȂEZ[NXNZT> ;hAƢ[qqj gTK3)lrbm ^4-hsu 9*XLB}}C}{X`)zõ)G}]*bYoY|هjW']Ib6em1c!Nkbx_?7SscX{ѿcx#FB$?b? ~$5${פ&wd'3dry;R;z#6 ֩[o/c*WܓܥޥyL?xHkNcɹ܊܍w }|ŅZzgÉv˦MO^ӓfs(ײƨp>Ԃkx.s)[_ج%?2cl~7aO&0Xem#F8eWJ,$wGq_?:eh6J/Ӭv~*gʼnށ)f1DQ)8?2N8n2;ZeM( V^ݐNo8ٙA,ĕhmuhR~SUq$E|bHD+PY}\t6A 4ӵ&G#gĻ7`"i3Lcǒ\o|lI:*bYS${hnd:gn1H|STW14V:XI,sYF3 0sZ62c=}i٬؝&eGbS0 Vlvt ਗ਼rvv|$:d$aŒ}rCxmoSnșDWz+cUuOƳw~⒁GFcz0 L\S4PH#;xD#Pƾ~%7bIp}1(Sq_tn&q_d1`!f`)ZPU壑$j\ΐzDG5بּa5c9BPڟJSPj$EFSԉkxfh6Q )4ſ ?Ur./7_ ,R90; bJc{NPTraܱ/X \f4FʹRԠim6sN\qS,x)|g{y Y4ߘ`}ʧFT6 VQZeVٗw?~[vmos1xGXКY* 2Oc#(b?pR],qZ؂vp;st㈅_>f XOO<% TWÆ {#*b2Z%Rj9yY= lZ\&+x1t=^u&M; &7jh*z`*:ڃST4Q4+t֫6ݛmтU[7b=}熞[-OV{w>QmyoRmGl^ofgK[t`(6\%6٢A0 UU`h5Zm|ulx7~X2,#2Q C4 D^vH4w3^ j.(Bk4yn/MʋWրPkppyzRSoiHzf=-ۋK&~{x}蒞{uxl~/m aϩ"P6K#r|efrSqJ;Ww9r9#=p!8SE֨~gaCWiu.Lɏpu#=:Nw~4*hddnSi!_B]Ywc&l=;}qcU(n^ȏR}FWQ l֬|D:ߗf223ECg}\.{~*wֹyA!'~)by%{YM:Qݖ+K;;דߘg)8#0"};-qP4Ĝ1lZ=*Arj iiͧP鑤@ 0 }M *}6F1{H0ZR'L |DɆ |3z8զ/XQ@I_pgy5U9|jZlb p/S|oʍ|m6c9_8=Ya[MKKfʄjkQ5 Ph$'t:I!DA.M0i;en>3uM|:2ª"B:b֌PYm-0R`.})'N"7Gˉi'<"*}+xH|@*?h)t]~1z>kLirvz5Q>7fV^zfJ)0!-.zFW>\a4y.H}bs~µ5< RwpkY.ݞn/ !ϛ $=nb"`ϻ96k18O}5OS`5/1[ & PX_>yU! *җ T}`mՇFlg*, Fs~NNpU3""~4FqtiA_Mx0UDʪdjn=J*8H(`yvRکOh={jy!$:i#"'ELEH,Jjx ru{z"RXiC}37m߮MNS?KxaՇcΎH&bͽɧζPSgv@[סdIzlšgG49aފDwk.&eU{qTmR[&eG15ss Ms.Ѯޡ]sָ~[V>!x* { ǏX KGd8I 6X]b\[tpnr26'qf4'P dʋզp/rz.ՅEVCHçd(H+4}\'SeCQ⻀*0"O|k{ǴxBÉ͠L@lTT=^3u4U rFR R5QE ,^dz/N^(%\k^ы phR5{PBGyKA<v[5o15dCi10Q  t48)kEN-zi[[@c5hPBAa_*0 8_Ԕ(b-l Lz]f_ϖ,h GH&Ό)^auMdōnꕭ3n\ڱ:ٔ˧$(}+on|hٕ+^AǶf2-{f{Ñ] J QU-- 65\_ݹ0xйs=rrN.;l9`/ s[<z jŪ@ ajZewx_0OȆr•zyd.+C\17ˊcX8"TZqS+\s5r HLjS'Ǝ2YHN17ewfwglfa h9ǎNҲ2yn®v>4Ϭh﷿ Ėz]-6t1BAWUGNfe/0ip&'C)1141{  :J0ى(m3MР <3K 0LTuN1 +MKBoÉH6WeT#t&8ЋS|^^%EBS/JuxeŋKx&\ΕpBLZ%f/43ߋKU^qG]:ޫ).k"@A4S?<فԿ tN NEvQM W&;; xm}' cxzƬ?dj+?ZS_OmyWJdVr\K̩S:b&gNl`}K%UZr}MO,dK/9\w8mvngU hy =%od#uFƯ\W`?զqg0G|H1Y%!D0   5B~_C҈D$JqB/wMPXxQ0t}"6_/@(P^W8- ٖZL+%fV4>G5OZ6kҜyQO(AS^g:oA \%O[eaf03t]w0wGYIm FnєZTҝM-gxLGGnIϘy U'C،+;{Tb]%]<.`@ln9~UNmLG4amH7^QmJֳEl15FZb|iS4͉̋Ůᮦmm666ǃnqiXgdLEɟkLFlZ^ZFNb4/h:]ΩQ+/sy=c¦N몶|ؗ o n t1K<un-aχ ak٣lNgt@j# &0<_0lL&mIM& <͂H|*n d4LAɅ]TbtbAvNNXqhλzC<^w/͆o} !C @.^X٢->)jxI Dgn!A([44-C GC=5G1#}#bX25ԋ2.Qz%wG$ D{s@"| v ޭh,)&e[BmE{%0SgFO[^cYk1IŸlV;A;}߿rT=zY؀nwT\Thw{x Oo]E[O-],u\gR_<ǿ=wT恰ׯ_UÌzpoilK- Y Go,39$U7mlה^-=Q;\'\#e1:-dmC6Y70S\U&v+39*CRB5@au;K/$wvYj)W;+V j: ĒOWݡ"j5g\[#9$qe^^Z^YQآ}#ЉUAZH$55,> J hL>sD\nwFc DH-XՉƭf5BBF-ALQ#1Bi`ʘw8.ٳS?Ԝp?iuzQoT{F @&vHL%I\$I\ T3gz{&.m[3#1q*Qi 3 N@H1ĉq,G^*-FA aҨZ,JUd -V]g-/R?6BuׄcNtwS5dŘ7+419hUT+3pu -箹ɚ8g79Ou2)AoNQ EpTJHoP? G1\ǟU.Ӭ&RIFEνAn5D;<ffF;b!q]CGcثo>;#e0UTUl5uq񋝗whww9wv J;tl0zuAĂ聉5&(> œ>d|F<(Ģ@oeg8$ C5A YAmtBU Ce]@0P,p $ßcDdQtJLp 1 C+31q&n=.¯u}b\21yI2Ɗ WQ:Y'k2+"X EHd vH5^xGH(bcz^8R\ƏOx_lq:rOly=RFܐOf7ZwLQ]Tp#sQG++Õ KGD/[*:. 48}Q WlM}aQUW̊9̓idp<7;f|h*x-x'ߗ.4yɉ?omov001hM,>7̙x!srz^dAMr!^SD4Mli.\i :#HAD U>G-y}~s6:9kjf|Vz }`BHm !{?ٙlꡣ = 6Fnj!"k}*c8L}1F(8= yZpQcBߢBC.có/ᛓ\8hyffAzP +~4 !N a4<{ǒy]dct =3F` Z/pЁSy2(ZE'Zх!3ԪC:>t/6 g ":;Q&H[y }ix!VSso}@O-5[]\j!yE-Hv\tPέ ETF?[mԬ^qc{[JKv(P<\Mڕ9n2ȫ %zpa=SNa 8xJ ,Nv7[;X^_[߅]6: eF}.m>:U:$q!OZe5bgvqu*qh4d@,&' IwqV/ޝq8:Cew!3Y8(14c٘F?b-f9b.N~|Qo2F p2`CThsW6[5Qߡ&feѷ/(#OOO]932B,]oh,3}rCxuUkF3#O|, ,{VUm7kЁ{PBhN ~==@0ix;R(A1a39L;h""F8 &?GT*?;y*L5Pz"r&5J*VG`"T@*8q>, JS0MɥBo}Q'KmwFJfk'^\cYt#o*:KXeq~E=1 ERNШy&*fRM>( \Ha{ժ*!$1]s=5hmggfٞn[tمTrͪf͍ڛu7ol(]Gޕ+>~~]G<<}Vx^yW /i܇?S\?3kkwFF&5)v FXfcdz$3?t]R-Hh^{EZ jT|Rfe➘Yg򘣾'Zm=Z M5+NSk4cmB7S%ٌ5ԂgZHZXX4#h@SP=] ~@.RgI H*Վ2+jjӵBԗi=ڗd-1.bћds&[`#ee=w 0lIh7MZUFf>(|B#Z- d`D_}cLTvs}c.uWX:IT/ʌh@ƕSZ67L[D%K>S} 2񲒞~O!m@=N:9z+wAm~O:PL TGZO {R`#L:UՐt*z&-DVc:[_DjUd8oY4 j W}yb&]!Qg<җ y3M\kV}'oOʶ,&$Gew "aT,&NK| <;=VoV]W]tmi`?GoMKRj*|* :p{W~V=@wF!0F5N ah1q]h$v§t'VX$Aiu/3|L֘eMy Nb)ik`mme\/^4@k[c>ha4Fz"ײCoWz}a왭p8/ :erNPq=,[egsENI6;1L x:R=1J\8>2 9E6` Ԃ0ew|l65n3Y2 S P @ 1+fhRY_@ i<7`i^^"}v v/a탍TD~@[F<~U^wD bH 1jG³P7D6n7kJo # "IC6t;'t{)Lh_?)M1w]۔nʮ mhjbEjyA;5A$áP5VDB/5yxΌ&<͏ƺXUtc݊ʁ \_ $OV.tG{rGq:ä>(]4v@b`r ]EvFmIשj}A8pdCY._ +w|;}Zq2k.=}X,fEcUՉ@W;YRȬ/@e@\psJȼı(w~tnū~ݷ5"7K똍4["֑_ݶn4TqWFDvLbZ #Cq.щ;4g'݌]\Z^Qqz΀j7i_gl3ۍϲD> U|U!3$J>r4f]Y_֟ LO-ϮY]_"./NTxr~sknyny~yayx6qj)lӠyв#HfWk5Oo:dThMij ކ1~1h-A*w=jI$uNgHj lD @He1e_ucGpP3WMCLLE_Bͤw?i&-*w!ΦwLT3sZzut`1hh9ؕ_Z}=p~u}([bmRCqc$C8YHjRꒉXFC&l搐QQh>?+_a?kU RN4٬'g)>r~F+ r>Rh$xԊy!l}q>Δ{nWoh-w@]UJlsr[^G?Ts- }_}iڤ{ݳ\4E>TES-R%g+EP؞ug-5NQvPNt=ҚM+jn|m;_KEqU 7]=˜z€aKh ed>ÜdT1-;7- 1DždZօ?TBD^e`0ƧwT6EtYRXAH+x%[TݾJC>`ؾEK^oËƹƙ_gǸD\d]i\'mavqy.c]|GGWG}(UC߯??U%v|U|^AQ۽] G32xMotRRAUO#FaY'Ff ZF ]tJrO;H)5X;32^e Xn7ßBZ1.j/e0Muy+JG_]0b욏>3gk>O6Hz xQGcv=66ldd#a 3jNYVXU1ͼ`yA`X^_HxJ-Tt1<]keZmdnf#.;q xU2ye|/PI ]H{ZaӉfSѤnO')Fx Ķ)h p=k.{KCWCXA=ҹA[B|G|2}MKfl27ny"sQKf3= DSj&I;}Dzy/*s-v<< Jt.9Tm Oi=W[7?rזN+;:|rւA˽{dG22wcOd!6$GQB&}:u[bKcӱH1\NeK顴qo_{gc }}?iH啃U1ǷQ];oYH҇I-;N Nlb)FdcuQ .64qdHMM}}n-5hν3$Poxɹ̹{9~̝+Z;K^]>/jKka:+rppt$jG7h_839 K1>_Sn.pkl!+jye_soF+mUuedySA4UNX(6v=8*'ܗdyY^e ];ɪ'`Uc6}vpu?sbfz'{g 7 _?끞">oYৌNsܗ8$7Y|բK^r1YŮ V[r]4=Zir{v"HWbd嬂^$A/8=}zeQO{)8gi-\;J pYYdߑ=aD޿z"j5Fd9fRh7k36mܲRU[bcb q T>he^0mUaˆ%Sd-6rTc)B3+ $¡{@\# tjm;i_Y?-MPp[0҇:.FϷ l5[<;Ά++-2 N6K77~SCъfEս.Zf{;]W>.`I'7#/a̒EpÂY%rVkS:;/SdcrD/nBȉ7?{>Y 0{a(]#n&B;1s C%o!βY{ ).rFsV%Ht~h>UH.5 kZ|0OV[LJ;w~iiْ9&^*uN\50hn0>b ĭyT &7eC4/[D=Grso}rUXj4<ɩ.|VQgElIFo lːMxU.e!.e pzAϘֵ&_ִ窠wwO#A嬏u 5" dS(:_̳EP/?ܼJ?L6 z߫nrُl>ʑ[~;AAd^VsӼ+ ͮr3_+ CD{  9+$r^s j}>8#ڵ Km.Np&‡ᄉm1iwV+~`was=]GqM׋݉%%+Bi݋]hҹ[i̷j 3@`](B; T{Q/=&nH0r_6_~H+{SuMt-@Vw^hOa.z{h,#$rvv! M=8Ț؟NoRyJ{A?caI2gAQYue;lM*]%sתS}c+PU_5h79<3kBp6unfw*g#Ǩ^4W!.WpzW Rp Rp-;סj Gc~f7e/@4PBt#{Of ٲVt*8,= *XSp Xf\b9ס"kFkc֔Q[k~VPp/D~ۛ V-W]Pz#ŵFqŻ)'6)8ȱSFw(8񞂃E 6rlܢ`*(8بUyjlyPF 6Lq#iK.PHVs-)N7P)^BIPg(ny@q'esQ')SYWRQP?#N]uc)Nm4A>'D(D4B( D߂(VR0(~:)=XRӒd,HW*J}PkF B#632imPBF(4mx$ %-Xgr _vКIA(B{R"B-u*m9g9G?hr |KFl *>JZTr OZ)u;H($?5)RQjW"!'B}\)dJ@D$N$H}MQƖ*=bʴm)(;(KG4m">ZirВ%%#E'жEz̕Y+{FqI rS%JaIiJ Ѳ"LTb!7 ϸ#A\߉Ty!e&hH+f$7J{g0L(o̐eiDS捬D=KP,C&R|/(2y=br=RkXQ\4D#Hz2fZ̨eɴ$͛ӪEt\D)Ԓ-K'cr6Pϑ:$엲xREeP %eh:iY4CyJ?T'rfyh4x8cH7wu|fE!Ғx@Riwu% ǔqt FVZc\M%EM~rsZ#4ajE6H]It-QPr'~d;Q8!uQVhBkᎂ)/3c."-͇Iq4'qQؒ'@6&RD*&B2 t05„D,C(|ښ!h -:6m$&`tB┰-1o2P*W%}1%J[Z-p*!%Fu$H [/=* Bq"'$F?BJJi1%Fh\H?-B_#ĩq`/JB|(tBSc4 P<&N 7;t"%R1nJ 94tΖєBɤRd$$&͒mM#Т8%%CI1 B SM S!IRt,.FНƁ"eF$qdM #b81! H#JbIHR&%i4 Hu(AiDhX4 0& B&Sk05:,O$Cqq ޜRtRFĪ%S "*h2$ͤ w4h\^ e,mI)t 2As! ΄H~1әX(#D,"Hi0mx< A^(- KHFO(J aC9,b1ёh,30MEX" $&AшH$$*Dh,tK4.JWDiHI3r s(&%([$*%ciS(i׫ {eg]l;̪yGN5W61s3745j~^MRsPsXsD'?%5&,gƠߨHǝB p@:0 UD `A7=g>3P@5AHR$TRJ.?ORj 7 p~6m۴mMC6144Ӱ:hMM;yS+o0G1Ԏ6аN> endobj 15 0 obj <> stream x]n0E .E qJCcǀi:Y]$޹L ta㐜RtaIbN{wnsØX1-qݥ4]iZgX.nttߒƳy96ōɒ1;:oT}XcHq[tSs9ߎg1ݮIVƔjChM`Q p,|.'pEށkƔ'od&_ސ5w:+mGLGԴ*p􇳥ҿF}ELz h./t_ZX_п K8п%DD|u/Kw._c3s|5r '7&݆v{jsݼ-J{]=ﻛYx endstream endobj 16 0 obj <> endobj 17 0 obj <> stream x|}\[9޼AKHn /Ix-[(VBPJӮ8eZtVUnv:6t}۷tԹM9^(Tn˹9ysssHhԇhb;)LOA!һ3ŸZS. ?20d:΋!ҁx_|ߌv~<ɛrg)}/".YhWCMC]#B«fC꿩UC!j$؎"Թ|#?Ǡ %|` 6r2BJHTkPV#3lv@(;(2*l;az݌Ԋ\h;A1TƿBTc hc/Zu32=W_c#݁QKԋArt'vRe/Jt:o<~b7Y}pOV@5؀p5A])tѩNehDQÜ2ÿ`aNt#g#Ԉ+G2"AKP} ݎ~x)[ΝDXZsWv$< =Gc3[eߜ}iQ$܃nD@ 6ķŧgatӂV{Зauɋ8_orkfOg_@֍h ]kt9LkV#3QXG @$qv%es-sy=gc9`ikHpz![?;mF|eҘG_p^;JmP1* \V,NsG7؈k762~y-{M6~Ü&Q|;{6X]*ԃ}a'4WK*6/.| ޏ{K fdFXV6gr?~--q>w"7 K@N~e7\7'Zς׾.ƀ[p>nk#X_x_G񛌎`rC̗1N?cg,Q悫M=*|Iѣx@ÙvV=͟XGgh9_<\ ӆV@h"\У,xOߢ:^˾N.֔ o= ߁Q|??ÿ/WzϤ0L)SŴ0˙5z1#^v.){`_2b̲`Vv^g?g}tÁ,qw'&;wmc)WrEbbIE"t!d? ڀs_D6@Dw@,m y}M<8ۖ#(Հ=18&t9e". Ṇۘހ[ "dƯol?`~'89Y%dz(Q1ý^bjMl1 Wβh-:ԅ_J0y[aV:AǙ37ehiЛ2V2UGrCl? L]7\;q3-O#}V3x3ja[ę@;;Kl V?^` vHuL=ꗽXƙf/^t ᷘ,л0)Yrh>ё+ ΎBy or{* ^%8 gΏ=QLAh_Zv:KEv[5›M9Ƭ C>-5%YըTJ\Ʊ Fŭe[}k[W(!mQPD_L)eEH)Sb_JV+QM:G)N/PX֌>e;'Z f_BI1:`"@Qu86c 0 Rj@h5im!DY[/v]gkb*)^kOYIJ4QysTAd5FxtgCgn.2Gmv˸)͝ى ?O:ZȽ xXƶl2D ,E\J0[Q:8m+#k"֏[&WPV+?j6]ޖihbTg.))>Ky\$jB7G!JND"J(˃$VXH5Do5 èhU5o<tV~]fN0r]D@spP4!Azڮ()c޴x@}hm' -[,Ī7ubG=I$:VsfG (}pG$]zj`mLOo밶ɷNlt۶aQK쯞hjs'kd$1Xm2VIbFkK`A`δm41oeV~ o,'i:gXԍw"qm cp\pQG\cT$gQ{L\>)WнW7Sw:Y-6ƈ>328+S >rHyCW%<<>< o^O%s_7l\-sXC.c )rs810Zu4Iq4c7䰅0dJBtﵟֽw5̜K1ds P7X*PjenUWV]y*3 }7]iu 폚=7f(]7xCǯlog_n!OvA {&42 ux#{ꪄ'=qYq{cLf3F?v̤R !7&cE<"!g\ft)D5p:ŞQbpBU-2;NIi}5z6 ;ZmMu%&s\ =_ieNp>2+T&m :%ҡ\b TEj JJՊ+W6nݟ:=f.Wr) JR%3"Jϣ LsFhL(d|mެgYp̍v_Gv_h6xx;#G΁vO锚n4kM ()n $R;bP''4(ZAj'"vHb OJ޼WVU/Gq_-_[7]͑_?qk_a\K:V.-J.xesQ3?XgSIKt  ĥ +geZ=H[hҡd@r[n س ͅI 9=gZGڿ|կ{\pʦS*_צMvbUVBF|n#'5}Z]_QQӎjdz.8|dsYܵr-[<b&ܥբ,CY:/[[1--<\jXcorIp -jYƴ,=/!F%e,w1KW|ݏ`AgPi% `XbbDqB8.Q]Y)BJ6491ӝer'ϧ{&_(MH΋ $_8Lυ\,"@A>{ )Q#rܡVX }χ^E*X]^Ѯkg|^2iW&t7|g o\YY9{<Dwf&={vv!ݜlq{@GѤȟI]U:޵9A}mG%!C+-E[nw>~̑XFҶA3ExF 9W-hI_ 5-viV T '_jg1&NO7vZ_ҹr};cE~^n.qػ4^ Q8q ,]i&OfAփGĬz1mP&;*O1Q18P ʁxrɁ=V E2ݵɠ dД+S3*Iu>n] }8c!9%Y:7s=3+R?BC⑯-ZyiT9@)O ܍ٹ#MR PH;8Zom׬^yVi)w=8JJVrrm;R>n em<в_njs8xAh)Z[Ky(hךYM9mz<՜Mm\7vgm$sUIzKfBcݓҷ gyŊּL)U[V|[QB٨ cU(l&[{%` !UIxt'dɃ.k`Bbt3`,=3 i8jKxNj^3W'uHtCt`H'WRؐVv@hPDA W`Lo9޶߽k~Y0^\wжkŎ[jm)먻o ,a+K?;0,%vOEϵ/ptR9 6UoWLk7=̌"Mzo{t5eq!υ!Ye"O͗$Z`R܀-ð% gPBWȌGL!1'/9@`obgI *k퇳&2ɠG/OEPŒ7LqM)܂]?GMnY]R!]ӎϟvM;ީ#>_w~u,ytISijlT iuuבQ^+dRZz+wJ2 ),؍r'43R-z [e3>XdYmե9+fFGg_25*Ȝ)yZfa~"׏;͟nݖwJ*kSso(w2 RIB),HW<!ij9 L]M.96'>ԠN.z 2kaWT*?Tݓ0 ɬE툥0HGqI88z K8mtgK0Fps uP>+rT# "`%3$Xn`$8Av9 ND!y V~[JU}[h.4ݽK0FI yf fQur1N !urT(#I V@%XRS V N`&F8[Knn ְH93 ֵ2!rG$ty )$ |V!UľY%k`7`qX}3%].`l}sj$웳E9`u}H07/UER8a`ЉC7i-!#La5p̡2^suA©!/1~?+N'V_LL§AOI~L ΡSLOSLK0y*)ꭈH0Qd]Jyt]_I0S)}iBaj5 v)݂6q4|yQ/<& h(D$*5C+0{<`0 P {CNzht& PP(F^c@N~4Dq< 1JMѵr:kx~Djxø?}Ӓַ&U\m߷3XXF:]xhu#˃d|IC~ʣwADP1>lu4,I:<#ffC^">F0N/š#7BiU4+ 4whB}bL\]ѯ~)aX5.\ݣT"QvqεwA^Y kR~)Y̑T+ H^7H I.L-?(~$d$SAKs]`)@ Pƥ\+r=[.1gJ1>:ø.*jh`nJC<_Q4 /'|4/}D=RS?d Nτb&RFfR46%_ %jZ܏?x:o/K>^S5 0 w2 zj_(B1F$MǭkBd^qV}3Y_;'# Fx;_}/ sh+8 /Dw?<@0%|G; !88\_Cjo7]a Ȝ]pdYa}aXx; 0ؠwG1oþ>' v qaG1 P K{|0? p/tA K 3~N0BсA  ;}H*@# T3I,?!Dss>b0]7 Ka|^4G{#@4&#B#Ȩڀw8;E5G@i{!/no ?@ Ȃ=?2hAL%84R_!GâT!w"@#(zh_wT\"!AJ"o/:#ұ1琤H'N`d(P:!y]:! tO9p H\fe+7\sfzese|m$hh @ctU~X2hxp @tY4D#CgށG`ؠxA`E6E#Z.ڎ|Ώ#DB~p` bJѹ% JU1?`/)" G;)s5IˇG|~p-c}}~!?t撋 S:መQdp hO$/QC ?jdT≨>V_XBHva: M/4, $MÃQ֐o6^>K NX$tk`Dy%?-y~@/#%;aS)TU%e2jc =WʊM? F*ģqHI_y?ik7TcSo_Ӎiq h{'؇)${]D{ҥJ^*]ztҥJ^*]ztҥJ^*]ztҥJ^*]zK%o{S/%Ha_f~̅j?H߂A+9>y /hj^_jۮqY1w?y,Fs}EmҷMyIѮEAqSg10ͻ~' }I6OTۚ[}'n3S.!IɂBؑewkLe@G>P @|r2HG&$ZJ\/7&1'!QSNۍqJcO֚ ұWA)2ġp(}pfN`r;Uy/We̖'(30"10A<~3̱rI)P bmu6OIHIPK+̱Z aLڗd?C.TD'̂mun7lNw4fJ&]Kp.[wKMֹ?Z?(/])NJ4r1EBZԕ0\wm;VqKg{\r[[ Bĭ-u=d;e{lveVײ60|Vmd ٔHЙDx.3h.sê{a_!U ߅dM'9iwBw`Ohw4ᶵǕyXF$Xx g/DGW4M6 vQ9PKƵSr55RWIcI#w&]ZukX`.acghV-](?Rh8%`h.%nofnmrf["~4A EkTAᰃs8FExODQRAaŁA{ΰ;'o qGh%rSN5 endstream endobj 18 0 obj 12288 endobj 19 0 obj <> endobj 20 0 obj <> stream x]n <bj$:ERp$ ·/\msh؛E JK ˼ZQiT*nb an\Fw{#JJtQnWc`('eI% μt0tm{o\74:Yb:#KI@$~K9s|DΐCyCy,9=ȧIWu MrZ ~fP~&p}_ endstream endobj 21 0 obj <> endobj 22 0 obj <> stream x xŵ8>s%KdJkɶdY~ȱ8ā [Mph-R(2*PZzh%i (چgf׎½}23gfΜ9sΙsfv-gxp$ h/bؾs֭D.8BMg/nFHBʕzF;/ +qbsf~ 4tAÖQ5BbP1|O]MPkoۿKc;.X>"@m=FCgPB}x3'PB ÇT:**F&3g'Gy=*Д~=ޚ]=r;f/;Φ2$>B7P â:6!v"bpjr %֡l$Ԅh5z!T2@7E } +Fq7zFߏEsz4nAcB s!t5z ft PiBg޹Gx3>o.BRt+ =NkB9׊V48gݏJh..VϽDunHAEEw#w؉dB1]JXcx>ĚՔv4$S`n7b~tz=vlZW :i }$CO^M|Fq6Ɨ2™FAX4VsQbcb.e#يJA*@/A_\ʎ+FQbz}X ؆y\K`e{$=&v+{HyWla t%zE@B8 FFad%n_71GsٛfŃ*>VZ?q:ӂ:n|A,vcPZW-_~O8c(3f!}ASVm&csṢsߜ{unj!,Հum@7?~~ vw~N@aX 8cg\Xݹxޅ=Y{| b0˙wY+UE-/*FyP u@w̼6fgoclQ{.V;|N d$MC(G?}>Q~mI4f1Tb |$A35`-8>{+V܁&D*f9iy>ļ'˱fu6v?`bZTT)V*+SVRJEٮVy*g233~ O8@[ I.>s9BZڽ E]zIC?q%2ŕf1j` ]/}Q~i=~yY y݆8.:kQGz?ͭ":STNRУxsLܟ`_^e Qt/zk^Ŭ~σ#=SE&ѣl mVGgUWSLA=: Q:^?c?HEokG;^fG_G50%q (@ݰ~{…x338|8wmfe^)^NJ4`>U_g;$'BiNʇ?P\U.]{h$D ,A[ݓ X 1ifD58 ] 2 *`?}b0G?@q>o5@ZBwCK؄KaٛNOCo瘣|e׎F2̰5è~XZT˾@]aZ6L()_ ʝ];WtOT& ٗ AvϮ@ec&wDQX^liYiIq ? rL㽞twHRl2:FR*X:O[reԅ6hh[КࡩLJ31E(a Qy$k~o^ |b>@a#> ]|u]ZkaF"NC?naiT"MKZA Եu$ou|͑i&P0) $T5 5&As'_7aCvL氄aڄc *lzq_IuH 4`,o_S_Bl8٘+7%0%OVBV%/.ԑ V_ I۟@giisQZ&t mmhY.w=Y$6e`\ (D pւd1HXydk*%Yo/4i0*NhkZsKI;P8! =MnQ,Ép8 Q׀N Z/`9 jٶ5/}>k'D*7Iumu' 7'V39c?Y*%?D4&̥u-Mooe۰ጚ_'CM!^0Ie!?5 `>fM}@F0eg`ϰAaugՃڿ^oۻU9apZ_:щǮu'kEt|\F1zՈ)HxE:\}W!-NϔN7ΔJ!+Y|d)<;D!^1InpR w\ .W*JdlPA:^Nߩ۩Jgڝs aúgT;<ә _3~p}n-^4Qp3mz=L~AV:# @Z"ngh6yM" 3Ux<͞dlјi3ed2vM$ [>QjDUVOs\r,Z>M+ nfZAT-Z&&E cn]}2.-pƖ%KJ,B0([jjQW\TXdI%FZ}7+(0EY!۳5eeei&}*rLC;Vμds3 &{m;>>ȇ7p[՘FԎZgITTp̬4 ŴX!/[#M SQh;F0[V*N鱞 Ҥ.èl)F ]lf*3<8Uk :# [ ,aMsxPґqLP8 /$d2ЮF ~՘awU` W77ǜ7opjp jh-0$jgcV_]XkV_<ѢU~e^ēei3<+_][ ;eJ@aF(RͽL҆V* 4֮*V3KM`aqC`;m^h3>!= ⷢ]fIT {oO=,ntQ*W!&*mb3\mGmM[56l)K /,,+2&d/d%ٰm?.DF#LD(Pk[%%СenT5Z-*s=I6(++H- %^4Fh-EmFf,]{s°asaedK8|~P00-*rrQDV}%O'*"dj 4UO\[n 0/YRT ap"p! ï>%?rߚ.qYYN۸:x6k˒U7vEo33W;>8T3.p4b27+frhAހ\ _`׋zV? ;MbRĐ 2+JFJIl)VB$ecєɔ6ŕ7($3v-wqrD RD'1Gڭlw2;s>Կ#ƥx%^>ivǙ}r-)Ϸ陙Y~Dy|~A<imy֖; i4Z 9_sUVY`f1YUX4囈$AMͦ#(cnqkn>9B4 T.CA ("jb#>!թT;# T>$ $mBD3 F-2A-E#L07_oν*%t5CFlW Q2b*%iŢ5e̺ jf?~_rž%MWt;s4":FBi/[Y͛7g -#p F#T[e;Gm>Yy/__Q7f~9CQ H<OFp9UAiTXCCp $|LP:vbVQj-vefN|k3\]9;.;xS`wuZ| ǿRz)c6|l3f"Db铱 x0 c mTm{6]|6XZ5eAܔkf^__qK㻆Jf.t_rfhWq\ ص7(f+ȢKFWH+#ԫSV;VortjnBwG4"5[q7 =bqҧ &bxRحvfG"pnv87)/z"VQ蒢YEOGMp2ƧkF4 FLF[͝{5?Fkܚ~ kjX1 Ŝ貕L-%eb^gN!SN1Ώ)9כͭUԘ^8PT[>UP0Hi-1yN[Lvlwe7eWι;Jn X%MVBZ^zs\I}V'Op2HNN@lO͜<Qvl%,reJ :UA_@, !@`[ʖxn`R2B 8Z pȱ8$P,m"z&QŢ U^t.vUe {fLs{ 6m֍."o^/$'{ukV^Q?Pe&J5 7뗔 n)cCxfeȊfGwCL*SץnTjƫV8:S1*R9W (wכ9a.020R8<ǃD32.LjJqfdf-wC0=.ヘ!(fql|]rbhqVAqL`v4&Òg;9pu夓-%g j$ya%܏V9)v"nsRrf HӣCfΒ^IxVF ;)ԛ+JJ !2g,%%tH]Rcs̽}Oq 斖$B6zwKl3M2Aك(*zZf tr*G:{oZ 83QvRĖJDؐZtZ"thv fCNĹ/-&8/h⠥|#`{DOR}%gC:FM3RqS3 "fp#lf2&l`3+R(C03f pgf֫i5T 8Ox+?< \&h9L7rҕ8w5|*O#W8qY$ Yզ8'8'Z~>GI&w;r 㓢\DaQd1(*+e U*8cQlgýSpP)$t&-LJҨɱV *Q/kx1 XIM:1aBC,װMK#*@9&vQpݑWU Uo.SY%+29&*E ffhl]lK/6;SŬfWhD A\6ΦceȳNr pb5p.$ Ј6_.@*. d >^:h@w&Z ZR&(OP N`2 1UBl!+!a`J e)"{)XJ< .ߘ>9wdzsTY* $ ksƥ 7@P{Q@ Ly%G|!D טfZrQmi"+ ܖcQ ܚtea/*go}>]Eon5>=]%nWsn\{sSH_[ʯ_qaY=f~,kv" EF5fR#Wũ9*% _CWMޏ3 r3OdCmBdV^ sib|)|;6L0bASA@*pA44& SvFUi9"ZBDMJ2%9WQ @F-Xz>"HK$ (4i:=@8 :spY(-Y-<`<_)V $syƂcaۘ?b?k,|:f-<ȼ]GlOdZkZkЃ`EV_ 3 |MAѪ۾d%B,(ƫ޳2 }+䣗?ݳlûi^uLu-ƷU8Sz~Xxu˄lz;ۼ;;u[R=1Ǟ Ěҧq)|Cv})v[ վ =Ma,?; uF w:1CZ#plJMʔ-[ȫR91H+Mp4: FԶ),>>l$VV{^ڃu*ÛmXUP΋GqڳO}7ծte"'GnjCΔ3#߁2r(k!ljrǁQXڇY4{BQY859`O?JO. ea,ݙb sc| DYW`xwmjS']EwΒsfˮݿkw1#uO?}d[+ͩ^6\6+ ˬsWvP*ߠ{sۮseNuZn)l*ڎ4BH,j*/[t`QHC|uW4W^:'3Ht堬hQZ AEDk].Vsii=rmY8 cqX3,|/G Λ3 DEA7=bwFͧGˌFɶd3z}9-BuN.Zà)4)rT*!b:Z[p*~()G"r2s:6νgҜ3iںx->9Z,F~Z:JeOCpZv3RÖ9M]AD/B3@̐4ؚ_P\C)Yy@jj|.1lܬ%"fE~]WXU|cwFWN&f 7|t{7+ξ^?+#ga\fujݱsRnsuzN!7jiV+o QJf2@¿"E3 Vd4939 X>^w=v1] (]MzǢl41'/B?P2!d2cKS^294!x80 {   *d 2|`P\|4?E{ w`U'S܉(&w*|iP[}9$B_JI9x y\!b%RV";>f7v5ŇZ<\0p,f?[7'h/0_Z=0y~izOn1uCb]!+~NMef?bƉD|ZF=<)?׀2.v1gco6~D5ZyFOY5_&jy ohxG =0Aa%J(*5Zq{502j0aXF5 zzrVj:dsaMl&M1X^syXg+CDs#律@8BO:rρ +6mkOg< NOe7sP_2U~Vfn1bA ?ƺk1Νb* rAd|poPJzJތhFe E/<,=={/EQ+\Dc4LYtUμYR9MZ-XF}Ig=@o0n_׊%pMaϺnꨴ\pA $X_#4#Tڙ|-wm1lh;UE\ݢp~GRVky8F^x3W͐[Cn&;;.Ǩ/hS)$ŽrrNd0LJw|'^pVmNE(qPHd(&nSpR}"_mNIi*e:ÖOb!cJf@0*k0;+'Q` ! X|Y8^̈́!zSDt27Yw:Ƅ=#oI#s55L3tw|+K8c)_J 98qJ)YW?޵ᮚeZC~իh,޴Vv|/wǪpԌUۼ߼`a7XeZ.K!cX'כfN@SNH̡lʙasĜ9uɄ.q,Vq^M%>IdAqǖE)j#,JXb#_V~aZ@aT24F Ÿ3 .p`AiF43^(䛭p_ϏeެOyr͕ZfL1nVޒwflYtU fZ@["C|hu~5;u"O[hU533W/+>%fmZ/7-sx$@:cww ]yA"?Q0YtH_Dd;[`GbKbE}eEK|nr{ZAK[L\ .̄`^B@"=^x9n!zZ~2>VAZ5OK-%UCؼrs M, b\JYSno$o*g?.Uk%;`[fcQ5/N3x[?_\ƥ߽ͦpwK8ouqpu@hb3 @p[ވW:}CJaP!@/ k0v0s@n mۊەݪoj8B{P7_ix*~זOVoPN]h9b)IUz[6nYtZc( NaXV"'aS2FeX2 kU?eXa=Լ$ԩ])FC˰ m]lY. RX0XdXldX eXR-ʰXa Jf˰Xɰyz Q=gEyތfM2lBy R72dX\a +]ja )v2@A׍VaЅi kz[(!Di>2 te뮓a>,à_od ~3d>?7-àߌd ~n Ge:"1Y)vk- TP@"xM7Ȱ0GaBN!2May6On ?C-w +P,W+?#vQ94yaz g~"{d\Fa/ſO LbWel G |Rd'0B iXQ &ywS Zz`|@I)Ά43m仒| >("C F@y< Qg!H;qstGkEq Wy;>/\6نVG+G@0=C:~_==^}zl1hM>gSt@iDۡp?+qH7:L@C T^yQ:pHŁKYj;|:ֳHj<_Ev8$6/Ikۨ؎3t?D,Z_B,nJ}юJH;[,aIF2 mijP#.jk'-CIFR[?;/UɊvRϱsaOYs.hh}rIrb{LZ]5ɮRCϔdsTuP KFڥ9(-Bq&Xk-3Y򑣔:bG.6yAߑ Q͏dHV)郬 ~t+ݨk%JhOg˺c$Y xtQYFV:v̫$!"mvSb)}u) =}gj_#ghqr}uPSA%4He;<J'E"M;j't0 yLGrr,!2I{2.3X'd?=C|~*s#0Ğy TJ6 c<Pm9)'D3z '&%p(bQDb<2E?!xa?o}} w=y|mp E 1쾞2įqee m]CYxdž!~m|Vߎ꾞yK?ǓΥCd¼B>}os8糐~覽MgGL>1~~`[G|Gv_o;^~P9ojF~]gg{⻺-oHo`[8_;ضw gG\~cwp m#; -*=۶y}vv m6GNJ,i5}`. 3n⻇]mC|G|{[o#W ]24u(>0<[};|_o#71FCC#=5}0Ne8#mݽm=|!~jGz;⃟B0=o:I'1 ^ lC;8*@}UξD#0z,h;ܼLW6#AC/غ8HoqQ[ii=wKbNQPm{W`jCI?mmp#~Q{,ltkwO(L<Hm}}`KߎQ8(rdH}}ۇ(C;ڶIV10 >B;G%䶞>=6*5vwu /FwڕCdNkxGOt0C[Ɏ#_pxD:d WTmXn-_nu|Պn0:w6 @b`̟e骺a -b~}#dd{N $%t@O;k{@X޶m0'aXW(opHw3ħ킍ǻJ&J =ܷ-.)8P`76ݹȀe`,ba0mζRچËG2: X x{7ȧW΃oc::>?HB.iLt-}94,dbyo8葭=C]d%{$%3%tDT:O/BpvCt4^y2yo6`|g7b^>Ma{-؂ a1YXug,/ h5>Oi^J9 Jvi$/)(s1 /YR\V\f_nFR}HK4rGgbl?wiN/%x32{ $#)ޘO~D_ ї/|A /_}D_ ї/|A /__hL7<@)Ypmz9WS@mh;gӑ|-(_t#6RIX+WII}3=J(|֘Z**5%RXhP}b}w Lj y13/ E؂ 9c7{ռ}4CϠytnRPh)ɴ',sЀnڃ2TCcU:BCbHGQy<u"3Ƥxl̸9P&H J$$1H JF Dqi/KsrL"$xJ*!ǤBK$`s6U?ϳDsPf@, {\^ۀmvBy?{)rS$MɾAbW¾R;dZn Iv/{9eT@#3{<7n7@ MAz66-X@o7 ͏UISIv%,}%ʤOy^10ud\wxٵtk^AjN(PJS3j)b81氼иQc\JTD YR>B$^8Y;Bv!jtRY腠Bt%%h \>@{t hχZ!?QsZ!t$ Q6o CR1|w>r7Xh16q)Ccxcc1n̢$#Y6d%~^-MZZ|[X~ժZZwZKU EG15jx5{Xc7G_;G#"GXѽd c(b ǎ7 /e+~^=K9?O'SzeB5RW}R6ZU*WUWE⃪UAh$S~[!u& ~ x{!?y>C!?a~#3L3?S3Dd&3Yyr p   $} x/S@ y?Dț($@O Pbr1w- $E!GkfȽE½ 8C(RᑊtZ Tہ@vJv t;$s[ޖ\.KUA$܆Ab:PJ 8z¸-"x^H 3ZwzB8Z4 d;<$)Rt`WֈO;i Ks? *eB4L[g34ޝi|7okT6OL4Oc{3xolKy@iߤ-4/~$fƌ1c 4# CFV Ux'X--_1Ez w,(ҒP$oVi3> '/c‡54$CA^*4P(2M(>Jvf@dS Wd緀<~e(<Df $ {0O/ʄ^v2dgJvſ%;O@q{2л eS: -nH6 (}b('+~Ew `ݸ(mBZP6>S+D$H 5䀇aJEL" B\\y3 Ei2dK-'!yg =Hdgdgn2Jg ʔ%"X\2{Rԡ w~T17&'48[6G6nqw`?x{ P_P{:}i0DPw"qx{KtnaI ;xo '_@Шe0ƯxB fY.X6m m-_bNUceYz:*Ip ?Nd"fsJ` 㽐0νnR_fYi~F*uKg8|F-#qsٛd4' 0ܐ!'Lsa]vR4ozw1=ugvU h(`j$1 /BÇpE&HiQRb$Z\Cjk)ҷ CL(Д=(D' ){(Rg. `!^;[wIƧ(Hg2ـ'^?ǗD/V.5q.gbV?ܻSO.[ۻHOⵉ^?|gto"˅hS݆M7rqyV<ҁ3\}R2ځ k\d2Zq-jдU?GDqF5Wrt,9/u?@~7' ButE"U 42Tr^~ /wqlѰ $Y;pa`LmpXECMݵ俭'p asª?Ԣ_7a#;IOSӓ$ 8^N6N5צ^;;%2Coh?#ᡑ!Wj麡: %jaJ?R;*ᅱ9BHC w? endstream endobj 23 0 obj 17981 endobj 24 0 obj <> endobj 25 0 obj <> stream x]n0 yCEBBbm841Q~q6iώ?KTkѫU3zL)Wɘ^kjh-YtcͯM[X4[ V\C< mr?/[/+x_,8ĒQd[57`ϫ``8!ɵSҗ d8pV!/I}rFyO)|$% {=R||sBrEJAZKVtǽD&;<$KC.p)Jψ;D N7fhQols9 endstream endobj 26 0 obj <> endobj 27 0 obj <> stream x| xS̽Wdɲl-+E; 0˶l+ؖdIJ %mC.!i?$Rh&iiiHJڴ%zg^}3gfΜ9s9se mC, dgMQ>tO!$~`lp$Ij'V6dP=Y2_A(љm2@e D`fެvC} Cd|XD7AxEhrX(! B=Sd|,o24 }>G HerR$huWᱲ@_4.rW2_"r =G6~8ʵ0 q}`h -~NiЍw[Vt :ar*T 7ѽh glc&T}ѷ}Xæ "ԍF!tNH>D+_X +]m]`` X b.q+[?$WJn<$2N[:l] V?z|:EE"| ׂ~ kq?- >_į7{2錇bjz| >edelF؛' d~d/Uz~YlW?{u3Ι=3ߏg㏂$M`9:ؓ P oCe/4 ~5M~` ϣD@Fb,*ȆO> [rL d032w33?bxyyyձl38 ?3ʽȝ$I$$wK3)Fpˤ%< fU]Qw2;7&.>7OE\5՘BI. 'EeOZ2RV k?Ů4slCf=5D/!TOfc;A0K,n-.c. =/Ewq_-lExĿBQ&ˤ0{p8+DGAE~\I0ȁ"i)ˤ,K`˘0ko2b-3rY4q1!n`I 'n^86t){+D]Ǧ]\7 7 1)L:w+('|}~ɻR~ } @/W>zfG? Fca j΄O1p癉?KG Yē[]].A _]mMuU ?/ZLw45b6S ID6AV)rT± FΖ>㲜 摶y=1Zlj=? 9LQu^.c'tY779i Sx75;0o6 517Z6 lirTFgc@(UcS16W`\L,ΦD8XDzTcM^n 79{cӺ) jĤ1]ݠ];oҡ_cknX)frt ]珦;MA4w\5A5ke2[zv7! >ي\{@1|1iO!K3ե: hfo>$/.Q5(:ږω b|t9a#T}?k0̊1EcN]%$Sw~@w=L8 gs]Ac-mnb^sx@| ,;D|m˺6zS'&#+ȶّ=N0߇%"9&Ϛե$5Upg ζev;{Dٶu+D(Ŧ2"Ĥt,q2itc\&RKi[bBFp|IS,Z&t߮:}{,0e1mܩMiutE*f垒b8dRgzV3]ʜIRhg7o{WiAZfNn)CW(U|vWT\5Ru+m)5-Z.f Z'_u}}uK9J#3xV 7STKuRF(rSնtKH}pUa:syQ_L.#dJ~RSiJoqW-.} Kj:R9cZ|JMn0 %݂TS3IUu$̥kx=-[h*LԆ)*Dݠ*M6{ʍR"ײR}(eL]˂xARܤX+v /s26(n GzWۥM+Swm3x^TG͢"i&+߸N+ـ*VTglO/(Ϩ+*V*R[qsysEWjgygE_ m SO}2)ӗ1ؓ ǔ`*N1o *ו3StcB3zݒjH%"XR[D083=0ª{ śjtNZބ)wOufeN1 g1{-FWxqjgͧMuuI8; .VW֝x{q -LZv[t4J'KUKWuo cau >!M6=Ir@- 8e%24;/n_+LHie}ɳmMYgt:ځ[lLWn]P$1'}i3KRT|dki)]JcgmYTt[[IM.]*~;m.F[0 #k?s4pڢ<wf:(PѢC3^7I5DU8MOip%zt4w6ͩQ ^JlZ4V=U_]{}eb6VT93%^yT]F /cά8ܿcfeER'%X+t g1+9FMV6o㳬Tc$$K.)IG>IOZFE^DNbK!UHEjXU< Ѹ&@HXA\#lLa wg1D!䱒4e_] 8Ue5L\;t"߭NzZt9ܿk^kt杫z Kg?y83NiN.-IVt7[$،RauLiIffXI4RRN4gtmc=VFj9O3SlR)#M>OvFe>iJ9i2&XrlV]^Pa/-BOѣSUWSCA6v#eVL9.<04YolȪs`Lf*8=L:`/=)5Q "XRfLkSQk/ 9)4wȮmy.x:BfiA5wgRu|žBtEqyӞWVxKp>`zdf2Ka]hT.r8/dO{ g/A}kΨo8؅ܪ;ÕUj2jÍ~IVPTHf步{L{H2Zi18KAg)!$u-tȊA>٬UgOWd2'$y~YK* rV[zBwаbKYI eG3ni7ըBbLiD/&LH8lP^.xMΌ\+ODEr&8F]jP۲no*t+zmgr^~Ce-giej=YvsU^˞^QxHh]+c2i37,+(]($=S358FjUe׫Z(*1|'٩NNISIMQ4+iPT,ajjE, xkYc̩jj;:I%^3aޮ3c3I+*%$ z$.$Bp/-06Ϟy<&/❷-{$Mwsp"' (qn̴(#l(F$mDn9I&%z4IP%V]SdYbY +|ߏ6rZKɳk9Xl۰wu +)J,y;=37yϗV:<ݐk/If-h(ξr&) |?z>\U\\[i#G4!K};*F#usR6hh*[-z胢e؜dtes!yvREH.uӬO"[Ykf}*O7U%)`X$&0 SY_|ҲzRԷ^yuIaw|cK2>އspm OCjPvu"`ϾDYYDkyR11JH;2fʯk˯ԱwU ٚY;k ϴ|+f s;=Y|E-yQ5‚}ûSTy>U1a2ѫ+%ֲ$Xjo_A)w`kSJ7XZ'w;i]YYQQn pXA*Y'(ewʝ)\%!ˬ rF낹-rB[][L3pF;D؀%I5#s~WjW^zebb^]mַ'2d9BaUM*̔$~,6;SqN9ܡ/gסl0<8j ɵ]){VU+벹L UVn9kZX.;ȼ<{Kn$RIOkf^TNjD,"\-nasLMȀ1M3Cf1‰.k4kI|–fg#M+!OeW5d~c <S@ n"irm%⮃8b" y[K#_xvx/xMho@zױr+sR-jn`o|ߓ:izǁ%X`ZMjMiys/iSachR&<} .IZ1`YZ:tϚ1QkJ*w˹[5$ 2*}tb&'s">w>>͙h* 4x*Q2yܵtW#3/qk.)s*r-/f.vf>^7SX~)`k k#<$TPoֻ0<ó 6]aͰ2l&mnyu֚ZVP !scE({J̻,moYd1اГSwXd2U&Sld3hM=lkOp'IO!JL=Cr]/a7s b$)a KrL:پd"t}ZԧzKIӦ&?H6&X;Nw܍\peZnrXx *8xN<ɹ-9O^I=:5tzU>|_GSmϼ9{c$%8W\1\V-.z1/sOV 7wm?zz7ؒ eB=A:OiF~%Ąd ]ԋ 9ٛQA= r(.ʁzk/ZR/2^ C_6V3~sq.Zc~Ewy=)^H P=Ѥ>zn MzhRUY0<",A&KQ,eJVBVJVDX рbk+NpZ朴֝af*ZfQM"̡ğa)&YehXa9JO5oa%yV!o-I>(ߋp7GEC(,~g"̡Ji K`IaZ),#z 0r儎eRY +~S" r" t" V0дN0~mHAY|oNAiao^A׋07O" uAa%" 5QXDCM[(&{s_pӋ0RXy"̡N"2NQPudO?_p ?%PL-(aX©ς=" |(l#6P'(M"̡ |^+g OE _(G"AKYXN?E )LUt{a/vz)aWqDh >y?oȎ;*ЩD('+QBp0g-UQhϛv;?:'1FJ5=a(O3HqfyQʥ !H-< u Oc;Xjo3jpnݠWyԒa"Tsgŏ~]BG$9JD,n2+e?꥔9y5#LӽQ8K}=5.oQ*Saq)}PQ㧴)M⟣!vyp"TW0Le >jwרXϷ͔bńHJ&h ϓO=/0#"o6Hs}-XOOq*gB( 7#z)gۉ| 29#1gL^+tQMfPCAFB;+U6(i'9 m /cv_KAip{JX4N.AiQϋ+W?9x5 1rr&DhuCT~qݰ"Tx,xj>ȾhG{M;V Qj!1Od Ǔ^:wȫ !"AxPb)cu #bh?8KOczh~*10TzͧYB+!(O>-2_:@EZN32n7SMs,/o2#/^=-4zfY%ɝZDoO;DϹs'lмX0&Jyb.2Sۚ~^g$;4/+egid X֨HO3U0bkՈwn/A4fpRp^ OB " Ig}$L=|.b􊚙v^8/),U|rя 1yL\xCƁ/YzOsq'(HKAT_?c) (RNJ<&1a`gh 烣u v~@>Ñ!@˟ cC|Sؿ98:HAWyt80{= ϡ3/~ v[߂]`-o.~ v[߂]`-olmR )wQ} Ԃ(o~HEh% ~y?}f #6a? >AO q^f]v/_OJ? }r?}f˿ i#EdΆϥi*kȁY_@S5wA'ĉ 3?w[w_{(@?FWmq<??\웂ڝOɜŇ%q8 vdJ*y|A<pЕWZ}>r:`N~Se6ɢAkI>Vg ibPz(Pu,ebX߉b_;`?mtQvR{]r~<[P&=G`IC0a߇: }\wQ=*7 %$ RDOpVzL\15 'K!K CUnlO'7LP ԕ%gґ VA07gG _,_Zuu aj`G=.Vs (OUM1ɅU'eR _ɗ^ϰ=Qhυٓv70FM8,?ʬF2<}![% e dYL/3r> endobj 30 0 obj <> stream x]n0 yCE-]%A+q 1]xqI;$(}&ق6<ݜUf\iQYo SQ=f::N+_}Tmۛ_0\ sg_Z7*_WpY,,)}EN fIp+(yq> Ks\(MC EwyK|Boș@;&E>TO+ҏ553顩"ocNU9~wj'xn endstream endobj 31 0 obj <> endobj 32 0 obj <> stream x|s|]߻-llp'ٱm۶8il۶F=~k191צ UTa65J8102@FΎʶ r @3g_Bdr@C'Ug @ h `cps|c23GZhlgg(m#sw;Ք5h a7G x ImS6g rNNv͗ߌo7xZ$J :1+5K['qrUY[n;Ld4C;'6_7W[ДǯL?l3ƂȳaP04$`kI{3ټdA"B ~7?Zn$NG7oJRiι 6^/"s oϼ`].+)Iۈ4  fޥ/{|a{&#ڔJ9y{o|G~8zì8s#%.y*N} #օ&|v\*1%ͬ xk.u+^Exԇy ȫ @JB_[jk8yojѠjo(T"Lry(İI;1mTv0W)ĚN?)|4 ozykW4%;Y,}ThNK'zRn|hFsXZKK |vRL`ϱ@xͫB*W'M/]=ׇ+z]Vqc]ۦ)~'5W΁%kҦVY~XVUǙ(ζ*nOYoJ8`u^[ߛ˴fJnQb4>eoa27d lr)ջlNrz;1rpkp KZ86C!{sqS6ch3 1mM֘g"~R q&K82ZxT7 $`)X)U%'\"ug}*,CiD|b+"髁`IU-õ!s`,ʲw19 '摅sy<]Zbѕ cdμa@hkOf8C}~7Wz 'a~7w pµ6 A"G'9]9nv^JϠ8~Wd–qMB 2m)m-)3ht=Ӆ;"oT2VYakHP E a=8zu5 Tg?MBn,ұ08+23\|a&/hͲk6Zm ,U(S{ XFrxl(zնa/F"<֩ND:d+3)1}™|xvX 2p.e{7D20p_ʭNC-ejW2zѱ>a𽢡h$'WkjI*ng83?njǧ)iÙ!lwƧZeCIOFyZnP]&@/sGgX46^壣_鍕7t'։:5_XWvm3Z+7LvQ ¦FΎ jd0StwIZU)V&oð< Eh?% ]qR3W67&B磸2:دB"(׎t>:_IKS'#oA ܃@Y:>.AeY_ S`[m4-譅*<ԣiY!<~.-d5܁s2a.1y32{u> tVO>}A%*w z?kֵ U^aTv/is$z:zɭ})yhw\8QEI*덙%iĚ + CR8!WX0Z,22ݝ_d|0qRhJ z {[K,1P^(h sXysڮwNWL~F"EJpDW# | .^ =fʥ{I^Hqdx;s[̬?U"$4J2{\, ZBYe:C=hyg>r#܎UJ -<"52m#k!Ҟy+.PU&0x),"4W@+JtA.6Y n-L,x&=U4KXhSqT[C~{k}&qVlfy oئ!H rcc%zҭڐ|䅐L=+wK-c`L^~ ] لUƻ8C/V& M{SJLHfKqmEAu``:MGK3`f\&٘PKv'#yi&&|'x^&*"4F"FG2总|tr U5yQNX>]B''Eޡa_0Xh,cyD5"--v^I.J@\jf-ukaNCA>LΞA0q#ݍ?~jy{b0@H)I@qVqWoq'EC*5D 4 ʝ@%kP..~${Ԥ`/F%trULR>N<a-y<;hb}'̆+ll+눱$ʥsڬ534..cFr w2Xa=:Ac,`|(@ 驩GZbmxIH݉z2Luko~x` چx s%eti?mpˊ<[ER|3Ndo).nQ+RBʹo_4mIamvԕfy7]K3,{$* eo~~^!/?v]CV-\s(H}\|hU .f, `HY.f]9`;!JUIZ%+f 6g:9P#`=s:ѯpWIv&q%- ?W*ןWNo#RrӷȾͬEF0 '8iUOeƞ0G&hٽ>#Z9yTzhY(V{+$fgBPxJWG6aG;WExNOQ9EAm5 pzf4\6*M\waGPy D`r̞vi54>N[s'ԢiM8jVPoC׮_3 G8M0y8WJ<4y8VPJcՐ-WUN?(auGX({3}U,Vf̊$pM,UmFxŠ'-F cmWiE<yWnko֚ٓ GhBS`D3oل9bP䙊z'3#iVL Rz յf']%UR":>DwO3k7m5achl(4#RWIO|9wl ;M;ج/v2 36̞zmm @ɿ-25ۅ%'18K3rNDAӪ^ v7IB͝t Vx6WNe[7hCFeSο%KD} "SmnhwM?I7*Jz.rRMP`]PMB{~eo#žu*.C)Oc%41F %ˎ4hKlq&n {vӘoT`cWD{"Nt`& EbZ"e.iNhm u1<HAt|Nnkq#E?;/Ph O&?UJU 2'Ku{hvFYsw۷ QhGLBv`!~:ā_͛E 2{r1GS\jġ:FA@WN>X⍨QS_^븍D^]E eO8v)_*0y-u;c.xZGc]| myuQoΞQMRwߓ j}ݸAhJϕG!AU$lG0O>seV SgL2%N -:m7nR;zi T89xTOQDN\KI r"YQٜQBIz̜:} pJ<B`)nBЅc}<)g(gb#kׯs,H(RGYKyr"<፩QD#mލxCY* ?gZ/B.Εj?>xku\'U-Q+K{0d=M-GgY" [k"\\2yӝ /CKaU< _!&sѬq@F$D! t9wVa~UHPWvfڜfMZIENI_!Þ>0q4zf)*D42_4rM< Y?5sT=ɟeo#.?]a-"&l.C!2wtKp¡ YhZ}=͔/Rs)/ sLRٗG>:b#$9~ozWŗB@ pl9G(I 8̍A1KڇGYƱ,#H)̹ >v{-M)vc f/znv KÊcÚ`~BqJM0,G[;5Fqzr)(uA!А~7M6he9'+MQ-Yzp3TM*Iٺ |EJn~11燈ZЩYl>=:kQ̫]hZo@?u֛VbϪpTV\GRԘۥ+)SHDە:r\ 0^lA Dr8%x0HVe=50c&'fECFY N!([ Ll)cd58`fi6@n3|%W͏$62>VþǦGPy@:ƎYXbHDJ'#,h=xwuf8IVza͟T]JqL2%IyYSL4~}:׶X<[j37|:'XͶ8-+2^ˊ SA8zIlaElWiQ~%$`B[&Zu2e/R:bvZir?\˱a7wLh*Z~~,|($2J(>" ,i9Δ}(~ i`xFvRi * vwZx~ 1sBIU-`x^oV=Ԙ*6Gg&8 sp$iW#P61Jk1?G)[7/ٻF : Pcǯ-;D=RkgZOgCL3|Ҋ#A}+-R3G Oa&ΣjAKQ R@21ǍH~* WK: ;1*gݶ *sPZs TkJ2ZZJŲ@T:eol/rhbS"e~(#aKkY;} UFUYs&ŸN`GICxrsoF#ɯ1 ""}~ ۘņ,{;f޲UmMT黛D1ˮdl2 3QoX[R3X@O˻DyQceFnXCa ;ʓ]R:24^ZclI^B@/K9^(|K&E4ojG'tţUL .s2fDSX-0S.ŠϜWH0@ug tm'zYr$|N_m瓇[ WǿUpZ -(<7@b´ d# uuWlm͢рgMjdxT$Y ։bJwz%$|[?P4)}?8"2$F skuzRK4yhPRO^W߅:Ŧ}Ԝ"1D-9O$`lC]L|)ao5o$Ȭ?-s LB-gA"%uYzEza]wAϕ-8#O'֩ b+&F?Vv,{q%F_: UٓCl[O-]({Ik'yH%-IsjZNـi.3iGo@H+b+)YdfD,voR4/g!Ƃ|AvSlY86`tG3Qnu:vT9K+;b`oj]e0{T' 2S&+{AKWVa2[K=F~Q\[|B7Cl^*-Cs8'2Bg7W& -_[Hl ̸%Rn A}mAZ6j#qrH9e2UMw!.*@rɛ^KbA٭9]](JFT`;2˄g64"dl/Z0 eS=\,h*go͹ٶpq~w3 .2+ઞHo Ʈ,_}K+ K%{H,hۼU_ܰj9s6*_•#mEU߇l-w/j>Ŷ4FQ XGzǁXa\֪]7֭f k<YPx!Ku6!uPs2L衲~URպ;`(*UN>Nz;>jo[K]*tE>޶Ky#']ј3BHY^Ud8r\mNG:x2YGZc\+ %Aء \YoW([#r>79?kVe_ʭ1'`mEbm_PN)4$QiԿYYTeCZfv%N'H$Q͵^!RBG86 Ƀpz1q!pS& ,GݱDcw H/k:Y6~w1ʄLiaVh$WcςӇNdh}|<J9&8 [N߅}l)qɓٍ6g %RӷwMy++Zm H"H.m(lZsTT<-(l;1j躄P!D#$^D;]'/Du+1 8Şo훟p?%.e*?iqv؍?11/ُ̕$8BgŔa*|"!d%5G5MQjLJ3:)ʟi-RIh{X|DϔI2gQ0׻&ϕ3@2$p&JEVԏ*S߱ pD3Zb| qn'cFRZM Ђ" :6ԧY!ct`w ܴfW0F3?]T(P$%\|\1FIUXӂ}fWp@>KUl6muXz8(qYdeo@)q5FkD f2Ao[ &€.2#G Znc:&.ŐIoC8^/ydY+ L褨菀]o FDZlSG쁇囙QuΔ=Tey[&tx0WvaL#|uwu+eێI{#1*Eц]1W vЄqkU7) X˫+'=Hz0TCCS~mdj o|ڲ OE GYi~~{%Xĥ_`mXm=oGr*H,m{^c6pܢӪ{Uʩ Y'bAme*␎^$"35eрoA?Ѿd}脦(V"Q_TO"Z#)K@D}Fmo pTQ/PG215[@!58Cğ~1v0'z5vȯʮm*$zB45:BDži?1s⬑HU&刘v%hlY mɾy1nQ/G!]-[ =?uksEF e3NxGf { 1;J:-%Cu eplc6}|Qƣ[Cb|:sOo앷&T#o4)kCÒZ/_5TbӍ]=0(s'B`)w?I ䷎!a/Dr!ɽؿp/. % rj8.}+y>5t+1t),sXS,JW\x':ʼ4`sK*#DjsC@ˊ!'2ۅ)Tם5Nh}qJ"R"ҧ2eOe&S}aVi7I]a~8̊I#Mq/- l[bbL.7A!ne?ތ r3uGk:oWL=]*۾=M)/55L*A}m9=[Bv:mJYȟTt~|QL#ywd}|%U>) ;u,K$Ja N,r!l/q0qE 0_jb$:y 8s 7+#J7 hOҒYTEFR[آ^>j[Aށ.~sLxPD~<"su 88Vۇ/hunnV+ɗ vDٽo~RȪ58@}cwp~>Ic{䇽Q0G6Ta zՐq9_}i!vMS m$װ0vD_04 NM,ʤ'1ܣbhv1mxkܵd46M` &&@^;Lj8>2Ph@4Kg5q<w}z_@b Qo?ߢ ]!YDfΤӋ,:_Lf|$/:d>S˼M 5QC*H{h3*Ejn 7pLgŀ SXcqĔt,|e#YhjE'T@ҷƵt;.dNVa%=OԟAY9(ޡ^:Iob?Zįb`qCՓ!u:偣I̳Q %J݃o3#ty9.17QuZHjx>k-*c$⡥׆!h > NXB\ÆqH߯v/2BiS̋ٸUL^=hEb3/--{k9[%l@5)~eR>CLZîa^/nk#͒ۼR16C~7_/RR_XLQuTyzݻ-݁ /_3*gu]RVfZ8HwuOnrq"paKyCM:?6~eޱ8 ld]}j'E6_fSŊNuO0uF4vSBG:1y1AˎG8נԯvPʩV^#3M4xM>d4@R'rQU@RMTؑ 5)De`Ov^IoJ$.  1tt ǩ :Y#937͓0 t̚DžX)<6FIN9ĝ{wxK@Mڗ5 6:!|2c߆ƪ8 DXolyaTDd}m*$'K,dnxK-C(vCP`9YDOtg]m#u$|R'HBMx TXsƦ"=(@V~&|=maJvL[p<,g7os|R[ _T\5La 0`P i|Y%9F'4PQQ2R\a><┋i>{]AРW~,<DZ;'vi;sQoGmC1+흳V`G-+~"Q`Ɯ޹ltUsyyI|*/>ڸ?R :/'a&) !&mfVxP~yeѲ<;ÀhZj6,ĶkW5Xm,-BFdGPP0ɾdlU xiDGLaCN|cof /[/5=Ŋ2(PD |HCI[ws/>!Ky2UaUީ>ZA'Vk8 [9}Z6&tܜH,^X&*&<,H9Xv2N]j:_=(Ua* MʱU7M1 o[2o" nd4_ KtSYkȼG*~0ÿq"Qi7kka@utElؓ|j1m؝Lrm9&)7qxٙ,=khbZypyڮHTZfmфw*<@9 ;7~*Pԭ>ev|"ϳkގg>u=> > ${,p ["U_Q L\s`5}l-J @4dưB$Wo(g.s瘃vQ'i->|+Q B>_wF}CE ێw>;hU&l@SVf( e<89{0IPYK_[kqD̂s[ 2b#ȗ+x??w/N"Yk`#9kJl"_\yH[H̝(Q*;gAg.5|-(-YNCqYJX7 8*!9hSʊlzB g5jhV u5y x{Σv"'BV.6h!X rş\И$`b.ߨؗOW&4A=JY!J}7K=libg C;Rv@#VNWS1gnw ":S3[3@{O7M~mvWsbc@ΦUqS4{Ew%lm-#gsqOՙghX&0Ki e>PiږycY GItE6 "ܬB&&=iYCHԷm!>[=Jv"rHԯ>enb;h-]YB| #sXCmYݜ9F/Q$s1G}&UfEmBK_jꃞgN^gjhD#U O|wȋGW w0p"耓5ZDaaciBEZ3Mibm='eY.] R? }-3 jM! ?ǒíqfU~hw&,k}FC a7qN=l!i߀!SMOlg/txWǁ;3lnVodt_r&nŐd&X-<`!~R"U* ǕEC$Z2u2iYF"Grض`ozdn[Bťcv+X G(U J"GN3^ %^tm]<)],SF+ml6:LB$wUf:sFrE|ɡj1/x.p!+W*t7SpQ2`Gݕ%\qyD R 8D+%ܐU=ODC^"5CZhJk4X\O[>'T#.\JޜdY-c,&PEa?AUԇݭy&5]Ѕ'_L^ov?tIxc蜪4qҶ Brs ٮy竷^CEbywjY˶Wc\ !-!D6!<H*g^rhSLgvjդ@ 2o S0r^֓Sd^E( y $*w/ w;FyDp+7[<;UwiH7p?U&S* 6ha󋄭&jŲ%0|kcIwС74-HJIǣ6T՟&R ʱ,ϒ^s,rf4+GO$wnJ!iVth7J:m=Zs_Z5*1*/}ׯaIۢB1@7ȸ^$DS]~ъdCbvőRims RI?3ic:K^}X5>Z9N8 1l5:o.[DsJ/ ɥ%e;Iߍ\n17C🲯)vrWݽx՘D,dK{@$iPR܃܎-FZ)F7c-Rff]-uuq=&3c"I |, i[DFu<5f ܳϧ{Wt[< @"cy pJ) ㄗL{I90 Œ@ޫ*rD?"L>{aWX+9OXPv (J"`Z5a?x#?k7Q.6(=|Nˉ\""tqQ#kɝk8BJ <_oO !`枚g.8̇$jMNĿ-@cYB9lsd񋝧vJu>˥/PU9nXhΧǾD ix^]cNcSM!~ʚ̅QFt0uH-2Dv.ty5Eg ]>slHQ[toQ2!{ɍ]E%* 33QRa |Ln -Z3c<*_̫7)/~w$,'Ј6Ȱ9MÒa#N贅[6#qlh@( s@9SIDB WA_ aB4`vۅKbŮ<'h\ʪca2'ƔĘAEQPC3n$Qߨ8-9YD~0/$fD/j{rc^/yU3FK(] B#az1Ӥq2Bm/2*feTGYCf0E] o9C+ezn |<% sJTצj(ϼ_7d VX}z^F"Yma఩=̦>z87=rüc`yT3U{l\$;Ac@rG:- l>&Dnk랸IHy VS9>vQqk[yMɋ=1&148Dg%K{Aٜ G]:Q{o)?m{ކBF{ᤒ7sAŖKZsa(?S% (/nϰoӦeDѬ4<1A&PKMϝҺ-k;vəDŽjYe׳ɤ"`-.=x-DpH0_jlUdTXr@$ojG&׫*QǑlŚ_e2$A\S\'Q%)4yPD_*S,;Eh/X8v}*'s=/@"'O\CBޡww%Q$n==xq?Bd?\V8ڦkۯ^>'C2>|֮N5@:ͩ*~ѭ?ZnB YjY4:rsv|cD`‹Gέ-G} ǚ⌖ ?xsd¬)Xqylݯd{]Duq_B7~.H{p,}ċ J/ack* K[/QnV}?oۑgD'>̲{]VSnNNdцxYK"{{W!]-[/sQ5u,3B@N`MlGb_^+>WJK<1$7EL'as.l>298p38< [bc.HNRZ%ϛG9t= Fci cJ>_$O]i[0^/GcUI6;A]w k_G Oޒ4`s|;{¨`RL p(;A$c'YpuF֖ ^m?"LVz~J]Z@8mI"Y o8Uځ&3'7ɉ: ZlL*/ccf絳:H\y^8MGk& G!R+{&y.@XM$ %ƛacT$_P65_o+<SCb)QyUJ5麰x.aˠkT)nz4 !CYgGs:V"D@kO,/$Նɍ;-ՄSFGV&g%+9>Kz}oJ%dtO4 kw8nxH/jO"YՋ]<jy&jB& ١HH@L !8bq?s~ԨD$8eZ~У&~z-5WnH/"r]]\¢37B5ۭɎ`K!7(*I$ AɶɃZ> 4-rE-/;Q`Q6r 8+-a>{)(vّ>(FpsAk(nkIEhԸ2Q+oL[åt>(^lR>+i0i ̶%)60KdJ,ae$4vhr7P(vcAJYϏ/{Prlu$Z9R|)Qh'zf!H7"d)r8{ 3⮅al6k.-??\N{Ũ?Wt+~E{G2ƅ]g}UTR mQ8ԛ\_Xg"gQiQr ³#Tǣa^eqTym1apz â S:U?Ysm OEW.@$V|c7XߺO80&J!aaWa$ܡUjy?SL[)㎸T-.jq^VicPsJ/;㷡Poz7ȗ١'zRTL[˾xLTS) 9@lB3L`-I\ AtorO&NyuUYz}bz\ @u-C H$-k 3R:g\(eF@nK:ydDA5dX״_IՋe7iD]\t0l6v.yX,Nbe3f4A"Lr&3virM{lYy4 7ѫ#|LH}Uhi~ƒy]@%^`zq`J]*"&pf<$7ç庣,2v!~hUyK(~p0vuZפSyS#x,2S`XtpBzPАOM{XX,ʐ؟C|$+[-J67$5ԂT+;rfLyYVѶ:~ˌa;cwbssC2u$UQ?n7VٗV=62Yqt/|wK6}MoxO/塅M, vx Q 1>{-LY>cL[ߤs1_XƤ5(5#ÝOy3]] *~ (7̥?V]#Pә{(6IGW7PhX[,%KUgHMAmUf gM;}.0!‘{E(rDYƑh`Nƭ#E6A{q BE<MQJ@v PV' SyUE?=˟먩u0zA$t/aqALW++di6X$U%C rtQQDCHʉ 6!_n1[jwWVv@n>! t_M*Pv^q }Y {#xTEbiv I naVBEBfB],gH缉98^_S#&Q`Ծ* )˗ebٮt8'! kNU<iT{I)CԍQ_[N杊ӱ97i/R zol;b@H ,X}N _yU؁`)xK!7符jy7F+d _.4^")K_ v#_s ~(ǀP&ШL*Y77)^c[/dYg)Z1hU](XH_Wֳ%<͞2%1&o gojF|jOW'-qCV~ J=Wo&y̾!!Y39 NxJLʿ0 1 &.e_K}3 d \uzl]BX:̸SL|9xSXjm4[}]{.)JdKn=>d-SˆgP7X},H '>ߒxvB˵'̆&`=jՄ{\?(D$ x1Sqe^hFH5!\p'Nc|gNOr≱r0vm\NW:ZJ% zїt{"rZJYaڇl9Ax[oGX +u>Oǿ?nlP#~Kp9f_KHv3+I0n=bAO4R7ȩOd꣜Ң#(eٱt #Դ$&pm.W].Y Hu6^/× ‚hJq"f7cJ!=[Q5ا )`+18C0J)L|:/l2oyS- NT\|fEK=rR`#ɐKyJo,ݧSf"vbKWN-3vx1aH34Λ7~6`;p-ᣝMkC ζ`0*JxQҍ:\x3sp|{>%yP n'f}Fuή\pZT  ̍o#WBj.[iǪ2 ɏ8Jws^ aڷMBV90me,:Ic 僬&=l9Z \)~[c*VPpKzcJPka\lhcgCwW_Rw)!L=?GuI~U-bwMic"]yJ ^m4MH3\+y&ҷۼbs1f!˛(5FTmfn[UGӦE'jkz6*ޅ`KAh\uLMB@$5VܩyEGy:\TEsi'~$ed(8oVQ@lȋj _A2TA sr1<d |G2\YVg+թ6䋏A "gFQ#'g%Ýi=Sb]#ǟBu =р𩬽_b^e\3-;3ך޲JLUDJKEbNs?jfUdž-}!G,JN| bdjWgbz{g5W60l>`Ӕ+(ys[(tM%(ծSH&c@6@\{~V_"*MT-!"oT /gR3zip$%qΝ@0H_HIq6ifpI3D8~d.AOLop3Rz$)-jNHY}H:BMY"*?CE"!mQgl]I խv/ `ҎXjy"cg"jSSh%X6&t^TMK0U-R/ˬ Ts=#Zz|`S:}b %5Sw?hl-`3X޸n- 9?VK;gv6ds[`h4 H+'HogNefOx{)r JINsL"޲׸{ a'lyI y5IDٶk-;ײGW |qEA>0**!!mZsRg5.[睘C`Pݣ6J꠷U׬J@2ϔPG`osվ8¾؟sE0Rc:ψBxJrbb1'Ni־v*%pw:`Rq짹ѣ(Z= .пP5Jp^~ fz)~CP}"5l}%@>g(!ȋWL5Zvy-@P`UI8#(1Y|H5cx$m%cqxL'z#)&^$fy,F!-xud]}}Cmnծ*G)H!@@Jዪ 2,OѣԿܿGh[[,{oAvPzPZD=Y Y\^{Y)clc^F%$rXNQTD[5H)@ҕ!4JrAX\ ɗdIeHK@`*HFR4+[+A'p cLKtl"y"?gL| f4q$WbaId E hhP4DV9f0g)zD_Q 4Ỡ7d!Is~beWێ; JC mL(x z鷨QZ;MI_go<&$bc+RfSXcbbrϜ0.?Gj}:NKb$Te Wd\d-ʢ$%"?4/>Qkџ,b(bhݝ7(=i]ڇ/ 7#+bv  / `>< IO$$s}NJĺ2 Cef4T\|@NW4uZpōyYZNobxB/h_c yz>[ʡsFנ%%E\V1D(aI 9S_J2I/Hȁͅ %ؠ7zLlI_9=B(ܩG}.:鰐#q<#K`94 VT֜o*8MߙԃBf ZY=!LȖNH<(>Li` lR-Qn֕,E_5q\e0}lD܎ B l032X۳FUxwT_i.>{+j+-V: $ۆ{}AҴSбM wZ&4)@|u$ǪekZ`o͂/6#| 9x)(, b]%}ڲa˗SrӃ2bbOUO/ O 2pܛ=I,- EPaw杪wC,KbMO%(< { 0ir`Z# < #}.vpbr}'ijUc.+->Gy'/ ֫7XSyN(NjM;).p2Ly@ [ I]by6gCAX+斱Zomf+!xQ4սY3 ?:X+ D\3Wߙ]D,.)i]^)H3 v&Yea2L#,,I?Ǯ[/C7LZlNo0Up4`~_t2&"#-̈\an]~NVf(ob= (goha|_DKc>%Zl,~Smk܉ tk/&n] s`I~:B(V܉)@y!cP覩&~ѵMrRYl}eu1<IG#!3xe9WI$JzȎ}+>}י.M9s^7R<$NOjm7r׮1 {Py*'>'fd-/~]w 7*پdcM||'U\ܺF.m4;떽RU;/U?"I9D`- z.^Ҽߕ ;$p' ]qR5~m¤Qo*!e*R T3,JRiR|M7u6dw{ ZI %ll[Ӕ| Y{vx„ܝu!jmL_&T+ϫ>C: O(Jt^21,g:Z*04ewx): 3=w 1LP閽?}!.B`z&8t;*W)K%o-7{Hܔ 29 kQS: =3RxxUP;0Ez"Qz@mRw'uGewr3G~G&&3G#hX4wBAB&5"(]9ϐ{0c=^l5Q7㢋VM3"]L5=tH%lq T&:A'q ,ˍ]hyQ6e Os9F8ն<{Dp(LtL?pI,·.`Rα;t\̻*pƮʼi9[ }vuͽ3Hᵕ}ǑFO#n=MixVPhn62&W.VX6fU^qJF"qKe<$ 4$ i, ߑ:GocWc٨❍@OѤ|s7G]Z9\ _V'09|H1@{LJ}/-܏Ǜ5E2e4\g2ِs؜/+ 0/͕zhb]mDT*?̲~?"w ,!L;m3Y;1ӇX<<]q6^j@h }vgki*AkSsX{T+c(' @tRB("1?]_գR Ӂjg\AA C!R~ih_S撬=H+rAӷW(糍 HT\9?"Gsf-Ʈ<=UWߴgUp(^]ȣ [9bW 1-" %e5 @;=k[塓_5ԕw<vopC (mon~p#a/@;-EL5yQݠw@@pK`Y/z?k-8qaQab ͂ɓmZ 3<`ƍz@+w?t~h$a.f-FPobsB<]iz#l=&[FX 9itώj©IvIbmq.ZFԠP;KzNġַ_oW)͝z7蕇08'{Pg+6/y[7jul,UtO~aA;6Ro0Z> ;b!q-6Kv [_ "O\;5Xȳh7('=3e.ŀTмUNUv)XIֈwlZ $ڹT:ag=5u)WO w2"yo x;Q2-F٥79q?hńͧ{8[ɤbr7xiFb/6zK$İ!ƚUɪ0q`d SK'Q2RA̓(\c)5rn]Ry ͍ݳdiR.wJxȝf{8V018ѹV81n{U#'fb# U=[\7eܚni̳AO6a*[kΈof []z@fZ{/2uNSZqm\ep/|]Ujѵg1ҼVkf-v'=5 ge6<ml_2C>Yl ObT3d TOshĴv@>+I͢LJd u0EYq¥'YclwRsBEo2>`,=ſ8ɒP|qHTQ$[{-sϠ6_Xmt  6Q[dRӹ6rE‘pkqNRI.9ڶ 5޹nfn#\q^O19I; [V,ט g?X#Re@=fGaC.4"fXReR58Oaf*_8Ֆ"o$f S̎kk3/x_=g ߇gu[wCR}?i1' ("uObXTX*J12o|Ԋ %OAt?6+ۆ;w ;mE :JOwsVp!Semmb`!>G:y?磉p;7t=!E^Oh@ܕ|d77mז=]W $Feo &ל" c> a|²o?zPց0CDg |eB`gQWpN8T;A2칔riU@µNsC<=Ċxq)}mlGSx(KU/F6/#Cch!քI)8f-JOmeXXq`)DA l겼F6aE~u%cm9.VoR9 3M''="T\z:"ϡe&PgON3~RyH0q\ݩw|QL{$MڰB3-Gϸ[˺ybTC.W.? ᱕a?% HM?:DD?vxida*Sb8v ~\5B{pxfLT۷+Q M[2T(?bl'yH* "!,ZK80C2U0a>J3Ù젦!ʯ Ĺ7vIT S2r})[}H[E~R;^+/CPf\lɂ/[Ub9qE.Rz/`'6[7շsqxm-fb|s(O!*H2>NxqE-?Xyrko|3~,Ғl9Ѹ]mLx8s- J\8zٽhpD.9eY]z)@j_rQ)_PeKD58p`] "NZ&oZxEю*8͔erc2޼{]~{cm28cHJ{Rp8Rs*2<d !PD|iiM0(>8)h':XMk94in̡`IJXCÂBc?H7сQiԒǂ4yHt==퐸l|GIK=Ipi^3~8nDڸ'yH,!횷t.ASA]],a~l<@`ü,S%|W@ l[b01ٟIiVp ,"M f b'؍DWlR̗Դ _48ɱ+skj9)9Io/P`[ihN~Nʏ 9g{MfZd_։+=g۸Y3>Pe׺0}h-qT)GsxJxJ x Q5:[sSsHCTÂyAs jIl{;mYeO;shQ:703@Eb_뭵ְL:ͷBkqDS' 7~˟RKMgT^4^OD8Z?w4RFV\2GS .搗^rotLfcX\! w4yr !@Q@||p {(зFf]ime : R: :ÏV_bw+^’'5Ř8IT8#IX]mD} |RU;҅X *rfL nd7foϦctwP:`hu{峆85/>DXz­V8]?V=<<6.O ˕Jg=8Sv]8*MdG'_6:Q<3DF#G8MvSYR %OT𠭂g<%D/P7PC:`JSo9%U@P  "֥3D? hdQڪT@miŒ} iYq$|h"):Ab_\G Nj;YhkH&\~ܱ͘fek᫽^;@#U씬f놎/HyRx㖯Ga[@dN/Fc`ϭlp߈pʛo3v\X;^#Nj^>UۿC%O,8dQc Og9@ !d޷EYf{2K7b,(3+ć6xuaSu|o՗<} xQJ=J|D֋m\50"\$#h1u`j :ίb;gSexqfH ;.@?Aj`-8^OOBҎ(ȯGlK u>6Yl_A)g{G7;Fn@exy ٱ܄PV|/zonz6'_A [ h@m갳0&?-{[eU֑A#;[WB^Ze>hUY*`- z; اUBH^E9qi WFDbeΥۄx> _W_``:Nxn&QsURf#$u;bgF/p|vda5CkV>3'pRގr 7Fo#pf DH wfu KUt<^HxbY&Q('gٲ}ioyrgk#c\xkvH8+VRTpU{}7=xB^{*0)pS]ZdjG[ jǓtG=F\n8X6X4Ԉ M/tM?AvdfUqS8nxN`c"sK\vΧxG7KV@0 PB󮑇4w'8ɝfuTpkv N`GSGEy(h5N퇠p6e o .؁ rC_?aC;)rRB"ޑG oj[2O2w]c`'Cg^13hwLզ#45Ln'y.PFwro|@PҀ@Hra 05/j8ۏC5:# ^\LN*JF TЃ"ˣ𢡄d" U73cEtZ+W1q\͟ctp]~eV1azqJO v 5ICӁ+&&%GAsۡmQ@)7D}'r-Y렮vb\x>%5ZmO)f&Ql55-6A) ʚz8_, pX?h~HeM$'@oFPMb=$מؾYepKb׊?l)0sՎ}Uڅ._o:/&J*_zoʨt.MdE~~ 9?y 0zǚշ3(ɱYx r4œ&vH|D;dDtp!ϕ${Eݍ(WP8H ~s2o4ǫs(cKw`Y6&]2-,!`J܅׈a YG<̜v=3X}l hQIxLj6n|t7QJ ppր~W-NrC7hChoI6CvkX^'u%b:RTٹ>=,}٘c&WNAb(F^$ {& ɔ6."^ŅGۧ4Q,rRYc{<d&GW $SQĺoq`]ަܢ{$[;|;~|`[m",;؅;Lc}LmuBp^:G*g^ A ky$G.D"+61IG'g_to: X#;l8%~TD㫰m\&f;flڈhk*?(T+CpIU^lpS .ϓЩtIOPBK~,xR] 0Xp7w*zk{QڲDϓ_ۇKQZV^)cSUT]м O-|v}dUxƭ` V:p69> Z۸n =+Itsk AFـMQ!yiz9 j"(*jXȭy}4scysv+y=Y>7]{NJnHgWi[ HN-G9R6m)ROr6:m6`G.,te%z@XL+aΘXA +/F2K{a3y!5ϒo]'A #C+-QtYdh$3e#= "c! Ϲr-_ܠDմ}󔷧gНD%촘0+.fi:{XqǍ%hnl\ξN:1x8*g.6R92nˬEIJz@oln{<;30tt\g>k_8k{YP H%}AnI NA5źV\긁OC~Mz#9b*Z?νLy1-}b?c_ PG^wb(paXbfrKU[]xSf&gMΤ-NĹ"HXlɏLgZJ4XeG'T-0eE̦#oUΧ%P%yObei!xr^7W0 QrO bc9UyxuoFx[1t&$MS!bQCեp #ZSRtÔY9D Db4vnǞw0i`@EpbI<'_"2;$,f <{:f4iIl|Q!y96B5ojEB*'c5c uډmL^/Ķ9hxR7՜%D5jaJ7Ė?GU1gK)|i5p_Q cN.D O;ٓ8B$cec@jC,Xlk_g]*)H4ɒegub\-sxloHDB;K*.cze$ >e UX>6ʊ/f$\SM"z|wr_A\ ͽ3K$:dq$:ǃn%Ȥl/'dxj(d_txڜ^`"FsDWs8_whnaފ۠f;=0!0\ D:f\mz tet%hϧTkE\&NB2BCB AsJ=s ηE5V:S0= :wpS֯KU"s;gW R3krNsJv?xэl,'|_D1TE%کZtԞ@ 0Ρ\# \| ϩ"'29`1Pg82†}}bjݖFN O sA|5H7}\P*keG)H|԰, _34r>9i)MκhCZƕD[ȝ58il[ԉQ^dYh5ZX|J߉Elx1SbYk\y,Grg< n0C_VWiݪ(IBE1QpH4lhY)IDtdcM䃏}o")B0_WZkDBexX,=U8ba1eyP(Ovb,4uZGu͵Lȼ˘05[9Ey+.?nNa:M}Ewֆ7LhKf ) <,dW#; uqaD+K8Ft?UEUߗc3u0,u+3D&hh3!He t~ Gz.?Yo XBجW}!4SQ?8PI۪ Ogftwe#) CpD1qulf W:J*)X餫6\MݜaTP޳Mσ)||APY:dy@G.܄3l[d_uCSN銦R:pt4O轃TG]m7FP|L dq>`,ulhرU$esӟK4օ#=34:nC.gq:J]iEVus ]]IՂ yA ;Eroi*A訲 5X㤔qoOxp0ܰD>E"%OGa~nDp ~`ik?+I8AP \OɯnкiUph \@7/3c+=[cOЂ`áG)P 3*A}IcJXK7H=O1f,ɗl}7,,v CZ-j'wv&{#مo.+ 6hӑ].hF0cOdc~ťEwl9g{2WnL">3uGPfo Ќ\қv%@(4stUbKKèHuPes$n:|=2+DžQd䑌H=剌䇸NW@x&q1$%A6yQZ]Yϸzwl V9!޹! Ȝ6u=F="Yg.8Oufc<#Ǝzws¤Da7N[ k)L^9h}H!iCZn4!8;]N?VO(?R=w)J/4W*~$2lJ#K7|t=|E^ōCq~δ';l):~w<]eݪsHcJu5xgq M[Nvۡ-N5 wqZwmb_0ad-`0*BJx K6Ώ_~\c6'kR]?4ۦQh.0Dmcl B#Q2&C¡T{^ZT|[X\ƒ$#beSH#el0#XmhsRe[&asvc =>F!Ys\H'@O?T+QO"r$%h _&ˈZS! " 6x) .=YYC|V%5Ɯaiu̼ MδM9)KD|ɠ4;Pƙ*,JNmMD$;S ~=n|k4%d.mދ1 :å4sb 14e(+0HNLA5٨iԧ <è4+3a<Ԅލ6R4aD>iR@b 0zUjeԩY3]͓}~TҊ$\T\cXuug/)+7H`,LkidAI`q 8>W~=uɸDO-lq[x$fnb omJ t?5sl`nۭU@o&Dwpi=_ &噊mIsr&d%bҼT"AҸNb.$!f\!*JB,Y.cYbM1 ,>~lEAQw}2ͣ}@p]oӮ[:~#eBo;(n -p5{L=w Im-ZojB<,5}B@ETWjjGYG'mQ27zIgGO%;;<'h k 2AWY=2)iW)γs4(3r0x:k5'b2*~)H mNaOa9FC{:neB+~1RejVAǯ6xpN!@5f -2$͉O:1qa)!ԯ>cu=eǽx[T=RϿpF<۬zBwXq¼|.YwsGpXUlEγ-Z>Y(2Ȋ<:7co͢mc֣$ѦsuLqMXENaDעt+6L=eogFڃ_:*x7!9k}؉Is`YVNJB/f% ۩k{FU#!Ci.'sEƵ2{H"M> -;:f7R^XwpK˔ ['Оj/kk: u$V` X~")ӜNm}P EyBIKX ,8.wCzGgmE x c(ӊЩ{oq`-m-=lHJ#J?([)&4z.*q,FM$$y1H!rUq"[a+(a6iܥ7tkN-sS^x;r/ggZ ^5Ek5j{3{V1٥(.o<p|dR6@ I>o!?!@ld:ݖ.[*<(|.%ԟ :*4iC+\kgpa>ʹN9\ -zw>R]r}C؟ށ-+`3z˒4/o'"(L'K5>̖0 'l}MV/4M ϊkP'w"ȢyJ.hvs*X|2Z&cpP_4/L}n0ihv'tҞs!y`f0[]r;8䀡ԩxN#x`[zjߩ0sIjcԔ!0!gϳՎcGgՄ!ǫPФO^Щ ֦fYdINf{hQM)'x2ːac 5 #nVIլ&@9/EP0e#GbsT'~b$jl PaƂ܈_ʟAS*#l8zv Y1j'"LRp>>Z ԑs8VZ&[/:8A$Rk9x.JYg,ΠuEa5_Lڑ)棑\ $@mu"`B1֘fv&ԠL&*38kVnJONIdƞlBBO^є=Wir^2į:hwv" Yyr5frVZkb?s riet#L`ZEV-~f-Ƀ^uFY73Cާ(5jI )ҕ-qU  G6Vj{PF^]SE|khdD$/m.)`Y}\i=uf>_Of …"w&QWcw<~3\ ۫ѡ` nA谬:8(sl(i #?5B?n;HUȀ@pҭg_ClcΪ!B$JT6r4巜M3di ]W*m5EQzL:Bo2#RDMA(5 2R\aw=|b>p ӓjф"Q0hf6Oȝ '?D 11*Fai$ *_(;xU&{y8j TNb6ٍͽ+#Bf..JBɺ-M8fh kԍw[DmI4Bs󀲓?la5,| g. ް!tU \e(} /oҧ[R:=]f {5Z[ߨhȓMWb(_&51 zO=@üܩ^ -SX hܢ "`3̑M{W)<# #b֚V~üy!c.i #Uߏ3[z{/ᖣ|NC5 $&,+)6j=/0Yf6Isw?Z g"*ǒM絖ji ,u]N' FJ%$Z+XȹJ,U C%3tHKA+ߦ`wاvx(ϐE ..^٪jLk HĦuԙڏ ӟYmAjhϲ0N6tH3]y.>*ڥlRr״N *BfX ajѓ%PI Z4, Tc!zuȊ}U@WIt~ GPj]8tb#-Ϣ:lK?yf#CZNžA| .\jkQ|r~\/1t\ee}.5՝\Rz\: e]*y|cZAޱ@\|TaRm``[1ZEipBudyVEZ)D+Rq1,x8Hė#6D  ` }NJ B`-E7rlx)$|0QHMmw˨k`騜[|u;5ư7O!*a>*y}3^]Dln'LkfɅ>Qscñk8#zw[ TlufVTGj}Xkꥑ@g>wr܍'`mP=`(O;CJPdZ"W)ibe]gwX(d#X/\%"Y)D?fv?3Qh|p.1eU;`xε!$pQ bmtE&n"nc*)x+k:9:z7c~~jK3ot_VUd |^ W/OM?繁G @G<> $}'E 4nc~, 1+ut@IÀHs1͞g{ VtŮ$ Z*%׍Y >FF}jsH$YC_9cSQ;vuV#8W{nR@.&bzxA-7lؔ107ط#\ďm<[cPP#O' K2֝: }= $`st\,YoGxȺE+ll(/Z5 MGQZQCL*'. ۔΁!w& IG& BwoU#@X\oGt=)NUi_R(VF5gV ةp:bB{(n̰gz*raM?7N%Iq|!ꍫfa _<8BԠO·FcG,QaA%MB(VGm~u=vLqCE1D^RK #-Oۭ 1Yy߯\Z0D -}+ riQӕ=<} 2ȡ_mK #OB㲂Ǣs*X S \6Wis8尡!q(&CRB_{+44ݧÅж˜떏. #:̋Qiϵ+e|tpTe;&ƒֿA?,D -ԡ`\c@ʤ]P>^ `S hEdp&ho?'Q{#bsg`e7=:+ߏ>\ۇ?v|=m8k0X~wkw!čj f&')g Kt"$8<1B똶X75EcQ2S NC.?_t[#Ph9(\*"vZgےUQ b30\zl!`^UAkM˝i)=Dd!3Xh|ڙĒoz+`E xj|?q RUooKbQCRC VT3}9fg-jlm >c,R  x> |3315D12"=\H)ǧh>Wfs̑HZ -߁+/ʨǺnJrƑ}6}sDA򅨏(<1mai^tHǣTU{Ϭ 'NᛤԤETLd>MzObM^iB;:*sUx0Q+LuXyxX+'$ LTu'rt5RXR ?XQ2p:,kH2AJVČzlskoy tSD^0gK¶(ИpTJ# ݵBqtD|@G|VAgMq\;OLvSH(D;lCg 'H-d:j ]"Mذe]ҷH1O[stT|w;Ƈɣ.F3ӂ(ky + xF&Elw֮9dTBer]=I$αH9aJK.W̙JhDٲv9.a*m4sy!9\E׫f>9\ '} zJYF?lg+5?4KzK ?`afuqp{|39As'K""C_4-l ]SwCiburneP5^ LR%fx,WNL1yVb,%A<͏ZǙ RWoB_:Κ֎+V1}ljd$ZS}8@Fxy8"~XC -bsF S9&[x_~Und(Z4Rۊ$:޵m7j,jF/9q؞ŋFXi$Y}Qxөs;b64a[3⡧FY)ae`{Hj&1GVf^#Kz,>siqChЍDp5}$t70H2-S3adV|LŪ9LyBOVa-wĜ姿YW!C:Y;pם? hV@PMճƺq{h.8x( C{{'̮^~CGC[bDдO-Qc5ƧE$jv`(F2))3ip~܀ bn #٠m2rƫƪ5>9UZJǂGz+A'vڭ9j=cu-QqWc֒ # ٽKWNP]YC7} ڡd&%v‚\f.:afBj6UbN -OsAax,+Of4.n TfN,-2L4m$,6< =jg*TiJ_4sxS[]Wje, -}~x p OXX zzSJq Y$ާwRص`ض8L)V:|v Ni.7o V i C>qm!BxGEΔeE]+,`3&rF tsO@$-I¿5j6)c!`5E,4&%Y6#E@6XnJ ܈Dm.=$kH‚7q;"{N`!'t< c;9N9ܳ:KXE 8!1N2pu-YNƋulV !b> HWϲp w )taJY-3wl">.m’z8U^x"HQ5.xOw!1`[wrdjnMA!I;Ɵ|@u 5'rpj|NE[J{(@" r NVorm6)ZKl .B9hJWmmwSvaf&Q9.n DaB|,VEƂz5w?~& pO Yu2d~Ʀ$> 0 P"0ۼ܌eK E{`ɫlUrbו\^hB>o x Ҭ!3ї4M\*7Շ\" %\6 3QpCRھvem_GZOkVSc[nyq_$NG(hye+Y; u崅S59IY^ ٢2vU2%Z(_@y%]yL0V)ʶ!NH"K͌3~Ր6Ekil6oy^a;bB\ r}p6]ҋ{6^3H"-Ff*'u]͙иDj:rѯ2,^_paDۨdz$:,첑 &mC 7j_x.s=[>eWML0_=h񷖪,4+Z9ZyB7 E."{/;vUW$G6&S(#7"̓?2DZlr7u,{)=խAFa"Nsi@j9̨F^P)} G #At"c-o}%E~jO{!FL;;VQ(lB#-.N*d)4)S!bgZdb 5*n;0ݍ}L"orEX @]:ʖmfVN@1Jk]h]U[{d"|7ڊ hi1uNuV.Vks"!mc3 3wEB- o2 }g|oY`)3B&Ir;"$?Ɵ4XԚi[V!v7Eb7/I“z+ CD.L\:T9jJ xnY6O >Kײ T;ͮ׌ [9€aETi 3K H=I"0"ܐo^9I: I鄯zX(v, l{O퍩m2&<1dmYAkS:]V4>SӃ}YdB#d Q\ XVfNlt٢y'W]uDEw=;a3&#{;ٴ9fl)R,X:sm~P)'׽)Au]9+&%A?MܪDR| 1!ѥ.aq"0523|O}0<QΗCKà=%\e\kLSșZG~yuz\ Sb`#SaFdwqO@Hz4g)F{ƻya@ciەjSx3YPUXJm+DA ln|woߎkrt{ Ň\V%8f!Z/|`|WFд(sV WU- ~5`+.Ţ1n $_/$_˰LYkF5+>*#(1Y gm87.3}%IЛL>1剨EeJ (-95ݭ}h=6jCz<SĎabu=9K^MV$stpNQ'ޙB (W9{!G.+雫0HUUISQ;a%zAp!@asJJ%7걩Ce@ 1qZh [0Rrfڠ[g "rD1d?I=_j >(ѴF"ܚl*"o%F6 "GŒhg+ٷ Hp @7vK %ۏi Q^&chty )]5'uf,P/?0dMBFZK!W0265Ș eyyq1+Y!co H;4Bռi~Ѩ_;2jyeo!/UX [_+~>q©|pLN.< HJ/NX☡ޭCޓ_Q`*vJx\a.ֲ5,S cXaV<^̳-{$ yQ{sɁv ;^{Q:)L[q+ ?jrv *E9_;O}R _Q(φڑ1%%Gt=2|.̗wN5mW*Wa10娲Qwlʴ7M*L\}6V @6p-7L~` z5HV-nZs} ʋ,,ײ,D+g3${ 6quh(:7C1O (F~<ŷ|qLw-IWě%k=LL*RH=nE>Ov}?Qk{|]1+Z3'w J% ~bGڥi𐍏 8;w v6+5y_BnQZm򰉂^+Hq1;MN\"d)2e`y\Θgta:.3<~܌3&~7hΕWaS vFi%.a^L;y=Y!8lE-ҩicF<˫W}(Xt$̕vy6`q}~*HTpAKT ߼K%L]^%{k{T|yM-QB$|01D7/ݺ JX~FM ![?мzz Acq rj!sɚ fʮ@[jϢSH4|"/yΰ$~C'*ȘSlLQO?&}t qp!\^ \l3{}Vr޾e6u36&"*NVMde}\{.$&Gk ( EZ_JZJfW UyhK/ǩJYQ,v6NGV:Y\u:i/l.Ff԰`rLy1>? >_ nߏ7[P# #F$"wTo7vyp4,tP>0ѿ# g~;X/eb<ߠeۖVjNO\4"Hwj_P|,fUv`;-!Y *Nbl5#rO -eyBo>U輦|T0 'kE2:U!^]9181NƦ~7F4BJteE pDv--c좓'OQ{ ?.l1?<ܳ Dӵ@6Da **oӀ*ϬZ@ ?HV)NQðG"D&jKձ/)SP=a2gW72Ai^P~AM 4z,yJC\#̲D){L0>q* gS؎Fu5քV_WН,:&m0z<pERT]oFR #lsFd@"~ط}kl;'9 Erj ; 6E6ʦ.NG`1bm)Bc=nQ37*7;ap#+dphy\nU2%`?j+v0b tiL5]mC0BIEg3UASk@Bh>0vwc ƈAh<{P B&t7QX%W*v0'E!w&pږăuq{G퇝娦ZpR2cmƂXW ݙLFz~6ubS⒰[E+ly1'S 0G:Ll#r9K#M0d';L36'37u"! YFʫF߈oDZeAK36u*0N{|])ڀzp\dYOh7[L; 9|ߦ |5%JX5.r/Z !σ@+6G4oaT0$;_ jGAu&u.=46]hzs>BUP.;kAx~n1=a$HB؛Rsr׏G7m;.%m55_/`|C;ܠ_zicq] n;ߢh(ad`| > 8Xw([Wo*cWZw-P0 CWAᣨhGSBÞC8ԭa%yHQqZL `ࠔLsJY:NX9Y #ECǭ3C.&@?>[=KfJJ$>V}e4vGǻ$⼏⹒O <?a"n;t: MUrAwF6ꆛ|ޱE CPb6rK٥ໍfځ6"0q`oQ$ȱ3ȎRzP8m`kŬ߉zAv IEx piEcaQ"e$&9Z5톅cˊ}&3MZګ%@԰0M-,_!b(w_b% ;<clT3KbF JUuL3s% ˏ6zf3 ȄVXmARtnJಋ&@C4@OK[!C~?=W~h>#dP ?kh2?M|_A&g&Gfs3;[k :^8AszA/" [J,6 BcULa%'ʈO-}}k7t 7EW hMocM<ʂo D&޽ysSj?nbAtz'Q)?A+? €֐j{->6vvٌЧۈ ijhN쩦5p d}`2?vUcJ=YVNI^D̤^0Gm wv ' 6)'=S*`m оf< njCϲN_wSܢDYYO; lݖanT֛O%7kz)qixStJj`Rs0}ST#ѿI)v5>!ZCjo޼P]le֝ WߎV2tTsoHt>aΌ\X)Rf&9(??K0 C]p>-@c +x(grxeUvH3`YhH$ )+zh09t5,v[uA?@zH怂ҏF%S7\46ttcȵy,˘ռ\^v=1'KH&"xŖ|hN\%LH7q%!aR'GBD̓ HrV¿f H-hb﫵B'@ nWL},tBQ55ɮ %Jf#ՠS󑜕2fθ"?o%?10̓Ly$F'i?3l;p:_;WbYs4iJJ Rǒ>B]oVaϟL`KkŖm Z[RBJO-DZLqח0LW;\#ojB1t0Q3Wr`J-I,OX@Wa\YGSCczFмOWc^4O:UD1]ff2LWz qcNcJ~CRi a4=nx8:P仦nE@eg9c*pued~nE\5c/P5e)40_2<(XW>ç!ڍS7kR|u1V6g0Yzqbo,}XeK`o>K`wc-XpO#EC%膧W Xfve*WΕs,E42Cgk;"鳃< w= ag` Y&L8[ ygAw1MbkD] t-2FemId#oat 1W\b Nnm9&zchQY"*ЧmVtɉvچZ1]ܺf:mA8c}nV!W;@>I|UPY&8O;% ֮̌FNOU}v.7WʹeAJGɕ~h9`G< K | ʍ܆ ny흧C_})6 Nl\*n8E{hbyX ˝z9oB]_jc aշ)D2O> V!qBW[s^w mfx51%лDzµl9(H̚*_,1hg6t1Uo^_k"I63i +J)D9ȫS(d,zB^ҁ*٪=!"Xdzb%H)9GJ Nv;¬8eZf+O5xǂ.Φ~3;%Xs[_IL KWꉹKU׫# ^@迣çV0<q25I<(.N\vm67Fsc6rvQ{"0:WAlx<檾߃]VG*%zd#S~QKH%Ek*bΕLg{Ik)κ`^wZ@wdm2Xd{Ks>Ή%|}x UUi)vu#wY lk|+a3Z̙pV>ֹ*Z\6ƥWXVl?P~bXV?7/xX%Y{_…sl q0fU*Tj @>"6}="X,`d:l+dNr92_gj|$ssYjIl Bn 0.ݨ&7<7>fT _DAx[k0cܽ q@ZH\(nmtũ.Vr/=Ftxߚo]t)tz HDtl? l~[bk%N,!߃J&.F͟\Z'(~Z_^_etK4.{ 8,~egsgWo6"׸MNRT"{Uf m3|qM{e˞nsVjfڢ_`ߙ08GwqULx _99T$[6A|Isay|G̻4=ZSF%_m]|Kd=ebE&1'V3y˱I?k/@g-7st<7#bLnZW ^DL-SyYo¹hO3t~|7u1RRsj^g|5 d&Ux1Ovw1fxj]u!v$!WUz`U E{Z~L;߫!蘏ė7 ]%9pYϒ9FfdfTɼ!;hM2.'~lvWbH3!-B߂c `jB.\m?i^m8O4>'* `iQUStĄm"|_/~,֤xE5>*|p_c\ia{n]+wi.qoɧp]s@dcE6T0Ī:{K1yӱSn1 H+-`hEрk[a6B -ք~oӻC.T-КWJWq"} Qa[J>77?P11r f~.blmXuB 7j1x^ J z~${W[ȆX.%93N +y~ϢOsuG@zU0nZ)r+4-I~]'Mё@[kav 'fj!0 [5[CϘ򙡠1GOmmh|V圮0\#t;B:>n S# }y@>Trgdz$eO#}1Wq(T9Z3Dq R~5wN,Gی|Վ 37pA$1-YryV iV@aƅ$⊕w5doCȒN08 :rnߤ/{{ ǀU6n xV_s&BHӄ"t2}`v?W?Qi`Nr=*sl)IܰhJ{C}{2,p_0%=T Y#BܑJ2YZ4yq*љqʰ2Tlxi"T+S&W%{+Ff3ʳ 7g(aFQŗZ5: 4SNaD^rGX"vJB- T4'kt`e@ ;:ҐR 8P׷-,_UE' t9is/A;X~i*Ql#C(gE$w̛'UBq$E)*-nd6(^Bx,59D(.BQ $Y:-n", IPĥMf7zQ߹| ALv3P Sy_M护UY 2HS!+eI!t4Nӷ8kHfp݌nߥ+䰋Ts aRRtO,]~$gPvGyMLOh/p4lkqZ]&**i;he*%HR߉yX'0꓈*HNz9jaG7Wdџ޲_I= xdq49t:kșNA5zd|Q^A۵΋wj竣BrA@* UX XYYyuZZ#lg6r?QVlQ{VVe2.bWK> a԰?c qyΛ\PSvxتzAä:'( -qhRS?y؈..0뗗Y&ZX)$` "ʰێx&W~t#3RtDs#c>6">  ?MMfvyu+{Yp>?`J|E2j [ &Vb2؅.Nf tl9}1nc:L,_H^WR'Ja` O]m-[3#;D{PCbK6=\x%8I/1:S l%yk8rTY?|UMRhK%l#JK[zLNU;f|g(j7,f9; c$G<8SNYAC$2UoDWÖ< ϿvhX"uE8LDzz\%+PFT1x?~?:k6`V;Јލ, /QB|!&g'L;a5{o35 [rtl ⡫ فeѠ$kB/WHx)0Ox}LEO&YSsKu|{{= IbL{9n aNjxքL#~nmgO%;lf,%T #eވ5-/ s|3a *QFx@i$\;UmNKyjbN*nC|i]W]iֲ$+1* 8#BKys;wͣέzAܾ -QaOd]{BTEFl̀j io`Tݙ+w"+~:Mp-P.=cJ=s-Hh;C.`L``8Bڽ6-T!]i,]ݭ\^{=Y"4n$5Ӟ]dFOFZ.]n|8Xu"=[Xoo;Cc( 7J\H"]gm؟{:mjT!ϒJ$*'kpu@"o)IgƟA@6nd^$}WΘxgMS + YԦgqqrɧL=?z]0nI@ExU!|P|9gb48~nRhRWRMp8xF K\Naqm5h/tw>J)I)xتE|Н(N^?CE$-Nkӽdg4Fz`lD6I9ۢ=ނ=nL^)c=lX۔/rF3SanmCoC@ j'zD?1DHsy]~KX<"yj, U~-K#o. gwe >7,6cΣM^TAlc:LΏOsYid(VeR&J)M,f8v"EQQ[To6._x!=ba 5,Wlb"`\Yä b3j#-`bAZp#Pl^Jea;odQvENګبFk@VZ* ze^LD1)7J"=]2-q,G=(9f30N[ Թ.jSbYF^[S" qgRDVDzٻ" [jřo=%QtEpe*Ơ7PyELλ{s2d`4Lx^S,>AI""+{iڥw<+v v>p=c?f0p ؕ_ sSfs+!H de%,|T) \>:cIx 2٭Wl/Bfۥ?Mңtц*Na37dFDxeʿP&qx迋̰J2c&,Y5dX=Qep!"&1C`8xv{Kh҃qLr%v ,SxI}Tĺ39hŔLQF m|T-9;^߫뒅;QFb5myF1z~?0MV9%`za]MMJSAw1j(@ʨx}| Y!a#á yJB46/C- CaL2!!w(&NU =;.ck^ AiF3[G.KdL-eaM0bh>7u'+S,C5$b U&)/~t _ֽeB,ԓHqI%[&L6zAkX;fzrz4DF^w#`k) FG~2?mxƀ.J0=95tGݬUK{HjQ'Up.ff?I!" z? Z]ŽCAapIRWѫ:Vy9jv8q)AԞf'5䷱ {xԣ*kuӃ"_eH+g y؞U\T?P GT䃞m MXsZo[\fdpo{\jkQD5b~!~spZM/lb$s*mr 6DI}*?斷˾pɞ0xO^JKgưlp^%Yi3;8qiƶᮿG6)@p̙#;CAJƥO R׃C GZߜVm (NE!ji&zT;!Z#SX8b(\Y缂֧~ m$瞶XIWR]vI ưKGQ )L6ӫDh"vfҩR֡F@G9Bț)^v$Փp{aVER2yqZdŲ'%}2 ]A|bD&yvgյ!wdhTM^ {RItyh}c`?e"$s]%_ [8z a$kNDg 0c̅Xr\pH ̊.V0 >Ce [Eǩ=x)(h=Q$vOQAf1WMU-el5;!'@uW:|oCF֘恰r#) Yx<~zF $(_%Iy _Mh>1K=te]BiNm]4id~{/|[mtЙsڌeRkUq-(mG;A$]D7,;ՋuǛ!TGeJ:!׿Jx.;0ׯpG= ]m> ޔp"h hUpN5bCoҥS/Ls%Vg? D7~ ,, ̒ v3c*hV1tz)z|ŅVĵc 22cX} zH-9 (+۷fw_ue'?9iWP˱;۪C7%TUޭaUI0YiubTnˎkkȏ}[hw}d# g3@> J/Ɋ[R"+GIo2Kj(>/.1\ 8r.9S|PDD  A :^ǎyȸ˼rr Q4(t͎OcY0BSEd"a=3(/C.mD_F/gҏz ơۻJmv=E*׺bAׯ/+g|:Iꏀ]Z# Y~)^\pv67gțgŇ|Ks$LţQR;2l"iw$FCh +ױue%,Yvoi̺ g+|U P)v)pK5 $P!&6kj΢@,xQ:ys|KK FH9-`xb%]KkҭK^!<&!09 l9ēKme(l+xB\NuUV7&H>Nh2ۘc*˳އ 7CB  1295pP2Vu`ƕw!l D?jFm'AE<&uF5LP]]gb5^z׽{^/=_oOw#!gw+SMu<1p Ɠ~_܊̱Uv3&$BmsmRgm2}cTzުVӻ#L0BTyy#S:KAݦ|vDɥe ډ߾YFp6\Gd[F5b&s>tq'7E~ǙF-Y뉗1u0u%e:\uR-lͫeÙ1mezD&C. mva_[qvTN_!]jQ~W][pW08U~C 7 ̇Wwc`!y\d46> ].7vcO4$e؛=@ztFy)CQكKٸjx"}n5t\%Fw fr)޾}:H/s$t ]j=||0R8].qwB1@##,Ϻ>mnIc$4dpE uTNG/m\oHvUۯhҟ?QjIK.Kʂ#@vlVP9f= ۦlT5@[)x2_)$^A(M p-rp'ұ^LP>lM($GXTKo vK>ٴRiH1&.b欲(U6ٶ $Eezyz:(\2 vi(xn~ESmNd3yZvM %QIM|j.ҷ#3h;՛.dK%~3e k桾],9`j -6MMأӌӠwʕ%!Vt:4AgKc9rgWnR58۬\SlG>A zI*1Y$uu5 T^ )RNhm(VW"dLT'ĹCQ꟩qPBvGq4O ;^^e  –񄺷a~Whu*I,|Ha9ISgcV/p& v,뤾Y&~Z;qp]N`qʍ-~~\ ! TUҎ}zJr|tHw`(&sCμf3Q%3T2'9ueRNuk7[nh(ѧtc}H -wgf؎Soqz>8߰VԴ9Ǩ 0ge9DDT2]K2gj I X5\i$j};$3dSYH82<iL)%綛M45X׵«Tםqt8g&zz q,\d3w;l5+-'IdG?3ޤWE/#(zkz(O?i~z`obdeS-ӧoش`gEU [̡QCC,#r 1%"c35 }DGTNR%JA1A<ߧz+*2}4~^68_H >qɘ=Wj,8qK!DxFX& E>FGTn{}~ee)Xaȩ#٦8? 7Wru ɼ͒ISzMǔQ]pp$,3mǿ:n".ȡ~dVmj/ 402st8 _1"6xߨwN\5K_ P5doKax6j3DX l-L#QcHՅj@1jGc o$I(ֳ>ˁzi*Znn\;o,q6{=xU~mT_!t9$-f[U@JB phsP(P0S}eRJڜIn{/Nu Hܘyn)-6R8b$+A=Axr-!79"mnԯP #α @: qH8Aͭ҂N1Gj9a W׈!/%SпcZ;gҜ:`,]5;@r-JB424c/ ?Ž/DĹf#A\[!P-[hUP&`M~Sia{5ͅ-ɭ,fF6TzAQNY0d[&!_npˬ56~mk D\/뼮*$N8t&dְABߘ#/,xxV߁D*&%x(-Pل  R5 lǀjt%ls<FRLx sׂ |[sYfbWX&>K{#`:C3y%_ #><KNIl).\gYw-D'Q}exA ܅W_ -~!؍\_j0MSxD#L?ȟs.ԞmGp8 ~ivX){0^[[F3jyZoI-XQls)ģzqMOo.h P!U-L9z{7rَG;*=v"ȷ|]/G稰ѭ- P }U;\~wyJKGT$kq1C(6}h鮹"| oҥ~[Gf@O9QDKA-OC~kN7-="q "ղ)30`HZ AJwi9 _V=R|lѭW7GVKݮgbpjAQZ rE2Պ{bY> g􆼾 1vY;N7Jv! TR&۔|u3o*U(XIJՙCXkn(okqOdsuA,^gv>tp2$VR$w*'hR?np$E6z/@roK IY'j ]_Dp)#`ËGϋ x;0Sb)SLANz0ͳQaԺq=9a/cÒ:䣌@|9 hJ 43ɦ[Ѕ\NuNrOl@}%EP%ilAʙ!Ȥ!ק.#ptXG7q?7AԳ.F۾y@{m(llndK+M (5)uZv,>7jyݳL |Y(+ Άݥ)<{wDN/ߏ>+^7qJ &ȨiO8A8l+oa~LRͫZRgU^s2ߢɛS@k1S]~Т_8.qM q!Jm8hJ-? !59+eTӐ+^oݐӇֲLI0A$vwD-+ {[HUZ;USq<S9qh Nj:һ2]M n,pk?Rc$Rf2 1}ޤ=bI\>K.%j!=?YV65\o}#+K0fLR\rM!I=!|}wq~P8QGP-)9&G>9z%އȊS xr챭 ? lnrY07/7B0B5/'d^d pee˖䏒 n9۪!'(8Ji"]h 9p FA%~ uMah{iM\TPCpXz|+v5Q|Nx#\)j፯I-})2}P{mV-:>6D~?\]#LيV+Yw#Wʩz4+~½I/?A@5샣C_M6G_= m+ {ƿnvuCy}7Xd#O0,`uiC@\]^2MsLXH)f7sQjDu::Dd&l\0ႃ^4i09|?9~,Ȝ@]$.j{k<)\NmPOl.QѡIV"lx|r W$+Q53g.c&!( y `kZC.}VJ7gz*&F5~[D3RX2!N\qwts "짙&8nͺ'Mݦ0wni}.DA0لh|~MHўG  $ܱd a %19sRc\ϙٓ7-H|NWY sMfO_Ҧwv(qp1\HK˽Zr8 ؅R/+\a-2%vC0Jia_}gg-U2'\"zҶ&N/A [9ܮ_pScq|}S#*ZO29Hֹ*34@pYTQє$H0Z&ڢԯTk@c~Ruώg&ndjwNC+*o߹E SPs $ZKA6Sןf2Or=n}ܫwqiޫ@ތIOZ $t6J9I^M@66 "C1ͪ[l F.H :MZJ>-~k"N8\4:_-/Z-`eer7D Sdk\ 5uOb2c_: g9:hBFWv!7yzgP ^;#;wta Tr)Ko$|w3\.<&v2~n"I6؆M]>5 +jAiGȜ5uH"D&r];{C*M]^ A!A'{]~aJ3zT H a3cPIJBa=]$9|9[h:U 86`h>ٰIeFTht `` r*Ȃ`îL4c<@Yh $=Ie?5|Ȝ]vCDaux0anqD݆ݘ&ХgOuTc>ۀ+nd BUƹ̪]KIW~tdͶ>{ .i4\ 7SWhΆ= /U(48`UTiTd3\hݩ LsQHPa3K|8*rhUW^5eJuVɐ* yJq? 8s_0P\@G50o-6}cA;0&u`}[Sm_Fd Ky\2-?Gv.ԮN%=_uP^Cm$HO,sMwC,c&:lFp4+Q{r݉L,8obDS BNHIwHHׄR@H*wa廲+&S(oL/&YXE&3E~c3u"e >>|9)fRŽ utPSFk7 d_=Z:Lwd 4i GguCPM``9?zE[M:gw,'@1 j԰}ʹJڔ Okf"бV@p"b۫3 v͢|n1XZ{c#_`A3=I5$/V3AMqN rw]FSp3A{`S:CrrO!fzGt~fԧmAģN<>'" n֙,%iꂧ"FQIy0=ȔQA)4 Nm"J;+qr\6m~iZ*!4HY(! q6{MD6|І V>M)5H9L9gs`o0b d~M(]sNWDY8žC~B'$2f{؂v&#]7}0}jN`p?2I'\G-n5 (I4Z&Aܾtiuܞ$;Cr@}ae¬?ܨ# ’)sa%RWǕv2ͷ$9϶ MHT %n[zƻ]呷Övˍ ֭<hhA͗bį]b?.z6ѹiWKw\ 8 >,.OomVE¹Gnaﱮ04lJ=I bMkw22׍ب@YF_~򩉯zp_̤\;,nRmQˁM"f2Okrf(Qj+i ]1+6$!BY橣 ΂~O)8 F`YQ]lMդ&Ih{e0T[nse6G)|eS*<(d1%2I`DG4M %p&Ë9AR"ƫVkV5RdOD8O$'7?賐 U%5C7K\a/*DS$Yր|4|͓iNDhc"0`][.}2 دjV\ :2<+ύrb} q|[lϫ'f0 ,5Ci M k[SyqCq~TWIjXOR }&Yxh:r"UG H=ql ͭ2wTFy0`%LtS89 =c,9;BL pמ(]Ϡ^ a4T;53u<7@JMwٚAT}I01Q~LMj#oSRɌڋmx0m7hu*(r(v0;N*(P}\ɸ>!0=QJԅ|.^5Pn k_[}aJI~qSۈ:lYu}\tBZOCa>l@eDG}E\^U7q`3q=;f…jbkɧ0k'kzF>^g[<7oz/hTe0w]y%|!vTh@d/uN6;=R8Z6:e3&$m$m]b_nT;DGs4K~M3&bk?S@=9aJ:H"Oz[$˕+%9+aVjإg i}2 2Dw(wYXN#ixڽX-zV[yosn+*v}L|Fl'GW[._Qy&]ueVoDM.NDSR> bM!]3%/XCIlzx H/՜SIUK"}J!W|0>z"?ual'ډOqf@k%QffѰPvp$u;RAY7M&IX*(%BEǜ<-ֱQ7h`j}J^T`n8h`5VwŃx~lèpsfL0K\){}V:< Cf2dׄTGhBbP,Z0;*=Z 'o4!kI0vK;+)f}MS9fǗa/G[WPjNk!B6E*.} $-$i5m_jM ._=G.P g!1s5Ҝ~#rl93`mRo: Rx<q,ѽ-m ؚ;-0?w\H{-3u\zC-JVخ?!/D&n@N`Qv{\v|W:I'#5 \ҥf$[KM F A~N ΀Wy"a}ڰf c{]ɲsE;sɩaq쁈Tb0GB|>/eLIZ3$>5Gpw*G>Vk=A%<599YRWEeƸ .Xg/ThH%R*{zv\)^~uI|yW%Щ׏({xP3fqpWe>;вG||%7:wyJƣqaw _9HEa-}"5X3Q$];eۿP.UuGr8JCI|.obGgFA#f_k ` P,a^؞dpBlƈ,*PeQcr=eYφG$|c3 SQ49;?Ν 2e D"n )(;8G[)&s?jFL"s=jo-wt;|Ķhg2[7z 3Svsܫ>#J*aƆX jǁ?FGg&*n0Ig=ob<-#<߼<jcl[us -)6ДWi3ex9_>P6ocn3DEZ@Mht>d;̖󦡆tĵ«nucNNt+~gUx*x҄d菝ʸ S;l>D>~ѿE3h[|m//oPvrC]2T-V67VnE;h{~X ҘW9|J%k50$k%nl%UBAi娔ɚ]` zkZϠ\ȿ"^Rͨ:vd18oBә#v0U@J\<D c %I}+1&uϷna#(r fH>g2u]/}0-SU//f!WAWܿFEKLdeDBJ`ԁs3Ǎ:H ;yO3x6z61r].;۽t}'T,3E^Z.ƥP?;[xcTgeʡn+9'>e VF&O*Z[N*/!B:Aw?!kJh7]hFw[uW4!I2X'JLѨEMW,+$`<"r!-hzj[BZKh{8鶜/Vkt]CKp5pFƴ2.h 5U3-2qrB^5 ^ ]^[ێEB.-؂$yNlITokBoT>X1bDHRtZ{;FctVm۳o<UW&b {7#GޝjSI>x9} A֏g&q?u[S*Lx4">Z"iu29HS8?ꁋrO6Rs(EاFVzu0Td}yu P;aM R_wE VBRwcWRS{޽5/AJ҃=1D{l%*y ZPϡ"<`c%l"icX14F|H|;n/+0߼Lehu]Ewua0 59> [f3^^ L{ƌpY` _MWv{V7Lh7du!pi9NT,uV&F|(B jnEmJCfOi 3ڄnш36U5JBḯ#G K'FrAnfso3il~/Y:TװTi$$J ބuw™FS%U8ݻ,ƑDޕ}GTC! mgóU"jIixsZ0ߑ͊`;Xcَd)E^%`6Cv\N@R7 ڝ#`5v/ωGi5\nȃif¤<_]Vg.x'kx;78AP6ɇsroW2AUbIYr:?Vp@u:ą33{HZJUzK)gbСR$ ~ǗɨUt]OB%9O\gm}_eq]KtdMhŌz,r&`fCyH$R/s`#N%uQOz;χΧT$EQ ~w?l Eg:Qv&C5Ѫ_R|WT[$>83Y΋10{PQTZ MoqHڏMa,C7Hh@}_,iNkxtڅoe;lnkoaV05\ \&#nU} R2$M=%X;'"Q/K%wAiwrڧ,rf'OrB3NC8k-1}?GJ{8P4bP*c. pҚ^ϪLmHsgƾ2gehNtd<4ɜ#eTp䨈mi=W 2^R{Wn6aJK<*!CkbU"N%_ѢoS-~k/ eX[<`Hk}* W43iW}FoD1` :o"`.,r,xs dnS8-S ͹C.* PW*1Џ{|rdbu|,_@r]~~* + FdH{6DG IlRt tpadRChadj3n)/!\CҘ{ZL/O<*{yxjۨ)%{H)|b+Fd)1pI(Rߡ_#w/< ];AVHn³-(ԅ}K4h`Ce Lm?_,Fdyza%UVj!fR͞'[˥ROOS*Lb1U*uqfSMȵNQ'x$¤]#-xQ${ #R,JæEns$: $3.b#)t'*38?' }a,V 3VQCqZE+qZ ZO">M'Q?e?D@S)F/{Rx_Ce5tHiXR ;H_VeRgi^K+L*x F{5pS'G53Zօ쾋X_LڒAU ZUlՁ^G{Tk*/Z=]-ϰ_QCN||-B&!i qR/dޛ(Yڐ1~ל8n1)WN.0:co+2hy P+7bA8& *R0NvhXsVEL + >PG{B Sۉj ls|OL`08,etv`u*ZNaHC]m?$1)q[ZTA|vFIgY@ 66ur`.ōq] ovu[x:}'&qt8aֱSo7&j~]ta2L濯L5CD](g }Yg$w F*s( nKlpl,ؼ`Ӳkjr oSCES$Fz15PV9wk0kG0v@M}~ǐUAL4ݒ >0# %͋z\+z HWU|~d!NL?C2`9Ɛ@E20[EyxP&XG:_MFVёH X'ux9u.h=>w;QZ\f;:1q2+O%_TFǷISK/'<â]UO,Ւ_oDy(s:,C"{/|zGgR?e9p(5 2MIaY6s},Iն ;BD>BZnd,e/bdNK!I8't~ƛ栏tr[U 3s7N۹[SDO&II=v+%IU;N1},נY CV3jB65F@$YI8,x 80"!22=Ex"4짟1Btآo<@vM8kJ/IĞclEi >i^#ŕm"Zsw5ULSoVq CfjfIU~~-աkU+7ԓjF{!ۼ*]%6*7wBMfnthN4|R귏 0S0T{M.m-u@{_۷_?fiu[0rH uH4hzW<߶즓ϥQ`1I0+,-ۣX ֵ'#n|wE{b:q!1ws(VlFݰK;MuCgԀW s; p ED2% 9G'*W]hW>旯<O+56 Z# 'v'S\+jZ4w5 :~,VTq>Mr7] Y){lC\IYvhJgFۛkcF4șskvv_Q'#4+.+*m&_w@$ +gBhӪ2\-d7k^Q%P_^Rh ï0$ o>F|dCc=AπQzo@I$VMQuŃzѧ})"Ծd KGQDޯ$JWl$PފmS/w[4 v#"T_xA 2bHR HhN=ۘZl4Q 詹 [<2xUװ)[]H]{8Tf~0"ⶖMzM9bb9g8eBXiAg; E[UG7Ɠ)=.P>JCvIg|čAWPTӣ.ؗ5$bȍ\a8Mƒ:%GlT;VՇ :47>6:xwO}C>w ݃綒QF=tc1+),f,Ȧ3򁍔WΆ'D2صg%noN3:&Cy)vl"f<a ƃuy_ Ԯ.3h;Org@ {®Y+C;)K ^.I/H[8݀S]噊a5sdJbG3_jB 9XT 3E3:,WXe(pås/}Oxanp՗͗Ea9c8w2v 3%U8Bn|&0!-Ӽɏ UXmWQ'59J]GAx!\|. Ho]j2"K(M jp8L{ZWt5I,yC(9t ZA /\S"mGZKCaGik{4q[p6^ai;ov nQq 0NCG1lCd^Z-b-p(([boinSZ}uީMI{ M!KLVY ^&?EA438@wӒ#EkXF Y?B-;8C'x X3 G_=Gq(w{:ڻhkb &Y*.^p*caL7ʨ}v0[tDHO)gºLYlCE|O &Evd DkvΉyu6{JOyBbl tߞ|qbIw62:e%eahyZ Q/L/KMgBRzkHu#09}g#Է,绚\S$]_ BL߮PB֮l+6UPԚǔ:cO`p%Y,8A58ON>I0 Ę] 7f՟,}H+.?oCm*6.N -hZ0ZUDke$3[""Zb1M0QFKT&.,Q8T+BNZ NDv|r1G`NcUqJ$~cz;&x"/1cgXq>֒X-f%ضq-lSt啑{K4O4!X&'}iG_WP?omﻜ%Xb1n][Q5z? Kx3tQۄw6pygQoST^QA إTqAJϘi_65rS~n|׍]"_O[$е+wT+~&l4S42ϯCBj~ilHg?c{o>n_E0SLFff:Ј`:pq3SP3ߑp&i 4b:ǑӃJp %[-1lODQu:ex tXd%و8H8Oc Lx(pF2oy ,X+-\m" PZn)N-zuEaP9F6Ƶ:CEd"vJNJD2 .$f̮HJE`w nJ}9H)ʌvHV5gKW ]72ysA g"ZZ m顡 9|LI!P5P@"dZm5c"ܻ9Q@—u z:`Z;(2d˗%ĈX"r5"? ˵rę!sMHi`@}z,yz)JA޿%D]56PZ!K~]誉F⹝a2ZM5G.Cd<'/wy5U2TY/kzL*: Myb;[~i}w(8ѫ+UzN{S^-v0yOTQ#**NYjr\x6V?LT aέ[^L/cŁpg!|(1/%h&q*ssaws8݅c=>-6VcKMi;h`GHPQ=Lj}uaO߮:xQ.ٮ#JqBDn6*75k~FzeԪ8NZ2Td@ W05紤{f쀠?\un}~c!% d4kO$t3F5QeJ+rѦ$MP?@TTS_KqJ=Fȣ*K ]̖zt1G^ X$psR9iË ӧ6D JKfHڵGˢlhpBy` MD7+-vV~V_i<UP{S6g(~]1-uyCa\q{S2 2_˲I\x'~meTg;.9&+nYD#:~jAeXfM(<ЉvG;rIy0(DxF)T-xZӇ]!Y+`g/{R'fy=-Ԉ\n, fsʰRcÿS7@/C\.Ք4*`RֱY5Q i+SRv~Q@fH~PZg 7XjKH;&֐5KBֲ՟}R Sד۪? NG~ ? P^tT4^߰B[#&AۤΡ% v}Q;TJ4d98FS>x|#vG^&>梥 ZlA>`箇@lxDdt~ЈzC 3a5 bүYkisD#ʺ"F qfEg(Q ~!!ؘASHi]ҀR[KqU3BOND F Cp2`вS-l~c 0σ[yw9{(A.XVr[A.OzQ{u}~צZC&Pc]tQCMBa݆K +5 a ?/?w1_2/,@+ؒ\_k7K19mq~MzJ&ʳS G I )\ Hs4GҴ#1yU<_WKSpJͨ[eq_?œZ1Fۘ⣉aƥ0ׁM`|rL!\]1 6c= JFa'Lr,NT>*]_g4p# Qb /lGY_ޜ$wDN4 Wպ:g5jcK3L<.⍮ǽǝ aFq,Z&b r١9V\xN:.aZCltExCE/{򢧢yw{ݳ' Wwp ԇZԲ@6Y ke(Z᎓!'iߣN% >S;|(bqDj;e>kti=Vg,R2vqX'4̽BD9D 3P=Ȥ7pT;tݝy00*)yK/ )H%e\U:r$UmߒC_y:ĮA3!<794)∻ɢv[Xg s qkkYUI*}$ba5b>%0HugbjvTI!M[VXR/Զ񳁩(5oZ!DvZb|r܀o֥!1 ʝl\y؅{8З@"m߶{~os}Xu` K֊lhR%APk٭X!#//pݺ\üzFEhaI𡂠`$G󑻹dLdq423/~%?".)>j g7q١m+>8#|V^ [=&r;)G'+ByGK"\5#Vu-ۭGHzB&?(JsB1]mśW[ `r:9iGF'PK"F~dbצ<7]|1q?P&ō?8~*>ˤ0 q_mM%5`%ӀD>\/޳t;"_߻S'R OK= I[8z7` uL.7n| Q$J8Fl&-6_&:@}#;ɝx=ۉ/LuPE{Ւė# xUNfsbn.=ցƇ`m+љf7M%V@1nty݁)W S$m5 A 4_z+QC|؄3_Y;`]ˆrJEa>#CIt?ǠGܞcx8Xp~c3ՏF蘄v[QM),yՏIE%48=᯷N1JcQeS#vVA.Ӻ˨(2Ա5#Osv[l^18K`|K_a'"Z7 nԡBKT>j#J2` x VkQ,>aJ$ @Y.Um abPCZJ Z/nL\TR wT"JP-} h$ x.ƠXû+P W!п<<\h3ώ+ M'ìL8T7FtNuR][yY1ި=iUSfHОCר1|LFe5~iJwq 1:5eY GۂшҙQ(SO ](K&^n֕-ܝ|bzg^݅sO`|xY h+^̥i_O UA)aǠqTmB,WʰDLmIs6pYzGSt.+7s=lRo-tE9M7al5=Z8lg.pjA?L 扲|r,QiI4CɚSO.SG_l3P֋'\J+YtM.+'=Z4ze$> °qH~8$unWr3Խ0"v`ghԦEt{qICk+gI-c#2l{ d녉CHvW|$9]M~\xJJ2OtCiT`4LhaydKpS5d.Sbr )!<M#QEgg61S 'lD8i'5Y3 K'/jZvР.p.#$`[H3]_~|/$u;鸼A_*ak]$ͻwp$uSk2Cg!}ſ4p%݁\$lcW6ά_my",Q >X ܍*{-ڡTWSJqlU/\|[8z&P8}΋/ b 8 (#L i.Bب"go22Yy):qRI99RՐ(xߝ΍窀5ca1 7^c9D㱚^uǧe>8HjhCl jV W}շ >"lbxS\vӳ9+&%ҥLgr!tT\,/YrܒV顮L حN1 .y454xkzLɬzcm~2ݢ QFllU (5Pl=e׆?Gȹ.*_3ح(y(C- n-zC* RM "~<셔۶O]ͩ +."vX;LLO֣z7Y=aPDx x&tIBbO 2}WɱQHԬ-<,+Bs[7Aʎ{0^)g O+hS7U&M9i/?5\T+&c!S<-FpC8zm{NHHx#;V5)8JyX̒U@&Vi4zv%e1t6 b~dʶW|6-y.$ֿ;s9(TKXӸsM/.t]fEްEƑl%LP@/ՖXWjo=&`wB*>n v!|qn Xv|A c̫nvl.q +~[LW[ |\uz[;0WwG9I_X)f[uL=XI_DPl7&ҺCVQ<=1͊Ӭ~$ o^Cj0_r/ռ9Χx-h؛C{W"5ڕ/UԑD2'uغ$:D͖gVկp韰oy_e1ǕN+RRAzϨi}De:!W穮cjogdf b`j8//(v9U qˆ6`#SonjAIӉ#N݇_ؙG1U?WP׀o!mMpf(m,-yly;rO-=p^®cqlcrv|bǴ97MdIq+? Zh pB@udBL6T:'͌&JDVQٝ|ә89u3"I?Po{ ?'n`N 3^X5Z`ȉqPX 4+u|K2{Ieq `]zߐ6wD8*,E$ wsP̫0/3ĐHfH$QU:ޣ~BRf{rpѦS6 ݶXW_ ZJXo iF]S̚6hYm3$o FKluD9a AQ`Fc&_tRU*i¦Bu D򪔥2ˆIJ/Ղ6F[|>j/tߵr_i~Q+4KJ;Za3Tg*hHEZma]jZPn MS/ Rg:oƙC`%tHHoDb5_(UN!l/?uB@'YMދ"}Хng7Z&.$ٶR-KF 2Z&NZ,-s- ӕyt /ZķĚ?=Qid_:|S!-,šҤ S*=EK.>kC}b>mW*gvzX4<:oC"9y 1[{ 4W`nZkuި2b2DaDΔP @} ?j"؅Sn %,mWow'mP 5VV_Ea-Q,@D͕jEmoܲNQy\0㚏ro7eeR 3&ٽ79tD,]DtرLWKYn6~Q/7 ;;tV+JYaa I*r B))=4XLx}55# %ڮdk]C5X.j[>sn(b=DOiۥl 'F߃O!8"DYg/*|#C=py-O9V{H i5i)>ۆ{RgvvPý'ٙ \˄q돐YC4_@UΣ^H7c)D#?P3~ ڵph?)-|3{4Muz4dg0l7ooD?ȣm! 8My0K=_ JGBHhs؉!%p<9H-ʩK5ҭECzBm? 3+s{b#_@J^z[uB1Z)Uڥ= ણhh|sRf.f`&`b-+͓`ۭ/a[Wdp1yaC)1:t9Xv4' <-RrU<88 ؏nykgὲ!o(.)O^w, 9ڴ<М5H!by"ܭ#.J}̙hd A7NL8B 2jlpZJ7&=8)飙&՘Np2LgFz>6 JzC : ;@L|u (iz4g݉A$ [B 7'dmz>މܤEF O̐Bux՘ [Ό&daЎj"Y|!.r37;gMSR(p(Q;KUcIUJ^ >E;FV6=RGcZz >51>S%~[ {[L?h1(zs-c׼ˀ5;;ԤsE+ >r-̺ذ$f%VW2Z KU^4P~*SDtipfT<;zmr_I ʭ!j0a TIPj?LrM(CM/U׶^*[uCkfD֯(삤-<ɕsnJt/0;Ó|(3BDx%OU.OFz @mup3*>38㷥識J/LQ]uP"+br62BM(!$ҡc1kwF0EUt)V}ϣ9 ,wc⮍(-qnC V빹͑Zq]LΚk JnAZ D ԟ$GYA:3erqV$d8~,, E 3W>֑t nVqTBpWVpk7Ve?K߸(fρ?}w$y;>Y@ y_yCҹg)N'0MpqwX˲ V¡@y½cnq:xlJleHiScND7~4dNAg@8Rq&*@ q;7TO32owZ`a*AdMAwvy^F\a <, Cq غcZUف tB2?k,(THfa4@d¶t{X: DaxdzE`;l0 iR ˔{`+dhw9aT5T]`h.D?9,Md;zʍl%/:?@ Lfqh`Twh!%/g3r5HxocuD U:V,!/k5*J(HMp/T7Ѡ8fR3A!AN7%MRaL(/IK MMMEMkd==R.8q;l&{63W&Y&anb4q{J4ΫoLgrGfZ?SҎ;$RorD\$]$G2 c{ nxWil=Eh'(|S+ypNFEG )ˮ#\> endobj 35 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 6 0 obj <> endobj 4 0 obj <> endobj 5 0 obj <> endobj 39 0 obj <> endobj 40 0 obj < /Creator /Producer /CreationDate(D:20100119225939-05'00')>> endobj xref 0 41 0000000000 65535 f 0000192325 00000 n 0000000019 00000 n 0000002456 00000 n 0000192590 00000 n 0000192707 00000 n 0000192491 00000 n 0000002477 00000 n 0000003426 00000 n 0000003446 00000 n 0000003635 00000 n 0000003927 00000 n 0000004087 00000 n 0000030008 00000 n 0000030031 00000 n 0000030231 00000 n 0000030749 00000 n 0000031118 00000 n 0000043493 00000 n 0000043516 00000 n 0000043726 00000 n 0000044078 00000 n 0000044302 00000 n 0000062370 00000 n 0000062393 00000 n 0000062598 00000 n 0000063001 00000 n 0000063268 00000 n 0000076805 00000 n 0000076828 00000 n 0000077042 00000 n 0000077409 00000 n 0000077649 00000 n 0000190062 00000 n 0000190086 00000 n 0000190277 00000 n 0000191222 00000 n 0000192187 00000 n 0000192270 00000 n 0000192820 00000 n 0000192917 00000 n trailer < <7CA0E5A4CD73A389F20C4D4C0D7D58EC> ] /DocChecksum /FE8ED72B58C5534D08666636603AB621 >> startxref 193186 %%EOF Kst-2.0.8/devel-docs/Kst2Specs/Data Source Changes.pdf0000644000175000017500000014612012277111530021345 0ustar synthsynth%PDF-1.4 %쏢 5 0 obj <> stream x=is7rex((kew%KI03AMmU僙ONTj*+`p4{J* ޠqw7eU]Uuo:-mUߠ~~藣V(6Y;_,TE_PGWuE~6~Uۭ\7o^~smjD)Ƽ =ܕ?V-HKįufȟeCvTrec~;⪪)r:;~Dgo~Cp4ü٢P>a]O}G3TF6hdEv]Y Mh/j>=8tz*Nrt{Lg!<]bZ`{yda&yCoósw9P]XKػa'V0=kW;OďʅvߚS?a2zLoǷ304P]ߒow:AV/·9[ }o+x$iI>Kq~tg!l%E-6/w?߱D9 :8>ܵWN>\C4WSW y[ARi0so3Zյy=v=Fs0qy_vl>ևg(\ 0?W8,{;{պ $ӰVj5_$ @ yx["M gJbt`D=(וbpM,7Xi0dD0YcS< RHA)̠ JIEllc"0p{G7a]O֣ \zw.ڼ;,j"h[uimp،'??s98Bn^_y3No<_%V Z\А)&:b ǗBꁘ-CVVCYZՓzΕCWYCHJx0kwVrJVKc?`%cx6SڙDԔް H+o0eb82Ĺ0h/XK#\GCُq?yt~lIY0(/f Wly9j YfgtImc\MWse kNЂr57Z2|Q]0:"#Riz09 H?776l|J ׹4e$D$JXPƂ1,5ch+6UuXab]!ZJ/[Рp~rɣYX~x5)(1vU$>zT?;E*h9|8I)/&o/u,B/++%y-k F;wQ B< -8 )M#ڲbN06!쏮J\4D@@`"aDrIau,Չ&T0ֹf|՜n޶MGL3CN6sVe('~x6 :@)},k0շ•u+țK?؄HXWugѰ P K#esf6xlM"iLgWfd&ȸFJN/^ G?iU|⎺gbC A(PA,  n@H#P[Рpc[GQB%ٴA,[R>sqN=@]Ef:7jR> Soo`v Nt~'3Ig5XFQO bVfIZodB(%n6H[um5NJcK8u]mWp 7Q߂2G$n%O21:WU?x6Z,=n~Deͬ/;Mn,ZMKYض pRޥxT<޽f=?ppG#`Tˏ^!V߷lAd*z5=UWp 5䛟_ C$p6#4X{=hwtoU{{Y1F+M F^-zI*29"j'1h%I/ $SH/E} ZO鶗Ry~v|'soypar>ݔ"ǣDl6 1=Vἢ[yeMJq6GܿMm'ypFǴıM zd3P(9ńTLo(C0!7HDW@c풐҄ɹmNmh%qP:D C =<6UFqz_-u9d{4ד,Ng"i>Yw)9Z;Ll2khB/W‡RѼ.lbi _a1Lpk廉ѹaZZ-6LcK8Rk[Z Z GI9.mKR[A Rx V4m;5HHpq6(,;QG$9>-2+BorwdǷ@P ׭{B0^Cqu+0 tCuzaz #@)8ݠPy}4ǗHYLBPuQ{? 'ijUQlG;mA3햬̳Bmhavgd>_e$; xp Y,b٣f rO#I8XQpРp)_O( F; Hi &sJ&t)6>qŲ,ەësӯNvX0;vc; ^FjZđ9jF( X8"#2ĝjQhE@1o"n)X?Y`$a=Xvp ~)SicULGr8~hËbT?s;7C8~=wj ԇ85⮫ʃnMcA H'SnF*++{4' &PU(#i4% 3 c3I82BGHiE4xo\j =$ fEgqT[adNH >O݅zp| L?5rɩ/wDQq8!>(ϡX>i88C} tJ]_TDV 8sgt*ћAayU-Uj̎2['0N̶\YDVc~~5 Q&$ Le(o?cѮ [^(*3SЂHԒѠ.34|Sϴ%6`sBϴ$h7g1c?h鼭 H3Ux!$Uf_TwVf_T!#(&KcK8ɪٗPwoAVQ,2G7[d#rWC;cAh Mabb K kN-Lh qA2@ܞ;$+~#p%ɲ6y++ w1.D9,-5$7CJ%p6Mǹk|&m^ Ge2:]ɋ;1JnnKGXJz9 =Zi'd#ᥬuv_)ޗgZ ťћUHl7f/򺠠fg}NJ*=ҥs]z@\?B >X=pZDv~(i GR287NQx1:iOk*aP&MԶVBe j*W͑;f|*ؿealOF߂mk9~>&SMeOcFE?'H´Z )Rg\% +w(gDd p7Jj@2E5SѦnnNS z4s[)A3uYRCxрyaZt^uE`: ' =o"haƦƍ}4_uỽi'¢OJC$e=;\KAqUU@Q`PYb̹r?Ƨ'i4H/\gz.6]S]zKt@3Jꬠ<#tua8N𽛕iO限}wFHbT%_vq+Zb,*QW ,`)}eaY`؋$9 >"LZ&h"f1ԛm`I- s84V[yWH(޹2]TLoƧ'+Wobſ?.cendstream endobj 6 0 obj 7496 endobj 56 0 obj <> stream x]oGNdi眇SܙAѢIK\(q?Ϊ ȦHc~3;;u"^*?g۟fmR?~|ɢrPyFҲT/~k/ V>-.UUVpߔ@VYLjYaft;eZX3N'k} mZefF^YrF;,._^右cѢV(/̞yqoUS*^eξ C;L;O?.-i Hך_cZWX{1Mzkҗ%cPibG֊NO*R cn_Ѣ4}pxpzMDYMԑ>q*NU녾~j6E2YW)n2uKip,O{s5ݼ:y=UlbPSíQl k\pmZ3Ϫ'eU5/gߵx,0hgl!U}@>V `FAV `F(i{ѩ/ODnr|JI7)31?I7)K7]39_xLSkMZw|}Ã59`~%|tOӾ֣s7;fuS [`񁀭pLtԄijo+E G:?>^=}AFgl\1&G8+5T3ܢBA}C8'S`U4R:&w}1Oqaރ83ƕUCVhF P-7,@&r\V.PYⴤ,S,GF|[j${e'UI>twRWk (%,{uZi#5aOdKQ1+qj(M9T!2'&Js*}hIȶ'B4sHa%ԓ=~fu p;}^+>LH{ Q`q/jD` ;eFjpjw= 9d~f 괠k{!\_"w?&eJkrs'2ݑu$Y"@KFk+j`QƩX'g{ X_*oE/ (X6G=G_)̊lؑ)(\j'C_smcеu=A|9v, 3:T<V£:& i索mҺ|x0Q-xSsěA瞩l ^&zX[a|G.CI@fu-0|ʪ |J]SيeFZBY Lw~63“gZ+h`H&-J+O-5È:8rw}k'CRes/ʼ<փ=\)HnG:Eg)s44|GְiXWx;F-bBuAU^`viHFkn4/.b1{D')'=\(jajIORNltM*^ϡ\{~-8bI % Do(qnV2y3K?/T}" 龆0 g묅4 8 /ge\VĤ.XIT{+ Qȑ,;GCA2)Jr^>!MY%O,@trFlY28s뷾}3bX_DRvN;V( BM{b_ ![0:񪪚@5M`%]S~q/.'b/>3~_Pnf W/wBl۾Yd-威VSGxwq)0bV%-k,surp[BX덱߸gGoV0b%@%kl|Gb5 jnc`@rL9γ 3 ";^fPlX-(lYxǨxiQ+ng#*4ݼw,\kAtPe_? 58S2lZgG gIz;ҏ;=zp Y;;Ry}^c46ס&+EE%‹dwćendstream endobj 57 0 obj 4281 endobj 4 0 obj <> /Contents 5 0 R >> endobj 55 0 obj <> /Contents 56 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 55 0 R ] /Count 2 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 53 0 obj <> endobj 54 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 75 0 obj <>stream x330R0P04W54T06P04PH12213s`9`9adnѐכJ3 endstream endobj 59 0 obj <>stream xMQ9n1 i[Em(,mJ%O1᥎􆅷6觟K!|VA+̄󅬓d,)" J`dkX1'\5|Ӛu6:^!눅G>Nð@p:zx'zDZRɐJeS֥LBȤl͖IascC6{U|9\}򕽹>stream xEP90 Ν{RtrVrPt1 WC0) o&aE2nM< 3&xSa5hgw!dBV ,-q<7*ܿ M̺I%U\Q~/ yYLmOveTVg::nϋ8 endstream endobj 68 0 obj <>stream x330R0P022S546T016V073PH1\00264CbBeX rFMJk endstream endobj 52 0 obj <>stream xE;nE! D{V1u*(یJ)`!&b&-a%0w ˂iY  !AMg8θk'BYԜoLiG?CryH>C^gqDQ|'YF V^o v6gtd}{ҾSL9tRL8 g&NN=VKq\t,?D"{frkvU endstream endobj 16 0 obj <>stream x591 D>cMyh_=Iu-6~{ZI",jf:V |L]7e tR6ֶiA֚V1nŲh)\txz$AG~v^(ʎMጻ*9N\tHm6T.Ȧb q5a5&'7k0a"H+*xrE'KVR 9p,,mb*&CZPG蹭;ˠo '"EUp^(q(Ҥp0Xu;9h㧕T+/1"?_?, endstream endobj 76 0 obj <>stream xMO;C! s ϕ*Ck*u@v;㩎^*xçP$s{ٱEƀlk7Lx4(x8D ͳ&d#4UK~+a =7>7UBfRfsA; e8goy? 4p endstream endobj 60 0 obj <>stream x-Q91 d{&*6&!B8b"6.Yp5)2 jb,p-t:XGpzHNA̱ÖK Y6m1x:A{Usr9g;*II*v[U()5)S>VqYkFx292].wASUH ٧ofL>stream x51@E{PbO&myߤRG͠ jPn3kBu޳8☭>Lq-x.; endstream endobj 25 0 obj <>stream x330R0P02F @V!H Y&@HȂX0 DTIMWT endstream endobj 69 0 obj <>stream xEP10 ͝0c'NׂkKg QCw3٨Vfsdh Sa}l<7Svpg@~L)Ss6M'U@=ײg-i,<Zd>R+^Ӎ:}}^: endstream endobj 40 0 obj <>stream x330R0B]#cSS L!Ő IR(+M t endstream endobj 17 0 obj <>stream xE=!{O1u*=me5 $ ed|(ϢjQ}btq`(* ١^#rOS%:X!s$%< mmg{ܯA1" endstream endobj 77 0 obj <>stream x=10 ws${RtJVNlR"@C7s#m.Zґ ؛Ǎ,u.0Y덣C] 2\uNz7mEI4-ۃ1/iC\Z4Q|5oZAqI5hyk3hW6I endstream endobj 34 0 obj <>stream x34U0P F )\`%[ʕQ endstream endobj 27 0 obj <>stream xEP=!=ENA62L^?y3j*N Wz~ƙS*ˤQ0tc0w+=ne: endstream endobj 70 0 obj <>stream xMQr1ԩx=I+vhSX)&ӷ 3&?B\("P%dK)OI\dn-],Tm* _quRhZ}A0cn97P0b6wUXnp☼W{7b؆F:8٣u՞,g_ړDW@!Hr,'W $?`!c_rxޫ\7ΒWi5}fQ endstream endobj 41 0 obj <>stream x330R0P02 F )\@>L̀,cSC$625pD^ endstream endobj 18 0 obj <>stream xM;0 Cws'e'EkeM$A'Ew85'i"; ֎ T!cYxDbn\G+ۤ0U邬䕀 YnƼڞhɵ3 endstream endobj 78 0 obj <>stream xER;n0 s y^kI9m@,S.*CvK)R+m%ߍ"KRkH늑pɕ[;.q2]ak?w`fed +̛B)mu)mV^E YP|vTg>M9:`p]}Ha4'[ͮx$!s;gN GAq endstream endobj 63 0 obj <>stream x330R0C.] endstream endobj 30 0 obj <>stream x330R0P02fF )\ 3 &fY Y " btXP9$59\iZ\U endstream endobj 28 0 obj <>stream xMP1+C{ԩpCd m.X0lYҧ1Y5/RP!{ xN %{SE X`!.`H 5{꦳C+U,-?㉙_{R:FW&: Uq_boWm84 endstream endobj 71 0 obj <>stream xEQ9n1 N mHyTMM)'..|b+%D=9D8Vb&+Ɨѓ͢+xa5]8X鱲V@ QMXbFBْx3<}SI;K ȸCt0z%CE[Jw)Z!|!B*Eb[qqVhk?{ub?*\ endstream endobj 35 0 obj <>stream x51@{^AmEN8?V&@\/i>oП^')M{$wrDSzU9| endstream endobj 19 0 obj <>stream xE10{^AmE r[p;15`NEOӆ)fӆq_v]uUMܦr^q! endstream endobj 79 0 obj <>stream xE;0{NAm3}xV_de<]:o rYByG} թK+먗 tN endstream endobj 64 0 obj <>stream x5; D=u*jIEm2JL~׈0 *O Bcx]1$m' ?" endstream endobj 42 0 obj <>stream x330R0P F )\@>L̀,cS$1T0`XJҴC endstream endobj 29 0 obj <>stream xE;0CwN pBT%DMI IhE:_J ~Z0H,ࣾ5h!`3z endstream endobj 72 0 obj <>stream x=10CwNPϩj_ !X0—kI&ʦWrzvZbL5)w,69# endstream endobj 61 0 obj <>stream x=Q9n1 :|gv߆TEjFWSa*/4NN o=/O>CγOSB2!(:OUYl8i=|u]*W/+LJfIѬw %a4XJ}`S6:S,wssaH#* !-|2mqd. Q襚$HyRv`f`Qa#zMk-X Qq!Q~bi endstream endobj 48 0 obj <>stream x330R0P040f F )\ 3, :8HCupiq endstream endobj 36 0 obj <>stream x=;! C{N: 'TocCf,!=p'2jqfL|xp:LVb;B$0-r$CcSa{.:i%Vh;T'bSѡ] \`1J0e=D \ᵏnRQT}Bw4 8X endstream endobj 20 0 obj <>stream xE 1 sU#>")sErW'N8KH2j99jռ]\\zDHzELh2qW㐏٠ .2Ov۞_~/6m&Y endstream endobj 80 0 obj <>stream x=O9@ S#E{@T-#<Ҝ+TpƋ~f"Ҡ&:\ϥ()Z5BlnBQ[U^ a{IDrܻoPZa-L郪2#kk_z?D1> endstream endobj 65 0 obj <>stream x-Q;n0 } XIkI!FTjM;.O[mմow:]iπv1s^gĞ3UVϙ&ߩ TFfcCD$X 4i3THb?Q3Li;اpA,Ɯ Ւ4 e"HC݇ _cX=T2ДHym SIcwI6Ym-}ET7 endstream endobj 43 0 obj <>stream x=0C{NeKH>Ir008lR%B-uIl4Qf^uiEu4iˑ+w endstream endobj 73 0 obj <>stream x330R0P04T546T067S073PH11s,l\!ibY!, Ȝ9\iZ\u) endstream endobj 49 0 obj <>stream xE10w^BNkU|`HN톦SM1HA=d\_$5Y/oJ5<]j$i#ݿ&: endstream endobj 37 0 obj <>stream xMͻ О)\'JƆONC8,V|)>t In"mB/eaL,dכ+Q^M endstream endobj 21 0 obj <>stream xMP9n1 [{6H6f0H2)jOĞİ[FQ=-{$dT  [aaԯ!l* 8ŲH^LFIZ0~3\VjGpYHw$9ʾ/٠Qe`ɍO<5D`YlsF3we~"ݥiY!1xŒJw":)f35r:}jRaZlWϟ{|_[. endstream endobj 81 0 obj <>stream x==C1s'rWuj$j',l> Cf%&c)z%?M=z7] 3G aL,Tr;*!qf6юb^2ynn;HB Xʈf^^ۊn%>stream x=;@ B*_X[ (G]CK' ɳF74q-2oB7J2 endstream endobj 44 0 obj <>stream xMͻ 0О)S'JoV>nNiX4^ OSZdʗT4D6 lI658˘k= ,% endstream endobj 14 0 obj <>stream x330R0P05Pе4R052W07TH12163s`9\&`e9\P9pe9\iZ\&"u endstream endobj 66 0 obj <>stream x5Q9n0 )j <氷Dn.E{Y 3A }r+aS{=!74unT'dHʫV,z©#ADQno-(9iP^^5((ܽJ7 U$v 37$Q9ʰ9H7C!`\T<5}-|l=Z`S endstream endobj 50 0 obj <>stream x-1$1D>E_Pj`&8c!^Fl&*?*=RNYe3 % "A㙣ܯN\-'F3l9!m%]xEQx6A :UyJ/pihw*DPjLfʇz<~b8dluhx yfdĥq[KEijJoi#X>LkaX\m~mV=砢&v'h "Gw&|W~$;H:4/6'8- AMkRX~SM /F}~ 8} endstream endobj 38 0 obj <>stream x-10@NN0bqS}-Q5Y6Z$q8Q.Wx4* "o}3g endstream endobj 22 0 obj <>stream x330R0P02fF & )\C#c@Q*W, endstream endobj 74 0 obj <>stream xMPKN1 Y#|;9 Vp-vU86.#*Y[uR-_\eCq-CLQ-3,+xu[O}w!q84pl^:Վ &TmޔԼDž?䰭aEHA8ȃ9 H8ʍ.<{]k*D+=Ff(B#? M7I5bE̦)2kA5gWypI] endstream endobj 58 0 obj <>stream x5PKn1^WIy&#bam;~_u;8湱a-Od,wl_[XUvF1b#K\WE?]d-sɨ%i|̅O) nS pA"S">oa`u | "ۘNZW'BݑIȴH?15USZ endstream endobj 45 0 obj <>stream x=10CwN JEωĸaS;xf^4H\:=Mvb Y9= endstream endobj 15 0 obj <>stream x5P 1 =<߆qABIyt.[]om[bNkO0"{M]Bŗ r5Y66jg15Q2X<KWl& >^ӱu'<(5p%dz%J`3-%:9Q> 0 Lbd&q>stream xEP91 TI&m:3)lɈCf <*9! ÖP mLyY:_`@o|qLAlI4PnVV[Ʊr0dYO!+P/:==+wFqR +ְ,V+=\_&8 endstream endobj 51 0 obj <>stream x330R0P044& F )\ 3 &fYF,cC*`iE9psҴy endstream endobj 23 0 obj <>stream x5;1#ӏjAV!cRӔ?RY*]R~D*'JVJzH[r&yL"2v_=g=⾧uALGqTY\ܮDi7A1h]=L4a=k&/*zLuL=. 4:18s4 [)8ҷH<[ucغ9cוij'SQIs^Ec.m msYA/ "ncaƵfR,fw( w·=KK(XC#c;7, {tOz}=m{ endstream endobj 32 0 obj <> endobj 88 0 obj <> endobj 10 0 obj <> endobj 89 0 obj <> endobj 8 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <>stream x]n w7Ir"E^ /@91A\n7M҇m$45M7e%P>'=-&eZ~j..}g{-oNhꍑzd穸t#5,(%ļh Z ` k zBe(Yz3 `O# CuF:Q{f (P"3uc9^s>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-557 -374 718 1058]/FirstChar 1/LastChar 14/Widths[ 602 602 602 602 602 602 602 602 602 602 602 602 602 602] /Subtype/Type3>> endobj 92 0 obj <> endobj 93 0 obj <>stream x]M @+MlҰ.4FaQ .X.y3o8]&k"&"ƪۃhXŪaGeë(y–WQO ݹ4?99=lURoq|v$i\G endstream endobj 39 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-182 -235 1287 928]/FirstChar 1/LastChar 5/Widths[ 295 748 770 632 685] /Subtype/Type3>> endobj 94 0 obj <> endobj 95 0 obj <>stream x]An0нOxfDR1`pnhP,QYo`lRGj/^;oӯv:OzPt[szZ ގ?OhnsƩgz^zhOYbey, gP5"EQRPrB9Ԉ SH(O5"P5"CR#RPN5"5"=j5"F$I@DR*iFV7V7+uқ(*][UMJݪfԭJoY[l(ݪ&ԭJofWnUzVQUË5^s J0Z/ln5z 04ҭ2Z/jṷFobZ/tk8XA)[nwkOyx csz r0`׵aW9p` endstream endobj 24 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-4 -235 606 928]/FirstChar 1/LastChar 51/Widths[ 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602] /Subtype/Type3>> endobj 96 0 obj <> endobj 12 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <>stream x]O10 ]Z Ѕj8(Nߗ,N>˶uGֱ4%"@cN`Bwޟ@nR6jˠ745$jjkAl=0é Yhp\b$Nh) 8/ S% endstream endobj 26 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-18 -235 606 928]/FirstChar 1/LastChar 1/Widths[ 602] /Subtype/Type3>> endobj 99 0 obj <> endobj 33 0 obj <> endobj 84 0 obj <>stream xeUkTSW!&\%ܴGjZ^!!! $!$G@ Bx"`oemQLikK3]?wuyo61mY&oBMrqMjt:fP̍(u*kj;k>yv(afɗ`Ot ]PUqZs%K͕+W D2$bp)U(er{µnT.K<(##3cn43G^"(|a·-{ug BH.q hdi,_1 gϘ  ÞŚW:,[6b X"{ۍaa+mƸtXCAQA*f}Ξb'F 7 $zT]Zmb?ǟg0|LNշΣX0}$Ha[MF`Raeš.XH*pC=*FL[KNXE2X[QH{YbCB m"3*ǕR\)G O5ƿ&;mopV{1bY{E;s<ՀW*4Aqp.ކ7J~Pq9C_XKaM_{B& ZEu=awOis?s(ZͰ0 f*^CB6Zɭb8feEnֈ7H98<2]8> %^ _3U N\u]"gΎmsh劉\]+HHxK=a0d|gFp(CҺEIE5b0, m֞4Vhy ƿK!W)N&U u$8p h=7R7>C?=W|Kw\zL]9wsob,RxDR@LhRTAkDK_3C-#}᧞-S"m ,zqLGѱNl|<,*\QדmHnNvUCC 8@Unm)#Qu{A;t8KKP7CN,ނ>*}.dec7 -cR񁂨MdwZGsCYX~͠ë́RZEFmn:@9jkj|GE_WV؁rR0r?|*H>eKݲAo@7=Dg|Cʬz ݎ.1p(|s?eqq m`M>4%,m4U*Fe3;+PZS[@R/~|?H[^FU@+#3*d4M[jt<%Vޅvfj 7j6Uֺk%%vS5yFR <#61<3={>D xz<0*Ҽ =>E4\H K> w6M8Fb :Y]ŝyAhImj.`4dEpuz% u8_1mx9MAGa(-[=t˄9nF:ue7 xmMzܠL)Dυ>og9N(=9M2RYQ ڗ4Ԍmh'$2ZX1 |uՓ5x: 5m7wDSA憮:>g]!904G^-JDHkv pKmݭ.;M"ѡf΂!0z `z^K2qE:l5)5o4RkW5&[lG=䳸Ok=QC )(r#Rj K!Lbȷ` ΁G8`L1cY-=jErDޜ@_oȗNpo=_z%D'ٝ`Κ /u endstream endobj 11 0 obj <> endobj 85 0 obj <>stream xuy XS׺!ٻ֡#؄ZV ΊS+ZADA 󐄌0-$$! 0((Zgmci9צ? sIkx[a.+HKOYmڝA/FAxN`JT3gL0åfƕN͆` Iɒt%/]}#Biщo Iɢ  4'"O8 O{+W-}~D&S A{:ə,Xʴ]\wx1^[ 7f-ϝgww{Ɇ7Yt޺c b9:L|H DqI'!|]"M"${bŸxXC,!kD.q!#}vbD' OƒӉyF`4b31`[VxX@!D ! 8Qb.#KF\U33.\NV*d*yM}itjee33,YY3g__ {9Qs&]\?ͽޚ>vr{wW !?;=揺wt/por\pdW.C6.u܍L߁۹HyLs_ = }.1y_kSve(1EY&Я9vQsyYltbR)a ɲ4We|meɆ Tin@%͐BͬYtJ|J_u0$:eʜ"mFjA$k`ja9٘_*B6*rmh YT$Oˁ䔨iPYYiq7O] mKTS)~י̀j6ʂ~*y`>%162TV)I:Y[ Q$ | M'ldp>¶݂'$X3PߣY-GLu3:P+~ۢ2 IՒo]9.80+:Blм'+ de[z 4'(G>WX@$F#/6ja+(n.y1yZ3BZCСկog ~@ձN%آ|*R:#;f'2ӱK6g1'\ ǙwA$T*6';2ܥ}=fR&KP6]Bby%NMEr?KuW^LQ=k=azHq0(|Wۜt 'E>wkz:')0,Oh5%W|PyRc8 e%MFeiM}C'K"rT..5M0$@jMa˅ʠ߃\I:H؜@@!KY6 YOm+6O.e$^hZfB}\7+t@t{4WH> XGwo=Uߟ)L:}赻XgA%=f=eŸ\,@EG'd^I4FW&ˋP=Fu$#ۓhiz½$dFVIRՉ Ά~tH[07:$f-i@̑7P&-JmT!KJ 1Q:BtC<k!yxH.WX{Sr"JqI5n4u$b[&kio)\)&{  QkrKYh=G}$'?rɱ1-ENT%@uS܍g_ Np2UZ摜b|LUdW\z`.ꭃa„Hmɡm=rD!fV#~ݭgѹ !͠߆ܐ-?p%WQxWٹ-К DH0) \Ġ=os͏;{>ɲvwmfCoJ( bCB څ{?EヘUL:6g|1$wpϯgǞ<>4.@@#֭?\ JdSZU*Zf?u$$2#Y\Bzc7"%x]Pe%+r E"/ -_)@H6e9[2?G0 >Ǻ73~)s)^!ždo뭱)*@٫?"L ˍ.@ynv۩S ބpv찶9ef;LG0<LCWڻ`Pޛr|xmr*6 zI ɝ$XޢyQe7dV)ti2# :,yqIC+~#&n;Jf2!OWhUp),T52\!M=&tgCU d3S?ǟc!_xis:cqaB#AFW: \`>4֤7͂JYkT##X-.`ъb8[+kf4߁ُtm&Le(%RbJqBD"%*@ȬPd8a? hb2%vݴVt47(RDx6:H sRL>5[֊/SXJ`ʂ9!snιtlyPfxX]VTy?{?'D%졂\[>{ddon1d73|Z0|Z-pE&U&7ع0֊%L:-(^cK^8 H8 <pNWHprgaxq~oSN+hs4Hc!JŅBs#tӽg; sfTQ<3]g;vwY2*J,Fg2xUJ嚜BCLnrzzRRmzsK]mKsz]"ּ :\>_8 Lv~J%ŰටtXݏ0i\bL$B"F4De }y8+HnE1Z6^\aodo__G/sk']xkJSv=v8FB 3j4f՟VnruܪKxOW=¿<%?Jnu WicAoSVPT=}MM!')-stXSrI<ȀC, {*s'W܂.?GB6ԡiT=[ 7&h3]uv+%]#iBEgv*sZ-OtLL>{FB8]65u:_UAZ`F͆.nedoA=@NKz΅y-Vy_`1`r1uM0)Bزx;Xa#`Ň>$@K J trN R D;L`?^KFZRk L6tL+29͑˕{ţ=Hebo6_<v?4+` G&&k+3b,qyDfC&l;@p}]t՟N3'b2mum n]hYFvjL 2m*yJ孃j͆QF9LFW bX/YBxK5Th&>(,w푑u@~Uz\-kx 5T|(3VA]OANObܘ丝H!!'Fe#}J&p(FwI#.]yK>wAopre P,<">f?ۂ}Yu5Ң"XT TS{mC$ZO{,2#K (NpၚWN^| vB^N2M !a).p05ժMt0&9[p1|A $lMRO2yh&:`l Vgkhqk8MllJ_xb6zqm @Ve0 y_b &-RUJYr/iP ,j1VPh;=ZCl%Pk 2F&),z>A-DG;ήW2?>_~kѕ;O!BwQv1F̠]$()7 uCU]^B[ϩ%6үXVQldO!&_nߔd#SJD%jLJ$~fCئC $=}$P9]3n?Yay%# ~ӜKPƜpd%,3pv}< B̐^5fEtF;X> 2)$4}C<}aYNmS33sF!&/r:7txiiZǼ,o(<'}'0g\Ȯ%:CW,S (H]T@!?_@2}` lMYRCH_n¹(WF=xz̘pdE ա5Ι3>-dj|$_ TTV^SmX,Eg4H Uj@Xm2sAxB_R[;l7 z3hd2")M*JPjy$7J`j+d,eD)0ŕ%dJAFֈ+㺳ـ˲S9Mڮ0kxМR%H2JcJQVVn0 e]NG+& k K(<9"25>& W5R(qy4vb5)ov؄5m.a5;&FP][l$؅y: Wq}^8y\bƤ 85unX/+1P^'EMNǡ;'i)3ϊcDGҍ^foCWFϰə ?"A$ppCf'.FO\FѩɎJik"y:>f"f4q}`M{B&NTxws~RSR[ZRESTsοܱɂ f C&. \}?CqlLE ,L!S;Ρ+ Zq?~$'\?BˏNҨ߃%у=ag.3`^H8+kMP}zP$ xݰ s2 '-τ]c$Rܸao_NPz2h% G]ɺYvQw+#%͒&퍢Z׏wϙpoYɒeҒjCU)5FYD\nzv,G^8NQO8h{ΟYU8Al4 ZuL: UE)rJˆᎯ{Y ǣx鎚<^ߺM+֭]ȗ"7{[R+[)[gO} ޚ%NSfvI(yQRRmsaTݬԁ;^HNN)҂n+ޓ{np9{\à`[r>J ߷1Cw=i4^7ĶZqE7շGz|w¤Q,%C[>oӓ0hYtjP$JN)lpO n DXxY4Ҙq6㤮i7U//5_kwn3UϘI6P~ endstream endobj 9 0 obj <> endobj 86 0 obj <>stream x}V{Tb 'PIB bVף*U.p $HHH /pHVZ]ji/ۺug^wξO涳쟜}.yX"bJIJzd9s `Ql$Wla|a _g`l+ֱWSRD!]flغuHFT+O:BVJ3 , { cbh mbX(vۃc$慱0_E,b<%l1+ձpV mˋ.;=T9|SD%?Z*{?yT9JF=ЛMeQ$Z匜n2-064Q^xX`ზzg߁TVM>nLޱ,7X+@eET6L)]=!ۆg/64T4pPܹS((T&wQs}1H$KLq&B K hAu]CC={`t4ΪS8hcO*n X?5B |9rl*HYbf?9em-1 kLt+ebcpQh%&.yaϧ3B=*bjJI"^P z廕Dg'Z" r=mAQ+065K.0Ny};N73(fglݬߎ鄨{(]ϝ71ƕV1 Т"$Qg!v[''7HPZg(gـ܀P drFÍ=,*.%+r@2h/q!` ib[4!(j \On Q+EVA-JUQW@*~- 5Owp+i&A (_f8@ ~.5O߰v[+io cZ`~Sz\|"+ qEcB_Qxu wM$zA|fWih 8ht#ův5 eb E9@6^-N5K&H<G%;0UM"7bc| ^64YFSޜ(hWBǤ'JHC_*M=\rd~FNqw5^U7\+oN vuI[,)M#Yu_ͯ~x M_z9$;36>l>< WOcH/t奉3C^G;]v!o e"'ڥ夜<{ɷ47P=>0(/-(=e2&1&CÛL~ti@:̌'{V'醲nôޜ䑐TNK]΁nSСomDfY56LBh-gTW$Ӻ+jvZ$-g#G h¿1O8x p7%ŅE)I37F4P*!![<}{G dOtȣz3>.@aaWhx|を3d77/g fE3M4^V*M #ҬwbʛCL .lj m0_a -$o\%qUrR<2< 9qaaiȦ40r2Jb }~o|v>%Uv.Nl0 9)M:^|Nt;R]$Ȣ62NR`n}5Cȁ)@L:t05uRλ 'xwz2N,+Ghsϧ V% jRm񂑌>ΑהF5~WBv[-Gca4.Yz1Ο_5w$w ?rAӥS>p9]7:F]7hmT 8n/(v}|S endstream endobj 13 0 obj <> endobj 87 0 obj <>stream xeVyT%$fjQֺ**PQAHlLr $ ;(BE`i]֞g_w^{c~{=3޹\6q`0bIyҭy&efm,LD>-bԌ ԫL4?}֫X|ݤ &ΘhK PUw͓ 99I;Ο-_\tPѺL8[&Ew<4SVR-ExŽ 7T#o K(#]Fe[sQe:lѯf{ !8)jMׄӨcE`LO~ψo 6DXv 0አHK8|f64,d(2i SŒ{ޡQsbp㫗G.W7$#4(y'[}`# {%==:{8>~Pt!r+!h*x9PY u Do61JעG%;hܯ8A h޺+c:#)v-(ĹUZuSЉCBn Zۃ*3bE BWֶV{dz*.A_c Ssxl\6k9/X` (iAޒ@Nhhו5΂*΁uH$~vp8.N\v15-*b:|6NݒGy=0mhxv#?MxUWwMh'e\N ?ͻ(-GV\'Ldp1w<\)%R"+'S4KE1oLJt]rͬE h@p$z<raR/ Mxw"l/i!}Ֆwa}H 4"`JSw;fI}xMxe/}Hth{̾v{rxVԨ S}B5 0v> B:줍(3mB^X_Лպ{wFl4xt>=FN՞q0-=A柇RҵFo1J8G ǫv݁GݍPsy[$^yݡL̸l bz^7g߇o}ﳇZ$=-*oAڳ?tUvU󆪽'oCO80|lP4d8Ck,dùKC-Y{o­cS{/ЂwCYְ3B`fL,ԥ3Z&v͞ԏré KslQ#]&IB&%T;DX?}M67 aIgXYfY=Rt@g+0Rg-B?EUG>;E7U}/Q~E ZM˹Y{'VV[u":&ntŒ-rMf؝$>^Z&I&9񢰦LW. LVF#u M&,l"b.5hKMW v\~qk i7aK:"D)Xl:Sb՝!d])<{lgKz;􊰰/vm|n(S(n(6|N 7JsVG#RP5q>`';58mSrc `9pi~ t%-Isp{L4B4JY5zE xv 0r2fPi}11n3 3fMSiմ|>aOp Χnm}%BW蓐EC:@>k"R`dwut8]{܈ឦ2VkYR9^_?W [-$icS"_/>"LꁂCvTx\ȭB+׼B7|Kd)l;sد' .t'!m]t J R,/[YweVxkG1X,wE*hݹl@nG@=]$޺fbEI>6(˖i&NsEk,\DrTd{ >J;Ϥ1墩HODؼ$4xٱSm mvMM$SV ՚S]k|Uڠטm#|b.֫/q0b-Fe]\fwvdi[7n1B&,AȤ!ȧS6̏7nnPМ.QBp_8Δ@T/4 endstream endobj 100 0 obj <>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 101 0000000000 65535 f 0000012363 00000 n 0000050001 00000 n 0000012297 00000 n 0000011975 00000 n 0000000015 00000 n 0000007581 00000 n 0000012429 00000 n 0000025955 00000 n 0000041298 00000 n 0000025093 00000 n 0000033511 00000 n 0000029945 00000 n 0000044867 00000 n 0000021839 00000 n 0000023663 00000 n 0000013827 00000 n 0000015397 00000 n 0000016617 00000 n 0000018134 00000 n 0000019709 00000 n 0000021013 00000 n 0000022812 00000 n 0000024337 00000 n 0000028452 00000 n 0000014917 00000 n 0000030602 00000 n 0000015932 00000 n 0000017449 00000 n 0000018719 00000 n 0000017312 00000 n 0000026730 00000 n 0000024739 00000 n 0000030863 00000 n 0000015825 00000 n 0000017990 00000 n 0000019478 00000 n 0000020865 00000 n 0000022655 00000 n 0000027556 00000 n 0000015289 00000 n 0000016484 00000 n 0000018575 00000 n 0000020414 00000 n 0000021688 00000 n 0000023518 00000 n 0000013157 00000 n 0000014760 00000 n 0000019348 00000 n 0000020706 00000 n 0000022247 00000 n 0000024194 00000 n 0000013528 00000 n 0000012470 00000 n 0000012500 00000 n 0000012135 00000 n 0000007601 00000 n 0000011954 00000 n 0000023229 00000 n 0000012848 00000 n 0000014457 00000 n 0000019025 00000 n 0000021545 00000 n 0000017228 00000 n 0000018435 00000 n 0000020113 00000 n 0000021965 00000 n 0000023964 00000 n 0000013387 00000 n 0000015053 00000 n 0000016166 00000 n 0000017681 00000 n 0000018869 00000 n 0000020569 00000 n 0000022921 00000 n 0000012711 00000 n 0000014231 00000 n 0000015597 00000 n 0000016820 00000 n 0000018290 00000 n 0000019898 00000 n 0000021327 00000 n 0000012607 00000 n 0000012637 00000 n 0000031136 00000 n 0000034060 00000 n 0000041630 00000 n 0000045180 00000 n 0000024968 00000 n 0000025546 00000 n 0000026234 00000 n 0000026425 00000 n 0000027171 00000 n 0000027306 00000 n 0000027834 00000 n 0000027915 00000 n 0000029556 00000 n 0000030210 00000 n 0000030374 00000 n 0000030806 00000 n 0000048630 00000 n trailer << /Size 101 /Root 1 0 R /Info 2 0 R /ID [<199E51D107F4202C1B92897A48B374D5><199E51D107F4202C1B92897A48B374D5>] >> startxref 50128 %%EOF Kst-2.0.8/devel-docs/deprecated/0000755000175000017500000000000012277111530015502 5ustar synthsynthKst-2.0.8/devel-docs/deprecated/kst-meeting-04-2006.kwd0000644000175000017500000003744612277111530021264 0ustar synthsynthPK4(/`mimetypeapplication/x-kwordPK4', maindoc.xml]mS8Bˇݞ-䍆%PC3-V-dB/[s$;t |8%[~霣_Wq.6R%V&@2}Z>XZ׏O[ g_w>*j:^a+}kׇaBu2{x;u N6\ƱM|e+,H]_e?Qb/QBi>PieZԶp@){UbIoWk *s7Q~ͯ 7*[x~{4ݘ|p1*J xt8=co֭eͻ'uluvδfesڊDw⨣U14]4ЖUuu~iw[Md?Iuw~û&:6>HQ0 ŕ;hc3ás_x;⁕@Xŕe!͞r{`Z [sJ3+EGS- w->ZV66o%6Ʌ{8Pq }hޯoрhCۉ 7/5\NN'{Xĥ<lP zG1iF6v` ~{faU"򛿿#Kid'clg#w]f܆7~WTkAU7okp9sڬoWjnVoT6;jTjs\6*kjRկ{>9|s;dۭڸR|Y0Ѐ})0?ىG;>x~9f|_s$}Otred7P&{xگ?.-` ջ A`\hٝ2=a@v^1GMy y[pyxm'( pfȟ ׂ7O=m2H'aN۲I05 |ฟ06F2Y7MgL%#0 anɁ`.,1b-ii8łngqqD4"- ֥Gn9 tja_}TZމwxprt׹s ܑ$L0 1ߞ;׋T6W6n\l&~MVB+Jh%Z 7@&nV-ij' N_@U n*AA5ó#HBXWȀRd(X_ 2}}xF%0Ƽ@݄MFA^2tt "}Xj e&'⎅@.3xpBZ"++F&WRR( ~_r)`]"\C+Vbi'~ܙŝӓv*~s;u*N`K.آ!{s* R11:fJwYs/L^9nW 90 >,Vݤޟoܤʅzin05_ca^B<<@YqF;ą qbx<'jh.{.pOX$){\[[DvQi1!d)9C& "+SsC0ŝHn]ݰH^])6A x `b`ks^Z fpi\ǎnE,52D=!IXP`L~U2H>'`=wۗ#q4 ƋW '٬R/>!͊E4R3~X@ N4|7&cqW]屙5'^ʬ9/ڒGV.J̤IЏ(LćZ`(}  e :oVq]UeRS " C E3(,,4,n_&T`G*-T-$fi/5ܓpV$AUjM-6h+N'BE\c`ww߄Ěl `}]nR:!;S5t L{nkth32V °'YӀNw{lY ^M䗷,lpVtbv]%ɢK)N/A]h;IV٥WWY̭$?.)zǗoI#0F$V(!{'. OD NZs1HVX+{l(Þe\jd%=^K*!seJO^u]+,З]3$!v&| D⁊ `>kW"j"Ƅ!Ҹ`ϣ<*6aEnqkyE۫巂vk_/\ 406.0"1wɆ}NM}N^`7oAxe9Mׄyu:.Q$}4}~ZRE/R#Kar`Ń@Ђq-ְ5YHux "0ӕQ  'Luħ z42Ȯ!IDSK/#(pTN.4pAi1gn0h w|ͷ6-nWD f˺Uh0/StM` ͗L]Nᚤk2eAp"~q@$0ͮQ8RBt %[ h#-J( ȧz[]$ݡ/(Pl2?lF Bd݅X\9#eI QSF VVY"wD|eć<ԕ72z#)uCI |+DXiBGsl^&4 D~rf h{kH`R0*H] @$n #p&t#pNf|C0o0nX c`cՂw-$u$}<,Ɣ>}H(:wAw?wH-Bw(99-pz;ĥbəw}yך̗}ʼ=LsOkzWa3ڻ'gP~^"|铮=io מ<[36ȅxA?0'r r r&k>z= nngWOQ Ov$,QϯOQ*h fG+>! 퓇!"&d@9/Jwq#|m-iyIX~g/41H?Œ#P#Fzٷ;G㇭W;[Otk~\b ݞ{mk{}}HpΫ[^o0}݃(xϻ`6EwB<>yfý׳9ї}\?/PK4O;idocumentinfo.xmlQ=o0&{U BeB &qcGΥ9+U.wޝlt,FASIK'bF26JXM_$)}Kf&W P:$('JC7y.Ssڑ(2lQu=(EDX(j^x-d.ͥP+Z*f @ߎIMYq}B+J.UoUqeZG k4(X(QFWɄciOGLӏh~$[ c]Hhrq V@  C/.i|-ߢ_OrlPw^^MrlDsFmWߋu<PK4U!! preview.pngZUXT ] nCΕNaXBIAZBJw̙s܇}41(09 АTd<@@(Cd@ ! !  !z!@@(CB(PG`P F@ñnb"@@ 0ZxA  ,E!P  P BapQ A0(CPFhӂ! 6XaB"@0>Zx P g/B! (I{A0`3fv $,aph8  @`#k Y!lF\E CEC@B!nB#a!A=/7Aa0ؿްU`|s;?w`)&?,ؿnؿ}|bjjK[WCCCLLX@@HoGeuamm ;`p76.p7//mmk+33⺦z8`wޠ|(I坈 X4 qp;N}g4G3N4]$ L]mMAEZRVwNXKIo, r# g! ɱ`11997g˒ʎ y?g-ՏQ3lKhw3[볚*nuWg>Gn=ݛ2 i޽CC˾CL6PY=KۅFN~6}0կ=<.'#(WSF4bVk{+wlooҷH^I$j} /dy~N"+ԏM[N8/PFjP Y)~(Zkv+_X6@Bl!>Uw&~`_0-&!w,v>I7r*  vmݷ+zȿʵަ\9$,]1pnΣ.0UU SvKmZ3.0!V?mbX2CT0̹O Q;rcBPe)rfH"%h&%y5/\KK&[$bA EiD{Y7*ȴ|0[N`f8ڊ^SQ9hT޵%f]{j\=]&}7noz.ڗW#Y  |vpkt< #ow{ &4u^9d!hz 4&K}_L Q=T|M_&W5hz >|[>¥N{mCwmWcʳA;)-u $&'pv=;q b1qUָ!P_,k|E'^W_oEo{WPmE08TL yu]ߌA}B_y/jzR.L|҈2wG$8ҎTXE bEqtU7#>gԟiP),u}4 7,\UEM.&}'IF0Y'h*!ٙ1Z)Lߘw"a 'd˿Y!VU.2c&.<7-JˡB6<[ml?"6EOV54%ivO2(Tέ20DgĆO\dw$j)8 GtE=_ WOD6= D~4J:ꭶV }qe8.oPl/L=O5[UKpv"єx{e)7)tֻ=h86D\^=&${6 `ju\Cy^ ezOAdb};F0U ]^|2uۿ9t)AS5_WgjHq@[%M3naZ_ u&e/\FU-t+svFil!>Ș#wIZԩ|S3 I}˸Sy;m5Ynj%>S @ɞF^zC Fg&:1COk+Ƿ/prTbO:|a_K1Y=ImQynPhNd 0J tZ1hkEY<=p#q#1\Mt'= ,a͋I1NlNIEkғ|E\W̟ yze#V6ooqb?jWyy!+2w]Ը>;D WKR?\V'S]'5T m;4=Ow- w9-qd ç /#_4{NdEka۶j'U *[͔A1V9$Sjd,XFy}GkũrVW-ON^IUK m2 ZQqtj)QQws0C`(-D4sⳌd)Z~, ލOouzΨ"RǑ jgS 9ڄ'UL^EeL:6L&$IJaB Oۅx|6"INZ/~Z3'/wmw7y[iUO|;gepڣ5Iw%Ϋ`g=*1KzvƹFgsl~ E*tu[Q$y}7Ő=MZ\)c jowp:;@a g4Ll$e .j&(*/jfEO jXz%?(:a+nZOc(FOIK%"Ѻc,^F'^˛*r =,|R$*B |7P=R3=9Ҿ銓$(xd(2z#J'&҉P l6hH/441s߶Uů.jRy Qz&xr _L_+hcPbmAYHcmEa)#Y:aFe viWԺkaLrɱưi,iTk\(@60ǭAͥG|+E&G'/'m%}׻ PS_mD_4{&ސklU/XOߪ;Gϗ7U})Ij|S(`?"8i#;M<] uD?pra?\]kkjeXFZgpvKTo1%JE/8UuY3,7ف#\]2ވD}ϛWa#$zՐ<vJ\>{b_\cN*@ SȾAUV[#Sϴk/ 71ZOrDPzU;q"DAҾL*^k]N rZPT%OANqkkCOwcY_Y^Z1P@et8O`vwZNPfH1zuIe?hGBA巢鰸Bhęb+6*~#G[*B綗JZX\]8zNirfh9R .S]jYma:3O5xnyt!ZX{gbS&3bGʃ\qI9>[{$LS)-Ja;G4owZ3(:o/ރ]nZW<̄y-_-Cp8;E* }^ubiY]rn 4?A o(["G!^x Gy~jC5hzSoX=Ǐ,&HX8iYѧvCd'FUI$ԫ!Q?OD:zAlh %RvxPOϸJ}s{nlc }5+ ]xG|RRY*ڟ)ѩk% 4)RB#%jJ\_cV~ HJ4QYL lU_/:''`LXͯͅs}r$i10K|/)F Ǹz3I!j`)QuඅbnvJV/>n04N*z !ޭk{cA1P14ie7TPVvR( hpZCky]\ ayS~<_2rCW\yEND`(#jȤ`JR!k/拳NjLgk̺S8ߤ㍍f;>`;-+W1PcktSr4h5K{lUF,33(^HZ˙^0~$O 8 k'֟+ZHNT%BaLPWI ] jez҇К5Q=[P؈5>5 Z#UK(i?x<վ ʌ(W$ЬiatyFFEh&ŕ @Y6 y|w]5 b0^|~[6U֕MMn)iitΣTvHO?crZ=񖧭O{OJXawm^3Z ^=j(4r:q6#Keġ&7Ź~&Vog^ )2Ty`NPDG1~S,'Zhg'BHU2.~J jzmgy66 ATLdBCY=nVZEInsrMٜb6'Ȓ哭l(WdQ#(h~c2FY kTRO\n3FbX7ƒ-g0-_}o_Ip,6 rmFPA {TջySEcdH8/PvRUU)C۪`I<Ҕ9d{̅{=֊_ٛb!EQ TqMveͥ|$%=~ ԣ|2.C bp|&AS91v/Qưn#zkM(3cƮq?b'H9} $ Ot?C^u@.hc$Ӈ`Y%tj.l!&! A/m!ϔ 5]1Y8U: bP6\4EObԸ-}dl1kɽQ-v'!7ZW)5$0I]upk*q&m 6~!9{`}҆$idLҤsf)^*Ǎ瞩M'#atOTu4NRٮ[ZWSP-6IQiȍ߂>R}|)%U,1*׬YcRŻ QT I-(.iTR=<\_Zgll8m:J( `Nl)0%GO0y/1pLbҖ;G6!V pnXr,q S?S&Z5[riCw8cL|Y&ӵubA2C)` Yj%>Hӧ#F|ZL!X _c, ,uw## L7=A:2pàKk#46;:5`$1 ,#[P>ژ"$G`u`OW$_s>-x|TZ3velP^ѾoH2c`mRI[O(: *&Uqz^$]v>@ ȰmP;9Wy(J3R/)Hؔ7 o ,r9<4ߴ,dثn֠UYh(h1\/w뤨1klpK?||(e4SчrްRvﺊB ,]!w4-akBfO>345d"PK4(/` mimetypeUTYMDPK4', 9maindoc.xmlUTYMDPK4O;i documentinfo.xmlUTYMDPK4U!! preview.pngUTYMDPK >Kst-2.0.8/devel-docs/deprecated/kst2drenderer_proposal.txt0000644000175000017500000003051012277111530022737 0ustar synthsynthHere is a more detailed proposal to accomodate painting data in non-cartesian coordinate systems. Also includes some refactoring of Kst2DPlot. Basically I have tried to go through all the existing code and determine what kind of class interface is needed and then have tried to create that class. Background ----------- A) Current configuration. The painting code is currently set up like this: KstApp : KMdiMainFrm \ ---> KstViewWindow : KMdiChildFrm \ ---> KstTopLevelView (friend) KstViewWidget o The top level view has an instance of a QPainter which is set to draw on the KstViewWidget. o The top level view has a list of KstViewObjects which it calls on to paint on the QPainter. B) One such descendent of KstViewObject is Kst2DPlot : KstPlotBase : KstMetaPlot : KstBorderedViewObject : KstViewObject C) Kst2DPlot draws the axes, legends, tick marks, etc and then calls on all KstBaseCurves to paint themselves. The base curves are provided with the QPainter reference to paint to. Definitions ------------ 1. For this discussion, 2D "rendering" is the act of taking data lying in a general 2D coordinate space (U,V) and drawing it (using QPainter primitives) in a section of the cartesian (window space) plane. 2. For this discussion, 3D "rendering" is the act of taking data lying in a general 3D coordinate space (U,V,W) and drawing it (using, e.g. OpenGL) in a section of cartesian space. So when I say "render", what I really mean is a combination of a coordinate transformation/projection to cartesian space and then painting this cartesian data to a window. Proposal ---------- I propose the creation of a new Kst2DRenderer (3D will come later, once we have Kst3DPlot working). This new object will wrap a QPainter and provide an interface for drawing in terms of native U/V coordinates. The goals are the following: a) Remove all notion of "X and Y" coordinates-- unless we decide to keep calling it "X" and "Y" when we mean U/V, in order to minimize code changes. All work is done in native (U,V) coordinates and the window coordinates of a QPainter. The currently selected Kst2DRenderer determines how things in (U,V) space are drawn to the QPainter. b) All QPainter commands in 2DPlot and the basecurves that involve (U,V) space coordinates are converted into calls to a Kst2DRenderer. This does not affect things like drawing the legend or other calls to the QPainter that are in terms of pixels. This new Kst2DRenderer will have the following members/methods: 0. Normal QDom handling and save/load/etc functionality 1. Coordinate Range. The current Min/Max values of the (U,V) coordinate space. There is no a priori restriction on these values, since in some cases Min > Max, e.g. a plot of spherical data centered on the prime meridian where phi=(3Pi/2...Pi/2). 2. Range checking methods. Each descendent of Kst2DRenderer should check that the current range makes sense for the specific type of rendering. Also include methods to check individual U/V values for validity. If values are out of range, return sensible default for this type of rendering. Also provide test functions to determine if a value lies within the current range. 3. Simple functions for doing coordinate transformations for a single ordered pair (U,V) <--> (Xwindow,Ywindow), given the currently specified range of the (U,V) space and the current window coordinates of the QPainter. 4. Graphics primitives, given in terms of (U,V) coordinates, including: drawPoint drawLine drawRect drawEllipse drawPixmap drawPolyLine Others? 5. config dialog, with options specific to the type of rendering being done. See attached files for a rough definition of this class. In order to support polylines in (U,V) coordinates, I have also created a simple QValueVector of pairs of doubles-- does such a class already exist? If so, we could just use that instead of the DPointArray I came up with. Typical Useage --------------- Here is a typical example of useage from within Kst2DPlot: 1. In Kst2DPlot, the Kst2DRenderer is allocated in the constructor and set to the default type (cartesian). 2. A combobox in the plotdialog is used to select the desired type of Renderer. Kst2DPlot has a method (called by the dialog) to switch to a new type of Renderer (allocate the new and delete the old). 3. In the paint/draw functions, the Kst2DRenderer._painter is set to the current painter. The U/V range is set based on the min/max values stored in 2DPlot. The painter window and viewport are set up as they are now. The Kst2DRenderer._pSpace is set to the desired sub-rectangle (in window coordinates) of the QPainter All U/V drawing functions perform the necessary projection/painting based on the U/V range and the current subsection of the QPainter.window. Implementation (including some unrelated refactoring of Kst2DPlot) ---------------------------------------------------- Implementation requires some refactoring of Kst2DPlot and modifications to the basecurves. However, I think things will be simpler in the long run ;-) Here is (I think) a mostly complete list of the changes needed to implement this: 0. Do we want to actually rename X and Y in the code to U/V or something else? If not, then "X" and "Y" become our generalized coordinates- they are no longer assumed to be cartesian. 1. Add a member to Kst2DPlot that is an instance of a Kst2DRenderer. 2. Create descendents of Kst2DRenderer for the existing types of plots (cartesian and Log). 3. Create config dialogs for the cartesian and Log renderers which contain the options currently found in the Plotdialog->{X,Y} Axis->Scale block (i.e. time display, reversal, etc). 4. In Plotdialog.ui, combine the X Axis and Y Axis tabs into a single "Axes" tab. This is similar to how the "Range" tab is set up. Remove the "Scale" sub blocks from these. Using the resulting extra space in the "Axes" tab, add a combobox to choose between the available Kst2DRenderers. Beneath this combo box, have a "configure" button, that can pop up a detailed config dialog depending on the selected type of Rendering. Cartesian and Log renderers would have options like displaying interpreted axis labels. Spherical/Sinusoidal renderer might have options like display in RA/DEC, lat/long, or radians. 5. In Kst2DPlot, we no longer need the (many) xlog and ylog boolean flags. As far as 2DPlot is concerned, it always draws in U,V coordinates. Remove members _xLog and _yLog. Remove bools from common constructor. 6. In Kst2DPlot, commonConstructor: call range checking functions in the Renderer instead. 7. In Kst2DPlot, Move CheckRange and CheckLRange to their respective Renderers. 8. In Kst2DPlot, have setScale, setXScale and setYscale call the range functions in the Renderer. Remove setLScale, setLXScale and setLYScale. 9. In Kst2DPlot, updateScale: remove all reference to boolean _xLog and _yLog. Simply query basecurves for min/max values. The autoborder option will create a border in U,V coordinates. Use Renderer's checkRange functions. 10. In Kst2DPlot, time functions: Can't we move all this time stuff to a "KstTime" class? We could remove ~330 lines here alone. I can do this at some point, but it's low priority now... 11. In Kst2DPlot, time functions and genAxisTick*Label : Remove log mode stuff- "z" will always be either just a number in U/V coordinates or interpretted. 12. TICK MARKS: there is a ton of crazy stuff going on in 2DPlot for computing where to draw ticks. There may need to be some changes. The basic method should be: determine desired U/V tick spacing, check that ticks are not too close or far apart in pixel space, if so then autotick, draw ticks at locations determined by calling the renderer's UVtoPix function. 13. In Kst2DPlot::draw, KstCurveRenderContext should contain a reference to the Kst2DRenderer, rather than the raw QPainter. Basecurves should never be drawing directly in pixel coordinates (except for specifying certain pixel-sized features in the renderer's primitives). 14. In Kst2DPlot, setTicks: Again, we need to figure out a reworking of the tick handling that calls the render object to find out how far apart the ticks will be in pixel space. 15. In Kst2DPlot, setCursorPos: getNearestDataPoint finds the closest point in U/V space. Set _cursor_x and _cursor_y by calling render object to convert mouse.tracker coordinates to data coordinates. 16. In Kst2DPlot, updateMousePos: use render object to find xpos and ypos 17. In Kst2DPlot, getNearestDataPoint: Use render object to compute the current mouse location in U,V coordinates. 18. In Kst2DPlot, highlightNearestDataPoint: Use render object primitive to draw highlighted point. 19. In Kst2DPlot, mouseReleaseEvent: Call the render object's coordinate transforms to figure out the new U/V range values based on the mouse's QRect. 20. In Kst2DPlot, remove menuXLogSlot and menuYLogSlot. 21. In Kst2DPlot, moveToNextMarker/moveToPrevMarker: mostly OK, need to remove log stuff. currCenter and newCenter are in terms of U/V coordinates. 22. In Kst2DPlot, zoomSelfYLocalMax: Curves return their min/max as currently coded. Call render object for range checking and to get sensible values. 23. In Kst2DPlot, xZoomNormal/yZoomNormal: Use renderobject's functions to compute new min/max. 24. In Kst2DPlot, plotMarkers: call render object to determine if marker value is within the current range. 25. In Kst2DPlot, plotPlotMarkers: call render object's drawLine primitive instead. 26. In Kst2DPlot, plotAxes: More tick issues. Assuming we have already determined the correct major/minor spacing in (U,V) coordinates (i.e. in setTicks), all we need to do here is for each tick, find the pixel location by calling the renderobject's conversion, then draw the tick at this location in pixel space using the QPainter.drawLine primitive. Lots of code saving from removing all the Log-based stuff. 27. In Kst2DPlot, plotGridLines: simply call the renderobject's drawLine function instead of the QPainter one. 28. In Kst2DPlot, mouseDoubleClickEvent: Use renderobject to find mouse location in U/V coordinates. 29. In Kst2DPlot, draw: The KstCurveRenderContext contains too much info. We don't need the x_min, y_min, etc that are used for log plots. We also don't need the L/H/m/b variables, since basecurves should not need to know about the conversion from U,V to pixels. All they need is the min/max U/V range and a pointer to the Kst2DRenderer. 29. In KstBaseCurve: Change KstCurveRenderContext to contain a pointer to a Kst2DRenderer. Remove useless members. 30. In KstVCurve: When painting, call renderobject's primitives. Use DPointArray (see attached files) of U/V values for polyline function. This should clean out a ton of code in this function, since we don't need to do any pixelspace stuff. For some drawing, we may want objects that have a fixed size in pixels (error bar ends, plot symbols, etc). We can then use the "fixed" drawing primitives in Kst2DRenderer. 31. In KstImage, paint function: For colormap, rather than building up a QImage and painting it, we should draw each matrix element as a filled rectangle in (U,V) space using Kst2DRenderer->fillRect. This allows the renderer to morph each rectangle into some other shape based on the type of rendering. Remove all the pixel crap. Simply iterate through all matrix elements and call fillRect based on the U/V range. 32. In KstImage, paint function: For contours, we have a problem. The contour step is currently specified in pixels. I don't know what to do here- any suggestions? Aside from this, I think we just need to call Kst2DRenderer->drawLine instead of using the QPainter. 33. Add Kst2DRenderers for other types of display (polar coordinates, spherical/sinusoidal, spherical/polar, etc) Future Benefits -------------------- OpenGL for 3D and 2D: one could imagine having KstViewWidget inherit from QGLWidget instead of QWidget. In this case, all KstViewObjects (including Kst2DPlot) would have a QGLContext rather than a QPainter reference. We could then modify Kst2DRenderer to draw primitives with OpenGL commands, and all basecurve painting would immediately benefit from this enhancement.Kst-2.0.8/devel-docs/deprecated/manpage.txt0000644000175000017500000000066212277111530017657 0ustar synthsynthHow to regenerate the manpage before a release: 1. Get the latest docbook-xsl package from: http://sourceforge.net/project/showfiles.php?group_id=21935 Untar it somewhere, let's call it $XSLDIR 2. In the Kst doc dir, run: meinproc -o kst.1 --stylesheet \ $XSLDIR/manpages/docbook.xsl index.docbook The output file is kst.1 . The message about 'unable to parse index.docbook' appears to be harmless. -- Philip Rodrigues 2005-01-17Kst-2.0.8/devel-docs/deprecated/triggers.txt0000644000175000017500000000125312277111530020072 0ustar synthsynthFor triggers: ============= Add to Vectors -------------- - triggering will be a property of vectors - add a grouped option section to the Edit Vector dialog called "Update Options" - have two mutually exclusive options in this section - Read from file continuously - Only update when triggered Add to Events ------------- - in the Event Monitor dialog, in addition to Kst Debug Log and E-Mail Notification, add a section called "Vector Triggering" - in the Vector Triggering section, have a checkbox called "Trigger:" - to the right of the check box, have a drop-down list of triggerable vectors (i.e. vectors for which "only update when triggered" have been checked).Kst-2.0.8/devel-docs/deprecated/whatisrightaboutkst2dplot.txt0000644000175000017500000000260212277111530023502 0ustar synthsynth Kst2Dplot rocks: Here's why: (loosing just one of these, while fixing every single item in whatiswrongwithkst2dplot.txt would be a loss). 1) Well spaced and scaled axis labels 2) Well placed and scaled axis numbers 3) great default tick size and spacing 4) good control over tick density 5) rotateable axis numbers 6) Time interpretation for axis numbers (many sources, many output formats) 7) rotatable axis numbers 8) Optional major and minor grid lines 9) adjustable forground, background colors 10) adjustable major and minor gridline colors 11) surpressable borders for adjacent plots 12) easy interface to log-log, log-linear, and linear-log plots 13) Transformable top and right axis 14) Convenient autoscale 15) auto-border mode for plots 16) Spike insensitive autoscale for glitchy data 17) Fixed scale mode. 18) Excellent mouse interface to fixed scale mode 19) convenient ability to change only X or Y zooming with the mouse 20) rmb interface to match axes between plots 21) plots borders auto-align when plots are in a grid 22) plot markers 23) rmb access to filtering or fitting curves 24) exponetial notation in log plots, when reasonable 25) plots can display curves and images 26) clicking outside the plot region brings up plot dialog on useful page 27) very useful keyboard interface: (lots of items here) 28) plots inherit all the coolness of view objects. Kst-2.0.8/devel-docs/deprecated/scripting.txt0000644000175000017500000000403512277111530020247 0ustar synthsynthJavascript Definition: Overview: A planck-HFI reqirement is that kst support scripting to allow flexable generation of complex plots. We plan to use JavaScript as excellent facilities for this exist within KDE. Requirements: - Complete bindings to all objects - everything that can be done in a .kst file can be done with a javascript - DCOP based commandline tool with konsole - will provide a 'command line' to kst (like sm or idl) - Can be commanded from either an embedded konsole, or an external konsole. - Multiple ways of entering scripts - from command line when starting kst eg: kst -J "file=\"data.dat\";field=\"N15C2\"" bolo.js - From file menue - From DCOP/command line tool. - We will not use automatic bindings. Instead, we will "ideal" bindings and implement them as internal calls to our internal objects - The update thread doesn't run if the interpreter is running, and blocks the interpreter from starting up during an update There will be a force update/repaint mechanism to allow updates during script interpretation. - vectors can be referenced as strings (tagname) everywhere too Open Questions: - kjsembed or qsa? Examples: A plot with points + error bars, and a line fit. The X axis vector has to be re-scaled. var f = new DataSource("Data.dat"); if (!f) { alert("error"); } var Vx = new DataVector(f, "1"); string Vn = (new DataVector(f, "2", start, end)).tagName(); var Vp = new DataVector(f, "3", start, end, skip); var Vm = new DataVector(f, "4", start, end, skip, ave); // After here is unimplemented so far var Ex = Equation("[" + Vx.tag + "] * 0.0042", Vx); var C = Curve(Ex.sv, Vn); C.hasPoint = true; C.hasLines = false; C.setYError(Vp, Vm); C.setPointType(6);. var lfit = fit("kstfit_linear_unweighted", Ex.sv, Vn); var Cf = Curve(Ex.sv, lfit.Y_Fitted); var P = Plot(); P.addCurve(C); // ordering etc............. P.curves.append() etc? P.addCurve(Cf); P.xLabel.text = "x axis"; P.yLabel.text = "y axis"; L = PlotLabel(lfit.parameterstring); L.setPos(0.2, 0.8); P.addLabel(L); Window().addPlot(P); Kst-2.0.8/devel-docs/deprecated/RELEASE_PLAN0000644000175000017500000000640312277111530017322 0ustar synthsynthKst 1.4 is the next major release of Kst. There is no set date and the scope is not yet defined. Our current feature list and feature plan is as follows: Pending major changes: - merge and activate multi-threaded updates New work: - kst2dplot needs to be redesigned and refactored Some reasons: - tick interval calculations wrong - merging axes on plots just erases borders - printing needs to be redesigned: - Resize/Revert concept is not workable, and is the cause of the legend printing issues - It's slow - It's confusing to write view objects because of this - view objects need to be simplified - Too many mis-functions and mis-features crept into the base class - Sizing and positioning are confusing - Top level view is over-complicated and also suffers feature-creep - port loading to SAX depending on results of benchmarking - Test with 500kb+ xml files and see how it compares to - spreadsheet mode - This is almost certainly dependent on a KDE4 port - add UI support for specifying X and Y separately as functions for a curve - ie: parametric - ongoing scripting fixes and scripting work - expose String datatype somehow - needs thought/research and a design plan - scalar work - top-level dialog for scalars, similar to the vector and matrix ones - making scalars easy to edit - adding scalars without providers to the data manager - note the UI concerns that might come up - data source work - design and then implement metadata enhancements - add support for parallel (interlaced?) reads - add getinfo() type of function for fields - implement low-resolution preloading - add data sink support - ability to write out vectors in any format - implement KstIndex across Kst and support time as a primary indexing mechanism - implement a default TIMEINDEX field - port to KDE4 once KDE4 beta 1 is released - use fast malloc for data areas where malloc calls are repeated and costly - calltree profiles show this - add a generic system for supporting units, especially as provided by datasources - make fits and filters usable from equations by having them export a hint that can be used to add an entry to the operator list - needs a carefully thought-out plan - allow fit outputs to use arbitrary X vectors for higher (or lower?) resolution - data subsets - write up a plan for this - create a UI for doing this - allow subsets to reflect flagged data (or unflagged data) - allow selected ranges to be fit to as a subset, etc - static mode - a new save mode that saves vector data to the kst file as CDATA - UI to convert from static back to data source mode - brings up interesting issue: no way to cleanly convert data types of KstObjects - map manipulation work - undo/redo in layout mode - must be done -properly- using serialization - also the solution should apply to drag and drop and copy/paste - Barth's combobox idea :-) - Label syntax validator to make label writing easier - Ongoing doc updates - Fit and filter plugins share a number of common algorithms that are specific to the C plugin API. Build parallel API for regular C++ plugins?? - Get rid of fit/filter specific code in KstCPlugins Other possible ideas to consider but not approved: - Object templates and complex object construction - KstScript session generator Kst-2.0.8/devel-docs/deprecated/whatiswrongwithkst2dplot.txt0000644000175000017500000000500312277111530023360 0ustar synthsynth Kst2DPlot is a monstrosity. Here's why: 1) No single person understands it. Some people understand some of it. No-one understands all of it. it is quite possible that there are some parts of it that no-one understands. 2) It's HUGE. The header file alone is 630 lines. The source file is over ten times that. 3) It has all kinds of functions that are unclear or have side effects. Example: setBorders(xleft_bdr_px, xright_bdr_px, ytop_bdr_px, ybot_bdr_px, tpx, tpy, p, offsetX, offsetY, xtick_len_px, ytick_len_px); Can you guess what that does? It actually -gets- some values, for instance. 4) Can you guess what any of the variables in (3) mean/are? 5) It's C masquerading as C++. It's a whole bunch of function calls that call eachother in seemingly unconnected ways. Change one, you break something elsewhere. 6) Too many ways to do things, or too many things that look the same but aren't: void setCursorPos(QWidget *view); void unsetCursorPos(QWidget *view); void drawCursorPos(QWidget *view); void drawCursorPos(QPainter& p); void updateMousePos(const QPoint& pos); 7) Too many different internal states that get flipped back and forth externally. Display and state need to be separated. Caches should not be an internal part of the object, they should be abstract. 8) It doesn't come close to following our coding conventions. 9) Shortforms abound: setXTransformedExp, etcetera 10) Lack of verbosity: bool suppressRight() const; void setSuppressTop(bool yes); 11) Implementations in the header file. Makes it hard to fix things properly: int xMinorTicks() const { return _xMinorTicks - 1; } int yMinorTicks() const { return _yMinorTicks - 1; } bool xMinorTicksAuto() const { return _reqXMinorTicks < 0; } bool yMinorTicksAuto() const { return _reqYMinorTicks < 0; } 12) Passing return values by reference parameters! Evil! 13) Public methods that should be private 14) Way too many things in one class - there's no reason for it to do time conversions inside, for instance 15) Public member variables!! 16) Pointless virtuals 17) Count them: 107 member variables. 18) No design documentation 19) Inefficiencies all over 20) Algorithms are undocumented and unclear at best, mostly voodoo 21) Too many options are causing way too many branches and nested branches. This makes testing particularly difficult. 22) float<->int conversions are not well defined, happen far too often 23) C-style casts all over 24) Magic numbers like 1.666666. 25) Dumping grounds are just not cool Kst-2.0.8/devel-docs/deprecated/Kst20000644000175000017500000000151512277111530016252 0ustar synthsynthList of items to consider for Kst2 - mostly because they break backwards compatibility or require hacks right now: - Make data sources also data writers so we can save to formats other than ASCII. - Clean up data types for plugins. - rework update() to be two functions, one which does the "infrastructure" part and one which is reimplemented to do the things specific to each type of object - move isValid() up to KstObject so that KstVector can use it - remove duplicated tagNames() (the non-const one) from KstObject and make the const one virtual - kstdatasource.cpp : configWidget() needs to be non-const - kstdatasource.cpp : obtainFile() needs to take a widget - KstObject: setDirty(bool) needs to be virtual. Maybe also dirty() - Rename rwlock.h to avoid global namespace issues - data sources: fix the load/create/save mess Kst-2.0.8/devel-docs/deprecated/RELEASE0000644000175000017500000000270412277111530016510 0ustar synthsynthHow to make a Kst release: - update from SVN - svn copy to a branch - edit RELEASE.NOTES - run a regression test and make sure it completely passes - update configure.in.in to set the version number and the libkst interface version - update ../doc - make sure documentation has correct version for the tag of index.docbook and correct version of KST, QT, and KDE in the installation instructions of install-chapter.docbook - update the manpage - prepare for a KDE 3.3 install! Set min config appropriately - svn copy to a tag - make sure configure has been run so that the spec file is created (with the appropriate prefix, otherwise it must be editted after) - disable unsermake - svn2dist /path/to/extragear/graphics kst -b -n kst -v --svn-root https://svn.kde.org/home/kde/trunk/ -l svn2dist.log --i18n-module extragear-graphics - unpack, remove any files that shouldn't be there, make sure docs and i18n are packaged properly, and edit any paths necessary (ex: spec file) - generate the srpm: rpm -ts kst-version.tar.gz - generate rpms as needed: rpm -tb kst-version.tar.gz or rpm --rebuild kst-version.rpm - SuSE and RedHat style are typically generated. - TEST - update www/areas/extragear/inc/appinfo.inc - update www/areas/extragear/apps/kst/ - upload packages and lsm to upload.kde.org - mail ftpadmin@kde.org to notify them - update kde-apps.org - add version number to bugs.kde.org product Kst-2.0.8/devel-docs/deprecated/updatecycleexplanation0000644000175000017500000002203012277111530022167 0ustar synthsynthOverview of Update Cycle Process Overview The basic idea behind the update cycle is that the DataSource detects an update and then emits a signal telling all objects that are dependent on it to update and the loop continues until all updates are complete. Creation of connections The connections are all created by the dependent objects connecting to the source's signal. Each object is responsible for knowing what objects it depends on and creating and disconnecting the links as necessary when changes are made to the object. Processing of updates Processing of updates is triggered by the UpdateManager each time the Timer for the minimum update cycle has triggered. If a change was detected the update cycle for the datasources that requested updates begins, otherwise it waits for another minimum update cycle. Detecting change Detecting the change to the datasource is the responsibility of the plugin. There are two common ways to check. Timer Timer based detecting means that the plugin checks if the datasource has each each time the timer is triggered. File Based File or Data based detecting does not use a timer but is still constrained by the update cycle timer. This uses QFileSystemWatcher to monitor the files on disk and when the file changes the update request is triggered. Requesing Update The update manager controls all updates, as such, if any object wants to update it must ask the UpdateManager. When the DataSource detects a change it tells the UpdateManager who, when the timer triggers, begins the update cycle by telling the DataSource it can notify it's dependents. Each Dependent then requests from the UpdateManager to update, and waits for permission to begin, this continues down the line until all objects are updated. The UpdateManager also requires each object indicate when it's update has started and finished and uses this information to ensure that each type of update is completed before continuing to the next. All DataVectors must be updated before any DataObjects and it continues for Relations and Plots until everything is updated in such a way as to prevent any data inconsistencies or reprocessing of data. Processing an Update Each object processes the update using it's update function and is entirely dependent on the object type. In doing an update it must follow the following steps. 0. Get an update Signal from parent object. 1. Request Update from the UpdateManager 2. Wait for permission to begin. 3. Notify the UpdateManager it is starting. 4. Update the object. 5. emit the Update cycle for dependents to pick up. 6. Notify the UpdateManager it is finished. Debugging Debugging output is configured in updatemanager.h and provides two levels of debugging. 1 UpdateManager based. This outputs all data from the UpdateManager. Lines denoted with UM - 2 Full Debugging. This also includes output from all Updatable objects as they are updating. Lines denoted with UP - Sample Output from full debugging. UM - Allow updates triggered UM - Beginning update for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" # Beginning Update Cycle based on DataSource change. UM - Update beginning for "DS-dm.cur" for update "DS-dm.cur" update count 1 UP - Data Source update required by Vector "V1" for update of "DS-dm.cur" # DataSource has 3 Vectors configured for it. Once update begins each Vector must be updated. # As each Vector begins updating the update count is incremented and when it finished is # decremented. UM - Update beginning for "V1" for update "DS-dm.cur" update count 2 UP - Vector "V1" has been updated as part of update of "DS-dm.cur" informing dependents UP - Curve update ready for "DS-dm.cur" # This vector has two curves associated with it. After it updates, both request updates. UM - Curve "C1" requested update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current dependent update list QMap((DirFileSource(0x80ff448) , (Kst::Curve(0xb420a298) ) ) ) UP - Curve update ready for "DS-dm.cur" UM - Curve "C2" requested update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current dependent update list QMap((DirFileSource(0x80ff448) , (Kst::Curve(0xb420a298) , Kst::Curve(0xb420a998) ) ) ) UM - Update finish notification from "V1" for update "DS-dm.cur" update count 1 # Vector update is finished update count is reduced. UP - Data Source update required by Vector "V2" for update of "DS-dm.cur" UM - Update beginning for "V2" for update "DS-dm.cur" update count 2 UP - Vector "V2" has been updated as part of update of "DS-dm.cur" informing dependents # Second Vector updating UP - Curve update ready for "DS-dm.cur" # One curve associated. Overlaps V1, no effective change. UM - Curve "C1" requested update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current dependent update list QMap((DirFileSource(0x80ff448) , (Kst::Curve(0xb420a298) , Kst::Curve(0xb420a998) ) ) ) UM - Update finish notification from "V2" for update "DS-dm.cur" update count 1 UP - Data Source update required by Vector "V3" for update of "DS-dm.cur" UM - Update beginning for "V3" for update "DS-dm.cur" update count 2 UP - Vector "V3" has been updated as part of update of "DS-dm.cur" informing dependents # Third Vector Updating UP - Curve update ready for "DS-dm.cur" # One curve associated. Overlaps V1, no effective change. UM - Curve "C2" requested update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current dependent update list QMap((DirFileSource(0x80ff448) , (Kst::Curve(0xb420a298) , Kst::Curve(0xb420a998) ) ) ) UM - Update finish notification from "V3" for update "DS-dm.cur" update count 1 UM - Update finish notification from "DS-dm.cur" for update "DS-dm.cur" update count 0 # All Vectors have now been updated. The Primitives have all been updated and update count is 0. Moving on to relations. UM - All primitive updates complete updating relations for update of "DS-dm.cur" Current dependentUpdate requests QMap((DirFileSource(0x80ff448) , (Kst::Curve(0xb420a298) , Kst::Curve(0xb420a998) ) ) ) # Relation Map has been built during Primitive Updates. Update Manager triggers each. UP - Relation "C1" is processing update of "DS-dm.cur" UM - Update beginning for "C1" for update "DS-dm.cur" update count 1 UP - Relation "C1" has been updated as part of update of "DS-dm.cur" informing dependents # Updating Curve 1, Plots containing Curve request updates. Update count is tracked. UP - Curve update required by Plot for update of "DS-dm.cur" UM - Plot update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current display update list QMap((DirFileSource(0x80ff448) , (0x80d535c) ) ) UM - Update finish notification from "C1" for update "DS-dm.cur" update count 0 UP - Relation "C2" is processing update of "DS-dm.cur" # Finished Updating Curve, Update count reduced. UM - Update beginning for "C2" for update "DS-dm.cur" update count 1 UP - Relation "C2" has been updated as part of update of "DS-dm.cur" informing dependents # Repeating for Curve 2 UP - Curve update required by Plot for update of "DS-dm.cur" UM - Plot update requested for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" Current display update list QMap((DirFileSource(0x80ff448) , (0x80d535c, 0x81e0d64) ) ) UM - Update finish notification from "C2" for update "DS-dm.cur" update count 0 UM - All relation updates complete, updating plots for update of "DS-dm.cur" # All relations updated, use Map of Plots to trigger update. No display object is updated until all objects are updated. Current display update list QMap((DirFileSource(0x80ff448) , (0x80d535c, 0x81e0d64) ) ) UP - Updating Plot UP - Updating Plot Projection Rect - X and Y Maximum # Plot is updated and if necessary zoom is changed. UP - Updating Plot UP - Updating Plot Projection Rect - X and Y Maximum UM - All Plot updates completed for update of "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" # Finish of all Plot Updates. UM - Update Complete for "/home/kst2/kst/tests/dirfile_maker/dm.cur (DS-dm.cur)" # Finish of Update Cycle UM - Delaying for 2000 ms before allowing next update # Delay until next update.Kst-2.0.8/devel-docs/deprecated/install.kst20000644000175000017500000000025412277111530017756 0ustar synthsynth1. Download or otherwise install Qt 4.3. 2. Make sure your QTDIR is set to that Qt 4.3 installation. 3. cd /path/branches/work/kst/portto4/kst 4. ./build-kst 5. ./run-kst Kst-2.0.8/devel-docs/deprecated/future.txt0000644000175000017500000002033112277111530017554 0ustar synthsynthkst: Long Term Goals Barth Netterfield Nov. 18, 2004 1. Overview: Our goal should be to develop kst into the premier data viewing, plotting, and light data analysis tool, prioritized in that order. In particular, we would like to directly compete with (and eventually surpass) sm, pgplot, and xmgrace. The rational is to have one tool (kst) be used for data display at all stages of an experiment's life, from real time data collection to data analysis, to publication. As our most important specific case, I would like this to be true for the Planck-HFI. I believe that we have created a framework in kst which is capable of attaining this goal, if we remain disciplined about both UI design and code structure. What follows is an incomplete list of the types of features we would need to add to kst to fully achieve this lofty goal. While the priority of many of these features may be relatively low, nothing should be done to the kst code base which would impede later upgrades to these features. 2. New Capabilities 2.1. Data Viewing Currently, kst is very strong in many aspects of data viewing. However, there are a couple of important areas where it can be improved. i ) advanced Image based data representations: * Waterfall plots (builtin?) * focal Plane visual representations (instrument specific plugins) * simple binned maps (plugin) ii ) UI enhancements: These require some discussion * Better auto-labeling * add-curve from context menu * edit parent data object of curves from context menu * QuickStats(tm) label in context menu * X-axis sensitive Y auto scaling * X-axis sensitive curve fitting iii ) Colour co-ordination: psds and histograms should default to the same colour as their curves iv ) Shift/scale for RVectors: to, eg, allow easy/fast calibration for datasources that don't otherwise support it. v ) Time Awareness (input) * Data sources need to have a (configurable) TIME_ field, which is A* + B. could be, eg, INDEX. The configuration should be on a data-source by data-source basis, and should be cached (how to avoid this growing to \infinity?) * Vector limits everywhere need to be able to accept time rather than INDEX for ranges. 2.2. Plotting The goal here is to make kst suitable for publication quality plots for a sufficiently large fraction of cases, so that a second tool needed. i ) Asymetric error bars: currently only symetric errors are supported. We need a mechanism for s+ != s-. ii ) Floating labels: labels outside of plots iii ) Alternate axis limits: (eg, wavenumber on bottom, frequency on top) iv ) shared axis: (eg, Stack several plots vertically so they are touching, all with the same X Axis, only labeled on the bottom plot) v ) sparse symbols as suggested by nicolas vi ) Configurable legends: * Ability to add text (including latex) * change curve name text * change listed order * Floating legends (shared between multiple plots) vii ) Drawing elements: * lines & arrows * Shapes (boxes, circles) * fills (eg, shade, hatch, or blank regions of the plot) * curves viii ) R to L language support (?) ix ) Better control over symbols * sm options (#vertex, star or polygon, filled or open, size) * png (etc) import * select indexed from a list (V[0] uses png[0], V[1] uses png[1] etc. x ) Better latex support in labels * more math symbols (sqrt, matrix related) * vertically positioned integral and sum limits * multi-row equation support, not just 'inline' equations. xi ) Axis property control: In an 'advanced' dialog... * line width * tick lengths * line colour different from label colour * t type axis rather than box axis xii ) Layout mode magnetic borders xiii ) Alternal base for axis (eg, hex) xiv ) Other types of plots (eg, Polar) 2.3. Data Analysis i ) A spreadsheet mode for looking at and hand editing data vectors ii ) Improved data export capability: * Multi vector * Subsets defined by X vector * Subsets defined by current plot ranges * Output to other formats than ascii * Interoplation in export iii ) Scripting environment * Loops & branches * subroutines and functions (which can take all data objects) * Natural format equations (ie, e2 = i*v1 + s1*v2^2) * String handling * String lists for creating data object lists * Data source list, Vector list and scalar list indexing * Vector element access * Convenient access to plugins from scripts * Script command prompt * Scripts from files * Access to command line arguments in scripts * Ability to extend UI from scripts * Access to timer system from scripts * Full control over labels, plots, windows iv ) plugins * Despike * Deconvolve * Gausian fit to negative gaussians * Differentiation * Integration * FIR time domain filtering * Fit to RC modeled Cosmic Rays * Fits to arbitrary equations v ) data processing optionally limited to current view * Fits * Stats vi ) UI for creating functions (and perhaps subroutines) as mentioned in Scripting Environment. (this has previously been referred to a 'filter sets') vii ) Math in labels (ie, [S1_BOLO1-rms]*2.0) viii ) consider allowing non-power of 2 FFTs (use gsl or fftw?) 2.4. Other features i ) Access to data sources using KIO: This will work like an indirect file, and will allow reading of archived data only. ii ) Embed/attach vector data in kst file (option at save time) iii ) Allow saving and loading of kst files via KIO: Particularly useful w/ embedded data. iv ) Drag and Drop * Drop in other apps as png/ps/pdf (think KWord or KMail...) * Drag between MDI windows * Drag between kst sessions v ) 'Database' system for scalars: we need to be able to turn off the MKS constants (rarely needed in the general case) and add other experiment specific scalar lists. vi ) Make a KstPlotLib to allow kst to be used from C++ programs (reverse scripting....) vii ) Make .kst files a recognized MIME type: This will be very useful when combined with embedded data. viii ) Make kst a kpart: to allow embedding in konq (kst as embedded viewer) or kpresenter (allow interactive plots in a presentation) ix ) Eye Candy: possibly completely useless frills.... except maybe for kpresenter/ppt use or for less serious publications. * Import background from a PNG/jpeg, etc * raised/shadowed/embossed lines and labels * raised/shadowed/embossed bar graph bars, pie charts, etcgraph * rounded corners on plots * Raised/shadowed plots * Use alpha channel to allow semi-transparent plots * Make all of the above themable 3. Library and Class changes In order to do all of these things, it will be important to keep careful control over the code structure of kst. However, all changes we make to the class structure has to be specifically motivated by a tangable goal. As I see it, the following items will require some noticeable/significant re-architecturing. All re-architecturing needs to be done in an incremental way (3 day steps max), rather than via a re-write, to avoid long code development stagnations! 3.1. Data viewing i ) a Waterfall Plot DataObject class and UI needs to be created. It should use the same structure as psds and histograms do. ii ) Plugins need to export matrixes to allow experiment specific image stuff. 3.2. Plot upgrades: i ) Floating labels (outside of plots) require ViewObject label. Axis and tick labels work better under current model. We don't want to support 2 rendering engines. So - the label rendering engine needs to be pulled out of Kst[View]Label and shared by both classes. Current floating label model needs to be replaced. ii ) Floating legends require legends to become ViewObjects iii ) New Legend classs needs to use new lable rendering class to allow equations and R to L without code duplication iv ) Optionally floating ViewObjects requires the ViewObjects to be attached to a 'parent' or be free (ie, attached to the top level view). v ) ViewObject classes for lines, etc must be created. vi ) Refactoring of renderer may be useful to ease addition of extended point properties and axis properties. 3.3. Data Analysis i ) Class to represent subroutines (generalized filter sets). Should inherit from a 'kstplugin'.... ii ) subvectors: For working on visible part of plots * Must be efficient (produced by plots during drawing?) * should appear as a kstvector. 3.4. Other stuff i ) making KstPlotLib will require changes beyond the scope of human comprehension. ii ) Making kst a Kpart will be hard also. Kst-2.0.8/devel-docs/deprecated/future.kwd0000644000175000017500000005100312277111530017522 0ustar synthsynthPKv1(/`mimetypeapplication/x-kwordPKv1;d!% maindoc.xml]{SH{Sr60LMvg\p;wV[j=jMw9ݒm!ȁ@S;A/_Gǫ m_/*%&@2^z>ZZ_{og eg[lim}A]YR__?]G+ qlן}m @^Iɀ[Zvˌc˯>iTBi~{_cvHziVԷjr=QVp Q~<ەzĺJu(oBpvϷ :{yUi)`֍$zٜ6maOZca[0`]-^g2V{^uǭCDgX8^0* I{CX^pxC{s2_v`y-kC5zX>szt黽݋C7yM2NXxħmyfr_y1=ͨe}\PP"dǵax7f'jXaU(Q{\ m~#I4| v?ڻ7lҫ}#w jP=I,V?i^Z1K@$AqF(&~8RA $m 2vm#iRpcV@w=ՠaQ3vCc4 -ÌWpRl^B Luy&@ B/ +VAVh@ELv3]U%I;  ç(DisDh`7M2|TW;x\r…ۑ5 ,'0_KFG}qN$ܤ2o;EYe-\@&AhRVoeتgA,Nj:_o67Nw.T ; [ƸDDBN x!? ă~zA_1*xv 9։6Q#bRAN0O5xA_pOIAQk5Wk$V@k8 5=+ҵpfTfDsq3zۘsSC ^k`;i_d.u:lރOݔ@5.[L}~Uv_ZJPՍc|i`˂Oj?;:#Tf^?ԪJ{ʡp-Ho['̀Y(H:yi9Cy&A\PT@, sjbNS3TvcOk5 2Z=]W0#b#с4f@7[P); U"3K'cwA՗ƪ}q#ϰn'3hA5TIl؅ظ }ٵ("J*8AgLp3^rj0Iaj_Xt$ })ACLJJYbF.˂b+Xqɜ}Pދ,E}U\Q+Rx ؃ԚǽJkLE$̨ DDD(eeœ.lSFr溼>UK 6>Iu6J3 ٟ)gx H^E\ЇLǍ(oچסOLjSE K/!!@X-&p< !LŘ|3ƥɎe驜 D4kf>Y|j}N͙fU2OeYE음a2Z#C Bx!$'Kd9Xz[# Oxr!arg*,6yb 07*5C(Pyp >t os Ҡ0D/0^TCnk{a5C:Q!}ktAl Θ2P_XF&gϡqJ`$0N,c@=MqZ/3zBuƓ9, JCoE_VJA.<(屰=>ʄ:KkG 52<l^[a˙#H JLL D?EP(뻨Mm|Z}qj==\$?Z[9A5" x \9V^+ts"Q.TxBC^GF 8IUn/=W'~-;KX%w?e%Us<k+f,be)B/dbLR7`@p AV 0q~Z1C"|D#իTfo\*| ۤl!̩+5ęj<@ӹD~t*7HYPvSOCg  :'td ѕOp:[܏1 EJ-SzQ P3*^X{vK ,7 VsrAp}qp4C ^-Рp:BbS/1 ;Cqx"Fb|H,qH@%>oR]6"M"MGr l> }nOA>E0<4}!2cj)R; r!D(]q2U j3$/DlAP{%<>™ ե)[DwU2+3A Oivh+c_"N![wFfpA( ;Ã4Ij1r/]\t ,0ъ Ŧ8S˄J MhX.-g^Pjc1{>B_c^Gԕ_.}2iiGԺ6xM 9ˠ[,@b?Q?DP:kr!x~J-KDfaLaE=-'4WU>˯!=XV5sE"s;^21 37:y.B6H'8=W_ϋ>[%g.t e#d`ɠf<)fY', *XNqI$.9qG:Y@DR}aa [ʨdNjI@@؝HJ9_pQt+D(BHш @ViՉp)r 1+E2<2(^ܗ[9VH0R<&QvAg/ގ! li0eb5Oğ?HaC KET O1Jr(X~RAvEC^HА2| 3z| 7B@fm ('au׉#2ƱwL$f2̠ 6LQ&8 !uRB,k ,x,7'sXDSf5--t8 4ĻDƟ( ~  :%PP"gMDz*"t?8W,M~{k&rpv^W3X5]5#Y*v&݁+ @G@V+x{Pi٠h c& Ϭ2&tw/c[;: eczνx=FmW]]'V 2/>-L%a@Z 6nR'k.8ewg?kya@ 1[n1V$f~4wVe+@õW5Ts@neC:T}-3h|6)v,4 =uFVuf\0N嚽s0&e Ljz-/t96dU#•ҼwKu _h/Nf /! 5vrA _gy @[6О.RTYZIm蒇ǑvPT(pU"Yo g{`mCg|vAXTmT;ߡҙdH~%EUj]j,Kڕ3aJ]x_:l.ťy9ek$~ɑR1!쫩v& 8i0`uℰݛlE_vuG-fef @"K^M1LKs!> *c@~.W8:b!xdd;U+*OZa GR~~( [~Cs>i]fjHcなJs}1:ŽDN{!Ch#{ r٥O厲V ^/m+kMơM YX 6xjվ:Ɇ1τWڸ ajW3k6ELx%^^7!)xY*~[e=KyK%>6!b دŠv|g˯SGF(n%91jH(2ɭwo껍n//hw/zMkjݑI!9PA\ 6H83=֝$ cu:nWrF/i'7˧τDOOx=$G"'#;c81֟-1|!|$t,],z}9þu|}:wFrGXQg}1BPfHA">KsCb3y7fg6A"i+6Yeu'eM)ifã9|~6aְ/:iJH_B;mo~"׿x pc ?o 5Hܸc_[ߟȅxE>W*J1=ÿMbqMgF7ADmW*p}I\|;gxpIK[lho^6fvw(vH |!7[h}k}AUF'XhQdPp57aiŖ}R}w5R^:W{wx5|^|4oON:__n/ Čef7_{=zo<|V_P]~cdx'ѼlHEg75}s/:K띵/Wv[իPKv1w[2Wdocumentinfo.xmlQn0 =q٪ʀ(RժeCLUǎK;P:t=?|g鱶CnG g4n7!@y\}$U-WϏs!YRґp8ᆰLS", ZJ^ga;~IGH "RmPTSF e?h6Vb _7}"wBZ{{gzPGט;hc^D6e#_@0P}47CK=ڢ@,7t&?|PKv1qB1?-(. preview.pnguZUT\ ww%Y,Kp ,}<~ӧ̙PVFC!Dh2 ߠ{'@Y^]v    A0зV `@_P @(Ab6VC!@ mkA` AX&  C`Z! ` B(ix%MۤWWf蛠A }:5A` }5  k- A! (͌7^_x}M++W7bBbAߜ{KƯCߌ|:5@諯r_Y&P }m+7oyzk}777зACVV zv{5UB7@7B@?B%?&AÂW /^&"%>6r{qB[;0^fea_[5~'&&Vɭ㧧<|'K =+d$ 6ꦶ޶JwH#c󁁁e 9@V⳺Gw<IJK'"~DF:wf~{ov-&jߐ S_idp[\&O;/ry{Wxo<>>} ֩v*֕ϳP *"/4Sy5T٭`PH@z՞f+zouz-S,*(.?Jg/6/z_.$W]4ƞۆy)lĉ KlO\F-'OnsFKnb dE< dc,~}Lj?o&#?B7J9jNNjEk*į,{~A_AлfNS$thYN/dgal\?%6j^ gyxqW"ϥsvf#%и&e%-A38/ܹt& %9IOӄ+@A>i,;bNHeLu4acamwS)wȬA8:Ird8O*D{?rߙ-tgr<ːTb),+5Dҳw~PP%elmpo7&ѾE"M)R`ZE-(EgԤ@Jz*¤{>g7H-]µtͥ'WZ@u^k?qd S. _ew'RM?\|~f]53-bCrIwՖ6O;Gtؒ۬\*X"]ORםvFyJ j{=2y 6is;ßd'VeA~x~k\}'W5,Jѳ.e+xTe{pI׆$2F6&e߳u_[[7wdX0S3S}B@`/3hgX]N=kx|8ݩ&{/4݉:* ɳٔ";yّZ7(%PP b ^* )]2` ,"2d88Y/"zQ0! 2}_5UeUxRqI;VN*sXeGD{Yu_GN?3uGaVHmV %Lf}|q` ;q¼0 ~Ư 6G3wf`0 ubrzPݨH6"n kX<-à:#LAY[lmc6u):nm g߉V-EzAg}&0bjݖX *.NQhtѬLJu0üOQX`C%\[jgҞٿ@'Aw+_kwLWRl>=x)9 8ܫ%1e;Uu;vD#%+ ~3 }\ r*FVdٸ>'p=9!#LFa3 (D‚zY'/)#w1%bOTe?6-ϣ TJEJ~ok nw(,u̘1)z65=?_H&E1~{zr^vІ@#8zw oJ)Od*lqd~v fi"@|SjS|R'3Ƭi$4EUʞh&_K◲()/f8E%E2"0{:tށ ;,hjhYpCr)O>zAt`khgB©'-3!/q)W7eS+ej`dcZw(NF\勻 5o8eTPܛb;T,{eb\_Eβ*$dpmz.|H2`C[¸1EZ[bdNn ѕ̞ Ǫ{I1ѡT B0OMV t9q3I&hB5kXV3;L"5⧾3_Lt3JIZ۶hA1<{x K 4#< 3TEb@SM\+}OْkR))Frk%@sXX$8WN mZ0x'Krq{:o'`3@Η!-\ ){̧Y0K5(**kQJ AB~nN6 MBoNkS쯤*+R}0Da"mV8(ҨM(㖘?7OjojX9-VBYOWy@e ()z_ԭYE8p0K  qbm 1OeiAHXjl!|池l( Zΰvk}yi̇j q:82e/8-۔hX]NOG1-V^C. )=ꯤLJ'R[1*;{iu\ZCڔe՗{׼X]ۏPMޗu Jݮ|?˥U j>7=*R8 */O<)tW֛ 俋i)hw1F1\˵=,:,C:h|dKdֱ ukG҂iY_6+kYjd" _("4N!&.^/n7lyF%ғDO(ԄH%JP5?!'P&ːMRb.4lh l#RTVPydya$̺?PS&.܎[ f]uQQlX> l+U}5r|D'-$:-}99#0ˆp=(?./F?b`m[I B#a_6`etrG ^hT10 5ṯ5b*Tb>_[Dd^% *>VY| Qi7ϲQ ͯwp'rZme E[gHTrz\OD^aƫu0jZeYsgKj"jF*W e&/vO5VǑ *lΰr_$踋dT,Ԣ?[(< Ge+Z9a]w<ulM*h$JM[Ǒ [0*/l!.?HtĽ:I"jL~SN<+z ߫Mwׁn"W![\SHH+*%H4O9;&feX@gcFi*52.%'هBJ/81I$ŵn'D"!3d ^s٩IY[apy q& ?VFǬRV|]AY,g;Ye7ċ'$z`YՉ^!7|ۯ)ۿj赃,+(+MV>b<YmՐ3r}쪊H5^":s.fF,F-YKA[/c>-| 5$~ηՠF2jmgbݼWE '[khIf=(l=?Ǘe<9*W{Cfu!4Sp k'XCyehs³ Rv!es`5iWjLY, ާ2;z'yB4tif'3_wOj' "Gflx|nYɖ]ݿEɏCQNvVVj2f2ӇG&+ <=>D>U TޕMzw0?#jH2,]ۦmLOa M=n^eMihZ;2uAv~ |k4YQ!0{v>|{DXC42_>/tY X."h;oVtD0`X𬭟ZLZFyjh7Ff| lKk91U~YobuNm_R4%Ĭza!AeAp@. v-kyfvm볽A%ӖV_drUm8ʔօKbśy2c>ցdB"?bZa3ԉmaʉo":xZ~Hn*}胗쟑uY:z-^| Ƣ?׵HE$ZގP}FyjU*VL8 ^%RCQΓ &y;F=mDW5+&/fsBI&ڮp;Ula/ֽ!f[QB_{yN]\CaX4i$VվhIkor|mSOSԦͥ%&R#trW5vgH kh4חɕ-5VF nUYf~DX`r7̆{N\[h{Nm50LfݳM*8{~t.,u u!YN>U]4~PDyihmО32O"e߸e& rBaC,077HIg+N89.WŃ';0fz}y0~o&i d gF$sC8d>/RIE_+FB)l=I؎vH~GlVp,3f]wӾ,ڮܤW 㙡Nc[#>𰠳1dI桪dE,uEB2ϥ~:|v ^4yI1n4 ã'YmIc}cFt @ki%=J)?3Jpm`*euOt53h$Qb, \[OXiUj^7ClOKUF>~"j" RTѯfc42U\{b jz%c4iQ$|<_ֹ2؛N#W I`y4mS])ݴ;3AgB -nkL뺁&'b61RUVSֶ3Glh8xL)nQ-ѝh\ p%&S: LSz$cFi9ɵ_SF(?L0wv H≷L?座T{PVM;4|\ 8L3JP ShdIPfNٿ!T~Ϝ;ͪ_xƨrb ?k' m0xX8G#5 a [&vag=b{_]e-dz'&8e׊y>MyVN<$9Pea}LskT~"U?8R J#/eL7ޡ+ @g0?T"Gx2G>ſ7\:vwaJTLOxɪe fQ1\NǠĖn?ާ830+4 ǽ)&F`eЯ)hbی5쬹4~wcO?'A$t|+^%@@ΓnDXCn@mwuXh C.uj-> ]њjC]Яkl9bh'tO|7m V\|451_ ?UO©Vȍwc[5`u_p"x>J9NggG$ >#J7:8kKKm<%Ea~/=QfN[\# ]P> 7D KT3 EWoi e׮bB@9|䀶ݧ͐ZYf&Lof Lr-o&(LPe;Nj;YNyY*Ŗ&Aɔ\Ƞ!v5KK_"ǵ;~Nbq1;e%V3od4}CH]ćut Hjjpt=}v#pⶪ˘NvRr̜6G$,I y™<t%lzt47-/34&Pn ^,)L1ݳgN4#Q-|\}h>N`e+O':^74VRs]YಲHoy=$=.QKg*gc Ͽ%ZDV W!eڗ $y/V&!)On*{V|eY>M"5Z)l0)e+(P²ًLstg9t ɓCtV[iLarz\p>`l }Y~ևNPźTB/4&r37Ww4Cld3paӑfc+7ETԢW1LP$4[oy->7!RM׺]F~aj-͟hx>(a4KO9fFz_p ҋkeV7CwD֌7{9o` Ɉb#CFl%CأRՑk QUvphrZ__,F~[+pҲ#~j ?g_5/*ka2cm6p^Cwxoy!hI@s} 80K Qo?r˛\П,X7UȣVwydsAҞ18H?cr 1d.wQC2.4ȩp_|v9;RVDAHs@%4#<&]ʙ6xkХnk20o=>"(JWkR@wDB?8 y\CaPEeÙ3B:Q!;M Vqo1ew6c>*;7NiWr *"Rgu94Fc8ة.jAY{m-F^Fb4\8 v'M<+~ۃ4>?xybgkьKoc ;,m[O؍}r"JLXd5 d0SP,_ 8I^^jrQ~[sp43@6&i~=tǍ+Y잱s5@ E)M+, RIN6pCУR\X}mjsd'N[|Qb\ 7?3luQ(i'$ 3˜6펿^RQqb^mZ"H/Os#6>aH]X_*6d,II45m{?8!'aa )KJ $W0s\oEY?yc`$69RdNf@[8bQ3K<j`YG'd; O*;!?g$PI-k'hC-bz hӒFǟn ^vjlm]޳y^VxrIz+#ҜRgHkw;Wdnj{9Km7-N1R2f3)5{dJȜm6m1ň4)S(JSE-?)]ܺʝQμ(-ko 9jh; ]].oe{gŭoMkਉd!F!CN_Cǧ ۄa '!93jB]KELu[/v Ž2nO'u;ᱺ4%TSH\< ZgM1}jRdX-J܊7R"L0YlEߟ20 7{w*㲐i" 78wܫ]o.~G̫ |z2gXbóA$>$M}>+qy~_BO~]YuJݳʛI#n6R}1f 6fzrC*;A r@mO瞏mZ|BpS&M:'[1ιt-%dWXP[weX.,Hge' $oYIEJ1PKv1(/` mimetypeUT_APKv1;d!% 9maindoc.xmlUT_APKv1w[2W !documentinfo.xmlUT_APKv1qB1?-(. &#preview.pngUT_APK PKst-2.0.8/devel-docs/doxygen/0000755000175000017500000000000012277111530015057 5ustar synthsynthKst-2.0.8/devel-docs/doxygen/Doxyfile.doxy0000644000175000017500000020367612277111530017565 0ustar synthsynth# Doxyfile 1.6.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = kst # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 2.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = /Users/dimitri/doxygen/mail/1.5.7/doxywizard/ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set # FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.vhd \ *.vhdl # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = .svn # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = NO # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES Kst-2.0.8/devel-docs/DEVNOTES0000644000175000017500000000274212277111530014561 0ustar synthsynthGeneral development notes for future reference: For Additional notes regarding the BuildSystem see Kst2Specs/BuildSystemOverview For Additional notes regarding the update system see Kst2Specs/updatecycleexplanation How to update the Windows Icon If kst.png changes the windows icon should also be updated. Open kst.png in gimp and save it as kst.ico, from the dropdown for format select "32 bpp, 8-bit alpha, no palette" and ensure that compressed is not checked. Additional notes: .ico files can contain both a 32x32 and 16x16 icon. The current version is scaling down the 32x32 on the fly which decreases the quality of the icon. Future icons should be created in both 16x16 and 32x32 to optimize the appearance of the icon. Locks All Objects in Kst support writeLock and unlock commands to prevent access when updates are occuring. No lock is required during read. DataSources DataSources (specifically the files) must be locked and unlocked when the primitive (Vector, Matrix, Scalar or String) is being updated. DataObjects, Primitives and Relations All DataObjects, Primitives and Relations require locks for the following actions, updating the data either from creation of the object, or from an update cycle. Editing of the object making a change. In DataObject there are helper functions writeLockInputsAndOutputs() and unlockInputsAndOutputs() which server the purpose of locking dependent objects within the DataObject's update cycle. Kst-2.0.8/devel-docs/RELEASE0000644000175000017500000000413212277111530014405 0ustar synthsynthHow to make a Kst release: Create and Update Branch 1. Update code from SVN (svn update) 2. Create branch for release (svn cp) eg, svn cp https://svn.kde.org/home/kde/branches/work/kst/portto4 https://svn.kde.org/home/kde/branches/work/kst/2.0.0-beta3 3. In the branch, update the RELEASE.NOTES (kst/RELEASE.NOTES) 4. Update the version number in config.h and kst.pri [NOTE: This step should be moved to immediately after the release and be done in the working directory, not the branch] 5. Build Kst in the branch ensuring no errors occur. (kst/build-kst) 6. Run Kst tests ensuring no errors occur. (kst/run-tests) [NOTE: A number of tests will report that the test has always failed. However, none should actually fail] Packaging for Linux Note: Linux package is distributed as a source tarball. 1. Export the source from the created branch to a clean directory (svn export) 2. Remove all old_ and admin directories from the exported source tree. 3. Create a tarball of the source tree (tar -cf kst-2.0.0.tar sourcetree/kst) / (gzip -9 kst-2.0.0.tar) Packaging for Windows Note: Windows package is distributed as a binary zip file. 1. Get the latest source from the branch. 2. Build Kst in Release Mode 3. Create kst/bin and kst/plugin directories to package from. 4. Copy built kst.exe and current mingwm10.dll QtCore4.dll QtGui4.dll QtOpenGL4.dll QtSvg4.dll QtXml4.dll into kst/bin 5. Copy DataSource and DataObject Plugins to kst/plugin 6. Verify that Kst current currently from the packaged directory. 7. Create a zip file of kst directory. Test, Distribute and Announce the Release 1. Open the tarball and build the source / run tests. 2. Upload tarball to uploads.kst.org and e-mail ftpadmin@kst.org to notify them of the new file. 3. Update website information to indicate the new release. [SVN location - svn.kde.org/home/kde/trunk/www/areas/extragear/apps/kst] 4. Update the windows binary zip file available on the website with the build package. 5. Login to kde-apps.org and update the version and upload the file. 6. E-mail the kst List notifying everyone of the release. Kst-2.0.8/devel-docs/notes/0000755000175000017500000000000012277111530014532 5ustar synthsynthKst-2.0.8/devel-docs/notes/tool_mode_changes0000644000175000017500000000631412277111530020132 0ustar synthsynthLayout Mode comments: (July 28, 07) Overall: Lets copy inkscape's UI as much as is reasonable. BUT: remember, we are annotating plots, not making icons! -in layout mode, we need a toolbar to select the various tools. Handles: -need mouseover feedback on handles (inkscape changes colours) -need feedback on potential selection. Inkscape uses mouse feedback, but since most objects will over a plot, this is mostly useless. I think showing ghost handles would be better. -Handle dimensions should be fixed and should not depend on window/object/ parent size. (It could be cool to have the size fixed relative to the screen size.) -Handles should lie outside the object so that they are accesible with 0 size objects (eg, horizontal line). -Handles need to have some indication what they are/do (like inkscape). -to get to rotate mode, you have to click twice, which is too much like a double click (which calls up the properties dialog). So, get rid of double click to properties dialog. Instead get it from the rmb or from button 2. -On resize, you should be able flip through zero to mirror the object. This is especially important for lines. -Sometimes clicking on an object does not bring up the handles. Is this a bug, or just a different mode? Line Properties: -By default, line properties should depend on the size (width + height) of the page/TopLevelView/Window and should not depend on the aspect ratio of the object, or its parent or the TLV. This includes: -line widths -dash dimensions -arrow dimensions -Ends of wide lines - (should be always perpendicular to line) so, -resizing an object and not the window should not change its line widths. NOTE: this is not the same behavior as inkscape. -The vertical and horizontal lines of a box should always be equal regardless of any resizing. -For 2.x, we should consider a per-object option to allow the line properties to be a function of the parent size, rather than the TLV size. -Line property units should be 'points, if printed to US Letter' Aspect ratio -All objects except lines should have a 'preserve aspect ratio' option. -Fonts and Pictures should default to having this set. -All others should default to this unset. -When it is set, changing the aspect ratio of the object's parent or TLV will not change the aspect ratio of the objects -When it is set, moving the grab boxes should uniformly scale the object (but not Line Properties). -When it is set, rotations need to be in display space, to preserve relative angle. SO: -rectangles stay rectangles -fonts don't get distorted -When it is not set, rotations are in the (0-1, 0-1) space, so objects will only preserve their apparent aspect ratio if the TLV is square. Object Specific changes: Labels: -To create a lable, click to location, which pops up the dialog (same as 1.4) Apply/OK on dialog draws the label. In the first instance, we don't need to support in-place text editing. Dialogs: -Inkscape uses multiple dialogs to edit different properties of an object. We should not. Use tabbed dialogs instead. -They need to support everything the 1.4 dialogs support. Kst-2.0.8/devel-docs/using_git0000644000175000017500000000307112277111530015316 0ustar synthsynthUsing Git as subversion client http://git-scm.com/ Help: git help svn Set up svn mirror, done only once --------------------------------- Create a new directory e.g 'kst', and init your git repository with the svn path git svn init svn+ssh://YOU_USERNAME@svn.kde.org/home/kde/branches/work/kst/portto4/kst Download the author mapping file into your new 'kst' folder from, https://github.com/downloads/syntheticpp/kst/.svn-author-file or copy it from a svn checkout. Without this file git doesn't know the name and email address of the committer. Configure git to use this file: git config --add svn.authorfile .svn-author-file Then get all commits git svn fetch this will take a while. (It is possible to start at a later revision, for instance -r1307223, but then it is not possible to use other remote branches) When finished there is an internally managed remote branch 'git-svn', listed by 'git branch -r'. Update the current local branch ('master' by default) with the fetched svn commits: git svn rebase Update existing repository with svn commits ------------------------------------------- git svn fetch git svn rebase Rebase errors ------------- When there are errors while rebasing, fix the mentioned then git add git rebase --continue Committing ---------- First commit your changes to your local branch git commit "message" -a then commit to the svn repository git svn dcommit History ------- Browse history offline with a git-GUI gitk, gitg, qgit, ... Kst-2.0.8/devel-docs/fits_datasource.txt0000644000175000017500000001547412277111530017335 0ustar synthsynthFITS Datasource Design ============================ Revision History ---------------------------- 2006 05 29 : Ted K. More details about FITS helper library 2006 05 04 : Ted K. Added info about WCS 2006 05 03 : Ted K. Initial proposal ---------------------------- This is a proposal for a new general FITS datasource (called fitsfile). There are some auxillary issues that also need to be dealt with in the healpix and LFIIO datasources. Utility library -------------------------------------------------------------------- The cfitsio library has low level functions to access the FITS file. It would be convenient to have a library of higher level functions that could be called from all datasources that deal with FITS files. Examples of possible functions would be: fetch all keys, build combined fieldlist from all extensions, build matrixlist from all extensions, etc. In order to be really useful, this utility library needs to be accessible from the understands_*, fieldList_* and matrixList_* functions. I'm not sure of the best place to put such a library in the buildsystem- maybe kst/src/datasources/libfitsfile/ ? Proposed Functions: 1. fitsNHDU( fitsfile *fp ) Returns the number of HDU's in the FITS file. 2. fitsDim( fitsfile *fp, int HDU ) Returns the dimensions of the image or table contained in the current HDU. In the case of binary tables with "wide" columns (each column entry is a vector), the column entries will be "unrolled" and the returned number of rows will reflect this new size. 3. fitsKeys( fitsfile *fp, int HDU ) Returns a list of FITS keys. This list will contain any keywords in the file header, and then the keys contained in the specified HDU. 4. fitsNames( fitsfile *fp, int HDU ) Returns a QStringList of the names of all columns in the HDU (if the HDU contains a table), or the label of the image. 5. fitsUnits( fitsfile *fp, int HDU ) Returns a QStringList of the units of all columns in the HDU (if the HDU contains a table), or the units of the image. 6. fitsFields( fitsfile *fp, int HDU ) Returns a fieldlist for the current HDU. Some datasources may wish to construct their own fieldlist using the information returned from fitsNames and fitsUnits. 7. fitsMatrices( fitsfile *fp, int HDU ) Returns a matrixlist for the current HDU. Some datasources may wish to construct their own fieldlist using the information returned from fitsNames and fitsUnits. Overview of the fitsfile datasource -------------------------------------------------------------------- The overall behaviour of the datasource will be to offer up all data in the FITS file as both vectors and matrices. The datasource will scan through the current extension (HDU) in the FITS file and build up a list of available fields. The current HDU will default to the first one, and be selectable from the config dialog. The INDEX field length will be determined based on the size of the current HDU. A. Vector List. The datasource would call a function in libfitsfile to build the fieldlist for the current HDU. For an image extension, it will read the units and add 2 fields to the fieldlist that represent the pixel index (row major) and the flat-packed pixel values from the image. For a table extension, it will read the names and units of the columns and combine them to create a field name to add to the fieldlist. B. Matrix List. The datasource would call a function in libfitsfile to build the matrixlist for the current HDU. For an image extension, it will read the units and add a field to the matrixlist which represents the rectangular image data. For a table extension, it will read the names and units of all columns and combine them to create a field name to add to the matrixlist. So for a table extension, the corresponding matrix field has the same dimensions as the table. C. Dealing with corrupt or "poorly created" files. Unfortunately, not all FITS files "in the wild" are of the same quality. Sometimes files become truncated or the software creating the file has made a mistake. In my experience, a more robust way of handling these issues is to use the very low level functions of cfitsio to read the file. This makes it easier to handle errors with a subset of the data in the file, while keeping any data that is good. The higher level functions tend to just give up if they encounter a problem. D. Configuration. The initial config widget will be very simple, and allow the user to choose which HDU to use in the file. E. Command line. The command line switches -x, -y, and -z will determine how the fitsfile datasource returns data to be plotted. If the -z option is not specified, all further actions pertain to the first HDU. If the -z option is specified alone, the value will be taken as the HDU to plot as an image. If the -x and -y options are specified, then their values correspond to the columns of the fieldlist to use. If no -x is specified, data is plotted versus the INDEX field for the selected HDU. WCS Extensions -------------------------------------------------------------------- The WCS system provides a way of specifying the coordinates of each pixel value in a FITS image. This can be done by specifying mapping parameters, or even by specifying every pixel's coordinates in a binary table extension. This is great, but what can we do with this information? The best we can do at this point is maybe support some limited types of coordinate mappings (rectangular ones). Full support of WCS projections will not be possible with kst until we have a complete 3D display framework. Note that WCS is implemented as an external library. It is small and GPL'd, so it may be easier to just include the files we wish within the fitsfile datasource. This can be discussed more later. Healpix, LFIIO, and Miscellaneous -------------------------------------------------------------------- A. The healpix datasource needs to support the use case of reading the pixel values straight out of the binary table as vectors. I will do this by adding some additional fields to the fieldlist that have the form "(RAW) ", so that the user knows what they are getting. B. The LFIIO datasource needs to support interleaved data in tables. My hope is that it can make use of some of the existing utility functions in libfitsfile. For example, it could call the function to read all keys and then check if there are special keys to indicate that the file is an LFIIO fits file. Then it could call another function to build the fieldlist and simply add/remove a couple fields to deal with the interleaving. So basically LFIIO would support all the functionality of the fitsfile datasource (through the use of libfitsfile), with some "extra" functionality built on top. C. Notes: Need to properly handle null pixel values in images. Kst-2.0.8/old_tests/0000755000175000017500000000000012277111530013355 5ustar synthsynthKst-2.0.8/old_tests/sessions/0000755000175000017500000000000012277111530015223 5ustar synthsynthKst-2.0.8/old_tests/sessions/GOTEX.C130_N130AR.LRT.RF06.PNI.nc.gz0000644000175000017500000724247612277111530022172 0ustar synthsynth"EGOTEX.C130_N130AR.LRT.RF06.PNI.nc U}7݂ -}&Wvt7ϵ)JwI*VՙawpGGgȎssG{Da]GvP]uYuՑ9\^U"W:Y~NU_{{;B̓Zr$nO)SNt0lOtN q%6V@@A*]\PBA0;1'H3ki2Ds,f&=4CFyUS`EV{+fcjR 0fcJ}/>wcc NmT+Mؒ-pcR,os8qsKW(>'E)ooUt Q3Rؽf\fJեRanS)KSkSdAr-%ܯyOB*[Z;#ׇ)>vRufF*xrY}ѓGTwEk $#s^PKli_ծp% aGνiD=B~;ʒ~Q sf<炭}ua K\_BM1IF>]tmBv q,@BXCXդd){)s f}>GEpf ;*][n{;\T+F4 D":%,+% @ЭתIռ h #(} +]_a,Ϧ^96$h3|}ϞX5$lnCDz #00 P!M<g`hZmغʸ Kb FʁK 3%nh]v|~C䞈o"&Q![&k1Q< af̮3CÐWaߪA,)BD+jiźףN[}|GQw/5^npeH$s0$K 퉺ߥr"or,G!ؠ*^xJsIbF1FcD\j4>/j r-H?KeteJ.qL072SS1fm$Oy1 ϣIpsJ!jmCU1?iq1lH0┶C2Z-"/}n0K3OjMռt9.zkx(C2, $t 7Wsp/?-/En$%iIl_r#R#[[#QABɃ6au\8Ə: !xPYq̩}6>oCilj78[ 5c}ܺu\d襴DB9,On% 91~H Ϩ~,0b]FLbXK$8ҍO4>8g^sRk)p\#D#sӎ>/>]1O]: a y`6'vΗfԧ(wZnt v[ 3zi"K_L+5 \n914y=W1䉳-g;U]wh_,Fd5 ;a]eg2d<]ohpao &a,qW+x#mq4#ehv̈́볼qk}GNca9Nn泱oֵN!pp LJ֑k4 Fy. v/wC7hU[[ȯ 9 scn=#(i(_ zm~FcMz #8@Ɇ(bs>q)\z"!eXfIFD)RBq̱ĒcIT>3+Иѵc *1kg ;V_1~O 4QS9۠|Ók_1'6h=JݔocSmxXMj_A| 񓼛bmruuvv5X1~ѱ>\LQoO-$!a^üBԃ1ꍿtJ® 1;q3FjL4p Sp<L)=1/ IsǏYA}Dv'*w Pۻ8cİ d{f},~lo .HR Ēfό\33Z*l˯!͎YIiqtDu_QHeVtw$D^& <#LvCl= Ec.F_X ֽ>/ˑIJңDC$~<5eǑ Ӑ"L@w"S,>r)jN]̫4S_2p(\a ۩Ѫ/]/b0ݞ7ù"ä=vI{Q˯G٩ ;DdSZ\9IMAM1ۼ([(Of)I6)^݉Itje0sQ3&ŘTfP*>k>y9>gl>/ġ5ќW9`c^uTѻy OV>¹?&G2QlPz8}':W8BLo$3]/tSچ8abeE!Te86ݸ,qUVTrʊ&z5`Eh9ݸbk9zʵ1)kUk燺jo2/i,2Z.H\Ek&D^*%^s=OJK&+>d&TgQQ/ߧc0ITur%zfiu:I:YHS'x{q'/k¨FS_{4lZ"͢5m,^ 7Wcԧ0\VYwBs}Lf%5{OK7j^.͉7j>kmeUV #jM>m@yZc6uhv_j mC[/ohV;^_ZK /־r9sUڏl~VW]\^7%“n-j]tF嗺>LʭC:o2`v|{MI694lrr@֙-GSx ەsϋ17T-6tFԂm4lDԥ]KFnȟׁC9}~V}|=:0HVq aa MW94q.3p dOmԊq"cCGm ^@X-=b$zgc{:AggYlz%i?53q@]%!tu~F:6Xgt﷐}U/3҄ק[w,Nabޗ)5$]ލ)va H/ZQ49o x[}3[+'؅-2OυY/ PF@M`ʇA{V6$B( }Vb0a,97@1GzQրd1B P̶JQ6c=cʶ 1NJ4Cev6}c(!Xh V5b%|4?4Ym_%`dce:0С 2ޜ$5R5fՑCy4iN,F9:mZ `$e37jׅ|zѝsz.\Hڷ0}d۠Ε;2#}R:7mt:؊6IsNZiOBmH,Mݲuvri [^ͅ'KiL7QLbsc1pHhq}峄tOOA U\)k1QW f(Ӑn9;1\cQO1 ;mz{*uɔ>ikaٍIzI)ta7I7Pv s#ٵ 9Ex*N1NQ>zLrxI |^{{.3ņФ ec,2sϧ-$ :ړo??c>:ݻ$mZld=j?͆%7uBؾ1c"NjšĬ_ЈwiʼnWu5s`l[־[! !΄ ? {ֵD{ފ5euB53u s"g+Hxws >-1F&1Za6#2re+Ou*H=Hj.0lL6b \dq{8]yC^WeEGtF(F,zS˼7W5}M;}8C,q9j|OF52|Zىs\1.erɸF0b3¯4}M]?H݁ұ)byar0j˽=D:Q9=ht |cWX[EͧA_'|7}Nu/iOD{gWU$;] @ri-[=g $tf^_Ц2 AEEd) [YD7YANfM& |?$y~<ܳ|1e-3 { ίIY57yLt^j2&{sZ񮺿~X{jSkH6%ɉg=AV7ԇmis}Դ)uͳŶ>ݫȞ#;Z7#\ӳ8cטԤ>/ޘf#oPw47gu}]wWq_k0Sy (|cL-vޕ*=bYWY/ԬUw`}|C3nmu۽Ǹ֯eo՝p|rnK?=Y>҆h&9Qu\ϮwĴ\E?7r[30?h,-UiGWGՖku\x-}#AUŅYi;a{YmK[o#=j b1sZٚ)uAT)q" +wm٬}^<ﻬ|۸W:rHjRqr%]`hcO3Vf4C;Y'WnhM\|'lSѲڂcEi;N,߯S 5E>:Zr>=~> ?+^xw?~P>u)N]K4u^킩~ҿ+ֺ>9f\KU95)MФM-TCj<7=ۇc^[M(G~_ᷗ9ao@9͑ϟKY} 39yENL[͋nu_.G~wqsGؾWZnsS׹pqsC>Om6Ʒ3 's |<\6fu2qB{5~tNlnonJiףr'U!mh^gh|y_L{JI5>h0\S7kM>Q]IZdksA("0ٴz{\* ZY-=s rOs}`~[sW*4uUp/E뿳s*^J.2ߧդa#ߤ^ j_~_ufJCHs6T=E돭H_'fXGУs^U fX,ևCgh_zPqS]|b32i0ϝ}sEp^_:k" kU"hBho5̴H}=^#SuyZ?l B=xѠ֭k5hR֡Oc~jҠ!CwG)ЏDTڶ!}+anؙ⒂\KM3F^Ti-MstxHt[dŲ,_N+!/~PѣӆS`~~<1oU=ˆRvצCQm/Q}Wd{r^j/ϲOQۗ!s-{#Cߓfd.<6o1O6obg."_z[WW}t0ix/y9g4;k>usN}gliy]Q- Z=^y˴:]uRG" _yx)Z`hIX߫;GDuV?nf,t> 5_u7w[ ~޼<:S*V2g_goa_yk7M-/1^ymŗN܏<(wg-bҌBS-~@3̇,>.a)u}~<@L)#'ݡ^ W8܊M6|WTlln}V/|~\R}tĦZϭ%Z/DQU9QԠkuHЇg#󏍉EyVеF,VxF4~)r*=D5cY$I;O=hc,'bS1;^*faL|=r?dUzև2K/Zs덵`/~gSҞ3G*$5Zb:WsLZ,j"/KФ{&kC)9ID[wtͮkccڐ36_GOphUbև=MΤԔlfXܟHU9קwuEf>˥3aqzv5YD\` Y rE{† XhشýKkqܮɧu#4uctYtk:iZYF HT.nA+VUπBκiv. HZeNR-ؑpd;ø.ZۻhG,zdq.XN(Tm ̬&oJ{/\n1[]_xGuQ˶fTm`T^:g?5'sĥZcvx09@Q0mkFCjs79WhP$[T`%7n[r{ 6>i9"޲z=+%u_Xq8\OS}}F81kO;6I8?vj]dϳ|NC>yz+j&̋.gMK<^O7cڀi \geӫ =?tNxOrLjr5mjr-+^ꃧ;\tN<ou!.{SOO~aeZ[_Hd:'yz|I+bLG{N<֡/ϑ2`O 'mx[UOx(禬yf XWy_uQMYwKyW /mʷ5.f[r5*YfIk84^QLN4d''ԌA8 u_VaCqpKH} G{l򾴇bp~.Twi i8 0512nIA1܉†CnBJ |Ξ(ʻwLn֪^ySRH0o׻qNWEQ(C_X\lmF(m`ׅ>sfԗY -$~Unwl}`.5V@DT;ZyĬf~G=|4}|.>F40aoc輿^It_5R#d}gЗ`c1>Nk֫1FϦn֛/`|NUN>Z'OWSa;;/<>b%??])v5v- ~&/۰;0~[ ǰDZ'14ԟƞŞS{3_1j&?02"}Li!ƨ[* " 1BPC^m E F`#1H`a&`+(G76Ldl 6|4l:6,l66FI,¨ #n AKe~DQg l% *"|$X^ Lq0vFX#RX0KVFz(NjðñuSD#1 ؈ $"Q=`"08h邺-Mfz.x:/N¾}ۦl[8<- q*U mD| :u"NOOi;7o#q-[ mJ ҾķAښ8<<݉iGq>xxHNE mV\^ ^ ~v22,~^^Үq#Aڻ /~ ^^55 1A\ H|ׁ׃׃ qx#x6c'9s"n$[[@b%x+x+Hqx'x'H;@b$.{@bk J H100HLow N<=HOO@$ P<#HlOππI,Hσ//O"H,/U*'O 1V x+^__aw 1Y ;; Z||$n}_@7o.>???Ǡn+P@ ~AGBx!N!E"8},Ë#r(|(|(>E +Ep9>>N$GGG(((8}   cccYr7n_r,|,|,Lӯp89>>N'wN'N?(K%8}'|O8 |/8}7|o8?r2|2|2~VNOOʩp_5/r:|:|:>Z΀ππ_˙pn9 > > N?.ggg8 r_}r>|>|>|@.//Rx)N """8\ _ _ 'e2xBpr YW78\ _ _ '$r?~'r*-@0 A3r9|9|9Fȕpr N/W$$$\HK{I.ɋ$I$Q$jJV4II! 7.Np(YWɩjjj8WëZ2p.y0$e\TaBa8&&bwa`b'(=؍-sR@.>0sMsoi &9(i=&CsLk3i_ܗfZI܏~4ӚMڟ4o4yʹy iu4hi5t̓hD314C3iL`i(BLkBP|wSϧOq ӞNZ@zuIR_K}-uIR_K}-uI R/N{@i!Bi?(-^D: EԋQ}tuQ=tuQt=St=S}z1bǔS/^L 7P@ 7P@%KӞTZBz uڟJKR/N{Ui)Ri*-^F:ae˨Qt#7Rt#7R}tM7Q=tM7Qt37St37S}t -ԷP=t -ԷPt+ԷRt+ԷR}tmԷQ=tmԷQt;ԷSt;ԷS}twP=twPt'wRt'wR}t]wQ=t]wQt7wSt7wS}t=P=t=Pt/Rt/R/^Nz9r˩SG}}QG}}QO}?SO}?S?@P?@P?H R?H R?DCQ?DCQ?L0S?L0S?B#ԏP?B#ԏP?J(ԏR?J(ԏR^Az +WP?FcԏQ?FcԏQ^Iz%J+WR^Ez*UԫWQ?N8ԏS?N8ԏS?AOP?AOP^Mz5jԫWS^Cz 5kP^Kz-ZkR^Gz:uQSSSSSSSSE"uH].R@uԁ:PGH#uԑ:R?I$OR?I$OR?ESOQ?ESOQ^Oz=zS?M4OS?M4OS?C 3P?C 3Po@z 7PoHz#F7R?K,R?K,R?GsQ?GsQoDz&Mԛ7QoLz3fԛ7S?OSO>S@P@PH!RH!RoFz6mۨQDGQDGQL1SL1SB 'ԟPB 'ԟPJ)ԟRJ)ԟRFgԟQFgԟQoNz;v۩SN9ԟSN9ԟSA_PA_PI%_RI%_REW_QEW_QM5_SM5_SC 7PC 7PK-RK-RGwQGwQO=SO=S@?P@?PH#?RH#?RDO?QDO?QL3?SL3?SB /ԿPB /ԿPJ+ԿRJ+ԿRFoԿQFoԿQN;ԿSN;ԿSAPAPI'RI'RE_QE_QM7SM7SC?PC?PK/R_(tSP.lC/FGxzW.6^N"yE+W$H^"yE+W$H^y%J+W"D^y%J+W"D^2ye+W&L^2ye+W&L^|w ߁|w ߁|w ߁|w ߁|Gw$ߑ|Gw$ߑ|Gw$ߑ|Gw$ߑ|'w"߉|'w"߉|'w"߉|'w"߉ y*UȫW!B^ y*UȫW!B^*yUUɫW%J^*yUUɫW%J^y5jȫW#F^y5jȫW#F^:yuɫW'N^:yuɫW'N^y 5k A^y 5k A^&yM5k$I^&yM5k$I^ݿnZk"E^y-Zk"E^ymk&M^6ymk&M^6y:u!C^y:u!C^y]u%K^.y]u%K^.y=z#G^y=z#G^y}'O^>y}'O^>y 7 o@ހy 7 o@ހyC 7$oHސ!yC 7$oHސ!y#F7"oDވy#F7"oDވyc7&oLޘ1yc7&oLޘ1y&Mț7!oBބ y&Mț7!oBބ ySMɛ7%oJޔ)ySMɛ7%oJޔ)y3fț7#oFތy3fț7#oFތysɛ7'oNޜ9ysɛ7'oNޜ9y -[ oAނy -[ oAނyK-[$oIޒ%yK-[$oIޒ%y+V["oEފy+V["oEފyk[&oMޚ5yk[&oMޚ5y6mې!oCކ y6mې!oCކ y[mے%oKޖ-y[mے%oKޖ-y;vۑ#oGގy;vۑ#oGގy{ۓ'oOޞ=y{ۓ'oOޞ=y;w @ށy;w @ށ;L3;L3;L3;L3yG;w$Hޑ#yG;w$Hޑ#y'N;w"Dމy'N;w"Dމyg;w&Lޙ3yg;w&Lޙ3y.]Ȼw!Bޅ y.]Ȼw!Bޅ yW]ɻw%Jޕ+yW]ɻw%Jޕ+y7nȻw#Fލy7nȻw#Fލywɻw'Nޝ;ywɻw'Nޝ;y={ Aރy={ AރyO={$Iޓ'yO={$Iޓ'y/^{"Eދy/^{"Eދyo{&Mޛ7yo{&Mޛ7y>}!Cއy>}!Cއy_}%Kޗ/y_}%Kޗ/y?~#Gޏy?~#Gޏy'Oޟ?y'Oޟ?.仐B .仐B .仐B .仐B  @>| @>|@$H>| @$H>| A"D>| A"D>|`&L>|0`&L>|0!Cȇ!B>|!Cȇ!B>|PCɇ%J>|(PCɇ%J>|(0aȇ#F>|0aȇ#F>|pɇ'N>|8pɇ'N>|8#G A>|#G A>|y y y y y y y y y y y y y y y y y@^ /Bxf\Cû_CG>A4/Uh tSqjGa{4Hšτ? |p/^bϩ>a9'l.9sC3_Tl; #WfhW8YNlyߖ?NNNW^ΉŒoIU)uA l}-zz }~H!jkmo0~= kZ_úiA[ ytR}68+Öo:=r8ƫA|!5ǀ'VP/[)MrhOg)Je%< VKWQb0Jm`#: NŊïHDEԞh#noV-_?0L! &̆;OBF1H5:%P8JiP:Ά&t'4wu6ܹm']Ůk53 FJd> ;Pq7:o}4FK|YW&o ^? Tz>vyR98DcX[ z 0"fF,AㅽT #8{!4w>Nax#{&Jm( DnRʆ"zN#j'dlCh[F}ԟ B4LD@47BOPm/|T*[u = mAh+Z9%h|Mu6akA^%4tW 4怆zz_?B7R4W]6K zݨB6 y-P8~yCM7g]vcI_n _nۥL  bD=0rN;1>z]~TW 3X0, z  8,^ކVI8fi ®l9ԎL*pl2wc8.}㪔pJX!`\v>)99'IwBH0P<},;NAH}}09mW G4asmrr6 mF7b=v7mC{ڡ@1hwUoUl9X\oe@}*&YUC^Խ;̅\ڶ@hs ֚{9u>/r4>'~TZ>Ka={c'Uy_§YdxݷZo* ]-Pw>PY2 ph/|Ezp%p\ nˁ[Wnd{6;j?3cFShj1\Ex~ |w ^Q\ iZp Uau%9&Y$TiZn~:_cĤS\ez:4G>h*h!tp^O:|=/ ]!,tD Iz: !/حf|<]kE*4VF;.y31G: :C@ѷ{4}נS4s#~ކMw;zǡm|;E.D3t/ϴ@^?|.Z'f': Ώhj1а--W|F[h&g%ZE5h}9-5DhMGX{4 9fh:-ƢGAxTT@ShV?64ߌE?b2qyؓKgb׈-]x {"1"]Cc;DKtvGq"J3ZyEh{4=dUUZ^g/5?a7ٵmt*F6ot:sCIf{FۯsNGI\@>4s ]'ؙ}-[:عrC x+ԣO¯k |FMF=tA;Pw*< ,Q*45*3TCbG=>j>E7 4z~"lK:ԟ/¯*fkY#i r/~C},pYYFhzju{2:[E^ :nB) PO*EI(? G+`O`*gPy;jf/Qc Y UӠ%jg F::N r;ZWNޠQz58"۱@k1T(%[ O,HjwE5SN?MZFohK:NԘiǠff2UFv j KQ#ůB3.SvZڢ*T >nuXgT\; 5aཡ'(y3VꥃPeZ霅}o9T꧈jg8%nN,4uP7 ~ul4F@mlEm#\:^ZQ 4ekzrIv=_ƔݽPs"ԙbΦhPNA1[ $Q[GBW8} W@>*Q*Ae3&*]D5 7೶-**tY ܟ 4<5P?Vp{;:3g˻XOpǽG@{OEMC 8k50UmJ GgN\[4ﰹe'l <]U[]3bBUo7uO'?u|"\\ 7݂[} 8fnɃ@uj8r ~aPk(ܧt= Uf E?`'q˴ืSazn[ `#؟z-QPz# 2< ^! Hqr ԀuD)%RQ\Px,]e!cȊ2@3TAny^P2i?rS eS 4Y<^SiRU7X-, Yw`GSv&Ha0uĥ+S_s:LT0v՚ Vtϰ;q0آ"]`v/t~yWp[!9"̆^;K%ܗcbm ^c8ɏqxkUyf9]E`tw2wĿFm[:2P)~**:#^vIybU[( : !0\`.#^bh(hχ\߻7@ZK#"~cؒpH8c,+ =}oiPx&|yj>Tz 2Q\^)“{c >ãΣp^mWdե/j\)kkMMhWVvmp[g.\0. pgGд\Bqhc ̈́vY ך@_\YdWKᲲ5oggHQ +}܂P;N{8 ~ 8v,`89NEjPqԍ/ 4ZzCИzNFhCE7oTl0RXj1dϴp'@a8]c]GGvp4~D Bc~hxpwK]-_?M'~i-֑piz\ -Cp|Ǵ g 7Wvp`</§!xq%ӹ4- 鯡*{-}+_mp| _c'S8s~&T}ᅪQGP-h8jGp}4|7imEPjBߨ?Σ*$|?ffЌƉh\M=m$݄]BE˷Bfg6cp)蛣L'tZ뗢Z ;`;Q#T6E.è_?O{H ~ArpP>1րS W! GWqzw'wǩ98#N '%v‰c0vi3NS؇sp|\ "2\|8θ툳VSptapN9X"/M_s0n:Nj98>} ;\'Ext*%g0aF6.Yz yKTqL|oߊ{gچ3i/ p8uhL[+_u6L8n8=7(V/YSw]ǩ1N93k1.<=p]>8r2a89fdb_{{%NDivdzRF % Ʈ[DɸW1r>R7 1x A]}RV3p44ZތcQ,U QJGҡa0vb'v|ʁi}u4/9 Mkm@GPq=ac5u %Y Rw]魰"VwU{aр0 ̙ υg_#p>NtE=>&-Na=^nEX, U&*c8^O! |3tz |w_[rH77 s ;022ɀV΂aaG0+ ^}/U+>LVAA?N@c9FjB4pԼ I}}Xvu G[Qznx `Ek "7NJ芯 Ŷ7⬄\ +mgq뾉֋]ݙr|1~cl:O,g]KSGqmbx.!ukO9Wmp-='|OySO߮(O6y]rT9+o]QԇL,.vEbx" ,oΛ- z*qO^Xl!>X>zuO:]sūċW]wNjkλ"A+hw Z7Zdz wQwk/IF/w&W;_ֿP62]Y⫑ĶK;V[[^7?ż żbb~b9{#[u7A,(#~v/oOL{bDq}' r[0B5UMŚ*|lWqdqsD'ĔbQ<^uPKwx۱^^k۫fJ"l|no{9| Fcx^e_mr7Q2P7l;~.!m5`NetN$tt9s(tD[Xt.K0Oq||UGLgDG%:WD3nkӯ7z+zN}& J:~g6wz2нqz xi3znA+FWt] 1q }1J{b0gm_ēxQ}tRݮun˰'{bf2pTz?s F/A8^c bLI< D~vG-8Oowǥ'S#p3$p8i^#N8']݅p܄'? ٥8N}4Jq▾8 "ݓq8r66郃&,\ |1!8x|=ɩ!&ph ىCny1g㐅W i-}nz#_`-8HI  _2;eS8POc8`68>V;817`̣_{ sv85J!KGע$g KҐ4FVlqtCkQ: Im{JcE jm:@1vWݞ`u sLbC/=` 6,F}>1g߂~@j`c1PqШ#41Lk*F+bxHF#LŮm(`]u_c7+m?JOî3`!HD.UEnRu} 9P 70SC=#P<cCPr5NnUgcwI{ϱQkc>^vZ^`eUN_1l5b nxѧm *C~WQ TF;H.}:՗hBE3h}%P#.?F^ر <N oBt26 `nUUpl9Sr@X3%m`tcQ rgTAʆaX1̚2 ƘO %!Yt_V};3|${v5C5Y| d@z_X2lA0#L8>? P5+ a*@~mpAv{a}^Gg%/8̙ K@/O¬..+rOOj(8.z eoWd]غlSLͼ ŧ`nh ſFŪ@Ѽi܁-6J<FCJ6| [&{.aY#g1lJV^-sw@Qrb꠬LGZ@Za'țx6-gDT ;[uiPlYMS`~C+pq]JV8| 8=ul s ԐcAx|dܓu ^F)qՃIՏg΅r4켱ZChiZh:o Zv\5(]@oib:y:q \%~حb<;1r,fty1d7cll2 |j4 'J1|`/ màQ>c>3ѯWjCz\tnC~zgۀqmNtΥO}=܏Ǟ%0j c3{wq {bsJפpb wɻN'ZFRCz &%[`Lk)1F\]?UqY߅Sj&jHL0s>=</c{n%"Wtǹp].qn6\NφS?ܙq ]rN; 86[#Mz&Y1co=|Bv`7FbP#ݟ]Aھh=;l ߺj9dB){r PܡG4vpr6\O VpiQ ް;Y}B /ѪƗEh8#X A> +GÁq 6NA`C6F@$u4hh#6_qwpι^8O:z (]~BÞ hWA|Vv?Et0.iЩ>_h/ZjlFӾ24s58v>cT {Yzi݊/<сPwD j/9{m(9pz4 @ ٨phQgj/CX4[7uGۢ٫hЎnmh(Ui=u+{αh;עm>~)LARԸ:Bͨr|'躣LT>ʀ{gx9{&niN h! ;1hRx哱S7K[8O;kMT|"/Nzo?Jg1hnEGvÌ.^3tƠNr;|6 Ѯj,>Y Q؆n곱+}ik } 9j wC%`H˫BV V `d@.?Ŧ:l6`,H_S!m.H_ d3ôm0!Ar|" {aQ.t#^Iέt?n͂2:q1u~އ׾75j/H鸱6iԜ埚+#*jlU8VxƺZϟj?0©Vt{5Ի4kk'O[Y/1 գ]. aKGt(яpl}I8_jQqO+3B07vgĦB2WI~nŁ; @]vJs8b߂د4|h'KQc"*J f^kY[S=l$w &SqHt <-N#r0Vᕺi#.WtzS(Ϗe~əW/r}qrHgyj\i~xP _3' 6q6h3[10V{c<;8рO;Fx3f|b),5k.`N=1PAB߻WygZLͲ#Œ噃bF+&&-9&菉,|SE] fA‡ } BA-H# MԆXF$_ {ƀ`~krh\Wn { YD{ªnh(*-3_)LƯՏ@stN0WG@ėfW|7Uj(9Dׁ:dPqNJ1zhQi[0[:z~[7J/oԋ'Uٙ9[%kk޳j%/vK>EDMIɒɊ^ZnbNn(kX{ Eor<=\l~DdIT> 8AiUD<"XG\?)dtntS?䪠1~ zBDb Q_3/dCDѱK|Z 9RO{dOAGZ.LUL a=ݘ'|w%7׻(än;q ϴE3o (EB侒-i^MιhB _֋e 7Ly y,fG؏.G۶3ˣg&;+Xli|5?$oPSҕ93!pzXK ŨPUan<|"(խva^L փ^< 'ՀR}_'~u ƿYq !YީjEsA\LǠ Y n`1h6共8N#N_#F L-fB, wUTAIm^|>F?fUo)(l1nf njf w>Ifוë2斱Mf>#O!ul0,8n[04d:‘&2|غqB~7fǘ ؋b.0-:6t6z,\EL\ ta4cѫ;2Ejf;͉sai ;5L8Հ^2%iA,d2^xQo,g1'f±̥h(6dKYiWl,7asOm/#b#&2c_}aNgg2`y& ݗTb#_އ9ľ`kn(Z 4wL?ΙZ[<3p6>RCp'S~0]بذqgC_-%d=}!TҙNPfU\YB6c9u'[gf.irw^>?N~˹a1S1T®';p}Y~}?>+ dfS[(u'vb$vv0!kƿlî&v7s1ڀU Y(KXk,Kb5uKV:|[W`0 8ty ۗeݎ -  7b^of}RR6HE8`>w6vٛ5d {/ 3ų7 ֭eُ~ap&9[Lԛ=F $VF1jb/Y7լV0=0[|־Bn1,y6sHe8Ӡ5e_cɢb߶*%— Kk<07di>P Xc93GÄѦ#Nqc$ahd&1F!{;8Hp\X4,tgqaAWhr`ҏsXrs|Wd#ٌ郠yy_ɍ<iL(_0֜:q&-٩KYny&[0|up+KgvZ5dpbۼDz@ClEe {PWﶳy,Ig9F,d)۸nO1OC3+_c'ԝUvmzJޝ7 ;6`we{1۽(KigHvow d?؜i٧Ϫ|`I~X잓 pb2WZdy֟1ke ؑfZS>ͣwo _G*U/9XeE6{GHf"Xav-{yɒie7j؉cر=,~'Kka<Kvs~B=6_V׏b cN1XR3vdcT]?e,{ys?[U xUnh9;0KrO){9m W5V8ma6؉Q KKYlF=m6-%%İ~llXV^d.TإA-^m&j0?;B;e aYXb`w`RA/XU0?+iQfUݚ e/r 1Lb{:Eլ(ՎmuV9N43ʶ(d^{ԙ-,oyv8Ԋ1.]yZleZqXţ[2ZN-d+ZUuy/v{z+5QfEQOTg-Z8jc%Uv71tؕ3*2DZLv'Kz%|fsijao8%r{ɎnfBF;v}mvob${?W檥IעXֶ(5Eg~g<9m>} ig Sv=3s_փ}֙;,U^+\ֳoiwYumV9YkkƾN.g(ɥD_H?c籶%VKNG%̋+z-*ܸ\5~ُ+nF_krź˼Srb'MTٯEGxa%{6}Y;#f.Mc;eC8̚_e'dӀmٲPO6z9-VfQY~l3lUfv,2s:ַ-&|aS.IUl@fU1f27>GذY_UaLR4wHg76&8g5y:f ,g3YI̡ɋKdݪrBJVaf;3Njy+ǯ̞뱅zyYU{ӍM`e 39idU.#jcO?0Me5]σSۅ5‘H='\RQI63@1a&u]n'<,mC05) f((Uz:X:fiߘZxzE*7Y%<˶C^] =ltč)=]@ҿ3$-̀Mv}`ge$PRa5`p1Q <@4\!- ?@s7`}H`|5o y0 /!p( dM`v8ǘd : ǨB]>U!tS\ s2j >?aS ;3x3}U!:>rD[[$+cىsmOPܾELvVW3E8a}Ol|N|n#Ub e/[\#{Z/f'[JnN+&Wts|[EY^EGW=`_Dg~n"Q>C4rU@哷ؾRl_[bA*)?BՇ`f=Mgn꽙CLR\Yd팇̆'N}1)La*L_YfLSgN G ]}g꘲)L_GLlS}Q<732,0K3M{&S+pc&/ݙ"YȘ(i'_`{3c ٨?`lzƆzd1M,:8 F69;يClh&мˆ)3wXJc,`GS&Dlg*#&d)UlV#zMwKIRw cKМMx<ŇԂlC`Y*?,a7bng^cy}llШ ,XňEg3kܕlY6q,8bz{fX=llN6/䳅lٲlEylYll3ln,6W$[yڿ-5Oa_)Glt#,v5]-o˦}b2V}]oi8%fʾɇX5C6dofl6",bcm-ܥ,ê'+&6*zM5f󢺰bO6sӞ^a^Yl&?M[i&.gC;(Swc `cGvc Yqll65u űOYܤlq[0߰YX\`l7o9z~`=ZٰD5׹-piTSm0!5PP1"vn78 ̇  [6h6v\IP8~pK!Ss#s+ szD}LauFl<pտ,Tm& : {lڮ3L 3_lBYM^obÛc , rrx! +bc^LeV0G%޺D]cQ.ǂSy #3_Xxv4To=PfCj݇f 9b'̾8s9ytM͂}alձ|{ yL^LKv,z8 }L܇NzYv̴N1oVLAPk$֐_lz*vw֌2Va&BQH;^x/?ԌPmdMGIk Vh]t\ BH)חÙl6y69m¯gBɮBmqAwav{16_joE 7gnZkVC糎‰•o*eiBҦHa"WRT 徂'bې3{ލ9%Yf| % hIq٢i{^GęS${ע`ヒw-k V}gKF)y {fd ޜكA|Тnb&>S0K\ i %kwl8_Ht gp#J*ݿܯeD[/}෮Ɇk@JT|eʡ*i*\v۱b!`g("|UP{n$*Єv-t!2v%~E+]h l<v*|N푰1l_a;VXv8~#ā]?+lRpP0AqPxB"Y"w(PSWݡ{ aO (+>(Zڪö`떩ٱ#(܇=;+rl]8 `'x)["\iV=Hҗp~u LJwL/6U@9P@矡7ab˛%ć/ Bmos;\ijŜ]o1a+^DU>cw:9^1Pf6 6|j$_| %=>Ar 㦅–2daCfn(''~,!e;3X13r讣E{<X%6,~X#>ݫ + ز;W 7gvXrH˚`}y.vA8_4K^u_ݖ'Dɳ{oui q+×[iBBfLZPfEK)l+\P Q6{ < o e8voLVV RWYk!o@n(2?0J۲2C\j e=q\J=9!nTB# nՔ`U4?+Ĵ^#le[tڵ>QqoWԑЙWzebKo?qz[Ze qoKb~Oh@_bjIٓMEw{E4Kh}uBusIޟ&aW•?MZ6H o;~,fAC^2'oX~L#<Ά5c 6Ȏn^ƺ^RebX b4XeN lǴ3,uX6r+>ܞ1 KjcC k}x!S.ta:lǖZm`-bC[0wy»˙zl \bz &lfm\֯,`}ټW%.+$})Te놲AQ_¦?mcYqH}Śdl/ | x_ggFaY+A`lppyf4ͯ/olr&'#sْkS녽#'qW"bp]'f.b'Vg(?$>.)h-Xl^\u+,` &W5{(# Ļha|BSba}z3#Z=: ,#{(;Kph> ;.}ifvY3C6SZcqj; :7 a:_] V2mB[д u66QwqE!\8Sl\_-Ew-b}$Q稗h+N,.k N=ެz5,\#~)1bZ bEPx1boNL$> *xKYlc ErG#$^ebaiax-u YpX+ &'?bh~5ѵTJG+R/Ins>*NP}Z+A]N Zlnk}|`c\(<.{CV|+=VG$=6Zlz9|D:=:⛬! 语  vm% w`qgi"> yr U 6kDOvW,!yyL_~V0HFSviTW|ŷ/sV0{CLʼ)6拫Ե_&$SvB`K(86fGs? 0 Zag^ bQpᙻ)W 4^,q'P .Z 0T&~%~#i0^x|$FX37>DMpy9#Ҽ+wl'na ]"Cy8ҺU  {] l:ip!Oea{ѳbXb!B-j5c*raGX_'oLEI\e]<7EwAp!~A1R'ݒ$ۀ8Sh yw: >!}1C<).mh`6˄wDO aRS*Wp(vQ/:!xUhͮ)$Um{}'Tck~!摽pray\fEN§%[@C16I >WE?ue()9 j%vd0wB?nV3φEuj{HT4 %ljcӄƊ;WȟtP#Z?,"--γW9]xN!4%<{>9gvY?ٳфg;txͳRxVsVs^9K?.x]7g'wxv.Xųd<{ vy :yN=L<sMgxn:^\=q湟s\|s"ṁ{y^cun\yp,p;P><swrg4ܳtQs*[S ܭ< <ِ]=RWx~s^Ky`CxkK,r{Ag\:rY\e72,j+}+9gJw䲋\Y_R.;;˘?2.ey~\ЈpY e,˦;\\{g>e\ۂCx}|3粡)ủAt_set<3.FXUYey}a3:rgL߹0-17glϺ[e]yԓg0o'̘<~+yϘˊ'rYaϔd̋ ;̔/<9z7Lc\3MᙷRy 3zpY89;;t 5Ct7Cr)҆>H?h,]ld\VqgyvYh=Ɨg^Nkq ZYr}+ωzG,׼Y_,jsyst{wާ52]cimYg-KYsy}qק<3}ȿ=ٿkGv֒y֎<{B|֜KlEkRCyM/[yvg[J.<{ 7gI>~mg MyNZgS5眶C^xó6"7: rc}\\ߚ{t=kL8]{'9]ˎwwmF}-9eL,˛g3+Ligqyګy"9eg}3п3vԆ6Ʌ]ʯxڐ<}Jw}e{23*xF7ˀ<}a,ϸF6etjx>7qݥ.=𴨓< Tӛ7=}q'dm.xHnӽ)~tyF*݇{' +& =<#;g$ѽ>73߂_ZOZYո~E9jeu<өg3}= Jyz+2t,Oc<}G\~i%<=-O[ y깧1U)?taQm_{P iQ[fRa@ n0ʜ{9gwym2=y#}{GsķNVqQsd=Dt#;E5矬1rg G#;eMf=֬)a}"LXv k&e"ꏣY"UCGX6U]YaU V}ꍳYP>&nGxw vJޏ5~,K|W;zXGYaVO8b5`NVEL"nnG D LH5fӬ+հfU8[fYύY/BVleuQޙĚ``Vjͬ 14mYc:kt'sZ"Ro:GH6\>)Y‘ 8&܁gj3ema}k8b4趕5=Ntz 9zuqGj9¥?G<ȑFL, _r@9bk"qdH_9"tk^##bO.0b˚7 8苈g8BptwX pDwp# X -kAg "n7? #.r #JaQP093YS35E]:};F+oqY%w!fde`$OK5ڬY<>?cd Fsq,5_ait1wGb+ݶGvC> Asbr:D=sz@Hsָa{`l/j sc]=,ì8|XU+_8VV (@:">FN1QO3Y}O:X5}{|*b>bRfb>V=5s VwEz|O/j.\߰j;l6~5&&or1 9ykxsll;ȚiG7uHꗟ9A!:#o|&yS1h?XSɚ6b1rk'p-GDnym?_kԧ^h"V]ͪŨrX&X?vcMu+YrQcVFYS1>>GlX#֖&.&FnXF:kE-Fvs*q_55P/V?FC @x~&uG[* ^_*M#ڬ}bX>x@gcXi7w1?(3Px?;VT/3 n]r1/ tcV9>T%@-Ff5>jV0V}|:c?qw3ᷗйϲf;_ 0 2hѯ:`3RY m4?FG1وc-wusV_fu:Yj4bOpFv#΃??jT4+rJ rY3*zV㝬3TQ":b}U)UzS@)c9uhfMĜ鈺H%K3ԕ6Ɯnܖ2:IX8ATwgVC롧yŪ@XU Q>OFnNJlRe\vf};|Bh+Vu`Ud+7KXD~}s5AZV`eUXuQrNV/sYwːüY"z4+;w+OfmўfEVLX .>HgV>}ʚ?Y6@hW1:|cLc/Vd1gcVa>;Yy1D=7y[% xbª&ȫzѦʷź7{BlXޓ#*{c:݈O &'Oa/Y1fUAcdheUtcmBR5)J:sf++G﮲GSVdL`]ɊecY'+jgtCoE +]ộc $z mb *V.N CwY V.CDou#jBk /pl5 5Ju;+g`FnXYho`Vb#|<q}ju;gCzeȃX;UXc* =!w+XUʲJS\NhWSE*_3n׆ 82ȯj Gsj*`<&LV~ɬzrF=o3hhJ䆆G*+gB,~bcd'ݽowCWUwR{2Qb߷tчƪȡ IýS%\jȇC;k7#0҈5_YbE*jք:j!^!^F&5vum3lb#Un)Ys^6c鮬OWc6PC^lec383a1䑢|d| 3eA=zO_SYkkϳb[Gb+v7ek]zv&b)+ <㖊{ßbOVTVz6d/P=W+FxU`{V\Ȋo<5;Ȋel{lp+Mi(=Eٔۛ ^XY + "Y7q/JcF01搰 VeE+MrZbPVBovWCrV$B+8Ѩc O}r$Vlެ;- KÎ"9\0Ol9&r?/n}Я(RGmi%}s,>[Ԭ"UysQ>Ş2SlGOsKobs+fM*~v FAC166gEzqϳYk/^c89cF1^P;-o.*x;+ǎa{bWjr 3`;)[ݙiu+[^V߰XF}!Ɨ(W +\>qVƊ2 kwHs" P' M*usY=axmD:b=Eb'Qk9\7çJ)z!K/O{k~FSsrgF?,žSXڊ#,k pWKRcc>t=؜l} Q0l _/c19d+0>Vჽ#C43/_gE/ 7$48t!G8| #1P s Ξt;1PͿYQͅ[q8 ?1W6YQ[ia=}ِX1 [q䎈Q1.z$9.VDv$1%cca- ug:4GWb4#y)|vO:߿8McUl!Ovet{FW|:Fy/1;bܰw3<1r1~VӐ[;̓]7>/)>3ju=ӌZ+e4+[65rbbTZf[}gN/mT_b试ߺk7|2> @'TpW%%oj8Աp97`ՋoZG6Ne#\z }}͙QN9wPuhoLypDLH[ɚ)+6; 1&FX25K܅s;Ī}y j=qw%%è5^^$) 9;ݑ63ӿzC{l}!慳?9EE1mq_ٸyx?R-3bPFj\;{Aibt@q8]e ƠNJzl i%ۀ{ [f=X1xGF߫26 聜ט{_A65Л}w`Q| }ԆAeUb+=Qe\3;S}q(lPu:.5p{c_cyO@|ef@bb϶uք?ܕ5$9',kgNW##Ϭ|ޯkNg3LWޯ;],L~-faK_g?=ourCXK{wIiVF[h"BLox[ow-Ljf/ޯjC|{a61N>4%x}bgd YPLm k=:mc5չ{0PP{jó#% 5yQÑP'QqPM0GjZ`԰ Q -|G4Џ9>{ -vKY70$r/:ycuGz< [Gc|S,a @>쯿Ox~5ڍ'nC3t ֨}VUkf? Ӏ`&r+66n #373G<ހK俧8{8BNz&կ!仧9n+q95s3ҝJc zX#fA 88<%Xz<ߨC3E%Wz촨 Wq!zڏ>{Q/ 0\a7Gȇq 6Fuy Qa7?:SFAlNۑ m#솽*w> rMb̗Ž2o9sP3aEɁ]aBB|Ȗl÷A_-b:A6rVQ]䡦7{> a,vG)žƹL4L"u,M2l"`ܓ}bK4Z$GCا#`(<2ĂVbƳ?vCG}ޱzZc8(2~~h!؈1g l =@ u1"aH(W@4"˟RȻZNG~φ =X)83 ΂ gOwd ow`11g:{:=c~dȸgdD?E }_2H_3x{cHN1 ?E.853w&:!;Aΐ#d{[³5oOm`oOnЩ dy@6̀&sSfLsm S=nzgBz Go|m {]-kZk!%jc ,qxuڠm~ cMЭ) >]2I"$>$>0c0~R/%>U8SUoC1p+|*$>z}}Cz5u>=EY|0(}ÇfW ku 0-mvkl_'sЩX#6ꀆ9pV{j&gz8Si,5Z`k -`o~l _{W3wog6\3i fk.k93| 5>5.A'GfqD~yKĤ0j Yjc5f:`jk昫s5A- {b| >?03I>o sJUbCs /9.ޔl.4Fx/8n۱gx>;yp~/{wYG:}7 w20t2XMXau`8z! xyѨ{934ԈWQo@|\ _ zߡWߡWMA _o!+{gB}'Μƾˠ}4N@Ӡ}o Eyb~X;pf#Yqt+0_َ@ÈS{Nb"?I _ͻ} oes@x9*|w t/n7_>>A*t :ױ.t}m2^u 膞 67}gρvҀq{svs{rysqh렣z @[Ƶس7}o;@=n^[ 3vn;=ߍ y 2}=: w;g!f@en|{ipA6Ǟ~Fl5|p1aA;B}2'ÑF;O`q='Ì; >' >!n037hΧ>q>=ڧ(d9 c{ρ)wr\SgynF.>noXCBmf1xAスQ޳]0gCw N5%w#6o1Ƽ@ 9w5_{_nݺF"_Ş^?{![+t+ԧE PV`n<ņ9Š=*ԴŨKLFs3Asj(WAQ1uQzz=DOuG=ٺ7uC]b24F\s#o,ЍE ę/np2]~Z};cOԷJu/@0&㎇iuZ$r;>]#p߼=)pl({*0p,w$}5εN=w#.b$y{~3ۘ4 wjw[|w` y@q.z q[nvD~*S 9{I]KIt_}$>9oŨ'y!G&wÙ.{; x{χ]co r#T"o7k[@?{s8rsmoXm[{—01 yn0> -Ifat1fa{=(؁Bv{tNH1k0.ޭ>ݱ3;09f`3 lMso$rך16uI&B|;zzy1@"S"oa{ ؽR&7Vf xC;p;-{#M1q6.8z6_8n \ di |>v=Wď/p*,n+ԂXW-a37 ~hyZ@f|.pDk-twA,5'ͥ፹n;#6Al"b:NOy197'NcEb޺#g5['eQjfȝmK dQ ` B1G2CNs눧WZu)S~ĽZnlDΪy$.eG54zU.VcGu?J|H|q_=zy 5Tv %'P+q={$J[~w?Powm No~6:d؆ڻm*֫0jK|CϰwG}oo)B.,I|@# S?У$nݖܕjЃϘi =/Hѷtų a߶Q-zb_CNz ޢ>tЇԀ~{jn :6;dC񭇾?Bufܰj{uw w[gGjzM0B7W;ygZX34S;гŚct}Чn}e0݅=f!RG Bї-w z|crq.t֊qf=z-xnEs[/{w?z}zc~"ؓ6 =X }6d<.3ޕ :۠{>o k!wsI6܉}M`5Z Kr.+-aw{6~oذ.c l15Qt u̍WXBm3~oK Ŝ l7{Q9Ygǻ-dp¹BOXjͦv3nYCOaG :8|{/R*ް W!{aa??B>8^G2F>C?<`!9CJ|Fr\Col>ޣ6 cOhb~l S` { 2/!?zLN }S@g2x|7;L'A=@ɐs"Oi ߅&S r@elbN?'D`g |2q; S17zNlS@kTliQ)87}SᏉb <S1g&@ `-&S@8`>Mv&n D`'x dj2yl29aQFoBq169 r(ja.;C@Ipi ~g As'~L} 4 x݂ɸ66=GNFQa0<rc C]#F5b΀(z-~ c=r{b26 7of}d` 3}|' ݎh0l8lt $М8!cΎ~O5 ]x|<0lWPQ`$ sbO5 yg">Aul;$Cl wcM1Ά,37$PݦH|g L2gt2™8? 6 ΅=faEˢ} k>|46_̀sg&l3_ς s]G٠t;r@;14L$`z l41 vsSVs$|z߬f{1bw4П }g3 3 6 9{A= l22 RfI|B;c.X Kr@Z \¦@{1Z Zaeط6^:Z+o6[\-9lg|vYKo6se1 >`yi>\ 5e_=+ZY9jaYJd%uX_}lzHȕ=7~JjlȘ| .g2PYaC1藣?-G:8aWհ߱ C8q>(z192 x<*~4掣?B{<΂Y)sp [&__";l%a|/{qV Vcn+d+]q0tuq>  o^7> gfA;yz/DLֆLY{k5X{|kcqƣq-gM挪0k%9Cs3M8cTmZw1^F\p8Fܓf1gk9x6]̙8 gYsΑJɋz9׊9_ǹԜ֜sOί[V|Iٶ_9{v% 8g'Ds|܊Zl,hڎs+oކ; ksy\^z3[qYU8κʥM9J?#EJ\⪆\vKL>pA\:b;Vqɕs\rq-j"\2 V%s%cqVR~K6pI}]U\< Nr\p-CH%\E1h,‚\jƯ,|\l P.8_y[w?c'9Dž>pv.vZq r~x?Ջ n!\8LE] \.]-8i؛SLqt,'__i#p0N[)*9EXӂ96z' zqf*x鏣9f+')OrtQ)8ֳGq6p|37iͩx+y]sK5z[s0N1QjNs:估i"S 59#쾝&OL8GΕ]t3:0s˪8A&gOi{s#pRϩK8&yrBNIaxrG_^}V+v9v\1'G 8Rsڒ2Ό591.'&rhN 8 RNIA,mI?rRNߋd2N)8)8MN[ZӜpߜ[NiNO>c#Nv)W8NPSms 攬&;OlNNl/2'F?D|rB`=sB=Gw#9H͢OcVpl|;f/E}T8o&Gʱ88JNg9cX_p-3li9l3g8kLt~҈hc刏X0b*zՖi>TroWYqԖ9%GwK۵'ˉ}9vǞq('d |>ݍ~#t)9&Ni8mMαS9qߥkĉk6q?G=0#(&' Qs’bns 9K'L?p0UЩ'lu9Nj'Y_vNiivo 8y'NިFfsƊq͚9.''/֩8%8V8N=3r8muD|tu֞*85gr ppjj|ӍSֱ/kzqy0i;zyp3qsFr:wŜn3ko>d#g-bLhl8#93pj џ^E8M,XnT;p9]#}s.:+8wC+<rw}vm?8'z7眼y8wg؆܂a>sgqαp:SڒsLywsgwsn?^>3Ϝ½4v;dulg/8Iqg#֫npn@_yAݒi9Ͷ3-nQ{Xk͹ ɜ^w ;sa:NqyEσ|*ͅ}J[.(5rl. _7e[";h.k^kMķtg:4!2%ۗ8 ӛ;7Pr^4[ƅ%TtH{ BKa־ %g?V o/" >q#Sc0qo",(9Zm}][qX]:Y@u+s]?pPWg.!Z0j}IP 3 rBe?!L;WhYwi f Cw}"D ,6#|~Mғhɷe0/-lMsmh~}Zڤ|?u9Қ}нshѼ74w*BǽOy 4oeo-4~iFS40SpHc\c%)WM)[ Y\BS ;(hע9>Ф4щTͧ񺖰+@ERpl 8FfN4UԞ&Vs?Ҥhr14+aJNҺ4ox.nL矣uhMM??mGmFҊi 5 6>[7Mi;)K+\->T:[R-Gw(;Rj@ܢ]H1b F!ղJҤ'_=Qtbi)JIPDt"Ճ(b'(Fb[䑽(~;J(5ԅu)m1J˞InhFYǾQvGv=KُS֒M9e2'4'ٔ wsJGY(o);"c찤\cG֦X)EG u)^яRꓩߒR()52죜W([>eXFWPf۔90l,OND&Tdr p]D0 QޒGpVܥN3y3)ϫ=Se֥l>gwwSN)1y,eDiw?:r¶R1?r'Ɣ{rⷔ5،r<) D|@PV ^%' e'z8!KPQY(iʾ2amU&1`'rͣ\[kn|DR۔;qmW(砻hiDjfSkʍG/^A 垱)U?;LRM'3uμ # )A.Hstn鼄oQfE9-@J}/RV}(}ys3I2s)}>ɤNS(K2ڮ SK Mڐ'J}UE[iVLH+. [n"e~ CEi(#)K1ǧ+eJ8JgQKF%rGws zl9% rbK);{r'S0 }Sq*ʒUs4evx*ՌަT|[KMwyl`ﰇA쫏ӑ2}G<IRT(=?%_>IiҶ^޿HĨ x[BY=;Q-ޖr?(^NmA)WWN psPZ^yoM:ѕRJ{PXEeUQkJ^H|Ou7OȖڨ5y!Ν֦g9ŌR̾Ņ"}(,QteN3P5!Hǒ"ePz um@z^b\!Vz7eR% UI4! :َlI-s!->Qhuhͽ&k$3#N+ڢbZ{s-Hkm+ "uvZU¸7HN ϒb?kWֶAag_`GiIʿ7¶Ŵ JLcia ׶fb%֕֍RX4ZlݹLޕr5A/lZV6A+<.u»AhOڤV +#aȻd wO'^}Ui]aF2nHKc_--K 'JnP^M{}쑮4! '\ٌBuS(Xs}{E5KicK }YNmVhQ/S9>}_%z4%:Ԗn_^q 7i23MIoS)wiHͅ4~@gӐcv#gBڇw=Au&èߐ4/ TlAmW :oE,ɿwР4I ~o-#WO44j A: 4=s@6;Gm\7XM;j#ORIQvHuz$mPI]J}!l9lF>-SԯOS"iwI ZEMߐo=~D}?$HMߑwxJ 9F}-K6($g%3NA=SWkW>"fKjiZ^K֮˩}|ycPծ乸9tC*6R;<:HlHcQkw 5<N#/B_KPQߨsa87Qn?A-$]C*vu ^+vDq۩{cڇP6ԫ[! ·`m>ꚿmmȫ^c uM\שg~uWr3HR$~sߨSԱ_(עvDrVQ;L3;V`C-'{zA#]D]vYCr?Fn}nj%E-\AoQ Z&x"0HPju>y?y}pZ5q"zH% jUqm92<ע66k j(NAVifLE1jnASmX}8PQ8Z۟g]suËpNS[zGS-p8?9.hAC.SSWnTp4%G3z:G jo.9/}Mo[MHJ-zZ9)ϓEd{̊lFZ6dsեr+="Y}jA}dgֈjH4jNpnZ7ZԊ &Dr o~C5iKNz+~)o_ udգЃk}u%bZՅ]QQzs㧅d/YBd68̔ɢX70qC5ӽ1r?r؄ԨyrM8Cqcz&9I֓4 9yS͹۩7ce?}Zl2[##.P-M*w!7Ȫk2{l[,!CȦ'1yNV5|Rf%w9O˛RYd%KoQzT֓MdUM 96c;Y=*v&iہj[F{,'d{`;q#M ba\ r hw9:cIH`CF FIn9 $ڲ\ pwKɩAj2\*ȽV 5<xLnSjx5ExseW+vO{%YbusBrYWr]H-OQgéh/EޘDuJevDڏv˩bWK!zJ̮Ѱڋ5Zě@I!il7MpCd,?>ݢEws,Z-Cw<hlMI:[EFB#FqHye'i?Ee]vs"ľQ3fmM?)*B{x^Zk=Y/<49Mָg|Oj%Z}-؞Ѣ~gY.4cMD+\ZES~d4?سh¨~4uM U4.?uB6R9o MXi[ئ4NSMC,MiDSj9KB]PO*,7fWeU{˾nE~<;c]^òv24SI}H.~ m:"+f6* }A!Y2V[*+So;Y|LO2ح6U5ekBeeS,z -[e̻^鷕eFX,[6࿿yzLKu~Z!^(-ZEj'}t~Ri]~H3,Kv͔K7PHMhޫ]wc__TTZ]{CAiGfдҶ@T }&=e.iz_;4hL9vhgGTRvs2y|hӫޙ.ݤyUsAEMSf1K: V9K{x{Bzf]iq.KR{?RĦҴϤ7?.]]8D/j49&StҰf`'s齥iu }tT+w>oJ-LZI;H7nt,m xIhtKA{id=R҇RᠭtYo֮cϒ*s+@_iKcRYՐ]r{RCGJM^KY,{ɤ-NrwӐ7ٻd7Kr>x1H;>W~%Ay7I|٢"ˊaӯzЙL{Ӱ^jOmP??vŶGt]%-ݩ7Ρ'9>]n!7:8x]n ]\3A,EuwZ~j50jۚ}CHaPt 37 9e2U%DŽu]|g!@!2!_S!5J&hr#Z A 3ao084Rv.Z^*,.,,D߮a)D#](3N+,(%Ns^XeO $FvBŒu^ J9!.,̪$;( ? X; =gL #8 a%jBY= {6 I o[ ?; ][z_S R"HNz(#^#kG7G ճ6 /Л=79(L'D_Zyju;^r}Q5tA[{Q [.;ʚqNK?,'sH.⸰z b^\\w!B rE3K;qA:.ygws! GlJ8 Sq֝C _B]r)'sp9͚ei\9Zp5wA,Wq~aqr־8TNޚCskj3^~.-np“_},ʱ9}'Oi9s Kɜ0s•ۡc-*8;@˱g8}N vXgُq~\c+:Nke)sj|N83ᜊSs"6#ªqn1.79&j6v2+ȹ~Svd+'U9qʖ&rz5N)z r='[)#rl,'5I'9%azpVN6:p|Mi)'I^9~Pd䘲N>Nj6ccMZȪ8{ъ#`UFp,dŻ*VxƑugr%[kो$w:bR85'Dq'9/R.rt璆y3/i˜j'ǝᨯ928jvu7k9Mंې5NXќ=XUۉ5pm Ή'80Nsff́HfӬ#}.^6WkG>pDQ^cpQ'/ȕ궙񉕎8_+ vx]|VeukQu9|V]ƚ{C9CCŭ^YUU~֕#[UpK.: 2֜gx<~=h&G1s65';84N07oYxr-wŶl?5$g1r`')q^6֖rߜاg&pS! 'ɩ89ANla|ͭ^95'>©sŜbNyiәӖ-w ]NJK_qz>ɣWqT{NyS9}8 NprUsR~oNۀS 9'r'qVsj/'{qݗ:G|l#O(*qُnL4E%k{^ROxʹ555g*5-d?j }1Sp\Q{GɀXeGpD1nQS9ksLxߞ۞Xkn1g8~Oˏ36/XY>_IOs!`2s$'?q/p|`g1'ZbMK9v![}ʚcsxONypr NIa:smbތwy8FjR}\w$w_N4+2N/D{cĞ%{mEgrї'(2/9nf&IOvs9Mk{%ڦx^r]YGX^!3'z;wn[N:6G_]>tV0=iB6[Zeo6=ܿ/Г 'S;bM\=.L/"sJ1}CYgQ9TifBGѥ>t0<88IMӸ1$<^S 2K]ѽх6aHﭼ,5ܮ_3n)n d9ξ'VQocY&2òJeo[ Ӯd/__(y{g1#.ˎ6AvQv^KMsdI8>աjdZ>/f1dD:jy{pEuqj@>惨U΋-y7Sw16̗G'Q1e]9֗:nLǑ8zS[ג7g/{MCϫ-4p lcIcvh$4Fm@_S I|LAp Y/4W)E0GMC㏶;i|/@WФirU0M9ьin4+.ʹ̠f/hCp>?syd,ͶB÷w 6$ti siꋭ4uMJKi⹆&xn'*(bRPq(c:1D-֑')p7Qq Jh95Ѓи(`? YQ'Fh䌽4C3ݮ!B#7=94ogd'D|qWӨ^46?MIhr\Zl=9XBs7EL;5ɓ(f.yRiNh~"kr:LVuh~5NŴX{4EZd7-]Z&WRؒVusiXZy.!e^MFktH6EϜFQ)H=t/inx.Rz/& {|JuGQcORԗDKr]Ay| %FiQQ6el)(cL@Q8v?qz(cJYӌR.+)"JNPfKJ9kF) Ϥ;)E%$fSpz9kQŔމwRBS ߭6Gܫ;z7L?R_9?O}NAq(ډw)&JoږR!͟)ehKE\h觛uLi)z9YS'=DY2%y7t?qMk&jJ^G[~J5E7cQ?[7LȻZJ7(5 yGo,fUT3ec28PJ;B)")nOɚUzx^R?e{UU?f Ż%g}3=v1om9@q#Rb?bvKI-QpKHgE3)oII9i*l 5AS(\vui] .MLaG:Dk7Z]ULk>ٗhQKZGb Z-hM¿MiqZܠLh3-|n%-9FOn_E]"ӂ,ZhlJkB ib4-7_xJ Υ/]o9i޻߲ [L7quSIz(S{qoh=B>4d&nSKkh5xD c#b]C6kپz-D%YyFHl"IѻE="nS}5!@ZSxCQxYe =k?;ԽzK^Nu=t+nuQw6ԥmRMG@߄9^w ^2A=F˺P+-+~H]PǞ&g}3D%MC^8u SAg$S%cuط:D:=aOgRz&@TRgѸE:,vN'Sk ĞK<ú~[<: 'wSj^q!65EsX9ЋwǪKKN1qD9`2"y{R԰Wjx5v->.F۩Q|jr]FN5c0TQp S*CMr4ZU&{䶿9\f >q ׌[ e2/oJ-ԣAwyCXD#RĎ׈INͲtt)ơ=IԨfj)5E TOyύau%(99B".TwltumRSg9,mnCvQr_G􁁆_"ўME, 3-9g00#9?&>l7[I֏Q{&ad7l\ߒʫd׈l!V>M;-Qb3Is&reSuv!Rٿ3M-Zͺyds% ɞT-c՘7,kyTn)URok3@6[2 :L&sv>>(^d7xוsdU?>ʾze;~o#o26`֢MUzE^wT3ϓZda+ռRvƇd'kɞEݣZkmu2Mچ-$e̬%m:K Sn2݇Lmuʖ0͒}a."{gj.{w*U&*OqQ2jH&bdv/dU_lM5:Rd L76a-𶼯Vٽa5e׻=+{{{e^=~Ke&t,ٲ~&5F~Y|~\mm}N'ͩG >ceo;߆}?dV@h4t#I6$v'۫db;D|&I X$6g kT-:ZQ_D 5?!éd2,!3TcHURo<2]Co!]Tktsσj4R3vhhsu!CEy,DljEۓՌ5dz &VͿNݗc dgg`5ky1 d/Mc0oo0FHnG} kw_D SזbS'ʕ|~:'?Mcꝥ)ȡ7R4&:1h%ZfDhGػrV~)JonZ}bz˴W8֜EkЪWhGZV_7~W4aizZ7v%֕Ӻ~v5ݡКQa5VOU}[lӗT4;񷛀ԏ4Bh5#F8&4: B!gW@C[zCic4p> hFk!q+ OÀaWhX߳4$#Fo[}"@j۽<4SO԰_x;zGQQ,dcjSVC@|Ȏ}#;< A&jse7mM K)+[vQj $O#Y̊w6էZ.,DYԝŲGnk_uǤGW6v2dd|beͶu+bb2;e.H9#k q[-a EJ~1ѣPcpiroe[z1h=laozHE֫W/&ֹ\s޳۽^W%Uo:OR#VڊCu6V3.NT-+{[8Lm﷯StȿXTmŧC+Xs.:#ttܛEex =tnOz X밵aVJ];] i*;(cNtIgM׭=U=x.zT ?[Sts$W=^'t>Yqռo:ic..YNutsZ(6a:+ǺU\_1ܮ5ޯW^wt&^ u!+߅\ktcO}-$ѥuQvխEC]}QeVt.֯J>S4{KM8VSO|zAu] ޺Žv&Mx[4HoʥN]rl{uHt$O  M̅*5zB;& .ʅ>Bc[¸[knB-k 6ϭ^"a]kfKi:G]QwJpV /^h#Wubp^hX!} )Vڳ4j`Y[Ec[K4\0K< T-׽0Tw``#Whe`q.Ls9ۄ0ݾ7fTY?Bwl1ukVW'P@$Z=v;"Ս|z S]  z%u/J%NXv0K;JZ,Lj'(&{-  4 +1Ko c҅1]B*!\Wa:/q즰zH!rB[!2UP5R\ + ѝ6oB[ wNvzIB4}Ga}\X+Pi)u1qk  ݻBqBVBƔBaBN BJ!gi6xRzeHՄ 歅ٓkݑBBDL!fX(O/h%7==O<8+5?*$BԚwTc![AP+,pRJAK5eF꫐rPn]dP|,]|U]Mx}pxDxWk\T>#|Gob婯|po}zo MWTKoqxj魜tjKyk̪<xMz7W*="^% >~QjAݍN+vAΣmg={AA9ZΫJ߹F}[6[U$=+6{o;Uw<:e~@'^⟞knKN{Mo;]誷U݅k#{[ V)´{&;(+o',N֮<$(ڽV~* ҕ*myK/kB"˾pGi :Sϵ=+yH6Rެt."{W *uvwccgUux_Œؼne'n fKGnݍϝVٵ7nZ ܆sm2nHs{هq2WǞǴACqvf{Iܮ&}nAvLY5=_~ya ss[yiY sA >7A8l_PW^.8et!8x밨n.bmwwww =3(]*-`!5Aws{X۫k:ói'xdwkVyިZʧPY-P5yVGq?T>FU-T>DՋdT7yP=WAAT_yj㨮Bըiu5RP35fkԜCYԸZD}AM4 @MI(j4y5{PS}5%)c^WP=Vf[|Q]/O>T:};:< Bc]Q}2/;z˶=P= /@uo=T{FYMPUUޡT*:B'UZ^UPu Uۿjfnjn[T5a|Ef+*\Ge*^ҹPyTT[%Fҕr2 ϡ|T&y Pb*{PQ4yCQ{Pt>WPQaz gv@ *6ME@TMQ1e *FGE2T[ƃ7VT4EE< MAChr ~ ypsGhlˠ)I̒!Er wPHl>Cv1cqo}OWҙvFu ;h ygx4h>9 |o*DE ST=P>*@ŠPT ߉1Q1QS[B#*tPkTffbc8 }mTuӞb2{f_*@ET v+0߳& x*h.As4:B< ө Mw/hZ._;@]DS uP}:Av[)7cP4Cxcxxܡhus [K?n  'ϼv@}W{C}i>ԧ7B}L C*v/gz{9-9Pom 7z˟B=??QP[9gA, ?s_w!@s8Tߝ|gA u=bsiuPd,z=xC G*>eցUE|a=ut8dY^J~:,Jh/6n Mg 4dF_~wٮ։Aϼz˯7!!P}΅JyBVO\Cu;TAPn TJZVռPLJ;鬟I|gTP ՠPUOS:Tmx)(f@EP!PVR 4(Kd(h|Xe(ze (SWCTe (cw@v }(oIT\s .ctpҞi:1Ot(JPzC)PF@ 4m(s2/"o(^B lzlvK\QP QFPi u8-:?9KYP]eY|fT62.@*IQ@e>*lXBuЙ֏q]ֱ W@T@7 3 V:2P5zP~g~`6 e 붊hvc{_UdP(Arm8l##P(7A[o}(9AM;3`Xxk{uD= f}C62!%}L:u.W_W3K$saPa n (dķdq/CXi/ҩ}{;y)gMyx\g,eYoSs9`4sB{YMGsbhvOf4_As4'iod_#_-3rOے{B33ͩP ͈ǿ'+!KC]pP{l/+Op>vmz8uP/2mIV#|/U*c1sD?ZUy ^+ص*BSyc ToC/|E]p3O:LPNsPsUȵ9&L|bЅr>Pն 'ԍP CՕej^z٩}8/~<)\'q}׳\ +p :ys׭\S\zܣ5O#Q^(_(r(7(_}=P?MJQV{ e91( 2Fq(q@ـ(ka(}{Q*R(=U-3P:Gq v6Aɏ(Ѹ$!JFĿJޠj J.lmePb%?d}t(FIk(~%+Pb(6](^`Q(2~fYG눇# <0[nF ĠPWNPP; q-Q`;{` A~U8㬐g CKG Oă[^xp=o<:}%xиj{!/wBȳ;ӏ#{0r#I䆼FAވ\=9\srrF!Ga7rF!A)E6B4dY!zY+u]EYq9BaȜ? }! >p;cG1k#2z:!xB+5D4@ڇ2e6CJjy/w#R?"5s R m -)#%Rn"eS&Rz"C퐬SGTIVH2&$-ou>"AeHꌄ=p 7 aƻ 3?xZ_e?|2A%qш[ q#WbGlPjbGGly)kۈiL%W}&'ֽp 3ǽY(~݇\wo縻wǤn;Bǣ.عw@]DEψrDwAt=zQg1Q%7EoDFNQ>#JFETjϯYq 2v"i'CU< k 9k "Eds%">5DCDXFE D_5m1 "#g@vUpBE*Af_s |jzNzo#aR",\0~o0;{a*C>V>-ДP?uxk=s{!tm+NDO6 ] <|#-BFHBAF]2Bbz! t+W'B"d}z52Bh;#d:ځe*BZEP Fp>@pXG?Av^` ;A^wsb< Np>4G"#( B% 4Cti"CоھA>VZ h-KCЪѼgs9V h1v{!hL~늠:耠:*Gб0Bm:s Ag"7.t` B;k*? ~<j$UG-Lg˰Ak혧E"_uu{omNBж5Acq#Y3 APP^7-G!Ggsƺs}k0O `wN.`UkY:i[2`BF.GCJ`#!!d~uaS+اf"<!77"6!Nʾ&Io)܀fk>"}Ovv`О}3p| Z!*PUc F"TFq]{˼qucli("[,g1#%O ?B>EHB x낐[M9V."dG4cSo_3N_ɶ@ucg&w`KntW![S~Ӿ""Pp@`7)ԎƝ3qǒpgc=;q4nWpܞ%#BBe6A8pUم[g/V ;wp';w ? ? .}{w cMb|'! >s-|VDgl|Z{xl 7{wP|va[(B져fPoŰ5P4 {{RA YD@62#m AdC k^/+W c,^${-f9Bv>`_\ `n[8 >pX]p67/ 8P±68Z Gp\$x+K8: G8mNtk8 pR¹qg8:h+O̅.\.2}\Ŭ.!oR :n\+HѷZunmfC/ý;'}potg ౡ# 56 6j |9^mrO:U /s ^%+kPd!3SYAy#MCnp-!7c'B;fBj~@9JCV5( P:&>&>+u0|*:|qok m{&|7r:|gu~)[ soƽ^9|ߺ)':;?[3n[q[pTG`y!wn5^}-#v鐇;zgp:q;q$NB4ejCԝ[NAQ:@wG wŌ+ݝP&rv$a5pikk~!sZ"aD^Q1w"vFNDx@}mD܉ cK5,QZeZ< Q"=D]{( DLBT{@t3=>Ǯ |>=#: ]3n;wo]:k.q7Rw nO5 =4ĽpcsHĽ@+ǽn5lh1v#fibG̍ pELF b"yNDJĮކSgk oz dčY^$5qwKTq!-OF B~;/йƏB-$K 4$Ć!U6 !CH/81V#qN#qQ$? I% SHl; ?"H0\!1 ]"7\5ćZ#eM *įzx=9]!&ĽxvG\nW"έ7nA-ĝ@*m9D׈q!n uyqkqM b|Dو ](b_@lZ7WmTǼYzMˈNBl3#Vqn+k?7;#=hb^B챡 ہ w9әϸ >#Vkb'B숗ttb۰4Glq1O"lNB¯Hl"G@tw$Ύ]H<]Ds$lBbPS9u~:MFR;$Xt' ɯ R>"Iב.~$) q%H/r)GmW#uBRW"dR"5R C'.F/@ڼsHiviʑ$z!}ωAH7@LGz.ҕHfc2FFnd,EƦ8 nȸI,GFbd@j:2GƯQl͑7# s2>!s #sPdS54~{t dT 3/292n#Y !Ddރ 5k(Yk"kg32LGUMȲ, d9D'dV"w=#+8: ++ YO"=~Gϵng 1dD@gdeXBP}@?"{Hi ¨ d: {"M#{k/G6"7l@^7 Ǜ!"7lLGvyݐb:!$tș69 #gksېw9I]S9"I W?|{3rܸr>=kcᯐ7y{g> y!/9޶nx0el`x<OG)x"}'yxf.ꇧ74E-~hۣ(PgKzE<7«x~F(>ֳBqM JLlYP!JN2%(z#, %go[q(U(՛(]5 [t gPjlR!(D Jv{'JCJP'(=Pb,ʺ@Y?5ʆF-MA٤ZM9@ lz>e$&9gsĻ ((4ogDq`[(N/$8q(ڈ󺽌"֧. P\*WUsFI#v+QG^(%`X%kv BQ#+A<%3Q5%Y(yを? QrJBi]aP: Y9.b.B隅(mQ Ts^G(R NsP*QV(}ƸDX߈լC(U=GP'vDIE y,lʒߣIjfm7vQ޳d|BB-O+F(_y(7rf(o({nj(Ǐr(7hAy7@i (AʘP&}2+P>}e(PVvj |n勻XWs^uoC9 j;k*}PA Uuԍ\5Aԗ@OA꿙tm ͘9,fzhRhnxBנr&44+yl : 79-Pѽ*b*}Gۻ4T\(FPT8Z*\PwQQkir*\5Pm7*wB9<ʣPyu\@b+TkrVTXߧQQ;Pa ^bb(*nt4a֩8Mߎ:(ԲP]zRuC-AT@*PI 2n5TEl.0Ae*[P@rT6KP P/` GP̈́z'6BQ U>:^ P\&@VP'BݼF>ۥCyx^n} _9"u>u;9\ HN~߽dz8Ar*.PEv*T DxrBw**e\+['Qut͖P(O\6@:J>?Mku9M]!Ob~ޟ}bT@_[O C#uT+Qzp *r>ysG'Hzimڄcp C]si f iIsiz# 9GC]j%H.SA;*1+2} bzbꭆzl<PwYuuPןw+ޅZE񺷟(T?| zcnh,&r?uKԙNc1,zDgu9p-ԧ6 P[B-\: j{QP̀: 'rtiQ MWZ0LP {Bn;4N,BEUĺUWOBg@s`x>XӾq pIu|}w3Wn`C=}Xί:uqecλ5b .`+v{V+TMیJ1gxx?Bj1[g3Q7u2[?&)4?:T  8oX4w0TP!,GlB~^ffY8?Aڭbqcx*zbA'FQ1<*Fg x6iwQT$6E^(ZTEX<}1O }<]S/)?y')G) O x#XqƃVy+@e]1ȫ]k_"wlr|FN)>g9|9Ґ[ߐv<eK4ٷ6 [l>V[H3#{ dwbd՞CV.d CuE72<F!_<2ޏBFUdCƦ<H_}C: xE-$C걝HվVt6RH9):ˑҪ+WS<ɝ!$$ 6A}HĂHU"D g#P$T~@B$CnH蟎x戟=$ q^ڈ۵qcsb#ֲ bW!vbuCL 1YInOw+?ٔqm =Ewv%7½>7]g9]=":v3"DBTXD9#T4{#j!iDGy1"W!rcDC犈t{DxDD?c#Ÿ" UUNGX/DX4yBaZ!)DaBaK#lcͶ@>>a lta=# aM~#^KChx!OFhBo}Fd<)=g"tU@(uC= -7i!ՋR!!#!bSwb9{!!dBBY_.AA7!#SAqk#Xs ":3{"8w]`w ؊צ>oG y'L< DwIBpn M{uj2۟Gp|Ag~DP=ه4G 3#TX4_AS!75@d*}=hgo"p_7k!pE8FjDLD<6&-h_>NB`I>!x_" 1O= h M \-iCMDAХJrkG:m{tt<{ķlYmA B-$FP]e#4A6;A>8[mNJEp4z^!drBA!$~"B#i{Z]Sz$j9/pEhƷFhvLa!Ka#v "8Ao9dRyF 4a\2RB2{v*ւWWxJx-!`<[F!<l͗y6 }a6e_ i`37lFaWLvfU,#6M\Im ظ́l3Ey+E^~͏m >a; lհ]{Ea{`ۧ`Bm!i}ɐ*گΎz.NdA$˛Cn$gAe $@~$+A%$~Lސʄ^a/ڱhhgS6a9O>_d)[ Ey|=HΰܗZ@b1Y6C{7H<C8G@jI\HBtu8Cr$w1 DOH2 !y4A ѐ|/jiɐ-mHtxWHLtjH_T!]9M 15@j~Ri޽ v4/Uv]nY v7}4h9iήŽ e3"m%q;oKэE]cI!x~%v`}s/x?I|v"ە[[cvBgk!-3N.bŊnN{&i H:(>iܺuP0AğSofVAJxktn.&r vonJD]'s|ط`Má8LMZp0 YpȚ ؤ‘.qz8 GpipjNVi3̚5>jy 8o~såeL vptK\^kpgկ\: MI۞psjB7 3p߯wp/{q{Gx܃8 Yյ^u ^_@fٍ|wȷ_5|5qUP{u[6w6ヌ>t3* >KWd5|'|4m1]~gq}[nPj$oy,F8~._5~o+w>Ie_' R3j[Zpk_r[iq`0_ M#inG@tR Px v#=>}'p۪ n=«e6;pgkܱ,-]w!A he:Mg^7xg;'ў0%1 ~&PP+#wDOw#b."A6#19|_(Q f2]%tEY؃2N>QM5+qMyM̾g{Yp~ouG1[{jwۦ$OG p kf1_#{LB|{lcc 1N9t1n#(DBLbg}Cb^F6m7#v5b"vCKYXĺCl#Vun  qW".R׺X nHӐ NeHH}&c~ qnwȐx;H ">lo ^xG,~f w" kV"~Q0#~LďZ-#Q}pD\MJ{".SqaqcsQ#C;.G܅;q'"hG,C^;\>qͪ[Š:q;ğ#1e{!)V'dy}O!bٌk @׾[Y' ު.>+%_t|$e;;f!! EnF $ne_wH7Mn!7Ԏ?g#RAX^؄YӐ=REMfH}Hi-!;Fs~=cfi1wz;H_f~ ?-D892 [!SL4duCrdAV2d A7odwRː'"z-}YdFx4Z}9#)r@qgH]#BN/r!'!r2}G$A!;Uw&? % ޛGo4Nu[߳<>VG! ?\x''S?3}ؿ3 $!ҍ{&f,g?yr Yo2\$EoL&ѝ2m/#svgV#עm]C~k_zD~#W%V~$ߴ);`\_擯YdUL>+g''gP(LmI>#-$c7 !_Mȧe yg$Iq).&ŕ-0+!餸O onRT 'CYJֽ@ߗȻs*)bޒy*!}8y;w@u&-H0wL !#f=yL8oy E4өOIaD*Rbg/Ua8Og$;bOwRj={RX?wW>0I^gl*u"t ĶYN^ IVA^?wdzC _CzN3$k3܎dI6[.O'YXO5C^E%6OeɺY<]:2|'udvsHvu$Fpm!>&YCM- B ~֗e^%ٟW=W/UGHu;Ɏ_!yslALI|dK7,` ɬVuK~f~$$:Ͷa|>̟}o O0Y,}7C&~9XWH)ɪf1$;ւmc_cV岏r̖/e=úo!$5I$oь7'f~ss #$Oレ b_ua]<~r'|.;?p5Euaf$c}[y>`)I{ y=1!Y1n vgA3ؗ$[ξhzMMe쫫YO7IʸonIު4Llt$$8wm,/WtTkʱ9*;yJ'YA-bVLyO{Cﱎ6`%I9mud+8SIƵIvq(If가dGA^=p<ɢo5vyzu|9d78?Ԑ~;u X z#s3[C5{Ŝ's k{!ue2 l${:82H6$p}JgXm>#V웜\IyMŌa/+|Lj:w\ 24g)8G:>d>ͷ/Yf_7܍s{,y6GesI;rB\qN =H0ۍGG=a#i|D= \׎7 ( nŊcY+8Η}#hH>ױ>'3[HkL ɇq C?<\zx_R 6܏s/LORLDsc$Mo5_'yF4 &V}ŝ5$}|+8t%E5%h4I)t*Y2$` expS+^QtX9APKRiqƼ%ot;+'xR5&/^ni[Q1"q=%Dzg{nw'難H΁}r3ܧZ&b~ks'/ z5 63ek.I!4^$|xM/{kK>CƐ7ǖFOǐV?wVwMK0M3wHK7d$9%s qzvk_NAD^u"YϮ'pⶖdrD^8G^d#/׬#kHg@^zBYtq?Q|n6k3ntL7Nit p}G7FFЍtcC^L7:^t]ϱ=Wh]ߕNVdu$wHVɪҒw GV2GA/|K52!fyj:OV3\qYoPW@܋XG Y.yMrG,Z?Htɒ^xcOUd,5' UG(hFVodQܖWbyl@ȢsYSzYGɂt's?d^8̓ړŲndѦ̳&7(&dcS*`?׊/dKs,닉d}d;%EG֫ gNֻ%6 2=}㌯;ۡ  +) σfyj2,j?dށk\H+|t. d~/ۇurMe3n0X!_=>nɌ+=2+t'2O2 LTdp!9!KDfn{d؇$nH$iYb2]Ef]e]{;9̣k5tHfCw5-tmZ1]殠kf;CZUM׆ӵRjcD:kM\Wt5`8]vnMW'Yc!C^d::L ȴ72tL Շȴo72G6idCJ6)2 6įLdڶ>'[ɿ{dRw5dn_A&*-2E&. Ȥ|,|^E&EdH&dz+A&$يL8ߚw$gtm6݆db9L!❢d0&GȤ5m&ĸ/wIg2i{L6%>+[GL{q!̙E& Wx9]H&3gU|_IS?ɧil/fd9@ גjU.dScd H'25`OƋ^{14$Hx22Oƫ>d$_KFRx(2Hƣѫ1d<e=x3}N gxM2CFȈcx2Gzdq 2ݘό }2OƊd OONضd52# [,2~{}'c%~"c/uцڙeMәΤP2nF-\Jf xV+d]tfg=&c-W#2G+3dFƃ:L+2nx>!|^Nd;$DFadDFN1LjџB2bTϒQZ-{HF'#d4=!Sd᳏d;O&]d _&Cdѝ dhZ]K_tɵ BޢKFhJ2:uchOFu\FFgW0Zd]d?٬ hGȈԨe%d󉌞'rdTځuD-_82r]LMd}7 (bwa+\(AFҦ)gK2*iIF#Ȩʝ0߯F)dTx.q=+wDnQH' j욓=8#2:2"zdd:;ϲ/cZ[}XnO2j2;(Qd4VZ6"cX_dT \'!l 2FFJzf6b f;f=HҀ1fng}Kb9MFl3e>P&Y8 1yd-tWO,^%Й ?3' d4 ?OFd 3k֐Q|DAMx9V0u'\$û3p3cG2|bJd GdԂGr2##"[dtfdx('J2 6Mݺ^d" ]}6Ӻʺ]bMoo ]zGN Dv"Wd4.;J>Cph2d1@Ih -d]Ga]~3yiߞ'C oy_nGF=8־a"۠g2'L (x4$Edd7[3d4(}/md1-1&#y_QFD*'+k\۱dB:6̫d,2ds 2ΝF&krM-GdBy ]`9ty,:5t90.yFS{d=]:Z2i.&z $(L#Mĕ׮dk%g2M&y=t|d0}F&LMn)xS;q?)ק+'iW2ZBWVm'GM]9dBW6teyr!]پ|GWԣUGWtubɸOWw-:t:K-o5QtE} 6ětͻYk t- KffY2̮ =2Afm,$yd>ϓ<f)m^ k]}>,u\NGCb/ؑCK\s,^a> }K{~3,+֑dHVsȲlYFVdx8dՁ. du1<MVƭȪĄt}LN(%)vu9^8zNL_&Mkl%m_I9;6{#m&Idk$-dcA3md;W$$jH?o"6 $1Hr$LT2i$c!o"+'.d$dF%+W2_$Myo3Đyd} .@ i?lݘgs}y:lG]c,Rƀ&٬ qy&<|B6yt=fK!6ϝ|'g4}""b"4g7:l>'|ם|y] ۩32=qz@sKƆuca,D 1N*ⶖl-5l# |Ǔ&&Ͼ2l=MώUdS+A}vL!^BId/ZC 9$]7Iqy{$=@Ґ(>Ke< #II_$S$I&< "nT'sJv[k;n#Cd잼$}>^;Mo}D/r%ro:nd_ԔSxޅ&$2rWLV+9,[Ia rDCN7r "F6s%Jn@/C89|ڑCcWN !=GSao9|7jr!džqW90s9YL#rw%Gr1#195WSԻӚQKNI= >du ]5Ƕ$G䌳<ڐ}r>\i:H.q2P Nr$]JHؔd漣7!y$ךD$£ԙ^DR_I3I}O )~ EQ")fOÇwFv&{WL/'+|!_y@>UD1J-:o}'&_ ཇɯoۤ$ȯ ;K~o3K~Z[綘g(=5&+''oKYW{ј{ '_{--%')?~B8?;r)~N&cKoi."7{ &_f '#hk+'?EE~%˹ͯ{o!gnwщߒƞ6[I~G+J#)"?N oO~Q #NWzB/4PhfP3PhXh|'Y Av1g} z?w ;P+!t[%zD30v0la_a„k RaĿ$0F+aJz=D,ar0_WarU0L0uY0E0uf+a´G/ie0}A0-l0OaFVŒ)XAK5Gi[n8PiX*輻*.*OAm3t{t6_޾1fGIق~ޟA`W0!w#o`M@A/RxaH٩g@_=OOГHPg\Ⱦ.h?I=;#Dt :W ړ&Cm}N툧vsA۽mI [К#xk+h&h|flff<!ԾtKtN :A''FtkyIk{uFnuA ZU*%Xt ۂ@^C3O1O#v`T 4 a" J"\)25W|n-c-e~ ,7=g p`_[-ʿ XSN#AggEЛUA{mMʶ{'hmAGY1+dotzc :~K-S=z,t|y=GN`,]--ttOWtRٷ )-N>A믙0m!%L\кsTn,h+3T Z 3396_ 3>f 361-n&h[f aXAgo"WкHо^?UAZYОU1)w®Maz\ azF0C0}0}WaBA0=jNKк9Dm1C%hu_y`֩5y f]">FAAFn_s A\о'~m6ygv.ә'Ŗz=*T@V^ F m('NA׌cA^GЎeI8'tt9rvnۂ0>>ypO α/h[a t@%*sUxX %m@Юa΂n2őZoqQЍtp~eԅu#1ENtc,h=qo.9w.}B1 tϱHt^9k' '0Mf:88[ЙW>SiX>:Zн( eyrZְ :+Y7\j DG,hqlAo6Ab&y-!:6R M3 zw6[s>[5"J0) (k0P/( s4m}@aU݅ # -: z `Ю``0sFAm.,yg-^  !@0q 3Y Boq*ΫMN6Nz@Ч00VЛ%@6_{"8*y,ROW zhܛ?8} fxWj6¬6w`(_.\a.4 auoaV A/˜tAxska A^'<$J+̎ff5x.zof'̪f*~=fofO7Taָa{manZ0g03BMOD=*~sNUM4I`0 ,.e{ BB`-+X|YGml^F''?|, t@Cc~z;aӯ|q&,TEס[) @nn9̵9pGkşƦOwkD[=8v朂Ópk_S2RS,;zy@87ji / E5(cS8WpO7zL[|wʗ1p,kؿIhtnp|NZ?`6gP ʙaG!Va#08Ý)?a;d8,j@ԃl8tW`Sm {|oHw4j9^U*bW&7L]+])gN*??F>םUa "+.:C3-Z[M`G#\ *)P9}}1ɑwp`#W㊡2!;w|Jy D8}# ;kC}X NW(~;PlIv$;_L9ip4'3WÇPFsٔly#TSδN[h8 "?aوGQ{iO)5!Ag>$ByT&ׄWA:_"LU86c]'TJ"lQ;l-[wL;'npv.C;b?p)"Gpv{`M90In_S%Б 9~(& itV4Q n47νM{L˭qO!E;NSНۜI S(W=z[:݄9ɟ|8K:n7Kzӂ}4ߏ/Q_K>j_Ljs~]$]Y88hE1d<Og{^mq~ ln)F %*zG" K|;#;ST:v+LqtTE/Ã=t‰Ip8b ,GG@:; B!}U}?,0Vv.P圀jT3ގ+݅_Iлb=BN|{W`߉bP U TL:@|f[H6Jg$|6`Mx^Pգ#t7(~G dOxLTUNףؒL24vOnT؝ @z7\BoGhEPEv iKqbaO؛?ջCgxáA'7}Y"TY'ɦt`?bC)`P%l}pՁwYZaw0һ|}`7 W>¶r8~zMGG-݃[iۅs`Ζ1`WJgO>+??ma{bAM~{KkFDoc`#0{_gnT5zQ,u6oB 8ٙ|yv]׍oaZ?;oW),ݍ@1,hCQMxF+T.;EpJ8u!/^SAoLOzW&OoClKJ%,2pբ7VB}#zkhzsw#ܒ a+`7 KM~ɛ :W`qo\oeGkW ؍9V`w=.X% \<WM˓p& .FE8a;Ui(ݠ<ג0^uMgD!<8 .þb=,Y`CwT|-\]u_U`{gY`Q&5s\udF߉dw!yv59x0Z?r=ɱ,tv nxߗ`sқ "W; Llv%]Օp3 vmlwχps;7H` G'voov7N|h܇y}>aMp_7'f{^I5Tj_=_nMp1 n9b&4kxW9xJK ތ">ug;<çBxO̅1.5Ȃ_ iFzzNυɁOi~ko_z h _q--H/^ U7`|GIq~5vox^ ?la] g |ovݖ _m ^YD]d[zt uK?>4:G+a=7η $_x)|F:w/q;fg܀ۺ} Hhl5|}xj𽩢6~Ƒ>Dtu;ޥh=!^N' =$[6g\/xlYu^AfH$iJoIz{VW5< l} v/න|w:?µl`j;fզXUkp>ι<NG8'L$pC8=#m4¡z|ܱb|ק~[SEoe oMّ:3J9g%T!p՞OP!ܾ4a88 R WPFf@aBYs{6ZF 8uCoc~8V7#Lu&mh^y$ Z?`G ʓhLX;.NInzOѻ)bmz>ьZ[Մ*v ʷܑt+l!a^a~ EpC>aƔ[ƹJR>a[>` iN.z<4]>n^k;qzl# LmHWλްSsh#A 6Gioa{z:z$mg؝̄m'>Lm5l_WΏ׷{v`߳O|=shl !C6!!=L+W ل^{`58~IES0&.N*Î7#K>ޒ:4wVT =7"4p9d+cƄi8)} L'?iOo+f[57faJ' :/ &^.ɷ m ѶM H>qO+S8ͧM{л3p-ao Nc /^Ez RY#^&v>1~қ;}T3) aZJI癄 ]c tN>(I]Pkg Ӥ-_s8e)քX8W +0ք߮Ԇ` [ ~b̞f`[?`#^kKp|a}kTϸ@9~?x=6xr{p?WWRNO 6{iMζܾ ɲOEx60,Xi`ϹE4w|I7F{؏L\ʇ :K1`sd$>4^sR0joҚj p-M9t¥;WFs ܦsýh@`±pBg;(YO8;\ kp}>n5_p/ikirvb^ Fy" nUgpn۝Aޙpv6НLR6g\p[|Npw[1@-$,&L Gg_&wo_۽! gp/4QvkMx[#dTx/Ǎx^f/x淄 A!?J^ӿ+/^Il /#]Ws6slxև=,'NF֚ O)rƵ^h h<F{x};I4^Aڌx^n~x /Jx5} @x "[xD2N"x N6t:B ]:>9»9G׹F ^J;|t;܁: ?{MZ4X6lOѼL߄o W>7'#>ltj |'>u;§|gI[x_ & Ճw&͵I~WK{I/} >.> itP_]y~TV;}MC~r% v'.OI2kq2X蒴7ѥړ6S/:?@^$sIt:9s<:i]KOaݢ \Oހ\na=* ]= Uư^[k>ݎ^K-gOC،]eC}lۏ=@x?`=J{ vz)]{ =րmӝI4joqw$>۰(hMC~lz&`zDf:G:tݰ~a6Z],KYtDf_ѱK,:VAUbsaU :1x$tªw$3[Ż}ⰜoM;C#,2|sݗ@`h }{XVJ:T_ _`5%|}Xtl_)UX5 /â73g)fl2UAw\bȵh7m+Nڥ٣M[)/z17ua0Z&r6hXEGMV7Gl-A]Ѳ'jMaV0fu`-2a:/Lht4|SHިFm44̦eZ6HA/k*Z>_ڟ`j` ˃iX^<a'z̫+nC/rQUⳌ;l9CK7Ze$LuAL-Ǒ$?L'}cI/ a5ք0߿=;q46F0:F5c݁Qc0P cPk`']h͓0T &]7„;=L:ٶ5 `E8 Ua4qr 3calca ߦpu& @}ױp-tŸx4WQмc 4MNBhڸ3hR>4;C#3ru@Cf{g4 hPnQKuu6ry .LCAU45F* Y-FUPOꮿu3럡{]0uoY-]6!\䕸~kw{/>v]׵Sz^{Z`{5nz1W];xNx$ITٴ%x݀/م;HsTwREw-4G;R""hen1HO^>TK"; ZOYHkL}_!)Kh1_)"e.Rv 1RVAJe=l+FM7\'YίAh_@jD&.EjR">bX;_ ư1P"Ñvm.AzHeHis18d2m#3++"XZFVdmhZnDeÑvr!gr*!:"wES>rz!=rB^wk>{!Ѧyȝ:r*!G"z!'<9ޝӱ1r "ET_Yp٥V!U]2;NBֲ"d-Dָ 聬jGy2ҙW"svd1BflUdƛ"3:ݐ9uYepYIu5&]K(9bȉL)<Ʌș9K6!g͟HsFCN7gY\[9魐W4jGYC7GΞ9 9Ww"Y伳D:-|#7`rr#IsrGoȫ9MyՑEw"yV+ ܻgɶ[3#w$@nٶ 9\#$dﺈ)lԮ>>?ڄ1ȪsyP3'!sKgdA$C2 q2Ry5d `d$G!#Pa1ꋌX3 2!rd.BƟd=9ٲ7y`d!22~q+^AFvdz dm/Qt3񎹉 2#t i)2N#2GK2g#/YAtWg̽$ۼd~Atd[4Dh5E/QA&̆<7ٲ*2^O7#m@ћ9Ә͉rOEkȧg?dfPxHQ$7FkjP郌:ȘMFgY!NHS~ /׌@ tH{i)QL473V7-DZi~͐i.jH4ij -]f?icoH{i 퐖GӘkeHK|>i F!N0NyS&Ny'9iHKiaC ͱjS_H Q%v#-c"HH+ykJ"0ià;i|IH[i#E~-5kbkw]0b'12G[B^;>i"퐾jdHWAz-gEj_NEHCwISd4wEFhDw2UH#{eNTdFj}3둱ωdEfrdz/* "2,g!Hҗ!j@zilqGUΑs S2f =!U9g$C~@:($R0:wvкR/=O&^>H4BzM#>HI{AJZpeHiO3H5Gz?HsA:})ZF3! hnE CzHwǕlcF |Ҷ!ݣނօd*ȇ~gsI)k_@g'䣯#5#:H{@iw_*!=GZ9dFVH#v/=:Mw)CtҾu*}E:Ih@NPt+Lz%&%=L"lb]s;ߒ_|sV nS0~o$GTd<:27QH9od5},kQ5pA'dg%-!Au,!'hr{J1rn# B rnP|v:ӐL!K{0sw$#w%Y6-|Dr W35s9e-/8ܞDD5¢ۏ+X*dm7ߑ}BdOS!{@md#<; Y\ }s?G6+AvtdW M}{M*dML",JYj–.F:AzrYgIWb6GFL!ȾQ do$<3B~OdT%y?CMOhbd#T#oTV2:u r#r#IkrHdQ?t9-MxѐQa9]ܤgۆ "w!d:ao 5Ǒl0VȝOTżqT%ΏBn'&En_©[!Sb/$“3/tdwe)Î#[4EtndMV]y5KN.ڄ6i1p9tgߡr HxI26R.\<-=:Ң36r Kٱ.%0/DjO"H[_$OH|c!y7jBX$/ydHuɦU0M;$7d {\#Uv"nM 9fu0 Br>H\wܶsc70tV MꉡUn~Duw$ۋI&Hj CV=Cc0oÐ8# = =p Ì mmS /Hhpkr?e2+@v8Gܬ$yD!`=Cܽ[x qg )lw"Z&bg]BFmos1x_ 4gcpB[ Ν/`p ~v'cŸ1 b*0(5 S'  0p7k!1C/ +ƀ50`,>01Q/ Uw~CCi_A׳wm/އ%ތA5o!u~e軋H9ljN#GVзy\>B}FOow}ףOۛS.zgU-A;B#лJbn\B툙::991} -bCsf 5@?knCJ6GȏULTA/l@>.#z~]DǭAt'v hhD2Cԧ: Qǀ UxQQ(DٝETǖ2(EˈҺ\ S"r\DFdct='^l> -"Jz!4D7u‹- ڟvk X"lGXU a]P´6!i:B'9#tzN܅иPÇ !g#dfg@HBB׬A(OLEppG@~]썠x ȥF[D s.IE`R5m@ V@f?7gB#ȓP{yBmuÏx=XMev,|o#L!m)_ 1B>Yo74e̓_@1G&uF75|^\x 73>9>ᣟ 5Sxo-Po'n?e^{.k+Mէ+K ^޿j/>Z)[{ESx Kyc9*Zuf٤ uS<<{<Ǿѳ: &<՛<IM y^.9Ux ?Nk;n:d+ Ŷ=K^%UIn«?|90^!E /?ߗBO ^۔3譇Wsk^Fe:d_ZW <ëP|wtҍk|(}vIv GjIgnK}28\y 2$E䇄d3Sruvgsvxz/ȏqY|u2AG"Շ~g-7thte fslx%}9iEo.wgd=*:R⽞t.wHUzaS5K.)?4V¦WɖIt۾!#Ir4麘sA>wƟP| MKୢ<ы]p3b]JcSW{@x<۟|ZOEށO_M7>3b||a#u|6])YenwNϞl۫2ZĒh2og_*TH-=u8Sd'{ |8|K1'1I!GlJrVOpjgOד.{|H^1&~$KAe-ؖ8z+x %n:x Ls]sx7^kj^=lRbC;Zz*M{쁽i[oYkA)>݃f`-vKnf.2'a)wy5`qlͅ]G^ۃa{ ;ba'l0NKa[P 5lJa۷lNvs|a8=+!wSYv/8ͤ3/}"˅IH#z3 ~FAe|Ȟ~Py| TMȟusjAݸTFM8CY\Gbz*Úğ^Ro2*-]t7MK/[iaO}K>Lp6$wף1m}KSl(>^ԅW3{g6ɭIs&'?@ruEzP9kʝg5ޠB47Gu>ɄICm{YD u;Ѿ;(6V٧M_'⎋{#I>1_{(1~"s-Zd~O_Zt1IM>A9q.E'-TVPSLu!L`^>?xFwTq7IiG%RCd^H6-u:Et$:PA$æP$^[@'9oLSu/*ׂDTgCuT:Lgܪ?P 6OX'= K׉=mo/W~MiuAug%ghi:UW)>"ZOd)cgrn!Q݁GW+Bqx8wAm ܦpۉ.RnrM8=۲qN*KCʛ/9Wi(ktrIʗWk] 87 疄<Mpx. f\%.N8dNL6ZoHr\^ 0b`灕|[lHMx=p5a1 |m-?߆3vap ԅp-\jn ׵pF$;scOC̀=m[ pkM͵&"ᖽn v!<ۣp2{p#4>E}%z[A<WOc=L@ЭT!hFЈAcs>Ar3z|ED!(#i:;E}LJ3͜r!/zdod <%< xoEHR3B+y!Cs2qBG֋9Kra,B#~*B uB]A)Pz#yZ4o3Bv!tjHGұ\z9BD"kYAaGo8FF\Kmꋰ a"o:TAxSkNDxKj[!ܩ6­{!\ab'*x\GuwG ;F4Oi_࿯rgR~w~KX-E@[:G{7t{mwhbExToF #N#PWWHo+ކ^)qМ$!7$܁cߦ Mt}ʜ4rS~ZW5Y6K"7Vdբ*BIg?bV0owLeǖEXG;"MO`>˫k'wM= }_CZWϨ>YP٦:䡟3%F|6\D-ЯWk^?vc2 q#*hmb1no[adKT<NF`pG #b|-b' vĵs=?t! yH(]cX*y:#1f+ I!4.`h1C6A1H+ mdHH8 )Ӑ:RHHuԀL.j6Bꍞna{ %GپUi})#}Td4 X4”N/>Ǜ#>ȮBvju}d-D(ڋlBy4 lܦȍX*Xݑ;r"r!ߘyM)F* -k {'#mr9㘆=+6Cn<YMeYryTOidD H;ˑo(!ze"ͷ&5ðI 1-R.Ej`:~CH)O@'3#!FO:2,@JI1R eJL~&]> k!dl|٣"{d_FgwĀ:dvOc^uqy|||>Ϩ)Nc3xykw4}Ng~moxlAو'5=P+Jy<7h8gF4♏gi_# yP7wZYRs {ܭ<*Y=8<{v˳y֨j:g$x-se<C7>|x>3Ӕoć>z?.=y[|L,> wl7݀yBxmp]/RwEe#xSw>!1O9'$ [#%|B >}>%>iG>ѬP)۬GQr|bwEJ?h'!s'<,n6 R>LE󢥓yQcY =EλxQv /]x<^YY/r _⅋ yQh^xa/Yɋj6"慯#yᾷP}W{B|fu7˟o_"? +qus|r>v)>wk<\cfd1k11|L׊'#M8_|E|l{>n>T>6L9bO?"U%>V<q45Gޛx{g*|RD¢G f*C=g{&v<ä)Oo>g#u𴳃xB|x *CId>vcOƓvK|t5;rW2-SƧR+3չ:#s~zOy ޞ{Vn>wi{/Qv<&Şlxzt5;vcMmx]_>6d<)`]7,#󈮃xg :nlq=+OOæ'R}ffć] O3dN_6A·Y Nɹ3kA .mxV<(g8Mj+Ky~g~f7]οbLi:L{'\=嘒5O{b;('rqBȗ4>'<ʇ# AI:Ie&ďGxR)<%ZJ>=zĦ9/u9둫sk!6>Ͻa&nD|`_7^`wGGK1D'.PǕ~q.ynwx?R޷?c"6ӏŝep8Q|-:UȇQ7Oh[v=·Z5*xF)rH Yrn-yN 3O'Tv&xX(#mlE|`x>H;/mn~+<5%OrC^lw(Ǟ!ʶJz/U'ḋT_ [.o6ܓ^+cz|ؤN| -헱'f^ =`1+=O $Qq|~a[}xƶ09.Ix֖|d</PMc|"C4ZsYKyQ2|ټz˳ Mxy%㪧DO>'/1#ы|{W,^0`,{<\to[x-}!Uqr(>zZ>jd:ٿȷf||t>g5ΘG("g_tn/ɼs̭e+P~V=9(ޔ-w68v vCWdW;1{}DNJh-cy ]ǻ8x||U /<ˋZ>qП8_ucnjrcʸP`E5nw)X5"QQ]e|Z76nй-W΋&2!ynGR6-ꯒYywK39G|oR1 p6kA> ]~ kqr޾%Ļ;=<=9o=^>q>}5>;.y12$>\wvbOv{9;*(=uɞެdd/}ٻvfv6v)9ݺYN;;=ݥ+Fؽu؝ص٥O=ؕwص͠n;!^/Md{LlNlO[;XݘnmF+2i6=Ɔ8,~_KaXb<2ԏ%5(߱,`1:FNf#d#ޞgc;Hm(lˊ0+\ȞlO#6)3MUɦ~@t hJҫt6z +Ί%)ɆlrYl;Pސ3z? k ecWhlB6l7[=ލћv( >=Y1dB.֎ݱO.w566w6i=h/XZpӂ=lVlz2-1OdE;؂"͖Igh~ݪ݉\nn4ceN+שڃm8sHbwmtXVWR*۰/(fOSv)MC|`؎U*avdxOpȷ{|){>=k_ž.Ӌ=ًRO'NbW/DZ׎˥٫[ ؛͏՚M)[*{{$-`v}}Lpd7OO ا+Kk? ŤaGٷ-?Bb̏iN\j9ˑN{ԱfO*߯1jμJ}^{^xՓyj%*ay ZA:ލ<[kN5x+x7;xҚoxѼfwe,0פ\k:^C^o}oy-+J(^o-SS^kZ̫f-fdկy-k5Ypx \k$e+yͻ\+ zږkk Ud?6לnkj({nεvZc.^'Jљd>8 ^_6IZoj:G:uxy;x]w^oS^WByٞAa#ޠ%yNcU yy־k|QV9)frTocWOmy6ւ7HJT}<~/㍪  C򆛖Ͻyy#qQxlx<_O,ϑ换(4Ӆ77Zk-\uFCt~-8k_טּv6aיErc9؄7nTur=>uMs\M׽oƏx;541u卽n~\gL"mACgDZ[!Oru|ONpUϥyq5ОD9Q_ֹzZyAKj#:~V;ݖNus- (Dr_s]Ts(Nt6> w AևC7r_;?uS<[#ݍj'+-eNxBESŜy[-t\Ww;SS֟87?]YKu@il^5T,̛dYywX}}P|MdӞ1M1D,.\;q*EWB"K ۈո O/m'Fpv S$yƞPKsF)מƵWS׶ε}ROey{6:T#tfYƄ]\bmK(wgܖwdyN^gd] "]:!d&gyε5o|g7ML_qxӵykڗ7Û漙s޼Mon4N.[df+y}x r oo6Jn&zr=YEI{bF-o`,ozȪ\oW?\Vќt+`HG28 }p չXn7t 36)}y߹Q>7Q.F d28Up>n"]}̍ nqc5'5ړDn\[͍qB[4?)Fz*3e+P57< fFs,nЪo:SѤc}\eXMrs%(?MUr78n}67YMrܤ7W|*ȟd_ J&+As ¯dDU{ IS.lv@ё]Wa3a'Caz >!=j:}Wwn97aes.);=DdCܬn8NRy=duH&wN&Tܴ571e02A[֘ptKei)d*=M&gIsIY2,!l!/D64iamabP#'lEz %;G[DwwduR t%! dZ#2_S'0TxZ؆>"$b۹/B' ?cӎ=y|Ko|o nǰZxlG_V3 Mc[y _}䣵;+|$ ȱmT%fCrA\u,o!r=ȱY /D 62ۦЉYU{zqV~S\\ASYu+|U\"e(WrR%U{%>H=~Rc"qŽo +d]%kq t& Ζoh1_iuC?DɽN;,`LWևСg#=G#,z>rB&r}ugYz3xGb=i~j>-[xxy2h/Kf[,Ҡo›ew)e[KtnRs7-˛͛Mz&&}SH8HƩswD7xYӯ iLŠ ލ[(zzwY}w]rGI-~9Q|3focܬ#oo9oYOKU ޲)rm7ۗ[n[-{hmrekl%9ƚ^#w8#95;:eq_.SkQZ EMtD,.p&?GEfK~KΗxΊkZ)i#Qlaeܼ-Fx[+E]`?y5{1~]׹k{.Qi\\]@|W(XƵ>ZkxMmwL{̎W95WWyQȫT\bt|~}} hTw?wcw]C{+쥳#{;豉X̞~fӂk%{b=y^ΞD'#!pWVcUMdx)߯vSgq`ke3ocgij;oroqM{6>nD=eC"xW[{k#?kǵ KvFRR]ˮl.cW:X+R*ٕS乗+{HvYK|mvt4UŚ؅?y$U\^y.aWW~ =soc'iw 9.{Uyn܁›%GDg]d?O`g9Qc{]bg|?y٧$gKczܳ٩St#;u+_t6x +yF#旯rc&y<8w;0S>8Dk.ܙ@g\)bm¥x\*8ڞ]bg{d,d2b֛ bĎ,y~e{kI7';9d=!v'e%b&*kcb&{ȺkSYB're ̈́Dž<OWt+ge;ةA%:Ίf2 ޲c+F_̗uoff<_-V\r UH>tVg-ݔ}j3 H܂d8Gx${bYyc-vgve%;y1Tlv\Hx'cv"9;~;ВͿŽݖر}YYdvt +@^Wvv[\ٛ_v%&%g=e۷L`GV#UbHv$cW]d6KL[#؁V`Bvp;`wf}G>[lT Gݧ%pbk'=6=q[ޢlocl.ۓRB|:flߥʼw}IlY /۷Հ@!;~].˳K*$zvUewmVlk='93Tm֧fkӓٚغHJg- []u[9[u<9(Vި#bs[[ޚȖ c3ױM兵 G{[(]'UJb+=׬V>g+lE [5O^Xx{D{` '`k|-бy3ؼg|l~yaBzZlNX6pU͈(bӏz%6óզL.aN뱹 [\33xi[ކvalcќmuXv?/s*vZ<٥#gߋ`/~Gw+_7αu'cNU^w/eF'DMAYRl2o{8[v~ͻ6OsUk}mr%Ć{gCyT(p1y)*Yw_0| oO%Q/D^JxY>0-',kc>U٘$;BOmgTkgjw yg6|^|v|}s>ׁϵ s ]6%>aqϾXϱgG.^&YNY||J^ O+ӻ/O:;,ԯxɫd>u?sOoWΧ,iŧLs-Z#stQ||+|j|j&|jpUFY$n,Yͧyg>_כIld®[| >~C^\/ŗx>ܐ(ŇxqFLE|*/'&KY U#Q_^WYx,> BAYxd_*7,響J?,f,t*D]VϜkpm,ܲ 7 Sn^[~SJ ܀wW|Cf$ Ի}Vƅ?>A-Yznk\+~e_R) _@i ֐+qM)ϻCs,,BfQg$t%t$"HMCqO4oh?KFFyE8 q6c_c8FO-řD]NCq!U/HiΉ{8BC"&x {[C"F]DmQY--|'9%4ĘW91GDKE]BF/ZAbD|}GG ibs^Φ[[3Xq41XBrj/H~+l,!&BvE]_PI]DA}oܲ~Du#x\*" ~bг {hFִM޲mȗ~bi' .\ ybW5E}<Yw+^, 讐h v6 ;NX?ejvBW)>+iy5LgO`a+=ȫb[VG?/w+J]Qz~(?"yrND7"i|\kD$O->$SG|M99e FwRWś;)r' !" )E@1}b&b4[S|Eĸ`kF n[+D` D]Pk☰-"i򻈙B_ئ٢4O$ڢF {i򷘫xÚ,H#Oh81]cWABB`K[skm >}sŸb&hkͥSBNL|j0FILjVbЇiί,%xht%nj&➈>-4Iȩk)xh/\yWh3wv_}" Yep%"i_Ӽ!59V741Qk4"5kE9m_/599Tȣ!COSr(E>9Fk2%5UE)jr(#k ^GF($x3Y,lG m;6fa+Yʭ |ea۱e,lE#63-¦&I,lb6Κ:*eԯ J>XX! yzv=)c6`:,U2_Ÿ(Ͷ*}$+cffM):Xp],~Reæ,W[Ƃ~d_-X}J)ڂ>Tw+Y),mu/ z͂>x) C\UoYnJN-tȿMT1CXХJ>A! 8G IłfA{7] J@r{[Ă}cAkXm,hY9 Z͂6SDZYм S)gThq.f/M]+ iyDi { ⌂E[hRjHD 13=E]ƦM]c a+Q |bAv,5P!|ԣYeAi7dDwdMT;M!-e ٛ~x,!n;oYeSxm pOn`G,ps[q \YE,poXN ),0B}Y`j wvc}Y`N{g!3X1R!Xg踙v-Y`,rRo۴gfYOtXAOT9 vb_LR~ԟ0,o2 ~_VOk2L0S߱a ]*cAL]V_C'Zg`ޟr{B2G^ߞ׎eZEL= Spe){z.f Mb˕zV]z*N񇘺[k3u@8:Ȗ3S3w=Z1qV0ۢmCcjLm5ÙBvnԭ*e˳J QŘhW 9S=fR 3 -J1y$S7ݭE}4ezϘQn0+T SWZ1L]%~NIn57/e% ؗ|?oYn =eO߲Gkk7z7Ye5 6CR [4NX@gp. 86?}_rIv J}o,`6 6OXo,`9 XPX2RH>162'uIJ}M9 O%Nb|=R#ꂄB^ѯ[CСDA{ 9{V1GA Ҝ]s^Qž,`$ίYYL+0,x) (}&Uh_0>]E)E͕ho)E]mK3?2 Ӊק[KD%֋R+xW>FP5c>YD]y죙+ʥ9X/&}>A_-xi4Lѵ4rk{!FyՔ2 :Pڂ:1ѽFќUIRxLeOE\veIo2a5 vE/T戺X/R-x b/.46М[У"0'E[w*K5HsGآNsÛR fg)1RuR[dk)1[nǟ*5%@y@]MO"o;L+"/VH49P]0M⿼)(.*UXvZJX`Abh*cÕ.( +uQ|/8CNfʘ9J)$0ϰf:2S+xB`N \!Ӗ0s ͵TkJiziҧ<m`!QHORH'*2L}uҾ{Ce &0 Wc꿓G | (ر8Kڞd X`y,I|BuY`Xjp gMe ,pJtfd3X Mũ ^XycBK/jQ.W}WuJ]5Y,p[R\3/D]Ў,pEsDb~1W[׼4#>Qu# -~hHO|${oD狶滟>~#R|C$o%V,h";)ۤN)uo[)}/=:J!U|Wٻksw]=kg;o/۱,7 |ߣ5߭5߹;UoE!{ 䶁]{fL{2&έ1Ÿ(ZA.XM۽2'E.ֈ1'dBwwb)$~S})7 u78X['bIw M]3.h#_W|4mNԅ.{jH$~[ɩ29 .P=J]̌so5ⷛJ}io<+Y,p >fǂ/S~mĂ_}-oJoߙ}}Us R mBc!Fc3 %~RP~ 5a!XH|_{PL6MT.R~[6ljF'~;@ g!9=B>GPh@QPgڥRRVoN!M 7NA:=̔ӧ{h j~+d__9_!/>+~k֊R~W*t*~CTT d!(庛fpࣼiLcx3ozfoQj zsj'xܰq 7čo?F5\_l oc(7X w` K[ zns\?AusKaOn7p׽xayޗޡr^ý3{߬-{Qm>(IZlU62q}~=١\\WaǞ0@VnA}YXz@.K϶c3,Yњs7Btx8`[0,[>['+XfY,S#t"wc=mfO5Yl 2ss]4{Քj喹˼\; fNkk+li3.J[7I۟ՐvYJ;^vIS?J;R>J{>]O!eʼKGԆg3~;=#R|f:i7 iqF4~iݳ mRiqdN$iʨERq;Ҕ㥩UZJΕf>4m#-*FEK˥Ҫڬ[ oKݯH:K6,mSZa]int>iQONTt]W5"M& #m=$vj&O,7E;z4:iܨRiy[Wm4ziRҔ׾R)ziawK֞ɐ65!m!A?thW$Z&k7F:mtʫt%Z15WF9HzTzYzvU+MF}CqϥcK_t}JVIOo'H;H ގY"="=! ./sG:;ht2htlKttZ^i#ig;iUҁgǖIέ^"6dI'IrH{+o=ʤ݁ۤ=IҹR J-V&Gե+HFד~+G,#y2_:ZZ:}J%UܳI7jKJ?IW?%K7m)ݍ$Uꪥ;I'KOzKOF߁t4rgsgBSRbht>O*A:u|tbUkktt+Iڑ$I mGI=l!wDto)i4imihiIҢ[&Cuv} qriUyJZ0JZzAZq㾴ai*ia'ɶ[[OH HO3{J/uޥ~~:RƊ# \f^vF)?hZZGj8Rtj#U>Ryّ*TUHo<~Y/}~ }|Kzs2\'},U.'n(BGƉ͚Cֹҝ4KSttI.UA:TH:aA*wt,Z]w@ڶ1WڡsVU+]{X[ibS>s^=ҞݥCr zJe3;IG*vHGJS:8a5igGmiy=iS~-= m=:PV)rcinɮҴti~[iڧ 4|iwM;)߯JS} Gƾ )Mr,xJR鉽RqqiR_7(]O*::F**?%'lKٝ)ҨҘ.ҔFǥoQi|Y̬h4K-騒KkIҖҖEǤm-KsgOt6Һii:iVciń,9UGtB%U:1A:X:T}tJIjV*|C:0담i{{i--UH[g&JgSL+Ж9J#%QzfJ-?e`GiiE!ҪQ:} UHVk]LyK{Q~iiN&"A>w u"u;'IyH+le~EkVJ ζWfZ-͜:LQZ^nY]I\>(RJT5Hz#G#>\+-v1%5JbH&G꜇Ҏͥ=7WIU uzuGiZif$l4y@44b))Y (PRBN#H*"% cw`c ( 1QLAa5sϜ9sA"m$hxbxj:YCtOHYublXBTu.Ȇ Kw=ٯ=Mhx*) M!t!LCt"֓ș{̖%g}m77SEygHPJ|]Iϔ,ȱ VFg#HXraUrw ɷB<}Hr ZI:M<8t$sÑ/J>+wfk~ QܰV$8HTJ]H[yB>"mG]7eDL\, CL#"e?ywy>i!Cp\#7%͑ȏ,ƫIW)+H:lI!(mCdW ^ك\Dn O##7[!aZy0dyrNj%|g_HZxx+ҲiNZ#UISli^ %mB24'ukywi#&wY,G*7+;35u1rN"^ۖ_Mx`ĈܒL< %?"W#IΦ$uG)lI5۟l"% Y#xW'tƑ r{u)_A9#wkwr&rQ-MF`mRQO$#1i^7󞐖 @4赑/mOȧmzRQ^s.=)%} ᔱ8uj5néq8$,>x㎡wj{葶OFz~<ӱ5dkpr1Nn>8Vv~Bhn'Qorw> %|.9Pt6CahY6n6Z}BhZ6GRDвp6ZJ_彩h.--;hh6q!86G~{N%h G@q5qP:N@1{PI{)Z wi'3=}^U`8=TQnBǝ6'ɯ]xFd~l|9I˫ Ԋ4Io7VMW4\ CI|).TRk/9)&%޹cEyzk'o_ y+y_K^e=RD*#*#OƑ&|OR3_7kdvN-O|ȴǕ+#q@dqD˜'d2;1S@ّ!-D퍄 ,N'摾JI/ WϞ)Ҏz9sӤӤcJ;/*wU;=(_e'u򮑨N%[ZE4 [A4"DKa <,D lڈ 1gI=s KQSb2u1ڇXING9uqQ#W1B\;d|f0}.G j`2bs;KBdKGWLt_K$K$aCJIx%!3%wQ~$|6UCBR: tO 3fЇkIĺ]AڕH{uk,P2gV:ILj f{ydE_"1_ cEc'/!mȵ_Ia?V) #RXijNYOD>)%"u5j2i!m&.e{<ʰk}נºw8 EVȣ"ETq~AW'pjjME͉Q;jx&:Z0mPg jUS'QW%j^+jnA?aq jXfpxPmTxUءҵ8})*ۣž(.Ϲrw"@{^rrZa{ҵ֚M~#Ƒ7LHpK}AZc@Z&0Ҹ2|}H`q[R]H0 H F>oC','%RRgywω~AL$>_HIm$`)!%LVzKYH.\}MGiɩ"Frf'GF(-IddרlplUB6v#m$믏$k kԿmōUdD`LD]|Dm I"&Gf#3wu$<]0%zP{eEB#ߒdIx2AuCHZ$$< E30-!S) G29&!N3ɄcCff~ۥ^V&V~3J;2b:/Bv c c!cW?$c >o$3Ĵ-#Yw2d;=7TH!}^zIz=#Yza'i[i2馥bV=6KFQWHǥ夂kKf'HMRR:{JUK{- |!}L;Dj2aW$FvH+JJė:$[F3<x%i)P,wTtPTR7RË˥N(HJ >cinT9R0/rdqԿ4 itE/M\/|ۇ"ݻU]iGNyHp)Pz0t ;KHn޿A~Kt2B[iC#iRѳSJ\^K,پ8]0SsU(>yj眛η8_ΛY95(57.-X-Q2,1f!Y',Y)8M(qӔ.uhZJKɡ %U|Y~FJ> tv`|*Uvz-TYᶤR@򶫧%i3Ry<(I$Vrl>[UIT4=$8&]ɦA 9\DCRpDr'ssIc"yw+X*pːUIIsOII$,_IZ=ɤo,eR,E21n$$s2QIINT=T'sHuatZ"#FJ'˟e9K`T( & =B%F̔1bs7b#U|9K:hmgA[CJiޔ1'5k,ZԱ9Z!Կ^:Estfz&ck+NZH7nHwgٳGkht>nMJnz*t7_7rtX9yRa3ؐ*&z{J mn*B:^)F?V:yP=i`4,4bF#QYr1Y4E4z(iLSnFc4g_1JJgtJ&II=>Ս%R:Obe -. J=S6DVl)%8#&_ ]Lp'E$煵.サ^s9 ܠ{8g&ܐ,No!7k)gr@|ݟ{m9~9=݆6υjmqcp3ڹ׸YS>p1*!\}.E37}<|,[8wl/Z2[QȭTm,T*qۮ?W-ܮ'nl6u9ǭVνe]}͑_ #͔K bH\\HXF.5秤,y]I7r97"Ex7gg{ #s9VNߙ r{sGs#ڸ1rf9;-$c3nS4y 3  qm?U-pAq^P,q[5',nҙ\nFnmneZƬ'6 N8[?׀4f勸zreA܈#-ܨ%13Fsc_s{zs3㜝N?A8srz/m7i$)r37qg\9q7n^snќlnŰ Cʹ5vzACܖ)sLmQbnOn_Fn@m,vgxRl,e2?qqrџ۳Ǎwq{qܞ-߸MzsA0ЕMȵy\1w$ˁ};R6;le=+vmOmjXŭIVޛ-;KˉM۹R.ܹӓ0&N]sx$nxXN:.3HUVWi`A ѦE.9+r=%-{N*,]0O;BiZQ~qw65H;I%=n= r[ÉyD7+$w尟ki5^wHXZ&J'K(;K="/O(V>Otqt4!4|ׁERWcSߖeq5%ǒ̐l'ov(}XzhCK)Iz- ֒i-FםLb+qqGssmx?.v.Vo-7ȓϹKH|.,I( lyNM^MZsyCM'z}62Gp*O8~ٛ/[8 ,iNrSqZSWpu9F!۾Fqz-AՂw >4Dqr2o.]sFʛ9, 3ӱX̩Vr}7e8"o0_AxFP1@]kb{ %(3<(8+f8Hp8gx( n_Y &WZeé 2&rNTXA{8z.XE-ŵN+Ԯ<ܒdnZn{ܮ}댸o#^rqg.8qyns6syC o_sGpEӸ 9ݺ[ɕݘ=|ν}ZuK(4Qwtk?a j(bN#GpPLA#p[_ Gv Y+>;GhZh;RhC m{-t W~KAAaNՏzT ]5 ''E _  g Si#& /{*\S "aa8|a! fDŽ϶K>W!|D²Vr! _ _/|$>])|U&|4X'შv{R ,|ps&ayaLCxo4aٟ|D=aRB:A(9pHxC5o^]/Jo$rg ;C!&X3ׄOIC)iGE tSέV)aCH'PjyY(9xMXRPxUIJfa aQHX/,Ey.¢XFkYc12mFMlK07014w"P| RL2D호)<?\ae;X&쾊 CHD0'Hضㅳ1[ZaLbqC`tFQqDL93pJ=\t9.PKEoqY[.}+N.et9Wk:a4$n/\m/uy]~ Nvnqs5n_;f6N9㐋{Fx:VC)-xfǏã#aX<>F?ڏ'\IxgLyxD<ъg$<)2Owi'3a[~~vw?}},#n"ۉ?6wmR[l7[azl 1/뙳X chyk-:m ~au),MB 3>0(6ïձ:u+΀6zX6 ' [o3 ]:"[3]Xc{JYkcop~/d4u>Γ# v,99L8=z߲!Nſ}^bWI<1;-\M{]ڳt 5 l?ڧ59Ӏ:B,7}w>^ ih3h !{yK?b@<=n=t=d?Mc^d v:`6Y2;'3&; ՠ?^Ow Q?|o/lŶ\FxZ[`7lkkUi[G0[C:<a_ ^0az[ W2bk?[l ֜2v͘–fler5F&{[`75|[f X"6lƠlxsG`CfS\G_S˰k~ oc 1ۘa6f;>Æ ؠ= hc 2]h)K&W lU##cl/فg{Os?;0Y?>a= WD*_T'߮m3lG7dk`( };6 l؏M >aӷ4`ظ 6]76d75.2[sX]هXWGn9k+bi6|TھBƷXkuklUX3~nꁟ u/~yA6~vՇbV?auQ?jgcNFy~knksc s]_kg2{8~2[g 17ř߸5[ʍCnV5EY1]5we7kX80:Lڵ?I ?iO*S^-ՎS\&2[٪kR]c-K\ $ /?`]uߚn:.4&Xs 6bu?{`M&qսG / ?D3P?;৪I,yq9VU:b)wn$otVuNu^{ O۲lxF~?†rWlw*}R?&[O_sX9`~5^a>>flclf~/7dlic+ yD!~+w[orkrg7a~dQcSW1?Ζ7/XU; *fe:WÃU<| _ 6|pYgQ|n_.~Ʊ߬֗= #p<~ arVB͞|3e D>=39X2a]!yX d Afoi;7Ͷ29oluMle]Cq0v5b'LӖ!Ya ;ERj fbՉJYM3dzNf6v6f4o2[m~tMrM熿_wcG>;٪;/Nkؙ GSvliه7g_ecVmxM7de c6oL^&0 7~Wӭ<<|d39- 6mځ͢lrCfZvg[ֆa˒b:Oϴ2;!Zu!/c`[]lXjѡl+^>ric{w^^{^ǒd@ O>U޾hfge&L{XH{Y޽w>iSkik}hJ;DLSeuTN0PA|h'/i_U9UA}G}7R{}]HQTU{.UK >z.%J?FG5T 5)HvzT+j9Tw9Q͂da0WI՗LjG_5Uߦ*&Q Ji@G: 4U\mMR'O|-*v UP_@XPө|+*=EV.Td;U:$1+Q]TqPXH\0oQ%75$KmlÆITˌ}jϨZj=U+{JmvM~wRT}&U_éBUҨt;UGJ{QGCR,<[YS,jXFUjtUXfF՞0[P_zDUi"7RTsczLܦC2+:65]С7d{ꖫQ>mTOQ>qQ*T4-M꿧:q^tHh:䡔X:ut3_@hӨRjZT ]Tk;^TvyC+YtH3t:C؎ecyST'd&I=FuSgΪ1,Auά:qt:[Bѡ[ҡJTսE;ؼ8ի2iT?/K7]~?I7QyT?xȧJXN `j15(Хza*tXԠډBj2ZmHa1a 3谛au.5\,k"5(5(F˼ъ(5525EP_֟$_JŁTu }F^][RݜKT7&?C>ҡsГth:[=Tפ'Ϸݷn{ Lڞ`cae ΐlE@ ڮRC3"?&. Y@VQѻvj[M~SfQxKjɜoƗRQӨj\șrj,SIj|pj2&wtxt >'>>.֦7Wt:P0# }=T0AG8S<ΑttoԺHG'7gtK`:Bu::BcT%BG/LwVFjrxHM\ujCM\&d1NM4쨉ñr&&^D&cRy->G9jTmHF\5ޗJS7v}N-`ATPwu55!˨n*|~j殤T6\j'QrT#ϓjN5ԩ_9հo#^R!_bԕAyGe9AHA*zIN)SfKT}e,Rj8;&T} G]Qu&>eCwU{IZԗ}j]VRfՊRHPh7StS7T%/vPU|*=OݳE &|[QT U:G?*T+Uq-U**JG\7SՈT5U=FU?Pq:T-a$U˚jߙT픍,fPxL R&7扨 MY*EU.tʐFSt`:B: o3yXޓ+B0YE(9S{կT1;*nDUS be(x%t0Who ҁ3},GVЁ_URvҁt1S:pm 8WLfE'),:@^*Z'WQ\*xܧ i˴R/?/?MV^iY:PCtT~о]i?asVN뾦Kir>Gřw3Sz*x(TqTGU0 1T!UF|F_q7aUx'ID.wtU*@/PT5Rŵi)PM}^3P%TI*x-*zA>JϥOmrox5*QBK[JTYi4UaBo0CURUT5/XnE?A9F_GH5TR%FTkL_YzLfo!>tH _Kuv?:m_P[:4͂}x9CuWjQ݇'oT`n{^E_=M DWT3@eXapt/j~[I\E(SU &jty5}PejB=5zY꼩s+jTtUF q.h6jF QëpKjB P^t؊tأ jOH Q2ݲԝlziè:b3y?nMCw?Cu:orΡT[Eu+4!Cv:ds::*:8"K[C[v+Z7WRCר7|2jƼTc$jctPA:H|A|\ F+U9D 63UtWFTMq)U-CU vS;@URժ,?Tmjݞ}j틧Pu6weUbzWrVRծm,vn[@dO^/dQ}g 9m^GR;6|;LOStDŽz*TehޮnvrDAPBM(UߣJ4x=2aش*MJ*d:(n]ce ;qT1j/UH )*SŬ fd.+2;'w+^3^TWD坣} h?9}+]^$O{,dgBiО=k&|l[-A{bؾ41F{.\FZ e*hl]3Ez?iWhh۽agۿ¿U7xY;y qytl#סHYu%RC[7a3EA)~Adgtxl]vFX<`lCe3ZyxÇP"ņ9]ml gsSϷ'g!c_ac8 ʶ_ڊص=\D{^H{HihصBF;iPm*I{>zPOTNU*=;bh/'﷭9M=a'Ω#t!LV]ٙc~W <; a;YQC6 6ja8YXo1Zv>[g߂s6c 6̗ݏu} U*FgϽD}E 6-QƦE{[bKlM7Zܧ`sS37eIYiyTisylUb+>Ɩ#lQIdr[Y[ l;Wc󈫲3Ŧb=Fbl =Z[2l.{jk6Z؇CJb6dņco)6r"fc\W&<|_ܟѹ'6dTͮL&csy[~aۦضZrc{¦pyltf6j28`K\jl1vg,7M_tC'.]G{PSTsfD{ݓ}5QTY*ْˠr;nI>r/{ǣLWR9͉[J{˽h[:TN>rײ`ri2ߍXad磿zOpl_۵5Cq.rxskroYFXv%˟=oX~k&;ǼXVժ̹{3G&Xs|WUrVX52[jwn VGnWJ>ZsB;E >|wV-_5YoMM[3ҐHQ%Q2e$cjq;ŢK X rxZ~KnaiglE,_zK(6%If( %ڬ%֞(7ھAw}iB옍%D?xO8,ƒ%(DIn#!T5#6ARɎp$s#{BFS)~Œ7x}ԱN6`8,}܅>?=;H],{&2b`,RVًY, d%2xJ0oL<7F>dz ,<^^/?Ǔ[[+z#Wص!x4f#B/0t5Žwcgp!,],3c0`h̜n:3"pq^0wzƝqgbLp.͹6K&nt^C}xh/:<#^~Yexz<杺糞cţBV<xKg'T>WHM$xEw7>fnᳫ_ef|Xfec3=vwU9~]ɿ%{wa̖6*Ʋ,YxWƸx~g 6RdžsٽgC!:c}{XHvg}\[wkam_NƵkH$"ZI?սOGD'kvҐ36~ ?9b_VwjXjG/ϩewҟf2<و5%X SL)~uwI_N| 7 ݁~U uasrů~_k3k MBU,,#NwݱGw|Jw+|_clr i\b8k{ٝ5[Qe9~װe!6+Ư }{q%Z`Xѧ|*+3 3ޓE=o7-oO5?tK2%ֺ`M&_~v'~^9CvKv?d*aTFC>m37||*>]Z& ܌tەkVQvv5IƷ>mV$s {VwXxC23W=XL,,N7d}y9ێ_;:qOzk> 3s${0 GcjAy6m7UdJߏ|*e|o{s|j >;XqLXa{ ',%|-`匉X.Jke4Y;iXQ+G_ʎL|v*yv[ ?Xfkp|-3|ow)XH7?aԦG6ߊC6j-ImMbxˆ%-kepj6|,bcMno`f?OeSNV&ٝX㥉~OK/Y-=Rw)5^~KJh7)=OYLV3Q5Gdk唱>ԫ<J]Cf߾S;VAtoNdbQgx 8}7VF'{5whp-FtIchsPD}nE_z UcPmhTU0@xv,Tuzƴ}y=z"M:E}ID6}:1cWx4GڧjㄉICǣ_I[U0ޱm85' r17N7~A21~:`Y #nbb; 'a[腩(HG z[M)mp=Nn18aFQo`18W)  R5X; e{%lά°o1' 5™1*`}t!cf/Or?i0d gncen|7^'kSiX)!xE1|}rȘ_Qb~=2T2, o! o m6^zB%^^ w/H W\ ALH D2!2_(T +aax ]`ucXx8. a{0, .X Ԁ&06U|0_<i!m%HW4ni5¼`w1py60oH)Ū0w:;; ͐x;*!5+zv@.H Rub HRU!6ZT H ;!5TeS!5U/RF@ċjښ@i9`9aκ0'xE)|:`(leHY\)sR"!eLl H)7@p}Heʋ!hH/#!BO n$$_gBTHGB1w"V@hHSB c!٤ U@ҟTw 삤G!)+c$iŃ5ď_ Y oxF݄ y b-_+@wYZ B›Ő0$TN' Š} ]H 7J!^H8 !JH +A‚ '$@B_'uѯ zo DW}At'De@TDU@i.jY Z)k C a{H( =F=(+ujA<Du@"DOAH ~9mѺ@- A" 3X=, rH ۢD@DsA4Dh) "*dx;A5@"+ 2, D}{HDڌO e]_+AjK r4ߌ!%`<ğé{VC|3!hğ!o+1#|?@$?Q3E +ړ)VCo(:}fguxoiwY7tߒA4 \RA8C+̯'Wt= Vg/ba "n[lQx8f drd$ ǀs&kATv09 5 eD?΂v50`rNjS[.#< B h$+@d{#!o#$H!aHp .!a}t0$+1ȂoAd3W<QI v :YVeDk @D %b 7 Z0Zw1h*_de-[x:hF69>1=9 Jɏ=^Z5u$:ӍӍ/v^ LzJ=F[H~niQA'?~57ta_'Z^`ztD/3f+V&kCy},2I-Kl3Tm#mdfoCCAt.ku/5L5L a H}ɩ !($nFH8 L*RHT QS@⬞z}Ő "!cH7Ɛ0ĽبĎ7@̙xXN p=Al? [AāW@`e ު}kA|↳ @rA\1ķ/G ޠ N_|ӟx+@@6+Y.H6FT N$i{/,yc;@|j/6Xo[ I i{H2$kI$,@HZ t/n*CHkIA&AHVd]=H| َpArtH^<+Cq ^jiHfRVAQX6B5xBJP=D eEHY) eJH)!JC-{HȄZHim_ o2ӂ9aNbs40ga4g3JXfVV!k=Ru1RfŸ],~}:'B:Hɶxj2$< IiSřo@Q7q/_Xk @QL~/A³xH8 O}D]yuD{3;z8Og>oZ-|Zf@1w<X@"VqbX {iĞz A:bF캡0r)̾ϟl 2fށVn; f !%9ybg!朄 &KbV!&bFCK˗C1l-=D;B]VQ9Un̄]!"@#D\ ^CN\;"CB `V~Z f,t5X":vADD<y bH q1f6f3c,`S# A  gA_L!,Pa@X!?!,3<wBA* BЭ!ttP0BBR!ӎ@D\uO# xW^ lxUwÌ!0Q$8f3V0c!(18A)MY: ܆/Wti.L j0#;K ;# 0N@ @hf7B3H= `]} k2Xa @QF/ӟG&/s>?qWނߑ<$ O zγ0SLpL 3i.0f.L9i-NK} |K e~7RkZ *M0[GajdjSW0L9Swӹ0Ei2׉s-E1Ne,xSC>,%hހ#jj"xmxeO=xfdC^+Sc;xԧx[ 6Zj/:\'qe&*ä T&m 7$0ityK̷5lY&v:30 &^[ V90qL uf1?NS.Br@8Q & T\ j+{~+ ܉{FDr83s4j@1=OA5A BA\2A0: Y .uR.g˚I|@p1[ .{ːXp;l 84+~,8NgR Υ !p/K!+ηqHp._t/8? ߞe5XϓFs/pnm- ͭ͵휌.r+~z]e}l~;z\y8 .lN3\惋5c5?7Cpϡ{.lb5;9.:+< ds\XBp.}y a} by 2;wѽx8d뻟༄F8c`2?:LNcy8ոDpz[tSA8;|zw%_e:pl ӕty/8]ts ;pNαTp:pLiAp N+SpN3_SQp NA')Oo'pZ N.NWiD88 ¾;ɘmdoy'c8M΃>81S$?V\NvF>6S|6?fOI(8gZPxyZSg{8u0uv #f8-Gs~o`X66صM.c-;vQi`vcvr0ض `K7#`{+nی`ֺlvO~#>` 6ςw 6W+T5 6;f,6 փS`d6W&&6LuQ`y3lׂ?<lԞrQT~lNug:XUu|B2X4 4N>twM3zD^ǁW`$VL[]&u2'zX{4XOcXz`T =>UwVO.Kk|:V6զ`_X-D Ud `5X9qKU?mn`U,_-[r`Y`'z呙`y,wu}2:X&րe !`$K7KnXA``, KMK`9#Xj遥}dj?Tf4RqXO˾xhSY0Xi^R[]`Q{)XԿ_`,^׀E,;kBG`q0,m` `_ QYb2 ,xpBEp:`a`XX!XX Km`a #RyzatJ ǃe [-sxpq0~>`^_mW0Ts5S0Wbg}uF1~ُ'GkO( t s;: v&g0[Yf Y 0 f>h0s3Y60uL<(`w c3f|f'٘o`6nk̬ل$03E`Y:0̯IZ0K,9 &Y4=r:R6g| fSB ط{03_5R Wtn3`U0z`7L;πi=0m oK־30L~ӗi`"L+w0}4L`Z既80mw^3濻˻qxyn;Ӎ[?߯6rVvKLoShnS?0~LU0-K3@0={LiK˺480-־LK\9PN2|YH@>//+x?)H3xX<7_^tY>0:/5Ϸ2CX;RY+;fcmcmuԂu`=;XOy|;ԁuW胍m ~f/ 6ǃMl Wl۝q`{l(f? +\'`wneSC'L[_c0طFnp1y 8\ n?w0|;L~ ΅ -0:Wz8ZmGpL=XjϴG68xb8MyNsാq|}SM8ﳺ]);y7?_Se{}"pYr\p6A` }@Y+@ M p\򀋘 uw- gLmǼ{c@"!a!vġi0Qcab? &>~ ~?0bG2@sI޿u&iIi0)%LZ&mzrYwaRJ~6״.w⿹|[[L,ÛǸZ^SOig e8C631(M#~%ѻOU]Z<kQpL7Gѡj]*;i3)`ʈB"t)a`0e:"L` .)_`j:NSSa.]Z@v^o..Rl lu4>iX΁߰0s ~Qo6ۓ ~_E*c JG_4w_כ>w7O<O.' A0a8L !`v 4!Pe= O!03@vmR.ԆK`U0dL77CkrBPq AÌ^0cB X f\+mRUQa _A%2e*B{oP >Bk t~=Ήfk r0OAMs;s!7!|O?6 {a 3W;y/D^7DHB{0k& Rw@(V kBdylQc!* ATmD3]ІČX1!l0;Xf\i2]=j!n8@&ww!> wpod,\_@–l;D?!j D{A|^Ɛd|"^B H>q _6AJ4RV܄; f`i0RTH kBd̕s' `"y{!}F' "9H]w uH]ounW6H`ƿXwoCzK)Kv;!cH&d 1F42" #drd/!c 2v̍! 2AF\4.=r~&Ϳm߷־ |~2};=g2 0W^`uW#u?Z{Hr H2g++H)B-K!D2K!e^瞆@H? ;7BkmHv ғWCCHׄtQ R ^@~.Tgy֐n1BHt{AzDAzXտ`aQXXu 2yc>*ϣaa)kV?`0^W?aM0=]|g ̟ҩ!N}eiCڞې,üs0y%0oJ+̳k-s`n̽  si\0wH+~̇WH=3RSBOHs^2= d/90'/9*R0R{@ʜvR mPHZ % ~sĤKׂx2` @<'īG8 IfQ@| LB{+ IGCfeCRb_H}I)I } Tci ~Ē_A|!r I F 9.cwH c$~6ݺ@wAŻX " p$;ew@b"H !b<$l fCBH0j A^4M DcA - ZDiAĿ sĿğ8?B|RO ^=5 %AO<{2Ѷs!f=1] Y{bo2Kyܫ!6|L=8bs6ޘ8A[V:aHP&_kx}̷aLu l 籾簹lda?w<|RV?ُ+^v̌ucl1[4 ~ondؕlN*L2IG;%=_*ӓ Wa|1uF-fb6j b/W75?{B6<_;X-l]Z3Rq6:qwhf2=Kx]ӛlw8q#?lfЭs@~y[-X٧2cقo̿3w4xg:Y2N>c?5=_bާ΋nE<73 2Dh%lQj%hhtѩd@Tf , s;DoX~ЯՐ̾; !A%$81Y, ط+$Xdq$H0_ !A Aט} X_!A},5Mψj YOX~ jzY5ID,&F/?ς6xv|ٹ= $a:$ 1VXd?qqHdxi$H|j '@F+"$Xk 4 ) 9)7>ʓ >o(7xUwA2X8ŭ Iײu1$'4$٥CeHaI4ٕὁ$A$qHRÏS , ?0aDx`$)cseY3 QE:H8$$C¦.&SATD%g@&" ;0~7FC yϙ=+}ymwF1;ln ~.u0;$v2O!f0ļ1ņ$L1C х z[B ADIvB06K jDMl(g;D Ȋ"oiBd_΄H"O !rgD@DJf5Cdoy ̊a  ( D\ փ B9"̲#033a0Tp!s3W!eB\:B}gRa!, 8Y0sпBfBl WP :B*@+ɜ !B>"@05Z Xc;3lxflKa1O)I! eB }!CA& O3Lre0}L 0ݰV3Pe @l `4lo:e0ߋyc߼:oW ݅(*{klQ1h슽{o[,Qc{;?3s3ͽ3 w3ԚHrHқcIY3uHKJ$&%l6)1{|3s!GpN]Gi}p6Y CI~g $#I^G$q#9&oI| u%I?IzI$')ѓ$$~"Q,Sm"'$%0Ht+A¿H8vwII¤$B3$%5^ r'G_.gbj7aN4~a}-N&nF˾q' *bk>>رGcP{j*v}?n۱]\mIl?f:`-|u\czkjMJֲX\Dz?˂3X.b_i,"vmbHlFU#6G<+U)#fwt'1CTž{ #/ː=# ^%zTwhvL$L^ڌ ھO(* Fč:?BLPH!yc'YAdfDٱi4Jd% Q:EDۛgPkPFDDDAD41o8m1v/G ֖jmkS ~ _:N ϩKxl k'\k#Yo`.b -1yIX' Oɾsc.QLb?L~L`ZN I;8|;5e1o0mtt Ŵ9ө 9nmL?a:;Waz u V ͕Va.&um `nrsϘxqa1/}9攇_1wẺ?bn]J1Ĝ{2sX]>K1tXa dsB&f3R'm^udjanfy%9eDIKIҗf#,˷;՗:eL,16BJc2|w3&:&TO0xɾrKLU`Lnc1~}O1)xnawx1u'b<= 7au]1XqIS~8Ʃg8\b: cvYcci1vۅ1G8)^G|#u=C+וxdCV0ƣs1JH~*VSRWTN*P-oSK LK0K.zWG;1dS9L9q SAL NWu1Y ;.)ߦRO+/>15ۈ;I S+iYw:L `7UoIJ>PIǟ\k2> L)qyb\,V0D¸~=0.Yqacd21~|Lƨߏ1DWc2}jOt®?&|¶Fo [`$:",|Di|ovoӫ] KҋZBr!t"$ !&!n}+~Ϝv Rs%|5{cC)n`(p} +1#rn#'0-a# ` bqE#Cw i %31t4q bÂV0*R^7CFI05V</'!ocy G# W k !pE[놿O} [6?pJ,@#{N _CCUrn 5н=itR }vn~tkڢ+hnptV\FoDyt+=-nNYtUC79 ݲoA7j.o.[? ~VO4fчK+7JH|B_y2Nн؄q GzJ_># }_Cw2F[VtzН[Nu|D{^]3Wنnt\Y< Znaitӗ'y~K(5_ti9C9%|t]QGٸ\x9tr,еj*5><e|>mQFB;$IO␴6PCQ۠E~ h/ţU5h4@ov m)hM0P5Aɒe/(;+P~qC, gQCW>]y@ר]Hwtk]t1F#e.+]Ygdr6xFtm膮BׯKemtDtl\zDYXWok-Sc+) t:tdJCWJP'i( | k^(.;#}e{2ߺbmK(]ף$yy2et:J(mDI;.ciWt8J/Xe~9ʀ(ycd%2d22x{&I9ry(SL7ώ2(J(9((}=uQs\DsP"eTGEz52ǞQ|RQtY Qjʸ4>Rk5J(}c(eˢ}#>wJ=(۠x;6}D9'cS_/B~j?YWvTRk2R5z]<ťߥN}0Oƻ楯%)Y2o/g5>&hMrr_i~оywGS^͕~- hojW%RKԧDTgОqϗKBKt*I}ך7w5}zYU.@{1Oxӻ_VJ/˾|TZZc'uokc_}ɝQ.}>JzSoO8LMWk /oI?&i.=]ϊEWW(&zϏ}Z%2v[FCYo?ʽwlW[?Eׁn]t,/'{~}uY^ЧS~|m~z?_ɝUϐ_{2׫~c} u=ۖߣ7-8~Uۭ M?^׷A 001g6*3R$% 435sOi{D%,#vyoTAoRHP^7ޓLYBgcSN#x "+Zp9!*!dtB%dswB^ *B"4.c&{ F*aqK]ы1Vc4{c_]w\GkLL1e^??`.y;dx̫b&w7/^i a\k< KF~n ݉${$h@DF".@ jdL-c.zꇋD/Id#""#y<>Qքh0-Cd#&6AL8 w*ꉪn#* QY\X.17ѥgmB7-<9u-N%Fх >6H]}.B^S"i+jYp ?x[>T%51y&&1zbB̬3f11r/1[GssZN'ސXe21WZv!v~ob,!v?Ď?AlH21orw؛Yؿ݉=z-tؗӱ4%)K˞X+c&qY͉}t넵;˱] ~~y뱮'Nl)Xag8ˡX3ñ.7a+^HX =l,V{X懭;lc;mGl{< vۢ_h}^[mlS{ߜ>x+)Oo}y;`?v~h?M}87sH\3>c.3/!Džs<]ޟ9MYu= Odbk^e۝nkmyGm=lcuMXwfֱ6X-ꑉN,oXc:hʻ/Xj?HZsNa'k ֺ6J .eGPkl!R i\wH&Xu6?Gڎk?.oxb-kFq _:͉umduAwI?)k8،lYؒrq[KOW? ۄYؾ$+lGcۉخ/v&ۧ6] n5uv/^/#_۸#B\aMvC[rG;CܫY8JN#8d~G3up4Y#%8hG8dxa ¡|82%僣^4vp4f9vx#6RW8qcMp,G|7ZJ|cϔXxmzך$$FBnƙHX 0.'tW[t&Q%qwn;N<3'E~NR vtK!޴M"e5,g8͟pĹ΂8/sz\ Hiڍ7I)w $Jp)ѤVr 6&E<&%>)[IL\B 7R=ڸ+b5HmEN*I㤞)$XU'+ir? XOڸzpvj iOOtHAz9Oiɋsiy:GʑE.h[cZ]%pXwgӺQZ;vzxw1LM5z;m"#2-[X̅<7 MVT z`5GKhy.ݸd'J:dOhuisc_zMNRN9m&牖04at\Ot|Nki;:?-|h:[oɦK_~5*]0nMRN{]k}o(r1l=g zvCom;\Oo=:?7IKOs}k%}gզ B>봐~ߝ%-3 40?eF2й>`v Yˠgt,G1Xw0`ϭc%YC}F՞#SϐlO^D=ț$L~oE5F9EޓMO#ohG#o9Vǐ_.s ?059mGڙU6S1Su#BI\%z6{?w CC)9wt'JZ' }fH{ ю`W"Cʯ'Joo+׊Bދs=' urٴ\'EߵHw;zc-\/\8RC!Iwv z}ϟE(BP"E(BP"E(BP"E(BP"E(BP"E(BPUv5BUƔMըPREM|u]u'ը>fT#U5I52*>UuX55dUgWչԨԈ %GUTPjxk555lgQjGjDB>ܠF.T#j+jj|j-ZZKRcUl5uT0-S;9Zv,ay(XM-PMXYM ڟxUԸvOTۆ'r㘦hΩUSjd/E5vV˼԰Ԑ/kDؔAbߓinؤ2bGu#EWDTLQrr(%Aȟ*JyNOGҥ*2YޢL,QM#^"[KCen*-`p*%6G *wuQaMQbQap+Mt^zp׾%GF fu&Ix|.<SubYcS'<:? ' c ׶ Khp_QLx-_Ɖ*oj=jf꯿5CDˢ*jH5!j["jGD퍓E颎(,| |*-K{`3ΉʈϋE3Cxyv^c. y»CXhj ΃gE;Oj 2᳸='|%|+gT3bM(&|4Q·k'|N>ڥ'M{@3U5>')4 "4W =B ^%&+ son< }8Bx< @x[("W /c ?Rwe{v}V^-bU=м*4f_>7^xIhFnM%wv\,47 g]O~|,4C!shhԶhjhOh shUQ4L.FۈF>+~WV4+#zmo -|o7ߑњW2kE#˖WocBs!|J>o7,, |F+&c.{Bu S|?kl[+/ Ohx\6')W^MǾ_e<0 "}Ҋ 'RW>X؊""Hsҍ &aJ)zrq?`kNt.7"Ð dt5 2C&{|ɸ!2ܩDkxb2H&dvKx]gL2mAޒ62r"ExDEQ8]zE'uXw$CF6}E2}LF3?dE}=(ڕ #b22www-E гG[,I:雭$}Jҿpؑab2n;m%d $d`gJkP w ^dൄ ]Oagdd5xt$pVo2Oη*$IȠՓQ2?O*cɤlO dIG296!cdz3IFN&HӆܵHR$׍Hy$r-IdJNd0GFfF|Ij A3d\ FgCHLC'32_KLŌ̶ !b]2{w/&&~ù|m/B~'ӿL~29Gf\2!3df|:^%e2ݝȭ5I;48?١d޹|pܘKA$і$67I^$7R Hf4巑mJfd-ߨgdnwN&y2ۓG8&7g cp[F |%md}>([+u2;udz_ $!Mlg<ƄwgLzg&' ^2w\D抣l_27O=V3i̶% J2HfKYH2ۥE-& d>t40|I[&X)!oGl#~$U4稩zd5L$)wzqZF*d1N dr vƱ O$yd2"#2깙 FA3Jo2ξJOhy?2,%O#8qK22# dmAY92 EFIu2sX~M ㎞d~:|L " 3 G'ó 3PV&SD b4U!ȰgqhჅd֟ϓ>d0=ZLjdlג/I:rwJ& [E&Yf-[DƶD$/01@&&T?2>>L .ȸs2O"d>^w##2FP 'C]>`2(YMǿd fr3 #C7d0/6>Sp2tL"]Ϭdvl"cs b xdhT%d4(2ԊK2"d4lyOv<_%3ae< /20.W m:aDΒQJ2 !c{ǔ n!2J%cg2re9hwf:šΪQg]lS2t /=#3o2 C4fG.ȌMo;m ؆%UH9~bҳ/#ΤgMz}H3~C{<\^zAzzzפLa;tͲH+WnFLz^l+$yloHzҙ>~UBzNީۤk釾'I7׻xN֤{v?Q=oq2bؾ lגLb2f+Dx*Wn7>LǐB5键&M3_t&#=5 ^kuIV҉?HnDI;P}!퉿H\Ncul~tNs鄖=3d"ajI{#6_MZi9 GҪLZLI'i"GHEWʩ +IksҒ%IgiiOZW7mGZzHkai>ZJE.e+i> -\ԃב'%HkjGeBޒIi="yڔ4{9f LFHs%t!M^FEߚ4ۆf.TIH[>i%1HC&yHƐU i7! 4_# ˤ~\ z,ROR6$A1#i! g(,XO+IbGRߺ&7I#j'iHI,n_׋4ƭ֤e ib6?&9Hc+V_H濲b]QiMǭI+iοؑ4` ҺxRI˥7i #]H[i;t%텃I{防I:HwVaғY^~/H῿烙 ~dp@㑑#\2lOjd񄌷N d ߷& cL2ԋ ȑj2\YʱS 9wJ_g9 E^dxp^),J.F7{:/qKȠ8y  %&2ni72X cM΍rL綛 LLE2p.'Ǚ VʓA?yr%; IvKq\*G-.搁;%vE 2ktKއ9.w#IȊ=:ɥ>r|W$#P0@F=8Wy 8͌'C;d󢷐ax!jIFmC$K2cN.d=6 %QE˶x%Jf_ҚBZofI屓4Wv"M}εSIcpέHtaЙ$;H}d !!KH}&:Mj/ᾤVdNj/jV)ڐ)v"BRsT2HUzT%5㤦3T#U[: ^&Iyq$#IuARM!sH0IIW(#կ܏!}HϤ60m'IA. HW0itd\ތ*ҨLHc#c LH 4u3FDk&̓6~4ǎ&M99%Ws4=_CiJFk)4.6i搦T>OjGHGT~4'_%M_Ҝ@# )X/1_ |wI#-clq4cdɘ2ivI-v5cC*;i CvH ihi(!_^I꧇z&SRO*θXxnPRL|75뺤141&Qls,g2LVƑA/-IJ@ FZod012X ˜wz3ק)dH3Q?2@xJ"KdU0DF돑dtӐkqJF.>\FFjG-G{qA 7d9^#c}Lcu}G;21dojƺ^dRgM!Ad3KǑqk2?CS݄}xͰGdzщu@= n{J$mI<^$6$)fC}7dc6I֩$'IjIb|$H&$)܂g!;7*d,h5q@V>d˺z&WdykO-o-'|>8S,;>Qd)Y[^$KKdq6,Q۠'d9^_X>{@Id1yY:G]T^fו992!',زo,39LoL"s dәLIg2uf,2Kq5)yk HcxB귟Ѥު'uAށ똀l|!HOo +˕nj: %ƤgJJCSGR48C jZ ;QKCԪ֑Z=N V$tF$]Ʒ$gEB?yZr1Vc2Ckj8Q+Ԋ߆=&ju9ZϜNnP*5jsLSe>|Z(P+f)s6:ƧlAmZl)$k7)iB2Rp@ :BQ4) RT3X)8O 9+"_ŽbR_H uH!|)A 3BD6)$R1ߑO ^p^s )w'H#2Ͷf:)}g[yH!π:BCR8Y@ HQ*)|zD=&)v&톅@mޥMRKm5I/R\Jm}MHRvoڑ!uj{+}mGJH3K$%[%)L#qJj7 [ڑewRG*X]IeTRqM*I_^s&GHHԲzi=i(-%/I{g@;_2i؏#A Is4 i֓◚\+ϿyL7^RҮ-m~GIwj54!#f5iW c'>G ސj[5ۿʤu^瓖Wr䚯ifp 84U*F$!IFXaB]g5xH'ƻäsi, }#HU~'2oҹI:'k1(ՔtIog=!y?:o?3ɰ;~r"XS[ 2͸~|<UB2ۖdR ;!<2HFh$CߒݷVdh? ;,%C#28ȵΠT2h7+?$^H/LFQxQN3۟wMC%5~?ˡnn I}ǥ{?Im$R>TW `q&3Ǟu/RwoϤܳ)?$eRDJ)MDmk7SrvyjߟYjךU[rԮ&.v IBRL&N"#mR\DJS;7W:}'JvROR=ږY9)r)'R}JZ߹4],IóEjOHȂԖzzˇTאj7-R󔔇i^%'HȕW )ʠvPǩ`f0ڙR@R(DzHY1GJRmϤC GR[UjosCRyAʱH*r'#cHُn2%kŤlՑmӢvBR9@*{IU1Tu>24T'QԮ|3B  dڒ2R}T֫<džIaN*K]e7RlOms_P[58mEJ9n-Em7vz'[@RS#?Hy j(ژQ̭&UROގvxyKl8#y|THnj{1>)&5KI0RT潚擪B:KZ רzj*?8S%%Qˠ%$Kf wCrB8]|diS=Rߤ:Ҿ>O˥J{֒)<+THr4 n%_/]:dvɯF:ptԟ nq oJ~ ?Ե=R893GIGH*.:b/]D!]ty`ʃ6RWZ7HWH>S7c4D44h4SfI~D* ЗF) ϩ{HZIF=-rp]}Y2=5 aM~hxm#YELr?z ܺ2ܦ3ϟ3%ҡ_sDC--,nWf:1,;OsRs8˺/pϻ6K}:Y ^R2+,s.y\gldls6󳘗9+g>v97b,^+LC\x{y^6˭{ Žt fKg_$2Om8S0-yXהFqo׏sd+-w犻en/zp;K,;a= jsD:[Q?N}ԋZm{QۺQ|5fj'Crfn)IYQ[56F^3e~_!_3= ՍC~/(Wko~m<ލymV_rէx~@u\N6NTBgQ=v+Վc qۑHxmyS9'ɕz1ϙrYl=<'KTx{vռ5ܺ nOwDTO>:MD?Æ0f=E^%yr饓z"Uܿ[!k_ܾ.UՍIT=3Q,y챿t^T]c* UEV祲>T9Q*x_UDd%&m{^׎e0߄:tQ+'*E57QwV\TϮPT>[E%[JQte#ez68ܿUl}+=h6^:mVut1ɀb[+Nk]S\⹝ئ۲,o:op,o^6b^'O;ǶgcUUcyW+>hjϬ;"ﵺSo=YfsP7'cDI_/qwξ]7fمgy_**P >'aUyN.m.}|/x^^ Gy^yN9Y~?kn}<9VWe^o6 zYx=H=?{9j*Ǽ)Nzc<6s^|*/޷/ji%2X/|sJU Zgsײy?zcve52sԲ{gܚc.d<ѕcq7]xܚL&QϪu?{5ozʘǹ*i/l9gvr;lqߵz㳮泮1Rusm<G,\<9uR<ǹ5<~5nD Z%9Q'9tQ+si^6֍[wX"jK%C<ϵ-jkEmc{N<؝BQP~/-8>bK^#xN.kk9VrlkO c_elS֓[+jX(ncSg3yS`okZ웵v#s؞ |V:|OrܮQwd>~ן}q&cƙ!~qsv~+`'3ȱ`>'pTXвh!=aҡI/Ը;\Y''a#wnf\[e/nTیomqߌIPz%n}b:%'ng[|fZZ)nMv4>[on7?ى_sŭ6Y gq󖶸y\,gtq}2$nvs79\K`(np޺i/npܾ3Krߤ^z$Ϯ1vB\ qm|6I\3+W՜tqy ⪓ړǴ$ +έWҔĕrqq1AT<ϚD,QBTl> +L..7ˌS/3FYN\^-.s^Y\pY\8~PB\ ť~Ln"Z;qcńJqq8\\:oe+.\hq&.i S/-:ȉ 9$v<\%Λ%sϱ+,=-΍~8gqW80A=Q(ٵY,Ya+vg r əLE 3 ,gf;3g]^tc8}N>-NQtl8a/Nᱩ;9 3Q^$ʏ^,Fkc`Wc>|_ֻZ"~[s ,k&1smu۲s=?Yr˟'\f#{8d0#֡`"l?}"^sE(a򓙦d1Yy\tm> G5)+2ݩse-m1_y__gY|\`Uym/~)ysE,W.7<~yLsgZ̾9}p:sa\9N^+o8M3T5gi3x>7(Z{`_M {wydYc u5Xu&r?HDJWp*r9L/Dnz#;VF+^5ۣ}=Ü}z& &w'׆y|fἏTd>EyWg8'2ϫg+<um]Zݚ06Ko-1G>Ǒqɂ9V[0&7o~~j|]E?ﶼǞ|Gxo_xlS}Z'뽼̫{id^cW#Gxy:̼#׹y'󲘿&sݛ<ϋZ5Mc];.߻Ůb,{k?b;W2㹌w9rp]P9D9)O9E"@"gg*r6z9?',$r3o.b˺)"GȉG{3{]yM\c,rgsmE.k^Mar\v Et:Ad?cb]+olQE6lٜ9e/ g"kl[asT$boWu|JYR.v1/6)INb's8w\Q[%v2qk4 E"뮳b̺#'nq{lcցz-抬Bd3b̐"Y <1v"լhdܲ^ƣ)̍XSxbg+Y׳,חmsxeIJjŘ2l1m&cFPdֻ̺&&ԋrY-2o,2,GDt/'2yϙ\fE\9 s=ٞu. WpEƛJ\dS2q;qVd ^/2EFd?}E'06ܕ:^Bh\gppo(5Ϗv=\GyLȸmCෞقm眓d{`ܞٛ4y5s* 79e<\eJֳu%Lo3#XW]Xcnun3,1ϗ]KdLEF8OL YG0B%3XgrN"#|\e\9<`^6fkd[^s͝5SYͲט>ʸcX)#< zLmls)lk"q,ψ5" vq$ßcfƪ?-{Xr\dyy-O&E{[3952w9_\Ь_><χw _5a*j˲3d9ҟ9yMm3kg0&XmnYk lJkx[8 "y-pG\xc3^3`"}p?11e]|eٵ@s:V2Bk~WO6Z\9<:ynrV3cfFBe=(fxnlGpc fv9s͟&3X~;k}zNߗ%8gwYL3/resUkƱؑ K9ZYr3ٿ8wq]M$s|sCع'vbsΙO59v*-ΜS繉l[6c }e8eb y܂ \pù('8?`|s:鿘.2/%v׋ݝ !bJ;INg>0Y&At4Uس70b=73S{m^fwJ^1{ľ:r;Nb-yAb1K~4C5Q11Ŝ9'qyqc_&'D>kou2XQ2旳{m__(#WQґہFD~G-a Pϳ8 u%}-תnjطzv8+c X8{ϾkuSeˌMJ{cw(k$ʌEׯe= EY/mQ6Bq}S6Ue *E"n6rs72Ɗe>n̏i WesC״e-طfճbGgìf/o7^oy^Ͽ=I3Ֆ;K{HTm{ҿ~/KJSoҎ?ks_u;O:=?W kK9{ yϧ'[s/KwO?}[ʝOǿ/w7j߇w;3% +nq4cҽȮnHUCiҽ{6!zg }ӣ`z+ C}zuWb9Xz ,gw ZªrCaGibtURK* =R!f(F]xp/iNcFE'sDc0ūcX ,~]%S}˶ŲT-xiUժ[~ru6Lڼ2݀8FM݂[׏9%"*d;"*K1r'_#A󽐴z /LF҄HގTKW^ۄԦH-FH- b1RuEꐾH{imz!MR uR|ɺY?F+#~-⋆1=Bܙш:!nB^-E*qCdǗEL Yb!dl! ْqz#v)'uA|=$D9H|IkO"?HEBk$'DJ;$[些HɡÐ|D F#,V#7_C? 9:){#- #Wc27Bj/_~:+EF |ucX҂`]|GR_ gMT6R! ,o!yf"a`~[9 K䉋r7b3uKQaq; {Q,怰#zo BV"Gwi#:PiNNBX7/M*GuF2XlLGH'NCXc) #| JrBC;BK#8눠k(C-oGpU,va']8 +ߩf"x !3B'"hFplu7+r`%B&ز}*C/)c G?V2 wS{&Bް8a ЇX!;Y!;9Q: f" .Y#:g!N! b"v>lMD/Fj KDoyb fqU!;@#yf Rk?7!e8@DDuOlqkD܄l`"d/""B#"BxDtFX$D""=dRr Cv)fAkwj "%v,{c!" gy*lj+ dG#|Dά7iA `wq ǫ.+@di J:"}DdpdC#DtIGyg~"B:|x  8g #H"B"F5>2D Ss!"y"&Ce항PxsBkv"{^C{FX+~7mV#l+#l d;K0"ڼE0nBx*mgjc=uDD<!d=f" CTqTqujD"j.v {o> "EcD$Kf )IeH S}0{=FMH8ހx߈ 1] &fbӾ#0]|KHjH:͹%I13n#yr$DKOpic+4)֙tƺeKӱXW}MnaӔty6?yAK6asQl܇w[a?g&bi/l̓`^Eln?[|cg]~ v:s26 =3]Æ0\SS.KºH{uX?" {- mR@JD$}3 5ǿ!n<+b sZ#f O#?4 Zq–㈚䏨ΊȍECD{lGk E d ±JrQ#rC"n#v dj )"*>W8> DETǜAEkɈ Q};Asi # "ugpdސ_dw H8V@dDVEdlDNH@dK];_"r"B䁈hRD>4"j/DM+f#VBJ/D*U"U2fJE}F"r+GG)CLa9,ۈ0EG!b#BO?E5AFD)"9|TFG_ a"!g!8m,9WvGP#V h1[#l|بX7YT;  n&}C3;O~.+ƪ7 ~; v' h;?sR\ꇀXk7/-gm,SyXy& >Cçh|Eb🛍LkFuCұF ~ѷ^҇X7ַDS2㳔0}?" x B,dgy,|疽9au,_Rprfl!, V|'W@ >C2~H/t ;[Xce1aՋXV҆P`w'U؁o#a/Y8 >-R>mx/B P_D/5\cx"x2cm)AEP(lA*} /Y A2g['LʇL@iP~Ag-CAj@N+3Vw5r$vO#A7zg#h i9C-V}Umڞ,u+b9E]ӱ"<B;(VVYSXf"brog]%bɕXڵKwDŽTxӯ4|χՆX4Me X:Rc˖tGMM b,G^KdxWdnpH, 81ϰĂ>X al_nbާ_9i-}`M8渻cNt; 15淙CcApkr1gv2n >Í|X0nݰa̟1 s418L_/0Ok?YbB*f;;0*naV5f>s!557`9_3FK1}Lz34b8L?^skc>LWbǘVӾ.IO Vaƥp=Ӯ셫5LĴ12ڄbjUW[i:f NĔ]py'܋b"r+aLt:eEL 8I9 0nLz^$bJ{LzI1[L2I]aҁ/ܡ3&Iz8k)&O<&9`R`,&x`ʼ$|Ŕve.L>a1)v&k`+}Lr܉)C1ŴS/`bL=4Ӵ0[)k\ֿ&/n}LY~SbI \bzRf<덙a5lb]Zva[Xx=ތh,u<Oo"xh)z_ _šc2ּPFO!v;(`u G{"nKwa&_` Vi߯X|"|7 ~wW'2 Fay<ŪY2|&ϒZU0?LX/VI೼ ]Va|u `=-S_ybo{_ǨX!ݧ7?=I] y?ǟ2,WW>6k x}WB+_x ~g,5+pɵH>>HT6,#䵋r *[0w n<ץcs+bAtc$q12S|5"!}?Я2.݅G[UU~` M܌+՝ұH3Mv/0cGXڳavϷ%cN؇s.Sܾq93ue\b4Zi᪹o>vw-J4_ Snbʰ`}p n\L LaL3SNaJ~&7LSڷ9n˥ &>xϊ?0IO1(݃ˎK)a 21ŔCS1LSKcCk3gƔ X.7|xbb. r1&4cbrL<0& XIR0iH_LJdTL^\3ƙE쿁)m#1E`ZaJF(tR0q&Ť{֘iǸn&~ja+L~NWј04x7. pN gO8+aܱSw(XJupn?cܣƅe'eg9_6Zy)s=y Lz,uZIp w5gwwX2\p?_%`ɯX#K΄e[ `eބ?j3'Ǫ#+Fbl+V?faWXm&yXպ9Xݪ/|OWwyz߄U!6X+> jS|Ǫ9cq;UMi}ܱz=|c;`U~:՛ wl՚X-ߦ^X3-@@5 Ś:X35C|gԼCv.gh#v87V"ȠAf"AQ[W GusC=AȺ=!԰ fc:B#4ѱwD(c܃5BD^LG%xa7 9}#P[ |w8" !tExkˏ!k2cW"D|d.Bc(dcWCjȸfY΂w d4d7Cx,#p6"zH7 *w6"nDĽ8&1]Ő_1@C7>\|d%9B^9 ۦ2k_C2ې!CD\QAijx ^"e|aEnp%D;z.@4ID DOGL@Tu@{q j?Pk"/$l H8 ڣt l$2" N Hr%B)HAJg<^)HDHN\qHv| Hnǖ y$C5#%5")a$CJcMHy*ڏ1@Ɓ~"U31_RZ!%1R<"w']G7$2GR^$]a[NArlARE$}7E-*>I!ݐTI%SWT#CIjxg#III. )|-<$Dj>ËXɅHxy Av ܑp,!Q[M$H;|"_$8uCHp9G\ nb6[IzWNFKb"cĄOB`NE黈U|ؙR~LA߈q[wG|;~x.ڃ6JBmx{; ^%=11n\P{#7 - n?[SAHxsϛg*dHnv#HVx|~ QvIf|_㌤c !!S"~:! _*qKk1.6܊91eN9xaئ}#7s *(W?q-񶿗6̻ n5|o\ +x aç`+Xb0=Hļ{M| p^UpK`jp;xW=7/a3抩w*ǼW915;bb,ȭBofpKG` ,{ĢpyKZ`X0$8R2Ē6Gy&_ꆅ/zc{XP> `ќX_Ϸ=γXK7m({[B*AబO])V/C>H[jBݱ@-mcH+!1C%9\` 7m>Րֽ2Y!42:JCz3^PF|zJtQEs`m}*X '?.t:Z=u2CB *sBjKjP Tm@խJE>hJPmDzsmܪ coA|t1VO d,ӄ|< nC~qi]P8fBU'Az(5CqVAM;(Ba7(BYv#ݡ6a1T^A9S*A6D[o(DE[/PܼJP< ~h bw({ P- 0BSsށ[uw.1LC/W(tfNIP/BI TFB(fAEk0Z> (A{PJ}_BҋPjv Pڹm9([B!*gvaV~C/9-7/gmB']v6#BʒitA VR8N[ѺmATN)(@‡W*ҁkiY77@F=אeY#^IN;~vY"3񜻊!tǠ".GJt{WF sHEΐ.}&Q~SPi>*RsSN)ݖuZn(5+U/*\wMvtTÍ{7-. ,mAޡA5F 8*lrP#xuؤ7'!#CDOU{}۲޿-Hٻ>e)xC٧W>(y̤O˾}"ʾy/veM>Wo>XiM٧3ټeJf:7/;n]٩GJ4ʶ-W(=t׾R]F{uvwH PS/5~R:}4pgilOG=+-.rycMq2qϮ~:;ޛ}EojQ{i>u0iB!Re}i͘򜢷ѺJ'z)Б6g43NOWѝ nTgN^vuCϸhmmbv2B TBo$4̀Vdh{&:@@\) \CϯW2LCwt GHuX,zrZ<,'ªj^;¦l{G(?lw~:$*֎؞4D'8E 0ކ}~ M&s0IL^E1cz*fuz*Ap4X<<`QHG +qzݑXSNaڻt Ao ;ߚ!c "lE)»]D]&#R2EeL]7j!"pwõf#E=R!u1uniX^ o0ȞA1FߣUSgDx#bd>!;yxbk՗w@r$Z"#$po/BAq[ q''!6V ;#1[%Y\ :s :pm v#Y$]H>r H4HHԁw"=˰r_֏@Wbc/|u(6tdžN8Xކ#z66n> GZaDlFH2-tI-6&n|k+zaӠbl:s`Ӹ4w6/dž3l|l WcX7}Ҧea/C ?buAt5"}##dս};l/! 6B 2矐M;2² ;8;N!wGD@prkaٗvFDR7bDx"<ǼB·AT&CD^9ij]! 7!,%)FX"ͲziB8 )!7!h`BaُoXa.#p?BGq%,l=T ̟xB~=§#̯! !Z%nZq!s8A2 }~DD"b31)<Q=!zl&X6v/ vV8 7D26z0ZH/TY4-æñ)p+|\19PІch ֯_`]~3鉴Hx~+ >RJ=tVC8/Hq I9Ȑ<=)צ"N u4=r5IaݭX/uA?#]!Wbc ]~{26rYMؘ>!6G}Qwt@ȝ8Q;},Er=MJElw~Z"AmkPߙY<q_%ن=ނxf!8 #wie?De5c2ьb|9.aB]׀ igEȒ}H Axl{_`NXSu7Xj"q'B7A ;ww0(ahDi@OBB7"Oޭ9mb_GXfr{CZv8!X>M7ճroT:| AuR ԱGȐa^#vlBh*nPaqN8u*Hݨ&oiq/-)}qRwwPwx9={'$d23ygADL _ ?;:=EȐc٦ࢧ\ p(I]'>¡Gb8W.2Z' u~s߰ K݃4ݠ ;}Vazx5R؅n5*F`MueO`N:v 6a-kd3a{kfX+MsXYfrrKXfrh +5az,-a1,al/̻kB 'X(R=kFe;X 0;10;g`rf0'0vEbge!5T`|sKaS45`ƚ #at V孬1X=ͨ &zl `3_ Z =>M 2/ ,`Ǘa{F5nuoAA'G8[¥w-! ,[x\ nsICfcUD~ B?ACDOBZI#2d ATQ"_Di!'"wBDDD{.Cw7ICL;7* _"lZ:B#lM;P :C-0sC?$y B'E|=v#$.Bz(Bo BVF"x,DE>I";u@Axm'tZ%_7#0= w#^ Tv=FUgBZuC#'#p_z շ1'7Cm%큗L{k2zY~\@V/#;ª{#bID82/~FĝCf-tC"ddFЋ 0!g(KAAsed)C< j-@@A$[! Db֟l]ZtsG{1Y#d UBXEo܄QFĵ?H:DCD^xګٹ?yq!o؄/ iÞ"t=,f!5N ">_;20!Z }˞#~6+ej&"+jY )e%õ*ߑ3ŃH-4I}Z+غ#3_#+>Ykϑj$rLˑ{EȟS4oĦElz  XL P0PpIQ> s?`-LtF7* ꆢ`?뛤T) TE,"lzC|d| P0"c E5SCZ<`6ۍg`sz6/cc lf>Y2YL #N(6}Ħ)6%~¦ïieȟ|c_O|#F3$樓|{ydr 'r:r!dBֺ[d8.C|zH4?9nx7TbR$)Fb3{Bذ·F&;n ֞*֤xl`s`[ lV6> .aUa ,?C`0u_QɰfMX5ՎpX%ʤVs%Vax9Sa]XOBj [m.UA [u;ؔͼ'zo%M`ݰٹބ5Xsu14F돵O,m}vؽ<|Y5*mgcX(}]X 0g\ f>l~~_02I=L?Llq.HFX>ÍZ"V*j< î4ŠBXQ+XtˇcٳXS {妎Xx</|-,'?,`VbE]Va屇0| gcUhVވ՛oau1*."0ZFe0!`;L\!´e*O|_b-,BOX&·"$ `\kϰN<kװzVkB`s,a9`1WaVe ӿ7`cӽap2b_agU ^_ٷ$^y›aX7UT z R >?HvrW9'Cw{7+ï~3ljI{x?Bx̹1 /R_[4Y,ⱆM{SAi+O1efa5>j1 pRFq "3l:l>+{!"d"B~=x#| ,l.d1cvv »@ؖLQ6ޯXMv@zwn- { ,1+>3""A"˟cODͼ(=)"[N#}"#0Hݾ!* ?F/hI3e"Z- э#W1⭈靈' `~7b. vJ)bS!n1[:j8JeB \HRit?H M49#YH_xߴ9f#\DqˑX= {XiĽ:HĺH|.E\DHQH<IڵH3I34/!'G#i$E$V!<ėOb6s-‘XrGHH23$=:ϑI'ƿIG41HpIHR[{4lD)HvwW!Q/$>CM6l;*D-&*$!YdR 6)EZFuD,{#C;"Id|Dad"Cd~zPl sFv|dCNȱEW-r!wH$r"i!r 3O en0fAr\u\ IE&Q܌Ȏn}$YUuYWK}(b;UZ#eYQ{gڳYԐ{9CV-idf Gƿ[Ȉہ?g 5zxC2A껉HpC@W!qҗBHoXGLof!c{2J~#c  YuSTܽed6w"ӧuKLVdb 2vcmo d 2 F"sEd0L惌dd B'"97} rK"wr qr +";LW{9N"w E9,xd"3\Y-ꈬlLy!c Cڮt&!%! " X[nkr ]<9~s6  !</L)A;72\S"EBw>+«&;Q V8iGéO8< ̕p(`K Ep!p^NNpL]B}8=ІG+855" !\ m ~-~*F[ 6~cqp*;oZSϤ8 p~hc Czڞφ[y/_[y G+x:=RxW{<8zlߥ~ZhOY5 I [L|ֶSXafHĆďp^o0?6J8xZxC`1o %wҺKD; 61a{@wC/Ecp.Z h}8 ͧIO[\6>}Fw z>^&zuB2hԅ`-146@@}\ ~ѯ!1+~f, m.֠Z ZˡY }.:I=s(:GCh1Tt301:[106 4t::7B=:3:G#aЩU&aӡ %Us}Nh >6 >Y /ҝ Z1qb:lN A0 Za3iP \h#}s0pehJY[@iU H¼mezktԅXq+W`j׆U1,MaB0$'<["`5 `>llNeXm3ӟAݰ>;׾%獅#.c5p8cXw .ړ`w} u^C`]i&-5ƚa@ ַ2m00ҤX,A};vWz\ ސ'@vNnji0r!8ck9vSY8E{& `b_ø5r"V`Cގ!;1αc+0:FN1"bBw1>O1N+tGAW+ ;ҡ4cΗAFCw{*ˆݡ;6%B[ č\='2wVMD ݎMC+.zZo΢[ߙ+ۦ^PK!YPzj7`(@pd8ʣ* YJYPX v+(?K~C|m%ԟ\C7[}3P?h[6T0`#9l I\? p6t p^6 'w T. Nq=}z=/c|S" B/Pur?N@~=(?TR&BX<Ba!(~ΚP <7J g (AcܶC==&p9>%L c߾B ;2y"TzC-"TS ^#QP:"P*>Ag,n݁ (+BqgeOC!CSq'mx_jAoW J/dӳ-d/zHn懫'hf 'S\}Qǯ躃|y*鰾[i_ųTez*m&ytl69@6}1!t$.dmK]/0^S)IKRr^~BcIisKO>knWڼҟ>ZmYLCEeW۽vӺ8'knǜkoi|pyBYg7j[ҫCz7unlwGl.ⓏH.N;THLqӋwB/n[[]=]wޙ5zE?;GvN݄z5wy^}6x֏KbxNe2/=gJWK(]$YrdՆ$†K⇸J6͓s)^)+%ʂgdhg@'_&q$W9w"د;[iASEv]OGg-S}ER#f hK}|3hA4 Z`:*oSaŴHw|Ǒn4$D?N5/kCiC 2x3TkB ֞@wMGtK3Y=F_? 5V^1zoD_A;,FJ?8Z~  KEͰ%11/10?5b=9`Z40=b2CC[0l3 A!嘰>S`R7H4L0n,òozV$L" `;k:(~S Sߡp^.&Zn}-<jwOW>cN PUA4!#La71%"^Fd.D!|ؿ nH p8* iW#iHBH Ț \X\W^w_f!dhFg9 A'3LȎRdy@$eAH D6VLBʳHiۃTH9݈g3t #~HӧC* 4g*e@|[[BA#q x:$~xQ>Qlbw"r!fļ*ϵ |ҧW HGHr%Hي-H1@Uk!ŧJiHX;!y< HD"a>ƪ qL>\gw7H ߂T9H ٙDSHk)vo]Yϐ-ߖ!s>2_gqu2'x4Y=Yc}yFl]G do~菜ȶ{ˑd*rN'!{Z,\y͟S܁e?G;=9IWC $:00F?Ҳ$H܃H +RK%lnuk5A|4}A1=H0 q9ӆ]qv͈(B4Io^4 1V"fPOX{! }]0CD&FlzDX-31R8͈i[D>@9'DIBdDNC? o9ՈEp0G= ㅐw&Dc(=9"# 2p( DY""QVAd׮i?p6!m#$zl^"zD݈(UD{hQ7D1OID."v?bsZ w">.GogӐOE|ޖ#q{$> `H IsB@|߆TmazG#V} lB҃$GRQjI}RZk$oKA|\Z AQ GnDSU$@I"^c9q_B ;,ҿň_i&=nm 7`NC> Ր^9݈cc>!~)KC@`#k{o +GH!^-_oċ?˫ѓ?m-#~>HoY@Zwr^$OL>!_w=DFt C!:(qD8w]=<rC*sDw 뗁8) n^؎[V}lvDe)!;,ԯ#1[~!Z Vg"ff=#F3b=DI^ʌ6Bčxxd6l=bM1Fli+\DܹJװ}Ziħ=h # a+#D$>$$~lGl$#YpA>C7HҀzLQCg9R}HGjL;[d<ҺOCڣ H/`d }2K9]~;"*25=aDuPY#CsUBE kdmXRvNnC΃ ]1z2ߙHbkNH IttɦlRs9"*C Ud`Su6[x9au$ c~;/z( k@\  ~7b!&1*|RMD !&b$ ^k[bl? Jbc]f'ri B"~e#bDL2G=z ҽ#|T&2a+#i"c/#R"kd3/ !iqFXV#>R:My`'0=*B!B0"sY5 DTk8g wGx^/u4g^|LoQ1|&? x|zq"$f |>ϾLVD\6&#t|@p~9= aoF!?|@,qz b^&C-̇31G"D]hce{{#ڼ Q!rGg#="|1Э: A! n: > }Mz}Тx Vj0v!As(9XeyXK<} a~eaGouXJ 3{'ô[ Lk<`=&0y KaLgoI/ Ka<``2OeØ W܃w}wx>^7 ľ/ks Jkxgi' ^sexefSOBxЇl~t94}u+.̏ qz\aQlט>p<{y` S7>m}R (!Aj =A><xe7}|W(|ϮnI +OCk{n~TxKL%OV^G6['Fc"ȮErgmt9'3Lj=7gI.rfB<_9k"g lzW<\N|zb}ڐ]Ӂ췽\}9a:"[3ŃLrG%ȼo m|"8CǑ2 "Ց )ґIed$Hp B:9 ~ 3}uѦ]hY JͰk " R+!|l72_0A#wOo~ ȷ5| xoScXnip}z.y9ai(ULZg'5k5w`Z6zC;;_O3 '`k>,E.,އpX "k/,f<;?,``>E&Ys% `vfaly1Y\-8V0_ay`1C `{5C`QV^;a9Id:)0O} s-Yl~"Y 'CX|o>,߃k:ylL`yvlFn` ;X :M_a~CfM0u-ISL4'F<`v0lKѠ0\FcKv^U.0!2,Vθ7'`i?, oc(KROXc<~iXjuK/I,޷cuDc Q߰%s`qD,fg-XeioXgcWX>!\ŠHTFXyOal sXec `ueLYaTFoP#L<zia)Xl4yeKL6\7(2?'avlb z0~0:O70 `᧩0*40 ~ `< 8a>0 aҾ=aJa70}LY3+0}1W0`{^5{z7|`4z! ;az=;:杀F9VohjCXUkUg`ڋX5i * QD' Japxi0:S 08t`n00 }a3U|+K@20͇ e8#0}KXXmY7d0R@g wgqqss_Y-â 7~W/_~ogK8güYfD`T&.XD<!#<!5/BOD>B‡"ܮ >:#fuHcq}cD^@ĹoH;;;%'BԎD+"z'j2D[COs#zs=cu!hDtw~IF%ļ>.(!q$(@ӝHBҪB$݉C҇T$6!eq RBuVg'R!:eHX[&H;$H7MbSt12$09 Y̲Y2JȚQ,C[I"k9d-RFff82Afv#2NDrd郌VȌg呹?L!d0,̾XV,Ȳ *Y' {z_dO@,d+A?dXY|Y瑩xqYy{q dFAfI͞ADd41U(ۏjdĔ u2dc^ 92[#cK 2 YϬ>ddE{d(AbNFp'Eiiw?iWWtsHH)DZP-H[5ivH[iط/#͖"zRFH]y)HA Rdʐ Iې}-#!$)GB9?I7 +NCr[7$7 M&W!y-Rr eSԾ Z4rHaTH)D$.܍Դ|gũTFg!%)iR!S4R53=\tYIRM#-sDӑnۗ~)3V m® Q셄}ҊqbxDx귈t Q#rT6"!bhM*c)B Tw2C"@# `NSy4'g]|9;>Sqb/y/죣n9aUam>VšNK7030kȹ&:b9jĈ0$%~ dh@sNw^@W^=U>O>A^OWx=ׂ 0=g=zW 0&z?G6} !5lCwekFUwS)磟 E﨏qМezMhRh кZЌ hfhmf 4oA[;v ^Q۠g#.AchŚAs)h2ߢYP .huMoWJ0K?<o-pa^ %o#4*b@yk3G| .frhM K)Jh+lvh/ heMhRε< p==*r ]v8!':` .=d0Dwİ{VOC{`;m]E1yE0 ƽ¸a!&(0T8&14Y7S`uLaFs0Aj^ȝD+Ɨ`Hy׿ckcn~ 00護᫘/_qH掆/*#0{fĬ5$f 7cƶØluڵl~&cWfXa<̚fzNBObU f89 :--żo? ca+7IJQX6ooe?`\ꑹX>GLT&a6u 8b,pʖm@l@7@Osbv ^i-0c+`p}L c*Lb՘9&ש`Q!&>c`kegнѹS1Bc4`b F5BtgĘ1V:7n- م1n0N9TQWad1 s1ځڇbQW41z]s0*h^Z Oƀ–ltbl}=wur-~HOeZZgK7J-1hF-=y,Cy#L6-mihBݸƘݢNiD-r:Sr$:Qa8w.klG)'wȧ!BreWRM2wu׉iɣG?$9CU; ҿd, <#]*_Ed$ %)j%&nmӓ6H27mdNdtdɤ%Sr%[KL&(Ht ,p{dU$J%2 !Q\[+Dg ס ?D /Bu&7ڈ~_UM ~D˚BGwc$;5N">=1Do!zȜIdgHz#=߭$=V"=f"=f!˛H#DރoDԗ#jjډN1DuP(QUN&2"c.|"6 bAJ#, *x<N%*}":>%MD>2%h'Q3";G{QQMTF#*KU|i8_"*KXDer,AT"~b;""y3Do_GO?DUkQ5$nD5d1QݼCD ks{9Q=k Duu:GTjP;Qu-&N=Du֌Z$E:Ql!݉2Q&ՈjD:ױyקD\x"N}OY%cxTƉqD<O=J6y QiP"*7pTqt"޴6KDui{zD0(AT$uDs)Q}OT? vDcFOɼL֑߈x ۣˣ+JTL^JDZDS.Q "q$Dt&հDdIDn#3?a'BuDN3]pQ; % D4v!MODơD4͊_~!ooHD>7#*C"lGD6D4:ϋ\#~ݫS"ʪ"Dw"p^$/DEsb0>d"1~%BDط!6_"֛5N4"AW"%Dd$݈.|IFD%A J=Z@]vZI&GӓD ÉNJ= G"A(ϫ:G4ADK"DuޟI~߸zu/^|Ӎcf*D?Dxw<~h~r{jX"4?DXi~  G O?Dp8lzJ=` 4,ɢD"&ix&:"XMrDN~/xA[]b^ѵD`=T7\㟈 *$G>_^DuQ "]/'o`~OhkMωft6wrq0Q>z(gff,Q~C"2f;+i,?h"ZWMDkgx ?. |^0[-a"d\e"< D5R#C̍pQ^}5x٭NZ2t̷Ax˵@D _ioiD%3"QI rl$l߷|i+"Bsylah}Wjgyvw&/m!cK ]ekN{G""%#UD|>w+QZz}n*D+~DJ.07)<&FTdaNk8}](#ʳDܗ(5 Jҭ3DL Qڹ((<(;e-Qx(^9I4}D 9G*Dz"w'"GB{SD*ȣȹ r㼉ОDn"@m}["WZG6iD^i׳Qw"ș$r.DnE"{"6F3k'2OD MdN!2Gюt̝(i//i,iCҶx|5=翓KZ-KZgIZY>}_XjPC[.iuHZwHZݐlfHZg|*"i]&<sI\}_I뉹6?OٜIچJZh)>ȗHں1>~JZu#i֘5?=%R$%k%.3$WvڒV]_AjίmKFҚ(iݽDҺ9+cTJZ/uWJZ1J;I,%mA[$m{%m3$ђՒ߃%nJM%{IDI)H:L$"mIzCA1؜ۑ#T91rNyWs%sH:MJ:_K:ÏK:̐t^{Odd;L4" v%2s̔"3")Df,"c8('"ڛ̩D4\"2oF">l$9";Nu"cw "ҜZo~u#>lH%M6 9Dv[ =4 V"4>@d0>_C "'Jm#r} c62ȑ-]9#t\ˋ!r.]f;O'r#'O}vyOD~ "?ZȏNGwٵD~q}dε#~6̕\ɺD~j aI '"&;%|"'&@G"7f>QDa`0uioP0." VSO(H&]KBN>%/BQp(4)Dc0QhEDQ}*Q(>H'"Dq:(.(fU(n${bj;QlL!b[Q53ȣDiQ(#JViDu Q r J^DiWQ:O<Twe٥]U(>rQnBA?t'ʿ+X7i'4g\5\cVpsMc\.Ǧ,&|c .V0mZ† <6`0?|?!Og؉o;<~b>.~x60g2qc~1񝾜&)gX&;9cse#8pm9n,nL.bH"X)[ÿc>%vEQy(N.<|BϘeCy,<-ǿ$ʫq y_ŕsBUIRמq *OK#:yӇ(Ay?)(ioM\LǷ<&?%y9ٝNv]agj~Lv=F<9s93l+Q}QXs0yM=&ʮ?xSF?hYy}ɇۏٜ?8Qޅc#p:"}q%Ώ2s9bT"tM1p&>\+#V>\W3F^.>G{y#ʪ|\jMTY1)U#*D#Qy7!*_RQig^ϓa|g ߖ2 l63"m!|5/&"?b9=ìDҊMwh\Sqm"q$ND2ΞD|h$gsu8ً'.|y9|ɕ g  ,}㞹\=w'IT~U9+DQ}HTG- 㫉oDuF_#xopq%w{wa9U;1Q\82%ĐNǏe5p%f>ne"IOTX|'.>?eKZxs>|}r}:#So:Osg|9Q+!*绉3+K.sÂPR]yscqG]W6QyqwtQo7ޗq|qV>ynV'*Y yQ7d4q{竕'ѿ]u޻r«DKDoﹻ@i=YHD,>GX\!q."ow~8w/9 {.oֹ;=w1O˜6n&8JǟSy{w.8\΋ˉ)ϻa|w LDTu"u?)-\ǃϽs Yl%D(rZ#|s%?\z.~qY3+9]w(w:3wW_8^Onޣ3@x[ۉ*"|N;{@./yߟpw30كsy.@B=Ncesw,N\\ň_c9ݙp1Op۹Lq"wGn)0WWON(_t?Fw &ʹ~|bG|Q>>޶ cs8긘}J| _3Kywkat=ٹo-I+p=w^|Ηo|Ckx=:*837GD9c>CY.^=sICb+p1e}(^ {]y Cr?,E(eCD))QB<:1Qn!JfG4:Q/(S|4x"cD'2(!CD1?QL]MuD1ԗ(::ŵ3h- &DqQ%G5EշDQ Q0(<@^uyDIQOFDas Q(' YD!:QGB0H"?<2"_W@o9D>ȇ9y>J7"ԃϣ&DO29D${_K{mD$UoDXaD1x匇Ā͝BD1|s{7"ӎȾ!=K>XȞGdٝ݉D6#&)Z"n1U)|t~"g!#2sZ"s7 iD99:FdIDF^<~ 29Yp"څȬ`Dfb"3 SrD)BdDF~)DF󷂤Ig={SUZy:Sҹoss1;I᫬]h>'P IgBI_ҹiߗ̍MdLf"3 ?gn:5q[lP'2N<^~eD&h/3<;HM+\|$"!ȸZ눌iO&+9^- 2KvE""3;@dFliHѩ婟Sɯ#Nz+ٞ+"sJVaOE3I烥pt4ɛR I_^pqq?>K:c%߆+9't$柝Lw s$|xs"[=y(qJ:ߑt^(q\q\[QBQ'.ȿSR#nO%%Q=(2C%ڌr}xŴwVH8Hگ7K˖JڏjsC{|I{A?'=_Ҿ浤y{=b=z=I&{$3G\;I^CҾ1ϗ#p/WǕXV+$OiVOj%|$¥wՒ%mF~E%mWJvIڶ}m*%_E9:E~/;.#fI kSfxZ6}m4;檤m;W=ygYKJb%myqpRO:?7n3$m_K}U5fn '_noOxWE_*ߦG|/5n tL!ЭtH:zwDWn~LsmyH:f0ݜ8>_wkK11S]44x(t,{{4Eq9 f6quղq.겑.[l,6LD;F !nD>ȞşWD"}3gn (lU' WG#;BU(("b60qY!o6ݯRyC]LoidqGkDk֕RETtNWeɮb-u7D5QbF&jMD^1QJ݈ړR}76ϜH R VϾJԳX3&<R~|;QIݏtW{C}"j7KL4-og{% } 79DlH["tn b> |;U.'&*3/v&hce*oQ33uo[_|rq+BT6Whb }QI߂P"zσ:9Dxl4;WBzrM\p_#W%ܽw'ݓpw/ܝ߇o; Fo  ^MDGX>~CNKTDE0;r OJ,5\6;$vYڍv_J; h2dЎG5d4\!sdB&<2w#!+Ae-de@&2!/d#LVH|>2 7j dU kV ه![Y}o' :@&o!82vL̄ǐFl9Xy2 0PMϮɴ}92vFB[fj_[S7藺%j1p}5u}RNߢ[qYzuoCE}yz*ØQOoFO5 1Ws"mIoVһY/=i*5z.W;}W;~owS'W-km%}26LJ+o tMRHG;C=iˉ=Ņ})}@ot@{YR>XA.s/NL.ϭ$}CoSe-}o.}!g?eatD_ڲGz<6}Nү9t},1DZ6L2>[EkzFO1mVӻh:郲+VFk7FG=iԅ64Gi4 Lz6ܠ7Vҫ 7i}vz:=^K21h5j.m)cVB!}\nHߝCZNwUӫ4~<}ysB/ Đ96W>7{2ݶYf H7W̢Xћ;IZOp֖ wOkhC˴]ާlml~&5mSv"eZ2m ٙ9>VХurgپs{{V3Cvr0e}6/EݓiS ^/d+m~>/w>Җs`WzoAzd w2ӆZu!}J-imDzs*CkHA>}`ؗ6к_na9Zَ6K^Lhmbzrzu IY4nҗ'+iFZ羄>s i}Z8LoMDo {ЫQw~Y-}i6:B=NoAkЇQhXzo-7EnmNo=JoJ蝵B1}:>T&i6WCЋ6nf۷MMeлMDz}0{7(_I_tL[Ck;ކx3ۇ6W>=ZwRBF'OaC{DȰm7zj-|MZ^ދN[ROӖ}~;pH936b֎O*IHL :6M?iL[.eЖ$zPo N h }n"mG;魘Lf{hC68kZ/EJ%\ +^gNV #-B>}菲Ys]d6v'K&}~>&>pIhq7z]m6bv4Ie1ڼ6_FoF_;'hSzҙ@_n _[Y.T^yV7;rٰII_y۫1ǿ}+ЛҿE:>6nx~h hiD~Co'M9zؐVMfϠc6gaE,0~wNh轣oNz3^Np{k aEm~Չi8z=~AX)w i[kEG Mu}s'g9>D /k"釓mi,R~WF["_?@Y_°}~|~r~ʏ׭>KYMtQ>TIZGEk?!5 5K鱕ɍ(~7֝IkEi:?KoMi+B2Ѧ'qmP`ztϔ6Sdimևfu5OMҦRlG\:mHN\'shҟ6ɽhCr7Zlm6v?+i}y?6NcLFTZWI냙Ob`r{iW+6?<֪d|Uh孴a"62=l}mh ~q ц9t5>6MmL*i]j E_ ; RMhho1hCβ &&vҦnwڼ6ЦaIULSƄ%L>-֖llWi#moMT?a:Q';wM1-m(hϴr"mLOMӦCІlL 9iӠmMβy-;#^Eđ6 wh"SD[\<0fx 4rvm*5|C[֝ͻaضc,}8}cH}C[lB飚C6m^x_M5,-.9ōMS6wisrڼem!imZۍ= ?mOMִqU)me{DJbNf3r6ӵvk2ѐ6/I[̠+m}j ϩVʘM*/ic ڴ#6t0;hvƿ;iYSZ6|Nӆ̾NMz5OOj7Lo"~^Ia/̾=sؘQًn(Gci՗.2ъ6Cq4cfSƖ|6GWi+/^3 ڨty4mgllR6l?"dRi(xI(ӗh/mv0WY-qmWţh#&3K)<6ȳSۘak9Lw8wfĴEٚ2^PqTiw滚.`GgmD14҆_iO0<9~F;u6KIپ@dMJ Aĕ ^dv;Bai)̷ 70ŏ[a[؇ACh:ZZܛg1|?>wa߆҆@eЇbZnU:v )Wi cUl]ng3;՜69ؘ ҆.Ц.nӺ q w\Kb/YOk0<nEv:i4'hÂbZwS@az&L9n{H{{16^;Ls51b wp;z0-W1wݯzVҋ {@o?#b/zGw75)sazsYz"c q;WM/?AiK_+iʰW=z)%2:^H/M4腕nGk huLkoa|E4>!Cm,0,uVCgt)hGzUzqZV75ߒhCjlzz;@ZjZ7ӡiY-znZLպ#hQ"VЪQkiYe66CaZvVyAUKЪ;iQsZA ChJZWIχӪj/L+'#hEZYVzҊm5rniy&XL+D[p6YZw,zFliOUZ{*}MkZƜNB[hUVg}]D !rZ-VV/h[Z5k;=[zM L"ZLf7|!Zd$չCɋXlҪWiu_& <&{]Zc/Kk5vٲ;ZO/$MڴZMShzw(r^D/L5ʟhͭ%1~^IkiM:Zcާ-hZsza+3 zӱMfZ}ϛoOezSEL5>Ln3܋HZ=SH=F|zZS.5#/5]zg==܏VD+ǰ=gO+6:L%ci`ZV hE6Z~4wOZB+8 pZٜVTӊFSZգVU( ַxZh8NK;iq}k}(N+`kZ!׍ M6EF56m@KַҙʴTDiZZ>auϴ>-f}i:Zb-#C/}ųi`ZCKγhRZɎ|LKO/%h1ZܢUi-},.%:hT;-IK{ԯim -;LwbԛLNKTi|Z}O% iɾ -֦Ŵp-97g|EEpJZtb -~RE}%Z#D\%lhr-KXVzN=bFz"ͥ-lBoEOi9ZO &Z42(Us3Wpe=É@FRZx{UF5Nh3-A\Eg1qܹZ(fcdnthe:-Ա[qhQ4ZlOhɗ̳zgZhmDҳha%Wwzn4>>rzBzeZ4Ţ]-VGKd=i-Z1EiiN-lͦg&sBzn9=m=8 @ 7/1ihԃѫhy+ZtpxI+ᴼ*BA+3_vh -L7PDGeoh+>Y4Z>wh;/ZaޣiyZKhw*-2-`Y,KK`2SewҊi-HKM%riqoKidZLKM?hinZ濊zc6i--D /Ҳ Ѵȉ^|X!O%ٞ`5v\MKa%-}ǰqV--I'&2ye&}M&d8CK1[WekeZ0-{ŮiYsZ~Eв鵴~#9G%lŴd{j>Koru hեRÆVhY븪u [B[ 7 I`({?Ύs>{}>c;ΉZ뻭&z<=jd`x4ee׫>B} .xo[xOnwl܇OHo㝬Ox7{1=/ui>Ox5k d^$Ziwx n~{|˞T)S1^yxx%kzvJy*uA+w`FY^Z|>㭞τT+Ǧo<JM]Um=;1^=}"'|>|G>۲ރ\>xo??:]G> S5s >26}l}c|+7^{wu>9|nY7|\_#;|g2e Jz:]"u'0Sޗ< f;._gIYۥ>_m|1 :x{߹=ԕW_R)W|/6?7i_˩l?:~oo*| J߀6َo /fK6rWH|H/wo=n_Ŀ5o~~ k.s W͑0嚮L|oz^6NoomQXoelʘ z#g.[6gU3#-,m$i%7Oi|W ~;]ߎ.M26<R~w|T ,O%~drI9Axou~3]UxfIos~Bs@U-lu| s3'pKɸ8hxM;q :d=ANeTՔ=S_QxN8xyAJޑ5q6#]N}TS-IWm]<{{p(k sC.f%7qyӭiBw],w쒬oMp.֨<GpTr<-ʩ8W.{dgVA缉zvupX&r8q>-ƚb0r-}K9/[*KG:׀I ;TOJ~Ƹ㮿w8T2QE=EL^kT?ud\jBy9{J9;}mA78`3E.^mF{ !U9v8%N !/I]LNWM A!+zn#anuAHs"1BG|\~AD})'?O]7PʽG*JJ;]M䙎'n2_7\/=+Q%qVƤ=Ḍ?QG}uI2޺Lib>w;L~,yQ%, ׽lE;t0i=)<ӏܘ)$\̟v]NVJdLhlK?W۬ێB_k%]I^iޘ突z@rPRrJWJ}qdy@rڝ3$њC>=ph~?@嫤 Chʧq:)XQ<5)ˇ|,/ߴu|86';Ha#SZ< jN>$Hhr/5%}% F|u:/8R)Nz+OM rN#WHؓ4 w_ȯu|dM1%FčE7!e)m,:DA bŇ֫`s [>\ _/'d+RJ1s 5rV?ʧPO#mO,z&j9d5%crT~=7z񳟓Y.͹dC-|[CGGΈ|(Ն,m^@R NH=ޏOFsMBfl2v5G=Grr-ЗO93GPt?UM}K(ZMl]JOֻ|4F_:'iC=d׌KOf$6Ǔ_o.YU<0N4E"mջHJŕo9Ř OvP6'a2ԏC5|Z$5Kb 2kW-t$ oP+6#kGz|RK)wxP).d'> 9{}P)Zۚ\oE۽9~7^ƏZ|>}O;J<Ȳ@*|yBIӽ?|>_-)OVZrPoh0 ^OjNwRn~QBiuJj{N=gu4(}BOJ7yn׫(G[ԭ1E=WJy VkJ 3FrEh7<ɷ3[(sҗF9TWy\J}JʹJؕJ:˕k+{)^{+-(~,U:̝t\]]mLtEoehwBѻ`vQtWtY*gf)Y+E*wP: htHhxtP*7ɵ6JJJ3J;JrrW~#c^7C2ّJC|O>J%QT[EhxQw8Wis?JыtL>nmZoQ:JU:P v+Q ZTʧA4ŠciTx򈢿|\teɸIRiZѝUtK;虻(zW&)V+Zs*Z:+Z-G*Z݌(V^+Zf(Z*Za-cvXE+khkC:Sg#.v٪]Sg+fIhw326.(LJF׊Jr-7(ڎY\E~E[#ctuDaR&ߚ JGwmNQ)7@GgE{EDE+s`cR~F|R!R.]]XN)_J)__y;U 魔RN^0Fъhl|#CfE',X)ThLU{+:3Rl"c`~ȇD2R.o|hu=)#?Ɠ{e4޿ɸ2a AC$%|Jw^yMҮ[f.K=F[WO vxt>d!Irnyؔ vLΣ =VĄ"b󔔵/k5}A(euM^Kғ@~>H{ȈJ 1f" ᤞ$Pbe/y*cj 5=I5zULЃc!c|m:$FvCR:%jrA,/֍&"&1 #Ӭ^ğ. )I|̼$Nk!wgTC/J"Q$~ZE]$[]/,[k&YUH:A1$Ii-2_cIXD'7"ͥ 3hK~l)&~p}+4%A qٷ"I߉i'i=&"uVC%NZev!3&48zJI&d~3]+ً #<4exm Jt{;y 4Lf4#̉rA~2V-gt+$22.%{hRۈqR\Sk"]WS.D 1/7ѻD>~'zg%I%{&yFDǝ]jEv_]YI%s~8qωݼ؄$\@3`#Ǚċx%H'՟b'|/{5Kp6)GHA$Lܺć!>MImES${"{qĹ5!G$[w/WLҿ#~#U e_П9ĥ̑_oB„精Օ=} MϪ\洎e#mGֶߚL/v1c_MH[gw!V;1=@ekd\Ѭå/HT@7F܋tўMCK^,|k,{fj=e O|LKZRے9czP"WLQ%WM~&o޾!DlhO2u|3BE-qFl jͤ N>܃L [Olx3r9ẠD VEJQ)bĨsUd,Rb|'z?Qx ~Z2Wȳqr.&vԏo:<1dTGf Qʞ9=A7D[ nSI=?-:r9!jP"Jm.*ߜzDDH D{1~4QoP+)Djϕ}[U2_u"ztQ׮HrAdD"$ߎ.O]>9ꋜK $r3/O"jGm"ZКn>!e"g؊pD=xl":77&<7W~.]AX^w&Q"j&aۮ-uD 34=ٯ!l LC}p5Ф^ t>B!`/Bl3S\M Bu3]!$WMPglF`,ܸ8S `~?ڮįy<ŭjg|9eOqx\kM=W<. 8G~b b /?Ք v#hsTEGܞ8 oT'#5Cd_!ܧ^cs7n*G4Tp+Ee!aNDѩ3Ze-Q^F$yC,!6Ge8 .6"و*QMΤn^?p2my.,p偂\?.ojT*\ q5]Knsnĥ&\z*~Ron5pYNpm0נ\R6?h/]O1g 簿 Iı]aP{ KqXǒ&a7[a1}Ұo2_-NGuOK8ތ}&b2:q*8 R:bpsU9/]%k$*pxCcb?E;bNbS_n'l?N =͔E/) f.ЖasM9U6cS 0HvZñ{]Hn+c}2b۝S| u g\b{m|"vEq^I۰Rtg%c a~8<Z8Gqϸ(V8uG.sb0iLa'\ɼ<ךGp['9;/D\58',pm gI/1.[kN cp}4j'qyy+5pn-&P(珺lƥsYgqY"DRGu6Ξ/pv\+.iR/t~7S`0N?)W /ay8 ,odGGX+dnXCo7|e>t9㘿FM8`?5 2~<+qcy8nzo87[S]sBM?)0|N˽w8w{.v ?wkQN}fY.}KYԬ·?uځon*{*A|NΩߔ+$N;>-׾1ti>1x[b+iנ6>uw˻]Y֩xW{x|Nx{wt|}۴ī稔5>GHm{7-x oNO_]Ox`?zε;.>D o.t7Oʹ SGM? %U*X|uQIێvzBҰgDZ]ǷXdzKJUY|/c+8u>ڗ8Ae<~ZKl|oX\)~ZG~&W3|헼7~kEi8cG!=~usއ_vh]6:\M4Wu8~ߦ߳~ C5 o?{"|^!Ol|b-/ ~'IbMVK.sbOc[&@w7<v'`|w?3ߗKhuPK@\?x'?z<ߩ(VpCS$=w2}.;RorCSg'`m`?zۍn )yo?_BVxIO}?TI h?fWI#}<f% lsԩ6RL2|k lϜG }9Ǚu py<4!m:$ mtrRnWԐfw3<~V_p3_>_`|= ߠuG5gpħuy|75m5Rq+x/xv;D[eq];Ϲ sPqC>g}DA19K$ҎL"zr 9yy.7|f>NW#{r>˗K8U}Y/˚,︼xKyٯ:k|d/g78m;j.okɞ,.[֦ٛ,3"Ãs8k[_(i閬qU 8m}õ2p:+Z 8 &硸>[a%\: e.Hxz;U#9kp/+PU}K%܋W9--63%.S6sO{p"Dw@4$}!c οLЉ-KC9'( A0]3Lik$CB$tf֟ Dw!&d|1-yE[7CS !Y ?BP磭HHJBPLTB#E{a JأJ{^. DU^тйAР4Bel=Fhy,!U.!kE/oBV [ğom=8H\j"65~y15$ +>4^wv Z!d)[x 3'lC?z K#,'5DX|"jBJ6%3o7!ܲGD MDE~#$c݆cEX%k"d^2.ۉ0(=Q= C*"$}aD5 "l&PsBG{?'<= ,q[1t+6DZ~ǏU S[Y i!lK* >ND$K*w!%g 1/DYtZҜ+受XCN+C &WND>>HxZ:SKK= 2"$'S)2~m_A"U%~U"00~Jm ;ҚCՄ+_J!B paWy-''\a4poq"|Qy"1u2: [p=oLX]}žJM:"|5#L_3M{`;JEDLoO}i3R" hz ߯U_=lPLU p8EzP|{1_䣔]*rHiDHx;+o~ɼNɾ|ы!c>_^R5|؏_w+ڃ,d[K~2ҢG޵uBڟY|e7FHaJ,9(}OMd'o~5U&Ϫ/﹔(XNC*㲕ݟ)U7R*!3&_)KIB2 d l3ЋnwwՊVz vP-J(UJV+ xa_R؜HSm'wB^lYCj2ɑ=l;|4EM&Õoy yU[oђfCn?!gEc K|\d|92˻.NM&s^;I6O$R!%~EѬ:Jƥh@-@>WPњEadK&|fI9Zx9ͤASd+ uwz+ڢo:aWIw }d{9Ԫ%zJr "ҔگJ_Õm+UWTjԨL_>TSuBcTTשT]RrR5RCGJ'Z+&](Zg mWdO>Tʇ)NLd ـnR3ܭQwǣ*‡_;?HWk~K!mI/BIṅdL@&ݵ֐2)IFOD݌':FjqgԱIӛn2]HՐ"窴dKz)V'ˆкu :.ꏽ;:f>Fx;q#oH1!e^8v}I\{XYx8yIPdD ǑBE9#wH4J$آ{n|YzM0?-xY~Wp֗n@JfK>ܽN|rPȜMl6\&x&q/=KCޯd&He4?Y{Kһ~-)g)e>~| 5q`/#~$-!NM4)Otq_m V5&.>5;B~|&yքK̫Ə-^Onxmr]%S6%2{Ud"cZ~uu$ 7ʚ7E:__aUw?;sYpSO)qol:ayoSzK~)Q瑨/KPi)+4Wʟ z~z\#'$9>5̅"r~:kzYi6XiT4?$m@)w͍)zP 2*GQ[RnUiNsJyJcFz++RoPG+-)mܞ*'W:P:~ W: R\ݠC^^m6^MTƏRt+t\D3]izEi?>^9cJΕN>+W__ht7BRX~;nR`w͙iJ-FϚ)(k*-_*uj(z% Ew6Ewx)?bP'G1C\bm(J_}EH"H[S\bb{_gHkESgtV}WTF)z/bD੢iۢD$U4i'l+z/o-jRG~[OivGy"jx%jϮ/,SzsLEDQDuESj$QWQ+RTXITQT6<,*-똉uE`QmկoT mUՏT?\U'ņ>;Uy5P٬sNZQ=Y[h ګX*BՏ(?QI--jYھcEUkDE¶TXY4-/Z7V+EwJhOW4rP4U}:?Eh򲓨7偨Kx|LT-g.t6ƈ+zވ&'D әe*wh:(--{Yz{NNϞ>DEO+<@3IQ.'u)}-ފ>[>u3OTQ]t%J|] uDMDB7P tk ݇{EG\kDHt|Hz `ѳmg(c:ѣK)\$z,'} zW\.݌Dn)BM)uh_xKT]-^V7 {{ EoDޢ΢]QhC-2 DזDWN{ͭ6Ct€ ӛXA=tujZ[Ѫ Ѧh?AT4- Ee@bHp1죿^T|E d({EwUSS@-=" Y/T(&iw _qĘob_b5bbFbatJ;O,/7G,0@, # ߋy7S#Cݥm.Y3ѪWzs2nvQ;2tlRt-&*&dۋLJbAb01 X ]\IwjzM EʢݘB8L0W Z }=M 3/O{27Wn٢̿CG-Õפ͢[_TEL{V,/վ.Vu#VF;MIX20*8&w<$VL(5K75K CzbYb֕bxEZ~`++GӅIRal0-[ ¸eXA^9BݾH[UAI8Sx\$VD+ #bkCax䡘5඘SWL7AMݿ  RĴzbnbbap/a龘S#Fn}[Nj[#ۧ *ZTeJiGެF2**.w*>JsXs&jWz~.%۵5DmvJPQ.zMշfׄVo+].WN#pPpQe=QuL[QcJ*-C78qW[*Iza󱊪/TEV#x]!Zk7US*}guUʠǨ /+*q5饨=^iBZ]T>S]CtI-g KUy3TT1Ua[ 6nSŷQ%)Tkچ)nm9Ѿ[oID]nFYDOm"G_DG%/o0wNm'bJ9ȧXNX^]"l)V X+Vn+c}Ų ĂCb&bfbFbIs1OA.\!.<*fGT W[޺߈yG ^eO&Unbe^bU0)>* 8O~7az0e(Ekb#Vba8^O(Cnba#YB]pF}a*sN=asS,$V#z&֮.wEH^:'G0S,L*=߸0^J3t{& ctvymfX%sׄID^kXu#_*>&}0=#F5az}dRR9"V'tF*'flaaX^'Vo.5$!&rk aX~{X"CM+\ ýPX\XPpBmn' yĂBbaG1GmX|kXL9Z[l65Pqg/ X v}uĂ.bN5/1{8 X,$ uZEݎQybr1M?&YOWOCkBB_&dW'{?*}'=G{YGlS2}Kgɟur./JD9و>sNJ9br/_ѿCnJ4^m&;/Zã+~m jbbC~ "90Q~R_.&:/1Ek9 ө2o _qTiZTKϋv:eJ-JQ^59a1Z 1#X7X^']LRYTB)Vbj2u}pGW+9 xby[_w|>({8gWlG_Gy{:?b=_wE&LiCZ deX!~v?NJeB, bHyb{ߗU>fu4L{/|xy5a+R|K9}tbEC0LLya%t+Wm aT3cM[u`A bb{uadfSWtxS+ʵ':Ǟ}QB1l!.Sz skTwU]UGGR}* WTvI[VG k[PhIN{ߪs 2U '޷Pͪ쭚{QZjx\f+=JPQCudՅӪS3UP흩Zr#DuܟTs̃U ~vZzʰd6cg{ՅTTOVn?L*ՓOTw^>Q( 1m$/f_/ѡEQEt%G:JUx4k*umU_EEf{8\ŪA8e?۔i9<았T"/fc UuGR>;_0'[t+*?F:cˤuvmm_3iG u!ʜa2۞7t/3Ie1IU,^z.Ϟ#{%ČJbά-2uBļ%bI|Na$ ފ9bšbpgRbbLp1Wy0J?9M V'^)z>=_fA o?>GE&w\ S}e!a7JDǢ]9o&K~oi/&t*s~ KK5JbqX1$Z#f,sӵĜcb:bn7"MϿO?|6Q _QMTKy^>(e-WMmG.?ߛ-^SmXwXe8\n9V6C6J|[ t+| =Ţ5b~A1WuB(1cbbbbzc1qK?1᝗F(JD_PbxBy*ĨqĨsrƜ^(F: ^LĐbP'ˁK&3DG@%V\ŢBx@t|Ct9-o{#j {`RaB)j;\tXEwz+Ͻmkm6׊vZD{MkѢhjMd۷$;+IοGPrj.%39 K!gUer6&g[=rV!rv٭#|ϖkٺM1mAor%gUr#g*o93ߒ_]P'rU!,rjIOK>ߐ]3Α*dN&s3.d[jُ}W>Id#4%ɞ2Qd( mۯ%ck>#%Nd}~@Vw%Y' }Cw[帏,d%an%몴RZ7YZhEx&$k3pY%ry YuUIBI$&3 ^Q~#Iɼsd@dDdnJnd&sz^J_@d*e`AcP-4д胦45Σh2~'{c2>!C6YȘFF2"Ɉ"#:dD4%#!^MFdGHXJF2&ԗT2"7d]##3l&a&rv2ڑo.IFQlGvU4"T[{U)OhjBS:Wshw5Ju2JZM󡂤YDFLk2Tɰ@ƳcdܞG/d@>[2#cH21S?1-'y鶜h5Ȩ}* dG] OQV{N:::u|Q{=׏.6A.gUD}%%Gmy#[Q~x*É;mzNۆS^Nu@8YgK3QOz8ԓ?bz1I`z2}hgC=sPCm$_Y!iE-z.+PDyRI놼o1Kyj{jڻ#%ͤI3PBEc3Z( ȨEF27FF ׿ʞ-=[HlVGo WAF_dT'IO2{}qE:9IƢB2ɣs~m~/ezy2E}]}ע>_ nRGG~>Pz.2mڈtZWKݭzi6f9I/Ô2M> Wڪ2qP݁zQ p%$K e0X w 6@T[{G%e%y%cAAmZo&Sݩ@JE6'wҳƐVxoңJzHg҃ITAF;Gzc=IOHzja=+IO cҋ#B{j{%.SS꼎a]iW$h?_ Kvm^qcifKQЗI;6ӕzL7HSt?v2eùQ/qD۪1 7x! /߹ Eeylgd,iP?x-NXDdwSϤ/xp[x &)C?ws[>e|Sލ 2$.Vqs*;/zo$V҇$G~ uSQUelIi_ߥe\ ̹e)02Ȝ$Ƈ#t92,Wa$s kqY3(5RCY]+dS74md}՗Xl4ƣfH4K{ahfgY:/ Gs v%W0lݬ<+˲]<\vG9`|JYFdٙΎ]Rv/&+sJVC[YZR`e_2~+ڄ24Tz4V,k&0i){IL&M& \YvɷFIc_ ( /,͗vȓ}B4?$Dg1e񗴼%Mi04.rzp^#ٕ乖Ce׺ R&C+Wh[,_K)wow*{pC="AIs-nJ=N~>su2Wl }Ӱϔ$x{yɞL\:2d(w22œq~7ǟq02ֶϑ=26ʘ(tԿ=l-?Y<]Fe`Z,j] 2VBlEId̕LT2&H| r2oL C_rm5ɨ-{^LuYe%kS[oeԢ,Yv6eEcƲWVg,e=.kf)k\0~Ő<_֬{!ݮ>~#I7t㹤Ϗ }L2齷f<՛V;kf5H;>]HMNZ&5#M19zF4#YjR"u|R"u2Rn!mI) &%9)1 I4 9)w/r.ŤCe@JORZiR Ʌ INHIOp7Zg _kIӄwNl’sB!a"N9IhR9BmhJ/*ل63%wBc _kNBWW >V N\A)H١e4pAu*KN$P3p?MEnXɏhj1 O&&}5~r/~wR|s}C·c$>?;!lgL?|>C)nw,;1^񒳍Wp3* ԽG.-? k*쏆cFͱ~{e=Vbz'5gϻi}yk_]yf'yogޔ,Mhy<ʛ]x3ْ7h.WN ^oyҊW_nFpWG^,n Q\Rizbu=#_Ci)חs}6Gz\o gs Y&Xw -|6Kb,Ob{-b\(&rH{,\e,k,>")`,\a[8X[łX0NN,*b^|-ǟlCb>@>Iܽ%^S0XBe̻KX" W˽"$$a>|>#a>R5.i|RO 7LW1gIck0xe|ţAE;m0oJnyE_mBc c[ Dd2KY/f;1 Y*|s1~u<1s?I'B)f~_1 xC;ɻ0YaRFcY9f;Jzј} E~7\ka^U0U:7kly3ߖ昷ywԓ$ubye9&ٯ&惵t3|ؘ2=O;#@<; 0_O'aq`{#̏XKz'ҿcn _w%ߏa|3o1yIC0<4ߧƢU EXnw,¢2,bbtOq1K_Ų:XJ¤1[/`'հ8=KAX\,^z0N E,"c8NX ,~ ;,8eXR}'`9pa5#Wc9Vx=I"r,-rc,c˕O\K6Xnn2Wrq,'cyf&cyq=by'f$ 2u;X-a[±WYB" |cwaR,`KSÂau D)K4,?VНZǸ^5 r֌Fr}|y'w\3!'[Q̿1p)7pcu176ㆥq#0YYAցEǹ7oVu! ~,5VR4Z9['Krr0q[g}a p;'wNt,n;VeݪۯwZs-w]q7w"ިܓ=kyo\}pM_})xPQΫx0]уYUaq<~ێв?'0ٍGWx~+Fy<:ɣgyGٛy\3k<^?d2o8@'<1 OUɜ<2'=O$Ok,N ( x;gU;~9F Q>"9LyO<{糢yՅWǔyq4/Ű^,}Ƌkx/^6)\v'[^Foe^^~yW*2csxI>o^M민Ԃ7;^ބ}0vgy{֕Nx7w7nR0ޥ:;G~6C?}`V3 Vke?}]~`k}}9Eb}6rQӛ 3źؘ5U9Kfb{;bE5݀>-]!vu+}دpT'C d0`SMpXqMppCHԯq8ƱTǎq67x|57(s;i"NKqj-qpepӅ8=݉Nqp2q֭G8/v/MSU gqi,މ˞XzbKT\ gZ/מCqWㆸ<5e ִ2n6k!nFv&n/o̪tN-J5HT[ϣTJ ܃*'Q91bZ#n#%BuSpzq]q_*_'׸C3 ;nxi6 q~ x< <ެxw\)<, b3s1$5h^ j>=!qpuݶqmp2pWp)Vu>#mEh\ܳc.GoA[ YcġUm<bKsPoCDףRZ!ABTwu&*1GM*B'h>*ITϢzxTAeqOՙ6G/6ZmjT/ajSTVZUFIAۻj|+d:n>} nw! 7M8nipK-.; 7+ oܜq3MU-U ܞYy_4nJ\7.fy+Kp|K ۾l곲snPU-ԍ@TIzE6O,3Oy.;3įZ?V7Z{w}~f/T7=X_95?e[aKO_f%wuJ F,#0p| 6p*OKk5TrPI`y-k-$9ZM@. #Ф+!(-|GKomZ@;L4&Pc@] 1A?T,A;!n EMVD\W4"h7Ak_dMV ;&A~t$IHy.w$9,jtA&tǚo=FЋ%* V9&uArݷAWL!(a#A@uG}ҁG'((DH^bV@>o&R+&nGށnO؀D/~NDo]Zg >cF9D]L҇/؊ZD]  'Rb$#13b13}Yѓ79џ b61b01~L'c1SK*sbY{Ϗ2!6fۉfޖ#6qg>sK".*h˽%i8=MhBa?Ep#&-闍Ɠ`P*0KM$C$'h$[<.3ϓ֌}H'Hv,OrPioH* )JIDpCR됲\ERl!VRĒ񞔨y"g,ImԾ3HWԅHD!RI v&5&_;VމIk/HՒHIڢLV# ifLڭݽLߤ9ޫ=hҮL#5Ҏ~#mo+6w)÷;i?F* %$$ffV;DQ,.AQ@Q V^7{9>%<;4Of-]h B ^wAXh*]7LF'_i 4mkдg M 9Y$CӜYkag|f@%?>hڳ#ZdN+/{+='xv[{2w Cp<[?,_+N#nâдl14M$W|d+'oORdoMM~o|Yy“m')M[[64~=,4V@cA94f<zj4:rvr] 7G@Aи܉o;smq24"h6'}qFӋ8t 4r~Шٖj)4*.F hR1|*< ǫ2o 6o}]_h4a|x< YWe̓4dq˫7q,#hX{OBc=4~MkI8`(u/<ùMn 4ASb4_lN 8=+JN_jj9]+/hz6x6Zx(t7 R)>"@S4m&Y>O<qnq- W/u<Sچ|<_w-my|ǣWgVMQj|ɼ}m= 49MД5xc^=-ԡITZ93C)В -I? Z%l)P{Z|6B > ON[Yp} \sc oЉZR*Uh -CK B>5CyhU2Vhյ֡/tVcu3hàuA".z˖BкZCƭ|lm|lW|x<8g#|<}VKЪ-Oj0D_sl<^_U򱞯'Мc_{͏qmoAh66ۨhh>ך'B_߿[+x>g`3_竸9W=9|Y<{gx>xws(~,5y'/ŧcBsŤø6}.Nr1l;4  Mǡ/ ? NJxy$4>b0YA%K~/7qx~\ȋyqLh=ڷAÓ5`1?GR Rath ->eN*g ;:^tW^+P >/'P6gfCدTb$^ˊ`x ^ry˳rW\/dˡR^|Y/E~: /\5& 2xůuݽPWu*P uvustP'vw<>BY3Pf ʆBsPJBP: :CɳEPr[Jl۠di SZ#^Cp(^x BQ9WPt,By( K 2ZBZ:<쉆yJxk2<"+,$-G-(X!$CYǼ|!Oȫy!!WțQyʷ 5ޝ wUK7 tZB^oR͐!%d[W@ad}ҏ0 ,6wGxpl&~X opZ"W{]p@ޜp?Bf%dFfB\2G{BDhy kd !;d w"aiw=pw^3*'Aqrҋu!=-^\ )H ҵfCbc6ypcN\2.;\~kn-ܙL>wL]i!])=+Vwa!/H;o iGCږd k6&@BBי>HRc@HvR*!n[+AGŇçAs*_"2}t@ʫHhJa,ܓx|R~Aʥr>m ee6,)h )Ubb )Z"RDf@TH䖝\'Ar$'=qu4@=@򑋐WE<]'p!Y$sVA(W CR#Hz*@Ri8$千jHJ9IҐIft#GBPH'ieHZCU$M<$ɐ$}U) ܃l7vC}4$nĭƐl'$*I!qFH (D!H蒃dHh /L!-$TCPH(? ( 57O= ePo !aݿ/g3|>yxz ,H|B"$D HTTDG/!C⼟*OC/{um$hAbl$ޏIJ󓮃$ې4 ,wAB6CҾJH:}\V2\ Hzec$u,\!Yo*$m yHH^k9]og9ݼɮ*ajsSX @H~ɽJѯ:R@(OH ]Y!eml4!eH9)6!t Aߞz@k%xp}BJ 7GX-DCJ|HI< ))o9\CRp#ߖ1톔0H)o o3l{ \)߆!e:gc E R Kvނ 6oOGC Hxg!6H\M, W'_O# ZH :o U/Xn?!~[4ď_bWq;!"ͬ8ZbSA)]b $=nЄJ[k pwuL쭀38!:iD;XC=lD:Q *NBW/ }S . d(DHbSqDl1)»V@x[᧋!|dylflB6$Ag尡!Ԯ B7Bր_u*BrFBVADQ[}fB Ӌ  !x!AзZM}NAt HCtA`]!f@<Ẃ@sTUPyb/@5@(ϼf%[[Q?xu}f,q:iKf"&qW|<R_>~c+>4g L޷];"އW ?m eWjY^^~˩N5}x8^jKx>xvg˩YI+d~8;OwnS}}fp_kK>Lpp#Uݰܵ]KrsT6nL'p+n9vv[(Ep2'ܶu'o6 &mTpinu͔[X sx}rkZ7mz.Bo]n~eKpu 89[-Q29o[Y_&l _.(ܞK pU'Q ~?ޞyp]ϟOD$=nn/Tʋ(rg6;3N "{-܂KOƿJ>xx-:yW8*[[,p{z7p'e,xZ[r_ x/9 Ƃ.s]M|zgt9, mizk sw^Ul ~ց~YW~_mC7VwAU. C@a(G-xkK%=XGB:[v1TnY!2n+l7 $U B^zC Bz6Bg@hy~^aj lk2]҅x_a!\1C~" ½Bx"d!b^&j  "v"DT>/5i"K!2~DV{B|&| x DyUQm-m&G!zfDЁ{ :1D _=ٲ bCLN)ꁘp[v2n۶v".k VbM؝!Ħ؆ M.ĝq kWxoX W >9ķA C͸ 6C!! j Q($rr%!q$ \nm#$OH9lb𛆐_OstA9zrFԚ]6e7 Ͷ "5!ro;5pJV;7,*x-~tIn9 @ZH\?]%p7ܝy n wm]p7 --apd gȘ吱2C!dx́2ʎCFdOLZTLȴ KnA2=% ;;!wy N?cWBq!,4wCS)T B 89~srNBΡs=^Yrrb!g& 9Ʃ3DrC_w@vCn!c.Є{W3#!"d| ٗ 6mD {RC͐=/lxV ٲ [$ ~HֻfjZY!d=,mȺ YʐWYS R.d93=udԄedEkY ~C,7Ț@@ B(!>LC>0)?'B!Ț>cW dӯ 4w?JJUzBѽ̷Y9 |!ids>%; ^3ǐ7 r&u' W!_"#ȩٯ'b{ Wӥcrw]FOtc}5j|쮁ɐ'v@2 {\Y.:m}G$ y׋ ?w@^+=󄼷m([C:oj ȏx Yg;H@(`(X @/(^Mp<4N<<={6LBR( B4(Lª(m^OeSLQt$lMVنc6~T']2PTePYe= (SwP e_&AٟP.zeSn GA$'(:KVBP ʏ @!PnP=l<ӹ̥P Ay)ק{VkASn3]xG27!7/V{( ﺠSʻ{A8(&APTB*E¨*F;C9P1k.TXAP TY BO"{šTS<tãhQ3'x ãjYxwCxQx|qi!<}P9"*@屽P{ *sBe{1TɋAP5Bսrz_C5@5 TCu"T='Ɇu<)'@͈#Pj|ݡXYjosk>vgO5cP{g6~'3v<{ :PWx^*w:xP^ {R^]P]@xx@xq*f2« c ;azhp膆3P =#xq0w| ??K}gqwx7xu fg+7x E ֖м|syd x 48@sQB_ E *hѾ-J2R*Chmk{|/xd\w]H{K7瓖n:#8qb O/O\y۶ns6knB 7Wdy뷘-_^\so_,# f?nXyfs!ԨށwQIز]pdN>g,]%2.چq"/;qY3GFWpX4jLAJNq]3qzJ%Z؇pŝ)iY/{2ΪHܶ nk?dj y\+pUH\e WڎӸ;p\ n^[-㮒[x@:$^ GUux7 }ނv9tn<O'6;x6x4Gl{PSx w-,ƵqAF&lUƃo,A`TkvtFhsGpJ GpLs [ Tp \ d: ^W.{ ,@}t իh?  7D7/ú@('/‹vsxqwNA| t">7th,Gd%zDx@aW|AE'ֵkĀ6~;b\Y*&,Nxf:֊ܧh@,JG+?cuG|} _^|/6g`|^-M*vZ(rTM&> @ sὕxWGέZsV b@Ыiśx‹ x^}~}_Մ۪+0])qWK=wo*ݫTp#Gn$ܣY{bpLkqjmwp;nYz'0ufQ ܼiw;Nipϑo~p4:]xԢ-6>V6Exj4s:AAܚ|l!:f7ˣůx^7v@WIxF:OߡJz"9 zNTb /c =~CahP>:v:9a7 5pO^~FRށ>gO>Sƀ<*bHL Tq_ ^vAS!~m>U&84%tTPc|Q2oHY' N?֭,-?msPB!ZdetBf<wTk ]R]1 - sE/<5!׌w Ӝ qݜ9ڗ!5 UjAws EnGF91} {PU5P;e wVK8}E!([r7 @ѧQEޠdۚbpY(#*,@Շ~> jt>TozjOZ Zsv+v$֭Q8ޠ!U9gl7"-Ctp8r8v%ôơwh = &šXu.Eyr'?ai<6GQg9 !QG4wu$ .\SJe0U{QEp1*U'P55,JQC8UkPe*oF%(E?;Q>WD0TtfɢV!2Q zP[cj݉pT<USGTT[Tj:P9UPcT8r+]P$ 6h1Bxm6}_+d-|8zzsx蝦ŬS{1У2 :'WA$wxtfk3Pwt|JC=P)JEj(q%HY5^CQ:k{%2P|Si8EPTŭQ26ep&+ը4*hF}TmG(tM7.Q@yK_nƠZthok=/rP?*ƒ_!$<bW;~Xŋ\l9Ow+]wp1e^{Jsq߆x lG,cA5hx(OxRsXGp_s }~2mܸcى6K<~yœx G;W}Z?KNU[ɸ6.4Yr q8,kU ,lgz3X]LG2F Gwq8p49o8E4_;ͫ1c<Ǿyc;G/NCYqT1>躄#VF4MߡI_@ӢhM3{mh%p>T4. >~OFr ^.Qqb4V2QOE.;Pg^"ZPW5|kQC6_HmԘ=5 9||\ j( רu5Ps0(ZzE5!.FU1v.\P[FW>kzs7j7P[g*Q]lE99C5Mo~}ԢHBULT-=?>U=UrǨ6 / 7vWJ<) ] {RPQNrFT9Uk:TgQU+*G _Pio*7yP T g Pw7Fj4 esP<ʖqmQN5vEƍ݅_4PʮqL8x,(2Pf~s 7EQJtGTl)QfBʄǡ .$xF;Qa5OGلK(3ʒ܆$|"q&g\zt80Erqk"mū-(wi8]F(ՅbPlNF(Z~ EP4D{zܼz(♎"wƠHsdA_8;P5?:˸>laP@?D..8D'(pX j@.RUł+X ~l~ ߻Z໦| {}lQ:|_C߃+l(43(F(.1%tP2K fqg2u/Q+*ltsz..?oPI喖7ލ"=(578a0?F37Q/:p jkŌd~fG3.5\f%p-=GhTIV8rЀ qx40GJ}^8z)^B !o88e mɃf8e,Sl)E\yN))8+NnS7éw_p6s-3!H 1zRld9sgT7.Z7hUzg]dp֔8Gg™_p8{1Ԁ:8هF8?klpnB8G9!? pgzsD܍8OEj<wB$lSOg>Vqng7 ֙"4DhN{ӎ?i18= n)]"8e%|.'|^ 8n p{qT< #TAєS?Z+ e=]zu&ehԶBb.J@BGԸR | U4Kpy^;g6,ΠjwGIpmTQP٨PvF W=r[Q}.F@٥?=OmA*3qhE(}נ7(݄?PRV%UPFi(!1+~(ogQ&ӻQl yr> -A/g䈋(e&qvRܺ(ٺlY=N]LvJG(d)zIpPIJ(9}&JF-@PjJD}I.^^ݥ9}(3ʼy@Y;FY#;|~~ӕ(p:wwF(7~GPmB%(y*`ro\p *eFelN'v/D5]>}s1X.!PHb{Qw꼋C] i^;0ơƑh|5|_oqLӶNB.ME3< u?@h&~\ܸyѢ1h챽fLG(kΎ֡f4QRGghx0ϭʌgOG>paCnÕѬnpq/]#n/;>Z8ۉ&ߦI&.@S;hZ@]h;7s* }D s4AShzN>z#oa8V+)#prqP=U%򬍸eedZ!K.p#மe:]tagpy['  Ocm efiyi*{SIpՊl\Kۖ\q.)Qťy7.c8;y;ҧ78%9v(M.x*,D㛒8Lk8gQp~xw/;ɝ]oF:а&6.݁hQuO4}BݛPwL(!'ޘڇM949Uڟ7^E )*Q;jQI*M86LP% .FKPu7*HD(6|X%\[?^@!9\<)"pYIX#P}bA8qu?F_s$ך#h X/iϸ/6m$P4|-JcsTFQA47P֑wV٨=ߊaU4j|"*:J[bJ֨Ӊ_Qi*ţ|bʍTYҳsQb~2.8XWeN$TTZGie:UF*3򧧨eCNE#Pa^CT{!+pȶ@P}.YyCF.r| Gm!(;\8ɝB(+QPVAegxe[r(Wk򒻹sBwQE(rd9Rn({z='\pO+>ԡ8J-(x ()%nDP\עx.b(} EV5(;*P r ?iַÇU[B:GC{ },PGvCiD<yC~iʅ$5v D> }p"\Åj:lCT8c4]kaa} ,_aX=oy8*XVuB`&;*ua08 .8%#R38xl'Cp!8KK0\Fµwy]gM!lD\ZQ &~#l}ڐ3<׃'/@F}gYC!Ov@A) Ϳ-˜)j; Gqr* A1"ci";4zkchQ8) A89\l-vV6ny{C6qmԇ…7}Mzw~&B_k߁2ItߦFD5%~G3m?1S0@xXc [iЧ`ට#K103 ;1h5 Zp<`У V U18 .nCaHbI70t< cĐ0h!ܕ㠂!`?fCne &z!bO$Ǔ o.X`=0P>c@w Ac6k]1`"'?Ā0n/VUl#,"9b LN OT]0L!Ő!0 Yd"?o!G07'"W C30[6W ^A&1p; U+C'+lAwVR LBߔ{3Grvlل́X%!X6J [||n!Vn*Pj-^>'0/sƏRs!|91+!>Pa]+fl7ûcNSLdLoŸ#*,èź^6CE7`Ф/?}:kZt/[5zxS޸`GOkJty]:HMx)2^:Oxi*^Z$D ٩-nExQ/pSJ;:|k`t(jD-ho| .m`=go9xl=}gll<[%gύs[܍-x. ڊw ?vhw ~ioktn3:tբ&t4}9UC:ڇB{qh%v$>ϽxLwF[h;A]mm~ڶIa h{ږ݁T_ |,:$:/~tWo {pv /墓F":/G*k3ӕUz~y%_9 BzQ+َP7hP ~DLw5S|)Ub6RLaCQ_(: Ϫǔ(QK?~8/7^ϣ8F*Y(n, K7)QJX (~^BRI)nQ?6GyA޿(VnoD ّtGeB *XIBwwm׽T1t= J z0eSұt[87t?rߧBRvAz/58@8s@uyT7#:Nu1r|[r-u^nwFǠ%w;}M#+l&̐ Db"1-)L+3ߢLDy~= Ĭ٠/L^dJfIg&[Y S8N1%_Ly=S`ʟ guS5Y-fILc[)Σ aduELYcS6}2j0)g9/6Y*zdc LZ`&N1Iz&1 >2L6n̄gMk}(եNK\鍃XӫFz.ǝe7&P$)r5T I? :Xb} sw`LWډ1i&ia}D _}è`e0la9Q19kLj@hy:m%]D7c4 h@s^P^J>qROxQՃr5(i3%JI51?G.Ak\gz4=Xs3z49n}Ir%tg%]9$]tOny"XLks(r0OOQ>CIq_).Rw|̈́ȧÖPȽ;(2R\z17Z"mHjop#Lz\7Ro}psO0j߱ނ;5hT!9(QXݸ8;lֲ!M"ah?u:.+(I*OPeOT%DU{zUʡ܎1< +i}KPO*_Dox Sz&J;Sm*=VZG5aaT;-ژ=<SbIFO;Q@)zq^} QÊzXO'ޡ'RTFjVг,z.+BuҚbTz)AͰ\ K nJէJRSBj;޾C>Գ;z:gv'Mҧg };vf"w0LC2U좢,gz؉Z3zkXBQ1ua6݇ߧIo*IGڒ|H I7Ѡ$KHk Ix6 &Sh @E4ppUnh2ۘ*Jw7Um8_]LUPTwT-ʋcyK앓B2di<.@-8TrNݚRWQs-<#AYSk('{r2~kLBZ$|P"}*q$erg)cRJ[MCxڂ?Ӄ!};jyQѰH*ZLyt(Gǜ){Jr);MQC:߲T*0 9\z8">W@%Ah[ UZDխt(WO-I-$>` uHѫETJMH5ڌOWқ%[ݐwFepjoR$bBk.9?+^csxzaqG/6R UJ>vR)2N<[U|@.=D1"fPĪ( r\BU6(RtnP=L!faXgSȸLw\@0m# y;.&ƉS! R lzWHVWd!,&gRxEYR,@a-(5P` Q(Ys(@&_|%(S3 ۼBxRqnK'yאO c@k/m՛xů[HQ܁5h/E^_Am)RuE_EѤbOJ @'fRb\#;Qxҽ%dE+SA!*;6Pu*ͽK%plʿ(w7|9ԧQ=7R`=4r%**fӛ zy$o^Oz%kRwgzD _bj|OSKEjyn@-WSe 5_&6Q5jކv^)ϡH.gFu˩.^Qzj;IK+8fR5BQϚQ 绸USì q;SqjJ-e*VH>R6.m~^oK!j^Iz#|5:$i*uvzQjgQ1GzB+Z'qT,B݊ө[d3uyNS]:nM^R*.}5n?MvЧ"Kҩ@ի<̘Q_#O_{ԩwC-/K'A_ҙi2}p 'cP0}hk }J>Oig:FmLQV^Gow#-;#uΥ.ݐE=˞PɦM]3g_4?ԙ:L;ŀןvHj_vS{/z&BowQy/uK]˨G|7M^SA}xJٷ޹JқsZw^s!cj)ulre~ԱuʘSHaͷRwG͠LcA>ٖm^{(yQ@=G8qi;HQpz=7qu>duzDSWCu,{4X=ZEѻr/xzZYQFڿ.N.ӖE%k7}v~~;]̣vQjCmSE:r}:: S{=oݧ9f(zyjӛk9DͷX.4ޝC/Т.䌣wtO2岐:,uf!utnԕ:nQK Q1z+ٚrg큋8۷5c1 .yG)gPN/ z}_MY}Lͩ+wsIwuU8TB\$TЧ:-yWokg21:I t0!& 1aS &< 6sf¸ ΄g6_L 9U0!D&̄^Di : x1kILpJHla3[l)`g޶3'L*H@S&-K}Lp\oҟ sq6=0X&ѯ`AQM?vܾhC觔"(> 8OR'SK9kp#:|vu*r~GGPwwk}_}pql}:Kzv@OJRw,k6Lj퐣Uj9Z>kq8˨s-_8Fݒ+4Ro$+1F N=}T>zћk%uL">qξr}|Olo.vrGT#:m:_/cRLkSC/BRz,] 5[N@3t]Z֞CIiT'VQ‹cv"b) zzVlh$yP@u4_%7cHsh ]xqݐ9ilX2ZL&sd,ڏFјdi\IݡgtL[Kts+MGL+&~^ѠrGW-ʗ$R3dF'h/3 3Ct#yi?ghlx3y)0k&~/a 2T6fv =1eؘlt$6نSf0x{ƽƷ1Ngd+ęliu6fX$&Lb)1lv6fp7dFĎd?%A1l1 L\2S: M~t1nf´ژ[&-͔DN32 `.˙^ZdȌI1OfnjuƳ.1cd 6q+/M>ŦY Oald޶)f̽~HoefLp;&(6 w`bl`q3ܠO*7蔩tUvK?)v>]yRckz=YC> m{=*1cY yЅw-咭-:co-DgVM=ҏ\S)V./ZeZ4gS: Hnw @xGI@ ـJO*VCsuݢ^Փ*0IO2!T&z0}4p5S^ʹ!3ȳL[*iwaC!LgUWc+&0 f8 3\gC߲PE+fЮtn2wL5rSl#jd:V3qLIc#|d .2`{4k2 s&w(9~=Ŏ{$ⅿSAJeCQ4X&$&dHTRtQ;9AN*q1rةGOqsH bι8-دlf&Hl6.f 9s@ ipgۨaTzPSPRj  fϟ:#*lB6}P, ?e1ldf`Map1GB6C|/>&cKiit:6Ƒ 7*sy>fn,_llC6v 6V{03Wje8!nefcӘM+r}FObWpw6RFh01t3YL?a_2WXkMa7 1fTʌ⼙њlh'z2{ uŌܸNa&966<Ȕ696yY̋mcŚ:fMqM e&2,%f16_ƕe&ElTw"163sR3;L4agn3u>>+0l?0-Ùa)fpalHz iGq~g1=~-6}ϕm_o{WJgLx8 YÆ!%YlH<ƆLcF2mLuBiEgZ2-cZWb]}iW!S!9SNifZ'LsXqwr1ff6S^y0#*2Lٯ)0l[3Xf30q@9:%3JerKQcf-X<'pS43 &e1wӻP4_^f0BbҦG6b&j1q2uK&*x laJuLyO쵣?bYr/S)&E0aLu:S:T1᳘m~T41/Ly%S7t()0yL~d&{|/&;=8/eru9L.,ͯf'2Yӫo}̅9Lp/ULv&k&ygsҘv&=3I,&ͤ*b&F1ql6.x`٠Uؠ3`$ ZfyLz[pwsXfrP&"]YF!\C:G7 L`< g?lޱiޟŴGLF6vIt1LG qׯCz0=LYzd2 x/xEW+IG;j')Jvet8EHX$JĮߴ\OIj>z"Ϟmg($6\s`/]J xAt1DQ\:G'#֐: ֐cZ4]E¶yܣkt؉\^KkkryH=k+tK,٧l.yێ{)ĥžRdPL1D.Hǎ˞A>c0U$Su'5uj6;9!\NPMG\;,?Q˭HjQR`25eZRjH-\r9Zm0MۨuPq~C]g(EI6v~}B{LoM3H:MR{szW}MwCP67WJ e(Vi̠ۖ7}z*'WQ6{wқjQ:r 9D=AVa}O*?d<77#ul+_EG{Q'izz3@]Soa X4>Do3CH QҏzS'65Rkk6e郊 })ZIwzG>ܛHiø=NKکk5(OI?HDItZ@PO>JOs菗 ]n`S!>4~wg2x &j8 ?յDP/:I~^Ƥ2]ߘdZ%wIڧ3mljcw2'+HNv``6&ʓ f"=LDG0T%&2=qzD\[Xf&63MpR&\7 L\yߛĭ &ru&>guL1&z)x 16tޏ ^M|BQ6h#egp.2muϼDlM}rl_g3Be܃TϤ6YO QOAR*%7rBe>5l^?rH>:Gǃn|/p3|tǓP ߇kPxxgsW?*_x.WW(Y a?_07@(0G/䜙[0 !{+dyϕ,k]0(YڏPŊ_hy^rf;|J<^V c3X:/qKG/(umRw](eLJ~#o/O s7O˖^vPʥ«@:~oKw 2v@@q/' N@- ʧ"voLdy,> nyk:ɊM*h<7WPAR(o{꧅<,siNi,M>΃o|?˓~CI S3nH(Oh\<41-hwo?ѡ/xsS9H*jr5TsW7̣BCPe$?m_+Cw?{ j7APy:&jWW^yjFBUPc5ǡfSѿ5Ϯ3"x.<ٍ\[?s~,i0_wx:6a_xzrwyx蓔|[)-M]O(%^GaW.׻gl (۠ѓ|O7C6( ~]<=k|.7Ao8='oƾ◇>Ǖߓ;/m<ʫ_quxu],>߽B?hjګB|wVljUP v?>{ƫڝ^A嬋PQP:.쁢u5Ix?^;\Zd4dL<>tl䷧#s{C!(?wu9[Hʧy|ʡy 4'愙МVjGzþ| G/}?9/˼yǣKIU ~BZWBWgz=RVw>mk-~߽uI]>f>x~d+.˦n ?v4r䀤8欥VV㽼e̓8L9C[id2ϠbiN[ PSTa "{Vχ{׵??ZY{o!rjku%7sOjI6͝Y7zb5 6׭{n[+FUu>PugYʹez"W0`l>P?d1q [6aGg0ČP\ŨG?3No!j;v7/AMD+Ļ J4_Bw%A U/@( }DY?ʹK9珽g\3p0#8o(:9887Nl뤼\wT~/@юP->}\@*׌=Gs*OS cG ]UK]FkFrsgG_e<:TL9}XgPƿ%el|'&S;e`7[OZ`oW6껗ګJKnz g|=3*B/B/ݦ$6cML`%eeG͖͇_[˂Ae:҂;WBΙ8!X/X"sXF9qtx$/* ]Bg?hZӿ֬R"/h͜L?@{4x4<4eBӛjBwhz+~7O^!۸ ߓ$HZ4ʆxo>. 2O dEH'_^@`s]y,?} v32awawv=>J]^ f*d>M/EE_P' OCBG ~1J6~'m*9Œ3f̘1cƌ3f̘1cƌ3f̘1c w !\k/y'ݖ=[Eq2OxIt]He?#YR-b9\q WoHy.sNR^r3\4gThBFbT)s(dcXJ*%]}3We6~LqUVղr^+_'h0wpEP9erS?Kp\ЄIqj){-_UA-+e~#;$܏U02=#3{(d#ҳ ѡH Dn1jWLrNщaLjI9~/n8' XE5a) YhiP ZHdv"ee-'040C0NcѤ8BP}%\.ɨ eJumb}? vc>YaNwQڌdMN4R3>OdܫQgr_=+9Z5"K;Pk>'e5b_7P0tRO4۷jRQZD¸>SQsvLgKHk-)]L>^t,u2wa7iLP7pHQ3))(硆!+ϸ?ճ5o*Սt嬨LAWesss?0+)y'uߩ֗)RuL|}rI䱩&i]oz;'knFH"b{S}+M"{IqQr)c,.JK'#:m ۜpam+y` .H)  )mQDSR|p~IgkJq^P8/eәW)ZcHK?L$~J$TKs0=yƠR j^t,yQ1J^AG )DkXvk_ h.$Z $0 w,'fB;'%OE]fZmi8&}= ٻGyz7OAIMC9z{ƣs<ک]0o<ϾCl эQ˲qVl-ΊshY8k:(2H0 ApK@p$75/}Ow@zx>n7s?1b zH\gwg5;>lc? l7V~f%Cؘq(~zW~q;g;BCQP½;0 7"p(ƓPF0(Zu{xk`ΏV;¹pa. l )'H(9#JAz L@MPv 0,in(;u 5`70C%c{p40Ԗώd0;O0lՂa(0 ǔBPq?*;@eP J[tpʘYP5@Er2TLSB+P?$uT݊ Jݥt AG?f==;}upHr Ig]$/Pށ /0jFO:TLN<>z)_9<+)oy ;(fGy{ t\)R d!o yYbPdt#cP٬C)QTP@ݨ12TQ=9*!V+Dz;APHG=i]P;D-ٌf!h]QhD(A[T^8HW5u[@ռ|QJ^T7HkT).SKU*S9oè F T.F-h뷨,F}!j 偧(ޝCag!_2 ٛdN {TԶ ԟH^}Br TB%e_ |&; |^&%/?#ٖ<)ܯț ;E(.}lXpq'g[A~p ;Wyw]ߟ0T%[Q~G9r(,\{-r$OHLD"&C7 Ns& :("@ڵ#EQz=6D$w8D>!_iH61KEUmB/13PBnȯ^FK4(TP D٨@s}p݃JU˥(@q(f1 P8}@+Ug(̐O|cSܘ=""[/%}3o(U ՝dQ̏'K`DDtvBOW96/;ߟyeWR6 /GR1r^?B5(ߏq(k+Q1~l^S8҅ߩD`KPT׈x*˴@hJys*\nAS^;N{#>HzBryv Ug$MpVR.@9kϢB*ޢ`W =) R].!IH$B=H]o 12^Ȫm䑈 Y8PbR4ri(7D~;T #B^3DTI㇡B (G9m JGPY:Ok3QC=KxvţGa?E(MDLGS=)b0ҍϑ"6Y"{YXD!2tAHFr8 ;L! *f UT,b$ FRa|K$z_1d:MkD.@rVdd]$+! ~_$7Ab<acH8!`dpH@"KrAz҈H5C~# >R3H~ L+4ۂ#Q5D% {v"HG*ĞX!ݯ/B=Rf8"W%έDR$М?W8tZdKF(td~3˝E]܉+QߌUdi4u7uwQ||W-݇CDp(iA}f2!ll ҷE |q6בpR-%&H6@:#PG*ATEkDمY(&04CC( _jW(_?U: .]ā3G4]tg2f8*ӷSy[pEas'Qߍe.ɡ@Q1/HlB6 aQ-Xj{*Q>FutM#vvC3J +sE 8H"ZnZD!"d|&tD%t.֣h Bs>Z9F(3IVvLC>貨g61G>rՂo x;yyk/WML[Dَb8#9^$vƂ댠g#qa{ ^kE܋y ߶ț~An7Z/ s &N]AW/SGw(/HD껒(5DuJp~TC+jw\x/*N&;/D<'̡lS5/lzS}(e}=Dّ N$j;Q[ԵH^ hNYi :=fu΋kyΕx:L-޵Y<އgTrAyEs<u(b};%q, 6ot G|I%3'oJ^z.y-;?UIGNpr'QSrֺ׻ܥlBVt&z#wG3 1+N"n<v&v1v-Hbb= N\K!ߡFEFicb DE]y蒝DYN1>;r۾[jiEDپ=Cސc 9E B%ԃ),Lp$xT-&H '>A(}N{dTPK&#K@'A 㟰kVk_a.1'>xǶ{7~kf㙻^lQx5 }L8: GKqQi(ݱ0)p-˸$hp)|˪}yz7.q9p׎q\4ƥmpn18͏b/|{q >q[ja[Mmv;np WZm -qՎŭn` nM n0qqkEl n[= 5 g[zGp=_<{1'pMMY3z5sT뒶6kYk^Xk_Mey\qшXf8\b%qPs *//Y} v8>8_*Ysu-.]Obk%o,5n.6/ uq  nېոz7ö<6!q󣳸4YD-yZ[rȏSpsSn΍{=!7sg  nLh͍]71ܰF;nvML8LO8vZY.n7Z:D3w}]#B<<ΆGyG<.#_{8q5GD\ k"N[d~A3ꌻܗ}y{~ w7^v1ixX}#by6wYYsrn?5xhYc6ف`|Cou>~*\$Go߾:p ' \N`kBpYA`a$hI౛ZL`YIR[kANH`J*OCfTv&"^'peg u%l)o!@rF(!P2^&G *YNuխ$c- ṕ*!J+0a=;k ?Z+CSԆܔc XA3zX?ݝp/5|/۵ mex;</mVx|sT<"+p_#rfqѸ\J8|z܈| S]>\}ݸbxY<Oq`3.q$E8S3_d 8qi~v9M mݤ^ؾ^bhl^:a=V` ܺox< XEXt],ZbL'w̳1,Cb~av1߶ }C03`&`v{.f0F\ 3c5Se%vĴ L09I˟b| Qb,xe7^ -b|xX[ 9Ib5N{xb|Ƣ3*k&İ{:W: t:f䔈qRW^srn=9z[ߠ9'L8i6_rD,ޯe:?:h;qˑo q?9fuCqS3o'9/b8b Ep} yqk 6`3Ushc-!wwa.ÑQpνQ8V}a,W;:7 kϱ 8vt"q|l 'rb2N\ PqNT\-NLC91|/'Yqy}|.^{2crlPճ@!:,Gg3_?tD 9:?s(1oЩw^̛Κ蘖s:n+{u:Fg1tf]Gg8$7s>x>l rʑ[9"#T. ke_v+G\pXſІ^A~sN901U_5γi,Ԗ_r`\]9YmR[ G-ʥcٷ9~@\#{N~ĉt-G) =iDvdU95s |֢1g.1{~1(և1Ƈ`ܻ7F*FIQ4 f`(0ë1t^( {cPA/ a7 xaP% |a)NDpp\6d'CG6z6Bo Ϳѽ!t?k G]}9ģB(BѳFNnɒaƩ'cyècݘ4aLT 0KT S9ڄ{L=tBL;%&Nľ#&{Wbr>&wbbT¶a*&ScWMd[/I10 1z#Mu1ݘ/d(`l{?Yc#/ \Ee殖a:E G0_ X 8sg0_bdL X"0S 6X _ZzX+qf?lflvtu_Ns탱ҭUG;BV9wJ-ʣXout+Za31Qx1+'ޢz5x|)g xסey c𼡃g@-V}b~ Ϥ<%x³h^g7V5/ZRu KxۅG)FKd&?⹡^'#<57jW@=}lSڟZwů~]>[6] u_}a_GOu7|G+doM5~bD<c &0/A6w; Cig!tmuPDZJ7aoI$/$$"$ڟ׉KLݟ"^ŝ+e)Gogh)\#+I,OĎ@k8".%.'}HG9xmcz֏_$ !4,JI;I|S⧋oeqׇ緝8mBܘu!k3zs[B7b\tbg3l%13n&f]813q1pW׏ݦя~]^Ntt{ڎkӈrIԞKDYEu!D}I/UمjNܽ;ɧ2 zDlnyBe#b qˢ #{-ĿJ$\M“3$|A>$@X %8>Wk> ~']m~;‚鄶'gju1J#x9G#빛\W ϝ !ȯG6JTEn_߁jȿn&}&h6_ޗϯ̺AM3 ɏ.㇑w?Vw"e7zR"x٭?/)7$MґddRQ̩Bq#r06mC#=UPecBUX.UvP5T_ԧFѺ^yu/u󺤈ׇn#^wLMu?7}Jޛn)w͹ûUxY̛{x=͠"|Y޼ɡ_o&5MNZGxEMn-5B7usOe)D]r4ɷQ/B9v$9oV%㢐%@~Un PL!u;lj) SP,LzYכ>Eތ=cJdeJVQ$()LI'%Em(+T/JߢtBKJ;;J陕R灔F4OSHn$QH\ ߐtFB|{}G*0MP6;蚍f)r#ȟ5Ac+rE:}CU3d}lwdݎ#f /~Cz6RW Gr!yHZP݃82T|ȡ"IHZ#IEjYG'd[G1PX;-㿢>u24ơV104< GS&0'w چ|vѶ4@z"M*V"CS 5h]'}X@eTn2̙ KU7UQTvjaOҺQ]6,:Muש|qWjGϧp ޏ=KmFj9S;|SK_qJjjD_vzTY *O#yv9Qlڢu{=T~V֡< E (=/ !ȑT#9"~b芹c$)Hz#IC> $TWPfr졨s/fnE#l=m—:ͨnC9r>R[锆e1myf&wP5C39To Oލ,*(Cʲ/Tz0哛ZP<h~*&uGIt'P.ۆbkt S~ZC==< T/W\wy"oxLEs@Ri( h=vre4?]VUЮdMEf'PGDk3}Cuv*n̢0J3v(IPF.LDv3Y{]\|$mRqZKK#?J%#(!"0fHDj3{G|9|l~iHr }id/D<-4!$wE ER%b AY?XUⷨ7߮!׻䓎"JiUw쵨[C]@fYSH/F=O56A(ul4>X!l@~˶2QD]-@Զ^; USIb>궓Q}{.0rv&ACA^I,ЪSYCoW&UWRy@Feui4CP?}Mf+*.@ems×nFyE ڣ("PE>JyQ%{'X!+5wFH`C9Bk9u xo7/&G}%sm*c{%|& ;]DqEe /F ukE.N't  Nd&MKk+ʑbShsyKckosQB^Z y6ػE(~GѶCPtxmPZl1eM7zi^ Y G҈,jZdj_Q7 Q5C_+"ܜj$THGߤwsyHCoR)f.Cx?2_(nG"&Ю9ʀejX`v |P 'Cqd(oE4x{2P!rr(ο)>*A44;8 (ڱPw~T`c`4ZIU=+Q6'W"U]TLՕQP_Tg5A)h[P'֠~&;r0E]/@sTƣW_QW|Tc_ ueEj}!P E^rv;(tQ^BIԟ~Pe@X!yBc}GT6Fefh FKeQrv{WQ>vou;Z{EP/q}S'KAK.$J(tAse3(Du$nDvYryD JcF;h"ݯ ^12TAehk@s#Fd!A[ұDD;\b=ꮖ l?&A]$8Eu4W:5BMO9P= A/". qTIM1ԾAԎLV:5TSWם_2ĈĿmZ$8`)j*=QQy!g,xGQ(ξ-lgNт[&MC뻸Zxz}:;&>ByG񂛭%x߼j掣*3%h+$"Nw#2B Ζ!kąF@Er?fo_#^@x7.(?)4$ Y'zTXRq>b! u+gg{>jjgVX 1hEa%bc34O?6uNT6YTzCTeQCeG-&@e"jbi'zu(=inaˤ%mB! jDBH\;퐸J s^7KN% P)wD=mdoX=ٜy(F!bBFXjR/sWR% ~tyy僉FNWRϋC]y6/Qxaܕȩ͋dXLF%GScxs%)Ѓ[fu=(k7}[<ّ<#.\DI )@]^0CP/m)_ W;>c8JOXǮ<*gG^Rm8E%FeGn#8?x7%.~^z(x/x5`1M_|Cƽ뻜~p7nupwV[tsQqw--qMZzקJ\}jKp׽pݲ׷_[(\5EU.a˺/8Wv9q>ru8/yg`$~WqḄ2quZkt$n#pڌۻO&]3<q9s7xm<k͓\׋_xty>+;^੹W<gx yAtsY9K {xd4.nJWrvnK6FEnVn;qkbxtxRxzkx5蕈JīvnDn> x-g >&ia}|<6\=NJA$S{WToHt`.AO ^Ifc',yL],]NWxGHLB$'ҴS#˜~MORBz! 9LsB MKpɋ])&&?$88?`@#bF=5AGTiJb]?Z2![Ӆ4'4PAN^8'G rNz^ ^KMNB>N&JOn$(.?tM`Z6_1^1 # ,G."'G<-sp;!!ȃT9f%8[Ek˱6ŞtƠoG8fwxsN q8Q=eѵzbt'z[ 6C/1ms̃u8-Z}7;BV !WP'Ox#ԷSsjNj9cwquz/gw%-|Fzz]Ԡw8sE гwF& [uM G@O`F^DWэ=qtf''YN}ˉ 8fo8޽5y㝿?|slJtesFc\~Qۏs[ܷX}Ȟٹ#8 G}ѱ=7.V6t_,ENIIN臾Wk ` 2n`F,FC1'b80>XQ&`5>ql̜S0t/XōHSXl0-̕*oH12Lwa,_ecv\y y5'>oi8#Ƅb?LN4)n~i^Ǥs^{1 r.FsL0C c?><^AX1"1pЎ80Ն| 5 Cו^mt?FaTu0ܶ^;Y| ̏¢q.wat5Iwթ4.| խX[kv:XUXV~2~XZw,typˑ+Xf*k"nXEXLJN+z]4X?x,䏱tہ%V>lqZ?3aUaiN_lc#釉i;.o$l['csl;/)v lccvdzo~P7~^xžKbwv;-}Pwwc*YؖVJ\glǾ /}VvA拃G>8, at]a]]q+84qC84j\kc^#v_a7 v7bmv3u[S݌]ؾVQ*t`>e?B6W`|/"a3+m.|nvCgne8{=?~ ui]=aKbKRlbmPo}=ì 8l!8N-ѣN]qm5q3l~]Y, \9rޡ/srkZ˅oO8Q\jzKN\c\s+f=/p1\[õ\{rh!opn͍;Q{r3|'Γlfi4eN\:36C٢oAx;!5=<5s Ox֭}>^R{Q'>۷(w_|C}߇ ] ǻ` [3DOox&>/'8~|g3t">7>Ul|;a.2=]1UܚwT ޣGsGQr:$?v𸄀7# x/- s+_N2S>l+L>8i# Nq AAt@B< 'o|.aWFث |8{HD*grknVmnWVrgw#8^fD6$K!ц2vYkN-%f19"V\ܢٜ&NO뉟:ė? $6kO$摘A}5;t)IHSCƚ.INҷ{%9''$s yK;%I|Dΐ>SNłI {|w9FZ~9s;n?⹜{É|ظfĆ'6ы[=([b,l9Jb$f]6ׯSئ]K3-J\yHܩ}ӤG6ďF&_4f"Ag< )I=Zm+Hjٟ$e$IIԧޤ.*:I>aIxxU?"f[ %w ' }~΄mCvn#a/#\ |݋}^B7[?vaC k) ӷ"ь r^'t')~-BX†ZPa= M_G٫ tDÖ*7`FnEф^k&m ]ZSbϳWZ'#߷9a+;au I؉B?3JXB1a/ve4avI˄E}!yjrу ڙW;X*|zz DdfY݉<;V>[{qwn[Ow΁y-%GV>"jjWmmGt ] MTqz41N_( ִ%[-p0V`)%IX:[GIlJ$s$C!ssI鳍mHqLc&)摲)!HJ9,t"*)IّKi$]"y̖$ɛ֋$nJb/ŹH9Ę:$Ij?xFbY$'wx|=~$OR$͜DA||bq~?$>#e>RZzs#izݕt{ "m2 3!dUl&tBγ䊞8wY3aRUM$?xo/pt pRX5Fy0<ݵ]p0. yq zv{ļ{RhNam.KսOT΢'F=Omlj]vP7j u'Y of3ogfk>>Oo~CC|zçʟU7x?>Vc|Xgo;"x}DM ݌{wy;j-uEާ>ūKyjNWӅyMM~Tw*/GІ*H#exN)sQEx9(7iMBeeS7T'iL唯T奡$4Zn뵨BѨJ6\c"+//QDs"Mo  _\_f1&(=Bq96}#>3YQ{G(zFq*{uxlLxmʥ 63("޹|طR^Kg4=(N@q-q(ՑWGZQ,P4P!9ߓb=Cq6 )xh&ŭ>-(BCb.֗Bp _QQҎ1AIdÑ*wb-h&T>@BʫTXx]Z֛Js#Fs,A-IEmC4v݀vl+arrWԪ# "Q/7jDdEz~EXIymXp_@Ҫ ITiHBrwҞfH|_E|33"oG!=WC-n-Q?rZ"t@\b)s#5cd~[ņ!g;ȥ !?z (ΡrCPvB*]Z}(Gk *]U(ߎBh% (Ǣ)b\늉WV#b^&(r`3S|T& ycDByq2;P~Av"VDmB;>hw|^,>T4jr-;R7 ڿFG|*o|jD7eWQ׋wB9Tk;OvR1JTG`wQWY\yU ǥNAe eEI(V94oVAiBi X oOQL^bPPBᙇ"~Pا"/J(n4hrʥQ|ų/Jn( 8te".Q^>NX: [ϜDN̴E#d i-wQAu,WfM QM?ժ T'Q-jO*˿lGU{=P]ꐰ?16oJPh"Bz3KQ[LB}6d*?#LT=FDEsק , (IE+CO>RA {.DS y%RHqOWKE>oh\l wR*A{R` ;zS4ڊH=oP_wNW Zw-Ys?XYz5ai(E)X dՠ GPnvw48K>hD/5;* T1,8TjEoLܤ򀨿G}|"<P=,3TR]kT?IMT)=fmh]6S֣=g/P7N<4g$A۫ȿ'6h5Пh֠9 HTWj_n^lmu3C*'-Ds\ԄT]b-u[9W&ݨQScCMGEP+OJUT>PVq #jZ)' @k)<  dQyZ,֢&aW8Ae*Px.yݍE~tw9P[X]/Z-UCہz ߟun'h#8JhF:D _r|OTWPʗw!|Z#UTO거?" ;5z5f¾ż }#8bZ CxոPg55}쩎58"C#ʩYV(Pl%5Q]gDu Dg< oΈZᢗSu(->T}Jeӂ-cG( h:3^ #CD 34:sT/l@ЁhS~pM5X yHYT oDw>)jN?QsL*Юy4W*ry$uvQw;5"fݢSwͫA5p3ʑP57ʉQV -gD=}Eocd6(Fi'zFBYsW /Wv-mگA DԩQ \+W\GᯰY/2U槨|B#E?OMH: މv.v~@47 <\ģQG4 E~M[ohzfG8+LXSjQQPpz37K# CvҕH]N +liNd]?i4aTTw|¸?9%jd"]|yG9l=ZpHš"&zC?RuT=b]3*+>xisK?6ӕy"9R< } %owvmDOԳilsx\ic$ɭ2SP9))D qt'8)MH:I:J2|]%Iz9d$1'=!YH컝Hj҃uIu|hqMyClR#bwDT^bji w]k{rw7w'+K,DԀ܉IӸ=\íjnEXpkI"DFd}DakÉG!;" +>Հ YؗPP`B#'zЭ#CHmBzlAp&(dAG4@|M z?s߆gM7o(zOůX|/w,|g; JE?z ox-X^ge/]^w~0 sO2k<Y}<[6x8q Z1o3Fex^ijh<<(O 6w![Y2nGpZpmD n=bB[r#<8H<>sr<=A]ڙ#tvë=ޛV]2 ^ٛOB>, aN)^6|%J|S h= k|RI9J|t?e~,,T2ǻ…xKﳉx{7; ޲l4xޗ_wD_z]=1.w6_Mxw~׷ ʇeWɎxx'˄x}tKh ^ϧm}Gx0뱰^QZ/x9uz^;kH/<`v3<'y9|-l(/xcx5j׺Yx{h: %/9žM|nclԑxW{yg=, /x-«<>|9Nxԉ)R|[{3-o=~}s_y~ςߍo'f%E Ǒz?Cv\Ϗ|Ʒ8s`&koZ} z VOA@v# * y@`f"L.A9.$8!-b@HڰPu kB"?N| j9a٫ +K>ᣜ 3 JCa&7;<04.v>k s7$KJX^aM$L3y'Vq ~Jغӄ9A]_]Z#ŖZ ]I.Ehf&4c ԛfoG7/XBxha%rz3PӗθLȇ$7t{'Tك =З10fju%.T,'!RKB#E @ȥ݄liOHDGA{[jLrw3OW H>|pxʹ3υxČţ>UҿvƭW׸9⼤7/F'nL+9kKwsZW22Ξ^۹+\0-Bޜpsg8׶gΤ}ٜ̾8ixcAoqUo¡nq8`b~ {؛v~k9K ϰ ͱ_9`н}طq VbWeb'.vw>cwZagXݱx؍IĮl769+vn#lGvNvJCluxn&؎흩ޒb{5]~y2NXgz~ŪV`ղ;nu޲-X² _a6sg0k7,2f0}]M1{%&19`q07oqra<%?1><csH%w:vXc7G8*֎cƂ-d¸YF1JQD0FB1Ǩl.FCad`@5a2 bo ]`4\A?A[Gs*%Sro'˕LI֜rm}z+Г9`;'Uҟ"1#Oyuh+L7Ea5 ;1kO4Kg},.z+;9Ǔ_¦v,Kͱ"r.EئBa7L-ƨ96`6Wb 5~hi!gNwrNy9_m8}DlX c|(.;!XXd[,`^y'{ogr[^¼^&fo1+KL*֘ϼE=`/ v^.eXu*k˟ַSCWlEb}M鍝qvk]b± [[3lccmnhGc7 v7`mv=:aeŶJ`Bwf5kؚa-)>mvS`:8L5ZK5v_Ż"OLUTprlqԻ0{wNsqz#á)q8ǡx!p4>>8Hq=_q緧p OiBs}8.lB~;3RBuBtj[8[PT-:{SQ1}C-Jq7i.qΜ)T9gNrØ39{$:sέ续C( .񌋗'q}.-˥TusY\.Sqeq8rƀp5j/^3põ7qs;7#r9g)׸ո:b n<-"f/ڄ{*>q1=2 7xER`6]%m_w'෱-~ouUp#=m ]_/hoTafg_<~\ zoM܂tϹ |2;_ǿ~g7B_m_WW/;%F9>>3'heWҥ&3gӘL'xMC>&;܏dџ S1q,;~fFȲY$5 UB^\V9˛?C "gY Ls!ník؆ns!w7N*K'j *V6Dޞϟr;w|sCmgMcyZE?! :/IxA{8N$}MҪ$}%/&HNO<׏IPNJ3\;BJMRbImFja6@j#l&j2iSIT_)%p R!Y݈dY ]H^B49I]o.Hď?I,KbwXDHn#1'RH A v r/`qğoEIwYMܿ5O|sBNs}ȚIOB8Q$L_ osz~"ito$x#>$%+ɋ_lُ֤tH#E)H]Jͤw"-ĝo_L0ү_d4LdX*k9:̩J2'M%MtMd$q7dr&sU2ȚMԉdoIʙ^]gd'5r#ǹm2S-ɽrq]K\";؈m?kC#7rn$ٿFmяlډ,d $t0W^XUK I?EtRD'ƒt %)rbU}ۜhlr;Ӄ[~uyshǷp$aׇ:NJ!D%O~Ʉx\#WBܞPEH! ɿG4Dw??z֐{kG  !ßgH%|t7xAu&k[ḅgmB֏yӉ|Ldl.[\~vIċD!A)HF]K"OD9*ƬGDGDX%OExDG­F? _nJ1%mw{Gx$4£7DmFİD@ĎD,#b DyE]"\%" 5D <-t%↟(ANĝDK$vl@Tsq^܋: <9Dw@%%XM5\]%lF<#Z!6*O'q/E/6&> T$!q|5%IZ<$I|)H[/0ԉ IaA-17mH[J%M!mXsѤu'y iI3WI8"}RMHY"uIƀ'Hn_H&t\ Kl&N$OO'L"źS2R&?&)z؁- HlM IHƉ'7y6[*GoR9oDGny]tOwm`jk ku~KP>?)ЅbŃQ;E(:~ )j+k(|,EGgR4(?&LCC|6R$[Dѷoҧxuy`RBÝ f* R3(6f  |Ik#aY=Ov [lN0Pka 45tK*&" yٙىx VMļ1o+&ad9l0g{̹#9Asz 1/h}Üsps|a#I\]ps=,0,OļI1byWa^y̫y<̓0jJ`'c fkomÜ]%ì/r?1psZ17pM¼c1a<~;1rmfc c#$ F1\'k?31CŒ5b3d`F1xv3W#-nEZPnjlxHC`)Pc0昱q?)cvpw\&̫̯cg/Ҙ*5s  ?b#Xrي|?ނڢX6v2 !5d`C ߥ ݆Xzp)`'y,^Q{a5sԜǚ9o/֬˖c&xj&6 Uf6;䭃zJ" [O7#a[{iˎƎ y"ۅG_ QA|9~`s3J᧔A} ~2oc{Mv78щ_L˳o(ﮏ^QLos<+_-+ïSg}?ǦMؕT] x'Gs|wD-/C~;zb)`ۦ"99 C.J.Xz5\4qGfp/Nqju\S\TG20.rE 5h{@?Qř褿0$LU|X8\+Tr`y~, KgBsȏ aYX\V rɠ*ȁPs%)k=,}6 9,_R ˭QL2,=, KE߃BO?ro,+aQ3XZ?ſ@ya BnPز C@^g+Y 'rG ?'| ( E`۰_ %C MA>5ky;= 5 Wr '4{Q?,+_|M0ϮޅF`w0G|/~=@l (Y02l?2@̷̲'`<fN93j`w6Lf3y f5*ڂW 2'Af=1YaL,]aU)̒0S7R%0)L+a*yUfmYafhd6̰}  K^]AV-^'C1 xoeȦ}ٟ@L;B [ ?΂f`'Ila^m+_? y`Ẋ A.px5 ca ;1dv,p~& 0v6H5(Ց F*v`0Fr$$@bg{sn/MwSln#w+=@s ]9އ;7zg @O_`=[e`4 0>.]`"zL_i0 {VyXx"iOd 0x" K{w`z$X)OJO|־ւ9 6GldU_u(].Z@, 6` Y/ze d}9Oe'b o\yX8EuSHp^n.:\O׾xp]JL\[x>O?gܙm< cxhI ^^~0xOGUs"xZFU ^ s|,[1|o1e9)sߥQ,*pF 1/%!p`>ڗ57  prd 7.FM~ vA ; p A@k큀0W#? ^{_ _+/B@*BE 8sA5 J0:xo}?b|?awGcI=nZ xfwe=ޯρwm~(N3>cx3|Ou7-޹JwxT xM6$qm"N3[o *[g[~>xi^/_-^?s^̷Nxt/늇Ƈ)?>}e:x?opIK=c32韾㷀όW3Jo>1!x[J}ɕGx(%x׸j\z>:?H1>'ƃϖ.3x?Ykt1avl7N3Z|3>t=< >N'|_9||G{ Ũzӏ?_uǿZ,w9ׯ~\ V߇G2Vj/=x_a?/f}!B. `>|?7g* _2C%Ŭ̿? TF%oL/zcW5]Yeo@(}b=0#WoEs,&7d1 FkÁC zEs- o,V++xߨ79l?r)^වɶ}/\z&mcv;t1gm~90_W&VfS*_Nr vYFl3y6arl~f ~{#]w?ڒvX.ֱ|{e(j`X!(7 Cp/!Kl< %x8^,f'Ŝ?1ؔnpx <;x NG3vJBzB!~x„ l61zANz@S?! 19\"&ZOe ZeD3]b&@ևs l%CLI,x B{} bBl.~ e[Ykd[xM ^^ /@xYq ^+_BtC"8`S7 -yxU+ q=+!^i?xO?~ >A4 {$N ,Hh>x1+/BNHS yH> ɏB HwB.H iP 2 '$_:R1Rg)@6HԩHRK{ 1H- Rw@bHR!w6)e)rR֗AH) Ŝ8)i|-u>nR'C꒭@\s^BʟHH{c!a3d@bH, ɐ˃NHgwьŐ2hq9y@i@LJ3GBƃq|2kNg !CK,y!MR Hy+ )Gͪ![H bH yO0$km%<&$oՀW YnĠWT >U F^fZ bC >1bD!fCmD b@Y+!:> =BMc 1^sj!D@~>yWL/녗 n~WxV9_[| B| @B5H\/AK$> G kc Hd{!f@7H m' 6! Ҏ]$y+2'M5B$d^L0<BMHNtv~J. 5 }"H?o\tnҽ m ]{/ckg!]҇o9i A~j'I TnB=>d}RZ t~=&, sY2@֖u d, Ȫl -;' ECvsȮ:C== +V2u`-d~,* YFue~ dCx= { !Baq dsQ[!cf d\Y 4Xր u:d?ք8ȑ9#R !>rA%;_4B[*VA,|."!o7\< |7(hZ cGAa]RP}yP,hC(bV/HCWP1B0[# E/Rq$9(Zxx [~AQr7Pb(jKP+ׄP1 .Ca)( YGB<](\oC#(J"3P0#?{<bu( 󏰱PT?P$ k1ޝPxw7n{& c6.P0_:05A=🭁P.ʴNlRb %5P*ʺ@q=TAP*T>.~H@_ T(PJ-ǡ@0;o^CNbdiAzd _}$!jdׁG mbHzB" / ! [lB$X8BDHXI!qnHLLa9@R2H:],qHm' 9ۇjCwӁUnL9<yZ 2L+i̴e"d~w̿ K|dq4o+̼!+1 s q1d. ),͐P Ҵ w E8$H+ !m*$=I!ۭz05`\Q&H98#0I_fq %㻽 `/n.fGz`s`̎+i90UY&`?]a ]g0~ I~!hɀ}`p0 VIN00.M8i0 ƯL&-0RɁBxVzNn2&+lZM`cxlƽk0V;B+X <G`9gXnw*?`7{ йw898)>FA)6=[$ֵ`-V/hif:Lb60ySM۰{gcpՙNހAp+#p=l|68RWؚlQ ko`*`o`쥏]#+B;`PvD mple`'z lZ7-ۤu&c<[`>[`ǞSC6_l)6jmk8v">wԙMttm.)J`l%u uXn[`Vy;It.!eR VFeNέ`ya$XF,E `qh&X(S&AxOa!X u[r/XjS-`m2XEwXu`9,r7Xǿ <0 #ܦ̧lR;lA0[f˂LAu0)`:q>|_&%4I IB0)&q`W&# 7 j8UہQ0JF)2`8HHѩD0:.K:%0ZXF hW0Z| 2qS4˃]`G㑺`ȱ%YN` 7qL3w0|L3&7L谼X ߪIrX<,x `,.E5X=,lxl 3\mV `t  9lS C9\ g`]lOB,v|a}֊X{~pX:>+2)3WC!CH=) yfHu _![1UDa^]u%D&BV7 "OBu!D]d;   i$(BW-@j2Cx q)Hػ](F5Da!tO@ A_fC"cر|})੮ M\]nN#s\64%)cQ`` I]+t. Ah^ 1T8,7"aQXضo;g`St6;jX_Ab<(O{LO⌖Zr{ ¹ʹ#]7-!zKϸ󻣸//pD/-z9ݜ_wD]1nK 7u,p7+i'7*7NjX)ۢGS^,U՞UuU7:ʛ""4PUVy'Tgϟ*+2NU#UgxNuSue I ;U':Tul8GU%Wh:B:шg"rPK;?Dxud^1:+ޢq~#'MczE^=W+N#ԩ(Cws:uzo-yxu~EQZU6<4l.o+.x}xo-7tAFka7y͝AQwN?Ӈ5xuL^5 xMZZ$YxԱ3O(qiެY ^3KA4 r@ ]inB&he;fw4/ sBV@턞AEyzJX^tF9|gߒ//d{V c'0DaP. ~ CF;bs'>0ڗ1dgbEW Eu|>>_ C?#WYD|}mgOaȗD AMV(a`zbZ D{w^ߢ+X?zB֗O;vәyr}7:Ţx;ڧBhcm{a0D3, /sbEB{BQզU\t TNk@po}`xqa=}>rŽwX& 1uzwwq?zミx:Cch6^J?>' ͍OC4#җN4/CC>ij7ϢN4&/_I\X&Ǣɇj4YĢM'v#3s43Mۦ+K'ơy4ͮBJ|2 ' h͓uh"%4M2@ӣht'&hہ ?r?_~o]nnyو }q[v wL݉[psW w܃;UpGeeq_\W}9xpUQC ?}x@Oz<(GtᡝxDœ̮r< >O ëxE6^/-bMq^ cҎx9o$^C/d4ފw^K`|4[~43 .a&4.DC542 FƠ{4@4:6+AS>z?B 4nnEh3V ѵ]ZMV݌[+BHDaQ݂O>c>]p.}OޫcUwӈ$.p[YOnƛPG[wCP:;Eat@{|4  Q }@ih?,/'u(O]B|<ya5:6tNfl?:Y y5t\.imtE72tuYOoAr!z:]:EfK%|z".*Y^.9r=Ԧ̎T^;}#;3Y-9[`y0X5M8y:!/.GaoF;c4ct<#;1JNXĸ0z$&v`ۘ8  b-$#1L Ǥs17LǤ{K12Fa17]0im:&7Ƥs1X&6`RLWw#k`5& &atF|Iaq϶cr6LqWcO&aT;21 _/w˭Q)QƘ[;Sc;`t&`Adafr +au1 1l x_|/\I|yVǰcn >׏P /O09M '1} F\oi sZWco] ϣi1 s0 . gy.ߋD1* c5 ݃aGOba + 0)_C V/Cu98 ]D͙hs9hNj|^g9BN3}T雋>Wޠ|!z-qg>z{A=2RcLt1z| ѣ=ږGC z<2CwGkto+xA_z=ư7\=ueKiz9Go|CC# zޏmt^BC:zY6mGI}Y%ى^Vׄm(z^[Ƀ>V3Ysat= so=TZНwt{,d6Yr=Bϭ:z&rp=71?e!~{{\мeq=V'n-E ]R4Zi.PkZ&0GBko qVڌ1]h8zwⓎh)y@WhkՎG`DА \$3Ty24kFn4)A{Njآ{j9{i<5倇OA~#4ݸ3? w qלDW6*][ k&5S}znN-پn;.<˶bl=^8 ?n=4mX3֨N9ίnS^8>ͷB׮,G \zmFwt9k)t6ع ױ~j&0t-O dW Dq4校$9[q,Π/\dQ*؍~ /zkΠW%>{ѻ!dE 욂΄LkϹ!-6c))xE01f 0F?tƨu{;FJ (| #bc1m Q&omgua?ځa~^|#oM1<˿"d~ >׹?0 C/`4 uPO|ah.|?3gaHu YV!,B7b2n`|ae+ 1Xa1^"vԷa N} WA<\ԭDIM>6Fhot,,FϣrwGcA? @Pj w$@/),V,: Cy}vu~I2sFattFkt>w]cXGs5kt7A>PvIlGdF}>4vF 蟖c1p 4 T@QXt $z?w,C'; yF(,,bujx g6svAcCmA;v'4CljzK}<gmzlơ;ʢ$t >iz@O ʌ[F[VG;{vt,Z].zX/=}29/sЋsDOW#zA1t1zs~zI#辐]+5Q"#2kV`N A tkzG p CO;0Ā}*~L>W>=Fւ пK=`D;c) nV zs &ÃcĚa#wby-{abvUc-V_70}=F]{cFbTS3SST1 &aLh 91GM4\LzЌ1Xwa>Lz?n'bbaTL .Dn;&0Nل *0q+cߋ&ıQKz'c|F SaoLbYX nF301&>͘x_:0y|?&5brXL)0%cƔ0UZSLÄҘaiN~ ; Ô)|i~c1\RmHR֘3Wai$YifbQ30n4$16_9zy=Z/SwbjfjÜwm Ϳ1Ws/cvf `t f?ĜQ0QqOfs`n^3ZyưD,k5aZSL!FL<蚆4Ҫh`ީaVr̺3R`敵j0~l;ғJ$K)$۾HlQfdnŒ'H 0s9fƬW1$1g~-ǜlHw]lԊ'1$\1s7f. 1dzY'=&K0'sOWb];9F]0;UcaQ27s{|1Gvsfۇ9+cN2̝#1Mc/aV<=mc3&`'vօ|gΘv"`z/L51E=?ƌ03z&f=oŬn~: sɘS]FcUi:wd1(J90w82柭9޾3?YK/"L0t:(|B!, X^ m7ayW,Z< 0Oy>0o'J-ҕwc9S&9cb-L0Z= L3+#3u0bOP~?Va͏}J.c$bٓ愹߱J;cQH) "2{ȯ9%XK`'n,j,LqXxjebX|9/U_X>cySVX|Qꃂ7J: V+#lVYa={ꊂ$6/Uٿy{ہ(-:(+obEm%VpX~Y˭ͱBʕV^QJ=X܅Xq. 楢`{+ DO `6cE,҈v,>˖aS], XZrKϫ#d,.Kk5~/V C~<˟yMו) X𒇅[aJ,Lw&)XT ވ`C15n"f5cց̡쏙[vbm lU;vi Soᣦ`|MMF v:x/3 C ||FHZH@L_mEנ3֠W4oY X!?KFcA4V`3-Lڑ koGo˹#~;^?ͼg[8~77,>{7)إ׆c2OQK7ҽYj)V⻖8Qj, Kf< 0 {? ^找'u'oE4Ы瘼N,dx2W#wb;'`Q2,G~X=ł0_ ƠD7nA tƧ_]7 ؙ[aPK0_,೻[1X=*Mu [0;qru7sq*,c34>Zv&c8,>OںyX `eZL3&X_7?U)?٣o2֍}&_-&⟫&K#qp|4-܇oPK_b)~{'GbWŮY,~a}vƸ=P *0# uTec&cyD Os%> v#U,׃jU0sx 8j?bY] ,@Ir705!C>~2(:ڡ*w,%Z%kg^^_{+̜ zERGmƭ=2YzIL_~~y+aa?`oE)?_ğ Vo2w  x!Qgvyt=OalOQ_#!{^GgaB1`gW&4( `o5oغ0'ӣGt7̮AsF0 1 |6 #c;1ʒgy)|mn4sHku A0 zlQJ3ᶫH7al0Kl8ƾè 7Vc9vUEycT|7S ;xn6 {P8#6z_NL~a}'v 7yBdcWJѡz4ж:ć}cߣ>>u909;~bև݅hㅎr|>}]&>~&yP7yۡ=R{y*ijFWFJ㍼'1ۉ'e|'0R%_`h|%SnS`;nF_F?Rœ'\'n7b{&OL-OG'ї'^7bMވHVsIFZF$9Duxc/D,቞btkD 牚|ZD/^^ho\-oӹxb?ybW_?+y|I24 ]=x'O$'6<'OxkP!5_ } yBn3yBV} I ׊y"#yL≉ Bl O{rsyc7$y=9Ϛ7rbO'x'oD(ވ$Cfo't'>'R3H_."=}'zC'xBߙw-p),-o'[ ')E84o)׭T7LQq@  o}]kþn ށ}W}e6o/W}}b_os>t^Rހ^?qؓ=DZgD }o7=g&uሟbXZ ^ÿ36_a''vo ] ˄'oa^byZ /l;U-vǺ=%lo~5 zjO&ۉ*櫯5~Ư9 +/oFV??o'Gz~y||_%VǧGE~T݅]aהт]?^Gaazr?52?|n?/|7/;T3 ;ۻ:|7& Ix`g-)c3s$Wq9vOΕS;̰W 6ŷss?|`9??lķyS1I|:ۣe#z,v{X#mpʁ7RZg(RqF71YLW_ ۙt4eߍ?;&îna_e~]Zֶ8D{߆#8^z 3DbN nNS1 _1r0c`0k-<ش_܏gáڂ"5FnĈ-Z\;}tw_7؂^C>ٯDYqaz8wg/z?7@ =o+6sŀk_1p SC¤X4#apcf;4Ƭg1[&gkV7֜[0w{毚 `A6]ļw0?v~;b>39&i\09LScj[fHc̻wsb2]X8R w }kYg912fRwqMu|.f<#1V:f{?lXeK) o,&>yw KڗbY as N)<b* (Yծj(eZXK~VXq "T<’X*ϱ IJ4 rFX֍͝X6VJIX˕cXzXa5rW`ZM'\=,C+v}5&7@X{PQ05PSDԝ*(ljXE*Cm*eXo"EJ.)iLSlӉ4%͙'Bsԍi4;fih4xflZ8ɖ~=d BIVd#-fiR㸈fb4w-ݾKoӂOig%ZhF ³hay:-̴Ew#i1ySi[$7ޏ4tHL? y'!K{V|R.)lj&RP@ p_xRO H)̡%$=iD+ѲGh_ZaO˦ЊkrZՓF+FѪB^W/ZmcR:<L ki>Mchp;ƧntOi,I\Qt 4^ψ'Faek MeBZ_Ci)o"xڬ[Jj>0O't 9FGJL_4yI-&itfpsWUxyIݧK%atFNM]bH{SZOI!ٿ.iݥtz8/{rJqҚu#͹ܬA:]VD'.I_ӾJ:~jcw9Jiw=/:]S tf:KT_`H׽:}| iOz3Z%^hr!]]D.n"#ܼtuE]vE2HnwˑΜ({7Lx>I_ɐЭJ;EB{؟Fw[d>.?av{GI!Nz{8w2h={JՐtC$ɤ{?z  _QH:`: "t9:}LW[He ]>?&չtcY:?q#F75lҡ/DžIЃBo2~p#CCd*z,d4I zr*ttfuI'җE; -'wHiM/~:;NE :9:i:•tw]Ê7=:S[A:r-zѡotxj%rOl 9_Yth ޣKGb.1]:%1=Jǔ7Q::8>f4]@Gӱp!:Iqm?MOco0t5:>M;tb8|F;iO?C~g+:}:{s2i]{Kgݢs3}x>i1;qBjtN;]Ir— :iӅHEW2N7&!J:W2utm4i)хB:?s:i-'BEդN׋rW59{g:QT@Ӟ|zms#;e mmL;ڼݎB =t.> 3#.ҕ;N=-_niΣvWk.&ЙH[8eim|b*K`:5NE!tlf+T ttG,AgF*=t-]N:S:S@ڻ=y es4iWaZ<% rBZ8NB+.U ^eΣvVcBI/byю.$GO?:\ܲy8 W}r An2<1y<#K ) sHägGR7ΐ^S TaOՒ9TqJ+­X@NɔR_tϔ3oSo̎JӣT!CՎ(S%2}#r8JxjOoDIC.T\N% gPZgʿaEc)V3JijEuYT!FTEu|54u&{&$?>-O.RW/u 3Gӥ+}H]ͶBFKѻeGzHkQ[z?S7vpz[,Do|Iר] Xj U7b z;6`jzڄORwwj3ߖTCoPj:G5?Bo[ͩOo'*ӛSjO޸:D\5:P{[jF:yÜ:V9QuYJ;P>lϦά5n{u^Ѻ:Nl>c󦷕۩Mښuv:5jΡfjzNR[ j N-姨/FQ^F 11Ǒ^)wȀ ӫy jYGƏًԸϋR"jx^Ue75QÎԐG T.O :5*jXkE]bTu~Oz%N5ATӽjՅnT;Pݴ?TPO/Rm}J+w8ՊwSM]=:jv-J5T+H5eTM55TUYh URv.O*}OU.HU VIJCT\%A] O%A MIk! ~@T%1ua$p&c$8 z*R>ʿI =V$mbϬeUT`O @SIsIgI"b<𓪔vR2GULU}T1}Wdcۨ ͩj61$xx$"|Y4DV>TQH+L\@r=U8LJaTy*J;qz*5R\<*Lʙ"*U8 +TQ*t;UT3ϊT U_ Tq*QJvSٜ*7TR-~*}zTmEsTCe+,[N?Si/*J${7_ћJVawߨ?}5DrbgKk+Rď`+;+&6KQɏ**ZN%ʕ~_BJڴ>&9ė#F _;@(dkĘ\7OǨ;LoNc-x/rOTm R1KJޮa= U&C 9G׵TD%똍SI%42[SIU 0Ʀ0Ge?"{ jljow^C&ւ̧=ot֔=%~1{įf|uDt;T暳wewIϟ+L'v1*2;2y3ode> 6vvtWqɣOcc|KXn"~>ms0?1{1jA ӣmu sx9іl;4{zWD"r)ot˼rpLF!FfzfXg?FtƗɔ|';WIgz2o\g*@ctY*uK!TjOԟQ*MYe޿[ٙ ґLnk^c"Q{JyT"OO:-[!*[ lCۅlcXXb- T6&:ʆQHogdQV*ʖ܋ʥRS,QzRT M zB>_< <|HSyB*@%+72^E,r#*gS^O嵬tv5U,fX*Q*T!ǣT•IQSX_)cuh?Uϣ;br.ULwlx=r*f{T1&G4*[bdmGRQs/Ds/TrTOK=)SR;5TG%5&G?g{/Ub [gkژγfm Uj)#`lf!y2bE:&B6&Zʃ:f6OfqkYݞ3{R>yz9UB*:nZMG?P +fgjQeU/'nh0aU$xL  AO_H; . ǥ3$HdX.Ia'Y]W !vO= Ϡ*kTOURո7T5ـ Sut*|U*T[Q kISy2b8OPՠ霤ZD=j}]T%5Tقj-VjWRT:Z y JQ"ErT+N0rZ'֚~]RhLZT{ʑ]N'Q^g>j7194R1f{Op G;n\ MHuZGl"f9~13T…QT0Ֆ3:Tj &E`2 Gu˯STGu k2Ty-r:>i:/T խL-T7[?TI'S:?KW.SBIۑ?2ZTkjRmZ>fb:VcLzRG$Qx2\5+؜L׆9s@u Th$[gDuLKTG?t&յ~Todjz TK>AkS[ gFuUT׶WQ?T/vgSݛgTV ks|wyPa>5d=jԡMϨ>B)R} C{~/?d8oD;R=o36T1dEvQ5kP UGM~{saob*q:d68fE`H[6Q~f}~-+Meϩ~yTd_e{bgOF_-}a6x 8{GuTk]l>{afͧrtf,ַB2Η+O[o^Twsl~-]e>ꮥS.܋(=,3?:{T7ob-;; =۽vJ1b.,/R, aQU_{MQmTfj=YJMUeTuL $0C[d V9` PU?QeG>AS A PUQ obx\ d8n;RN6p4[7u5}=6sj `8aé8WDR~t$iI`2oOPX)VSՌ:`*S1|Q;R4[X`EUɿ*vQUZIUQ dS^VY`$*.02Vz6Չ gy\jo/!T|5Y^{IuT;W?T}ӫ*5Bza]^j|h5,@j#NWؚ^oW}z 5韢&RjI}7?5R{ϟl#F͇S:+jj)2z5w̢}ٺkQs 5H-"p$QK5zS/jnQYjѣֵ+p*Qk*M{Z:H RԦZm>Qۜjm΢֏avt{U큧4$3y !8ɦIFP""1"ET^H@G D@ @̜dR(Qi^୵>Oa>kf$/4gZXhAkqZV&@lN-'{[-2׮ЪTmBh[@^ZZ"Z&XhMhCSyhC[VZI ٵZМ-+@kZE-o`\_v]bCiЎA }xڌM6W'$H'ZNh_ch߮xm\hBMvտK1i@rZ ֝|JtPCkrr/rDnFQM9;~rmGn ww_ <'}.dޅx&֍$m Iס۴"/m胋;z_?zSN #3D}8Qz5W__fu;Bo2W<!5B['ґ_w:MAxkxWx4w x{~7͌J]N;xgI(7zAlxwe; xxVxnv/ o؏&]}vPp EAoZF8EUP{B!(\+ a9(p{ ?JDQHkn鈢P*(XŽ@ё`DW n +=ǐuM~.zíTwMuZ?ʋ.YjNwO#54=8-58vtj+vB~eT0:ُ|Y% *.W@ˉAs{3TB̈TDo F{DGyMAY#="^!>?ͳ^Ghij=ڃq}G8gtF4#Z<Y64B̒҈:1+ tDQF @hG#6up!^Txt#YƍG qIuB>l%>a1@R߳~8D/7Qs!m0#NȋF}DtڈjFv1QL9Z>k ¾ۅ9[saE;6"p޻y@g' Z\T\{iS[Sՙ{\K=(e+e/2pq*ד|z^K#dXLǽ7ٛF2Ϲl1yHۥV9$٦n3@쐲F{IrJ8vjFj1ZU/U.1RC$NGŋ(P|<˫Il d>}1QqfzSe/ rr|: H3cj@Lͤ]RΫ^gI~W6*'~_ueYſW&+yJz(_,"^jlQx5$pw~sնq|=")[ᙆyq|WRWx.3۔o L/lW}6]g~akDD[E5DUo뎨W=P1_a>'*d^OGJƝyHa8+*ϔ By–Hw[?E0 ?^WXvsx8'V*:K8蓯|gJP!yڇkExW=½(o=m}̣iy[ez^E3JK)3 J~ɫA{-'jo{%|Re KӈWV 2M9^Ѵ'sbĻyxne ?3e?ǎs ^L^\LIL߰,1= 7:c%ZsWzmtxfW|zT+:)'_"`Ec|:ߔxxUu`}Z_ }J'L˼,WU7b˻/W|:=iM֣DAa2ؔF[stբ̿LAe}^TV{T)YY}`c>S:NK+ ռT=`s9z s%GլM7css?XgCf/z2{'C^Ջ/Vsg!$DFv%bl潾{|,S4م(|Ǟ$|"Ͻ:}ps=sϹ}_ڣȮ"&9"Z| =Mw( ?']Ӛ>S5;01d;}9q{$I>::>€@9 j'+bjq|- o>/ r6x8pX4 <~6?_t^vq#HSj8#˵ͮ,ěqh:*(CϗՑYpiH>JYN~WIǁƐc\gˁ>Z^h?+]?pYAտ/d#~>l~\{ _|nZ#P6wZ_">HײɎӮP4ڸ9H/.}#kGOOm6rxw)xp8w_ҡ3X~ud4K-Hr'睯k7-Vop|Øw _ؐ޵Egx$KLGCw+ٯrrs9,C]} K5kH@ާŽ OO֒b SOcWg{U .>-Ӵǜs?)b.bG߶ Y"JM4Hwj#_#ـl4$Dk)%3 B9ƶY鼻||:Kڹ{rIt6sn':rOyO>oYRyߝo>/0#SN]$pt^ɝw:yxaROPND9&IQƭ\!xyM#ǧJy%GA+Q|P<k*M[C:]$<[Xrמp2}.;RmN!<_ElGItL|<['?ǩF(Gק9~Q?F{|(QHIRl! O)BCߠxHD6r܇8h7jܿ {}lӊۤ{^Mo{^q8Ct_Lw>N<1ڸX,8wV}}7+s N\O|w h}:}D'}GBwM#4/;c K/T} HZm/>xN3qPOs)C}7/?ƞw'ػ?AOخS& (v-1cIAw?׬'SLqR_v#;6i61/r:|3?!ZBv 3Z\.WgPpO̝2Ymd :c=}McxK;<Q+b9=/?ԐZ#toZ1.:ž9%2ē}oЛ߬ow/n/p']˿UHռQWP_ȿμ .7GODG}<+<<<<<<<<<<<૿)=nGF#jNC-дވ[ &o@p@D=iM9 htHGqi6vBU#T2G}y[p5m!VX# Y2hYD] )BEpQm/7C\E`L|) }Z Ԗ}YJ]z\!!_?4z G>k GE/2.wB ݸPm{ m`w_G`VWA3bMO"-hn H\^õsE{|+DϮRyμȕ;d.CmDT@wwDjBqD.@EDCxeoFPA9,FdDBGW {T#\s7"K24G:޲ Bc PBCtJ4`2 \1ৡNoc| 0<+y7Ad5 ZZֵdGM+jA]v7E.k FBV< }z5h.C$Pclʰ(υn!@#ۡ<5OG@f;;A9+{Cyگz!j Pt^02>8'Aؾy C9a'6b,~C~^0轷@&Pτ=jd$?=x}}]0=CPvԆR%jBilB[O'Ai8KخFw6ևrS@-.j P}%D `sl V qzzhiD ~|ڵw/ "lZ|Y^z2wCʓ9P7v*lWd\YآU6̜:i5gZ5cRKɃֹal sRk#N)dS჈1֖lXTU ''= O0Zit P1[Z / CӞ@"f&Fzqo\krC#x@hͿz0Z<GG!_ k0u&^VX!~%av}kg`-h s0rƷv,(ҫJm ] /1 C|}k?g\F%0"_lD9<saMWa=00b-Jj̀ZV)0Gke@{,(lS `U`zE|Sh]J'%e97󡵨7׃8d>_Ʊ^俵6>eʯЪK`6y@Yg7 ?&K^TBlmIX{z?bjXYr>:`> $7f"wXaxRޮ ҟvl;0WYrwX= s]iLygazRS+:NG! ~+EpĮV5S#F##Alװ&=+ϲbM̦>K[C_FgO LiT?1&F+[z5A'zXg_(0jg,YEз hs[5Δgq vuJH- #tw+k؋U`]ab*Ɗ0G-UՀ7=EXu-3!F0{'U75ZCP_"nsY+\na}ߎ6{2 ORC7ܺ\{lok[x:NԄu!.X7LBp1[8Pƍz>S0/-FW!>"շ!u7b #*bM!q!oS},U>5vuoeNg1uja%F;vIe75橏 ێA+0_DOAd< G{zXmxQSWs[q:.d c⼣@".a|_cXl(20.M>oBU-i,ʥJP? 'ѧ; gנ8ԅ[3ڴٙu=+޿7ko19Xe2s'<g5BFb}/0睃 ΃{8#r~7}c8{9[ @tD'" 1$XЄ 1b}9碟鮮.}F%=A_oK^wJ|I1>閈1 ς_Ky(s\<>g7!^SwIb n^E=xUx/h$=~+ցGLXAB+_ύ$'_M2)mు|zy)׺:q6xQb 85 zmkc{!{~#xġjSxݘcA{=}Ygz?|W!v |֓O(lSU%P#\w)GV-xX^G. ^S6x< ~M [D'Lxqn/ E8&)UfHxL}C0T{ ^qP6|Rd>8I.o ;,18 8D!-D.䵯rQ>h#gV F;w3ۃ=6X=xפ}] [da;E @s6Sr" >]ǁϕP0{|ay,Pﰿy3%$k.<CAQϕj{nseޅv,+xVLlܿ{{w+j: :Ă& s@5>>{i|඄R4k^Xɫ Lo.'g Vo~G_?3═_J\zlLqՆu'|WL}j(zo5\ּji6 a;x*-e=yH3{:-z]eD/ꀡHܩU >$ϻC`hId0|g/%m <ޙ$)f"d2 <~?%ӽxܲW1[O@!<:L2=o"@ Vv൓|J"]M`?XUQ f3<Pԑx#[SWx.n^=K>5%3wWD!%ZxMzN趰H>nlWd{4 0r1~1oœpA艷KxQQXS[^C_幊g"?lEÄF|C3qVKG 1oD = [m=D;i'*6`K~`nCPռ6#b ΏctHFn딃nS>?(xlq1,Z~Qs+ .ܯ,;D ˕?E^-| puBw"oϷEL}|WމE!O vM CJ- ٿokUw%~'%p&G_KۗS\Ģv@Ϩ:E;]Z<'7ϵ}E7 _#< D-QҷsVbĎkzཧnEق [Qůu*F{z}B0}F)#\y0*Wj"GH% m:%Q,n-(f,痁gYŞ~\gc)I> NEp 'x2}c#qO:~xˋs}5H\g@q% [;6ޫl#WUeWf;w_<5aH'| cI-jǚGKJm][xp.Yr%}'q#z xdw"\  zWzߜW7i_">g[&@p!zMCȓy,p ^7}xtUZK->'e``0Tc%@ Zk^Enygc^yVsϾA9o QD1y=lܺ>}*9XGk3nW4";9g ?[| zgPv*xu|^qSQG:ev;zlk;|ެgu6p{GJ.:<>MG1Z_=xM&MȔMC}Xǀ|yy\USE0pK1/\ˀOH *ۙ-\Om >)2~NWC>N1lx ^(P|͏o`eudק|0 Gwsyyqe8w>vzp \.C MǷ%Y_KT m0uF;\VD-HC׶L'ك_ӓ0s- WCZW qR>ED\\< SY3r *rYϡ9݉m,+^OiJ̓C=gDοx{$&/@AsDYUz}%>w,jǃ.?V9 `2HĵR#?C%-xWSÛdeݧ$&ooNSn~}QS<ݯש~Uq QcڼKZ^{З~!bKmc~ %~?H{6'x$( "KZx@R}^&`kzTׁBQj^{Ps7bϞ ^.jB_zȚ"*9)^vL^*)uVϕD1"8&d7} <&}QgOĶص-f~LĠ |k+j`ԠRW .g؍QJG}8HmW~:$O!QߙEgNcڨ<~N|.WpSj&tVQ[q^!=1g1xk*oL9yn(|u%<"JobB?yDCY}tpm7Z`hoC73e1L=$E۟'EL/my-תlpM̢:.b0W>o¿- ?/r^ {w$i1E }'#_x`H6k5Fy*97o3OƋzlkv͉?=8/ϗWjz+]]w%ؐCOw3kaS *597K0~f ~l"^=~*'b[!>s7R^3츽!~r*JDbnM{|_*~sk#?vރ \ӬrnQ{'^1M x &EuזDl(SrkCXzI &aQ%G_OrH_&P[8rƿaxs$BnaK#=g(vЦo x-GQ>.  W~+Sܐ6ڭSEuS~B s<Òҧ!#:ה}Pd%K9Owy;A-]n CN 3$OPϕ%|?|5cޏJ)Fy]b)5Cgg՘+Lsq阨X&zLjlzU?2`\z}/k/?˳Q\QNS5|ŷQςsA_t3x٩öKzR;m-~/ƿ Z}Џo<]x4~ʼn}DG|'5x~,PDqIe⻉wU7s %~ɵ)sfVrA-~,j#sLzpmv YT<6t(ǿpL;zӹǰw/~6q;}MQy.x=׊S7oo]|wP^uLpoTQo_@{`p;Q ۫>=0ACJ} Ux'(onj^WmA; jH{V- `U:6+{y uArj@Ѭ^]ng`ew݇R`5XtK!5.,X͠}7@wؔ 9D۵`5t߀ tkO=pkj'A׮!X) ViKsJrˡ+7t'k.7:}/z n5Y{F5`e~ƂF{N^ @p9lJA(s6؜:a Xh#|πUAi`QdXlB$4"9l:P3ky~- `yXh ֋XļM*1n6,'?jO+;kv[/:7>t[q#`X=BB46o blX]~`Ro6})wBV eXDƁu:`?U7fc]0_:~`eK{GDYG=$z .}?d3Xܽٛ','ꆀA`}5xCf#`,ڔ`zb#0lkxE`\>Y>eXYW.3ٯ2dۀR;v VۆuX-Bo x2t ;+1 lʿK2t>[X X~'ڗ]P;Bf_wm0/ 6+~lBH}_J*m-X-jJ4كҹn`3.l}h@Zr)X,kSX~%3MUjH2Xl=K~X'{G\1,~XT|+|5vWA3} 9eSzW,X7{fro^.1 ;+̺{5eoj 3ѝL()P`>lBUWZ~`ӺvcVK:*8TqFu߾`XAX6 ,K.Og.zR0nK}vuN"x.M* :"`Xme![uK:)wIN{b낻x_(`I&X턮d=qB-VeZbgzLPD)[RGP?tKmk*J|&l#I^kеo6ujCiVY&l+spfJ:u ܿqc?2$X|( =s`q%j!+A7YS߂7Y/7u.,GUQ˖熁u! V[{ m5旰+F۷#貺 y&h4[i'ln9W(6ӶF;m-sNT9?|<`= ك&l _PpdKz{=NK§X$4CELAwh5lź[eggO&,o/Tb_ǂō`|֌`@]@Nq/Cݲ!`:Jɞ[-.JQyh1Xd%V݄U-~6Uu!魟"7V |$ݛ}Oڿ[SsP7+٤PpK0?CESxFacC{ +)5[,@GBͳk~E^%+c-k'W(Q?["&vF7l1R˺C:t|-t/d9 ݶLPsEl[wM9L͂'מu`o$qo&e  5 Kh:Mq᣹=(OO: sZ>6=EBmE\MCW%,0"z!^I_"bK:x)χ=jŝ"_*X'X2c˩E ows~ ֛ VAk }(ɂF`S3X~fןY`)(_o Yrƀ̀B3A[AA2\s?qFfn ٲݠH=Mo;)罡`ݐ/t5/C?#ԃͬ[ws6 /tXOrb┢?[GyuQhW \#b|{ɖֶENaQZ|.#z(MZ rfފ;̫m~)y=_(w8+׀Hm P;ϕ ?c6λ"~b_VWUMtXy,{V`VX lN?~Pr]E[$$:ܟR>d5`l#Jfaìȏ&_yld݅ɢVt`=t^Ľ|q#uiʧquqXvMaSwZO;|Nj^Agw ?cf6<9J} Di"j"/ωXV"#DQuY_܄"ka(~vͺ^Ď<aM˓kQL|Q)EEG*tq;\rkQJg\0<7k*ruID<~+YOgx= BODw(M^szL2+ tuqsĽ+UdgZjYݕDnU戨q'bRfsy@ YH'rH!sj*y$qeJF^4X$_D=ǯuJ]C9puCEa3EHqU++*2=tيQ\7֍v*|:l7~礿kEƯrEm|+W(y<XSզu &Y7J:,lM*P^ }8#<煵M#opy)P, l&6Sr⟕3 [֡zrDHl6TRxRwDV֓:[Ut 'XW'=%jE&um 0&I*3[w9_yJh.VmK?AR!rwø =ߧKɀ@Pzs(%,jAMEFU)xJ{z6_(+2,_`*,^B~ˏi/5ro/:OO- Pp{ {5?\= YD{zǓ==.bfAm&?ݯ>{r[WݓKYa,k:ժ:${ҞݝNNvZgvVkv'q39Ӧ9Sbd}zm\n{ef>`y[gF[[3[}[dvvE&yv"nzͮj͂Xxy)e_dK,3reZgXfAJ۳P݈n,jn|n n%ɋ(]ҝ]y]]X]_]ǮOî̮YŮjή7>Ʈa׾kkk;kk+3صٵ5욇?H0صFv_aWFS/ͭդjFvu~v+]Ϯ2ovUUϮbWbW,dWLdWٕnʢJPvm2,ٕٕؕf7ٕ3,[qxe*2f9,sco ,õ'˘XetejY},}>h2K܄ga߰Yz"ҧyһa#Y, h%K<ҫXz1rxv[vVAv$v|vSUv5 ||6"|;’br`v92].ڳz?v<<<ƼVucgџ];]q]nz];.dkSy_f \j \higߗ?ج|t}89i99s}7;qC^~|{k8n 9|N?[,r;,BE:J,9^ѯ.,ͥw}Udi z7eXچJ)K;ݘ}e,]UnG:ubɳ5>+{LvyةD!ײ崥=]~QؿtJ,aޚ$޳ҺS@ KO],}xoKOvgFa]J]YFM` XFB,c ѯp2b,cuq?cמ;_+7+ժ+ +=++.vʔg,P]Y6]Iг+β+G+]u.gZj59GV|3wNgWYOW*1|j{[vvM^ʮgkص)صZG~k/γ%ڳvAW!gJ ]?]ϴQ|FS v n$FPvuvdv7q)4nMee.}Xf{,sB%IZ2wFS2?bO`vBf2oa7[Wd77泛O+q?J`*ezs[ݚVP_cLAn)];]r]o)m8ݶn+nznGb aAY=}1 NݹNNc~vg"vWovk3;>݉ew2;;6;_F5Cϱc ]%nDv7; k\cwWewbw,kƲ:`Y=ڰ~,5ˊs̲|gYCXG,koeŲd,{N=^6޳Wvoevgv#sd{5h-kWnv߿|?DzEI~oxoQoߏb*d.SzAb:v*sS˱?xaa;v_hFn`78cЭ,|(u }[QحXӏq0.l9\cfˆaLr<{|6-7g$L Cn0}+& Ne>~3a [Ԇk` A`df=~;ߪ@+L#K0dQ>l?aһ0xzڟIP*Sқ” bh6퇰0$H@&-˻´yaw`8|~Rf=`Ѓ2 ~փߗY5Yk_co4Aˁ}cX2^]v€ 0.]#:°x$D'jAl)Ės@h!*D6XU`=~4;A:&i Cc`G&; &¬f0k:W vĔ> C' i,`a@|`Q_ {`^07%̽|8`I0/K쁰?!dGi^,nؔo!dޜArUzTf.n A䡑y$D3_”5!n5C0p }7BO)'8L#9bN#HKD{aLy4<~kr=D 3s < XN2B0#BZyC$Bp0ٻw Q53`'Ĥ5O }8L_+D'\ |>SGBз7b .K/; P 30 T#o>fHhcX, 8y+]j,k iwIf@e$W<-a`vâC6 QB蘗[9ĭ >` o|}`b.VL3ˆ':f0|-#gAa0QG̊!Z?t fw80Vs=h6a,$CJ밶o;P1k5aCX,%0W-0\6,hI{9p9j<:A`f sm*%`U:W } 7Chm :aA0oX|6 s;uzUb,cs??0wv6,pO6CbLX94VvY+`_d2w! pH7] :D871f2!4U&@ϞPr=;tu(Ԩuz@}h [B؆P4h4~4O MʳJA!UPw~T 5RAEn@ pN*cQRc6TP=0ǟӚAGܗq TV Ah9wv1YL$mt$3gcRۘ&;ouM0f LD .}~c|vLއdƟ1ä1>2{r?Oe1! 83htI2&l$g>cB(ߘJtx'je=j&MwGc86,1i8L\hΑULg.@cD4f"qhG|mB19lX;S0%#h\u] bhJ$[eIb$K1q59&zRtcLXO2E&1!{ ͝Ķi&&wÄ1aPLp N`Bn^WĄ5 GLKr\H҈0-&~!;lV}U-~` 8&6yEtVđ_1bL: 0i ;VLXB{-#Z ynab/$bٓ0D~s?LI.T%90`B|<&„Y1>&LcBLY 3y6Lgn#|D|VВ*F'>D&|\:ґ2tHgT&{D}I|ۧlG[017Fadt8 'TxI^'\$j20qK7U{Ll}>pdgZo|[I6fϤGmV^#%I?󼠵BbCx.īt&{KXə;&FWģXe0y;1=d*D?Ec<= M!UĻ#1q_LXA>DwBh\nlO0d&}Ach{d)&?Ƃic`z$C_ tƍ? yO]L1VhM:'ل|AM4܂Ɵ6 1"0):Ť/C8Ikb}/ҵtFUd[yľtu0qoᘘNt!b)w0io}Läۣ1iWCH~ɳИMrw|s)zIB0)&&/Ibr@Lʡ/&-lVMy̘b4N}L6OĤGhJv`L>C'brHLpś`zLn]~br 9C \h &w}0/L,MR,פGxδ;f;&%۞E8ʞK1'߉l@ܡ%EaO$]lic1+ńIU0eLHkfc2ݲ1yC\ސxd)^`Gd7b1ٲ:/n EV ![SÔ~LiDz>&9I^7&&M*RwdcÔ]1l*4Σ =W?0%ؕǍ[p׸x.\:.{iEq]%qf.\21ĕ%+קpq=.4  ZuEb?pQ6.WqM0.6 }pC}e2 \:^p8fSpsο q\-Cqa;s %p^u72͡>ry༒qXs69Wpn ;/ιTD]9C8#Ιsڌ9M=pNBq^cPq1T0( sJZAFz1nBމq#Obܸ6Tø1P}qa\gqGQ8{Ws*5qvWݩ'ΞH[ ΞTg ه8eu6K qs8&,Yn8vRmqcwOX?cc]Fcݮa;c%1t0vz _0f+YI1f) cFn"F_+bLvF?n08#FgK1j-FȜU2FU fa"F.wGS#|Hy0#fc-#{T61u,670b`Hۀ0b|%#0"aoFuF,V#fLj4_gV8a{ '^L>'/19 { ÛܤM)Ǧbxc`Y; N'RW`(;cx?F'1; :?04m?.6jeCsFaX/N.K/`hp -C( 92CNMv1G' y!a6=ۇ!m`HDLpǐc0L1Y >g㌹=1X,wu`vK⌽E0;1h 0/Qo9ΰ3VMmAAϿv0ȼ&V15r^A5a/ &`J |/(obʀi?dѿwoutk3 (=\ɟEc1u> 8D3xLE^À1`dw (`@V0ǜ@OF:Yck l䋁.adD 10;`4p5?A114Q3[H8c|\yA?c68:@fp4 :0pG \Xg<؂3V 1ȳ .Ae`Pxjnۈ#0 =65U0ʏK/d 4b'ڇcJdjbp\e6H3*pƸKtUA;cОAA9t0^ *DOPx2dg5ZaP5X3Ӈ` |쇁c1hXE \n`P>jAaxg0^臁˄<쾍Ĭa 1#:oZ%11 +Gb`0\]1T= ~݇A~_``j+ h0b~ [/Vc@m迭| aI6;c@O1cMo 83GM^1Y8}+@oѿ'$w0['zmOHB5e1!$KYezӾ[I&``wpl1x燴ֈ]0 /c`|]•7]@ ߸ͬF4`@)|~5bHQ7 CF0x ޾ f͙1xYxbpDy g|(绡4%PLCm!}#0dc+s&!0CkcWR0 ߍ!Vbm ؈!K`#쟂!faH8:U#l?bH/'[t<l M3;_b%?˖_ ٟx1mI*a+ҙ*1xzt 59a@lcR = [ƀg1E XMV /z| pڵ8k5NoW n2y=qڶ8m N{vq4m8)65i6qjG bN+RiSmFqʴԪd8li`&}l/}߉E8.!N D?ڡ_7Ckj~W {qk{}<|Iv }B.؈{7^E__DO74<(EhȘIh }-Cзr ? 濁aIAÈ-h8 ?4Nc<Fch8}nCi e'#̗ R}VWDuvz9盢OStD_'B^>^aVBÞF2PFEC1Z;o*נO)pT>ѧJރw=1z_}>^D(@}k3zCizFGѻ':Fz-.^ޠwGPw^Q>=nFΨ/Qm71-P3=~[X3WsG \? Ƃ%fGI8z/֡Ǵqp(zl@ УvOxB_ УzyBckWK_c[E =F} =N ~xSוK6w z$F1=ڵ@Ut{ @mit_3b{wOMCwG^7nY-5Kѽ(@wk47\FyOAct쁮cmZ,F@յ5g[Pt[ E*m]t7?nJۉ.܈]mktY] ͦ\nWҞ^ csto5λݤ%6<R@D%M-%JBׯ4W=ԡ[}tsY^ݶN'zLts Cm[tk\jRpOs|-WYtO݉ni8t=]]BWOt-]K2e݀.[nK][t ] G2@?5etCᩇ.We]Otձ/ˣ?BWwt AO{d~EM'f'~(˻[ Ds"^GieV LFuѥt.;e!tɦ}GW:h ht]Ky4]Re tJE tƆc=:?.mbL36Bu8t9o.K:㤗pE!EcybtCmq@t.tˣ+|ystt;cSڢB\ ]ˀ]ZRx..mХat){]½e\tٳ]t.%:W-Dsr2:(γaqt)x2ৠRz.3Z˧bOyzctq4#y.NRt.ס䨢/:gECy|SwOggU/t)_G(Wi+xX ,uk?t>y$d :mQ7pRBt'^Gct7s`&N3'EI#p8>t[qTNY'96IpҒ\yBйtt]Axt] .ω"Zsڣ[#3 ?Evк#}}[6ٿ]ނnk$]kb3ݷC[/ǽly/@6z5zx2zLfѽwW1끞m*zHF6 A­{KF6{{޹>c2g YBC^hX_ 3~aP4DS}[D wS GЯ_a|S'72*m,'vNyi8kqS}r-:q!Nڭĩ8h={6mq>>N{ ,kdc(o^:@Wǜ`p [1pv_ʩ~Q:{%Аb@cMX g3&Q>PXHy@(o!uC0 Ϊ!a҆򉀥22C8 [Cw`ȴ)Lt !`&;4Cm17LЅ1i ]Cϔ71 k 1'ðs1XmaIv Zaٵ0̻1-a30ܼ&axnv8S^! .0ܿo/`x-ۃ1| tpfb83_AgT|8sV(άFQ94NqpA83B?g>3glpQ#FtǙ1z0|Sƈ0bU`DdaDR FDĈ}Z#a4w#ˆ0bacb1Fƈi}#1DF?120#bdZ9vFÿad`l{#%W `y+FƄc;UFUQ FQOu#FO1Z~z6ƨ=1.1zhoʩQwcTv&]F>Q&cTO ĨSW0J:61^["0*n0=hKdby FWѽcTH!:at3Saݞh`tuF S_Q/`ٝ]$`t=й3;Fk`tlom"FumQ1i< 1r4E1rF6.',1rA8{1bQ9~8F,qWb8#җcĞLEq#ycD/L9 "%<%'y,_Si=IK74ҡq{4G㓷dc;1iZ7;O`ҕe1yNL7#^b)5<0Ů; h)I1T9LI)?cJb\^./݊˷+{вb+=?y+npeո2W^m+߭U㪦q\5k聫nե$Zƕc2 _~c9WLY+B0eLY4W #0e/8S*0%q.]`gA0&7pe LWInw1)Z)?cʳNr*ل)j-0eL9 S/͙rS֜Ɣėg1LI8)'ap: SRL٭SvŔ#1L9FcJaʞDL9MYw.SNtvSV9` +)SÔݘj̭;D}7Û]uRR;<ÔƘEw)wY3f {]iwTcqjg^8\ǔ7;#d ]Cr1eWڞs]kyh RCO];h̶4ۢm-`[mѩ9E>}]̫=+?=+h|ps/txs[yMim :mmL-pbmؕGW"厮]Uw]`y/I0F=|N*.`qqx>iO*|&*MM[.ѼʸG|xGKIysTXUo*qOe»{qxG4 i"!9=c| iὀ[Uphx']6E]g{[Ay8)=k35W䕿t8ˇ>P9z׾H{R^|x|c|_gsY4Z;cmwuTZ(t *^w^?*UPpBg.yi2q3 gN]=+_q"ʼ&Cr9 Z4k2ɵF#oN9,;58iz8+J9+~w:?7Ю;_9>M68-'.>>Rq ~B!5=3 LQyMﵻs뵽59>Kql{N:y8~_O =V <=͵EM㹶'??wCqN7燦7|v6{Wfg8xB_}ͲU5~_my<<@qj2-l_<4^sMmEx|OAytpߧNWhq4k:G)p|_ N͜ڹ?cgw>!ww]1 v?*2~ܯkwɓ6Ѣ ⽩?D;_*N6J#aTw^f4:[٪U4B\/5l8Q <_铰F+#|hg_j~{sZdrxeO\5<9Iiti1;r|BYhw{&Ek5r7m3Csפ̋]?ζxi|a:b\nܗ{h9Mr-v4ij{i4w^%BëUmo-71Cíźs{&϶jjN{qÿxsamH9ߛ!I8Z Οyf_3YO~"65r!o?w h&|=͔& cjpZ#FRѻ9 Qk8!rB׼Ֆ7yNBr;$/yNe/ɛy4,~yqNӭq0+o_G̛Ϲ4_ݳ12m^4YSB}WaxYOA97=v_u9rqSi3-yN]/x1K˝ߢYP߳j8sw˟y.`(WK[tlQQ^54M8=OzNܽq \\qmL[}Mϑ;ti>֚MN֔͹_Zm^p Ty 7z'[ݔF'`O7y&H1m <[S=+sb^q`:\3?UyY5ه!h1+)mMΨ;{. 4Y?4>܄?v6>ңܤ1dҏ1=r[ye1y|ͽs)ٔy>\2,,#lNí+i6&o8zV?G)5s'oZq8mp=5:S< SátߵҩF/&^~m ES&C!)=wu Y;Λލ&;|_G6]GꞫ^Fqh1M;/e'Vi4klXw^#hkkJ{f!{Lқ+pލk`^;[b<מs!S^ڰRG>WVTN4z5>o{jc/rmm_Zx[O<vyܚS&ϵ&{ꩪkQ?g3c_4(i~`j5lv7n/h4'09:ܸ擉?PMͣS;6ھZNvS~s#7;F+[&aK5"?kMjx5>;~\ÛL>ij91b946 eF52#5w`?"70ы\;7Psܻ&wT) ?㿱u^20.x~ja.Mʜ5ʹx4R<ɽ2F91$-V3ߗ{3ѥk6&&{9q. rX۫95Լ|6Nߴϴ`CIn;*D=&g0ͥM[h§1y`kLhؑcnw\<}ǧw}䫭U[nmK5_bV[#StSZn-lku +19퀛c$fm<=}^qSEp9:&`3ꊖ;xz64g6˶163Vhݍs{ѺUG(89,8~uF.^MGӘ:Nϟ(V|é.Φ)`f_˟M[.VpmABS?gv^\pڈn .&m&{SL=Z,&hiCA}i/N}: ũ}5'qjԶQK桎ym#ߦ8:pAVMpmS U)*Z# >g8m~*|8+[MU>ؘQiÑd<\UP܎ ٩mI3V[Ko6Aƛ=RLU{;y ]*>9Z:\#ܣj}ZsjՔgFPkH:Ok;Q5cQXR 5ޅNtмd2?;ھ=n?g:hBvvy{ x T}i4ᅝrS> >R=&mTWzwK8c&|\cMF9{ۙ-9G>c>_>3HߦQI}Pjɦvp>,>o0#H}Pqqj@g+y>OÙaƛcy0|6 >WeksgT\]@%LgMo2Mj>YD죍* 1j}>j +븯{QnuA%n>^D]Lc3w4⓪Fnx-[?k[hCFc3ET|9&thk* ڳC4LΩZD-Й^k1*M Mz7u}Խ%kw*ȑv'Uuϵ^j+"ƗV)3WUέѡkNis49&c_d Ľ]29OP]T,nsy4V}.bgC{U\TPuǮԻF껶G3/ˋD{l\SگYu.S‡cBq긏:بlO3͒ /\ Z<דMmIIV6뮮yno6H]Y+(6H][>gbMyP|+Fqc#OQ)mO(WhK1m[R!ӆb6#Fx$Nj!tT;`[gWP[uC;<8ZP7٨ T4XSZZrPY=6>Yg6EOV玛d%nmIکϥ^wznFKqP[ҙYɸ?k'Yy)m:N2nY6yu-曣j\[wQP1aW7<$\FIOrкZݶ&hGmdAEOnMif9[Uw0 uju:B}ך&dU5w9&)\Md“Kyr(*w}\ycԱwyX*Nñ:U^mI3H We:Fth=JSķ j N}{ [Gx~; 3:ڍQ~gF;&kV}mQbNs=7T*49[:BoCšWz^=qcy:^Au/ u^/TBXt y|CFqÈ3s/;ߣ΍PΗΪ2rV3Nf3LJWMgrECnTmAmfo9͆LSAܻꗶK+ ٚcjjG7{d%v;[QܣDGrzw5=J= MΑܗ2vN_JNfN>Ns.NβS{zTԔfhnMZXRMmXsV66UKۙ{#)Jv ^&;ܯNDNibciBvQ[v+;@q^GvBv4SvYMvLv$;+;"\[ȎAdaEeNdG'׶ا+eǎdٲcQoKYkVppp,<>^vm.;xUVQd4!\v0e*ÔaNvNS~vKv_ԕV7 }7!gdZYCXMdmC ve~e;&Nv0Tc~ОmdSAHvleG|$L6Em[_h'.{.;N N=N k՗;'.Xh+;-+&;&(!]==zR?Dyv,Cר5*;uRhZ]-dyI}9;9Z3}־;h#ؠkm2[|)wro>wQ;~3@m#gxo* M'uM:V}Gq- ^K]~xӵy}o]JyPsi'{iT~ksWMgMR9YQGm[U4dH'~͋=pWM&iK&x/ɹ"? ^QC.Ԏ5>p=즴Uihs_hZg6uoޚ԰ }uEhṰUUpSÓ{Qqk罫9viwwOrmX9hrpPγqosk4Xm?h9cﻦ㚎h2M0IZ3aoZ~}h#*ds-zd+)v|k-=Ѿqk0}An4Vxu[-]`޻ߐk}4i~;3S~޵]:n7dRcʘ?f#C~oMzyN;wwu^.hjٶ~ZYf*TTu664S[.鰰/LlXgVYcY&Fï٪&vP1uO~s&#*/Lxj.іƇ>SarmK5[ټ &i>V_#WVmoN3?Rgᶯ_ѥcR;~9㏀ֵ5k_DiY[ m;+fG>[[b]^󋱕6=ְ\_o۩3׭&mmǾsǛ{l;8 |o8۶uŶMr۶o]]b=u7l%W37'(I|o]4`lm0o(gl_c!X{WA`8"}[zTI!OFZ1˶%-JoM~M `-4̐~|+SF30IxdҷgUirPwJ(}sGt&]̑~^rN>!}[J֔MgW>& xmysW|RvZg9{ G+Aүuפ_%I ו- }q&l(}ߔ%p[@*D^eToIbҗ{/å/!/>olو~{JrRNTc-;6~ffHśI_gcrΰ|FK߾|~'}kF$Zm=i+}Ul-eTpz* ؏>)'}qVGwYi@yG'2,Hf^!嫞!nT|çgһ=߄|iQVC[Cիһ;ϑ3-X]U"7ӺHo]ެ,.,i3VzU2&k]m7ARI[қƇ+<$rDrq94Cz"ߖ,=WY+-B>k*}p'{NzG+{|[zIi!Cnd4W%ގ>]n$}~!}vZ(}LzK9-}2!:+Lzugx[[[҇Wv'?Y_E6cihu^ =%H!rS}?wKN>%}:+d^mI]qm3p?GHٷnH$3E:˺Xk*Rv' YrS=E"Vҗ+k".rK;rm͠p{R~)Mگ3~|ZZRyvb zZHfof|qPnN@×S:,h8I[|w^رJ)da{O>$}E}2'r{=g=ZFҤWma;lLLO%'aOl+X a[b<\>gK|eWI\d^H߇ttMȠ`W Ƿec|q&zX,ߣ̼ 3Olm˗VY3K8f>"o8 c3YTk_.I,_y?߫#ӗUV_V뤿iKXIYR]Y>blbp:3WLM)]fvu3?)lu?Xf,ܶ0~d70+,̼neEsfYfVүZn]*l'J&HSę-2!F'f3OH-? ~Aa]v*.}(FSwcoqB!ܯ|z!K_Pd+;V< _<:_ӄҏ[5cH9_)S_+2+# <% 7%DϡYtRBRQV)++w;:xۂԳ|훬m+(+5#+x)+64aޏ5}5؞5ܳ555^D`4տ7)j.jbu SZ8*Ғ5fƚzeMűz:α:GjJGXaƥ~g a ְhd>'cM ZZxcoF}FƝ3X#1%j|br[&EveN]aC2)c>1)ew'7}:}(OdfQr k3(Zj::mX!X~}}}Jk&k=ZyD&kլ ksks}"kk5.~KVršƬ1f ]-Z[ưY_Ź84.Go6Z板džƯuIָk?5nݖر ]ʮH#K{+ JKD# e#h,KЈJ%_k41bo޻}x>{ܹs9̙CEQYӢOcj;協ca{])H>+)" (j;ר(ٞTIUT)B(Dʫ'& 4SkV=oKaR)n3 +IjDAzY&]qGG)bIsB$SR-9$ɫ%RjQU5nG!)44-,_I_荟IG*u4ͦP ReaRjf I!^(8ىgPH($~)t|b3?ΐ2T=RRI[&~嵤@ Rک) _@cC(葂Ձ4DžoR`0򗷢O7㮒/ɿG-oΡ9|ch&W+I)sk0{#e'yj$ޑZD ŧCGI$XR\mA)=I4QO's']ue%EӾ$/)Yu<'y(?[<ܿ=K|i)H"s;2y9J>ߓϰ'my.%ό 䩸M^nȫBIOTr?On"l+&.ɵjā\{sv29Wz&:ԓnrsnG-k?M.ZKlI%e49jGJAwr,jOԝSӊrxuN }"ǘ\j].erIqrHk0ڧ${.d3U5d?xTڗf$;jֲŬ0Y|YkQhoVxcj>YTβOWH<:ԛU%8pu'ZǤX,jl>5YYݕXGr+b,q&- p/V/|}ZfS:TM*Iv55t:)=_g XFN:QrNu\Pwr {g½^:ǽeGߵܓbk/ͷc6CaGq-m)jR]ssߎ9lʑ| D敱9U^dN%)x}3?㠩sas6mcnw\&cα+Y%3sw6 D`{X2Y8"dȁ)\ts֭8Edg^e=^,hF(Y+$c1gkk8֒g+؄,nLoǾ;Mms%Ɲe &bQL+G(W[(yYWr(a/t}`dK+@}<W!,~zBco~ao1&ø嘲/Ɣb$W0gM$,\rX# 7FO^L,wc7}hj 7 D,kC .`^R,ŒIX܀|,: }+Ӱhrv ?Cfz;ku!U 39@ڜX RڳMcr,PI[jdnJjm2jm ir*G@+oB>-u!6dWbUTNqXzf"Hۛ~Ho+`Cւg̙/!U-VΏYAYX3j R޳Λ͎k4QEfD.}04à*A Z([{5C_lh[A/y}al:'Q П@;96(hrY! E a !akB*-="! ;B8cwx p ν19gAtǠ= k@E[~:KҘ1>΄nWZU &Ø z?N̲sȏ?d,[`j &u[z讝} 03n0 (DS_4usދ|gȻ%w`n]~#{G &ĵv p?Ne$ >F`z 1w`t|{8L <U#o۽iF }^ȳ| P0*އ/qs?lC-Ża2T ,\r{C{|U n¹]^}Lu( LFq0y;vh ĸ!Yg hzt 8nxh2i6.a*X<翁=rJҐTh'|hʻ@h,+hvA; hB3Rm&b:oHy+2MwBkdM\o}Ro薨 W4e42 a8w^ vХE?߀/҃;f`"`czA0ga|,_ !Bz{w06w3C~w" 4׋" +"SkaX=Y3C9tA 6xÌGm߷&IwɩLjSgQ{mP8Dܣr u'ƦS!x L Y0rr6'/g5LӛBv|':;{qvb~)F\~9 ;X Y|CE´xB褃[<˞tB(кb56աpϾcǺߢ:]c,1XQ4FE=kDX" n(" JY`QDX (F;j޹yܙ3s3s,ǽIGNuF[BŔȎ^coj0^7(BjPoBAgt ȨPwG@UBw@|p?f(f9iӁ)o(+nZc=DŽ~ ?}. TQ.Xw oAoETo{@X ռnDTlWD yDyeCQAe-E"G4C'l(@LUCYe}eDǐ矀24'(>^`]"l(jGQOG駇v5D[Bn9t/:_ނi TBx b[FM(jq:Bɑ=pVC.kL)-k3avjHBXuq•&a >:Y81'#l[3B׶rⓣ4B.!~>Dž aZ4Qv"|b* )gH2hCnMMe!XtH:YRFShHkGDW Mᖨ0[Jc.__rTu@7)E#:G% (*_EaF}ү!'g9v*Akш+pŬ/Q9ʗ%(3bp, W[Q1 ˹ _i3кRVmqevBG4?níO<К탖hgoٌVh^NhGn~?痡|et\N][hA0EU 汨? KoԫkѠMtP[錺P7 !&;aXW C= /]QWS?zB]`CJ 3Q,AVnChԬ}h?sjKP~@} %KА=P{w8jj~꒗p䋦)P{˩J4[yTsxhNAjo/hjܐ͑RRTk{9MhFGI@X DroH>)\gR!Y$-zuٹ!$}[ӛ| a?"Q$l)AH wQ;Ӳqy/!;3"^L%qjSy脑'BCDF@dg>@dz 繐ٸU'9 |HBAN/ _񲛐pSy&wGAlMLl7[4+@j;lT-iڸ43Aj YӐߋ|a0gCV| 2\zs֜)Ro"m;#߀ /k0=!sE fP,JO7(\)QP~} *PZB)nj4!P9s|D5}Nk:!T璡ZʙK}uPNփ4@a AQ1V`zP%Av~!q,nܼe1|=9 y(w6S#4نr* ޥCz'S)!@6$RHR!id@&LHK0gp`(NL;$3jg&&RW˓|d@U{@zK]{P|ki0`X= %O}3!;Νr7;AطCޅ\+ؗ-}@.T@(*!+ԊޫX݇TAZ@*H=:i=IIvY ihȾ ٰ쓹 )Gy<$={qw5qR6GkՑUy Hv@\)Y =?S!7o$}HfBM$f>ę_B:^[M0L0L0L0L0L0 t̏!#ŠxYzYeY&ޛӈ.!^@VDտN&o'kOֽIu Fljˈ'dӚsdds@I@C7!9Lv=D%٥&j_I=ϊ8$:x%}Vw$BȾdNӸ4ccEӡKwf/!G%G>$ӳɱsȱOcɱ$$0Ò̩$0&ZKNxnFw-w" ̙K~sF2Z(F1Kxcx=olx=N++4#I!$A6$0{M6qד/H, ?<ӛ!AtL r+x7c)o8 =ȷpu'گکDD䴝ׅv6^L#NMFD)EWh`xKy%B}=`;4o%ʝX]CTww~kW%/C׈(m_Msyׂ~oPx]n=t%"ze=_SB{5`":dɿ[({_NsOs=k?,?SJu59g{`@>>gsQFDmF^٘l;/u--v~QZF&"/VEwE\ɐd$@.g\tqZ49zzum>qx~fB.elQ,s8fזqcw` YxeXq]ror2K][ǤЎ簿KWm\e^RJ~)UJ[1i[mi?.N:,EX̹=ooJlN- GJY2/2,O68CUwR_09G`R!v` 4nj\&n#$C~yo;uLLZwr^2{Na=/1o'6:j^]v#6nW,5_zTqzvzyrN'1bܷR#Kl] fU2jZ"_N3yJ ޞ-!82jy("< 3gkO!W\gmפrX`œzTk* t-&-%Ou}`vsؗkRCtザ~'R^#,coǺ54_^+L7z?ITۯk+K$]`Cy,\+1'VkV 2niqPB\V=ōr.W7ֹn7[ZJqAityiROëzQ19^n̶NYU3ggJ1Xpn(n]DVݨع9L/.vFfueP1kW49Rm\ҕ-4]ԷǴ\o'>ڜP8f/͘?|!se8Ye}dԜ['n cUӮ3I_KXkK+t3VH_3ZDuVO=;[eVS|N+rj5wgV貫囟m7'epr>\Y_eO:k_?9յ7Z,uZ>y/r尭s꪿.1y6x{9 3^5_I5iO>ix<\*c~KC}SK?V{&y9/$\c.s}.~ ;ǫ=uw"Z. Kc;gqB9xIM]yHX\S=~1j[>ҭrp]j䞧] /~' eT{nǜRgGk5}7D' _$q۽QY/.~'~uH-Ƨ"BѱPw׿ջUhk<]6J]]Sxw=#5=59]0_ m6/kN^oL/Et>2Շ{.Br]LyD'l<{-?BtF3/YϪ|(bQ$;љc{ūik8M/ƹp[u=H`x'޹(W=oYnz7xEЙgoѭ Eޘe5:.mʵ+0ުm]%Rxk~$_R{ZD_/~zC鱘jŮ N\jc|Wk}x?%s`XQ[+8Fݡk=ï\Su3o\9j99w2Q9b}cx7cExެ]KZ?~W{{+d3UV} NDޖ?sp'mM⇝\p;Y3tBŵӤ8Pġ_'{eG\R?`1> 죹ᚻ wkzo"b.]{ n~;nL>{">ykXhy  6zW]yAJiBV 6M.t`Ӈ2w|9>x ÅA_)Ɨ^n`㗾6޻U|hU\GowL_s{Le߻XDqo~ғqp]YSq]&Oq\٢+PX=]ّ85+˓^>sg+鱜s(;'=?{W\xd= װ<.ܦfMxɸׂ'ؕ>7{r>+qiik,tOO'x'x'x'x'x'x'x'x'x'x'x'7J%<O<O<O<O<O<O<O<O<O<O<OPeSגPT x'(B"EWN@h,чkogs_P$U OG 1{p/q3B5c9d>v=275h.@WBdYsc(Yȸ2J̊ @M9-d9H?Q^O ܂6!rdL@r?4 E3=~iBZH{Gi #iH}=^[!xmtNGO~y$07HIGCrܫH=GBo>$+'u ! {K$}69"B$݀@Hz%R"KހoҤ)r5=3 )"^&#t[c4V#x7#Zށ蛆 \L HZLC 82b;air-]+N"OX=]H^C`twڽE>LAHF45I~;6#ih$G#VH2ct5mI$!Y6q$6܁oG BVU?#s'?IV¿b(G𷨀?yklv{@^^CiHxkJUU>Z+!K>: ۣ{|ͩ&'R5ju)YBT/?u$jd7jY VQuFu ٹT%4v$ɧ{sޙ*QEE}-M6vݙ4+aO:&=;1>gs>gO' LOc])8|ZC{M=!#čr}_xz=5'=Qru'缱mZ{ꯁ"^Kn"\dQ㗋ڿq 3?Qm/Fx7N!4oo FW=j^VAB 0%$L wOAŒHx"Hxz$ؑuH8fc'< hׯh7 hqQ>O80@>:hݥC@l,,kHX( bw͠" `+-v۟}}wggyfv@p8_*8"擩J [SuK**$*ڨ Qܠj{*['@s-[dF|rT0{7ܲTUTЋT~ nW̩xdwR}2* LeQb*pRF+@oe5Cj$]yFFVPA^jR|*5vI^k ) SAͿQq/Ox"XN*R?AxU 5^Gxnj՘[_Ϗqjb &kZɂZj2բ j}$N&sdsjxJMը 5 S֟CYVJMPSϨz?VP3Osj6ŞYfճ 5ejYOKj{鏢fnRӨi jџNMVS㌍Ըv8hW#Mk`Z\=K&*5~BN:Z::Fǣrhq\^8jݢfT;ۛjQ3EJChzjϥӨV3j{ͨ?V IZeBQYztTz.Zkw_^S:~"e=^# w( :Ɋ#:q*iw#{7O/S8:­WMptޝèFZE5PTs`ijrFոYJ5R'H?jR -SaxLGR#zY(UG UIe^S?TZ)jVrT-r:Us_A>ea&ft؊TuU3ӣ ОTsU3Cӡ,U9-to:vUEU_*iZTG†oœrM#UnYTy1\E<@|7C!t::DOج!z%tpK6צ ]t=:]-꧃: u:h:K0w[āt:p"C:-]с~ tY5:3 *;7SI)` ɖRz*s% ;Genݡ2t}*JPMT:JW>.[5RmTzRTjQ=JRɟ%V$ߢe>^G~n&._=*-U"?;F~+ ȏ;{G}}dq '|o3׮jkz//tW _U||nM>}H>{y_g1u| #:GL&~YCwKȻE=Ý䃸|(xE;hw{c{Nb@} J){JzIO-{/nLz'OIo}LL 㤷#=Mw?靱|CzHOճMd-t+'ݯ_[k}"IYDVptABuRt5$eHgt(&H0-H:6=3Ig;kHǮP9،t"4HG~i!E:Bäzi/]D: 61!KC;|B:ªͤSEt؏ޞM}ai?K:"JIǀb! &#Μ3mQҝt'ݏFi]/5<9Hz9 sĂȐ^E1?x '=0#/23_cHSU3| 'q)^CzeHO"P.j˒N;'9w.ג88%7HiһH#靺*:0Ygt;+v"Ƒ$fuғ6',+ɵk9N#f !'鶽Fzj鵔cg1HOĿv_N'fW+y XO/&CKJ#]RQҵf;>98Kw']q9+~9Tҩ@:HGb=D:2 kIr>-ӊ5v;q##t OKH3SXx:q~Ǜt%C+tҾ•t\'y)}nE:HGstSg17Ř&fU%XٓlLhk2"Kթ+.tcx^AXE,VkLj}n.Ŋ2#] /O."]ǵ7 Hq#eYL-&]Qlɿ<%Jl97tOO3ސξ3 +5c<[16.śwx23逷cQ̟֤vk3HUEg"{%y4ر"L>G.G5p "y`O|I}Q:A4l%U H՝~bR>i4lMI~RH~%ݤԝ~L'ڒ3N6JjF&ՅHU]R==T?HjbHdR}T$#tI0[RuyH~&g&٤T&vwIՃ^RTl U6IeD*w%&sIRY5ʧIVKRYTm{M*+rYRel{ TJ*_k3IִH՞R%$UI R}|1D;W#΋g5vR*-Rf@5I{fk Ej%5Fɺd-LR=i>v;Br ͬ?@(jJkHV]5+CȾ]rdzvTe8}&UKH#sّGjTR54T5(1;IոSr $FWRG^`Ա Tf%1<1RT=K*zmI8C*4IųrrᑊW&TIŜϤb{R!cJ*ċIy=Ri3I(CR)0a{0O2\sH啃*TC;tRT2,].7kHԸƐ4RcޗB_~RfypjNj&0E1HMR+CjN|RdCjm`R+Z8Ԏ&^N!IOjHͽJ8qN`2-I^RsNq?OߤHjj3~zTų%Zd0꺶<~ƇT;ؚf6n'U?7TU+֕gkfj? GPGg_ /c6h }T &5EgMdX7Ounu5#,abYcjg\]0>zZP_ol;^=eU,w4ljcR:qs&a<mbf@RTzTO`1_.I'zjGMNf:&1ݪ39,N2>%?Ob|O6_,20W2{gX>Xe~!~r{6N?f0z:dB,v=yƋL?1kk^T+ev\ur"g7Ter#wrHU9qΑF#L|`GGbSBVv?l̆y^Ur[sp9!3,mE}RS^8VGj6!57ګ͘I:GWR7I]&AꏵV1wU!OegD V 'iX4xƨq ! 9|il" ֓xҔHf% ISVfk \O#'#-I,r=iv鐖D;ҪIZ'y?HkM&Hvi_Fl#m[ɃoÑrР<"F&.y<:<<F(&Oy>: OIynymD|9D>s _rW` jD&˯o5wt-Oo|OJ~ 'E&qٜp%d_҇=Cүp8FlȯZ o1A%RgWaD@l"XQOR<* z@4QiTZ-J_&_*0ofcg).IT: ^J;*#Jע2\ L2Wo*cs\Τ2T-)/25*Oȣ}(OMSFePET|3RM?(Q7'y)5RٝT͕U 2[wn*SDyoPMGJe5**8ʺKTvu1ʄQ{NUPrT`*!;Nlݩ܍o9e8P9-T6B} TμѝTApON>5݁OJ/T~OIꂩ\*_;/u- @凾k<5l#@ggcfld*ӯxwPKyjo_eߝT~Zx伣'1*5ES9*aJe˨Om*|W2n{:yͤrcOGce*ތyܳElGy&(oqQZ]{C2:y^!]3=eiS)o`Ps}Ay(yxEy[Pޒ18\G =Cy9c)i%+N\fCP 0{7[ޛ&P |*:XLdc-2`{2i7F9Oދεk)O,3|=f{ bxNy7h-*?ok')5򒖱NyeL*=}ƶQ*?l&Gep ]Me;g|r >T#{A٘f1v*[@_QbK :sRnJw*mOwS'TPXt=3*REiUϱYTɻ*'QaTiO4*JK-=>T%ӧ*UQ2':@3V7*tWt" :PIJ@t|:|0x)tn,:66.fAa`;:xx:k=2L~0YxYHC"$tw3lG5PeT9;8-_ͨsT&U©b5PCCQU5U&CU:U}N@Umkf4-av>tؒCڨ-&0tXZKU5 tc5K@UW7谊TM8URa9Tm03jڍCT](Qi U_BATUߚN՟7RTC,U0j15T >n_EG YK;OG<#H$:𿿩jHёQ (tg5բTKT;#}sJuTյPr>&oLzj$s=sT_Lnj}SjfJ h#5FQ;ܵNs0j"50yKMeTɂjjjGͬX/fjCWOԂ]RZ.F-uP˓e7zZֳRljcy\BZx ="(*@E+Q6n/SBmSۖ~GP5Q{I:4;SǔL]թ9NQZ't:^A]ԨECiG"N]f[Q1.o1uɖ?S*Ch5*OJ~vQ:hy~4V1u~G]멫u2u-hum@]XcudNBP ٔAP)MY6Ӓ͹FWQekN].SWGR{)KP+͌:MIVT:WJ6UCO)P-^JP:#u Τґ<נ\Xʣ!CRk]JSzs+tպOi _PhYjZ:~BhSN[ v+`@mc5m:j7G ʢ@ :OmJs(m|bELL4M$&i =K3Nܳk^s\b鳏X~ 8bq'X zM1]Y@L}59,^ `3>φh &* z"}(sϡbsRCO[Q;fNM#_@|9cNU7~Q~Z½yu3{\;W{/ҙMܱ WA".3=Klv(rq)DEdĒDt%FNġ5DfHsX>!VQ i>, H̏O"BbZeAL.3nbz"YÉ*"T!s݈ 31)Di//AtdDіCԛ v#ədP UI$rN|yQ#ٽYaK"sj6t,A$W ȐcψtBTe5Лܬ%r^D6>12͈d72p;2H?JM$S&"-r ʽ^M[3O?uQlzN'vQ|g$qz٠7 *Z4%3/2qQO8.mgwY~FjIo"($-:P"+=0R2ru=xw6Ү}MN\NF[ mV)5uE oQ\/i"N'\%'庸oDz{ f2'?Os 7\i}ܜ\L" fۃ3N,R] x5N~M8V=(鵅IaG]Μ[r !DnV|q'cyD34хAb~Wݝ!P[*rX/)h't0j߷[)yEU$*J|%y^.dELY2mͅ [4A͡KdOcIrMBZy"c%!*ƳӊJ嬊Le|*Vnn41vho~hbK1.±Eٍ%y% sdgp-Lw v>U$W2RIQϊ:Œ7s$yK,>+;Q T,\Vmx^"~J,H-)ג_+ )ҐpvJ1'T9_%o?IrIt;Zrq[fnQw$;6J&*I~J..X'^-,v9|zxAQkR 9!9 I^vq|gr.xUvEFE8f5M̚Wbal.g7 9(NjNVQIO /}ȍIig\%>rX,7gਯ\/:6Tzvbp8u8y8IxskKIymxCś'WT嫴?m-޵“[1gWxj9\Z~n׬ܔ[EW4a$zDcIBUɶ|iɓ %&iqvE,jSj%K]lWLskD"y*z%4pot8I+ݴjǤi\Ot S\/}g},0a?xuuE+oŽQ6{9K1 JVJfqG w#W ?)\#RW\}dX6>ƽlZIl||94.%3T@ 7\Ʒh6 .iV|׻I(%Eyܶ\bO'pjz܊ /w )OĉDG1( D&OF?Ftd(b/O C"&CJbN+lpb޲X!.gx"֣mkKF:͙½k"%IgC>xM%ZKf!WwĻxFl5klB[%GJoqH JqA7fO''w1 nShbTD"NW~O%̸$I4Gzh5aO[$GAe0.'*pPwb?wd/c p:8mH!_`:C(pZ߉wvMY8&\|Վțs⠠D~hׅ<_nQ_~k(Π˨0Gi5qMEm-{ܴ_4h?g4zf7;Hv+:쿌~qR5ǯm C8e2NI߁ 8)|͂0MNÀXڙ81*uY_<ڇbNa0F@)흋SW?~'"4U^z6zˠg4:m!)̡}y-F{~w}DZӿw~\qj'D<DZj8k8j'gX)_DL; Ǯw>1E_ fqkƱ%,zTf:q ϡG*MEwN BZ= eE͸n/~;:_E5(y]:Ub9ΏD" :xtPN褳6BtWt@gI;:%$t|q]Uh:Ġ] @D?vh " W6%.NCs}hr*L"AkP )3Q( k8_6wM>ZmC9*̊@@4' ڱM@١hmV3bZLJ@Khj Zl@%O|[9͟y 4kD4 LlE34[z͖@3OS4fb48͎yQh6ACѴ|FS4MU4toX&XM=94d~t<ekt4=M<k?4f̞kf]h6 BYf{nٱh*Y94f5lj4/fhgs4k\Vyb4ێƠhFhم[ 4~o4{ߏd&c2FӛhLMɍd4i0D!hrb\&/dh4E~}WM&hrMI49&vkkjDhXwWvuD`(pE7 AT4eW: &d υa`4\SG/hxKϡaV=c'{4T'5 e ~$c꫿@u[umZP&|<:=|O@A;]u#퓨7E9^C݅1u'n$E{G u/2kE /ހPC}?1kʠV;H)tDA7&ȣg/}{+@-h注_DCh6 N\4(Yi.4grcP_tکzLPcjCݽ^٨s")AQGu&e3m?|΀R{|[׬F@ ˚ _f _]|u75͕A+-D~_ߊvO#Q?ٶu!۰s, _$"^S80ھȯun@$gqOJ8{#4hI "?c6#S<- Ecq'  fAn k:7|C@Ӑrk>;俙pWEm˧eu櫢Nԉ;:3PgW ј:#*:sOcsu%Αy[:LPg'Δtub'娓ƞ{Pg{u̅tu,RPgP 49uXi0<>v3\u4`Qd6E?`~^dA~W1 ft-'#;~pw3|d]Ceu ak0_2]n2U0N5@[_4{}26꾴g/`: O~B?q"R?q;< hƝ3 cu1>A]ޯ$dԍP:YǑ3 ^vӁٞqͰt8Έow9: Pw2N}-n,O%|ra=]:Q޺ݨPWr]mX7'n`K8ӵuk -wm@t+zYi#G~.k<ԟmѨt7=E4lUFhP_A|fye4xh(FYo0NG%p,]Ahxd 5쌑E/(4Ѽh4(BF( (i-GoѮ _Aht B[a4:3*_Q>nCp4‡ht#@5lw4zG?QԊa(te5 P兂93QZ(_CPν (ُP;P- ~`)[/Pp {(όC() J(Hi(8žY_KL $yV"mDU 3έE56;WW:'MGD!߈@'켗z&hr'M4I6E>V|f~"V',w(_Y-S>dH4g54I\w D)|%/ 9hDGJV yn/fD4LDhq-D /P@?h^{ٷh+-ZZFK!hi6-jrt0AKa4Zr1hI߱yqh9-Cr-'ǣ83\ꋖvhy/NI־zew1ZVX3huhy4-K2-Y -.Ac'غr>V7>U9dњŮM=Z@>RID_)h%_ J ڠҘVRVht=-E˟gjRւj>{VjRV@+v^[ 0gr8l~w!Z]sc:EhU"Vlo6A.CVWlNDpˎpA2 40?B((Be(š(\CaVkFan9 gD}>Eηhs;ڜy6tѦm.}]6LC&[( 3bP8v\@A_zKkš\v? bmZ Z[GhX6?FPNh}J֛h=τɋAkYlF^h{b@&"ZA̿MfLew%KY6X\"6Σ͚h׍66 CѓhwmY-(l̸4:(g,Bm7#Qt EP Qb9nvPoX[=P 2}P4C;Dw1NEgP4QEa`"Aޣ(ҕPw0Ew(?lDwE#P/7Pxm Xlݸ˰Ca] X_bpCDngQEa+.gbtVˑ6(fBa 3qlV whqY (tD ,߱Y#4 ͂4u&hӃ& ф~A}4k]Nh| /V +] ~.BwODM M렩b!HV=hZM~{hzMEhv Bhnf6hv fhv/]~fhvɍG,Aͬ. 43| |p\ߢZG֠UZkЎ+y켾VjK.SPުF:6FhxuU֢2N|\ij }+Ks JPܙ7(ԀQx-n]c(v_܈OH֛ DRp>scK EjJe$ߚGza<X=MjDtއt9Ҟz#N/t3 : at?܌ B=Vo z93cFsz:~DO9 =yRCa1zxG;z{Gs z@O\'DOQ=US)zJΞ֡<|(@/V/x f߶gה5=oA]| =wAJ = Bτ9?^/EϨtzy]DI8 zD7,p@1̎K~zډ^KMTѳ6}azWn2Kgz^FG=_D9{ zE;s8<;=E2lI7zv ='t|}h=k-س&ף{t'cOCLtoFwd#z0|W {>ˣy?=51s+#gt =lF{~y|.zaJY&l6a)p>l=?<=/c3|BO zk9GKɺ5w=WA^kЋVlz}E^<&{Jzv777CyN7;|T؉Ҏ>gL5[ޢwFN,C-#hC+} d>o7zXϨuJ^w in @}|>F= L)-Z^ێ C$Zڄ.bzmD; /JЇr~ â@? / AБ}oDXr{6LA}}T DL }'e/-F} mE  (izBLzw1p'~)l裫>7+e5WynD߻Sw5ιз7TNȡ_.~þaN@C%BC/TOϢ5ݐ}7=}S]7}' Dk s%}.[O7f=}ט軒q,y;?åѧ.{^>m>vRƍ!RϰؼTc-;qag5A3 b@d#]ŀmw1`k@ Xf8U_/1 8Mލ<0p+IqB{ <4q8֢pI t1ǀpf_Q#-q8~#YA1V ݣ8 2hč/p/xK'T`ЄR!N2 UUۂp\"킓`ӄJnD2b‡$#*6b'1 ;嗉Q2&٘m0&uvDjZdq( pk"&[DXIW ·k᪣2y:#Efbj ܹ?J> ~{:oV%$.uk v"pB>"l:H,{uuIB}! O. y| ,t$܇.tO'ߐ .4qL|?F2y Iϧ kIe t"~?p_2+& %fDc>qL&[yNpPWB葅 Kkַ͞b צ3qm':{?TWwyful0l *`N|m` 9~0;X̌%0U sϛܩ[!(_ (ٍ@a+, w*#7`K޾"2 zyXOw`ّO3b/߃Ұl 1OA0Sz ź0K^< @錆yWR^B22KO CQ~] KN$Bd,ag`~Ko̩0t+9>0fÉo`ZN6'@>0?w@r2N#,qx+IS ~dIuhI*.L%cA~uoW =0b ʀ 0JG@ir嚂qK#.S! ZӲ4+{u4h4g|\{'? פ!h-BDr0ɮS$M4K2g}$$㳭䜂Drgu{IGpEI(ɻC}* OA}P odrFg?~ P OVYE7vS`L/9`<z`:,+΃M0W `C 5J`8`,jklFw+ `4,J X js _`oP+X a@>| :psq}9p<^{ xX #aSu0nHߝ0-D1)gݷBp.}Ki8QISΡ% V 4rq97u:8-M{pvYR@֟7nSv/6<>x{S=Fc8?MMXˀAhjDcx><ۺn˂:2^W7#p }Epmy.;px GNwp; @72|JI68̈a)(pZ F`g axx,p~Q޼ \6ܣtj0f{ 7Y oU2͝ r_w5 =fԈ`r$lTE; 0& <y8j OxDžEc^Ag] al G΃RLd.Q+X>G7|N ^% *GG|Sc CsV {x xĀ3 ^v%@/h3-mӗ#vf(|}rT &D\z (u\ @\b(y.;t-WA,plL$'Att%?z*C}8UNb.A2 t6,R_:;|F7- ~ՃT h8ȫ\xN9\a8gm$-VAfx z7,7\) .L:p& 9@΁@s@#_?cIx~̚5дk3</Pl7 x 3.Aan3Kc*4@V{T"xL2} .7/X7P^cE[M5SN?sD~3n/nW )bp|<ms'3@]ʞ=? */>dz; 7 1 mux_?kU c%=:mq|79@#;/NR4F18m8[#N@L]ip1N_cYP`]yy03n01A80~ F'3A)&‹` uXC`u7 @4I AxD_b14Qu+]+K@jP(\m(Jp NtՏeej=N.9ZK/8?v@9j_]02'3 xUpƑ༴kf~St$;`ǁ];?{?.b M"e 7@#<@flt 4qs?;_A\3\ր.Wq8_6psGI&,-=C[N l!؏e1P l,펁0^c`z)l' \tgP؊d)ؼx6G,'5 rk`$l'M|1 v+X+`کc uZDpnspR_ N`{Vh1/ʰ5 6/3$ K ,;nWm n/lsl)`!`"_B+Vmlzg]S#ƀ{#ٝs=x?cpS@:c)Xy͈y1>9EIyu^O?=,7Y b`wqI~E8j2r7,W}+7@[}3Á /a (哢70\> n M.p?lnM#؝`=8 ⤗Vf_mcvN,VVʁӼ>2ne 6"n+pUGYpJ`_Kc_!,yzx}{V>.8ٖ0qP&R>70s-L윛;<,7 ._  J{6x/9Q+n`L}R._2<#.Cм04s`9{W1?'0n{ z`a:1?adzM D ʼnn+f$RCg\y# -_!(, µ2!ffX`^(; |=fMaZ?f@RiX,FA>!-f D%B4bsG 05oCaA|hMHm0[ ZX_B`żOKX sX$V"H׃=Uy#^HaӨ|x67*Vkma{5$VB"z@o[xH J I0{!9v|quCuMg m| |H9H[ [>H)=!̓ Re e/l{>&dKH ;&|=odO5lhgCJ$o*x 6Ni,-M@Jl] i3 E۶6 +ҕoA S|CJy2lnaK@H/iIS@la26̆m0H TB^|v~; {^v32`g=\fH;R_߀?ap`in {>̙%Wa[$H(4YuvܼgawdZÎ2K*v_2k,ؓ3w+쯋 Hd@bmv6ޙ);{ }SoΞWEHV .k!p4VS{!m?Î ݆_á+v/k>Y '`N;4F_{̄͛ GCް48T Gy¡SpZw@n8 Í>z2GvAa@:\}}@a]L$pn(f5ޝ8'z*3^*=@-*&CuT/?DPLB'y\@]qPïBCE ۰}w6+Ҡ~J5ꎵC5Pfpx5zE^լsj+_*fP5*dCy|#@Z)T 5ٗrl.7(Ay#xAMQ$/:B?LPt *[*;~( Pz  NBy'npKʃu>;aN(Mlx˴@Y\ݮ*PYJ@8|s\Y 0bCy#E?PX(v\AunU2sށIP:XA͙xk N%pw6h U.-P|:HhF@8x,ܾ:p-P)uS8*MzP{MʮC ṡ28(k EPoq5&*Pp23́PnGJ T)ʨmPYpzAM 7gwA8h*=-o96i(XC x- ÓGɚ xҭ O93<=Y:x<-Hs{sAt94$)<^ɇgFbx<~$,^@{fZ2=ܼH5]n5pE\[mW7m UC ߺÝKo֍pQT'vp@(| W~܆p.)z>8BW+Zz; WUU8Ό {7å7pQc\ _pqMK-yWfF-t39JoP'6ۯكpZ |}/vP8T**Weۭcn 0sfgx3qϠ ;N0j?at-ܗ mZKڎPs Bc^0jj<ځh)P0qi"Tݎ硦)r6V@duπ /qhqɇ[fAcO?_*By%όy7*πrV{;G@Ԯ=OXxr<3i; yKW'_W}WTZbp>5%3vAVJSۅa~7|VY7sDFi(̜pJ~'@p~?ʠ 4?B)dP{׃%?y6^S+u?Q "$8v(%:R(=(}9JLBitm7}&*Cf]C)(>v"ruv؅(qQ&~gOE^7l_U{?eQgJ1L֠kR@(˗c E*s2D 3]QNelF(PMLDr(FFCQS;(,GPdte:0^BYFUCu-e;I5Gi([ROw Rwb+ ?^ބMs۔={{ _Sztu4|\ w߇2jx+?:* ^Cxi)C'3CF!t%B`tاAGn3'̂ɋEz<ϐgcDxcO#5p=# 4=QД4 @(Oh0D*: V{ ړz|:nUփyP c=n#P;.GPO=EͅPt1B,Ԇz@P}wwfPeӠ#ܡ'T/dP5@:3yufyNxjVV mZe=ݕK^6<Հ[χ{|WvJ@)w,ʂ&@i;]np'pܮeٽA8`[邢PfCbu+nZM=pL n 7VõGp'\-ք+vpd*\ڮ t.9 y'p2?p>pZ:Njɽpr389 yڝpl^z±8k  G8CphsfCmm5~C 7itC6QapuANn{o.Ks; d=%f=p3,g&d^ϚA:rN@Nȹwr&C45,sr,[%FHsm7@ʌ+|RB ~~ vr!eeHUv@@9Hs`fH1^Xl-A9 Fx o`(Tk,Ϳ!wC¯-PT[!N–Ij [ OZf3z K¼A`[[6J)+ay7,GZBX zTX?v$mڰ) ( .X>>:yIHR&R2aT+d `0|;.܅}9pn GviB K;p= R7w8r|Gl684Sk'ȿz'85<Nޯ|n(.7&ӿ p"qm+8v?8"B@8,;|5^)C!h?ٙ 2 [Cˁp#{8kB pz \A͐}턫Fb8Z ǧ?p. {ޯAb8.}θ݃su Nqg, ّY©!QG/ Yp8}=qY fYpBk[D' '\NBB$_t >cp'B8 y-@.)Y 9BYQ ٗj#]k QmِrtX{ʐ]<r 9ȹ8嶫{䖝CНp]䝨˻wÉ}5J'yGa7=ysp '@ު#pnBigݮ9 Gk@TdB!>_)k,gFA,$vvBޅU,fy5rHjփ!,$x $Bd4$sG[!y$ΐ8 $$|!QAbD6$@~_H|vhؑH!!y`:lэ ydzP>m@:2 @r7H7BdHB lkT @-cޖXOIn I 6:ϣix C6́0guXxZ+G^~w`'a4_6m+vobz+-e`m?+/UNTJ,q9 3z1!/|USVvpH?R+!mqp: XL:An|{rOCf ;{!sc}ky{BBfO/ۃd>:vA恝92A"ع04Y iA~&Cd gBFwH<[RaG!X5~ Z}ad-XQ?V nBf mX+, ׮Џ\3_4=w-`&/W޿, s%6.y ԂFQV>X։w,nj0 7OŠk Qm0N?h+_ՃA㿹9TWXɷ1/%( /7$D/OVDqge0v 8C?"A HO0k j*+~bp8SpYxėKl=xY:xeǭ,xZZ6Iд*ȸÓ0PgՂՙV|Yr =x಩ 9s/`lթp؛W;(ܤb2جl `V?ō(ӁO`<kA拱O1~| 77a+# r0~x];>aCnFbyiL6Ƅ1aF&a&S1+&)Ťag0rn `&^īK1aԾ 7C7b[fû8AIKe1bLIq˴ӇI[0q-&);crLa{o_0).Z\0u/^ [[qsܴnzҎ&sָz%&4;[d{ g-p"ⴆ%\$ep‹8}gsh8N?8=jt F^؏"y\2n}6SKO'i}G pJ=9+\QӍ+*j>qG<:W'J\S| -:kU\ p~6w5w \&W\n`Tp Fqƅ?8u)LG,Eg,tJ]Gt|jEB# ';qR7N,J2]Đ+^8Ð&m=q 3sD pL= 7\%>0/:.I0\4uϫ0bHFV_H9c3O_u1931|'_{ckv`,.K Na]i80|Ko}0\`YL°︄6b}3F<[QFy#{12*FŨYmeKg(7FwQm0*Ybѷpnqןb-,e;RSU ]0E?c0fNֿec0ZL0jFT`Dፑ0Z=FFfc$#db k1*'c2"0na4 q>\cu0*.1='`&c~c˾u1Sw`iža+U0I3LjYV% SÕ1?pSb^+.; ctB0a܆8ћ0lk\1#'nƥcpHYcKp#>bXb\F-%1́嗊~ҌY0B܁ve0 û]0qT_Wp./ǹ%p:- \3FTEK+`VY84g*06.ڨ&]8O CKpոHxcmYcQn_qC#zB0t+9*n5,/8; ò2p.]d187h qN\\ Erz17yo< 7CwQUmE*EA*"ґ"JRHNz$HI#M@@TP UE7~~:k}vk3+Srq rRM.+Fɵ~9M&h:rGxA΍\.9'.rI&3~K<r<{7SCԱ5K>{R}7~[3R|χ| ~"=pz:F(hdK]}м ͽtDA)>])ok+ gUm ` xp+`xG-]~͚yX_RИS jIA)Y6ȿ_ x} 8/-}G&D t *3>$n=Ε_b' RK^|ԗשmy-̼<\9mjyݺ'"Ly$>&}\FyT~b8?CkU~Uȿm|\nwx]NM?t 4kW3qʿC|w# 81Q C&6pd/NN]%6ȳ4)3߾#Iw;_Xlmy?e^ |TU;wk<Ԝj3W]2K^k^hy~&S(BܧhTQ>Ӝc~$ךrypA2.Y.!N|+_"9/Ohx9 kArYw)#V^mWW7q 9PgXyç<ɻNy_dbA]`n˖r$Sr],rWgs jsz*$嵵'|+،A=^/_+ <Čp\oaM_i/Gol ^Κ}l KAs&guy~2U^+mg[+^m`O.&|1Yǚ#y/*pCSMO& 5H&5oSgSV5'{\sM LUp\PQ`;rv>_ hV`掙KsI/h~"$Ӿ&^O̓A>} ]^CK*Emjj1S'V~c./H{y՛+柘>4B[L &r(uěG~ܮy5qZfVoThZfe噘厂Y <׬$Um0P >\5[`fa>S< QsoY/+%ۜh6ͻ_G7VșZdB+ }0ZJmf)"7{QVxr"}6o+𖖖ТQ |La tB*Wء Ü>l"&S_(|xmV:&Rnj)-Z0s Yꮰ|PC/+s">կ""7To0GaiI!E$ۊl B3<YVdEWT z¿O/UiؑbbWlEmGkŖy)b~WE Pl|ؽ5y\u(|hwǟ)zBگV(>bwW\~R QJHu0W +nJ5ix宅A/)zQlW\7;%\I R܃ilW%_1"ygVlOYR{[cFJpߥĈzJH+J8SKq}mWfWBSJLە'M߮⼺*}%ԫ0rSңWə[Z%N.+>⏭TJ^aJ0Tɵ*}Jn0J5Sw/>Rl%DH =rJ!Md__鲧Wy]]yo^Pޘmr?"x7R1dFvM{IōXSʽr(ߒh>E#Q)9r|KvK'뙶YUhpcwG~:* {Ư#*r\NԆ%Wvs^~Uޭf{rZv5)6Pmh4Qwj}_DunGf5Yc3Lr{%v+'1vU9rڢ{^C]3qo9bʬsCML5km.{g9Mͺ[}| 姛~S3m!r X- h'=Vwkݔho{J.9*pҺy Tkً!w6wza&ۈ2&$Oyƫd=oP~-#r (euպ5R[~Z:\yKĂYL.hroӚn6y</1;!Z:WkeiM^ʞôrV8ەۺ2dw19e67Y60kl?D|"ۉ˦Vvl& >FR?TO5:ǔobc 3kRK埭u~V^A}Fy5UAe_;Wq;L"{;fF YfuE{e-j&w5⤹O)/SQ̟M/[_nry+=Sl0ȫmMĎPƙ䬉rcڳ,ELZdu!kI{g璵asmm^EU(mh{K]цZ_Qfr$m2UϟՖϴeZʴ|V͇[im=-rt}tJۂk[smXEjSmY70֖uXKmDc^TiTZW%Ki{ T[۫F:ⵋTN%#T7TGݳTt;Qq^*3CE RѽI*ΜkU|c JUR1Wg8JoUI*9JRɨ* |Q%MUCUrJNlFJ{5Vّ)*7JU*J;^WYbO.SiaJ [zvJ Lӯvd^3k%u=9רyJ;]R閃*_ T!*4Z۫/JS =W*?_"9?JêFʗUUeGUQ̹WT]ϪH]U\UuT9d*\WE*qFe<|*ReToFrr}USٹ}Ne*߼MSonUxM6SETQ\UqʟVWE(UR#*iyZ}U[eI馏ͱT WŠm**6_6yxS哿Q ~lQY*wB"Tz?J Q}*󚤲\U`{QЧ*8c>m'I۩|[eoT1[SWU~miS3M,WiOzA<*>ʾU*?_;S3ӿ៫NtTi[*M T?E*}JJ%Tݹ*.PIyol2Uq$KS^TEglHތKyU,죊V妿ϪKʷ/z/TzάoTRy|-mڥiڜIEhcxNPUXY}Lx MU fm!Pֺų>iҺ>uO7׺_YT'D^R7>11fW0;n6wٗw#q.)MVuLr`M:1.ʛٛ}rXL%ir6{= +o9gw M3IRL}11E/ɱuEGan=W(og&{9x˱G.;e/7{fGfSs5{gWo~0jzY/5n[gfؑK۳L}WKAL;Dd YNTΚrr6>TN^Z;[5jM.P~Oٷ==W+{`+ڻ_jgcUhUhzV^cjLbV{zR%)eR)}%9SJ#xoU)Jeާ/RwJO\)Sҽ8W({(矔<+Q)iC% VoWҒ %?Uw>TR7J~}~6%oĀJJyEuv*&CE+@m*zub&RߕP{+mE%TW/EIљ_(}^1U>OQqG9"d*c"Vxͺ OHRkU- ТZUおȚ9'DQۮ'YZA*L&)M5E Rs _ph-5sGs=JQZYW7>Jr*G)e4%zE+m%%5U¸%uP/(~DM6?+qu%ZW7O?T\V;kؓ8~6WJ5JuJ*mEtWW['cvTґIJlZRRjm^eJC'=eS#VjFoCm>7Zv_T˪e(ckMNӴl2kSfMe&+skK-k)kY;-e]12.g\TzwF)32) p-[F)}o}eT;gV륌AJo4S_eAJ?pZi }lmX3K)1(@ 2^(:-o2NTJksJS[ueY4Qփ]ZV:BF(J?bRe)mqئya2hYZ{C3q/ôVʰ55颌qԴ{etsҟPmN.SJMTjJ8) 0\ɇVJYT))y%n̵.JI1q}~䫭|R|*cR*Z<خԡ6J-f>x(!=!J=;G*5;O/RKJٯ4^_+-6W)5R9{+SJYG7sD))R˯(Y%OPR=JPJlSB$%|b^]5YSW/;x^1_+f~kżUEQ(_Eˊe"UT0EVTii#5*9sB=u}Ut力J41uf[E ok7d^մHэLTQWMWKEQbU}Wї(zD{EarW^x{-]7MQQPE S+DQG+~74|E v(d#-xZ!kaDhC+\ ? ]TMc QP*L^Xlc[c%J$jPd ٕs_g<&K,MM4PcxY^s~8 .yN8 #;J#۫nҦ3KcjkdE43fZknneF_.7mmy踶2!i1\0>DZq^ڠ]j/+h>@|ẌҤ]f~!Z_z.ۄ6_WEK-.qeG?JN^ z//nGE[zGV͍&*ؖ:xqJB9D/bvXZ-j'趝 j4eK֢@V+/g?@7.,tm'c˶T>$w)> ՅrНj.}L)iU4--Yֈ3ƋH͉\׿S擻jדE7~_vCtv+@kɗ|ci1},8M,oJ=Cg_(G昊96Qe}Ag|#Rʫt /]'ȡ7"䵍\T'/=%?/V[aA7?-GM=;~Үn8$΄ʨǏğGOa z6~xξnG )"^=.UxzGzN|#L_n{~w^ae"d}]%n!YUHAFeB؎ՔӉ!کP 1Ta\~A_g٘]+ݶLs"_.rJvXDě~wgwiWZK?o#iGb.jݠônȐ/Q0-pb<_˞.'Fz`K^sh` t: ă;]3},PR"*s#>owfjdRgr KٔLsjX=Ey羑_>LSitj;[29Mm/Gx.ҏzòD>XQヶʔJG$v΢]&Ɗ_ R/@,L Eh6 X#o 8ޯ,K\|6y>~=Kc+?UY#k_)3%~*]6(M&)ΓsX1P֏Kzƚf&D\fW[VI|m7P!]:iK:Y&揓N*t:mREJGMr0ǘRN__\U3(uf) ̠!Chni=1ןhoYG۪k_ ṓjGҵßvEQAw{ aZ`[G懟QN]^d znB>IDF C ^"ipa&/؈1C7SkkrQOG}m#'=x0/N|陛kL^4A<6IIWVK̷dr嵘 L;\4~WRޗ ve,#FJ뜵q|gΐw.v9^kkkrf~;Vмv=i֯oO"^ ->Jnvر̜I7[:-ۗ]"fck%LH9,x0m!F̈́e+P%jX$ :V-U^~-Wrr i:F\J2euĹYEĎrP<1&n4:dJk,oVOn>Go%~xS {WUGبn{N1W0N #߳rsNEIvokۃ2'QK(. Pu뻛ZQm`|Zo5T9-/9TN[>AT~ :QJbב7uCsO ؤ8ʘyKD{0=^vd>уHF)*(E`lnޱckb{bWDQE,""V"Yw?w}<3YI6'9y02%x njw gWgs4dڤq_[qαl!lj4ۢV*؋=1Lr;#{m1vJ;k|9.]ohϔ0k2SS+*xk?uQxkiFbϊZi☸dqEez8 Ֆ;Ux9|(=zc%i;E`3SFij!0yY!l34|И9YC,|tt_vǶwgν[)QC ^"vk*o0EXζy+o%v-]/v{!~liǺ1qICE DR Y*a2ZkO]jb2&kW qמ1ʿu]~,b|v 3a*s^ E[MjȚm27!IL5~|F9[[CNʝ-60ݍue/1+k҉5퀷}ЪSd^ ۺ13ʛ,g6ie>a/a%€%OׄrCeOȲk`"k|*q#zWWVC35󉙷`́+/i GM * |&1:>G3ƶ^gpgcNHۮa^0OSƯ, ,;KHMc&~gG}~բGیH0CY(1qMx{Oh~Y4jv{.p# '}D|#w[nxcBv={Jqx >qX!uJ`Xb0B=T魭Ml,*Obgln:x ͷnn&|Yljfx2L(Blu^/3^@xweQp8Ja)ZF+̼RPR]9ذ绱;~w;ךm0kF%?wyB;Qumyv;:uQcBvQpquO?W#_͂Xq|cg6Hbbl끰u.ݖ) ꤍu dcLT-FA4/A42ہ9oty#_uIfw} Bu[wV.!_.~тumjx,-mͺq,M>Ч||J:3 7RtWS$"d # u֍ qgXdmW򅚓DZQzep%eY2t"[nfMD_;&vCqsؾQX=EFN?ΎhΦ7Ɓjcl%p󿬐7rtSVcN~Y /wdfNyo<7k랬㱺-<-*zq{W9(y,ϯ5_zwO6Dc<XNMn? ]Ziㅿgb5Ac[kv7ѵ~b{T: |6+HYaOnLlkRֲ|>X@.,_n 9x/S7lh;7͕ aG>SVe$DE>ny&j%VO]CZGx5} W$ԑ?)+/>8U[K>b_uV ru-e.\{򤪷r!Ds 3[b\ЮDAov.0~.o#!|,4\a<DzZذyI{{mk"a]ϻ)1 ?* ۟uF.pU0aR~',_{fE!u>/|9S4 -& ]-:ky[9~KOGEޢ8]^M}mMR2_~$7F](<~\x``ԭoQu7>O5T>x[~'+ $7gDu:|jUOv,8r"c 07q55_ԋbv1K,5 *ec>:6~(ֻ] 8s :%|eAcec~kp39V?*pp6ѿBܪ'8[\ksqhwc+F-#Z_PV8(;uvO(PpkZF]33eV ox˻>oƽfi7Bx`7 {d̬bwJC9]f%u;,-e:Wkoa֢i!{fu4m[b!}w2晆{ 1 EۆLXOgJ[KjyZ FnNa;IsDݵɂ0p4Cwdwo~FnGw8CWLfT^򭙼7~;2t֐U&ʗ|GʇZ.YvּHwnHamPa^p7{5N7C| ^u<&-'Y0Npaݞ#g !sN`!o:Eumx^7%'y*G]-[G >ےygc샆YF̍fR6^~Q&xM7lj)oqQ\ݯs$1 ;g[ʓ-nUE&G K,6Tx%dKO QSniܼҘ ~2k 4W^rݐȿW +xY*Lpy((n%DN_)l"ͱ(58GI s8š&ȼȯ!} Wa]~;f=Y@>K.ԕץ /衸'}%BGZN?"(^yCye!fZ4^\%۠5]'^,]7ߧq}gr{8.-ٷo X;<9}/9NcnՂ̾p4>au{Sl\/kd5߆ 8yOj57ϋΒpss^Ï<+wCt%UUs{CtU`>lUVvkev}Ϥ#c듒t]bTʓ7ue_Ʉ& Q˜~f->'Y?T˄9O Ƽ;akaɏu%21c*nײq|]^ g}g._f&S/kE+s 0nrPѲlx)Q<֮{%U"2ERSlJ\xEXAΝ9N;&/)o$?ɛҞ&6 5t@yܤElu=m͘GY޳I+ښ<̤[o㭜s"Qd}ilN]6KGyHX,45%.2k_nj茸C?I>7j[.5''|)\=gƼ>Ŭ/߼yx/2I6Zm:VrkH{X$,V7-5l|R[C0p0݉m*)ӊՈ&LdjXͿ1<]rwq~Ǚ]F:}}m?Rd:mq-ZEB,}y-o؞^HJ)5c7u-Y m X+,6A]VuفMƋgdMrD}QJ$z650'Qzx\\]'WchBxkO e1P0<# MEuD 1d9|kV>s1^gcl{ǷlK5+ŮnS7#WXˉSd>?#\3t>%`ƅ7)VUߨ0I!v?c8u]ʹ9-:Zav `%ז3c)[)]a+.a%on6 w5]\4 )ۣTE5*7,y]qc/qlDZc\##zN!mt¦jP!KK+DǩE˻&"?rW!j+T綻(h M> b٥Ymvys׾'[]m0wn#$4R 1>W? L:Oc8Rݒu˧l});܊._FX ƸW uR!TN8d]-jPL7i~I^f̉MRwGha\5'4֖MOl2JgC3.VOqH(Oܽ!|:e? k5P%{\MmB15Iyɝ-)B /kBeY8lSa^+}7syvVCZ76-?~qx?4/8l&ᓰ\y>ޔbm_`*Ӆ6%MZ1Z4]|?IS)ﮥ73a~Psrtuˁr/ E"oV,όItoOyI!GMyȪvr xa*JuB9φֱ..e[u+9¾+3J?15s1l^e%maౡ bx2ϟⓐUw  \ˣ~5Tb{V)<٭6N 1̎53gig๰>j}jp}}je}jǵ԰s!j}ēԩKSS7էJR]}jʎSr%|Kz> }'g n7>o14}ڈ{Ek7%Iz>A}ng7m3Lj33zmpzs N/7;3oUl>X9>sS>s\V6 K7t4b}jQ^k}WSg!>`#-ϵ՟sUp>`P~Km\>c3}Qj/%9!)76+JK>%^KB%]y5IVjz}kkT+i3RҘsZi_,׹ҘҊ;DևUJoK[I"J;v+)+,^$S:xR:ut;K^\-DlAzi?_ҁR|Nҡm## FHG=:KZj3ZH'D),N:\Y:}tA9׍R|S+Ro)!tqX[ҥҥYRb')qtytt\J o)%ΔJwR|)x`N2d"6. J.-$C~aq`#=s$:+RJat Rz/[tt_)zI+\QK)jހ;JV>J%HOIe gӤK\zUk~L=(}>N>#}{@_&hHz\5Ue!ZLw tc0:L#N`:?t6`YԁjR ղRy,MfEPs~:{`krKu8ռ{`uXr VmjV- X>΁`,N]X*em|^.چ`q.,r X_ˡ`9#Xn2_g 6$U:sz1O` ؤAa nA|lۂM^n6OMK`e3؄fe39~ln:͋pPX["d(&xAd1DP 9OA AsVb}vt [+:#` _ pXgZp4 Iء)8Neq'8nx]vp^ѷ0Y55/lؿK%Pw88Z`+?}nWO ۫~93:` ^/b>{]Q2=vZv `W:7;} _'`. '`fviGnTEOs,hMMPP}? 9W@A5(EKPǁbgPoMwq_`1X K*:< î1X[9 f՘`[ ǂxK`'X6\ޞ_1o`yXQՐ`eֵ>TΜ6ufMvMa:8i)(:nH C9(5ILTJA5'< T@Ucj]U`,΂j PM󧧃jUPM(T&>Z Tj Pm҃jk PvTg*%TAL*3P+߁ڵ}A4@-,u,P>uPPwOS/zT5PPz{P/` ^QA&7=ԇl<uaYEPu7W<}.h껀&6hNMhhzf\o,͆Ϡ M|@S6yuzv`l;Fm`'lZvJ] A`;v|}s?fm` x z5nw#L O|__Ƞy4y@4l+߷gIY+y1LMLGuͼa |'&堉0ͨ14A5hǃ7?zo3Poc>ǔ~[ڲ➂QPnPlKl}x[֫ y~mڱX[Lkӏ`m>kzG6l 8( JhP5.(RA(~EB Pvgl|X{\+r3q`7A%PV0[x j/Y{X0ixCs-_1MqDnRO:^ic'GwHoG4 ^׸!2M^/Uc|n^J/5^^,[%XzQ/UT#Un U*REt>Jzk"-0m-=?VzޮvRy]\IzTzP*@*-'=*;JZIJfI~ wJI> jRܕR)dS3DٴOʾ .X)%Bdk"SҮ4w,S*XVN,ê}ZtO`#D=kWOuMº~[ؠFl|()9lޱa5غi ێy `k- ;v#e/= {%[;Ն@`K8Ѻ'jPP\8ܲ5GÑSpcxmw8=N'~ɑdVq1sBL8Nm>܆ÙGGpn[ 582 6π: X NI \8[ v@_hBDwHw.k"ARzH5ځA+3@A R{\)WNkp=A޴kCZ i9ps~Kx]I)ք̊p;d̅U=T _;B:?\y[CcK %Ap`0tu~pxݛ<-qAQxP1(yJN!P)uӡAxϛ\wŜ PᡂDx92T:WsY3x;i܉6nIx<F?=2S|v3ˠrj _Ox7^o?RF6P~~>>UŸw4DdM4AhM'Vka9aXfs;YR)Czd VFsD4oWTujEjh1-@zTA6h9Ze8rV]ʩhuu1Z|h=Z=ߣFD}*̜61Ц*.쉊AP:T^xOjT5~TG*ُjPTn@u5GuXT8n7̗je697k:cK% Ua~jU6r*!T݋w|P GT5F偷x'rbTGe$TWOTƠң *;*~uDϯTCE~TdDEfT\ * h Pq7*GEL*Nϧv"^wg"aֻj4[m{P"*PQe@˫xQQ@@HT*B}TZFeT|PiJ[TyQiaJgևx5/|**JxP锂JTǤuQ6 [Piv;W?T@%[TC.7Tۘ2*BEW*:_*Q1*fEڻ8r)!x[&2*{LAܙkT>FUj*HEUFT-Z}k#o/OP]o/E›V֡|{T'/FuJ]^Q-[:}?6iTm/7ՅPo4N7}PawT+F5W'jZ"j5Gs3P~5&fNԬꅚ]9u5PsjnCM7^|{W&?7QǗ?EPY y}ʯϫ9/uUy_ףoQm} **Uޣj/;6sUǿt[T?e Pu'UE43T+ߡTkDgTG~B˼|m6?n[ Rf?yNGh뜆AhC%fGۿЮUo[DhTh}1:۠u:܍;^N5] ;|t5{ocͲxkEZvnX{`}+]F)jtIub9X-Ǣ"t}گD4tb(Fߟ.Wc!w =uúNX;$֍uqWgk]Fzks;n~QX?b_뿪dѳp=#sazn^G4L@w,T |Ыy'q+ SK-z@ +:׷ۥz6 zw_w&z{ucI `6o yW/bwaذCl8.68 +>CKg@Y}NMAf ܱQ\lo6Z=2чXl윃xfly6צLתzC_oEߥwH? }Gwg~#Я3BNGo@)+AYoz[7 D=k/zqDcw~g._]~Uwojz~ϧw >wϻ6sR k4AWvwN=|~%^GgWΡD{^ WGƿ?X  LŀSw`ǀ=Upq}1b# wc@3a.P1-&w3lҒalsl6It&c{a_30_냬1׀Af`дu %Ơ UhC i31x- >6wPk#PMQ;p9jF]VF%u:apy,ga.'}nC08@t zC0 Z> F`P`A51o7 L xSˋ00F{\1pt.y8?%c`d^1Y0𿛼ϝ!и' \1۸ wo`` ,뽘?a}W j 4t-qo 2TàCap 7aɖ1Y{ ޡV} 5}0jO/cj].jȗm\0o: N?08 c9:GUܹ ]`mw`pk}IAq/?7/jMکkP;~|7Q;! |D>x8ϣ-v\ߧμMeF@0^APۿB0vLD-Emb6_Zm8jo j}''އP[5N.;^ZQ[O]~F֍/ޘO^oW{l fx;uTc`h5Y5jc֖35F]m޾>wqooǃzx;^jjω7mi{|ݠ>|ȏ?&b^\pcbbކzv5m?6[bP4 rg 持c"[`H>vbW>bnɯ ۑ~Bѯ}{w w ?OaӰq t36hGol4l6j>'.f~@@56|'bS߱0l Vc߱Ao2zɯ#6z%>CkKi^qֻ$`1XXvOx/պx9=:{Tt?Aw&݆^B7e[tM܈a&ֹu:y ]fAoΟ( zxNP+x?,z5D`ͦй#:GGgm7u%g%:2:h1(:vEaM=th 30v_)L7ڎh~[3hgcu=:fr,V8b5)4MU43Gh%Mv>OBCdUmJ=~j ݱ|_3{.|QōG4c>M~@x1Wx P›!zM .W>@eAe[gxy'^t!|^K^\ UJxd b;TL^>BEBgzI7EQ3xukw,-<e@P1PLᛠk@d(M6AY7(;ffx{/4>P>k/OP^rPnqC/(3f2r(s~OOi*x0< O]^ (}R PGzCNg(]?JW^JWMqPYsGB$Ҟm RUҎPڻS6ɷŷY [CfPz`7 BPze-,S(]gNa> &PZvJ_zAk+T\_yJK"rO<{4/o 魡[^Ƕ|!|ٖ|]g\f6FA)TAɽP+c{ĭ3ϡx2? e(*􆢅o3:O&xe YH+3XuaQ[/wY0; 4Dc0m{?9&.ADa ƄԀQÈ|? ͅ!a0P ,gAZЧՅ@Vs5tu:dC=3N  !yVв_24{ۛA*sos4c =^&av\5i8 rݨ1_lrh /,}&qFJ_j+J*IeRy&=t$DOr[_n?Nn+R]Rr%JY%ZJ҉ґ6h iσҎҖZҚcaҊAȁ=ŵVH~8~̭/uJ,pZ/|=r%rs5%B!4WzK$3 {OOw't_Z?X>Z9HmFn15 W /I_xV?+O&={ԏ+^^C?!Bܷ~ںksF&Z_S_{u},}*}s,OO}|>zGVVnߍ}n5{ym[/wy>Υ;39/svK賗g7z5W@!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!bBl˶uAH",C"M9X=DEI CH>0{LN*6ep^y:Rr|-%KB=$XP-!QP!|0F>ƌ1>d9c[op8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8r8p8pu}x9tgsvC8\--[{j%-ʑ㫸~!]Z6ߜMZl]Hual%w{seE{=@clylY r2zN'&9ڙdnSNUb{RPG6S8s {]}zBSWm1kkN׶{p2l<1胫;ָ${_]}>[Vz;ݲaՅ߮.0g[!%㶜! |o͹~]}yq5ž3͹ǹwzXf"nݺs˽a6Xxse/q16OK{P[W5/i9lK]2w'ֳ7뵹]taY[w>Oa{_l޶1[uu77t|jo;7_ז1< je3nCw ҥan^ ;[uΝb#eR?'Y{,s(J+M:SX؁;c'6N{}MNk,Q6]˱/8q0q\)v*Gn˸bö{Oy8{*k>c#lDֶ#_u;ΡQzmwvu܁vmhspJyYb{?|u me=a]'SFL%ׇz`$w;_sCo;n$z+\uǷ1gwAl}oV3p{-6ObnVIjXnXͷ^+be誺%1&ri ک>>[\Ǒ[lcg-OY'Ȟ$7y\Zٔ2[au߀|³_k [;{հj9W]sR޺{ptz|DZ6~m߲:zm6ni5˳a?N-6q s}x'phܞl=s7?+)07沾!lmŽ^ܹxz|mPly=16❰}D 3p}ػLCj zmMc=alvCc\Ov}{5>=K2>ϣ\sr{]=>IwaG<5 yNsIvHZ얨l->_k\u.6] !v#2n|Mjs׏Sۨ؇{;ֳ5ہϖkmS9a[nq/k{DuS/1XOl>r g1v[&{lPr2w/؞sc]mߺ^LvKӹsk~1]:#~9d;Cj9Tc?Y[oؖzלͽH^k%qn#o_1aC]sT~ 7v⎶Csݔ;.cƸmaks}u<.;®spc#y=Ѐ<[e-ͮ`Q q؉{yj,g;(aXn{z Z1v\'vÎ{XOXĘ2w2Lز)A}ϣ†\GU~Ѯwou]0M߄;(k ~M-P=5S'smdXTmY]b]qx쵉s\]bqYoԺA[ ZK<-n_;g au"}7[/xw +vKZ޶C3wxwpVďr7kܹݸC7Nak)wZ󟻭xQʠiNm؈c+/vbݔn=Z #[6-n=+j_LnIe|vji.<œ{^Nk˽,a6>׭{r9>2V{*_w3S˩N˹oYřh=U%[Ycm;JqWI~tW/߅s,=S)"3[X/k={žDKr{ofA\ b<=$n=k'2q%kA푷8#-fAxöԻ>4`Gi=_8wY{k=va_YrǺ`~mj|6~ܱ\sj3 Rm+vKa8^-mq4w얧9my}oPnX'g>\_9vVon+uj:>>m8=F6PѼw<^uq2C_BmXv|kNƘ΍݄nY Mt=pWcW7el ڛU}{lFd\o}ꝶenq/ؗ~wSba;N͡a ?'lGs}qչ{f7^7e.AMXu.)v 5DnT%oyi;χ|P7CoōuKlmRx<[Vf} N݌.r^WN-'ř eCͻ~"δEos_(a]9w6ɵ({[%nil@l&_>/vjֵA6ږ:9>_Z,0ܝZM-ߛq/6loi|K!s5ɀCؐ?c1wPX؆iźޛA5V_"["Y/Fmma\|Kecc6Kk' wjǹ-AU)lۣu$FqQ|P,b.k;6c,l}2wmiĵs6YfnYif?tĦkރsZܡQ<1`JƍiOO7 Vϣ{XV#u UwjiMT! x-Qc5ɰq 4/jn iņ{4㶶b߄ pa氬WW~'-y3w/qczu[gAu58pquGqť'3p8axp8p8lp81Zc+9T}u88R-|?pz +p8qpp8p8[PVpYs8p8pX\ or~npc\p8co_p8Sf>/p _v8;Nu88ǘ>p8p8pyoq8p8p8p8p|J79׼p9'K>7LJ;u?P {p8gg^Ϲbukns]':W~蹎subc?u=Zuݷ?W'εaG=vs+k阽si&Nw,8g vyl{ |皷'W~k= =d|{.5okcXދ߱-vcp5ε)~v.>s=q1=ǷzLK;G_on}zos[\}s;wm{{B/V<'>* ^󕷽p={[+jl)?w| c,<#Bs[^7K-{4w3}nr܄-cpsDz>y sg 8ϸ{?-C=`ñjmN_ĹC.k5$_[\hEV&cP{m{`o_%\1zߓ{O|,WǠ\\"~ _p6f.cAyK8v؃c[‘ZǽsG6S~yT9>oQ׽{o}sǞ;~>w.W3 {]{D{qs1ñ -n ש1L{#ozp>Qh[\>y>qv܀ym5vt깵8O9?W\gnsK:G(sGCs=O˹-~8Wq^8Џ1>ͽ?\нe%[sHXz&"4׭s))4Վ<w[{Ozn\}u9ǀss:sjsB(=sSeZyosmsk; v,`1ׄs;#_Sϝ}sñ5߱=\εu?ў8Xñ}5qp9w\Tp8~p8Wl;p8sop8v8׹8xpw8Cc{l{S>Ի{Խ59¹KlF{%>[q fScD롻k;L߼O>s?vճrNu"+s;ܚ}dS~Ͷky攀e OCkĹcy \O__>~_o.q_ P`{(<ׅ{e8spxYͷ徱w?/k*ms_cW-J<5e-^&SiᎥiC)TƯ^]rۛ%g$8>}]}˸(}P9Ss=e,?}r(W8oWۛ=F\o ) EgdYO˯CA_^(_z=6m_8?)iy4;z5gJ~.\37?(:P/S2|%Lmκg(~yWҟ]nۯ st*ؿYdEި}.s&<(uK;Tsh'^Կ#XT?||W?*ן>_Οdd1j_mz}Uϳ7"n&@lCHދu-c;6G鏮3يE}3oQi[e2#Yͽ%둋Rϋ~q֕+ϡ\lvJqE֊FK~OK{_~)-H6jRmSgR?xw'gE&ǿTWcu}?(>(c߉N:&/u@ѹ7@ s:?םbF1/:7GQƿx׏G7||~>7$_x|=?~~o_}|}쉿O7~Gט? Y##_7Gk*F?؆__7Q?/#?xGwYȁRI;?z;8r}9&#?x~1-z|Wfa|o=&z|(O_suWǾ72Nz~|X8虬k{Gb/\ٿ?e_E?wyNnIgN'満`R? zO?>oӏ\:Ϳ#k5/=r9|&==śOYO}yǏ٤?Oz/!xCY܀cvAkˏj VRbk⩡3B٥z^%qTۊOCSKfB>moJp_PdO5o˲K<{LzkypC|븇<kSWp>sxCݧ"K!%kנߧX+ΰ|s %>kXev Il8 ֍p]ABe蔬zu^K8p*݅}_/qC@S-x."&Jq)2JL,misyQ9>6Y}Uʠl^?+Xp_sJdXCV%X]^*sC|y;w^!T"N78o9fSR E8Cڷ2)ox* w_o)`aN뢼OlMy3M{gOjː96'enOӧKTl|O$Aq%^{1{7- Eu/œmr= KGp\w[u퍸)}΢Ҡ=8wFӵ+ܗbW.HrN,x[1%SeH"{fRᄡ܂ϔ>K Z ڭrey/zaiГUܖγ@+HGo5 xVu<ְ-uJ-T&qz ɷ/s7iߨ1DsHckzHF5eΤq[!~Օ)u@s;б5Xu[/!ip H8Wp'miީ.s?N(Nߛ;i7Tmtei˛Ës?9;P?vostm.__<pG7y,]@r ۜtj֔͜d `?"XpwZ+S2ރmt xJ|}3dn4ZEkd/Q_`M257x/- cuҾNCܷ;1)׵,5B| emwj>Q Fc„d-$_Ch\*Y 2wV{.w8>;Bɵv&$a;?GOKv{%o _..A?n/E5@u (;X#/z|8J~A_Ir wI5Fτ ryolO6B7g9.fߪzur~ם1#ps^T眇bC nkUPf/5V~ثoSi̎R'\폼׫, kPxQBϔ@bmEοvܵXd,8yI&q %òHzتQi%Z>t wYޠߕv vr0Ql: AqS0͙\ɝ }l;ᰧSvm/͕T_wJևW'rk.|,6 i$Ŏ,iרⴜE1Aok%}ݶy/#6-5Kf_^r|7DpCxNxK7AE* 󁃚Kp][W5\x_'t:"?+cC N6wbx~?R0Χx.Uv\7D3TtO=>|dokxyʐ)lTGHmiS/"-I_Qۈ~STF>w2h'*աd|Mk(_s"siM㭴 W˸ԛ\ѺE8:sQF|0\=l#d^^@΋ $uA] {},<^BrK]oL\Â>4bĘk]u[ 3W7}!i92\/6 $փR"s‡tnc28<al^W(HE_d22s)C}_Y;pjA7kF,'uNᅦ< L󷶍2K-c5!{\>+^ʥ1Z!Py\u%xɭ~͝mP^7?o>;}ѷc۱p[O\y^ϥv[b%k_wכp'<מN},=?!clh4SLY$v>v?cYݒԵ؃,u A|Jce٧xWtJ00RȺػ2nuQZN_$Az;vQu9%.}W=$ߪÄp*7-zѹ|6P k9O./C]NOE~Jw%B፪{ /E|9sGn^)dm)fA q?YCgwSs_ )>p_GwFT7qU +Tޗ. ?r[CkPg8ՄCtN={ɩ)2?e/r+{zr߿̝]q|7?nos*^"o.s:\]$f<<px9ϲݡ=y$?by߳n{~!u<煗S͹KPEPǸ:BC>JdmhC!I 乼GαS}4ayܽW=ɻ8_ϊ *}[r>!Oq] -ʛ2OR|#R˸X6ٌV%p5weߨ#n %~ʺ+t 1)f"kP^N|O}䛿[_B`n[|WyXP2T}tNӠpʸ5~`:޽$G͌4YT9@b-1F'pWgEQKsH?-:UC^EWyDy=@+^?K[C{QIIBks =-OI׎sh;%f8}m䷐\_+}yAn_RO+c=W%YUa e} ~f8ų`'8V jl+ݞZ8+%k+9?8-NYAƲDߕ,?ž?7B7DG~I=Kt+c%< HC8T˘[KexMb#~Y /<S_Uv  x,zsQ֩N6ϧ걘RN.<Ʈ-mq󴜿kz"iPO1oU9_{ 9-ɘOg]P*/ 8kTnJ|m8<!D8d6C2F"䌉oҙVCcbT?jrs@kf%rR?z ~I_^V9&=d}y [ !7<9HC[ )>5<݋~5EGf}!h=e|h_s+h,c+9T6sG3á94BΗ"&ܿ-%8si^Mk[P>w)cܗe-*:|[p l8]4'wMBy7k/p'm>:.b=E>?e*BqۗURPX糹/w/O2{hvWhoqwm6 S)uNoC;Y{.}B!gk _ kw&C9ylK֩_Bb蟨n H띲 imPK߇cLNt?$ߟr#sc]`.O2qq+rNvJ8~kK{jlGprNk\g9/]~;!Mgb]*]Zs.1Oӵ/E%$2Fr+>c #dCWMSO)Fq}Zd,5C_cx!qIu];%睑N5|!q 9D5d+ޥpfQIWJ=ޒ>PKo@FARAbŎs=A SwX.<989%7j^>f+{"'z!QoJun:YikHwPLאʅ>}W 9jP:-Z@g:2.J&b4o`e}:RXb?|_K症؟A;~{=~a0&V%̽z=G"gzed}+ f+G9$7ؑnjC}X{OcC^ LE&=_ǃOk?Y+!gMܔIig`?ńҖylI|kFe=q|俗1p7?'3y߳@>r9:V*(c+۬шy䬍Y? 1̹[5 O|M=t7يоoR9-k}7W)G5P˅xf:}֜Gpk EoU]*GgЏl'74q~1J%.d]@*³:|ڷGuF4z`{~?,v2PywvRV+}YsK-r["DK^ >s>!v}j8 yik GKzնSI2rյ;T_@l[HNQkT}ᗨ^roεճh}dMބy_ݫMcCdnÕ{IIۘ-=ϴx sWRǟ 'Aasy|>6brGH>I5Jv1Zk(rN~QR6}nKExdfD2+> =@G#n%zd\* XpJn -NYGф[J=pR%bY`;z,C+Z_o@qAX P/R0i}ѩXSǙx|=Kv疧O:Ⱥ׃ Ѱ97!Y>:t.PKp%}s%3^;lq ?U}of+^KRNwD51\K5bZUj7!"d#rOVsM(' r pU>o^:ϧ8GT aL?k⁇z}+Lmo!ƒgY+4{ArU?!|pk,A< {A3ҕw J5~gMvKĪ؋l;Ev.i>>"K珐5߫$k\" qd\Z9b۽4.Ͻ[6r[pOagoʅi;^:km>}mHdĢu\pNpDO5*WBob\b>@b#$AYW{4nKuR?ׯp 7w<\>en.5if}yWܟ6m{_KH܁8; *<(Y'SwȐTDRNY#W:%Qel+|ɑ$[uDc8+IW\{TT"9 9NwFA[U{փp*o3y?5O%%nZskмv[ J_3G[7JW"ׁr4⦹ 2dY9,Qn5$dnz| &Stܛ_p6Ԩ])+H,)*]>2MQrkt T{OvNJxm ~Kz#ہU#7 (lNdw;8NzMMQ\>AG }VRs!f3k7Jo;ᙝ0SJ;e[ʆ@wIJ p5Ȇ]NU[0kzcUy.Qrc_{vߐsf|p#Ƚy o+[6{F-6 ^ [Uo@bw1l#곱,o ~mCi|Gaf!>wVd#D\ds;GTS&sYT}{yoYJlO^NEܝ87s_^uA1:W7 &no<>E f9}s*Wר Q|[=C$*}==}<9D`ǥrP|Nd2wwamveҝv.s0{D|>S;g:x g x$@Q]=]ȖOᬸEgp>GnV:3AԸ2Ɇ0`n㷐z n.T<<`w-@r-نT޳or ;;kiϫK=Io$kABވ;6D9|1f}SQ^g͊;{ދgY$Ts o*H4M6 {Ari==*Y 9ahx#l/QBU̡Sy~cl;ޫ6)7N5@GX^آ6VT[?* n!!krv՚\_٬ޚs5^j. Tu^CϹ7ls:k@^1OTlj䚔2j9 ܤ؅сxS^s\ E@lQwm,ؗ3eNu{W+faA ZͭLڿZFܭЉUp ീ^6v { 8O b;?H:de ux2yS8Ij[kP wgαOUhe)ܝԙm&Hk@5ZwYgߛd|4psgz':`S!klU6;Ck73xQyU>j"]L r;SO=׀EܟHJ}c:g/1Ck_~W{U!Pd-7$eDyDϙp_.eYQM<>!z%s,v?τ8ׅ!s^WݒittZ|}c\ OtY6 T_*}<`'H\_ҫ7+S|崭4qB>!Cbhݤc{U#bNq`„k?tաdV@Ę5A# E{qHGCY1=ȣ7uگg _C:Ḭ$G!~ k᫸/LSKKn wC}#$v'c=f+c,OV%*qE^B>*?myspU \m$lC:HdT'ZP^%dmؒ:̄F||z#B3[^ Nk_ccm;U9݉}-bCvNJ,ڵwe?`fXп ;HjN!;6H[ϕ|(.L' rNwB}{R[݃cy.1\^TϣV6EY:o8bsHf /A$.7c? sֽ*aq)Bn~ה%75;1g3.??^]]|/2&c|nPr9z8 vK!y|.^7|wZ^d|Ho8=dȺ륚O5P^V:l;;٬&oQ尼 ż2H]>gq+}ʹ\QR6 =mZYj:7JݻGלloz[ȽOm*5'C9^Ρ;yynݞZ3R3,3njLU)^- Fk%$}Ϡ[/Ѷ8V'{0&)rۏ7GRo %4wGvj;r{ȾNw,!},/-k?>o7Eb-G;*;R/UJ;cW3\JL}w` qۛ^ߖ=pѐA,רNu!I{Y\*Ouwm*5 t,zu:X.9Koyt,c =\nO&@AQTxc4 iQ^jX=0:ܿSlf:ۄ'9w9[n9w ߿„WyܡC 7S:U|&ܿ%kz s(j/ @w}5.|TkH$Iz©?oDγ>PN!<4*zS>[|tu|y 9%w;U=y# [ ߢ}Sioi3&sK~C5*y#!k$nPVp  ArF~yt"d fg%s2oѭ&uYDQO'~ɟ5^N&i|Y|CW#ĄWy~t]9Kp>o]#d}}ZsCJ}aE~ kålԩ&; α헼-s0^R穭+qͤ"~Z>Lr5vS(W{wN>6ӍԍSA9ND'g_unM@.iMqPG.~h>ݫd9Nt| Tx(uN%y.HdGٕׅ\I+/!kw?ϑ7by\=}v[@/}f'ΙОm}WxI[3,R|ԸL#U7y[+^ ͽ1=>$9}$Oa*ód3H\39xP)|RQYOb#g{׌3S{Ha@m'/9Qbs9+4tCsXԷ)\ߡ"iIN=dbP*w/ -'q2rCx _>Y^ܶ?BrM!f{)'s}PwYCP^Irw~+%vjg$kVXOE&eۃMV=&_$?!{ 8D(u}x?;}κtD} {nWþ{En3z7>q։n[Bx)E"8{ގ"aSNQȾX;.x5JΧSlKjz.rB;zy\^7H5өKcexJ^V64PΗ[^{ ү~W dGOJItoz[(-sy3q?>B(x줾/qwg^A_?~%.ۉ?Y`?9z#ch{!zK*/Kߖ{ {qm!yw==$!Kp9O$'Q=(]ZPʵXgcEu_yqd_5uPx"ג=q[TϟAgJ`;=Xp1<-^d,_h󚲰޺9i,q_.v 9?z.pjM8QZ͠")ruh&Y9lz-0ϊPgdY^C|~I}7ףν7-UmN U~_Bg}CrK}n!P 䜃RK9(AzVڛ>=%x_YqG>FyޕyLKk9?)+ۃ1.^ Γs[/y|4)9!vm%m=E7K.yMuQ5ko!Aց#xt{KgrgysY~\V:5ϲ/!P^9DŽ|?7ujn7Ld೑HiyB8x Z /y[tKNS}Y3z/_8Bx^t/O:^w`1l~XY_ -'qBlz}-Y $7Dߢ~[Dm?|@>hSP|μSuةu| Yԏ%Yflg uopqGHN}Z(+̸B&@4(^82Yl&H5wi(>^us.23ʸr~a՜syikfׅsP kV<.dCK?đ} y]J:C}>(| KU_rv~8jdor}N~~_ .> YS}*c4Aӿ1!d*C,qq")q- MR n5(9_lgKX|vK9x ܔ1o 'S,e>P?[Wx)w%~'>"q=\Kv q]@։o{ ?=0^|j^c4_Zv}jlU.YxW [#d͙|;!k*kːo)ג58rĻ2돐ڵ yOO(P!g32.J݁y*]퉼|~o ܓ>xSGi <'"n`Wi6CY,ϭkTu&nC_BK>Q>'ľ;"-1CyD?s8g/ w^5CA^Xɾ6%\-211^|gOy:*Y#9 k5ܔ>%Ȝ TENЋlSNaY|Z} pRǸGu9 rS3POD4I$b=l]})2_?kڕ#dlr<{Qo䬇*m𸾫?R V1d]"Ip_GDܡ:JtjwdDNSs'*u}{}9U;p!کI'#(̸͜r-n'hM畲^%[-l|8rߠt+| &gjZM~UbKfvKX[yT:=|2ZqwچNq~|skd,ʘi '˾;*9sVny(m>s>EU 981'suum@\߃ ;xsiT6xxނ!U':lzO>`~5Nj o^xoT{d"# c;|of1Z_nxx}&UX+ 2ޠ~Cד5ΣұAʒyaqcUyTCnۈ7R>MM}Sȟޔ{@|2FEi6C;sI/G#X8yo~!13GFp(p=lӛ~A =~Y+<Tb{@WDWir^ XB\TQNu:*Ԝ 5ny'>h:Yg^un s=f2w/:%_k(|Qt%HyA_4Yr"sWt)j;Z4N|^v\-_uJCyτǢS[+kufY#?4ߌM۟cH{Ls_!֤)wl>v1KܣO574.}#J#*ZnK7q^ T/ cl?bMg;2CmDQ%AU^" ge (mm\Q' zmjgkCXJ#*;3}թqNM 9]E%Y'ȿ7❐e}mA) -!4 g^}zO kdPc;(Y#i /XSAq\GI8/:qeþy|stLߌ;XI?Tg?s]6s ]1ki[c@˃KC$g.um??ZRw4"knEor{Gk&^Pz=NT+L;%J?ZI2ʼmQ٨+T}zG%V jKe;EuP:)K"ofIKkY~]UNk72$p8WY줿Y&3|kd S5c%9D`;}A|:@[VgȧAg}Ne?1So WPr>Aڇ>[qsl*D\پz'Uy!k5VzR.KǜeI\7ѐ}Չ3P(}S~XDxtl 0g's 7j'{b{jDT~QAP}!tFRn!AL*Ҧ:zPoN3bS wj ɖyL. Ndc< 1TSnBQ>sÊ62},voQ^T/V9P%P}YNh|~zZL0?rsgnC{WH֭ok]uA^e(ц9㮝,þP}>ճE7fqy.@k_u2j5Q2gR5^TxuY-;g k[`syU{;cߏpՕ{2:Vxx(4HPLm|Bg k337~i'swu.Y|m,q M|,X|zYskxB3jͭcl9PیjoA9|zRK |W%6eYh RָPa~b=|h݁Y.xpzXB-򰉣T{ }=;{Qt{sow`C3l{lSl;Ay ~2-c}v&ʐb|rXC=_ѫ0-QXsYq2WBkœ, 7T:(vbmZ_k|h7aI/z_(`?5G-cpfT˕I__O~9MUnIܗjwz2$ܡn|ęꗎAo ϗr}ϯ2g4biśzi+֛?*Ati5)KRy(7 T~8ϵVܝE3y[bo%ޤ:)}<u=9=m șI ' W]]?>c#AiluS/O'qw—?_/@5V4e;-ʶTB9%\nO>\PϨ:r-S\3ºsi{|.K}MZ3p27kSa2߃]^;J왕]1q?BMXyܼFݗX7\^okN%Ni9NkM>ʭCVLs3L y|-Q]ƐO`y.eMu. /C5WG \] k}pkpE;}Pru >IGt qZ3/mz|6]rLo>uɚ("3Nӊ_SʒoT9x'TaRר~kM<{Pv2[Asϕ'#㫵f7 7궦@ϺT\ruVOO(ߑ~q+~.6n^gC6D>Fj{)P s|}R3nsN+ݞksI:n[7?c3֯ weU9}7:?u)OݧJdNBu9͚o:ez<{kUdT.+u]~o6_Mfũ ݞ^侬PSCzM428wDS%0':o-@֍w՜{hҌo6l #ZlRs.+分:`y)?-Aڄ>q7,K[•oArxv_eZ൧͸YJJtV(o:$Զ 8=tϚw?xT26hn\*4}\wUIwLLc-Üc\V|Q>ӔZ>K;gz.2\-9z XZM _z[?eXqkזz z{ pOd>-ykL+7wx^SsO?ۋ^^'/6mkR˳&fvKTk@5k^Z KokǏΈINmck!sGCk?[+L3[cƝjx3w|]*1wwB%{Xu9ZΥwyW]Sa4 \[c_~G7Weh~*(1Fk';~i+[ߊ u[l5L*_.'8> w shP_=Qq'?eO*^]9g*`kKkQU|XqO%+ފ[ݻO’y0)KiKk|yDZCq)`6[;סrm~ĩ.gɩ[w~Lj{ʢcɳv<6Q%K^^krN}[S\Y͸l_͘.O<qQՈq&Rx֮NMM=c=fGQ9jܱXħe (yT{,6rg2H9Q~VQd-hlm t>0PYrաֿ[z ޴Q{^O\X?cj̧u۳?k[CUN׊@;>hI;XoeCs5jYs(}^g8Tnۖe禦Õi5Q͗|5d&Tm٣d7Rs?ݗlykqWuyX}Z$PNX`XYeM rz Tg@0!̟WܛcIv1ÀuZ7=golZgkn1NZxܖ9,tXhَU<>3}]3(Z}mUOt<֨||WYCεϼ]|`X|\o*31׫֖nZho%5GY%Ss$ٖDc+oKrR%~s(C}]S\CåV߱iaV\+uw61`Uy}߲:&A5ף΢^Kg nn@Rxe>*X?Gژ&ՙ^kZ KSa]ہ.lE.~Qͣ:іҩs[zU@3nu3 1ߘ^yQZrU/qYwgdK<`=!Xq2:p,es[cl lqy4s'։ ?ݻ8kxNMjdHNoi%#b>uii>̿:;_Ƕ5/nnL~}p4UT: *sr_g*cUqu?&C?hn ,;U+,UVa?e>}AA[>C^,W :%XQMm&uOzƟ֫%Y/ȟDm)ߣLAeom;ǒi}^&':趨8㶆ȸ~ߎA3;}ü8aSְә#@,iok]w+ҮWQ̸/U?r/d 7\~N5s%| s\$REhΠPV4_v͜)(7oEo_ϼn2rQ˳FA@`]s}$v<:E:9, O)KK(~aNWB0Su,etA/dlM7b+m"UPk'q uq%jBm/atN 5;1[,֭0w_#=\˜Ns' _}ߧ{n#Xx}y=we5 T1P~'ܩ9#)N5@{T9dW&iܱ*-yN0"k/>zv}Mܙ^!rg?%V:uW_Swk'`˝j.;&@ɚ57yxd]җYlo{xW W}2-ϼ}cC^&ܣcQʝ*T[A|n>@/zcmVwب89t.kr՚;-uY3ᶧu OW{˹%۩IKlSPg$L]{_$a1b m#_uk}*Aڛkb፵~ur.'QdUi*(xc.@Fp>kZ0K~~(3]lCN ĭ^f Hyʟ:aeZS^rZ6?/+_~X+9SkU^ZpQ͟QϛGŝힿ*Yrdf5|LqmpIr~d{KЫfnmwZK3v/}z5cp-tjDcQ\m,o.Q k4 s-CC4zo­XBCT y^mBF me}Q[qJ7zZ,j vk R&JG[8zZG8Y,pi?13C#%DŽ4V"Xϫy_[rtL59s?4Bטּ.1ס(9^yԈWKz/$0s8n%围n`U[j,o8;y,s9nr1Vq>ޓw"s=R=}mNˠׂ uέ6y5@Feq,7ϘsjPcNMu[>x ,@q%T~xR^S޳ewsFܖ9Tsߠژ7?*}JYT;Ί[PuMYsZm,aN9sSGMsؓ'@5dDJܷk+,;\z[ACUI}RKn͙ҫ~M|>/ƜѾfzg[i\IgX@r? ۨթj>u%1((㼊g2wYI~`jM2*y 5Bܙc?=s&es^Ojd)u(c=՞yw|#w-N-l{D5ٚE2T}C[{qBH&3<.52p2wy| 6omsuL=D6|'a?(H'Zk's3Swז?q%t$AN4I鍄zd~'Z>c3sy۟7jujssGn_Ae0.qc\28lDܓZ(`WMcl,rN+nA^U_ܫ>oح3w~͟ 85α?O7}SGuusoOLAVCgzX{>[OZ9Ux g,о^ 0 ̌;=\A̸~ASk}_殾{<\`;]_قwj锽 ~=ɖ ۘަPm>OXq_>M|*ߊ[ߡ֯ӊ7sXm}(P!1 JJ1ץ ?ߪ6МiGHdd[rղ) [:7b=͹K_>,-q4v/ 7ZPezl[}~n >Ak7j[ ܡ j+3`*] Nmީ61g^,! s{5rח6]G{'2U;w:ۢ }Ӣ)qu^^T˹徆^}5ױrG'UzC7\qPuCb=Yw"w uhl;iɾ }^;pZ;~P>r /j[P\ ȺlS^OJZ9̪ |M 4vZdn+ުG{ȿ͖sC c~ڠ5, c j2ETD|hM螴v6r+ -o>ke&RUި^ձn c -c}pvu}kP6P ߀l;> N~J3ҕzS2Pd;e6ͼQ5;l*O5:nH wTNRϬk;ϱ[_ǹN{[NRWc*Őwr-:ԲfM 8:sXKkQSc v"ߢb-oJnwмs4"}yNѺEn}xx.*@͡Ɉ;}Zh<qA1@珍jE]kJoGkρߡ'q|M1̓4s&`.VASYRW=o;cgc ;aXg@2l;㼬cWsf*C g"<Ǘtܖ3?ˊ;t_32 VMavkoUi-V}.}mߟI=tL㆜=_ns4C=v=oeMU8{3n.H72 seHuNUw3T?6nMLШ v NSn:%k0ֱoh;9I}\͸~` ,3+̍+QVe8K|6j̣/k;։X}WZ7߫Zb-AZ s8iqEP.9?52g}z}19?a5Wl7.b1muyiIƶ.4)uj|Z\ő#>\4_NQKߞy }NASO>CsjXgl37DsKY5r2 :56/1dv\-@XNI Sb7z># *&7 pwK3g9Bw=Ta(kEѱQt JZr:pNs hD TgCen5WU+Aڜs\Pi`[nO1O-Y {,Jyf2g=>;9*"ќfܟ*yھ7Qy?[fNte+tCX/c]FM 7,T;HLOVZKmX^dn9e;Q^'{w|;տlvil[ڊc9s`_o6U6o澗f{/<+jr95-6w =)YGNCa {8@2uƗfg32>Cn3YFܽsY-Gx/EӾJ9\6i8MAȱ:ֳ٪}gE`8Q{uz7PyTƖT :^{6ˍq̞q`v筴Y9,˚4egЏ7g6ݠzFOn(Mҩb}ST6kDm㜯-K>-mrsIİ;}le{{?ͣz"bcD#r=WAڜ8-wWuʹl͖ySԊl _fܷb^{?jX3y g30i[y.syo~ 9/5|(2P;L@'JxiS錤[o Zu~k&y<rJ? C $g\d+9wjFA |nl(erd=~oɟYcչ'sNǼ;/Y /ʱ'Vfn __+- 0,(U<΢ |&uPu!BlT똓!}ѫJu۟ :k=yjOМNESA}ѧ*H7m~ >K2PV^I(b4k3(wn yܡ1E0/kG%exuPt>ha:&5w_lG vs7KPzV擋1yd>leXtُ`lgM|^7ᾑ26{c%oy"@/*˥ij8Cs?i&!vE{T1-g;ϺZYBhAeo2֤ȁ^q KxJ(Be kD:n!v_+y cӵ7lzhmt=(sf LY@s-y>P6\ i(cjlh:"ArbC;ch[AޤCg 2 g,P>ḊۣNq_-s-s[Q$ԹAt/H (jKm?< sd6Gq 5Fl7>=7:Ծ ;c_[S=DӒ!`UPm7w,KjL%}XfnCGic;=v2s]y/)d#ҦWҝnPmד̈́21[o:WjxyKQ]DZM%׃)9깃]=_pn 꾠/:Kѫ>b25R{5_'5蓊peOl=*y|Qt|W(u:zX븿C׹T9^/$RM!̾^!m`GWs(]PUyfzLI_uJ"k}.#Q٪A0c'?66lݭ}3SCs9p˕x3g~%_k^+~^suY\ۊM;+JEsS^b|޴gnH~թT0Al 26gVܡi(}Xg>l35[j}FHԝcwZ*Wvre~s͡BR{'շC-{khdY[mPr|>pP<|Y?gznc[BqҾW|֝:ɲZq_v9j.+Mu)Ϋf=Ju]뼚͟?.{mb :ۑvRJf xϛI[v~օ{k8]+;&.m3˦WN$N3_Қ`'M|A35fXo6+'w_ߍ#*:._IθӇv}Šg{,hí`U*2ގqXNq-撀:6*j56PT~%AֲoW]_ʯ0K}:ނuTۧ>XUUӊ_5ykF\3nϐy7r +clE]ekp߀Z֬9 4ZIC-^ܝ\gA|P!ZX'kP W]}3߬įPe(wV=#?Fk _vϒ%'s?K*κpFV`HsՁGyN(v :mu W,gkzIRסW'fA\|ֺMTA*A q=ܡ58 ճ+а./qOX52:@?k p! uq՗{GT65wcn ;]sToZcq<z-VirNSS+NB?DWKPP99_V6rQK0KZ:|\ Wܩ9 K_+mܒT5vW7[Z:'2@5p5_ uWv.-뵤C; w2,UZhtg^{굠8ÜS6ᎍ.eޞ>/ZQƏLpϱ`-cTkq9?q-?@WZluN ci%ΚTjX?DfkBCwRu,Q xWl;}C.g~%a ckjFyoZ\hܡi %wXG~Ss VeкEߓ[qc/^/母%5\* cPW]?;845SItj{A}K賺`fTlD勵rlgܩ_{އZY\ֱ'5m_gn<>Hg{rާC?yx*$Q=#hIkߡՊ;_ks=k(Km [ҋ's:eVX=\GSt,åU =Os{_uꚚva߃o}U| |ۺy*Cǒ[}^;y!Nϯ9=o󙖝3Z`ě\98^5,&>Zl_Jv(#>n*P$Ǣ{@ðAq'%TzUܥ,kvZ˺Y{=dr'yӋJl1mY# kVϬ;Ǟ,+Wzno ̭3~)]6iȄWs\Zl-|f*=OR'svP>(mAS[%WI-Pf}#Dm,k݄JsSvBն `\MF鿣Erw2sȹOϝϳjZkc}{π>k įcZ͸l3J*kC{ྫ9:9,\™(m19_ʐëq oUF5Nܱ#B-׎ps θÕ:|qz3krz͹?o;4:{=}ѩѫI>OMɈSvie+ +sTmtΌ{TmKoPm/layd;3[u6YCqzr'߷pNMs˄㊾’{ho*Fz-R&jskm E<6bMЯh}Ws|<14k V{@3fξ_24c;>)ڏu[d5AmO͹rĭ|C9tLkұoӌXbYGXfZ2z_e&#'{_9sPlH6W\X)I9Z yI]٥Kx6ܱ/~>8rN^=@_4(]1D#swD1mEَ{* mݷSĝ_=$w5j퇡ix%?kPckZksNe}ҫϊԘX#hpFS$W+Tu_gȝxm.4}knr~}c{ѐ;)9 >qC o>Y5C-Z)wP i%ͶX9&%ݩqXwd[_zo["V&Z؀^[#7JOO }#籩s2$kCPшo|$ς?FE[p:[twz/5[Bx.P|E sA^Vx۾ж|"rr}N342y|VIύ8;j-quVsW'Pϣ7}5uirݸսynlꑫN'k׆ZUle8 EICنо;m'fj)N~+ܽGXt7gUb{N꾭lɹjlv^7XOgeKt/!̝V~k얡ֳU "V·z7SsF毤=qvmT& {WW .ŧy-y.IJFљQݜ'{տQCі^j^޲ 4dG#nZ|OhmNqJݫzJЌor²4}&w/[1w@e^6~PvjP6T_шbj]Ig]-3ORuwlMTc==Q'3s'f Φ&JșSnd̳`;T啞-dnuFR)̢zݟ_Iqdn˳3-hT^Mʣ x3ߨEz-Ĺ|qGT~pMk+}'r!u~gc|^!5Y"bAͩϒ7s;^XM\' > \o>oRsxSPkߛ׈gfXS&83s 6k0o1ozy9+;sqm};'^`ޙe2+P$@#sF{{σJ;4M4^Kni/aOCCݷճ j̨\,cg]0iC}>J;3gZA/Tg fBj2WuKT]IZB㌨WXo Ϗ%I\N#;>&_.OۜQ=[jn+\˙O>7DJjǒjj՟'PwWdA뚶 'sߖ{ZeudLs4sc]e.yy5Ap?ߙr;3Aw2oӳfR|(W+~ 3:(_,5/ܽwB<q2wTujӼ,g(P@ٍfҩZƨ/e=p9>1FWc`(ױ qt{. CP2QuPo㉊?'۹:e`瓸c5!T5{O|ldjM7UXſt>J.+XTMq5Ap:f{zk's͘=7s h?Jzt1zPCfIt^#-$5 D{7tu<극,ѰU]lv+"_4eb?$5ƂaJH ijAڙ01MA6u93:ke p#z-bo3e?YrNb+P`C}Sั^~kζh:7m;- zEP3w0n銎 bӲy|C<_C|"w*Rp2wTq95(R~GgoUݓm]+7^LJZ#RN$ֶJŭrV;'k7b.| E+VYB=g[a{pGl۹nI^d>[>]SנtJ'teΨ4#1_7[Fu_snl]x2oϣpT>8Dp_w,?] 776W<Մ$#+(3︬͸!k:q^Wxj)0mܩ) m ;b:$덱jBc]C }bdzjIyY} ^&/9*OƊ!^h}藾RqqZlc[m|ⶡm$c;sDkZ ՆR+|zTth;ؕ jXPT'V^S#~;է j<3wOvGsy875WhռMN^YZA,eÅK[ ^ee^e+<1ghϓr+mzթ1d?*P-,vK];fwH^ϸAx*mǹ=PD֙[?gfKA`W2w_s Na̯(s=5SЮ9[t[s%SUZL?|ɘ;*B-K,ؠ]eI,2;HXyz[ફY-o澩LAVLbFߪsm*j> W~XCCPւ#xZk}{1ɋ8McwE5LK_ WR:#;}P[` 9 A s>Oku"W]k1L(}z|p/7oĆ\t;~>;sMoeq&jN3[C;1P8jf55 gܚG%6~Yτp(}_[Ps^ߕk.C4.k绯m^7[T:#uŹY(9<ܵ O(Ο%шidTbTsh`7"a`t.0y5az>Zϟ/^ s͸)JsM*w=HLm&OE@|ց=&Tfěj^2a8LWyS:؀b;>Gш+0x|g\G]uJDŕ )\k~l^&ܱn߉;?ڒ+E1>V6_>s(bfWAP{sb7rNWq%\tv'ʽ7Wrj}Yy'e'{ϥ >grTfۨc?Ym{?E=u`9_0Bhś;w&JӠti*|Q+^yW 5m>6FĨu6wd)5N}?avD|X˚u뼊@e L L{._ngUwx%ww_*}Ki\KI^ںjc[vEC} 6$]l%xhIwҮ]uN>~`XЦgi=zd@q;ֲ>]d)=" ZB)yנt( gsɮUBWsx4֩IY*SЯd}[C3Ǎ} t t|&8݄VL1?6X0y_s'5oOȍpg%}np>;&kr)OۊZ-v+۩ XSxs'}|r؇E{sJft*qFeC@vucl@}NRRcS䍍Fcϊ2}z.vUz&I,ϓ7sXyҢOTx2D A?ܩzcCkaWcN%QɈN7ȅS':ޛl'㘸BuHkt؆^Nu<W9ي;9#"o\vK->k粢rP=qʼ#:֤sQ,3Uo[{֩)cw\jCgK%۝KSc=dz1*y 2*!w,|8ׄ"7qߪ Z[l,[#dM1(f}gCBy=B׻;n:H~ AAކ;7~i֯Qo|nlNq˯ 7Hn v ,_r] YSἯuRv~îz|}E:q2z oAeUWTNHO憴'ұ^٬A~{[^Y{j[Wq|oB79sCY-؃zA n(塹l@e?PLC \{81cu; P[="$@0% &!ĄDI0 %_B ͡D7݀J`c:iݽ3?uziWєgFm$},[p-{dq3_ 1f,ee]-E\낤6kivd"TXvn&ky|ӳd>wQk ՄZٹD\8W~E.NX Hx[fC$^ _+;Je }_>.\-E-QW~P%ezZ[+I"tFe`G_m9W֪RV!+HXؒ&8NEdZg,eO+qU~QyMŷj!YqݙGY:ŃO Wv 29nZ j! oF싵[g ZA4R9qU{(qފ8giZ%3!ᣄu'D!n1տyLע'K~+fi}FҖI'CKsdÒؕ4+n*wkT+XOD<~ilԮm0⾆\#$é ('kyOkl-zؖGIU,H]K~n3poep?_9A2O&>$ioJlտ%˭2[^|_jVHISѿ*[TqVS-w/Z:W\5b"}_ZJ"M}Z>"mdHTٶ6lަ/!RY/lPnÎˎ{.vgITwg|2Q2%? Z-#U^_s&77=_- nwϖ̓zYǦ%c/B-[![9HWc'ᒰpw8/&ڱVʴ4jrid2"ÿMMj;ܺyyNқ*jtr2!7&l*ZʿMU &Α\9 UBN㢴e2  Ԅ*yەqVuwUb w!n͕)rSmq.>s-*jeZ}q.]srj0~A_q²4f2m͒eTzS>KJkqKeq%snoDU[}&,%~wʫxl/eOLg.4Yރ0Z[fQP!.%[EgհlY[E2=ׄ]VV0\3?E-4ATOS"ޛjqQ$=toE;;EVk:$UAg#[hjN?qSkW_O쯗y(;,L%ü{{dU_Kg2m*- Qs$Oe9 [D .OVZMkȼʒWe|ҙwa:_$wLӤ]9HI۲߅d˵v $s}%wNx-[=EדyJil-Қs~S2K_U ~h 6j+܏mZ5Op@5)|bzDmNƵ*S LoÖ$SeZx\o9AcRr>75Vi[BS|g}LgQy絚~7Yt0Qml HJK/QWf.hLZ[[8`bDWsV*MP~.Z=2-cseaρxCƹjNL2, 3be*r;J9YoCX(ô6q^= ]LU삄ףJ,q9)8 7rZ[6lUcH[DZW#C@Ѫk]ͷ|>){vO6Td KX5zbTePKƻj }5aߪe> q BԷ$̭]?𙔟 q]ڿ4m"Qux7O)rMJ_Mׄ=&ζy,"D>jf,yy!Q5Ust\{wD:q. ςԥ g[h}܃~hmx Z$.Hԫ?j"j8ɞqhl9# },6x.U.JA[g iZO虺կ4e,=WcCqhn|ƠE{-b"7IUBd{I$*"=OnxN}V U&&"Du/q 2u$Ჰ ,/"T\ϗ+C}+>DO:d[VBa^ԇ~WZPEKu(V蒲 E}6ˢ0gB<=kef_)$/ln >lC)9.#aTNTH΃/,x1GqUj%o|+oBҿU~[gtυ>lEVا*\-O'v`wk|z)`l ~|RWRQm`+e^?_ O TB8`,v g/—^ Jq?}QXX M95-HVS:B6<M9%Z@'}ymUw.pqBYwckqH}5` =AMW }D};Jb/ +;女Ai̙$/v+'sfC4M`-A yZ*V l:JmJ\^V; _/`KplzpO>oT*oWr aP |5|IY>NyqMxNp-K=?ןALڃѳzJ9;bdkTv1>'l~Ĝ=,{.؂[s!b΃Ctj ӕX HΣK! y3 33~EnO2|AX׳JR2M/UoMkR-Sdo(_}#|KsTE5)7UƬ8ՒΕĞse{^] 3Ѹ5뻟_SmW:hŸ3dTᒰCbh x2c߻K9.1yǿ?>M=ZV.zM7A<u>cYKv$|4A{*2Bո\hnZ_Ekܫ{n\GEVs&C|ZHףd=5*l)hV+\=*}5^%7XRDZS(fA< hxm ۥJ9E<'í"ku7-iI%L*;hͽYh^OpmќYq,|5&=p׊ύeZRug[ fϟm :'7|ZI7Uj`H(i<]R~\9w|d80Do!z.DZg_pgC=2{v/l,2fe&4mCt~ WZ|ELGcBLt8G$OՎ#0ԡYNE4JewPt)We?P< ?xUkpJ:W8Gj'\LxkC)!*[ >҆Z᳏/$U1ٙ+/QG ݝ|t.`dwٔT~&7QvAb<[Ec?'du6%c%=$]Z~\+q٠Cu'xͤd^ lvkJ}LJ-X\w?ל>MhHo 57T4fR_"sܱ9ޏmHH$/洶`\ScUѼ&7$`wI +o6ttfTݤe~[ۿ+cJLDﹱv YTy> r=8ܬlm#CG}l;'1cjaޗ!Uwq\.4UᚲE;ן8zDsu~Jk~{I #L W!Ņ&$*b6I ae~j($+=oҔ:s\Sa~M?wN[({1λA 6Ⱥ8ӊ;0;W`6/}'S>r.Bx,?ƤڠQ_ci>K!o4\+Gl1͂ļ-SC([d\wJsHƃisRo`6E}Em~*0"DcTq:7͏[ӹI~bjϦ45>`+S 39D9jn[CsD}`ЩֽF(kgVri8$S2%ؾ֗qzl $ؠICKk{b/EE<ޙxW:"]4cހ]ͯQsy3Czw=}n .@$רτ Z{ S)_Z7lqgjm2yYh5.)"O| s]3*dg- ͝1&vgN/>z m!8ʾ" 6ja"r| BO6Z@lRvz_Sxƨ]')^ݤC}([OŨm"#ļ܂&DvhY s#v1ekk2MלɶiYfKkѿ#$Kr Fm`L~NJV,\_x_A u3WD)Hrd=+$}PPX40]8om$s1ǿgH$ ~FqIh^rXOuz6Uۋ79ѝ9''4M1(Sg2ʞ!j P6δxE4f9Ycy8KkM`#%V$1{EJcɵfO]]Iњj["d&vC?xr,t2/y8w]֡jè<&PN4.Vk*=g"Xg>-Տ)b*E>k%ؓK9G4b˗:L̈ 17z ڻB*kѾ`Sis ;#@pG~/.r~OCfAk!n l3!Q̄xNWu ޘB8˼}KogLcTEO܃z1ۇx=U+S1~&mX3'Z1!C{-9ևh-Z(RF=7^kPg|㶰` LkbO4P"ؠ9]hʎϯW  "O: %tuzoޟ,2tlI2] aL?&mTw,,LIqr?i)_MeQ}s,W1Xk\59z9zr^"f*>w5TrxҚ8&xDyƌs]ad1Q\E&4ևJeH<&mq>Z L͏y<>rzNi jTל%S)b@˃sL*oc*EC%>Gl/?.g'm`slo@"r߂]Uu}LZzc0@%g`{Z{(u8!Mchqg==׃Tc5i% b6Pkyi.2=ݏǹ{\IdlKr9Ycc^1u8 ^סgrE [kcP%l`OUZ7({@I g؊P{<|i_619uCQ*$6p9@x΁X,SswWJ"q<_Zl{=R5L19gKq3؜x Bb7>KF\ kj1HM٢|sLM;nM lpM*KyUj<2R*BűssI<t}O lڝς+lr}mA=0 꿏aTE!E`Z^c|9JaG*ǹj뗱}KL~jAk !< .{ylWPFb}1>SS|\l>_w^_4ۃ>5dRr~(oAX G(v2ݳ^Wec?^+Υ`L6Ҙ`%_Q}FF~Q?n(}lx39=,rIA٘AzoBzZ3ɩS&j;TᙲA;L*Hw%岱s3{"T9`hM )H1cЙW2%?{|cLM'xX%.C}\Jol`Pc}Va-{uC!F91v}6丠o_gR6pew\"Eiv@nݥ^> !T58zY*>Rӹjb+_2Kk}f}h/WMJb|DP;oR~% j_4w(&l +BCl12al|vuh=\8: \Fbb$ld<~< ɼƵ漾'&\.IǷ5HqynZ3L,=GG\=a:ٓRq`Lo*9!16L%53,Pk~96D幗}FE- q!tI;/ vkj@+Z))-Z:1u9E^<-3ŽVcfKq:3VsqLudVl`rC\rE풢] A,\0E?ˀ\_Q}8 D^?3u=+;,[ `e=\?U S{#l?9@l!Ŋ|Td,s~-sT}`*$ۗs-忱̣8Ŗ-V4/+ZgZ+gŽ?z!%b=OTkҖ VH]jotLѳ7goZ& Jy *T?U1qpd`_:ϥ2%<-}\;4=/]ccv.OU86|xUAWSw:<&cyOn*`6sX+֗cST~uLJ=̜`sԖ8ۋSyb&ݤ-)2KOX~\tyܴ9Eo;sq\mP*_w!1͡Dד{d s9͢vSls9ԩ*ov6ƨ8٘!ZhTA"? ޙ+y$K"ɺK=nH1 qX6H5c`+jj !5󖩂/%6CsBH<T9FI?2?Uhi?oJwzҼunoS}=>sۏ}&=d\));8My\.@ŵk8g}6agiS{Y_;Kzق[o i_5iGzw\YZӎ{6/@<*z>_עy<Ƶ=HZH yd$5(]]1/!āA<7-}2ŵo;su5+FRxnΫ_k 0έ1[o AͥC䧪g[ 6[gBHMgAP"\Aۛhg1W<|C=&EH琥<#K9=,8Ơ5ݙ_yncZ)W$\#WRg.H5,;aCyjZ!CCCz̤ ezH?˥h K9!([潋ϠMl%xgB+i-,0ǠT.d–h9/9$s_ wcF3XelsPؠ;>'|VGo66@Y?0[05|s񃦤 ԗ6A'7W`Cyj^;&`bWx&l0T!&B`,r.'|ey f}D}1ol/ݤ|FcN\ ?6rR;h!ޠb*1vEY4ވ{GG>FVi. -^=hZѼ\H 8/b;My6BcJ~PgrƊgV!#`c*l_+9E״DH6.h},;<|~3l\A^GŇWlq80;4ƴV;Nje=K֟|/K#g%ۂ~Äj`j$#6sL iA_RjD|[1Qkztf=WqAb\W \Xe؇h=Ey-3!T` j3!yuT73u'9;5-sCb<ؤ\H'MOB\q}OkC\rEZ,ySy2>^=WQ}3Ŵ6Q.V+>>u/s!Ǥ6AnE?mPsτ`M4YI}dAw'B;8Cuf:Ӓ%bo#яO S:sPytZHp&:y_"'&L&م_c w[3|G@b!Q^ASl}Vl4 ՙg5Ƹ+[GULI4eΜk)<՗ g*R;c8yD}3rY"!~7Ϗ3׳jV4o!1`Rּd= BoS<]E/YΘ 4׼X\hhAxx/1\UO}Ϊ);:s3%xT9 o|G/yb&|6o ^/p x|4naz5Ugҹ*8M݆Frs +z䅶MH|D#ͷEꛐczςJ깵%Ikjj\>.n巤nZ9CKjxI.8ӣL ^y9 ZY.>dF:sL=g֏y z{Lm|Lx_բlQώz̴te9ܹ\lI}WұoP LiK;`b=7l5!?LsmfFW$3/Бmp5_<;̶Et<i+[mSmx1Ȧg6XlBm+]6u)~x]9OÀyCPj'n$XjVc>ߜ\} 35}~;DW߉c?c˹M {nb>@ 1n50ey(ύs2λ}:݄d5 y1 *hO=;**.A]s,ϗL>[}iZ?lTyޙKOUxI˖ff JǁNd8d3uItgzy\A;\_]i~U_gpF.BԿx'C3T,BN&yacx<.xm\-fZ<kq4{VwPL\Y>6|7A&L_/XXIvȬ\(U2KcU`#! A6Hg6"y{ qf= T1*wDfM׶?sF='"حG ᚋ3ubU5,=on!d%lY\6+g-ٶg%ӓlm Z6L}ƊgՐU盖>F}>^}_cΩK+rI0}^fX,sly= ׳ Yࣳq:/ܧ}e~I!iw׃19L9==bgQàbփ솽6Y s(m%ܳ;7Sj.mWod\jz6 JY}og#ԇ^i`=;p !ݔws[5;aC3V< wU6&Q vVh]yl)hPCBX߶ ]ڧsڐ%\zQ{)ƁC!TwUhFFf6ԐimR^Ϋ紁ՓlOvj!pƺ9 d.>u 6 B@}4T{m" 3 `fo[hۀXaж h(SBԁse+a/\[J;4BXnL m@C,BX.1ӲvC_hۀ m!m.m@C^hۀ2<"BdDж Ș0|zs m`IhKBԁ]qchfپA= PB4.(ұ(J^;/(&;BdL86AV[քpgQ{mKhۀ mPC hȊPmqHcX~Z}ք hEhۀ 눝̒4|&lu^ajoӆ mPCrY*۳ֆ)m&%z6d_6ʎ";+M_ZY֐ͫaϜ\o-0{]/7@4ж j5Ոqy $m%3ZF@}yc}IB>z6Q1maYжu*m!ӶYBM 3η!\I!m@Fם(ܲ͢жP6Tdm@CBdXy(m@Cƅ֨ͳ8Y6 B0 {P텶 m@ mжBmjBhiBf^4*)46^/m@F hHmPC L0^ˊ]7ڤ 6жuȯt mАm, {) mPC6 B4&\Ihۀ mPA~+m@C6 cB4062 m@ƄV2Β { ci `6!6ٜwF۰ m`Aڲ.%z6zPl#7{PfUmbB~ۨK3zC+5ۦlӶ>ũWvzVָ"Lm { 'Uѐfp099U[źT`]r^w|rݟ%IBL>6a*MH'x >t!-!sV20oȼW1=&PkkUY'mWiBLжLRm1ķՅ6^aVppmEnDz$ȴNۙ:[\|ُl Ն\:`rۀ ٦Q-Kxo[)MmdgboHې^s>;vS{lUc6Oqz6WD|o&9ՔeFXNnCv `Ϲ#`37F.#B[l'yMVȬmRB ,Vί6o*]v 'ˊV韹6|c0gab9i̖lC|/:;̶`q\γN mJuhC5UmGU!$˖zwE>.[|^">Y뀛Vbsov5e-٪C!i4o`?޹`WlUg! 9{8Rli.N N8|;Vxd~+!' ũ粎{jB4'T =}l'K7 U*Ǹhȋ!TUMl*O7-fSu-m nS,[l=Wb}FcU60IiNClȃ[ m4qRrJN2f%h7U9ni\ŕ).^-i~V߷l%Eڲ(mZq3,m`Avr0G笍0tMmlwuno[-du}߸`qJu v=mO3JW0S6q)ZNX3'׆0ߖ21l7SY 6L6N{^[fc;;^&lVɶ!ٔs0YؕYjmm=`kw mPAt=b[Ҵ/񘀚;&m{v[ZKzyeV1M/LӟɍU 7ӦP׋ϖn]g֓mS=2`3)l׈s.!Gr^6[zuU&d#ަM^>k~* S,~nKX6fogPzY]W -0ws ZvKQv-q<"Uc7TVOl=۲ֿv,/]h BdTgE|Ɇz02-ͷm@CV hMhۀ:6z깏m B4Ԑ!sj:7lQO65m h!fmը{ж eNhfmB4PC 5PC= mPC .j'8!a6Մ̼ukЮzݖuPŕǑWb7/m@CVreOGf^V٦жW|[jg5"6lh&m@3ϒq_89ͺNz Dzvm@CjW[g<0z6^-7-mߟ`C:-q֙ ![1 feHkŒLN8YIsi%e)X|>7+9QYd|v=S{]wtkKX1czoݜc #?WҚYMoAv%.WZ:[h6]jfAEFXB2h +Bۿղ5ktmX圆j{jjZ/j'|jĵm,(׃Nb5l[Y'kG0BLn>7l;Na\+9KBRZ-[qv -lqo[i>c5}7TiFV熪w=̡k({BF4no SI{ m['=X ƽӜА)nT3Kڂm`QGVg?oȎж YQԡh!d#$meaݫ=|zWzж`ڀdrϏnȢĘm#=|vn5%n6[gڨOH &X{gU(clȊж)!d=m>ۃvu!͸ކG'[s2T[۝жU̡6V̡JqPõmC@F0ZRVZ}!}6׳%m@ȃ+r+kXhۀX}VlYY*n!IܪѶ Ȯ|]6gm,;6dczP׋-6WKw. Ӛ6ՎRz >ʷPhۀ+ks~E÷-}(+}!vzz6AӪGL iN.j,.fzBlc eKh4Kyܴ껑mgln^5m [=76cc6BC>aiv:as#`6 u/|ǃ >'KWm,A=L9jK`=Ԟ[ so6mIY6!6!]o .ӳz6,Nbڔ>aF١`f[I1~E}lfB}-zZ"L4k[5k&L}TUmB[YZb *9%J JzX46yz=2+nwNX:ٜz$Wjma*|+|ƲvZzvuʧ_ &mA/[Mr{8Z_pI{uw>CbY`g=cU>Z"<#dNMJYuxdwۗ"_6MQyմinM9Hw<&6jۗ Llwn 4LihͱgHasLX,g4 vu8s]H96vSe.KZRg}o'\܈:Ms{'sb|,m)Kl1.jc?cjXvd=޲-DuTlJa w"q`Os޲sfߙ8Zk}56I}X-_%Wd;=O)[D.j đׄ(ZSqّn! D/tv٘[!Gc;Ǫ2GkSe}x/,+DB ѧF.r]c ťk .T=։q9pw?)'"0cPߍ%|wA~(̠O8بI0>Udm/.υq4ΥҼ$Aw𴶐o ݎz%v 2܅ ;Am3%TL_Kgye"X3P>z!/YVxy\לϝC0Ljt|UH!3MKkawV_k*gڿ,b=aWώu"d`l}iEۋqؠZ=R6Rm!ug`l8dqK: @]߰皱A1b|EZo=[K[I\Sdz|kiS-1nd-$\YeJq i6yP&TˡD"3h5UnT\+ lh&ءq*dZO8 2+:us|ݗJ/W89D >\Ӡlͣ^~7Tȴ}gN.l_/J`7pmIg]1y׳ S[= mPc9˿}ޯ;=wn>ջ,z؁cq`oN]?Nj"EqxvOw:h'{\_!kvy?zG;MW?/2jqW 3|P7O4EoFO/~<_Ԧ/ޑ_8G;_ >?`ë >ᰋF>-_;ŏ;󋧟di >v/D3+?tbk]1a;tZͳ{]w}/jB>1rPEudWk8}Cg[pǝyYKr\yÏt^Eg;#/tg_r&=xnq]p?~Ӎ;ݮyp|=͆899ח8ޭsҜU?ο9W_y8笯8\ˮp.ts_8߾<Ź8cKKwf\7asý3s/?{˹uGyuνΜ].s<{3Μ+={_u>Νb?*_]rqs=s|3>P}sΜKw\{7Nq)ΣO3q|7y;NvO4yv_8m?yUs/<z -:/L΋{㼲+۞2<s^=g#?~Λnru~kwݭK,f?#vogwF|&9o5ZŴߣ~]SK_NIvXD+u xֿhЪI~ڣPeg󴦻) jt"u>ԼǶusr:suzI:jg:Qjx,,ڍZ^A-4nJ_g&Mx4 4 iEЄK֡ Cĉ;=lD<&xM4Ҹи ozOѸg8.4n^4n$xx# :=荃scqZq%qm:O_x4nh^qwNkHv ?n4 i4;hRǧOS_FcEc|ƮtLcN?:FUXFm<\t844>q4bC(F]z5~r)4i#?L [iu?M?}u {v4iXh%ПECs{A{н{q4lhsh֤F?D#ֺF\%<+HlBE44꒯hݓi;9=4zGhјҘN1vQP`jvyk&|sT4fghiL4fijgҘU4‹4'i{Ogg?l#4Á4ì1yپ34Sicu^Ak~ش`j?}skFy{jjz6 <9j/WA9j_rjBl4fш>mjL;lFԾ)/j}~! pSP_[}#~~KpGQkP3hhh[\Lc;4viT^#4)^ %8~[ث7 >7Dcٍ3sx0W-ծ}WES?yEj=ǙAg.AԾ}lA=UԾԾV؜^!܏)Y4vjڿ2wԾԾ}g[ hiИј#ϣ1ls6}CF؟Fx:c5a N#F }rg~MiO+iv7N߿rL/Ҁ~M+/y0yuZki#'D>Nw.{z귰/d_Aԯ­ө=Q+GS_K3pצ:h ΣME} ľW̥ZߤΛIE% ⽝#熾>4k[Z4`inH<^Ga=ۿҀ 9tK~30i 4,ZIJ_׾GۛV|^Z:wˍ~GH+8;yZ~~urvQsԧV=F0vpvrnΗO| ';_l})W;]}OWd흝Ňt>΢OwyYϜ?yo8:ouΛyػO~yW>y倉uoӜ輰~筎w7}`Gu>/Nzi݃m&մV~$h^&AM'K)֨o-ۨNCmPD#?F:F#({7s4h°5hCw&-=oN|:m5i+:inMq }f-~myCxy}`Or I[{VG?8mm} {~F?"?ҶJۭmοx8Y4iюL;giӴmhV~~rC?mC?}b6lN;|s]v_ǸhK]#E|[:\Bt؟o/B<?V:騝=B:fOۦq/xS?VہNs:svoZ@ص|:e\rxM-\Nd-NiN+H7~?+:U'3Й[|^qڛtVtVaWGgo}B:S)t}?{2`5?Nw+]fptQ#t⋗72G=c/[ J l%'%Bs'!t/ҥExlt٭{?zvtM]>b >;no"%}W;?8ӯ5{Oѽ' u}'}L}?4'͹聋~N =ǝ?rEq4=φȫңS_x{;@x7zbKO,ގ<)wӛ̊3OO/ro'ܛzӋ[ q}*_7^L/mw+rxe,z厭^W қ'Gom Mz;]+5>w!}PZpӇk.ϦEC|Z4oWL~>wtyYiϏ2}6 zig&fC˹.]>c.qq>r-.wgr_>.Oq?3w{}rA pW8xOw9~3~G{0wő/+y#+Gs?8JG48w@Kw>nq|r~[w+?8r;W]o*qW9rw;.sW]~O6t~]ڇMq6]3mz9w1vY뺫߳=5& rowU.tfs5xԿYApjvGk8]k4wq;r>m[Wܖv[~ma?}֍&o&縭\Q[׹\wF\n;xbwpwЇM/w:w+֋ww[Nt[p: u 囋ܖwq[?myd/ݖ-W_\:m`_ݖ?>m9lkKݖt[v #e'ܖ ے6n|ynuWmmtM&sg6_s[OcއF0HWO|0wv?u;Oݶ_s:q۾msq~Pp۶mܶOv鶍m[{m98Âe} o=m88m|p{ܶ- ۶͛nϸm;|۶nAmlXmgcs7ܶn;nmY>wjC}Yo]wCv!9NwqC}!?#w!#rmn3>w!n[nm۶G?;W hNwunǸ>^ﶞ:umu/mG'ۺ nǧ[GE}a*vww#sfQV @a2QqV;?-ֳfs콙ŚA7;Ѡu,(EI[ʢP(  E1DvT4Ё3bk;+^& hph_Na=b)p  |"X;N 'ܟk Y;U8l$6N{6 c tupzG);DiEq!x}Dոg#܏}~.wn3R8΁sx[yEcpc#/· 5 !ϼΗl*i/1SX. z2EF[,\Nv.o EݦB8B(v"-K(mduYHs4ஐ¦ i0!6ҝBUOPLANj(hZֺ WKy{.Yuz*u`,aO|ւ3 ^SE܅[ˋm !Hl!].ۅCH:!e!u"jV( 08"]( B^(tBEB%bwKB~M(6lP*C:%W B~µ_T᳐jMR'B'$MBr(~AHs' iSU!_ҳ*~ TA? J.hu}*z9`౛o`/xH ޷L& _(JT/y5z#8#Cpl&8(T{$ nbA : gZ/E/."R8J}>:nᴯ4jC;dJ8~%,cp8^Q8# IբwxM*Ir>^SSEeEχEea|cWQ?WOp|nt m|)/%ńn5ͽBaB ΫAk_壝f~/:=uP:٭oDνD+ECSѡ|^^oa/ڝ&.|h8[*چmk+ED,h]_XUZ4RB2h3JX)Zt,; {ˢYRѬV45MMKM6MNƫw}1K`VXs0#5z_ ݢ$QVQ?3h?̮/ߋz[?ug#Έ:ENim|Q+y2QԜd+j5|5ɢFy>^Y+ՂjuDU*HTmNT -ׄU a({v(ktee ω2K^2N2ueQU#J΍DiBQGQj(]j*97Zo,N ̓'ԒN3^%:>[vKWN5]?g7X?w͓ R+o&;xP,k*-*o!ݽ["Yj =O}Z˻K/;Qwg9Dܯ\rerW8X.]^JPxqz?cQ!r!\Pj>aw_|wF;o߮],uʑ\Lo rіcr~ɯ[u_%բ+(|_^~/Ց_$)/6_k/Ԓ_ܑ__, Kg=gQYkSgy/qA~RįdBE> glgVV -?_%y \G~+k6{'EXNKxcD^.9xZV!-3LҵE+3ZD Fcz_%_uKq !򗈑As>ȟO瀛n7_咴:rv\2\b_E.G.~\.>pF.^!/ŭȟ~M?=(\_tCdi&2??kqo}SrqrqY_^?q~$W-7#w/50D.uM.^G.S.{&_;rK9C.)7G.W.i>K6w[|KξrIrI>rIrIb+ĺ\#M.~}E.K.TY.>I.U.޴O.^}C.^B.;W.Nk|k5&@.ނ;ŻziOܒ7OǪȟ";ʟ:od?֎?t?̾$h'?:N~R~WrT~7wu@v40͆+Q7EE3zȯdȯWʯ嗷{/G/?E/BW.?ɓ~_ ?쒟|#?5T~bU~@щfUN=䇯Cc6W$^+ 3\b\\\d >[˅GɅkgȅih"w 77 sfʅyW3}+, 㵰D.|׻rrravU0\{e9/c{{b|u|w~Gn;[&_NmIūIMAq9Va/|&_"_ ?$_}_:|媫||9|A|i|\\|!$J>@+=J>{|]?L4tDTK3m'7}j,,[rȖz[壪:Z',uM;ɦs伅joHFUÊC,\ C#ɇFNMȖȇ&ɇvCXPS>wW>F>T| `o@a{|97!A㑼?d"yryC_yϑ?7ɻr΋rNFyÇ.Γs]N;'EoCrЏrЛgXc٫<:qvJJ=J-;V4J|RiWVijc"*CiQiz*UZT+[Ye^rC**˅TKrU[OYfܯA.)_,,2,w% .sUVFYA怜™ )+XKiZQSi=Di=:hzuxzjbOʊʊ3l%*+]um[>ӫx<ׁ 8 Ub`.LFn+  s^{w`60ڙ-6f2w:bj)0h{iiis`2|p֔l ~89pg$c7'|aㄻ'A/șx.ЉYhF@M6Bf'alTdX {w`^8&!h5*#eџ#`ᗀlơK8kgQlltdc6Fe\SN (.N{fcO=O7ءk'6vBtvСu[};m, j rK]Q߹gÀHl7xƆAel8x0p C`!y1l=0) >džlIlFW6 _g7t gׯ6@aCbeR BaZ)6Le:4laoHbc# -ه sg!Ydʍ7{mh†Mm|p`[ bb-.@K5-&6<\x,6 gÇ`~dcVl,W-} sy;WpGllhca $7xdjpн58c(x$܂5cUaoX|~3l5xMZpŰ33qlZfc w }'lL?%b虜xS87 @I Z=?>pf/vw8Tgq,dD}ѿzQyl4?{5[36D@(ZrE}Qp'v_u6W 5/gQP:l(A|3{B@}Cݰ݆BMn`]n:n]]^ ݫ~U\zX}E)p/fl| kE×ȱGpq\yyrk!9< Q!a(x"}Gc_8|0 0$ yw$};=PlClVxqu6G-yj*x 6LeO`ן/*ֿsd}Q9ֿX([^+8Xf=O`}{[ZY?=Y8s;N~;Y5NϨu~eu/_~!9ۅs Y$'>!SXؽ^1+Gw`}^~6d!;LR#Rˀ/GÞ8'g,Y.Ή87kpF2C>FȾwX1 ^xf)/?Cg-W mYvvYYk7~s2ق;~dݍ:~lka7X8aq7)OA3?GᲂW[x掞`ºpq'>%} ?=d[;?\cRmށfB-+} eQˡ5kqkUуUC\@-y Ul\M?Ρ/^"8+ū:p2B/{~1{Cz's/vĆY[=8#.d_cÏJƂo[,SsU8_@=B%y*fꨩ5Qk)Xjvݛ7s #5lBcz [˘Sч`l邞 ;F?>>om]0w2o8-['l GG,=\3=m U%r,;QNf\p^.٘)bƿ'JBKo-RIȫ8<3jzfPpDA  <^ 3K43\h\v׷N#͑[O5V 8" j4Ԏ#gPWP0ߢƾB}hfڅsu`ϢF[:CЏGYu5jL[!Q3FmZ&571 7b/-5j]zХY E?3uz yY.ʳޥQg{>]Q;c}CoyMћ4BޡV0JW6bݟǺ/yuh^i5=dݽͬ{ׇT` ;yuYg^ɺ#Yw u{_.LJuٷXu 6a]ްnu+ni9n%֥.pF|:2iSd :un5֡AXuCͺa}?O_2dOlYUf]"ֵKe]k[5MYנuuYW -`]Z0uVYWjk~`7_֖cG־`ʬ}b۬}@*4^ ֞ړX{l&kMY{ؓ'Ykwe6>k$6kOeǬ]= X/kv^o&bmBlb춬5gk#Yש<'άq=Xy p9d0k@.񬕟;kXۻ:kWֶ kdmGgֶ=V#YkoIamF 9*A֖ȑsqGqg6#_=9M|0#[đpe;#϶ȓiߐ#ͩyĊ#9ro!GlZ#7Fp֛#W/dG.Α*rdr Gƛ92 Gr2i{rz G})c8r! nƑQ9)Gzs]ш#p7D>GB>:S#{Hi] CG(G,p~VYԱzRđar85Ykeͧy?5E7Y/kQsOfe͕Ӭhǚs+Xsk)ufAkve<k6iXy5Yf)kVfp,Y3gk,mʚXk<]kDDfLm̚I)x?kʰǝ5ީ}5uY3ԃ5 kEYְ3k\ԬqƚXcW56x5Mn+kZAاq'̚a+c}){#|∟9kC("wxOB8AG܍戛9j#rĩ#̏8{{pĮlv '݋#L:X s܍#G5#t%)8bj[@?,8$G/1*#y49oG>胳{7{;:#Ƌ9~:GrDSQg}?X4fuq{VX]ZV?YV}[Y}m/-dk>ӌ'BYm9jSSVb77X݃՛:k3zիX|tac7ɟY=cmY=3XjnVp޴Mg~zj<ì.bٗÊY=x=`ΐXjYm{]籺+[YM볺V׋cumgVW*X]q<.eNꏑU?mY~Q,fGUoY]bdÍ?UzVQ]|ϪKXuƁU'n꘎U:UjKVDjGCVmM7ҧjm)V\ȪeYSq/ YUѳY5 ڳJ}UDzj'VMJaՄ 8*`Vfg60۩fՐͬeX%vՇUsUzV~! uV VaUˇjvUװAXU+UYU<]˪Ry_9$? 8M(:/p?Xr ~_/s8O?O|Hny8[?9<*{sλc!go[iRᛟr7@99|Cg|8|e2e`]FЃ?1GZ` @GX>[p&fbSJxfc_~k p==LFħ&|Y ڪCIC9}_?c݂="8 9iϚGc鬹y5yց5]yKp,\W+9Zy5#E+8y6Gˑ pdw#{nH'ފkˑ[38r<Yϙ#F==sxGjƀ{`nHTpdjL~,G,k_F Gfߊ9b܃s0'ȣy %З_pc?7qS/u5G~Ğя`+{XkՁ֫1L.fFs=cmqm;f"3k{bṛ/RS0Se֎9yk6$d'XL95kcXZԟߊ]t0m>۫v 33Hy'{/'c|ysko)3Ҭ}%fԢ}=?av,fs+U1bٽnՏb]#l\ss+ֵ˺]0?/f]׬L=uv{la]/w(1s3q'b`Ck`?ĺx?r^cX{|7η7 |ɬ&b2 gTRX71ϑU:o439uuQĺmºDb]X%cݜNKIe\3d¦[ͺoY2/{̺a[Wn$֥ٳ.:a躩&8nTeFyl+ͺE;ԓuG^ ݏiYwb8N;- z2q ޹κV{F/=YWtuCX }YúeֱHWuGa7y٬oe}]=of=zv}\jb{eX?n&."Cβ>X.\BY?ϳ>{ _Җ/~5JkYq:6`}vsYϚ ϑ7`}~ObY Xv'gC?X_ԙ?C ul«T6T~ȆPk5`CC`Clh= 0aRLgCXW6?cCj6h!7flb!l~φlHlÆlC8cQ6,ɆlX] kؐv v aK%6lX6φ軷4cÁl8Ԕ Gjgs!,3rn 6P3/Y6\MaAlY .dDm1V`4<|^–qF66`ûl `l< Ao-~c6RgXƑmj,6VxƊX*X5ՊX?kgcl3uX=Hll8Ig66596hƖllum곱m0就6vtecD6v>ƮUhŲb}6bcd6:OXNg,ge-(]f#=c#QY2`mlW7|o\wl 3ocel:&q6FQƑ8*l3}g>[9!߫*)tAl;~A?k-`]/g| #j!|oߍ૦o >";×6ȫ x7b >r} q\Q7{b1g G@6țQ衆`k@6m$bC~d?CL5E_HH9|}5_ҷ.PgX̳Cap`a$0^1Ϟ&j H2}9 bj@,n1G[i@:pb b쁉ܱc;v pb s*g:ŜPZ̉UȘyxtbN `d<1\S#g [X [,옺b^P~ BP@Exż X l\c1/| 2ż!Z+ż#0Vuj_ WYcXW ú[sLӠW59 FvNc1g od 3` 7vʀ}2%g6x /-> , WpdKǾt" JKzCLŽ@wWW-5m3Z]V+}aKc9l_`*0  X*O B.`F)9SrtNm 7q #i o#/bZ!hh ,,΀^<9d ~-Pbs-Ώ >5]d1N Ϩp7'f1A04}S,d}r< 3b[OC!u, /݃/q| t|396>(o1K 5dF z^ 9 y h1z!G}Qșӑ~1=<ry =7y9kF# {l3X}G#_G @ly =??: #qm8Mh<5aLy¯ <\ o> f_7<Nu_q?u@T @|[O0xl}B;!D9>a7|F!C+>FdE\FAw=xBn2S Y#oDx|'ͼ=gFW(Hԡ5 b-<y|! ASo{dD34.i +~LB{'y-F-/-3211nȁ P31N_? ?!4:p:Ⱦn&X\3OkckeIܵ \ y \xZ\[^Ya_î˛Wۗ!⌥)z%%ș% ͅm!rt!b~rvtK= Dyȱyw.X |u>'IXH-`ԞxԞx!vc(Y8o/fÇ`Yxf&d 9g?FČ߀ZO.ENk[#GJ"vT#T)P8z鈃pxjZ85t*O7"BaȃI$k"8s" AM' '~D^"cċ?b6Cg}>xhQ}'N5'1a1;wC77z {#` ;pew{ػxA^ 绂3˺`.ػ3r3b;Cѻ^maǶږۀ`ְ_kpb+͖7Zo[ F[`>ky#MQgOhݚЩ1u^C[C_aM|}Բȋzz.|_Y< ?F] D|Ԁj תP5UwUQsU#USe2P*|Eyn˺\6*˃'ʡg, U]Yص lR/8- ߔYTӟ_@Pbhe1YL?0b~c1}ZL__,/ŀ(e1}*[L% Si+=?bϏd1}8 _YL[vPbz3k1a@/UbzY@Ig,ӓ]8n" bzHjYLm@!b{j1ݹn,[0f n 9l{m1bW6],ː2t3..a,Kh] b: n1 -FәLb: @SrO$ ,Yt?=@yɲd1= Ffg=32[Ly[u~:ݎ@Xxt`_|d)->Ƚ{+c1 {4Ŵvr>amN>;aÝӎg;Oal q ]oY`>l"Ʒn[{ZL[-xŴ2nƙ{m v6O<F`1 쁪S( dA,M2 jT6t  쳡PbʄX@fBL<8˄m332\@5@&l eB=r.g^'Doh 6 ~7@ al8Yoº,,+@\_@ 1ࡋpE%l~ 5r{u@<_yus._K?q2n o7Zx z ^]ȃ۰θ| !'YP37aQGBi! [w Cdy=''ȇ'S)dy: q }/#wC+0P_6^#EǢ78 b-d wwwp1>"V?">!>AObحR ./J?!g3  l> }ߠϷ{?+QO???/w ? />/e0XsFYzeяE_k ޗrx_k}yg+ {ZcFZDEsWB/V sNCWFX!z>U0WS=uUDU_?_ }g5e`$kp5DW3h-ۋbf9N@Z}}]dugU@_p@}bo !7 fFiaj޲1?cl4MBfӚ'o޹9zQ -0@sjKo 6ؿ-ۢm۴CoO{̡Sss!KGpyN:c <܁ d+= ziz7G7,0o.ww׮ a~={Gخ|3N=1ڞ1{bzanyވ*_o9y3|:bty'ĕ+' XO[9s >`r ̻ lKĬ , ;xr=W,FFy)C9 Y'"/|9~釹6w/ܰb?fKwFss:ΘqBցȭAȕAy .bn88y|8r~+HP#1BŒ7 19 ێA'fA/g^ o~9weybptC^Ĵ ;bf>~0c` yAc0NXj14೉ȋ-IIm9"\Snier3 M^g87qR;0jIr:k"^}"W D"t8C@;s ěv7Z u|5g"7gzbzwV%8m=bm. ƳhM4<1sb0ƨ}x"c87"bXd܎_qָ'q?{a|>6JO$"q?,?&!4NB'I*1 HF'd NOF%#Ɉߋ N[G-s?$ȟOB%Ix> :$!~um"-1wĿs{' x}8D9 K,b195/1'F^G!P Cx3 z̾ 6gCYp,=1 <3s`w3nf018#uKZ\n+X: {j` vwE$8K S7խ_BLf'V}?2!Oa}ҴX3 @6P%)&?$aˉ!9kC/ b:1 9>D '{Sq#Wj?wX ǾwUk|k>|A |o>l}prç|~E]}_x }[~NC,AW?l^7< 7+9!lv : s`$M0po8{/:;L&bIIPK''&addɈP}( -CuS) }_71= SCLEL說Wsضbs:rpV.*D|Vîjp#;ȯAA?܊jt誃p{oF w u_>\ց9r |pg™'qxdCXȃL 38 ߛ3fpQQԛx(d=| ,K ,W ?Ǡ1} 1G]dz|(a|O>jA>z|5#wGR>d=X>^`k>b.2g|p_>@>||pE~h>zcǐ{c1gAggY^ȴ9 `.؃zܲzFl Wr9ȇ]uxW }vF;;?u3nG}nG܎>jzm ms[U[[P7^no7#v7O/6fmBmœ{nDɂo}hC ʄ3z<q~ؿ tftpyJлAu[kkCEAVC՚_`zUJp%lߠ;*_˰f/,ųKR%%. !""0 Qs c,ץRuq>xo><1C8{E dxn8gl;\8HF|$/IF"Jl _<815"yA4b4 Bpp,,LLc3= yV:ď.9H ^BH9Y77ip-"p-Ԉ5pMk6MÖo;aBLLC.OsyqFMA8 EvNΓQ''CI&"g&a\ AOBO03]t D5o~YL_:~yy480e,X~ܛM扼׍c`1QFFB^Fv#y210}dž#!~VCOpgu0`\zxij@u o ܑrQ#GWز?lݐ/n8r`7<]ܐn7 {!7nkGw;;b1 @\n{wG;0 # V`ء C^ _ G=G#Ǔb h3um e m^l ?zGcXp8ԘqqV >/l}?pC=/9z@@f )1>?y_ÎA&` oC!Cr}""d9z/'](b(4S T䩈iaðttt8; ,B-PA'bOZ ?D4U@HHr$8H:Ek!o#8_PC ۈ~Ԉ<7"6f Vg 'g g3ۿ ffa#> ף&|\b c lwrS,l8Cl!{87(swd"x'y:&$IIK!5%$ǒd _&#%8?| >Js> 8~^r#H.v;]5tyr*#NUΫ\>nf.ޕWu<z/˫z1SJ@foMFAGT|{/:s,$K[SA<:vэyaL]e2 p9t:ۘkp:.^l9&ҏޣ[:owHEGS =;RDOk(=fg3K1Kztn\_AWRB}N.A(Wڿ@M%ɔv*Ei?zӊδ䡞(XMRʢDZ&@G@krV:ZsJ+RhdoZ]EMB.P*%REY]cF) M4%ߛͱtY֕WRS8ŴjZBcCin3^S̊3P tt\+ʋFс|Ȋr߇֛Ъ7ii"Qj8JWٛRQkOM<]]1IcfZKhdV މ4@KJ0Vhڴb?28Ӛd*G 'Cgޔl)%@ײtTv5FRTw0)P^SmԺbj(HO V |Wqdُ4u(8-@5 -P`4٨&}i޴Pu!i6jhFu巛f ԉjI=dM!|j^ŖjĽsiȗ"9 y~jFcK^Rȟp43(Tn_L3.ԣixF->oK t/}(;hjmp4{g/j'i} ͪ՚"Ɛ~ h ƭBC;ޡҠ4CK<ؓ~9O4;M!ZR4*:R_H}vGm09Mr&QlHN Ҝy4koL.\(k;Q3v>_)HNI/ Xj F9Q_V5&T9NSOZf}NQY&ҬkWifxqEP.TyO caȽ-=D?h)4WQ.\;ids:Ij^dH?F՗KS91F=^KJV"BCԴSImkr=S߁p\gN#"hd=n$%ǓK4y"vztD=^(M36!\ZGʕҊFhLZ8ȍ^$liKBϦ䫼L{罻4Ti:ƖN;ҸhӔ7;I-jzfuyD:ݴ sV&:ĹQ`W4ctissX'ٱ cVӱkҏKoO_IAS윴h(zQisRMiNNG8q_,6*HQ )>)mi#_)"N:d~J{͐H'8(M+Kiߴ^Q$2LJe J#QyI԰OjSjQϙBM]f~PEZj,niT@UN 6'ۗkS켁&4MUJ })WnX?Fz9le(H>Az]"R(-MX$o8љ|$[i,[' ˓U<95^CNC-uZX@K^-".(]jPY*I5vyQS>ImQsy58kݖ@O&$g"vFvmې\|nW:}v5;׏]6KRג6ؕlt6Pm]"U+jTj}jCvك3j=}>O.VTw >׭5 & m5d[e9u{A?SYCUϐߨ@ ٤ЗhډZ~lΛ1izH Ҋ}x%9I gjrMhc[ڶJMESkdYܙ.-A/6t6BOMW!vT4O~F}=u3T˚Nmf:cGѓթD;آ>8_WŇCK%Ò7z6tߟGKz/):Pq~ i=-?\tٔ8폐QctjJ:Ҧ9*7@9)iׇ>:t tkzw=}U@7;ҝt#ݩQLӛѽ{l:r ^AJtz *8Ε酃X;M}Em tE(u2yv e:ycj ]E$*֎ uwtFdOkW麲Drb # O^1ܙv@דcjv3*.uAn[7҃7i+=kVT]OW+7tb]QLגRh:,n3F>6tw lҊʤ{c-Ate6*B0Gt-ftigCҺ]n ߧ:йjto:NQ(ő=@j]` t.:v%wδFgSth8A~֧2Ït.7O1#еJtẹۺNtdM7st5;]No2-t՝k j /Qz[KoS~l7zӨ8[E{ҳɋzq9E/zզ- lE =2^DEGѻg cަzާ7cp;>,kjix>K>7Td]ޕ-ON8*gRIW ljjzsw5Pvwz_*>[@B>Jq*گ׊*r1ћm^z;ޟлTdێ^W.ڹSG+gsI?ӷupCRH_kvkSIz}ֹ@oSzנdO*iOZCkcG/T2Jfn/*6T'}XqKwݝ_2}]>nH"'};}Rmѻ#z52^B/O{ya=aE/>7wm¿4OJQV<*Jһ&H ~ѫZW5r*R-W-a|;>]B% Vzdotcb0]p "˧2t!=aKQ~-VТ&iIJ}h>SM?׋HJ4 rLU-hyZzgyOc_!%(~5M|C!ȯ`M[ ~<#4Qg e)) v[k E/ 7)#H"& ȲȈ^"{?TGQ3-WD #>RBxJPR’+%֧sRs S9JRҺdkG Q(")0◞au(I[mEq#R*ہblm(v?>Gq'C/\O}iMz@ 4qMKMӊ,-8~ݭLڽjWOZ1z(EJ^tVGkoCsix4ʺ:yiޒ4!P ݕ nL}/J %;6Ҫ(e]{Kۺ =iq e>@]n FZymk7ˢeh4[Sy$/ֻ$%^H-F{m*GY7SڬG|;J]Q')je=\QhM!)deMTPP҆F`2ָGH+"Hs"P;M}OhJ-UEfC1/3)\JX>QK>~L3>&iHOѸ)4$!ȭf.&!yd[ƉںYjهUK:RޫSԤm]j^.5kOռtTzϟAU3gQ]-{T^wiI5\ܨNT{뷖~o=)lۅ* oF e -5uDM*3x:m@ݻ]S 2ؓmTeّ:U)*Q5QEԻzS{șg)8r#+Ixթq#P8E#K$=MʳKI&e:y qY{0$ vJcņZP [~dFݮ}nܩGIrOn ؐQyYJß!_SbXCf4}JCSIW AڭHmCߒ_4~< Me(!JNM \ϺRbmviR.rpO ݀ztw-#?Ӂoh_mߍ67Y(C}%6ցzKht :ՊNys+^ %Ogߥ OztWЧ֡U4*.@'W-`zKztn?tۣtNI_O٘2t3Y*+D._ o)NiC邏It|NU:x ,u(gNq#vΧ]i_j]}Xhϱqh p압h'mO[VV pv;<ڹ:ӂvehu9o7w!t4)`O:|'MYh: rGj)CNi_ѺNjFi3߆6^Rt\NJg/ wJt}t6ݼBЍvtHx:]: c3W=[t{NC5B!ݛЍ t pd*|RL.w{鑏TT?=6UycƊ.tu6=8 V>'< Q taVK,3_ҙ0:K'Yѱ (A]Bn1PNXrk)Ş1Ch6=`}0?Ga DzMA_v4vm>4fш|+xl[~QH( ”(W2֐Ak:O(}26P?u(] in'Z4o2+{ܮSʔpd%4ѼI`b+ZpmxKiQS'Zs-C E6h|JiZ:ǯ(s%P%licCڴ} mz56ͪ^xEM>QVDgDJ?KkdҪUJZx6-8/F ym);R=͚G Ox~!c> oLC+t!pMSAhZuWn/ͺubP-8UOZS}"NXӼmh^l%T- Fp(0qIOP|hJ0YM(!0ZRŇb֥Xj9zQsEp"cb|wT=u"fH6iz &m~JAE@oCf_:S!wĝ|] g^D{wyH~VτA4=Zu5'~Ϥ]O UQ ܀/%wi#4n ;m(y=)OWҘiԈ^4yՎFpӈwn4gt AC&oUe"y_C9h3(&4^}(M 4zrY@ v}y)EwS4|W#eN֛y6׊4Qc Q5H8I{<≴z~Vʉ'd4L*X%N6F/J.Ikn-JJ IZR7$5fh晚RNR$'9"\UbǷyI_IV(*^(w^sbMzk\SJeRq%ƛ%sIKH/K2saI\0I;\.|FHmK5{U~80^qA%Z*f* u,)+[)2(+^,4J[ݒ*7I%uv{$qԯԷ#IDKu!{RcHHc3J%bI-#NSJTrN&HFNWj)hSܣ4R2GQ2lA֊\J_\41IWj5u/K5>W_'O///%t="Y~Y-(mX4Kkϑ=k^J{μFebQkNr^:[6iwJ/i֍k"wLA{')5$,]ȭ9״ 4ˋ,GcPɹHݷ&C~ Hr眧9eJvUaҦ%+H,Mc/P4uܚlGR췝ݚh&Q,˿RMԢYV:ZBFSzviC#RE%h~Z{5e䝠MתPnd~Z8e#xԉ,yӑLp޼FҞUZ0UӇ' /]TLO?;3mi3}ZpOl쳗7ݽMl]Nrɞ6bF|Gff#{VE;i˔ڢŇ^Y~WҡTuVDgc& oFр+hf'?t 7,ޑk;^$F^4j'2tWb>Qϲ[R8~|~6!߫)$#帒9iє+(1Ni8>zzA 2ک)~+~Ӕf]K:[[Ҿ3[R۽#+S#=T<$&* 軖M4Bp&KRhb/ lYʁ] G ?AާU4< HɫR8V/1< hj O4iELkK]dߑfnJS|5ZD2gHI~K?L)׷'¤_KgϕE*$zid4x`tRpr֖YI 1>}Jibz=[iv<\0ys=;Suޙ(6jٙx.\wy ]~ttɶ3e͐9T|i# +KIWJ#[5|ҔyR\a)t$t&Żݤ3KGH &I;HW|H׊b;KXz=F*\zyVzG*r:HϞO5|+~2HHJZ^Sݷ#wұG3IKn7 ?tIY%iY3.GJ-xMrR~o+I,ǵ_5YJN PE˻fqKV.>pfE)E=gvZPS2̥vN1W9\|)mGsE2/n_yדU_ϭ 2a~'`f8s~19m{2i2|$čsZ4_*c:Ua||%\o1]͹ Wzlügy0󱥿'0_|c^Գk*ώ2[s5oɯf^ۼmK3oN_ٜyh9GsZv2o.n̖ylt|v{Q\fU[cGy9mf+͙:7mjc&kf5/l^p9=CQ/1jMv1<|s;42wmng^b.envEycLg9G%L ##:sZokAȡ-"i.V"DZ57yy7 8U4Ӻioqi/_8S^!5Lq/SǕnoj2bz/]pm<5:uwGL*wB-:q!7ͫV$KbC犲w>SeEŊ؂ öXŚڊu)vz*ҿ+V8zV}oE6u-)HW+QU)RWMXEg+推ql"NŴM6.A! ӕ5+ W+yEy~Rs.+>FR|R*{T3rvT3ަAR{`nnuJFC`y_)Z#i`ҸogRҴ׳)+%լRdF$FTp{҄Ϥ1K^kϤϤYKޮ+^,8fbÉRRi+%ۡ9R~R۳%Zy;K .?Uj*%5=1H^|޾+ _W}$"")!{YLs5#yԥf2FwMH(%"c>?kskz"/TsɸܮHCn?nmRr)8%nj.ߌ Yy%˸KjNei]wfܰ+J#+hsTr]*"‰jG! B|yl~]uѧ@UBДZP;fauO;aaRب4 sV^&L"tnR{V 4Yٮ P͛ 5Q*!puT!*@>TJWſI;AT?{!-:͹:IN}sNcn:k :eeBajWZA]֜ *mFtgO⹒9n>n@Gѽ/}zR^9~ƨ<' yiCÝШj%DҰk 0]K#>҈hĉ4rH#c F r4uI3hy4hJ, z=@æP] ٤ACtz̕ QoZح@V/\+SɻnSٞkܠ<57!6nV<Պ k[qYv*;N{ݪfUїTD- eNupJH4R B]ZĆQMC+UI]J)iFj~w =8>K}b|7 99OoӐi< wF#罥)4zT3=FԶn4c ~MzI#rKiaG4(4] K>SZcL螁K=={>-]SL?V;xѾB'v-G͜[oNwth=wi\OD}͗-ְtt%wmGݵ6ttMtn#]Kw^2-I/!T9<=;z~P }zPߓ.{7EQ-Ю{k5 C/ު.4'[cSӆV×7jMUOi.RyZ maN뵧7~]jy67VF6 #DБ-nIcu1eG?CFQ:~:֐tt.Nx@s H"#Q:_,ZFSKtL_@u\K-)p%5k5|cTm,ոaFeuĿۉD_|]Yyg-?RV߷!bTCS](ȣ1bkn_X|JIV['#U >O^fx'>_k^G;&V*5,bHBTԊF qo8eZ4X(v4} dE*A7G%>l%&ȄEBFCah7\I%/y.|0ʄNDf'/飰 4TCYq>K̩ljܗfĠ3KFJXM'RH1dp}2hiX%rL&5#õI ːfE;c\ P+(=Pq> -QOKX}l7닕.wj;spw*H(+N;AF tHNkqTF D2P!J2ᢒl%c E2NNL.ג^nT7/u'&H Y5WpՎwJ6zVNkշCib6$[g[ȂVdQGM2s WJu!#1ꔂ &Cn4f\p͓(JdU<-v9˸ݸ\x%UCVXT$679W}R9َRo]8Ki%~ɦmdDy-%[3ȂM,jn$wc!l '*HiFtudF2 2uLqT{$HE}'lmO]HSRoio%) ƕVܧ_*i>2t0?;.肚Tqv\u']w*2:XjҹԆȎqOk \Tw bGfq=¹PZN P> Eʊ-NYqk//z'SՒ)WpD3n:QUBfi%d˾V8(4_=x ZǷ;akG=kY|yɴ-μ~`~żey%o5?b~di)麞5 #ķw m{; ͞tW}7+yè| -^R{z&o>}zGM][7%Ǜgƃ⧓V?KvC.]U|o|?{7 kcViݗ|R[C*4+$'ɼ(Znۋ|o$otݒ?6ooyqow˝׏yww;emHi| Ms*SGPǗT&hI$]uwwR$_'zAA>Gm1ϓ:O> n5!̍ൢ=֧c<_OO}IKviۣM ŵ6&j/Z*r#GxW2)kI H_Rb#  'ɐҒڒL8#IzBs'S#e$qOIZHkH9wre95懐i ?xryiYbLoeu "uRy}#Aj9[r]kɲB9bRfFϫ !\ȗm&y`,yb!)zki)'<-($~cR@ cgDIldÔK$rzwR5GF'?y rƧ$YYm$_E-6'!_[? Gw }}1pQ>!{ JoB+WFq׿\_>;0N4,,GkJ4 #m UIڭ "E2!MM&4V;UF"ׄbOɘ7dl tG8]ZhE* zhAz z ;u!s~:k{;Qƽqjyw^p_+p~8pW9up=i7CCf.o+|s;Vܚ@+n2C)rkC.VE[qq;_)CT\pNɍ;y;Ȏ.rDpl3 (rTfyjhMEQx]BtafarR.KeE$\9*Y%立 TIa2ijG ׭C>7;U,rm\P˝&:܉jJ.}Cs_ùnBgYqTɟYfʮ*:*nC;.[Qh=s ܥV\ { |޻sj9jn^7gUu=)k/㌄|*BEѲDuњɪBjt|Mm*yL>W&j?Pir.Jx_-O{Z׫l#b 6 ܭݗ {JB9D!?3S^T\pN)A!DeR;bb$hV_%I{Fs]6_m^teBn͂ojF/ޏQE)jnu;FN6PrSO8yݎ[!6K6;(BsIҹSitn\Y]~e~PpI9j57LB^#A;nU^OQpƒ-?q츞Cw{\|_.xT#ۭ?o72puLf&\6Nrt܄9i.'U!l '݅MR1݅ vM)w'JÅpa'!\$_o'y(R5UEROR4obJN0Qf Bg͂LwsJV<|yG}U7{Ifߨ8#Z\3r %_fcZ>鿬2#Suns7!=H&oF7ta =]C"OȥJMFoJ6 W+ 6$l ȕ6RSNO'nD!ysYE>/%_jtHk&w|amSM%Ӆ|RKMTfդG&6ۑ24vM|pc^yӜQ{37 .UY\2?΃7aǛxӤ-Yk9?ōq?!ovۀ75Mۻdא?l) 63?NJt\k.fwo:|*%Od2M}RfM6MzRCrz_IʆxxS}{;bZ@Vϲ"uKIXx˒$n'qG%wG 5_oH,Bbɠ]6F*˄ `x#1 =fc8񓊫 0s;NL ;21 $‰0(}{>,ޮ'DI;fD{{vG1y3w~m) ')=훅:b"*2 _(iǽki F"ެ(=h;ϤS),]#jӥ=Ӡ|G š5tʭtyYt×tHk xǙtI_jjӑ'(v9t_hV #.?U SʭR S5U So5efK yץR^<\e\PYGQb%y#sD\+ZQfkm Z!^-ķo2!!Y8.k&DmuʄUcj.:_P.uHUa(+"WͬROU\R^.2U;/#d$/H!)aB}h>w|6GQ#Ժƅjn3>ѕntyF8ѩѩP~%hE-g̡c/tLf+6AJ:P4ݗҎ/J_nl淿bxRXW,Fhn67OIߊĖ+hGs9նSRF]mK r_@'J (AC A^PlEg>OglIF:~*:l>;vDZ|mX<7[0]L+&Wa[/W lDthR7;VvN!7)hT=ډg j_݄{Cy3a\pB,dظ gV‘Lp"̄~npCp-/ɄJT U[LPPy ~wu!BZ~\!x.lv ;CG!^5VEzC$?wᵼ񝙌)Co坒FCy,qjӧ;S3Bxϳg=a~o|Ar$Γ_ԛ_W4_= m60~MWZ2l-S#=nw*JKYSuO6ɒVo鼾I>eZ^a>iA^k"/O3njF&i$Tk"(߷⪏ȈV72FX\$f-tTe?}ǒԏ̓TJαnIr6Z䌆59ug>ɔ0 $8YYOfض)mȸpb~N$f]L0$'1$XN鄛cAi&VH( fw8Վa\SsS9+6=j2̃d fdPCbB,:둉qv3!rm2y bh$#ؐ*b}p:GXq[4ɸ-dk+Z~QFK0"_܉dt7>ٕK6HVŽ=F[ۈMW324OFy5ѻUJO%yfɓ\˒b/o5K^;o`7NۚY#{k1OþcN6y,g~r.o9WmLJu]7z5 jɻjr\ӄmr9`I"g&6=U' KɭV{τ^J[I.DgHAdC1 2]8w.[fj(?=K%/Qpik]?v\*b,VITxhJ4Ih2o. \O;> lt],ąZzN61PwP ebg!45xUe7Q]gȱ@-o q#܆a c+np`3wReը7Fɸ)mq*I+l*nF #ra\K+/2-\DwnRV?Tpy霍JK&'j2Ya?Ŕy2y~<\%?1_%g jn+jDvVgmW)]j.b3Wdq*.*A4rIC fܚ|k4saynRKh_:\Іt.MEw|?)`w*Y;#0CeiO?`%9ƧA$}?c~bx#v J4e0}8q}0~w+݌qT~ĸ'; ,¸QĸuK1n cC48uĸ1nīrq7X 1ΟI{21nƍ(8ib cCbGbç,°0& ah Cb`lQ}0XN 0  V` \1p a`5Pf0$b\Za mFG]_'TO7׈~)fwvR_n 幠_l w+--C+#зd >@!GqfJ61O5qn@[K:*h<Gkɸ>Z7=: ݯhNy*n-Ѹy37z pU1#\~ugdK9]&8uDסٻ:>DUh7$g3iF+啩h{ N;D{ǿqC-вt -2;Ȯp0?4k!>"AߡvArSg聆zhpꅽwޅ/=v+Z:/`&="RQd8vXT? ?דY9n<|o9ëuU[BCb{0 HORP^ ,a1zsB(t oÕu1p\ȅ|38w=8@·|xY!Sv2vρ!}LjG,C溡:2bAFd9d0̀oYhY=Ac dyBNȚdq}!렕2́L+>gi g/#&pv8%YT HBle2Zl58NSf@㮐N(S }.SUT/8Ur N5éԺUv6_٧ !m_H3 ~pu,Zo);}X<⿨ vD !l[*}X@$<\{ŽWpwX'+Ɩ!d=L_;`U 0l/0x^?V@ @C6N-u| n|qu9E|rS0ە|߼2w0/E{:_~tIR]PepKx^sߋdM̋uw1w^"fv¬ i f]<{$g蟘y 30M?Onي'N啘ZS c1%S䃹x<Q%P<<3 c3 X㨅ѾfUy'`08:ë+1 rC1C +Q96 #y>ۋ-%L"yG5|(gPy>$}_w Q _%~o~}TFܞLiʫC\+MʁP0*?gTQ+w8dJc]^^u zFew^7Ї6<4=öw-xp`Aq/{.-ݞGpByΠѸcs -.yHn 7%5^Ybk~:ڸrT\-lK8 ?„/`+%etNCQ Kn8 3n|Y8͡7Na !9vD*Nphcu' K otk7Z]݉cgeO%GD86_qXK UF3K3b}z⠮=h Ͻќh+ #a7KV&^9ΨWU=+ǧ#8{hwQ7&Wa;#Qu4=إvI .vv;Zӹ5aG;zɰء7jY_v۞- smsy~Oojhu: ̃c6hNW je+43,x*? kACu F6[A-Dqs+Ǡ8΀P XFCz.KpqF9vܮ Cd '?8}=S3&SÉK 5k*;pR}^KYP4 ym86Nu3 m9 H4 |׀P.B:@гM |!q /z[| +O|"n1mSx|3|VGcx^ ʃ!o' |G/x?w]P6e4$]|Iqg \ޢx_ @{ |,\g_\>89 |MN>O|og<Fɣ; I q|xM& /I}0x.ocgI{dϥ oq |.!(~2=(悷t}Vd (eAaxP0wiݙ@9(u+VvCáp xuN^ς3y!<Ap0w7sBr ܍9|7l}Om82[ 51V:gtN+ ZEp`"؛vV݆Y{$ԇ]?`Zؽ;t(aYy#A`=x 4wa ^NAc xJw=@1|O>ZJQݖqxx{ G?/&B@+h!'j\ytzG܃Y-X\mc !W!C)g0NzR",HPtPQ^8"" ȠDuȽ!r^( qo!Y BBȻ2ni!RS BY>aO!ȹO? 時xyۦBn;Ղ(gj)DQ7B̂ qyvÑo 9.MT(8~$ Nm'탴_? hr ,6 cOr5} {/Dȭ̈́ @| 4e@p} A;htG`$(%Pv& n.PTU{qpC ܡfcxAVO4ϊ'O|x^F&Thʚ/[9)􂷅E{%| C둟5|ߚG;GS9ڦހߓ@ϺaG/¿}R8n'P e{be^_A}PY8v"[;Y/;ժQ+;[ga~ jo]>.ǰSv uGYugNuv5H7vO±{uGUocn (==3:vD? {-`Q߱{NAA_ d?# fGwV[ BА!5~9J4ȱP[q 0 Qep0m}:Mk>3,}2+ ُ\J{n89,?I:{9 pm4Hr8r9牖 2LZcj؃)h5Z=:vq|1߄y)8aN;'~*&&'5`\LS *ʇ! /ܺ|TIAQ!ԙ85p;N}bG%83řڽqO=ֺᬇqS5n؆sp8E@ihwo&~%_Ǯ ` E6n BGY5:Ԣ4th :ϻUŰ]|!t3FB?tٝ.Vr ]bE2]K9.˺Zt]zGVRy[t^ΫVt^J:kSCtz9StZn?K]I:Bt~O: ]t-. t.DfR{]&<.pt])j3 ?t=]?~v ]6,nwBW7;t]g묗ҳDu.Eѵ2tp]5U{t{tV:':Q"Gߟwl.>eDt~sat :D[T>SA#:])FХ%:.A@g.%{MZ.GgVCI&I'jt'٧U 9#Y/ߖ47ӿg:tE.))uo>SM>:IDo&:VsRt^}$GLgltN3Ugt>ND%]tZI):It :yJ4qi_$rC—RLDxd~lF1sйoɞйW:}⼇@Z7>J#tz*ӫRC:#sAQoH~qPtS)% yIHstvKC? :u)ćKN)BG:,JsPYKti߈.k˝:=H<ݏ ?q*.Lѭft[؆nK.tDѓm' nѭwuxqr\4 "px1Ņ \ȦŠ _q0.7oカf8w5ϗpi'!yp ڛU/?w$_r )u)c?#:KK=Q t$?Ll^N ^b7GpthMG!:lv50B}?ga.@= ]w='ho)퍂оkvޣ}e)+ճgt!?Datѱ!:nz>M?t* W4_]1(Չ$S)\EϳeFtIFt}E;qpi\Y-t܄n=W\|}:..%WRpĥwpJ>oG\q5+J)'rjB\#[kjqmf3*vuo-7D{mKqVl77-Yiի9j9=θ*썻>U'nW> z@o<# =i*T-F/;>*b'o-Z~4Пߋa# :b@ ъ1h EVbp{ _1dk01Tцa<0:X~#*/`Yuw0*5Fcc[0h+F8͹q1K & wax$cb)&܊Ic 2*ۨxG'Qƣ1)&Y ɘ2g\ cC2XW<|w\'z>x Óf2;<5OE`]L_ۀRfJ̎r)t#kT9f!czs{\js^nF~mk1Ggk5 9c%ƜoYH1go9fcNu*vs0`w̽z d1ofUc^nUcޗxn3MNr=3y3ց|G)獎|XI<1Zwnwwۡï8o+|D|N9p)$;Ɵ:3g}u(ڃ^\0*o.+%/LZr}"2o0fK!^'[z?h[9?LNPO L] {u-Arᠫtzd^T54z}[UW7noJ``?Loa`v{4{8H`́0g?0&Ft>#<Fa8Ӈ#È_A`~\F#Lm 0r F~`Ԝ 0*!:=FQ)%0*+F݉Q-0UAWq,J~Xˌ4̲L\ F{ QRaDt an8@v7O>b =g=tmyBX?2_H៭kwoJ\:Io'ICQ% x~G)~>eqy<;6׬0'\6'3KНW'׏!ù[# u??1 ?a~|S*x+y"sṋBz{ǘ6ta9sCNc"sOŜۘsv.欌ÜZR^;a阽 G1/fǬ)}Yc̚ƬIhY\3fK8Sʫì+"fTaV7 YJ0kz9(ffaf`< 3l0Sa <搇3)i30pxnaG%fC!f4{cƷ0J{1s+F,w ?w]BTmÛCOGm:O\\\r_2s}2|(>`>.a$9n2/\K2_wo㛗?[Y_OvB#i}t]=z=h>C_`x]+8 __`4 T;`Dk3|,^Qg¨3`ю`|,mj7o7596`m&0)l>N)=@;MD pp 0nfVìs0{c.tmߜC% cIpFpU .?*;}N`v;ae.[ Nì0=i'9p+a8CJ7l*,4 n_R4,og+vaeXզ5QAsnqB3l TzIaU>llh[aKk/ؖ5v8îΰǦ ?anv^-n~0`{rlW·aME n;=:}Pu2nEqpWO^`i|ꦍ'C}! `P U0!3g}AS"6<-&x!<^(Asޘ/UC%4o4M3CSOx>-t!7O(04Jxpg)>wA[CPk[cc(,BI(6 ꃰ)UKA Bmg6Esvp\ E/J{}@H6M |*qY@tZ t=gW.@f0?m&\K GpNLk)"gA$Cx=>9 ʞacUVddWXMa:k0Ə bzQEez0h Y7] ܂ |̷t/>C;~޼k 7|( tr|x~vy1jVJ'2k8: 3\L?HUx2F>xMLǢ1eIL޸#\n 60Ll6ĉpL)&|: 1$_jwbf]1&m9W`t辋0ʛèv2# dP:`xn ߸ .`X# uCcƑ_99aH4 iI0$7Cb$ *` X /7ct$peI40p7 HuN[ 0:'aP xy|0 n-! EX~?/_ik};}9% }{v@_OD߼x􍿄ϻ:>e}JwEzoޚ |YJCvW:zq{Hw|g2I8ޞ]Ӏ>O JzZW'wYl~c>ݶfe)$藹}6A}>_ޓ֖^AT>X! K{=?a=zk%лd.O{Pz/Zi;%{ A]8jk?! d~ޡp3 ^׫: !P`"x-zJꄢȔ,c#Yhʂhr1-[mWӹ,;lXc=s2E=F8,%zEfhҕEbѫ,Xo>EWY 1tLb3Y)Kۋňba1,S.9cbﰘYXHݦf7%kX4/Ug¢Xd,)!"ʙEgYTn- YXk2  Yū,$ǀ}zo9b^տG){2E/?,/0/lZ])mf5 މy_tG09!qOʴ RӴntӾ5!'E =dvrP[|]/vG=Oۡq35{]RŃ|cQ!y?A@[ڡ'D歂)!12$.~0}νi+'wPԹ?} <T=@e:,V]/W G$,WLtIPsnn< -:P*~.QoqP7-#P?<ON%Ó_P?)7B}H?{8Wwaphp s?4WK+AiP;u_@MP;+up.0QϘ3lWx<_\ oAxhrM۠!=^|s=epxYOA%=χ+ex+Ljr@x9x,Y?A<5<6뜁gӭq3hx:=<}?@_{n8gÍqӁz0Sgvsڻ +3 XJt PHh3![һ>5 ð4{@X'؝X{ld z9Zw2Gd$?g4?:i=4v ^+'7l#/_őϹ넡}NP jeuゞeԧ1==Ɗ5w/M_џ3ӘɬoB5߱q{(ȚWngcDKrQ y2;>y?"X9W\΢]\YEx;ǎF,];kͲe,c;wu*+T=]] ;7"W0؋zVy+yXn$c+}`e{rͻ#+mnUJvq49#Ӊ$vsv 4U*EKVUIa\v/eu;ͽfo"5S3@6d>Tvjv~n&9ԓ2<9SfLkUvc]B"S:3mLv-:tXŵb%Vac*zh/=tM)7"vs+vgV^sZXY7V+/4br c, YoYt]v]h8]=ؙ]X.VؕfkŲ6̎t>^N>cǗ?a)9ؑt{!wϢCYҷ,]+:)[}]l?&|~5>̔Mɬf01i(9%o`]-=6_5ԩhL)O 55 ~PxRw3WfQu"v}owrm|3||&vZ-wf^ͷ_rz#apK1cZ)={9{0o ٞ>jxX߾6Ža7epA(mx1i? *Y}_-DYB7׏/p9$ݯ#_!Z˨\BQ̉^!> V@^r$[·7o(G th:loWBٻIP"f҉p7ɥP]j\_ #x7f$ cPR %J(Jf%vPJ-j(2{P4JZ{/(ypUZsJBvR >rl$5A3ġ x>EPp2_P< n}p|~\  ׽9pm\\ۿm\׬b#iAp5\ Wj>o.p.ՁK3|Xp\7t.X罂GW,+fUpun.\=0mPNkcZ3}\wс碠Ф O"P9F6FG@, tG2!{5CC%顒 k%AiJMʜ%7ʖʡOPv+ >(%O (2)&$XJcBfNq78g7: Ost-ܰos$AP}%A:(p>a"us@qk( ų@`{tXi‘ =,Xk`v`QG}| h?Kyn9@e݀ tv %07>AidW(3*; e|WEp-ſT cubp+fZ܌FnτC&ܴ 7FMP޼ϗCnP4EAQP_-/ nl%z 9Ѓ) >W8?AEj(}Zx(x W.O mB%\ .{s> O] L!GldQ8Ӳ NNt8H;=NNpu*{, !pj4~-!1 M C!K*[YBC..bc gBd]X[@Xi !!hR &C Y }ޛg;z g΢eh5>͹sAcMͺRԈ{łq|⃼;l=u)ٝ5˟?5,?R{o {ko͹ï̻]OO25wjE9 eaT4ЋlB5N=*lL*k;[=j}@%"yvDcеQgPՎtnҀ**MFSՑ47XI5Rz=3GkWi͹"5ރi.c]뙮 =U {eg&k!GƳalcltqf5h#f6&2&γi)̧\ansSg Og[vi [)؆{&sCml%l}Nl0ۣa&gc'-١Liwy̧0߅I(mfX%,` 츉NX% 6MǂBG,XKcwo! NÂϞeE,j ќB&nb!{X,G .BYJJWA,l4LY [o֌caeY,,9,fD7Xؓ, V'5J~*fC Y;رE1cxE"jHZ٫Ed۳!Xd,RۈE`G3("gMEL`zX,1C;Y,|ܽdž7 ,:ݜ„,j ;ba),l^ ,|N$:`b$aAX8!nf˘FN3߼v{]9|b0zLyk+S70G|yG1^3DB|1^1JWe5/3 'X_bW0}wId߇0'0 w1>+.w;]-d~ߏlob_Y2Hv(oN`k0i,6dX,  bAq,M,ÂֳxҩLa!XHX>,Q6 )d',@ lEf!,d22FY %Y7YC YBVzYZi= gz,xl<7 z,l- (t1cAF,(,|9 zʂ~Y?ɀwʂd_$NyBYtYc,= {*0͗uϰЛkX]:= iBZRXȿ,t D-,|ɧųK, <\¶D},h f BXo;~]nb"gW"R?,"#,b}cYX?1HEtx.a׳[,d5CYDLp܍Ebᙺ,;žٲ$#I]YcYh_ }®ijp),°Ev.eQYr]bYʒJxɎRcxv});;ŋNOc'?Y*Xj0vcn VQ>8Y_L1iX+mVh];4]~ˮa ,Gvn#=QŲ6̯X;3KXڒv,n#K2;g,v)EbaY',p5nqg0ыylO3lǼ699[WVY͖ihf5s{3 ٴ&/`֦.3:1L]Dog1٧qc%Ҧ5:V5vwvUFѻYwh/ܙ>JkGu^khݱnV=^BkrhmOq18v3}<͏>zDhMtZ=*mgҲUXיF̧щޡgI[7z6߷FX=Q3ɖny.=MOaS}9TcXmDމbE Ӌ: znqH&+ϒ+6;xϛS˯VyO#FΞ反{͟΍ƖWN M5v?u䛒}_6CTY.}{p57A}i `pC7=,`̜q0^z)%l Su|`zI,9 ؏0WG?Y;²^}a|XVLA?`}M,l^ < @>ߊO4AO)+ hzt@pNL!/@hf3 Zy!lv ̓8gP q ~&gރNCB}0y'l[p$υ- D"$C4HlkIZ\[!KQ}!@|;-MNy—V@țA/|/vOw\a-хeƃ`~QpfNX'oQ )ܯ`46-"q)X'??s6>:6mW^OmwH"$[61k"vmPi!.U'CPh~rC:Nt3ΦtY=JC34zI1={y='M,wB}Z@=(V:}1}v~9ukڇong:fXn=YaL|3躕}4\esXF8OgK٠u 3]1ӝWi6f|ϙ%mf>2m{Rclܑz@66G1&Ʀ3`3`U)1=t9cl: 6b6mVv*M{ŦPi'giSTU &Mgc>1~z7>UꏯGlli?Vgc]sӘly &Z;,j7Syٱ#s6OYOį$vj/v/ee9\7'π]dyvE6dCX}9-?ؽ^dl+!n`e;tMVѰQ^;ٝvw!v |3{x͕=~fdF3{}y${9ĿgJcx7yQEc"pZαYue/*UN+7##þ:ȾeߞwG G}|}~d?n\tLc?k/!L dMw/>ӅnjcGejsx*|_55[XA'b9 5za1&,0܌0cή؆YJ(y˿*qXFEEPDsv.,"QAiDDF|rkv'zjg=I'Faa-hMz&~đNHْ5Ā\$aIj̾3iqDެgĪ;Ų9|sK1=VLIc.I:/8'z}%ĵĹE^Rt$v9@4Dqv>SJncVxZd vna|M9Xdf}RC>W|kk0}`G(oj o;k Õ:Œe#&^Z>kßܽoޗҟ{ؕ/Um|gǗV ht"C8;X5 KR4z]}ll{0$F<^c`D00!DU0wXj-apjt\Nɰ'a?Ec> ^ze<88;8R|`wQu'( vΆmakB[ҲlZy6N/ݰAXu6|+ ǰbrX1Vx-V+SOW`q{XS;nw:ɰ! 6suG`kxؾvV+apTnq>h'83R8>/=vk>pph<<JS6<y9xo x:QYt i<_Ctx5s*x9? ˽.M/9x^#|ZƀM> J8c7P]6^uQ~~>8Cx ] pO‘VpdX89 oGıt1-p4+nkw(N4'Cͩ'w& %;@Q n6!ႎ9{Q qs!ZN肋MOjػvsvB;r:z9~9{C" yٷ >D5$7V3L N"wO%t粍D\w KHY+mCNm!Z-!'DP?GB^'!/A_Í8w"!N/H9 QkFN|JN#!FKHH1$8ZKȉGĬrp'999RH9G;#Ǎe؝#MX;9v29fRGoI8L#G#G$~؉@$#ɑ^$ <n,!?I@QMIoUgև'Ỉo)rs%9aAy%Ր7߭__ 9?&O:8 Cǘ>$p988Դ SI`@o-'/{ {Me?҈94WﴯO䰉79䳟w uB$ڒ{X0S@v A\-V-k06 ֖,72$i7ɜ)dƙQd>L&O&c7K+,݃"& B>HVu&uVQO3;#bF1x:N:Z3!Y\e=J>8Q^,Dnޯ.DjZ-Nl~@*(Z$w(*O  v[E]nӵ#b+bbf&U}EKEF6t[M#WT^,Qո۸N-;>araEfb'O'}!hbYEc\,wibRu1C񂼷t#FLULTO<*xsB|+1Y%~;6ĐVqЮli7꾃8K'+Ƞ 蕛ɔ͟ܥwɲ=:U/OV&woq@N.=HĚW$vHG M2K kFm Y$/ʧemR4=JJ7&KIٝIz~)wN*ԋIbRJrIҌ'cWCZ3)M%%ߐeXrye>)0%/Q$&$Iݍ] 1_~HXd, 1H'GDooՈվd'2p8YǑԆoHۑS}5s('7Is7u{@R~WQqr7x䇭'8 =[;ҭ)פw&̻viZ^~T 4bW KxyC P1Ul9{:{yMߗrph'=+;K.k/4h?fdqW8'}!S8{Tmzˌ^RpϬo{$/@4 i ytC^pyȖ'eFf>| y JqPSCQ?f5pm=(ys-\ _ g_{BENTw}PxByO l1kZ Pjſ@Ql( v|9#tz(Cci4fpao89Ľ-tukBŸA!|Ip˽az K`d\ׂ5Y1A/h\j(_׽VOx;{_~|;u1jr5Z8i -rhh-:+^uDr]\?Bܕ9A'zg=ĠⱜbUİAİ =1wc14x|<<-L<'O K<6m爑OųxbbBK1񶹘px~_1y%D<{W!j1Y-ĸk)b|)X?q{,bL:cN::'}ĸSĸŸ ĸĸsٶbP1cBG+1I1%QCLKw3f~3Z,ӏX?ċ Ŭ17DEot(/_eXD$sbX0bXcx+|ѱHtls֨4 I4=^L%m!6G2|֓EdtJ8?Rؒ/ߓMɺ)f?ɮ?'?s-%r$Zc?~$?M̏h/^|?R{0I<=Gܺm8gѹS k g7Ώ}>b'ޗۮjU4` y;JW+yc|5y>Bu_Y9c{pa?g+x W[zOIp:x̅~zw觯4 qǖC_cp2lncc3тv} łY5pc;{t`;B"sp}ꚂCyp!δe)8<^MO@/c2zzf@;uzmq8}Sӕt9~'8 &ǃZp NFsr1jp?@oj8>Fe '|iv`a:YZ%vqsQi zn[ ̓OC7sG&9 zn=kgu_gC t[=Ց`K`ۢ|]҃K٥ؼ6C t|:nEq9t[ ϾN&?I6ڱ.tJi  潠`=e$X`qĸn A`m.{h>Ġ9 4f<МBhz-@.(9B+աsRLgԠ̗t7jU`+Y7*_78"’n:YFϚOO_϶5H?msZ?ZiߛW=]W@_w{N?_k=yf9qŌdY?.?:-,_sÈq?%W+0u???]?|l0~w8]Grv$7̓{\n0m<7#9G. =Hlk34&W;B2—D|$b;"=$sD4IJ;ψP<!DdD0e7Vf "~LpwD/@BQNxw(~Q}"D߇qD62@$p䬹Ir'9IN%Er|Pt%9'$qk;Fr"7\q/}G ,I$Uwwܿ3D.?M>&)ȕNYRЮIZFH RՂ5s"E]HoM$E[HS9)GVH_;)JuBꑲq夬ʇ\_\֎GoֈTLkO*|IrxL*-fJTΤoE5\MayR9&т]$4NTF*-؛T"fҹIɬ~tA HArer`B'p6>$abp=#\ʈ" ?̽\jF.ϐ7Hk)ɰ*&Ź$C>-I7hDn&iGoiHeI}DR/# H*oDRd$e_k2ܝ<$ozr|I~2$@}I'$9Ό$m!gdd#$됤$I:MBN~$$IH#ٌ$v3d4%u7Hʀ4#))-ORI^:z>$HZr6ZC^tdA҃RH$oK2Lұ&\?dj%\]N2$[ydv%gOI4dUE(rQ;dN2 tP޲y%i&Ijz)IT+T~Hh3$9dP;_I.h "}3IK[Ql?5Ī I ڝ $aɀ$T/'5`2rhrģ xcIn$A ɡ;ӈ;enMՐ}Gpg6ܚ켷lH6׈f'":,Vy&K)m*xdAs2ɎD:8jW&-a81yڈnIzD}/H%Konw/MŤ33zyG誥/R\hx}1W9xSm,rA4=u^#ck2?T_bҋw`'>6 rZbo'_%/Ӯӹ n]^͎A?{  r?KalL; 3\OܓN(,?O-ذ l];.#t o:.+/ CZ9ѝ Gc5D[=#©~vg6螛!0 (,>US !%$~р$퐼m ef2 ]b .%e}uB3(>" @ d>yr-!_p. .ρ|z02b\Y W B%,?pO)\ @a~w(ZIPvJ,RPMтkzAYT\uɄrPP9z6TVs7p BOvq/\!G*5nws;pg۪Xt[~oS(T ?Ӻgܗ}{ {Ipw#J1;pGn­!pk`y xn@OG#g(lΏlSc&`Q D(I~ %-BPEm+*\WǶ,3(-+K%n\>.wy.AQ7r/@n. ȳ@d -'8 M@q d_ m[QY2d0Һ@* y+$E B( 7M{Ms/Nqp wA| s81:qvBmbLX]rbB|w!] t\1s XAIĘ@Ln3"bV!f&YbFM ~o5Dy߃i1_Ck}Dg߁HO C;Ml}#Dӂs:b@l3; ΞWy$j$sGH?@aw\@vP^>g9fC^z\ G^Pj6PY7'm1jVhc*O.};³_PS]E^ W=ݓzaxjo՚mzm }{AxjOvs&P{a;ԞP jBmPk޾osvbx%޼s7sͮ;_Mzugxn ^W++txs ^4Oe;rExY&dëV8>oi=͵xkT oWEڧ/u VA>AKy*|ݢ2xZ»3}]{xW=?6}=:g.cj)xt=K6)07x>jPyjDBPކÛVxu^ȆPg5</xt\ {ˠ*n'2$O.CnPoBaVy_@N :} ( ˸d>m!H )2_H* 셄ܟpw [CW7j}"uw@D|k Nv!η؋fpt@&} ~ Sи% ygnؖ4?ŏ܏0r /mcˆbyKFlpAt'^&G$ۯh4;)50tyجΫͥ?4tLAG#ueo훗BЮc* 0Fe=jw,.g` 0L`21V`t;Л>wkXGAuZ1: }mن#0XnG kzl'9,Z+~~%}XpFtߋn?8g0{,+YԔwe79Hapwl|/p.RW@zܠ ]Ay~,' weȻ4՟P` ~qYqPx&xH(R샢OPl3GbkP:8w%WD_ kۜnP«P8m\}t 򃂼(`WvfBG/뷠=py8lY y5Őh=t5Wydc!Tuz@9}!N@E8oB&)Zc Wĭ @4 g;.p1d,}%k#$'5 e{ Q!_wU NbAԬH8mi;=1S;}Q=BJ#p\ NApt~M #;H"t]c ;ow7 !R >9^^ߛ@r9{u{;p {N]+`;ؖ}L7/XK΃f0'&LqS!_To#:ϧCT  O (p/ҀG|J L ;dK AVݝ mC-CoF8=h}n6G7O.8th =t18 X]mkd:tZ,u,'[3]`=Li 0:Lk0^ kn~? ֈǠށ 9Af7hEmV#A/вςu hu|-պ@,:4 Mz>PSCV+[ϕzywfVS6ſh _E=Ol>f5[_Q!؁^?9C5?6ߚ{׍[Û񍆯AEObwj'eJ*6[k_)"@44!mġy .^s/i'hx(^ q`\Xxs^b⋂Tݦuĺ r4/'#ڥotb4>19bC̆%ɑ6/H[,n=~Ca J#vtP#_&ifW>.kE7iq.Od{"/B ;q^3GԬ"' Yts3"]N'Bn|v~Ds_5i^К{_L|0x}\1OH4PY^,yF +X䉇7}Έ^G/^qukr5~ayB<(MNՊŋꉞDc]jk[[;Z ME]Ġ{c!+'nL _#W\cȚ:D#/Z:g͇gˢBӬQh5`}a(tU s{=8cR ~i0?y9,k'_-.eGo}}14Ps (FUvw'CIBVɦpRo>P_+'=c@pd?8j]GV`7`P.lY֞̓BSXY3'g0e2 ^{WS^;w`C=J:9ںX3hƞ7oCӧc{.Enl|ꃅKhd|M7 ŏ%#2Ik<{,moyy|˻Z|̧UGf^[b.-؃.lEQ5tx"5DڢQY9\Wi $;{oK: <'-N",&g g {o ױ[xϘ܆r{9XX5'S6bCbab˝7D $\ :*~>.t ֋D C bbb;G5ѾsطGQ>ȯa|AoR/vNm( ]X="qaGq1q۝ .͗K?R ŵ&;DK\FWEĥ qa]~ʼn{3:󗗉w ƍgJT'u],N+NMqWq֋?G,Z&0K3EMN]StStPuuVhcݿؽEعh&׈&IIKlm~@le8'Ϡ~#0o]'ccOvy|f4t Ϙe-v!+>gO([aN$N!b*VW-w­ >bGXO7o.~د>,>~G |-.<"y5B(vRP%$];E =!ZCY|:Dg(SNX9X5*Z+=ORVFy$i2B幖nʤ왭PV9,-,z]yk2g2w>eeeGʳ%ʄOёS :'e,ٞ?Mm)[)SlWBGeF}tC;?Vnws%DB[FE?1\1:QާקJ+8|`]"+Z%w*m[wOd5 k.Y|_AQ>?Qivv+D~iͽ]܍Z@z"5vb2Z)C]w'QmZΣ=W#i)ȯ^ =^ 3rS4g74& 8x8;u˸#y;Lo_hd=4r hM IFVqO1W!8= 5:8{|wan.9Trj'ɗrW}Pkt'=w|Y+w/r6՞SMs'NxrZrOCzF^j쏶B=æ" v|t{C톯Emm_]m??P.E)~}!A^w"sS!A"!lD0jJ6/w6$~Xivicσ>UVѫz\̊\;81ËfpqrfpE?pZ4J.z @._r}=+>; 9FuBs孂B|7a~'Lڡ|'_ʙv}ƍ-Z};[͕*:7̟Z<(C]UqvQ<r{˜6;eG C#GEH(Px; 5~[筛13/jc}/Qy*.S;[Kzq!g9̀ln=5W1{7˯=W/{̋,M 7 z *V=V?-3Bqeя5ʎG>g*{)vz.׼CJh1^>r|Xڻ7naNCIu[\Bel UYoN+<<4Hab*oCh2y#n';UyńR/퓲ڸE^7YyQ{<rx^_MQozoyȭW*0y;Ug%LTGǦIW{ 5K;!H!z\sLւw(gR!,=H]8t)g(_fUn9} F-nvB' NH:=Hs}NԽy8s$-c-*V:1oe/:uTgSQscEjʶ*^ }FT O;r^9XPxi I{ ٝ ;#%83ǜ.Cq؉·BQZp8%Qxh5<[Myջ@#![$dW? <?L#5G˄{]u4z;;VJA5l?p >CX1صϾӅQSo}ÅșDJ?Z +A=]|;)5<< u~~cr݋3D3"߽Q:i]N9B'o۠Psp33 M>hh(-4/=Z7-X--< G;AWv h:kiD.G^FQIATq<<]ߟ E-#N*xf aPtp>J?y AIKP+t Ew΢wJtt^Ktg+ED Q(eP Jy}kQZ)e،!>{z#uxeS~-rʘをO(1-Jn7]G t.oRW(eC wiFĉZ( ~!(aK(ASG/ Q螳(4O١,)~F㑿k)Cޯ=/@=E(q4x>J@ţsg8!5~L=E\hd2mE*3ЩϛgPНhZCG^/CAc_QoZstxlPdH_86)Q=b|'KnlIºŠma~ ]v)iUx /vK|\ qZȟ]?(XMkMr\5a!bGF(I(L8b8`/\ny_3eM ^D#ۚ?d zLRw"mcN HSD6s΃ϞǑs4E:R}ݗҶ w̞;67KY̕{&)qBnG3A=2Fyi|rCe3˜ɍеܽsÞ3^$oi>k:_~~y%]S\"'CvIknR#wXqK yuhm5L~ieuZ.7`,w*.&`*^ĥLBqs{+ʻ;*;9+/%tDu;YH)T:R.#5!k !&!-{ 5jb9ʦ«7W *˄ w' W .Q2ՅFjIPg/Rػ/^\S) ?<6& -l($(n5/=F^vuNeveU".wȒũ,4Ys>qqjsv\3{q]}-OUWqcLYɃFq#F,O䆷-:ߕ\Ǎ_R ZlµQywUˮ :XMV&oS5S>\<,W+?+grq[?6q%[rNQۓK:s]ݙ{vӉT15:x5OiCŬ&Bc2f!K.r}&q\ ԡ)4y4o@}y g(;K Mjt=B㗡\H>Uc8  y9JLҢ 6VNʪhhz#:7݇6LgkYbwsQڬ(LDGٍg!/({:Bhbv~D>}z=w.E/վoB=4>#s:Ԫq9j~i "[ud692|4mr/uxwƹw.͞Km%s L.h…Ysɦ.0dGsAor7w+&f~<Ԧ b 곫WehT]K4r4I(](=q >4{ -~H}r냚E/s)gi|곐fK͟pk-KNfneY]ƥCȅu>=cXah$_<spS5)f1SYux5Z[J*`X2 74ODxn[.Bț}O:°hqgsAT,'jkr{Jn5קE:ikyʌ)rsy\N\*u#g0| 8k/;̭4ʝΥL.WnW;p/p5N'MG-V/Bg&toOq/qqܹ=)9QBoy3e$W~x'UJ#ʬr+A_#[WxAH^'(l~ᅛ_5B_ԱM'h,{܈,nu6jyp^:V~[[ԛ[=ʏs췑;t n9zy 7G37d$9-{׎ ;pj8[uQlΨM-shőȃu.r[r%=7]\V%oC>֢Vn{-5gT1U/>I2'By)KS*zɮf*m.PΜZVgrR%>R Q>R:D,-mۄ;+|ӱ)_ }&#g.mZU2`ƊU.N?]ʮ+Gؤ<`礌{OYP=XMyF|b{x/=dt~s vc>#M+#-l^^s=3{jiMwzxI^{o 5s>w1pf?OtOd~S-.Eq ڇqjB710g.Yܑ8+!Xs'B|5>g\Ƨ?}qR|I;o1%k;N:/s񅮀& hy'ۂqbm`Qۆssty$|~N,Ikpct?' 44N3?`'Sq87c.Sq ._z φ)q1;-qN_">]m>Eq8zc>Gijplf/qGcc*|= +Ĺ Շqׇ<\Εp9.X> bb? 8;gVgE_8C  GqxxWqK 'aqx#8^^qyG187'.SvR:NqG">UlsWbVД;돃Xк>8>ꂏ=~ eq-#d<3Xz K>xx'C)n0_MSGa0N=pcL+bT !͏ {V Ws c!FA%4I4 -cۄX úxԫxL[} יCX3bwa褞<,"Vg 33lu3BPܪ1Ac7vs#3KwUSNxxj:TǃnW8lY~E‡wGl&Vt6۝lMƃ_ã*(gxР+Xvt1WVS?bq ]q˭uXӯƝjb;M[p?RrUC8ҵwr.!Ӗ)Cj YHP1 &&$53pg_pV7ng mb>x`Fxt<0<6b>m:QspoTx/T,&uVL=k=6K9>zھ7@2hS4yL,`Uzި>jo{ع&r/܃.[Otmu2v9<\DgT3NUwT]. ;.&w6?Bo"<Еc(qtp0V 0~်X,Qb`18Bq Nl˝^UTv< ~UXaGaBHVp!*pRNV>Z نWBiByÄk',kB7_jaeN8=`pԗ|aKv'{ n]: v~(otXLTOd N^`<7;B_7 f}Q_6kdN F>wDsԏpZʿ?| W)Pr>yYW ylӍ] '-Y]Q̥)J*)V)rԔ}WMQn_XC%}SQST6ֻHYHyrU¤% ;/7u¦+: ;R"atp Aٯp7~R [Np;Rla)n'Bxww+>;ڂjx6xx*>W>i7OU{L\֤澚l l&ٵeh md ;gr{\ōwb乸g쨭ak5)q<mOp|Tg'N8`e: !Py|Ԭ[CCs58N}sO\dWv؋lٞUIKL}{5.[X7ŦΎB x+e(weio>s]/J&wF*v?-uQ3V—Xw܎L?<<Ѹh#۳p'S{moux_x^xu9 `9K o|TxCj3ߚḗcpG>?Փͺb#bb }Y$j_#j^!j5nx}6/NQQʹO\B{+ %fpIF_׵ү{mfCDŖWa1֖? m;p3s9o힍 6h)~[owQT*0L!y& @Mb ĮA .6b';MXh?ߋ&uD)D!_Eyk:ΫرءKmtltmhqht{@!$ OD=p!ڧض$^l*V-M,zn`h0:N4* ZlQ?W5vr6bTR4}(GK։lj:ED3Svم`u2]lRj?4OWzg7ͩ;y5E.oe8m GlQ\7L[5{e_㱟w'luUxR{]y7/_y~Fy5%s䰬〣_ZVڮR7k LũjCĹINoEaMcPIލ_,P2D;&{_AgOu6-CdeyMɞI,+'r"^VT+M,r*-u7I\f,fyg12߼Yƻò{>~#wY*֮)6nΔ])s]6Ɏ,ٕȂ?ɒd8l岘!2;edez܅ò-d}wn ˜*U3?????? QQXHabr(SpM ̰ M(PIad}]CS (SXN^QA3+ӥ4`@)О~}!mg(B (TRtS64G}a 8T(MFS)0pLi4f0գr0 @3@a!{aR; )БI VSO(Q$WP Y TFIjtg0R7u1*W: Gl)P7ySޚ͘nlIgLkLa,#O#*#)px Tƣ)Ppx&(67>( Fe4դ@ubD>D _s  SvcOx!g0*/L # vc*3rVJ}RSS9K@mϘڬIs.TQPL1IS  )@ufҝ֎7fT^&T&T&*CO O&,ӄgBi6cdyL"X~ b ʻMʃ)ɔ͔ڀ *o*gwSjԦMm:Rgϓ)l@7t4UgY))ՙ)הڂ)Ri(\NCy04-FcQ]R@y67:1vkBKfFkFi3tQh>Ց)=Vǹ3jfTfTfOͨ(f.3*3j_fڟٌƌ-LLy2nF~U}vd}Ih2R1~afyhS݌ځ_fw TfSYDFD3C̨L͆ӠSBnFcR/*{&|ј`1Z%nL|YC7 +cd&@ܞ52ͩϘItIc|LegIi ڷF?Aќڸk&Nz>)'sʛysڕյ99M̩)4F h,0gNue>ճY}IGBi3gFY_\/sY!, 볜09IxU2\hkL70R0\)CߌYKҿKv ٧7?A}ٌ>3XL)!ɮ2paz{2a=lЖ6V&(q//ߒ@f7RyJx թ{̨.Tvop:|G3=0: #X*o04`Sǃ`20&v7V|k&hLFԇ?qßR][&9g|yҺ?qӗ͒nl_~ s0#cW cEesy c$UŌz0m*LeRt,Q٢Ddԩbʇ ۫?ֲ2Xc9R{vkIpÖ=KиoImr_mz=KM֟Kyڒ% Kg,3Y3YjkY 3<63˛7d. K_Rw,i|tee,e}dYdpfϞ9A":ZR[c!__ ocOg<2[][X0F ,oXR;gP6js듎VU}7<1ъڝ[QnehfƬ9klٳ!y};UR_J[Q~cE֊ڑ +VYڐϱTOsVY &:SY=;Net3e Fr G?.D_ ѸQ~juh]X]/Vمo`3=ߡy>otbRg#Vٳ>=ӅMgmVϚf2ܶ^w&U6Sv-QكOGfl+o(a+a?uTб˪1+kGg[N/5btLYS YxW/U3xL. X}ֿr |dytPˠŊW,}d{UxQ鶦J Z25T;>`yN)K1RRlcnrV&t_ƍ: cPxX45m8'CuƾyT.4.5y2# s 'J4o7קK)#- y*6GXW]昑l{^ݟy4W3Ro6l0Ha?KsL&X>_ӗ'EkCgixN?5/^ѝhau Y6Vd/?b:nzt]t0/?lKlK}},I>Za [SKeko 7yFdmK81X?ONs˚4UDZe*U0m7sBӝcuކNi-2lN2Mfu:$Қa(K~9뷡 1l(k#Y=Yd c`hpdills,07ɨ;}ݟuTOW }cx;2=6eSg/HuYڞ[_/>:2|tkI:Wuf NCcrCܯX_Jb#J{|IYg1)ᩪ_7rc)2Y\*D֏!І)`y,:MBm[GT&H{A^XNהtN@+y V2.=K?{Þ¿p7[Xgg9s_w3'vwUMSM3*rbe eT,NmҢ-'Q[VIҾ33?ɪu`͍[*~?L aG \n2㩁,OtMQRiEi}7NAO rlѴ_hլr#ѶvKqm6>!fi80FKBÜAa?E_"GKwN]2Y7GǴA٘uY|yU#UI$& T1A⣌՗b=Su#WͩV0k1=+ݖq=~)>bO~ݟ 1zڽg#IJ7og}bbO,rɧ$c%ڃ]X*ҠL֗__KuH4IqKgX^CRgDfgQ۬Mt*+@;%݌d}II1Г;o;YjF-;?cQ1֟9HN:wP5I@|Yɋv 3Ig3)-%=ޛ^ubW߇.89t&$#6Ʋ?IZg>];Y]}& 693dywM/oXtn3ټSSgtskvژ1߭?~6]kl1ю)oP%`vW32F0q.]嬎4JI󀙬/1w_}IV~2xge,hOR|YW2Ơ!Ffz^lQ`>'w3yʬY?i޳¹T6dmW2</_Ri_D_Iy?I;ƳKQҼH$1~v wɞXnuKY{ii(gcziw2Z<ɨa׋g}JtmceL Iq@姆uE_rm䷅/ɧ1͚xTRz|S:em ކyy?ά|* άf5مlNyyVKOߺ?sq;Fo=~lYKۺ?cG:HqFݟ &񩱌^7@~KUׅgЋy~'J ,fYcV{n;$ZPy=fY561ZY=ֿdW-jXlb䧒=YF7W y>֯ԧiݟS6hp1gub5Wҷ`ww7;wR컧[|`ߩoʨ,UcZfߧwN?]M};ʗ_6:֙ج)7\]:ڒDi=>0#L)~Mʙ $|L\MoϨm`)]KY;jϦԆL\Ɣϔڈ)ե&^kGoJy6ua:f8SݛlJmٔEe껦 ԲkM oF j&J J %j&~jk&VM60T^&4P>L.LQ}.-f\GU?sCenžɧ<K}׃q"RNm8ީwR{ cJ14S6ɀch6r7ch2OUw46Q(Ʀ:׈ Fwv߃jDeoDa}P=eեv`4S3JcwCf3Y:w,{r7)t<62eyw\&X=[vWڙR[Euˈǐ!CO R )NCڇ!#C& (}y]y8,o@qlb{>W*W*C+J (4~S9SSzi}}c7էOѧOѧӧrѧLLڐCGԧQ=Q{ѥIu/Qz4Qzg=OzՅ.MS.tӥvK ]꿺TTtLҥ;]ږK+rԥ6KԥCHU]'cPС4FV]j:tΪCeCmXڎ_tt_P:X*m:ӦkSu hXMuMuMӦiڔwmYcm*W-CEuMeݺ]cz}ձ1Kiբ2Т1N -ʓc-JV˓PjQ9kRԢtiRzMkQ޴5/jRYhRk>4}iImOWڜE M*s-O{Mʃ&KR*&aM?MY&M44}iR?դ2ԤjfOڛ&ի>KOַѠ&Յ`Gy֠ AuAӠ(TTT jǚv4^YGTڰf5(?4ZF/-MI>n448Jx$6ew,6=SȯS?LGB jthxA}Tڐ '՗/㙎q '-4dI8x5ue`V3 %3ySmco3z09^wj]c6 [MzTzg:c/I_4%{~3mQlLpK6T6y9{\쓎ԟ4N4):I xI]T&_f{P?Z~-jZt^#Z/iѢ1ORCr}k>JEeEEҒ͖Acrf5YY+Im(oZTZ?X\mj iQڴ^iTNڔm*cmjc&)T66h'MmVҪ}GmAU4]*=ʿ/V&Tzv>~(N=ʓR'Q>6|o6>~)mzh=ib=oj{~lf?IZ]:ڗ~3[ο=SO}jk<>mԷ)-ܢ\5g>`@6a)MTSX69γ+;Q 2=lDc!՟!Ӑ˰e}42rwUs6Cڷ!gR~ . ).l^', }Y0#i'q=Uw9rK6vdMT{ɫ}bi>洣f7v'9mxaTӘaܑ_؜6Vg{LoGv'x4[SP7R4}GB&RF0:5ae&[lj~TזS6z7Qsy}̿|ϒҙqN֋]:A}NuꎦS՝<+1\:)U6Fui켌Ү\_f꧱Lܖ1Jg9Tf}%9P!#bgn39=l_}^_>vPfHegH1,c`X -NgniMucHebH60cLJ`Ԇ %ׯ ~πl@}ݠ+ HpMO@77:0gTV>m1{6h]o6};:ow*}J~)kJ>Cnl_E:}S[T)}*',Oڟteo=1^}73ѭWէңI9=*#=*l)H)^k2='z.lj kul};+΍xg\f]jOzGu>oˌy$a. Ș@^H'/`i}gTwwŘ9u6k"{=nc}ޢϷؾ2onϋbh<0->[ϸ~ }7v]^^|wc:qtY}[X[~[{NSߔY☛qdY=y;kL%𯸶S~quU_{I}>?O婳)̷oo'4p]/627HAIs>?|m QtO7d0!;n Zg&LV:#i<iHg%u&Rm;GR8lr>y[?9'}EXƱӺtoΏs-l{>OS&ƹZ Ѹ^}nuc`MޅZ/NrNy:70fֹ9ocXPK4k5iP_X}V-9: Ugֹz Y琫:UgjkJ.u.^익mS s&3@|tsL:7T8-tt}*XnKmL-C{ݷ cw1 k*ݬ`Cln93HPx}5 ?NV),W-wqq@^ijoe_ů&Zw>TuDۦwPNAۙ>=鱨}ilC5_?_0_}@RkiIԲ&expi}֡جCZϊ MjɕcX*=Ƨo~YO-X&qhǼo݃ڦ{l>Wtmj[Ѿ╡ǵ|PT~7suǡѯV_CnӾpDxR{+犢/cSyj,vmW};jb|ַnǩ?ɶ9f˵f O_r?+vV]om&9XXd9t:ѱEH]@ݷ@e,rwUU WwԺ 撵=a~>˪u_1ݦƧut)me֨5T*|Att߿kz4>jm'.XoR븚gjPfu}]ڔߐXkY_CJZ?iޠyPY*@}O@=4Teݳb.ShuPU![ z_x yF|y};aq3?պF>surʹo ѻ~j7^xا:U_46 _꼖uk[ oG5iPXݩsknN25?>zո*qCu%k\G=JMiP}kRܞ&u@g=k7 O7U JBܷ˷z/ tN*}UKxU}^}!;}l?U7M }N߃QžzVwMd;1N&@LMw\;4Aֺ2 -}OFք8&F$ܫj\,awk}^WOtLX'7|3^NC7}^|WL#yÿ{M6jnҨ_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU+: >_e␵:du@=&خT*}4RYv|3}鸦oڿ,>=Ɨ8zAի:,o*LvUxT٪[^&Pxc`[YDz}EŽ<;k^lupUuՕM= 8p=V]OOZ:G=сoU+8ށ?۬ϼiPxMR:WթwCSgchF9etp4 O±Pwxs4Xw8h=S諺ʧ+\y:;<~]=FPW;j[?lp ԟz|GE/߱3ئZ]erjxvqwGaUڭ ѶSCעτWzwIKSochx^A6TY!~<n1V[©Y^`A ,4}T+ZVyC%U_cV^;p"q:iQp3/FA\vioG:W ˂u& ԽBN[gN(lqλ8fhYx =\͂z <:g_ΖgH=1uKQ̙U9[6~H:" g:B\(d%DcRջQOfmapM-}jY#e6vlWZ:6m.zB}WW[JfnWΣ#odήڜsaбgν\5so:{j;OOij˧^M3g6f_V5L{4Oc3\~;x ;O u;^d167DxGy;;lG3v[Fggn]W~O^gYShSOf}5t}ޛX6vVBn&c5xuڝݮ&_Եn`vlpݕ.="׋ivY϶ީ9ZoߦLx*I~OnpZs C0'CB=&r{BޞX|+:⵮2_ ;B~v0L^j1kdh=&GGѦ΅Ds{爯@Txfw}j3xffjo];t8Ǿ 큓*ilf=0ߊc|cD|CG{Tnp |?PogWf .oՙ7'o3R.훓)߇37xoJF7=7;GvDdz- 31pg7F7Ԉ#ڿ+V~=v߯gfG~'72Mqkѹ;esʳsV:X]y޺TC3߿ן ϥO=Ȳ{o雲uނMeǪӠ۫;{}Ȼi盶{iW ruڣYjhg>'n 7Ok?R7{ g\!FJiZU>&W9z7xo*szsۿO`v;DѾ7s#:GDTt&7>䪡|S+$vwxir@{Ll[d>x.xrHyY/3xQy(mwY]ws|^ㄕwBsv>BE -{㢭atc]Oד'j={(24uBwgpcJvٍnC3F>3g~h~g{EC73L̹лmi>Jh"rcDxr\M uVsYyÙ{rWd.c͍ə~e141 lyL^i=35}CW5vumVo~c7wL=7߈YGO;roP#ϴ爬(ھޙ7O9{Uzh_y/юke6<7ESi7wL٢?OE-:Gܹ6˴}/[woK]L_&f䷜@pѹMSG'B#!Fi]wF$״g  )wFEEcx>U|ۋ /I}}_RQP(G}=Q_*6h$_S(ZXt* b ^,#].SV@X ۀ р~ k@{h-qQO]'/G'x!_U Wᵞ-u)& -Bk෍C{dNR1[+>/)wx^t:ӑ+ҡnu'hf|2ɤO&dbi/~gbL|(S/ x[OG.-3(gОU'|2t ˀv:e CT[u[`;)T?Nȧ6UONw&NȚt@? Ų<,y?-ٕT{e( ^};4t_5FlOCvimo6j ʟG4@xl Okk TI_=_:->g+xy|VI[% 4X>)蓖ޞ~G{unGT"Ӡ^yGtpe ;;`E:>9:@[ O~kt-Eߎ};«ji(Ґ#~acP}`]GliAoKEWuY= , A@cI9 -iMiȒ\i?hblҕϚD:[0_IvthY cAz]揎i= Ӡgɦdo\R*TA]d@+jwh.m Gc"O!sϪ8/m_3_dkÚ?}Z3i5nhGvtV~*TrjջⲚۊ@C y*LEVC+z-hk\hOFZKB$x&B)MhDȟ?#:y'taр%wu֧>GzbC{ vAdE 2(ƠK bۺT:@uhj^YkSWŏ-?YCwwc.LJÿ>ѱ>2Z ~ ҨsC] 4TS;kcZت ~ W:|[հZx8~%:Ev9 _`׎G"w| RAPIUκk:ǮvTx:S.ܠx@K庛*'~'f:*w1.SQAgLFCcƥ)}Qyc3I 5WR6j佽*·;:_]n3ү'2v6|9{.y̧\^n!4C"_K\2~]N]]a0D+̉ju #: `s<|=>L(wNo Y?_pN)wN$p'C&Sh,!=9VO*ϩ-r:Qᜆmc 瓴?6#(mCs>.rL/wΤ3x6|:]/Y䜕S}_޳?/  WU_]p.?39?1 } Ƕ|Y@ -DMMoϷc66|q{Awkd9߅h14c>tY|Cp.`d)c> e1}OS>ecx2u`NDߕn% gcEAwBjkW8@ȗ ^X\k[~x} 7ʝb}mی|qͭ6oh;roGwN|c6͜͸Aq82{y'h3t!aA#r8/8N Iv _<_:e:(tUXvQa+* =W^XmVl./QX5ちY5QXZ[ kT֦:guf֥\wFEa]c.vPsEy +@z+s[(_GEw: ciuKVa>x0fEaw}]^0 2 x3᛬†YQz g\(lD]#diXya^hOth^^dT4=MYM0:$~UT(L=0#90dLdLG2z'/(Lv-&8Q->i6:%x`$&Պ$ .~ %u-/LjcOnVTV^x@Tɞ/Y!qOq5/='BC"6OPx%2&Q&fމ(藈Sb  el&2v%%b<ߨʋ=-x<3[ZʪNSfi?c aQw%Ւ)-@m{()C]?9MWhMݔo[jRo`NZ՛&1葴H'|+qJ~JdOVa )0^)2)Ȑ,)yV>O2RQ 2Z)󡉍Sk g ɢ\)W)W3jE͘7͘n-/l6'4Cf/fifSħ̧Uszff m84ͮ[6Ϛ%V#+(t-KR0zɌA2"'#[2r&@+Ɍict 8I1IylX&1w>$9=T ;*8D|KFWE?Yɂ$#{ro;/Ɍc2/Hg- 5+gaC2t3tKaQƆ֓hzOJW+|>ؑ S)+xblFf{3B3R3|:5#ws7'n4g\3=[ -FܒԒ5%>Պm~]*f\[c6޷ -_[lЖ81yۣ{hgOЁޑH#x ?yEa:N+ ;!c'֭ S/O|l>2f3I|D ج3};cά{vf]YjwA.g@Wb~W?2F]ѳ+q+6uů"WuEU7b|7l anĴn _w u߻1~ݐd!kkls6 ,b\㐅}蛅YPFW[g!O9 YCwѫ;sO@̡օх߅5Bb΅й}z[=ѣ'EODة'6E<\> _̽ߛ>̎)/fd3dzY7df69&d3ɑlEG=z&6dcO㘍/d#S6vffc>zZġlM7w(Pual0}>DntX}{}>sֺla=N9ȞB/t}C}w_Ʃ/e}`_|/#}G_|/q/~e}ns~֏|a\ʅ~.1!1E\i.1yb<]WOG[-0f xO>yJ>~O,0V_גA>xX0RcK>5ז_iY/j|֐|ֵ|O?'xC#ߒ[󡕏M|6e>yCgZ 1/`M -yx[4!9ql<ǒq'X< UQ(Yp }E3,{>kV>>gl,˜W#X3=U_eS?8O|WkƬym,dP_ZbS| (3|yAR4^fVcKo3ecSV<ƈ8OOQ)+(%g旰Wy̓\#w̯~ЏyON|/ş9ʁ>}mټg޽QoIor[/xq'zdz"oO\Ș_Hyރxۃݑ;x֚݉Manĥ1X#V~B34;3:{/@  2?]ϧ|>cw>rf@';aNNt0[g4֐4reGbVGrkbm'.gOG§-m 66FkkdM'R Z1Х%>][0O[g-՞=5Qn ʃU.d&XoS5_Ftn4΍~oCDb]1$O98';4> T,K %6Ƕѿ>ztނn^b!_\_a,jGYokᗵZÚx$Ǫ| jcWFuxV'Vg>T'[5pS5u₃v q8~"O;%_;9Op h ]Γ3x(w߉ 9Ѧ8<v~ a '1sQl}GGTv;(YCad:܅w:·qzw]o㳖AЂJPczMt?:ad8}Z~~wo0{'U_Cuad>8f<c/Kt𘋇 /1Sx?7m. A| 2󃵋z` ~?ˏ# [3O[ ge?|y&|B!Q~>kw-\t54#{|o8 $0l^W8%0[\ @!$p^I4G%m$0p K$pQӷy J ?Ky$}=f dcظgg /, ^8:1i5%~0fC$9RDޛ wC ]*Z$P)SMϳN}_[FC_3Q%u˫Y/V@ok _l'|O=Xys?&C;F+7#ѥ/M3?s_\ٯ5ŏ@@?~!w.M_t˙'>-lp{?C2*}{ Nz#K`=o`ܗr_(K˃o^ l+Ȓ 836/@C]/Z=x^sh {1y^?\>6DARy슽c}sg(.ayX, ,jG`k,Y7 M-s0F>Nw"=V%ぷ/_1Z+Cp"<<8/)bcu^mycgIi^ spZOg^K\%nt!Vema. ŃćKCWۆ/& F1Gko$^B|u]{.bC)40|>wAA?E vK~l#NzzPbX&n~<~ؤxVLރF+ueXpM}_ْ{^xEˑ{~/i>:\r/Kc닀+d.-eaۇ5 }{³𧮬#5=ۑlE||L @~x88r?knd1.bm Y X7nb]Ϛq mÙC?Xq bb8 վ ݈ Cq#19ւ5/ߐGG,K<^fTߑyo/ķfm ]Mk.//ډoUO}6D|+''[rB|gݱ{k߂yY|x_|E{' =ߧ{*_|4M=%'kHM>(I::wBM=|H|r+߃}0F|c]{<?f=,7 F`V灖: uΆ~?`n#r-D>V /x5zOhab'4. 7Ӊ-6b 6J|)l+15k>Y|o α[c>~Kk8Sl~+__xF}c֏첑>oݝnbvA>M~FCrd9i;'yPTyP5kQ]]mqSאy٘yՄ:/͙-V̫̟e'Gi͝X#Lr.μ'y@ox!y\z+̗暓Пyu1sq2O1.e\ܿ<1 c?"ks=F;H uy% f v)%pC5_?y}%B1˜GÚ'o"Oxt < q 1oi,{^Dٻieb+K)F<^C BE[bd}<ܥ.njͧ-G3*{UWf@5%ح~_|M7`ȱ n&GJmvb"Fȃb}Z? t~0rD<BNC9&ك`IQK]֩ze c?5GK?MYw@kk2] kW3r=-XZ#F!h vY:H4ֲtwb-O糷dx2tfB֕uACYƱF" lZ:ڗ\oȕ~dZ󢕬:y |\Ju|\J5JмU{5vо\CNFODBZkõo"a#k$4G"HrkFo|W_\W!pWc*OC .6|i /P:[!E~?sM> {DeQ:3^?M'-r&OkE>҂<%aӦmL8GAZMu܁ߏG?'@ ۍ`n#Fn72_a}_G!V}D%_!,b- Fހ? ĕg3OwuO4!~w|z8bWL\y;yǭۛmK1&ˉ{БړO/ă.e"{:q=s59OKRH ^T_Wq;J3~֭Xvm#-m_IN9kS:1kRYa }u6L0Zϳf$*g+ 7yt 8xñ1#uϽ]|ŬwzYDs9w 9pYL0p."wa/e=3U|=/ ڝA^ƺݎ559Awc ⋭-Z\mxOS=-ޟ<>!:YmL#Y⭘"0.}_tVMk;N'y=3A3\Nh=JX>x cgr3Xwe-'ޛwT=\%ޫy(`^PСxᙻH9.oܝ4ѥ5tZo g76U1ϊvxO_c.e?HvRk}PʶKRv9 eKgKيt)LwK;l@)[h{\Jًc9h-elP)Z!e;lt&dKC llW)33WJ2w>zeIٍ~Rv2) ^W|.eCg&)C'e>)˫)e9;Qzh)wg)qx^[!͡Cy~xf.gJ3ix oxsq#7\s(\Lg{F=q?9ZDSڈ{qO ==v?Oܞivm=Rܷ}/ʞy/](?E#sqWwhuAg; w,q)nB}nyμrWϔRLJJᛥSx)=UJϒ-tR~~VJ.:(+KqRQK)fKR`+WJiR t@J/ҩKct)}hQOJKK=IwJқ'KR:r^W ԔD) )cv Hi&gJi{oMR^J 7pHy\JgHɩRr|!%?-%?Nݳd2)ٲKJk$%KR)Y3OJV핒ϲdRl|AJ/%oSH)ys)7HJ^R2k<7ZJ>"%dzL](%Iۥd8)FJ.?CJʞRx &Kuki_ wk.q1F\S5w^zNq=׌z-~KqMY\׸z%._!d/Gyq]5@\W z|ѳr"|qeCgsqe!ogW';oEJEȗBlq5WU]k W")uX(ǶKT)y-?KRo'[RX)~0)Y*şCguR\OWK h}N?Β⏆H))~o/!LJxF)~Y^?!gHkx^M)R_)ů9KK˥x'8Hg!,dz/|>yd{A9=w'0sy _lw~vd( ^]0_C׫KHϢ_)~]SП~z+&` Kkkސ(L)޺BCcW)޳1B>l(c-3dq9U;O\1{KWlq纚W2~k ;0wL >Ŝ9?[)~АwU#K;96Fq]yD\#໙⺡_к%d^X|yqy)3M͟z if1W^w_Xq-}͏Vd01̅Ȱۑsbq~yx)qaW}&wJJKHI3b]")iKHX@,?k%NJv)Xv+ĴRrqb-MܻsTZ!%-RrulmhX(1R\`&yf#I sOsT4/u ȿ~[;ཇ80)zU.kTr)ϗF45\K֢6SXCӧV~uyGJӧ)3BJmo_ `[Ⱥ"CYgD)OX#V־u'k/mB{7y>ZeR5{6W7LҷYaGS.|!GK&eFt mtnH)ipq;%91]yq-wÕ.[ĝtB݊p4ML.m{wq琿k@L"72N2}Fq$U$ɻ؜܋|b@Qo y"#.qOBɫ5S4#o#9@ktq{a@mo(a#}{d,vg);}OF샒أ5g_=ta c_Bzþ+}9`z &eWWzb7M?:CRx^va\Ə?({'[MߚH3"eK?K޼=cwB>ȳ}gc&|='4ֻ۵Rmc}?.efoQp;~ڍ{'e݈~MZ)f[omK{mwbɾS]Kś5=~goAx7CxB8ٟ_VQ?N<{l^>zh'ssxo֭mW{[W~Nw/{߻D|tv/{~\ډrx.>\㖉w|g>ox_o"7&wxFe)'V q]_k|Vyv3>? }1ƍ#M7)MUE'(ͩ-W}kLO|oR>Iߊ,ot\F|@;d܂t]"3DM:^5ꉿ8ǜ_/ğ8S))֓n;F/*~|}{B]"e/S9. _WS֊/[>5Wݟ;Vqԏ_$ ЙA,~OTxrڟ,M%%Vst/ſBwj]{o?X#~⋟xx˩rĿ ϗ ?qǿo 6Ŀm9X߃{#xO9ÌQ8cDDS T%K_Ԛ%: 7XIAs /2а@cM2 4@3h5' "%@hK{H Z,·+$Х@;%Ek$paM g W$ys_r3$/&%Pp(DE/WFKI`P \, \RaA \ACW鮀0p` ~W!( \N V#Gjh? E|#R=D'p/,%*]:HHH!@{RN7'=*(((v۵7zι8>=mƘ]k5sk4'YCm~lf|x勉O~녾o}.=.zJ~;;[-&co6nq}ց:MT"ꋾq&2}.ѻjRֹù =: Ϯ659~m;(P~Sdjݢ#56LLJ_Ӎ=lgpߛ}DQ $`4Bs©ja=&GDGk K.q&~@Tut&:YoBMЫR iHԡ9j Ե=>tNI1LGө npN#=Fp1rmk=yT8K%Tj.RB'G28'SIĒĺw"1$P aDG\urqh).g4 Q_c`ILr 'pk(ғCAz ` BA D .hO|取}|냾|ޥ"g/zV݌I\{;1q;7*7wŏ+WѮhɅ.\ra z 8 9g48/ř}Ιܝęuhљ=B^:mst੓.tԥy:U}UG:~#fG9~п`? >Fa %`r̂b?Kmt1˰jWɜ cfdN^">96cO-$sj/5ROI.X,Zz|3c7$[g:yWHds_y1̋X'Fd>0X> J%9.*}y1>c1>ELYĔMLd%ط9,R;rf%令3XV8!\|堟lfݬ5X0ߌ; 7 F .3n>>37<q⩩lbKHLh0X%&NTtJ?K40Փ~.mFs=|nyfh`.yͣnmV|Ļ,kc-Exb,fSc;98 h*y#<^ºKn YJ-eR4Om+ ګx :{.Bz@!Xe!uPHWD."jf>PQI,_j𳜜wcuU)""8*"i 駅|.eeIJ ી\ ȣ9:e_5ĽK4ޒGy/\ukOc#X; *b[L^"i!X6 0n>6n3:$yp152f.f /,x50msХu.+?BI&dDIHΉ`@]%Rkh*/ 5˜XtÜFOQr_$̢gL@8cFl el7k9/@Vğ?:C_~n|o>ԋf zCρJ w|ЎX+\ :s&?=JG:L;5TJSwG|Ơ qC{ ڡQ;pOiб>ף{45;^3: &##jv8l[7gg||Op >?@lΆ4]6>&paG9. Y4>D??>_>~/RE鷃dL|IŒ%OX+x A2XL?lKGfldz$gkdz-!~ D2}k')ºI{1|ݕjQ2}UX4@2I^LΒVdI7m% ޘ*u?t{,k,U֭+St06Q2]yIZbKzd^L.<# tςp83F2&<\$TO<ƈ9g$ӱXt܎vLGʱ^V }$Ӂ/ɴlcK ~A|B2;<}V2Y߂*T?gf4`A*@%ޏG.vroVO2 `m;oĘ LVxr#-6v ~7ǸoHn=\'}:\WRi-E_k0|5mz#6ʙ_r+o/V*Ƭň{PʸW:ePxd] N+Yo%d jr>V0J~K]:`QJuJT 90J઄5KȽJ>^&]VxFlh-R˟Se<]lQq1yVB%}1RBݗ#]*R] olJM)+ 4ͮرJjl%i%N[>eWF-*|Up1r0.'r[MY乚Pk5u֒c* >up똷 m`xوf6F6MĻ mfom-- o[r+yn#m o`rmNIE=BGnws]u%ו\کu˵f=\Z¿*j,`!Ķ%}ļ9S_OGKztAwC0ގQx?J? ;1j8?qtsOONjjOrTbifi| :;C>KlgYg)#<=<VX kk 9EHɿk.Kx ^h2BNuRG,uR6WUs \cƯub'7ޠ.odϺI"[S=6xF.×_Krxӯk/߅{q}cooɷh[4s|= h;ܾ#S߃C~H{(#G|#H>?cj18='rz ~.WWzqN))s>ϙ>ciKOsk ~g~g,e|C!~Fisly1g8=ǹym<|/p}Apl™ כڔ3h31qnQsskYg[p{3_ϡK_x&ky%g֖g8L2a/ gW83H+κ8k⺵|e *ׯr݆6pvm9-ζqo8g5Yuz`q<''7Mxٵ#v乥#xYg70 N9w9-r}6f҅XAb ]ۍy3;$ݹγMw9g{gO8I=9g NAoz1y79>߇yǺO_S?<,>OU>!\|?ϓY?b@@k@r>xij A?y<2 a ؠ!Cu>!O k|JR =., Ce|k0ao fpF7y$#QfyM1ha ZK,c?xje<ہ\kpp@NN&oka2\Oſ#>wbuӡgj,\˅gwWG7f&<>qߟ @;  W0\CB# CapNh)zpɼ7{iF{HpdnDy mE7bJ 2&^c8kXQOG=ufy'0> pvY7J^{Gtv$;dl2&9KF|)h,E~σSU =)ݤo zJR!ZL7o1I^~. vCN\O]Кħ'=Czxփ31> l7@# n+NX c}6Qְ%cEwR;o}樼Sz0I4KW"4pH֪U*RY#g3}1R&[wga$rIDH%b'|=s+31pOω'x0cl=!bY+ڊ) b=bګw{t Qh L$9D,⚕I^Ah$ 3/, r !`j& @|K?\S~Qhȗ}Ǭ?x3֛^>J!ӣwy'=Т<ߝ:sPoܨ57'Э8Uxt#:s ]9u+K~tण/:7: Dm:Ee)ﴜI'i:򽮮WPGuJխWIog4I|Ls!~A;3s#:%wWrPgG£}M&vG3h'';%{ bW^0|}(BJ0#p46`z̉{YsxD?#9Gg}${ǢXw3'zMߝQ%"y%Q}2{Er~ i`+=> h k!V#O*=f]%h{I.o h>.`B/d^Bk1Zςl8FK9h%梗<4%྄|)ȗ˱eXHʿ诼g[No/fb꫄Jl``wYNɡVj0^Nky-}+izYSsznD^ 6𷅽e oeݭ݆mĻ-lİvNzN]仛5v3o7*_i"ܚ ffnj=`o|!{Z'D>uTfU*US>PE.Um? 5`!N >-ԓ\-6u XЩyb>b-hB-X{^|}V=3 x[An~c! #,hArYЀf!*tTEϨڬު $$|H̕Є{yX&Pf7MѨLm"oTQ%yWv%nMEλ Bg;Sg.vr؎~Q8 o{_VJl-l6 6&n#Zو6ۀ6p=YG֡ j5*s-_Kk>X VVWr,gUhq2.2.#|\WR;+^A*RjRʸx*!b,b8Xsu;B|SœG6Xw>koi۩\}Mynyo-ms:lΒk,/Y\O} / (BbX@ 1 q>}l>O.pV2qg͕ͣoNN1f{:9i:yρ99i'#]ks1kك|FTrOe~*LœdtL\Io I>F}. mgx|ǣ8#oߑ} Ű^#E(Lw~{3s/{ ; ^(B½`k09XY`5L?]|`9{w/ό:,6eC>x7<ܝkO سx指qq7ӱchTߵQE/I? V#W#?\G+pz{ַ [te fcle:vF~b>0/]~Κ0b[jV~ǏmpNON~#Xg uhx :Fo41`1F(3KNDz8qn'v`nooVt p8'IDmL"5^Խ#kOAsSΧL#i-s66I ^z&'vbwA.#]Jh͍X;뻣Ꙛ<_33:"goz+Y| g95?Oo )]Kz FZ :~7R  gJNz}8,fLzL48Xg,p{.3*ZFC`}C=#M ϼ Nq`''-óܬ9gsvHyH/\IIdK&d?^B)Ē"vO*5JM#@i#ns/7Ģ\g]=Mw)5k`-|VW j |z5܌ew#G)5g#:0F04<5``V|{pz4L34L34L34L34L34L34L34L34L34L34L34Lf\34L{?4L3Ѵ>f}+}>jZֿfl?ώE34gWL3]RU?>Sidi۟]fifh^3kn ~ӱsM|NMÖtv"6e}T4}ڱ6ZOkG&D){{Gk)Ż3Dsb`,a~vp)t{E` ⾈zqF$o"R] }ozSHUmW*u@dv;(._(69$#$E9oE/)1V)Nbb`)IdM ,Ld=҉"{Q>0@d@:Z~FЉ]"gi?Lɽ!"竮"@䚞yM[rVXͫ`hXv(ZŅEjQִB#,b!b7MCs_XA bƋb׶bwrOT|P6洷Ğ)O i؇h|$~6gϋ/w8PZ8*ѽıiö8y Nm'N_gn qIqy@'b7OEqisN\kM|ĵ̾"q=G\?+n+nZHU8BQ 'nJĭV- }QG&a2.\xʜY?4Z%=a.WlFu܁9\|X}5HrG*,o#GXɑq5c=űa1w,d˺ء<Ǵ]#ubv B? )mmW^\q4k߲jPON&,=1/ʭ}Ϛ9rxdb̳l/6_?ǫy| c s1o^d\e{Sgd|?X/d&>'Nj+̢yZ u#ד) k~ZKjLI3rmS+MD[ =NkoZ -t7gIϖ{ܣ}}JޣOEQw2F\m0ڇ=A3Ӯ~)U\wk!oq)=pq1U-A(k2kqWB 1bwOCpvJ}{ι?^=e,=ݟgS<y&:ž }uDEΡ WvVj=gP[1R@MO02?[)'E#"}+: A*Hac^Լ{:E`퉗s}LM+ͣx5x^Ͱ+xu r՛x]^wآƨ$ޡזw(3]*X˧ԲߋIx~G'WkAټo)WY<o\Q,KH!b:scDLU֭,pkVVj[) .zev:j7( S?Jڔjw'Z?'{JDY,*/k_&Ow}yQ¢D9Tb'/!(cz"/%61D 0E}R|j)N=aPD(>Izam.}']7Rl#w9MCB' =d77VLK1BW CiW˱{MԱjo"~xB3^@>qaKT8b)( >|Y~NTg=IY1C W'!$gu@=MTqF _w(V7sWQuySB߱տ!_ }^"cbbec/C|(131w<(Ṱ?c1"f*EZ?{38aP7!b7XXQbșBZvS( A>9Vjޢ"w+xa^u߿݋]7ۛ+PF~0K]+X ,^B??{9aJJe~)enͳ,V&,GS-wA2C.® I)~_(b@ S@E3|~KMb/bCwۏ̟?}Y)U]Rp {q`9V}?ǞģŇz_)1cSb~wJ8z^›Kq+$u›()j4<Ǜ xs!,nCSi$5 ge1Wk)ʩ; 8Sbxy8/'ˆ:n=n/SG%Tq|:cQenVZ=uFY<1xyyE>:/xq&qҎuP{yLJU.AGi@E mE<`r=/·HEYSY. }Ŝ:RtJlgL.kMz [Z\;(>kKiD9:Vچ[ oBο 7lqv|c*>9C[/ek7|y_Pg$JP4f#x:kw]~?~ďU.?i絏2ڮƯQu7~egϿe_7 hTmϫ+_GcDbB󢾌W2jQK>USd >1\E2n1~1M3q3ܬ=C|P݂H< tUxpJVd3T~/w">ZuŇ3>oMVQ;*EQlzW;oV߉+^Y8b/' ن+/}$6++ӿ2-⢲3?KC=Rח,R|R8g駫/[?Y|%`_qXa">( l8/CiϘKGqr>+ >t3\1^ (gqF%Pv^%_.ڗqƴʜ =>b8oTvB[n?w#ҽLjXl[,63>|"A ~ŹWc#B2X e2cs.~ss"֏o(;ϫceog>|Jه=ɿXiUoS|Tw} U:Yr)0̒Bg[oī"6SbQ[yWȚʽ?!yD'y?_um]'~Ĺ8*bž݉)Yqźksuٔ8,/P~E|^v^U bD--'cW-K ,P6&aŘ}'12Nqß|eyq,t!K}Dz߸Lo1;(K]J {BqG*Ο9W:}8^}*}j=Ai8~WBq^-uKϫ}Vjqx"^}~?y9UYo?XRğ"boVYRXRđeLJ"8eCu,ȱv>ޚ SDžodu|XJ\WW|Ϊđ_k1?[fTw(b ()QČ"2Q_"aXG#*MGVWruuSnzNSuٝ)_\Nu4]GsR75:G!WAN:*e)N%u8NOZ:jWCMԉA2NP#C()  eees#)At4hZ^)hѼVGٴ?ˢ^ N.#r| bOB}/SUEBk5fFQVO@sCi[ź蓦̋6\)~g81FGcr>4J/|^bM+;J.WBI'_<(߄6>~>|/ߗ7/{F { †]9r"XoF%ocg"8xBn\R ?/Ź8UŽz8Uw#>+.G\{G&wE\T5ކw5>]!kbFVPDg;q}Wor f2l 'Mԕ8u 1p5.(o}䘭w- z1TC[&w }B.H3gh#iZV2lїW*#tcE Ut'9XE0t 2 1f)Y"œ4V0B7!V77OW Du[\<~!iesGlLiS'V[p:\N}8\Pg)onWZ0ߤ߀`-)obNl~71!Cy?6v8ߐ p['z4Ɖdٵpd觼3g]T%\_Y^_㤆C@KP#)뷬Oϵ"]yj[̳p6 n}*mJۑ&psީ]Fp8rNvI#?}ܩ8uw:NhӿF̱8۶'z|{(ܹ8]YMg2)kgno|v_X m%AKŅT;ҐC>pb\9WGl/q-`#B&"U\mqe.^zzC|̯r>6)oC.Ro.ז.TySJO\Yg+/\%\﹂/6 ?cpSq՜wuǵqPURrSq-DxuTG_ƝUPmao6C¶X4TC6yC=J("GOT= Q수ka?!B=8&.[bpk Q~w|хO}g۔0sμeYIMag5!'s#sr4AYekk\1ߩjp{Gq*V}Oh\84 aZuoS} ~:"`\znF+kZo -`EOݯ~R!O?R~U:^=̳csE7:V-]o(|lpK!쉰+⭬ȗN9ab霙~s+Ux{⑓4 gտjPቍ}7Х3=~X1uݔP>[!_GфM;~3[`mT_) ~󱜏漊y"Ms 烙vA^r ?~\㶾*`<׏e?G"Gmsg6ZVF=ൠs{ ^&t.: dvƟc_J<-ƛX'ys٦Y?Y)?\v~\ǕplSO 'n<c4{ng:2͆uoʚV\X ngrX)16&ccGu&n#S μչ}5᫘ViUViY~%y*r} Veir̫v`Xil>11-ӄo{ŴL Ӌ6\w!-y̟üY OT'3=tqPq}$#yB!\wW2]~L".g~#8u'sY. pNrލ\K} wbg͂ÞޖaC.r! f4a0`ӄ9cg[}3NJ`{"_q3ӾƩs?8Q}a9jOVriEK9|b?XސUYVUi59>58ɩߵb:>jEPpڀXF\nT?4涍քiM/ľ)Ӛq}3oy41 Z0_Kk|b?܊Z1_kG|kgzm}a~num9N-WKđNKp׍1'׍ằ\7iX"6e>7LL$N'1dOt S8tN4.Ogd˙gn3g&bY\7f3m3}p8o2p,Gs<8/b3|[v,`2"~qz고3i"05_-O/ѧ[  9:+O7^EϝK|;LW~Ss\@o.W~+Ӕ!u:/yBXCeq+2 A7G@&t,YHş &P&߲-ϵW2oq WQ.Kz+s(~Y])YQc^qˋX"./fy9^,\'.D.YbO.m˿b/;2pN\-vB\^~p }mb/Hmu.bbJ(Yf| ww4,py/~nse6!s=qƧW}9MYJCr:1`u X!\#ӈۉWc3̈́i&:&,˔e,33cY,KWǢeZLKnoɼV,ۊs_ޛhkpcm츍6zsc/8|Gu侏sǹ8q>vi'viLsf \4W2͍廱n,$p٧vivigvigv۞;"ϱs遬[ 2]1\` >,A\"q_K,̲yn]Z .Mhrk'r.)AJJWWཁ1Lo\ZXmL?t}.sj4{g㽱t>w2AL JI4F&s'].v\^q^SރJ9}"Uyj7wF/D-r]|7: SSkf,9[p[qڊ6-k<홧=;0ijp}UG};1Йy0 <]G)i 6BfR]Bwqւyx1ҹT9eO DF)L-'9t5Lc#SϟTנ{N׈x}i_KWw:oO~L;51 7|;;ߒo&@ `" (vwߚ?Y֏~}L?,ۗC_aoe̫|DN.O,<ܧ\澽^d^wpO=ԆNgv=STj48mN Xrt^7j!|qyXse~WqeW{ uzgE$gۙ'O+eN§orupd9\}8p3=9orcYvolVQr*k+xXGO{ep6 p;V,ÆeZ,FbX<§\,ۚuf X'܏˚R})X7DY=UVqԁˎbDzg]Xc8ڙ0]>r zRL;cgZZ Vߑ{09Sz҇V.&C|{?|=yW f++r,v";# \s/lS0;<*)s}xW =e{S}vHml/I]J}cq)1؞J ^?*_~TCc^Jl뫰g +I/>P ;'|_/ %|I۝+91?0ms~(Ӈ1}ۏQ\s\7n<'r~'s~ Lt3}:ҷ%~*S&Ma2yW2x_Y\6pCK˙{pl-F=V.o2O`=py/c?[Og4 rsv=f,wJ*ww]}r$q{X2ݒ{"Y1M+r_e;_qk_fxٝ ;\ܥޣNCPv"9o⾄*S=I<#ܑ0-M܍sY4Gܑ0y>Cܣde=1sYܛwhO ?(L{ʴ*"-(܎Od+w-oŽN5+}Y*Cr Xƭ1特Rz\'$.'q>e>o 1\ 7< h#dZ|gR:/r*Eq*~s N;:cfpl͉5e]zi\z{&M.DG؟~t[6cTTd[)쥰Ylc86[b'pSE>N-gĮ?O{,P>Jyǜe?vxlW[c sV'}p?b?2_3=vM.cD" UiL~O'D\y+nk3Xe)oX<^>Mmc{<,G)o8si+ox~\#o^[Eҷozot׷xzgjj}GV2]uK,}(ڥnA;lmu*7^ot Ocon!or)tK߷95J!NN=_{Hj)2Lj{bUb<}rdj#y)-cGzcJ=UNMtG~c,ikF[S`m<5ӧ67SHͷPYMc|hZ[nOs ŃbhE@,Uwm݂oN_/Io7ҏG VqD2UHfjy8H&˸rdE)&u:Vܗ]iBv]ԅ<瑝m="dBd_1@g~%Mߑ}%*GɡA$9@ Ê0m29tJv!d*!;˻dW: #wɦnnCVYO}:2nٰdL'<%{d|.%#taMKkD_!_aQZP<ɤy4-ΗhִO4fUW:^F$UX,-?[#km=_-NUMa+wUT-0-2$"[VGBI i[ EpHʾ ;GNt}140,1:r'a0q0.p g*ցG0 nZ~> {91yT嫁x!GT/$'9 1_̵ݑer E$8f5"nYVZwq{nq9R~n},n; pgank%w3΢? vGAps<ƽrpE?_? ƽpoBk~EPr&D9UP0| NC7LŽwXlcWp+(,ŚJJ'SWHJw歟i?uXyQjbUģr^`-'yyG}efWdg!rhrf}Tթ4UIA4d\HU铦d+i}cyjJh+2O1mv&rBL.ix-"?).L]t ~L ^q+EuL1DRՇbWwD -PɾՓ-RbBJJϾSbf%-3(1>%޳)iTJu\B(\8%]JIz\n %Od>RPq3J9I)(%'RR:P3J)՘R3)%z+<@)ϝ)Zvԥ3)sK()JۜRG:PJTJY܏ S2J2(irUJUļ軖]UcyJW>s)ᙊSBI6-Qb,x⟟72%TBSWt⟾lxv{)>'-(09Q\nkb^kS_G)ZE=эheɛj|2"w,E}SȬtux]dBA=(z;ւG^":?NNnw[)[ud~/4CSޕ AZnU7Ӣci>\#U, XzlFRcTcHU"v#?<@w1.){%; }WW.KCͷĪ#[| ;wh_T턻*_H|SK;괓̷xHi $*)D)yEMҫ-oQvjh Ѳo :쯋+ L);cä1}3.B{k,}r %>`:}W@\.0uF'aZ:̧'#LtW8.}5f NZEo9,shx%|kl{x A"Xpl8a;!khD>yHj>FHk6‘YmȭVyzAp?9NP0%X{_3 mx0Nƒ.6iF-P" +/vx +pB%:=C<_ߗѨx$rxE_,TƣWhw2[q#.&*2}ScO;T#y 0 XHgƲH0Bsj\Ɠjz{Ǫa} ӎQ'"h g["y#azL7jBl+b v` ļC厘2b6A  1sb<#^|ڎwmѽ*R߂6Ռ '}6 2D[^N!"1"Dj7D\Cx37"<½ |wX ;a;am T\Zqm!\ 쇫;Rq3\V+7{ʻ(!ChD%BOFp}\zbvyPs}a7#.WnuSQY舨6fP}|.hDw`mB}0Q"~ Kc[q 3+#@$ Zoo".yk/bM=e-bDLbv$#K/5:_A6Z'i8bj@bDoE.D/@0D+*eV# %@3 wT?!7 y:Ȟ:ގ-CAG"zc}/sAB/x$uCb}$ilGRH@?}!$>0@}H<l9H<Hͧ!t$d"aszBw6 qAס;bv#ՂtD<({ rP6FԷZcD'D6GĴwwtYkXpmG[\u^+}qh\o`nܛRxh( w0.N";]5e2wHw^-x- 87)ř=8ɳc!\pppvSk[n. 6aun%w4&'9xߡzpg]]%:wkU`Y'X\;bl3̸}ӪLئ.ƭPa6H| Flİv|  zD58hrgEZu4}i5:vDtQhmeh+APu RK^cǕ?Kw=7u҅缏ҙGm%pɱ-zhH/K:S򰆴(i>RW)]jf\NRpCIl>frF{_޺Z ˉ}oET TWlV8]\T)TV|%e!w2o!]Ȝbܷ XNEǽd1z Y@GKvۭ4_'(\IMedQr,^"dnkekj@V 8sNIdw"MDmCZ׃ 5Ⱥq'd޷dYOV5Y !&1d YNc2t'KOƒ' ( "lDךYdYJ$dNj, |j52+9DfWY2u%Ӷdo ߫@ɈFlɐN2/& 2iHбѱ&_nHwQt3 F2mʠ5I_=I/ڍm{d ޼$ùpa5ND2jMFd9EFJJf2 %go D&d&hC.w2 8EPe$ Rʵz5AFxN@&$2$TL5"v7u$\2+If^%o4%N!gLfٮ02shEf禓٥d&s L%ȴK2L&!dZ]Sc2Q9;#d2L>!|2L}lLf~2yK~v^dc7Y|u~ Y7AאEd!~Vd^=H;T2 <t!zdѶYH7"5BEBYƬT#XvW>o Bs΋2^^d@z+ɪ|KjQtLd5@ d屑&ɺ%2P춚jXOǹd?S=i4-6M}eє4h &'hY*MDSԢ)z4U+5GnvZh ͮAs6_yKv|]pZ-xNv$ZDVNsKHwݐC늚ӆZy3ںi@O}:>CGst#۬h>2't,}z ןlZ݃!u9&nhr.r ׾Mk=궝N?3{R\cgM^O+{:oG~:_|/ ibtL-\m]YڞkB ]T;)B6EֈHkQw qt8%ԜJ ?(g%w_)K7Jk8һܠF](1eMY)]YBS{Ckӝ\(_s=/[J=)k?1}!_B7[эt#?x{nE7 эntJ.غn nJk)e;;r q+)g6e[NY+)(2vޥ::R"-J\C(mYPc RQTЖ|RhԛJ<.L S`y#r43̾6"\Z"䘚Oƹdە}|^12ٔ ⎑Yt-T жR@i/ l3͞=xmy؍j7hn4(v6"vm4Vn|{*/7[kN7Lopoזo:o8Z9O䌠Ir꧕rUk9:@x[UiCSu>/{zȎ=beβHoH-V)ˣϓ+7+*rhQ&lTmj5$*pipZ{ jWIK֞5 .UNjvB73=%]}֒DɪyɩiԦdTrk$漗2.J& ? .}X8J4BKQ.jwٍF1Z,C^w#EMзAo ك!obx:arTZ~3?-${? ͓xo2neagK+>53t .c,xc/őϠ #'7<v7a\Ɵ' &ԼLo,يW0 枳`a6s=_zO"lM~.lhM*+-pE 7m[UrB Z=0"yc_*7up& SӊpvN' 'fĪq8k&{^:q'6i'dx:p(Y{-9?ay%G$ r/#IG;;>&q Kzcޘuf2bZz=:D`"T t> yur=mIJ.Փl&7V(y uO}vNx*jxxKQ1Ts Ug ߪm?&׸-M#yHXy쀅Jzs]3c7Ȧwv峺 rԩsrܜrj[K9XN"{b]'/GgҜ*^ *R` M10j[~{L-ʿZS빳PjڽQ>p/L:iPGt/6K+R,+_@Ѐ}h@JVW4^QoI\9ҾGRBl,{4E2`̋4&Zw(=yptǓN[}s1KRhhqM{ϼLsɴu>јKtn9:, N%_Cpo6|JvF[H ض\mJrON3w+m؊wQ`~ WC$UE]_әBg)bJ!$[%.QB6PbCzRl/PݔBW(P+]Bzt uSe|&%|W1р^Φ!MD4{%]Wkzwo:޻D҇rHCw}4>I~_>b,}1>oSq}%<}WsyO,[kbזVu3}ٝ^Su_/PI˭jt.~ͨd *YVJֺRɴMT2DˎJR 3*2J?0(iM%RdW>?OccXzme,ڈ_xAOg7OCӿUty}UCYnF-) (LmCr|K(V(]y<#N3OEgێt2٥'- YhDզuW.iW4aN.IR>D=Q֓aԼ jj߯M՛RzrrqAH+Ws+_ΪYN$G-_:zɧʎjǚ;[ՒWv,O_`!K^kUɝwv. xUʭ U.O P-i1IZf;ՂŻ7䬖3un1I{ &~ϕ׎yJWHU̪KGHH]wEIR9EFڠ! J[7N%JJYwJJJbV ^#|и < sᲥ04>À0, Q'-7d 0V&a:)Lm ՝v`Z ӎ`+ &|kp4.98-7`o]rbǽ;ؾv>݊-aO4'6 N>֟#~o&ņ6!6:t [Cc(vXĮFw;n]~J88JFH=hC8t6v8[w8 ° z?ю8w㛑0Yf0~ 6,MK]90]8GmWaR7u`֤!̪Y4΀Yrvy0 ؽyP? a8a ˖Q[aյ l#`'Wul|Evl Q؍K~@#~&%N[~Ikbc$bCp|*gKSp) '?'rgY8=}]zm25ù3p.3<;cE&<ܬAkBxVOp<lx|{ϪQ2Mvóxqw<y <{*<3&3^ «qwx c[-6;{xwt'xJlx́^gy:<\A;?8; 88SN ǙqfT)pv~U {;p;57ex\ >]z| / gS. ~ |ų^q(u34&nudkr?\۱_kMKr2P kRG.9h'F.+sTrvBzs\{x1hJK'Os)9J_G19j7#FzX9"m0m'9tL+doڐ' d7͆lvN6>nd3YI1zJ(Ys݅Cd%T$*dkBd;O1l'd;\ɺEjR,7璅.2O}Ifkȴ;NFd&Kt'x I;A;dV qZ{3ByZh浾I.[ciŠk4r AysYy꼳yӘ.̤MaGtU~|E9a[9"t|RlfU6M_+V^i<y>zG%rCrorv実ɝ+;o"-^!Cn3Rn+Hn)M\4F]gufVkyߒkV'Wl&WF\^կrɫ׼d6!ƞ:_ST?fHu5#R(AknNگ񜪥Gڪy?vz:G[e5%c* UhQ*p;UZ?3Uƥ;5dS}QO\Mvjrrmw-M7+]'˽e\̩{(#܍ҿV.6q-oޔ+C)l*o6אoIW=Oӥ#^-H>TCqO[-8H)qd./K|i[ߩfZ2ĔfmoG?Ө+4uM[N*P.MUrr̂H9m:l'6HsOIseK󺞖fkIM\JsUf֋[%MlSHӆ<۵9~7e#.I+hv,%NIܚHQ3qKGͤ/Gҙs7]N忡o3+tM#-8e t/V'nx-,#[ġ ٛpncxwrleE!G#4W7#7*<#!!IK!>.84xG"Yd~heȾ!?ܺUs#3V8kkuk*e#sb2l'"ݡґZ<!1Ko!V=DԀoVXazj}: #Ag (-+ZRIal*=-z')E6!ygl9HZM*uܪv#mDIrS˛ک?}R}3In<8~<5Kӭ7l$ɲE|Y>=CvNvPI>ݦD>+4@>X>e }{-d9]e1,;Yx'{鿕-?5DA(Ω!_x#5%ް~O~iedO2so ٯPٿo 0Ay[Y^Y7P1&ϿOMS>O=d_~?Ɂz !K_'N!=!:Zko!irHںD;Tt#FQy2%l9fߕrJx 9o9?\p~&A~}Kpqc**ΣjPՉza/OAhhc\yHsߡ~ m:^tL6GF|!iȮ~9$rsӯt|E>/hRBU)|EZGQ{C+;RФ(ɾ1%dJR$J;ٍWw(#22(vZ񕲢Rvъi({]GWke[̀9&eC)}T;J[R׌|!#)%xbUaŴ>~-$Mux'EOۖRM*;S~tg+tk }te .Y*}´>uk[·UyL I1t..->HgfѩCWr5B ts2Nѽtgڳms ~ZN f̉hR7FѠT3ZO=CMޤ:3_Q>\AC}i]9TA\&fߑ >VN>UEoSzST~~k=jRmfڗ}oqCIhi}WcſA:t|d6V/|$U:(Fl+E!%L#e 0THi%t<$}:f/, \\zCиv 7AN оestZr]ΡG2~v3E zD衿=6F6[39z-ڭwT6~ ?t/8`P.>1ĐZ~? he!cHS~\Rc";joz5Zxo?M}7@aKпI?y] -i~jiDz<q.J , ^R|i<>Wt>a`h= nmпT}v{1}MoJs~!Wѯ{wO^0A9ĐjImo#+cS}+xvP"+=ȓTS EM'wkIOҕ*=@*tGƋ´9ҽ`pW[8 ]*,vQPPit;AE]Gn"'ݵ ޮOӔX _NRѣCӥIjhIEqRCEO]ҽ󥂐R=}}{(ޣR'])kG)iq)&R[Gtv zIϧHZkYS?Hmkyڟ?~׎]mA[S'fUuYUM'F,z.rV~F#PJnD|"w':!rĝҳc(cP6cA)^4eDSk:f(Gلw{S#|rP:-rl܋ )guݥ])f,/|ISRʟS~T;Ey.Ix5@o(7%JSnʔ PpF({0(eQVԇ2gSƻ֔1ԧ(fJ[Cqu(uVCJ9A)PTlP⻕8x%Pǚ?&9oQpbG):2{%W{#!1!"Rvp _[B.]1z]]2GW&ej쿏5%Tc/R1G]XszP``% <m)3 NEtaK>5׫袏]Ԏ.}F&&k=]m1kJ#_IKR胥FAq„"7S+E=[H* $B4G4cD^D'>XMygH>G$~B+ݦ*G}HIQcXG VfEHÿ(r6EVMoS[Wޒ"ף5)j9 1jF5ZP疜FPX% 0+W wV[S0C x-{( -ZJ3(4| Ik'S謱:JBr] @a) kvRyq=G>tE$U)rQuD9f)΋Rޜ[('DAn&󶇂fjT8 'vVQΖjJ9c{QNŔbK9Qq: Rd綬M6<^=u{) 容CҔq猨Ja3)*:T2S/JIi;K(ukJiEI(;J)G)6b}\2E8R+ۈ :3RG>L]Sȓ r?H׮h]k0v;ꌙtc\LW:ѕl/[+H[2].k̠h >8fSpܰ/]zm9]zvtqGt=.]Jӥ9o9t/]|`CyEٕ.ԡ#bbm3ХGRMtijdIdLE;P0fR7T5+#.VurSl4=,l;O3`2k+BaYm.WGp|rxoTtU 1;^-}y3Ϲߓ_x6V]El\xåqK&J3\k!z%mTa|) #QDޭo Yо11 NOuG%@Cğ^g>HHNyHxw%HZIw6#y.?-E HCH|tH182sj#k[DU;LBΓkrCȯKp=nMjx Vd^NGsxDŝqwD]:>(X' EL{#q ܫ(xɕP3GtQ7wmL]w^9__qEn/h[qkD9ܼh{O9Wr#[crf ;+6Fܕ<O"CsV i*!բ"R k eb!3$G_H\gH8q* 6' &=1b]4Z!# s pQ/! D3BxI}B|kaqu~E\Y1 #xE\Rq1-  0 +OFo_w~Cu_q[kg Su} ˜ow/xϞ=? wSkxxF"mMXk{box7=W C{ExiFYJx]jc:^vN{)>Ͷk",o"Ņp '5ŕ#{pO\ɛc*jLD o+1mvkB x۴&( GP< یǛ7&>x];_|W}vFقoxxT  ںN q7*j id2GfS U~H~=SD̂l㎨ma t+ (E@ ÀO"78LgQ qrwk.:p|rCSlkf&a(]9=ؿv,MA7-ϟk 3o 1E;1M=U<#'( mЅ. SщƣSvtjAxO_n}ݝhYAj1 Z]hQi= GsUEӯд'4iM;q 4ZEQmg4؁FdK.}{}A]ǚ" [NǴ(0,v?ڹX ߍ y ;, /]*D\S0]mTxU߮;T=| g.I&)ۑB.H>/o> z R!>FjqҺi#NU܈TaH<)H37_!y$=[.w`t o ]Z".SFܖ=롉/k ?8qbBl`^vG\.Ɉq^, mŶtQniLDfVy5WDk4=r 1 *Wj Qǭ߆U~ac!<k~5qqx\,  EPwqo&rk%<¹-g-pf1<[d*=M[pph8p4<sphU["ad ڇv\\Ѕ }Xݬ+rH s0[&`3`ȱob.Z3݅{qpu+h=; ÖiuA%`WXl?u0`4f?L &b`c mæJ!9%cԄ:#Oţ11"R#b\0K_0li z!1 򨌁1Q>Ţ{U=kdtY: th7ڜFhY!-Z٭hֹ3ZDS7hMNEMh.P1upG[P{jY˒-O6ye5VG6j;ơT Q):*. ӎ|;hFw5(73K?/hK߯Jhc3I҇ˤ.K-gK/lJOCH J Z9H_nחr|&RFR#RʦR()w&[ Ib.tt$6)l[m?)P;ttzL!2D2mYگVz,M<'; Z*։ʎmu6.0nA޸QֳG-UqR먪jۼTU/LQUr(U|Zԋ:m{Fi1"*(5'+b5Q<9s-6^ U@Mjk'\o}(a}i&ޒ咵 TR) _J*,ܶRzbE$\JQ۪9u=~itob#)kpucqW>8d6ۮ37ܮ>jDT~6Nk Po5 mpc${-:%U}$ZCBuOPtWo4U5EڢHۗ4HF<HknP;PUֳ1d>2&uԿE.z#M&2~\S.i%2x s6 #Wegګ&Ai:Y CgvoFI.kw y%w>7!qX7fc]K7U;q>n{[p^6036x;qW{n٩IcO' Bafe<{%]^@ A%D[ʜs 19gT%PDPH 9AEA;͜Ν{쵞]]]]T; VCPv'w<(J5P{:(LM"SPo=~2P<IWiPsJʡd>(E/~ $,g9PefqJSOB(30~Pϔh.(VBb(2 B^A-lFBW >nG݇APp/j݀P(qP|>⟖PLJ^: {( eAٝ(9 <$TClQPpT]9砲t@T5PUPq3TB+T sUO jS+# *B .|/G@(W e!lS(J%n'M5á/kUPr(g@_ VȻS$W }Oȹr&my,@^#pW kAC 2.O%[!$d>jH/ti/j+\HhAz,PJ!*dơPZ cd̜l @ƪad\  #?dz!Ӽ29u(rFzuܤ}S Q2^6@wq$AYNwH{j ig p̀Gza?_^ 2El*5R| |@"3xIV 2$j4@¹>>qR6|3hՒ">[C0˻ qFC.3BM-o}=1 K Dv25?ۆM6']Ro-7ۡVvt) f(Px[]osS(-7uBT#D|@K w2Zα^o;#FQg=~jv?v!~@4: tCI Z `*q0>[ϑ~-W!voqoMP\1yw}2va ?oSwbc &0LH+!jD!c+Deu.n=!ꐄ{ƕ6~!zYޜ(W1!FmE7b&a<xXmTwvwvm'W02=l!p<79Ĥ"?<= qe"0;C`+asQG#i= z dHs6BbrH0&!AWH{歐.\ t0$5Ca^:){8$A3y]nV,]%1ùG}H}R/TvMUecìBܰ(̼& @J7?)RRxU;*Iy0K!H4!${h4ꎐƙI˄x_یʴ!fq:I*g$׀!2xuX'yiH/:䳱ПO>s}ryMR!ՁUow9[1/RB*c|:!5f Bj!"!}<k~Mat2-n/} 3dAŐyds{q}8%Yy?(,y8pueŐ9CE۸=^7p{-XY!kmp0dgJ+Wd)|Re@^P0q\\;wś+(p2@uP9TvPm ꓫ:utTPjީAM]+(AAM:ItPsj&BK;յ{:#T'=)ՏJ>T'`8y'TU{j$TY*YmP T0islقCP S#eFM@Mh(My̎ÅRh,QF}fm_g;× ~D9R7@m1?WjxcT/ |ؘs0+l.ρdAQ$(2?QaYi5乮 I-olG@斛RR}3}P )q!e*$WyCN<'}s[C i HbL!I!$ƭDϐpև?;IrQ8[,y HD'(HyWwp]:$fM$}yyb݃9I Ԡ,p_o¯2!yyH>c$!q 3?-7 R8׮72¹쇻|K;c>rE\"!砉/ ᷽8 ՄD%9;m;|+$EH'l} o8W%CrRVNϛڧRw@HMYiGfCH6tXHң 1@F~`L̯ K[8nY+m+l.af6(݂/ğ+16w?CB/-8Á+o !hH[Ҕ7z8ޗ)2yn>,{GfJ 1ݐ0?#X7>>#YرQ9YY!>=!u3$6~f\pMp3P%x$HCѐҎBzyvM3!dl r Btgi/} /E71?s=yCބZ/ȓ ߚwN)W!7moȝ re2aN +B_pVչd܁u1 ',̋w2 42~͝+vBvyg9W,zw,"Y9 (ȉ9 Wo&-ތޛ}u5Bξ'㸛?1/潐A;@%kL~!p??>zCur[ՂM3_CO~0Lx7Y_wn =%'ek$~=Nç »Vr|0sUxWz ]}>A~eȤCI>fϩOwP(s {As(| {_ѱPrb {(vP Ȝĝ_ ǂ4:K :+Xʏ3syΝ_rOP9*@eT)4]a.ⅳ|Q3ܪP;j/τ:P7x0 {ϡ.7Z}* ɂs>u |ϱ+E@}P߿GA, O ,7eаk'4je|,5/~s |jG1e|?d?χo@R=hoAsKy͍H-%.Z6pK}R kE=Fu#QHE1+4cɐd>Fu(#ȈlbDKN0]Όr# `DY ҖFJ#6}LfDQF@FdʈQWd2#{|H>xH޺w߸3# Fi#꾈Ǖ0Xˈ'9#j϶cgdDoĂ 8[pv3Y 6F2~*#y=\t.H3ivA*Ch Mr!AӜ7c7K.i&| G1obc3Z@e#T eq$G{Ah( BA{fNV.ϛ!Ňߓ2&FwiRª!C4Zmr!a|a»5;K/=}#D(66Ό9$<onv7'F5x$ţ:6޳^.!rG*(= !IQ"=+]"v)g E=D<2 Od!@0B_!4~ A^9'1<7OF%p\ ^x{Q=VWpc!a\kp\%.. /Lg\ס"۱iqcg54\}u&_ n㿁Un nۚB{᢭$\<.fmK^pi}\ }|pAT}Hp$š3HpG7#>u dʯw<2_eO uYmMU_Χ@>pˬ;}nlWa\ i#\]< Yn^kAy .,e^Yps%e>\=ޣqp*? yc4|v%p;Aw%_$Yp/T\ic? M#ߩKpۻ|spG8g.%|jOpn=WI p#0ܘ^oGb~MzoW?<w|xe/<-{GW_c]vY_]ah N+$҂Kpiۙ ?Ub{݋=sGܜփZQ >]Apm\ }b=p.LV)pwΦZ[p1굂 p3pY glyx8+^ԅs༊.3Å={p}\=vꚰ//a01ːWS \7 耋']级Y98~8Y)mC8qDw Gw`V8&ž3'l} 6uaTpK_߅E'aK1̞/IAalzn O_Owl0z:W$'t&78+]$y- %~i!~M|sQ۫;ⓛƊX ^]Z<3xĮbK{E@',%}5q)OY{q/^ċN N-vwE;}X;{XsJzXdۊJۗ]Ayb9Սvm2o拥njK}K#E޴HCE<>cXMzFl9cߙ.Όsa:3Lcn1eCy7LP#ѬAì 4eV-7MwY;-wK!a\WfE1./c..c'62U3UÙyDrSW0ߙ ̏.k LD2_`U}-1 (\ Qa_8 BQBwJ=MP&T0-/qFϱsN`dT? UUa \ƣa5eQ k `5C}\xV=5v$lOԤ|!Kj2*l0E#IG{opv1*xbkziJT]sՊTx=T3_nCT)j3>$TP79U2o_z3*BM;TQ*VQ; Au.|!Zh5]l飱۰Fo\QGu^[hb .<< %4c7ob4EC-}+4m]ICjڢNԖgP5Soԋ®dp=Ia[k41]}wh^ŨW:u/jUN\vzPhja0i)`? `UZfL6O.H {{,@XZO ju&=:Pn0~ r%v"h2#[QǛ?r*P6)osBy[ @.|[isoTJE%ss]RQ:]D9(;mڟXr^ rmu큲b*Pu7P,N@Ɂ(1j^/QP[2OE?PEN]h;X-F (.J_(a1ؾ3bmVFQ=( Bt^/}/+PK4?~AbGCQZ4 2GޞҕsxX-ANBX}XHy>̩*Abf5Ӻ3;cQnw?)iE矰1kc2tp;Eg,^gzN?79ɭR 7gK9ҩ%~kw6#ԛ]+8Jb~NukoȏOJdZd2ߜݤ"26 s\gÎ#ڐ7kGjͷR2'{׍WXmI>tDh&&h; MKd> e4nqa2P>31+cOF#Sh4=֠9>5 -kk_88?&_7y] w|II=922ǚė[y[w=7ߍC0z=7ߜ6ּ.oQ_a f~;yQPs xˋXf^^ jܹ? Wڅ T>:No6mܾ-/SP~]ޗGĮ(;/S>7yfp oWaEŬف2oRyPĚZ'C(k2a; xd#9_X>cR3:Kv*Q/r tu"8ĮWܿ%Y(ѻ3烘o`~p~i^i4M;|_ܛi)bd>:|n4MgdzXsLE ST`&Z1ߋQLYLa Sl6)t)ș^|;䝿,gLe֬a2.0'2_uyc &W{&^_&I|Igr'0I1EW#?D?rp>E"B25I]I+d3Y-pgLє\T SӮS(i.gRL~E(^|h7PsxgJ Õ8ڏf=E%靯Kh*ϣ *ml=wj4]6~Qp-'ن8=A6͖Gh'/P gLTDs#1 8ltnG Ǒ qI8z4/186:;qqNx'vIrpRx<NkVpJI:e6N}ЂV38Qm~g-Cqnv/Ut e}qQ>j;. fⲥ} :0qkt,*A.%nPSq\3Vntw"k8},@y[`K k0p io0|08>CZ`h`شR 4'LV/|&>5O/ >p!{_g]%o~/T@|k/Z@%|#=#;cd4o716R OĨg0pF;o1fQmwK໘~~|R0?ƅt\gPy&48 Lz<bLSǴfLwŒS0Safmì}mk0!Z.ܦw?OW0ǂM-Xʰhy,Vd,K`مX>d(VtNJXyWZq7k]a:X'9Yaj#s㑍F)~ꊍ71d/~?:=l|͖ܠ?c˲plsH2$N_"Ju$\IDʩ$ZDIZGTi9I+$v ɨO&ųI&\Rm]HjoЅo$ߒd wHq$EUF=o@ol )LF ~IBoF?R8TLR OJ㉍ϩNPGlLD:R RVt qOI+)jz0LF*I%NOv}H*i n%틾cI{,vH#qH܊ HzAZH\ZeOZS҄GI{f@Z:H],DI'>tH;:;ؒtG)*EzvtO*龺Ka9t.hSg4m5:'- ݄atz =hGs R:S_(SH4w!cHH~VX'^{fI";%0pk2bcge49 miaLz"Y!+yƤ=iWK38؏vOT ґ#\`CoSB:AV 7_f s ܸsc͍gHUK&;u5鮨.C)Y:+RƉRGIOvm"yDzv}skJ]OSKS"LQd 'CrȠbuRM3u[8 U w2(IF6 dm%cB2f,x{ 1/$;ORg{9P ESRzag%5ȚzEJRI"RIw3v>dj2La4tl𕆮΢DCy? mL*8YA}:ԉ_#KdG dمl%Mdrd3eͪzqP$8&7;l<"-lMXټ BU@+v =ulrȶ`%!d7&f%dIv/sɮ2u6g#}d ٿM9:UGx*oI&W"q<&'X` )!q"^xd['AsFwAo7i׼>]p/vGןnm-Yb-M#;!Bn#tFT ϗXTy~s dw^."%0K^@vɮ4\yw,&~#OB ?q&FKƐ؈3 ]#y<#0Y*=rNonglZ-y)z!= 0 Sof"x p/AvA6UlEg ҳHxquziXsH*sv~,:p)WW/}{ίr=r}qm?drm\.re )7+U n+ؒ́kϵٙ+=qy v~~q _HUsm͵ ~ُِ{`CnL9;r6.52B?/ >ua9>Nk6m} q ѕ!hM>A#u;iHCojHV =Iԯ!4d]( e?YGd0Y!d׃,M& G4LHG`Q1 zCܤA}&WM4+c PQHͦҡ?ڃU|x,2l@fLlvQ@}']{7Liv>X4}-.@}riS 6˄e)q)6M;M1( [_+Mj}l+ƀ FC; noj_bV㗱.968Xu֛ϱ},{rXw*z8N ƚFUUĚ1+:VjcʧV\MKUX)+aқX^ѮXhzX4,S)ar(z&ױdc,~ŐE+go`Ř0w ̹[aJ f)b&`aڒ,FKLa/n oltO_Lifb ]0t&c&L)o`divN”/R<St&` ]Lʝ[)1Ez\bu1+fĬ{1=suC0ϧ+~}?vÂ'X$b4,ypQ8k݋n`EB>VUzdAOy#t06ð2O=Fzalh'VUʠ^X#+Ŋ'ۅqcW>ɖ鍕I VzŠwj|",r>cWc}[9`ɝ,h|>Dz?`9|`?Ǐ7c|4Xc118}n㇕0nƊ2˜ӹsv`t:F1K>FIf: _/*>_fk4$>U'!Na8>CfYa: JRǠ En`=ǎg|\PXo u1ҏ;q ֬׭a@x /C[kS`;9'KU'X$vF{}Ln vlsW/el߿rQ^vW/1W"]1+q6W_++^9?6'_w٨MN[rڮW?mrzk?W%[y G_mcwOC!^cτfLןmJrڮxE69ٲWnW\WZmJ_%g  mhCІ6 mhCІ6 mhCІ6 mhCІ6 mú6 mhCІ6 m_,$-]XOY\Ȋ ‰iy,N޳X vZEgӒF(vẐm1ޢ,z, vZR3NXXskY;NbB45ki&+g&+g+gFtO4Vƴb7X:MaOfu2;DV l?dzki,hbQKN#Fm0; gc+m0b'`ˊYYXN6C#NVb'xibs.?RMQ+Dnj!&nja2l6 Üwlcana sXEEQVJE(Eqy=y;?{; ՎϞ/Okx~/>mO >8ß#<=kqY$;U(m,wH]gY.q{2q&*A QRĽ9^.{-ٷ4A܋{>ۋ;>Y?̺qs$xytGwDqP 㼁| ~qD)ּY/E qwC+2!c;ggt >:;0@#s:^I(tU肌] /@{2x3 ܂`x=%%KǑUr;2 :hD=+@&}Ytt_W9UlY!;嬾wPPt 98g`t9Cy(!~ Eht03s ,exΘ}fόmDOf{n}Gg!zY™JdAuj#>I7wq>>{qhDϧseSbYߣu+$#$j!% Qɏ>wȘHEn3A^9|$9R_FG+,f&GЍ 3Jw*:W5grQ_BgLDO{Qͨj1AF}(P^]Qk8>s0tj:"tCKx|}7~_]^ر' z.4?kzcw]>vN|{>o kkQYt 4ش?oՃQ2ՆVCgUϷzpX>\b\)cCr bqs#E>ⴐ~Cc 9h%1م| YUL9283Fb9W9IYzns#|܁m|M7 *eo :$qU!*6mMI,rqN_+l_a2/v<- _" L?%4M5'ٹJW{3}kf<] 8u\ q٠B5gq><$6HtR]:/  8waq`%2.ױGvGXl=ހ\yx3ڭFot=vW!=o|@obC|f4֕@mǮvxH\ il>q9>FL|zrbלwqf{rU\?Uй? F7w.W_k|+5Zy.1q8u t}6`mCb)b u)q453}hߚXlClz߉ jnY־_ZʌZ!% e"cCXNAd{,|EW kckGN"MA5Z _fhYeg.hy5 ٟL>S*Ck}|t ,.fRh-g fCkkWv e-(Xܳs7#C>9h2AN؉ݍ {>`m9b3{j輤ꧏ޻v3CW=irGq?F2)]s/+7Y /^Q ~"]= ž_L;uAuURKQn7&775>M|H9z՜3ZP[RC6j6kc;hᲪ T= 6wnݡj^_^S;'G<՛bգ@/G?@AFƺe0dr(<]' 簤9iC9CŐL"-oPuŇϽ4_io̡|/2ce7 _AZ5?mzk/4g]@US6N1Y5O ?FpNH/W>xB%n㫿ۿnע^?Hrx O}qF@~=[>P>o V}[jV==UaћC6UBn}5;3 -!^3tij'3WW9l Cу)$P)t,)/@-4ZA9t&cCb9꬯v7Mj5jя'a_u7>ԣc|w:=IQPW 9Omʣ䆪#^aP\NzFZmԭ8o,5- #~E\a%>jijmWhtwxSO>foLOP3?wUq8q^ ΟnJKq^煽⬸,/bi8Cֿ+y,[G-gq8Έs_8wqn+`qn,gn8s8oe{q./h,Bq'=W8 4_g|Mm#✐%ΘpqFugd8Gv8 嬰: g_h^M2t\Kێ}m"ӑl\&Ά[8g]Q8kX:/^^ǝXqܪHq\+Ǐ8.|8Gy-ql5qN{wCoі^qqTsı8-GNqdgcyuq,NB?qdxđzKs,H*|9 _3k|M_Qy\#{cOCc`8Bqn#|qNjݙ=ӎ=mӒ=ϲ{Ic8@6tbz\mou"_ b.["~Lb/?%OC~NgZb7]Ǫhؽw^{ K+b'mľ%JŞ!3bφb_L =#Si>p×,_S1 1c1 #TaZ -'O=wFhB=4s)b9A14F=hUXouzXX~-oUX{zXOb}X߮&V-Hz0Pٿ;ź-LSĺaXײUXWu-. &B~;NOd (G3b ~h}wX#֠8戵}XU5#%|#c\b滛71/=\XG|X̛ZڋyuCż߇,Ǧ"D|vMJ6{5'(O]gc.59d /"|~M3|ެ._`SWZ9v3s>OO͈bܚmY!P̝bSL1Yu27+b>rX-8{X<N㻷.>|H| ߟkx'?P~'j5J0Qr\=rUCrN3Q*&#tx 5|QOQ?BYSS+<_Ty?@O0/GgIpU0Jl鳚[ Vw6Il/ [PغeW{^QG(wM'soMHo7~UU_lĖ 9TBw{wӯ7;M/}^ q8 u=yh\:-/mk>Smg[÷OL؃{@R|}yi>oV;2 ;Yw 3Pl ؓl4&<s9-jN8Ҙ2ߖ1#f3_唈#*89 լXļU wG Ͼ٧]VvM ̬z u5f#ռ[83<7`nݘٽtstsf[gll}Jp^WߍG38s0>&-c^g=9psO|>>D1K&/*EqfAw tĹ"EJd\U,Μq):n68ęM~ B}+C|8[G{ۼw˓A,*9|7M56?z{qs,jUj%N5qW=ƉG\Uqb}Xqup_#Eqo#T^qWD"+b 5:S5_\i%_JOz\\7fٖ%A?࿨D\j780O\S}bE.DR!ru~S$(߽A;˚~$X܏q78)Իgݢ[q/WwY;*]~wD'Jw{!|>GWin;沸'{R#=g%OC"gsn {rŝL-JR]eA++n{{[ | ][Q?S݇[&nTwI8˚UqӫOG!ƻ~ga꾇{ yWt.#wuo?@V? dq~:wB_߹TIx#ux_#hx;#ǻ{$ޓXdxqSi/uC/|7?<[<͡⪺kҊZWTw^{C=u@w?w!{+H<'Ge?ރPw}8^D+G}΄~E1츺艰QH֍F1Ꞇ~_CřѬP,W7oݸ ū=%@0gx]qףq#ʸǞ=\aVt|Ȟ+ϸqoX3-{1f{GO'|V}=2ջ:\Nf9tP#& w m51t Sf/rػN>HLU*9*~S wz\ab{ ;=.-GǡNS515y+1_(QޅGb}(|xF.N~Yl2<>~sSCء0*77OYⵥzG|uTTt_wS_ PX\Q~~Ovu) |FݫX9)'<{>5\m%#~\"Nc_y ΜLb,r".,x˂b|o1p[ Ⱥ38{|rE þZB3oD*4xdXdZ|Ɛ7\`qXeĮ?378wy'sӱS:qnLůR9s.dnue;InB;xOwؑ/6g+j Xfd3#1M5{͈P-Oӑo~3 ӧ"Txc%7{ug\G_wyq y N͗'" Lf^A @8p`< m͗^BrKmlK{4_`y[eyhp@ͯ R͗8Go |voQ^y!ͷYLȷ\K?|^oy/V ohבM͗jO8V5yqͷW=4A5_3i}a.r{974z>YUm vސnoNK>; {~4Rߣn׏Usqn!+]z[YiΙ.zh*|t%dfb3N'|| PM L|oLE\曈&V|}~ sA 'r^Ag:aFl<*yG>ا7腟^=UO|]ل͂//sK%lԃunnw7jً"ͺb@P: ]uBGr 9#:@=@yyӞXkԶUms5zoZV9Hײ|-{ 9g5m3 gwsn쿻vBSBhD;VwzqG#ͻ + yA1 7g[u ^"V> [<'%u06r`-| n>fw ૛𺹊=M mMۄ]6kӦnd/{o?kOg|ao1h&) شlMmK )Ӆo!~[;l/1 z&N֏-w۰6׶%Tv,jZm _3aEbs' q/];@oy`~ /{?—}='~r} @}I>}3LJCbwH0}Ͻdg#4b(GuX+! g VJJmbmt| Y!1y=nww?%/.>p=]Bpmߒ}~@`%)r)|441pׁȧ<G>g3r9ushC)'}A|>{z?=V+o?~E}ע@z|}x/r77䐋䓋Elx ]Ke佼 [d|2~ߑ?ju{y ?/~8PCj՟}zFkw 森3~3~r?"?s<~\rq{? ~-5L6PG~#;96OWww<]׻?Q'==3V0T׬ v1\{5g.~x~ 3OV?N}CUW}u f5}d=ϵ/{F033?μ8̭OtOз%w_pnk՚ jڠ&s[@ݖ~۪݃fA{=^~ Ca:2v|.٫6, LЙ3:ccv [t_b~"{|%`xq31vc^`;w_fM=KM/A𗗙4?9I&xs'>z3)6$t탿J@W8BRy5%CyՌ_9 0 `<o B303ƮCkv7i( g8> } 9ysjϩߩ_טWGQ/7{Ϣ1a,{QAThfq8CNXtKO]~|It'$w*T5}Md:3t|#?Ig3M&| _ﲜa(@ڑN\9_b٩3'gB7~E_oK3k&ϳY,lX`D?'ID%!C21 d k/=g6 W yJg_R2pGbϹc}7{J~L%_|0mRLiK;ʴ=+tr]:ȘN#<C摏-Q2.w>cs~rg b9}d,9(6߀.2.|u{g7bO5> >X3ҏ>͔>[:H#Q*_K%Sۢ[\tdBYCؽljomΏo'0W#'b8u`YwoМI z{pSw 715K>z/@oli'Gٱ}ذ- VcEVlnA?I*Ľ|oBmQ18zO2 T@ާ4ahSSSrdbz2=I!*o-DhL/kBGn<1KOK %"CY(XǡqƸ8#ahb,M\EC?>G} QzDQ"7D+ƀPտ0cMg~F5{MGSW߂ɗѬFVE88j8byd!'1b7 Klӈl6q;aĺg_q=8zIIuZLF&&Ǧt0M=@I 'PofKHP|yĈݚљZ+4|F=vrZ mqbS'qd č|nĩ9x'=E"5s\9=&ƻ=lǹ4iiԻ{Xϩ{~OO~DL= g!B""C,F%/,# |n:z=JXENX] pFNO.J/~~}a.:XOXlil$m7yW6 ^\@Nގ?@o;عxڅntmͷދ]a~tvX"I&A| y~:8΋ū4[g09K˽:[>l#԰hĊ:> GGӣQx?%%>JJ_(A%7)@)qTJ(ERd-)%WRVʞRx.%J_ϸ:-rbiW)u#`(KQ|䆣Gq?Gh="n5lt=G}߇Oz ًo{a-} ݼ/#C1_Ob=D8|uzs y7˛EeQ=E?}KKAw{Vz]Ƚ z( ;)I.؉$v? vzi=>AOuo l V1z**`--V6C{&&tyFzvƻp:6_~Sw1u\rqnܣbZ|5ٜ_0՛ûmlܐs~^ua~3WPwCk9d78t;.E%rt-&_deQAgFuN[H-3#K&u~>lu"sPw1ҙtvTHogR\zStSs|q~4fȽzjY>=f/x4uDSDl*US|$Á>{[vxghuŊM ͷ f:10qO3Bܖ@4ΞF=xJ.cpl$IIqI35cw&P[&oo2{C1vjfYќQP͹c1c9R#Yy缶x~̸GԤ?6 ÏџS{kuy6] 0b6 ᷃@s r^w 'BC(B?9?:O]~P?h#_~<܏ٗڗ\՗/{YKjugc{#sff|֟ Pj_(sZ(0,<'y!#y1l Scg9UﲅCox_w`'? FBs䪿M;l8uӸvxg18cGD9fq^bUfޤꞏ;J2$dg9]a&קh%7uFRSTtJJ'IGIC4jvS]96_Go;o n}~KHRj= Gԙ9||g>v>!We/q盞'ȊF/O$dbLs&͸˙e~TX.pڪ.-h(~~ E J ****.W2\dUӯZ%CJZ u*+W24dhZPвM%CJJJ +B*B+*+"*"+*b+*+*ۿ**+*r+|  WPi%CJJ0?bl.JHPI(!3̘o5ugC&D!MhhB^rډE]zxߝ}]kfz~sᢔRJ)RJ)RJ)RJ)BCCCCCCC?-ehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\ QZlWJ>Ǡ_Z| J)HHRJ)RJ)RJ)RJ)RJ)RϕRJ)RJ)RJ)RJ)/oVJ)RJHU0UJ| J)㵫` J)RJ)RJ)RJ)o퇔RJ[ ƠR{Ue[_?iQJ)RJ)RJ)RJ)v>#>O{֏xD AL `am/;E"u_8. ! 5L$b!=>hOȼ'6`F!T#[N *A`x-{r'!pd"B ~&Xu=1boM`yW_u G-'̬n^Wx3fC1M1ys8?I؋ &mOx; 0.7ܾrmZ'eܔ]d'"w`lqM3f[xGx'bMt+n#n=ۇ0KW x0N8Vi7iLq(3 '{ܸ ӇZcϺy͸/ū2 7v XFE:-Z>;Ek020s pLy!wgcMu,w\3NqL7cuNc.[==qFqw%a^n;c>u_iSqe8Sd-ahon+8)^7$pn}~2q_I9*㬁SN%W2ڸ_4~Ǵ(vX5b})3/n4Yx 盏pɔ{qL=5fCx07`߀I-D;`zsd6p^;AqSf7RD#y8fw`g/T>7 kKpdz=|汎u&Jx-ܷq6lyܪiO+t9R7礎Mr2p_~S]̢b1%/~;nfX6bu|ky5yRM1]ZIcƭIp~}q)%9eζp5w`3Eƽ7*y~#ޞxoT|xnYa=7BL;qXM=7 R7H|"ujYnz௘e=U^{8b758?y\aλߍL8%*l;h R]>jMosrf//8瞐ȸv_-ƙ~7%"L-0Vbǭ%^Ni ܎0c>O]r`]>T>Mw˟-fH~If\qژJ^OtLzn`9RcXR1VXc*y4R{Lƿ1O9L%P3kp&퓹  :ഔǻ]q:s%S^,f޹AE鍟J/Y.5|o`OoSp{GNկpwaժRe}y̐јNdMG`9췫a4v>kqyτ tK`~#wbv~mV^Y . dlq/^cR}~Hz6Sqe?sP}"<&~H@T姊%ȾWw, :m~P 1?O/S>L~\$k`ZEKܢ$ٻO.>n's x4yk3w(}2b鍿^>ԭi/hB# +%}B&6%0]Hm/vf<#xE ~Hѐ`ۆ XO0چUxV{xqܙce_-=VLi%}f;c=yS+܎@xH6wg#<ϏmzP[ WN|Bl&8w>wY+5G΂k4;,sfyq .$aU¿EbG'A(y[9+VKRum=>69ZbɞXtrM3[|QGB]rfY2u'X;c=L`>Nu5Guvs[}5pe=%V\cw&JlLy7F]=TG3Xn_yUr˓y4{aH1v^X$tY5d^AƊ_2 .djFo% (dʹ:3YȚ<&͚=,awGqfZO|`G΄=fJg{vaw6o){dz&y#dܳN);gO7yw,]oF^U״ v=]ZK 'v?pO sJyy;fv`%Tidv,Aak}vX|Z3]Ĵt^rsv";el:l+M> -=Xߎؓ%X$6#cKTYQKNd)+`Im+eĒXRǙ:_eٮ^gvN{1){G]lj8tyE]maF]/.bolog}V;bc[ȖiUl}-פ%GZlϖselyo[zXEl1e[,Fl~[曝k~}{6/f=ŋ9q۱7mSj]6-4>q/k~? u.r6Z7t`Li.Je̦Yw fmS6 bSX6I8̦ $/M>lZoneT'p{ailrȒM`=g56MŦtF6xM2;=& th< }&n\6qqbĢ+g@CP6RalrM.gS36oϦ 669D둀kǦ=av $|&ؤe6q:l,NfiGBC6{ZeS;6bxCyŦٝ=Kl֠Φ yW 6M/.l#q6kΦݥlMe]4_uc̟h6Mwb}lVˆMn]fӂS{S,-p96`}oΦ^Al"٬Ys6~Ct^$%2fDZi6]:M1&9l+A\ʋM;?d|W6iӞM a㓿ؤezl'ML&ɥyl| bkR=66g;lUXq1`lx&Ű6#tc"glԨ, l8` al! 맰lP՗ZLbe)6d>l8-^d;9v g#`6rˆ 0rXAx685 A6} aYlPăc nSgZQl; Wa%l՛ CaY? |'8 VAc ^bCl`՞ fe X\84Y'pgl&bCl`֌ ^x @p .͆#lئ 3X>lSaCl0b6#2`Cg6\"7_mAV6xҊ Ğr}6|'%~Ć:b2nX? gXA"†alpBj 6`; ! YbЧdeklZGmd}6e4WL/blԋ+݇O!h䱁$'w{zYq_z[~77Ҁm`ͣX|e~J֛bFH؉ղKV߅BUYV{h%-f [Y-TfՋX-qU =ֳ(`V}VNmȪ'm :UU-oZԄU\V=U[`UTV=Ǫ>rFa[Y̪YeAVoʪKYYmV|ǪYj"+gxOV)b ViUF`+XVc*oX9'+y*jWY#Vl*'ʀwҵUe!B̭^CVЈU|YUX*zjZwVyULVmo*۱ڷ*k'FCVa+{F5BmYaVYҟU64cv2m 69ʪl?Vy<^ dYevf⌎*cbsU7!OƬRͪfYenVѼ*I)Jk_%he0k$W +*z +8Jw>A*+%cXl+ya_ XI>YiCV=;!alp/ wp.+gWYX)7;if+q}YNvDRҜ|çBB/akmV54Y+hJe Y+i[wa]tXȫT)M~; :ԭJG/njV;_JYi8s -~|6t~ !(bV$VzxEئ1+cncYikV%Mp{8n6n-lVm'}a۰t-8ymk]El7~w{:aN=alƲ71۾`Iܾk:#-V"vWlٮE9}wl=9E_Xr}#}9#;K6cIKfIt<ќqqcg+&wKx^=vdg{4ԋp1CCKg3YrϝWȒEwz(t;X-LK1=@bT %bGOɹ9seL=;b1Z-gF7 ɌXr7h&hsH-Z{?lK2obtIv0|);x f2d3a$ gɰ,4qГ.=%sY$e!IL{Y2ˈҜ%lӗwb:,!oL}0 y?T!e&mKg1:_bSUFg!WLk3bZo4ec8ɴP}r{O&c<;Mm=ر,7yi<ӟw%ة1vZ{fy0y;'䞍͹gVNvsObf/6gv{f!ٹv~]*[mvٓ񇸗cjړ#'ˈy I8^Y+({]k^9{.T{bl>nŜwMd~?Y>Oח㿄}jo7l+^qL/Ľ< ܇{_'p7M>{+Wr{s}z>+&pBs g|f]~y/y,' qH;=ߖ0;dN-z'5IG yǷ$U⁙9pE]Srrj-ŒSyy`ShOC 6oAIl,_AѷP EqdzdA X(>E( (%uOm-\~(O(n%{ Gv)Jm  Fqn*{PPQrv->,@I(iEQsD=pA @QSCk:vAqPCYA~0rE z d[C^ dٍ쇧;2?#r EV7rGIdzF:^>m!۬;"}9dwDWX"d22[ BF>Șl1H9Ț1 7##rj!c2 A@8dG=dHq2~)'Z!=y#ՆTcfRg#w RG6"E2c()A[R Edx-z*2I6R&#& )χ ! w# R=}4 ɱ]roF"m>ArӖHi+ 9ۺ =K o u3]<W!w?$_XS)G }t!> y.ULB.$.CzHd_Vv_{"=^i1HGOf!c~ikW#yK?"RB30C/폔@e$+tAZL3G@i"M# i<-3Hv+rs5RvB9H(SZCH䐉H!ezڿ8)} < i"k&*!<߄/dHtMHi)H?5@Jk'wk)ʑv>OaȘ%t(|zH9f#%J{2ZBHk H5Y_R!5F[~i-|RDZOw#u9 BfǻH-tDꛙԢH|=Krq"RS&"ÿ!RǝBE-oz "F(!U%ӑi3~#ΌCz>d5AZ7c̋.H[Rd^k4Ua.җvB&6qs&ȼi/"dMFz+@ H'br d71*AFХ^_2v.lBڥȊ܎R\DM Iyǿ k&i;"T[:THjLOȚ H덑ޭ/Қyp(2IqdηGH.rJNdXFȴ1~ف%Z,섬:NM:>2^5BƄBE>, 2\Q{ R[f#тmd.Cf_Ud32Is;>̉ei5,k/ IBcH#RGU[&"d2#;, Cl#y'㓐Hvy. YV^*hUoH/z.Y#iUR~HKw~ia/Erd4a"WB)edy,CF/j"d5RAznsd_Eg;7 d#sT-V kK_FV?NeǐkxoTHdE!]Ԣ{PdCY}l dt|GXA^ڹD1Z.$!MCԳHo 鍵U'S68[,+ 6C}\x-"-3r)z֌.jG1l+(:O!kAd؅tau=]ΔȞ9q>B2W5[wFs? CN#Eֵq]o roàaimy罐]Ȼ69zAב.l$9O99 &횇9 +CD/.71r{ K3 n< Eя-M EUcZ/ZaФt 9 G 1jBWTAw0 5AoGQ >yU^_yz!w]Aџ{z (Š[kh߭Ġ)-xU\kr_GV}G)f 4C\CޮOQƐv]1@Yo??C (Šo; d:[^cȨ( !?1 a 50>Aկ(pР(PkWQ<!*P-aH(؉B 9;0 9B(CN;EvzETw΢j (`n[wuqx!n7E_-+ŬO?) JWP.(XI}1 'o|yb6 ϊ[ A^P7Eȫ}bCs棑7[#{do>CB]d><*ٍ6—#)dEf~)"X)|;'z "0yMX!["د#!ctMGZ(d^YRUԢHSHH9tBA JtӛHOL}iF͈:q⶘yعHX'so=s,x1]o!["漀Gc8_zֈcqQň=`%*ދغ sIGt ĜLCሬZ7⏈ӈz7/gy#"#LC!s+.CqK TD{E CЭ a*aЇsa#,# 6#t6";BnO@? DD$`#0B@g[#d1B.F'_o9= {0 A]-B xk C""AуjAЏгF n__^<]s>Fsoޣ;.|o"@;]g/s&s{v v]KrT^(9Obx5>~ Tw18wq\Wۇzw< z\&uopKUppsIK&ռn/27Nív$zE6Kzp f^Ki0z7"=-q^pJ/p=Y_pxU Ǫ*8+1s pzA/b N-p:{<'ԣ?8(67df=mln<|6W ]0P;`l_Y ;tG<[nSm3w~'8N5ܘSnN$KaW%ZF} ]a l U a;)=c|^}IsU=9z Xn`h(ܫ 1/f=lܠ X[w6Volv,[3(73Xii'_5&zP 6nª?zlbaj nL`S Vac3"ZeկaV Ѕ~l6]{X?`5 "a~all~պmG\XK.ԇU g `6l̔ޭZ}0 RO`Vؘr*XI+kͅDXv=`sIؚgòK\ X `*hv%w. XW[X]l 0⅛X bX4+iX|h >1Uȶa `OX׭W0/zB,݇d&\ocsXR/>òUcXh -X B`y E/ga fRS2v>,ζtrՁUvXսo"Ssc/tyũN0W+FTůa&,^,V=X̪EZVn)|5փ`1>  E s}t{˾"4]{)tAO`q ߟΰ=́h s`1z3?AC0Z`>Wl'lũ[§.R/ݏ% [|e@Kt6tJ!>֭ ߹VQ'Xnw: ˯b]wRŝەZP7 %A}m~ghOְۭ 6'Ё3tkn`~B*t1*?ˀ[ݵK4tm+pzCavn0=wDיa'[0KX.gC;M:]^5KLti&Çl~%:VtvLk̂dWj ԅҠ&0fKdEV0ɳaZF+^L^(/:Uhl80jF`e fW`4;L>xjj!0yg#t¤\`8 &a Ǚäy ማ0z |ѫX0 7`a4f( Ɵѥ0^5g 0:묠;:PεasrE28hcU áw0Tu?A> N*0lzKB^ ]ނ#L8="T6^xNLڍ?)toApӃ-̀Ξoз}t_?9t[nz^Ngm=оNtΓm&z3{K$Cm诿Gau ͣ;t$CHgByCt\V ޅnб(`;oξJkA)ts :-BkZ{B Ay{|3=:נ :o@;0Ag hY?Nvh}I62!Z1^埡Uw4MtA= tdCˠ:nQB}^A31E@WKhR]Wӹt-@?vkum_k?^ =̀h:;( t{}vй ! 8 e۠W9taw $|S:C>v+܃^ߴvqtO-|x:RNVwо AV@'{'4ss@7n ;@;4[CY'hJ=tNwVh4vX_%tsw# mծžb2/ԡ3ZZZtx/1i1ZO?@ihh@K}t,VQ h?'NvTt~Z׷f(h~IZAsV$ڻCg|hp,{v4,.9߅Bh B'jЎwy-O'h{8hN_@R~@3$w)Z-dŞв{7C*Wu9ނ/ߠs gMg 4}ҡu9:#jCB'h^#lZuѹ=N 2tFݡd4?A+mtvc+tmObV _]k {BFҡ$F*hqf}Wؒ $A+ehЇVfh;1]R JЧ5<$bbXA~*4-2z5 {5b!tn{NQpjpnplr8]'_xb T8 Ǻ#=އShurCl U1 . ᴡ1.Y<[eokAOlXC6¹s#kSSk\nI'8O{LWwn=Y8m W}p ]+=ue} 3.7mۈ^gqNMm\WSoȇL> ٔ}%xkA$JS5<^\uRZap^K~x8S BM>z텧N4|[jύ7cyޏ3! |Fl΀J<_o+G9 9|J_O^b}Tx (Sy: ;+xyb{Ob7xYmφhY_Q.+NjM^<3A8^Br~k!oEgxu租| vz_G53͑~"?VYI[Z 3""O=A@6Cp) /F-A(i"hAZE1EpYuO,(G gKGXZBZF0mEذwg+< ςj9Y?!#L>rH D WCTp7G?>Ѫ+9aATD x+D+@و=(È9ȧΈrHFHDڊ-[UP77=z bGBQ ͉HxS+>!~ZmnJ)BbH}٠aKw&7:$[Hp@ :R!lfA{$m@.H2HG$S_!m$O4GH?j]4.=@ddFvBgdd@ܹ}.srμ@vZy z àz1!rRaGGNDs V-ƐiT6!_aPx7ڇߘ!NPCG̯((( OlQ ŮbhCQ(-.B#a?"q(%P3J\C0/a]gaJ®`X` 8%ư.Q6}/J]0A VaSbGYB ×CQC{]1bMzAi:譄S~(>#~ƈ(1 ň0e0V_\;eVcį9eVaD&}e{aDi;Q@#?A ( #t0ҫ1|V _ewPZa1(]0K. G>G!%@i~#^t#6c!FX  mPs#Tb-8ewadF"4DhʞlGٖB7(EY0r-FXFlL>F$cDmFސVU~b$b&F\կ#V|G&>*z!bTȾcw3} ~>VP%p2G$B/`1֋sŸTUB5b\kgżI̋\&Ub,21LK5O2ռ(!Z|Ge΅qĈH#]j9e'F gIAe;D]ͫL2X9/e#PfCoٙ?p=O1ּeg]ee29~h6U&W6By`77YzF\'/>|ddp~U5ռ)[]Ϫۿ Wnz\L2A2;!u5LU51&d(9T{DA @\?`/22v?#ⲷfr[T\7a2Z~9DF'Lv.O(R{(&Hv_FZ5z0P[&g8YΨ[-C >Dfj(mB#UFu^Ȫ)׫l?ew.# 9-y<~'<*\K>.9O  U㉑+PF'JTkxUM}Ƕ<'sS \Ȫ/k2yu'Lv.P/J^ &ʾ#ҮY5׿f2hYD?/U_̆rQY:C?Z#NƯ}bjog"d>#Oߵżeez^}B,D΄K"]ed5Pnhq mZ3-9BV#g x(ZlDV=ds w2Cez(' +;#Q?)YrY_|?Ed#?/I^_y&A/`7PA}e0}eed>2dtt[}L6V8_F3^+m_[F +K=_!W_߂?r'Ɵ&E$xj2dCnZ\~~l'󯄂?#ZvYyFl%#zM6p+SP3r$Q5LZ_?_G2XlU5#K~O?^&ϟQ#oZUd_džѲ} 2}jrn?H}c J#QF~Ǟq2|1 |'*-]""=IWWD )o Sd02> jl%#_.kb jrC,d'J- Ua q&j>?DV"j9O %KNGbM=9Ԇ8 ׈?y {`'[;A g>rNr"IHUMiSopjM \jU㊔=+/$oE75=\A <( +QPC |TKB(髠=KO jǏklp:UT{Sy c忺QЃ<|ٞ;XA5gBφ~lطTA(޽L&EQ# j(' 8<Q>H~.\N| $y2FS![R#d%ExoXPCOۢ` jpj_YWG-QU5>/  xQЗ"*EuUo/HYG)m_zQ5>#u&֠?_vAUC^N>`鿳" EFWrP /g̿Ӌ*/{.7QZ׿-GVq])ga/՜9?D)/a'TսӊV+G{{b^WD*QX;Լ+ybΕjqg--QryNy\  9믝jSmQGgy $'-wwPU~}~n/ոArӧGe|VSoI<~R/{|¨>މ=,orc j{wtU]$@Krzq&7\5g j_~dzZQ%NEy'jl.%?pV~NO͘ɇf\տ}LȪh}y-ב"L31 4~LY2>gV7._ kŷп`GW_p(Ʋ"=,GP)B__%9>9p=VJPU3 h+CM/R&י UU*[o>#jsٓn,ov uK{z|ⷎ jb[W,7yI&%q(;>5qB<ɾ 2έ@_h?yO[R =G~yOVUkj㔯'#55=o$3OW}_BE)r#dp>=Pn߻BxAGoXP=O)߻BH/W~>m}ªj3"e1&-)_SOn9[PSǗƿ3QX%y+{y*ޣ>,Axo=U/D{Tަμr{Z\"XW.϶./>X>wwol8|Sww(EyimY+mJhJ9m+WPݫ)*+-h#'QhyZgO[&m|.U<9]it:Z˜B/wAf]r)7n>8 rzc X~җ2_mGΦ7{չ;t6]8N_HOtwӥͪtщ_ENGfy ]Cu3 ’}iMj=MOm4p3v&T!Ro={oin?Z8%w hO,=gy2*ͣ}etr(KgqT<4Җɑr/GkG3*hBK&Kh43MJшX>?|NEPQ2 kzJQ\k*n.R{B[uwi nר9h'&[Hş7/4-:zJaic?&lCvi*9E.M+zVVѴaե5uZʜHZ -ڵX“shAZdђFid7ͼGsoy[ha6-qFwU_КaƴrRZ X2&ڞhRʱkLSW=O4z m'K%} HJ:R}/h4^jN~fҔ#hx4rS 4v@yo% ~6_khdM=Hb>Њi=̙ȥ/ Chie?ן['GGdū_L<,^mw1F0)9zL!]рpy<vO}Y;S1Fb%RuTF=գ5m*_֔+e/[D3Q.J|QI  (kY?N6%p̀zB#ǓŒ9~!S_ɠd/D:4&yʪӄh46֔Jⷽ(ʆҋgQʛ/Bܣջe@y)[=*iאFK.а)3:ۦqdo$y|\l4oB>90kz0kOg[ y:Geq*ʝ(A󠰂w~:!( ŇԡDGKJ#YCw@ѻRlݫKF')rNhvb覑yk EOI[?1}؜)SD jR|C($*?JށEMXOWN~M\O)*)e[ʼLi;PrGt PIEHnLJ7Q_m,E8=M(wg8z)` zLT(!e@~fԐ >)%w4ݺ?%9Pu =HuPA33J-YH:UYQL45\ ]c;܋",=7c^?۠dwmQԳz,"3M"Ӌlk'݃e$܀>&WH̛\*q(-EM!؉ą,l.mzhGa r]!lnэdSoY[MJ1b7&:"ӹ_9I=F-ZRzxJ4HQƆ4WHKZ3V &I1iWądVCcHr2y_Egkh /E߉\%rJҞ4PC ʮN({]J*O 7E#QF[#Hn]=ca̮ª'vӪ8 .ǝspo}-^'%Vlvĸq(8cq31oI!R8^T_Κ [`؜p[Nǰx5Ŏ&7l+TƖ83<`I2sySoyc༆ p&37Q-?4ܻrcej?g黑]DJQޅyzgSǩ%H z'n9EHhM<ڒRټ42~'Qkʺy.];)"rWD}dd3ropB(B2ͨCYR@D?)yKlnNdTB&ȴ+2: @76nsP-񛩞-^xPԡ5F-©h]jSdL;_n2RDZaYJZMsyrZ~EJI-2ٙOZ+Q˨*K7:ŦTg Sj2:GEj4jsԤ,5ʡơڤ.g]%Bg3*nHI{N_AZbH&ԣNr5JWR}8ŽH>߀Yb(s48t'Gc4i!r%c'iմyfC;`4[NOVЕ^tf~oF _z s^-B/vMtnζJ5:tp]}B˾;olGOѫޫ'z&/x@73u zq)=ZNGcSNM-:У%܎ΦZtu ] 'Ut'1gUA;^.`]c>N˥1/C:U=ͷi쑴:a{;4Z݄̥҂ 5QhHզ1L| M&CwӜi݉0Nb2kBDmf.Iktec,m8HbVޠ&tewM7vUK _ t1Ԃ.EntѠ)]J2gtx:pXH7TهmREM{P>;/!մs8`J;V'hWO:x 3>Sp:JtSUt ާC; tJN|Ct# b:N%!tՖ]@'ƜuFљt7:3q:*s۟ҥDj߆n.8Mwt;~t{l{;]^Ig?3Чsoٵ)WoDg=SgmHz>4Nsg9/ti%]y5;@WЕKDWΡiS=Nj)t#RoSep:FŚtR=EGp}t:4MNRtI4]ЙJ':Q֙kұt8#MϡCtOK:`ONwʩWM1οEΡ ĝnQKq :%΄/ޅt!:^ؖNtS<{XQt쩐P:=TN3'TN\9B3Vt=qu1ϱ'KV"}j>6B <\ˊ>O8<֖ޫ7Ry"={M,7]^A/=XFF~{W}5z0=ݖҽts =\qLB̥O[Wz/z9!^"zyދ^B/Ыaumz11=}۝X=KBz2޸7wћ;~b==(z2d=5-y,n=^@M Y+z^Mi;, =oK/NzQ~A]Om-Wl>?B_:ЧC裶9}O7N\z{vx>iF,JQs6cz8^oA/3˒aB/z>Ow_-Wђ^,&eNJ3ճr,8IoY"=Y+cAvu=FY=y^ӫuAOs>R'lHo:ѰI+z9CIkkM/W%ҫMm.zm|ht9Ut\*gGێ́h]Z20Ց}ΤIuiwg<>aSVd8E:/S$׽ 4ON'-+כG]?P%+>~Axd!-t{F򚹊|r:-D]ПN(D$!)![I;S|KJhBЀWVrS'B4x*NEÖPQeS*ڴ.^jTJ9Ѱ]Գ aL2QiTRǟJ5Tt% gSᔵT(b(I ZSᤉ4~ ]I_.4: Y2\S.)v"j )j 1 Ma[7gRtwEL,8CsF^hTj*eFkQə-w\HjD zF^k+3<''luR aўꯠ hjL8vF Ui݆4ڴ~9- [D˦bxZ&zҜo{hicDsWмhSsZ6^Тi 2lD(ZT(WрEao)r |G1k)yGK?(ɦ/ hJ);heMq*?рJN>K1~Ǖ-?(sT" I^ѰèhJyb,)$5m@_ZP<G}4Ɣd%卺@t# rXeC@Qі,[ʾeފfRZy/j.P_4j(9hSvPji79DϜ:Kk$T%Pu5O͌0QâԴ~jуZ~GKA!.ʤ)YW2 mJ˷Q>g-NfκOd8 (&H_2\u /'#֠.E}8A>dٻ?Ym";/ А$m3^$zdlY}|GV}+hY^U&ˬ$qmKem>i%5/j >KHTH+΁cYjfKk :B*ȫĝ#^$z3E⋎S_+?ƀRB(GS|ҢoPʪ]4%EϖP tBassd"r\1y.chw ɯG7mnюq[Vmmh[KE|h+ oiEwZny΢KМ 4sx%- C˜D,iuMҶ1#%;Mt@ߕNG}_DWOwҝ]tzi`a(ݝbO7%dϕt>6_qΛ33D_2VsbGym3;0Ӿhζ_PO{J{i\O7-hÂ2Z߉V^CJ&ҺGhI%O|ߠnf&N.ƅbZϴ\]rqg]6JլB5+h퓅ImA;= hs)ھ 6Dk%hggZq-GhӼ}էYK/ӌj6֋i uZa-YJ]k}-:pP=J5tv:.|Ws_VT9)Nԧ^7:1$֦t5 >{謸W_=GIt ]7AO4MG/-=n&4 Iuo5tkC4IK%:oQNqҥ-%tE?:d܉fޤk}@N @u72Zmٕ6Χ LkjC%ZD/Ҳ<}Z|-^Ai~H-_O n}EђY/hٻa29Lu^ZCgZW6Xж>%UՁ>M":=HGҡmj{chE_iіyimt69+Іz>DUc*$Zyt$PB~<[Қ?҆]&yF;43q*FtC&}:MO''L:w9Sб(:]A'c2RnQ T9ÃNmA'IFt߅tDMhH)5ɤʴrIvVi);uŔvU8Ҏ=ixZMC:s *eM>j#m h؀^<*F&wߓ3ʘ|S@1_Ia)CmN);SƠ4kIJ)%x7h*4B3}<&N14> JJ*kIM9oh@'?"NqӸmiSi&9NzҴhfop]G biLZLҒ hwZ:\v#Z{h 4w eN3cI4M;M3!9ƪOoQi*ԅsJF )f' f$yE}+f 9^I};45,>:P_^P`eA%.TÞF]G#dC=:1IC iԠ74*g Z3Fјc4tm܏FA#JV SӢw$f|*+^lDCn![Њ"*nIcb 1rySF:J.G.85 lHIQ?+IK85Pp#t >Pt YbRox <*Po{$S)kL3)bpibG @AGSp2 [E!SD M!e\ǔz_Oل[罅CnuD'\瓋4,9.&D$IcDjn1yWVS,t$ij UQA#rȭc T'g:K?Vt w?/r[wn""܍6#_eurD.wQOXJɿ?9W!G,֕dl69dlq$Mruu wF^9ZC]ɯ<ɦ9x;z]G~'6|ƐϛO>wɻ0<3r+N1.%x 9M p%*Dzm0#2Gb[d9QDC`s GX; [5U5/@Pp?}vy9W{I+AHn[)^5B 5)i;0Ag9؛`$y?؛uJ8l\-0^+⸤/֣$O7v;Td?HIwEQק5F훢Y|J+4qi@<m}oh ; ۉ_A?|;m |\:͋vB\ t;=.~C$wh{L=Zӷz< p֥ҐJZ4$'h<)ESZL'8 4*C(UrEfKÎ\&t+D=c6IѮ$lK֓j_)ַ#q%~Hn䱨YHnd>|DWj q5E=wϰcԻ0 Dc(2%4Ӡ~р!)k %&U\ߦO LE>A^S˔="aъ +TU@ Ǜ#*|Ux]>ZuD řMG(2|gEeʇ^na|Թr];#{gc?sIJS&N4!8ɻ$=43ĮΖJ$+$|1&IdKVRϹ\s>_u~}y7'洕{oY[Ɋkkp׹&mGrwuڴ;[_:Z[칳u9s֗.h}nZns}kmݙ{λ&wm5 yuwO]y 's?x2wďW6giB؊e,='t]ZIH]rgLmpy4ov͆pN_NQ9'g u'i8 7X֩ߧ*g6r TOéԀp_o.4ޏ)?¦GNig@ )i_N4u } ?N'{_,'NSgEݗy7f Uc g]t^[|,{Jj>~P1"EFK_M7]LplnQmDnQ-Lqq:A*"1J!0J-OT=fd}>.^Q>}8U,ANERG\vE\v6zi뵈[^UDȋ8uڿOmzkݸ /r ;&+a[MոO.\_i%IM/@׶!NM2.ڮz/q'eqz"} t@ڛrN.DwtM2=*]|,Vb-ݏ zME$d#&[sd>Kcԍ̧r]g4o®Lw'IsiB'ٳrM?HG)39q$~6/腝;K!~)WE 1Ƒ$9$3'5$I;&ݽ^goN~ k|*:DN~^{?/"tu]G%aF:%$u̽z.0WܺIdZ6w}Y%ye<q{͝xXIzsɐ^tɩ 9=a纾Orw\mzT _PS sR^t>-<".Ex-b)[+l+t<¶<ōy7߲AC.b9I|yG̗4mOt-+q6:t6Vۑo7|8_i>!_[BX] x ?ym#۲:}-E,Ǚĕ&tkڼeH?׹&вOҸ }6q ?ĸ%~'4Nė69uww.':Αv|G.{]>''G%p YqZBVx!qꞐÄܹ*aK-ܥ絿#N}0a{sQS8ZۑSx wpN5SĹ'boD+#f/2,|/_F&6CK'}hZ}-J@<5ϰϰd9\> ;u1]9t\)<ۄz\eA֮ %ײy$˃v$}Nָ yIJy}^;ryq5ϰӟR~|L{}<>:]cLB$|l:rVŨr弯ΤOv'I${xw ]ŇtU~6T8e:jPo^N擈enxZ>C+bw> m}渏~ZW&%aῈp{W:OB9)Wi|'lwG|E}1%y8ޭ.=w+w<؉#x8rF_Z_OgE.2%[ˈ369%i-ab۠c{WߝOv<w 'e\/늸.sd\%W9pZ.a/q[Itw~r[I4:nw+] kmRd:'$6&;7,lZ3xO 燝Wm{/#CT 7zWk>WD?xŽ =,W%qGIsW tep|Użd%ݯS*^i="vL8:!1Gm!m |Ζ9Y{3OgLpYӾ{qŕWdoM=uτ^yWu9'z-'3hS?Gsx;Kʱ>#q E7w}WI2f2NeǷ>':eyȊS5g>U]azLNc:CƄjO['we˙^ob家|x ?h2O+5 jg^96Wal]FbfF 539<8 Z&D}ſ#eţ>Cy-C뙌 ^9h4i^C>L4u8>x?;{D x]qPpq<sVuàbq)Ǩ%G*gLQʷ-;ߨC<>/ϊxU+AȊ~*H?ϩ:e׏R-V\+홯)Z]V׶SV,g_zUچa0WLSMX=ޞqy܊}-V< wK8Ng`Lޗ,I9W YLFQ|JgwǸ,[%ƙĠYⱈAԙT?u;Lݦh5V=}'j]zm)ϯcF`-,G!]VS'k5Zo {xG5j0F![4gXv}_*2{]+ּ8tO*o(u]KͶ\yEG&ǚ X4rƪ|wnUv\+~{G2z˸ۋ6Jgs2}7 Z\^oz4d,'>a-XmOsk?7aY-Y{ֿ)lduym%}ƩBzls,;_ZtL96g= qs9o68v<ߞi[&~{跎m{-~7墩g94:&5wMeǾe[n-~l?kŸ^ߕGzNmk,;&^Nc#~+3)po4gاVy5`UyϓQs}y0|;PUZQ%nw ,i "xޟUw?-~kZC?URGY0<2d&ZοLo~oӍtP&Y7f2LeL`hL`|d^i)zw=DzrK,fU3N~è׊,mxMեyoZGV:jy V˷7~k-Vo%-{;ײ,yw{-y[;~[A,@!ۣߏ !~A =W~lCeue,]ޗT'ĿUeȰ osZzX' ٞb~'I[4u;^sro +--'5FI^&lޚx}c>+xs컖~otxn7ϫn0j?f-i:=K>!k[yMf^Lle^퓣[뽋u;v[y}/KN8ۯ -G佈u9{źh_E?/Ty&TP-kTyPYcLTxLv2TNJSk#WHP㡚STxPC5"O/nНS8żV T[yF <3<ҽ须Ӗۖ2[tyt`2LK4+QmS&/6UK93Ucuc}5mScsqht 2Y ^s٢J<6経Qмҙc=ոC:ۡ>侖km(_S~f PB[>GTߥ`<5[ʃ)t=?uzfh4fOTVW)lVR6/v)=(Lg~ &Z̰6ô㹥sBy)e$>Bn2.[tRl0M^OisÙW(S:0N>C6C>5bP2sW4{>Vnijm?&A1mo,O؜LnӢt1C'bV+p{~"=xZoN[r苩&XGЎWm 'kFA$hHPe,?at(9--Wm@y*r ؼ7mD?^C8|P(By>(#ÈCm0?bg1baLLj-q}S8g0ëᓃ>8.}{pߢ o\GW(°"zlabXk0q.ǽýq^} e=({ah(>?]0t9:/ah,0GgVmFh[RZCh< {&B{E@B;! B"j  ;*nP/'/AJ#}|*je. y!8)'}>##"+@vk]"x o![V"x|̤DA.g+#xAoG=380Ml/z!5S!0f$&u- P??}_U6?]z6~ w}OEoF&ROg:|uK7V{[PJ.CCPZE=?4Ai(m< 4a4Div }ҫo@iӽջcM(f^ 5r`ga` `.x&kN[a~ /fJ,&n`'BZz>ڏ0 `!s/| 0|`VpV^s704 izwl-30&|_7=aG;My;]{ +7l ̦ `8K`G4` fc!m'ø`$=5m60~F0rķ }-qzLV.q]DF0J撿߂1~'?> 0'ma|ڿ030Lذ` _kyPv8uzb/0s.9ttV9yADZ0HZI;O9?7|L#c)lAqbxLǵM w`|)%0 ;ԮYc!"_x5 kD0֒o!߼G w?0>Op9==,!϶MAh-)&kk7| }CcWISa,<|`:`{`̡_X@{Bp~>Nj'yUK:XLtz%e*0*)< cb /$8y£b̤E?l~En'byy6t '[΃1ķ& %_(cpMCvC䃁A Nz#:YğD`"[́1n?#_=MdT'WxMt'.&; t&{|k˜Dyh"3JgTH>|;+jO?c9U{bU|jo~O1DzH (W85-`^xrWs)1[eoaf/`|NNg.lw-y:-W#$K#c#.vq"w\|3a8A|h>n[ 5K̻/*>`ޛ@qoz5JϭFl.}Jc\Iw ~W| {S_|c7r-|/Eme>|'w=__J@ ;῱ڙ@\!6Dsӥ_TK_1zm !gwZ:o+;'9WLvw;&u_f-!EmxwM {0|s͡7{cos o ucTx!߷dS:z}oj?X]w_~-Tg1ٳr7.S=@] _.@F[^Fyނ@M G`a^?"q=;GL}g<f a?,`" T_Rv ~}~CpWsAX6BgAί.^PËjеT^"O!,~ PA1BWS=}i%8 {ܼݚD*kIG-zޝk>f"Gs?-W/\7S s(.7oP*7 (AQV%W -JS#讪ZPC2)_RsM0.M_Q2 <)J:| qϑTܳ5y}){9=7=gAӅ(^ţWxL97D_nm n |~CV!k11l(A CnC!Đ Pt$E;˕oghnuE/ފDzPt (*E]sw(s$hM0+0x`; c'_]g?Abк 4{aP3j=`k1pb6Yw~ €9]1`r ( z .gv@/rl~13£Q~/D<(,+Lяm:~C?1~w`n8Ft8};}oދB#oϖ'r9x}HGx?퀂{Q*TQP JCmse=/]ޡTz?z7ݍڣϏ'כ&zMk^9n^DwBϬyɳz=x1=F߇w};AsJtق֡Rt|5ע@ۮB=u ݊F[v tt=]?U&]vBקDWPtS]o;5F7?}O<{!!?k k._.}.BbD?ѥqt7t:1::WAiAgW@7ӎ&Bt3& N7!o-{y /:"/kR9]^Kpw[a:{cu9:>ct~>u}Ɨ""#%ɕMC'N" JH7]QQfEk;Ky~3gΜ9s9`ؾ{= ^elO@ H>@bv,"ޝa};֕3 V3v kzA˄Շ_ P1^m#^$FB33om@Y?ėEG|{ M/!\ĝ_{}3EܸJЁ?Cq%ne vRKf6@lqĶً؇o[g~h>1E4 DL-XFLD.9A x #z\_DDt+n1;ۈb _B Q."ʞ+QFT0_} Sga>`^a.sW s 0K鯩0] G´/ 5Ca I`/y y0=`<c`+ZdXTƼLa90ja `vOՆ0vz]w^cbW;q-ׁ%+o2a@C9x? aςYޅq'tcɏ0jW`\<3)sI0>;Ik`9cG}Gl##sgd7Ѧ2gT1-F[ks+`6v?AR˨/a. ?,a)\`xR&{7e5 hO90=/ 8w {Q"b/0@߻xx8VB!C"W }O. o)vD{cAk"hOZjAЂ4=7!:Ƭ@Pa8;4@P4.Lk؍Ri/! ?ڑWKGP$݃?u}׆#x!nG׉< ׆M7'F`. (F`4g#lB`-cQ.>8 3l?,F306 oA@ݳhcE@]Bn1@6׽}I W~~Eۡ!}}d{.>e;O29ۂ~ },Ɉ}9ne;}=X}ZXlJ7E+n8gv-w::6n Ǐ>o_}-t-t[^? ݫSt+jA|t/wō-ݢ ˾Kyٜ&igSmD6;v{d7'&@m#˽+h6zJG[{j(me%ns=ǖ5(\lmԺm,IW DL]q\՗p9/*іBlSXRU^cldΒyתLpjNC)6_g:euɳi,?$4rbL!|ݍ}R .>w\+po-R/g:mic[2OO<%%y]#".y&Vpmphn9F!"}Hߏ7{Z) j'\'3Iؙ|Snm{-,{yFr4BFuY6!l =9/4l5үPDڽkA1ㇱ^ ^Ю!޲r\~ C$hz+A3M(g4G7m~"$Oϑف#d{9B!-lPI JA/~л‚BX?aK3aMFحop%'#<׉¿Z"isDoEDDGK'D|}Ֆ#KeD<‘\]>ㄡ0tC1H>C+q,0:2/s03t䷘F)͌0~yK0ocaQ-DTt.5G_c+D?7=r8׾A>;w?AL/Q1}n!fm,du,1Nu#.%@r({;xk a>6ZMY؂y] #x ^털18! 6!nR^|qoEf;oDܝ_o1;=q3 #Cf_@G?nK UW#?G#AWnAq_"!/$ ܍.$ Є)k0' /#վH~!$|K~: ׾BI)X^K}],,!` s¢KP,YDwO,#a XfͰaeX 7}` ނ֮_3hkưWaq5uXͻtֻX+ kO$ #qH!H|iHX '`X I"~3$5EғאHFUGҌ&Hz$M'- $W 'vD]H|$HFR2$"}$5*?T3}`;6Wl3[r–Ϻl@$R%m5%r3a6 sRXzܫ; `9 K簼7 2:,pFK6tlXf’W˘L a?mq)27XJXte8~N5,^Y `Ua}l6 j2 G Y.&65 kZ &G{kOaNa{X kTM_/53OOX k뙰X"+Zv٠-ASv]6\˯eԧކv'~璇<',Q(ۅځ$]GtI a}k'c7r{H9S%\OoX(rQ{y:y8v*X+n5s]N#QcEbבWHN8<-3lďgsx_clOa [ ~h]a{ve&l)}U[uԠڽ-H*0 I+DҺH1IF/[\yێfܢ>uHx Qml'~)?܉䌹H䡿!9+GXW<$׫Y_$xV#r'wۊW<`#\G!)H^ɫ8;/$oKѭ.t 8ncm1tlCm*t)Hie@Jd :RvAʷ)H'ݛ&{Y gET5z<9 =z@OkUeOzLCO[*z5m%zz =nCjfGWH=ԫ1HiMÐuҢ"H-F!miϾ#)M~iOFڤ62 ͱi'FZїiSw"m i; E釴?^{:;VFzL83Z"}ԣH &!}I?t>j0‡W;5nz͊GFbށʗXW'лRz?Y 3H6}"S}.훡o ,}?@G/"FF7~G?.:/0E H؂a'ǀE^a-٩ 2}{ ~Ơ0it-[_ /ϾÐz11$_!ƐSZc;/c輦zp5U)'1lb ; w`@'gF oƈsbdD!FoaȊq"k Ye`>),֞Av\do웋9㐳\ܰ<o&-]!QZ 9(H fEs(|t* (|z ?a FMxUJ1m7NKf`qc1C0& ؋;N߀W=q3g`g0o)+1~7a0]Lh a̕4L8E^FQQ1Q9Pl8 ãhQ,߁#78G@[8`Sކcb!5Ap5V8B.4 p5cy8F]#rKpǸp~np<Ypǜ)[YQt7O;N?Jεp8.rRDC8I',_`[%>"C7g~ ]"xꘌp| ˾bGlK&vMy]$s9 ym^[5ሤN#;GqtaoL]}Gk}$M#eFs8RE]FE(:E?NGQ㴋( Qt(EeKPާͼ3E;(zV@M(z&>4q?=FG~$rO(v9b( (jEaO1P& „ЮGcˆ`ى ]b#10ߴg\g0?ĸoN`eWq1'9ƮX@0Q9wcۏ1 GbLcm1`0S'؊Ѻ H#:FQ'`Ԙ} ؆Q Pxօ(9/$'d@a&F((\ dp/)?p[ ( /FaPX (BŪ(4G`՟( Q0R: "砠A4[ݜ?s';#?pAq#׵C_EKOO @dxN&?o\D>''|, x>콋`v{I'="Of9Y74Vdf}XG֧ǹlߍ>[NE֗7d}HysƐFdYݮK\.r.&? kҾp3`wv@[-^ lϋq/AO`/FB mYEv.ϟhyȮF'5 <vo dُ}l%;;ub?s3M29?اҌͤMNmrmIӋsDn1a7Ԇ=g؃g fR3n=sb !DکmrCFY<<VuQw\G46. [ɋzn7 `H]낽3q1켯m֎2`{+w uxVFvA+d3fܗzgd;W^~ȩ|9M"k:rwa z0n99sx\i? ]@.R&O̩lKbf> rsͽN@d..!w$fB.m)\߅-2r߿7k2 /2K^!oG惩ACnX6? 7t1Kך2̥?}:qgXR6-erE7FC.@nȵGqͣS;rfC[J}x1"X5X'!/h o| yקszc7ߎe6 yoG2m 8]Dޕc'kmA>z%yA>uOϘ>Euo`}/0~+W cKƞ7t:(Q6 z{p0((jM(`]x`mU7n9ޛ||P{#(x$ W LzۡOC&ơÐߔ:ignm P."z`2m=3rBXNcΦ束R(cg!kg mZlŲؘ,FYe5<_ȷN`$sF0IF|e1xF=G݋ˇ3^2ß`x: -  8163L? c\1lwu {m?-0`nXV(Eİ0p:`X@ CCj'ahA ;r_z5=h#z6{\zf=c'c\c'XǤ-葕ΠG`z4ct?LBws?Bq3Н;;kwXݙBLۍ#%$RڌE?CKYVBw- k8=H #$3JMr.GeL~Io;[ȘHgt\oa<ÔlI{N5q wg͸:ø17\7s7|#o`|E=s4US^αe l|i'_#c<㲺gX930P7%d~o<;`ܼ-q}՞n\c)snN/l 9snFqqtOo-]5 aSƿ^0^B W\y͐ZνICҀ[B8q)u\Xi ̫ 0>j0 ԣ{j /ôo0<c~v8+tӉK20\ ÌyD y,}a s a00v5\!2 #m050킁9A 橆wah CF0'z0 (W5P&ah=\kۀ>00_7R~0rr0F0̭mŰުö0R6ڪ<~íC0ܙ#scs<܃[ ro- &.ؚG;oAn>G>Mży1vcG<0055̄᷑0L9/}Bхr*6>YEYgeu6oXs ڿ000^ ÊN0 fxfbBS9aCh}b~`rI@#(B$}tY "?_HȽɼ5r]"_z"iH2̃#MM X*.xGD,+F</!HC8+ܲ!"U5?ra~@ع;-5"aC'",1/ c.z},B;#^(о,rBxBv[!S!dX$lES ^>sG|;v!xh. ]8d[!| @pv~t@еAߜ@ |Ak&1o ZsA/"h]=oA!hnj QALAԝ<qA"Yg~.D}.)_,GȘ,pdv3vX @3Ń8&'#K޽z[_C`#wp5  9kK]Oﲀl I' 4 Pz^_@O}og=m~U 3CO;B>c1WBOӗyCl.^qo2e O١]}gr5H~={;(b}ʈз g;֟%̬2:nu*=eozưz ?q z&| COcL:~+Н] m\wdt={t@jt<:C݌񩎱.o;tmjpr ݀t:ӥN.ЙY е ϓn4tO#۴g.Bhߪ -yUSZڸvd]hiS.@˻CqZ=@"k+ z#?k :y?u;ۿEwf=>'aoo|hy'hZ#-vS~ ڡ}-h-?{%CkaޥݰMۡ}oƽ`/Nhdg^8Ds26оBh\+څ8w!3?[; evUh6}=A1um&V*ßq+uGз^˄yV\2gIo =8CF?>ߥ\_u&q/3 mh ںo-*us em+ _~O7ßy?O]~7T;oߠ< .g|-|/΀?c%#῀r:\&̭n8[^'5~1mg7DoᏔ7Le}~)Nl7%"5.[{=!=sFҼs:XO|]=.Y~!<|b޹GGYfzQR^"_m{.晻3:}ж?bM]f|O9[z&zy70'fANG@8ޯY'COCdx+w[ ";t :fqA}Y}.1/ 11 np%5CpN'fB0}nH.a b@HM+#X9W6^аe:>KLݺE\V8tG=aF {k!ŽF/# /E'm?n:"Z#"&ǐ;2c<$2/"_G0D\~$pL73/ `ż ac\90r]&G|F` ޭӗl3Ass01~o]ׅx#o"z ѯAtY=DY'!p1qC̊u1,D߅`8cGl;،X7/!&*oF\ o&ډ)#|(3w2ĻÝ$^;oi㙇6$ ҽϑEg9: 9GB?`Zn0Hz ܯW#|6A¾x$/9LS$\!|x%0N,{,Ú jf݁ul3ui"º82Vڢ]Mx<3s!q$FJ{ny*̫-MX²,F2m,cv2XZ B=[h?ƕ K&kQɰL< Ϛe>x&-{,>XY8iMXNWĆH䝓اʐ8i$ҏ%26Isc'7G$^soɳg1} OT>Iٍynmt*-CGVt9R?R">☌ݙ3ug=eНJwE =F={0A_уٹ zҧ@O=Eѓ{ʳڦ>R?T3GjI~C)H}i#-LcX!)䶺߆3ּ:ǥ^O yHi1HiK7!mT*B9~.Mg3>Kz#_}K/s~XR~7O?Gc0v @GV ݘ2{LާD"Fu} Ġ G1 n[[`p~? ~E >}C4 Cv 8Cy_Ce~=ΰ[0P 7-1|i s#;c<hFH#?k&E}YI(+fN {*du 936!֫)Ōyey/a> |cVƘM1gulۯ:ߋa\ǘn31&0xw1{2r>&0v@=NmM'|EhE P4 E[}u*5pw9u)apaGw;GV8zr\r8# 8cpGm9c%8x~]{ 8 طԀ}p#*2L{8s}#c6"0p=G>"ץxvژ8Bu0\2q7ꋺ7N܋ϊ5Q_SZ.JԕoK)}_ ](FOPO]{Nij>_M]w <^Q~2ļ /e- 2(Ү%9oe.ܾP]=|GV5/Q ZueM r% &|3?dz:JRWگ,DxUnuQؑeuU~X+ꂗVvM/ :Qgj&boy(>b>}M[>KhmL'J㿔۔oA@)u1&z~cOoѧRЉuNYVLЈo _'r(q@1'PCQ}Y.ɐUDPE?i>tњhL#xqY}w\g)D/hDJ|~?]%WBw/dd(>l ]c2CүT*IhtTJB@ШI1JCˈ@cZpGvW|+uQoAPEHܧ+4_E .ɢԯׯzwힺ2vUK2]zGOnꩋFGz (<JFmj1ozhsR,vOҦH|E2?ʷUQk_ mӞ5(}B?zrNWz2$?y۪?[)Y(ZC/ 歿^S! ?V/mPSߠ5 virs :ӲxA2jo:^So8\Yjd()jy*JौW rЉRM\>& n6D e>A׬A9T<2It<9{JeOܑ-3=hWxW/"x,|KmeVZ:=_Љo *Yxui2᫆\ iӳF5%H}9mn]8U2.8 *}Z}ӯɋNnMAr=h$-W9V>gzUؓy1W=rʥŽΫ窷 ?-t=v&Is=){+X&ղyj}ʾ)v,Ϳݛ*߹$o_}{^ͽ}~TSNu+tt n(~ν<>w~^'ʽ;>_qn;j~}Y\o{Vt= JT]ߺ}}7/xo }Tѝ@Ϛ|ul->@CxG^)P{ #,P~s-ݽSbF%NV*wnձzm"TRWųĪXXz1zuO;>v/dķ":W)Z^(kW3!J)XSxQn1[O9(ᛧۏl'gpI5Nȫw|srEu.Թ>Czr;w8IPJK/Է.sIuųyhs4]w|Y=7Wx;;yPM[{Ρq(y+0˥כJvy <{ Tt ģwrykKM~7ڿփ[-9Vyt*r^zx*|T~@÷ʞUIu[[*{_\;dk{^[i*${쁲nL/6w_=-wbKSVa^:ZwJg*(}IsS+^X%<5)Qч/{yG;/?5_E6uЫק^=k?y߫ޱ7ӉC7ue,&M,(EtTƊ>O=»m^u{;k|xxxxxxxx24P?&E?C+4L.˘]5Weٿcf_8BF[/kj)k4@S֪CMY\MYRMYߝ2,2LS6l)i^]))+Kє)jgxg .4NCP3V899vsaLsuٹqgsn6;=hv^QZ{3Ϛ].R3]?mٵXZ5kL1)r)dE׌) J\Cu[uu_ )qolvU[]gv~WP<޻Y]꤮8:g6+u?Zmi>qR'};oה5^SY[7hʨ߲>є{YW~,sGcin-._؏ .J@GeO=Vッ+Bo|}6CI>VOZЁQV &Mnus!鴨l*iȫl;c5e7Ӕ}הqj*v>I];wg@a3Q3musįo;g-uҦk;e?eqrO;7I5evUsE+q<\Q4gt{V*?\욷nJ]/]ϺB\j\Mwdj]\tRjNځ󍷊_-u>lvN +uҞ)K]Qe?kʨ{Ig,s_ʸ?(s[FlvIabĞ&[o|U_{T|r|QBUy##w.(>$#&)+ذ]-M#yHաXYfYfZ?bv^ljvUj~n{%&]=^0K8Ex^YS${=fuў\!X{Zb8C=qԹkO%{,|Wwieg'+ϫ6]\vkv$c=;D#@j{(Hʝ%F쫯w߶Tu8{?>)[7\(:qVqcE>LG?κZ,#|=8\e Vu^_i]Q]\=.q V8^GOTi%.7׳ \ \o.;=fvѿj_/{Gio=8cEQأŝTQ@>N'o أb1=(bq=2G#)k|.*T·'1u.\ig91sERi~ucXRCϺWW]]2]%.ƠAf׸~^M{/ayE]]]I\κzDR)F=9nJ3c^5'圾9nɵK1J12)Ő"v1"ЏE )7TGwR &= R*rWdb= )QŽ#+kq]_CE9 Ii=ǽU4I ^7;W5(r]ΏƗ:9kȜ\zf8rkT%?MW]ٿ=w%ŝ6f-q.*qu˴5ZV.q=|)\Db羉f;+Jkn:ߜԛX=q /'RN#Σ'D"ΩgĹWcEI|{GH+>Rأrg}Qۤ({Y@m?*q({kVGw-أ]^o9}uF_}qxKs3Xd򅗳73KN]0UY)hձYW3?]-W#5oU(AO|u]%I?WZ hjsp5NyyY_3[k:Υs\f''Ž\X(#|I9 Po9wwGKV٣7{TǑ}-ߴ5ϊ|F?||7[}we{$?8C{;CGړds.쑾f%{)ԥU~{Y ]u]ˊ]ſsbׯʶأ(mړk*ifWVY+=E{r*uQjTK?~N\:w8ߋ3;וos;yɹ<ΐf'er8k_#,Ő=wۣ{:TbHۊQȊQ읲ՊlԷ~wZmok%VQ׾(μG݋==(ab "Q)yH{,%}R1fwvj|uh{g]}J>Yd [[Ux7mWeC[PݧqkK\K̮+l^<$a_gqtvo Q1#(tأ:1::wo 5&Ş7QvLo<[iSd7*Gq(Q"(Ga"fAYE-|Gq {w3>$݉nd,,Aܝw.w[qVc-u6>ѣTzxw/#uқ}+Pc7ʴ_^+uީrl r~^=o>b's" [N 9Б..GoN#|oT'S|c|F|r_+%CXʛxPNo>ۊśg\2Hkbdzg꺖DJBJ<9(hORC{rDYȑDUuY@}HNα{gx39;НxRrC lq΅T|-R@ɵJNs|}/j%lQ}OcG7 {PۣM Q} 7#|)~o9xaś;b1xaN$~ϓ ~\*ޗ|TZE޾QU_|)q%m6"_!}7dR,~uv-I T,owQTq QWЮ)^L!7>_h S*rz)tMד!>q/fGB{'Aԥ2S/Gr!ƋER?SURALS_2D]A4BVoxD*u넨߃Wot)Lgݾwvy]1 ##:y9눌/wCFc2v5u:`Q<1֍_zKpܺ]PEuڟ.'=mQ*}oRB#$,u S W<ڞ+[ŒÞR ಩هJfc2*vMu[K@Q&5XܲyףNߵ[/ȒEՈ+hu R}ow]7$Pu_Yt|m@Wbuz٨~U` {فM؇~G{뿕_}Ϛ}m~|l7WEk_ڧҧj/XP=}QTįڿ=Pl^kHezRC}y{OܭʝY}u+@yWtYRҦ|+muu"b kDSH@DĘ?)Pb*O=aӼ>qXZVD;OV#y|s߼SתrCy׻H;vº(TK9`.шzۍGye;-H%IRW5.ޡAEU TY-5*|W0$O9|*CԮ`ݗjuKP@wB~?FK Y1T | %Ϻ%(㔱|y$]nmmʻ]Ru^n)o;ꌪ Ϯ;RW>4^khlE*Y*˷MY=rEۦ]gF-U;yEriJ>+zWkOu&* ~÷S|=P|Pξt06-#'҃'$F4v}醹.y&/4E=:ƃdku#. }t]1/WPwY.VW{dו~uZCnE=fF7c3ABlr)vM{g.S/݈]B~#!!7t1Y ułd^H9ܔu6mgZ:_qb)yw;m|\)-RF]7=-7z4%c>\BzZ>**!^BB^42;;$d]`ʸ=FWxh?=|FW}I#JIw雒\R}ftLmi%RVuSzpIF{PH/uH{@5=@3xxxx05T.QSH4%E$1ﻐD2GB6 Q 2$EkT$:pR*_}~nϥ9{γ|Z{|/֬R(E)JQ&`l 9βxO'q {X'FϋcS-9ڻ>!>Fmpی\Om0јy8`sv̞XbOhsL]p}'x>y1cYc&>Qus-`q mҼk3-j#tj~n$6ħwyWfP?\/h7*)Ɵ48>GQcס_6SrdYi椾Qǂ^;i<7>sXA>pdy %BodsKGPn=>LL59d Z?Ha|\ɘx![ͱs ̯m.-p:̶|Zw2S-_ǐc=( i) }s2AE۞LdYm44c&+,n}t_x1>ǚݎ9/tC:BSہx-cl/m[mڧOG1~4qZ/<{4duƙɭc`\[CqVV$'SEݏ=/u<ķ)֮W>}ZN-&ٟ$<2&'w+ijO}b~|PgX+TzZsd5ΝC?qZc(G4K#8dwjR;Ic=9R9O5j5~s$l$-cOoy/זM6XƱGÜԧ34uX!=xzG_MHc3pD[ >jNxE;4_\0cTd>:. aFpETM|LV<\ zKcmI$G<؆(ҺFq5|iR pn#똰,z~_c,#<1C3]={m/ݱ _ >?;O}vbbaМ5֙+nj_<aU0K_WNh< uL:_Ì8Y¾0tq(}m4 ׆q\8 џ1&d>A6`,k=R\>Ygٷk̘94c}r"WzAwO<.XPlk|l8Ngk9*W]CN_{Cq\edt\ tV(q֯>6֙Syq[#xmeKDַ`i;?g3>?VrnƍC#K9%B־z]Qt~1񡵎`cku5_.C~ZdkȤb@NkT]߬Mim#_ bB5Jq4 j@\^C{qjkto4>3kl[IU:z\能oKl6ByA_U}N6a<xEkG5OY͟Sߢq?= k7?$^åׯ9_zNWNkz|Ǽd7^kxLAMqN}x^>z?ObI%Be}k]ɸLdh}IɌڿԸM UNOdjUO|{Sao)G+^zBwgy[Z\C߰OJͽ}2mwAޑurj|vbA&~\75_u<+t{:>X'H ˏKl!8oߏ\/c?ck7vu\в}H}JZv,ÌZZ'>f{4>uc c||?~bt577b ƙ<ٓÌEhCh8X?E-/޹amҽsz =6ȓc8‡H~Ƙķɼ^ɯF8业$^ACKoHum$gП&9sƛr@d)[@},K OO1YħfJEDx4uJF { Su*ǜGϣ|{c~*<:yo  ^pEz|MtHmcz|"_qtT58N?64#.A\'Y6Zφ ؤԠ|߉~<-+"!ʡe'yHۭcЇϗ3>w.9MGc~e dF5lK6q.3Lh]R[(/~;1iZΟ#>mgߏ}ԿƲ1 !.'ńЙc' 7F}ΈZ7c߁pXYk=/-uKˡӜl_sdK1:v3f&.mcNǸL+Hee0d1|9t0Qd?}=kn5_dhWvfL7koZ/O<̷=!:3IH/|s7y7J<.n5.1߄8^L[X1e!:ʋ Š?W:3X:0}VHc#807k{ _v2SA gO}p[~_3h5=?3L4A'834|_~˒Bx?dxn߬| c|znk&u~ f_ }1Fc͸nX1#Ԉyf<6}?v)֫ĹC|RnS!>nkx,.́y|G#OsS3O[F<;?Fć$> 7DGFy>>C" N"c#/ȋ7ð۞qkcFn ig`\#Ccu\}Ռ~u0ׇ]o'Hf;^Ci756'F;#l]ޝNC݌yz,)t `14\10_91!TVrz}z̉L Ci1.}'#sMyCᯁy}A2CfI{OWDzC_j}pOLM=jkASq&du+ۑ&^ިoWEmc/mk!*NL&}7?mGBYKȾg-֣`*d?+>&鹵,>Oqn{]:.ć|Hܫ3}ՌF6qB">Ob{I;'&$.k?0"9ExyX_}1i髚g!1a2j #{:Flrt[3|9y ྘h-35_ ]{d%Z7!o |yx}oI8!7NkN+sz?rY!!ϿN }^yӲAn s2ع`=slc< S5|Ԃv #GQ?]|cK4,ٓsCZx<Ewy6Q׿i>c=ijsRĺh2?k ÿЖr[km[&)OWls\`km?͗o_M ӏN6b9  2JrlL*y(E)JQR(E)JQR(olޯH$ϗ-9 բmqrߓ?|9z𾢆%d;{uMRﶜQzGSBvhfWrwݣv5Յ[)OƾXfWr{s[wׯg8^BG'C+8';?rz{no\!!Vt7vW~xxG>zK_߇\=Rջ G;~;y4}zO'x1Gӓ߇~o^޹q0dw>0Yo̓wkֻ`ΐ?{Sj}%e?ǥwm [zlz&xMS\E=Y7GQvO1<@x>4mS_IЙ'/y^gex@ovIw覗ק.hw^[k㭃7kwd_xG w/lilx ϻa/x{wvƹo!xBĻs+yz}8W~& B^F=~ IbL|Ỉ]ZO^ewٻ]aSw#N[[ b 9~'L;n XKNW/ݚ⍇Yj[Q]h/XF=w閧Ip7l#f Ocw{fƸ )kĺ{c(V=C7߼sXAw!P }C9^!u y;zߝl/uD\ NU_phƈ3xpK#e$l{9g F B\.==e:}tO~Bl ]Oxݛ.θ}V`L+(?்8KC~,`DI B.3`<}g`yr b't QlC! 7YWz{X\I_d# ${cLȊwS"GZ{mkP3װf*m 0l&{S+lۍL$ p,O= 0^?bE*c m[d[PW!tx\"_C)U߻Qai ~G񊏬Ҝ;9/Psw6j15" >l rb,|؃O;u%.FqܘuD;ǻQQyqMf[Y(q}Wu4r?XW x!& 3>|ƹ>S8Op 9k{֫gK!3dM 58z-B G``)|rEO0]wE,]xm;x<{t5*pm \i~C?| osU Ja@&>0IocrA+?g-ȵ|zOu=lA0l ^ͱ^υ `݁y3;P?u_*t= ]FisՑk0 x`:f#Ԕ?Rxz bms_3| ހGxxP{Aޮ\cw,R>mEbNٶ5 Y! މC/P7gu:qvA> zsmk j.t>rIkV-1bNkoz, {$ 3ۡ 9~\b`L0 +8~z8C^AɱĘ.s~8ާy}{uD <ƞ@y lg0^P@T7ۑ/}y}5wQutߋ[M9t{zX:s$쀼YX ߨ ~x9:`D{#ȝ-9 wgR)~r=>{r̀/!n>=(s cpNDsps^+}nrm\#5뵟D޼'0y/b`# vv.qkbؐ;7y77罔~tmW9WaξG8ؒkӶ? #rE7n6ֲcnCl9^T}^ڰ=^;Oy>j@zO>5œ<%;l  _Db)|XoӃx?voi2Y ?cos·@x4qOc8n}Kj7gZE>'q}B ߽?{*: ^?|@~sc) zX@{kyUnPGcɜ'SpZίKΨA=cX'ru1NoNPf -yZ#t~{ڑw؟tO% uix")_'xMP9S͋\۞%ný->o;!i9zOp}"?tz~آjG?s֍&xhz!/=W\ yO?Tuީ_xck/DL[=kvOޝ8^ l Q+e+׫Ϩ;r#Z_Z4b[6Z~K+a{ GOMiʌR(E)JQR(E)JQ6>uOC}|Oq>#ឲ~`8 s+I9x݇Uqj G@[9޼՗Wއ|{ك޷ѱW6{2oCxR?Bo ?T?^߆=:{^ tk/KqL=3=t"x?r߫ȶ?8*b>舞a~~r Al;B=y/|'aѝ`VۍSY)ݛy8|B/ =+2Ysyh}~VrvL~PCU` rr'?S2ς@=9Gtgz=#[tx%?٣bso [G} ֋c Ơz9'}n)/HFXAoXT7LqQno$8Pf}J)o aЙ~ku>1`{Q:⨟ o~` ڭWK{V8gH1(GRK0&+s}8%^9W:C ϟݗ;*%sNDL¹Yߣz<kՋs+1sue"RY'ň&}9a߅ xm Y*ʍ9t] CWin;kS>dOOp\0?b[?Ot;4&u=ݛdk^_j] p0ۺ|7?'S?2kx~'c0Fm'p]wȩ7I4' ;=65uz:G@V'y^2CG 7a;#rk_z:f$_`C4czsnye|>Ju't϶cybo0;^W7^i<=%)f$lr\ p?'d'5ޜ[zQ볟b+?Kٓ~՟6# p3/s"nދL=oɸu#Z[ܥht1<q5^ d g|4׶׷5is<y}_a_?ܓRGTGǖg5+*c&dny3+0^^;mN ? t>6X| L]:S8 b9W y^+ d<{67p (ܨ0.0_ɹE?o l3kp8ڧ1sZdT~ۇc5Gؓ?׺:NwUpȵοa,}8t ur`׆)ה}X>s wr\i~9 {A\BnϘrƛItӃH=~BlO7$oy=Y鸬Ǡt|zMѕc`WC1Kte_BV|#CaMs?tK5юj=~3 #9wQIo:pJa_Q~nY cr yhEp~=>.s^Q5 z0C߁Gr/Ӹ5H =R~bG3cp.(MlB/8}@/ϼ'6bzU9\o`^Kkk=fN&ە 5`W4t>{0!ھhy}K;FГu= g`T'o _`q}sL@z{@o0|pOﹱ}e{ɜKowz-0Re/ix6J:CY =a~Ry> tl ~w+,'Myk}~qn$c=od-БؑVϼu=7{!} Z j`=;c|}scw!n @~=}%JQR(E)JQR(E)Jd|goZAM4>+3tӿqusHD: S}:;A¹ﺽeNySHLuV>獤HGO$}"5^x-M\dl^G?"(\H?j|~}yMp^qI>||xk^|c"G=V$9"m/SG9Sx #\vfpc䳠z<:Xīߑ|V$lΣm>L]Zp5OxH}y+L&N :f03LFoQXG=a~eĜ[V$"exlӱ\&5zZ%9ct?ͼ)DL?5uaͥṪl^4OH5kH9.)> ]p8ŭYtYTC U=17~x1KնU$~#W0=PC(i[ӑc.Oxpis "&e p[6 j.օng;^udeʢn/sLfI㘺s}y7dgݧ.Ox )VʼnccE1̡&>j[y6|ݩۚy7<כuɏyݤ1y0Hf]fg5s ~y1RPP, ǂm^sv\:Wngx΍T_7L>Gp511ou쉔wĂf#=_53c_=o>g~ӼG:!]y<&6Gܑa=\pA0]I)CinSڄyymo֩fAo $sLMcx.xM4| kyߑ--hH:4^$*OAj;h[Wx;vzl|A̶Eڇ)h sNeˤp\g3?ǂH1-z*N- ߛ2W77'xefXTGMˤe/d9ϊVֿhћ -{W )<p*ϼj3裸r'= ל"TsND(SAE__WA ;ZAG iޢlRΊ3gAm&K GQglW._ | ݿSqZŽĂ0XPn#ka|پa8v*̞ʼnœo űca oqڅ 18~ZEg3;ǟmQ:**Ƅ*F~V\Y)nӟUEY~ġgU3{>v?A?kF^ȂPP*3O++.=}ƂRA\ {1)~'~'~'~'E-̒+ǖs1rj8ҒO˗YuͣbdwmqK.ʗGK:YTI{lw\/7+;z}-C{{|^_:-}{c-y6{| )p\28F./Chw[xOɒVN; `>&==Awysdy]zͳ1І0{sa^8xlYꍻ$]W6)@ã+/H׌͠'- ` h\;)΋?Q8GE}3=dmU:E;rj|_2k4ֳRm!ځL5O6.V ,-+ػ)=`^1OZ#,w #xLq~|һN6@bJ?>p\VG`7ד<>nkB_8@Vol³2o<d]_SXt#&`4ŏ%*nA Yj,x2QHcž/tIel,kS ,SE~@%cv iL!>oq={+GȺ2XXAB<} >»ߋ<^Z5ǂ<-\5A9fyQ⹡*F!anm3L}`o7.b4o?ʩ<+rYJ{z*p3r#t9) y\|a϶Q̙Ƙ(Zr"^!C^S 9(FnVy?G ST^Ev!b"t(3jxW%\P }y6TKW1.o?pA,%]~ӇP}|\!R.9+6dU>x(sM0a?QX(V+=>لj$%;|{}U"P]^a~J',9;cl*Y{`jdKapYGT#uQy`eЎ\QR 8BLȗ?fԥkr#r6WU"K/zb_WsBocj}ǨΫHZ9 ׉GԱ熓*Giw{@W|9nc#kٷG*tAq7t-Ơ#bVeWZ"[v/(j'x9?`/ZQ$SE^Ʃڃb$?~6)_[X꨸=cFSAG1A.~i}[!NR9'FuxE1.dx!e9sZnU6uLk-5-K*YkT%/^k`NweliGWPn170Ko؇xlZ>Oߩ\dF^ zmob;U >DsU\'7`<^r1B{7UC""`I({y:s-r5l =Rt;[U;SKGi&#DvTOe* @/mЗ|kπvX?a\SSWu'br+V3UAݎhMrR>p_KU9i](gTupK5JZq ~ uR1=ae#ut'V^pR?pޗp"wQys+?׆}x]qԚ2Ɔ#N5')Qq)x8X9lO`u-@`'HiF[MA$`.'i|e8Nk[rjuA?g/gڮ0qN全lس~3y96oRm~@3<}` Ws= ~TOnԁ+*ڰR=aO>Ea?9o-KqXEYg{aw[=|PuH"iDC.k[*zj V(nzX{޼:$~'~'~'~'qrzVR]Mjək靫뵩K8#Uܣ1rZ|9-Ӓx^k3#oY-ۣiy1jjmƒ&Xn퍹;W_1;vɗS+x+ ^h>lw">g.y?2sGJ靔.3x/qKlV^~ߺ|hN9W+g&kbH4AS[Tei'-s{֯gc?d\͉S?Q>c`iޡs-?q5q/렟"}- Wm>iN4_݀wҗV00 La`[2 T{4p:7Xz<+ܻOSkyQ6|SǨгL~=fieƲ7z'TV&}-S%}xy|β5&xv¸יּHA?}lgH!Y=Lݤ y龎3 a|Ss|)?:1ψgV-W' /fM-)Բ|NUPv#_SJ_9_ac/}T):."6fNxLO6=ɺSLixƘKĀ)T>#4ŋuo k 5i_V*(m|cI%+(6yǽ>HιC)(N+pcxX. 76)SLrc\x =e(Cws> =ٷA nɶ˞(NV9tqri'Uv(P,S<Ow 0N-s7&b\0A7鈛0F˯eɦ*F0F5>4&e+C~WGC˜W'{{jſ<"˂8HϨGcY[sRQ%:Z_vWk)M*+7?AuIՏIIqJS8RpO8 nY3U~3/wH9r3_ 6䭮|vh1AbT|R\Ƥ|\ 6!Vp]ɖEɄ>:R]9r+5kLŧ:AqIׅ\ӗ/^UsP\.p (n4:j:תgT[Zo/axi۫|D ^3CljnGw_'Q<:HLHOicS˂gO+ZڗT~1)CM]sR S8CަpIkP]qW%ܺu;(L#jYQ:@#l =Y\-[wS80PZi㣤Z[}ymAr:Gf+(ΗTgxbZVJV8q^ cήuw]RU|a7 yMUٚ)P\T:%^tL5Uk^6zϴ`mNI=o8FdqiDarzY$CC^ #LI`&YZhZ*gO2vYu̓qƩcW|ORY10r8I:Syhz'38"!кb<^w*{#RIM1}NG/YⱎC)g|U+CGi#Ǹ>&s=Tk S<|p*\rk[++~Xi͖~/n\[xߚj<ޛ%bMz@x>G'l;=r~\O\H{kHiz~@m ^)5z9eG&zfLpz ud71^i>sYQn5o͸ӵ b'_Lqj?cd?GlMukc}Xg=prm㸎_UG]J|=Ž؛=֑\oϖ y/_\{D8^qLmflFy%ѱM{, 18ż\,Q{1٧Q7e7 '&n5pdP8G2Ma+\|rRi,^+GuRs G+Yt^5xΨ>Cq5gilϋkk1xϟXXoǷ[Alc=Eyr_KaJEܑf{:5t1;j$ d>gnj?vZtmy_iN ݣihSm~Suc81RQT7O%z4eXpc0A80Q|<y}B|!+?z8~'~'~'~'~'~'~'~'~'~'~'~#?Su]Mdt m(Q#x_N7s}?ſ;{mo2ƖƸ̗]>\Z<m͋1c9Q8Ɯtj7I,n̙2xuTy <ة,gMNx%ios%鸞\ƉmC Oi\1兵%sa9I'LvN ˪l$'=,ÿ|N?~+ğul,YAz7iیCˏ%arw+(0IǪtc/NpӮo +,.ZѼ.<`2H"ψ5 \H23u\&#+]̹Υ _c_M eν8[2dҺ ×4xpBC@G̘jJ7E_1J&o>l1[4ƕ)KzP~16L7=J?Si]hV5l10G ޥ3incqlknL]:Vͺrd&2G̵֓!v60 9c>&qt]uu-UG%Ƹ|1j<6}ozVut ǽ|~5utc쌠N{1sy$axi\>oyZm~|n5׎< 7ײtNXZLOˑ73?T4! =l0w!WHMyX>" c!7h YwI>2YVh4_ {ƹk#B95ɗϓ4 ˯yBǵ®!ð>& ü~޴I\$ژ} #տc5_Y/\H~ }24m"Ř_1?=OQ2'pQ5U,`X\Ιㅏm֛m,VVf=?];#髸 _sMa|G%|~1os_ AZc{bBieķٯ뚇(c[HV7y-Hniu&F?|DZGNHv6G ; 2&8}0pX0m/hHcFj\OG65y. [8K}WP /}#p~ ߑ+H<էϟ[_oW,(7;o~UrK~sHÿG~[Xۢb7SPn(,d_i_?hWT1Gп(^^+e1*6)JDzkSGT>Ҙ' k#mLPnSկ8 3|: ?^+//|peszL χ Oϡ)}+Ce8 +3Y+ >C[gW1nq<|66α8ܮ+\n?˨Q4kP>|yg">ǚ4y9a09Y6жlc?$YgYV6MLcOҸf/BV[ϊmyF)YbD y[s*)r_*WDW"pqpvD !Vfo'Enc7x秉꽽1ĶIŶ%kD`:inb[ubl7kϝ*̚&xibbىf _%:!ZT$ߞ-Fo2C53ER'"cY1Uyl1ida1i`1.)f_WL , S%ۘx`Fqy,x#=xY6bߤmbOX~9bwv\DȮI9tq`Eµb%Vg'79o%~M:/;78dGuޘ8DJ77Sr{jro;&ܱefʶWνIBn܎6۾5a&oJH|"f_CNn7J,ܯ.I̐xUwYw|ޚk~q.u/,y|igMݛ?m2m۲ic婶nqw,嶚ZѽII޲uUn^5{p۽8%<&ӒInvu>3pWmMwXܴWtGnaN|N{y;(7'݇Z>>eFsvL>t;ܯs'^;yLq-Y>txl;Coug;<8>ܝ|wx7cnF6)GwgXƝ}Q;؅C݆M}ם}nqnpgnÝpwfw >~Swp3wg,qgޝU&՝tgsg9;# p;yqwܯc>鎺bv@7pYw݁MwS[noFt[M8^٭f[ymno>~^m f8wudT}S=/w|42;f5-;'t(fMX4!S3f "cGxl_o̻UŀO%~RI6Yv4aٹ'TuҾM ;-p@xtbr.ȹi'v鯁c+ّ[&fYMʔ..,j^TSTuo&'ibOci 0!w{@2P9BZ@ݏ ̘{'ÁCcbCunw\½kTrzz)u,wb~)7ӟŝjq}yg>rU܅1G.ߝ+-9cܹ>!7g;^vgf|wnlw9ԅ)RܩiSmz;?s#ϫ㦞?͇x won8MQw&n_=}v'wlي7?w;iG[4vԻnnZ)icZv(4?wtZS>MoLwҢݩָs'$掭֝N.SϝZ;͟)獵v'|U;v{#w%Inzy:ٝ~rwz wbMܑWM{Zwcbs֊wǭ8N[~;ݮ{`FW݉=M5;m{Un 6;9:T3%wmï)ϿXt`N`\k&Ob%qu5sG~13XZz ۞^6C>-{uwnVor*]䴹`z΂sgUpVRYΫ5prW|o{n,tomnk]q6MnǶ].tf۬DM ];6۲MzRn͙=puM;ONn뺹vvipqn)v r;1y=ݿܽYnV%6xmsSZ$Ml-u、ۑn^p۲&]%{vs0]Btm?۬NSC;涻vr]׸-qpѕMrnjۮ6j׽ݸ 6eWu~ٻ9"ԻK/8?%~s{I;j;_-<|>g_n-C흼@ ]wۜ:LuV/s^RܘKwܒ9dž||C}F;g|<7V;G6';Gwr54gǀΫ :;;LrZu^Q+׍{u[g@7!~[GEҽfލK4vUzq[,fZnW&uo&Z{znW ng<:ݭ@+ߪn[;nnr^{8֯ KݺIx{K -|b[];ֽ>J]b׹%ʷsM?札W9V'童MOLrstx}?8gwUpះguKėr~{sPp ;|𸳯8 }= Ýwztsvo۶΁*wN9[7sV;,әUwntIέ-9*aӟr3[m;%2RU6kO=Rncr[x8P{t2فm&>RgOW <^@ڋrͶ$9i_crħ?'˘%dUٺK3J޲BVQ-o;L珲ҞYƿPLU^8U86D/YZ#1?%nquU^o>Q٬e'J}eNR]LS>P|&MS<:ɢ^K,*UF6ύ^lVdWHO}ꋿkj-_GT',߽ ʼněO7-g?Nc8|yqW\%QuqK%TO>9+V(W,xccG_'4褍M;ĵ 7J|y59x&զ](+>=-ϳF LzA!v:iMb^-bWM?xY[9I^2{YY@y53䥗Ky-]U mwnn$׺H6'y[$$yk߃?ʫj}ܓonX8ϾN|,5}ݡ^?~%K;^! dEdn)[+>"kࡡ77z]]GԎާgO<&O^*=_59Y;d/3s[~﯋l/ܳ[,j#9\U\:%V?n*+c?l*ڍ7O޾꠬!V/K6FݰAdIT_?+[LK۞"oxT%qD:|Yk6L ĜzC)?{cYҾj)ڝg_HcWHt։y;e2i_}YOvzoؔo'>eKԮn*vlvwon!OL=YL0SLx'1>Ⱈ7m^Fg,W//TV&^nEF|]jTJbP_G4Oj$]wM7NrAM1j-b;wrp,ļ 7GI,\IO*fX#z5D+ET$m߽ M}›/*%pύDD%o1Xe'$=iM'MH|fMMHI6cQ+횉_^UF 牥/ŢqGde_$oy/ʱ]m։(/zk\#n=ۼ@G \| 'mWNInJbEŢNԟEbx<1ubwb^bb~Kd%Jl9O:6Q,*V}x]&b+{kg*6 J~Wkg +Uw0ptrqɞT-CD7Gf=",ZN a1Kxvgx%p(^nXObg*b.%Jܾ&-1JUz'$޺-I%Vnwr=;Dz+7*x굟DDRΊn$vnM+,{˓ՒY/?U>6k]#7=*<0:KDa`Udx袗M ̮710sU` yJf=]95rvoy?*WvXn{j|O[ɥɃ?k)`'GV+X^sL^%Oyf5_~([R~mUl[1%cKKپ`d]vA+ hg_ٮbOܻؾft=gտ>bj}Økwvkh]tsvMvk iߐ{ؾὡv~S]yCw|uv:#uc~b]~oM톝ډﱛ>c7-n'Yd7ynrlvx/ Ԯ?c2˱^#훾m2ɾ9f;Ůj}Mu#߲8g}̶{nD7m9[\1}kۇ&챛oXfevgO->b7O-g7)n5n^ynmoifSvͭ&?cq*n~aݶ4oYVώk]K캭;m>8b'\Nv}/#[M`[}˝'[ƥq~bt[Oi7߷3[ujkz]v+^KmӎKݮZ+Ck-JtL`_S;mˮ:b;p;ל:b_k-\jl߾K\gx]tF[ˮy^f_^g_Y;.=f(wgdMSk_rkR7˷:ߔFbvbm}}ؚW^4^SIxJKKeϓWW}K^j dR+ʋol"޵E^-}^ȎĴUFu?[zA>+:%n;rĚr#\~ս^ d[F%.>n.S}~7R>K.svK>i=] c^aQ5ؾ5/sfڗ} KN/c/oeh_<[K`1.};u2We8m:.{,2fڥ&ڥ.K.S_.tn.]_a[ɳ?}|2򛘭͝]Kʜ%UdಛW;ΆrKˆdF2rjۦ+Ϟ/K.K.Jy%Ǻȷ~ܞ|k`QKmj|ҟE(~CjtlۯW^-g$s\y\.f$\ph9}rfJgek7 dk.HW?\򬌛=O++~s,?1V^)qFyݫį=%xa] yDYeͬ:˲=$K4_~K8{c,W[[puzI^nOfdO~;3չ|Ϋ^~WG)l66(nT-nZұd!Q!·1ʷСtZ:I> ?#[H0'ٶLF"u@[W⺮DlzMT.+Ueej/t}5{"BT֋Q !cJ,O#"$K Hx+f]d}>Aי=[65LdAߊcÛdo gf&+٘ll]=Ua?0aYx)3YX1-l0 }Ú47"?dΥEZgBolWқiuЎSQa3Yt^<_B},ˆ\w<-C2p Gg"QJfcV5TFKw/yG#i&mIu'J:i:/w'󾘒Idoӝ,YH.ī ʎX?NGZ~k7{tv yoqxӅ(lmډhg㩗<|w`8/6.WT 1xtE.Vx=Ɗ$[#f'5 2stG^[0ZOhxLM >a^RuW-šW3"<xk?xAgWhOwփĵfAG</B[E -EV k3g B~k8<-r;!gpGֽwJ N:-BM_8Q %2pNЖ OW}4ߗ׬ ;p!խ}lV1p?}/{-,x$>[ac+–iY8S:CkůtSa{ o:X35k4j4)Pߝgz`W |>o+,S9#UC@?;EV;2{ppuZp i0xDI0̳Y/`k(l+!Z'b ض+7[WQ,\Agn ~~* ~" A맣~;ЅTS Zk&4!3/[Է^"D8`b 4moQIV|#a s~IL ; 6 jVAqz g™WMhA'(Kd(4;}4gZpC `F58YMѐ:R +灸6Fz0=iP?*{Њj@gF1hnMЈZBa7 7`[^<׬A JFwg  `E#p<ϨE.-W| y)$;ΫVTf7d>Ȅְ 쀅 ` 2ܼuKas=3-lkt@ozæf{ecczcx+^Q]Ax[eb+bFJA4v㑶l%=}ww>/m>{v ,ݘ :.!G98+E OSBS(O>Dnk曟96ܞ 'x ,0]1UaԒZAHiDqNT}DŽBeVnAt]kSbw8^vAH3ar0" J[ VJi&oRg:jS^SMҀI t3]aKYu.̨3?t>Wgmzy-􇈵L&٫[Ⅸ¤[©P!<v j{B=#ݑ|SEbi;XjjT65)bfm,M1B6cbYkK))SgmHve;Ty?f4,W#u;}3M1b;=kXrۮ=%nb$:%\? Y-˪a9G=W+{+Ǝlc\ mβfe**gl,URYߏ^2~c6Y.2c>O3ؾ~,;tf CXl:Xve|v9b;k:ٶ4bTCjlAld}< `nN+3zi]@3:E;|h{ ̰><޼ח2ZI/N*&J5mi -N'RHzN^AɋFpԔ6^MMLji}˼/,|N[Y fNg}WR3ϩ<כ;䩫Lɢ:M[iH}x=~YF$ vWu'@α 4RFL2ɜBEd6q6^{ʿJ-եt*|> @xˈ5VQ HT?]$T2#u_}])TSӣPW<:5d::1 P״P+JxHf%JeբOi%:n_k )-4_.wʜ;YWJWƿzNϘws܍99f~]a݁q</4> 8w +J+J+J+J+J+J+J+J+J+J+J+rQVT,y,*qq DELN2牨Xn5!Q=e^xk yu'~2˫+ok6.NTdmBQ@Txš%*7y" EEQPTSxbت把ޢ"煨(=-*E"]b[a/*[[ oYbX8Ƿs$KTD)x| QQ9BT3F 9cߏ>nM?VW%w+YҬFO}k9U+<s283.˧pZRNJͤ|g궿I[r­K? ws8Q.Gmt>s`Yw.=fNKca^1nWOeOw9]:v3ٮC>lbbsl}W\c,6RKgd]CYnc_5>`eܶ> Gݲxߩ“|?Sh=ƭy+pdvxKP:JF,ള54Kcp(@U-d7(DfTd8!HRtBrgH>I*O$R#yi$?FHNTIW#yjK$nHٷ ) y-v,DjH 6sB\?n?THAc\b$nv͐'@ҟ]H~&!'!?7$#6&!^'OĻ,C|Yě#F=aH )H𮃄c BNHX#F|WD|o]83|0">B 0|-\ʆw<|i%][ [FP5v>uG[J^+]cќBn Bnc)fLnqc.l0 l:Z,:$4ښ:mo Kg7Jb7SHGt4;[)頏Үil4㌞4OI{HiEFBJ>dnSf;ҫ =JakNtՍnј.׃y dVts|M+h7i/7$STןHM9$@w9mW&T>H-m*oZO#rON 9ԧg*8}27G>z(O}lOn v-~ un&Խ6Cd('/͏Y6ToXS2V`?Oy ۺP EP^Z UP >USP7*h Tcnb KPgGnpS؅}Qv_xa?}gIvarv7a1ou}=î0va{>歅['@{Ժ^PPUXz]j'TjAeiPN(@-T6P}u]B%P׼ u0u6]#5áV jcPѲîqm /3e9z:KS>:jPUAPM26 'Ae$k_CCmTʡjmP~"-Jۡs3(ǏmA؊D(uCYVw#($u%(܅P۹Ka`;% Z&ѾO[f bb+ُwl ^͆96 _5nCVY?S/_ͱ,خ0mNΐE?}; cHl~[b۾^ë]cǐFةHĮ ^N@f-l?žS,v Y`Ee|jR(>\ β%jlӇ/=un(<OW__5}d8' pҿapgpvZo\u:h\^mpkV~ʀ[pcv}xO_xm6)xmiwrlzkE4^EZ^:?y|<=\kp%vk8 ޽+\>8=׆Cp;ӯ<·E\v}x|U^c{7I&H)ri6Rk P3dK3&+; yu‰}8udݴPPQ } 3ևpl>qip!p%\\zqG wɸYe1{qm{Ux01 a;Q*ϡ2K<ǏϛLf^-y7M]4|U(jf5>kZ,h𧻓z;~tWz?W >IbݭYW]ּveX{e־yu)YgWy9uc_> W462 ]0*~Vm6FOxP6g?#٤67M6`6lDMBLMfs*v`Al^>-,'E^W켍-}VG\+Ml6Om"m ֩vfGoa{E aٺp;aǂ$,L?iٟߺL~BçhxɎ9.4 XDýi2hXMiX$ \&Ѱ3zԢ߲z4Bmhd!l06>Q`'-ч4nؐ?иBc 4^ՖkNxColBcOԥqJ~Dcl4~UE4O!a4Biҩ/M}Ҹ†wd!(Abwgqd/o%8ph|ZHC\ /D/i\?ƭvѸ]wEgh䱏F'0u< 7tY{.49h8 4l[Rih, {e0β_`_kyRK{{*zQ ٦=e{ֻ) /Q4IB;gd{O|ICB:6Q424аlO4 ~ [wihSnd_Iц4:ОFi14m`I5+iMniwNeS{Ҹ\ý4hN4>9ƗG 4>/Wx!OtR4,M4&t ~ ݉g4F3@ iԹ> o̠)4T.0F:4x'vCȽ4[U_FL ~C#hӨMlfOh L;h[i! nѰn> ѰF kʾPZ~" Ggp% {?awfѐGed[aAs|u>GO{,w4̗r>% 巰4% 4hh/q4tp[#COHϗd>g~OQM"Fr&|}ʴiڅN+~FQ4Ѱ̷!-i8Kֹ_~72~\G_8wQ+ H4{hpÇr\3TDP)GZ4iÝFhT)y9hOh9G3]h>DZle@Z|{vWp7\p<ŅۦpQl.^O1emjp\&sOjV^r'W`k\,Cy6|67vfdžb/'6g{nߜ;FqgB܀s> :˽L('i^T-zUJn]ZӮ iőFthp!u1niO:==Hg~t. t9ړ#z5n[==F# =3 ^ugkGcz!ΊkI/_7Tt/P 恣Я6x ц3l5#3AN :V0 C1$Clb -0E{%~`x 3#eD#02ȟQ %F0~FK7݋?&3F7c2elJ0n`R1-Y}0 22 &Z1]&np 3y&ߪbx0ELfjmȴ bӾfzLӈiO3hӒ62-ЉiA"ω]fխL;߇ig2 *5HW+:}>OLQߙSea>L&:fmͬٛpٍU^3s/s&2g{s`%.kQt/>a@IŪ GO?E1EtEἾ/b:!ZߤqRqCIö&Ԝ'MYUV()-7QZU&myU{y/9 %$Rw;)Os)YMNp/[ҍҩ[Β%m~/.]~'ݨN*pFسXzPh'YKn^;"Fz]ea[1 5jGY3PCrC.k!jv8[&ރ:J@Ӻh -AީheZCѮHL@~.;uUt LKcL Ըry[cL]vlZϝ)2%Z)cSVfʲLhŔY ̔q2OfJ'ǘ|5W3#&߿Lg&3S&?:/?SzNdJNLi) -e>RË 21$&FL6(cҫLaRLgqLXg<=q0qz1h cve̝ѓ1Qh8Q5{4#?~doF6gHFD2bo_FX0bx9#1>W>n%b +2aXD5/dX -Ϊ\{ YĐ Jb\=? Ycxt'kWxp})~/d|L豂W[$/U~~;ե_Q}oI>}7a5}}w*.s}C߾mkK:{>/М>7?J:Gy|}5}>^ϹE91>|s|} zȘ!uY/ϥȠOV,}2w'}R'(>6ٶ>!ek軳)_B.N;׈63G>T򠲀 h *ܰJbо) c [a o1lrF)d h5i}10Gq0~?ńŎL8;#ĸLZIg2YgJLY)L)곙 6(v``ۍ6K;mͰcCX aۏx.ֶ[$~X`lҍƦu{))6- u1{bgvUE۱{iʩƮ=au}u~O 6}a۩J(g?jL8GN/{ \8p<N:6 p pySz"\kQ^[1BOw(AoOCȂDuέn% 1H9 iѻY"]Լ_?gTМq6N3fqAoo7Cɝ??:4RKqe zŵd\ ek\T4ݖ?pw>TDh\s |r$4½pOịQ/#m wgg2|;7'-9'nl <_w0!PZ2m5f *"È?ȰȐ i`? Jn38| g 0w6@XzHE?r=3~b! Ӳ!wW9zktSz>F-xџУiV}G7)t}Gרt Kt=׀/:.ItjM].1;JtEĞΓҹ<:]GG:ëtL%vcY}:Zͣt<Eǟ=&{ѡԌmi^;})ܥݧNf Er~+9vy1Qˈv/IٽvmՒ67z mSם*TSuCg.Uѻ*oCTݤAKۙT/e,U#y˂JQTEez*4TޯJ* cT.u:קJ~ZRmMuڟT~DTC]+1snB#eԤj*?ʼR(ydģ#Uw.RԔ*gp*LRW>GR5ƈкT˲M\DeUg-fP#ӖIT$Uu*KYéU2DsmNYho.6D Yo+[CL͠(_Lu+٫QT^*_<&jdz(*E)QȢZ խ_9H==>pH`ӀWI=ޑkmg;DdYq]jy HΞk Ƕ_vusDl9"L8G%pq|.|x#g91c4؊{[Ъ,.*rA׉CNp$ :>y!UVRBչT9v@ dHUTZM}XK{w*{Qi,ߣITھʧ洵N[!6픴2mD6Bim^MC~Co)q ݴ{5KW;~ODnb:/7tu=Z;qK[ZipEh {ͥpIsC.rɅ pΫ}gٚ4C3zl8Q.gM)猠ќ;qP߹Ug8yN/srԛ qxZ}6CF? pً'cه5ػ{waЫ^ vVa]`7Ұl}[M}l1M=m٤E,SDf^kgX#Y?]Ʒyh:fkx}&^dmxt? x^(lPokZNl…8_67:8x v7Ʃ8c6-pS~#G}d|a?; #)[~9/ѳ 'c?|6}AH~q)V"eR‘" R;"u2.ԅH5V#uh"uI|DJT"R!cs$#yBW3$߄ēHy HXCb3s_Y1ϗ!b6E?HN$ a9!a`$=H> Z__>[1 Vzq ξ>bc0Qee V*80|w7x9d }¾ء¦?Xsr' fcax\I/anf|^][ð5hmPgbǮ:һϤ yݤS;KۤUȼҁ끤\_Zg 4RnRO?^P\qR$T)Tt_׳VNN fohǬ#30`7tc+E_`\ǔݙb?.Lxћ C0~ye/bΌ1;}j<>l`@0ru#M|,{/cؒ Q?3xB220'?DJ,>>5>hѯK}OtzBeј~q=jmtlG$s19.DU6`<'ӭEk'5G4:y= b~q'[÷l8} Wp]C8~yi=\ag]8%ax8>'va<vczC9Pz;uUPu'y)wZ>z?A=g2a2 v*#`0y {A#gag {9gl|v?#a kM}3컘¾gy+{'þ5`_/> ؕ.b...n`F^;*oa76jA}Jo.Ԗ<$뵁 ʾ; 6e<Tt+\$y!<}ڰם ٲ~#,!+clP_ PYP*e,C?wòpx.8իN#8]pafp)p<Gd,ܚym΁pSQ%U 9Up(ͅ?W=x)m9s~5~zO^F ÿ} l/Q Y~?X<1! m}P 5<f@ #]??M=&K&ޅ5}}~ ~ry-'ÿ(Y;~_9ޭp8F Ëx^kwX]&zx<p=UKFcTg>kek|3nw@Kk+0_WXUdQ2߰W#vZƳ윸#nFob]2/kjԓ]u; ~n[!vZ{'cOxӀ=Ʊ{~S3u¾ϐvgχ}/&w`<ǁKOq [єN<`._r琕ZӑCC]9lxis#刂dD<QW9^csv<.>˱;p\ ǹ\[8~X [pBENܸGrNPWuQ1͚;;ɮɘ2ԖStԵu9{NIt]232&sμNs {8sFqNq E<3I};1s3ѠnѰ~LJ-nBN4`D؋43&fhD42)h+Mo]uq4;N6h-ߡE7bCMZd<Z6E˱hLeZ'-ӵhF#ZҮ!-w+-MR!zL˺h-_"b;-TX6IZ nE{hQ6c1o7zf+~'\6%gSkjӢa -=EZJEٞ\K]hjF ZrZIAxoӢ,GZ6NYzΥekKˁh9 -rB=ZːԚ#_rH-mteDҲܾewZvE6iٺr?7{6he=-iӲ3)e \hq,s-6b Z Dh~͓U4WGr0͇Vͪ~f/YpYb=َ4j)/:զ֫4GӨ4ͽ@Sљg[ӴM6uNYO4G42f#hf ﳨ-͖4[ 3ͬv\/y.V~4Nپtv45;lk0V C4Y4Eӫ hӄ~4G%ijNSrZ647KO4s#4]䱍jnBS|4 bh?izeM_ϖ\>=Ji(eY*&FL[ Ckdj M4>M} =_J|SyL+ǫ{h:M?˾Q7fm6Ҭ*h4G!w`V^nwN麃4]%9M ^Ԥ MW%Q>G%M+Ci}!z< ]hXN*0Z¦j.l [Vqa\X:urA#.]-`R.1kb.h iqA;\P37AοpQ+Ώ<_2ǝ&9šb9o{hB˷?h}B_K5hYRmr\$-̴iYd U-˱쵅od_D#ՖR$;VُI}l3 WѤ!~qwѦT M iԙF۝i4CШ`A4̩OCJnGyOi8 apjD3i{# r߉MZѰsE ̎F Q}H1{i;O M-r.I+4mM}L:r,9l֧KYWBh]-5y=99's\B.,wᢕ \vpK!2.\6'gry}.p+|s|^DV\5Wwշù&4k>[yOZ CqT97ՎKg']uAĭfՇ Hŝk¸k`)w}yؑ{S?Kfcr Q㨒ʱ)U^w{޴ۜvi2ѡv66f:?BtO&t9~$]Z ]j$]+J>99=NJcRAOa5^ z>ދg/}f'Gx/fVӯiѿQOW<`Q0Ȕc}.,Ay_61h }< 8, aȹ& Р `\SW3| }bDXW1ruF_dUZΨS:nh{1f3^1;1c/3f\Kkd&1) t0gbl`_LC_1o ?dʌ"ÔOL܋FL)fjDS?fjAS5z,":26zbG}L152I.Lz$Լr`^Lw5Ĵfhȴ]-iW3OfLӓ}3chfD3-fv܋.̔svĵruc:b`fƜZo͜WyvfJ]oS4@1neŲEw+ӯ*2[* U]nxf`rqdWZt#R+)ff.>K+6,g>s }Zok}O.G!RA7 ~M7}%>s z'D-==j.Ϡ-h/d jG05m)i:GҩvqD[tm jIet􉭔^M˨Bg|6\yIf/"FqStk4h"$nRT7MXqrC"ZrbT3V]̏te~l쵲ka֝+̊fF[f-f/,|L4Lff7('ߝdf̌K~ӏd:g_fz0=ôLXi#*S>eyL]0i{<ƔIL̔-FL1|ƔQL̔za+\|G29 ˘~Ɏ7 uam2*$X1DCeo.b  Mw `P oSNNg5} O'ϞY*gϘR OyA]MD#Dv@oU zoF?= '\G_\2|X27-X>ݣ̓AvW 1Il9К_0a/2t 7gD+'Fzȕբ ~s1m0&{=ca0qf w3P%;?a]4۔IULf;g-2VL!3@h3mC9vd*y8l 3dʗ8<?B9YL|fjb݃YÊ3u>c!y891gMs2ɜ_Q4э8VE w VQ:pT+P_QnjKţozR G6=$ѮӥiIKI;3K6F:0PHa[RڡiRޯ~RqoRnͤGv)ҋ?u/"֠ƕ٨*]ڝ uDh~jZhgou֡,tyGAo5gsn_W]_1PcȢ -°TG #'¨S?cka܋n`OQ s0`ZH8fԺqug)f{9?7@MCzᅹ%0`%[c=ҡUsb҃34saΌƘzݒ {{$ h%4= k`0?F /`q,XylVkg-Xuy=>#6,7ņ_QMu v'6wǖ1&>mQ;nݩ v=nSƞSM',,}=cf!v߃Sb{Fb:ׯ%])W`qlkPZ߁TAFPu=؝k`{m?W>SEpJ# Qp][ zcu }6cGWóxF:אZ ^}i |~foB-/DĀFLa==ľ옄zp8rG,ñmyk( ghtߌs.fX\6uR;v޸5w46qA&v%@2^HDۻx</xROǜ -<}gFUx1BL3ϛ5sx7 mx>{Lh?/ E%^u.ĻIax?GC>)l_{xg o4›7 xW!xL<[m3Q 7ގPǝm(31MN*W<XvE$3,ƹ,_쁒??Qr.%Q(y(%VQ(~% i}'WPv-?G(5%}dkEɋ(sG\N ùv}PvvݍӃ!?o.NKAV8d)Jo &"r#Y/^pStm|S[asX* ˲U0}vNox ~{ ݈G%h' z,=WHW:6|RKHKtf%ʑjv_}ROhYQك3k3NknLU~{ƎI'0MN/1Fet@Fu^}> q{3D*0(2n-yz0J_?F7o8}}̤Ok9LZD[Ċ^3φO!@^_FCՒnw6t/S>:mӰ :iMc@:~YAǗxS/YtLNGMqБ!tlOu0j ^jNCJ;P̥ݦ[ږv&C#ڍYK6aKө~/Oux#Su{$ϷuǼʩ3]TF%'Q{Ֆ%TF T%Sy(USbww.S)Uv1=TYRߏTi*9EU<U(ivR+*TeSZS͐A\{zn&T\OUX UTEZQuUOéT-{ATyeè'ˋiTje2)Jՠ_Ti$꾙.eٯː"9mU Se)cU2?yl?ڴ*JzU=uoF¥K]T6@kQqכ&[i>orj[*WZR$1yT6>*9Sٶl9IKTWS)d=hCՄTMDbZMdĞ6u_)9B/Vޞey ~:hxf~|DSەњ㚤E5G iζ\?Tּ{h(ZiNSDcEWbb;/HLv?+;ǝ 1XrҲ=;Z.{F JS3F?^"_V cµkpA]q3Bx Olc;M<%| ]gH[7|S?8/_#oĉ>L-*_ty_75CRaV_m+O7\J'"G7^OTᱬpqFnSU?Dd Q9=Q8U?߅sa7}P5n/5;/vg :ao!zĘCcŐ65AK}vhvr 5Լ_saWM)MbYʾkj:(Du|MQ$%Ջy'.[{N8AMm GYz1`j6{&zfNA S? u:Ua=6^ ᬙG#ID,EI $Cj>49;qǾɻKl A4-8Gp9.Q\3 *q# 7+fLދ7pC(z'{Rʋ½(ϪLG֨ Fwøפ5|{q\M{rz?ۆy݌~ྶ{p+ vu67Iqh7{W-p*3*<}w(:\%8@ +p) Wvŵ~#7-oVQ9nh;< 7y$Xpds<ߍh<|r?R{*]}<+c*WEe%u#k)o) 8x.w5ţxtrh}M->#Q/JTkDC&v |?(*߈UrMgsb>uYÿg™8 Ga3 (iB ڡ0?5Aa~ uCEpOIQ8<iG_\_MY; ~,@E~݉ yqt:*pjCNi;p$Hi^f8'DqgȺw'Dm KVd+ Ͷ;M\!n,(/̡9?'Mdo(ri (zbLo~ S)#P}̋8SA8m,3]PlE mX5i \;v;Ng8}:N/ۄӓtGٞ@yƍ,])\ԯ&"4(iMhz}F%e8foqFgnlY4&ߛU@ɸ(98%pa_w$9%>(q]!(~ % .dx@I(zrNP*rr-MxdAZt%g ׁ&{`q& ߸%=|sQ!N~Z86R+pt%çP.v 9qi)5:?::9n02 u@4$;@R$$lAF#nȢHFc¶5@rD,H^8猀&80G Vg|zgux2=H s|m3?{,x!o uoCm ep{݅ءk3[l۰zLbyb1Ni#f]9Vr1aJ1^ yc~s?F| AB< }Z׈n ]NY^_,=zPtt}3JRґgREw58C XR|Vr$OxFZ7_2^}4Wi@l;ΒVfQ$ͰP8/RwVRPn@ +&5`{GVpIyK;sME1>}4Cr5Qt9[?@h`͆AfC4F4]J5_Zjz?.Ҥsȭ MC4n^{^pu*Kɚc/E.B!,Lv  o1S1daK1~m8V{q_L:PHE]y5ČgbEbnehx0]]X&[;E}ŊvjauJiRh%֗Gυu-1Ld"4ƭ6]rzO궽raq{O+~)rc8qp݅SeifᔼD8]-[LK^ jpM̯)\ K¥rpyN%\k ݅qvZ^n ʅmp '܎n­p]OLK\ wƎG7:h ZxmsYTCgA_xkؤkcOz?#}xm(<8&<~8Ax #c91hsʚ }]p&"pF.Z grpr# k|tF8ԍ-⬰ *ݖBP[ UPո/.BPn/T=`PvӅraw倰7-O 7FpʄOGiȿ7=[.@؟?#snJ8 "V hPtX8<8G:+8 WpJ8%dpX+ve@pVOTMSIặpMs[u­6p۠sK-pu!\C{gҝpROnQCEpѾ-\b?.Fɲ} ?YeuN_ e6Ax4.܋ w;P*nYVmAc6TM#&3^_KݭTJp?9E]'<M=qeca~nj> HN|w˄g#CϐCwJ[pY?kEPoO\+Zqځ"jn+ok\;%{%k#׺p9N9T BZ#M.;bcbʓbEt;+10}T/3ML$>}A3DwDж~&7/ZML>Z5?jjԼ@Z+5eknt]bUse%S47(DS6@sL)0xTswaH+M MEǯSD?Myj͝EC5}Us&i\9__z&~ZFsPWYIgQCm1n92 >/? S{Z 7~vs{_e/ǁp Q[B" -A)84E` #pkP D`o%#e>peߨ-si\܂R8n5P_헹s}>ƆuXy/F{P?Accqѫ m6h퟊FK+_R{Rtɷ#h(M'8XCq3"@몢ט'?-/jqrY] ,*>ZL]nfKKU-43W8i,4h֔j̏ijlDkghGk@S]h2y"4%5+l!:.cEUGwSF,ze׃nwc$~CƈĨ9Fbbl 1^1[HVYɡ7nqPDe )F 6]0鷘"A1~bڌ$1Z1WLo~YL=FLs"W7)٥o\+(]3 9Y I M bۙb_Xk etp^q@sL!N"|`Wy-ۈZS'g*QU-4}E8[+^%%KSEizqq[qLq%F\˱7ĭwŝDA<$*o(qYBxYSVo~FGmۉ7E( 1!C|j@|[|J^tG- -s89s|%H|V|-ln"D_XmWR-ķ&ķ՟ŷtV!7Eu>Q[T$EFTH1BTQ%:!E˿|oķ~^*>wϊ7uīYg'_ӽ9*xw\ڢl*E\y]".Fř+KD_8QpA\\k#2bo?E"c+Y ]GMvaL췴f6-wѽh1`bbb1wECgܼh5ZPsEmPk-G ~5_k?ߠ91^氫Z2m&j\s=5K6kKK5;ii̼i;iT~ y钚i́ nY)ȯ ~s_yZhHݔ7KwsZS.PsQ\gŵ69ږRO>Rås%dV.Y=)٬8#9IAZRAt|I4 ]ڴXUz;SzZ϶h[cw V%c~~@q"N߅Qw)a0`Pۿtwt~3b1[E`I3Grx[ug.bTlMͰehCXmءU7v{_O{؄oO4TCJ@dL΄} p%/ӢYpzPg6p7^p.s5h/鯮WXKL<G'Ê຾\#Q&|r[DiWw..'exJxviO@x> UޓZ>7Ǿ@s;|}vv>F6]?ӓ;'@h)(*%ql}7"3wF2Fذuow W#%D:mGT:|} :hb"f ČC̃<"~bz* . Nͼؼ3= +qC"7;B#L{x>/tGBH6  a@HolS$LCIH>m㫈 Cƈ遘vx(|# ň ["-}58NFtYto=bE{ |9R$9|"9eR2iKt駖!cd<ڈLjjϘ"gC8Képdymvo[!Qؑ8޷I8hN8ĉoqr SWy6"8 jİ4^ ДCw/Z<6q}]o#M g6H6"jFHMy_n;\*bBWz/ (Xќ("*͂b޻HDtD@齷sf& "bî`o}ݽw޽o|?3dL<$ُMKbYo\K>;bt>O_{G;7낺q߃$u 3YkԃMkF {w/g,7CqP. |YHW׈!HPgRjQiplxmJv}%K2;Hzrx<} #gəQIXa4I<C_vv:k>IZI{u$G>|IM{3Ng%y$=IE; ygHM~G#$(XMAM ?䬝ID>TmH҈rxn>I\_B=ILWDD$q(I>$"T-ޯI[+Iq! :IB30I8C$a$މ"0?BD~*$[āy(E$VL'1sV=3+9D?HI$QD6ukzCHÃk_!Ms+H;.=]-&aNtbrZ>;ԯ$4e*9=6+WL%!%$"rkH5$jH1rC]dA{HdLL"K4D'Iu"Q$@=D,>G65$lMr]9'CN[KB3ɩHHGt'  9BN$- ;1ș&rp2-ٵo&L6#TXBVM9L<&n_%Y&Yx̛>Xl$%_} d_dҝO8щU%*Dp;>+jwk3צ1\P.qB 8ߚܦn<9~ f{)Iv~:gRU΍ O8;nNGEpsjSuFFHGqrƜ[N'5.g7j2'q'i K=Xg%hioUXo!H ]_ﳿ~?Z_qt"vћyC3銞̍ 7?oX vR9Y7Ƌݖ_\žz7#5lZ [kw׳َ \,INnBn$)TrWrFNg ɺ9C92O9Z0YFqv:\%ܜܼݜbnqU3t$sFqSc%Rn 7n&Rnk&nh|o#pwrN.d.t?vJE,梺5\ vCHAr)ɳsB.mǝOp2Csy#Pg2Ww^̝{c7Ao3J;R"CY.߽M>,M<Q<,OGN"Ww6fr9\3%~rQՅ'*{qM4Ri+wq$/i3zF.ɐsJKI WUZ5";;r;o<%idbgE4R^lPe}Ow/k:p+ڹa\pX$iP\>[47yzv:WBScхPDb@f`$(((Q.w /@괿`Z@~.)?Ի 0{߳:З4$ V y F 7U=Ly#W`αRChHө]kˏL^_s%xlÄ.Cms,ػS觧٥C*ʹUyO=7 v.t y3 ꤒW. +`xA){aH|11›y56kQ#l7Fx'S;r|D+\2ԋK4;2Bl>ΝETqyj\A+WWԼ+h[msrpvr<\dM.A.1ktyk(޷rY1ﯹ".'/˹ܺT\`=WP=8ŕʦrnsU~\W-~ef*q"ٽc8nC'Gr\`F w7{ݖ=={z{ӼdF&RcD9ݣm _דP&VonR׈P:щ{M! ԈO'{#zN$T. ^ANϾH"~3\lۤ3\ZA.$֑ [)HʅͤJX"uȚgM±~E՗\<46$\rf2iEj#m%359~r=0%7SHhҾߖLI#=IrDrw#rw0\&m3ɕz+*H{{NمP$ {HKp0ry*.z)0]t!®^%GjZI5+R%SyÎT<0%l#)NJWHaR`L>x܄ $g"EB~9y%?0;$)& V$~Y}DipI$tw y w)I8GvI6+!k-![Wn&p z5ߵ#Y΁ztr_s/JZr7Ꚗr0j;c85s#tpU썆"6ɿ]l+r~L']ƾApuul~hF L&,׏,&'RVAѾA${,>/}YpQj #W$o/G6z$GXJ%X=먏ţѰx+ZM3Ex1xڷx4U>{1| g~}gǖbY/|?e) S/`1vc_sضx,_`*!R,w۰elO^n-n{dחxF!3r?z:$O`s618)ӱ)xz6MlZTx|d פǭ?Ml /Exl Fⱱ۰'Z9K$Oy|I4v] -2Z9B9d|2cx~PYzz;]7?>hmĻE\t*_qLV4 G2ɚK ٞy6K|_&'H4LN#=v)A"w!QͯI$fDOn$ _1$"}q]nKRoY$--z@.A2uHuJ,&y~I=)S$ 4)%e,T=I*HӤC7n'5ǍIˤjs4!upC"ND'M ]M@š>'luV!yI3j i;x\l!M"{<psrɄ%K ɥeZtH˼Ѥ%X\A.Q"1iaHZ#J &K·bU!&$/"ךLȵZmrr̎\*XfAnȍSH%MҞuw|1t*NDY2tM'grs}8iMnMj+r &t1{On)fCnZ0;>tדM)0tJ:N[~G'bEnL$)k۾:HӃmror>r ry5i9uK\IҼM?ƒ&xr1&&FhIv!-N~L !:{p3ajB^"RAD8&sHjsդI }T]2#U dR:TQ&OHQ,wud0R`@VƟp9R8$!kH'?R0Tl_fmIA=)TJ SvX3?&IYDjHSRJj>&5Ix TEj ΑoIg qp!5%go p=!7ϒzݩv&դn44CKEC`C.'M5_4AO'_HPSB, DpwX•8Xk*a$la'u4&(aVI:l`}N0=cM՝9f%~!a'왓^J+FvGᵄps"|h7D!ŷ C{o=~-_ϓH#Ҡ_IVő:$|Mm\w4tTܙG:>,v0uسH>鈉ucLsiBI{]۱U|A#49>0cBn&s;\1=NZevVkr)iv$m"~SH},!)q>¸/&"SS"'I-6Џ_ _BV:O* QzE*ߒRLʗXrٵARVDʶ$e3{I&R RҫDJ.Ѥ$)IjcINR2'(&oI17&ūWEd^R<<-痒[kIɰnRbԐҡ!R=.?EJR&C& e瓲svm)7 'e뛭v:E*}JvH&RST UjR@ >Z?IOlNrkl?$2zItM$arn9{eI_$$aq D$vi%ȍD$l %!ϑH`{O&~)rl\9HչmVU-38F:ޢedx2I,=yN'Dk#/'2X)Ʉ|fOb ”\L=d nB/neT9T7]~l5b:xěwS[PB@]_0UM`pVh nA+hj80jf!XJѼ]u/a,颊oh[/^'E|';zMYZogWtMI]{?yAP?tDmsG3< ^?o$?\-q;fK|߳]u=|ӈ{*pGܡzonk^e|Նm*M_Ys֟íYr [-ۆKwz%]nZ"q n gKL:0Ya PߌYc̘W`׽Ƶ1fW[+#qőwUklqV\7 ̜;Bׁ.K:e]ao,;m͒X|[!n7-~U`,ՃeU'G5$ qT/?ƯZ?  ~ 3{US >euŽ(KܛG^N{G >?ڈ{=6^{T/~h^g~؊[Y?ⷹ9)~  1of$5sb~my z1ů gfu~;'~ St¦wo{q9}#yM}C>A-[pߜi }q߅'m ?݈?چ?%}q_2;6>S-ܧh{r7{=0.Qu"v3~_/eU񳅊=kX.t#|G35whv7M6?ol,:5WpY!.Up?Ty?Wܨ8GV8h8> v-gO<_NJ7qď|ivfcۋ={x뚙x{W^0^6xEAa6y.mL~`AuLz2U?1ta5Q-b <5r2}T06>bS"<['T{FSq'q:UD_7(;Gc*c['7c6<-< ^Vbl]7[^u]:X4>z`.Xh1ւ2X:kN5d֟C=?x> D1?Y;b4"`F?_cS >戏ԝu8xj1y+p<;Nd;ٜlZ{g^o9Y6kِ7W7Mu`FszeዖOqn×J~jI­rpMN)94W[6jӝF6 qg+n;ыpmpUrsJ ~`-b=xv|iDN,M.4nڀ/Y 1g%M_n72p3π8?* y~ewnZYR]ݘ lyff 9K<Ԧ5'p[W݃]\z+.ƅ@s ù2Js|q~|>kNori7ԇ'8(lg8yN'> +:psCpT!@G:8  ώa.iu:z7!e8hI??,'S5>z:>l}k{1xg0޶ojxz<+D#b#is ^ ۛ^vmAcځxޛegjZKr`Ha Ž|ZbbSxAlmxtmƣ^b%Xo^ ֵ=/uL[7k7UamukM+XzVa7X.V(G~{G#w#OXaVx+;aMa aҍVaOX6hY1KVb) ,9۰æ8;!aMXWv_+ ~Č||y" >; ^.x6JPIpffc{ iZp-1N,hQ%h>HФRp⾠qcatY Qzr+YiE쁌;ljq\л~˹WvMOpD]8mnfpֹR=QýtWr+7aV/#D~HaQo&hŭ#:3! mdiÐHq#1y9yq9D֓5ۉ1wb󐌃d\-2p,eXB,)iBu"JHh2@!)dǟds2徐-M&qȘdDzqODV) sϽ+=1puaMjRsq/\r/w*q! \5.sn\H ~ 6;͝L22hE.(p8wfwR/YŘ2r;s:Fm"ֻrQchܙ=\l.~-ąʘ 2*g\l,;,Ll#hJ1jJE 6&$e ʗ\<[#Y~ˢ%XE׌]5̢sX:~;r)=sa{ 3I6!0iCv18|u%86%8Apo'mI\qiWC'ZXc[E7q8:OO;m!8msOahvK.˱ÔTxӹ5ʻ}`'3kmEL9&X.-8;z:[[ W$6QH\MvʥVVc3T\bYd!L!ļ/R/?*5;X͛Q3kn+LVqtUraJ܀/#SC#dz1eWj*N˱L7cY^gJNaڃý5gUկY"m ![6S}+ٯq!q %;ll \Y^7<,5ۀ2𫃔Sa]2rqw(X2 ԤNLGZD?DGung-"=aODFEpbh-cWDY=/hSƷ~SyQgge&2v91ӿVRW6}d_􆈐I44\ٍf" UȡrY-RAw5@ҏ}"-hx3翖nTK\H,ܥݢdcj3iWU>%M,BIz4:jPQnT~(uTʌr2*4}*֊R~ݤ?B/K oү#E5;4:QE"V4.@zn:ZYm!x9 qDQ(4CGlB;5FO"6hbS4k( E6Gk&#ј.d%&@f AD# 1fD3 Wu$ RUDzGg7f:Fw4)'X4fԲ^fm櫻D LG [K۽>اdäi/L̅L{&ov.gIݶ oӠk4!M3D>FR3Oگg ^JWUsҡU?ө[ckϼl>K+*ӧ'ͲǑ %tL/ZE î0"膙LiLK3faM(4ub9Zt 66;ܤsWљitm#J^6[Lϯt2ZS*->KfRG=oףV;2n8fLBDx>{AEtlɝ :.){gbϔ2OobZ2D1 q̅UZ>凱cWų'Yb]e-fy1s 6ɕY;9RaLOT3Y>1z3StDS6CTzJԢ(x{,J~ăYyYcjRl05~1%y#K0z_7S͎&ZB$[^9l)Cxݞw˴9zE/SDkOM^HA{jRtEt5jWMY)U+*M "J֧E f5^Vp+/:+5˛(~`(L4I#­YdD#3 ݅Zm G/Rn#~}LR,-,4J-F.HotPU#Z0&/o0֝f"6f<*_&*}SHː3̬MLTt#3,.g*2}5rfsR 00Pd' 5_C-Snʢi' ix:LlĆӱtRM;򼙎;KSQ<0ctlP*w3})dod`.c?|c޲悗T3O$2JcW1_$2ڬ@v̕,XwIb-R_qr/Xܯ L5;$u'GXϠR;gC-۸<՜ʽJ%#ֳ술"vX`2+1/ǟcJ}ffȻYL.MQtP8meI'S#R W:>*Vc̱ULZ^)SqX`΋F0"ҳLfcicM4dzx}PB_ImX 0w$B&ϣ?Ӧ):ǣ_Q&u6"bPR-V}-6V}& n{ :0n]a'c̈́2{&7`$ɔ>bEXk-2;BdX0)+U]9L nj59Rx~QgvxOÿR)Ka*.}cd}b0oy3nf61lr+ّUEX3!yV]f;;H+1ِzʴMdϼdZyRKVt ;n4{rS9݊ Xʤ˜ӼÄz2M㘓̙ss*)QeLͭ$u Ya̎G2߅KD-0Q& jhGٱj#Kѧ|uY Uhձ89#:V ~KDk3QŏTn kF0v EqD ݨ$1 ,@iPs;'((UupQn] G5;P{VM9%Զ&$iꃷ#V"]SFk!f joD_M9DKTyy#*zPNRGPQ5߁(  DViu6!h6[pSvCG1Ctd3[P(mxt(V%F\i(~i+:ٌ8s}o ּ* (g9J}EE9й\:ʘI"QjA%(;TE5[P악(EqY(joG>mJ_"FywPKTѸ ՠϨF P TFQ6:kG* !:dh!h.F̐T5t/2m8vY5@G6ˠAhoLtE@xq9$Id҉ljHPҳ@Кz$tL7vBc%Q:{0 {Q(vB:S7 T)c"i<9mF ZbKkW ZyǢSi$q칀^F]hﻩt`JW-A!aqj݀ڌѥjHFMe⾯mUDP= Ի.>B)o(껸Q(jtkP+D)(=k?V:b5AŁ-TO˞2Te/oJ+X#T^*x71Pf'eф2 CP~S*DFH.f1(W ,C Π7?Po1|t^i9ʰ@n2(ID|Qp 2|'Ǡ=с#?Rgތ'.wȷ,ZЃdJpY}.s7YPA(( OB fMAΓF#V G]ƭh`NpAKO__"h^y'GJr\콑wO-ڱ:D_A'V\D''C}VOE=XI_[NڴomBzbE0{`Elѧnz+3ZZg0jS4gb$K^^2v~6`f ^Eo7\!=.^T \K4ZyF?+HSKxl{~q0?qQ[8j.*Ҟ\4ϢL9#rryltgU/GEPJ}1jiC~|#Y57N;,X,Ch伵=To,VxHO(`xу2ȘA3F3㶼qfLf2m[EƫXKutڐt4)D,MQ̅ۡB#WƠ㷋al 14#r;d`"F0.FL9LbZf{_Rϣ,GE?@WH?UA.H2HDjV!Ey4|<ܻ||:o<Һ1iHk)oH?|8:25a+w}<ɥӽNt}Κ'oNѽ1Z8)˦.s}>yZ\A;r&m8-L+8SS[mIT8υ4}M>vNxHצч4;T3ux*mT5O3X^k*6-=hh|Ԩ1'15^3wz'0W05{ 6)jla2\,B2øyͼ`꣣-ӢFZS~҆)|Z5Ҫ,hGkK<ڷi+9ۅ`hQ>|jǣ&KIg-g9͚=[N -s"XZ$\EwLʌѿ~#ӐHaRI}@$;*H_CW҅ϗӍӾ bDRѶy(NDiQ]TvU/ @£J BSQmv Z::mNT?G{>~Cނ䲒B v4B>|.A~;J7Pܾ(eVt~U?ઈ҆C)8r(kiT(ӀkV2SCU[QYr** A|'E+K^wKz࣭]њZa#O9%}Ǥvhqv«%̫o]ݓLsZJJd1gRdLF>Qe4e=-?(ymVŀ6( =>Qz*w1%~jB>恨&gMe^HS̎Ql7JO5+Ou)V hut@c*pB.K3_薅&??]GoO4ԅ71Y񗘀v̌{kDWvj귩?)>Ϗa&t:T}р0J^>=nћ>ӫi˧h]I2nU~\S=oGQ2QS]RW>wPoc-ԡjtS7ݐY"I)j+ǭ71?*(& P,J#:EKH@*m{]x|hQ{sM .,$ɵuC]{'&0V\J <ޝڪ1N:)8A~A9[PzRFۆ05u\[a"Yo"?"{#"蝢ʢtZĖ= rz[(\ש-ڼA+|hԛ[" D3#EN/ ?+1 )5g֠\@H- ߲E_6_8m"QxozRQ]Qz9Q"OQZwHc)N:AttH'p>TcAqRwFnOjfQ}dߨ E ?zaN%&5-VyX3.u_,^?Jɏ,gOc%G Mح ZϏa0vQ+vͭ vW{f;=i uc_1bJؠl`B?{K26+gkeʲ{{#vWU)= s%8ʮ5]yu{ƺ~.*Va MenvMx)ab}ncO4DAgFk׳Qw&K٨wl̵Sl.6{a&1?]- ]=ÖMbK冱lΤllrn X26ͺclb>bY8gK1rlN6 6 {a8>F6:^ƞ_MzȦMgSk6u*/Ǧ3' cp6~a^fgsurBl'![eֽ `,6Ne\ً&,3"[y-֟lN6㼐MT!lR;İظd;66Vs'uHMMӗb3z<GEغg,s%_ cr9XG9[;I29͖%K"׏l*6[q>eS bvICLl|>"6g77ċ]ƪO`c_gc ؝l*&dK[ؔ+ s l>Xlјl^L63=?t/ȞOacoKER :?gΞˆdlT6n yז XPN>.g X#Kإ6cYFW}c~v|K{8_brU3.=kY X=&(&r<&b o_VL\j& ,Se\]y=͍Uy:57cg܊`g^/bFc^fF:.Y#+ b6߳Џ?LfMc'}gՌO2 ڥWw7.6_$jk/4;dB ׅhJ:YbDHw8]Eѯf1#'%OB+т!x#̶[A0GUܡ`p4iH d,D[mnD17^֮e&*#L0u= flLv3!L\"dFLt&b&Cfͯg ɇ18<(8'T29oQϙY:~ f6gX1uW R*?FwLkܠzjR1V(_KMBXiYneDɼDeLYE=|J˪'OmM'mᷲ0[*gBjz{,wr&5{K5$G#Ck%b}{,7mo =?T؈\%_.V}#(卻(>/߷qX/RYدGۉoOMM<]~l*?]>cT\1|17aȩv/Vn{a @Ճy1usH,%Nqd`-iE 3LA k?1}Vf# ̚XRĵě3Xu8~vnUZ WdkmY/߫1 챋ݫn zMu`?̺nay!qua^̔`^3߮6?v1/ݙ*G<_=HxXi#?UxjCUCj/|~[ܑB /mqukRnE:uwI|JvD4C\7똠w1IvWv|!k^[]Yu6x3]{t {V6ʦ5ԲI3lQHW7{($ibf6LJMl;͞ofFh"K~f[Cכe쭲V}~ {ɏc3322zfV4dk(6 mlB {fC8=).l)p0vnmt<+鷙ix3Zr o@LJ{JEj2sI&C#!y6̃L_"VkXZJHoOTXBqa#VaU`w_m/ؕuٜ.x]v,nYݺ8ʆaÞwL٤SlJA{Ar<[6]vzb[{UNzˆ,.ddքsR'dOdvm↿䆌~žuKjjز|KZyo&SF.o~싋ٷ ye-䤛,n(D8n 9ɞlgi-s%M:6{x.<\mN`;g.d}̾dUsCip`'w"7"%qJmjM{gTV]F {iq*pjQӍ /q_9ȤEFN۔'-,rڧ8CFV{7rS9St(n社s2p#F \xӚznVs_9;ޜ;mNNN*e͍ƍ(JdÓߏ37fle;_r9zN1r,7"p߭8)W$kbX#7n9x2}i ZsF2{o{}p}7cDOw{ KelQ6fc׮4sn0v[KfXs8s⺏@U f#\0iHd(;ҭKLe6ŌSnjoȌ0,cF·0OQkokD|Ew+vwYRcQZ"*w*Wa2;szoG\i qzXL&ڧB[{HWnӬ\Br-mMKޞ1=Co#mItdB:b^}2؈}{睤}=OҎߍ鹇Vi /tyZTֈS?%|Q;=ݻې">T *}:C_g/!Sz:guM|.oƑ q>-zcXϨZi' %$#o?ĊmNWXyNu?bWfsoB<~uEӏB#jZ+ =?L eFC .tu]h- 2N;NԄkW[mƵépJx8a7<%4fa۠Wly'v@Ӫ&h*'ÉwDI 8aS N M&ҡ%kCcQ 4±_}!plov>$ǔH1hxq m}0Y gC%)>4 ? ӻ! C[<4xZ  4()f4q yCQXCCG8: ({p,2P@V ކG@ϑPo/> )PO')B?ݦ/݀;_CmgP{-%\@-6Ԋd[5jAPԴ 5A6Q0 j\q{Jh /jm<~Ӡ%Ts8UU;B2 TxA6PoϜʵrl T*>wC:Kހ*y,T9|tb8hEA UvC9{ʱ+L9v TQ1ZůP9 *^)N!T.oP.T <2To1PY*=2JE8*]Tr Jrۡ4*] 7JGn#B5|,(K9(YBo.eCW@T(ۼʶV@P*2AP61ʶ$n^K(!~/%>] e?r5PA9t({k'(244΀сP2&J %#(J1H (y@Jz%Pj8Jm& 2^_JzwAiÃko]exaPfG(VԵtByu亮@?mP.@=BǡP>bXO0#! pUUT: 'ΚPgY~js:GC9P]1vP{1jO:Va3sj-{2_B/+PmBw/׍ij=a©t ǝ˖BwvBԾ'^WgX:zΈPrq~<u@].kuus VW<Ԋ>=FUP``ޤB7yuj/U@P[bԪ[RBdS(% Rb5Nj = 5[A]P;[\PKMj6GBⲛ=jG Юkg0PPg\,;L\FPc14:r9P51 GہpvLDCs8>]U).S@]Y5;d:Թ_uGB݃IDCUaPGl8˒P3Lf1qu u)@2hC3PW&YjASuEt5BZP/#7@P_΃]G(Pb,g@;P?꧈eA w͆C PC /Z [[ό*7O ׭/ÄOk`ԟjA}W<UAmԝ|'Ⲽ uKC@[u/92eIԫz"y uJAA\\Uuj8#>Mi/hg6'@PlKB];i \^Nz.P/~@ j R O{rxˊŌڰ kI롁^mph oFOn1:e4 {(A%4>,EӠ.h4IǍ5jช p|8`3pN4'&ǼW?4] n(ዡi98iq8~343VfhZ &@ px]8f7h4LKv>@گ_P{PCW;@|TPj.`?yOrʄP۰=?`@;w-Y޷x_\>u>}]띸MKze{!=S=>_{PY2@ךռ)3(^*ލwyIڮ)GZg.5c^Ö<.(jD;e˫5Wo++U+g˞2yfg䥲wyޱԥsGxxQ0^L *ymٳxygy78wJm!e%y;x73x#Z\Yۚ;*;찑wQ3o(_Uwk2oo73XO?=6J>>[$ƕ*Ts srs984죌x+xvxsn}>U<)=g7d X!3̝3q7ڻO?%<]<: T4@b((keAA ( T@>Au ?_y kbA 剬92"8$Im@wHt$gu@rc7H -^pY$5 aؕT@ .5~A$b|i nbAn3111Ψ@4 "_?҆ b;p 'A8/J4 @E^ wAZ?nA.AP9d' ' '*CA]# -7GpdN أ# v }/qXtl>ws `y|6#Beob`~-Xs M֞듺"U`tco{V^7X9{3p? NG6Xd,p{ d^?y pz0NGU/<`z. ` d9`ت9v*^J0gm3ضYE$ XjR@=7{;"{kC\'/ ̛ݿv =E<0{$=( @p;,@PٍV!{iFb /VpV1>R_= L׸wFb,0++~Dϗsꁸ>v^V,X]1x*[N%eH8½`Ar/5`^ҁ6io>w `QIp#*5{6p>ܳphx:ہSX v'jM`jɓ`fw`8`vsgy`p(r!/jGgE?s6dX|J,_q,Ks8%fA`R_,], ˺wXjXqZwN|0Ȃ }Z Xps%=`ɥn^d,$TEubSt|,{KOo^`ph~N`?i)+V>{/p0i`yk~  sӛFb .j;J7<_gp0c3Jȃyk۲``?Dw;!GkW0E0@<N]wfv6b0,7 . Z `nZ^\D`h ߛ *fz=5qϋ[ %!0f3̻K-C<3l~`̿"nPdwBl,Z%n}gڬSU)`xp.X, i~`a н, bZx pr5!Xt'qh,1`` @X,ꀫE;X|gXZ o0Fb,r޿M, `uMũ/^:x~U<_SƷ` 6&fM.i`,PlUۗ{ź خ!`o*8t8nAm냓y@lZ34 += "f() Ju-4* R19wӯ8L f#bA$1;@쬛 +Hh/{A!:ā2vp ]$ )3$c|Y$lۆDr$<  q2H1$ ɻxNgǮD =Arj?$Dxk9${D ^?bCpfg @l2Og>q'o8 LqyA ~E H<$X!HI_ %)g_*H)ww,KiK _R@y9 2oYq g,3(wr r[W>U@^7K8<1?jv Tj ADPd!& ܫ 2\@(P jAPPg^vξj}ugL@C5݋#@10 8_>Efc 2k(^{-D%N@|E>`DFht[s g!a@8F7}pK 7Z>_P:xk "ͪJPi TƂZ)PNUAŞeT|}mAIw( 0O(ej{@*Pݠ\q.(pT\_ MU+Au!U?A;P5lr@6P7(Y_c%(y J[b@ȁ2wWq;=JW8/AIaP2y@{hxPJJDg@IPzw$(uuf-2\:rAer(|TѮ^Teڗny*cA͐*h)-珠f\ ^@ j! i n/ sn2RQ>zP/v3^ul}-HY [1>1tuMpwP8T(P]T:@U8@X5TPTvJ][P5y,b]VR}(| tAQW(cP ׃:?& k3.ٟ$Aβ\MRAl}+Ȇd2ZЅ|a2cĂ ۃ@:'AWH[rVs:t5 w#Hs.ȃ ׁi нdƈel Xn&@0qz s bt\p2 @fّAyo<5y߀ }= }o+A P`\ Un aw\}K;k y_AנB ;P '%9`6(%jt}(@ɛ/E% ^(nǍBP ܵZMP!=XP@=q;hXF4&e,P:[dKv\b&۳ywhr|Ax|RZ:@Њ2Z;ւibxrpXikk2u$p}h :N#p0Zz*wBR^SХܿq{ ?R+ GSH|Dçh8= 'uilD4=cQX) A(4V^,4 <܉ǿ@^hX5؆Ff4>QguEc;}4J.4&ߡih:w7Nf}ЬW%4 *T]%iyM t#MFJHE4#BE?sq74LEh MKAΉr}3}6NFD[4vyƣhf5߲ChBa#4|pl醆_F , .baӒh ԗʠ1 ~BnPSla'=/Xp3`XԷc^@VgxrX,gnEґLXz C,G$˾ɲ߱OF'YNlG,qn~ 6ZCFYve?Jβײok=@`_>8Dܘ0a_Fd_^,^|e\2|_ wփ}ߕ}kXe<ףKٗs,}>K7Ғ74b֋}RJXϯ"YS[,,{vcIڲ&YRJMŮuX[: {s?{[].'{{{{͕=1d =KD|PuCl {^ϛ3{0{zcȞΞ}=^8]fvg/5e/^%gw,i0{`F{Z,i^>{粗35X7icٻSX+ vQ]k6K6`{^c G),d@jReYjc,v21H2ELz,ά-v`Cd=K Rei끥 qؗ,sf5[N,k[>ӆ}g߂^f'ưEwY,e.< KÒk|,ҕ%1Rbا,e]td)WƲ؇Ծsh{ IDKmҤ*,m'K鱞}Zҁ}a\O%6\7eK}X},} ̒W?e)YjK?}чư} ;)ȼJV}52gMf_{n`,,F닰΋YM,۾ ьQop9˹z<@VX$, [`Coʰl-Z }Z3 }J Ab0< ^艅BbЍXhc,tm_bMKXf-~1 mc5;GáCШN4iF/04IGfSףَX [to%m̰#X#KNX6˭9ma ʼ V1V֏*arXgc 4J%atol\t6٠ȶƠEO@C6hm:%UuhnvX]y}B08PVpvq}gea`Vӹ'NHo^I0<}%JiO?aĄt}}7 ؾ%xƥFʘ¸nT7wĽsx"</.xf\:.>$ xW|d 1r×7 }x7L~TSF07jU ,%|0羕Od =-+\)Qfh{Zf[]fj'3Y[v%2dEȊV$ YFe7ej>uEVfLAY4OYdekm@VoyYdoVU69'RV㑙VfI ?j]X!uV#YGe-S&󹤬nNޫdu?4OVoqY޲|5"kX}ղF5v?/k=ǭŇCaݻxb9&6jCLx`>8o&xuM^eV3[ᩉĤx|d 4k"{だ<`R^} w̩ƭe>ymXᩊ F%qM3WW•kl'\ 1B'\rENX.v`%e۸V8U;*!FC0:m FĨ;0+\Ȥ#ZY#.cn6#U1#l=K#zQ%zcTY5`b.(6n둒Q0jk+Q50s59q>NGwv8Gy)ΜZgngV܀"05HuCpF8rYYN8m5VnS;)ax8]Ey|e潦:^z rwA +Х!> Br5(gtnΦ/qpg&`=KjBNxt^;fn6but=JtcObO=aGfmZOMŞt}KǶ##rأ_hwn4@na)NͲvk(ֱz mw,Eu7v5] T\D36hm ®$]*m7~v݀ rn]"=ŇY{?vO*=&cn+bxC Gaa k_sӮy`Dî8 >MAg_%Х dDk \XG;NC78R#+CWošqҟeG{0W:K>2".:m羛u "\Fג;ѕ!OІ8kܖ(St.nmL~C5Ş/zFя8b"CYܿȯ-ow\7~$^}J,DZ}Ӟ䄡V{oO82r<؟€|r,mQC̫-Γ׊غTgg^%ЮN w!049Nǰ1l= {=NuO.{>S%ǰiV)D|ze|}CTkNƉNl3p,_g (_Knz)(7#Ml'Ǚ±{p,clp̆k8\a[%ȟ}G' '׫\gP&rF%Siޗ(b/gOƳrz%.*4JξNgG lUlg2lkldU/OgilqllN, 6`BY'}YX Y.L|)q | _] 2'Ԑ9ix.]yn\ 76ÍWK!~n \_pݴ+w 7FYrn6Ã1Lxv4HnC8H3Y ol䎉>{?/gg *gV{29p\)Btpj0oq}r?CNOwfPÖEiy{6WTMc`câ2Xl :V 2`o`f 97c0rWyU{u iQ0xP* Nޣ|Gݬ1WwOSJ߳1 ^q}~9 `{th b,MhkZ֑UCD9k0tr dBt Nq/CھVgC KS!P8Xz׺l\۰0r]8n݆cLp? +cT(8<8@gPp='/{߷0~Z`ٿuu4 @_{}TY4h`{f@cPWP}Rb% viP(MS>5Kztg1\Ү2ҔR;$9%OKzj$>i׭yTRNꙻ>m=yz fn9f"yw1I*g a`˸;߉\,K]n7l_Ηz-Zڥ(4'վE2.&0?-5m(=HŸJK-KIƷ:JwH>f*œHsVN"mҖ҆~Һ&'eJO .i#5;-?HؾuiiIe)vP ҡׂ#ͥ0+xpd!өzO<r'9%Z{V軔6)OŠ ңۏä o/(R:!%~'%,)]yE cIeAw{ IH^wj-=[)%}j,!et,e8I?v~Ǥ L)g2 łQ`2$YFiۡPDk(d ^nh"}lrIztr-sMoRGGI aI kKkQr *{CAvy6_H- =% `Rb;";jd~ɩcMO/>c~aikz!E=Rt[ze$ٔ.,$]64pRx/)lo:p44f$9-m\7)xi$iiIiV8QOWt̲t"{7)qwj_0E^݆RMCP7T^83.4}X-@~ayty]7l{:kyJ0|[_:N#!0#9 !̠GW0Xn(#?Vɰl5XTbD}lkYŬl apM8d'L8.\_  õyF8 Sg&@{3$t|Ug8'pZ8N7b 3pP38_n3v_ D8#:.173}ޗ*6H8!\) c]wyY}"w>o: wEGw_2̟DA5kR QdrJ55!uno||^rމ otgX a2!! >l wp |D<yoMoUxzfr91]X3Ñ]k$鿦uaoχWU4˾<{8 :}P^4W=Kcx+Ƕ*>^Yʳ n$ wǛMV2[YT+x:?'N%l$xTt<5Ɂ›b~ )G!MHn"Rd_ғ `yH{f6~G2BCꃂL=Lߧ|׍o![gڜM=@@OO~/-ӯҐ|ٛl <0 k}HmWAFG:2 +Mnsc +09%|_w/^csҲ*=wٟ`ւv6,IY)Xܻ_T> \&Le Sr`K}&D (xhiJ5:wA-Ը* /lv8sG"=r_MJ&%X*1҉ێRlD݊ҩsJ>HW ^J,g+ݜ&uQl"f)=]0lj  .F.9(j{ᯝA5pT,4<'h Fà4y, h_~niuWcut*A-CP2T3旃P`}(ᅠvPl%00Մ^@ϡqs( >9+'{r[&APyv jaP&jMB,@d+#X \(6ɣa0l]pJxYC+1W`ҧ0xB6*#NJ"1Lש:&5 a a0yWQkfo`.=Q8<8fzG@Tk\jr-M݄ȐG0^QWb'̿ E߶-%+²`%akJš3ga5:C5M`3csX|/`Sa XV ekkaXtd',̎5߿ms\9Em r_6̶Em0l3 ky #!yozmE߉s;GeYpb~3$`X9\.Wxy̡B0D{Rc!bȚn3wƶ0eY{+&L4}! =OѺF( cDBة[05VΥ0 xA 귶>(l^0tW v> {Áe ;ě׆Sypq%HV( bm W^q%_L[Q|>HpnG8bp@Wh#Kvp!]Lӧ\xA|~89Y}#>lؽ5v ^Ւ񰈳vU ;ÎYw`0k q`Nس]ְǥ<moWhO]oSV'UXQ ,5oaD}vd s@U |PF@T,JI!jGE?zeC3`E-Xd-X#eܬV/k7+`^%ز z"/`͂ ,+v Â:E}Tv?sΆÞ =fH `J0( &d¤ANP6Z%+ ᗦVGڞ1*-D̺i-k>U# 6'!~589>.g8t&\8 .WׁCvp{5'Aqx9tf>ͅGBqfx <- φCU9 фzu&gw:p5$; nK¥ª$8ICéćeŝd8vw{{FM\lbW&1 WAMX]1\pXĊJg˯u /Xt#挜QK? OL;Znt)!B*\Zjm!cqwE@@Ž$Qz`[w:CæJsaCF8l)a-̃%gwQyIU}2zt#}􄻫d4?X4\&Q6H2d?gqe-;XŬTG\Wj크ƣNJ͚kM_0ސh(:`f>cݿU4_ϜSF0_=lԵ/,tp9^.M,~QFkI0k7}M1-1ɖWek^`&}W9ԈUFæuًbV,a[z q<wa},ja+3?6^!eNS^ahw7v&/þaq@L釮{0)n膞Zȿ\+oTQZF7OIM``kj۔)p8:{-Nk}}ۏ3.JcWpLșU1Gαs']y|K\qag8M1b\K+~ťmKoe-G)|bA\݇+Klƕ~uqՐr]Ֆkq+_\4'20ƓW NXW*mÇO02n1JV[VtLY˵e5/rs''ag26%Zo)k}⼬ Pbi1s܁ QS,-YZ8f^wbmiQzd[ZHiQ].--*̵eV /,cUWS9yhex˸5QA3>4h6=9JCi/M2\ۜh]DX9ྮ5ާǚ0#O-5 vBk3cdqgvjZ B>ms?z}h~oc\FܗmC[J=c> 8lz|-˵{ls>Mh&{sll?5͉b7.ͦp=W獏DJQGWҦФG8զ&tV/m~jk^?m?4}Xx_{r~nE\5QSHVT'5lCv4ʸUSJAhi56^Mؽ{k1P "jN4z:k)礞Y봣Moicjsk*Ԇ;ϟN MieM[O[>x;A2uВP52'J4ХC8Nr4kxu<eup2qAsyҔoCiwMh ^6MJ{C҆6;imNꢃwp[鲖JCsWM[WMy>N|iS5G.&=x9EJ9Mwi֒re?sMm(T7h.y\ij{.Kc9M.Qsd\N\FS|%nVS "tR>9\M92m9ɼ^uh+W4 U2;x8G3֔;%-<MF]Yjˣ*\Ӽq[hʯ*srdr-)sriUA=MkFErJʼܧ i9h7>|N9mԴV=B}?<ɦE=]ʵ.m9m]i-˰D6D3+E}C[9CX4 }AS?ִ7&MsSJV矼\*=Mg@CUzW\~[֚?U@e^Q<.Vؼ*Mw*^-KNI/N|\ U]F۝->KF[-Mm>Hr"7w(srھ3<+eV]5OV-~4}ǿ}!uB T}ߪ;W$VV>ѤǒR+y;ƢI.1jjۛR#;u.Sӷ|ǴߡPoE7\>KMyM](iywצ.bmy0o 3To~뢩m1mr]~;Ԕ_yC];i=ֺsh˟%?6Y< x8noFwN~zp}Ǚ+kfXutO~>|:u|C&:InܚqxŃ햺Ń¿G5tŃکYC{on@.ƼArYhׅ#ku 6>.Hg +gtQ}.kt]g /ݟ쇺qM}[6PG_ܳt'2g%~;>9U&|*+EĽ#{xޝQq^sugjŽѓuë=m^n?tm7oۺs q_"[~NkB)]֦r?Ͼ2pnz兟!?m7'm~ϸbSst_λwIt_~־rcS3{zf}4.RmqO`j{ens?X!?)?Ϗ_|T7ZܽdGYx\]uWn~Oķۼg]k"ǟBu]Y]1&Mc}.Սw+ҍb-gq'z;h!:邮cT+yk~|OC3utαźŝwѝ,ϣ.'?6,t>GB}%?:s.+|58Dz̍]KkC<.1.9-{҅|ĸ?M?y5_Ƀ7k(|] oJ}t*?ooG[o=xeN>||7\sm};7a/NT&q'F.6[Ƽ@\X 6y pKs,wsC &9\>8ʒTpNd-[~mm ,(B><(&?ڟMџŏ|@!%B?AI@~Oz[)Z]]Ѧ߼o^NDQ}?jKRsﻟuמߨ&[O[n3nZIsSVy+CG޶}։~1=q|O>DkȇR˗6}iܾԦxO}Pˇk=7KkD:4?!+!{/͵/[_UBux>g\?QKUљօ?8y-QJȏ|HgOSNv㢺|^1h=Q;+ˊ9K/?ǏuhCcO~F)b |ܾ||tu\'mu޾RSǽkD1oZКTAK6U+KsRyC͇o [,pԉ-^*{PBS'P*}Z ՟uО"uZ4*RK=5>wi}wl'Tq6&+VcLR;EMT>|Ϊtg3sZ5nnq !kU2gzhx,`ړD@u~%+≧yb'Ubr"*@@ڃDb.轈eCɨUwԇ.P-nyQxPf^=Sq"Hvv:)6溒ox5xL/OHv>;7y"S̕/^^ԗY)m+WA׍su\*lU]b?TsEg(t+EsK牏9C"|{/ߋrUjWJPWMe$'dѺ=q=IƓeOד9ԯ'YOImzPEox*P'A}y{P?BeHۃ yndTw Tw4tAS{$N;5tNNN1\OuuFM Qn$;FFkr7+ Pz? WMm%{yg=PCH!B++JTו]iOw~iԗŅd\s.ԯ BNȮA *s&ygՙtrr7IgÙ@@@g Hm :kHv5 TOO2Nd 'PN\@fякG#~$W?חܗ%پTIu'އ| U@vCmwmp9j7Ko?&oxzs9#:R$H2͍@zO"^g/^_OuOzߓ'ٵ'AmW@vwۃ Cw$۝NrɗSyw*ɆԎ=S4V;zoQձ#[t#thݨn[3ڳWlcKul+EW3{nW+ ;Xm P ƆTxl.$Ӆ| tPY3cg*И:SygIg*L:ޝ݉:QG*Hu;RlՑdztW@mu G.Hƚ֓5X֡j {[Sճz7SړOړ Zyn;v$ߎjGrmVR@##{s}_.ٞDy'͉6Y$;yk5/uW7ofMu G\>Z{6뛿N<.ʾ*|!/[;Vy|_:P/kŚ,6ՊتJc6}\ewMeck>gyOQal& ڿž/ߣտQ'I'3z_:tW9Q ʻ'sh}ܶ4*{ sa45Dk=kOgKUӻv{$kGjGRݶm}[v[*kKeVXQm+*mnmhmCuл6˭I5ߚ5Y+VTɴ3RKzג޵w-^KkAcnA[И[P*4-K:,I^kIuT,o,XZ [X?A =BW_5y }UԿ #Y͑de$+#dcU4HI^\`4WUrOu0˟F ȟ@E@{,?Ax=R/мKT,ٖ?U%/$ގ:%?(ˣ&KrDc0ۖ4aSS)JU*%z?W^ȟT6Fz?_<1%Ұh//k['~]Y|?{/'_t$7?핿(U:V+;^H窪>߿S;:啡*=9Jܢ)lHus q.Ҟ:ܒlٿE"2gc{(. L+ǐl+ې gc iM֤[k*kM6ZSmP"vRbhonCkYד]ԗ /Q~.Hd5Ph)-[Ђ,-[ 쁲$eӨ,"eQU"I2=P̙}̙iiҜ(AsOm/7D슶4% (RX>BmHiR@j hK " BV0=!B6 qDN{(oh+ QkAa%;Bf_rӜJ5yKٝx.RT')=\4ORU(aO*VFFNK64K8U9loms.Blv6GdzDR[FRzQ.!I؋P8v(2G :foy,Cq$[h헔ztG:~QXjXz>c)^FhO2Ǒ_gDkfw:'P'P *MVS9$0Dy$_25P BRds߻Tn(QVMM[od?NH:fP6o)AiIz N,QYL)6:uto0WyL:i(C{A$ͅ*LM,ip)in$6p`ޖNut06p94T@SI!ꓨQV9YPl, %-9Ac%34b?P 5E2HJ1ND?QFuJlk[nSZkIT 7{jvC/Tl6w kfWYfFidLsWtp_v=[ӢQa}FK.#m\J3Wچve4?rQ(l˧OT=Ӣ:YX'/au3S s%C[QG? lZtMF.S.UImam"Y,^vFnm[e>TV4rmjG\6ŽNt]au֏|L\:X :?:nmo{i=DC3w!g4yH[kJ3ֹz+^Π,*cֶoIyKg(l@id_AJ{4Ϣ+>gPtO/gӭN2=1*t@gf\\Nݧeg(3;g@HSJuJyRF0BR46ɔ<K癀$*kja~'Pt/)QǮ&ʖ@,'@$6⩜' /833T8/ xnzvR: /폙9 lл)Pb6)L4ESTNIIwn_O+8T}H'(Ac)C: B#~; bd~ZyF-(c(*-l`5yCϝ l -s4Q~,!#;@߃˙ӳ*i?DAD_A-iѳng޷`_zolkپ5qVPK6/g8~fs5)AeNi[0Ty3CpCl}AElb4F%[fGs02[7YB`(\_0q+w~SsY_&[9%>=O h6F~&mN꫙͎(4jfv1.AcaPth!%Aph1όIh]3S^FƒmSjTD5Z]V7jIo`]'{ &la6b#UoYs? 61٪˙[o;.i~V >d:ACd7tjݦEZ`zrq Q-p 1PN $(N ØXxI;b#CVMs"PLϢssL NazQiZ/ !Res3kk _aFvO4V[Hu6ڮfg񜅨uQbvvrZ52S8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8Ǣ;⅋~t=IU;D#Kɯ wR^vRZ)~O,JeW%4j]-T}m*u5jQwLy g@NG^Kíڣi{wfNw,,R^7%(:T.pwRJl"]=&֋k]ߍEEMX狿So=4otfR5XFv=;潛7 bYni]i~&߇i/zI7 7Ov"vAm ̥QԜ[lOs^VI}PT|{aWrakWֺ|SJJR*pX^vo4*xm#~ŮiJQDӆ7A?L+7 \Ow5HFڻ \~{~\<*K~•Kr5|X?Wȵ^•aݪ>աUnWBfxq}nrl kp"Tp?qσ-E|/]/wX{цhMdV9I|8JUr&sl'%b? j˂qq#JVS~̮`^MyVO\3鵼*XIkaM*5,5W)݋wsK|ήyx00ޅN)LL wFф.GwRV\!C +P|:z}M!Y+zc [iYu ζ}?QgC"q̮ބQ3Zrfz;_9JuGەPu+[oN_p7ӧ :Ы%TW܀o;?ɹ*>뾯ކ-5ߊYG??a?ݿrbLo>;~{wg6e}˅Y{ sЯ5i+6oM ĪkEoa݉Vw Ż;p_鼰_0̓՝XäqcbY俱)~ 0lѭґqRHi@w';3H=QoA{UtZYFk_JL Ptϳ}#n6,Gi?Z`'`<cq̏a'%x}bx%l;:n'<όExqC,%51͞{ /v̦(vE/nBz b0>C^0aF(G/:{H;);^_HdH/Zوz"^?aok{ M ox=zN., ]2 !#0Gu`@p)Zz/ ϣߨO ֜ GW$|XZ # < BK"61@_Hyd-Rf CJHHI0B֬_.~S1Bܷ ?M_# sh"B8CgZ1۷~f"1>D ;І=0k |Fa`qs5xF@Fת&}ozAz ?ݧ@Z(Kغ?k!"v!zgкK-< o#иS:CGksx=BDxh[OknP/VCs2!~䍠bއ(w=^{<,F8.>y=#zBb k#,:[^3 I`oR;#V_G6cxA(?/ 0h*2#EҔD<#k7Eask6 %#sY俒\Hy}/hIog#fXo<1tk71# #p3"1؆`xTSw(K(cF„QL 1x#\AGF{10dG #&YDȳ(TC؉1q(D`QW=`C_"*9x &_Z4OG?CvYE#&DMFVx(CK1vE$ȇO"t=B5fBw]:`k+m n %#_V HjuHv[#.j=Ÿ/'RB|wap |^ !wAu#j$S͐|/3+ zd co/KU}%H5Og1=sZ^Dă U j-ň[;7w*>FW<NWo;G1$FA;;^@u; kRA"udX?"Ɠ~WH,i-#H$؈VO"u[H)~IƭHs;RW!udȲwi[6 cn$P!k?<Ck!PvS{bv7 0|tk4'BD∺#"_9qdiH10˟ty&`H||]Gq E$BSva}zf3քohSZ0h}TaPzGUK np}}fdnAD-CcheI;f!xiz 9N OZB=4p[> ~s_|s.SF(8-F寧{^OC߸\{ uǡ0}O; {ІEOh;jԳ{<^>Ct4w1p&GZpdsH 4{zۏ3M =%v-tn.ڬ8g~s&3/~83hw*Z=VCsuCj+t :lѩaogSZ hzy'>8o <ֵD÷&_Go :g_ے>3 ݖDNשg =0#t[.z͘wo>Au؆DC.] &Pz (W]퇨lx<`MWD 1_B!-b0ˢFĩHr ~ Oi^z¿I"D;[~jiH#hn!S '#\>_ l=Dd% 򞖈7Zj#$la4!Q#BtEi}B=GرQ*=; y$1nT1#ዘF]i.|&Zcnx1bNEy>@Ħ#"þD k0G>\{(RuBƤ{ǑU "@o61zF {#7FfZ$gvAHfDƯ? ] 2K92ׄ#sſQ9o7 3J$nXϦ.^=;b\>!M" bDBןpug$zY`:$> AAЭ9LSHHnݞ#[3"-iM~fXqߴC:y6 鯧A\z0k<rg##LM@d }#ą\Bba FaL֛HO Is9 CS}rزl$ a0+VB|t ]}#&Cb!Ʋ ˌL0tcȩ;Fz"p'~8Ҿ]y9aZ'LEd1" Ӥ"=OC"Yd̄.f5ҖB_bFzg Eވ5Ӑ6ַ_#ogލ4zGu-#l/v}ޗ!1 M90Ĵ IEHswo^f"0j,FgGb:u>F~3!ϟFFe?Bvc5c‘9HNvڟFQv ^>'1>'~r_'P7y#އNV#c( !w}L9A/ kv Hz'],cy }'Űo#F3nLh1FO¿1E'Lm 21=회I]zb(XzC`x D  &<=ŭxPS[11!*Pܼ#Œm1CV@1LTϣh&-jns,Qc3#c;l6}P me(r';);Ph (<&fw?`ԋ(~=5ìZ0󝵘q꿎)90'a}0#Ղ&bjtl zf<vcAQcw3}.av˞9QO`y{;av'0Yf-16WYa^c3Y=Ņli{=E>06+1/XDK̞LĂ`17~_lÒwc:o0xXt $`'m?o4,j ێ" cW?`I/2xVŊ_ZdM%ƒYcYf0LMb频XV~^-T,9}Xbr/gauJ^5OJI X<%ʋ(*ִ.k,򛎒b{'7iSX]8iXvV7?UcpMĽS5b'X( "v^tw*i"Rw`a7!vw?w~߿μ3gs3:t2z yGekgSy8*,ȤyCt4Wd1*爐gC_1bx[@q25sC/($>OEQ(f}QC(vW%.d/uJCqRB:͋D&L\kDQG!h ;&d3lBQsXXã(2EIQ7+(f)z"R58F%Jah۔ڭiHSD[ E<Ey> ]o+Q~u}OM^>P;J|M)1BBS: &UBAj(տm2(tf {8v h2ڳvֻR6 Ӓs)| vOs?Ey /i3yhFVOʢ^deZF6 #͇H{&ZzE 5i>MT|!շ[Af i{iNFڭ4׼fazحz3uus!IsFF %MZOѼɤq$f= 4;o ?EjKH=Јf}ٻ2I$TN"?KI%"TFq4;(5ln:HcM$xDZ=4-ˡfn:zJ;i +,bqa},oi( ߤp%}$Ks'hNV,YKWq*XBG+-υіN:YC:vS2TxITrw: ;ұTpЖ ( JQ*GǷImT06 Voc+q*j~* j:bIGo蠧u.IާÁtԈ(mt8\Kf.4s&TPMFSTd$NG6sMEk-I.Χ"9Y,oo?jS=*vϤRV_|VSBǟ671壉=xNA *TFI*$N m.SR XE$PO5F  G⫖Pڏ ,z @ѵ~RC%/6:1T&$6Id@$bu^tv9 '?.fBDTjdR rYͫ KStd |LsrA*MSuT2  *-uβ"^iZ)cAUwPw*9KY<2iu+7ޢSXCbt|:/]|-Aj&et+QFʼIY],eSͦtzJI&SJ~JEW)a'(Nb/SɔRҮdJ]G]s(e=E=:EFQLr+.xKE1/S4%7ZP~>LzG)V:b>xaza ŗzQIq,/=8tſ)śŝSl%Aq3).bc=a;N!5?;)nL1L|}ՒvH&)w@Q"(V )}nЁ-C?%"nQtE I{YE;F7PX#ѷR -K%rf>DYF_L($@XFaQB7m='WI wK;oͣi{i<<@!>P۴z)(8BSi+yzͣ:fIwɟcHFm4ڬH?O[M"MWK_ЦwW;[ o%䭵8{i7K4mp>EccrOɵv?G.r>3\'"E.CաzOZ-L:?LR EV q~<&/cGtGsl5iMTYzI>Iki5OkGʑfy2HhMd9tOWllJZ5Vt.L%t'ϴ1'C2VD5K|#tx2,OƬ3I{3&8Iҿ;nDj{Y #Sod8L7$㢗/>(aAVNV|38F'ss}@s>BVqdӣE}d1(l w3y^9EmBgMȡMR6"Җ_ɿu&P:m@khfpbRBLZ_(-.VS8%;SBIE)wԆ|r%Sǔ5@?(yHӡ|_::LܣCtC w\T\s qv:2X1SNePe\tae&L+r/)eAX:=B)+?wIP9J9)6JBoxB*=IGl(o?^Gi?(~ oң(D@)ODJz݌(w >e^JYMIsGQ\J$YJ:r)R?JH+oL/I^y}27RzgJI8I>)D2G3e({%uSJ)}%e Pl<-b1/* OPNXȜEi9 7JsBH&fMrͧ)%HruޒH~@ji)ue1p mINt{%%LDegJbR?EJ-/iU,E>L"Z)zfܧѧ(n" 8N{Fюu&jC;Q'?{]|{;mLnݴBDa'>XIYpvRp{y<`͒6e%6g0oޡviNP<үI=iKU?? IE:µPxc 8FN_b7\VM-]-ڭ1H(`_ mYN[ާm9W(mvHAM/B,[V\\)"c,%غ1ZJr(?"a@|?ͦC?)H<$d%6[#LAv2EfѯU(7riyX2x=,$ʷ 凉iϏ:iDzkkC:q )ī[Hp)n*œ =It~M,oI.weҔ3h^/A͜__h;X69站ݺIϝE42 E#ֆmy#~F 4 G+i57h$&uhI$=V&OcF!h T/c-yA-xl?&.'~M*~Yyvsifwν8ONpywg2ɜDzbGw 9ӏsΗr:~ irop*վ)2>IjsrG$I9 k98Y8N^ 7 bPcn? Vsq m9 8m9=Sfq^r:F~sθtTqn7܊\yUyWvӰdC4jXK zǪ-4XRy@oa䐦I6b| (e|v̥kGA.Qj^HklX  m"ׇq- H۶[Ngs79%A6NHȓYE&TSk9QH! r=Er6E+b9^r Y{?'׾t[%z멇9b9Rs*j?GOl8'b\'g:N\ѧ9}F98#Nq~ws>刺8sR58'JpDN+N sm;sIz|R 95✍>/[>|9n -+ΝKΜ#8?էpn<<~Is.ʺsr*/(rn}é=)?995=9Wsbq!Μ#89s9ק8^ao8{gqvy|Ԟ1vVϜl$RZRp\ƚ|UdYK&Uݴ=ͦGJr (שfIλt]*M<0@1PNiT{R'E?#IuJؿ645.S?mszΏDϻX^IVŠm;z7 zE-CoiI7zѻSz.Al. B0E=sg?zGꢧC٦JFyn[R. 5]o|tz=ƸRKpGv;]&};\(Hkq\ (tnCYd'\: 9 hqQ|C?c$LFWAg-tTG=蘳'h F18ЉsGW✇.?f3tbkLFHs,:FXq8'9spNWg?8; qJgL?o8}C-&TsJ)=_*QԓhՆ6sh6M]A?MmgѶ-ڌfٍ6r&\E ?[|nVK3N;bh6+eZdQ|4zhzMt.|oi4~+hlڊL94F+19fhFg/4߇Ri4Cu4<^}B)@"a!X]!"%֣=#o7`xO ސFS T|&%nAm!p9vpԎ ySp!xA=[quEgTDA7P)=WD;ZԌA6=U[&}n{^{b4 s \>p-rJ5@jBKP}-/ gp$ bvt]^ǝ ko02-,?Dh^?x4" K ue"j CMjFf+I\J Ǡ4砺E2vFuS8Avlb1{Uj@xpG.A j@확lkCu-xӭ[aSQ[]k=Pn,f@zNVـzo/8܍O`W~${c>߼Cފπ`v1; aHXBgm -aO ^qxu k = ¾/Sw!Biθ?nG*!о zqg!L9=w:$N69]gx&-sbgdgl?{8'XK{?A l M-nUp3m؞ze< K^?@?DᨙgQ{MY:' _ { ۦOpxeqӃ\7YpUڨѨ)+b5A\j$j>MA-@@<ʞ,?/vs'܎}Mq1j{Xˌ^Wnpb+!>}~Z Ѭ7: QD'nK*νEp$kCt[u#nDA]T(rMQWx˪^q,PoT| 4kG$4UAӇ>4ŮFc af/?n@hP?*h 癮B1[ 4TE[,V@s&]Gx=! ҾX QBgqp.DKU+2BdꚘŴw-5A(c|jvnwTpkQ3rv=T`0>lי>S=N6 .b0>gL3۬d!B]Mz!8,/ aq<2vVgX\Vș̿=xzeLkjy\bÁoJca8SԪ?EoWmAyLXʇbZ>3Q-}UWPu ՉP}ㆳvjc@UG,9]8'ʱ '8'2d%N(G/[P1Ũʼn^Tـ82X'B OFQW:C^+P9C@Kd~U Y1Ȓ^ I ;38qZGˑ齋=iV M6REבj|KHy䆔>D#E/]FP$ IJ?ujHh=*o3@|z$Gi$@F3$/'g$ AHҫBbs$vJ"C?tI*HLA#E"O!q<$MElQFo5:B>-BH8IgЙ;*GB![L0g?6/N} Ł=|4l_Ma>s ^{6xs55^f,8fށǺ8x ,3o7=\{t}eʂ~Oĺ n3݆-p pQ sp.eVe{;#b԰Nzp {7>͂Oؾ}ۄi6:Oa}6;`[++؎_ljfvl-a)+6d`Sfa+{6@ka{ln6My6fm~o 'aGaW;{$ [3聝+s^ \n l\`kfvtlV<a;Ո=wv]!{vf{gv#ؖ6mdvZlއMln9\m; ` [".lmw E")~ԇ2l1ka[uapa] ےӰ3a9^(Z6Mfag16:`ݫk8ڢ )~6uFhlfD/΅^Xo] ٰ7g.l2&j-'lƹ 6aQl}lڟ ca3r*a&+u[X2cQ>EUXmX} = >9U"*r`kLD0I Lw 0S?I-`d`zf`0f`1, G3޽ օq6 `+VX,dXJX;MƛN X}ʁ*js6嫋|4Xnmоw`~*̝zaҍ0qf%#` 擦|_%Kvٶ ;aw v2?qj.Aeyόs'H،uXI9҄.ݍ=?UX `B6Gaq^asa~ M͜ pՅ߰J}+3UX"!̏0nP/$o J09~&;( ${_z?gˀ_cKiPKpʿ|k`z3tBS&/,oj-<6 +`[,we'&cٰT,M%xEbXكE'p"Xpc,Svh澆U3uaޘ#hJ;ͷ24[aN渕c\#h<:g~ s+hACur^s @=e79r 6nY>P"4] 5)f?a͘WlxڇYEu7`?PU.6d8iD9 3n`F=faFB f`0C!f:1U2czuL ?b阖/Zo'LiYf*isc1uSSajE*ƿ-Pi@] _ Ő Ղ?- {z>dk+ {qo {]3!t/CV8d 2v@ dj y2AOLȼ\ ً!kYI.dBB2VQ!}{2B{@FLĮY82:R1ͅzHW̆3H=TtHYeC_($ބd"$Cr"H-oHTB$Br$ [!sR!-7RHCw$'E|=HǾv-nM'H\ { T R! RYlNH;2^ ᐾa!#2o@Z {ٛ\EsCY~5!*f.n?v!Z  H1_j{XlAHu Bl򐅔Hwdq$Y^ 评De2$wCbd?oxsE/A"!nq] (]\93" g@1/1T#oB3= s7tan4:1c-)h7>g,^`Q", wb = Xy#EcDC# VOuVX'::vN78A @I躮I-m=``5}x0'Ĵrz0po~p^r+Cy7;% _c ɂa0Xao8j5a4 `A" Sa ɿ`xj atƾ_G.|#X2 Va<<O͏uc:M٬f=y?,f=t rS ?ln1pa:XUKBk΃|7q f܀ߏ7=k<[mƖ~ځG*m`۩vޜCp5B|Ay~^acN , abV/-sTn^48_ŞQ;=İײ{S/L>D@ĽۈSGUD&F lu\ȿ "Z J28W*@T:  iD.Dz TDEmDr1 ycl%1WKs9b"vtb=.b#O#6abE񈍚ئ㈽8Ɲ80ęF\,lCܣGW+C2ğ*Ea vH8lf%htwH<Ԑ4! IH $ y$>Gr%L~ H܎HۇTHu=ԌoHcca+d:4 y iUV4^6Ҋ -2i) HHH-A/ғ ڐa⌌q 2#l 2TGׅt  Y:휂l'32U=u?.#+ $,ȒيwO2@f#2#2M"s^:2~^CF dĩ"c0?Hـ#H᧑rgRV$fvGB\;5`P( *1gy$FHڃh$ڌHBN}BBB‹`$d!Ap {^#ž˙w tfK{$2 ՟"Ѡ hCg 7 /$acܱFedҐov$q*HG$ׯB~ eR\C^B"=#~L Oev2N!Sk12͕i lgֳFֱ}j{^A.#;d w!f6K%=/!}dUBV)Ɲs췽^lfٙd9B֊?2BBdnGU2K"98 Y\dU, d 8s-և댷ؾ- Cu2[+r֪!9[ZSܥMMOy˖!o}aȯ..8phqJšO8?Cqس Grp$iN78.5@ bס`8Zc=pצo7}iCnd԰y%(3sQ`#R8>6 zfjZ(tgmA y+Q((Vjy Pu fv s7%P X_u5~i(.j@E[Q\W(vSP,DJ*4Q8J]Q6R +QMlmDeKQA(Fht)T~LX(%P|3+oCN̵AɆ^#e(sGyQFš8w`>*EPہh/v/D14J::lG"PyeQ6 %t]^D8JʖʍQʳ|yQYo8f*G@eH(ttqb*:~ᤆ'NǢ*s+[Z .jf-P345QsP5$_+ G @WB4({ǃ u}ro@Ru Z B󅨟d4Mhvhٿ*rhu)OC;3nY͚qC 7^i tTmE8ykB4\jå#qIK&ѕ]c?=_+(KJ\QlǕkZOndEb>n!)mp&.íOq"mqx &?C'+_>-~xL=ۆ컓[/OsE@4oXԎB/C\d ǀ> q/0rO 5_w׼^ZWϴj1\NzWE;HS]V`qs$:|e*apgpy5\ޗCϪoPF!ޏ/WގGe2dt~C,!I@!WtoF%Yt 4нTnv:=]r z]ڟWke]]uXTqI..h%ǫ_pQ#."Ͽp}:3]~ t?Zl;iXN1-; p@ 7u\T Å;pa,A7ct|\tl tdUA{{G=89m87{Ζ,Y5y 3qF,N_J8Nt^t N 3!N}8=NOPŹ8m>ٍS'ԏV5*TfN)©I85nm#іn6h[5ߧZк%ZZ;Z[Ž-KEZs.ZA&n%4?KFsz#gW]Ѽw;Ѽ*5l}k~y84=hj3CӁh /_Dc4q4?GC[4xڡaVEM)>G}^ԫH.RuɻQ D !Z# D(("B1n@A8[!Ell+7_gW+ aWPy BuQWSяi&~$'w꾇at4@CDUws~D݄B bw Z3h`;>=XzɨVaMTZ@pvBgzA8¯!TN+D<:%?!:MI,D_@t.cs!4MpRB%ɶ3 : 9C:Usu 3^ aDL֝h:IہzLBb[Խ@|6kNq W;uNm?Qo4*֡x]E@.4j<jXl^4ndkg\ |)ѰYL [A vBiQ6?L\"}?2,1ɳ9,DOY1eg S]i;ǓhX:%A ?/埑!~@`rɤqߝKc1M)aʆay0 S*!x >H@qEM|!,OA(pB t1pRÄ&G,F_w@EQnCѸS@Tœ,!\Ÿ5<c\ez$'C3Ya`Q_ CZ1HkJFaIT@0 &CFp8u!:ø`: w!#7FXVCPјRvv@xj56 ^iS! %_ x6?7f-xk5 >a9! BԹ0nv@yo=x\6߄FdYqY~̾!3 gAtĒnk!zC۟x6U?]| p_3A;xTWJ e{Clv`|qBdֈ:CM n176k  py`4NGÿ,4Fh2MVہLC GS{Q|r٘9wA b5/%ngn|%dNu3Z5,A}HԿaXmiA}H4YB c&}~=[CQp7oаըEuNV?XL7ӱ|LGsY4GeZMahN5Ѹ -hp=oE띨BC4jCkZBӴ`Zu›heֳ6q>N2-hf~T&f 88{9DѴ8+oS'NyأyZDh -&[>]C w~cZZhQt\4eif9x,2k 7nù࿚ף^u7;?HB[9 e3$O? easXf|-L304 c~XU-gQsP;|B*Ѡzqނq J#sv,G&OT fB%K;mO1;2g x+v j8EHÉz?>vS=μhv)p ۉple~U9Il(8}S6 TWNؓ|-8d| [Jpz g)58K*!.NgTsNW©ĆUux͵ˇ#pv1+~CoжG68|醣q4uh30\8$6Ѣp G}81pSc;71;GuoQ{ ]ؽMk <K`{> '{)l&mO}ք?,݁eCXynvX˟)rjx',OOXhrVca aR8I¡s)73p}a/< o ˜m puÕ<o``4 M`' ~-oðM[y l`Ȯ` a?6k9lo؎ەv-? `#س ~#eCPj8y?_.1|}ӫpV ާp1Wp ΃˶p:unX .[[.ժei̟ p.ffgvٓ ^pºIgr.V9N{nٿλ༟%St/~1/r ýepxw\W \Kw$z~۳_a*Apv^pgx>$s-8 Ǚ[Q+pe坧pV+<8:ѷ7Wg`03#Yۏa;| l(zmVa5jsv` B.Cmg2VΆcP~5o$K}b fHlfb:T4@Uw Ĭ0K!B̆WPUH{\:0sl#+04fl?*>3m1=M´g0-i/k0pF7aLPM!PQ@?T^C *ٰW 8݀c:TCP:=NBy0(eP[.Pѝ Ru*Pi;6*J3/Ow!TnLJ~ NTRL}Sԏ0Mn8^ic1mL=;S9P*Ҟ QP~-PnPveP^+<<ǟ~(ﶁ.?(ς66ހ.Kn>R?N@iXBA)p#<BҠ4I xL EIPtbv {CiV(͹%8(lbM(Ub*>AA ePPU9PZ Q{I'(*CG(jC!s|!wrڐ UA$dB6&dBo\nKB~gȟK|ȷu`ﲠj B!i PXc!D @AZ0,% Ba~(B,G(J1_@1%{,NP{ WP҇qy(qx?(rByC;{Q wp n@qOeךiIȟc>B^q(%]ρ\ X&B v܂lCzDBV(dnAf2I"B7d8_!#r̞XK\oB\ w ;[!{e:< wr@JŲ b((Aal(؛A@!b| YlX6߹B ; (!Q  ˡ;ܳ2)\xSiPX&l{R?ŧr\șBe'I'.B1 X9;N t@ҕt=B ufBW+M|}pg!mQ윭@-(f\ $JÍT P4PA]2rKW@Κm3 Z 7{)/@~*M(\~mC}P*%s2 M'7 1(N ŕpu2t` 惂)YA aW An,d.L8n<1]82IZNd$!C2!c 2 +3OC~{GXz)' ӽ2o! dXo#ckfwCƺ2d2!`lHӁ7Ȭ=}>"d?,CV1}p r>vS  2;p't@ ʣzl *焩{X>c1鵽z3+0sfU~>Yu0"jP{ʁF%8Cs sySU1Kh b~}]t,E a+ǒE˰K/X1+¼B0+;>asW3 kCRk3,T4(};hC0Ҋ_`" &4`v<2a`O F W`&N07&6wY6LTlLT LcazL =`ZGv<̣'|]X=rn0 03ٮ0 4K+lDnثu3 pz48 Ӈ08 g3]8=< gW:w8rXHTbfnmؠ~Nc%tyCdЍMgglل͏k-Yt>϶ckI!f~Ӗ uӍA؄!#i.v4MXoy*c{Nw $a8_+""]ň:HuC}hRD_܊^ ˈy؅ 1x1W t^C ؔb8='~q+wl璈S?r=?EJ_90 H F $,CH@B3$A*$J#HlEiHZIHj.S$ϛYHfE&$5CX#eg3R ZNTAAsIC&ҎEYHe ^bdD^'2vi#j>2?"S ̐&D2g>Aʲ(LHՊHn,B $& $*D=| yI$/,FHvKdnHfʝH:H^ݍd0$+V#yr71LCҀGEr<\ԇb$w $^BrND $;m@r$f%lFEH~)HY}ٷ2|r)ڧ!elH)L)?t5?:46<imBv?F!]cҋH{C}dCT8LV 3=d$2+m%Yg2#.vQNG%rtŐsB]vV"ƗZnF^@ _#o; !rBnyb~GP@_.Br ۗ=C9a#܍wÐ r#7M c!2~ێܻ3[ 6"!r?/E WM;.پ_h|x'OY18 O㐬5"zpDG\78_hz^8-C{칈#g&;Ȕ"rj ?BQB!w7 Qx=?,5à(<wƃ؇AC<(9RN< O'-7xh1Ãp ۳k1`# >l*£ b:?2G13)oxànήB?w,߸c@L4%Ө!+93 |_q-k9? x?%VH\pH*?l-՟ hJ":QO-u j@8cnhA(# I;Ϟ ?| " i^$"bgB~*a*9'?dr_ēZ r;:d9l}z59rL񆓡_-KB#cZs3-]8'uig'‹t("QTiunN]%P@ ;BM$̉I]tr}:Σ.tr#~1>rn*RJi(` EOSt=tb)BR"wRp=Qh}mѽLR k-GZ5JYy} &dLMfO]OUQ"3dFҧhMl:-y *nU9w>lKn5gxN Ώ٤s }$ݗ|]9KN%4"k8^'ML Id!!˦dyΆ"9Um-K~RB~\mZN9ӓ6K--AïϴLc yXǓǘ*!٧TM i>6dH~2yNcɦJMc-&9."~wr*!dU!3y"jy2T6ő\5ylJ >,7 -I%hQ ѬdnD1#iC>i|!uã4{?i3#˱Ge6tÙ~%%iYp2vJI4-J#H/\=!i^SrZ1m~(Ғl-K{ٯ$;79$QNd|`5?B*.zf|#KO䦣Ff#;e2"=\1H%y/e+$wTXM>oli*NrOFJwhRX%_Me(?muM>-vz?\I~XJigN ]Nw&&m"-س(E%Ke m(~/즽d)ƄK1te !+JqO)HWD[]0$:0}>3 };)$ELVNiՔk%uh񢨛!hD}WM5%>T)P̉GyIS 9R\;:;)_@ahP m~1Gn#d&%zzZEn㯑WS*I˟o^ | mXYIR cvr F.h VB7?<">`DnOim }g0y{)aBOun#.czׅ&v{hcxH6X^? F>iom|t3FV}OPp)m "m IPTӦoh 'h+Ӷg2"ER5$vK;M>BSOE _7]W/9A9S$N-iW&QmWeH vV p_jQĝ~ -_@Nim1h&AVʴ*R@Q($e_m`;`icuZS+9ۑ="{Y#Ӿsdca5x Y#k?UNcȨ!,m%d;GadK+"/ZJϤ/bxh͏.e1Ĺ~V-OzLH?3l_ FZ{EN^Z,nOF3NuY }A|s CDjHz/I&㷒q62>Yԛ)Fz?ɤ`9v7l-T qhd6 ' 5dW_hҐ/Ӓd> nuLȦduVW.F!?tт+iɨ5MZ`MFsVޠYOJN(i]y?h$ˇ i8n'i#ZT;Hy2I3Ҭ YR-2ivlŲkiWS#I_3ɎF2M/H|} U0mɶ7cR^O3fia;ZVBZ[hQ1ҹO:}d84l8C:Q1f=@kSH)W5#-GF_oIMj2Kr &ݹÔmÂ^́/uMǑnubm0m4{Aȇ,iDIT WkFq9,& |266jWNt!dl5er{Gwrw$'<&>ț\G"N rfr3q.%5'A㗓Lߞ"'5ṞS`IZ_iGkN!u4Tr5J+u>VDKCג{mPS&u.=񤹯׫hZ5imGAS+hEx2m~FܥQ6q-VC6M$ lhS>R}X̻oZcN[K;yͦW)`̷wR`% kBKKڡ-ȻrZߑ|*[OZ:3EL'Q3=9VՊ1؄sOЦ}okܤmiG3-{8-4!OrB)hlՆvQWt|mҶ)p'P_3?J!Rb ~筣EmMsRܔRh- “oQPeMA{4o|B?Ρ=%6x3[R{ ޛB3S)H9N)m7 ~*SH=/M!So߾/=Д4|(i9KQ7(G;I!VS(ʣRf7 mIak)0B5u E \Nk(l&ŭ@)fQX>(a*JKS(;J>2J R‰aUHѷR^O;&P'2bzQJq)ACFkzߔbC-)Vg|NQ7JC⸔2%zG(QB)mS:;mrשR.tf<8vuhG{oeh o3(ha:h&iO}6}ӾQ)þ+)1n:-h/yܖӢTO{Jӑ=)'J-':`[Jc/xQzNܚD9NSmٍҧܢe3(sS2)M3hM9M)geYGRsx|2L&MJkߒ )V2>H(ˤ NSVT8F >17LE?){b_ lOiq>5Mƅ:Х%ev;NijLY)kʲMs?e]@Y,) eF Ӌ))ӈn8FXShEWPJ:E[(y=Jjy#(!2Rz \?Bo-hg +OAm}(؍BZ I<}(BS 7WmΡۯҎChs˵1ֶΠ w/&4u%x&1hEӆzpX_'/ڳ"=mP'%/o|_a txB'z, @1IRnKm- P ֻo`1<(p!pz K֓_KL]'=AŸ;N@j jIb(f: 각,K)(+U(𦄂& KR@UHoSP" 86'Rؘ¬P/z-ŮfPKa%Zڅ#wx–"I}6^m]?BDk>h/)- F~sDK7 ޿DE >M+І=*?&@}5ZD5֯-h6Z{]|棧h䛴=(rdwv,Z~g&y#/1QH'  h,?ͦI9L~Zh0uO? XNMk_,-M w;A3hAiZbCgk2sVHkhNX\xVvK!h4?']iXZt؂j% -i=r;YNhN*ShΖ&Q#ܢ)ͳi|;zA.Nzee6͸IO=hjSv\.oK?Pߩ2`O;7A54\PJeXSCwsC2iG6d8D+P!i,ym#a2JƫQewsXKt&?#I7t|'i7pUeS_fzo Lg4482 #-$y5jn40-]Xǖ&+47 z8dr aCMm&i1+Z4wM޹̳Vi/o2Ef h4M,& MdYyL!ׇ>D.@dn:GkxКgiIZUVA^;ve!r^\4Z`ڻ}[^b}9RfP۠E) (ś)nR_QWRMլ EȀ>qјB7Qy ~څBQض9ƒ\( T휤C;G!??T 1Ӡk<y: 5~@ՙ89I(W =}@!3(H#($k1B!W)X DB^Ϧ)XQPi :c@EA߉5Q J45l)(qsv(a0~#oAs%.HۯJi+sgX뿡yx%#97v~G661miC#xg>d&i*-MyyAZ mFycߎ6]H>vк~;~cӚȫ0h'&=M|N@dF^iM%yHǴuZr?BC hjZ҈<|fXSHˢi?*&/iɻ 䞠J7 ]}P-~NhAG1v'_4X\}d 9.9\L΍)t?jS 9'g rC.[ȹlrtSg95!i)Z\Zl7rCN3ڐC=9Fn;8M.&I΃^Ka.N.ѫ&Ѿ9y9-#d׬liМ/dwߐu49޶"'DQkdwu״'d. Fw9^ds#lhU|f-Xf]1Yj4,ׁ8}"Mslli4 z9L9A{f}96 d_D4آ%T!iJ3*:w1*QbNkLfɼ&e͈ Ɋ$!w h"q)i82;Cf-hZ,[hLm6kQ4zWmE}fҰ4< ah]2IA8 O;`4tf La Nng@Cid]6 YM#ȑ[hTp;ƝJ9$TKK|iҒH20*&f!pMƯ/?hL4TƧ{D'$f|&wD^ ?̜Єv4!VƎI}" D4,@[*2{rPޗȺ=~:fa->DҸ4dvR(΍C%h*i{dNVE#j)YF!у¤YtQb}7]7n[ES9 49Mى&]Iiy* gv!48M%-*dymbI6GhDN6js<}YǓ]zfXGVgJz#rYUhD h4`.MLS%Д4UOSޠ~4eZRuMK dE4RYLtӔb 5|M~> 1" K B3ͥ٥5dBӌ3iV da hzKܭQԪMԐ4̒f/lCݡwipxVT,8Ư=ٜ5%';dp%-PJ&ާMʜ8r(9ɯȭ9{|˖pgZJ $d46+@nҪ/QcH^%1y@Eq=yRPD ):8ǹQnDCP~:kQrw*A(<(>{+)=%9- )e ڝ5S}EhwPM).Q]Q%Z7:|`Jԡز[tbd~f-xŔ6%;|sK3v쥔)>ś6wjkWQ5yәЁܡOm(y?OpnוBL"uDJ!"(´)Juc\ߑ%Q ϵ( {LHДcjF{wRM Bs(ȗӮs75,OO1KS\6ŵa>EyF)x \9(v{igM^(^5Ŕ;QbH;C)zĀP?$ЀFoR FPWc7锾%~F{HYg]iUsM?m>}wPJI'XShQȺCPّ=EAq7(¯.DaDDOdЎ "֑XCҚhm ns;#hkw!myGhqwZ}=-]6eihA5\9mDzЦ+%ؖD~2Ϛ$&Z'Z/z<猦uir7Z{+?VOkѪhZ9y/_NQɧpynF>iC}?-kMZ6y-->C+\-gr{$iL&ަ5h'#ZphͤpZcmK";m.ƶP[75xNi#iZGZC"Q4v(E3O% yM>J$+iʪ$>E1i?#K~ 4sZj=Uv4>Y^%ӂ4|.v 8؜hQ??w2~0X%RiiSH5mi_C:I"ϸB[o}~+uΤoCH-7Q׍bIIӹŒfJ[Z zGw*-z.b]ΥtjyZS kͲJ45̔vS/Qwj#:HRKń jNm|/R;r<}j׃lAm[S[s},uٜ:8&P|4[J%_fK>)9m.9Qri|yWJҖEXͩ$'J}$m/9vEudߠ+t Uɞ$1%$ImJ®DIbC'JviJ/gKJs%I ĝl)Yo$YKU_ҠGrrx^s/I|tMl>WŒc-HJK+ \1Urxɫ ÔߒwJ|\0Gsj2ڒN򲻍侫ޒoUk;Py@W dݟ,USVw,wϢm?;$Qॵ$G^NR}j(͟`C/ۑb%˟Bi<}؃Fk5vJ-]S;9^]FV/ qAoZD/ѲVH#7UWiuA[H U]^ikaJjn್hi&G^Jlx?:M,]6۳ :_ lX%%<=$Z6ϕ$Nt'̔=ҕ?J&~:Ir:=$Q%)Ji\|vN"o<#QD.OH*_MTΜ!̓Hn֮[>In)9qĭi0Y+#9Mrد$)UofInv(0*l Ԩ䔪Dद7̻%OLԬ*9PhɅ)dH*-$_$N'I4J2K.̒ے#9.TrzZ#ɕQ%W;y)1̼J=Ow S <씔ДY\MvZm;G-INu&?K$]KL|@"Z"=j&)XRz$9e+{d_:d7]MCɥOH妓d c%GTH.:fH"lER|%3KR[IN={-'v4~͈+ d{ @Q$f%֦Rcy,Yw1ԮM { %'T"V'=ӧcP*u?A-vvmMYWϩ_3L!wÙq4tn=4 B4X hX/J/툆sޡ! {!1rАА⊆=ɢDCCnh쉆аj7c0 A |34p&V_i8'YdI812DzXm85 G48jS#&Y#BPEW|P|c8JB$?JEɭ2Fl@YQ?HS 5頾ް, r^ @(@Qō[A!EF.l4MPfAk Av[0'('E.](ڊMrQ jAJ6jz&]^zzo @}~隷?opx)m?/AoWߵAywwQWe81 uuQp=ꆥnTnv6F]8v<.B u/Q"D57ꀺf;*w@8q q8- n␔p L_1QVe,j&8jţfT2TPE/Eu C ]vh+Ju7T xʺ{ꐏ*j>QkV ʗPi4P2UfžLFeTNAe=Tx5Tl{Z@oB(5Pd_(.b6( @1䇺A.s0(&bl#]!߻ >=ټ 0]Ț];zCz2W%H')!T7Qv !uzH  PxsE\(ϊdBP޸ٹPʺP~|87|* 6 7(|~7Aճ(}Pʴ,`!k [Ͽo=YG<9(˳F\m(]|&%<DJg+%8pcQ|JGJ9z(؝82ʬ^,>ʜ5 m %(;P̾zߖfBqf%!ϓ@!P+h+6"nE5'qUP+BCRO">7BlWEP~}0I { ʀP㶘&KQ*tG=9oQUu3wPkꫨ*Y9*iT9"ƀ{PZCLi0f Tw@PN8yڐq;BOgѯ uҟo z 2GH6!KX-A~: Gq/_(q5v@(go'Av*l >3.6Va3֢6)^hd7!!ƝgiYbl l1_]CDcٕ/K! v❪{Bn.eoy+D䊱fkBr$C-4bPG(F-bp3DŒPXѐgu{e:LtdU! K!3Yڢ {.ۈ1c)JYo+wQRh7mP&qb<{'o!v^* f(;B966|L1r d?!"]Ρb6b e0dN k1g-ev(=?e]7e-Jӆ,yJY~jKdxv"!=C[ў wSb7(Nzv%S!;xN Ǻ7AP\K%|!_+#un? Um;<i֫t ;DI%d! `.W4! !dU u] EXQG/A>b|/tD[.FU(Ŀ"5Q9eQEM։RHSBb}Tq"f@1@<Gr:T6끊W5D-UgQUNZoJ ŵP8vDe1Yr(:OaOBQg(uD苹2-GT [T~"'S?\S|U NPQ(Lϡ|/b8&]U(χro(vro;Ai'rv(/.DUT(͠\лP=EXoY=b4( mMQc|\PawKb1(5Mh|J2;z|TQn)&OuGI0mJP>Nsf\9Q1%*֏G "W&~Be(TPAe(o5D'r2FpTMGUVڲ=kP$ro|}CphjEmըXjDTkYp9ŧ״sE CM-D'fLQ-5P]5e1δyZT/݅-Puexҽ̬D/* CP1< G(/-އ*jDF(ElS-36*#E]ƨ-jm=pHC&⨨IT|ȑ?,FUqU"A_!o2HOYZpxW~A'J8CP{L5Q-oQ[$ʛo ˗~EIT냊P ߗ+3r5(Ě*F)ENk/d!Qs! yoG]y"? 2CӐw"UWBK1e!oB}m)#[4r DΡq@ky;9g G[bi_(ǐY<s"s0doB~]gHK^jHszp`p"}Ɓ.;'H]`W r`ߝwN{,ǞES7{z6aw'ŮZ]#*1)H1َ2$ad>r"i $뇤>HJ$*$NFs$.DHx &!JDZ+=epq/Z"Vb3ї!zlш'+l "@ I*DLĜ]l#lk"g;"X11jBÈGx]bHǏ$D|?0B= u'#xy}QP?DȌ#8 A"A@YtDH,/m] E%bw1 io@+cQ>q"vLu}})l7lm&2l-Y5#{- g&llj3>yihbC7XPM֜Ú"}is^«#{\ԯ68/8ҀG8ep. g"8el0o8MphԅpJX籇,~Qnpp ..;uxOW%d{Ms%pj9f׾N88s n8mSe9Îz̀My \_ۉΰ66`ۮ'l}+1gnةynfM38LЅ8E8u g%pfp^p'SxK'>

8 D8=GZ8<ׅC)9cاvw.λv`rsvopQÜ9_0L~s`N\uQ_= g~?Ta/~#M/≨8}yx<9.SNijW; e":".s\>~ .1p·b7 ί3\ D\nP} .E\ qV+ڳ*fpjb1>xJqwN4,O11qHZ86Z.u36k߫p5Z)뚇]*ed 6qH8.k+ޅhWð% 8Ǒ#-hx8SvpnV sp8UMp ҆8~,%papNñ 8 X|fr?`֮(YO a},37oX7X4E fcz}Z`@_F0y0 &`R8 &*0qU0{&&0q 3`<&ab&6w%ME{`)uqWo{oc0u#[%e3ȭ_0ZF8Bѷ(z8m}Oy>^ޭa(֠O5ax7 0@*AQ aР#`p< 2`>5 OAk]tka9`fa8 p am]>0xp{L;lzǗwhz}0kìaΎ0 0آOK8mW ㏡_mO~7%OH~t9;@ߧ#Lͻ?!C'^UK蝨ޙлEl^z =s|3t-/͠Bh虽]ޮ +ۣkG󠻭tg@w=EA NՇbnH!t{BwY:t~Ξ X:h[B{k(mA-hЊy/5 Zc7Ck|T+r6 ӡ]u?- tAgX*t@'=t WA :SNgOlǎK,^.CG7:FA;*{wRzMáweB.tʠk<:~B:~~:CYovsA{ڪcmzF=, ڳB{Qgh϶z-lh>[ͽ;9-4 24^Fwh6 N 4~OB+ODmMۧ-~k?uPz+1t.407ݡr8쬡uڒZh/uMvxϠ:WAh7@xOV@{ho4hodh>v kAWZkώBsKc4[Bs8h~= !޷f ǡYh6B+KS  mZ0Z3dO:fwЅ5t | f}M}Z h]>qVܩ3Ԡy?QPWf8]A}1] i 9PK RR^9mE|ʡYZKU̓6x>kQ cgou"7'&5@r,ξ j'FBjKjF0A5P]qQPujŵw1Y.Avh4Fhj@Ph5vv&,? 11}o`7 n5AY->~3}S|1-0>ab3 &mŀ0녁OaІ-[-9wŚW8tV Nor5}&\eCOppL&#ش%Xr=l+lls`? |R૨ >~ o{-Iv;q) E C\ဠm Fk'!e#:`W=;䉐V5!Ct|BF dfBuDP} !~$H‘ [` c)b kv S Rpl+'ʐDHԑx{!$~<$HJxH0 Ƀ#Y+#eQ.R %xRf@H;iH HY $!8?#~"y`_$|JqCː$#HGt$ ?'WXQVHtZqHH"a"{'!}%bGo@L%D+#e+D{(@Du؋+:"{@oGD#bkD; KatzՈs1fаGDYuMCRqbDxtAD)DT_FK "{AD.%|/ g:_FTň2G*D%G!D)7#D #" Q*SEԆ)Z(J?(3q-xDooADMCQK@XDnȝoiHhJFd4H>H3gDڎF3D:#rwD]ADFvAdL ij E@G3$ﺅܫH>ZIqHѳE+;$7 TC#LFH. 0lɭݐtIU凤H/m5NGd=$YDџ"i$wQ.;"Y#I_}zBH.BH\}D}8~9R.Roؽ +cOKسcvu^*= 4fa_Be~?f5MHu|hٙHsFA"=mE,d C"˗ ]=8vE*A8]ZjHq"22ŵBfTdGf2#2ô;2K$@m8^Yc1YUIctWlm?o= f ;CvPd[}2] 9F{35r#ͰD 4n#o;&Be䝞oר +89\gu|s~9s}rAΠPnANjr!.!b3ŧ#_?Pz qd (l6 J5E~ 3uuEs{ΌDn߉X8X!W,6Gz]<'䵊Fnro-ꋼض{|7IAWE~.^Pv N^&VBQ׳(**@Q85cP:ǧ;4n̬ J7'B:td!QE +bP=uCu5PxgCݨOCT 4Eej- Q%ꣾWt@m8_Ȕ8r/ǖ8~&'C8^JgRqV9@󸎳_pR\xu إ (g\Q)!Y]q6jޱ wLp_6xڎDchF6n܏ƠuxevٟѸ{AO<Ep_vpF܉x;+nc=Xx/ԧUxuf—nٹ-曷ۼ]`yG=wٙdUټy7Ywvnwtμ{zugyw/1ocy?>-Gj7MƟ>2rVKW|ħˇ1d"ޗxWT U^{Rgݺ ['x9.{ 3|pA+\c 5ŸP%SgŶ6. ?f=zE|qz .:.ŭq1`1.Zip(.ۏ x%kn|(xHYXnqmpqQ+\(bf..v p%8^lwm=Ոso.\" +vgC.8k _qnp( AgO⌴FFü98S g$z DC:4hÙI8j"Li™8s~?3:qzXqjN5éM8u]S'8| N,7Wq)״DZߛp|Aoiy8nNMiSWc2ڀwo([V [ħ8'TKpj\Tm[9ڨ}UVjTMy_cP,ZG&TBe%*wnDl?Q* 90~r[/>bLuʫ=J6(uzA-P yJ12'rM!vSlpH?^z>C*sH e_lCٳ(/CxlߐilHB " wePr0(G(G(0 ;r\ E"(N|tգ\ą@W(?@J.P)jH[vEi.J΄>(xҪŐ}٢InٗϟO|^Z6lH [#PrJJ4tPJ&EvQ Eb\M̝'PveL!5ewF< e mmK!m+]Ro-H{VRz=6{OB.,/ k b`"dw:H_wtNvCn8!orb*[N?2-ul2 P8(˅t]IP/KDN0%8TM+QtJƗ.(9(Wv(eP%osP*لQ`_P.C y@Yh ld͐fv0菲 ]i8&FNk,F$d!OoSXu /O/{&C>=>A1{ ]c su/ }ScE<&ޅ"lFBf52'7τ\(Ca -(;tľP !;ošP1O;wF(APŞb@ӡp±$wD7bEKBe"TAե"Td⺸W9T,׼~W&(])]|?TrH @$ϟVc9d,X䓗CNrU8Gzi5šla>rS(DY^}|5;Pe-P^|Hw1+#~B.#r'(1 eo7j!m[wHTs#&_X$I(e/[=uӊ1#,br /D12o[gH?tls3!V GAvEw 5w(d sYlx$FWI!됻'B޾Hm!{-OA6NaTLҧO͇D=A+N?bm2ʜx H'~Ci(ӊK򜸷dGEE|#!SWܲ"6Et󖈕VڊP~ (ʃQ/?P QW s6_wC4Gz5TĜrt(D1;/ %7>A .Ƴ/PŚoX('qɭ|گe5Pr"Ʈu^(>=bY(ns=CxFh(޼AP1GL-P.1C(DXlۊZ)*Q1O >P MYb'[O,[k /5ϒ'ZA-v9#-m?C -Ϋ\ 1}ʠ"Ǡܻ嚫D/J9BV rv_9ͅ찘fyckuA&Qy(941/sG(5?RMo.q%J:*ǻ}b#ڧ"17qN:cQ%{ELQԵŢ=@(]`b]{"#(ifQI%Qpm EY(4ȫj")O}Yز o#f22]9~2^@Kd݇ d;H#Sq`AGd-~죋39RZOEܻVd}ـߑRȊE&27tC26GFpgV6 }>#-k8fBpFp`OG"ռo`, _΅wۍ+k""ME(D WNW *El !+".FJDMc}iw*Ǻ~1kcaCx[Ob[?UXi퍕$tہqXcw +Z£gbYtn,qwp7|E/xQ,EuQXxc ^[(3LcXPm1?{]|xZp[ n*1Qm඾nIqp3y7e9ai&\våNOl tm8 #28Ucpx> г'5s up}Z_,8F,ߙp|bv|gӋb(\I-탓 N'te$4NZi28Ӯp8u᤼{_1"{| pG:XǍ.=_Q [1DB73d8m8܅Cd*vC8C&"D0W\&~nn9i9K0r y=} '6vK'|˂Mcv5?f{ X{Y`ֺ5Db\ f5?|/X7*Xt,em >)g؛f>쏏mGb[vo d `? ??\c`Űvaagva7xQŜ376Sw8lf&6`{7?C6vqgqsj_Ϳ p c6'sNXys`7v7E]'ޫEaßvI =^d8yg#p.Y շR _lg?pۚù#U'\G{V!?iQOx{{σ`WdQTþnxw` EpGM1ql.dppewp@/#ؿ^"f:5Ns7l2ظ%[FXލYbX˛ay`8,.kA1t(ouǴ6n)7 1e:&_ɓ#1%&Mׇy 4TA^ĢLhE0a ?؈-$Y~,F`kmvbԆmVȋZ9$#VW`ygIvby7c# Cfc0x- y u  0pf }B0а+L.T~{4L=6 60S;LuCg P<ŀ~sDoGѿIn0w`Er][>G`\Y;9΂ FI&0ڹ Fa)FcHw?=;~i?j,|>ѧ1z/GC~}F_B />v;. gDðzDVv0?`ئ/ a\u{`s.ЏzA/ MӃn@%t絀M3Nք΍p,񆎦?Q{ P[h +q@7h|hoj m9c:]'t /@ltjA tޮλ,|$ :FB :W:BL]-{t>@O9t/Am:݀ЕLЩ hyAǪ t[ChvFhmo6!=fE|hx1[ly9=@{( @\|?uK݇JV?DwJL:T7T$_b*3s5*[_@wTNCoؾ P *VPEPe[>hhP4,3a}ag ])-3[{B(-B~-o{˂}kd6C%Cj446FP{ 5PA5WAP44\O@s߭P߹QOz@Ԟqrw4OA3e4A(ހSc(+P aPZPi/OEMzPwVA}Z4{%b>4^\f+@˵VЬ<д М9C킧xk6r fw{ P/LOBH9zqX#owCD_= D[f{ 'Ż аx sShzT^56 6P9 *qEL4@v=Py-J+TLC2T6ʢ:XlJ:yі1MZSWlڙPky"zBaT#O"6*Zub%TfWA%Iԧ*vPYi-Y';3 P,jO?CUԖ΁] зPk̻-,mܡc]5Gn@kmHpbDYw@Q\C02wS 7RKd7sm€0@%Iam %:# a%_0|`6 #8`>ƴ)˜ #킱>b5&<4YA?LdQ$lGt&7T|L3ô1?f|c`91CL7Sav-Lk`tC13w 8wT,&=EK={o``1u>,2~ªXEU@GX 䋘rf'-=X˙m`+waywSa=c֣Z>6o0g| 5|8C8NǸb ƷpN$֕NlQpy lmHh+ [ēiH=I=drIc5H ׎"!#f ec@UU9%"VF;{w.!z3r'eN ك"{ b3DP "F#h"|@WoGwڀ 78Vj.uAZF\Dh"bDOq(D$LGr("DE<2BJ6"5C]Dz"2@HD 2 @s 9; 0-sAEDܻDHDʙ蓆v8DD쟀v&!tlB-\ 0߀̓%"#bDhuD䂈;ȘQW@UDL7@DDtFx5 /W!RwXȾA<{o ]w!r!DlVDNR r^D}g h<"!VD}GTD}pBt DGLDӬ5b-@LduB̽y{"vmQ81B+OZ![?Jш)àcH(Av '[#Ѽ%H놤H;9|G$,ɫW ye.FwoȐtb9MHq%w$}XHS#Is>@[H-H|  IWILGRIyun /$Zi$;u}S_ː2t RC]}kk%vy`l6^݋aسv dN! `_ }a_[{z]F!U=RNp"nQ9Hw H`)iMo? i%[V=Hc>}%(n-AH;͐\!g2 #k2*#s\d|PAǥLEd̠v"Hd~FȶȲۆ,7doC(7L!M[dFVcF +{.{[#{!wBCȢRd"K}![y ; u8rvCn5{'N"wY-<u@rF#w:4 ',9̐WyQ3x0 Atd'Z!d'A 9#j:rڊ|WB~X,C(_C2_.A%]9 %䚮@T{CyDTK5W wdWDgBkJ.ۇܓȋ" 2?u uF#Y{^A~1ȯL@8X0>CQBQ(x鍂Q7 B!d.Cic J~O@A(-KDMgoWgK(O|r(d='$m_<Q{Cߨ(6GxU3P5QE8 .r4wۃ{p}#lc-pbn98N,DS-;D{nqg\.lPή݀wqVk6-g pI\Nƥpys7\+fj \ č3qc[/-U|X[rq 25ŝmn?fU]ĝ7-qx6uƃxAK4]hl 1` <z~=nƋb@=ƁP_v%yh3q 4θ,q{k< q=ăSx0AOxp~Gћ1xwߝO dߝ967Ì^N ebtYɝ^;-L{}2̮m =ܰ+jLQ+jEFnFoerrHjdUW۩t㣽Ezh~w^^xeX76ZikX}g4;֤@jSp*ѯ bg٨| wӬTϭ+R(m?J-V^yx 0=}luחKnZ-h{߲}s-nګʚ(0Qm:s`oN{*:^ӕw:+^YZ8s9^NЁVG{%~]ӡ^ZYݬي]CC'Vb -noZnY?9` Kl9ذrWӓm2iEnHq W=L4gFGziΜ -n.%͔Jݔ[CG4TҢd+*d~]:L}l=z!֩yn=C7[qt%Y&:ư9=J+*n޻Ve_]ԕ>ZuWkV -[ N>Pg|E5VieNG.jly$bGޕK\}R GG7 eBlȯYL^vtP;/DS})9`KG;ZvRjt~݇u\no]UnqZaiY <U3錒zmQDŸ\6S4~v3}D?] /]өMV):b!gW顽)Qo9%7*0ר'JbΌLҚ6Z)Fakju_-v{&0:F`sJOϓW{I^c|a%=y}g]띧c7ZWzgyPf7+^ٌn3|{~wUOSh 6I;_㍆ֺQ'kw¾.{o]92B>lX)O_E~*eYQ@I bd7bǀb<f0YdYAEEQ }p8z}5{!LyLwZ@&Es]uthpؓa~eT/̈{sƠ%gΨ͡uf4џQUӛgosV14Ԛk1J#1>#6->GKbgʵfiF-Fn}q#Og4i#_~W8I_ԧFcN*2/{ ;} Z"ve }܅~+Oь6+t#Y>4$02*t)]"zǏXihx59}{͈VQqGal 2#=kf̈V/# #}ϞQg2=#[2=|t.-k'3:"Fk.>3.јM=flc yicS9ctԷp8:ҋ1#ii`,O4t]a)=WeLgnƹ>=3bcWL/ghUz c*c"謺 ޑ/ U`/yLF]ubsF͒( g5~-uiu63\)Ǹywn)ToO̢!+h%}jgZxv2cyBytNDža2k~5Ϥ- TUf)5!bg @Bh>KAP#e rފ+6vE%0UQ)O;9ϣ {#o=5RpTeIm)Uo[`?K USIlO/E~X>!НCr]k_ePڡg *o{Ơ#04ן5TF)O:lw(! tx1sc)s%XSB# sqh:  nCV6Μfm)7'پ`dZ`$~E׻hj_/{PW~gId- אRN?gah~ވ.Gbv/ͶɿL<\Gm-./6Hc͖X;,e%5k馮|+ᓟ,C= $ʖuKť^@5D9;RV?6C-}=gl]B&^ kWπO{ / E?{ W&χu!dh7H#$nމ:<1%FArKF]At{I_9߯1|X 5S9k4tBrw#V< >Lsr*Hȶ׵e1|/Q,}-Z [Wp23pV[9q~ c5]"gjqx |KbP|IB6V9 qԹ+Gc7o?kc&h˕ AC6iPFВ? JkywzuySm=@E*BrQ[vPyw-5–#݇jnD+4A_k#6)s[Fkk I|Z! 6846R ٜ xl;D[ E41  ^ ^+XtƏM, e[Cy}L5b  ZzD.@dFc v[1dp[h<6zq.=1?0wwpHdέ=iaa A,׵y]@h= dǗ"Ol{]:ǮQstAOړmbjRD,̂whJ@\5T<:#d@V#[6;Sp}=\wUs%_m ds-z~Bhe!ZH+\>P3qn̪hf8N b!sE>FFCr0U qgS4u4fQ~# /ޞ۶1]Y7bv_űnh*Ʋ5VՀncc[W[Z<&цd;D}$ ZȻxQ,<7fVeN. 2/ƃ5@t=: Oa>GWФ bwo $6 }P;"r{BvA? hf!nK:U!t쾇~_ H7rb&Wߚئ`U:Wa븥ŦA70> RR,P;H^ c^L\spgoM%7y=.Ȕ{<+̂ q~3l=Ld)-ߎٽ5{MM+QtYt X9:{bb_!9AR9>%G?@ď?Q+rq'2,}2<]!>VbVb\8=$3<QPfnc4BbA̻E&쫚F 4E9q+vˣ6{3,˹ Ura+TPͰsT_T|T\=UH) wpD#7D@kpgNDh [!5n6}:BxU ^G6C+Awޱv:A>^rvE?>ްcXr3}ؑYQw!]j/n ulW}w{bn>9Ԯ}(el t(Ng |sC%ɿ[[N}a|1MJA]Շخ|o8(gZ8zE=B:Hdʗ"GB9/@xA;mld "VO"s"L%N@d6O>QWGYk4 i?S>u1!#iKRoz&2Bf>d({E0WԬV ^%ٞ*ʂX2;^ 9i8 1{g^  7o\Pl$1+qb a8dB%/#Z&:'*UssL33p26BKh'7gv<%U2qKhBԭh;Q]epvإ.A9JOG(9 n=ȌA ^3\tb=?8^}/SpR:壳9R9pd l1u%p)= 7\4:n7/8o~ MAޫ T#EA=h)p8̏ 症w.S93Z]F hwkΛK1t&UХ)w=0H! 杤i0uj'EQZ]_z<˶WR۵R/ĉӇh T\E 2hL=hP kJa=1cV;[1距&LWe)"H]OJ3nR4sY_N]XOj-P@ uviFv{zC~ ݳQMӃýt9Ve Rق:# 58TμsAU}\Y2E)tcL7RYi$c.2V͵&+'HoRpDCcgrx}K=jZr; xCN݃5` ܋aꓐw@-K^'w&%C\I =uY}ј@tJa`X=ث/'d1ofmq 6M%߫c>@ZoHy ad̴]0aL~4 aa ;CGAfUCAoHՉ!o~;- \a(PN^C7rj;j c @!V-|AYLC+r%3x#a<y|;| SK+pY/ڃb!DR;@7M$g}m䍗9+[nJNLMnaׅsuYёL%͠Yb{6$#GWFIB:,Hk =tșQI!ȍ ":3$d)#{Ĥ̱P]<&RDԹ2{H=Ȝ`~ALڗ$yV+w7h\) ( n H+ |s6ӷ-GBy\?}O7|n-qiV'TL&U: &9hdv#zd=: b'U02ƫ!U 4h|%&•}M >H$ϗ|Mv/#gDOkI[ H)HFjȜrY60r Uat ;E$u)bZeE^~5ۜ8!&EsX׈Gn0M|(\Kξ wrb-\!yO*$AtFtmIN$H~I%IÜG/I^H}~%>$))}JIE8^kdil@V #Kgh@נ<؟@݉G/t/!}W#AOߒ(#Ei2,HVHIADo y6X[6M^B{&FI|k,Me+k7ݟIģb4 lo S+)H"WIy'z/N'^IjD/$NRtsD,Y6!Imz ʓkNڇDq I1q")ɛaɛCqDbyw0w`Q](RHk4 Fg,5`bATlԭ.JbGQ)`ADchԿ}oy"woΝ33g=9 .:pѩ uNuA0 4™X;V!h>GN?\:~?>\^CYsi9X>f͡U% əWG14k kO1Tswx{)XLv7zlc43\k /BvhK2{-EdN$pLxJ H kFgV~O&74TfN5o*6K5bڐp:.FpP:{*ci1|QKTJ[g9Rll;"T::$H@Rv]D}<q4NGn&e6NHmcԪ hKx7Z4{ q%ݧn]kF™AeJE/7[k}j)zVLq=޴xiߘb .XR+t촴/pBaTtů>BeӾ>QԗT>˱5.I'mb*YIxC.fQB_$ޞP;PFhƓ(A?J̚ F@S Q' @֥4{g;<=3Yş A4/c0|{E :Dqɴ 5Y`FZ`< kz*ޯbĚs ɜhKTt[$ @RLHn1O- yu]y~liMzmіd[#2={w?.r^h=NԬskY|Ck+BwLEȆI_W GhS^?mer>Ɨ'OiS@~K6zWv3>xZ6!俢-+wZ gl"u?=sCM bvkI'9Bk(iV̟1AP cϨq k]ߠiI83qUh Fn3Ls}^ .h9!hf/{p:*n._@XE |Pi#͟cC0xעZ:1@|CAc&W d3bcA9GPͼf Gz?b;^,}HիG[]&  7 c@zU3ZO7h1t 1uWc8Oe4 ;~ vbޙFN5;Gz,K9R}N5۸Z8y~b pi!:d%~9!ȹu$+T)HCB@d ,A\}> _؍D {ۻp'yw6$ޱ +dk?ɓ||ɮm<=ǧEhY^e9[?\.ZVTT=he_UZ |O |ROb#57ǵ]kȶwlsP ~n۵SZbi&MY~Cg?]+ O`dzMSǖ39W2Pׯ )Aʧ>^t])B!Ť R RjEO,u^ڈ=ҊoTy,_ƒ{> 4,AH1y )t(K{̅ͻ`8 9lvScbwؽggfBR ymE VC0 a㝄/E74md&9z$i܇||Lؕ x# P}.f]^s.wwsÃ\2ˁ7b^i޺Y 0{zGBܓQדVo&{_͕hl>#@lj1%f}2ﵱ13Wv6o ٘giޔRy}U .θ~Wx[ ~"?>u?G [u% V/*?F㫔,:!VۓC!ݙdԊS[V6_=&E*t9ZQJ y[$ۺao=a6ohg /=Y?K_!<++xgߧ(r$_*qȫ Zg{P>FcZM۳d KCLf6˵o)YF?(M|UC:g/:7iiZ>Rh iQbxEh>o|vk\Rg8rؑ!7g .s5lO{~׺|ogZ{+Vȧ  l] 9? RM O9"AjE}+^.\}䶒kXf@pax+řp(|KpX-eo~FL E&vPWc G@W-/aيX2;nS`0R0%6yL)tZ9ZyଞzAUηm_y'8W4gO m 7AMPsEPž_>pe%=ds$ <;O5/\FH#T_=q 7¥cꜘe| HE{>^|G]QV{%"Mx#8BJ_?K;%[PV/XC4̕t Ήp+S;p*z|݈G'?hPgi[!یڧ uθHܐ|]Hz EcW.QY>>,}nPG.xF0nx/_Q5\J P }C<k|lBkF>Se$]I.X.MΎ[iY`\]޳­yEw=Wsk9q|p3p\Yŭyӏ[_[UOpPIDQ33څb &bݝ-!  awyp{3;sWl )ރj ]av啼x- xOLJ~ƿr:;:98``k3y=xR <@w.Wu xqE7Mɾ=aC/t 푞нzc|Лx6Ro__tKG'*]ݯ=z~Зnzb6ӽ'ؠ2K7nY=ma/"t?Y tX:[*_u>)}u 3LkxB\^rx'.#W?Kh=YWhjN]Qkn{Fw.]tg֕]ş<z>ݎ:QT!5GTDԠDmꨧ+is Υh9 _D?Jh6jˢgA3ixBJ+yS oU!ot8Ik9zjLxtFLQi3uRoT5]zH:pZm㨣$vу>n݄@jIGuLijtGoQ=|8Z5KquJLfKzDj 8zw2TN>EVmy{=JFP+MBl걸LOU8z+P&?Ե?^yL/bNLGw{P}z;Ji@~ &L_ yQzQOM{݋w҃#v-Z|_S;i͡N QoW =QsM*۲ZE8C/VKO*NwM+y $JڛYZ&=*Q zA]J/=_@-Qi_R}**M1* RvgW?P7V2q*>dIxz䩩'̓)׺r;)NX JJCs2ͷS3 !}70bFQ҈&%PG/%@Iߙ҇OQbʩ5(qD?RgqJToC)))x2ݞH!G),B^Q n$*<&Kɧ[[c yOr!^O^9 ^A]hE^em?Ӑ|6֒7Qe "|;%@(Xd.=OÒ䑯2 ߮&E们w7<[0u%Ar_(D%Jb(`qti:g. OQ)n%H6,wCJ~0ىQĥeBqr)JdS( q "L ( m_'|@ G(v@bPd} A *QjvJ_D1i#"HѻL=CS:yXGaH1(wŹxQߗJ "A:a IQJϓ):=")5-5"ZM Fw(q?{Aj}>uſgR<E;iS)RP"zQ-(ZEQG} B(My~)E_46A1azPBk),%]gJpXFSΗG ci>%KP MX<͏Jo_E2~&M)֗)IٓR?niQJJ쿖dZ(^QМH t)C6Py}FQʟ\DӏQ%Q@>Sjʐ.+-;3 mEROjPxGQW(%'Q^"ϏqdJ\J[(lKQ9)ũܦ(zEQ4(K(k E6?<RϴKq)j7ŨV I?N7Ȑٺ"ng %VSr%nK>)>'9d5KmK%\2Y %΀hKnɴ<-]qNe=+I. a.6f s}IQD[֔&.Iu6ˍ"aǬoF"Kob5\Ho#oD88O{Ak/O\-$t4%L~GPy V &H<~lZ3V/Ӳ4#IӬ;Ɩ4,i=kY;fVќw[ia0ʒTRaFj}ie-' &%^ )|$Eg6јD^EryxGT!T{$?I^a3d%q\ݻdsh90Zܣ1itoUs>Ы $Fm'ON4hL6_Ce=i?UoaI}qzS|>߹£8Z q78pE\>=g[Kv[Moy .]W]F':cĶY0XK]CfMay;޹ gccrcxmXVcO=VcY6,1sâX\ُŘo˜Incrt1q9`JQ6&ʘ 11FgM NbÏ{`T_'$nhcBadArs0B| F.A1Cã1x8J=(tcr aPQ0] zym4TYo1XmO3?0So|,}ۏbXUw4ÂSXw)IŒgxa<-5V-Vcil܀?aO|uM}{o)9w _ #wiW/ۈ/`O>Ѓ} %fyplŽoq!eԶb_xi#Mbx|m'>XyxOd`c1,?ℕaX~BWsiv)EhUׂ&'x"[x ģs_)yx)I^x~AahijR7ڼ݋.^+m'w4Ch5"xk vJ G׮%]ƠGY,^/ }GrHߧA#tXy1(Cc`t:x s =U* [ax1b*&oy9FԎ1Nw &bF4bemv E {x}^6([~7cut C6]$#t;.Eh}Jߠw٫vhސ{hٌ7TաhnDx*nCj-i#kf[?.?5bh<zkw WQt~]D9ktzwBC+zĽFϛgFz(g$tAW\p@Kz]@c)]D;9zl+D t>Wrѣ<g*NZ#Z.3Yal1A;~tCt(Șճx]g?^{ 2bI@h -b_|k=|>nU)M<7Mihv^8oh3~4ϧ;x ?˃*hRMU7A ux=$W<V\-c!^u\WMkAtY/{w<M ڲ4LËh~wMğϲIC!,39'J{>~|J;/<)^'i}ؠI*HQVXꮙz+$o~0r)E6SJ*D^R\)טR(%ɐR5)!$R%YeK UePz9fPqZ{?QIj??LErcz2zcq> r4bgޡ~yOzE k<ފz8 RoY'={J/9Z E}Qg URTHuZ*zvz'o)zQcBݩNX'(^<-W4TL^illG\ӷMgI}ODyBSfFm0~5Yџ<ۖC&а;3B]zfP$z^ <zy9AbJ_ G?4 9;DӠ4qnqM4*F&ߢwK#0}hp}D?/)4'h( EC4B#C&z4| қnno48O#y4གsƠKhk:lWOSFDIQdutuLԥD]jN =}ؗv>VыD3S&f?LqNG;RKYO5u)_y)Sg4ԗ4^(N B^9+iճѡ3B'c~xuNw|_^ZQ. j״7'7{zb PW,=@} WB=ׇ6gꞽR'RƳ2K7Rp n/ ; t鐧WrpU'hr!2r&S!;^?90o[A6: V|LJRC0.vY@!t[=$CN_<:KdBdtY&kH?X":= 7?iom!K>Z=⽏)uq.,N12&Vz&"w!{bI4jhN1=F' ˇzd懯ncUt#ͳu<ж5བSXS1*1UVmjjشnޯ/m v]Ď{D%`&>4`6>ه-9Gơ(7kbIl99틅F|url+Tp~7<+m;dKV?Jǚ{˰gy?|Q6x&^Kc`+wjZ -*kƎZ+S)ªgXq^ˣaa,IJ Xfe3z oRw-,W+ҷױD`s!V/چUX.ފum!4\Q5儭l<GF/4|]9:> vՍ8x~?ǡ) 5JnpRn$Dif %oO4*Eclג|NIB$-B4~xw ;^bwie4n{ha4m뿁MY@b7dXIhJ~#4P$.!}7ESUMHYFǒ$9K< $ف$'*I7z](@/H.A䓂I6E*RESSIZ^%Q$NR@1$TU/#FdڒˤK#6$6&yPRzJHI}"IL%)<>G k$D A$Mc†ZRHv#7Iqi ),xDSݬI6g*=N&ϧHa H2:q*yK̒01񥩅 i5YJ2Uu-Ib.r*2$W5a6TO$gpds=HoMrjHA֊\$ e!dudǘ$}I*4.5nmB9$4$<$IkI!iSg]x-IO2-Hh1IKʓ̅$}&),-bE2Y$chLTH: h&i]$cd~ftII]HQ@RI$_HRKHe9E~7Ii4eIg0F!HنӽIfos:IV4e$5d_$_}GH֗wH;Mu_$$nGSIhzHlɮ!YU"JI6N\A$"dm&_$m$Ad lIրHI+4#8Ar$З?E$s^$SnO_9I~LҪ>nRv-⯣ZI"Y^ArJIMm>doݼG"$[g4 RPv e5IߢKKxEI)4O I!;7%_2_&$Ȗ b󗤲)_BH*RDb᤺=TnL!Y?H-z>JdѴҬQ"6j`O+ZIø5jURFj7?﷤8BJ*HĂTz"H OʪHeDSiy~^|QR8_$HxJ~C~"R6y"/+Hr"M#(R+?Ij_V Rn&9Rj!ˤb ~FjKHҨ~⤵{H3h?gM HM~:ǿfHP>4Ai+IL8xVzfJiF ͜0fYMZhv,ҾI7VV ь14=ŸѕԾi>3OJӷw΁zeIj(MSԤΐƬ=4m zF3Hm6ɪA_L7|f4kA2SvlD"@ZͮA51&4k;\h U}Ḅ߾4[kZVF-6Nu,}"M!LvM=1I,LCZ:NtQRfHg&U:p\'Ub?&OS9Zƅ'DNQ[Y+oQr\KHNb+&}mr5K"9sD͋<#1#?7yMH%Lu&j"y>L! QLI/ť,CqEq) _F!O(zϖoT}f#e|9@Q.PԈE )a\Jp2ፉΛup3oO[7nn Oۺ\!oA ǼYMN_ffy+O ׈wV+'`eoew(~>UDuď;\kt?S9+9[/r(Ϸzr7~o~To:|PvKﺒa|`G^#ۄ4F~n?lo_mH? bFIbʃ4eMHd5Zs9ju҄f[R~݅I_ E(V'Kt*,|ً._0\L nňj yc.Aᘞ2s }0[y1ET<%-̜섞y0>`V 3m0/Ouu}k[4]Āԙ[Tcf8:+1e Z O7dqLE+%1Z.9^u+ݽK;aT;PE#,0a &@%eh0+~v觹s`\ɝ`zot\_)ˏ[3]nT7b\Ĩ*)Q[>G_%M}. hiU6âJ);fyЊ.1$WȑC!^߄.[v}a"*c@nLzB1lI8iڟ{q?1vTo) m.IwF yo%|߀YCޝ 9I\}{40 /Ř.%cm]z}G/B'4!F7Jb}m=COGs 18h| V/_Z=B.X vDg,JXuw[^D^ϯUv`d߿=lcHŀd^)iol+:(ӫ[ wO/Yz ]Wa1 #NC*ct򟀑+vZL;z O;?[X߹M h"z~~?0:b5! L]̅!y6zEcޚv5oV^$ma'&L_ä3 ['kY=[0^ mY>o0Z A&m:"܍=.c>}1$> ]_ۿ~Qe0'ύC 3COd o(%"Ɛy8nVbZw)mڊя1qt5c?眓amv 8cɹu^/ mϮCXQ byw 8pR3!=xK m@yP1\вN m5d2zGaʹ=Ӂ*)ÖjywƗ`@BzDVָV^2踢D2tECЍ.a  ~%TUaFgݭhcɏ +T{; }nW9G_e~ oȢD_X7fӮY#Tbf$FG.DAt:k1/ѻ/:0AK~-pnaru{Z 1 ϯ7#`ʌ 1etUWBoJ p/Ed{t܎0$i4F=q-{^I/]rT1'UthQD7h"0y jchdYb# 4Ewr0~x & Lx&Y'o2sg}0f\Xi0yk6=xOfL= ʙxm 4}Xf)bW c"L~×X{~d0b07?.v1<1zEap{J3zHhSΣi z`؆ZYփ^o:Eoб#z@_b썖I|Fs>SuK :<݉ Ɠ2Z]LjzI#&}aФ_CI#.F9LkKыkfl<}C'=34 yѲ1zA%^{*j"Fۏ[bĄ8LYzC/F ȍcOLNct vAs=\߃/`@ ܀Qkgah=d컋W>⡺uU ܌_Ʀz.>~a 4P\L^"P2.틓E.Wn_ʩqUocpV ND6x}r%N?'sj-jB p\J #'5CgFE|If(b%;z6 ߑU^2WEZxq/['/0wa8V26@ԃ& ?r8zoN6fX|b?;L{p1HwI /5[X,8O[-$`ϻ1^DCΉ 9nȔ3pNͱn` 3>mj@;AsL| hXP1-P jN0e,ԯz߬`n96a#>Qs`ܠGX(㯕XVZTKr7t/"`*u|37>ܧ 6*zw% WlSe,}溯pO6ʀתJicTd W1{0ϕzEG~P5vr9q \l.Șk(Š+ƿf7## 3=Aa 0~>k4/XUX ~빯ZK@S_{w.9RaBٚ[hԻz<-v\im`A=@Dހ9qfRCX[E@5@kU5}1[. ?4pۢt.Xc0W^ZƁ}Tl48ff7,ۑ°cZptq{#nl> s+qSA`k}"ؙ7*ge r.@dyTV: 㚚`" +CA%1 꺟`XOa[{`jSwyGEF\A3 lZv:r*p@cs 7q[NlEg3Ly%=`j aצ\V&m|[6 '{@6n- `NiLnnr_܃+.u P{`bť71eׅ}\G.|skj\˙kV-~j,̹ iidkj^Ad})p'W2! Xz¤-\(<&igf \10Z\7ȃ| _yq,`Uל $}憍:At)@#gȕܛ˒Vի <#܋Ik/ |n(\)e! `}oI;$wKPY ׵Oi \ˆu kr{d'^0j{ B?roJԸ0!) tOq8Bt1 6aJ5kU]̅VpᯋF.ow)xy/\HnεՆ=]õݙp\j/q:`JGRÙJ9Y,כs6*2+_+=JH*z38 9׫<.gjUpSu9n1Wr{̹/k&B_>w ֺ5Vz=bWqU.m^L.bՒ ;׶p\˹\4=Xƽ\Ž>7Z~!Z|G.,3cSWɽHM宭BC<ý?y5;*R^;b\.c:u>7gל]}32SgssV3y,g=_ν|phw|\rA.Iٮ&:kqm \EN %\Luw.3%%|=kL;-lO抜UH$rg6w lK V.צM\z];>qiG^ @ZK;qO'è\_{vq?~kuL7sݛ/0~%\X5WAT^̽υOI&qa5q7j L ⾙?pY %` w'8S}Bp 0v;o-0g7x; MzxMpqoy0\ >-`%OjPm^(1Tyzw@4JxfI|,<] 9Y_n-h)i ]&CZdTȪڐ;FͦrGRAL= F4NCtdv(b6W_ 4kyB%Hr{ j?hXy&v-8pYGUBahhï`dW$-s MH\;q{·!"kwBْ9H xWA~׀a?MRJ&CQedU|_"]alՅx/Sӵ] {!f01[Z4 G롭rD!}8L9H2:G! tVLdA;>R=,j\ _6= 8Z?hAE8ԢInTn;O]WCdz4tZ@\;pӿ 7Cj1n>Dpg?:t0vM Pej nIAq8?VngBE(6eAmGk .xօgo pO^ e_=\+2j6-;cE NtKkCg}KF#S E\@fVԔ :p bobhlR9lMs뵇vC**A'c!"r|CX#ePQ5]ZboCah SJ7U @jcoխ4AAa3;{= YЙrEy5מk3Bc_t*VC;W}js&/ CqhqI><9`1 <6{ür4 FD< 8 1JmU @P-3|$g<ҎSc{py~uZ| … 4WBt7x^%r:r[OK!L @,9S TksAoC`%~_yܤ+wxɇp8,o)` VȘ5ZV-#mVpUs􋡰6(k!4/t$_b`׼K&`[IP&Ν+&}m^/ Om[6Am Ph +Ӹ᫹O>h7 o~-% l5nɁkP8(pO\Lj8Wf=z S]5u$?Px… >; CV 0k ґ%Lnkf;)j[0rKYʥs59Ex;[2w{6gaEܛOOpAq\y~6WS}&Zj#9fA;E0OWHsOkx?^y}rms=Kss aN7ؽ˒ybq~0l`:/}7BW{r֥p[uBXvQLO!MH,/C GƁ,r^fx̟EAz0_sƿe/eG4þkj8]upVi3)() g.}Hqcs a]08,6bT&Ǟ"Zz"@uJgP; +!yR?!jDX%!+ ,'4a~. λWB?6 RJx& _ %`cv;߃  N7m}h"q6^,&Ru~ld8Ehp8>1!l }n H/rP)P 9'+נtRj ݽkomPX %`%T!cn |kF"pP Cv78 v`˗gY+<'FIrp 8M9/`+uɟ l ߯%cd1탔r.@E SSpW(Yb? }k$@:]_ WoBT5j5pXrB~ƪp,` A~>lAX ׀`;?U .>`) Swwkp=HR0>\y:΃X3œ@-YV:p o̾spSΕ.ɰfc~Wƃ{v8L5`M/cE|`D8w\aVc(䧿۝zN $ ހ^a!z|Ԇ, 1M9Vփ;kvi=ps9p: +Vs0{ t8/&E"A,KAʖ:pvu Tc|`1|ZB\w¹UPk wm {S8 vBv0c}<5tJ[PH&plah}0p`$N^`;6iE`1 ~6s Eհ68xB"v.@N!lm-> [*8e0 :g|kؿ5Y詳a"AuL `<|{j%'||NmS|KTf; eCD5W {УR AQ\z !$󾀯K5. րI1=OOåLj=w MJp3|"4y<Ajgw8 Qv.h Y ھB┛`4@jp`^4\mW+U{=8y X~@Lj?_˅\q)d_Ц?=P|g>5HGEP)F@fCswhKJ}(~^?QP}iTUPct'MمឯfnTtn( h5.jώtPCK1F q?W.EW=:MW@|{t1iz3}GcvWŌ=#b% V׬FՇ8 {]_ Lu/Ĩ?o-ꌘ.YX|v>" 4dWlĿgI$;$a?4QD3hA6]#$PL4ZeiO;mIEu ]yI3gL) 8I H7̧$̄ޖ&:$r4`蒬V-#Wh1I 7X‚&+"st%i\k.$aSB/y!4)6h;>^J%HxՋtxU!A$yDw.:~/>X[{Yal-$xTbį8y*Պ7kELXnւ70pV: A:M̐͹(^W귅u{5I"rn8vL7ln[v*9kw%HW7{:uV*JZλD)i8|ӊ;uQz `rlɽ_Gm=\H}l͓}|[/cj[llpE^WaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawPRieA\4P޷1`$I@AeEdrwO ]s@QP"(( !uusgzV![=O{/ொB!B!B!BNCoރnvgƭmzU4?NmD_>yitmFIs۽s T|m"vO۴YnQ.AwOتx~@lwqCc mt뾵f۝޸baww'ϭ?7?_xZCoAMg8k:\t[ջ~o[_k<;{ܯnݔSsjYw1flaӋ>pNu3o+^O>[}{uFWHLN/}7ts %?wR?ڌ׸h{jtt=e&Nچ^x YǎF0m.v7뎍V ^\,+{2f76nldwʛ1ֻ^(o֨py[eŖx]vDy}\yW}w6]W}{OhYx5Y^NѾןF_s,YͷykF)aFFI5[ϖmuzWOkcmw\nh%n:E&ۛʫ-<6uCGj)kh;ʲ;2KlݤƭN/ڥqqf ^}̮3 4xx_f;Q;{|ֻL_RcOdI>/6Mu%f~HY޽`I70lF,ݨmUz;k"Ofnʮc5F[ Լ}uਹW]G˯Uviw_|ac̼c~vȋ4쩰?]:hȃ-}D;{$k{h ?,ighwp=፱Qmc[ݮgeǯw1~wM` F[-smw9Db[۽&ro?w{VП;33gIڷR%F_,̾z=5Az!M.n{J=xzcoіG/FkWh3׍2s1Q2{ikdu(hhQ@"ehX>; 4or.]UezM}^kH1N6̚7-rEDFoMvW{S4e:^s^M3u~xQO}W§k;h!Z-hR^6uv {˕mwu֤X ω&8&jPvf3n|Al]ErOM""ǯݭ/v7n;WXIwM]yXnᧁ9]?԰wՆw,7δpq'32Z;-Y}yz6{N/̇;k9_VkV61Fgqw?քs;W>JVgckX}Ú\D"߽4YƯIc~ZC3J6z̽*P=1%+?wxI'oO~F2B?{&o=4Mx2A"cl?Gt?>gO ~;<>~]~ryQM+}g@52ݺj4kه{TV|>mgWkz:i7xoteh|\,ү ?ydS$'fwfVϺal$\+>4i@?7B#'?^hd헒d3? }Lrzn6y7[s#6a5e1jϚڶ&4$XPFgqq zfgqwrQĒpVӇ]pʎxA4]eC}j-mօjҨs$4:Tr^z[Ѓ MzʵSC tStyN>P7p?{Q4G1oM.:6; .Yo*DDS>kb3[07]_ܴMjwwuR]uŚX8|6U,h[׽)HFk)w)w^_lGB6lt)n5Ku' |N$KhsM$t#nzkGՏIކtHXwrgh͟5iW_Zawn&ڤLtAښ{:KiL6 o'\\[Y;1aƚ[36%7x6:㣉MγENrѫMV+J+c)f+[mRfg܋R]Hn$yZwޔhH^ctM_a5`1:蘇h[@?mwGf ylJ#t9fk̖Gv/9hůcݒZ֏EZnϏYϖe}q6o^kNFjF}>y%kjOw72P%{H9#}cQyL"cIwܿCShCS?J8&U2_~V@./k4(?iŠӴwǁ#sݽmk"?̭v>n&,[3'pde|XyAC2YNFSkWɼQMQ3W;404|ìy Mi}fF\"hwŐ̑OO-}nal$%h[3oH7LҌ{j{g^l>ݽr6jB?XD{3{dkKdm"5W/1C얌 ̽5+VWoF}`F mF{8H22nɘS$ߋZaﴢVZcOvga7=m욝6C_+ן1Zo=|IҎ,.* 8]eػ)`GcoцHV m}W4ӝkƲ~G37{9ydwproY;gx6J0c[{DXnr}g?^f,?ҝ׏ǭ^˲7t.ކmz^;GaDB ݚ|SqѿHc_?T+.ߎuzK79%2ZN>JN3Sf|#u]΋_ٿ6sO.OZVXO?aϷsOvZ_`s?>[\6)o:l~f䏭)ckF_}'ܯh= ɏTy5RH=1?>CSG_ZMAaӋYGϬ{?|N(u^I3~_wnڽ ݚ26.񑂊AʌjA]WIɆA$8ɽ%XͭvGoM Ҽnlvw]Mc$27=@;$+.]$X%xmIf/צ\?Dxs#;zmDz_FYN<> p;.~w$T[MRih[Z%jew ^a7֝&~mF: ]xa;q?$c[olh7dv/u߸;^Iϕsh/>Z(f[sclNz޳~)}%4vGk]H奆7٭IcCy!smwK.F5ݚaMܭmJ}oz\|I(F{_죉_ǎV$xޚc7=pf߽YM\hwďz>̰Y}lFm3֤ciӋqѯ_9^E4ņշH0[ .8Tjl4G=j}dXN*vWvo}.MMY=b&ή/F.5Hț<6{uhekɎc)G$t):~޼=)*tm^/UzrI\$7{lw:pkKM{$EޟI 7{]лkһѰ^ðY}JM>N8pzJCba;9MΌ:a{REs;XMp]g7n iդ/2lH[ 'gyt_2C/QvNwٚZ}Dz5yl] kD̉mE3"וdg$qh҃HO*W땕ױC5i+?7\v&EWƏv{v_8I/dF&jE[ޔL$[rwt[AZ-w[Hxْ͚֔?cG&GIp {D)1kvWlwtqѯC׿Zz?'eW9']ѭI5$Z}cH>%@MČ5劫uX ݒjCS]m;߰Gaꍏ&?n 2/#/~D-~T؝6]ߓl>UǞ4I^?=kwaώwZڌn_~XTgܫ'DsmMbB3{c%gC69f_|sHY$7=.o$JΌfjx^/3$ڸBɩЌM$#hϥ;_Ь+[g*9շ:ɺrrsmɊ-Yjak~f"V_ՄMoI榷X1kw$?;vȟ';}\d>8W{EnJ2u4lwK}^cd_e|n>[5m?G=6fd3+mU${k ߖRۣ~6~?ə}iu`9Lm|ؙ%{9LJ&Wxltt%朽FOg=O[褿o6jjZŒ5r69m8Uˌ59vH 7?f%vWۮ m7zƏ=W4arq~v,fmvk$#33dg$bo6kFANϤ?{᤻Awu30lvKFY6k~wvL%|x^_p }k+ʴkdʴǕ;ghF?{*gW;-Szed"SKSVf`Lm0x/qs/JKoeE.2#SA}nǬ=eX=pX3U{=ֻlZnZlF:C%2Z>NYv}2{'KgOã״Ʋs"S6v8L}c[/}M{uHPzkX!S>ðO =KHT7PՏwC`еߣ䳬^{]'hs*іdrxw?]|uN#Zwkojպ3'gDM]v!8[t7515_2䏍>fg62嵷C>J?ѱ5S#lƺ I1*YF?wOO$wI~,C5-u9#Z摁Ci7u6N"̚}nXV B֒Wv?8R?Z6\=!ַzgm4,}X}Z?~1?и i7H#Om>@R|ݠo9C L~+սaJ@s$捾w/x!'*o$Fgq/hWQN卾whatC'Q`;7tK ~D4^t%woPHVӁWx~I?Q=;pr 3j8oiޚKvwX&kKc%s4}P#%.Ҥ7¡r[־I}N кQE^pqR_:L8t4; AzPϿckgO|HiU[CΒŷoE&ԡ'X9_4оhC'}N䓎kz7ir&zV.O6z]?\̽uM, NѤ-1s[C7kzO@ Zc!IdX.aћN7o;O:Fgq5\_X[dn;iR $ȱAj9H[Gn?KI"sJ_H,ꮃ(w1 z5 x'j-쩸ܦv?tw5ܦD֬to.ndH4w^M>qmgDMO\kּpDuc ^4<0&qs?ݺ~!l`$[g_qW']?G" /+w>"*=&徆TwNNIok?{Ǻ[ݰn9pȺ݁m\7m{wrtjV=zw2֣3$qrkyw/ziMԗhcRؗpQݏ*=4<@nԭX؇ \퇁M/=$h59"ku͚7@rt9Dĺ\w n^ݵ'fjuGV^.PKCGE[IGY~Io55ԢDvomL5QC 7*7_E? =_"ꩰ;iŁ}bƝ}v؟I2 Sq$4';doǾtWXMHõhuM0'~]qt/>ݺ M_{8woY^ԐykZH ˟4OK5/2G$N?HxMpVX?JugE%Y)WfthK53Jdew򢵁[[hxZڝ5!pzZP_?U"s;{Eiʤ4?"23Fv>/ "~MZЭzlv8PGtl"+4>^v }w] k:T"Rfnin3 q5}ek]8<31- OL_i}.JNїgcFN/GOIaݺ;;ޕ?wҏ 4-a𦹁i75lF_N٤#xȐGҌWjwavHd[_jn7֝ƐǾu?qm O(XJ6l-8h>l?{*4Rx~s[+Mʣ5'EEg^">^Zu_:|h6=_Kh)E?{ il9F{9݁:kՔFw* yǶyݭ[WIֻj+Kf5Kdn{iƙ:yEkVZUC' m-ӛQ6{M tWWdzW~[[Zg)79KG;vQvm"~bfďU%2HIÓIftѯ'43})k ox(O#ht߭?\jeeݾg>u}}ww̰8.Ou ֩_5E|SL$8~K$8߳NzР+]TH8Xpҝ#"ϗ\ڞMx=z בK;ރHAκ C 'Eu+|yg}_=3RAMn.z5k1X;gYHډgR >]o~ Mv޴UU[ɯW|~. kn.zHt/Npȷzwa Io.zw װ~~OqwI+;J'(\_P4%GB0\v$?=$Y~(1;6q .pb?jP]uGZlE Gz"_]WB~o1=a !#EfTHa'i{v/:'B!/R{!X*}wۑ}y^}mB!B!dO:'!Bٽ#3گqR5"3Z=zBڑ_[e?!{zd+]Ed椞nzO7\tW;!~Efl8zKdֿ/2k"75\B!B=B!B:GTwR5"E!B!B3"YsǸCUdo{ v"{qO&B!/x!Fלz'DrOsB!BHՎ5]zB{CUdg+]VHVT{ dOd!)nB!}$ޮ@Ȟ rBlD2zB!Bٳ"_\F&zB!B!B!B!-cB;r~\Bn7[_ȞuzpK!ʏLNl72ۮ`#2[]B#/\awdHa}mꑼ[>u<1eUhn;xasw [.#Nw)^vF+=Ip;3)z=鑂#q{w3єU6!;_;I,wѫCZOTHޒ]#AK+ ۽U9R`=vմ®"RpBe~o=|>"Ez#Z=r~{ {ރȌn[[ꬻ*Gfu챑Yi \zfunn^墷Gfmz."zU1rO5}w"2+U793m]aDz"EKwNv):6'~])۝Cp|K>lG ,u)XqQh+[]KeйJ^U >eHU)+]uKu]un[)hFZ;tN%k$'̉?]W '݅Gt[?^MW| KxO' :RP}~iMmwt07/2\tWrb{N^/r)(zM \sz]*):zc]AS۟`HNDhPIXnUOǏU!Rx]zfwn\DN;[S"EwkIѵUϞ=5MnwƏU)RB%ޝEUqX$W0M,%2-= kɢ(f).i٧€傈kni!j.|. iiwHsK{9{;8:w}hQic+ ^5ǡu`=377Vi 8= ^UvIK_wTd{ND_ N#uYh`c՜9V66\ ߡh yaQS `іt?`=X]3KO02 |5eTe]8#7l\ňLRӃkKD][mrdaAԁV{UтMMJp3v/AӋxt)vD/s=kmD= cZ'/SGUCvm(LҕI("No(`sGˮg3/` uB{s{n0˝=0=UYՙ{C'QK^oi^1W1 0wF NDY)Hɧ}k~b Y`}]s|}̎xAm^CgWyG0rR 0›='YFEN=,niN|݃(na+* ܨ0r0Ǽ#GԔ?a#^xcn-_<7BY yG[D! «9\H f4vAض,d0۲PWqtYxecaK8v8vfQ+_-2 7U{+_邓[[31ͼ^cc@!Jji׭ SxpTlBl +MVz<^({'8T]|6w!qTg:=w_>becvB;RP>B!r Bl|{!i敍CqTB!?0})`1zߛB!B!Ahhl[F'2 ea@J6UUg~g?vBy8vB):^>vB!v4,ـ!0kR!9!/c@!^bD6)!c@!<*,v}r 820r !DoECHB?,,{54IHK~XRBB!<D/C^SbrvYB!BJpSk¡&Ͱ{5pZk  j:6r({DE@Ex㰲I {{ kF=7HHނ݃jߡNn&=Qc@ԁ}vvP %8 ac,>#vA|$8G{nfݣ8G:GW#vA`@ԃ;`@Ԁ=#6ʶE{,>! ."vb 7v{ 6Xlx [-{/dd/Z|f vX`S{ j+!`c{ L73{ %lY,vB { *!ĺ`e\CL :b ˃h|OeG?3+&7Jy 3m=BA-Lr|l[Bૡ_Gzꕰ{xT>%w if#aG3Eٶu읿plb[`xCu#vZ`k>b+Xٰ?^T=<.[sUA|=d텞m;,\Ek Y%kkǢ|" #:$Z^'qt/.p$_(?-WǺ{QWrTg$v}U߾#$T-끓sS{PE悖ݫJYX:!+GZ럻,0'HS~Z8Xufh? E/7e:+[b> Y6iiM׋5g.IHsw}+jkUg{p꯹ PSPslQ @Jw`GGQu6a:GYpMo︲:E@JlѦ2һ#Gͧy=;]s˗2~ ?I'Qyv/OY<;%9ŸYm=@¶uN-*ӌEG^d :v̗5S܌3er}R?ۈv"iQEJvfhYl2 {Ӕ;{@_5ׯ\tk .KyvłĬk[`њs8,zo+G٬@ Rk~);~)JKp -Rb ׇ2l٨=}]~+6湲lO[+>{v-p%*r,f?* +Cmgd9Ys..V>{h+^0';~sZJҒ=o_vբkeҡYw:)؊RRG=/U]wrF\ohe{k%GlAa9RL3/{=GM=uEyf(6:gOLB!B!B! O8Pϛ&|J EuMBXSeQ}h\vi[qIMmPhaӸ5I~>F{i ͼ-J ט ÍuC|ƭ{wqN9GZf9m~p0t^'u Ef; wGev%/xw}jo^D+ܡrKy1c:u osyAe Oaqx&pO_$*u"jmcOWoć$U3ec1<4kqD=E֞u{9rU Q?9Pu-S~ϸ#"_΍E!y_MGx m^vL%};|x7J6bC]ӡ=Ou)5l8n\.ǷpYeqrMF ں5y\hQfj.v:S4Kv)uEY9p?n갨VM\qo5G>!I,w.]ifΝ"TniE.A,`gD_^~Oc̱֚s3 DpvA7\Goyy2&lˋ09XX3II.ۢG^ n֩^퓧ce{L3slCs C//ShM;LM*ݓΥcd˟(CFWH,5ɏxw2lߔ.fx( Ġ7ar^qsjݦҮ-0ħȩd5YM۵ +\lY QD{ NC=1L=b8tV$N(о| )*?/W 踟jp*?dmHZnMJ0"ęsѫ}Saȁqf9 "{ԋJ7=*bSml/nC8,\+ZK=LIS}(Z7Um ZL&W>qGHsj_EBػn,,1׹#W>DM:Z0ܘu*5-pzBC>x6j 8k&Q6Mҹ`Pph)GFНѫ`@O2.r-'&pЉν$+7fi|fDZEi5:'Iu~͇:~>νM1vzt 'vaRͪZ37I皬aAU͕lU>]>tlj@}_s疞xK@6/;OW|kb]amm٦QVs8*J)K?t'|Cl0/wڲO=aYN2bНXV^m2lN3)oK=LeUG9W-ϥgX@l\=Xr~[ҸQB13sS ~wؙ`i1 3רSMc٨o0*Ͽ27b=e"?5Cq##NLP5[a낹xY/k\~gΔgbeL4&Mbط"l"Ej6DoBq[y"5MЍ=^gbc=}a O?"vRsf=XQv)tesf{e:X/OOWK !Xa*l+> =׳`6l֬ u[o|:ͭ/+_tQ` Y칳lޡXWpnV^ QV[E `y, ]ַY_;}i;Kz`-{l#lװ lU|#4$gđm!s|.gtnGY6|l=3Z`Łnu*KsԒga!.lÍe Y ;՞ke^FI$u4Y b31j4Sg{QtP3zYq6Q P6!sFoGaQS){Ǻ lcFKO U䱭Y7[9zoS~CaS'w_>CaY K\;Û->&i\A?1ã]{g3?;-f|ݛmb6c-~%~0 # gU Aja;E4`,y %{9laXGW ,Σ[zROyb/bM"xP.B-ä/E7`f 5`1J>Ğ+E{m֨2 E/ (7;Iǫ1 ʏ vI?|ӎIMTJZS~朗?Os o[3M8A—׼_&tgF!\t7_kҹ~AϴpD909=R޼:PLoPmqFїbSIbߵ (rXakBʯeN|! i-7mo91LCKa;y]ky zՑ Fx +: <|SK1z\M.(QuuJٺUyxjb׺ra$@uWɓ63DZ}}biT2{ۋ/G$pPou1d.?NwrV1Tslf.b; >3`8t9A{Ή 9T GfZeh7?n7q^xF){f#<>mQ,qXlKoU5Y:8^-َ}``5J3ӊ^`Ľ0yNtZ bUKt̻Wy/.ڌB8{f;Ai+]Ԓm11{¹ TmX3:V2҆AY3u)Js~z(M~ߎ hkؗpnI>VQ/yfO=*'K[a_=k~v$/ѭ[x?攎2;>5*Cs>BuZ)H)}qwX3$F:X׭yCA4aa)|,ԮT9{DvmDckE( zW()ߡE/q÷e{د{~XgyX}HHiKg`Hq+ӗ±inaYްY r偾ۅff/hTwk}}a94@t\X~c?/TQ# I׎\'J; ^3UB!?lƒ)#fR5;+4ƒr=A%_y* b{C,dٹpX,EkO8/:r쨌X?]z_ה@UJzq木-d{ MўC"x.pY )$W[Sj:9 EHNJ''[īڲ*HPM+ /}%e_zA K|8?WϏ?&)/ɫk|a6s4ftk\_}xLZֻ$/%Nhw9<Ѣ7Ւ?-^&MR\XE)ݲ4~dܺG y%hlٯ'}, :eE򚃔<(d) 4tѻʉ5t)i/0{ŧf;ң r]~ et?tރLmvPQ][TTcM,}l 5oQDF`%R-XBSQ1~)6b"Vޫc˼^眽}ۋk ͜Ƭa`9Wƅ4A{;b֣Yc.!c\ٸ~Z+iOuGQ8_x+3/CZ~"6Đ`uwj9lX q*cLSsn%xE_ZO=%w qtz"s"SZI0L@/+'ppDy#`# {є:y)C=b>޳*Gp# RYGiCigZbѳ*'KgpZ5X pUN7:FfjD.Ԫ#ߞ >:ʳǮGy^#܃l][`%(_GO_1(§=fdZR6s Ŧ>ޏyjJ̧VvLl Å݇P?χ -B dq~vAlD2js sNDMǧx43~tQS~ϛd#}9Hcf#i͡7ø6mZ4KbKp ߋUU[؝UJ#3 HW|E_a9Tnl^*I Ԧ+)b ǦMC}jmBR;mv bL~Ic/~l<>^bE`oijgGN@sP/+%ի޿>H01+%*u s1wYbڛٹCOw=u cE< eZDN^*\4紸cfsdu8~ _vBIRF{9(( )gBIfF"MDjT+W0@M895ʑnḨPn|nF#*޳CE+u󩝽1GY ĮkHӨRpogQl23ž~gu,En?<n@kG2]LfvD`CbRVɑ&NקqPLu\5wggkQ}Ԛ4OGx4f.ExJ͟J_BrXqs[)9һ<Å%LQ*j3&]A\h]ia7=M?p_^d*~c-C/CQ&`@)ә&*Kjfr'<}ZhPMf38:tsSW,ٮ}.6G4s28`MfGv6;Rq(^T6w&][EG/~rR*xxX/˾+@yҀWt&#U _,̅%U0]DSx>Pa Ǚ_LT|c"[ٿ!"Tp7P!rAg.\cuVu. '{ !f_?ʀ)iz:g拚6vVg.FsNW('ލoIlGe+ D.[Fdz>QƐ+|?J71|-'!,'pҭۓoun{I}rA:65 ½]ysPn٠4 c66;bCS\꺡)Y]G.@j -~L 'kBIkRUkx)t0,|E3lsaڅWY ǘ`D: Hais=Ons<*jׂ̆Cu+; [LX3ܧξ7gz#ECTXpZ נMcYN#6o+*77a l6& /û%U~gWɮO=^Z:_F~ϸFS>iXKNJo︿<DԵ?%֝q %ﱹm|&"O{O"UD.ӦN6 pl\(| LՌUI˒@2*+n^ c/Ґ1E89#*wXoFAjO+z* 90e#<$ܻ?KME 98+=PcpB%Sɠ"A!JCTpBdsV&^z wy?nxp5ܼptDhiB7vZ*/!3MkKX@_vW\bC 7/{ >c`א8&mNNh5Cέg%sk糬oW@rΡ ?Lv2I9J~:W!$Vpޅ4Q~>g2cuÏC*c,!j̠ϙ,2m_ uV8wBf,70f혒s  ͌VE&&(d}a"63d-xD!luBfx_p)=뚗Kv^HoU4v 2 Л|Xgmڦ]yvh N'X]xYkme#'w"#Mto%0:ly|?i4>;CK{Ӑ˭BaW9݅2Ϊ[ >ԋk6χQk-zu%U|4qn v/T>Cʹ3m5~N`u$&~YsFSA%$*prkK/ȐBjmizQܫ&39GGܤ5H 7IßY=yғXjݳ aG`5~5Ka[CWZN+]I.#\&2a'G"$ӱz^\H3t<2^{T~eGz84^נSk^.u^^|LC[h\3}H u*L׸QcL W䑞RN^JDҁiޖxTߒԣ%we8TWg{dq-$ gȩ}.G#:dXO&6|GOb~KξE=qbL~k2f]%9A="6 #q3/5G3f ̚F=Dܐ5<( Zv筑LB\7q 4Aݨ /%%hi% F\qtFrx^_9YFq_Ng3|zB;ڎF"h'mX'Uϩ(bV||F.Y!fU%VŅ[Ȼ}7ɼ2O}Ӎl j>l=;TdBwGS&#smw}KD3⾝@z|n4UXTC/`)c1^g 6uwBOh5GXj5l6= e-ՔNv頱+/D[[5lauVi8;L+Ϡxu#}p"{V29cEs%?O?!2\ &XhDFꮤ_Fb-T:PvRs]kv;}!VȘՄ:"[Wa-ph-|wQ?TB@ęg''ɂLZ˖F!Cؗڨ"D\NŞq\}W1=UjJ}wlwDuQ҂ڢzxS٢ԻDnr;*3Ϡe+.=5&!Io7.IUOߧZv<$zZA^m@ýhr@-nFzӧ"}Cg㾨u\4_폛T{dj[eYd^ekчTs{\HMKP>K.N9nhj폏F<|ϲuEo+6XLLם k' -a9WFMHxl޳!Q)L4ހH w AM :j8.BZ*֩#SJ;8rmZe{ T,sVOnWΒk#Rx λtV(Ir M?:y Łg=GȵǏF"e4f=Pasál\A܇~TM5|ګh͢^m&,ziy4 ޓ #7 +v`p]+~Yg̣7Q e?6d{;|!|3N@e1t. X#p'Z3t<~P0#u&# vm÷c?,˲K9AeiH5 BO. U|}mYdO) ~]1u!s>-7{b5>{fN@#|9)EH>9Z}NI(Ky2amL#P{yV"ill5,jD%gںWV=&vqVT[!12WH iZMd BRGx02u^+m{~\Plօ}oo\CR!FϿEJ+A;Ȥ|f/,~Y+|ݶ5T㠁Yg3cv 8}㵖H2Ώ&ŵjgLǗE srNԳO ]9{2'j-;>nÙ:˲uH]n="YU Uu. }xlls qM0i4' ﳘ+s)d)@|NqV$[9c7:VԈMnwv)1 A*eg>{ٍ:Y=-22l+ W)(e7Z rMf\ed1ISawTVK-@M,)qxy}yS3g$?vwE;$zߝAAjrc}cs/eXVkdf/\.n%={h0\sഛ`nIOre|pǿĈp]:W=r=2e9 ri˟lLef*bQbE*GhLK(}(TϋBȆ'[5}V{%wșFGa|r=[EjWtAıKgU+'[OWr)Ql6#~gFm\V7M&<>D*ź,8m[P5zOʊ(+3! ЮĚ%2yfFzj$==iFmwD R#e6>+ sqp]?YZksEj}]n@ kOpX,lHN(:$10fsp=d&[n X2H# AIjX/cn{t<5xL4wK͆Φ3^\=Ž|jDE)0DC'o }"Yk =yu'Dly+V61s2i?KIc:;C3hK03K?u/Z݆4rʰP$r]9?-Bho_AX!ź|!ב}fwC k^Whaj<=><܉D\&0ksc} |% r*}@&Pr /6W{`u$N8QaN0_/4sYڠ&~xւZ |Ȟk&e+֝E&%]ڰ(bY^V ,a*֝6-eu!4pM6eZ÷9[i9b@դZIlM<y](j3Qt3BFA~L=$V)Y08M3 Y? ٘>>vNʂ%=.B,;$:)Kf\wߗ9?h  "{ZxUi?~$ؒ"sԱ˭Pqӯuo>GjP +yKػXνeMP.qYL?ڍzy|MCSw^giOGip ܂c~ļS=CiMTS$7U3T$9VqUbg.[흰R1tq."Py#jYpfƭٞXn].at|i| D`ep>ߟi sK>yB7f"d!f夺w; Κ7 '()fkgg1Yy;)5( Б )5do" 5*_w`9%zE)U#Q>H-7Fy&KNMG̰,FA69v1.P%8h?,pIJ;_y݅;"tNwF^%>G?&2^2H_]9j99W)NzqU \?aV;f<`qu&qs8 /?~GTf־Ih>=mr!$#r𿀪H=ׄ&j9MJWŞx I|*Q0 ?)}mbu/%eU4qj'getܗ>&Ջgː</CN1>#@R Pg~g9'y,Xu+Fm}޶B9zo[źs @fe"{Xq>Ł|}bቢ68e;gr)q2U0Mc߉Tö(.@rז(hElfZ-2u"`4QpZ2 e1E>#'X=L! ƚwae{9Vk'}A9dK6S{[9Dfk0_$X[ dI Jtwwx g*+?ql>YN' !ת`mAzMU\}d?ԁ;pF1bfm< ^ 㨛f_S7d 5zg`?N;Y 9Zz'x=DfӒ<,GvHSKlh8G2ˎ#6ʟɍUegS\GXoϲL];#{Wүupg?>Eȶ2n|V;RGbIvs g?d'ߛYtQf#sz?I("|ÐL^l5-"ݱ1[|5N D7aigd˻|fpߔnٚ/#%|qqz?z݅sБpOa7I3MflCwޗ{5{\؉H8wzQ̓t2O_XzL8ڒpr$L+x2 Qi? i"nJ pP _֙gF4}VbYWSW,teV8'9T!2+m ُf/ 4RLK,7/=<'UȺ E6gBbA~(Her}l~u^s4b|8s@AԚ; 1(B*3 u[9&!=: G#CD=c+} XMNzgli;3v9AlH3s^X݉]cjnjvd-!nRyh=%vCC΅C2ȫs_$Ğ 㫙ZU]f^ocaE |N . :!8o,F+|d/TO vH n}GmQy)uS#'^"@`~%0OxW;HAvm=t9MGH_U)=Ld Et0Gö%]ΚyIʽ},w[Z"٥1j ?_hL~5+Lv? G϶&Gx}NgKE#mļz^0CM]MԝuO3f+ywew_a;*|Z‘%}I^jq6`9(o;ݖ!PИ(LjRȋRR ܳ<"WfNid 1 kٍ]_w#ٺ $+U ygݰ] E(< F\ӟo v57*M96qvj8?jF98fע)麨]^p݋}2~?a?,‰%Gxu s}{FF^7 {pu9GBCDZN(f?$,Y +(|\}(Z-JgG*cfTw:vΥ*qbJhiGoNj:⣛ޟͲ?@$<Ӟ n&j.de`*|\km%L?K^ז7s#W 3υYNr,;h$σ ^A>#D-30Wtl=Vܕm~ΤDžSȐd=50ձq ]13SЯPԃ5{5r91U+ WxOmi(:/|4oV_3{1CV+?:RG[`z}5l?E,Gm@D!;0Β 9|Vأɺ_^&S+;s}UZdoWJ,`axQE ÈؕnHHnQH^5׳ia GJr(l}a؝F,;R {e|M>hډ^XROIXwYGsRw[Q05ew/1A6q/4O^U 6jAg{8ۀ2ji+HtD1m\0J1M7@^Bʁ4w*m_G%M56O#hbA|aY^\BXN 0ѵɰJ>kkLtl+!4Ik4zZž ff5+6 ~SSkPwpl޳us ZlPD<M05PjP#ȝCQoa=~Ͳ#ZpO y;Qjؖ]0g0zͲqvz?B7"k%8&}&ZI$&Ռ Hgs\xeΟ죆YI=Wsؽ4@aSwH>/G6dv&M.~DΒShD{t~!hd:{]M/iǏV#}(٢l TQU-.>f]fĦ6ӄ8발kHas){^la|b-kpTNW`x}#U,W>Sݐ.ϳ P>H2F$Wr(UF)qTb+Yކ rǷUHa3yfٺ";˵L ?.1=$*+tlr|Vj5;Hqo#e5ݹ'vZ6'.luGR|-J:m}عG2jYuF4l9 bg9&o&_=/, A7%#˱Y#4'Hc-`Y PF@6?]W@8yW2埞~ÜnDcx- V wGYɯ͔P;/2ۺngAqJ[<̓YͲuj2pW/m% 3!ڏU7Eϕ[caD^~АH1;%A\ *^BIKGD@UB RVIOկ)?"$4)|d63;0 Fyho7}f2*E}VO }YP$f9r;'!>}#(yPgh<9ǬMf݋ cDQ 4M$6]~|#)_@rfW|;nd jzAV_b4V>ig׼vΎ͂Fy5J o j s^Tu}c? {:xCcʶ|ҬGfhX޷6L:)yΫ+;'[4Q@d1n1k-Y1%iCYOs**hd/׈`(3y|n?V]l޽ߒo ԔiΧ(>ztڀːM'zйfcǯ%v1&8 #g79f9[~ cPXhcKęg;^gRjd,EƇe8?Ni~g?#vi+Rߓ^oVT0ᭆ_q[wND$5@!r߼l_=HG>m8aVnUa/mLKUf錝gTu@C=mp>zy#jY"v .J̳85֮pz^ Rڶ͏r> C46mD o_E^#^3s9;韩PStVgE@t9}R1;pfYuuӣ{*lmʀK4٫F'PՂĭRgϊL[,Xםcp&wgA( ڸM0~ v qz|:1NJMNxpj\;;0$?!}l(Q`"(ԛj%#2[ Z&[i!m، 2v,N BD&pt6~ε\p̈́~ A\W֡f4cڸ eΨDP>%;իaFH1jԝz_D {8flXWءyW֝2{0{ޏĒiQt2KLK<a;S0'rid ]$sc}{6RN80%):Ң#2) $0RGKYϜi0xaspn4"3Od8g5ݺw3>%IGz* l'_|enq;pp$6P31 ,r93r4YVbZmJ0٧ޡ鮁(b/ܥ1m8;MGqF}opǐ {WSĕԳ^?Gv=N}hj˖pF;\{%Syv6w 2TVpixZ(8.g{y728(njV󢫨yB PK&C8(7H^ in Ϡ;!=QМt@a9?@7$ַE}oT#!,lSah׼/^163IlG t3Z!ãzvʅy8-5}?\XL4YcGG( %<9 ϡ %@;Rh>l! F6,{CK Qۃ28H]Aq^MLN/plNW6ɖwf6|]8hਡԾ!1zϚ|TjƲe:gTDHWIOL;ҤCh_9Z(9#iBd.\ޗ\CǵzFKU 2Or>SƨᨭC, pEblٹ6l'{?I=Dhuqg\0_O!$c\qcBi;d-rl8fLS}ٙ&N@y5y*ȅZ!ؙ Lϋ\c";$^Dp*Sӆl-̀][lTH}fn\;$<AX8 7.bTYj`>Q*kyb%;sT+yc`GS#1~K]=kڮ 6nq#SC~O ?:GSp} >ge׿ݶAvq+>o.5^،,U1 tQt L Z}:hE(첄GM=ҥ+ ͦ*V˒z s`VRZ!zu \i%@yV1~rtvPu B mGsrCXh^Vp)8%4rYdߜsK6y/EtAT6qAb&[k5٠ c90 9X3 ْo??П!Bx Ϳok& .%KԜ/nzg+BQPTvs[,|vBjYuQcWb g7΃'#ls ^b^O9z"B‹|>gqЫ9K@-|lFU\pwe{]䯘sX!eyg8=҅\386k ~$MJRRۜe֔y"WҗC! g)I-*Qpzỉ0D<ӛUͳ\]C4FZ&#*v5bX9E*[jm칚FCNP3,uo~8?Xsg;Ð%(_ZE n]c9V[G[Syb/ߠWEQ*̿#@MhVU{٢gc'tUkƝ_ӋΉBF3q|8#5[[)0x8R Ƚ%]t=EU]롕%zb2"y}y;>мq lC\m^"wp+<x \{%"lZxsȖc4-OqW棜?',:}~ԑPpi";Z 곋^mL܋)caϴ]-_섍0촆o48ޟ΢® էtw r9$V˗Y4wfGS(5ٲ /"HsK=uut*#'[b6G |V<]-}?uzW؆(lw;$oסZ/]?\ᨎt ?V܏J5fJ0OjgY5?6 xgQKIBsl'|os`),jx+[MwtByJ'k$۟M\`` ۫AP0" (!(!k{`yelc"[Mk9[bgls ϮZLD0&-,űAlCjKȩk`II0/\- V'.&[vFfOϮGoMk;? 7DӞ>eg&Zǵ<'fj 4S41Xsj>_z0;U+hpu muw99fAѲ>!y7KrhֆԓPXE+cuTAf#xMļ}m G~HDoa|i:JayĒKUE'/GVu,\J=ZaC?Q: n>iꓟ'c9ŌGcG: Ƈ>>NoխPR~|F~KHZQRad^E=/@;:Zn#,GW7T?WkTyg9(z.ڒZ)ɹ{~ ݏ٦|ŢB[ZVyw49,}vF|4wA?W:릙sӶ@@ޞC9P.:BYkׇxMهOᵸH7UDҨmp-B Vy]Va>?B< o?g~.XG5(h)>[_M wD-mgg$ug|;UkN#VAdGo#'>|S 0/ߴ8lj䶹 Cu٦а_)ƎES(|g2=JUY~ǡY&2?#ѰV}Qk^dkPػq#Wd!ANPp*5Ns W#<:cy&d#9I KfD Pw9TxYvE|pL'~ ۝O 7b¤/q{ImoS?gOem.KV9!.ﺈY>zyשb}*;~qiuw8sBxr7I bN| ϼ.WPp 2SɞGg|Eۯ8K4*J`iP'4bj;t0yp oA7bÝ޽rYd6̓] \n*qɤdְy[YIk%hi*lҶO9Lf%:8Yww"\s_n'3u(Y\`'2u(hHoO'>"r'Py+<#1gRƯO;=k\l }ݿ # #/ w+KI_<^xcIcN"l|L&]An@TFQ6)_sAbƊ ;y &?"ymS,p%2&_MwXxl@>0A.9 "c@YIzڀM+X!c~`=bcS˵^-졃`"6'bq?RG!t22\Zjskr^xIkbIuQM˷BJ>@H6RTv$ٳ,WAwZ/D%yNNؘ7mu,x&fAsUc}`y7ªㄆ[r߮hb]GpHP%wwg}۞6\A8 162K ʢa>[;6^G#U(}K=uRCө\6"Y yG^;]=/oWBÖF/i/s vf32GkP$z=}.b~=cqz|9_ sԾCs *KPr 0ϵl3y/{>'_ʓTbGM,*"2E[k Zt=6m_명XxW.iۅDo&l)wo#==ӛf16^=y5{lܰT#8a83Qͅ|s~eTok*;{sЅY.DwRra)SpSS^ts:հϸC(פW(M%&2̳|/P);y+ڇ 7=sc)B,b(\f5ˆ$؃B2g;}3|Bnwz{WR9GK-@| gKOG_D.9Å:=<7G<ƊН 6QW݈2nS0 9"KS^J%)E梠B~}^9]w826~@C]`@̀^ul s.˞?H އia s;?쭋`>OL_犧D|:lN7>p;3^&AEl[;\´'qjN̝GQZ9A;Q[+zSB :&D?1LzN`=;TS*6!u?m3a)|qI9*uҁpՔrIxBwd|D5΁Mc2) _ ^̃P۶Ag{AZ%3V틑kh_EqEX'4(Pl5D;;!d'u(KD== fhTzxwZo4 `wfX|f \ZH:{2=Eh-sƝqMq'DQ:i[t !Ts7'ڛ H!M@opm<RsBNH:o$*wawc7Q\dW" Gs8VWH &xZwBØ d:cb?NN]{dj-`utdK6)xB6ޥQҞtρ/:rG"lW92#MFqbIYT::cDts{ZFd6B]H=5Pv0{G1Ņ!fDW 0[@] ,lp(ImTn{{[#&–]TP4kɎYd>>XqRw+jVQg6#`Rx{ۚ=]N-}~&+jF?GJIRZ{mWc-#UDǵ B9шd=nGWpu|rz^kf{EWV_YM"tA= %]sݖuYUO:pʒEZY"gk\Qj̺\`oAD+ EaJ̉Ӱq?,'Nc\}cfplh%1&}CsS~7^{yqzf1Pio͎WrChҺ, EKk_`=C~=X*;oDf(}:HwĨ)AkX;"#ݏ ޚ(9댒[yjR@ gDd3CP6K([A4o^&&|l=~ϳ×͵P%GD1BO`BJ]¿zDmO!9T R;vVrgRgSlx<}@t6-_ыAdu c5}^R%QErWg3c=03%X+ry7!/10 'B茜$:3^mY%١'Hu.bv/W##mY 7s- VUݿރ4>nqE $8tnT,:fqb 1VXBdm JO!Z K,I;άnVO~!c2 Dj*S?p{A=u7g^ww£ZԿ5;JQ|&5-DfX9"$`!,ńǶОyQK7~o!b2|"8 䰓cr&Çz|`o;U=a}[L6}Jҧ0KHP88{bb`^;ѝklBeX` 嵸6#Y<ѣR:`/ۏɫGgՈ%l)0@yI?(,5uIvR$sހFΰ?vŒ)XAqr͐zΎS _BA7 ,u"Nps2t@5йT3(N2Q7Cvw1&LdQuGJz1G~ bjk8RWt$l ".w߃Xu, D̫<[RS˜ ] ܳ%4+zX6l^^U˄ڪw찚;':e OCd Q9:q4H5$u/r}55 _E,;;bM'~ %֦]g"d Jš|o=*=Rx-(Xmz"K1aL3t*;Q1[D_+3܎FYc22S5t Q)x`e#y%Q]Jtpiv 6,p%o/h5篑B35_6[j.D+%pP|sl͑u׫9 ?$z@4Ϗ\n>žPc]-5[ do"QM E8oĝt^K!PaXy3p-l.8>GbV@}[G@N Dy(8??B/b+#k}8|< }|˷-$x,!zQngYX zT?uԥo0'?IF7VRz{`]7O{_wCg6l>{MDa{{l)l['5 A#oʾkyC-CQkTKOrɼ[Q $OB'%3T6+jބ{Ov=Qt{KZ釴ѓ3aPpz2^ QyUCKujjn̍܂f=D/V5Xv㈻6 ACf^oqBkufCMR^پW<q~زqwo=n<խ CϙH!4s(fxl,!k,4< 5F< qTV~~E!o6lN"cz z D0_+i;{qEw|hN ̭V AOqaSeBlG%56kuYapOx#6q}JsE0FIk7yCl[ i --|88QT.u*L=^+܁\5{ۼ M5V贎d|6+|6RvnB8ֈT#fQY ߆؜f խ67s/xz~iDkq⻲oGZ,yq9Ԝ jg,j#TC^l "mnBE&*׊6D^'IǵΎN8=ׁOۊ.Hq7<4[Y=0nf+gەpdx9oWǽpQ ΑGqɹ YfkB¹RH;<޾Lj1Cm4c.F%L|GνHY$G7?T&9`8d?Gx?o7Qv#[{s _rN[kЌ[Yk IDwBT]K)y~ WAq~ _m~ظ>'IxڊϋgtmJ[&g'!%c@f_b\|[!*{6xg{JξyQ;q)$+]LKݬU՘cUz|1[z<)ךyR 8,XM~b!$jy:q m5?V4FFd#ۜXr}PU_#f MKz:"`V?:^ <˚`{c\8O:rIuk^M_3a,I!\. ;`qV:G{tXS粪j_aNZ[i=*a5}&߾HDN;䢊|L@#a~^q upM6oGj2gJV+xOB̒gl8r$ "-"T3'&9VH]:#|6(T`?ض%v"/j/ a 9abeM&0yqB&Cz(V/tÒ7gIop#£ s├>|`1\ʯAZ΃}kZl(>bKe?%!xC!lg t+'?͂wa:9q{ű7"SOa>=WwaKzmR"qi_ۦ̯/ll؜^"at )lsc IK֝Tѵζ8n!FK3nq`7N)@|n/InM: խvNKhHx(H3`&<iBMVhf{%s̈7] QKC fK pBJbiQ,&ɾ򬀜%>}Lv0DHc=|F'`ĒW$ƯM%[.:tl 3kLؿ+,Mݛޝ3+3 ?tBks /3P{E6\pآ:<6Ur$qַi;BGK; 6mJ9ѫ0,1y{fUݢG& L 9W VċaaUL5fč=g!x 23XtWηK z2L0d}ǵ/%*/%u~\!{f3-lVG$nLވQ>H?v'9cnQ3j9$iwRp>cOU/44L4>Yޣ2ʙUuCBլ8kF[?dngrA;u;|1'YF}{H"0UAS(p^ebߘw] $s9c F%1H3QAe+9578&`R])3p[o { `z(<Q2nђ}QmQ;tD_tF^./yK軪Ѽ:U8y`qhڌ =FvGTxs (gxCvZ56o!?dr0^F~NLŁ \}) D]S&Jւ=*r d} }_9c 3!;I_T]q'~e69K^TfV i ;BsX3{93٫ݵk?䵟_P98lZìc&ՂeB[D l]qN~c`yNm|RbA̻©yUu`<{V-C<}#XŁ'["¡zi(N"M{Awu; k(V~=ߖ_;88u5H)?#&t"p>4 vm yGP-j=.Y"c0j5{c_U7 V̸Ulq$os͹즙n{f=`,H>325KL!p@ . i,ғ}?%g̴ {Uq0hM<$̓<'ͻAJpCH?2|Wgo.FmWxXv<L0B铇nkCojՎL!d 셞ڋ #pzYw;GEDIвg{)PyS:/3KǦ5'oI>^Tu}@̿$s%giD85݃g a*NnsTQ yA H3T~(:ǿ-y_&^C{5|;ءkh[QoM뼐 9;":C߈@rN!j:SGuA)lQd=u g=ӯU`}B\}fEK93r\wʺ ǯՎ:JpUR}yto֙lp].صc&z ({9#s)=eݶ\=Zaϕ9eyOLTkP-,-e 0اYo<'^=rx!C/# E漩ni-51yG/8 =I1XC~kA}Sm{ #I0/MMrL謬Rc_:y Rss֜j[׾3/~}Q<C)҂vx`%ufh:[2=g-wZIE])^: fyȧEU1AqkH7}`+ i} `ԦaΚ'X}DUpECÙp. ҇ )QTuCjEv9b(/K(t;:meᛡRWO`Q_Ap;Aӕ-e-˘1aQe8rĜ+N{`O( e]iF^conBY#it39'IG5M,j8[o}BϘ (.N_&/QQ A35K ^|S%(g-NGD?Ʒ;c5͕u7xwnq{JƝld17#\  :Mt` { Ҽt_U7j/UŌ!CLԶQwe,-@B c|t?XA0vUvz `. 8 9IÙȧv;,v A@?ֲg5};mK,߻wBXA\hi^egcwE~tvtF =FHy>O$\C'pX beW^~$g{b_c\vrnGZP\XL9A6d,Aq6m'Q47M2:e>[};%>Cb=z>r;4cĢcu?k"?V<\Gz= ]u?'R_P~pv?ܓ("~t }t)."p(ܼ8X`}$l`Ϲi {UuEP:Z(zg3(W+\ 1 E.M6ߩ{fxGeH6ŒnC~ ΁W<ǝ+!'/=}a3fXgy|Ξ<z .]SmWnj` h%l? F'Ё ® =yGv묬S#RamxKݛGȿ'_sOؔyK4n}wo7$ofH+s=xߩ+ 3؟ɹę`3gf^>poۛB)Pdǡb3ל ʻ}x&lr/m}{Hz@ZwAZe; z =c /(A6SYѢAkЙ-+O?%F( 3kq|P3{HK\\6=ae>9LpNZu/͐z1} kȌz4kP *rF,wu_'zF1tv= DGnԀJVʳ# Nt;%5˹tχ:vKZǢ~yFSǏg:^w73+ֹS&-%a0DAD ! GD=TDD;%A ! *R$!a-a'RD 97ȟo}Tr{r+0ZUкDdc܄Yd,9ftgg|ˤ j\/3fE^yK#G*foY]/3֮nFPjV3s20y7MY&2͹:צuF^ {@oeS5tuc Ĩro_18kʕEg?;\]B,~bpxaaͯ6_; ú zVbE̞7='Ϭ۵+HZ] ~bơx`ML% BSsN,;<22j+ [7uyA+'n$M{ں]oMtoES]հuGI FYy^ +G7@{؛:1{H#L+/k{[5Xׁ}=Bz$ Vaˆ+P娟_u @s=S̰\S_q[\g@܈μ&7߃Ͼ&с 3#X2m ^8. 殶v?: `zέ=m݅ >Ǩq|. Kfe?4y-E[㧧K#h;YzخlRzuQ>`Fb…C&qYޝ?qk{dQtEtZ8~ka7M?e-sbE;{l(#kx0Y|~{{סt{~%Abv Lbhvoܷ@Gfo٩|i\cpr?mjgL灍?Vad@8Θ9gػպG?{I].b 䙥ux\pv~=K_<iw_>72 a^ ='kW19߇HwipKS5cT!gņfq:*}{I̺Иf\k{51PQ+fWxa) ÿ3432iw7Wׇ `ezΙwz$xn䲡[ o8YAOP2og?m-QA}z QSl{2Xp;?TXs?uZ>d;Pf{#l ,&ƵnsFW*ȅ 2#\3f&r\q~oM7P: bd><\Yg_θ.>3yX/X 3[`{= `uc8!"`33m%Ki ʰݗg:;nH\+wd,T *>#Hl s![^a3!hfyO VҭU15si<9U=.zM5 uuNx.z7ރ*x =?uթtMoT`d65e"+>zR />lS?zbD1OVתd#/lz-!gn͢Ύg2B}JO陣,s{Mz=WAʂ&7B괞okoebi}&v@YG%@y#YKd` ǣ%z6=9&c w +b)b}΃m`!L8㵢+N\mU{l (B iao%HܛV= >oL aL>:›v@E:mځfaS; PbجN!\CgAkp\'cC_(_3_k_\5T5}732ދZC76ǏSǃ8zJM-{nΥr?YfDj|d5_|BɘٓUUA )Sr1SשYsۋ^%{H#}sN| .D'l-p46ld@3;A 13`n8Hρ !T0%H3d{^v0xu/2W4ʙyd`; @l.;*IP?N}4F5 HC+fإ\W7d+apXѶvlO^oQ9ԅ^)b<*1&nv<Ù3Hos6ajWz`kJ(%jv]tnCJ_81w&uN݃Hw> "_=sC&*eG\gW9۷Gm\t+dW]7U5vÐ,lCvX;8*{l0qx/n!2@/l=,3ciS}m+;{^#Otl͆"!fF>+bE^Z05v{ޞ5̨6WoX_j 6fm-ڻO [bѣ0f(؆C׹аDᯏ_m'أLWzcό>1]&of{`L *I1Q>H{Gޏd3Kꆳo JǾRy04{!l%W9^Hqk%@=y[v-QEI#xUPHQE*$hAy]jE)ZE$sN@HBnQRZLX1?SqQP0P>?r5G&Ojs,=Te3/'ۘTIK~ύ 1D=|$_ɢygǪmK@]yW^='_jzbz_3u@Ճ7A!z>_,:x^ CM=jO|-j*@:19۝iLة_G޷'fB=$&DrX]WêW}+SbmٱAҼ!}R,1 bߘY`L yuf.F){oZYمͅ*DQF. ji~ X `+yGRhՕ*W5q\ֺ -:kHlY)XWJǙآlzYf'BZwA!+JD?%anӮ@J"q[\%7>dbL^'&S^XGYP$X#;]y皏=+innUܒjU6:jy.rsdեP nmH;UBdOЙ ?>>ϣea۞Īsx/|NKT!|^.0OZwZSj{p{᾵ݹTP_͜W+E*&t_zӝ+="}4>*FO͢[?̫vQsv^&;zk *{W #t{:swA'9,qelq޻,0_ KyYAf ]]OAuάb.%OtsQ9 }]]g4лQ? X5=d.H\Hιa/|Cr֖[zVޠP ){4PcOڽ^ΨNM*0o_ k.!$Em/@ O!g;;(s=;}]!=|ҺYA H>Y*8d) <8μ4~v>1/GnaO@_+{]0s(fƒoEx*0<1ЄÙkN> |+]'BxG{nΥw.}Q7 EA|`WG࿝2z#$~<ȹ>kɮ`!sh89o&M\*< L >lYLSә N DzH]=<ڲ=$N%0WL>}+^OFH^  (gH׶'GQv? V9 st[g^G1b@6|$} *|M8ٍ%s,=Ƭ~ 5/g_fy3RSlJZz\{~kr҉CMμg?L/$_!\{9=&ȌB.!vLg=/+,كHɂg?5̭m-l㞐{5&?-JYLI'6@"{c^v 5vq Ah5MVB'1|dWwZċ:-"~G<֒m~&q>[F:}ھb!u (b]`X!2W{5WZw[܇!*-9 io{n/@bx$SG.(~ sXN {͘:yCfs{ 8r P&ؖϐA9#Wx̓ P%X#ɶv w D+ R E&BZGs`*+ܠٗb&3qZocx!'|$XiBHpLԗ/{+IFgUlO=%oWs"0g?>csѕ+{Cp/=s-1!YlYj7O!-x;;Pɵl,>U+7??LԎDZ)h 3w7xSZk6 Η}vwEsNז]-RHX=5lܦ=u3œ s*Þl슑pd2nA=:ر{Z|@9j!Hھ|덧"FOBZj˵?JzS<٫yuώ5n"׍/Fv6!uv}ms Gwko~__3ue; () rV3WdN%~sFgF]F(sE{.1.zh5玳ļw-Cr\evo8 2q·$kٞFd:7p[=S,ql ľ8ĵw=8pWPx[}/> ЀNu{u:Byy-!}͂}Z k-Iܖ w]rve7g>P^F?f9?}dp:ʹeZܿ3 nm_Bx~/ Y|U)}H}3=l`}@doKz9њ]TWPܪҿwlk0+-Jj=Qo\duhxsa{op`I m)}}XhiYWA'@u~fa]P4@~@,zm~;k/R~^Ӗ]4|O{F+?;W}^~( ׂUBVg{GU!z[Qw6{X>"5g 8Npְ$~;lGb2Wd[.Ay9ZSsޙg^0k޹!<;ue.z(T_-]; # 69>loe+x?Ll.-; ջرyڳ{<tזk |/iT=Ssv|@'oB;m;sk:Z= XL@poul^} {< ^֟^dE}9w}՚)a/\qE<^hd9z +5$yHkF:C0·G޵5]5P}x3+'6;''&Q#aK=s׺s̷?ry^d+֏U(ED%: "sY cSDžM"U "" h`P| ( ($!yxl>IdsfwP}|IwknFife6Kvj%ٞ?>e3c:+6wQn=$op{*6i"|g;Qkt_v-.}{)Nu*u׶gq)?G_og,ieڧ]laf}@_sБmi'VU&%:9N6aAhCjd{>j#@;Fpt8Ulϙ~,xFcRTHG`M>=<ۼ`}uwXyJ3clCBԤ=K+^9ŭQm^]tqx<kѳ819 &mS rAGܵlzY ]r ݋KqyWrh0&J>kf?(d/^園H#@m"[99eYA&j v/~Vef3@GIΩ/_ #ȹ9W+ U@[{-L׶/J Yəx%όKJZX9+B#Wzʲ=Zꞥ\}myߓpiiHV;4ŭm{%_̌i!j ՉeFrszD!8jjoBo#Zl#1F'u̓l$,[{jsu3곗M%m.9]xƲjqg*s{zٰQgq {WD,jqxkS4 d"NT{{z<;Z5v3cxNڪYP2Hs/jYŌ{z`ʇ`ow &sH]̵ >{F,]aע:Kuke] :hܧϙ52Ulm/=/T,>%P cD2SWU|a";.]y~Rx瓃Av$[{33E)P0/QyUb{k xc{2SlW JjkY T(;V|࿠Ϗ_5x,=g `jBڮOsr|]ou1oVw|NrfyUe58;#v9Hg1D6?,3|7BghUmz`DnOXݬm f$ fv>aG]|fJMQٞqSmCP7z@?N,ݳ wHJCuz43%A\m,0 :᤹X\$x&H\A <JDv$$U=d}uOKTF9mX}ѷ_OBjۣ,\YkX3o!=e闎 _:rĽs'(5A Op.`DY)x?. @ UfjuX-^XZI1,!@gvߪGZeeK7ky+aeuEF$4rݠ#}ωM g<] }(6_nSOk*AfTdڋZgBf<4-[}8cq^M6f^ ndvM=&*3:pH@,jUY 6;o&gPz_Fѧ}{fo2k >lZf[l<\3Bok(=yWCS 07*c౮ .~lѣ9/q}8O *5] B? sCe6.@Qq'gum b΢x<2s>`?#%=G&qLBA}Ԫ2l *.樉D.^L9rq_' 5[ I0b?|U,fޒ  _u!5j{έU-0tL@c`6پo{ 7fޡJXn%q(C5CߞS]N4ԟkd0N5@}-V]mZCP*oq8wB4T<{a/d~Hf'2N?E:"̞!ke:fV'ب탒: z'V^\%aS@Avaa-<[y2'UNvg*cF[?3:{L=&BPyls5z 5s5{ƮiNiN*w>婁7x CM5= eW}",_;9 CdN>lG^O"ӬlmM+(8kZ=I?. ;V+w{`|^>T>Z?!,!4Azel5Η̴fZYsxb2֝/Ƚ,Rxo2VY{?a=yޏ! Yٻ>g׮_Ӱ4u.@!A5Be6-}:^@u~jU-0%A T S6քµ `s3yV@홐[<U O邢@*wySw4"-@PVUxyPAn>@Ϸ# l;UϹ*I;@ȓ,(Nv/?C74Y˓q]%4!WXIvx90YJ g9uԩbХ/\ZYvh 2!|JG=B̼w{Bnְ?S|upvhؽN9__ț gzf'r m0)N50˩:ֺP}pi%q߉<9Wj hzAPک?dvϓO.Fi;D{=μKtS+ rj!3iAWlXwXoӧ_OdG};[ y@ 4{U<t?_xx2B#=A6+nE,`XCaU,E6ʲ<~#oyl:r?_tl{5qh 5qf *Svڕ5{s(>K0֤A5zҪrEz߯;S-d!̥ųMHOB[=:1TgC4uE_@ 12-Fɓ{NA`:z^b0 |i]Bi->mȓrd4'Ūvfg!|@>3d`8tDp{Og֜ުߋѩ hT*k P06njl5/xAAZT xf|s4Zџ\B-3}Ak,櫟}硸9'x/݀J~/gesr#m*/#B> w{UJ!x܁ɭt$/U'dN.i1z$ya .csPS=B4gT(^wb0g-drh E16 zC2M]>7fF2w#4nܖA}[g\ DŽnxjU|l8dο ͆_0}){14^I? fma?nJ3~oAQ/5Ŋ%4pQQO1k{\nf̐>쩧,yl߅w dY\cnG }(q3kes~0{$/Sr,!OJ_܂].8O^BػZDe6nHCwDk 1^^օ*v ոSwnѳTY ji3߀;Nb®r(z#=C&TeC`osLv].#Ռ̂k͇rc>~sǘk9nr@Ɇ1ݢOuu} ղo438yhrOfL TmF~*ծw!c6cq}?;Ԉǹ}OT@w!}(w5~=s,)U 1-}$vػͺɷ@GtI?Wfa橝ڣFVwEvWOM:W? P>7W0_㾪Q-jv;f IK0y6@p T= [N@u̹ a/2ӜTʴ7jG˞/kx7o?&JqG©q dAdm5jowHS;Y\CzYj*0[: zeپ>y~.HG5YCxl):heogAx~/#}D;?rڐ=┦ ڇ91[!gԗ=^Z`k[c=%P {>gio"g*LXkPaԲkЦݕ][Sq~TJ~V>Lڌ|t%pM(͎<]V,=K+c3k=]Kr8iMj'O!n聋Oq/MU\#yXpxA*xVgJkn >X5تZZȮv.x]?oqGW)Qfo|_ZYr٣fQܗLSU|I%-wR{l\r9=yh1k6]?6< Uu>5 =_`34XΞ2q b/HzsQw{_Wq0)n6eln yz=@pmGgobz`o5BvMUi"Ϭ2C 3ʲYa1tglGn*7فEK0fcVw[Tڨoz$7/y @`_# wxʕ۳WkLHn;1^U6~U:!8҉-עJ.yUU>,arL5;;d)F\> dTUt6"cfR}!0|O n+˵BP|KP ,rOjhw>*3i:Ί悏VOtPOvnv;dfLiGz 6¬UmZG@`}-f dǪ5V[}hDLt-5yIm]U٘͂ :y פ/Rv]2z7O䥇 4 x!o#,o3ٮ@d[{ wlHϳ0s&zsMj͸,ۖt"0 f]^^zWc3P훑(h3YX ogU{$؇ Fك܏TI8ql&A>ekna9#~oY!̹L@mmojQ*h.{ չ|A*נ1RE͞l &BOe +=NFSE U]c5 ZU.#xwIo5FO=㬙Q2sW@ ]k2E\{sWX^Yt,gaY@5X=KfWu \>قn=<3{*s%;߁b~X Ϫ*}mG ؃~Y=j9@O`S@r%#3~ڃ?r T=Q{5k6GjsHF}|{!5 6 ց e?q#8/ ;cF\v͞l :*Z?iJ'zO׃E¬nz^u?k}(\gT_5J/l ϊcp/}U:8w!|do1"ޞF e; YwE x| hʌf 0MH@i} D Ϋr~/L9J9R0?Xkپܷ!j15y2{&J#mS8q}T3ēFwϨWꯓUUeCFȾ]#+:# >~"e_Pp.n+9G_4=BU6:ζsNvb/WqZrMU}б$'(;9e`$߬K㤩>cE R:ISUt%.+gc]Qsw䦪<P@ZANS 's݂J:7L>R˰N}1cd=@Ibdj'Kv2n_KHJggтOCy ڲM=(sL^Ud;:flDZg>X R kY"C5:BsׇY ocY ͺ@!P+gARdxc9Q>mttn}SreϜ[ҹϺ Ȋy-{pO C1vVcPm&R>ۏ-&TmkgUͽ9 ȢlU Ki[Al,2( GZAh!U7ڴ$lEY""Ҥ(ڴ҈8{–c_ꭜÑ+и`("g’~n#w0\\ǁ{EKXq2sM=oۀCQtg qPrQ)^AΊg)*beTh3QT~C)9N"R^#)'WuQΛTn}H Lx}1&w٧&3 V70<+Sh̃3Nz^ǁn. +ޅPVT2{4Q؆ܧڠn0df%W𜺯vhi|&P|u3]vwU>9YS 2g:g\I;ZZ0 BeM{@қ::iO6-5oꒄuuӹm>XUQ̙iXms&U!WuȀ^rl.{ں#(rد{0M!>Ρ}ec~ ڏFA0NF'w\tʁ5I00KA9٫3: |d8橂Ͻv#>C/FngҜYiۭĊSŸ&4ʬRXx~rE/oušCg:V(jU]bEm=/.}PPu;pf-2`(rDUc^ONW^펜Y0xfOrWnEƠ)Y)싒QE$::ݥoe#a'oBT2b!MQeS#^9(P, r&tЭ(j]QX+v?}56҈y$ l/{{U!Ɖ#dZYczh.X%e#pٛwW\g2+<깸Zઙ(k=\fbOqdFu'~otXj~_FXV짿vTfzwsϳnQ%>}@zYC9d5Xvۿ߇K"M'~g#ϷyZzF-aV&^rQ#k@@WR앆0tHfFW.39=mtqF#Y=OQmV>~(`v2<{ZW5Fo2P5|dO!<9=珅9,9S˰kkWNƒKSM_r/a( ~!V#s琛 ɾ_rI)$ r_ yL(.,(vg7ի}Kunbڹ}r7{:xc]Cq8'׫^="OJʀ*.9@g^N.ޮu5)z(.KyG ߫^qCCSo FS= Z (`{tţTtx5ݢv*}( P󼣻9'Rmċx$QU-;/(UdW+x(ޝuU.&,_ޮW=^xu sdG0$}J^QX=J{4KN{خr{_%Y[=%UB|Uμ;A`Tl(9;S:ί ~E1#;]w*]/G]!YśtbY(~zMkiIBQj} 0Gm3>z{LvW>>eRݬ3I|A VWէϓv>QrEB9.ijPzK  Qٍj?WǧfzDY(m'gUfxj=xiB of^qAh KSYQk)zY AsԚ{Dl'K٩3Rۚ &R$YNQ+wq*gX6~+վ̪+BwUZ] Zvf^'G'X#5>ɔr&x{ڻ7 څ T~WߗLpydR_ڝ[H6# S{Akw0?EzA<7jЍ^{@{= T=s_/AWd= S]aY2[;:.! Phu]b}ɹz몮s=Vxr⌢=HT]*-8LϜ$#n G3>\3Σ8 zSdG4NWϽEZs)Eg/%^Q!xa\f-(O9sg K'(ϩd8Z>$FU3#dV=<۷m G)EU'+̿c\Н޼@boܒT2sz/WW&g̕Zsb]0'>( H>OܧdLʡGLzsݰ /ҝ=ԑզoߏ !r2u'Ļޝ2~+eadL&8BeZjZapQ~- 4Ci>)ѤNN6%LEXu3>SܽS>]0nL!&2q"gdrgd}`  k ;8vŧ.U[6#{DfM98z̙b8=]9]2卲^i,5eZ~*݇1)/{٣/ av5> 2=>P#8#7q12gaO__bSc՛uN#k|e> P*X yUYmoPaW|E^ ;߂u2$#wW=^)6mQxd^wuZ݉ET&45f!Zf@( s)/[ik1`)E7m>{Vg?w~~Ñ32,(3|#l_ibYPnb(&L zuN00!1 +3yb0k3ݺKn $[/ ocA@ȇi^VqW܂0`|Kyp,q{0nLz.F Yrv2kZb x1I+vMs3sσw áCײzEwbwx;Omf ~Ҕq.vht/34iz4֝| y?<ki,:Ktֽ**}&mǭh4kq+(3C*}&9 EsM`[M?Sk}MNmֺo7v>GP>S'*fL L-iunWwm9 E1qq}-3aR2!{93fo<< ve;eH{|+0uD`$7Fn_+< sdvcܤP5}cic3:.vw#C!E<2u_ 2ftH3xCݲts>ƍfa}{"P,]s se},jwƧ; 4Nj Zil>d^_^p`7Сi1#^g&-sep@% 2O.҂=9ifiܸwaRXPYxr7YP1?/CsARO&0Dȴ|s7bD*LrkiݮT{ԁ2z8~=gbNy.鹌ືMC=߼ᅮ_SwDs81K;Nbub\ #A܀8jIu:E!PSv bkŤω /`$=M'!M2O2qBu9眀ucUN30k,;k^ ,ä4@i77XsᗘpCh\3!gTجCײ1%#0n:۪MӀ:#{2dYoA!Ҫ&00G#<{4s ȷsm{0neΌCGI᳻y('6i,+iYPv VӆT㴠t#=eu+"@[1u!r֮o8MWc*<|-Йw Ƅ@}~濄O"^4(sf譈v$toŬ yz`h ]= YƁ t]\<B`+^Y|pRz>3ub #}u:^P4*C_c%"C%u Vk9zfcaQHHZZN^bư@d^Pu~{Կm;0j5(1T1e?|"* NhxL ⌼ YRVJ&a\vn8YCCPN숸_nkρz,8;0+vhY{4#-H3NEk0 }O=F<vJ3P. ϠW!ϼuB'3 sK1c4龜O$`;ⅳO"se1 )v O iIS~l27ߋYXtjP_^*dL+܏.|+KUsys&u嘧Gu z"M:~ B H4ݮϿNwu ,.}8UyW\{ͯ z-Ŵ5Tk }¥s=m+DKG'-Z/I{Z#׃Ig4b i:[ӊרx]8J*N{2JJsYP>ʊ?DqFĬ(S @9kY|0c)#q7aacxbP` yXq'+vHmTW/)}@[x 8?oHu s ه9ϬJx_Ό^B3EzJh#7P \2cȈh.q .R¨c ?UpI[l.B~*z1>:I`yEgeu3 6E+!!!=8\vv5uBJ3Ic~ǡ sXzroЯE7 onFŃ1}9sLNRؾ?G0 ݕuy\q%`,!wT{i7pt#?|c>8s0 kiݽ3u11 K@oPT;``\T F܎PSGp5w,xz>sLH7x(3}u'xOuh :K^Ђv+v(Yq'ځ P8)W XiFKr@#!x8 \ YOŨOx{p_QWcǰlF3f ]3թeAײ]7Gp<;γILҜ|mI=Y9'!$TrpݩgUg`љvu==WqZL zX {z^3iכkXfnAp(\އ=\1.xM_I6q p6$,:9r׫ Tn W]{<'HXa'Ap:"c&v_ʷe*=YXn v Һ[Λg`HȑZx3ͼrF{zEi df' ikґWYҺB]`9_;I(s;UR10ӊ% m= y{fݪc qP#{b(/Z9dWL#&.} ]?ۉviL~{u]+1}`cRD 'KJJ; ;H|R40 &cՙf*AZiz8pmX xw RB݁s*sy^:3,^P^)̜ 0D/kERmUj*Qc0m6fM?\QhF,3W]0YP׿>fO!LC}mea8 fVbs-ʷΦ" pIiO`4ZI{|Lr/6yAmأC–J{Gu C 4&M#>'56of1cwK;2Pˌ9k}. [obXlc]YgYhg?:XkQcKvoX fT02XV/{b2ֳs1Ls~yqHqt1xNc#ȷC]}ʮ5v)-ߍ_{^؃Z إy1#`wA0{Y o٧3_.ǖD8,rb1cvlvM^T dΌGt/iȉ{i 9h CCUYCjX4:cbsgIʋpa89A왴ݮ#ɠq+@=/ {-~HnWEz˸''`-~cwlQvﻌ|7V0=<Ҁp.?? *w |6|H38WLfTon 8*(M9sU[/dҎ@ckl׶dP9+g¯)NiGN;}WDbUyAIO&PeaǠjTgxG xE$;%ϾJ|5u/IW5r"P7GOYJm~\-cϖO=m[I~uWU./y~*=I,{nm%yk+^|Z8R˯!ҩuZ g;kژ W!U({Ǟ$'Iy8 X|5G](ϮutDEa8^yFoEi{BW]2ھgbΜUZl޻NDk' m*8' deG_)c/*?kXƟJ9yF&CMO@u1q8 $#PL4?5wX#%`}k5ڂokgW"1{:뽠]\>~rfl \Ɓ(#%3FO=V}Ȥ7J$fbCPH yfrQ3L2^ ȁ _8; wuVm/-5X?^\ Rꭸr_IKNg%鲷w:kۭ@D\WK έ^+N|S S&SoFoN'PtGCijl~O0zf2N@poGk TA}:xC$=2P$P Qc!\·y$ΣuGwJ~cޯ-u#LЫCjH=m)!*~cI=" %}+ľz}ys&hUfJM!§ߊ0H~+ւ~]_*} ̾nʜ VFg@*^pp P1b eBuD=ͅ_cWY\ynb!} Bғ&~gYgC|ϭl]ް wd6@?ޅq,'j9yNM0$˘'w*'sEYC%@5@%q͗L㏮%(͵DqxLeVo~ ']_v繽~4ۗ&By~䄖if T.P3sr& iW{Mwpxj=:WI%@]Z7"PӎYuAU+_=75<`ٰWH7I> }$'<~aU5>d23淆;rM~xG.v#.l+.PU4Jxǃ{JgG\*."^WGZx@F0JCG#7h{ gEB{^ l75 _U.g'Bx{-c'm\>~y|ssK4rFAսPQvpܘYYyvpgG?A~LX^i}IUgI`|\Inph?EfW~?Uَf%hiL79Bo!~ojnyVy@ssdg1K(l+:<:Pe -mP^DL,5`טD$eo#Gcg6ZbWif'l2Ցmw{@Mcs϶_ٵD1#ԙ{VV~WyY3cnkrco=al}OґL(pe_i5f}rYh8?C$G6jƾl(LўSb?MHMfxX'mʲwC(\Hf g+e%Hۖ]޲Y0dPؓo=!*(Hcv^24$mgt1፳roN,c|} 0zpƚ `w?|iW]0(>wM>*kJH-sskXYvxλ"#]⫀>gLϦ@|azO>.Ʈ׎j'̓Ջ'p]#efze{{`ğb. 4Ҫrؙ Q>zlECed~}A/>iK4}fB(ȌI]j战sǢg+l sy= ̹* ͸|ju5;cOiC!w(#Qv 4ueם܏19KӲ gc_Uz"?Xl37rO reSþD:rނe&#W>'5UِY= O<^YvF i9._Cxy/ ikŷHC i{Z:wk4y=YeAf1d\?pnq<#&Ѡ2[v{3{dc ȿm {yk lC߶ fׂǛvew ]d׽Gd| =1==#)~R?y "Δ6NA䬸%gƜ\.3 eQm5;qH/Vv\xwè=eװyj; i"gȼ^h(?uYYwc+8cWz=ggo2,{#lݷtM{y{^E!S`R,zVFEù_$rPg-OH39OɑLjarcne%CțI,yV.;vvWC6^gUe[ʰ!q9stյ4yzQK%[Mp F-k-˖KMw pΆЎd guF^Yv]ɐ~WwId$ys+,9=\ rHsjyԂ=âbp䐭׳XibX5c XfM-=dЖIXiW87y&#iځP7]AO;HgY* *ˆ_8_-C'Ş=grUe9j@>uj]{8/ -p,7FsP65Rjb=y#}- / Ha[۽ z v7({vO9GbL E0 `*Av2lIi84Ll k!{ 2C~!PCXԂ+g[H229spC%CVXvN5z?-!mz0z{ ݢ}0J '/8yhvָ#e/^$s׎E0kϑ{cY=R*j$?,!7{oF]UrޙFNsԵuWiv]ˡ34zivXNm5/MӴ^Uk!dFXi i !_m |%Q!k9uԁ< ۨ}n͢/,=L5^84>&*T!(h!!$(;&"Uf 2K'T$7M` U"S e漳o}xG>I|G_aPf=/1+R Mװm%/2oG+|T >cx;;rVj{ʩ>͏h>(ۚ ;VlƤ8͓CyyP{<4+^zXSġݗŤ[NKz=‡֝*5]/v;Ӟ OM[\sPJJ|m\o+lݷva YyRii5m (ko{[hz[m;Hj:13u ̚FVM }n0r3ނ)ӯ=C5;@0?+|r&I?mH,Y k?&;ej9Q;j~|3ػܢv#*E|{1}7D¬}nVf'ۺ>m@=*;^~@K _3z@oPy`+&Lvޡ`ı-RRB9;_??~اHB';6aPZy I McӐRKqiD{ |'^4ƥ⣅Co`IkkaǬlVBJOK\wGd-#٢*zXwÓj[yCx-5} H@;c߱Ƕ{Q'C)_ՊR&J Bt} ^ܓDG{ͽսj9+zI x1+M_3XJt9Yfi5~9Y!>lkȼ 3Mu ^*fH?j<>dl yCB;B&{`́:]6J'߄}m߸͛{;oP牻n0zOXwÄ![ >fόMϣrVdہfUg=|rY!4ҭԁqiȪW{:kuo!n#]s3egYӌ}BLlqbj́x e6>(~F4w|,l嬲\;aΐ3MvSw1h('y.;&x>G Iw&2A)\n̟ъ^wb滝 na?̕c)fg۪nD8nufѺewMuWD - 'hww@`T) gXP[Q {VMv}d?Oe29g/QkibfLD%<{Y ߛp&oڍzhFqPDt{cXRp3g<;m^.aA }Wy< *c=Fųѽ*.#;Z *iU~ /6njaﲇZ*wzs;/:'p߀ 5W?8x3VE Wj;cepC&L˙'wSv>BF agakfxWcoμP/KLjUF*A !".QuC.g+[*,br^v.n5-b0 ҌcsszXwzj/+W$#{2P캬XwϨeQsѿrhb򑖘Ɯko-yeB& Cā;q.8wxXs$teoe+RJFO0'’ua PO3BRSB i=O>d7qWC3/38vIۧ->H#jT7^!3C"tg0|a+Թ,ϓv7Ls>m^QAkS@݆访 }\ `۞d7? uuq sYix&LuC͉7tL; n3 <(3]}nV_3͒zJM=mG?5TDᗬc۵Jhm7,Ldž~i98mmBߓWkN 搦Wܧ=21_ǒ޶4'"g /3t10}v[CQ뵙f՘P1;g~S.0+Wvp^*XXi _y]5GbLaC30t-5ٍ5j(eP@ܱw(2#ݮS!ֵS1tѽ(ݱ׳)cp^ pDz !{'^sVΘMc?A tv 9yT/yRaI| K3d=`G THAG(LFfn7q X uVn}lvтe*;Zt;bi {Lne|h7P=f ,Ły.ƺC K}dMFeoO`_5`Ե{TNKMtXUmꝱ!wFkA?V!!:JfS|fD#-E'Ld/tLBG펩m\|38{~*'Hwhz TfQN BU Y"2LM^S³v(21pXC#_ ܅?@|s*3 k0Xbl);>.9^$]q i}Ec;4.p%+^g~w%s^ypkP\t[gp7LU= q/1~tx(={{?e8pT,`*뎱+GNA*}m {b4{fo]:7}C]Pݹ@^1z1# ] 8ͽwi,m=:Lf.4BZMJ~9f$ۄcA.,*7}SPջ?ȞfLv _IVdJrxOhBᶘտRRS#|Fq*}Z4*ojV,[ı@v&QY꽲mn,,ٰQvi%UBJ* (Ӏ R AdH#*6m(hj*ݬnHVl=^eqN(wwoRIBp/s7ٸԃ pHԗC<7y&=Uva1cV;>ڽldT|!C2\4csvUTA }PJ3pg*]˲7~FԪq+ >OjL5P| rϤK@*9}LYn >?9VM7lv4UY^p=!.S qBH =թiWU6 oR7ut8w}zL|R7V+PLQN}N٭TYv>7>ީ\K^X #`*swCߡ}TsXX <X(ϮXLה2.ZwJ k uc@[S(صd:P|7#1{O,d'P{TzRPZ[ ]g? <#*|3]1N{Ve/ h\ClԍzVaeG~mU+tĊ&Ho:;}sCw<Üщ|8vTKX5|z`=ٓedn\w]?:Ppz#91m@O\'qKR$^П_\˽ROߗ1o!{ZT'uiכ}y΁ῂN$`0` kJWl@Kqd)LYs}7A"9S2krH`TeC - ̺\Uf2_~=D]'!ںQs+]Trx]6`GuuldVeCl{1W/{> Wv'2ڂhwDozGe/0ʕkA?<gQf+g4ULs BR%{vvQ"yj%ٮOt :xb"D3x5y* z-}ŢIa{Q/{ h?9;8[vm~W:]p f02sR|  jDc1uVg~;bP[Z1~+w`5 #~gM=)LUav sAIwRrxw*W!Pֹ>^<>~ 5*s5qz&HԷkO[=^{u7/Z{nɉ1Өo\>>gx+WV߳Bs$zO*s!q/DV7դPC=9ɽت~o1@ꛖ٣!>- hGo]ש2I5s`ҏ}3)S BUf2(,nV~yfU KDy_bP*k!@Gby<;x ^i*>?D;w+s 1v,;V= j>LT;'YTS/;'u#_I~`߽[`0HzÜQ+١&&TkvMi*˭&P#m V@A*e6;.#F=I3m:PO|=W%BRDR3.\>: 'OTcfy+$_V%՗z0o_ 1/0-?4oN u/6+оl([s3Ƭ573}yylk}O6 c Y=T墾O#>)|ZߥC<#p6wEN/_ʶ<躯{ r[Nȃ Tk|@¿߯j[C݂J3A|xGlG}?1+"T]~m^-w,>y12xDr-ʲ!dp]G'䞽*#c\|ȗf@$.~^Rj0m왳l|t,͊/\k56w)Y?{C*\ g_U6.ߣawa}Wr z:X?Ja{-խ0 ٗ:H!֔?&c0Sit_4XPR8V}U٘>=j _;,#o_ 7^u3wo*Wx0C0Mf%e{w}akڗ×F5]{OYvAxj*IRop.I1TYvF6E l%P-3ﳕFmHmϔdUogxY0x{,;-mS xqԩdkkG({vf/6$ڴP H+.uB]U/zKxrd]^7O{ɯEoʕlkg 5IbSqQu fZ<{9J}s1{> sYyƵn+vgNDyz,psmϕe<0ҁBC#]2䙖|m;0AԬ:u[ٖ߼Vq0_kZ וCg@ēyL>yn/w}n̪5F=a{z=aOU6f^G4Anp0m(R'y>CM\+!Le]{ZNckhw?J'0n>h֠Pf? &A=TEVC=͊B &ZAA?V ɘhq8Vj2Jg6[`AIBǭ\k@Y"`HxU}U i P{m` Hq̸o^tf`#~S -!JqP)%nA{r`sE}om];Js]2`tT*XJR1 0+ ;ɵ54o- L"{1 I\U6D9~ ,&rPG^9ʾO$<Uc0jǗc RUywVB]|!c֪Bj5-)^ q W.~_F}zw:=] tTeNUAXA%;4 !"^!ЂATP@pAPTCQVEUUBXN bYpJ6{{E%jOkηܛsTj[){.EkaW7]jͅvEnU A#%Hef27YLq_O W"&]`DhN@Vh}fLь} !/!"Sҝuqt/e"Ak&+= f]MǃO6q m'S:Ǟ!1,-'gwΡb)HnVw;8f,ߌEH}8yxcׇV Ah_ ,瞯E+vB,`7cfVvFm¸W0 x!OAǨMyan󽫐KH~_ji}cyN,nx%!@;8m+,IœٷI_/+܊'چ7;K /̠uִ?g|yJ{,6m%uwD(3^|~J&-b!8-#_g{G.9{KS]7[A[F{vq (<^lE D3g\'޵ﺠ]Wos]fxgntoL н%c{|TO^>u Oס{LŜ\I;UӟZf(=k6nd y2K0~?{2Vn_'u3f.dt{yeS+yys`NB}3<'3mkFy, \(vTgs.s)}?OS&lkH/ZI@Ls۽-?u?nwW/XRcVfLG?O738͏͔=vG+P#$:<U 730e\^p5YiN=] ;]g1(kK3ݨMPq|ֺgZ=4%V//!m:f1eod{95sn[$4}xD!cڇ-XhWU7aƤ2'5oj`tRV!r0wA)ӝ kON^<3`jk3?@33#lz%ײy=0MG' *X5ȘrkK;t79ml 0k8u<#|0w؝:2'r?3:ßw=gC#w]4ـ<Wz7MƤX 34٣\J+3'A.f}BR+u4 vWjL͹ueʺ=]P1L'AeA^h&rJ?&nԧe X1`k\wBvqKpp:LˎּwE-exRfD<1sfU]_glt Leyu;G`̈́;NwW< r K1|) <]4AE^ 惏aNI1ϤUA3>t G̺azUb(+nŔ9[1srP3sG?3n Bs5 림3`$Đ+.̝KKY}9k /ۙS^01^̝fD^#WLigH +Ug=6 t贎!0؉+Z^v'gGKZ^ԛ+Xc9 yexnAUܶv@+DW͜wtUCd@x0b}:1|n/^38(0p= ?ŌvA o\Q=IΓ aJDX{ϳ.wWR}ЃdXvh7y=4؏a58~dpL]tw/:q`GhbkSUvp߽V 93Ut64ܛ٢G&֘C[s+Wqˈg[yʺOu1<9:̜s3l+e`-78rb֜3~6?_ρecoφs@^;- me`:`?zOdFF꯻[Z߆/Q++wGZ98r}4W+ݎ{cwì#Ϥnz|OH5{t\>3;*j г`pQ:@U7lI{f¸H 3_ɓe^=ǰW7UL]^yzG}UݘtZjz;bYw53#V o7m# @z최1khS9Pq5L]Ոۯ 3ӕ?ǃfOYIvl9Zn=)&uݻs VyWx'YĔ>o癗`75܋>nv%1F;a8n9HͦgPk.ϔu{h''.ݘ!Hy(뮸 9Ԇ~a"d.;:1hÕmyjуEtej5s%+:᤿Mb1ځ-,},̽|< ^V]3Dy@g_yލJ.O53&'b1{7bSnۑu0`7?}"bս|0tD9DwB iZf6H3fݶx?k]̌ayMķ^r-!I XZE׬[ 5k<&^,s-m uw{ھ9=΀Aʺ.\w]όCm0~f3)펾.Bͪ1a_XK Yʺ˗+~>r:m{V @Sӕ޳3ˮm爺EȚF~_Ѥ7?8Ee2 08=in;{|`[<&|>-럇ճ4˚rUh͵P7fL>H34UҽzB [C?ڇ3\n0 fm~Xw܃>eZf/Ⱥz44@S5pu|ӆ@edbBypj=lykѦ-N]+>ћn=n(P5'Vl$n´c@MasbiGU7䵮zhI-x-(}im6Mܚ%{=:+IDŽG(Lg_KނQ{a|z gs/xG/CUK u{-H2Cq8;pRLCRp[,r?wxUAԪ>+Gpp+{&6u=}xʛɅxݢpɅpSK#@:.s0P=H2<>hd2Fg;w$BTlAʢ ߑt/oGx/R+~K^KFx7F&, "tclx*v ҋ @#n2^:/Vx?5GG"D\g0gf-6re5)Ǡ+ 1&L8Ksai% dDo~.xù2}Y~$2Dvb*muPV ƀ窺1ᛯ zu5VWc[qu'ECѸm˻H !3ut``?P[ Caڷ .k9h&|9k35'`4ggKZI>6/oav@U'@G#0i^Yw lY{KCXd`.ZU/zi*W3%0xư2Ҝ)>-nEXOUl)~z2SӪЕVG$;.&{,tRR([M/kWVc&-JfeBR<CW*A#Nͮ6,)^#Kv1"3 "F)}Sg뺯~y[|:zrecɱLD3]i o}уX2 ,am> o5Xܐ%қA8@qwle>۶+`UڶP%ʟlG,_TEڠ |0[qj6'_ k؛䫌/&YʡN=XDȀkю3\˖e?$iq qkFfawm@.`kK93zre,"kPGæH \MV[ c#d DCD>#f@reǟ^Ŝ(7{s}|Vsu{xgzv v7l㬅ϑc؎rovO?$l|=c.l*f쨃;d=c:[BY8EOfs<0 wm}6{,#~c-jդ,owyZ6{x=^xY>K9dB$j;kXHbUo}p NoD5GI{KHgc̡` {>ΜPܑZz2X0扚jmvjU->7(ͳc9t\۾B?h^FH8dɎ T7΀[SNwg ~@ܪc{wX ~ד-{Ss `t,NylONz٨)6yKTl΢vv=,ձO.٭ I5 [-ղd= IX$$pdSv[ɑzMcW9x>$W:3m$Gƛis4J{{?avBE8:${ܷ=[ :vR)!dCR2} x-8mbeɶ3!tiꑰsI(te}7b9Ke^}2tᙞ\l t܏ 4 LEk+_JeHb9`9} ߾Єce{-Fk8-B7vZG=G}} h>#-;|c? ,T(.B\ތH0be+P ydǝ>ݨY_oY?Y K@Y+Wr!qx(t WZ|")}ki;Gb߄$z^SsәV*eߘъtya#5]PGYG6V E^!jQo#Ȗ-M/ MP<u+4z,f:|^dܶwOu9Q]N=Q1QnwqD=bvg{@Zx? BQTMgfKE~-88jZj'`0~GU#74'[vw_Co*ɫ@Թ4 v-Ȁú12Lz- f!QB(|e7s^sHE4Hn^_rdCos:֎W }0X\3y 25/Xw&UYGx~f?:;d%Q D4v$칯Ͻj5!h4_܏\@Z\8X 6n{/Õk$^m\+ՔV+0vz{p:jx 90$2T/{<{8 h bk Q'%=%ZQg?7go f jَܶPc{v]mќ؟J{)y´pfQV $Cݺ0CfIvi1#Nbh^w\hG<$H$Ms=e>܀K34#64SA3BÆ[ٌjٲGE׃`E1t梆/A8Wg"=eN-1[C":`=h8Q녧q3U!AlVm{ 5A~]Q{hCʃbk+(K =6-Ŏ=8i) F'BnjSA*1)ݐI.(<~50f8I'eύs!?<0sCzM$MH^{OukuJ(9xu}!q{UbahHvͷ8>l^W祚el*4̂ [^ZZ'=CcVwܽj^"04g&`ꖏ;F#/,k9 eh2znϒ^wL ugƈL঱9$Y1!BՇ^}xFdל .Ab![T [g!-8iVO;5} NiddM.[vNjB|Cf&7 ѯJ!/+lu{ l4}8H597B~"۽pǨ'xIlV~'f'}1eP@JP&\xk,u`/'jҍWאȗ%7 Yᡜ%u2;pO7+=SK' |<.1JТۢ][Fp >Ï+ ;C\E^V@;\NE :>duHulV׌3}*8Η}=p'8rXL| ОO?=<41]`h8pW>GL6v^wV)`nQ0~LP߰х4q@{t'l(FgS~ЩGlcT3j۔Ak97z..Ftw:XRP.'ܱkoCie2 $0j,n6/n,XDZᢩȑ+Z#zOqjѩg\,B~ Rq,l'{MhqqEo/AP5^폶f=F˱pÖq` \^|qjJt diV?gQEC|P}aq[vo F,5"p4yR,o чQj}z_z@eh^^+ ޅݲ݇;T-qcyNޟ,S}ŌL,_' l =HZܠc1UmKAUgkyXȨ=y TYy1-bI9f6e| RV}nq{^#? ɭ?/gn\+}lN.輺Z~#0e~4=0z?|i:j2VgmA8o7hYzC+N`Cj1wTB{=ǃPlmGrhIirx\ZřV6O1V?~yF K zt kyNsVp6]OPeaLLЩ9jF~ghKIۃu %,]&~ Uj<7!]Q0\k7QM7C}^خ(9rE3]t%p. ZPfhe;-L^x-[Fo}W_(0M譣  Yz}\ g{dUN@cW]Lt}ѩW*sBVpm TԕZ\6:Z;1F\p(ß\E5Hp+R>ǙhClǥݰ7c]c^%|J߭E{SG,v3dE5*EU)eNFմupm!ԦG`a=RU>kVSS!QJ)4]3MJ+~$jQhjP4(QFѓWw?/c~k>_s=>\L-u86v/BynhmU+|idh:ډq[E7E?S^ȍ~"1u(1XlC';vRe!<9(=LwEEfFx8A۲CY߲9{#uP,2w<0M>&΄Ka=x3WfI[:FBY8 e]^o .ۂ+L{P@֢JrVZq #}ͰW9eRVԄA;$g(2~+kNޘs CEa8o 5|Q(rex3 nai8Sz?4.yb#kMϋC9@ʠ8!9Cq8tp"\y+`U~8C۠u j} `q<.^Gwq  OSow`x#zCj|󋀨p^#n Oap`KwD}{ _̓b\P= QAq<-FH *!6[绠#:P41-ⲉh\t?_14.@w6^w0Isz5Wi0 ׬gʟ=7 Ghz"P gu68b>Ocx~=4u^CiN 9]]aA}C) Zͷt\&'67Q}2s:cQ@& CwG"4 msvW+WU\F%^-TwQn q];#6@} 1x_(pn_֕ɐYJ먏AkmEz\ivI_Ra+_t s-/hLnyR K*=(`/P<$*PF-D@1xsKQD KR -K8)Y.)XﯞϟW|"W(8b! SGWN 5F N}w>KEGf3Yy&khiRNe(]I9S@)FN=5h`Xϡ⛮)-Ze*[\mV*ԞVIen{< 0Qm*uF͂XȍτK]0dT V-`2QQ8Du FپQjr.bnm@ۯQߝ=EsWB.;G똪b_BkQ,#rCet=(}j75v"ji8t;UzsH4FjKf?XH'e-,,QD|.N40pk>̓$+}i=6S w<YЮZ~x i`PvH)[RPsM?ȵH4~m޿c-x}HDP QSx,Fu=5"1].4&8 DCIW4s,IW+B@H-%4fr Yo|6<%cz]6B94'Ĕ<o)(;LyF5F8W Шg&$` VA, ڧ6c5`a,9N4F3WReݚ5$`j^tEV**̟(e7EEG%=t1Io/` TKGgYD8D<2|is 23vQZn:4c5-1-;y;`-ovŹ.evED&c$7 =][[{ !G s\DUr+%ZjMbǗu/q!QjӃMȮ;f r/ 1D<,i [$) 1Ra_j;=eJHڌ'7ZCgxG/NʐN&9 ɷ=BXmi&sl K<=^|1䰯82hINڝ@[̿ESYbV4I"O7+S.pw9mRN\L鲖 3bfoH{raQכ05nɍHʃ[H0_^e7E<>.AXΏnd[%äO6^2R[:k="ZL^;3Lj{V(66SZS =JlNWpm9\:c9ɼYLt%:Dn>ݹLLN} f~ʠSYvS2{ntr2ÖRHtWWdXn,~a4Niϖ?Cg@|ft8(uN i-emgу,SW g٢n0ISXLZsM{EWk5XG#"*u2dg6_L&_ђLN6_&rS!T뿰^vYۜ0g+ UZj|So'UlG C!S_ M}YdsɺIV 1:Ī©+s-jz/-T͝MViȽeq$nĿпIeb+p*"KwBv9{?划Z4j5(N $ ^"3Β-:mˆ?aghbmLsD<^3uIm~]8A0QbKUcɬ_j,{K2`<}p{L8 #^8{\*2**r("KV˒Vќ5fSXTZN!E1_QD9 Kw]ݯ o_x=^?UByvTsGa?\9<꟞nO~r\:c.7іdL{!jGbrRh+jcXk-֤&E@F j9jLlJ\,RSo-i8g՜P)[56eWs[\sy|ڎ~FlIQԀm3(Muwb"h㳷IUJBv?g]H|rf yp=:6@-j#F&s'I*9XsHci8uA!v3fʩqx>$``35`SWIy45pqwH$m\3&swlމ~Fd%}ofI?B, O:өGR$p+mcot>uiMʥb-Y~s[>o<7+E[$Og܉tT:jt3/IT~ 9/)I`ԋZ*:p66Z1k$0\oPnO H*m͈et)ԤpORYJD;$s+[݈^%Q#n3oE.ެUPșgI7ėmTT_f ;\&5)O+L"T^]F{bu<?S%̬d7ǿwF'e5w$xIYlb}}ASR CuNgP6 Tsrm932t'SUl:OOe&Q;)qtA|޻4}:ŽzZjZjZjZjZjZjZjmq甖"O;eEfqK0Ce瑼]lp@xv]- \͸͍kaBJ{`D*9!]`ɬ gtq3:#VT G'/Mjla!`u V-C0Ч$ui-5 x18}"y3q]]Wd,z{?#Ēϔ)[; n=m:FxңPᅕbS`z:b F= Bm=+ l;WAaÀ:絃Z~} jx^e /? ̰B͵P2urGn透]\  Vݫf A%vkb4?WɽVpb1EGYdq~SX鱕lU&S)ow)@f|{ls<s/ygNlZ<6=+гn>^\ON)G FG ^o/!t%zxPO6a }l_͜յ{ Ӟ`j*=DƞkǙ]õʙ`߭*Ě-nA@zMoRu^.[sĝf^96v'lHzl`=#*o[W5iON s{4渘huۣׯ[]-ǟ!#w5~1cS\9 =n\9~` v˽o>X6W-/i7 %єZ`'cyR^=VѤjt=$7> .|i;>8v ]]9S+gGψ.7ʏ(bTm\|\ YZ{nTId`) 'K\M Y aJ7 ra5ِܲ>RWT;|)lxt X0=|.3}+n.n.Dw9 "B.G}ǣ!غ}?ŭK ^Uի7lm_q,Ʌ9yא筜^ׅ}ATXstqnW' '}fX"wI E㼻bKase k90TGk *n^!"'QWV9Sif ٧;A@b)7~DAEMaa鉘alNgfcipb;t<5ڵMK(:Bǎeq^%({6TVYyYE\ ̮k Wɵ#C i:Կv5MWEZ(NǼ遯{e^KzgV4XqnOOk.dz?c@Iπ's3ҎB8:\$Q3Ž7wߚbx5ULͫa.x@['][#'z_m 4wn#Tis/oJحGπ$[!fN ĢT\Sֵg*e'kqzfJVXeE(Hq=XWe G`5q>xm ˵vTG[|X8Lzv(*SG1na 6{+ #GaV+LYhq} uNsbְC.k&n}MT5NfTcfB2',lvkmjJ؜̂V];l N^BO>,h[7߷`_8\kOV7cʶaC Z[Ţ5ֈbD̰=b:Vei}-%qx gE+R*{kz8ttX-˅s)26WΊ(S3&-(쎘3e-S0/?\U0GdZ6W+t;0O׈P;S;r4UX5W_'ܯ" 7!S<:afznDbR_ bwDe^(ܲ5c1t>lOb6+jծamfUet/t]efMFqm`)^a>6  FN~C0Yfy-7af)>k?TV4#Z@"ѭkɬ"ٚD%ت`&-Aaqw)q/ cWPS$@obn$1}Y}1;2bu2:gROGc}ِQicZ*>?@FY ӊ . JxŎ5EE>Ixy6;wY1|OlB(sPLVazgb͇`VLa㶀~m}{OV dƞ>AޣDd(ڍ4@ۉBP0J$2bu!t]G]{B^+lfsj, wRwyETPJQO7ooy5MEfj~K"os挀_lwƙaΦc&&~^33F]J+A5E7IWYcv9Ĝ?Lu=/~e(03.#ɡ|"x{SUolsLq6X/_BF>H5I[RoΜf!l}aͲ♳L:dz0s5f;ijѹDr DMnA? KAzՅ;IfSBlP;-w 2bvl7*ibϙ-TQ>)х!0v}W9KiBRqCbSy%k|&yɝʗw>d1jrSzQ%\[*F_Pʼ@g.y/0v_aܩjr[*_5*z[gE$wS qg^PM e?vJ[[a_/-Rn]qal{+:xLdEN-i}mV15>&i6" >I;6Dw&L;'Ya}E U<*&ya=sஓ%l$O)j}%梙j!4Q;7:@~W(-Q%Y/¢{)L`ٮ?Ujm}PZBhr./h^>&4 =FKUԝ SO_[GlfҳzspvB e!1YTQJZ%&Ѭ:-d!VD ^)˰SoMYFUzSOa2!/ڡ g20]iQe~$?'.GU酳o} 4 g<\.KműmpxXL֛v8FbM'LJ/ LXYGzSNvMyIooBwx`uph22bY$tW%m8w$;B1v$i 'kO}N$kcYW(8R-٢γ /0Qq4YE0ՒlIaoKW* zHZXVҎKf5W$&)3Em8O?aOrp^4:Եcu-QmybkB>&:IMsh&&抹X7O^>c?hQgf%uxIv@WWIx @Md8 gz) }qL;5=ws!쩣ah~b%U"XḾoH7.[?왌. MXL;$]_aIxIֹ3gt1MH -.49sYr'o\8ZԺ<;]pޝ!lڇCZ8*AQf?Af1qA@2 ߔZNrõ}Zv]321FʶG2#O58gߵ<|;lw._)+N6EX[ x+D)~dW?SL,S E1WKVB v+(673a7bT^ @ZCoA\b8N ClL*{>p`2Eo@=BhC>Do]!`-"J-^u]{+n*^ipEcxG, GkXhB=yo"|<}_y˽wX)vՙUf֝^X,yuހcPg,|Z(;ZZffa'lĄY/s E4E T= 9`8|A!_g'N_ѧl"eg52^eb9a*%&LU]{QL{^^%7dv⢋Gb`n]GN\nP~F!MgB3)5z#fBvwY~C̦ŋ#Wp\E~ " \ƭ1)XUpW\8ۣ8{Ùh6wD#{L{u. q}4ULf^㳳K)EᬫITGs~hZ} AEV7p# >6PU,,齴(\ǯ/(נW;;Q ~퉘a!XW\;o3,#: ZijEryIV OP3 ]BX03P$mQe+, .vTeh6BX?,YfhZgV̘\lɺ^|Z.0lx ;SOviIg>e?c [\"61yo ~K >gC1 got̤; +vfً͕:A rUfzv_,Y8_Ԟ ݕL.+Mmd:zZdE^~ǿ`c?I4to+~Q3RW{lAsY; oʵ0c=dn( &P?nt9>z: Mv#( NEa[fwL¾[p#owޓW&g(=`gOSڋ`Chqǣg#(2XRu.yntMCr/ pyhE2Me~,%ĜUL|"tL'\7ң+Z>NZmr\ XT#w'|*2d ϬH^LzfsrM( e6յ}˽\`͆$LdՅwtދ9y3&}36 ?K⊹߻fmA6lMʵ4vE;=vۙUU{<Ҳj $FsL|XICMp`8dtS !Sp85K:{JR٠p|߷ly~]~bג~>M Ri=GV)R?\a͐xO,<zq\OREZu8+=څ_ ]GP1W11se9U6ƸeL UۼŴ;q} €gaH \i3W1޿|Z)}GC}r8O@ܧ7^S@8%e wvd,Y ,?t2R1g6i2]5s䂻H}Ku+OB]"c7!lYNף({ Zؗ /u2d wR;o&V jZriG򹹖(ً%sU d:͢r O9`ecScӵ韅ូ>~ fQvY\eAKl7&"S v\K?7Sf%>4!t;YK{ eAD=|&(~=lmD[3i3ڡqgG~KCH30VsU\ޛ,ӭA^n&b_c ك)ˋg׺ɉIWsm2݈fLz<;zzuA}(,ܕE7UϳkxO!sk/Tɨ6,b@1pK_Ezv^IJ nF/C nQ|t+}&oSǩ ǙsbkRiob3rYKṡ=aX =1 |R=@qgMM,^f]Uy.O8R,+~ϓ,?sY-/ Y:#|nnFҡ/y aɞC-{t-'v=ilRWl8Futt?ĒXީڢ_%)zө 3n-KE(3،X!=Xgv@ J^Hv$4#ex; Yw8EtϾW\ Nh^Ǔk vs7zOhFkJDŽ8۝`aM'v=$_EڱY Il-kw8la1zr̤#Ya[E}Ȟؒfx]3-v^7-ץ#:QwgҮtv^Kq-衆 Mxadk9'͔O$(.Xyy)+z W>!sqgIo o$R>sŗ;x qXOJ{^H2YH5goĎQNyB*ξugv\K꼆I,/Ac8dC9/E`9*![9z?&WCzY̓R& ű.)>">jf;EE`ICa{]P:CzuuI,MIS=mm)Ox"¿¸V#\ù͞KC66)՝l{*CIֲ­Qtsst?Eر5+9r+7eU{~TY>z5*d{,)k  o9s2 /x^!I?qU(w!‡%+!KDs˿'5g eqIUocb<"^K$Hi) Už #R5_מկ`9rEaW T_{sFyU=Yn5Nʉur4 qo@%%Rckŭ3KEǞ\ߎu}yC_"yX݃ q{ܻC|5֐ ~\q$C/&tq}|f帓磊a0![݅`}C.Hw\XnZW/,&q(h%徸uAߛ=O9} U[F V(RW݀;iŸfd>l#eJ""[:{;Um_!¶SEj+ՠJ\F>?s&Ogv1LK|X!;R{xܜ:^m2y7lG9Y9>)ͽtxgܤUf ">+M=q9Rݞg'g'@%9QNJ? %?]o~nKN`B5| &BbyduI[7uMn RBR[XXu.sWmq39Xfmט9ݖ@mJk=KɥQd; =<®:wZ,7Hc_?Di.])~\v۱9/H&)vaMERdl&$޳Oa~(ѷZ3g"սŚ*9?eg3mw}'eLg{w%P;bqe6v9ؼ D01kdٷ ʬ|k_EE%csD)O2|讃><ʻi.{FLw,UNקϵa_hYNHɢdAsm蟼 tǯȐuDK HZ{,$cdD2*X* *7UK2(dusϼyi/Z̈Tcrw۰7vBh/(w>E?{Ng163Vgqd8aT[JJe-Et!sCɇ}SԪ/^t:Ru8pE@SBPBޥ8xћ}*| .F1݊_O@\9'z #%mr} wcIh`N _%w䓬 %iE<ž5U,pV 2>`>'^Лc~LVPkJ$p~&5~m\1wavO٠˘Ct7F5.tvJĊ 7>4 fmTDuFO)I4z,i=bm3௘ ֞8;{i6"eܢ=眆KA[㕇$N,AssWHǴWc~BK QzhdJ2#z=XIYteG67vK",exDR^V?X7hM$EI8WghI-n攽ueßfGI)aתEyTlX(zJC+qGz:X0wQ (5[#gF܍ay7ڝ`)নUzTFDGԞGjz$fvK"8WN뎓{0ܕ\^S [ukWIMZ #EJfT{wb^1y3\5ƻa`ƁѣhŴxAT\#pRd]cyj{*}=uX7|w7N@Vf y{p:*i/^3*|ܞJSDO8ƚ6wWF+>ZgI0%33X }b1'*{RvY+@^ ,("rL)|9L}?^k]8fī"n%C調Y֔=RULBjR3),)P|Z4-ԗhG?GT "$DzjMqm%_?3Dngqyv _܀Rw]J{@~po2Z"/x)w$Kosv%wm _"IPOɹuNά"a{XW]q0eծD䗣ӗ-{s A+Su-<[y si:d:^k5wH/>#sK1PQ3pIi Oà?L$T7´o KahT:OMMo2;5 з\kOF7%ϗ[?5Qd 8bv(9 C۱6C5iQ2\Lfi2LהzUӆ1Dܝ?Ƀ&y4x_#Ϸy_#׼n?>䯿K)~Ⳋ3Qw4:toC;XhM n̑ Kٹb;݁'];26 %-J7 w!77߭{uw8 x >̩ĝoׁT]* &Zmj7-Ӽ@=V #Bĝ mHo -kޫrr drt}rY$TdQaSw2Ο'q~XT禲 L.Ǎ"ǐq9&#[Rہ|wiS;V aA\W&0b0ڊb+uԓ+8nxC:yMz[.2z b`$3 _Vc16xeE{iǿfz2m7o85IjEFT}hF+*7qq(JgtFx7$CzCDrU.yщΪ(^G >~WwN]lY/:KF!ӂ}ҩU82Vm5ic2]p.'1Z3Ur_=[cPU$qkۻo6K`i"o#Ur䗸yKfDV?v3{\ۗT1|IxTàbFk\ >E#gI{26u7p=[LieN TxaYںD\wuGu$H+Gu[{v"?\ ľU/ YcF$ݜbQz~]~E] Xe=uUzb/Mft6'84͙~]k#odz0eq{!osyGe:]uwk?!Es@ܕaM`a.[;p~46l[{%1'uYٶIQwX}cT2 }S tTEG>q0* H,,n*j! "("M@I a".ʄAQTDQ#:/ywR;[u_N~LzPv42y6[hk7[0TBܶ;S>szhsw(w߱ѥ]tX(9D;룎QgAQzöf#zb/̡'JnN2B ģP$'Ŏsd^F%;{;fuhuH[p-|CU-#cbtׄ3cϘ5cZObUwF|H믟fdَka~%kKr;Y{׺َC~cnaoY={6Skڍ#}{žo>Jf}"06]9qwzGhǸY&eJ]o> !-:_uޠ;i`wH5B[}2ɹ:oA_sX7ʀ)Tzu'%EYUߟ+ fsM7o ^/)MB+6nCclݾѝDh@Bjp{ a }dM[;8Cx \anEVy|5w)߉;E/< s 6}#e^粙L ʴ^\IldmЛ(mZ>\}IA:_ ]ԸӇިSžp!dg n5fTD邵FM+/yN]'RN,2cK6d Z5 Yٽ$Qޯcdn{ePB1#ets:Vr9|0)xU1&zfm;h)H5en﷯iz@N/2DZ-dȱjgXI;1GFy̍O7q%j]3{f=kC5.}یmUwG铔='<˿˿S3Zc 7^܇U-V-]@؞jT*?װ*p)+ik2gjD i!TuIr,3$oCX1) ƒ:Ϙ Z;F/q({7W1B'?#~{-y֫LR_MsɎAy.S }V~hŝ {$R6dpE}JQe ]Lcd(>5Cꐟ(ыjp1c~H f9c]t r ȖJX\7Kjɍ=@aImy͝tg?e~<؇ ?< =X^r=(9+\Z]QOqOoyljj`\ݷ_aU* Z({\nJ8gk;[w ,7[xXoi^nPХ]qٞmaArp`aQA{'a9wrx#i 4](uu=bsel֨vv\ɭn[8 iZM3#ʠtFvk8l^ˡN:7lpƪ4@M3ݦ缝ZB%E^͵:Zݜ-Hc%.[hKeD=+{ ֣\=p ۹5(5xB=p g ~_xo:[?|#bݕ/ HxS(W-րDS#c>\_7ppS՚Jg'=D :tn^ہќ9g\݂3,~^ N>>B*s2T{+]*G3EQ͚Hghe&shjgaX>"!պxۜ)3??xg5Iܷ0rX_3}.ҘhW {T{b DžiD pljj߬NWܞȝe%dTY:qŻdtDwԌ x;3gZ 79#9(+wQ962N |WT"+s/ٞ k?rhj;$Ҙ d ӘQdk]B岨&NMr3{ic2Un=ܙu>jK͜k;hK_SKV2d>]F6};+j0ٺ uՍ|n!V=Cߴ͙y?+1>{xs#+qz]^Qѹ,zBw*csd4;Iio2琾` 8g0 tHH&IMY"d1( ;pCIUSvw=W1RUoPѱl]55|M.9|SͷvϩxUA~YRo9>/Aӏy!͜-xX뺩!廆K1waC*9 8m;u5PwF5t79|(L&#_< grIo_L2!]Ǻ~ m9ZbVwL f"!;W_H/Xp,aosp -t*޼Ko뵍x u` h;#1&w4y~{$;|ն@nr8]P/,Er#>_]$z(kB_;ˍs7ZBZYSzqdw]X(ǵmm_ jV rh4ޓ,g8秡^yg@npx 8Us+ȽD~fs)k \D7"א7y^N7C\` {W:Ӷj!o0lX39LG;/ t_(`ٹ&{Zy/lfk&;^_n#^9D|?9#M"߻^l6K6Ұn 빽^;@1܋KnkBك_CnKCQ27*mfM{L kԺ;Ae'XFzBZUGуIχ3<"N; M_$Ⱦ 5k۞9@v߇Fx'SxsoDn__O>[F&O랁k<|x(+.ѫL)[Mz{ǩYmSw9u_z!k}'ATu/NT.O0廃BSȡx_=;aݽu>JYÔc|:Ŕ!鷞)/Nq.o5>;۵5m͸j7'{ޠr}dL;~23>[De?,}"ճ=d 9-Z)AF6pw%}oF(AٙldK`!u׈r0N1jYiYAZlBҚFiy6sn A4HW^G&qFl#l c#PL%NѕDijddn}D+#3ΓCxק}$Au w F=q2zsXֽd;?XwгM*d_kH;mqMGinw  ApPۗp`Bl~0̕~"J|8 cz:wOPFFr#"5r#s#rpj:E c7j$}7߹s;wĴNGFVgB&9Ƚymߥv ;Ķ %?3ӓ2g0Ū _E<ÑClu? Pۜ0j̶ߛQyYmsPbjvWݑALT.׽Ҹk!a{ÚgpKX91.\1Xɼc{P ɚ6_՝mM9}\nNP'mL>"]l m8ZŒ;MkӸOv9xܝ;rx];pADzrk1''hcNFj?)}/"# _k3>HݖgEl{K RCa#jB5G]Mr9O({b =s1RW_^7wTcU텙P_3N9GqxMB}ݎwauë̻_I-U%R;jHk(+ ܻA5sg?:ʄA>DŽ$ װ{ w ]Jr vQb}J\w[ke5|jTK~߷˼εCwIF9(\^V,szEɥ1]ԶRﱀKl_߈CBKKU`wU={^VC'p9{n^W*_ϲJzuz9{gt4>7>Udz_ʥ; U.PڦDzd:9;wG׶E &HQWKZ8-vݣHGGORCBy۫6@/6 CJ0\;bfZx*\!vܳ/_s4h IRu5)N}p(׶E!=#q<ʳspO}-y ^{YЪfz@R'~-wHC:Y9.yyj_E" 2L>[9Q#{3qtihz,iga]s1ܑ33]gTU׶>1(h4Xo5&h;PcDE)5*XgbbQ쨑Dci;׆@/o>Ɯk\k}{3 bf#h'bxu6bM<_2 >&Vy=g`kVv=Dm@w]ɱ`nwv>|5jDjԔ)@q~0"9Q :Olq\)P$l[׮,T* 3'3Si]>L bXu6{ L >"fXZ)f3Gڹsc>-rm%@J[Mgy$kb؅1eߟK^Qv%}* @KMC=Ƣ`Խm`Òn%}gckz 6`f=hKRϋLT}Jh>Gۂz8Bi_=JU_6%˅?w|g"rV(qIg8OYJ /Jglg $Yhdq.|Δ>Kߴ!go;NaC(a8Vl[%!87GxjTLB.O>%+cD?.ڔܣoo.P@j KS]/ڔg%z1x2%r _Z mFVB4N5r;S|%B&;cv)ߝX{1%CڴUR?.bߝRsrcž#t)elNw a$36t>F'"гFI--9ߕtMەG0AVyHއP]nQi][-_r!V˷WZ(PR7?™X־}ESm@%ľ=^WDK*pZCOk-ѿuX}/:^1☠2c^v15AiUWEݘ-ǔҴn?QEgJkQyһ/H.S OVZ[ֿFj~z?hԟA%ui}|/rʥtǦLpZy>>n܇b֔,-vc߮vURb*SRJY>*u=zIQtǣ+)k_g3Jt71e -x Cf :B4pJ.}AŔԮ4qQ%($zpE=ai<$(v.v!<}f B:R ;֥3PL15K}zvamMgAF\d$A Z]ih91ig dM(,LrRl/&)8ZånSg|τU6yd/g* $^WA Lݶy*WHY՝MW<+}kO]aKyvڵq.J/X: z cmC>kBziNh{[JmGZnU[u3ؖ}^HToׄ_jmčJ-<-~"|xAY"[҇VeۯMשg8<􉴬ȢZ偳e%Қ,bЖ!ݬ̛Etݸ').kv}Io-y_^SY=>* NfJK27glL/_)8 Qѕ2C(7}Gh{0$)o^ʮz (ҋa{Κ@i_9J1ro9om&vzǛuۼt[RUTj77&#Z O`>])76NC =H`ܒ˹< E Vezxl  \+ۨa2#AS~QJ`>u0@c -ev=ضF8cZV`>Ο~E_ Xn3*~ Ɠ_B;%js'Νs ?X 3U87!0.|zcoF,JۄTpY ]T qLNYG߃@ hXV{m}~<^@w[v*q֭01,DV8o^>z25Ś{TMk` Ui|f̾}O7LG;B;rt|ު0Yxn#,| șT9 jο̜'é0|Q0uy ![b=|^rZ.\"ѳZ\A;y8-N5FCt7y@7XcCi4ִʇcp>Spa!!=o33FMY=lϡ[aWZm7yYXIQd6z@ nw8! 6;g{ N&kDy,a t_h.h. 6Bc\oT޵i:NuIQp7zvW hT12}DD}G.@n7Uu S\(,7GR\8.-ar-un1|1yX<`B#>9 s^N)}SQh.=~, c'Ox B9W|Mc5&k3nKr40h][56eҋd9V= m yPe QW( K¡ګ'`=//Ozu\wԗkQ~H㚶)6i\A7=vors6 Wu1yCsogCjmB'S3C+[C)!!rdkzW/AO~ I8/\K"_S(';u Ƈ_+_w"(_ҳ~FpkZu.j!w\GE^x~j8yD ,5uln'ᩭ^#_9d3TNtM'C5v| yU z Ca=^ ȶhY=!Vk3_(X^"HAajFm+s kPGy ,wg)9aLf\TwNY0E`;_c86qLo ?ּ)އmOuf/y.Z=ol4,՟JYsaZq??0x8_Ma9:EV}P;%΁eY}h8|?\5k=t`x@_>=ɂ@9sr@_y< y:l<֢jué~r89pLFl:5;峺\pPt5/%n$LfZ=0 (ES| fbJ*q?j>sRQREKuRGͬFs{ĦU*X>;}\p-b 릸vdUvG혜퐭J&bGú;ZBxMRadڭ Wss툱]$mǬ'կe]xؔɘ3ֽt[w0wU-N93ՎEi^|l^;!vܥQό +QO)cho}7zu.ж!+onrYkE;r5vӨ7ݦ1Ɖ]:;n"!&9|gGPedžl4ϧnZ5p\nG.9jGnqEdɮav+C%G\vv,jӳ+SCM֎"&-,GNf7jIvIl'̳6X1'{nn] u_[ Cm7ˑ`߰Z=8cn>#ȥRc^=9yլv{g!>K q Y|eOF iǹt'Ut_/Q/Zw m.>D-(~]k^Mxz_ߟSIUKrpXz];~0|@N_gOG밁%p ss_qrjЯ CƞW֍_'([ZtKi Zk_=kRHw^MXNc]#9_gbI>M܇42\}\Q}c{|9&oG-`R|=|>5qlU^dyˠeڛ!u:)JȒx_|>s%7VE3HVƽ"U 7Ɉ7=H/o=Zp5eZ|C){7U|rwMolwy^z->YYdڲj/"7!ZūJjrlS%&xĞ 6hPٶi7}zM}TmTY7z}dK"(PG.X%:{/U~{϶p/meе3/:g`WŃ+Z܏ZeM3R!br$81 >*8z۩=Ɋװ؆R{=]لG`gy"4%->?җgć#} ~gĶT_ ;r#^P|9s G٦_r~v:JwOtaYB+('LE [BP.챊KU,h<+*'tf=u@g~Y6OF0 'vrkgض5b C>oj<_=(nǏFj_ޚj~? u\ n.tjP3rO|Vo,ke)xS7xj6aҡY9=[` skGOc@an\7ͳx_5q\s;rRc.^:"dǵ/ݚױ.=2:ű3["vx5O|V^˕T]ux}'M_ٹInYx~έ}9Íf.wvqԘ}R&B~̱P>{4yP< ; rYҝ nʩ*@9zW'm5{39}^(Rks3cmN|Bn~.,.5rl`S"UoLCTT)CצӖ}uS'ʈ,#5G&9۴sI)=+)uιX'~z{5}^<-njy9C64ض9a:|͟AN (x0W`/yLt%JC^{F [s/Y_۬cudʃ!jd>z4#Y? G?|de%t_8#+!_ߕz?ggc̤Mvdιf_:=TO(4jqOe(rۨN]>y;=G55s5Pl'k߭\!𦞭Ŀ>DbZ ـ52=U٠ZNVXϩl!yg!/ـ[Jʭ~oq]kôqA~#K{[TE RJ1DoG+3u6vJoP7yKN(@4)6)l+6}*GǭwңGE?<б |' 0h4ޙ(g| k>8?awpil\K/þqo-9%r,*zΞQd<6m K<>xFӊoQ1S<όT|U.cnbVzy8 t <82LSS _@@yyFдSi!TRG|cmK6F|6zMWCs" etwfK+WPi\ۧԶeA|;7謮=ȳz\s:]g[c;>7XrXC y*+3z9~1TcxL?re,3v/G/O:&17x z-$m3 dF)! |&_&8)X,5@->R]x=Wr6he1r'r!ߖ{mk=^?X7멶LyNޟ*~]~1 x6ko3Z8d zl'/ ݵgY+y_57#1~ Hm?+[1Ej|Eۍ'3SN󲺗y oslܗBw^WdS9ۑ+)]f`ma#|tɼIo[m>!za<Е7Տ3[GbΌN9Ɲ\8*\Bl؋%yLC`OP9Nbҵ.za&-V}ll7Vq~ 6~vU.4*lW`ǒ{! 9T1Ήl/;Qz;u=}8c~OEI-X dT8\h\.|0\%@WɈ~2;ySٷ nѽS= [f& 2 )SHff"W~*4؏ZgvV5}/#}e.jW` u:|y%ʞX,7eV}Ro:B-0d N;{ǽY9,+88)Zo;ȱm_'\Z8q]TZ0z%D*u/*q%{`]Qr WyeRetm,y47artw"ZEКI4ԢYtAZLCSiMwP[R4V4N~΋D=цnx|֣[:;x*vBw>BR-SG\E`KNx\vCle.g~xX<:tʟ 2}6ؚ &"Oy:ϑv+&gKKӤCs9]iW󑇼ٓiCe< aBZKa$aFI@쫅; ;l`s9r#wOyډZi%#ǃ ZLn*DK.X):,e__}*^,{1x.E^^b^}ۢB4ʹMÞ@ ͂,~vҌw7Pf>K_ko"MY7ZRKmb;!G޸8WA ^m{8FJ,+w!s}y!RO3|'t[nKׅrMt~ǃzN;QÔkU=k)s f\ѤwOm]<;h2RUWoSl~Qs zLcINc䢦mm:G_\c,c k?J*]fYS1*9xSӥJjo*l%eӖ+S'1όԹr2P}Y>YWO3zJ< ZafU;èi݆W5i脮q:Pgɯy`u6{.ӱLGx+G:TtD㷧kyv8[>vd_[5o&ߕ kkury'}65*Wu'-?Nl4 _g<vmYͦ|ZV;x:4>cV_:~<1]s;??gbbH<y.VVx~ΰ`G%^6f)uR:r ˎ/Wwv.QaIIҦ;jt5+ߗˇps1vCGxM`sV*x7h<:Phç00[Ic+&FVޝ{>O_u{gx} SK9LQShU<]F׵*;NPTѵIAJSԚ(|:nCQ2quGZ5tJ0mϋv;x߸#k Q5Ct ]AҵI岣:UM)Ov8JTtnڅŬPЦh5D(k(:uQ؊w>j5-u#}'s~ UNc)r,) O;ʫ;|aXgS)=FN"=ze2B/Xn&'{ v)^l›Sw< êX,cBl9#b_l Me.8gOB19w )#FÉiP Yh ƙHHwǨ qb$1DoC._ѻ|Ͳ #;$BzP#;vm6\ƒ}XQ҃3AȲZ4Za1vH&!~ hV? ljD 1q_'Ģ*6ۢ-vAt8DKS(\9 v]{UuS!|J =(΃xnZL!|-j*<&3%P[1EPx%N8{9pM((A[ijWՀU} s |\jE(Z(;R cG qn=|w"݈H7F]Uj1Ab8q8WE tp4M,_ U(57G Ge gNZ;a_#x{4Drf\ |T-#? % _JvsH9H);4? &HzIP1|GQV1 C0d סlqDeԅR|lZT(R$Cjj7"cWe/PxU w%ms2%nHu_: \_ɘ2һ p c5>#7WҨ#_D]P;u=6ȴ QTJ+EBpGf(pH;gو- 7J 3C كH5D6pK,̞!rf=rF/AޯH1Flw9(ǣe q!=)ærZ|Dd9 6s1$AH{"ca$#K Q(K@H8luS1r@H-h _ȱ㑷"e!m?Ϫiʛ0a8;P!/A^`"3{Og!<2 D3q_fD$ݺ#P1N!E{ԟYߣt<*d_ ~Ѵn@ b򸘘mfz oƒΨ)B¾ޙl0}{NTNw"rUkoo>8C7C0 +A`Aܢ;d,Dm%dY4<cAOmNC:\Tw{o:!k'C<1)#hl#jW"5ŏ k݈3H]b}n6E~TGEZ:^F}75O؇1*3B7>>@ aQun;V ]FB Β!k}?d\?.C8o$B䔌GnRl GQ]2!w32E >@P -E*Q|jE#P6/>Bn w@P^+!^6 ś|a:2&V gTO$N= YF-B֝CJO~ܐI>JQR8'/!.O,.=x(lijľ@b29KސԢp7H=v%"+n'KEd $ q~:+bBQ4 t r^C6u S) hGFT62w9 P 5N{/n%DzkFC)H#~vV:!.ڈ"Pk;E#bti!gBĸ վTH!b/R(q*FI ΑȦ Pq7<MdCl3zP'q2㽈buC"|\!x)1~߄opH75+ {nbj># I{Qg;X Qx#HM샼 co΂ 2 O=L,؇aPsiVqhg&zH3 y[Co~hv:GE\!!s뎧I(dDRQQ׫NUB"{{qm^..mi禴^hJ{y>T'w𴗏'K/h#wS873S 5_!vѲ5p]2W+D\x x.VÃB w @ ֮ G}@p'*|nIn?WOktLu9y*'A%4/4cq28p-_ IC!_vZCbaTx^pA x:w,q@4d1:n J7\mB_8һvr x-v&|rz/^(ןl}Sy 5PptUmgV`~LЅ!ap+(  Z۠pTvU(Շa }'f@]U_8<l;[ADYr!.|y=iCG8u-ApbowhJ>w-݃io GՆH.-i!W=g`:ĎΕa<{U?AF.0CM>!9̛{O2H{GBT7O87@||Gηg!& V!$  pW$\ ™p(S9>_Aكp|".òae0( @Xx|k?ݕ/O͐uI 9sD@ F~(q9 G/_@۫b ԵOcv:OG 2nփ!j?xo?o_Y 3)X' C@ˁ:}`rYw@ ӭ6 m-S@|!O۟QH|b~n\0ܔېjF!qs`_`h<'"Ab.ރb&Bݻ٠:=i$<:; Ը.a-, YMؠ+Viy }8- ]0US1 W` '=H \} ,&b_k.)Ks|Ά{ ;Vdr=؆22`=sLwCz s82Ӄ*2?JȺn tB<37@Ip3T\K [ !.d `G9GnIp6$;êui jkt uJXY7ym(;YL4U@1r10 <}I)m'm}:J2a`+Aޓ`aAk;L: e2.XyOI=y)s; f9;~BmPPߡ~`# `+)_[aC# y\) c@ܔί-f2e3j+ue@ U9fC 4TAp7wCA<%l0CD"dONXuKz ?f9`ff=@ o < kx3Bx 䰬_[/H| +`m86">>sMD[~]( p:oLoW9X9e`B$ a/?qj5xZ+b_t']H5\1B)ps9h^>Z=!9n#W' bԾ:_;Є?8_; Â@7?p:tE~p 6J\ns΃uJUJy1AaܰSPB6#̹kn\f78o^w@n|zzyG~!̙?bZ[X%^k ΍}GAUP5B͂]Fiu6l`sTB4!) { ӆ?zF=#H>>Y+GwgnM{s ,΂:7+*<pr9L{-b7 5 @0<} )Am8Jp>&Bޝ~XoekLW~s%xaPzEO#rq_u~n׋HZ8x?@^MXssa<Q n~st{,_(@eHl\~<\:fx zC]uQ0 5g }ZrVͷ`x+Z`bqw~%L!O)Wsnq^x8$zǴSO vpM #B5ht>W@=2>y/!1 BS_W y}5l`7hv[ U鄭ߗA 5$\#GA{_vOjS!6ws;4u*n/ f1S) ?o!CbaYsr#@dznҁ*pPz B>y*6% oʄOie2ROจPwhO? =7^IptsZbzB'kڋ;a0n`DއSLO͂K l˚;BQ8p-|Op6k($A_diZ[]A "aH[|caeT! ĴK1H;}!t,1'ζwS n#A' H PTI dPat&/6/WB4pDز5r aGP.l*^  Nȃ-P1:&B[2®["H |Bl9 |0 ;ay >[r{-^90'" @+Ux ^Z[KVԄ'W;jy #.waWwI/߅ k u|-4Oa?xR>9Ϳ`PT/`0@($8dzC a|4az q==! +S!dXX1[/N1JF\YPPfrIa ̑ނq%!%}@Y~&`;@_(_e}9ܷ:$Ď`H UMT–~W@K -NonAWb FPn}Bؿ/L2bX8 ğ 93;A:GHVDNP> ~VUZP aH>j8 'a.ܓR ;K\^O_Ma-=pvcrC6_)aSZCZ;0n^ OcBPt)96sa4Pѐ)ׇ ' 4@p '^@w,@܌}0NUewz\\_tnOJ ^8][&KX Nnf`67䃧IS!7Ν Xwjs äCCbE!\^|+ykAxB7c~? /{ORXx}%n ^MvDg>?@k1%6Clp z cM'pŸtA#oŸv8YT~\<kr t[8̶ĸC+M܄֢@~? g8Q$ȲpY%f 80+`G_G܈mP6Zw뚷YDUõGg8N[` 'k@ -Si W\n>ik"$+\?pt!4,=;VS(ul a^ͅW:Z3\`uo @~ ~`a}#̎IS W{<: r3kF^׀{: pI>P j`'- /èG_!c1D@XO2M(Dnտ( 4…e:s_ݐ؟|\Mte/ '(~<80? J A}4ރN;c7d^9= ˁ5uaC>u  l{+pDOWߐ 5ͅ v1b BI5=+>'fh/5MoMp-o8=75pd.EH\>4=5AA~Soa $YAs=/:uȜ, ߅ï$.OȻCc5= pkFuvV솽QKAL A5Ok;Oa8(pB)_pK1aǗ_wA'|:v9Cr4ظ^ Rqv? Zp0 7.H\…_x3 :BrK ;g΂ek?$ -dg߆ى3!]с+Ӡx:8aa뱩 #Pbi(q. wX8!]x΄6@I6}&'#p!2oqqs~K3Wgֺ2w'CqNˡ#dn¨]XrSg |*> Aɨ6ݦ~pRwrx@2zs!yT;l-BJKuՀ 34Cx>TEhjd9\zm d[`U0We#X^I {pqX-h0lj]7Ѭ`?xVYA5Ⱦ--=`0=r9"RԶ3f:l,z?q'v/(+7H(6c_.AsX\ֻ* Ǫ@FHAɣKk5piPVu'@ xZvdupx3 //(zd?kx5Y9JaX.KgArano]Ap) B mGI 6gOJ YP?xlZUoTB8Տ^wPsj?v@9;!|BΦ"a+| H@#  FS3?*>y_rj+H Tljw۸9o!7X 2ԟb 8Mc9 ')u~ȹV<щPv[=ǃ܂!,CTná^Upbsxg=w@2u8n;Hr;^{4T{ÜP3Jk!w%ſGespj>$FB.o(\= nBX8h"/[ $'}J| AV L ՆǂTwUvD:HjEaV88/Ws9.Ck!k}'ǯs~N( 4nlj`k\/$UC݌ BPrP28F?K; 9YU!@|>0gf(M )8,q+34deC\,2zAyh . 9e;"v,p;k@޶3aBܗp`~L2cp{#DŽCd>[yȸyg32! 5@É'p_ȵp#!Z ‘Q#/{[r~hU x;niwUr}uxΆ;pd ||Mp?g ݷul&t.Mapy=)lRCfC'pc4g)Kζyt]x~݅+f2%Qp/V=ҡ51/Gjۛ-!W̅ж/XOË0PU,\Qp*: Osoz<w*?㯕pczxb$&go8l0 tXj|n\S~Ό<;x&?y}iI TH s2Ď /ڿz^IvJ˨$'|ŚTc"]*xM$Q.%qTb@-=If,;S %${6R.]JfN$5@w&o'`u ^$]DRHH"=$@~EB -GEeTx: ӿQAt*DnT4IV;*//튦5SH˨"~TYsC{";֒1ym$ L<*:2ƛ* ILVSE6*BIBd巨be-稼"wrQyS?mV|*3*UޥGT&0򉟹9H6m6ɼHw5늨@PusrZ*GIT1yIa;MCT6eWMM@y=NPϝroEQyTPKy.qFyv}' ʺ ?yL=ͣg|*Ԯ싋),RB?1֙ SfNy&SxS^G_ByVڔ7I)O@|(r (r[WR^LsEycSn+n@W/}r짼ZS׃r>bK ]I\ wʙJYӉ/(GQ g."a/OH8efQ)eP^6 lt)g tvTHeR.,,e* eoN/eMeէ)(Š)O8CY[kSnj/SJ*K$ns Io*D#~>2;݈23{@:(Eߟ(K$ޥ~;?H۔2w'IJ@_!2rRDs=I)ce)).~f(o^ʳM_+L[aOG(;yMYс} );z7e@ǗR]u$(;G9I:gp S.vPbՃG(e/_@YI$!a0XH/Pո.|(DATՓ j a(?]rw%SmMʹA;(e&Sf /=ڧrGRnC?+کHRBQ EHtk/n%q-TgPF*2MNRQwʽcFy3v*XQ@!NI#ʂ;doW-X*B|BݿTIt [*EY]fa5^ҦTtrK -9|B!7G/*][ӵIqΖJ? !TrNcFTZE4u'AeSETj:Ja*9{J7=C-j$-_@$]oF%*J{tv_*I%S9)@8LҌ.|RRϓn `H<.h]&6Sܗ[G&TI/ .R.L+]dӿPɎ]ؾ+I6wܠU;.S]=d+"jPھT=֒hRPqsz`KUoR=U O_jg?J.+8Od#;EsVl rA ;(>ԝhskٿVqb%T]?LQdvieR-[z< ǟؚxoMם ֖L-u[24I8?:<&]TJu +dR\|PVcݰ7e~).vT ^ذǪż^adfq@1"Fx\nV,AkFvdFvAl-&\la=bfXaZ+;#Vq{bl0q?o\J7*'7XJv%lb6;܁n;FGcmb}`[쫪x] ٙ y5; HQz&e~\c\ ;re|>2VL@cw‰Fp:DINY6g&Z\h6 {fOt}K;LqӸxd".Ҋ+{"׎nxܷ'Wעf\w ,Upk qzރqpEMxEO4s.|7^o00CapT Mwv#f<7|_ 7/z>Cbt0n^7<1\kKpۧ,يMΡɓ軯 +=sPq}>Wo鋸cx=x9u>m3` z߂+#9_L\' =UqTe"K%7Dv~uǡ22~1|n߆ ed[.ap|_ V-[6c2n"pPC~] dWn`mbܾ;n=q"cWaPgc ~K۟}0%-aR&̾_>`B`r=ńE>&aJ1LĤg/Iƌq"OĬ9ʟWk1-ya(v3OLs;c(  7`XaJ GI7,^ E/bA( ݍvטxZT&`A-LJBn(c^t>i:Lu0oU:6 ?s#f?(샟\Z9̪\MQ3oGuٙ7xT1'$Ŭ1?҉LX>ì}B^9 SQ$s0#h7fZb:3ӧ4bjQp ȟQƍǬ13b^ ? CJp?2ya>s%XyKf`ɷ2,:7=6a鰟X,Dz\Uk l XRͱ8-<%XKPK.u)}"RXRegJ6b)XۄX2ܱn,xsEv ֢xB,"Dw, E6Xw( KbXfu.yhP2r lҥDb9oC1uw3(B E8^`ɀ]HԖEXK'r{]"qt,?wӫ3.X`\=w鉘4 gbXpmYa+thW_FJCq5qc+X`ލX,7Afca%̽=b.S̫rļm?07!wŽPwȧ]럜nC,1?EW_9(jŴe\o\ބ;P9 SaFu/4C~. c0bL=_ôEn_$`r=LS mb]IT1-|n>u0iuL]IF0e &0a&30Aaq^0K&>9 "3cd11+aLE%܉ӳ1Fg*&|xwLØ)7]|\1nƌ9_r+X~ vOF_u1f Fي/`O>Ʃ4c"wn0^]r{aFݜqKws6;vw:}cn-jӥ_#F0F:}^cԼR cSƝ31 _akNq7`c/ ן٥C ULŠ{RS.\q)|=BDzz)Mk\sժp~ \0%joǥӖpϫѽ}..PWp_RW5sXq.WQt]/̸+p`Zsùp1 : YC8φnpZm٭TsL܉gp{ty-9qtXoGW sYCמ5msy8jn8*ۇӫtձ !8{=[8n-䩣mڅ~M9/p7 RYt8'7DqKgupҘN"^U8It)fpJS/f~ 'nSLpFht]ӗE78mN$N7yӋyE)NE&.ߕ]FhഒfOC⤂]H=eH8S\^BGtoljZ8iQ:08a8Zv‘8F==8~LZ2y):GzwH{*G<F8jCԟ#[/Z @{  f~C{[/Y5ZVpT 8jfU{'!B> 1'UGqbY NL fteװs6:;t-t|3_ErsR-FGw!m\u̽ǍO1j> 4±Yh)Zű/s3A8N2-Fz(qZ[a]>CZhDG5h>cZX2N_טŠ18zgS+G&y8Gc6;)<GD+'O\m}YZ俱ŗXnF}pR%lc*1 :8"^GقAhH!"MZeUiőFp N~>u}0MhcYspR3-5 9.nD]0yFczaW=p4mƁIhda&6A48 Cl͝4x5N&j/}P[p 5G>*j~6ޢk@zqiB!mv\6#if7Gs2ud4 xw&)Sp8g>\p C&~f%jFNújAM8s0 MV^scD{0a_!] ZAƨ8 b7/Q /simvo7X {6dB ؝J;jM)8 p&ꅛ^9_32ր_,T/TB سOF5T8CF8>a59k? p kpm~eՄ_s1., 4YF/`a|iw$%W 8t<4٣834+FwfϹyhA-hUMfPGR0Z<->őa4t\uG.1ᐐ$Zд?-k8&'Wy8oy<.Ozsz{w3./[۹} WCw9oIB$eܨ!kU0l?M}QY,pۚ ].i&}ɖo5jƴq,uagx~}Ll9)[9=%-()GNa\EnLYbnθ8^k5?9_?i%UCùK1<&k 0*FcHY ~ӌ!Nؠ >z&nL>nqc[ n ĕW z/>5Kp[Bfh55JBLJ.~WF1X; ׹C~wIt7s:bЅmUOG;ơm '\ &q0 g pZorFn0|gLuW[(|{0sSQHjי}V3O2ә CˆLɪFz0SSt<1%yLt=b,3u54k}f*60)3LdYɄc5m20~'3L-b/cqmVfdf֞LɌ*ä̠7.[:-yz'?=΋H'<ț([3 ܠTǝN6g`1޾IGx:yOV$^\]?eT;'wbvYpSeڼxkyB'=>x?ĩzʛF(8 ?zHNo68o': W=xöe8z  ƅ6\Xv3x&*!p\x1i2aŴ% lg¤A4Mq!q">6.R}9U[;B!(Q:.$&Jlxc9s{ng'?g}Գw/*T6hq6(͆5lfeq&lz&b[frf?mXllD;67V`ɖL?V俀M9&%_dl vK+vuK6,65]4$NuX? d,?)<6Y&?Ǻ)9 ackـ-}.nMJ6*2g;v[,c J'{-sۼt{8Z8AJ엑})]fWzpyβ JUvsR7O3}nTٱOߙUx~8P¶U.W- W|؍P%Bǫj}.~ ׏l۔w쏤JgK'zT:&*u|*ZoWAKSBJskJJukc^+*N+1J˧+cQd)mgP:+\r qYv.+mT:jURrsC9@7ϞaSY$6|y!;Uor{tov`/;+;;vb>QKV~83/)Mn^9dQ p#/NJ[p,aj̳o=Cc[? 8L!g,u_EkE 5<=A:a94p wx=Mi4'Wٲd]iLY4Ww-;?B&oA?[bNݿ). NiC8PA 8VQeK_*&q/3"ZMFQ NU(gM?*LN{$D}3埶xA*p"٧+TwIVS]"i]c1*T-_7T:t΁KD$ѹEŚݺ/IBI#v} -9$㩸O_*3]JC*oשBd\ U֕R,uOyQT4^6u+g-* ٣TqJI]\;.9GLFS m'Y56O%dI }C#Q!?oIbX* $;|;*}L5$L'Ya+.%vk/ҠQ ^5Jg]qio$܌dl>xl'*xJ)r9%$;*.#ٹ=:Fl|_Ic¼7U,PN*?ۍ̿/dXd}ܶ AkItɌ{c8_o#qk6hJ+˿o>ITý]&ѽI$Dk?ZcW Ifo$=2D~Ho6J(*ZN"\ԟ$/c zLDoD%$/rH[:IڇJPi? IӒJ{%a$UP$L{m {ATrmL"T1G5\*\*yyHrd+!4|FF$9oQ']f *I')$7I,_gTd1s2D_n Ix0E I4/,RTBөn*CEK00J\L |>.O.o$Ar !XoHU]EU,URTy%UiT-ΧczT%T]CkQ(ѢvNMՉT}$O껏=A5S͂T3§M?fʡTcƭu<WnXEյT]FڭT>SUEZeHU}2Ul7J"yC$h7ɓOsGOoNr%J;e5G*R(Wn:L5T1+ru\?*QeTў<%Uܩa\ET19Q'H6oIVqM\<4LqnPٯT;}z*}YjTV@*}5ʧ,T^YPcTDe%T6ߨ|#*wprT>'^R49LқVTz:⩨Ay=<ԥʿNM?$Q^} GX+vK!͔ݳD?Sƒ TԐN9Ž)" J (DRZH82Ρ'W %у*I}h& )ۻ?CEwcn:EWR I2HbkSJ9jRiU*l҉wI+Oa$19Pi/xwtDy)i>ee) '!Pvmv؋r)w|rP; W}e)a`6񍊉ٙ.[Q~gL8GTJ]R'Zц=c@>bRen$adekMƔ3䑴{82JvSH8?eĴJM#(͇2Ei$`0:MiW)y$JuCcQ1PiJnVRJ4RxjC)S)鋒Rœ(mMw /v.F HB3/Ii)_ }0 >u'%mp6UJrۑRFOJ_^Cɺ)58Q<]#onu"e|GɷFR\r)|eSt#~NAJV֧ޣ(FDBĔDS GJO<=r~ \Ӕii@i.ϴ7\}E(go!e6;q9)&aPۜ~)G%MdkB9JN6CoSm奭|׃{>;P>O9<8P~Cy}('kW?r(0E< rS/[r}'RhM\=ܓrONܤTr7=+) ) E)9 FSւ%$a|!!o1kQ/eOBh({e)ˠ7RfK;eYnpZ׀2cD`^N q$02ͮPf*e&y&=) mo62,Q75J%zyŢ|1iM:I9$NTATTO/g;HdDNBY2NYu)A#A+JI^3)f$澤y9R?2(CND{{PZ{Ord)3 (Ms w)sl)e[OšP*N9$trU8]PE8"G82LS<C/R&Π){U*e.Lk)}DJFBʺwSFl/NٔlJ՛)cdpOVzB\ӓ)"*L}Hs?M_(;ʋzYJʝV_kN\?Lٗ:|2\OF.CzpY8M8)w~}\suATh7$g+*s V#*l?Gy[)wvuէ >Q+WJI2t 8S)Q$GESD߰ WQTd! QT0.ELaTxcqIy$@AG/t&S# Tr$RG*YL%9jXFq$J%Gܩdp؟pkoL%RɥWT"Τ+ޕJTQ&\t{+؊`'f8J^I$>[KH: 4*#IvI.6RT|˘瞒&8s9885ɜJ*TygsdG7֍$uk"P*03$P**o$]Iw~_Tp%J= T8|QuP*q׍OgIw׳T~X/gQٽAN$[d 9\Ia$05TO&T$*TyfUNO$%i,בE*؇a/8e IGU9KUPՈ!Ty>g_ yp's*U.MT2/jFn<_9.!y<яՓj{L y9L@UTڃ*}vRMߜBPEWEP}$Q OY{eJbU}V5R`?-Znl'4V7ye' ZȜ>\s?Ц)*mx@ _ao}RfR~7=uТ\;9nGQ8-־4W_S+><{kuFR5@3|_Gċ'49iDh<_enX#3f4J^hQ''TÞXPw#<~^-W /gnRSnR١\uma/QϝLV*(WU l+3(3v/T (+# V(^5VF:)gׅ*G\LP,{gfq=X%S|Qeofln5vǔ\sub{:g6~uy]:uAfzd`'}cm[ ֮*fx-")m|EPʞY?_vtfkMEl _}fk#8`7 S>Q+Q]9[iPvs݇}G+U7b/YcwOQ;?͕RjLRѪT-ege>TjoOdؘӊ)J4 *e~d<;^<1O(n^cG={<4\8¸(9[)L3x6-Fh0ƍ8Ld,Xx-d3lg b~bb*f2ט%̹ۘj~.7ȯ̑= E5|7_fg/sUώQiM;Qk>t;|-f}Eԑ>~~2_~]o:o*JI^`Ŀs}w QԪ3E]/4t-zSaeס<#7u[p`1.g>sȓ#O%C?atQcP:>G-~ _SĩC}qƥ86g8s t: Nk2mv-x.qM3ViI8&N)3)Epʨ=8Nv/k?0K4IKBބa!FPF" Fy/8ΠSVtw㤣*tq,ttI^?Ю# j+.`ڦmΌFѮ7Ю;t̺n8=nNLũ/m?g'̴M8[QႤgp6. oqBs=LYJs~͝7B[, 6U=]&ԕ^艫{4ObzMF/^q5s=N ÕkѳZ@\>)5[>q Rqsܨ[*-p6n}mO0|wn/;bu|m}u.G~i C N~v?ފ1}\Li1u&vƤ?1iƙ-3L-)s1e$LN /1ioLJ2ċ͘0/1F;Ta=~#cԠ% i9wކ1{bc è0| Tbx>|CC1n!Mml [W1gwܤӌV-a6 No!]M^҈q;1f0&M6ä:5J>a< |W1xLˢ` lQ:\ zaօFRDM* D=(±u,fZYc9f`f̎ zp!f3Ŭ(Y1;Y?P8 ;Q*{Y; ׌Fae- Ba;dfk-R 3W`fE/95g9@_C( ߠ@#7LC~kȟ|PLolD>'c)##_Lo-(}^i =61ܼ1`* 7azO`z%b{ƘEL0=e1]˧WLo@qB~yW5!*_G'gX#? ]A~qc6 f/DU 2g2=9 MQqk=4 bHOd{`e ZX̘\7Q(ۂ}KfEN`p52C2>`[[X#.Ӛ0mLde%Tc?LDw7SbmBMv OBh F~Gw_i-[1X&a/;LgbjL Lh؆ _aB&`±^w 㯜O1aL2 reĄꉘ|*&Z9uM1t`Ba^LP?ῂ14Yal 땁pn];C1m , 0t +F_Lͦ84  i h*?=p#W~Sp>n|^y  7, f:B{!9}ֿG3zA=>o'cxGtG#wDSkj>Ǘ;4C-9>7O[ "-fKec!Feڈ޺]>םޕl9czwAoB7EoǛd z}WGs;}Ao!z۟Dok'7zw}z@UgRWz'`ZsF3~ZBh`։+~ǹGCѺrj;-G BgbU5ZxUխp8t4L@OPwVꌐuD;t C]a0IF]⮯գAQ[> 'G=nwZVh1:Va]4x< ;?a.< Kp >;C펁/Av* -h*@3؂fq,`))L2M:f8U9m(B3\Zh&qȕM8xm4r jF#8TpF 8|D\M4gqX>Ja6"&E8!]AA8p8h\qԗKP E}mހ/P7b}cw5g}& 1j4b_?=W~sa5y7@&G'QBfuS?lPgeͰر,?+݌/Dbh!z/y5;Qse\:5c֬un9jF1ajw uڗأwʽhz3j\}5މPt:roY;Tij c>BT$L#(:|ݦDaw{g3[2&0kT)>mo\-jKPUu\=FJCBҼy3:h5py10y4sˑS":T @ jjka=j?AEP9ootg51Ɖrhsi]oVms?P{p'fjϷXgD1<ە_ϦK̋Yc3kI:r}x^[a6y83>YǙy簜y3x ykk||tva>f>3N!̻'BETiTa0 ·gs~4k;0+˜73m=e˻L뵥L$[-64w<4,yd<ļXQȼtc:Lg<>y>Uisy`wMw|F뙗O210oO3̛09n})̛aY6+&CJ]|٫|sf~f~b~71?.0TRv̯;/ } OQZ.saRbUYcjTuU.Þeַ^6[&ZFuhT?Pg&j䨡rX 5 O`B58~&NC=ЉsytALr)Cqڥ)8c:.Ez pY 6 /M\uz*q^cWϊLMqSo ]\0|n+G`mb[qsFQ+bT5ƨDctV5F{F`tT9F1fSGga [KGclu;MNĸ "Ox_Pø\ʤS1oaLZF1A q]{'8=r wAstwڇ}pu?\y$=ą3\\VZ.8sdιsp?3[typ^6[~pNopKtdhwj|mqMu4C䎽We"X46%n?FrbPQڼCxˆ_tDDArޚ_y7j;L}=oӘ*߸sDuÝWl4ܠȃЈƓƃo=H7˻o bv4j6Ӻy 9<=X v&vN fZƮzɮy]k.zv]5 {ucz%?Kv kvj~v~gx~'<}2 /`6w~)P[MΦٲyZقm{+Ibli[|g+OٳZsي,[Q3- z ܝY6cE-_$`f%Ȧmᱩg٤*6^Msd3l`6q'ƍTJ`-S&G7l otM{f [ٸll"e!d{^gt +n1[=c+߷=]Laox> }mξZv}Ԋm~~]M-wg)U-)qfYRZzr`R~[%EJ 6Ի]eBCٷyrUNQZ%SZ*ͫەt(GTUP4S9V=˔fO*m3Q(] QT.YS%JrLZr|+,R}$){j[]:Sn*ȸĚ<˴5*b=3~Q̂ELOV=4؈#/=!;6AX/:xc;į֡t i+$:Mꗹz mi42Fÿ}r;Lqk~ ~?vd7ևSȉCOD!#wFZwxM\Җ#zP!%)2z"]?ʕ$є^I"OT*Q{ yd6*?Ce4Ǐ#*sIM[:c IC^R'T*T}i#Q UkCU<$YEU5TBזPUxnU_OUK7+I>zQŞT*n$n_ZIҍ=r$T~A@2SuFnOջSޑj'PMoڹ̑v*:hɦE$?C/jTUNխD-jŽPTu<ʜfSGZ5JI*Iv :-2*QڿT1AdbVO<U蒬4ljT,U$#aM@OI6Ads&TEȻ$sdsSEw*?@};C2"*mRTVDefPʃ욜dQEp Ud4P>:lC u+(9O h UnGHvʔd߳ӭ$CIJۨr:>!YdRs"'I$bD|$$80=I HlCגxjMHDOITxD IDe%Vm&*H"˱$ҹO"$2G"zBdk*Iͭ}$t&}xdp*6r5wC T٘+!T.N%8GozWK $ՅI~_x*5$&tA4ʨ&*zٹ$– *JS'TDźIt5D$$\"7JIYD]v]FQ$ۃg$zlNKQ]0DmZ%멠sRN, %ɷk$QM !y \吜{S'k>ţ& XTi?vQMO($T_M]\m ͥ-%H~UﳤIɕuT=іjʎQT5[AjBϝvlGUMTuMjVVTEHUET}71UT?j~%P$/SUpv&yH,U1kSe,o$T7OSj,;|VHU^[HwUS4©**'d+W &Sc4OʊT5GӹZGf!WHVoLUA$L.UĤQF}3IA2yTLXu{C}*QyeU\Q^ӣ28[L|:ekghͬoĠa7C+O+%^am-W2DdhԠUjbH->H]=xģ6~Ң3^#3 3C{f2bEb7imO)}1A_W3s3dc_o4e6eb_?3{mɐגk3#zg+J\a*o>Jg'Fܼ(yX1B1&0MGF22d)# gdZFteėLȻcD:3jPc +Fe ҸBcu?QT"QbmݘhknތyPħ1nj>\9 kcfc2:L¼_3vxƔ1 k4c{aJ^1w(i+q{F=kkٰ- {z\ڇք6]UiK!{w;QGw2xrx/YqBdvONٍ?;$a_˾O^9Ž!E>_u;=Eϴbbb'#&>]bf+fxoLSsxLUEtsԋUjnub? 1l1 Kٱ*/K5칎bRGR8@hq*J>BA|mBH&*z>tt/ K# V=?qWe\{} ղ j Wףbz.|+$dx#],Xc|^ۡ1P>H]dp}C!-+7n.Gw^%e?Ll#|qi6$cTV7>]4a5Sd T.D(9Z5CA @:s08m,0]͖ǂ)07b~' jm)~[mVbC2c[R0m+1+`X=1 XPkVaItuoFnuG*VO˼bRkIŪX38eXuxV߿ZlbMQͱvic+>C3Y;cW9flm'z`kl)?-־ش.`Í|^a5$y+6p4D9*e\k!`yJV0*X1M)XyaŴFX+ͱ{, ,3ZbL,Kt;^XX{$N :|wKaLlS-r96 }sv;c:IhHdD{۴ u5 {xcwR߀c6AX lQ8dC8k#'R'V`64τ0 # '9ė%8RM|%:?㎭p}4q紂}>5^8, :w89ùT8gP\Y 9_~N ۜeR {_so&m<> Ywx= Gv~F! =këCLw2xcU9ܮV?>#n#u&\"p碦R K/\,۴8 I28YX `Ώ픶pN`o { NЅO؍q2XV ƿ3t<^Rrv ǨpHOJ䖡WViqۼ| OLC B ů 8!H 2:x" !|.b &#@?_9WIWSi|Owq8V}>e5m kwE_>w|VRI~o ~3Noy37cq_cSM| cF*egXwNW5W)]md30|+6+[Ɋũ$ux+o ellSZ5^qލj=z:\Ykx}qk=pJWtkx 5c [ Cik 6ҝ 7+51^'k^;j4@r]y׹fmer>\ J selx,_Y }1{ i~c\eT%_y|YO|^E#G>|kpD?7_*J߷KU寯~_wJ /Τq~1m_L_?O'ߘ:H}([g}K{gcx\p/kǟJwq{yUo =r_?̨[??cynM[^݀{&j_oCKک%\ude34>v&p?wF&>` K`C~,֖j^9orX$,;E&X W |"jVQ04'w݁iAc 8d-/*q8P<Tp}.8ئ ~gmoW8()P8`:Cq@'*cR{\+ػ&Jp ʽӄ[ޝo!_MxLbʱfW`8{/`߹iR}f[ooܤ⎽^IRIOI؛gёڔtnu7LL&q{^T{(mPl^b-mc}æX. y5' ia|,usaW45W?1ӳf^fW16fog0/j`jBL]}SoJ])ObZ6 ԉNmrL.UǤ]VخYL0:<ƿRad5 Iuw<=/0M[E0.Ŭ0v4>fb-e-=T`|iQ50*\l9FǨuTD_IXD?~`ܢ*=: c@s> aie{G|}U7;cX%F[JFnȑ/òcD /1PbcF69w)nj}0ygx'b2/1O7+J~?د샬`X 5CYoB颁]ʭgբm_hv> `PP >{:C#$ 3ZwCkh1Z.zo͗ڎv#p:z?5Ρ0H/_gƥrḶf Mіx-z턾K@{)^@߲]=.D.aîo[cVWKDヒ{$I/ۢw5^Bѳ6x+v.눞sTtBEeT$:~cOJѡ/9Vn0=0l#hiw-?V+3]g£뿾 [Fˇh]_4R/j3| /+(}oڕrkֿ@^ڤ0y7hm%ɥ>-*k)-N54jE7~V4V'EhG-~P^~;:lKF>3jv]1Ÿۡ47&GAGO@u]6T2j{w@hOz/@{%f)oEXOr T UrW‡ZKuP;POܭyKr]4ZEM )__ Es_/.$lE/˅_=˄k!\֚&:@cKht .&l}4 ofʵ\4| eh~k=Z6$brn2ջ~V2oZ7O] Rn3mro3 F ldnr33t1۸)?, ^NJ X:k'b' +i6ߦ^[v WAs$Wbgdoaj%ap8U|wqW][30qɵKX/n4Qb X,hEZXO0sR>}HpĎmǰE[(ݬ5KbN%.ދ`e+EBg,GaƷg ӻǴ֘{f_ZY%f0Dm,WyC,y1O [p/ &]<5g alT@i5Fn:C>@v_=M&8* rg75)_K뻙PJ\[(3b2 -^@7t|@=·= {!F^-Cx? of7 }Յ!IZNU`aB񵬢YKUQa¬Bja2gaxUnWkTaDN KNԵoɾO&^+{6Ee/`ZaY 2ǥB6|3^ָc}?c9K=ڔ}Q#۹_ϓ'0۸I'ҥg||^u;tJwi(D^oN$wiymU_37.)Ao_:[lu rfʤNK-f/Ls[&ߪ.H.^fͪ|6GO|[S;!;-:]c'_l"{WyQ7]jT/v(/O~|ةP;&6ja-{Y%v^)qHlr_7!Vlf^y_l]J߮P NL8T#S}zxx#qWX80BMj77Guo!.\&h$o-TvJtx8wءWJGq8%OV&ӍEyŞ+sDWGV˻}u#.;w,jh?*.'hn*j>7/^{&R89J_q96?27;DʃʬQ~Eybe+EEⒹyŃ2%rBqWitdODJ1DqGa]bg1g&f۬&ϛwShZ(n*ԗW?WHxKEs EΊ.) >)ZSS>Ph E.ZR}7Eax8@"?E#}ZU4zWaVER=M.{.3`Ϡ1slncuΎnso M.g=ǐ^ ./^vme ƈKe0awrMʻ}3Х,74V0t\r7wn.$<7h"ca :1+˄M'0:ڼw vew Uufs}+z/m6` Y̰_rѶ_+g|7&^IeBƌj?!w3H2(vxèi\Ð=A1~nx _yտ2lo[1!3.x:3Qxb믔wö0, a9 0t彟v ;qa2]ry bع ߚaڭz CZ*rd@.v`@ d@|+ _={g4\۶E:n &}OyWF?z~:o(]hLf5yC@5 _Aro!OCA{]1?Ȁ Ȟ@ /cp#CeH*"Ȇ=sCFV(ۃ=2D3C.2;?+7ah)381DŽ)}+ =Hqɀʁ0 촕35y4s7W_Ȑn *0%m<[2`14Y:*usӧ3{Fߢ95>S;Cy?*`h0,af _?Xȣqvb7<;0z\Fw>ØQь|YĘÌڛ1aAwS،1>*c/0cƵ:e񓱦'>ucQ3i¸TsǸE_sW0n-c3:a\.}xm鹩 c?X2f}LO>%soX)SL;Ё1=Z˨sc&X3 F>hMiZ %^u1m:6K+1'1\u61fF-̨kݺQ1T0%#LېZȾKp+ Ͻp ?;5 s0 U]o(츓s^ҷ:_}8ҷY__L>Ktj@#:.Ti]5oiOoxlކMl})9{eC߳<섔2v=o-9Ik9FnWaj"gv30{=Cb?0}O!zYG=:Φ0zO37z,H7t]AwszYF&N҅{y=OW΢GzLFCIso:z\A]\Ƌ.Vv~-XA~<'fUh>e4m0NG:Bz<֫Kt{ؕ>:-')e)i~mYCϛ=O=|-ݵK5Q'neM{E+% >t'ܲq`r{/ hTuYCהtUF+X6i<к7:Ѳ<9gOM VT&$mow(GE(]+h1Ti{>Sh߿3-,NG!zo領\Ь\NZ^Ck]<==q1[nZgUuGiZë?tӯKy":ilڜPU~z\?H }:e?zփ#hmT)4 }hk+=sgz&Ыmz<\#cj)]n 1ΈA*sJx&-[s~\`hF?˟L@n%|z06C7)!К pw 8C.v`h\SL0v_}a^2"v/?a.ԏd Ő f% +63dv#f$ d賏 0d q6Sⓠcp2"2*CFLdPBLw޼gh2C%Q֦Z9Ɲ>7}bӆ{͈)_H}7}e`z1Z/y2fȁ&0a[ ovUȘ7YTz6֌27#fL`FhuFi0jK#eDy Z3j#2|FI~FsѥcҀc2RS[3xdҹJß_e]#g錍!UƅYؑ{6_9&*ȘୌMObL*XĘ?cgtƘ2F~1ٽl8cv$cqƌ癌:j.}MǬtzCGvtFD_@˵cx6^⦦^=ܤ\sVn\[y` 7';\-2X ~([=ٿv;ٚmԽuQ]x[r__V'KVGx8j,I*޴ʒl‘ZP{|Ló2\ẙሏȞhm< 8W=ýN;jb\&b։s`6oI^MO8c?B8ԫSw,|UZSo7,-Гbr]XbXhlU1f{Ŝ]d(&tב%(ҏ(4Oo.>mC *Tϟ bQqIŢP'qǺ{wOi/q.w#ss)У|4ƇNqsͯ'%>K7hP==SEĵM"D7RqsR[h5zsX&h](^z8WQCjƒ,km W | ^%e GPMI ha 2lz*VjBJ4<aƎ1>bL&.X;,%7aXvêEX4bfWl[`C3۱yB 6-*ۡh*c}^ ۫Hc2.L [6ofg\ߗpB%z8: z:bO:2q|#;*S@Al MqK+܍{w|VV`ص {OLɍZG>bͩC vc2\o߄1C4\솝(8> {9o9{%܎%?.kܷPmxh ځST!#VzA) e B;pUIGizMHUG$K) I}7 !Z"b<@H]F<R$#'^/fw9 >ȍE=65|OR_=?+sBZ Vo7Tz&#XWb~G?3+窴Ame۔6mTߧ?@G#pN|(5J]B(}ퟒUpb)&`)nW)h v~'2C#rU?0Yү_j-Ee_B'h |eh=)=tj9 GzT)e=3y2|Lʕqt2Fyo]#r ,#?}[#(HiG_w^O(}2 ߲|k3bxZ;-Woz%Qwa6v*lv!Z6BXbqlXuE[0{fai|CX|%NEF`^4ZLWX._S8u)L{f*,\նS`~\*qbE,.q7,q'5Xnj!N-Z]KV8驍'``4,&I:48z=,{z58f)3O|c8ѳ݁UχI893N ɽb걘1+Ŵ0eeYsL1k=ńyjjb<0I }W(O:h88 c}ApfdBV cqF7톱0Fh9ѿ=z71Cza8gnx'zBDj{}=Gл~5@W[1K-F+2F߄asWbo{i1Ed~Ru}̌QE10e Y9|Yu0Z Fc"`nem|I:lSmLUsHYj1~,+sOdfm9vc\w80ʑ޿aĘ>c4^C:`Cw }ەg^wJ~0$p"ބ>wQsMUkAIooaɎ &ۦn.Q cnG}kAƣD,x};bt1UHc6o ɗo.4[A(e]G_m _^Qi>[ZǂvWӬ1:/DR CR)m #3X4r[:j,Swo Bw%,rβ+.TtAG_#t\#z6G̃{ n0iz=h?m.}COctzt&J O߄(lfK?CY 9@Кzo^BKД]BS>>RϿglѽ|>nЮ$-=mmV~ɸ@-N@;h}p4ZD(tQCuNJY΃>ڍHrA{ h 24jQ]@{{1Z%7f h4*OEn54vYVMwP%0Z{A3\2^.~|*|xR6 Zw ?V (][o >B~u-zFK h;Tߡ4Nޙhu+kDc4n>E[fW莙vBDhA2 Z-AO?{Gkaot^%`^l0ۅ#2THN%]`?qFgRl0:;b7 ~VڲC,-]:pB:un?G .gߌnճA-:M*偷ҼX= }n#f8=)Y>,`y1>R~'9? qh 'zQw5tL <1Jlc^y/ET;U0F3:\1ۭ w*uȶh>d|&BeFyv5=Z [5OZ)odE̓e9y:KeN^fd'#2םq$w˖c͸aوYsnu9nlh 5\;6~+5l 7n/}4Hמ_Ue5.9x&2X|]nF K^7wp7w~S+U5o< 6oN9K>KJyyOy@s3{DO ~fɭs֦o?uI7'*d"i%~NT΋/6Ζ,,X#7L~vF癐Zߓg<$v"Q yMUks.̔̐ok!^P,{4Y..*x'5Ml%F|"w+o]F,[]~,NYc*-Cүwlhc'qbE{E1R%$ +LEٙsY{bӭE'1ⲵ9W'D΢8rӺvbbq+%bEb5_ QcSqca';{w#<.Nxf)n]):?&کֈ EEwwG1v1YtU sSۋ~MED#1=Ϳo;"n˽/ZFn}66Ѷh%B[).-$s)m4g7JOJ3Xc,;!Z>+_#:D2zq6di%^,qkv5₦gu [{VL{gϐUeqէoJzV)m;Q0'3~xqsip! -~~jfmsKDm ]b*Էm^UXC}\Kjhi٠-t?P?hn$*+.X5w*Z.ZtL\EPŗZ7ŚmbJlbQEϴKVT-*tVغTa8BaVyeQ1lb1*E_R X>(sbaD lU̚60Ұ/#[>e%;͟) qh)8{HT0b_KW;ޗԐaQo~h=!z35ί1170v{FO`er?+G{ƈ>z4s #{0ri W1`;u`F Lᅲi׭t,`D'U,90&KhfN ]-xTgfm )\a ,yAZ=2'E1r23RdL۶i#~ykb/4gF$K93eFjv":0c Ӟ70%Ӻ=fEC7aV;s/05̌.35dr*cꙧ<%gn2e]SND3#ae)?$gNz\܂^i'7d^P_c0sY(,fm܆#JX2k5X°,21fmMH?eQ,깎ŷXt '$]+ ye ^^Q^+cyY*/O^X:_a,)˧Y` TeQ`0eQhmbA CG~ckY{`ި=,ф:GX: V2,\`Wd~6 %[<[J2?Zw0?X1718~`'¼әwyor /;P1_j(CQOf)<`5-z3s7e4fn^l4a^ʧSlbI6];9lcyYCbW]Qܵ>iĬfnցy=h_cR U~3.J -9)aL\ֿ"nvd\hr]:,#1X鲁q0C&} ɗO =%eVR~~Ik71ASf{ċ~IQLl&ɰݎg6br1I_L 3>cJ660i O 2[ގYdu 9-^|*^1M90J^ӕi1ƝϸK{ϊSs1O#f .Z˘`pF#]`HCg\w OgicK=w@=!qO=ŕQk=?^  ?(^ &}eL3V1`b2p/a4F^{46N tcJLcП~8ڔ+1}Cʖ20 ݡz]jO3'=7K|[7M2[3F[ _[z^H c,ZԒ$ϊә4G{1 &^UgL:DŽLس ,gP&\#R.iDŽ'0ޞN7:x糒/Z2XuΌIdSIO2,FglgGyϨ˘}C>1j&b 7%T(;KXKatj5[g>TwU3*ה (` a1nx/gWfF7躍7zܔInyы?ܶ9<]g+%<vԑzĒ=cf6Zf.G2f Ǭ{r`v'flLߓ0>a{M2gR`)=^<ޟ31s ҫ8q1/f.dyRLcڻx1ɘMeI̸>ׯdZ^Hgg̊  '0}V/zbfuo sI8g.sN9G)ߧ5i:^Zd8EyohƼqxiU<j2^wi]יyoQq"B.oB@KoڄϙRX$ G6/p&<StҢc5nېlȰ@8i+>;q X" tCa(w88np>I˯|+dFƃ`BBȧ8Jm;qAp>e)lL$gL*x#=4ˑrg;Z"m-]62.\8s; OO$5H)#"u  wpN .EAd.Ǜ nLnKpg{Oܝ'Ýp4(7Sgx? m- U|w8>MFm>~a +g)>Ĝć'PoYT7%wjv>eDe-jgh|]uCcHs3~5M/4jH_y|>]C!4@C/_7w׍EA?EW)nįTh=U.QR%OJhoDT9KՉU5Uݗ2e6UʊsTy*OT9Ufoğ" GQ %s7P˗*9TO]r_jRU=PcU7T߈JKͩd1~,ZHowoCTmGeӨZQ}{j=GCZw5U^ST?:apa#Q j-u֤6Q35'MjwZjEn!L5Cn WE7:u+'Q_Kz;G=GR_&ݢ^O]4:PSuVn7ԋ;GӨgyPǼfIe>u6_ԉYBM#oB̩N8IZPFjE_}֔ZVRT/yF[cڥ6zJzjGԊ}[j 6 Q۸ vVwjצoAwְ.귒&Rj}ϥ܉ڳOH28P[k %S)K\\B}truP_Π?zبyB|m6B}N~ԯF&{$oQ~si9Q?9/UѨ'uیzWS?UْP7'븒zPT uTSϣ~Ŷs;M[T}l4?,$YnJvRf-P6DP__2꽕0G.P/ZzEP/L:8z7JqzWrWH)_"݊o.٢=lzTK$!VQ{m5[$}FRVؕMf#;.Om^%ZQ/Bz\]J]q~Kԩ7,u-ΎhF'RR$_,NW|(zU1ԛ!hOSFK/n|0{ uIdjUPO&g0G(%ٯH{l,p/"a}5(rgc9N~N̩b3uc6:#'P ~ԝ,I]g/$Su-uHtsӓ:r8bLlN/O<#Vx #S}|6ƥT#qT+L6o՗lzKiq[#gR]Êj6RT @~4o:յP:vڂ|;!T&qͨ>jsFSSqZTk*ѾJ$iMoc[p ծ,7ȣT[ETQFUscITk9EϥqTiBTQeH,UWi"agc M0g)U?G~cө{ XKxO~ 3Ot0ۂrf's c o.0|;â_A[|Hx6deI-|ԣmq|[ru^QCF |o!iG]j|o* Jv._ofG񹮵?_e 샺d;|*ǷON Խy"׶2|t_K8KXS|i؎og*ԎyjQ{jD]le|ڈ/Biho|qO0x6Xu`G]m| Z/" >0@݊1be/ܬ;Pw~| _Rm>ڌڃ)|8S/|:Oc+nZ?QeU{PA>T6TrBq%sч9UY>䀪PUQ3a!|4Xnv#Am8Ty.kQuTUmjN|@ݨ'b|^8_:ŧ@|\O}p I68ףPۭ k|Rqiez< >ޒK)ɶ j'DS4gl=j_?Aŗ5KEj| 'G͖)̑ƛgM}a U/Qud:TEMlT/yCWT}Q+7\QSGcoTTjLW/~DUTo@U|TlD TGÉ8TjP9[MƇ|նSamݓK/'zJT?G/$[z~] Uǣj ]$F&:XsTt݈>p֡ZҜi@TGpCYVoTICg7}*RPY %wP֡)Y'kՀ(:%7oJD9tqʻ1JT-Qk+4eBQe+GL޵ŻgP[P+ A&/ |&+@E(? }^BoQ~}@)x 4,T0?Q{*F^A999bXTߋ#WP˨<_HkFrqTAeY)Pc *EUCJu3TENEg*QB6N@?x5SơM&>h|ꂟjO݋[Q~A?PX@}9|9~?5TԎ*6PsSDst.p@ 7I|FScW 5Ro FxUP,J?A~9~hIFىQhh1 Nаj I{~[?sN"~A%hx2?a[~mmv4għ|>P戏ŋ_z܌Dg/?7mjy^i7QY2fR\4|]W7N ot߰x/<a~wVHa iEq$nƵp;nZ[>ֽ#T7nՒGz'FO+:l=.߿7PW@(+:@q.CQ(JǕ^.(.CE(7HuG (\4E(4?FQl5 Ewz.W6TpySH&Hm (LNAэg(jDX\+:h4 峨Y_d3VP/SD@k {j`ݣyOGq-:gǍF9'wZ5}}vAνwvے ^9?c]hmfnS+.w337cTWRuQ%n.bH_-aP ;F4el&1mlfPoxLy(tyx^ҟ9Tߘ9z7PӃُG1S^ɋ%ϻEv(\5#洌G(˼#KHE`8Ĝ-k`\gP~>[l[Z_L' bA9ļtC^ݧfʫxIW` KB)ODr**Pesݣh+HETLצxӂr|w1u)D/L\[(QcnI<17}5s60vf4b?x#sKzdQ~Őb3(~#庭)3b)T${(5;Q)1ak*6T$`n^4{Qԅ9k'Q#$,.Kur!Au`AHh/$($Z B5w!A!H!w!0+GH|A[Qҳi0D0G]H syBt!]W%ɦ-#$, U'%B֑0M!ac${D0󬐠!ɹkQ{r`R)$n/-L { dj"$ I< ]J$̅C% C$7 ^;cBB-B[+n w+BvBBN!^o.~Bb6BP!!u88ꍐx뺐ig#$n&$^_($; $&$늄(S!a!1eFH>]Hi%՛B%lS"G!Ez64TkEB4!yx!ipVHRZ9I; ɧN Wl$ީB S!9#AH.JBJ!!9U <*.\HQ%$-R )w gtv )%֏37 )Bʥ`!%NH.RnHϝ3$g™}mBJ.ጮ$!Upf$ħ"o,dtuT[R7@w EL-u"U[wRw/uww}~[?:3̞CV|[o(e)O2_,hrnO6P֎u ^ϱe[~+e>IY(k&MYS(Ϧ3)/eՂ(K O>R2r")ew3(;eA~e]HGCS<2 Õ aS=ꥤ얘%Pv|P4Ҏ,S-ʊHP)z-adS`P~/=˕(.7>;eO 7ew+H fC=F*%])k3z]~ÞGFY ZS\Al2aQvʪLYS.Q$ZwrPNx0윪uOUSSkksSv=> FY4]RVu:qx_}|pqzXєݮ r ?oLٵ(+e[7gʲNN.\MYߐkυy nN^sCu.xĢ+{k#)k ,J>5k x@g@ ̩&(#,@nmk)fKY;MIYӞo\CYw,`\lǯ)"7Uˎz#OVQE .[\(k~ rGlMe>(c9?ևϣPw s|Wn;\" ʮxbot:l`l~DY ބn8#FyF'6ߣl'Ŀg_ ƵE> _Q{ջP~ N)kr68 Vu`|8e~{V-F=Du1|0C`9D8ak;ȍL-; f@Ry >1We+p9u >{{ZF}R[з9-t vG/SN1Δu<"#'\x ^_L#81DّeyC[]'(k2 샜ێ2gqͫ΂&,v=8ʼ:3ae_Q@kZ\cz;(,tr'㬮2lOrN'v6m(s`EkP* zny?~f(z (ʼ˂Suѿ=C/5!,c_KM~=lk )!GA NX-e7;/12-QS :ž2JQ:42hz,enMqAwl*A Ր2A$^aʜЎU:")sf,H#7e)j/wݬ'2mboM</?G\Sp̹P'giGRY#Eԏ<$xu!evAG~wAȝwZ^bzO( j<W:"|"6\;e7lC )eEeoѧ-B?8SAƑ?؏f4Η:m' #;_.}/N)_{RK0_/^(ǫԁo)' uB~lr.zQwտ(V:e?]H9zR={ԁr(gP"]ەVWRޞyWeoNy%)o]|e ա͔{w;(OK?)OP^wo;?w'Cf߽)tϠ(ߺ=Dn(?GRލ׆0p>K(5KΔ=}(.ldh&{.e-)?2=OS (a=PB5(`_;Q~\$"CzO$CY#ZQJdPB1N\b/? UUЏ?g }wЁ&C1dDRVd9 #C/ Va;2?#ˍ 0FEkXZC^d8!H.w"dNן , !ƟdxI?hA]Xw>AdK'cdAd,w2N%52F吱?T`ӎcDW]Ș^ux:'5%Rd̎%[d _"87ZX?2iKCdlBU QAWi tT@s 7ψOi} T-w7[]]{ B!+u,F>M>uElm %0TMWΩ?N%=ܣ!ˡs!`CAVo*MTRAT{AY? VaX;CC.T0q^dcnmT*Tp/YT`,~b( /L>B{ JЭENcm2P4xwLn@OOQב;ʡ~t;  lSgdjxϥ̮q^ b|/[ ]iT0ð[7MwXJ޳_2'3`;pV׳[tkP##+Vɿ)ԃ-a/u3TחLN[`fmVdExX̆-OCC*8:"T1+^5 <ߑr*`{cI#`H O/ J6THʁ{TXms 24 ?|v!o_:p{o]W2E_gpxgTpG2<]w@8Ov~,2xAd P_×.?]nal^Ld;nd[ssN5eG2Ek/L `%ntdK&|M"S2b |N&ӈ:s&UG̶V5:ލ]eZ^`,j H19-CE/ ߇YZ@;y,Q1Žd]뱮ctXxk@kȴr3Ngd] ;%S]}iAy2 LÉ?ɔj>YⴍLgwt F!|c'p6ɀTF[Lƒd:,A.3 ֝L/`-Mԭ1pcb/p_B)B2_OdJoMdziK2j4i߉Ly#{k3k\92Ad:3dj8M%݃13q^dجɞLM׀?zhS֎D{;8/S}]7gq* on6r?gQo2݄Sa<\[lɴ: !+}.8{ Ui2MAnWl:N}pw#R>Y"AO={`.VWp{L]nh?{@LQCBsU! ȽMбe^*|^8?>&a r_e4x1kY݄z<qFyj+j.]ZLClC\>W"΃qjF 3Iߠ/▂m.:45(2vEO;#7F,@-?|^e%ni, qA9D3Ըv*'k96κ( v5Pn-ᨽM j=Rq膺3H@vALZ!/TȇxԠ'P ؠ|''Z _N#8߁3h\ {4r;9 ۯVn/sG| ygIȏGZ L™5gxy~!.6K~n1ѨyJ&;`vNK{=~ jI/Ӄo?/bV'E{9a QG9^0 D~軑cx؋~kzc'`;{avY{1mA>߰ˆPo,[`z* %kvio`QЋ^w lU=tOW4DBxp Ԁ݊d;F S퇭=~}s2C+2~b2Nd<kqG>76!c͆dUr%2jΣ۷(:pjJD2lYI-d/z`q%! ) Ca/v'ч i ~ۛ !,xDz%n{fu_RWׂey {R8)XG|?ɐF8uMGdhy ʿw a0I/,FgK]̃KR*8`%=p \%Q p5ŽQvdF p !CDO2X}ڱdX_".'" '8+OQjr+@̫Cc  ع Oݿ9i/gout<Q鲔 mE?b)jG!OL-3mkG~P~IX#~Q~ =ɦ̢S?o3h\'򿐙M]S>G(0v?ޔ/kEkX`g?(}a5{d7Rg߰ t=ѰcVu/[-_*Oy!q:CnoO.\IXDyERLZw{ӛ(m=;T>a#nʻbMRqs1==ûu'ɔ,ʫ}y(`U|IsĞ -7(^0dϤ`S2Sނ;縄nަ(o#sԥ(CymNPg[JP;C<ʝ߈rP.zW)7lϡ9w)rʍZo(wn mrNԥܖ)guuN)gt(gʹ>rΔURN1Pxo}r*Qʩ8o()ǷeJ;>RÔ=T/(; ePv[_'\)š?SvJY>R֯Xʶϔɇ./ (k6:ҘroQoReEY=2)tD_ڞ֕27(]>evr,Y)e!ʬr2~ޔUAQke՜vlB;hǺicj 覠htڑKܦhϴ_ 7/h{4>w,mO>E'm_4nQڮIDžҶ&6DmKp߷4m sh ڶ!msmK.5i뗒ms&WiuRZx~ZցIuy?)Mz5.mC[]_VOVЖŻhea̛\/O[t-|lB[vp3h6ЖcFrn+Җh˩ִ%mYmnm I[.i[ m:s6ߟE[|*[9km>6>O[J4͇>h<몥%yzY\hs6k0W̵ͺ<~#mߎ6SKȯU tT*XW}UwU!*baVsu5,sW O<*3#ִ\gNB); q==p .cUv o@M w0w>|qc{O lyOq}}9佀/ޗ{k^bK/l{o ־Ǿ 󟱧2w ~)²PJDJ )uPJRHٲ RJ!񮂅To!!w%HRTjBj`o <[mL  6dXcN 9`! l {mlkl lfų-{Ru&H=YߣPt4 ]cn=1:A#m wfHC7؎[!~__c5>xz`!ljFf=fsCcȵ{t>v}06:BcW q.wm}Xk8#>v;B# 뜱\p }]a+lpnbQvՇt54灙f9l d0cx߀N e:At:N r{:zK-v^g `. ^?wX?r\_<{8b||ogp|p.xku\s.?^!6fa_q~+)~,W*7x}W^\ĦXG] 6ynf9f̾}2ϙ.͵oA~= 2lg":i ٵİ:QTvUG ],e%쯄5C쫀KZ6_ yy daSy-r]]YPeakY̕y-=b_V澣r~K[GKa ?sa^ }ţſ2*R9 ~nя}ޣ{{s2^|=3|'X2{L컏>3.;_oz s71w=g }5a߀]컉m2nIq>_17@K ƥYpws TB\*#NUjiu q^k1v97̹il>;hr=to<ý?}!C'WBτឱ\=dAf8G榘hA.9`g:9yIJr1<:K9:P_a~F:Sۘml`MqAـ69+zO%\ȵfl.Wc0?C\A>ڂ/I\m0'|C]C.ف;v.xWvu׺L].? :b Kq& _`7'UI7B\ư߾{b}u>9 :GpD:Bppy;#θw:|-w~׺zW n ;;ly&/ ^/~{7FovO`|>Nu5|Q?}#_鋺 }#_B/P|~i~\F<??.*lUU@*^@G ت{Z|oZ{ آ@ G|?r mN7MCM( 9@"a{ p FAA P `p56C0C_0R!C<A 'nR{ A BPCB!BP?C!f9aOjC,kp!6hpElgԡn1އ"m(b N"wCC(ΰP1ȽPp9:PS#%rSD ] U\xBRo>C/T TK*S#*pD~I R7|S#ԈqvW <vj!FqՀҀw\c 0bia~k![i3-bvZC`tq:R:J:pExhas ]ZE^h}րf஁o>BM!'p>nE8Oc.ҡF`됳:_U1с:,xC!-Z-K 9Z-5hy`Rl9."_q3 \_ԡ2t8m:td选|!:ئCKY6G-f>>Fg <:CXx:ĭXtgbWjM@߽yyyyY_zk',5XKw,8Cb_tq|6gC)~?<{͘:Y\!!g{kk6#ź2q30^}>ee2cf y\bj/QqPgu31S5[ Zg= O j\; |U*pT ]J*m(T\QWCQB79;g߂;kP[PG {'1@ @7Am6A5Ql̛{?뇺 { >dq{oF.yz&/ ='@<`;Oŀn u UCSqNU+WFmVJ-" ECVˣ>Wr!eeqޖ/ˀepVKC_iĻ4zRȗRRz쒐Q:KƖD>'KXS>bm{, -=Ʊ,C}tuJ?  Q(_d6͐_kXsglE #B~,ic1Qw0X;}g̕Rȷ-B.0*dH\ )ɐ/E-3lw`@jF|4.>x^c!tmX7 |]/) {_mLW _BKx /aK#|9|xg =o!O16=&OBy ]1v<ZCa:=+x#zzː'! v/YE+v 5߁w3Q;(ߕ7 >~߀7fW~_s1R"Tgm! l[/kx-d|S}ALqM_/,6E sa_"ߐ{[Ut5_!xכîŸ"\8!EWWC.3*C̋3/E7b\~'plߘ*o~a~~@ ÿ֚:—-topk^ÿk z_WK^[qπSSO { ~=c#`q{!>=p= .=5{z8<N(~6;~>>a}Ⱦa=].]`rۨu7 ~\G^ *]]!2쿄5֝sȷsYZgiu 6DNB =\a1Q<#߈a}{PC~3}{/l؋ers19{;{=ƞ |B=ظs vþ]л u'MG[S#5x9~!yЕri6Y;0C6`c lw6Ÿ 9\];WC*غ2V)2R6-Eel\,@~/gydE o웉ߦϩSd: OD>L-㑻`W:֎EF#FX 9ɸPf??zaWw1jX)צq8C)D`@a/zcwzƙS87܆<[G5M W3̿( =u!.o72Ƃߙja8#p2 _LTe|&~RAXrAB}&mYsW23xB07iINA6t|[73 >s>sXgg4kjX[{n!] ſƺjxWkC+yſ6ߛe?ͺ`g߃d6زNWՃ[:خts\̵.qz vȴ2kk[i^M~y4o76pͯ/V;6zɵډ{ڒ:!׾߂Xq-\u#huMl㽔mfۈl7uvs!Dnƍ[ognv|i.O[DOp9Ş/}c_i~ zbH+~bdkngL94rJ᠕8X3C4Z6ӭX92UeQ0 Y=#,YU5gڰ6^1oȢ*%8vvr #"/QY $ti1%r;7Ǖ>-9nT{wKpw؂らT7=ǭYqW8-ǵq~I{>Ǧ=ծG=Qv9~BKs<\]#kix[d.18Sss+Su#7`̇ e-]Y;,Je-}b{w| Y\y{9L9v^Mr 7=M{L`qa96_8lB82v߹io7nx*:sD+fpxE~1GVȁ?8j .Q8zwG/9:%Gw8v_CZ1_slJcslq[1wj_8vT&&:{ўh e>+ws{69Tܞq|'qs=8/Ǐ|ͪf) 8_WnSCBhPq\:DŽ'sxQojpt YC8\ሧ8HcUw8RƲ~VzOY#%+`i }Y3k Y%Z^ez-)V1[Xmv'ڢzьui]ZsYgmh,<,jY;r 3Ia͜^cъLdzH|V& k^e]L}kznVWY-$0ŖbJ(bkiӎɐ丕5y |T7֜ gfLư=>L-bvr{z VWêXa9;Ug+Y)֌ƚkX3a2k/7d]%'Ktgf>ToY~+9,׋Æy>ԇO>#\sow{G<]8|7 e}PwO}qSiwro,7ӆ#{87Bjqyr8Í#9[.K8f(,0C,x9l ;V%㷳 dV"rڷ$wc.VKr" gY?}9lNYlUZPonao/#V9YֿF-agXkSY db?l[ۘɰ)bn,Yvx;y,˃,IY,';8~g~,/볬r*MwsXP> ׽̰C+$b[S˞^,3XfNd gaXs̯g! ~y~d|t#6!8]a3qM]pj܈(݇#8b8"7&)_Ȓl#˩qme9}ΕEXw^kG1 ǜz7smw9TcnD6䘟{9n`=cds\ḇɨEƁc5Pk^B,t71pjܬenf{8nqǭ!N8`cC8I~c G')8: úqάh3G{6Ȃ&w GNyӦ7 Mj9R}đru˂t8{i1cp[ǖαs{oUqǝ=js(fJnf2ps-{p Ug/n5[9VVecեZa˭߹?Yϭ7V>r[yxrkAܦt9mvve'romܶVn/q]:s+n[ܽDr>Q(7s:7f 7Y2l-[uqN=帮̱sa%G{QϜ9jX0GMyǑmܴRk'=K)r8beL6䰧=y^Ӗ s'' ,zȉF ֱmY5ÔIo Q'6E}3sإz =Za7Qmȅ2Ѓ4ߨ9Z:2'`l$zְiwELY05,5,ua8vp yD Cm~'r }i0#^s-hp_qؓavjd)/ .Ucg沋Xy%>c 뚏`m5գ;jzYk4ocVU9Xϰnk J:G֔݉5mXs-ӡLsOaBVƴ}n b0Xb+ÙWX˂UˬRUY9+|:X5d+!=D5l=zUg35OxX%d&&yʮ8zYm9x\394 Пyê8tdqB)*HVj&V[eYun$}{W^g-Lzi$'uҘ>@rmKz Ku9>H/:u/լkaц酊@9X66fUOf걬T<WYfz+蟂X nVY5)Zz+K4b{X뼞5 3)_2u9T:kaZ/m~&0{Ŵ/ߪ`4OXS:5o2Mx 3};dV*`~Vd.LY1kUfJžYX   ow+auVuJ6XQ5ߘ}.`M84ptbl48FrgwC5вw<s`ܬāe䠏Sa;p堲80?W$a}Z @ >؍C&qhR߱^QW͵9d90492(8s·6g8po oُ9MoA?r8i As`p8XqܤC7io5fgߣ,Yq˚Xe?0-:~mدF"3+>NbEmVzW}fR?%wa1x,hƊ?Y1y8/J`)_PȊF\~ɱf(k~ob8F=ܘ}Uʱ"q> +LgB^ai쭸.9]-E>E8{`/v}:p;G5"{7fG۩;{OW.{͞{Y9{*gŭ <=d7 ǘW_1z2{^̷>I#"{=Og~?7\`7 b{:@{[˞v?3{=c dݛžeO{{|ƞ 3?{͞_ث0Ձ!{qUi{y^\ϞXה=`+l%{meO-ٻ,c*m}G5fs(+:Ua87&sOt}́rТl#~ѓCerhܘPGj*V7`-V{dAν%ʰzgVWGV|**񓕓CX"ӼYY8+aCIVJM[͡ˑ84՝CWrGQCѥ8zǡ38H/8TphIC3Vq#VZ9¡crFy;CXsH|]P8EuPgsH\F/4Z!86իa|nnq0:l]8Wg'jArp@~{r5|v߼:u8\J9AuϢr瀟?[qdԔ<ȏCp^Z67m+?aU%_V9 ~yUz*7+OYM94})ZϡeP#O]Z0C!q` !R9$ ;$ 9">_wnp\=΂^qC}j"V٬l>r:V*!<:jng ᬾɯ4Ӥt&t6JgMߝ~Y;)2 oYun.ɏuk|\ߓ枖tf5she;-fKz|fYׁy?oy .&ߝ8""G∾9En(G8vjRq]+{rt}1%rLY1c؜ cq޻9}ǩrʟ=qܟ_qwp0o؅Nx~oԏûwǝm[ْ7&Nj?{s|J)Wqyǭ÷㉊[U]Mfɓ9k/_9~[?+8~ 욆oi}sy3X7p߼:ljv_ǽ][Fp\F`L|qk.r\pv"Oڔco394c=X3 :ٻn}{d,U;gaC^Wqڬb/g83*yCϞGBs}<==`/7#{g//'/^57x=vf'lx^ ϰW? crk:ږc7m4pugo.^l^GBfa#kt@/0>\f$5{KQ\OUd@k{}6Y>zO4iͯ/fZ/`v>d)QU1=Wb6+{lb!q b5RGvp'gOvkva7Ze?2v]:]{maW>o.6K=v~0켸;84ힳTvzއ~d2;=hN7ӹ|v[S+Џai_Dev).6.ir6esusv]8]w1`u- nۉ^2{]b>}uOG 쑻=n`z3*{`ymG {^]ƞ_x?ry ~ bcH jsc**a}3_<|:{@,Zd.5أ[{s=%?ɞ%/{UĞOA)z9ʗ=fPޛ=% e);=ԵأYv/7F~o#߳nJv3f6&%g7d7wvsbn.1ָf*!Vc8Uu2U9`>,e5&Wqw?CO,^w3|Gm;m엝 DVtӝ u&7r@ڔq cɁrPX™;݋Vt*2>rPOz'86$|(ͱͷq,b{D?ű2|8k6L\1nsqҐcOG;Qc߽F+q1 qJqUGpG=bͱ߆cNc9fjrcp̹$c;r~6ݩ1[l1ݟrLn_1=arLYS>/'x?Vz'9_2d! 9fl1 s]Y8z;UKsGQw9y]8)zn9HZQYuN঱9bX6W08"r-/Xܮ;WKf^=t+SXk&HV:Zg0UXU5ssp 4̏÷|9t3׹G7w4eYX}X1v6+ƴ`|Xqp1+ +vf<\ÊEȸ̊1'Vh~? )Qza[VlŊ!Ka67&+pɸ4n277YWMLi$zݞ|Fq?MFL&-[p{IP79uB9|cqOÁ+;^A qL-AqЗQpH=>W 9ظГ1.æ9n2%AOd݈fr[~_{&}]ϐ[q ڰWkb/iaϼdq\vSdmױĵZӃf/[5\!rp47W=X+ઞ\e*2͊,Un*% JW\UVuUJp\V,W YjN\mۍ=^~wzog>tWkp5Ǹ6 ,5cl5KVCy5ZqM'g} ٪h[5~fm\s״5Ǧq#l(k>5;Tsؑlu[XV?2xVkUz#{#cY[ 5^}b2l(e尯<[[ĺy f9ا5GYsSc\s#lk 9NrM{#[}Ǿi\s\؞ qy׹&T͞uv =/^N v_}Al}[wa)\gLm6oۚTlt ۝ẇ۲/l(u#rSչ~ _"w'5`|n3.ƍܹqٻ77v-^r籣ovj>K-egtŒrpv],ʰKUv.V7٥=v9f׆5>]w7ev?]+uc3v)qM9b;NGӓtq;G/ovka)0f;tپEwx̍onnk.o_ga܎mcGm,;8Ȏײc# ;+b'7;'`dvf< ^}>v_o cDWȞa/ie]^w&"OTqɾVw5gԷҞ>\dcٿmM*7&qܤ`ԫܤ(?s}tfYq+x"/+z"˟Ƶ_ +>:b?_dkc =~W]7f9yvJfGvGV˜Ɩg`y_#'8S׏p.\oK[X3 vVzl+m[v˶l3=c.c׍K㺋rM_\wX .ކ`mh \ǶoVՉmTcg[6OmlӶ|:Wχ\)|qk"nVFx12kL-z ԰\8 n_j{qGڋr\mghUL*᧸ѧ\ybWŕs2WZ4-Kq\ Wx?+|J܃+ SkqB#\+_Ur@5W}ЙVV9-׸pv\y/[|˖rj_ɖ/lR)qX׉u+9z'R_M:H98Cj[L;Aΐw|4|5[짯S{8Ti& q\=V.b4~Y?\'_x98,YšK8 ǀ+c 8yZ\۹Vwm=wcqSҦMx*ħCj'/ =Y1I|DE0 .EF/z{%^<&ZK Td5Y.$R#AwI$A DB|$dM XB:D0EBƋdTD٩HTA-DUT"Eu1A */T1_hxQ=x-HQ-d7Q]="KcEJU>Zs[]WTETԍ: ؋ʶ]գ{zV{E5Pn=&G$J m?nCBjQ+orR(Glڕ% w#DrWB$VT?jQv'ʷgD]&HTj*Q9"ꦭDݻZ&4gP=P ʹN$:s8y";Ny9RR릨/6&)(2V>M4n,hzq@w5l󅢹>J4w)Z}hfmj;%:Ef$vtpZw u#Kh^~M(V~M?*.] Oi,|nPAq Nl)\kVdaD)} !OnLjItDQEW6tхyV֯-e:sWtDF]o[%MBK Y?R/ %=EiE(l-tsvc jG`99Hh:t.ڋmnUֈ0Q9!Զh=MB3EmX4'D \_c/+x_8nu,Q5WmՅˢ/٢>\)*ʜz^-5EYuV JBzGQiP]7Q= /ܒ u&I$Tw_BM$Y\T+.yQUM.%TT #.jY < -!B)䙧(ˉRl>DWc%݂+#rEsUT6D}骨v< V"'.jwȩ(ʄ/nBB_0G4ۏ;jEhǃ֢nW$/#_E*PTe.*:#TP4x(H!~i)J\vm셼h#SnU Y(4>YT-ۋQ|@ "t(W',7| }B{Q3-|.GQ;*TAO -4_J9[4 P37к`\P~qkvXԚ=&ꉟ ulжn[u "ƨ%*j8AmE}Rԧ7qBe^ nMAm{Ee,qo$t"d?V;6b?RK[m8o_GZZ1jkѨ :Z\/hNfF &.D q9Q4qRG?tѼ| ie<3OP4UKv6r+]J)x+t^⹾kCYDLDh;mj?i'UEWn"Ѯ#GG gG=E=|]t?'v\+rZ%wRX&YtMxm]gQ7ԛEKw#WBmm<_ [l]p  Z!8. Defi< YmwnY ECnhvy(&׷^.3KnEj WG-O]Nq 1WtSt\OwM+U['&&v7܄mkϻ% M)kԢ{q:KXm A!XHۧ"8$'p^I&>Y]>$}WEphCyepeh|q~?Vf_E^*dEuUb%Ԅz<:JB OJgQ%8_+E(-* {Hh)q.XE&SvAKQV*]QQ/+C=Ś]DyJ!Vy-u[rZ4E9PBG(OQBǴ$4/'K(e` ȗJA5P~6SJBfKW (!gDBq(JHɫ'A? N' nDB%x,!K;JȌt[6l4T4>M'V;$9 ڋ%AwKpTQK\ IxN (GKRBG r@$7o.!&ʈ2ZBãq#~okhf$÷]%طn(Iݣ]Үoe QnJȍ g6ΐ]#ꙫh֡ge-D] Q B&E=( YgH/~D3YԕF7Dܭh;&Pbn c]_trEq}7~nGpPFuUI~}4 sD-ݯ(7;yR G'{E*zp"r?H"_ GNiAĦHm/SD>Rzl1_Dkǻ$L$[yS[nHx]_o)%- w-M=%|5()9$"DzSBbFg4|Bw?4k_&OufJU6]3H?i4+:9bP4+-4ߥyii8[Z*-)}z\TIZ)-7JEDi1glMZ/VKrW򆳴&-Vv$-?o͞IK{?ՋU&냴VSKۻUj*ieL6n@(甖gH^~璴 mK ֳJ7oiz&m{6Hv&i;s_چ6]kiNkI?}O+ ^y^: &CV:YäO3pwA:L#biomGIͅigBNfWZ:pcIǖSkttnY:8+3+J:淒;J3Gt: ]*.&JyCF4.ҥq? KD.oC)j!]f)%KT2t;P~astXW~$ݪn.],_xt%] 5ME?/==t$};[ ]gՒn")?^"K;>MJ1UgcC99t+%=/,=mI/N6B,Kj ףkLm+=ϑzIga- %aee~1USҧ2X9!;ϕJRp}$7IomgK->g}?Y+;YE$Ȉ2E- 6Ƞr7dК2+)o2غ *A2h`\ _Zʠ 7!re 2xJ{ RFu?( +dz MƅMdМ)20d ,J2P-kȀ@!3/#kH%)L|SRJr]BR=$MQzI] Hw5 )ǛIJix^%)["$P71OR8H *i $J#IQSҴ.2btI;IF*HZ2C^$UyRF>3ed Wt\JK]CI{FFXMoK$%䠤l)R$:)eļ$I[MR-Iʘ˒vry]%9 o,io%-ᗤ+#so%m%񭇤,#ޖ %jIdġ&VXyYasK$LjIGlr #ߎ퓤$I%{IY'I*H$J$|$+ɝ~6JNd.2c$.}dxQIJ(I7JҝQxQcwoM$- KbEn[ROJf4I< I=d2|SIj WHC訿Tz$Ice$'Ic$Q$}%I#2liIUN? [oK]EI\&haH[I#F>`  aNJⴿ ;[I*$jAX-ϗw%iF חq2l d*IEe*X77FzH(p!2 *I+$YDW%_ݓFHF|$_Z!)33%CçV8Hdp!Jʲ'蓤ǒbKFT)}JjOԧ2qN\.#5$%vٍ;o8 HjMybVX*)2QRnƠ6!wtԼè\KRNE:G.{kKZ dIk]R %%e I}QLI())iIޒryJʕE顤A"#ӫHGiWRհh2\3T/cotDI#cT1~U!T12Vy[ҫܐ#H+d습2dKel72{6~Kz'$cSV2vR%I/!O?A2 I7zJy2vF9Vғ$t/pQ,ccK@NX2 ow^[#c13>,(!x7u#c]`c?W+c3ؗ?KJPGuI)6I= m#twIIuWʸme\2ξ/?Cm$[q}%-ʸ2z{bc>ViI 3yi<)UJ(i{TxrV5uGJ;*ilH$]B v}J]B sMJ[m~lioXO/&K]N_<'H-#aT0꧴S?oH2i߼THåBt|v(̓H'CO/#wKօ0i&LCi\[Ǿv>訴!GntXzE:T ]:8=}k{ptX,ޯFafi'A:'ݥ !;yHUҡz[i]:)JyF=a;ﬠ_ê>FksMK'&yaר+oO?et˗ò8p}}'V}Io[K:FP jB;]9r^sv=-宐`svR<.wz*wdIsh ΅s;rGgޜ9"'m^mc6-9n#u ug r۞rG?[}z.MRnu.}vr1 +7׫#.7֢cr9rurӵrsrӵrDn6:#7x)7#7\+7n Qr٩rrCJ+M2LpujȵV[]rmNu]{fS:L"n"ׄɕL\!W*ryRO8L@n/W4r+N5+t 4\\.[*M&.(˞KORE\z\6k\z\.ջ/KK˥%kZI-isi\mKKJij /Mi')e\d\2P.m`&K@i4%IPkif%͒;%-U|X+pK~_fZ忤UKmi64H(fJӈtiZ4La\29E.iUu[+MKL*>rI?G!HKzoK{֑K{ f'~JFx\4KHflnޱ矗fٓriT.YLH4l4 35xX^.M& rrArS9<9u9;3j4N>*ɃoczHv?i4- `9@ g$gUϒFЩJ6[$g6N}]^K0'RNn. ߵ.g+Ji8ImR%ozH3ԯri&Hfi84QΚa gh.g-J3J_,Bi\}ș/șokY>䬼 i84j, UriC=' ?ICҨQբ4<(gݎ0:S(OKz6.gFQ1hZ&~wJ#ӉxdiP1[m 9<9SU" Γ!嬹 iY;ήҤ9}W{46'M2ܤҤQ gLU&lI9Yit?\n9C~e.g'K㶜o'g/.M99nr<9`4&#J$4&ZIIh@,s~-X&KqI>3rVe{i8l4'}"r.w_o/,Ο-{|,{}fN.^e_ruuzeA&{/X'{.{YȞ/ʞg$٫SQ {ݝRe/)ded}#e_![v^v]n.~.}.M4sQXM+;o!;{Ndeee:CFqaR١iٱ\a(eÝiCu!\vjKvZ5eQ)\)ۿm)-!ݴvmB^uY,l.~ Dz6 9/ fli$[)[u-zdMyalQ,.sNi>l>lvlj[&8&YKe3eײѮ|pfHlL6J{!VF:KR߸_2Bo0K;UkQ}G֛,k:"k.kU5ddee&Rbf-e5R=I7%.>* /^ƟZ w;(04αpol0&a|H2CۀR4I TUL)9>%k)} )AH5޼Ro6ԛqHꭿ)ܒzJw`۞/KTk`ԋ ‚r7m zRϻLz{/z;q'w3³H={~QQyK@UITp;#m֍P6?ck,?7e ~lq ~ ۂgi90*{GXT&?įCQY]o=]H.ǟZk~GZʄxn!Pb*CJT˝Py!(Q ~+>~}M׿5w /ISO;v8|0jwxg[Z[hOG?m5߃th ǡ%݂mOnkV, tu|-m%%P-muháQFmڞЎsvh7hW@7ˡs]7hqPeʝP~vʓgݼͿAS;fGmO? t$46AmՌRelM7Ջv_F*JP:xJ.'wD]@qlٮEaL8 CM=CQ^(GQ EZeYx[*P98WQ21JVEɭ0џNtkmλJ@!/zBɳ-}< t/JC9ʪ;GʖwEeO0[@3c4;25c-B*8h&46Ov\߱&c+;PvMGgye$#h? bh=eМ{Phu&t{Aiu{oB7:,n>n#Zso] N>CA&&D|3ʍz|@t\P ]:OU$W/Ю!vJ"1lhá_/-_9|t;kq{.ӆA m~_BˇNt ]'s:#Akڲ A[h*ylB M"D N[&D Q33ba!{%Ѝ`^S}-gܓb"+\M>W@t tsB7=qp(t;51tmbVԏz.]Kl#>$NEYCGPebYXľc;cgN:_Q2/NG@S8o mcoЎ%1GsS 7m_BsyP:k)]" P+ba}žpe]qy1Vmd!.jPv?hQĉ,b7MicQIY⃲&('~lǾO Tn;P^}$ '"Lfg~ωЮ0vhkdn1BA'̱Vˡ}uA(?<姆xo}PْTLg%@Nݷ Y%@W-|.Ж~}Ú,`kYK5mr %?3'NX@;hoh8USpoh&A MthLJ#XG+4 5MWY}? J +Q?1&}+؊zssh2](e oQ6eS?MZ(+ğY5q6VcCumǓ] \C~12\`4V Xw[\o3mJΐ^-ycj nhEiĊ?ٓ`]skąMgpD#(EJ{sVTΘ +Bdžؖ\SE.jxwPP< E w@Ѯ( f(fb܃Q(&(h1  6Bls}QPi©>(X =P`; *t^(ª(~EgXQU(P3D(܀Bkq@V((E&u^kzxc^Wե3xPWG_xW;jqB'"o.Ds_;_f_ݢ_g !;yg"ܒP޹\>x+9󐓑kK> '!9ev9%?s79{99h̺YN޿k!{z#dutҹ"1dyuFGF2S<#ӥIYFu3ك ۱ O"[[ .{t;KSӼ&-)Av31AJd8Y kd8'#32ODfD5d=i:F 3d6.@*2N :2l|'2f#cnd xVgh7v@[H@_H j!F/EzHH@?"=6H?!CzE (FaH飴H=m\R-ifi/!u@QH}א9ں!Aug"{FEڄ%Hi}2is]g ^8@iԻK`R3lZaHtiCoi]"v[mא7RKw_8 i!mNBWHG#H[i"miîSHk؎ήHxP neSmއ4=OQ'7Bү ='ߥ"g d(SAȈ)(y/]Yy1c sn=dnܾ?P6!se2T s-dκIi G996FȜr2YdJE&{qP sL 2'BL_|5Nsyh2L6~ -<7s2"hd&FE[dGp; Gz/Q縶ȼרύ|Pd}L/tYe,F k)z"kd͢fѧK kQdA#.R9M=k3רKS7r:V"GTG9e~[)ꀜm w\r>#BC9{)r/Bn/Eo_|B+(+rgB?Rag*rC!K3E9!-9w}n3rSD3OM@N}){}9OirFTܮ9^#rް眿9S3|8rzJdW!# #cVdoˑ]q U>+1O#N 덜NOSc~(,/ ۟=gA{k>T/ÏjNL* ~"sM]7{Rm2zN@=QMwnQtC+d_6i g#-Ҏ&.g#M@Z3oS^3D)Gla^H)B9HUH~ɧ푼&C"~*^~R{/K 2E.x6/v'͑|6@HޒuvH^N"yv%'EH$w6\:k/m^~Vxj1^f7g,/cfߌ{nH;ϡ/,BrIH'f"yI(w!BL$vH)&"eO>0MDʺ9HVAHٷ)"h3H\W"5R[E!̼])})YӐ5Rt[Hq#\{R$!Ŧ)bA>:1FJDJZ> o:R" B+\끔 *L@J&Ks/RKw6HIKĵXc'wi;-)/->) =_ r#R EHJjs8HYJ͡QH\7m(s߂;noCGH{!RtR& uy*K8}~CZt߂H6 i!m!9ߪÔ3䂭;%\n lfi' Ϳ?.Cs[i"yqHo ;#]~\Le!5B"ۍ4Ffr5 v&yw6Q~M{'94D&]r yhmC[~ {GK>Lc HWHRE\fH]F=>ї u=/!$xFԘ|/:}G7iA΂ÕH'7W"mY4HE^<EpZg{{7R3ޟ6דyʞCWCߛ,d_yAcz&RNv(}fsPG9 a1 #s+ֈL6̃y&yvlDqt9wҶ:"͔L=v0W)wr^Gg,RB6=VHu/Bu4%HձUCj1c׸-YI]?#͠6 8T @jyof3Ϛ"9 s^Ro.|Q}d:R#!5̫#ypaތq?1#NH ː09J/<9s1+k2f96ǑVm.k6_9}oZ5s֠s_#ƶ ׎u:3/p?lXNC.憯Ғ{!һD:y*|eȨUW!2@FncugrwOdnڊL9#3#_ Dd5ߧmur^a%N!?Bv&_ǐE [E^찗Ⱦ 9#gerȉ@γ)ۏZܱu+Cw#wވ^BSyC"Ϭ y yÐw>r"Aw݇|`+!ߧ#?eUe!\둿@޳4{x%B~u7y;yv" nj,F޵sEs /3yV eE^A,u3MS)"zj! C+Bx~3^)ǫ=9xկxp ^{|WZ~;WxUu_n3^0z'yb~4qA܂kQpk JSm©Ql ۢ6{a. 6@Q("9(0E(rAхr夢XOQG@d^m_Qlŧ-燡z(iv%KqJP5%gi&JQZs*JtfZŢ@mnRK(RYb^5kQ0StXJnDo(+tJ:g,<(9H} %1PRy%K.8%)Q2GIG3NoģE4JZ B.FG_L@5;ǔ88C(>:=A)Pxgm-d+J̖d!J;QrD6Ei/(]P:̇-Pz3JP`0{l]*NeS?9 ۟ mK^ Bh/Q A7е]|5nlzhk{@7tcӠB.߀t)I=s@.P޺Ǖ|IwRQF(_s_P7\Q;ʇ ݩ͟C 6w*= ch;Ck A6~͏6dCs41@ُ:(؄z(`Q1pGs(b"Z"(NQ5 ߢ3 /$zFs(Ba<j^r5EQy(LE-yUOWGQ- ޣ;b (^Q(bg8#mDqVcP\2odHі(TQҔ[]AwR s8mw>!a-(;Q9QQ3Ǣxܻ7@zaSVf80ޑ5pN|OP(~%uFuZj(Q %ͰJmA((9ڒ5FL)DIdMBu#ʻ_H@y\Ay3(_,tY]0qls11 /fw0Cχckrڧо86n;tf-tj0R}K3-!CWG]#ͽao]~P>ޡ|Y{o"~VCyH AyBC-(>OCQ1 e(Olr6(_FybOнO Mmj8xb?ś~xE7exs4<7xU7ex3?@]|-}>:x tkSsQ»|!uf.)ʛs] ?$Ә u>/>RƛM&o*v>3w=wuCpN)~m?wjޣgƇyV|덏+u>&\:i"|r§4>MO93|>*3g|- 2Bi X ~o'Kn}~h~n2O~n'T@4T'!TƯ}; MB[o f㑄I/7ChT_3錿w"?!O:je;eefe_ֲnJYOSAW?H}Ҡ@dAH@lP6XZ68W68gal`]<. \^JiS,?, ֔K=륁4 >Id4Xm4XWL(#Kϥ~zk/# FQqR߽2X֏- o ` V[.'##pT٠@68.̼'z+ ~ߐ jU@PH 2@KVH)&ҠZI[.?I;~j-*V'ߒʑT o"a$|E $2JG$.DH7'mC\$;89lE؁H3&w&"q!$LAW#&)Xb;g?QH: ~:^AREHQIH:I6 !~|,g"~U6!)"> ¥i3p.ťx-. (qɻ.yK:d G؆x;}ox3 +kTb!.&qc\\剋p^\l}( sƅcpe\( _q! \_ pI\g.(x ¦!".l m\\ >/=1cC5Ώq5[cslwe=2޵Eܞ㈫YX7غsy3b@̾툙71 fdbF#eĴW =YО븾i25Cb:z!fWĜZmeXk/z e&KZ8هS)[USN],D[uu"QW"(DMA" zpDuQrD XH DFCUDƝBj2>UYd>F|Qz5- DԬZDmXzRV:WQb\.# ET\. ETTWD%ry95I?JeU,i3m-"7?"{Ro!# Dm@PD|3Y Dܯ~ЫpFN@_ ì{"w_gp 7yf } "UF{G]BtFtDE@Բ3jSy#">DԚF@dwD-Wic{i9,#3\؞ȓ<^̽<2Fޯ|.F_("mF`DzYZBq?>1"!D0f5ѧg!}5'!Dg!$#KrҘNoӻ+XfCb/"|C!M Y{1ΧbnGLZ7E_b &i(b.nC̋y21A&WsGG1"tꛁiWc!v^Ğ;GnOEd]!(~bnB\OkM>8+ vA =9xaS)tcw1jbEl%C'bR{)k4q nGV$"{YOSҝ ?< 1eS|zg5Z؝ikęElLlOpvN88;&wgl% ۇ㬋g}dժqN'ε]s5q:2^pn\876¹q}n8qsO7rC\]F쩙5FQq̙[s{"vtbvBkMC\wkʘǺz< UA1ӆyuiY;mzf=3#C}D7em"z?Ft`N?D]^Bls&#DXv+XKnĕ /_ 1\7'!ڕ"RUN)uEBؔ[1v Fk.hyKika1krf_{bV-h E'3>&}}/c1n5C%rDפ #.=#rb荘ȃ:#[M=.C5r'J9_XiG]r_};o ADZps\͗ݔ&m-"+ܗ!QD8^ExG?.#*"vMB-_8V]AhuU!kba=: ! ;}ws\.u l3^J)^#NuDL OzK"BP\kJ# =7C7A=O pPC7sAG Ao#4AXAz"=tGR>,@?0{B.G ulV?E܏K0_5۶ mQנ;To-3և _<~coPyVr~w'}9HWA𷲇6&L5}F E"꼆e$Eo߬?߂} >y ߧ}hߗ%_P8ޫ[ owo va-'c||tq<}|_yw:|>Ovm k9,>'>s|g'q@iLO lSg}3Ltvom5x; I-ѩ9 k}OJ=ܻ||)9K$&ç`)|^ >>>M/h!|Vgb1V=q&gLLkxUכ10^𺯄WOx׾z ^ᵢ6 kR]x5>^}U+oxxjs kvn4܎=R-7[՘ײ1p}6v5l\CsxAz\Tu*|!\Lޞpkn&Ko8 G!ܚ[ [pk˿3VkOSpM; pI:Ɓ:멵pUQp]xVp5W6 T9)b \Gu\ZQ=ϛׅ4uIZ6m0\! \]Gh 8TgR\՛zӸ{᪊݇A&|Znq!#ຕ>XWSbeMS#p>3swMXvC-pk]6Z%\ky6׮]:16וhSΣ ພ>]wcC"!m =pK ݀Zp{.6e6KK֟ O\炓ph {YpNsE8 LJ۴Ϋn97+༛[Ey=쥂sH#5p)\uK|LzCb.h N׆˘Sm\98;|3Sw]T gs8yK8s͛pNYkN t"NpZNR)q6VY86Ӿpr)0N̸n9jW8 ~yX _auIkw>79`'~|k~p>{W9?9;^ p޻湊Ip^KvpnrNTS'8P¹Z58Y:o:MS"8]ST8\w# p2%ɿNii};6pF{ӵp*]pnP ƿwpLOpX oNnC4ҷY4" NO>-4Qiv91;z16qN;9.,S8}g ,83fi~pzNy釕pzC{i1|)pj<>T3NEVe8e~J!tvfpdr|%p<GpNNpS8=}_\ k:νkya#džù'ks(aM΃s?8wĊ\. 5ےЅZԂ9۹%k~u޳ iX }3Q m{ʜ܀SGf5]C|:CY7pz69ېv.0n"O8݁±p'tNoӯUpjNcsᴂqXNprfM^gpq pBV?\p>B\t{A78{0s"}j8]'bD͘wӗp gXm߇gpg !1N}DSot1_KplHޡpi.mhϏxq w`|mἀh.{p8pY>.a|þpW pf߹.%ً :r=\-ȣ?w_ קpM5d~4%ޑ]6~,ܖMU nN|)ܞ%}:5Op7hs1{'˾>΋?^rb^0]汧\b{= X s!#m95 p#W\֒xߵlOX<'i\o%UFp[7rbr$?e p{I; œ{5wp Ӳ~smAe"wј n|5p7pk͝ɕͺ\} yB=NWwm7skv3g3>;mpK=^ss+[_{poϙ8-V2w b1;8olǻ931āț[^WS eތy23;~1iv(z26p.napc1Ĩ'!þ/<ػ<8]le+1<3 ^^(mu|,kdx׋z%Ut^aVZ^u*xzaxFgI1y9>r|[|^IM|wOoQ*|wk|No-g/)wߪ+ÿm7EKF` C,>,A[A\ۙ xtwEp@gG n DX;j=q8B!t8F軮[1aS0"C< aG `", aIg@>b)G%#7 FxaoaF=Cs:"o9B>Gh##=:#l* pC~B 4(mF $*BFƧ3|ioMDHGCR!jqF Bd錠7 A!h/m|\t;ܚw7Es^^M|"+WO noe\?z B kBM,펐za"(;CD*D4DD3+۞7=ga*&B|jecjZAq+~/2'ls&jY0D#n4"@D?3DCĄ{`XXs0=kqz+hU]p=ƹ1nE0?~Œ(c!Gº298V:B[Fȃh8uBXbݻF!GЍvC A[<A%O\s.[GgOi|X%f\j4By!dx:B9#dQSA `UGH9EN:3z t-Bͺ!tB|F0 B;[&"taBO=mH76B~C] Ħ!+3s2 Bz.FHIj\}?OӎBU+lH H{["3!z]5e7CЩE2 h  ?'C5xx83/#B..r ON w5F.4@H^p;5ErC+"`U "Qc&hړhYmdz?_;~[V<~=~w/u~~Bm <\?׏;[ ᷦ 7 F_|·_]z~m|?u|o=s5WOK|~O\| }/3f|j;>=}1{|.^ )>a 韛~/n» o^û?߆Oi1 >;g |f?I3,A1cϚ Z~|Wz >9)\w)᭹Yܓ}Bo~w%~-_:&}=.~́dϋOK_#w3n_[V335/TD@_̛>̡i-`̾9|sjچSG(c@bUL%62tC|F@_9τ 0"EEOGN}sB^ h:+<=k ~#p}#?X@7~{:A?Ept=y A7K^WjUAuT[{J! r{Sư҆Be]bO-J BZ"DH5Bt%G1e!|`;,N}e"^?@NtYb5{Tނ>c 1V^ kĒŞاkqF5wr)>8 g98WM/.l_ p'.F#~Y `0.]ƥ\˭Sqy.Rg>,m+p&\]P$LE.HX n򝸖FHLjs4|!)p=z!~T'9@qs# qspܬ37Gtiyj2nnsq-ndl;p3uÍ]1+7f'Ƃ6Wm13!$x8$]Zh$=߷M@ҙfH:I"i\8#-3"^,W"!ZY#i $uaHZwI1TדOf_6M[7Lnq{n>ͦsqÿ)n~U;p} \sp}^*/H%q]zAu\?cw&>f4ͦK{Qq=/^ xEy9YJ%CDQ")pJ%B Q)ŗC񦜡xQ<)?#n'2tJcMN[n)ePoIP-ܻePoCIPfB=7ͧ *ePz].ŜRGҮz l^]HMU')mz%rP+޵z-'K_Pf[BmF?qA^5Ë́z.^USy)zzͦmyPQ 66d|g};zc5L _B-i WB-yB=P]cSGѶg]TAB݇dt+]Ŀۯ6̏BP7) u}֤տjB+L~LBiPKBU TEBPXJ-ۅꮫPݼ"T\wPwsY"*PʷPy*ww*~BuPz+T+j_Pw PY*s;ڹ@jk ժB5'Dl_fA,N|+&ՈĄİzPojK&&Nj%ר?,jBmOlp 6<,ԇkQ7P#(((h[ =rB,?L,=L?A!$v$:Xl=S};bbT$*h9uol؛( j*_,eBXK);3w꽝vl#m}D[=ύ6k5Wb*b3׬>e('L#י7;0>m!/`=}.1}nGp<{{}bLdS 0iSGmc2E^@N6 #̙owCB=pPO=wϘ\ӆԪP7d2cڔBC'T߉_ G⧎Vz("6fU!m#{=3G{ă[Buؐ0Y.vϟX US ՙUBAs!v;F*xugC`عW{x-qx?3͉}g O\I,=հ]B5P& u9!Tk U[Vuq{2`E\G( BsP~# ;BI(u녲lPsMPBAId|M(|A(ByP& eBP^x+<_!g elKJʈB6H( e`P?J߻BM]BT(=K(]~Fԋv|X,N i-5E({>ym3B(p %PGI4+qNoK&P^YIPޢwXN( !cqxoOlƸP0y+/X#E[1V" Ƨ\(߷g0v/u"D[f^Y 1;^(1O07kx1k]ͼ*}}!k1s {j3kmn}9߮͞X:~;n;k'{Y/>'AB5k(0rX7cɭr,ՓOa-J;uqY#F&#XW-`/bO5m,Tf<{)y9n*޹k5zD]ivI\4g$&!Q"FP5{^s8f#TɫӖ#=ǖ ՉBu\8}!3M '-!o8J~J.tg(Mʟ<4v$ %nMp 1'ct>P./ɏ/WC Ħ7zC }r䣏)}LMJ\"Ta&ypyRZb.1.5)`QbTJ^WFRzC^<}g&~~!~~0?Ɂ*7y_Ʀ}Eo 9B/&㰗fۗ3J}}r'尧/7elfs<}״zLgw 9ҨY3y0O3 rԵ>;Κ=*Or.̍N=r6-ɫ3fM97 C}SE$n%.fə9E{ykr7Og}W>{;k&Z"x}BNu{~qm,gBE '& &νQ8+p8E ;NnrŁuSL!SrN(W 5`P1/km Z4$ io}aBY=[(BcPTOzBN Pf EQwxe%9"PEP<+^-S("X(. c\B=B("dP BY(< k8uE(N#|wY( \P `,nBH(b1Xm"+ ]$ !BaC(f% }B!' B1P%zŰ,̻pmޓtk#. EBњvX/M EBQz.5ʄBoTVBRؾ)ZCa[rA{mv͘.lS틖~a୰X޼'l ۫R#a{~$l۰ aÅgu*l[fIamk lWj'l |ߜl7:[uB.o"lN E<=53 [y_؊vBV؎|/l 5mGaۧ&lo v&¶UmE6)lWma[ l6?ooB|-l>L6ov)9'l { |aJd6u ;a䏰yh-l~66a0]\:/l.6q{MT &8T6>kMaN8i as踰 }\ 6Մja뮰Sl>*lֿ6kf Rx=skffa3Y؈f6a36O،26h!¦?ulz8 MGiYشZ'le 3AO6?FX0].o" "~{HXYu~GX?[+=Na}m|YX_l-*ut(Cu?a\X{% k6ZX; ھDX'.V+ 'vkn uRcawOs kzzWa=NX8#u!º*aݕgv$ UºYga݈:/u,ucª_X ~VFX.tUi3aUEXVU aHX=[' {-Ga#F auV:aSXVWOa>BXq^:9_X]#V=J(;j{\,Vk +bՒjϛ.L̄լmj&&F ׅa5TX xo6ª[aij{[VVF[BX9,j ˪a;^Xx ,+ a eZXG W2LY ,{ 0ay瘰Q.,+7ePay.FXge(atGXw9XX:DzaKaTX , `!,- ˝rAa\.,+{ ˥t\{ Ka K#,OXV MrWXhgCa١l ,[xv#j*,xF¢jVX|&,_ B7ZX Sa[,, !"9KX Jka~_3// so),=섅XaUX^XGÀo$!a:MX\.,CYW!,/ T::-~ ,47 +w/ bRmJ²a֪l7NXvK,,{ ~ħAW bnVե*A|&1Vja=NaCX5V{"Ro5gor#}u º!S ,rKc%~[IIXʩ/p¦ aSiD칰i=Rش6]Ȼ{l%M6 Ja3LL*ldKa3Ü{6 ɫ2ɳo6҅Vr na9E%>I2Zxx 3 ݃ rOas&I(67? ld}a6敩)> g7#g#/)ۄka[kǙ(a۔VNs܄mz¶;߄;Cv$׎+l'q6g--vap%gvha&3X}b;ak9sg%u=Y\-lz ۓ8q]g [n6 @ΌQ9r>LxL&pN3o{#~!l_@a3w<,l5da:~V__zvm9w>-\€q#Mr%> E谄3/z\(zE9*-9S B1P,66U(' DB1l.S9O°P  Ӊ3<ϘrݢKBa:_(8/uWD Ū ZSXW"8o&BWAQW(vBaN- m.{B](Tܧ. b=80L(¡PT!}P(^㭅,SR(h t)nBA=Og !>goPBD(¨T(b܄">:?Y(.^ˣ H~P<LJ~xg*}qK(E>-` B3S(=SP|$?X2-ʆIPH6tH(g e@U(Մr3) %*\(MrF\wf%OeBM(32^"\E(uDŽ]xI(+ 4 J#TuMJP5#TM{j#PunPQ U`tOՈB5Po T ԆB5P)TZ"T7^Bef#TnBP&TՖ BP*BeIlJo{z վBek ao:WN\SP **osMB T!B" U4us`MWյBuϤBugޢ? ݻBuY.݅zvV^XUHJi!~/Tٿ* BUQ"dP*ҩM?z)TiBX* 7P~_BPBUU&u;B]sP:#uj u]B]/GP uCkZ_ꦍ:n~I[}+o$m> u;o"JqZ {#D{ u?[$B="CB=lP_JM|?w?/ ]uBZe{A魄z3 BmJ 6O+F1%E+ mBgq[R)י>jKJ dIMJ3JS]EɣSRi,e,H噎<1XH/=yϚC]Sԑ67?mOhJ;F1>z2>NCKiQƧPT1fiac9Q;rm{n}Z{}̏m`f}b. uRU!z̿*桛PaU%kvTޟyUb@ gzEB!R9Zzw҂5:z:-? ^xgk^ְnnSX#{YG1BUκ"~ U! P"vBº%T9{(.%AqDSxo.wR<Q̳@]\G;Ю˴v}귬Үkw=5vv` ( 4bX# -!v9c|w~Xs89c ^ԪXM+mkyl1uK.e=u`:s1O\{u`~X{x9|weߓky4u=o*C-H"ɳzXK~oצirv)q| ZoUuGq5amq/H\-6q&m!;rҞvΞBh;8-ŵ+r؇8"կ9k&:@n kb b/'o0cBB4(z]\wRvj{d^\wq]]#bDwvQovxVuI ɘd;Y;Y#;Om'sю{SB E0V7('~ VRSO 60̩mc}_|uWƎz3dz3^̉WA<c5h.I9+FB0'` @MT`@\$-IK|VL$#CEb?QHFWEm ST0 (RyEp HD"5~#+Rwn&N!Hݏ%{FD"5t:AC+RAEj*A_#:׈/D"5jO)REj2p)"u"u_3u2qVkEysrLzhaB\"+Rô0suAh"51%ӸMh h#XmO0q%QA0q5n'XNО#{> |07<"g͠`1ѧDo<_X0ӾvS b],Af| 6d[, /7oa1kPrw;sົ}ɑP a|`; WDp-ycƒG#7Ov1S{n̅w%\ uf8[*Rɱ ߵ@ U16v s`Zf#+k5[jI?-pH`bEu~o(RMv(Ri13b<)R !f RWT=WE.kHaMPsmI[ ֶ&DuA.iPCVpOu^Uc{^ʹk3}61֛M= ڸQ҆4"P!Q̛*kT|T%OUY̵*Q!U-5B-RaUX*P[T7H2A?T7֝j7Xs<0b }#HHmdlb61^[+qU/j l~,<ՠmФOבbj;Z{35õt.s1z>N2MP' C<4^c 3a=PL]rŒ6Q̹9yƼogmg,gӒZ撃B9 6I,ylK?vV@N ֕ʼn;$>~%Y++օ`mw̝:z&/WI}K].Q֥k}Լ g=YGAAɾ:qŜ5{O2gØ0NMEjM0H}zŘEўhh6yacX۱Xk/r/c#1O~uss9HM:HC!aj>LnG#|U}-~GMc}Ƒ'q԰8bQut{hR4s݂yb. "YבH\Dppԁ0ƽ¨itM_wQwiˡ|'=2 9p6 ֐֟9g^X3~_^}\˛z1>^ӓq {F>2 ą8#}'w;Y֘=cO[{mlC-UkۊZ2_6rhٜ17gMQwZ7&̗1kט1>F+L7` ~WYzY=֬.kV5Úa>} j9hr`n4ȷ-k B-aE ?7s3?7XY |Qz\W뫰'#eq=_O_ǹtuk-}\K=[øέfo^xbJn ԑe2ήKٷ%p%br}XD2 F#!O@g?yԮy\\ll=s,~&יfpN]mȟ65ۚ1jMN3GKS-ɋI r9A3/͘f(R~'+R_$f(RK)_  ]EO튔/ g"Q)Hȵ>*)R>"&*R's))ewMCEʟ[Eʛ^))/\EZتHyP|A06YwgG+Rμ%3|Zv~F0Ӵ4ky{⻧STOEI>{6IɁcu=A0!h rDEqx!A'Ӈf:NAñDANK&#<DxN :>fJ1@N Ƕ7:ѱs ~#oяq$>IN"NkvbA>'rc~et!ɓܩ,;ENQNS+NsӴtXap3L s7V=D1\k;G~'3. LH+8]'~oe24~3 ԫ7x>^a ľH\?;5-_׹u 䍳!M{'gsL$3Fɬ[m>0)\'rT5ߡf^wX? `.sx%Xi3ؤ jEAma|Q&NYEu>{:Ad'9(]L0C 9LcO>}O?  rA+DlChK1.fxy@ {ST|ϗ2ƣl#wi9yR'\0:R;|@'*j汚{T35{C~>=PjXC5|1u$sX+uccZ3{ml`ո8@5!S _t0aEed_{z}N=g {d]doEyżb^3GePPЎ?1﷬}Ǻ5h:>GGԳOgF|7or$n|e\:;|}[.^g3.?x?x^kƳe3Wqm9g慜x݂[ Ւϴ ؒS+Ί ^uk^u^uٖϷmf;ӎkמZ{e9u\݁՜;rĹ.Yg:|ܙ3{n]x+t]뾼׿W^u?^KsWξyn3}r3y~-9qXcyz(s0qnƹ|8gcy+uD xYsrt!XsḆ5ſbs<\¸,K 2esO<+eXA>L|"oW쵚;|z-sgu} ڲgn=kNy9AUQgG՝<דhrq::ĚݼT+uNoYu E>kSV=3-> wtV ]K4=5R}n0<F2RoB>NMisbFimƳv-̟E%ױ$'f.%E-a5sa8o->k'>cv& wv_/u֗ZkMg_/99{?ʏ1#9~ ȟgpj?5?`LQ#K= d}m'@coO- r2я0 "/\5> _P ?A= FͿ "#Go|I0cu+uH] 6vr)‡`e'G?sZ}}}qg^M7yb&Ojfz%ߝY{ װd,qnng}ng3ۨ6Osj99dVGY_m0a_2a1#>kD< ]Q^ G}rX1guAkq}]jQԥfDM}f̴mڮMYoڬmZѢiq>"W-BZkB"q_bֻZf=i*m66BkiSoٓ:?/LuhM~갮uXs:̧Pu˚LNV=ڭ`&h{>'/>u^տ5 _ Ȑgu 9CшmD9#j{1saL^v}ydmx|Ƅ4e2e6̸,`2'O٧̙sj66~gm6mkl۹װ5ΒDӖV́5ۚj}6z9`Kmm%;Ž\`OK@֐%ˉv:]g|u\P\+F^q>pl9oP8;{xøE^ekُOb g@`sr*Zڰڲ9mH(<< \+~Eп%D.hh1[ yK5}}ԥ瘧?ys\;Yc e.XKǨ' ΄'$gS)iw<,m:Kgg/]vt%eˬx)"59OW{"rsUkr=:׽}&9q\Lx%dTɜoq[͸Zr&+U*TJ{p;CAW)8 (8ee'zw9ww㻬4ڟqHcHc'Q3Өiȇ4,iC:cκMg;c_:9N>O?t?ڟΙ7k#Qȣ4ii-1Mc m'i4e%ReE>`, pyC C[*gT5wRO mX޷9"_n1wXȏd%c2"yLb̒X7ɡM b7)7o.\^kykUr*{U1{&2+Ϯp¾@K`JSSx2ںD\Ew5q^F_`_SӮyrs~clRSR?rV; :óo<͘ȺMx=EOr͓Iz9=A}>AM=sqt~gcϿSGqԈ8+qaÛ!j!j!q y~ڿq˞eM:cL 1]էhA4׌￧"#o$m=-v^8c؇qV oc(Pr}}cV>inj.]Ο {!qLmy$+jf?L2V>OʛMys>/^<{$Ojރ;ѝ:N1nו:J\W j3}wߥ89#s ͅi=9o9ʎ{زm [І}h͹̚iK%o:sf;vvgmԀmߜks?3`F^1)ބ 9kB 1f}2b܍!gxCֻm@~ }.+=tS]~kvd[VVrGs&g2 rHlmawu659TL>m&o661W  UZ VYJ|WfTf\3YKx^Yg̳>YFPp5k8&VӏU*roZ:X޹qZA[s,출,#ϖqnY~=|22rxsZw'˸228,'7˙|9s[`^AV+JjJ~~"VїUc3j `-kn-mYK [Ǻ\GYXgMgPfPf/WOn\Q#Gc֝1ń0&S̔Ϛ1f׌vs]sj9{6m6~ ),1 ֝%T?lE+*uῙeC~7m [dGCt8ъ=+.Nh mݶh_-Ew{-Vh%-hsKXV2]+vx^&^OM({A|$~o'+d0 [vZ9!> M|\#x=_!>qxw/^ڋyc~d-⽻Fp2C<{qZ<D?Wj⥴B*/N»\S ^ ^\+},ūx]/A<_L<_F}/]";?2I<>տI?%{Ͳ7KLmYoquy(.^(.8*Fq(\ý[iqsO>Lܝ/4V<{bA-Ĺq/Kz\c1V CEw{1ذIL^b8xhQ-b`CtVAD}_mkXPmY^\OcD}Ckph+-?yZ#fͿ-1y;A8\%Ū|+md{r[q:3]GvKͺ8}"Z`wL,ĥpD1:_ Ջob\L D/hREiKİ|/w}EcFFv,oa.uͽJCt[(Dh]!\%.{hvdQbYCN(j&dlQx\Vo+ ye֯PtƝ}7esڟF}NtigDQKTl+GrъtkEͪV6Id5Q!wkZ_Y~,^OV$kdՑ8YDI겲kV.DR]d"ʽ~dEqgQ +廓~kQ }ɲ̅kY,W3LYy늨TU{Mٲ}(0YgkY_ +&CTF0Qn/-EU-mWYfwBE,+=da'-심n>AVT^;" e|YpV%S1A]rDc1]#iEA4>닑%b?]@y$헋yD?1Q}'گ֊ѻMb]7ќl1ؔ*\oxl1^L%FJ]#_5j1X:C7<1ZP/FyݓkZ'N}pu;1-Pa@rĉz1P WVу1bv&FE? [Y83,-rѪ9%:'bE@{U9*d?dV":)sExl'Z^D{YW*Y)Z4ޟ!Z+ψDX%j \uJ2:~kh,ZaDhhi%^.10}<^&JDQV"?ڂEm;ŮsXؚm=r$Ft|6'ftDlf~[= rI-m#GtOf<:_h9[=&*7ȚE%wl':9=DC64Mv&rQ5LtǏ-#ihwσD41Kf;D!FM1+Ӽhs+/D7h2R6Vթ-'G3ECuly0[6+*MEqwSDs@P;(:*w0W d;)ʖ%SC:0OEchYb|eX32?B} b]>Gb]X,މGjh;/+҇Xљ]_fS0M3b:?K,v3btl31"Vx1w9/۞V6$1V&ǍĤX&ۋYS1 sII<gbU: #buT}¥\/J&1!f7T1&mbBK6F^?dbOՕ퍴 q#ͺٷbr\%&=w,1/i.ڋ1gH*obzxD7)hw!m q{d*.{CĥpOĵ],z9tϗGxz۩Xq (:IS]ħ ޠ!&}sxgO ov|X}5_לM<@lOHٺL6tOh['&E/[&uVdGK.B'Ʉv?d\@F&Q-P{\&G2&Ff;" ɲ䏊2kcZW.:ΒFJnW^ѡhKx~7mڏRE8qcv<(>%W.jIos@ {s! CVPx,Eo^"Gn/2Ox a_*.ƙ=gN/őhK? eF{ݾ={^z/2a0˞ SڟvP5xwlhXlNa|[KXl0*t<85ϥc~|#4gL x/n\nVQJx<ܺgtp7bUDcOuh}4l}*G4JG]!^BhFh|PXKѤ~ q1hZ?Mg/.)dB9 O=[hz |Ǔ^x2xǥq maC~1fE4mfΠѧNh9Uho5hto_k}kqيm|o W&@hW4.ƣi;4xuEShtD_и29ƷB,e?hr{h8ᄦhhƅhxIh'M^hXɃWh䞬,BC+q})@|WQ F(lk24ޫDd4 &?4M hc|{h G4LPN4Geh2GYh>Qx2Lhc>9 v`;MEzG:MjhjccB÷j4>t{4D}|n5^F Pg(Cu+~:Lԟ$WagCKԿn@Cxtx/e?1o6x5֡.(jcQ[yvr/˵OEmNu5,DF-ԺY^j P{u㗠fj;P>xdCF"crdCͧ8ԮG732Fݸu{ǝQz5sfMGxTyjPLS.t,jC͞v;.Դ%kіP.srhԽa[?5Ḱ}tQߕ=O}Z%j/^fXߍZ_폺څ]Zs٨l"_u~r0տ~@oOB~B{..آj'Bu~ kj56 kA3wY=ՓTQ ?:N˜{G~/k!jm&ޙ}ڢ )ѲF'EEJ*ʒQʘ|5Pz*E$T*BeCW4`T~ ᄄUV(ߠQ~ eP1 ׿Pm|Pʎ,@~֠lʍG\' Q6|9\w<:1(_RrW(w &#Q6;V]/Q%P厫Pq1JC %ob(_;enk]iFi*MT\]Pk9*FE_{Q\;<P |`z|dseۣ[yl`G6ɞV%<YZJpJ-Dyn([c(;eMPncg(?l&޼t(_ P3%?h_'9E~Q-9z_w0x2g0=E&(z Ŗ(E},PPb/&F(-PJ&4Ex3>?DɩK({b@-@iP5漹%u@I'Au(Eټuxp0\'c7tl/D J\Cxh'(%-ZK9HJBS>Q(W8x5Jm`hcP<&Px h[Ϗ(S"_rϼE1{aQ(j(EPTbbo? qWQY cS;iGѢ(wE(Z2'6O(hㆂQPG 뎂M܉n1 ڠ m *P!gQ y)g'6&#.څYs#?@]@aZ@Co̸GH nBQ(rajȹU< X?rCt}x.rv# g'B6goJ(!;Q}닢&SWyw(6u"#>qrd} ǽy/jO@YȿO!Z~Ct O]w|g]kqyS'd?A+m%rD&?-C~t5('rg /u|4}m9CƣXT{v?Gޘ)kóM"' rf,D;!K#ndl[?ܛiY9ǜr;BF*!w:5zY+ u0Y-#cUy "':0Oq\bPdGEVcr=DΚ]="Q%?睉"dDz4~~EJܿ +#hrCڜE3a^Q@ d_ۉ, ȶc# ާpLqd\"͢T܀H4[N`e6 gN,Gqq q(޷%AtGi(yB4~>o3zTvC+( mQy'gZ}2ӨjRTztQeP}?.3UߠVzXɃx#Q+**ϼ@ TڡljP>OŭD@`GX +~G((m@A$Qya?=r#!839|| *eYOU.#yi-f1R  >­Z;͑z&pD\~KR@\Nچ-\m={خ9O\3[bB.=@B??$W%8' qe8_.߯qR85-'J8q}Bn8T'؁a GO{8j2qttF2 mp ލ# 8GOG܅v8iFapH [>7@bINX 7pbϘao[$U v7؊3@D'{m"T bwCt|tE#.Ӱ77K<1{!z/r1#7#1ulh<#Q;L녨ٱ 1ohܘĮ{ OkG;">Gd=D6!.b\@L.DԣJ:Dcv>4Q~EgՈq'Wy㿚vEˈ%1뇽[ *'!fb!ji2bzk#-6ƾ؛6czu~}yW.GcK3܉Cd`g1=*;bwLe\&aoػa;b?ߧ f-ډ'A5UsAQ[0ο_~Zsػcs!F6"cElqV\DR##*Y QTs bO!Z5bF!zRT<vBNOD[y`§!DGDo9[ex/@x("͎"#lX5 |tDuD2  n-lCxDWAIroWDLr eV7{l~Mk@n{B4!MOr%"=Ap_DAt 0(C㶈̽iQc!›MGX@ QmF S~rB)myW{vî}= OĞ!t]'3' y=`<=klcw#v݁tb=BUI+.e\]ngvByvnNع9vi_+iT AIToqwGpR2@`މ g"@~o_?5~Z14M׫@1x AK^1kة7^?A{roq5Դ7:a#Bz6!FNXskgLT*-AED\{ !vC".=m"Z 1(|gop~^7x-x̺p3]G-U8g印;p<2#ò,7GNjav vaq(:kp\뵇`E EN-t:2x nal8G)a,a{ŪUlfU ٶ? &jT?q'vr_C|KlY%sm6"6_nX-徑bXTmg)VJ y$9:XGfbi s"l=!rNJ5,-mzYO!#lŦ^Rb]`"6fn#6XiqXUo'nb+gu%OV3 b=`X,$V^E-D_!z_EBt/Egki+z3&^ѽQ{n2Bt?ϋLDYNΆݹPvщ]t컉VnVY+:a^։΄ݢ3/ptå_$QY ~EMw޿1!F brz(&_Isb* /}1`#FwG f..Esm"zDw|;!:?DWa$z}{i!:\t]۫;h>"_cĶa]=Cna{^"q_+/8.^77Wz-^i냩xտ7jɟwn$ޣO Ex5w-wĻ4,?GĻkU|Bssz!⽗C+"m'^&^GW-X%^:5x~7ūE;|7X<뗋I5KׇK[qI5]M2'S\|gsE7G~G6@]\!2*ab>2ML_a3;zfb6VLBc1x#FthCSEKl_CLŬA="01mc(]˺Nd-QAtA6 Z2۽d޵b[1[Lv=֜Ab0m;'F·bo'GZf)O _/͕⤚&6X7v Oƨ8husNbU m!԰㥕bxL5ˢFm%#a618-jdUћ_u-/vѩ3![LfNꗲl 6=eŲalԚ*ϕkt4i(/,2.Z&~*k?ٺhE6n,cb蝤$23ͨE@/hR6+:ĠbQ_'ۋ֛Y;l?P?2_ Qk(*:Do"0zM6De2H_MN'd󅲶,uk!L~ڡdʼnv$Qޔ */ʊ#dC%;Y>_GljY&\-jKe'7QΩ]ey Y,5eF>]$dyY<,TdidFgSd,"ѸS**gdzŰ^n!vjX)bylo%[ۭ;JT5vf(x(klvʧעY׵FV_ёu&R E#{h 'ɆR?[6 dS P-gQ,[Fhx*-ŴrƋrѿ$n1ծDD>Dt}MWԣlv+DǴlC.O]Od_2ZMAL\ `X9ޞsf)j-f2j rhڈj5odMX5l 1^-C^"t*sѩ(M~YWJQ71"ZE߷þbA44^#&Mr11 C-:l)犹뉾)gؽlX} z[NEdq\e, 1<>S wb<7O̎b2zvl\1Xnbloz/Y"~d؆\b?皯cľ{+ʜ.V8뻈sb?;KԊm7?&yY~Q,b?Zlvss怣<s;i%vGUXO'6ĢKgqb^S&6E/eضbBjMzY7<c[,k.ȶsX!{[0OlbK/Fj7U̞tž"SlK*U1壘ӧ0h]; cd3q6VLlѴbq\pCZ-'ria8GGqB\kvP<ƋIX q9?YW>L\ ^I\-SqpBܴ[]qߡ#E<׊՛mg1&8?#R?^l~q=ųxfp&=T4mkNx-#97Scx?(^8q?*ɮi)+x8OZ}3&_<\3+@½cp,Up*!:@*$8ŽU)wFxn.Vpd#O CTe ٪7\,CԼS?ba-N~ 1ݱ=m R-&,s8| K5X*<IErXuԄ彇0u ͡HX}/a+s:"nTCnOGG3X6;Xí)W|6p:;v{5"VU!NLSߔgxv3F7vێL{=*HC|QFYla&"b"<f feݰo1 s-b}40baa.Mp58}@Rj7z`8TrGqJ篅#yq[ѿ4v5)81g|q&f6NMiw88U>8 WY8c gUsJq2frn3\|Kgrqyx0lJJķ &P0;#L7\jl\ݯ Oqb\ W?;Wj \͛k]wj\&iuF4nh)psF.Asf$, i:$$QH쇤'H'I_+͐tIsIɼN/ERE+$=|6HC#EI H9^Hޤe|f*$/ފlɳːc^ ' 9t2r[Bά9{"g7:#w/#O#]^vPV E/(߄}Qxi EŘvxpm?J&z4ʧEPy/&ơjJ ^AbT^ʣcQyq  Q^Q tK[TBEcTơpK PvS|E9z<Q! ^4GEJַqx{O"Y"N^Bպ!*)Q+/xFի:'&չo<<zY0C)-\G}_Ѡxԭ ѼAxlMC\#xk,1]QqU3Qw^$^TوjLsgP.v7::QO WAվ:T%~!kq/|q4 "Tdz1PUU%_P7G ;TFUl'j?UNӖ8 U)+Q_@[|~Gb'UިD;Q5{0q9z*+`sT ;*%Dk@ez,u2REv*~ۣ4Khڿ3~|v3.GwTA'V˼wK_a~?*wMDw*FwA!_T? wEy(KGŻ6|I*QŰqmQK19mCA/^P5>"Q uyf[ɗkC(?ZkN%3Q9ߝ-HFœ7xPٖ=}PZӚ(@y=n@YD@ٴ/(s-E`#uR׷@ه([ eP|P8'PQm>OQ+VGlsʌM_]AYf ;"lkEٔ(;eae(,;ʪx{ƣ|Pd2Gyr{uFtFye CEiθLFB*odb *Qy*@EBTD*sQدC&{c*t.k*Q TTCŹHT⾨TFE.p mQQ|y#Tv3D6d*rTμJ Or*TYImCe.*|QYE]JͷP ;Ʃ,KΠL P(ZW}\y^c=oLE(^ś#~M(NޅP{!P^hiG(N⬳(2UP܋m.v;;b(˜(:Q"ech Q@P+^pr?Q(tCh: G[/ypFnC!Cڄp(@"hEgI(X(tB`λBc\Qh9(ܰp#gl>Al@7^?C's чCP8c$ 9#wP,j(\p{n5h gܛ>lB; SQxќ 2&ƴ(}MQsW };{ ׿u_QCy&|wuca>r!~+@N_<9"!w}ʹ}ܐ lDyڼErc#7u#Z!O?j?"m]C{y/rmr#wr®!Dzrg#/qk^:ܷKp_7lhsE^/C;~ހ܌H@掾Jm,EȸLR1BѸwd FV2 "K]yq/ wEFHFzH{څHsi'Ð(n HkG֜T9; GȮ@~]|?ܙ<iG!G2;g!7d^Ȉ_P\ن)p"2΍AZŽh߮E7h#Y½{^3;oDZ*f! y"m5z;VH?17&2CƊ6l Tdz7q '{pnd쀻-pgcw6A*i C-;Wli!= )yH1*ב~ 2t3C>t߁H/"}8!?<:"?H{=}%H\G"}3V:H􅏑6׹:B@grZ$^ B iYHI@ȭH^kVO"|)xB _mSFyybV7inߋڍŚdsu྇"SAzk]<\3i.o$#mɯuϑ6iӁ76 iEHi] qZp$w3'n\$+wo1 dkM@Ωȝ}դNϳBβ[; y[{<8peoD Ba*{(T$hRͼJ(=QlN</ۢtFBYN(kwe{s&4G_yn7E.(=:g(R(+PJy% \+(?Pڡ;JҙPگ;J^D^x^,Qsmk9="g"iyvD$D Rq<3wBX"Gh;¾Bkm,b lrj@xꌰk=8{.bjx`χ #Gd+i=سW9BGcs7YBQ^ULn1a B_aM2]v:†E%~~Gav. ֹ=zCa"l2<2gأ]>[!#,6b_I}%v#5;v.Į|e`ghj]FK}vŮOi Bӱm !<J6O\p nJUa_ܤwzΊ 5i 0S!1<}cxű?lߺ}^mu+~w5~G~;?t(k.#,o0ƻ!a<""yeߘ޿b!('|&!ٟ3oq B^/ϯ=y{ 4[&>4_1ܷr1\nKNp9NpV8؏{wΰs ;5z*ajs6._j6ݺpXhU}55$n0/vpZx)iZp ս`7wX'> ,_UA[Xb{+] ܅ql%LddS+0SYS 0sЅqLA [f76z a0<zo_zX6h /] ^CsD^𱋅Um<9{#=&j{8öpB1Xo=q]s6zc(nr1nۏ.u;c_U1x 5Z:\ZvGVKs@ 3LzAzv-CO}t-8-g̖'ȴKe^;?PFsdm2uS_:-/e͂v en]aR4&"Y=t0r}qn_|+2-n{qT,9L-E_h ^l?o$ݔQx^bq(s*]cw{,Mst'XyK Wx #}Lq|Gĵwi-~'nBUg8?'B+̦TL-ڋe9q_#NsEkb}}(ͮdA{RgUSOb"6"VfmtU%jbs}XO]%~%buAazl/bWX~GlFx%EމeqS׋b^V&bmR-ɇbXlϿ.]YX 63;bs6:͏bfX͘bT#֍b,_4 mu{z@X{G:%yk$7LERHn}M<%3$ڵ/$^rIn(-yggB|lm[^/yL;h-wHy%g^q n@(K"W$jA]k-yx݌> (HXs ɟ0EXKA.uO[K :ʟ$'\ו$$}"zIVՕdus.=k*cwu2eNvOaSto݂|]YWG )度 pOWwcT$f=ryמ1ϟ5DO,wmx/koG_5?QMx`OKơ[$41va9w̤eP˃v`ΦIcϭVge Pv$PB&^$]f'rzp5ye>mgԡ]SBm|{#\kj@q5$a62?y~vjx8?QxJ{^M+יKvռú3I\f$Z3_-͚{F>%Y_%o}wɑԷug)?KeU樓;UY.v2~-S%GYh91<½Ԃ#yiQگN/3gb5G9y flɗ *{C"|?]zl{6!zN^! 5\/|@oR9$& :89koyԋѴz}-4Nue-1ϹcZŘr 5R=q<~~|e6'1WFj|&^~2?Gh~ r5D>9o~*N.d*}QeΟ {=^Gnmm]A2h/竫sۓ~0W_ef4AL<:W\aod7"73nRnC9,~'yߔi ׃m+mdB;jOu3mF0i#gk%sV}x!E}*׏|c RFFľo m$F5x!SֈpgG35Ӿ5х\=3~i%uo-9~:rO}m-uUˍfEkWz/I;&{5Α4h^~GP#Ng͚J}.wr х#mqu~nܤ߬b^.RӘ$^p I{ΥGIiΟ8snR FpNTs>\ʹq$cIqlY$5 jc-Μʒ|~ߩ;djCQΓɜWs m4`ro7W:f cN+K)JR)$ŋs)qƹ9_&Pw07R?^;PשI2]Qsax:ùz8Oj~sI ד7R˔29sy&}9uq߱ Ͻg8m'_v;ԣ=YT\DN)Xׂd 5]fnn<P%wO[~=8^}qE!;:姾P{{SqE̦8kwͩa% {karY|Z.ϾPN\'~8c3ϺrBsvOP󿴐3].8]tco^_sϴ%E|ZΕwr1^pv?Q,ǩǭr|;9T$'wr춲=,"1GZq ^o!Gar"kUL㉼GG_ȉr:SrR5^NhɉurRINX YOW/cȱ3r{'q67YI-#[GftÜZ Ô(o9}g?c?$V{¼^ʎ6k`UD0bٞb݆Yzl+)~^0#݃LŴ;0eS S >?EM;&LZL`Äp/Ɨ(c$~`:;>c\[==`!c{1;FQluݎ F4hw^ s V|>a]/c*C14̋!8~߅O0 tcH3ҽIv qo'\A/؆1h){q|iqO! W$H;_~|a;g36-ui{Sw4\qg+?P9-i~izďƈ/ɋǸv MPfO񼉴>("ރjg)O羡n&~M~m@0#*ꑲ?@ݧ%E=ǻzpϷ]/ y^;sr^{6ݿmч%ߌ_o.Ͻ̷([|u{IӅ͠N b cEkƳmµUsΘFyx_9Pi+ |N=P95ۇ9BhClAAb? ]^%KC\4َNz/:n<:$zѡr 0;|+p._.x9={mm;tJ=Z3nmZ&[8ZգzZ Ňlj3^F4;Av4QgBh|єqɟ4 УQ=# >ke̋X/ sO㗄Ӆ̇h|Ɨhֆ㽈zqkAWAt5u_FeCD4 Dw!2mK/"gԎ63T֋p~˃Q. o^I[}fcoy  ,7aJx`DwRK yJ}=g%aKx'.om Ɠva =fyV,"'4mKK<!͖ۆ3 BBsOZ-w BhK3ޅMCy^7Ҽ}3By΃0Ԇ<7A((a3\c 9p @c]ؔFvgw!WBCڄ|^BY)d ]/5d-lemژ24zC6D1RU1=1(psI8(0ǂ Ɨ)}6?e#~Akx*c@ cLN([w@3^3{`B=3yF ? Ml?H>YO1}>_\Y\Ӆ*}EdROn:RP5?Oz@#ޕgT'ˈ/9"p%;Y+"Fє×HR2ݧ̬CVR 5[pky=>`(u@vrsgpR~a>h`xC!pNG^R2N Fj}~$=m)pCWP&@ gM߰f1~ ~O:/k`ֱ^| Ǡŷŏ:AA;h7'ٶ#RyG/s&ydCL}l!iCrÂy9(wW;; p{1ߔ} X>1]oWo}y^w1NEYSƪ KrGA(1;y4``^7"A(QAAm~OԛB^>'hc7#5hc~1&p̦!Mz+`{:6eg}̽~o?0?ּ~yG9ۍ䣷~Y\c,lOlhP)h<G3 睾1XL&/{_gKH)5N/z* c5ہ?z5 >(2ƒ! M#aX%0n ?"Gp<Fնc5Fc1uXر qa<&.L`ׅmLLfȚP/>7}lʘ?-ʋ3v` =c ;gVf'8-fM8}C>^łN1X? >w"iI Jt# {X86ILX^33aq,j_Eʱ豊8LI/b''aX XW%X̄%1XR׊%UtXRӍ%``i-'<&V,bi"3HޙN$2!y v"y~q˒uXfzE1Hg>,۝:%H)%H5Y‰T N -ފN!:һ^% H郌$d*юKX6,XL2CȤ2 f921BEV 8FV?+Dv &dHD(W]K}OTdG됝Ϲ<Ү@NSr$,*G97rY&&W CC<݊/wy^'n`W,s`-&" +ZbE-+VtJBRvyDͩ@^(>-]ȝܜfX{h9Rx1V4LGcE@xV(Qo61iz|U3')HR)CMHiƲ z+q עUt%s~ ^.뻭ܫ"mÏ|FćIHnnR'H}Hڕ"m&iu*>Tslt"z cOL/9uHs(oՠp~>=E:])Rz?cuQ:a9Ro67L HyЖb:ȥ|Ϥ L'y_'ע+yv3(m(-<,"Tqk_D29ۛ{ү뢟}iycg˘]:'s|LŠoJr+OcU +V1UJ:QXCZ<kʝX;#k]{zb}Q)6l6$8:|ζuJ76 #-eЁ;:lۤ /+, Nbg8K\–dVlܙ>Xu9Wanlll:l|Th:z/>((`q |@aDN`k_WR(:/&ik9PR^I(AQ2TIDQ,ǞR}Cq,Iؔn&(^B W8Q:nxx_Dl;VN 69[~@W`s#(FM(ʞ)ç9w)f\g&h"YAY4عҊ/밧 _'v])6wK} T|{:cqW{c;Z=Z:|Uj&á%8D|^;pd|q}oYRP rt$Np4k 8SPs0O9ӧ.\*Ņ%'J{3^|" ߥ8\ sU/ 'K5樫Ǔp>tq*+['(K-_ܸ3 ;p] "d' ݝߔ,#wZQ^=* Uϊ;̑pnRqDܾĝ ~C=B[;yQ0q~&ב:.?S|>FfݯVo7/=nJih7~a?PŽz __xAڊ[?~H17n58g;ۄ۵bPޔE8Qwˇz(ŽVnSwmI1*U*QJTD%*QJTD%*QJTD%*QJTD%*QJTD%*QJTd:DoS!Ձ֭ԾÊso%+ՙuCq]bԡ't Iݯss~[ie{5ԙmչ;SWQ]2N]վp:)5v噚z(CMw^W37,Un ީNSݯw/k/Q7zLݺ_n@XA K=PxcGȷkP=m6uz<`YP?_uY=P=>8_=U3\=z2$N=/J=;nzـ^3JGӋngVVgfguԳ#3ǿV?Y= zhLzlHKhRꍰyjHZSGPsY}>3MPV wqkf?Tk=ESQnGimZܼڐ|mD6g?mҽڴhs~٧-SR[M;2vtڱc4˷igShgC;iM7iC&knXn߫}&A~}R|]1ڕ^=+֮]됭]{H~vcԟ}ڭ3ۓjjwRkekeI+{VV٢hwJkwhw[&lyl~yoXh}=򬄗*$bXKDXFH!Y1D'+K?["m$"/bD[- %bTohdQ\/ Hx4uG6B,[b)!O~5by;M,#egb9zM, .{%\]'N~O,e9iebєkIJXR3Ų bXڔ~XmE3E=?7QN?(cr~(ZX|r$0X2||J,L ,"m 9YyGsbPL؅k5y&م찄<^"!KȔ!<%%[NTa1ı_ެ&wC0|$A/~}% =B"GHf$ .J`^P$I@#0vlY(Oמ3ZKPee1<,jHc8J$4v($Xg ͭ'aHXh&fb@^Sd~ϔqZCg'1ϋa#aO_9 %l +R%Xcm!12ǟ1ߨ+ƨbٖbz}1ᙘ";USk4i6@1#69b|%#H[Ljbz_[RĸK=b?!w|?[,KgŸO㳅b dNjitƱfxgS?iWLS+C ([FQzW!}{+4L|y/51b~_̛hG\(Mu2J6eFCsPvX/ Pnn;wE+Qa*jEIPaTxUqDup#* ^YTE ֎ESQY8.Q}r#vKƓi<܄2Y(eJ]zb~r.\9ǵ;rsmև3#\gZԘ5͜5JVqG6˸i\Ly8Վ=L\O.E|K}} adr [WW0{S3{5\{{ʽx{w{={n=/>r\١Gȹܣ\ t%Wz*Wʕȕzs+NL+aWhgDo-t1f-ŕX?k[6pfs_Z4rS:\1ck?gu(cAcϤh,Fb8`U(㠫騱E5?yhԥ? Шl.q|!#SCqL) qn2NǩXhr#q/h~MÙmh>/Z$e"ZU Dx1%hc7m7@.UcÐvgmWM8gP%;8_f/Ϛ =Džqa\4u'. _tyd.. $\zeJq\qx~5VK\ws/v<ڷ :NB' Ct2]F[Gto{2{U*@?GMj ՎvcP_tQ#1cb$Ej"x)kbP($&,LĄcx~&q2|P0=Lu4nމpIiܲ4nĭ~pZn?np{';"qGꄻN]%~ 3hfd1s|6f>{BVo{ڎ&@6ㅘaxQi^y/)cOF|l^Q+FUx`^13sv\yk0/WcLX gx],exݻ¸X5/Q7w<oO[ex{-޿LwǻӰH2E¢xo/;Mx޿%0KS{|+/.,Ҕ |$||w> 2 Xv//g&\>/vMJ|b;_re|;V0*μws|!VICb}nÏۇ'UU Cc5XkƎĚ~ůu[aa8-c;i4hqcwo7 qz6 ܊MyylQ8-%mC_ aqsvs 6bL쑎ǞwN5v$)J%,;IVHz<~d 'G<\H#$6dO\$v eJB7H~2L L {kI)Fb93WR>?[RKJosHyrd?R~ iO_wۘ~Re 0l A.Ӏ4p:GchVdK*f^"2%<#qGI*)4q"E }, ؏РohP9ToRK""{v:"IQ>4Ae@^nE:oIg1}M:JwHg.N&ʤ]JڙgH;i{L"lx ikI[ iEZHr*&GҺ0_$SI+=iŗV0&qNZU2LZMٹ4Ҭ>JI$4 9fY4Nfs6i6=-?l^6ORY4_d箑[F*ҼEHH{?47a4 ׵!w;a cD74H[?m&ͽL3loHsN=iޤCRqiʱ)iҜ4ĒOi343HYyF uI+1NփUחeJH{S^B⻤}#i`:=t/&N:Q]thҹ@:I@:uL~jNs鴲egzO#"^yM:o^i}!e]t*j; ٤k|tg!9Rt7^"'H7ύt,"k1V joL agfg:+?Oz!H/,+XO'=ᄂgHLzӻHoa[F [CH{g{#Feڻ;&/tF1I{G:t=@:HGg,:i?Ht1p8YZm$m#ַ"m!ߒfl[֐(iO(&)=sO$mˤM=[W$iG#I;8} ig ]Gگ[I,z>ʐH lᙜ2G:at^?"ln5餚"A:gn #yB:_fN=HEnʤEMOҭ5 =e)Hz S~h+ "fc>_4%{cI<L&ɠ@ V GHە"mȨ 6=ip= ]OCNP)} 3Vma4l/w /Czoixh ?ڟ̢hD F# 4E Qϕi4:ғFϤ17i. 38Cc/q6{hο4N7Lُh|M`2ME. U4QMVO=hbnx&>v94I]DIkhRdM&]g4Ε&dA4<&/490&o~Fɗcir7M~s&6)RiJ4e2UMY8-)ҔD͕)4Y$MnFSzTvn4j.ij@Njtm4<{雥iz %MѣZiLGO3RhƩ+4aK&F2[C&IS${9,%t2Lf2LiLhibH3cifluf꥙̢DM if7 s2Jf㦓j2F~,"ٸ,[vd6{5qd6z^2[HfKd]cũd6ׁ[Kv_V}un"B2 &dOfg,^דM2_|n ۧ2w ,fL#b p" d1,BGi#Cdc:YNNq{,="w'ɢ-,URDo#KQ/YGȲY)$ d&YEUV/Y! c&9rWMz`7YJsZ^#k:Åϐ d]>!y9J6'͜dl:͂.ž/dYL?}ڽp5% <$O0}i"OVFdUKVy7Yh!+ ƒZ+!ϥ3ޣxVHVsjGfg?UJYmO'tv6s/Y_FV zBVow|G0`vy oAd:Y̰vI0#YO~J팮dmcDֶʬo$Ֆd'$LΗgda7޳!+f&b}q o&{dZF6&3ٜO ;Gޒyl0FSe,|%d@}#[{lVM#iB6dð:îy ;O6TȦ.l[lqdS[ǾJֳOd0w: g1tT"fI&[d+涰~}Mio`4=nևdmټgKf-{{Oͫp)seLɆ٦]cKy:gMvɟ6oNdi|f{k fc GV Ӌ O1;~?O"M dsr&yl1^=g,b3~^Kw+lϯ 1 k&e3ۗᰑu&6^{ò%ld|::8d\`% hf 3]"FL'CzK'OO!fɲYm%K|v,j[b+ȢO?Ed>͟492s%4r=<⑳9G,3=]Tۚ2Ơd2sfB3\rhp{-+i:VrtӴa,>? m%d^&ݏjSN: ac,Q$SƤ8)'A0;| _䚪IAs8ArH3_GӺH#/IFiI癑h I/&i zFRgHjrm7#ƞ#cGo$v_]^ϰ[z(v+&cU:c>uZ;O`3lvyOS;ދmX2~KoJt NaۯyvN6}lֲzv$nAغ[M(ly$-e!lc;ؼ 6mƦ[Q0Eð6>ĆϥU'-/b=Y\Z>O9,?_X)_nXWuX:WpfZ/5s ~]{ 5Ư#ֶ8b9-am ;5b$As_.7"ӊ՗b5?WS=N~=?&ǀ&Uc]xܱjPZr6`թX(g)"?UO;.Iya~?wYXzsj_r3KQ?5bVc֦¯/ub}-z_cEհѴ I7p$6<V[fĖe= [6cK|rl[allne|6nqU FbS96O_@laclSYq lӂ Oal8 J ^ذ`n`Nlpaz7bC|!5 cV lU YlaCub816Nq]lFhK݇*6?ٸO3dq|lS 18}]y6.d͘ٹal]26`clF重jclNl?u^lh!g`Âؠ> Gt[r?+ s4h?Nr=} ~[=X{ZG%K.Nu9~˹\Uۀ^z~ k kֳk~a1?aٻ.Ox~vcUXu:ĮXECJ?<Ccr,~֋XA+Ga7|.{4+@lޏaV܉F?h{F~л~d a@;{+beiLfw-;?~<|QﲋJSxmW oަX=_?Mm )*E|~[MSXes[Ir|, hp.|MÒ_x {bx/rgݺxwUmsxu'\t o0}1@@!~/*uT#ĝC+Xc~Ȁ|`w%j拧`,ek0¼bލyR꘻d$\z9 UZE^sqj^q+m<^1 /o˪G΃xi^:/N =T> c l&v<_gGi-m?ƕo(?=?{H=óUc--ܵk ~Dn\.ҒH9VֹqK|-KŴܴ'!o.pCpzS9a쪳l[~ YdmeqVۛf^0ѻgVٞJ_e{r{%Wl8l=[Ivf3͑n^nacnޢW|GwnY=f3<ƭN쪼5Ne9 9ϜHOνjy7碞GU\m+۲%;r;46wX.w/;;8r;';e.&-⎨/>ᎩrsGp'⎟ϝHs\? NsMNLx(s's'N/NE~.[w;l;i.e|rs_nܝ\DT2)fnנ&ew#~ˡֶ@ԯC*8E46R_v~ù%q1%~ދEvzE:M tFatCX]L:)pa nqmqTܩ>e&~iҸR:U{RpA fnq̑2wafH{⾕_d5~xxG1ǯIx+3Wl <o߂٠=Bs^;/ K/x+-IxuW ^Ü;ܮØ)a^ ey^wrbރc=7k\ى{gP(79s?ӃExMt|>ykO'h=|i_+mV VX??RŪqmӈ OMڐPz4P?nm{ 6ӱQ"6n:Qؔ?awll* Ǧd:Ƹa^'6Mcslh-b=jm Vc"v 7.##cS]OR{L@R_kIj{:IN&HJ {'Şˏ6;ݾuح]4+4v.\] |bS1v}+b]{%kn$49ZERIzjsäy2)~c4} #G~LgHRQ>Ie)6\&ŷ#sR,Ob*[db R5WbQR%Ef).'EZRL#7/)NO<Rte{-R!{0Sl>)L`-xׂ} I(R%ueB!y$6d;rE2IfI i/֡nn S")C-HJ3=/yk{rbI7'a= n`aZ1;`g($iA$ƂdT&L>9J2$twwdW&cHnw L'S$WbEr\CgH "9j3#akHn;Ir9$7<}$9$H9F${UdM#{>~$9$}?U'$7ژm')$ݽo+{31h#6 K#Nl!~H['y+)!IɽP 6{>[@֒\fyFd+8Nrͪ$k(5^d%9ag]axTP/>J+GD7yLs4IJ$8M!yn_|z!yg5_w7|6 &kIo8iiRP)! M 28f")tBhE%8' ̖I0:uHz7π1.B EIMRثA {2ǒBӽH'v²3_f)ǐ@ #uv`Ru{RXp擂|')LF }IHaxRT&q$ߙN[IU)_$,/e2\e#9$J2''1_;ku_H3o1$kIt"$m3I'$0RIztCw9ev'lyO$;=Ɇ1}>i Ӂ$+g/%.;BrG?vb0i&$g. IЕFbωݼ:x,Sa M[X/'l<= T6"O]=s>֯Low:+k'/yL~~? i:cj~Xb+> Y}|t7cy?~IFXKBl!'6`yu,ˇ-E~˕{ l/WKyY|q__%2-|)_^bX>x<џoG +ҫ|,{'[|ohWbX)zX)/#r7|x?[%;k%wNbX1x;M7WM,y㫣ge/ϵ~ƒ<rdR'>QGL+}}Uy|0KrbUX9`7]G o[w旡xS/oʠ0 ǯ늻0u0OG`ΪF;+xv!^/x|?cvx=#c\@gmE,7̼"<}Owxd'J?i<)'J2DxO|<o$Zz<_Ϝ؂g| xa^| /ū^ᵂ3gAx]a ⭙N@g^=/.\WcX?a i1kůnXC `lY&6'd I%P+䜧1Ybw 9~;H&:O%b?RLtH=$i}B@ZޛHq%nC;đ~2XM2TɷhS4tRYL.Dш/4r:5xZ^B^h4&'4i4nt7UEOq-i4~q|o4ɤ&JSh[2.EXU>2=M3WdП,R&d{y7\(⭽iV ~Es^y4Zt;Eub#d-ʢӲN-ZV1-%QHk*/Һ9h=,!8XLGq(rrCΛȥr6'^<B:/ {*Ў|?S6ѠYPMk#)h2g*.0 u"P)c* ÙLq.?xS=S_wd|̋]5tպW [s)Cϗ2L 6{f}%v0̥g)slj=Ρ=yi0U_޴oa;K/~Wh`:`WI>TYt=t : 3FY;H$:x䌣hHǬ2X:B_GtBNğtrp:YBѩ?t3;:w Et1WLp<.-]ȠKѺty \v+uj]D׶dQՔSXF&ʽ~򦌥iHR"*G}z6* UNtdRL7C-Ucunt'f%]DwsRѸ!T CJT|:wo}!-*J?WУ;ͥ'$/XRv_AO-g.u5]"^2e.b9ޫ ^; սT;BMF 50T!?*Z;!<9ޗP@"tJ(U!]41]<>gmT}"}xdYQTIJ6l,좯k WmQ}S]VիS}^IߝvPԢwZfRˣj@'$Ԧp|oR[tY߄P8jw^8+=:ާSǟ)u΁ב(hu~OKcꐞCX{.jwZLfMn4em]f*)/*{u~IӲo`jw^;zKmo\ ]ԖڜRۚIԆ66&@mRkVvRk1QZj=Z5۞Ze朢cz2^CvQZIdZ|j6>6%ڦQuXJmߩ-t?E{Q[*j?NmmO,1AmGؾ\0k=jKsR9s6?ڌF^6=~Jj|f0Zd/jJmfmAs5tP[a3bI +Ƴ\jA#ԪCjIr3PS9Q-~^jS>Am FjkΤsm?ՎקSK^:WSG~|:ls"uڧRg 꼿:JKu)SלF]QKLԵ5D]4SW\9uP uB]̦֭.uޢt񚺎+QWI=u}B]|uU2jn=a0u3?}$xPw.m9˩g O=sriCr˨WJvj0\D=}' qAuBԽm9u{?i{}ԕh=I-uf@=\~:GXS_ Աuu|0 f==ړR{gjN~ڃ"=e>~JB.'c}u+XQ jP`G0l cu,XCNǨ#b#u#uJҒ ^x T7W+xG|_VC%l";+__'_3Z6";o|/QŋamBU~W~c6 @Ox~ޙ/R?*2yacxͼ׼:e^%yr,rΈWU|U*?Kx#^ ^(WΫ^ULUWNڼ"3WMʫZīiUUoݥY^АWɫ^^me^m~^ͳW jUZS^m&WۖīhՎ<.jyk6WSmi󃦪VbeAAMAtyu m^}c^1WO2Oh.4x^ƨz^k/yF\^Y&;T5GL5gnwyd5OM5_5Z5yqY]^ˮ /rZZkyN_^1=B6kϺk/WھvvD^;kkkڗڹ&-?oڷw'}}@~kg߽ⵟ䵟kظ~y~ƱyM6Ns~l9?>^vƉ~+x쎶w ^G"Oq uxxSkxt^GNZ^wi^!uټDݴXnuyx3]n[p׽;-u_yݯfn.77\׳-z gyCM ^^k'w7?ϟu y!"o/o  r%yA"Py&o׏7ZxKNapo:7!o\=`ߑ9axC*9 zAYop!7,( y9S^xWoλ~^__/>eyżk^О׽z+=_y}d^_͑DP^b^/OWNy}ټ~^?z1xz)5+F ^4^ShhJy.7p "ysg7y-o8| op &Nc p ,ox}_dsgg󆇟Iax0ohǰk7L>O&Arޠ)o78D^nF#opi0!ݕ민AK.7_ pP~b4~~q 3a6{7{UW(;ddStdXd;{Sc 0p90oF6O93.?yL/6}c|7T ^ |yx9g̖{]uyS>u6ּc^g6qMiYE^;v\^:y uf,Ŷ]T^ 4k5{dx q*ë:ayYU~Э\~P?h'WW ̫Mcï^V^u2:7l ˫X~]J*X/U'm[lh4F~8ݶ;ǝ++_=+o++sJKUx%yC L8+~WU n yU|/urWr+x9ͱ-g^ψU[,e\2jxۙP^Z׋*B~R#ԩWHQ sQw4cS:_!u.@ן|܃گ$Sa7^:YiZPIݏ_PQA8l5ҟor9~_,g5~lGuտoqTw3L[.6y}NCGRAddPM%s*}O)sT;>}OU}+MUwnRe*u'Bw3VSŹT36#́֜ ZB^Fҫ[ozY@/7$ ɇ^yzn5&гlezZ쥧Z@e,a.RٶgTHeRtzt@OR~ГM >z2UWwx,=;mKVSTJeQڿT:d*=8f?F _t1=A҃&uzȜF6уiw\{G%Dݿo6*Ѝ 'F{a@7y𧈄;HMȖhK6$a 8 H_O*\u 6t}nrR[ 4Pєφ|w9 <ͻ{4ܠKk)w̤q)ɔ}rkRXu󈡼/I+(5 &eeQz*(늦t5]̤_/T8' sWE70uʖn_w;wN݋:T}5[OźT|ΝOԤnbHfPɈ:*qK%2t `Kz`,Ԥv{[`m9=D&@ ԟҋTrJX=_̎J&itv7/T[龯5ݷ)F6TܳGRV*Γcש8WPV*gd!ͧbcOC/k_JCڜX{]t{2˖S/ߜUQ~4kRT<6OAŋP*̠❇8s;?O'QqaOMom w}?ޑT;nwsݮ7t_6ۯQq$*nMſ Ҕ_ofwPօGOhP(*eGś훘lbVSqNŇp*f}e >]zOv(=nSBE7QQP19"Cw?tw1S?Ewt;+fW˚V:n%?[n5ME죛cuFStCf XRa*\MKgt}X/}T02]֣|7nJyPn34ܧ(w4]SුӳrtdCYk7d:$vC`+T*A洿~)_U> i^mړM{$QfK<2C2(sʜ(OQf?[컁2RuO&(sf(e~֖o;=v6G6>$*M<.Uyܒv7,xv/'ioc'ɞL.KhZM[іǣhڜ6ЦJJO]ꔺ\RR(%SJhQH2g*;KD(N6@/ESDd5?G!ooQY8{$ F&O<!']߆\*e(rڽ'"H{ZqҚ7xM iQZOЂ47}[Hs-2?&8Qٔ*+XE72D&ïãXP)Ф iBDc,ilԁ)ѐɈ $Ha4ؑz!R#F#*{2L>iZpu(E!Iv%9^*-X7%kFA_"+W~3E-|l Ţx{+  ŋWU\mǿ ¬]x'ntRܱ9\z%G֢#_?K? :cc\sty;"h Ng8^m} ;7xܶ^k}= ˽+=U=XqfW˃;5YV۵&Lj\nͥx'q!gEz~ē>z\U.1xb\-p\"ZybnE\\HSnG:.IBG Ha!X [U g7(v#z ^@@m0vn.B[x-A\ 3kѸ) tg<Η2=qӓ GeA$D*!>y`=8|ĩ/A\Doh MS!N_jT3E-r !~f? ~D\z@X H_%U6D{}A"0l~d_R`~2nj-EY īMBA q,0 pZbϽ 7AL&d&H fqV܀$HA|=ӁN Y g6Ae9%+fwV}3HB|)Ӟo@H Lt яlPHr CpJG3ݲN6H^O2ׁFV+0l$u@S IcHb~2ɗ-K a yB]tIc8H!֘si9-2px+_e ?ޱ\wG!5@`ULd"$i&W}H\#Ɛ(cb!2;mS! ݿ·BR2k“KY|9 P!$@tt$ڱאw&Bb7O2GBUH|jic!Hlt-O!$gj$ysƐĭdI<96Cɐ#CtHz{!wn)ӛ )>;[)1Tj.DV+@j$$ BH6/$jVw|2VktD57H?~ |+',Hc1ōlQY]PPGW԰\~Ŗ,3 n,v_u |ZbF ̂ 6; Zy "ߋ,8Y;Y j&S5,̘q{C̉ev@\n q ,a:j=g|9b~XVٮ)? j7@Y q'z w{!fc@GD7:^2y#!fK1".}7" !JN"<ȁѥ c%ĶCLQDdJA9if- '!4GJ;쬂!f=D;"]S L$D(SXc Q_@a:WA8_ a!*5DzKٙVQ;@D+\ A6A} f"D ̻dD+@FAP # l&ác$ dw teP7 DJ "CWDL ˋ dqaa ,솰 dvCa:<ZBX7j gjaA`AX'YAbvyfr=*!t71Bt3BA8W݂$ذ#d@Ё4 c?ApMCQ lH(eo5fgGm8 /Ʉ 'ٷZlú&@?lz@ꥰ,ؘh I_q2}`ío #akBiUhy~##8+]3i/l|, ߓ/oB!> |K`.Wx>n Y~+7ۋ`C>Voǀ*xto@幁כ\~^wE,x&w|_Ϻny O|BNK{1tϕr?Γ|_Vmzay} FU2 |# o/!w> |^`M4M/a^džW.4x/S #g(u_~~e lߜ?|;8ަ~t%x]UZ}-- ~l =_- ._~y 6f5ׁC๶|F rz>iwfxՍ<}  ߏS7ޮߟ{&|ߑ9=6h# }^^޲u|3>Ka|Ϗkg&o!&r- 63gOd-x&#\R~&.Nk$~goixzȾ>#Gg_1xd0Z7q.x3omm!y><كϘAٺܻ4y<3;=b<'xOvO> O{Y>'c8x2=\"9xfkx!a:p yMnrUޭ9} sop{ S"p/p \?ewp;^3g׎#^<& &j8 nO U8`r '_V-Bpvb<5i?SpD>8%|Ǽrf88xjE6ays{p;l0 YQ3s7O5pʱU2PpfZ\C'2\^p>: 8'q䗂#}3pMra8 'e=8ܪpp1 F4|)w8FHpY zk'\gϣik'VGJ.OwspX.Rxp2.=#W"3c8G1rq)pʫεg~%cp3a7"s`}\ph[ vZ.zgqv=s|i38|N"ol*8|0R'/+5 2 6m{^`}38ez}p~zK\XAtjN7) pY έ [<9p(8Tr~cLe1~ceow184br^xpTaL:q[NjC8LҘQ/=&9^|c8|əѴ*t5=er4,yJ 8c4Ł&ӹL4ЊOE p /tsOسd dk6Siglp8|K=`&<Ǥ`7o8d9spV<îݸHup(3>Us -$700 {3ݙ uyt 8}C {qi8 <`}Rge`wv]NS=RDSm98};pX|4Jj`}zp| 7x8 ^;bO;vAyx~5;9v3WøZ/bv>j8ڂZ9p3@L?NVCE,/U;ǃ0[VvoMVW΁cNÆ qWAyS{2I7OS35`Al`}AI\# fl҄_@7l!|lıK ow@ #~ %eWa (B#. ?i| l< ToHCW% Ɗ'ڷK!t:O ilC8k }'A# 4*!HNi* !!Ax] !AH"Cذ: lM.ѫ C"vЧ!ħ" l^a yCW^: M ~T tv,w=yK60 }:Z1 jk܄%y.vl D)ClSo!@ȅ9$;sF@D=5%EFA؇r¾@AQİ!o ri D7@XU/D};* yD=aR r(a5D,~!r6f;Azp4DCd Bx]"DEpjfc~@BM&sSYZ4"s^Ah?E[!|l /&I0H5YM!|?x3쀠uR1 s6VQ="6xۯ!b#A"86 D] Re }!6+ D69 1ϯhM x сA4a$)W` ] vdo΀!Ga3b@tw711@DL vO5=AqxV߮_7@lKJ/^@|h9J\@cqi5A2>  @]|$Mr >X $v@$6LȸV$ ׵!*H 2 L6)@B$DX Hxw,A .I p*=ͫ!VH|3$<$설)'!_H贄CW5ɐd$fCrP*$m s -w|$Qt @U<$_w _ 7ٞVH w!%yHr, )j*3@J.H]e ż~5jRTHUAZI.U Qi#`ՐRe Rߝ}/¦7!-6/g+QY6i]aRlA>Tw܅4հi-fׅ~ 6e :}X[ u7O4RRπO Dm͐9Np`!5 i=+!e>{i *z aK H mMOv@d6k@Z'ii!9`,ldw_n!!\!q - tHɆ!-6¦ m6[H?jfiǼSof,Odoٵ4 \32}_Mɋ7iٵ $-j-׬`_=PsKVnչ[simۿomۿomۿomۿ?.OxOѼHioŽ=kOƪ \Wx> }e/wWjXnYaq藅?f /U :;% [an0caǂz/4sfng< 03^`rD+h' '~sN Yq!1A.]P8M]J(UƽHf/~$y |&M(]NL7 WX:B0^) -])  a[X$L^rAj2I. [`" m8*K$^H{0zUϜ-}0nF0Mlc6.J0=wO\MZ0 F(L#'}.ލfe P,~&V ,="̑v k;o C 7;~W}HD]v&=UE[ BܓB ařa5-,0Ft,KP4 턭e槓ªUߋ%A K I]Bp o*x kG kۄB`-x=6%D.+R n¬&)AT&DaB'BeBtY%D~" ) ˄HXR%x< ;Zʂ{o=6G7 VD􄤟ABWna\Ul $Uo0f5o l"$ 6ءMc#ݜ)l,^*3u}F vz#a9 #/Za83; N [&𘙙)d2ıtfff*̹z~ֳ#e+OgڑTAf2)ĐCۏd{!Cn.II֍MjY굨νaR麒|c՟F& IEc ȭ*/2 '!dk<9/C}S%Kv_IXB6'a8UD#sop?rh]3DF/P$%KLkd$.QN} HܟjFlnM uIɬٟ$i|T_Ú~ƒ*^$N$_EKȡt I~~kуOɧJmr첑lN#69; BVͤP7}ɳU~zP']7ɡb8H^]\kFŏvLyS`A8 "NQxm߂>o; O{>d|B^߂Ðȭ\&m"נ%V}3KNt2$ }) `=I%c-KiOCeE^SD/LC}R^O;RFȊns)xGur '5}MoT#Ua\:T'qd^!YvNvO뗑A NQWql>[xt$Q{IdINVoxޓW1)Wo#iԶ;9b@DR'€v1НJ=O_& ]v̚櫚UU3~x-uNm]s j&ר)L, :Hhk.ܹ C@RdԘzdqԌ}$(CFQEdd;AfIH RέCH O~s) drl5<{jmZSKEjI-B{䰻P'df# Գ3#>Kj9:R}ӑԵ<|N:95lK 7L^SWu4ڽ}N漏TLMzzԢYj1i&FS~vTAjX5z<{U}޸5]jL5FP$[ Uo>NUMRuJT5o7UAU'SWT2j~APlc8#+iIl)FN/Qmy!C+N@W]v*}(]jtjX{}5)V=QɤZ[}?ڵO&c+2jM Ժs5^ە䏩ψ 7r0巡΃ӏ)iy5ї:S ,@)kHrukDwfjj{LmlQ'da5uq é jNRw%m:lnS o'2{ YAojru>u^:TA] Rߨ.AFoz55~:Ofadwo r57)ͨoC-/GrueGmSiCI9d;uUJ|R~Թr ѻАg1lBP ө{E) $ǐd\:9Nr>.xeOj#Qw,KonS#FLw~Wq5BvWbh -ȡi,)crH^Q)$ 2ިI}XJk۔/C&S;T|E-SD CxΐhGSow5WGM6.ZYԣJYQnM9wk=&.Ժ`m"b7 Rꔱ,N6$8QT",R4JFs֦שd8:ZQ>R47&K4 33MmW G&{Q՟E Ɍn]rIv&qy5<8LIц:~B;:^LQߨ Ie dzoPpj1Lߐu"!oaw|>$Z-]Nņ䢰 +s ! grN.QRC>)F-д)m2Z#+5F}23JKqؔK¥;Tkk$>7&yj3zq!;H2ېF6SӣHE^wwdb 4I#K5trGoR8'adۗV1'JiHHV\Ho~V$S!~d~g$ɍ#rD&S|U2/!K$>>PjxW-t$"g$MQb s;YUIi:ݻE=cylL$JۂIv%mE6y(EjHsP- uGsZ oXE^ǐ) 9 Gr;2e_#.ߒ|ͤjگ%ol oNg-9JQ3ɩm=R)( C;Ӑ [(nI/~[:).E>lOZ` Q\1iRJ'(1o Ŷ7I(q}Yvu`7vS_5=T&Cγʇ4Z~m{P^=ԙ֢䟖;gY<(V!-FVSjHc][1iTEx")lEꗘDYRQ֧F:-ʑ (6 iP;=j0L%Uhx5 AQƾ[4`zSЏlm 8x7 uٔeLܪC(biV(DKh41Oitrn o1ThJ*}"T$J;YQ|~Q卿O#/hx[~vQ}/Sьq4[SFD;  #h94 DYh,]o1GIIg,MM :ӘF/B+T4Sgҕ[QeE{Rxx2eW܃%V{҇HĐ4р&&idRS03RXwSb]*5Qh9S 9ܮ{w hr< [[) Ğ|C^fڥ>t !ߧ )dn X{ = N!NQpLFqRw o*>\FIKmbR)bX[O Q̬qfE =LCNRoCɔߊ4# I6ċ߈Tn8p?F_⷏x}wJ.AI;M(aN^C)aR:̦~{]_\iG/JM äQ:Q68ԧϣU^RЕ)MJliP`T|#qJFߌ).ٙ`kJɭS>KPRb:EU\w.=PNgG%Q]崙IFSƤQvΔ*תAv0?MXؑoO ͗lJ/)n* =؁3u(r\X@)I+H-I)SXJXH^R1 J~0.MmA^'ו"7$m"IMST{J6wMo( §VpWWhLo:Qו^@P ]BͷST"ٿɭJ-Jλ{]܁RWRDz:4'/ɹ2̟/ SO.랓_)&dޮ7DN] 80쓷+rpM6s-%W>tݟ<~l"jd{ވlj#o>f?9|GSvR"d꾅Tr{_UKȑA d5ʍLdE7t=_&g$]c)d4j6{Yv;QߠwGeM#cȬa}HCI8DBK$@%!ԳO1 b2.PW:7z R&A׶"3!Hc#z`8B7IH OQZsL2sK!2%J~/YĄd1~dC6%;Ȁ^Ikp>^Jk'*"dzifHSuL>Y>[{8ٷ!۲өf{dBd=:ɪuIt#ruwWI90.i'B!u )CEΥ(fQWk 6k),xSJkJU'(uZ:7^Dj);J3IO)sJVoS줬h4d3άJCpy]<߷4~pS'gPiTzڟJSTwRDGF,A4 XƸ6j4vu! vx*:ڌӧQэ 4[40bW{]廉 $b /]@E~QQQ4srg*o $.QsSF]SӰϨ 4|}s/ʯJ#p>Gш}MW8&p3q@8=JFSI*STJ2~sj'RF4zeex*ʡ(*@%QɫTg#~s>J{и;i_4v7iJMleHI>є4iII3}:cX9MF6k4n^ Bє4~g8MCS7=h}Mo5fHV4 MR u)~ДEiz4=$Mi4ŝfG3.L4f)8׮DSL3x+WEnh|T{Tz-`KfRՎ&7^M>Фiw?3yJ#*TʎиZr&6 T~uAe;7PF**wJ8(Lc"hR*2In/ho+OQ2*qL:@̣"*N=#*woG'и,[bAoghr|)M7&M㴣*jOiS c&ͧkTr ?|Dhe4i>7TDD%SOTp-'M}JWD̗ŕҶwI+dSjDJ6էKg(9Xm$G}FRmKJR( JnNI.߂ęƔd.%qN+)n >bn6V(Ⰼͣw()s]E3vžyEf(ewiLNͧԧ[)e<%T 3(qHcJi>;R Vdg*O&[(E7]GSr~yBΤt  dSTQ{4E-zd "\oRf|+Ε=\wN|5UCaO)E׼OuP\ @(AݞLAE)f7Χ ߪ28@+wec єPh z\QТi΋|^#Wȯ9 PR@Sǖ"#ȯI*y 'ߥS(psZFA)u(YF|FbJ;wD򙨤)t-#u!VޙSȴmIR_HQc)ՅjdHQS ;BﬧƎ؉=SRJ {Bn( YGQXRwr|iGɯE\љד9=<}'L{.ԒO{3䞚Gq?wSc#-#!oMl"oCϨP챀E{pwYK^ X0뺐s|&9^%["e=0cNʑIi6oCndF KRl^M2O$x~!aH s) _({ մYd۾))5VK^9yxA^Eoז/#ܾ>.yȿwrxۋ'! yO{r\DΕ_9LNcSG>Ktr#|9[ 䰦29OZL.ȱ [@6'lNMBڀ{=ft>@ rN Yh~b[RnLuKRV kET-'aCd7>v"'RH]Vd./uQ؀6nI.#=ԷȲh5M^?gQ`w;E./2JSlX}FM&WIэ|ߙ,$=HqR%ű'NZS'/R4) '}7Ŝ9CiMqp`9&L &ِ{Rcs|rvޓAWrF^ T:P~F_||mGCRjRʬ2W %弢= ne(Ǥ8 =Њn 7!iZSԒVQymJ )a7PAt|f=7rʛH$CNalB!)~'JOmΦ~TVKHUȦr\ž1YH2mdZk1IEr2RZ^V# XR?AgVo07Pd2CE2udT$}N,X!nMKJIɨH} jHޫ/VS65;N)Ԩ R*jujm0kS+׽T}!j}DMS_oj~;?5kwL-5R:WN*BuPUqjvI4uΚD-QO7šZͣZQKdx~JM;!7woDR곩ji ~8QvTKz~ 2_clGM&F-Pə̔,Zi}Ėo/q֟>Zx~8V7Cї^٥~ѫC6'VS:-wtOMwbAU!k-US9Q=1G^&Z.zUtY/ZvdPˉƔRqg5Vߋd8^Qg5+JmϸRۏۺ+ԎsJF~Q^Xn8nuكB-kYҺlzZjmL'rޞ9ozyV9M\̶]ҌjhƻUNʻ|*`ꡣFX V]`jc5[ݭN: *x|+[Vڶ-d٥`l+wͬ\eաnPf[ yb5gU7VƧYeվnp%'2k$G^[my%j85ZՅgYLih5$^~el4.n]\BOr{tw.a}{1:qMY6ҜGΎE+#V+Rֶ͓ },V*X%̮/&#5fU 7%\\UD(.+SwYѶ擢Ƀ.@{ѣ{q(RZ\>^K&O_)iVs^DJcs)ᄕn{Xpppxg ѼwErhVf$z\+亟1oc0qL"iU:OĻK3a~0K<=aphHe\BgaCf뛟Z^ W S>bbiNApavL:xP&T8sXy٢bzR6/Ok%s y0 ^_ӂeeFyOv ¥ߓK_8ۧ&xb+\\^O1V9XФ4_?]Q@XkKCڄb s:겓bCN'$L@~h4׼Doi=wa뮹Œ"dm+pUV㲴{EqUh]F8Q2Z-zLL9F}Pyùbb3b=a◳!bb+ oF<ǏRA@13}gX?(\h_/W|j $)\eH_S/Fj.^.Kt8C>@6&o8tB=_qy{dck-Xer)cWaxbKqu\E8z1T-|e5km*S(z}V(8M@a^Yv\xM+Yj].oi,nF, ZKZsJ1G}U%<&59$!)/+:X۽YqMZFN?'4u ,M ±)WD1Rh7S_u+!G6:'b|`{i\gncHϭu̺]n))t֋UVWK׃Ob ->7s$9Q_^xanX:[\uDZ|bpX O^t;v8)aiQ*b/a@`6esug]Ce9CgY쇵1ƢX)A':RC$_ܓĊ/Cu/\&T/y{qga yH,) zXZVuEpYѰ"+,x3S\pkr"RyF*:?IZg{TQh.yuB8N gⓙ;5smr;?FmƈOww6 n6v o *غWj+ZN^(MypSr`ºZoCRxá-hYTZ9]z&KxXUiwRm.ݐ:N ~YR䍑p wLQm^;E:4%=lT$?IzN$!c՗OHѶvRѷWfJͱTzW7]m@eRxCWj/+Kzg _{靗-įf^6դۥwsJ zJEIZJUws%,'MW[~tݻ'U]I>;Fq{ź}ij*=IcqҭBEcoH;2¤HJH,'bN1A]Kr1]:6拢EbXŪyҷQuWL4?,Y:PZrb[R1u$EPE|F1 F~b\*n7n8SՓ[*Hͫɖz"&^ Ɨm-QȔ'S.-+YOZb9n EHPy,B"W8Y`hyUm5 ,8I&I_Qvx.0-&K'^KKg/Ƽ)li?u-ZYs0SojU46<# 5?n骮ĚE_(D[ufVV&8U1ǿEIgBc+hO,h/,x/hT20Lf)_l,PUYA߹}ř)-(+' ѷUX#ua|wc'o?o)+VXk+  ;N#4}.4a(37],\w9بy-R_9/ʛEM?ee7S*_!++m/M '4{mU!,+ _}%߅]ts4 U? CSs?Y*7ϛQ+f [©Ef}FMi)XP]˅3] '5Ƌ+W0U?6AhLEu+vx?'K^Q_׺fd%Neݽ!ܙoEٻ+x/m+q\E)9ipOu|(\۶FF lnL˷vNse׬҅+|Y{x%RX.tuKt,TYwdv-yd-yﵼX]Kr|ϓdw {ETuR;)EV_]Sn_~7xcȟI g^=*[0.lBvLzaږl\nˆ+ 5Ke+tx$aϞ]?}o U*?PpϿG4?,~Y1鋃B6dD%rMlhţԊ\Sw ng#H e>n# , .I6۟߰OEy/$ z%ˏy(yYC~!滥쫶(lt1'iBsm[Q Q1*U?TeYayjYNQ)}rEK)_onWH{Zu '?}ֿ?WަP#\R:&vᑰif}VT׮&?wpnDIL_)kT3n5!π7bՂ?;=Wg4G gs5m|?JɨΓnEW}WӿE߹Z?|ȯn덅-WJ[|YakY?oW–:9S}ȼl=R6l+ m:. LY@[hwU}3_aA]loVc*Lh=v~7e+kQto߷ne؊lO휹BWNj$w=}O݌Unhbz5oJ:IDŽ_09͓ i5~_ m;LMUG?ĕlӿoB=g'3nj%;^itƚWl\6 * e^Pi*< C*-_eO]PGa{ |@hY7iHDOM1Wx/VRK:9Ұc^lOBbJ+ztdӧ{[ BWxٖuĹ ɥB7Y  ҭBlo`Tn_q=Sډ dKcs!q=ϹzbOFe4FkĜ$Ź_]Ƙ>*, .)},$?TNl6Oܕ5^T<#4>(}?on`}Nmk&(~J]r):I 7_o#`@O' Sd%5_J+N 'E v=fIowIt75pUk'sIDeGh]0Q8_]z񺑨J~o|iJɥ.KRkBWFI~ Qd{{ESRq_V9w4c<)^xV]()UZ u1۲K*{M1q|CSܸ}1bxKyB=ZTIR|4ud4eD]ҡf|,LjfNROAe_0F+1f2n2O!a/3}W^]ȳP"ʕѓqQ<bu_썼.7i,:@^i} ^-<cl$r#f3^m\?1G$ܝM?ː,3lo0"?hR| vȗ^#y2E~0䷯Ñ߀|@~å?f"%gC޲$^Cy·gvtu.FW..Cnr#` 5.UEO1`s9/ ;9 9>Q ENMB?-{nEdg*#;%E֣dvDUJ,>]y32CnBM62Dfͺx:g:#C dC\)`| 3Cƅȸtqx|Id[A*d$!,22߄G2NnP5njA= ]T3輫Bg :#+ 7@r;tn%#83p D_~%ҏ#}CuH??g~1GH][!}xtG:^ ݴ2[.FH{i if m/%EDrCZ> znЎȃV3 7hmOBsM 'RDGH;]:'RAjj uDm}Ԏ^HmyӾ ͕!\tZ+h/v059ܸmqSx| 4'>Cs14[͠Yy?}14Eà&a(47qa]h:?ϫWP/+A7O1ʵ6?hF͇Ƽ4*!\';h\@K}ƍشƣ3%Aceq4MBS*T:vPyw܆z$Cԋ g頞~1 m j PuuxH9)7")LDʭHyeC| PW%Ek) ]R^r_iwn\wɼ%\OcEʛL{HU20W9Ե? ~Bݠ ԵOAݨwc{/Y>x )"dC>kP?O,~uꏳ؇/qv47!C 식c=T ZˠQg wFpgQ h쿥-`~uֱ.P?gk9ݑuZ_ oӡ utgq:{&34>a`0L P,􀺈}ԥlPq}8;^fZޣ1l?Q|z@1߿+?@ :iށ:F@@p/ICY P:yp\E|5x.n|+pی.&1ϡ#`~Au\/O}z@jo7q̮ڮ&\*eP[M6Amξ1۠g/m݇u u{>Wpٕ3ۿ5k]궬!ۣ3kю{^wg17e{Yb6j˜uHm-,m6oX79x}։%Ձ94jw{ϩ9ݝZCs1:vžm|ӹ<={8>j *Lx |>'ױ̈́Gloٯ97hjE@S%,g ԟi׉Ps>űy|veX6kI%C+:;]|3Unl/wN(]; mfDh&mf90=\4Mz'H ؎Tm-rBHԣz# j m3;;@+@ h M6ڒN"h׬v*hwՀvShA{|"^K=9s^ W޿hh܅#v wTFZHk2i"jw h_5F;gr]Xt=JXzL6CNhSVV +"# fZsC[yKB;ՕЮgZ5?FH3\4"Hʹe~EpoCڤ|MODz> i"K]f}ی}.rՒJ3#>u9q53s`_FwHkWЙO#t5/B2e@7!i^J-#[;}ݝ 3B: &pp.Bݜ%}bYof]6_nP9 =tSYϜ.DH6ޝxi -6H>zqQmO9<ԩHg?>Ϲ{#Ќ,sþ~=8ov9yCH{ )sc4{ma'$#9]D $});;A)#/<CMkI?t?I'#i L@R7${$HI") BUH\%N8>u͑_iH >D$Cb$Kpq;6B$ k4,L@7 !~,^Gpv7s4dy=b@(#6&b!M=ļ{31~1>1OFLD3'FوMAѭo"nD{^*:D9CTg_DUo]%'oC`nOmA)q.Wp%C^0'rX7i/lx¿x q9M W-~+G[?˝3L_@~E4 }>hߪ1|<ϢL `<|Z?}>usloy62w2x5i 4 ޳U5<gbxG.5x>1:s]]o΅~:'{j{7{pnZmr-B7v˾p= ZWX ]9\sˎphy\6p0ۢ΀sA8vpnNZ,op' IAp0WI#tcL.mv'|'8Ɇü8 !j)7C{8Ty<<IVn@-vj`OF#O7}A6S>}M;¾E~͇" `7#vN[j5Jy}*uh%?6e l}V=Um +lf*fa ΀MZ EؘÇa6LWMezvAqxb'|Y6\^'9ыe@u `;C6޽;m}]>u5>OMm6 {¦q$lZ@l>#KM5Lg.X>?ڄ.uMpTy}ҰDVsnUPʁ(NR(鍠 劏P.\(gfB9˅PqP.X<(ɠ\^;P.m 4Pc9^<7yA9ӚB9}xC(BYʑݠ< w(;@~2KPF^2Pօҍ}a*+(%((}BiP3 %<1s2y8:q]pu`Iymx=w5;.S|vykʻ\~qMlWkCyAyϢC7]l=a|NMbB9kw_BV~m B@ eϰ煰a'7{z^K:c~V 'a]u9<ծX̆;XJf}`>Vr[%X QEԦ2,`g,[}eNxbkeXqwHT}¢A$k0 0msL(ήbB1PօPTE{HW.C:r7~4m2k9@Rυ w$G{HِAtR9 @KA|pϭxĝ n3=L8Kq2XT  fBLQ1C\ oC̈́(g)z,Mm;@ b+mu>.^=| ' <΅ȃ˾np+F:C8m l=a5s!/0Bf,eBp\ yd|^=<n,ȏm|ȷ΃|Yȧd S] 7y۱Y ٯF}=svlsd|VlY ;!n ܛe,ud)ΐ%,d1!`pPCB! YP3B2߁d~},߿k&d3 zMWz=jyY#dW!s02~ٰLkB))Bf:iY{՛Y5%̾zI=7ο0;3 Օ`xja6fS'l'0+~ 1oa6FY&  \ 0y0,BṅMa*fXaf5a- C`0] 3t#4wLaa#aj 0 ô46S0&?8,Ӆ0y.1+j_7xL[<Լ'2a_aӔfL@ tt~M.ӵauO_.g +aqbz\Tar=i<fOGg^'`鶞&vLWe<=LՅ0 (4?um=0 @] S0ncaځ`ڼL뱽+'0b<<[3`r.L0L 0v]&t\VeDdn{ #ar&Carub'~$ôۤ%a;Lκ~=ryd~va1LɃ0&׮߹b=?b 5YO00ٮs0 uaLe0Y2|mɂ+ & 7040.00Yy&0Yӄ&k->`]Wwdd5Ɋ/ ]Kügqɺ/S1ٌO w~볆ir}ceL`dj2d+6u;e>__'Dzm+ƼX>ox`{*\'dp^dx )ƞ0לq&_Y߮hg<2ϲy6|;e?^ۙrzrKcRFc"˕r쿼?ڰb_ ckG`:٧WELo9f:W3YeeNYi}糸+̞M*׭>s=dQ|d'AV T>78Bv%i yuZ仮'X yxGu =9-!4 y?l/߯!m1߿qv0|w'CxVB􍁘/݅xF cH B;{1dJ;nnC/, EV&B-m8*y0;枕`5yY= 'GaQ =&©s5%,F>ؿ,aYΛa e7X%i gQ + 7V2`2mc upNZ*8OQp^ ?o 6b8_ußp~Z 7]% .U¥^\Kp1lpQpqGpW%*\ B2\e#r9\GN?<pUWsV} Wgpm =UWp p.됖puS \܁3p} nM$zLXnp  sp Vj{;ܶw۱R]KKcWJA3wpʶpwEpOp/6-p_[}t|KO _z:xz &Vhc PxC  1<Ư|;<NjM /u<<;\և[Om?k zz7|c9|^p]pd- n:S-2΂[^F_>n֟}+yf[VXFܴ=7ܒ>uj-3'y_f=bs -fn6e[,`}͚u*bddlܷ_22k7g^zxD,!9A>p d\at: n~6bEeyn !pkmEL(N9*{'ps) >,ccjgSp?pV8. ¾1>Wqf x<*lUO{3 <%x2x.离qs>J{ AKUʘ.z\ WQmnZΰwk<}'O1< G7>೶>|ϳ5_y|w%o_}6e^ {GWg ßfuB@[P4FW[ `f,}/!jA`+F}*W ЙKf@ F`*Ƥ!PY8t!pn>Sq| Ȭ*<JB؄ 'tAw *OFi-{E:/B!J_CHIWw!W6@C5!tmWfi;no{g¿>B!B-C(DhȎe':Q"jq.!nD[g!:3G"ZĴ|Č^}s {+b",qM7vDùoF w!^$tG ^ I$R 1'oFu$u[#HZlGϸe4@\C\ RRB2qR.:C<K^&Fͦ|T1A*Mphj@[ڃHriH+ q>oCg4m1k2,###25CƓ{fCd|EV|dIAvwd0FP ^Yk[x9u; 3<9:"Q 0c1` 8ґk1M;drK{g7"o乺!/=7E|@Cw7|+މAAȟ ( d^?g#Z9TFgC ߉1q!1c`ݱ\0Z``56 c~ 읆q7q&@^N䍜Gțu<r^r r{!b#Sx Km&ѿ>d?C=9א>ݿ RUd]i5 5z Sud\ \]>LMFwOBf^ρ!'H22@8:!f2LA+;d|셌r&2^2nEƩd욌k12 ##y%2!Cݞ!~tCw{)t'@t kB7)1 ]:@?:Mٍ :c26kEHjt~c?k;|] ~^H?鷫#]AQ>pHϑ`:'@ȕH@z=ҝ#Hiϖ"54GڸnH@7Hkvڏ -]Qвiu=h@AmIHkz&Rx!u%TΏS+!THmh*סנy ~ܚ ͽcOh^·Lh^v {KhM9͠Yu 9);MDFA/i㵪CSmԿz@S Sд M7'%|a? Gxt+Єh|[33mvLF4\ok1@SY P߿QP Lτz 7Tzid sez+߭6@q!>C}2c5GP<5C9Pe S@PDAjPi@ݷj;nlus[;)rRo`EyH9)mr)s鍔r!R! RMD=>bD X/|<)g R1R"ao w#^T[n u}3mZdC]όI~ߒqyzO᱃o}#d[4[cnǶ46w)w}'aʼdl,k bR;f]N3Pם:a[nBm-l^w淄i0lSPGmWG΃zq 淴PPa`7P?q&GُBӐc:\|M M1b5h-džAڊ;Ch"8kCS}l1gj<J"oXǟz s~WP٣޲P/cf-pޯ'FPg2PB=‰le1a\g-Xb'zfv"'qLp.t}xQ1[9d,ۭ8ԃYN>b^`:sӞ@]+\v:&ޤArܡ2vLze+j ulvtP2f8Fq,ta_kh~bȴ̏R}W>njf ӆm`j\29.NN,ۙsXqRњG|&y_p ;>sxܕ7Psl:|f$`<`;W==.?{(ޏռ] ޏ+ |w"" 2AYl,s}>kv.? e{dnf=Xn><X޷̃s41n^h\ M&u#9ާG= ͮph;>WEjH5ڃT%H AG: N>2wݑUf@4vrn ! ~`5c@;yK] |o 펟lv=.BSɥ= YC{bGx]h/98oVyҪAߏqٟK3h_.X ̇|uyF)"#6Z)6ߎ}VxhY0hr8A;ȟB]&v67+&C17] !D,iO]iC<__H[ouyHi_DIHwi""܀fӐ޹M2n7ېYn˜9 }S-yn"-U&CI=:@¬qBW#9%{yws莖Bw~t7{ܙ};݇}nG2t_\ߛn<3V.BtЍn ]*(W9]cV]#J6!?qHk6 z)Vq!:^lԢ#Hwl1} 4,y:(k| 7 ev"R|Nq$[<lFUl`~/y784Fc8@H:eKT.!i@#$F5Բ5j;#. ܬ«F;a CXB;YAXnXGI+:Bo!4j!#f臐B#D~~B)>Dpv!Xf 3^mDйj: ۏ~Y FhjsxE+!p!hy"~{VG[p O!`q/FgE@t.E!OC@6Oxqw oy c2ߡo[ q__?l}7Ww ﴥ _m,E 3AqN{ x.w Mo@Gm^Së2OGx Yگ˄ u;<.cxx(!£^?>w{h(ܥr7qR76*ܢf[pP6u)& p65&{\f ːAp \Zg'8_[<05sX8s{8W{p:NK|1$882NK 3F1 ±!KppC18Yߚx|86 X8F; 0t#؟Ey Ga {հ7ֳa*Pm[`7vѰ .u]SOxǣ`{zlW݀ɰ~  [;#΀m66FrMRfu#ĹM#ظFFV6-aST/Pծ*P լ)P,*T -o6T}BgTFPuUg2x 7;Be *y̙jC>PBՐP,W9w ׅj TkPm,jsھU:b EnBu T@TBvT̠QJo`S=65xuOA4J4Y`lZMHشm_lx5w6͖3m82l 6aS5XD N>wzް-^A\׬TOʡzxu սP%.rk5.e<~iA&#볙>b9{>֩zZ:jȡrISv/̧ؖ9WzCZjafCy3o@SG죠@- j$CWfP>^Aya/@yj'*Ayf( 9׍x5-"ϹK2˪P<Ҡ<C{uJ}7(BC fլDzPιPr@([APe :ej(}(J;?(mP:A:Jb(C:A~L{xeP&*R^V^5D#|rʏMUFGjkvʱ*ko CPyk98\Ұf?[cU.G^.c+T82ytPwg\2%ӠⷑJ}^A@,#-ǩ7Ic=-N׋t~U;PU˼|T̀WS((s_ =z{m#@y{)J(e`̃rg(r!T..Am(xxoL~@ixʦˡtORX)W` ksuX7ՙZUXr ޛ`U ,FXnG`9b,Ӧ28ٰSgX֩ ~/XOXaLj _ 5?Z|a`f@q# [XpQ7PGa γhҏq>te8Ó!mihHB*iP-HBGrɶ< ROKH 5.T*# ~=QB1egB<2D!iqy- ΜqD_ k!|qHļB!AbO!zo@([ OݛC44f>́0Dz>\ jM? |n!<\ 8gC8a!L at $ σ8BO%!poL{k@+jB>; }\ uG΀3\6a k@Qo ]dBUY^L :m_fFm ̞fsav wx -`fkl-?`h00;`6y+Ʃ`V^ f;a6TY9`fac 3.0: a̚s_mg~ӗS`zo5L/;4趒 333$3I6Cb$ɲe֕pLqfYuUp>PDH7}tRHg'C:1n@ji A fp?!]!m53!!VpzEHY@ZV t=*A*R8HxH3;Bj薐N>\HW,tKS旐^ }Vҷm!!;!*=4RiCV}d5BV$AVv9nC2@?ᐾ|/7Hv{HoH!ҳk =C~@ BŐNwt\$E[0R=aSp0tҞR;Uڏ>ZC$kBu5)/8{[H~/GTOu !mi{-RF.+Z~_)SҔ&S /ޗg)w++y\|H_Է;;hjHkͥ -K?S)H~u*HA3$/" yɃʤܺPSH U#mJsH.>lUHr(mr$G*Br $Brf#$osϟ 9ɽ'q- sVH&$]䂌#Ο @^!?$ϝM.s$CHD{c1噱<$mFJ=C@6MMnLexHCr79^ҍ9i-x}ve9OMRs9k$BY;o<$ I5sy?}vҎW+cG=3VӋIHI${'9.|uW 2~e6ܜ<}5nm pouB>f77Vx{__xã$G>)3!y{|3m;+c_m~ UbC({mcTxϥf*x)ᕘ f=.D3LńXB$n<v oc{Ux MJJ6cx0*0wp͈ N|[ @k ԟP렎 uPΧmBe uS"WS<1 \{9/9eK(CCxʸPF2PW^e@(y>=YT{d'A9}TA+>!=$ VGpJCUSm> ӌ mE؈I[a";«?Ex&)Dx)S>.WD T##¿m%@O=@77g!O4"j\GD!_oD :ɓ"=fFV; sz&Aӈܰ"acDY:Qʽ}4]iz#:c|AL2!fd\p@ʗ& >Zش]وkE\F-@܁ݗ fw"ėA&GyHpߌH :/G_y fDE{?5֢4~ۻ#[@&H\-GHIHJy$$;@t?p#I$"y[W$YH)Gʁ!HTA3H=iU!b-wDڭHoW񟑾?m[s2Bې 蝧@_t``5aFWEFniq7Ʃ٫Y1F!˭)됵6L/ I`jߑCґXg}r"#gAߎZ+ᇐ{7Yu[\y\2}?"D) |ˢ@7'|KVBJ#cPzl0 Mae0ϲ¼"7!V/Tu x`ħ#!~KoXjZ`i`,s, Rf,U! K٭@aėo >: "Av ` sLax1eZDQsʯ4GBg<փevXssu X8;,פ}kXGʽZ}m|؆+a| aak66᰾ `T` (۶~ܳx6lBaޛmSXoU VXn )V\,3Òj鏿^| [yfN76m%oaۗr?[`C9 &64lrV 6M kӕr 1<=5 l?ڕ܆}3 kAX\zXԂu;V7mWzXO{úvD}$ Vkٰ. |2NU(uh[Ҟ`;EVm+ls¶lzY߰NO`VW#,yi~˽=GwX{Ns2XGҞ7:Kg!lh qW\|w >G:-uy$'Ѱ!m,+XZ#y SԙU` 8 k$ڃ5a2X8(YG7B<B1Ou!滛/Od4QK97.𾼦- fM{|)gua &c><<}D=П̙dz?ށ5 sYڱa>Pr©XY, ά*)sF}۬ '¼oPQ4f-.֎2t+ѝ9dυ~~k08 ;\\??a> M'`~I]۳ff&[a&2q",Y-*,HjZa'1B}ZLX+Nu;X_0u`:f ɱ|24wX&G㘿N"߾y_Zza!D/*W /w_`ֽo=s&ւy0oi d=MbߔbG_ĨXR~6E8ln'aVc{ 7繶9V[V Fm: Dbװ-g9փIMw>l%̱SYw*ئ1,dw26G%nl(Υm> ./N0]myc{wIvL:ޞO.ƚ9w2}mO˛̏G؟.1o]qb^d;v{R߽#wLF#iɋ搎tp yx"#)W,wؙ<Ԥlh=GخrneuCyzl' gG`;G'ϰF^nv_w>Mݴ\D%רz?ȣsȃ4I{i ߍJׯwGޠ=o>kգj=flO9O<{:/ֹu+m@_^ #&|lgi.y vO@{Sk};')m}@n"?NSNާl/X'\Lx;D=жjM̬W{^_؃ܙC];9˵vԏwry@>w)mb͚y$&6nϒ);2Ww{]y\+fop{Ksž|2Ư0n.{;ȷZ)F1f2Nnw j.xr)V2v~.Wl_~!~6<Ø88XY|kd/n$66þ:6=gćSsg#][r:üqہkFf:g{H='rcaʴ)s c >꾋x=BpybFϳvs?M]nsbrK>vxzʞ!ҿx$^w~+qvweLe=O/3nssҧ߇v9Yc4|96;wϳ'pu;@&6aLc߼;Tӌc(ۑ}&C>wX:YE ,Vx|5 63WRl>5Π-2bNJ,}Ŵbbnueޚo+ָEY|0FKioG7HSDړbKM='SӘ'Sk&.G04qwhq}3YW9n23ɔvx˜WBOi4f:>yug?0u*4OFs&{&R׉̙#O0C!1bbbg&c5=q̩97Ȅve̎16G1888,rfR|r-K&3W'ч)U-siB fNb-P>ġsg }soI/:p#kC /s? /<:V04ߙͷgMu\ԡ ֯|7Ga}֗8we|֑sVXrwJmu Ww=I-Vu._z-q=ڥTymZ9c*F=hۺ{Mb:{Qj~4\ *1RdNA5[XŻ6Ub sTmՈr"m]8Wc劔d8|R8K\e^u:z&(KmyYF|%n2?7eoXliՎ5+X۞x˚Q̕ ֑xD[dͨĸo1[ś#{ZMȣ&!_ ;:n;gO݂os׌c܉QzӜ9%kPKڬ!}R8m@sBٶ[;2_t`oMY;>bkN6ǩI=+gEb]}mrDNOUVRb4qJ V9=#}@fq$(`D|ï|/8CE>'pM |^'Cאg9. 3a# y-^{O/(3?!g`}njW=y&~}ߌ)m9jF??&Q*Qa -i=wc_ڼ8÷SWn=̵~ОVϼnܟ##|by/Lc o^'?tM3};RXouzud9U7iS; RYXia}{c.^"ٕ +ΰ޾^Sge|o2yOQ~o} h{4mo'~ț$<{ڨtU!;8wzˏ)'cC[ާQԇI^bʸA_.w`]N^qww9ɹM!ԉJfc7s/mw8߿#Ub+C<$ݠHEqxs铔PIYO%֡J n;y QFIrE?S:Bߟe~9 0=`=@V(!Q⃼(kA}g37}9DKg I`=ލ69N |b7q;3V-efX֥լs򮣼{ }RMj"U2xUcXsn#qc+񽞲o u:nbZ71X=F; S׵rsghUG"uboѥL䷒}#cjq;XB3x8M]F3bZt~,sbg`֮A}s0f8cc8eC>Dz$m_8LS/q_7p!27,cY|5n 1391:L#y|-_[=6\WX(嵘i9isʽ.Gb=ZDbc-C1`=>ru4k /dZ\ȸ]Hͣ?0o,`\H~ b-~$VYPO#Ɩ6ʺgpLzq\yQI(}=6x&cm2m4vWʕl<4gS%L⶘q:6-!n${"11y8B%^GΤ:5c}G-x nf3~rxw~B77Ϧ(6q]m\y3rڨy}yv8c0m`~S?͔u0cm?9J{`-º0;( bD\`J &^$;X0-Lg-!NRT樱<;uj$ƣ(8c,=7dևqb1f"5~Dҏ iٌsisFrq5|\Ӊ̑KG ӕBʰ_ a0ym!^y9x>JLXqJLO`~O{N$^ЯC鳑?%_X&.a yNa^` ׋:1埾gg.X_/&2?`^[^}񲞸[q1v2fL`޻E{r [όϴwh?Dze.z:{i[oEr-=_$D| ໨ UUoF#[p=j[R n޾cߋ|Wvo$gI¦y [(-a,lHka;6o l}/߭q[?SÖf ߖ)3)Oݟf{6<ʑyf<7oN:;4I$mk=w.lY.l&o&jO Om÷rx#ϐfl0c&Y̷B؊wׅmS6 lcDMW7M?6o^3ڠo!oK)ɷ(B68ow3٬O͟Geڑ6fLf|=;5eb R \i;YW25|{~6Xn`99aax KuXCW|82πa.,˺O DƧaQc!hkq#b,ĬLq!pbg[+G`s0vYfX0hsC&/I`{ sB0z9I%'W8'C`)XX,e XQ~W'e', IEXf2,CWR,BY^q/N?0X܀e;feJ#XMqy̆ō5R#g ^xv6r 00 ^0߱{׃cX8 b>ɗ6b0E>ɧ=`>Ki0o|!̷|?0?= {IEc>x< ڤ Xz(`Ft ~taI"ڧ.zY,oiCiϵ|m,RX}$bgG!=|`q!1>G²~X`yx^3~EL3.J(M 0߆x3uGb]J^^Xxw,ڳlXaIK=b5,&eS[ܑxQ|'$O֞Z>"a`' 8Eٛ{UͰf_uA<1sdGY]':-K`7\Fξy,O\f:EU [u|?ɾr%|OL`1>{BWsGJ:\&Ӈ25,XްT3 6ѻa[^Gy z[0uȺ5i\=NYWPeP6i|7|yX\GL+JdЕjw11g.q zLK9 oּ8}j7+ڰY`_@T(`~̃(=41K qQ"B/sla)e:u:݃5RQ-Ǒe!&wxi?u{/g/Xk|:͚{kc{҂5Ǎ~g-]N +c>,rkAڶ.m\-QQ#U7 qBĉ!sko#!nM]_7SFשj8̡GRLc*i2DYo+9:"iV{Fǣ fM#ڳu4AbaVX;u؏w]-927 ƌ!697! 3ٝ{-݂j]o[)ꬭyoE/zNc.ckz i8v#}0?Xw:_?s0>mAd0w!q(| Pxa6 WOGᐺ(CaJ(Qm( e 7 |P~3_ ) ?^@~d܇CK# 놼rEAȝr(b r[(rΔCSȱy!'TS"BȞ>eYn#azp`Z}0i L´kL'tm*LOӧ\ޮ{:4L$)#L Of}cd}EkNɎڝMVE֢ȚYcUY푕YiYRF,wuߏ,ȒAV7dZvjY\;=׸1Ȫ]Y5ȯgdn̷3D;/y.;Ȝd9E3d6 O0ƥ^0cit0vZc'%2VA$~["#u2j#*dڌ`ë0\ Á?0̖0 ^C `P 'kN&:л= 9w.0H_ts`h Cp Ni*7^A? _k݆ }D3ZC͡[Y.>Vw}~@K~xg.~r ǯ~XpFYhWO暄à^s }gxAϻf@}=A]B/m }з }AЗY};Ac~C_v^oM_t;CztkCw(tg6B 86܅nA7g tw`]2C5DNAG~ICg z w. =8 ]ͩU ]({!_"O]uFqHoǝЕ]?OD1۫P ˡ:[׆:C^2N:iC1r&uλ>kZڿs&t9:|s-ЅBxT7/~g[|A5B (Ձkt{"=rz]zeM>]2 t%=uáqsQݺMسԟ-Bv{rQl} ڥ0=K1)+3'ZR녳5Aϝs㡏B@3ĝCAtW3YR̟:ɑx?K[yg btk'Hs폠[A_/nPLAЈgqϏ%oqY&bc-eZIܮ+uzʺatkE-"]--Xǜ[@\-"S鋡CjJ|n*ezk~3@7E,f ]!搟L6m'VC] Х<(7Aҿ=yn̵N|ȟyBdX@7X ݘs }V/''MK9qdlOD5ԁ11s,mn }$s1JV$+ss84Vdv1<+?˻@31D9<'FC{t0f@_Fk_2Ϭ?z }}%sՠWnޗ=BށюZ!_m{̗Vh=qX~#0eɁ^ۨ<{N^GCm0x:0 \Z5kn AFh ?"2‘12ƴBt52VTF&ȸ@Pd|'8cU# _؂@r0ʆF5wN;` ϸQFPQ^ q1O' U`c1cj[ i3 oXϸG؇$#Hdyא"2~DƲq92?ٸ+opޡT |銌c{rԩ6eȞ#s1T ^ KiM0K#}d̲ȬVR"Lg2W"32c 3v2u=9j72g sGdny2d6 kd&Fe>pfd{u%.u!adSjփY}:{ԃo30ςka57RLu0ua?b yCzYn߭e5vZʀjwY 3;2{0WM``m۹X!&!EdtL,F<f `(+2ݒB*k`cG>'v0 c6i]a?"}}tKwI@ڗH$G-H icH?*ϐM@Ha{:ŒHuy.Z:R>mFHS)G!;RrI)B+Ȏ";/Z!y$|ŞHօH6Fk=@r9k I7? 'C Eңl$;%4#b"wFH>#1Ðֈ~o:[~v_#yBfЯ }{%;w8S}E]H} F#a;$ *D$;OR!#^~5uf#]oĝͨ8TjĹ@\C%bE앉 g"Vp:[[_>_ϥƈ>E1Aa44_%bVA1EL1'i蟣}{!_hץnUd[Q;59Q6DXț!"{ rX>"D"e!ioD|[[?q "VC"!"j1"9׭f"i?_!ɅpY0a?nOA:=Ž@ؖ Ml6Ga"u* |CϟB o[|k M-\C2oBA!Bb~ BEH7o 8o[9`^Ap|Az"H#-MAЄzA3jF p8NOT% -;hW5vThs8mЖ[ͽh~khFqFêPzjk#AOP;PKj6VJ4:݅O ?B94$CeםP3怀~(z#O &q{~o^-2y?k 3h|}[=Hg- c3|lӷ|/^Ttd`< @~8GI+=_|.% <8 a7k LBx(ZPYuu >׊./SxҾWXx5Wc|7dox. iU9NϬj<2 <As/j@qzXQP؞@ѿ3pE#UU .ͅ|ח|I!7WD䡃!w/D %{ Q NEwo7{@+^K 3 W %!|-{gB7P\"WFC~;ȟB:u. EkZ{z{h͡h3z:(oeT8A DZP@J4B£&H͸' φ )tR^w(ԃ+χ=ݲ6ɯeM@@K(gx(W8.0(*+(e@Qpn"sHԣ]'<Өc9&u+յn^"t')Fh^6R ;b\ =qϡHkE X3PpQs i1oYs&<ǑF?fO<TOx0y0<' E N=?;ýB ܀^ 淃۰FpKnOpk n (\/(.\gUYp͞p Wd<|cWLx.`8 p] ΅G.pnN=tNir8 ZN=^ԇ'8> x [8gr>uW Gm{;ckg8> p,{ߋjnt8{ p`v́Ö\8oUWp1fô8? 07M rg N8$=CQ8uYpp38n+БZphz8oHIP<`?:?q5o؟ljد9}kF>>t2=um ؗwaYpd! !od.E489=xnp]JN/4͚6KS iJ4;*qEVr,wRLמrAb+uNwݩϥ.KAG~"GR9^-o:?6QO ZP ʡ"{sF';!,,1~q_{w] {=߃BYgM%ph$87qPkp89}G>+|cQv,qP8Ʉ6_?©"89 MaF-p:9N/8ngE!j?ENKpqXp)(˴p&p2 *{W#\3uB2\ހͥpz nZu3" pn,,Vp7}J{Q <:?Z~&*  PBލoUҾytwmV;ߘ>w{Ai?< |{y~=gu \w][m|9wpߓH_KWo2_>b~CoU᷻66߳{{~߳_aKM˳᯼O #׵I ?&࿨>~ */G@c0R8}@aj"! nz" ~ȏC8# `zD)8 wb1(ˮ^סN"2 Pf/rI(AEr/(OAyg?CT5UBj3TJJU4JCTOAud(T׸@e@]P}z P׺uP{uVGԁ'CQTsC=äPOy A}&O+AS.͡iMиC &%4U=ZC3*4Y Ph&tf.hr̈́&D th읡M,u9@}~GPEPuFYmu&ZB%T PQVՔPQ'uV֡P쇒>U֣~G 쿂-IX぀y2KI$"@OF@HM@ʼnĄ"=wB ;{Neh܂&ˠq*DE[C[ =ZP8 DZP}#͆'ԮcW@K z*qq$Y/uiPIloƜxȆfv7hրfG14o#򡭻摤жmo)nkݠx m+; m+CЦ6ɑZM<~O6LWHUʡ7@k,] m hG@K6k 9 v4h  4 -v!$UyL>jίst!,FP[DPs ,A AwW@p3-+#oY|3 !eo#P~BȐVYR!ק#ChsJuBO@d\0W5BCW[waZ" {E ᑷxf^S>.C$mV~ε!b7E#|Z |N-O>EXCDaRޮj6D{#]Ȫ`0"] ň%9<3ED{(o7DC6i]6 "/ǽD4TG1By6}:5G'3}!j:b݌n_ U7)n2)Hh {0vGu?FG)]wC~q'ߺ!QC% S x! C!)StmGs/n!|!9{2/"R#e!yAoH}in& ڊuq2ҽ#}释>ǡ+i݃% ZbR|aX=XƦabsø/Տ ӷ%2Djjf@YT}L2`VGvٓ#lr:" r@α|*F"7 Ƚ3yv{Cް;re["߷*G@s}P4Ct(XgQX [ۡ9 GAᶡ(6 3a0/s{aaGjoX ;qD~ؼ f yKѮB&@x~C,1пݔCtH^b#ȃ8fπbj.A<Y3cQ2c#,UA8w|k}sΔәr9' #5h}2 q"ʒߧJIzKߟMb=a<q8y[iBiKm}IiU9woDݞ Ҷ)wzOl4Ca1bvVGO9݉P} -mQ#Aa(`\ wC~G#obgm|BW>Vn+CG}1ξrw3d ?fߞ$"=Ⱦ7碑o*WG.ډlEdwzZq0}] 0}ӎ0- ӔpFj ` j L\`ajnk*F֏zY#d]+iȺlDxd]쉬u!N{"\dh&&WBְ GV_od}d ]j92y s]#dNL.d!> 67¸1K^X2Fb͘hQF0 ckgMAdܺ#.ӯ!c d@F2ЬDFhE폌ra7`x4MQ+R v6 lݘk`xr00üO030'@^ݗ?rJE* ;?ȯb P ^0إ<34`!r5 1\Cp_!{)K!|Z9i ݈:Vu0C _Пȁl߁~S藋/#QΙס_voΩП mXik Лw Ї z2ۛ'VA6t7Cwzt:Cw 3ctG@wtz@w.C,>O $Aw& "g@w't@2g>5˯6KdFBߔ2} 2.Cp C_?29'&A}MQ{rnGڢR;kϡoI[.3اtυ'R)yn]x_dٸU)y}ɔ=&j܅&M[6mhnw5ٴ9y#@?:.#m/At/#>x]#/|gn'~OG?`h1#FY61WnCbTښXteS8X0AL?JŘ鹋|W eOٟ5/GZ3~e +h+g/ }n]s #]$1>% 71; i%@?1I;[ З⾞<8CXqG %6gɅ} s<MdBAd5G$R.E] 7Elors;Co{x>zmc.Ч>>iq:lǕ}_}r!􉷡G1}({m'D1I;k N}])GoUF=(O'H'BbuL|v-[wr}(#qл7$QNO@Xi8F2~8N~۟va2$#/@"# ZẒ-h!Qofr> )HOh2 }<)c-uG7m]3U~M9 _ӎ;Eb4wn\\KϢKΔbo푳r|ڵF (9GQGr2Pa\U93ً 8c-ǐ"vt{̠rȌLdN|ggD\od "2wuF"d>̏s *oBVjYld YeUr=TA֡o=Mo0: |LÔ g0 (PY`ZȞs2R7d1Lwt'ٿV >_[]|Cp>*Y8>!!^nJL;M`}A^0IaE'_e(Y#e52OLgꝄ"mƍ)ǭ M+ dD, c d@4 ?`8q)Y^ 3XK1l g'b η2t7"Eҷ#}Bҍ=#ioҐvrFZQ=%BZA9%!~;zDːZºHڏ@:WBjfH e"m>RG kfʆ'HY鋔R)H)؋=H )o".HWc/!Y:HvH.@.迪OFGלDY_?.C*H*jH 5I"^w"q-$#1`TCb~+Я/K/-~5ޠG}E)'7MA-}R$Hp?$ HhT7"'onًo)[wG|gyw"q[F#n^ĥA\ĵ߄ľۅ;bBlZ#;y}v@9m'τ>-4Jk,1Y81c!FGLlKĸ-GL=yg"zUG8!:Ɉnu%Q_"jSDe!*pt*#fD^ڈ=9߄HCDEd"+C8ۦ"b"CDD#":DDV(Sg~]='$"`&c#{@xoa/'"ts  aQvam#uc?6Jj#4/B ԭB@huo|r`BV"dr DHh#wcs@8 x|ހSdCPA;igWi}ڳ]y_@u, ͕(h6f_hLӠ vMP9P_u 11P;@]P> բP UTI珁S3ug|"%K9P/',[.: Dx[:B{ӓ@Z¬mFj!d}Nh=5xך;3^C^1%Wlx5 Cv8C_ WBB1gAd5yP=7A·hE+PATPnkS(/CBʵP׃"v)ϡLœ P b\n@1%w,(Vb'Pl.bk.gPőP `(@>OA.Ba_eP2Y1wsq&W-n=mF3/QF /Jxz2߄U(Ḟcu-v\?ʽxU3yOMQJYe1eC8)\=_~3@(;wr!<ϤpóxJ=|nH{S xjg7e %FWA3NP,SB16D܁h(B@C!hF<&*Cmoewo,_ϔ}VO8݃ko WyȯU }@!ܞ<2!?uc wݝ Ӓ!e|+m Zʱ2A>!`rq39?<[yBNAWm!B! )r$ȕ6C@!O{C M&!r긝:ɔ q /!g令 (ZюuǠ22J( i(R!L|fv(,d!+~0EAՙk1 Pms.-pB2NkY(¡(+w纑O'P$Yh<:ש 1Py|6hH!~ \cGw[?_ȟ-rb5^m _wtη {N<> DH~C VB^6<^Ԁǵ.81 cAyx9|x\[x4gkB%5}oݷZ *f5p˜h>níZ8 uiJ#lkrkpS.7e̕2.}Z#\/Ϟp ߁~ gWpn?ε8| Ct|*vTӪpNVNpJ^'>Np*}&MꍁSp*7?I8>y;x]Njxb8nɃp\8{ Lcw81q{8,8 y)1mc  GpY±q8֝:p)#kc`vp+h8|px O8\8 )pK0m>FD!.RLpZppr84i3gi "VV~ 1#nlag>y ;}q F}繰 K;`wb$ݮC[v|[-LݼvjnlYر~vE`g{;s%-]fe-$ #E.l!8̈́^L(0)qnN]m 6=v9W]~hd?s{?di>΀O*-W>W m{.ï`uNw%"oy< ۷ w-JXMz '-/Q??P+ZL@@5 3?Ħ!@=FLCXZ{ dy\Z{gAY9꿡l wlwNiRJuPՆ2 ӡ}P.h&~V zCUTzAS|T^PTJW¡P P-yڋPCuTwC<~3ބZ j#;BTi6ԣPO PoX_senshnh_MNд MUBe hb^AcM?4#A3W ʮY4[A 4@[5mA+ы56?ځq h'|v=hC;mx h}|]m uܦg@sЬ3Ќ tʷ^` 4Bi7@]P7|ڶ/TnP̀Q(?%By5Ӡ< ʵGP2?J}0{ e1( !}P& 2ӳswDlqr(g"~"LrG(Wm(o\A?(_7cdNP~PU񁪖O4-ZG Us_PH&ZlI T WS7P58N>#toߠx][bd(_v#(%>u~`!9h$Es++O$ԍ1r߯,O:w3־(/m!Tepn?(څʽQd3N ʏz߁TPjmy#TGv@u)G&>eA]4]t> _cQ[.Pod:P? $hjgC 4hTII\zA:+jh^?YZJ+= h#A#G2F~A;b 4ΊvErYjh Z` 砽k޼ OR ;7fA{{.ᾗО}Ž]yО{N:hOYKV,FrGzvU #v5.# Ly E'?<YCXkft_d4ꆌ_ȘVz.}c`J[ 5 skܚ"˼Y;kT2L!`Ȯ١]=$ً%~9 '9r&Dȭ~z#y] Owm/#?."A, tP0} ηDa,QXD(<27+0Y,+̻.|#bJKQ7 A|ZI o@|?jTaiqBX:,,eR5ﮰ if@|o-xċ&,2o݁~,^ KA d;R|܂ewXd`qJ `qsŴ\2|/,єJglwQcK 1R W!.Yʵq,\5Ӽ!NAiԱMs)# >; @]&y|1c3[ؗcYt'͖X]~ M[!ъ=)ڎhӼBWbbbS1U :i;kB;X枃ydϽxnDʫ%^uj9W d#I^{.|WgѫO+mFxM\5m yy-k^[1k8C[=ulOU^fS e^9gv^~/*~u i`/5](Pkf;P!YPV_tSCP^%xljo!z&iBsD{_.@~P?` pe_Q:~xPiYBBMBC?_ ̈́JB BB{Z:alzdA sA9$![nfmB !z!p!!&Y"VG}1ZHHQ}7Un!uGHr#$ߪ(+W%o?.!.2[Q]0!gadP)K'ul[-A{BQ2Bыo !j CL4F%QS0w0taYƏJz Rn&eYbޑdoIhJb]zl L<[[!ƽa>| B*:?B6yM_wO,UU x;cgP\Ϛ#W)ILMJ^R٥^B~%kl7)W_)+M >EƔ@n4eA1([H(rj3%E?( Eq>䷷07E.S IȃxD<&!!N`ro |Ncᅫ\1y1&݁5䇒QDq@te}?ߏFoo@m3QF.h E?/V]/}LE9yAʗȻ!EQfkdb>#old]߈9%Eˏ"kbl=wYD6H̵S}Pf4EiI픆LtBJn~@Ho6|,_Il{9(`TsQAxIG*TԌ$UhzSu UN5稶S^E F^ЩTH uW3PNR\)8q(կPuV7P3G&͹Q>61 Ўr4Lw&5mJPo@FIȡjmcPIՏR>TEpŻTRl! Per?eեe,{ʋ>RGpc*8Q{ʽ⇪TzmPMv<խ "j&RBjqkA#j{MvcjkG1yk&bYjj@ݜft0nJƬHOn_fuz̸T;uv>uucݘ&3_Y1isƞcۥ9w3{f=k¬[']t[J,x-ۄ(oERkSFR$_O0#r 'ȿϤp{Bi+s(5dL)QGQ֍n'/P<ȇ*ra %(~TB O5MQ4?iMW7D^|EOwCȯ@xÑOE|Gxf_> P;b6 G(V8/ 7%yD-Ł)h021+(6x.Ő#*0`3%mP˂>7&߯|ϑ~>F̖$7*yE"r? ΊM{Oᇥ+!{M8% sӐ>dlEV#=2 ]+{Jo4 !u7=ېI%W&=b6'pHxN$3[>^YI_N G:GrI:WJQdUu#Мq)~|whe_B#HC‡$fO.Eg#v7.!ێ=JJnDTW&=J# F$TZAIg2''a^Z,[$`? wE (CQgG^*'/H_N[zNGž5IׇD/#bڑlyk$ܛ5m+-#?dI~(z f#/_B’NL ŝߖDoGVHdAi z@jȌDfdؑ5Qgd=-#jI9݉4f'K35 H7Dz>ImOTwHF Ih=cHύ%2ikIɛGzӯ4%yg qp'`"v$g/ĝ$|C[=6>;KI{aN_i$B>M\ADqE]~Kt+G"' 濈4L䘟DvJD: "ےp6!,י%d?aa AP@  ~=.&uAE5~(A} v:D5_¼IHXݑ[Y8=`t/"^&Q1OMHv%vBwF<܉ Gфp"WA+#Cm#hEbۿ 1 8sF60Pە5@XSOo[Q(-mߞ7~? ex N1md>q7bxTkasz o\tk:Gh ͞.^+Z)ų˷ul >q<~ wF2%hZpew$̤;p2S+qbK87Ӧa8up:8>p& z{q}Gq$wsn1'5] rBgTaN`a{۪6f؆-hl zlF?fcSW`x/6X=6j.GTbo0V{S7+`lկXbݺ5V ]5u,ci8 nmu߉ؚM%CD"%JDID oE鄯#ovV.5 l+]Va~mCؿo?H$jmaKDXf!5Uol #h8b 8ֆcnG'{eND_G ώLsHדľ$!Yk7)D Mӝlj/!jvnA*?"$r0"~%rDO1֛݉0&˭O%\h˰3fm!|Xb]"z#1K:q#$|7IZqdΤn!fkI mxLHϜJdIVHC;cr$+4qnG[rF{J"gSi&98@$ǒ/9LI[ –R#kNzodiL_0 leO$%OQگ+g)T֬e?eT4ʣB~&aT L<%ORAnZkտ Pǧޙ:5]q?L0j jQ13Df;fI͆^f!%hA+åhƎE<}4z⛗NEMEFD̷hZ+NB34asQ/@cG4;WSԿh~rͼ@s>}1οe~_ {2иDJv5s7OiJM  -MԎ"&cBg}%x_" ~IYLW/x%Ͽ1 &y}ĥ:⼢ q\x [pؐ\pv8D`,=}]%c[Fpvl=a;h-X'2;fb9 îaga9K_a[b\صݾ={ݗط؀u:73lG`1 8le?>#DrSa+v>a{>pu /qYcdgs۟8ġO8do*Ω'pn68 qq 8 KǾ/¶ilbKՅX^,s` RIaU#16kaamfb6z`:&b2, W2$Leq.eܺg1μ1c]fl4qe)oflcݦ3vC0NfZ1?u;qca\ƭ^-4f#&\|# M%*Cc>q2);1H'PƘca>1"0>ٛJ>-g1ffi^!}")Y`6vݜ}wKqgW&Ne'r-ƭ&x|Wx}g|'|?G Ah3BgtE.t ´;pЙ[1'$avH' pyFn&v߼;- L@CMCи5NH` (ɜ0%B/׊DITCɉyn8dN\񺫉xF|\#W 4!n([&D^߇;3M칋ND虫J#5;K+ 61wS$4%bܒxˇOؙH\n:X\"n]x/kSH@L j[R:]%9 I>$ 0eGHGa'u%H令 =hWl2ѳdD6y!ȗp[EmJRDhKϔt]ec)aN٦;PLe;/}wST8 BBcjR6T>4'U= 4*VMվ7Zޏ:#U~G\@.4yw PFP}0GTNI~%T<To[4$|zUgT۟Pm)[еQA]kiԯ Q}E}~,]Qv'Dr[Q{JjTB3W;[JE&^ŠZU.x*w YVk7&TF Yj O*Tjx~?E,* QiӋBBЛT&]j5:T̠[}G81 T|Kc*u/Rj ||ƯO00< p{WeЩY`|᫟oáQu*~g_1g F9'߿G܁J72rb!L> ۨ s{"'b" DtS~5>vzs -rTzߞY:Fs|>VxwopmS]qsy/P:񍱼cb&ؼd's=)d':Ou,=i]<-`M=@&sxzs_9q9vl:Ш aѰ _iN3:[)k@wtKz>z6Ы.FA2mog/]]ߠm?IE17`f4lOiz8&Zbx #hd!uu2 7Ĩ$hdF54NbtrFfElbk`<_`X} a8;M?0c77gGi2MW&Mt.AM0t\:`31 mg b4ZM\1zہfշhv*͢lN%ͺYZ4v qu;$hвjZ5U3C8` 8Z V6cȑ ; {ݙ'w0Y&#W1Z'FhȌ3z1zt .D/+0<!v:X~r>co:ؖ q V?X7qO\}.m{m6pW߬(|G%1 dL:qAx 7G38Nx[G]&ePM8,v`#9bEd=Ӽ06~ 0[04!}O1EO~|ZkszN*)} ^Gov;szf2] ֛N5t\~.:tZ2.5vtI}v%n@tcؑ.߯mH#9:y";CGf:̫OtBt^BǓthOǁi:JeA[KiyͿG-E0x ] ix.;4BAd5+~ةHN Q0_DGj hD_~|-_;McN~jMHS׀O4v@Z3tdoShZѠkoꯘ@q۰WQe%hEÙ4QGL2mtLy%b|K9vg Оm᭴P{t@^4]H&Oo!Tݐ|(} ~f=h[5Ho -$3-sV4Ezt)IP^t HiϞҖI:_OiCif_{ize4NT}T([/HEHvH=H 'H~WTicX44'_R#߼_.4?g`,sƝ惶48biTMXw0 7[ 4:q㜮f_*6llv",^ϑf {uisŬqY̺Tl|y3=j&ۙ^ƬŖf9 12k8c`ӦE.2=6)fA_MLym骴ۦ^tѢOeۙ7e|eJVZimͻ:olꎉf[B]n$J7~rKU|6_bIÁwB.Nw! I(`/Y!|(KKR>%g%%RFۖOT?im3iE6zmv8DH{J=zHg,IΒnU~4'=˕=&m$?IT;V:x}n;ǵ@שRү I~?C+%ԯEcNL8;tThޗ"=.r8&=1&+2-U0܀a irh@14-"яV~66ћO^n`[[o_hc&b} qK#\}q+I߷~B7i$3Be=aO!|N b;{f$q]H0NbRd$#uқVQDdKܐ؎^^k,V(ֽgPf7%B ,{TFaT]*v}2'GzꍭP?7꛽9ua1lP3A5nL\PԊiT?:>*TIH *:lisǣle3?Sɏ(.)[zX7+ttΓwcyG;3 ܝB-'r֍%5y/oԈݑ~|y_ 7l&%'RZUBiՔ7BYZ%6S|>k9(Q^)>Ţ@JgyPeC(1+%}&R%(6+iDIJ)="|C*Frj*g *m*!ʾT6 2՞3^y~~TF^|:3S-jAAbf^Oݮyrn)t6 3hfD3c5˻1N?45H84VylOdAR1ugwT-7P)sx%P:Abn5\he5bg].PZKB/b~Ț>`_6y+7y+&C׋]M'?'3 'u}2]$sR$֚l2&z%IS"6 [}IhH[dIV>r"g 2Jȭf[Nrd}"q(5"89@\-81Py@,GɛȢLJ@Ycd2~FI J@&_Ja*?Q:;2{/JM9xП{)mY9țY#w{y#dϑ;O. תE6=Ļ.G+._d͑ N,}mlI %ȚUR4E#yOQ'3O?t+SPш\L^搿)7`ȭe{&S8d*vӑٔ ~Y4 e:pM6wSTP*'~E(wAEjSؐbG%W)ER?RVQ\,S(Cy'o_(=P.r[SyJsPهٽ2J+V*XHU_Te ^Cw럡: SQ}կcP[ #^:0 X?04=|hzo5?\` eP5Ψ@6+gMU*ޤrfߨXE5lUs(ۓ.)2rw-2&X؃u x%|$UQ%ηnJ jDx'U3f30#>gcZ5S!Pgzh†֖__䆡`fƱagl@e4J#SP|R-(3\IlK/ۡLZORJP<5b- 2 =!5Df ǭhdۍXRJqqѾk-4C1D(6{ ;N$qݔbm]{(j_P$%}g:!Oy y1g ܑ?Սn: |9 _|1rEMC#6*zPh \\\)pio XfIqA0ŻP]E(6 L=Fd>Z: v[ܯD66(]$/y[Gr[琫%gz yqϨ'4r$wo3)Ba| 8,6ϛYO2 =Hz@#:H_F.'}=]Hu7t>G^2ź."P$zHCқ$!v@"qHlMDDlEGrjS4a 9Yޑ3{9_Or R78Y%[&=kyĶMlDl*q/ s4n4 HT>!!.HqmwRwB2^!E'hGqwk(pEq PKhPx n1:"uNNB!2ѧR-gI3$$t%6$O wI[?%>)e$'ѵIkNҲ$wBX3[Jzb]m)&`בv)Ad5Amr<܈mfPh*Row6l?}L2##HADLR'R]Hr#]2=z,3I[9AHC^͏t?#p?=oN.cHLXNbFCLL$ %f6W}ҕhheDFdl"猸IPK" vy  ى~ )EHYBC)j,ޯDXD%n"$\aaσ) m3$*~1;Q, J.V$sh5vGD"e a7f] au-N2}+BNDX'Bgg" KO","}zzҺ5>n9i= k£E<%Q._2|૫w+>[cT :my/[xa<1.[Bk<8zTv7q]ڄI+p=U(g'?\åx&E"E8ڇht gLl~$.yLg۽8M~o pcl*NXPu% Ob}ZIئE9vvSkf,96'a卍)K~ WImsqlFbVazUic5^ }v;bwr`1+b4۶ ۫g]f(v {IػaW8s-7am9cط'暃8lcZ-qI'Cp ;񸟉Wq4V2  G!e.% 0Ė#|ړx$}I&SR-"6RԑՌ4϶=U)G?9*+!i6lt>I5p֑0p ?ߟ^LĻ;8% c?_9k=~uK^"q|,MF_@ᵭN~ц_mK^NalC{"?MZs&)]L,3hJFwtei'(څ9y[P~/g HUͿQ5 T7iHu0PMGq 56P &O|@}Mcf=Md4ofa8i{@c`4~y͞%+݁>|ѨX۠C%M4"hƣY <hD1ckDڔ v(jRk@mߍԎc>Eϩմ6-}4'Tf˨9F͂fԬOY5;10 mQG S[)j/Sĵ =P8Qu1UROiQϢ\ ) #Ju)Gk(R!yf5[(3|kEGBƑJ)]#Gׯ\TI㗐8$P~ 8JD&1FhB'7o4mcV t/n_q[09MqsW8)NprnSo͕8Vj8di!8>#cS] 6c߳ +?8 ^r{[žo{;f&FC pܳ8N8>S8 ^S_qp[pu q蘀Sq dzpӋ8s@Gw=N&3weE(.nLh*C!8՟ýد!+\fkGcU8YO8 {eX_7#y}DGw}̬b?S͘1aY gqϷ0NƵa"Ɲø͢I6ŵ3`mw)wmو1S&̪DŽ<{L̞¼I0^ 30ND1iU 3,b|1X>?U|:~Ib;3v9٭n}vυNػau&[.- n r hl.cUyXO~ kX8cuؓiXcS뫱 ۬ml cg;tWb7;.Yؼ7f]l̎af6֦OzgUPvae +'Xr,Ƣf_A`3 @\[/~*%H.HSl@Tt)R4qs ZE $;ܑ`FKo,3쵅[Op>$>IeqQkx,P7ރ~y_U%~҇[?"!i> I&mB !yv SFx1"B܍?&"/ e$ Mbu GjHĵ?HL3o8Y}r"Sc@nb.ys[U[E~;۴'k}[SOEt0]'RZ ȿ@Q$Q9C(وv=Ϻ#bF _|{XEOf sC>eSP4bkSgƢOĜ7Ek?E(n(5Ga o]"߸ĸ Z'k|G듑s~2ۑ7oB_)dDJ}gPҽ(Me}~EydžFi eD}Ppv˷SBo:QYڗʗ}%TUPu~U"GUV/PUGuUT\Tނ:u6%ƣ~YBMq_A$.wQ7ۃ#@=pY&vnPmꭅD}?ԛ>t /DM̤Fk(5 {~C WP7Au4[cT&scN1:K;TW:U^gTIv|BUq*geT}>F-xSg3Q?E@}*#8_zПӨ nO5R֌J_T r_*-3}B倃TvPqؘ'hET6l)R۟j*\b?*e#?L({I(AJc (ME\o;EN ^geF)_@Ổ~$R~~/J]W=QFpGmr3*:|EfPJ UQT)'QB"Uo6-rh*=R>Ug)k&9R2oxg.Q~nGbg|Ludͥ~:N g$0%6Z=R8gwkF\uփZMӑI9${L"j'z1!=b -YHpoCۃp='4c xXI`/Kb3 1Uh<y~As]t߃5ˉ" b=o]MPm,!z_[,<H:B^m&a:x DunC"%KFdv"&"~-VBS,%l|*m&~/c-/x-p7G=Z^gҡLIb5fn}ԇ f^fA0z Rs/'Q4zAniP z-i[I;Hm_J?үg#?3̤sѺ։hz1sN,hUhGX"ڋiBh8n#Fg8tĠ v;u%W8eK@3tVzE墷3}轨FH=S<#ܓ/HVsAo_z[WѽݭQuENC':u#t >;x)Sн syuѵZՠ;1zG7]z4=M:4xYhd}9]rb&zE0y{`V60TNQ#Ӣ ZMvvhwq[Gw;iӊ6 i{Lut{Mu4BNݏ.ke`Fw{H2>d'00+O3xC?G24xC1s`uF2k3"#MվO x9F`T3#nvdÒ1tzgИ 5?S3t-wbDFSNѧ#}Q@}Ma`cP_]f NЬ mɈF7øpc&23b7f;Gab҇:$vXI&[G4E.ਛc.ũF+&}kV6]]/W;LJ6%jn3.&V0e&%z).LI- pnejO6x5) ;Evaa 0a a מZA=vދnVu|N]?Qt[KP:ދl">2m7_6~_hxvE[i~qE*Ҿ 폭Cݴ/(WGڼݴReZ%:q"BZmJ)w4ۣW42̦AUW/F#yMyz~nS`[ykkYҗUå'K_Rρݳ҇+c|b<&ls/ktg B)ݯ/*tB5tXt[vtsIҫ åm>ӭ7ҥks7HOߖ()wJHK[JHOR׊ggWH ow IJ/Kå'+CWHOHI>픞fʓm ]ܖ_&X =nO*?#['1L^_#=M,*|"%Oz~Cxrҳͤ{-;vn|l!]n)l&푻H;J$Jkΐ_*Ϳ#͜Wj@^wCDސdIYJ1-II%ˑcKfQYqn ⳷:)S)l~ǩPz+mUj<1R6k~tsM0ss.fG-72Oc6F?tie\bV%7lf~ϬiŦ5LN7-ԥjEieN |j:lWSiNwۍ1mS:0f8I7&L;aApNsSo[ng"l=\nrDd*զ&k5Y]d&eL:0d+liaɎgLo`rn cL>7 2 yFf'7- 6wf;Ѵ YMt7k2LoYv]Z]ndf٤f-6S7l[b ӗ;^nмg;s.JجeySͧwb_w$ɇ/ow{ٻKҿXj-e4X4ᕾd.ܾJRƂRTw4yti {iAҊgvNפ#NJ'm..#]3$݋'=Pz~sv#ҧ+Ǥ/WB!yE[WZ~_ CE7hԦ^t_4|IL i @ δ01 -9lZOkhg>miފig(uоJ5;t\Ջ.]c-z?@ :aw2Jͦbs]ycƞ3IGqo@5z_g "m ?O{BO_%bo,Q}91ą'Cx;k.ڲ3Mf#{ۛMQC&rxS[JOdhJWEHETHvOMYS՝ jF:'J_j@}4GԌLM5{FW0 >ռ"Gx}T®1J;{iMP^4M6u\?"!9()q y]0/uxd7&F#r7zvV}F> E>@=bź$MtoSC%e)V#]ؙ(S&;N.7KӿӈHʎZS@tgJQbߊӋ( (]Arp*6Pҝ%TRXEUKT|UU2tC= Ց=nA"l Q=Q G'TQ}[MP;:~:$ٍP[E>O*\\Fj[=%NԴ/Fcfy'j1?SؓsP:{iKTTͨU f۩zG?Z|m),MU)+8aš!^~Y7 R4ɫ%o;~C^U p&'6ܑf#ϡ+ydJ$9smA9ӳɚKOlK)#j5;!?e\lE/Fv*PC8gz(L_ ,][ t EȓQBM繎 5  1.C1A~V| 'A^9y7#d>RTY+ȍ![YkdNuhe6#{s6deE6tx7/Hd wPD(7(JY;Odb-ؙZJ>PdDO:6eiCH ,ƍ'ґMe7c*eTK 1)(F:ԥ\[eb /Cx!c코WTCQ%E_DmgHMaFRv$ֳ6$ڠer\ Tu8nTg?ceu7P:X*7b5f<Ό/3B]efS`uEbƵ"fm9Im>90cfml-5/3;%R'gi 1әL}]Jmhe]ќKmX*_~Q;ن#:f@.5-_pFu*/T˩@BF)p2*)IYU)ߡ+t3J .$Ql!\2OA)thY=d>Y# %eFn"rW8B;\ŖC(٘L_GB/88 %D.QҽWSEw +C^L"P/hP{wE#0rGGPbgQDJ(tf}GQ%!b|SQxi!(VS!-'Sgm Hr"e/%Wq+K'YrۗL\'?#_nCŽ$T%M&؁uQuYԬ'ZSLzFf[S7#c{<v8i{I"4RkIs =w{6diH|O$Nr $#%]1H-΍Gl<Z9YO %>IWوأ}H NBHkҙed ER}8?"- sND.#2Q-QfߋMTHrUI/D8$|&;a~~ | 8=MPU- lNXRc!gMo ~Ae 5ѾKE5 <\ bz5v$o=!vo$ B֧BJ"8`&hʧ t,p 'd BK5OG( ʶ[);=ކOB];xLnWXIap3 W p> p-#l^}W>/x<_Gxz+n^# tr( nw pdx ܋wp{7 \3?_&yq1ZʤqqrŸ&r%2p4Ʃ+nhS=8Sώ8 Ǚ8ó%_~1iq> 8$Qv mOc,uXџevWblr ۥZNl a1XYuh^X)LN'b",e?TVc]e[eOX,$`A}N^F>p1¬GX'aaXoXUi ,-rX)3= 3lovmlClw[c96aSX_[@l&/vPԋ0.8}? Ù9mU])_s-]MN&y2&9u9ўm\Ld9 H!i74JʵNCJ$# /$-+r OqeKܘĚ1{^3p1D_h@LmBuD߱%fDL17юgK1^N / %яg6Q鏈LzDDj;᳼@D/'"9 "<Qʈ>uO9Hŭ${4 :}H!Q$ ŧ/ u%ZxhD!MG"?"J`KKQI͉VNDa$Kf+4Q/}N1S·$aMa [%C;1/QUGD/#&gsl .$HjגI~,;RjH!˶kxGzA{2F;>L&ۖAȱGκՑ;2{ׇ{H~ z~{ytF[䯗2̦%s' Rq#snl-d{ ūp%Qj5)}KYKʍZQlRT8RNcʷWDOBΠUKߨ;DNu[}Pg#jRO5_4M7j6^hҏqD[25'SŠ L|& O[4A%,BMYKf?jҾQ M4}Fy*47C3? M/M4Y\G_9̢I}ډx4P!.S+<Ѓ&h(N:@L1QG~f*jlP ݎט.ꄺe/ԾCP[uDmԅGmjBP5;%TlOv'*du(}R>eYc)3H3T+)o(ǐw!{ Y^E䟟"4n&9nkB൤]+Bh$sÚI.j-;QشSzY+ g5 495dRe\nnd8sR8 V/ߋ# c_fymx]9؞vh6gaAd&f;6 7`mul+a[kߍ<5ͱhla۟kiv& ;/Ǿi>/ñӱ?D?[a \}do\kuChd'Sq(8sS#"m_tn1Ne&8 NRpà؛G0>pŸ2ƚ{Vax!0vk:+X5`Hcϸx>L0ʄ{L`ɹRcꕍF9H̭eEj)P9`QbieXy ῄه?WllW3"vV+Xl؆wOc BW =5Vwb57x>{a,h ,NeQXvc0ރ8C+b'TXm(=̱r:SBGzT{zkG+X<9`* 5XX;bQ#a3 pDw09s]:Yf}:vx0ꈙ1?1}ӗD}ӻiju٘Vb9 sO}88eX l=6dP/8m<;4=&pmc[wOQRg]OnϹ|@O} 0! k~%%߆&{W=G?I@c,zG`N>o+A~1 ]I?0 QnKLHb-&as7kBqď/$h;,#I/⎟".{=qzMCo ]@\[mb7&v]bXߔ+1~[~8wȉYёcbxf#qn'>|&q v~%/{y2f>#~h#-{_rǝIZ)-Њ$}Lr$gU>jLyAKŌ%e+C{~IKƈZ26"z'Hr)5@n\2)-L N^m<$o7ғӃz}}A~ NSr)츏˜T!k5"/E{L9U هaȞV 6yGvAޥ9vK>|;rȣ#A'ڤ]G^"獵CzLGPnP]jTjjT{:QQ:j:cPC*?QbQPuUrRZP G5Y&ATPgj,H*U6B26Qz6QiRNe*SYr TEP2BO4hVo\Ie.TI *oS&ޥcnQj$eN.:FJ)jKizJ"ʺlt'Q3唳rp'vPvR4J(5T(AыATGyϟPr7-OQnUI({Ϣ#6"TxPO}Y8i6RU ;/D^cT-!T>}OU8T?Q*۝TݦA%PEnTrc:'ףt[3J à ;) ?"[`Fѱ{t{J%ےH;!Uӗԉ$=J&$ %1`# nׄ%?ALCD>lG!. %8>: %Gp*līM6.x £=3}c<zk<֋6K?/p= Cp|3܍v/rY+6튇&<7 qݑ7O| ko6ſE# y)FLol{oo897>czK j خ"Z4 'g%hAG NKHn B* bL̟0#b[?W ;OxA aB-R_"1|v>xJk<+\;]aR\5`bᑿGv~ '= O'kv,ZgL;$h7 ރ9h 4TGô#4,/aKݡ@NHhtfў4QO]i Zpz#fԡ}~~cDG7Bc4Y!D hZn}0t9cso c"jcFbWQ3 OmhcMhFsax~=?B uhzk;#0#4}4mN4̈́iކ >4o1viZu:ah-b\ L31.mMFÃhDE&4sY\ʖad4}f>1<=#34.aF'iپ;ѪZZZקM}hm Юd5 tͣKh \:I tmw+],x+z|E陰^GҫNo3w} ϠAt.C v3$$!0̠׽fķPFx27x%b|;1_0n.1nsE />?o`֘ ´#Lɍq3n5㒽gv3?10ν'׵[ƨkĈ=] G3{R3Tw1C2|9A^ ԛ73eCZ1tUw^ƈ+پϒ;#v`ԟ+X>;qm0¬bὶA_n<:oXwĺ ۰؎8eéc"-nrqαŵQCk6^vuU [>_UZ2o*-k+<~> 49l5]%RA׻nu'>|wk7t[Fp:^NC5Nt8Et:э;:E}Itv[h+-م}K gcAC4.ݏ z5*t2@Qc9tAOz ={h}, []FٟZZI}FkgZP㤛B{ˆwT@PW3 ~]j@bYw$_o/8^h-.M=Qǻ74љw5R o$Z3oO/޶=SV_*ڴxxx ViRLyIx{`zΛ[go8O=yoX?>@uq}nz) ﶻw]Z'\E&f 'v}a{>v\UHjnc7]nf;"cYRvfk7m3413;- ;&iS+a',Ȏוּ훌svBAWD,D^i;YU1;+m~ȷ!5)Ue/Ug5ӯsMKa4aϯU}eAڎXTLa쁙K'bΤ~,p{9Ն ;CG?TF`wx uG㒌8`^HzL);&%HoL.d bs6{'M= ރQ=E k9P~Jێڂ2ߜzU娮@M_&Kuӗ~v8?A2%Ay1ՆQ/z.A4*~{R89Ԛ&Bע6 PIEůNT?F(@e')("t5LCQ?P\3q/(w$f_@CE~;=:"Cr _r@ރ* UmB# ݁(ިOE( ?2[Zj: _8%W9+\ C-ʏE PeiE(iGX2JOd-%PjΜ˨C\ՆkT章jwu~}BTmڑp~@0FnEPڤ6 NS:3 Cm;nԻqg, P[Q j@]i *O~C4<[Fih]AhdMߠ4Ԣ40Ϯ72gԯF]j5QZT١*, *-BAnmoQwbB95Cv)7p[ 9c=ȭE7!hW`<3՜/,&dlGB}{\g) Eh쿢_\](k@a1ypq +QtOſ9ZU(si(Η(}ʽBSYg…sQ"vFiJJ^9P12( lFٵ|wڢ,{+*5P! ?g)(o@FDH[TR(A4SXE (t栨pJ :P-E=%r=oAaWnCQQڋb' pc=^A](>P9(vDѵ(h EOP`bMnndPD-8}B̓Pm!lB~(DQ8ol ~Ȣp p1Lo\vJjp_kD c PxE SPز E|Pq(an4ՠ* E$P(ӁQptP;uQ$ G]G~YnP(s-y烐\QGQiF^K$ [5U.wrό$prk]>98|u$sV(z{ǡ(;(ʾJ nGɤ{k(){}a:ۧD([T`<5è0{w7P1ҨcLDejTAKTp%ƨ5GսTpm5TyC5ӋP71>g4jQI+Q%LB]=?k^"mF]2=*d;Eq~6xg { dݪhc}U\\*&'sJ:j|@ jBɨ E5Zkճxz|PU_kQ퉊3Qq?2to \^ U+"Q5mB\>]^"n{P{s|Q Px𣑋Í-(ƅQhrBCW4Ek!d|іkdfmjzȵu`M6$Gh};<9-ց^šuhuv:&cL(y,OX;3,&CD"fտ`hڤ& 4ꅡI ^M~d^_4w:eBuSTUq9緣%lN f Q%<(ဋ(~(A'GQIJPX7 ٵ(X揂 (\Xts!%GX[‘VN1@6JAIE;FBJ7D(E|?JK&ss?EiSJ]CCjFn硨c5Ԣx"G(:CO(VSG,ڪ([gQŨ v99_QNv0oj8(n3Bq/6ۡ43%J\r%( _P"X(|X%\srq kZ;\_? _!Oվa#Ot4G佔D+a_ RQP ȟ|?9FzdF79ܓc"ȎUVӐU&L5HsUo $r ??]ǪHCbdYH;ʐ})1> ,"x$pxq42oc@rC82~#- b3҆}1aΈ%慸$}2EH 1E sFZ+dX!)Zg>2ې!7M@Z2ґU'ӑm2?^ªdKd!WO[9m(p.g*ߐ{b<8?;׸{EyBnT;r_sxf 7#;>ZsYHuȜ݄U |RCʳHۊ%wl:iiH{|B[ 2GzG/"9p VpN#pW94pMur4dܙk\ȹYϰj$JQ-:Uӑ]vAnjBvy[i2a*~d-FFi#ӸyMr6V`յȒUS怬Uϑa=RH?T{qgJ}njܴg>aZ!#&HBgk_#~}?8 #/MXcHt@BY$Glğ*E#W7Y kA_@t[4b 6"$Q#HmMDنHNQKU'yq"jcD5obw#p1b#6D=D.G+!E$&") ~ق|D"&z:>"2"Dq .BwU? Eo,NDd[!ݴю=rѭmHH<3.BxI!:r,"%؃( Oao +4a.|Aa)Lz`_oXv>!;,&c%]d(bBl =F~$B"J:/W6Iaa1*AF,3ތeSa%,IZ܆%}X%X O’b,ɼ /U9R{~࿞+W F >G'>S?> sIs xo=GgÔ+q cWύfcL ,x<ljg1O6x(C <·Y/ܒc w}Ix܏=pp{dwΨM\,`W6\3&Xܶs.<gK<7Ǘ(.ܕ;ܚ³1<#hg셷x' xg{k9<=iO1;~a/hnʷϭ {f!bI,tF6IBb VoGxqDZF A8RFbc$\HՌB*?kꀔ{HKH^?Hy1IoN"uHwEJe,LE\jD$".ɓw0|bw=Br^Aw$r16 0u Cr#A[> } P .!n=Es.@RӑRF\.sqLQӛ)s[ J>9 gKIךr֢H/)ACK{d\Z;i8|p)% I[G#t&O )x.e` _`z= vHD?/C+w'QyeM\A< k9 Gr%Rr9e҂#]+#cdf4#LdE"(V>qAbVCw-CnoF?&sRmFD}7yFېo(zӽo1G>NDOY<NC 꾣KZqW k8~|5_PPt[=QZ;Pf3΢Bw-*RnU{Q:VBu4-CQ+f5_}"=>>m3AP >ݨ_:Fhq? }7QkFmGݨg o9u_G8'"PAk wڍq?+ 8! ;^!2 h8a4EÛa4@ 7/n-7Ps nEz99]d.&uQ{YjEA(:[jnGTETȠ/TF>]GY@$_LC7Pnp4+\hK!îyހ^&F2nLEz#)# sF:[a?jA+.KYXF&R#>"dX̓o.o\|vg,g|g^U G1^ k3q?,/6/6 ^;+E^et߼5^kg? aXh'|v6|[_S~U×ӟO|/G*]9o ~x׹ln}޲>]ܸM{d~3 r=-Xv!(?X U[g{xS[lǭP7W>­6n3W%ܴ u/KKx0u=Ea%87*.bxۅon؊UwWQr'm ¼_pSx7>OG x nswܤ0~YצpUfXq5zr.{f%8\L;|2sy&.8*s#7i¹P1 8K .Ƣ/pb,~%$~ W~m/wed_WR?2SƲtI"8~a};bm3#¨s) e>I"qbDFFl=bv=G݈n<*!vb9[]WjY[ Ĝ@ψw5[8[?VAlj&b-:dbMÈ̾DqYSHGODB2lD)7@x·7#~~_߉'w>G1ދ\N"͢r u#kc8L;#! "yz7R R !x415h22!mTRoAj~RS!.׏!H{\CJ,NjkŨHakHͳɧ'#y Gf 'kTfüjiH=ᆔ[!o/Ҭ"}d51Y</T9k 2l%vY#Jê9XUP-VlȮx}}dW {dJEΨș99+ u GIt9 "/1y\A^>p2}yy84ty./҃(FitQx8 gWp Dc(HP$E(_"^&lVw.B"Qf9r(2F{QT9(r9L o* ?Cᓯ("(0wqma^tqE(䇢W(:ba3]+g26hP4"pQ>E (2VB(.G{|:ҹu xnۊœ(8Y=šs(*@q ZPe.U%+ob^* P(*AgT2T-2EՂlT8'z=8Օ~85SK8쩇gmiDm7j_B0,u IUPl/抠vj|CmMΜZ3@%Cm17]cPMPawUDM$Ԫq0 A ]A19)kZwDmQB\[8Q5P߅?Nwu7j-5Wĸ~o>PS{5K^FD ՛ ;V<vNFڟʸ&T0>LBUPkCDT-B2TEpRQS%իF#9LjK8dqg@8=~C18}q|J|:*cQu$*{Paᄲ_([y (t% ("#rx ŇPGG|ߎ G9[l<+?G d!2>G2Ip5:8N݅$<5.rLDD̆)*5Ed#2Bإi?V#O b\m%u!Y9ۆk7DH"DȞSGH;_:"8 t+6clEp5'\DHwDH#h1¾bŗ_}+:sqV\ 0iCx0"DQv1Q #G|3Nbͪ@o,<E'"q "9Qۜ59g #1^ *|G?N"^M2qFaH(;i8E!؈X9~x#'&X~&e} es"hDaYX#VݩOWp0%j@3&nvv{5 pχu?y0Fg#Tv]k]( (~P2WEHtȿ҆pCqC?ŷxOɴTʷgP9]4BUd5T0;Ɣ9aL-$n!u;0 ;Vd@U 5n^K1VJ1r4(h_ Q9P?Rˍ_Wy?)7qB<jƭP kYgeCԳn{j|_1fkAhAv+Bc\3qckal!ՆS1vn ƚ4s4uwP%3MP[a 5XhF 1Z'Vc\",}ny?%0=x9>h8Akt0aQOM0o0?*3aPZ &_@̅ѕ0V kLqRɮU00A-VY`Qk wqߔa\ۖ!n=>N`4`w xhB t)`f܀_f`7fw7]o gs``7Y WSav3a\ [͆X匝3v¢}3sj~%d\u``iV'O/ w[[MmClY1'=Dz0oz8^ Ǧ,Ыv,ltRxR#\uzv"ܮ%cd.{o=z=dqo ~9X5&Ua&`ћ`$#0X7סwj&5n^̄~gAwqES׺湘0㎸@\%(.7:~pl֧B{;!-H) C&dv`Llӆ8>!`F?I 9b#> B3e LeM |: !ZOƨ-!P ?0J[g[  !=3{ g·ȯ!Ohe|!o"h|$Ͼ5XC*S D U !q * ;Q hb]HS3DL <GA9$t!); _C)d!L t!QbK!t V!y"4'jB0k!K l ~~I2xY m> "H\ɡ"H }   uߢ ੐zt M2rF̀h XAzL&)Ƽ_Wx׽x1ޅ8Cީx-vn+uI~kd̫Uū/ū++Z^~y"Y[Xƛ2jOLRh%fm1SQUN:N:N:N:N:N:N:N:N:N:N:N:wOVn7mwAIz|yvb[|g\忾V02f}6!6m65mί)P-YcMuXQc[4Զ=omqC҃_K<-o3/nkc_~vc[۲e 3H,&S3Bۺ)*bm(r'ZQfI+z)ңS:žBB;(jb$ER{q_DDCgRc?b g.KFoF.ik9]fnCz4Swqw v:[{DBǕWMQ%W&a$mFq$bnCJO;l=R&FZ-5d;̖#t`_exU.,/שTѡs;67r6[VM͊jɯvZ+`숁*jɮng+㕗ٽIQ{p}?"Kz2$"qDד;@"wH<($K[H ц᤼x'\$}s!٤KO 2f|'CdrON4 Zao2O?F_y4=*H]R|4iH3V&M,#c2s!d`+j G$|$/j2EyKI.R{4L /gOoH=rl3"Bjb[IU_%ϑ$? AZ_ϒA_ZјU$MIsh$UnO$Yd>J_EJȸƖl'%Ҵ0}=(#dѠF[i(M{aGf+^Q} Au1<#Ud2$x?ZH4-ΊlM[Mao d}6]"޷=dSVfvWd0x^=S&'I-4C4/Ú8^#;^?EZi40L3(dB&bijGR?IZ7'U;:2[@v i -MsߑH*(!SHّ_d4{~DSVne?=eٰbv/ԕHL %'~_6Yξ~Þ>' +:fK%:өS2@NgdIb#iGؗvD]~]dW3-6<+]lN(U ~zgw[ȝźڤb. 39 gíj$7?N}d7泡ɠ5l9E6ve9;|ـ\NfgEٕiѿEm-{mľtB!$PJBײl []ɲk\?1 DkI8 Ϯ[`wth9,Ic{v#wڟّ$1T|2دohB|#U$qTag 8HiyO;6v!hEjWHQ*I1# $ZA:Ҥ}u}"'A$wg)8ᑢh+1ݎ"ԖZ^YdI?ZAJId#7m84~pSXJ[iM$Y4ZNѳ38xܥHJ˅ĜR@RY'In6&$G@ v&cϴ7DT؟8|vz.I?2!lV#$d@o}HhK^8IlS$IFt07#q nL9?P{9mE I^$ d2>$%J"s?#)f?g{oSRCI:Ҋ>MJYH},%TU#z=r&JW9Gc*=i\ɥ#|-RO㧱k_wBjzHwpwH"]14yGPt.Dx.6n?фA.pv"E{hlKIY}B敫h!ҹpfȝ#+^Qǭ!zyG.!E  S{4L.m {E䠛An=NbhvRY)ͣ'(2^EI/&OS>%d>HՊ4y6Lדɏ4)2MHF*d_NS~ NTL_5294&KL'];-|I"FMFqĄl>g i.CwF5YtO-%SdBftϧlVJ3M?Y:Őyv.WмsghA(68c2wVTF~jv6\:ȅ$=䦖En.q4s لgCqr+y4['jߤe[_Q0_-{iOKk 8s4\ "2h/YooJ ҏdqY\%c3w";LoirMnGVfY444vNGhZYm2o aIvR%=ӸBJrٚ@~ä#IcHa-R̖!4f= !HjCPMrh=MsO#ƇDn&M$u/4Gq:I5iœR[S\OmޤVt4=1MHo&p>yLH))e%a4OEZ8)J\eRڦJFHۆE5I6L%ѤpTd7_񑡤8e%IM(|"SHz4)j&ERt%ˤBe[Ә3.E2I$UX~؟<:@2?U'$]N$*/yv:bHط$<$O $ %g[/#$ɟ$ CN)iTu/|:]JRE$Rbq7C H.Mx .wq;^M"uώ ٯ$;}\oa?-~&v]-7g .и3vt&$7dG1Cjg=ȎI'f|ήl.{k4;I І%œқǑP v۽j璬UIݭ$XyKbHVW /u:82kٳ_{Ije#5 > kɶvE4uGRh?EO)q۱dHBep%k=Quĕ7%싱 >8b_ƝF$RSFcer׎lغ 9^vTIHkTcԘ$3NȐ$ēp)cI=}veY&yDohqGz+D}y#$x$sřDmH1R&aG\ފְ/sH9} u6tg="YgO/;_@V Nu$5~!WlHSޱAcħ}d/&[v&=:y7n^Ufo.N>OfJT}P6|8;S_97< vZQc/[esXnkSŹm[;<􄝨rgo%)wؑοZr0;-{g*0ݽ9Ȟaw`3Vgِ vzG);t;'V]Uٯc9,zi [`r{XჹDc2¢|lgSf0o,n [fVe,*Ka~ɝ,HʁMYϦ43y̑ >EI1"Ɯ1t2#[lB6.'c {nsbcljx _*eWle362 籔6!K0c1َLKq8  3S [d4c: .cU__*?iS2c i0-LR4٣lÎ\ f9VdjBefeƽδ3BlL*4^L+61$ce&-+cU%YY~p;5{da?oo/#?}$=g:k}{9~9{gFȑX(=L`d7ϋ_^la:c0 M`W 6mZQ~,nl̆-ѥuv]l0d·Ndg^KG؅;{q=kv6vzBvS<1rÊ]|y].%0:7{UTdvXz |9;ʮ:t;vyRQƺI쯞`ZT٥FAAvK(-~w6v'>/ew6ř즎&p{}ob$pr{5=nc~ ؋5٫WUf_ 362fbnk#{ʓ`#Wd3\I w'$[ǒ"kP}/^nyF&boO;ϙ؟k/o9Lw1qjQ "8^<:>I$$''\!(wMXgKƊy[\I)',!!Y8{?;{xr' HK;̦Ic$:X'=XwwF: W pC2C?lR#Ө|vfX%fJVdn5,L4_~9ڻݭ!G2z`ma ל_򽿦0?iZsd>|>ҦhöR^g9VjUz_:t{wIXWճom5aՃCJVmXWw}iac}/U5/9>^߾-=Sޜ}%le-Ew^6ű@}$4??If -_~W˳>U67s(3%+m&cUĎO3dcw09L03I 1L%̊fKNq&BL }&T8ɭc 㘒#$6C2W.LgS*eLz!?)ogLx#"mv\˞-{\ f5L`j[|z7S>D>s_/_:pA[;1|#G9'{?hU^ 7(9M8۸  /5t~f;7Ǚ#)eHk,* \Ȗ<\"FeI. R֎idk볖Y2$Del7y.1~vfuؑvX]XÎ2V(Wa|XIvn';k4{r=y#k&ى>v:G]rSeWCص7N*dWM8\t]qfE.NdȰRv\ف fǫi씶9;d ;uݗGSw(~vN]9]\\.gg3v>+xt]͝?u?A;F)t(dH$خD"AI\e4%?$UcGq$fAbL2*$@2oCIn\[N7| ɛ I16rRٻIFԔzRNc&Z(53vhY1Rj%Տ滚\ImW;/ " ҅SH}r+!*61떐6UBjH))WNމ$#AjH$RQ%1&4T4tit4xCS&XNtwӸ4iTeg,/r#uY^i꧱ϮfL$GӏJ*0&mw4~0n$&D&,t*4!Q'Gɤ3Vww.ҩ,!]&]A{Rei[~ƒVT57xCsq.r9 ?ɪ֊P Wڤ3 i>Jv7k^N,w ˳z2fizd~! 45˧sۍd=qYԝ#.ΟF3\.EY&|nq;fv!f愑C*5j)9\Msh4_3L-B#4]%+Iܝ4*Ь`3xe@މO>"vrX%YdL!L$?'m44NVߐU-*{J3eY^RI n6:4c2oOm ,Ef|3\ȃM4Jם$7dȢP,d>ʓf ۥ%d'!IV8dO־b}'MۮE#[dxR' Ƞ)MLz>5/7 2 ?hF2Iّ4hkQ Sq4l汝fKYc.>%~2-LFf4/7g(IҤ 4:^GڪmҚGFF[t>4n:I#\׽F ~wq %X='1ɤ*9FF3t2M)HkȤql('{Ȩ L%=`}tvФ.4 z҄2%2ȸ@wL hs^|DfrȸMt~!] 4v L'݃hiM6BzsHm9\F|q#i߹Iٯ۷٧ϿItRy4N'cc$9vHn-vE HT>vp! %$74>.fߎWϰ^|llMF%kg= hVvY ۛ~5u/Ye4Vm~r1uc׏WV krdO_y \Ă#Y,UM%nfyCQ8˴0;6?Ed5bYǀkXr5I[ڃ؆gXo̚TYi>+[f`GY[m{ùlGvpw-Ռm_j9ŁRd(+9V/6ble?F f'_0:mkg7f-WUͧl..eH֧tKd~#lj+[5c7+ \Z_gElZ1Eìkd=#XE*7l9`'hf+qVa ~0QNc:l֮e]1HiNqm9_hI@!Jghor_l 'hQ'e{U,dˑ#dDn-Z2Ncr ضfl/lGq1Wqkwَ9ַmjb;V{]ll!̅Ώa>gg('kkه[دEك6Й !t{7f{FLO ؏[Mwd 'GBrD]h>j29/Q4! {.6}?wdBc&MA\"%r7hI|jx}E<{ !AGm:t.ǾfToH\{t4{b-s<#{I|J$hI$ZBiT47z}\;=w >Y$w"<^wq8eG ,"KyFxQ: H2ž4$}f< %ɟIZ,thґ$E!diLu_#K6]Ie4(?j$s%jEhN/u!go'^M@7y"|=ia ۩N)bR7o_N~;S%VƔ?_(6%ۘQZ3J ,NK+?S|Jr\K4#7_Ч$"(U%FSBr*,A-B])>w;)x?ŋP_5S4"2k(-7~GsPP-l* nԙTⱗ (.&PNx$Vņ9e*? z^@vVmOm48Z3 0 h(j^K:Az/v(sj>uϻEͧԩTw)SK^^2* KƦTѸS*0И.ER-')o\*HٯPJ.xGM)[@2֭oѯIA-I7Ѩyٽ:S-bE8SO~v{(3#qu$dsiʻ\UDMHndد쏑'JMg%tٝiWi)~&aҾTD6)|MH{ U&$ -H@7~\̞o+!٠I\ٺܢ2xeet:(ضtwXBkگԳd4mw.*4RqӦRq}ӭTw(S͂(ʙEմϗRBR ߩJ3nҊ|b*C%O-4Jr3 C:)S=F7SIIg6Qr4$?ʥT_Tq=&pr&ʘTye"*_1")5>e?) iE'NL[TdS*ءEoKЊQL Elǐf@Tx -԰S AJAIk+G:G#$ݵPmf&)`yhe_".~iBQk. { I#XFޓ(mGB"~Do o+#%UWrS(D(G޽GYc@i=Jנ·壝Q>AQ\/P4zV%Qg~B|xGqUjL=r>_D*᧨Y(Gc@U(^24>qdFO74B3Ij]hFl`?֜PAh3k}m.hؐ>:ϷbM6n &ؔ3\4bӣ\t ]C9t%_DW$tyWWe_{t9[Iu^݂_isn@{N]zǍ㹣[,'pWn9uD/ =c}7=JY|k 艶DOz6COS_C,LX\X^zچt=6,ޱdwEONzѣI:X^t:{:eݨU#Cw-dOAϗY]|?= UE/ zCTue譝 {yl-7 Ukޞm+{[|6/l?9cWlgun?(Nɹֳk /uvg#e<5۰Vu6ZNuY,B+C g>֨iXgd3P6XQh؄X=zId3{zubu b]NZf-F)ڡ3s$}}QVI;gaax6[Ķrb"wl]ΛXm 6bCX>8Voثh9,?2k$6!kSQq-+o nF;8e5BG/iu 66@cz=m!QSQ\N6Hq@}uUzҽ*/oDG`ş9DEQ{# cZ+cMh=j؁O_cbt7XG] kb]ԥEcunZ Pw՝k$)\ %Qz- mNnFM\,mGadɣG碡cQ~*|Q'J>+v#$œQ\e/*GՁ /D5 v* <IdFz;TrP">.Jr[ch:_QQվoE(Acl+Gn22E/pr.*PM6GѲgZN @]#*l±I8ku}gkh/jEtg$]Qk;q j20]%X=T& Ll#z`)=vM4KCK#7{*F/h =hB$?Ҁ:~>uwy[v ҅NSBT'kF94/@M1{G^b چ[A<6fI^ޥQXlm,e VLCS4OE3 oP44%P2fu+1Agjtu+~g7< mGjΡ1ޜ>Q*xQ)o"F1w4 \Lz-_ru{P[{ŸCh؇h9 -M&p$*SFHֿ~uߺ^чΟVb|fA܏WhiFST+.hLzXz>ƚ >X+v( ),_a!_4@k+dВ='tm]s􇳝UizfoƮ4l4&ޞz+d vErt9<9+Й*u~e?s:<6 bc8`56)&'tp{/{Xw]\ o&bЩ:ѩ}~R?ulаѧW9,Ye+Ǧ1RBW\8AsX=q)On/gK%Cbz_bSO8~F{z0N)F<W[a6/ {,]ָ,2 *'~<[s*6tQEO,ziw,zĸ=l/8a"7r6*~ Z?X=+p\g#fآesa>a0OމF+ A׼rtMmPaNqŠcǡo<޴]UN<-c.8wbP)8o–Jl[[lOaLJΠ>~j#$PVqX#8Sua]?t=\aR7u*Zt3YX4;\2-9 ˻=&?mmKƻVwjGސm! nދy)@v(,⏧yҶ]Syw$gv.>BțoA?q%!@*?0~Cϭoq>Qx; ޝf+މʼmxHKFV**g2ov2Zx [e%V]/8( bxky&f^ ^+y_xk>wU}JUon6kkױ<)wשUqoB6Wyx[ޖsμu]Ox;y;v|w^:o" Ν U/VxF6ޭnS_xwZ]x7tn>wgFK{u=f;yϖyiཛྷ{G|6HikW Wyoཫq!21zFާZw8;[eޯc߁?T]~/ʂ"k\!8t0*GaԽ^Bs =[>B"GCLp$R i|t N8  g[g~C.rVB^䯟‚=P5曡X4V@f*Ae\,J@T"+zXe#)|Pۡ2=*Ʒb6ʃ=PфQ(-4bs:ƺ@.C^.nZ39W: Gac'cS{ag-qк&-y)h"<2UyW]UЭo} 70QXb` &Iqz> O+a6wax'L 1~'lDL&!i1m=yka0)X,Zr>}7bOak+`7v{ayޡp)ppI obsv.Jzp~$ g?X'gpVxEXt΢(κ[2,*݌EHN}pz4˛t.%-Scq}= ί̴ࢢ ܼpypM{l\ÿSr1<0<=e|ׂ57/^w[K ;c] x+D܆>Ux 3 G3}އ}>o>umo$x_iz`o:xR讂k|Nu);G>wFǥ>u?Uo)7|kȁ+op1ǭ>7٭iӸ _SIσ5z%~_ ÿo" ?a3,G.x][XAs"Hdhү K@0"Ad;K:ƒRXK\ ~Kb3|dVjb |>+s|S}X s|3[u_饙ܾW{|睅o3—;aO[[qw?_?YM0_Lf/.8|΄dp _>'3NxW%xτgYxn̂zxvMOcxs;jxY- OYKx %\xgD6<} u><~߅g5<\^n_ c / =x͒GB޵_UnKZӀ[ ­nBf.p)MKLeg&pob8XJ v_.0'x\,ܾc n~xL_ o9]Xmn@xߚI<|—/k78}.Z m;ovFK}% %"Bp,G8l]hƲ>H/BHZ؋0{ra ?¥r~"&OFi G~9+-G8#l""/#Jd"9ဨme6>+:͇JĎkD,6!Qq u&!D p  (4$V#T#qW׽Gb\,U+(}7F\$VDCH2r$ޏ?XmJHF H~0)V]H :H|T^.{ԐTK )RG~ -; iaHCv[-@L ?⮦H;[z7n21y|,Dּ d2K޼ :H! ¦"e|_H+d8$kDjRRgY EɖFH:9k>rH )Hq !CRq~H4|mBj q{<3 iz/s*YHF(ҦD#5{ kI5=yda3I#7 /r9P$ou"v{#IBH_*HG%.C¢H2IK.y"yw$ۀD$@H^s % "!g;8 gxHBB.g[aHsS y~!3"=)6HAtH]V#k' eM8Ab+g}Dº9IğAet!n*M8=q'79;w ؖ==킸Q\߉3QElfT!fG bJ V b G1k5w+J jݶDZss @LoSC\Q+-u4b!n\E8q׎!Be}(cń=Xެ#ӱAby],YWkG5?Q+ Quurf0bVB3DLGt F2Q=-X~BN B /<( MXe BŊ׋!HFr"m I?x\{Y|U(sR&=D A9N[w"X9O{"R1"m"ͷ"Rnn{!ܻ +:OayJ"-VEm5 $d=kyò/l,+2} ٥X6N@3\A@g1w=o%97>W|p4ʾix& |xȝ67NXWpy΃,Z`(,/ 0L 1?<q*+܊ݘ`7* p|?1+v&.. 8~ޅsc,KBXd[¥c\ ruOMC3%0Ep#CJI]ᾏýౠoAqg~]kc|xg>y+/xNp3nҟ܀ŷı}, px1Ο-pObwinppۢY,b,3 +kH'guؘLCXx`F,,|Nv 7c_WKdcZ̄87r ̸4iY[ _ \#*âcwwww3vw!Ұ.K7tݠRvww_s̹rjn'm_Y}nsɭֳ hneK*:s t[:hsܲtU&Oc+EoM1(N?M[r2}H_K[|*}?>KNz<̣OG}lAj;>DKCJzwzJ׸һNjL..MWkLz"z*w4;ӳeY]z>t)=/Π9 z^EϷo#Pz=AO/S_ zыTң2zPvŞezp~H+҃Zt?._REEуRx(A.et)=8ZJèkhx*=FOn:zѓw/i't~(=Iw u=XK/tKfzџ޾M7?ci}ZgF_?af>}}ϐѷ*\5$y]HҷuN5)})jA_{җ,1?aB_6}9uM_vg賎6>vϦe|RtU>Cg)ii&}\G%~Gzo֊>vG APчك}/?]Ncͨ>fbzӨML7=fX5No/@?zW0毤 6?cwҫGU&^{MաQS7+r~mzu^HojGn7> 7zw>m;6:^'L7'rzvJk#X9m.-. ӫ cw7wл8^mMӛ 鵦>ښ^4W(zf =3޴ȧW?cs"zzGk3A z|=xlssaCtwG'{w^|;@nۅt[[Э nSH׽Oӵkt!]ӗKt,򘮶֥+9tf&]NEh~5kU!5Ӥ-|j(RjPI Ԡé&j{z͡WNT_8R}a|wj~F +PQT҇Pis?+q.yQð@zA歩 ZaDjxiPCUT[FХ}3BE1 9vMG5T;*PlMG<*QŬnT{*w}EePٸTłn=RuCm(k ף(ٕzEHLC}:Qӌҝ>RڗM˥/1*RPJ3%kO)SQ%GuJ]J~(k-%@)-(e!,uɔtvN))eHPeJMIP¹/E5ץ⤺=Q̗{t:?"\l@F_$8.Cgљt=<$RCc)u8ORt&0"4 tb ECqK)amJRmeEݢ)Y#}4|G֏TO#(guRKHeMTk?]>.?<@ Z}ҍo'n%w9sj֏r1<,*O8Sgb쨶%]l%ve .['|n3iᘗ%7#vclC>G\\A.C8!Z=(C}H#v8bW#&pxkقC ,8WoߝCKu9t캜<9wv`.kKr6h6+^jz4KKK٣4<4eJrֻ3ɲQǮm3vo2FpvƎYk;ҳY*;ɎY-IMɎNÅlpM-n{jq?ۼ6XM\ WfLvbl'Vsz K_;Oanil֓}R7[Zwdelw+m$MYKB:6nXmgˁi|i?ƹlJl[ݨe'lKپ! a+IefZ~|Vc]lol/ivΰ=[9(]4c vf#Ա:F%ח,9܎!Br!J&׍dcI7>eIfw$IL5I|Hc.I24HRG$Y$Zd}!I"#I&$mgIHe,ٽGqҎtdd4I^"I\*I>)a){#RrE\N:siN"i$[:;!:Z)sX-!v<=4d󖜛)كx9^4 GBq9YJ rHap09.J:bt?LNAG춎; $urLڒCTr0# roAGөd3엕%;N0+uэ\} LzI>j&I|dIُIۿ<ԒBEbR.}EJmxқZ"-6SRvBHjGJhr)?z)H)F^%+Hy qޑ}<{wk="K'y]=K^W\ C'W]#y!ſPR&e RV2 )IeziF'G/Hq")# RXig[R$$譤CI!pbRkRL'?b )F ^b9RZBS(ޅ<~ ~&Ҟ< "|軗6mM299ۨ>^I$U$cHaKIɔd|T$ɯ7^ %+H^:%$/'QIrD uY}X/ '74rdGˊ lzF6'JNf-[n+5d%=klEj俎t2[MXKSדdL:5G&J:CgV"O%d%9~AQrA6]C>5%ɕdlI6@8ُr#$;I#diN}7$WOݦ >Bf~~7SRFW]'CGr:lx;YLHL%7Is gڟ65]<鐺u:487::,'^E:Rt:;L4$tǝ_Hk?i_CrBӎ2w,#5't|:7NA%}k&t7}oEGVޢCBRNVG>cnhoM;&9ڢ;L6<#˔d:/' 2 IߤxO'|ry"#TdjL˜;D6˄?5ɺcKdWkߴ# od=Ykm ]ρd-.I;٦]?uM%d~YN VUdMadDֱb~d,[EfL2s.J=:6ȸ*2y[E 4&QOs:$wɴ5dt,'dtHFWD5NMQzt|Fh[4[<( +<2 2י̮'^dHZj#HSu*!^w#h oÓGdAvګM.Z:r9?&$QX<':N܍%= 2 YJn{I[Lk+EBkv7;RטKwv2y Y&8]8~-IA`y\{$K-)+IHҪ Iv.do%[I.L'ϛE6XD.FUY&bz\;b%xM:œdΑ!Y${Y}m:&޻FҲ#\/. r\KrmJ]ڒKM Lȵd%[L?Ļ"mI}>9[BN)_1~@N|Cr>\ DNVE-+#ڞ\CI \. j$26#[}? "&rXIuQΑ=Cn 2rY;mv.FrG.ޒ[}۽&yCr#}ә'K=.rNy le^" Zʤ8SM^%u!HR8mR~H^;ns R|xIAGHy`(yl$ᡤTf7]& zȫ) OR"e)LOI/L`!dR#ρ9=XJvǾI7KA:N2 }JvK֑/G޹i} Raci㛴-ˢyi43h=MxKSyY:ڛ6+ Q4,:MD4il{[M[R2/~§xsߤ- vӪxOěgb1mC-;O>[7<o qK<gp۵ ¥=P2]5DVy5 `!ãsg"<A_ MfR^'pXeX/8So`[&iu7ΚSfK`kC#`Ἧ63aGU[Ϋ5BZ0N2^WS=D!G]x*'#6<{eAoסs Kp?^8H <u p [pYҚ6p7O3؏ȀW@e z{8 ]o5N@j ǀHvMn lf<ĺ?n6p=57>x,{Q; 4&ܶ!`."d17A4~{zH8}" g#YRU*FوvgAts.G_+~CTi1gǙ z숨qIs#z[ u7q>sQSXEl-? (؃xmonT t$>$E!-52!]"RZ/6j=Fjf݁4]H_2嗐2BVY 铑rvB'r!7 rք#rL(4z< W6 ?<>!_'yƠ?j^F W1(X~yI(}P nFq׭(\QTuQdEf(Q oh15D(0E=/0v/pYGh.ۃ=]P9{paP}5q s7 ;"?zc #W&&uBȷC؂6JOj9'#?^"`*Dx=F]^K(x/ dx%J[GXm;ʶCJvGIgG6C#(Q&@?Jg/Bɫ *ը@a(uF:/.I( ݇(2(; a  :TBLTlU\ U#ߡjZ$Xu3BͳfFlEVԅAIWGȥsu3pEm娭>3P&.مKplwƧ=M;h5hPozh4-4-44@}n\qi6Գ P~q-.iEY?GŸ"ڣnV\*?`¥aq /EW=\f#Q7M{z=q@. +P.juN>yBߑu鸸(jSNɞ3u+QsjPV.PDgNPX ݜQףu?1[ cvⲖo&R.:-G"4^l4l=VhxjѼh3z}Cnh0EF44ofR\ެ@խhMOܡߡa.6y3׋hG ьp4ـYhw?/xq:4)8 OBh4sF19nѤ%GS[4FS"4e`42nCsL4MTƚd4_Cx4 hѴ Xoho&z4ZwGog4}AS!h%t(xh 郦{sC)<)M|Y⻴|t"LXqh:ͺpyM\nBڎhtZFh7ј9;7 u]АV^4C}'?CqhܴTFhkB͏/[稟|=硡* 7qE4t#rc١ l;)w4U`VPu4> hP-DOb ŅhB4o'8FoѸ;;qR4lqPX^qw=FK4M@;G0?B94>G+4~8*OBShr+FcoqR4E4D*]4mf\4&|FGg"и ϣ11K4/O1 M5D ј]Wi9hva]$8M\BԖ5?Dىu&⮐በ_閌gи*D$b\2KpIqqQ6.eB}OԠ \lkK]u5.o8\5 Q-sԯE-zzgzev@\0?C]{݄]:roG,XZ(-XԣԾnڳQբVJlQ! Ԝzn#Pl!Co;7'Ps'E 5'Q6U?jVV#ޕ Dr"~oFAdToEUjzT۠zwTG*z!*?=G]($AU5:ՖoPe>_oG\E:S'cvkP)Uwf8Uc=!(TPͨjר2t]Q9RCز U#Z+ƨ:QތLT5BeTT4[^TUIP#C7DgCy.wP|x ʺEW([ cdJWFIQ$Qs adZdy>Y1Fn4&BB~S! Boyo|M7 2>>o oXn{!G "/@{ #jK qG~C^HI휊K(h<'IPCdA^S ~f BE ]!Wx!Y[-3DyyOGׄLQwDn=T" ل؎LY៩2M~#L#2? ?mZkdjlAf[-d+jXd%]2n 3TyPGIPm!S$UF}/2Ef5!92@O2*C+ot߇HO_ sHiv"h]]tcNEr"AH^ )'7Ig,)Gn,"u;$vGJP1f2ZYT2ˑ&t DͭH=BӇri iU$EjwDA굥Hi. 5+%G~ -V Yg Mw_! ;@rY5 <EˑvAdU{fE!}d z kԧyH>IS2@|CďO@ Hxe9ZHBH$zHB|@uH])_" R:FA RVE"1i:T"UHz6DvJxx wOY#9Fi}#YIAH1DR$;#}%Rcb3){!EOaHyٌTqHGj$F/$|#?#RS 9 ,/i+H^TH݀THy=i wCH]HW|DjoY#ZĽ~M^4=Md^-@F:dz.Azw)'s2ʫ> n")#%ҫ"x21;2 ut9j  Ej$dy[순oL-!/ڋw-nu- >F R8k=JAO^GIOABsQ`Pq~uIktr(wr/݌R(1jgQe#$(=oPl9NG^ P5yN<?RQhu(<]>(E{xo'#R[fFcG(\mȫؖ9WBěHMyUf$T d؛ cGY"ƍ yn?^FLSBTf?Gb2:Dbw8Q{W#fnIF9Blq?>f+"qzv45"rm2"o!j)NEy~a]q:gf#7 ̨a#t~~BX?/+t"["(3 !n!|AVC@x9ֶBϧ߳+ Z:?໹~_7~)(}?wI>q=|#C|gd'8W7h| ~cױr(́O?)|^j÷e+ I,|+ c oIW< e]7i?n|[xy,|')|-ᛘu6S7=#>Zo/~eߝ}s5}^b3Q=9|^Nπn_їf 0UII^v#žAL%r= ޭ^t_oa8aIŚZ |;sg50'v`xߊGiրw|Mx텲E'(KBs.|Nht1|ϑsrQ{@ x.P ;*:́RЀgoPW1ZPdogR<_g£p56iTxܫ7B!꽧cO <] /{6«(Wx\oV NJFWiť[ ̞P8 $wAk6Cy :uxGMcPp}a7Ba# ~ipq7qN\g  >pwm̄˛p*섬kd}C n^!7 f -!nŗf9ΐGAn @fyk cV^l,Ȳe}!O ig8_ cT p1'٥ҕmT~.ap]ip =H pteiA:\) iL(\^z/d&p?!wp1H>}٘ǐ iT8Npy 7%t 9pq|Q; [ahv 8G[<y~J0f:$ݺC7al6c4,,`Tvaf\ 3 >0y]*.LlX:aQ -p*,ɰ9}&0=61Y+!- I`x, ` a,0$IY/IZaG{+=>8vck,5^gw82ǧ-?p!4pVW$t'a3!4*/mAwM:kd!{2F`+Cv0 #$~!=7&IG5PYt ϢfO\;{ir|mKE%-u-KmzvV}QTj֒:[F݊P{i]eE'mU-=7Jʢш'i4y }|ʠ_цSh{5[ÛjnMΗqw:9.KRrI@ H&}OcZBVXII$ۚM!ΚK$[dFO%פ_$ Mj䔺\ SQ&}YJoHf6&$wdoIx)#y;SI!ɮ!W}wg#A{B_H6떐5{;^ t/ H2dk?Nn̮S=4j/I?tggrI#Ի$0dIu*=|$׌$sD2zBY$M?Hyd>I\ES>#sW-'7IۗdkސK %cpq9"rHZAeOȡK:ٷG|>9FCG5ه$O\C$Oޓ}>$Q_IK${E}H5>N dy1I|d:m"I$nd?Aۓ/'&)9DWH:*9LR|n!5s "zoTrH/sy%9&|*9%i0rzvȩ]9ڬ Pr> #tDg_9hcr4tϑs:IE9|ur\Mq rhDV'v9

dב$doJԚCcH~#ɝn 1Er{-rN/x[$d{',?W٘KdE?Zmz/ 21mSF uҵ~@/aՏ Hrdx/TL3Yƈ؋KZyIӼG&H^=@ƽ;j9O &;v 2;M:~cp>NVZs .rxl~DN#c:|drNj0\Cr23#g9 "t#rDROQgg YNz 3rYy$2N^FMdAf+tt>O"˦dy&ΕЩ@ ̦S]5p). C_2]mI'-'#UdВҾhݫCi!ZvJ'ք]t8;N?e%nqH?:'J&^@9tr#K&xtj;:EFot}8o@ړh)d:=i!V]Od/|S(_~Iv֔{$tpORϊ=~#iӴ_OIuw6ן - "'K=,e2x4Im6iT=m>"⧤?g!ݱH{d4iKfѾڥonmvK6# hv:rG!%HM.ѧ]s37֪.7#5ƃ@/N&3{QF'|1mP%Gj#ImYHeڣ> H+:tb;d!sd{/:G.БہdiCv>$Ȭ"dܑlN%+2kIV9IFjr8"~{k,7U,^:9ld-ƻlޑuY?-#Շ]6Y N% t채,23,rYYLdS+NU2! Ed^?̿WńX^̵ọ̑6y=d 2kAdr[O%:?N7!ѷY.O&{Qt~:1P2 TAxO;dG'w$]It2ix{һt˾ӱޤ_L[Ȱj7'$7%\ΛɈ $= y4$~9n9/lђoH~'9|H7O^ygX)FN'RLFvQV`mQh=<=cyL՝ŋͧ5|p2ARf}˟z<:k;ząs6j>OF稻"J4<|JPm3I<q&r' 2 KCa8|-|;:Bg#cج_صLi0lRMQؾ%v~kbܓc3qd @=]S=b p2glxL]p\ n)֊2-I sp9t4b7u&\Yµ!\t}=,_~%CaWUN Jh8 gɰ\?`t'VXwY0;;;j-`fL` 7ؙMü08'NIY큝;LaS&B?W!nCzG3 ɻ>[Në+> x##q"'z"s,E܍GuG)? <AnAO#sB vB"|)D.G4/@5/@Dm7pk񞂨՗3Qg'bME47q9q9 6ֈ?Of ^_}<bY#}|'Yؿ boG\px O0R 2Iul ɗC%ifY!k.2w@Fh} #cQ42t+WK!=b+^#}k ҟGFd.CMAv£PN*ETP^TBQT{C5, W!3ݐ)=א "s]=2g"sd:ÐMy 2|2 dXzpEPmC\d!h?dC2,CFtdz ;kdAlQdCFg~D.{ot:a>!7"uCK[ }d ; n0@V dօ|) ;.c됽<.c|@BrAN13.rֶCHk츅m;y[װyi9m_pWlB3Q x+W(AAy ;0F=Qҭ%9(yTg,vBa(]P%%֣t:As ?2FK}@ŃmQu59犚P3`?k_Դ4E> B[TmFST6_@ T Q6GT+B9ToD6<#AŇ(ThD٫c(_ySP{8e[,-esQ{e,M,P~/<`ZբeP?@9(HFyS~i}Q6J]P:%(1BScyu(p%;PP J7(MrXu(B~T_[Pq.َڥ75Cfj ՟5Q+CM;1@dQ:EFue'Qwu纣u$Ӭ@݆3n:Ϩ;u 6)w5o@ԄWŠfKơv^Cm敢NB'jK6 ufN8N k@]}ucP?u/:Ǡr!VE|4EEUNEDނZ+CԖ>ępG]ۨ1uU=Q ZZnW\haBa#Qwo%. ゚.̌~0L( 6\&uoNW<~"V(P7GV3jyjgmEmǨy5ojE}  "b_5&P##X;{PT5ơ@j#Pယ<[B'qG 5j<5ڠfejv&Fj,QcV!55{Psh-j,S3jLK9+gR&)5)b@T4GMJq;j権ķD_&jt~aig\ " 71jQs5O_Qc/x#t!A#}Et /I#b7j̣ Fo`ZD+|Ќ7ʅv/D*TFVT5ʡU.0[ZR[Si/p5$.bi)|y5/^c^5LiWP%7@ՈHTڏAc srp*癠WT\A٨= kPQwQŇPJ[?TEMԙP~"uQD(O]}P eKQ=zDzRLu/Qڻ%Pz#J.CɃ(ix!JSQ"G-JD~%v'Qgbwm.PY(޽'iC{8>bsFqy8|2ݦ8 P|_̯@/ םA(~ܷ(]QJ_C(4fNKQxgQ\tYe(g.^AqzWEq1(d ;M!u,řQϓ}BA3ŷK#?Fb5톒Q9J:?AIh~ {I@ɼ(Y%B :(;%s(:E* G0C>(p2#FA8ȟ'r5~&rC,r|9S999scN܎59X}EPE!nrKsN)h OېeY;N"ks#۰Yf"k d,39*Kէ2d)շYO#|d PC֠X / E?Ή>Ps}jF*@`_UPVB3T7 ar P ՓP4ӱPej2!Yd ,xHg% c dtrA5"TsA{23>A: *xuTy*KƋ=ƫZ ~jsvD PzUB5LiLGdXvZ[dNw#2C@wdT4#cc׏XҚ^"xBʙDd8KQM`}iHI?o6Rn!^Hѻ+EHyo"UH6 ?sL"ZAHԌHݬS~&R#KEW]W`xdDR^_.ҿ^EFW[v=C[i#-nM}i=6#MiَH@i-k.H?T&p!җҗT#}P=nы\G)ݑijO|.H5US@k#RAjEHmKrR.FJZ){$R6z#g2F}F?H6dHGrK7""tHG]5$_H%b}URn!ew]RE/f9)f!e>.HY)HY(ڤp$HVK/x")Sɽ ynnD s$=+@t$&uFbP$6"u)Gf$o34Mk qX$X$y!&#qgC|;7xh^#Ήs3zout$>?B2c$#Qu 7dHX2MȳI!I^HH!CĆ"o{%b]>IMMgG<IH^H΋ArE;"9%RV) 7HCG!oW$ }Z fZDAcA*kxqHC|)noBBrW$")$ zv1CfOĖ i!Ob# buED"F>񵖈oV F b#qNoG_į8E 683',At%bm q]".qS6qTňsS!. qlT!nn+qZW#F+V[w qf=o Gܙ}IFt"LLDL]߄ߎ"YS#j9񳄭d#~"ozJ >y [.zGvHhg7Ю#k {#߄-BWcaG3%A`$c$،GB\{$ԿCD$EB1$2CbcH5mg TH-bOe \X3իl/x+CҬH 1H4Iz i%IS|r Nm@Pνkvb>".jWdCލ~YI շQUQ]Q(?PhE}+Pl(b%OQeQVteWZg-ܬ Cޠ|WovcCRۏcP~T쉻_(xr=*DŶ{pvŨai(?,؍a(3b*J Fa 5EA%X#W^B"ok\h-\?ґ=o9G"B793! I`uǑcB 9.FXEwc9wȚBo udhzH +ēmx^iCO X% i)z;8;g@ "qpĄE.Ķ?3; BOQepS8/J"?BHB'C&G#B!O!B-Bȉ:A3$FSBxa K(r,bog,n{aW ^VI;6ޫ.^B6 .N^LPR,{5xVBJ((׋b4CʧZP}:& BoxyՁ2 ?Z کRxm-2x-Z7M\3n_ eP( "P<"!!='̡ԶPHWoa2x-#/^t^h+.d!R)ow#[x/qOۡ97>m#=3|g΀rxɇ nhx>P?r%(.RĶr(GxC9r'C eT[(|R!:^=Ay%o/El'P턲. h(\((|-'h0r~=1 8Ux,-<>apúz -5.[Q;pO:pSNww ȫ*!6nn wp)[T_ߟ}9܊G³?q'm;x\; Os/ gA^nv{.Ap_6 S}2GY x PxVSCcxY13Mxo</&] yi _26>|\7sAeA!rߐYgfȶ˿p-kM-duYXKb t{(u[\9@)p} A67>-_B R4H[&pvm\'HE=p~3γùT889HWl"Ο9bZ8RHB"8;Y8vb(\Bun:8HG}te9epEpYvΣziްO$i&Zl֢Xu#0a1fq0;ĩ0{09f-bv8 Lؽ_4/ xOy+?3XdmXuFOLө 惼`5'F LXtM)L;8Hs?O];9K~f?hc53`й-nű;qT}#rQPṅ8zXۥ;qǺ(xLWdؔz ( !e {0\[MK5ۻ+>N P֌gqN@yK$ċUgQ\}y]-xn77n<ڮkvjԦZ 6jOSKu8O}W4ވFRѐgT꯺Cn#hq Z#ҬScizWZUBk i]ڭ{=!>ɴ7m0xKǻҞh7S&ݣ'rȩ&zn%9IkI~̵upr\NXI3ȩ"ΐ䳊Id+3$'i$dOq<Ɠby?KoHϟ< ;џǒWr+-ގS/=;ڲ얳ݮfcX}evnm?v[ӛ-4YWE6=eE]ĊYyʊy7cx:{aX<=ˁ$~cY=F%_n:X˗a7?Yɀ>qFeWvp?〓908έVW9Փ'pD^~Oȑg%|[7>g|n>k:^sO|nF> GO[ ?8/Gѩ38zkX;%,1G9x6csLc҉[q̲قc =8lǙ؅8Vׅ3rt \lϱۣ86(csi{ǘc7r`-0=8/|ḹ9v6plu Ǎ-x^w}/9V%hq 8'-'{}=Ux8a[qlqlDžp\^7Fp8WϱS8nVO3q9ǽq89^֙s;8wO {sK>'})ܞ4I9' ]8wSunpe&Ler(S͜t ǖU8i )| W*}ʦ!wOs9;GyŹn֝-`e6[gq8Y9G.1cK8'eNvg p-|:##{+qXd䄄؂qq=>=GRrrLV5᜻9n<'Yqb$La68Skk8 8ˑV9]!9H!sȈru,簣B}8;s@y=F߲xyCVpHcʗo{I`_`v}[u˝4X9^^'#Q.):쮺>;3[sK|YbRXv}?Oa''iनt1ϔ p9#8,9Hоدr.pF?>mRgqXa̾8DC`1b ^bɡ8tE/~ǡQ39ɑ/|旨&uy9n5gV )8/-#"39ُ5rĆ'a78|98|oÚ_s]8N1MKar-+=G<m8蟊p-=YOq}Tr1.E2'rp]9@:}E 3rF'}Wfcou\fN?wZ%Usw+̬[9M0)f{Rj=֟a][}a+l=Z8~j>z#n⨹!؃Sztߟ8Ap ܋}teO=_ڙ-?X<Ǧ2:{Ÿ35})m*lW_58$GLQ9a]Ƒ93msDm;#-ޑs5M!8}I+oapWư'ފC/(}Ӣ*.q`A EwfMءkw;;c1=6r9g;9ɗ7:Ρ>qؚQ-p9du=GJ ]`0+! 9e87刁9z6yϏLȭśL^)GVRgv| G,8>|5GỚ9^>r_^ũ9qNŕbCC2sa9􁨻Gĺ88&9rF`E196.O >q;#GOYa(K`ݳw8:A=GkpԆm|rGXytc2|>U1sK8ڿ|uՌ:*qv9$9ay9 ϦmcsϦn稌|Kʁ%9*u{fGO_1^|~SG9 #ĩ{˓Cs<.ޯ#|"6犪9r/x }sc/l Ǚ DVp| N>8a±/qq.ǿTrB{aλ8SgOn+> \ 8ΡO!yT#[/䳭7rhx<}ȑ r-m'n '}.'pFN8?h7ǍN1Pg\w㾼儸wS9ar']ljNsE'6_>*$NZp򼗜:_縞s8 [Þ";ܥ%{L1 KbˢO 0WZd9Z|[/Z;OOcN.|x`>q@i4; cOl2n Fqe(ZŸnk3 yj'Ђ#> ydnX܃z̽;ysy4n][NC}gǿY+~M\uCz10~8ҕgbJ'|ҌV)颔K(:,EC)LB^|OU%yY" 2rݷJ ;rc_!?I2t Q;@AZ(;b^QWJReR}*%.v>?(%Aʲf'ۻ(Mw]u}-),ŏMy8}-vQbI Ei/)K+%SWOJKu%:tm?|ܒo(Ey)9o/s)aJҷkQN2RJiR҉RF7RZQ^D>Tt̛@ fPC*s 8. .tNwEJ+v]Xut+v ?v ۢ"Q] 5NJ*\ANzs =nctEu$=]TMLC z)G/k.a1d|[ z)o)sJ?j~5=ϹSJImo|'n-uܶ͟FZnpY$qǽ3]rCɳ;O䎛ӕMܩa w5,ŝGqůTq=;s[g{soƽepoj!>hSL>xIy<^1wdPV7Cfu Z|ɀ'IduS\m͓xRq Oɓۈ?*+OSi>y[~O/M)a<54gX3LxU_sfGj< gzsjZl|j=I| /`HOsX(gtm]ϟyoK[} y|ޤ]si= qyODxϕvwo{\u^;}KC[:myXXɻYʻ5hSwŻyoJE$mA)zw>j^ɇ6i8a E;V6`gYzf4dU0kN15gF2qok1d X ca3kʚ֬=5ZJP"Xr׎ƌ yPϓX'kZfykYS&ej=;f5>ձdk̇y"s0̚#Y#ބ5`+/X55+c }Gn\c͟|ߜaͯXn2ZXkwa&6|r<]:k|q=a)|4yNº򑗯I~Ϻ5zG⣻;`!y.k|ei~տbY="cMެf6k|"4нB绬'>]dVKY]Y%:5u`MD>"@5}`M٬uE2~~>k'Yk\PߏY{ >7u3 :YɚN*֜*q)kijXpV>}YmnV{\'`)|>8| :<3 |>ՆKެG>)͏ƬueX-B>I>p*pCՆcY-T+Djdzw~>kZ߬n{K kt]#YMÅ*u"xu0 { Cy_ geʅ_~aXS kLga?"fKᯏE<ÛY#mkmf%G߿ L*ccx82‡nzO{|pK=9tf53Vz,Xm5*F|ć>;־W|xY=yϞ|Yk֞ˇ+}].W|4h;:;DZ_KYo;m\ ~d|rX%\ڊ *bo&l`&q6-xO ٸ>M 6A`|J,mbN| r6f j۳u'6]Vhu=j[a#l#cA nmVr;YV?Ԋ>dVle[?fl}1˶F;}vb^خ}/ bONq%c7dG-KncW_vYYRy%nl7=?vO}wD`{l_PjرD#o[Y1Z{/2>ɑ%a|/`:mvp dDžl/j1+e~:’,IQdK૓vOl dlʊmr۲H6C-n[?Vb7[^c i6f7l7ӛMcF6Mlw.&^DOcI'Kdl7n7K 沤ȶ]͟lz9$Xm&eM%,1cYjO[džl؀mDkr8mwa2,g͚@?E1Q[D, ؋;AT D% 0P^ātw]3a5>{btYWn$gN9a3}l66ޏP&Sr Zao[ hœp_7v8k ކuQRlHGa-S-R8ms&:t*>Lmp N)p|/ Tp?:1b<~ [O(8&Lyg8t{pm9 ž{Ͱocr1J0(Ko~V4l?ݍZ 9W`y` lU؎=h}X/k]? S`C8EUlfѮ\2{ƜlЉ*?l.mWMsݯ@X lXb-!V`T[٘`?W{!3ݏCq8 {6Va{6"#>װ1փ`K6 l{u;ㇰ`w'|۳U/ Dv8#va>dla6>ɰ۫kؙa`2 .<׏Ou:t;_;פ d]w9Hq>lS9/]S;؍dNNlwmH&Mݖ֙ްֻ LN,Q0lWk;XY X3VvXz:*d̗`2lUE\`YE`1Vw/2=9 {aA歙L@v`lgF,iN;L|9߅..MEܼ`z 5mqu:I`yf6ܫ =0{fVUЂs0Eaisa>,nY` L{ M_=8 8e0;&Nl98U| gfV`e6F`.~ X\8 q"]dx/>t0ugވ`2gg~ęeq#m>V]qn9--_p6}LKaZgG8͟8Z3MaYJ} pNv"]7>x"q.,j`1,6laq/NNU)+N?̂IQwe:vC c8gcsZq ,t \ ;¹g?a6>,mâY_8a iٰ8 n0_3p1gg]E8sNLqz:Y7Lg0ǩ+K`8v&N|ccqToȻ<w 1fy˲>]g<=8wW!E!_,o=?g>}}c]s$ve9ir+?;;c3v1z6?2Q-bS%lLWaCflHHQXo䉵Ƕcmio}`1XkcXو+>,lfjlOaf,`l퉍%X? nǖ l}h-y&wFvywaGtN[VM{ aGslOӣ0e1߾nK}aoUq-v/'<Ž^~~5'6טb6[y9c%<$H`>h 'ؔxpbX5 V`yבXVeFX(ޝt#^#GXp3@Vs^X0+E0 B`6OybmZ9#6c+8Ü?= cV(:>RB?(Yl䌃*U;`Ůa‡U/L # Wb[Q; 1xa >"1, 4#V0d ŭV6JĀe`@hTW;z{pDe 譾=o@# F{T4^c'zkG-:ItڊnTt]]Mkt~NK4QlNuѹ 5vyQ9:yUƿZC[_񿳳_s?c{Q'V"|~||`k5f=v}T77M}&t|S|s,ߐi?~ooR׏t#5Colz[qV(V+;Ti$_q%"?V򏯙U׍LWݚWXUŏ|Y_e_+O._8tf#|yS_ӡ/_xx/<"W?oK >E| _>//+>૦<㫍*Y|ՠ"_W6UYq|E#_e$Ԣf|s>#&n"ߖ7o->n1_?[m#v||d,>=b_Y"|K%kq="9՝ >o{2o?֫|&` v #/zi$:츋o9љolP7H o<7-?o까oo7aW+<}W Z a^|||9_w _/5믷 #w |m$_vkn־LMCf3ӷG濟lm:ڜ|po~gMOu_%o{[7 M"9<-)|K)_SW/9L+ZJe|z.x\W嫃UR9_ٛ/ʗrz|N_lΗEN.(JGI">m}$_lg_nf'K7CLW{=BLΈ{ſGɇ x<^}'y IVbc^8W;+7x9&yl^j/N޼^:6;/m>DKxdO^6›Wjeټ_}u='-|Zs6/R] /Hg^ցYZldXϋU>YO=‹{RbqC/X܋O-}['Q}$x'I?.h?X?ݾ|n?Ǿiߤo=f+O*܋Q93Yci+4q$4?[uGt#+/K1|T-{>Ws o g~J>>j? G]?C<#gס|KqaG>hs_>dv>xaп\uo僇vMn9??4[ە k{_F+=fM/E >V|ɗ|sA|PS۹|chl>c3R5,W/; y9 ^&Ku!j>_Q7?V=\o ~+fCi.F8zLOk\~ >Y7|Ŋن%FؚaeoaOaQp-E :Cn}qrE8B6w=p!ŵ/8 gl=`#ոe'._+kqz[szB vZ5H!c^Zp܅[n~<1y?&CDWxyX/6:ٲ q [q;\&uqn\2apq\WY|o\Ožr\1?Ņ8npYKWR 8ᢁ&\\$.x=p a8N` [ z=zl}6lBV\Þ<|!puS]O= O` V\pZkaw~-8vOmŮx8ԫ$caذ6IaR>rd^}#X޹(^[v)7h~ŏ-6pHG8=vGm҆C'8][qpzfk?ݔp*d8L]NJp)s5\?|FTHG2t4;`8n߁Ml[t枋;#.NBQwbp6ohBhW?нt>I.xJ^~]ERYr^X"VQå3~Fyq/%G~';"i.70ۇȧˈ1^QIf~"v$Ҕ|K҆HHrۚLfs/f\N$ |aj{ 7 j/#ym(ePju/]ljm+zgq\0IR.*3 )O/ixA$Ϟ(ԿSI5Ծ}4O t?E{h kiIGoѳgtmiIkQ hAnXD}yKk ĺttfލKt5c_:,ƤBﴷa:qy=PGG?l/DnC_ql.qth:y5:sg:b%:q-||tp^4!~?Nh)G'F҅tkUh+΋hwž,D'сQCzC5VAX3DL'\[C9[:Y:>_PT꩐0IyJtj Z#MF#  +[v _MM1mG5\F~[r4 o}\1ˍ*#? Krn*yCιLqwX &0՘ڇv7C[]z 5.i0jR^M3|%^~st:AS("j}MxhF'f˅5nz^A~$D1&vCP_=-e=/<Ԋm~twy:t} rvI' C?17k^dߦԢԘjЌ֙GўL jMwi25A&t>gF ^Ch_eYtϢ C,Z9.9aܠd!itH!f6'H XtP,p*{.:c-]t%o hư'¢y gN56 BD3}R<%~oWG\b(.]x$>G_ "I׸\ML!dkq/\9Q%[ݘ)le\u.[xȃhxKnGrbf ʘƒ s;[XF&o5btgtB٥Eµ΢2:\iwhj5 :PgуWx`ZOܷG!e2wt6[=_t(:/AA'Z _|lfr;v݅hZs7 )P Z8e+8knZrgnE|Ѣw~BP_-pa„颦BЋFq/=^˜߃pjz3ۆNXI&~VEjGW!7M? 't!]GK{ 4]XI u=5_r6:8̓s*፳3pOo5;}NY_'p1X ZC?GJ KڻS'li (G颴vzx4:BhWj$$|}F;RtF՛XF;s 9Li5g ?f; 0~=n\]M:NSOў!t[/=d½u*CE#]8&mQʍ!•AC M y02L~/ DkPYXbׇqŪX'T­·Tg o>'HNw G ܦFMm#-+?qT}dh:ҧ]9<74!23{?Xո>@ό?J#H5+&^-9)%J RUtt:7/tPX + ;~JƏw2vU]})'9t7druOkq~4GHۅ+O{2W`+t9 mF} ʤO!YvBtaUqJ#(h jD1BAg?f(XG}6/dg DI3waf_넫'?uAHP(S*4t!IMy/_DS}+ވ{ jc?u4YxzR ^\(rC91\k;Ξ?} +9?ø)zܖԁuN> EsnUeJk&FsM ܱ]KTg+IᇸRA3 qfq9=Iwc/3s(t9~1*9PuI%E .xw5d͖D.kѭLQg2tpyx_#WՓt7+h>.x!FJFߏ%B1F:Xyl9IsN&{!s&ځ ڶ h>fr]\crҫ ~h+ .'s^/N|~"w$҉$t*|$bHT*DGB^;$a{[~'D;$$f]rq_^A&O5C=dH)ܽeN.d[drV;~&Ϗw]3/ & ӵnܪyySMwjVK^edA1"jn3_#Doe5 " >-#;5{.fD=,31E:Ǎї;ThL.F1⦔˚?_9{w9Kd̉\ѫ\QiX=VaE/!DU%=Ss'q7r#;ƿ:2:jnc~5-&4wu^t9n$o5%.%ؕt:1[r/rAb Ek511ir⾕ 't"ë3+%]ɫߧTbF=rߊ3zt9M涤ic^NmķrH~Dr/+ ޔBn$qc=DʕۙK-'6@ss1m.2b4|Cn_+'2<~)ZEvOvk~v]2͸ט~nji2t'qjHŒD$Z)Ht8|ʼnݜG&C4# )}K|&R3򫐬Cɡ+~djg= -&^|,yLCƼp"'}"KByLOǑ2I1ཝ SG?Af {ٓ Ed;K^6Ġa!ѭ:Aِ)3 ]GOHO'=AdzKN !+H8w}>GI#b>,Gz7t$os_s9{c[f59Az4qr{e.ɩOsBfҫBpۼku Ho')yteTLPpp 4# <.8R$6 ǽ{\ٓNmLT#\S]*t 9 t1.W%?ia*:ܟ.BWBۖ8k@]jfG:}MEw,C]^Bk#zp ]Դr[fR_ĕchs^I\?{m+t(OͶ}yѧ_Sc)翇:NO<[to; 9BeFQ}"Fjӄ~ %߅˄g5]>edЧOxsLxj*݇ =t~ٗsZ/ /M?-2lt%&TpgL{o@ɇ |[/ Mw޿x T~Åg"ᆚ\x4_$Z,4IH3'~~!nPm]!Sg:,3kЁEBއWۺB}'Dx+U '6W 6 #\n8,L_԰R8\ػP0YI& x.q6Ξzu pzmܪܢAK_}(UgA\kr~m8/3nӎn%w4.M q3W~ׂ\S.~rON\y}ě{e,Nc=WAs3\E\tu8ɚω~qr9w-Ia\G3ns9Bo2zx2ʎks]_ΕK ng1jI^/Z%v yK斄 DDe=Idsqms~.su链t:k{ԉk $}n9~fOcbe@vQ?rQ3KAf꓅"L9{ %~,#M.~~ ?MsRȚޚd$YI EzmϪBġK.JrDRp>پm 958V'W&-Jr79qI5&jȍ%b=2q!ֳc?ry qE\)2+bv 9ID<}zo'gq='}s'9s ىGĨьlYF,.gkOOcdۼdۦd2rܴse@bsD cuX6$d/9}-l'%R̓sS`r92ىr6 &!.GyNVD=% 9S[H!&&Ѹ<*lЕ곟SM7/d@N}#|6n?٠:@L_$jO/r9dC91Q+%gL V9ɞM%do[r rNIv"%]dS'?Y9RLVt$;#֑sz1Ji\#_&| B; V29xd1lM,jg_Cry?bl Y1ϔ,Dv_+SrR|pv~.zܶbuk7˚5y\>7'Ɂd~2W:O 3Cop2`=3\t ]vB'%=s#26\L4,'idxo=1M-봇g}! &s5۸g|93IIM%'czy~{7-hF!|H焓_HᤓW1XI&9LO8K&J Gq;qf3dL6h;GN dUM2̑!H-,2 FtJj$Zeݹ[|3;qgNr~ܺɅV»-vsS,bg: nBc7iubc:+DDf0<$aԒ“BcڭmU0밷 VFC[tFtstB5s[p[ㄕk o o䯳xl,Gz[mzwti'EvV.;[m+u1*!x+M8TWx>d{L;NgDz\xO:K&rTr?щF?7 0nF}Νk#ߓv"^qlEo?Ch%ч!/x.u}nAO_c& C~j4U2;MZF3ϤgRɕK1uoס v;džҧeaҔF>4niE<=;:B_tKRtʍCuP*ihc;<9<,7zGR"^D!\B#](gMQ4c Dwu 7͠KStѤVDz򾈚zKM+iߥd1jf<=㢢ӛ#(u$u֮#ԞeԺMzm6uñ@1;̕x.@g$ۂэ7{)lPzM ]3 I9Rn}&]ّ:HOuK'^#5tߖ7]z@͌wГtX@O==E[Uީ1X$\_B Qb[>,<=֜kb OgQz']VIBP~]2ͦk襓v;ٱn].l,M4$Ӣo[>ѝ{Q͓Z[o ]VA//K]Ɩ2,M}Nի鶁{zm]7RFsꤱwP۷{~:N8XNw0:sըڲ0:ff|!0О:E9R#n,aR(sGBBPoͽt4k&ӕY6Bu>ѱECu|[dž7HTNքy^7zC[Yo?=)Mf1:? C+ȗ][ISzk2:Yz# ^cNRT$`)] &Q$qW^%7d\=é,3R D0q(#=%V^Zhk oO"#I$„2ry.wWd. "> f7qO$WKo#}$:ym9-%W%QC5z:2;9?t,5Y7F.&-z?Q?fWɄ<٦Bn+C b˸Ӛ(㡯̍k ^CvFs1A]ȰugHDJtҽ nq86,N d^1y"2(!]P=3^ר>ՆK+j2nuz 1WJRD3 _g,Xp-Z&pO~+os(= ^~=@%dϹlӤѾT^IE&U-F>N\ 0jѢ~FߝI y]ݳ#dwZ9PpV7рhP1(H5 BmZ CBdb[m]mPWCeht딣b]aRio/\7I:'N -׹w_ۻqkZnmVNfO'}zɽ*Q X-+ w w{O61jP;Νv0ZnBJ,AQXA1m;kY- jTcOݸ)Gzu3>e͓>hl4Q95Nѳ :'4~zK_] ]<Ӆ4; _xd{G%zWSOV'5w1q.}F맧Sɸb6 y>6&RܞJ#^gЩVҕ*rMMǜ+c=o/y\'|?=rZM}>&k= WhG/[ڟ?@ɦj#4DҋWo鶑[J&/+}P݁^SZB8E_($MEw탅/ ʨV!Fhᰍܝgf67n[Fu'x(Xn~FӰR'Mxys!N{ GJ4.Zt5M(3{Ğ y׏%ޭLtRH/TD,D7V֘SeN`v͸?HOlAm fO_|ǒq{7]ɺzc|o{}@ צގVI7RIᆲ^db(v>O Aw޿,}{`b;ց'Wx9y]b2 Yig&г:M|Mܗ"=z!"k ABG<']?˴Z +H\/&ΑrՄH$x#xk%xPp?@ki c&ӝɒs/ѩ\\t'>M\f߽ahqr B%HqP1s]'86qȎkjO\!mv?k#5__FЉ^>RBLlaM=GwcL0c zNIGRpq+\?;:W_M5W_M5W_M5W_M5W_M5W_M5W_M5W_M5W_M5W_M5W_M5W_MI⬂S)N810~Sr ƁS?9fNq:c9@Nqa#e)\qf!5쾊S[9e⮘S4>2Jnl=Jy-Ʀ74~8rq׼.͏nǞ0姄k7mEVeN{x0˕58ԉ4y]?Cbt/ـS0= :1cS,8C׏F@sH| Npa@.t=KWJ݀^gqRܚ|qR:8W ܮn;SΓ< Oz_V'{m͚c7>;+z]ކW`r < 2?!_h."o-9xqp>bJz-ޮûVxqut]+|0:xJ Q|9/;$pABNvx|߬@Y5!_; .-# { u:C5 T p*H?шӑ6"W*. O'#]JbWYHo yYo^Ԙw}u3E1dGƩH 8^3w#{7r09NGr#F#>!9y] ѷ > h&pOnȟݮ!36 ?E1C| nE(ԙaZ([Q`ǡH' wyh3hq 2Q8N9QVFW&FQA,ށW((ls!O@2>!d[)5g78 fAֺXwCes!WC]Ed !rjn|}ZC|*d +~y"gΐ?,q+d[*![UZ@jikrVOb(ط˙\tth@A~HB I܄HAE)3-i2gCHuۄTZH]iW CR׌x{H]%} Y wDC9o;@:{v4iƱH2 !5 mH% ~zWH! AdK (I(<| ~2T>( ]n0钳PFz~Gq 'Gftda6 Py}Brd eH:"à 5%! dpD8vP}OGn2@ƻkphG?\Y~2@&~%Y)H ՏVC7.3:B PYTWC zCusPEP6@%*G&2L&y|PyA P=΃*Tڡz *4T>P`l'Ce\kPug5^Biz拃sKFA0vvq=(Bg (zd.'CyqCƞ (ڮgM(oy'۪w((b𛐯L< :(;W;Av!r oPȓC.g6'B|P.)H?]'}RO O&S&SmP~D:a!ҫH_>fȘL\˘G˃ Y㵑e{Y{t=/[<}t# d{Evq"hBo䄺#Vި'KEM3Ef'Xy7MF<' ?B `} ^AAH 9(ُg(-̧Y%( A"?+Qk(P{S37[ހ\7=iܽ '̐r/#bd؎,$"˕]#Ʊ/ANPEƣZ@ylyO~QPb/ %( EP %ZP2>(BYewlhNP e-}r#}墴5eN;Q)&@G, AyTPC^|ġ-*zJSC0@ɺ(6)FQaMB 9/sQ8 #Px nl܋|6&q9OXܭ;CIC$dvu2 ÐD}?o͆T j/cmP. `i吿0fcPNNtb>q0oCq`t|Adr?C#DHՆ1{)Por^eP|b6'5(5?zfOCq=YEb ϣJ5w(30۳[ 7d]fklgfqCPY?r*("Be!On0l|Pؾc>PLa-zAѥVB~53 ilJ1S ]Z) ,N]mj$ bH>!+ ,DҊ#-<̜寐|iHAH_AqH H#CېNoDSW)H{4C{#!>A b;R"Dlw8$ %Ǒ)+eҫ/.v,CXWqg'_B2F oO U;XtɽT0YSsCfqARcvcA=_ЮH[̘a_x(arlߐ^P, !g 2'2g=Tk~^1}_dq;T`BlXaߘf@ ؞GBz@Y0H·o)$oW@a CiŘRHuaH_ d.Đmf4'P1nUN @t P\bf/HQ+[d1TwJ!Lo/CMtq='tG\rS(Y< }!Wn͸p4(\=XLdsQ&MA /L'~By4íLƌk#md1r?PJPޅy%ww=LC b7}ʄ03? YX3H%C0 z߃DF#B> iEH9 vwHY<9ѐ4ن^f>qO6`l1,7d>d!_3q=Ȼ2ذ|@rYIŐ b{iIcr {"VGR\8,)rW֯3~T 6 \_Vk"iHS$"m`.`$ ]OOD+# bHB s?J֍o $rAڡT! g Nzi;H\ qeRgq_@JqB<9!>Vk1?r" Cܓˑh& )Qq ?≡Hy. )H)ko %XH5fyHMj"m郴' ϐvz Q-O̭ >ߠX.SBGAHg"#g",dELrFNyrHw>1F,g P?QXE#_7o7#ߴg I3#o1[#o3IDnm=r"7V Ðy=#wAle&rg@% ^7 G&rg"-rro O)2@W]r 2lXƭ#u("2ۏlȞ =F#Y 6`}#KYĞ9!62}z#GdWYG3څ.VXȚdz!sA52!s'Gg97sՐݖ |#?{s俞ZӐ yCu$rvDNE"1[ rG#N΍f~ysk!rfCvC)rFΊQODv5 6"0 ؚٟ1<CXB1rJ{g6 /&GCRVjG?P VWQo, wiM?vAS^1L@(1Gq9J&$f;JuQjҫP>?mƭC` (+^r\(?ތP Pnw{P`xT\ GWTOrPT._QQ8eٸ5+i@MjQ9ug~L+$ah8oYh֢ M3ǷJ5|?|M#iplESDX|h]汯ЬE͏+Eh8ͯl/ =4GC44o}#mh.Zv4ןAs44x4ΡZ4D16٦;$K-jМʕhQh1-Fhٯ@*bhyt -ŋcFah9}-&hَ0 |q3Z^@G ZDe-ü/Ϳ~앉c|7_y&h= M:DS;uФhjFS?=V[f-Ƹ]h<Σ .’DznEM|Qm Uҗ4Ga +T]mLG#(8j(eԪ %E(YSb(*_";(C(q<r/ \w!t $I[  -ecƵ!1;L]!a_F@6ddX6@ZxV'jBvbȢX\5C>@>ŗZ̓͡1c#3ƌ^zU, ć!9 Yf;C7Y<{lB冓@qh'hYqS^B(/Jʙ8E!3XP ÒE0ΟX2$ߙᛐ8g|Ƙ* i%Fi{"j>RFkHqI={!>|Ha&%R Y.EcF-$gFX- yfW19Dim9r$`wF!y+c)MH6:H~ێ#e #H 3aʄ"j@]Yn覇wHM^YH[rЛ%l?Mlsr!9 I-HC:> R;ƶEz@vf dX ~K!ˑ@~1W, TuR,|H-keC dJƨX^td_Y_6n)uW !?t?K!g޽!S7e/,s% vCrHo $匑 y{ rm6#ekG$\;WMdpK{ f}f!$ÎBJL@nAc,r* c>2<_LlUCKg"tOFN`g䎞\O7ۇ.{].,.KAb Q0CT#lP}q+ 5IPpK# NDaw(Q4 vP8>KX}LQHPm y ꪡPM Qp w''y OfbVտa܊<G^">yǑ‼ Ƌ:쐿M|_CƔl=Pp r?p>zލ(z  PHB)uT#.(mP624Q5_P*Ci@iEY߯'QQ<tRJ+PQ1Pz%(=s3Jǿ@WE(;veZ(Qھe1~ɩCـJ苲"9|*g ?P1"'w*.T^J+v&*?C 鋪SwP&PTݨCU)TZw(:s-jNx&kjGm~mAmv#Pk;jלB&Oڀ+}Xߌ4 u;;Խ݊y:s[~@BX4Ark4܈G,4xE=s|4끆w%A] 4>4߁I+_\4FZ{ Gа{$@4KihŞ[ Ѱ]ײgVl|Q(g0NۧFB4f8qC 4.TG%r!R!5Mh!7[{4x-a{AQ4?6eǾ{?-Z{uHNSJFN@B6}Cơ+;B{h}K >uW~Fh ywkv~9ږlDx}Ah:hmDk+&{VTNA:ġmC0@ۓX](B }ih֌hu9k,ÏI37?˲c'*E˹@\Ib濌%vXlN4w&aOMy<ͳ6rk@Sq".뢩{Ov&;=0{|o$zƣXۉ·>~hlƠ4:1b4괢qX8d5GPЈ+)h0|ԯ:s6AmjlB)E$]ԌzX3Qs[f5ojPSԲx]{7/օ5̶o3{߇1v̞g6*sQ[m_Q I0ZyނZMz*jwKlǨyu:%izh8GQo9O22EݙhzKGUԪ߂$fM:%ꦔ6{j>|BA~<5}P3aj~02Tw1A\G~Rk,'Ot8[8{(| XSg-)I> lr'rxٻd5#d^ #*lR+J(=B/mqF?4:CLd:$D a.K ei U0&kȸn Ҷ hڣ:#a&/'3q3cug!%XNP i|82KA#޼ t :4f2~Xj%j@ƏK +Ʉ~?5_?ōOPxgCSoo(7~aTӻA5ʊPk%Pn 2 ;ǡbyc-d:C[Ibc6%RCS=+!>5HBr8$w#i6|ėlĀZE#nE)b#}Qe-?,ó5'"܎!|Zx*3Sux2 3{x<&!r9Bn45jQ[GfW>B!1"JDHa$x<.x2xVkFxq4DÓqx:HӪ ]p5 ./C6=vAa)atV@Yvz=žBX{"D7E·C1a9>8a?"",f>a_ ,$W Y ¦>BF(¶ q?{iMBr>@h,OCh.B+G x. "4=cP akx+,zCS!|J=¯g"<-p(F# xVpEzё3G[D@j5Y(Y!R zETDLoo=<O9^V#zhWČ4A곈^3l-;^Y,+y^ko_<^?[%x[fw$r~"7;O:Ӝ@4|Zύ3>g ~_{6|">!H |f h?8oUZl !M\\ĝGܔш0{}w݁|^W=*qۺ l1D ꉸBCo>LB<]A]OYلtN+/WK_W C>H2Cbc$#y $2B$$zZ=%[R8i!rˑeHCwĩK!~C< R#Ր$AM63r)Z_ImIy/z"A'Z{᣽1G  54Sxg5W5xSV" Gx7^jxQ/ 2=o*@x)낗Ub)QEcY{>'#2U=ATeagct9gx0Q+UQ%\X@KO"b\{"#m{ ,yBi:ݯ/~MR-xg ]l:/LϽqW _~%|whwf*|Jc>/.6/,f3dO^yg+ࣻ+}V1gb6 >>gGOgx<~ p'^φ~^څ'GT0n/{m𨎅\܌;t S3E UR, Yw<[4/|mw.w}fr^a% ^wLwlWNܹb pS{qpu3̳kpɔ X(GXԆ8!Zc_vM`ëdy>> +qXr?|7̶ ST1FZ0y,kWMtm:ѳ 7}~έoy?s>r+ﶻw_[z/Ԍ:3x~^w~X ~x)qΏA:|.| c8l}o>hӿ0NZr^+/ mal2k|mg_k3>iE1ޒxw!|q62fQc-60~]Y~;k|cgcimi5 }Í'V~1N+{:!g!L~#?F>Km)xJ)ϣӋIf|(>:ϊVv@,yM!wS1^`Ln{Y1opp=,az.a^؇8DsqbP{`yg\h q[\*pw -n·:7U;E0;9i,X,] f yp]\_8io1??xPzJ_H pJgƹ Pfa<u(m7##rG!_r+ $EM?(  JP`77!ޠ`+ @(X"FV4BYm乏@nD-rB -=2d[d!?w" dF!h;TPˠlղPtqP̆*=~P/S!7yrdB ˇAV!+yv.|5B>kҗ&"}OgbdNE=d#˺?哣 #"2jغޮ_ݐWX}YCA5ˑ<ϐ٥!&V"Ǥ#rB;!Q!6ODdy5w} 7@(C('(0MDGPtQ؏}E7C. ;P8 g=DatFuۜE(>Q?F>(vB^;&J ojPt4 LnCQX? ȏCp@y4 cd]2G-SdDΙ(XB3&f/dsD_!ҽ;\ U/az≌=Puw Px.m˙C6%{slP,lS(i!lsȯ*6@jRfK+Y>ҖÐCR2i-HK| ɘgHlԟHR!)/C*WH /B:'$,vT H'lCH'T 'BA^p uɤG PGh-ZfHcS衐u1%dC! ڎ3loh}P>kM9dw=: +|Ꝑ!3AƕچL2m0؂~l1T:B!c82LCF`>#*Z/_4xQp% "c {~ Y 3W9 h>@὾(QEZ̗N0@->S(r E3(uQ%Vg;&H¾ӂ"ʗs< 1L؀gb7#*|!oLG]`thvD?r.G$6}+c39W wH/u=Z,9R|_5d!?$#*Q@F`wi(sEO]QX(Pbsw@g(WdDFTﻃ/[Q; (]eXQq0JZ(7*zMh@ej^U}s*nF(⃲IPz JQ&EaK֢b NccY\[Qn"-(tꉂ,>N\|xfɑpBxIduA֐<-⃑3;| g  ?| *P K(o@%B%U fzt kz@Uj m{{#iW/"}e?n#.Oxl'՝ PwjpfW͇J?= ס :=(P݂K,PJ}s*=[2)l\ͩ,g~%P b5ߣ~5үކh'ojтM4T"yNއ},9i* ]FA $K n/Ri!h y;$o+ $OFfGCRBiWT~5A}X@۳d}2EAZ8{1YaNBedmlk^(Ay:TG(2W!cse5 ctYPh™~#:1fry0d3 Ԁ4qLS@a~!sNK F2|ݡc&|z@x ;t\Nys80HWߠh9 65?@U WlGH?!, `(TZ3Dx|j.P N{B5~B Kٸmj9;Pԅ@n%߬^(J{XB9O~kKq̍q6fWl; (߰Y,IμbW1;d9 0Bq?diaשi&2f&H!MWH+/Eڷl~ɺELdl I&ƩӇlH`z HXZ4BeNC8%!#LΤBt?ds!Ki-HHLzHg! EȯhC>L^B>|dC M`6~V{ lXiG2'j ")C5C 9;Hg"W%f#GSHsC6ɣ!9}l ;$sܐt^'$IƐn`6\ i?9\ECѓhoqH 5H]D"5zRg As)&o|q3HmOd{Ƀx {!>}bwDʯHqlA)G/S!^|JA B< Fv4@Jx=Rw"e R!Mij_{"")k!9+6H%KiHHVE $ۊV$MD/$wuCs$`'EB-$7B_W|lHbK*ERI}")7"y` >EJ[FB)/m/Rn}HqDxO5LLV ޟ R2߿%FH,XC7H]bI!n|=nzԒ:m#$#&B$x!{'7C(5P&]*ODS 2"?˭X쐄 OS&Ř" 5g(0@Ɛ#:p!kWZQモ(:5(\DZGlJB~";=BȟyZ31$3䭜MLkbZL7tu0ӧxeSL=0yƴUMt9ebzLId S-LɇEYQɴSR[T yc2;Yu-2'dj$kL~Oi3LGa*ء `Zfd1VbΊ!CP -Jlg<ӌMSW&E%;᫩Y<˶?t)_Ƴ"-E6ҀoqOl? Gg"Muh6ۡх-hWnנ ebNʊ9-OwO bUX tㅾ zLBN>,a"H[E\%5Wv+bEKD_k2ģzqgE?_~EmsA7e:iGW"m ΏhowF+A3h[4D{ cBtE,.`Mh*@D$ʣh?7E{4)QUPyOQڊޝEof4ihg=>~j#P8η 췄@A}>=@%v]bG6#_ b[$b teb3YFCb^ybD E՗r('Ċ9|z]Q'ĹQ SOIO%pE!nQ&ZILF#d, 1iߎ _5%$2$iGy^t+yЍ7 Gly}>^I֨QdL'+l#/ Ů^͋+xUË5xa(aӁ@V@.Fǧd&K7,fdi˃d%k/:x,YuȊ@C7.]&+x9/ZxQ=&܁,d !k=Y <9Ld޿LdNIw-ɴ$3@^lTӬ:z0-cb#0)ق U"-*qBOW2~K>~2oy^W!}F=Z^1i;V(:/RǑw;z3R/j3I/=: o ݞ%bIa[c\~ch}.$Oq&)$CHHH=e$"!H,CbG$Dx;CϑxĆD{[w&4jyT@"I߾4Im'ɭ3IkIBoh2IcV(u],%M$~Mq+&yl$b=t&Ui%58FRD*3'ΕdFҤ$IH!U$7;B$q!bYEğ 1H,gE™$?ϳ Ip.³1goܒ {@\<<'JcA̭qdyܕbx%ι߈P#aqޫ VN#BBNIPB*9F6oJG~s|; _wԏ躏DvPF4_R4ݏi&Y%D.Feo2 44} ES4 K2^ruK=v:b*긭MP 'M#5r€6ژ,}R]—})ЋG<;ѽtKEJU3$]h~vhM݅(m? b_et}Pis-י>썯wbi]p!O}gݵhDVm$ l\iԣ'>lV{(%ᵷ<^o@-ǝpm \}}v#8x+ǫ8>uǗoN>EDӻ0p[NN6Sh iy2Nqo8Wɡ;N;q +ӵ0ƹ$O<7Y O(Os]sc].Fk.OR).cs|Z^\)׎zm\7&n{SelۥLNmmZmqUf n][;Ւe wrG>Nw܏9,ۥMqcX/y):ssFnY-M/nȉ۶&4Ɲei-W,M˓ܿ>y\w^x+ʣxh)^ ZOc0^.q{>nc<ϫށς|>s zxƫ^#jHmx쁗r+="n?w꙯'^q;sa4V{{¹y. } 9? ύQ-\՗8g5pb!.|8}E:R Ew2" ep ןzx'\pץ؎k(r;N-é/|IJOs7 3g q8C8;?a=GFpH6Ь>m pĺ qq[N@X19pOγjCxoYa}teg> {{Qۙ ؎,ݵs5b] V>8èk؀سp'.nEX~{"-a3Aos~8ԫߗm`'ݱWo. iؗـݕ_+MNlqBcW탋"{{;}Ni`wp/lWcw-Fc vv˶s΍Yҝݵ^#ydvUǦ7.f l~XϞaXbﮋB.mp-l^lQ`׾5`-^]l8Mvs`';gUgyln:}nY5Xi+zd< fLw60z[u&ԝas_TzJۂѾ],.M&eQb>UxU__սa~*=U~g\Wڕj>).)8ZSaնkΪv"UrUWS,P5wOhlUWUytÃUJQvMըUcT.W_U*]8t̏}(\Z\rơ*q\rբh'*(5V9gur7c?*\r2G*W/ʹ_Vr w̞+W0Rro-Q*5n)e(~>|TRU9E;GNQZtUUb*ת:>Km9UU#ɪiih8ݴce+~O7Jp_nUt߻ }ي6:!'"yP;_¿_{L~{L$0AkT?E '; H_?'.A=!7n@M9AZ^&Gx'A= ;?&Ѝ}Daa EXYwV:Y&?Jzu'"6 $%Bʼnh h[a+`#Y0CݳDh+]mdD-\Dde UQv{P;&z?cUıgѩѹ@۩7:Nˣ] ",IhF)4%E_})>ϕچw]h>N<56F M\nh&|vA14ʡjM-x6@}#Z Ϋ8$>F)Wcϟ"$@k t_ځnvit׷ת4 Fw 0N80~1Y$ )vEZ5 p?AMԦ.;7xCI`UN##"px-AH d\!rSc io^tߥ+ߝN rH ˚PGPR]OC_$kG]ؕ'w&=Wa&~K@?{*/?2>B&jh)/G)_3Im*ـuMݍ_9 *`j&w1~_-)ց'~㆟i*~;VQ6-$zoK*,U\w𛗁_g) _j~ §.!Eя蕓E _?өB_rl-}؋KA|CG#d~o36p%`oX9f'BG%$~G9V!(\Gp 1`gk2VMH}!a>=!A dB"5SB ,EKKL'v"|—?NC"~DdO#b$"%p"na>Jy0{iD~HUk"=g~D02jqDyԍ7̲#e"%o)}~ sJ؆ׄ>@اe JXބ8AhՎ\&߆u ߊ[/ ~\cęr2 pTиM>m>,яŹ狁Ȍ&$29j oU;Fw'C8@VN>:ēEدӈ'ng(by2Of$6΃V=+r Eb_MIDO1, `ǰNyqX~P#~0!<5A uMJki=v'υ+w)~]Nqi!*:-~=wߖoo P4l|ƥsg⯼lO?鏿؃o~&~m7\skkߔ!l7ߍ+޸X'|) |O¯{׿~Xd ZvgDYvmo I} xŞ+i؏ {J111-n|.Ak4,1 ]hLGuc Esj-_~&ˠ9zM?4k[JrK]ǡh~@Կ||>ϊvT FP-(>a[~W1L-'DS5Ϝ/\oqx nx-b]~J[;eU綡n/Ф}4^Sx/=q.޶#2˺9gs;J_c4 ?"w}~D|Bs MAhG?,n񛒉߂zq{r@xM+8sOKj?HzYGW &Ş_}>T?tfvML"EvĢ?sEmM'h=cs]MpMhBc}3\>Qq6;h;ᓗ, }IEzC|OWcy}>XӂgNhoq1 ;uѹD Wt?f gsݲYoDf-֋Zj&y(3hF; Ի ?34ŲwG}k_~jwT%75G[{=%_i>ud 46@,|/hy@lWhUvGNC7Oy&*7w4XM'F|62?k"bK— sG_vQ9Nz(wVA]SWuc#Qgi~֮ǻ'^%^'m%^r<>mT4тVjۡk |;s~:>=CΊ5~^Hź*ۨ1,x$~fCBPӡ.VxOOcx]Z߇wR#} ـ5f=l*^m^'g5^Ix,d'ڄcIx3ڟU^߉=&2}y }ʊqG } ^#OOj$h4ǻT*4K>\)w &xiH;OxGx{X3!>_S|ޱbo?^7>qQw݁tWɣBAߠku}bmw˿>"1_ڧ&xMB>AHxQB?"직wBKDl@D6FqCb_l1\!u?4us&bA"!bP5/'"rÄw#?a ON h9臽NX Aw&n>a jXKX/ aK:?: $l97E_."TБ Y 1腏>箄xM^B6 aILJLHh$deBR:@ >vG ~3WP%88i !2 !?>"!Y'DdCТ"mKq "l47%t-BuzAx?(ڛCB"^$>"qjK #5EhDB$t1Bݮf՟DOB:1о~ޟ UN"OB,%DXFq B%d.Zt3=Qb.p5uKѥ[7BD ' aBTDf@Z2sy>SZ ?^7{b2bkEDl3NM)ľlēZFœ_dk"Omȁ0M$Ø6dVB8;Lmt0ә<0”6koLk1=FL >4]iS+ED2\o0ADjG`2XIzJ12ڴ"IG2&8h^ZH_^MIk HcBu[H9@y=ɍT$99;O$hlg'Mzox':gq><1 ߯eCE}\m!XC3C NE.tB7>a7ŽL@&rea[WsXuB֫o,H[1D{w>X8uCO+T<)fмFMf+%Ρm){aޠ%|laoǽОBJts v-⮛D-ѽE_tI§Xn5эbݯ݆]2 h?LvhEeD7Ѵ=/4ZκJB}'C}&ZTD{=?TRt'D_*"(i  $o)QNgy½KO^£7nDaD+GAk|;T$H\C˚$ nM˓t IIDBH^F$ eZRH9]H#R_R;8)'# )֑bIkRGpW(R2W'Ik>mHY7eIq(Fʁ0R6< PGR&eMyRV Y2_{gc0Nq0katكq~Cfcl0`cUd,$TTrDg(Bğ%vCRN""%Hc?)@L &>\cыړ:i y$^ .[/*-2u0,%% c0i B2 s]8xO@wx>y~J k,^|9]Kbj"/VŘX6 #YrJ֘:&kiIsC2U-FM'$AOIhZ$kE$lkI´$BB-X0*ă=zL$cH<>$[H⭲$z _8#Ie*T[Cw$>We(p/O>$i4 Hl- f) D\(HcmHibo&w$BJk_"٣ Ɍ"y$ӓIԅĸHDm&#):I"YmgG }$0 <ۻ>#xEq⌷^/PoڡE:vhvEJ;CBCu=!§ O/?}KD@ }_]ѵBڑ6~U&h Оt\E76 7t{o/߸ѻ9[j0K&ˇu NwId8NnuMw'ޫ9gфC(|JP=φj7diZ^g=<8{6Oư%\j᝹X9br]\gG.Sܫ?N713ǍnRc~_rc%rtKGǑ9p#N&#%1#?r$993O8[9Y%sPo]o,hq Ǜ x 6WNs^w?k̉p9| 'wd6eGShNq3'O;/pr|.~sQ8?s8%icx>sD+}s-8mqr~>A{yq V8]S%N.Iʜ8>m8*'gNB9Wus2x3NŽq_Qd_|p!ǹ[9mq]8!ʩ8=ӛ8Ets|!Nqz+pnRz9]<r~+.G1 8:u)pm{r ͹ 8BΗ |n\3&p~)7 \[Y \<҄KrKkkWʏZ|)JZM?q\ܸ;3r,m?nmV,p xk~b+q|C[;;cmۍ}܅>m'wnV4[OrÅϸ˟b[n :ɍ땣v c͹,}zE\:rc~n}ywЎ~nF-^aG=$ȝJxrYމ^ܻ҂¹hLxY7qx_}x3Jgh:UJڥcD]'*QߛG!ܯmݸܙz7mw7ݹ)V%K-z\݆˯U\2i\6^.ɹZu[ɹRsn)>u6p~EQΥ'r3™-9{wp͜N>qt@1\tmpi|:l)\qu6\eZ/.oZp.J<8_ۗ8GЕ82Zo\(':qN?8⼔/#9dsC=r، q@y8nc8Fāmh#NX_ b-֎`_b޺ݢrӰɨݰh͈gwf 5>`OAa# ⷰ OǾ6쬣?c{Yl0r MBkl\C82a߶2vv-쪟&3!0l(m6c[m1v_n3~2me{ֲ#*;6I=v:شqa{Z8Ž351Jgb%Fbd1 Ov?&u?v禳g7s==#v%yglǶZ뱙-Ciѝۍ~~ؙüUl5;GUMnioٙuK_t~}~U ,OZYΆ[fҞ|7,S7gR^-8eM:CE<38b |Ny}i7MSu$wP%/z5*|V\Sgo&}Byk U>Qmj[ATݫR ՘SU6R XS|RUU_:6wQ_V}E+UWT{tQ,HauU6TVGjnQU3Ʃ*}0U@U7᪒=TOSU8i*|uv2J{ /{ /{ /{ /{ /{ /{ /{ /{ /{ /{ /{ /~ڦPPMRH5E(6ZRVT-¨Htʉ-~lv(h굥Fķ2eΖIVlyT'sNO%=HFV5rdʠr LlzI|$ Oī۶=ƨ;#͒?OumF)̯[rhV2I5"{P[!6`G=9J4FIm$y$lRKklL]ϮG+HK)ew#x9$ѫ)aKiD³I֒MYK+OuV[LwqyvllkD^&o-fuIcҺ yJϙ<;#Gڷ8ѥ({MZIW֘"O>̰RWD)ѡQꓕ9te1Lv`^-L+z죑4mlqKrD_Z:q>{cޓrpdMңYZ#9QJVR+\['<4ϥ?u TI2fӪ$3LR4VkFiFICwNϖ}LƷ9v]I~v%ٯR9MyU9ͼo%s&pSԔ 2Pv/o0˛,iҹygnqE3R6o|96X[wrϞGoL7)w4դyrAB) J]62۪$=l|sXS&V3ۇٖ&Jpsm je~jKpWd]W_% (5T)ې'N!E^ѯylZ9wJ4EsF92iy{VJpZmwu;l_Kmcg+E޾Yݚ}tK\!gqbƞ \ukW[9gZWZ;G$dF> f2V#i|1vd"V𿓞}Αy+9y>xT`WKV/92e(=mhd&ƞMc fdپu޺ͷ7W5*i)JE+Jki4Y8"{TUJgx|{.!ԟݮz M7]( y*v-nΚ3lFvW[h[L? mGSݟ)q%|>wtbW|NRVW-9wZ^p|އxO{p,>9|AWDOryu| %=u{eE{_\~>|t }],eoreZ֦=VN2o y{>"|-ǩ4R~#9c".N.bf^fwgnMk ^<*߳"\,xe1H2mx$׵JNJ/~ՁyQ#w qd1 9|\2a1JnօYOfqT, N^U<9xr=+k2yΫ ^c2mr),Z_>Lo?Vs(q?ҕɭcI|>2o,>~1ml{ r(ʹ?\[.Ѱ)o3ϱelcN|rm1k/QYyd_!g)=|e y_؍"n}=,pu$Wfu"?wduWKJ w>fX<[_{~Az_{x]֔d3s_/͒%h7!r8]Zfgۮ|+ߥm+u~R*/u\Yv+{hӳ3PzV՞Ov}\7wW*UNs gwסeiI,/H\>cQ*ޝ+3oK?R>=3Fw)Kcny*HV*mUZ*jȷ9d*>< ҹ\u+ ka>yer*y7dWJ֊`yUNQŖ'0?+S?n;oNHVaK\9n'0T Sa*L0T Sa*L0T Sa*L0T ?o}U-RZ|cT(:7dώg$CoOٷA;0ܻ͸1ȾarT2߷ME=r-䰒I9uMz6g7Cy:.h$TEn(ӥ;!ywa?<4ϗ[|TXW>;ێ"[9󷻹P䳽y Q(d< ̳YNHc6 &?|.DYy2[ʡЍ5(\uߌ̳qs9hr=OYanP[SffJ r;*Y&coY6Q9(,5_es;bw)wr~y6z2-#}]q底B'B׬7 |/X$1^*!"Oo朏LqJt},שL,2):RZd c4AP`dtߙ|f 2|Z2[W]/֛\>= Lr9|n-ddA_; "o(YήQ}힟[dcͬ|ca.d>O1 ڷɞ'9z2qd˦7\ftWJ}%~ >䰖fZ)~BZs?Wxd|PHuVI珚ߏoHs)%IzRm ̘esW^fYs}ljzNkQ{i5阷̸$wxƌ'%ߏ޹Bgy-_)N 9LJErZOֿRl)%`gI \slaJVsT}'izS zNU;|~gg> *e H7+#ytOߑ;0w|%~A盼_DCȯ_^>}|c ˱;OOxW\?WɒG,>Jrܟ;NJw<)ID ;`9ɠ|w<[.Cd9 օ%߬lגΒ%9mKͿOd)ee= wy毠dԗJ)W Krez,_c)| 9ue8JŻ ޖ\`pd6N7$Y} e'dws䀈пOcCew wOOe ^_>~;W~'0Oη :[=;]{?Ip)O15,;ߕZ,/-'5(ÿ/;red)cE.C]z<'vǂy(-8*GxvWo(ɓ%\EY>w <y I0+nAkԑY7例k1\Ye·]^M)e. v +RzUV(zȉ"'Rd'{fJ&Q/%?EYZ(bz/V*!r%K'2~ WFঋ3-BD Q-z%>֊3((t)mgT>j%(zZI[iu]ѻmP l813tywP"/y[%~vRyI"Y# Ec7]Fvo,sJqI.I]xvY-vx.x^-dd_WUq֨ƊkXQE5hԨ;!Ɗk)b+J.}$ @W !#"EjF ҮDlѲjyZ;;G3?͜o9^\Nݠ V/ QpcA}!긙V14$>\Dz>SaE_%_E"{}qUGtDZdr8%({پDrFiM(.YO<ĆTޏ 'AI8ns\;h%9/e{{"zY*ڃe;)Ε=7P~+}7Yu|{95w:͏RJb2g7k)_CY Ա/sZ/se_&oR]HOS&O~Y]L{[/P~, _[V\{i孥]I9a0tsU+Fus>9 ncӤnp}2v}!V ~yAsʘF)cY &rO{6N=T֠.H|Z&Ӗ B0ZBeMZg(Nx"F6!Ę}r 6b8:9̖m7 ?N}5扽u8W,A,Kg:hȐvʾfo]?Zl{H T~Ϟ vI&G%N"Iʑ{Gd.Ljđ^\'\ K ʉP7%1z,`Ⱥ4 3 th 4t-gb^qs:4%[@I8%wFG|= )8R]5C'y PI9C}cA#O>G܏qLĹ)3gvRuI`D<$Id Hc0CI}Ȟpg$d:=!%Y_#N8G'?$ti"uR^%mhgI{,笣vydmchS3K|ȫmKG EP5h]J)Kd9rEyr ;,! wb1/ )w21N:}cBp^ 8$8sD?\goE߫ u}''~|)fP2Yz~T;G!QCݒ%w $Ale=_1 "~'sB h~Ϩ:s찏C.:(ږtTŘ@lSR1<"P>Υe1_ fA+pS R%cs Q1|=O1&6%TO&Ud\ l*ñƴpn^,UŜ^`ь! qDӐؾ0CC9'_9>@yx+j?&/h87CN^tEakaUvkouqsNf'Buu?:*WGϦ*?*P_#n雧r3*(b9|O{Ce)X,:\ӱxL+}Hq{+}a<^qNmg~()sQzPRcUۻ Ƣ;8FR泿cU5wiZh^Xd MF6({.vUwSS1Tn}﵅z)=Y#mFpV\gw_t1ח獦 *kȘosz2jdoMEbp/t\31+.s;_hK[[J# Nxs^ͱo.U`=Xp\=mR l&I_gRl&L.?x|%}eʟ3Z)'_K[Kp\sdAy"Gm:"URwvkװtVYsXusk&uԩU>L NG>;] n꒥[)[zlKEA^ /9ʞ?FaK[# f;-7.C8ì}Ξnc|XJ,Ob)+ʯ,uNW ʟ;b:WG܎VʯcAxMk?{8'*{ll/s:&N,{קNV-8ʺzWI[Z_u2%ٌCmH}>EvpO8GxK\U`[aҎ7)OG6x$S'>Fŗ=u:hjKu)%WS$ɃecOodw]ǐj8^ՙG\"3Rg[%-Ħb/V[Hb89_ˉ\n6? rRw@|>2c;`Ύa4s<Ӻ)rgWmd[;юT>v"啊g wveL%Ŀc>pvf;++9Ab(X(_Y5%R{knl}񶔱\[__bj(_~1p[g}Al#?7\}_)uWʾk9>.ߨQ~C[s]&VY/U>gq9Qsl\ GR ή W>/ ^9oW9ɬd_:fEV;?#vy5墽+ξ{uѮ|,t}ڦܝbx(G5_ҭjS&q4I|='/֨9ucփ 1ΧοNG7Xr1DY"s<ſo|tbW6w/ K)V3\?5*+{wRʟ ])p 'w8 b[CLQK%.8JFY#}EgFhIQ:b_H}\|jT>mKG|kh_Q@] ?o&kZ}mH)Dq.Wm?/T3ywk$"()rcݭOg[RV>owSg]ʟu\8HH Σn5vk֐&ql-y7)V?.׶Y5a]VD^pL-,?~C|{~ΡUœM{=X}F9,X_ö}6yDa.D>i w߱ޣ%{tWP~G (GP T{G^tEy*.Aly|tй|Ϲ &8*|r}ΗweN"+sN wܓT>='@D1U~l6A>cwWwGԧh|JAoH<1|\b=|]?r}fSkn5-~?MmmLنTw6@{s m} ϘOmn C&t!mjskmҦm߯?@?Ɣ&6Gb5"@ƍWj)'h3v67mC\~65ڜ{.@[@jϵ9 6vt6ߨ؋9m6'.mNG9K# +fy %Oqh8]զ ]g_j طݥn8m:`*Xu٭ͦ<6}i,tv6;fmd i(*ԁnyy6/ w c^!^| _|CݘWa E{`6c@aOh+g1 L_"^A= CoկWZƽ bz |˽31?]}uxF竈1v^^}ݯ`ڼCYm 9oh7ji{՟G|Km:zw^D}ÞGiI6ki6A\mO(mm/( wt8J+R̻Em/VۣiY uklu6C#i{9K2ʠU m\=qGߵ6_YС!mKVmk{S/[f׎6Kac^W <VAE6g0f?-nvοjhm[v'pnvnmwL6/6bc<|d_ ]/N مs=alٛmX+ak>zl\1yni߁8U×rHςj{e4?2l{:!.&Yqp{p #d#$Xp)n!;J߇|o~g."\bDljwfېK<ܟu %Zծ &^QC/u|=@ń[ԝ&ćME976 Ð9x0s_t&u;=DH<wFȪI}iؖ<#G =/LdǾBOH*iy?SSeg%+8݁`o!5eݳ0؁dp5ۇbo| lvGN/B|![WzZ:CEYz^ !kjB'=xPp ٝ+c}-YgDkKVO8j.z7/aWГX˅Get+OnVCk ꏒ?з%oʝю ~Oݜ@L&>tFӌF\BCrG%᝟|(d5G w/{ ki01;?G~Ln߬Ԫ|-j[]noyB4\#wk:ܕeDzD@HP=cU=G̞ǿ(+{?>,]w":Н LW]#e==N"}#zw{O=8G<2_<䷍> |rdz8J_駾+S~jsfgY줂ȢKgy˞bWMn>;]ɿ{M>ͳw\zEΜnJ_Iv$oc?Bot9az;~zUFa=g|E 3N}N%s%7ջrp5f7yӄeӝ!~ݼe"+qx^ } zpz[ۅwPzd.`t^xOӣщ06<@WǮ̓sȃqYg:bz{,>93ԧ fjjеgjZOU&56+Ʈ5:XզFE'17fj8]wYjxAM{QcjPIoKũAʨp0|TUc[jYJ4rϫz5֟.]_kCvѫYvê, Ը7obbjtuxUc| 5SjBMrzhVSjUMǨ) TSJj*CM窩u55mVfmrUSָznj6q^m:5 YdȨ&T5mޢcytཚg3d=ZMsi1G45Uӂd5@3jz#8˺q;55ERӾjx%'viae5yC?ixUUS@5 BjZ@M{#zUSp²_Mj:DMfQӻkj:VM οț<\ܲeTjnVjZEJ5w^MܱRsi `57;\3jnuyUsD57Y7n?5 Vsj1Tuޱf?(I|Հu~ԬE Mnţ[͵s_5W Þ̝cFNN tQ¯Su\ާܹ{g75M̓yCͣy \vyl!5O|WfP~gW]jR@͋y:5Fy=wKz5_~KLQh5'}eZ2wwZNT˟RZ* RK/j)lKʫc25TlT#UI .2UK{SK}j Z5R/oZMZ-r꥖=20ZURːUj]-7Z.TtfW$Ȣ2cZ!cRhZ0>06_rW2'=>jYY-evujYS-;y 4e}lVˆYjYS-۰E-WN-~BN|P˶Xm jYV׊(߫śyW+3.c\U`rxxێ_WA6˦9^7~"cLHZP79c;ϣeFdncmpbf6s^`V q9t[2.EBs1Z7Y+\17o9`rF FfU,rzF\oE%1E-K4wi\7xZn}Oٹ~.mobEעWL C {VU. kFr r~˝x=X?A:_-gE`ԇ5tylj WȺęK`"zǾs|o0x4—;Q|GE\Rcrt kw8J#/U-AظpȍC|wuי(p}>g1| Oۧ 'Su.?Ö}Wl N8w 1ˢxjA>x_7/ '~ꬖ`s|_gy eQkzjZsUk}jTk^BnMSkk3 ١V̙G@#]_Q&Z 4Ukp TkA_PkUjzK GF|ChPkSh*]QkjmUPkBY_쏇l]^-_ZPk}Qk{|Z;\dD^$c4c_qj6P9Ξd<Lj6tx)k 6 w2{|s ljF8b;e'h2. bC~Lj햢jxqZC#hï^:Z=NuaN7R:uF_Yֹ5-P6.עj]LP2zVԺRۭK2 j] Guq#Qy37=7qYmynպvĩgZwކ T p= Zj߷ZodCLx,g22z@`DZX{C. 8FcW41AF:<7c\a{4n`^"2[l(:w 𝈬$;I|'c)jMi%]i2 3>!͏sY[ jT*9(1rsn9ǣ?= |IG5y6! b.>'CԵOPS>^D@}xK/!}g) 9X3F"<63wCsԖm:|S;nsw>+w/fWw.rO]nB\r2]\'F]NݠFD-j-z:}2c#2nq7ޡ?C~OF>宍>}z .~Mq n⛛-ƻ'; Q!|W;I.=wgVp DjhzQ=߫ 5}@+߀X:ْ/bQ Ne^?>2w]z˼&9=~ayxEwޅ|ӫN?\;oCc'e.ۼ'x*^w*x-睵wڼy[~yyPD0GThD-y3 enP?{n o _c#j>K Їw~^7oг1@-›lŽA[z{){oѶ+ҞoEWKbygƖweGH ی=yզ\c[7DF.8׈wBcMِDmROM%y3VuyUƦERw|.j.UYUKKT7h+ywVƹj@ KYY9[7Ti7y%uIܣRR[Kej)J{It- J,Zi0RRiե9WXbSR9=WU V?TDn%x{]T n3=60g?co%ޟZieqY+SKʃ+įc 0UERmVdij)λojT zj[m|Qě- 5%ĵo #qژwoS ͆MAbўmgtk?L~ o}o7>o^{=}'gn׹Z:Q`wv{tlG]hGnQY mo`KS 1щ_.67Mw3rE&Fp-vQwZgс7<)t7[}ŧq{x!5v ܰ8~Y& ȧ_*1qjzȬKķ0_g9ϵv6n4or## ^İi'-Ko΁&Ժȭא Wg|n 6[a~0 kִԕij:\mLb[=C#Nusj56Amr1ߺnmpS k:C̓'u9_ ݪ/5¯΃szvePݯ WjW<1ȷ* 0\ ?I_bA;.Pw`sL.:I-1o6K35{D͟[F5`,Qd$[tC<Ԩ?\ؕw9AܲgbS;P2SDzo6|gT5 SƢ>l0e"sI j'/:P5#3Q\$5_?rjN0F#5mCԼ']u U6oM[ռަռs97?L͞<M5jf}5k.5ȭQ3 T͋|8j>Hط2?WG65A{ܯ!jZ'$^͍jI-߫?ߪ1[ͭFM5r\?5UBMojUo5ŕUӥj:}t&45j%iԳ:>PSj"M fC3԰ھVSӬTSWjBM9[bx)UjVllZMswuv<ε{S[_ß!uV"ٟ[sEC;%Wq:GFiN>؇O.Nj&hizNy$Wgn>XvNRױ.[@]/suս-YYQݯiDfDkD1W#<ш}5bLX#Ո=5b X@#11F'jDhiq;5bh)F컬~2›0"_xDwekD >hգ:A#R4aVH,ӈ xA#.Ԉ_5qFdb̎U1FqgFl4,y`O::,24b#pc-a70a ш75b=z̙_k\Ƴ6FU1F4LԈ5whL#҈5v Ȅ]0ejiD4"cuI?>UjN\4<{vЈ5£FsQF٧jDJƦCԈ8ge0zfnN:+VR|*M]]V+|bkVյUW|G/9]Gãz@ UP;Q:D.U%PgZ%u3zQ]s{RClMۧx3ԝ }.um٩[|5ѽ9\P]N6q_w񮊨FǞ/KFnB]k5JSWD7'Xu~Efi*Z]ժ=u+[ wy|WW "/qzuWgQu)5x.Vs<|D^w[ԡOmհ:Wu.=OS9CmΞ+H @-Ckc Sejg6|x>N4fu暧4U+Ұ-8 v÷k+ 8a_5G /:Xs+wܮi?5<ȉ]Xoi&͝4?D_ގa;kWiö ԕe5`z9]'j{:7'R1ubij2Upu%d'0O])wluwm.%5L]K|tfuRuFoQו0u]+INbr\V>D]?s1_fu>A=y[@]Ꚇ sU(O+]]KZ?,kQɓ{E<]5v!+e0j4SnQ'8w~Ïؐ/}LO%896gF=ө:=Sg4<'%2jBu {?}թy,XĻ uܪ#O+=˟A]G{3uSWcPEݞ]q_^o y m] &NȑJ!uVXC#(`=GolWԹojJ4u—^#,C]lKLXB<gJh:/&yduDk99 'W{oNnz|=cXR=3k2G0RZY:w5RWE7ץ.oG-ziͩ܁٩1E]Vjۜ ~fen0* ;{^BAtB]Kk5{INuEZ%Ww..GNL˪՝=zV%Q5ďQOSgSl>A#EؿJ]oVrľ S//)w~yiVwb4 dn;O w]U^} ;W{Fwuw/Uq"z4S tܙ9NZ_ݫ{UP~FňYX|Fսe&>nr=ns:黲=B~ku)>~㾙v-=rSWY08ŔWluϱ!>;@]ݴ*6v^yWQ7!/2K벩kyu٣uMɧk=FGj!,2GkDhD^4su[/%5zmu'&m}{e-CF[ozmF i>kkug@u{!=99ƱF@ g}XHگFgEGݫWjD=*έ!/zkF8%76zS8Ak~[˽8$z5.%|Ѱ\CnӐ:i<{zAj.ޤYݕEg 8E~.V5=wfeeH@4`+_׀|7ejEi{̴h@u+MlcտK.T)~WZok]B}QahЫ4 JA/ipNlW\~hp: RYeѱ9ZhP/ {4xI-ӡ6Lh~kK9lz'FjO|c_:g|_֩#wy ~q_#5u,(Bv\9Xu1A%&BuVZ:$ڝ1r:fW6]Scg1ulD:wSTu\>7ugT0NSǣIHإ'LFνq:Nī#;/o:ʨG[8sq$I']>3S#F=I% ? 𭥎e'nӾciIuxcm:yVirQ/]ms/_WllXM+|]ύk%"ú5Bw >ۦ]ðý=`ڋ^|t Z9`(pr<~w>u͡[qe 6Q'4$Sd$ߪkH,R0ZC Ԑ2_}4i )q!nԐ hH6jkϏ@֝{s?d Fwh4$Kye\q~F缬_ְ/?ַMXGL^l_K5D% )yMC*OZ>Ԑ:ȫjHy@Cj\Аu iMhH̿>hH:Rժ!]9|~4Ibhg 錯Z<֐{ۢuӐNX!xc>xk!mj羆 BeА4dgam4B~\# =٥ҧ |R4d :o!ґ̐읇inF- >iyZ!M+8ZΉMߺ7C>1-Ӑ bQ։ߨ9mՐ^4d@s_zLCvX iUslqWt뉯ۅ؍5U}G56>Ml|d/iᇆDY")~j?C_Ԑ*¿_ |8n D c_Uw<_🁏x#(þTӠO|5r&DfĶ1CLB.2;"w8oVЍz<jH}b=#.|9ب. RV?1I!^ݲ'VWX'Aw'85pА`eMNx?O$.Db3 |t=au Mu\!GS`u\^Ӏp5>|93i56f[}6-̠dž%s\Kрmc`|ݟ6ߢD 6>W!x%oyׇߓəݘGmxE-/zp__a394>F![ɇ)ԏ!ԕ2\(# v4GS8?=َ e #^&,Z԰A`vcw|RzԚ<[f'o2 ? E2cfC&tDgu5[ѧu }cW-a{Wm+fƁ7!Se֐5ԏ/t9ۏ{wr*K6]lUG׎ԙ:Q{v)MFGJ1"ySQӗ}]wr5%kRzIJ f'$=#z#xv܅Nޓyw񖊣Lz/,ze7=8 wwxޠwzD_z;_'2~-;oBry&}'==zȢ?{{_xC'FyE^nUwx|fC]~Aߢ{y#HE|w|'O'^M;o.׎ݚ }ztzɯ'?8?¦xL@xzO'~A.!6>F^ >?ߎwFsҏox[Vt~׊>+:6Mp1z˩coqf[͋wu{<́My'ӫ^L-xrȻy zLW4+oL5\ ~[DO C QwLMŠ4xI. :N51<`?jpnkpŽܸtj4`MI\u4hp9w؈5 IkЭ't|Ԡ۟4BР)mAjy-̫AME߼a~=Ahg-A2k5^Ojwkqh`G \Ni8uȣ/5pi \T=Nj G kvv~oizj Fgf4AV j`[3VTK쨁T" D?֩$?~T?UjԾ;LrhGTj?Q6yC{MS;=vGwq4|H\ S4ᛘ`Vpgytօ+<>tuX$c?%mM|q9bz&U k{o?cX@q"fs'}cq`fU}7q11juY2}ڽ'Y>3N=}b Uf,&k!`)9jT }l4:9gyt O0`5$[עnxY+#rpi|ު}>ƶcT04q3F_ 9{[)O3gk#0w_uӾޘ|oϻVaS{;#KgX|I)18lAi{-#C-v[_|yR7SڣJrތy]eW GR#5/wk\IG$B-S.Ms]RǟE}G/g̠]G`2ߝwm~_7I,d_wm׹ ~mbno~G߭w*ElQ;3qS꿤/=}?i@ 6i,L6_6Դo50 }ҏ]jIѰ:jެW4E^.п i6[ B5줟ʠZO)LwݰcR4b7u%M]3|:֪kkGuϤZX]]r&LPwcFdNӈar/ʡ{>sKewru?;6uuTRͯndWwͬ.gV%J]7aV`P4u[սݶrnw"ly*h{Fn[[\&u?ٛoTUb4^ݷ}?\Rwtuωޛn[uS^/1{!:Y辣c{8nS_!S^ W-uNV'/퉺^ݧw~Ո"߂y ԝxZ:4"u?Fas5k^S +uVWW~a15Vo5l/-հ!ֱoGF5>hC`.K*j;J!'(}@ a![ jjp7ju}|gg!5%԰3Э6w}ldMpǞfjP 0X aoYl)6p 1??gSmԘ?5X Tn+UcjWukV4OG0VRcY|gTc›11y Zg56do;16.diS8Ӂ o>@j[PVc$hߔLPcPb!ZoWc]UcKx:k9jL]bl;g:AK i U_-lb=Y'c+Ԣ>Rv$=?ee֙2k =Uc}Fv;~tg{Э\·@ƾjd}a`QH7ެ{8WwA5.C"j9Zոl-FBj 8=Ը%e"כ~}qXӜjm l E] +1X0QF0gSb>[CrqdFj܏aokҽ7q1 ~zLŇO0'~E9s:,΢5w=Nq>Xe썞RԸ {́hP|؎_V75 `j85nxƣvq;@H_¦\F#6<_6Osre 3' 7K7y&V^>\!w+~چgKaVOov_4 3{쏂ѓf`m`o)􇏍8q/uޯ; ?`GQ!:;䅿/N/T$6AL}H||a~aهCw8:n|2 = .C}uSLo88`~~ _\j _F|j<Ξd",#,Xߊ\qdJ^RE͑?lF7#v&VB.z-Ć%ӝGoFq.!fZFZ#wiuqy]A>.>s.6n_搹~5XÞuo-Z:jκHFھzlB ϖF|G.PK أ$w}un5F/H26 LӇzg&GW~;zzr{tg?b;Ќ>>٭ؽ ,P(v[0ʼn5{'2g"0ڷ1'RGG |ul!yE _s 5cɉ=_52|S;ҾOxfSw6rl?7c:t[ U `w95m)zN&WgYdA0x5 ls2nC?|{l!3>pc&ԎA9GrQ_bB??z K0>go/|̦EUaV~l5c-5r:z,/1y#mx>`y W߃.o[E}&ƃ3=ԕ afϸ\3erọ,gKo K‡zEu+K벯Σ]wqX^تA+{+PrWZX8VjQ_ "}d"Ľ_W&W'(Km@}/I?P:R1~"֝7UJ׮ıq>+bij4. zpXzVEK[VO|Y[ܕ%gq{)bQK~E/jB pQ9njEyLel;~ܵdC=5z# k-9u;ė<9~3y' +}jv~=KMeQjj=@Mu[5U)u%^$~" WeF{ByC;5֗_ .ց+߁ ;s\>@< f{ 9x;4Z}\!nV){5饦\_ԔoSST5 VoՔ淿JSS1TCM5T:KԍJM3iNjZSMMi`|4UMsWi^Lƻj ('I{ԴΥմkdf~h5鮦eoXy5jڗzj⩦\t Du)5o ubt;wbjo IVsmjMMk)?UԜw1e\O5UM/p#_Tӫ} joljz ijsN5l"K\ilQ+j]RuUw[bOE51jȦj>T]k=Lͻm%5Ϋ+|ϱBOPujÞ潓6]Q~񋸫pf7"v}_Eu@!jfT MyB>jX-=RGqxqݎדKY#0ϡ gR-ĵRs<6URs :>Ps|}^?tN͟2M`D r?SKvZZJjiv_-re@ZnfeDIM2ZlSj9K-jPKhK{j\Z".1wE-=7kQTS%yH-{=r`6rdvY쯩c OFx88Sj9sM-/cZ.>W˝6j;N-6n'.ZSQjyhowLe՚-QٍԚc<ԚwZ]VkT<e}Zʷ7vFs*쟮֢+Z|Zjj-}jֺj:ZZQkVZ.kٓMzE=UkPUWrjW]T6i־W:8׿~)W]]1zt:-!O7mc_g#Ξg6u6aO3x4 mRk r> a~kOXWkExa{ŷW!.J0,|1|%DvnFĢz7z̕a|TZwBgbjtli[k݌i"28Ӥ'a2a"*[Z=,c(Ȩ *o`e%t`\s%)t/Q诶z~oI~l-˿zyOT ^ճC?ϪeƆ5s_wUjZw#/]QP /rcچw!c}Z{y ug9Orh1sȇvrW{&1׌N͹:>Sm2LO@΍'gQ>22vyov=͠!|&Ǔ#= c%.gl|^"8;@|+ d| Ǔ(tDg1]Cas1 7#(=>$x/O`o& cF6 %S'RX_*Iþ68xL\qQP~Q[++eꬶ]ԖmrN1cC9ՖkV[j y_&vQJ Ji}jiu|}z j}e쩶>gcW?_w7tzecn#܀6Fm$rI?u<~ T۬jYDme.., _{Sj[Qm mlCԶn ukA]{!b7oaFlmAO3W~VLj^ ߖK뗪m ]K,j?Am< Op8;6"MmZm"&S|18Wb~0v|5[fӋ\LEwEV{=3N=?<3 GWrl[[mbt^<Cs7qPr|흑P>'>ȱc8&+!2Ws/.0KCas~#wsغV;kOI77`uk|\|{v  f@5 E7ԶHja f'oǰh9G`#qw;{`ߟ -s_m/u /:&Ϣo-<'3]{ wN]p ]~I qPA1WA|퇯{%~Mčm~]5j/sػlOamD,flވ-aԩMesUp.:jFb!]WSSWUؽح` y5Wkn SS#cFNy`$M;w R ԊѬ =Y#wc1`rMK=ǙԜIɜ`s*wm1LݙJjF.9>ۯAN3cn:5x~ӹ9O~N>O>D<&W?;pxqsfi`nB7Bveʊ"y[[J+,ȵԕK}'}CO^}=z̛=AOvwoez[L[f4=g˛=@zlC7  a V}zӃuz¿s?+F]7@AIW`֯TzJQ|S-s 4J-O] Q˻jy/f9neH,Fv`N]aw0N|sO]p7{v~A<>\^-^~6߭3Plc|0݂]3-@UïfX 'fD]2~'  gcu.Bv\9B 83q`g߯.fr!bp<^j}U-rb?]C6p|b$Nunt-alrԍn!"؞؆ #qYX+c7UK( ǧW_;sc~o+XppF|B}p1Ž`PlowxQEv޾=d\'7:F;0oYlnκ5K\vSW"G89$G-Cɇ @oto/6gL>]?֊,a9>^KL-ԁ|ɯmx}z};#HmV=7CxlJΐ>??l[y0aZVQW%d͡.˨ym>qA ,Jj9 |9&Ɓ#nf4)mafmTh?3 ~{2ߓoF=<ȧ|##Wϸ]j]k uh,>ׅx:}3-C}$FRsBԙiCf_+UrSGQG57,ZQwF5W͗kAj0BW6E͗]ۥo|Ca|0}9{Yͱ9ԜPר9)Rs^5ǜTj>#ZAݏԼúy5o Ȥ4اk#ռ}Q_mWj_<>@ðE58j\ Qs8Qb'5WӮ|jrUmvP!?_MQj 1)hBwFM7w۩w5]MT^PSj=I]MUo`M5~ƴjMԘR^O[V jLj|P@@yxS#2ƨRj>U]/xxoƨ8'iOΟR='1{kȝOl9 /y^%ʙsJdMhF-.–V~Q{|ЃO75^ib~\DeQcP_~wo`U 5>"ww~㌣g6A'~D5ut3zHh9=8DW$ѥJ4Kk%bAgy$izLe\rnN1ܘhrcD+SNnɍ[Ɲ}r#ȍr#*7sȍGIr q#WEncnw6x43[ȍJtarY%-YZV\+rJ}"ѝH0]n" F] SFp]yrJܬTn.,˭%rCE};E,Kw{/˽srqw0vJF<؇`*^$qjJ܊ķF-.q}* nIBOT^}S%]WI8zI/l[$ai$*$!?/%N $nw'EK%%iIK;$}/]%~_HTexIxDU=%()˝|WRzV䧓$y!.HJ=Hjs&)+J~ITRV}#$5yݘ.i$3$}$yطWR"Jj\"l$D.I/j/,IOKb5cIZDl g$Ih]G쑄R I3B7aoGm(R+.q_;K|r_8z@ ~bğuNh# yI¨tIXV%KBP1Rw qTqIhsP$4I0$LBvOrait$d% & H6DI$6%HbI8-Y$a/_6Ap;1|( fbn$V'#KbX$$ +Jbr0IܖGsJRu#B^ K%1*7$!<Jӛ{J|&=%iUI0lߩ-$vrwM{/1 <J&Wc|CνRAŦowI$d-񆯒vJ'lȗ]_$9$mOMHDCR[I U%C{/6I+IfIE^TC.@nI*LTfJ?#KbVĦ9H3$4BԖy&ILR~ޒ@RHr<󍤜%m}w)iZ騤-iP'JZlRܠ6,rKtya1w]?I_?V  %b%es1I^3`| )Km,OI^1OR2ةw$kI+ý$3I/Iňum)߸og\$ ;%yIX!$iSSz$*׋I轮;'J*:ؼ6'?|/O'O', @yw!飆+"O^naT'?'$yAj6Iw̖?{^y= IH9<,:]ҿ~IzI#"'J5贛7⟱w 9$]I}LFHrkATެ[un7=$[8=JyX.-)iu[FK/ry8"w8ķ+Jg%)p+J/~ؠ,x<(1KK̺Hyȯ7){+R-%aN%b$Į"){kJAFےZ>}QI;#)OJr{j#CjG$+!I=%I }KoAM*sZ;KrjtdA_iׇﲸk$d*?2&Dbi-|k#$&`<.%>}x}*^pČ%13"j7).I@[[H"˓"Wxh$13]~2|6u {rR=7qr|vS};-bKȱ{s؏r<>In+Ǧ֖c^)"G?D9-Lj QHTP Gr-CƯrx?9lSOLqˁme wuS"$rK{DpȾ"(Ւ `r0b90"YϹ/%.Uˁ_r`9o#ʁ_dÏX5&ꮕHw/;r?Wv*{[ wdי$Z"Zbq)nOEuq'ΥęG-^gI: +þHȗEr5푐6$L+ M+G5b'H 3TG%Hsn)AHP+7AbK]jI&%pwK^$~|wFۉؖ[bIl5ʊF]~^by]{5tXb/ćb^UL_1.ƧgT!"b|YLzFYn1Ímb$01l-M0rtK1(Ƣ3?*@ v.;^'gUgBZ)>ħaiC|fV-3TEv:扡&1 êbcUbKb7}+3_b~M,͆eXXLGXkXo MbUɓVJX>nk,SŲXn,ʅb@,Ƌ%*1]$żfC 1b]m~A 촉xFyP̭= Gb=ꘘ31=*b:KLst/tXVLSĔm*1_, mTL>%4cAU2c!1V_.X^\cb̲Pe3gocdF1ST1%+ļ_1ѣb)WR,Udo,<|&WT[ۊqKĸk-cbxL qEpԓ3gGeby]U|ROiU'!>Qdg}#;kWd b(F LJ[16/54Kb^Y,%XAŚY#KZX`*[Ome'&[b}X?[HUgزLkbmUZLkֿZb03YO;ub{Y|߹&V)Kpd] .߇cgqt&ı8bcO%8}9(K**vCMđ8Lı:Xwđ:z;JpT; 's{Jp 8_ΦH>O{H_Dߖco!qD7ZBZKȅixUQE<,MI|wb-%zt-,A$rk$hU =I:Ε%x$̕\%A~$h_˹#Ԩz%;I~"% ,ۛⷷBUElibGSފr{1Y>1N%BsoeGcvϢS);S˶e[Qurl)I6/ M1ʆlQY?>[_ֆgȚU5èvTkY}aCV-gee)ZYq~RV.exwAuxO+Y~,:H?&3eqdƒhYV,V,˪eeɲ\4),=QFm+Kt],Y:Kei ,@Y#Kl% ɒЗdI)Y2[t.K%şe񰑲HYd)5EuG—0,N daHfYD. GGeQ9,Q59#2ݑ'BnY\@&/_zKfNz#3 e&}jdڒOfōٓge2{&:Y! TY=eQY\.O?ek,޿,[o'L& Ekeх(Y/ E?ˢPYRQU"EȢd/Y6]% keaf`GYho u.ʒ^e1Y,tב eq,A&הeFFYrB7_%cdɊt}kY2\ ewKdY ,W_玒eD.laA,oT,˿)'|=&ޓOwJݯx~C ŻTKH_z$m~QDY, M?-˓Oīxx-#Mex/= [Áb"OV ߙCVh"+o£ZVVX;kRdEa_YwPų]"ޗ^Fo?mSH"ūx8/^MNJW,7y,3S?Yzxu"MȄ^y#_Y/yf|g75W|W !^]-,^E]Ux,^ח< }q<,T+^7wv} zY/FVɊ~EYiSV>("sjeqRZt 5e-ueDY;CRd}YlG^6^6z MG'dX?zٲ2P$}ekXzl+EM(܏e۷K پnlZɎӠ_$>wIACe[b0wfO16{wS[b:W^̽^K28^,U;b]{T)=֮vM۷w =+~~_}$~W3&|M <Λ`fQ9*~C|u ķ]E8#>)o~.k*(~}ߜ(k7S|_y_״5x(Vb{HlH5i-j1w@F}YVZ`Zn &<}=_jbFr=bؽ;= 8  K$a%~t+T$ASR%(r}"I-Eˉ+!r6//I3k$u 7XfggR3q $]ĵ- =~S$D'xf]BexSٺJ\y"{ey=H"se}˖ʾ]oߨzF;-8@X9-WV.[<./ʡM䐹X.B5оrSDh%Q$*DM^!Qɡ[Pr[9x球^ rT9XhN,//dh}V;'OdUA[Wy(c,s}˾U$tܗM"CKADn(cz]eew\;-I6+{{af{D~I"ȍ$@WkyUM%e_1_S#kn7~Cr9-U&&Ցkȁo5m4C9ȡYP\Ej.QuD=k&}Y,GO#r$9o#/{ˑ]5rv{9#G-#ˑQAr$CN'G cU˱[_C9Q τ9X9Q('Ndxq9yKN79 3ӹEN}&>ɩԏ!rjq9uAN\+';lrmY9YI{c_rʱ9}ChrM p@z&W+)doU%ٵK"J^< ᯚIxOVBH3LBƯGR8gG/okoԮx&Ip^aw 0]N%h& :[F6潟m{O.$v82|G☺KkMp<GJO zFB>%7IZGBՔe%tZ \LBw%4 S_ kQ\Ki{#kJzG2Irު-$P 9/6KhZ(!J%!kHp PB*wjo }PB$w ܼ1Lggdy+!Ih;,KWf-5OH?O$tn% =PT PB7א^[M냄['OKb}},(aφJxGb%)qf,)&qN.Έ*Z^\#Ίgq/*n_Dj&cI8ٕzMv5:^ ^^ٽKv?"{r=3ʞɲQ [wگ\{^"7;u0ӒTt,+\yrpr7XyKT5nD;#KÃarx 9ܫC;pr*9l"CHԷQQ3sC YPhq9<'7!w\}J 9=W{N98m[PrY}9d+QY$jJ?j1 }'pQr8(W/&GwcgؾrU<ˆ`"((HAPĄJQ1b@%%H **t$*Q3 }ܭ9;==>]{ ۼsنs;66:ɱ}Nlly=Qmm)ef[]<ٶUlle>m]޽m5fۮdٶYlJqACvmg{ma?`Ƴ|e_c dOmg{ٞ_/G)cO[R'GپIl_#|U`dd3qMv$ͬѷ\i:v#~";~Rh`Dž`_me_;`}ɾ}}b¾~d #>-d~f'qG;aNE&e?1ݶ;6}W}_}þS`__ f`ʙ/z/ O~WW Wqgٗ*W%ٗKmWGKd f5b]bN^>fgGcv;d+áIh_`ءi^%vd)/X]%ɎyS NgGCMvX;Z%pvvhvVˎgG]ّ(v`/v`cvvȬfف&v0Uf쀆.Ԍ?kMMPlm2a-GL~xaBphwqسSZBt=/PP8A/cp:N:v  1$ :!aڹR-C}w$ W!ZK=V۫rJ\q8e6qu%c>? 4W\y~QܶƂB8ۃa m:"`In7WR-mTȀ6YR u;}~-_A[a "Ě_BBf+AH#D4CR}|[{3Y|_6Ct38%7@Zb`k_=l~=tp&쩌.%XX ҂uga[a$ PݻW6![tDž[x9xs^`+Nځ* ,AJ0hu3d"K>ށPŔ) L,~{0(Qp Z-I >uq&X7%hF9/2%As,7Y:8-yvdN01a~iMnO8:\hoo X-ܶvJNCRqKWm2rŧћ b!@@y7>Ahavi ^J(I5{b#xT/.ޒ{';9N&v4IsmHӄLv;?s2CZ9$ @r[oBϭPp3ȷB% \ / BeBпHp3%@&dD*٭m+jx2%`!S ohJسw Jzx{w"xe \? <ޗ{P;8·V`l6`!aF>k!±P8,85E=JYv8w4pKB 3`UR0yaf#M p.i\V YU?t@*ַgAx!` E`x8-`oa#BT@i3 GyD!, 33a~"@ϻK[&[>0ʩmS \+YYpq+8Gӧe; :RAe({C3MgVq04]`¤/e: xi'| ]IM7!Il6fNa4y kOek PM%ՠ~TgB=X{Tf\fZ>1X4 ._w.E[ /N%f`QnّϰtւGUUaegYTzgR0%LG+l= 7ɑ0I' 39otSf4){ U}q.WAf׫̮_)53?j< uƭmb<&v3-9rZɗdv-eBU̗җUhoΜryĬ.8,>p|y]qe$+&k8cLJ%I]]aN ^n|Ȭ?]ҙg ÜoZL4J?3߀Y{fG)jj?i =p^\T' V(gFWG=?~hT q/:/6C V~,Ǹ*7CCJ'0w31f^>|2+1Fa,#zSyƇ73caϒv|d{K:J_ME=^z :aM9DõؒWUX(|ERXo˨M~A,zVx+ "1p7ڈ`2j}b{;ڋ\-IOhodh1yӾdޗ d*3?J{U$yt <9X[V%L7:CF#+p*h#oɹҜ ,vc MLǶC^M6yݛI>.w9:IZH^ ;yɭ.'o??FĀ.3ǜ蜖1t\:dJ'gЩ䖡I'[\rТ3-N,[B ԕitV{:E'̡#CS:!KF\lT~rFN Nޒ.5v}[h7WvXΣwhgd7i"ڒHP_6!gwi<^#wsH/\C_~-GLiaI#iZʐfN{S@<`SqEƤ)BA9]N[݈cVITbfa LAh#DsbW%LZդ†g;GHg$ɣKZބm ں rebSH{E޼t3Ho&wRd{Ƞe%72ٸLV=2 Ed2ŋzA&dr:m[NF86 IOliZ⭟8J05o%MW\Hs5h91:1aĮbmGltnG:tBH~#9ޜF=<^%MH"u3H֝4ty_>mId`t l>0UݒtH7HtzMIgv~tހ4ndL2xId@d\$+Hg1iwu.SEz[Ht?ݦfd4%ddYKKVz 2ȳ#_I499dQHYt ~|2/~}p 2 |,-pZ>LR*a̾G/gp)>ƱN;.Ov O-!kp8Œ` oUkD?wƮKmxO| v»ل-~:-˿]m8 6*&XkN@ѹuh@yfXo3~aex7,ebٵ&9 `s'^5ī;=v>ZcE>)XbŢqM,~ۏa,8Ea;q9kgHE _'1+b~]Kcf^}K| ,݌~yXp hWcQ ?{7c)%6X ̱p=̫13<0Lm`Z L홂J1Cq.fLjq?"◰ z.`a[,"-7ˋp|abVJ^%~GcS0= /`p| |rK>p,y#q#=qf2Ӄ/Y80V=qFb*ʼn%: l__@nД8KSO#!$ɟD؏$jKy$Ms_e{io4$Lb{iVDI$HDuH#ӬWh,"[Db9$ DY}K3x}댫=DIDKB.4ub .+i+HgrIr%ɶh;iރ4!.&Q5{['ؼZ#$fZ}ݤkh%-MTohZI_ZWڏi ?ef5^ci$;[7?FY}ҎZ$ڰ$JՑZvL''ᤡ(@iHb7a9O[^O53'{qZ4v=r2Y+&<YF"Y&߲dA,Ce8?@1{+9wM#S|&\2:td'9"r(@Oӑm2'#,$3v!S6$Bo]i]>BB[b 6$;Eßh|y>3?G,pLoq!|~_fD;cRG4ػ8ֻ_58J qpi|Rwh}pb pԜ'y|pC?ϥ3'>jUv~ߍJ)? ~Kw=o6,<7&gI8uN9.J|i/ppTWݍcUq(ۊEek|xoԣO>뺩I{'4+%vW>/77^^OKj|wF}:c!O/|9'C /q_>Á B-wvb.qxF.mxo/lS/v[EX|V VzaBĶX7kNjk6#6pri6:;[Yuea>%daYΐc>lS[yW8`{$l;mǎ,l9+clS; ;E7Wr|p5^GU;WW`ۗ=x_,{?/kl!h`Ol[ͪ"ؚC<܍ vt:`k,/`&Wl*gaЄ]Na{~"vuV+<3lLJOA}#\߆h"G =,u_`'vvǃXQ9`uM^E>:bp">X<]`GkJ!n&p>QANM8r p@1n7pt(+ovW5Z@6Çصb%6J`]ָM;&X҇|![o`x_Q\-Ez,Olƈcء[cC,KkGRlbZXO%s' ͗RL[`~{ oIի*?`O]Gx,ݘ2PIߧbUch B5}X`Z7r[`ՅtnYxg*x=^?5y%a=EbdiZkwߏ ,N~ǒwVO a>cc&luWݟ[eaÒ?qafe|xN'B+%%y30U3d~3l.χ''O?z+W(w\Cl#dQQ\+~V3bj0 A׿pFANr<7Nwa6UY\u!FӹG6冧fpqE7lZ͛z$2啜4ݪ~cd̼iʬXE o{&*I-aJ`\0!7"?}i< tb&`ҫ2crOaشN.#:,dDe^3erq x,(|sLSQ' 43 ta>b6bՙܕLsIn6Ƅ0 9*'`<+=څK)BQyoP r]D(E鏡w\W*Vu,{ʃAq(y>_\2{য>\c͡E,=<~%3X DG!mH,`업9[d>xsBH߷ 2+T;%VpJg0܆Q=pX >KL  88 -o=7aKw XpeaiS "uHQp[ e  4|Nn{`.h ^-b0w)O u1oSAk8||>CxIH>r!|x3.l̟5d 6}r1$X¡3O_+> C?6[Q#))DBpWnyݠ&8xM[Aa;\KNyB׭`|p(x݁L9[njsH(' > 8sE"B0ӳt!}r L<6AX?m}tx(sNi6 `MNd~7~Y8{ GL0{a1)0˂]s6{Q>0ER0_ Ns6,H|KSa,g@e$,?+ f\r9;jU^d|m`޼ X ̗`Δ0y"li8jx^UOGvr>HW Aa`\'̉R3igp8a | ڏUQ8o+ +ؚ(oC6aH& .6oAz8,u^4Ls..*0b+$Vf;l9p{8Dŷ`S`۬pzn>ɰw/u7b 88j%M @I;hEkGb H,C`V-`f:]`t=l҆.6gܴ;-=Kp"nఓ%Kr< vXBA$v31q@X'I}  Nu70l45}c2IކyA-gwB2es5ٺ/΋˱I[ #>aϻ\ q>B0P˂8>!k s6\ t~@nx=3BZb XG ͒ d$"#?AtmYS !i 3Zea0Cn\6ŚE|92 "'xz;wpa>r 턀"t7{ ;!v%N^ ދGc\υikx6#Ƿpi_ gx.c a3D-x d7 3o+b Hq.M E#!R& !)vO=ޢ]^xҤax S-A$Ta}piW(kh=o`9 edc jG<\-`; w2p* >)W_?ʃrxCp81pXFdi`pP7kFF EXb |>ڬӠ=k^y1{Så`Z @g藾=ue8v.=7)ƃߡS{*\ . zijK 48y^\So!Z8,gN+.žX>8x ˢ`.pt8:r 0|*'q3Gyj /p0nW00-)TKkķR%'p`:0?烣 Wo[~03pg)/w䁞X$kÌk3oRɀAQtmljA]Syu+/aT?W޴F+VUFhG7E2?zfעX{܅?j&(iS]trW‡\6gܵF7k~>nJURz=7{7JrԲK۸yan \wAn@jŐ܋\o4.ZnVn袲 9m(zM;J[B/3Qzb.:cȸ;,ٟ8}8/Aӯ8{գA#*?GR8 mQw"^21fF6b:Feb0fG9a֑}Xv#~ci e԰fbq,.B8= it:YcwB lɵڋbσXχ2XM6cmF6JĚS-8Zt@[lVMJjyqBX+z9fl2ͷXa BO0/Wwb ,ux3^k&&R,ŎJ]ݯrh2{s-&ˑC[H6OSJHd*_JM"GiƳ;$hOWIdOTMi4fukI֔<-SѪ=ImENϢ Ji#e㿤\V=@_kH0-E:Gm%Lfd2jG;?޴+Ӯx9G{^ +\?6,֑իdgEV$i~Y";y$Hާ!t0&iQ::Y\qgt/uÙEtJ:I9]C rc|{rB]k$q1u.ZMۦa\BwȓϚ)!ރ;O!ByT$(y馑=y.$S{yVy<81~:c2-V' tzlr3$WvZ޽$ ):gxJg8KϤSRtV |E'ӑwy<ϠRl6U 9="'%1r4Kdӟ=wЎFmOl6mPO[n#cO]i2a#ҟa@zO`r2\’=WQ"M)iz%2GK{ČIGg i}EOHsY<ER ^LB{0ivjgy'yAS8_=~?C ieɒֱ :9%oV;ID:g<"SHXi[IZV]%Vv!zGvQ#MCzNH( A*<$#Đ )m$so'j{=., w[~-r5K&3yc?NzB sgK}PNHUҌM&N/b;O@'s&t3%-$ҋ!3H!#Ķ-"-؍={qHgQE:S֔"mÅDz^W͋ɠm <=Gd Hw*餽&C ^FF.dh nj Ji2$%))MKhZZ%m2DH))٨B#RJ ti!ZwHIaZZD"oAkZۿ E(,%V#RG*'/>RwoM_HƘԥ\iޟ[;JcIʌT&VZl&F-!UlR $H->M yi9@̟ꪣ<HuKRN|7HmB؛r-TEƤChc Rդwo,eR{DʪhmXEJ<'In%uے5Z)GHBR+HzMVOk;H>q>"a{Z7}OInIkM#yf/ɝ8G2IIohE^-SEiY$k[H*8$r~A"B$z% so26ې4&]IV64$|/Ռcw,|{Gsuľ+x?~]=q',>aUycORkXO]qT8;Hd 8g?_.;pp^fbߧq|y{,{ϛ;X jX- +c85xx4KJEt,؈EX4g+aw]?0j{'y.ЅVX,c~Ƽ/SH)8aQt?<%e̹Յ1oV^b=X؇ 4y'a~l ;^=Ç0)R]0YaQLj3¤sL4ĤgL޿19Vwk4LW e-_lpS*^})N"~d1S0o볦l^ZWt/czfǬ٘#91+Z3 1#XSu6b:r<1*LzI=/0Qs'&5ɋ1~c$^lxa#'L\ M+L(]QL8yg9I:<}04L”ӊ\U0}SVts?W%C0=x 03x"(顮>,fXoNcv~̮Sn椴bṟUyX,uyXێy01g~[2yg`|=KX?1{=f<~L;7bMK["J:L*MW!w!v:r!WkWS~[^άXd%2^UñVwac*]UQ=<z~ɋik 6!ºhEDDKcY`br-֋\S:فw7beU3rygW0 9 2c&{%^men6}_:۱2 [|d`֦eb6lнMjql ŶD(NR߃WcǂIEe>vxM|-{e {w-<̰-;]w{χ{3>Y/'dusG<Q<:Ӥn|Qt_6۬q^ ~ ]:i4A5i"_񔦙"m$VMidlK玒`9* '$4&E"$zʍD?ǐXnpUVN"Ghz 6%Q4g%ID9H<N:LcHh܍nPXM=gf[~rH۟;ΦVa"O3~.'Q=7ь#$CR94/Ro[ilZt!͋ŧhyWZ:VKssHn5huJ$}JIieI" M4iUp>}@ }iCvڨG*Ju1&z4YrXAOI5b"YM&͟H#\4f~,h .ٌOVᐭ/ǡH/2#kpXoLġpdC5aS;ǡ8YOzp=-š8bGΟơ{~cA?q=}|l}7pX> wMp _fk"Ɨk$U}9/ʼn% ?ϑ6I|I|xV¡7~ Fұϻk;=mѳ]iO,CJf+RtgKm=vkml~eLl:<Ӱn}#6[Y+!/kBZNjy ol#qoh୮*wb,'|w•zrg6OK%u^kc*u6ۅxwp;6}hŎ?@2[i{Ofl6ͧqlބy%/==il<4k?6oa?Ǻ-l<;JcGrv>Vl 4n ۲#İ-[x>t86cVcU8aX+OF"Wl#,c X V cVa .D!` [NbÒ lڰE<bՏ'XugV/IJm[l"u=Vp K1v` cO-",=ȵĒ /iۈwafVbC>MĺCX#;-RŲ'?L5Iߝ*Ij7h)=寚~Yu+v\ Jwc ,0'#9xb*rJb}©kl];acpyzb4[px.vcޟ~ :3e>:z{ת`I؝鄏~cw|bbl_[U_5ƚ9X]7=x=܋/X7ƪMX# CA?6 +u06V}; xs:ދoUs;VoH?ƽX}MElĪ/Hϱ=8:p$Xsec^tNj8R>)Rw XG^/.1mCC`5F*#ξƼwx>KİL/ IxA3,K5bች[y}x{UFrL&/0v¬CgS1߿}#, +u jul2߿=d'cG->p[.0G {q_+k1>M^>lYvY@nV66NصXlÖ?/b[>❋,6hlv;őy~oJxn^wJxvz5a̦.| x^*[s?cTOr"^=q#.&uY؀RqZJF#'}%;pwf W(zW"g'o븹E\\ܭbgpx^oōf=îfHŅhH!/&McooanJgkr*-7ݿ,o fmeY?˙y[27f0EyLeo ӊvXMgLybSNYLLk LkTgNfm`J\$̕ !Zϒ1zaaj:B{8ϨPzs $ZΌIdjL*sjX\#|f\nf0">a=yzR:3By) F=sO&z+S˹\Mɬǹn߹ Q ?T.DĕU|ݨ u,,Ð9 z0M@SX4s7n -Nɡ=4ۿn~qČ˟o[aX6zmyh`&uHK`aR^}bnZK0_3۫_EL&8C=qq(y[Õ Z45BQ4[OxAà,a^c6#`Ҟ u\g>b,I^a_|#c7Gaԥ.+y^މMX>1`+^-ZЊv?սV;> T>%q;@ nwAE(3:t}B~w"܇yuWEC+M gA-Z\j \@k΂[Gh=f&ڕ o5HbDd]|4f?sKdtxߔQg3m0Ss[9S'TT3T1EǙ*nKwI[VSto8LA1(eKr`|v@PHj{ߕ-.G-: J%V)BlH: @jdZ)!K ֤CkATs38zQfp" N^aw?te^-  Ak!4r)wGC63A0<jM0Wv`]= |/8,m%3{z%~ N a&s:DT<+p:u.5~_o;BA[} D!G& @U\ON:xUñ@ #GaSd/8˖v\_y]$å/N0Xk"H9[ A bǾ&6$)_eʾ1-[GK̦IaL zig}83 F/=F~&|1qn\,9vt `,Q˙λ̉qYx1ߤ2>G'1xd=420M_Fc8;T5ct=}o?sWvLқ͌mf Ν|lqHͪ5ܥ{ Ur5ܓ|yKB\6 ՞\uqo(qd^3WWU~X4ksTpo?`O~UVbOm)HmX!Y<' k :AbP?@` PGS,*VqtI^C)\N"qW'ڠڙȮCҕe:DBTCŹFJ+_NEPgIp8}Mξ4ghN9S6zĽ]픞m:@k9 ըdm㸂y}5KkMPs7-&!#<-R W=ֿBH,[̄i42цL)9Ioa̓B`c?&j1&DŽe 00mƴ)F0CČ]Rf]4_c(E0̇yO3=L/=|; 3 Ga~HYa=^Vm 2> S@i ,yb ~&϶W f nXK.Ê)B2_^JgR?b {QO ,'{i~'誌–y`v^8nG5x|sr/s;4 >p\.xo.˚!8bv 3"k`~8. E޹vԇ} iۂyp6]1`+ .ʰ3h.,Zp|) NCcpzU82>,y5uhY߰k6:.nm`l?X>Q 5>qA {o y|˼~|g~\ށtm"`pvipp8e6؝`YhlV߀ RWAdXgԺO/a$ ŠqB%fq%Hma0 aFzY% `Id¦][LAS(܇9J 6Wg/A3,*1̷L iR aV&1Ú`Zȟ3LSn:oqi0)a)XãM=(HYkma;_#n܊F8n*z9 ^0 p Hk&fs'z\Ǩژ0^}vvbx81_Cw'|4aဌ$?f_OWp(P + Ƒk# 0V?n'/BN]w?Zc'>^r[ܐ4s k k}joX%%5ضh>>4¾yjMc3gL.2HL „c^w]>p/ul^x 7m\yh.]Hŷa\m ~ 7bbnǚK55y5+׎kzp r'g1t9xüP"Ӊ=\anF0M!+Z4_|ܲPow&f]Ƥ`=cjyzI>̄I{1^;_龳O23?7`A ݎD' 7LpfZO0C߅v!/2_̮O< WWH@ ]siз{-tyBG/hcZnbؿLp7,d]hװU]Bn_HHp?e<_ɨC OlM 0{C#0P 0ڎRCj97r  9x*amхgd ? ~>|#$Ave[N6YN9#Nd㰓gM\[vbyt?~m3JNڳ|,r:0S #Wxb_h4'kud3|cOkrƓ.Ë3\;Ӆg\^i0$FpC/ 3Зi O:A.G]md$<ą޳Wa=:>o)xCIhOV 3A1sk=q[:Ǡv{nی\ Ǽ^U* a q?z! m耥+w "}AG|U Ǎ!ćԛyD܀xѝ#CX T;—gAPW7@@4H]K{!fI܃O]/lX `-) !Wr!>-9>=(/솸!. Rm< jAR=A]9.OՐ2OC$o yjo!.կ wC6CL\0RGBdHo}Y!rVxJsgq Qz!B^u= q/ڛ! D@ | !0mBfKua\ aS>E)Rd0&=GHaʕ 36 STt17N0RO#療L+;P SDf. 2Rgk9A؃9_-aҜ'G#9&99r9$dt2ƨ4$ts[̜=vqWgBfhbB`kk +00EW߄E9㳧 C&0$ Rc2622y_™T*ysS>3LѱKL|[i|fc߬c:Gn3BL_v3:{ £yՙ6y ^_M tDׂds-,a) k60/_A/to{6/C_ >[d?0L<+[ \s~^A99$@&Ѕo!J"BoTqcpy[HINpeF+dQO /2C< Ft\Wd-Ձ2$ @Φxȉ7[rBvdB^^>耼|>ȳ3 Iȷx!;4wBf2SּPWZ1Hٛ )} 0m8궀#^A!"nfK/S 1@\>z"/B,Wܑƅq໶|^kS+Sϗb=~ñEYp6F؛񄭸LPБ.@iڞu|.,+2avJso=OVĐym62`% w=Y'_wY$#19Xč/w}9g} "A;ڛSw'+n!r78-2q?:mS_9s_=JCG!aWf^E8_.#h`—]@*N:Z1N8Njc2Y氺U74'h~vJqվtW ꨈ=(^_W3ycg ig; 5 [8&ϕ/)_r%E~pwcw߁ѱ;\?ܠoܠDn+gnYCZyi܈ՃܨnNf +Q7."E,ZPO'ߎ\'p|^gHL@Qc;|ĕ ͸zn8 G xV"QeG/< sc0I[0,-CcJw ȓY1fJ a3 ;>#10WatM oXB1vQ>[ ̪ '&/`vL:Nb-ٱ0[<3'uLS`IMT`Jb\0o5h#XKǵ"_`]2ءa_/>nW ^Rgag=-{l`~O8w)z?ܾ DZm3Ѿ~S~ y />s/¿;c'FL]Je\bf}fQ+tI\eY)Y)YzU%F؉ِ\lY)Ye`־Ǭs8Mf1rlW˨ |fǶ2V ؼ3SƨQ191Ksd;3EUycrc@1VOaK7(i1Pkc5F/j3;Ld]o-Le1ZkGo2#Ӌ1F."hc8F2W꘭̺̪ǟe!̂ /Lsp8S(m{<7+-/a $yaB)LQ&`:!Cw}T7 & @pEu<8?};vu Jq,*cogW&{v(/~<ه?}02 ǎ/%a|r |Y ۦbpPfkCkq6QҶ8?N I"+p9ic|a]q]8z*~|?@}7~>_ŇK7e5- wl=;WʥOo~?KxJc<&|3) tnm'}SD8qp!!/+ ׈@Mol]&|𿡅oG5W&|~DH 1khr]NT  <ģz:|4 wQqaoL?EEo zV;+i#"ßc?l? On#|[]<+~z?=o߬ځ{ ~as?.mq.oB&7v?re^j8x 8@Eǣ&ЁC&WPJ0;؂}}$i!Y]7`\>>b>6]`{,+ <C_elyoIm8q1NO8o>;÷iN/,jŏCpս/07]ۛpE~CtQ"bE=uȂCddY}̗(M%*KȦ=Dl&ٶ*nH} $FV ~l^*D6FMQmO6!/r(H?6_ՈR5Yy,J3dY*A;RM6Lt&ɆRs,/!K'\yNĽw7d_ <@9W1hBqܙ7/ݸE'lĮqf>(%zُcrY-@xp#42htg ~;+V ]g!ԏq6aZm\/M6CF) 4g35+^x *܄bP4գ"^u /-k9 M7åOn.3!JUp1nԶO'p㓟`CnاP:(L[;?IVεF`%p z w'_V}/e]6\֊bu>Zqy&XSb+C5U]>x P0ZM:mgSҀl4wMl {Ñ7q%%}\]{|rOOX1tk6 T,~yجd$-wԇ%x֫x/'շG.<&6v8 X_"׫ƙ~nRiMk=i\߱-7ٛx7)k kp '0i`>s6>LX J <z *( ky(Q?Vs..-Hk,TjEspɟd^(G.@C0=>t6ÓwtQ la|0m C;`zK1&W`f)o}0<2</51 .^okAS~@v$}: 5p' =kz5+ᥛp|K5# FJ _CIg-k'{ẍ́ZW^Sq׎CU]φ:aHK2g#J5PL6 E?`3 fB37a]y!z iT~<lĖ+?*[EP>8\4 _KW]?u~ .>k p42q(&|4'+#+qbZU A@=]xx8X[:p ٹE 5~Q Xpܵז(\arn[ϕ][7}L#ecMrXՕL/v1ulz?[lzu] R-b|,oėK[ײ CҰ/aSWo8 x7߷tȝ[pq>#Ry ~twqy= zȯgph Nđ8 6C/Ntه؋M8bE >5㈩8;ȝ&q^4oAOq܅}+.a_vo!ZC>6G40gC"ys |q@A +GSWet8>ЎWJ_S"Eu$:㜆}1XT6r \X9+RQqxJc,쪍T_biX~E4V\չҙS))}ߌa;&k :/lx6g(+`UŗԳMN275lɸbQI⚚YqߤpL8koP wpp{$h{ .`n^GB^\}%āGk@˳{1d"H^x# GLiw:AdI.T%29%l\ ApÓ-< Ě^g7Y@>1^sGnnk @u<z PDoTjhk^b^rPp]v@˨nhu84o }c^e -﯀poxı D$<l[ ?c+hsMPWOj΀Ǯ'x:o=.j<n wB5hUvB4w~g3x<? 1x3/ &݀2p3pzhv*^ą^)VeBÖ3P\o5@έ|]D\hh rtsS>z>ߡV}4]uK6/ݚ 7JÍ+#\Y¥v;f<ܫjx}k <~r:ML-p-( t+lR'@B>ؿ$0R1+e@Х? EB3pQJWᆻFp|>j~ {gD]qܺ] nkQǽ\*<N#'}. xFAТW &!Qmhn 7̇~ɻ Q+Ԉ*"uE]G6Ah?4k9qxJ:Us<׼OBԟ'Q<Q8Yv}珛a;8Kmg-w܃kD={}<Ēr𖢟>`k.@ƚXŇb\,/m;sE;DzWXl6-={ng;gf5_⽄%IXmӍ[1Xq],hv?zykހ=;T˲:SX!3˺x?}dմ,`ȈG@2^ro2 a釵ǕifƧʽ"8(:s>:E8'$ޟGK޺=I)m?;ތ6}}w}4RH!i?jK"qٓ>L8k~;9+zxM^%w/27K`d+ǯS51J65ׇ])lxd8 :nNXpb(k8y`Z#I9 A5#/C`p`8f͉߫^w;āf^۠aP#4: Ѽ N#|~6Cw3yPrI} _lkȟlO|}$~A\'\+ -?ݸfBh8k$U pӡ)=U{@%Knx e?,*õYJP2pi3S(}3eAkinchF[1Ƈv6 ~z+G7AIs0rpLioѮp]c8> gP>_mP*Y .Ro 7]j;5ʡw? x8cK?A:MaxּoKD P0l Sρ6WjFTo|a:S 1|e~kp*~ ~wTڟO;rNߧE+p2|x 6˄U`)`Kl[Da`!Xz/P`C_miElVa!lW)R`:lQM|;Z4`k"Zb`^̂.Ygo$ {a.jr|;M=9o `wqr,Rtcnғ+8y/ JӅ?\߻[tRe)03>f1|/&Fv #b6'33< ;pS~ n zn=\'#14᭫a|CkMRf%V|g) : _&ެ7J{5fž.1$ n|yvt|z>= vKփڰM v~>GW-rx>9 fi9}7Lu80v^X?|.Pov~߆y[8^'{M}6e7IQ8*x L88ǁCppNFy:*W{Ww+v v/aOS|_`{4ln [7ŽRyOM`c,Ά5*n Y[X>|ܳ>w>K.'.cxnSfI`|?1Wfgal6 6gZ0blږ pc!#FBzϯ vݬCc3y# \#\l`~80v3j61aL$T3kގZ`ҔL&Zj`BQDxwg:`azZ Rhd4Cx{-&WIxs#0I)ffŒZ;w:+`Z=H΁w`vjfL( J|y&WxN>oW˜~sFpY0L8 D°04;g,^gCdI +ڂ 0{&9/Q`zE .m7~)i(n E5K1 rC2!m6Ae <"YAR7P; ݈%A4W;opy \~\^t _h#nx] #|pځ\ D]U A?@NrsQ{A\Us@PuȢaī4$UnS%I{/US+wϚ K,4OAD4h} [@űyw?(o oQ௕ X5 v&Yg}_\MlQ/\x ;$ !' '?> Z==\ 'C+dk/#kI$tWhYn3C&Aͣ5e?\à900 ;C&`ȕ0Yj aJ7vcW¸OmSM`UL]` LIs`*{tv>&9II`5YS]&`ޘQ L1:S4a:_!L ZOôs0o 2`L?aH)0FO|`t*amߥ0 g@(y vBg~;6ME`У0ح@:9n?ߞe;xՑ /n:*n£-*/@3x@y&CK- r䥠U^JRAx>DBᬋO;幀BQЫ :NO 4{F䂤> f;'>MLVZ*ҲXrzty>gr"9vQ9GfXl8ks΍sU{5kfQ~M| G ,ь[a\ϱ:;-$?x.Ut8zs@G]fFfTrf_7*r ъ-ܰl9 |EK\^kQύÍlV'r+.rz ܁ӬNvx6Z5}5ɞx=uZcWyI2l#eYbfUcs7w0{wq6o[{d([Za*َ.>ϵ3t"?b,S,96bXIKmv?6>ϾgcOQn?>+vgKn+䊝ӱ%V{'Nۊ}C^C-C~犽 cϏ؋i(ǭIv8U!8D eWHoe1pf+ a5oq8Y)Q8a qDGc8/>;g}_C7ᬣE8KFTNc|;1985^)V/U8w7sq;p=勣>Ƒqf|+ǡ'SpxS)8(=Y]G$v8|*;;-\ʰaK;po5 3KlTف@A);>|X C1*}kvE?(дĪõ;Ӡ΁pj|4h9MLW>ж[:.A$~xuje9z2`06|i_{e ?>0O&&x, &7x=0]fGD;zn,X;'Ix'frp^5&oz0"F? xukƛ0Ƈ!0,FGCaYC&KdS0ՎflX 3K`Ϊ*'ɋ?ɰ^*l\-5N\XyMgW8 Jac^߂^ u/᫪8ϫDp>owp;|3… ./?@=̜2KP"(~Q\Y|Y*Y,m`Vx2JEG%)7f,fsjujff"j~f%21k1V02+%J2׼gtct0{0Dfe&c05d1g:@Œٻ^̞)̞aF[eh1L`,;8w3L$z0S H`4(c@^㺊AČpdh~c`y 2A16FYoD pw 3l#`9}qU^ .e c`ӭM{%l?YA ,S tao NV1x6.rK 9sr_>,< elJ-nc N![#`>Cxz#3!d֩DtrN R"D4t\n s"IDdE" j=Dn"2aLG!yDdn" D,SC"%rNDYrHܾN$INdY8"'̍%s3ɼ}dl2obL8̙N|!2.fDY+gA# Sd<23P6s["Dܔ"#>n6 ?/e`|%4v?>x,-8?-߈_dZ< OtD~`U۹>oI_7#0;5S5{|x\kP|^q  s}ZxU!=/ާa[$|*`"޺c&|@q޷&kG-k*>Q|&_`"AR"q0V/_7k,jǫXGh [AAuqvq Vkc7\ IxV>o >;v uÁ}8|#N8Sǭۂ޾ɧnl%gEQ9|& 7ⴕq89I8]?N,tiqmi648{f\L wngxS~Q8P;a pԇV|7ߞƱ^"T_KqL~)NW]pEU _Upu hfIQW"E$Wٟ=D!+F֓U,Y7BTňjZE$V9SeOQ{OTB)ۀdi٨H6\G6}@6d{p ,DJ#K7?%K%Ȫ5p9tl~BTb5+g ˖yi2ӽ<!G>)]w྽!yO*&bz.YzĮ1-xgcO|澍nzٯ*)a!O u[@mIAgS +pGB>2+Z]r'V*{U֐Ol+1M*歝:9~2˫K%#ӗielچbGIcE8Yl~${ۇ}q /M3F}+hnTTꫳؼ 옷qT7}&6=8T3ٽH">F`Z; _ϱيx̯M9Ϻ?b6zVq? %}:_&eu&;iUZ,6"pe?c^mA`b%] pe7 i3GuOXV`X?_}ǪTkiLݪ{ *}W>HwXJIj hJ=!w֑lEj_ 4mAD=4.vvQNjwgzk_A=G6Qv>_AEiУo48!hhwYA?ṙ4&O|64|ą7hxb i{x'CO7ib0GwvE4"ފF ӈM<ȹ>4r,iQ4re)Fw҈|* R@uhX ⧡~4h >NN.7Ѐ4D~Էd ޣIkO1اMdoi\nR;GB9΢,սkI:륫ܠ(/0#rq?{[]m>C(-sa5f{Ksr t×ɸ<<ŴEohw[$-D+(R DƁHk-d2 B'GN 1(Z|FAVY( FgPܨ&J65CWQJzЌ+:PyJ޳DU5Z TSPsw61lzڇ^t/ިk" lP+95f:^F=' tA樧d1aPO%^Fѫ>ԻKC}ƨ/l%꫗G}# OQN?d+Qks/و磾EPMw. Š>tgQPK ԿG/&4 T@ ;F+14f h8~ F#TЈw&?Fo@hm4ZWu)4P4:dhq(hh"=Fzϡ[oш>Fs&ѐ48~*eZ_!F=.es ޢg'+x'j_jۡ*ctJTRٝEAGנ (ՊE e+PĭD̍C~cg/t6Arh!2 H#Om)F#$͘|#ļ2JdcM60)rLLW/NVfK*L p/8~x&BV% G2TI鞃o2px! ijQ)V*WCg J5jIqL.s%[ E_:A.4LIFyؼ&^iOhl(̡y a$-tΡjcZfuVp);CeLjhY)Х5󸴆{Һ޴o!QL/*vmߏߴP9 m iCNm ІhK5!'{t6tnKqH6mMhSNm*LyӦ3DbӦA2mjɢMfh,6A_̀6gf6l6}[E.,i mZHцhöߴA ֿU Z_3y+]iRZB,hk{=Lk3hm0O.Gk: Z';Z'Ek7کZgw}:HZVUDkṿhJ ⽳JV^;Li%t+iC+jiV}r&-}fJ?ž ͷw*ӻS,Ji"MI_D6z)F_b45-^2g]+u1z)^ 9~DcLm{Q-h&ⵘϹFWEL* 9'ҝ4ґ$G$GQ=OV{I>v9"X,bVct[G2>o0ujoE>fZg%zP@UQR"ںUBUŨj^TU~E=PTy+ryT9 a)D :툆H yfH|Dl"Yym[Dҫ][h`owS!J"UpQ6DPM];զ֨du)P}, 5C f<yB KT˙y>GCaPT3 _gWS %tK*CrlDձ<׋PeQDj#"~ĎF mJ(*/^>BeГcרa !Ts =DE=PRzt +3z8Cb1tSTP.Oh~Dٽ(Pڲ({%? FIDQN3'b:F;EkT((3¯(tB¿=yoV{ȯSA>* ȫ84~Clkst#c ]ق.݌.}Ggvm# t|q}ڌ,+M?2I"W#h'zq@KbaRGƲЖS{fqyR>V{ b[d_`@2h{6JOQyD6jwj cMnzT܁}Oų!zJjMHQ~j@W#j#7G+R#jؚG új&KXKn2S+hK{cnRCMjɁM-&NT݀I\9AFy˻Jj!ќ'{Ԯ뿢U򋞾_H i-nϡnԃsz>ϣ<{ٵQ4P/ 4 #n4B;Q%4f9kw~BGvu h.&K3ؿ47Hһ{iޓDA>T^H h!>i[yX1>9=Р?Q3e9Mo>Z 1iwgZ'JiyQb9mnͳyK*mj} vT]Oߝy}}J;%lh~ڙ#Kf]0vMDhW?)]_y]hW19I֞AiG_Vra1}I.Y=MʴEڐ6ܠ p=Z;Kkt AIJe(gJ+hYo'}2MKC^7h}fH>ϥ35mhQCsrhV,A4PżXljP穋gJ:)%g]}n=6Zf+Wں)[Nm"ctӳ.]ɚ.Nb|"*EG"+QdR^|=s;EMWGν{Ӥ]0i}AZ";LH ASh92D^$GS;t-I1t/>J&IWkL%(d7 U]9FJH&rwHYE#CZ$s|!'yAmb=9Hͺ , _8ʗuBv)V~䦽3 Uh 5~n?ßzc?{2cNx,d L֥maϖ"9LK.|2 cƆ3ߏI3Sb%$|PAehD R->F+$#^֝@#xf Ґ@˫iGvvHoE8| ڿAǑeV&:;-=/d; /sGea taF*>MwϑkwVEh)cԑ!)CG7"ߑos7\7? Aנ5(h &(i_BcQ\Ovp' {EapS~lg(v(B"HPE=DL.C(Pk(<#LQЂ Q@*G1(8]7b؇](a oC텐t{1 fɣX}9Sb>C{QyPc(to?lPP'yD{r9\^5ZdnEr8"NYJA-^#-$mB3_{7n_Lu h0hDxTb=j:RFp/WIp 4Xw 'р}3+,D&%Dk/1@`ȅ--M[ $V%I2|i3RyC~q?i;-|gI#]h,^L6OhٷB'rsD)V Z5KVxsiݧ3! m+is m St>?v޲/dўڧp::HGSdr:vz~G?P&~{Nܹ@:w{l:.HwMt1tN҉utBGNߧN"om^WJ4ПϬN=L]I^(v@ߕtRTN*jtdRcN^]ÆG,:$}::NNN'wl/=%x9E^D?= 4UCo連:ρȜ)}VP7ڂFn$J1e2[kZrK]ܡ4^#4K3]ZD#h I='Bt=XSK˓DYdPdHwR5֊n0HWqKRCʰ:;pKEWQ2ڒ|)'o'ÔFgpw4[_;ߊ2wq C~>!3<#,W~~"_ON"1~(Yu( QG.FoQAQf ~䤎U:@6叓`$DA W:JΡs%ttZ0eԨ5[z17K[zA9z>~WiK 7hz[CgU h/?qOVи+4 ?/S捋qwi\cg /dqzۨޞkCo hؖ4Fc il<ƚҘ)ONmݺFWQhKdih?|,I#óh%phC#ʺiD"aQK#+posa4 un\iH IICV$`4/r4 !q2a}i4 _۞!4GFlOF|s6 XOomfiPnMnaK0<vwN,Sh.̈́>!94Dnl[I|iP$ Ԧ ԿS(V>L=݃{ZџP8p2- Aչt. ҄eEs@Cp:x6xx}P;jV;AȫR ?| oC7 D( CVk"{aa_ A{ F=\W^:M3ƾ`12C/:򟀹RV.t/81/i~/9<{u9jXGHvEK|ݹg_WQ6k7f5skt.ȵܜʻoJ6vqgeefXsa۬/J6(ȏU]; ʗ\w8wgmS%i mW {|¯'b;wa;!闵 J9L9n8[9h 4Vjf$HPs_{cKMN@3u!K>}?ᜣ'Ymܕ̥,o uDܲN?9 VI6JsNr r'5s5B_s'Bw3{r>Gi.8%Gu/>U~ oZhXpE)9Vgj%P苕uu 81y-D 1 X 掂#[AVH* n'`%@Oj5Pȴ W6c2}׉ٿaP-xm`ͣP}j R%AD+6tso87?h~2d'P O-`]!v`/LNj^v'gEA[cW􏛃as"A#9m% :A2$84U@˶Ph&B@}!x :AEP>|\<CVn'ȟ ~0?$0> /7+AWrvdP6 (.`]vpW(K@RPY>}qvp8Yj Z+|>tY 9H }]*U7;?v o?(PsN%r HbAL~ As:x&mK <4ȗ!, lgEG(?&,|)kW`{-a! 8ǁ:A  RBοd 5 ׻Lq&g4 t؟$Ds]4ipJ?sJܼ8OsVj> TzꭹٔԁӨӢqn&gkfQsZ;4T"5ۿk٪Sݓ2S9ڟ8\ANP  s7SS>yxE8puϫqNqg (sΨs^B]s׭q&빂5'L8svp5fQV"0YvpH}poV$Mq7YQ+qp= m& '5>IsrfO?[sL$WWr׭]XnwVgh9__f^2Mbs_r[ip_FÍ]a*G8WZMpBs񬊦M۹4k*o}.\-]8s٤b3Sn͹ō--3c7h/cs.c5o;.3]=]]Ú(e-YycG;x!'JՙU~ê} .Nr?rdO^c؍i ix:Sl{~!QdC[ٽ4؋|za=b O.ps¸iXVꊤ3>܄S=.H.2Nي­.9[v_Sƭ {=8WmQ'9:739Q݌'r;̹W9 9Ҹ-c>65Kr͙Zw /gah>آx[àbIMnnZ˷I>\; KT|Q)5WpF9ƴ'z!'gړӰ#0n/; Vx5-$?;i<9;\s6Mg%o35NU<}]qW/gD#*ۻ,6 D@_Dm6Qf9>VjrDs.8c{"99ng?`ʌsY9y1,C [d)eqa/8pװöd_~?xIѣ@n+{ _֬$8Xs0p&2U@ֲ (*K&Vɼ eG@D'/T~$#8"7p< jMa*P7 @q8K~& "-J(ަ5 ^-Y R7ټ|Uee_} 3~K8l,sz>o9=6s\o(wsy?zE9ѳK:unlf}z&+lcJ?I/|,dC٪֕l^cWb럄cӁ_U!J\T{'\сLH$~{p4~tO/E [+ofQhBEY_<ۻcDOǟY>D!1 3s4G䗶ECdNr$zeȬD1{mQD%)Y?-YfCV_3&rQdQ/tH {,mt Óo{f:Iv E8Ul=N[wB)+f'K[q(kӸCBh+8Z .fikpux;ď{{n.lj(̔9|MZ~#f{ /hh]~DTn#Ǽ2.߾qL";Qu+b ٿv OK V+绉0J"GGȒKZ띳y->D׉ur}+^_AnY%r.I؆)sp41t`ѵW(P譩%{NmJblX= #7>D[w6%6d'Iv* ȖdóL< Y#Nܬ UY:NVƜ"ʊdYIO%d[NK.W"7~b }IޝL0NN^ {=ً:~5FVb&D(}DO̪"{CCbs R cbȆl4%Jbj- "$MDB$aD#ѽ4n Fy[311K'F"nRĠ1Y>NL[BIJȇX)%A6bLxf=enD>yM^ֺ^Gdqz>YHh.O$DO"3K  v ɌфO;&"@k-~WAB.Ob<݁heMN;P2g\tǃ<įƯqRW MCE 2R\|A+A,wVpzS +Qvp؀,ߧndwY}+`UG^|s^Z5_Wbc|q>>[ծ6W#_W|HF=ĺXY}0*x3>I`KI `|,{W+}),fFtIxEw,9%z`w۳3[\~ ΎffՖlQ+4 hʡ?5buLnTܤ{\8 +Th-&hqӹ!R .+·+Jr-dTbץ@`kŚ^-b=Ɠlhi6TG z9l`D8l?.^3g#)i1wǍ`=˦Wp2,~#vgVucK%j[%W=v evށyz}[V 4?a07m]>>>8{/>V=xBʹ߆L6m{{)u%'كg8;3XgYJ{Be}]:\啲ұܩ;܎\i){ 'ϒ;eu*5) Vb`7c7. c7fWpr'7 dm? "CV{}32 -bKbKŢl Xލfi*٠Gl\X!Dfk7urYel|>'=c6Q:w/lf h['֕ϻ6-rf6v3F Kϲ!SX1|!kB؋*X{ZVv*Vԁth'˹[Ūu鳋K%-;rV6;0#m~9;[%-qACo{^4ppʋgTJwș1%8۫m8r#*@`)X#+g׶ Z ތg{3Ro R@|iwZl ?~wļr(4^s5@\jNd<m H p|A9^w!\7as@yȀܙ= uI;yܾ be#+|/M叀۫7X /4p5pα\~v0e`os p DŽ#6|eN[p90 T.< f>/A`࿕|THQQT%gTP1!fD%dIt I,, YjjS9}sӁwT B@~Y2D-=. H 7<h L4hZe CiPߏM. зxZX`d,<#])+~^}NaCVEV$M e'M fgfK` Y9v}6:_Y#INVY˖5Xj N:'X[?XY\_pb>knj`wrvi'4`XWX3#k7Z;Ϛx/)g7v[{Y9avJv^VϛN;shfÊ"u𧭜e#+Ɋ{J+ұ܌3l V\1+6+hyUggsj'pPzY`lWYS <>::APs %AFz*]5JRP Ay?P׮{/EΠqbj=P# c"(_ _Oʳ@ZA!h(82ogՂ}gz +PESAPb[:?ZO xap8HGNR`W-77l݀k<]؞* 3~N1w8s}u2)#'9ML(;=ďcB.`n /e~2ьsMa?D]m]3L+؂ZߪX[=e>b>佗NbV䡃֓ L 낸 Ls "m\UOq?zYM˞M)_N)!~.kEbs?vq#[jhS +(GY mwA;Hew(2jyD_XM۶yveh_utoAv)?Ъha69rLBN@GAqZ(l sG(4;E܂"N}CQx!W.^#WGjF"Ǟhw,!:a?ں m1GCuЍ(3 @ =9tsY F0F-Fup#N}GGr;<6>@;=w Mh)hZZwEVXd|12ݎLꑕk2[]Br]%]gUS[F=coΈ2zFw5fAܵcЇQbS&ӷ󴓼 >9u4s&׌Yd1ti{g)0o?i3s* $ ]mXbq~ V=G^)^}T [/&JzJ"pZyPh0'X>.EugUȣ ?2+/+%;9{UU,dY ^qAx'N+UǕpMӹIm%Ђ4\vDn h14\wEA wa~nYm5wU};ԑ(M\\(} *yR"3L@Wпxb_~+NYwqĘ{; 5J;Nq=Ky˻Yf{$'vQ+[ m8dIG8A'DO鯼pU6G±q8"c Kq7})VQA Ļׂ8=}yػ:{Nاd GGu쳪_ߍoi-ʋW{|m_=EL{sR1|Y`SrBA|}Uzj|?I ?k_¡Ǥq@"wTpȜ:|Gk7Eq= w q?_׽op`>TU Z8d.#zp% N)/qʪ8)ɧp7d8(a8Z}v=8lOBⰙqx(Tmqĉa|% ]a2},!S )[u8 ^|Ǖ)߾ԏq6N:L8$8;; U4l\|b .\xUq%E/bp 8]UhUy5ߑBWAɿ_|,qOž񵩋,|}9olnþ5z=|CVYtn|熙89gJϒQ!ve8bNphpKp䑗8*iP}$B#q=5n{W)?8?NRę p}D=ۍKNT"C 2pIE\W F Ts|pQ.(syq63\ 9` /.~qV憭qM2d\D\xq2\Y3t my'de<Opf 풇q=E8o8<|?n\*[KƄ2.K8b)jER6\rxs+GN)Zt4kUq=n؄هk}#]#. pݯ8\]1=:kG۸Y7n0=ge3sT>A \Oc {-7<|E#C%nj+ *j~G~ _2xo"~g9g M~}t>~ƦwG^ǟW[w, 'gs'<,;CDzKgD _ *+VM܋=_ԪUD7/نu [z."yH\_F]FDz'2q)JdWwjDԅLB)."3yJxJd d"yc#My"Gȼjd}E]Fg͊/D=# +Ug/rk)QhOT .HT$[r&f3~i"dq1\DL͉ijb}'掟Ȱ3ĠS$:Qddh?&=+D!\W2+Ff(iLȤ\ "wtwm%}Wɼ;.Y\,q\M#nM`sh'wȼV,v';a LL3+e ỉ)n1u!DF>k#F,Oi2:"gLSH5|2*<ÿWwԌ,/8"1SdU }Dyahh֦L_w p~ ,M -F+O>d+0oDc' <^fzLq{q왼;kq5VnT6Fj|$pͻUJ /4j=v'ː*&x r!9k͘NaU.`ngnj)36WFEL\[=s5 |3zguK0+=a6YIZgMle\?@&yYTq`7;%ݫۺÏ|D Sxyt~)g s9پߟ/ d~g|fm ju̸#"y"} '̻(s>D1m84gv)g`_b 8vX}nƵupJ1,! 4d2?HIn ;V mjL@kozp435 <޶4e>}[P d-1 t'H2yM .{{c Dp`]A) Qqv" ?WAbA Dpv="`,#F1K l/5zY?L Ålc孒8%~򅵘êW RQ%Z^yqHju6j&ub/d*r};9,''˭6="xO| w[i >`<Oз}h^d1"XZ81;1P2y]U`&ye zt{RJkp~j<6YQ l}:#fvJ9+{$+7G̯-B kh:+XIK{39SLreҕy{0,g,d6*|VtT=tgafWl>y*}]ʽMk2{JaK[L\*X{8]z`ũ"TW<23μ=ʨ|֊ $V1YVWᅂ!cSڌۖ5ܱ'yk/O&CRa̓\[\BzN?ܹݜGKvA@3 I1{;3D˹x3/D`OzwU&.;:6ƻOc&2k Xw\}?zy TCV׹ݙ]FǹVmc_aޡB럎-<$H:w.:@WN_ 4 \Ɲq#DDʸ+͢"as'Ygr/(C[/-ҹuh~tv ZW?/@[7r!5k@;V&=m16E'O#4?A] C Nh*t$2#=1d5ro"osAg*F@ -̍q| 'Xs]坵@fsfܶ~J$b攫?s+cy~v᪮nq/o\j}cayv>7s{.a (#;e̥`}5 }X?Α$Hfox( qY:\V Ir Os#7 9(kb}@w?~/#@ÉYe0 Q;䲉y3y?\o}dƶ`y<^?&d87SQ7fnwoK@+5/ 3J -!`!q]jbw0Tik?Gp:3yRfU4^2f R M@&݌I*`?dZqqEQV %`8K w cE炐opXe:w2#` c4LXNf[w, !v(^Qr_L=7o#bq[@Ƭ 3qKDO1zAVH @']私{kAq{5QJ.C AȖ;8 Ta[͸0j9Lt Z9Kʈ%bCE0!W CSt IDx( jDegZm+|=_>OzEY[SPQVʷ QVD2&*B¿2q#6L #Rvv"I&TId®? ]<^+̉[E&$g:xl>%߉g2~o߾{?\7:aFxSV+vc"x&怷 -^'laa6 ZEýY;; k.}l;Nفo9Xm:0WxZ^X2|‚Cºs=z=@B(w%F7"|#?9;4O W~괙m~ s4#\~gp}gڹٷ?I\\sp_pڈ$5RC"$KBRY)hǛtrr^~Vap# XnWG\|]= y|Fgf(#?I/ttL@Ъmu!KufABaܴѰ|/~3~_{>kPGg\&MuOF5WgPR z1@9obPϯE7$~TέA7tSP<{m\44B7):1(Edt":|0Za_ߨ eP˭F\ S2%V!HЋmy}IGFߧ!hCgv07ni$}¹gȄFn&ҏVCvYf= u.FqeBP>@ f('9ɸ2'b(4}Vn"@\n;(qLt[f-A)}(Z"*}_F}QT!z:z"b.fy\ EGN;Q6s48 *{.ڷS ,Fwd!ہh&P{[!5^EZa"ZX$NFV陸?H{a}{{1ȥsI3pM9=;$NWѲ׷Iͫjli|63?f[ҟn)υ\T}>(M o I ~;Wi Fu%; >ם`i1>ٻ LFi a_p7LGT΁{y0v. x*zl+0'㪃%8j1 SK}`[YXuJ <=Ioksp>$pXugAXvo[h QY0{2ۧp0=x )32 p|Lp,y8>;Q*8V .U?mR Wۛpkm߁U/Dp"ϑzB}偰f$'$-3 /@Ws]y*> <60U:?&ʪEb*dէıX#壬-߉5zĚ"ٍ4.k2u52}\VW5(c {Yj& V^UN#™2Vk+hJ=ʤog ~>ƛ5w+z ;Q+~` s|oN;/tXQtAgct O-^{ OF@"ںp/F]SM ";S#zWϹ|p82*8WP s N#SߎyZ;'&]plE:snRRDpϚ;Ϭ>Xn=r}^IurcGIe\gWwr1ӹ^Lnx$'$$&ߓH4= hi7C)%hIhNC˽:2k[\!.{nK?͵iqo$_0MA2w74wo8GCyg&Rf޻=k#ULhDWSk1|Ln\V6Wq<ɥpϝ4O4'72V@),؇$!Ld:#SYnmFO!&"{3h=gv܊A#9)m6|AWK ȿ]q SJh3D;ccjtTNAFQR,߃\f"hصmk݋"M"RdկA|Ca:;xy EL?T&qeK{1(z'5nHBx](=QiPhq62 %aQ3\ꧣC/tG8nG orGTߝ*NE+^~!݌2؄J+D P) T3E -PJ+_T1j-=o ʙ Qpf(b'ӅR (mR=J1CwlCdӃnAPS]= -*̷+!`;{H{$Zi9g^o+`,|.'qXkx}2CkssI8' nݛ_ʢ>6g&\mUk҃y-g}%rhbf?-Lg|+L|mo5>& |53n}L;\Ձk)8ƀCe YI . n䪯3M4<+#=i"غVVNz ;m);C-;=wU:2N٣NN ak RNVk;E՛e Y#^eV]u;G9;+> +XY윘:V" 4l--*JAUஎ\G7\Mpzx-^l9yyuTz$+wrսg]f2&38UޖhwV L\r gh1edwwPC>5r@{#Ǔb{AUu58{''߸{'kΞ\H R*Ej hn;ҬAClO|{~8ڢ=bD_yoeJ;'|t; IA(EEaې;=ZK@ yehi ڋe_!NMDa|to6ۧ$W\ЯxR^<5!܃ӯ`B 6!cDià3 ;px]#B_[|u=>Z_2|D(>NON[Cr|s8PS¥qZZ NOӂt'N?82zJ'8yITHsL%qa.(? /L',Y%pv*x4ejqN\ z8Os=Nkys2.Aou'DD8 ~ 'A{.8Tpr5zNǷq84}ُ㻵8ߋokE>vhVa3b3IpƑP0qĄ8#Վ˿8FǜZc!pl[%SDqt;iK8)rw븂c pԔ8> m9̺A'Nk:3?=8!wəbC~).Xt4Ņr. ^83LߌS<:p\&NspJg>Iq/8I'*C8{NDZqp|:oqN{ep 4+?ipG|X wE|pfηŢsٸFUy1ُm}VA|Ms1>XPs  rWJ=w\$g)Y40r$N؁߭ñ 81\lTa۳8lz0^.8$ :0DLq +mwjN98S IB[;!W%xGA ­)Vqпr8'ȆvEh~'|ϋqww.N齁8%NT5}pƉ8NkåxE#gbh\u\|-VS\ Ɯ/?`b.M)Se+}9|,pp阋.H5KU4qfGW^̹5 qVoKq-ξP)5pk8uӯԜ8#7N7)8~=fݗ0Z#m\c4_ s80s/\P\|.F0g.|9[1U٠OvY|Ȕu'Sq"}UH#3d1O\ǿ> wV[㾜7y 8My ǾoX\/_Î+8Y=F>l2,/we,C F]^,E(BcdQk3mPڅtsHVD_"Ղz=%T|u !^|.ɬt b) &?|]hqWa"l4Ln0vw͒~X|e@]Q{[A{ڰdx* f5[zIwt)0fUp;:ǜ vxŒj R4ذlc ں0xo mA୳+898o9MV? m)j<"[ 6ydT0<_{5@m; VW{WNT|,msEI#eџT? 4}J//χWةhi2 e8^-OZĖpM4~:1``/seBbKRФ Onc J`}kAjc a)e){wg{j7ki6vr+&m7);Qv1ºvb H^ 'ce~'{T|\=P}qW}% (nK&&2UE&3λD|:Qp&g<@'KfqKbgIbݖ, v{+ުg]Y}o=qrEZWV_/:H6FȞw3+)7r+ ȕ2UL|/&o>Dc2Q.D;KsH̙$V?jNB\'qq$>v=I}H77$?)0"'j2yG|Q"Z}TGM ϣ҇ujDj2:N/jR "S1HciB=C[҇hmwjdJOv"A=i m K {i2wڔ@JcR" ъTZjD w<,z?n*MGh$D&4&t-uԯ\zg+˜!tǁ ]7e_ST' UL뺨:2q5OD=B6/ D 61!b6Yb s:aS.to-׳RK*I])/TS &HlOZƟ"cŸ//XɗZ3l`V]aGS-d6;,{y/?Z_^jq._{_l8|G,S29<+_\w}<_'e_25_Y_q'Kŋ+';}oc4gV!|w3{ ? ?̚_uPR8?f ; AjWh Շ[DB>?o?=υm-0hHax既I2o`jU=\f +V(<>.aאk~qIH΃5aݡ qԻ mp` l;ΰ˦vUݚ`2KؽUv/ Z`W' ;;6N]C.l? J$Öpؚ[g¦NبNwa,X$: ,, K`bo/엣)3_Ni;`C/cad }YGǡxy Z-Kک5N d gaGyPxC'?gmx;@u7'|F[\V2k11*:'-,ݣCϓ'ӳc%ȣ75h]Mìzid^/QKhc4nMD6Ӝi^kZhL=ii,Z1a9x STKzQ2An.s jHmJCіbcz}KMmh& Lvlע5)S&vڙ.tJ;yNh.v;E@(mm?i[%mnOzhcp>tnh&\_GoPjDɽ.QrITPQIie(H?Ds>Ѳ4NEhA=oCs#if1f]6Z!4̜єm4G?MMTh7i:-F_I4lE# 7 4`[3fMk*줧H1=:o1;R3tw1`Ce%|j>уZKڼ0tNJevSѯ6k?y\v4 $U]HM$Nŝ~ W:Τ~D"QK>v臺qKv YxG63Y×|ͷ⯩,M_X8l +7OKï_U6XQeAPeOisB1l{= V,i x@*h4{-E4 -G@ʛ`:}װ2WAs"_7 a\:Irpy1hg 햪C;_a\WvMnw<\Sꝅ6T! n@k6;h %Ф>k@jhp gݠBdgd uCN̓:N/(C] u/B]'%nX[.>u.~. o= A#)4+&EӠ h64{ \7y4ou|B4͍C384.ƻOA_6h&OAb=4r8kWB=AUha&4ܼ>FɩCÔ0/'a 4̔;BF*CH54ZtA'X3MCSGl hBµF@-7fv2B|M_YhRMWBSU^ j/ADhp PD$dhi 4\b Arhp0nǫEokzPO͞BYPop/wB}8 BChhG9VW8;x *YppFS߯SLG89lZ'pk#|\N6K '/փi_᤺PcH @pPᄊIg G_?O}VMR'u8ׁ߼YkbH&zU0eKR"3R'H҄4A&Д 4ug:Mriqz_ߝV܆-O iѓWˎԾ3iYR3-8N+pœ/Z%>VBsé exkMh3^R|鉔(PבVkӚr>Yu}δZ?hN(`!m iڐaIzFPh7JoϡMiә[m>,M;i.myPA[ӇR= 61iۭAږm+mˣ|v L)j-4h)H;3mhڵz|vM=nA%y=g9J{Оj>QHGK{^Ҟ-(Y\F{$hwG=Nn~>Np'ir!̩hߴr5SM;Dh{Tm7yC̡m+Їy1ڊehoڒLw&6IhCڠ@xN}^ݟ֝ =V dZ}_VO/%t%*,nPIw{%IUr8 }\w3-eiP'iCZ@6p!-Z=Wi)7Cx14gj}߉XCt 'P Ib;?NnY$=M^%zdfS07Ȉ;xM z6YhBOdu‹Ya2Ӄժ//V|ͷ (-_ ,s;j2ǝ:j?E Ț-p"9+Pi -j^C:YzZhB }ڼWkf@]pǣp#xAt}~![x-\}zB_ oÀ͏aP< CWp^Y ˜ & 1L0>.fYS=a6 s~oy6a*,뇅-Z7aɺk,˯' ~Xyu&rܞ`VlUH U `M `];다L"| `?!66 `ccl H&l* ?->mV_aGt]aWؽbv=.`ϻ>u`M8R`ؿFw'$?t[ç 3YP8| > ;lwOCXцNϷ%Y6,v|fOό'7'W.aV<|~{섏`Ϗg9w].6;vgV ‡;YZt *n-nư `S\ƽ2 ذ>@Mo+au'º奰m1ݳ#y ;!{ E;]!n] ;fXeV|!mr?, LU V 4w!;aUm9 \z2:~v0MBgS?ib0mRp20EL.\h)Չ0"^7sal,ȳo*4qUcpxَ>Xq6ޑCsvuӵ> C8kR.|k" )w_.pa5>&1 ?~Z~zPG&8G HC8,*/#?Wp$#‘mpD5 ~z% t~2dc)q]84{}úᇄ,~P~7j/^-7\%-718s8?tj.K8GхGQH8- j 'dpG[Zhf8z솣pi8:?b,"?  Bv.{}/[pW8ώpToN G^#pcq6]k?mQ0wy$-\S 7MU:U =sUa&!7v-c)1X;|Vw$J(X +VAX ,Yk>ہ`2yBTPga/i| fHdIr1&{a0ax7FrO0%*ua|f! v =5< \wV-+ Ov t+9%ͣ gͅ .zA[?fON@S;и4J '@(%.Vuτ B=P{ZZ&mǠ5Ld \T{CP! z- N9ep3TU5*sݒP9T^ăJ*܁7ޛpR8T8sI8sv8Tf@CPi@Q_ @,#d4NVqpE<\[d᡽yC <^=xC*`XC5_c. %`R0L;`Fnx}w |/.y  ͅta>3a΍n lk;`t lj/`K6lU``/l[N^i6lY-2l [ assl ^8> ? `þ>3`stu"6'O^kaLX{Xn&cV5~`X Vo)r~솴ǐz݇#C\9H@j aezXq|{`+Xܒy+a`%VY0s6Lvi^|_ SacGx0Lro0nk5ƬPwO/0Yf J3gaqޙlC_6=qt)F8 /\}č@. +:^nyoн1d;t 1+۝1e\U_ }h`m&́pQ d{ }62?!8ym ϶Z-}ZeA+C\ Ԡe}h)?-y\h4и ٧C03WW:ųv<\(4738TTUDԡv4x*1AP6*{u?/,pf&TXvNwX h)Bpb("euBˡS( 'ktɡ^p PC(*.X e堌5^ p/ ( IB 8U8AlN⏇}s" cP?go俋m?8~wI%q'~Ow+k#aqeuN~~%Ŋ_#_3_#{_m;ȧ+;(ӌ_/ϱETX?gY O?{nZ{|%~8|u$c Y^gaѿe1-" 9 Γ*bMby$m%omK*$=ԿGZ'΅9yVF^:3'Oa*"0Rs쪿t*ϜNoEgIͥJslTe E~jR|:Q]`JW{S |QkK5eOPB5.l)]F~Pwt^8JR^FJ\N`eҴskjY@W:S[M:&ta UH˥窨|ؗ U4O&)J4Đ=$KP$% xEߔ[crkr-) [P=BnWwXrєܬs'ȭ#'__H,k*ս$DO#$T#B>˧Gd~{:D.S`kxC!5FS^[w{E7c/C|zjU\xꗍAu_ ?X'AGmpx9

ar`USf~w'`~9Ss3wބѺS`x)(f0# .KaFx+V=>¸zxsrIXx~gk G :J@,@O .:PMjA'p8N?R~kL\_y_v_s?y2?5?^[qu&?Hً1RuJAa7BSN|n|')R=o]u+[g˖ݽaQ*%l ,]g.+gZ2^ Fڣ# %^gw/3.j7x.ˍW>1ߙ&O^Κ/Hҙ["']W?8d)w3\wX5YO.sJy\*RqDFSE?ږ1n."ruk/ؒ$f7\n0$||b_d3/</~`ެ5̸LYdsgmRdob=*OnŒVZ:rp^Z {o952& ((⾇XEl\VwAku۳+ꏰpsKٓ7NJsɢ {Fժdoe^ocCl\ƭfc.wn KDlX6%FͼΦٱ-Z6=6s6-MI3ټGl26_MbFIlƓg}.6>ϦJq,+6/+ƈa";vXccw{=М]=qaάbW~`W&}am~=k]ְvyY,{v~9vј!,ߝ2&) X)e0=h @$i Cp67Xہ2>vרּ?rmVrA}ui9\De4+O jė@& >ܟrdUm^} [b857i7ZvFfЅ(a}ڝPM\<[f ~:x n"gq?hEG2v%1Mt$-a$FAU\|eoc*{yOqmWsi}/f+\4yȕ㚖7 848jnUFuZՃ 9*'H**<?C!4hvz"%@ϣ6Xc r ~ǒS"nj;qoz/j{OFnnRezwˇ^FexQ(U҅`/Xy34^B́x ~ K4ªX|Slk)X/wQ|X]oz 'p )@o@8A7|%(VzET3|gN|s_{q#F#;`m( ΘTHby{oG$6z ֗+]Oc^jl#c)X+]^byXy54c_X@/W2wŖA۱X|& Šw $ƕUae'~>sCP®|8 -[Fr7ݙbb"ЍV=:q`. ׹ ? K?EY r"<IV Vq-x#~MA.b"~%j@f܏\N?R"f(?]4Fh%=)7/ZYy..8 \T17Jܖrq;mA4wyDqq ٚJGj@`P:T8K[+M&(" >rk9)e c\2ƷIƼӘ۶3EC@a%q >,~B4pJpJ0"n_='n~nUWa7 k~b]ff;yg&.|v>Kg{RԆ=)z{Mc/e?̺Y^ Ϛ76q&\`nM`#{&-؄-lh{.$MwebQf[9Ȇe>iX_horViv k:jerL>;2uOς]M6vͳ7{˲؃:_!f7Țd>#,clZ>l`<;bMO؍_홡Xʗ4/a XmL:lcE/$Q=촳\0jALѐ!Mv%`hE "1 S:TA{so}Į"D4g(nAp8X ʘ5e^9q=7λ {zry$3ً.@Wej"eU֭BI0GjN71Uy(i. 9}Oе`MJLBMB9(W-?ކGO (儗I(?/(ῳ`8ވnj^GsP\ yUPծjj /Ha&*yqVbP>Uz$n@n  y j ]w WE1 (yoD4PQz>^+Pgm;{=LE>D P(wL!(<=Qhf2JӞ&@v\4iz!aQnd7 @6E/qhOH-\ s[RDwq ᯢ` Zk G}[#r G"͉fhrg!7&+,0O- 6${נ_Єyd.MYsytENg]_$M*A,3P$Osvs(M\cN.|'7柒D773gn9\ji3us,rM8unE"Rh-2h2rգ(xyZrCEǶ:e[?OEJSߛH59z\EOG=]Z g\4,76`Bc̤c }/)‰p\A˔ٞ53h7=X1?qM#p[r^8]UpFyWU\:ME\9t6p?gfn>mqG9.KRpѼ U pʏ(A* ZYw87Z wo<.NnKF^]*.=b+6:-MÕG4׶kf15v'nY[v931 n8M}xP_N} M݃,xf}2fy蜣xy<7]56^ϡ ˾>OנO^ +?u1xƀMRو!aب C3]0RC1\3~Ǩ+o}s<1NÄ_ʘ O|“Bۄ:{T~ &xg ڮ 1ƌX51j4F%ae t?cs$F-(%wLjٛQT1 I| eaNS0lk 1 #NZúaTV FoK0cƨ!1fo<cb 萏cUb=P\cƜ1+#`WW +I1T3Ɛ1dn 18.c>r|7zۆGIc<*pT:KtY.ƒO#>~#yKO{LƝIpǐ>ܵPM{'Wנ^ ]ڂbRfuh㧌(d~0Zh8YaNSE3hj C=hs ϡ5hs`=FXh nEQ[qj)g jE6o Z575<85.G7@M=jԆ&MKQY<_e>fef'PkYZSPsjZڲ'Q?֟Ũ#3uBb QgMFi/A?h[&e43FSf4Ѡ ,Pu/{ܾ Ρіhm:PoKԫn_@Q|{ uwس(Zb[z( 5m~|omIPCKZ?CNԝvu{3Cs~[R9ԟz7GۨӿxON} u':^Zu P'WE=|: Qw/>CB!jo@8+DQU}axr3*%?FxwT[Npb* ba*UF U#kH5T;jH4>3G*1jiCԊ8+k::[QwfXѺh<2KaCC{tO OƣщV4ʛh'h*3Mwi4i57hbuM'ɬhT ?Eh䥉&ݶhS᎑hxp7.m@ 5h8K ϙ4ڍFYhrD?nDs ^ƻbzzż!(E}٣AK49+PG;/{qګvJ%`(w G@bl~z1騝5}-QkP-ZΡjKTZ*us8VP+y!jT1xf:jZbn֍PIuzPU$Ceo'm?u1kpt"#pQ3'в(yU hA~w@&WzQǾij R0g>e 99{s=u'[[쩕*{#=32g}痕>J{#˞a/{u.u]4~v}p>> ω[f9&}lfLaԣهٻ<ӄ}9>Ȳw?̞/4cOb]=k-묑awec{v7ne-nJ=)ݼ}ݘˮd7DyCv5v%u+׃xmî[we=v2jv?]o.a n=;_0h̪]aU>+W,J~ırs?V)JaɻXgeY':bjVwZ҇ꬴ~+_',+{NYbefoY+MV*/~q_kdD/cjOmŝ.2 h,QUuGzG>AV]Yk[P㒛*pͳ8y\8aOsWK7\"r_=ag W'adY_S]2xzL%Q^$b)Gf'ļ5 +!nn$ێl%7_-*Yz29ٚM$A ިB;ɱ^r6D cW$ڒN&#IV4?!yH6[E,J"ztd"9#I' \&gZ35$G*?#9Sb{dbS vz->d[%yԋQH\YGr5IvS J2 H6OR7BR*IBRԓI9DN/|FkɩPBNeN#\ΑSaIR%$7L-$I[I@6IZLN~k"9jEN-#'Vl$'I{w&D^6$0IXI I1$n$3#DG"S2HJWVn0"^$ 'F#GGFAC)\L79oZ=h6 t Aaį;?-쩜DMY K^*9gB"=ɺ7ɪCÜ{dcy)~#{ߐ9+ZG۩mr&4m*%;m @\"JɦAKmN٢`Gɓm}dv/>&{8rlw=MvOT#{N~%adMZ^ERI.9d8[$䞢w I' H'ҵߊt&){ȽFyOD_OHgl7$_Iimwt{|"IR!]3v΢פ-m$]pt-s!I_L"]J Iw}hyy\N!^O!Y ;jO>"(Mȷw!W>y4$.p|!Z[ M=|U$߭.C"u8KM$e>򹤄|nAnI}~C~4C2 ("_}_Gg6+~#C>:t7ZHҗbG^@޷蒾 M%|EfAK@tyg\JN6 <&rggGImfi=7iIo#q؟45&MbXD '=䙬N(n#|!/52?kM %fC#ȯxw]c 3#o'/?gd7}qw;34H.JYE"SH56=9Aj*GR1T|F*~'sH}!)ͼ@J$HaG VHؓkH RY+Cjt?sRdRlB2 lO(J&&HLR9gOVcry 4iI-$=eFL\qLDyԚMxYGxKx.YV)̞$,& ?wMkZᡸOeÅCU^'=$?d8R3?  )S ڽv %Vi 4+ 8ZO#T@Z8v & >)?4SXG(L.. /R(\x@`p̙e}DŽw '\sl.,.( ḓoinpe38n})j7:.)ˋ6= ےE#D]ӫEMFzKy6Y{F_n5O7oW[9>ܞ/Yp>?m&H6%|;Q k{| 7}QCg/>໧n=< ذ!0lLLq7l ;F.g[Yx+[bT2yx:3r? QW3Ls*3<f:F)cg0CSΔ.7u)lOzc4me+X iv`.;"\ΰ+YDVƪh5;!;=83vj Y]dk"t {3ڕQgc`-֟5k|6N}(7e_LK Ja([W(GG-Dw)8r-Sj!U18lUG1_+[Q5;'|EŁ7P"s8.:NtFU8g!N݃JMPM8̿PujTԅJ;~ ]Gem9T/]f68 AP kPqRv;rCpW[rhu8o {23qdf#Ԉ23$m?نW謗(Tc$(vBocpX%N[x2qHTԗDş֨Cv 0Ǭ9.±(:U2m$4qIRg|N-I!htQ]&Gh=hQݽ(ۢR9PB]~ƥy9{7ÛKbJ0vd;wv)+rcIzY䩳:۽[pi:" gINƼzuN*Yaj Km& ?JbIB֐NpXv5#ɳ!p;؊xэNN}pg|7gg! [qrK gr€<@˃MXY^;[rK|F8כ8~ NWm[șrUFmirZ9~rczqJrCR9?ȣrqQ3:DN%U&$nu9)Ii$Nmrb9A3 #qSg \-oDz\=ᕴzaha~% Ѹ!}'UhZxLna(mXkj>\zӗI D_c>^/iYo]i?̏[-Ͽ8Xl|fܭ]xVc|l^b+CDɍ|lc>Ad0RF'h_b/lY*J߼^/NR$)E(S[]Yyc>|cܾkn^{1V~۵ote|:m׼O?l]4b Zی*y"~NkѦ K)h8/<պl_P]O9/yWU4ۼ/N yiՉ-`HO51L[NU:7pEիDW7&+4N/%뜝+0\,Msu3M/M(h:Y KY'L7| Fr 櫃g/s Wr}G Jܬ$T& [%ؖ d ԖVn*Z* UTA\᭞Oc넿D~L9Bf.ALW$3W G. kw-%IS7➮D/- YK IT'R,& $y99SINS#CHW$Vd)=$Gqw)*s"#3I$oE{|=ɓ>NrNiA$w )xOʿۑbYRk():CUcH$Rg)3i%ș$u:ɸDҋw4s S yGqnW@B2Hh;bE&ɒ}3Væud'| Ý+ 縟XON AD{ԐIaNl9{AFzA$&1>H-8x_􋋰ᖰr艬0OTSpTxzAۗB3[U^Oo BܴWYT++j,k*z:q1]tp ?vfQƺ^_辶4 /5z|[2o9wh}K>/蹵?1?yڐ4>3n{;7n;reپ%6]̫_+z&AtvV3[Lsoy}o(ld%z;)Y.7aM5L Zf5csG s^[m!;r7;҇6}% #YS)gi]d;21m3! ͶXR X*vjc!sxX8cs-k[y,eAyHlĵlψ5l6f[3잝lIQ'N9,CҘw xȬ3M_<4Y=XĠ΁e9aD9iC؄ďLP?S:.53ɄdO aA?PI,v/OE6E./'Rq)Ѵk-m UhQA46h?\t̬mco>gpu|X+΂cj{Oϫ=EYlV;#`;M$wؐaș:aKNSX!2r-52ES?D,ZETl~XkLV=dyr Yzsu'Ne@:Uڶxaؾs7n >$^jK. ~*$H$<"Y޳IN]8JN"Ie${>񒜪@o%O4 I$5Rd6 'H4 !ħ8q4'Bƫ80I̍ ܉Hs#6 d#|u*}(F;1s'N~Ygɴ*ZBfW%ý&6b+$DvVaD_>~ 'N ?^6Oɨ\|""}LX߱\py0y0a/r$)>4M]aK 5^²6BrlFͫnJh|wvڌuLZ4a+aG)aEQ'<|bpi1E}kwZwtUsEYÀI9$ԛ_̏|/?ͫS-GWDIV1DёuַxE_Q;Owex.w&+{\yۉ?{?˖]>Wٳ_ĭ @vD>/''|W)/tי^9Qw-z;;U?;h+~>">z \:Ο͇o~?%|Cf9_y*|3_װ:ş3+X%C]|d>riSXp~ς|z/3_?&޻G{kxf6Y`4Eϋ[|IN>v&?ޣM{E!D/]UoGȋD)n5sƈJ5W~-1ā3sd2HGZZ^,-glEWEOh]V|QwUG/P뽭޵w y]/ `~ў7P'h-~->HuE(Xh'޺d/Cw"#ٽZ6[v:'\t͏tGw?B<@1GYv,৉ݩagw<cب뫙|~u&a_i2LA" tfsTyC26|bgT){~lgN1lXv n6_c'kYj;;ObXM#ֱR|8\99%=Z Nkk ZW+qȫVS7<*PFra_Q<PT_'jP)xG#Ik!ZZ(fZ3Y74%Lb5~GXra)ǎbq2}$ ƢE,b ;H@]lGcXiDy:XNed'έfg瘳5 O=eLe]|V^gIىGm,82=mcЛ8jE-ATEy}Єzs>I{4z Z:p@ hxN*sʯaKΫV5 !m|e걸2\IK}MZqF=rᾫx8# ]s+H3WZAIkti};~rji E~5T^{Bq{"9EBJPtn@6@0zӊsLFpJ8G!4W4.JBHݲ;\]p:{!tqg,7_'⽍!qϐ5y~z<S9t)M[ԇzVÖ@LEOi܈+j+1zm~50ƀZ08_+0T)>&Pڄ!jf2W1r[O`)Za_'y͞`/e⽚cx ^u0p Rǐ# !f-CT1h w2 Ȕǀ{u:~@wmSg<쟄}/q`%:KK1],>ϸٽΆ͸ä w_ǭoqӬRtq]Xt\yW'XUvpqk/. ux Czm*AsKy3q78-'Nd"fCT-)E=LBѠ s4( C?^cj*CzJZ*=Ru&_Uԙ ӟ֬t,^dQs>jXf2j2FG99ujދj -Pktjġ} *PT5;}hM&B/h< MNEx 7#ph4|'hb4]:4|%#Р `g4puDwh8ACw;44Dh:M:G-4X&ߒH2[PurowLľG44=&!-FO6g6C [JssKG m_&@Sd( Qj,AunT P9 P*OG5 _^PkԜנJϲQr jG- ;%P:T&?$+PCqL8QY8"EeF!l 6S~?&;اbuW;Pw/޸ cFWٳ)Hq$cA{b=5uhGv/s3=ze:g2 m?+RwKpQcdzΔ}`apa {V-bޱ73X8`&{˝6lg/7GY[]4n%JY[v[9eMֳ&Fe}`WVvc&jkSUSf%x-+ѸdE_(3Vh6b 'xB2L!ߓ,9$i 3C$rI|ENH$WMI΅{$o>rFۃI 3$*B2CcHtg3I;ORkH7II I~8LNo.'GIz|a,pAl'ISɉJrB'$jr|b!9nx:7SHBl*?A⭯$ƾĬ|Nbؐq^#񇇒n$~O6;PJb$lHf<3e KnH$חP $[!aj3Hv ]P$duܩ ǯ[ɱAxhٗHZD> VJ Sf ׎dsY8Ye|8V#ɾ! /MvsɊ1޽8H:dkvq,HnؓaO̓,͞!dq YdYzIz! s&6E"pob[Ol#Nt!2/ß[wBs;EvYiH #KG~p$KF%{~dHb7֝[ r ѱ8n|OV6%ddf)q!npx?J&Iк$pOn~$qO&Xp#Zޒ}w6~/qӸT&gN !%r$R3c,;Oj5̈́|G.E>Ao}'&J$% ͇%t|gȧ˅! k/-L%tVSׁ|Co*yI'B~%oWw۷M/.IXI^E{d珔[M9u|~@2&_f'ߑŤoMrZ-ykFːG'I|7rt\n"m=sIޒt %NI]?rz0B:*Uv8%8k:y>}ygkA>'?$sɊdZnH*N0L͕ɏdw򩦜_x_ #4'6Y=`#ȥޙE>MՓ Rt¿"Ն"\zUn8Gj""G!]H}fFDNw "fɑݗ;^a iظ:E7 (d7ED+։k-s+wrf,@΢`7R*g\3t3~W bOrj?,8 e ST8 3naN~`5|)7^ςec8]YYP)ܐ>nB'IqAcɯ@>E&}{GVv,yӢCJ#y<yYBzM^qL]FzWo}+i;q|EnQ&WdnIsm0|aj|\-HHӨry 410& 9?mR=ɮ3$iIf~ZG2H8#H೗ħwL VmdoD~ qV [ҕȪWNu7YA% '6t"fV$wteqd~`o/[/Β»w f8 GSUS"8.?c+,Z+4$ S&tfa$\jD(=V'THDQ6K}[P7zu߁#"%2[C~|Q$ /',e=/:GUz₃-N*|7NLn}`Jbj^PW.(3]*8@P%F#=Lp8/ɑ+o  ' .85 nd&Hߔm-|E;Z鐨pF(k4QW=cSogSdV0dtf G3N6yl6cӽY/3g3 f dF{3lY}CؔXʕizرܻ,|c)b` ,2h+,?V~}V=𕥞Ų糲i2L[.G앒3}`.Gge !tjb6}k^Uؿ1 eoP^5? F[-84Q?.ne(wሚ8jx$Qpx JYj]8Ne1vCGPyNT9'F?Ipy* 7֢dTn@UzH}GT_Dٖ8BކrE(ueuȀ2s}|OWQ x;(w 8tW88m*urI*-V q<Ex{&L#=Ȧ+$ 9)K=- }^!MzVωW35na*NN87G73A[pV:<5q~ysllc8YǑ8,nrg*7"gΙs ~v[%{6g,αpC9NPNS#ɍnk̤]}34[%)ڤ6ʎ!YILB >Y4; ;E6$*_ C OX2$(!-o X ) j ʾ ߰Q(=GP|HM7xI",j/V6yޢ|ޞs3͟[|V%cw/ [ *Y*N+6}%tic^}HuGcq_Nq|~>Gl^g(M">zho FՆSϚfgDaF|Zi >y~P>8y=pg,Ϙ m-|o9_?ׯq-{5~G-9oMf ~1SdzdƢϴ~-hY]$R|R+:UНe/6= Z{z~]Z9r'xrx\ 87.߆pL44H32 q1ԻOKk ~:X" H [աT0Ԭ|!)UAݿP<oJ2\4WKOsN|(< 'Be;"_x B{:Ҋn4z59FD|L haK񔆜GCih FiL}6X@E/xy zvGӀ4{ 2M 4AhPJ GCL 4$9GCڿАgf4Dm A`"z{}z4dQ|LA<_|B#&m 48s. UA4x>|\vC n͠40%5hд@NwSNӀ4Pb <On5QԿҕoK&ǺQ?!. q+Ϛg~=z~)=m>zmN=EukzXPm꩜Odԩo+&Sgp5/4~ULmIx=42+7^V1[oG8 CxR X (4Z}i[ԧ z$En]C=5VRi{m,u@/ZQ}OdKCn;#zxWPo)z]Y>sz>#φ)zp{u AyZ/ƊzOxG-{TuD=矢;Xeꯕ([,LC݆>jg,9C}"nPo%e@V(PO+i齊r]!oh1aR4s!ٯiR# s7_\NCnh` 4Ѡy4$Ӓhj&p=:I+FAJ҈4[KWp4>iK/ 5bzV_H˻h V7Lћ%[VW] FKZ9Vӆ 8ja :ZV%5q~ִ,wG5U5\͍ܭsnd,KyPߌ#uqGq%>ק8{m57:-&sos/WsB=Sgܵ3FܥE+q7+Gp7_nqoqPڳ\['Ic-Ͻuul=?k=kQ=¨A^Fn=N RԆm ;$~.w$qҚ`u!CaHO]0h #61 w0[>o-)%`Z*wTL߬Sϻ`FmV ^r0=1&at,RaVL0*_KVk`0b LT6S:Ku絰Hc,v K7̅%' B\N`óA6o `[?p apwp GH%p.osh/p}<7_^~]plfC@wx.HB0 A@U!NB[B\9@hl>~{/^{ b f~v|b,!@ڵL z'"_ɻ!7hPvH<NV!/$(d(87DHqn!c@l$TBʳ&)gn} ARE4z)G0EH9!4YO +c2d ,>2@ )Iw\f>_3m< Ew<|(meɾPp*kP9*MRq8AGrTfAEa7O"(wo7PVeAϡ|yY&P2 ξVYP 6@@/EBzE@QxOM P= ŸPoӠi(j)Pb Cy;ܗBnM~ g>BV y!'stAd|{rs! = yB8태g `_,|B5;g~|ߡd<5C$(No'mZc(Ů=WPy2}%PejPv_lP Pq ʿC,(w*5_,1Ҏ;PWe7FBy(^9נ4s()4ݗ@yZP,6iAI@ mbPtx*J GÙPp*I]PC-Px!ur VBSPnˡ(52y(RMP2MKpfo8st9_"v(2EAuPEWG@ZjbP2JB?A^UePjeˡlo-ƍQt[Fנ>e3á,MlWbJ(?-%T.TJP"ASP?鬄sp.E=sP{.@ s@y9u.vz-j@;FL/t:10A`/a؃]J{AT"6.>FxuSL'& ?4> ^y@3;yLF2'j"mp[4NwAyp1? .6n\0w  G@ç>h< Ax J9@5 @AyB2hp~ AE  u…kߠ..'nАx,~x9@467?{~n96o . s lK\l~ J(a"- |b_d[q!w _lN>7;<7 .Ygp5*.C0&pJnxXQp#gܤВZ[3 9Zf-Vݦ mvp7<;w1 lLi) =2r7<ŌG'A?dxއGxxz}'k;ܭ[ 3A{27- a1 l-] zOv!FN;{nݳбr;?ŮpE<ON$9cT{=>3ߎ<(A[X7n旟fsK}$\טMn\&p[&\*lpbi1&qyDA DS6BWpO3sP{PӪmԯ) _@O5:Opes3^9P0νjPc5 Z3C zCG*C͔'P!T~UǛjc6T'P*m;vP9AS/[ %BeOSrX3 [~9gB`8JC;PYUuC Trj]޸wCCP'>?z:*3e4+yʛCŔA(uRpz(yjYg9#[C'C/(㠼P*<<*sbZ*]WsPP%AePa:|d:G?B}(:{mgDCPE C胒8BQ( :p|(\ 3Pe6]0R gB~5qӀA( _1r̅k M![׳Cx,z bh!C| -Pw2Mσ$uZ  0E MBi (`Pz :?AJ߹ HÙ~B^qnb}cg~p`,~kENUT|T,懫R%TBJ(e'۠TJ{m- rPjQ ?Y7PpP?:}猪UE vA$g(sPڊ}a %PRng5bTWPEPٕ&ֿSFԬ9 UPP .@fA|Nm(kźX5Xv %aP\%b%v?x9wNPFYD(m{ĺK ?BbM% *P ?7d!Eh_hj(4AAKePpO ,rŐ"P<k@9Rm87N\/,G d0IV̑s3%k!2ȩy֐˯*=r@4ȶ_ !}[(ϾO sM0d3odx܆!ckȼk ٧;!gbBN 10r}[!OFܮ@rq@fARqrley^UAY BruP^ZI,za m~Cȿ AAؖ7BP\ bKP& ʞBlp BoՙPc ~B"/#n;h cV5B87O醺Z& ,>XcAxQP CĺJ<߬(wr X8Sҵ5pd=\)Mk.\/pm|\ 2?epb\cfn^-Y ua/6vsm Z.-1o߹$Vhwi.ڻU#C :"r)UЩAX_h;@΅]= CwXCWGCϟ;z-CF=}@& XC=AgTx y ܖrz"Įp 0)~ykAӉjv\Mڭio\pw7A1pP%tZCzt<\{>_RoHK}uS@ݣ{pA6.sOT'P.*r2Tg;ll ǡ嗸GB 4 ]'\J V@գxPU *#^CPqj1TBNq-(濖*( )O6PcI([x]̷#t6 ί<:堪TI߄PGJBoPxo:4@PqBϗ<Ƚ\ Ȳt 0 hHҢ R/.M!Eu!=9D̆Iڙ.YɤNGp\-~@%iћBJR7q j9'fBb*!fl2DB܀6!\ r&OOB^7 $!7?#fBXWs!,-/?h*׃W'cVMy>q ," 4 q `{`wÒ~YXTO@X?y~@V2,~ Acaa+u`qp+L#` XڮQ0g;G"#X\ Lu TA{A,H3Kc0xگ@ P㻼A(U;;=}5m^`h:cu+`19SgŒu0mN>LR)` )qA`yL},L zg0mҠwиԸ,P 3*`bZ eaBnPٔJ'@qQPͪq֠ td0 ;;P0NžؼY]0A?F9*\g{' e r0jb0o0zIL{7<@B^e޾P̽z˽x]=ڱh:q}\k\:هrm${DG\/y38Do ^p=ݮܝ-ܝ\[Pk^mnFp\o+|'7ಎi R|ޟ e%ԍ1(~];Kc`߽ 0~ H(4q긯!߹7\+HGԸc>Dg0%L saPuVV.0`( A$`rmL2,7tY ^58)\s21z2j 1 ʛq._Bx k.:B̈z8-ί?+t؞ R{!iC (~ -s"O@x;W&o;KMmDJVAkr8 6S"%a޺/[Ivb. |=.{\)tI0x,]Anato$.+KWϤ*4RsWk2_ @|Q@!ttg GNvUl]ݸ;kB;G jesmUT_Mg(*4źɏk!YWN7vQ?h{[ow9Ҡ?z}o;Q{秱tΗMD=6+]r D5H};H*z5753j2= WeX qK(\R)!}( 4 ̃I89uOAⅡDʠm\$!wXׅgfk<-[=Ҍ!W_8z"(*{ 7zBdH>I.u=@rԬ (R>uӡx N8e߆AyqTP;[\;6g>\Bu{nLzzڢΛG7 0Zq}FH#Owuipu#i!;P}4y1 O,f@%{h@_l8 tvЀg'h{, BҠ%h+4x?HiȘ"bCkА$YK܍!Onu n^41FZ`5|IgǨz5i FiP]ip\6 Nhr%x4 ~/>4i& tnGM4^ @Ҁ45Jm1'E5PI% nPyei΢!ԫ/MCL0e?zR?zJc_Q7tna#uI=vP[K>N})AGuQ[[q{u+̧'ׯg` BigDĜ_G\?7mb%Wi4؞b[h4b |NghqC^$GC/a4,F(Nq=4ID{iK#pgyA>Ѱq?FwӐѓh*CO,Ccѓmnix7<ѐ=io{H4r jNCgahxg7=Fi4i1!h4t6[Z?g4O htp ,A *B;(tDþI44NK3Јi#42)FݼGCq FefWb 1OLy5&|+=}FuӨiuWd߮~E4npZ2~v՛hX# C=e_LwAog8c40ZdlzHN;Rߜ_z/:N}`$GS ԡ>=bt^r=z uNC]4h.za'^ӨC"YKcgM =d=cSxzݟMuYB>KLyL7ҽ HC~Ot* 9'kP-u{@kRX?zH=촠.'o0M^Pi3 .u#|ޅY~xnp:oYAܤ.K1+z`ҽ?ȸKBsq WRS'ݏH|fVHi MHs"$eED>djG!Mͣ!ާȬJLɜ{{k_{z_fw'^؝R=aj쎒:v ɰ~gSmFؽY2MN]qpvz*3_S`d-`f`y{_g=X*`<߲{f=Qf߮azCE7fca_ X?8#ـޭl}6‡9=|U=a9c' l"6Pw%I#!X IbfǰA ؠ(o6_&Ul`'$t. ZT)gu'68!ڇ]dkYl Vwb48ʆmb#,b#Kah6"ggKғ d~; eوT sŚl Yφ=Mra"/V>b^ÆW) ss`#6WG5ә dcαᦶl)lld ʆ5gD*lXq6sM\8 {48ub#-b#*ȇl,9I7f1|8Mp] xL[\zFG6ĚMLeV{/8%76>y2{ fƙ1.le6∸V7ب)Zl3G6j!3;kYF7D1Nl6vs0` -8G6&۰6^:M6FU F{.e#沑lq}6G6q!yx|ؐ6ޒŊגxNb+UF6?FF$am$iE[l.4uoY86xͬxet٠+b6˒ }d$H 6b7qQC^(FXQS'Eb`g~*}iaC7%b-eb06b%qab ll #ֿHfS.NI v` b#5~[؀#X?ˬߊֿq"4 1 |?e } 8 .ִ}ـ'3Y,dzΰW]b-a}U^>K؀%l{6PXGsـMFwd73ݷ?; " R^Ud][ׇٽGY_։ݟeob6sg7Y`3v4{Pi!C_*_y@upeͺ5 X-l`}&$1 + el`{G٠}K$Ǟ`O˦;s٤ش {6%2clěؔ歝8<9%|$~)F"/Iy<6@щg)yq<%يPzJ_@'^HR=:̐R_MT+cB'ԣVC'W[RiJ[G'1JRjJ dLJUH/R4mEʔ|NRf:eQe ?(sʔv\9C+)O? 柦Sn [S TnHCP_U*a-UmHU϶PRES+Ol*uTq*;TkB#ng;"QTl&MD-ӨeTLETtr S 3*Lsx_̠TŘD;R#HO`A\G|w:5ƎK1~5K_#ђAj J;HE:.$:JW/!潤p08-Tu)5p#$:5 6RCD TfY߉ #g č&.T#^p)/iTt Rmx-;B/R}}?OuK.fɎ:T/G{>yD&~*5 !!qn-n߅զgz_{Dgkr@J\M$ &HjI"]՟UϹ@L+_:$rQ!xF&E'*Rjo@Mӯ҅jf?.Ko5?tu9]}xzk@76Vɿt>]w1 ;ZҭWƌҭ7j(t_j*uo2k2D?Mǩ;uIGz<6G*Iꉋ D=D=S3"XO]M{F0?ϣ@Aݕɉ'9u}E[z͛FQt^ N u>у*8Ez0=PLKF=tl[Hwѝ{ AeԙK] =XDwWe~QkglkVNjH[=m,-ڎGQt{L}/,j:dmw9j6o9Z0U"Om˗S{!Cmt{m2S[|<ΌQz:@8?S+Ԗ$n__?#nM-j ˦GdQvj~.OJCruj4kCjj#E:q$Q{Lu B:RNt.9stέCg좳FtEr6i:7ڕY:)rHUGQ]Tr*=UʉW_a3:k1U)өT'K;|?*MT>m,2F*;HeRkW*-OT"8*+Cbl8ҝJTFT= O^"CTx¾SqSyjbV:DmG/U8C*ַP9gALv/ 3TbL%ҩRP E*Ѡ’:U&SP4mTmFEgsU[TpT"! dkN>ҧ ]O#({;Fm#M6rRbʑfq_MxI9f"e%se>9NKZ)?N9ĈkNt ޭ{'RюzhQU*vlTi/EQc1D)? 27ҩ#p]* ͡S&`VTd|x?9TZ ⶝Th$yBnS;d8MbPZk*,5dP\*'A=*ʞT:TZJVRq1坜Jy}ZGO*ZBy(Wʎ4DPF:yw);Ślʑ9M3sGvҔwGMt2c(eYA;(ǫr({ J-g1$<֠xєhRϹQr ޺Gf(iMS򖡔ӋR(2{ZFRvEQ>JRZKJ5t"0S:QB?ӉNd%St":NQR~%5PCJ5YFC(5Ru^˙R35z(JrJy/DӲ LK)P=J*=@9+Z?QRq/VNM)%ΥBlEK(e_@Rv#՗T%EpC5TR`AFTq*?QU ՘_tF{ UM:T6?FT+^__QwU~ET"L78}4kF0ji6y?jҙ*g:>νWsWS}InP}M'qb.q/5h_K^C wID-tAΔJ2]GW6st#].U5ݓtf](EW+ѵDkvtsk&nVVj%G-b)OmBjpv^nv@j{xN6GwS e@w?{ zAEiy:{ԩ3(НVBm}S-欛:ļ2[}w]+r<+eWŊotP`1]S,S.P2jڷ.}Cj[NU(jEl%)pUЙRxD`|#<ړ^B +KԳydh&:TN5FjEOv}J:MiOu̓A;M#Yhϐ tH'|즃;$io }|}'c 0'QO{&KCf}X&}2mU!Bim:e=MM/iYiZFKvp'7iZQF?ob>Z(Av-HRGZf=15~oh.ćVCh<-~"Gմh{rK5_h[}Wu' Z#A n&SorP%GxZf$6Z}\LҺ}Z){PM9 r=`MD%ie.=H+#I#_䬫G+&D4uoZk9<8N/&uY'%']x9LK>%0w;ٻ' -jHn ?Gs/ҼYD˻V̓暮#%uiTZ:켦I898[Ғ@rILnZϷk:9~!iGeJr޶z ȹt-4H:Z.ZhEZ^#drl3'4a%D'vU [dh4%;d,ov -jŕ&AMhS_xW"dNZd{0Y'o4 5Vݩ%d#54Ln##SiL2# p2Mߦ93uQ0 +w71&T!ړȺl~Z0ى"}4k8q4;LswOK4' N&;_HQfLk (u%MZM%4y鑳,.q 6Lg>s+ia;0:&JW҄g4&BJ$lAoIIѠI:;8n{OѨ k7iɤ=749yt.%d|?ƿi&}Cb3xFF -M<&f&`2LbRE44MhjIs=.V^JJK uHa%%JK> >6F54n uDܶh5 I#ZmRy܄HלǒJR1 Ѱ4L{If ImCruHVInTQLJ$c{$<_op@z}[va/S>^xJZx+Dx}էN›W[tV66]^ ^fۆ  ~vT [RV_ײO o-ސ޺wZ~g𺖋k+„>^!UpUMY7aG'兯 ?`ky ~&G%H{2=ō zl_ؗo5_۾ "!»$=Ď<h2y5|'I0%im-/ ?>&FiF: ɨ64e=c)1%'yiwd1w举fK'$bD[}wS9zM>ŴLE*_(؉6g!sR9Em:Al7U/EwQ]mhp$0'%2q8ϪDySЬRZc{~Rbz?~El;l+6n3Pe+-?Y,$fg`CudXҙcY:PB64,g&q,mGVIkXY$.ݹĂuqĮn31duo^ G>dOaW,ꑬe8V*Pؗo\aw9}cv\7ِ q ; RZb7GƳ{vg:;|;f%|Ԟ:^nf;OgfhNQ>TVQoGEFz'ekn[WяIe5PKD>7eUPrxh pſͤ Љ_2TE-ut:4ośt-ʸ?#Zk-bZWDIoXOg[gXl6 6omY[6kAw5mm3zr9y(Y/z:Z9kބZֺO|'%kX)Yk=|a=΋hCCѮZ4Pb}KA;\v877'hVgYg C{TxhB'jգ#p' qJ<\*pތ*ܹj՘Ю{N0Z:mq*uZN'r8飏n[[ݧ&u=qi_JAOİ85{1KKGh֠ɜh .}Dj@#^z×Q(6'pYTYV0'}O d]EU^YT ^{Eٺve5 =qr*Nځr_WqTWJzt:=@qe(4V|Q GƭGn3xQ_zru&|k Bm8 NЂ֣]϶o_c"'2 څ_A8aYxi6Te*|0fk1osR LM*< -v(1nBLHmk(Z"L3>FvH/z2#·oQ>Fˆ3f.~˂ƕ#`}gt\,qB;n۪v\AP &qs fS04973CP;IۀV%eex/qs7pR ZtfHGL΁aXY<׋TD2RE"KϹ-KJ8x!p(.AY \Y(W͢ /0ڻ!w>px|ue縛s_|J1pfR4í8G? ^`Zǥ)|7'˘[\zTۈ =350 \N*/ 꿩>]lц Xz0>KWecU/GPh0e=sck, v4,zA\d7o}3 gV˯r'ۘKa-lCmCnN!HVtL~M .Ϙ?=kwM aP{EK?޺Lzk+tSUPhUxB?NI"0*Fux;? aúXOK61z>.kxvfR}1 >9[pĶz `4!k0Wo|YvGnr_4%r[s`:8%/'G2;5P˕yC`'K<ڬer:=/ #0Whf61&qg oݰ$cD")`&o5e6ӄkCI 3 f&q,"K8e"zYG jvV)'`L}9ŝ螞ǔ$xդp"h4B!hRiF P8 BZ<: o`ɹ+E%8jQv5l(I^{ 'C`n]ւ~q{JlR#81LO;\yJ{'4u_ z"!A|(<)b:=1{, Z맼^L6N|'u7!3[J/[=N=oq_f\ &- ?O[ 0ppĝz[K94{%i|cU6')s?rqGb(8,fÖl.Ǎoxr =*nA JMua]18[ b-|d$mOj6,{fr3U@1Qst&}UC>/F0 U+,H|͙ uWQ,+Qz e.nmLZ]+A wrKǯG| Ce@\/݂`svhuH֠-Ŕ^4;⦁؜P^­>ɗ`\4G(I<) 8i/J[Eߦ$C.{w5JTVr%*+̀)a ?ƥj"Q3^AaHRGw훬TA'mGo>fB@}=֠e|;ic~U@gm8 SfrQeWϸ|I䨑C9tV *Z 7(φz0W 6j%"Ns(<'JF")^\XkT^y"[>ێ;*#_Zv-s|.JgJcDܭ"h@9X4A^ac,|GÜ[WԷEDz~DCQdT3HIr^UHj3cDzWы0yojEmkkIqY?BuC9<*,^YV4szn Lˁ NK7̼T|S-2oAuMŅu*x'ݳqSxw¥{`fd-D9*j`a,f6[ clhpfނw016aT&m;<˻/|-l+f}+?pԐ"0ZT*2LsneW]dK3 ˺@H} bG{É8j>([3nH;P`gY%L+|5b~ G'l WJu ណZ/Q T0%ݷOglHAQ~8xWȭGЁ]jfm9Na21pGt~yhlHM}EGEl*Z}#QVI|nτP#h FBψ8} (MF))iQ/L;V}h{::C%!g?q<< GŽ"p|4hf]ep6j=wIK6\=aM/DK.6Ìpcz'&F _ddd>V-8?ǧ8m% et|k/]q^R\7}>6|@ Vp~6.z??[p%T!ƨ ]9ehG]]K#iL@ٴ(GL=}*[wQq; hp;\ kV(3w[ ~TIr,s2ɓy^,_e:\|aw>󗷼31O7\vܴ96yaV(d *ged>ͷ]nV ,yv_2z2ټDjMpٳ~AuGPl`^ [Z} * כw5X#{AR,B$t/GeAjrg-= ӧfgTx ]G')ipf#pe Lkk!j,xsO}0|Qp> LMO?83V> E͛!` Q J7§WpbYJQq gh]+9T pR['7 -yvxg'1hK(Yh@UǎBCT}rGMrhm)×g0<? gWTZS#jEt$. bt6lAg_D= ʿC[@L\ a50$`zmua @u*T<=\^ ÏhĮ84 >n5:(jh1wvnLZ 6d`t~ -Ń1>L0Yn"d ^g rbtЙvyt?BBg885HY ax;AU&w^3guGOkks; mP9S(ʇp;N-KP^[̈́F*P-ԧjAK!0|lXR{@r^HXN.A^ {7[۠]) '7}YCL/.k̟2fWeoqOܯ^̬ҽp,8?60me _|L-; <;)om_kK-abHa;!Oҟә/%b~lɔ|&نLb×] C:[ݲ|F#w7܆e-{) H9p_>>Fnј?Qc2swfHuGFL?0. ۏ`~5$ߦ ^( Q`ijO!U/}Lp`M3 u$(6W5Aa]e@}DD/ $F&# X+0*a~l ˟= Ftґ+[HK\pqB.|+6& 8I| dP07*Fe8T)^!9ndd3=| I! B 2y7KW}<8,ϟ%: ;z`/WI _ }5۲5a{r/J@(M ..V|l})na g[@,_~ ~nM[J9k 621kɂN0CA{ Ѷd,1AKW711LQLtHW5#c&ѳ# \@u'-bJw *s5րA\L,f%#/a|0?R7w^T bd E]-: uEp֢R5Bkwn;{puMΈA#]) /O&§ohxx"6@_'QgZw<A᝘~SK.{:/psI0FyHjeEb9d< _1f* dF2GacN4 }nkm/}ߵ̸Lrf bnp;n+LlQeݣ>b+<h&>M_np$q^: YԀDԬTd[aC0l^`  u}it3<\ġb43><1uҸܴgvb h-Gqڞh&=89}7Nx׆︣щhbZOڬg/*ʠm#勚Qq6j2H̀c޶o]\A<hضJ]@$ c4gO$.1C@Ki #sBa:­($y/ 4AV} d W !hW@ C̈́pN׆=Sl= 2#;fOe5,0wǀ̙B"id>N697nѠysXӽ"s$ |&(֯$`mBpPNog ЪCn_8 k~p"*+C-~2.t[pM$W`_ zr[.wUl:JG@}Y6R'~ )6Ҩt FZN܀St,-j> EͽO;d6E({T bB"X ۡg /p5uڪ"du29crwBUT"cS\4g7yYu22ziH}&)fV'p%͸ߪx/6Qj0mL~+nb1ZhSFb[ł_f` g<?竘1p]:Y `U1܏SiCG%FH |QVg)Xuy se7bt3qjK]+U'g7涌Hˎ *`l j`< -pB!b6iy ~Jp=*yeV]CAqkkũqچ2Go2Oƭy|;x2֟ w|+zpɅJpjn8l &ŧhnAnk?6Y?gyЭ|z<9љwƯKW:1GYkmgGˠj2,ca;)s(-X c^FJySY|=>F9_˃xWlgVHrc y=n?Fi y<16irwfSVpʏðЄa6wf[O*Χ(L~o%}K9AɞU|YcGj^|9/(8yxWI_ v+k̀ 74J; MĄK1 05|8y/?,yalwd ^|~R"I<]Sny+Wq+ԸggpoI`Elqxh]Ձ9\y 陌 ]ppnBA5{ȬrfMN*UtWw%h!Wy/ _a|z>Y<V >m^61~z;N9hJCޚ Q{*ֆ8 ç+ߵ\haO<#ib *'[wbK턬4kU'SayW*胍Ç@ X'_zr [MA7dبiGHY Wm-p.L%Ni!^#yRrkA)pd|Z*pxCȈu-ȏk٨Cv SK LbdyO0ko+gLafq:xB}JLQ{">#Pv-\/5)!p' CڂR8>,ONd5rD8 "S\O(=* ypBxxQpAm?Ӱh1e*| #;;L) :aymu- 3iF,D"F8}0gЄq[M|CQ;:Ξ]x=PT):c g=lgl%Nd .&)..EWDp#.>Wrpc~\^Q.ًh iɉvP_jN5@TmJ?uk^#9PS7N\/؁>mzp'.B\؎^Yوk縩nᦳml;_|0{mTWvѨ ._ƳL-Ǭt<)*3DN41G|\-Ρ<`#f&y& ^.Q8yj! \]zuuCa Z(0F!ŨW/[.8]s zwW mmА&V++uAU1A̺-ft| =`8u`NỈe( g闢ͮts} `06&"%wA4=ڊ=JG4PAOTV VTK;p~W:Yk|N9j$n7w]>~m(nKy/.X>[(AaH_`̱x  ?~)za#|d& pFZ8)b Ei݊[& m:fN |A8mWSC#V5>0ƞBAxI *Gg@xg|U~FQP[8v?Q.{B:ٜE3QܟRn$llqlWމBw8|M  ࢘7e#5 g_믡6HWx@xe)n}hJÊx6o>`Ђ^/dp>{OF#5X7t mg#;.4|AI+;7^ oE1GD5X" ڌΓn D=R, 7MiR=U6rtCeHZaaCc̩DsژQ8e[K}|ѓpzlY럢~;\ݘA^֒](yZ;m*f~hW^O1q ^Ե{ؿ`N݄(h3]P7jn0xp(?uE۱2L0y/D tr=vIO?(\(R:>nd~?VUGEV*+͇݇^8w}U·[*4x ~~wnƛNxkkU=k6~zLC^Xčg^iCPϽ._t3vw)I o=mZ7, e3tkl"NYLjsdY8o ܗuc=_rw 9 Or_<˶KymNpcw@ 8 h ^3[whc9J [814Ymj _l`.e>fX-@:BΔ8}j) Cb-v, Nԕxy2j5 BՉpΡIQ_F3JPJ]^'~ups`DG|7K_RA#lI-cf]NpI8z.nW+w=cS2bХg18fn ]jp\U<W0X__cN D^[~?,ߋs2Q{* * 9wK8lZsoP R]~,mkCz\tNy>dހ#E<=ᒍ[WÓR螬 /ov&a6^ ;S,?s3|G..W!uLb5u~tܽ3%A3y9s9"AR@vxuj|:mq?\Gɲ(Fpc8J_8n'gRQ$ߞ?Ҍ-pLBcHl( ͇{J뙜67(ǡd1U5Q~N$S7aK(*Ʊ5U)YLg8fS0*τdYFg&_j  0zt*?vwpa|Jr0d] 7L Ĭޝ{ jtR<_9 F ܼU$Xs vEӅ˷ b]Mm(d9uQ<<%"ŒP¥~H3'51/EUr1BKEP :Sa]C5EUY&~-\d+i͆tAGՄ9y> *1̀E<=f qQ<5Aӌ( "` ˝o-=~P :jox8go_ Y\jv|~6$eyȷYf~]ܡk lyκJ&fs=;%+ pZzRNϺ2X+Tw/@ zF$ 6? 7Wo }$:qhv j9Qz)_t<Ę~pw]у 1+l$:ahdh+Brb e,D+lzNOw q%h$/,Ӂ6sQf~P(Vuܞ$kk ױ7GD$,Io%=Ev|w A R s ?!1r"(/ʆrILAQ= cox[4^nZ'D~^˄mb2kj|Nz9sF=̗(H΀Aƿ.Z nC_'c6u!I5M)+["?,Gh2ǟ4'3|{ ۷U+<ho\Ѫrh>'Iq=(=φ‡pN86Zã&Cu\Qã]!|QWt.$p_-'q7.sLo ~7am4VYj\a!t<Į]*y9ǿV̱٫3_-XOuop^K+g/^qUӠbNop 5̏EsmYLcd-['c18:*9r3Xjh@AI 6'|Bch^ 9l9&5ޣ0neEi9 ?nĩQ_u\:"&Pg3yْH4Ck0譎~sk=ڻ Ih:NEԋ%3 uoZ!(= ՋUs56rAqLDgB˸c _)::QoE1|`q?JϿ;Psl3t3`&0=5C}{ "D጗7["r ]A9_0k>(1F?Dky%G:GkKn=\,yg;5]|I>!ce o=N|YRr7]PT+P4f1-98W\dk~߭L~͓}\[iA֣hZ&}{pNN\jMްgl5F8qETxeUqZ9BgAπ]P j>4P lʨ_JuxM 3oC7T;/.Aj!FCo`0tV%L}be{19g͇Xzp;dBQr9\ ߢ)khh mky( ʽ '!jWwRG<5Ap=&R A{vh:7WQu/SB-8ydVr<\m/D/ +.Ӿ"WjJT76DZ/Qyk|, (+J{ Ox9P*GAa"Oac!:-C̭8Uk` ZUqFnga?s^Kd!|~"I~N(`^9/?yr?)^k5?.r']4rV6->ݱJ;}=Op8D= .P>b\=p}YAg7B>n3/alp|4G[H~fÖysf!$ob.Qj1.|]CW&|sMh4*}?[Jfy _Ș8|șȨ1`k>v㊿ovOWszSyG÷7GyoW1дTZ-TG\ٔF=@;R o3.أPڵZXUmsZG5+(̶sۘ1,K}.`N$+aPytfT &;+/<,PWy;s{ h)` K'5݄ewB &!~񌥊8{fjt j Ճ`6> ?g1> sr@mJcNix2F\6.{O{=U1}~tq9.wޏ{w|*?#ȆEˑb7%: #ΪV;>X~N?~3GTNZX'L"&

0/E2cM`d}?[3&0g19u L`y1)[2+]_]i]i~ V1 F NU|ݰ=q) j  Ĺ6`4n񁝇Ciͅ73 UJ.߇x)\9^+PrS`άC gQk$i$6Dr(7+9E];Hr$PpĂlT2?T-hK6I: 3[pY( eqo{ XCg:,X[@>auq Oyj鮅ܣق/1"_m0/6hgL5y\"Ƶ9O;b uLK6BNLȵ+@is)\^sYo'& xQP<O(w { /V2" ڏ:EN!* h·ni&i@x]ȷ ;bA\/. NwP8BEĉUG4yqPc뷠-߃͛PEb%*'TB p(SSCE M#ED^h{'깈'!>)Qe;Eg,pJqLl1xci7?Zo˛Cɑ5-zP6:*gï+:%AWz< LF:&h ,#ueh8jJ5mϠ"޺j(.=KtZ(돆e82*kW|jw(48@h 78BI\z$ggC!Gn| Mvtx'4հ}<,jyP|Pr|P!t8/mFSkb]AI{< 1JIa%,цkl7 vfC>[>e0kH̛{rB01o;J77A +N֯Zf  ~:u@/ JPm~]@+!!o"X{G:Y8:wEvo#|^=K{Q}] w#sb`7$o649AB4 wVCQe,\~5uBCt-DQ9n.hQ]p&(YuPx W?~xZ+}!?QPV3k9+q-ۧ7SY% +!)ȻTl㗝G]g@=6@*|OSaga4Rh*1F8 vH6[ .p;}fY0`q 7#yU!K#T8mѱBm/#nU'qcn8/³3 \c8 _f0 wɷpOģ3}_fMr0F0Vc 6aه.Y !#swcdWES?vmtjMǵOzХc,:qqo *8[ ts8cN8:;g{fH[%~(9j:x K[]:7z (8wTNA^x"8?@{pJE8dP /O88Zxwh3({=-Cq#5I0ysc?hŎCwqFx*aZin0A> '?>*uJӫ(sSr0f#LCިON#=>tAXhGp{m"[aȂ~?(㏣+n*J}jエNкE8tjZ@}h4P1ܲ%U)G\~fGqUqoEx\:1IC0u Lr?qrajF<;I9k1uu!n>BmV҇;mgΩfT\!#jt_hP fw) R=7;+ V2}28͑ /e1$;fobX)e6cmcbќx o'|GnOU}k<Q:+=vݴō<ჿNac^u f1x,V8Y5N3nMitlyiMDDĊRL VxmJFϓZS4ie+Ʃ`wX|F>6>aݹkXnYbY]Icm/m2Ibmt#o ZK,Oi4wa bmd(Ɵ)IXCr>c]O6ėW`f'.;RV OnG7b35 ZƵ#y離kIDEbVD$ {V$EĄ,D%ADDĜ3cVfΞսbElݩB${=$ǢE\Xx_0w˳S 3XD_![a#SƩh2FW/-Ny紑cGNHK{8l| mMyrhg|}eA0mxa_8TzyJ;0\"1*Fb s&ߩ#pvR/p]X ge6Xs 'A&PfEQɟX:;4܏jƬAcgVɳ庬}*-dA/ϐlH/x8ۖy~fZ8[桎SṚ5 LaWa珘uI6C=9Gc@*`<Km3K1_-m#rNG+=D<κdh@XTs+&~ ϤpǗ?a О\Xӄõ4`-,œ>) [1V0+Hfͱ,!sܝԸw DD1Z)T.fp}v;RͪyV bL r?,pАhȽP\(]+-nz(*POwϊϏ=}SJGJn7\-=bN\"6^=@wMx6%<`y]Y)V3eOdb7o;+6,i9vea<{$kb`:2\ꇳ!?5yxg|>*o1{g&FD (peV񬜱hJ➟`ǣV3kkωd?Űø)݅Of!lؽdȽl7y=LDŽ.VQzm,1?[zqlp6oepۼZHgÃ([Ь䣜rQ'^s.SǧίKhg>LÇN/z[y3xѷ|E~{~ .kĬ%p<)eũz.U\5n o\xLIQHdW=ѣ|\+>H~;jۈgrD[.l>os_µg {˙g;sl8b[b"o\#d(€avE`]'X~C$e|l>U.zRˢ ŢɏVko~I^64 OU' m/ N"U_}>"brSUDrUX{'%t,b;ٻ%kHcož;؅xq{G_e.}͋䲸еX@I)+]p/;{G~m:?ҼK=^Z#KdHݔk:WܺOaFgRڊ*:E_YgL-=21e$g|7Kۚ3ąYs=\ߩ q*4^ 4` V?w{ol$w@ڙoXQe$zf ®|h9:gUҌɔcWC)r 3m_կn}O+Mo\[vS(ɵNtr|+;z[PE(L}6O wnk-jy[d֯m0zǝKN37ӃH4纵,Y;'w;01R+n`[pȶN$]d*EZ[C]&~*z`(9Qu^5iLjmTMxӖs*^yrOpj0H&م0#iܔb >=(oGKT9h r)ӏ8^.r׹}㇛8Mڍ/!x:N G3hzm3]xp:lp_a?ƒqg8\1 Wpb7.ۢE6.ǝed GÅ[8.qڵzZnȧ(RPc n]Y-`%v|խYaks(-9=-c_bW1϶`GLڹ2&`_Pf>c?B>c7gnϧ20B`QX1'ec!:RlDk@A]D6 whC!]Rao =3q*{S7j Qux5zT@oH-3F,ĬC/HL|dӑJdZ#9nRb o-TxBIepG YM. GvyWmC^UBX#Zf"F#@G\|#Tm$*$#$ yD(ulF١2TYDF-h|!O?-GVzZ 2U!)_> (`yo-\, ?hSA蘴}t1FEy\b Cք*$I /Fvۃ8<j>>Vv씊?xv6g;!OVmŞX{N a1&t,=WYSl mYVOWKg!G "uro!+ĉXddllA8W7K\@؃AoX擈ņhIJ3w*i5ol3\M/" hWLF.K}qL% a:.m0JN h[wͺcP؀ZCEpPFIu}iui_pP' L3sE Pc*ߠ68VDzp<M9h]of%47UeD?5ިZSᨲB8~',qsI4!3T4wJWQ5U6zU**C 'd-.\pJH؂iFi ? mOԉmj'U&Qr2i7CIg  {P*#0IHLdHu祈 cDxC;O}SGG v"2\!>qT[Gd fs*a_&7·7P^;_N{!;csuX1\`A<-UUpz-"G{YuX_ 6f!F:" D1D9~Q 5,O͞r{#ܝ:-^T-^HS |Mm2bQ?t9:e^^)W _kݴx}|\]^ćW Ώ=k-懯G O֒yi}uCDž_uc Ҋ__e|)G~s9):$6wjOFb͖Vn=];h=k]x43ǽLi-5[-B%e9l5no#.kVQ$cn,LYtq߬[[О,S= I5Gw9.4?!?Kc_~vXV,eiv46R+͌l׿ wM_L~K|B~>QWߘb zz5=dT6Ay2ԫ0ZL; W`w'Fn V(L?n ^Ofy.{ˌ=Qf_*ADC0/Ti&2b20`(i7/S~֏Wp, ǴE_*:eET1v[֗4;cv4˃<;\ )~Z}"ϵ9 \Rβ usWoeu?X#bﳥ1a53#=l3%jgէG.wTeM8.rZ~%J}wCVx-+5?^||}[>S"___|\̿:]֐y{M,߽+oŗ}˗OlO;vzus^{f?[?t*a*:h\gqI\.[}g1øj`3 e{Uضj'\MJh"RZ.!lUu̯dFV:5`=*٣QO'^w^_P{#G@՟P^ _9GW'ή@Wf+?#0j[2M.gD̘|NGɁ0'PW~18emc5 PR^,=o$ہȄ|ĆUXYEU"asT8CT!%wm$P|f e#rA^J%P'T.!E83'HXJjtqօϚ ?e/77nC6<1WAzD(bhl o~az[LZֻ%LH.> ewMu vŔΝXzβ -첒>4%͚e5WY.vx4,b4Gm\/VMd>1L\okeA{}:}`fWX=,S8[⾎;ȵ&pYq;9Yk]Z\˂{)w)~A+R1ntt d*u:U'b .^a{B9NbߎfoK5q6{A(c8^+{p0bK#4IacܺrlPc?L٭WcōIvKaaK?rl{*.v2.g]fl#;rk*m4qToYg>[ ڻ5Dʶ9휏r;ƥMŭi2όo|@[&IE;dTEyeuӢRu.ٛKsma.0"Ifiz}[YmV]njdϺl}HgzUG/S5ZŢh̢ڋMZφY0%WjZ .<F?n[-ΙKU ]>eæ4]cΑ6lI,Ϙuz>$<àI5da,Mw:P R uPvrՠ8Ay0p^w{ɮzX;u,ulPegz;Y.z}[5dg"YJ);`M5^f&w{_p?Q¿+ (d % NYn7&.?֛?7$>IX/|;#?:q7 goxqCE߿>_!{VaCiHm7n5 zlT(s%js^sUԱYXͣ:6+\ezs7?2=aÑ_旬"y,+Vޖra]ߋ. iݐy1 .BV5AEC{=ݘ$]ņ_ewLoXOk3.f\M#Q_߼N~՛ >-jaqP^ew|nE{G^nf|e GI.&=/,\f69lh~2 ,E%fv''X7g^ŢdA+i*3f˱Z>ƶ3Dك2_ɓZ6bSZ_frB4wI} WKp]w\h.B˫͝l~J53m.ۺwb2;[n' pc*rҦ͛"yqk 5ce%/9/W)j}&T4knŢ">+\ԜQ$&6ʊme/C$Pґeޒq39}".3VsF#83mn_~˨۫[Wߚڡp@ԟZ m}VO$aX=h.a" {oZsM[芢~wj S l벰:@a [AXj%xo&욼ABJRG BKpHS88pP=X88B8KH/$mEBB8vE -D9!D-Df ۄBBz2|O5TؕK6HSWSS֫{ >AzÅQBB!jQ yS?9ȪT(*±CiByB_XR m}BkxYֶ^ ɬDB~oW(P c⭭Bi@P~aP5PIo&oԅ B'ԭVjG 5 ڥRBkV\~;C7M,Tg6 5ڿ_7BcGppURG8vThX)6z ْ™7BϹ\%lpudEpm+FpcUj_baprжB_ Z34AwU',JWBh ᨹp4QT.M& u.Bcu92S~NXgPp+ẘCn-:˅띄KfPp$CxQhjZ' 'w; ; cRZBh~PC(˴JOeBM;TaPrP2>C(~*'͂pPr;OP1U[!+Z"4) NImX%4ӪF&WBG څB++!齔:pxf]{[? GdBT!н.%^J}z_'l8!6%k/LF_OLC|+S 0o7|[ݡnFw%oAC b ,* ;څǣ;i |uR~c!];Lf|Z#sl= ?opAKHKY K6 +KO*a@,W[im¬#nd?ap}vzTj7|-H%4 o +zm. LPh`|J_#L) qX/<5GEP)U?PSJ/'ї@֞6U_Noyn|>Z?? l_Z3D |MamނJV4zTP[&gW vٴyqQ?JI2]. *"^'RҼC+U'Qʚݘ؁O` oo0qXgݍEމ}usAάQE%ZR6:L4*5 +Iɬ +W-<E~0rqv1#?sX>Q,\ީf/ֶrZsx>E5wd_>ە/ǟ8i[OoWC3ھUW>f*ހgցQ~|ߛ4WQOW^L{ir l.&5pc۹S6Wvdp}5AmPm׎5Zl~2q8's?~>y!U!dA]T*H +V r?RO5]PS<ױ%vG VW^M|Q|fr鰔5i/>79}/[[PZ5rThhJ_k%JBqAFܬ7<[5PThʖᢖn~6~.7^JAua0L0O0ywW0]/3B`|-Ap_uP2BBW ZFR{FVB\!2!DG&7 n # Z‰S? o7*ۅZNpapoЩThOP:F8prPe,dx+$d2 BX~@!{&ĔfaB0EQ0|uoeO:/k q[,}lpμDOT/3'Tk/'HF,"Ҷ\6H7/[!q`P%YNHM#Rvm݄ BBtk!٘ YKՄ5BfDPPJ81=]8#m)܊0ޏo~ԇ69m9mJjmCT4T渵)7k)hi!mH𑶡nmCnjM6m6U _4 ."t}"t-lZ /# OjuDI.x&3K /6%mK)[iSH|&Km@أ6K¿}%sw[g Oy O}wO$: o _?K}6h(lS 6$m؋65mgƨiӔjӸ6A5mi6_nmRmnX6m6-;6;ƴk9LFKK۸&^6{_۔Qۤ7mb&ѦMC5mdQEWmCrۆoawM}F짶QsƵM,n6TVݶ1gԞuܦ8MWM}'sv!m %6_U_^mR:2wL6J1m  FJ 5=&GW&uM!&mPelᗭXxz9- _Kw?sL4?yd7?r~^C$V-;#9Êc+_~˝U*x\_x^{g?JɃ4?P/vobu>!mG~;ᣢZ*4ϼW/kySmڳ+Zt6YylV)cN;V,b.u6h6!"O ?fτc(e cyʙZ rK(+lv*;~ě;fMY"V:!+ ?X t4 0{٬ÚnKnaWLؕ G[_^*]1YE.\:~+ Ks62١CY~ ^1] (*Dk`B@.h;85ކO8'Ŋ3,ҸNCsg2F4$fz=2pp-j(+^Zlg *cQvo,j˟NE6ʍPe q|4\;g%?Fݐkh8jDh|O'N~_`s8_J[B8~]ukRPs$*#( I9g0P{5r2@z@Xm6c}[XUX^=mKG, 1͈ۺ`< ZQȿg0QXm< Nmkeamd]@)9!lVDOĦ/,;e"TGv=H6oېT#a[<ļpecDD{D-8s==K10! ñ?i| '1+y\ۋux9z`j)}$|-5ڀA׬7XӇAszI={=Wп͠T eBjzk`wa1X5ӡs3FBrG8g}DŽV i1?ǰ6 uM1L/Qգ&G؝x Ᏺ<GjR$"c >1^M)uQx/ʸ\$e/RWoŊXI!zEbSB& xW"36d_?J>`yʆ`nfխ_x>p75xp$E DSƎQCxVDz%aTh&}:y,Z}Ll&g2>y?6=)"[pKOx:"=CD 9m9bH"n^!Ԭ]C<1SM{;m^T; O{ P!Bύ8,'q2BL ;ւeSbٮO_`.Oĺ)~z1{&`ɗX݀%cA#x!`KB56sX5 kf1اah?"#Siu8;} {|I.(-,u3L6amPmF-U u0Z=5MкWq6c ^Q wfߋ # lK9B7H"<_Co@GS\-3F"hT+a1 -"F,$1W5x"':a԰ueWNbm:U_b,ڈYk=걶 ؘ KVc ̻X]x[S5{7a*MrZ[Xn*Y${ay5]Fx3N5?5vވNnt>-XXP|? CvB~$(_W̎%+yB:9+( Z:X|aT? 3;m|6fuz `cUX Yn&@g k!;&Jyg:fkb-+0Y0d)EY 60Cž2M"$F91q;Ɗ1ߤu ٥IKe{= Nb:Oz=#ٟUVF~2&\̜;Fuaz"a &2m50ak"w~Ձb 0y vn,JK4o\GqכXx%V[bU`ٵvLKmpN8pj XaaSؽͰ =];qy*|^uVs4kGa͙Q𵜄<6`IO q4s16-G34k*x /(\^U7H7=sDf̣"r!7&rZgkJɴȖushob8ny-wj{ӛBTEfzBQ ͢,ɢswiowx|$E03rhHZe<Ӫ N -'ӂEufr~gSc4Z?JL,qWl^2>'3dv, :j-ܡ4'6>yh`Z3<?ilZE/Rg2vB*ЪpZ=C3?|h::{F4>"-h#*BߑSv9޼@N;=hrI-6@lGz uU͗0<02B28~'qn# 2o]IS|Xr<ԉws 'A权^=|D'D=ad1cYŗ.o.Yf#w?JV4*Y^&r;QK7%IŸCDkkU\Yu&V̜.취T99r0Ds'[quMNtm8č!7i>;rjJw}h:in$9|M{#Y(™dΒ8I~Fܑ&b!Du?aJ쉞'  &FH0r%Ѷ6sDEz +&}NV/%"wdzY+МyiNtK!F$?d7!l"QOVTG z YFV9d՜l>́6uSd֐8F (o9DV.edY8[)OVKMzv$;r&Cp!9z呣D=I+Xyē]A6;֓4gcjJs[Y{琵 9#?z"Yƒk*Y~P%?ůwB!‹dÄfO8I&[tY < dd_H+HGw%:7%S'}v{!/9dLH/ET{ۃfЌHWt֘/sv-N%xCҵ@si9rt֓ЧIY\wǑqxlhb2L%ΒY~v2r,'CdMDG2]TB#Ӆ2M'H25HOT2w&ٙhd:d딒h2MF ?ѪdҤM&dNdlei$Jiٚ1odD&_4\#86Ư$k#2-2{BU YzU2vEwHP v$CidT(+b0='Cd[fm!G@I%݋H M?@9WVu4&5/ɣ|H;:͐Pʆ4sgqfND4}Gx<tfTHS.bOGTiܱy5FӨ#IR381: r+&Ha+6"$PF2h2=4ZLi~;9J<>ITmIպ' _wdG$~z=Ǐq)Gr|/de(4Ⳋ>ƇGƦ ܳ~#D؍w.Y>p \PED\z@Of߻8秩ܻ|=z-85gB׺Y8}n"c!eZWCKM4'q 41?h<Q7#jnBueYacA:>OhLcΤUJ*Q(B"4c9pC^kǒAy j׼Qx 'f> P(mF~XF~(H:"(EC"(( CAi!U. Bk%rDmrT#oxc(D^ OEa\M>e(Q☾w%F_Q+fT J2Qvh lCz-U, P8Q)BT$@e Tjw|C}MNS]jKTiF͸ԤZf@u}6*ZPg2=1ƒGv&j-i^JR(qqFBjD;1TA!4G"T@-=Z'b<'~4=u@͏ex>uh47Fc]4Gi(b96GNqQvah|uy#N-/ƙw 5tݹ^8q$ѕ܈SQ3й m dG{,:-_t7|бgzq. g,.Bgt \@OX. I¹DEי y>Os# jlrEcS zruq z[mq5+q_Ϗt4spqzί9:[ qqZ.=jUo~uƵYkpR7>0#7>Dn7|pG/ ] Ñxx?-÷]{ӍxG^5v 'g <{2 ϯ?=x-U|< ԼM&~*6$1&w!AIB1I/6#ٚK$Ѡ?Hi4hZJJ:Nj钊0R@Cl hH Рai&Cn^q}ICϩа @#6^R[cEjcWڦPR{K#2iļ Ej*rCMh'4X*H<%tRo#E0gKCMOI> ѐڣbNZz5)^E[`; \]Hr2)o_Oi7!OФXڦICc#_w= ӘN#1Iyu\4;&w>nCӌ3^4ぞVu#H7M=9^m)g#h1M0T^S7Siȃ&1dRCD2s's;͞E=k k"~Duh]1AbXq}TJ+θޏdFsUim 2"ZgZ6y&JIW[њ5qL3wܹE.i U&4/dO!{ Kf&5̉xZlmR oІs Hu_]IZ.{d۽"ƛw|̠uhMEy;i񼃴_V;N+F{rCC*|Ei>Z1v~d{ "ǯ4+;`Js"Jdu(^GuӜKÉ8HLܿ BE2S #q=L _U L_DSwTӤH[n5M;&M{4]&HRwr kInҪ%tR3GIn6FǑ[Rq%irR)oi!ii`v,Jr[H%I_AZHI!9$"֥6HKj%HZfIO2HV/ gH*$'Y$sZhHxo0I_'?$dv!4|II2IWIZA3' q> $$E g$ȑ$)%et%)RHyrR'ſiP,!4()dCHvzяdG^#I AR{i`^ג̠`dd)$o>"ZGR`'HimRQi9)&O i5sV?=&!Rw'4O ݳ4d/YՇI4}>)I&)9dFh8LCX$O![:_.$ii|+RÇ? s]| ue ><&)_FoIi[|/}-q9jo, *{,X O~ i$qy!I_Hے HGҀs h2d ɤ%IZ5$-Jh$JR$]c@OPKGէ$8dV'CH,{kL[$Iv1"٧$ȗ @$)d2Hi*+ۋ1sE4j/ lL =1@U4p6J罩_n\Nߋm$!dD]EfuO3{ #ɺ4Q?$a2Ի\ݒ$}?I*I𺖤$$kF2_|CG !xyc uVdϮk:RJ; I#)OzIđ{17㲳GߡAIl8PАM4`&01G!Rf4ќ^'=]@J&Ӱ)[iHs`w Q^Mix9DF( yH4-籛J#?Hce}Ʈ\Nc?x5Ҋ_@nN4F>4hl?Oc?Ҹ?4AZ&O ؋HϞFtmCsho;d0M)Ӥ0'%dH&y%C{aW4C)YR9ѿ9dCUcr=,4{r'DGӲIbGQ"%)<|ɴX ēK4p iNGɯhBeΚ@%A6f4~ot&کfTy:I?>ܛxv+Op;Y o2r|,v|wd9"FJĊXP5K/#d}#vƢQQz6ofklƁ/Hֲ|SLa,*;NX=c9\f%'؁^,ѵU(~`ڙa |'sod<8[Ҝend [IL 'a]Lcyn5&Lyn"S~ Haݟ^[& !5)B?.Wg+x) ph.RTpdFR\¥/C̓[UEd3X;H@#.82 ^CF.aECҒmb`+" "`nf'hl HVb=M3#3A!dc1K8Y(6V`cr@K=םS]oBxYa_X73 N`ֺXv}1Ci&yH1t+1S:`w5p8%;7Nw0A #bϬq1l¤&79vZb 5x{݆R\{>q6c$!/0\ǓG:γdhiۓ#gV0Mf 1I-4d8T~RWp:PXSz%#tcchVh Ph 2ha$+rZ{e\,K7d,"K'>62)|k}7UplJ |_ƦţuPšo,.Ԁ{a3h|`oV0vi`WLGt 6soP,g F,t#0͡ +Yʼn,"zِ[`=Y 01F0L#o202l0w OeQ W |﷑[H4 'xl.no eWB~j.j`>_߂OV*%g(ԺLhOSL8]&=IoQMH7јi [OII[m&Hk7Ɠǫp.4Ԛ?(y#s2Qzuq2OVCH{ brgq"|RODYO8m:>y_rpѸ] q$$2g'dq'EivY]r#2 Ck=JyeiS7^BŴH&V/ekȵʁ.x'r/O "ŦMRkw{I l C!STWANSڵ0:PHz52|mYSD+N-.} QcJ^w6ru"<}&ǽoKs݉@/&-giv[/d;L޽ dSD.'v92ΚlĐEDS>"WI ^(a6%dt0 ;FNCz;pv e[VJWCvᔬ;P\=|Mq)nޘC1{Qz',I);>O%RdH]I-(zEK(lOQZXE(bRLJqA'([ݳ(.}!ŏo)~%%OGqU0?h^pҍZP7w={)>=St1E=k)*En@w >m q(] ߝ,~-%)ףGЮA"ǝ}WS~m^%;7V״^*%#:Fk/-br!Z9JR4f"9&@9*"ljwɁo"=d;$VY? DdfEKW!qCH'&}MdA̗ky,[Zj2MԕBx|k1 b'*AtG,beWD&dIKɲ/,>#p;JK kd,L—M ]W{(lY=KdsIl"t}{nN֒ÚܜVrFܯӾHO^"ƓW|рQ g4:A_QOkObdMZElW@}bf'Տ̿<"S dLȯ,Lϑ_}|&y#I#dtg7?Ӭ&2R%ïp XJ= ՑnVt5izϗ#i)|?$471}AvHa͐KKiҾEi߈!)4Us)z4e9܆߿DV~=< )3iDR˹C#|ZHU/)W~$K $?,Kpm'e$%dŶޜJQ4`ncy|RdC<ݍ78-qx Yynm&f>xW7( 'Z|zi7?T|=_G7)U|7?}će {n)ˋxs(}5~/N n|M7j'\ ՚SW8$@?؈tEס{$g^3_mq:n@v@-K\< O5`X0E5;P=5Q3V}֨X_GpTUS?)SPuz%*mjukx*e)T DETȠ`.SAu)jNifYPAU^jPPTzQ[PUzƨ\aʽ(2'_Zcs{~ yrȉ.\P9"QXEPpJ2P8A .({Y4CM@a25nE1x whEFad "p: &;@7 6rWFz!rB΢~!;eYf99+6⋼?P4-F7(hGގ_ |{P!(19O" {`$*`DCS=(п(\P?=Pk{P[[PxS,AME܅usgՑ9x#$9b[#r{`F'mF"T/pEB݆ YUQ+QY"dpg*IoPw 8zv *.ɠ|*>*;\=q(&drωeȖ@VTdEpd\?# '4yb$ WUa5{pVL-F^9 Ԑ#LqdX#82Yሯǎȹ1ٹp$l2\AFC +aG"rQr9% 9>Ȗv g!alwF"W8P6ܒ;t$rN^DοȉbC3iJ@(lA[.>,7uEFDCI$<c DߵW 826?$Y_U? SpxM:Wz3 WN EHqr$^8YGwq12dNn@?Kd,8Lkqd<#}<u8r)uL"3#rF @ i ߽ P`Zy(W+,@(eP:v dPKŢlmDeqTI##gܳ{ޢb1B?(GU({ %"Q K:_HGޞ([urX+<)>K 2lePWՃ~%8!hnWAyGEL%laTt>iQ;8^ǻ8<W\ZqcPܸD؆[rpkT܇Jpguܽ{uq'wvS55{\]PyhhqG4MT&3&D5M[&΢J4q-Ϳ|oo-\--D֢٥kfga^X,&-f]Xl$l76r3r|pU-5k{qGp)}pN^),Mo ن=Ҭp-\ $T_$Fm!Bvsέ BC 4.^rq!&Qb«~bBg"{1I1>GL=$7. I"o1ii&TL~\L$&k Ąbr"_!& BĘ#:1!1X;1$n-"1@-A_2V Ҋs&oLj!ފjD?(vGp(Rt|+D\+ڔ?K"vU5v&s)hi"x]Cxu.C>c#BV; 2rb}vYwu;vayS(RO ̈́y۵&YKX =e4]m"_^+ 562D;Bf[Bva?Dw 6BП#i KӄBz^w?o}C41z m"( lHWM }l?D ( ]BwS?@M`N,t}ۗ }BZljgyhh-BY[D }ѼT4;F vp,- M#wf8MϢgBa6N/:3Ng(tYsS{"e) &IE W|Qhy!ZcL7E4Z N,k7*_ m!T/ yO0^NW 1$ Kڊ&ƮBUۿT8 ͕=vOB;P7I6}-}o4jp 1rS0.8ߢI>z1z pd O_&^8+v Cwp l2˅;apܔkѲCh/ [2]UPx#1:v-Э)%h=vu rfZ :4r-M>SbjGAאcjcfCÞd7LW&)ՅKSMދ;U9ާ)7O>Z:yþ^U˵&ƷQ:jIPi5\'JcD=U4| z):򹉦L?5~ ejOFR_DHM*OR$W;~ +Hu1Tcޔz0S<ި$OH 'I?^v}#HJ,&U=RI$ KCgRk]JpYTQ_Ip6vdfQ诩:LU(IN!+7P n\KP_' ):E!.)?(phJ ^I!~)ΙJaZSh~N|nD /)E 6B,0->B(T=QHr3\F)) 1Ѣ(o Fӳ(* A7(ض%+)h ?ON8O_L>Y$&>[F~3 -SŹ0}D% 0Ч)R@x 7Ri PW9L*qR@ WK(~&l@(G($2ur*T(. Nys5) ي|)PPЊ4 slm) v)ynnJGR` IA M \7@ ,yJ(pb5\@ R\yK }z1? )`: )!=|ױ仏| #-ȷ̃eg,\z)'v̛ և$_ۇzޤ<ޜ|f2Ջ?G2;HbEi&,XKֵ5R#傥l|6-!eǤse3bl&<|lɽhRf zA>Y6?CZa@Us267x=%ec)J3H9i)ۉ̴ƂH8|#VB 3RI4w<95|&9)}ASmnO6)'Odxwe=LmN[gIGcE>)]FJ-=e{1rIٍuGm'1|rBy͟OͭHI֬X"_UJJݿ,oRbzS36L;MfH9)2|&#r:ӟʘٔ|swa0ۚ~0~l1Y;IX..))KO2l9:1RXkW')?3mo[Q#g~8o:A>KR'RKʂ1~6OuvH)2N@]iJRf>浻<>)7+)csK ;Мh #ߖ<!\<){ϩXGuWtRJ2/U'VjQk_ۤ箂|1NXMYsIž}8=ώa,>~<:yONCo$_S_R !e`|oOcOJ 0@-3,[Dž |*=k ݝe#%XGNvSs| =͛}1قz֓|.?"ϑOK/|[I>bɧc;<$>?KRI>L ]3|ϓ qb)i*9ζkN>n@RgcC>sϑͮ33'ԑOHiͱc|p lg4=a}qT._ϱ:_"XǓıck7}?]cn1& jw )s8}b;:J>W?lvlǁ?sc4R_x+w-(GLY/:t`bhgA>CRFd߬仒m?e{:}wש,eGޞ|;&1kϾ.~|]cW,o#%ߩ'ݺt__7K򓛐o'f9S=5|9;;nw-]I!2i{9TEw=$;Kw#]x]g7٧WsD+o%ęoa9 N~FLG's>B~9"_(-f\/_30&?x # ~.\H5[7i^. MicB~;9?Bo,-Z:@~pJ~֑L dr9܁R;9wmozY2ZqyP0rc 8K}"[/!_俗e)hM(߱7?)W=WG#Fs)mu/c `̙Fe hGLCfS@]bW`z]3OD~8w|/tt|{&S#dLb_;oJȧ|֐ssٿ[p@JDy~+U1j.VOUaju/y]H٧՘ԪdjG >l|4$Kck=yo*'+2#"CL &$c.<7Yy# D,i4;A;:J6gB\kN^.yϞ<"Ϲ~&yG7p>􂦐gGHӆGo_\^2<4OavG}]OɄ w4r׊܊v;N۷VKn)nv IᾘvCrxOGKrد er8oCR49 $4r4% ~uٿ${d%{=kXwAv ɮ֙.'{[cw ̹dMɮ*x]u -BvZ]d7g.پ" .Кlڒm;d{>lOd6l)d{ݣOd[lL#QdlWm/d; Č%d]rlna+:~ͮP9l=~VB6;&Y%x[yLC־g.q3Ⱥϝ%k?dYId;,ΒEmY.$Kd9,!>dM'wŗd1"MBL'dѹ,l Gɼ,'%d>;'|e2Bf7"2!Ȭ#YT2{@ɬb9ݽBZdUAg.y9gY82o>L i2Ifs,i,2Lېi+DK>YVL/ndZҚz[ȴ%okNEvd T'Lk f%Ӷ{t9YdC)EB2}tLCɧdza1"yd!h$ dߞN\"3͎?$5lC O~Hv|@2Mjd>E=Y_2{<2׽Kˆ̇Xḋ2sr2O4mD=+Ls Y(d~}Y|JzdǑ,$E7]0:I{2/s E;;8M)kcl2<,b4Ȣwcn[Y\yBd1g+Y,&3oida<,2FfE#cq0dד,N`~EJtE\?iG#RK̃.YvCK; p 25q|emJ2[D?E&Y0K[2"r/PKÿ́̏o#d{0B懮1ݎd^̣N "}da{CA6daM9L<'ϻJMd düfٝI}#̎EIf eC8#MG9e2?C |n51!Lɺ1V:Es'd2{}clK;;1d8}zrƘxeycgdc_YYpXϲo8M75YVE^X d^"Yl"Y9G="KH$^dQYKAddYƐEe;k=݂|Ydtb}en~ǑŦ{LcyY\>Є,JW3'8. ϼ+YB,' O||=EϬ>^wr<1A̦dqǼ",#cF2:|/CCIeߧET}F7Id cH#Ixב,g8gN ySs׋ I4'y| Ir$|Lβt% V9noxk'7ې|pgLY,G{uT8O]"w#1=5F"$O2Sd7E=&^"p1ei$bKH-d,Ɏ'7ӃRzQDFd^AFaddNna )hlv'ÃȰ75!t?2\я &~-H%G2VJpw+2'#g2 OL? 529 >&GN21dx =pY2ٍ ՒaJ$V'.df ɴQXHF[FwdT¿FW\&]fdd{[>KF-VL2GFZEFud8! Ʋv8tht$E"dg9 d,%,%#Wd$ hz2rHg]Vdd ='KdԚ^,!#dO02r%Fd~25ǽd!A,G_2ɶ~ڐA^'>J2xy'sd{ĒdTĒL>d-XdTx{S7H9d̕YdI z"Y$:B/y.'ԋ$E2 $[>WJr$%&ysv}>16dk|f_^~6r"G/!Y!ů*=¾ݙd\7+IW"m$a nNgO#}>W~YϾz'ɪH؎dg&nɪHdZ0][k fڐlRIve?>L}]$ $Ar>q„dV${d/ܠ~. Y)@G$6ט5SH KG[rkr;دצ'${4oH>$W"ٱ$oru+`x[xdBg$;f{}±%Q#Q$Kr/ϣ,]'e/9:caF O0 H>c?+7$w˜1#;> wc9$SwJIǼ-0/M:`A+<&3fYլۣInŘ:?-d^ujyC$[f`Oud Ll $ofq$_~ύF$?XOrS'3j`|oeufbI8U2we$~CyOf.O5x2}9o9C&&.-&{]xʣ%db$dq ,J&͖vid:L%d@6 2YOJ7L(?H>q:s L6$376*,sSgZTY!ΉӸ$#QdV=3c8\)Foi,Yrwsl=pyYϜ+sޛ^Izr/ɲCЄ,e:Ԝ ߐh,F7բd$Yk?$Ajm)Y=@V՗dU #4K*m8Y;gUa=Y!z'ud_'ۗRkq8K6xko1 d3+ %u+K6fA)َN6%d+{J6~S#l8C?vj$Fqd'5?JvfdMv֧n]HgEv'7_sk&{dנInO IdџCz}BϜO+ J$Iduߌ#۽pp9L!3*r ^IEa3rXkC>Xvp"ʼnS{_ǒb0R(5H.)b:r#e[r\BƼ.rԼNXsq[r@Q)cCx˜Iqm)Ӝ'^&'g{9>rLNI-v'=gFr2!_4f{r 'Zϐ/r,g)hJj+n9F/Ǔ[xv9VofF8<m]IC=cx)9F%ܕa9T )Oo^KIp#96_0=z#9ί'Gy/r\fMg~qSxYbjR_Gw6PIctmEۃ1-N¨) Vr'9MYrzy.r iºYOND%9dLf!Ǖi.rՓȩ9-%ɩrzoAN9 [r]9GNɌx1ܺۙ.4MNNS86]]\')aL} 1rb$IJl 9rxZcw!k)6]'eR ŐE@b֗zN˙i[JHq )6"kNXw'٤ڤrc?b=]`xRzqüg{Iqf.9Vd?~3Fi7 9c?܅cl09b,ג'rbON&4prFN:ލqu7DrvU#gOOՒsM |F.ȹ<\f#[ɥ"\m#?UܛL^E<&wxIɅׄ@􇼆{רq+y'y}G^mXE^nW.UzY7vc8q'/z6'ȫMӋ%ϟKyy} y=/#u5yw&|pNj `D^UYC!G=ǑI[6gn0~J/w ՗U|d)FJq|.)#A#弟Hۆ|'!edw|"W;2t~~@ 7:PPaw * p zIA)a ֕PИ8KAx\MmAm)xm  yhd 1֡=fΙBRhq i,PRPhN N! <WPXNFaF(,7ׄQn@cZQM^Dq Q(cA A CHRDR,tfۑjqRK#ZTJRU{mJd6T^T'iLtOF 6W[}IeI$|CI;N˜T#qBfa8Շ"4N(bn EzHLb9ﳡ9H\Nt?ċyܙv&E)RÑ"7.#Œ"*"PdaELH(28.(REG)}EEQ٧Ƃ"[4?歞"v?q|Ey+Fg,A߃&S~5lE&ɰ;2[FA AmG>P_oq^Da>]$ڋ(Wz+"CR-Nhe"=fz՗§&i)n݁ZSd .Z-֍S)rE<'z$@ :ͣ\ >L!#)/cH ֚_v6S@q $\ X5R`5QBC'ߞ/ҋPhA[_)/ C?명J i8&D_N΋!ZC_vI:h]Ksvw!ЪB4DEbr0Ĭw5C[tZ6$.@H-BΌs6>/B;oi~G^}lz<.`'a-Ϛyu)k}|6Ou;OX찻yV}SXEذOe2spƒ/Dwt> w)$|o 2kxƗ ,˳T>2Y6W`4hCg?ti`*kne9J(-([*#_.t5z[x U "."W-tbn}>ۜD=)[ ۡow_ WcEd:T`[0#qF}`t(2 Qݧ`,Lɓ]1=#fXr#,h. /`s:eNI`O{_u]8raz~G^؃<|Ɖ8e5ٽ8+ =W˸x>.+=zĝkYHۃ|SԢHUmFnz5rGW^Bw%_RyJ_ef-Q-ʭQ:)(reEP5QZ (n(wv%nqk\FɦrԵQ2"(/"|!r#{-!a3rbGUeދCKԶMQp?ݕǽqhړP*Q5r*j^ atGY_STtK)r> 7Zc:d72 PP۠$oo aAFd_k2 "+Y#9|62gAFtg@fg3lS udL܁,sGfYWr>M1CtH ~#XTӏȊ}Ԯ8YiHK߉Hg"JG$G*c?\ꇔnHhD-$NAN#i@RnĿA$w$wHb/;#q"aw!3jU"U$BbHp*FHȈBB)GOGFؖHԨHIz!H?:yHȏYCX[Yvy !i C) | 'Eј2+Q2]N8ms9YyPv/."'?Y7p/\ %(.Q7&-CiVq0QPt#EOh8~gȻR6y;Q 䟑 :!{)!D~\\:Ȼ틼mțys '(/ߊOو}|(!oRmMzB~ot$|< yґW;CˎC^țcGLލJ-wBηȽ*!7'ӕcd_3>r#wD䜰A+WD3 _ KQyh2dg!<@n{y9"'3#{O# s{daY 3d􉗐7lF nzV3z۟w(CٙD(o\=P9+-ףq&jDgjA ܝ59jS7޵exp 6n/Ǔ0<1E]ڏQn'iX<'Ix|w/ tsܥU ^>GvH>؂Um?qyǽ[_9@AȫdȾDvy!CԐt^ەAn?cY"kIvSd[!+%+"G/ ٥cO`dGx$z#_'d߈l]*ً8~9{푣>Ⱦx Yof WȖ j= .GƊt?Hkz){"etZ&Hd|$~؊ɑ-9}$$}#LB7H;i![+$Y5"=g+h9 k !9EbSHܐ0 Z"Fr;$Dk$둬1;jň]4qQJ^Կ7.8q5v..m+.#X& 1 )kFˑqa)nuF҆H~䋸a}yةWDq^q-l\1iwȑ0w*p5WAʘ9W q-ןCRu a>Gr)!9Α"gF,.Hmsr71d(} tP~ np^;;W Q3yuG#(n#+PnLrdnyA:9";2~Cj˗HiSH1 GjiH̡jȹ;3f>؆C9}8Ea6PT[®P y-8?h-s Ef dx8 2nD>552Dd;W d.BFHTH[yiwN" 3 u!?HHy~!f!Rszsݐ:kҼ y ҞGڢ6H>)f!yr:!u1>HcYH1Iw qE5:!yu9>ER $tCr瑔{">6 5H~u$|uت=N qHo$oBB Gb_bSuABHlY pkd[FBO3FBK o$]?Hَky}܉xΈTC\3uG\ķꋸ>'1-qR li'!nĹ#n,oBe?qwWWjZ=Wz[\={#w&7!qm$d'$vDbHύ8ϱ[uG$.=1!Vh!*hs]ڕ \Y"e.>T+@rR?$ބHelEMFmS"p[~_]! )9\\+GqcMJkpksnQ^ʩMQw j-q6켅{0{jG<+½/}Y_Pg'PCf ,jpm$F:A= UOƣzP4*(Tgwz@T7'~Pyz j&:|S=]PЎ̵EEsT -AEaP15N(FF;'ŢBw&ZEy_(lٷQf w9榸s3e(;iY|ʚtBY({ru3kF>wFyoΫu2nP ܼ57 qZJ=nKq61ʋRtBިCMo@mxnyh[Ž1{3sO b6EU5q'*Q[{;㾋67RXA\&i>)iYdH=%-E!uLSJ MKV*IiI-IMI{=i!U?.i}ub$ݒ^ !i1ŒII[KZo%I;=n*i*i_$iߺ(iܑ9JڏVLIh}푤CҙFҩ )鴪tl]%NLIgIgQ~>t3v)I;s}6Tn,i)iİ[I{ rPJ&i͕ 6JZ1%=7%ђVZIkRIk'IR[4!iLГ4zIJ%b#=z/5AMKǎ+hꃯWu<)|<>x?+^ CWo?#~WxB6 'C|LX̹Ȕ Kr圧6)C>H9Brj-mtZsNIn%HD7$[y nnD8$*![&׷#5L;!0N"qIHZ~ ͓4vKi6)\mGZ4~w#} o\3gfr.Cn!9Qg$ ԻqL2ARKF7ANp% = ㍐My\8r&9!gFc.rj!4rw[!#kP["/& QfMДpBbeC@^(8uKFy8;!y]"O-Vf\# R!I#{&dW F^}&<@ȊuGfOd@֪ Z:#k_:d-E֖Ⱥ5Sd-Fvy*r_ oCg@(2|=p-w:>)ni&L~woJ aNM"jZ4⮱ j"PmW~g-9q|ytg :y=/xo o>{M_Իaͷ1xV7=xx^o7c_^uQ-<͡#_v+so/@χm+p ow݇pwzⓝ=>ބ:`|t54>sM)>?w/[1=םz-L?vB2|/1ÏD_B+b=~4R=?qoи 1os,~?õJOWHjͫ%w$51$my ['JfH.$$$As$>%%K7ɽ偒zTI=a~dKziI=MRo4ԯYJ>J $Kn>GORvGR?o]%6$%y|4H B%5+%k$ W IѾ@00'IRR>cz^~YR)gj%M%5K%e-ԣ]%{z&IXR o߳~9~%2#$'2I9@Ҏ i/U9I:nlIwL;샤Mk)酬^KzY$k꒾?쌤?/X?l$&"J*O&IR凤&KnHMIM&۔R+C&%$$cQAOuB2)H$odp%E2h$}% Y t~\IdOudr$=2I2I"^;Gҽl)h&鶷t5%k$ˬCIfK:_ttwKY% vSI{I{"ɑ=f̗5HZ[$=$m-I+KZWHZCH?,9?WH3K%M}CIcpIDIṤʝs+TI顤UR[0WR[xORARⲤ&?2%5|m6[~h_k]%~e:_+'Z _7#vǷn)s#04C=|߉gn.S3]ڋݜ}|Oﵩhx=>o 1wi],A'IDk޻O uv?Hg!)TH)FʷP$ ֋pAH!}xdd}C$dzE#Jq 2?r^CY'8'2Z>MuH9 ӑ>}}V^_/װlR,Y3ƚc@ [7s:_).]96Skaʘ yl19&~{I.brטr46`Q[L-i1m]2]b*ظ3:`IfYΘ>S;1nǼMwoXP2 +F`Q7-Gџ4]+}}5M⎻%=&K ѳTX2QbJ+,i |3,ֈ%=̰$ќ .nBtQDG2m,DaѝXjoh/>(,xmpG,|X\;>R_,RE3c1uFt mmKL>cYXjvK#V`I>,u%dT,qw=Bv’3mK r=%`$,o7A |EwrVŠWUwc3Vź;v&kqI045f†sج O˰x&aK [/ֽj؞+ÎS=v쾦=U H0]LB-үχpp{3+q(vp$lÉp5GOZ]c;89gN8|CM8hAR[۱obľ؎V+ݶ{~62{c 咂]cywށU5Eط=v"v}w3q;8P'+p-y{G8{+J5\?ZzW{Ǖoq,\< 8 ' 1>yES9Xؽ ;+bGp-][16a}f->5:)Xkfyk:#݀Ӱ"V?egV鄘-eGl bZbٳ2Č}_ fq,+ aX1V+Ocg0@y]l>,i=Ct0DaIB,I*FtE,ڸnaAXy=9l$p$<1FݛQU0f`t f6`$ _1hl Ί`r ~OyC=b,lt7.M htnmDw=f&Ρ]v5ڴ|#]DQ5:t@GO/Us8z9:v[ڍMP.bڮLn tS@S1mX6M3"F*͋Fۑo۠6r9v!:" #\a~@[HY*Z]ވv>- gNA/@YwMD|to U@uvm%t|,2ЮW:碍qS\/qd"aLD UmT@yDB5{#q=B|ARcơ՝p[k{7=S7p;nE l0P73O5 a~W9ᇔOoY!|Mrr+s ƶG>dY Rhaɫ–*ۇׇZuЖNQa)SƆ/ \anjcZbeBg1jwC7n03t?1^kB}yU'˂a+C' N=4tU{B> 6l Y:")mEPfC |4UH^Bp ___________߶'~Kst-2.0.8/old_tests/sessions/lotsofstuff.kst0000644000175000017500000023070212277111530020330 0ustar synthsynth 1400 980 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc GOTEX.C130_N130AR.LRT.RF06.PNI.nc netCDF DS-healpix_example_sm.fits ../healpix/healpix_example_sm.fits HEALPIX 4 4 0.02 0.02 0.1 0.1 12 12 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc GOTEX.C130_N130AR.LRT.RF06.PNI.nc INDEX 0 -1 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc GOTEX.C130_N130AR.LRT.RF06.PNI.nc ADIFR 0 -1 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/BDIFR DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc GOTEX.C130_N130AR.LRT.RF06.PNI.nc BDIFR 0 -1 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/CROLL DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc GOTEX.C130_N130AR.LRT.RF06.PNI.nc CROLL 0 -1 DS-healpix_example_sm.fits/1 - TEMPERATURE (Kelvin) DS-healpix_example_sm.fits healpix_example_sm.fits 1 - TEMPERATURE (Kelvin) 0 0 -1 -1 0 0 1 ADIFR DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR #858500 0 0 1048594 0 0 ADIFR-ADIFR_... [DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR]-[DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR/Mean] DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX ADIFR-ADIFR_...-C ADIFR-ADIFR_.../xsv ADIFR-ADIFR_.../sv #009999 0 0 0 0 1 ADIFR-H DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR 60 0 -18.2222 1.27623 NUMBER ADIFR-H-C ADIFR-H/bins ADIFR-H/sv #0000aa 0 0 0 0 1 ADIFR-P DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR 100 1 10 1 0 1 0 0.01 V Hz 0 ADIFR-P-C ADIFR-P/freq ADIFR-P/sv #990099 0 0 0 0 1 Convolution DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/BDIFR Convolved Convolved DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX Convolution/Convolved #c8c800 0 0 0 0 1 E1-[ADIFR]<-5 [ADIFR]<-5 1 2 0 0 E1-[ADIFR]<-5-C E1-[ADIFR]<-5/x E1-[ADIFR]<-5/y #00ff00 0 0 0 0 1 ADIFR-S3 DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/ADIFR 100 1 10 1 1 0 500 V Hz 0 ADIFR-S3-I ADIFR-S3/csd 1 Kst Spectrum 1021 2.7091113352766e-05 6.5488658091627 0 1 0 #ff0000 1 1 - TEMPERATURE (Kelvin)-I DS-healpix_example_sm.fits/1 - TEMPERATURE (Kelvin) 1 Kst Spectrum 1021 -312.92321777344 305.1423034668 1 1 0 #000000 1 BDIFR DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/BDIFR #858500 0 0 0 0 1 BDIFR-filter_lowpass-C DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX BDIFR-filter_lowpass/Filtered #aa0000 0 0 0 0 1 BDIFR-filter_lowpass filter_lowpass DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/BDIFR 0.1 4 Filtered BDIFR-filter_highpass-C DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX BDIFR-filter_highpass/Filtered #26ff00 0 0 0 0 1 BDIFR-filter_highpass filter_highpass DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/BDIFR 0.02 4 Filtered BDIFR-filter-combined [BDIFR-filter_highpass/Filtered]+[BDIFR-filter_lowpass/Filtered] DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX BDIFR-filter-combined-C BDIFR-filter-combined/xsv BDIFR-filter-combined/sv #0000aa 0 0 0 0 1 CROLL DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/CROLL #00ff00 0 0 1310738 0 0 CROLL-H DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/CROLL 60 0 -10 10 NUMBER CROLL-H-C CROLL-H/bins CROLL-H/sv #00e6e6 0 0 0 0 1 CROLL-P DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/CROLL 100 1 10 1 0 1 0 0.01 V Hz 0 CROLL-P-C CROLL-P/freq CROLL-P/sv #0000ff 0 0 0 0 1 CROLL-kstfit_polynomial_unweighted-C DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX CROLL-kstfit_polynomial_unweighted/Y Fitted #e600e6 0 0 0 0 1 CROLL-kstfit_polynomial_unweighted kstfit_polynomial_unweighted DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/INDEX DS-GOTEX.C130_N130AR.LRT.RF06.PNI.nc/CROLL 12 Covariance Parameters Residuals Y Fitted chi^2_nu x^0 x^1 x^10 x^11 x^12 x^2 x^3 x^4 x^5 x^6 x^7 x^8 x^9 CROLL-H-C-kstfit_gaussian-C CROLL-H/bins CROLL-H-C-kstfit_gaussian/Y Fitted #e600e6 0 0 0 0 1 CROLL-H-C-kstfit_gaussian kstfit_gaussian CROLL-H/bins CROLL-H/sv Covariance Parameters Residuals Y Fitted Mean SD Scale chi^2_nu CROLL-P-C-kstfit_exponential-C CROLL-P/freq CROLL-P-C-kstfit_exponential/Y Fitted #e600e6 0 0 0 0 1 CROLL-P-C-kstfit_exponential kstfit_exponential CROLL-P/freq CROLL-P/sv Covariance Parameters Residuals Y Fitted Lambda Offset Scale chi^2_nu P1 P1 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -18.706219238043 1.7602789819241 0 0 0 1 Arial 2 INDEX 0 Arial 2 ADIFR 270 Arial 2 3000 0 Arial 2 0 0 Arial 2 0 Arial 2 10 10 ADIFR E1-[ADIFR]<-5-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P3 P3 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -10.818526495477 9.6479717244896 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 3000 0 Arial 1 5 0 Arial 1 0 Arial 1 10 10 ADIFR-ADIFR_...-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P4 P4 #000000 0 #000000 #ffffff 0 0 0 5 0 5 -18.2222 1.27623 -1.525 104.525 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 0 0 Arial 1 100 0 Arial 1 0 Arial 1 10 10 ADIFR-H-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P5 P5 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 50 -0.17172081938406 7.5619709065307 0 0 0 1 Arial 1 Frequency \[Hz\] 0 Arial 1 ASD \[V/Hz^{1/2} \] 270 Arial 1 50 0 Arial 1 6 0 Arial 1 0 Arial 1 10 10 ADIFR-P-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P7 P7 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -27956.913391137 15952.563989994 0 0 0 1 Arial 1 INDEX 0 Arial 1 270 Arial 1 3000 0 Arial 1 10000 0 Arial 1 0 Arial 1 10 10 Convolved 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P11 P11 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3000 -1.252446183953 51.350293542074 0 0 ASD [V/Hz^{1/2}] 0 1 Arial 1 ADIFR [V] 0 Arial 1 Frequency [Hz] 270 Arial 1 3000 0 Arial 1 50 0 Arial 1 0 Arial 1 10 10 ADIFR-S3-I 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P12 P12 #000000 0 #000000 #ffffff 0 0 0 0 0 0 0 359.296875 -89.269029291574 89.269029291574 0 0 1 - TEMPERATURE (Kelvin) 0 0 Arial 1 0 Arial 1 270 Arial 1 350 0 Arial 1 50 0 Arial 1 0 Arial 1 10 10 1 - TEMPERATURE (Kelvin)-I 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P2 P2 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -10.463578698915 9.0154766750265 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 3000 0 Arial 1 5 0 Arial 1 0 Arial 1 10 10 BDIFR-filter_lowpass-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P6 P6 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -11.479896235466 12.588251757622 0 0 0 1 Arial 1 INDEX 0 Arial 1 BDIFR 270 Arial 1 3000 0 Arial 1 10 0 Arial 1 0 Arial 1 10 10 BDIFR 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P8 P8 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -10.569537444665 7.7339252444129 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 3000 0 Arial 1 5 0 Arial 1 0 Arial 1 10 10 BDIFR-filter_highpass-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P14 P14 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -14.489474626954 15.384623298776 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 3000 0 Arial 1 15 0 Arial 1 0 Arial 1 10 10 BDIFR-filter-combined-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P18 P18 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 3060 -21.277038955688 17.031010055542 0 0 0 0 Arial 0 INDEX 0 Arial 0 CROLL 270 Arial 0 3000 0 Arial 0 10 0 Arial 0 0 Arial 0 10 10 CROLL CROLL-kstfit_polynomial_unweighted-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P19 P19 #000000 0 #000000 #ffffff 0 0 0 5 0 5 -10 10 -3.8499976845953 157.84999994353 0 0 0 1 Arial 1 0 Arial 1 270 Arial 1 5 0 Arial 1 140 0 Arial 1 0 Arial 1 10 10 CROLL-H-C CROLL-H-C-kstfit_gaussian-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 P20 P20 #000000 0 #000000 #ffffff 0 0 0 5 0 5 0 50 -0.2932162193032 12.440471224987 0 0 0 1 Arial 1 Frequency \[Hz\] 0 Arial 1 ASD \[V/Hz^{1/2} \] 270 Arial 1 50 0 Arial 1 12 0 Arial 1 0 Arial 1 10 10 CROLL-P-C CROLL-P-C-kstfit_exponential-C 0 0 0 0 #808080 #808080 1 1 1 1 1 -1 -1 5 5 1 0 1 0 0 0 0 0 0 0 0 1 4 0 1 4 0 0 0 0 #000000 1 W1 P1 Object 370 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true ADIFR E1-[ADIFR]<-5-C P3 Object 368 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true ADIFR-ADIFR_...-C P4 Object 369 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true ADIFR-H-C P5 Object 367 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true ADIFR-P-C P7 Object 366 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true Convolved P11 Object 371 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true ADIFR-S3-I Image (Healpix) P12 Filters P2 Object 324 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true BDIFR-filter_lowpass-C P6 Object 323 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true BDIFR P8 Object 325 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true BDIFR-filter_highpass-C P14 Object 383 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true BDIFR-filter-combined-C Fits P18 Object 468 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true CROLL CROLL-kstfit_polynomial_unweighted-C P19 Object 567 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true CROLL-H-C CROLL-H-C-kstfit_gaussian-C P20 Object 601 unnamed #000000 2 #000000 #ffffff 0 0 Arial 0 false true 5 true CROLL-P-C CROLL-P-C-kstfit_exponential-C Kst-2.0.8/old_tests/sessions/README.txt0000644000175000017500000000073312277111530016724 0ustar synthsynthlotsofstuff.kst is a Kst session which instantiates many of the data objects available in Kst. Some of the features used: DataSource w/ metadata - netCDF, HealPIX Vector Matrix Curve Image Label Equation Event Power Spectrum Cumulative Spectral Decay Histogram Filters Fits It depends on two data sources (which have relative paths): ./GOTEX.C130_N130AR.LRT.RF06.PNI.nc (this must be un-gzipped before loading the .kst file) ../healpix/healpix_example_sm.fits Kst-2.0.8/old_tests/test1.sh0000755000175000017500000002641112277111530014760 0ustar synthsynth#!/bin/sh # -xvf # VALGRIND= if [ "x$1" == "x-v" ]; then VALGRIND="valgrind -v --tool=memcheck --num-callers=25"; fi if [ "x$1" == "x-t" ]; then VALGRIND="valgrind -v --tool=helgrind --num-callers=25"; fi ######### All settings are above this line CONSOLELOG=`mktemp /tmp/Kst_ConsoleLog.XXXXXX` || exit 4 echo Logging to $CONSOLELOG $VALGRIND kst --nq >$CONSOLELOG 2>&1 & DCOP="dcop kst-$! KstIface" QUIT="dcop kst-$! MainApplication-Interface quit" TMPFILE=`mktemp /tmp/Kst_TestSuite.XXXXXX` || exit 3 doExit() { $QUIT rm $TMPFILE rm $TESTFILE rm -f $KSTFILE exit $1; } checkEmptyResponse() { if [ ! -s "$TMPFILE" ]; then echo "Test $1 failed. Response was non-empty. [" `cat $TMPFILE` "]" return; fi echo -ne "Test $1 passed.\r" } checkArraySize() { LEN=`wc -l < $TMPFILE` if test ! "x$LEN" = "x$2"; then echo "Test $1 failed. Expected [$2] entries, received [$LEN]." return; fi echo -ne "Test $1 passed.\r" } checkStringResponse() { TESTSTR=`cat $TMPFILE | tr -d '\n'` if test ! "x$2" = "x$TESTSTR"; then echo "Test $1 failed. Expected [$2], received [$TESTSTR]." return; fi echo -ne "Test $1 passed.\r" } echo -n "Waiting for Kst launch completely." while [ 0 ]; do $DCOP >/dev/null 2>&1 if [ $? -eq 0 ]; then break; fi echo -n "." sleep 1; done echo "" declare -i cnt=0 ##### All lists are empty to start $DCOP curveList >$TMPFILE checkEmptyResponse 1 $DCOP plotList >$TMPFILE checkEmptyResponse 2 $DCOP objectList >$TMPFILE checkEmptyResponse 3 $DCOP vectorList >$TMPFILE checkEmptyResponse 4 $DCOP scalarList >$TMPFILE checkEmptyResponse 5 ##### Scalars $DCOP generateScalar "Scalar Test 1" 3.14159265358979 >$TMPFILE checkStringResponse 30 "Scalar Test 1" $DCOP scalar "Scalar Test 1" >$TMPFILE checkStringResponse 31 "3.141593" $DCOP generateScalar "Scalar Test 1" 0.000000000 >$TMPFILE checkStringResponse 32 "Scalar Test 1'" $DCOP scalar "Scalar Test 1'" >$TMPFILE checkStringResponse 33 "0.000000" $DCOP generateScalar "Scalar Test 1" "-33.5e+23" >$TMPFILE checkStringResponse 34 "Scalar Test 1''" $DCOP scalar "Scalar Test 1''" >$TMPFILE checkStringResponse 35 "-3349999999999999970639872.000000" $DCOP scalarList >$TMPFILE checkArraySize 36 25 ##### Vectors $DCOP generateVector "Vector Test 1" -10 10 21 >$TMPFILE checkStringResponse 100 "Vector Test 1" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 101 "21" # tests 102-122 cnt=0 while [ $cnt -lt 21 ]; do $DCOP vector "Vector Test 1" $cnt >$TMPFILE declare -i j=-10+$cnt declare -i n=102+$cnt checkStringResponse $n "$j.000000" cnt=$cnt+1; done $DCOP vector "Vector Test 1" -1 >$TMPFILE checkStringResponse 123 "0.000000" $DCOP vector "Vector Test 1" 21 >$TMPFILE checkStringResponse 124 "0.000000" $DCOP generateVector "Vector Test 2" -10 10 1 >$TMPFILE checkStringResponse 125 "Vector Test 2" # vectors must have at least 2 entries $DCOP vectorSize "Vector Test 2" >$TMPFILE checkStringResponse 126 "2" $DCOP vector "Vector Test 2" 0 >$TMPFILE checkStringResponse 127 "-10.000000" $DCOP vector "Vector Test 2" 1 >$TMPFILE checkStringResponse 128 "10.000000" $DCOP generateVector "Vector Test 3" -10 10 0 >$TMPFILE checkStringResponse 129 "Vector Test 3" $DCOP vectorSize "Vector Test 3" >$TMPFILE checkStringResponse 130 "2" $DCOP vector "Vector Test 3" 0 >$TMPFILE checkStringResponse 131 "-10.000000" $DCOP vector "Vector Test 3" 1 >$TMPFILE checkStringResponse 132 "10.000000" $DCOP generateVector "Vector Test 4" -10 10 -987 >$TMPFILE checkStringResponse 133 "Vector Test 4" $DCOP vectorSize "Vector Test 4" >$TMPFILE checkStringResponse 134 "2" $DCOP vector "Vector Test 4" 0 >$TMPFILE checkStringResponse 135 "-10.000000" $DCOP vector "Vector Test 4" 1 >$TMPFILE checkStringResponse 136 "10.000000" $DCOP generateVector "Vector Test 5" -1 -1 44 >$TMPFILE checkStringResponse 137 "Vector Test 5" $DCOP vectorSize "Vector Test 5" >$TMPFILE checkStringResponse 138 "44" $DCOP vector "Vector Test 5" 33 >$TMPFILE checkStringResponse 139 "-0.923256" $DCOP vector "Vector Test 5" 2 >$TMPFILE checkStringResponse 140 "-0.995349" $DCOP vectorList >$TMPFILE checkArraySize 141 5 $DCOP clearVector "Vector Test 1" >$TMPFILE checkStringResponse 142 "true" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 143 "21" # tests 144-164 cnt=0 while [ $cnt -lt 21 ]; do $DCOP vector "Vector Test 1" $cnt >$TMPFILE declare -i n=144+$cnt checkStringResponse $n "0.000000" cnt=$cnt+1; done $DCOP resizeVector "Vector Test 1" 5 >$TMPFILE checkStringResponse 165 "true" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 166 "5" $DCOP resizeVector "Vector Test 1" 2 >$TMPFILE checkStringResponse 167 "true" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 168 "2" $DCOP resizeVector "Vector Test 1" 1 >$TMPFILE checkStringResponse 169 "true" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 170 "1" $DCOP resizeVector "Vector Test 1" 0 >$TMPFILE checkStringResponse 171 "false" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 172 "1" $DCOP resizeVector "Vector Test 1" -4 >$TMPFILE checkStringResponse 173 "false" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 174 "1" $DCOP resizeVector "Vector Test 1" 3 >$TMPFILE checkStringResponse 175 "true" $DCOP setVector "Vector Test 1" -1 42 >$TMPFILE checkStringResponse 176 "false" $DCOP setVector "Vector Test 1" -2 42 >$TMPFILE checkStringResponse 177 "false" $DCOP setVector "Vector Test 1" 0 42 >$TMPFILE checkStringResponse 178 "true" $DCOP setVector "Vector Test 1" 1 42.42 >$TMPFILE checkStringResponse 179 "true" $DCOP setVector "Vector Test 1" 2 42.4242 >$TMPFILE checkStringResponse 180 "true" $DCOP vector "Vector Test 1" 0 >$TMPFILE checkStringResponse 181 "42.000000" $DCOP vector "Vector Test 1" 1 >$TMPFILE checkStringResponse 182 "42.420000" $DCOP vector "Vector Test 1" 2 >$TMPFILE checkStringResponse 183 "42.424200" $DCOP setVector "Vector Test 1" 3 42.424242 >$TMPFILE checkStringResponse 184 "false" $DCOP vectorSize "Vector Test 1" >$TMPFILE checkStringResponse 185 "3" $DCOP resizeVector "Vector Test 1" 5 >$TMPFILE checkStringResponse 186 "true" $DCOP vector "Vector Test 1" 0 >$TMPFILE checkStringResponse 187 "42.000000" $DCOP vector "Vector Test 1" 1 >$TMPFILE checkStringResponse 188 "42.420000" $DCOP vector "Vector Test 1" 2 >$TMPFILE checkStringResponse 189 "42.424200" $DCOP vector "Vector Test 1" 3 >$TMPFILE checkStringResponse 190 "0.000000" $DCOP vector "Vector Test 1" 4 >$TMPFILE checkStringResponse 191 "0.000000" $DCOP setVector "Vector Test 1" 3 42.424242 >$TMPFILE checkStringResponse 192 "true" $DCOP setVector "Vector Test 1" 4 42424242.42 >$TMPFILE checkStringResponse 193 "true" $DCOP vector "Vector Test 1" 3 >$TMPFILE checkStringResponse 194 "42.424242" $DCOP vector "Vector Test 1" 4 >$TMPFILE checkStringResponse 195 "42424242.420000" $DCOP saveVector "Vector Test 1" "" >$TMPFILE checkStringResponse 196 "false" VTMPFILE=`mktemp /tmp/Kst_Vector.XXXXXX` || exit 3 $DCOP saveVector "Vector Test 1" $VTMPFILE >$TMPFILE checkStringResponse 197 "true" LEN=`wc -l < $VTMPFILE` if test ! "x$LEN" = "x7"; then echo "Test 198 failed. Expected [7] entries, received [$LEN]."; fi echo -ne "Test 198 passed.\r" rm $VTMPFILE ##### Plots $DCOP generateVector "plotinput1" 0 1000 10000 >$TMPFILE checkStringResponse 500 "plotinput1" $DCOP generateVector "plotinput2" 0 100 10000 >$TMPFILE checkStringResponse 501 "plotinput2" $DCOP createCurve "curve-ramp" "plotinput1" "plotinput2" "" "" >$TMPFILE checkStringResponse 502 "curve-ramp" $DCOP createCurve "curve-ramp2" "plotinput2" "plotinput1" "" "" >$TMPFILE checkStringResponse 503 "curve-ramp2" $DCOP createPlot "P0" >$TMPFILE checkStringResponse 504 "P0" $DCOP addCurveToPlot "P0" "curve-ramp" >$TMPFILE checkStringResponse 505 "true" $DCOP createPlot "P1" >$TMPFILE checkStringResponse 506 "P1" $DCOP addCurveToPlot "P1" "curve-ramp2" >$TMPFILE checkStringResponse 507 "true" $DCOP createPlot "P2" >$TMPFILE checkStringResponse 508 "P2" $DCOP plotEquation "plotinput1" "2*sin(x)*cos(x^2)" "P2" >$TMPFILE checkStringResponse 509 "true" VTMPFILE=`mktemp /tmp/Kst_TestPrintOut1.png.XXXXXX` || exit 3 echo "Writing printout image [P0,P1,P2] to $VTMPFILE" $DCOP printImage $VTMPFILE >$TMPFILE checkStringResponse 510 "true" VTMPFILE=`mktemp /tmp/Kst_TestPrintOut1.ps.XXXXXX` || exit 3 echo "Writing printout postscript [P0,P1,P2] to $VTMPFILE" $DCOP printPostScript $VTMPFILE >$TMPFILE checkStringResponse 511 "true" $DCOP deletePlot "P1" >$TMPFILE checkStringResponse 512 "true" $DCOP deletePlot "P0" >$TMPFILE checkStringResponse 513 "true" $DCOP deletePlot "P2" >$TMPFILE checkStringResponse 514 "true" VTMPFILE=`mktemp /tmp/Kst_TestPrintOut1.png.XXXXXX` || exit 3 echo "Writing printout image [blank] to $VTMPFILE" $DCOP printImage $VTMPFILE >$TMPFILE checkStringResponse 515 "true" VTMPFILE=`mktemp /tmp/Kst_TestPrintOut1.ps.XXXXXX` || exit 3 echo "Writing printout postscript [blank] to $VTMPFILE" $DCOP printPostScript $VTMPFILE >$TMPFILE checkStringResponse 516 "true" echo -ne "Generating a test file.\r" TESTFILE=`mktemp /tmp/Kst_TestData.XXXXXX` || exit 3 declare -i ln=0 while [ $ln -lt 1000 ]; do echo $ln | awk "{print $ln, sin($ln/10), ($ln/100)^2, cos($ln/10)}" >>$TESTFILE declare -i ln=1+$ln; done echo -ne " \r" # Must clear out the generated vectors because they don't save properly FIXME # 599 $DCOP newFile >$TMPFILE # Read in the vectors $DCOP loadVector $TESTFILE INDEX >$TMPFILE VINDEX=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 600 $DCOP loadVector $TESTFILE 2 >$TMPFILE V2=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 601 $DCOP loadVector $TESTFILE 3 >$TMPFILE V3=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 602 $DCOP loadVector $TESTFILE 4 >$TMPFILE V4=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 603 $DCOP createCurve "firstCurve" $VINDEX $V2 "" "" >$TMPFILE CURVE1=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 604 $DCOP createPlot "firstPlot" >$TMPFILE PLOT1=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 605 $DCOP addCurveToPlot $PLOT1 $CURVE1 >$TMPFILE checkStringResponse 606 "true" $DCOP createCurve "secondCurve" $VINDEX $V4 "" "" >$TMPFILE CURVE2=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 607 $DCOP addCurveToPlot $PLOT1 $CURVE2 >$TMPFILE checkStringResponse 608 "true" $DCOP createPlot "secondPlot" >$TMPFILE PLOT2=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 609 $DCOP createCurve "thirdCurve" $VINDEX $V3 "" "" >$TMPFILE CURVE3=`cat $TMPFILE | tr -d '\n'` checkEmptyResponse 610 $DCOP addCurveToPlot $PLOT2 $CURVE3 >$TMPFILE checkStringResponse 611 "true" KSTFILE=`mktemp /tmp/Kst_TestFile.XXXXXX` || exit 3 rm $KSTFILE $DCOP saveAs $KSTFILE >$TMPFILE checkStringResponse 612 "true" # 613 $DCOP newFile >$TMPFILE $DCOP curveList >$TMPFILE checkEmptyResponse 614 # crashes Kst generally, bypassed with #599 $DCOP open $KSTFILE >$TMPFILE checkStringResponse 620 "true" rm -f $KSTFILE $DCOP save >$TMPFILE checkStringResponse 621 "true" $DCOP open $KSTFILE >$TMPFILE checkStringResponse 622 "true" $DCOP save >$TMPFILE checkStringResponse 623 "true" echo "" doExit 0 # # Things to test still # -------------------- # # Vector/scalar namespace # Object namespace # Plot content manipulations # Error vectors # PSDs # Histograms # Equations with variables # Plugins # Labels # Data vectors # Plot scales # Saving and loading # Scalars generated for vectors # Kst-2.0.8/old_tests/dirfile_replay/0000755000175000017500000000000012277111530016347 5ustar synthsynthKst-2.0.8/old_tests/dirfile_replay/getdata.h0000644000175000017500000001300112277111530020124 0ustar synthsynth #ifndef GETDATA_H #define GETDATA_H //#include /* The following has been extracted from internal.cpp from kjs */ /* ** For systems without NAN, this is a NAN in IEEE double format. */ #if !defined(NAN) static double __NAN() { /* work around some strict alignment requirements for double variables on some architectures (e.g. PA-RISC) */ typedef union { unsigned char b[8]; double d; } kjs_double_t; #ifdef WORDS_BIGENDIAN static const kjs_double_t NaN_Bytes = { { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 } }; #elif defined(arm) static const kjs_double_t NaN_Bytes = { { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 } }; #else static const kjs_double_t NaN_Bytes = { { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f } }; #endif const double NaN = NaN_Bytes.d; return NaN; } #define NAN __NAN() #endif /* !defined(NAN) */ extern const char *GD_ERROR_CODES[15]; #define GD_E_OK 0 #define GD_E_OPEN_FORMAT 1 #define GD_E_FORMAT 2 #define GD_E_FIELD 4 #define GD_E_BAD_CODE 5 #define GD_E_BAD_RETURN_TYPE 6 #define GD_E_OPEN_RAWFIELD 7 #define GD_E_OPEN_INCLUDE 8 #define GD_E_INTERNAL_ERROR 9 #define GD_E_SIZE_MISMATCH 12 #define GD_E_OPEN_LINFILE 13 #define GD_E_RECURSE_LEVEL 14 /***************************************************************************/ /* */ /* GetData: read BLAST format files. */ /* filename_in: the name of the file directory (raw files are in here) */ /* field_code: the name of the field you want to read */ /* first_frame, first_samp: the first sample read is */ /* first_samp + samples_per_frame*first_frame */ /* num_frames, num_samps: the number of samples read is */ /* num_samps + samples_per_frame*num_frames */ /* return_type: data type of *data_out. 's': 16 bit signed */ /* 'u' 16bit unsiged. 'S' 32bit signed 'U' 32bit unsigned */ /* 'c' 8 bit unsigned */ /* void *data_out: array to put the data */ /* *error_code: error code is returned here. If error_code==null, */ /* GetData prints the error message and exits */ /* */ /* return value: returns number of samples actually read into data_out */ /* */ /***************************************************************************/ #ifdef __cplusplus extern "C" #endif int GetData(const char *filename_in, const char *field_code, int first_sframe, int first_samp, int num_sframes, int num_samp, char return_type, void *data_out, int *error_code); /***************************************************************************/ /* */ /* GetDataErrorString: Write a descriptive message in the supplied */ /* buffer describing the last library error. The message may be */ /* truncated but should be null terminated. */ /* */ /* buffer: memory into which to write the string */ /* buflen: length of the buffer. GetDataErrorString will not write */ /* more than buflen characters (including the trailing '\0') */ /* */ /* return value: buffer or NULL if buflen < 1 */ /* */ /***************************************************************************/ #ifdef __cplusplus extern "C" #endif char* GetDataErrorString(char* buffer, size_t buflen); /***************************************************************************/ /* */ /* Get the number of samples for each frame for the given field */ /* */ /***************************************************************************/ #ifdef __cplusplus extern "C" #endif int GetSamplesPerFrame(const char *filename_in, const char *field_name, int *error_code); /***************************************************************************/ /* */ /* Get the number of frames available */ /* */ /***************************************************************************/ #ifdef __cplusplus extern "C" #endif int GetNFrames(const char *filename_in, int *error_code, const char *field); /***************************************************************************/ /* */ /* Get the number format structure */ /* */ /***************************************************************************/ #ifdef __cplusplus extern "C" #endif struct FormatType *GetFormat(const char *filedir, int *error_code); #endif Kst-2.0.8/old_tests/dirfile_replay/getdata.c0000644000175000017500000021233612277111530020133 0ustar synthsynth/* (C) 2002 C. Barth Netterfield */ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "getdata.h" #include "getdata_struct.h" const char *GD_ERROR_CODES[15] = {"OK", "Could not open Format file", "Error in Format file", "Could not open Data file", "Field name too long", "Field code not found in File Format", "Unrecognized return type", "Could not open field file", "Could not open included Format file", "Internal error", " ", " ", "Size mismatch in linear combination", "Could not open interpolation file", "Too many levels of recursion" }; /* Suberror codes -- these don't need to be public */ #define GD_E_FORMAT_SE_BAD_TYPE 0 #define GD_E_FORMAT_SE_BAD_SPF 1 #define GD_E_FORMAT_SE_N_FIELDS 2 #define GD_E_FORMAT_SE_N_COLS 3 #define GD_E_FORMAT_SE_MAX_I 4 #define GD_E_FORMAT_SE_NUMBITS 5 #define GD_E_FORMAT_SE_BITNUM 6 #define GD_E_FORMAT_SE_BITSIZE 7 #define GD_E_FORMAT_SE_FIELD_LEN 8 #define GD_E_FORMAT_SE_BAD_LINE 9 #define GD_E_FORMAT_SE_N_RAW 10 #define GD_E_LINFILE_SE_OPEN 0 #define GD_E_LINFILE_SE_LENGTH 1 static struct { int n; struct FormatType *F; } Formats; static int recurse_level = 0; static int first_time = 1; static int getdata_error = GD_E_OK; static int getdata_suberror = 0; static char getdata_error_string[MAX_FILENAME_LENGTH + 6]; static char getdata_error_file[MAX_FILENAME_LENGTH + 6]; static int getdata_error_line = 0; static int DoField(struct FormatType *F, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code); /***************************************************************************/ /* */ /* GetLine: read non-comment line from format file */ /* The line is placed in *line. */ /* Returns 1 if successful, 0 if unsuccessful */ /* */ /***************************************************************************/ static int GetLine(FILE *fp, char *line, int* linenum) { char *ret_val; int first_char; int i, len; do { ret_val = fgets(line, MAX_LINE_LENGTH, fp); (*linenum)++; first_char = 0; while (line[first_char] == ' ' || line[first_char] == '\t') ++first_char; line += first_char; } while (ret_val && (line[0] == '#' || line[0] == 0 || line[1] == 0)); if (ret_val) { /* truncate comments from end of lines */ len = strlen(line); for (i = 0; i < len; i++) { if (line[i]=='#') line[i] = '\0'; } return(1); /* a line was read */ } return(0); /* there were no valid lines */ } /* SetGetDataError: Sets the global error variables for a library error */ static int SetGetDataError(int error, int suberror, const char* format_file, int line, const char* token) { getdata_error = error; getdata_suberror = suberror; getdata_error_line = line; if (format_file != NULL) strncpy(getdata_error_file, format_file, MAX_FILENAME_LENGTH + 6); if (token != NULL) strncpy(getdata_error_string, token, MAX_FILENAME_LENGTH + 6); return error; } /***************************************************************************/ /* */ /* GetDataErrorString: Write a descriptive message in the supplied */ /* buffer describing the last library error. The message may be */ /* truncated but should be null terminated. */ /* */ /* buffer: memory into which to write the string */ /* buflen: length of the buffer. GetDataErrorString will not write */ /* more than buflen characters (including the trailing '\0') */ /* */ /* return value: buffer or NULL if buflen < 1 */ /* */ /***************************************************************************/ char* GetDataErrorString(char* buffer, size_t buflen) { char* ptr; /* Sanity check */ if (buffer == NULL || buflen < 1) return NULL; /* Copy the default error message into the buffer and make sure * the result is null terminated */ strncpy(buffer, GD_ERROR_CODES[getdata_error], buflen - 1); buffer[buflen - 1] = 0; /* point to the end of the string and reduce buflen appropriately */ ptr = buffer + strlen(buffer); buflen -= strlen(buffer); /* add the anciliary data - we use snprintfs here to ensure the resultant * string is properly null terminated (while not overflowing the buffer) */ switch (getdata_error) { case GD_E_INTERNAL_ERROR: /* internal error: report line and source file where it happened */ snprintf(ptr, buflen, " [%s,%i]", getdata_error_file, getdata_error_line); break; case GD_E_OPEN_FORMAT: /* main format file couldn't be opened -- report the filename we tried to open */ snprintf(ptr, buflen, " %s", getdata_error_file); break; case GD_E_FORMAT: /* syntax errors in the format file -- lots of suberror types here */ /* No RAW fields specified -- this isn't tied to a particular line */ if (getdata_suberror == GD_E_FORMAT_SE_N_RAW) { snprintf(ptr, buflen, ": no raw fields defined"); break; } /* otherwise, add the format filename and line number where the * syntax error was found */ snprintf(ptr, buflen, " on line %i of %s: ", getdata_error_line, getdata_error_file); buflen -= strlen(ptr); ptr += strlen(ptr); switch (getdata_suberror) { case GD_E_FORMAT_SE_BAD_TYPE: /* bad field type; include the thing we thought was the type specifier */ snprintf(ptr, buflen, "bad raw field type: %c", getdata_error_string[0]); break; case GD_E_FORMAT_SE_BAD_SPF: /* SPF < 0 -- print the column we expected to hold the SPF */ snprintf(ptr, buflen, "samples per frame out of range: %s", getdata_error_string); break; case GD_E_FORMAT_SE_N_FIELDS: /* number of fields in the LINCOM and the number of columns in the format file don't match */ snprintf(ptr, buflen, "lincom field count out of range: %s", getdata_error_string); break; case GD_E_FORMAT_SE_N_COLS: /* missing data we expected to find on this line */ snprintf(ptr, buflen, "missing column"); break; case GD_E_FORMAT_SE_MAX_I: /* max_i out of range (what is an MPLEX?) */ snprintf(ptr, buflen, "max_i out of range: %s", getdata_error_string); break; case GD_E_FORMAT_SE_NUMBITS: /* bitfield numbits is less than 1 */ snprintf(ptr, buflen, "numbits out of range"); break; case GD_E_FORMAT_SE_BITNUM: /* bitnum is less than 0 */ snprintf(ptr, buflen, "starting bit out of range"); break; case GD_E_FORMAT_SE_BITSIZE: /* bitfield extends past 32 bits */ snprintf(ptr, buflen, "end of bitfield is out of bounds"); break; case GD_E_FORMAT_SE_FIELD_LEN: /* field name is too long */ snprintf(ptr, buflen, "field name too long: %s", getdata_error_string); break; case GD_E_FORMAT_SE_BAD_LINE: /* couldn't make heads nor tails of the line -- ie. a mistyped keyword &c. */ snprintf(ptr, buflen, "line indecypherable"); break; } break; case GD_E_OPEN_INCLUDE: /* Couldn't open an INCLUDEd file -- report the included filename as well as the line and name of the format file where it was encountered */ snprintf(ptr, buflen, "%s on line %i of %s", getdata_error_string, getdata_error_line, getdata_error_file); break; case GD_E_BAD_RETURN_TYPE: /* unsupported data return type passed to GetData */ snprintf(ptr, buflen, ": %c", (char)getdata_suberror); break; case GD_E_RECURSE_LEVEL: /* recursion too deep -- report field name for which this happened */ snprintf(ptr, buflen, " while resolving field %s", getdata_error_string); break; case GD_E_BAD_CODE: /* A required field name wasn't defined */ case GD_E_OPEN_RAWFIELD: /* A raw field file wasn't found on disk */ snprintf(ptr, buflen, ": %s", getdata_error_string); break; case GD_E_OPEN_LINFILE: /* problems with LINTERPs: report the linterp filename with the error message */ snprintf(ptr, buflen, " %s: %s", getdata_error_string, (getdata_suberror == GD_E_LINFILE_SE_OPEN) ? "open failed" : "file too short"); break; } return buffer; } /***************************************************************************/ /* */ /* FreeF: free any entries that have been allocated in F */ /* */ /***************************************************************************/ static void FreeF(struct FormatType *F) { if (F->n_raw > 0) free(F->rawEntries); if (F->n_lincom > 0) free(F->lincomEntries); if (F->n_multiply > 0) free(F->multiplyEntries); if (F->n_linterp >0) free(F->linterpEntries); if (F->n_mplex > 0) free(F->mplexEntries); if (F->n_bit > 0) free(F->bitEntries); } /***************************************************************************/ /* */ /* ParseRaw: parse a RAW data type in the formats file */ /* */ /***************************************************************************/ static int ParseRaw(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], struct RawEntryType *R, const char* subdir, const char* format_file, int line) { strcpy(R->field, in_cols[0]); /* field */ snprintf(R->file, MAX_FILENAME_LENGTH + FIELD_LENGTH + 2, "%s/%s", subdir, in_cols[0]); /* path and filename */ R->fp = -1; /* file not opened yet */ switch (in_cols[2][0]) { case 'c': R->size = 1; break; case 's': case 'u': R->size = 2; break; case 'S': case 'U': case 'f': case 'i': R->size = 4; break; case 'd': R->size = 8; break; default: return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_BAD_TYPE, format_file, line, in_cols[2]); } R->type = in_cols[2][0]; R->samples_per_frame = atoi(in_cols[3]); if (R->samples_per_frame<=0) { return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_BAD_SPF, format_file, line, in_cols[3]); } return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* ParseLincom: parse a LINCOM data type in the formats file */ /* */ /***************************************************************************/ static int ParseLincom(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], int n_cols, struct LincomEntryType *L, const char* format_file, int line) { int i; strcpy(L->field, in_cols[0]); /* field */ L->n_infields = atoi(in_cols[2]); if ((L->n_infields<1) || (L->n_infields>MAX_LINCOM) || (n_cols < L->n_infields*3 + 3)) { return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_FIELDS, format_file, line, in_cols[2]); } for (i=0; in_infields; i++) { strncpy(L->in_fields[i], in_cols[i*3+3], FIELD_LENGTH); L->m[i] = atof(in_cols[i*3+4]); L->b[i] = atof(in_cols[i*3+5]); } return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* ParseLinterp: parse a LINTERP data type in the formats file */ /* */ /***************************************************************************/ static int ParseLinterp(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], struct LinterpEntryType *L) { strcpy(L->field, in_cols[0]); /* field */ strncpy(L->raw_field, in_cols[2], FIELD_LENGTH); strcpy(L->linterp_file, in_cols[3]); L->n_interp = -1; /* linterp file not read yet */ return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* ParseMultiply: parse MULTIPLY data type entry in formats file */ /* */ /***************************************************************************/ static int ParseMultiply(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], int n_cols, struct MultiplyEntryType *M, const char* format_file, int line) { if (n_cols < 4) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_COLS, format_file, line, NULL); strcpy(M->field, in_cols[0]); /* field */ strncpy(M->in_fields[0], in_cols[2], FIELD_LENGTH); strncpy(M->in_fields[1], in_cols[3], FIELD_LENGTH); return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* ParseMplex: parse MPLEX data type entry in formats file */ /* */ /***************************************************************************/ static int ParseMplex(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], int n_cols, struct MplexEntryType *M, const char* format_file, int line) { if (n_cols < 6) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_COLS, format_file, line, NULL); strcpy(M->field, in_cols[0]); /* field */ strncpy(M->cnt_field, in_cols[2], FIELD_LENGTH); strncpy(M->data_field, in_cols[3], FIELD_LENGTH); M->i = atoi(in_cols[4]); M->max_i = atoi(in_cols[5]); if ((M->max_i < 1) || (M->max_i < M->i)) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_MAX_I, format_file, line, NULL); return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* ParseBit: parse BIT data type entry in formats file */ /* */ /***************************************************************************/ static int ParseBit(char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH], int n_cols, struct BitEntryType *B, const char* format_file, int line) { strcpy(B->field, in_cols[0]); /* field */ strncpy(B->raw_field, in_cols[2], FIELD_LENGTH); /* field */ B->bitnum=atoi(in_cols[3]); if (n_cols>4) { B->numbits=atoi(in_cols[4]); } else { B->numbits=1; } if (B->numbits < 1) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_NUMBITS, format_file, line, NULL); if (B->bitnum < 0) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_BITNUM, format_file, line, NULL); if (B->bitnum + B->numbits - 1 > 31) return SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_BITSIZE, format_file, line, NULL); return SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); } /***************************************************************************/ /* */ /* Compare functions for sorting the lists (using stdlib qsort) */ /* */ /***************************************************************************/ static int RawCmp(const void *A, const void *B) { return (strcmp(((struct RawEntryType *)A)->field, ((struct RawEntryType *)B)->field)); } static int LincomCmp(const void *A, const void *B) { return (strcmp(((struct LincomEntryType *)A)->field, ((struct LincomEntryType *)B)->field)); } static int LinterpCmp(const void *A, const void *B) { return (strcmp(((struct LinterpEntryType *)A)->field, ((struct LinterpEntryType *)B)->field)); } static int MultiplyCmp(const void *A, const void *B) { return (strcmp(((struct MultiplyEntryType *)A)->field, ((struct MultiplyEntryType *)B)->field)); } static int MplexCmp(const void *A, const void *B) { return (strcmp(((struct MplexEntryType *)A)->field, ((struct MplexEntryType *)B)->field)); } static int BitCmp(const void *A, const void *B) { return (strcmp(((struct BitEntryType *)A)->field, ((struct BitEntryType *)B)->field)); } /***************************************************************************/ /* */ /* ParseFormatFile: Perform the actual parsing of the format file. This */ /* function is called from GetFormat once for the main format file and */ /* once for each included file. */ /* */ /***************************************************************************/ static int ParseFormatFile(FILE* fp, struct FormatType *F, const char* filedir, const char* subdir, const char* format_file, char*** IncludeList, int *i_include) { char instring[MAX_LINE_LENGTH]; char in_cols[MAX_IN_COLS][MAX_LINE_LENGTH]; int n_cols, error_code = SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); int linenum = 0; /***** start parsing ****/ while (GetLine(fp, instring, &linenum)) { /* ok, brute force parse... slow and ugly but convenient... */ n_cols = sscanf(instring, "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", in_cols[0], in_cols[1], in_cols[2], in_cols[3], in_cols[4], in_cols[5], in_cols[6], in_cols[7], in_cols[8], in_cols[9], in_cols[10], in_cols[11], in_cols[12], in_cols[13], in_cols[14]); if (n_cols<2) { error_code = SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_COLS, format_file, linenum, NULL); } else if (strlen(in_cols[0])>FIELD_LENGTH) { error_code = SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_FIELD_LEN, format_file, linenum, in_cols[0]); } else if (strcmp(in_cols[1], "RAW")==0) { F->n_raw++; F->rawEntries = realloc(F->rawEntries, F->n_raw*sizeof(struct RawEntryType)); error_code = ParseRaw(in_cols, F->rawEntries+F->n_raw - 1, subdir, format_file, linenum); } else if (strcmp(in_cols[1], "LINCOM")==0) { F->n_lincom++; F->lincomEntries = realloc(F->lincomEntries, F->n_lincom*sizeof(struct LincomEntryType)); error_code = ParseLincom(in_cols, n_cols, F->lincomEntries+F->n_lincom - 1, format_file, linenum); } else if (strcmp(in_cols[1], "LINTERP")==0) { F->n_linterp++; F->linterpEntries = realloc(F->linterpEntries, F->n_linterp*sizeof(struct LinterpEntryType)); error_code = ParseLinterp(in_cols, F->linterpEntries+F->n_linterp - 1); } else if (strcmp(in_cols[1], "MULTIPLY")==0) { F->n_multiply++; F->multiplyEntries = realloc(F->multiplyEntries, F->n_multiply*sizeof(struct MultiplyEntryType)); error_code = ParseMultiply(in_cols, n_cols, F->multiplyEntries + F->n_multiply - 1, format_file, linenum); } else if (strcmp(in_cols[1], "MPLEX")==0) { F->n_mplex++; F->mplexEntries = realloc(F->mplexEntries, F->n_mplex*sizeof(struct MplexEntryType)); error_code = ParseMplex(in_cols, n_cols, F->mplexEntries+F->n_mplex - 1, format_file, linenum); } else if (strcmp(in_cols[1], "BIT")==0) { F->n_bit++; F->bitEntries = realloc(F->bitEntries, F->n_bit*sizeof(struct BitEntryType)); error_code = ParseBit(in_cols, n_cols, F->bitEntries+F->n_bit - 1, format_file, linenum); } else if (strcmp(in_cols[0], "FRAMEOFFSET")==0) { F->frame_offset = atoi(in_cols[1]); } else if (strcmp(in_cols[0], "INCLUDE")==0) { int i, found = 0; char new_format_file[MAX_FILENAME_LENGTH + 6]; char new_subdir[MAX_FILENAME_LENGTH + 1]; FILE* new_fp = NULL; /* Run through the include list to see if we've already included this * file */ for (i = 0; i < *i_include; ++i) if (strcmp(in_cols[1], (*IncludeList)[i]) == 0) { found = 1; break; } /* If we found the file, we won't reopen it. Continue parsing. */ if (found) continue; /* Otherwise, try to open the file */ snprintf(new_format_file, MAX_FILENAME_LENGTH + 6, "%s/%s/%s", filedir, subdir, in_cols[1]); new_fp = fopen(new_format_file, "r"); /* If opening the file failed, set the error code and abort parsing. */ if (new_fp == NULL) { error_code = SetGetDataError(GD_E_OPEN_INCLUDE, 0, format_file, linenum, new_format_file); break; } /* If we got here, we managed to open the inlcuded file; parse it */ *IncludeList = realloc(*IncludeList, ++(*i_include) * sizeof(char*)); (*IncludeList)[*i_include - 1] = strdup(in_cols[1]); /* extract the subdirectory name - dirname both returns a volatile string * and modifies its argument, ergo strcpy */ strcpy(new_format_file, in_cols[1]); if (strcmp(subdir, ".") == 0) strcpy(new_subdir, dirname(new_format_file)); else snprintf(new_subdir, MAX_FILENAME_LENGTH, "%s/%s", subdir, dirname(new_format_file)); error_code = ParseFormatFile(new_fp, F, filedir, new_subdir, new_format_file, IncludeList, i_include); fclose(new_fp); } else error_code = SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_BAD_LINE, format_file, linenum, NULL); /* break out of loop (so we can return) if we've encountered an error */ if (error_code != GD_E_OK) break; } return error_code; } /***************************************************************************/ /* */ /* GetFormat: Read format file and fill structure. The format */ /* is cached. */ /* */ /***************************************************************************/ struct FormatType *GetFormat(const char *filedir, int *error_code) { int i_format, i; struct stat statbuf; FILE *fp; char format_file[MAX_FILENAME_LENGTH+6]; struct FormatType *F; char raw_data_filename[MAX_FILENAME_LENGTH+FIELD_LENGTH+2]; char **IncludeList = NULL; int i_include; /** first check to see if we have already read it **/ for (i_format=0; i_formatFileDirName, filedir); F->n_raw = F->n_lincom = F->n_multiply = F->n_linterp = F->n_mplex = F->n_bit = 0; F->frame_offset = 0; F->rawEntries = NULL; F->lincomEntries = NULL; F->multiplyEntries = NULL; F->linterpEntries = NULL; F->mplexEntries = NULL; F->bitEntries = NULL; /* Parse the file. This will take care of any necessary inclusions */ i_include = 1; IncludeList = malloc(sizeof(char*)); IncludeList[0] = strdup("format"); *error_code = ParseFormatFile(fp, F, filedir, ".", format_file, &IncludeList, &i_include); fclose(fp); /* Clean up IncludeList. We don't need it anymore */ for (i = 0; i < i_include; ++i) free(IncludeList[i]); free(IncludeList); if (*error_code!=GD_E_OK) { FreeF(F); Formats.n--; return(NULL); } /** Now sort the lists */ if (F->n_raw > 1) { for (i=0; in_raw; i++) { snprintf(raw_data_filename, MAX_FILENAME_LENGTH+FIELD_LENGTH+2, "%s/%s", filedir, F->rawEntries[i].file); if (stat(raw_data_filename, &statbuf) >=0) { F->first_field = F->rawEntries[i]; break; } } qsort(F->rawEntries, F->n_raw, sizeof(struct RawEntryType), RawCmp); } if (F->n_lincom > 1) { qsort(F->lincomEntries, F->n_lincom, sizeof(struct LincomEntryType), LincomCmp); } if (F->n_linterp > 1) { qsort(F->linterpEntries, F->n_linterp, sizeof(struct LinterpEntryType), LinterpCmp); } if (F->n_multiply > 1) { qsort(F->multiplyEntries, F->n_multiply, sizeof(struct MultiplyEntryType), MultiplyCmp); } if (F->n_mplex > 1) { qsort(F->mplexEntries, F->n_mplex, sizeof(struct MplexEntryType), MplexCmp); } if (F->n_bit > 1) { qsort(F->bitEntries, F->n_bit, sizeof(struct BitEntryType), BitCmp); } return(F); } /***************************************************************************/ /* */ /* File File Frame numbers into dataout */ /* */ /***************************************************************************/ static void FillFileFrame(void *dataout, char rtype, int s0, int n) { int i; switch(rtype) { case 'c': for (i=0; i=0) return 0; if (s0+ns>0) nz = -s0; else nz = ns; switch (type) { case 'c': memset(databuffer, 0, nz); break; case 's': case 'u': memset(databuffer, 0, nz*sizeof(short)); break; case 'i': case 'S': case 'U': memset(databuffer, 0, nz*sizeof(int)); break; case 'f': for (i = 0; i < nz; ++i) *((float*)databuffer + i) = (float)NaN; break; case 'd': for (i = 0; i < nz; ++i) *((double*)databuffer + i) = (double)NaN; break; } return (nz); } /***************************************************************************/ /* */ /* Get samples per frame for field, given FormatType *F */ /* */ /***************************************************************************/ static int GetSPF(const char *field_code, struct FormatType *F, int *error_code) { struct RawEntryType tR; struct RawEntryType *R; struct LincomEntryType tL; struct LincomEntryType *L; struct MultiplyEntryType tM; struct MultiplyEntryType *M; struct BitEntryType tB; struct BitEntryType *B; struct LinterpEntryType tI; struct LinterpEntryType *I; int spf; if (!F) { /* don't crash */ return(0); } if (recurse_level > 10) { *error_code = SetGetDataError(GD_E_RECURSE_LEVEL, 0, NULL, 0, field_code); return(0); } if ((strcmp(field_code,"FILEFRAM")==0) || (strcmp(field_code,"INDEX")==0)) { return(1); } /***************************************/ /** Check to see if it is a raw entry **/ /* binary search for the field */ /* make a RawEntry we can compare to */ strncpy(tR.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ R = bsearch(&tR, F->rawEntries, F->n_raw, sizeof(struct RawEntryType), RawCmp); if (R!=NULL) { spf = R->samples_per_frame; return(spf); } /***************************************/ /** Check to see if it is a lincom entry **/ /* binary search for the field */ /* make a RawEntry we can compare to */ strncpy(tL.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ L = bsearch(&tL, F->lincomEntries, F->n_lincom, sizeof(struct LincomEntryType), LincomCmp); if (L!=NULL) { recurse_level++; spf = GetSPF(L->in_fields[0], F, error_code); recurse_level--; return(spf); } /***************************************/ /** Check to see if it is a multiply entry **/ /* binary search for the field */ /* make a RawEntry we can compare to */ strncpy(tM.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ M = bsearch(&tM, F->multiplyEntries, F->n_multiply, sizeof(struct MultiplyEntryType), MultiplyCmp); if (M != NULL) { int spf2; recurse_level++; spf = GetSPF(M->in_fields[0], F, error_code); spf2 = GetSPF(M->in_fields[1], F, error_code); recurse_level--; if (spf2 > spf) spf = spf2; return(spf); } /***************************************/ /** Check to see if it is a bit entry **/ /* binary search for the field */ /* make a BitEntry we can compare to */ strncpy(tB.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ B = bsearch(&tB, F->bitEntries, F->n_bit, sizeof(struct BitEntryType), BitCmp); if (B!=NULL) { recurse_level++; spf = GetSPF(B->raw_field, F, error_code); recurse_level--; return(spf); } /***************************************/ /** Check to see if it is a linterp entry **/ /* binary search for the field */ /* make a LinterpEntry we can compare to */ strncpy(tI.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ I = bsearch(&tI, F->linterpEntries, F->n_linterp, sizeof(struct LinterpEntryType), LinterpCmp); if (I!=NULL) { recurse_level++; spf = GetSPF(I->raw_field, F, error_code); recurse_level--; return(spf); } *error_code = SetGetDataError(GD_E_BAD_CODE, 0, NULL, 0, field_code); return(0); } /***************************************************************************/ /* */ /* Look to see if the field code belongs to a raw. If so, parse it. */ /* */ /***************************************************************************/ static int DoIfRaw(struct FormatType *F, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code, int *n_read) { struct RawEntryType tR; struct RawEntryType *R; int s0, ns, bytes_read; char datafilename[2 * MAX_FILENAME_LENGTH + FIELD_LENGTH + 2]; unsigned char *databuffer; /******* binary search for the field *******/ /* make a RawEntry we can compare to */ strncpy(tR.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ R = bsearch(&tR, F->rawEntries, F->n_raw, sizeof(struct RawEntryType), RawCmp); if (R==NULL) return(0); /** if we got here, we found the field! **/ s0 = first_samp + first_frame*R->samples_per_frame; ns = num_samp + num_frames*R->samples_per_frame; /** open the file (and cache the fp) if it hasn't been opened yet. */ if (R->fp <0) { snprintf(datafilename, 2 * MAX_FILENAME_LENGTH + FIELD_LENGTH + 2, "%s/%s", F->FileDirName, R->file); R->fp = open(datafilename, O_RDONLY); if (R->fp<0) { *n_read = 0; *error_code = SetGetDataError(GD_E_OPEN_RAWFIELD, 0, NULL, 0, datafilename); return(1); } } databuffer = (unsigned char *)malloc(ns*R->size); *n_read = 0; if (s0 < 0) { *n_read = FillZero(databuffer, R->type, s0, ns); ns -= *n_read; s0 = 0; } if (ns>0) { lseek(R->fp, s0*R->size, SEEK_SET); bytes_read = read(R->fp, databuffer + *n_read*R->size, ns*R->size); *n_read += bytes_read/R->size; } *error_code = ConvertType(databuffer, R->type, data_out, return_type, *n_read); free(databuffer); return(1); } /***************************************************************************/ /* */ /* AllocTmpbuff: allocate a buffer of the right type and size */ /* */ /***************************************************************************/ static void *AllocTmpbuff(char type, int n) { assert(n > 0); void *buff=NULL; switch(type) { case 'n': buff = NULL; break; case 'c': buff = malloc(n*sizeof(char)); break; case 'i': case 'S': case 'U': buff = malloc(n*sizeof(int)); break; case 's': case 'u': buff = malloc(n*sizeof(short)); break; case 'f': buff = malloc(n*sizeof(float)); break; case 'd': buff = malloc(n*sizeof(double)); break; default: printf("Unexpected bad type error in AllocTmpbuff (%c)\n",type); abort(); break; } if ((type != 'n') && (buff==NULL)) { printf("Memory Allocation error in AllocTmpbuff\n"); } return(buff); } /***************************************************************************/ /* */ /* ScaleData: out = m*in+b */ /* */ /***************************************************************************/ static void ScaleData(void *data, char type, int npts, double m, double b) { unsigned char *data_c; short *data_s; unsigned short *data_u; unsigned *data_U; int *data_i; float *data_f; double *data_d; int i; switch(type) { case 'n': break; case 'c': data_c = (unsigned char *)data; for (i=0; ilincomEntries, F->n_lincom, sizeof(struct LincomEntryType), LincomCmp); if (L==NULL) return(0); /*****************************************/ /** if we got here, we found the field! **/ /** read into dataout and scale the first element **/ recurse_level++; spf1 = GetSPF(L->in_fields[0], F, error_code); if (*error_code != GD_E_OK) return(1); /* read and scale the first field and record the number of samples * returned */ *n_read = DoField(F, L->in_fields[0], first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code); recurse_level--; if (*error_code != GD_E_OK) return(1); /* Nothing to lincomise */ if (*n_read == 0) return 1; ScaleData(data_out, return_type, *n_read, L->m[0], L->b[0]); if (L->n_infields > 1) { for (i=1; in_infields; i++) { recurse_level++; /* find the samples per frame of the next field */ spf2 = GetSPF(L->in_fields[i], F, error_code); if (*error_code != GD_E_OK) return(1); /* calculate the first sample and number of samples to read of the * next field */ num_samp2 = (int)ceil((double)*n_read * spf2 / spf1); first_samp2 = (first_frame * spf2 + first_samp * spf2 / spf1); /* Allocate a temporary buffer for the next field */ tmpbuf = AllocTmpbuff(return_type, num_samp2); if (!tmpbuf && return_type != 'n') { return(0); } /* read the next field */ n_read2 = DoField(F, L->in_fields[i], 0, first_samp2, 0, num_samp2, return_type, tmpbuf, error_code); recurse_level--; if (*error_code != GD_E_OK) { free(tmpbuf); return(1); } ScaleData(tmpbuf, return_type, n_read2, L->m[i], L->b[i]); if (n_read2 > 0 && n_read2 * spf1 != *n_read * spf2) { *n_read = n_read2 * spf1 / spf2; } AddData(data_out, spf1, tmpbuf, spf2, return_type, *n_read); free(tmpbuf); } } return(1); } /***************************************************************************/ /* */ /* Look to see if the field code belongs to a multiply. If so, parse it. */ /* */ /***************************************************************************/ static int DoIfMultiply(struct FormatType *F, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code, int *n_read) { struct MultiplyEntryType tM; struct MultiplyEntryType *M; void *tmpbuf; int spf1, spf2, num_samp2, first_samp2; int n_read2; /******* binary search for the field *******/ /* make a LincomEntry we can compare to */ strncpy(tM.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ M = bsearch(&tM, F->multiplyEntries, F->n_multiply, sizeof(struct MultiplyEntryType), MultiplyCmp); if (M==NULL) return(0); /*****************************************/ /** if we got here, we found the field! **/ /** read into dataout and scale the first element **/ recurse_level++; /* find the samples per frame of the first field */ spf1 = GetSPF(M->in_fields[0], F, error_code); if (*error_code != GD_E_OK) return(1); /* read the first field and record the number of samples * returned */ *n_read = DoField(F, M->in_fields[0], first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code); recurse_level--; if (*error_code != GD_E_OK) return 1; /* Nothing to multiply */ if (*n_read == 0) return 1; recurse_level++; /* find the samples per frame of the second field */ spf2 = GetSPF(M->in_fields[1], F, error_code); if (*error_code != GD_E_OK) return(1); /* calculate the first sample and number of samples to read of the * second field */ num_samp2 = (int)ceil((double)*n_read * spf2 / spf1); first_samp2 = (first_frame * spf2 + first_samp * spf2 / spf1); /* Allocate a temporary buffer for the second field */ tmpbuf = AllocTmpbuff(return_type, num_samp2); if (!tmpbuf && return_type != 'n') { return(0); } /* read the second field */ n_read2 = DoField(F, M->in_fields[1], 0, first_samp2, 0, num_samp2, return_type, tmpbuf, error_code); recurse_level--; if (*error_code != GD_E_OK) { free(tmpbuf); return(1); } if (n_read2 > 0 && n_read2 * spf1 < *n_read * spf2) { *n_read = n_read2 * spf1 / spf2; } MultiplyData(data_out, spf1, tmpbuf, spf2, return_type, *n_read); free(tmpbuf); return(1); } /***************************************************************************/ /* */ /* Look to see if the field code belongs to a bitfield. If so, parse it.*/ /* */ /***************************************************************************/ static int DoIfBit(struct FormatType *F, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code, int *n_read) { struct BitEntryType tB; struct BitEntryType *B; unsigned *tmpbuf; int i; int spf; int ns; unsigned mask; /******* binary search for the field *******/ /* make a BitEntry we can compare to */ strncpy(tB.field, field_code, FIELD_LENGTH); /** use the stdlib binary search */ B = bsearch(&tB, F->bitEntries, F->n_bit, sizeof(struct BitEntryType), BitCmp); if (B==NULL) return(0); /*****************************************/ /** if we got here, we found the field! **/ recurse_level++; spf = GetSPF(B->raw_field, F, error_code); recurse_level--; if (*error_code!=GD_E_OK) { *n_read = 0; return(1); } ns = num_samp + num_frames*spf; tmpbuf = (unsigned *)malloc(ns*sizeof(unsigned)); recurse_level++; *n_read = DoField(F, B->raw_field, first_frame, first_samp, num_frames, num_samp, 'U', tmpbuf, error_code); recurse_level--; if (*error_code!=GD_E_OK) { free(tmpbuf); return(1); } if (B->numbits==32) mask = 0xffffffff; else mask = (unsigned)(pow(2,B->numbits)-0.9999); for (i=0; i<*n_read; i++) { tmpbuf[i] = (tmpbuf[i]>>B->bitnum) & mask; } *error_code = ConvertType((unsigned char *)tmpbuf, 'U', data_out, return_type, *n_read); free(tmpbuf); return(1); } /***************************************************************************/ /* */ /* ReadLinterpFile: Read in the linterp data for this field */ /* */ /***************************************************************************/ void MakeDummyLinterp(struct LinterpEntryType *E); /* prototype => no warning... */ void MakeDummyLinterp(struct LinterpEntryType *E) { E->n_interp = 2; E->x = (double *)malloc(2*sizeof(double)); E->y = (double *)malloc(2*sizeof(double)); E->x[0] = 0; E->y[0] = 0; E->x[1] = 1; E->y[1] = 1; } static int ReadLinterpFile(struct LinterpEntryType *E) { FILE *fp; int i; char line[255]; int linenum = 0; fp = fopen(E->linterp_file, "r"); if (fp==NULL) { MakeDummyLinterp(E); return SetGetDataError(GD_E_OPEN_LINFILE, GD_E_LINFILE_SE_OPEN, NULL, 0, E->linterp_file); } /* first read the file to see how big it is */ i=0; while (GetLine(fp, line, &linenum)) { i++; } if (i<2) { MakeDummyLinterp(E); return SetGetDataError(GD_E_OPEN_LINFILE, GD_E_LINFILE_SE_LENGTH, NULL, 0, E->linterp_file); } E->n_interp = i; E->x = (double *)malloc(i*sizeof(double)); E->y = (double *)malloc(i*sizeof(double)); /* now read in the data */ rewind(fp); linenum = 0; for (i=0; in_interp; i++) { GetLine(fp, line, &linenum); sscanf(line, "%lg %lg",&(E->x[i]), &(E->y[i])); } return (GD_E_OK); } /***************************************************************************/ /* */ /* GetIndex: just linearly search - we are probably right to start with */ /* */ /***************************************************************************/ static int GetIndex(double x, double lx[], int idx, int n) { /* increment until we are bigger */ while ((idx < n-2) && (x > lx[idx])) { idx++; } /* decrement until we are smaller */ while ((idx > 0) && (x < lx[idx])) { idx--; } return(idx); } /***************************************************************************/ /* */ /* LinterpData: calibrate data using lookup table lx and ly */ /* */ /***************************************************************************/ static void LinterpData(void *data, char type, int npts, double *lx, double *ly, int n_ln) { int i, idx=0; double x; for (i=0; ilinterpEntries, F->n_linterp, sizeof(struct LinterpEntryType), LinterpCmp); if (I==NULL) return(0); /*****************************************/ /** if we got here, we found the field! **/ if (I->n_interp<0) { *error_code = ReadLinterpFile(I); if (*error_code != GD_E_OK) { *n_read = 0; return(1); } } recurse_level++; *n_read = DoField(F, I->raw_field, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code); recurse_level--; if (*error_code!=GD_E_OK) return(1); LinterpData(data_out, return_type, *n_read, I->x, I->y, I->n_interp); return(1); } /***************************************************************************/ /* */ /* DoField: Doing one field once F has been identified */ /* */ /***************************************************************************/ static int DoField(struct FormatType *F, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code) { int n_read; if (recurse_level>10) { *error_code = SetGetDataError(GD_E_RECURSE_LEVEL, 0, NULL, 0, field_code); return(0); } /********************************************/ /* if Asking for "FILEFRAM" or "INDEX", just return it */ if ((strcmp(field_code,"FILEFRAM")==0) || (strcmp(field_code,"INDEX")==0)) { n_read = num_frames + num_samp; if (data_out!=NULL) { FillFileFrame(data_out, return_type, first_frame+first_samp+ F->frame_offset, n_read); } *error_code = SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); return(n_read); } if (DoIfRaw(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code, &n_read)) { return(n_read); } else if (DoIfLincom(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code, &n_read)) { return(n_read); } else if (DoIfBit(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code, &n_read)) { return(n_read); } else if (DoIfLinterp(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code, &n_read)) { return(n_read); } else if (DoIfMultiply(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code, &n_read)) { return(n_read); } else { *error_code = SetGetDataError(GD_E_BAD_CODE, 0, NULL, 0, field_code); return(0); } } /***************************************************************************/ /* */ /* GetData: read BLAST format files. */ /* filename_in: the name of the file directory (raw files are in here) */ /* field_code: the name of the field you want to read */ /* first_frame, first_samp: the first sample read is */ /* first_samp + samples_per_frame*first_frame */ /* num_frames, num_samps: the number of samples read is */ /* num_samps + samples_per_frame*num_frames */ /* return_type: data type of *data_out. 's': 16 bit signed */ /* 'u' 16bit unsigned 'S' 32bit signed 'U' 32bit unsigned */ /* 'c' 8 bit unsigned */ /* void *data_out: array to put the data */ /* *error_code: error code is returned here. */ /* */ /* return value: returns number of samples actually read into data_out */ /* */ /***************************************************************************/ int GetData(const char *filename_in, const char *field_code, int first_frame, int first_samp, int num_frames, int num_samp, char return_type, void *data_out, int *error_code) { struct FormatType *F; int n_read=0; char filename[MAX_FILENAME_LENGTH+1]; *error_code = SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); if (first_time) { Formats.n = 0; Formats.F = NULL; first_time = 0; } strncpy(filename, filename_in, MAX_FILENAME_LENGTH); if (filename[strlen(filename)-1]=='/') filename[strlen(filename)-1]='\0'; F = GetFormat(filename, error_code); if (!F || *error_code != GD_E_OK) { return(0); } first_frame -= F->frame_offset; n_read = DoField(F, field_code, first_frame, first_samp, num_frames, num_samp, return_type, data_out, error_code); return(n_read); } /***************************************************************************/ /* */ /* Get the number of frames available */ /* */ /***************************************************************************/ int GetNFrames(const char *filename_in, int *error_code, const char *in_field) { struct FormatType *F; char filename[MAX_FILENAME_LENGTH+1]; char raw_data_filename[2 * MAX_FILENAME_LENGTH + FIELD_LENGTH + 2]; struct stat statbuf; int nf; *error_code = SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); if (first_time) { Formats.n = 0; Formats.F = NULL; first_time = 0; } strncpy(filename, filename_in, MAX_FILENAME_LENGTH); if (filename[strlen(filename)-1]=='/') filename[strlen(filename)-1]='\0'; F = GetFormat(filename, error_code); if (*error_code != GD_E_OK) { return(0); } if (!F || F->n_raw==0) { *error_code = SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_RAW, NULL, 0, NULL); return(0); } /* load the first valid raw field */ snprintf(raw_data_filename, 2 * MAX_FILENAME_LENGTH + FIELD_LENGTH + 2, "%s/%s", filename, F->first_field.file); if (stat(raw_data_filename, &statbuf) < 0) { return(0); } nf = statbuf.st_size/ (F->first_field.size*F->first_field.samples_per_frame); nf += F->frame_offset; nf -= 2; if (nf < 0) nf = 0; return(nf); } /***************************************************************************/ /* */ /* Get the number of samples for each frame for the given field */ /* */ /***************************************************************************/ int GetSamplesPerFrame(const char *filename_in, const char *field_name, int *error_code) { struct FormatType *F; char filename[MAX_FILENAME_LENGTH+1]; *error_code = SetGetDataError(GD_E_OK, 0, NULL, 0, NULL); if (first_time) { Formats.n = 0; Formats.F = NULL; first_time = 0; } strncpy(filename, filename_in, MAX_FILENAME_LENGTH); if (filename[strlen(filename)-1]=='/') filename[strlen(filename)-1]='\0'; F = GetFormat(filename, error_code); if (*error_code!=GD_E_OK) { return(0); } if (!F || F->n_raw==0) { *error_code = SetGetDataError(GD_E_FORMAT, GD_E_FORMAT_SE_N_RAW, NULL, 0, NULL); return(0); } return GetSPF(field_name, F, error_code); } /* vim: ts=2 sw=2 et */ Kst-2.0.8/old_tests/dirfile_replay/getdata_struct.h0000644000175000017500000000474212277111530021544 0ustar synthsynth/* (C) 2003 C. Barth Netterfield */ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /***************************************************************/ /* */ /* Structures for describing dirfile formats */ /* */ /***************************************************************/ #ifndef GETDATA_STRUCT_H #define GETDATA_STRUCT_H #define FIELD_LENGTH 50 #define MAX_FILENAME_LENGTH 250 #define MAX_LINE_LENGTH 250 #define MAX_LINCOM 3 #define MAX_IN_COLS 15 struct RawEntryType { char field[FIELD_LENGTH+1]; char file[MAX_FILENAME_LENGTH + FIELD_LENGTH + 2]; int fp; char type; int size; int samples_per_frame; }; struct LincomEntryType { char field[FIELD_LENGTH+1]; int n_infields; char in_fields[MAX_LINCOM][FIELD_LENGTH+1]; double m[MAX_LINCOM]; double b[MAX_LINCOM]; }; struct LinterpEntryType { char field[FIELD_LENGTH+1]; char raw_field[FIELD_LENGTH+1]; char linterp_file[MAX_FILENAME_LENGTH]; int n_interp; double *x; double *y; }; struct MultiplyEntryType { char field[FIELD_LENGTH+1]; char in_fields[2][FIELD_LENGTH+1]; }; struct MplexEntryType { char field[FIELD_LENGTH+1]; char cnt_field[FIELD_LENGTH+1]; char data_field[FIELD_LENGTH+1]; int i; int max_i; }; struct BitEntryType { char field[FIELD_LENGTH+1]; char raw_field[FIELD_LENGTH+1]; int bitnum; int numbits; }; struct FormatType { char FileDirName[MAX_FILENAME_LENGTH]; int frame_offset; struct RawEntryType first_field; struct RawEntryType *rawEntries; int n_raw; struct LincomEntryType *lincomEntries; int n_lincom; struct LinterpEntryType *linterpEntries; int n_linterp; struct MultiplyEntryType *multiplyEntries; int n_multiply; struct MplexEntryType *mplexEntries; int n_mplex; struct BitEntryType *bitEntries; int n_bit; }; #endif Kst-2.0.8/old_tests/dirfile_replay/replay.c0000644000175000017500000001042312277111530020007 0ustar synthsynth/*************************************************************************** * replay.c * ------------------- * begin : Aug 22 2006 * copyright : (C) 2006 by Barth Netterfield * email : ****************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include "getdata.h" #include "getdata_struct.h" #include #include #include #include #define OUTDIR "/data/replay" #define PREPLAY 1000 #define BUFSIZE 1000000 #define DT 0.2; char *dirfile; void usage() { fprintf(stderr,"usage: replay \n"); fprintf(stderr,"Replays a dirfile at a 5Hz frame rate, in %s\n", OUTDIR); fprintf(stderr,"This program is a hack and doesn't create %s\n", OUTDIR); fprintf(stderr,"so you need to do that by hand\n"); exit(0); } void ProcessField(int fp, struct RawEntryType *R, int f0, int nf) { static char buffer[BUFSIZE]; int error_code = 0; GetData(dirfile, R->field, f0, 0, nf, 0, R->type, buffer, &error_code); write(fp, buffer, nf*R->size*R->samples_per_frame); } int main(int argc, char *argv[]) { int error_code = GD_E_OK; int N_frames; int i_raw, j_first; int *fp_out; char fieldfilename[200]; char *first_field; char *field; struct FormatType *P; struct timeval tv; struct timezone zn; double last_t, new_t, dt; int nf; int f0; char copy_command[555]; if (argc !=2) usage(); if (argv[1][0]=='-') usage(); dirfile = argv[1]; P = GetFormat(argv[1], &error_code); if (error_code != GD_E_OK) { fprintf(stderr,"Error Reading format: %s in %s\n", GD_ERROR_CODES[error_code], argv[1]); exit(0); } sprintf(copy_command, "cp %s/format %s/format", argv[1], OUTDIR); system(copy_command); N_frames = GetNFrames(argv[1], &error_code, P->first_field.field); if (error_code != GD_E_OK) { fprintf(stderr,"Error: %s in %s (%s)\n", GD_ERROR_CODES[error_code], argv[1],P->first_field.field); exit(0); } fp_out = malloc(P->n_raw*sizeof(int)); for (i_raw = 0; i_rawn_raw; i_raw++) { sprintf(fieldfilename, "%s/%s", OUTDIR, P->rawEntries[i_raw].field); fp_out[i_raw] = open(fieldfilename, O_CREAT|O_WRONLY, 00644); if (fp_out[i_raw] < 0) { printf("could not create %s for writing\n", fieldfilename); } } printf("%d frames available\n", N_frames); first_field = P->first_field.field; // preplay the fields for (i_raw = 0; i_raw < P->n_raw; i_raw++) { field = P->rawEntries[i_raw].field; if (strcmp(field,first_field)!=0) { ProcessField(fp_out[i_raw], &(P->rawEntries[i_raw]), 0, PREPLAY); } else { j_first = i_raw; } } ProcessField(fp_out[j_first], &(P->rawEntries[j_first]), 0, PREPLAY); printf("preplay done\n"); f0 = PREPLAY; error_code = gettimeofday(&tv, &zn); last_t = (double)tv.tv_sec + (double)tv.tv_usec/1.0E6; usleep(1000); while (f00) { for (i_raw = 0; i_raw < P->n_raw; i_raw++) { field = P->rawEntries[i_raw].field; if (strcmp(field,first_field)!=0) { ProcessField(fp_out[i_raw], &(P->rawEntries[i_raw]), f0, nf); } else { j_first = i_raw; } } ProcessField(fp_out[j_first], &(P->rawEntries[j_first]), f0, nf); f0 += nf; last_t+=nf*DT; printf("%d\n", f0); } else { usleep(1000); } } } Kst-2.0.8/old_tests/dirfile_replay/Makefile0000644000175000017500000000017112277111530020006 0ustar synthsynthCC = gcc -g all: replay replay: replay.o getdata.o getdata.h getdata_struct.h $(CC) -o replay replay.o getdata.o -lm Kst-2.0.8/old_tests/script/0000755000175000017500000000000012277111530014661 5ustar synthsynthKst-2.0.8/old_tests/script/test_kst.js0000644000175000017500000000236312277111530017063 0ustar synthsynth/* Test bind_kst */ // Can't resetInterpreter because it nukes the script, of course... //try { Kst.resetInterpreter(); } catch(e) { alert("Error: " + e.name); } var errors = 0; function assertNoReturn(x) { try { eval(x); } catch (e) { alert("Error: " + e.name + "\nLast test was: " + x); ++errors; } } function assert(x) { try { var xrc = eval(x); if (!xrc) { alert("Failed: " + x); ++errors; } } catch (e) { alert("Error: " + e.name + "\nLast test was: " + x); ++errors; } } assertNoReturn("Kst.purge()"); assert("Kst.vectors.length == 0"); assert("Kst.scalars.length >= 0"); // the built-ins assert("Kst.strings.length == 0"); assert("Kst.windows.length <= 1"); assert("Kst.dataSources.length == 0"); var v = new Vector; v.tagName = "My Vector"; assert("Kst.vectors.length == 1"); assert("var j = Kst.vectors[0]; j.tagName = 'My Vector'"); assert("Kst.vectors[0].tagName = 'My Vector'"); var sc = Kst.scalars.length; var s = new Scalar; s.tagName = "My Scalar"; assert("Kst.scalars.length == " + (sc + 1)); assert("var j = Kst.scalars[0]; j.tagName = 'My Scalar'"); assert("Kst.scalars[" + sc + "].tagName = 'My Scalar'"); if (errors > 0) { alert("" + errors + " failed testcases."); } else { alert("All tests passed."); } Kst-2.0.8/old_tests/script/test_debug.js0000644000175000017500000000201712277111530017344 0ustar synthsynth/* Test bind_debug */ var errors = 0; function assertNoReturn(x) { try { eval(x); } catch (e) { alert("Error: " + e.name + "\nLast test was: " + x); ++errors; } } function assert(x) { try { var xrc = eval(x); if (!xrc) { alert("Failed: " + x); ++errors; } } catch (e) { alert("Error: " + e.name + "\nLast test was: " + x); ++errors; } } assertNoReturn("Debug.clear()"); assertNoReturn("Debug.notice('Kst Test')"); assertNoReturn("Debug.warning('Kst Test')"); assertNoReturn("Debug.error('Kst Test')"); assertNoReturn("Debug.debug('Kst Test')"); assert("Debug.log[0].text == 'Kst Test'"); assert("Debug.log[1].text == 'Kst Test'"); assert("Debug.log[2].text == 'Kst Test'"); assert("Debug.log[3].text == 'Kst Test'"); assert("Debug.log[0].level == 'N'"); assert("Debug.log[1].level == 'W'"); assert("Debug.log[2].level == 'E'"); assert("Debug.log[3].level == 'D'"); assert("Debug.log.text.length > 60"); if (errors > 0) { alert("" + errors + " failed testcases."); } else { alert("All tests passed."); } Kst-2.0.8/old_tests/kstXbench/0000755000175000017500000000000012277111530015306 5ustar synthsynthKst-2.0.8/old_tests/kstXbench/main.cpp0000644000175000017500000000276612277111530016751 0ustar synthsynth/*************************************************************************** main.cpp ------------------- begin : November, 2004 copyright : (C) 2004 by Barth Netterfield email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include #include "tw.h" int main( int argc, char **argv ) { QApplication a( argc, argv ); TW tw( &a ); tw.show(); // tw.testPixMapLines(1000); // tw.testPixMapLines(100); // tw.testPixMapLines(10); // tw.testPixMapFill( 1000 ); // tw.testDrawImage(); // tw.testDrawPixmap(); tw.testPlotBench(); tw.testPlotBench(true); tw.testPlotBench(); tw.testPlotBench(true); return( 0 ); return a.exec(); } Kst-2.0.8/old_tests/kstXbench/README0000644000175000017500000000131712277111530016170 0ustar synthsynthThis program attempts to benchmark the qt/X calls used by kst, to see if your graphics card is a bottleneck to performance. To make it, qmake -project qmake make Typical kst screen updates are 1-5 Hz, so anything over 20Hz is fine. The xorg or XFree drivers are ~20% faster in this bench than the ATI binaries. I have not checked NVIDIA's drivers. You can expect ATI 9600: ~30 Hz NVidia G4 ~35 Hz ATI 9800: ~50 Hz ATI 8500: ~30 Hz S3 on board: 2-6 Hz Laptop Radeons: 12 Hz - 25 Hz, depending on model and driver. As with all benchmarks, make sure nothing else is running. In some cases I have found terrible performance, even though nothing else was running. Restarting the X server fixed it. Not sure why.... Kst-2.0.8/old_tests/kstXbench/tw.h0000644000175000017500000000260412277111530016113 0ustar synthsynth/*************************************************************************** tw.h ------------------- begin : November, 2004 copyright : (C) 2004 by Barth Netterfield email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef TW_H #define TW_H #include #include #include #include #include class TW : public QWidget { Q_OBJECT public: TW(QApplication *a, QWidget *parent = 0); void testPixMapLines(int length); void testPixMapFill(int size); void testDrawPixmap(); void testDrawImage(); void testPlotBench(bool ppressure = false); QApplication *_a; }; #endif Kst-2.0.8/old_tests/kstXbench/tw.cpp0000644000175000017500000001104112277111530016441 0ustar synthsynth/*************************************************************************** tw.cpp ------------------- begin : November, 2004 copyright : (C) 2004 by Barth Netterfield email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "tw.h" #define WIDTH 1280 #define HEIGHT 1024 #define NITR 1000 TW::TW(QApplication *a, QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_PaintOutsidePaintEvent); setFixedSize(WIDTH, HEIGHT); _a = a; } void TW::testPixMapLines(int length) { int i, j, et; QTime t; QPixmap pm(WIDTH, HEIGHT); QPainter p( &pm ); t.start(); j = 0; do { for ( i=0; i<1000; i++,j++ ) { p.drawLine(1, 500, length+1, 500); } _a->processEvents(); } while ( ( et=t.elapsed() )<1000 ); printf( "Lines into Pixmaps: length %6d Rate: %g/s\n", length, 1000.0*double( j )/double( et ) ); _a->processEvents(); } void TW::testPixMapFill(int length) { int i, j, et; QTime t; QPixmap pm(WIDTH, HEIGHT); QPainter p( &pm ); t.start(); j = 0; do { for ( i=0; i<100; i++,j++ ) { p.fillRect( 1, 1, length, length, Qt::blue ); } _a->processEvents(); } while ( ( et=t.elapsed() )<1000 ); printf( "fillRect into Pixmaps: size %6d Rate: %g/s\n", length, 1000.0*double( j )/double( et ) ); _a->processEvents(); } void TW::testDrawPixmap() { QPixmap pm(WIDTH, HEIGHT); QTime t; int i, j, et; QPainter p( this ); pm.fill(Qt::red); t.start(); j = 0; do { for ( i=0; i<5; i++,j++ ) { p.drawPixmap(0,0,pm); _a->processEvents(); } } while ( ( et=t.elapsed() )<1000 ); printf( "Draw pixmap into widget (%d x %d). Rate: %g/s\n", WIDTH, HEIGHT, 1000.0*double( j )/double( et ) ); } void TW::testPlotBench(bool ppressure) { QPixmap full(WIDTH, HEIGHT); QPixmap *px[4]; QTime t; int i,j, l, w, h, et; int i_plot; if (ppressure) { QPixmap d1(WIDTH, HEIGHT); QPixmap d2(WIDTH, HEIGHT); QPixmap d3(WIDTH, HEIGHT); QPixmap d4(WIDTH, HEIGHT); QPixmap d5(WIDTH, HEIGHT); QPixmap d6(WIDTH, HEIGHT); QPixmap d7(WIDTH, HEIGHT); QPixmap d8(WIDTH, HEIGHT); } w = WIDTH/2; h = HEIGHT/2; for (i=0; i<4; i++) { px[i] = new QPixmap(w,h); } t.start(); j = 0; do { for (i=0; i<5; i++) { for (i_plot=0; i_plot<4; i_plot++) { QPainter p(px[i_plot]); p.fillRect( 1, 1, w-2, h-2, Qt::white ); p.setPen(QPen(Qt::black, 2)); for (l = 0; lprocessEvents(); } } while ( ( et=t.elapsed() )<1000 ); for (i=0; i<4; i++) { delete px[i]; } if (ppressure) printf("pressured "); printf( "simulated plots (%d x %d). Rate: %g/s\n", WIDTH, HEIGHT, 1000.0*double( j )/double( et ) ); } void TW::testDrawImage() { QImage im(WIDTH, HEIGHT, QImage::Format_ARGB32); QTime t; int i, j, et; QPainter p( this ); im.fill(0x0000ff11); t.start(); j = 0; do { for ( i=0; i<5; i++,j++ ) { p.drawImage(0,0,im); _a->processEvents(); } } while ( ( et=t.elapsed() )<1000 ); printf( "Draw image into widget (%d x %d). Rate: %g/s\n", WIDTH, HEIGHT, 1000.0*double( j )/double( et ) ); } #include "tw.moc" Kst-2.0.8/old_tests/ksttestcase.h0000644000175000017500000000075212277111530016067 0ustar synthsynth/* * Copyright 2004, The University of Toronto * Licensed under GPL. */ #ifndef KSTTESTCASE_H #define KSTTESTCASE_H #include #include #include #include #include #include #ifdef NAN double NOPOINT = NAN; #else double NOPOINT = 0.0/0.0; // NaN #endif #ifndef INF double INF = 1.0/0.0; #endif #define KstTestSuccess 0 #define KstTestFailure -1 #define KstTestFailed() rc-- #endif // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/testsmatrix.cpp0000644000175000017500000001366412277111530016462 0ustar synthsynth/* * Copyright 2005, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" // #include #include static void exitHelper() { KST::matrixList.clear(); KST::scalarList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } QDomDocument makeDOMElem(const QString& tag, const int nx, const int ny, const double xmin, const double ymin, const double xstep, const double ystep, const double gradzmin, const double gradzmax, const bool xdirection) { // Should be some boundary checking in the constructor. QDomDocument smDOM("smdocument"); QDomElement smElement, child, dataset; QDomText text; smElement = smDOM.createElement("smDOMTest"); child = smDOM.createElement("tag"); text = smDOM.createTextNode(tag); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("nx"); text = smDOM.createTextNode(QString::number(nx)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("ny"); text = smDOM.createTextNode(QString::number(ny)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("xmin"); text = smDOM.createTextNode(QString::number(xmin)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("ymin"); text = smDOM.createTextNode(QString::number(ymin)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("xstep"); text = smDOM.createTextNode(QString::number(xstep)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("ystep"); text = smDOM.createTextNode(QString::number(ystep)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("gradzmin"); text = smDOM.createTextNode(QString::number(gradzmin)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("gradzmax"); text = smDOM.createTextNode(QString::number(gradzmax)); child.appendChild(text); smElement.appendChild(child); child = smDOM.createElement("xdirection"); text = smDOM.createTextNode(QString::number(xdirection)); child.appendChild(text); smElement.appendChild(child); smDOM.appendChild(smElement); return smDOM; } void doTests() { bool ok = true; QDomNode n = makeDOMElem("smDOM", 0, 0, 0, 0, 1, 1, 1, 1, true).firstChild(); QDomElement e = n.toElement(); //basic default constructor values KstSMatrix* sm1 = new KstSMatrix(e); doTest(sm1->tagName().startsWith("smDOM")); doTest(sm1->sampleCount() == 1); doTest(sm1->minValue() == 0); doTest(sm1->maxValue() == 0); sm1->value(0, 0, &ok); // undefined value doTest(ok); doTest(sm1->value(10, 10, &ok) == 0); //should be outside the boundaries. doTest(!ok); doTest(sm1->sampleCount() == 1); // meaningless doTest(sm1->meanValue() == 0); //basic symetrical matrix n = makeDOMElem("Symetrical", 3, 3, 0, 0, 1, 1, 1, 1, true).firstChild(); e = n.toElement(); //basic default constructor values KstSMatrix* sm2 = new KstSMatrix(e); doTest(sm2->tagName() == "Symetrical"); doTest(sm2->resize(3, 3, true)); doTest(sm2->editable()); doTest(sm2->xNumSteps() == 3); doTest(sm2->yNumSteps() == 3); doTest(sm2->minX() == 0); doTest(sm2->minY() == 0); doTest(sm2->xStepSize() == 1); doTest(sm2->yStepSize() == 1); doTest(sm2->sampleCount() == 9); doTest(sm2->setValueRaw(1, 1, 5)); ok = true; doTest(sm2->value(1, 1, &ok) == 5); doTest(ok); sm2->blank(); sm2->change(KstObjectTag::fromString(sm2->tagName()), 3, 3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false); //should not be legal doTest(sm2->xNumSteps() == 3); doTest(sm2->yNumSteps() == 3); doTest(sm2->minX() == 0); doTest(sm2->minY() == 0); // meaningless //doTest(sm2->xStepSize() == 0); //doTest(sm2->yStepSize() == 0); doTest(sm2->sampleCount() == 9); doTest(sm2->setValue(0, 0, 1.0)); ok = true; doTest(sm2->value(0, 0, &ok) == 1.0); doTest(ok); doTest(!sm2->setValue(1, 1, 5.0)); doTest(sm2->value(1, 1) != 5.0); doTest(sm2->setValueRaw(2, 2, 6.0)); //fails KstSMatrix* um1 = new KstSMatrix(KstObjectTag::fromString("Unity"), 3, 3, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, false); um1->setEditable(true); doTest(um1->resize(3, 3, false)); doTest(um1->setValueRaw(0, 0, 1.0)); doTest(um1->setValueRaw(1, 1, 1.0)); doTest(um1->setValueRaw(2, 2, 1.0)); doTest(um1->value(0, 0, &ok) == 1.0); doTest(um1->value(1, 1, &ok) == 1.0); doTest(um1->value(2, 2, &ok) == 1.0); doTest(ok); doTest(um1->setValue(0, 0, 1.716299)); doTest(um1->setValue(0, 1, -0.485527)); doTest(um1->setValue(0, 2, -0.288690)); doTest(um1->setValue(1, 0, 1.716299)); doTest(um1->setValue(1, 1, NAN)); doTest(um1->setValue(1, 2, -0.274957)); doTest(um1->setValue(2, 0, 1.711721)); doTest(um1->setValue(2, 1, -0.485527)); doTest(um1->setValue(2, 2, -0.293267)); doTest(um1->minValue() == 0); doTest(um1->maxValue() == 0); um1->calcNoSpikeRange(1.9); //this wil produce no change because the variable _NS has no default doTest(um1->maxValueNoSpike() == 0.0); doTest(um1->minValueNoSpike() == 0.0); // KTempFile tf(locateLocal("tmp", "kst-smatrix"), "xml"); // QFile *qf = tf.file(); // QTextStream ts(qf); // sm2->save(ts, " "); // tf.close(); // QFile::remove(tf.name()); } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before kapp goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } Kst-2.0.8/old_tests/comparison/0000755000175000017500000000000012277111530015527 5ustar synthsynthKst-2.0.8/old_tests/comparison/latexlabels.tex0000644000175000017500000000043512277111530020553 0ustar synthsynth\documentclass[10pt,a4paper]{article} \usepackage[latin1]{inputenc} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \begin{document} $2^x$ $2_x$ $2^x_y$ $2_x^y$ $2^{x^y_z}$ $2^{w_x^y}$ ${3+5}^x$ $x^100+y^32$ ${x+y}{x-y}$ ${{x}}^2$ ${x^y}^z$ ${x^{y^z}}$ \end{document} Kst-2.0.8/old_tests/COVERAGE0000644000175000017500000000327412277111530014501 0ustar synthsynthTesting Coverage in Kst ======================= Test: testeqparser Last Run: 03/02/05 Failures: 0 File Cov Notes ---------------------------------------------------------------------------- enodes.cpp 91% Mostly missed error cases and some plugin types. enodefactory.cpp 100% eparse.y 94% escan.l 95% kstvector.cpp 79% Not meant to test this file. kstscalar.cpp 36% Not meant to test this file. pluginloader.cpp 70% Not meant to test this file. plugin.cpp 55% Not meant to test this file. Test: testrvector Last Run: 01/17/05 Failures: 7 File Last Test Cov Notes ---------------------------------------------------------------------------- ascii.cpp 81% Missing GUI stuff, some error cases. kstrvector.cpp 40% Lots to do still. Test: testhistogram Last Run: 01/17/05 Failures: 0 File Last Test Cov Notes ---------------------------------------------------------------------------- ksthistogram.cpp 51% Missing loading, real-time auto-bin, percent, fraction, max-one, range with max < min, change vector, y label, x label, saving Test: testscalars Last Run: 01/17/05 Failures: 0 File Last Test Cov Notes ---------------------------------------------------------------------------- kstscalar.cpp 91% Missing saving Test: testvector Last Run: 01/17/05 Failures: 3 File Last Test Cov Notes ---------------------------------------------------------------------------- kstvector.cpp 31% Lots to do Test: testlabelparser Last Run: 01/17/05 Failures: 0 File Last Test Cov Notes ---------------------------------------------------------------------------- labelparser.cpp 59% Lots of untested greek expansions, and some parse corner conditions, uninterpreted parsing Kst-2.0.8/old_tests/testtemplate.cpp0000644000175000017500000000174712277111530016605 0ustar synthsynth/* * Copyright 2004, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" static void exitHelper() { KST::vectorList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.latin1()); } } void doTests() { } int main(int argc, char **argv) { atexit(exitHelper); KApplication app(argc, argv, "testtemplate", false, false); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before kapp goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/dirfile_testcase/0000755000175000017500000000000012277111530016666 5ustar synthsynthKst-2.0.8/old_tests/dirfile_testcase/15count/0000755000175000017500000000000012277111530020164 5ustar synthsynthKst-2.0.8/old_tests/dirfile_testcase/15count/cos0000644000175000017500000000252012277111530020672 0ustar synthsynth?~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=0$Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQSQ=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=|%Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQQ=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=&Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQ0Q=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=IQ[W?~z7zپk+ y8.#{>/:[@EKst-2.0.8/old_tests/dirfile_testcase/15count/scount0000644000175000017500000000010412277111530021415 0ustar synthsynth?@@@@@@@AA A0A@APA`ApAAKst-2.0.8/old_tests/dirfile_testcase/15count/format0000644000175000017500000000011012277111530021367 0ustar synthsynthscount RAW f 1 fcount RAW f 20 sine RAW f 20 ssine RAW f 1 cos RAW f 20 Kst-2.0.8/old_tests/dirfile_testcase/15count/sine0000644000175000017500000000252012277111530021044 0ustar synthsynthQ=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=0 %Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQ0Q=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=%Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQ0 Q=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?y?+ ?k>>z>z7>~>?>[W>Q=|0&Q[W?~z7zپk+ y8.#{>/:[@EO%XU`gnqxsw-w{;}~~;}-w{wqxsngU`%XO[@E:{>/8.#y+ kپzz7~?[WQSQ=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?U`?g?n?qxs?w?-w{?;}?~??~?;}?-w{?w?qxs?n?g?U`?%X?O?[@E?:?{>/?8.#?Kst-2.0.8/old_tests/dirfile_testcase/15count/fcount0000644000175000017500000000252012277111530021404 0ustar synthsynth?@@@@@@@AA A0A@APA`ApAAAAAAAAAAAAAAAAABBB BBBBB B$B(B,B0B4B8BC?C@CACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC[C\C]C^C_C`CaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzC{C|C}C~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCKst-2.0.8/old_tests/dirfile_testcase/15count/ssine0000644000175000017500000000010412277111530021223 0ustar synthsynthQ=[W>?>~>z7>z>>k>+ ?y?8.#?{>/?:?[@E?O?%X?Kst-2.0.8/old_tests/testhistogram.cpp0000644000175000017500000000673712277111530016773 0ustar synthsynth/* * Copyright 2004, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" #include #include #include static void exitHelper() { KST::vectorList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } #define dumpPoints(histogram, n) do { \ for (int i = 0; i < n*4; ++i) { \ printf("%.15f, %.15f\n", histogram->vX()->value(i), histogram->vY()->value(i)); \ } } while(0) void doTests() { KstVectorPtr vp = KstVector::generateVector(0, 10, 100, KstObjectTag::fromString("V1")); KstHistogramPtr h1 = new KstHistogram("H1", vp, 0, 10, 10, KST_HS_NUMBER); KST::dataObjectList.append(h1.data()); doTest(h1->propertyString() == "Histogram: V1"); doTest(!h1->realTimeAutoBin()); // should be false by default doTest(h1->nBins() == 10); h1->update(0); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); int count = 0; for (int i=0; i<10; i++) { count += int(h1->vY()->value(i)); } h1->setRealTimeAutoBin(true); doTest(h1->realTimeAutoBin()); //dumpPoints(h1, 10); doTest(count == 100); // should account for the whole vector h1->setNBins(11); doTest(!h1->realTimeAutoBin()); doTest(h1->nBins() == 11); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); h1->update(0); count = 0; for (int i=0; i<11; i++) { count += int(h1->vY()->value(i)); } //dumpPoints(h1, 11); doTest(count == 100); // should still account for the whole vector h1->setNBins(9); doTest(h1->nBins() == 9); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); h1->update(0); count = 0; for (int i=0; i<9; i++) { count += int(h1->vY()->value(i)); } //dumpPoints(h1, 9); doTest(count == 100); // should still account for the whole vector // min > max h1 = new KstHistogram("H2", vp, 10, 0, 10, KST_HS_NUMBER); doTest(h1->nBins() == 10); doTest(h1->xMin() == 0.0); doTest(h1->xMax() == 10.0); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); // min == max h1 = new KstHistogram("H3", vp, 10, 10, 2, KST_HS_NUMBER); doTest(h1->nBins() == 2); doTest(h1->xMin() == 9.0); doTest(h1->xMax() == 11.0); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); // max < min h1 = new KstHistogram("H4", vp, 11, 9, 1, KST_HS_NUMBER); doTest(h1->nBins() == 2); doTest(h1->xMax()==11); doTest(h1->xMin()==9); doTest(h1->vMin() == 0.0); doTest(h1->vMax() == 10.0); doTest(h1->vNumSamples() == 100); // set to max == min h1->setXRange(10, 10); doTest(h1->xMin() == 9.0); doTest(h1->xMax() == 11.0); // set to max > min h1->setXRange(1,2); doTest(h1->xMax() - h1->xMin() ==1.0); h1->setXRange(8, 10); doTest(h1->xMin() == 8.0); doTest(h1->xMax() == 10.0); } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); exitHelper(); // before app dies if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/healpix/0000755000175000017500000000000012277111530015007 5ustar synthsynthKst-2.0.8/old_tests/healpix/healpix_example_sm.fits0000644000175000017500000222200012277111530021540 0ustar synthsynthSIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H COMMENT COMMENT DATE = '2005-11-01T22:02:12' / file creation date (YYYY-MM-DDThh:mm:ss UT) CREATOR = 'hpic_convert' / Software creating the map END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 12288 / width of table in bytes NAXIS2 = 48 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 3 / number of fields in each row TTYPE1 = 'TEMPERATURE' / label for field 1 TFORM1 = '1024E ' / data format of field: 4-byte REAL TUNIT1 = 'Kelvin ' / physical unit of field TTYPE2 = 'Q-POLARISATION' / label for field 2 TFORM2 = '1024E ' / data format of field: 4-byte REAL TUNIT2 = 'Kelvin ' / physical unit of field TTYPE3 = 'U-POLARISATION' / label for field 3 TFORM3 = '1024E ' / data format of field: 4-byte REAL TUNIT3 = 'Kelvin ' / physical unit of field EXTNAME = 'Converted Map' / name of this binary table extension COMMENT COMMENT ----------------------------------------------- COMMENT Pixelization Specific Keywords COMMENT ----------------------------------------------- PIXTYPE = 'HEALPIX ' / HEALPIX Pixelization ORDERING= 'NESTED ' / Pixel ordering scheme, either RING or NESTED NSIDE = 64 / Resolution parameter for HEALPIX COORDSYS= 'C ' / Pixelization coordinate system COMMENT G = Galactic, E = ecliptic, C = celestial = equatorial, O = other COMMENT COMMENT ----------------------------------------------- COMMENT Data Specific Keywords COMMENT ----------------------------------------------- INDXSCHM= 'IMPLICIT' / Indexing : IMPLICIT or EXPLICIT GRAIN = 0 / Grain of pixel indexing COMMENT GRAIN=0 : no indexing of pixel data (IMPLICIT) COMMENT GRAIN=1 : 1 pixel index -> 1 pixel data (EXPLICIT) COMMENT GRAIN>1 : 1 pixel index -> data of GRAIN consecutive pixels (EXPLICIT) COMMENT EXTEND = 'T ' / FITS dataset may contain extensions DATE = '''2005-11-01T20:48:47''' / file creation date (YYYY-MM-DDThh:mm:ss UTEXTEND = '''T ''' / FITS dataset may contain extensions DATE = '''''''2004-10-03T02:19:16''''''' / file creation date (YYYY-MM-DDThh:EXTEND = '''''''T ''''''' / FITS dataset may contain extensions DATE = '''''''''''''''2004-10-03T02:18:43''''''''''''''' / file creation dateEXTEND = '''''''''''''''T ''''''''''''''' / FITS dataset may contain exteDATE = '''''''''''''''''''''''''''''''2004-10-03T02:18:12''''''''''''''''''' EXTEND = '''''''''''''''''''''''''''''''T '''''''''''''''''''''''''''''''DATE = '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''2004-0'VERSION = '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''1.2.0 'FIRSTPIX= 0 / First pixel # (0 based) LASTPIX = 12582911 / Last pixel # (0 based) MAX-LPOL= 2048 / Maximum multipole l used in map synthesis RANDSEED= -1 / Random generator seed FWHM = 0. / [deg] FWHM of gaussian symmetric beam HISTORY = 0. / = 0. / = 0.END @B)@ TdީA3ˆ°uB"9ArB?(bXf!M£]й ¤ڤBBi \@&Al0 HhAApd0¶&s²z=Y™D~ژ•]s-b(>]' J Xe&@9=ţ¶0V8 z£¼@hժ@.p…BӑAArBMBiB§]KBWl"A;fR~MžгrlSb 'T mFAM_C¶f6Q8~Y:§ ¾hϿ, 0r0c[)Ka{? ³hŠ$A2wT@B?¶· nY?SF$+O؆1'AcfY7‹E y/NgNb$?9њ½·, B]O‹RB +hAoKA)bz>7`ïA5Bk?JAdjeup U}+ZœOBKBB bBBcvC)B;BMBB O1“<^PS8+\y$Ǟ2—xeB?EܳM:¶ g%K“ £(A/B9H$ªW椘 BBj"AB  ! ),c´nAIHԟ<@EP£TǀgL=³´bhs`ښAyFqLU@% *Bµ$AD¬mB,^ZRiA|OpBhI@^BgW"A$6ABvAֳ'B(v­sB&Nsd@AGlCBSog·i)³G=m¥ӳ2`% ·­~BT·@ @ZAi}xB?%B`#A APc" ByĐGoAiVB7qŽ/`k™*¸£} KɐFW`ȿAï/~†H=“ݩ-@lhAH?A}^WtU³&A.?¸daB.B(@|/J?`€k´fŠx hA@_zD AY`pP_>`kq‘B(BF<}pCAE7^ƒԪAƖ\;L.'{?B!aB.V@SF B@BlH,|?B 8,<5«ɞVf +B+–:&zrJAf>p(B2 *ACSA B6̊?q?-8™E*B84yAB?(Ax _”: _HJ>ߠMpʚ (>|$5C5Ukt@,Rx ?4E׀EZ@{X+µ7Zf`Ǫ:C¹BgcJqʝ ŸRN¾OD ?kܻ8 UB1— +CuBԗ@3B ˆFB8BxF…B)Žj@DBsp4,A|B02AtcA=O@:«N@,vB‹ ]–wS| B]>'m¼(<6B''BedŠQWµQ 5³pEܞ†`+B­Ҧ1xB}]BrB2¿Z‡>kBjA^"wC'+B, B8A Bb|Bf]3BMl9@NnO“cF#{R B6B~6O`BӿB7!jAY.,f`B'A ŠcI$LB ªZBQ! *Cz‚[w 8N[V%9"n¢qjA"AA"|B~ApQZAȫB/CB\B*rB 0Bµ0+ B3v Bµ{5AOIJB B>BIB"4AWcAm;_dzPBBAYAf³<kJN*e=/ -mf@"CvZ…w&hkDJTA&4°"zBSK­zB ¯zEP2Au‘ܘ4^dh_5wߨ;A:Ԗ)B1.Bf~AmA=B&Q:@7BA0PAz7Ad\£ 5A BKpBjTBAMM79B! "(}'lOuxV:kª^l "ƒ]oµnoV,B}BU1AB{h·œwTD@5N>f@蔺“-:. *@mp@ElhEgY r9R'E(˜,ƒuT7dsAd.–&;l^/B@AD^BYB6ABTAztC,BBbF0'XHB) BK&B!H:B2e˜W}?zBCnBU…Q@|;5"HBALA{/B7 YBfB}BQ8 BS|BtApM*B:A^Bfx-BE8B†BbB0%BBAA.RB)j9l3tBhYhA7_1B@0A ®v nB<ԥ@–Bg3Oo V£eŸ? 1#vEz?@Akľz1(AuVD• A2 d)-CؖT&68XHAuSB e)n·›tB.p¹=N*BsAe28@ NEFhy2=`[<@bAHBy?YM\??+/Clv̇kX5;|.$8>ɿ4?r0:?r.>˾>t??^??_m}>e"z> ?,Pj-~>֐?=Ƌ=H>9`>?+>J6m[mH>7PXAn?$6 ?v>>Llnf 1=XIC9S¾?c3rD?-/?d-Ua>"?%^?>={8>5 BoJ=P=?[?&տk!z? ׾4<ܾ*p.Ve>@O = ?=|R>xL?N4޿Zd>U^> ?1y)Q-?&=v ;X?a7?ʦ&4Ӝ?Mt?2, ?V)> ZIXܿeQ >~>ɛD?"N=: >&)nx=/d?ϛ> ?;J|>Nj?U`H>5 I^Ѻ*K~f$Ƽ>>>ҳ&>v?5.>op>ldo~oo$\K+>ֿB:?ҿgH&>?)r=_W>3sj?,[> n??HX_>H!?'S _>|=?:?5h?mR@NH"S1?M Ni?Htw? >mE\t%r;Ǖ`MV(?IuB=ޠ>#?jo0<?=?Q>mE^2I;-;>Tr?$(q{i?vzƾ1Y ?bz>x%.>ݮH\@?/n>(>m2/h?@Or<2ľ.?1??T|?>kj忄 >㵿t4P&>b>ǿSD ˿76S?R'&=?,>E>Z"CV@Yurjm>|?1F?a<(}н>hz.>\Uܧ.^%\,>,?7@ʶ?,dA>6?v|?v:?х?m=ཹRpH>>f.m? "??ӱ`\>/g6>п< ?nNHn|H=-t1p݇>/ k:=֚\Fmi>n?n>>옴?>OUоҿtwPC 2?(?Nj2?aU%g?e>u14<JK>yL?QgABҲVGdݝ~8?d>>V=m?p?P??>^1#uV>a>¢%?5t?Zϟ>g?yǑ?R@=>kb? iJyps>qſD >K*?2>CCLwAXнmj?>pX>JDo>Ǿ>4XFf=%?TJ\˽Yn=pPXI?՟ RL">jVL?[Z>qj4?|l?bS=վ y>k(I|迭Z?D >^? ľn6P?^ bn>y? 3>u(?z~> -?D2՟?P)8*=OvP>5v̿=ȘFAj=|k? b=?>_>lQ?I]\???W?%?@a=_>TU?.^{Ts¿7a>מ@% >?e?hk?rw?E{Q>R@?. >> 󿨤d? X=ıo ?-B#> i?f>G??h>M:*?Hj?;=>JT@s}?2޾֡Xq? lG?Py?2 i(==GL/?K.h?濵w,?*>A??KMS&>F%&?[?? rL^Nkw?m?.,b>F;iМ =H1?yq?zJw|I">>?ԾSb?5E>榄հi|/e%WkM}<?">VB?(s13rp?= ?Q>F?1;%¿Mh< `%j>>2Y6k?V|?S>T>𯅾6(LA忻?9`%ҿ.=c?0?C? @?9dR ?It>kj: = v>OI _>Ih=4p y-vr_ʾ𮾪z?c>辍?rh־ZA?!(>} [@˯̋ ~j>6HU'k>gR?_A=?[<2_ƾ%x? z>c\S"8- ̀o|i??P`ZbE҇?t2?l;Փ?#ᆾ~>< A˿3:<q`??No!>ֻm=K>$S!]A<ۿn>`?& ?>.%Q8??N>Pxh D?nE&j=>>ٚ⿑?B>겿Tp?GP>WN>I?0?j?~? bMg>\j#9Ⱦ晽>n);W>R >|x>T? ΄o?bg>Ņ? >T< Z>ņ<>słb>*J>E*??:n?"?aL ?оbL?IJ?>?*t90l>c>LX>͐?YI>bທEr?kBL~;䀿vR(*:?/8]+A={Ⱦ]Pe,3;O志{?!C.><=peF?5F>Dr>1>7r['??/DbY% 1#>p=ճ*?i.>.Iҿ ,.^=XJ9>?ZP>?rV?3!?? ?ޖD> ?>P>-.Ha?W>䨙5>?E?e8`x|Y^nJn@o>=VFHӼ"?j?i>?'$>D?=z??)>!?"b>/< 4pߋid? ƒQ:H;>pm\=l,?=" >:?^UD?B#+?V>9o`?H<1H{ĝ>Ch?4؋=(8׌q@n謹 ;l>W>5@n+|?}>E">T(Ug!X?B?Qo? 3?FՒ?L]??8(X>otj@[#Lr<[}>~>7k̿>\.?;$>Y[h>a/+>{i>6*?E?CX;}`=>6>a?.=N>?V?4EHJ> y?~?2Bn@&Q徊D>[x>y?=ĺ>Ue >Z^~Ҵ?"t>H1=X> >.>z>8<>(>?(;?gd(CY?]?f^UTٿHl>X4$;;W#3Ew HԾ> ?(T^kT``=#鐽OA>3J?7{?> 3?2SS??RоŸ?$;)>䀿NT?eB? u> =RmhP ;8wZ?]MCd.>`̀>bN >'xǛܾ=<`=MV$J=y(>7Ă? FVX}!{$3H陿h(v@ ?D?! ?'>T<=Ƚ7=zPy?cp?>7L??jҿS?F>?!1lYUf}?S? #?IӼvH?YI ?)!NDz ?\?UU?IZ>ت=ΐ? "B8K@'NL'T>Z.jbW=azm(=҃>N0GĽgI}HVU>;pu>{]&L鿏ȿ%@%&J6?\[, ] ?"<0?i?>>=>I:@>ɼ| L2"[?s+4>^Y08?>+?1&>썽>mt>ptr?HV "g>]hi y>ڻ׾ [)>x.h˿V?K?D?+?(ǟl̓>ߚ?7 ?E>E֌ =>c#'8;,N<n>?o4?wf?7-$ :?=ؖ?y?G?h?a ?!LՓk?LZ>F>j>X ܿie%hz> k=?"=[?X5?1T ?f>g>ֿ?㿀6>p\P?-^#W5vh? J?l>8 z>=Lv>]S(>O>bj?#2=>*@#vо>H?5f$>8/ >T>ϿVT>=RD>>g?P&=C@?"H=NfP? ?GN]jȾ?fE>-?, Ӿ I>?>x>́>?-??S#>??ub??1k>>~s8>MW>}?_?> >1?Ilx=F"<>? @BSz?TWʿ^ZǼ\> >?92>ſoQ?Dx @NV?2ŁP7>xWz=oJ:?s>ߜKIN;p?!;)&B>bu>`3w@d>=舾*{{; )o? _>Š>X?#w7H=$݄?mп>wA3?_RkO>9P>x>D1/~o cͿFX >^4>Z7?,N?>?)lx࿄?>e-(!V>Eqh?;n>=R͛FDK>>Һ>JQ?Q>R>~پ1ʻ??4?O>->'C>ˇ>B?*?,D>4WE?zto?D?$?{R?]`>CD<>?$lvڴ>co! I>k`?X?@>X>h?~0>¿=e >#?> ?E/ >K(/{tl?:>-ؿ Mؾr,?H?>G?vB?h='8]0ۿ6>zmg k@>ͬ%>?N/8>zOFf' ҷÚǿ0>8@տq=>?q?"?(=/E>CTٿW?e=)@?>j?7=?g?kɿ=U7@? ]?ѽȿH`ֽQp>!W>JJH> ?Y?;>K>3|Խ6Ta+=J>SLP>>J??Cm;A=96?=ؐ>KL^m?>U?4?2?j6g??(9=l#>i>_:~]dJx>E?0‘_>P?J?t(ҿG>+ '#>VS8>B >s\Y?A/~?T??D:#C#⾟=Fb?A>XHxCܿ{o>Pl?GBq?&(?f >ݪS>,>:Qq >?b+<A0>*VQ>b#:?JPF̴av4<=_|>3w?wo?B~@D>`SRs>Rb?+8s>>J%N?Nf>깿WZ>^?to_>7 G>\?W?H?'?iƛ?=i:_?9>% ?㡿9y?K=M1p)y;>?At@?J>!eJ$L4 #|e.K?9?:b?v4>7?~?4>쾒D@=?g/? b ? .=2k0~=8[0?7){|>$@@ʿ2>Ө;x]"= 侒t,?Q;$`?>TN?K?Wb?*?As?#}z?UY*N۾pҪx??H¾ጽ*?k??=??c,6:J? Bb&N2>1*L{>AR~*C?*>?h?&?U^/gM\YcP>gȿeľCdP=q>?0y>_>^ 0lb s-? ƀ>>:r?> >.h|>p >Όܿg P:?p-Oޛ>5?IsR%?q?=?d??Oy? 9?4>2xbXξ8 喿JčPԢ?G>m?'l6p{ľ˅2?/?1Z??H?$"=`*%|>K@?7pzk <`? :|>>'=|k?þg$9r >X?A`>ڜl?P=H?{=?4:>}Zh?ɽ>t<ͦ oYٚu+>qȾu<Θs?~?uI">(=_J>b?tr⽞ 1$cA-0ABABjlBkTB`B{DB@ѽBNžLV3UBBB@8qBWBHC3^AB8_aA$BB9r@aumKmb^qBʫBM~B+qBƾAAmBG /2yO,,KTQ߉ԷBB>BpFF@$QcBe4B"MR'BDPAתB_08=BXrOfM9ه«•GBAs@(B3kM|~;]A|º6J-B͢L BeL@p†S1n#A m4Aq,yABOŒ7B<ԙ?P81oBˆqV“–P¹+A?qB W/0ɵ¹GP“|nB8Btt;"BL_AX·EAoAB1=v¢z*sŒȠB(*tshB¾oΫQ"F­aA~\A`>P2LJn@_S`QY\ª/ۡ!tcˆ11˜P/\BTB}B^CTeQrAJB*4:pBU`AF0BDמB> B%ABBAMBb`"zQBzBBB/Z#B+-fA~C#BRH3JkC)8 @U$B_&BrC C0Bd@CAӱAjBCBBGA>BraBBaBqAAFB="N-C:BHLA©WšQLxP9tI{ZtW!ÂPYˆx[I!,J­šVQEBCΞA›@HxE|*J±HˆF -~1›³'ГBjH#A QB28(x]¼6%y; T@tf!֢¡6c«(n3A$0B}BKBc)pAzJ*AHBC BqBdB|A"RAqDš7vBq_BHBjBܕB>B^BBHC\8BBCw'BBB|BBNp? A'AB82 ^BBbsA+ -1B|B$A|B˃C #BAܵ AF kA7rcBBFx?-PC BCNB8a*|A,B=<>Bp:B A|BA GABRB BdžAB(ASB#6‘7“Ă¾e -/¦?B+PHY‰W6Bi. †5A@-{Bզ$/XBB٩AeB BrBKBCBl„U-½%)CBY0RAcj)H,GѿNADS2H9AIo1n/²fr[^~^˜+‰VA'n jB_^-dBnU=B/OrB{JV€Q³7t ¢?1s8\ȅJM@.5mWBA >sデ@X BIBK!^$A.Ž!YE©J0”CvB.;*EB+BVB,WBvj¹za2{A0e¹nnB}bӶQZ|> <6?YB sB<6W)›XA @!PKc~,!‹ ”U¹04&{7¨5S pzּ̿»W4^ecB[’ BOL›~AKHŽTWAzk0 3AFB Bx[AxTBj@uTBpHA)BIm>>M@\e^AC~@5@+ظA, OA{AuBGvkBA1AB?ANBTB8NB_DCBP0BgsAA#6BX%@ kxAaBaB0l Bz[At ½՛B1)nF ?~ &|ºwGBJatA5g, ¡{&NwP?0=pBo,C K8BbB$Bd&AĝqžBCiB/ˆp r :—&!9WZ!xR?هzGFnT؇:†1¨PC=cT9”`<vw/-a ⬂”Ь.z´Ӭ0½l^#A5´Gdmh fB12BƘB BTBP7(/q;?R2)gR@?TӔXcPeq>̧T93<婀?E R?Qǽ >w?瞟?;*:?W׎Iȸ>od#t`S=7'=?J B$=miؾl >.27?<>p\f`Hξ?g8qjj?|>M5H f?>ȶw ҿ#<@AKh Ÿ>A=("ƿ+38uM0佻{2Dݿ09>+>>u >]5??9>ҿ_y>/L1ʗ?iмf@޿&<>/=>?2>%? 4>N3P4,%a>_?P 7?NǾּ`ꀿ21Ȉ>Deh0A?u??Oz>_R>ِ?a>*jо±?B?٘L>s?E濤|?>pÿ>+>z?}肿/T?XXf4\Kn,=)f@̽?1ԿL\:z>t*VBqq?i>[>> x>/}?9a8>r!~':\ռN>V+??I.sbo>>>?O߽<>elHB?6?h䨾% w۳b>?/ >LQ1uT=p⿪a?+C?+ھQk?y |X@!??d+YE>j?n?bN0v> |>=YrzL@׽3>SW= ) >?m Leƿݿ3`>$ƾǬ2B 8+>9ٿE\>ܿ j>qpMĞM Tz?sIe 425MTyG>>??e>??Q>׾aJ?I>c\xݿ˾/ン㿓3p??h,e??fX~WJB=@⾛?`޶q?ZP#? +Y8?T4p/9h GM:?]p=?!wZ=g@,#8?Odw?9T?z ?|FXs3 ` (>Jۮ>s>"8?>>o#-p?N>쇦=>.?(lK侖4F K?5տ%?>'>zk(L?>4-"%<@>_>w?}? d?kHPT=0j?޴6q*>1i?cY.?CJa\> ?3??NU>hz 8D0k̿^H? >^v=Á?Up࿵$>)A?{2σ?>$P?ʶ>(uy>+?A6I:?R-?<ό?U<`0ʾͲ>HĿX )0#Aг?Vpܿ`y>0J>|J?^F Ѿ|B? ]PȽp!`?= =#?oS0>bS.?M??)?rm"b E?=J?pkh?(VV|N>Ҿ#T?w9=j|Њ=À>ѐ[72?><`>88 ^%o =|5Y5>޾R%?U hO?S[>&>?(G.V>\%?UU?rp>xY=yf?Zc?G=Ka?/q>bJx2F ?$VF>>ٞ>">:$ O>?{)ξ=;fF>%P>p@Ȝ)ʾVz=t$(?s2a?D ^/ɽS =Ay ?? 6?cyHkn>*侣~Q30I2>~??|f"@U>0?-f>E?g>E>xH>7X&?=pr%?!N>=n?;>| Ì>߿fFQ=v(40 !\8gJx0(>J63lS?B`>(?ܓi=m|? nu>%hBʾFV?ۤ6>9$>? MɼP#@d>>`JX?k>2q?$v=<Oy?Ef0<18: `TNξ־y!,p??~.=aG?? =\?!X>m?6BQun=؄Mi?0-?>@%UT m>}>,|F?& n>9?¿75i?)SU>G>t>ݾ̱l^> 6?Zz#w>T>)?V]iw\<>*>/)?I?S7Y@?&?X>=c8YnQP?^o MǾX⾭肿vqſ ?`?̿K4>m1&? >,z>~?Xփ>h;Q|^T?8??Oް?m>f>v=?h|Z@?(4}z6l!Ѽ1B;&?aj?0=E&/?>?>ΝBB ?!,;>_K?٤>stS F?!tV>wNXv>nO{K>|?\55y>mI. =1}?>wǾ寿?i?=,?}0l?-?=̜1?h׿ʿt_t<Wd?H~ ?5KQ=?h>?7k>-D=,+?4[a?r?Bpܮ> 6>1>DԔ?;`~ټ>x>fa+_>+?c e0jgv??L@?0?G9?}_?dA?2{??@?r>M>ul>©d>=P,r?w{?g8Vd?zB?M⿣_:>f~Pu?6ʿ,SZ?LJ>~?A$&>>yWl2ҿM|z<ݳ`O^? ?(>^l9H.G?>z >P<񘿢x@#>E4M>>NhX>+d=$B|t)>qP3?0F<>̽м6lk˺>OeȾ p!?y?.c>ݻ=nsh>wfPy+Կ@?V>'f?W?&}>פt?7ΐ>ͷU>zL>>4G;>>zck¾WkRd>_iAZ>vF?W[tPj >C >_p4nk?r&`V-O>`6>t??*hx>C*>p 1:?uZK?`> jyܾj>H?2;>x,:.hr8/ 迤ʽt4? M?+oc ?QO|=p>?G?H>P=UE>9y Ğ>L2o?n4n6 U|?nd`>k?n>qh??>c6?bԿu%QFJ>U>??l><.?M3>nGW!>[ V*h=s@!/ ?n5W>ZzQ?>vl>&0E~f9?z;>q0c?C?4"bra?l2?R?'ֈ="2~dP[6?=%>;!=%i&[x_=((>ډ?`; %?(>q>$><=oP8@G`?,Q?T?%k?Rrd_f>]W>Ҙ>w}=ǻ?<0>~yz'Z=9x?("=6t>[H?l?F?w岾cTX>:CJ|Iem3>zwp`>?:U??%y?>`?zS8>+T !VAd/ɾ>ҖƿT_>3>M>>?>s(=@\fLF?lL4?{Da`>>Cwni?^Jϒ?pپ6-W>&T߿`?=X>Z|=r?{\>??@׬?c9>Gfn/ྜྷD>kؘ?&.= 4>u?E>?4?Sפ>Ev?|?<>?1fRڿI6/Ф>o;,>ew> >ᶽ-\?q>+(ޡ17>&>Ⱦ*5>wB?>ZH?pd?pH*_=pȿE UP>Pt +">=?P??^b>W"?rF?_^N>? B6}q@T>? ?(>fN>F@&?keg>LZgqdJ?U*?>z>8J=?P|授>R5Əw5܉^ g>>HP??,VTp Z?,\?s?O$??WνھK|>t?j;zy?%&=??L =^>>L?Ųb/È? ?~L࿲W&?A0Fgn>{ >*K?2?- >N@#qb=z?,住<>Se>dO=_0>?>[̾ ٕ>>h>H?:D|?O?$S>ܗk]JL>]w?O[>l9[3QD=?g- ?%? O"$ ?)0>KȿH@ĽL!SK=ĮDJ>O~TgJeN8?5>*jT"?z`>qV?#>8uپG<>붾l2?6>z>wu{Ν+ɿgf6>;瀿A(1?=ʭ>>.9=tPm?_>p> ;e=0YпJ.>9>>> >o!*> >IW>??8m=a>I顿p0?LW7=9? NH?CDO>'>-PƿY¿^>tsP=Ԫ6?A?MY>e?g<>%<>P?jw??P񸿀dm?+H~f?n?l` ?)=Cp?*??A0нy? ( =l`ߝ>@Z?)?̆ uܾv>\|:G>wb̿;s?3;];&N?^_>=H:6ݽA>(>aԿ@)}>3L9Pѿ?ݾd=`w?{ǥ>?:?<;>CgQ;$<<:8?&?3;*zzZɿ}P@~ =p>l)<>?2޿#5:>痒?6^?E?Cz> ?HP=T*T >jݥ)Ŏ?:vb?ӾT>|BƿIn>hyF7?5~?/>p>?x?[i{? ?^MH>*<ℿE?{l?z>Dƿ<?"?O%(Wнή>!>?PND'Wn aw>$>f?*俣;Ҫ>C̿c?H>i,>X?>u?~Yh> >#=\ľN ?Z>Ȟ? ?{8>SXr2@??z?4m c<= >K W>j=t?+?1?- C^>}s#6I?e0}>d`>!?ㄿ 4?Z>O? ߾Y0+fH-=빢?=>Le0tֿq?]\?dh= @?J^ >$x?%+d`@n wP=>Q?.6GоY(p̿Ws>B?3>|?h,? ?.<>???`?Ty?#f|?T6q?7 V N#rOR>_?/DVؾWE|> .?'!>~>z3f׈=X>> j>$>G>z8q?{m*F?^>>ݾ5>Syd`?Y=|L@ ʘ_?H1>0?I}?m%-(QR@Д?(|>?+h  9 s>,+>=ɂ?Ɉ%8>u]>Shd3?L#?2NG`, tV\p .?Z7@?ݛ`:?9?G8>YX?Lqƿ֘X>B>si? i?wJ?H=)Wh=>ھ&?]Bd8? /au=HZoV?6Z?~?b־'b>=Fp?uS??!~OJ7kG??Vf>8?ʎ B?T>M?x? ʿ6?a#>K> ??<>r:>>ȣ?fG?f7 ,P?>,?|˥?qաk}>hkVw?S|-Ȱ?}>}f?Z= Ľ> 7\ϾL쩿F?QUIXQ?">)ٗx>f_:X>=Ϫ?1?Akqw4>kP~?={>S>?*a A<@Tq?(?)D>(j쿕ҾS=E/|=eQX2>r0pw^\ξ. '?=G^Rھǿ b#g6yF゚h5f?*%6?O>ڋ>>кB? D jw?wC?e]djn)?+?>v*L2 ?u>>P6?K?">5:CO?vտ >\? mφ?? >0eBW!TоY5oWeA? ,"d@?=tI<8ػ?n4>*?y?=ˏͲ=yur?nU<͛p<?Lq$nOD'>C?KD?Y? ? ?~?3QDD>V^ JF?kT{>(v?BM6E}?I'c?UjyB%?̰Bt?@vB>iPB8BQBabBaA BBJAPnB E|8BrfA:*LB:?A`r0)#YBzšFCl[;{O4@PaBmB~}B9A dBB4$Bu:dBmAzB3BBB.jB|ƪB ‘5*¦DBؒ(f7C"AsB!Bq_CC1LBB :BM)7Btn[YkB:BBBAA}$ڠBAM??1k0AB74B(@BFL?ҫe^B1xBS߄AJ%FBKBM$9B>'@ZBYBbB+LBwB&ShAa(B=]NBQKB&gB%AFACKBbB=fB: C KB-i?rVB׼BUBBIcB C$eBwBBBBqBBPB?B?*B^C,CWCB̲BBYICBDB7B8 C%BCqAͨC+lBSAzCBPC!B Bw|CBBC'ABbBLBAC}]C3kC !CBC1BkB}xCXBZCBZBAxBiZCJC]IBEBBpBzB0B CB0B҄BCAAίAlB?A+B9B{AyCKBw#BFCA}oA]B1C 7NC,C8hoP T<C lBABl[NA 1C#B0|BFBBeBZB0B dlmBAB->1(AfB TBI?BBmNhj'AA0BzZ]BPBlBR"A73BdXBZB pRCD@%J;C"eBYWAqA!B'A = \?T“7, im±iA)pA[#hAT7w›9CAr BvY|ªAex{8Ah_^(˷a9tB%b˜KRAzc†IB1d BW7Bu?XAHB BOVZ=@B;Tn1(F m œiµ<'~މY_hA dv\C :qK_MgŒKV¡Q)B4EB,YPA¼N†AV*ƒ@"Bw:B=Bf]6-oZ™e*AAToB0BI_9.@BA?Y"7-T\tS Ƈœ˱WBi1B?A0¬²ϠIXa<µ32zB8ABLBBv[.A('5kA.BAgB(҈1zJKZ@*gjx$BtĿhQuC.BuKB {p ctB@&L$BBoPM*+P~?•8}d9[Bx{Bj B0dACxBL2K~ǘ{»{dA{x™A~6k+"º¨ljA` GQdB')XA!Bc[BBG:B AKBm&AUAVOpBם@{PT fA!²wA@J[BrK"AA@l[L`z62ArB0T$:BE"Ź2A°XauCSB BS$C% Bj$CB|zƒ^&AVUB϶/#!–wB.PfB|pVB:B@B A}{`פA2yÊ BgB9Gnµ{c Q(Q߯[psUsA*"@TTOk¾ Po`ZSŠ<$mM9¸yeBz[m@"|B+BAfB2|A\iBB{CP@ȃB &¿@çpVKVB_TBSAKAWt#A?56 ivAvAO„}>bA1B\4–+PBia(ABAͰInb, ZBCZ?\ AP$S¿Ʒ–Q *NnBO†«qŒMBU@L*:A*B90ĽA B C,\@va"A6`B{^AT4’k`ABD>B^'R@pB BIB$BOBA v’QmAB}6|jt@IPB=BABteA@`@>jBМ^fRB^DBAG`JA/N1Av#iAɃ…$…OP5!`10U)3žv0>=וa|9&C+,,,6z.†C—e‰ɑBڣ f42G‡@V73/gcaѸšOAjQs(KAǻ,,u*=:B&rgB6VRȊ0BR@=eo¥R`œª_B|O &Ac•i]A}%sBJA~B1kB BBB2B hBpѓ\ BJAKBBoC5#B>B[oPB6Bq~h!A7 amRuMˆˇ&<6>E>,=̺C?o>p?o1-=?٫?W]マ U?;n?IX= >:'?1P*ECŽC>m6?n?z =Ե~ҽP?7&QG~#1? ^>Ž ='ؿ/j70L>΍.?lC;@?'<$0Ahɾ`?4C?b>j|Q>?1F&\?c(p>.N3XYH ?,#?j>Ȏ:r6>>U>ѣ¿Z9^>>? ??X>m˽ay>aRv !ſa;?Vx쿆?h=L8.C>?gh?nlan?A >"Gl@>TG˅*D @? ݿ#?k?_3Hн̾>>[A?D_=4[.>W?j1>1?>:Ӛ?]>Č>>I9ӿM]#>1 >\*>0T>{7keM?uʿ~C,>G%;>El\*?"V?3Mw?/j ?CWCn?6 >S>R?:=/E?ieRx}yǵ=B 2.bD?C0޶~`u闿G+:`>?!> ?v+* m?L=A4`>V=p?؉t\=t?G"?>eѦ2?? H3h> M -\?4'A?3@?8kn'>>`7L>=nq?|B>C>ew>\s>>>hF>mn"kX?(> F=> 3AW2`X?O?Ce*?1?K>EJ>5e*HX*c?=s"A>a.?UͿ\տ?VD>k"zN,T>xо%X?AK:>:֞ >hϛ>KgO"B\r @?a?>L˻s$T?XR?nP<>%Am>8AR? >` ??Kb*?]0>$? k˿Lf.kت9O`ob?zQ?+L?[m?j6?3k->dH?O>IJ>ѿ.p#?R?ZN?U >pLJITX>ҼD8=lN>X uȿg ==>"҆>ۏ>mv>N׾/g ꆾ>j? ڽ,?<Կ:?l^nV>?73>|=um+=P?0m>n.>p>>>?E:=Xt?.l<&о>g 0O>4 #x?\>G0?=r=Gmq?r>t?V>'xUQߐ 8p?X俀]Yvr%>=IR4?Cܿ?D6?":\>jt?` ?3?xqr(ྗkd`ʾ <kE?6WKѿI?G>c! ?2Y|,? [Rhbkǿ' 5>Ȳ?B=YIO_ >:2?jLBl|ܜn\>.?RJ(>dOپRƿ4?& {v?m,bq?[7>()MK? 1><=H>^?Z?ƖT?V1>mUu\?yz>WĿCտ@K>J>ER??ě[(FK>$ -&?$S>{6T7> <=\?x~P4?x?e=Хp?۷>,nF>+[?@V=8x B&>C[?XQ??T>SX<?FD긽13.>ƶ=;80K\*Z?Pȩ>ӣ7˽Fl?H&?>`W_pԈ?Xo?w[:b}>N\玿!u=EOua>SnDN0?/ ?x?oT?:fH<Uf? %B1&pKF: ?O-MO?q !@6?3T@ ^>T??I=? ?ؿN$>ܿM^>½ٸBgw=t>X.>)l?y^>E>J$+>D?&>0J-Q??m=z`%(9>ͥ^( ##18a>Ѿ#s쿪E> ?Sj? ?=,W??̏Ye[>ɾJپ&>-ֿu5?HwPn羣?%t(M>Fo>by?UI6\>hgҾ|0??ǽ|?&z?(> >Tc ?3&<_ܿ/,>uKȿ,=?8t?@`;?ֿ)>T1`P>޲=6 @KbMUbQ뜾?jq9*FTn]>k~>8r?8op񬾀t>y)|M>2Wl@>:?i?jt>>-Rb>\>h?RK>E2?n:?9F &>}FLV;>>~?W? K$4%:О>yn,?e*>#+Dd">sfڦLXH>&>_zp翱 v=,[>Pm?H+>tž7_=M0?d?S3'?E'@=2?>IP?~Iu̾#=?o?(vwʿJ>\(b>i?bGܦ=QmΘ=ޡ(p>G>(P>V[!ĿrR>RSv㫿z>h?=o$j>n? O6?1?Tڿ1ܿ^> > )>7a?Pl>hS W>y;O@l`[E?j? F>:r4b>?>s5(>spv`>`>? >סC;н?Y'?aa)>D͚>ѿ1*?pZA?LT { =1$T>C$E?R?qt_ >S>\=}`?|?&WJC?g|lw\=> nn?TG(Y?h >>D>X@?/y?L=řC[l>Ъ?m1V=?k2?=%h>9]>P?9>kWq=<?>X >C6B>YH>n*?F\93ֽ`?/?/ cz(|Ŀ a>ux=9? DD׹?Bu?y>H^>4˜>eA>[vOsKC7^er>3>b4T8>=WԀ?3=,>rr~ٿky=> Q !#/.?,*r=PP>#?}?y>E?_>"]kn>0?2V?pL?G?,{?ON<>=I??) >Q羶XNʄ<6%?D?|^?*U?Q>@?5Q>->x⢢*վ>S^>6I\? ?3>ٙ ,(.?&?zӿx R_>^J>S-? -pC?X"8?'H=w߿_U; >?2 ?r> b? $C>$?ɾ>b^>c>ЈF <nj?+a?qh?L?)uj&n3i<5?<>?eW(fe4EX#,?c?[>? =KnڿE"!>>7?9Xc=XL>""]O>=d?B\b?M?b!?t>@潸 F?*V64>uƽ=Vjt匿 P@t&Ҿ\N6͸>Ⱦ??h.?x?R?W]վc=HX?.-U?O>?X?0Nx?C-8>>H_.pf1־9C?y~W?du<5X<%ؿѾE]N?>}>Α>(>Jy>?Hl0">?]1>wv??yx>_$n??D@>f?_Uʾھ0`~??}?>˿d?HEDC ^4P>c>">8@?c>"9?:?:$v\?[?ȣ<@3>{b'>7dهXObE=VuH >(>픿ȿZYſ19U">ML?L??_ҽ?0>? ?.?F,?G?g04nZ>>?& ;=Z>IР> ?sվ$؀V>>E?>l5?:}2;q?:ٿ>q#?gLL?o?#-G +>X/Z?>t>t?P޿鶼??iQ?.??-^=ʜ>?K?CT?D?~>Lr,>|'z?|?q .8?=~P#?>Lp28jν>\ 6>?<@AJ9??h?=h*m>}VD>}?*?QA>=?l7Iܼ>e<5^>4>ϣ*?sal"∽%>iz>c>J=,Z=t# $D辕?AC ɚ>cf>ێph=aD<;+?r? ž ?o>#o% Gٝ?Hw.>XپP?H?`g$> th&ξםrUP%6dD>3?rf7T?x??u?k>E?3U? ?^L\4[ [,ҿ_?Rw>lp?-?p? ?UfX@?X?9?!C>#4P>B,Ѿ>F9?2?7>ˈ ?,?'?g$V7|>(R\HX>e?'Cc?:ɼ?꾒>>9+H>)8 >5>ta7?g?x->X<[`@?B?Oo> ??J=M8a>4&}XW&?|%?5x&½ ޿$%tpN=R?.;?%nžD\ԽP@?<>Y8? 8?rb?<@>,e=">o >?n0?\7>ŵ?a\Kެ?"0+#?'(yT>{=?Dꤿ} >1?xA0U\>ɭ/{?X?>?M=?7SL>K>R>VE=#2K\>]࿃?z9`=?F|>sȸt>>ʾ(5>[οdMX7;F)?5;={ =J>ω-?B(+-0>{ ?j? T2%>wp>=UJܾʸQT!#D>"hF<п;>tv4-(=q`^?e‿~=P A?Kw>%>Z=Zi̾tᔾm>F>x>$LHb>[3e?<&}пm>?>ҿRc??Kh?m>?ӿhӾ(? ?XUΜ>.w>|">!?>u?]A.(>込?^ܿ0LL?/>P?PbQ'?Di?v>?U>½%Z@/ھUg?I">a@?=@)>KHDR}>`,dX>Zϐg>ql-R@4?:\>zQ>?>?Q??r?-tN?H?xhf^úx$x\?q?lu?̇_? M?U:>n- ?:e˾Rc&>?} VKu7!HI>>? 濪7D>2ý?/?v>;S5Z>пY 0>>= @?D>l @?L?k?[?>t>v>?A>;^>?2DT.?~0}ؾ_>~fBuF>?)F?(\=:a޿^?Le]?>A?7/n6缒3H=fB="?FGÌg必p>2O?U?RlҾ@%?>?rf>=ʿД>"?_>s< d>D>Jf?. 2ȿ *B<.%i_Կd f]?&>일ޒ69ź=>g^=oZ$?>~}vQPb@>?G=uiq?@a>}>~??X@4bHۭ< :ryCme?>k=r:?6I?=y?V쿹DD ֎>)d?\?5>% _>̘N%?@?D@&Y`?h¿x*>Paܿ&>^2(??V?56??ܿv?<|?$ ?0? f7>:?Ԅn>?T=?濚.ڽ G,64R>,?? ?5fSۿ>u8j_>';NӿlvX?֡?.?竾u|̾)׿C9 νh.6 >U?@gqQ?=U>ľςu?3 пšldD8п?J5;?0R>8C?zԾ > &_5i"?0?I7_x>k>Ϧ?M >%j<$>1>aˌ?0{tQ?2)?4?K?i=쁈JY0??^pbZcg?w*??gcʿb{|?@~>~e8A'-BM,AR @HmuAgnO 9*`ۮ¥~9¹¤b>@ªI. >(ZN3¢yB1dApbH1L x5½z²//+`+¿2s €2«y·*by2=b2 M/jI7RBs_6h*&re8vT%A: /?é@AQ I#@W(K,Icpzl@BczB BG^B7ߍA@r@c@]A("4A AT’x`BJ º%YW4j&B>j`d˜>Ғ2#BֺŲ]A T ¬X h-Vh£y1<@+sAb·¥3p³uigž_$Ÿ ?5f}]B|!)~»_v‰C4c3׽VPB/pBdHkYN"7.@BoBB&B;VB Q=(@ Bk-ҔB@0fB$3Bx9AЛB B:&1BŠqABbjnB=t`A(¸x@xf¿fBN0A"B8xB@B$*¢^( ߛ 5¶٥¯v 0!–f"AAC0R@x;@s3wA,BPBBI@Do®AiƴeF-Q@&,£X bW|5O*>u[?${Z Bm?BA&Pn0(WAyC2BB4~OG!4ӱ@օŒDcB׳/@ByӬB/B"[ kLAk9XB*A^B;]|œFKRP #OıA$Bs:J"6Z6 PA] 2qG@O=p9Bo@/C B>yRAA> BBZB(b9BZ­,B2<¹—1x(b߱TA`"vx0¼kzzqEB@:ABL:F@qBdBq BJlBzB/~BoۮJ=mbBaC#+!BvBz0^Yˆ?j«R}s T ~‰٦AS/d4@d] pBqRA–M)AYACBB>Bf B%B=>Р 6%A{BlBPByTBc‘s?IB6NB4}RdBB]B'˥BY7ҿn"A3B2[@|kBnYPԆBB#ˑAFA@AtCBhAC%zCbCYKCBքDCBCZCCBED;BAbBA+1B^}UѾ°ADYAaAu9@xh=8BpB>tABA\\NB)uB=ȽNCcAj#A"@…q\]A" ­ ܠpBBί=C^A B£hB¥'ABBjuBCQA6\¸9j[·%+\;"w¶՟B(k,B"AA5*{*ZAy\Av>]B>B,BB>B/BXlC A $X¢tWC <[@PB++2Q2*B Bԁ!3 +Xoi' Rµ(¶D.3f`6B$ŮB`n:B jAJ R+24BuB*?JœŸu -AAH2GV^@ɸBA5…RYvuAB,cbQ{³P0e`µbºYL*@‹A^4´'(Bn>x$bEKaS…+ ƒ$…V[P€lb !B.A-ÿA=< *u4U H@,b. · 2?{„tB4 |¹BA9qѾA@lB1BnO}NoA0]WK±<€1ۡR?gV<ƒt{?†*>XXnƒA A9 J9”|„8dB BBi˧Bh;B02A̓Bg:B^P Bef:hP>`BC]B]CBG@BB/,A$=[ Ag9uB4zBrBFB*;2A^BB ]PB qAB4psg\D‡PK•OףsAҾfze/0ųWA%.B|C4Ap?o@ ABDATa7Brߔ P0dAQG>@OlsM!|!¡_y6loB+ʟ'BVA3A-¡g@p.Y AAABASA2 DAY•E9<S>HᇬAwޛcA(Br-`€awnB^KB?B5j"B8BsA.w?ƵA#OOb1<$?BN]{zAA2A>(B:BB7BkBGSA^D=8^(»}lBAgMd@{Bs,BA4zUN*5*3fD.B$?ƍ-;A"BonH@dB߳BAEApoBlp_B2 B[B B@J @r3B(48lAolA<@?]K>r^Z;ȣ{Oa"> >mx6?l??>)>>̿a 6~>z?7?i=B;>@z ? ?O0>0Ng=}?;& ɘοV?>X_8#>I?r>R?":?g?Ŀ*B5?W:ɬ=j?ϿnD٧+Jb|?mKT俎x>Y?E>>7]>3=|4<ؾVI>⠾ >S?ru~Do?=ӿ㴽 DrS}L?@<xmtLB?VA?uH=.ؿ&b4>SL>kԾu.?>z?OD8?l>v?(7}>V6d?Mz:?!>H??>s>+?O>Cq1sAſ Aþ|>JN?M׾Ϳvɒ?8/>Ұ?6d?&*=ؿ߄P>E뭻k;:6=jȿL>>E?Xvܿ98N?;>#>l?x! R>!?]\>X0j%;@>=>d>Cxٿ%1A;I ?H>L ?U(?xYJ%G?;d;%>1ս%[>D> *W?տBcʿHkSRX?c>`Jb8T=x?4?+>?Sv?L@? *i>@>Ρ?>߾㕿$:-0*X?8?{2nKj>?\B>C=S2>)M>㻿 uaol?yoܹFU?e>I]?Uie?$>O@? 辴?<>ر?.q>C >k?9y<>3ب?KaRҿ?Z^%?J/3&?%? ]j?? N~>D>X6`*>gTZ??@>F>ӌ:?"??P>I>G>+ľNLz?>;Q]>bC?@?qb--?)>?Sy?z7*90?L$?ϖ?P>;?KK>+1]S}G997ov$>Oi1=?]>?~9>־Z #>6׾^%?gSnыL?? >Q>BR[= E%DrM?i#?l??v4A.?-"MY? wq⣾X=?/?9h?Mt6?\ &K?|?>>>>FRm?>F?>\<5ip?>=gLk]>y~ƾ=~9gᅢ pV OB>n @ؿ0h?B>{t??]0?[?5@ +1|?2?-ܾAһ >?>p|>lg~Խ%,ɕ˾>aҽ*2 H><쿗Z>nMTk%\=<8?*?>(=L(U?cϿ6??g~k?)qh?N>c7?4c-./lN*?HK<>4?]5M>?q=S }|Oؾ>#/>UNK6?þ$>ٽZ?jNq#þ ߿JCT>n?$?>ͿSd ?EP=^G ?Ix>nI#?o_2=?@>L=^? ?-?v->i\>G;>s#^|\߿l4:c?0>/ZZwĽ#$/)?;rI?>h!2>.>ɋ>?n?t;j=%Ӳp?ue>^bwс?UO"= > >VQ>RG?&?G?t6? @>\>@i'><lhl??I%>8?4?0?~3!>^?J4ʽd A`?2N?]>~=14=i?h?KvW3$}?/?j~Jzݶ UL?,?*eD>:>S>g=;?Ihؾk!`п{v`>y?('b=1*J!.mkȿzsA܍>4Ҿ:W>[?5.~y=Yɾ*=Z21B:s|x?>|4uT >@B?Q`?:6?v}=.E=*">abl=w=6?5 V0޾G?"?rAYW#x$?>e|>SpB =5[P',M#> 9ľHvS>Dj>T?@p?:_A?"M>-OvZ=Zg?O??8?䖿3i(?[?EPſ4.>2~ZNܿN,}1y #>>?;p?(x4.D?L֠A5RM Pq+>/?V^)W?60,?1?}?u!?Ջ?%0 b?E>Nv_[l@WH >8??;Rv=ϫ{>LDLT>;=ȑο>ĊؿAWI[rhx>_Q>#>"h?/W?F@;M>۫&?GC>m(@>f>b.?Ⱦ[T&??oj>D?>׿s>$+`st??jv@=0?煿E˾]H>MH?þރ ? ?Y;?0y<k%g`>ci?SX?KG> ?? kfȾ_?7uC2c?/'cX^@[??;d6? v[?K% Z64E?5E >?q?E>(>\G?=9ayQ>LUTb?)wSn:2m? N>?qi?$?J5ھD>?V>W>Ouqt6B>s>d>NTpb0q<>~G(0>)? K9>RiA<= ? g?? ƿP?X;??o>[>Bϗt>?ghOpE>*oj҄ )?X==d? >Tа]>;ZI, ξwWH ~=7?>(?0?(O>ǽ3NwR(>K!?A?w!B>*Y?i;?u h?)=Ĵ>Ѷ8}:>zpM/5>mZP>cr>wtXJ=Fb>`L >YK?xv>^?Bu?d>jlpwŶ$P>Gܿ'?=s\`5>4?y?9t?=Z>^"/>x/~rlqCHU>N >AF$==<>>?W>߿Y{? _DV?4q?-b?]E><>#@=ճ ?ۭ־ugHK# LdK\B>>Q侀!l ??R?za==>y='?L>Wl,q2?\Կ7?|o>?K>v ?? ?1?9`x>2 ==??k?s?H?n? 0?Q?4T俦mtC4`kc<2低ֿtu=ؿ%w?P ??=~H?,>D퀿I ??l>U>>-z?@?+ʌ|FؾqȾ|[> 峊ؙ,=K?3ܙ?lv?3G?X:A G~o% dN>$RҶt>Z>f06~tt?ʀ?:?w? vK"X>L?ѥ>rh?T>E6m<>rEd>صƿ<^2]S'_=?uT=1D<P >y?Q??'>α=R>?z><@?7X >>p >s?=Vx?t7>$(>no{X?"=?gq,=Pf>4濸?)?EO?=?D7~?|d4>̀?>6);=IvY>Xqt>6?>/(cq>>w)`?L;O7>ǿmZ3a?mL+?r۳>?\=Z;v>d_>h>ot>K0)t%?&^?D>*r{P=L_>0??{ج?ע?I'į@$3?#ҿ&5=Id=K4kA0пU&B>2$Z;B?G~G>O`8>=?p?zw>^޿{>~H?8eݿ>XW ??/U??}[~=l>V8œvv\?>}ZB=5L;W)>>ԅ?a@ g?k^?:?<= K*%) ?Bb?tHcF?H&lཐB[> ?c2ȾV>|. ۾;=f=p e4=DD>>|6sĽP1EP 2 ~^hUܾ:8־2?B7o= yFʎ7?>?,kz?7]g`5,xԚ?:vT=(?0L~x>#~>Vሿ?Y+͐??}?>Y.>2ߎƿlٽ?XQi>Y>rz $? >NDk_>nGD=?څ>>7P1\E0?\Ƚi6?+M? VvDEV>ϿD>fC;QΤ>C;>s=>&N=?6c>p}c?e>stR?}r>3Rԁ>D>Í>UzcD?a0? -?[>Uv>Kְ>4GtL?;vܿHs'e:>ϰztlHؾ?-c>>۾>Rsп>_?%Ⱦۡ?7&?:U??*1ӿ4x>#??r?QO?^?X5t==>y""j> p>G Ŀc="ޜ8>&x>O =$> п h>V=dB> Y>k0L>G>IEf?:/_?Oh?0N !>#>jjC?sݓ>\Pp快?Q„ =>ޕ?(?s%>=?I??3f{^$<T` y{ɿ4FC;> UҾI>gd>E?t{>kV\rpi?R?[)x?hw?i?vn>0>K?a,]_Ⱦ8?k>=a0b5b??A/hV]F r>?:>V>X'>F>xł? lu?b<Ҭ^,>p&?_*L>0??))s>{?A#$>32N=]?=1>Գ (0?,$=c>>8=¿꿇sq?%D>=?&?N,$7 7? 16?%\?&G[?rf6?)?g>ٿ =ꍾ4? Fg群lv>RN$пZd\>j==YX?EYԼ'?}??e?5M}~.8>4?H"=v?Hi|󿯲>е>ʿ=d=Pp |JM?x(?$vV mȿjuy?=Mf>b5;pb>NO }i??(>Uz:?uo*P>{F??y>= D>>^G>hJ=p@f?`(l??=}}֔?{xTj̉zF|:>RxL>E?{S1?M?~ B0?Wƿ%uZ?+.?DT"ZD.>X>'zw`?Aŏ7j>7<{R L%LrNA>)=t< q??,=φ?(Lux=Ts? 5?w>o?*Vb]23/="E\־Q>Y?QL?G?{`>0 P|?Y? pYN!?hx>m~ >tx> NW? -$>>S*?Mf?r#ʽ ot?pC?R?!n -G>? 5.&H?(H>t,,^\qR? Q?>jr?Ǻ?6N>ܰ?+=v*?'E?LV8Lb|5`hU>r>e7=_k?>辐ܲ>4z9 ?c?scJ.׾P?h巿=|tR'%ʣ>\35`>v6>BR=>;< >c ?B?l>E]Pm>ĿNy>p-[_5e?=xPj>9JaozپKlۑIs.̿ξ,C&?N*Klm>} ?#J??=xM =?/<<@ _?Qb@ @.h>T"䮿ǒ)ҿZv?$?,z>h>-2M>T[y?B>*m$W>?a?ħR"?V^>Y5>?ݫ? ?bW>Z.]/o6>A>n$>l>DT8\c? O>*/Mo>?| }Gҽ߹V,>zdsT__?=k|/?1?h>9@? Ҿo? {>?N *?E?VM>?@Р1$Pg>>>R?l?GC"d?`b?P>g $?:!=N>p>\>9ڿ>4?f?5=%p=>g?+?e(?}ĿdygHBMDW>I9C2H{ox=+>>;oFo&FRAn<*㞙\Ʒ¯PŽh8µ_ дB tz> _KA6A :B>#}9!'s/B$ž$:oɁBIA]A܏.BEͺ hA."AA4BACB`V|aAgAAчo36zm֐7BNk¥A&:f@ $*nCB$ xBb @t‰Ŏ0Pd@f‰A)FxBe4+ f'BD>,C}7k),YA zFN+x®Lmj~^¦SӶB.A!r‘{«|‰F",ŠAB.: ҟHB@R”Jh¶ . ƒ(;‡uF ,P׽b¨gC-XBC>|&C pBBƴB'FBC!cB A"uC CC C$6BBB 5 BBDB&XBޯBBBBUBm)B3nBl@B¬A@CB"BRBbBj.BB^BA/CBvCiTC}BsZBB,|"B A淭BbuBYBB]BB¢A­/hն#ypT?,x?xQBB{`ӆ\m/'O4cAiA䅾^y?B{H㎊rvA-wٰAׇ@ԩH:BU zAօ[Z·Na_QB"SFHs.Iˆc.$x c/=F4€YC w-cWA¥{A_’Q"~|A CAʉCijA"ˆD]APpB-’3Q,‡i<.AF@!b´[BB΀2ę%?> ±.dE¸Aw9)@WJ‘HB ,B![+BDP5"BGB@f&ApZ?b? A]G54A,@ugC}B1BA<(А9C!&B9C_BtB A8AشӊYB(KnB{BA|Aɝ%B@oB0E4A$)+4S„#@o@[AOBBT_HiAYABV2gw—A=ŸdP@Rh™8 `@B ְ=A_AHg/BZT톤BE'BC,]CO$B߱2B0BB_~@#BA60B,Bj.B3–qA]4eBrB BypBo<uA Aq?Bn0B:B%ApABDiBCjBa~C2CpB_gC6@4BN@jBDB!eC8C,)PBnBBBPB'A۷8BPBc5BsBB}3UC /BsBBFCvB#2BHmCC5iXCUC ]OBP!)Ch#B_BC4BBzJBFrC@n:BlBC>BtCKC.C5 CCC'C>B$nC,CV*C8fCUC9PCYC o4C>\CRBAMšRB)AtBC2_ABEB2”2HjNBB@d@`BoBkBFEhAB(BBʰt$BBJ$BʗBc BpA?BH%¡wLPB$7y2@0B,B*BFAcBHB$B=C_#C C?B9B:B4BGCCCgQCLCvCICf1CT6C\giCICC/ @sCBi` ?)$\?<>N@@Wj>1ٽ$p?:~qj?Z8,1!?մ>>6?M?d{c 7?v??*FӽAd>[!Lx>++dt>2opfA< ?ʕr=jL{3oCs>&RϤ=i;[>$>k?7|>=f>Hd0v>J=Ⱦ>`Z=R'F?C?O=??I>C=!;{VL=?!۳>#ʎEj!?vԾ.=@>㏿ $US?<xEh_3Sľ$]?ڿVk?kP_Iֿ? &d&:>Mi'ZrZK4""hϺR4Bp?=| ¾?ļ\qDp>Zп?@վl?F>c˛Nzz=qX?DY5 ??3 {p?*lϾәb?ƴ= CI>s'HE&<] ޲gb.?q OiPyK?Pf^32??y?8dd=P&?O1½u$>tH<=?)?O4>~=yi\xػ>n@~nkR? Lľ>F? F??R?F>ŏ-?=hk>Z']ְ>KBr?nj?^ ?w>= ?۠=d>$?nI?Sw?ȿ#H;?N>2~>Y־I[>d >4==8?VuҾc?i>0ؿ:ʻdg6= ^N?~hSJ>5;ܾeT?->݃^P??SǗQ=gkY6></ ߉>r?f8? j:3\np=51%T>c½D>>ʽpV@`+z>\>Mi=Dj?Sf>|ྗ%ÿA`P>.-+>3[?[O>jh[&>??^\>O>00`?G/2?|?ؿ^?3?ig=9R f?G J\?/?ܵ=I>:>q??Hӿ}|>xP> <^s࿞?O >a?[>?-LA=/Vҿ1W?S>YGؾ h[+;6.`>fPT?=A8>>w(?>>ծZ> p?G=p>2>ޣ?ofi>;X> ¾?Y~?>HP?w޾׸]b>OP?K$,?9pE<]~X?R1Jv>'0m>[Ґ:'?;=ހ?̾GF>?5!?p?Q?D%v?P=˦/? .0?/C5ֿbAPW=QG>OI>n%.=:={>le+?GNȉ1?>{Ge?ld X|>JC>uJ?xZ`=yiM&d ?>?c?`k<1pڿ:D<8>̾&oL@Ɔ?徤7?? >? D%09P?OP]`>OȾ4S>Ԍ?x6 >`~-@@?>}"i>֜R>>F> R?R^>=:~?^?}?>?@'?/=I????v+o>>?L>={Q/=>_p¾:>SҾ9Ѽ2>d?#j?F(> W:1ӬE x>R?A?B⾌e3?#g?^Ϳ*,?JHߘ9gU쯾/9"ur/eؾ.f>.&m=ߨ>(T?%WleBcͽ/? *#== i+,`5p >@>j>u?HN ?K>1-ѿD>>d}? o?ſ?,>na4ouh??!(>8?On>!&?>O>#>j`'m>c>?#0(t?d?f'U+>J=Ӷ>q?v#?V@\?r"<WC>>A>10?y7p>V?x F2<>ZXj4>AD{ߥ_:<2<0?Ƹ=ʭC?>/j>F:>(?#cAn6?RŬI=ȾhE?>؋9%_>iοk`Sp>/?]?w>??x>'޿\%E>xdMaH >5Ao߿1>r>Q>I>}x<_>7>I!=H2N(澍&>@?T?r?&J > ?>tBGe= ƛn>G0>&o6?B>94 ^> 8nP>vNڿ>A;Aiq{n?Y>@)u_v?l5?S+Xz$>@f>*G-Y>T>f?Qh?b=؈? ?23?aK#HS.=%>l>{&>-Q=>/y. ?6 ֿs&? P8g> ڏ>p<|VJ T#?j7>ؚ?/}C<=H<=>In? {|F*>8>&? ?ldx>A F?n8ە>=h?wT)QH?%޾*㽊jƴ?=|Ӱ?3@>fyd>?[w7?Oњ>ԺI?_?A 9Xv=ծU?A/|?K0>>'?'->p?ZDh?>Y9h^`?=m@{?+֦? x&ѿožs;???->Q9r?ܸ=Z2-?{ʿ?N\ 4 >Ėྐྵ־>>?Ht?Gʿ_1>y>PB?>?? ?)KPp L>4Q?>y>zi?7X?I>J ?=`? cd?}::<>KD>,Ey?ɾ:L?;=J?/?ef>ǫ%?0x?߅?/?Ϥ?h2>iƽ`ܿ3?U_>$WȘbQפ>#>->Thҽ>:~@ ƛ?=?:cZ>l??A?4` /h>N(S0p,Th.yҿS='? [x?A-s?B>?'򿉔8>p˾3T?=R@>ld=N Q=xLX`>#x>/z$ó>M?]b>C?z>Q oľ*@Q?X>2+p~=K>3;I?@?uD> ?}C> ?DKpE? 1>o>kͿ->vp)s?YrX? W0jN>r ݼ?Rd?$⽂(=)>?J?A?k>== \50=eD>>ԑ=9?]>.{q$ `Psο* t־/4?Cjh?}R?2? >_q >`r4 ?>\Y?,69^Q(>I/ 4 ?^OG?$۽?5S>zfHm~?m ?h3>}1V>TW=-> ?VϾK?x>m+>?@@#R>WϿZSf t訽>dI?Dڿo?'p3*YL?Bݢ>T\"Cr>=|?:տ?xi;`>5^>~ߚ?IE\f?1ƾ*1>ݾ8?E#T?>??#]>!=?W=UH2>[1X>󻄾L?e>ǹ>1?*?\~?'?,8?P?O4F?_,->\? " ?2&?^j+u>Pm0qLZY+ =,?{2?re`>.&?y̿X@?wIԿ?|^{an4?·>>d>YZ+Ϳ8>#Ǻʽ.пCa?'C>2"k 1a>iZy)?i?Mr?&;k >BY>2?н>W6Ib&K:=0оgﲾRwhweDc4%6?#b>?D>a?eY d?L58u=j:?s?A׾=1 !j=f?kZ>L ?b`? j_?w ሾ.y=V?a>=N?¾ ы-<ڽ5Owsc?#>7&>ʆ>zHL㋿ u &?/;0 ? >!7>ZL1Ѿ@prGzXN6?7>}t>Uph彍`?H?@ξ2tu5?E=ɋv>d)4=M1Hu efΰ?2?M5ཡc>;R?]R???1H?P 9d>vNY?l*'</>=pרbDWjaw>b>K4{X>(n$=ISR^:Bn?˿q?w>=(>5?zgN?LJ>Ad,(`>CZ? k>8L G?iW8l=~)7&kռH½x?9#R?0m?q t_h$@?j?>t<@H`>b?Q@>Hz?">@?)cؾ¿hDO?Ϡ>?ۮCҿ3?KD???8=.sl?e?V?[>r O8?. pwЙ?>?0삹p`qZ=(>ܕz@ugľ=ܾP(>IfW>J>>T>pe>nڿ,쾿>w???y⿴>hb?bjJ|z?&wF?t޿rֿ9=ɵ ?-z8?c?"=h?z;(2Y?k$.Zཷu(>*<$5k ϭ?z>B4>& 𿪖/?v`Vh,ܿ=(??4/:E4g| X\X*b>3`b?TB$??-~?~b¿Æ>rL`P?~1JH?*վ=۴?r=e?;>?a1?ֿMe?@8>v>Jz?_ӱ>Ba?K?OR??ctjW@Tl>ZܿI<%?J'; =b砿5Mv?4] b??I??`-]bk?w[Zo?Y?FH>㦰?c|?td`>Z`=ׄ0 cOronR=`?B?Eb?NȽ?\>^4DC./3?c}bkv$? x,?n辀,J>>I>[X?#?Vl%<9`=d>LԽ н;u?WF>H >J=Co>h P?9(}NSExS?_5>=:?\'?P =ƶ> =R? ɔ#P>s?GA=ȳߦ?#ieO>k>Ӏ羭࿝㿹?|??\?R:ο6E*;?*>>3F?w??g1b?bm>,)4@Ml?*B=qh$`>>`=Hp`=YU/]h?d >v>pKX༗>GNM>O? ?t`v!ͽL>P+?hU?&=?Qjg=0D\G>a=wX?ͣ? /c=&=Vy?$gV? 鸾l߾߾o?k>!p?D|5?‚>==DO/Kwc>(n>˚|>W??D>p>?<!>D?-.?Ss?r1; nk?[L=A$>'?k?&eȿ~T=س=U\R>kq<Y?+X>"?G:>?U`>Tf>ψSU>PZ꾃?_ .?8xW׾3?>Ҿo⾂ȩZ>RɿG2?g??>|H?#Dh>7>:*?_[?? >?n$'?2\*ɾ?[EF>(.>zH?x? ?jx>Ϗ2ʿH.>|gG =Ŀ5?}iCI=>ѽ?qD̅=bu>#Z0@俕 A ^C>u?:|p?!:$׿6!/?{q?h>7f >ㄍAi׿<\>' 辊3=ܾT>?M>O>2 aHA u?<="ҾǕ=u].zd> F?F@D?6j%#d>`?B%%>@`c=Tbxr6{ ?߾3$?B5D>0Єg>>-?G?>Z>c'qpz< ?t>V=Yx>h>>N?w4?=fa?>J<!d>?=hԿ}֤0p>j?Zl'Džj' *&s~ŷ*(n0?+ܼ >|&?a``'?Dxr?;v,?GL+ξ=+>|?(?h ?>@ T@?=Ed?)+W?_IguFZE8<lRNվdY@=z?VͰJ?SQT '\?L?;X?O>gw%1\޿܌k|p={ ?QӚ <8@1)zN @<><P4?j짿߃:,aۿjG"?"/*?#c??#5C@iuR>AI>K?_ZR•;z fAUAǖB\BB @{s~:BB\B @AXBCBBBC BʞB˦BrepB(A͐PASAd&Y4?XBB9ZB@BwB 6:(=Bk ArNA8'C,B CeAwAAf¸کA-A<[OS@.@oMBFbBҀ6BAB5BOafBBBtBC֢@UofB "*C"2An/AB܄BB60B|{BlBϳhAVt<@s9LBF@kSB{[BIB}BԊB{BŽ@ANB.9Z„LN B3QN"E Bģ5BcYBtG}Bт~tPB2B/դ)lCBBBcCI.B밎AzAe Ag:BBV]?BF1@7lC1]PB".B֣BBP*BΑBBHXB_C?[|BBBLB C$.BEBb@RANBB'@BBBu B^!;B=BשA6sBdAAzYBC uB*BBytX|@wB ]ATYhBGnBBB3&B.Byp?B::B4FBHB C$AzB; AAΒoB׈B*B~BBU7AHB/B;B|BAKʣBB?BH|Ao2ž,B`&\ wt¦A,Bu u<kψBMu`A^.~u:°-6’R'°yCQjXW]{B}lAB@F?f(j@{XBH@E@:B,gBB)BB<*b=fC‘?q0²!}qnBApAQPbҾDπBRBB?&€h(AߘB3jՄA敍@/¿LB §Žµ@@B<+ A(A|u@ AV–BGxBB5¹\AB@!8fASAkV¯t'eo\¼ B B0~BE?Z2@ŞBR B0K=ZhQ¿qNv?‚A23C¹7‚tAdBBm"B{p ܊BIKX[s¯ssBe&vhŽA&=š ± V"Ą†¬pœ –DEAEX”A>gN]n›,lEA’[tˆP–u¾L EɚrA:4l@>|“šȆZ5p-3Tty!(+B+0#BnK v}Œ} B>C)B9AeC"BBBWBB&s!zl8A7B97BjBn\A .A?tBP =ABI$B|BbhBsB=VM@ Bs/B_B&rCA|CdB)3A&B"B$?̀§~F¼B1*Œ:BgB=Kn 6Ⱃ BvŸeƒ V1Y%(!*)gSASFBJAA-BlBAvD‘!z@@Aw7^$<%N}BBGgBUAgWBZNZ@یB AjAD†$BZY% pAW-¸.„²pBGBXBäA:ABŽAμpB LB5>IhAT2:ZBmy^AjBDٹB?"B?Bd‚EA€ @hAW<²:~A4‚VT #AB‰@* kLˆ]a{ :W.R̪@l¤2 A²1-T\VBrJ>-{BZA.BhB^BPT:¢Ab3´JŸ#ȜA ߆:{o[4#*¿ENtB BnAAgfEn*S濎AjG623A .@)!LŽG“>UugB]X7HlABœdNr`M0¶jĹ~V´iuMZB©r]AH ` _?):™›NeNz‡PUˆRB<>qB†ID 1JA*^GBko!fAN"‡AD[~@ru•?@h¸bl)ОAE-¾6I:YRBAY4 R(A!0G J5 VuA\Z (•w oB_&TB .@ڱʊBLrBit%C:x½bA{ԇ.A? QA7NBڴ`g[XfB B* BAn»A¾ݥ¡O!A nZӄŽF/L0L%S™'Ÿ Im­sO‡n*¾J¼.jYk@‘`8⻴פԮA(‘ oM@c>8¿q¼Œ dž³g´{pB@!BLJkB׵B02B7šc@x*Q P*1q­rSXe\I|ot¢/a1`~BVBc BJzkWA"GBB XBXBwdC4L!vBO:&C"BhBQ@[?LAmC X¡9޾B|~BX0Bf@9`A=A@ >BABdAhBfB|C>26?kpb0Ԏ+?eЎ"|?ݎs4e2"9h>5O?>J>y??(Q?=?+6?^>X37>s= }=0IB¿$?]J?gV>->?=ud?q\/ܾ*4>G>\Fr=?7>?-#ɸ? j>FA?>H>N1= Ya=*.^>ڡO`?07D??&3>&,zgh>|Ҿ ?#>goZ?`ξۗ>? ; =?46? ?b ۾t,?Gv;?=5h=Z>>U"N\ ?o->z 6zпԠ=^̿j@>t>(t?ݱn=h>Kþ=?3N2{P>-=H@9@$?:KPBտ;O>ZY?!I/>*?{.?S$T?q>z7zLČ,>*j?V >GwD??:x?@W5H>?B ?%X;w>oܿbG>Ú=&?oJ:=6?۔>S?/ʴ>-2>?e ]?l0?z=75>nR]4ҿ;B)sԼ>A>/=JrbҾ KZQ?^>>>1> z>?k]??"$>:=Sy o?! 2?#P8`ԃ6.>/ܿ6ZNq,E'[.]T@>}?` ?rN?==]m?¢נM>5<?RC(?vU.>B4`;Ȑ? * (<*@ľ ,࿰d$?6?e,?0>P&Sw侙r@ ?_>Yr?{x> ??'&L1aJ?=?_)?V0?L𐺽>(??di?V1?e=10?8Y?SƨOվ=> ?^?&J> ?W>6?O"콞27H??[ >>欄>$V,a-Rlk޿{?z09W(>.)@# Ț?®?X( >.pVV`=>s}&9%?">> >?j ?Zӿ-M?~ >S>?w?d>2>{w lS,dsX<`>t!$i_J?ty<Ɛ?o?{ݿ@F?Qٔy?8ψO=ʑξ#>6=S8'b?jC>Ա GVL?:Ǘ!Ͼ.R>}> Ohux>?k]!)}N.ܾ l{Լ}<=~8?j>??[Sb?-j)*wH8b>T`K<8wTD!<?rh?P ,>n>0?C7=>.? X;f?c?I>rhQY3'<>xZ2?>B?=hHW.;3RNOY??QO^L >Lo?!?nۘ?q\R?&9TܬǼ֛?>It?UN >I Z= =ځ>H;?G+#Z>z? (WL>?=C6>5o???)T=>?و?xiV?Wn)?s֞=;X?~S> rMI螘>5>뤼 @t>Gu=1>*?G/u>LT?8&>vG?T>d>~4O?8{d=c>X=~c>S?L@pSA?uxL; |??Y.>e?WBŽ;$u>>#>`L??D:=??Äc9?>?]>ln6?{?o3Rf>$=? :f@? ?2v?Xs?*@?wN|'M;,>b>S>>Ŭ?b&ߐ> >{J?r?o?!>ԞIaTKY^$|uݿjMl?q?P>\SȾ_Ԧ?P7`e>ǖ=á?>LqG֥?>K?pKx>.v?U ?ʿ1>p?]=D?iko|!?C2"V˙U=ρp>^DV>#U?#=߼ PyG<4Ā>՞qP?Uc?!Ҿ/T?mN?T>e(=}?t~?>=>،={ؿi?=:>RAd\?Rl?zҾ!?Ev>wG?(ҿ+Y?E*>we? KNc̿;>@vG>5??|x>?v0]S?6u>ע#>6.^b?hmP(2mFvO>9j|?? ?z;>Z?Z?⹿/]?Ó˿v?kQM?>>W?S6 H=c=zؿ*y>=3Z cB\+[,I.Ip=X>??:GY>[O͋#Uh>/=Gȿ>4a? ?n=zb@=w>B? B>&?E[?9SҿE?QF>[*oJRR>[>JQ ?*~}n=p=zSD*F'7@>?0>:?XT=>=龋0>5?O]_>(t“>Y=>p5>JrP+? ľc?i>k53?>I1?TR=KH>QV>;5Di&>٠?gC?']5?-=C? ?!\+>?>>?d-??>n19>I@>>}y>۬=&=n>>(?I?jʾ9Y濑% >+w`?MY+<?7 ;>1&?y9#?#Ŀ=",?.oR(=³'p>J?̾!? Sڥ8E9>ǯ?a吾@?N#m?(%??w򾙳:Î?[$P,>3g?]">* ?:Rv>nj!^?ik ?G?#]f>]3X`?J ? >S鑿D2?^>0=i?r'=`0ky>M4>=>{= ;6>?^B>g?N^??:o>`C<_;q=q ?Ό'ˢ}B*Fę9? ,-⮞="x['ʿڴd[>x*0ܿP?wh\$>e$]%=pI wf^`=FzT>%8?;4X/0>>ྞB.>/ />->C?6 ?fS6=h>S:?9)>rF>$ [pB <;ٞ?Wf?o4>GmR%?jiG>3ҊK=6hD>!)C*?&.?FK>2˾\~+?|uj>*B"=}>8&&>w>o>*쾧qY<8@>)翔!)bC>;о>B̯=/? 5:l=H@>7<N>d/ș0+쿙%@0.>n:>ꋠ?`?3?Sw9zS?>n%ծ>0U52>ʪ? >R`4= (@?>>]^A|>)ewǿ3DBB a>j3 H>)>t 5&TzľM]f=@=ݜH> ۾ׇ{虰>;)9??]<Űr;R϶3D`i>rf=?vesJ, BѺ6~?"?呇_n55Qƚ?>k)>PAGȿuG?+V>yN>x?# T!u<{w@?)JĿ(?p,??mhv6X>b-0Þ?~ah 1ϾY_>>z? D׽q>z)Fon=0侨L]L{پZ >G]먾;|>۩?K>?8\rW K<ѱȿH>*X?k?ǃ~?:>ֲ=؛>ewN>Ā?&>^>-?vF==ߝN DXxUА?,>&qE6X>R>a=0>L.>ބ)`-iT2 r5>o&p?<ƈ.=>?J*>!w=m>SaD_r[7>Ne?Wnes~?Hۑ}PF|?e3)]HҾI ?>3G?p=zS?5>'XT22.%?pg?Iٵ?5Q?.̾OR?M]> ?8(U?˿uп]?L `ֿ4 ?1^b n> >->5ma=#=\ >>e^͂k) ٦2yxl\|?kݍs}&ẍ́-l>)ќ>U'V4ٿX}=h=%Ew>_ҭX?>$،[Խ?1?KԼPU=l#>?>Sb'@ <Ӭ3K?B?Zt=Del>z>GҴ06?=Og~隿1u@?eoS~'*> d8lcY?f7 ,="l>cx ?"??}J?M?6d>>{K!ʾПѾY?̿F7l`ԟ> =!>E>5x?dZ>Z5u=N!?t?C=<>\?h-Srv\?X"$Q ˾>v6>>߁윺#@>?wK?7t2P>>l7(Z!>T=Rwh >2 ?p>rLŀ``^M=|ҩ?B0Z= >?1TqN??>,IS%Lľ??L۶?&?ʿ3u>q>yK̾ʿD>T??=? er?d>>4??=< p^[ x#0a޲?RTt>6slg`>!wlD>n?ۮ<>:>Vj>i>=ap?,3?+">+"?o%<{>?h60\Td=n >S~>NJ랿|<ؐe?o25Tٿs=~oS>?Yk:>ީj>E'=Z2`>1?+_?W>>@{>>԰?:R2P??T&>/޿?o >E3=v )y0>^w`r/;Hݿ/M\R\U>w?侊?7K(?Q>+D@;?I^=TP?=K*p?7>Cl(BCBĻ$XLx[ܾ|?L?rj??>\ܽ?mh>= =z{z}W?TW{ >>E!u>{g;`>d?H>g0Rb_^(Cp#? Ʈ3 ??&?Wc ?NxaJPi??ˈ>.>%GĢ?>[?7I??c픿vq.Q ^>m?-xt>{$>6A{>=0`#>.R= JԿidљmĿYRjo0 Zk?E f%?2p>E9y><>ƈ? >1K5q??B?xG>it?8'>y?Dz?V ? >=_hHD>K?"x=t&Б3>qֽ{ƈ8=f?@w?s[l⾢/ 6d?&? ϿҎ׿'4?vԽbQ?gG>٥?|B>gpH&q/Q>kxU>>>XDe7!>E?l>>aL=v>~G=d X>?&:>Fq>=h=:?oZ$>GCھ@r=@>YFP8qI>>?@KT>rQt? @>)>W>̒Ԇ  |>O?>S J?B_?i>|>m|>='t>Wv>Ɯ5i>J\(>`>ɸl=>qC?Q=Rh5?LH3e:Jt??)H?'*Q?'ݿ;>s2N>H??D ?|]>r/ұhX|N>4?sEꊾLl? )W[ =:VE̿E8h>ss='ӿoS썎ts˱>I.ݫ̿0̻%i`?%j?Q?)>lۿ? ;^. ];Ā>?=qؘɈPMA4~?Zߔ> _ɶlN.E?# ?>1?4?Tj싿!?q63l?d=?X>YpD=P(=0?n?3+$ D>h<> =ARE>?6p?!=E>nf? {D?_ޮ?.??~̿=4?2'?!ZG´==">=H? VI?LH6|%>`?? θ H>́?6fT? zM?D܈>?Ř2d7>hd>T#?:=H0&Կ;q.`^?Gg =h?wϿ50S>Ŗ>BdU=G3C>V?kh?>9ҿGYW?/=?#:?;U?rPHI=v?O&(>܋? ̾"y?u< V>{?.%=ɾv>B 5Bc i1Af$B8CJPCApCE0B;B˳BwCz@n6C|B\C0cBvB!PBJB?C6C6BsSB[B2BBBZBCç@2BBB+B BRA~BiA6m0A}B6hC yB|6B"cB @4塠B?]?5ހBac@KOCmB7lBԌ_ l9RwGsA̱BQJC PtAyB,@C/KC CfC+|=6%`ŎwBUBCwBpBʹ[BCsBd5BBbB(B؉C^CPC C1MBĦB)BBcbBh2eBHBEBLAAB'B:?͠저B֑B:B6:@BLFBfB/BFBivCB@AqhCA,AB jB]BpBEB*-B_BgtAxxAtA9(A—8v v@ΔABYBnb՗Ak¶#Be^BAJBBqACErC zBzB%BMBi}BLN>bT?˄ EpBvx~AJl츱BL8B΋zC w7BfIBԆBp#BuBBEB6-BS|BxB.B:uA|B2.CaBvC:BB4C)BHBBfBOC%ByrA[mCkA~:BuAnBBBBBBPBBoBaB:=AlB2 Aq CX7C?BڲBBJBpB'B$C(C=HBBAٯBdAB\ BM)BBBu:BBN HBGyBQ#VAk>CBCnB B[oxBLB0BuB C CgRBB֋~BMC2Br C"BwBzB 0BuCfBB"B|KB@@BA B B4C ABǽSBAL@* DB0JVBXBC$yB'\Bm(B$BB@%BGBt@8}B3BmBUNbB>B(v$sA>1hBCw(B/2BBrBu BC5BKAbA-#CTBHC@BrACCBEC޽C DASݴBEjBK@C@9T \A%PiP’ݺB r˜h`BwB,BBx~B B1"B;B@Aj.E6A‘ksBhBbBbB7Bk:%rICXN @{KABABCPByB㗴V@B>NBB8A)T~BqB'Ch0C+C8XC$CfC - BJbAB} BȵnBL{CAބC=C0CA}CV*BM¾Wz+u  !-ABp~ wUAZˆ&A陡MB$>O"BADg!@|iJBtB0AuB)(BAA@vX|&.BB6C'¤BJB&_AI2BIBBBaIB΁}BgkBHCA ½P ~AߊNBo 'B?pBoB BD*yB-C AfǢ@ZB[qAk@xb>BݛqCBM]BpkBCD,CZBEMC*=BlA1BB>we1}1]9g; 8{jBBSO[(5-p^R†ۖDM"j&?`BCBv’B1&MT+zBΚBBD@@|B@֩BB|BQXBBqCxBGB :BΓB~0BC|vBVž`BB6@{A*Џ`ǿ`|,¦- qK @Yx5_Jry§.q~ †$*7|*¥"KEAB~JBAszB5,|Z /<bAsBBCj6<@EBB3‰or TB$lz\B|-B{An·6hBBSHBDL@!BHAҟ A):§"2®C,B s™7$Fn/ZAdA˗-jf4BSdK@0BNC tXBAnڠG. Aì'tt@" T[[ĥC‘ +ABrjBTf&V>?OC>HX1VvY+?Oh=5`1?Jƿ( 26`=ڐ?)rF>4=@?^?%;92=n?(t:g Jx?+*>wl>;/y⽉D=R@? ?`R?U9F,>5?'>u?R پ>?*r?HX0<?ȿI)&P>k-o?sҪzD ҹ>?+>̬?N?[(D??MsUv>~?>?h^;b@?gr?!r?6vFrlP'Nپ ⿀v>]6+6r=^ C?V\D SD&>9n> N/"- fp?]nV>Z,>uP<1>ZL?+R>:ܿrAc>C?HUE2z?1sD`FV>VC?Bܿf?F=g+1?a(=֒ I? U,PBa?6S`mx о > 86|l 0?%_??Ulsۑ>&v4=M|eH[?޿ML?l?|EN޾)NʼpC??o>oԬʾ=*$a>~>=c?ctD?Mxc=T,=Y?=[C??(?s|~?Laj?!צ?E>.y?2_=`0L>>ڿmNl=WH>.uQZ?>]V];'LF*m4?,I/>EQc[?m ??>Щ.Fe=Ge>oBa >ƟڿTS?͇&<"=L?[2?saGTھY?h>2K?,h=2f>+4?dX>yˆ?xO?%&> !>KEU5?I8F5=QJ>'=ļ?Ppap?^Mg9ԾT ;sb+4=>eZ4!7f忶 DXO?]??[>y>?fp>6>ۢ?$ m>?CY?Vf>/J<Ĵ>4a?Hzs?!A>Od޾C==.$?^\W=].>F!?t??[C #= V?2X˷o>U`>/1'?A=&пHo6>tp>2,jςnK>O?:s\>pN:^>?3BݿL6.2??a-N>C6>~ҿb!?Qgq,(?Oʣ?ۆ?`dc=f?/4? 禿? ~&>|==>p ?<> ovj>ω>T&f滗g?^?Qҿ Y>&%>?B27ցDL,>i<<P>M}nrE>7D>V?ٯ>?eE^?>E4f$;;N7ۆ͗=BF&̌/V%?+?< ??d= >B/"h> i>[ʿR 'h<>PfHΖ?>տ8;>' 羅eԞ|>QBκ?}lĿ>᧊?vh=N_diL#PZz}>>7n>>e~>6>x?wk?bDE?n ^?Aue!ȿWVIHg??=熿0?R+?1_??,1{>ő=нnT??.`>ï>;? 0޾|^=K>>hdg܆?}d51^>f>4wMȾ޿~&x=R< >y>a><(?b`@1:?`>2>z7=6?cf&4P>>X>pfc Xݿ͜ r@=f>ͮk>B>=T> ?՟\>6>)o>pp!?&>S?{;4}v{>:,\>e>L P>Uĺ>𲿦^X̂P ?O>W=Ǒ?j®9?R u>">tېſwP>Eڲ>@?4"d>0<<*? 1c=iԼоV VCX:>Tr:?>ഌ>ݘAu翊P?l?t >W>. T>=-x$>RzX>R;g͌b?M>?%;?jO;?^!l?D#$d쩾l>G,>¼?S^>{|?%?>ڿN28?,:0Uɾ6}@G;Fb)?;Z=\>+=?.v?>V>UA~>[:{o>o?K]ez>?h>;!> Zt:>R0=I>֣J`l..9lnX >>$U>?>L?>ѫ8i>4٦>*?gk?>`?)>iSfiWT?lʽ¾5z>>_B 5̞-tZ4?`3>e.??> 5*?!?쿀C)&?;S8sk8!Q]N>[?ygXH>/C?J=(Y,˖>lFp?J3g=ڋ`5>+>Wv>o]vwmw?2PH ?4è=> (d?Nw">?~陿nR=?WH?3Ŀ27^?2C?ֿ=㔾,>`>&?%eXF!C࿣ќA?$E?3T>i|?l{?$T&?I5XF?~wX>Lj>>!?vS?>)y|H"i>>->S3>p>O4򜐿Y^71RNHпa?;?Xc?Wc?r!ξ i?d}:> ׿kֿnpܿ>>E?\%+U+*?su?]fbi?2c?`?B?Qi?y>D?=?}?̈́?޹?d?<5;J i+fLG ?% &?rQ辂#` C}о9C 0⿉i&5?Yo|>Onks<bz9[!: ?bk?n,q+?,v?'Ȫٿ?}_H.簿(ڿe~??K?>-=S>8?> S m%u=@ q%=?? N>yz ?it=~a>MM?Bf??bL?DS> HѾT>Rl>i?v=&~*=BL<c? s> z>#(l1v>\>^wz C?5_7?dB'U;?LJH U?2==ȩ?UP)?dA@a˿fPkl>0>^? >Bp>av?ܖfj?S=K,X ?] ?< ?! 31 @=b=o>GH=_vCX>9TyHJǂн=Nt?N$>!z<0@c=> =tHX>!:?Kc>s?v8>ȸ?X> >%r=LHWf=sPBEhU>pjg&eA?NYn>2y.>W?A?+=Ґ>>H>Ř@ }d?mT? zp=>erD>Kӿ:> ?ǙL>0=0?C>+> >>m>Nu?Ue?ؿ 6,M;ihNU*/ڜ>{SN>j?@C?">o?u=<\>vZr@V5c)uԾ޸A?a( n [ ? ھj?l?>F?[|S| >>Tg?D#>.?b?g{ME>ˤ@*=NTI=Rَ?|=Tӣ࿛=Կ>A?U*?*?7\?W4>4}w? *u>rP$? >?? ?$&\?D >֮><Ͼ =?A$St;sx>{E*&J??%>oK? =J>T?/J_L?[?T?i?H>h֤0lH$0X>,C?KG!{l %=ڽ qiH@?~kx? V?347 A>(?Mp??$4 SKj&.?&A>*t(?Foa?DpUy>ݔ+$>ԉښ'8P>?k?sY5Axf]r7žK?a??'d?.>2??wi5LAG:@=SH>>'=?jo>0^>m҉=?SIƿP1&>&??T3?¾D??4# ?>~>S??g7@?R<1?jq?Kjf?wI\?)b¬~*=ꀿH>?4>j*G@>4Խ^G>Q#90fb,.?>H??0yo>,>B?*S-u>gfsH4=<w5vK?J7J? V>6?X.? }?S8?>i=LԿjkl!<+>=L< ̟?$>?HL??,W>> ̷<侅Kf>t?|.M?@ÿٷR=т|\=La">!@?E=WM>!h6d?vlj<^ؼ? ?b]} |#.=) lN{<0aF>=LĒ֔8WX?5?b1e)2A^??>?tA?˲Կ?Xۿп34>Ef0ڿ=2}=oX?*mO=B󕿢~|4z[~>Yl>Z`<`4=񾹨?<)| l?c?$ν'=fx|?|@>>X:5J}{>#i>(?U4GJ ?tyۿ>Q>D=z>;}/Կm?ν8>?u,<>ug9O"^?:?]?f=Ga>>>#'4“T>m$>ij?!Wkt]RV?xʿP8@*?ϸ`Fi> =3]eT@?(!?{l>}@??a?'"濃t½>Ӛ^!>`Y(?/Jn4?$?D>=>Ҿp;RI/ WF:œD?L?|T/7=y>#>I >:^M?>>H=Nb'o= Z$WR?&>1ῑ +>.OXirA&?6z>?WyF̾E:>=flUk?=4?uA?'N+g@S=@ϴvfTkWj>?I i?>h?vſuM>/?$?r>|$?fڽ>#.x2>DY hpo?>ڦ o=MO@X|=n@> ?JGݿL=\\@> #>M5?O=->>,">^>N?Dh4+=K08gM?hw9?Dc?JiNpe^r5HbIM.I@ݿ\h?B?^B>?NW?'5e?m>݃7>8$Hz,?~ Χ?ul?X濿r}m?>2>7H >^*=H2,G?Q3??lrE ?J5( >0 =?] y@$D{:?Rj˾w>>?On?#i\>+=ѳ?ʀ?،? <? $* B?G?L?[꿉ӽs\M>WP?`>ɐІ=YwOtd83>Y\>|>@Y>BCgG>?x4βu?5?^C'~q,vƣ W>ݿwޤ>E*>?'<Ȓ5$?޽䏎=M?Bg>Y2࿤xv>=(>'⾨C>%Z? lvOVu>e0Ȓ>x?=,F>̉?ܿ??Md>Ⱦb F[Hp>H>z^p>]>$h=1?;8=(Gvvo<>?=7=??Fpm?W,ޥ>`:ؼh>>>æXW7R?!B>݋f?qB`ֽfXz?kR6?@>jοNQ>u?~+8?@?|L>1 *Eӿ~g?Qf?<<<Ӏ`}ܿ?cVm?>3w=>V^>2=~bпc#Il?>N?霾?b´6>Nz!q0|a?ྭ$:?*> r? Gt=C7BBi({BFB5eBCBxBJBiB@=BsBNBeBA!ZA&t‡6ƒjV(zB;ƻ9BBUׅA@$]BkjC k BdAp`|Ko`v b0?N$AeABъ!vB3BAXBXVBfeCB{lPƒ6XNB@Bd@6>?NGgbNBF]B&iA BS~BeM@%#BzJBrdBB#$Y˜*FhGCCtBrB0yAnŠSB<;@BBXBBjB+#@|BC%AB:CE>NBPF5Bc]CwBB܄BAAijBZ@B?B;BAABa}`A^ShCB•o7QFB&B!WB08BoAtBbB6C Bf<¥BtaIAA:$rTLBlەԠ>D07_›j ~XAiSzBBԼB)*[9!]W+±LBx2A\B²zGQ/¶nW$¿x²!D sAB%8@A|ˆ&B\­\ z)_4Xю[ <@PŠ›{m³\&ŸA³B¢&Aw$6@oIkLtµ”Ud- NBA=ѳ®2?F§fy=噳bp B2@ƒB*BSp" Ab>PGu AGBLȑTB!B]o"›­,6(Af}u@k.&B2A(A6 XT*!mr82rݩBHՒBg^RB3R\C)0B©Tˌב, 6.AvBBbTcABfAhA_ B$) p@7A{B:Bf B-B31BRаBBAEB;QBM|BίC8Bo)CBlB'BPC|@KhcϳAAXB7BA0dBuC BBBBZ BCAA0PBBw@15BBL#ABIB@ҡBV_D(FRBCBm@G8BmɛAFBn@B-?PC/[;AĴCC"A[BYpB1%nYBBOeCOAt1BZBa`BpBGH@K%cBֲBy`A(ȽB8|BlAJB`Am#nDڸA.l(@bIv-B,C ,CC(iBr:CBR%GBLAoXBBzBAD?ԠBBBxl@{BBqS`BT"B,n`BMIBAGYO+r~_A:|]B%A_\B-B'oBcM}B<.B\Bz+|z BBb?AC"C%B0'Cn Bs‚F8MYA#ITS496AWn31A)V B:hܨ©2.BhBA9B~Az BAW¢%BmR?fbB\By3BfB>@}0B.BBEB~C=B ~C*OB,+BAMEAŠ~}V8 CA{ʿ@4(C¨vl4H‘;qjA{A1BlC+B*AĻ2B|@P(|U78IBSBa@c'\ A.AAD"©º4BAL$Ⱥ&AzB2@B BMÄ́’46B#>3V@5OBxFBţN;]ŸNB|+RB{G9B5HSB~2BegB B12B{BRuvìB\ܼAm^Bt B C8BHt?!?=6>_&D?)Z?-}eD?ܾj~B\?K ^?ֽ>r?x#=0ؿ.5?r VOY!>g,>X\>[+> hX>9WQ/ֽ0=u>bh5up>?fB?ڸ>>OL?濬"?h> й>u@>ޘI?7(DsE\>`>%6?t>r?7$¾s' =a>ӟ?ה ?= ?@m J>"HG>q?6>MP> d?<N/>ٚ п%?ν̿?N?г>a?Y,.=֏]?(S>?ciTy?L?/(B:N >̾5?A:FB>b(=M>>>W*zP⠽Ձ>?԰`>'w>A?+*,^Ŀ'Z>.>|v?>NC#ϿF?L>;>j?ֲ?8>>9">d޾Ͽkph> >[>>bJNپjI€+nٽ^hi?Q?aJ >i^>Ѷ? "?}=?]<'d }N d?b*+(C7???̿9S=|W>=0>). f??64>uؿxw?#?I9>9K? ?"#vܴml͘A>"#?2@ڨ̺ؿm"=x!n?K,>?}#?/<?wp>& P>:>e>&cP?R:U?O¿.HM?ZB@Ķ4?*a>UJ?A)b\ Z>.?X<X> v?&_7>̖m?P׺n?>8WH?`??P鿺r@n= >vIJPꞿ{x>!դ?mB??Br>I ?*?5W?H*~V?F>оqI}@|30?$q>>??V="\)=D?>jB9G?k>VS3ZS\G={yĸ>g?!?=>V¿lz>ި2>D>տ&> >ش?f-p ??/ݽ8?"L?<=k>W?m?P_(xW =z>?OK>ݿ9S! Dî?R?5 =d x߽POO>??=k@ؾl\>DL??WL#kt:Nr4Ŀ;?%,0$O?Sj8[Ŝ?K>|_#V-_.=Nx>>|a?u>D K?('>+q>O1F?~5>ڼ>">ƶ>\r>YZ*Ѿl>Ð>xfm:O"?Gt͂ؿ1}.?X;l>Xf*e>O?xGGP>&k$nVH,D^X?J؅n?{Jb>8>?=M迒j8?&ڿ>{>X>Dv3>2}hH? @>w"<>e=]>G Ѧ? c >PҾ~p^L?6f?ƼH?W=9G>?>ڀ=\>?>H\>.!9 )==+z?E&vE ' >kP>EM?{N?3r?nk> ?jPPԎp>}K@whf>TXQ?>nrcg67??r?@>_  ?r>n>SU|?n> #>h$->3? V+h4G1=? >x@OS?w?N8`OnB?٘>g>`A>@>w |?i=Έ,=cD?4>eڙG*há'.?>4Q=<s[|<:t>->pO꛾+r`L5=0>^?_o:?#D>mq?Ŀzl*>~?M>ֺ?cʿ-L[6>Oʿ>mw?FM濇ɂɚ ?>lu'>l=Wqп2B>/? c?'jyvyڿZo^Q{iܼ?U>)n7{>DB?%?,?p=G?-# y>/>Y% ?O@uT>eQ?MZ<{>md@r~f0?a>b\G?T>$ľ-?nP>"t>A@MͿ 4?[_?.QkD)ֽk(N>b࿺ھξ¶,ݾ#BA?uH>Rc_ ?NyBp?׾`>V?cڦs=ܾ9?@ɨ!dfF=?:0?0b%?é?>HR|=z``?BWԽ(G+?b׿t~<ؿ?価çpK^>g:b?>ʮXq*ɰ>ПM?,4ߘ ?>տ;nb?ct{P便;TXt?:P>fŽ؀(s>"²>4q>?5>+x2? >3ٿp>iӾbgi> X>{0p˾ >?k ?Xu>Έ?#?IT, \?ek{?XξP&0Z>n"x>j?(]ĤR>;.>$v?)Ș>?k>"6=DT :AYu?O><7? nfnB=}6= ?Nv e>p<>3$=Tj>赍>p= /<>EB=T澂e]< 倾s޿[)?,?dҺə>tIJs? >y>p>=0]]>$?9NW>0J?|?a?ȿB1?s߾?3:>!n>d!=nwx>^ >j>?{?#<>aT5>>2^=Fe;7`FJx>?=2'Ȭ4?,i%.ܾs𦿇YᄇB$VP=#8T߭DȾzH>P?a?&L%?e,?8?1$?dӿ-?T?lk|xbI?x5>@ ?F׽H>$?Zo?e(a>">ٶ/ſGtCE[?2l[;=}Y>>NU:g>=>A?65̿:?Sܘ>`?'z^?cC?')??I@ ?]dS!D*,,x?o̿I<-r?J>7?R?X8?9ⅿ%$ k>{? ?hH?2>é=<>C׋>B*ϼ?ZAپh=HξY&p?t0Ͽ?' ?H,t0e>V]>3M??>ly>,N[(/.6/@g ? "۔ھ 2=; >.#->fN=c?>>y?-/>u#<>;&ާxI4wB?Jw?{>3=b8? >c=8;?&G?$g%W>Jɰ?c}ѿ .Կ 7Vf>5dؿ?>Sſk>X>?,W?eXO?-dAW>R>?р?SV=J>ׂ::t?2>>slᆵTпMu-[>U!=_?2ue?{`>c?ex^?en<V>ʾS|,?=!?'?\ ֺοh=e;m>KْnYy<?uA?Y?'?\??>Ȑ_>[=9T?vBNX?%P>Q>yc<\ʇ?Y_;^>>l p2=H??IǺ>C?`F19O >/PwtP>V?>Z6T3>GB?@<6pz>??7>c?O>^ =]>i=C>ZJWi6-~v>*G'搿e+ri?LP=?5S?). N?d29$2>??z)M#sG\F?ҿz{W?Kr2>H-?F*{z˾$H=N̼H>~ u?fG.xr !?~?*x־ؿ4=?LCH߿ 9?E>4v?K?Z侞= jnX}>H$ f>n<H?$>zKS>hPF^?'?Z>h? z<^>Yv?(^,^>d9?=l`m?^n'\?6 ?,U<>?~dg$>b{?Iv^S=ʼ?ې?'c`=oZ>f>NcDV?A(b?ko~?}/?sam.t> Pڿ,i?=e?,3!?Mz{]>D?_  ?jBt'!1p=?7>r?>/? K\>8(>퇕?~H?ꤾك)?F?7|v?u> W?p????>+\>@?<">XX9?!b]ܨ׉l? R6]-v>f?^B?Vfà?F\̲?lh?UՄ?9&Q> >B>=g>>q|vsq>?)b?HJ>?^&`B=:p?9((ǯ>Γ J= 2c|>'sy)>u_ꉾ2>"?mb?2?Do4/. >٦@d0>W}g?}O>fZ@%>42?80a$[L^7>4?q?9>G)>ŏ;Uat?VP>9~>0*j\?UHW.0~>Ss??ξҸn>? $?xz߿?OνFg 0>>\=e>^6?r>1=n^{P?-Կ'뾷|W>axiRؿcP< PV?4?@?}?4?)??=MH:>=ߙ<ވP*^`=JY?j?i>΢|?/=G ~=+rO%3!> >!Mlپ?CnBE}?{kmq᏿!g>u?c?/z?9e?LX?{??#=F>/>A ?0N>~?N6?9O?>ax>{$ ?g,v;~14@?N??޿yJÿDTt4>>.N>W?9r"9B%>¿F>>{YJ\?=? D>`;:X⾱zJ >?9|(Ƃ>E/?b?Gh??ZpA??>]>g< >V?Y?ZY?2aq?d.Խ^s?e!ؿ?Ca?=~~>N?=Ff5P>q>f'?,9H(^?%0?>@>>')8zϿ am?fbHYH?v>[??Yx諮>ps?A:=*#ѾR@=M>Bk>#6%V>?=J-N?O'=11"?X?޿5O)ʿHsp>~3H>C:?r>$?Ev0>RA}W>݋E*DXk >01=P ,.?!oC?Q=7?Ͼy QDX?/$?Rt?KyS? ƕ?k~J4>D+о>wR?>Fo>n>d;f$?$;Z>>?g@?cpq*ؖ޾z Ŗ?? @?8??bx?W[>?>?Dg=J>faf>ő%邽ۼXibw=p?~/?g6Z&?oD>D>f?aO|_>45Z>F8E`Zy?+?:glT>>y2>h?20a*wh@U<>k)>tⰽ4=?=>?Φ?~CdgF>7.h=gK>]i>v?FF?\<0?/?6=?G\?w%?>'Zv@:J?,? +?Un(|SW?pKaF@?"H?ڴ> ?Rr(7U־Ӛ!=jd`>z??, >;οX j>n?&>Z=v'>y?U8h/e>c)?c?Z>}*0, S\=.\>_Z?j=&@qb?n.>sV'^?rl E>6Dy??&0̌?@/??><#a @FHQ>g>(>oD]B?0> K>Rn=?Gپ%>ۏP2?nX_; u?/l?ԏ?=b;E? l?W?AV ?g?W>??[1?`?ڿf>1@B!?ZA6\ՃB>BD2·0ߓ5‹zyZ".x A2|BDB%PAi6B$;dB#\wº@@hBnB/K@{]$@,=ɮRx>M66FBI‚@0amA%v$Af<‰BC>i~.A² auŠt:Š"^ ‘Y¬+B{BA]BSB(lBXB26B PBBKɜ@nRPBd '}2B@A.ASBUȿ1A>7LBBn¤uŠA*(B?A^tu ‡|}BkAo0@" N4 B<2BIXŒ %A8@?A| =;¢2BNlǭEƴ%Ps¤ 7@W[qBV¦K7B6@x3G– ?QAnX¢A£\A jB\@w&L~f1EDBAjJgjQ͵ ՗ݚE‰/AaBl46r f`f"`‰/݀SV)1/J>B{­nLB:@N@TTBX@ABB]8DBwI*AQBYPJ@B!s|Bw ;9fAg,7Av G '¯B B¹AL?Ch@1A^¨V)U@@T^VB«f;—tBoB,»$$b2 =B%EAg}Z9B7B/QŜABV:B'ZC**B7B-DA0P(A4¢"BiHƒBAz@ (@ДBo .‚B856 D·fq}~ B%LAVwvb7"ABG`BUB&L^E:KB‚)d=BBiOB?oIBzK5BBB]ߘCAվ ?BhIIB*C(OA2&.C)5P@z:rkBv*BVW{BsGAbBfBX`qBzBǿlsB6B ^BrA?B BB/V?WBPBCDBOB BqB: B11'P'@ܕ B;+BBoBWB>BBBD!LBB4BBx=Bn BBCBCBIBB).B*C#2XB IBPArBBIA$B4ACC}PB#C*"BǕ[(BǺA\C(T:BB.CBjB|/tn1)¦ϱB*“|_ C_ĒBV-TAAAA/ :N2@Ǵ¿BJɄBA,LB;A\DhAd\'KB *BXvA:AfaF.PB&7BWBAO)RC m@2BFANB6/A@IgŸ͒»C"BB8B#ТuGhk ¶1Ho·=aAh®$冽A]BBs_ BGBl-BNBBA.e8h‡v<@"BH9BB >uBBœd A0L\0&lơˆRB%}vAKBa´N@w |R!A`#¢&$" B(—@B'k%JE5:$°-a`.}/&J#J«Le1?š6¬̀tk\\A°« ¯^9r”xY7›A•m­R?AbkBx:BUB0FBy =_\A{;ºB\R B6bA=atAkul AP7BXĊ@BBct$B8hByMAqB%Ar&:@–_A(BBFBfBqA2}Bq8B"@BVB^BtJ¼J!B4BBbB{ A/ǃB%BBCBK[B$A>AX3bA{BA%u2BD)ŒUEtB -8Aײ7B'[wLAB/(AzϛBt XBizA}C6BqB}B4}B<B*{CB?gBCŠBBG` CB{^COADЗHԘBMBgzB~>ĖLha"t@>D>tP>kG@2=t>z$>ta+>̿ ෾t17?[λ=8? =G?X4Wy\>)?ݞN\K*\?7LM<>?Wb>??M ^YD!T>K.@ Wk=迨?hnο>qܚ$6 `>Kƾ|!?9~ ?oD.T?>?Y?7?SYH>Ey:0=>l^?G?CE+ 8mQ9vsԾھ:VښI-];ɿ`V ?m/o?_w%[?!?5?#>8?`J?H᧿E?㻾%jN~g?A6t?Oi>ʡ?WϢ(bUYJ1(?oZT!BCQB>}?ft>T'>Ͽwi?:6=Q ?iý,>R?FO2m 7ogԞw6?2:G>):?qoBIa>,>inr?eڿmݿ$?L>==`d;&?fڀ>?JȜ?f>A־.?<=˿[@=8p?mq]l>볶>*+>>6?'@=ؿSDUFNz徤dY>l$?C?^O>Z>8G??3R*'?亾7[ľ8? Ǟ3> >M>WĨt?C4?^' ?Uȿ((?>.p=?YN@>Z\??9Li`Yp)?06~~>?M_=މ>Hy?wّ\?->2!q>X?!wѿMO> ?+0?OI2z >U M+E>z>>Znz'P,޾-Ib>ft闽?瑾s>|_?2ze7.iUb?mܾ>TܴE<Ɲ ?8?Y=b' ?M|>>> >.>ܾZjP˿Gt=3PFwH]*?>j%?7?~c=2Ŀ/K?:t>A>)>ܿ/ >V̿qɼމGh>\=>?o ?>ͼ>ܾnMt>??5;dE>qYN>l?4~(n:?pq*< >Sh?zN$=H?S{|!@ ҽ;q LM?[[=*> ſハo->Q $߿`(~Qeb>;ZMX0Ͼͅ=KV7=ʹ>?D@??֯=:n> >'~ꩿ x>= .zp=n ?0LBG?>?t? K*?(R=,R??AaLӾG> mнv?U*/v= C?$?{|P=*I3@:6꺊?`4^{j?08>/x? >.0?\?Cu=0?oڽ_L S >B@?*>>S?A?޿ $]@>֛6(,?6~HJ?>=/=%`X>LPxe?^?qsv>$?9O>Z>-!@&?Z.>/&ux2@?:"Rɗ¿?S :>->͏YA$*?:?QFr? ?h?MW?J;iPP>A'?3.XʾQ <Pt<@? ?}z?!yp?>f?B}bZ03"j}ѽW>H#оd=A??$Xֻ=:> ?هA=y4=̿?A@ӰD]>2:K:P?ꄾZѿk ^>h8Sp/2.ft>Q?bq>(]?p?v>㩕>ѱ?T$?4muz?q2=!> (@%P?OÄо]$t????m>e1J= !W? DmKؾuQ>hPjM>= @??<"$?>d?L\2>wl>=`w#F>' ?OpN*A}l+$=r;?/=(> K=* >3ǿh>?>lXI>0>?s~ X>;ľ?>Я?\7>P>Q>x?C?(EG??9.1 h侵?0?y=w=mc PٶԿ>k3=HQ?NS? 0?&4=Wm&?L|d?CW>3(n.,b $l?Ў>:>Ő࿛-v>3?2?@S?<<0]>?ZOkg6>οO| L>k?_oLο ` R}?!0B2>Z> E>?=m?=Iy|>瑏ھt?>?*R@?9?=D&x>3?Og*291^`H[?M>:<=)P@?6?Z "?GEc7?j?^(?Ǟ?x;>9o|h}>ၾN=x? ?0>`?lyZҿj t<1}ܾ̒c>D?=[P>^& H\?'R>W?`gH?`>{a?fm:4#h笿ox jNw>̽?brh&x͸?J>l>B9悿E`ܿ.)HxA@ ܌>h>;>9wP=?y?*n?'R:6,?B*=זM<>v>,M W>`8?D]>#ݾװϾIu,Z> ;? 6?v<f>=j?c>Z>?h>QU>Dn~03>+c> 2=B?*>1?rj4>p`?Fu?!TM=L6H?*?Hﰿ,-=6:8?[+> ?\?Ne?D?~@>.= l^jn?5>H޿,̿K?b# ?T1OU?]@-d>> f???t"?yPO?qԿ>݄W>H?xbI?4=ҋ=>W>߿^ ?XpbX=|{l? 7>Lr? z6THJTWXn:?zt=u?U>e?vŚ%?qSp?d&$>sx>+3\NX>a=¿ӾLc?#oĶ+??+?]>vf6ɿA&>*,u>Z>M=}Rѽ|֎<|6>=օ=H>5L>?\?=5v>//bLq)d>d?˧̃='?56\?2=j;>C⼄㸿ʓ7oS{C8?&)"6R^> ?d=?5>Rᅨj?Y>zտ" ˶?%|>QYG%Y?m?#lL"!UX:~=!x?WA)B,>F ⿗Ȕ=o>z>?M? c?6m`˿g??I=ϝ |?BT+a>??1v=Oj}H>>9"_%X2uḞ ,? ##5TN>5@W?"?g?D{ʿ@Nh>K>lkz?QFV?sbR>Z?,Կ(=%?Ds~;wrLv??JG?]h>C)???4Aƿ=P>Vz / Oqy?Ⱦ]?7@T@c> [>?)>:YN>lLÿ/C>򾅱>*ӿ#<?Nm?>[?J&޻?-L?8eICrdHDֿ6?c Uv->Q>zYN}(!M.>=?R?於t?hؾB`=>%?*n=gp?.2u.?&?;u\>|be_;#`hota>V?p>2Z>;?{? 'N54?<d΅>]>z$?zJ ?\꠿RS̾B?DT5O>+>(0<?L`,>AdR??&>ֽ?ҿ4B>P? !H21= ࿕ՀE4ü|m?>+>4_#j2? >>??r0T?r>hQ}>.>l? Iw?A>p?>)}>!?v(?Vľ1t?H?8]>5>Q>R2܇?,KS< G? ??5.>?f>Z FiC+E?P? 瀿N?=>Y>+6lW<<)p?yaУQc> >#?=0[?USFRȾ ̿$?[}B>ŝ*I^z  (оOϡ4=?,>;?6k꠾ ս Z$6>fbd1Ͼ='@ ?Կʽ?K?>>X=佔T?#Z(>>.C>ZyR?<$ȼQ0>jb=>WG>mT缈<?.ݹe>`L_G^;?bߚ8>N_@=?7ʿa? V?*??b== xV>XJЋ9Կ=4~S^?`(>?j?o>>yž9=X(|;>V?QUO?1f[>>i#?+?S#߿i1ʿ V#j?Ҿe$\쿚8=ۍ>G/^?Ͼ>v0=䗮t85>H9aI-?gſc>U=?sZ?$?Q|i>cT>|? z3ſ8? N>B>^t>ؾ5>⥔7?B/_lp?/?4꾐t_n=:?7n @?R?y?2=. >f=b;ҩB&>J?>/VO{>4E 0>f{t>?xN心 ?Ɗ?yt>s>AJ>b.q?F>6I.>zid ䷽f>~>axN Bp.?TEJ?(>?f x?Lp?ÿx?=t=9:0j>p4PUɞ>ѻ!H=Uä=N>?|8rpe֋? ?l >S=%?e@Ւ?>Ǣx0Liu m'>cl>?o`\NPl2x[9u­>>%T>马>e=x>?PZ˜C pL>Ӆ=㳹>¿S꿄 w3Dan$ ?Tl>}V>>R`b>?K>ou>V>hB]Ҿڿ7VlLv=+z?1Q?^GFȅO8#_?=0>XLp&-Q02>ǾPT>^>ľ`Z*+оBWO樾󃻿_ rNA ?B?5?<>:?^>?PDz?`?>;@ F1h>m?9y??Gy>{q0S4=f"dq?)y!1?Y,7Ky=H8.p=WoA{>t}?f?H>H=|?L>ц?pEjlS=Q?m=? O?*>e?ؿXz ᆲjZ>*? >T?0M>ꧾ=? )?i츾:cL>4j'l ?H6"1پ3+?:fCP? $?u?ԃ>࿳{K?KRvR??#hо׬οQ̓B?r<<нRB|vqOҁ=? >M꾔e>ߛ?ȿ>r?6tg?]?@>|>o?5?bj#Nuڿί׾FP>˱?+???YPl>Ɯy>?xu>WE=ΰnA='Bx=괆!1??70?fT?Y/r?>"%HRri ??IB?Ƽ@:p?h?Z>n0?o\Rb?{g,?_0+?pʏ2/ at?H.~? 5\~? =p>,r<=$7>Ͽ6?&^J#>?S?]aT?%޼=Zp?5Gu?+oub<<"zqtv:m>V1>@mYN?Gl=>ZvD R鍾2s>^^?ۃ|*$x"d?!=? ?ag?=vAt>ĿM>??@4F>O<-\w@Cd?"⾿;|?UqG龖?v )=< =頿5xN`2<>Iڦ>]>D𿂅DP??s]>WkԿL=8Bg>lBBBNm0"O-0BE3BfM&BO@f1>sƘ°Q31B#T@-CA B%B A?u/B'VBB 2B^oRBB\B`]BɝBBȦBHBf?BdCvADZAnBCWSCV(0(KB`B(.B@3AgW@JApmAAOAv¼AQY A>BAz B)B|CUBAB$BByC-ICp@Bo`C0BC C1*CDBe\n@(BڑhB {AHA}BG C2;VBDܔFkB}C3LBAUBDB>4BEtB dB&UʀA7 qBtm@%YBB„A!A@nB:+\"ZALF¸ZCAnwAV.dCW BC0BPAJcGB}Bl kCB+$B0B4q^B^WBAǡBoKB]A-kWdpABBv4Bv@Y>B@ mBGqB`A%G?yBQAZ0 c9^*aRBOEA,=BjAD~A:X\B*C AAh¨{BAQB"B ,AcBJQAf&=+pv&dPi°a„A^mĩ9R<+?I0kAlAwa†ŠRz°MWZBCs:fB&@*pD4yɻA) A-Ap/ª[&~.OCSAztA>¯x>%{jŒ^AµxA?:p¥@}*B> AAj! 0B=G£A@TŽ›6HOnTQ8c‹y,AӏuQ¸j])BhºemB0] B\BCB:KA{„$UAu)B'A<=c@nay1;&9 A"eLI}W<`AyB/sԯ @?O|0fD A B'D>BVA7CCBݢ/pBV{B^)B1vB?'B BV™m_@/A{ABs\[ %BOA&ZAwZRApBzBepADBqA1@\BA`|B@-CL#BeBRB(ZCuBߴ"CJBvB2ԦZ4CA (&BxABPVB? B[?|AaB QzBdABsAټBB߷C .BȬCuqBgB|qAB3uB3EBB6($€ph25mAYABVB /,<AkBV^pB'}BrdNBGB_BBNC'J|BBSJZAkkEƧ¶"BA3BNBABjA@$BdBE[B\eAuZ)D@…X/Fu ʾP@3-;b?‰2 )bn-6q6؜¾!άh(˜g@„\?̡S(I8(+ ǖרtBEBuaI {B ¾$eƂyJߒhJGKHA; B·{B jBcnB}B½AA¥rB⟮¨LANOŠw @ΕB)BgV`CCU£ռ'<›gEAc-dM8q˜ (B[qA"0-B5}3,NM`JB B=dLAlvACzBhBxBu8AkyA݀B+ @ׂ?HY/N/@CBl\}B*s9B,^B9A/UBɔ&AbAF^BH L*cS ƒABBr‹72ؘ@/B#6͋AuB` a-L'E*¶2ˆS±>! A*cOy71©ޫ:@GA\!BTABBGP2E:@BÚBKmB{AќA. 0-·^uAŠBtT9k] x_€/<_#A/l*B[<’BA!)B`ɪBe`vA4AjA>BP}||½Y8]BzA|HxFI’4lf?)%Œ߀1?yk> = ;ND >RV& |cp>!?ծ? L>=>o8=??l?C???ZKhKR?J@@L`>?APTIX?[9?(j8UlX=y>,ҟ1[T 09>l|XH?ļ">>ʊ>\ο$>.?!? ?C2Ⱥ6HNOBx >q.?f?B@YF$p?>>V3V`>n>?Qξhy>?m>)d< ?hW>C=Lp1y ۊ="?]H>O>Ҍ?PJ(>h¿=>l+SF/s@ kɠ?>񠏿ޓ?Zz>;ahο.P?žU?9=>># f[{%&`>?S ?D&V->="AlTٿ ٺ>n`=ܤ߽{?g˿Y3p>ˑF>i_?eOU(a ??4E ?>(i6:T@(zI>`x>?Ih*O>-1?rྋd=4ƾQ_8|?T9\+?NS?^̿iҡ>>̋4?hi>\? 8$<Ԕؿ 9>h?<;?a~8 n4cr|>=]6f>h>,ul>?GDȿgR?m:,"?i?>ŧOݽ)> Dzy&=>ޏ??6>E<[>`=?>>O>֌oA2I?pvZ6> H4F ?Y߿"ǒ>Tx: X3dB!>n=l?8 CJ0 >v? ^>W">+?Ǿt>F`jRr >Ӹm=mo0>A|V?R B?㯿n?6j>K?w?%կ4,=8pQecV?]+:>rL?㾬e_6B _?b4=m>9f=[<|?gfZ>oP祾ް?YOc>NEp?yI)R?> >Z??Kcu@p=H>B\=$Pgſ>¿2۾M?H#?O@?'OؾP>^Uv[??Ҧ>Jdh?f[}=qǨ:?>ۈ3MJcF ~^>p3>>܈>N>>) {=(H/b>i?E>ä?i1?oaٿL+>(>.w? v8S>??!#=Y( ,H꿹 \SD<5&R>[)?d?X>=D𾛱> rI@4a,HJ>SqW?)>{?g:?=(?>__:ShQ /q>>.Eg\>a? ~)=}z??ؿ>!H|? ?h!~?]?U? w=R?%h?Qhy>t?>5@?+@> ?8? V?(I1C>>Sel S>J? ß9q>dN?Ү־8> cl?.-?og?ЂYJ>64%b?**>?*u<`Űxxn+=?&>>5<8$?*?<֝%$  )N_'dt?˷?[K,OQNS?8??(E?SQ6!bB4h?:>}>W?6>/a??K^i>+?:',։ڿ&3Ob?iC??I ?22>w |>_=~??z_?Sa?|"wa>?пnX.?)?=ڽ_ >-?vl6=lVkd|f?^2>i%>ue?=paJp޿I?I?V2?>^ $?`iRQ>V>7Ȇ>~=1|_FFo)K8VuG/9񑴾ORC>a!=l??%ſ.$,W?2d>V:u?$=jl7O??tXпaw>dy>~>f9Y?)>T*pypa?º&"@ʿ?=>]%-?.ۿ6\O5:jHlD>oj?i=5)=c8愿Um<˿?ٝ>(`ی%;:+?uľYJ?v>N"?'5 >>i>w?=ʾ9G`}>s,lA>>g0=ɔ<>Z?_Djܿ?1zG=u>Za \Å kF?'>Y0?{J/㿄쾘q@b>S=KLTNw ,8h U5.?gyܿ(5@>b׾T?-?8=L?1.wȾِw+޻=h?j&cB=䖿m OCR>)m9=nY&>z=?ܩ¾$=PGq?>zWH]?;y {5?Zp=&B۾ټ>3>.?^Ň>?t\>!닿]r]V?7 O=ެ p6blE^DA\z>'"?m%?5?+??Z3|<0&ѭU>N>?G>?aX5Wp>&>Ȯ ?-5>M;~?E5aNQh[=NY0,`O?>{wUp?qbο9?k8< ??\> b<{>䕾¿bw? $?o]B:*)rf8:ڎ`ğ?ht9>oe qyS>ٿ>4P`h>DL?s\>;>$?j?5mg-ڽ;Œ?Doz@ݱ|uɿygr1<ݪ^>>?= ĿNZ]? Np&>?z??rb= x?"+뺂?g*">.ÿ M8 >.,+F>Pi2f=ft`nM+k@?a(T7??6߾,">V?L=`|be\ >c?|C=z=c>l<;n&v⾮S?!dފ%>>>h{#?4_ZԿA?'|(?gg?XXrއS6OL4>? (>ٶ?a/Ba>q'g>۾3D>%> >6>Xi>ݽ~>y?X>܈?Pb`p<<?z'E>=?RT>Q$=z J>pd>Xҿj'<p?L3ѽ@\=t+0?33TV@ >5 Wο* {S?VZ >sOb?2â q0? 9>1+P+ѿ4?[W?2a̦c-ۤ?`4!?3>fo>>]@X=)=7p?}2i̿%?94?I? sB?-F>Ch$]a>>?{d ?~-4*ҿJqYpyhC%6>xL!"?T?1zF?>譠%=|?~)F?or`v"&7 yhدf?VaH>O~Zx´=̊8al^޾?PF?v ?' ?J#>uJ䖾>?_1_uɽoXH[k p=L|y>%;J?G0?? ~Y?[?K?(>?%lqdB??5?v>G?a>r?h=rNH>v>oDξdqG5n<>>- ?5 n>ٲ>pX>^>?1@>%D=?>P=1=<:́Ҿ??K>p(>[J$(?=冕?_HE>-/C?V?xżr?O ?S= (?>wc?9X"ܰ9Zþc%ok辽ķ*h ehRH?J"5r=܌=T ?r<8 ^N??VE۾F?6B> ~>bF=&=x8Ƃʄ?g ?,6?b>Or>>r^?m`?ƈ*Xw?M /?$>>`? ;ֿ_>ę5򽰚P4\=u>"`1h ^0(J??,>s|e?Ak >Z]=p7>k$=[׿0>c,>*6>T[G$N?D}df>t>?c>>6=v>pM=T> Oᅦ>ˈ8>r Rȉ?@~?>?>??T>S gN=/L?Q">>|LҊ}?*?-Rs? K?(f? >!0>bƿ!>r?70? C>"э =)뤠>_~=f?J\>H1x?|?.`+?h8Ҿ ;=>ؕ-??墿,,3:>԰?'YOƽM?,h?>j?whώ>?o[gQ>?7) R>_?I>M4>X|=^?N>ٽ=>=C8_T>zgc(Խ,>,>̼P?>U?-9ֽۊH/6?Kп<9`???HC?J^?O??xֿ%8lOҾ`>B1A1O>HI?>>+>*|NnbqEOU\cD*оB?.sHUz>փ?1|P>O?>x= ?l=?Jʾ.V> K־> ɕ>pj? V?v1? +>mT<5~ ?0ܽU?d>{O}?='ܾ,?:X88tt=\>f?xx?2?aQm8?&X?A Rfk>S ?X.uc,q [?q:?*E]M>*?dy(?($?0+?.>=,h?ξSȑD>?a[jM>½?#?š>_?%>7c>HYľn*^.U3}?@">a0+1e}>f?b>0)=a?Fab>β?1?Qk.~|?N@! ->mC >_h^=,>Aܶ6^>/"?+8j8n=|O>~??!Bi?^?'>/ >>|9׿K?$?6s>+%zU?=«?wZ<@??@?W2?w-0A>2.ֻG@?O7?Bd?+پ촿)/G>,>1ӿ3> >J>f4=/=!qy;(K꾥y?y,>><`?D6?>-֟ds>X6 k=k'$>X?>?X@=q>Ŀoa =i???ofݿ$N>PFցʾ@7۰N>PG=>b>+&=?_?g'2>Ӥ>ZQK6X^CȾi<7?>in>" 9~;H>3@>>t>pr>~?&>b?:g?oY?4=Jr?%`=Q>x,p=|r]  @ܽ2qn>!?)v>E>1? К:o)>DZ0,>%4?+C??thb&>X{x ܔ$ ak(>? \>N:>h h%>h`m>?lQ>[=eV<>r<>^;SDDF>?Vx7=i?xX=bпG|>k?~vt-˯7iˈo>?O&z=ͽ@r>D:?q%?Ȉܻ&0Y! ?ʿ0Y?̾|Pj%x?آ ?N?K<;pUK^?xa%@>z?,Dľk ~=&]*M> :?-DQJD>Mᾨy?6龮LǑƾ>׿3?5>l?AYn?gnY>>#iUL?D>]?s8:Xr˵1N=>D?>3?C?T`>>F= >:>>!>b(?|>[򇻈@>@;4?="辯)Og>I?]?'鿇f= `=Bv/# p-O>4^?n3ῼal> ?FF!=Ͼ˟??~?_>N?> l>\?MW?>?2,>\?+?>l?S2DpzK.>$>L>̿?-> >=E>qW?'^ڹ>=Vؿε>>n|#0 ,>?Rf>I?ڑhΑh .?#|K>-t??f͵?d~<@Jp?!}>3><;>8>7.Z?>UxR@%׵7|?y=>5 >s?kt_eZ>0Oƿp>?6/8>2? ?aO爾Ч~f_>a۾b֢v`?D=R !=пl?3 ?!= >ھB,¾-Z :ޙP?W?HY6>\?UX?~>FO>Ⱦ^MU@)6վ?,5>6!w~0?+>&\?+ir?S?=H4<?X0f>*Ngr,>?WT,t> >Y.?R"\`H?+?W$>Aպ< >M:_sy7X>Nu• ¤Vٴ!@:+["lŽnј¢·BS+Ȉ¬RJA-X^Œg„+pd{ƒl”*t[BPAwDš“sºƞ\&6B:2šx,*.¶װAZ-"BnE@R…EAևeEmzg)~–y;Q “I{ZA[OͩMrBXΔNZAW b9K™HyY۴™[K">gA5BՀrAOVAh@B+A+AZA޺>Q&n,+ /BsBR~j[ }ºˆAbBQ}; 4nKxBUA++BTrX4BM8AKŸ ˜#=AMDBPTB^BrqAUA=ATC*VBkhbN@VAi6¢`9XAXʋE Ž!T‹!@B XNBwǿJ"$A*@w7¬{<1Ւ ;G@BF‚i‰“3*BE RB:[6BPA>DBi`B0BͯBaA cBǷ>AzQB;A\)%CKBsB B3AܠB:/BBP B@A t Bn)'OBLP A^?VA?;Am(xA)?/A+a A7EB\$bjgC :BZ2A*z@VXAuA?.Bt~%šzM|n^Ac*CuLJ¨Z^@V&~͠iX@ LYA߃„P¾y¶64'·ifFM]zBoABcbA]@dS!QxKg!+ėNY] ˜1lFμ(vABBB[ל*¸^A 2“ O)BG7€~+/7j“˹^WVBBA<"0BL"% T‡(%[l&QAp:BHS>*@1"@mia¡U¯>)AARB7$})N`vlQJˮ'›@Xd89s&jOt<–WZÆ(l"?GV_xb™"VM!h()T9Jō n W^Ê)̀~oB`AjzkB[B'A2A.6A-x©AB"hBnAզB)YB=AhJBB.BQA4nPAIA@$B]DNg°x‰ȒA5µ zv§\C7‹o2¼\/Aհ·~@בv&Zc‚Pb6zŒƞ“U`|@YžWAΗCB&ADŽB β?EBmH~’Z`.•@٧B!2AK?趠@KyMvtB2?ڎB=%s_X5AB?Q<§V5]]^)!_.',џf=<:{B_Ö̈́UBaY™!—Vº> r(^•0Rv8O´eqzrY1,l¶¦«xOy‡,A\uB!m€n†ez>BA%A:*h C AXAMۏz 6@z&B]@BC W7ZB"BBSBD(ZzcbBBmBPB }BK#POSBB:B/B.JtB@$B+۶DC i,B,[ M@@Ah—MYA&=P$ AVA#PXA_®{1cr„# B(ZAoy?oAuTrB6-¨RBDB0 @ª>ƒA@8v [%@%Aj[$41T_.WЋAVy€F}¶9§/g ·jS<¥%ӂc V &AŽ@8@'=h4w@A[gS]gJƒ׾`o [gˆvo :l)¦BF[D@தS76-sP@H±_A\EN-sj;ˆL,ѫvPnk&3G@SžrPM~ܣ %x†!Z P0[³-O-]Bup-)|„~ IAA&Ay>w=,H7¹q:šB&*@ttA%6HkewABªB \A]B#"§z5kr܌錅BAAdB8B-WAhAYL@?BF(8x:$BwB mB8yAᲛ?LEBA BU@vBB*If@%~lۜ6BX<­ը „v!*{FlR• ʆ$L„sWdЖ¨,nY(A'LjU 0µ.ž+cAVDuksia&C8Š,q "£DRؼz'BjY r7xC ‰qjMzH>GhB8s$A H&Q{AD’uAu=O&R&7?S"5>=d 0?0%QJ?7>?f`>?'e0??n4&z?kZK1)>>({Y?a ">+?&?Of4o޿|e?h_'?!>|>Z>q@?V0H>>L?t&?Nv[=39g>wJ4,;QD?@:]?;4U>Sut$d?b#>>tоՎmq>D?)꽋j?v|O=M>]zu>"M??>h?T7ن?0\cN>k>v <`>5$???>}|!>ƯaJƞ>>?Cê?!Nj<8>>)6>vjuݿtܾ>F>Ts#B??Td>gm=<>O=>>NpcD>pY>]6>ތP݌>? ?Nn>>>{H?%6~>ff?<@~I3"?A{οjg?t ?B-/=>>c<=cL?b;q?f?J>?gb==? =_p>$j?tnn>88?&t2(}<{=/h>N>F?=<,>=B>b>d?RFpn<\j6?R?;*?)o? /?WB?n=̨T|?6>9W 难Ԧ>Ŀ՘0=ƾ?Ai>#:=?I dz?p 0v ?==?@!꽎̽>?2r*eqvZ??x??o>7*>?=x>?ydLP?ۙ ?yF>A] =󾈖?̙?;3?7X?m{!^>A[8|DoW쿺l=Q|&g?ƤM"V?x7>ӆ?8Dƿu/?#'?s>{ z?ïx>!?Ԛ g}>M}¾[| > LR)|Ex?.ֿ]Oad>7`M>=a3J ??> Ͽ^>l;S? Խ6?~?Vf?+~?mL>>65 Y>O? f?w?C~?& L"6,52b,>9?䗦:!l??7}뾻֒? IN-?c?7=4>b;IK⿒8ſml(e= >P,ؖ?M9=?h?U>| ?g&OG>k?+ k>6Kf?c?jdj>-=np?;>̕>>94 d| ?D m<>Ծ,7q$ƙg(>?oҿoD=}FX>jj>;@??GU?4FU:\«{I;> | ۴4fsJ? <'@>??sk?6c?=N?kٓzL7qڼief?ah?@e">p??O?b/м0p>`lD?辔eֿn>,p=5k}?ܡ■r0r&" ? ~UP?. #O\.&_T??>v>?'PD>x0@?,>ް?za95Ç7j5q>|r?t(?[?UP?V>j?I??]?l?@G-? ު>9zntgvqjnJRϾ >s|t>c楬f D??`??>A?x?ٸ?$?.0"u7?'('>݂??z9=P?t $>> ^>"&>?x=\?wnS?d4y>oSⅸ=D^;S\4C??f>$z?;>cN?,?hud?W?NC?RG5?'}^\>??޽ڎ?\~CK y="@?uˢ=> >P~>ߴ{>p>s~@=@7(?-(>14?WX>inh? >*t>Tc>X{ >?+6 }*>>?ϼ<^H=?*Aƾblz?كV(_Gf?G&>ٓ?=eI->Ohj>d> k.>>j=te@?=>7>-*>7p==k?pd>!nɿF}5 ??]?(tT2,,?.`>$?plRLl>>\w>= 3Ⱦ?F|CaH ?`@c?"rR?"h?",S,]C˾C3?Wtֿ?{1?b%>x.>d=Kֿ `&l>ސe=?5%ս>G>j>Ϯ=>2? F\>}) ur? X3>/.{ƿծ>6=>>kO=e>&?^8>#>ij ~?>E)t?7|?#>%Y:??~?DdV%ь?m>B?]>>reM\"?'V <=̿k=N>Y>^*J@>ȂȾcM꽪'X?>w1>̃ >AiR;>a߿]g龾}?򲿛n>Bur>DVB ,?l>/\\o?2 Xkr<7>=djV>OC>!>x?#??^D?>fr??c>!snǸ?>¿Cmb礿"%>C?sG?h yWlhi?;+?0܊C>Qn?y;[>? ̿r)9o{&?U@P@½BlK>u5ۿ ?J^>T?"I?=nd?UD?}?>ho?U3>o?AV?ᄑ=@?bE?kܿl2??Ĵ>Ht>(?&#Jg4弿:B@€oP&^=>?R>*Y=^:?JHX?>uc@Q>*?*r"ѿj *?@bǾdb?,R ?+?w>??":.Fy???AR R⿋>>N? m>k?C>3K?k4` #>^*ZE?$V?6P?.>8¿>|؜??N>ں?(ε?f rhBtRd":?:tο|>{*_˿u> bn'p??,>B}>"?Կ}߿LX}E7 9xF>>b?9>\?җ?[8ܴB>:>4>(&$ٌ>J?k>?m?\0>P@=`|ʾE?^e>CX]/H?4Z N?%(2>?4"T?Kξ𖔿s_+ɽ(?Lvľ;?mz>?I =e? >+?<#?Cx=>R,>2h?o2F?Ŀ,ub8f;ڿ ?? >TW8>S0?,~>\x& >Ȏ?*?$>ts>%~¿QBa]HJ (vRǨ侤N[F>1 Q4?I"3l>~h4>m?a>;>5ݿ ͚8>COA>ҽjA.=׿.=4쿴-ݿT쿃>=i\n?1 =g< <~-d??&?ͽ4맿H@>N<ސ9>NBl﾿$?x=>ꑿ?W=x B!8> ?RC/?>\">"?T>Z޾E)>)mAg?ڧ}>av)5o8?2K*u><.?ҿ";?7Z>>\*?oNwx?ؿpо?YN?6'?|?F?L=>#>݆>ܾnhZT^6?.?n6LhJнxy< +>7f<Ҿ[?.x>\Ww>pIcZ>=oZ.=Vⰾ HD>߾dbݻ©4 bCD=?R _?V(B?>?AXv?qȿi>M< οNוW`^i?l??Nf?yb?sܽ? @;?\c ?"q6Rl )>W@(kL> $ݿ@gv[f?68>?wϒ>uVR~F?l?~h4 jB4@;&?c㞿Fj̿?!?M>ӗ=6=uN?R?Ʉ=6}"=%=\R>- >B`?>ξôVJC4<I>{x>6u?9>=̢¿ξI!>T"=4>$L>J?+3?<0?xG@>8?CR.1#&š>?6}OzG+xpHYPPIN濍/࿉'7F??%̿]1&?%->?%?޽"ē>>ZEL*hÈ5; ;'SV >?uZ냆y?Gu>Wƾ?|>;>Öv?,?>&l>"ȿef!п8+>֐E=`4kĞ3GP= =q'=>񔾛L,t<(>Ȗ>FiL?rڼgp`d>V/?@#V?r@ؓb̿wо+?kL+z;"2w~Y*wܾοu]¾{[?~jG E/0iȿ\j,>O?"(0>>*F?ryG>K$?-<,?b2?}?6?a̿b-E[?ɿO?9FrTOBpS<@?P|?y9y?D}o>2ܽ$4<Ͽ6 ޮ>6>>{ K8>m[>h>Mf)*?ǝc?^&?$l><)^<6>?8> ? 9%4Ծ";hg>ʟ? +{>°RȂPHm!Ҿ3GlNN!7 ż=>_1?>ͻgpp#dn஦kJ?^S>U$>7=%ݘ>y?a551:?`RIhs?N@0}>HrF>^> =J?wݞ>n>{[>&>\&? Q>=p>> Z-f<~=E?5/vG|>?] '@6Knڿn&ka>Ҩ>_<?q8= t{ \?0i?N럀(NK~>ξn?r:fԾ!?T.>[s>:o=mDB:d>uLX>Kd > ?>ԿҰ࿅"԰>aC&?fׄ>?/ %z?iV?8m>?L7>*0-)Ŀm>|2 >.n>>>U>q"?U?R>U𿝅p=>?4D^[>~-Ⱥnr>h;7?K=>2^<>?uW=\>?4>r>~>:>CJ2:IX?Cb?S]ƻ"0pM̋.37>`A/;Y`?a?kޓ?x>򍦾ns^Y}v=?;Ꮸ>Og_uV O.о?}v1ھ9dʾtp?Q>Տd>?ݸu 2?Wo?B?]6yv=?n?f~ :k[i?x?ؿu@??>M?.ʼx*h`м$H?JE?/;ҿ];??Lſ =A=:|>tO8?iD=P?b]?aϿM~꿙y̾g" ǾR2(>8$z?T(?0<>f>? <>찾he:vfؾY+o%倾 2c#a{>pV࠾46l]F2V _` =?V?b>@>= H{@?Sy.?luLF?o?3)?M?s!?)??K,>U? 7=DUU>n{[`B^r?Y?y%nxH7`>c#8?~>^=f,8I'j>4~7>HdpEh(?:!>S̼ =قҌ?t6[I?hD;>>x,8V=L0 ]?m4oY?<-SK91D>F:>Q.J?Vʿ?6~Xh$B,>Ň 3?x>˨L&??>ښ?t?$3=-(it?VSw}>*'؊=pοH>x%?$!2>d>wlP?"z,l=.#(?JJ1?s½E>.?/>VaKp?G2g;@A1Hn?ֿS5>c>J>ur?5R򓚿UN]?>E>eþ:* ü?[?KEF?h>>VnB15Bv,ޱSA~slG"BOB@ FB€tsA¡7KPkBTs [@Eɐ6KW/‡ߒ){$ߒڐU±t<†>b3v|g³U2]¦Vy8}dIy¸XAJ;EjB@0BV'0-w©†G¤[[0Ͻڤ  5DЎ>²($d.T- 4Ôҗ?B5ƒG {OB`q®0³SƒL`P}4 Iµ6{«Z¦AѱB^A~°X> "l B?(C(CNBAÒ0“ª6+7@m¤֗—Qr®` ^! t”µ*!i«&K¬fv[f'H$u¬(‰R?a8}N4—AUz#mǼ±¿ >¡fr #.QleÈ'7O& !uƔdLT@p Ht»xJ)6Рi1¨­B +AVxÃ{zݶoHB\,B0rN-jPRe(ZXTŽ.7 ٻBI'.|®r.c%}Tm-A5n*Vá4A .:Gp@v5;/Dh1A[ 0g”;L(B \tB_"A< 2s'‰v›H[Ғ®NBAb¬AAsby~Bg:~#ªah0`Q8n^U.<NK -¦J0+'"/=>ŒL$b< Ka¼Jf8"4šWus~¤D@FtK[=—$3ƒ5`+Z)?F†B_E?ޱA hK[&Bp@l؜ `‚Bv =i5+t@$®iNPzZ#`2dmJF£$W#i3khŠ9BBg@EuB>XL)4&µD/6,¿"'pw2(7.֛¬'}rAhBo4AԂ3¡Ӆn6kC6AӷbA4RLdU?w®iAiA[5<_nRAҺA5gA<ۮTZL¦hvˆ9+•²fx@`t0]¶9xyj,A~tI}q cBA30<‰-"f@M B`}i:๹—’z"´6TŸ;_B¢vAQ}h/<|AH{Z/.VB/=kBQ½2GŽ+.Hc`"BZt@+Bli5A< £FQ”#PBpN$pBL<°tvg~GkAF®AdޞBMMBF0B0hAhšnNANBZB*A>AAuC@NBt,H’W©͘AV{Bu ?ApBhAtABOCuv(Bџ+S]9|!K? Va +V¹>u3NT·GS‡)!TL))$8kk]êgD¡CV£f`!ٚ_5ixz _8Ж~Awo@BhBl@jBB@ZB*E>B7B¼:/|mB^Ao0\]AbB.7mBZ6(B3BB@ m&Bc@5}HBVBl¼&&i BA"’{U)0blX?} AόBn,e…M¤!Ċg0jh0d?uBP<—¾A@B@WYB<\yˆI}zA4BL+F:Tw/jAB(^cU0]J@NB.Bq @vwBt=CxBxBi/>…‡|OBš*BLlB:TGyB-_3YtB BA]k1Bz%BT1 *' @IB$„k{> sŠiP?B3JBs BBB"CbBB Bg"ABRe?BQ B+BIABвZBBBKB?AҜpƒ'B TPEBq JZA]BtsBѤB,JBA+GBB`XBBBC/BЍBBBKCIBnC H>B A?C8B=mBtAt@4BPiAϣ" U"B%'BhqA먏B"B@3OӛB',BJ-(A% BaBTBBB6B`}BBզC ~BPBxܬB C 'B!AKRBA9B/BApCQإ^B'fBBdB? CiBDC FC*DB3C I#CQCB(B54BRB[JC sB[YQBݏB\]GB4B%TyBB9BB:BCABBB?AYpB7HB AnBvBxCY BO%nB5BŒ'@/SRB7B}D>ByBd$@,kBګA"B|pB\NAAGB%eBMĐB^B^? ?dS? >Q!?H>nth¸>WI>Oz>:LN?1> ?R*Yp2 jL>OJ`> [TLнrT0(v?x?"I >6F࠿^??L?]7*6?P?moϢǂ#;p>eׄ?%^<,?SNy+?۾% ? kW=PH,L?W? 0о>"0G?)V H  1̾ϣu?*6?C&+> {>6W#;GOΨ?}4E3Ҿ|0_~BEԹ?GrҰ>ο(&??"׿&<@]>.?+> +>aY*7>?s+?mg?d=0[`hۼH@>>XFe1u4-޽(>VZv?H??GP7iz>8=*Z5>θܿE>>zȿvDOӋ>v쿰 >>j1,u> Vl?cZ&>u='> ?P\?)E?oVi=.o(>ʧ? }> 2^>= 8]7z>ȿgV4LUܾ޵>>?_?B?k4?dĿ6|=Q;>+(N=FT{1J>nITzy}?1`>G>}(?,ؿ㌾" "=!%wؿYyl>g?*>jS>@Ž>>?4?V>v5; =͔Z<п2.aS| 0o>_ ;}c?>:>o}s?m>՝>F(!?4)>=(~F?q>|&> ^?iWE>?>> 9h&?þxZ=B࿍h>d)t?>WEԬ>.o?)>GX{ILqG>M?׿-Ir>B=l:h?Ms?rK?Ͼml=*RŧQ?~S<r?`¿7p?nx>dM`^>L\lW WTE"==QDbn5?f??yg?'>fޛ=E?Y==h> ȿ2 @>`+pd;>쿡pb8hm?:z?=`.4%4?Sk׼J꽀51O1"???3 >A]*<.`;btXV7>MǾX=~͡XӿUP>#sPL=~d?*5FaB|7YBZpF{>?H?M?">>c`3翛h>Yt#9D?㍾J=뾌&%>3?ɪb?fh^>y$V=)8DlRèQWO`>~y޿\F?KB?Q<> OH~z尽hl>?<_?ZBlP0d>n>T޿>þц.B R>x| =+'ZHr>"z9:?>M=@hG@? t?/Z? \?" >xa`oֽ?!)@=p?#v>=# u?Y=ǰ>\#~?B$h=ք>Ջ>,=ؾ5>{cĿj>W^=I>K?9RD>H:9?C4>[>w*?F(jf{%[8>-_?+}>{ )??cƄ>B>x >Lп?BӾA;b= :?D?N>-)j?]U?F? lUK>mоFKd>6 j? 28M8??v??0'ٔOK>U:,>ˣ}=I$>)xJ`{?} uE>>%?/?X8`?>扌?jj!쐾];q?N?4=ؽâ?;?˂??AGt?5>yUI>źXR>>>n>>V>Tn?JNpp?P9?fFP>4+?d&=/?<*?A V>6>l>y?>sʾ;u ѾemK=t>r`Q|?o?E?`>8O=>:?Z.c? ;.L??",>?Ue AeHѯ4W>?RV8hs>u9 >Q=?l.ٙ>!@? =Կ%~[RWͿa$"?] NFl?b>f拿#D~>;]\+u5U?6ł>i=t̾P= T?kz'^P=e< >>HN>nt?d+&??]RK.=l\^?=BC?:g/=p;?EI>E?6>*$>?C?@>T{d#0>y`>* xֿ[Q>r<>}h%h ,?=o!ݞ?B.r8?T 9]4=?o]f>Zq=V?0N?/ ?L>ھ)ИtZ>?BT=`=>,0<9Mߠ=J` "j>Ⱦ¾2Կ-? ?i}>#¿`?7 d?-?>H>Rͼg ?ʿ %n?-^윽|O v >l=椿@Z2^SW>&v>+&=?Xٿ00I9s>m?d??c=`+h>z%=o ?qn#=Hl2OZb =XBo>AnF:g ?{>A?^z*?j?"Nl>>:$=ײS+F>=? ?Y?.O ?,,?Ҿ׿DoT?i,?iȿ(Gd?-Mz?@>yIt>gZ>9p?o=$@= ?c4<0/$,?>h}-}6bH^o?6첽0+6cоvV`?rWfc?>nü]u??lY>޿ ?\^?R>+_;>8hD?%īݿL?j>߀?[g?lj?߾eU?+uH>"'F?> ?mq?>)U? >?=>.r? A >s8>U:g:->?U)?Z~HZܿx?>CԾ)?)?F?]?돾ڣR=? > "mG=h>Ylh,"];?藺ُbz^?zJ&L>Gx?^f?;^@d>Ҫ=eu>c?N֎<<>BDr>T$|?c=>>.񌾯>t ==â@?>ϾL?c>V?^Ul?? |>d=־᥍>GDz8\ 3@վkZÃBsؾܿ5h?-i "?\PP? p?8G>ǻo>;*>}>:0h>P`ڿ#)!ѿk?>oH]?6$d??n׿'*)=14޿ۃ 0.AE?1K?D˿p-8(7?E?:?=?\!&⾠M?5/?R*߾`*?r3>d?8^(R{Vhʄ>k>?@WL7gT?Y2?c)<\rx? fc?qs?Wʿv`nJGK-bZ>]>?þO?PaDK)nw[>`Ά1@>{N>H>x<>NQb>6>I ο;q@yRʽ k_0\sO>S<ƿ=xon>^?=adtPa࿒yHu>ܾ?zz>& T>J?Sk>9kH>U%dw@>ȱ;J>Oe?wG%,v!:=qk|b>KH?q?>$=t>D_:I6{=jo<:вxGP-?i4@f&?a>Xu\|GW?B&>>`T=4?p*,7, ?X^>՛?o_>é>ԉ?!@?Ge?u1ʿ0(i!;x? n7+ @"?_q>k>>R>q ?cŽЀ?;*۶=9a(?EX)?V_0?&jsg?ubwLx??Y 9xKl'ح?w?7нau^H>?.`hҿ9tVϾU??b"-=?" ?>:)>]RŐ?=yL?ɗQ?j{>?;pѾ8= [$ բ=D=vj>ߘƿ?Ѧ> >/̿^H?}ip?'&>{+B=>Kv>k>uֶ22Į>0T>Hn2fpQNW>r>#>?xӾ>??iB᜾F?FhbK?r=nIq >>b"MsZ>0R?~?cT{>xC>qP?T5ȭ=s`?ŝ? `YȿN?p)bL7hnb=?]>=^𿉱O'k'=+pn/='?>N*#J>7Dķ>6$,>n:@<DŽZd<`?$?w ?`,YԾAƿ.ߕCW>On>Bw>Z2t>¾?q`?V?#qfYd?\q?=./dl$?l޼qz?o9{%|V<|N֮? U}Tt@=Mx>̿*ۿ?'k >R.6=v(J>>S.?㜿|v|JHӾmm7x?%>?-^C=v?M?φ?fk)h E?QNJ>r=5z?KZ*s9>G=DVC? ? &3?Y=:־ᔆ}i6a?"&B>×?>?I>ʎ ӾᾩшT.Z? >i :>:ltѝs ^ >VlH>>@>ء>GpIKo1=(mǎ>4>P? ޔ=X <>t86>⢿>fŪiԲ?ffW>Z="k?i>e?,_'?g?'n>ҟv>>?2^?s<>"lX=|=d!S?\mN>*rV=` ? @?l2O:z8%Ub\$)ڿ5>m==xx>->>z,~>>Ȧx??6ؾ1M>?oH>ͿI>S5T:>-h>k|?-``Cp>=8оѕ?/C=bד?>I=J?ע>>b?aqL?`>۫>?: UQLڿ`>ƽ^?z=_$>#>$0:?8o =B!c _?Ӆ??/t?7Ͽ| >)໊?.?^|NLN?7"?-:>7F>ľ#b)W>?|?I?l羻>UkF3E?<n>>:Y.=n齊?>i??&@>??Tրbֿyv5=Ol݀?r>p6J;( 8?[T> => q?uK?h! ?r>!-8RҼ}?G>B5? 9>mqh?93nk>f24TsOVॿo5?cx>w>>$?<궿?$@>9>,=?MX(?8?^>Ik?6?}>uVI=͑佥J|>\̿Ƚp?C?lv>BcIhX>x?L>U>>ʦBvW|?7Wn`ɿ%+?N >xl˾`?*X1a?>sDepM?m AU?߿!&0:=e?7[}žUb.?޴= sM"K_?>T?!e\ARܼW09aU x=>oYξ>\ƿ-wؔ? ?XW?[>uZ>? d?&=@1>N/wR2&??CG>InF>?$?P?+t־c$p> ϯ(?IJF_Mq= ?$?-J?<ο/EK??҃ ^93?"|?Ln>o?q5۾zh4ǿ@쩾L4>vUGB6>?B?U?ֿkο?4RO4p#8?UH4 xf>;B?MM* L#RѼ?2> Ls>.,Y ?5a3y>0hnsJF?D6r?&>FNC4]>BY=hф?>$eaD>:r=?VܿzN>O>? l<>D[8">(%?=y!/}=? AhB> , H>_=>*_*=_ t@S?#i0F?n 2 Et0?e?k*'>ˠ?0Q}|ks??[3R}FڀT?as?n?%J>->=ń[>A>`g J2?>@?}?60IPV~vAgA SJvjz%”mVĝ.$;&@ B9JAȓB\BAEBS.$݄BGnAoBEBC kBBB36:«BAV ^v)~'4wº·¼A°X¯,Z@˜e15A7Ѻ:>V6VŸ A4,؋©v1 ‘A«n _BioqB !BT-¡* <#뿕 AR~*mBdЏyrA"t(n[^@/w s6#Ş:vA_LXB"V ³X!Y:v'Wl`fBWC0B?^A/BHjya@P%iipJߑuA8B~BX@AV»BF€.“GaAbbAUz}r@0=<8 $ U›8"@e0r•¾LBf=<‡D& _B'Aem@`@Au@7BnB9BB)A=@tB}D-z7!‹œGS´E†2#v.qPw~ !B-¯[…AOAkgcV11BteBPU‹G!AviŦ:-²BRBh4x¦t0\B'B™®"(„§m’*vl*AG’†5na@RT6@A"AWBA`+A &F²KFhA)p*lBŽHBhBz†oA0‡³BLQV86B$B˥A.BKyB0Bw A'@8¡AB$BI(4 ^BggkABCѸByBA_ȧAR3jZBB=.zW(¿ Bܛ B0¤B«­S4AcªB ' ?/€ {n޶·?SBSBwQxi\fkH.2!$AGT4HuZB /W•~ZOMBo>X]j1¥ ( @lBi‘:œ^-* L@3@.BKA%lZB -jJch†>Q!@B #Aw¯ ;ܡ3JhF„`TAαn«r¯01i[* f#K`„;DAk/eB!mAjA{TaoAo'(@v&2iA>R7G)czej*B`A`Bp`B̛2'+B.skbDžJB@<+Bt"B}Yn†2 9,1<ݯ(¸tP“ƋA#f¦PA1]dAP@Wº>N ¹hiU{~Œ]9-c$¿(<&(¬ҏ`,BB/H:@ D¥![mrž+{rN¥bqj.T7)bCq"BpC )B3B0Bfl0BO6B#Eq¾*oRв۩N"b©¡a ¥T'IiiމVArB63%Adµ=BLZU¦Tq@B|6œ*BHBA&dAөof*{*B_\„+{U5[A\ª (&|…,_8-Sh]uH>2ŸK ^Rv3qޏ§e†DDkH@UM1mxBL`w4‘JdvlAd4j1\‰Zx·,‡Z¿>H[”r"f.w˂š:@‘ª+ۻ4`$ ~'$rNa Sœ «y¨Մ;yep«\ R—)/0/?sy*X7 ^r‰.ovӘB |B_ B|AcB2xA;kBjAB6BpCHBSGCIVCEAڸ‹{I&B9 9DEQfA!~Bc?BBJBkBsGGBMAbBnleBppCZSk°x9d·ю\¹mִº"A޿{A6³t@D<’P8@|UP>@«x%ЎA¹g¥ˆuB$V½vYbTa?NgֻBt6B.@-DB *‰[BUŽ) n6h^ )BX2Aʹ§¯?@]„eAyCAVe~B=5A@n~BI?AVUCBBAA4B˴Bo[vgBgB&AB? \%AsB$ wwtwV£ABCH5ާd4u> '-^bgFF[csb($©XSm)ZB"TX BhA|&f *AxfmCxA5…U¬ (?LJ J5vd¤obkojVBH΃}.¡P~q‘ABƢkֺ,4^,–|BW>B1hB*CBRQBDKB;A͔4AmB2y2C=ABIBw?`ν:Cu?i ?F7?F{8^-?Bj?hoX,U?!`Z,? ?^?ޘ y >8:fԈ >T $>i~_(#S<,` +?0̞x;Lo>t?0T>c2a?}0@>i?&@.)?LE lh?ڼ9w7Z?=<~>'ׅD?vdt>r >W?+ySؽ~?A=c28? Z>YZ?Z?`Xr4>7?ƅ??]"?A4?B¿V޿es?;q>!1Z>"h޿-^||L%F>_笿&>a?.l.r%8j>>#D?6N>kX>"7UDt?6՛nZ>K_=ȜĽe@?b-ʽz#@m~>@==>B~?ϥ?S?R:?+? Z>7D?YoN>5*>L>cr>Խ*>?k2 >俄Q%? s?`_? =`ƿfo>Y {}}YA$ps߿2;>c346]>F=?f>;m>FA]=ݘM?0> ?xP?n<W?.Q? p41>V??P?DD=^>]>zȿ[?$&D=='ʿy>NxC?>? |=j?\OԿ۬?.c$=<>Tr?b=-?e?qHR=óȽy7& 98Ҟ?7(H?1?+? V ?$??K?bDο(=?c >Q>-Sę= ?4~>8?b>ؠ|>iоb)=^ECH?E_B}>vZx)w5?6=T-;E?P<٪P2pf??/gn>BѽYw}b>.>B=>fȦ>zPIZ>Խ3o똾 ł>OпTL>W<`> >?N=3?=YW d>"}=no?ߣ?Qzd2"=9?Fֿ#>g=>z>?5K>YC4>>N;fn? ?>R~b>Q?ۿv>6UhnC[">g?judsh[>?4??=?›>?>i>MDqOH|f?"I@?[ֿ]q">}>ŝW /w'=ts,J?GV=gGмhaz>p?P@>>?lc:C=羦 >y,)>᧿Q9?z?0v==?2=>+`>{2deO>^>iS D>D5-B#O 5y> BIa3;X?>w?>b>-@ӌ?K+?=|D:4>Kf>V?@pbBb?郥?x?oA_yO?2y4>y=/`>q޿b?'?A>;>D?\g>8Ⱦ6VJ$笾oHbOl>~?T^d_%=?}M? .hjJS!(?EпC?+#?y GU@>Y<m?2ҽ tP07>T?o=3=4?<+?kS /0? =4dGPh{7m>\־25ܽvz? p=Hp?[>|r|?YJ==(?f?ީQ?K!?Ɓ v>keҽvx>u?> ?Ph >d?C>p6?w?S0? X>ȣEaS? p CǾT>}Ͽ2?/= 6>.>>?0Ժ>Nb?.>  @=*H꣠>;:?%>bNh۲4=o.b>~l28dV>0=g.dX=>{]>H#1cؿo>"N(>BN]?Qj=>ҶŒ:>S >g4>Z^k?&[>Q"< !(a>apL>L>>,8>T?V?q>+ʿ Pz;Ⱦ þ#?ǡ㒿 >?J?*U.?u =k(??L(23?l3Lj1aj>mܿS6>*<>e>-8?U?^Rh(?-2;eu`5??+\>D !( >$>8 >B>R>K5=>0>Ӏ >B?5?t?>Ĕ,/ K>u?u(> >?kνzl$6>*y=u>'^쾇>,OT>٧>{?^fo=aob>{BP?Œ>`J= q垈?ZL?!6h?A=2¾ȵx>X"P^!3?~-M(:}? &$5>9<>RrU>?qe>^ڭ>ȟm7>!]=،e>9>.̎=>,h%vCz6?tq?YT?? jImܪ??v~?"?|?[ѪQzp XD?>6H?< > >Ԡ? |? =8?zV>{N?@? >?6TVL`.x=o\t*5>{ֿt[>&b>>Og>U=YT>>rg>~j^?3Q@}D%399`~/?=?Vt>VʿUH4>85gRNqmZ?k>D>?-)۾}?yVB?cV??y?Ain?j?gj?bP>f;À?N|UCko?$>P??\fi6(?բ?`{q ; ? i>9>d޾nPN>΍2 ݹ?t>>ݼ3@?/|Z?_=K\?8W־T*?7@=? ?uR>8!:r06?kH_+ݿ S>(>4?ʾ 0y=hϲ>{~\>>f9{>t?8?`8>C??,O>?]+=>g~?t;gd罿?1?]4H\5_??i?dmt>">U> 뾓>B"i1[? R^(: .>U,?_kQ>P?T?GFq$k*l/?:&{?>¶>K>:>R?>R~b <??]j?@+?KtuP>SY:}D>k@?"?Կ`vKx1??_F?rt >$O>!O?ۿ6WiO?۝H?NZ?+?ۭv;lf0i? 7@?=>/3^ԣQ>$?/㿥{r@sB<=|dP"=d> C>]*=U ==~1X[~NR`|?Q>a>j8~g# oI>m?Dh_gH>p? `2?Ъjy>@{>(J>\1 M?Qڹ?bN?2I=7>>R즿$ȿ> I>Ev6Z?9P~>l?)Y>kP >ťݾk?%I_x]6;==>>p? (>ʌ ? ]>BBz=nQM>b[>s=>h>i @>䨿L>(y?2GVn>N>N?V>?S>s?:Azs¿/>ZI dz>3Z%> >⊼B?"q' c4Fk*` @t?C?KBP^r2H.?*|=6>+>sػ?W?h?\>}>9P>=l-W?\>%M>E?V;q̀?4?!?4U8ӾV+).pz?rzAd$'?8>\Z>2˾w @>=P>b$>?tu0?`?ㅿl ?Y>'5Ŀ4 ½6ξ݉?%=d#8j?'|C?_x>K? ?mM?p?xS$5{j?ß~;@*n!ҽ| ̿1э>K ֗x?5c_"t>!|.Cܿ>^~>(>i?yP=MBYr?L?!j) y~"ʾ?#ߐT?'R6:?n= 2(5\G{ܽ򨰿: ޾'=?ܐ:&>:p[> ?E>2[<H>=H>4>(;p?{b?$?Bgs>`+?g%@>$z47 Y?¦?=a>L(we?!¿Ἲ<{Xw`>9 I>Ur??;yIiоvmqhz>_|%%0Jg=h>LfZT> >0?I?0r9X?`,?o(>Lx=coq,S?Qw>ؠ>9?Y?z P>i"MVo=?J?4S{1[HӅ&[6? ?;?48=Ih* !"ҥ>+{>̆V?b ;Z?R {钽x?N*J>K߾<=G?:F?U>g?e>l)p>C# -;>-1>蜿*?x.|0)M5edn ? z>wXBl$p>{$>H??> }^?!Ⱦ??N5?p;VҿM>v ;ehҾ fdɢ?ׇ?믚> b$U?*(6z?]>־n= ~ U2SO>40$==x>0R\ ???(7>>.>0?hYtTO?Ed?09J>3J%q])2>€>yqI?Ϫ>$P2Fi>?[oK%A>U! x?Wd3ŵ>>h1l]p ??+MB?J> pj,n" >J?)@\?$nTj ?P$5sv=?Ͽ{Ke̔=Lx1?p[?nR?& x>W| Pi?z?lĽixO>m¨=b񀽂t?DḰؾB=KA>ٛ3?m!Z@ae'`FJB>⾧۾%V9:>P?̯>`B>P?TMPa?i5=&X"M> ,3O >IH?f?̾^>kj?C \>?Yy?h3?7]=j <0P?/#yݿ ܿ 78>6˓>H?Ex>b$_οp^>r?Cܬ?R,LF>7d#=>xw?A𽑩>>m>H>CP?LyſpG%d<% ?X߻cv̼@0?;No+R=Ů(?6i?Kݦ"6$JCc8@>3GZ?)?#>@\? >A5~?F4?/࿟_c>YR?-Ej>!\?f>cK0=tҿG^n8?ʷV30> Ŀ1#n {xF=qy?.#a9Q|پV=-hl[Hm?^Iu>문? Bp׾J^>]?;+jMhzz>0h\?2>s蓽?JP= `>i޾d?,"4>Xb?/[8>T$?D+?Mؾ-a?B>f(>9,B?p d6R>>>DĿ?\-͖6W S??W>4N=o??#? >Iof=F־P?>ൿ`—VtaZB?Ͻ?Ę>Fi+eX]]>s>ô|Z`?vC>dVC2?9(t?{<{Ό>U0,%ؿMھ+o?RJ.?2 F>>¾P&X̿,?]_>d l~32?5?5J=>`V<*`HӼSr!t6=EH>1/~??T?v'վ*LZ@4r?%?*ſvW~|?>?`SN>Cj ?GűQz,Ӿqܽ志DPN>Q=G04xv`kΘWI(j?0{D>ET>:V=?"u2=}prP>pZ?,@?W0^?fQ?Fɾ>>>G?t PHan>5T?ND?> d<}X?4'7h?xr>`-~q}k?V?7U>=D>J#?y=T>.?"XBc )>mynv4>>h?d>6>C>0Ù>?C4e?6ߙ A?gdf?>'93n΍JIC75zj.A*ŠAA{Oz2(!A Qv@޵WBӜ0vƒw@$@ADB7>WµߋB`ò| gwADEZ="ۦBBsb lAkABBĶnA5_zA-Axj ś~B'?@AP5!O©:B3bAᏖBC ?AZBET@C ƒK IABnB:YHBSVBPUdA-f4 A$B %AIXFE~:AyBj4(Ba\B4B>YAoBC Cp)qAzBB7nA3BcB} B2^AKBlY —c@>)3AQhA_pBFi-A~ABq P ?B g¼ gկ2ޙÉza,nVhµjp@A.BJދAMAu]QBrB_BO>z@AB%A>B>C; Be SB%%°MޮA*Ac#@l BHTx’@=1BfGB@@BӼ )lB@ҦKBLB?"zABL(\A ©xB]Bo_ܣAUBoB^B B$OB Z6C_lA{h³BA @'Kš4’ BUxˆ!BF&BҚBܨB*•#`1ABmByL T: \BHߦB$B0AF„x¼I1KAKA:BCBiB>BBkB|AC]BtlfYARlB)5\BH {AÎCGB%nCOBȶB,*B BEBzB˩CB @BqBNl^BZ2A8#B,C /B,HB ?AnBMoB0BA XBAƪBlB&B[BBxVB:UBj dBM"A7B0U)BD;B2?A*BB cBRB,CB:ByCt@jhBS "B\ABx~AB CB̓BP{B2¿u^°AgA%rq(BA*B.}v@af*ABWBhBzkB}rDɢB Qˆ7e"B2BLkA*j?&BZcB>#AƏ[LBSAQTAuE6@'cBuBJBB AcB̢B aA OM_;4@be.3Qc~+ BƘ?A>Bxiu@YD_kHF}A,¸l:A!®@BcB-A*BoB\tB]$BW‰յBьB CB_C,TC dB^B<0BRCCwBAw{bA BzBB]BJļlBEHA&ACt'BB,BBhA| B]B$vCdB}C6 BSA.NBR}dBkY|£p@4xkrJ%8c؎AgŸ2 nE?ұH?S-»tFftAT|MBЏRFaA+9iNRhXe]@"@um+ŠAʯª$¬Gi BK2YHB BsB+T`BAZb)B?.3?J­Jªx@qs0A⧂A1AY@8.ª†cHQtT–\žA젶KBByBBhBÒaB!AсB:B\BZC0ZgC$ClC"FDB¢C3BVBXC{hBO(`kByBB&BCWB3BB8B.8dB@xBjC C/N@BPA0KwX BD(BgPAK`‰hGOB˴—Ba›reBXC &A,B {BrBBqABq&YBBJ =P5o\(BB5VBABHbA*bC"@IBBfA.rA7’*砠BәXž¶gABݻxBXBBAmAFEBK#AڑhƒAP>A …~tJ`¦s¹/A5q¯>:@[JEJ ŽcbxxB"C!CCC?BAHRBj!2gBBlB8A BB1Aͩnf"e]AV|AK8DBa<@ځAŌc@A ‰ ݬ@ifok BBsnB8YBY9\Bu͠A0Bh͘.QBN B0uAA*2 8b@|»#|xLŒ=¼'Y1XwH“L’+v0A<º+%AWFAUA"k0D5?4r^A!RB2qA-ߓ9"Bw3BBDBBOAGB3B_(BICIAjA7?B VBF`A@сA>΋Ld ?3B M(@hA1S*z?\B+q« AAI8q‰N |Ag‘B'.BT~}’aZA;§0{/%tLzFC %BЄB׮HBhXAaBlB,,AaB,VBACLxBOB|BB"AC1j · &±rBXI6]B>‹;/‚EBMB(1IB@aEB2B"AB|BN?Ež`-NHxA]B˿ʲJ;RUXBABC AU1œBD?^@5B$JBQ ӘqF!AXBMCӠ;jTۼB@:BvB9º^A/~C ^^.)AoAchbB½sAl,WJBB,BQZBAByвtƒ(Az,k5@{,eNAo AtB@BǐCnBuBaA~BLA¢B0|EB;?k#@oB:¢kDJAѨŠ}B@ 7"BejD0NLgBX3@`_$– zxƒ?„K;lBT B@gB_BBo-UA"*MzbB ByAbRi@aP»3WA=B £=B^it Bg_.)B(GBMA BѤBn]frB?BEB*w.Z A&|?B_11AB Bj^B-A~$B3dA(I#.^’`?\;Х5B'Buy #}B‡*Ǭ8BdB A£n¢¦6,dB޽@SBMAoB^:/@*exxAc APB_6;B¾ر5ebyyBţvA8Ѥ—=BҘ2^$x@l&?!6>tͨk%>E>ixB'5q?6hh?Xe=u]=f"?'%>-v->Q澀Cu)忿#7>mT]??+L蒾?ݿw6>8?<01~?*?4v>:>p;7RȾ9KSAuɫ<~?>0W>*>%]?~ 5p=`J4J>>$O=_;{?W˽>辪"łR$Z?Ҹ@mz|?x ? J¾`B=Ď>X>D~?/Vtp?? jlBp>J=ʠ>LUgʿ˿5w.>$>_>>`8"u?!mD>Tuڿf|xE0"L t?>h?A &?9??L?mh?D% 8މV?16L?z̿gSv>Њ6'?zP?c= $?Ty?>S>`>B?2_?>dP;JK>\d:=7=><> Vqсs??B???)== />4V] pw=Nhn<4'? 1?a$6>(?ieھ1xƾ"d|<=Ԛ]'>vf=?" ܤxy?տ3>A?xLQ`ʾ?4n e}n>ā}?EQ???*z|@|Rø0<8=?[^Z.o?XR>= eө>>)l6?!>?v!cc=;?:,>2e?+7<@?1\-&>Djy=6אQ??B?+?Ld},Jb?f>*ؿ7aL>ƺ@xǚʿ>R?~?>sZ>=?b`R>??wW%?->?I2?%X|Q=AD,=T?l=i|>V dTĔ?2jAJ? ,b@]p欿Y>jb@?F1>e>"S??*>A?< [|>U=۾u9g3 ܽVF? Vҿ"?>О<?4C`x?1V?,>$cD@ПAζ?2U??LbWN? 2];?4j>_= 6>'?<)>V׾. #϶>#K^5=`e? w@? >h?X3>һä@>⍿cZ5"GVw?}m>޺jA>N>i?h0*>ŷc6¼d?ɜ;E>D?r侂~?Sb?vS?8޿Y" ?H?5<=t¾$&?P-?3j=R(>$>?ھ@"?:i㨿H"ܾ8??[܊??{g ?e?i'>n0\|>}hH>`Azj\.?B>>a4ҾPq?fB-?Z?@{?"\rת!na44K? p>>r?$ɥ>T-?JS;ҀB??_i??L۹7Bn?M?8?w5轞|)ؿ-苿$>>ϤH?q? v?<֘!"D1L}>ݙ? ? '?&) Ch[>j;"?1^ֿ ">>zM?W$5P&>L?1 &?X9?>B߿N?' >?(׾̾8O!>'̿=J[>r+A>? =FXd>=>Q8z>>?@W-UN??Eп_?p#?P?>?Qb9` >?W/tj]?=4|\;d>,¾,p>0!_e?F>ʞ?WQ4 ? d>-:H?<+>Ot>^?K>Zs7K>Ţ>&-?zU>Ãd=1%4G?'i"??hy=<٨?>$=ϟ?h>Qپn>@j8="L>U J!D?>bԗ1=PB>yX?T=t>ް>^)t>ȯ>Z2>JzZċ]Ͼ8?6knLBþǘ>%;+>P?߃=<?| ?>r=Vx?f?x=6>85Gihξ;<>#X>" r?,T>; v=E4=o$=??@? >?n>M>&?!:_ =clӊ>4ֿYJ=7?,|?!%*n>`1xF15?,ƽN{?5?>XD?+xY=F0c8p6Xَa>wݹ>7ܦ=|?v>b> boX ãY=ƛ=?H1HP4>ei(>&8 >=>@?C?R>;U%>5E?mz=&oD?ĿD>,B!g߼ ?=4b?V=GȶLT͌?=>wj?{;ֿh__d?ar=G?.>l?m=Y>]BXE% ?>ϸ*[tc=b̸z=ku{> h?B^??1$b0˷=c?!?>:|?톙(> j-R>nپ@PW@ƊUEȿF? ->4>b5x|};T(߾7Ja:?g 9HMu>?q9?D>S?~I ?n?? n>=>UcԿ.?j]οgWT`I?Z?Z?=?.2#%`t2a?c,>ȽMH>t?F>?%UqD?} t?oO>NZ>B?&=, QBFti/7&Q?=hH!dSLjE?+N b}Qr6=L \?wO6> q2R@}?ѸUн@y>n2Q-->?i`?L)H>纾8Is?c~ >3Ⱦ?F7U /=L?#ہK*?>I>}8V>f??C4#ž>?tG?.(h?g~=hؿ >Y~WgS-5 ?qRr>>?8_@ 0?I<%@3 wi=> zN[c>)? Ġ?\@"?*`2">?V =K(?4'?ck>,>ǿޕJ? ">K:%>nq?bs?>m*<?QQ>H>\?mVT>`X$=;辄>}X>$R=İ=$Xp< G[h>=p](=y?>f?]Y_1EB<x$L/ޚD*a>?45"</`8}?CBp*;Aȿ-X.mCÜN 7G2?0:ҿ,.Ow:N>:"Ez?^#=dr?-?w>;\<6>,IB>l$' 0r=>}y?3unU5>e?_2 v?{h?L>-v.8r$F=L B<*p(]Pxk\>gH4?1m?^>$Ջ?>i׊L#rz 8?.qBL?< ?S:?C>?MiпU4ؿ!Կ?A鯾_x>?4=E\?!)=?4? >R6?>Yr!$A?32!*>BX\]N?$=ۅ?$=>d?'~x:41Mҩ@>:1ȅX=|pپϲ?"LK̮D?W1?S*X?cVbwP$D=+>Tož >~?W>>\?J]?wM ~?yFq2up=u`?8?C y;h?%O;?4>>F(ƽ37E28y1?.>?@sr?>ƾFc eghT? N`ֿ# m>?y?\s6??= `F7e f? ,>4 4A?]&>?1?? ؾ٢7) ?x߾q)f?$>6 g>\TὭ>T^ؽ>=w >p>Տ?|?h>B̿;;>BϪpo6?F>.j-=,?}M7~f޾̦>4y>?9>:?>.@>ܨ?t&ؾܸT?$^f?<@%FWD1Ӏ>S׿wZ.?|=]u;.Kw?g'7?BL??Aù>w5>N+i+3? gV>J?4A+=6?WI>`|: =Z>Y#?(oԿ >)ξ ;(>@?Osb>"̈́=ܾp~? >-5R#+?ut8}?D>F>?#w%hrj=>ڿ?k!a4?@J?b$?F3>g=$,>s?iS?24bZy?J?;Us?оEa<>TeN6>}T>t>BM?(4?^.zn<>J8?HMXd?^=;?qq?ֿ$Ǽc?>wH=!hH>(>g<ʾZNnK>Vnͮ ¿ G?p2>3?=n>'ĭ?,@lYJ#W%z>T=D ? J1>Í>9@@ο&@?Bмxkfu,x[?y?pPwNڿbM]q.?p3tL7}eR+7>⾉}?s}vx Ұ׳?4?+g?Q6>ݐ?>͎?dO(`̾o־A̿O(*?w?V$2?A>cwH>>Q>D\> h>e><*>ϰ>n*=0DPm5Y>߳>;z>l?h:>OT~>[վء{>3.UM" Z֧>>$.?~'??\b<>>?ePڿ-Ѧ>\0 |B?WrH޾DW?>8Z(?-?Z>-` >u?>C-?+9&?. >H>ҏ=6ƿ44> ?+?ï=,g5?hl?]?j0?k?\?6$?y*I ?%;:z>?S7Z*at?ȽQ̽3!zT;0?cIC>YhT>S^<@O݈= ?u&a=P{ ??f>'=Ö1su>*M~>F? aSrZ>@>B??? v?[i?/y=>1Ҏ?z?->m"=[nĀ8<P.v>`!ry@

ӿ'.:>h)>?pG?}>b>5?`|=u@>Y߾]>+tbK>\>CľF&p? H?牾L>>>CZԸC1J?>)d>\?c>Ќ0? JV?a&>\?=n>Pc?id׾Ybה>b'?3>HZJ"S ?j!>n$@V8( ?,z>j:6$=>!(>h=?p.>7N>\?潮⽙ܦ氾庾N?"('= p?Ҳ>.=?egY'>b}?hv><`&|?Nܖ>͚cŶo=u>h??O.>Ym>h*=X@寃>n7N{? Z \ND> E4?wnrԿfG??Y:.~?O{l?Oڿ@,S??=оυzql?`%>dQ>{\㜔>.0>1ʽh >,?Wÿ=6g>b?t_#Ɯ$ 樾qҿ?>p0Q>+&墾T?HE?!?Qoӯ=[>cK?*KE=aAl4>>P{?hǠ/pRKܾƾx>6V#BCӲ?*?GqZ"&r?:xn= >!%N?m?,>FST?f=ԾT ?,X??G>-?h=1?$dྈeR?O?X? =f`?*Y?D>pa&ѓD;?a?/L?ENؿvx>vVJ:H,XT=? H?j ?Ԉ??8>䀿qf?(X?"D? =/JLܾv[?/z?>vξod$d(gYBj=Zɝ¥:¬#!BjB@_GBBhxB *ƿ&%qA1b1p3@½ ^B_2Z6A!UB AFkBBBA؎6@WBG BK~BC?@“AAa#dU^R oPtӞ0>9B7@t֦R !G-I\jer¼>܁+P>TB|T‹bL%g}…i Y~.!AzBcB%_B"+]xLxB}$¢J}BPBB֥BqzBl"GB C lABHB둪C2LCeB܉2nA„L_`A>f@@uAM&tnB.B2BN90BIB QAǥ/BN§%BkBu B@ EHBUnBThA9B°Bƒ_? BBTk~>AJBϖXB“A=4B{ A|BoN@AP(31(B*i Ac76ʶQtBR}5W¦2A TB1BuBچABv$AW@?`y~@K"B6$, ASc|eFW DBE3:PAO1AE&cEWG\)%BB`BBWŽPl}AMnBg)rAˆ$TmUv´{KB= A. @^>[ (ʪ&ԝd+TW$=B`‹rAEBsB{B®^?n3–TĀB۹+™<_5œ…B%>܊Btg`B"BȗQdA ¤,1l!i`mAhAőnAU( BAU=bB-)•;B)A@^S— \f0e% 8ŐBˆygrB8BcBy#BwA)f^tA,C*.AG!AroB2.B|YB}0B 4B밦<„ T¦8v&(s6j^eJ6e[A8µ_Z—EzA@#ü˜h“ѼA20@$€,.JmD"@{%7B,,[H砦`#zBZ9s­Lk‰S»7t™#so@xA`º%6WY~4A¡A@A|p@bA;<͆•~ˉ _B uH$Bnwo¡I&+š7”%Ւ"@-A%¾4'B<AlvƒwD@9˨3A ŒA\iBiA8"TAPۖ]^±?FvC 7Y^= ^BǷBsBE;.@GQ%l?&¦BQ n€AtBMCb&B67Y}?xph'º G=ݗ/<ſh?>3?\>.H?" B$=3>`?]/>N>'&oϿ`ѿ'b!:b>L7&><? n"=ֈǿS?ӄ>T ?3ʿp}?%'nGŖoԾ>>8mֿF8<Ѭ?ƌ?E>ZCW>AT=2Dev?JQ*ؽc?=NcǾplr&r?h/1?L׍1󞾨1?-.><6<2@/3?Q?j?s>?6 ?JPx`uG= L ?3><>>J>6="C, >iDEl?A:jF?X>،Н?(?L[T,ҿ>5,2>;>> jnR ?Ax>NE*UЪ>;E?nH?UT->@E߆ЭY' ? 6>tֿ"M>R¾ K}8C8?kSU>DCt?N?H|>Ŧ?kq>ɱ #G???\?^>I>x>d"w=j@:>?3F>I^?t>Ig>.o>ic?S=H, ?`rp?x}}zt=D=0>X%EBͿ=>餽AT?<>N>/>3X>½=>NAS \;mÊ>=6?y?J??0?ξƌ??B=%4?*>=@?jy6O~>J ?Qw{6H>࿕ؽ?$#?WS>`eXP<>.?oXVRm0?~ʹ /=<>->Ҳ?20>k =,ؽMؾf>[#@ ?fkU!>yb??/Cx!|Ϙ?aN?䜾LV=Ʈ?vxXh?:v>0?(쾖yx8>0=y7?,A)>:PLܿƿ H?P@?>H$οIaQK|<>6?€??>Ե>,TJm> uk>??,?Ե߾X;@@>ԣ?[>4V>/?E"?1qM?=Q=,ɰT?wF&e?JO>l?|b522N?"?}Ŀh=-?ۯ ?T>ϗ? ▾=?/?c >&6n@>?S&ڽ9RVNŘ &??7?8g[wD? ?F ?=>lL?$Ӊ?At>+?T?`?O3r?@=Xm ? ,4h>Ȭ=X>Ԕ>C(>ͯN ?,K@? >ց~WTѾBZ<}pk½4?kGi<4Wj?t>TTr>;7?+9?rǚ>ϩ.>Eؿ7> >A?( C@߿@ZBؿ 1"K?t'>":vbbD=ؿ@j?.x< cvL~= >bS1Q(K׶$>@><1#?'E?RΟ|޽t=_mV⾙F|4]> EXh4?Ҹ?=drxvxA?&Wp?M|2~;>?$(xq>2rT((:-|>쁿J;>x?>ai;?a-7.>y>~=:?&y(>_e>,u?(1ejm??:^?)X~?RֿZn>$>{?ju->+>-NcMOؾ&}skq>N?0D?'>ꘛuV?4?8(=>? E?KxJJV'~$]¿>?4}`>?CPj> q>:"^񀪿A-꿎r?|?AHۿȑKNH*!6?GJ?2̳>)Sj>E?Of>/=>&?l??$:^ d? %?F>&NUWN?:m?6c?Ķ=`F0h3D8D?MvJ>K}XA'Q>\>>c>kDs>{V?*4"v>mW?ofȿ9=ؿ>@?ћ>?(p}@?F>pQ>h߻.6&>X\=Ͳ¾uR3Bl\>+LkY?,>*I>ܼTj(F>nK2#'THF? _t" !0"tDUJUĿG>g<( D>WDz@"b]> 8: zV?e߿B>?wbjѰ>>Ll?}C>W=D,?r A<9>ܿt6H_Lu0I>E>[V?,?U?K >> i?\?|{hXv!T*ϰvw=?zy&JZ=Ր?a?{P>i4\.Pf>3 ^S? Z>2sf뿋ɁH?(@xN?ͤ?d%I*+$>Ι3>Av8bSQ=*6?*@9}TT?Pkig+?3?x#>n>k迂-2XP?^n??L2oGOk>N>"q_>ͨ?jt?Z_>w {$=#侱&>*.Ӻ`PTE3?-?q6oѼ>;>Y%>Ί?%>C>U?7x:ݧWU_>u D?? Ie}?>„z&Y>%#a>S?+$< T c >D>ў>oqz>u=d?st?lj̼8~?nV薾>0>Z>Ƚy=R-Ǿo?K?> o7?~~0>u\X>? eN@J>%>Y>Iׯy,W?-K|o j7=*<`??^42>W0Pϲ?1=X;ֿ1Nľs>?*>/=>HGz+d?d پg>a>4I(*JlU?K,>*?}?u?I>w=ڧp&ʾ6?@ {l'H>?MC=G؂7WfLeJ辣ONLm>?!=bx>>T.pn[->>wNP B-Y?Z v.?.>L0A%?~?L?Br> i@_ɟ?|%0?:_ͼ0>?O =uʌ?r =~O%B?%о3 ?z>ժ>>?p=$> QTzj-Z@‿C} =Ƿ >s~>ϸ۾?Ea=2?kͻ?ONY)c?g?aubZ>*}p41 HW࿞E6>('3?cW:?4>5=?59X0YVaѾ2?=t?=M>(@>mH<>l > ?2*>L>?8(H?<?-bZ>?*\g?4?ѽT9|>q&x?5&!??+>0~6B-T[]PX=H >>y@hҘ>B?%">ZP>G?0b?N?$ՔWܾVٓmK4>ldž~D>">qc9))@>S>;X`=oX?& <K.>Ssal$,?lUpg:> H,̞?.?_ϽLH= -:m>vx>J>>Zo?$*b?leZJ?n|=3>a6,?=0D=w<x>63޾Yդ?qm+ٿ?jZy Jvex(=?6?C^/>2|??L?1Z3?!ُ?Bd"Z>(>l?8jW?ބi:?,+3>ob>ܻ9 =΢ts/.¾3Jfl?^X? X??$mV>Vj>O=a ?+g?$rĈ?&X(#>B(=XFX?>1=^ i >>?[=={k'qiTj>{?P?6>`6N"0a tr>IȾ ~>?>Q?1\==D$+Z: ?~ᄿ=wW?cb=#H ǢL$>G?doN>?oǽ8 栽w>'?>_!)nƸV}~L?BS>0??t ^?JW>>_Ls?6I? E><>KB>?W綾D\?j2=퟼z+?`= ?Cq>LǿZ!W=F0?CS3>˴=lLg>Y?u),?:>꺿\FӿR>?$?i>c*>S< >pC]#Ae>E]ʿM>Hк>x;>I<}M?B>x==?E==sо_>|>P> D4? )=? ,=T>"<K>V=>]! >??jn2>_>H K>,~?[lGc>H*ľsEl?.~U$x;3@ djj;8>Cx4>! >uR>?sH?Y(?ѿ^?`>k>I=Pְ?YXr=W,3 ]51>ܼܳ="C?>:?¿C=I?w=t<>W)?"??z9X>L\òL?~<>+?p?C1?ܸV?&_ߔ> E>>y?rA>@ ?1-eƾ~dt=:Q=ۿ>F>u̾O? >?6> F~־Gj?v>O86M=Onɴ)v>=w ?R_?>x @ ʾa~ f >K6?P??}?vC?~3{>xA}={TPX?jbҾ?M?V7?o;> j>?D[]Q,>6x=? >&\?=?+*?D>KR3H>[8?>Q->?Lw;>|[d[??Q?&@:ƽS?j\l8.l?1~?@6P+?{5<$=sk@"N>®@ [HRS>Rg?@Φ?u=c ?XX.?I~?I?翹f}T'>=R?t?Y?3Ѷ>a >LzH=43M>>?V@ M7@?w}[? M??u4? l巐 XԿ&=,4@?:?~6Hv?@a>wV>>:\]0+X?_"L??*>^? B>>??.¿?.? +>S?Oʿۣ?X=v\ ?GH?R>ܾdA=r%t?6>>?4?y*?3;]?cs>g?.>(Y.?o꺾G}?K+?j?lYd?hԿBRƾV>|>?=`?X>{>j?u%~?*?>.;&>=`;@=!>>(11Q? I?Q?%?Sa7?ՠ<)>ϪIK@? >`X??m??>|a@ *;?dX;z>˳u?,b|>{D?C࿂ [?_9"?b%?s?.?%>ϟ׾:̿+?3U>?Ua?Cp(;O>#oB>V=âiG+`T=GھQ>.>jO>˦=?1>4z >?V@?,>hU>/#?/afZ?b?>\ s>m t?46=D6 8yK?-HT?ڨ?jNܿl?(t{?1q??a%?Kx>@?3?elz?ɹ>ډ>!D>">>?݊$wpgJ?DZOgؿ;A?+Ҕ?d?Lst>L>e D==P=N Nz?$=0?"R@޾ ?0}9)A4ҿ3u?%>AVN= "{"|>s|jt? ? 25??U*Z> ?t>ݿ92?ؿD[>?DD?BC?ū:>_-*u,ؿZ?G>>r GF>>>U@>y>Kڜ>,?zHP?AZ>Pj?s >Mr?x.i?E,?ʿ:f?(;(w:?C>>>6?1k?cqHVb>:?H<*?>վś?#>a i>' >e޾4&-?኿Trz?;=ʿ1`?Q榽o?ϥ%+>N|v"3?)p?-+?=Lh>>\V?D?>^?K뽅FxH`=ۿ!73?"P`?2o?b?z"=>&aН?D@=xiĿg8 :?s?v>?Pڻw]?h??1, !qԿ|>6V?'PC>QH?f?k>3"=c O>??-?Y=FҼ!?XS?!|D?[Aп7F>?Jq6=M?)%⮿VѿH`?q?FT?U$2=& d$?@L?PTxm)BBB g8?~AHB-hB’Bj`` X4*¬¥ȉ$+u‚,†]TB:vµsC8_n a7ַt·1\#ˇ³¸gBj,oUV稠½¾w‡lՑ€‰)'ܳѶvpA s$Q>S@Aש\f(5L †Hۑ‚l·š¯t0W³wBFzWBo4kXKtz ^‚A™8'njtq逶 W†~~#@2Tl?.iAW@Aqx慛Bi(*͟Ny7‚ò+BgD" ^BnB^ Bm4 x"B s@I*1\lAl))m„N@H6F0¬VМ:MbBU_B@1qq…w AwU .¯‚RO׶^ h~ Ai#(”f¬7©WBO_²FAMBd:@x6F\\i7BޯTœu•n6§/2Ax; Bx/@B@zBE[Y46BҔA{P`ASM0?X>'B›<['yͯ ʝ3۸H?\K?`AC;B d8BX4C#nBAaHBWB-GŠR>$B,AAo @_@L6PA sA BaBB˜BsA =Bp4JBCBj~BzpBB7ڸ(A:A}*xѮl@ B7BziHA@vBB1JUB D'@rB2HHA>9H˜P/"QB@/ "BslB,iCjBmA׌B CB/u"5p;Q`&߭BB[B ԊB4 COFBFAtB4} BB6 AПC aA i+B1YbBb:|A¨Y!¥VF®A,gClB^A/BŒ6@e漠›wAGEPfZ@\B‚B3tZLºa@vA31׿P8A9%JA@@B,@U¢mAqkAҾ§ B* C3w*?0[AA(vAB9vBe Ž"JA?f/rc^x,´*rή ˆ ¯2X¢Ӑ¥?9H7Ȇ2@跠B'PA†%n(=GBW@BVhB@M]T_-4@VM3BMCCBAX Bn8B/B5AC eA97HHҗq@37a0b;٧¬–®RAA«c@žWBYnOpTpu/~`ޜ“ZBiª-ƒTE¹/lQk尌¡͈•P3{13rP†rA3^?pJ+@'AA6&&9¯QXddAlouA BbK}A.AIB2èB\PA7PBw*\g¾BW |B«(;kA8AǾBz&C$BCCC CoCQY@FBlEB'C1BEB&B:B[(B2vCmc›PRByCE`BLBP;~…8EB=pB3:xB:C(CCBDC%{`t`?R0)¢B\*9AȷX/›•rA)ňBdBfA_"@b0'BȍB/Bn(@EPA:1pXBwAEB ^J 8Q‡9QeB(Cb[Bd?O@A͒BԂBzKB1չAQB?AW¸}L @mBT|NŒyIB@HBH6B ^B9œzvA|BsVBwB[BCBcB[AՉHB#n0AAjB(iA.AX[BP"A_xlAA[?=ID "W`JޣBE6BID)r(\USBs.`^BJ>09@(YA'w2lHRCkAA#\A4@ATA+BBe™d…)9XT e5?7/|EnkBA.0AnBZv3BvBDBnV, ?3Bʯ@BfE@yBG NA¤w 0b; jB€a|BdA69HA!BZA&B;: ?aV ?VW7BHnA/@E•JccFq»_¹%š@9L$: >=¶O#c9KLM|v>B6zV.t ¼stB M¤eBL/ BRdBȿBipQBHBNB*BBpYB;BB2:@}xB`A*)<>BcB>rAVA @=AgBﴎB6A%sB8BAeSCPiBHCKBzBB^HBWRB.A}Aʷ&/"=hx¯8BКB}®©_`w^ LBa,B"EY 2BZ/X Bc\:?B3BdB^u_3Ac`Q¦APyBBB$C=C7B~@BB&BpLAWBCgCBMCBBA'B+B&B>iB)B%@ABŽBP^ AΖ@BA¡k¯BJ AϖC9.*By`>C7`BȳC1 BB3 BB$*B1"BRAgB@,B@B(DBۢBF@"fA}z8¿EC4ioABfBlgpAlB(¦NKB, R(Bb]BQB"8BAhSJA`kBEBQAg2A:B&svC `BK e8^AsB oA?z$BBZBNB|BXAAzA=A`AlWk(FBQCB,^ªK?9LB^dBFS0کR\>Kw_@%v>NN=?8ꐾΐtV|\> .9@"7. >f>79>?B >)ཱྀ@?W>?{=H?">?j b*?"Rw?pNF?wDTd>r(?D,+B>#΂?Y>N/?}x?>8?ۿV>^>?.gkWC+.$7ru\?*??%?-ξp02 ?vv= >> :=DuE^?0=z쯿9\,==?@>>DG}[o;`>o>R>Df7Wپe)HFAp0j?#>&\?/ ?;?QB?h*J=<`P>=?WlvέkyTp?R' ?ZD@ܨf:?mX_>׿Aߔ?My?r*6>;/> U!">Sz{D(!;(?G??> ?0^"5>any*PX>ۛL>RJ?&k?7ϿD< z:œx=z\??? ?Пƞ*0]]K?*Cm*>E?4?N>ߗ@o>&fȃwre >?R?4?y}? '1P$3ɚ9$?nxx?[?e. >SML=Ϻ>ߪ/-J ѽ(?ʾ˽|?--">8>`w>[?h?T㽑?¤h=b ??:P>co>/v\?lZ``4>xoݜ? ??=Bq࿛˾!>;{>Fz?l91=`>$M[?z@x?K5Z>н&?#\?`lB>z?Dx=??>.O?#\>zx?v*?[Y>`^?%R,> >o㺂?$T>2+b5@,>KV(d?(>(2Ͽ )>I0?a>ʊ?׍5T?QdQ(eT$L7?>?6l傾>pL a3>?>2LD俖S?&$>>ҁ21A|HpN?:>ϥ&?+)0>#?.ǒ?OٖS+>>=#>H@>>=Ȣ ?v1??N>%?p#> ?zmȮ=?(XP{>2Wvl =+ ?±>VD'?~И?h#?&y(>qf:?mK?U&}2?o(6Z<>g3?Vd>a>FT?ζ.䡿WH٢D$Zb?>+>̴?>?Z:꾻>>pi0=x>?*a~L0?Sv?BBwF>18=XV?dɸ?f=ֹ@c> 3/>=h>r?*?Mۿ9lxpC &>ZU)X>?"~ )HM>pfx>??,>sO(I>b=E.(*?"H6i> ?J.>.=H? '\⾕%Y7>.|HG6>y>n?|a3?J">?LF?zޮ> '6?Y?} 6>V>G> ?jҾO6>l j>,>PU>(?2>D&?M=V ?>O? ?Y: zxþRmھ>=ܽ\tdPR >Ͷt V>Gp=)\?*w՚>y<?;?RtD (yd@? Z'@s?QL>p=n,~t?)}2f>uUAaMydA5>X?%7rb>˔>_?_??XJʾ~4>uÄ>M u?&^So}@?pͽpR>㲞*n?+ N8>̿ Ff>b>8,od?4޾ev@>;}nT>>?>W>=JSj_(>޿T?l?> 政b;x4?g!=S>~">RB?` vIҾ>r=ν{?k~:]?)?W?ae>?wf}L>j2S<>bed^^~>'?.E?^?/l,}־C;?CQxd>}<+*Lr͕y%xNhS?ٜi#? <>C˾AnvqPtmIk@WxݾS=Zr=>?D>?>u?VA6U?P?PԵb9T>=*UO?&p>;π>w ??bV?|]O!;C&L9`>>nܿ I?X[3 `,E<=俎?B?]f?f:cp0%b>07?Gcyk>X4 @F?3G@?־b?4=,>E >k > =7?2I=07<*?@/;#J>>r҄rWBKvۡg6 rǝg?<L5@ >TaW^c>pŭb8j?^ſ$>؊ M+os>j2?EE+^2?PKxO??sM>lrcp+Jt(ݞ =B>8 ?!e3?(~>H<&?6>ň=0?E<>>ױ ?Q/.|=6=sȾ?s>?W?A; tdtB#9>qPi>Bp F >)?tְ>d{h>?2TƾK>QM+]?vt>;?Vk>>|?~lG>4 ?O,?J1>`"?G?E?|ÿ,ؾ^LAd+D=D(\>n>?>?3@>a2?67>ԿǙ(ܿ'?oY>O>*>ἾI>?ˈ?(!>7$?ki==抿eſ4PĬi~ʿGǫ>[rY? =~SY`fn߾ϖ|;`1gp>?"E ?`> LƠM=??R 9־Wl?oOS|/=󐾝Kg쿃?i<"?s翋} >Jhr>Q>>D S<ֲоO?@kf[SZx>9=;> ??=S?U߾Anr??>t>8d=|o5(?*U 轕~=q>>>>& 0?6\ ,@Q?a~>҂?|?/???^_>-?/=ޘ?[?6 >>!9S4-L?4:㾴4=:A>?F%6r>h5?XӼ>$>m>Mn?{DJIĽ޸QfF>5??H?= Z?#>@?*??#?oh=P>П?H >{>9@=t>#=x?$>z>_D˷Tj?? >>r[ҿWByHĽr?Sz>>?#&}uY?nٳs"v޿Z 2={>?YTԪ?h>vfvZ>z>b>/'>$7SV̾oP <=?xĂ?eҤXp?e^?hcv?ģAFt>Ѿ-! X>[>ܓb? ^*M駿A Qs{ wr꾶̿E>&!>,佑>Ŀۤ? [{j ?#B'?A? ʿ .=(`)`>ކۿd>cZƾ(?w> ?)Njnn4oǨ~>,J?j?.>w?t=p_Uʾϳ ?r?p@{=$?@>5 ,?zgnsl2D<@?Y*?v@&o;L?Ͼ?)>0>B?X>īZH=:>r`f?xy>U?)>Œ@#;c?D>=">=ʜ=>U *(=5ܿEI-? ?=otW>N\o?=>5>(X>?t潸`?k? 2?`.?h>|J?`%j>$09Z:ݢ3`?j&>1>]?BA> ??3[j>> 80EI?.IDNmV?E =Dݹ9L?k>w>>+Z??,z>$XM;pf?s>,r`7"?>A>5Ծ:#cf> >є??F~‿m ̿]>Wg>?0?xF+6?N7 ?:ؾ$>%>fG>K;? >᳿>Y%+tG?,i?a?Ry,&˽;sBL><: >Z?>ؕ ⍿?$?6?wH?I?K2><xuFJLb>r:?HrC-?j>})Zbs7 ھ4>l>_=ZT1H>%#>?6> 4?Kۿ<ÿ&@7AYR=R='p?,?>J>>-?Z@w?=>P#4Y1r>Zфjhs>;c?Q= >G I>-?L?~?hpZv>au?0sk/??ZE?c?_!>¿A+g9?3ZpB>YP>7>&m>࿇Ŀ&j?⯾",K F?x bJ>c圽'>–>",>?*L?r?//bQ&?Bu?9D>a?>><_n?-MM̾q8MO=m(-z?5j>bZ?*??0q>L>!N>=7>aο< ?YЗE?8AL{?0^>??q? >VEL ھ;'A>5F='vJ>Mʀ?k^Qs;>d>Wc>`[2?j`?"? log?dGA!?.Y>h?*=]=6ȿ*Q>W?S`fu>֚? A ?@ſ @ֿQ޿;0KhLw㽳?Sü?P?rHHͷ0?5?)ɾت<>a?M>?Qȅ?¦;ڽp oک?m]OT0˾~#X?3nR9W~? |>>?}?dԤ?Jq?e:4Z d1=(<{?h E;>>?>$`>=>UG>zt?w?9>,\Y?^Zp>IWq?[(=#? ?>?D6f5,Up>[2*@e??Z>>G>=u]ؓ>Y?ʾP 8?ſ4?%0>?lL> T񎼤u>R?jn?v>a=^?Yf?jm:?EЊĸ>,tڿ1h> G@4>|j_??tXm?Tİ>%X?̿Jf1>#uL?kJ<,оRɰ?>Pm? 8)Ni>>|ONL=*8t?cY>rx>&/m0&$>lH BB>>}l?h? ׋?y({R>^Q¾mV?7~? ྋɲ?i??XuCG><_?qT? ?NEFxYP>睢?8Q>p?|uN?z+ ?:>'@> D?ǒ? r-P\k(> ?dY?Od4==0E F6)?1=ƾn=> ]>q;/>\=Xe梾k?$phH>/7>?!׾*?$j>ao?(?oe?4c+A ? r>N)>?F?LXO?=_d̲'>NƠ=YYvA,;?<ľU???ؾC\?@Λ>[?"?Q?^nt<뀾*Iv@-?Rܿ?aqT׈?`j>'?SƿN><:>>|??`FuKz>*?>B?5?r㽩k>Z>jQ?$^ɿs>ed>?h>T<>0ȿ ?Ԇ??;?'?H @?]FB=Ŝ?d>M0?n>#@?<#<>FER&s]U?,+>Kp?0?[w>`?S8?G>ES?HҊ?B>բ2?c"?= ?5v@> >2jQԾ:pX|=FоOj=~$Q?E2  Kfa<]FL?>uP>?t>i<x|?-kKl=K ?F/?"?I;?mWÄ澬1?6 ;@㞣* jq=ᰘ>`> ޮQ,+=鸿XL>>vHV?i ?Z'>"b>>?Z>'z>o[&!?'ӽh>/>d4޿u.Y0?%qg>΋Mx?*~>`%?aH5g&T?pt9.V8l˿#?qĿe>>u=:ɶ?5B•ZnRG²·&w¦d- 'BbA<ǽ ҾyBF9BBw?0„7A`¨7U¦šʂA(DiBOf;%ѠCJBxBaB=BBABjtW:AbBrABJ y f\+¶[9ZBt6.BBu%4bpBB PB.,K˛B>BBYCF3 ;@ZBEAB>C/6BܤbBA" B@r?BCABBARB{6ABR6dABs@BBԗ0BBt"@,B\\!s-‹BBBҚB$ZC}A}|BuC5BVC0C ;BB>:@B jBO¤AB6BCd=7#:tB&=MAq9#AB\™LƷB);B޿BsBs*@~ؿ8A땭9@Kg B9B9gqA AB¿BH1?&pA!AEU|AVBiA?LBE( B:AT.dBɂB|B+מX`A· {rt•/uXA¤n”@)M.BByBB2C(UB9B0զBؕCh{BZiCfNC;C]gC^KBxClB%D"B[YBi BͭTBi BJAA`C)oBNB@Q ApBB;BBۖ-?2QBtf&-B/BqUoAlBRfCB%oB56BצC+BgC18WB8B ?h²C ]Bܳ=s? >BMv@YB0#:+‚] 9ˆj¥ `vA.Aog2qB<IdB"x7B#LAuN-A0B9.WOp59:OhRCfjZA!ngk‰OkPI¢+r9ªO ZD±GY‹7dBY.B!ZA;X  />'44kn*/AWs)pAGyeAMbOd®eBQ»v¶R{hiXSR2© ¡Fж@›UL5WiACB;Av BQ蕼A&Bit–+bd…2D5uhBFBwR$( @>@hT'G&g¼[B@H@I?XoF1rB Gb•?BXdBYer؀AX8ZB(RAS4vB;sB0oB9BB@ ]LBV`jBP.E1B[oALOq@csA8TBgBSB[v¶LA<"4BKB*BjBrBn+AN[B& B@OBBB0BwG6A=B`AB?B:k~AT²BAAXHC4oC5wA.BK3nn@-€OANB#Bm“[s @>yxG>B?v_µMrBB BMA='B"B GBX@BmA&AveJBC_?Bz5@&ZBlAwBB'BwC }BCM|BBѫ^C#Bo+C/C1x?EBCAD@%B=eBy,B$pBAC-eBA)B8ۇB[C1aC>C9UBpCa;FCCT)C1˳BCBTB_CBN1B b B C)B BBPBB=BCBBZ<.B? A!+mBBp>BfBk*A?BUBlC D@BȻB rBB,BӋBABFBK) AiBJBNBқBkBs8B0BٙBBIBPAVAe?ڀBeA„k¯wA B(B[IJB*TA$ BoB,m B`(BԁA ?f [zLBaNBs“3ªBA?4>NB`A`A+BBB) “jA7BWۿB_BBB5@LB;B6BjBB1B9"?_9BO?(B2TBFGB YCyAaCBX@ 0BCl>C%BlBYBDZAJPB\6BB>@.(6 A3W A C ABW݄BBXBRZ@bBV\̻A]PBA BzBSBH{(B qA%I?l>?C>R>B a>>~>XK(?`<֐p;ԿGTW?ۙF> ;0GRp=5@\ (y?wM¿PӨ@(>EY?Q1q>’uT?Z=kLENkcAO]>?a=$>c7>GQ>=??ʾ >?<Xl _|~h >ٿ!?%S{vL?Z6ʿ1h?AF=T % ? @?B??02?[<=f7m?,!%>? T?e?M7Gxf\R?7Lj8Dgqҋ>{>l=&?>?Tl??3@?ccx>?84>\C꘿à >_d>(?qEXDݝ> KU&?w&ӿ.>-:?*|=)?Z>GlSM>zQ{ yV>Xi"@o0޽Ñ?g~T>DX(̞?Z?? =y`>о!RK2 ?Cnc%?rc?Ͽf>qb$??D?컿#..?HU ! $+?5?7o>e|Vv>=f?^?h>|>Ľ"w?M{>8* ? >U >?^f?eϊ*>JS%B#hKyݿq(?i7=i ?-?$x.?šC6]>OWBf|E?ych>znܦ?"?=p74?K?=?5?8Н>{??q>O> !? ?<p4dJ?e?2?8>rɽl>?? f6}?? >I>G>"{\? >ZDUx?T9= ̿ ?mge?U+?ID>>1>٩޿s!?>??P>FRAI?н{?>V?>8?uR>ڨ<>,=> =`=ty30 >@?ל>N>nK P?R>N~?g?2ۿ&}?C?XK?/`,B=4X?V?R\?#"ؿx#?kB?W(=0 N?R?i侞-9>-1V;1=G/q?J*켾?QCM7i?w?>&?[̿j#?Fl?/tCe>:>Q`&#˜x>C}>ՔB?F {4=vpXH+=k=s0?86YP>B?d# >δ>=q?> z>h?A*sW=ؾMj>#>%=lqn>B Џd* #?rĿ\1ļWP>:7d>ֿ=>Ӿ`?˔pu>>tI?.<*L?hN>+<> ?wl+\kR>x@D->V V%>"?hL*=N3vnE[?@|>UF;>p >T?ǻ?+L?+= '@?3?g=p?B⾾4?1?)Z?AO:M>I X?Њ>o[CUZx>B[BZR`?e>E.A2>l_B係,?|?VV>g"?'R?z>-|ԧ=<S>?NuMæ>[-P>j?r?˄Qޡm8`> N6UV>x>3 >?&u?hڻ>'>н>=Ex><Л>(8>0>J=v>tH>O?o0@̿JǿSLN& &|>n[>K>>!@5 ?'k=>kO>&º3侲οq?BH?&u?yx>_ v!IѿH?x>kU ^?.=pj/eY z}%𾀂\eh3`<>1;>z>Ed?V/=3@6??jMB+9?n:h[jRz,c *>Z?0>=R=.?t )?^ [qXCƾ$|>fQ+ M`^꾲J *ɽ ??Ҿ>0?]¿A?'d]>>V?AS?|?>=h0~V>GS>۶ÿ<&_ۄE>T@>?ѿd?/l˽|bG>^밿4[mo??2>!#??!?Su??<ΉpHF?{^0j ̾<>+ g>k墋V>ݧ>͛>?==t)>䀾5?ƽ~п>n<?Di>.@۾A;Bw@.4?$@pep?a ?jrj¸?3|=~?M>~;ow絽h>.? #>l=Z>E `L>w(p?y8!?]?>v@h>:)>m+?=6]?=Gt2?6>#$?(c?b ƿ9`>j?οB2?)DD?T=z=L@?:>?i?ܩbֽT?W쮜?TGt N? >f=̿̐=Ux>ܫ=OL?䧱9=<}Jؿ8;N=^Y?^-?m+?_ >F> F I0?V޿Xris?( ??*$Q>Rs>֜>D>>?c??'?'rT[ 2- 2Z?:?E?ti >hY?*菀>s/?)GvTV>"_?WX*>Y1>WA/ ǣ=.|pgw> >fX>z;\1>6?Z9˥?`f>5?>+1l?G}Ѿ¾>=lg?eb_h\o!>pJ >(@E>?EJ?.B*?Kg¾Hj? z˘ƽྐ}j?%rqhD?jq]=~`>.X? i??; =CGA>Rt \=ǿm ?iWt>Y]p>l>\ ?)=bؾQ ?i*?K>RY|nX?s00=

m?s>>|=",?J2>8uľ쿅>!n>Ϟ>4n?ǀ?u͖>v?<>>~RnFq*>?1>?-^! >9/IZO Pt?&r?U?a?wJ?n>ۿ$RἹ8=Ғ?K|?,w>[U>aƾ{l=,> X?Q=̾麾>ۛG޺wƾ@@?v=I6h?F?{(zڞ?%>ľ?4>)>>:xf?T<=0P?9`{?z?P\P^8a?W+?L;`>d"ψ̾bh>.-%E"A><`ӾUU> +?HѬl=I(>܎?T?k>H>¾\$Bv5쾮=|<'܏> i?O??-?=>f? =w`F*1?\Uy_[;@>nƾB?AX<'`?%pJ+v]&>S?UlNJξ뱆<==Z!*?u(?s2> (;O6ܾ? >t ?vp? Çz1j?Ev]?F?s8?NCP?f?K? t>v?O>ྻU>?2>Ͼ>y>~K=D?{{y.>ge@O*Ź>m&? ]8ÿ7-6\l#>gZ2/@>ɷ=ؒ>l?4>)*;'ľ(ࡾ4Ըhg̿oS>{C콜^;S@Lc,?P?uŐ>-=1><b"?=G\mU}?,u?p>!KH==SȾ̾$4~Z?dDe8X? d>S&2W迃^>ک,<? [7]1z&8?5L*>'?p?'n7^<X@>Jm+D#X_?j >H=/7뀽%u}>*?!>p?O UL_@ㄾD.@)>}??2Q ?nhnB>>UݿOx~>t?A>Lb>,ݧ>ҿU_l7DPҾ8pԿ䋝/J%2,@>4\A>%ʾ$m>lV*?hH?/?S? ?Bz?fs!0onoI;@v Is`>Ũ<<>15tv?::%@͂Ds!ܾ\?6)>A?<&ʈ\w8,ĕܾ\N?|3>M\?#>#?Rx?xL?#Ͼq1 :lA:3>B->6?^+?/Fx)>ʬƒr}2>c5?H>@b={\pi>?UY>p?&?M>={x??QTY>fiGAr<,`>e 5c<>^J?!կ?BesH]Í>9Tj! 3x?H=?T(ƾTgm>e (x>NP ?m&?>"؟?$>ʰ}$*V#{^='{4?c>$C>>˲x?sIo4Z(>y濢#テsӮZ]LQC>m>O

οq?u-̞(`&\Zp?/|s H>aϿ+>i?:Ze?u}?U>+$>,=?ȿIȿ߿S%l28w<ί?DN>K?*.>a*SN> >5(ᙄ̽x>Vż?.=>;??JX>>1?,>? >b?\ڕ?Ye>vNt]~璿X'MvooX?>OJeRq=: \?,ԾyӽRV=?/|bbq 7ҽG&cHrȄGC??{%>>۽Ia4꽏EwJK>$B?$?"?2ᅤ!C>ٱ>/4v?J.$Si?显C}" ?Q¾>6~5?;0D`\ʾ>܄4T>xX ?T_Y>n&>pۿQs'J]?0Z=P>ޯ>(ct+[Կ.>(ixM ??#n4a?jǾFt? >>VF.>UEy???J6?6=hۿڽ;?ƿ"?=>;n?T7V_?xn??}?1<;>?ھhz>ܾ?\x?T߄84?F*8y?ǻ_룿8>޸b=pPܿ\>I?-Z?{\>r8>uO&2:?" ~=ۜ>w>x)=P>vP %2?]6G?ýd?ni()>$'=)u4H>ϿվBTg?a?>e?5\5Dš>!j?"?M>1_>A0䜀(T???>>v<˱ I>Qq=7JB ?b>%?fMƸ/b19|(oH?ݖ-qq>8F7 I?1>8@վ{=ֽ0?{=S> " >@?HW>\gi>=&>AԿ+tϿY? ?= `ԏ>7 >:Dv&n9[=6# .oj=t4D>:I>M=ƿŽ>%S}1'v>??=R>:=0/R>&X??Kо΍zyϿ`A?4쾚6%ۑ?J}<`"e>q>]h>t> K?M=\@=B? =fȾy&ھSX?i?8ԛVG|̾=2.=8tM̿2>D㩾Jdн.N>+<<2 >}F:?6sb?? >y=UX?B`O?Y?zL5FsMR>*7/r W!>dF2?h Z=0oTY<<`0??}x@  >樂IGG`?)=p |=W,>E>>u 8?#>[?/>.#L= @>n3?\~>/{FPw=o 0>>> 6h?_?2U<3оs?&ߋ?Bk>=(Κ>t\WƾfO?Z0>?&?"ワ"*Jx=_I.ˑ=??ؗ?p?#>$f?ʕ?oVοSCF>2* >?mM>ܾPXؿ>|dHY)">.7>CmxB `BOAB/LBAB<>BA BZP w@xAwBKA‡ Iٻ„2!¾BF?|j3cCBRJJBxžDiD+ٖA.BufA1§Fc<-8BX@oBRRs˜bp|tB}VBBпBnjB.[1XUBWB!B.BuuB5=z 7::5^K@5T> €,tkAYWeA=Xt'<ɷŽ'PAr2 \JtY¨0AB5zB 1,05&/uAǀH[c‘= } _@{8B+]J&@/v@kƒR" BZBЇpA"r7(JٚAٕ‚AҟBu)E-B'}B+B2A/GLA B:[AݿBmyBBd9jBh 8B BXHA8i\B`4 BpBG–t-#pBd[;n©”@AnBB U4B P>W(BqYB{~”c@/N›>B\NAKBB+6BBBS89A1AŸ“½&CAI;BTO 1*B`B1(BB/"A/BHxBÝAyBf~I8/vB­nB{B@4B9C o:ԱAiHBrbCA'|B1{K¦/A²9`Bl sAjv M j#¶,?€A .q^BVBDxXA@Cj2AYQAE7@:ªeABL}9\Ŵ2J3RfvCNBoRBe[ ("!B\BWQ"rB{ٜABAd ,A{JB@BB,,BBUb9AuA C"B:4BՔmB8 =B\B‡A-UAw³T``Agh~AgrrOB;jvB*;AEj£CiѶmc]VAAEWB}S(0AJABIBSAB5fBĘA´$B|dˆoˆ+@bCXuŽ h]VgBR-BAa_nרB#'BAڢB]|#>AB5BeBBFBZU v\R‘0zAm  B:bc""n½>z›g[Ah‚)UBB`7¡,Q});taFcf†"FCݪBgCtBAACvMBF>Aoՠ+0C1cAB^BI;6Ai}M=,yAucϴ-½0{@| ”3jb^BWA+9AB,ɏ1m]·m;h@Rs@‚2FCOubM•Eo9Bk*@^@vBdkA(ANA# A@-AwA A:BBiMWj eK3BA0Ŋ?#@sb9,J$ =&F‹*@/zJXB_:B1ZamB\hDA+B۷ %@.zmrtH µ®?,x\rBo\B\¸\AZ‡@I@]tBY{Lz6]@a AdxBNPAY)AҪ>’-B D  }KB C@@A6Y@G3A@d@B)Y€*ArqBLC;BsAD±Dݙ|Ԙ…ۓ78eB2Au+ ~\B=B( J$w‚BF{!L@2‹ ¯HAX©l@O B_nA qBAB<^BdBc~B$(BβµhtG1zˆS—0‰6c*@,B3\B:Ŋ/;ZPAʢ:;ALBBJj dA"BB&e:ˆBAt]y2ACOd0lB$AKY?Aw0eZPh~›W¹ZBKAN_7sS<;pBb &Rt70#‘׿@IѺyjj<`? >#(> ^>b+^>rpy?Y^>>cV>7j>P>*V|>'?1v>,>>>Zm2>/?@ڼ⦆?E]>>ɇM?C9? ?pX?W?>F'Rp>_T>]/?#>ƭѽ(_oս?b2>s?T:JUf2*?dd?Cv`?>B3=~><9|B޾=?H^a=`>1@??XH?,5>IJz>KY 9Hs>v>h>FMɿJ?8`?3ܾ=O?u?>>j,<̽61> V?EHlH8W%i`=yr}PV>a>6ڿ%\DX ;g(?`B->8'">o(?2R> i>i9Z$0>b? *<ϔ?;?H?@sW(TZq9?Jb>jҾL#?iL Ծn`=a0>*x >|潇.H r+?*i? =-(?0Y?le?N>e̽%?8J?gl ?wOڽFxI*> ?_>hx?+?Ͼ>c? P>](j=!,>, Ll>Y憿>Ȧ>>fN'l?Pv?{??@>_+>ĉ?L??>G'NX~0H> ?!9>?5,C?FƾՄ:>J,>zl`?3L]@?>r-T?'?4HCm?.ш>/w]>ʾəxlZ->>? q>:j=>lO? bT?99 0tNd'RQ?7>>@rxNҿ7vD;?¸<,.>>HRK>KN?">٨?>pT4?NQ2?DJ8>hB~J6=Ep?x?>TIT1>¾|>%~>,!{??1>/Ef?"l;??R> |( Z>|ǜ*n N>>P?=?)??0>?tؚ? /ؾ 9^MֿU~?9K?>g/? Z1jD>>3\-%>}?Ȳ>܆?zw@?,?>f5W? > $rvz=i>O]?=Y>UC#ะ>h/ٿ ? 5`o?1Sp=\>ሿ?e<>Ou>rII M~?f0hG=mQ? I>Ǿ>nf?>@?QվWվ?*ddX=k սBv> 4<3?jv?F?@>@=>??F> ʾ_Ĕ(F|>'?Bbۖ>K>vq ?^8<>¢>ء> 8?y@5b??2)`ǿBė>$#K?N)?RCoCdj?l>~ʾ{jh=0 ^#nϿuU/*?T};ھ0>ߒL=ξs׮?E?;vR?!;~9\??\:-?>˚Tbgnl?otD"?_q ۨ;?mT?)=? tmL?,)%,7=G_?Dz?j俣>7>Wb?2 {9=_>'>I ?`O>c];M2.6^=Fo/>?)? ?>9>?s^Ӭ:> N¾> x$=?b>_?>2>-?;m>C?:/:-:?+ >'ĥ|B4"r?'me>/Լ| ?.f˟T=o>X ?)ʽ!=?n&9$$>V@?~n0=̿f=Hϝ#?ؿ>i=̔2 <+<(>y?<0Y>^#e}pv>p?޾kꬾ x? pF>b~?X>]!Wj(?2>,:=W_4ȾQ?)6?QT!?Y`?3?D>73N/yl?Z.q?ؿVZ?5nd)g?MN6?dg ) > =?(? @ͽդ>@ӽ?h=>{m?aݴ݆G>>y0>/==ƾ_&TQT?G>?fͿD15>ׇ6Q|r[?^?/#W޿=,O!܀쥐&?lr>!4`KT+,??X> ?>D~;&h>>2>@V?<JD#?j>˿Ż<>Tڿq>-B>>_? ?w>D>Š?ud?Ⱦ%I#?d?>=_?ɻ?ʿ \e^P?jh2>p?>2Vt W? %,u>-=e0?$>AN)5=Uj?.m?m b>J>m{hUcz/??%L=?5.>0`?g|>Ɛ꾮?.Ӿz73 17Կ 6 ⿤">1ؿ̿#!wr?H?ÜG맺lGP??] I>FȠ?z?Uq>:?*+#E?v> Ҿ[?l *D?V?G->==?GA?<( }Oզ??X>jw>ET]Hí>M>?&=6c?B28 Ez>GTڶ>g/?=0D?U9*T8<1i,Կ5'>4?EW᤿"!2(==Bн>OCzw ??G?IT2oz_ߧ¾:>>U?5; >U'>_[\Ew?J־B*(Pn?yNb? )6j?)L?ɜ>>׆=ZY>ϊd?\;iI"T!h>?fB3|1꿆b?>?oG+p?3?l?|>ۤ>^>:nȿy>E>64%X Ef;ڿi=Wvu?Uj?@ ?(?$c>? `?L)=,>*h>ܿ1?;2=YM?D݋{4ץQa/?> -c̿?U.=L?Pe>ٔ?;GgHfԿĶHP*0xJoG?"/==J&za?D>}Z*?N-?`N6X$zQ K?`!ٽ}>:@?Lٸ!?ITa=.>[8䕻9m?v=q?,(9"j3c?o'?rvo@+־C>k῅ ZԐ? /?!N=Sd$ b>f(!rX>N>B>;Y=\ٿLg_ؿͨ=Z? 9> |>c*>PSul?C>^?N?>N$4p2Ǽ'=H>^Y?T> nG}7hR=M:C??R5=(׾Q0a?]C?ɾ?y>]]>9>ju+=.> >*\?<ܠ,#ϼ *=Yx*?2IF?ľM-s?>H>h&?3?$ϥ?$? =|6%c)FIѵ>>ق&>?T5>G>"?V靀N:᰾ڨ⿙#=]?T>ؾS&2Ġ0>h>>8>=鈾Vv-&pd;5⻵pž5vf>4"={p> Tlw*>Uھ4hf?&D={p> Y_?YnfZd?)Wbm8ꢿ&K a߿,"&?FO&?0 IFb8v ?9~>?gQ?|=p<\>?/#'>A/8>?X?$tl,$ O??/YWU?;>`Ұ>[m h?N/¾8=hpp???%>J6. .־?O%R.lT7I?Ei ?q)? ?׾Ͽrh>OR=N?vX5d?K7>׈ǿ`P^[xzi=>P+>N?#>#>pN?6~? lf?9?U*?E5-{>fl?ڀ?0?yٿ[>q?[$U2<? ? x">:?Jᨾ jeSnt?b(a>+u̿ ?ň>A[)dS>lA0Խ\'?V=iO :V &˾r,?v$Qοf4L.>F?s?|m6[?> Mձo3?GkdR$?A= ]B?R0?߾|qP?_?TLd7>R?Su=m0?8d?\ĭ<˾vKb5=7[^+Q>4?T쿢?5?4??c??w=2>$߽y?<]̄?׌> ?Կ=g>>kqN?.kia?#!ҿ>F>@V>W\~=$9о2?|T?|- V >1?>?VmL>}e ?DнNT?پc>=$0>މZ5t>)Կ ?U;|V:>Xp?*q>1`MoP =|?!g??P3?;2?>*?lh>Zƿ>4n p "J>b[=5>b?f `>SG6??5i>K)>_V0> XZ!h>D?c|Q"s>#ݾU5Ӳ?ةR3ʅV$, ?\?U?5>i"?hU?ҽv> Xнݐʿ#L>X8 >n?"\.?4?3[E>!C`>0R??Y;j<>?; m>뉛\H> 80BNܾR`$Ig?\P>@>XR X#>s*þ>z皾T(0Vr?/9} )>C? )|^=|?߾[Yz? #?>i=e+Y >7>Ů ]>Sv?(վpy]ľV>곉?A'>^4,?:.$\pelj(T?f0>8?Ҕ_?O)?wO>ts]?)(>N(?&(>4>l?kF>.sZ=,>"ʽvx>f>Ɩ]GѾ@UGQ&>@O?G?~m=Zh<"4 rr?LX@>GGN~&GCF~=GWp?l`>c>Z ?Iɽ?%fJ;?d9t?/m d舾ת=즠}>_^\?Q-<|F{?>:^QG>&r9?j]GBlq?%ݢ> tj/ mxB?{}([?H?%j=>?)Ά>9?SX?f? L> >4> AS#'W>no`?_nb(r\B$>&W.=bPyy3O>@_>~6=Ǘ=*'?^ ?$H>? \=v|j?]>=+qJlwG*?%fMTt>&?z=ľ.p?+KF( f< S>_ z9ʘ.B>nZ9~?Zo?ܱrFs~>U /s ;}ͿCV=<>6?>l[ 1rQb>v?V> h?`N8?C?>6A?f댾ʽlǃ>e10y>Ph=?Fq#>z]ؿZֿ[`OEۿ8쾡俇ol[?z얾[z?V.k?Q#:>?-4=TK"‚E?6>?Au?}<޿m=>?Yxl7Y@Hi==۠>5f7㽄?~*?r>;=? ˽.>,/̿\=lq?nd}?t?>c>@Q3?x%b=Z?9>[h>B PU> >Ը=]-?h>>8?;>aT;?C?=L>>IʼP0tؿ2>u,>@ >Ys?; ? 5L?n-6T >ˆX> ?zT>>!"f?/%ʿ??\^ڿ1?C,S~]?U.⼇<?$?mI\ZV)j>L濆^s=1tU ? ̔<[?P?>HZ> WN>K="l> `>tbc? >۸Az7?=[xn8L>N| Ef>z=I0?{)Da>54:DLP>l%>?jG>(?,g&?d~ցA=B BDB|A@@s AN&Q%ŸG ҆d0B˿`BM&zE_yœ(dB6q@{AevBf[BBHBBy/BafBAi%BQBhLB8hBAB: z uea¬SE@Q‘kBŽBĞ6BCA pB13bn2$?0k3-BB,fm#AhG׎BkX@`A<A5B HxAUA B2@Jg?!¹ڦ9c/58!A:WBBWB{G]A¥B૶BD&ËBj¯r/nAABNL`BYDAڸBt=gB႖BY@B(UИBaTC sB3CŲB>"qCDBTB DCiCUB5BBB#B^FBlBXBAAd‰BVm+!AkBlB‹ ˜BbnxxW.|BʍB PC7B&B!\AW$B:)C)CBvYB>2BHlCMc-BmA$Bj?JЎB2#Bu@_An-BszP)eBWB/iABAXBC?B&CB1BYCTA8ByzBB>CRbBԓ>xQAB]BmB BBh A*BBDfBjpB@A#iBBq#B`BT*] C#?Bm:BUBABX?K?rB9HB<;B!Y@Q@B= B)E0AL.‰0C CG¤8iAQ 7YAߵBAk@`AB/vBn)q\ACCAʽ4Am q@׽CB^ A.B$Bt7_BALB3;BZlBcBޗBeC BKB=B}C( F.HBDC#/B B'AC'wBB6BV"BB BюB@B,BR#B BHaB:BlxBޮA)BtBoEBYXBw2AW%BC CDB CZB .BcVy^C->BB4AhBCB9@BBB BBBƑCBچB%3BpvBopŒBR5?Bj˜aBAdBBC4E BzzhBHBA B-5 bed?J]‰gG>VY¤$5\o %Ϸ5PR 1Bt-BEBB|Ac7AB*BBJ6AſZBBsIA2*.AϼBB!%RcBgw6[&A5X•*AIgB B^a^`'B*=@uX7`B%BxB?@Ɵ^B6ª6ŒTZ h 7-AsB~̴p*.6A" 媬B¹5@R5B>wA-BB@0PBB@xOABihBEBSBۻB@3j*AXBN@݉ABHmBj@B!X WYA$jo³(FB-iA|BVA098gº@Zu^ §]FA ¹O]hB?BC?#BeaA!*„L#BBAoZ¤@lYBAY0A) B,B&+BV$ @6 BUwCBԽB$@XCCNAA{B׮B PC$sBCC4BAp)CC BXxUB`¾Y~BPNAшOA A);fBBnAB~BBBbWB*BnDJB-:C O(B{eA~4.AdB5@@ĜA/e,WPBcB>UB;*{=x)IAy7B9ANItB#)a)('cAy B@Csf@$ q@\pB 7B/B[«bA)2•8AS RBZ|ŽN]BZbB S2r t@v|B My=„Vi(nA }AAb5 A-U*MHS(^ľhZ ϸZL*> T4=΃c7<΀>3,>nܿ,1>oǿ71>?B>@?,t?7?>$\O> vYRt,ZE4"T?j>>ֿXA

-ֽ&\zc>>[?>+?F?>2>?7prNpw?5g7}y`f>9?R==6 ?C ?ep0ug=Y>?%EQtXо5?b>祠>W?5?U((:db=P>?=+>6?g^>lT.a aٿ@>T߾nr>#1> R8>M>C?'?xv@:XF?T?c=>>8ZX>v>j?S@aנӻ>3U =?QLZ=zf̿?f?^>-?>M>++ ?A?M???C>>`>%?F=t?OSD> x>"?H=j@EUv?=l<0=(nr(=׆2&>8>9Y?N1?(⿄eE?9?k,͏?pe gĿbÊ>I)?z>nrֿ+?f?l8>^$=>èR\ľ ?ٿ=̿2Ho>W5%>F(>=l>`u?є??ʷ>V2>?Bꟾ1pg]м~X)Na:,4?eA?ZR>Y=א?0)D@?b̈́>gK?}>ɍ?v̾#&ЮK((>2Fڱ?Ԁ>6>`jh\> :S`4hY;@, >>-H>Ξ?9˹.<4>i>Kq<?#G>=_>0?a>e?{J> >焿p?/ٶ?_Y(>웨>cT>>++Y@gGH?''=AjQ>6?D,?p?b(?(>+<6>Ͼ !>? ʽئ> ?Bm?K>sb?B>=#R>ϭ>d2=m>÷DF>XL?oԿ\8f> kE`Im5ؿAAC3>e>'ʒ>՗ =c-J>E>IZg>4ܼr>)E=/YJ>RMJ?A:T8>]fcgu~?,>>*?#?f>e?>H?0_?Zѿfw>M=.=IAȿ.u DF?<ȿC,>\ҿ?B=v?0">΂oi^?V>5>P>5CT.>uy?}v>>L<>Vtȳ R?79Q?b?^=( X=}n?NK?Av޿?}+^?p+I<0?c X_>:RYU;J?~>#a bx?¿ > >_? ?gx>8x?=D>!I?\>~n|d`=Ye_?K0>y68徨׿/,>7s.PZ wп?O?"澀R?i2=D\O(^ ؾ>>_r>c#kG??er;4?@?D>R?Y>)T߉<^t♿B?Kd>U>`h>\;>J?38\X?n=>/> 05 (>R?BKĿVF>`RJs>sFlH?g.3/=0J>&.?p=;- =e?$wR>6%m?d?¾?$> H?IJS#m?ڝ?{9M?5T>뾽xJ?a S? !=J04P?U>E?-->a9>[J=ߚ: $_>?oJ?LE?4>^~i>㢡Yd־\o= PBJ޽:>!r&?><>>_>>}?-w%?]>eHr~c~=|H?Fem.M?F? >?\h>l)\&K徣?ev>?fy==,>&?H{?S?l<?>R>.>bh>'?rHP> ? ??-{p=q>aGNx>ÄN Ӿ#??E/ֽ^_??[>e?;v?s)?Hiu?5>1-?x*>4U(%>TKM?3C?ii6X?g|ܺp&dY$?(>P3>( ?=>?UIb= :]Ev@?Sh-}L)ؽъC-">> (0Vy>(> b>D䍿Fq >w>>nF!??,C?$$?>(d(?`B ׾=Z?)=[9>%G"C!>!|Vb\@֞M~%T?$?j¿Hl?1?h'?m=[p?,hJCO?;2y? /澍f>ڰ݂=4.JF >V⾷6?>J?p?gzo!?>?wI=.^`;kþ <>[?"o?C|]>/?F>x*o?>?"ֿn6C+GD?59`t&?+s?q)r<>WG ?w'B=,@>(>i>k- ?8-<O?XL% 8}?>Dn@! 鰿ս?/=C -[þy࿯"'-0-agܽkp?)4?<%iba??X&?̾6>>ľy>RANMuKܽ hؿc?D?|Z_?o>@:|o >??>;L?>R9=@>=vV?8AOx?]>?>n _6?\ >࿑fP|'R_>lo&R?wN=>_r1`C?)*=? (=qx? 97/? !L?܏'5??UgKH8/&տ э4=lh!=њ?k?6*>LF=>ÈY>zx?iËydg?l?z?k??>>剚?%6? H?;>< ߿'?{F?=bݘ>>p$>PONE?0ht> >\-,10(H?@??Bgk>34^#f=.|=D\??w?[f??vʿ ң?۸u#;7B?dN)mq=(?.M:>?*>Rz8ŬڿO#پ`Wg]=OJ; p;~@<(IR"}>=v :Ը=`>6?j $7>=%N7Pn:F~\?̔? ~?G~>8zh1>n^|=(8?,MB>p?1h?h&?2>,U#9>?yK F,Dێܽq?ҕR/x?7Կ(e?4?&yf>dd<Ľ>H?wS?H43>>|ȿ+n&?*R>I?+NP(q6k῟m|? *);L?<^?@Ȍ?F5R?;z=٥?L i>F;?b/K@==п>K\|>y>3lb?a>_ſm&mf>\ǿ"jFC* T ==kȿw?N: ;Qs?R>>n밽>諭HsNEQ{ha?5[ɽf> >ִ?>?t>w?>R=󰿈_v?M*P?оoҿփ{@@\>juG /9>LN?9>Q#+b?!>[RD>|ٯ?*t?Mጿ>6? \9)`w>8?>1O>mοT?n??Æ$pH0>Mi=ݰ?u>j-8_w5}?*Ӿ20>$>>'|h#뾔._`.>rٽeh>??c>!^w)^Y?>ȾrWɔ=>:T= j?D$>>gVT->?|J!?>`>A?==={ʾ+V>ט@tOj?x0>,oB5T}?, ?%>,S? }Ov=w{?!8b>醿qy<(P?i?#Z?t}bo???s<ۊ> >?;fob5>=)>=?+?J=TBC&?z >~?>? ÿ4Sr?۾ROUpRs?R=c^fCB2=? >f.>- gB쾡 >@Β_? 6?uLvCex>ŗ>`V? "gS? >@I?e>BJ?wt?q>q̦lMٜ?-z? >u\?bӿ>8фXt>c>1qV! />oZo?Hn?_*y=?h?A3?Jp>r 6>2>R>nh M ~G>u>=Vf>=Q@?Oμ;;Ԏ?Gg?L=X=/=A?G|?,M?x>f???P?}=P4>zjF>>"?85 Fs><6p?H||~,>d<п?~ O?W=?Y\>b? "=h<@=S\?U$?&)?":D;7*ѹD9/J?7p?\f>>e >;t?GXjtaHEʾ46fS޾8:>>*ȋh==$>]Z>?6U>^k>I;h">(ľQ?AI"\}{\ ?竔>ˑ?>L> 5@>_>(hDg >: ٍ>?ҍ4I~>B?[z>L>,?8>D?,%>?6=^0/]~=d>in~?d>oþcQ?$?R~2?1J>rz>4b=*`>%tt=ȾL?+ ?N3X.#mS?}U>Ի>0y௾_8hL.֤i>4^X>̾N+PY>>=ʂ z8>۔?/=>jbM?[0?=~>k>X7R??qm; z5[?,V?V̾ Up 2<4j>Rv%&r$ggo(C=sN/;=`=`?ƙk G"RH?|>- 2h>E?/E? >/sֿ'{>TX$˜ ?@п@zY1?zH0>\?.=(Pe\?=, "꿃W>,?þ@8)5Ŀ6jh<>a?t4>4Z?lݾ%e>Fݭҽ8=z%?:hܿQ?5k`Ta?e???v>23 ܿw?ۡ=T?ʁ?!>/)>>?ʽC:>* ?(ej<=?u⫾п5?we?7>;ҿĿ[?>!L+3'`>h¾|J?z?"G.xd??h>zJU?y߱!ݾ%F=S DNv>n$  ?z?W1?K?60>ZL¾s(>Џ=]= ?e:4>T7*ݿW>YM =1?n*#~D> ?KFBҾhR>?Q{ l~=`п8=6򑿍>Ӗ˿&2|?K\>þ?#@ S5>?q=¥ľO> h\?9f?M"]⾱|>m6? ??:IdI>:T>?3X?>ſ >>=>9>{b?J>D@ϳ? ?)|ؽZ%뿐aVJ?Lq?Ry𽑛# *?־S)>nJ>ȵ:?et=T(?;ԿP>"BOFl=X1l?$!?'X:V")>>)-QH\?C<,\@ؾ%'md ſ!$OYw?VRn·u->x>iH&=4>A >>@ >'=x>B., տ pVѿ܈禿3<#?=4=H??2i3Ef7h>?g<>d?.?r';4->?ȹHp6JU?2=Y>?[P>ѵS?rJ5>>b.b3a=h|_G?/пWX>Um,ɜ;%>_CMk)?A;>I>V<ح>?=<>o9[h?'ȽH!\=OIH?>Ȯ5>d==4;?V<?>߾>ƛ`>sq!t>=ܼM>.ۿ3!55޽ ?g:.Bdݼ\ ?} \BsA¤€BO0W;@^ߕh@;$BZB?&B1A?{O*,®YS?rX‡BB<[|'=ŊBORD[|B^K GA<,A$N?.>A}ABdB/ |Š3A1=},bm0B~WKBp1PN¤*C AB%1Iɖ®^A BA5@}C*PRAq¿ŸzmrNBBBǂ˜ѿAA B"B%A\ABWjBp{A/AeSBdCBKBUb^jBdBhB B?/upBd —B,C1BQAC0CB#4B$*Bd Bm4BlBvALzBC:XLC2BC_vB؈AhEyB@}'/.@0@8BFRoiB_Af<3A/Aº}@oUMB=BeDBBECB^1C9~B C(BCBdBɬB5AoBZC*Ag@VlC,SZBB`}B$BoBB CtBUIBkBhC B|BEBB%rBKA/AE@BBPdBELEBN1?j A, BO…5$YkA TBVB B<B"@^=-,!\BF‚jAۇBBV0 8NҦ =¿ zgBjr–DB"A+qAtި!B.467*Iy>ADAB B'K?BcžMœ0ްA @0-B.A} ¢\AL½¯;µSB*%sU>1·jf &`¶-$ZAغBc<8 P]b$@S\nB B¤*ƒSA†/@BWR"B@`4@½9A[ A-B^sB#JGmOlT®.X)\F #B0BrtB~Ap&B v[#DB?T~YBABe>$9ˆSDAi@;Y „?$@’—,BOTB@I^s¤'§^^@0$x>AoU?ʾLj(bΚBoY3AÁA(}@V$@B2cR0e%Ak\BIjn . ­g@61B|?b>,acj{BB|BÐ/P2AG15tBߺ3; ²dy)BoBqBeʹjVBX<5|ANT`@f0+ B-Bw]*A00CzxBVaC@ @BS` ?OYA{A%8@_Vt;pfœ3Ǎ/QO/ZT1B{L ʹB>´bOAĶBAӣB BSB5dB4BƚC+F1Ę)8LB,+C AyBf;C0FAyNX@HeBBBC:YA?ՌA↛B&Bg"B|*A?fCrBA BAIC%9(C7BNlC+:BHB1B@BxB;A07BɄAC*]B),@BBzCC-C 4B2NBB&CQ;6BՉGBxBBHVBXBn>BoACG?,@iAtf=BnBCZB/B˙BmBURA@AB:B%HB_)B B%IPB~AfC,ECIjBzB@B#BbBdrA$BB0BW@ɺ B0B,L/"AQK%AA5SBQ'BvBeB BBjy=$>%?&=' >>Lw ?ֿ ?jO>?Py>O2?p,Hɥ? >IƾV>+Q3#?Fǝz'?4d>?b;4>B>Rr?>5bԿu?=eң1 s,V?>|;e??g<=D>1ݾd???`^?>ƌyS>?!.=$ ?!F?O?_6Ҿ'?GO^00=:dh4˿>/h?>q?<1e#*ݿU">Gߖ=4'=?JU>?r)>Asٿ/O?4I:q?%x=r\?]8>0??,~һԿrt> >W lX>^m=@?N܊>=to?+aiO?i4?ӽC>Op ܿ8'5ռ6=*p>>F=Y?d\7A>N?ƦU>Z?!"*?)?Gpٜ8? Wҿ=tPb?,?h>}Կ.yվ4;c=>B?(>}W> f?D;4?? =L>lMm>zs~,OuH>$t<8 VV?>I<8W>j2>6zx>? _z濟>&@1* >?b Y?A3>;COwRzt? ?XP 4}< >}?\(ܿ'n5r`>f׿2s0L-yys׵mNlc0?a&< ? B(߿!>?clE8?+,R=@:`wC?ҿ~ycY:|>C,?=P`܋?aS=׬[J߿OHFQO>E<v:$ o1?Q$&J? 2I9sB$?7C+(>.`>\,>n?T$M`@> ?1I>Z,>"?nKlJ}G7>Z??I# ?apW@s =LU?}6;#`>??uZV=>Z >L>_T?0=X'>?@>x)?J?_9갿І?/>\A=t F>O$vԾש?TJ>*3&==}g?+£>;?Y?,?R.=ؿ%>g&iͿ#^ n>ީھϼ2>>@WV>*>>νY/>>ō=[p>(wH4Tm->Bߢ?t>OZ>&?>ھXc @?.YXy>7>>Z=`>?!ʿQ{Z?:)2<3@eu￳&Ei`u>r+ID&c\>$,?u > >!e>߰$=fVԝg?BrkX=S$?,zhG\4<>(=?YR˾Ұ>?MW?{v=pd27V8?"N8:6?Tp6u̾` o>i>Mʞ|6'>f,?$>ҩ!>*.>;~>>$p?.1L?A ?v.=q\hR!=?2>ѫ=C&=>8>_m>>=`?v'S=9>\~?ݿ-br>]#?ɮ?)XѿhS>V?i=?)l5h?x?`xپ۾Nh6>̿-VZz> zd)yS侽WG5:J1o /fR)9?h/mCc #>^u<&L1N>X ?vn|![>ZﶿNR a$nbI`dWg?>X]`r??y|\S{?T>|=p=?? =Y>=>?e:4hؿp80|w4?x?}>.?v?oz>G ?@:nm{[>J,enX"㘿F>-ʿ;? 4K?c<Ϫ>?Zo >a? ?t>2v>3P1,B?)&jN=bή$#x HJ>¤(8>{wL^?,}>̡y>7y4𾫝?I?Z+ȿ7Z#$)Tt俛VIg>w=,_?5~^>F߾fG1>?iM?ƾ?%u(-5nǒ\8&>Y;?|¾>"H?ֳ?DnȾᔿ[73l>'H>>Ŀu(>(?VY?I_,A]ᾮKr>?HEr|2HDQ>ۘ87?CK`~?0:fӾ86=d8 ?'?;Ė?A>EPJͿ=WtO> =@<`Z>(>+f>'ݾ7sz@:l?ji?Z ?,\ѿKe~!JOρ*.|Rz/*`>Z>K_*E5tu_Wʽr?/̾!,?D>d?n<;wB?|>΄>OAhhԾ>΄P>xڛ?(Q>˘>h?o>Eةa8YrZC )#u=+? /51f?->|>DQ?,>SBOZ?z?[ŧ?'.E?)п s9TmA ~S>fuĿ6?U>@:dx$^6<ЄLY?sw>=>r zp?Lr?ѷ'??TQA>D?xkM?*m 5=|S~g^?y >¿hGRCK?D>PA>թ=7K? 0>B>пL-Ծ?ƹX~7=J?RQ=U>W )[?>  ?=C>^9ߪeB=ȿ t?? Hc?LiTf?FT?? ÿkt?89>ڸRH7>&콧> ֿaֿVh<>==w~?9?ԈLpr.$?>瘰Zн(HzLrA?k?Tpܾ "žoT?PZ=ゐ?L>+28M_I@>{P=XP펾+Iп DɽX0z.?4'>F>~ >:?Wvz>^?3ҼL=hf?j |,5?d㶿1p=K*?4nȇ?V5mY>h0> <?cY ~?s>>>!m?ts?{80k=>KhIzcT"xQ>=pſ?j=IЯ>F/?Wi?cW?G=ܾz8>& ?| >86kX>?H5>P> ˈ3>>;>腣C?h?6>%,??+H?![X0=|"k= 2-M>Y_?> @?w>?,?Dټk(>t?DȽ@.x?Ž:ht=﹘?8|>BB"<;2? ?)1?SQR>j?PH?z[er Fk?ٙhE۩>=>Z"G0>O?2k?(U1?(?fM?!>5~7qPnB¨Бi=G>Ͼp~tE0=kv;}(w?^L>E??^$I?x>2>ɽm? z?[p?>4}%Kt w2۽>v?2p]> d'>;ڪJr?">$~ҿg9>f8A?C?$7l?B0?r>"???[?IԾܔ9w6?'>w?#>%m!>>Fv"@`?v *>l>;0pV">?z?z^?*>׺?_(?<0?3P?a1[jͿ%Ϙ>>K>z{>=>>:?*?I %H>ś2?-Iʿ?F>?6h<̶@VF? ?B,?7?u? ?_?<]?Ns9B>IѺ>nE4Xо7>$ξC?^>>?ľ[ڿ&w7V<3" ?FZI?6 @H>3~?OYNF=?C^?/TOv?>.\9dbAƒi-;7a?{?=k?HXR>Z>1߰?Lr=L?FS=>y>g3/? ? I> ,? ¿(_>JH>dӿ=>~vk?ޗҾ}ktg?.T>)?>Y޿=O>??=Zvr8>+>n0.h>F 0??h K#?n?X>?I(>Ҿ5V >*c? ? CV??D>>a?O$>*E>D?i~N>zq>??(?|E"!?_?GeVGʌ>\qfhC11?ƜʽG?O5=M(?-[?X?HL[?F>*2~>J>(i(\Y>? $PvȬ?s0 ?sl =ZPʶ?' ?¥(f?BZ8տ*>-$J?N2&?At\=4>KH ?8^> ^wP0<>lľ&? <{#=.L>]Z> tA>=8>6?34n<< n6=bp\?ɽg?T>Xwp? ?"@?u{5"$FU=LK`>?d=X\>???F6>zo?4?c|D?|Qr>9>Q)=m(8>0:b? |GQ?d?:S+?eX?>XU> S8PIFCuH?(??iJ?$lbrȼ^пqnivo"= @?H`=Ct?L?.2?^?z?RY\HhDHa|ƾ+>s?Uyz?4*u>﾿(k>x>H?>Sh>Y+XxI08?G8>#<~>XtT@S>?>MtDCzȿOS)n A?*>t>I~>0>>]Y?M&=>/#h>3d `W7bA)`??Fx= X(2# ?[H>g?i4_?]$?Ɩ?2.Z>o<$`?$?ƾ2\j?<>l?B>眧֫uB? + ?a>E?.>A%E%run?Vmʈ?U>v*#&srgA0>=L>>o>^>]wM6>>P>-|1>̿ywN)>+"ݿP"q+ C)@>Z=J?濚?rý=jpS><>+Q?X=|>t>>5:=(>e0>π?@{ȾȾIL֠>6Sip?l 1{>>A?b^#p >޿q =ᯒ->Jz? ]bA?lGN'>1?\?ʉP>>V,,?9?ZR?y%W?=L> >$?=?[vO(?6?U81\}=^B=, d=Ģx?$oGV=Z=𾊌=>z^[??[?h>2|?m:PفN@F ?Y)?Խ?#3J̀^ھo>?6>^SI.3y>6? i D?/?u~?g%c?R|I>dؿ>k-Pj 6*?;>6[?5>$ cx?~TF$=EH~)(>I6~>>M>偾 >&h=?La(,? O3@L%o>?I?u;>>۬?/?Ui0W?D?=5>zOh? =b\>^ij>Hb@?5i,>7 >_¾#9?H?N&?8#c>YM=/XaP~$10Heaj??/G[?,> ?\z6>܄>>@?e >V}Z];#us!ܿ ?F?>?av>޾_?ݑ? v?A?8?&^fowY0> @> I? su$;?5b>>z6>$j\?3н=?V>K>4hM">@"?,%=$>}. =@=?/??x>Ǩ>Gk?J8,>z;FI>D翾j>zk>L["Md>ȿQ>*<5=$>Ծ'\x,?}˿, s?/RG=ݰ5!>֢:?AB?M">+>:>|>Bn?#Rj꾿fy>$}=>ߛThA`?r%' (?KքF6>W-s> p?Q:侣Ծ|@<Խ`9>%T??C? &"^Կt^F?=𾫈 Ҿ}1?@r?xi?K?f?-=MBxB@zBd@B&CC;gC9FNB~dB[B"?*BBÇBBBX BBB =C$BxAIC#MlAx""BqyU{BUuBA B_6BTBY?B@Be^7B%PBvB9g¬B@.\BxC~B}$BBBB6vBWBYBYAC \B2B!BBRCSuC'qB4AbrATC$m`wA&,S+ !A->bC0 ”w:¾0:JޭdBA;B~žBRC9BBGIA+C CFCVmBӠCAGC;eBЖ@zG# h)B*BR'@SfM?B4BBl:A1B6BS.B]a BRAEBCB}dAouBK…]BO$B2ދB$A}DaAl9RB@ĒBZC$ChC5(&C]Bz@1dBC*+B[BGBb\BByC wC|B C`DBLHB!ABKaA2K8BDBRBmBlB8]cAA(B8B̺BTB2A^B6k}B@ BBːbBE QJTAC`BQB\uUqƒ>1©CpM&pA|>uA"BBGBJ`B02ALzD$"[@|OBz¨X¨61|²Ss4O¸ }0s4RDGA4I(`˜•r ®3A5B0®7D3!IWAS,ºJZ)k9‡6_N;k .L£4@$ej A5vxLޘGŠqBAɩAA"BB4B7a?’wr…B$yA>A&|B-B@B3:YAH  BUMFB&5A_@&eܤ.>B'_  C/|C>AzA؛BB;BTBvB|BiBlBwHͧA CC#*BC5|BnBSrCB`{B%C+'{BH\CC'CvC SBÙAB_Bf.BvBBB1TB˜` BϗABCiCPB,,C8KB^BKo[BAՊP.A"BB,\C0^CMUABӦC`}ͲC5'BBsRA$B9B"šAj?FŠ4tBNڹ{BFdBhBɣBRBBjnBHA͜M8~¼mKpͯTgB[uCOzBIK;BA`b+f-ŽOB٬B$¯BQJAȒApq`C- AdABB&ZOA}ArFM l@ioBnYB$N"BhWC Bdo`BA BAKBB8BB>-Ơ@̼vO@@ ,BBC C9BvUBB샲B~B'<$C)KCjBiB;BtCC2 ?OeBBBRA jB˱C)G+C AvA(UBBhBBB~C {BCBoC3B=ƶB~SCiCAC_C66B܌B6C9.COC=mC`*BzKB?~BJBV@?BC!-C iC }CkA ACGB3B LB\c$BBq@BDBA}BB(VCA@B݌BAB-_BC CXBz#"B-)BBVAIIB,TBqJBpBEBBBfAnB5C)ݓB$C9BCwB lAfBMB BB<~ANB57BDACt- AtYFV&B*PAxB4cyGteœB{пBQBBCJXCBBvC#$AdBC CCCCoRABXnAGbB&BFBtBB:lCpHCBxBByB4!9B@BsB"/2Bk. BjBC!wBqC ~CB_oYA#-o\B3B?BdB*C@U?LpdLBJ'BxOB3,B BzB.B~Bh~AoBB-A((BAAB)0@ݻ­l{fA~jHhQ@2A4 B^-^BNeAB-\A"BJRBL-†/ +0B_.nBlߺ?$|>?EH@qmr=?FNB? C'>fkUf3? 2:@>]u?p:ľNDn3ckYhP?Jj ~4>$rg*N?>ƿBmEe^ ?^ؿ%E1?L߾y?[? wKbg?Jֿ?|ƽ$u=tjֆ?6C?>>,ǿ#`8?Ej)ܢ>>wszmn&>^:g~@> ?Ծ|B?OL>>ɬ's??G29j> ? <~v,?Ƿ,*>=Pj?\ͽ,c"o1?)ҿKy>ZF}>uy>\k?=\E??P?D6c>uuV?>m?M0?T#B?C?I-TN,?^F?꿤iǽf'Z>m|iH&5?^=>TJ?uwtٿ?m=̈́>Pu΢6廿>lP~=l/>Ff>ZOJ?Ҫv1?aoY=p@P>H?zO{<͜={p?E(t???+;L?>>-3يa49>= L >LvU=վj7¾9?? Jp l`0F/Q=?A=ھӥձӿtj3V??L/>ƁTI?$.>盽>!<>B*PJ%?W|п 6'??4?`??Ŀ>>/a0 ??@E>JґXB>/{B>U -իs#>w0>R6 =%0Zu>9"x0?t .?? >;0i*Za>>nqTl>՚1lQ#q'?6(>r5<1DzJ>+F>$?D*ۿA>*>T"澺甿,ޒ圾]P|>O4= =^f>l>J>n]??vzo>``p?mbrȽؿA#w^Z⼬d>C>5vWp?(@~rݿ==B -->I>݂xK==UȿĽˬ<;L=I>{X0>Ⱦ>ŭ>Ľ`Za[+?Pp)>|=_8?쾔RON>e>׬@&`?a|:>V"Ό>4 >@ >z= b2?dr@.l,%ZpL <?x ?5{p m΁>n]ܾ /\1 >,ʿb@E=>iF =7C?V?%츿 >2P?>EF>&S>Ў>d?Ŀ(C>ظR?X>3|]tL> !aγ..=Q>TM 6? ƿ*$澷{?:?>?]]=T늎;?@eyP`>M=?/?%?NS(>>׾P2v$$=;j>&?P>|2rZf?X? >H"n>T ?I/Ͽ+Z>ڿSx4VqO<=|> 3??>!6`ؖ; 7y4??R ,4!7?}=c>?Kt}߽|-W?k<%%PU/2.b>%qz+0>Oߠ=x?ySX?I!1X&%ļﬠ rO??eJV꾄f>j(q3&iF<ϡ?+?{ؿpCYp?,?>7F>reev?'v$?C2?ҳ?0 !Bw>[/>>?p!? U_>(>{=:^>|[>?Sq&>">-p>aSU`=$Fu_?4N?^3X>%n?mľ(pjI?>~U?>)>Q?,pp>kqbj|ϰ?=FI|fj=Ƅ?}??oR@_v>?z?poj> >Z澄G,_H<?ߥ '6Z?& x>>mn>߮?,t=4?-l?&>N?֏¿?ǰ>V/$?=5}N%? )?P20$yU=4=J<޿ >>೩l%?\>&9y@pƽAQ}UT??]>U>ٹ\Jɘ=T0?/x>=#Df?L&\NX?* nϿR% *HU?ON?>?.' ?|QKD?P>?m>r˽?a; {?c>q|ÿ[[|>* ol?=ל>>:¿j>6ڿYо*`>?vX?u ?腿/">*P0? e8>!a\x>>!=>zI>3ט>wD>6?ם7D?$=c8N>x>n?>][𾸬#b=ţ0q?>-Bu>w[ط?b霽׊;/>R>c}>\ҨS?pf?Lj?^>@&?iߑQݿ&6T>ʾ(?I iB>J:&܄sf#!5S?>뗙7[\"=A}޳T>Ӏ*?(?of?VZ>׀ET3? rU>UI> >6?kVo`6%Jc?>Ɩn6-ެO1qEؾ<>>2J> >Ҕ=&пmc}??F>aݽ1? Y* a:El>><`?ya>C>b7~u?L.̾G=sѿ[+F>K\?728>p^=\[I`TDV?˵/"GD?.?jVs-0=>> 5?B?*Mi ?P\?Du?(v?TE>><ƿ4켽?:>(P$H r?>F߾]IRb>P>Bv_>Y>Y| ?D>^? tؽ;?a?L+JX?Wyd>E0FYh>|?(f?Jѐ0r=)`F80:)?J?쩿%п;,}Lz>8>t@P=z>a?w>>T0?DE=.>¿s>#?A?f`VQξ{_7h?bp'>ە~nj=cR?u?N ;w?$?:~.?(DŽN>P?S~K ?獽/E('>:;x,>>q yѽ"b?xA=*,=5CfkN> Y@<> Lb?J u@nD=?D8v>}?':>?p%??/C?وUn #> ܽsZ'>\ CN?=u?O?'ſ pj((?#z?URM%p U= 14 E>02!'`>Pt>O>?¢>/ؾ]T|d?>x(qY=?O>CAZE/?@>"ݒ@xHKLx>19?6=>:W?R?(<8*Q?9e"=mP?ajjnоY/Y;@?;y?k?#6 LLPtyz_ڳ>zڠ>"D?>=WX=@)&=WWj?>|N?FR2B?=Ǿ0>uF??F>L>h'>>7׉?4<`׬?j9U ?Y?H?A տ'=<`Z'j?M&B<+ ,Q? v=;0 >ܾu.K=?T<10>rN>;;?5I^P?j>_?nx?p >L)b{Q?ll?ȿ0>Ri>'M>d?\>>Rk$>>.yX> >==Uj=h?[=M>o>8w?d>>*wh4<*鶽ؽ>꓌?>jp? >>D̿-S'=f?<?2t?H>Z =>HBJ>4@QY = <%&Ap>#ɾ J,0+ߌ 򻒿7>\Q?:RrUj϶?4?F9?X?:ѯ?pIR? p!= ~raþ#>I?3=>bw>? ,=?)6DJ>r=~XfD&B??|К>Ł? /Ѽ<ڱ1`; DpN* F$?H.?^D? <>o>?&,>??Dc?UHӋ>i+>8?e?!ռ??3Ȗag>t>lfR=h>CRf>>z>M=q?0T{T>!?qhмǎ=>A#^>-? OR>N>H|>OEQn umVнQ=5^ݷû?ɻ@/ >sAn⾷'Ì?ύ3?C@=>>)zǾJ)Tz>?ͪR ?}br?=`->O?.:>헫.>0h:?->ܾՑ6?E? /?^ $=] ==>)O?Ͽ4(@>򿠾>&j?6T>f=9.?;?$8?>5IzTf-?L?38??~?KR>+?j?b4?!ܞ? _?'{x>?!*?oJ>h6n?7'>Bw?ud.X>Iҽ*JXoR?BR>>ި>(>ݔ>Ԣ#v>b-[?"ھ!=$@?yGAD?Z?CA,>P=m??D? U>t7>.a?3솿,; C?Y?{??X>^?Ql?*c>@=t訿(i޾}<2>T>^z?|ڮ>mA?a >?&=] >ȍZk࿱1ƚ?`YJ?V?_?KBa?2>?t=k>kZG,>o>O^w>$lT\0@?Y%>0=^Gm߿.'^ƾt>:[}?t=C; ?al=(? ]Z$<Tډ0Y=&=^x>=?Mz= ?;C:$Un2F>S!?U4<{0l4z|>׿n0(>Ԅw=올?j꾼Y?[P?@?3q>=)s>?w)X/>(=xhX>@g?pr̿a?Zھx>=M@6?b:@Հ?R?@v</??><9?Z[?v>H?LнXZ >ʞL`Ľ='(?\r?#E>ou>9?AT=|g8?>Μ(>p>}+Sd?.?۾m >(/01 pيp> ?)txG 0??T}xe>??Yp~=փ8D?c>f?96K?!):>Y@R^_i @d> G]K>>?>ھ?oTQ>DU9ҽ>n]>w =^?F?D?GoND>z s>7W?|=p>q??2Q4?/1>W,>tv`_Ů?VM:Fɐj?P>V>f >>e??F"_wc>x)>$F>^ >>Sħ,?E}><|>=LԾH? ƽTL>H<<$?8s?G/R?lT?>!}ʿh+f>>פ2?CfV.?=0g+^-<>>8N?{Z?>o={|P@?=^?; ?! ȼ͑dc~˘\M?'p ?ҿ>6?Xl? ۜ?>+?]d%û;0?u?+t?30X?ʫ?8=P? E>?$X>r >HAI$w8_L>8V>#??O?ο??"&?Q`??.1οd/MοI8>j~> ?as?UҾ69>UE>!1T?ȐF?` $-[žAZ>W~p?5< TJ5F?G2Z>>(U=?C˽@?W$\|>6&cܞ=Je.?4?(ŌA}c=} Xë?;S־ό?f??=f?\J`>|C>b?Ov]>O?QC޾? ?_A{#T?&i?|We,?Q.? ?.>l2>{r>" K ٿk

>E`C0>C>s? "'=% ; h?rk>O;?1Ÿ?#PN Tx6X?о>&?H14=>I2?>"?jR>,jfW8㾹Q=k>d=~?$پ젿P=١p>,?$?J?ܿ>>̿>|?`?L?̻@??%?p?\x?_e?S?,?+!%4'@(A`B9zBB B4nŸ7U9&AyA|bzBRƒ¬zCHB>ABp…\{ ( 0C bB $BuA TǴL’k›BT3AV¦=F"7‘D)ŸU2BUX6Bƃ+AEc1ȌXM4> @NB.z竒qAAK*/Rsk~A_=6AnV|BpbtWAG4AA"'tL A3+L=d eAf,º7“.B؜?dthARBAKRo3A8:AAAѿ2?BOABt@6BEBA6KBŎ#櫜>sABUsSBB/B[aB|A9B>GTqBR&ACBUdVAU_«Usƒ!£0B+f@Ӏ˾XB@tB#°n(âVBݲAA B%aJypAwBB&Bf1V<7LB E @BLffB5A.EaRBS,AtsQ2BWBу5A-¼A0B.B>AXzkC ZtB:BsBDzB#CC.RB]cBB ‡d-BWz\Ah(Œ'A`B MqABBN BxB,B{s?B BZt&=|BB`N£BמC/22B CUClB"B*AncC}B×^kvы*QxC3B-7-atBEBpCABlBs5yJB`B:B4 BS.(aBoBc\B:BB^AB%@b=9 \B`CBC`@BPB1B^BSB_BRBzAIBN>yBwؠBnB!y(BBIBBBi.BXBPAC: B0=BwB^/C=`dB|BRNB҇BACB;C:B^BBB>wBBZNlA$@NB|CB:B^yBD—A[xzjB5B|B' BlO'PAY[C BtNBēCDC-~AN2B"BUQBg@֠CX@BB%C-BݗBCB]w@B [oAfCxB dA{#z{0A$BAqB]aBO,ZLAr'wB}PB!AٳBvC=BC $=C2`uBnC $BBRRfA #5BPB2.BBLA܂`ЬB6B>1OAA{|z rA‰]%*V5A¡qfAv‚ Eא/_46Au !B iHbB8ŠVB9Ax,BANž/NB]CMA"B`.B<A襢B&و£htA=BBv_BAx|~B{QBAsSA?'SBJSAWdB@ Br®6"B•fC"@š}AH6 v BnBI^M_BހA?BpHb!BAtA@B_ ¥AAf*o @A\:nKA»Q$UBnrCEBK| [ŠFB 1@TBBg*@&$B? C$yZBY=BӵQEBpBICAzršFeBoWg{%B?nA[ ~& g+r%2 A?jLE-A7!6ЙBpBRf?NHi>"¾n*¹@9BBBBnBw\B*zBl׷ B_·:p]sH…ckTA[:EMej?-A7AO, z??Aa7~AxB-B2&WB"=BjB,H/¢ -B1…4 !j:l’ftc#ʪ#BDB BBݹ5Ata›AYBg&BBB@'Y|c@lAkBȽAjBBDABiAx0atH@A"B@fO8C;L{Ae¹@2AAMB3$Dz?kc0B L:B*B컓oAB[A tBYB95BtA8RBÈ+B(pBi‡fBfHSB=Q(T$@¼6g{0acDjB~t†Qx:˶k¼9%›TBeKCտ8'˂?c>?zPs_"?1>]*DB>iʿ fz_~ N&>tg??2NK\ܿGgpT=?>q?sL&=D[,?>YU*?2>>z=_G=aB0?=R>?Ӣ>!?wпuw5)?4>I >u&ҁJ?Yh>%n(?(+><6P|AG>ä >x>m<=x=?=2A+?j>޳jI= )=Y?B?Eʽ+zG"f<1>n%> ԾO>L@E=Th'>zʿAl $DG=`6> ?=t>Rg >'h<@@=Վ?L>6]+p3<=SU>O O=f>{?ѓ 2J]S">kr$`? ebO:L8Q6kvd4m⾣7W6?Y>= ھ$43aj+>W,=l?nBP=b>U>tГrN>L=fhrOz- ?&nw&~ e=e`?мV?[e>M|vtj>-?@?f? 2A>r]b2`$=rp̆? *ҋk>'9N⾄mѿB>x? ?& b8[?W;`Z" BYXg>%#kR6#m_??OcB^>=V4> j?DX?(?O?>VP4>$?E>il=>?d>>虦>`k/zΪh"?U"g66/?! >?S0??9X?Y?@>> y'=мg̿p$?>YY?SW2 >$a;/'->Z\8=ԿNJ> gBN>;?e-vF> >?Ǜ>NjaV?Xi-^Hv>xʽxd|=8%=R&?>%`wA)>\-6 t[@>ږ?t@6??t~ayZ>+7> !BW?)U\;W.v<< ?ľ^>{բ8v+?=?ƙrF>U Gܿ5 ?uu?8RXLʿ,5fXyZ]4?Ub u侺? ҽq,>6Z>6?.>Ҿ>3,f;>=>J+=X>-?A?+7⿣+IF?&!c>k|U>lNοM?4ҿ,:2??E?`v?ϗrc?K>C6d&`?9?Ͽ9J?>oNr8Gu=%"`Pǿ(h?RA>\R?o߿pxd>>d>m>g?'?lpΐ>$*?a>j?q>JvտL?"aT? .hȇ2> >G?N}{(n=>w $v?F_zhUA*<-пH>yMH>e4>>O?~'wv!3B?>"x} >|AR>(W@AŘJ̾}?W+U"=;^>?s. I5>4ZDtK? ?~F?0+ H ?)@ >$@|?:п?+c>VSӾ=о9Y tF><ؽϞgw?uܿ5mK@2?u?|)O?b`?ο,Y'ǩ<X? >{B>l}SWٿ7Y>_>?\>ς>>BT74>~=;f?cT?w {?>?'=?"?=]??J?)lg>]ѿ?$^s־¾eA< V? xj6HDJQ< <}TzGl^l=&?sYVRξGLӿ(?z>>T"ټ[rߊ=/>N?!KX?R*C~?kS?, >.|?~hIp?X~/k-Q??T>\f>uN?rK>0?.X> +YɕjP\z7iu/$ iJ?HI>8>*fh=$?W# >[?9?>K~?Z?ɸa⾗xJf!0$w`? ??2 a?g?7ѻp?>ܿʳN>5SpR(?$ר۞N.'4 0?MH?o ? (?u?wпa$]=>B$\X> ?Np>*I|?>HĿl R>?n=?V">?=ƿ)^.[f4>v? wA}S#i`ˣ r>"t+??{>N?u޿J?R}=: 7|>nnT>¬?m>R>Ve?P>RXp O=i07>0򿧟࿍B~>xOgl\N_B|Yd}}} 3 D?q?),F?B?=C=?._,?aE><R>?Y P?.>W_^7 ??>츿<5 霓_Kro"$?(txK:Q⛿|4 6?a U $`8= ?w?'> K>Of=N$?pt?>ʾ>^?`lP>WR;a<=@?ܢ>?Cľn>=}=*eE?#5|?Sq?[=zԿԷR> y??!jI=N>k> =;%>J>h?+S>r`=A<6x!,>#Xkп[οC忂re?n|,t`a>xh?f?%ҿ ?yǿK ={`?+#^Pa^gH>`d>iu&>m&-Ⱦ\пć4 d?\O?$#? eod>t ?%]?M@༾0AJ%>34#>У>Z4>SS`> 2\cږ5>?^a-?c&r>H????@3@Eƽ)־iҿm?#ޅ)xA5bCZȠ>j?ンh<Ǔ K>u{&>?2Đ?oI?3?#>R>Dć0?q_>Vֿ?1?W>.ydp>!?w>x>C!(?D!30nK?$z2?vΔ?6$1?ӕož+߿\P:?}8,Cey>> \ ~9?4 }L,>QaȬ>~?޾K wr? sĿ'h?)‹/?^&?ӛ>,̻v@>L= >'?A?7k> ^⾔7(E>Ⱦ)?_l'X`~>V[SA@t(?;l>G?O¾%Qn=X`>_C;(?W[?k7ju^?m!@Z݃?=)9Mr?8N}SĈ?4H9?ھ!?%?T?> ㌽_7!B>j?~ <=Ȁ?Yzg?zT,??l?9_:?P#?^?,?o_ N>/濓P=yP?oG>׆=A>ђ>hH&>`ɉZ&?0['?%?C>L5D_?S&>M!Q?V>.,>Qز>~?з? uk?\yWqۻAnݴ龿sf>>*=8'>ޮ?f > >$ ?>`>p??4j=?M??={>zW:׊>wWi$K>PH><|zT?_/|Y??j=&ԾQ>=5|>~ J=>hi]>УҾ@"l=zS?&ֿdA١< >J̵#/?В?f ?/?P[?m俇Y">Q.? {E0?e0(>o?@>?Cij(<->D>l?U?!;0@`>k$տ-?N~=}p?r\>r?a) 7b޾@ʿL~k==(1G?XǿB?)?d}"?u>jX^4?,?-ֿ<ۿn/HJ L?I?h1?u{K>p?n$k|g>ȿx?F?F0= =ܦ`GL R?i<׿Q>&>@ݿ ?'>@4FT?v[W>߿cҎ˜ʻ>sx>$O4p>R?d?ʮ?, Q?>*#~=⃘ ?>Kq?=R3`%p>3-?Fe62?As]>Ӌ?a|E!C?=>>:n?fP?Jp?3ߖ>Ū9>`Hv Ur??NI?u>$-wIY;l>%?z?~>mu"?6=̾̾VG< /eaF>bؽƣ?"l?I7?Ad;n侵w8Ҩ?l?Zd?;(><^?z?JӾ1:B?ծ?2)쿁PbowYR?oNҿ0*clRIοy8JT>>BA"?b)@?b(:<}?<4!3?z>>G=VD; ?K >k̿*>V?ht?a&?*](f=$h>G_G?.}?q?Bw>>W?e?7Z>O?0s1m>1VOw{ͺ>L?jZ=`?jq?f?l)>;ܿ?W?h'Gj2?"4Z npj5H>3kpu?5$?>>=?Q]>N<->;??L> #h>Cr]8w>0?B x?d#ݾ vln׶>=ʣ"\.B3>ly?g޵<+>άľ<>?9=?>$p4~=>`bz(?l^?1'=:2?|P>1?u|?R!4 >F>Zul=,%H?>ҙ@r>.꿰q ?1?B?'Hj]???6*?&@>.V>(ǔ?j8>俻"?={d྾& >vd>>@?fR?~r??!&}>Ƶb>+T=A i]?>>?r>?U?A=#h??)#>1>9?=&i`?%!?C?>_Sg?4Aa6H>B˾]?n_>?0'=7?'!>E3=&[He>E%CX>l"t ؿ0U?~ب?=b>V6?'= >+?V..>>?6@5?s>u=Z?p>\?a]?lyѽž>f1>>>N>c[?/>4J*>k>J΂&˒<`>TH{>?Z f?>yݻ?-@>s?80+t==ʴ>=̾]kC>b;\ch!??0j?JyF:(?Oi |"9??@>l?>>s=3> >ݿ>@vTu>XLGѮ?Rm?7 Hʿ?H?qՀ,:> xݯ?">cU?&̼ Dlμdv־6?Y9TVv?xP>{?m>t>҉/$>)~>">V>0Aʾsn?d5> ?lR?N P:G? 4vY">``]?S> ?SÆ???)JA?X?{F>տJ ><Չ(½t>ϟ?{?DWX2?!WL3821n>p[C?ʒ?e꿌r`QC>h?D?y\>L$<Ⱡ?L?h>?3μ*ŀ~^SBC>ü8?m"?JG\,>p~8"^>q-n>kR??hs\>:l?>ƾ3E?:??xh?k?N?;?*<>\88Ҿ?ny=S?"%T0 >n2?9v>?8=t.x>>cd?o<2?Jg>?7Ќ?e?-? E'=vl>=@f\:(>Nܺ>qw?Ͽ !#:;?@u>:?#z.B-Tzh>3?ZJ>4??m?X.= ?;P?T?%y?V?t> >:??` ?2??^E >꼦?(ѾW>, vJO^!޿J?H:? >r?]B$EC ?qBB2BptC;C]A<0FA B1!B]Bn˜Bo^A=BԓAApLjB Bv2AZA[ƒA3BAp)4B@jSAV]KvB5vzBBUB|AiBB/BAB[;Jc3QAB$BcBBvBDpHAз,9=­`d!°]AWH_AA C0C$"BC vAWO&BpǍBC?BjCTA-BvBC7x&A@ˆ(BGB"B2CPHBBBRAvÔBÜBUgCsB#O.BѼB9Bė@DrBxBG(?iGBjpB-r BxsAcASBJlBAZLBo Ag1BQwB:N$BmnA&B Bp B?ABJBZBhާ`BP>BJ.ARAMCfBjBDB"aBv?`BgAҗBGoA}n3 hgBwBB BABuB1BBAmADRAB^9Bإ\ByBBcBnB%AQB^]@ A thB(oCbBBdl3BpwBVB"BVB/B&AAAU0BJtB4BBB˾BLA^BbB73l4!ChBB^eBA/6B&]:CqC61B/BzBݴ[B@(BABA`BCkTBB 5.5B>C& Bœ^BxoBBvNŽ?Bn\˜B:uVB0xBڔLABQiRA.C@>CB2B uBBlhB؊*BMGSxs(BB,AHAB~nBՑBh¤ABˆɑ/2;GM1y X-#\|9B6ˢBk|AK*B0\@<­B`0´;AK BH3`@U"B;B*Q$ىATAz~?B9uZ A?3K¦)AnB\(`'y%Bu~A-&›B.FhvAF$BRAn¢AABBa%|BiB@B*BA*BBwBIBhM@o:FB Bšt"v,߾a™A;9,BLB퉇 ‹5@Nf(B+¶IA ­?eA JbAh/Rv,~Ba8¿z/¾¶}†uEA6@vAA!A.NK@[|i2b-)\AMXBlNٵµºB\J(uSl,Bc+£^B 96B‘q'BIB‚ΈB$BrgACA Ž.AI@BN.yB]/Ph>BB ‘2ARB_B06)߲wA@&BtBeQ%Agž80‰KɕKv€1S)$rŽ©zA`GW}P@ onpAhv`B&TBQCA tTC vBIhZ2A{EB>B`:AÚA@ABsf@A&AtoB N0BKBt>[z$@bQB#73@6@B-Bw־WB1CAB@! ,"zAH5-7B6^@V`B`BVBM=B&כH1=A ~BןMKA_ 8S.¿+yªqAB4Z#~A[B{.¸vBLmtĨ=X‹} jcE|)4~°*› 6WnKŠ8~½¼v>YMS)2@<8@L.©'ws<lbTvB[BN C\OAK,BsBWZ&AZ zBkAUA"A%BBd\B>BPMB8BBA, €[h~‚o[! P(~ @>bB3IBy/AJBZ=BUB#¨r(7FX; AA½nl5U?㸒]| i?G9rUt?3.£q‰g-¥[fV9¥ͣ2B9ս?ξP6H?*>$lGiݴHj[q?^3?߿|i_CJ>3?7\?'k?4 \??F? D? ?(?qj^P ?^?&?N ?3a=y?#d=FT~{?Bl>t3JE_<;'@&J`|?=?K>9>,d Dt?qP;߀? E>\=v䈿朾D "RKf0ڿxq=T=˸wƤG*=)]?vOi-n?[;?/ Z?plF>#?-Y"?"6>MV=&֌J>z?6Z0?J9oz?SB> Ⱦ3`P[T?'j=[?ѹ>|Ce>K>f>\?!6{(q=:hξ`"=-L?G=;} <;d~?ሾٛ?H? ]3>|ͨ?}oLG?ʦ? uUO.>ྒ^>M>(Kb~% $Pj*V?R?j<)u>k2>o4?i\={!?>i>d:ۿ;$'־*?g'Q?k??.2>*'? >7?ʦV?L6>3tq(>V j.Uu>?0 ${j<_x ?Z?>HqI`F>>=,?1I\^pH-? QlPr?oM?F ?l;}@!}R>I@7?6?2Jts4?7l쾢> l>fc7.?Z>~ t=?0>dtq羔>蘿̞1 ?WQ> ?"*?)>峾tWL&=nߝ@68=?]?=(=2??5"?/o!<>\ԄZC;d#dcK>`Kľ>->׻=??dͿ@m ? 7=~j=K=b&=4Vy;@@, / >G>g|\>>|??){ EJɺ?ޫ?nb??H*?6:>rvx P?x9Xwjfz?QL%?c(].޿?95'W"9;濗 P>_HUE|s>]6.=;̿S rml K?ooڿ2i^>/̠P D?){?1Њ!a=8>2]?EリB(=L~?&T@$>, '"h uF?,Rn^7??j>3ڿ?=->dwq>~?:>>>Gd=s@X ^>нht:@?OT?䘿kȾH.?w> =[b;tN?N> T>vȾRϿ?8g=ZLmQ:?B=E ?$< IE?'(K01>>pGRÁ_? ά>KlԿfJ=}?K>S>*?4Y@>> H>K?=.m.S>FFa>=>O>ۿTv`fԿ>x:)??;,8F澃v?~ ; =?`?YL?-#D>7(?MJ>=AR?S?"?4P?4o\?="=6=?|>C&s_ ?y"]H'1BT?`>M=ܿuҗ$?C;ȳO>qJ?$t=@=p>-?K;B?Pk`y>䦽h>1"t?׿/Ҽ @? 4 >/U?? ?֌>菽U|=6?Ni?z \;=K(߾6>'p?S=d@IV!8xr?J}?R!=;p>sD?/JP T!@ʾvX|?=zW'.ӽيeٿX2\?ȓ}=`t?$oe >x <='kP=G*VW0? K x?5?O,'̿ Y>Y@>+}]>P򽊗ݮި 2?> &? w*>')wܿ-)`.7)0%E`>>?1; <)C8?(Y>CjX?>"?ӽ?S>̿6v_0n>/>O_w??)=/>6ؾ>qO^UN>5?9??@=?]a?r>p>Ծinvoο,>迧Tco">aM4>B-k?޾/k?R>gT>W\>0`?4b?=rT@?K?>^V>0??7j>>v=N;?Ͼ}y9ch8g> $z#[2>CxYG< ؾ`K' >.?>?FF?Ob>?O?#u>8/EՕ>Ӥ*?Һ>S|>!?1ƿ_2?W= t?>az>AʾıX* M>J{?=~Ub>3?>?->Ew =?{swZ?%>3}T>ˆp*s>cxv?θjI1?~h>駿Jd3佃T҆8?W7>?cٿ_?L`=gY?h2v?QY> C?x"4 >0ĿD׿Q粕)>P*>Y4>z捿@>eZdV_y;%4?ͿHPx=<)`fOH>>9 >p,N?5Z8=пK0dܷ>O@ >^?+pa u'gN2¬>3=?|R@\?>7p>aT>Ȓ>'m\dS 6?˾\^>:Tf쾜@q,,8?k]D-=> >+PZ还|/j>l*xiE>ƿ<=#x?m >EiB9?A ؽɩxľ̿0';?C۶>p3>ޡ3т?Lx->ڼ?0Yv GҎHF?1͝>(f?D ?Z>Yv.T>_?&p>>X??,w>>c= ,k0=%>$=]{9ȾUnnd5d&(W?[=Ϳþ4%3?2>>w`Z$E^0.׾7kƾs?Er+>¤k>ſWEI><;?Btp>T;)48P'?,T2? >{26?q >6?i?5?am>&,Uj}ĿQ>>ѵ ??}߹:$$bȿ.޶?'8~ >0> g:5'->dп?'U3?>mX?*?j@=jjʿ=R-[|hC 8!6=%0?zr=&\>=OzYm?fpyl>?eҿNh?!>>?(*mبa?+?.O>=?5?)i?W??a;忒xp=(?"=hUB [=ȇ>rd\^͋?CxJ?GeR8 q>d\e.>>O ?g>>v?'lP;>??D "!-feV>/ZA>6f?˒|?{>h? N*յSC<`?;f>6>;[>C>=)Z>k)n=yrZ? 'V>+?MսCS? Cqg!>c?{+>058Y=4ۿ??j=1_d>>r?1M&>?7ҿI 9>n\>(>˧?S6~?~Kn>⛿)Q>4>2>繾j>y m> нl??dM2 lŎ>X?}FO??W?h߿ ?zҾP(a?>=`?(4&?i߾s>(>LV~?=,L>J?Zvn>Sp> ?JJ٨?g.?>T$۾sY>j> TXzr>=}8p??=8p?|>>{=B#5쿑6qxX~Js*?MWs>њ?;su?>?tW*? ˶>>?d?B-X{?F>+Z>|9>k Ծ^?>;= +O?j̓6?@%?qaD @>?9?Z0Yʁ Ld>v2㤆>^n>.5?Z?pꇿk ſʫ?aE: 3ؾ\>?PQͻ />ݭ>>!ؔ?+U<~0?lb|x.?>}>#^?Z=#Ⱦ0?dOzU]2>SD=h>3?Z?!޾9Q?o>4?iQ?(?̙&1v>$?Fξ=J 4'?w?d?*?_h?'e>7}nDE=?=?eE?~>^?o(/6)?8pq$?yĽ?H?D?>8>n>B ?SPs =$?mf>>-DwȿWp ?k= Mg>JX=dmG3|>?V*?>(մY[>x%ӿX >?φOU?r6??`=?A'?%Ⱦ_M"Х>ݘh (O1??sྞ9> ;L?'>??m!G? T?2꿢&?"d?Gʽp>hqP>O|??Ak??+Я~<,>y>νWֽF(>fׅ=t4ϰd?$s<> \*= @>ͦF>$5@?a\ >=ؾ<ƿ#Ϳ? TpM>#KU Pn]y<<'?1'1T"JϿD>[S>~~?2 Ks?T?I|>ښ>??Fk?l?.8??g&?A<S ;>Qu={a|_`>Sp">NM?>qB>Q俀)>6(Ͽҿ8l>pL?s4>1H? kcx46=vv?5>”?j?fR= ?1n=$-6=%i?>/dќ>́>*>O>P?6}d?It?HC>2>H=?=C9||?f<ؿR>A6 ^>>Ĉ>?ȑ?5l ?>7L>$?ۋ?^V>>?p?NlB~v=>ڄ1at>`>?LW>{d:¾??v=r]L?MST??o@hNxIk~ȿ2½@(4>b=Ψ>$T 4S7kKƜ@=p>Ƅh?k7?(n<6pL?xހ?;=V>Z>7R.#n+0}¿ <>~?3&>=I_N֦?? PkH>!nr?a>'M?+Ć~p>>a6?4>?_""a￞>ɶ?r?.\ӿR-=\?5ز:;|Q?57o[ٔ?`~=N??A?`? D?+],yw濁e^=JR?r2?y 4>6WȀ?a?al6\9reF>Qb؈X{>N՞?n)? r>,? ?>]?&8; >e=UĿ$Ă>1W->$@{!-?*=e? p龠??k5j?VA=UF>)\pG?r>x?v@elĹ>hc?}?Jv?۰?Q@9/?C&~?/>a>٪O ??y׿5cՆ͛>X,oU-Wq>Α< >d1~Q$:?Kf-e>>c?#>>NJ>4?K`?c>nV@J|[E?}4>> H?Ŀڿfۿ6(><>y?F?36_T>?>7=ѧ7^bU@ȉ?4ᅠb?ؾt=р=[Ѿ#k("<>d?Td?JU>-L.5F ? ?)>7ܿl? *>0UQ?CL) _`>CL~?sD>\UA? >}9McZTry>w>?># >G` ཛྷ>a 2?M%ǽ>?^I?>?p{?>7yW̿F&4E= @J=𔘾.HY0,?6*Jk>a?O?f??JȿkMԾ?PӴ>NX?uRP>Z̽ƍ*>|ljr9⽽q Ᾱ;>^lsF?}<}?]a w%SҾjk>#ս.j-3n 3>>|x¿v>򾍂㿂k?,p&?>#w??3h? =j&|A\A%B=rAa:BE>QByBcWRIBBBpCzJ@?A.µ 0ݝ: `Iw6N~U7Bcr~04@RB[7AB(BkBB2CG6B{sBs# 7uOk:Bq?.0=SZB}eB\J?tdN– ¥UsAB.uAMVN+#3'B#7>27W—¥od_!OMO%hBxABNA B=UlA@hB˙*ɊŠ]O£*‡ӷ  SAUA?ŠJuUh‘XZ=i?rOƒ&A~A߼Ӭ&Fµ>pBM¹ĹA_>jBO7Yb9pB"¦}.B{BD4B B?@jrn >jtAB ӈG$ACUn-\8c @؏ H<|BҌ«eB,¼5hrNœY’A>Jf2pTB4Cd²5B. 濏ސ“@XdeAGq^IU+@¦٠¾E@BD”L²4BNA3KI%`w¿ą \VB-J!@BO3>PS#ŠT9„ᶮB (e& Ar \«JqB)6BBBIO€Ayiꧾ3>¯"»P»qf; "^„9Xj–YBBL ²V•Bn BA <Nrp@Pb0Csa(1@ e¿t’B{u o$Bž5AtpzA[@§IAg?ŋBy >Yœ ;p€vB6^BzBfB@;b DC(aBcBDyn‡kE,DVcAl¨¢;Bkv8P$r,KL+EzBBBJ{(Ah@9#7'ՉBBu`-kfB LˆDBA^B AֲBpA$@:·b׳8!BDflTn='BG9?^YߠˆBrLZ}GSkaBۉ>BbB9oAwA>BwaA8\@5B(lA=pBfBGB6p6@K$^A ;KB+0¢ B^¼BTBq)BOBE0kupB]BLB~BnGC06BXBCBiUB$BR BzBBW6)H+BB BY0B@B AM  *7JBKA3V&yS EgBB+4A <%[@k;pŒ<UOtA=®ew$2II-ֱD<ª|œsĸv¹Q[T6ȁy>hA2BVxAU5_hEšK ‹3H²YBE:FBեBP8;C vM4:Z°Aw*3TgH B BB CBh{/*lBczBBNABAjBuBg>>@A0ABkwB7BJ?d0 ߶‰O޹6ª7}QA_r`&%NTw@siBn˜XSNPSWې89j~=כ±Ϟš!<@&D6€V4 Q€**BiǍ¯BfE*Y%BT2B4nA4BBg. 4¥;f1SW,0¡nFBX>%A BAl.6•pº*$lnAE WP.A¨¥ͪ/f 2D!0A A)ª !:`’ t+A0³WAL@8BrgA'Aӊxf nrw°4#@+rB2BBQ2Ak;A#c!}Y.p-ft8 mW|« Z:Z ¶sy=D2IQ£K]7nb)ŒB8t,^vSG‚L¿DDi^A.a=«QZ®)v‹Z&ƒrv@R›3DE^aAxQAtBC߫/Kʾ:’ܩvAAQADoB:TBBBrQ{.?@B+CahAܞPŸh 1aÈEhN  rUFp-NO K:¶iy"º /!D|¦13QA¶lA®ӘIyccr«-¥ B:/A~Ggc*®hAXBqS$^BBAlAP-<†0՘§~[gNHs*bB*@Bخ$w»S7 5Bԙd3wVDBQAmB‘bAGx@@֎¢: Fuzp3)* zš-B )W[B D)BTQAA >BpoBrB4A-¹ ¸A]Mzl.`Tn|6X¶B;zB+E*ZB[UA[@7?ABlAЊ>nvBTbӉYX$,I4:'«F§B5™A¨|‡>bz?€:M kk&L LAˆ ~ (¢F&¶+YBC:q[ªNB>8_v

?v{ajqv"SUcl^vP?>$s?l?8r?>ц>>C> ]:=%?T<)h >>4k&r?ti?:=⿡>? J8?W~ 8W??c^}ư!o #I>B>Et>Nr@>?v?={j2?yj8>Ɓ849ÿ{~-9?Vx?u¬w>>s?D&=Ln=o?.>L=JRP=v( ?#gPl9Oa~¿:&?P>\?_>]=8 uIz>?>j%$7>6H)̾Y?B@?K ?0=?J"k,>asc:?#d?:濱>?ƿ6u?jhۿs>H?$9?8ڿ28+&={>[?\?Z>Gm_:lQƛ{^!V@|>Y4?)d by?5p>vU;>ḿ{ePq܄>?Gn;>:u_P>jj?>Bʽ)Ŀ*>j5ƽgq>ۛv>o"H?; [>? LeǿXýJA*b> 0x2]7=tb>;cY>u[ ݘE>>$?^>Ͼ2h>7b,? c<?4>̙>il?@6?.>D7:Kjxi뿩f$)g??& ()>̀_aZ!>q'2G>3>P?7F?D?'d `o=I=.п2vC8.=d"};$u-p?3?>f?5B> =mD?p0> q*?A LL oQN=/@?`-r翚ݥv??">u|=|H?7C?\ĿbK ?H[@ӀE?[lb'HTޫ #)6;:?@?r3=B?@_l?=p?×4${^O4"?n>?]H?>\&0>d5?_?i>7?_?\LTZ>2z/"׎y`>1`;xq{>&8?Xi?#?z??71?0?H ?">9hпR>XN &@j!UP BN>|>6X$\| ʾh½m?-)0c8>g<[2. l?J>>>>ǿZ O?+ǡD?? $_>?.?r?tK>?s>ʒ~/>X|>?+?eU`>G*έ XdVܿ!w>^X>=Ux)(|ڽB?I\> ?@f>=$?QzEǾT?>T>FF?IM<??i4>|<⿓E? 6t?mg'|r&?ܿG?Ď[䔿B!x#|?3nZJq??6μ?6js־Ek?Dd/4¿1Tܿ, x?Dj8B=>/I>?>Td=*L>*׆>sW1>tἿg?{>< .>{H?QL)>y?p&;Tv>q?x|>ɽ?ۼm8iʰhh=e?fwe.(?1?+.?n3Q>/?LKk>m*%=?yjǿS&i9;^?A\Ǿ>1NGk>D >ο*X?_<?bM);f>b7>ZS>?U? =?8绝KŸ?z >2P?/D>1 >4=%>?<ؠm?#ί">8k)>A?'h>PZQQ࿄7:>7?6v近L?4V?㳮|`=R>?>#96k-xJ Fח+r?k1`>0D?Cs<]4sNn)dr\<5ǿLj\?,>\;$> ~$>23?:B")>w @ً>n?'=.?}?L[ȾYD?N>SX?Go?rU?nd?0ȋ>X?2@>Ы?#|>?IԿ6D?Nþ=(̾}\|=d H>D?F?")C=¾Ge]._7?W>ſeT?@b=U`zj? =Ͽ} ٚ?a=H\O5?g׿3>>>9塚?-~DN^?*F >F-v>r?%hD6om+>sZY?.>?=rK<^ȿy?׭#? o?eH 6>Rݿ?簿4?ۿJ? TTt\KG(y?b þsr?_ +l3[3>ξHzͿ9k29?Nv̽B8>?y>-[ѩd?J?5Lr2> ?'t???0ȿL<)4Sc?h"m>W>`tlkR?Nj?G>*!>4ۻ҈`mO>Vj=vƆXf**F=;=n˫ ?*;>->|?c`l̾.>-=6Ᾰힾ+d? A 9?'q?*/?|?q Oǿ;>r, *,> H>.?-"K:8Jk۠>!>JB<????:#>Y?Y:>}r罊YA|ʕh7L=`P_:< 0=1| 'dAWս.-Dֿy>& T?KC?.`t[H?&Ok4??3`?4` >ܛ~\1X?V?[ҿeB>?w?r.?gp?A?4Zx><>ཽA횿?o'*?> ?eP_>k9?=U<+>J_>쉿;g6dbJ??{8d>$>wg?z?3r,4LG>Xe\ɮ7>|޽p=z;>>9ݻ>>5?4?,m:9H^in.?jȵ>Zd:(,???0?&)??> X>xj՜߿_-^qJ(mJ<: O;j>Zd>ߔ?u;$&϶ʿ?GN==o@=;\?KFt>w@Wj?!ܽ0qm?_<* N>d@hԿ??d?$m^R?=>?=nrf?ߎ8?N?^N>J'5=;@Ix12=Wð?"?Rp`?Hgx?.»?+< ?*N)(Ѿ[>Ӿ#J>gRWX>8?HֿT4?%?N?2">4q#K?}R[n?z ?En`kϬ>7?T?S)>m1h>A??LT?ed?mr\5/h>Ƚ->?72c>v@>;>Xؿc,l>}?m"? ?8쿅g?j>]?@??0 =R6izL}jA?YZ?x>Hp?=4z?a픾nF?^j?'1L?V>\=Z?)M?ľJt=wC~>WȤ>P?U>t-Խdؾn"]>eXO?[ƾdk,UO?Ts> !cy?YIk⵾ <=>D?H9?Мd:t?/@"?yK>:Ǿ0T k;Ȃ? D캚>t=eXC>?U>?͚?" I4̶d|ؠ?ZMD?fR̽ =Y[&q򿅃n>9;>>C>ʿR?˜? f+?/t޿r=B >U=?rQVo3@? TH?6H??U@ 0k{?/jPb?>GV>>8?U?Q)%>B\?' #?<~ؾ\)b־$ >?*nsRd?4{`:?Μ>4?-?C?q@C<46ï >U,=',f?GW>{}%? >(= -8L?RI1~lMAk?<ὗJ?^[2H?$Ǐ=>vt=>,+X?a g0;P?P?-PZ>>z#$a/&>>x*?C>0]?~Z2/< >́>k> 4IV> >k_?3?OF}T`eB?Os? >?= ?d'!c? U?7W1?~1ւ?>a#P=U(=J.?ɺ>k=c= v=e&Z>v0?>w>?c5@l>;M?WÎ=Q ?4>9t>Ňp?Q> F?fc>9ֿ*?-п9{>7JJ?bVJ?$?5o>p M>r3?->%Hr>3S> FBU$n@O:ݵ>誽7>8A8>=a?$>˦¿9i ӏ|?A?nZz3 ? ɾ¿$Y>! l4>Br>a ?z:XK<;v>(Py\L?D9>s>P?Hy?p'1>0?7`=fS?!1? ,=ɀ?m?I0>/>p `>z>N^'c?s?J>fSM=0>ؒ,L?դa?a ",kSA.5[?`dy? />2>"?c%Gj>?A>I(??Ҿ%]ܿ@v^oA:R?1d=
?*xPտ~U?gC?=q%$>y=7r?X?Y>4?OF?G>T>I瓿i<&?7 ?7tF>?{?mfɗ>^返 ? 'r6 c?4O[?Z?>?o,?3ѡ?:>׽]ٿkR>?wW,XB2x?&H|.](? >q$? ?>N?~?? \>%?OZ> ?`s>'A?:)Fɿ`=">>O@ 3@?(P>H?q4X?4?޾-(?<>w>o{?ŭ?u31l*|?<V?,V 7'OCZ>>Q>W_gP>?W H?립GD=?$E>ܿV\>`4?IS?Y?w@dL?$>m(0W~/ZƧٱ߱I>A$8|>mu=h Tv>4}?u?~c?[<89>O=ea@ƿu? mQu w=+?0?s? *>:?E3?v=ŸV>!9"e>(("D?"gb$> +&>U`&?T?_ ?U>*1$߾Sn'?x6>Zl?!c?AfF>h=ac>1| ^>_=',x&>?e? ?BWBvP?&?/>T;>R3*7)Ɛ?TK8=a>xC=@Tj&an.?X=N+=}`H=@Ox>L -?!Op=L???S=>9&> ?ο?wG?Ɉ'>/ľ- >ĕ?)ޅV?$N?[?7=&`?"?IRz8"??qHh?M?&N< ?2+Đ=??Eݱ?䜻LD>i>ɿ ȿK?2?Y. ?L|¿0]CX 25?P]?Y>??RP?Jh>>O=Gqij>4̾>y?^?J\3>7h +?_0 u>*=5?9?UZ !][?.LX*> >r?U>p?M"?n?d^k ؿE1s=$q?> D_Z'? >wZ=оabׇhp=r$8 ְsd%f=?"?=?t/]>>t8?X.=Ġ*?>\t$⿈)Z>E?I৾%?x=Xmβ=uF>uſz?8t :>TZ?t?#/;"D>q?|d>fFѿ6="p` >? # guZ>u4=:^?v>1^ɿ]h>?q >l(8^?23>:9+> 2ɹ?>_'?ɕ??tɰ>>t>8u|ӿ,%?Y??,~\>?"Z?XS-W*>>>ش(=.eܿ5 Ts???}0?sN? F>> Qb>N*?,?tόZ">%%0ʲ>&Pkg>~>Us?Dٿ> = ?&?t3_̾2?,L6ś?aҌ>7> D>?g>`W]>^>%#;0>>?w~?x?i!Y i{m?Ws>l??H?r>$m  ؿ]R>h>U>VC ܶ>|,nQ?$|97{?>>?//;BA%>BwoBx-LB "B:CHBAnB?~kh)B]B~.A]B(eC[BfB+NBBfyC(BwTBD*CyBmABsBX/B1­B2/PBcJ#B]BJe«d:“A:PTOBpY`J~CPA_ z#) YBC4~ LBB\‡BR~tkKBm(?q@ǚXBAbNl%ZQqi'+A@"6B4V¼2„BߗB6C(BB/B̊B@A3jNA\JmB@\DBTpA>SBԪB]@?A.±B ^5*AGHyA &ASj TCBAy\&+"N@od?BuA輜BBAT@NBl:`Bn0BqGA‡A܆AjA B:WZL‹tBCv +¨B AWBZA8ТA@(A ¡zC?+4uӀT¼!ŠWB(<6³"H!]>H`NB&B0in[{-BB*@ Be;Bhj›~B8{q@B@Blj4BWVB V@7B4`Ba¦>Ug507Agh O-½'EiABR-`# BA&8A;B+A<&v9„*BFAf̝$@A|B*#qAsL(BBjERAY]A\?p@dBMB(AAcV1µ¨S~<%BJ+LQC n"› ~vO!x _ABP `ApH@B=YwBB;£OCk.B3~BydA|ml ;P.3p\Uq)@.IdjBbҝBU›CPPŠ1¦V¥AoA -Ay@ƠAō@A$:ANXBDw{B2,.‘7e6AA(A>z@gt9dG0 PMc@&O fv=n!A ϼF@ œePG?);BX >vC&B5fL%„*bB-.*r²5:^€FBjS!D.oMDcNT1<žJA*¼Zz ,D{ 9S7sN/ӘBq@XSBjAzpBdu.Au]AِBJOsB4u5BDBqz}AQP&B BqBY^BvAEB>¥ }BDB6©,º6uxRI' @x‘˵8 4^ HDh@ vpF¥I%Ơ ަBhUš\IAtqBSA8rA`F¢;“&N@ci(x® |@_\¨7wθ+.x¥Z"VÈA3I? Ÿ4AVJB[l`/A~ea¿wC{)K¨“G·k\)š%B!Q8A}%)R?#ho‚݌}‡wŒ^AA &´Y}vל£9¶ku%­½F@X„ P\`1" i)f&WAgS/TEМ@H a @DB>UŠy1{p@M Q!(:qAA)BuQ@⎀By+@BB;;Ai²)Ž º 䟺 /B/BY;Lb[6? W-pl‹__H?ԧBB@ڦ‹0i.Cr2$wy-Ao ªa@NZ–§›nsb#M)T¢|aLu  "B@Ytv]p>)©&4B`GB`H>w&so·iA†O?˝0@)5>=?UC?y >)?U7>>|ľ̿<#@?Q$s?aii?܃?-8l??<]Ȁ> H>>2cv1?)?>Z<𽯕ю?'i>r[?{> h?N O?yӿ@?6U?=؀=6T?l"H"y` &"?J\h>k ??@K??.'v>jt>;ľ{-?p⾰ᇿ5R?LWYSLl?M >A &??E{;>> l?Z ?vP=3UH=Ŀ=rO>>BN ?IwO >x=? ?b#RoJ]">?(s>>D08?"T>|O ?P0演p¡ο .g$>X?D=.>?h W>_=Q>:$?d%Ͼ7>]?Ͼ9ԾGh?#>`lf=8ƒ?w9 >=K@?>sZ?/Xw><_>€?;>}PuM1o'^8>\W>Q=zV[X?O : ]AZ_,i"YAP&`0?}@-ؾ<v?sp?񾕺B>+>!+]迵ƒn(z?,> ʇ>>xg|^#>ݻwͣ?ͽ`[>TLEN?]>#Zu=S;Gt?4\? ?B?+?̎n?ʾcg,?M!?c"T? 5y*>?xn?W??l?2">-(h?}0+ֿ C[s>ݛ? >9W>A?H>j&~?(?oؽ:>"5nj{>Ga?5?->L5z >K4678>? }?:?,T|LJ>0'g=iT >YOHi=:?W+=e?UŽ41">>>T"J?ITL>5=Ι>$>#^,>^`vھ Zj4S\}>$gD->}>׀?/f?D>5&t??? /<h?MG?n?- ÿTImտ|?vvU>r ɾfR%@㿣?2:>ɚ +<}>hu>ō%> 6==.?>&x>Fwľ S??Ns? 6?8TC>[+>0"˴u?F]m?">?n0=#`?K?S>?:l5?< >>%h>hwx>|?, ?o=??"J<=jVx=rXYT '@?tB#?sG>a7m>>es->[p?I?H ھ?Ub?us?&1?>|cx* @??j?8֫?"!V? J?0w=y?l ?l=]?R?@> uV?;>64 ? \=Կ޽>?,)˽1訿h ?M2>,ۿV> >Tھd*>E>=]>͌W (l= `?V9/^?2>;|?5ר6˽v?5?xJ%=0 }>BF>w6 .w{Z?ā>:pپt~;q>?{=Ԁ?1? )ɰ?*??iֱ>i?h?s?J >>???9XT=w>Þ|[9H>~bq?N@*!?E~X> X? r%P d?~3=8>?-T>&>uؿg#?O?4>D¾R?FƂBF>>%?9?OG Ҡ?O>+>/J&0 >`(??a>r>F;{>R?};fؿ H'rJ?ݿltV=yп$?e?Za >D > >AD>G???T?9]?'Έ?}y;?Rtx%>0Ѯ:4߿ۿC?3?>L7}R-9׿>Ծ쿜? _>^?@vh0r=Xs\ٿH>^v?#X=9ܿin>^??== Ô >H?bu[\Uü't,>,]d;??j?˳ ?҂yzft??>twƿ>l?W'2>&Ze@=[? b}~=&H`M?>j?Y@` oh=P>\L>y=\?9bTߏ>h/>N?+ ;)S~}ڿ#Q'̄>ؾ˻>3>ɇ&?@J?&?Ϻ>BU>, ?b* N 3>O|>d@>۳>n>J>/9 >,F?˸7DޮD?A0?V7X>ο6d>itr"?Ȭu ?T=_\='6_ڿuma>^v\>Z,>dпDPڵu5͎>/}>E?g?N=2u@?*L>0?] ? ?忿'>%=d\>.?GYj?y;+=@S?V$>=mN?7? /y\?^.[0?a8>؇L)ξw+r>y=4h?|!2>2>^>d>ݶ",??>`0] |&Yʈ??1d?,N>{:`=B@(/l=濮>9̾^l>Ҩb?gR93fc+b>h20?5u>ʾ1%HP ?!{:?@?Hj> S?O?kn=` ???? :?3H>|?P?&>ok$쿌ֽ+>!¿LN>iW?%lu98fe?cJ?&kE&>-SHhDL? R>&|ȿb68G0X>(>e>, l?!s5=ώXh>>,>=Gfؾ?bۙL&>$B>>>,܂d?jٹB Q4? R>?ε\? ?7>1mP48P5c6?O*ÿ>t?; X> >-o?=Y?r?a>rR?L(??1.]?u;>at(>X{(< @>9>?F>@??bKz>FȻ\f>4>E?ȿ@E>/Z{O/?.laizÿZ? *q(%u e > =D2Ŀ%U^?F;п:ο???%/?7W>"H>JǙ>ڿHi<~~ uV j>y$" ?۾JN=j`n>4?q>F3?2A?YeK?s!?ʒ>r>?(ȿ93>hU`,>NU?\?Hm˾E>I>Bn?'sd?꾲P.r2=?|>>*?qϿt?cA9?@?4g?}J4?>|쾾}'p[?&jiO=N$? Z=;?Cb>1…>D? >c>°^8w41 >at?Ub>Ǩ>u;nƾOn>ۿэȮR??l>J0hY>ܽ6:?bP*Ì%[v2?!@ڠӛ?S񿡓k^?j_?>y1>Г>b?q#* WؾZ=X>= PdCR? ?'_MuwXЬa?/{.Xqs@ L>])>娂>>D߾,y.>;=/?b=%]t=Ѻ=K0?T9v>8+(2I1*k-a=+Ⱦ#M4pT=0>6N?J%>^ >hy=O F?@(W>6@t;:?8?WkRxZOc=@ھ-z?h?EXd>{?@?Nlǿ ?%e?7<@'h/~ھ%^??L? Ǿ7y? G? D?>_@[U?$>|?B>7j#>s~$>]l+H>ب?Ǹe>@87>n?f?eR3>ǼH3â>Ff=]epl^ѾD>JΝ+d? v:վ琿[*dz?:|>yپSḓ=zx?c>J??4?!>/>>.g2@? J?: mG>U߾o==㎬,4>wod?? ?`X> ?Y?GC>Xf>ܿy?1?R.a?3=H(x!H!׿ΕֿKa?J ?Yd#? r>9(>@>+Ͼe>S>\?h6=P>ă(~E~¾! z>=>A濅æ>??d?Y>>]\=zAPU(?A>x?vU?2P=?>/=+ ?q?0d\Ͽ0F+e1/n(?:k>+g~ۢU?t&#m>?' c%H=&􀾸;y?tĿŻ\L> ?{@>М>;'>&VCg=|?u{T?s?hP(?̽fx>_vHX>[پ@M?ar>O>?>>),kHa0$B>7?8ƫrp =nHY?qvֽ?E E>xv 5X>1?>v?>A>d_0qSW2ٿJ."fI?U>4? B=o?!b-?gW{; ?![K}+mPҠ??r$ܹfN?VUٶE?dH=Ug% z>=H.ʾ5&3>T`>`J$>ͺ>>>wξJD>վR/Z>!>\I>2U?dR_>YݾP;HHjt> ?WT?Zf=2K~H>~=#?w> :$\>N3Կz? ڿo& 'L?oRZe':2ſS? ɤ>0u/=1վX,jhrC-_@?9>>?>_> xzX>PpM>b0 ?,>qDyg2?㿾f8>;eb@X>R;>{U>޾?>>z?g2]Ěؿs0?ZyBp?g4>kf? Q>9W^%"?>>?9 >q'?}=?=>O|!gzZ>ag0?2>B̽) +Ӿ)>RDu ?.?-%2=>޿?2>п[$?<&ldǿɚ-9H ?4:?|?}X=.愿f [Ƚ >޾G[>JJ>>؛HH>6=^=h??v$?^X?%?,jr??-m5̿lb?k=<&.G2?x=),>?j_>J¾/=|?22>ޚ>?2?{Jç=\?OOGiUPV9/n tDƠѿfn쾓 =NG?ɿF0?Z?>́>wܾ>>p>Tpz42ѿ^> R E>>zoT$|˿|տ!B$>z>=\ rͮ ,ϿtRs=J<<5|>Qa=Ѯ>롱6==X?n3==>lJ> >nܾ-.>a ܅>"b>y?:H=(>Z=p>J쿆}X \>x$g\y ?!?lR? ȿ6k>h1 R>_">ݟ?T?%<>4*?t^B>byNrC F>즿8U>M>޽V>?->T[.?HN?\N~B>?*"y; 夿V=Y>\ؿ".>8? >o,?C/[)AEA&C*ck:"=>vLQ2Z?*?,>8Y=r*2SUv?-ν,=\8¾9ʿ;QV'C>1 >g@<=X=ز>_f%z!q=r`?sN>/A?cM=wM>Gܿ]=Y=X=L>6;?(? 7ӿ"q02?J;? ?m:=h!Mn>>Áp+B(?>C? #u>եD>X?|澅!p075۪@>z>԰S@|?Al> VE70PJ@=ܺ?nc>hy>0zؿKl4?A?缠@kv?$2&b d-7>$+'y0E?@=>?%yPk?YV?+?6T?%B?Y>WF>oc9=?scwMy>V(?G п=@ࢿt)M> = f?gvO>h"?&6 ?&[?-e AF, U¦W}—:8B:;HJ@w Ad) JDx,†zjeH@"Q3XZUn%kAd1AܔBU±F%u1ž%i#FU B?rD€̥d£eIAzxCFa‘p|xByc@)A^%AKƒ uiAb^ªݮŽ2A9}@jBA>$z>,ŖAD{7;hB%[^COAG6C4(ByAUT o[߃IAsG-c@Hv@~0 zAAA1|A6,C^™]Pf @Y4sLJ†ڳ A(@;fVd §I {?Ax\qf6&d¥LM u;  .J ۆN¶Q2o%%P~“9׮ 5c-(®&¬zW_=Ζ|‹'#0¸`$'SY\5µI\t-d '¢,V"k[dk+Qݶ9&9p©h¢s yn@¢ @AH:?)ZQ"S“HlNy[BFGZlU͐¡ܝ2}ˊ¦]ֲ &OZqDzj*:w7_C'f.B2ª6mzQWZ6zeÒVN9PSÏikfÆEB&df aH'y$Ô=bF *>1C.ZA[u!j_ Ãb;\$6J2§&z\ܻM4a_DE&UB B\βB.`+A!<°(B0¯~ZlʽA'<ZL[L4BRB¿BBA#o=  $Ixiѽ@B\B›ºN]>ƒ>£aD0_@­/…¬:{CµN±_2B4 ¼T ¸sA;2䊮sŠهI¯—6lB:I0&AŸ>/+V‡ÌBuWC%JBFW<*˜(ŠOA)wjA};B BBsCk)BXAܪB˫E2B5@›B,B YA>§u(g9@BP2BGB.B oAHB%B|A_na^ҔBRC B|Bt”m»…^X죒;A:A}JBޔBUFBusD–zG:4@:I&Z¼RfG΢@#h:*eA bSBcv>L ŒB <m‹:ljCh•[M“"ARǬBϖB/{d7¨st@QuS;XzalA{C:X%?Iv$ۺ$P⤧Ai^j@w. p>@¢wchOK‡gAŒ/A?ŸnVx8BVB؂@,hQbA"pbe6.©2=g¥VŽu,\}1žMmBdANBZAh¹£BGtAډqBxipHWB?^e@.B[Bh03 |h!-,5<5$6yS¾:ƒɪZ«Y)"1\*}/¥'<:1 o8&‚DEfŸ%)+©1%,µC:$o/h/­D@nٝRZ@{Y>3u_,w*>~sW7¯‚@՗c-ƒP .´1H0“+v@1=tA=ؘ+܈':gvvo\ H2BRn“cc[M-~K'Œ` d0]&`œIM@kv‹'TA&z?§@.ŖA9)[ۓʖ3@UkpAeGtƒMpmAIsx*LS4F%$™@Țz¢ zn!7RSK_± J1¿UA&΄ky KSb*Ʈc\ sJ*µ¡A•e $4޳uԋϳ•|ZAEp¸!)c‘jT E#BW eŸ h/a¬bZJ9d ڷ$r:!½?A{A”#bg-vJ@>BzBB l²z@ U8BC{An!j#z7EcB B@\«5Y{AbCMKZX˜AwŠ~BzpFk1B݋ĜÕ'¹4|^ǂh«0UBY“jlQSBcPA@LƆAzB] A2,'mp+ `1Œ_@´ػB=xB;AqIˆ@ "P"$”;BB/Ÿ: d@=\`o?.$ulBm—A64gAݴBJBA+MA)AGWLA{8A)+¾D‰O¦‡AD̯«HQ-G_joPFUũXºcCǙVtv aBlܐ»4,*%%B9pf¢W¦AAE2VS?eARȔA<l@9b`@dˤBrBrjBTB7AHJ=pA0B"P~B$JNI&BLAQUA(`ᤪ@P:>TU2cPBSa :mBZ(BV_AB¹e8Yak¡KF@^BFB4ЫB~BC%A\B B|A@6ZBmDBAo•M"nJ?IX? ݶ?(?\ݘ>F ? Rt?~H?ƾ:zd6ѻ?H ڞP=}xl?.1?ﳿ[f?ח>н[H? > ;>E!,r'??􋠿ڽA>r=Xۿ%޿gk>giE0-w]?i9z:?bK>='_ ,\ >1mw?)ο?.G/?/ϗ=l=/(?>(cRޛQ?&)>@p3>P&(?=1C ?=ξǿD=>_>?zqk?j,4=$3k?)*=\Խ!;pB(=1 >PN?9>"^B#?y$=D>R@>SH>ܿe?B2?E%>7F?"0> %>N˿EI.>(?U?&?C8>mf?T?0~$=]?JJ3w/>x?>z>\ Hc> ^>>jƾA–B=cyD=ݢO/e?$*>ᡐZz=?@ ?,Sl?Tz?6^??ٿ >Ru'q?zsg.>!L?ߴ?+ˏa'޿?J?h>4<=Nm]wοRZؿQyxd%|>>XQ>??!!?-H?uV?KZ= 0J?,d'?s?QDe?=w>p=3 @ 9p?LD> o𻿅g;̿ ak>e6@?'?=DPj??~Ȫ1? >b꽑K>% ԾHr?*&>4^\?# 2?2pپ?7˾>c@?6?KGl> 4>?[?⾑<9,=TZG2>܏W(ƒ1=$> D>ǿA]m !?>Ҿ)*>#Ns?oeL>W>=~?Xt>G?啾>ƻn?+HYLML>=+P?]=Qx辸sH8?F<b'?T*ڿ>|d>L!ȿv2>! &'PV? '??&ǿrf>_;C>8𾄶̿:۰|. ?tv>>郘='#J bSZ>A켾2=>do?h(?ò{?e?_t> =W(w? Z >3}N>PJ0D g>bTt?Q? DY>9?yfmy@>ʞ͵־ɾTO9XbĽnπi>v>>?{+>7?i5>fY!?7ϵKo} wr(<0>#?$8?J7 hz>>vy?KvĿ@H>w?0޿$EFψ:]]pv3d!?ǽ>%nδf\?\[=(A>W7>s(Ⱦ>V Jty3"8?8?f^.F=>ۧ=h?e5?b>+gLWT?DV>c>#֜??8v>Z˾.k=nf79?=ꍤ? e4?@<{|>o>@>rD>=c4ľ;n?? FԨn>')uaDO*R>xt>v濰2޿!D@<>n~??B>1>?Hk(=0? ʿ"6?&.t5?\Wg<`?($8>^@y7cL(\>S="mKu?6\=?aV>x=?M= ?^@?3׾5l?Ka?01=dto=->J!޸b?Xr8f s?:pYC:>y>+k!> E#O? ?!吿0^?/oG7"P}>[JE>Y=Ÿv}U* ?HPᾫ=h-@>-2B[?a>нZE> >ѽD6>ۏw[&>7Fp>),>G*+C2>?>>jdn`>k?A>XZ{?ɤPL>uiMj;4GѾ򻮿n%? dhU>N ?*to>N@ݢ?XF& <ʿ ?e-~?.w8?>q> ?l 'JYf3?)#>8Ⱦ?x?<>y"?, ? ё3澈o>> _b}>;?@%\?b ?>K?a'{K>G?">?%OS>>?`:y& R#9}Fk:~^>20>MJ霿 C>f?Q^ot=Й`G?G:?>r>;>M콾= ?:aɄ>%پt{?.E>XB?id>Ξs=H>qy=Z\>\pj?h&V>$?"S>w_?IraU/o6?eT> > ?y?FȽ ?U pn>0J 7!X>B?g\?Ex6غN>KfE>3u3> d2?=P?? =/;??u5( >[ $-C@ ?*|AKG2̾QҿX;?7$>f;Ի???PC?Bh6>>HY?>6Z?ceNhٴ?3(>w? ??>_>L'r=>t?οh>?ıt>GSr (N?]zEB<-> ݍ>.he>>?!?6C #4)X?O T> 9?R?!>AXy?_`Xl cv? O#??/hT<Z??Gz>>M?$lsڿ&N.`-`?֨?`l/>v_?y>Tx?V>|>mx?mܑ=˖ʒs= zN̿Wմ>^ SZ`0?r>4C*D*Nռ;>L(K>2l?M?`?LR;i?qw?>FXK?{x?-> n?D̿CTuBS=Pm|&0=Sdfi<2?|vD>z%?9޿N0|N?$?gP=>N޽b?:I> >C6>>?i`?L@>D?">#98?=#$/_\?=G(Ŗ?3YR>>-?P?R$?=c*?~?%>J?,$bI@&>RoR-?q)˿Uz>i8HoG>?Y>|?ҿ)T:l9J=t h?>??OZ*޿#!la g@ Z?z? 2?[?ݿ6?b@>x%>z?PFw>LO8I@>?M%8ͽ̠?w>4e>P ??_@>ƴ=85>1Ⱦ=(Y>"?N0?>~rfyԾ:?># ?$w>AL?,f*5>H0l>ɷh>;4@-ƿ8B>&?YP>p9?-?ľʿ&d=?%{(? < U@wX(Xl>7>H>T` = >#ؿI?>%?.6?0L.698^#>q_*^n+>Zؠ$>J?1?5FQC;Yx>`n9xh:&KO>A?KSP?[fW#+?!ٍ?(U*˜V`>6I=t?_ſp.Y?':?f>*-~?2^?F?\쾯d==h̿Lz~>Ey >JU]! >i",qI??3B>2?(n=c?0H> x??=n2>i̾6ŒLN=0HAHS>1(?m*>U.PkQ q? X j:(? q?=>e.>n=X>J>C#>п*E~?Eg7>$ۿLԿELE?!Sǂ?e ?=?{傾x.n ?2&}?ROK3&=z;>bQ?ƐKS?$k>A־L*o?⦿daԾe>RL>a?@ S?8r½|~kd܅>hnß=^ ?*>nk>UD"Z6??o?hJ0SiLb E#^?I>Vi8a^0?'>  |$`<2=P ?h(ҽU@?ۿ迮~/?=}?,?l>ND"*<ʀ'¾o;\t?2yr?$?'\>e > +l>v ?@iؾ>h>a;>=?jdQĿIII3zb]< ?66?+$9>,DBDpq>Jz/?=:? ?_T>&ľ'?G[? ?#=>q䋿(i3x쾉50=OP7пxG?l ?8P”TM?-υn= ??[>ЏoP.t?\_9WFS$QY|$pO>hy?=S_d8 `.X?\}n3W8>RH?Gx9fr׿u>V&=>Vҿ[{(J[4>B)|L 3~?r}?Y?ؿ}m7ľ9o>Z1Ҿ:!"@>WA0^a>Lz<'4p3>?iGRF T>f`;>EJɏw+3@=P>2= |SpYпe ?->i?M֧G>U>%Euo??LF?Y?X ?%̾qt?>yC떿O5g>Gcް@%6J>+Y 4 5׿ ە=f?dyy}ʿX߿L?e$FZ(?9,u&?W> a>Z8z> ٘>nLLeScxt)U ?]d?'ڿ>wfs[`>hI>L?9猿ȿ.C>v}d/i%K[X?#1?ޫ> ʾ1i?-? Pp?~A4O~=g?P, >0Uܾ?2h>7?>>S%W?J\>B? '?R?-u>Q>3xD ˂?7>:>v)дʾ>> Fg> ŕUq?>t2ϩE?dh?>&>`h> ?>z>#d=t߽*K>q?dv=Q>2>Hѽ3TľPV>3E:k<O=1;?Tr@>~_2;G⏾M?%?*de'|L?dkY[qi]+<4_@>h?8><'=c?#8#>o`nkz?0ο6?O?eؿ2`3=xȿ 3?}H>;?m? \j>=NME#z=q눿=>?>?RV=ؿznTV ?>'WYZv&~uE>ܔ>&?/j )[ys;?ǿ~?6&?CnAOQXB =p1>>nG4=: h?8/=>:?C9UUþ7=1^-ܕ{n̾09L>~rŵhdy:H??:&`eSV0\?xAl&ښֿ<{5>D>jI?5z=fB'L=8tMS+J@.>EMY?o4?">Jᚯ ?#==4P>F¿j23 \bx>0>ܿ7,>Ϸ=&־#Y?l?a?9Ӿv56 R>Unkv޾>jK9?5b>{3O;ݘ4e? пa\XhVl=V= ?,3.rۀ//?7C¿^>ȿ+e>?>p̿漢S?7>x?h,zِs>HE@<@?=?H[>{`tm$?xݿa?Vt6^0?@=Bg -M"?<24?J >OqF#?F?n? U d< |?:?m?vT?'-?"??0?A?Rx*aZ؜VSֿ& V4>!W?i;$ ly?>_.P>_?yj>|<= ?:=? QA+@&A G ;e@ -A @AKQABnCYilBAT4w’#zBBZ,C6C E3Aj@!i~P@>ABA 4BB2P B٣B{CB_mCBE0BB1BRC!{fCBpBFb7C]CC+i-CPC`pB.BNC?29Bp&AABqA‘*7NGVA@"lCي@1ABM@A-~BSz `#ӟOx+A@hcA+BEВBKBFA>AiBA_lB=A65=wB tV!ϱn\sCB܋B6~BHRrB-BBnBɦC>7ChBBjTBHQ@I´t0E 1_B@BCԇABR.A BBA9@FBdBfNBpa.@;B5GB]MIB҂ݞAB VB=^)Bj`B~B3`b””w­B:A³dFBiB7iBoB@9)BzKBTC{z‚A45NQ B|A[Y^a“ho/ACBB\BP B(B8`BfVA[DB_BTA.N¶Bl@_:Aޠ‹l@IH!mBdxB2AAz޾A}NC+BgCIHBBUC"C'BќC:B(A fB]0,P B5BJB>mnBnqBeB%BBƎ B"fBYMA,œq @NŸG*BLC&B*`BϋBbB/1B{(pZnB8u'~B\Td Qo0\NB–Qna046a"#tAVBECj„0A|hPwSfBZ³1BC$*@tCB9hB5ԪBR}BЪBXUB B`BB/HB@HP7:㙗ӐH­¢?AB< HN7BA@PCA@BhBa‹BwB3]hB%C!QlB'~FBBsBJfWKRB٨BD@MAD%7uAĀ€$.C†4};B*W‡Ag_hC@q BkAB?E»ӢdB.sdRB2q@^vB A BCBBAAPC4ABqܑA8mBABBA ATBV&\ImB@eC `*BBZBBY+/Z«tDr@A%  [™gu”7e\OFuNBݎB>cBX%B_9'n]$؅dAMc9PhAMTBA{Zqc|Bp5,B3¯"B|gBլ³A^GAFA4[wišn AΦ€pTCB)AuCՠB BBTaBPxBAB-A=a=OHA@BoBK]BB*`M_A; yB*NB9 BdCC'<*CBCBvCDB{+BEnO,zNB:+Clk#@ B܅BB +B0B4B!KDBLjBL/CnB „]B#cBCmmBͪ3BSmcBAB>@يB@PC1GdB[BbB(B ,BB`B.oFTu"Ƙ=j}“v?=%e‹C–۞Jt/V"Bw @½B1BBQdBg@BB^BVA6BBœBBA'¸ B4AGkhdĄŸaO$E~B¿il$0<…%IB`j41AgBVBܨBQ A{B3A~DKBğB+,@P(ApMlSA)wtA€:ͤeih'86#A‡J0 ZBbpHBx ;iBB:ZBo;BR0sATB>BBB21pB'TA᳈@BɅHBCBYuCOBo@_@D7h"B~B1-B@B{3BB8qpʇA4DzA3;B@_ċZ B B`@hBOAB.fBF=7)dA)r+B[6>kbqٿB8־>M =n\#6Ɣr>a=?^$=_ƿ?+.|?S=o\>&">>|_`Z澱y_j66B/?!@>ĿOH>?xY>8D3LG?kh?%DWAS*?ܓ>v$><>&ap>H^пl?>Uȿ8 .Qh4?*V?sx>?Dv>^'>nU>E>Ė|JG־@tt<,Fƀ?A !1X?u3cؾ<᤽>$\? ̾$> =m=@?/`?y?@.]>aԿWz?Qء=~рm"=;I>>$>va ?w?B$>ɨ? ?@^>+?p?nf$7 T#x>$ιW=Z?g>+!(? ۤ>(Dz>p >@>T?x־8J?,ِC?n;52&>-ž"־;;Z? x>h>BCh=.Z?iB??b?A>C>Љ >,Fr?f>P?=g4(+V+;ݿm>+"T>>3`?3b?a?@Z>7ھå>:?N=?r?fV>|e?O(='C0>q>?6:>s t?>_CWd?nC=N>WQ?ÿ ҭ|վT>l>'(#+Կ3a>H>>=)t05?J˿I?Srp?M>xʠ?ak;̀??>`>Sl 7Pt!9XD2?4Hi??L>>Df=[?c?iIYY?eiQ&ȾZ࿠??̾ϻ>,8\J%UCcD޿# ? J n?0' ̘<8=epɚ^>SE- -`=-XE?n>8߿iؔ??C=ш޿ar\i?>S:̚ ?=dT?.8N-،ɾJzW(oR?]H>>=i> Fֿn^?@UT<>8K?N?>2hr/0>2?W>?;Kv> (0>:dQa ?0>e ?,r>?d@><#7 gJfBH??V5?N{ `=Y<ھ?4n?AηB>xxgps?9>[(>P?m%w>¼?_9W?7?7PX=VH?4=>ߠ^!YVȿc>3=3?X?C#3?>~?˿(? t?4>>:>=戀?lZ?ž^ʜH>&4xD ͟|>.q=$~>M9?6ӥ??f>m>h>>T>Q>􆒿up >v>2ܿJg;*S wX_>+>fJ>=8>֓M?>ʅ?B=~>?[t,?%#>7czP?.?4'?17? {nÍƿe4X5J`>ad"p>^ ?J?6ƾw?e̼>?c?)8W>Hi^R?ՠq>,R:>z ¿BPؾ6>{Xu>R _9q $꾜]=W>>@>(j+|?yj<6W >ѿ#[,?ĪIxi?90s~JL ~7*>H>ӗ?">&ξ߹ҽo{, 0¾/Q.4?࣊?v'ɡd>(O?i8?H>駦z?Y;>z?>a?8nbi4d=|?[ ?AP7Bv>Ҿ9LCF?I.=?I>DpP?>k2b?^&LfhT?`E &ξЦ??L/h?6?=˶>-=z>N&> X?L#,8?4>ѿ?8>}>p?o>־'Ú>:(P*?Y>ܕb [3>$|ok >8>Q>,? 6?hڲᶠ>߀>̡-XT= p >=>v?D'"9+?N9?zL? 9?l^,No>?׿ W?>`?,?/'G?.S?kP>X:ڿ:&{? C¿Aſ>?nK?sƛ?>R>*c辖>v>Qޠ*HwYٜ>Arײ,ļ>*b)m.F?X> ޲`>?ET>qE?:8!yξ7>vh>1?RF>2Wh?1-@?'?՗u?DaJ=H,m?$?Ya>%1F?˿?;=rPlj=>c?Ui>8mh6׽!Ph`>n+C?[+>֓9=>@A?6>8#>Ŕ?)>.Ǿbͅ?2>Y͵?ejҜ?u@c|^&!UDr`׼=& >AEd_̿ 'a?%?W>8>,=o?ȾG?Pw?ؾB>28?R=M0?!F?leOHھY=f׿SJa/?A5?T?H>??XI|>P⾭X? u??^>>?;->?F"?Bz>?Uޗ+aٴt>쾕~V_nP>8⾖^>~>?q|}>"M⭎*V&_S:?V>=,>\?H8>Ʌ>vvP3>F >?66*Mɿ28=<:?G]?ܤ?&a>q>v [b`?łDl?^b=AsƿT2=@X>/?ԥ=x\>5Ww>_?8a?>ҷ=8?e >r>>幽>>/T?T0>콻T&@ɪ=L,$?l߾??&>o* >fX> (?;?5Bb>!XwJn5$d ?$? =v >}?!2?,6>xz=>>9Ih?vY5>?8;(?@3?/`>` aCܸZt?5l9*]>;>ak?>g>t~bۿ}P?4|p=x8(5^?*(=.ѐY\>F0>,\? >GVF=!P?Ic>ľobbBr=|F/$> C)>G>YW?G[9uF?W<?<&>}c=l>v r ϽV=>R?*%^E_rYK>puJ_I Q̦?Z("muOfNP?־|?>:=ΥB=hxT>51>ྜ?tWq à6d 0u??T@>f53?<Z$ >Ӣ>.?dҾ>ԾW?;bоBʋ/0=Wؿ;8>@>Ӿ/V_KT>>.6\X?9(?<3}(>r>?'T1?mrY>w,[)>5) ? ?,n>^?^Uݾlپ\ɿl??(I>?1~I1?` *>ؾy dM᾿<>a? Sӵu3>[?f>|f?/0?B@>F2?@ !>Y?u?A%ػC?R>=`uKľ=f`v?uԮxF?z*:>n$!=84?%o-0ͮ2>b#=^ 'V>[/?)x?>β?>p??c{?`V9P?`x??/DӾQ?۾yp?#u?ܽ?}S+ c4>@?k$ ?t >nn?XĿyE=?+>I<>,?8o"L <4>8a>>Al?A=`>G$to=h?{&G6RDվ$xֿa~ ot5p7GX>T>u7}H,?1>{Cd=߀Eh>켧?2H>8, =4,>QB=hCh>N,V>=k>Z>>?>n眾B) 6Կn]CTǭ?ajDD^=B6?29>4wش=?3yȽ}`[ؿb>Z(=?N y e>/xZEoxh>?]] "~:`^ts#2>f¾hl?G>GATtH>ڽE>Dd? >PÿJ⎞?q>?!ʧ=އ>4v%?Af(=rt>[V3L9>0D<}P?F5?N> ?c*?xNĿ'{t-[#>ி8se^c1?3?A?J^=t ?^A&UbO>3 >o pH?(>xNW#]`蛿"ue>ǰT ?>-J?9,=&հоoL?u \Z࿊ter:e=51>|6>O>?m>T?I<][>b>l>(>t_?(ٜe>>i@*`T:>+>=ׂ [#^>?E=\-9?:=4o2v<ϯ>{j?x=7ʒ<5>q%?t*<@Ց@%ξp>D=(Խ>A;JAE} ??&>T~lO?5H?d D=l?>]>k G=q?>"(>%2?>h?7S?Ut>wBC&{Vzh оbhT? * Qz>MmʾNG%?{Gi^=UF9([>W7|?Ol>>vM8?7]/>_t=8V kԿK>-(=ĂD>> ¿5\%>j?X̾d>:G?7V?A~8'0# }lR>2?f>2Cpd>xS?:X?>6W?[ ĽT?87?g?߿CUm=;?26=l=>ʿR=ξK?@i,>{?@ ???X?Mi >tS"k92EH)? >=t|>4>O߾`?ƽݰ>[i>?r?> >Q?e?9,v ? }pľ==/ C>YC>t>3_?fL>$ƾfޠ>3>jXJ'?d¾( ?f?E???2F.Rxp`{?UyE?4ގ<ʵ?5>?LRq!ߝ>&پ)-?>K? ҾiY ѿ%->B\G d? "M? >?3l:?"]u+Jag,"l?Ƽ;?q>ge|H@a͉>_>>_?[(A=SH1>f l}|>M𻿞_>Vb>+Z=3?k낿>ؾ쓻qԍW=E>YH?&?6>?ufο,;L?>p@=pGп ־W?8>G^?(=?}([׾ }>,Hh,|^C?9v?0[<1>!=f?>?r?k쿆뿝@>׿]C>*־<>뺼I?)? DFv?)c<0Q> Ks=S>>b$?X7N1yu:=[AQ@OP>l=5]@?,?c>"g YWA?? ?? e.Ϥ{v\>a%ORZ(4?;>X><<пLp?q?m>b1/!$d>걸?i.ݾ俥C?>N>"@Q迓N(?l?w ?-?𽗧>ײ)̈́? _8= /4tQ\UxjnɾNv=6=">WI<D?^#Y\^=m>н{?D>8?ڗՀ>KN>%ٿaDɧz=Ӽ`@5.eJ&պPp? 9?^>h?@?>Qq?[(? ?/C*`<X\$B?:ľ_?M?̨D?Ģ?J;F﫣IeAҾ>^?Ѻ=HJ>8?d?т?Y3>1C8>gw ߾Ӫ>3M>lU}+?L?v ך?< Ϥ?>jXp?Kܾ?"N7v? ?ږ+oh&v!>>m&%g?*0?$?B$t>)߾==% =򸼿} gq>I'?-:o=:{>hu?>5? =Т~4?a"B1B'BM(cAߖAŠ| ‹- jAqO.Z?@4ۻªgAFCLljbMTª8$/͸V\ R«&–h'8<¤[ȥA~M^*fB;X:©/$ e)o3ϼ;RA«>@)"˜vBnwA B.«hWA-!;h@0BuӭkZ!?»K wœWiSZp40BBSD‚C@BK|Ar>B;nfBxAxJBa@⵼BvQEz'AvJj-&K>ttWB@£:aB ´x—a~@zVBxB&:XX (¶ BnAxBmƶCO*BeA5BW7A-Ȝ@AxB@LpABpdBBNBdjiB2_ACCBBc@ZXAё?u|ڻ…Q”z *o;¤j`L$—X,]p&y>BSd^BpB֦Bw0GBB%zR@ºBBB B@3(A~|ړz Be,e‘ 1qBoc|"A@Av@ähBA- B#*¼(b ԿAx(mW?B9£5B[& ˜ٱA ABBqAC f$:`|Ÿ1R !N¦lPB"ļj(GEŠ B’v "¡Ƌ’F#bA oBys[-,J¿H@V0$AAB+Y¡PSµ$R@wBN @^Ai A.BC>Bm0A~¦Boi–}"Yd~ V˜&k}A,ByH|B-sB:B+BB!A@B%BĒB^JBGbC2Ȋ"=’I[A&@BMpBR^BH\A0cB B%VCGg+? c…"@2B_^DBB€̊Mѡ±LEBABP¾²iH&:g_j¾0b?tA(Bwrx¯K127h0pNK&P£Al:9bAȺBԑ@fA1BHh "(AոdBVBw=`BPږAoB A!{BM&AB~KC-@c](A7_T.¢B@p"BZ=A&BBB4BECBS?BXBUwB[B@qB&AuA+C:-_Bg‡7k]o ›A° AA4@S BX0 _B24+~#B0@^B,BӿBKCBAhC&B=B _8B¡݋ko(A@¨g@HB’?LCdA\BnBGh P ­ AC zlY2`C%^BBBT`AjBLBiBudC@ ‡H.CSnJC%pC U>B BnB/BABB'hBu<@3Bf4WC.BiBEfBƶFBBB+&oB@IЍBy1lGNBB_B;BbBb H¤4@1Afl…ipHC C5AAOGBʩAKAlBqA٠B FBBx>BhBGBXBcϡCB,a2 BAC5ϣBB[B׿AMJBa*@nhv~Šm“^4BfDBVA:2BU½@@ݥº .yGr? Ÿ q, B)Y R%A]0B*B>*³ ?= YU NBǫB A 1NVB0C.][eV!VS.pk3A6\|Bz@ѣ@CBC<|YBA&C6v¿fC$Alf8R0A޺WU{B9B|NB7 B*A,J B4> ƒGœ@hbBX.B+PB?AoAe:BذJBudLA޳?>GzغBՔE>@B,“aVwI/${\B jT9B<ΐB%BzAR&B >,^Bz5BB/LA1jA!s Bǵ>B9bBFjAWB,BICZؚBBs%ByBB͵Bƥ$C^nBОcAx/B8RQ‰-BH7¦:Bh.m8L‡Ff*d@%B1|BB|JB)B-}@<[DBQB/B APABh.?oCPB7]BC=& pBwB} C-8C*~BC-[BjBB)A$C, A_L¥¾% fUBaA>"š8Ll­YWSbJޫr*A,kc[AgAͨn]š)AgtB˜@B0B2/CC EB7\B'wBM8B`AVt0‘zBB>@aVo)™&²+BG"A±B|BbBjBqg@edB:B#ҽA&(A@$`TA A—AmAΊ/BAEBHBBPA˜BwBMBmB*B'ΠB-BCW@AI eyŽݔ¿d(BBQB9mBe + BhƆjjB>dhANI6FB{= 8=^\cR=B(jhB6@$pjT\E"|QB]A\uAA!$ y½"a`WW=BΝB֒A~q?@AΟq!?.`BpI8@(AA3!}HTA1¹vsBHyR±@6u՞·(S±Kg3PPd= :ABK4bB4lV8"1`~FP7L®$B+9]Až r48GY A(͢rAzBAmBBuG·IoBHALAm Czp[[B|7"QQ2@pB5!,qRAGAAA4GtBjEiчAV? ¶h”"euо?tխ>#> >ۓ>3@ʿZ? pt'aT? ;>n?ҕ-(d|>>DPg ^#?:ɕ>g>=8‡.?c?O ? ۆ>0 ;>gk??Z?OH>6+^(?8-QB?Wb,? \?u&;?T?dvIIN< *Y<.il=ĢO-Ҿc<^N? 0?Nh'?qy?NDӿ]y?+e>@P?f߿#>˾u>>=H>Ƚ$n[8?s;?"N=c&Dj\:>)ા4Žڿ ݿT'uC?>?,J?4#z>-L>>0t>wJ??$hm>>?vv>!k?%$F?=Y>r2LP>?0f¿.>>8>?w=B?Z?"Su>N8=q?+D? -Vf*>'D?>s̾S>.b”?_"?ؾB>r?>IU0H>n>#?"?%>H`J'b>3>(c;<7Q??A>;<&">>,nK?0^e}?Ij[ȿ3G: &HտD39 ??4b*?#?p-8?x0?m02?)q\p8B>SF޾U? ?Bؾʔfrop~>aG?! ~?4|??gd>q *B$>jT?#4V>SN>ѾL?'>H2?{K73>vifYn?;# >(p>T=?>Sxb?FB>A~?$?Pn`>}y ?@Y>?(!?KB?Yҭ>^>Aj&ߘ@?>bl#X >.{i?F>43?%m}>ʌ ?>:=}? @>g6?\?yj??CJ۬ߧq>\0?r3>f³>> >g?-O>~=P?R>Gtҿ>y`."꾠,<:b 貿X\C¿Dq?7,?lƿ?5>t|來ۨ>lO?%zA}?TՆ>7??e-? Q]>D>6ʾ>"?O?? >:V=Y,/>ݷz?{.?t?Y>m?Mx?>9f= ?cٞ=S>O\> >>?Ro>S?]$?`F9n?(>C]n?",?p?aH>>|z?sZG<#>{=?+4V>e?q!?(FʿHy>?!p>.־_ˣf?}:U=Һ/>6b'뾳 ?Ϧ?ؽӻ?_$Q+?5?2xp=d# ξ=r?A?:-' =>^iZ=?Bà `?l> ?[M@-D?#j= fl?n]? ?uk=א>=?n?c@2?RF|F?!@ ? >odɬ?uF>?V?$r?D>.lP=qȾ?<6"a2˿#?%II,cA?Ml89^&@^?7 uYE? E&h%?6E?'}?4=._п=EI H?j~>a,?#8 ?w5?4S>ֳ>>>z?VЬ{ÿ@ƒ>/(?]N0>(Q?K]>:?; G?L)j# J.qb;3 ?7^K,X?8"J>˿$Dz?6mJl>P=~/@?vxR>m?0?sC>o'*pol ??;Q@>?z???rjwE?`,?P>C k#K>U? !W?&ӷ&=c9>W^(?vOν߶?}=??b?w{?Q*s= >M=q>="?/l|$>a?6Ҵ?>?^Td$@?h?ĥ>P >vk?p?bV3セjc?BpR1?Bb|1?EM>?G۱?X?n*(>Z>B?Sd>G> 8+* XG,?g>pd">>ƾ4>E>V?ԾN?>M>+,l>F?Q@ݻQn9>q?)쾫)w=ؿ C=qV>c?<ֽ<>|?3Xrh=; ,r>?` ?fZ`W?DN?~?S?F(>ZpQ!a?k>?v~<_@?M>cx ¾Kd;kX>?N0[??R<8??r_X=히n?R;p2Á?!6^ >3R˿v>䠴??O?ȣ ?IN?E?A#>A?xt>> ?9>'`αƿh=@>R?\?>ɡ?4V≿ š]h>l>,?ھHy@0?w1Cݞ>6{A>!?Ÿ<>Z>??彽B`p_>|f?>($>>??Z`n?>#6"v?I >⹿LU#j>?, ?5R?~ڇ0>ezc0ȿon?⿉&|?≿ >?vH`>v\?+D:D@M־j??Z=[Q>c=QNPW ?qȽH{[)?>i?!5֮]?4P>| &??R>`B, pw1?*8? *5.>>vA>&j>?M|пE>ۿ8(><UD>_Ʊ?XU*7>UU?{[=P=*Z].?*>3?2>3!?1?Je?ݞ5 =;S!>Z⿊̀>TԾ>4KG ̄??(5ĽXH*@ r*~D>@?r:6 5%Dn>r ?)-?Ϳ?k-Y>>ɭ9?雅?lO`l>>8XоN+??S"F0>tta5> kY&R~?}!?{?^>t?9?j*[> ?6-?}B-jBl̾!?;1>dT>·>?.>Z>>ZBk?ӾRs=ྦྷ_>> R涾!>?܂?oq>jKI`?ֿ2dU?]?y>M>>2=t>u=&3W>{J*l?%Ͼ* ?YVq "?_?>$>re>W&߸lX).=w??8>-{^?>qȿo?@^v8}^q'2B?F??y}p:.XN\$Ǿ^>>r8?R%|οH*׏<?O~>"9i?FA>?S<*b辡/^?B nm+-?6=UU8 q88zN>,ξt?[ Q?2f`>'>XVG?<|@ ^7Kxa'?r>&(qսI5=R`3*<:r͟>{>?0!dg0>q? -f>] .?!8? >?"?sNݾ}<Ħx0?c/>+?Ie?D>B4Rdt׽a70ѿ';¾"$оW^?_>>??м d bI4Kv? ԯ?B}3s=`S;:ֽ.p>۔>pIXQ0]ڿ L">ݾ ttE? ؽִ=pP>ķ伖޷QtH|ؿD8?>lȿj]}>? kDXm.>*džp?K8:꾻:?>? {C@yھҿ)tˇCc>~L???\ b/} ſ1Cʽ˜Z >˨>F;>j->Z>)j:+P);πjYP/x6N?0H>k`g> ?>.n\J7XD?.*QmQӊ?>0>8fžYR?*^0mu->OyBп4=Uݿe>ff>ϩ𖽇P kAX[QmʿX,>!t???XF>>?=t>p2XՐ>[>&=,ͿX?PnP?**?>\]bősY>eʹRi9׎lLov[Ed^J/p?>nfެ?k6?ְp_&?&> EV?rc6@+>6?-cX˾=#= =>CD_팿\?5(r> (?\2?O. >Q>;> ws(W?) ?nր> g>8rDH==t}EĿz6ӴVm?&w'uE?C(MPpy*>暾\H пY? = ^?>lbF?UdؿKXo V?8n=OBH&vQt>򘿑,]述?k8Z)Z>F?9t7?%?m>Ւc?Rj?1RVн>ok?0&]>/!Ӻӿv&>2(; [>:v4?{j?->x>&\?Z?P֔ۥ>V>O> K?ds>>ݙf2? vKX[b>̿L?Z^پVl?(*?T};? )I>Ht>!U4O?uP? 꿇 2?, K&?d#ǻzɀ>~l? >kz ?];]Mj?-Oo>>H:q??NS>94jS'uȿD4"BI?]#>r?=/y={`4~X>y#?WD> ?>=\?p\2?~?Ҿ ?> տXԿGrn>@8?R6?+xe4?Sj@ej>-M?&Nh>]>↚>=> H%׿,BEZ9XڂTŸh#f(?G.=Q?}'?Ypr\dYz?S-¾=7x?7A>=M>-4>>,*w D`?E'>Z?yQ>C>n)~?^QO'((}̾-j?6/FI ?Jn>3~?GV>Y>G,W>Ϥ;'[0?wc=L>3Ot?j#?>4I`;-;6)= "d?}+~>-ؿsO>%>?VJ>bsg>$?5쿼U[=i=?%Dg8?3J>W?&>5,*=F?O\>!5Sd=-1ǾB"!U>)r>ui=?=pJI0޾>v>y*0B S=f?MU?)>atjz#$x?>'G?ge-u>`uR)uӿn?/j?M?"pR2>!s>澟?0ǽ`@?LO>']0?@>.1r>IkP>+>̈́>UoûҿǿʾcNK> >?`*L=z?' PP7>cO?`L=xk콤hup&0^[̿F?5>\?F~Qot{>M>l3IѦ,?FϾq >h]U>l->oc?np=+>E ʽ^lĔJ]@ѿVo>޿I5?5>*(}`/>>'?x 8d?cxPZ6i>IH\FLT>i) XJx} ?lf1? N?p^&uw? /> ?<vlʡ-W?|N|??DO 9 "I >>ڵ?v#\Կ9>yKj-[B+1ھ5h -rVk=&&>"?u:@>z>? nV >e?-=>o!?I끿R(ˁԿ̿@>.^>y>?|nn?Z->ʿmJ9G?|TgͿ3`="˿gך;>d"?-:b>!>E?)c=kd@m?;5&m?5 ?Hx?خEӤ!%̿&`?s}? >L=)>gN>o>_k'о\F?h?J@>FIa=qFr)d?Nʣ.0+N,ҿ=0?L*>>M?,=?K:? К0b}>`=]n5 T/=Sw\ `p 42>@|?<:vfV@?C@?]H?e >\j>>1?fK??{ vq9?Y!.>2;rC{AYC/ BB}B+C#TBFC YMC?|BpBƊbB<7Anwx™PSC+CC3AžBc+NEB0Aھ BM BIB/`C BAi\Bߡ3Bn`rFB-ABI ɍ+E>AAwB*ByBB{4UkBBfBYBBHBArA5AҟA´u†AlVAdCB@ B`BMB,4BvB&,B@[2CALBB20*A=Br K2AL1hB;!AH?A~ B NBBEB4 AiZ€tB<hBh@U(BkBd|@'BjA4B"&½Bf޼AtIBN?0A‡"&?Q@B5BB̦>Ԓ@G6Axn.¶P´m3mj¥|dC(ˆBwB+>kBuvA f9"A?:A K"H>\iA B-Lńsu7|A$c¢k±UFry"B,('X;A`B#p^&fB|AADlo/BcBAbFBh±trA]BWB,CC%B BjZQW(A@*@}vA9#BP]:BϿ^BxBⵢAB-2A}Ao -¢HA ‘L  GBIBqQsY;"„B_"ĶN?"’$AlBCž<Œ#XBy BACB-@?BBBBB+BpBF{Mz‘(A:HB:A$"BA*@uŒ4HB,N[kM$0Oz0B v½,N¿ k3¦BEka qB*B,BRAAsldBQX&oB;:5|lA%"U *B3".>&j@@NxD0фA/l@5? 0~‡b!B+G7A# {BMpBDB[AOB̄@#P2P-B*BQAQ‹ŒbI@9B+ B"-sBkx@oBdBȱBnzl3wB-MB @|BkA˾fgB®BXYD;ACf*B|B|XBf;Ga_ABTaB;ȄB=ABMBg=BpBB$0C9GB׏BB3BXł^AHϐ@:a@@_pBSn–cBI`‹ ADdgB*51BBlBi£Ͻ@ĨnGBJ3B=HtA@O7A=bBBT {-C4BuBd/bAޠB09C)BC 1^FB5B]h«"@>qB_XMpB.ZBa0BlAB:h۴oBgB.B0CQi HB!-4:-|H=ABE,G&݋4ʨAWHˆB5CwBmkuC ^ApQSWBcZAA^C(B4 ҋB䱬ŠXAA,`A@@4B…B'.B'BFB~@ߴBHB OBq%((ABBF2B4AJ@mhC' Ba\A3+ASBB8A)A9QBZBdz—BB—NB{R,ŒbBid\AB$BH^d:Aq B/N vBnG»ŠViVH aǑ":H­ paBx/Ap*+y[IG2B)TPSRAԄ@@fhlB@ )eB-.BB3B8C§oN v© T8'<i"LZAZ~AgZ(A}gzC>*Pq=spADBmO\Ѵ‹UC&r0BOOB;[@^ª)ĉq¤VBMrA:BX"ArL:B^C 0ABIAAEZBSWH06m_/AM\&B!dBFBsڸA N+)YP(@PAWA%0@~*((1mtF$B (Bf):b2B#z?&!*B{A(BKAHAB5>0 4N#JC|B@pC?X%P?>`>}8>D׿?B~WV=W p?Li??7ZD\?:_>?>=ĿKhx?CHܗ!0?>$x??n>;M(x>aٿ'<2~??=}P֡X>>?$4㽦AjT@>?$@?KE[?:3`?K>-r`S,?+(/<= (>1|?5/?U<^x>C径?w>X?~>6g &>:6?r?(;?p ?[t??*c0ިVx(E?]# ?:?%>>>?$^>p.=ܺ?a?ct.> >?>z?y>Wƽ?f'1PC#a(>AϿOAo? 7Dn?7?+>?YS?V)>ٱ?>~4X>p)Լ0>HIQtn'<\۾W?g=y >Ql>L;?? >O$4f|= i9%> Aix>Rfd!?>p?ῄ2h3#%'?7[X?e&d_d>!?L7F-?G0?˾Ɔ>(徿!-KE?,)'?6|?jc?Jn?  >=Pֿ LI> >lൂ>|R>V?O\8ԧb ? @wtE?>\v6J,>~?, ۿ*tJ+ }͆>%=x0>!7yW?ߚB*-2>>݇?lY>V>V>pkvpn>h>m>?k]u?HA`0>4Eir>+>Oi?b@*g]ʗ9=s[ ?Z7>9 ]P?>֗2W E)о7Kf탿=)?h-"?`5v?) ?Y>:IgR>h݆?! >22V^"=GR>]bg(cZ?A=ҾTP?P'Z>̤? x?}o<`p>3>ٲo&> (俎>~IyAA ]??A֖? 9D@u:)c?U<`?DI?0 ;:;?p 9?kڎ?;cH*of?r7T(?ܽ=1?dMf?}S>s>f>zx==x>{?U? />>>JÑ>~-6?ngҞ&>h@ Be?m>y ;F7S I?p_錄^l=4 ? ?W?5?/??$PA>Y>ں<>6A?4XfD>Z>Vp?6Z>׻>_?i>]?֣~v'rҿgbU?&.?+ھ@I=?@>`E*T<>E`G0?) =fԿ #cU=w?Cѻ?am rX?>"0п?j??9?7<>ؾ桻>?nS6>/|"? idE>U $?㽪^>:?[j@q>%=^Ŀ`\V?T,~ӛTOh>`>D!Qsj>St > ??!F`?0?H$v<>=}p4rA|?/d!?@6I >0=?I=>p? >ˆ>o N7?:,Ǿ˿ƈʿ>3=KX(p6ڿG?,?ƴ>B>x?|P[NN>rQ?3.?urư>v1>ǛQ?7۠d]d=,X?,a?>N? ݄@_?!;׽tEQ$>L=> H>W-jӾ%z`=ꁴixP>i)?  Կȯ=[?g|=ժ>ɿj00%#>MmK>m?7?nAͰRi?=><*8pqQ "d >[>>j>?R,t>D?Ϡihzh= ==4>x?=rZ(?q?^=?=ԿX?!<[H=K-?hl>b!L{>[H?.e~e&@fN ?CW>J?o|z?G_:>@?>?w bοo*?Qž$ξ>¾>qwpf*Ÿ|݀88;ȢIt?>L>GF ??%l0U?6; յ>ӽĘ?~(YA>j> ?u|򿔮 >V+? 0>)q=_>@)վ?T+˾?"ނHZ>ZX&?=ԏ>=b9 ?!>+ʽ3H>> WvRyڿ}?l?Zj!,>\=ټ^=1-q9ʾAL =?* S 80?)?7`>?Jp>L"waiĿ7 ⽸u'`=rZ"26HMq~=R=F>#*> vR~4? >B?_ ?:n~?`4־?Bp?*Ԧ>$oWT<=4<3D0??}Ì?o>ߏ?{?| (3G>t>k@jAK>D>>2?ٟӈž殿>?_?FV>a?ÿ?c; ??&7wȾ·oB-؋x+ {㾴*!ľӊL̿{>?c57AH?b0>=RH`M?<>ġ{$=hѿ&v̌>xaعnR-Fou??2<?ypmh[>g~>0?: :F @>+?7b?cE?=#?=?yy}>A?]F>*?:;>2%KZ w?Fd ?|8>. >,S9x ?IFP=*? >"J#B,*?ר>涬c꿇g>;M=[2ܿ?(i>e_A\0¾>%W>=࿆1 H[>Kؽx|b`?x>~!8?AW龫>s >:;`.\16>z~o._c?S|>Կ>(?37?=Z;@?>?3>֧=>?_?HZ?v?b=u-={iJa8?\AL>,3-h촽 @|DI?2g̪]; 3?> d>Q\>4i?G;.fA?jOS?ʿ ?'`>^X>?eԾ F>4O<M9>S>U?*?޿[/> J?#(?Pp/@;?b?C>?%wf=kz%e0ctܾw?Dο$S޿L>Ir>7?q пn>d`JҾ 3Q>83>T`#>[#D>Ǻ>+ ejοl=С#>x==QP>>]o>ݿ7Q?\eR? 쿄:pԿDQ0ֽZ >{?44){?$l >^GF>U{<\C1?W|> rAU?P[5p?!`>(u61,$>5w>?Y= >'G? <>~Sxjw?g>KI(QI?;>J=x?D4(>5?$?_.P?c~?Au??[C=>X>i\?8??Ii8H??\`?1m?|M<>>3?.?*>|뾣6ٽu ο,?M?":>F?+>pzI?/Vjzd?.C>{&">\8"Jؿ l6j?.t?[l>jվ^$ Lِѿ{%~񝋿$=|#Uо=Z=оk?=1Ⱦ{s>5?5):7 ?A=0?B?Ap?>Ù???q2?*>r=^>h뿛'm2>98>([ >޾ ?6?(鿄=M?;?sʿU:=J~ ky?2 ؾ 4L>>Ue?7z?ՠ>i|>9>Y  ]=ցd+߿_>$>}@t>Gm>?E>,ܷy=S-F? 3>,?t}flQ ܓ򻠿,Yjg@>v>Jn>%T+࿬b/d?XH=kPM] ??O>n^$ =ľэJ?}>Վ?\!R߰g(?? ??\Ւ?<@$T?/)b?>R?Eֽpej?oI`f>c>?`i48>]YB>܏ =);żkT>?>>VH?>>J?;xu=?㵾=?ad̿=?.;S>gL^>U/>,)>\b>66=8>]BU&-Ⱦerz:?E[><,_.>>2??bP>?q<ʠ@?ʱ>Q;@`=@?e?(" O?!=H>+Xғ;m.>Ѿ+Z?|u?T?ORky>?t5>"X? ]?i2/\s>ܤ4>t"ox3?. H>ep??^x?QqN>唿 |>>s>n?&c= >5>jsY=پGCJ}[#?!>Ct&>C^?Cg=NW)lh?X v 3DJ`?9H?}? 3j>?)7>KپA#WKX ?5? ?&ֽr ?3>I>?Ǒw?eWҾyCt/?>;??a辪+*pܾA`x?4LʾL=?xg{?O?fe?"t>>O.T?; D>b.>b͘0T#A^gȿ;㽻^?<4H>Cq>ڂr?0?.3P[>~t:>`?,˗@Y*>+Q n^Vh*?]ھ?薿0A ?"(?S:J=ی侽]>|?Z2޿]?.5?|=8R>gz4?bڨ?_" ?>?2`?kw@x3Kڕ1P?VŒ>ۜ!̾ >F?oż>uU>Ԯi&Gr=^`q?;r忀ʏM?/US@!E,=2>s⿦>? g|ٕ?.?,dio>#a?Z(#nÿ.jS ?I`?>ҐC=y>@5><>ρ> >F9E?'>u?0+?_'^>Nj>a>>Zt澓1?ÑcV>-Ɠx7>4 J ?pȿG/r>>!S۾l? lN|.?>q\?>??B_? =`*B~>x5,=_@> hb>-"ؾK2? g/>"C% 2O= d@ ?U$*:?_Dc'?G??ˇM?U>>=2\ 60Z\}?sx>;_N>-ྔ|:ި=>cH7/?ᄃQ?,5?A9VH?I&?)"r?ʼ<͐>??Y.>a?mt?_r\?B$>X?9_]%ĽЖ> >:0U?/0Ͻ̿TӾkC>?.=Bv>s.=i ~?넿 ?,?w~ؾ .+1嵀F?GB-4>>̾^9Y忡*>1T>R ~>Gh>97?>,R-|$>O?ݔ|A?"?,}%r*&>F?Gz?5J?#NC>/>:˿8i<X:1Y?k^>츿`#R? 0 i#SjY>c0>/>e,?|H ["x@hl?dl>#>uv? ff?~ԽU?eD=i|ep*=&=?~}>)b=(>O3>>ߡ>{>?Zr>}<`>·< >NW=#̿ {?Jԁ{>F3T̐>8=ު>:vYU>A #>>+ |>s|"?"{>V>^??).^;?>IJ,r>=G^+.To(_>P?>՘??+>?ʌ={t`>uƿ+X?V ?GTI?u?.=}\ |$A>W> ~lh?8;>F罼>P?%c]>@C^>$!f5&?]Ad?3Z>8N?V?)ʐ6bN"p]ӑ>ށoeiq31?t 0Q?>>!#̾vsb<4? (UW>+Jk?$NS?1S>^?e%k??z=L?/;u><3j>W#BǿP?~?f?j=¶t?? Y=xìc=H*¶?GRO`:>B ZZ¨,¹Z|ʿ ©aZQ˜4B3A}3:Eg*#B3%?ŸAd4q/3$W9ꠍB|œaB/ <)UB+H M6=;pT!>xUOq.¨] N8rr8mŒB^yz^74 o@+CA%A`}‰dwB˙A)".ABY6P£A;C› ¡cA%* OfxAӜpfe’[ž 8bAB@iyh ¤Ҿ¤§BH–A5BNA@ntB G:£'Tb|·#]fAqSUBNBP A{,ª@&w¹¢c\“V,!:c'¬tM ™­P#BAsj.@, qA AxAlH¦̐D)d1AH–+u@JCƆn=b´..¨A&0B2kR·h {&sfAU Ә*I6Ax [A2Azjd)MBjP$„A aAAGCATiQA6p‡vDBv@'+xBQ%BZNB@6zA4A? BWBWBO~B~%="7™iscARA@,a]s&f0xVXfD®]:."Aʍ*bAEқ^£,AޭB0eA$BˊB&@8B,.k‡MTCzrAB"eB@Z]B-hDAh&dB ]B XsG AL k {W¸$8} « ŰR@PBU­«u_g™D@=Bg?B4vBtBYByBT@wJBGi%BkBRB ,CƑp9JBFzBrBdBk,]rB+Bʲܪ@B`A{1. ;T@BB\m|BB{1BJAVAAq+4l>uB4A3ͮB:B1j"«aµGXgZ+$WNhŠ[9`Žyc=n®I = ,]º—=B}UJŸ#x.|J՗C.5Wd¥ ()tQ‡< Af`¸09) žeAJ7fB a%tN¶M^آŠ5ݰQ#Bi~zBn5BwB>%AXAȨBlB*%*A Q“Aj@*,|7RA&‡)1!5Bؚ>!!£K#BkBVG BͮAgxA"A\b\BB AzwB?BBJjB#2AB!bT}xB;BWEB BEAfI6B.CB'_Bɑ`QCKb BŋB(Œ^BS°³K6Y$A °lp3ˆW’AAc‡&AE2PBm}Ÿ65B^\a㛓B1BYŠ D DA/A()7G ""BR8CBخA [c$GClfWp[F:AHJBH.²)G^B_†wO§A)'4?A44BԂyBgB9+,BdkBBBbB%CW6BgBӨC"lBםPBޔLBb˨ҼDG܀ɡETa­ꌛ*+@BlBBZI.@xAA@Xz.f/:pBqa) 4kk¿X—!^BaTBBlBk B@Bd}A IK GpB?؃g&dAmfAV—6aXP™QgɽZxBAAIO$A=AvJByBlBCkA`,=fBIu"jBs8\rBXeBBGAvKZBe‘rB7hBAˋB͈1A糺BBVB2B }^g$#B5*@T#Br&C83Nsz@X?5A@^¦\}0¶_A(CEA2B ZA/QV@1ڧŸNLB)qB?"£A~B@B@`~m>AIA>A2SvB)۫AMt†Ԇ7BA'A@HAM8>»IAۃBQzy?BAwFBEBU~ABMdAB}I5BbB#iW6¤;;‹RBPC ZA6BKS§€@X(*Ah͎A`B@%FA}<Q(²LA5B &- A x˜yCd>N? ؆dr?{?׊> ;2?]pKڿ#> u<>j>|?Gy(ppԽ)վc>?^ /L>2?hƾA?(E42>>2;?e?J2>!>?IN}2 N:?(f?sx H:Z>ͅ>MB- K(?,!?c2[)R4˾?- =HQ??H2?%*AI?QB?Q?v X?ݚམ6\(fCL<) ?`?0>(?v 4#ʿVҾ`p?Srp?Dt LLY??KUML&>H?>IǿpA}=UH>\?2n?D?M?MD ?;X܎R?q2`?D~=0#?]bh?e=rG//>ؤLjd@>Gp;l>\? ?ȿNvF ?k??0?jʾṮ?Yg?Iѿg?;K>i=@P>I>iisHtSo??e\B{l>{1t_>^hs-,9+3>m>:j?0?G7?T? t?_?Jc\?~R~? ?i<@+ྮ5t >_p5?)ZQ3|?i?>0>?@q??` }='ިFJ=??@aٹ+>4R2>gz?J?W n>cw zm}Ei>?:CL?p3,.zpѾ=?d?'S>e?>O'@ܿ>~k?M??Jأ?ͮe1R=Q?~h;Mf4z>t ?nK? 6?t=>*>"w %#fZ=PmH>t i6?Zʂ?\sԾf?+Ǿd>QR??T3?\(>Q(7>PrϓÿA@8y?>d? 6?>j}:? qi?.>L :|#$=_?r_+h?%? W?}?+=匿>>=m?b*?%?@ ?<>,> ?N=޿@!$̲T>>[ #y?-=ȿFW?&DMX? (?n?>΋7=?l?bw4=|??Ⱦ?> ?h&$>`?Ȃ>KHؙg?hBA<,; ``t`>3?"x??{p<ľ;m>樾 Fd?H/v;̀Z?>\/=_ m>Y>bm]?2s>ob9R??8= =|_c,=.\+40::>Ҿ\qk ?dMl?H8?P$>Z R?w?bdB;p&ԽT? t/̿*>甾%@nHmq&?4r?0bL>5٪|=?;ݰ??zU?Tp?sVX>,Mv?1L¤?V?uH>z>tDT>1bT9?׈>eV=8>HOWJ?7?ӈ?S?ZL?/?Dʾͯ?1`? lx~?/)Dv?3\d >?Nn\>p>o>r3?MZ? p=u ?!%⚺[?Ye>2'>,1D۱;`K?`y lF>dҾ 11Ⱦ>$sl?^LK=By+hVz>">DT!<5??\?vG/gV&N?=B @?4h਀>.̿n5*>k]?)>h?L߿ZoN쾅Җ>7:> yl ?>{t?+>ܶ6O?n|˾GUYx?Q$v=keN>X2@?3 >?VY/п;LJȻe>rҿ ? >62=X?)7 ?Ծ6QNz=*b37vQ>Ͷ>PW *"= ^Ǝ=р?6'*>6u[?>i=D@f( r~=b={x@?l>>5?"E>jTT9>c_B>?>q7>a]*ee?nQ?a>|v?{ԇ?_xD^ ?/"h>RBod?,>a }S1>)?{?:/?@YS,.7>#=^_?ag?:sоGl>ʮp6#z ɀ>NM> ݼ[WP6ۨ`˿r? >4W?h>->傾׍J>9x>wU ,ɻ?? T?M?m$ѿ "]?􆿹}>D?DgqnD>>\kt nVI=ЬGh=Hܿq&?z>j>;?@yT> :>uLbȀ>.= >&>.Ff?I W |ܓUa?>*Yp?C`?(?-W?v.?)#H6?!>x?<>OƽmGĿRz->"T=OӸ޿׆*=檾xS?l?>5QrH>Ք>q>@?;>q&Of?_>YNi,[1>&?Ly>\?4<???V8? liuBpn?ˮQ>W> (h>r>ِ|xe>|?l?>L\>>D=rQ>?/aN>ܿ:f?BZ =ѫ?ad?J7f3=IZ$)>|w<f>?8,?Oվ4\Y 8yf?}X=غ??uÿ#d>4b?a?}qڿ>ggq>>aUV>慁?>i{> ?gb>06˛C)@ CY>*?鿍]P<3T>V׾۾+Wz&_?8]>E YL?G"P?)9?ҕw=ǥ|>:>< ?">Ev3d ?/?fǞ?aGO=h >$A |>@$#N9?vüeH>>𤾺f8>vo S ? O1ϐ?]b>wǾ̓??i5@(kMY}=v_(>"r\<~>:ShҽQ?VF^GT??e(VJ,?Xn\4??BEH>.??O޻B"k?>]>)<`P>9>؈ؾK{?"ƿ==1K0? >:?jxy\ ڼ[Z>oIOu?׿FK?ɡ> C>UU>iֿ_<>r?;>j=?ay>u>>h>߮^cg?wզ9M;?뿆w>$?pvA>lm?z>m޽>*>0z_C?Y >SѾr=TT>/?\?l,ؿYng>=jĨ?9>WSݿ h?,?l俵,>>)> ?*?NSo?2+?.?p>|>ex=>dI,5>7`>?-c& X?zJh]=1ؼs?> TFs?`B??9=x0uFXjS^?/f&?O>p۬?iC"w滿Vhҫ(S0>:=L0>6e?@0>"|?lYS<>ͷ`?r-d?f溘G%>Z@? .T>ݗ->_{=\?*>/e<ЀXj~$=Pቬ>&Ľh?h?>">Z ?$WD=*>U _?6m,>?5g?i&?Fs}91 ?{j J,e?2w?>n N'׿_34h4?] ,?$X?/dP6>???:?yON<ӑ;~Q _>3RИ]̝?h?Ot?>Fg>辐꿈}Ї>v??H/?|=?n?45>>؅p[ś\]>鉿+bvп+༳H>Nvfx>z?NI>|FZe4?;?f">оc>aο<>cxAb=C@>-~?+*6~ʽ8?#ٺ½4<'z-ʾI?Uq~[?&4ڔ?~Z>!-? r?@?-`R?& ;?JjjmN]? =ݽ=Ռ??L?A]?~%*>h>jPRR cqX>$ڿ0S ?/sd%)l?u>)J>)>پf > ӿؒy=!ː>H>?G7}>ooU>F=,g?2+~4b>v>K XG?S`j>|~?Ӑ? X?uV;=DpCjz[ؿٌ#?@󿾾ȉ>,[Q=[ Qu*0?QB>YO>(;?A>T,=𫀾09?xy. >p?Hǵ>,TCYؿ{M(E?d?m*>&?o(7'|~\?dzw "_`o>eO߿yF?L?p9s" ?W>.5>.>%7BI>¸G87wJw辀?4U>>>^>?Pڿpk&>??tny>ǾB>?*><̿>`?&pIl?+?`)?7>!s¾>0yg?*զm\'D?s?b>ʏ(7A>޿l=zP0>οa>[V>=> Z?6X>Ph\?Xؾ>0Zxr<>6=Ȭ?b=<7ؾѠm?Q?q>6~? *jM־?*I^<=Q>H l#? ƿ:? >̽=5ͥ ?̂`Je?:O $[CU>>N|fLJ?z{cw<>ƜOg?\?F>K;?p̘?=2?pB >oy;DӀ>?'s>1L5jj HwN>ٻ{*??=f> ݾ@>Ao?\?j> >=>K B>O?A{j?¾ /,u@>>6=(P̿ 277u>5Mm?m?B??ܼ?qs"3^0?\m)'ʾS`?ǽ>%ھ~RC迃!?"8>~>!>2?f>Rg?SJ0> >^ؾ]ܼܽАܿ#E>.? `R4= >绤>N?>‰>><>᰾٠k<*M7gd>?%(-Ͽf?^lH嘿2Hy>ξ=(?2B.Ϳ=i?"={4?U'>8 J7>n?O9? h\?8eA=>Vc=zؾL?9#y>P1$>1ʾ >2?7cn3? )?喾D'>(տ6u%Z͉=.?FL0> ?? S?RNxe =6h=8?>PP cDr?l>A A/h=x>2A?aTJf>ݤ>: ?=$?X:A?=p` >F809?>]?#=?+=D* T[4>2 Q??~=>\+=egҾh>־d?nܿ l?jY?x(d#1:>l/?Ba4?nFC??6?GAȾ6vl>μ~ G>=:п:ھS^z$?U0I?*e>+z?jR=?t>Fm>ƶ?}ӄ?;\?><\?AX>>'@>ㄾtt:,vrG8> seynտH?^/l?#3[?пznW>f*?1> >r&ھaZ׸?{F>0v? ah?4>L?dFy?!;.鑾R|X>ub+>+!>?giga40?E:>$Ξ>?b>>ϑ=J@dF?D38?:5?Y|<4Vi1?n̾c$?6& '*o2n ¾?v>$$޼d6?e{?)>aO?q<=2=֝M?Y>uF?O6yp?>جj>cXc6>l?8>K\n~=>U=p.=5ذ>v>ZY@j`?:?sTt>ڑ5#=ŀT"\֫ǛD?X=d>g>>^?'٢/?=Ψ?x l>ӿ*qm>lܭľ=D>ڰ>>\??d?>QT5J^d<@t4>* =+fؿ=_?ww=J^>ؔTT`G?U?p;=Iy~S#̽@:" fQtYy$ h}GP>`(>vgqױp?im`?c ʿUM>7>Hc> nS>I ѼDྜྷFy^>@9?:Dh?>P*Kb?5RX%?>&?{>H?_ؾB9L;w>܂>?2>:;hо|C_CCiB$sTC0EC BBhB k CCBCB?B1B~ $BƵC9BbB4B͹B\C[cB[CAuA-'jBCCRB.CcBB^BfB>BCPB.CN`C>|BeBϾC0ɉBhBݛBEfBLC BdCC8Bn!cC lC#C*C NB`B\CBt(\=TBZk!~BB\BPB~ B8CWŒA޷1A)*BgB_B@FBsBg<AhZVBqC߷B@BB@BC1YCC 5B@dBBA3B75A2&BBTABC5pBmc2BC? AB@ByB{rB,>2@ZBB(APBWB6C8B9bBLBCBoB8CiMBbCW&C fBˬC+Bs/C/nC6{ BC,\RB.DBtBMC5ϡANaC,BWCvYB:hC=AtB5AhB0BABA(ArBBWk+C.gCKClC^CV0CB C**C,C7XoBԄC9CiuB&BBлtC@RBB]B .BBABv@zx&4B- j0hB>0@Z.BXBAu? 2ׯBAbBuABCbJqC bqf`B,B,luAHHIB8BZCBB̦AkB VgfA(BBBB A^=%◝Bc-BӁB`bA BdBӞ.>,̀B{ϔB@@[A~BBB8{AAABCB7)B.bA=$,¼;BGV _03!Y8/+5߉[I:†|VB3sSE~@ F«VtA9 ˸¡Ax_3(? B ~AlA`?mv@+^BUB_}A` ¹uRPbh@B߲B7BKAoʦBBŅvBdABY:^K؞AJTxRBB BBzxB_,B5B9BBCOBECҿ#`BpBB`ABCBBUCBL/BBWBnkA;BƕBC"B A KBC CC tBsCB+C!ÃBbbC&PC$5CCBB5@QC(BB@=WBqAOԎZB6WBBBtjB=€&?}%g@ B 6>1 fA A@B` :Aɂ+8AYHA%}A_A6Bu`B edB%-A<BO^"B2$4VA >@,JğB}Bڋ8B/@(!BwB%ؽیBAWBRBӵ]!)A.Bɦ BT2BWhAi@Bg?A:A:`?.`B C+c@kBug@B'VB1zB@~Br0yB8B CO,C9~CCYYC&Cc'C>CWAC,VC>C!hCƿB<B/BbB'CԑC 0AYSVioB$BBvBݱ@W @oBֶBC!B8@gBBTB#)HAɫ˩AMȺ}˜B2~SBR]Bw8C-X1~BlBBH&BˆBBe|BBI.B3BBWՓJB05BB,ABn4BR BxRBFB)B@BgFCqB`uCAdٜHZA#*BMAŠxC mCDAP/B56BBC PvB^A*BdBsB~BBNl B\AɋA9BBτBB*Cq4CBNAoFB)C9BlC6BBd1B IC'C`։TA~IBbcB@vAVlp(/B-vv`|KB/cB.A5a@C0:B2gBV2X4D$AB\B{BPBBC(BB[B#AABpADs 2h,B BC"~BB]C~0BlCkH BB}CFvCZHC._B@wC1,CǠB'BB-BBA#2B|C*vW:7B,dAjC !BeA;B:CrBBB1BFCѷyJStABovB1`jϿBGCBCB1…i qAB,_BBB]AHA>MͿI,m?TI?ٝJmR?r?E?W?O.(eE *H/sGa&H>?5X?>SR=$H>"29?}<>y῜2x>YvgA":߸?~ uX ?;Bx@>ڿ"p=]x]" ?| ) >? ׿6\?$>n>]?? >W>`>P<&> > 1> L?^rge ʿ%lam'Ψξ@lj>ٸE(>O䜿ݠ> ="Hl$?&I?~k>7R>>a&Fx:[]z)Dp??8$>6>Lxz%?YI0>uk0k?4v%ʺ? S>/??l 8? D̶&?Bx>D܅ ?}`?nK=?%]Q?>Q- n۽俑&8\-{ >![l?!= l; Nb?f?+R98l?\N䷉q>Xx'Czпok|ƾp4>ka|IԤ? L"-",]k?>a>Q>֔>☾a>𿛠5^>4(#(M lF0?0>>fDsF>>8B?'ۿ*?<]̞o>}/>Կi?}@-.?%gmrÿ_j?w;6@?)8?ެ;t=V!?])z ߹ɽJ`ZLLԌ񋾛+VJ>$?>@= Nc(>XRmR]>W>]>$꿅/=Q="`彿C<:R?O?Ƥq9̽!Z-ÿ?NG)<>wVS2Ҿ]Q-'>w?>0#>Ĥi?$佦f0?f?>D?޲@8>?>љ?Ϳ;>&%vw>M>Ь;ø>A>~Tt頾=}>_=VE(>J͈_xZ]H>bA??Pp?pܿH>&]@>ҕ=XܿB޴[%c߾]辋WD",?iM*,(m??侵Ϳ?LҾ)>=?B?!?< 4> ,9oXt!f%,uT?>ԓd>^侂ty\C?x?&@t?>)? "Tu쐾TK \0CZ>͘Ԙ=f1ƾ<ӀR>'?4KD?=>x8?I>[v>|q"=Z]>*?wz>;>J`XoHZXjF@'Ol?|2Ⱦn6\$>+yj/>Oؾ.=h:Uſ3F6?46Q>׆'<~*>Yڿ.׾W?2>=/(=P>T7=5QпVU>ѿjs?-g?!J>,x?N6aG >p74.ֿ[&󿔋K/:=>H5j!7>ӤoI> zʿ>ʽ:CBJ?&U KXBP(@>^|>>f =2?1l?ghK>@'=VxߺD> Q%#<0 ?!^?>Dx?E8W>VUI6%K ?>e #xrF=?r5 >$?i?ߴ2ZH> 4,XB?%J)c5l?z?-a3c`>`w0?G=␿HP~o$=пC=i;)L>J?_L0V>?v*6>@J:)ZG(.:RN?b`>ӓE+d ?Jܿ*}$vL?TMSgҾ<| t*>۔ҿ(Q?f.?Z;y>>y>p@Ka> >ǽ߿6{_sxMA{?s-*?>{?\0[?N0JA;?-Y>|dS4?;vԿ6d]>Mʱ/l? ?H.ʿEI̽lXw?>0X,?i?ZcpPa]3>6}=ؿm\Hf~>Q>D?vM:&Yoھ-I{դ=x|e:Y#R=F&``=ޞ>O~$\>yn>[Cy俥;JT>U(*?x m?WIr5D*rѴɫ>P>=?5?)R:d>F|>>Dο"?=\X q=ɘ>i?=~=Ҿ3f10,qo?n>h߿WJ0ZY?O蜿>k?t<;?`]·A?,@׾> ?4^>k>4<>2>r>&}m}/׵>|Dˀ>!6v>N?cH>n½H콸Ft=MEJjE>xڿQ->Rx>$u@?{>︿PVܾJ~;,cSWǿ Pd>&!;0?K>fɾ]B2Z>/J(+?~6纰?JM? U?Hf= yPW}":JX8BQ$?NV>h?(Px= \$nZоW(Eh?Z?DS=ËBgi>)?%=Z|)M$?>TB>sg?k҂>@<<뽰1>[=?>|松+F?>`!Lc>qȾέ>"? h?v刾w?-?ھJ>09Pݯȿ?"M1(?S_6Ai,=9LF Fs0=Z8>(> H?s?b?S`= ƾ.<>g>X|!uW}?/Iq?պ ԇ?=>;I"0Tz5?-:?C(>Oc+ҿLu*rۜ~z>q`? ĴL9V*Ĥ>s=?f?=x<=b[|و?ЁN:"l>B?i0Ӿ>=֩8'7w> ?|c?Հ7$X@dhwP+پY 3?;"@k4=>\)?N >fw >_1K>%l>64>n|6> >]\>C{ݶ>|6e>`l?(y˿ Ps?(=Hl\ L>nKz/(Eq>Mz-? :.ܮ>\Ah%ڃ=b/d?Z?$z#>??򿆭(>J"B>D>~l?=+(&,A>4<68>hH,l?r~?8?g{i@ Pu?3>d>#9k> >=?!L? )?W/?>gzT?7? FXT<`"k/]?{?U>⺿H&>~ ??X罐(?>?0?z6>bI$8?5+=:q V3?5m;?cGD??*R?|YŊ@?a >=f?7oyO?8h?kGN>4? G.?;>G>6?&P?GQsY?s|R?)&>@~>?[> ?@O>7>.?P{(?.>?->J?3id(?XWRf.N`>G!?b%&>o>! 0?tG2Ceþ6:_#󾀙B??gO%z >K6 z(>>&?'>w?K=?S?뎿P? iRQ>g?O?>f?=,? Iƿ c/>g ?8?BP?>yM$7?eJ>GU?*\ߓ?x?uQx?NwX>D=>3S>w7N =?I'|?r3 9V=>ܮW>\ Do@\?v?<>/R'L>--Flr4efzp?G[H>"F[>>?@ukA?8?D>8fȿ>+A+>޾:Rbzh?|?'"n6>(?Wj=N8>6>O0r?@ >3`޾E0C >?3#/?#?z"?>u 6K=Ad >z>aԾ~R/>A93f>H?@q??C?t`t?ʾ:Ji j?;V?I $N>͢Bʿ3?IH?9?; -`=(0㼓8>h"?Var= V>L=>,B?d?lIE 4<2=?ľrQ> Q?y?؆?Z?~sV>> >M`@>Z< ?1>{H?;}?:_.?B >c2>)>Ƞ>7>m00?ze>4?彰>=k0&D(3k?fz?$Zžkd>ӬS?%m$@Yi<]?1y>{9g?־+>$?p>D9/H4fs>n&ЬĿn?{?PF>K8C>;_@PD=8 ;N~?wPa=O?7?!qW?e=nvrP{?Gs޿nwz¾($N>ҲO;U" 9%>mR>]iUbľ=0:?&?k9?`>>.}>W`>5T?q,¿B> 5B>y er4>C҈h? !=C|?"#F>x!> Iy?$o>+6VtCq>aJȾ{?XS>?>3†>9+^=P U>ו>ʾ}?Y?|=p:u>hDrƔ?*hb?sֿ?@?Iz׾M?>4?<]>W*CJP?>Ed]>倾?]?/?A=4?>4ˀ>] >w >>(þ?R?e18gM"?.Rȿ<킿&%?/Jp?n?*0G.=)?+? /?I>W;J|??) "??P|Io*>s\^>2(t= ?`}>'8%pN=?׾J?=lF)ܠ>Ĩ?{0vOɘe4>S8K>?x>j8R>=k?FX>2?I?% Y?7'?Qѿ⿨?:ur> ϲ= ?t>?>/P?8-?A>?l?V?E6>q,i>vb4sUW&>\>>NHщ>v> oGv=X> X?6 7!lA>)*8Xf4hs=-6Կx=.*@ 5?0iht>A6d]0>w> B|L?弽$?.c0=;t(>?!>>7?,?1>X>D,L?!;Ys(>*>p 2?Rpm>K=l@tt?D { ?I=U>^ʵ?wW|?'i?q>?=t/?;8<^x d>D!X 7>/E<T>>LP>??T??5?c).D>[d?%: ?4!?zh˿E9\GM?XL?=u> : E> GpDDx?NQN&}?x=6B@S?Eo3 t@J-> =@S?X?d>8?i?rx=et$>8^>X>>+>zg>d> =$T?;u>#?Z?Ax>Ϳ+?+z; >`n?+=S>_ >=p?y6翕+?I?4U¾UV^?|?0>??q?>S6,>w$2a_b _}n?mI:?sҪ9??? ?="?tn>Wql?>cF?i,Pī>T >/?h^(?v>+?=!y>8P~?AQ=Jp?b0.?j[I ?10jbd>eDR I+?Iq:>zh?K?\U>=)k?B²?9?\>E>oO?<߿N6=7 p"?> $=T <9%?D9>y? :'ƽL>?[;lr?W>9 ?`y?WZ]QR=+p>ŒNe}@ TRˎ?] b ?Ͽv񜽽h?k`W?rEy?m?pQ>vQQ@?+X0( O,:<?ΞI'? :ƪ-1?L?>Nj[@?hо>Z> >ނ? 1>>v־<=Q> ̽)`QK?D|?]?@~?X0??c>[>ߢ/>?Fn8>?"'=n@)t0\GV ?CPp?1>]͈?>8>`?,Ӫ=~2 3]22?4>nii1I;hn>bM?jܪ?N?~=nFx??r ;)?0>=O>B+x0= >fe><<-t?-Px?8c>ο(l"ƒY.@BMrA.~A3Ÿp9ԞBEyB{t֝TBǠ@\BN \=9;]@{dr> ~¬"fž1u^L >mk :vŽABuı>|€bvc+AAqDȡ@z]4T u,+BMvc?%zjRCZP8<ȣ±1|B%sB'k~e^„BAw)쁔X<׀@SABCbO}±³n xZ^1@Z9Ο%Х^6BwA¡vpAl>B|28BƼAx^Py3Ag*5A”fAGkbB"—B&_x@}m*vq=“B~;VC%*Eؓ !B¡Wq6Aig"{t¯BQt¿dœg ܬ{e­hۚŠ@>¾[A;AJB| —̃,8:R|Af@PBZeB;B=£;QB0pLªFjAˆU7uȘŸ™4B6B=ˀAe:B1"B?A).BzBBz&ABEjB*M C%7BQBvatKBtLAB1BRW‹ͩB(^AAn;4B_.@:B8BN'ABd@m‚B m#zAvtzJBSXB-«]BsB6Bdt?\LR@%VvBl6AZA{@Ah« YB>,AwB:s`˲BPZBw}Ad188B™ۿ&QL¯0P®5,B*SbBeA0οx¡A¿#41@k{JӔA%BTSjB:j>TruArӨB''A,ATZh~nBaBg VMpBaA}B2BG??@?A5M,TWDx@8AtB@xlWj?AZCi‚^cBϘB}BAɓB^BAjB80lANBçA:B\BAдQBMBSBaB@r”B®%.BB#uUBg_µ65BB~$qA˻Ae!4B qBgeF\N,#Beo1ABU/FuBH7 Au6Fr ¾+"ZA ™;NA4_O /‚®FB˃BBpC@BWPBB/FkQ)¤Lz BSB ‡PvbBpcBUBUB=EDZ0A@^&©+BfBWӇ¸ BBKAvT,B>B,?XB$A3B5A߅5ȕ2pB(Ga¦ršAΩJ $`X"AU‘زBpA#B,Brshi^B!Bm+m$0B6AB8&KAd=B1VByvAlBt&@OP ]B5٬^}uSA>YB As%ŸBAAGA]:±/:®FB>dBeBUfBBd9CD‡, B2lC BY`¿!#A$QAgHB\\BMARIAeAC߼BAFBBBKB CB}BB~rAJBnBR(AQBAAB:B%BHJՆB(G»C%A{BgA`¨_BBºL~4þJ„v<©H?&$@P؆@A%9@A0B1TBMA)f,AZBjM;B*B!rBc@&4B,Uº$P/^TBtyAxHIL1AB~YB$7"š0B#/Kܕ? *hA bj;mcAu@F‰,BuvBejB>BUtA[AXB9. @#xBB< A;C.jChB'C@Q.B&C BCPC=B]CTCBaU^AkBGgyB݅BbAWZI»EBKBnBi @CC%B±كL`nBlC p5?f¹}A#Cw@?꣨BB|BKpBcB.BAAnB\_B"B.BAyB>AñB#\L!Bq0!>@=%¹|1Bz*@ B(BuA9Ag{B8/YB_B_lAiqN|VBW?7 MIAvDBRoBBPhGAkq^„0 B5RZ³K@ ®B.|Smў?h6^~UAbwB BW +@L/L@d|2B?sBאAcBϐBvSB;BZ4AAjB]ASATMOu$AlAsBl~͹Bz4A@6B?B녥A3Q3STBBӕ=ϸB#CI*C-ABAPaLw<8^BhACBܓBpA8AwB#ƒ\DBE@ǂxB$?lBB/=jIO—:,Mƒk:H=}BA3YB83V2F~ AK6B ΍9M‹bfH2´7ˆ;wt* B7Au={9<IEHA㢫<A&鍒B/“D&eB\fA xB4AT@j=!A4B*BZg~a?B/B;?KKΙCC3BAdyUAKUABBcCBݍVX7CJ UBQBy2BZB`tB`B^?qBB WtdBmB,6BŁ@pByBR |ҨB2S@FB ( B;yn/???MB[XBS)$"L?BʠB 'B,>BB*B>BzC,AR?h*QAD1Tu,\x'':N>Wf+O"Jw?ҽ@A)?-`'!=>0>Tlݰ'>gMtED>)=轰tt<DNB*ڕ.>hx>ψ.?ҿǗ>>7޾P}Ǽz1:?4<>F9?V1~ݿx?6EC>t1=li>@C?6l>@ʽC7Tn^hZ#>Ŕ8>}Fi*k*H j?,Rj>?kM>Ϊ?Ɏ?|>?bʾB.&> C@BB>->X??`?οx?`=^nT>??c]>pZ;bSIV&z?. >N>'?N?O?*>3dc3>p8>m+`<3=+klҼ,,??ct}>ȿqT >[ƿ52j|@i~UB?0yg???E88q8O =lPH?NS=q\j>>g"?j_\~?PM?Z>?t;?znJ@Inxc+<ؿ*7>k?l(֊op>0>q(=bH2?f.=9=d?Qc=7p?Ul?Iz?Fv=?꿦_޾r>,Ff>#Cyf T>?>9 >/=T>Ap=m`ki[??o8Ui>G'翎=l@?0>"?[,?܋Ddx=AzVy]4D? ?FrD\0<9޻==?UW,J<>[Cܡ6>=??>8?=ޤ?RW쾞=">w,?GI&Al?eN*Կb?O{?O|xsG0>s>>ɱ~=wP?9M(` ^D>>?}BfM=?¾>@`Jfxh?YӽD0>H? Zb?>&쾧4r'ÿ\#h¿0?X W=EXV?LOB?w:Ud'?)b^}?D{>\_r>1bо6>^d?ΐ, ./` :>?@9 =??k`>?Q>2>F>H*z >}lGcK?TQ=to?TqoW>R>?wy(^I?ʿ Ep?)>HTq>Z=왿 .%p?=ڌ?%>>Uìd??!c=fZRR>1N>Zf>|?`Ti1>D ">b"悿!@E?a>>j?tb?=du3PVl>? Dҿk{ȿ?=?u>Bɾ?'*^>C9?-?'W-\ >d?P>ː?-= >nIHzi?%x?T4Ѿg8?d R8=(?sfHi;؍b ?&}>Q=3k>~>5,8>W?j]a?Y = 6-J>ͣʽJx>ք>jb/>-?,cc>mwh>?xK>i'=]>3)2C>3=Q\>N:??ȅ"Ͽo2w :>7wi??`=迅꠽X->?s88>fT>Y? qÿH,>b)"X={t ]iiF;RþY ?%n8?aB8>\s?MT ?_>H?8o7Iz=D?\'K)lc^X?G7>v??,ڿpſ`W,ƿ@=W?4>Q{btfzڿe?I>Ӝ9\nKQ>嚾alrS?8 rTY?Z!xبa>\7>M<<;'? 4Bv~Ŀ*ԭ=+=Z:چ/|@N?j??g=:x?vg>7B=0@+ȿf?11Z?U?+%}@Y?HU?]Zοz>x>Fl>_MAоZW=fn?? =;.?#r>$X>G=A`ʾ/??9>',?1̽?g\ھ?"c?_$ȏ?l#{=>MA*#b=7>]y׳`kOV!?R(+j5&>*PP7r>VQ?{2l?ob>_?O=j ?>qfȿMshݪf,=b>־;@me?> cM ?>>\d=/QHp> ?]&u?U0?V?߾_ '`` >\Vп{?~?)/,]'p?vu>?=>҆^w?2ˋ?̿%:CJv?^? )?6>3}o4hHܾY$<&b> > o7.5ȿ@@?@n)Ø?8?=Ʀ6=[XhU rF>Ծl.=xܿx'8̽b>m`|=0&>c % ?]?g# ?簾`n=4>xME>&?b>P?a/_?ᅾPD=>]>#=?nb@;Ͼq??P i}(pϴ>G}`?Mྐྵi?>EP=tc=H P,াl}>O6d?F-MB_v[,ѽВ0sо??MH?o>k=Gľk>+j>O?Hl}> Q 澘|6>s? 6>!]?,|=ب?_;@@<2==D?&v'L>/>d7i>2>>ڋ>d>QZ>[@9??'m>?;13L>S*E<6x:L=\0侬>\D~(Ҽg&͢16?-}((D0Y?Р:5Jl?a<*`?]<'?O>z#Q>cVh >??F㲾خ?#lh>Nʼ-_g3="V" U%Ծ|d(0!?U,ź>'?>φRGVJX<`?f?K?i?J f%n?v?`G80V`+T孿*Fq>?Icm?un簿GL1=}ؿ6::?8>df$ >>JV->4q@+>Н?*󾧾e>0(<?D> &cu>]uX>?7V>>JNh >@㬿Jd??>=`?>}ZJ?G6>t=?,?/?o.͢fpg7卿/xxI? ;gԫ *>.?jZF>?¿P=?,Ta>: >p~pt5Z?>E⽣KPCK X=?OR]hKDZ6x >B+=Ҭ>C6=H=.x$j?C ˽餬URt>?<>->A3W??J?b?`Tx?8>`=Ů"ho>+?C??g> ?>c??-=h>'AêD"n?b?? f3P?J?@>L 0< |Q?SL=[={ >E? K%[N B<M?jܹ??Jr?RE ?wgT<~-a?h?ȹ>T:3Q6"> Q>f[G =Ĥ/?9L= Z?20>.?8?&?x]$?,>(>w =MX*!?7,Bѽ?=?ǔ=]?4?о¶??)>h>ָ>}O=ț?&L3I?n?/<{ОS?\@>_>@]_&'}f>#oD>?C+???;>UF?nUȽ>nn=PI5h? T n">ۮ>Fkj=?'ނ=ف >>?>?΃?>K>= ۂ7D>a?p2;0>n?ݿ=TWX?J*v^>w=>\>o >ѳ )+H>wo>?%>(©?1Hf>(})S>m$;ʕ@>A?rܿ"R0? ?]Q>&->ɾ/ɼ>> ?F=P~ѽiBH=Iܼep1l>H?eQYW?5>>?G%???59&4".:{E?n{Z?ax?me^=ݾ?$^>O̿[,>DPa>ezFhĿlڿFK??/>&*?ej0?d>1ѿ`\LBπ :?i~>`?iy?r[>v?zb0[yiNt>?o0Yx8_0Qpٱ;Կk[S.J7߿,O0>~N>~p`\p5H{= o?i/; 6 {>ykPRN>/ſ???>G?d龙˾S>}8>'p6j=e>?vH5? Ͼ7r g?H$2rP??_H?Yþyt?3?Co?9>L=H?lX@;A?CQ>?uo Z9F?[(M>R? ?w?£# qӿ4?`?H㫿>v9X>GKz??>@.>0?>?4>6='ؿG1RcV~?<=XT@>>i>U>5xR?-0X.?p?Pֿ2>ľ-??ʚ쿆Z?}a=࿢'HP#e?P)'zA?ξ>J M??հ>?H?d͈ſ\6\4f8I>h<<~>Y2 =H>?*?s'? toT=L> >ng=? C>>:>w*D?J!h8>t}m8>">+;>&T+v>?94Ǭ?? )?{tF\s>?n^>Q2(??I` 9>zhy>˾?w}>L> =Nؼ4Ͼp0>JW?/࿯D<}?/<|P?|?.,6X?'?+?vǾ|=P?Qۣ?A@>ƅ _?^?;|y?iT *n=R?hw??pS?Yy?*̿:>V> il]Kt? >DwؿJ>S? >o⾀`>Y?:55ÿ%>[A&><˓$>q %iXe? >i@?tWտ@&>OB>-J>9ҿ[Eu?$?ۑ~>ԾkJԾ>=Rh?sm>f?>>s辇?eH긿">f!վq-wHG"&|Z=>+?,&>ZlJ=rS?U8>]?2*:?0>v>А><?h?Mv>4>a=8?Z#>е?6(?=?Xh ??WN\O]ۼR:>ieA>>e>:l>ܽm?4>^ô><?#TL>,?ཊk=jENd`"?ћ?> d>B [$ȾFx_YԾx?ԾN\>V??/>#h?co׽??gX>!?1"ҿ9ґR>:@=$>l>F>?'ƾ=L?kL?2Ԙ<`qJ?W">>d5??[ 6G2l:X<:3 >?>B->9?9N=>V(>>ͽ?AT>?>?e ?n*>#&'?1?2$->@*>kr)>H?窾N n*=`ڽ/ ?<,>򽖧W>?>=)"2@>?6>9=\ju=??;S>lw>oN? N>:LCQn >V>=9M3ᄐ:;>k^=l>"=6a?? ݽ?E!;>4*=E>h#?$tB?4%>1y[?|PTO>>RK>t?@>6> (>n?O#?>̿?Iɼ`><.=!bb?iGV??[HX"Dl@?M>y@>`?Qp8'(]";?q>_[Qkjn?!?`F<>Tl(?Kϖ?Ϳ7?=¿?;՟?DV?8>?ZL?4[~6=$v$H?ܽڻ??'?&,?OK?lsFriU?>3>g>|.?A^=Μ>ZU%$&=#>G>PBJʚ!Ŕª;«bš<01{@Ӌن=)$t$•i2L6 (j°;¹Z4L C֨T>Q 4dO ԙ %g¾RBqr¶Xd"E:IJˆ(٤B´G$'BAXb V;BF]W @5A~#·¨#R0!#LNo³#V®_5»¬>¹$~#*%ma^^6B2;@>TBj 4#w- Ӈ5Jd%-so Shq·I@a&V'9LŒ¬KpM@c:°1¿NGwTA²fAzFTBc1~@!BP1šq¼dB.2:ϤT@·y˯ŸQHBuH &S8ܙJ-G›ڷG7MCS tHA‰ºzA?hirµT!.8#]r5½mp@9:/8G ®S¨Z-*r%iv¦,A!:TdS— D$2E.PhWП@WW w;Tm^4 "{f«œR'iT$6KAAVoGBdJ_J.±1`?¼X@De#-4iYWS_+ ªAwΖ zA㝆£܍@a 2^'Xғ¡'ָaɐU^¾¼N/w*<L/¨pƒl`½ha;Ws6AoR4BOBru_3.'0^[:?:B%SP¶Cz?!g$ H -*gQ–J zՙ",aN|#¡,7rAJ*_—#>œu*Au5 ǃ^%BlC X¿ӧ,\ ºL(8A2AALAٙ[EbJ#VB/4mXvB0|xqcqAmv@^h<AAr]0AsifWE+@7:ǐ#”W.pC1Ak>`e@:z|Rϸ@pEW6D]A[Ж¸LA"\MI9s0©˶@ SP}JC‘@:¸8@FLnv>` AA;@$ϴ?sAH2>©xA"Bvy>ˆ­F†فBhB@AwZEB ;5BM>r˜*«XNcoŠ%\$'‡/nK€)i ȥL>;h@_B@AtB±=-A ”5AqB Ə!vN n.~~Üv,!K7R?;G§3'nµr> yS^ O4<4?AJ`Fx\᥿>Sr{*Vw‡‰prJ VŠAbD «­O+0kK<±h©A0OH#²E0#E-'`Í"v,4³ 4¬[ˆ5¼LlfLh~?o0`BFRAŠf5l„fqJI*WA`e& *߷>Qa8b[N;Q-A #A~ŽLio?H--r^I4†N°n5Y\D$XAªAB]"£KZڔB]W˅RIO°{קis!AB RA3)B}AhB( AHNi¥´K8eC†pBV‹@oB \DMBXB AB#BAlAB4BYBj|}F‘0FxB8<'B$e@ȼ\1҈$ŒB`Ž{$:wA]B!e%BgLG$B? )Bk~k8̘?l=J:>qB=wlʾ?@}f=0?W1e?ֿ̑6?/GR>Cw=οh>d=4/X a-þ+N> "~):пg}? >'>4V{>L?<>0ں=d.y>v>r?羾.>%߿dj"]?fv?pR?F>(]KE=о>ኇ?^*>?v7 4z?,K>>^wθ=[7 d?=Kz?Jި0?X?D;;6eG]=h`' >ú= s2h?߿%:o8?,~?8BǺ?:l>gcA*rT&@>h?4>` ¿cL?Z{=ڿWJ?YPIt4?h>ꉿh2= >qflKz>|>0#>-=о/ȿl>GĿZ`?=f޿)#R<$`м=fm>Qp>K>ݦ.f? >vdo>8=@辴t>ԲԾìd>`H>BhGVZ>?m~vMy>@?)wW? R?Wr(D\[UE?s??3?,ߠ=C7b߾֓zw껕r?B9}?!>k?SP>r~>`=>=5.0>noľ@!>o~>=x2G\Ⱦ mq8=u??}Eֿԧ=4>v>= ?$7?о=.=w'P=˜>Pf>UM?S½)EX%d >PV@.sRy?!>S?L>*B?D?>5?>>Cj>HD?2C?=*>x=B?ՒPѿ> >}{1gN$U^?3uX2M|=>;=o??,{n8Uþ쾽xVd ?I C:y\磾İ}ɶ>>_@T=^L?z?=[g>ݢ?$n>ǂ?>B @Ҹ?>羲s=>ye>v?!='F)[?uXN;\>Y*?b?B?9 ?^K?C>>ɿ!PTɊDKnWؐ>2辬mG?b?a 4"fW$ 28F >VR>GѦ>5><\ > ?[Y>P?A>}(> Ob?B>sY>B?Qt>??, =þA>A/Կ)>%I>۾N?u <\>f> ڴ!Sa@k?:{3=HTe8Ȕw >K^4\,oER W؊^>$:1>r>ou"մ VENzп}pӐ?s:t>2O\k,Iu? >,=GJq?d >0R\?! e8=DI>6>c? ?Wҽ%%E?0 u=R??a.[? z?ǽ\=XR JѾ&}>->>?0?S?`?;j><}ƀOJX1 4p 6+fұ`>P?P<佟L?=>Ump>U=]͎>^e>\Evbȿǽ BA?B2?i3H?f ?vc,x??jؾ%L ؾ=$ l>Tq?"X5;L䰿.?~> '=OY?0m^>?lʁ>\ܾ>R@FMn>><و8}c=uʺ?_>Ӛ>T5ou >M>j?;hT:1i=y,?S>i3WX?w-ĸ?kNDR>݃'4>C=/{??ֿ8H >)* ?lRLL>8U] k@R?5?z"?6?8ƽ_ V+Ʈ@ ?YЀ=ޠ,>(@sle=>880꒿Ul?.c =i^X8?A? > ?)>?ZRC>ϻʿ:MiLfbZR>it??xT=?=B?=C L?2>$C;?L`ʢw?u>$:: K/ڂw=VhM?A?<; \[>ш?t? >Xpr E=>?Wc=بxE,?(@?xh>Ǥ=- ?:2f?3T?bXz:xhI2:P>8V"@j?&_E?2?2$r?.?L?sq:=et>kLH'f=&Q?_?Z y?4=h4>Mi> ~DF?N?B?,B Y? 4 ?|>;?о ۶>VQOL?bJ[E>\J?Xپg@>P)>vV?ɿH;x?۔?1>ڻ>5lo%==\H>^?^h=+>?/J=D,>p n8|3=俚ﳿf=K׿?K?f*3T?S_?XzJƾdF̙?[u(>U@#RC7j9qXa=hB8ྡྷm?ml!?M(>ځi8Dlon-Ay $B?ב?dJ?w?Wja]˶fe<">>0>oֿ\-[:?v~LGF= h?+>R?Z)>f?ςmB>ܯ> =>.> ؿH?T?#g>K>ٮ.F?r>>[Q?? TE;*<)?v?uXØb?>F?x^D?3>N\,?K޽4󰿃j>hiȼ>?6=*?x?[x?#'>?GEc#?%S>/̾D?%E?{B>d?#0#y'">s(۾?9"?>/uS ߦ?\8Ц4쿧>nS>?^7>> Ϳ3p?|?x+?Vx?~F?쾿$=B?Vb~YĿe7>J?Qb 2ھ5l?JI#>ZF? &lx>pJ?Zg>V?&O?W>'|<'6>rj=N?0/?~s/h>ђ|lw0> '?;L=ꚟ?*I?S?96=/=h(`=0(P > ޿=A%>_.>σ=۠/>>2>п+XШ$-ɍ$=@"u?t?\­4D ??zH>l@lC8_?ROؿ¿=??[ξO'A0?1Lh9?KſN3>@XL|~<8?*O?X?B)?#?[>bP>p`z5a;Mb=(>D?a4?3&?< eO?5/q潆U(`D=?lX?u?%[^?9ӿ1#HW=>5>?$?VIھ>vy:?0>u?^*>̕>Dž?AiH??> !>?<\ZNN>4jb> vo ?'-?5}0J>iܽ->Pa5nC>[ή|ڿC>M?ISSO#\z,?c? 4X>>6?8>&W=? 1>'p>J ?TP7>NDZL޿_>*Ŀ> N?@T?#H>$=">l?/E?=H(a}>u>{+?,Y#G> ?&w,?2H;y@?7>y vI>P8?eR?aY ?/?hu>3|>{ʿh=<Ș?C?Dl0>y>51ǘ??aH\?? kO ^?x>q1F?ڭ?-->l?p ?lѼT>_>wvֿ=W^Uؼ#>z >.<ȾJfr=>\?[>D>a?(Ƃ?T @-, >?J#6u6F?Ծ3}?niAl{ ]>ҿr?W? p.?d66?쿆xJDA޾7Y3ͬ.U=Y?cw>.#??H?h?FiX4c?A`a?X使~?Jc/W>, H>) Nʿd,>ʿ8p@? <ܥ?8)0KR;>?`nY@?t?o2V8xp/(@ $L<ߕ@?t$눉+=Q%>yA;>$ ?bt?BŽ>?>X<=?93R(fC?!迿? "-?d[au?(ԽHȾE}?ٍ~aH˦?^ǿ<>}mP=_ZRVuK?V1>_iB?[?>ﹿs=fy¿ھJ&oG?F?ݸ?ȧֿܿp6J==qcݽ>^8_>4|l@ >d@>+RA??"yLo>>d@;272E? K(?ξ6>?IֿV(ʿjA=yD?W> n7? Ͽ7p\/[ ?T>>Q??@1>>S?T U}?)w>mƾƁd?*񒿓9!=׳(ڽ=?=>=S{? ,ھ%?D>R?-KM>5>Ey=>t>rο/=H꾄D=B?+Cu7?m=,?3+?ѿ~?>!')Mft?5X=.b}?D6=:k)$̿pH?xHW>\Q)[>Zq>|=b>oJx>HM+?,D=mLN1[?^ v?y>.8RLh?Ŗ~¿!]xx?2,1E\?b?1>=ztX\F5?>H?4-?^]%7?Ί=Z#? jWt> h? $?0P!+ӈQydB?o@/޸?u>I?W?3f"?L>>X>}?,A~>vm"̍ǘ{C`᏿j=/`4%?gD??'@6>cp<?26iŽ*bZ_ K?9/?1ln[o =ap?S)E4|׿mLW=0?O0W(?p&r>v8&ٚ? tN?'?迃2fD>m8r>?J?>?ƾt6g?`Ȼ&<@?>$>c?>/۠6h>|>"? ?D+??Dp?o<>&"ܾě=8Jو򽓫II=Z@?-?7*v>r?w@%?3>B?>+#T>U[*?b'j|`>=\>p>a?Gd6?u;N?7EL> *?>_?)n譾lj%= >> ?>>h4?/-ǿ#gF?0t4=L5>E=i>.?)Ǿk>\z9'̿P9"?R?fxh->u?!a>.?:?j线! <>2?V?[x?R>>x=ۀ佤z>W<>x?'RD䰾?=Z.߿j?M1>D=(?=R;?3 4?\gl?C?XĽ %hϾ?A=v?R?>*R"ྰLZ?D1?#*?( <duɳ{6fr?O??`?LV_qھC>>*HZ=>h@uT]?`x=uP+?n >0?.x?$F>}ѐ?T>{J?pſ#}.뾴j$>>4>5??=,?l>M ]>OW?V>$V>GSaǿ{?!???4T{D>?Ue?Gh>0P}}\>E>-%V?0z;)v&3Ⱦ|?DD?NH?,&Ӟ_鿿E>ɷq?^,>9?%9>hp?+*=z` <P??.N4b$>Ld>v>ц=ŏVbƾ:y?t?`h?Z F(Xv?p۾%4wt?3⿔[K>? 8~C-A>88?>dռ0Cꯞ&i?N>? 8ۗ>Q L?_[>iM=Ĵ⿴}?'9:w&? pL>>>(?L="<`O/=Xi>Ԩ;^?L\>+/?C?;#>QDH;e8?Q;?\yƽEDrD?c@ž1? #d =hg>>I:'ؾʹa"y>>>DĽ0?%2z;43ZL'>?Fh?tf?#?X.?Ə?l>Q>c>'0p6jLDzY®>%`-½/Ÿ5,-P?ADRSBYp€BL֧.©a T?{AT@.BDBD±gœz^b ŸT£:B85<<针&obfB BEB!eBcwUn›WqtE¨G5AW)B3A7DAZCJCB >٠J‘Gc]#LA:~AXA4A U_-|A8®rBBd^?SArlյ>zBB2Hzxur.A?B`AVAT+qBWx`YB4D¨d7?@DB4C"6iBZB!4BAjZB7 tC{,ZTqpYLB12AX@B ABIBw3^|BA"BZYBP\B~BZ«NBAzQ¦‡g@@80®u-p9u]jB$nBDJB!kA BE¸ByvB[B8 ¶@pA&[C BrB0BʇB22BTAsB7BAp@[Bn`B-YD{]B-FB#C /AѨBLBvCB'B2A4^ʮB$A.[BvtLt¾2@KwѺ£ ,B-cNAzx?›@y'ƣ+Ak0HA‹.BdHB>-&\*x@B BB4TBdxw‹_BB&B=-Ba4B*Bl.A;BA5BƖ\C"kdAAA>AfB bŒdhBC+:T ʛBRB5?BbL,CAOB5 BܩB"xB3XBB\A-Ag߶CB}&A}A䦶B#(C)BبC s=Bj6B7{B{B1A?AVAB'B&:Bm BJBhB4DBQƘB5[ԹLA{tB=BxAHBܫxB٥B…LBX-BP(B&XBFBʤBBp+B&hk'AD?ؘBbBwM¯sg4¢B?0>¨~RBoBOA@J0A|#xIBBgGB aALB^B"B`A\G?+UhBMB@)iASm›M BH6dA=Y@8h+`A 0BRBK#)ANBI@C <7>FހABBC0ZCBCaC ?CMAB؜A>,AU*B xC&BӲC-2CBYBA?C 랧Bo[¡J$VB"#BrGBNz­xGBf,Ay~B3aB iPAڇBBJ:B"B %RC"^C'[CBC&B ֶAB@9CCf~qBB_!*VU~^P&BjBc mAloqBNCOB'ZmB-cp$F>F…LAK@WOAj:@<1R<B NB0ALBaC~@n¡SBU@=u§qB&B?ǂPB9L2AQNA\AA@zA4ݨFBf681mAp7TBUB_^:BN±BB A^@O05[BX0?Y*BzbYEAOAYw2BlTB|ҩCZwEB\lBq Ap5ChB;CG B'A^¤¯h@B1BIBpc?BB\2C C BbB֛C5@AǐC?B BkB#,A]pCDCA/B`IB(N6B(C'BB|ACPrB[Bk,AlB(uρ~@ LO9fBZ?B/53BBGA7bE4BwgA/bBP`AoBܿp >SSZOAXC(BVO=BbB&XnB> AR B[~mG@́PAiub´AVrAڇA'Œ-=[YAhnȧl aY7X @6.1BJBFBl BB7BAcB%BIB~A6E˽BX¥GLCC-`B?BJJBN4BBaC AZAW4AwhAt^BqoDANB*,>.ŠMAc`:*B`BdMARBiBB(YۨAOB}vAAA6BB*+Bv.B#BA~C2O4B.B2A*?@BfNe-@gB:BBQsB+AQBlAAA©ٶk-BB+:`BjExB$AB{AK2L5@BN#yB`ZB;BBHB&?D##9AHB1*@IȬBNB0W#Žl&AW6BBjA3lAhAmS@AڞǧH+BRqd…,:šA*A@Z]B`#A Bo4]xžBYB |rBA5$-X0BU@|AB[@2ḄecƒѰUYC#>2a>!?>8=}=^`>qfl0j!p?(tnG>>= м=`?\>C7<5,J=ؽ3L0>=*Av=aR=>?FݣeAܿ~ hN>C\yο(0>4?HVk?I??Y,ZԿ-w?+>?f!MtLIQ>I ?[>F%Kf=% ,%vIؿ}ővD9 >Kִ?~&=ߠ=+B>Oо2?A-v>f? q;g@>t?31? l? x>'?>,ӽA>~b?qż->b?5>P?Y>m(j;RĀ>t?2%?82RJ<+?8`J;`>=|>>>op>=8TľwſZv=r@>8 /ʾ߰>8>>?+!>:L?9ҤjPs>v~?N?\'n?$ sv6?9 ?Ye?jN>=`>!\?*3?P>E>>9?G?6:?W>X>Tʿ@=8b>>@!3M>h? _i>s4?N?xѫ6(n}y>[KB;>?:?G> , k>0b?#ڿhlK%>߈>>O1>P9d?DB?f#?P>nn>Yd \;^>>==d/Y?0r>瘬>(>~><^Y=Ұ_} ?n?<6~?vx?W~-?h>p3迗N<>?<=m迌}>W>?떾x~ nԾ; wMؾFxqt?k>&ŝ?>ps< >:¿{>w;> МXyl>?<]Td#!"r=.~?>Y>CG= U~.$s?(#?`?HPM3稿5:>Gpc>}I?;?o >| ?>&eܾc [>?-4{J0h꾌GP?*P )cdL= ><>"![$?LpzɼP8>E/Pu@=N?YR?B>I@?7?}?̓??r)6`Aj3|=M L2>BF?81W=>P&?]ʣ V2+ѿ$(?'D#lP>2>ؖ8]? ؾX??ϓ?`?m b?8m~R?R??&ZD>Ei)mӛf$ݨu>崽>d7?Y>?Wy =7D>-|?1ɾn>y&>@()/0Z?}"^ZX*?}?C?c}־=?F|??y:4T)M>Q8׭)>>ة? *>?Gi>I?^2w=Aؽ=@>˺?[<;w bk>J"?1rX>ukCAJl>;QֿK%'Q=_??b/??^7`?8w>=U `uZ|;;$ٻ=㺮 ?<9?0S>gx73%?3𫿠7οSq M?077XN>@4?1 ̾x>׽EҰ?>^>.0K so?l ,ʧ>z=?'H@=YP>M^<'4=&ĕ&>w?9p?^?b>~ > ?I=b;rż=O`P>P%?f ;P>b?^>M~,s<;?$\+>ĿV669=>{E׬?j?4G1{?+&?jȬoEϾdFN>?X= >`>}>4?>ɏ: |*HZ?=>?BCL?>п4G>,ǰAZ0?iտ>>?%1D>d>Fؾ>;n?8νMп}s>Ӿ$jjV?I> 9[1>1xdj$?ȉM!b?Щ,t}?+[>ן)? ]?D?[O?Y.x?>> J?/mڻ2?/=z `?=Nx?Z>W\!`iB>Dd>z^Hp>ʘIμM &[2?5dDV@?"?_->N?7X˿=o|o?zT?ޑ>0?K;>[C].>voVӽзyX?$<5=?o?d>P?G$)=A>EGT`>tu>E?OR=K ʆ?tTS,(?տ6>d?:2>e}?>>@??2PP>>4s\xǿ%P>a= ?9<@l?9]?v0? ?::@>A=Կ}p1F?BT >kf?x>lA2dd= se>!>?>>Ӿc*G?W?>vR?M?,KҾ`>?[Z?>J>;T%ɾ>Š=I( >T0?r>ۄ>?={w??Ԩ0lKW>T>ҏ>'N&B̾?PE>>}>TEl>N?Y'=r@]Zr?葾ĝ>i?/>&~Tt=>ǜR>2q@>tz?j+(>{A;=qe0>X><>>#/>&f7b>>{>&V>> R?i?8?BbG>WO?O[>A>#~|XM? ?pؾ9=~<>X?#r`>&؏hf?P?D7Z?w?<|;>v_R5`?`t>>y?AT?v>]/?1>?X?z?;)>{ Ŀ'?M?oL>n? >BKf=B?l}0?&?{ʽ?*W>PK?v>9a?Iα3?O>)>KzO7n1׾>/Dξu?? ?U*>3)AH>?s˅]ھ⿮@?m()T=K?{?i&*>!{Q7m.輿kH& n>u0K>=Ŗ?{?&>hQ?W>;9`-2L|H?==XE=0%Ո?Ve}t*J >?D٤?޾ ~>?SޡD?gZڻ0$G?>Ծ^:>Gzؿt"Dp|?#?^n>c>r?h=:?*??$̈́>Ѯ<=3? ? #pDqL:h=<1I?qMsW/>i=>f>^0;l nv??Ǚ? ޿74?.boFr(B>޶>b?:Q ?/XY?HsͿU<оL5?: ?)*[?/XM؀ǿl?5>^?)?\=LF?<>FzŎ=Xzd>44s%}.?Ye?{ZAۨ׉,M?3fN׾!߽?zkSsV)ۿ( c[ >BP?bFkn7俷?FĊ>jX? ? ;V>?k0? Y8?(o>4Ȳ?'- R??gfrE>~+?;?>6.? ?M? #^۶<><%S{?l ?GTId־o ?M>F8>&Nm>E KҿE>w¾9@>W^?+¿;E??L`?ʽǻ,_Pl>?%|P?:>/9;><(8Ix}>ZME=ާ?mپ&>'㴿#Ծ8ھ/bY>?A>4 ?˛|e?z;W> >|?W? @_3̾ ,>%?U+?c?:?R%\V*6>hF-="@>i>?z>KV>0m5:W;s0?3$>10%o?mo<°>? \9]43>>A>? ޣZ?<5??vQ%?>;߁usn>)X??ے?u>=>ׂdA\>dM]>T?>(>?h= l>ھ>)F?"ǰ>(w|z?gAԿ ??7JE=5@ X,=?W=@? 3?V>چ?Z>4'I]>)4za=ҿVϑ?4Mdv?B>P~3?оT">%?gAJ'?.v>?-Ѽ pT(~{??r=^?+W`粿4>>S?>׾>>4=y>?G ?!9v>=V?"vc\>Β; ^ʈ?-܉?eAU?p>Z=Xk>9?U <`?\2ĜfUA7f><-&=v>?> ߷>>_у*>? ?6l/?'>WcI9AȍG??Wv=8>gx?>~>þ?~J B>~P>@Ҙ>?;d>t15>/QѶK>?<*R)?G4>JQ[>q1Δ\?b*?wO[>(v :?MU6=?>b C>ۅ3ȍ0l-f>R=> ?7h<;(?9npҾ!VE?0Aj>&6=Z?<Ƥ>ſuupF%󍽥L??R+F?AnxvB{,?w> ? `hɾ/?'#8?־оY?dv>z$<-Za#鿩xFY<3jnv?+>uYxXy>9?/ ?2?$2=p=?f>n>??L>x0>pP?a?.&˭?-I?`K?H@>"g >$,>>1>rB=Ձ?U?M:Q zx;0G>%j+ՇZ0??R?\=r=OI(QQŠ&=?X #?'W>>>b?XT^;ꐀ=L wf#?&?5$>xŶ*3k_D4^WX ?!? ??K??M-d=־s%?)/>_>%Uv ¾7=ŗ?_KL?>_ܿ'JR?.-> >>%?i ֧>.¶V `ٿ?n0?;N?0?R>D?Z >7w?H@?!6=?Hf#Pg`ݿx&@W>"?ZF?U p=#>@IHx">K>??? ?uD ?ӳܿqҿ \ľ~'?ƚ?{? F?=Y>?i%M?u5<6'm@#@ :<>p>/F>?{?em8?L<`?3tp4?id]< :@;K{(S>?(Lw+>0> vD.Kܿ|Z}>>EL>0i24?=K>|F?t?s?ל?8T->L>8> t>^PX2p`?04G2=th?@?-0뾴n0K$=?4O?ohp>ڽྜྷf?kJ?t>>[>I>>K'>6geF>?X!{Vm=?8E@>vSvب>Pك?e?c?=?J޿ 3>{ m?u ?83&y;|l> S2?i> 5OOr >@l\w>>?8첿ƾEk=|r>yFe׶?>k>WgQ῀?">ms><>)>w(?) b P?~>7d?`?ӿ6ῼ'b7=R(>JՐR?V?~>Q[Y}0>6B=FĿ':?a?ˡB?ǀr?9%Ĭ?R}=>ҿ VcXK=a8=OxI?N<=9C8<`=8bP;b}pھ% r**,F@?k-|޽k=S??7?YU?uCim{$?TjȿY7(2?CAa?!==t[x>K?d>>GY=H>gb HEb&+}:??i>.=ޭ ?5?)??ٿ/<̙` AξξZ>䲀?|? yP?v?Ĉ?/>5?8uDGR{W1?|>8Դľt2pdu\"?q?Fn>jq>*wG64? Uw>W8f@DԾM?<+>舨>زR?KƢ?l9hn?36>>Sf?6xP>: G?*>S?νcN?8:> Q/@W>M`H>lмӿep> ? O"пX?7~?5g=O]JgX?|1h?׾@dy?I?L6?>T龨z=xοsd=Y?ſX">K>?/p>N>B_aT£?]?+?D~-.?5wYC3>D? ?r>?Y{?m>]l<"†¡^*A=wW'A2p6œn+œ{8_t=\&'5 mx41A“@L’0­k>Ҙ¸K†1AOoŒlSƒmµEƒ–*QŽ·mAjq>A@\|2At ¢Ih@>N p°Š/jְN D ?N¯%!L,qLZjeA|BZx d $'n <:R`W?  R6RYE`» _@g!SWdDA4ŒBB[4pBL|A>N6©o»’H?A&½´ 2."'o3OO¼K6 =fA@pAOPA|jžy"A掟B%ڄ-d(¯glŸAӌAǃc”*–~оx6B[_M–AUAMJA¡·^}$1@)6‡ %qHA$AsAAA8zHNIBAt•1#@f B7?>A/OBDBB@A3q/B@AgDBB5*B'B0jtB 6BܘžQN`\B8y(N¬'N;J@ }մr‹(AvBBfB@–dل5,AI?>hol@}&A5HBL $qNB?Q‰UA?‹KGB[vA]! ¸:UhVBu¤B\sB@){AA[™r>?J|;d}B>a¦v\BhŠy#^fz’­͸6›l ->_]C"¦UB"Aai-BT+(AFnB<(A1QB0dB c8AIBB^&B±NoU@†}PgqBkA&¦#9;5 -B [,aZh+(B  BT~nizB VAۣlB<H@BXB17BfB{V˜¨߶Bf!¾B B*\ ‰fBKBsތª+¬ŒJ@—5mA

p‹q›­H#@ABN9AwA„K¼H<¾AN?4GBm&@(JB En^qrA e@!B,h1BDOBxmRB@BV|B=]B¾F@"q8Av7@CBPeŽ %AC̞/Kw¤B-:BZA}6CC7+yB KBI4C onC2BzA3B yuAB-JB0B헎Bh%BCQxJv.BBO;B|B3C8.wJAtMJVBA|BBB<@A5)6^A"3Aq$@B@HȦŽL&`9y?3w "b@x!FTBO AZI·5rMhqnjBa iQYnB 0Q]ixgB@ dĬHX=ZqEM14¾%Ɖ / "A+9’Ⱥk¿GB8MB-bXoBE? !?džFD{yAœ U,°.鯧jɻ: A L:G=Šxt•Af tDaAbA2XA%3BFV̓@ U IA:<¼G›BXB&?(•ŠQ/µ¤»ež/RN¥YyB}?X;BQ+$?}*J3BBxt9ib N˜]’jT•~+*R4D($@¤ůї«ɞ"̹ŸnjATIB"nOcx]A"B*B BG!D9Px?€)-¹Bjl3:A¢œ04x…6BTB: )ƒB LBm)B-a"BmŽW³!B jB=B+ZB)ChhB1…|hBB`[X``äB?BBq;B²B1T!}BB\B[BٻAۇ4AnB#.?BB]DxBBBIF6)RAB^ARBB6Aq~g)PA؍ BRB BKADb6C8A[ȇ/@oBBKKCB3BۦAUBBgBB&RBA(BOC l7CPVB A nR)еBHbHڃwTŽ%„5,B|7{gBhot“|Y@"66Bn3! S ¾cA7"B-?0\௰2B+Av';y=!}@@BC MBY(B?B\BU%4BCCJB҄BByA%B[V B)BC,BB̟B&0bBA׍B֊xC2BB^ +(5B]B8A‡BgfBNB]tXBA B7A@AXbBBUC {?bBlA@B)&BW2A ? B@5BvĂA5½!B+xBB}?B ^Bx xB/P‹^kB2#_|Bt v@B9B"B/ؖKQHKmB4&{ukBXzB3,BxB2BulVB{CD5C%=BHڑB:BeB WA`AwqDB¾kVBdRFH)BPBH {B?5ҀBcBt%’oB`LAeB=@F&BL.B!mABk"@^AgBUgW,?+Fo>=!L%}>*E=K?2@%=@X=&|,?D>2?S^?G?nA>1H>dM?=ȿY)\@O>?W*>?.K.>?:?2fB>?'Tb>SǿJU>WŘ?rC?㦿>ݵپgqJMtl+5%>٦; f?=!!>H{> J>+{}r{*=1B>CAɽ>]ht|>R?'9>x]?/v>g>.=?b¿(x&^t ?'}<>uZ>>o>Ҿ佃hԽ?QBkپα?0>ԃlxK>bKN=>:>f-5>^La?Bо4>>$|?zx?sz>MoоҼl \?s>l<>}(??>XOM*?aU>?'`=ؕ Z>C>ڽ/?OP<|>$J?Tt ȹ=ށIXɦ׏:Wfce?M?xPq?ĭ>4P> ]e>^ ?{P p??`><>%E??4<?X?JzD>O?s? <ャs?uc>>?sP/R> ݾ;B>>}0̿<h\?MH>=k?¿}J?'?W?C>V?:>>Ձ,Wy=|6?6T?.=>B4<`);]\?剽@=?{;*1%y >,@׿@(ܦjhtk>6M`?>0>=>ۯM㾹꿖ʐl ;;)AI3T=? }>[~p>UF6v>VJ>?`?Ri2?&Z>3:?rlul ?Nнݵ'i&?W? d>OP?􈿋ȿ%ܿ>qh.m$W>P>2>=?>7?XV?` ?];9d>J:?W?ƾ=*V"* J?Y!0?u?My?-N?@>ݔ,3j>j/"lx>!?u?m?66W\>b>>vy>ʄ=BZ>QY/.=m\ }0> e50=>G^>qȾ>lՖ?QT>?)?LP,>WDݻ&>Zh >($K|HZ?!Ѿ i?1>)?1V?<ҾF??HDzz1G ?9 ?ƃ+p ?dE? bG{'?`>D?Rn?K=ң? ?+l;ӹ=U>85Z?2ҿ=,?+B?W)Zd?={RD_`-r?(#?HXN>? >}??Rf4>> ɽzJs?/$뿇 ?4AԼA|οlE ?ZR=C%><>Z>Ӯ4 N?A}RI?=?P>R$?P>#v?.n+?~?z?~,9=×M6>7?w?!6YZ@?-b>R>L>G?vR ]>`ӿ*Ql?|?E ?@0L*?Q>"6T ?-Gw>B<\G?6>80>,=j(/D;;]>}ֿCAx*4?@? j?26 `?ИW??K>?Dxl>Q ?Db>?Z??;p?]/=AR#,?!N㿮$%&~?R?#G>?ڿ>,‚nU0>$ ?kZ?]?G ? 4-?'+>l>f?M}>cX>tv? Vؿ[+(?#kL9 ">&>Z,U#?vҤ=ғ?2`?K?\?w>dU>n?#92|ZVwN%?xV|3\??S/ upJོE >4T?;k ?`F>4?@?>V???#?M,׾Z͙0>zS=W@\(= 0=<.>W?N]h>Z1-?}\?XO>[>?Lſ*3ǽ5PL>4Mտɰ>틾]"n`>Foտg>E(/\F\㋾G9?+ Y=+VпCTJn`?)>J^?I{>"!?>?ۣBl߾3?ZM>d,Y>5οoFIy]>{d#?f-+4#>TZ ?U0>4ϖ?z?e&c!?Š?8 ޾Oz?!>8>c?gM/Ց>0>H ^ &V>?;v?,po? 4~^E?C?# ML>(?{=w=rL>Rѓ?U>h>>> T=x?>r߾Fj?G־3TZl@Z6$s#?"x? 2>Qz6?D>~DC?qg`>?v]J? ;s>\LK>^?=jhh?e>Ķx=X?a6<40?n"~>^ؽ>n=m\?P[I;2@q,?z>i;R=צx>T<_*4y?j[?3PH54=CȽF??ml?[?Ja<?p{Ң>U>x?QʾGZN|>[1ؾ&/6v?B>y>=2_@:@D>F'?1e!>?!?<? rR?h?I+z)?[ Bn=U;Ly>"#\?wpsX?W^>`qy?'b>% S$?u?>hib?^~?AV? 3XR/f J?}i??!>{Jsͨ?x}>}?=8>?1%?R>?V`> }>fU3?M.?] @>??>?A|?!?Xd='&?%\ t>>=ܿmt?>>bN> pˤ?{վS?+>SO?^뤾}Rt?g&3 ?x>???̓t?^>4> &?>@X 1?! P&e?(?s =7?#y~#kc Fr?U?e>1[=G>o=XBv+O-?&=?"'?6?[:;> 6?E lTֿ)>ͅ ?N;^(?&?m>r?- )> >o? i>"^??۾?Uq,\w>g>}(>'U6>W ??P>?l>?¿Q >yM_9N?%=O?NξbA>ſP?,?}0h7ax=?{^g?lX%k;>>?*p%\>>K?s??U>]AoXh^f|>vӢ#`п!l?o\=o T?U+>=>ޕ?uv^=?hQdFTA X> >>>H`{J~ >7f>0Z>2>b>x?/B?M">/*=X> ??D<"͠>>C侱?S> d=HT>6G?p=igؾҜ?wBoa+I?T>X>$/?WMvv? 0??a|ݽ֖ ?+0>K7UfֿϞnhEfR(+ຽ>v< l>>-?< ?@ ?B6?Ģ?3ɠ>?"Ǿݮqf>.oI"?~2>y&?dz>u?$m L} ?f8>+c$1o?4@u>>I߾4{?}붿yt>?tV춾rV@ OF9Tg^p2f?]J>rMRi]z%|>!>x=.ξ0?qL>?y=lN>l?S?>C I&?x?|s`?/: U>I;󸀾/7վ ?uĿ>?C\?{_ }Qp5uMT ?-pzdP?>Q߿m?\?hO?.u?U"?2RvӨ3U?Q>?K>W %zMs>Q(xq< ?"w>R?'>A=Cd;?U,Raľƫ^~S=d$?c ?0={??Fľ27Ae)WI\?@Op>>sa> ???)^ ?2~?:m˿/ė:@/?J>KT>?xj/Ęytv5@7>޿40;3OD?.><;[>F?vmdvF?꽴 01>O \/?j>LJŽνv3`=%v?]>> =??]\>X=nfؾ,N?^sb?D>W#>=lB? C(剨?9JC_?.>y?>?s;?s? ,8K>޾S>?(>ԫ|=_ ĮP!1?2{``>C?`?%wUnd?E;_B=Z8>sS"Z`᜾d6 ?IRY6=o=PP^b>z"Yז?(?.?{hPd>fľԠ .?B?v?'LJ?T B> >->Ӄ>c½?0?l=oT?L02?xWv+7ٿr!_:j:?G >((j,?9? F?W =1kwa_7>=OƿGc>>b?|p?3G>MS?gڽFRN>=+# =?ȿJ# k.j(=>.>P?=> >i">>F>!?nmm?qyu?n>0lɼ>2>½\?ktI (>>`tR>d$idjٽqԾ8=Y?M@ź=ݍǰ>UQ"??>r>{տR>jE@ }>pP>ŠJI]Ⱦ/>tԿSy?%?=z4?.>dݿ_\ɯ>b?6RA)yW?đ(?F=?p G?COѿ3\^?TF>]9?B>T^^>Lwj,l> ?d?qxHJH.!=M־>0Ŀ'¿c޿AW?A` 4>\?(0>.ٿ9BT2=? ս'??/*_>GW>elYڽBhh?W$?D~@ ?!B ?%R?h? M!sʿ4^`?Qu*f=>Id7\/B>5 J?NY?" >ͥ8{7HeJ"M4`>M >k1 ?8&?DŽs=2>=?NR?,,T> b?==k gPnC>/>M>e>>Hhf?#M?(Z%h?Pje'՞vL&^}???a?󈿄?=!Dĥ}5,"`?D,uH]L`KHh>YM?TT,5h!L?~*;??%Z?Rj?!e=w`>^U=^?,oQ*)*\C;_ op}ͺ7?@\?/g1a??Z!-"=S$|?Y ?LU=mi?>C? 9>F$޼I󲽟hoZ:p@?}>b?Ə`# q>ʴr?H>s?ǥTeP=uRl @Ə!ſj0U? yQK\?lЂM義?e$Al? F? E>A@>7JJ4?:G?Y{w2ҾD(Am?>Cվa?pn?,{?AĿ Ϳ|k?>4p6ǼN?hB?@*Ӕ>y>ƒ? e>A?`?=łg=&pv=o W5迅lD$zf D>it*B>C>?"hZ#K?-b>g0ν}{Xp=8<< Z+ھ jʿ,$>G1! gg`YTq>f@NlN>GB?G`?v3Ts?F>?;>l{Qy=>oW?A?1>~=)>nؿ>?L?>?!Z7Ͽ6?4ܷ. =N0xL?a%)S=j>>A? &3e%3t>7F>Ȋ>W?IU?|'>. =~684?q>ԥ!hS>$b)?0ˤ>ʿM ?S{=籺?Tν HTJ?}DU|?cȾ`ž+)=q{Ik?OIfܒ߰->EԱRhɾֿ~b?J<?d3?i>L>ݎ>ٿc=lD5)i=j,/Շ?#Dj>*>?Ȼ>7!ͣǛ>d=PؼB8? ?z ?ր>= ȿED h ] LxR>HT>[C￿W >8š n$}BzBB' B,e50B^4B&<@n(2r?8n&m)BtdcA*CKB8 ?5B/&AѣA@HB>:Cˤ@BԽB0DBQ@jB eɿBBA -"A(B6AB6։@fGP9|LWvAB/B`:i<…AB^ܢB-{% A{AJRQ"FAUiMѨ‘'BG&‘+*oxBRA$3=B BPdŗB"@QZEB-SAA+jXA¦d=µEs[fB».‰u}† !22B/A7BvqB"wYn/`x`%> P^B }a A2#%BCB%p@Vп:@?u«BXzmA@B1SA!b:Bt'XBhB,˨BxT|^Bfhk BAaBlnBei1C%BxB(B^B@ʤ AcA! ~~c"»^̓@+ª{@A1.D j± zl@•JVAedB:H@OJB, C#2JFB"B>AARZsALyŽP r\lb ,B,A7@h -M_BBp+BTHB_BH5pHBu rA,hA6µBMGsv#HA&BO0(B3ACAB]kAa BBGBn6` B EJ*BchBB_CB@EpBZFB9B`BH@BvfAvwž,BЀ8C65BcC[B&B&n@ǜBÙW-4¿{P5w{A{[´A3jG5i3P+3BBrBHBB0BVR@_AMB DBXnBCA`CMC$[LB]B/CAIB C7gA۾Bԑ/CmBBTA7Z7+[ž,ABB ںB)½oh'DhAKB-5BUudBrR~C9B%B B ߌuRAHB>|BFR֪B 6t1bnBh XB /OTB|G94HCBB CBUsB C?2C "CB4BsC BA$|9™dA#B,|@L\A ³BkBsrAd>7;YAkG|BgBB3A)AB0B^BC>?IBnAFBNBcB3bBqBcqaBh[B16HxԏA\G[B?BWMjB€yB}se?+µ3vAAL.Bu'A(AyB(B&H vPIB8`LJBLSFLf.V*B,'MHA7B8LBoB?!BmAE?VP€`dG(ŒuVCBH+9Q@b#AuQ{R®Ò?k̆IлI/'3B7dBFA9B-BBAyB(FIBvՑDW/A Bi.ABt|CS{7mBAaFB>EfBRiBIB)qBBAw.uBkğBRpkdAARŠB5nA\:B0AݠA6~>")>ͷxL7$C>peBDBpBCAB+dҹB`ZMg?p\:BHAd@J pB8B)B޾g?j?|9yX}?gSW` %=@?~?|_ھ}tx]N?ȂZ`0?kRY?\t?TCԾFm?kNj?m=b-?ʹX˽/>3ھrQ?=2hVa=_⿾#>Ra? "=ta?B<yJ?qV.V?w?2?oR?<8*[>e;8?[>q? >>'U/꾈? C/?P/&> !?Fl=I܌?EV>D&T?( >lԾ1?.Qh?Swl8DĀ ?t*$?n=ߔ>>0?Rd=P=P>>I 3(( ¿GȀ?&>vAK?^t舿0Q?LvKCοG?\?NL? =.>8#?z=rb>И?b?XN>!)r?nIu#g?/Fuj=)>I+'8b>RrD>]p"?,#?ʾm)B=_>R>0t!?-? Az?(?#>{$(M?i伋U J?2>&3qL3YIh>fb?g=l>Me?T0q֤>>3=>=@?t!͇?%??uԿ,;m ?J>;=;Pe=v=|GF?Fz?Y>A=(? ?5 ?TzRX>eH&>Z⿢>>+>aX?.5>) <3 ?q??Z?-G%ʾ-??&>KNF? Z?UR<`>? 8>`$?K? V=g6>6z~?,,?#1?ht^ֿ*Lt?MؾEky"> zDZ0t*t=6?]>V<9_K\|?*N?v? ?k~?m?>$>=@>z;t=B?Gƾ`ͭ?qP>xa?#K?@l}?wk>տ0*~;‘? M&@=^>T,?˽?QΙg0=ԼP(雾2Y>շ?a?C RfqlпhZ>G?!􁋾RL? o?Id?5b)g'q>~??R??D?[<?-IIܘ$? *{ʽf>">ǿa?7 7 m;`kCj?xS>ZZ">= ?$^tfN%H?{pCx>sV?Ws>\?WiȽ}X=.0:=3|=iw/XNs?/dk?g>_>gH:L?i->?P;?!$#Ew?s>}b>bi?H?OWC\So >L;֠R6?fm >X==L??'4>҅i?Iv=? ?\@>· ew -=9׬\=FDP>д}m?i>{?cq? >>'@&? =%M?!̴0*tC#쀾8+>qs>>2k? (>눾a?.K>SbB>,??6% 5'?c=>n^>%s>,Z=T? )v=<>,ƾ6WF,t0@?5B8?(?sw>M?GmE>Z?VȾ1?~?~>W*ܽ6=P7vG:*=Y??gꪽ?Ez>鋿L?;:?pê?di>V>>e=@P?N)>$+s$k8l@%=j\>_ ?83I ര?+4/j?4?+?QQƾ<`_h?3D>"!>>Y=?.[@??4~>?Fhaٿ7}>־Ɩ>.=b?"?>sV=@-?<٧0 "?׆}cL?>u>^F;цȾ1TS?)iv/76? W? 5\ X>N{#nB.}>R>xZ?¾+?hzZ/>>0>&Qؿa?@>X?5? ?f{[6?`ʽPfTXGm?}?\??^V?qE?K\ʿƾ>?v >6>j=X? Tq>(?Kk>T?V?;~"?|p?`KA?쉩=`>P>?/edt{X?=n0ǿ p?]=0>T>>7>?4=>ωmL>;|?DH=Qx?ľſv.?V=X; ֿv >?1=F?I?ed4|<?6Ӏ?%=8>$?c>⌿TBL&lJRc־Jֽ/\,ZʓI?iT>?k?=5ܿ?;\B?;ڀAS>dT;?>>&>o C>N>[?4z񿍻ƽ쇵>^j ><~?=d>?|=%<=H?W=ex>̠ W?>??)\;Կ> ư? >K?p6>k>ʠGZϿ>5?6VlY⿝<,?8~)>[Fa\P?B$?뾛]?/wA lD?\t?㿤D?+a*>%Y%U>]\?z*?gcJ> >`I??Hb:앜?$`?k?hP=E+ >٦S ^?I,?T?E^Iʿ$>ل=@{ߜտ?m*>G ,?0.|V?%"?u-0Bj恽7;?S[?z?sH%>߇>dƾ2|?OIH>'bhN?Aؾ9K¾f]?lw=ı ?c ?>l¾E>wO`>v?>jM=}~? 6`n>;h  xoܿ{?jtJ?p=2"1>O<=+d5@ٿ >*2>l??69O<ۀ? ?R{>g4> dp֧?I>ΐ?y7ۥ>A?OXV?Z ꦾf;>-,?5+?>bx>>n@L G>α@V0-rB"Dzb翠|;fnp?6(^?c>ɨ>ƪοlr>3<#?X >dQн䎘=޾4?cY=ZPp8?a=;t?dIپ|>ʼn$=?d:>=nq0 c&J޾<&>¾v=b콨)vBP~>[?Ӡk>> BM> dp?/}㾡=lj?X.?ſל|?dh?5? ?R~Q">]?*v>42O2?*>lR>}p>Ț?A8>+,%?&?g $G?KO>bVWCh?%>?,?D$?R-((?h!>糿1yZ?ʁ->E>q >v<- B0Q>~i*=tO>?80or`?7A>?Nd>l? =UK'ʾ}>3???F?3>>%c`= >fpey>Gh+?h}?=ݸ??]f[?%Ip>XI>[@QL>ׇyTƿ>? =^?JjA?Dh+>n>a"BPz6X=Px>R> G.P??$?C?B>>>X9Ā?>%O3CK== ?p>$& I׿ޕ6. ?:>h <ž=nؽN,)'ί<0[E?B?lr<*D?,־ =gDKQ?ƛ>?ƿ.\4rk=l+_/?]>z}K F? X>ܛ?3??FԿ4? =o<P>:S?sI=h?}?cbPU>#-Ⱦ) >:Ļv1Z>ďd][xXv]>zQ=о ?̊\ND=CA=?w?( Z>~ɿQ?f>?b8> OJ> r8t=&>e }9=J|L&v?ξLk=>??V%|?#+8(>"o>_>+?$g>>>-?:|i<8>eƿqo=(֪M"B?I^5BzN>G/>;P佶<=nU?.ܼIp>^?>]e5l{H?#\>? ]>5 ߠ?Ei+8?6T=#>D.?5.8?<=S}d6pTf&?H >5?B>:L#?%ҿ]>m*Ǽ:?gYd>"?_ڿ!?-?jտ_v=,M̑⿅uT<0yq>D¾U4?bd>3"?0?P??%?b)By:쾉k?z-?W7cPζL>2=j\ !?%g&Z?N ?>>T"U?h>>@@X%?e⾢?T}?e?f]lrfྯkTH/ ?3?۲>a> >/gT?-UIKx>۶澷!FE42?Z>lr辒ƿe6Ɂ :(? '>Gт?i??#f>׃=Ph d޽=֒|P=??U?:8?,v>?A!?$g7@>T]>/,?m=&%>V:?,&$? >?'R2ϿhEgl?~=`!e[=+*>rq/Y=|>As.>ns-@?JJ?)>Ζ=;t?8?==S@sCbƿ)Ͼ~ >?%'ӑ;M?B? S?U?DZ>0=/P?G?>-=X)G=> -=pΫhx?KMR@)z>Jv?&;ZT(H-> >MݾSre-,KG+%ھ*á@䬾?$?_پG76!)&o!] p?8G8>?PB ?;H?j=R R>[L?3_?ds`=&=]?lI= @? I?; >Կé??)K {R)>M>S#NQ&-5(Ӽпҿ73w2*ɿ5yԾƽ˦ڿttG?Tھ=俅ۿ?Y7f>*? 2A8>)ؾC$>|þ;X?p?>w{>oP?7?V3>Ȑ>W<),>qF1j> w?R=Td=>D:?p>"?>[ QƜe"0Ѿzu>y>ơoa?P>Zp?[`#> >z= >(ƾR4=?Dd>'8,1? H?F?a>?:?_.-:P@3{>\r<i U_Ů.?^&>>F?E\W{2d`d,m?>ʞb?;ʿ F?O-o $?$~e>0(*>0>ξ=L>J>P>~a?6S>~0>d?g=>@>p>Ҿ7F 0p?#=Rj>b?AvzOν4?h?;r䭿?^T8"y?sh=$HؿN࿨^= =?ƾ.k>w={6?Dݿ>1sB龪%}8?u4>-.?4\>%>~>L?U=",,،U Fý-d>;>[۾`O ?"I?G҇1~y8Tx?1 䤿|=><~W+>lB?%蚼@ȋIs>Z޿/lj?RM>7++=8"s6 &>ъ=Xuf> >pu?Vᄒ0>>M3-A5=L?˾l9p_?]^F,5>b="g"E\?E,?E`eJ~T?Lk Z?M!>>u#/@>w=2?+&W?l?H>g9HG)!>T8l˶h?Gv?Կ&5?Uy?g=%|??ڞ>>(za߾AT3?na?I>!? >Ծ<}8@>6|>>JZܿJ@=q>GؿZO'd?YL)⾩x>kL?_`?GQ @?3[x뿖=y@?>>&cԿJW; >0?E}?0D?J`l>9Ō>Vjdq=S8?/S?J>lK>9տP1>VL8>F>B\}fB25I~꾾i>*?7_^=z?1   >K1y=[B>g =Xĺ?֝j>|>]9h?,6?"P 0׿wRnCX!>"F5ؾ?1)?c#^= * ? URT 4꾤{d"#0=rjH=Ux#W? F?դsj?>d?Yȶ?T0>⦐>?Y)>]ν&z?]B\>j\r??/>t@>/zDFJ[FdB5u7bAk,J$"j<)F ™)X{`$ll½~x, `ՊLRR0s"pH'bs]3aDfV "m+ð}' 0 EŽ +Bk›\Aow¡9䧐]J/0*A{Qx=bʐv¶\AYXdaJLc,Q ŕ(Fj! l±$& >$]R`@j3< ŠW i}\cҠ KQi!b¤ xY"•t˜ªpl¤ok¹ ƒR;VʢČ|B8B{ £ :w†k=ow?eja P+Ctvp,% µȧ­ZZºB0¥ɼ E0* jlu#ByApvQyOB{&uK†žEIT:@b0B¡CɒS_$i,6BIPC%|ˆ +²Y՝5‘n¤G\ M"›E¾›^Ab%!AA¼;¦b8¸Jofz>mA"A_B .B/*hByBA̓x:Lt¢ Kh@W‘9± –iˆJ€u’8+X>¼vpAP߿zB|š;vAK + \AmmAE>i?ѺUpB9?wӬB>¥:a6]~BޤBwBH? 4oB9sBAƒ&.B?BuC>B%BB;A&qANAWHVBB:IA M͓Ba~N>@A˩#+pD¦*~:g@@>nRTxŽhgrNA"A1W4XMqjB ]8š:e9t»Wy@"6eUAtmRRu§~a·7”p”Lg‘»H7Œdn“vgRB+¤J«(J-¥Ÿ{ŽFb)HK-$H雷kHyy&k@i`%MA¿''m}ºS"¿9&NW4[u"N¿e[.O"„*&K px BGA-7s޽@[BB!@ BȜBG"B"!B2<>\‚w†/W,|]L®Y²3)@([OBbc­CBTBV:6°8@tBk7@|Œ?0ºAyBUDQ4Tž sŠ.srSX/T!0NdKSd`H7K+x—J5'ALWÅ8QD`2>A4c(pT;,·;‹sGD:>WzM:žšL7;Ÿd F#D<+hOY">^3f*Bxž0yd]5i^«Z#¤\_\6ºw_·3RMAš7̙q6b`N¬!“»aNAb²Ԛ^1V’?|ɖnz7W… ~RN^‹‰iOR >֦} %I, {6/1« ,¨"DjYt˜3,¶RA08A=kŒW? n d.B I{~ @t^P³¢ 9#tAdoHWOh ?I܆½ zL0N~m. ̎˜VBOpBkVX?zBsVv(AIaA4U#6VB1AלBјAäB^@BB^RBQCV *ZU Qw)#v›%VAܼ‚\6{aA˜\—=®-LD%wüG@}*h1FvB#OR4"N@@B|:FBBB!SBU BzKA}jVpBJV>B4>&(W?¯~$U6ŸX7ҠW\iª+~9X¼fV2WfV[^@6~ “Ÿ;•fnA=мBky (wׄ 6B’ _##e„kžy°}u5[BPª²׶t‚ ![BV`PCG ¼^´Q>?-"s$„zB4¡eAD¨A@fDtZ?!BC°=™/PH}€8&j ~e*€&.7°+B$AB2EBן@FBvB$B/BQnBB7WAB{65B?$rAZBVA Bi A^tAFAg]&AFsBk,GZ–ض@c qe[€ZArM2,Gj…O\.µ4(ABڞr~ie ‚o:QR`NP«gG?7[pPAG*BB`̿0'B)`Bhq?>43w >ѿz~>:/$>Iտx50?":)p?@?z^?!>= /ƿr34Va>}#Z?>S|?rоA=924??Vy|*>\N?2㾨 ?G s =6?>ϥJ?OѾr派jŸcv>[c?S&W>y>t>@?+ˑ?u*=؛?Έ>>X-H?"u=ZX?~g>JꉿY>?5?Z?8?d?>$?:BD?n? q=4?K=MǾ1|ڬ>&=P>>]?5u=WȿE>c륿NW>|x+ľY>"fԾ0i>B?|Y!^>ux>\ĿD> =ֽ>!wd?).?8m?sl??} ?n?fh?QEϾE.?  ݸ>&?O Ζ??!A>U^? 7-"U?l?I=|>ʾn+Z?g._\l=.h>>N"?>p~ p=;=jJ?R9߾=^^?IC}Uk:  > ?A;<="QؿPDR0[f?<)zX?2'>c=Z=_,ۿvd0_sIQ->ބ?¿/保$;`=>꿗9=^(?ITdI??뾘K>x?"??\B? w?d?0==Uq=(=W>zX:>~`?|(?<>QykUk 9>>al?:8M???I~=ӀH>>?D>]?n~T?"+Y>o>|=|='@=z>]^l ?~2g)?Ru?о?T*0 B+}=cx>T[&=`є?^u?x\>?Q? *N/?a??O,0#? ??e==U>~Z>tA>W>J?T?|P[>30?< ?}Qab,>־U''>Nl?Q??3<?mB?q?R޿,=E?H?/?Im?]s?"W>B誾u==/v@?ϾeR ?6U>>`?w>Q?J>۾`>uo>"q"`~?>Td?s?.n٪? >ľT?uИ=;8¾?C:>? ]<*?xy?z? fo`?]??D?L?:Ӽzw<>pީ>6]?LpА(6>i? g?: ?>;%H>R| >@+=1?u}>&=Y>i>>=JའXB=6ox6UX>my=,>??k[-WSj?(?sѿj = ?/>)+!?=OAKB>p>ȗ=drGO? dUg?6뾥SL?S?iE;ʾ?):o>[@?JYU οl'?G?8fp?g\?j(?&߾O>A|?f?>tX<Z>P>=5?(25?0\z>0?A,?.?X?x>>t?F?]?=pl? > qk`,\ڿ=`+?|?>߹dJ>?6T=?bX @ Ǿ便@S;h= >u/ ?? ȿ<@> 翩?fV>=O@Z?#0&?>>FҾz??kbھcR>>ADb>m?3G?i9v??=+?? x?0QK8\>?Gv4ՠ>>rE?OX=9f^`5??X?3y?'?oZd>H >N%{>y>㊺>*>,gO?'I? ?:5u>'M齸??vk?f/XQ@;ؽA=gt>Ņ><[@1B𾖏C?"s>F>=?v>9>p;>өm@=.A?&9?]>ܠa?D}=lпGv? x0 ?N?'!KD8>'&?Iڿn>.@$½9?5?8>V<=+ z"?m4>$N==zl?J |\@ξ*r?|`?:r?>m>x!9cT>DK>'Ax1F=#?3>r?y>h<΀p>>?j(?0?%N:>S??R?]jY?#c?8z>̼?w 4>?8ӿ;?g?h iN}h۾3k?W?f>?I,6'?:Cl@?2>R?%P?&6 2 &sX?@sD?s]?%eFP>>(fP,.>4?f4?B2?@QI'q>&_?|H?X?Ć1'd>aB+ŋFg'# ͼ??\^P>5@ >:>bǿZ}@b?<>p>~ET?qVL]?S5>?m??Ҡ=u9?7 <+4y? ytJ$>oP>?N??/cq> >׎J1@<=Z?/U_a=Ŷ>(>fe<:@>Hϱ>_@?:?>j=A`>f=?I>đO>s?I>>:"|=@>9 E<6`?LYf? 5>thTI>ܰ>.O?ɼ?1?Dɘ>@Nن?c$?Bfd>ELɳ?a.?9?+`m}ſD> ;.军>M&??j>/Cic?}F?MW>7>7L>>~? >N(M۾?c=z?'?Ӷ?ɲ}3r!>#jB`Ծ޿?J6??ʾP=J/ľV?dJ?f?'? ؿ㉿/2?)?y>ԩ=Mj<0?}.?<^<?CD>?/=>*xLN?Ց?A4@>il>0L>DD>K{?>q?"&u?u衿y?tFצXTq?Nz>|>s>n>Kؾl>ҕr??%zPvK޾Θ?_ҿa?) ?+p>rڿN>>j. >ֱ?M6߿ZB4?IJ0> ^ĿQH??TC?CsWTs!ؽk,?!>b0 ?EzY=!>Z"?. PkCzZ>F/= >lU>V?s/?4mFè? +-&3#o/6V?a?9QiY]Fm3>"ÿ)#\2%> 2>~䧾x?G쿾W.>ۿ^`==0?п-ɾJ)>zZ6>ep_L'@Ht6WL0E./?+0r?|H2?@=?󳒿+?\>&ܿ3X>6Es|B6>`>yE ]g"=>?UxK> ?O7`>ߴ>$?Uf7Rv?B{?:ɿ'D>=?y.?:4Wj=r(>'V?åܿ.#Lh=9ai87),?hξL<*?%B}=5?l+"-L<>܃޾݅>(>!6?N\̾>|v?ōhc2=TlQ&?$*ߎIM? ?QSX?"P?2?kH>:N%`?;k޾qqGIx=b1OݾM>D*?-H5о>;t=|j>\=b|7j4|ʾQi .yϚT=ݐ?y+Df3{ҽ센п N>?Cxֿ?VZ>ҿy=K侉 ?(c?V&N]>>bڿ2"FbSN? A?Q>| ^s?^;ddn>h-q9? _=P?> _F>ZxfW[?οZ?yw?>Rp6>R>f]˼ApN?hX?c>:!H^O>,?C}?֧ٿ-o?s??ܞm?ưA{f: Ø=t><-пw#ƃ>g?>JcL>\?#? `t0>BپPA?Bd?[ Z=!Iru=q?j_ڽG?Sb{?=Qt>˖=j?wE?H??Ɗ=w="[&"{?^?>??>d>Joo`?e ?j"];?.?vc???? 8#9>Ay6]g`;=>gFHnӖ|d=I?I%6= xrm> ҾN>wx?ONF? Dmղ"6&D˾A_>t->򂸿+ >={ lg<`>u?Hn=U!>>>[=>B6 C=Gl>qξJ־{!t0>>X[nX_$?>>cxH7_@LfV?+=,Nv>= S?a?-U?\>lǼ\7t\о>V?n5?VB)R?o?Kr=>~?#>Ne^8r> a8GԾΏ >/?Lp> =䲿%<bOP?<4Y??D8>]? "?PHDA@?|>Bx'?ZпԿqKžC=]%M>mC)\>T?4qj"> ſN>V 3?&rCV><YL|xҪgA,t[>ؿI>5>>>U@9-8c:t?QE>z%t*=#)?m2=澞}SS'f  =&,ָ F>><=iȽ]?>Ǟ?6&>> #$FF>f{W?iv$v;ؿ+2/8~>'R>>i\Ř>'.]>`=`OK$Id>վtY9?_2;4?^?U">>mv&`(bֵm=aྏ$v=>l:>4>[b j_?T?3z񾆄>M|xQSϿھbgLԆ˿9=9nX>>??z19=ZlL??GxF? AϾoƿKo?<=D?'Ç?RǨ>оݾr̿B?j۾[8q{XV|>>zȨؤ?dg@{従ƿx.=Ya!=ȾqT(<~xgK=b>H"p?=3H>0?^t>D>b?^?8e?$e=~R/@ο݈࿴)?\x;?&f>Ji`,ss?9?7{俑焿n?$ >PjvCWC? kU>w?0"?d? x|}w9FZ$=>& >)d r>+a@90*r8> >??8yPܢ4hпyY+>j?s-?W?|?V@olȿ>}{>cOXsV!Z=>b?4?ȭ?ɽU@?5VXw}@70=C#нI?Pþuj>֢?V l>!,?8 >z sWdwU臽~ξuL >Kr>^s>~\?>>tx>Uo=Jo06Rܿ%=th5X>n%|?&{n)?M> ]F>]r"?b ־G8?>Z?S"=CLz7Pr>]?=}ۻV|O#o.W-?!?^Z?q꾸f>(.M.R?/?l(#>d:]>|F>s8>˿=߉<>ȾܿEլiӾPྒྷBn?(sXRt*60>0}ǽT<$ >$g?8?@}m]Yҽȵ +f?X>uxXc=,}0X?V쌾(kPC>ltV>&(r?>R\31\`߾⪾?Y{]>(s <)?t?BXg ?= 0F<&,#6rY c<>>̾b8w>,>B*a\?xւ?)m=0c>:ut?%|?j>F3>%?JH?OM>!劽7hے>h(#ZYW(M,`? 0!Du>ɜ>5 ?v׾EjCw3>-= ?.Ⱦ$ȿȀȾtkGb*4d"B!`Q9@A¹B}L8^ ="^R¯&/-*unbuvl<UA=”OB9\74Ȇi @01hACn$-t(U”f…BO.!BWA`&\O@9ɺFœ<¹X+I bg®b©zN&š  3,R@cA0^@׆Bo&J¬S—-{=_o,w| ^²- tAq~^*B\@@vBAB VWj@Yro }H-U+8GqYth4)M˜سvBd?^A k39\.h [A™-W*AU ¢tN[«&$5T ƽ[CAA R!U¯a*:+"lȦv8B;@X@0BJwB@R44MlC AIB@t%AIBϣ@H<_;:8A7£—d\BF +4,eAF⿨Aj+.A`AQ٦¢lԤ$4„A BX˰)¬]Œ4HCv7/y@xLN3Z*CH>]–`A!Ÿ3G !-“º/#']–?nEŠ §*.Q;!µ5\˜uqˆg"P$:’9<ӢJV& -xqB"Vƒ|(`0®!,q>cX9IJ&7ʿ4BV?@tA* |ZTTvJBb¾ICBpABB(CE=tV0BIBWBGB\B] B_uDBJYAhBVZABAB=B TAA|B.mBP5B]5$‡l*-BkQ`ABjBgB1UA8YXpAooAnPX?QB,6BBWBFB܊BqBB{BBB`g9AxBB" BA-BgBj?zA@-ARAB-BPABA9G%4„>#BK469@A!x,<BVB¹ y0n®R 0I@YH‚%Hrm)@B\A>@M@zB s ̢B4(A%jAo7NBqB8 B C(z^M°ƞ rZoBv+?:*BѱBp'š{8@0\AMBQb*"5*(; BWVBDpNµ±!P'B2 7jAu@D_BgBuAeACAzWBB=OAgAِJAͬ@BUCžkǑ@vKA)­H¤x|`WDHxA*%ڨ‘UMb 9VBV8C!#8^jU-6 rA!QE*¯R|жABcZB؈BAKB_TBB,BN?7EPBqBmAȬBeC]BBڜ?dB.eB#B\BeABpBBʱB'B4BؿCAxBBBab‘XI ۰y\ӕ6B~G&B(|¥l7!B`AnuœB%LB!ٳBt3윰Hby@Nt>µ+5«%jJ<€n7b4A΃B桢«I¯"¼1Pf£nN>V20xg^Y$mP*'G2c= )IjB6~$ ]|<0^D\ }}­5~B4DT%Re؜šlHbhEJn nAB…,tY¤2!GZ"—€F‡,@›G½بj?€Sq H_@t¹r2.UAK3BEcncBkƒO? e(;DAVDˆªXQ804pTJ$!h>¨PBjƬE£u?@Fd ӬFTe¿@'4Q}y¿[BUNLGԤB 28$@8J+Zs&“ahd±Aab&#\VWOAS{?.¼²#-‘3~aU…M@!rPAzAA @n7?@*‹M_HBC2@RAo/HڊAԘ,a{@ oAW@BɚXBi61AŠ^7?yBDBcB6v§AKegABL?p͞?ܺEB(B B@ݴBU 3{ a~dppUMR]" BBz±BAU0aAPь—gnȁA`Bf6B@ =;L5PBV BxBz9,&}BIG AAub)5"ickAm°j(08Bk6NA,l6ԡA{Z<@A"_]&\.2C2Y¾=*)2a~K,<b<ΰ‡$Wu¾a˺ϲ1 ljbM¤Lg^&AnErD?²< Z*;qA}«‹/a¬ܗp>3Gp4 ׍j٩3 ¦$i7n‰(Ÿ kbߙH#cfTڞ!rN flD͸±gn –e1`?ѿ ‡¯œpž?A֬嫠3¦fM >n ‹AMŠ@@x(;³ AdA6\UPBXA3A`]A9txpA~`AQX1BlBzA/BmxAAVA A){v؇ ZB~[1!8 ¸L:v.ˆ‘!8(H78x“|3?B{@BARCfDBYA~B|CfdBONώ:AZbпB$^BAd۫[B#BAB(9B&C-eBjA3BEBdlֳ³f´pCCLBDBo.Q+?=?EĿNPZg0?>WEqhB?: >߾  <,>% lP6?x?7?׭<`⑻oXΈ?3d=WX;>Zs?;->Eq>뽿;A?Q?md2>TⰤ> ?Y,oR渿h\>j?-n*댾2?MYKƊ_>O@ ]=M=:?=y?c}L=lP?08K5?3c 1u?o?[>>?nʾ?n?[>\]&傞,N6$(?4|_?BL?X0r? ?P=>"{->+=@V?Mg?]?6P˿GD=>p7,R>>M?>HL)>l>>? R>]??>>?NB?6? q>`>Ap <Ŀk{ؿaO%#} {Y\>1?>?im<Ǻ>T?>)>3?5?l <1X`xJ?_z>ޛ=?W>ZR? ]?9=#r?)޿">=Q!>5뼕 LC>>1)j>+?I$Ҿ>2x??V>ྫྷ>4t?*?U\?.p>Nڽc@%&? o?G?j?@>DFl>j%yWƿ3ĉ>qI{>> ?#?™?!>?2>uȿubv|=Sq*Cn>&}bcg5= ?C@? ??>>uc?3Ϣ?<?i?>v?Q;>Qj?\?ľ5_?;a@z?"?>򝡾X??5= ?5j?\5I4Aܼ>{>)>=>74ed>] [?܄=8@?:L>h4?0Z&N>|=I%>@ܾ>Ś?>8?^>f½aT?Ku?>R?$Y;|=}$8?*?l>J?&0?%M?<˺>%6??9Z6?ȿ-?zƩUN?b#`sZ?#d@%,>↾E` ?{?+?>8$^x?:O8>6蓋>`4?!຿ƿ`? ? x?Ǿÿ_9>}x=X }=)?y??9?!?̍>"?(x"d9O{C?$1?,8>>>o?eCM=P<>ń?{?>T n۾eʿ`$=þ}O?>m?k?]?t>'Կ>O?#i0~k?l??C r??&+>"?#t >pT?\0>sR?@^Ib??4no_?ƿ6>3( ?dr?˞=bԽTE>z7?]@ O&P&h?t| FF>?j?z??!l(>B?ÿ%4>:>j<>_=?J?*@>H >DpT6> ?9>P/.z?k>c>_>-W|>:?%/%Iֈe+3u?T>8y^g7?}/%?qk3?`+>&t#@H)yENU>2?v>ؿy9=>?oRDܾQ @?P@=t,?K$@ Gx}d>?>?;{-?>5y?zF[>:?n;>T?oQ?,J?@I(+Py?vxi> ?*?w4@3?/n~$=??:T>N{zE>'ľ ?y?n!1<:LI?7=Ҿrl\>%=8>݃ƾڟ?A?0?8j>˿?uT?7?kv0s>؍K=w0Ph^$>]_=nR=Կp\|=M?Eu#?MI?^?AJ&?%ڿsZX3~N=:?o=g=T=8N>m?"?:Τt>G>x[X>Y?=*?KۿMM8?]@)>_6>#?=2R?@?BP?yH5?;}?v ?8?k=N^?L{ȿ<*osr?*ZZK-޾, >Cf>:Zx>l>xj>g˿j@TSq D>?&Rf=y@4; ?Yg?U{?B +Q*1l>g&=gd?Ko??r> &*?>Lt??+?(??0S?i? ?I~?8JB=lZÿJؼ ཨ?&>?%Z>?R8>22w|=MJ>1h>>Z'?}`?3.4f>^?X)y>X>h_<'Q>1=sh>X侮JR?U>S,=uSA9 i?NI77?H>`??zX(?~?j?U]4K5|.=澱?>Т^Ԗx??+w=ä>m??(D? -@bZW>+@ !ѿlg?:$UE?0b2ÿ1?.>7wy2@?F??j?z&?82CG?n {>u8=C5O??"iO?]6DzNܾN>5辁ǿD!/!???BJB= 1>~i{0?!b+>F`9?\?'{ >xN>?/⾲?MR?1]?D?7:? OL= ?L?d =ü(@???8z>=պ?b>f"X? M>D̐hԤ 4O<> stH+c^=DΈ>"d;`h":ؾ?B=?׌Z>r%>ȾN?T?bDWX<> a.t?q?|=2~y?=$ Aޟ?ſd2L^?h91UAE> Vs2?y=\?Kp?hc@X .>mf?:\>[2?*'@=D?p?*_YI׿c`C~> İq"((,=E࿏=@¿t>b?uL?"#pf>l>:S>_ҨVBS?ONR>$Hhp*v?>xl=Hdam>]f=l &="?!>>쀑?'p=8>Y~<>2}>#>7>JWh? K!3q?=@ལ࠾@?;5=sȾ >j?>5?>-潤U(?U?*~t?>wh*?t>dLmAX=X?+w==O`?c ?>PjO;?m,g>ʣ?ϸ> >?R> O̾z?ڿ1쀾WU:E\?8".U)???!O?igܿ.=?b>w^I;?>W=*HO!f??>^?>|+@~"?#sB.."~?|J>b>vvط>=XlS@e 3'??*X@s?Ϫ=?v}=ֳLe ??d8&ÿ12Oc߾ˢ> ?go?]p?-z||>c#t6>AY?h? ?Gg?W?wR>5:?ÿ??!V?XQu&@>TPo?̛S7O73 >?Ioy=W??$>k ?`ϧ@s[$? "??A-=0п?z`'Xཿ<^p>> ƾ ?3"?D?_'v,8&?FW[f >=H q>:?Bc>yq9?&>?cn>fY?ľ:?1R JA?"?=ǞϦ?w:?" I?i:<2{0>02 迢W = I8)?:?&?N=>l?H?W[;u?MTz>h1L7`>ؿ1="-Pe ?AxC>&HP8?D=x|?>>? >^;`? p=| c?Զ?=_<5~?5 u=fRRj >ȿ SV?%>H? оȗ=S|>~2@?U"x>{%}>h(S=sFpVz>s???b?>S'qX>DnD?J_¿p>UDڿ_ؿQN^?'MJM<=X<=(m>G^$T=N~W>ҩ>d=о'?L?|>An?Q??Q>=͇t=P&p:2>q>?cS>($>uI? l>9t𾯹 ?$ɿ?(iN=1P>?F?P*C_'YĿj>>7S?3?U٘o??g̿K?n,k,>5.O>f࿏|޾,.R$??K#> Bf:>Ds>>:fz ?Cb&Y>3c?]?Y9=?+׿.=CX?=G>er{>fMZ?W>W0Vx? !?U0>?ΐ?񢖽PZĤ]=䠄Fj?HԿ >tLX?CÞ>A=~ZTZŻ+<0$v><@?0D+ϞI?2>"+?1' HNL4qkӿ0lMʼ`>k=>wF p?z=?"?$>*>>r\<4 >o_Sq[?レ簾=}{Ƒ?_<>U?=́U?W+?g=~?W|5 >ȿo>V?lb?]k?Z(n^ҿJd>>{>"WrkAC4?=+>>;>/F>EjIR@>ϐX?>ps?y?T?>W?8>㌿w>#+?|>\꾹nƿ=w? ,">f|C?3<{?p>G>EL?xwVp?.'}{o-Ѥ?,?ӿ>HV9>>1澎u8Կ?C'04oӽl?P=ղ6=c>郟?>x>-W{a b>͈B>jVzj$=#??% BK=/$T?@v>Z?}?)J>%߾⽜rɿ?Vz?O?r>44?R\>=H룔?3 > zb7P(ڿeȾY=T-?j)ο!оb?R?7 >y/=^?W` ڿj?n?hԾiY=>K>+09z?d? {a?Ҁ?^|??,|g}5w:L>?^8I"=$=E ޷sj2?G"?rT=leؾD>T=(h>u|?<.|n\`?2?\x^ ׿?C>?FX>2/bk<@f" >m=\>[??s?:?>η񾦝4 >yP?1kسp?% >3Oq~D"v*%/?(h?9@f?=?B?h=dx>#濨4o?:e>/&<]>)p{1M=R`=(3h?R4%^=1$:iv򎦿.n*`J"~ 4?Q&,?K?!~?v>澙n6>p$?\?pZ?~?%"?\\>?&?D>)v?qf> >>)=v>bK|2?)_G!׮r?>I>ۊ=V:?D=-#I>oR|A?">ė?(9x>GD>r|h;_l=>džK̝Zg-PMɿBVؽl( V>?|= >OпO㸿Wc*>zE?)>0>jh>Ϳ6>??D7> cRpZŎ׿݈> Tt9>m>򄾻OmQ?܍h?=c>,?dL Vv2>z>8?$F=vٔ>?KֿJvHO> A982 >>z~?{I?"yZp5b`>6 <>KMSS)>>>=aXPj)>%>?Y=8>=LhX??''= >6|hi g4><\N>j>0罢>>Wu?*>=p{8秿(.NU5Gd>\}ξh)?ԥ0> ??OJ?p1 AԿkʼn 1`=?6 ?^>0X2?E蕽w=[>*>ҘP?D>:?"r?w;? `> h?>^?B?"f>>i?=hZrb? 31>+Bk1=Ф%?;ۿn>?bֿT?(wڿd7>2?UG};ugܼb(3=л(/s?ɾeq@ Є}ѿ[Ӣ=!쾇=^{?#BJ?gͿN\# Ҿ>#gnlA+š+n d A“mk3+3¬x‹ºe?Lœ( \32B>D@%C}BC?vBB7@DC(W?D|“nnBB5[®4cRV ‰?vB?P(AWm¹@Tt`7tis(~A B3Bp0!>'BԩBqAAA'B9dAm1Bw‚ƒԜD[uApcID=BAiA TTBdX {-F˜K‰PAܝ2_7*(]1VBS]@bjBA=n 'B!xAB~rB NϚ m‹‘ժM 4?¨p@!vk |} ZbzB}©ZsKA Ay3(BbAJ |iL'tk+C~$'¡WA2@<3$½A, BpM}B"/BBb@:@B=||A6 ,?1|WsABS@فh;]@0AdO6# jA? FJBCA%Ba\iBAWAJSBɆ"<p;R9Z@A>lBicjHCC GpACB!KfC KkA„|BVBn<\MA(BBBjiM«_¥‘-HB@?A.c1ӿ$Bۛ =BR>9AX"K`…€‰zecϪ_KAP)_07yYAܱB0XeVY8¾a3DyEA^-D jYXN“d‚l;B'@z³C,??c҆AA{BqnL AD•JB9B=A1Y?mBGʉ)9i ЎonB=~BGBcŠV@S8¾G$9_OB B2 BUBÀBBA&?0A4EeRBt'>Au6B pAt^,BkzB]BB7fB =MkAA1@†BB"tmFC/B_tA1̀AZرAR#BnBlYBAD˒jAmBJ=C B~,C@BB/~BB'B~A:B6N9B/Bן BXBCcC)\B vZqBBC_BoAABBADB*w@_@ ' sҩ0\KAA2f V@)6SBBt7S1lB t VŽbL#|"yBt=P{I-±%\UC¿G &u†omY\BC$0CLCCKCCXC7BqBCtBaD=CXKB|ȀC?Aku(+KBA+BUBpDBB0jC3B|YBHA|A{n JSXBwu%BWbA &B7*BهB7C mB\B BC5ABXB BpB»AjC?(BGC2MBXBC:BԐBC'C7G1C6:C,OB-B1BגSA:MB54B:B.vAAqB4dY„5BnQ, C2aBdBJBoqBәC,A"BFB6BBUwB$%*AUABTCRXfAuB gB{C8C LCI,BLCԤBmB?BsB}"8ACm}ClBBGB"B C$BC :CYB潿Bk@{B_BoAC.TbC^BGB'uTBrA{ABcBPBE)B}A 9"BV¼צBB:JFAA.AmA- ŸBd ŸŽ3@@VIC d, C|BBO @ôUB"ᑈ=n~سB7kN?=aUBζBC<BjUA7AVgBBnAY%Ag`?}P´X}AaBBJbBBdN|B0s.BLB7Mf 5$D AZALB @BwbBd„r@`A AwbeG@bABpB+AZ@u(~C|oB-BʆBOЈ"$UB~ B=Ϳ¨LB */fLu%6ʐ€¦%E8´"9?E>?-Ϳ-t]3(&8>X>0?U4?=>&p??HHο*x??j>Ҩ.P>H0? )?<>RؿEۿBZ?H?;|*+ K7 _l?о!>^y?I?; >gg?1Mdt>$>ˈ^>J#r?*@ N$r0>>8ȿ$>d>^y6?h=|>T9]?P\=Qb>&?- @?>WѮC0e=?I%?>蒾s??Zj=5>bFSqпl=پ"<<W=&(h>Zxb4? IzUH>! ;x>괾T :%c4r?@ldz?+? /9n?:?[d{X?= PN2n.rg?0>-8?>츿4? ྚ?Wwο٬>elҾDV~>1??nL%>v98J?a[ƾ >XZ?@势k?lH""i1q>_>>u+$ulØ翯ȿDϽd ?%Z?=?ľJa?&?;:>Q6?-s>rbb!<&0A>G>Q>$>.pĿ ;=2?W ?iiL?w&S?65 ÿa] >-?~ +d >8?U_.+x,h`?>#?`?bٿ d?u ?>.>]޾>0[,>|뿚?{O h.L&< ?]n9ePRO>T{" =L> 뿥߿Z?wl? >Y >!=.PR?$Aq?$>=IϨ?? | ?]?=?>?|A>K=ݿgFp4?L>zhUf@W?U?j}c4>8>/vn1~P[>Y?xdF ?|>?w> ?9^It>4~?w,>?2-1_>ѦT>q$:%? n>9?48>e4>W??/>O?I>ܑ?hI?AUr>\T? #?(>z_>>>tbbuK=^ =QŬq #?HwnJݴ?.??2u?y*?6Iz?l??? C)>侑Ϡ=߾k$=c؈!Z$?VH? ?X8пX Xz?"1?)a>>z#d{^k=bĽ?>F>>;c?,J?/:>ќq?ƚ ?<蔾0E?!F?N.> V=~Ŀ7v>7Ҝ=497$?PQ?->:?I?aǿ0>o?=Z?5 ?r쾿+>E*f>P)2*>l>=+xߓZn*>+?Xȿ+'/=4?l>ȿd:$8׿1B?85?'&>l>t?ҽc0?-lĿc??>0l?ڿD?t?svw>k?>h?/F>9?GOnu=I?*&VrX?T?xG?nԨ? տLT?>⛜/>*Nj>p$9?x? A(?2f?}"O?G*>H>:>=B<8ݣֿ=H>ϣ?3~eC?X>@<? ?.>}`?e?xP?d8`<d>P ?>@?,bpi2>8Nr~I濓'>޽ ?'L?O8?0 >B?/\o=כ?X>h>xty?e>l`? ?v0>ʊ\/?>>hOvd=;? E۴(QgH^ľG.8?a %X#vz+?rYb>f`K?;=]Hɠ? V>P?>¾S?bپ ´?$>ҩ>}[>Eɽ=t??Ao?>IW>=uT?F>F>?C?D˿?F?%?>=\̾H {>޿ G쿍m^~@%a?16)>ZvS>n\?d>?V!cZh?Q>|4ο3J?B^`J`]>abv>g !FdP@:L>?rS?r:?I,Z?T?>M?;C_\' ӿ[Rk?O> ?X5\辱{P>`ʾ>(5j_u>iT@?,&uwc?<ɐZ.-u''Go=_h*ij7?Ǡ>*Pƞ[?(>N?>%YqMp?Cr`W?+?,ڿj<>ƶ=L? #?W"j> @0e>[?.M?>Z> r7 ?=U5Hp?9]g>"t^aG>J?W?B>L? Կpk׫>a??<=t>ݞ>I?#H?[ ,=.|H,(ʾ8ܿ-'??>]#eQ>/?4>Ѿr2>CU??=@$S\?\KlX?pe>ؿM<&?o?־o?*T.S+=Yw >:,>w}I>?6 <<0y%6?FC>ш>P>Dg//¾&>?8>d#>i >g@V8>4>?ϾBڠލ$Z>Ԣm0Hf|lۘ >a?j;QE:R\Ͼc>->/?^HT>zP?=?o8>?!=-?8B> 8^2Jٿ?+?">N??/#?&?(g? ?tw>3aJ?Dks h8>F?86)X=1⠾'|=R辧9?8썿8w6o>(0>Kd>3y??\~>3t?,?ͺ6@>wy?q*Ï`A[>=0<ܿj;w>d?S>'> (>6>fҷ?Tl>hf >/jѿR[?LI?$L?j͜L漿#)% kc=>>>=d>>Ys;>t?j=h?xn=*35>]th>>> V4;*z>y>Ej(%,Nl?J>.l"?V?ᄖ?{[o?>?Z?=>¼Aju?dͿ&%?s?c>=>>W. ?4'&YLʪT /b?!⌾m>R?.B0R-(>zơ<9?+><βFq]?z>B? n?kǾYc4kF-&?'>=͉E>;0?\JGĿnb N(l>a*ſ|7 />>ƦU=4-оb=ʟڿʣ^ >¾F?70 zqyf)= ?99u??8;6^?֦>5>$j>\Cj$;սr;?zCNR&>8?M%(㕄(_I!ǀVְ?'>or?';IL/~>2㬾|tB5LοB,Q=*?N?>isr?9hj`g< #y??? @$K?#? ?C?ƿs?@y>q?a?G?@@" $Ұ>?w"'R>hiP)&v"VJ?YKɻX??+ÿͲ>fϾatܿZ>Mtx>*? ?t>x>DžXO8:d|ڳ?yN>6 Z>R`,ڐ@ ?=c?j??:Hi}~?f߽?k?EC0|/<9>>ta*>\JR`>>t濜*YlAL鐾_?bF?dԻ~w8=? ZxA_N>|Zu&־s@gV>>OZ>?"=hX?1MvͿ9j>>I\ͰڿQѿiiR7|=?BU= u2^Լ >k_>%3Ԕ?`?3@C>}!$k!VRѿ['|?Νa>љf> G }Cp|pz>D6ļJ>+y?g=#6@ޫ?O?>C>rb>;#=YT23W콉N?P?DZ=?>/\j:}I)5>]xܾVQ=&R(?"QOD=쾍PJ[?.m ?<6(?"侎Hd=C)гV>Eq?+`>?$c)̿Vx?RH>\>z ? +?F~>'@\<`-]>{ؼ =Ϊ¾u?M?n=N`;a =X@QH& g$1&>pv?̽|tiaKmNNx? ׾ɿE?`~oXd>iZB>zP?-?;:Lp\go>ξwd?YAW( >o}|ʽ*.>Sv&`0Ǿ+ 3:?sZ?nj]->Wҿ>WX?=AX*ۿ{m>?M>?q?Hϸȿl>8'翄AͿdFOD? ShCXj?$y¿A>>/]I9?X?j> ͲkU>sp?Tz!=ʲ?݌? ?֋򳿛"Rp$9F>0:]n2_'=?uN?”S=*T]xXp>Wn|*>5 8W^a?d?/?h>Ľ?$TO?(?;@qwFC) Vam'~?1̙ű-?R?LB=À>K(>XyI>6?>]芁?|?2`(>hh_&?6!h>90?Y{a>9}^(=?(Mz@K.>&=Q񨿘B:?I,>6?),@dџ0=y4V>,=*??->g=?xP!R<]rp?\?*k?s>< ?HG>> ?SP_ !=?ư?}>>»t>]?y(>򿾩w?g>Tܿ;]8`?>"࿐F ?6rо3ֽk:#膽]E>!2ƿMc?ϢO" >! ZRr?12H?kԾ?*>]P>ֻ=>=>*? PB,*9)uؿ/֚n>k> `?6E>ǩ>`6YؾɋRat񘰾ѐU>XF>?&ÿFK^R?7>r QA>- >F0>A?ͿLPKN ?}>N>gۿG@Ud>>?H *?пGRZ;?AmB].ܽ v?GF?K?_? c?~=?;&~?K=Jν~'+t ؽ!`?0>ަ>;,=^p 60t> >J!Z4)V2 =, ?־=f`>|:ھy>Q}'4>8ҿ?xnI d?N<~`|Ģ>mK.IԾV?=$7>Z՝>0y3¼5`>_L!>>1?f侰4>>g >K?_ξ><4?R?V?xJ>Ŗh?!=i yn%^Dn'? Cڤ*;N#MDKD?jgw/{dKOY=оI4?ҁ???̻>>W.@ ٿ3=x^\)>ݺZX?0EΈ?"ӿK>/A=pDH?@yI^?8: ?H]?U>>~)ڡ?-ƿî>{B(>sO==ԼMx>C& ?p \нÀ?2?#?b F0G?y=l̐>z? *>??nz=?1U*U>¿%k\>"9?N?&Tb(?2j?*~ @m>C?%X?ٿ;@xԾ_+?c>d=S@?Yx?. ]?C˘~ z@X?Q>C-?9g=tvߨW gm> +d?>0h;k2?/Х?oþ/]?T$?q¾ o>( }8 ">>N>,>n-lZo?$W(?GHğl>ѿ =>o>Sh-?㾩D˿exw?cw*?t#k :~?4\v~>Hyh>l0>>>:w5?w:>hk>KS>?r֪?)%9 D>UC?G^q;Z2?yo?=Z? w>?2=?[xS#1}ýY>b^RX= >%b>f>>>8?b}>^-?W?㿟I2r:Ǥz]7vUnM+A2 A+A0'AGA A*@܈Bg.Ia2B*PB6߂A`:BaB/BŠ0$B~ЕL™t¯BPAbA@+T9DycT|B{UTBʽ(AzCF%<3<°;<A~B+:M B79QFVk$֣rB^$@BAnABJ.B}A wBJA;Cp Bf2@B4y 9 aBBA&A.BBI\BJ BPjB?B{*ACd8ABDB BBw7^K߸[OCBq+AB\A4>_B BBhCAöpBKtB+AZοMlBBW ‘1@B6plKBBn^C74B)B#B;"BNBÀ FzB`W}BO&A(4,Ba BB;%0AzB 3BK_CC tBC.BB(B B#BA89AABzB| 8BB2M2bCVq2}PC1ªBBABV)BTMBd6B2BRZB!AAُBHjBOA¸e޾̸L@AB0bBBҊ4/aBB>f…B- A˴»€OBB-1Jb•ABalU*Vѭ@tBOBŝB-BBBCBS*&ϥo%B=AaA´qœbAy*!cB1ZBhBōx3ANybGvÃABB!\ BLOBV4BYbFBHfBg!B2mBϓBB%¨*BksTB1BcaB3(CBȨAwBBekAIQABA)BSBWqbByUdA9rVUH-B|B CfB<R!B-?5uAoAvB SA8BvKBF_BJzjHB@B4`BB^¯z뾜S>k\>-Mt?;Btj`>S*.??" }?="d>4?y?6?gԚ?u EF>*T'HܿD?9 ? ?Y>g?}9Di*H4?7B>`%?OGv:>Ml?  b>/?OT?N{_]Q fKR>h q ƿsŗ=PΎRؿ~=X9M#>ȝ? "]=z@=hd?,A?~Y&B< X<L>B=$ >฿m=@>J?F>|ނ@)l?(}>2䜿 ]:?> ?C=?>>>1ͅ$ =#E~?H?T7?>eΪ?u?k&=u>F=ťy5vHF>Xqʾ#{W=R0>>\0>]ӿg?B?:"?p?pV8?XY')i4>5>~?CӤ?>=?DB|>Muҿ2r??ApA?? Z?D>v>¶-?ؔ>j?̿"m=`">>v K>f?L?6,6>讋uU=aox=aAt%*X&տ(?7;@S0?g?q??=}>%>d>?ȾV>QT$2=x>SJ)r$tp?^?'P>?[O?;!?0[kzU6?U?l>L0_G>k}(ʫށ-ȿwq_>ȕTݨӤg>N?@}־?&T?V=J([I>:M3iT? =t0?>>J(?mÂ?=a[L>^5>G`@a1t>b/)↓]*>zjKJ=;eJ!w\=>SJ2fXBU>AՎ>4ƽ|1R>= qr?mK]1^?E>?cj?l:y% {:<s ?T?;X?'h?Qe.>14>wYxFh??̾9x?>n?Iܾ>}>xf?\$l?#?g?3H?*?3/hi潣,?7Dt|辜|b l>ALv? nhGX Z5?=>pֿkK(:}?!>6? пb^<"Ƅ^>0JR{mh?Ճ>&f?.?)RR=*<>O& /h ]X?M? .?K>W濕h>t}?T=Ͼzz>iʽ5>vB8_=?j*p>l>]h?cGI?>>`5?Ov>o,b>>O?Y:Uݿ>h<ְ;8Z@>y>`!󺽕Ⱦw郄o>>ؿ6%۾\ݿlܾa>= >0>֤1y>QBwu?V7пɾ|?? "@ÿ;:>#>>1$^=J=t<7>;[e?!f>)?m]>‰?iL,!,>sd?.놼>qݲy?2>(t ?@j?]m?rd>"Ш>?1%?nTĿ~+>J92?)=~>(=/0}n^faɎV\Rƿ r=ŎؿC-=|FF?.?Ijy>?)1@Nz&>5?j(Uz?)ξ]>eB?P?sZ>^>4"> <>z?S6ݿ=08|d(Wg8.>4 CE>@kTM$2f=u>x.T>fھ߬H>'?tl?I޿ ?,A'x>Ԅ?n >u>=α>I>ZF]> )4H(f6>^kؾ,Rs?|>팿-uc?>>7h=? '??b>r{?= >:FtX?Nͽ`d8?%˾wi=>@*=V/>Ǽ>b>75?9? +!hK(-=]U/?;J>k>:H Ae^>wB=WTD>w=%?U=1 ~ܾZ!Q4 Pc@>aT~ֿUpֽk??>Є QT?N< QL?:VV:{=+>V?0?h?,%i(>>G{?A*+C?,alA5\慒~{8?(]'?8?p?mlĿݾ?? P>N?y8G?~̿w0>YZ9=$>-.<[?1l>?f`G?ph? Ev?R>7an>z,>jbߕd={:s>?P>F?RM+yEDC+y>%? G?D=;xx>qp?!޾긽m,?)~K.h¿@=`(at?ey>>?M:?Jv/?P>6>4:>b>iaϿ:;μ >Qe;) ?7[? X?o?nJ?%D >?|i+4??Ƚhk>>5B7οast>?"?u?RpKs.> Υ?FqTWhM&L?=1'6?@o?t>>V̾A>}xbof?g>p~|? 5|>XQ=(?UB'x̎](  .t?<(?; :>:$>Ջ=֟8\?.+Ӿd>]>Xh?FS9IpʾݍK(#=I>2/=g>:FS?^ڿOZz?z]:@&[d8⿀4"] V<{>)N`=>-?1v=v(\>Gk|3=HϾc麺&>=wa=\>@2b= i=l,?œLGOO">ni<ʽȿgHj$Ƚ - ?l-<1近>ݿ?) P?nF;=PШ`5?<0H`ϽG>v*%A*?'Hnv{S>D ̀ˆ3ǟ[R;2~[<>uQx5f??ÿV@?a@dds2?%l>*M<67Am>H5x>??>%?CDC2?h?a>w< >mϿe?!ə>i=̐?S\^,j>jjFf?<b?P=c@n=X>W=z<>XX=ĐQ=NQ>UX?뻥?#i3gҾTPF>4=od?džb>z?8p$d>HL 92d?a??q>Rտ+=Ȱ*ѿe֒N?}>/*>r=!X?&?MG>'@">>?"_>_ƾ@=R;t?>@Z?҄>оLἿ ?=>&X& ,+N}ωB?!:r=}M(!?2=`f>tw[?n?R羴;>l>޼Ⱦ>W숾X?[}Oj?C>Cǘv},>zҾԿ(hIC3㾚ʐ>?0@;? vL߆D>R?z#<>59=Qt0=GbT?n*>aĿ!q1 Zӣ>i ޔ*7kg1祿m4?>Uaľб=\t?%_??yuοt[?q}B??7 >[A<4f?˾d>?*Ƚ>Ax? Z=ԿW>&T!=ϿĽؿz?/\>>dB;>CZ!>Ǿͷ?4?=8???Ұ?_ (T(+&?>T"Bmش??_9@%:?<>h:ZѿcAf>> >E4鿀u.> d8z>\>Y+6?c"?F?8y?#f>%?e=X0?i^.2[>>b,/ WI=F8`|\|jܼ\eo?k? >Y?r[>OR;?6Vf>M7 ~>`>Q74>\TaȮ=>WTܿ651N w>濔p?ԾYο[^j;j?6?~E>sjh>WM>ۙ]>N>? ܿm?վľ ?m>o8?\=6?Ճm!?zڿ=r^>eX?6!m=z,>Av>=?,2?9>ҿ ;?Cbu?ø?.N&??09п蝽=<=0i>Ͼ̀Ρgk?2~?I?|??g?ʄ=7P> Kz>lGֿŽl=CD?F Zo?7Ku?i>Yҿ7SϿe?>ֿ vҽ\S2z5>IwP4S8~Vg; ?EVw$x?I,zXk=2\%>->(I>x;507˿<:Լ؂?#Y[??F6D>s($5 7\ 򿀔 ;x,Nv?C>bPC쿸js?v>8E?ЏOS>ۀ̿o0?Hƿ_?8?9z?U?)>_̽ ?1?3 ?2>b> 촿 ,ƨ>P0>24A>ҕ?i´B?8 .?xcE? ?E ,>3F?I^r?6?0L?9=Y=$>> >㾓?2N˽Y?d3ȿ`%<k(W?8 ?g̿!> ɿ?76SJ>n=YrL;">=?d&l/Lvc?4?t1>=?R>Xj>g>V>d.;ц5216*¼{à!?0Ve?>?C0QL>3?+ >?>?˿2?U7 >1o>C[Z8{e? 12@ &?U 򍍾I#?S>kfI }CL^=r>w>;P?8Կ()F> >p<(;=UX9q>V?$e>]=͵x?]|&?M禼]p>8&}$<D;q+d1hɿMI<)>&Q=?Afd?%٦O>lW>vz>3&ho?b<=sX8gcW_?N=z>fF?XQh&>Umbx>ےg=Lp>| F 0 r?o ¾Sp]!?79=-?Snʾ$>)?>|Th?:?-W>o>-?XM>"m2>l>`> 0?t[7Hև=p?]>ȷ>G,w>h>< Ur[?(k)V꽿R? K?3>3t=*PN>,F>m,>њ?$~>r=??"a< H?H_"=W#(?kL>aj>bv=ZV"p\??+%?= 4?)?9|=FCؿiW>p=0>ȱ<ag?6 ?3?-I>8>N?'?>Hƛ?ym>Wg(/W>?F=0<pؾ%>,3?:0?? ;d`?+JapьJET?" =8$>=~K%?T*>ܰ9>L~i?g>EI?z?o?U~>x?w?*?z;?ViT> <'$pk?.6VM?#F>>m>sԆHddx?>߃.>#O=Ft<Ƞ?&h>lk?oc0R?侑 e0+O.| >νÿν?y?7?8?|p=y?{?q]H6nD0%[?v˿.?as;#M8Q=?3>'Ids =`X;?!tn>>VZIi/_T=$lB8?%?S]Z??ǽ& I?4L>?^~Uia{M=:(|>?򱾑ٿ]i?G>? j>(?@&'4?)OS HʥS>v? O@(r׾oaM>u58?lm?忁>>a~p??Yʿ#~-*a *>no??$? 5Bx>uL#NT^ 2='4?UE-Ǧ>,*忺?P8 ?*??/? >>h}1@?yzƽ ?2>x>>)4ƿ(+>`y>䮾? t:?{>ӿ?)? 5?'/վŖ=4Ѳ`3?~^?,?a<>|?.>tM-?`D>>R)8I =ȿ=Q(5?t>ˢ?7=h>Q-ۻ~RD+ٿx>>>|>">t"/?>>e>辛>S+X>uMGy>́$}x㿌]zV>>⿰=b^>; wk?:p>m=?w>> u?3?V?R]?>-B?k2-2?CR>x?~?fv?O\?CЗ,..x,:t?yP>?Df”4D;0Bl!()4<tcݵA(p´%h: xPa¶CqX84AKeO-Ūµzx7A  @1{\DF._$`kU‘<@OՅ#+h6^†wؚB@rTTªXjF¢az ~ ¶6BKbcf&„SŽ" BU(Fž"tVdbA389¨g Xm_ Hd\(A7A& ҙW!”cAA kHU,[B¯ Q!€½a°gvH˜^W!'QF³Cư@š(r@vŠzW4A{dB l^BpݡA?@rqZ3Aٛ—|#B-F>^@²0$¦u‚A!‘h~• 7ž~@h>@:@(BJAjBk`7!Cx_Hk0Ad%­ =·:(v³|& 6˜-U?QlA@!B;A'Q\XQB@_qc1ArB wB gc@X"²0(zwANg% >¶mcp@fBBmH@LAoƂ?@r27_n@츥|BI}B'.Z5A4X`kW,X@K7AsA"-RBU3Aa€]BtBUB[A&:y@BVBEINXAQlB6@>B-wRB@UEuHe||(AıTJo]'-F]+AWB.Bx;rBWjgB?;);lBC^a$BBHxABbB&@ivdۓe BS#A¡E?5GY¼¯AB~e5'HbZz±H9²HˆWTrA¬u%BD*8–ǗTAjmW³+˜xJ@m`@(pbA\lҤfr`¤Y8j†7QtMZ©G³>ªŠ S4’Œ°]ܺF?wP3Bt>`\eʎL­RxrNc@~sPATd7Pr8rBfB_A@0V¢Y|kb}BLB S}>Cn›px±35fS:2t< A#z;BLAJB#pAHA,B^߇A@s1$C7bVU8|AEA O:¬_KAB NŠ7;vH J^¨A蔲@z‰'Mw+@:ʓ8b&‡p?’Uxª {RQ)•] H+M(E9A" u 7UBDBM TBk#H•HBA?R2j\&ypy‡nθ8dAFTB2"=ԧ8 X֝pCfBC0AȺb@]RB jBiA4B'A+@q CbAҺB,BgBBB`BB>AVTBH8Q9B)Jz¨BB/$>N56BT£yL@AruB)AA"BB8H~@b3`BCCmBB@`B3>N@ONBB;AABhABh*BOT>@4B̿?BBZBJL7BAAJ BҧBB>DBABBNAȳvpr#]BAX8=[?j#\FB7B.A kܛBACRn IBYj?EdBpBeB(PCBŋASBTAðpBϧBрAR5887BnFB6kBWCA@|@ @©GBP&ν>S>>p`>N/c?I>DX)>VG> wNj>=->.\`?K轙ۖWIпE燾2K߿xkd>m)?wBȿ? 6?>F|>`nH7?Sj>; /hH6^:T?^?a\>¦?Կ>o? v ο^>P!?9,?s4? ?3DBI+H?Z>Zȿ=֯x:H>F1+ݤS?y`S>6P>>53=t=uCп6P%5V-7N\"=D`3>oR> sT=>>S*R(>>d@@?[P=%F>6FiN?u>^]]ɼZBؾAn喵>?&׿ܾ+J;Ow>xز>@???n^8 g=ȇ> <@>{? ֓">[[)=2> ؂D*T>4sWL<$= -?#d>ῳ^~jX?+?,.ٿ>VB&X?N?&?BS,~T?!?]?ЊAh ^?2g?N$癿8x?^f>PҾ76(=ɴX?>Mr=;.?ս پ26>><1&Ծ b,?>ݗE>9[M= 4?_Yؾ)[?;߶0=v?~#EO\?GN{Vd>xxEDMu 8?D>dxj?EԺ?ľa?DR>CP?h=࿝8?->i??b\%>X<L?ڇ>=?$J> $.>+?) ο>b\Z0Nÿ帾l8JJP?(2=l 96ӽM?{F??D=WK=8?ǗT|)2$=ʸ?>P~?S5>k?eC?+Pr什?'jT҈?5=]>ھ\|3+TUM2>&?e[>d??91??j|b>9?V$?Ht>LJ?V> >MQ?6?yR?R|{!>UB=^ҿoB"'h?NſxYD1>}2bKpk> 边L|`?M?g;?6]>-z>QM?d>e셿$>b?]?e?J?V>o֪>\=/(|>r>=>_hE=ep> s>^WJyH?}P`@e?bd=WWX 8󹫿crdwy<% `\qb>#>kQ>IJ?0K,>??.L8?5?N$k >Sֱ=,?>-/ӾmPvs?8>?g(>P#Dz?|^?"2(aj<2I?}c>3">tѾ1I=Ad!Ed?=?1 2?{;?.I? 1?n8?k忁꾙[>/1Pi`q+8H?]P>zh(H0?/$;=/0?[?޾ݳ?S+??q퐾AU >?K(?cO>1?Nzx>G?m-p?z{V^@>->E&>B>p 4?"> +B?OJ.]Ü쿀?;1?.2ܾ,J;7T?L+?m'ҟ>.YXɮ?:>>,6>.O8X:?i?ۿ~?NP/(VP>n?~?gŽwH$>ؾw>͢?%Y?Fz ?? /@tE_ ̀>iD?ѕb?>8Z?X?e _>< >h[A=>`>n? [>~.k=]"?JR >}?%j7"- +؍I%2(J? @P]?I׽?n>?y?'g?-?氿sؿ&?tT=Ԑ?j ?/о>`LY_= =GsX 9Xu"?>2pTp*ub?2>g9 ?E&>l?%ٿ$>fٔL>>B\zM !Q)>5>䦊> ׽ôWf ^>y>RV+F>Py>i[!>`lx>W;"<< X>b俔`JT(@a>>\GI ?N?B,A>>\ %(o?p=b?ߢ=$;K+}8>5[?W>[>[?#E })?j\4,"쾏h!?J%;?c?z?)?üFɨ5/[Z>s>w>b?HwA>'35B[p=>2>6̿8+z?;??pr|Uƾ ?[0C(3>sz0(>>#m3%;+?kw ?>X?@>??B?At3CG?޴??_~ᄄ yM>̿?þ>ܿM.߱i?O??d>`l>1[>x=>R,?4=@>SE?]2;#>cJ@?Θ>F?7>RfH?,|+U ƢU>QD`ExxA?k?s'?#ȿ@^׿e ?Td?%?")b>m K;>fru? B?=ұR?}52T?Nt>}о?֗>>55s@q??>6??E>՟=)?!Z>E.M3T?˜? >l xʝ*??l,?91[>x))"?E?B*D?K٬=5?='>R?NCL?8ih>? - ?Qe^?zRx >I`?R?4+?Ŭ?%'<<>.>0&>H( F2>/Z?6L>> >֒>~>2l̋d.+L=%?$[}Ă^>P?TWk>̋=|pa?2T"vzR?>&z>H{;Լ?H >rDa>>.>˸> ?=ب? >e?!?j>^ >μ?+|?~ U󾜛>}L6>3gf?jѿB?ؾo=˜?$ 9 ?=@N>?ǾZȀV>?G>s$qW!-,?i$?MK*?cv?f?Mkͦ?9?d>\> V?r?f>דd=FоW?Yr?{ʾ4>Ae;r8zȾ{6,?Z޾$=e `B?zW?A?S4='>D;"?eA;> ?j>$>?aSr>达8>B?$>n6?>qn/(ݿ8?OT?BFP@??LV>D&U>Y?ܽԐ?@Ź/?#? >S?`p??Dm?8_J>I=% >?2<@?K6?x=X?\=I=d>$8K>CO il>g>r>? |5~ؾV^=>߿漆kH??FĿŋp/>F?i{ f?H˿3m.?{v>6?teE?sÿBv?F{??u:?&A{?>G}QnS"PpBWS޿tΈ ο[f7=Y>>-vЀ>Kp?M*Hx>;E>/H>ꚱ wB>/ڿsa?O9j:Ѐ9? ?>>Ԍ>-f?d?(28J>?uý!?e?u`?>8*7?q,>JlTR P? R>R<>p?hJҾDɽ?`0sv')`PET? >X?C >>>U J Km ?[M=Ɇ`>AY?t0׿b`N o >Lqu[O>?3>Z?\duu[@ξГ ?GQ_}῱ >^?`bY?_?#?׾L>s՞&O=>3?Tdl&V|nf؈+?\s =?L?>> >K3z>d⟿>{Ԅ2?>?nZ̿Uq߭L2<Ёg?6?> =2?J>"? >+aQD῿n6e?-??L2>)ԝ@Pп5;qɠ=Hr(?=u+?b9?E#>4.L><ӽz>P(C?}1?xD@ F<2s\;?P=~?HE>hⰿÀ;h?Gէp/IY":C$?m>`=zJ\T*B?s";lEm=l#xX4yC6PY?>i>?>3x𪘾B?j#>@ 9u'2?9>'?'GC@;6?+aB>;?LlF?h2>am> þ׿[`>>8??]?]W?V> o<Ȑ>*?Os6>5⽎i;?{B?m>4V=?>n?3a>rO<>%潄>h=;>>OTjؿ%vpl?J|>8?)O?8i@:>B>jt>G>?Ϳ?yq=>dAL?v>D?ᾞ =>6,^?hKb o>?XdRn>>/k?+$?m&>g: H>ͭ=,?*o > ?t>@?,-?1,rQ=P>xz?RP>.=?f3k,?ácB?B 2?f>?iV {N>p>P+`??[npT>>e^?+:򾏔d=*P >E>tGYG\?GU/@?G>F>7̗?72Jܾy>ɧ?4EpbpL?*.V>mj}?q>F?ٱ?ax>Q6=lt?]wy?=?i?c"? }V\> 0(>I>>?\t=JdW70?y>;r>y?s.ṭ??}+ ^?v>9*?ЌvF=mX>ؗ?#%?j0H=Ugx&JgF>i:?y%>ݲ>`oþ3־?? ˿>`%D=2=(H? lȮ>KD;w?d>L?t?C?!>>"%zzQƒ(.vy臭}P?пp?|>u>n1>]?@"u>⽺R? ?@ >Q3>8$ׁ?_}>;z?W8p?վ=s>d-?Atwm.M b>_A=?p? P*=-?ZSͿ cnƾrℾĄf; 呾 r>]0?eP.6U8v?>}>R?򵾧a? ?²?a,~;IνK>3[8M,?+> d? 9y| l?n=Xْ?ne><˔?< ?M?4t]=ڿd2>P?: >X?rYƾ?M \j>:Dz8mV.D?S?aN?/|?ת?"~L?upD?B?>Dá? ?N~DD+AP{޽KtbaW>dR>Dh9JS$F>x>>W>vG>^Lr%M7M==>>Ñ>YZ=t> ?>? ?$-?7>0@оaOݿ4>\k0qE=e2?n1׿kZrҩ>??j>] SD>l|??cF>A??U 2l >:~?iz ZAu>־ZK>࿭=?Su>%Ph>F麼> T>7 ?T>k G{aj?ʨ)>>/5?O`eԾ ƾ:#>O ?*?P>H?L?X?,TDDBoAN Bd6vBy/BpҶbYBB]OA:'B#B&]BBDdyB%BZ5KABuBƛwKB3BPBÍ@{PB (A!}P[AjBBlBϲB0BKBBkBB¡|A#B~vR o`ARVxA9X$чBӲ\A.BQC\6a@7:(!A#T\!sAtOBB}'BLC iB'LCA:k@ŒB>Bw€@*jtBHD¯%¸CcPA=vSA(`B(%!‚< AtA*HA(?B4H7jB:KAɬM`x6Bl?N@B;AԧBkiݤBBuBUBTA@AeABC3C}B BB-€+$A΃W\_@Fa@b0@BSi@B*Ab’_u@•oB:Q<u$´AS8y(}B]AhݘBKRAA'ξ4BSB>g@/#.AEA‚p˜UxAAP?9m|BNB->%}BmWNAUcpBAd1WBrqu%BB0BcB#B5BVhBKAQcBsYk?@]B܁XB-]B(`BJ(BYqpA ACn4BrBBAoXcBmB~BWUBd4BB:B-B7BA?BPBB&AB,BBL>}_A^B,EARA1BB*A:g>J`BB,AL…A@ BYB}g!Az2BbBA9 A|"UA^BX" gPB5BcM`B)@!A<@B4BfBCIBw$B_AӤ>AvB(tBbC FCctB|WBU\BfBC A֚ADB(Ax! BgC%B3ChWCH6pB\BCC'C$B$V)B,BC i+PAo@A|BzCCB0BB"$AިAiAzBCkC7YCVBB"41C$CմBlCC2wA4BCUB CVB#vA[oBCB)C%]C t~BWBJBE?BCE ‰'BiB&Bb"¢CALoB"BkC(B4d=AXB"|B*GHBhBuG,BSB6B6AB_=@5qbWB@D2: Ivt”É&!(A"BA·r? wArBAm?BB|BXDB%BB--B=/jB8-C%BB8C!BTC5C:BjCBCW`CNC)BLBBaA>ɼBIB!BPKBٱ$@44B]mLB C .!C6qCByBB1B,uBBC5B#XAB tA{jB=,E,C}@SPBJBA_|BkBrx5zB3Bs>@Aߺ-B_fBZB>CNQBP57C BQkBjC1B|B:eB{B=!BC'8^ABA_CC dBJBTB^u BTB`B#CTbiBHB=B|6BdbBIXAoBڿ`M(B A .Bـ7B0ojdC:@AuB4CH@B_B|C3.6C7/Bb/wCsBP BAK B!ABBiBpBB͊BsZBHGB BA +CA;ʏB3C"RCM CC8C[BAWB(ABBALB@CBQBu9B(AAHfABDBBnjB)%.?#NB"^BUB3h.B-O4 C9BnC+ `BVBidVAgAaB!IC,YC[(BFpC&BC 'BޠB !BCZBO rB5AОBIAECgLBvzBC3B;AvB{>y@بBGbtwEA@BBΡBh!C^BBךA;B1)B4aB|$BCA}xB#A BPeB#BւC*PC@B3gB:dCQFC1 C*CPAC:5BNiBt.\&CʴCBÁA(9BB2BBd+BbC(,B{C.C-ĿBXCIa B\fC8 CWByBaBrLBcxB`*B:B`x#¦>B¤ŠÂ@yϿF'BPBRzBwA0PB+PM9A.#@“K=vpU) GAK@A 6uºL @ B˸B7?B A[m0AhB7/‰YwY{]€becBBUUE.ˆ8(BD)Az\B3CC82BAǔA\RB;B[B6|A!B~zA"B ZB6BrB4AAHBB>(¢l?BRyB5bCvcS B[Aܔ BZBԋB7CK/C+ժBFB)C% CC,DBێ@2d2A˳*CbB~CH A/$1W"@@5zC`BDBLAWBF_A^BzA>DYBvEB5BLBBb,BFC&)By;BBC\BEAB^tBˣC aBWC3BBPCGA@zBLCJ(B^C@@>A B C#kBxBA'1C'BwALBBSGBfCNEB &C Z B;BȓBɂCCC6B_UB hB‹B>A[BLB)AB=B"Bϙ8`AB)ZAAfB^BCEB6hBf>@vBC%C BBBkC=+AiLAIBB}.BchBsBbAXBz!BBl``BB:>Bl+ ByBmBPŁB_CB|:Bo~B/BzBBdxBtBHC4 CNCnC5BfCB;@C35tB&AuB3~BBLAC\xB8=B(B`cJBC0ͺC',Cn ?`?F[ewn݄`==?b>Z¾Nr?z>㍿$DJt\[~S>kĿR?D?:@>٪_;>s?> X5V=5?4D=>Є?2Қ>qdb'>=8??6>GaC>F>?><CnE> 窼? -Gվ'1 e?$"A>%C?}?ֿ-xi$>b¿7O딿\*>qо˼w8=n&DG?ʙ??;hu>N^?UZtz9D6 =m?a?#O?vG?uHV3d>B>Ja&th?]?@:>޺;(G*?x>&>J<LS[>>=>b>Р4>S?0^?C&?t-kd>?S=Q,Xtz?};D%]~*V㻿pSֿ[>![>چE.e?[}>smd>3??)ǽ "TK&?=vU?->D2?=t?9?v$?^ݿq ־*ɾ =7Ѭ. Z>?U&= =bпuLW??BF;٣@ŧ`?HD>?S />:->I4{BH?4C5>A8>jѻ> Ⱦ@>#?!c ?&h>:e<>ᨿ\->t}WL ?vþ6Q<>eQ?Ҥ>ۂ6z{?=@>eL?w?o?CeL8?\?^Ro=fO>a?y?">K>dd? >ƌ>Zo߿?‘;?hGA7@r<ŤJ=QVf?[?M>.k߾J6^"sxv/"=(>W롛??G ?w47v >B#?Ix?f3<~?,=<)>]>O쿌$?t?,b>;Q#X(?\{i>J?GXҢv h^?[߽иN ?@y?֖@?!>vȾur1+>(PhKxWLV,?Z=?l* ?R$>㨾:@? k=ebeʿaf2>#?>? Z>,;30?%?W n1z>_vEia>L??#>>A6 QK?n?=>RU2>h>E>C7| ="f#̴ӷ>[&?5V>>,,? >>2<i|\>-3%BX"Dcn ?6 <<ɿKd}Xl?>[?LܾtK2E>⾔0'4Q(>3 >>qf咿ek?Ox=z?7??>#>N}RE̺2 ?m=+]=H#>n@־¨>DξK1L?(67pu˛CΕ??lb¿ .?>m?3|.p^ v > 6odr0?.'p8>gvпr?>4`TD@Jҿ'6[>*W?;?eZ???|?ؼէ?K=KHPC{ Ü*=X_>N'ƍ > >@9>A?=h?k??bm?*¿?94X۽]9d>zV>8 Y;߾p& f6X?þ??Vz? u>>O腈*>JTA>mT=?N>oG V`?N`T3XVCpKz>N%ia ۤQk>W??D= ?;2?^0>ws>uQ>gEwꯆпHF?P,>C>'Ŀoc3?7=Ox>?GH?:y>־=8<3?qe.)]zؾ{a`z|=$3Xݾ&e>7d?B쬿^g^?Ӵ?(|>}M_D~_s>8*dr?L QY% ʾQi>!> Ⱦj=怼 [=`^:g?>:ȿ|!H>9= ?v?XĿCž?ʿIDC?9+@=F>ˑe?3b=.M?*>[?x>aW<0?=+>v>"d~?.g뽓XT?5>Qek>O >bk>?ފ\4" >iH^f=ۈk_>G|?EDf-=Lտ6I? oM}(>v1u> >q?͓>7z>nl ?A>߿,1b?ÿ$ST>^?2K>0Sh ?\?@QzNf>#G@?Ϳ2>;?g>F;?&쿫=?Y˷<>?D. nt?l?,+>򈂽 x>@Vm?>WϾ$׾]\jZƾ@a?Bo5t8=HP?`ӓF3t<A>cD>?)P>Y%2l?ج>K?IRQ[& ,T`Ӵ=3? o`?a=ՐD=^?ۓQ?hӿq>VUt?p>s+: Nr!?!???S=p>~l>Y*౽?꠿ٿO-q|(|A>O;|E<L(>zν??~>axLep?|l>~S?(X>lWp`l ?0?DZQ<࿣Rq='>oUɾcN?8?$>~l?ۦ?.#w鬿gSf~ϕ?dB`a= h<:?3?`u1Ͻҡ>a=k/?r?J.1ۆ8P<>/LtY?+=# =(? /=Tо A=B4|'(j9 %q?m>>{)B?©??*){2@J* G JTd3$>P?PⒾ3@?^F? ?I^>{L|.jlrr? g,>8?up???j>m?Ԋ_w,=DCKM澘/N^B⿛ȿ2 Sv̿2plL? JD)'?iq>ܿƾFeƁd?:D>:?}zĐD!QA"D&`"?Oi^s?h/~?H Ǿ,4>^|>?޽b?C>< >ո>̛n&=Ŀ%?>!;B;׭3-쿁j>Yzߺ~>ZHn/zRn&>j>~+>xM+>>0?>C>ݾjb@8r?+S>@>zt&\> пj?-g #=tkg7B=ވyT?E̾>8V%&?տyvǜ#?&ϭ??D@?7 ¿۾o ZJՖG?Ӥ6^>W!?C 2j>h> p?,*?(/>Z>A>>>h>{.S~ WTtϱ?v>>B?t>u?wg𾤍ƿ迃>M?vJ?T?.o(h?"_?+$b3?Z"?׿f=7"Sl?L?-?TiR$"^K9OZUN}ݝ:W?3D{>QM2 J >j?.>ϬֿzdS>!Lv?5?>q>E>?DCϰ(kSڿ=>`(x?Gb?4ľm?JP>h&?ЏQ? TәEF<0@?Qe9?Jc)gſ_[H?Qۚ>8y>Zbύp?4 >/? 9>?Ȇ;>|qƾX7?y8'? r">0L][ȿ SBK?T2*?4?U5'? e>z88>d_=yD>2*j>S@e3>T>ܖ? ?΄^? }+ >i?g'L^?>W@?H:?>̻ҿhտ9?ǖ0eX?#?(1Qq=?)kd=- s? YO =s?*|\f'>r:W{iC?M?2T%<>>f? u3= iẊ>+W3vH@=h?Vܿ>b¿|?\?'Q?\?o*YKW>n9% @s,?&I>j? 2? |?CDQ2O?PNh5>񿿎ؾ->ä^?Ee ? uc?%Ȧ=M?Q˾` =𪌿L>&l?s.> < w=?D#en™">b;d2ʿ?=ýܔ?|?8 v-K ?>%4? x&>Q ?(> Ӟ6?bN׾ᅬd? 8Gpa% ?銊?p>̢>B>GF=?.H?Xz~?A?W!tW\boѿ+@X? Kfj>1m?R县WP^$ʿXgN>7L?{z>-H)O=1?s?զ?5>j\f=g@?d>l>ޙ$?--q f?<뜾˜=Z?2$==d >J>El?7!1$<?q?e?p>q&u?;7>>%콿TC2!ۈc?>i-Ib?=TJҿU>ヮ}v$q>߆?N?ZCT?,>ʬd]`?%D濸>ǽ9@5+W׾I~>,m@d?? ?]?>=2ڿ%A?Vj?8]?gUYB͟\45>=?r>k_>l>=b`?Q`>ן/W,閾8?c>GB?^>ޘ= >W>N<~uhD$x f>TT?vlj?^<>Wѐ科=q(?D; :[Fv>VJ̖7a~>p"L^? Z??\w,cl=><iB=Դ?62?=iP!̿XQ5^>=40˿>LȠ?\*>ش#A>ml?2;?c >?0?h?o о:Qı?访#?a~/c'?%Aҿ"b> ?;\>&V>2p?n[?&?־6>UD0?w>D>B >9?5~l>d>>f5|?C أd z׿k=\gj?6?? *?n ?f:;>w>k&?>4|vb?t]~D?SW2?;?Kr>5T袸O u>dQ>o῎þk}N>D=36{Pt<>9ڽr迟@\ ,u >ɺ:ɾ%!<ǾF> ?>3濒B>Q<0_H=5,W^>ܝʾ\ W>$'䞿p< X?#]2A?"j俁Z6?'?}G?c5:j~[}?'9dU:?v->u?>y?89?Sz@?2FTJ>9d?Y?J,?ܽhO!r-?;Z0hZda=8v=g>%>Ƞ?/QV>Ø>>h>rw㌿>>Ӡ6a}~?nV꾾I־F4>??r38N=&0{Y?@?)F= p?P>ݙ˽7^>?(\=?J)ؿbjƾ4Ŀ@.?$d/> b?nZ/L>?ҿ8 %%?T?Z=]#(ؾl&_D>/;80? x=5>??y=ݯ$>j H]>T ?FmC߉@?˾>U)=Z(>Ewð>C?Gƈ>x f;ՎPŻ E4;:@y Rl>>A<'`?'(޵"N5 #\6=Η$r6zG)6(?3|e>ch i= #p?*=u.?>Ei ? >Ul?5?g:>&L>dᝊPݿ*t[?L? d?=8?<-?,?k9&?](xtxQҿUj? ^d\ZCs>iP=+U޿m$:W(;38>ChZR>LѾ?J\a?"{?Z(d@C?҉Ŀ20%{\">as`4?2?T?+?-0?d?7ƽ͋ >C;&WĿ /r>־ԄԿ[M?Ikn>+_?=]?W۰\?gv?;.=l?>>Y?\?.d>U2pa{fa䡍ͣ?L?Nj?LX<[ M^?(8=RJ;>#1.(ٞ=$ֿ?fl h ڶ>&,A=z >)F??s'?`Bb&>@R<>B4B}Q?>#?e>5??3Uÿk?0> ?|*INn?A"]Add'sVZ>~T? ,S?7̾9dMb85V]>G{],?K?b3E &p?_?n<KA~B[n\BBbC$ BCBaB&3B<Bk&B!BA7P"BϾ%BVC1B#@(J·%B>gPi)`kZs ]a.AM¤/{(B@BB Ę"JRAH§:rI^c* `4Bӏ|aB^‚p0BUL~-XAB0BBf`<$>B`)N"ԠӈjAp§ǯ†B BC;BBqBv8d|A2_‚XAfBuB A%C-@FA:INCG(\j$BB&CqB3dB7B/@ BEALBGA|A]*aAM Ÿ{?N`0•+KA/_BBGCB5zAB|SQBMB54BWtBBLgɪBc&[@}@V(>`My.bBoA@ H|"{|,nnA|B+fB@ *AgBn*V' HA]Cm9ǞB@tAa<{^AH,15ɂAyBJ`B;u elp4t(Bٷ|C'BIC BtC%]@~[p[?gw3=¦Š © f_B l?@2J)B 6BzB.B#}tC%TSBTBD`B;rƒcBȰBC &R!Bi^#COdBLCpA$CxBC BBBBBqdCC >"BB^BOB$7C CB"gAIgBX BZBBYDBBJAB/B@4C*@BBxܠCFCKC&5CB@BjbpBBBRBAbBIBإ`Bvce\®Gºwh›E2BZGzKh$Bk3BC}B "3BHO]PeF B5BW4x£`tAIA0v|sK @vD[ªT#Bhr@AA:YBaqC!$"B_6BhBJW¦_B{-Ay8hB FA2upA ,lB*$C&YxrB$Ʀ|B@^Bm@9B@n²B/B7B BEACBrCcbC0dBѨA C%AB[CC C!oy/rB@[@f!B/A B~B}C XB@CCBD A*B狽ABZLBϾCB+DBh?BKB?A|CqA/DOnsrbDA_nkBAiwA2^[¾WšpIœBXpBP`BK3@InBTZYD6BɺBVCBBU*@ȣ9ONBLA:;w8GAL,7«wBRh>P"ݒG1$. o Iև"BYBl*+h|,B$7`j@(B >AcAŏnوB"Aޗe!BPrBB BkB#B C=LBgC]C);Q B@² [ BRaQ|uJB{ˆvϑBQBhyBEAYBcBaHˆ•B3BAB)B:BC 7TBB_ϫ@9@N@A)BHZB A>B$/BͅBiRBBB<ڶBBcCBCC$OCH>GaB07YwBBIBA@Bm3ZBDz(Z]B39C)P8\~B!@]ʀ?4B CJa(C'BlMTB7`ABC'eBp CvB-sBE̖BرB0|}›RbBXB_6AA~?!B B-.A3AY^B9 rBaeCU}C[rC~CPuy>aC _B΂CdC?B B˺BPBv BBr(B̈BBA2B$!BC AC8B?BSBǚBC LˆB:A(_ALuAd¬MB 8tB.A@>Bpc$*Ax&BYk?k›Sܢ~?ò B7 |BANc”UAB7ۗBB*K?pBDA K'B BweAlBԹ.}AUAo9M'//`AM@yV@'p0TAIAq/€Al^AeA©vK€ @8‘}A P°ŕXZ@ .ĺD:?-Z>+Y=8>LS˾ k>\w a>ɓ3M>BDq>jp8>WU.?,?"?7j?*c0b?K??M>/7=*crxB|&ѾD}((=>\b?W3>/;?|p? 5>a.t>bK?sѿb>O>?AH?8E?R?s_|X>FR?&KL?>%&>"?UB9Ü?~>\jq~>K>SExVՕM?}>ʘ>>V*x ?(c?Qþ??M$@xP<|< ?B?'?v> mt>|>O>qs?:Qd? >g>L!Aξh>X$>e!>?Vg????d?wR>6?%q?bʾ?GX">~ V>Ϛ<\?NcF >0,r">|8:?<6?''?-?!e?tMLUĻEmhph?|_J>+~?ӥm}mζ?[ <@YP;$P> ;M׿U ?Ϳ7?4>8?4f?uX? q,?w?#0??"^>^?B?'%^>ƽ#<<|p>g򃾎(r7T,?ka? >>ܿ ,>e/vKa>@ %a!XU{?ƿ ~a?@Be{?E?Z\@Q NR<IgO"G<}8>gՔ?D?~$=,?K~?dM=8eP`?n١jn /^RFB𿬷׾w="5d>g?j?7MD>5?xXQ0;π!J?\0@? ?e>>$5X?D辍>i$̿i6>J->JfX }51>x+N>d>vF?h?6?1>V6k<1>C3?ff#ؾ>?w">1 >J<?9>rL8?\B־2>}>L#Sտg>u=7?t>fv?Qx#>g???h>2j)ڜO־R>>G6@y">0~a? `$L>b= ?Y}>Ț<>y>ٽ?DDFk>K?SL@ ?a7u?|<=QT Z^jt%#տ-i /=5On>^?ʿU?E8>庾<?EM:-?F>N}>MX5=4?!fQ`?ĿO?~n?p? |>ӿx>Z>nY??KF>?<J=j$=ĿlʿJy=x?v?N??? ?2?;¿>ig￵x?Y<@G>D~C>w̿<&?x3<Å>???<` >n>n?=>cԾ? ؾ-?ё>=N.? 6>P?4?>l4:h$+[(5*m vG\X?Q\}L =]*=Ik>a?z?Zr4r?M?qB{ Ty>>T#߰>Gfd?D?@$##aMZ?>>X?c1?ŷ4悔>^?3̾O? >-">[+Y俇I%Z'M??>??=[?7;>=\>U0>ƾ,>Bf?#Кz?cAUFuཌ h?yѶ4t?/l>CiƂ?/m>ns'>!q>uM8 Q6҈Ѽ(I`{rG%o>uS>ͤ?H>2>.>C?3..> ??ѽl?i>#??X?쿽W?>{y<򉘿,s>%>K?sl1=_4?'=dP?LS?5GiD?d >"??>?$}R= = ̿8> R@M= |?-i>B>VV*?I? ""?s x>Nf[[>R &=*^휾x ?12ھPl=%t>(bG?q?K?TZ?j">B?Ϝ?(?ݑYo<:? ?^>#{?!=9!t=?T޾?) OX?VY霾{<&?,?!?g^d>y>ar?9پH?b>j]ξj?g:m<%`>aBhr?'?$(0 @>_Kd=.>z>ڮ>A218>]?+}/lGш?@?%um?RiL>3xܨ????6\Sl+>y.?~U?\?uݼOԕ?2>r?9z!>Cm ,>(V>x?fP?p>{տC+?L>X?G>?M?$c?T>~>R޿paa9ڿbdX'6>;?[N?̡}m>:9NE>$ҽ5!Ln>菉>B?//ҹ>w+=y:XA>:Sf̾$?W6?5d=%T?N{J>= f۱>o>ԯ=Y:=8oxLֽy>?D=+>p>w4?j,? e^94$.?q)V?˰ݿS(?N=?f?:.潷Pxi`{1?7>;e@,?H?㹻<꾾A?N0rVdP߽BF M.>:?3?V?-喿6]< ?D>/bPO>?fd7>N>|F?P?jMt>ӣvC(|ʾfVھk=q"?> XA>t:? >Cd>Lx\ba̾ >F=k?=;mR?L+>}<:;пA>Ni`?>X?D  =z`>d^>5 ?Pi0c8ε[bJ?ϝ@[ >?v&(=TF,GV?\>k@ >18D>զп/ū\D ȓJ >›>|>ZT6>Imw?xT?$,=0W|9<`=U?j>#?.>X>?bn̆ B??t?C$>?(z<#s]2x~!b:>ɔ:=\Dpf> ?%=?⬿?e۾{?,ѡ=[>I۠>3N/D5]:Nf<8>>ڿ~Ŀ\>};>q>9Z >`_>ג>`?ulGȿʼ@$>ZN%?}~on?"!;>Q>:eߐƻyπL<tȡ>t>1v??x>Wp?S?Z?,#?6?L?; ?߿_k|_W<\ĿD.9?ǿp+Kv?`x^?; =0?#L=ࣿ,9m?f>࿨c>iD&f?l>x=Z?]]??¸H#?vѾYtk"? ɃdѿE$>z_?I?/o>i ^C?4SG?sa\*1=R?࿧%;ܙ2M=Q?C>F?\3Bz?6<>u(>ԫ?w3x: =J9@ L?l?><?.>|Ծ ʾjFL>)i>+ԾO?>x?q"?>̻/?&~?cF?)꾾)Bd=3=N>sT࿢i?\?a' >= ?=>=-?>ݐ>*;0Ӏ=eܻ>Pܿ@$?p??*p?=$S@1?^㢁=f::΂> ?wd N侶l?cp[??CP>g>k> ?Zԉ>?"N)?,?Ƣ>th%?>t8?n? ?>zP*;ز?`@ć?pM?n<\H5=J?4?"S?a?lv?W-q^71]?%9?K?m?u*>KqR Ŀ?+Ҿ@>? t?#V?F?G☿q? < d=nX>?4l>پo?`?;>?b,7?>+OΑ >Q&R\??I?493#ݿ G>)loEv>^?> 俢?8=1S򓿍LQ?vy=ξq? =>G =?f~>F???4Pp>?5-H4h? ?>SῊ%.=[(B'> >n?uǾཿ>H?ByK?kG&_j?J ȿ?i^?B8?y ?{'徯.ƿ{ZIjB?Tt?Qg?>U@ra4>>hj?j?j?yPrڿTt\>Y ?b 8%[4=+=̖?L>Va^>?=f=PX >r> J=>"?^N;>vUSL?1?gg?H5?1Q?=o="RH1=2]J??8?>40X= [>o> ܼ_\?r>{>mo?4<]P?>o` >B?-P Ŀ??%(;>.?4t^?{>8?y9|>Õɿ=6B>3V^V?M?Ql?T;?+e>X-J%::[NO,ھe軿t!!׽?qČ?{??;]]>zY>¾iJѩ??i>Ϳ 6?3M?_WN.=Ӳ>gPZ?:qTZ>Ѫ?#wD?ƿ6?ſGE/?SGn}H>ݺ߈"m?yI=I>m.?^>OH>>nt>?]?z@?\?;Ř?+>Y*#@si>&X? q>?@`>\?]V? M,?@=)x^dt>s,6>q` \?h?ӌ?>>B>οxJ>/j?!RF*DOV=Bh>6>pMOD?f_RϿne?%?q=>%>@?L??>|f>?[ ?(a? >G7?*> ?Is?K?ҿ_nλ> qv?6T,???Y??kl?)Qн*>V"X ??Fhuid>&?$Q+wҿ Z613|f?Ok=n&`=@I?+I+?.?g5F>l\ڦ @6}>q@?B|>~Y½(?\޽#<=j;?W?D5]޽3#Tt1?^84r>>]\?59\?Dٌ?8ԿSWƀVa?GH?V'tG T?{>?I?+?>/O>d?L??b׾↿v(6hLzȣ,_>,9>S>aE?QO >˖l?z3(?FԾw¤;Yȿ3(|{Y|>n>͕?u->G ?Kx>= = Ŀ6 ??~?7??ڿg<0dW>)P>@?*<>䆾?YH:/>b>?M>>B=:mC55>T036>*B>4e3?>?y??Kd| S?E>&>$q>ÌPʵᴄ?* ?#>W6J/w>\ܿW=f9|nNN?KO>?Vf?_+>:5ǝ>O=u>AqJ=,оS˝?2XZm>̾}j>%~?k*͉߾&=lj />2?9n? ??0?Q!_z>4> oL//i&<>vid w[^&+ )=~п+?.F?30>2? >` ?V0f0TY>?XھvB?L^u>Ѿ^v*>?_>['>T쿝.( ?t>n> ?\㘾@?_(?a?]?(=?^I >]=?2p?>&9?l=0h2LPf TQ0O;@Z .?$r>{KS??R>F)=>`2=&ܿ>ʐ?$?9?άbpR?lbu> ?K":=Z@? K>]h?(:?L=D>圽FzHp2>>v>so >o3?B )`>Xr-p>QJ>7^> >ǚ?j9fl?R?PCfz>???#O޴?^? ޣi?>n(a??c>-W=:\c?9X ?j> >d=ML^(=>">">Ȗ>(=`?xD ?Y=o=@o|s\S? W? s>s8?~s>T>G=:>=(>[f=UXK=D??f"=@ݝZ=4(x?@>(1a>?>T2?50=r g&2>j"Ge<: ?ˬ?:MB:SBF*B+B=B]AlTBϋBA;NAB ,BBGBAeMs@΂ C ABԃB,AC2C2B1^BBC7IB[B&ABx zBCA BnB:PH*!B]ǐBAABB'BU@C^BBeB@Ba@GBʔ BkBHCh B7TBBWB;CkBHێB!xA0 C.CB߃ CCE92C]CJC*BEC0B2BeBB $BdChBB_4BjCBTB2C'ךC LCXBg'=-hC,CVCC$CE{BRB @X𿤺B@w` RAi@BB5Uˉ@PBNA[B7 NAM[BHuA*A'X$B,XBB^A4BrzEBMA:<B)ZBa)B1BNDhˆB{4AߍR`AwC2°dRXB5<Bh•, oW6A0…O —'AV*¤B"@B#CkA@rUf)PBYB}^B'4h81AZA1uB;hnp:f™r>¯ѮB|aBˆCb¤}?EJ§SºhBmBT|bAB`BhZBAZB9+¾N(¤A^7ŽœhApnB3B<BrC,vŘC B&B;w|BB=vBtC ,B|B4Bв}ՍNAuF;A.BdA=A'BfZB&B CUBI7]$•HBNAAc~BaNBA?@BB%A{A>WJ?BSVABCB|tB8C$=BnBBBBOnCZC)z]BrC,@BB B{BæcA+“BvPCQTB6WA&>CLhBB%^C0ɨAB!C%KBҵC,CHCK@pBK}BcoNB'V^ d@C^Bo82A^@"BBPAsk@RB\z.fB B〡BtMB0C;C* }B{@&fB;B^C NVCPC#4mBS 8ChDCC;Be,A:B5%C7nCYBB_tpC/CBKCBDFyBHCcbC"&dBt BqBA~BqUC^BCBNBCLABC)CC]_AɷTC3BTBC!4BB CBjC CbBlCCQC-BBAZe}B%BC BaB.ABLC0C0CKICz&C!oB٣BC$mC aCC$~C-C_tC ;CCr"CJICKC:fCqC C-\CC1QJCzGCU.CO:CiC^>EC5VsC(OC:CNBChB*CjB B-=B·ZB艸CxCQ"C*YB{ySY(@O~B+B9ABMŒG@9oc@r*XT:ݛB L(BnDE'¬*YUގmń6:z¯pt¢£ `A "Yy‰2lI!hصzAXAa fxnGHu>º51/MBz@B>v@M:PO¦ЯAS+CMBxDBzAB?BPRCO׋t>r?I>*{D?̗?Ț'B{B\a?ʾ*y|hf&>鲾#`ѐ?_+r? S ?"N1?V>]D>?D>*tnZ =>l?lc ?u;¾.ר*?e@5>9[B?$?}>2z>n>UƈZ>u >Fj?$(? &Q_>ſFƿٳ<@>?Oi2>>B>}>; ?<D??Hҿ iz>?3``N֤>2?qW2P3ac?qD?/\S?+W{q<b&?Vnk9A>ԚF3唿U*?f1Կ*=u>wC ?.#9?:S?S=D?"+}=iȿmE⾅A>=>p*=8 F30J5p$ >?fX dTip"E)>>VxbP?t (6o@# >Y¾2d(?9?'W?Qw>(>4>䥬>EׯZ(D2ջ@>>#?@ ?sv?T=`?rjSF UVE=l?cCk>$>[|b=6?4>"&TҰPl>?w?6=sMCIe(?a&ѿ=څ?hpBM=>龖?R=,>Dh??Ŀ\$L>_<(>+j>]$$?]4?]'>!ֿilпF:@0n$>>M =]>m- j<>P??te;p4ĵL>2 >Fp;m%hV>z>>Z=6t@? b?n>r?+r>Z>{L>"N|?PܿƖn7gȿ`P>zR< 0@Z}[Hjx=: h̽0oBNi??=Q>n3\m?Q>8>> f? ?.=#`5>s=>IlJ?I?\>e2? 4NטmL ̾JJ|b> >j<>\= B>4W*xz) ~>ܯ}Vl.>"%X@=^2>>]?8>C>2$y#>\?XT=vX=1̿diN?6?@[V9@3#l%OH>(7>{?“GJ>7~ ?i~\/>E?Y>h(?tn'X?ƿ#X9?`?s]>%a>V>چ`???7uS<>2R6Zhܿ|<&yx!<aP?˽G(;"|LXBIъ=f=Jtiܾ@6?3a>f>JcR>?e ;<ʾw?c?ZX-N=w)迃~?' <9&>z>5w>?&?6˜?p>V[ЊYQ>Hm⌿ھe ?=9X>>.?C> (>8>=Ci?H6s/^?>FL?`DJx?3l>Fcd*t>[T)ҿqC5?/hz ['?j?<tKKk:>\7y=uH$?37>Ո>:O?+>>Y]?{BU>>֨-E(P$?u?\>>> pXь>W?b=.zpP~<ȿ4cB7 D7ÊҿM˜?7 >S>?6?Z?OXA l(8|fҾοD,>M>!v>ce)=Kln>}V{p=`>K(&P0??B? >pR/JP>A: /|J?#>K"@VE?G?Ł\o>qǾoR>Jj>]1 ?:?1O<ٲsq7w ?*= ?%>/-=`U(?Q?䲾xYȽX{k?L/+3?,|P>dsnd%sԤz>>Ү9pY/=WTtɊ>>9ؿ+dq?긾>>T; ;}@?Ix?L 䪽,d=\L=y=۠\l?m>\Y>+Xո>S-cyT-C>gh̿8>>.7Ɩ?K>'0>#>vh :>U?N\0? XXZ>?|C.>ʿS0¿"S?&" {86kz>`F4u?+$4 ?4sĿ7V> >CO>!>?#)>m_="AzԿ`uo<M?Ub?2#= @=>Z>>wj,=s ȿ 1\f>g>_?q?GZ?sS|ro0>0L`"¿3'C?>Y=1Y?A؇s<<׮a=>Ŀ?jc>Gu^=>Dz:>%qS=~(>-?Z>񻀿W?a>?JVJ?qG^?Y>oHbs3ub?g6=y='%=Il?f> o&'%

0>n=x?C<>mJ>ټVd?LJB侷g~t~]OvwX> gV?ӿGs-=>3?f8?G͵>rw?o Ϳs:ϢB+,>_>༿ު?<>cTL4?sۿX_W>@?+(FD?d??>쭀>H>>>Z ;8耿U_E?(R<=|Iü%bmtϿ?n}O?ug`ſKDĉ>Ii>:h<+W>}""?Nc<&3x>*˻G_;l`?eミ6?_e=.>4>"QjZMe?D2F=̄?Ĺi?5TVk8?&?@/g]K+= >>E?>$?%_>z?x#?Y=Me>4UN3龽 z6>zϾh:8=-[Q& d?,=.m齒0 >K*)"Z۴=K;X[ASx ?;) > _= a()L0X>x¾ >|@>`>s>Qc{?bH?'h0? ?M?*8>%4bBiPKa`??JFy۫4^ɿ%?긾L? 1 > R4>  A8?\.?P<?=C<@ Vrf~)lT>r?*>>IF?Z=L6<@?";п >zik>?\AZB>2=H`>؎V?-n?>U?B?I>h`?Chަr)b4?k>GD>mǾO;>? >i>'?ZpdHy?>+>6>Ű<\07?\?_+,i>L8?,,3?-?e>b?s1?8N?A8p Wt#?>I>Aq?P?Eyh?!EV=)[!qh>@>@ù>Э]?/_b+RwQ>>~>q&?xvS=0񘾾<]?`BQѾABĞ+u>s,f=B>rAT?TD ś=o8 ?*F?0XѾ4?B h>EL>L>ʥ>+8v?'N?6G=5(?B\V>^>w v=?4UzVP <>l?[T>Ѣp>q?i4|?T>5ɂ ?˿ot?V%>G??K?s;$?F-%5?#> R?ga>ZZ}~k90?80<>T4Aw=a4:@I?5d>b+?kn?B?=5>H>99S1>y(/D><>+>e?i?β?pS8b?H ?*?[?*ifyw?D*b>{zmm,87l?vO>5> T>nPa?ܝ>Id?**?Z=Xs?zþSԽ`>>tGNYq am.?!u>'?7*8рƽs?UΈ>#?V?`kݿe"a?&>~>=&9Ƭ?F/> rn?oj?%xڦ4{/?1$>v[> w>d?7= l=7?Hj_?=?iX>|>?U뿦;,\`>u"?~8>Ư? (ƿ")V ̿"?Lln>nZ>/~iaS< l?K>E?#>ِ?IJ\H .?7?q?(.>0E N?e?&'?8|M >že>?8nyZվ(>+ ki>Q#4>[Eݨt]6<#>|ܾZ>?r>:? b???2>N[Xͮo~ ;0>Y~??-Y?Nu?P =Ydh ?!fp+{5?aFX6?b}RX3sǔ OzI=|ɀR>]=1>X9WVp+?R_טB=C:?<,?W?.?+aV? R>·$q>Xp4:A(Yt?n'?@?ae?UV>\u>ο]HH?A\U]?-?<>/=? ?(;fp=n?` w>>齵d> ?[ؽY>i?A0?hR>+t7߾ 7ZJ>y$?Q>3=z=O2;>֠? > ?>V牾ѣҾ$EF?>=>QR&*j4>+=omGފ>?N>>t$=y_x?G<>f.Y+pK^ ?Fwen?]:>.?=)o=оh#b>08?( pl:?9=64?? `">'*ϽF|YBrᴾ>d|Kfӽ!>Xf>ŲI?[SϽ?=>?iP>T>N?j?H!D5F?.¾hɈ=`Gu$仿C)쀿G>RL{g;c+I?Y[EZ?`?E?Q ?lHb>v?W ?>r->?WϞ[\QIX~?I{m?8=>4?Zw/=?=۠K?54?c?=T(W?օR`?==v;ǿ K.Q1$>Т>BO?#hпu,q>!X>>h `>یF?4tܾk!I)>q{U=N?Թ? 55A\A.f?Gl>C?>v B>5>ĕ ?h?0~v2>4?:)4I<t>?Z71e ?E?i-f?2k?{P? >۽A?j~?Ѯj?<|pH>x>>ۘi[ ޓ+ ?7Y>q>>]>^>p:1>'_qc)d s?Ϝ?򽅠`F?9?R-?7f?n>? K> k?=`?MO]N#?2W>qE@??}>J齔J|\"hK ?o,>C?>S>h?[SCb2Ծ+9Q0- _ER?uʿ+?[?4,kPSÿ/sdԾ(q"~A>y}ɾTLp>OdNo=t>S=J佛S?Ze=o\FԾ^3~d>CbaBr>ڨ;9H?3">2V>==XFDWE{7N>ȷ ?Fj"8þ|?I!0?Kζ#?4/̾)zءw|{a?rWl>?2- ?_e?D@ܘ+W>0?/>p͚> >Be`]?7lL>`_qq-f>辘ֻ?;=4Я>\>l*m̿? !a>[$?D?NՐ?@?W?f2nG>>&> >@>ta>]>1>>(; XUT?nP>??;5 ?tXw>~̧ؾ t# X-c8>݋?|- %>&=+2CLO*>Ⱦ]ʾ!YE=>fGH>ǧ?jrf>vum<t?Nbx>ѿV<ƲBľ:k"K>"G Z>L>l?j{>`?}}|‚. 2Ņ¥›&k,¹eo|v h/]Iº=ML A v:E¼SBgBzAiAKlB@4'X3HAsBpAFAB4:@}+ ]A٫9_O {}T?xœ` BpgT}•BKX ܹ!dl¬8…‡(žL0BBe!Azqk#A'] n"\¡17™Zp%W*AIMhAA|99[^ B@'¤B Br³Xf0]'U­vӞÇ&_E4n®º @<8ƒ;"½Wm 2Ӿ6Ԥ³gA;@6ӈ?B7aZAB^H~gmAL@B;BRB65<17A|ºZb.ŒA·7]sE›ɾBU|1,̊& AwAd-Q³4ÄL”^B [=¤phaZ0 AĊ§’FA)Šc翯lqW8A@BAe@A7#AsJŠ{"B%CC44DBQAqbBPB &BTԚ5¶pOB2:zAwBAB0B$W( AxAMHAp`|w~&W{r92Ox¬´Mt¯% sܧC@?`P' Ad2A\pb"$‹)6&Aa}£ Yf¢‰zB dDBo[Bo A̛(NTRA+Ay_B;µB" A"nA'BvB7B%XeCrB`A (R’JB0qvg¾sM¹VzTdRfy~B}UBLpIA(DBGq …7uZMV* ) b-B(qAn'|@Yt@A;?.=ѐ=‰jNBt:H0%K…&Vo)!BGѯB9zB ZAuLAW>BbޛrCAXRdC[1»WtoMɫZ;A$BqFA,MBOBNAv ۖBpA HF/ wd^C—> >(E!qʟ0D/M Xj܀ C#cAC@A繑œ@rARZg޹g7GQr]p|AFº3M2p—wBDmw,A A?0]k A)A¤ nHg°#__wd7#uµ?A!8)2s Ar~BCSBiAO‹¨jXCBjAl±6Z” 3AaAnEv4Gk|sBHA?n@)HΞY5z1B3B64C5CBDٗAExSBrA/BB˄@:@BA)B=BnKuA+BZ BߊBBDCd#B3VC4BӪBɠCB7(BS?T?BHBb @H@?x3B2JBiHB]pBB|d}ChB=A&BNCB,B!CB"B} &4CHSB?*C[A_^BLB;BGxBU0lQBVt>|rB+:9AAiA'3g!/B dA`dB &>BB=(qBBBĈrAOB ? ?B?BfB\!;L"|AN,B$zAhBeC;AB8Bq`BZB= BWB̪B6mBߣB>ByiA+%B:N]@9C&BBB'6"B7˘AE+AOYBg;B/BJb?ҝB^CFZBbC+CP> K AguAC~nC.{*C A9CUdBeAl~BլAŢBDC$~BilCZB/rCBىB{BUB8;BuB d0A;V>A?BVBkWB jB.`¥ƺJA2BMx|s*AK@}MAM |'ł'@Ob D GBزB&B BYƒ®B׳C_BC !BgnBC 48BMBlBӞBowFC]C? Cq9COmC]:BACr@0AW B3?Bw:C(haBLdBlB\dBB B B:ZBBDBفC HBAO B_BMkBTBC ZaCBBK:B C1BwB6BBZCB:BOAגBSBãKCBBՆXDBwCBg– xBHz{[eGs^@HEEA叿UIkA0‡W5 k*@[’UŽu4B¼CSBFtBPA+1ByBBB*> BKBŒBeA3@|AMQ>RA{ Aµqmx?@ @i@jE(Uw:BzIdAkAss? >>m>?:ᶽ#H=g?hu<=t0Xg?>37>Ŝ???3}_Wֿvн6?Mܷ>@sN=jß>Z >=@> A9=Vv>G>7tp]oh9?C&W?v~?H5>6?x\>j|?"q+ _>Mο!r?0=`>hn> ɿ  F {Hd?ۤ>_B>t?L'?ig?!JV?P4a=S?@i>v*u=?*>^?P>v3Oֿ':>(N>AF?$6?vʅ>ĿN>^?'F(@(cm; @>?{l>ܪ?,>W2?)?_=Gx=b_>:dɜ>k?B m8>A`^>To(= >璾Ɂ?-?4r=6?.V=;@??Q kT>D9\?Cz?q--&?./3>;N;4?a>6?D렿4 >>:?V`q>ZǮH>0%F?w=`?> ??7ӿ MĘ >XݻL-QW?>ځ־S>=<пG?0оp;Mp?%`Ⱦp?S]>tdx<[= %?'j?} ?-;0>.>K?nʿ>7=>(!?lF\ZUO=(h>x>hH>]>1(M?R+?f:ЅW? u?!Ŀ Y> ̾ݠ??:k翝5>uz?4(?6ɔ?hL??0`8?-0?*?/?6NEB>B ⾖@Lq%Ҿ>]k=5JXX?.>V"?O->nҽ+w?_n?f3=|h|=(;49K?:;F>?U?ju]?23?)_i?.GX5ҿ}IPEX?,L\fhKDE6>O'_QKV?8=D??J>!:Ƚ~>! Ŀ%"H>p?g>+j=??H>,̾n?EKa~=?@(?瘿 Kz(Qt/@>p? U~ϼѦ? \?'&=<>'\8N F<+=$>W$ȭU?HU>>>/?H+-_0_4D> ?K?%Z0=E(?,R ?&|?8ľ ޾d>|T?fvH瘾N?;_?>Uakv>e1?p?M¿\[YHR~? 8><  ti?Zn\O8?ː?[e=Z?.K罾T? G%A&>bʉ=F>9ըz?tuz\?=~DE팿4?>u޷XV0 =8ȼ1??)҆=,f?hV?fY|N?d@?Ej?x?(aּ?==>I?w=+̾?5ʾ *|>.=˚ĴFh]4>!@=c? ?.М}> ?Bf@ ; #?(?XD4?[XFs?AxH>P=? bA𖾨>@?7\7TJ>j>QϘ>\>?'>Xq2> _: ?Y>g^C$>F]VH>c?m@>>?>K>H5Y}!;A>垿YVX>)?> m>E?Rv=~$Ϟ<+@?AW>L`?KN?R9;l`rN>v>;`?9b?8\?5k >eR?*z?ir?C?L?$f>A>ҿyQU> ?_>zu w>m0'V>!l ?=>?(տ^?Q̿B7c?dL6~>p2(O=Ⱦ ?i =VB8nz?F$=+>Ԋ?f0B>.?. >!?@.#>yb6l?c>+I> ?\0>T.>??@xP,m{=?r5>|a>⤿ پ>ֿFyÿHV?n>S?$@>T?C?q>>e?m>񽽊>,=R}h?ο-Sjd??!>&^?oBt>Aɝt??tS>GhD?Ğ=k?$>ξ#?#/?$@?Wy =ޠ>b ?.>B?XN?a?L\K>ݺѣ?~<ʠ?z?C$>]< ?{ʿBV>& (y?e|Z>oi6>Ӟ?>D>?8?=>mR>;;I?_M1. Dؼ|F@Fl?Q?_#?:P?rw{ ]4k[?d9?ɕ<>ٛ>R@@>¼{>gL?Xuտ Gc?bv? ߿scZ0>M?=!N=!>h> > ?6Nj?u2?Ǻ5=:=!=PiݿGy1E2>}I4Fm>?[" u a,6㵇 ?<>(w\cU`? ]ٿ~?/Jt?$l?~>v!??PW㿌 ?ֶ?>Cq=bj?/?XS rrC"y%>É?5?#?׮?n>~?x=1D6w>&N={>???{ >΂hi>>u)Ƚ>?E >8#(>N>+9?N>?O?!;^~?)=?lф>L>ČF? >X0^N?+&?M181#"-?H>:>:KR3RPg?I->?>`? C?s⾵Wq ?ctE>UE?8h<_h>/Pp>E>䑾(ˆ>4=dI?1>eۉd㾿i&(>&=Jt~=mG䎾ЌG=ȿ(O]D<>i<$?\>?<p>v>hھcۛ2En_R?Է>׆>@Z>?,?x ?vx?`?B3;-K>~<Ԡ'7M@ ;7>Y@>/D P ?S!}ȿ?z?73>FȿAs>8>阸>x ?iNA?=>uϔG?1̾7?*C>`tt?mch>_,?A?Ղ>?b>aR@&lf=2d> '<Hh?=n>?! ?R>Y>˓=+ǹF%>)r>6J?f?x>)>ᬾn>B@> J)?o?MTj>ҽl>fv?*Q?d?q(?R*?hԣ?2۾h=-d>;>+ >T?m$.=I4ZaD="{^ﲾ4?ێ;F?^#47?p>޺b?>0ጾ? Ox>3 >R7mfh?Fūl?j¾>>DST?':><xV$ ">M?al9_L2 >֫?/W &6}(W|*>>l O‾OD?k!>|?o;(` >.S=|>%@XCVо|u?$1x@[CA_.ؾίVt>>v^>5L*@̼?ޮҾ@E<: >V?!?>1>fd<>?2??u&=ļ=?Nq_#R_f ?2?_>D信Ig7A?>ߝپܿB_҅?)%> qkrNB>e>WL >Za<}B n>S?D?@g,n?5x>=P? ME%E?)ho8H"?ľiD?Q?OξFD~?覆朾4CFN丿 ~2?:? 4!~)6?^t?8½ڥfº'mb;47>m;*=?Qo>c?Y>,";/=n?*𾁹> 63lO>FFx?$]࿆h?u DŽU>AVyǍV$??=&2jO?}¿,L;=4?JX*? >os=|4>ER/>p wwv>m>E ;?:j <"迂OW>:?*E_?> 6p,i?뾜tb>ulF>'Rd>u[=xN?e>sܻK/?p,1V>?Vn>?N? ҿr?l!Kͺ?M?*J?,>Mb?p.*> ?F/e?AνԄ/?x>gY? >zY? ZxP>࿲@>Rj9V>\?~1߾<,>??G$>h? ? o >/<X%4e;?B˾NZ>Q?x[]飗?¿A.?*Ua>?C?XX?|e>;289?Jpp=]>@!>l?sA>0(>4B?>]?jȿ@k0?\>??[?:$? ?Em>?&DB%;?m=R޿^޿Wt $ i%~ ?n??-:dts? ?_?tj ??a>Q~SϖcY{ӿ2~mS>DS'? D4?t??>3 >d>͚Q;[TxV߿78w%N>_V==x?eHt4cK=ideEr>8?17?ղl@Ӣ>pZ?<˄?Rz?WD?N[A?#H?M?M,pJBgzB??-޲?k>?EQj? >:C >l? G?V>J>t3?yտ h>Ŗ>3->>@>h>19{Jcʰ>WX@ic0Q_>~``?;>D?"-X_ݤ>#g>&#%=l?JоCv9= [[I?1?:f俎Q=>s>/>EcXTп>?^6Nl>/Xtv=w]u?=㛿=l>ɮ#*ǀ?Q>4>Ŀg=CMDZl>t4^4?\ =/>'i~>T1>ˬR??p:?!Wؾ$shzٚ=?HF? ڿ>fZ?? ^ m?o=?>9n>k|ݿwt".̿xa)D ?%f,?I.`>?j>eM>/]jq>^?A=-P?茶ɯԿoJ  >Fx6>; l?#>9$>'Dо!Z>X{_yDTőyV>)L?"?=C?7|ij>P\b=?"8ݿbZjѿ˾BA?j=ڨS#^?1Ͽ<4 ?Z?N,>F?+>wpq?/|?q>NxdҿѿǢ>Q>Ŀ<@Y ?J=ۿNR~?8<.?U,==Կ?y= ¾C >wܿfo~o?ܙ?7 i)e?^>?x? 0C?d&>A0砿R=&2&?w?>B 1>L>g~F>{>Rz= :=!Lc`=k=EV >9$$y?->'\UW`?? K=X?O{>$ ".>=P\ SܽnZ?~>"!??Ŵ=;F?r>>`?"]>@?>>]0>{7~>G? cd?9|ſ\ j= žn>#Mh?7d>QrZI> > >Vz1>*gv?BPDR/? Pc?#h?Ĝ>^?o?ܾ,i?wؼPi>6> fۘ™п6[|bk?4kb>y>6>9-о=JG̿4ؾ7> :?X^r?l>a(>kt?;b=>+=h?'?P=?ʬ?BϹ?$(BAI8 j}U!G?L>>.=S >4O> VPMTUI?`0оR|?@&=_c>Ox>C&cp!?u=a>=ǾܾG?Dž?4?ܻ?3/?+]?-Yk?N?zl"O>X=_4ܾt~?9?X?>?ҕj8?zsi>:Sa=ؽHп޿,?z"?V>YI?\Hk-?jf+?<=?&r:ت?.?>m=zVۿ4:п+f>_a[f>%?~w=檿OX;򿆉{?M]=P8> ?%踾DHM??w??+\;M?[?Mo>?Ldhۿ~NP>:^? ؾ?x>/>VK?WB?_+kvO<),?'>S ξ>AD>wTཋ h ?_ȿ^>?UZ+>ZY@jf.?4 :տc>B??h>? N0?km?>/1̿Lt>^>>P>Wζ>~xR?D?N!?-@?aW>h>ԥ> y §|P$M\ºKx–“A\ ¦tk!&?-T¹\P(YyP’šQ‹ \AAa†,]=)_9+2r¸`KQB/Jz.j?\AI>B)AT vx'ђ¶;[/{ª9m€t@DŽJ#1 VE¦OnCa¡UAcB,֍AgA)(9AHV>˨p…!ANBBCW­A͋AQT@k^Cw/L~ALBcAKmA݁ 1@"sOy§&D U @_d@H '“_K*O@, <™WBsuAiAriWŠ4o)ք³9֛PAI[w°nt*H_B3g¦B @A{|A!@jB]%(9^5?Jr@lNo&S¯ APCB,gLB|œsBmMk_A+I¹7E K[AA#_@BD1B B B"㟿.,@BzBJB@کB/RvB2cAz[BH>@0*pB@ ԰"(Q-IgjzB9,vA,h"+ANjAA0,@8BL:Bo2g?* AarBBq\C 7BPBF.BL)BAn!B"„|xAv£An}A+HB[#B $@AQ²H4AN+AjBQMB,pAs8>׾B/` ¥+° pPfEKd!v? aSIAVBf2¬Q:^=eBɭžB9DiAzhB/B`b2B+AA^BlABD?E~ B} BE7+[.BtB=یB4—@&@EVA~<:B–,-4b×CB TBh9@cd~aA¹­AB]1@N@4´BC@LrBm! AcTmIFBB`?B/; BH7BB7A@ Bm|BBƩBlWB2m+BoNyCBMBu@*B eJ‚MBC B#AtBûswSA#AkfBt)B#tBBU5BTCvPBBaB9xBGC;JC/ZJB,+BBiB†BJvBB.BkRAKtBABepBX3BBl=Bg.BBBB@|B B#BӴ@HA`DB;1BivX;5lAE+~B܊BsA3]BIJ@BTCC:WBBlB@qDAqBg@1A C0ŮBhBBPBBAc:aA!BPAXB@Ѳ@ŏ`B.r.1`C#~B?A!B9n5?0‰QDAoC}BhWB\%AvSjAӝR­p~jBBBoAB!A{ BAB6?†BPeAxCf 7(³d'nAw_nB{VpB$mVBdX/TSÒ:@?@ @r0B;^BW%B~yO:B"3JB\ A-^C*CBSB-GA=AC2$fEBNBBMxB&B A.˥pfAKBj€B!#PX5I”H"ū^)A/*B=B\@iBE`}+B0B~qP|BbABB}QABJg…\AO.X `BvALCBnXtABeAB BQr@(ARBs6A $B^‡>Ba6Z@AjBdB6bBp+Bgv>PA62f#0|BHA¦u_V:%.Q~AArf³1BKA1A)@B9A\Av0AkqBACܶ*Y‡w:e@jX9@-A%Bz?%vB|r '^d}BQB4VB%‰g (vA6矚™ȱ3CB?DBBrfB&\\FAȗ@>PGk NAB92_AڻBȯ-Bk ABB‰zBۺeiˆºJBGX@BB@sDBB8P\BAcHaA//Iz׊AU@ٵd^kD3BwrB!SBL?B(>W?w?-d8:?=C^3i/}?˘>- &?&=dx]_.?B_>p>Di=пB$??vߎ),=}l=S>?>=R>>>8?s ?h?P>߹Xm, 7)>ś3T>6>x??^ȿh?DZ?>sL:0?5q?֒=iп "%F>¾ë??:]߃'w=??B4ýJ:?&?f>ˆJ?E ?P8>ڧDg>8˯"uD?3>8@f?MSf>6??Ou>d>dH?)*1?6>!|`?c?Z,05B>s?x;?=4?>u> %*t?X@`E 1ؿ?3r>)߿2W5E>}?`j? w?_#DIN㾻]> >j$.~6;Sr>WA :"=\`L?\@?.?5:e&`>-n$=g<ѼȈ?YĿ`2? 7??C@?&\W>+־YO>ǎ)r; JJS?^?h)n;ͻ?maj>=?C0?j='=RI@@C6? +>ͭ<KU?%?k2>ڋbf`7=6(ɿWτƼ@,* //]!=>w=X?~p=40? >n>T-"^>H?C=OQ`H?1>{R?e! ?#>c>s(=c>Y>$ >@g?L>ߏ. !i B5~?]C?L?1?=l?X"??XUr_7ǢU?(ܽ$?>Z6->GĘ?e=z>p־Iz?bڿdvX?̓??>M%J? ?MMzW6>Qh:ۘv/E=J?Ma?z?#T罅Q8??U? z+V?gG>L?b>\y>U?:?=Wx/=5?TS>>' JywB1[$&>?2F\?T"">`3d%^‚?mz6WKڼ7oMh ?%t?)D>Aľ K ξ > x$4?>}L??5tD k!ʽ$[8=Mp<???"0@?-)J>?g%FP>1bh'g }>uFDx>уZδl^>=>i>H?>ݲ?ռ; ?վӿ ϱ0>?2 FE?63iI=&7ILwV=DR{O| >M=iEɟӿL+=? >#8??^>2:# >~>>>L>4@⽳>9?cve@?BJ?S>Ū?W!ߞ? }N=`T־F2>N?? =hp-? >U!=?-οv?_v1;rw>r>=?,<\:4`?Iw0vn9>j7X>\hO?\Ysdq04 ?;~鎇>4:S(?ҝ?2,?>s? Y>(:rl?=*氽^ ?Z,?}..=R>C?}|E僾0D0ɿB?3Y󗕾 >T=^5>#?ԽXl̿t>?c=V;? $>栳 =>΄>|>%?c?f?^>i?={st>8?|ƾ\D>`?I?)I%W*>-˩fBDJ@dgVi>N? ?U?3=L<M>?>o?$=W4鋿>S?@w? (O%iXfϿk7>g>HBu>|?>e,>q>,ÿE>8>o!>U:mp?6>'q? \?${𿫦=;X?$?ޛ3*K? 꿀⿍4| sB?7>\>0z=>\4?S>$?/?HĿ70<9Cp?p˾޼нء? }=׮=Ũ?U=G:p=>Д e=3?bpt>x?i?1>O> >x+Z?i>q ?g>?kv?F>?0D;04\>\:o[h.ľru Zt?X?Fė>ҿ[x>>]7>o?=]۾O0>$??HsbD?4m; s>QǨĿP[>@A;kX>J>b^"1?@j>$??RN=yU>V(Jt оk=_ܿG2?T?)`Q>]D>1;>I2Fֿ(a? D?o>??A{L>?&?&*v!>\?x<8>[?j  >.=yG?T=>\y>?>Y>AG6?\>p >;(?M=\>)>l~>X#>[ڔ ,b>MMٰ[r??o?Tyؽ<п?6>m|r:⾀Mw2 >y^?+>7| 4>Rî>>Zt>p>"FHjQ??+:?9;Q*u?b> )ST>Jױ>?¾8l>?hY>.u=}0=đؾ >TD=8/I?i?6?B?#"rj ?sw;;=7?z vJA?`U?-?x(Q>98?¾b>?%=>>?Aƿ5ar'<=?a>l=?r?kPYԨ>>>ζ> ξG2>/?->i?*1~LXm>?u=9?=>͵Ծ ?$?$x>ZH9'L? t>z#>c}Ǐ8??A3Ս@K%?Qf?Y29>Vȭ[b܀c?`LE?JhFYㅽ{?Bw?DH ?UvР?"j=]:3oJ>b?*NX?>|O=ƾw?!N=Ηs>^>%4>_[A;J>Cq'}P/? {>X?#n?7|>%3??8ﺂ?>Ҵ?s6; Oth??#f>lX$gF>8m>?qZ/qP^>ݚ3HX=?={j?N-P??v5e? H F?>Ƨ"숨7@?5A?&?"2=t?=Gp>Em?q~>/?>q|?é>h=4?\׽0[@+x}ȿE>$ P?+p= 'f0>ԾA?il<$>}zh?YB?F\-?dj>!>L@=v>>վ|t?h,I?N>r8_o>t>h?Jk?68??u >_h>?GB}?_ETYr5BCNE)n;?w>F>F?6<>&y?=څ8>!MV>>B8=*L?(>ξ_J?)[(;!C??P`ʿ l<8?5nČ=-?T*>콢?BN`? 0\?BV??(T<?}>DO?ྸݗ?= =H?aνc8?O?/,1") @>54>u#??3>Z<`>ű>T\S0 >=x.?W1Q>?pj?p>Kwidt?(D>Rd?.ʘ"Y??#c?XDۿ蓾>=|8?#?+>P?p@eZEb;?Z ?pH0>>_JL޾A/h=ӳ>Z0/?=`>SCAvx1򽅘? lj7>zCTٶU6E~<=8?*RM?>#Mk>2Q>qJ>p¾ƿ+?_N=ɷ ?Fƿ_>}(ؿm?=7I?,IԿ>|?ttP?h?+'!>$?M2*%D8;?>m֍ׄdf`?⾰Q=4p +`k>[>݊ml?lb\3>? ?%I?<?dTT?T>=B?7?)_>7aQs\z>~>j?Zh=p~>>#?ZKT?/{>&?=>%\ȿA?R꾄M.?s˔gg?0v>xV<40?ID*/>1N?%m A?Hm>t8>Nw?=4>`??k->>'8%?Pxry?e=?o*[?&|>+2?"]?QW>ygJ] $?"?p??& ?kv>nVu%?vna(=}V?I;.8* ?*?y.> ĽcP0feP>cbkD~p? =aL뒿'¿s;QQ=Wa5>=ѩL8m=Ţ$>`?LX?O?0*"`?nq?s ?>?>jb?2uh9?$A?'f?h)),>?\?9>J?f?MICl=3_>?&w>D?s4(>R7=0{Pv>>_<]K>f=" ?E?h̿Wп\ўi>7??$z@? -> c&j<ʾ%F^? d=9bt>l r`>9{޻(^i(=#>.B;%?/a?h2?$Ծ?|M?cw>m>A"6$ڦB>ҋH?*">z=ͬڿ L>>4>+=x|=Ä>`þg>- 0? v?/؇?{c ?\iXH@?>?߾?pY>76r?~?aH>?EtU>DZh~? 4򾊢3?D&0??b>!?lhr@?,ϽY?]L>'?*>ҒʿkNl<A>gܯ?<˝?K} >sz+JQ2=d|?;09z?<">>5p>O>s>o~?f?z?,K4y=aq?>>=??1=r$> <3?B> ?!΃?/j?>)h>AS=gv?>l? :?Q+">i>F!GRk04??Z>Ym>>??49>H8꿽QP?[3q>?5?>??8hV)0%"~"?%>jT^?P=$?iH^*+?#?+Q>ɑR>J?'y??Fxd=,V5?F߸>,Ƽ?.J?M5<~7ˀ7>X?sk.>>*Œ/#2/?k1F'^0>^ľSS?$%೾\?a_>W?>">?Ꚙ=t!>?T? S>xp @{DN%Z?K}>?it? ?L^*>#=y=?|b=uv?>z>?=D?j=?n=?X;p??%,><RT^h=h>$d?4pҽvؾ? ˦>>o)>ҿT$W={X?S#6>?+?>=^,>Ʈ>98?zZBx?п->`>~=Ѹv1?{u?>$TUڃ# H=s9!½;l ?k>>z??q?=L>$?>Y ,og>4e? 0h.?L)?*8 >>>? kG#:Rc>G ,>KD?ulq=8l:H?b ^ ?X@ *?"J>?>8?*Ͼ_x=>W>%{u&c'>l|$=s:p;ڎ>Xy>mM,^0?DG~J?Ꮍ?D\bx_?>׌k>DUאֿ6h?#=T=|'?,>Uۊ?>뒿>^=?Zϱmt=3a&>;:?x?(ž:>=l= >Ev>?4i>9>?1X>]Q4#JH@?5cNwǾxڢwVi^?r?0? 6m>D?!?*$Ug>־bF>K欿R?Izq?ީ>?4?u }\?v`?2?`?Q>#?\H >?5 b=Khܽ'-Ŗ >@G>L)>~B?{c?re\<@=?kz4?6?f_dCD>?($ǽO(?=a\T>7>uQ=R>?A]0;ҽz\>N=T?}J?m1?QEd>M?/!?i>@_L?kkD>]zWO>%F2@ڔ?6Y$?N<.>*O>z?fw86BKCA%BBA1UB4›'8[-Aָ;AE{0ir¥pAFAOB0"DBA$4%^B*iqBBЫBB7.aAv T`?2yB@eA۲Bb3G’Xp!R4`BPAWAOB9QLBEBvfA,˜>Aʌx@ݯBXo@DB:BL;B(ŸiB_Pg@JEB0.PrSz*‰3¤-ӣ^O0lrEq)@a*AmDSΨ*c8vtX%:z{l eQs>x\An¬FHC|*_BdB!Y)A@BcbA`B 1BBpjv@л;|™wt@\BZ_ABrA͐5B;D,C ՊBg-AϿB\v@DB0A B>pBF8{MAڕ ABA7AEBp~BB/IChB26oڠA".BC'@ΏB'+D BBCRBBYB+B=]CiNB_BBȳ@]8waB(s‹fhU}A2N7BNiAM1'M8V$A(2wAqPtB[BA?B~+B@K(Aw )VA6ߐA{G6¸"¾‚ʈ…RH!>? ĵu?µh1q$NAbucA {@Ctp*"$8(r{¼Bt @—mr{=u_5< &9:C·FSBBrݫBCHC/C0HBPA93(BAIB0BCBo2C?P=CBBvB{AѭWew[AB޹B BC-vAB"BMBWCtBzC/tC ͛C?3BӆBBqgBXBx `:ARBBRCBCAWBfQ[)rdjCNžz_A[ƒ@`VB7-Ž6ͫBu.0ŠB%`gBBP6.*BbAˍBh]BT+BAy߾ih|YBR!AoCFB|AZ8y{B;[wcAlBZBz }A~BDM‚ЮAUa @o,A‰BLXB2VA-B=pBBTCp@ ANB7~BV$fBBCA!B[:A߭BC9B BGvBBzBC< $B@HCD)BliC;BfB?†1PBtArB!}AB݌AͰCjB"PBhAbBZ'B9jBCFBz9nBhAC A٤y>Aʔ@)(0BBTB sB޴AH&x>B7Ag3BBLZBY:AhuxBaVx~@" ‰FAegSuSB3h?B3vf?H@_@@BA6B1PIB*EVR>MB ABt :‘̤2 p0Uw¹! • &A A FY’C*BXq~CAJBMCzBCT†J#*¹yA(D&U9;2]¼JS5A?:0A shB A!AN+ B㈛Bd^BC,!4B*@C/A[AjI SA?B AmBdBz?BBCBӋFBzBc1B\)`CBC•BʈCB3BABݡ@UA,UM'T/efAGE¡$#T]?KAĊBˀcGBBy-C{B2BB*i-yGB@}@^\Tg6ARXp9A)eABdByHd?/$kPKBEBp/?PzBT\BFr–9AWt;´A+0FBnzt4Crđr)K&&%3µ> A@5A"BBtbgB@AoATA[l8fA*wŠB¶Dž@3BAetAjBuA AC CB^C&cC7'fC7B. B~BBz*G 0_DwB@rAޛAT~AҊ iBmB[BBlBC- BXA2šs@U\Ac’+95|q&t@>ܮ?PB? ?TZK?ht-k >HHF18?=?u> )>R?NѾZM?>> z>J$3>>bQ|>#?9>4?>Z>>?bm?*Z(*>!H.exvi?/?K??kKRS;d^>ؽ* ? ?cGȿ!:>ؾծ?@8^̽p?#m.Y> p=u>y:=?-Q?sƾz(|sIO>>8$?'"?ؿQҿz>>hEjH?G>?C?7)?9q>>2(?|ᆾ\?8<"`>ި$ٍt>h41?դ1JdtR5վ|?"z>-鰭?DeF>i^=X>;?nq(?;&=3?$&? t?F>Ţ?hk?M D?k)7@>\?,?AP8?Z?pD#Y?D@ҾٻF1gk?>>@.9%ʨ?:Du=}?t?'*f$*;2?1Gk> W?H?k M>ɫaJ? ?JD??i1?#L>~?s?윿C?m?E?a=v>M?3J0?*Z*տ;F>8dMJfA?h* ?/?+?>=8t?hh7 X`?<>;?. YN ?PwNT6lk?\?<0?԰_>? 7p?# ?">)?Iv>,* ? ?hL>6PT ȾuӔ>ee?"0* [?F/qe?c?xľL>&UH?5Ϳ$)>Gҿ4B?t?>Wt>p?)=Z?<=(cҿ>ΕȿsC>D:?Qӽ<?4:踿[?+MQt?,?MmԖ>j?z:>>bWk\>Pf><=>H=4`{=P\͢>|>5e?ND?_?&,0浕?}?w?'?? v=Od?tپxмx?^>B?% w? 7?? ??U5E>?-M ?=>/>Uy>nܿ?L?^U?;\>Q 7?濐Tڇ?>s?tP=*? 2?Vɝ dw?gV??FzА?~8K7\H4><\>^?~z?q?6m羹}D?@??H+OR?bT?9?S?ڔ><"*?xT=ݒ4>cM=C𾑙 >d?>>?hj `I>x*??fJQh>4M:5@>$22B#n0MK4=H>R&?0̾:p\>d?s>¤?KF?Ru>R8<>:>R;W@tEſDؿsŽ\9??,>??\mw4=hh=~?:JLcLP>=> ܼ?EIC?se?`J>+=?u"ɢa >}b?>ټ=Ґ@?g33{oȿ8TQ5l4xо=fF=W?8>-v? >[=n8eژ?r?d?ԛ?9ߪ>؞>NbԿBV?>k ڍ6<0; ?{^?*h>]v=/Ѩ> >8? >oьԾf">/f?&?)L?C#>F;>?C>O ~!cUƾgbz {?=>>.>o>?M?K֊#bkl>1B5-Jn+XwT?L>f>M{1ƿS??% ?o"⿻W>ȹ>^h 0>>.>5V?! ĿG?5???b:>6c>1{>\ѿr?Ơ ½>>> 7iV>-?7%?'>J>?C ?8D \r6?<^5dr=>J?:wl>6?u>?b'd>k"ο}2V#+E &>&ψ?ŀ?>> 5>mf@ W? >XZ?K@ٽ( ~C>ޠ>d4-j?ؿ]$Fj?H>?V/;K >`l=.<>>Z<ʿT,>?h?I r?@=PI?(>c0n>K?WN>^=7$z?6b!ֿ&[?,?0ݶ?w4?\?v?t=;޾'.y?? ??Y|{?>ۻ?ؽ:>F.+t>Z?D#?4ÿ_A˾!?Č?3>/l?!?UB>v@l;s =Ӛ@=35#O-r?3ow?>0e?ÿ1 =B^= A _?d0? ='^>>16>fPM? u><;kE>0z,ܾ?G>>3>h?`?޾,Lz?炾cb >\>?>8T>?aH> ? (=Q(*?=Ln>7=(?"E?T.ȿ&^~l?V??uF>Ѫ= >P;-΀> >>b>N?'K?26?*t>>eWx8N?e>rA<9A)4>X??r&D*r?>׭>[?&pgo8oʾľ)DyB?N?@ȿId?J?LW=ᙽl>=귽U @?bUK/о =? v.û4;?P>f=E΀>?_?N*ӯ?je=u>{"?[??X??eZb>y@'$>>$V?!ֿ?#/ @F@ J`?)D?J>82?y:'?`b쀾 ;=X4s<>R=<#?W~`?* >ޫs>>>i?M=(>?T䁒-k? >ӧ=ԾN ?`>/>0>~8 ?Ҟ?>e?Wd03??,{>L\d=Xпfᄊ+l@?CG=@_>_pm ?e~=Ą9b7N?``4Mll>?DJ !? ??4^zԋD>E?uZ>^P>cN`?K^>AĿBm0PK3u;G޾q^W=} =>=@ |R㾡ȿ>K?:??jz>o=??yS?i)DgؾVt?i]SJa>:\*?B}-T[Jt[%>ƾ꿇8;TH nB?ucV??ʿY0> >;2D>?/>wD>?r?RNGO*>=>?$?&\{>i>'1??cC v@X>P.> 3TĜr>{"z= G>"ǰ?PD>Dq>Q??o?{`>\?$?l6R `ԾP?K?H~F޾t|>qž¡="ˢ4 X?UWD??,=]z=F?\?c<>^?aֽ>n/K<2;ǚŽ=u?=>Ϻ?Z®G>˸ >&?P~tRl0D?Tg<V`>7S,̿pF˿=1=FGU7z?a>?C+?8>A㾩^d??.>G> >ћL!?W>8>?v?LyTߏUj?@|e>ѿz>?Sf?5B?.d::>%q[?);|dX>>y:G_?2G?fC?2Tb>߰`t8>sQ,V=Qq=??H@Gƾ ڡ9r76.qCy ?>?f?C>V?̀?܎?) n>,Z?SV"gI<ɐ?l>~[>>_ҿ"gL>Il>b?@=>)>9!1sR>o>T0S#>a>h>'6?W;$=4͍8>(?!?D>=oZ4J)տ[ry==+f@?# UG>o>(e?0ҿ]?&)>>=@z?9M?n>k!>.9ʿsܷ̾?#u>'?[˛>PS>aؿ7>f>??V@?p4=([N=!>Z/\xNF쿌l~b~B,迎1> >ȗ-𿶟ſcyq;>w{?;gH?3JQ>g>>StYQ>.>tI+chp\>Z?X̾^H?9U~-P?>dw~?8ֿ9??5?GI?!(?={?b!=N;I?^?>=dF־'@)4 knLOȿ_n1BN>BȾbB}U}uds ?BDE? ?`7= G83?D:?L>oC>X>zl>͢ Zd("‚Z@?:>XR;멈?QTg\ tw?C ?+?$?ul?a࿳:W> <>>&? "=N(?4>ks?DڌKi>]Bq<>,>E>D?"vp>̩v’?3>Oe>-P:ڣg0r*?|>??g?-=>5!=t?㾡>? bTqp?T?N?=` lpi?#?>J?F>>*>'^#v¾#%>@g>IbA?dw>,?x;5 l<>jc?gd*Ly??po>T>O?Ybm=i?R=о̾@>?D!?A¾f>[?+=e7?<п&a>W>"xf<PWj>#>Q=L ?2?˼?RIl?faC>}>~x>Tơ=1>+:V\pp2rY< =?? >*x>?Gf>]?E(>F? dB 6=|Qn[Sul=\#Ruc>Bƌ>+>:?b?ć?O)Llw=ﳜ?Vv>qd>s? Y;,;0L?Ff?݆>+>WD𒠽0tf"G>=ţJ>/?v?c?H1@*Ͽeh>xl?%:Կ,D?{?QL>Od pc>,޾ 0? u>iƀr'?UXx ?Z?󴾭d??[:BH>?=.ؾ;3>>i>%\?Q?s;⾂K<Kgݾ {[?-p{c6ƾ$h=?a><Y???˱>k<JL??eؿ5G !q?2?E>r.pqAo>n?"(>PМF|)"t>Ge-sU>F#z?>{9>ѫyм?tv>&G^=?b~=*ow. ho?MyY+|>?58=At(?NUpMȿWKQ?8νw|?0*$9P?ȇl4!=B0?dpKTP>:j2b>wM8>h?f?@?^\?>Xr,>>;daphkMBT?h׿y`>}=0bн佌?&c*>JT8>ƿ>}/h>ſ'n=:\Q4J|?_!=?u?wu=ZW>\eX?TD?|u?4?^k>k?1 < RA?:GW?cʿ>|?"^I=>p>s?)lȣ>{Á>¿?#}>8&=><>v>ϳ,??k>W?>/^?Er7#(?>i?9[$>IX?XY>] 8?wXr^>I쾧?=?@a?=򁔿4YvP=?}lfN ?N>>׮w* ɠ >}1N5d<=-@?ѿ~?c=GX Ծ3 ?Qan@4>X>=DF!YgHLT?Y>zӾ?^gE?rJ3T=;v? "+ӿ)*%\F_>щz?[=\>b/|h?B4>?c>#=2^)?(CTX?0>X?tK3?j>A(>ɣʿIf>Э=!;z>Ƣ#x:l>?:0>L?vQCmO?ؾdJ?ݾK2???[,ƾ< > +t?>p??cű?>G[>'B>>*:?)A+P5->4???;>S>`+Yѿ8Rd?~+T?§?, s*>.=>  g>yuҿ`֥ > g3?Vjx兢 ?ˆ!!;6PŸOB1_4,'_,)W9u|.©WQBgBxƒZ$?BMBk&BL‘Ɏ<*T>d{ u³Ffqg¬-ޝ Zœ@)"8՗+!IJ_jJl2 gΫ^@I_BM^”\ª ",AB-'ˁ¬XBlBCRB0B B`¿WCDԸCQBu ,B"BB6@W@Bz*1ſ2AhB\EBB_ICgŒhBqB[Tjº`˟A=DB$A8E@Ms B('Aa@Bm3sBKB {B}$CF?|BC>B;XCC BC)1NB CiBMC 6$3JB9¾vK.³K´ 5; AXn[D¢AP¥I<22¶t=0Gk²{ Aµh4_X,AGvJ"ۜ@蕹¾7A ;tA@T fF"~1M`.DPqvڌ :P’E0[(m9a±Br/ŽBe';GB8yAcv¡>t2B^#( @BDB{vB cBB\B` B*ɉ@_XB AOB+B"B[B|CeB>*CB›@uA|{B6Bn{Bw,BZjCC*,Bp{0BXA8%BC'!B|DBCR-C+1Bw568*e w@żOcBPMB,C7B]N8AzoAByBLzA:BnS$$AAxBDB{BAB>FAUA^HԃB BI$)›3B|C+NBbA0)VT}BFB2BծA$BB&AGC7WCa.°o(A8BoBCNB/HB+mBp_B4˜7BzA% uLC)&BpTB2B*BlBZBҧq: >kBAE>B{~fBtrBB B;ѼBNACV8C!цBBA}5BeArA&B4BseBlawC#1!B"B;n$Bu}EA{w.9BPwV{YB,BD|BJA`EBme9B爆A9aBX@g"B/B@A% QR F.JŠVB2L F2&s[B5C õB]4BAC CDBXCHBBi^m:+.AlhB_AA,B}B^A7A㙃A&YkCopBSHBtBJA#CBŸ7RM³+6LAHItӗLB ¡DQwd²#2m||FAoNza`װA-}?OB B#BWM3B82B4CAZ6B OAMBuzE<¥C qQK´eI£ IT:#A h…muBxb\ XB~BA[BB{A:uQBjȓح>B%{ӑ? r`BwBW}›6#|“( A',A-B$A9 @S2jBB17sBDBWiCPBA3oBBӠ@vB w@A8XfBm=1RBr-nBrZ@.U/A]B(B@B>X$ /ޟ@s`GmAA)^Bn!BuFJ%l*iAAWBWBJBAPN뒅C2(BGAªTΡC9B8A FA_@Z0GG @JcŒ~BB\h,;B:BҔrAdMDAv,rZ AG¼f?WOqAW"@!AA A%ŒpBP z·ˆjC›͍9uš@S4BT7›BB@AB9@ >B8iBQ8BUm-tAŪhAiAnBxBāBBB)sB!9BAAAPvBSBB/B+BiBAVBm1_IAXԺ?=>'㔾N">??GV|>? ?!"S?Q?$2?nԽF_WC!b8h?F26K$⽮Ĉ->WR?ʞ>>~Uf?[-g?T7_0H?U@i>]?fJ]2`˂>wYL?MS?{xW`Qоw?.>; cb=ίG>â< ?2>B&=kx>X\>Y`v?>)P>j>n?)?+OvP<H>%r?<Ⱦ=4.i=J>Z?n6~M{<"?A[? $?*r=]PT>?jjX> ܿ~>) >\?˚??? >D?<ۀ<1>G?B(?U%>ㇾͮf?UҾ۽] >:tm?t٨߾E1R>@?< 8a?`1/ 4?z>rP?XeC%>^>ҿ h??tX?;>#V1R=?-$=?>=Ww>gp>.>?Z=aM8@?Mx<-9`?0䇽Q>[G?@ ?,C>w=>?E?:п9|>@?r>(?#=>Tx>?SgtAڿ%?s2>&ێ޿C> >i?H-n!=d>Ui>s?7 R>AnOֽ{п81?FF?C? 68>^rݐ?=6B?]S=J>zq?%?+8ѣeV3%|N?]_?̿z>?ɏ><1? F??ľg??7NY1?9?ؿ>4l<ƒ=@A?J"?&ntM?>n# >5anD9<8=>ꂺ\򾯋6у?‾>????<~+c??׾VA>q?Il$g>>|=C> %>-,? o?:ӔBZD==!>KI9>D1俀O?B???=6:@>Ժ?3H?@#=|>+VFɦ=t$JEI=P>ݙۿ:>t==ؾ]k<^l>Jo?ƿg$>}>$=a=Bf=H?釾Hl8 =z>~?Wsf<=O"㰿 [9>,L ܼ?`6Qx?v= x="O(G<3?\%a0<*Z]4>9m&l >0g>ο0?!K> &>?o?^I?>a;2n>Yi??U >?tr-^?$:O(P?n~?.:_?_1>Ͽs?My?@=ƭ?>?r?>>8=>,>RG M 8?GZ>%k]?YmQ7e`??3=J>?h?>P{>C\>cPQ?U=P=\0G4:fZ;떠?T;E?C< ?L3W?ʭ?4ؾT?%~Re@?2eD? @&&ʾ">#=5+9L?  ?{.?T]rsF?^?+#[ھU꾦B#>:-Z>|=9>p=cqǾ2=&{Ljq=ȿ ¿>>>2m)?X> u!>I+f >g=/u=>D4@Us=??ӟҾ7Gvڰz?LCt68>+;Ii:Q־v?h!*?$ྂ-?Dr>}~ ؾWEz꾻Ӻ; ?տ UE?ӿ,w;?׍>{"?lI4O|>復SK;;>җ?*(?J?^?mq6n?_,>J!4-xؽP@^ƽp?>==p?*> (??hu?>hQ<0w=:?&P>Ii?>Fl?`T?1=@>9=?>2?o?*C?W(?J>iҿ9(ھW,> 4>꾲?k>h?,>͋>20ᢤ:#1ҽ)=0[gϒr?Z o?^Qb?w?^C?OO ,-RV mLDT&=:X>ǠH6>?{ ?]6D;{ kb?S-n=>ۏ?&v>V?>5?= ,?XJؾ~ˑ> ؽmQ>#B?gwGD"Z??=aT?`??0? Zt>=f.?:? 8\?3v?*J?^?4e+vؿ8?&L# =K>y=P?NP:$N F >8A'M޾ϕAY?U &qZ'? R?l?|W)?&+=\>$$>>*ɤ࿘7t ࿣T>2?Iwu?>>׆ua=0?i6?rh,?9.>!d>?>?4>F<6 ?@?n><7Sm?|Ϝy?v"?Eu>V ļ𾜰qBˑ:!k?XFus?aH()[>VDQ?z<T?I>[.?ûf6?>ƟĤ`!lX)eD ??h_TqQr>(F>0[>xh?B=UԈp?o=n:]??@;?w?%9߾FȾD@D>J9&н$~@>>>͠ ?s>Ur|??$>pfl06/n?~Y>WY9ud"?f{{>(+?r>N ??v>=>oS?Nw6="X>?0⾧>j#>?>?HK3>:>&>O?ME?$p?76hH>lB?P4>?p%6>ˀ>F?H8\hnqj>dOI>%> +9`>- >/?jl  (}?:>f*u?ZvT? ?I+ڼ0>m?Ht?UL=\?]q?"Z| V'>vv>te= ??aլ?&F?w>&?A>-?XB>MҾT>ƀ4>%"6`?-?>ZN?n)w ҽ¤6y@?#&\?q=o?=`? $t>`?I5? ?>?`>v54ۿ*d>#R>p?dEk >SUU?xT>2}'ƿv:> >om꾾J}$?S**}==3%L> K>)>G?.ھҥ?r=E>*)=(*>ޑ?rO>ײ\)h=F?0Y>,j?ć>$<?Z&>d? A&P? 8>Um?#z='?R^>B?YKn޿?f}?2w? >ՒA>>{\9V>R?(~?>d>]=v=??Ml?!j㽄\B ?ʉ>=O0%?Thͤ&p >;l?˽ĭ~?_0?>X?ij?ٿ3jg? J?Lbې7tУ'!=?MC?>ZqGA?=F>1V?!]]oV:O>,?@^>8?v>⨿WU>.?Qw>>ty<^H۲L{#n[>QHɘ{~"̾F<࿔z_7>g<޿`?JB>b>ަ?/ڿ ?4o?/Ȕ?(?k>p_TᾦY?¿!+$>RT~1>Y>3?Gܿ6>/^?;???!P?E?%ў>P ~zP>9?8?"??> >6v>Be>*<π?O?y0>gT.?ZiͲ>%W?VG3`<:,辆?QhSR?;J>u}?q.~?}>P?ow Ƚ& >>Pny?J>,??>4> >'9f>>F>G2?T<5> MJ>M=H?^y ?q1-??Ͼc?ώ=>f?o?p>Gw 覾ؿϬEQ~?ֽK}B9|}g>b?ڀ>& ?:hȾA>8?b? ,:-&>=H콤=~=h>}o6d">2AupJlw=D ̿6ɽvs>??2'#??8K (]?.½Pǀ*^5@?p>Gҟ=e[?It?>/>}>̲><`>s?WW:>d?Ľ>!?B?I¾vN˿ʾ6@?X? (?q,G.{S?&x?"FQ>pw"?(1>a#ڿ7Mv>vG`?+9<׭|J p32bhAOE??>`>G0?gtaޙ?y>o?w뙿K<`MtF߾C.羚==v?'k??>h> r> B4U>ƿkZ.?? p1E$u=?)#q??Fͫ>C?*줽;޿2񾱽?$u*޿ 9,g *=c4>Y==n(>L>l>k?|W2? %c0` ?>*!d?+fz>/>>ϩT>?-f>$'Un[>,?Qu?A(>>,0. zF=}?5`=^ň>^?ag+l*?j?9?q`b~=h?,v> h=>!53= 194=>1=H>g7̼˱`>1a?@U$l?: Fl< ٰ-<>]WݿL? IZ=={p?3e+?td? ?z>Zv=cs??Qw>W*">L=?7ߠ>7>]ֿ"?f?Cྐ?=ƾZUl=d9?ld??n=B p`'h@@>^?/w>WO>,!Q>O+>>4?V)2Μh>ھy5?df?!>>a?̿$־Q[.+4`=oԾ]>dVq>Ǫ=R?k?^[?9\?}> >L/Z/A>2n>>Dľb>>Io;O.M*?y!?&?Sě?n`5>-S=#sոX8?RR?27>t>ɓ;ῃO?c)ܿ7*Ȁ?&hV_p?6?%?z2 >X?P ρ=ED>O? G>'>6?'4'X>hG>V)+׈>M˄>5 ?A?+ze?F?{_(>?"< <>4h>?>c6?jtl><%ZX[0* ">"f>ƾFLC #:?\3e>F>>x;N`?I9`E<0ƿ 㿋uf2>>ᙾ~>>3O??> 2?d2?B"Z??4NX?qNAI:3?RM,?e >56=$oy>>^"p>h>_h>U&?k?>>(>3A|>?%>eSԿ) 1>?E9_v>?⾃}b?lp(<<0>6}>7O?/ž>uC2E)?O\>>>? =ˀ>@l>~z½־ro?ٿ>E"ƾ>t(?ȿ6> ;Q>'C>~ ??2u>.>?Ub>5>T=h)>3?:?(?$?($p<؃06H>>GL\0?Qp>V?u?>W?TU濴8>姄`ܷ=ȾL>|?9g?:2?T->e=a?,r?*w3п9I??? 9?R' ?VWG>@Wm?*>u 㾾? $YvX2?Gz ̽/y?+ ?.| E.6AQ>@>N0}=@sP>O=0&`6og ~P ?@~j= ?R.XV X>?L(>>l$ ҾAD?V>?vID?>~d?v ?=?f>?= ?.=2B?vNzTw>_¼uĿ '<`?.aau;>)b?9q => >>Tsͽ瞾ȶj?i?d?*?YCV>V>(mp?FFh>.?`>=:F>,ƾ{O>N|lo@>2T>-<0{?o>?xB=/Xh??;x?F=Y|=H?Wp>,\qi 8ժ~>F>ĿՙT ?:-C>>?@ޑ> 䘾g@Q=?>>r6!H??U>ÞpA[?`a=x)࿼H; ?e>C7>dj>%+&RS:?"Y? Ӯ / e?[=?3|{Z?JR?y>/},U&? &?HL4>^? T>z?L?0 ?Kbl==B$i>F2>1˞,-v9!>?k?N>wmN ھ?4'?j >RY=%>f۪#L⿐!@!?%S??_m>lDfKst-2.0.8/old_tests/healpix/testhealpix.cpp0000644000175000017500000002661712277111530020061 0ustar synthsynth/* * Copyright 2005, Theodore Kisner * Licensed under GPL. */ #include #include #include #include #include #define XDIM 1200 #define YDIM 900 #define DEGRADE 1 QString myName; typedef QMap StringMap; static void exitHelper() { KST::vectorList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.latin1()); } } extern "C" { KstDataSource *create_healpix(KConfig *cfg, const QString& filename, const QString& type); KstDataSource *load_healpix(KConfig *cfg, const QString& filename, const QString& type, const QDomElement& e); int understands_healpix(KConfig *cfg, const QString& filename); QStringList matrixList_healpix(KConfig *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete); QStringList fieldList_healpix(KConfig *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete); } void doTests() { // the data file to use. // first determine the path used to call this program, // and then prepend that to the data file name. QString path = myName.section('/', 0, -3); QString datafile = path; datafile.append("/healpix_example_sm.fits"); // create a temporary config file to use QString cfgfile = "testhealpix.temp"; KConfig *cfg = new KConfig(cfgfile, false, false); cfg->setGroup("Healpix General"); cfg->setGroup(datafile); cfg->writeEntry("Matrix X Dimension", XDIM); cfg->writeEntry("Matrix Y Dimension", YDIM); cfg->writeEntry("Theta Autoscale", true); cfg->writeEntry("Theta Units", 0); cfg->writeEntry("Theta Min", 0.0); cfg->writeEntry("Theta Max", 1.0); cfg->writeEntry("Phi Autoscale", true); cfg->writeEntry("Phi Units", 0); cfg->writeEntry("Phi Min", 0.0); cfg->writeEntry("Phi Max", 1.0); cfg->writeEntry("Vector Theta", 1); cfg->writeEntry("Vector Phi", 2); cfg->writeEntry("Vector Degrade Factor", DEGRADE); cfg->writeEntry("Vector Magnitude Autoscale", true); cfg->writeEntry("Vector Max Magnitude", 1.0); cfg->writeEntry("Vector is QU", true); // use the C functions to test for healpix support int verstehen = understands_healpix(cfg, datafile); if (verstehen) { kstdDebug() << "Data file " << datafile << " is supported" << endl; QString suggestion; bool complete; QStringList matrices = matrixList_healpix(cfg, datafile, "HEALPIX", &suggestion, &complete); kstdDebug() << "Available matrices are:" << endl; for ( QStringList::Iterator it = matrices.begin(); it != matrices.end(); ++it ) { kstdDebug() << " " << *it << endl; } kstdDebug() << " suggestion = " << suggestion << endl; kstdDebug() << " complete = " << complete << endl; QStringList fields = fieldList_healpix(cfg, datafile, "HEALPIX", &suggestion, &complete); kstdDebug() << "Available fields are:" << endl; for ( QStringList::Iterator it = fields.begin(); it != fields.end(); ++it ) { kstdDebug() << " " << *it << endl; } kstdDebug() << " suggestion = " << suggestion << endl; kstdDebug() << " complete = " << complete << endl; // actually create HealpixSource HealpixSource *hpx = new HealpixSource(cfg, datafile, "HEALPIX"); // test that saveConfig produces the same as the // original input configuration QString cfgfile2 = "testhealpix.temp2"; KConfig *chk = new KConfig(cfgfile2, false, false); hpx->saveConfig(chk); StringMap cfgmap = cfg->entryMap(datafile); StringMap chkmap = chk->entryMap(datafile); /* kstdDebug() << cfgmap["Matrix X Dimension"] << " " << chkmap["Matrix X Dimension"] << endl; kstdDebug() << cfgmap["Matrix Y Dimension"] << " " << chkmap["Matrix Y Dimension"] << endl; kstdDebug() << cfgmap["Theta Autoscale"] << " " << chkmap["Theta Autoscale"] << endl; kstdDebug() << cfgmap["Theta Units"] << " " << chkmap["Theta Units"] << endl; kstdDebug() << cfgmap["Theta Min"] << " " << chkmap["Theta Min"] << endl; kstdDebug() << cfgmap["Theta Max"] << " " << chkmap["Theta Max"] << endl; kstdDebug() << cfgmap["Phi Autoscale"] << " " << chkmap["Phi Autoscale"] << endl; kstdDebug() << cfgmap["Phi Units"] << " " << chkmap["Phi Units"] << endl; kstdDebug() << cfgmap["Phi Min"] << " " << chkmap["Phi Min"] << endl; kstdDebug() << cfgmap["Phi Max"] << " " << chkmap["Phi Max"] << endl; kstdDebug() << cfgmap["Vector Theta"] << " " << chkmap["Vector Theta"] << endl; kstdDebug() << cfgmap["Vector Phi"] << " " << chkmap["Vector Phi"] << endl; kstdDebug() << cfgmap["Vector Degrade Factor"] << " " << chkmap["Vector Degrade Factor"] << endl; kstdDebug() << cfgmap["Vector Magnitude Autoscale"] << " " << chkmap["Vector Magnitude Autoscale"] << endl; kstdDebug() << cfgmap["Vector Max Magnitude"] << " " << chkmap["Vector Max Magnitude"] << endl; kstdDebug() << cfgmap["Vector is QU"] << " " << chkmap["Vector is QU"] << endl; */ if (cfgmap["Matrix X Dimension"] != chkmap["Matrix X Dimension"]) { QString msg = "Matrix X Dimension integrity"; testAssert(false, msg); } if (cfgmap["Matrix Y Dimension"] != chkmap["Matrix Y Dimension"]) { QString msg = "Matrix Y Dimension integrity"; testAssert(false, msg); } if (cfgmap["Theta Autoscale"] != chkmap["Theta Autoscale"]) { QString msg = "Theta Autoscale integrity"; testAssert(false, msg); } if (cfgmap["Theta Units"] != chkmap["Theta Units"]) { QString msg = "Theta Units integrity"; testAssert(false, msg); } if (cfgmap["Theta Min"] != chkmap["Theta Min"]) { QString msg = "Theta Min integrity"; testAssert(false, msg); } if (cfgmap["Theta Max"] != chkmap["Theta Max"]) { QString msg = "Theta Max integrity"; testAssert(false, msg); } if (cfgmap["Phi Autoscale"] != chkmap["Phi Autoscale"]) { QString msg = "Phi Autoscale integrity"; testAssert(false, msg); } if (cfgmap["Phi Units"] != chkmap["Phi Units"]) { QString msg = "Phi Units integrity"; testAssert(false, msg); } if (cfgmap["Phi Min"] != chkmap["Phi Min"]) { QString msg = "Phi Min integrity"; testAssert(false, msg); } if (cfgmap["Phi Max"] != chkmap["Phi Max"]) { QString msg = "Phi Max integrity"; testAssert(false, msg); } if (cfgmap["Vector Theta"] != chkmap["Vector Theta"]) { QString msg = "Vector Theta integrity"; testAssert(false, msg); } if (cfgmap["Vector Phi"] != chkmap["Vector Phi"]) { QString msg = "Vector Phi integrity"; testAssert(false, msg); } if (cfgmap["Vector Degrade Factor"] != chkmap["Vector Degrade Factor"]) { QString msg = "Vector Degrade Factor integrity"; testAssert(false, msg); } if (cfgmap["Vector Magnitude Autoscale"] != chkmap["Vector Magnitude Autoscale"]) { QString msg = "Vector Magnitude Autoscale integrity"; testAssert(false, msg); } if (cfgmap["Vector Max Magnitude"] != chkmap["Vector Max Magnitude"]) { QString msg = "Vector Max Magnitude integrity"; testAssert(false, msg); } if (cfgmap["Vector is QU"] != chkmap["Vector is QU"]) { QString msg = "Vector is QU integrity"; testAssert(false, msg); } kstdDebug() << "Save/Load config is consistent." << endl; // print _metaData and compute NSIDE and number // of samples in the vectors int nside = 0; int nvec; QString key; QString data; kstdDebug() << "Checking metaData:" << endl; StringMap metamap = hpx->metaData(); for ( StringMap::Iterator it = metamap.begin(); it != metamap.end(); ++it ) { key = it.key(); data = it.data(); kstdDebug() << " " << key.latin1() << " = " << data.latin1() << endl; if (key == "NSIDE") { nside = data.toInt(); } } kstdDebug() << "Data file has nside = " << nside << endl; testAssert(nside != 0, "data file NSIDE"); for (int i = 0; i < DEGRADE; i++) { nside = (int)(nside/2); } nvec = 12*nside*nside; kstdDebug() << "Degraded vectorfield has nside = " << nside << " and " << nvec << " full-sphere pixels" << endl; // check that all returned fields are valid, and that // optionally field number names are valid. kstdDebug() << "Checking matrix validity:" << endl; int num = 1; int xdim, ydim, nframe, sampframe; for ( QStringList::Iterator it = matrices.begin(); it != matrices.end(); ++it ) { if (hpx->isValidMatrix(*it)) { kstdDebug() << " \"" << *it << "\" is VALID" << endl; hpx->matrixDimensions(*it, &xdim, &ydim); kstdDebug() << " and has dimensions " << xdim << "x" << ydim << endl; testAssert((xdim == XDIM)&&(ydim == YDIM), "dimension integrity"); } else { QString msg = (*it); msg.append(" validity"); testAssert(false, msg); } QString numfield = QString("%1").arg(num); if (hpx->isValidMatrix(numfield)) { kstdDebug() << " \"" << numfield << "\" is VALID" << endl; hpx->matrixDimensions(numfield, &xdim, &ydim); kstdDebug() << " and has dimensions " << xdim << "x" << ydim << endl; testAssert((xdim == XDIM)&&(ydim == YDIM), "dimension integrity"); } else { QString msg = numfield; msg.append(" validity"); testAssert(false, msg); } num++; } kstdDebug() << "Checking field validity:" << endl; num = 1; for ( QStringList::Iterator it = fields.begin(); it != fields.end(); ++it ) { if (hpx->isValidField(*it)) { kstdDebug() << " \"" << *it << "\" is VALID" << endl; nframe = hpx->frameCount(*it); sampframe = hpx->samplesPerFrame(*it); kstdDebug() << " and has " << nframe << " frames of " << sampframe << " sample(s) each" << endl; testAssert(sampframe == 1, "samples per frame"); testAssert(nframe == nvec, "number of frames"); } else { QString msg = (*it); msg.append(" validity"); testAssert(false, msg); } QString numfield = QString("%1").arg(num); if (hpx->isValidField(numfield)) { kstdDebug() << " \"" << numfield << "\" is VALID" << endl; nframe = hpx->frameCount(numfield); sampframe = hpx->samplesPerFrame(numfield); kstdDebug() << " and has " << nframe << " frames of " << sampframe << " sample(s) each" << endl; testAssert(sampframe == 1, "samples per frame"); testAssert(nframe == nvec, "number of frames"); } else { QString msg = numfield; msg.append(" validity"); testAssert(false, msg); } num++; } // check reset function if (hpx->reset()) { kstdDebug() << "Reset function is implemented." << endl; } else { testAssert(false, "reset"); } } else { testAssert(false, "understanding"); } } int main(int argc, char **argv) { atexit(exitHelper); myName = argv[0]; KApplication app(argc, argv, "testhealpix", false, false); doTests(); exitHelper(); // before app dies if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/testpsd.cpp0000644000175000017500000001356212277111530015556 0ustar synthsynth/* * Copyright 2006, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" #include "kstpsd.h" #include "kstdataobject.h" #include #include #include #include #include static void exitHelper() { // TODO: garbage collection. } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } QDomDocument makeDOMElement(const QString& tag, const QString& val) { // Should be some boundary checking in the constructor. QDomDocument psdDOM("psddocument"); QDomElement psdElement, child; QDomText text; psdElement = psdDOM.createElement("psdDOMTest"); child = psdDOM.createElement("tag"); text = psdDOM.createTextNode(tag); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("vectag"); text = psdDOM.createTextNode(val); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("sampRate"); text = psdDOM.createTextNode("128"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("average"); text = psdDOM.createTextNode("1"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("fiftLen"); text = psdDOM.createTextNode("5"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("adopize"); text = psdDOM.createTextNode("0"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("apodizefxn"); text = psdDOM.createTextNode("WindowOriginal"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("gaussiansigma"); text = psdDOM.createTextNode("0.01"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("removeMean"); text = psdDOM.createTextNode("1"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("VUnits"); text = psdDOM.createTextNode("vUnits"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("RUnits"); text = psdDOM.createTextNode("rUnits"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("output"); text = psdDOM.createTextNode("PSDAmplitudeSpectralDensity"); child.appendChild(text); psdElement.appendChild(child); child = psdDOM.createElement("interpolateHoles"); text = psdDOM.createTextNode("1"); child.appendChild(text); psdElement.appendChild(child); psdDOM.appendChild(psdElement); return psdDOM; } void doTests() { KstVectorPtr vp = new KstVector(KstObjectTag::fromString("tempVector"), 10); for (int i = 0; i < 10; i++){ vp->value()[i] = i; } KstPSDPtr psd = new KstPSD(QString("psdTest"), vp, 0.0, false, 10, false, false, QString("vUnits"), QString("rUnits"), WindowUndefined, 0.0, PSDUndefined); doTest(psd->tagName() == "psdTest"); doTest(psd->vTag() == "tempVector"); doTest(psd->output() == PSDUndefined); doTest(!psd->apodize()); doTest(!psd->removeMean()); doTest(!psd->average()); doTest(psd->freq() == 0.0); doTest(psd->apodizeFxn() == WindowUndefined); doTest(psd->gaussianSigma() == 0); KstVectorPtr vpVX = psd->vX(); KstVectorPtr vpVY = psd->vY(); doTest(vpVX->length() == 1); doTest(vpVX->value()[0] != vpVX->value()[0]); doTest(vpVY->length() == 1); doTest(vpVY->value()[0] != vpVY->value()[0]); psd->writeLock(); doTest(psd->update(0) == KstObject::UPDATE); psd->unlock(); for(int j = 0; j < vpVX->length(); j++){ doTest(vpVX->value()[j] == 0); } psd->setOutput(PSDAmplitudeSpectralDensity); psd->setApodize(true); psd->setRemoveMean(true); psd->setAverage(true); psd->setFreq(0.1); psd->setApodizeFxn(WindowOriginal); psd->setGaussianSigma(0.2); doTest(psd->tagName() == "psdTest"); doTest(psd->vTag() == "tempVector"); doTest(psd->output() == PSDAmplitudeSpectralDensity); doTest(psd->apodize()); doTest(psd->removeMean()); doTest(psd->average()); doTest(psd->freq() == 0.1); doTest(psd->apodizeFxn() == WindowOriginal); doTest(psd->gaussianSigma() == 0.2); // doTest(psd->update(0) == KstObject::UPDATE); // QString ps = "PSD: " + psd->vTag(); // doTest(psd->propertyString() == ps); // doTest(!psd->curveHints().curveName() == ""); // printf("Curve name [%s]", kstCHL[0].curveName()); // printf("X Vector name [%s]", kstCHL[0].xVectorName()); // printf("Y Vector name [%s]", kstCHL[0].yVectorName()); QTemporaryFile tf; tf.open(); QTextStream ts(&tf); psd->save(ts, ""); QFile::remove(tf.fileName()); QDomNode n = makeDOMElement("psdDOMPsd", "psdDOMVector").firstChild(); QDomElement e = n.toElement(); KstPSDPtr psdDOM = new KstPSD(e); doTest(psdDOM->tagName() == "psdDOMPsd"); doTest(psdDOM->output() == PSDAmplitudeSpectralDensity); doTest(psdDOM->apodize()); doTest(psdDOM->removeMean()); doTest(psdDOM->average()); doTest(psdDOM->freq() == 128); doTest(psdDOM->apodizeFxn() == WindowOriginal); doTest(psdDOM->gaussianSigma() == 0.01); // KstVectorPtr vpVX = psdDOM->vX(); // for(int j = 0; j < vpVX->length(); j++){ // printf("[%d][%lf]", j, vpVX->value()[j]); // } // KstVectorPtr vpVY = psdDOM->vY(); } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before kapp goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/testlabelparser.cpp0000644000175000017500000003113012277111530017253 0ustar synthsynth/* * Copyright 2004, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" #include #include static void exitHelper() { KST::vectorList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } static void dumpAttributes(Label::Chunk *l, QString indent) { printf("%sb:%d i:%d u:%d c:%s\n", indent.toLatin1().data(), l->attributes.bold, l->attributes.italic, l->attributes.underline, l->attributes.color.name().toLatin1().data()); } static void dumpTree(Label::Chunk *l, QString indent = "") { while (l) { printf("%sNode: %p %s[%s]%s\n", indent.toLatin1().data(), l, l->vOffset == Label::Chunk::None ? "" : (l->vOffset == Label::Chunk::Up ? "U " : "D "), l->text.toLatin1().data(), l->group ? " [G]" : ""); printf("%sPrev: %p Next: %p Up: %p Down: %p\n", indent.toLatin1().data(), l->prev, l->next, l->up, l->down); dumpAttributes(l, indent); if (l->group) { dumpTree(l->group, indent + " "); } if (l->up) { dumpTree(l->up, indent + " "); } if (l->down) { dumpTree(l->down, indent + " "); } l = l->next; } } static void dumpTree(Label::Parsed *l) { dumpTree(l->chunk); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } void doTests() { Label::Parsed *parsed = Label::parse(""); doTestD(parsed != 0L, "Empty label parsed"); doTest(parsed->chunk->prev == 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text == QString::null); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("a"); doTest(parsed != 0L); doTest(parsed->chunk->prev == 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text == "a"); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\]"); doTest(parsed != 0L); doTest(parsed->chunk->prev == 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text == "]"); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\\\"); doTest(parsed != 0L); doTest(parsed->chunk->prev == 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text == "\\"); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\tau"); doTest(parsed != 0L); doTest(parsed->chunk->prev == 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text == QChar(0x3A4 + 0x20)); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\t"); doTest(parsed != 0L); doTest(parsed->chunk->text == ""); doTest(parsed->chunk->tab == true); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\n"); doTest(parsed != 0L); doTest(parsed->chunk->text == ""); doTest(parsed->chunk->linebreak == true); doTest(parsed->chunk->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("\\tau\\Theta"); doTest(parsed != 0L); doTest(parsed->chunk->next == 0L); doTest(parsed->chunk->text[0] == QChar(0x3A4 + 0x20)); doTest(parsed->chunk->text[1] == QChar(0x398)); doTest(parsed->chunk->text.length() == 2); delete parsed; Label::Chunk *c = 0L; parsed = Label::parse("\\taufoo bar\\n\\Theta"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->text == QString(QChar(0x3A4 + 0x20)) + "foo bar"); c = c->next; doTest(c->prev != 0L); doTest(c->next != 0L); doTest(c->text == ""); doTest(c->linebreak == true); c = c->next; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->text == QChar(0x398)); delete parsed; parsed = Label::parse("x^y^z"); doTest(parsed == 0L); parsed = Label::parse("x_y_z"); doTest(parsed == 0L); parsed = Label::parse("x^y_z"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->prev == 0L); doTest(c->next == 0L); doTest(c->up != 0L); doTest(c->down != 0L); doTest(c->text == "x"); doTest(c->vOffset == Label::Chunk::None); c = c->up; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "y"); doTest(c->vOffset == Label::Chunk::Up); c = c->prev->down; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "z"); doTest(c->vOffset == Label::Chunk::Down); delete parsed; parsed = Label::parse("x^{}"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->prev == 0L); doTest(c->next == 0L); doTest(c->up != 0L); doTest(c->down == 0L); doTest(c->text == "x"); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); c = c->up; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::Up); c = c->group; doTest(c->text == ""); doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("x^{y+1}_{z-1}"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->prev == 0L); doTest(c->next == 0L); doTest(c->up != 0L); doTest(c->down != 0L); doTest(c->text == "x"); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); c = c->up; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::Up); c = c->group; doTest(c->text == "y+1"); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); c = c->prev->prev->down; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::Down); c = c->group; doTest(c->text == "z-1"); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("x\\^y"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->prev == 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "x^y"); doTest(c->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("x^{y^{q+1} + 1}_{z-1}"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->prev == 0L); doTest(c->next == 0L); doTest(c->up != 0L); doTest(c->down != 0L); doTest(c->text == "x"); doTest(c->vOffset == Label::Chunk::None); c = c->up; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::Up); c = c->group; doTest(c->text == "y"); doTest(c->prev != 0L); doTest(c->next != 0L); doTest(c->up != 0L); doTest(c->down == 0L); doTest(c->group == 0L); doTest(c->vOffset == Label::Chunk::None); c = c->up; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::Up); c = c->group; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "q+1"); doTest(c->vOffset == Label::Chunk::None); c = c->prev->prev->next; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == " + 1"); doTest(c->vOffset == Label::Chunk::None); c = c->prev->prev->prev->down; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->group); doTest(c->vOffset == Label::Chunk::Down); c = c->group; doTest(c->prev != 0L); doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "z-1"); doTest(c->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("{2*2}"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next == 0L); doTest(c->group != 0L); doTest(c->vOffset == Label::Chunk::None); c = c->group; doTest(c->text == "2*2"); doTest(c->vOffset == Label::Chunk::None); delete parsed; parsed = Label::parse("x^100"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->up != 0L); doTest(c->text == "x"); doTest(c->vOffset == Label::Chunk::None); c = c->next; doTest(c->next == 0L); doTest(c->text == "00"); doTest(c->vOffset == Label::Chunk::None); c = c->prev->up; doTest(c->next == 0L); doTest(c->text == "1"); doTest(c->vOffset == Label::Chunk::Up); delete parsed; parsed = Label::parse("x^100*200"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->up != 0L); doTest(c->text == "x"); doTest(c->vOffset == Label::Chunk::None); c = c->next; doTest(c->next == 0L); doTest(c->text == "00*200"); doTest(c->vOffset == Label::Chunk::None); c = c->prev->up; doTest(c->next == 0L); doTest(c->text == "1"); doTest(c->vOffset == Label::Chunk::Up); delete parsed; parsed = Label::parse("[ a ^label ]"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "a ^label"); doTest(c->scalar); delete parsed; parsed = Label::parse("[vector[2]]"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "vector"); doTest(c->expression == "2"); doTest(c->vector); delete parsed; parsed = Label::parse("[a][b]"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "a"); doTest(c->scalar); c = c->next; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "b"); doTest(c->scalar); delete parsed; parsed = Label::parse("[a]*[b]"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "a"); doTest(c->scalar); c = c->next; doTest(c->next != 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "*"); doTest(!c->scalar); c = c->next; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "b"); doTest(c->scalar); delete parsed; parsed = Label::parse("[x]^[a]_[b][c]"); doTest(parsed != 0L); c = parsed->chunk; doTest(c->next != 0L); doTest(c->up != 0L); doTest(c->down != 0L); doTest(c->text == "x"); doTest(c->scalar); c = c->up; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "a"); doTest(c->scalar); c = c->prev->down; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "b"); doTest(c->scalar); c = c->prev->next; doTest(c->next == 0L); doTest(c->up == 0L); doTest(c->down == 0L); doTest(c->text == "c"); doTest(c->scalar); delete parsed; parsed = Label::parse("Ends in a \\"); delete parsed; parsed = Label::parse("_"); delete parsed; parsed = Label::parse("A weird { case }"); delete parsed; parsed = Label::parse("x^y^foo{ case }"); delete parsed; parsed = Label::parse("x^5\\"); delete parsed; parsed = Label::parse("}"); delete parsed; parsed = Label::parse("Average period (ADU)"); delete parsed; parsed = Label::parse("PSD (ADU/{Hz^{1/2}})"); delete parsed; parsed = Label::parse("\\Sigma^{(x+5)^2}_{5+1} + \\Pi^{\\Sigma^{i-j}_{i+j}}_{x = 0} + 5"); doTest(parsed != 0L); // more to test here delete parsed; parsed = Label::parse("A test \\textbf{bold \\textit{italicbold}} \\textit{italic}\n42^{\\textbf{42}^{42}} 42^\\textbf{42^{42}} 42^{42}\n\\underline{a whole\\tregion underlined}"); //dumpTree(parsed); // FIXME delete parsed; parsed = Label::parse("\\textbf{\\textit{italicbold}bold}"); // FIXME delete parsed; parsed = Label::parse("\\textcolor{red}{red}black"); // FIXME delete parsed; parsed = Label::parse("\\textbf{bold}unbold"); // FIXME delete parsed; // more to test... } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before kapp goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/dirfile_maker/0000755000175000017500000000000012277111530016152 5ustar synthsynthKst-2.0.8/old_tests/dirfile_maker/dirfile_maker.c0000644000175000017500000000412312277111530021113 0ustar synthsynth#include #include #include #include #include #include struct DFEntryType { char field[17]; int spf; int fp; }; #define NDF 5 #define SCOUNT 0 #define FCOUNT 1 #define SINE 2 #define SSINE 3 #define COS 4 struct DFEntryType df[NDF] = { {"scount", 1, -1}, {"fcount", 20, -1}, {"sine", 20, -1}, {"ssine", 1, -1}, {"cos", 20, -1} }; int main() { char dirfilename[120]; char tmpstr[150]; FILE *fpf; int i, count = 0; float x; sprintf(dirfilename, "%d.dm", time(NULL)); printf("Writing dirfile %s\n", dirfilename); printf("The fields are:\n"); for (i=0; i> $CONSOLELOG echo "Running test: $i" >> $CONSOLELOG output=`$VALGRIND ./$i $* 2>&1` FAILED=$? echo "$output" | grep -v QPixmap >>$CONSOLELOG if [ $FAILED -gt 0 ]; then echo "$FAILED testcases failed in $i" | tee -a $CONSOLELOG fi echo >>$CONSOLELOG echo Code coverage: >>$CONSOLELOG pushd ../kst >/dev/null 2>&1 filenames='$'"$i"_FILES; list=`eval echo $filenames` for j in $list; do gcov -o .libs -n $j 2>&1 | while true; do read k if test $? -ne 0; then break; fi echo "$k" | grep "File \`$j'" >/dev/null 2>&1 if test $? -eq 0; then read l echo $j: $l >>$CONSOLELOG break fi done done popd >/dev/null 2>&1 echo >>$CONSOLELOG echo >>$CONSOLELOG done exit 0 Kst-2.0.8/old_tests/testamatrix.cpp0000644000175000017500000002124512277111530016432 0ustar synthsynth/* * Copyright 2005, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" #include #include #include static void exitHelper() { KST::matrixList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } QDomDocument makeDOMElement(const QString& tag, const int nx, const int ny, const double xmin, const double ymin, const double xstep, const double ystep, const int dataSize) { // Should be some boundary checking in the constructor. QDomDocument amDOM("amdocument"); QDomElement amElement, child, dataset; QDomText text; amElement = amDOM.createElement("amDOMTest"); child = amDOM.createElement("tag"); text = amDOM.createTextNode(tag); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("nx"); text = amDOM.createTextNode(QString::number(nx)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("ny"); text = amDOM.createTextNode(QString::number(ny)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("xmin"); text = amDOM.createTextNode(QString::number(xmin)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("ymin"); text = amDOM.createTextNode(QString::number(ymin)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("xstep"); text = amDOM.createTextNode(QString::number(xstep)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("ystep"); text = amDOM.createTextNode(QString::number(ystep)); child.appendChild(text); amElement.appendChild(child); child = amDOM.createElement("data"); QByteArray qba; qba.reserve(dataSize*sizeof(double)); QDataStream qds(&qba, QIODevice::WriteOnly); for (int i = 0; i < dataSize; i++) { qds << 1.1; } text = amDOM.createTextNode(QString(qCompress(qba).toBase64())); child.appendChild(text); amElement.appendChild(child); amDOM.appendChild(amElement); return amDOM; } void doTests() { bool ok = true; QDomNode n = makeDOMElement("amDOM", 0, 0, 0, 0, 1, 1, 9).firstChild(); QDomElement e = n.toElement(); //basic default constructor values KstAMatrix* am1 = new KstAMatrix(e); doTest(am1->tagName().startsWith("amDOM")); doTest(am1->sampleCount() == 0); doTest(am1->minValue() == 0); doTest(am1->maxValue() == 0); doTest(am1->value(0, 0, &ok) == 0); doTest(!ok); doTest(am1->value(10, 10, &ok) == 0); //should be outside the boundaries. doTest(!ok); doTest(am1->sampleCount() == 0); doTest(am1->meanValue() == 0); //basic symetrical matrix n = makeDOMElement("Symetrical", 3, 3, 0, 0, 1, 1, 9).firstChild(); e = n.toElement(); //basic default constructor values KstAMatrix* am2 = new KstAMatrix(e); doTest(am2->tagName() == "Symetrical"); doTest(am2->resize(3, 3, true)); for(int i =0 ; i < 3; i++){ for(int j = 0; j < 3; j++){ doTest(am2->value(i, j, &ok) == 1.1); doTest(ok); } } doTest(am2->editable()); doTest(am2->xNumSteps() == 3); doTest(am2->yNumSteps() == 3); doTest(am2->minX() == 0); doTest(am2->minY() == 0); doTest(am2->xStepSize() == 1); doTest(am2->yStepSize() == 1); doTest(am2->sampleCount() == 9); doTest(am2->setValueRaw(1, 1, 5)); ok = true; doTest(am2->value(1, 1, &ok) == 5); doTest(ok); am2->blank(); am2->change(KstObjectTag::fromString(am2->tagName()), 3, 3, 0, 0, 0, 0); //should not be legal doTest(am2->xNumSteps() == 3); doTest(am2->yNumSteps() == 3); doTest(am2->minX() == 0); doTest(am2->minY() == 0); doTest(am2->xStepSize() == 0); doTest(am2->yStepSize() == 0); doTest(am2->sampleCount() == 9); doTest(!am2->setValue(0, 0, 1)); ok = true; doTest(am2->value(0, 0, &ok) == 0); doTest(!ok); doTest(!am2->setValue(1, 1, 5.0)); doTest(am2->value(1, 1) != 5.0); doTest(am2->setValueRaw(2, 2, 6.0)); //fails KstAMatrix* um1 = new KstAMatrix(KstObjectTag::fromString("Unity"), 3, 3, 0.0, 0.0, 1.0, 1.0); um1->setEditable(true); doTest(um1->setValue(0, 0, 1)); doTest(um1->setValue(1, 1, 1)); doTest(um1->setValue(2, 2, 1)); doTest(um1->value(0, 0, &ok) == 1); doTest(ok); doTest(um1->value(0, 1, &ok) == 0); doTest(ok); doTest(um1->value(0, 2, &ok) == 0); doTest(ok); doTest(um1->value(1, 0, &ok) == 0); doTest(ok); doTest(um1->value(1, 1, &ok) == 1); doTest(ok); doTest(um1->value(1, 2, &ok) == 0); doTest(ok); doTest(um1->value(2, 0, &ok) == 0); doTest(ok); doTest(um1->value(2, 1, &ok) == 0); doTest(ok); doTest(um1->value(2, 2, &ok) == 1); doTest(ok); doTest(um1->resize(3, 3, false)); um1->zero(); doTest(um1->value(0, 0, &ok) == 0); doTest(ok); doTest(um1->value(0, 1, &ok) == 0); doTest(ok); doTest(um1->value(0, 2, &ok) == 0); doTest(ok); doTest(um1->value(1, 0, &ok) == 0); doTest(ok); doTest(um1->value(1, 1, &ok) == 0); doTest(ok); doTest(um1->value(1, 2, &ok) == 0); doTest(ok); doTest(um1->value(2, 0, &ok) == 0); doTest(ok); doTest(um1->value(2, 1, &ok) == 0); doTest(ok); doTest(um1->value(2, 2, &ok) == 0); doTest(ok); doTest(um1->setValue(0, 0, 1)); doTest(um1->setValue(1, 1, 1)); doTest(um1->setValue(2, 2, 1)); doTest(um1->resize(2, 2, false)); doTest(um1->sampleCount() == 4); doTest(um1->value(0, 0, &ok) == 1); doTest(ok); doTest(um1->value(0, 1, &ok) == 0); doTest(ok); doTest(um1->value(0, 2, &ok) == 0); doTest(!ok); doTest(um1->value(1, 0, &ok) == 0); doTest(ok); doTest(um1->value(1, 1, &ok) == 1); doTest(ok); doTest(um1->value(1, 2, &ok) == 0); doTest(!ok); doTest(um1->resize(4, 4, false)); doTest(um1->value(0, 0, &ok) == 1); doTest(ok); doTest(um1->value(0, 1, &ok) == 0); doTest(ok); doTest(um1->value(0, 2, &ok) == 0); doTest(ok); doTest(um1->value(0, 3, &ok) == 0); doTest(ok); doTest(um1->value(1, 0, &ok) == 0); doTest(ok); doTest(um1->value(1, 1, &ok) == 1); doTest(ok); doTest(um1->value(1, 2, &ok) == 0); doTest(ok); doTest(um1->value(1, 3, &ok) == 0); doTest(ok); doTest(um1->value(2, 0, &ok) == 0); doTest(ok); doTest(um1->value(2, 1, &ok) == 0); doTest(ok); doTest(um1->value(2, 2, &ok) == 0); doTest(ok); doTest(um1->value(2, 3, &ok) == 0); doTest(ok); doTest(um1->value(3, 0, &ok) == 0); doTest(ok); doTest(um1->value(3, 1, &ok) == 0); doTest(ok); doTest(um1->value(3, 2, &ok) == 0); doTest(ok); doTest(um1->value(3, 3, &ok) == 0); doTest(ok); doTest(um1->resize(3, 3, false)); doTest(um1->setValue(0, 0, 1.716299)); doTest(um1->setValue(0, 1, -0.485527)); doTest(um1->setValue(0, 2, -0.288690)); doTest(um1->setValue(1, 0, 1.716299)); doTest(um1->setValue(1, 1, NAN)); doTest(um1->setValue(1, 2, -0.274957)); doTest(um1->setValue(2, 0, 1.711721)); doTest(um1->setValue(2, 1, -0.485527)); doTest(um1->setValue(2, 2, -0.293267)); doTest(um1->value(0, 0) == 1.716299); doTest(um1->value(0, 1) == -0.485527); doTest(um1->value(0, 2) == -0.288690); doTest(um1->value(1, 0) == 1.716299); doTest(um1->value(1, 1) == 0); doTest(um1->value(1, 2) == -0.274957); doTest(um1->value(2, 0) == 1.711721); doTest(um1->value(2, 1) == -0.485527); doTest(um1->value(2, 2) == -0.293267); doTest(um1->minValue() == 0); doTest(um1->maxValue() == 0); KstAMatrix* sm = new KstAMatrix(KstObjectTag::fromString("Spike"), 2, 2, 0.0, 0.0, 1.0, 1.0); sm->setEditable(true); doTest(sm->resize(2, 2, false)); doTest(sm->xNumSteps() == 2); doTest(sm->yNumSteps() == 2); doTest(sm->setValueRaw(0, 0, 0.0)); doTest(sm->setValueRaw(0, 1, 0.1)); doTest(sm->setValueRaw(1, 0, 1.0)); doTest(sm->setValueRaw(1, 1, 1.1)); sm->calcNoSpikeRange(0); doTest(sm->minValueNoSpike() == 0.0); doTest(sm->maxValueNoSpike() == 0.0); sm->calcNoSpikeRange(-100); doTest(sm->minValueNoSpike() == 0.0); doTest(sm->maxValueNoSpike() == 0.0); sm->calcNoSpikeRange(0.9); doTest(sm->minValueNoSpike() >= 1E+300 ); doTest(sm->maxValueNoSpike() <= -1E+300); } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before app goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } Kst-2.0.8/old_tests/planck/0000755000175000017500000000000012277111530014625 5ustar synthsynthKst-2.0.8/old_tests/planck/toigen.c0000644000175000017500000000263212277111530016261 0ustar synthsynth/* No Copyright * Written By Staikos Computing Services Inc * Released to the public domain without warranty. */ #include #include #include #include #include #include int main(int argc, char **argv) { int VECSZ = 10240; PIOFLOAT vec[VECSZ]; register int i = 0; char *toi, *roi, *obj; PIOLONG rc1; PIOErr rc2; if (argc < 5) { fprintf(stderr, "usage: %s \n", argv[0]); return -1; } for (; i < VECSZ; ++i) { vec[i] = sin(((float)i) / 2000.0); } toi = (char *)malloc(strlen(argv[1]) + strlen(argv[2]) + 50); sprintf(toi, "group:%s:%s", argv[1], argv[2]); roi = (char *)malloc(strlen(argv[1]) + strlen(argv[3]) + 50); sprintf(roi, "group:%s:%s", argv[1], argv[3]); printf("Writing TOI group:\n[%s]\n[%s]\n", toi, roi); if (0 > (rc1 = PIOCreateTOIGrp(toi, roi, 0))) { fprintf(stderr, "Error writing TOI group. rc=%ld\n", rc1); free(roi); free(toi); return -2; } obj = (char *)malloc(strlen(argv[1]) + strlen(argv[2]) + strlen(argv[4]) + 50); sprintf(obj, "object:%s:%s:%s", argv[1], argv[2], argv[4]); if (VECSZ != (rc2 = PIOWriteTOIObject(vec, obj, "PIOFLOAT", "begin=42;end=10281", NULL))) { fprintf(stderr, "Error writing object. rc=%ld [%s]\n", rc2, PIOErrMess(rc2)); free(obj); free(roi); free(toi); return -3; } free(obj); free(roi); free(toi); return 0; } Kst-2.0.8/old_tests/testcsd.cpp0000644000175000017500000001576712277111530015552 0ustar synthsynth/* * Copyright 2005, The University of Toronto * Licensed under GPL. */ #include "ksttestcase.h" #include "kstcsd.h" #include #include #include #include #include static void exitHelper() { KST::dataSourceList.clear(); KST::scalarList.clear(); KST::dataObjectList.clear(); } int rc = KstTestSuccess; #define doTest(x) testAssert(x, QString("Line %1").arg(__LINE__)) #define doTestD(x, y) testAssert(x, QString("%1: %2").arg(__LINE__).arg(y)) void testAssert(bool result, const QString& text = "Unknown") { if (!result) { KstTestFailed(); printf("Test [%s] failed.\n", text.toLatin1().data()); } } QDomDocument makeDOMElement(const QString& tag, const QString& val) { // Should be some boundary checking in the constructor. QDomDocument csdDOM("csddocument"); QDomElement csdElement, child; QDomText text; csdElement = csdDOM.createElement("csdDOMTest"); child = csdDOM.createElement("tag"); text = csdDOM.createTextNode(tag); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("vectag"); text = csdDOM.createTextNode(val); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("sampRate"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("average"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("fiftLen"); text = csdDOM.createTextNode("5"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("adopize"); text = csdDOM.createTextNode("0"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("apodizefxn"); text = csdDOM.createTextNode("WindowOriginal"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("gaussiansigma"); text = csdDOM.createTextNode("0.01"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("removeMean"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("windowsize"); text = csdDOM.createTextNode("5000"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("vectorunits"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("rateunits"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); child = csdDOM.createElement("output"); text = csdDOM.createTextNode("1"); child.appendChild(text); csdElement.appendChild(child); csdDOM.appendChild(csdElement); return csdDOM; } void doTests() { KstVectorPtr vp = new KstVector(KstObjectTag::fromString("tempVector"), 10); for (int i = 0; i < 10; i++){ vp->value()[i] = i; } KstCSDPtr csd = new KstCSD("csdTest", vp, 0.0, false, false, false, WindowUndefined, 0, 0, 0.0, PSDUndefined, QString::null, QString::null); doTest(csd->tagName() == "csdTest"); doTest(csd->vTag() == "tempVector"); doTest(csd->output() == PSDUndefined); doTest(!csd->apodize()); doTest(!csd->removeMean()); doTest(!csd->average()); doTest(csd->freq() == 1.0); doTest(csd->apodizeFxn() == WindowUndefined); doTest(csd->length() == 0); doTest(csd->windowSize() == 0); doTest(csd->gaussianSigma() == 0); doTest(csd->vectorUnits().isEmpty()); doTest(csd->rateUnits().isEmpty()); csd->setOutput(PSDAmplitudeSpectralDensity); csd->setApodize(true); csd->setRemoveMean(true); csd->setAverage(true); csd->setFreq(0.1); csd->setApodizeFxn(WindowOriginal); csd->setLength(3); csd->setWindowSize(50); csd->setGaussianSigma(0.2); doTest(csd->tagName() == "csdTest"); doTest(csd->vTag() == "tempVector"); doTest(csd->output() == PSDAmplitudeSpectralDensity); doTest(csd->apodize()); doTest(csd->removeMean()); doTest(csd->average()); doTest(csd->freq() == 0.1); doTest(csd->windowSize() == 50); doTest(csd->apodizeFxn() == WindowOriginal); doTest(csd->gaussianSigma() == 0.2); // KTempFile tf(locateLocal("tmp", "kst-csd"), "txt"); // QFile *qf = tf.file(); // QTextStream ts(qf); // csd->save(ts, ""); QDomNode n = makeDOMElement("csdDOMCsd", "csdDOMVector").firstChild(); QDomElement e = n.toElement(); KstCSDPtr csdDOM = new KstCSD(e); doTest(csdDOM->tagName() == "csdDOMCsd"); doTest(csdDOM->output() == PSDPowerSpectralDensity); doTest(csdDOM->apodize()); doTest(csdDOM->removeMean()); doTest(csdDOM->average()); doTest(csdDOM->freq() == 1); doTest(csdDOM->apodizeFxn() == WindowOriginal); doTest(csdDOM->gaussianSigma() == 0.01); doTest(csdDOM->windowSize() == 5000); KstVectorPtr vp2 = new KstVector(KstObjectTag::fromString("tempVector2"), 10); for (int i = 0; i < 10; i++){ vp2->value()[i] = i; } csdDOM->setVector(vp2); doTest(csdDOM->vTag() == "tempVector2"); csdDOM->setWindowSize(9); KstMatrixPtr outMatrix = csdDOM->outputMatrix(); doTest(outMatrix->resize(3, 3, false)); // very odd thing to do? doTest(outMatrix->setValue(0, 0, 1.716299)); doTest(outMatrix->setValue(0, 1, -0.485527)); doTest(outMatrix->setValue(0, 2, -0.288690)); doTest(outMatrix->setValue(1, 0, 1.716299)); doTest(outMatrix->setValue(1, 1, NAN)); doTest(outMatrix->setValue(1, 2, -0.274957)); doTest(outMatrix->setValue(2, 0, 1.711721)); doTest(outMatrix->setValue(2, 1, -0.485527)); doTest(outMatrix->setValue(2, 2, -0.293267)); doTest(outMatrix->sampleCount() == 9); doTest(outMatrix->value(0, 0) == 1.716299); doTest(outMatrix->value(0, 1) == -0.485527); doTest(outMatrix->value(0, 2) == -0.288690); doTest(outMatrix->value(1, 0) == 1.716299); doTest(outMatrix->value(1, 1) == 0); doTest(outMatrix->value(1, 2) == -0.274957); doTest(outMatrix->value(2, 0) == 1.711721); doTest(outMatrix->value(2, 1) == -0.485527); doTest(outMatrix->value(2, 2) == -0.293267); doTest(csdDOM->update(0) == KstObject::UPDATE); outMatrix = csdDOM->outputMatrix(); doTest(outMatrix->sampleCount() == 128); csdDOM->setWindowSize(11); doTest(outMatrix->sampleCount() == 128); doTest(outMatrix->value(0, 0) == 1.716299); doTest(outMatrix->value(0, 1) == -0.485527); doTest(outMatrix->value(0, 2) == -0.288690); doTest(outMatrix->value(1, 0) == 1.716299); doTest(outMatrix->value(1, 1) == 0); doTest(outMatrix->value(1, 2) == -0.274957); doTest(outMatrix->value(2, 0) == 1.711721); doTest(outMatrix->value(2, 1) == -0.485527); doTest(outMatrix->value(2, 2) == -0.293267); } int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); doTests(); // Don't put tests in main because we need to ensure that no KstObjects // remain past the exit handler exitHelper(); // need to run it here before kapp goes away in some cases. if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } Kst-2.0.8/old_tests/testeqparser.cpp0000644000175000017500000003500312277111530016604 0ustar synthsynth/* * Copyright 2004, The University of Toronto * Licensed under GPL. */ //#define DUMP_FAIL_MSGS #include "ksttestcase.h" #include #include extern "C" int yyparse(); extern "C" void *ParsedEquation; extern "C" struct yy_buffer_state *yy_scan_string(const char*); bool optimizerFailed = false; KstVectorMap vectorsUsed; KstVectorPtr xVector; int rc = KstTestSuccess; void testText(const char *equation, const char *expect) { bool failure = false; QString txt; yy_scan_string(equation); int rc = yyparse(); if (rc == 0) { vectorsUsed.clear(); Equation::Node *eq = static_cast(ParsedEquation); assert(eq); ParsedEquation = 0L; //eq->collectVectors(vectorsUsed); txt = eq->text(); failure = txt != expect; delete eq; } else { // Parse error delete (Equation::Node*)ParsedEquation; ParsedEquation = 0L; failure = true; } if (failure) { if (!Equation::errorStack.isEmpty()) { printf("Failures on [%s] -------------------------\n", equation); for (QStringList::ConstIterator i = Equation::errorStack.constBegin(); i != Equation::errorStack.constEnd(); ++i) { printf("%s\n", (*i).toLatin1().data()); } printf("------------------------------------------\n"); } else { printf("Got [%s], expected [%s]\n", txt.toLatin1().data(), expect); } --rc; } } bool doTest(const char *equation, double x, double result, const double tol = 0.00000000001) { yy_scan_string(equation); int rc = yyparse(); if (rc == 0) { vectorsUsed.clear(); Equation::Node *eq = static_cast(ParsedEquation); assert(eq); ParsedEquation = 0L; Equation::Context ctx; ctx.sampleCount = 2; ctx.noPoint = NOPOINT; ctx.x = x; ctx.xVector = xVector; if (xVector) { ctx.sampleCount = xVector->length(); } Equation::FoldVisitor vis(&ctx, &eq); if (eq->isConst() && !dynamic_cast(eq)) { if (!optimizerFailed) { optimizerFailed = true; ::rc--; printf("Optimizer bug: found an unoptimized const equation. Optimizing for coverage purposes.\n"); } double v = eq->value(&ctx); delete eq; eq = new Equation::Number(v); } KstScalarMap scm; KstStringMap stm; eq->collectObjects(vectorsUsed, scm, stm); eq->update(-1, &ctx); double v = eq->value(&ctx); delete eq; if (fabs(v - result) < tol || (result != result && v != v) || (result == INF && v == INF) || (result == -INF && v == -INF)) { return true; } else { printf("Result: %.16f\n", v); return false; } } else { // Parse error printf("Failures on [%s] -------------------------\n", equation); for (QStringList::ConstIterator i = Equation::errorStack.constBegin(); i != Equation::errorStack.constEnd(); ++i) { printf("%s\n", (*i).toLatin1().data()); } printf("------------------------------------------\n"); delete (Equation::Node*)ParsedEquation; ParsedEquation = 0L; return false; } } void test(const char *equation, double x, double result, const double tol = 0.00000000001) { if (!doTest(equation, x, result, tol)) { rc--; printf("Test of (%s)[%.16f] == %.16f failed.\n", equation, x, result); } } void testParseFail(const char *equation) { yy_scan_string(equation); if (0 == yyparse()) { printf("Test of (%s) parsing passed, but should have failed.\n", equation); rc--; } else { if (Equation::errorStack.count() == 1 && (Equation::errorStack.first() == "parse error" || Equation::errorStack.first() == "syntax error")) { printf("ERROR: [%s] doesn't have error handling yet!\n", equation); rc--; #ifdef DUMP_FAIL_MSGS } else { printf("Failures on [%s] -------------------------\n", equation); for (QStringList::ConstIterator i = Equation::errorStack.constBegin(); i != Equation::errorStack.constEnd(); ++i) { printf("%s\n", (*i).toLatin1().data()); } printf("------------------------------------------\n"); #endif } } } static void exitHelper() { xVector = 0L; vectorsUsed.clear(); KST::vectorList.clear(); KST::scalarList.clear(); } extern int yydebug; int main(int argc, char **argv) { atexit(exitHelper); QCoreApplication app(argc, argv); // Base cases test("0", 1.0, 0.0); test("1.0", 2.0, 1.0); // Basics test("x", -1.0, -1.0); test("-x", -1.0, 1.0); test("x^2", -1.0, 1.0); test(" x^2", -1.0, 1.0); test(" x^2 ", -1.0, 1.0); test("x^2 ", -1.0, 1.0); test("x^2 + x^2", -1.0, 2.0); test("y", 0.0, NOPOINT); test("foo()", 0.0, NOPOINT); test("foo(1.0, 2.0, 3.0)", 0.0, NOPOINT); // Order of evaluation and parser issues test("-x^2", 2.0, -4.0); test("(-x)^2", 2.0, 4.0); test("-(x^2)", 2.0, -4.0); test("(-x^2)", 2.0, -4.0); test("x*x+5", 2.0, 9.0); test("5+x*x", 2.0, 9.0); test("5*4/2*5", 1.0, 50.0); test("asin(sin(x))", 3.14159265358979323, 0.0); test("x^(1/2)", 2.0, sqrt(2.0)); test("x^(1/2)*2", 2.0, 2.0*sqrt(2.0)); test("(1/2)*x^2+3*x-5", 1.0, -1.5); test("2^3^4", 0.0, 2417851639229258349412352.0); test("sin(x)^2", 0.5*3.14159265358979323, 1.0); test("(2)^(3)", 0.0, 8); test("(2*3)^(3*4)", 0.0, 2176782336.0); test("sin(x^2)", sqrt(3.14159265358979323), 0.0); test("5*4/2", 0.0, 10.0); test("5/4*2", 0.0, 2.5); test("10%2", 0.0, 0.0); test("10.5%2", 0.0, 0.5); test("0%2", 0.0, 0.0); test("2%0", 0.0, NOPOINT); test("--x", 1.0, 1.0); test("--x", -1.0, -1.0); test("---x", -1.0, 1.0); test("---x", 1.0, -1.0); // Constants test("e", 0.0, 2.7128182846); test("pi", 0.0, 3.1415926536); // Functions test("sin()", 0.0, NOPOINT); test("sin(0.0)", 0.0, 0.0); test("sin(3.14159265358979323)", 0.0, 0.0); test("sin(3.14159265358979323/2.00000000000000000000000000)", 0.0, 1.0); test("cos()", 0.0, NOPOINT); test("cos(0.0)", 0.0, 1.0); test("cos(3.14159265358979323)", 0.0, -1.0); test("cos(3.14159265358979323/2.00000000000000000000000000)", 0.0, 0.0); test("sec(x) == 1/cos(x)", 0.2332744, 1.0); test("csc(x) == 1/sin(x)", 0.2332744, 1.0); test("cot(x) == 1/tan(x)", 0.2332744, 1.0); test("abs(0.0)", 0.0, 0.0); test("abs(x)", 1.0, 1.0); test("abs(x)", -1.0, 1.0); test("abs(x)", NOPOINT, NOPOINT); test("abs(x)", INF, INF); test("abs(x)", -INF, INF); test("abs(-0.000000000001)", 0.0, 0.000000000001); test("cos(acos(x))", 0.3875823288, 0.3875823288, 0.0000000001); test("acos(cos(x))", 2.3875823288, 2.3875823288, 0.0000000001); test("asin(sin(x))", 0.7540103248, 0.7540103248, 0.0000000001); test("sin(asin(x))", 0.3875823288, 0.3875823288, 0.0000000001); test("tan(atan(x))", 2.3875823288, 2.3875823288, 0.0000000001); test("atan(tan(x))", 0.3875823288, 0.3875823288, 0.0000000001); test("sqrt(4) == 2.0", 0.0, 1.0); test("sqrt(0) == 0.0", 0.0, 1.0); test("sqrt(-1)", 0.0, NOPOINT); test("sqrt(2)", 0.0, 1.4142135623730951); test("cbrt(0.0) == 0.0", 0.0, 1.0); test("cbrt(8.0) == 2.0", 0.0, 1.0); test("cbrt(-1)", 0.0, -1.0); test("cbrt(2)", 0.0, 1.2599210498948734); // TODO: cosh, exp, log, ln, sinh, tanh // Expressions / Comparison test("0.0>0.0", 0.0, 0.0); test("0.0>=0.0", 0.0, 1.0); test("0.0<0.0", 0.0, 0.0); test("0.0<=0.0", 0.0, 1.0); test("0.0=0.0", 0.0, 1.0); test("0.0!=0.0", 0.0, 0.0); test("1.0!=0.0", 0.0, 1.0); test("sin(1.0)!=sin(0.0)", 0.0, 1.0); test("sin()!=sin()", 0.0, 1.0); test("0.0==0.0", 0.0, 1.0); test("1.0>0.0", 0.0, 1.0); test("1.0>=0.0", 0.0, 1.0); test("0.0>1.0", 0.0, 0.0); test("0.0>=1.0", 0.0, 0.0); test("1.0<0.0", 0.0, 0.0); test("1.0<=0.0", 0.0, 0.0); test("0.0<1.0", 0.0, 1.0); test("0.0<=1.0", 0.0, 1.0); test("(0.0/0.0)==(0.0/0.0)", 0.0, 0.0); test("(0.0/0.0)==(1.0/0.0)", 0.0, 0.0); test("(1.0/0.0)==(1.0/0.0)", 0.0, 1.0); // inf == inf test("(1.0/0.0)==-(1.0/0.0)", 0.0, 0.0); test("(0.0/0.0)==-(1.0/0.0)", 0.0, 0.0); test("(1.0/0.0)==(0.0/0.0)", 0.0, 0.0); test("1&&1", 0.0, 1.0); test("1&&0", 0.0, 0.0); test("0&&1", 0.0, 0.0); test("0&&2", 0.0, 0.0); test("3&&2", 0.0, 1.0); test("1||1", 0.0, 1.0); test("0||1", 0.0, 1.0); test("1||0", 0.0, 1.0); test("0||0", 0.0, 0.0); test("2||4", 0.0, 1.0); test("1||(2&&0)", 0.0, 1.0); test("(1||2)&&0", 0.0, 0.0); test("1||2&&0", 0.0, 1.0); test("2&&0||1", 0.0, 1.0); test("2&&1||0", 0.0, 1.0); test("0||1&&0", 0.0, 0.0); test("1.0 == (1.0 == 1.0)", 0.0, 1.0); test("1.0 != (1.0 == 0.0)", 0.0, 1.0); test("1.0 != (1.0 == 1.0)", 0.0, 0.0); test("0.0 == (1.0 == 0.0)", 0.0, 1.0); test("-1==1", 0.0, 0.0); test("-1==-1", 0.0, 1.0); test("1==-1", 0.0, 0.0); test("1!=-1", 0.0, 1.0); test("-1!=1", 0.0, 1.0); test("-1!=-1", 0.0, 0.0); test("!0.0", 0.0, 1.0); test("!1.0", 0.0, 0.0); test("!-1.0", 0.0, 0.0); test("!2.0", 0.0, 0.0); test("!x", INF, 0.0); test("!x", NOPOINT, 1.0); test("!(1 > 2)", 0.0, 1.0); test("!1.0 > -1.0", 0.0, 1.0); // (!1.0) > -1.0 test("!!x", 1.0, 1.0); test("!!!x", 1.0, 0.0); test("!!!!x", 1.0, 1.0); // Bit operations test("32&4", 0.0, 0.0); test("32&4|2", 0.0, 2.0); test("32|4&2", 0.0, 0.0); test("32|4", 0.0, 36.0); test("0&257", 0.0, 0.0); test("257&0", 0.0, 0.0); test("257|0", 0.0, 257.0); test("0|257", 0.0, 257.0); test("-1|257", 0.0, -1); test("257|-1", 0.0, -1); // Scalars new KstScalar(KstObjectTag::fromString("test1"), 0L, 1.0, true); new KstScalar(KstObjectTag::fromString("test2"), 0L, 0.0, true); new KstScalar(KstObjectTag::fromString("test3"), 0L, -1.0, true); new KstScalar(KstObjectTag::fromString("test4"), 0L, NOPOINT, true); new KstScalar(KstObjectTag::fromString("test5"), 0L, INF, true); new KstScalar(KstObjectTag::fromString("test6"), 0L, -INF, true); test("[test1]", 0.0, 1.0); test("[test4]", 0.0, NOPOINT); test("[test4] - [test4]", 0.0, NOPOINT); test("[test4] - [test5]", 0.0, NOPOINT); test("[test4]*[test5]", 0.0, NOPOINT); test("[sdf]", 0.0, NOPOINT); test("[=10+10]", 0.0, 20.0); // Vectors KstVector::generateVector(0, 1.0, 10, KstObjectTag::fromString("1")); KstVector::generateVector(0, 1.0, 10, KstObjectTag::fromString("V1")); KstVector::generateVector(1.0, 2.0, 10, KstObjectTag::fromString("V2")); KstVector::generateVector(0, 1.0, 2, KstObjectTag::fromString("V3")); KstVector::generateVector(-1.0, 1.0, 1000, KstObjectTag::fromString("V4")); KstVector::generateVector(-1.0, 1.0, 1000, KstObjectTag::fromString("V5-%+-_!")); test("[V2] - [V1]", 0.0, 1.0); test("[V2[9]]", 0.0, 2.0); test("[V2[5+4]]", 0.0, 2.0); test("[V2[]]", 0.0, 1.0); test("2*sin([V5-%+-_!])", 0.0, -1.6829419696157930); // TODO: interpolation, more vector combinations // Plugins test("2*plugin(bin, [V4], 12)", 1.0, -1.9779779779779778); test("4*plugin(bin, [V4], x)", 5.0, -3.9839839839839839); test("-3*plugin(bin, x, 12)", 2.0, NOPOINT); xVector = KstVector::generateVector(0, 100, 2000, KstObjectTag::fromString("XVector")); test("-3*plugin(bin, x, 12)", 2.0, -0.8254127063531767); test("-3*plugin(bin, y, 12)", 2.0, NOPOINT); // TODO: more plugin tests // TODO: float notation // Combinations test("1|0&&0", 0.0, 0.0); test("0&&0|1", 0.0, 0.0); test("0&&1|0", 0.0, 0.0); test("0||1&1", 0.0, 1.0); test("0||2&1", 0.0, 0.0); test("2&1||0", 0.0, 0.0); test("1-1||0", 0.0, 0.0); test("2-2||0", 0.0, 0.0); test("0||2-2", 0.0, 0.0); test("8|2*2", 0.0, 12.0); test("2*2|8", 0.0, 12.0); test("[V1] > 0.0", 0.0, 0.0); test("[V1] > -1.0", 0.0, 1.0); test("[1] > 0.0", 0.0, 0.0); test("[1] > -1.0", 0.0, 1.0); test("-([V1]*sin([V1]*[V2])+[V3]*cos([V3]*[V3]))", 0.0, 0.0); test("[V3] * -1", 0.0, 0.0); /* Wrap a testcase with this and run bison with -t in order to get a trace * of the parse stack */ #if 0 yydebug = 1; yydebug = 0; #endif // Errors: testParseFail(""); testParseFail(" "); testParseFail("\t"); testParseFail(" \t \t"); testParseFail("[]"); testParseFail("[[]"); testParseFail("[]]"); testParseFail("]"); testParseFail("["); testParseFail("]["); testParseFail("[]["); testParseFail("foo(, 3)"); testParseFail("foo(3,)"); testParseFail("foo(3,,5)"); testParseFail("foo([])"); testParseFail("foo(4, [])"); testParseFail("/"); testParseFail("/2"); testParseFail("2/"); testParseFail("2//2"); testParseFail("%"); testParseFail("%2"); testParseFail("2%"); testParseFail("2%%2"); testParseFail("|"); testParseFail("||"); testParseFail("|2"); testParseFail("2|"); testParseFail("||2"); testParseFail("2||"); testParseFail("2|||2"); testParseFail("&"); testParseFail("&&"); testParseFail("&2"); testParseFail("2&"); testParseFail("&&2"); testParseFail("2&&"); testParseFail("2&&&2"); testParseFail("*"); testParseFail("*2"); testParseFail("2*"); testParseFail("2**2"); testParseFail("^"); testParseFail("^2"); testParseFail("2^^2"); testParseFail("2^"); testParseFail("+"); testParseFail("+2"); testParseFail("2+"); testParseFail("2++2"); testParseFail("-"); testParseFail("2-"); testParseFail("-2-"); testParseFail("2!"); testParseFail("!"); testParseFail("()"); testParseFail("2()"); testParseFail("()2"); testParseFail("_"); testParseFail("#"); testParseFail("$"); testParseFail(")"); testParseFail("("); testParseFail(")("); testParseFail("2&|2"); testParseFail("2&&||2"); testParseFail("2&&+2"); testParseFail("2+&&2"); testParseFail("2*&&2"); testParseFail("2&&*2"); testParseFail("2<>2"); testParseFail("2=<2"); testParseFail("2=>2"); testParseFail("2><2"); testParseFail("<"); testParseFail("<2"); testParseFail("2<"); testParseFail("2<<2"); testParseFail(">"); testParseFail(">2"); testParseFail("2>"); testParseFail("2>>2"); testParseFail(">="); testParseFail(">=2"); testParseFail("2>="); testParseFail("2>=>=2"); testParseFail("<="); testParseFail("<=2"); testParseFail("2<="); testParseFail("2<=<=2"); testParseFail("2<==2"); testParseFail("."); testParseFail(".2"); testParseFail("2."); testParseFail(","); testParseFail(",2"); testParseFail("2,"); // Doesn't give a specific error - how to catch this? testParseFail("2*sin(x"); testParseFail("2*sin(x)()"); testText("3*x", "3*x"); testText("(3*x)", "(3*x)"); testText("3*(x)", "3*x"); testText("((3*x))", "(3*x)"); testText(" ((3 * x)) ", "(3*x)"); testText(" ((3 * x)) ", "(3*x)"); testText("(-3)", "(-3)"); testText("(x)", "x"); testText("(3*(-(x+5)))", "(3*(-(x+5)))"); testText("(sin((x)))", "sin(x)"); exitHelper(); if (rc == KstTestSuccess) { printf("All tests passed!\n"); } return -rc; } // vim: ts=2 sw=2 et Kst-2.0.8/old_tests/datagenerator.pl0000755000175000017500000000063112277111530016535 0ustar synthsynth#!/usr/bin/perl # open(OUTPUT, ">$ARGV[0]") || die "Can't open $ARGV[0]: $!"; $i = 0; while (true) { print OUTPUT "$i "; $ii = $i/10; print OUTPUT sin($ii) + rand(0.4) - 0.2; print OUTPUT " "; print OUTPUT cos($ii) + rand(0.4) - 0.2; print OUTPUT " "; print OUTPUT sin($ii * $ii) * (cos($ii) + rand(0.4) - 0.2); print OUTPUT " "; print OUTPUT "\n"; $i++; select(undef, undef, undef, 0.001); } Kst-2.0.8/old_tests/asciimatrix.txt0000644000175000017500000007356212277111530016450 0ustar synthsynthtest1 test2 [MATRIX,50,0,0,0.5,0.5] 1.716299 -0.485527 -0.288690 1.716299 -0.476371 -0.274957 1.711721 -0.485527 -0.293267 1.711721 -0.480949 -0.293267 1.716299 -0.494682 -0.284112 1.716299 -0.480949 -0.279535 1.711721 -0.494682 -0.288690 1.707144 -0.490104 -0.284112 1.711721 -0.494682 -0.274957 1.711721 -0.499259 -0.284112 1.707144 -0.503837 -0.288690 1.707144 -0.494682 -0.279535 1.707144 -0.494682 -0.274957 1.707144 -0.503837 -0.279535 1.707144 -0.490104 -0.279535 1.711721 -0.494682 -0.284112 1.702566 -0.499259 -0.288690 1.702566 -0.499259 -0.284112 1.702566 -0.490104 -0.288690 1.697989 -0.490104 -0.293267 1.697989 -0.490104 -0.293267 1.697989 -0.485527 -0.293267 1.697989 -0.485527 -0.297845 1.693411 -0.485527 -0.302423 1.697989 -0.485527 -0.302423 1.693411 -0.490104 -0.307000 1.693411 -0.499259 -0.302423 1.697989 -0.499259 -0.311578 1.693411 -0.499259 -0.297845 1.693411 -0.499259 -0.297845 1.688833 -0.503837 -0.284112 1.684256 -0.503837 -0.274957 1.688833 -0.508415 -0.265802 1.693411 -0.508415 -0.270379 1.679678 -0.494682 -0.256647 1.688833 -0.494682 -0.265802 1.679678 -0.499259 -0.261224 1.665945 -0.490104 -0.265802 1.656790 -0.485527 -0.274957 1.643057 -0.485527 -0.270379 1.620169 -0.490104 -0.279535 1.601859 -0.485527 -0.274957 1.574393 -0.485527 -0.288690 1.551505 -0.485527 -0.284112 1.524040 -0.494682 -0.288690 1.505729 -0.494682 -0.297845 1.478264 -0.494682 -0.311578 1.441643 -0.503837 -0.302423 1.418755 -0.503837 -0.302423 1.386712 -0.508415 -0.297845 1.354669 -0.503837 -0.297845 1.331781 -0.503837 -0.297845 1.290582 -0.494682 -0.297845 1.263117 -0.499259 -0.293267 1.240229 -0.499259 -0.270379 1.203608 -0.494682 -0.279535 1.171565 -0.485527 -0.274957 1.130366 -0.476371 -0.284112 1.098323 -0.480949 -0.279535 1.070857 -0.485527 -0.274957 1.043392 -0.480949 -0.274957 1.006771 -0.476371 -0.279535 0.983883 -0.476371 -0.274957 0.942685 -0.471794 -0.270379 0.915219 -0.476371 -0.270379 0.878598 -0.480949 -0.284112 0.846555 -0.480949 -0.293267 0.809934 -0.480949 -0.293267 0.787046 -0.485527 -0.293267 0.750425 -0.485527 -0.288690 0.727537 -0.480949 -0.302423 0.695494 -0.485527 -0.297845 0.658873 -0.485527 -0.297845 0.640563 -0.480949 -0.307000 0.594787 -0.476371 -0.297845 0.562744 -0.471794 -0.307000 0.521545 -0.476371 -0.302423 0.494080 -0.476371 -0.297845 0.462037 -0.471794 -0.302423 0.429993 -0.471794 -0.297845 0.402528 -0.467216 -0.297845 0.370485 -0.471794 -0.297845 0.333864 -0.471794 -0.284112 0.301821 -0.476371 -0.288690 0.265200 -0.476371 -0.288690 0.237734 -0.476371 -0.284112 0.201113 -0.480949 -0.279535 0.173648 -0.480949 -0.284112 0.137027 -0.480949 -0.279535 0.104984 -0.471794 -0.288690 0.072941 -0.471794 -0.284112 0.040897 -0.476371 -0.274957 -0.004879 -0.471794 -0.284112 -0.032344 -0.469505 -0.288690 -0.059810 -0.467216 -0.293267 -0.096431 -0.467216 -0.293267 -0.123896 -0.462639 -0.297845 -0.151362 -0.458061 -0.307000 -0.192560 -0.462639 -0.297845 -0.229181 -0.462639 -0.307000 -0.261224 -0.462639 -0.307000 -0.288690 -0.467216 -0.302423 -0.320733 -0.471794 -0.302423 -0.357354 -0.471794 -0.311578 -0.380242 -0.476371 -0.311578 -0.421440 -0.480949 -0.307000 -0.444328 -0.476371 -0.302423 -0.476371 -0.476371 -0.311578 -0.512992 -0.476371 -0.297845 -0.545035 -0.476371 -0.288690 -0.577079 -0.490104 -0.288690 -0.604544 -0.471794 -0.284112 -0.641165 -0.458061 -0.284112 -0.664053 -0.462639 -0.279535 -0.709829 -0.462639 -0.274957 -0.737295 -0.458061 -0.288690 -0.769338 -0.462639 -0.279535 -0.796803 -0.453483 -0.284112 -0.833424 -0.448906 -0.297845 -0.865467 -0.453483 -0.297845 -0.888355 -0.462639 -0.288690 -0.924976 -0.458061 -0.297845 -0.961597 -0.467216 -0.297845 -0.993640 -0.467216 -0.316155 -1.034839 -0.462639 -0.297845 -1.062304 -0.467216 -0.307000 -1.080615 -0.480949 -0.316155 -1.117235 -0.462639 -0.320733 -1.158434 -0.467216 -0.307000 -1.185899 -0.467216 -0.311578 -1.227098 -0.471794 -0.316155 -1.249986 -0.467216 -0.307000 -1.286607 -0.453483 -0.307000 -1.314072 -0.458061 -0.311578 -1.346115 -0.458061 -0.302423 -1.382736 -0.448906 -0.293267 -1.405624 -0.448906 -0.293267 -1.442245 -0.444328 -0.293267 -1.465133 -0.453483 -0.293267 -1.501754 -0.453483 -0.284112 -1.538375 -0.453483 -0.279535 -1.561263 -0.458061 -0.284112 -1.588728 -0.462639 -0.288690 -1.616194 -0.453483 -0.284112 -1.652815 -0.462639 -0.284112 -1.689435 -0.458061 -0.288690 -1.707746 -0.453483 -0.288690 -1.739789 -0.453483 -0.293267 -1.753522 -0.453483 -0.302423 -1.790143 -0.444328 -0.302423 -1.817608 -0.444328 -0.307000 -1.840496 -0.439751 -0.316155 -1.863384 -0.439751 -0.311578 -1.881695 -0.435173 -0.320733 -1.913738 -0.435173 -0.325311 -1.941203 -0.448906 -0.325311 -1.959514 -0.439751 -0.311578 -1.991557 -0.444328 -0.311578 -2.005290 -0.453483 -0.316155 -2.032755 -0.453483 -0.302423 -2.064799 -0.448906 -0.311578 -2.078531 -0.462639 -0.311578 -2.101419 -0.458061 -0.302423 -2.119730 -0.458061 -0.307000 -2.142618 -0.453483 -0.302423 -2.165506 -0.453483 -0.288690 -2.188394 -0.453483 -0.288690 -2.202127 -0.444328 -0.307000 -2.225015 -0.444328 -0.297845 -2.243325 -0.444328 -0.293267 -2.270791 -0.439751 -0.293267 -2.284523 -0.435173 -0.293267 -2.302834 -0.435173 -0.302423 -2.321144 -0.430595 -0.302423 -2.339455 -0.435173 -0.302423 -2.366920 -0.439751 -0.307000 -2.389808 -0.439751 -0.302423 -2.403541 -0.448906 -0.311578 -2.426429 -0.439751 -0.307000 -2.440162 -0.444328 -0.316155 -2.458472 -0.458061 -0.316155 -2.481360 -0.448906 -0.334466 -2.490515 -0.448906 -0.325311 -2.499671 -0.458061 -0.329888 -2.527136 -0.448906 -0.325311 -2.540869 -0.448906 -0.311578 -2.554602 -0.444328 -0.311578 -2.568335 -0.439751 -0.316155 -2.586645 -0.444328 -0.311578 -2.591223 -0.444328 -0.307000 -2.614111 -0.439751 -0.302423 -2.623266 -0.453483 -0.307000 -2.636999 -0.444328 -0.293267 -2.641576 -0.448906 -0.293267 -2.646154 -0.458061 -0.293267 -2.664464 -0.444328 -0.293267 -2.664464 -0.453483 -0.293267 -2.669042 -0.462639 -0.293267 -2.682775 -0.458061 -0.297845 -2.687352 -0.453483 -0.307000 -2.696507 -0.448906 -0.307000 -2.705663 -0.435173 -0.316155 -2.701085 -0.430595 -0.316155 -2.710240 -0.426018 -0.316155 -2.714818 -0.416863 -0.307000 -2.733128 -0.421440 -0.307000 -2.719395 -0.416863 -0.311578 -2.719395 -0.421440 -0.311578 -2.728551 -0.421440 -0.307000 -2.733128 -0.421440 -0.311578 -2.728551 -0.430595 -0.311578 -2.728551 -0.444328 -0.311578 -2.733128 -0.453483 -0.311578 -2.737706 -0.458061 -0.320733 -2.728551 -0.462639 -0.311578 -2.737706 -0.471794 -0.316155 -2.733128 -0.467216 -0.316155 -2.728551 -0.471794 -0.316155 -2.737706 -0.462639 -0.320733 -2.733128 -0.458061 -0.320733 -2.723973 -0.453483 -0.311578 -2.733128 -0.439751 -0.311578 -2.728551 -0.435173 -0.320733 -2.723973 -0.426018 -0.307000 -2.728551 -0.421440 -0.307000 -2.719395 -0.416863 -0.297845 -2.719395 -0.421440 -0.293267 -2.719395 -0.412285 -0.297845 -2.710240 -0.416863 -0.297845 -2.719395 -0.430595 -0.293267 -2.710240 -0.430595 -0.316155 -2.714818 -0.435173 -0.297845 -2.723973 -0.435173 -0.302423 -2.719395 -0.439751 -0.307000 -2.714818 -0.453483 -0.316155 -2.719395 -0.448906 -0.316155 -2.714818 -0.444328 -0.325311 -2.714818 -0.448906 -0.320733 -2.719395 -0.439751 -0.329888 -2.705663 -0.439751 -0.334466 -2.701085 -0.448906 -0.316155 -2.710240 -0.435173 -0.311578 -2.710240 -0.430595 -0.316155 -2.705663 -0.435173 -0.311578 -2.705663 -0.426018 -0.293267 -2.705663 -0.444328 -0.302423 -2.696507 -0.453483 -0.302423 -2.701085 -0.448906 -0.288690 -2.687352 -0.448906 -0.302423 -2.691930 -0.453483 -0.307000 -2.696507 -0.458061 -0.302423 -2.687352 -0.462639 -0.311578 -2.691930 -0.458061 -0.311578 -2.696507 -0.453483 -0.320733 -2.691930 -0.453483 -0.316155 -2.691930 -0.458061 -0.329888 -2.687352 -0.435173 -0.325311 -2.691930 -0.430595 -0.329888 -2.691930 -0.421440 -0.325311 -2.687352 -0.421440 -0.316155 -2.687352 -0.421440 -0.311578 -2.678197 -0.412285 -0.307000 -2.682775 -0.412285 -0.302423 -2.678197 -0.416863 -0.293267 -2.678197 -0.416863 -0.288690 -2.673619 -0.421440 -0.293267 -2.659887 -0.435173 -0.293267 -2.669042 -0.442039 -0.300134 -2.678197 -0.448906 -0.307000 -2.673619 -0.453483 -0.316155 -2.673619 -0.467216 -0.320733 -2.673619 -0.471794 -0.320733 -2.673619 -0.471794 -0.334466 -2.669042 -0.471794 -0.339043 -2.669042 -0.476371 -0.334466 -2.673619 -0.467216 -0.348199 -2.669042 -0.458061 -0.334466 -2.669042 -0.453483 -0.325311 -2.664464 -0.444328 -0.329888 -2.673619 -0.435173 -0.316155 -2.659887 -0.430595 -0.311578 -2.659887 -0.430595 -0.297845 -2.659887 -0.416863 -0.279535 -2.655309 -0.416863 -0.284112 -2.650731 -0.416863 -0.284112 -2.655309 -0.426018 -0.279535 -2.659887 -0.416863 -0.279535 -2.655309 -0.416863 -0.279535 -2.650731 -0.435173 -0.297845 -2.659887 -0.439751 -0.311578 -2.655309 -0.444328 -0.311578 -2.655309 -0.453483 -0.320733 -2.646154 -0.462639 -0.352776 -2.650731 -0.467216 -0.343621 -2.650731 -0.467216 -0.339043 -2.650731 -0.467216 -0.348199 -2.650731 -0.476371 -0.334466 -2.655309 -0.458061 -0.334466 -2.655309 -0.458061 -0.325311 -2.646154 -0.453483 -0.307000 -2.650731 -0.453483 -0.307000 -2.641576 -0.444328 -0.293267 -2.650731 -0.430595 -0.284112 -2.636999 -0.439751 -0.279535 -2.646154 -0.430595 -0.274957 -2.646154 -0.430595 -0.284112 -2.641576 -0.430595 -0.284112 -2.646154 -0.421440 -0.284112 -2.646154 -0.421440 -0.293267 -2.646154 -0.426018 -0.297845 -2.641576 -0.430595 -0.307000 -2.641576 -0.444328 -0.334466 -2.641576 -0.444328 -0.334466 -2.646154 -0.448906 -0.343621 -2.646154 -0.439751 -0.343621 -2.646154 -0.448906 -0.343621 -2.636999 -0.448906 -0.325311 -2.636999 -0.458061 -0.334466 -2.636999 -0.453483 -0.329888 -2.636999 -0.448906 -0.316155 -2.641576 -0.448906 -0.316155 -2.641576 -0.448906 -0.302423 -2.636999 -0.444328 -0.284112 -2.646154 -0.448906 -0.293267 -2.632421 -0.439751 -0.279535 -2.627843 -0.439751 -0.288690 -2.636999 -0.439751 -0.288690 -2.627843 -0.439751 -0.288690 -2.646154 -0.444328 -0.297845 -2.641576 -0.435173 -0.307000 -2.641576 -0.448906 -0.316155 -2.646154 -0.435173 -0.316155 -2.641576 -0.439751 -0.334466 -2.641576 -0.444328 -0.334466 -2.641576 -0.435173 -0.339043 -2.636999 -0.435173 -0.329888 -2.641576 -0.444328 -0.325311 -2.632421 -0.439751 -0.325311 -2.636999 -0.439751 -0.320733 -2.627843 -0.435173 -0.311578 -2.623266 -0.435173 -0.293267 -2.632421 -0.435173 -0.288690 -2.627843 -0.430595 -0.293267 -2.632421 -0.426018 -0.288690 -2.627843 -0.435173 -0.288690 -2.623266 -0.439751 -0.288690 -2.632421 -0.430595 -0.302423 -2.650731 -0.444328 -0.302423 -2.636999 -0.448906 -0.302423 -2.632421 -0.453483 -0.320733 -2.632421 -0.453483 -0.320733 -2.632421 -0.453483 -0.325311 -2.636999 -0.467216 -0.334466 -2.636999 -0.458061 -0.325311 -2.627843 -0.462639 -0.325311 -2.632421 -0.458061 -0.325311 -2.627843 -0.462639 -0.325311 -2.627843 -0.458061 -0.320733 -2.618688 -0.453483 -0.311578 -2.627843 -0.439751 -0.307000 -2.623266 -0.435173 -0.302423 -2.618688 -0.430595 -0.297845 -2.623266 -0.430595 -0.288690 -2.623266 -0.421440 -0.293267 -2.618688 -0.416863 -0.293267 -2.614111 -0.416863 -0.288690 -2.627843 -0.421440 -0.293267 -2.627843 -0.421440 -0.311578 -2.627843 -0.430595 -0.302423 -2.627843 -0.444328 -0.311578 -2.632421 -0.444328 -0.325311 -2.636999 -0.453483 -0.320733 -2.632421 -0.453483 -0.329888 -2.623266 -0.462639 -0.329888 -2.627843 -0.458061 -0.329888 -2.627843 -0.471794 -0.334466 -2.614111 -0.458061 -0.329888 -2.618688 -0.453483 -0.311578 -2.627843 -0.453483 -0.316155 -2.623266 -0.458061 -0.302423 -2.623266 -0.444328 -0.297845 -2.618688 -0.439751 -0.302423 -2.614111 -0.435173 -0.297845 -2.623266 -0.421440 -0.297845 -2.614111 -0.426018 -0.302423 -2.618688 -0.416863 -0.293267 -2.609533 -0.421440 -0.302423 -2.627843 -0.421440 -0.297845 -2.623266 -0.426018 -0.316155 -2.618688 -0.430595 -0.325311 -2.618688 -0.426018 -0.311578 -2.623266 -0.435173 -0.325311 -2.623266 -0.439751 -0.320733 -2.614111 -0.444328 -0.320733 -2.618688 -0.453483 -0.320733 -2.623266 -0.453483 -0.316155 -2.618688 -0.458061 -0.307000 -2.609533 -0.453483 -0.316155 -2.600378 -0.458061 -0.302423 -2.586645 -0.453483 -0.302423 -2.568335 -0.448906 -0.307000 -2.559179 -0.444328 -0.297845 -2.531714 -0.444328 -0.302423 -2.517981 -0.448906 -0.316155 -2.504248 -0.448906 -0.307000 -2.472205 -0.444328 -0.311578 -2.449317 -0.444328 -0.311578 -2.421851 -0.444328 -0.316155 -2.394386 -0.444328 -0.316155 -2.366920 -0.439751 -0.316155 -2.344032 -0.444328 -0.320733 -2.311989 -0.448906 -0.320733 -2.279946 -0.439751 -0.316155 -2.252480 -0.444328 -0.329888 -2.220437 -0.444328 -0.311578 -2.188394 -0.435173 -0.297845 -2.147195 -0.435173 -0.297845 -2.105997 -0.435173 -0.288690 -2.073954 -0.435173 -0.288690 -2.046488 -0.439751 -0.270379 -2.019023 -0.439751 -0.288690 -1.977824 -0.435173 -0.293267 -1.945781 -0.435173 -0.293267 -1.922893 -0.435173 -0.284112 -1.886272 -0.444328 -0.297845 -1.858807 -0.453483 -0.297845 -1.822186 -0.453483 -0.302423 -1.776410 -0.458061 -0.316155 -1.748944 -0.467216 -0.320733 -1.712323 -0.467216 -0.329888 -1.689435 -0.467216 -0.316155 -1.648237 -0.471794 -0.343621 -1.616194 -0.480949 -0.316155 -1.579573 -0.462639 -0.329888 -1.542952 -0.467216 -0.316155 -1.515487 -0.458061 -0.316155 -1.478866 -0.448906 -0.307000 -1.442245 -0.444328 -0.300134 -1.405624 -0.439751 -0.293267 -1.382736 -0.439751 -0.293267 -1.336960 -0.439751 -0.284112 -1.309495 -0.430595 -0.284112 -1.263719 -0.426018 -0.279535 -1.236253 -0.426018 -0.279535 -1.204210 -0.435173 -0.265802 -1.172167 -0.439751 -0.288690 -1.140123 -0.444328 -0.284112 -1.108080 -0.448906 -0.297845 -1.080615 -0.453483 -0.297845 -1.039416 -0.467216 -0.307000 -1.007373 -0.467216 -0.307000 -0.975330 -0.471794 -0.311578 -0.957019 -0.476371 -0.325311 -0.920399 -0.476371 -0.320733 -0.888355 -0.476371 -0.316155 -0.856312 -0.471794 -0.320733 -0.824269 -0.471794 -0.311578 -0.792226 -0.462639 -0.302423 -0.760183 -0.462639 -0.316155 -0.718984 -0.458061 -0.297845 -0.686941 -0.458061 -0.297845 -0.659475 -0.458061 -0.279535 -0.627432 -0.444328 -0.293267 -0.586234 -0.448906 -0.288690 -0.563346 -0.448906 -0.293267 -0.535880 -0.453483 -0.288690 -0.494682 -0.448906 -0.288690 -0.471794 -0.458061 -0.293267 -0.435173 -0.458061 -0.288690 -0.407707 -0.453483 -0.288690 -0.366509 -0.462639 -0.293267 -0.343621 -0.462639 -0.293267 -0.307000 -0.467216 -0.297845 -0.274957 -0.471794 -0.288690 -0.247491 -0.471794 -0.288690 -0.206293 -0.471794 -0.279535 -0.178827 -0.471794 -0.288690 -0.155939 -0.471794 -0.284112 -0.119319 -0.471794 -0.297845 -0.082698 -0.471794 -0.284112 -0.046077 -0.471794 -0.279535 -0.018611 -0.467216 -0.293267 0.008854 -0.467216 -0.293267 0.045475 -0.471794 -0.297845 0.077518 -0.476371 -0.311578 0.104984 -0.476371 -0.302423 0.141605 -0.476371 -0.311578 0.173648 -0.471794 -0.302423 0.196536 -0.467216 -0.302423 0.237734 -0.471794 -0.316155 0.269777 -0.471794 -0.307000 0.301821 -0.471794 -0.307000 0.329286 -0.471794 -0.307000 0.365907 -0.471794 -0.293267 0.397950 -0.458061 -0.284112 0.434571 -0.458061 -0.284112 0.457459 -0.458061 -0.265802 0.498657 -0.458061 -0.265802 0.530701 -0.462639 -0.270379 0.562744 -0.462639 -0.265802 0.599365 -0.458061 -0.256647 0.626830 -0.462639 -0.256647 0.654296 -0.471794 -0.261224 0.690917 -0.476371 -0.265802 0.727537 -0.476371 -0.270379 0.759581 -0.480949 -0.284112 0.791624 -0.490104 -0.279535 0.819089 -0.490104 -0.293267 0.851133 -0.499259 -0.297845 0.883176 -0.494682 -0.302423 0.915219 -0.499259 -0.316155 0.951840 -0.490104 -0.320733 0.988461 -0.490104 -0.320733 1.015926 -0.485527 -0.307000 1.047969 -0.485527 -0.302423 1.082301 -0.480949 -0.300134 1.116633 -0.476371 -0.297845 1.162409 -0.471794 -0.284112 1.194453 -0.458061 -0.270379 1.226496 -0.467216 -0.270379 1.249384 -0.462639 -0.265802 1.295160 -0.462639 -0.270379 1.318048 -0.471794 -0.261224 1.350091 -0.471794 -0.270379 1.386712 -0.480949 -0.261224 1.418755 -0.485527 -0.270379 1.450798 -0.480949 -0.270379 1.473686 -0.494682 -0.284112 1.510307 -0.499259 -0.284112 1.542350 -0.499259 -0.270379 1.560661 -0.499259 -0.284112 1.597281 -0.499259 -0.302423 1.620169 -0.494682 -0.284112 1.638480 -0.499259 -0.288690 1.656790 -0.499259 -0.284112 1.675101 -0.494682 -0.293267 1.684256 -0.490104 -0.288690 1.707144 -0.499259 -0.297845 1.720877 -0.485527 -0.288690 1.734609 -0.485527 -0.288690 1.748342 -0.485527 -0.293267 1.762075 -0.485527 -0.288690 1.757497 -0.476371 -0.284112 1.757497 -0.490104 -0.288690 1.780385 -0.480949 -0.288690 1.784963 -0.480949 -0.288690 1.789541 -0.480949 -0.288690 1.798696 -0.490104 -0.288690 1.807851 -0.490104 -0.284112 1.812429 -0.485527 -0.274957 1.817006 -0.485527 -0.284112 1.826161 -0.485527 -0.270379 1.839894 -0.494682 -0.270379 1.830739 -0.490104 -0.274957 1.839894 -0.494682 -0.274957 1.844472 -0.490104 -0.265802 1.849049 -0.494682 -0.274957 1.849049 -0.490104 -0.270379 1.853627 -0.494682 -0.279535 1.853627 -0.499259 -0.270379 1.862782 -0.494682 -0.284112 1.858205 -0.503837 -0.288690 1.858205 -0.512992 -0.293267 1.858205 -0.508415 -0.302423 1.858205 -0.508415 -0.307000 1.858205 -0.517570 -0.311578 1.858205 -0.512992 -0.302423 1.849049 -0.508415 -0.307000 1.853627 -0.508415 -0.311578 1.853627 -0.503837 -0.307000 1.862782 -0.503837 -0.297845 1.862782 -0.499259 -0.284112 1.862782 -0.490104 -0.279535 1.858205 -0.480949 -0.270379 1.858205 -0.480949 -0.274957 1.862782 -0.480949 -0.279535 1.858205 -0.485527 -0.265802 1.862782 -0.471794 -0.261224 1.867360 -0.476371 -0.261224 1.853627 -0.485527 -0.256647 1.862782 -0.485527 -0.265802 1.858205 -0.494682 -0.265802 1.853627 -0.499259 -0.284112 1.858205 -0.503837 -0.265802 1.849049 -0.503837 -0.284112 1.858205 -0.508415 -0.274957 1.853627 -0.517570 -0.297845 1.849049 -0.531303 -0.293267 1.844472 -0.517570 -0.302423 1.849049 -0.508415 -0.311578 1.844472 -0.512992 -0.307000 1.844472 -0.503837 -0.307000 1.849049 -0.508415 -0.293267 1.844472 -0.499259 -0.302423 1.844472 -0.494682 -0.288690 1.839894 -0.490104 -0.288690 1.849049 -0.485527 -0.274957 1.844472 -0.480949 -0.279535 1.826161 -0.480949 -0.279535 1.835317 -0.480949 -0.270379 1.835317 -0.485527 -0.279535 1.839894 -0.476371 -0.270379 1.835317 -0.485527 -0.279535 1.839894 -0.490104 -0.279535 1.835317 -0.494682 -0.284112 1.839894 -0.494682 -0.279535 1.835317 -0.503837 -0.284112 1.835317 -0.503837 -0.288690 1.830739 -0.512992 -0.284112 1.830739 -0.508415 -0.284112 1.826161 -0.503837 -0.288690 1.826161 -0.508415 -0.288690 1.826161 -0.503837 -0.279535 1.821584 -0.499259 -0.284112 1.826161 -0.494682 -0.284112 1.830739 -0.485527 -0.270379 1.826161 -0.485527 -0.284112 1.821584 -0.485527 -0.274957 1.821584 -0.476371 -0.288690 1.812429 -0.485527 -0.297845 1.821584 -0.485527 -0.288690 1.807851 -0.490104 -0.288690 1.812429 -0.490104 -0.297845 1.807851 -0.494682 -0.307000 1.803273 -0.499259 -0.297845 1.807851 -0.503837 -0.293267 1.807851 -0.508415 -0.297845 1.812429 -0.508415 -0.302423 1.817006 -0.508415 -0.293267 1.798696 -0.499259 -0.297845 1.812429 -0.499259 -0.288690 1.807851 -0.499259 -0.284112 1.817006 -0.485527 -0.284112 1.812429 -0.490104 -0.270379 1.798696 -0.476371 -0.284112 1.803273 -0.471794 -0.265802 1.798696 -0.476371 -0.270379 1.798696 -0.476371 -0.261224 1.807851 -0.476371 -0.274957 1.803273 -0.485527 -0.270379 1.794118 -0.490104 -0.274957 1.798696 -0.490104 -0.284112 1.794118 -0.508415 -0.279535 1.780385 -0.499259 -0.302423 1.789541 -0.503837 -0.307000 1.780385 -0.508415 -0.307000 1.789541 -0.517570 -0.307000 1.784963 -0.512992 -0.302423 1.794118 -0.508415 -0.302423 1.794118 -0.494682 -0.297845 1.780385 -0.499259 -0.302423 1.798696 -0.490104 -0.293267 1.794118 -0.499259 -0.279535 1.794118 -0.485527 -0.274957 1.789541 -0.480949 -0.265802 1.789541 -0.476371 -0.265802 1.794118 -0.476371 -0.274957 1.789541 -0.480949 -0.256647 1.789541 -0.480949 -0.261224 1.784963 -0.485527 -0.270379 1.784963 -0.490104 -0.270379 1.775808 -0.485527 -0.270379 1.771230 -0.494682 -0.270379 1.771230 -0.494682 -0.284112 1.775808 -0.499259 -0.288690 1.780385 -0.508415 -0.284112 1.775808 -0.508415 -0.288690 1.775808 -0.503837 -0.293267 1.771230 -0.508415 -0.297845 1.775808 -0.503837 -0.284112 1.771230 -0.503837 -0.293267 1.771230 -0.503837 -0.284112 1.762075 -0.494682 -0.274957 1.771230 -0.494682 -0.288690 1.766653 -0.494682 -0.297845 1.771230 -0.485527 -0.297845 1.766653 -0.480949 -0.288690 1.771230 -0.480949 -0.293267 1.762075 -0.480949 -0.293267 1.762075 -0.485527 -0.293267 1.762075 -0.490104 -0.284112 1.762075 -0.490104 -0.279535 1.762075 -0.503837 -0.284112 1.762075 -0.503837 -0.274957 1.766653 -0.503837 -0.284112 1.757497 -0.503837 -0.279535 1.752920 -0.503837 -0.279535 1.752920 -0.503837 -0.279535 1.748342 -0.503837 -0.293267 1.752920 -0.499259 -0.274957 1.752920 -0.485527 -0.288690 1.752920 -0.485527 -0.284112 1.743765 -0.485527 -0.279535 1.734609 -0.476371 -0.288690 1.752920 -0.476371 -0.293267 1.739187 -0.485527 -0.288690 1.748342 -0.490104 -0.288690 1.748342 -0.480949 -0.297845 1.743765 -0.485527 -0.293267 1.739187 -0.494682 -0.297845 1.739187 -0.499259 -0.293267 1.743765 -0.503837 -0.297845 1.739187 -0.494682 -0.284112 1.734609 -0.499259 -0.293267 1.730032 -0.512992 -0.297845 1.739187 -0.503837 -0.293267 1.730032 -0.499259 -0.293267 1.734609 -0.499259 -0.284112 1.732321 -0.501548 -0.279535 1.730032 -0.503837 -0.274957 1.725454 -0.485527 -0.284112 1.720877 -0.480949 -0.274957 1.730032 -0.480949 -0.279535 1.730032 -0.471794 -0.265802 1.720877 -0.480949 -0.279535 1.734609 -0.476371 -0.279535 1.730032 -0.476371 -0.270379 1.730032 -0.480949 -0.279535 1.748342 -0.485527 -0.279535 1.716299 -0.494682 -0.288690 1.711721 -0.499259 -0.302423 1.716299 -0.499259 -0.284112 1.711721 -0.512992 -0.293267 1.711721 -0.512992 -0.307000 1.716299 -0.512992 -0.297845 1.711721 -0.503837 -0.293267 1.716299 -0.508415 -0.288690 1.711721 -0.508415 -0.293267 1.716299 -0.501548 -0.290979 1.720877 -0.494682 -0.288690 1.697989 -0.490104 -0.288690 1.711721 -0.490104 -0.288690 1.716299 -0.476371 -0.274957 1.707144 -0.476371 -0.284112 1.711721 -0.480949 -0.261224 1.711721 -0.480949 -0.279535 1.711721 -0.476371 -0.270379 1.711721 -0.476371 -0.270379 1.702566 -0.485527 -0.270379 1.707144 -0.490104 -0.284112 1.702566 -0.499259 -0.270379 1.702566 -0.503837 -0.270379 1.707144 -0.503837 -0.284112 1.702566 -0.503837 -0.279535 1.697989 -0.499259 -0.284112 1.707144 -0.503837 -0.284112 1.697989 -0.494682 -0.284112 1.688833 -0.490104 -0.302423 1.697989 -0.494682 -0.288690 1.693411 -0.490104 -0.307000 1.697989 -0.485527 -0.297845 1.693411 -0.485527 -0.302423 1.693411 -0.490104 -0.288690 1.688833 -0.490104 -0.284112 1.688833 -0.494682 -0.274957 1.679678 -0.499259 -0.284112 1.693411 -0.508415 -0.274957 1.697989 -0.494682 -0.270379 1.693411 -0.508415 -0.293267 1.688833 -0.508415 -0.288690 1.684256 -0.508415 -0.279535 1.693411 -0.512992 -0.284112 1.688833 -0.503837 -0.279535 1.684256 -0.503837 -0.284112 1.688833 -0.499259 -0.274957 1.684256 -0.494682 -0.284112 1.675101 -0.490104 -0.279535 1.670523 -0.485527 -0.284112 1.661368 -0.485527 -0.279535 1.647635 -0.471794 -0.284112 1.633902 -0.480949 -0.297845 1.620169 -0.476371 -0.293267 1.601859 -0.476371 -0.297845 1.569816 -0.485527 -0.297845 1.546928 -0.485527 -0.288690 1.524040 -0.494682 -0.297845 1.496574 -0.494682 -0.297845 1.469109 -0.503837 -0.293267 1.441643 -0.494682 -0.297845 1.414177 -0.508415 -0.302423 1.391289 -0.517570 -0.297845 1.345513 -0.508415 -0.288690 1.327203 -0.512992 -0.293267 1.295160 -0.508415 -0.288690 1.263117 -0.512992 -0.302423 1.235651 -0.494682 -0.284112 1.199030 -0.480949 -0.274957 1.166987 -0.490104 -0.288690 1.130366 -0.471794 -0.284112 1.102901 -0.471794 -0.288690 1.070857 -0.467216 -0.284112 1.038814 -0.471794 -0.288690 1.011349 -0.471794 -0.284112 0.974728 -0.471794 -0.284112 0.942685 -0.467216 -0.279535 0.910641 -0.476371 -0.284112 0.878598 -0.480949 -0.293267 0.855710 -0.485527 -0.297845 0.823667 -0.485527 -0.293267 0.791624 -0.490104 -0.288690 0.759581 -0.494682 -0.293267 0.718382 -0.490104 -0.297845 0.690917 -0.485527 -0.293267 0.654296 -0.490104 -0.293267 0.626830 -0.494682 -0.307000 0.594787 -0.485527 -0.302423 0.553589 -0.480949 -0.293267 0.526123 -0.480949 -0.297845 0.494080 -0.485527 -0.284112 0.462037 -0.476371 -0.288690 0.434571 -0.471794 -0.279535 0.402528 -0.476371 -0.284112 0.370485 -0.467216 -0.297845 0.333864 -0.476371 -0.274957 0.306398 -0.471794 -0.288690 0.265200 -0.471794 -0.288690 0.233157 -0.480949 -0.284112 0.196536 -0.471794 -0.279535 0.169070 -0.467216 -0.293267 0.132449 -0.471794 -0.293267 0.104984 -0.467216 -0.293267 0.063785 -0.467216 -0.297845 0.036320 -0.471794 -0.284112 0.013432 -0.462639 -0.307000 -0.027767 -0.467216 -0.307000 -0.059810 -0.462639 -0.307000 -0.087275 -0.458061 -0.302423 -0.123896 -0.467216 -0.293267 -0.165095 -0.458061 -0.293267 -0.197138 -0.462639 -0.288690 -0.224603 -0.462639 -0.293267 -0.252069 -0.467216 -0.293267 -0.284112 -0.467216 -0.293267 -0.325311 -0.480949 -0.288690 -0.343621 -0.485527 -0.288690 -0.389397 -0.480949 -0.293267 -0.421440 -0.476371 -0.284112 -0.458061 -0.485527 -0.284112 -0.485527 -0.480949 -0.288690 -0.522147 -0.485527 -0.284112 -0.545035 -0.476371 -0.293267 -0.581656 -0.471794 -0.297845 -0.609122 -0.471794 -0.293267 -0.645743 -0.458061 -0.293267 -0.682363 -0.462639 -0.293267 -0.718984 -0.453483 -0.297845 -0.741872 -0.448906 -0.288690 -0.769338 -0.444328 -0.297845 -0.801381 -0.444328 -0.293267 -0.838002 -0.444328 -0.297845 -0.865467 -0.453483 -0.297845 -0.897511 -0.448906 -0.293267 -0.938709 -0.458061 -0.302423 -0.966175 -0.458061 -0.297845 -1.002795 -0.471794 -0.293267 -1.030261 -0.467216 -0.297845 -1.062304 -0.471794 -0.307000 -1.094347 -0.471794 -0.302423 -1.126391 -0.476371 -0.297845 -1.167589 -0.476371 -0.302423 -1.190477 -0.471794 -0.307000 -1.227098 -0.471794 -0.293267 -1.259141 -0.471794 -0.297845 -1.288895 -0.467216 -0.297845 -1.318650 -0.462639 -0.297845 -1.350693 -0.453483 -0.297845 -1.387314 -0.458061 -0.307000 -1.419357 -0.444328 -0.293267 -1.451400 -0.448906 -0.302423 -1.483443 -0.444328 -0.297845 -1.520064 -0.448906 -0.297845 -1.547530 -0.453483 -0.297845 -1.584151 -0.444328 -0.302423 -1.611616 -0.448906 -0.302423 -1.639082 -0.453483 -0.302423 -1.671125 -0.458061 -0.311578 -1.694013 -0.453483 -0.302423 -1.721479 -0.453483 -0.316155 -1.762677 -0.453483 -0.316155 -1.780987 -0.458061 -0.307000 -1.808453 -0.448906 -0.320733 -1.822186 -0.458061 -0.320733 -1.863384 -0.444328 -0.307000 -1.886272 -0.448906 -0.307000 -1.913738 -0.448906 -0.302423 -1.932048 -0.448906 -0.297845 -1.959514 -0.458061 -0.297845 -1.982402 -0.453483 -0.302423 -2.009867 -0.453483 -0.297845 -2.032755 -0.453483 -0.302423 -2.055643 -0.444328 -0.302423 -2.083109 -0.453483 -0.302423 -2.096842 -0.448906 -0.302423 -2.115152 -0.448906 -0.307000 -2.138040 -0.439751 -0.307000 -2.165506 -0.448906 -0.316155 -2.188394 -0.444328 -0.320733 -2.206704 -0.435173 -0.316155 -2.225015 -0.439751 -0.311578 -2.261635 -0.430595 -0.320733 -2.275368 -0.439751 -0.311578 -2.293679 -0.426018 -0.302423 -2.316567 -0.426018 -0.307000 -2.330299 -0.426018 -0.311578 -2.348610 -0.435173 -0.293267 -2.376075 -0.435173 -0.297845 -2.389808 -0.439751 -0.307000 -2.408119 -0.444328 -0.297845 -2.435584 -0.444328 -0.302423 -2.449317 -0.467216 -0.288690 -2.472205 -0.448906 -0.297845 -2.490515 -0.458061 -0.297845 -2.499671 -0.458061 -0.316155 -2.531714 -0.458061 -0.316155 -2.540869 -0.448906 -0.325311 -2.559179 -0.462639 -0.320733 -2.572912 -0.453483 -0.316155 -2.591223 -0.448906 -0.316155 -2.600378 -0.453483 -0.311578 -2.618688 -0.444328 -0.311578 -2.623266 -0.439751 -0.311578 -2.646154 -0.444328 -0.316155 -2.655309 -0.435173 -0.311578 -2.659887 -0.435173 -0.297845 -2.669042 -0.435173 -0.302423 -2.678197 -0.426018 -0.302423 -2.682775 -0.430595 -0.307000 -2.701085 -0.426018 -0.307000 -2.701085 -0.426018 -0.311578 -2.705663 -0.435173 -0.316155 -2.710240 -0.421440 -0.311578 -2.714818 -0.426018 -0.311578 -2.719395 -0.435173 -0.316155 -2.723973 -0.435173 -0.307000 -2.733128 -0.430595 -0.316155 -2.728551 -0.439751 -0.316155 -2.737706 -0.439751 -0.320733 -2.737706 -0.448906 -0.316155 -2.737706 -0.453483 -0.307000 -2.733128 -0.453483 -0.302423 -2.728551 -0.453483 -0.311578 -2.733128 -0.458061 -0.311578 -2.746861 -0.458061 -0.307000 -2.737706 -0.458061 -0.316155 -2.742283 -0.453483 -0.316155 -2.746861 -0.444328 -0.316155 -2.746861 -0.444328 -0.311578 -2.742283 -0.435173 -0.320733 -2.746861 -0.430595 -0.311578 -2.733128 -0.430595 -0.320733 -2.737706 -0.430595 -0.329888 -2.737706 -0.416863 -0.316155 -2.723973 -0.421440 -0.311578 -2.737706 -0.416863 -0.320733 -2.733128 -0.421440 -0.311578 -2.719395 -0.426018 -0.297845 -2.728551 -0.430595 -0.316155 -2.737706 -0.435173 -0.307000 -2.719395 -0.448906 -0.297845 -2.728551 -0.444328 -0.293267 -2.723973 -0.448906 -0.293267 -2.719395 -0.462639 -0.307000 -2.723973 -0.453483 -0.307000 -2.728551 -0.448906 -0.325311 -2.723973 -0.458061 -0.320733 -2.719395 -0.448906 -0.320733 -2.719395 -0.444328 -0.316155 -2.714818 -0.439751 -0.320733 -2.719395 -0.439751 -0.320733 -2.714818 -0.426018 -0.320733 -2.701085 -0.439751 -0.325311 -2.705663 -0.430595 -0.316155 -2.705663 -0.439751 -0.325311 -2.705663 -0.430595 -0.316155 -2.705663 -0.435173 -0.316155 -2.701085 -0.444328 -0.320733 -2.691930 -0.448906 -0.311578 -2.691930 -0.448906 -0.320733 -2.701085 -0.453483 -0.307000 -2.691930 -0.448906 -0.316155 -2.696507 -0.444328 -0.311578 -2.696507 -0.448906 -0.325311 -2.682775 -0.444328 -0.325311 -2.696507 -0.435173 -0.320733 -2.678197 -0.439751 -0.325311 -2.682775 -0.435173 -0.325311 -2.682775 -0.426018 -0.311578 -2.682775 -0.430595 -0.302423 -2.682775 -0.421440 -0.311578 -2.687352 -0.430595 -0.302423 -2.678197 -0.439751 -0.297845 -2.673619 -0.439751 -0.307000 -2.678197 -0.444328 -0.302423 -2.678197 -0.453483 -0.293267 -2.678197 -0.453483 -0.302423 -2.669042 -0.458061 -0.297845 -2.673619 -0.458061 -0.307000 -2.678197 -0.458061 -0.316155 -2.669042 -0.462639 -0.329888 Kst-2.0.8/COPYING0000644000175000017500000004314112277111530012413 0ustar synthsynth GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Kst-2.0.8/install-kst0000755000175000017500000000201212277111530013543 0ustar synthsynth#!/bin/sh cd `dirname $0` export SCRIPTDIR=$PWD export BUILDDIR=$PWD/build echo "Building Kst from $SCRIPTDIR into $BUILDDIR" if [ "$1" = "debug" ] then echo "Building in Debug mode" export KST_DEBUG_MODE=1 else echo "Building in Release mode" export KST_DEBUG_MODE=0 fi if [ "$2" ] then echo "Installation location of $2 has been requested" export INSTALL_PREFIX=$2 fi if [ "$3" ] then echo "Installation library directory of $3 has been requested" export INSTALL_LIBDIR=$3 fi if [ "$4" ] then echo "Output directory of $4 has been requested" export OUTPUT_DIR=$4 fi if [ "$INSTALL_LIBDIR" ] then echo "Build will be automatically installed to the configured location ($INSTALL_PREFIX)" else echo "Build will be automatically install to the default location (/usr)" fi mkdir -p $BUILDDIR cd $BUILDDIR qmake -r $SCRIPTDIR/kst.pro if [ -d /opt/icecream/bin ] then echo "Using Icecream" PATH=/opt/icecream/bin:$PATH make -j4 PATH=/opt/icecream/bin:$PATH make install else make -j3 make install fi Kst-2.0.8/build-kst.bat0000755000175000017500000000006012277111530013742 0ustar synthsynth mkdir build cd build qmake -r ../kst.pro nmake Kst-2.0.8/config.pri0000644000175000017500000000376012277111530013344 0ustar synthsynth# Define if you have cfitsio - not used on unix HAVE_CFITSIO = 0 # Set to 1 to disable usage of cfitsio - only for unix DISABLE_CFITSIO = 0 #Define if you have dirfile getdata library version 0.4.2 or greater required. - not used on unix HAVE_DIRFILE = 0 # Set to 1 to disable usage of dirfile - only for unix DISABLE_DIRFILE = 0 #Define if you have the gsl library installed - not used on unix HAVE_GSL = 0 # Set to 1 to disable usage of gsl - only for unix DISABLE_GSL = 0 defineTest(LibExists) { lib = $$ARGS unix { !mac { contains(lib, gsl) { contains(DISABLE_GSL, 1) { # Overridden, do not check. return(false) } } contains(lib, cfitsio) { contains(DISABLE_CFITSIO, 1) { # Overridden, do not check. return(false) } } contains(lib, getdata) { contains(DISABLE_DIRFILE, 1) { # Overridden, do not check. return(false) } } PKGCONFIGRESULT = $$system(pkg-config --libs $$lib) !contains(PKGCONFIGRESULT, -l$$lib) { message(Could not find $$lib disabling associated features) return(false) } message(Found $$lib at $$PKGCONFIGRESULT) return(true) } } contains(lib, gsl) { GSLDIR = $$(GSLDIR) win32:!isEmpty(GSLDIR) { return(true) } !win32:contains(HAVE_GSL, 1) { return(true) } return(false) } contains(lib, cfitsio) { contains(HAVE_CFITSIO, 1) { return(true) } return(false) } contains(lib, getdata) { !win32:contains(HAVE_DIRFILE, 1) { return(true) } GETDATADIR = $$(GETDATADIR) win32:!isEmpty(GETDATADIR) { return(true) } macx:!isEmpty(GETDATADIR) { return(true) } return(false) } contains(lib, netcdf) { NETCDFDIR = $$(NETCDFDIR) win32:!isEmpty(NETCDFDIR) { return(true) } !win32:contains(HAVE_NETCDFDIR, 1) { return(true) } return(false) } } defineReplace(pkginclude) { PKGCONFIG_INCLUDE_DIR = $$system(pkg-config --variable includedir $$1) message(Using $$1 headers in $$PKGCONFIG_INCLUDE_DIR) return($$PKGCONFIG_INCLUDE_DIR) } Kst-2.0.8/pch.h0000644000175000017500000000022212277111530012274 0ustar synthsynth #include #include #include #if defined __cplusplus #include #include #include #endif Kst-2.0.8/ChangeLog0000644000175000017500000114335712277111530013145 0ustar synthsynth------------------------------------------------------------------------ r1029763 | netterfield | 2009-09-30 13:27:12 -0400 (Wed, 30 Sep 2009) | 2 lines Updated release notes ------------------------------------------------------------------------ r1029756 | netterfield | 2009-09-30 13:06:13 -0400 (Wed, 30 Sep 2009) | 3 lines Get rid of old tests in the branch. ------------------------------------------------------------------------ r1029752 | netterfield | 2009-09-30 12:59:26 -0400 (Wed, 30 Sep 2009) | 3 lines Branch for beta3. This should be a very usable branch. ------------------------------------------------------------------------ r1029745 | netterfield | 2009-09-30 12:41:05 -0400 (Wed, 30 Sep 2009) | 4 lines Remove 1.x data sources from 2.0 tree. They are still in the 1.x tree, and can be ported from there. ------------------------------------------------------------------------ r1029651 | netterfield | 2009-09-30 08:53:06 -0400 (Wed, 30 Sep 2009) | 3 lines 'Improve' some defaults. ------------------------------------------------------------------------ r1029608 | netterfield | 2009-09-30 06:39:00 -0400 (Wed, 30 Sep 2009) | 3 lines Default system for plots and dialogs. ------------------------------------------------------------------------ r1027349 | netterfield | 2009-09-23 17:29:37 -0400 (Wed, 23 Sep 2009) | 5 lines Multiple edit for legends. Some improvements to legend dialog. Some improvements to plot dialog. ------------------------------------------------------------------------ r1025501 | netterfield | 2009-09-18 18:40:54 -0400 (Fri, 18 Sep 2009) | 3 lines Move some devel docs around. Save legend status in the kst file. ------------------------------------------------------------------------ r1024901 | netterfield | 2009-09-17 10:05:09 -0400 (Thu, 17 Sep 2009) | 6 lines Fix names in basicplugin. Get rid of inf() warning. Fix legend placement. Basic multi-edit functionality for legends. ------------------------------------------------------------------------ r1024048 | netterfield | 2009-09-15 17:09:58 -0400 (Tue, 15 Sep 2009) | 2 lines Fix broken short names. ------------------------------------------------------------------------ r1023551 | netterfield | 2009-09-14 18:21:09 -0400 (Mon, 14 Sep 2009) | 6 lines Part way into 'edit multiple' for view items. -View items are now named objects -Start some work to reduce cross section for editing a deleted plot. -Create a macro that can produce a list of items of a desired type. ------------------------------------------------------------------------ r1020002 | netterfield | 2009-09-04 20:35:00 -0400 (Fri, 04 Sep 2009) | 8 lines Delete old files stored here from the 1.x branch (if you want it, get it from the 1.x branch) Remove dead code. Fix the ascii read file bug. ------------------------------------------------------------------------ r1011565 | netterfield | 2009-08-15 00:12:29 -0400 (Sat, 15 Aug 2009) | 4 lines Update dialog defaults lists Fix rotated axis number label positioning ------------------------------------------------------------------------ r1008715 | netterfield | 2009-08-08 02:20:52 -0400 (Sat, 08 Aug 2009) | 3 lines Fix some file dialog behaviors... ------------------------------------------------------------------------ r1007685 | netterfield | 2009-08-06 00:19:12 -0400 (Thu, 06 Aug 2009) | 3 lines More fixups for line/arrow resize/move behaviour. ------------------------------------------------------------------------ r1007008 | netterfield | 2009-08-04 17:25:22 -0400 (Tue, 04 Aug 2009) | 3 lines Fix the drifting line bug... ------------------------------------------------------------------------ r1005451 | netterfield | 2009-08-01 00:59:29 -0400 (Sat, 01 Aug 2009) | 4 lines Better defaults for graphics export dialog. Fix parenting and resizing bugs (except lines). ------------------------------------------------------------------------ r1004417 | netterfield | 2009-07-30 02:40:55 -0400 (Thu, 30 Jul 2009) | 5 lines Fix drifting Y label bug. Add attribute for grid line width. Copy more plot styles when adding a plot to a view. ------------------------------------------------------------------------ r1002072 | fenton | 2009-07-24 17:14:46 -0400 (Fri, 24 Jul 2009) | 2 lines Add Build System overview for Kst. ------------------------------------------------------------------------ r1002051 | fenton | 2009-07-24 16:44:46 -0400 (Fri, 24 Jul 2009) | 2 lines Remove overlapping CONFIG setting. ------------------------------------------------------------------------ r1001896 | fenton | 2009-07-24 09:06:53 -0400 (Fri, 24 Jul 2009) | 2 lines Update Release procedure. ------------------------------------------------------------------------ r1001544 | netterfield | 2009-07-23 11:39:58 -0400 (Thu, 23 Jul 2009) | 3 lines Report some new bugs :-( ------------------------------------------------------------------------ r1001494 | fenton | 2009-07-23 08:59:47 -0400 (Thu, 23 Jul 2009) | 2 lines Fix plot drawing errors when plot's view rect strays from (0, 0) ------------------------------------------------------------------------ r1001361 | netterfield | 2009-07-22 20:29:56 -0400 (Wed, 22 Jul 2009) | 4 lines Update bug lists. Fixes for printing (seems pretty good now) ------------------------------------------------------------------------ r1001287 | fenton | 2009-07-22 16:25:57 -0400 (Wed, 22 Jul 2009) | 2 lines Update DEVNOTES. ------------------------------------------------------------------------ r1001282 | fenton | 2009-07-22 15:54:37 -0400 (Wed, 22 Jul 2009) | 2 lines Add view based plot font default settings. ------------------------------------------------------------------------ r1001227 | fenton | 2009-07-22 13:59:06 -0400 (Wed, 22 Jul 2009) | 2 lines Add examples to INSTALL. ------------------------------------------------------------------------ r1001072 | fenton | 2009-07-22 11:36:57 -0400 (Wed, 22 Jul 2009) | 2 lines Fix Windows command line exiting / help display. ------------------------------------------------------------------------ r1000785 | netterfield | 2009-07-21 20:58:43 -0400 (Tue, 21 Jul 2009) | 3 lines Update bug list: some new bugs... ------------------------------------------------------------------------ r1000784 | netterfield | 2009-07-21 20:44:32 -0400 (Tue, 21 Jul 2009) | 4 lines Some improvements to printing. But it still prints at 72dpi, which is inadequate. ------------------------------------------------------------------------ r1000623 | fenton | 2009-07-21 13:44:03 -0400 (Tue, 21 Jul 2009) | 2 lines Update install doc. ------------------------------------------------------------------------ r1000539 | fenton | 2009-07-21 10:33:33 -0400 (Tue, 21 Jul 2009) | 3 lines Add new install-kst script. Update installation documentation. ------------------------------------------------------------------------ r1000095 | netterfield | 2009-07-20 16:15:40 -0400 (Mon, 20 Jul 2009) | 3 lines Report bug as fixed ------------------------------------------------------------------------ r1000073 | netterfield | 2009-07-20 15:38:33 -0400 (Mon, 20 Jul 2009) | 3 lines Fix a bug with data mode and offset marker... ------------------------------------------------------------------------ r1000055 | fenton | 2009-07-20 14:55:08 -0400 (Mon, 20 Jul 2009) | 2 lines Switch printer mode to ScreenResolution. ------------------------------------------------------------------------ r999942 | fenton | 2009-07-20 12:25:12 -0400 (Mon, 20 Jul 2009) | 3 lines Update build system to support INSTALL_PREFIX INSTALL_LIBDIR and only set QMAKE_RPATH when in debug mode. ------------------------------------------------------------------------ r999909 | netterfield | 2009-07-20 11:26:38 -0400 (Mon, 20 Jul 2009) | 2 lines Printing Bug (showstopper) ------------------------------------------------------------------------ r999886 | fenton | 2009-07-20 10:37:46 -0400 (Mon, 20 Jul 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r999796 | fenton | 2009-07-20 09:52:34 -0400 (Mon, 20 Jul 2009) | 2 lines Fix crash when reloading settings dialog. ------------------------------------------------------------------------ r998454 | netterfield | 2009-07-17 13:19:26 -0400 (Fri, 17 Jul 2009) | 7 lines Report a new bug (a crash case...) Update bugs. Fix axis label round-off errors Fix tick count reduction (to avoid overlap). Fix tick scaling/position (to avoid overlap). ------------------------------------------------------------------------ r997289 | fenton | 2009-07-15 13:54:19 -0400 (Wed, 15 Jul 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r997283 | fenton | 2009-07-15 13:48:31 -0400 (Wed, 15 Jul 2009) | 3 lines Add reworked config saving for ascii plugin including global default flag / setting. Fix loading of .kst with ascii settings when file information is not in settings. ------------------------------------------------------------------------ r996831 | netterfield | 2009-07-14 19:36:10 -0400 (Tue, 14 Jul 2009) | 5 lines Update bugs Fix mean centered mode. Fix precision in plot dialog range tab. ------------------------------------------------------------------------ r996598 | fenton | 2009-07-14 10:50:13 -0400 (Tue, 14 Jul 2009) | 2 lines Move settings to native / default locations in the UserScope. ------------------------------------------------------------------------ r995951 | fenton | 2009-07-13 10:58:17 -0400 (Mon, 13 Jul 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r995949 | fenton | 2009-07-13 10:52:41 -0400 (Mon, 13 Jul 2009) | 2 lines Turn off debugging. ------------------------------------------------------------------------ r994600 | netterfield | 2009-07-10 16:39:14 -0400 (Fri, 10 Jul 2009) | 4 lines Fix plot dialog setting Y mean centered zoom mode. X mean centered zoom mode not fixed yet. ------------------------------------------------------------------------ r994570 | fenton | 2009-07-10 14:43:05 -0400 (Fri, 10 Jul 2009) | 2 lines Apply origin plot zoom before applying SharedAxisBox zoom for zooms that may change non-shared axis. ------------------------------------------------------------------------ r994394 | fenton | 2009-07-10 10:57:05 -0400 (Fri, 10 Jul 2009) | 2 lines Revert enforceMin change allow corner case label overlap to ensure minimum ticks are enforced. ------------------------------------------------------------------------ r993952 | netterfield | 2009-07-09 15:46:05 -0400 (Thu, 09 Jul 2009) | 4 lines New bugs Some minor fixes to plot axis numbers. There are more to go... ------------------------------------------------------------------------ r993884 | fenton | 2009-07-09 11:47:31 -0400 (Thu, 09 Jul 2009) | 2 lines Update window title. ------------------------------------------------------------------------ r993806 | fenton | 2009-07-09 10:40:28 -0400 (Thu, 09 Jul 2009) | 2 lines Fix sizing of PlotItemDialog by limiting the growth of the dialog. ------------------------------------------------------------------------ r993601 | netterfield | 2009-07-08 20:42:17 -0400 (Wed, 08 Jul 2009) | 3 lines Report new bug. ------------------------------------------------------------------------ r993490 | fenton | 2009-07-08 15:21:19 -0400 (Wed, 08 Jul 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r993479 | fenton | 2009-07-08 14:49:08 -0400 (Wed, 08 Jul 2009) | 2 lines Fix updates for Selector Widgets when changes happen in other dialogs. ------------------------------------------------------------------------ r992828 | fenton | 2009-07-07 15:19:13 -0400 (Tue, 07 Jul 2009) | 2 lines Remove maximum check and replace with minimum check on calculating tick spacing to prevent overlap when reducing the tick count programmatically. ------------------------------------------------------------------------ r992678 | fenton | 2009-07-07 11:20:32 -0400 (Tue, 07 Jul 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r992677 | fenton | 2009-07-07 11:17:13 -0400 (Tue, 07 Jul 2009) | 5 lines Remove TiedZoom support from SharedAxisBoxItem. Add KeyPlot to SharedAxisBoxItem for displaying TiedZoom in ShareX & ShareY mode. Fix RMB Menu for PlotItem. Fix Tied Zoom with plots outside of the SharedAxisBoxItem. ------------------------------------------------------------------------ r988395 | netterfield | 2009-06-27 21:59:03 -0400 (Sat, 27 Jun 2009) | 3 lines Update bugs ------------------------------------------------------------------------ r987889 | fenton | 2009-06-26 16:51:16 -0400 (Fri, 26 Jun 2009) | 3 lines Convert Dialogs to modeless. Fix AboutDialog linking. ------------------------------------------------------------------------ r987829 | fenton | 2009-06-26 14:13:22 -0400 (Fri, 26 Jun 2009) | 2 lines Fix signal. ------------------------------------------------------------------------ r987430 | netterfield | 2009-06-25 23:54:19 -0400 (Thu, 25 Jun 2009) | 3 lines Update bugs (related to shared axis boxes) ------------------------------------------------------------------------ r986540 | fenton | 2009-06-24 14:28:55 -0400 (Wed, 24 Jun 2009) | 2 lines Prevent too many ticks being drawn when limiting the ticks due to label size constraints. ------------------------------------------------------------------------ r985917 | fenton | 2009-06-23 14:51:11 -0400 (Tue, 23 Jun 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r985916 | fenton | 2009-06-23 14:49:01 -0400 (Tue, 23 Jun 2009) | 4 lines Add independent tied zoom for PlotItems inside of a SharedAxisBox. Connect hotkeys for SharedAxisBox options. Fix drawing of invalid PlotRects. ------------------------------------------------------------------------ r983670 | fenton | 2009-06-18 15:17:49 -0400 (Thu, 18 Jun 2009) | 2 lines Fix missing brace. ------------------------------------------------------------------------ r983666 | fenton | 2009-06-18 15:09:18 -0400 (Thu, 18 Jun 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r983665 | fenton | 2009-06-18 15:08:46 -0400 (Thu, 18 Jun 2009) | 2 lines Cleanup LabelBuilder based warnings. ------------------------------------------------------------------------ r983641 | fenton | 2009-06-18 13:14:11 -0400 (Thu, 18 Jun 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r983639 | fenton | 2009-06-18 13:13:21 -0400 (Thu, 18 Jun 2009) | 2 lines Reduce significant digit count for log axis. ------------------------------------------------------------------------ r983606 | fenton | 2009-06-18 10:37:57 -0400 (Thu, 18 Jun 2009) | 4 lines Fix inverse drawing of plots creating an invalid PlotRenderItem size. Prevent drawing attempts of invalid PlotRenderItems. Standardize all Plots after the final draw of the PlotItem and only if rect() is valid. ------------------------------------------------------------------------ r983223 | fenton | 2009-06-17 15:48:42 -0400 (Wed, 17 Jun 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r983220 | fenton | 2009-06-17 15:43:20 -0400 (Wed, 17 Jun 2009) | 3 lines Re-label Fill Dialog in Application Settings. Add proper updating of View/PlotItem when changes are made in General/Grid Tabs of application settings. ------------------------------------------------------------------------ r983070 | fenton | 2009-06-17 10:28:38 -0400 (Wed, 17 Jun 2009) | 2 lines Eliminate extra re-draw when unmarking as dirty. ------------------------------------------------------------------------ r983046 | fenton | 2009-06-17 10:18:01 -0400 (Wed, 17 Jun 2009) | 2 lines Bug list update. ------------------------------------------------------------------------ r983000 | fenton | 2009-06-17 09:40:23 -0400 (Wed, 17 Jun 2009) | 3 lines Fix load of document triggering a dirty document. Remove PlotRenderItem geometry changes from dirty document tracking. ------------------------------------------------------------------------ r982947 | netterfield | 2009-06-17 06:16:56 -0400 (Wed, 17 Jun 2009) | 4 lines Clean up/clarify bug list. Close some bugs ------------------------------------------------------------------------ r982791 | fenton | 2009-06-16 16:06:55 -0400 (Tue, 16 Jun 2009) | 2 lines Apply layout changes to ChangeDataSampleDialog. ------------------------------------------------------------------------ r982724 | fenton | 2009-06-16 13:58:19 -0400 (Tue, 16 Jun 2009) | 3 lines Fix layout bugs associated with multiple columns / rows in SharedAxisBoxes. Add immediate sharing update when switching ShareX/ShareY settings. ------------------------------------------------------------------------ r982683 | netterfield | 2009-06-16 11:50:21 -0400 (Tue, 16 Jun 2009) | 3 lines Update bug lists and wishlists: in particular, clarify shared axis. ------------------------------------------------------------------------ r982487 | netterfield | 2009-06-15 19:18:28 -0400 (Mon, 15 Jun 2009) | 3 lines Improve axis number roundoff a little. There is more to go! ------------------------------------------------------------------------ r982339 | fenton | 2009-06-15 10:49:09 -0400 (Mon, 15 Jun 2009) | 2 lines Fix disconnect between ShareX / ShareY controlled zoom and SharedAxisBoxItem tied zoom. ------------------------------------------------------------------------ r981137 | netterfield | 2009-06-12 16:47:46 -0400 (Fri, 12 Jun 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r981025 | fenton | 2009-06-12 14:50:12 -0400 (Fri, 12 Jun 2009) | 2 lines Fix crash when de-selecting draw based action. ------------------------------------------------------------------------ r980842 | fenton | 2009-06-12 12:04:40 -0400 (Fri, 12 Jun 2009) | 2 lines Fix typo. ------------------------------------------------------------------------ r980840 | netterfield | 2009-06-12 11:58:13 -0400 (Fri, 12 Jun 2009) | 3 lines 'I' key adjusts image color ranges. ------------------------------------------------------------------------ r980827 | fenton | 2009-06-12 11:21:31 -0400 (Fri, 12 Jun 2009) | 2 lines Improve interface for ChangeFileDialog. ------------------------------------------------------------------------ r979984 | fenton | 2009-06-10 16:50:33 -0400 (Wed, 10 Jun 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r979962 | fenton | 2009-06-10 16:19:55 -0400 (Wed, 10 Jun 2009) | 8 lines Rework Shared Axis Box / Tied Zoom. - Separate x / y Tied Zoom. - Remove internal Shared Axis Box Tied Zoom - Replace with special handling. - Make Share x / Share y configurable - Fix breaking of Shared Axis Box on zoom changes. Redo saving of ranges in PlotItemDialog. Add new zoom modes. ------------------------------------------------------------------------ r979912 | fenton | 2009-06-10 14:33:11 -0400 (Wed, 10 Jun 2009) | 2 lines Add new bugs. ------------------------------------------------------------------------ r979521 | netterfield | 2009-06-09 22:47:14 -0400 (Tue, 09 Jun 2009) | 3 lines Update description of shared axis boxes. ------------------------------------------------------------------------ r979399 | fenton | 2009-06-09 13:40:18 -0400 (Tue, 09 Jun 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r979104 | netterfield | 2009-06-08 18:28:46 -0400 (Mon, 08 Jun 2009) | 2 lines New tab option in curve placement widget. ------------------------------------------------------------------------ r977910 | netterfield | 2009-06-05 12:01:08 -0400 (Fri, 05 Jun 2009) | 6 lines - Start 'new tab' ui work in curve placement widget. - set version number for libraries, to allow kst2 to be installed with kst1 on certain systems. ------------------------------------------------------------------------ r977552 | fenton | 2009-06-04 12:06:53 -0400 (Thu, 04 Jun 2009) | 3 lines Convert to region based tick label spacing validation. Add font autoscaling for tick labels. ------------------------------------------------------------------------ r977363 | netterfield | 2009-06-03 18:57:42 -0400 (Wed, 03 Jun 2009) | 2 lines New Tab related options in the data wizard. ------------------------------------------------------------------------ r977202 | fenton | 2009-06-03 10:54:05 -0400 (Wed, 03 Jun 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r977188 | fenton | 2009-06-03 10:40:04 -0400 (Wed, 03 Jun 2009) | 2 lines Remove dialog delete code. ------------------------------------------------------------------------ r977178 | fenton | 2009-06-03 10:35:52 -0400 (Wed, 03 Jun 2009) | 2 lines Fix Dialog ListWidget growing indefinitely. ------------------------------------------------------------------------ r976770 | fenton | 2009-06-02 11:29:44 -0400 (Tue, 02 Jun 2009) | 2 lines Add automatic minor tick count. ------------------------------------------------------------------------ r976467 | fenton | 2009-06-01 14:47:41 -0400 (Mon, 01 Jun 2009) | 2 lines Update PlotItemDialog saveRange to correctly save if in Axis Log mode. ------------------------------------------------------------------------ r976456 | fenton | 2009-06-01 14:14:04 -0400 (Mon, 01 Jun 2009) | 2 lines Update buglist and unmark tab based bugs. ------------------------------------------------------------------------ r976406 | netterfield | 2009-06-01 11:51:05 -0400 (Mon, 01 Jun 2009) | 4 lines Update bug list start to implement new page in data wizard. ------------------------------------------------------------------------ r976392 | fenton | 2009-06-01 10:48:12 -0400 (Mon, 01 Jun 2009) | 2 lines Fix legend being parented incorrectly when creating plots from the DataWizard. ------------------------------------------------------------------------ r976253 | fenton | 2009-06-01 08:05:54 -0400 (Mon, 01 Jun 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r976251 | fenton | 2009-06-01 08:02:21 -0400 (Mon, 01 Jun 2009) | 2 lines Update Bug list. ------------------------------------------------------------------------ r975318 | fenton | 2009-05-29 16:39:45 -0400 (Fri, 29 May 2009) | 2 lines Fix update delay on log axis changes. ------------------------------------------------------------------------ r974858 | fenton | 2009-05-29 14:07:15 -0400 (Fri, 29 May 2009) | 2 lines Add zoom update on relation being removed from plot. ------------------------------------------------------------------------ r974522 | fenton | 2009-05-29 11:37:42 -0400 (Fri, 29 May 2009) | 2 lines Add multiple edit support for PlotItems. ------------------------------------------------------------------------ r974166 | fenton | 2009-05-28 12:10:42 -0400 (Thu, 28 May 2009) | 2 lines Warning cleanup. ------------------------------------------------------------------------ r974165 | fenton | 2009-05-28 12:09:27 -0400 (Thu, 28 May 2009) | 2 lines Warning cleanup. ------------------------------------------------------------------------ r973265 | fenton | 2009-05-26 14:07:33 -0400 (Tue, 26 May 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r973254 | fenton | 2009-05-26 13:31:21 -0400 (Tue, 26 May 2009) | 3 lines Fix inability to control plot rect / tick colours. Add tracking of pen change for redraw. ------------------------------------------------------------------------ r973206 | netterfield | 2009-05-26 10:36:27 -0400 (Tue, 26 May 2009) | 4 lines Add Nicolas's bugs Move some feature requests from Bugs to Wishlist ------------------------------------------------------------------------ r973200 | fenton | 2009-05-26 10:26:17 -0400 (Tue, 26 May 2009) | 2 lines Fix jump when editing DataSourceSelector text field. ------------------------------------------------------------------------ r973178 | netterfield | 2009-05-26 10:13:42 -0400 (Tue, 26 May 2009) | 3 lines Fix color selection bug in data wizard. ------------------------------------------------------------------------ r972953 | netterfield | 2009-05-26 00:46:21 -0400 (Tue, 26 May 2009) | 3 lines Implement default X vectors... ------------------------------------------------------------------------ r972772 | fenton | 2009-05-25 12:41:39 -0400 (Mon, 25 May 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r972758 | fenton | 2009-05-25 11:50:16 -0400 (Mon, 25 May 2009) | 2 lines Add ContentTab double click actions. Fix multiple selection. ------------------------------------------------------------------------ r972746 | netterfield | 2009-05-25 11:03:19 -0400 (Mon, 25 May 2009) | 3 lines Fix crash from improperly enabled/disabled edit buttons in vector selector. ------------------------------------------------------------------------ r972743 | netterfield | 2009-05-25 10:42:31 -0400 (Mon, 25 May 2009) | 5 lines Add default X vector field for new vectors. Fix some button activation bugs in the vector dialog. Report a new bug. ------------------------------------------------------------------------ r971520 | fenton | 2009-05-22 11:39:12 -0400 (Fri, 22 May 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r971517 | fenton | 2009-05-22 11:34:05 -0400 (Fri, 22 May 2009) | 2 lines Fix proximity to zero double bug for major ticks. ------------------------------------------------------------------------ r971512 | fenton | 2009-05-22 11:18:57 -0400 (Fri, 22 May 2009) | 2 lines Fix compile warning. ------------------------------------------------------------------------ r970803 | fenton | 2009-05-20 16:43:27 -0400 (Wed, 20 May 2009) | 2 lines Add Axis Label rotation support. ------------------------------------------------------------------------ r970234 | fenton | 2009-05-19 15:55:05 -0400 (Tue, 19 May 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r970204 | fenton | 2009-05-19 14:38:32 -0400 (Tue, 19 May 2009) | 2 lines Add new Base/Offset mode settings and logic. ------------------------------------------------------------------------ r968549 | netterfield | 2009-05-15 23:58:20 -0400 (Fri, 15 May 2009) | 4 lines Fix a couple more bugs. Report another bug. ------------------------------------------------------------------------ r968501 | netterfield | 2009-05-15 17:16:53 -0400 (Fri, 15 May 2009) | 4 lines Fix Don's line width big Fix Don's range tab apply bug ------------------------------------------------------------------------ r968485 | fenton | 2009-05-15 16:13:49 -0400 (Fri, 15 May 2009) | 2 lines Fix cursor drifting when resizing / rotating objects. ------------------------------------------------------------------------ r968065 | fenton | 2009-05-14 16:50:22 -0400 (Thu, 14 May 2009) | 2 lines Fix MatrixSelector not maximizing correctly. ------------------------------------------------------------------------ r968056 | fenton | 2009-05-14 16:35:12 -0400 (Thu, 14 May 2009) | 2 lines Standardize and fix alignment issues in the CSD, Equation, Image and PowerSpectrum dialogs. ------------------------------------------------------------------------ r967955 | netterfield | 2009-05-14 10:39:14 -0400 (Thu, 14 May 2009) | 4 lines Label and Name work... Fix one of Don's bugs (current name not given in dialogs) ------------------------------------------------------------------------ r967950 | fenton | 2009-05-14 10:06:11 -0400 (Thu, 14 May 2009) | 2 lines Add saving of View size and resizing of ViewItem if View size does not match on reload. ------------------------------------------------------------------------ r967553 | fenton | 2009-05-13 10:31:21 -0400 (Wed, 13 May 2009) | 2 lines Fix item drift on rotated objects. ------------------------------------------------------------------------ r967184 | fenton | 2009-05-12 15:58:50 -0400 (Tue, 12 May 2009) | 2 lines Extend ArrowItem shape to include ArrowHead/Tail. ------------------------------------------------------------------------ r967112 | fenton | 2009-05-12 11:52:23 -0400 (Tue, 12 May 2009) | 3 lines Merge in changes made in beta release branch. Clean up lib line changes to be windows/unix specific. ------------------------------------------------------------------------ r967096 | fenton | 2009-05-12 10:21:18 -0400 (Tue, 12 May 2009) | 2 lines Update bugs. ------------------------------------------------------------------------ r966686 | fenton | 2009-05-11 14:08:08 -0400 (Mon, 11 May 2009) | 2 lines Rename Notes. ------------------------------------------------------------------------ r966606 | fenton | 2009-05-11 11:51:02 -0400 (Mon, 11 May 2009) | 2 lines Add Notes and update release information. ------------------------------------------------------------------------ r964961 | fenton | 2009-05-07 14:30:30 -0400 (Thu, 07 May 2009) | 1 line Add windows icon. ------------------------------------------------------------------------ r963438 | fenton | 2009-05-04 14:38:37 -0400 (Mon, 04 May 2009) | 2 lines Fix qmake failure in windows. ------------------------------------------------------------------------ r963436 | fenton | 2009-05-04 14:34:45 -0400 (Mon, 04 May 2009) | 2 lines Config cleanup. ------------------------------------------------------------------------ r963433 | fenton | 2009-05-04 14:34:25 -0400 (Mon, 04 May 2009) | 2 lines Update Install note version. ------------------------------------------------------------------------ r963431 | fenton | 2009-05-04 14:32:18 -0400 (Mon, 04 May 2009) | 2 lines Fix windows build error and segfault. ------------------------------------------------------------------------ r963421 | fenton | 2009-05-04 14:24:11 -0400 (Mon, 04 May 2009) | 2 lines Fix windows build error. ------------------------------------------------------------------------ r963351 | fenton | 2009-05-04 11:29:27 -0400 (Mon, 04 May 2009) | 2 lines Prevent error on Windows build when processing empty .pro. ------------------------------------------------------------------------ r963299 | fenton | 2009-05-04 09:13:01 -0400 (Mon, 04 May 2009) | 2 lines Claim bug. ------------------------------------------------------------------------ r962627 | netterfield | 2009-05-02 14:57:38 -0400 (Sat, 02 May 2009) | 4 lines Fix arrow bug; update bug list. ------------------------------------------------------------------------ r962066 | netterfield | 2009-05-01 08:58:28 -0400 (Fri, 01 May 2009) | 5 lines More accelerators. Bug update. ------------------------------------------------------------------------ r961847 | fenton | 2009-04-30 15:57:07 -0400 (Thu, 30 Apr 2009) | 2 lines Add configurable dirfile maker. ------------------------------------------------------------------------ r961799 | fenton | 2009-04-30 13:57:10 -0400 (Thu, 30 Apr 2009) | 2 lines Remove old signal. ------------------------------------------------------------------------ r961798 | fenton | 2009-04-30 13:56:43 -0400 (Thu, 30 Apr 2009) | 2 lines Fix Scalar test. ------------------------------------------------------------------------ r961777 | fenton | 2009-04-30 13:32:39 -0400 (Thu, 30 Apr 2009) | 2 lines Warning cleanup. ------------------------------------------------------------------------ r961715 | fenton | 2009-04-30 10:56:56 -0400 (Thu, 30 Apr 2009) | 2 lines Add dirty flag for PlotAxis to pickup changes made directly in PlotAxis dialog requiring a redraw. ------------------------------------------------------------------------ r961253 | netterfield | 2009-04-29 15:07:37 -0400 (Wed, 29 Apr 2009) | 4 lines Update bug list dialog accelerators ------------------------------------------------------------------------ r960557 | fenton | 2009-04-28 12:25:17 -0400 (Tue, 28 Apr 2009) | 2 lines Add benchmarking for update process. ------------------------------------------------------------------------ r960510 | fenton | 2009-04-28 11:03:07 -0400 (Tue, 28 Apr 2009) | 2 lines Fix update process not correctly updating scalars / strings of Primitives / DataObjects. ------------------------------------------------------------------------ r958850 | fenton | 2009-04-24 16:40:59 -0400 (Fri, 24 Apr 2009) | 4 lines Eliminate large number of calls to update() on objects during update process. Cleanup of unneeded dirty flag and checks for dirty. Add save/restore for RealTimeAutoBin for Histograms. ------------------------------------------------------------------------ r958729 | fenton | 2009-04-24 10:27:59 -0400 (Fri, 24 Apr 2009) | 2 lines Fix saving of PlotRenderItems and add saving of child viewItems. ------------------------------------------------------------------------ r958274 | netterfield | 2009-04-23 12:44:51 -0400 (Thu, 23 Apr 2009) | 4 lines More accelerators fix a crash case. ------------------------------------------------------------------------ r958249 | netterfield | 2009-04-23 11:58:51 -0400 (Thu, 23 Apr 2009) | 5 lines New bug Some accelerator work header file changes for cfitsio to make it work w/ SUSE. ------------------------------------------------------------------------ r957557 | fenton | 2009-04-22 08:59:43 -0400 (Wed, 22 Apr 2009) | 2 lines Update Bug List. ------------------------------------------------------------------------ r957358 | netterfield | 2009-04-21 17:08:05 -0400 (Tue, 21 Apr 2009) | 2 lines More bugs and wishes ------------------------------------------------------------------------ r957356 | netterfield | 2009-04-21 17:07:11 -0400 (Tue, 21 Apr 2009) | 3 lines Fix up some dialogs; add whatsthis. ------------------------------------------------------------------------ r957269 | fenton | 2009-04-21 13:53:30 -0400 (Tue, 21 Apr 2009) | 2 lines Fix PlotItem failing to update on label change based standardization. ------------------------------------------------------------------------ r956839 | fenton | 2009-04-20 14:54:05 -0400 (Mon, 20 Apr 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r956812 | fenton | 2009-04-20 13:21:09 -0400 (Mon, 20 Apr 2009) | 2 lines Add saving of reference point and offset status. ------------------------------------------------------------------------ r955464 | fenton | 2009-04-17 13:59:37 -0400 (Fri, 17 Apr 2009) | 3 lines Add caching of rendered label details. Fix label alignment issues in Plots. ------------------------------------------------------------------------ r955448 | netterfield | 2009-04-17 12:55:32 -0400 (Fri, 17 Apr 2009) | 3 lines More bugs and wishes. ------------------------------------------------------------------------ r954946 | netterfield | 2009-04-16 11:13:59 -0400 (Thu, 16 Apr 2009) | 6 lines Update bug list: Add some bugs Report performance bug as fixed Add 'wishlist' for features to be implememnted. ------------------------------------------------------------------------ r954944 | fenton | 2009-04-16 11:07:57 -0400 (Thu, 16 Apr 2009) | 2 lines Cleanup compile warnings. ------------------------------------------------------------------------ r953795 | fenton | 2009-04-14 10:47:01 -0400 (Tue, 14 Apr 2009) | 2 lines Remove pixmap based caching of labels. Add caching of parsed label. ------------------------------------------------------------------------ r953663 | fenton | 2009-04-14 09:06:45 -0400 (Tue, 14 Apr 2009) | 2 lines Fix typo. ------------------------------------------------------------------------ r951617 | fenton | 2009-04-09 15:43:49 -0400 (Thu, 09 Apr 2009) | 2 lines Cache entire PlotItem into pixmap. ------------------------------------------------------------------------ r950203 | fenton | 2009-04-06 12:32:11 -0400 (Mon, 06 Apr 2009) | 2 lines Fix curve drawing offset in plot. ------------------------------------------------------------------------ r948786 | fenton | 2009-04-03 15:34:00 -0400 (Fri, 03 Apr 2009) | 2 lines Fix multiple Plot updates triggered on zoom actions. ------------------------------------------------------------------------ r948189 | fenton | 2009-04-02 10:28:40 -0400 (Thu, 02 Apr 2009) | 2 lines Fix missing update for ticks. ------------------------------------------------------------------------ r947970 | fenton | 2009-04-01 16:23:46 -0400 (Wed, 01 Apr 2009) | 3 lines Cleanup LabelTab Fix AutoLabels by making overrideText purely an override. ------------------------------------------------------------------------ r947891 | fenton | 2009-04-01 10:50:53 -0400 (Wed, 01 Apr 2009) | 3 lines Move margin sizing calculations out of access functions. Add calculatedFont to PlotLabel and code cleanup. ------------------------------------------------------------------------ r947564 | fenton | 2009-03-31 15:30:02 -0400 (Tue, 31 Mar 2009) | 2 lines Add PlotLabel and clean up all Label related settings code in PlotItem. ------------------------------------------------------------------------ r947011 | fenton | 2009-03-30 14:39:38 -0400 (Mon, 30 Mar 2009) | 2 lines Add cached PlotMarkers. ------------------------------------------------------------------------ r946927 | fenton | 2009-03-30 10:37:35 -0400 (Mon, 30 Mar 2009) | 2 lines Remove unused _xLabelRect and _yLabelRect. Update associated Debug code. ------------------------------------------------------------------------ r945618 | fenton | 2009-03-27 16:06:37 -0400 (Fri, 27 Mar 2009) | 3 lines Fix Zoom over-redrawing bugs. Add proper invalidation of labels when global changes occur. ------------------------------------------------------------------------ r945503 | fenton | 2009-03-27 10:57:59 -0400 (Fri, 27 Mar 2009) | 2 lines Add pair of bugs. ------------------------------------------------------------------------ r945045 | fenton | 2009-03-26 15:18:33 -0400 (Thu, 26 Mar 2009) | 3 lines Cleanup overlapping/unclear/unused functions in PlotItem. Add caching of PlotItem::plotRect and plotAxisRect. ------------------------------------------------------------------------ r944036 | netterfield | 2009-03-24 17:44:11 -0400 (Tue, 24 Mar 2009) | 4 lines Don't crash from the command line... ------------------------------------------------------------------------ r943977 | fenton | 2009-03-24 14:54:05 -0400 (Tue, 24 Mar 2009) | 2 lines Add caching of plot axis labels. ------------------------------------------------------------------------ r943279 | fenton | 2009-03-23 11:54:06 -0400 (Mon, 23 Mar 2009) | 2 lines Eliminate extra validation / recalculation of Tick locations. ------------------------------------------------------------------------ r941959 | fenton | 2009-03-20 15:33:12 -0400 (Fri, 20 Mar 2009) | 2 lines Add caching for PlotItem labels as QPixmap's. ------------------------------------------------------------------------ r941469 | fenton | 2009-03-19 13:38:12 -0400 (Thu, 19 Mar 2009) | 2 lines Add tick line caching to Plot Item. ------------------------------------------------------------------------ r941020 | fenton | 2009-03-18 14:06:54 -0400 (Wed, 18 Mar 2009) | 2 lines Fix AppendLayout / DataWizard incorrectly cleaning up LayoutBoxItem's and aligning improperly. ------------------------------------------------------------------------ r940593 | fenton | 2009-03-17 14:36:16 -0400 (Tue, 17 Mar 2009) | 2 lines Update tests / tools for DataSource::init() ------------------------------------------------------------------------ r940493 | fenton | 2009-03-17 11:02:16 -0400 (Tue, 17 Mar 2009) | 4 lines Fix context menu failure to load / slow opening of DataManager / Debug Dialog. - Add init functions to DataObject/DataSource for loading settings / scanning plugins. - Trigger init from MainWindow load. ------------------------------------------------------------------------ r939061 | fenton | 2009-03-13 14:30:31 -0400 (Fri, 13 Mar 2009) | 2 lines Update Axis UI to disable Base Offset mode when interpretting the axis. ------------------------------------------------------------------------ r939024 | fenton | 2009-03-13 11:42:18 -0400 (Fri, 13 Mar 2009) | 2 lines Remove reference to viewitemzorder.h ------------------------------------------------------------------------ r939015 | fenton | 2009-03-13 11:12:37 -0400 (Fri, 13 Mar 2009) | 3 lines Removal of ViewItemZOrder default values. All objects are now created equally and modified by user command. ------------------------------------------------------------------------ r938281 | fenton | 2009-03-11 11:14:21 -0400 (Wed, 11 Mar 2009) | 4 lines Add Debug and output path options to build-kst command line. Further cleanup of .pro files. Remove and update all dependencies on qt3support. ------------------------------------------------------------------------ r937332 | fenton | 2009-03-09 11:33:51 -0400 (Mon, 09 Mar 2009) | 2 lines Fix label parsing debug output. ------------------------------------------------------------------------ r936068 | fenton | 2009-03-06 16:36:16 -0500 (Fri, 06 Mar 2009) | 2 lines Bug list update. ------------------------------------------------------------------------ r936062 | fenton | 2009-03-06 16:21:50 -0500 (Fri, 06 Mar 2009) | 4 lines Fix parenting problems on object changes. - Add parenting check skip for items being updated as the result of parent changes. - Fix comparison causing children to reparent when grips extend outside of parent but not the object itself. ------------------------------------------------------------------------ r935982 | fenton | 2009-03-06 11:24:54 -0500 (Fri, 06 Mar 2009) | 2 lines Improve tolerance checking. ------------------------------------------------------------------------ r935964 | fenton | 2009-03-06 10:37:31 -0500 (Fri, 06 Mar 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r935586 | fenton | 2009-03-05 12:51:07 -0500 (Thu, 05 Mar 2009) | 2 lines Add redraw of Plot when plotRect has changed to fix garbling of plotaxis. ------------------------------------------------------------------------ r935307 | fenton | 2009-03-04 15:22:10 -0500 (Wed, 04 Mar 2009) | 9 lines Cleanup and Bug fixes in SharedAxisBoxItem's - Add locked axis for shares. No automatic breaking of shared axes. - Fix margins changing on zoom - Integrate with PlotItem paint optimizations - Update setPlotDirty to notify either SharedBox or View. - Fix alignment errors of SharedPlots when parent or view is resized. - Fix alignment errors on zoom changes. Cleanup deprecated SharedAxis settings from view and viewitem. ------------------------------------------------------------------------ r934224 | fenton | 2009-03-02 09:56:51 -0500 (Mon, 02 Mar 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r933030 | fenton | 2009-02-27 15:54:21 -0500 (Fri, 27 Feb 2009) | 3 lines Simplify DataObjectPlugin and DataSourcePlugin .pro's. Fix check for filters. ------------------------------------------------------------------------ r932985 | fenton | 2009-02-27 13:22:37 -0500 (Fri, 27 Feb 2009) | 2 lines Fix qgraphicsitem_cast related bugs. ------------------------------------------------------------------------ r932515 | fenton | 2009-02-26 15:28:25 -0500 (Thu, 26 Feb 2009) | 2 lines Enhance the build system. ------------------------------------------------------------------------ r931110 | fenton | 2009-02-24 14:52:40 -0500 (Tue, 24 Feb 2009) | 3 lines Add Threaded DataSource Validation. Update ChangeFileDialog to do dataSource validation for Ok Button. ------------------------------------------------------------------------ r931015 | fenton | 2009-02-24 10:59:57 -0500 (Tue, 24 Feb 2009) | 2 lines Fix DataSource Selector for String's. ------------------------------------------------------------------------ r931001 | fenton | 2009-02-24 10:32:50 -0500 (Tue, 24 Feb 2009) | 2 lines Improve debugging output from UpdateManager. ------------------------------------------------------------------------ r930525 | fenton | 2009-02-23 13:29:26 -0500 (Mon, 23 Feb 2009) | 2 lines Add Update Cycle explanation. ------------------------------------------------------------------------ r929179 | fenton | 2009-02-20 16:09:52 -0500 (Fri, 20 Feb 2009) | 2 lines Improve debug logging for PlotItem/PlotRenderItem in the update cycle. ------------------------------------------------------------------------ r929178 | fenton | 2009-02-20 16:08:57 -0500 (Fri, 20 Feb 2009) | 2 lines Improve datavector debug logging. ------------------------------------------------------------------------ r929175 | fenton | 2009-02-20 16:04:24 -0500 (Fri, 20 Feb 2009) | 3 lines Improve debug logging for update manager. Fix over processing of curve updates. ------------------------------------------------------------------------ r928712 | fenton | 2009-02-19 16:33:54 -0500 (Thu, 19 Feb 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r928688 | fenton | 2009-02-19 15:50:42 -0500 (Thu, 19 Feb 2009) | 3 lines Add debugging option for Child Geometry. Fix Resize command undo/redo command improperly resizing child objects. ------------------------------------------------------------------------ r928061 | fenton | 2009-02-18 15:41:45 -0500 (Wed, 18 Feb 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r927941 | fenton | 2009-02-18 11:19:10 -0500 (Wed, 18 Feb 2009) | 2 lines Fix continuous painting of plotitems. ------------------------------------------------------------------------ r927663 | netterfield | 2009-02-17 20:45:37 -0500 (Tue, 17 Feb 2009) | 4 lines Place annoying debug message into plotitem.cpp to remind us that paint is being continuously called... ------------------------------------------------------------------------ r927556 | fenton | 2009-02-17 15:54:25 -0500 (Tue, 17 Feb 2009) | 2 lines Bug list update. ------------------------------------------------------------------------ r927502 | fenton | 2009-02-17 12:54:55 -0500 (Tue, 17 Feb 2009) | 2 lines Fix Qt Mouse grabber warning. ------------------------------------------------------------------------ r925702 | fenton | 2009-02-13 17:27:05 -0500 (Fri, 13 Feb 2009) | 4 lines Add creation status to ViewItem. Fix continous repainting of plot items. Trigger margin updates each redraw during plot creation. ------------------------------------------------------------------------ r925610 | fenton | 2009-02-13 11:33:35 -0500 (Fri, 13 Feb 2009) | 2 lines Buglist update. ------------------------------------------------------------------------ r925608 | fenton | 2009-02-13 11:32:53 -0500 (Fri, 13 Feb 2009) | 2 lines Reworking of Tied Zoom to allow parent tied zoom's for SharedAxisBox's. ------------------------------------------------------------------------ r925533 | netterfield | 2009-02-13 08:46:20 -0500 (Fri, 13 Feb 2009) | 5 lines Fix some bugs with margins not getting set. Paint is being continuously called on plots, which is a serious bug. ------------------------------------------------------------------------ r924374 | fenton | 2009-02-10 11:16:00 -0500 (Tue, 10 Feb 2009) | 2 lines Update Bugs. ------------------------------------------------------------------------ r924372 | fenton | 2009-02-10 11:12:43 -0500 (Tue, 10 Feb 2009) | 5 lines Add PlotMarginStandardization for the Top/Right Margins. Add factor to match "close" sizes of Plots. Update Standardization to apply to all non-SharedAxis plots in the view. Code Cleanup. ------------------------------------------------------------------------ r923852 | netterfield | 2009-02-09 10:20:16 -0500 (Mon, 09 Feb 2009) | 6 lines Changes to the plot updating to avoid n^2 behavior in updating plot axis. There are still issues! ------------------------------------------------------------------------ r922275 | fenton | 2009-02-06 11:40:09 -0500 (Fri, 06 Feb 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r921831 | fenton | 2009-02-05 14:02:30 -0500 (Thu, 05 Feb 2009) | 3 lines Add the ability to Maximize Plots - Tracked by PlotItemManager. Add the support for disabling plot item update cycle. ------------------------------------------------------------------------ r920762 | fenton | 2009-02-03 13:53:31 -0500 (Tue, 03 Feb 2009) | 2 lines Fix highlight point not drawing without reference point. ------------------------------------------------------------------------ r920711 | fenton | 2009-02-03 12:07:55 -0500 (Tue, 03 Feb 2009) | 2 lines Fix cancel on exit option still exiting. ------------------------------------------------------------------------ r920701 | fenton | 2009-02-03 11:36:24 -0500 (Tue, 03 Feb 2009) | 2 lines Bug list update. ------------------------------------------------------------------------ r920698 | fenton | 2009-02-03 11:24:30 -0500 (Tue, 03 Feb 2009) | 2 lines Add DataMode. ------------------------------------------------------------------------ r918778 | fenton | 2009-01-30 13:43:56 -0500 (Fri, 30 Jan 2009) | 2 lines Add Layout Settings at application and viewItem levels that provide seed values for ViewGridLayout. ------------------------------------------------------------------------ r918704 | netterfield | 2009-01-30 10:00:29 -0500 (Fri, 30 Jan 2009) | 4 lines Fix centering of left and right labels Slightly increase size of plot selector circle. ------------------------------------------------------------------------ r918289 | fenton | 2009-01-29 14:01:41 -0500 (Thu, 29 Jan 2009) | 2 lines Fix context menu for SharedAxisBoxItem's. ------------------------------------------------------------------------ r918285 | fenton | 2009-01-29 13:54:05 -0500 (Thu, 29 Jan 2009) | 2 lines Eliminate movement of plots on break of shared axis box. ------------------------------------------------------------------------ r918253 | fenton | 2009-01-29 13:10:07 -0500 (Thu, 29 Jan 2009) | 2 lines Update directory name. ------------------------------------------------------------------------ r918206 | netterfield | 2009-01-29 11:35:40 -0500 (Thu, 29 Jan 2009) | 2 lines Delete a debug statement... ------------------------------------------------------------------------ r918204 | netterfield | 2009-01-29 11:31:29 -0500 (Thu, 29 Jan 2009) | 3 lines Fix some label and axis alignment issues. ------------------------------------------------------------------------ r917974 | fenton | 2009-01-28 16:29:23 -0500 (Wed, 28 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r917973 | fenton | 2009-01-28 16:28:46 -0500 (Wed, 28 Jan 2009) | 2 lines Adjust Dialog ListView to automatically adjust to the size of the text independent of font sizing. ------------------------------------------------------------------------ r917879 | fenton | 2009-01-28 12:54:49 -0500 (Wed, 28 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r917877 | fenton | 2009-01-28 12:51:04 -0500 (Wed, 28 Jan 2009) | 9 lines Updates to SharedAxisBoxItem and Layout's. - Add parent lock to viewItems to prevent reparenting (used for plots in SharedAxisBox's). - Redo sizing for SharedAxisBoxItem to maximize to topLeft/bottomRight of plots being added. - Eliminate black border from created SharedAxisBoxItem's. - Add highlighting to plots that will be added to the to the SharedAxisBoxItem during creation. - Update Layout - Remove spacing between objects & reduce margin to minimum needed to select parent. - Fix Context Menu missing Raise/Lower/Layout options. - Update ViewItem::maybeParent to prevent ancestor bug and prevent inappropriate reparenting of children to top. ------------------------------------------------------------------------ r916965 | fenton | 2009-01-26 10:19:28 -0500 (Mon, 26 Jan 2009) | 2 lines Remove checkable status from layout. ------------------------------------------------------------------------ r915792 | fenton | 2009-01-23 14:34:24 -0500 (Fri, 23 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r915790 | fenton | 2009-01-23 14:28:52 -0500 (Fri, 23 Jan 2009) | 2 lines Add reference point 'c' mode. ------------------------------------------------------------------------ r915331 | fenton | 2009-01-22 15:06:17 -0500 (Thu, 22 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r915330 | fenton | 2009-01-22 15:05:48 -0500 (Thu, 22 Jan 2009) | 3 lines Auto append .kst to saved files. Add document changes status updating to all appropriate objects/actions. ------------------------------------------------------------------------ r915058 | netterfield | 2009-01-22 08:15:37 -0500 (Thu, 22 Jan 2009) | 3 lines Add some new bugs. ------------------------------------------------------------------------ r914792 | fenton | 2009-01-21 14:30:16 -0500 (Wed, 21 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r914791 | fenton | 2009-01-21 14:25:11 -0500 (Wed, 21 Jan 2009) | 5 lines Add clipping of PlotAxis labels instead of omitting. Add Tick Debugging Mode Fix rounding bug for PlotAxis numbers. Enforce minimum of 2 Major Plot Ticks. ------------------------------------------------------------------------ r914430 | netterfield | 2009-01-20 21:50:03 -0500 (Tue, 20 Jan 2009) | 5 lines Fix superscript and subscript size/placement Fix selection box around multi line labels. Do some graphics call optimizations suggested by techbase. ------------------------------------------------------------------------ r914320 | fenton | 2009-01-20 15:53:50 -0500 (Tue, 20 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r914319 | fenton | 2009-01-20 15:51:52 -0500 (Tue, 20 Jan 2009) | 2 lines Fix Bug - Child of PlotRenderItem loses parent on resize when renderitem's size becomes negative. ------------------------------------------------------------------------ r914172 | fenton | 2009-01-20 10:06:32 -0500 (Tue, 20 Jan 2009) | 2 lines Clean up of Tied Zoom status markers. ------------------------------------------------------------------------ r913642 | fenton | 2009-01-19 11:44:23 -0500 (Mon, 19 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r913641 | fenton | 2009-01-19 11:43:12 -0500 (Mon, 19 Jan 2009) | 2 lines Fix negative size drawing bug. ------------------------------------------------------------------------ r913304 | netterfield | 2009-01-18 22:44:02 -0500 (Sun, 18 Jan 2009) | 5 lines Fix some bugs in labels and label parsing: bold, italics, underline work now parse errors like \badtag{text} no longer crash. ------------------------------------------------------------------------ r912130 | fenton | 2009-01-16 13:57:37 -0500 (Fri, 16 Jan 2009) | 2 lines Add Escape cancelling for LineItem. ------------------------------------------------------------------------ r912105 | netterfield | 2009-01-16 13:06:39 -0500 (Fri, 16 Jan 2009) | 3 lines Add \odot and \ell to the parser. ------------------------------------------------------------------------ r911763 | netterfield | 2009-01-15 22:33:32 -0500 (Thu, 15 Jan 2009) | 4 lines ... also autoscale legend sizes from the data wizard. ------------------------------------------------------------------------ r911671 | fenton | 2009-01-15 16:53:32 -0500 (Thu, 15 Jan 2009) | 4 lines Add resize of view when exporting graphics. Switch to a white rather than transparent background painting for print/export. Switch export to print mode for painter. ------------------------------------------------------------------------ r911615 | fenton | 2009-01-15 14:21:26 -0500 (Thu, 15 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r911608 | fenton | 2009-01-15 14:12:43 -0500 (Thu, 15 Jan 2009) | 4 lines Add drawing markers to indicate current drawing mode and allow cancelling of non-active drawing. Add Escape catching to cancel active drawing. Update viewItem cursor changes to only trigger when in layout mode. ------------------------------------------------------------------------ r911462 | netterfield | 2009-01-15 08:29:04 -0500 (Thu, 15 Jan 2009) | 6 lines -Select smaller fonts when creating many plots from the data wizard -allow layout mode mouse actions to work again. -stuck 'debug' in the .pro files - can't tell if this is necessary but we can take it out later. ------------------------------------------------------------------------ r911110 | fenton | 2009-01-14 16:22:33 -0500 (Wed, 14 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r911074 | fenton | 2009-01-14 14:49:19 -0500 (Wed, 14 Jan 2009) | 2 lines Redo child update algorithm to eliminate drifting. ------------------------------------------------------------------------ r911021 | netterfield | 2009-01-14 11:30:29 -0500 (Wed, 14 Jan 2009) | 8 lines In starting to auto set font sizes for plots from the wizard, I found some serious bugs in the data wizard, related to plot creation - mostly misuse of iterators. This fixes them and uses direct indexing of the list, as suggested by the qt4 docs. ------------------------------------------------------------------------ r910598 | fenton | 2009-01-13 14:12:32 -0500 (Tue, 13 Jan 2009) | 2 lines Update bug list. ------------------------------------------------------------------------ r910596 | fenton | 2009-01-13 14:09:55 -0500 (Tue, 13 Jan 2009) | 2 lines Add PlotItemDialog / CurveDialog launching based on mouse click/doubleclick on plot items. ------------------------------------------------------------------------ r910238 | fenton | 2009-01-12 16:13:21 -0500 (Mon, 12 Jan 2009) | 2 lines Add UpdateManager trigger for dialog based curve changes. ------------------------------------------------------------------------ r910237 | fenton | 2009-01-12 16:10:55 -0500 (Mon, 12 Jan 2009) | 2 lines Update sizing for dialog ListView Size. ------------------------------------------------------------------------ r910234 | fenton | 2009-01-12 16:09:47 -0500 (Mon, 12 Jan 2009) | 2 lines Add proper selection from ListView for active item. ------------------------------------------------------------------------ r910226 | fenton | 2009-01-12 15:54:53 -0500 (Mon, 12 Jan 2009) | 2 lines Fix drawing loop in PlotItem. ------------------------------------------------------------------------ r910171 | netterfield | 2009-01-12 14:59:54 -0500 (Mon, 12 Jan 2009) | 2 lines Update bugs ------------------------------------------------------------------------ r910169 | netterfield | 2009-01-12 14:57:08 -0500 (Mon, 12 Jan 2009) | 3 lines constant y value curves have more sensible limits in auto mode. ------------------------------------------------------------------------ r910050 | fenton | 2009-01-12 10:53:39 -0500 (Mon, 12 Jan 2009) | 2 lines Update Bug Lists. ------------------------------------------------------------------------ r909085 | netterfield | 2009-01-10 18:27:59 -0500 (Sat, 10 Jan 2009) | 3 lines Add a range tab to the plot item dialog. ------------------------------------------------------------------------ r908456 | fenton | 2009-01-09 13:38:49 -0500 (Fri, 09 Jan 2009) | 2 lines Fix Bug - Select General tab automatically on ApplicationSettingsDialog load. ------------------------------------------------------------------------ r908409 | fenton | 2009-01-09 12:20:21 -0500 (Fri, 09 Jan 2009) | 3 lines Drawing fixes associated with SharedAxisBoxItem's. Automatically unshare when box is broken. ------------------------------------------------------------------------ r907830 | fenton | 2009-01-08 14:50:05 -0500 (Thu, 08 Jan 2009) | 2 lines Add custom layout support and updated margin handling for SharedAxisBoxItem's. ------------------------------------------------------------------------ r906223 | fenton | 2009-01-05 14:34:11 -0500 (Mon, 05 Jan 2009) | 2 lines Fix saving to skip saving of items that are hidden (have been undone and not redone). ------------------------------------------------------------------------ r906144 | fenton | 2009-01-05 11:51:36 -0500 (Mon, 05 Jan 2009) | 3 lines Add projection size updating when applying a SharedAxisBoxItem. Fix SharedAxisBoxItem parenting / undo crashes. ------------------------------------------------------------------------ r904638 | fenton | 2009-01-02 12:26:04 -0500 (Fri, 02 Jan 2009) | 3 lines Add persisting of layout when projectRect changes for SharedAxisBoxItem's. Update contextMenu to remove layout based items for children of SharedAxisBoxItem's. ------------------------------------------------------------------------ r903958 | fenton | 2008-12-31 16:23:36 -0500 (Wed, 31 Dec 2008) | 3 lines Connect SharedAxisBoxItem updates to SharePlots and add support for custom updates. Add calculation for share mode (x/y) based upon current projections. ------------------------------------------------------------------------ r903467 | fenton | 2008-12-30 10:55:49 -0500 (Tue, 30 Dec 2008) | 2 lines Add specialized context menu for layout/data mode for SharedAxisBoxItem. ------------------------------------------------------------------------ r903121 | netterfield | 2008-12-29 18:10:30 -0500 (Mon, 29 Dec 2008) | 3 lines More dialog tweaks. ------------------------------------------------------------------------ r903023 | fenton | 2008-12-29 13:46:20 -0500 (Mon, 29 Dec 2008) | 3 lines Fix child item saving / restoring. Add saving of SharedAxisBoxItem's. ------------------------------------------------------------------------ r900877 | fenton | 2008-12-23 16:19:08 -0500 (Tue, 23 Dec 2008) | 2 lines Add initial version of SharedAxisBoxItem allowing for basic drawing and existing layout application. ------------------------------------------------------------------------ r898762 | netterfield | 2008-12-18 18:29:48 -0500 (Thu, 18 Dec 2008) | 3 lines More dialog work... ------------------------------------------------------------------------ r898636 | netterfield | 2008-12-18 10:10:04 -0500 (Thu, 18 Dec 2008) | 3 lines More bugs ------------------------------------------------------------------------ r898368 | netterfield | 2008-12-17 21:45:19 -0500 (Wed, 17 Dec 2008) | 2 lines More bugs. ------------------------------------------------------------------------ r898367 | netterfield | 2008-12-17 21:41:03 -0500 (Wed, 17 Dec 2008) | 10 lines Work on the label tab for the plotitem dialog. -change how defaults/overrides work. -put in tab indicators for overriden -fix bugs saving and loading. -change button types. -change layouts. -fix acceloraters and tab order. -probably more stuff. ------------------------------------------------------------------------ r897430 | netterfield | 2008-12-15 22:02:53 -0500 (Mon, 15 Dec 2008) | 5 lines -Add hot keys to tool bar icons -Change behavior of toolbars/tools/layout mode. -Fix some label/descriptive name bugs ------------------------------------------------------------------------ r897428 | netterfield | 2008-12-15 21:51:13 -0500 (Mon, 15 Dec 2008) | 5 lines Add a spec for automatic labels Update bugs update object name specs ------------------------------------------------------------------------ r896214 | fenton | 2008-12-12 16:24:33 -0500 (Fri, 12 Dec 2008) | 5 lines Major update to all label dialogs. Add ApplicationSettings default label properties. All labels now support UBI / color / font family. Cleanup of PlotDialog / LabelTab. ------------------------------------------------------------------------ r896180 | fenton | 2008-12-12 14:21:11 -0500 (Fri, 12 Dec 2008) | 2 lines Add labellineedit support widget. ------------------------------------------------------------------------ r895566 | netterfield | 2008-12-10 21:09:41 -0500 (Wed, 10 Dec 2008) | 2 lines claim a bug as my very own... ------------------------------------------------------------------------ r895538 | fenton | 2008-12-10 18:04:15 -0500 (Wed, 10 Dec 2008) | 4 lines Add ViewDialog. Turn ApplicationSettings into default settings, not pushed through system. Add context menus for Views. ------------------------------------------------------------------------ r895333 | fenton | 2008-12-10 08:48:42 -0500 (Wed, 10 Dec 2008) | 2 lines Switch axis label backgrounds to transparent. ------------------------------------------------------------------------ r895028 | fenton | 2008-12-09 15:51:01 -0500 (Tue, 09 Dec 2008) | 2 lines Update bug list. ------------------------------------------------------------------------ r894967 | netterfield | 2008-12-09 12:42:42 -0500 (Tue, 09 Dec 2008) | 6 lines Add a dimensions tab to view object dialogs, to allow location, size, and orientation of view objects to be set manually. Add defaults to changedatasamplesdialog. ------------------------------------------------------------------------ r894963 | netterfield | 2008-12-09 12:36:01 -0500 (Tue, 09 Dec 2008) | 3 lines Update bug list ------------------------------------------------------------------------ r894951 | fenton | 2008-12-09 12:25:56 -0500 (Tue, 09 Dec 2008) | 2 lines Add commands / functions to trigger view updates for sharing axis only. ------------------------------------------------------------------------ r894425 | fenton | 2008-12-08 11:00:23 -0500 (Mon, 08 Dec 2008) | 3 lines Add LabelCreator Connect new Label widgets. ------------------------------------------------------------------------ r893051 | fenton | 2008-12-05 16:06:39 -0500 (Fri, 05 Dec 2008) | 2 lines Add Label Builder widget. ------------------------------------------------------------------------ r892941 | fenton | 2008-12-05 09:41:41 -0500 (Fri, 05 Dec 2008) | 2 lines Fix layout of CurveTab. ------------------------------------------------------------------------ r892251 | fenton | 2008-12-03 16:32:54 -0500 (Wed, 03 Dec 2008) | 2 lines Add Bug Report Wizard. ------------------------------------------------------------------------ r892223 | fenton | 2008-12-03 15:08:19 -0500 (Wed, 03 Dec 2008) | 2 lines Update version. ------------------------------------------------------------------------ r892222 | fenton | 2008-12-03 15:07:43 -0500 (Wed, 03 Dec 2008) | 2 lines Update version display for debug. ------------------------------------------------------------------------ r891812 | netterfield | 2008-12-02 17:02:59 -0500 (Tue, 02 Dec 2008) | 7 lines Put a minimum size on the dialog list widget. This is not the best solution, because it is font/resolution dependent. I can't figure out how to make the dialog list widget be the size of the largest item, however. ------------------------------------------------------------------------ r891706 | fenton | 2008-12-02 12:41:35 -0500 (Tue, 02 Dec 2008) | 2 lines Add DataSource validation to DataSourceSelectorDialog. ------------------------------------------------------------------------ r891443 | netterfield | 2008-12-01 21:46:32 -0500 (Mon, 01 Dec 2008) | 3 lines More bugs. ------------------------------------------------------------------------ r891366 | netterfield | 2008-12-01 15:51:29 -0500 (Mon, 01 Dec 2008) | 3 lines Update bug list, including adding new bugs. ------------------------------------------------------------------------ r891364 | netterfield | 2008-12-01 15:50:46 -0500 (Mon, 01 Dec 2008) | 6 lines -Icons for contents tab -Fix up/down/add/remove button behavior in content tab -Add settings to change axis number font. -Change behavior of string dialog to use checkable group boxes. ------------------------------------------------------------------------ r891339 | fenton | 2008-12-01 14:35:52 -0500 (Mon, 01 Dec 2008) | 2 lines Add static validDataSource based on file check. ------------------------------------------------------------------------ r891276 | fenton | 2008-12-01 09:51:49 -0500 (Mon, 01 Dec 2008) | 2 lines Merge release changes to main branch. ------------------------------------------------------------------------ r890319 | fenton | 2008-11-28 17:06:24 -0500 (Fri, 28 Nov 2008) | 2 lines Activate new selectors. ------------------------------------------------------------------------ r890318 | fenton | 2008-11-28 17:05:18 -0500 (Fri, 28 Nov 2008) | 2 lines Create separate FileRequester / DataSourceSelector widgets. ------------------------------------------------------------------------ r890240 | fenton | 2008-11-28 11:35:34 -0500 (Fri, 28 Nov 2008) | 2 lines Update DataSourceSelectorDialog to allow selection of directories and to clear file selection on directory change. ------------------------------------------------------------------------ r889743 | fenton | 2008-11-27 09:10:09 -0500 (Thu, 27 Nov 2008) | 2 lines Warning cleanup. ------------------------------------------------------------------------ r889738 | fenton | 2008-11-27 08:56:07 -0500 (Thu, 27 Nov 2008) | 2 lines Warning Cleanup. ------------------------------------------------------------------------ r889493 | fenton | 2008-11-26 17:26:40 -0500 (Wed, 26 Nov 2008) | 2 lines Clean up warnings. ------------------------------------------------------------------------ r889447 | fenton | 2008-11-26 16:04:54 -0500 (Wed, 26 Nov 2008) | 2 lines Fix warnings. ------------------------------------------------------------------------ r889434 | fenton | 2008-11-26 15:24:43 -0500 (Wed, 26 Nov 2008) | 2 lines Clean up warnings. ------------------------------------------------------------------------ r889399 | fenton | 2008-11-26 13:14:38 -0500 (Wed, 26 Nov 2008) | 2 lines Cleanup Healpix Datasource warnings. ------------------------------------------------------------------------ r889388 | fenton | 2008-11-26 12:06:08 -0500 (Wed, 26 Nov 2008) | 2 lines Add Untested port of the Planck IDEF Datasource Plugin. ------------------------------------------------------------------------ r888546 | netterfield | 2008-11-24 14:55:00 -0500 (Mon, 24 Nov 2008) | 16 lines Stuck in an airport Saturday, so... Make plotitems into namedobjects so they get sensible names in the combo-boxes. Fix ascii config dialog, so it loads properly. Update command line parser help output. Partially fix default Y axis labels. Something happened to mess up *all* of the whitespace in plotitem.cpp. I have undone most of it, but there are still some caprecious changes lingering (sigh). ------------------------------------------------------------------------ r888544 | netterfield | 2008-11-24 14:50:11 -0500 (Mon, 24 Nov 2008) | 3 lines Add missing images. ------------------------------------------------------------------------ r888435 | fenton | 2008-11-24 08:35:31 -0500 (Mon, 24 Nov 2008) | 2 lines Remove unused property. ------------------------------------------------------------------------ r887396 | fenton | 2008-11-21 14:50:04 -0500 (Fri, 21 Nov 2008) | 2 lines Add Healpix Datasource (untested). ------------------------------------------------------------------------ r887029 | netterfield | 2008-11-20 16:47:32 -0500 (Thu, 20 Nov 2008) | 3 lines More upgrades to the data wizard. ------------------------------------------------------------------------ r886913 | fenton | 2008-11-20 09:13:34 -0500 (Thu, 20 Nov 2008) | 2 lines Update requirements. ------------------------------------------------------------------------ r886668 | fenton | 2008-11-19 15:02:30 -0500 (Wed, 19 Nov 2008) | 2 lines Fix ASCII plugin not loading / reading values correctly. ------------------------------------------------------------------------ r886377 | netterfield | 2008-11-18 23:26:19 -0500 (Tue, 18 Nov 2008) | 4 lines Improve behavior of data wizard field selector. It now has the right behavioir, but is ~n^2. This can (and must) be sped up. ------------------------------------------------------------------------ r886370 | netterfield | 2008-11-18 22:15:57 -0500 (Tue, 18 Nov 2008) | 4 lines -dialogDefaults for x axis field in data wizard. -fix watcher for dirfiles (but now requires getdata 0.4.2 or better) ------------------------------------------------------------------------ r886210 | fenton | 2008-11-18 15:00:56 -0500 (Tue, 18 Nov 2008) | 2 lines Update install directions to include Windows details. ------------------------------------------------------------------------ r886203 | fenton | 2008-11-18 14:49:09 -0500 (Tue, 18 Nov 2008) | 2 lines Alternate Fix for Windows build. ------------------------------------------------------------------------ r886151 | fenton | 2008-11-18 11:50:04 -0500 (Tue, 18 Nov 2008) | 2 lines Add remaining windows build fixes for plugins. ------------------------------------------------------------------------ r885885 | netterfield | 2008-11-17 21:02:10 -0500 (Mon, 17 Nov 2008) | 2 lines Update bugs ------------------------------------------------------------------------ r885882 | netterfield | 2008-11-17 20:50:34 -0500 (Mon, 17 Nov 2008) | 4 lines More improvements to the data wizard. Improvements to the vector dialog. ------------------------------------------------------------------------ r885820 | netterfield | 2008-11-17 18:20:31 -0500 (Mon, 17 Nov 2008) | 5 lines Fix bug with oxygen theme (unwanted scrollbars) Fix bug in wizard: impossible to use generated X vectors Rework wizard to look/work a little better ------------------------------------------------------------------------ r885729 | fenton | 2008-11-17 15:11:47 -0500 (Mon, 17 Nov 2008) | 2 lines Fix windows build error. ------------------------------------------------------------------------ r885703 | fenton | 2008-11-17 14:25:55 -0500 (Mon, 17 Nov 2008) | 3 lines Improve plugin dialog appearances. Add pluginname driven titles. ------------------------------------------------------------------------ r885641 | fenton | 2008-11-17 10:45:57 -0500 (Mon, 17 Nov 2008) | 5 lines Lock to Curve Y Vector for Filters. Remove DataManager Create Fit from Vectors. Add DataManager Create Filter from DataObject Vectors. Add Vector Locking in Fit/Filters from DataManager. ------------------------------------------------------------------------ r885580 | fenton | 2008-11-17 08:34:04 -0500 (Mon, 17 Nov 2008) | 2 lines Disable test building in Windows. ------------------------------------------------------------------------ r884406 | fenton | 2008-11-14 16:23:06 -0500 (Fri, 14 Nov 2008) | 2 lines Fix windows build error. ------------------------------------------------------------------------ r884393 | fenton | 2008-11-14 15:30:31 -0500 (Fri, 14 Nov 2008) | 2 lines Fix Windows build errors. ------------------------------------------------------------------------ r884387 | fenton | 2008-11-14 15:08:06 -0500 (Fri, 14 Nov 2008) | 2 lines Add Default value support for Scalars. ------------------------------------------------------------------------ r884292 | fenton | 2008-11-14 10:02:15 -0500 (Fri, 14 Nov 2008) | 2 lines Fix crash in plugins when no vectors is selected. ------------------------------------------------------------------------ r883911 | fenton | 2008-11-13 15:19:24 -0500 (Thu, 13 Nov 2008) | 2 lines Add simple scalar creation to ScalarSelector. ------------------------------------------------------------------------ r883802 | fenton | 2008-11-13 11:15:48 -0500 (Thu, 13 Nov 2008) | 2 lines Add lockable vectors for Fit/Filter context menu options. ------------------------------------------------------------------------ r883427 | fenton | 2008-11-12 16:42:17 -0500 (Wed, 12 Nov 2008) | 2 lines Add untested LFIIO datasource plugin. ------------------------------------------------------------------------ r883323 | netterfield | 2008-11-12 12:41:17 -0500 (Wed, 12 Nov 2008) | 4 lines Load images from the command line. Change default palette to greyscale. ------------------------------------------------------------------------ r883304 | netterfield | 2008-11-12 11:29:17 -0500 (Wed, 12 Nov 2008) | 6 lines Update command line documentation. Fix warning message in command line options Auto layout should lay out in an sqrt(N) by sqrt(N) grid, not in a collumn. ------------------------------------------------------------------------ r883284 | fenton | 2008-11-12 10:01:10 -0500 (Wed, 12 Nov 2008) | 2 lines Remove unnecessary includes for gsl. ------------------------------------------------------------------------ r883195 | fenton | 2008-11-12 08:01:06 -0500 (Wed, 12 Nov 2008) | 2 lines Cleanup FixedBugs. ------------------------------------------------------------------------ r883187 | fenton | 2008-11-12 07:55:56 -0500 (Wed, 12 Nov 2008) | 2 lines Fix datasource tests. ------------------------------------------------------------------------ r883185 | fenton | 2008-11-12 07:55:31 -0500 (Wed, 12 Nov 2008) | 2 lines Fix datasource tests. ------------------------------------------------------------------------ r883044 | netterfield | 2008-11-11 17:57:23 -0500 (Tue, 11 Nov 2008) | 5 lines for qimage and fitsimage source fix typeString get rid of magic strings ------------------------------------------------------------------------ r883021 | netterfield | 2008-11-11 16:58:53 -0500 (Tue, 11 Nov 2008) | 6 lines Update bug list Improve command line option logic typeString should return something useful. Fixed for ascii and dirfilesource. Fewer magic strings in ascii. ------------------------------------------------------------------------ r882993 | fenton | 2008-11-11 15:35:17 -0500 (Tue, 11 Nov 2008) | 2 lines Update INSTALL details. ------------------------------------------------------------------------ r882968 | fenton | 2008-11-11 14:52:42 -0500 (Tue, 11 Nov 2008) | 2 lines Cleanup warnings. ------------------------------------------------------------------------ r882962 | fenton | 2008-11-11 14:09:54 -0500 (Tue, 11 Nov 2008) | 2 lines Add option for GSL not being installed. ------------------------------------------------------------------------ r882935 | fenton | 2008-11-11 12:58:57 -0500 (Tue, 11 Nov 2008) | 2 lines Add test for FitsImage plugin. ------------------------------------------------------------------------ r882931 | fenton | 2008-11-11 12:39:06 -0500 (Tue, 11 Nov 2008) | 3 lines Fix strange behavior with FitsImage matrix value reads. Fix vector read failure. ------------------------------------------------------------------------ r882895 | fenton | 2008-11-11 10:30:25 -0500 (Tue, 11 Nov 2008) | 2 lines Fix crash when switching between plugins in the FilterFitDialog. ------------------------------------------------------------------------ r882630 | netterfield | 2008-11-10 21:06:22 -0500 (Mon, 10 Nov 2008) | 3 lines Bug is fixed ------------------------------------------------------------------------ r882629 | netterfield | 2008-11-10 21:04:39 -0500 (Mon, 10 Nov 2008) | 3 lines Read dirfiles from the command line. ------------------------------------------------------------------------ r882624 | netterfield | 2008-11-10 20:59:41 -0500 (Mon, 10 Nov 2008) | 3 lines update bugs ------------------------------------------------------------------------ r882470 | fenton | 2008-11-10 15:17:56 -0500 (Mon, 10 Nov 2008) | 2 lines Fix Datawizard not accepting directories. ------------------------------------------------------------------------ r882433 | netterfield | 2008-11-10 13:40:32 -0500 (Mon, 10 Nov 2008) | 4 lines More bugs, resolved bugs Update/Clarify Plot Geometry specs regarding shared axis plots. ------------------------------------------------------------------------ r882361 | fenton | 2008-11-10 11:13:14 -0500 (Mon, 10 Nov 2008) | 2 lines Fix PlotRenderItem delay on Dialog based changes. ------------------------------------------------------------------------ r882331 | fenton | 2008-11-10 08:13:39 -0500 (Mon, 10 Nov 2008) | 2 lines Add test image for fitsimage plugin. ------------------------------------------------------------------------ r881395 | netterfield | 2008-11-07 18:00:43 -0500 (Fri, 07 Nov 2008) | 3 lines This change to the .pro files make it work in ubuntu ------------------------------------------------------------------------ r881269 | fenton | 2008-11-07 12:03:10 -0500 (Fri, 07 Nov 2008) | 2 lines Add config option for building of dirfile. ------------------------------------------------------------------------ r881264 | fenton | 2008-11-07 11:44:38 -0500 (Fri, 07 Nov 2008) | 2 lines Add FitsImage plugin (Untested) ------------------------------------------------------------------------ r881254 | fenton | 2008-11-07 10:38:55 -0500 (Fri, 07 Nov 2008) | 2 lines Fix DirFile source not correctly parsing the incoming filename when validating. ------------------------------------------------------------------------ r881232 | netterfield | 2008-11-07 09:47:21 -0500 (Fri, 07 Nov 2008) | 9 lines Fix a couple bugs. -edit vector from vector selector on slave vector now edits provider -edit scalar from scalar selector on slave scalar now edits provider Move some documentation around ------------------------------------------------------------------------ r881113 | netterfield | 2008-11-07 09:23:42 -0500 (Fri, 07 Nov 2008) | 4 lines Update Bugs. There are a number of new regressions. ------------------------------------------------------------------------ r880831 | fenton | 2008-11-06 10:51:06 -0500 (Thu, 06 Nov 2008) | 2 lines Fix DirFile tests. ------------------------------------------------------------------------ r880830 | fenton | 2008-11-06 10:50:02 -0500 (Thu, 06 Nov 2008) | 2 lines Add fileType identifier. ------------------------------------------------------------------------ r880811 | fenton | 2008-11-06 09:58:27 -0500 (Thu, 06 Nov 2008) | 2 lines Update library includes for plugins. ------------------------------------------------------------------------ r880789 | netterfield | 2008-11-06 08:12:52 -0500 (Thu, 06 Nov 2008) | 3 lines Add readme to say where to get the getdata library. ------------------------------------------------------------------------ r880592 | netterfield | 2008-11-05 17:10:23 -0500 (Wed, 05 Nov 2008) | 12 lines port the dirfile datasource to use the external getdata library. add field scalars to kst and have dirfilesource provide them add field strings to kst and have dirfilesource provide them field strings need more work -they need to show up in the string view dialog -they need to get coppied in replace dependant type functions Still need to add a readme to tell you where to get said library. Need to decide how to deal with data sources that use external libraries ------------------------------------------------------------------------ r880511 | fenton | 2008-11-05 13:26:20 -0500 (Wed, 05 Nov 2008) | 2 lines Fix Equation Parsing tests. ------------------------------------------------------------------------ r880496 | fenton | 2008-11-05 12:29:43 -0500 (Wed, 05 Nov 2008) | 2 lines Add reset of NamedObject incrementors to ObjectStore clear. ------------------------------------------------------------------------ r880090 | fenton | 2008-11-04 13:24:54 -0500 (Tue, 04 Nov 2008) | 2 lines Convert double comparison to templates. ------------------------------------------------------------------------ r880067 | fenton | 2008-11-04 11:54:24 -0500 (Tue, 04 Nov 2008) | 2 lines Update DOUBLE_EQUAL ------------------------------------------------------------------------ r880060 | fenton | 2008-11-04 11:38:23 -0500 (Tue, 04 Nov 2008) | 2 lines Fix double comparisons in equation node parsing. ------------------------------------------------------------------------ r879681 | fenton | 2008-11-03 15:06:52 -0500 (Mon, 03 Nov 2008) | 2 lines Add testing of DataMatrix based on the qImageSource plugin. ------------------------------------------------------------------------ r879649 | fenton | 2008-11-03 13:38:56 -0500 (Mon, 03 Nov 2008) | 3 lines Add test for qimagesource. Fix test for DirFile. ------------------------------------------------------------------------ r879648 | fenton | 2008-11-03 13:19:21 -0500 (Mon, 03 Nov 2008) | 2 lines Add dirfile test data. ------------------------------------------------------------------------ r879616 | fenton | 2008-11-03 10:47:32 -0500 (Mon, 03 Nov 2008) | 2 lines Fix close on View Matrix / View Vector Dialogs. ------------------------------------------------------------------------ r878285 | fenton | 2008-10-31 15:27:33 -0400 (Fri, 31 Oct 2008) | 2 lines Update install doc. ------------------------------------------------------------------------ r878229 | fenton | 2008-10-31 12:16:23 -0400 (Fri, 31 Oct 2008) | 2 lines Disable DataSource test from DataMatrix now that there is no Ascii Matrix. ------------------------------------------------------------------------ r878197 | fenton | 2008-10-31 10:36:57 -0400 (Fri, 31 Oct 2008) | 2 lines Add initial 2.0 Entry. ------------------------------------------------------------------------ r878186 | fenton | 2008-10-31 09:55:24 -0400 (Fri, 31 Oct 2008) | 2 lines Add stub for release details. ------------------------------------------------------------------------ r877947 | fenton | 2008-10-30 14:55:18 -0400 (Thu, 30 Oct 2008) | 2 lines Add qimagesource datasource. ------------------------------------------------------------------------ r877556 | fenton | 2008-10-29 15:41:42 -0400 (Wed, 29 Oct 2008) | 2 lines Add SampleDataSource plugin. ------------------------------------------------------------------------ r877075 | fenton | 2008-10-28 12:49:38 -0400 (Tue, 28 Oct 2008) | 2 lines Move existing non-ported Datasources to old_datasources. ------------------------------------------------------------------------ r877043 | fenton | 2008-10-28 11:28:50 -0400 (Tue, 28 Oct 2008) | 2 lines Rework DialogPage to allow for non-Tab based widgets. ------------------------------------------------------------------------ r876618 | fenton | 2008-10-27 13:51:54 -0400 (Mon, 27 Oct 2008) | 2 lines Redo of Scalar Model to display all scalars in the proper hierarchy. ------------------------------------------------------------------------ r875535 | netterfield | 2008-10-24 15:06:39 -0400 (Fri, 24 Oct 2008) | 4 lines Fix initialization for a couple more data objects. This might fix the crash on load bugs. ------------------------------------------------------------------------ r875512 | fenton | 2008-10-24 13:23:25 -0400 (Fri, 24 Oct 2008) | 2 lines Fix DataSource naming. ------------------------------------------------------------------------ r875244 | fenton | 2008-10-23 15:44:26 -0400 (Thu, 23 Oct 2008) | 2 lines Fix bug with commandline loading layout problems. ------------------------------------------------------------------------ r875224 | fenton | 2008-10-23 14:22:40 -0400 (Thu, 23 Oct 2008) | 2 lines Move MatrixEditorDialog to ViewMatrixDialog. ------------------------------------------------------------------------ r875223 | fenton | 2008-10-23 14:21:33 -0400 (Thu, 23 Oct 2008) | 2 lines Update kst.pro to build the plugins directory. ------------------------------------------------------------------------ r875214 | fenton | 2008-10-23 13:46:23 -0400 (Thu, 23 Oct 2008) | 2 lines Update Vector View Dialog to have vector selector and rename to ViewVectorDialog to accurately represent the feature set. ------------------------------------------------------------------------ r875177 | netterfield | 2008-10-23 10:55:09 -0400 (Thu, 23 Oct 2008) | 5 lines Encourage histograms to not crash kst when read from file or from command line. They were being created with invalid slave vectors, so resize killed thing. Also, set the name in the constructor, not in change(...). ------------------------------------------------------------------------ r874954 | fenton | 2008-10-22 17:29:02 -0400 (Wed, 22 Oct 2008) | 2 lines Add SyncBin plugin. ------------------------------------------------------------------------ r874884 | fenton | 2008-10-22 13:43:43 -0400 (Wed, 22 Oct 2008) | 2 lines Adding Statistics dataobject plugin. ------------------------------------------------------------------------ r874847 | netterfield | 2008-10-22 10:25:29 -0400 (Wed, 22 Oct 2008) | 7 lines Improve the data manager. Remove bug reading files. Fix bug deleting tabs. Remove some dead code from the file writer. Fix bug saving skip attributes in data vectors. ------------------------------------------------------------------------ r874796 | fenton | 2008-10-22 09:26:04 -0400 (Wed, 22 Oct 2008) | 2 lines Add Shift DataObject Plugin. ------------------------------------------------------------------------ r874517 | fenton | 2008-10-21 15:15:18 -0400 (Tue, 21 Oct 2008) | 2 lines Add Phase DataObject plugin. ------------------------------------------------------------------------ r874448 | fenton | 2008-10-21 12:09:54 -0400 (Tue, 21 Oct 2008) | 2 lines Add Periodogram plugin. ------------------------------------------------------------------------ r874170 | fenton | 2008-10-20 17:37:12 -0400 (Mon, 20 Oct 2008) | 2 lines Add Noise Addition plugin. ------------------------------------------------------------------------ r874075 | fenton | 2008-10-20 14:28:42 -0400 (Mon, 20 Oct 2008) | 2 lines Add Linefit DataObject plugin. ------------------------------------------------------------------------ r873994 | fenton | 2008-10-20 10:25:54 -0400 (Mon, 20 Oct 2008) | 2 lines Add Interpolation Plugins - Akima, Akima Periodic, C-Spline, C-Spline Periodic, Polynomial and Linear. ------------------------------------------------------------------------ r872653 | fenton | 2008-10-17 14:47:05 -0400 (Fri, 17 Oct 2008) | 2 lines Add orphan / non-orphan handling for string names. ------------------------------------------------------------------------ r872356 | netterfield | 2008-10-16 21:39:18 -0400 (Thu, 16 Oct 2008) | 10 lines Add a new kind of scalar: vector field scalars... make a scalar from a single sample of a vector field from a data source. Useful for numerical displays in live kst windows, etc. Work on the data manager to allow strings and scalars to be displayed. Refactor the data manager a little - simplifying things a bit. ------------------------------------------------------------------------ r872288 | fenton | 2008-10-16 16:01:00 -0400 (Thu, 16 Oct 2008) | 2 lines Add Generic Filter plugin. ------------------------------------------------------------------------ r872232 | fenton | 2008-10-16 13:25:14 -0400 (Thu, 16 Oct 2008) | 2 lines Add functionality to String Selector. ------------------------------------------------------------------------ r872160 | fenton | 2008-10-16 09:29:03 -0400 (Thu, 16 Oct 2008) | 2 lines Add Effective Bandwidth Plugin. ------------------------------------------------------------------------ r871815 | fenton | 2008-10-15 14:14:46 -0400 (Wed, 15 Oct 2008) | 2 lines Add Differentiation plugin. ------------------------------------------------------------------------ r871770 | fenton | 2008-10-15 10:22:08 -0400 (Wed, 15 Oct 2008) | 2 lines Add Cumulative Sum plugin. ------------------------------------------------------------------------ r871746 | fenton | 2008-10-15 09:26:50 -0400 (Wed, 15 Oct 2008) | 2 lines Add sorting for plugins. ------------------------------------------------------------------------ r871385 | fenton | 2008-10-14 15:52:44 -0400 (Tue, 14 Oct 2008) | 2 lines Add Cross Spectrum plugin. ------------------------------------------------------------------------ r871334 | fenton | 2008-10-14 12:28:09 -0400 (Tue, 14 Oct 2008) | 2 lines Add Convolve, Deconvolve, Auto Correlation and Cross Correlation Plugins. ------------------------------------------------------------------------ r869682 | fenton | 2008-10-09 14:57:25 -0400 (Thu, 09 Oct 2008) | 2 lines Add Chop Data Object Plugin. ------------------------------------------------------------------------ r869660 | fenton | 2008-10-09 12:48:01 -0400 (Thu, 09 Oct 2008) | 2 lines Add Bin Data Object plugin. ------------------------------------------------------------------------ r869640 | fenton | 2008-10-09 11:27:43 -0400 (Thu, 09 Oct 2008) | 3 lines Add Error Display for BasicPluginDialog. Add DataManager entry for Plugins. ------------------------------------------------------------------------ r869351 | fenton | 2008-10-08 16:20:46 -0400 (Wed, 08 Oct 2008) | 2 lines Add Gaussian and Lorentzian Weighted Fits plugins. ------------------------------------------------------------------------ r869255 | fenton | 2008-10-08 12:13:01 -0400 (Wed, 08 Oct 2008) | 2 lines Add Non-Linear Weighted Exponential Fits plugin. ------------------------------------------------------------------------ r868922 | fenton | 2008-10-07 11:41:24 -0400 (Tue, 07 Oct 2008) | 2 lines Add Gaussian Unweighted and Lorentzian unweighted Fits plugins. ------------------------------------------------------------------------ r868651 | fenton | 2008-10-06 16:44:52 -0400 (Mon, 06 Oct 2008) | 2 lines Add Exponential unweighted plugin. ------------------------------------------------------------------------ r868530 | fenton | 2008-10-06 10:09:38 -0400 (Mon, 06 Oct 2008) | 3 lines Add Knee Frequency Fits Plugin. Add Error Message provision for Plugins and display in Filter Fit Dialog. ------------------------------------------------------------------------ r867476 | fenton | 2008-10-03 11:39:08 -0400 (Fri, 03 Oct 2008) | 2 lines Add Polynomial Weighted and Sinusoid Weighted Plugins. ------------------------------------------------------------------------ r867068 | fenton | 2008-10-02 13:59:56 -0400 (Thu, 02 Oct 2008) | 2 lines Add Sinusoid Unweighted and Polynomial unweighted Fits Plugins. ------------------------------------------------------------------------ r866992 | fenton | 2008-10-02 11:00:04 -0400 (Thu, 02 Oct 2008) | 4 lines Updates to BasicPlugin Interfaces 1) Add Validation check to prevent invalid object creation. 2) Add Scalar Creation based on Parameter Vectors. ------------------------------------------------------------------------ r866645 | fenton | 2008-10-01 10:51:14 -0400 (Wed, 01 Oct 2008) | 2 lines Add Gradient Unweighted and Gradient Weighted Fits Plugins. ------------------------------------------------------------------------ r866008 | netterfield | 2008-09-29 15:29:05 -0400 (Mon, 29 Sep 2008) | 2 lines Clarify bug report ------------------------------------------------------------------------ r866007 | netterfield | 2008-09-29 15:24:24 -0400 (Mon, 29 Sep 2008) | 7 lines Remove metadata from datasources. metadata is now to be handled as dataScalars and dataStrings, which have both been added to the datasource ui. The other data sources can now be ported. ------------------------------------------------------------------------ r865467 | netterfield | 2008-09-27 12:56:47 -0400 (Sat, 27 Sep 2008) | 6 lines -Add dataStrings -Add reading of strings to data sources -Add a stringDialog to edit and create strings -Fix some compiler warnings ------------------------------------------------------------------------ r865055 | fenton | 2008-09-26 10:39:05 -0400 (Fri, 26 Sep 2008) | 2 lines Add Linear Unweighted Fits plugin. ------------------------------------------------------------------------ r864855 | fenton | 2008-09-25 14:41:35 -0400 (Thu, 25 Sep 2008) | 2 lines Add Linear Weighted Fits plugin. ------------------------------------------------------------------------ r864803 | netterfield | 2008-09-25 10:31:43 -0400 (Thu, 25 Sep 2008) | 6 lines -DataScalars can now be saved -Clean up some un-ref variable warnings -start to add strings to data sources -add a debug warning about a bug ------------------------------------------------------------------------ r864429 | fenton | 2008-09-24 15:27:18 -0400 (Wed, 24 Sep 2008) | 2 lines Add ports for Butterworth High Pass Filter, Butterworth Band Stop Filter and Butterworth Band Pass Filter. ------------------------------------------------------------------------ r864326 | fenton | 2008-09-24 10:05:38 -0400 (Wed, 24 Sep 2008) | 2 lines Update the current Bug Status. ------------------------------------------------------------------------ r863732 | netterfield | 2008-09-22 20:06:03 -0400 (Mon, 22 Sep 2008) | 3 lines Clean up some of the devel-docs ------------------------------------------------------------------------ r863731 | netterfield | 2008-09-22 19:55:28 -0400 (Mon, 22 Sep 2008) | 8 lines -Invent data scalars -Add data scalars to the scalar dialog -upgrade data sources to know about data scalars -put basic data scalars into dirfiles and ascii data sources -fix a few little bugs here and there -capriciously fix a few compiler warnings ------------------------------------------------------------------------ r863676 | fenton | 2008-09-22 16:12:28 -0400 (Mon, 22 Sep 2008) | 2 lines Make Vector and Matrix viewers non-persisted items to provide accurate details. ------------------------------------------------------------------------ r863649 | fenton | 2008-09-22 14:53:29 -0400 (Mon, 22 Sep 2008) | 2 lines Add filter plugin for butterworth low pass. ------------------------------------------------------------------------ r862748 | fenton | 2008-09-19 14:39:41 -0400 (Fri, 19 Sep 2008) | 3 lines Add Content Menu support for Fit/Filter from DataManager and PlotItems. Add CurveAppearance Settings / curve creation to FitFilterDialog, including interface extensions to support. ------------------------------------------------------------------------ r862365 | fenton | 2008-09-18 13:32:33 -0400 (Thu, 18 Sep 2008) | 2 lines Add FilterFitDialog. ------------------------------------------------------------------------ r861991 | fenton | 2008-09-17 14:21:27 -0400 (Wed, 17 Sep 2008) | 2 lines Move Kst 1.X plugins to old_plugins. ------------------------------------------------------------------------ r861982 | fenton | 2008-09-17 14:04:23 -0400 (Wed, 17 Sep 2008) | 4 lines Add basic support for filter plugins. Port Despike filter to new format. Update Plugin Interface to include Type and Description. ------------------------------------------------------------------------ r861586 | fenton | 2008-09-16 10:37:12 -0400 (Tue, 16 Sep 2008) | 2 lines Add PlotStandarization to ensure uniform margin sizes. ------------------------------------------------------------------------ r860332 | fenton | 2008-09-12 13:56:31 -0400 (Fri, 12 Sep 2008) | 4 lines Add DataSourceSelector Dialog. Modifications to FileRequester. Remove Directory selector option from VectorTab. ------------------------------------------------------------------------ r859986 | fenton | 2008-09-11 13:53:07 -0400 (Thu, 11 Sep 2008) | 2 lines Fix DirFile not picking up when the directory is provided without a trailing / ------------------------------------------------------------------------ r859689 | netterfield | 2008-09-10 23:29:47 -0400 (Wed, 10 Sep 2008) | 6 lines -Fix many dialogs to look better w/ oxygen, and to work better on a wide screen. -Start of adding scalars to data sources ------------------------------------------------------------------------ r859548 | fenton | 2008-09-10 11:57:51 -0400 (Wed, 10 Sep 2008) | 2 lines Add Selective drawing of object details when printing. ------------------------------------------------------------------------ r859193 | fenton | 2008-09-09 14:49:43 -0400 (Tue, 09 Sep 2008) | 2 lines Implement DebugDialog functionality. ------------------------------------------------------------------------ r858825 | fenton | 2008-09-08 15:43:37 -0400 (Mon, 08 Sep 2008) | 2 lines Fix Segfaults when creating objects and not placing them in Plots. ------------------------------------------------------------------------ r858777 | fenton | 2008-09-08 13:28:25 -0400 (Mon, 08 Sep 2008) | 2 lines Remove ViewManager options. ------------------------------------------------------------------------ r858716 | fenton | 2008-09-08 10:36:31 -0400 (Mon, 08 Sep 2008) | 2 lines Fix Demo Model. ------------------------------------------------------------------------ r857568 | fenton | 2008-09-05 14:38:06 -0400 (Fri, 05 Sep 2008) | 2 lines Remove overlapping Assert. ------------------------------------------------------------------------ r857567 | fenton | 2008-09-05 14:37:36 -0400 (Fri, 05 Sep 2008) | 2 lines Cleanup unnecessary namespace definition. ------------------------------------------------------------------------ r857492 | fenton | 2008-09-05 10:42:36 -0400 (Fri, 05 Sep 2008) | 2 lines Fix QString Arg errors for Images and Matrices. ------------------------------------------------------------------------ r857134 | fenton | 2008-09-04 15:22:43 -0400 (Thu, 04 Sep 2008) | 2 lines Fix Scene addition errors in DataWizard. Add wait cursor while building the plots. ------------------------------------------------------------------------ r857083 | fenton | 2008-09-04 12:32:00 -0400 (Thu, 04 Sep 2008) | 2 lines Fix crash with Qt 4.4.X matching items differently than 4.3.X ------------------------------------------------------------------------ r857000 | fenton | 2008-09-04 07:56:52 -0400 (Thu, 04 Sep 2008) | 2 lines Remove old Debug. ------------------------------------------------------------------------ r856763 | fenton | 2008-09-03 14:21:53 -0400 (Wed, 03 Sep 2008) | 2 lines Fix Legend appearing after cancel of dialog. ------------------------------------------------------------------------ r856430 | fenton | 2008-09-02 16:49:50 -0400 (Tue, 02 Sep 2008) | 2 lines Add defines for label parsing debug output. ------------------------------------------------------------------------ r856387 | fenton | 2008-09-02 15:00:44 -0400 (Tue, 02 Sep 2008) | 4 lines Initial fixes for Qt 4.4.X segfaults. Fix crash on load. Fix crash on appending of empty strings in description fields. ------------------------------------------------------------------------ r854111 | fenton | 2008-08-28 16:55:52 -0400 (Thu, 28 Aug 2008) | 3 lines Modify update manager to support PlotItem specialized returns / PlotItem based instead of PlotRenderItem based. Add persisted zoom mode to PlotItem on update. ------------------------------------------------------------------------ r852339 | fenton | 2008-08-25 15:28:42 -0400 (Mon, 25 Aug 2008) | 2 lines Add debug define for plot label region. ------------------------------------------------------------------------ r850115 | fenton | 2008-08-20 16:13:07 -0400 (Wed, 20 Aug 2008) | 2 lines Fix ZoomYRange and ZoomXRange. ------------------------------------------------------------------------ r849992 | fenton | 2008-08-20 11:36:54 -0400 (Wed, 20 Aug 2008) | 2 lines Add caching to Images and benchmarking. ------------------------------------------------------------------------ r847104 | fenton | 2008-08-14 14:49:50 -0400 (Thu, 14 Aug 2008) | 2 lines Optimize Bar drawing for curves. ------------------------------------------------------------------------ r846649 | fenton | 2008-08-13 15:56:25 -0400 (Wed, 13 Aug 2008) | 2 lines Add caching of curve calculations for drawing. ------------------------------------------------------------------------ r846623 | fenton | 2008-08-13 15:29:31 -0400 (Wed, 13 Aug 2008) | 2 lines Modify update request to 2nd level debugging. ------------------------------------------------------------------------ r845465 | fenton | 2008-08-11 14:22:41 -0400 (Mon, 11 Aug 2008) | 2 lines Fix for saving of backgrounds for viewitems. ------------------------------------------------------------------------ r844062 | fenton | 2008-08-08 11:21:05 -0400 (Fri, 08 Aug 2008) | 2 lines Fix gradient resetting in GradientEditor and make it more robust. ------------------------------------------------------------------------ r843749 | fenton | 2008-08-07 14:45:38 -0400 (Thu, 07 Aug 2008) | 4 lines Add configurable background for views. Add special reset mode for gradient editor. Save background as application setting. ------------------------------------------------------------------------ r837860 | fenton | 2008-07-25 17:51:26 -0400 (Fri, 25 Jul 2008) | 3 lines Fix for printing errors. Convert all font sizing to pixel based. ------------------------------------------------------------------------ r837436 | fenton | 2008-07-24 13:42:50 -0400 (Thu, 24 Jul 2008) | 4 lines Add Shared Axis updating on item move. Remove triggering of invalid zoom's. Add Shared Axis updating on non-tied zooms. ------------------------------------------------------------------------ r837031 | fenton | 2008-07-23 11:32:30 -0400 (Wed, 23 Jul 2008) | 4 lines Eliminate overlapping items created by the Grid. Fix DataWizard Layouts. Add Debugging of Grid Creation. ------------------------------------------------------------------------ r836127 | fenton | 2008-07-21 15:11:50 -0400 (Mon, 21 Jul 2008) | 2 lines Update creation layout modes to support Automatic, Custom and Protected. ------------------------------------------------------------------------ r834343 | netterfield | 2008-07-18 13:28:12 -0400 (Fri, 18 Jul 2008) | 5 lines -Pause works now -Immediate update for some vector dialogs -Timer is minimum period, not maximum frequency - fix variable names and labels. ------------------------------------------------------------------------ r834323 | fenton | 2008-07-18 12:45:41 -0400 (Fri, 18 Jul 2008) | 2 lines Create interfaces for new Creation Modes for both CurvePlacement and DataWizard. ------------------------------------------------------------------------ r833979 | fenton | 2008-07-17 14:41:55 -0400 (Thu, 17 Jul 2008) | 2 lines Create Custom Grid building options. ------------------------------------------------------------------------ r833516 | netterfield | 2008-07-16 18:53:37 -0400 (Wed, 16 Jul 2008) | 7 lines primitives gain an immediateUpdate command, which propogates an update (including dependents) immediately. primitives get an updated() signal, replacing matrixUpdated, vectorUpdated, and scalarUpdated(). ------------------------------------------------------------------------ r833426 | fenton | 2008-07-16 15:57:04 -0400 (Wed, 16 Jul 2008) | 3 lines Fix updateChildGeometry to function with Circles. Update Layout drawing to support fixedSize and lockedAspectRatio items. ------------------------------------------------------------------------ r833284 | fenton | 2008-07-16 11:33:46 -0400 (Wed, 16 Jul 2008) | 3 lines Remove persisted Layouts. Fix label overdrawing. ------------------------------------------------------------------------ r832468 | fenton | 2008-07-14 14:45:22 -0400 (Mon, 14 Jul 2008) | 2 lines Update Bug tracking. ------------------------------------------------------------------------ r832464 | fenton | 2008-07-14 14:43:48 -0400 (Mon, 14 Jul 2008) | 4 lines Fix for Label rotate / resize bug. Add relative center position tracking. Add fixed size flag to prevent resize in updatechildgeometry triggering a position change. ------------------------------------------------------------------------ r832080 | netterfield | 2008-07-13 21:24:10 -0400 (Sun, 13 Jul 2008) | 3 lines clean up dead code (and make tests compile) ------------------------------------------------------------------------ r832048 | netterfield | 2008-07-13 19:08:34 -0400 (Sun, 13 Jul 2008) | 4 lines -Clean up some dead code -some toolbar work ------------------------------------------------------------------------ r831081 | fenton | 2008-07-11 15:49:54 -0400 (Fri, 11 Jul 2008) | 3 lines Update DataWizard to support Labels / Legend. Fix crash in Datawizard. ------------------------------------------------------------------------ r830984 | fenton | 2008-07-11 11:49:16 -0400 (Fri, 11 Jul 2008) | 2 lines Add drawing of legend and placement of legendItem within the plot. ------------------------------------------------------------------------ r830967 | netterfield | 2008-07-11 10:55:44 -0400 (Fri, 11 Jul 2008) | 4 lines Add pause, read to end, forward and back toolbar icons. Start to implement read to end, forward, and back. Needs immediate curve updates. ------------------------------------------------------------------------ r830013 | fenton | 2008-07-09 10:20:39 -0400 (Wed, 09 Jul 2008) | 2 lines Add tracking of displayed relations to LegendItem. ------------------------------------------------------------------------ r829689 | fenton | 2008-07-08 17:15:18 -0400 (Tue, 08 Jul 2008) | 2 lines Add Label Parsing to Plot Labels and drawing into Pixmap. ------------------------------------------------------------------------ r829277 | netterfield | 2008-07-07 19:50:09 -0400 (Mon, 07 Jul 2008) | 3 lines a placeholder icon for text labels. ------------------------------------------------------------------------ r829276 | netterfield | 2008-07-07 19:48:58 -0400 (Mon, 07 Jul 2008) | 7 lines -matrixSelector, scalarSelector and vectorSelector now can access the name of newly created objects, and set themselves to view them -move to icons only on toolbar (more compact!) ------------------------------------------------------------------------ r829239 | fenton | 2008-07-07 17:29:47 -0400 (Mon, 07 Jul 2008) | 2 lines Enable printing and exporting of graphics file. ------------------------------------------------------------------------ r829183 | fenton | 2008-07-07 15:32:31 -0400 (Mon, 07 Jul 2008) | 2 lines Add Editor for Legend Item. ------------------------------------------------------------------------ r828069 | fenton | 2008-07-04 10:37:17 -0400 (Fri, 04 Jul 2008) | 2 lines Add Legend class with placement but no drawing. ------------------------------------------------------------------------ r827871 | netterfield | 2008-07-03 20:51:53 -0400 (Thu, 03 Jul 2008) | 3 lines add bug ------------------------------------------------------------------------ r826873 | netterfield | 2008-07-01 14:08:52 -0400 (Tue, 01 Jul 2008) | 3 lines Clarify bug ------------------------------------------------------------------------ r826845 | netterfield | 2008-07-01 11:52:29 -0400 (Tue, 01 Jul 2008) | 3 lines delete now empty defaultnames.? and all references to it. ------------------------------------------------------------------------ r826599 | netterfield | 2008-07-01 00:00:08 -0400 (Tue, 01 Jul 2008) | 6 lines Numerous dialog and naming bug fixes, including: -scalar combo refilling from equation dialog -better combo to equation filling -fix generated scalar naming ------------------------------------------------------------------------ r826571 | netterfield | 2008-06-30 20:24:06 -0400 (Mon, 30 Jun 2008) | 3 lines Now we can change the names of generated vectors. ------------------------------------------------------------------------ r826570 | netterfield | 2008-06-30 20:13:46 -0400 (Mon, 30 Jun 2008) | 3 lines Changing entries one of the vector combos in the equation dialog changes the others as well. ------------------------------------------------------------------------ r826552 | netterfield | 2008-06-30 19:13:04 -0400 (Mon, 30 Jun 2008) | 8 lines If the content of any vector combo in the curve dialog is changed (eg, new vector, or edit, which could change the name) then repopulate all of the combos - so they read and contain all the correct stuff. This needs to be done to all of the other combos that refer to multiple vectors as well (ie, equation dialog) ------------------------------------------------------------------------ r826472 | netterfield | 2008-06-30 16:09:06 -0400 (Mon, 30 Jun 2008) | 6 lines -Add tool tip descriptions to most objects. -Convince vector selectors to show the newly created vector, if you create a new vector from the vector selector. Still needs to be done to scalar and matrix selectors. ------------------------------------------------------------------------ r826471 | netterfield | 2008-06-30 16:05:32 -0400 (Mon, 30 Jun 2008) | 4 lines -More documentation on grids and layouts -New bugs. ------------------------------------------------------------------------ r824385 | fenton | 2008-06-25 13:12:43 -0400 (Wed, 25 Jun 2008) | 2 lines Cleanup of warnings / constructors for base objects. ------------------------------------------------------------------------ r824252 | fenton | 2008-06-25 09:31:31 -0400 (Wed, 25 Jun 2008) | 2 lines Fix display of filltab when used on PlotItemDialog. ------------------------------------------------------------------------ r824027 | fenton | 2008-06-24 13:23:47 -0400 (Tue, 24 Jun 2008) | 4 lines Clean up of Primitive Constructors. Fix memory allocation error in Matrices. Fix DataSource Tests. ------------------------------------------------------------------------ r823651 | fenton | 2008-06-23 15:24:12 -0400 (Mon, 23 Jun 2008) | 2 lines Fix warnings. ------------------------------------------------------------------------ r823635 | fenton | 2008-06-23 14:38:45 -0400 (Mon, 23 Jun 2008) | 4 lines Cleanup of unused/undesireable constructors for DataObjects. Fixing of Tests. Fix crash in DataObjectConfigWidget. ------------------------------------------------------------------------ r822575 | fenton | 2008-06-20 13:13:44 -0400 (Fri, 20 Jun 2008) | 2 lines Cleanup of stale FIXME's for placement / undo. Behavior matches 1.X ------------------------------------------------------------------------ r822525 | fenton | 2008-06-20 10:17:50 -0400 (Fri, 20 Jun 2008) | 2 lines Remove Todo in save of document. Continue to save on every request. ------------------------------------------------------------------------ r822308 | fenton | 2008-06-19 15:50:42 -0400 (Thu, 19 Jun 2008) | 2 lines Cleanup Todo. ------------------------------------------------------------------------ r822306 | fenton | 2008-06-19 15:46:08 -0400 (Thu, 19 Jun 2008) | 2 lines Todo cleanup. ------------------------------------------------------------------------ r822302 | fenton | 2008-06-19 15:31:34 -0400 (Thu, 19 Jun 2008) | 2 lines Cleanup of Saving Todo's. ------------------------------------------------------------------------ r822242 | fenton | 2008-06-19 12:11:08 -0400 (Thu, 19 Jun 2008) | 3 lines Allow DirFile to function with Directories provider or format file in addition to .cur file. Add disabled interfaced for providing directories to DataVector. ------------------------------------------------------------------------ r822084 | netterfield | 2008-06-18 23:26:18 -0400 (Wed, 18 Jun 2008) | 3 lines Add tooltips to curves in the plot content tab ------------------------------------------------------------------------ r821863 | fenton | 2008-06-18 13:37:03 -0400 (Wed, 18 Jun 2008) | 2 lines Cleanup and enable GradientEditor. ------------------------------------------------------------------------ r821570 | fenton | 2008-06-17 16:49:14 -0400 (Tue, 17 Jun 2008) | 2 lines Bug status update. ------------------------------------------------------------------------ r821488 | netterfield | 2008-06-17 11:52:10 -0400 (Tue, 17 Jun 2008) | 6 lines Fix bugs in equation names (in particular, make scalar and vector references in equations dynamic). Take Mike's advice on names, and rely more heavily on the short name. ------------------------------------------------------------------------ r821487 | fenton | 2008-06-17 11:51:24 -0400 (Tue, 17 Jun 2008) | 3 lines Update KstFile Specification to be current including all name changes. Update BasicPlugin to save correctly using PNUM instead of HNUM. ------------------------------------------------------------------------ r821188 | fenton | 2008-06-16 15:32:37 -0400 (Mon, 16 Jun 2008) | 3 lines Remaining cleanup of unused constructors. Fix for crash when creating an EventMonitor DataObject. ------------------------------------------------------------------------ r821147 | fenton | 2008-06-16 11:38:43 -0400 (Mon, 16 Jun 2008) | 2 lines Fix SegFault in SamplePlugin ------------------------------------------------------------------------ r821136 | fenton | 2008-06-16 10:56:32 -0400 (Mon, 16 Jun 2008) | 4 lines Cleanup of unused constructors. Fix Sample Plugin constructor access. Remove unnecessary friend classes and comment from primitives, relations and dataobjects. ------------------------------------------------------------------------ r820286 | fenton | 2008-06-13 15:00:03 -0400 (Fri, 13 Jun 2008) | 2 lines Add Spike Insensitive logic for zooming. ------------------------------------------------------------------------ r820192 | fenton | 2008-06-13 10:40:06 -0400 (Fri, 13 Jun 2008) | 2 lines Cleanup of PlotDefines.h. ------------------------------------------------------------------------ r819992 | fenton | 2008-06-12 16:17:31 -0400 (Thu, 12 Jun 2008) | 2 lines Fixes for shortcut Key conflicts with plots and menus. ------------------------------------------------------------------------ r819888 | fenton | 2008-06-12 10:18:40 -0400 (Thu, 12 Jun 2008) | 2 lines Update for zooming. Remove zoom from main undo stack. Add middle mouse undo. ------------------------------------------------------------------------ r819531 | fenton | 2008-06-11 10:15:44 -0400 (Wed, 11 Jun 2008) | 3 lines Redo of Plot zoom stack. Add ability to not add to view undostack. Fix for Log Zoom. ------------------------------------------------------------------------ r818809 | fenton | 2008-06-09 14:05:34 -0400 (Mon, 09 Jun 2008) | 2 lines Clean up of debug code. ------------------------------------------------------------------------ r817945 | netterfield | 2008-06-07 02:49:58 -0400 (Sat, 07 Jun 2008) | 4 lines -add description tip to vector selector and scalar selector -add the tip to a number of data objects. ------------------------------------------------------------------------ r817714 | fenton | 2008-06-06 14:29:26 -0400 (Fri, 06 Jun 2008) | 2 lines Fix for updates not functioning on objects related to DataVectors. ------------------------------------------------------------------------ r817230 | fenton | 2008-06-05 11:06:39 -0400 (Thu, 05 Jun 2008) | 2 lines Fix DirFile to load and update correctly. ------------------------------------------------------------------------ r815990 | netterfield | 2008-06-02 19:53:29 -0400 (Mon, 02 Jun 2008) | 8 lines Move name stuff from object into new namedObject class, so that names can be added to view objects if we decide we want this. Start with adding tooltip comments. Vector selectors now have them, and vectors now produce them. ------------------------------------------------------------------------ r815796 | fenton | 2008-06-02 11:19:20 -0400 (Mon, 02 Jun 2008) | 3 lines Add Dialog Default support for DatObject Plugins. Fully document SamplePlugin to serve as guide for DataObjectPlugin creation. ------------------------------------------------------------------------ r814534 | fenton | 2008-05-30 11:51:00 -0400 (Fri, 30 May 2008) | 2 lines Update plugin to use new config. Add support for Load/Save of Plugin DataObjects. ------------------------------------------------------------------------ r814004 | netterfield | 2008-05-28 23:18:47 -0400 (Wed, 28 May 2008) | 6 lines The last vestiges of the old republic have been swept away... That is to say - good by old tags, hello new dynamic names. This certainly introduces new bugs. ------------------------------------------------------------------------ r813770 | fenton | 2008-05-28 14:15:05 -0400 (Wed, 28 May 2008) | 2 lines Extend SamplePlugin/Plugin Interface to support custom configuration widgets / editing of plugin objects. ------------------------------------------------------------------------ r812903 | fenton | 2008-05-26 11:36:34 -0400 (Mon, 26 May 2008) | 4 lines Add input only sample plugin (to be expanded) Divide plugin interfaces into basic / dataobject and move dataobject plugin interface to libkstmath Add basic setup for dataobject plugins to datamanager / dialog launcher. ------------------------------------------------------------------------ r811608 | netterfield | 2008-05-23 10:03:29 -0400 (Fri, 23 May 2008) | 5 lines Add dirfile maker. Some changes to tests related to new naming scheme. ------------------------------------------------------------------------ r811284 | fenton | 2008-05-22 14:17:35 -0400 (Thu, 22 May 2008) | 3 lines Point drawing optimizations. Prevent multiple points from being drawn repeatedly in point dense curves. Eliminate region calculations for point proximity calculations. ------------------------------------------------------------------------ r810759 | fenton | 2008-05-21 10:47:31 -0400 (Wed, 21 May 2008) | 2 lines Update PlotRenderItem's hover to grab focus automatically to allow Keyboard control for mouse over items. ------------------------------------------------------------------------ r810366 | fenton | 2008-05-20 10:52:33 -0400 (Tue, 20 May 2008) | 2 lines Update tests to compile / pass with tag updates. ------------------------------------------------------------------------ r808135 | fenton | 2008-05-15 15:26:51 -0400 (Thu, 15 May 2008) | 2 lines Add new XRange / YRange zoom to allow tied zoom to function as desired using CTRL/SHIFT mouse zoom. ------------------------------------------------------------------------ r807909 | netterfield | 2008-05-14 22:59:41 -0400 (Wed, 14 May 2008) | 5 lines More changes to new Names: many qwarnings now use new names delete unused functions ------------------------------------------------------------------------ r807905 | netterfield | 2008-05-14 22:05:51 -0400 (Wed, 14 May 2008) | 3 lines remove bug that has been resolved ------------------------------------------------------------------------ r807904 | netterfield | 2008-05-14 22:04:41 -0400 (Wed, 14 May 2008) | 6 lines More work on new names: short names save efficiently index values are reset on load start to remove useage of tag names, and replace with shortNames. ------------------------------------------------------------------------ r807798 | fenton | 2008-05-14 15:20:27 -0400 (Wed, 14 May 2008) | 2 lines Fix Curve Saving. Update Curve Drawing to follow line width directions regardless of pen width. ------------------------------------------------------------------------ r807723 | fenton | 2008-05-14 10:58:55 -0400 (Wed, 14 May 2008) | 2 lines Fix crash in DataManager. Update logic to properly support outputMatrices. ------------------------------------------------------------------------ r807372 | fenton | 2008-05-13 14:24:50 -0400 (Tue, 13 May 2008) | 2 lines Add Matrix/Scalar handling to update cycle. Optimizations and bug fixes. ------------------------------------------------------------------------ r805898 | fenton | 2008-05-09 11:34:34 -0400 (Fri, 09 May 2008) | 2 lines Update related cleanup. Removal of updateversion/lastupdatestatus. ------------------------------------------------------------------------ r805865 | netterfield | 2008-05-09 09:30:29 -0400 (Fri, 09 May 2008) | 3 lines Add forgotten file for short names. ------------------------------------------------------------------------ r805659 | netterfield | 2008-05-08 23:22:39 -0400 (Thu, 08 May 2008) | 3 lines The rest of the commit... new naming system ------------------------------------------------------------------------ r805657 | netterfield | 2008-05-08 23:18:53 -0400 (Thu, 08 May 2008) | 6 lines New Naming system: set, save, and load manual descriptive names save and load short names for data objects and primitives. ------------------------------------------------------------------------ r805409 | fenton | 2008-05-08 10:07:04 -0400 (Thu, 08 May 2008) | 2 lines Add File System watching for DataSource updates. ------------------------------------------------------------------------ r805156 | fenton | 2008-05-07 14:47:14 -0400 (Wed, 07 May 2008) | 2 lines Add setting to control update manager maximum update frequency. ------------------------------------------------------------------------ r805112 | netterfield | 2008-05-07 11:41:40 -0400 (Wed, 07 May 2008) | 2 lines Update bugs ------------------------------------------------------------------------ r805094 | fenton | 2008-05-07 11:04:48 -0400 (Wed, 07 May 2008) | 2 lines Add reference counting to update cycle and checks before relations/plots are permitted to update. ------------------------------------------------------------------------ r804343 | netterfield | 2008-05-05 14:35:02 -0400 (Mon, 05 May 2008) | 2 lines update bugs ------------------------------------------------------------------------ r803297 | fenton | 2008-05-02 10:18:06 -0400 (Fri, 02 May 2008) | 2 lines Initial version of UpdateManager. ------------------------------------------------------------------------ r803011 | fenton | 2008-05-01 11:06:00 -0400 (Thu, 01 May 2008) | 2 lines Add logic to decrease the number of Major Ticks / Switch to Base Offset mode dependent on the drawn length of lengths to prevent overlap of x Axis labels. ------------------------------------------------------------------------ r802528 | fenton | 2008-04-29 15:06:23 -0400 (Tue, 29 Apr 2008) | 2 lines Fix for disconnect errors. ------------------------------------------------------------------------ r802515 | fenton | 2008-04-29 13:30:39 -0400 (Tue, 29 Apr 2008) | 2 lines Move save/load of PlotAxis details into PlotAxis. Add saving of PlotMarkers. Fix drawing of incorrect subset for plot markers. ------------------------------------------------------------------------ r802158 | fenton | 2008-04-28 13:47:40 -0400 (Mon, 28 Apr 2008) | 3 lines Fix of DataVector creation. Object name was being changed resulting in tag name not matching registered name in ObjectStore. Disable name update in Edit of DataVector. ------------------------------------------------------------------------ r802112 | fenton | 2008-04-28 11:01:27 -0400 (Mon, 28 Apr 2008) | 3 lines Update conversion of MaptoProject to properly support conversion when Axis are reversed. Move drawing of SelectionRect outside of the painter translation to match the mouse / cursor location. ------------------------------------------------------------------------ r801171 | fenton | 2008-04-25 16:38:37 -0400 (Fri, 25 Apr 2008) | 2 lines Fix for Cursor updates in layout mode of PlotRenderItem's conflicting with ViewItems. ------------------------------------------------------------------------ r800746 | fenton | 2008-04-24 15:18:52 -0400 (Thu, 24 Apr 2008) | 2 lines Initial signal / slot based update for Data Based Vector paths. ------------------------------------------------------------------------ r800228 | fenton | 2008-04-23 13:54:03 -0400 (Wed, 23 Apr 2008) | 3 lines Initial version of PlotAxis, simplification of PlotItem. A number of related bug fixes. ------------------------------------------------------------------------ r799492 | fenton | 2008-04-21 13:27:37 -0400 (Mon, 21 Apr 2008) | 2 lines Update to a cached tick/label system to allow proper sizing for margins. ------------------------------------------------------------------------ r798239 | fenton | 2008-04-17 15:50:56 -0400 (Thu, 17 Apr 2008) | 2 lines Merger of Zooming / Projection Rect into plotItem to allow Plot based zoom. ------------------------------------------------------------------------ r797680 | fenton | 2008-04-16 14:19:42 -0400 (Wed, 16 Apr 2008) | 2 lines Removal of stale comment. ------------------------------------------------------------------------ r797679 | fenton | 2008-04-16 14:06:26 -0400 (Wed, 16 Apr 2008) | 2 lines Removing stale comment. ------------------------------------------------------------------------ r797361 | fenton | 2008-04-15 12:02:18 -0400 (Tue, 15 Apr 2008) | 3 lines Convert to single viewItem popup with ability to add entries. Divide margin calculations to individual values for top/bottom and left/right. ------------------------------------------------------------------------ r797003 | fenton | 2008-04-14 13:22:09 -0400 (Mon, 14 Apr 2008) | 2 lines Fix for CTRL/SHIFT selection rect marker not clearing on key release. ------------------------------------------------------------------------ r795915 | fenton | 2008-04-11 18:06:05 -0400 (Fri, 11 Apr 2008) | 3 lines Fix for label margin sizes. Add X11 DPI check for font sizes. ------------------------------------------------------------------------ r795314 | netterfield | 2008-04-09 15:46:10 -0400 (Wed, 09 Apr 2008) | 3 lines couple more bugs ------------------------------------------------------------------------ r795310 | netterfield | 2008-04-09 15:31:23 -0400 (Wed, 09 Apr 2008) | 2 lines couple new bugs ------------------------------------------------------------------------ r795208 | netterfield | 2008-04-09 09:46:54 -0400 (Wed, 09 Apr 2008) | 2 lines Delete closed bugs ------------------------------------------------------------------------ r793685 | netterfield | 2008-04-04 16:02:44 -0400 (Fri, 04 Apr 2008) | 7 lines Start of new naming scheme. The names are in place. They are not currently being saved or loaded, and are not used, except in the data manager where the name is displayed. ------------------------------------------------------------------------ r793684 | fenton | 2008-04-04 16:01:04 -0400 (Fri, 04 Apr 2008) | 3 lines Fix for significant digits on automatic base/offset mode. Fix for Load of plot item with adjusted projectionRect. ------------------------------------------------------------------------ r793312 | fenton | 2008-04-03 11:46:35 -0400 (Thu, 03 Apr 2008) | 2 lines Fix for Font size jumping. ------------------------------------------------------------------------ r792946 | fenton | 2008-04-02 12:23:13 -0400 (Wed, 02 Apr 2008) | 2 lines Add fix for zoom/shared axis updates. ------------------------------------------------------------------------ r792352 | netterfield | 2008-03-31 17:17:06 -0400 (Mon, 31 Mar 2008) | 2 lines Bugs update ------------------------------------------------------------------------ r792188 | fenton | 2008-03-31 11:53:43 -0400 (Mon, 31 Mar 2008) | 2 lines Fix for OpenGL Mode not properly activating. ------------------------------------------------------------------------ r791195 | fenton | 2008-03-28 13:36:35 -0400 (Fri, 28 Mar 2008) | 3 lines Fix Selection Rect drawing for Zoom. Fix delay in plot item rect updates when changing zoom state. ------------------------------------------------------------------------ r790054 | fenton | 2008-03-25 15:41:15 -0400 (Tue, 25 Mar 2008) | 3 lines Remove Line based items from the grid layout maintaining the aspect ratio of the item independently. Prevent grid layout items from calculating to a negative width/height. ------------------------------------------------------------------------ r787166 | tskisner | 2008-03-18 13:58:40 -0400 (Tue, 18 Mar 2008) | 1 line This source uses UINT_MAX, which is defined in limits.h, which is included in math_kst.h. Include that header here ------------------------------------------------------------------------ r786698 | fenton | 2008-03-17 15:13:33 -0400 (Mon, 17 Mar 2008) | 3 lines Convert Reference View Width/Height to be calculated in centimeters and then converted to points before use. Add trigger of apply signal when ok is clicked as part of Dialog. ------------------------------------------------------------------------ r786650 | fenton | 2008-03-17 10:53:58 -0400 (Mon, 17 Mar 2008) | 2 lines Add TriggerReset to SessionModel to allow DataManager to update correctly. ------------------------------------------------------------------------ r785699 | fenton | 2008-03-14 15:00:38 -0400 (Fri, 14 Mar 2008) | 6 lines Add Font scaling to the View based upon settings according to Fonts spec. Add saving of application level settings. Add LabelItem properties and scaling. Use Font scale as Arrow Head Scaling Value. Convert all font size values to scale values. ------------------------------------------------------------------------ r784546 | fenton | 2008-03-11 13:31:59 -0400 (Tue, 11 Mar 2008) | 3 lines Add setting for significant digits on Axis before switching to Base/Offset Mode. Fix margin sizing for large y axis tick labels. ------------------------------------------------------------------------ r784162 | fenton | 2008-03-10 15:35:47 -0400 (Mon, 10 Mar 2008) | 2 lines Rework updateChildGeometry for LineItem to match adjustments done by Standard/Unlocked items. ------------------------------------------------------------------------ r784054 | fenton | 2008-03-10 11:06:24 -0400 (Mon, 10 Mar 2008) | 2 lines Fixing Kst Bug Re: Plot Markers for Shift/Ctrl Mouse zoom. Add Keyboard handling and update hoverMouseMove to update the cursor / draw the selection line for zoom. ------------------------------------------------------------------------ r783301 | fenton | 2008-03-07 13:48:05 -0500 (Fri, 07 Mar 2008) | 4 lines Convert Static updateChildGeometry to virtual functions. Add updated line / arrow geometry updates. Fix for parent level rotated view items not having a proper relative size. ------------------------------------------------------------------------ r783010 | fenton | 2008-03-06 14:16:01 -0500 (Thu, 06 Mar 2008) | 3 lines Fix Log Axis Mouse Zoom. Move all point/rect projection calculations to PlotItem. ------------------------------------------------------------------------ r782933 | fenton | 2008-03-06 09:47:10 -0500 (Thu, 06 Mar 2008) | 3 lines Reworking of Dialog for PlotItem/PlotRenderItem. Move dialog to be based on PlotItem, and move all Log based settings into PlotItem. ------------------------------------------------------------------------ r782662 | fenton | 2008-03-05 12:10:03 -0500 (Wed, 05 Mar 2008) | 3 lines Redo of Line/Arrow updates. Add ArrowItemDialog and configuration of Arrow settings. ------------------------------------------------------------------------ r782272 | fenton | 2008-03-04 13:27:52 -0500 (Tue, 04 Mar 2008) | 3 lines Add Fix for Shared Axis. Update handling of PlotAxis margin calculations. ------------------------------------------------------------------------ r781875 | fenton | 2008-03-03 14:34:54 -0500 (Mon, 03 Mar 2008) | 3 lines Redo of updateChildGeometry to properly resize items with locked aspect ratio and rotated. Add setting for lock aspect ratio to ViewItem. ------------------------------------------------------------------------ r780806 | netterfield | 2008-02-29 21:53:24 -0500 (Fri, 29 Feb 2008) | 4 lines Delete and add some bugs Completely re-work the object name spec. ------------------------------------------------------------------------ r780601 | fenton | 2008-02-29 10:07:55 -0500 (Fri, 29 Feb 2008) | 3 lines Add Plot Markers for both x and y Axis. Add CurveSelector Widget. ------------------------------------------------------------------------ r779995 | fenton | 2008-02-27 14:07:01 -0500 (Wed, 27 Feb 2008) | 2 lines Add MarkersTab as PlotRenderItemDialog option. ------------------------------------------------------------------------ r779700 | fenton | 2008-02-26 15:28:23 -0500 (Tue, 26 Feb 2008) | 2 lines Fix updating of Apply button on Label tab. ------------------------------------------------------------------------ r779655 | fenton | 2008-02-26 13:55:58 -0500 (Tue, 26 Feb 2008) | 3 lines Fix plot alignment when plot is resized. Fix for plot not drawing when a plot is drawn but no plotrenderitem is present. ------------------------------------------------------------------------ r779319 | fenton | 2008-02-25 16:33:38 -0500 (Mon, 25 Feb 2008) | 3 lines Fix for Layout mode not removing gribs. Add improved grip updating for ViewItem. ------------------------------------------------------------------------ r779260 | fenton | 2008-02-25 13:46:44 -0500 (Mon, 25 Feb 2008) | 2 lines Update zoom to support log axis. Fix for log load not updating menu status. ------------------------------------------------------------------------ r779097 | fenton | 2008-02-25 09:00:45 -0500 (Mon, 25 Feb 2008) | 2 lines Fix minor tick labels not drawn when no major tick is drawn. ------------------------------------------------------------------------ r778208 | fenton | 2008-02-22 16:21:27 -0500 (Fri, 22 Feb 2008) | 3 lines Major reworking of plot mapping to support Log Axis and reverse internally. Clean up of Tick Calculation. ------------------------------------------------------------------------ r778145 | netterfield | 2008-02-22 11:50:22 -0500 (Fri, 22 Feb 2008) | 2 lines Some notes on updates. ------------------------------------------------------------------------ r778130 | netterfield | 2008-02-22 11:21:04 -0500 (Fri, 22 Feb 2008) | 2 lines Add bug. ------------------------------------------------------------------------ r778128 | netterfield | 2008-02-22 11:01:19 -0500 (Fri, 22 Feb 2008) | 2 lines Remove some compiler warnings. ------------------------------------------------------------------------ r778125 | netterfield | 2008-02-22 10:58:27 -0500 (Fri, 22 Feb 2008) | 2 lines Add and update some development documenation. ------------------------------------------------------------------------ r777820 | fenton | 2008-02-21 12:46:44 -0500 (Thu, 21 Feb 2008) | 3 lines Add Circle Item as options for Layout. Fix locked Aspect Ratio in ViewItem. ------------------------------------------------------------------------ r777750 | netterfield | 2008-02-21 08:47:21 -0500 (Thu, 21 Feb 2008) | 2 lines Added list of layout mode bugs. ------------------------------------------------------------------------ r777550 | fenton | 2008-02-20 16:51:13 -0500 (Wed, 20 Feb 2008) | 2 lines Add Arrow as ViewItem. ------------------------------------------------------------------------ r777480 | fenton | 2008-02-20 13:19:18 -0500 (Wed, 20 Feb 2008) | 2 lines Add proper cursor updating for view items in Layout Mode. ------------------------------------------------------------------------ r777106 | fenton | 2008-02-19 14:03:28 -0500 (Tue, 19 Feb 2008) | 2 lines Fix crash when no ticks are allowed. ------------------------------------------------------------------------ r777054 | netterfield | 2008-02-19 10:10:27 -0500 (Tue, 19 Feb 2008) | 3 lines More command line functionality. ------------------------------------------------------------------------ r777053 | netterfield | 2008-02-19 10:09:32 -0500 (Tue, 19 Feb 2008) | 2 lines Update some of the documentation: move things into the right docs. ------------------------------------------------------------------------ r777047 | fenton | 2008-02-19 09:50:36 -0500 (Tue, 19 Feb 2008) | 2 lines Redo of labelling and update to reverse axis drawing code to support LogAxis. ------------------------------------------------------------------------ r775347 | fenton | 2008-02-15 10:40:16 -0500 (Fri, 15 Feb 2008) | 2 lines Add Log Axis drawing. ------------------------------------------------------------------------ r774610 | fenton | 2008-02-13 11:46:00 -0500 (Wed, 13 Feb 2008) | 4 lines Add new parameters to save of PlotItem. Fix crash in restore of relations of plots. Update DataVector save to include tag. ------------------------------------------------------------------------ r774235 | fenton | 2008-02-12 15:30:55 -0500 (Tue, 12 Feb 2008) | 2 lines Add interface for log axis. ------------------------------------------------------------------------ r773811 | fenton | 2008-02-11 15:49:34 -0500 (Mon, 11 Feb 2008) | 2 lines Add reverse drawing of the relations. ------------------------------------------------------------------------ r773788 | fenton | 2008-02-11 14:22:10 -0500 (Mon, 11 Feb 2008) | 2 lines Add interpretation of values to Date/Time. ------------------------------------------------------------------------ r772603 | netterfield | 2008-02-09 01:32:03 -0500 (Sat, 09 Feb 2008) | 3 lines Vectors are no longer duplicated from command line. ------------------------------------------------------------------------ r772433 | fenton | 2008-02-08 13:49:35 -0500 (Fri, 08 Feb 2008) | 2 lines Add Axis drawing of Base/offset mode. ------------------------------------------------------------------------ r772124 | fenton | 2008-02-07 15:59:27 -0500 (Thu, 07 Feb 2008) | 3 lines Add Reverse drawing of Plot Axis Labels. Add interface for drawing base offset / interpretted Axis. ------------------------------------------------------------------------ r771735 | fenton | 2008-02-06 15:50:42 -0500 (Wed, 06 Feb 2008) | 3 lines Add label editor for plot, move Axis Plot controls to x-Axis / y-Axis Tab's. Add Axis scale options to tab. ------------------------------------------------------------------------ r771556 | netterfield | 2008-02-06 06:55:02 -0500 (Wed, 06 Feb 2008) | 4 lines Most of command line parsing is now done. However, it does not yet handle .kst files, nor matrixes. ------------------------------------------------------------------------ r771380 | fenton | 2008-02-05 15:13:38 -0500 (Tue, 05 Feb 2008) | 2 lines Limit max size for selectors. ------------------------------------------------------------------------ r771378 | fenton | 2008-02-05 15:13:02 -0500 (Tue, 05 Feb 2008) | 2 lines Add relation removal to Plot Render Item Dialog content Tab. ------------------------------------------------------------------------ r771337 | fenton | 2008-02-05 14:00:26 -0500 (Tue, 05 Feb 2008) | 2 lines Add Minor Grid / Minor Tick drawing as well as full customization of lines. ------------------------------------------------------------------------ r770971 | fenton | 2008-02-04 16:04:32 -0500 (Mon, 04 Feb 2008) | 3 lines Add new Plot Marker settings Tab to control properties of Major/Minor Tick/Grid Lines. Settings are not currently connected. ------------------------------------------------------------------------ r769701 | fenton | 2008-02-01 16:14:32 -0500 (Fri, 01 Feb 2008) | 2 lines Update to plot axis rendering from Adam with added margin to account for axis label and drawing of Major Ticks/Grid lines. ------------------------------------------------------------------------ r769698 | fenton | 2008-02-01 16:11:18 -0500 (Fri, 01 Feb 2008) | 2 lines Update DataMatrix Test. ------------------------------------------------------------------------ r769215 | netterfield | 2008-01-31 16:18:51 -0500 (Thu, 31 Jan 2008) | 3 lines More progress on command line parsing. .kst files not yet fixed. ------------------------------------------------------------------------ r769155 | fenton | 2008-01-31 12:47:40 -0500 (Thu, 31 Jan 2008) | 2 lines Increase resolution of number drawing so that the same number should not appear for multiple lines. ------------------------------------------------------------------------ r768898 | fenton | 2008-01-30 16:32:34 -0500 (Wed, 30 Jan 2008) | 2 lines Ensure that the top most axis label and the right most axis label are always fully drawn. ------------------------------------------------------------------------ r768867 | fenton | 2008-01-30 15:28:33 -0500 (Wed, 30 Jan 2008) | 2 lines Fix Zoom Y Out. ------------------------------------------------------------------------ r768824 | netterfield | 2008-01-30 13:26:31 -0500 (Wed, 30 Jan 2008) | 3 lines Add the actual code for the command line parser... ------------------------------------------------------------------------ r768565 | netterfield | 2008-01-30 06:37:53 -0500 (Wed, 30 Jan 2008) | 4 lines Starting command line parsing.... Reading .kst files is temporarily broken. ------------------------------------------------------------------------ r768365 | fenton | 2008-01-29 16:47:42 -0500 (Tue, 29 Jan 2008) | 2 lines Update bug list. ------------------------------------------------------------------------ r768363 | fenton | 2008-01-29 16:47:17 -0500 (Tue, 29 Jan 2008) | 2 lines Update fileRequester to do autocompletion of the path. ------------------------------------------------------------------------ r768344 | fenton | 2008-01-29 15:36:02 -0500 (Tue, 29 Jan 2008) | 4 lines Update MatrixDialog to allow setting of xMin, yMin, xStep and yStep to DataMatrix. Add ifdef to remove GeneratedMatrix options from creation. Update default values for scaling/translation to match object defaults. ------------------------------------------------------------------------ r768342 | fenton | 2008-01-29 15:33:36 -0500 (Tue, 29 Jan 2008) | 2 lines Update DataMatrix to support configuration of xMin, yMin xStep and yStep. ------------------------------------------------------------------------ r750113 | fenton | 2007-12-18 12:55:18 -0500 (Tue, 18 Dec 2007) | 2 lines Add functionality to ExportGraphicsDialog and connect UI components. ------------------------------------------------------------------------ r749807 | netterfield | 2007-12-17 17:41:51 -0500 (Mon, 17 Dec 2007) | 3 lines Add a command line syntax document. I will start implementation. ------------------------------------------------------------------------ r748568 | fenton | 2007-12-14 15:26:46 -0500 (Fri, 14 Dec 2007) | 2 lines Update linux define to include MemoryWidget functionality as well as memory checks in DataWizard and DataCollection. ------------------------------------------------------------------------ r748543 | fenton | 2007-12-14 14:13:50 -0500 (Fri, 14 Dec 2007) | 2 lines Redo StringModel to include strings outputted by DataObjects. ------------------------------------------------------------------------ r748487 | fenton | 2007-12-14 11:15:42 -0500 (Fri, 14 Dec 2007) | 3 lines Update ScalarModel to display Scalars of Vectors/Matrices including output Vectors/Matrices of DataObjects. Create generic ViewPrimitiveDialog with QTreeView for Scalars/Strings. ------------------------------------------------------------------------ r748093 | fenton | 2007-12-13 10:49:55 -0500 (Thu, 13 Dec 2007) | 3 lines Improve ColorMap drawing performance in Image by replacing setPixel with scanLine. Fix output matrix creation of CSD. ------------------------------------------------------------------------ r747702 | fenton | 2007-12-12 14:35:10 -0500 (Wed, 12 Dec 2007) | 3 lines Add Apply and EditMultiple Functionality to CSDDialog. Disable InterpolateOverHoles in FFTOptions for CSD's. ------------------------------------------------------------------------ r747502 | netterfield | 2007-12-12 01:17:13 -0500 (Wed, 12 Dec 2007) | 5 lines Some tagname work. Add color sequence to color appearance widget. ------------------------------------------------------------------------ r747395 | fenton | 2007-12-11 16:50:58 -0500 (Tue, 11 Dec 2007) | 2 lines Add Apply Button and Edit multiple Functionality to EventMonitorDialog. ------------------------------------------------------------------------ r747322 | fenton | 2007-12-11 13:13:10 -0500 (Tue, 11 Dec 2007) | 2 lines Add Apply Button and EditMultiple support to ImageDialog. ------------------------------------------------------------------------ r745662 | fenton | 2007-12-06 14:16:18 -0500 (Thu, 06 Dec 2007) | 2 lines Add Apply button and Edit Multiple support to PowerSpectrumDialog. ------------------------------------------------------------------------ r745600 | fenton | 2007-12-06 09:49:53 -0500 (Thu, 06 Dec 2007) | 3 lines Add Apply and EditMultiple Functionality to Histogram Dialog. Fix logic error in EquationDialog. ------------------------------------------------------------------------ r745284 | fenton | 2007-12-05 16:36:08 -0500 (Wed, 05 Dec 2007) | 2 lines Add Apply function and EditMultiple support to EquationDialog. ------------------------------------------------------------------------ r745221 | fenton | 2007-12-05 14:26:39 -0500 (Wed, 05 Dec 2007) | 2 lines Add Apply button to DataDialog for editing and enable on Curve, Matrix and Vector Dialogs. ------------------------------------------------------------------------ r745218 | netterfield | 2007-12-05 14:10:49 -0500 (Wed, 05 Dec 2007) | 3 lines Start to get the names to work in dialogs. ------------------------------------------------------------------------ r745171 | fenton | 2007-12-05 11:33:36 -0500 (Wed, 05 Dec 2007) | 2 lines Move editMultipleMode flag logic into EditMode of DataDialog. ------------------------------------------------------------------------ r745140 | fenton | 2007-12-05 10:02:38 -0500 (Wed, 05 Dec 2007) | 4 lines Add support to CurveDialog for EditMultiple. Add Same as Minus checkbox functionality to CurveDialog. Add IgnoreAutoScale functionality to CurveDialog. ------------------------------------------------------------------------ r744826 | fenton | 2007-12-04 12:07:02 -0500 (Tue, 04 Dec 2007) | 2 lines Add EditMultiple support for Matrices. ------------------------------------------------------------------------ r744769 | staikos | 2007-12-04 06:55:24 -0500 (Tue, 04 Dec 2007) | 2 lines better fix - didn't notice this was using qt3support ------------------------------------------------------------------------ r744768 | staikos | 2007-12-04 06:52:55 -0500 (Tue, 04 Dec 2007) | 3 lines remove some warnings. Unfortunate that QCheckBox::state() returns a deprecated enum. ------------------------------------------------------------------------ r744664 | netterfield | 2007-12-03 21:39:28 -0500 (Mon, 03 Dec 2007) | 6 lines Fix default limits on matrixes. The vector selector was not working (it wouldn't set to the requested vector). This fixes it... but see the comments. ------------------------------------------------------------------------ r744538 | fenton | 2007-12-03 16:32:16 -0500 (Mon, 03 Dec 2007) | 2 lines Add EditMultiple support for Vectors. ------------------------------------------------------------------------ r743387 | fenton | 2007-11-30 15:38:04 -0500 (Fri, 30 Nov 2007) | 2 lines Replace current buttons with QDialogButtonBox with OK/Apply/Cancel functionality for ChooseColorDialog, ChangeDataSampleDialog and DifferentiateCurvesDialog. ------------------------------------------------------------------------ r743309 | fenton | 2007-11-30 10:57:27 -0500 (Fri, 30 Nov 2007) | 2 lines Update ChangeFileDialog to use DialogButtonBox for Ok/Apply/Cancel, add logic to OK/Apply buttons and fix crash. ------------------------------------------------------------------------ r743292 | fenton | 2007-11-30 09:29:27 -0500 (Fri, 30 Nov 2007) | 2 lines Add proper cleanup of DataSource dependents. ------------------------------------------------------------------------ r743096 | fenton | 2007-11-29 15:56:56 -0500 (Thu, 29 Nov 2007) | 2 lines Add support for ChangeFileDialog to create duplicate objects. ------------------------------------------------------------------------ r742983 | netterfield | 2007-11-29 09:58:46 -0500 (Thu, 29 Nov 2007) | 8 lines More work on defaults. -Widgets handle their own defaults with setWidgetDefault and loadWidgetDefault -Defaults added to curves, psds, matrixes, equations. ------------------------------------------------------------------------ r742717 | fenton | 2007-11-28 14:01:17 -0500 (Wed, 28 Nov 2007) | 2 lines Add proper cleanup of objects when removed from the ObjectStore. ------------------------------------------------------------------------ r742337 | fenton | 2007-11-27 16:07:47 -0500 (Tue, 27 Nov 2007) | 3 lines FIXME cleanup. Update Tag creation for Scalars. ------------------------------------------------------------------------ r742312 | fenton | 2007-11-27 15:17:39 -0500 (Tue, 27 Nov 2007) | 2 lines Add OutputVector context menu for creation of DataObjects. ------------------------------------------------------------------------ r742287 | fenton | 2007-11-27 14:05:42 -0500 (Tue, 27 Nov 2007) | 4 lines Add Image editing to PlotRenderItemDialog. Add Image support to Content Tab. Add Image support to Add To Plot. ------------------------------------------------------------------------ r742019 | fenton | 2007-11-26 17:37:58 -0500 (Mon, 26 Nov 2007) | 2 lines Add Editing of Curves to PlotRenderItemDialog. ------------------------------------------------------------------------ r741868 | fenton | 2007-11-26 11:29:05 -0500 (Mon, 26 Nov 2007) | 3 lines Integration of PlotRenderItem Content options into the ViewItemDialog layout. Addition of Content Option functionality. ------------------------------------------------------------------------ r740597 | fenton | 2007-11-23 11:00:17 -0500 (Fri, 23 Nov 2007) | 2 lines Add implementation for ChangeFileDialog. ------------------------------------------------------------------------ r740570 | fenton | 2007-11-23 09:31:13 -0500 (Fri, 23 Nov 2007) | 2 lines Fix build errors. Kst namespace cleanup. ------------------------------------------------------------------------ r740524 | netterfield | 2007-11-23 07:58:21 -0500 (Fri, 23 Nov 2007) | 5 lines -Move dialogdefaults to libkstapp. -remove the last vestages of the old default system. -dialogDefaults -> _dialogDefaults. ------------------------------------------------------------------------ r740187 | fenton | 2007-11-22 14:14:09 -0500 (Thu, 22 Nov 2007) | 2 lines Add functionality to the DifferentiateCurvesDialog. ------------------------------------------------------------------------ r739769 | fenton | 2007-11-21 16:02:24 -0500 (Wed, 21 Nov 2007) | 2 lines Add Implementation for ChooseColorDialog. ------------------------------------------------------------------------ r739749 | fenton | 2007-11-21 14:50:55 -0500 (Wed, 21 Nov 2007) | 2 lines Cleanup Kst references inside of Kst namespace. ------------------------------------------------------------------------ r739729 | fenton | 2007-11-21 12:58:37 -0500 (Wed, 21 Nov 2007) | 2 lines Add full functionality to the ChangeSampleDialog. ------------------------------------------------------------------------ r739690 | staikos | 2007-11-21 10:35:48 -0500 (Wed, 21 Nov 2007) | 5 lines make it compile by moving the power spectrum setting code into objectdefaults. I think it should be there anyway, and not use dialogdefaults at all, right? This is a bit of a hack but if it's the right approach it can be adjusted and cleaned. headers also cleaned up in a few files. ------------------------------------------------------------------------ r739327 | fenton | 2007-11-20 16:18:18 -0500 (Tue, 20 Nov 2007) | 2 lines Update DataManager context menu to include Add to and Remove From Plot for relations. Also implement Delete for all objects including cleanup of plots. ------------------------------------------------------------------------ r739121 | fenton | 2007-11-20 10:25:27 -0500 (Tue, 20 Nov 2007) | 2 lines Clean up formatting and eliminate overlapping null check. ------------------------------------------------------------------------ r739100 | fenton | 2007-11-20 09:18:08 -0500 (Tue, 20 Nov 2007) | 3 lines Add context menu support for object creation from DataManager. Extend DialogLauncher framework to allow specification of default selection. ------------------------------------------------------------------------ r738975 | netterfield | 2007-11-19 22:00:07 -0500 (Mon, 19 Nov 2007) | 4 lines powerspectrum dialog gets defaults. Datawizard shares them. ------------------------------------------------------------------------ r738793 | fenton | 2007-11-19 13:13:26 -0500 (Mon, 19 Nov 2007) | 2 lines Update session model to display DataVectors, GeneratedVectors, DataMatrix, GeneratedMatrix and outputVectors and output Matrices for DataObjects. ------------------------------------------------------------------------ r737641 | fenton | 2007-11-16 15:29:25 -0500 (Fri, 16 Nov 2007) | 3 lines Add edit Support for CSD's. Standardize variable/function names for PSD's and CSD's. ------------------------------------------------------------------------ r737576 | fenton | 2007-11-16 11:44:13 -0500 (Fri, 16 Nov 2007) | 2 lines Add Test for Generated Matrix. Fix Generated Matrix creation to include update so that scalars are generated. ------------------------------------------------------------------------ r737559 | fenton | 2007-11-16 09:37:07 -0500 (Fri, 16 Nov 2007) | 3 lines Add Edit support for ImageDialog. Update ImageDialog to include proper calculations for Min/Max and Smart Thresholds. ------------------------------------------------------------------------ r737323 | netterfield | 2007-11-15 22:33:30 -0500 (Thu, 15 Nov 2007) | 3 lines Move stuff to dialogdefaults.cpp. ------------------------------------------------------------------------ r737281 | netterfield | 2007-11-15 17:35:51 -0500 (Thu, 15 Nov 2007) | 4 lines Fix build troubles pointed out by Mike. ------------------------------------------------------------------------ r737248 | netterfield | 2007-11-15 16:34:23 -0500 (Thu, 15 Nov 2007) | 3 lines Vector defaults now mostly work. We need to delete and remove references to vectorDefaults now. ------------------------------------------------------------------------ r737182 | fenton | 2007-11-15 14:00:33 -0500 (Thu, 15 Nov 2007) | 2 lines Add edit support for EventMonitorDialog. ------------------------------------------------------------------------ r737151 | fenton | 2007-11-15 11:59:06 -0500 (Thu, 15 Nov 2007) | 3 lines Add Edit support for PowerSpectrumDialog. Update FFTOptions Widget to support setting of values. ------------------------------------------------------------------------ r737131 | fenton | 2007-11-15 10:30:37 -0500 (Thu, 15 Nov 2007) | 2 lines Add Edit support for Histogram's. ------------------------------------------------------------------------ r736816 | fenton | 2007-11-14 17:15:40 -0500 (Wed, 14 Nov 2007) | 2 lines Add Edit Capabilities to EquationDialog and connection in DataManager. ------------------------------------------------------------------------ r736789 | fenton | 2007-11-14 15:57:31 -0500 (Wed, 14 Nov 2007) | 4 lines Add Curve Editing to Dialog. Update Curve pointType to be private with accessor function. Update DataManager to display CurveDialog on Edit. ------------------------------------------------------------------------ r736759 | fenton | 2007-11-14 14:15:42 -0500 (Wed, 14 Nov 2007) | 3 lines Update SessionManager to also load relations. Include cleanup of sessionmodel.h. ------------------------------------------------------------------------ r736708 | netterfield | 2007-11-14 10:59:01 -0500 (Wed, 14 Nov 2007) | 9 lines Add default settings for the vector file name. Before I go and install things everywhere, I have a couple questions: -I added a new VectorDialog::configureNewTab because I couldn't see a place where new tab stuff got filled. Should it have gone in configureTab (which takes a vectorptr) instead? -Should there be a 'storeVectorDefaults(dataVector)' routine somewhere? if so, where? ------------------------------------------------------------------------ r736370 | netterfield | 2007-11-13 20:59:01 -0500 (Tue, 13 Nov 2007) | 6 lines -Add first glimps of dialog defaults. -The vector dialog was not filling all of its fields when editing a vector. -vectordefaults is going to go away. Remove the include. ------------------------------------------------------------------------ r736280 | fenton | 2007-11-13 15:30:36 -0500 (Tue, 13 Nov 2007) | 3 lines Add force reload of DataManager to reload data on open. Add context menu support to DataManager. ------------------------------------------------------------------------ r736105 | fenton | 2007-11-13 09:28:24 -0500 (Tue, 13 Nov 2007) | 3 lines Add ScalarListSelector to ScalarSelector. Update EquationDialog equation builder. ------------------------------------------------------------------------ r735855 | fenton | 2007-11-12 14:43:20 -0500 (Mon, 12 Nov 2007) | 2 lines Add editing of Scalars. ------------------------------------------------------------------------ r735834 | fenton | 2007-11-12 13:22:25 -0500 (Mon, 12 Nov 2007) | 2 lines Add Edit functionality for Matrices. Includes both GUI and modification of DataObject. ------------------------------------------------------------------------ r735779 | fenton | 2007-11-12 11:08:29 -0500 (Mon, 12 Nov 2007) | 2 lines Add Editing of Vectors. ------------------------------------------------------------------------ r735724 | netterfield | 2007-11-12 09:17:55 -0500 (Mon, 12 Nov 2007) | 3 lines Add a buglist, and a specification for sticky dialog defaults. ------------------------------------------------------------------------ r735720 | fenton | 2007-11-12 09:15:04 -0500 (Mon, 12 Nov 2007) | 2 lines Add Ok Button validation to dialogs. ------------------------------------------------------------------------ r734743 | fenton | 2007-11-09 14:25:00 -0500 (Fri, 09 Nov 2007) | 4 lines Add test for DataMatrix and fix for matrix creation. Update MatrixSelector and MatrixEditorDialog to populate correctly. Update MatrixDialog to only include Matrices from the DataSource. ------------------------------------------------------------------------ r734648 | fenton | 2007-11-09 08:29:53 -0500 (Fri, 09 Nov 2007) | 2 lines Add EventMonitorFactory. ------------------------------------------------------------------------ r734432 | fenton | 2007-11-08 16:16:04 -0500 (Thu, 08 Nov 2007) | 2 lines Fix for crash in DataWizard when plotting. ------------------------------------------------------------------------ r734388 | fenton | 2007-11-08 14:15:05 -0500 (Thu, 08 Nov 2007) | 3 lines Add Save/Restore for DataSources. Modify loading of DataSources and addition of DataSources to ObjectStore. ------------------------------------------------------------------------ r734292 | fenton | 2007-11-08 08:51:56 -0500 (Thu, 08 Nov 2007) | 2 lines Redo Vector creation in the Factory. ------------------------------------------------------------------------ r734024 | fenton | 2007-11-07 16:01:57 -0500 (Wed, 07 Nov 2007) | 3 lines Update Save/Restore for PlotRenderItems to save/restore relations. Update GraphicFactories to have access to the ObjectStore. ------------------------------------------------------------------------ r733965 | fenton | 2007-11-07 14:01:59 -0500 (Wed, 07 Nov 2007) | 5 lines Add Save/Restore for Image. Fix creation of Image. Update Palette usage in Image. Fix crash in ImageDialog. ------------------------------------------------------------------------ r733929 | fenton | 2007-11-07 11:00:47 -0500 (Wed, 07 Nov 2007) | 2 lines Add Save/Restore for Curve. ------------------------------------------------------------------------ r733927 | fenton | 2007-11-07 10:56:40 -0500 (Wed, 07 Nov 2007) | 2 lines Fix Apodize in TestCSD and TestPSD. ------------------------------------------------------------------------ r733896 | fenton | 2007-11-07 09:16:17 -0500 (Wed, 07 Nov 2007) | 5 lines Add Save/Restore for EventMonitorEntry. Move EventMonitorEntry and EmailThread to libkstmath. Fix crash in EventMonitorDialog. Add Save for BasicPlugin. ------------------------------------------------------------------------ r733707 | netterfield | 2007-11-07 00:19:18 -0500 (Wed, 07 Nov 2007) | 3 lines Add up and down zoom changes. ------------------------------------------------------------------------ r733630 | netterfield | 2007-11-06 17:09:16 -0500 (Tue, 06 Nov 2007) | 7 lines Add Left and Right to the zoom options (I forgot these in the spec). This easy to work with! cbn ------------------------------------------------------------------------ r733607 | fenton | 2007-11-06 15:55:38 -0500 (Tue, 06 Nov 2007) | 2 lines Add save/restore of PowerSpectrum. Fix crash & creation of PSD. Update CSD tag names. ------------------------------------------------------------------------ r733591 | fenton | 2007-11-06 14:56:11 -0500 (Tue, 06 Nov 2007) | 2 lines Add Save/Restore for Histogram and fix crash in HistogramDialog. ------------------------------------------------------------------------ r733563 | fenton | 2007-11-06 13:19:39 -0500 (Tue, 06 Nov 2007) | 3 lines Add Save/Restore for CSD. Fix crash and creation in CSDDialog. ------------------------------------------------------------------------ r733532 | fenton | 2007-11-06 10:40:58 -0500 (Tue, 06 Nov 2007) | 2 lines Update to save/restore for Equations. ------------------------------------------------------------------------ r733522 | fenton | 2007-11-06 10:04:10 -0500 (Tue, 06 Nov 2007) | 2 lines Update .kst file specification to include GeneratedMatrix, EditableMatrix and DataMatrix. ------------------------------------------------------------------------ r733520 | fenton | 2007-11-06 10:00:30 -0500 (Tue, 06 Nov 2007) | 2 lines Addition of Save/Restore for DataMatrix, EditableMatrix and GeneratedMatrix. ------------------------------------------------------------------------ r733200 | fidler | 2007-11-05 15:44:47 -0500 (Mon, 05 Nov 2007) | 2 lines move locking into DataMatrix::change() ------------------------------------------------------------------------ r733199 | fidler | 2007-11-05 15:44:30 -0500 (Mon, 05 Nov 2007) | 2 lines initialize the _store pointer in MatrixTab ------------------------------------------------------------------------ r733198 | fidler | 2007-11-05 15:42:14 -0500 (Mon, 05 Nov 2007) | 2 lines oops.. fix locking ------------------------------------------------------------------------ r733169 | fenton | 2007-11-05 13:45:50 -0500 (Mon, 05 Nov 2007) | 2 lines Update .kst Specification to include string tag. ------------------------------------------------------------------------ r733168 | fenton | 2007-11-05 13:41:14 -0500 (Mon, 05 Nov 2007) | 2 lines Adding Save/Restore for Strings. ------------------------------------------------------------------------ r733156 | fenton | 2007-11-05 12:23:47 -0500 (Mon, 05 Nov 2007) | 2 lines Removal of unneeded friend marker. ------------------------------------------------------------------------ r733145 | fenton | 2007-11-05 12:09:58 -0500 (Mon, 05 Nov 2007) | 2 lines Updating .kst specification to include Scalar. ------------------------------------------------------------------------ r733144 | fenton | 2007-11-05 12:08:06 -0500 (Mon, 05 Nov 2007) | 2 lines Add Save/Restore for Scalars. ------------------------------------------------------------------------ r733137 | fenton | 2007-11-05 11:46:36 -0500 (Mon, 05 Nov 2007) | 2 lines Update .kst specification file to include Vector, EditableVector, DataVector and GeneratedVector. ------------------------------------------------------------------------ r733135 | fenton | 2007-11-05 11:43:27 -0500 (Mon, 05 Nov 2007) | 2 lines Add Save/Restore functionality for EditableVector, DataVector, GeneratedVector and Vector. ------------------------------------------------------------------------ r732089 | fenton | 2007-11-02 15:06:09 -0400 (Fri, 02 Nov 2007) | 3 lines Addition of DataWizard. Includes all function GUI aspects as well as object creations as much as they are currently working. ------------------------------------------------------------------------ r731376 | fenton | 2007-10-31 11:00:05 -0400 (Wed, 31 Oct 2007) | 3 lines Enabled Edit Vector from VectorSelector and add population of values to VectorDialog based on existing Vector. ------------------------------------------------------------------------ r731128 | fidler | 2007-10-30 15:43:06 -0400 (Tue, 30 Oct 2007) | 2 lines merged objectstore branch ------------------------------------------------------------------------ r731094 | treat | 2007-10-30 13:14:34 -0400 (Tue, 30 Oct 2007) | 2 lines * Silence warnings ------------------------------------------------------------------------ r731041 | fenton | 2007-10-30 10:31:10 -0400 (Tue, 30 Oct 2007) | 2 lines Removing extra function declaration. ------------------------------------------------------------------------ r731036 | fenton | 2007-10-30 10:15:30 -0400 (Tue, 30 Oct 2007) | 2 lines Addition of StringEditorDialog and StringModel/StringTableModel. ------------------------------------------------------------------------ r730873 | staikos | 2007-10-29 18:32:03 -0400 (Mon, 29 Oct 2007) | 2 lines we don't need these anymore :) ------------------------------------------------------------------------ r730815 | fenton | 2007-10-29 14:34:36 -0400 (Mon, 29 Oct 2007) | 2 lines Add initial combo values and other loaded values. ------------------------------------------------------------------------ r730778 | fenton | 2007-10-29 11:35:31 -0400 (Mon, 29 Oct 2007) | 2 lines Add dialog control enable/disable to PlotRenderItemDialog. ------------------------------------------------------------------------ r730774 | staikos | 2007-10-29 11:19:48 -0400 (Mon, 29 Oct 2007) | 2 lines win32 fix ------------------------------------------------------------------------ r729755 | fenton | 2007-10-26 16:59:07 -0400 (Fri, 26 Oct 2007) | 2 lines Add initial stub version of PlotRenderItemDialog. ------------------------------------------------------------------------ r729621 | fenton | 2007-10-26 09:23:43 -0400 (Fri, 26 Oct 2007) | 2 lines Add initial stub version of ChangeFileDialog. ------------------------------------------------------------------------ r729346 | fenton | 2007-10-25 14:49:39 -0400 (Thu, 25 Oct 2007) | 3 lines Initial port of ChangeDataSampleDialog and update to load of ChooseColorDialog. ------------------------------------------------------------------------ r729296 | fenton | 2007-10-25 10:47:49 -0400 (Thu, 25 Oct 2007) | 2 lines Initial Stub version of ChooseColorDialog. ------------------------------------------------------------------------ r728997 | fenton | 2007-10-24 16:48:42 -0400 (Wed, 24 Oct 2007) | 3 lines Initial stub version of the DifferentiateCurvesDialog and the Tools menu. ------------------------------------------------------------------------ r728880 | fenton | 2007-10-24 11:00:45 -0400 (Wed, 24 Oct 2007) | 3 lines Add implementation of matrix selector. Also made signal updates to MatrixSelector. ------------------------------------------------------------------------ r728594 | fenton | 2007-10-23 15:32:27 -0400 (Tue, 23 Oct 2007) | 2 lines Add stub version of BasicPluginDialog. ------------------------------------------------------------------------ r728578 | fenton | 2007-10-23 14:23:15 -0400 (Tue, 23 Oct 2007) | 2 lines Fix for save build error in EventMonitorEntry. ------------------------------------------------------------------------ r728577 | fenton | 2007-10-23 14:20:11 -0400 (Tue, 23 Oct 2007) | 3 lines Add EventMonitorEntry creation from EventMonitorDialog and save of EventMonitorEntry. ------------------------------------------------------------------------ r728526 | fenton | 2007-10-23 11:38:16 -0400 (Tue, 23 Oct 2007) | 3 lines Initial Port of EmailThread to Kst::EmailThread and KstEventMonitorEntry to Kst::EventMonitorEntry. ------------------------------------------------------------------------ r728246 | fenton | 2007-10-22 16:09:47 -0400 (Mon, 22 Oct 2007) | 2 lines Initial Stub version of EventMonitorDialog. ------------------------------------------------------------------------ r728216 | fenton | 2007-10-22 14:33:36 -0400 (Mon, 22 Oct 2007) | 2 lines Add ScalarEditor dialog and ScalarTableModel/ScalarModel. ------------------------------------------------------------------------ r728125 | fenton | 2007-10-22 09:49:09 -0400 (Mon, 22 Oct 2007) | 2 lines Add creation of Images and addition of Kst Grayscale palette. ------------------------------------------------------------------------ r727131 | fenton | 2007-10-19 17:08:58 -0400 (Fri, 19 Oct 2007) | 2 lines Add stub version of ImageDialog and implement Matrix Selector. ------------------------------------------------------------------------ r727091 | fenton | 2007-10-19 14:59:49 -0400 (Fri, 19 Oct 2007) | 2 lines Add creation of CSD object and image creation. ------------------------------------------------------------------------ r727082 | fenton | 2007-10-19 13:36:39 -0400 (Fri, 19 Oct 2007) | 4 lines Initial stub checkin of CSDDialog. Creation of ColorPalette Widget for use in CSDDialog. Creation of Palette class for ColorPalette. ------------------------------------------------------------------------ r726750 | fenton | 2007-10-18 15:53:17 -0400 (Thu, 18 Oct 2007) | 3 lines Add accessor functions to FFTOptions and PSD creation from PowerSpectrumDialog. ------------------------------------------------------------------------ r726723 | fenton | 2007-10-18 14:24:01 -0400 (Thu, 18 Oct 2007) | 3 lines Port of FFTOptions widget and addition of PowerSpectrumDialog in stub form. ------------------------------------------------------------------------ r726694 | fenton | 2007-10-18 12:08:05 -0400 (Thu, 18 Oct 2007) | 2 lines Name and interface updates for Histogram and CurveAppearance. ------------------------------------------------------------------------ r726680 | fenton | 2007-10-18 11:02:25 -0400 (Thu, 18 Oct 2007) | 3 lines Add create for Histogram as well as initial state settings for CurveAppearance. ------------------------------------------------------------------------ r726491 | fidler | 2007-10-17 17:08:18 -0400 (Wed, 17 Oct 2007) | 2 lines from and to were switched ------------------------------------------------------------------------ r726485 | fenton | 2007-10-17 17:05:55 -0400 (Wed, 17 Oct 2007) | 2 lines Adding stub version of Histogram Dialog. ------------------------------------------------------------------------ r726405 | fenton | 2007-10-17 14:59:39 -0400 (Wed, 17 Oct 2007) | 3 lines Update MatrixDialog to create DataMatrix's and setup GUI options to interact the same as previous version. ------------------------------------------------------------------------ r726331 | fenton | 2007-10-17 10:31:50 -0400 (Wed, 17 Oct 2007) | 3 lines Add creation of generated matrix to MatrixDialog. Also added save of generated matrix. ------------------------------------------------------------------------ r726002 | fenton | 2007-10-16 16:44:25 -0400 (Tue, 16 Oct 2007) | 2 lines Initial stub version of matrix dialog. ------------------------------------------------------------------------ r725974 | fenton | 2007-10-16 15:07:55 -0400 (Tue, 16 Oct 2007) | 3 lines Update .kst specification to include cartesianrender as part of plot item. ------------------------------------------------------------------------ r725973 | fenton | 2007-10-16 15:04:24 -0400 (Tue, 16 Oct 2007) | 3 lines Add save/partial restore (without relations) of CartesianRenderItem and the baseclass PlotRenderItem. ------------------------------------------------------------------------ r725905 | fenton | 2007-10-16 10:17:58 -0400 (Tue, 16 Oct 2007) | 2 lines Update .kst file specification to include layoutbox and layoutitem tags. ------------------------------------------------------------------------ r725903 | fenton | 2007-10-16 10:15:04 -0400 (Tue, 16 Oct 2007) | 3 lines Add parsing of layoutbox and save/parsing of items associated with the layoutbox. ------------------------------------------------------------------------ r725625 | fenton | 2007-10-15 16:54:11 -0400 (Mon, 15 Oct 2007) | 3 lines Disable attempt to write PlotRenderItems when saving the main view. Basic save of LayoutBox. ------------------------------------------------------------------------ r725615 | fenton | 2007-10-15 16:26:11 -0400 (Mon, 15 Oct 2007) | 2 lines Update .kst specification to include details of plot and plotaxis. ------------------------------------------------------------------------ r725614 | fenton | 2007-10-15 16:24:02 -0400 (Mon, 15 Oct 2007) | 2 lines Initial implementation of save/restore for PlotItem and PlotAxisItem. ------------------------------------------------------------------------ r725515 | fenton | 2007-10-15 11:56:20 -0400 (Mon, 15 Oct 2007) | 2 lines Add zValue attribute for all ViewItems. ------------------------------------------------------------------------ r725514 | fenton | 2007-10-15 11:55:06 -0400 (Mon, 15 Oct 2007) | 2 lines Update to ViewItem save to include zvalue as attribute. ------------------------------------------------------------------------ r725511 | treat | 2007-10-15 11:39:26 -0400 (Mon, 15 Oct 2007) | 10 lines * Add plot axis and labels for major ticks. This design will need to be rethought as I think the PlotAxisItem class will need to be merged with the PlotItem class. However, I want to get this under version control as this contains a lot of sep moving parts. * ZOrder fixes for all viewitems. * Event and shortcut fixes. * Other bugfixes and stuff. ------------------------------------------------------------------------ r725508 | fenton | 2007-10-15 11:28:18 -0400 (Mon, 15 Oct 2007) | 2 lines Update to .kst file specification to include svg definition. ------------------------------------------------------------------------ r725504 | fenton | 2007-10-15 11:25:28 -0400 (Mon, 15 Oct 2007) | 2 lines Implementation of Save/Restore for SvgItem. ------------------------------------------------------------------------ r725472 | fenton | 2007-10-15 09:33:21 -0400 (Mon, 15 Oct 2007) | 2 lines Update .kst specification file for PictureItem to have a data node. ------------------------------------------------------------------------ r725471 | fenton | 2007-10-15 09:32:00 -0400 (Mon, 15 Oct 2007) | 3 lines Update of PictureItem save/restore to use a separate node of rather than an attribute. ------------------------------------------------------------------------ r725126 | staikos | 2007-10-14 12:59:46 -0400 (Sun, 14 Oct 2007) | 2 lines just minor updates to the TODO. we should add more detail again though. ------------------------------------------------------------------------ r724620 | fenton | 2007-10-12 16:48:08 -0400 (Fri, 12 Oct 2007) | 2 lines Update to .kst file specification to include picture definition. ------------------------------------------------------------------------ r724619 | fenton | 2007-10-12 16:47:29 -0400 (Fri, 12 Oct 2007) | 2 lines Implementation of Save/Restore for PictureItem ------------------------------------------------------------------------ r724591 | fenton | 2007-10-12 15:03:16 -0400 (Fri, 12 Oct 2007) | 2 lines Update to .kst file specification to include line definition. ------------------------------------------------------------------------ r724589 | fenton | 2007-10-12 15:02:24 -0400 (Fri, 12 Oct 2007) | 4 lines Implemention of save/restore for LineItems. Fixed error in restoring of QPen and QBrush in ViewItem. ------------------------------------------------------------------------ r724569 | fenton | 2007-10-12 13:51:59 -0400 (Fri, 12 Oct 2007) | 3 lines Update to .kst file specification to include ellipse and label definitions. ------------------------------------------------------------------------ r724568 | fenton | 2007-10-12 13:50:45 -0400 (Fri, 12 Oct 2007) | 2 lines Implementation of save/restore for LabelItem. ------------------------------------------------------------------------ r724553 | fenton | 2007-10-12 12:30:04 -0400 (Fri, 12 Oct 2007) | 2 lines Implementation of EllipseItem save/restore. ------------------------------------------------------------------------ r724540 | fenton | 2007-10-12 11:49:37 -0400 (Fri, 12 Oct 2007) | 2 lines Update to .kst specification to include box definition. ------------------------------------------------------------------------ r724539 | fenton | 2007-10-12 11:48:56 -0400 (Fri, 12 Oct 2007) | 3 lines Implemention of ViewItem based document save/restore from XML architecture including completed BoxItem handling. ------------------------------------------------------------------------ r724251 | treat | 2007-10-11 16:37:14 -0400 (Thu, 11 Oct 2007) | 2 lines * Rename this to go along with new design. ------------------------------------------------------------------------ r724246 | treat | 2007-10-11 16:29:36 -0400 (Thu, 11 Oct 2007) | 6 lines * Move the RenderType enum to the PlotRenderItem class. * PlotItem's can now have only one of each RenderType. * The PlotRenderItem's are created from the PlotItem::renderItem() factory. * bugfix for PlotItem::projectionRect() ------------------------------------------------------------------------ r724215 | treat | 2007-10-11 14:47:37 -0400 (Thu, 11 Oct 2007) | 2 lines * Properly initialize the Auto zoom mode. ------------------------------------------------------------------------ r724185 | treat | 2007-10-11 13:34:45 -0400 (Thu, 11 Oct 2007) | 5 lines * Except for a spike insensitive algorithm TBD and a GUI to enter fixed scalar expressions for zoom... all the different modes are complete I think. Testing welcome. ------------------------------------------------------------------------ r724167 | netterfield | 2007-10-11 12:43:48 -0400 (Thu, 11 Oct 2007) | 3 lines Add definition of the plot axis... ------------------------------------------------------------------------ r724161 | treat | 2007-10-11 12:33:16 -0400 (Thu, 11 Oct 2007) | 2 lines * Need to recompute here in case of auto/autoborder modes ------------------------------------------------------------------------ r723834 | treat | 2007-10-10 17:11:27 -0400 (Wed, 10 Oct 2007) | 5 lines * Add more zoom modes: YLocalMaximum XIn, XOut, YIn, YOut * Refactor how we compute the projection rects ------------------------------------------------------------------------ r723810 | treat | 2007-10-10 15:12:21 -0400 (Wed, 10 Oct 2007) | 2 lines * Need to find a scheme for auto suggesting scalar names ------------------------------------------------------------------------ r723808 | treat | 2007-10-10 15:04:59 -0400 (Wed, 10 Oct 2007) | 4 lines * Some whitespace cleanups. * Superfluous datasource methods. * Cleanup a bit. ------------------------------------------------------------------------ r723801 | treat | 2007-10-10 14:51:03 -0400 (Wed, 10 Oct 2007) | 5 lines * Guard the ZoomState.plotrenderitem with QPointer * ZoomMode::Expression -> FixedExpression * Redo some of the zoom command stuff following conversation with barth. ------------------------------------------------------------------------ r723787 | fenton | 2007-10-10 14:15:34 -0400 (Wed, 10 Oct 2007) | 2 lines Implementation of ScalarSelector, ScalarTab and ScalarDialog. ------------------------------------------------------------------------ r723749 | treat | 2007-10-10 11:50:23 -0400 (Wed, 10 Oct 2007) | 3 lines * Let the plots truly overlap so we don't get an extra bold line for the shared axis. ------------------------------------------------------------------------ r723745 | treat | 2007-10-10 11:45:41 -0400 (Wed, 10 Oct 2007) | 2 lines * Delay this so that the curves can update first. ------------------------------------------------------------------------ r723741 | treat | 2007-10-10 11:28:37 -0400 (Wed, 10 Oct 2007) | 3 lines * Proper casts * Give the default layout a little margin/spacing for grips. ------------------------------------------------------------------------ r723542 | treat | 2007-10-09 18:53:41 -0400 (Tue, 09 Oct 2007) | 5 lines * Make CurveAppearence getters const. * Implement and hook up the CurvePlacement. * Add an interface class for plotitem for this purpose. etc, etc... ------------------------------------------------------------------------ r723476 | fenton | 2007-10-09 15:44:24 -0400 (Tue, 09 Oct 2007) | 2 lines Updating combobox sizes. ------------------------------------------------------------------------ r723465 | fenton | 2007-10-09 14:56:06 -0400 (Tue, 09 Oct 2007) | 3 lines Implementation of CurveAppearance widget and connecting it to the Curve and Equation dialogs. ------------------------------------------------------------------------ r723426 | treat | 2007-10-09 12:39:27 -0400 (Tue, 09 Oct 2007) | 5 lines * Whitespace changes. * Class methods should never be pascal case. * Don't pass QString by value. * Simplify qcheckbox get/set. ------------------------------------------------------------------------ r723405 | treat | 2007-10-09 11:09:18 -0400 (Tue, 09 Oct 2007) | 2 lines * Tied zoom ------------------------------------------------------------------------ r722170 | staikos | 2007-10-06 15:47:14 -0400 (Sat, 06 Oct 2007) | 2 lines MSVC can't handle the bitfield of an enum. also pack bits appropriately. ------------------------------------------------------------------------ r722164 | staikos | 2007-10-06 15:28:03 -0400 (Sat, 06 Oct 2007) | 2 lines This test is invalid on win32 - or at least we need a better approach ------------------------------------------------------------------------ r722154 | treat | 2007-10-06 14:43:47 -0400 (Sat, 06 Oct 2007) | 8 lines * Automatically set the spacing based on whether any plotitem axis is being shared. * Unfortunately need to update each plotrenderitem each time the label visibility is changed. The algorithm to share axis is not the greatest or most efficient. One possibility is to not redraw the actual curve when in layout mode. ------------------------------------------------------------------------ r721734 | staikos | 2007-10-05 19:53:13 -0400 (Fri, 05 Oct 2007) | 2 lines compile ------------------------------------------------------------------------ r721683 | treat | 2007-10-05 17:16:51 -0400 (Fri, 05 Oct 2007) | 6 lines * Begin implementation of shared axis for plots in layout. * Don't reparent the plotrenderitems *ever* * Bugfix for ViewItem. * Provide suppression of labels. etc,... ------------------------------------------------------------------------ r721682 | fenton | 2007-10-05 17:15:43 -0400 (Fri, 05 Oct 2007) | 3 lines Update of spacing on Equation Dialog, population of Combobox entries and creation of Equation support. ------------------------------------------------------------------------ r721638 | treat | 2007-10-05 14:56:20 -0400 (Fri, 05 Oct 2007) | 7 lines * Add new top-level tied zoom action to toolbars/menus. * Provide get/set for plotrenderitem tied zoom. * Draw a checkbox for indicating tied zoom as well as hover. * Redesign how we register shorcuts with the view. * New selectedViewItem convenience function for View. * Don't show selection boxes in ViewMode::Data. ------------------------------------------------------------------------ r721627 | staikos | 2007-10-05 14:18:46 -0400 (Fri, 05 Oct 2007) | 2 lines fix build ------------------------------------------------------------------------ r721619 | fenton | 2007-10-05 13:44:59 -0400 (Fri, 05 Oct 2007) | 2 lines Conversion of KstSettings to Kst::Settings and other cleanup. ------------------------------------------------------------------------ r721598 | fenton | 2007-10-05 12:33:55 -0400 (Fri, 05 Oct 2007) | 4 lines Conversion of KstObjectDefaults to Kst::ObjectDefaults, KstPainter to Kst::Painter, KstPSD to Kst::PSD, KstRelation to Kst::Relation and Kst::VCurve to Kst::Curve and associated changes. ------------------------------------------------------------------------ r721572 | treat | 2007-10-05 10:51:21 -0400 (Fri, 05 Oct 2007) | 5 lines * Implement shift/ctrl modified selection zoom. * Painting and clipping fixes. * Don't hardcode pen width. * Set the foreground and background colors of the curve context. ------------------------------------------------------------------------ r721563 | fenton | 2007-10-05 10:13:28 -0400 (Fri, 05 Oct 2007) | 3 lines Conversion of KstVCurve to Kst::VCurve, KstLineStyle to Kst::LineStyle and KstImage to Kst::Image and associated changes. ------------------------------------------------------------------------ r721557 | fenton | 2007-10-05 09:46:05 -0400 (Fri, 05 Oct 2007) | 2 lines Conversion of KstHistogram to Kst::Histogram and associated changes. ------------------------------------------------------------------------ r721550 | treat | 2007-10-05 09:29:32 -0400 (Fri, 05 Oct 2007) | 4 lines * Add get/set for logbase and don't hardcode. * Fix hackup for log mode. * Investigate kst2dplot for solutions. ------------------------------------------------------------------------ r721548 | fenton | 2007-10-05 09:15:54 -0400 (Fri, 05 Oct 2007) | 4 lines Conversion of kstcurvehint to Kst::CurveHint, KstCurvePointSymbol to Kst::CurvePointSymbol and KstEquation to Kst::Equation and associated changes. ------------------------------------------------------------------------ r721309 | treat | 2007-10-04 19:13:15 -0400 (Thu, 04 Oct 2007) | 14 lines * Refactor the registerShortcut design a bit and make them app wide. * Bugfix in the SelectionRect class. * Add ZoomModes: Auto, AutoBorder, Expression, Spike Insensitive, MeanCentered * Add Axis dependent modes * Implement: 1) Zoom Maximum 2) Zoom XMaximum 3) Zoom YMaximum 4) Log X 5) Log Y * Document all the possible zoom mode operations and provide infrastructure to implement the rest. ------------------------------------------------------------------------ r721239 | fenton | 2007-10-04 16:42:57 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstCSD to Kst::CSD. ------------------------------------------------------------------------ r721222 | fenton | 2007-10-04 16:27:30 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstColorSequence to Kst::ColorSequence. ------------------------------------------------------------------------ r721206 | fenton | 2007-10-04 15:53:42 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstBasicPlugin to Kst::BasicPlugin. ------------------------------------------------------------------------ r721196 | fenton | 2007-10-04 15:35:36 -0400 (Thu, 04 Oct 2007) | 3 lines Conversion of KstIndex, KstExtension, KstEvents and KstMath to new namespace conventions. ------------------------------------------------------------------------ r721173 | fenton | 2007-10-04 14:55:48 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstTimezones to Kst::Timezones. ------------------------------------------------------------------------ r721166 | fenton | 2007-10-04 14:38:39 -0400 (Thu, 04 Oct 2007) | 3 lines Conversion of KstString to Kst::String, KstPrimitive to Kst::Primitive and KstSharedPtr to Kst::SharedPtr and associated changes. ------------------------------------------------------------------------ r721142 | treat | 2007-10-04 13:45:57 -0400 (Thu, 04 Oct 2007) | 6 lines * Add a title to the item's context menu. * Change the names of the items to suit. * Add zoom actions for the plotrenderitem. * Implement triggering mechanism for items to have shortcuts. ------------------------------------------------------------------------ r721127 | fenton | 2007-10-04 12:50:27 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstVectorDefaults to Kst::VectorDefaults. ------------------------------------------------------------------------ r721124 | fenton | 2007-10-04 12:35:26 -0400 (Thu, 04 Oct 2007) | 3 lines Conversion of KstObjectList to Kst::ObjectList and KstObjectMap to Kst::ObjectMap and associated changes. ------------------------------------------------------------------------ r721108 | fenton | 2007-10-04 12:06:22 -0400 (Thu, 04 Oct 2007) | 4 lines Conversion of KstMatrix to Kst::Matrix, KstDataObjectCollection to Kst::DataObjectCollection, KstObjectCollection to Kst::ObjectCollection and KstMatrixDefaults to Kst::MatrixDefaults and all associated changes. ------------------------------------------------------------------------ r721086 | fenton | 2007-10-04 10:32:17 -0400 (Thu, 04 Oct 2007) | 2 lines Conversion of KstDebug to Kst::Debug and associated changes. ------------------------------------------------------------------------ r721076 | fenton | 2007-10-04 09:58:38 -0400 (Thu, 04 Oct 2007) | 3 lines Conversion of KstObject to Kst::Object and KstObjectTag to Kst::ObjectTag and all associated changes. ------------------------------------------------------------------------ r720975 | staikos | 2007-10-04 03:07:26 -0400 (Thu, 04 Oct 2007) | 2 lines I think black is more appropriate for the default color ------------------------------------------------------------------------ r720973 | staikos | 2007-10-04 03:04:34 -0400 (Thu, 04 Oct 2007) | 2 lines repair the layout - use a grid ------------------------------------------------------------------------ r720968 | staikos | 2007-10-04 03:01:19 -0400 (Thu, 04 Oct 2007) | 2 lines launch the equation dialog ------------------------------------------------------------------------ r720963 | staikos | 2007-10-04 02:49:41 -0400 (Thu, 04 Oct 2007) | 3 lines make a class to handle (from,to) selection rects with built-in normalization and tracking of the proper start and end points ------------------------------------------------------------------------ r720872 | treat | 2007-10-03 18:40:28 -0400 (Wed, 03 Oct 2007) | 9 lines * And we have mouse based generic zoom :) * Provide proper coordinate transformation from the projection to the plotitem's coordinates. * Update the mainwindow statusbar whenever we hover the projection to report the current mouse projection coordinates. * Draw a crossCursor when we are in data mode and hovering over a projection. ------------------------------------------------------------------------ r720833 | treat | 2007-10-03 16:28:20 -0400 (Wed, 03 Oct 2007) | 2 lines * Don't clip too much. ------------------------------------------------------------------------ r720832 | treat | 2007-10-03 16:27:18 -0400 (Wed, 03 Oct 2007) | 18 lines * PlotRenderItem's are now real ViewItem's which means they now can reparent along with everything else. * Modify the paint routines of PlotRenderItem to take this into account. * Don't allow PlotRenderItem's to end up in a layout. * Item's that have a layout no longer completely handle the children's events. This allows data mode to work for PlotRenderItem's even when the plot itself is in a layout. * Clip the selectionRect of the PlotRenderItem. * The View now default's to Data mode. * Rects are always normalized. We no longer can have items with negative width/height which leads to artifacts and bad things. ------------------------------------------------------------------------ r720817 | fenton | 2007-10-03 15:59:21 -0400 (Wed, 03 Oct 2007) | 2 lines Conversion of kstdataplugin to Kst::DataPlugin and associated changes. ------------------------------------------------------------------------ r720813 | fenton | 2007-10-03 15:39:51 -0400 (Wed, 03 Oct 2007) | 2 lines Conversion of KstDataSource to Kst::DataSource and associated changes. ------------------------------------------------------------------------ r720757 | fenton | 2007-10-03 12:42:09 -0400 (Wed, 03 Oct 2007) | 3 lines Conversion of KstDataCollection to Kst::DataCollection and associated changes. ------------------------------------------------------------------------ r720698 | fenton | 2007-10-03 10:04:43 -0400 (Wed, 03 Oct 2007) | 3 lines Conversion of KstVector to Kst::Vector and KstDataObject to Kst::DataObject and all associated changes. ------------------------------------------------------------------------ r720311 | treat | 2007-10-02 19:16:41 -0400 (Tue, 02 Oct 2007) | 2 lines * Don't allow an empty selection for x and y vectors. ------------------------------------------------------------------------ r720290 | treat | 2007-10-02 18:28:30 -0400 (Tue, 02 Oct 2007) | 4 lines * Debug and fixup the curve drawing. I *think* we are comparable to the performance in 1.4.x now. Doubtless more bugs, but still... ------------------------------------------------------------------------ r720256 | netterfield | 2007-10-02 16:05:20 -0400 (Tue, 02 Oct 2007) | 2 lines Add zoom modes ------------------------------------------------------------------------ r720222 | fenton | 2007-10-02 14:31:28 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion of kstdateparser to DateParser. ------------------------------------------------------------------------ r720220 | fenton | 2007-10-02 14:20:18 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion from KstScalar to Scalar and associated changes. ------------------------------------------------------------------------ r720216 | treat | 2007-10-02 14:06:33 -0400 (Tue, 02 Oct 2007) | 18 lines * Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though...* Clean up the layout of some of these dialogs * Look at the curve rendering time... needs to be greatly improved. It looks like the problem is in KstVCurve though... ------------------------------------------------------------------------ r720205 | treat | 2007-10-02 13:29:00 -0400 (Tue, 02 Oct 2007) | 3 lines * Fix typo in databutton * Fix typo in plotitem that was affecting topLabel ------------------------------------------------------------------------ r720190 | treat | 2007-10-02 13:00:24 -0400 (Tue, 02 Oct 2007) | 3 lines * Mixed up apparently. The usability design of this widget leaves much to be desired. ------------------------------------------------------------------------ r720176 | treat | 2007-10-02 12:12:59 -0400 (Tue, 02 Oct 2007) | 3 lines * Use the new Qt4 CSS stylesheet feature to reproduce the look we had in 1.4.x. ------------------------------------------------------------------------ r720157 | fenton | 2007-10-02 11:25:21 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion of KstSVector to Kst::GeneratedVector and associated changes. ------------------------------------------------------------------------ r720153 | fenton | 2007-10-02 11:05:39 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion of KstSMatrix to Kst::GeneratedMatrix. ------------------------------------------------------------------------ r720150 | fenton | 2007-10-02 10:55:18 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion of kstrvector to Kst::DataVector and associated changes. ------------------------------------------------------------------------ r720143 | fenton | 2007-10-02 10:32:48 -0400 (Tue, 02 Oct 2007) | 2 lines Conversion of kstrmatrix to Kst::DataMatrix. ------------------------------------------------------------------------ r719783 | treat | 2007-10-01 17:48:19 -0400 (Mon, 01 Oct 2007) | 2 lines * Add the command to the undo stack. ------------------------------------------------------------------------ r719780 | treat | 2007-10-01 17:41:10 -0400 (Mon, 01 Oct 2007) | 4 lines * A little better default placement. * Use command pattern. * Begin fleshing out the curveplacement widget. ------------------------------------------------------------------------ r719757 | staikos | 2007-10-01 16:38:12 -0400 (Mon, 01 Oct 2007) | 2 lines make sure the lifetime doesn't expire on the internal pointer ------------------------------------------------------------------------ r719756 | treat | 2007-10-01 16:37:18 -0400 (Mon, 01 Oct 2007) | 2 lines * Build. ------------------------------------------------------------------------ r719746 | staikos | 2007-10-01 16:20:29 -0400 (Mon, 01 Oct 2007) | 2 lines minor cleanup ------------------------------------------------------------------------ r719743 | treat | 2007-10-01 16:12:53 -0400 (Mon, 01 Oct 2007) | 5 lines * We can now create curves entirely from the GUI as well as plot the curves. * I've tested with gyrodata.dat and it works. We have real plots now :) ------------------------------------------------------------------------ r719742 | fenton | 2007-10-01 16:12:38 -0400 (Mon, 01 Oct 2007) | 2 lines Rename of KstAVector to Kst::EditableVector ------------------------------------------------------------------------ r719713 | staikos | 2007-10-01 15:08:48 -0400 (Mon, 01 Oct 2007) | 2 lines don't support this on win32 right now ------------------------------------------------------------------------ r719712 | staikos | 2007-10-01 15:07:05 -0400 (Mon, 01 Oct 2007) | 2 lines Make these compile and restore unix line endings ------------------------------------------------------------------------ r719711 | staikos | 2007-10-01 15:01:36 -0400 (Mon, 01 Oct 2007) | 2 lines and now kst.exe builds ------------------------------------------------------------------------ r719710 | fenton | 2007-10-01 14:56:21 -0400 (Mon, 01 Oct 2007) | 2 lines Updating header information to properly include UBC. ------------------------------------------------------------------------ r719707 | staikos | 2007-10-01 14:48:06 -0400 (Mon, 01 Oct 2007) | 2 lines add missing libs required on Win32 ------------------------------------------------------------------------ r719703 | fenton | 2007-10-01 14:33:04 -0400 (Mon, 01 Oct 2007) | 2 lines Rename of KstAVector to Kst::EditableVector ------------------------------------------------------------------------ r719699 | fenton | 2007-10-01 14:19:20 -0400 (Mon, 01 Oct 2007) | 2 lines Updating header. ------------------------------------------------------------------------ r719698 | fenton | 2007-10-01 14:11:05 -0400 (Mon, 01 Oct 2007) | 2 lines Rename of kstamatrix to Kst::EditableMatrix and the associated changes. ------------------------------------------------------------------------ r719683 | treat | 2007-10-01 13:17:55 -0400 (Mon, 01 Oct 2007) | 3 lines * Flesh out the vectorselector. It basically works now. * Provide metatype information for a host of KstObject's. ------------------------------------------------------------------------ r719665 | fenton | 2007-10-01 12:04:20 -0400 (Mon, 01 Oct 2007) | 2 lines Removal of void parameter and code simplification. ------------------------------------------------------------------------ r719662 | fenton | 2007-10-01 11:55:46 -0400 (Mon, 01 Oct 2007) | 2 lines Adding popup auto completion to kst combobox. ------------------------------------------------------------------------ r719660 | treat | 2007-10-01 11:50:48 -0400 (Mon, 01 Oct 2007) | 9 lines * Reintroduce the dialoglauncher. * Note only the dialoglauncher is a singleton, not the various dialogs it calls. * Modify DataManager to use this new class. * Modify DataDialogs to use only one constructor to simplify the API. * Hookup the VectorSelector widget to use this. ------------------------------------------------------------------------ r718479 | staikos | 2007-09-28 16:02:20 -0400 (Fri, 28 Sep 2007) | 3 lines one more for now. All that remains is to make kst.exe link ------------------------------------------------------------------------ r718476 | staikos | 2007-09-28 15:53:07 -0400 (Fri, 28 Sep 2007) | 2 lines keep the default scope straight ------------------------------------------------------------------------ r718475 | staikos | 2007-09-28 15:49:36 -0400 (Fri, 28 Sep 2007) | 2 lines don't build dirfile on win32 until getdata is ported ------------------------------------------------------------------------ r718474 | staikos | 2007-09-28 15:47:40 -0400 (Fri, 28 Sep 2007) | 3 lines on win32, use static libs for now. build system needs work, but now we compile as far as dirfile, which is not really win32 compatible. ------------------------------------------------------------------------ r718473 | staikos | 2007-09-28 15:46:36 -0400 (Fri, 28 Sep 2007) | 2 lines add missing include ------------------------------------------------------------------------ r718472 | fenton | 2007-09-28 15:44:33 -0400 (Fri, 28 Sep 2007) | 2 lines Addition of stub version of equationdialog. ------------------------------------------------------------------------ r718468 | staikos | 2007-09-28 15:31:06 -0400 (Fri, 28 Sep 2007) | 2 lines libkstmath now builds and almost links ------------------------------------------------------------------------ r718461 | staikos | 2007-09-28 15:16:21 -0400 (Fri, 28 Sep 2007) | 2 lines libkst.dll builds now ------------------------------------------------------------------------ r718454 | staikos | 2007-09-28 15:05:57 -0400 (Fri, 28 Sep 2007) | 2 lines This file doesn't work on win32 ------------------------------------------------------------------------ r718429 | treat | 2007-09-28 13:04:22 -0400 (Fri, 28 Sep 2007) | 2 lines * This is an executable. ------------------------------------------------------------------------ r718428 | treat | 2007-09-28 13:03:24 -0400 (Fri, 28 Sep 2007) | 5 lines * Make sure rpath is correct for all resources. * Enable the vector selector. * Make libkstwidgets link correctly. * Fix resource issues and cleanup the rest of the .pro files. ------------------------------------------------------------------------ r718395 | treat | 2007-09-28 11:44:15 -0400 (Fri, 28 Sep 2007) | 5 lines * Add new curve dialog. * Cleanup the databutton(action) class. * Don't show the canonical dataobjects that don't exist yet. ------------------------------------------------------------------------ r718383 | staikos | 2007-09-28 11:28:17 -0400 (Fri, 28 Sep 2007) | 2 lines no app bundle on OS X ------------------------------------------------------------------------ r718377 | staikos | 2007-09-28 11:18:18 -0400 (Fri, 28 Sep 2007) | 2 lines add a windows build script that needs lots of work ------------------------------------------------------------------------ r718376 | staikos | 2007-09-28 11:17:56 -0400 (Fri, 28 Sep 2007) | 2 lines add missing include ------------------------------------------------------------------------ r718028 | treat | 2007-09-27 19:13:33 -0400 (Thu, 27 Sep 2007) | 2 lines * Don't show the extension by default. ------------------------------------------------------------------------ r718026 | treat | 2007-09-27 19:08:15 -0400 (Thu, 27 Sep 2007) | 5 lines * Disable vector selector for now as it was giving designer fits. * Rename kstwidgets and the curve*widgets. * Add new curvetab which will be integral to the new curvedialog. ------------------------------------------------------------------------ r717986 | fenton | 2007-09-27 17:00:17 -0400 (Thu, 27 Sep 2007) | 2 lines Adding plugin extensions for curveplacement and curveappearance. ------------------------------------------------------------------------ r717983 | treat | 2007-09-27 16:49:45 -0400 (Thu, 27 Sep 2007) | 2 lines * Style, namespace fixes ------------------------------------------------------------------------ r717982 | treat | 2007-09-27 16:44:40 -0400 (Thu, 27 Sep 2007) | 2 lines * These are not executables. ------------------------------------------------------------------------ r717981 | treat | 2007-09-27 16:43:13 -0400 (Thu, 27 Sep 2007) | 2 lines * Silence ------------------------------------------------------------------------ r717977 | fenton | 2007-09-27 16:34:41 -0400 (Thu, 27 Sep 2007) | 2 lines Port of curveappearance and curveplacement widgets. ------------------------------------------------------------------------ r717966 | treat | 2007-09-27 16:01:41 -0400 (Thu, 27 Sep 2007) | 5 lines * Add stubbed version of all the primitive selectors. * Fix file requester alignment, size and layout. * Bugfix in kstwidgets with inheritance problem. ------------------------------------------------------------------------ r717929 | treat | 2007-09-27 14:45:46 -0400 (Thu, 27 Sep 2007) | 2 lines * These don't need to be public ------------------------------------------------------------------------ r717919 | fenton | 2007-09-27 14:25:25 -0400 (Thu, 27 Sep 2007) | 2 lines Port of dirfile and inclusion in build. ------------------------------------------------------------------------ r717834 | treat | 2007-09-27 13:00:21 -0400 (Thu, 27 Sep 2007) | 4 lines * Move editmultiplewidget to libkstapp. From now on the only things that go in 'widgets' directory are designer plugins. ------------------------------------------------------------------------ r717832 | treat | 2007-09-27 12:57:22 -0400 (Thu, 27 Sep 2007) | 2 lines * Properly namespace and cleanup style. ------------------------------------------------------------------------ r717828 | treat | 2007-09-27 12:53:03 -0400 (Thu, 27 Sep 2007) | 2 lines * These should not be executable ------------------------------------------------------------------------ r717822 | treat | 2007-09-27 12:35:42 -0400 (Thu, 27 Sep 2007) | 3 lines * Don't issue warnings when we don't even have relevant tests for these datasources. ------------------------------------------------------------------------ r717802 | treat | 2007-09-27 12:15:59 -0400 (Thu, 27 Sep 2007) | 3 lines * Make ascii config look better and give a good name to the dialog. ------------------------------------------------------------------------ r717793 | treat | 2007-09-27 11:49:44 -0400 (Thu, 27 Sep 2007) | 3 lines * Set the settings object. This solves the crash that nicholas was experiencing. ------------------------------------------------------------------------ r717780 | fenton | 2007-09-27 11:00:15 -0400 (Thu, 27 Sep 2007) | 2 lines Adding final test. ------------------------------------------------------------------------ r717754 | fenton | 2007-09-27 09:47:31 -0400 (Thu, 27 Sep 2007) | 2 lines Port of existing tests to new format. ------------------------------------------------------------------------ r717421 | treat | 2007-09-26 17:28:31 -0400 (Wed, 26 Sep 2007) | 2 lines * Fixed. We can now read in ascii datavectors from disk. ------------------------------------------------------------------------ r717409 | treat | 2007-09-26 16:54:39 -0400 (Wed, 26 Sep 2007) | 10 lines We can now load vectors from disk through the ascii datasource. * Add new Kst::DataTab and Kst::DataSourceDialog classes * Provide mechanism to call between datatab and datadialog * Big changes to VectorDialog to create DataVectors There is still something wrong with the data vectors. Investigating... ------------------------------------------------------------------------ r717348 | treat | 2007-09-26 14:03:30 -0400 (Wed, 26 Sep 2007) | 3 lines * Get rid of annoying message and just use QVERIFY for testing eq INF. ------------------------------------------------------------------------ r717344 | treat | 2007-09-26 13:37:29 -0400 (Wed, 26 Sep 2007) | 4 lines * Rearrange some stuff in kstdatasource * Add new tests for config widget and filetype to testdatasource * Refactor vectordialog to cleanup taking into account above ------------------------------------------------------------------------ r717335 | treat | 2007-09-26 12:51:41 -0400 (Wed, 26 Sep 2007) | 2 lines * Add testpsd from Mike Fenton. ------------------------------------------------------------------------ r717316 | treat | 2007-09-26 11:58:48 -0400 (Wed, 26 Sep 2007) | 2 lines * Oopsies ------------------------------------------------------------------------ r717307 | fenton | 2007-09-26 11:39:20 -0400 (Wed, 26 Sep 2007) | 2 lines Fixing logic error. ------------------------------------------------------------------------ r717302 | fenton | 2007-09-26 11:33:47 -0400 (Wed, 26 Sep 2007) | 2 lines Reducing code complexity on hide/show of widget extension. ------------------------------------------------------------------------ r717299 | fenton | 2007-09-26 11:26:03 -0400 (Wed, 26 Sep 2007) | 4 lines Transition of editmultiplewidget into the new UI and extension of dialog.ui to include an extension widget for adding additional ui components to the right of the existing dialog. ------------------------------------------------------------------------ r717294 | treat | 2007-09-26 11:08:18 -0400 (Wed, 26 Sep 2007) | 4 lines * The datasource plugin loads and I can retrieve the config widget. Next up is to actually hook-up config widget and create a vector read in from disk. ------------------------------------------------------------------------ r717283 | treat | 2007-09-26 10:37:07 -0400 (Wed, 26 Sep 2007) | 2 lines * Style ------------------------------------------------------------------------ r717281 | treat | 2007-09-26 10:33:27 -0400 (Wed, 26 Sep 2007) | 2 lines * Add a howto and handy documentation ------------------------------------------------------------------------ r717111 | treat | 2007-09-25 23:56:05 -0400 (Tue, 25 Sep 2007) | 2 lines * Move these to be consistent. ------------------------------------------------------------------------ r717109 | treat | 2007-09-25 23:52:43 -0400 (Tue, 25 Sep 2007) | 2 lines * Port tests over ------------------------------------------------------------------------ r717071 | treat | 2007-09-25 20:56:04 -0400 (Tue, 25 Sep 2007) | 2 lines * And voila, test suite now works and datasource passes :) ------------------------------------------------------------------------ r717061 | treat | 2007-09-25 20:12:40 -0400 (Tue, 25 Sep 2007) | 4 lines * Beginning of new test suite. It compiles and links, but getting weird linking error when *running*. ------------------------------------------------------------------------ r717056 | treat | 2007-09-25 19:20:46 -0400 (Tue, 25 Sep 2007) | 2 lines * Start of new testlib ------------------------------------------------------------------------ r717036 | treat | 2007-09-25 17:36:38 -0400 (Tue, 25 Sep 2007) | 2 lines * Move out of the way ------------------------------------------------------------------------ r716950 | treat | 2007-09-25 13:49:09 -0400 (Tue, 25 Sep 2007) | 3 lines * Try and hook up reading from the datasource in vectordialog. ------------------------------------------------------------------------ r716940 | fenton | 2007-09-25 13:05:10 -0400 (Tue, 25 Sep 2007) | 3 lines Disabling all currently unused menu items until they have been implemented. ------------------------------------------------------------------------ r716937 | fenton | 2007-09-25 12:56:41 -0400 (Tue, 25 Sep 2007) | 2 lines Updated buttons for the datamanger with the text left aligned. ------------------------------------------------------------------------ r716935 | treat | 2007-09-25 12:53:53 -0400 (Tue, 25 Sep 2007) | 3 lines * Bugfix for Kst::fileRequester. This hacks around a bug in Qt. Grrr... ------------------------------------------------------------------------ r716917 | treat | 2007-09-25 11:43:19 -0400 (Tue, 25 Sep 2007) | 3 lines * Reimplement Kst::DataRange so we can begin reading vectors in from disk. ------------------------------------------------------------------------ r716545 | treat | 2007-09-24 17:33:41 -0400 (Mon, 24 Sep 2007) | 2 lines * We now can create new slave vectors via the gui. ------------------------------------------------------------------------ r716516 | treat | 2007-09-24 16:23:28 -0400 (Mon, 24 Sep 2007) | 5 lines * Flesh out Kst::DataDialog and provide more hooks in Kst::Dialog to customize in subclasses. * Kst::DataDialog is now an abstract class. Real data dialogs can subclass this and implement the interface. ------------------------------------------------------------------------ r716480 | treat | 2007-09-24 15:09:57 -0400 (Mon, 24 Sep 2007) | 3 lines * Revamp the dialog class to provide custom areas. * Get ready to move edit multiple skeleton over. ------------------------------------------------------------------------ r716385 | treat | 2007-09-24 12:18:49 -0400 (Mon, 24 Sep 2007) | 2 lines * Rename and cleanup this file a bit. ------------------------------------------------------------------------ r716379 | treat | 2007-09-24 12:05:09 -0400 (Mon, 24 Sep 2007) | 4 lines * Make vector dialog look better and use the new Kst::Dialog class. * Don't set margin in new FileRequester. ------------------------------------------------------------------------ r716360 | treat | 2007-09-24 11:29:59 -0400 (Mon, 24 Sep 2007) | 3 lines * Implement bits of datamanager and cleanup some other files. ------------------------------------------------------------------------ r715309 | treat | 2007-09-21 15:57:59 -0400 (Fri, 21 Sep 2007) | 8 lines * Add a bunch of new widgets so that we can port over the vector dialog for creating new vectors. * ComboxBox ... this is a placeholder for what will eventually be a completion enabled combo. * DataRange ... this is a port of the KstDataRange class * FileRequester ... we no longer have KUrlRequester so this is a replacement. ------------------------------------------------------------------------ r715285 | treat | 2007-09-21 14:19:28 -0400 (Fri, 21 Sep 2007) | 4 lines * Do not use dynamic_cast any longer for viewitems. * From now on, items that subclass viewitem must not reimplement the QGraphicsItem::type() method. ------------------------------------------------------------------------ r715264 | treat | 2007-09-21 12:31:31 -0400 (Fri, 21 Sep 2007) | 2 lines * These don't work yet, so disable. ------------------------------------------------------------------------ r715263 | treat | 2007-09-21 12:29:57 -0400 (Fri, 21 Sep 2007) | 5 lines * Enable caching for our gradient background. * Hook up the new application settings dialog. * Can now turn on/off opengl as well as set the parameters of the grid. ------------------------------------------------------------------------ r714953 | treat | 2007-09-20 22:44:31 -0400 (Thu, 20 Sep 2007) | 3 lines * Dialog/Page bug fixes. * Beginning of application settings. ------------------------------------------------------------------------ r714951 | treat | 2007-09-20 21:29:57 -0400 (Thu, 20 Sep 2007) | 2 lines * Forgot to check these in apparently. ------------------------------------------------------------------------ r714905 | treat | 2007-09-20 17:18:21 -0400 (Thu, 20 Sep 2007) | 2 lines * Switch between layout modes in different tabs. ------------------------------------------------------------------------ r714874 | treat | 2007-09-20 15:40:04 -0400 (Thu, 20 Sep 2007) | 3 lines * Refactor layout commands once again. Now they should maintain state and be completely reversible. ------------------------------------------------------------------------ r714804 | treat | 2007-09-20 12:57:27 -0400 (Thu, 20 Sep 2007) | 6 lines * Style fixes. * Make layout commands reset geometries when undo. * Break out the top-level layout box. * Custom context menu for top-level layout box. * Don't move, resize, rotate, etc for top-level layout box. ------------------------------------------------------------------------ r714552 | treat | 2007-09-19 17:39:50 -0400 (Wed, 19 Sep 2007) | 4 lines * Provide bit flags to set/unset the various grip modes. Labelitems can no longer resize for instance. ------------------------------------------------------------------------ r714515 | treat | 2007-09-19 15:04:05 -0400 (Wed, 19 Sep 2007) | 3 lines * Provide default pens and brushes that correspond to what we had in kst1.x. ------------------------------------------------------------------------ r714512 | treat | 2007-09-19 14:46:49 -0400 (Wed, 19 Sep 2007) | 3 lines * Draw grips on top of object and makes sure they work for the part of grip inside the items shape. ------------------------------------------------------------------------ r714486 | treat | 2007-09-19 13:41:19 -0400 (Wed, 19 Sep 2007) | 4 lines * Reduce the gripBoundingRect so that the centers of the grips are the same as the vertice they are operating on. ------------------------------------------------------------------------ r714475 | treat | 2007-09-19 12:49:48 -0400 (Wed, 19 Sep 2007) | 2 lines * Resize child rotated items by minimizing. ------------------------------------------------------------------------ r714233 | treat | 2007-09-18 19:44:05 -0400 (Tue, 18 Sep 2007) | 3 lines * Works much better for arbitrary number of nested items. Could probably be simplified a good bit. ------------------------------------------------------------------------ r714134 | treat | 2007-09-18 15:56:34 -0400 (Tue, 18 Sep 2007) | 2 lines * Resize child geometries when resizing a parent. ------------------------------------------------------------------------ r712612 | treat | 2007-09-14 18:11:57 -0400 (Fri, 14 Sep 2007) | 3 lines * Propagate the transform when reparenting. ...This took a good bit of debug work. ------------------------------------------------------------------------ r712511 | treat | 2007-09-14 12:05:23 -0400 (Fri, 14 Sep 2007) | 2 lines * Only layout direct child items, not grandchildren. ------------------------------------------------------------------------ r712508 | treat | 2007-09-14 11:56:10 -0400 (Fri, 14 Sep 2007) | 2 lines * Try to reparent at the end of the creation mode. ------------------------------------------------------------------------ r712231 | treat | 2007-09-13 20:45:46 -0400 (Thu, 13 Sep 2007) | 2 lines * Enforce the rules according to layout spec page 2. ------------------------------------------------------------------------ r712223 | treat | 2007-09-13 19:08:09 -0400 (Thu, 13 Sep 2007) | 2 lines * Rename to make the code clear. ------------------------------------------------------------------------ r712204 | treat | 2007-09-13 18:04:18 -0400 (Thu, 13 Sep 2007) | 11 lines * Move debug defines. * Fix crash on exit. * Bugfixes for reparenting when an item is in a layout already in correct parent. Simplify... * Better reparenting debug. * Fix crash when attempting to create a layout with no items. * Add functions to the layout class for controlling plotitem's margins as per spec. * Make the plotitem and plotrenderitem respect the layout's margins as per spec. ------------------------------------------------------------------------ r712130 | treat | 2007-09-13 13:57:15 -0400 (Thu, 13 Sep 2007) | 5 lines * Add gridlayouthelper classes adapted from qt designer. * Hook up the gridlayouthelper so that our items are now automatically placed in a grid characterized by their relative positions and geometries. ------------------------------------------------------------------------ r712066 | treat | 2007-09-13 09:37:00 -0400 (Thu, 13 Sep 2007) | 14 lines * SELECT_BOUND is disabled. Now default to selection rect and grip orientation as defined in the layout spec. * Turn off scale mousemode altogether. Now controlled through a define. * Redesign lineitem completely. Still not done, but it works much more like it is supposed to. * Rotation improvements and bugfixes. * Don't display selection rect when creating the item. * Provide a 'centerOfRotation' method that controls the origin about which the item rotates. * Simplify the debug rotation mode. * Style fixups. ------------------------------------------------------------------------ r711824 | treat | 2007-09-12 17:50:29 -0400 (Wed, 12 Sep 2007) | 5 lines * Use floating point in viewitem * Start implementing customizations for handling lineitem * Don't resize item handles when window resizes * Show selection rect when the item is under mouse ------------------------------------------------------------------------ r709605 | treat | 2007-09-07 18:20:51 -0400 (Fri, 07 Sep 2007) | 2 lines * A little nicer ------------------------------------------------------------------------ r709565 | treat | 2007-09-07 16:21:37 -0400 (Fri, 07 Sep 2007) | 4 lines * Add layout options to dialog. Can now specify the spacing and margin. * Reformat a few classes to fit style. ------------------------------------------------------------------------ r709544 | treat | 2007-09-07 15:23:21 -0400 (Fri, 07 Sep 2007) | 5 lines * Rename KstApplication to use namespace. * No need for singleton ViewItemDialog. * Add ability for ViewItem subclasses to customize the ViewItemDialog by adding pages. ------------------------------------------------------------------------ r709532 | treat | 2007-09-07 14:49:11 -0400 (Fri, 07 Sep 2007) | 4 lines * No more restore defaults by default. * Respect apply button for ViewItemDialog. * Little redesign to hopefully simplify and make clear. ------------------------------------------------------------------------ r709483 | treat | 2007-09-07 11:26:10 -0400 (Fri, 07 Sep 2007) | 2 lines * These are no longer needed. ------------------------------------------------------------------------ r709482 | treat | 2007-09-07 11:25:28 -0400 (Fri, 07 Sep 2007) | 8 lines * Add new base classes for all kst dialogs -Kst::Dialog -Kst::DialogPage -Kst::DialogTab * Move fillandstroke and break it out into individual tabs * Modify ViewItemDialog to use the new classes ------------------------------------------------------------------------ r709256 | treat | 2007-09-06 19:18:47 -0400 (Thu, 06 Sep 2007) | 3 lines * Add spacing and margin to gridlayout. * Add a default strut for margin/spacing. ------------------------------------------------------------------------ r709220 | treat | 2007-09-06 17:20:19 -0400 (Thu, 06 Sep 2007) | 2 lines * Get rid of unneeded demo now. ------------------------------------------------------------------------ r709218 | treat | 2007-09-06 17:00:22 -0400 (Thu, 06 Sep 2007) | 5 lines * Add an action for toggle between data/layout modes. * Re-arrange some of the menu items and toolbars. * Disable layout related actions when not in layout mode. * Hide the layout toolbar when not in layout mode, but show it otherwise. ------------------------------------------------------------------------ r709158 | treat | 2007-09-06 13:09:20 -0400 (Thu, 06 Sep 2007) | 7 lines * Create a data/layout mode for views. * When in layout mode, you can manipulate the viewobjects * When in data mode, you can do zoom, etc. * Adjust the render items so you can now select the parent plotitem when in layout mode as you'd expect. ------------------------------------------------------------------------ r709139 | treat | 2007-09-06 12:27:59 -0400 (Thu, 06 Sep 2007) | 2 lines * Start transition to ok,apply,cancel ------------------------------------------------------------------------ r709131 | treat | 2007-09-06 11:59:16 -0400 (Thu, 06 Sep 2007) | 6 lines * Add debug stream operator to view items for easier debug * Set items to handle child events if a layout is present * Set creation pos to QPointF(0,0) * Don't create useless commands * Implement reparenting rules according to the spec ------------------------------------------------------------------------ r708894 | treat | 2007-09-05 19:10:53 -0400 (Wed, 05 Sep 2007) | 13 lines * Add two new images for layout/breaklayout * Don't draw anything for dummy ViewItem's * Add two new actions for layout/breaklayout to toolbars and remove from view context menu * Keep the aspect ratio when TLV resizes * Default the TLV scene to 800x600 for now * Provide easy convenience to add layout box to top-level scene * Implement command pattern for layouts * Bugfixing for the grid layout placement * Little refactoring of method names * Get ready for reparenting ------------------------------------------------------------------------ r708418 | treat | 2007-09-04 17:45:00 -0400 (Tue, 04 Sep 2007) | 2 lines * No more edit on double click ------------------------------------------------------------------------ r708350 | treat | 2007-09-04 11:47:01 -0400 (Tue, 04 Sep 2007) | 2 lines * Get ready for testing layouts more extensively ------------------------------------------------------------------------ r707056 | netterfield | 2007-08-31 17:56:24 -0400 (Fri, 31 Aug 2007) | 3 lines Add comments about parenting and parenting feedback. ------------------------------------------------------------------------ r707016 | treat | 2007-08-31 15:38:41 -0400 (Fri, 31 Aug 2007) | 2 lines * Make it obvious ------------------------------------------------------------------------ r707015 | treat | 2007-08-31 15:37:05 -0400 (Fri, 31 Aug 2007) | 3 lines * Fix a crash nicholas found and disable gradient editor as it is not ready. ------------------------------------------------------------------------ r707003 | treat | 2007-08-31 15:05:01 -0400 (Fri, 31 Aug 2007) | 2 lines * Sep out resize and scale in command pattern ------------------------------------------------------------------------ r706998 | treat | 2007-08-31 14:53:56 -0400 (Fri, 31 Aug 2007) | 2 lines * Default lock aspect for pictures ------------------------------------------------------------------------ r706995 | treat | 2007-08-31 14:50:34 -0400 (Fri, 31 Aug 2007) | 2 lines * Work on preserving aspect ratio ------------------------------------------------------------------------ r706908 | treat | 2007-08-31 10:44:53 -0400 (Fri, 31 Aug 2007) | 2 lines * some experiments that aren't done ------------------------------------------------------------------------ r706894 | treat | 2007-08-31 10:20:25 -0400 (Fri, 31 Aug 2007) | 2 lines * Resize works, but are funny when rotation is applied. ------------------------------------------------------------------------ r706652 | treat | 2007-08-30 21:02:58 -0400 (Thu, 30 Aug 2007) | 2 lines * too far ------------------------------------------------------------------------ r706638 | treat | 2007-08-30 19:15:09 -0400 (Thu, 30 Aug 2007) | 2 lines * Only left button for creation of items ------------------------------------------------------------------------ r706634 | treat | 2007-08-30 18:48:35 -0400 (Thu, 30 Aug 2007) | 2 lines * resize experiment. works, but not with transforms. ------------------------------------------------------------------------ r706571 | treat | 2007-08-30 15:34:17 -0400 (Thu, 30 Aug 2007) | 2 lines * Show all the points since we can do that now :) ------------------------------------------------------------------------ r706559 | treat | 2007-08-30 15:14:01 -0400 (Thu, 30 Aug 2007) | 12 lines This is a hack around something we do extensively in Kst that we can no longer do (and *should* no longer do) in the future. Namely, attempt to de-reference a Qt container iterator that might be QContainer::end() No more 'KstFooPtr = *_inputVector.find("SOMEFOOTHING");' For now, I've hacked around this so I can draw a curve without specifying error bars. In the future, we'll probably want to redesign our container classes to make this easier. ------------------------------------------------------------------------ r706513 | netterfield | 2007-08-30 12:11:53 -0400 (Thu, 30 Aug 2007) | 4 lines Fix error spotted by Nicholas: reference plot -> reference page ------------------------------------------------------------------------ r706485 | treat | 2007-08-30 10:47:54 -0400 (Thu, 30 Aug 2007) | 2 lines * Don't trigger internal lex/yacc handling in qmake. ------------------------------------------------------------------------ r706463 | treat | 2007-08-30 09:44:46 -0400 (Thu, 30 Aug 2007) | 2 lines * Get ready for real resize VS real scale ------------------------------------------------------------------------ r706450 | treat | 2007-08-30 09:05:54 -0400 (Thu, 30 Aug 2007) | 3 lines * Rename and reorganize the menus/toolbars to fit the new spec better. ------------------------------------------------------------------------ r706444 | treat | 2007-08-30 08:38:44 -0400 (Thu, 30 Aug 2007) | 2 lines * Floating point snap and more options ------------------------------------------------------------------------ r706341 | netterfield | 2007-08-29 20:38:54 -0400 (Wed, 29 Aug 2007) | 5 lines Two new spec docs: Fonts.pdf: description of how fonts behave in kst2 Layout mode.pdf: description of the UI in layout mode ------------------------------------------------------------------------ r706220 | treat | 2007-08-29 13:59:15 -0400 (Wed, 29 Aug 2007) | 4 lines * Draw a grid and snap item creation and movement to this grid. All of this will be configurable in the future of course. ------------------------------------------------------------------------ r706158 | treat | 2007-08-29 11:12:11 -0400 (Wed, 29 Aug 2007) | 2 lines * New grid layout and other fixes ------------------------------------------------------------------------ r704487 | treat | 2007-08-24 23:02:27 -0400 (Fri, 24 Aug 2007) | 2 lines * Place items and ignore events for plots in layout ------------------------------------------------------------------------ r704391 | treat | 2007-08-24 15:40:33 -0400 (Fri, 24 Aug 2007) | 2 lines * Begin work on a layout class for plots ------------------------------------------------------------------------ r704333 | treat | 2007-08-24 13:04:06 -0400 (Fri, 24 Aug 2007) | 2 lines Labels are drawing and resizing nicely... ------------------------------------------------------------------------ r704306 | treat | 2007-08-24 11:29:51 -0400 (Fri, 24 Aug 2007) | 2 lines * More label work ------------------------------------------------------------------------ r704262 | treat | 2007-08-24 10:13:50 -0400 (Fri, 24 Aug 2007) | 2 lines Compile ------------------------------------------------------------------------ r700163 | staikos | 2007-08-14 19:43:07 -0400 (Tue, 14 Aug 2007) | 2 lines rebuild cleanly ------------------------------------------------------------------------ r700131 | treat | 2007-08-14 18:14:38 -0400 (Tue, 14 Aug 2007) | 3 lines * Labels, refactoring, drawing code, plots are much better now. ------------------------------------------------------------------------ r695837 | treat | 2007-08-02 23:57:15 -0400 (Thu, 02 Aug 2007) | 2 lines Refactor a bit now that I know better how this is going to work. ------------------------------------------------------------------------ r695832 | treat | 2007-08-02 23:04:46 -0400 (Thu, 02 Aug 2007) | 3 lines * No longer hard code the zoom box. Now it is calculated to display the first 100 points. ------------------------------------------------------------------------ r695814 | treat | 2007-08-02 21:14:31 -0400 (Thu, 02 Aug 2007) | 12 lines And... we're drawing plots :) I'm leaving in the debugging code until I have a chance to go through it and document/refactor the kstvcurve drawing code. The plots are still fully transformable via QGV. Rotating plots ;) I'm still hardcoding the zoom box to this particular vector, but at least we're drawing this one good... more later. ------------------------------------------------------------------------ r695695 | staikos | 2007-08-02 13:38:23 -0400 (Thu, 02 Aug 2007) | 2 lines OS X build fixes ------------------------------------------------------------------------ r695691 | treat | 2007-08-02 13:31:16 -0400 (Thu, 02 Aug 2007) | 2 lines Draw something vaguely resembling error bars ------------------------------------------------------------------------ r695184 | treat | 2007-08-01 11:03:20 -0400 (Wed, 01 Aug 2007) | 5 lines * And we're back to drawing the red dot, but at least this time we're drawing with the right QPainter brush. Also, the scale of the dot changes as the plot is scaled. So that's nice. ------------------------------------------------------------------------ r695164 | treat | 2007-08-01 10:21:10 -0400 (Wed, 01 Aug 2007) | 2 lines * Revert for now ------------------------------------------------------------------------ r695159 | treat | 2007-08-01 09:52:35 -0400 (Wed, 01 Aug 2007) | 2 lines * Another rename and get ready to change to QGV subclass ------------------------------------------------------------------------ r695155 | treat | 2007-08-01 09:45:12 -0400 (Wed, 01 Aug 2007) | 2 lines * The real rename. ------------------------------------------------------------------------ r695150 | treat | 2007-08-01 09:38:26 -0400 (Wed, 01 Aug 2007) | 2 lines * rename ------------------------------------------------------------------------ r694518 | treat | 2007-07-30 18:46:15 -0400 (Mon, 30 Jul 2007) | 8 lines Try to draw a plot. Not working... most likely because I can't fathom how to setup a KstCurveRenderContext correctly. Quoting kstplot2d: // FIXME: someone document what these things mean ------------------------------------------------------------------------ r694450 | treat | 2007-07-30 15:14:21 -0400 (Mon, 30 Jul 2007) | 3 lines * Redesign and refactor and add plumbing so we can start drawing plots. ------------------------------------------------------------------------ r694435 | treat | 2007-07-30 13:46:10 -0400 (Mon, 30 Jul 2007) | 2 lines Don't crash ------------------------------------------------------------------------ r693748 | netterfield | 2007-07-28 17:52:32 -0400 (Sat, 28 Jul 2007) | 4 lines Add Adams's installation instructions. Add comments on current layout/tool mode behavior. ------------------------------------------------------------------------ r691420 | aseigo | 2007-07-23 12:27:05 -0400 (Mon, 23 Jul 2007) | 2 lines build on amd64, where you can't cast pointers to simple ints ------------------------------------------------------------------------ r690037 | netterfield | 2007-07-19 17:41:37 -0400 (Thu, 19 Jul 2007) | 10 lines Re-organize devel docs and add some new docs: depricated: no longer valid, but of potential historical interest general_1.x: applies to 1.x, and may apply to 2.x Kst2Specs: design docs for Kst2 I have added 2 pdfs to Kst2Specs to describe datasource/string changes, and to describe kstplot geometry. ------------------------------------------------------------------------ r689812 | staikos | 2007-07-19 04:08:30 -0400 (Thu, 19 Jul 2007) | 2 lines remove some obsolete ones ------------------------------------------------------------------------ r689811 | staikos | 2007-07-19 04:06:28 -0400 (Thu, 19 Jul 2007) | 3 lines Add a view manager dialog with no model or real UI yet. Also add an about dialog (needs a handler for the URLs) ------------------------------------------------------------------------ r689801 | staikos | 2007-07-19 03:20:34 -0400 (Thu, 19 Jul 2007) | 2 lines add icons ------------------------------------------------------------------------ r689647 | treat | 2007-07-18 15:39:07 -0400 (Wed, 18 Jul 2007) | 2 lines * Sync loading with saving of equations. ------------------------------------------------------------------------ r689639 | treat | 2007-07-18 15:03:26 -0400 (Wed, 18 Jul 2007) | 2 lines * Load svector, avector, and rvector too. ------------------------------------------------------------------------ r689626 | treat | 2007-07-18 14:22:29 -0400 (Wed, 18 Jul 2007) | 2 lines * Actually create the vectors ------------------------------------------------------------------------ r689588 | treat | 2007-07-18 12:17:18 -0400 (Wed, 18 Jul 2007) | 2 lines * Add prelim loading of vectors. ------------------------------------------------------------------------ r689553 | treat | 2007-07-18 10:59:30 -0400 (Wed, 18 Jul 2007) | 3 lines * Equations now load ------------------------------------------------------------------------ r689391 | staikos | 2007-07-18 02:31:21 -0400 (Wed, 18 Jul 2007) | 2 lines load in the icons and images ------------------------------------------------------------------------ r689389 | staikos | 2007-07-18 02:24:54 -0400 (Wed, 18 Jul 2007) | 2 lines more moves ------------------------------------------------------------------------ r689386 | staikos | 2007-07-18 02:21:55 -0400 (Wed, 18 Jul 2007) | 2 lines moved ------------------------------------------------------------------------ r689380 | staikos | 2007-07-18 02:17:14 -0400 (Wed, 18 Jul 2007) | 2 lines how to make toolbars work ------------------------------------------------------------------------ r689376 | staikos | 2007-07-18 02:03:35 -0400 (Wed, 18 Jul 2007) | 2 lines add saving of equations ------------------------------------------------------------------------ r689375 | staikos | 2007-07-18 01:57:21 -0400 (Wed, 18 Jul 2007) | 2 lines don't save slaves ------------------------------------------------------------------------ r689265 | treat | 2007-07-17 21:17:53 -0400 (Tue, 17 Jul 2007) | 2 lines * A cheap and simple getopt for now. ------------------------------------------------------------------------ r689149 | treat | 2007-07-17 15:03:13 -0400 (Tue, 17 Jul 2007) | 2 lines * Note which dataobjects still need to be serialized ------------------------------------------------------------------------ r689143 | treat | 2007-07-17 14:29:55 -0400 (Tue, 17 Jul 2007) | 2 lines * Move tag to impl file. ------------------------------------------------------------------------ r688822 | treat | 2007-07-16 19:08:55 -0400 (Mon, 16 Jul 2007) | 3 lines * Give these their own files to lesson the confusion if/when we switch to real qt4 containers. ------------------------------------------------------------------------ r688815 | treat | 2007-07-16 18:25:16 -0400 (Mon, 16 Jul 2007) | 2 lines * Better errors and actually save our demo data. ------------------------------------------------------------------------ r688749 | treat | 2007-07-16 15:00:29 -0400 (Mon, 16 Jul 2007) | 2 lines * Open files from command line* Open files from command line* Open files from command line* Open files from command line* Open files from command line* Open files from command line* Open files from command line* Open files from command line ------------------------------------------------------------------------ r688735 | treat | 2007-07-16 14:20:42 -0400 (Mon, 16 Jul 2007) | 2 lines * A little saving/loading workup. ------------------------------------------------------------------------ r688697 | treat | 2007-07-16 12:48:29 -0400 (Mon, 16 Jul 2007) | 2 lines * Pass some args when needed ------------------------------------------------------------------------ r688659 | staikos | 2007-07-16 10:53:21 -0400 (Mon, 16 Jul 2007) | 3 lines Major refactoring that adds KstRelation and implements a big portion of the new Kst file format ------------------------------------------------------------------------ r683985 | treat | 2007-07-05 16:21:13 -0400 (Thu, 05 Jul 2007) | 3 lines * Just a minor change as we switch over to qmake... ------------------------------------------------------------------------ r683429 | treat | 2007-07-04 14:11:04 -0400 (Wed, 04 Jul 2007) | 2 lines * I believe all dependencies are gone ------------------------------------------------------------------------ r683352 | treat | 2007-07-04 12:25:06 -0400 (Wed, 04 Jul 2007) | 2 lines * No more kcodecs ------------------------------------------------------------------------ r683338 | treat | 2007-07-04 12:11:28 -0400 (Wed, 04 Jul 2007) | 3 lines * Not sure if this should open/close for every update, but don't leak. ------------------------------------------------------------------------ r683328 | treat | 2007-07-04 11:51:55 -0400 (Wed, 04 Jul 2007) | 2 lines * Move away from K3* ------------------------------------------------------------------------ r683302 | treat | 2007-07-04 11:05:44 -0400 (Wed, 04 Jul 2007) | 2 lines * Provide alternative to i18n for some configurations ------------------------------------------------------------------------ r683016 | treat | 2007-07-03 18:21:05 -0400 (Tue, 03 Jul 2007) | 2 lines * Get rid of bunch of static deleters ------------------------------------------------------------------------ r683007 | staikos | 2007-07-03 17:27:09 -0400 (Tue, 03 Jul 2007) | 2 lines merge psd fixes from 1.4 ------------------------------------------------------------------------ r682920 | treat | 2007-07-03 13:19:36 -0400 (Tue, 03 Jul 2007) | 2 lines * Not the right approach ------------------------------------------------------------------------ r682913 | treat | 2007-07-03 13:02:42 -0400 (Tue, 03 Jul 2007) | 2 lines * More internationalization ------------------------------------------------------------------------ r682906 | treat | 2007-07-03 12:53:01 -0400 (Tue, 03 Jul 2007) | 2 lines * international ------------------------------------------------------------------------ r682890 | treat | 2007-07-03 12:21:01 -0400 (Tue, 03 Jul 2007) | 2 lines * No more kconfig ------------------------------------------------------------------------ r682876 | treat | 2007-07-03 11:46:16 -0400 (Tue, 03 Jul 2007) | 2 lines * More removal of KConfig ------------------------------------------------------------------------ r681356 | treat | 2007-06-28 13:49:37 -0400 (Thu, 28 Jun 2007) | 2 lines * Convert to QSettings ------------------------------------------------------------------------ r681312 | treat | 2007-06-28 10:43:20 -0400 (Thu, 28 Jun 2007) | 2 lines * Cleanup ------------------------------------------------------------------------ r681061 | treat | 2007-06-27 17:03:48 -0400 (Wed, 27 Jun 2007) | 2 lines * All ascii tests are good now. ------------------------------------------------------------------------ r681046 | treat | 2007-06-27 16:22:02 -0400 (Wed, 27 Jun 2007) | 2 lines * Only one test fails for ascii now. The last one. ------------------------------------------------------------------------ r681022 | treat | 2007-06-27 14:43:18 -0400 (Wed, 27 Jun 2007) | 14 lines * Quite a big change. Start refactoring datasource plugin loading. Move ascii datasource to new style. Disable other datasources for now. Fix testrvector so that it "works" for ascii. Currently, ascii doesn't pass all the tests, but I doubt very much it has to do with the plugin changes. * I've hardcoded the plugin dir for now to use the full path on my system for easy testing. This will change of course. * DataObject plugins are down for now. ------------------------------------------------------------------------ r680250 | treat | 2007-06-25 14:28:55 -0400 (Mon, 25 Jun 2007) | 2 lines * Disable for a second while I rework a bit. ------------------------------------------------------------------------ r677389 | staikos | 2007-06-19 00:26:27 -0400 (Tue, 19 Jun 2007) | 2 lines update the TODO and fix a few quirks ------------------------------------------------------------------------ r677388 | staikos | 2007-06-19 00:10:32 -0400 (Tue, 19 Jun 2007) | 2 lines be less destructive ------------------------------------------------------------------------ r677240 | treat | 2007-06-18 14:44:13 -0400 (Mon, 18 Jun 2007) | 5 lines * Add prelim gradient editor. All items can now set a fill gradient for background. Fix up colorbutton. Fix up viewitemdialog. Other fixes. ------------------------------------------------------------------------ r677121 | treat | 2007-06-18 10:01:32 -0400 (Mon, 18 Jun 2007) | 3 lines * Clean up plotitem to use proper ::paint overload and remove extra spaces ------------------------------------------------------------------------ r677120 | treat | 2007-06-18 09:58:48 -0400 (Mon, 18 Jun 2007) | 3 lines * Clean up spaces and no reason to include non-existent moc files ------------------------------------------------------------------------ r677119 | treat | 2007-06-18 09:56:39 -0400 (Mon, 18 Jun 2007) | 3 lines * Don't include plot*.moc file in axis.cpp and clean up the extra spaces ------------------------------------------------------------------------ r677115 | treat | 2007-06-18 09:49:15 -0400 (Mon, 18 Jun 2007) | 3 lines * Please remove extra spaces and make sure to follow the coding style. ------------------------------------------------------------------------ r676960 | tskisner | 2007-06-18 01:29:44 -0400 (Mon, 18 Jun 2007) | 1 line Beggining of 2D rendering framework. Each PlotItem has a list of renderers and each renderer has a list of basecurves. Much still TODO before a working demo is available. ------------------------------------------------------------------------ r676062 | treat | 2007-06-15 17:05:06 -0400 (Fri, 15 Jun 2007) | 4 lines * Hook up the dialog. It works by operating on all selected viewitems at once and is nonmodal. ------------------------------------------------------------------------ r676043 | treat | 2007-06-15 15:31:44 -0400 (Fri, 15 Jun 2007) | 2 lines * First dialog for viewitems ------------------------------------------------------------------------ r676013 | treat | 2007-06-15 13:55:33 -0400 (Fri, 15 Jun 2007) | 2 lines * Begin with a simple widget ------------------------------------------------------------------------ r675983 | treat | 2007-06-15 12:44:16 -0400 (Fri, 15 Jun 2007) | 2 lines * Placeholder ------------------------------------------------------------------------ r675982 | treat | 2007-06-15 12:43:17 -0400 (Fri, 15 Jun 2007) | 2 lines * Move this out of the way ------------------------------------------------------------------------ r675955 | treat | 2007-06-15 11:17:00 -0400 (Fri, 15 Jun 2007) | 2 lines * Don't change mouseMode when showing the context menu ------------------------------------------------------------------------ r675751 | treat | 2007-06-14 19:49:18 -0400 (Thu, 14 Jun 2007) | 6 lines * Can not call setPen() inside paint event as QGraphicsItem calls update() within setPen(). Instead, provide an overload that items can use to draw instead of the base class rect(). ------------------------------------------------------------------------ r675692 | treat | 2007-06-14 14:33:18 -0400 (Thu, 14 Jun 2007) | 2 lines * No pen for labels, and make sure to use rect() ------------------------------------------------------------------------ r675669 | treat | 2007-06-14 13:10:04 -0400 (Thu, 14 Jun 2007) | 2 lines * Proper painting of grips when scaled < 1 ------------------------------------------------------------------------ r675646 | treat | 2007-06-14 11:45:30 -0400 (Thu, 14 Jun 2007) | 5 lines * Finally, all transformations are properly anchored no matter the current rotation or translation of the actual rect object. ------------------------------------------------------------------------ r675086 | treat | 2007-06-13 13:55:06 -0400 (Wed, 13 Jun 2007) | 2 lines * Better ------------------------------------------------------------------------ r674740 | treat | 2007-06-12 18:45:17 -0400 (Tue, 12 Jun 2007) | 2 lines * Better ------------------------------------------------------------------------ r674666 | treat | 2007-06-12 15:50:55 -0400 (Tue, 12 Jun 2007) | 7 lines * Huge change. The ViewItems now behave like items in inkscape for the most part. Still have some problems with resize transformations when a rotation has already been applied. The grips are also not always drawn correctly yet. ------------------------------------------------------------------------ r674189 | tskisner | 2007-06-11 19:01:24 -0400 (Mon, 11 Jun 2007) | 1 line whoops. set path to configure modules relative to top-level portto4 directory. ------------------------------------------------------------------------ r674008 | tskisner | 2007-06-11 11:27:46 -0400 (Mon, 11 Jun 2007) | 1 line Add some updates to the FITS utility library. This code is not enabled yet in the build because it is not fully ported to Qt4 yet. ------------------------------------------------------------------------ r673341 | tskisner | 2007-06-09 19:44:25 -0400 (Sat, 09 Jun 2007) | 1 line Begin the porting of configure checks to the cmake build system. Follow the standard practices for location and naming of files. This initial commit finds the CFITSIO library. More coming soon. ------------------------------------------------------------------------ r673335 | treat | 2007-06-09 18:55:17 -0400 (Sat, 09 Jun 2007) | 3 lines * This is correct. Draw the selection like inkscape does with the true real bounding rect. ------------------------------------------------------------------------ r673087 | treat | 2007-06-08 19:23:49 -0400 (Fri, 08 Jun 2007) | 3 lines * This seems to work better. ------------------------------------------------------------------------ r673082 | treat | 2007-06-08 19:02:18 -0400 (Fri, 08 Jun 2007) | 5 lines * Turn on debugging as I'm having a problem with the drawing the true boundingRect. Possibly a bug with mapToScene()?? ------------------------------------------------------------------------ r673076 | treat | 2007-06-08 18:28:30 -0400 (Fri, 08 Jun 2007) | 3 lines * Much better. We're going to draw our selection ourselves I think... ------------------------------------------------------------------------ r673059 | treat | 2007-06-08 17:14:16 -0400 (Fri, 08 Jun 2007) | 2 lines * Make rotate commands for undo/redo ------------------------------------------------------------------------ r673041 | treat | 2007-06-08 16:37:29 -0400 (Fri, 08 Jun 2007) | 3 lines * Introduce a mouse based rotation mode.. Need proper cursors for this still... ------------------------------------------------------------------------ r672992 | treat | 2007-06-08 13:42:51 -0400 (Fri, 08 Jun 2007) | 2 lines * Compress ResizeCommands and debuggify them ------------------------------------------------------------------------ r672956 | treat | 2007-06-08 10:55:59 -0400 (Fri, 08 Jun 2007) | 4 lines * Big refactor and fix for resizing undo/redo commands. ------------------------------------------------------------------------ r672713 | treat | 2007-06-07 18:21:02 -0400 (Thu, 07 Jun 2007) | 3 lines * This still isn't right, but resizing will also become an undo/redo command ------------------------------------------------------------------------ r672704 | treat | 2007-06-07 18:03:12 -0400 (Thu, 07 Jun 2007) | 2 lines * Makes more sense ------------------------------------------------------------------------ r672694 | treat | 2007-06-07 17:16:19 -0400 (Thu, 07 Jun 2007) | 3 lines * Fix the boundingRect for label items * Don't grab the mouse in creation mode ------------------------------------------------------------------------ r672672 | treat | 2007-06-07 16:31:34 -0400 (Thu, 07 Jun 2007) | 2 lines * Better debug and correct calls ------------------------------------------------------------------------ r672659 | treat | 2007-06-07 16:03:59 -0400 (Thu, 07 Jun 2007) | 3 lines * Actually scale VS resizing. Check out what this does to our labels :) ------------------------------------------------------------------------ r672653 | treat | 2007-06-07 15:20:57 -0400 (Thu, 07 Jun 2007) | 4 lines * Resizing of items via mouse grab now works. Need to figure out how were' going to do this for lines and labels though. ------------------------------------------------------------------------ r672636 | treat | 2007-06-07 14:41:15 -0400 (Thu, 07 Jun 2007) | 2 lines * Post some cursors for resizing ------------------------------------------------------------------------ r672625 | treat | 2007-06-07 13:56:27 -0400 (Thu, 07 Jun 2007) | 2 lines * Consolidate and refactor some of this ------------------------------------------------------------------------ r672618 | treat | 2007-06-07 13:25:36 -0400 (Thu, 07 Jun 2007) | 3 lines * Provide a context menu and three new item based actions/commands: remove, z-order up, z-order down ------------------------------------------------------------------------ r672591 | treat | 2007-06-07 11:48:15 -0400 (Thu, 07 Jun 2007) | 2 lines * Move most of this into base class ------------------------------------------------------------------------ r672570 | treat | 2007-06-07 11:00:43 -0400 (Thu, 07 Jun 2007) | 2 lines * Move ------------------------------------------------------------------------ r672568 | treat | 2007-06-07 10:52:42 -0400 (Thu, 07 Jun 2007) | 2 lines * Move to the base class ------------------------------------------------------------------------ r672564 | treat | 2007-06-07 10:42:12 -0400 (Thu, 07 Jun 2007) | 2 lines * All are rect items ------------------------------------------------------------------------ r672559 | treat | 2007-06-07 10:30:32 -0400 (Thu, 07 Jun 2007) | 2 lines * Convert items to common qgv base class ------------------------------------------------------------------------ r672300 | treat | 2007-06-06 13:31:25 -0400 (Wed, 06 Jun 2007) | 2 lines * Add an svg item ------------------------------------------------------------------------ r672288 | treat | 2007-06-06 12:52:46 -0400 (Wed, 06 Jun 2007) | 2 lines * QGLWidget is not degrading gracefully here... ------------------------------------------------------------------------ r672247 | treat | 2007-06-06 10:30:17 -0400 (Wed, 06 Jun 2007) | 3 lines * Movement commands for all items are done, compression is enabled and macro commands for selection moves completed. ------------------------------------------------------------------------ r671846 | treat | 2007-06-05 12:01:11 -0400 (Tue, 05 Jun 2007) | 3 lines * Fix up the label item so it can move, select, etc, etc ------------------------------------------------------------------------ r671775 | treat | 2007-06-05 10:17:27 -0400 (Tue, 05 Jun 2007) | 2 lines * Couple strays ------------------------------------------------------------------------ r671216 | staikos | 2007-06-04 03:08:16 -0400 (Mon, 04 Jun 2007) | 11 lines A huge pile of work. Not sure I'll be able to capture everything: 1) Remove C plugins entirely 2) Add factories for loading objects from xml 3) Implement a demo of the new XML spec (reading) 4) Support a few graphics nodes for reading 5) Implement skeleton of writing xml 6) Some general refactoring and cleanup 7) Add some missing actions / shortcuts 8) Start to spec out how plot might work ------------------------------------------------------------------------ r671215 | staikos | 2007-06-04 03:04:53 -0400 (Mon, 04 Jun 2007) | 2 lines The beginnings of some design specs or at least statements ------------------------------------------------------------------------ r670303 | staikos | 2007-05-31 20:35:50 -0400 (Thu, 31 May 2007) | 4 lines add an object factory that can be used to make objects independent of the document. However it only works for data objects. I don't want to go too far with this until the .kst file structure is finalized ------------------------------------------------------------------------ r670296 | staikos | 2007-05-31 20:16:24 -0400 (Thu, 31 May 2007) | 2 lines some state tracking for Document ------------------------------------------------------------------------ r670240 | staikos | 2007-05-31 16:24:22 -0400 (Thu, 31 May 2007) | 3 lines hook in xml stream reader, which does basically nothing. next step is to make a factory for generating document nodes from the xml nodes. ------------------------------------------------------------------------ r670233 | staikos | 2007-05-31 16:04:19 -0400 (Thu, 31 May 2007) | 2 lines port to trunk ------------------------------------------------------------------------ r670232 | staikos | 2007-05-31 16:02:33 -0400 (Thu, 31 May 2007) | 2 lines port to trunk ------------------------------------------------------------------------ r670230 | staikos | 2007-05-31 16:00:25 -0400 (Thu, 31 May 2007) | 3 lines updated to build with trunk. extdate is dead ------------------------------------------------------------------------ r670228 | staikos | 2007-05-31 15:48:44 -0400 (Thu, 31 May 2007) | 2 lines match changes in kdelibs trunk ------------------------------------------------------------------------ r670176 | staikos | 2007-05-31 11:40:01 -0400 (Thu, 31 May 2007) | 2 lines hook in more of the debug dialog ------------------------------------------------------------------------ r670174 | staikos | 2007-05-31 11:24:49 -0400 (Thu, 31 May 2007) | 2 lines cleanup ------------------------------------------------------------------------ r670014 | staikos | 2007-05-30 23:00:44 -0400 (Wed, 30 May 2007) | 2 lines stub out the debug dialog and connect the notifier to it. ------------------------------------------------------------------------ r670008 | staikos | 2007-05-30 22:12:57 -0400 (Wed, 30 May 2007) | 2 lines hook in the debug notifier (needs a signal connection and pixmaps) ------------------------------------------------------------------------ r670006 | staikos | 2007-05-30 22:00:39 -0400 (Wed, 30 May 2007) | 2 lines add a stub export graphics dialog ------------------------------------------------------------------------ r669890 | staikos | 2007-05-30 14:14:10 -0400 (Wed, 30 May 2007) | 2 lines start to clean this up so it can be activated ------------------------------------------------------------------------ r669887 | staikos | 2007-05-30 14:03:43 -0400 (Wed, 30 May 2007) | 2 lines start to implement printing support ------------------------------------------------------------------------ r669876 | staikos | 2007-05-30 13:22:07 -0400 (Wed, 30 May 2007) | 2 lines Add in the memory free widget and a progress bar ------------------------------------------------------------------------ r669867 | staikos | 2007-05-30 12:58:01 -0400 (Wed, 30 May 2007) | 4 lines - hack the label into the right place for now - give plots a solid background (white for now) ------------------------------------------------------------------------ r669862 | staikos | 2007-05-30 12:44:58 -0400 (Wed, 30 May 2007) | 5 lines make labelitem a rectitem so that it can use the label renderer. Hook in the label renderer in a very primitive manner - it works! - but it looks ugly. This is also a bit slow, but it shows that compositing works. ------------------------------------------------------------------------ r669741 | staikos | 2007-05-30 04:48:55 -0400 (Wed, 30 May 2007) | 2 lines display slave vectors, more info ------------------------------------------------------------------------ r669732 | treat | 2007-05-30 03:52:44 -0400 (Wed, 30 May 2007) | 2 lines * Probably a better way, but this works for now ------------------------------------------------------------------------ r669725 | staikos | 2007-05-30 02:54:45 -0400 (Wed, 30 May 2007) | 2 lines add a more generic vector editor/spreadsheet mode dialog ------------------------------------------------------------------------ r669724 | staikos | 2007-05-30 02:54:04 -0400 (Wed, 30 May 2007) | 5 lines more checks and cleanup, and add a copy constructor to indicate where Kst will crash due to shallow copy of pointers. This is really nasty and took hours to track down. It may also affect trunk, but I don't know of any place doing this particular thing in trunk. ------------------------------------------------------------------------ r669714 | staikos | 2007-05-30 02:13:04 -0400 (Wed, 30 May 2007) | 2 lines fix debug ------------------------------------------------------------------------ r669711 | staikos | 2007-05-30 01:59:48 -0400 (Wed, 30 May 2007) | 2 lines cleanup debug and reduce lookups a bit ------------------------------------------------------------------------ r669676 | staikos | 2007-05-29 21:26:07 -0400 (Tue, 29 May 2007) | 3 lines add a most excellent hack to make iteration work transparently on KstObjectCollection. :-) ------------------------------------------------------------------------ r669638 | staikos | 2007-05-29 17:39:11 -0400 (Tue, 29 May 2007) | 3 lines it's a bit buggy but it shows how the data manager can work - populates with objects ------------------------------------------------------------------------ r669631 | staikos | 2007-05-29 17:05:49 -0400 (Tue, 29 May 2007) | 2 lines add the hook for creating plots ------------------------------------------------------------------------ r669564 | staikos | 2007-05-29 13:58:32 -0400 (Tue, 29 May 2007) | 3 lines A basic plan on some things that need to be done and how they should be done, in very brief point form ------------------------------------------------------------------------ r669556 | staikos | 2007-05-29 13:26:33 -0400 (Tue, 29 May 2007) | 2 lines add an untested matrix model class ------------------------------------------------------------------------ r669554 | staikos | 2007-05-29 13:25:45 -0400 (Tue, 29 May 2007) | 2 lines repair the api ------------------------------------------------------------------------ r669552 | staikos | 2007-05-29 13:11:40 -0400 (Tue, 29 May 2007) | 2 lines add picture support ------------------------------------------------------------------------ r669542 | staikos | 2007-05-29 12:25:45 -0400 (Tue, 29 May 2007) | 3 lines stub out Document, SessionModel, DataManager, though DataManager is actually so trivial with this object structure that it's almost done. ------------------------------------------------------------------------ r669518 | staikos | 2007-05-29 11:31:30 -0400 (Tue, 29 May 2007) | 2 lines make editable vectors bold ------------------------------------------------------------------------ r669513 | staikos | 2007-05-29 11:19:10 -0400 (Tue, 29 May 2007) | 2 lines demonstrate editable spreadsheet mode ------------------------------------------------------------------------ r669495 | staikos | 2007-05-29 10:41:15 -0400 (Tue, 29 May 2007) | 2 lines from the confusing department, this did "init", not "reinit". Let's call it that ------------------------------------------------------------------------ r669234 | staikos | 2007-05-28 16:26:00 -0400 (Mon, 28 May 2007) | 2 lines hook in the context menu for tabs ------------------------------------------------------------------------ r669224 | staikos | 2007-05-28 16:06:04 -0400 (Mon, 28 May 2007) | 2 lines add multi-tab support, more actions that do nothing. ------------------------------------------------------------------------ r669220 | staikos | 2007-05-28 15:55:39 -0400 (Mon, 28 May 2007) | 3 lines separate the tab widget out of the main window and make the naming more consistent ------------------------------------------------------------------------ r669201 | staikos | 2007-05-28 15:05:46 -0400 (Mon, 28 May 2007) | 2 lines add a vector table model as a table of vector models ------------------------------------------------------------------------ r669188 | staikos | 2007-05-28 14:38:16 -0400 (Mon, 28 May 2007) | 2 lines add a demo of OpenGL along with a settings class for global app settings ------------------------------------------------------------------------ r669180 | staikos | 2007-05-28 14:08:59 -0400 (Mon, 28 May 2007) | 2 lines demonstrate how fast we can load and display a million points ------------------------------------------------------------------------ r669172 | staikos | 2007-05-28 13:55:45 -0400 (Mon, 28 May 2007) | 2 lines missing const ------------------------------------------------------------------------ r669168 | staikos | 2007-05-28 13:41:29 -0400 (Mon, 28 May 2007) | 2 lines rename file accordingly ------------------------------------------------------------------------ r669167 | staikos | 2007-05-28 13:40:00 -0400 (Mon, 28 May 2007) | 2 lines namespace ------------------------------------------------------------------------ r669164 | staikos | 2007-05-28 13:37:09 -0400 (Mon, 28 May 2007) | 2 lines add ellipse items ------------------------------------------------------------------------ r669161 | staikos | 2007-05-28 13:29:08 -0400 (Mon, 28 May 2007) | 2 lines add box items ------------------------------------------------------------------------ r669150 | staikos | 2007-05-28 12:42:30 -0400 (Mon, 28 May 2007) | 2 lines more refactoring ------------------------------------------------------------------------ r669146 | staikos | 2007-05-28 12:32:23 -0400 (Mon, 28 May 2007) | 2 lines more refactoring ------------------------------------------------------------------------ r669142 | staikos | 2007-05-28 12:19:19 -0400 (Mon, 28 May 2007) | 2 lines completely refactor, start namespacing. more to come. ------------------------------------------------------------------------ r668439 | treat | 2007-05-26 08:43:58 -0400 (Sat, 26 May 2007) | 2 lines * Update ------------------------------------------------------------------------ r668438 | treat | 2007-05-26 08:43:29 -0400 (Sat, 26 May 2007) | 2 lines * Set drag mode and TODO updates ------------------------------------------------------------------------ r668436 | treat | 2007-05-26 08:35:27 -0400 (Sat, 26 May 2007) | 5 lines * Undo/Redo for QGraphicsScene move interaction at least for the label. Right now it is too greedy as it produces an undocommand for each slight movement. ------------------------------------------------------------------------ r668339 | treat | 2007-05-25 22:48:27 -0400 (Fri, 25 May 2007) | 2 lines * Use proper cursors ------------------------------------------------------------------------ r668338 | treat | 2007-05-25 22:37:52 -0400 (Fri, 25 May 2007) | 2 lines * Create label properly by choosing a spot first ------------------------------------------------------------------------ r668329 | treat | 2007-05-25 20:11:59 -0400 (Fri, 25 May 2007) | 5 lines * Initialize the scene rect to the size of whatever the view is when it is first shown. Not sure if this is what we really want. ------------------------------------------------------------------------ r668321 | treat | 2007-05-25 19:30:56 -0400 (Fri, 25 May 2007) | 4 lines * Visual debug for geometry problems * Don't scale individual items... scale the scene instead when view is resized ------------------------------------------------------------------------ r668308 | treat | 2007-05-25 18:22:18 -0400 (Fri, 25 May 2007) | 6 lines * Allow for creation interrupt/abort. Still not happy with this as we have to allocate all creation commands on the heap and there is a somewhat confusing signal/slot tree going on... ------------------------------------------------------------------------ r668288 | treat | 2007-05-25 16:44:34 -0400 (Fri, 25 May 2007) | 2 lines * Fix up preserve aspect ratio a bit ------------------------------------------------------------------------ r668263 | treat | 2007-05-25 14:54:50 -0400 (Fri, 25 May 2007) | 2 lines * Employ a new strategy for drawing item creation ------------------------------------------------------------------------ r668248 | treat | 2007-05-25 12:53:36 -0400 (Fri, 25 May 2007) | 2 lines * Get ready to draw various creation modes ------------------------------------------------------------------------ r668244 | treat | 2007-05-25 12:17:58 -0400 (Fri, 25 May 2007) | 2 lines * Don't disconnect ALL signals ;) ------------------------------------------------------------------------ r668120 | staikos | 2007-05-25 02:22:58 -0400 (Fri, 25 May 2007) | 3 lines adding some interaction and aspect ratio support, though for some reason my slot never gets called ------------------------------------------------------------------------ r668103 | treat | 2007-05-25 00:58:37 -0400 (Fri, 25 May 2007) | 2 lines * Scratch pad ------------------------------------------------------------------------ r668102 | treat | 2007-05-25 00:52:59 -0400 (Fri, 25 May 2007) | 2 lines * SOVERSION = 2 ------------------------------------------------------------------------ r668100 | treat | 2007-05-25 00:33:23 -0400 (Fri, 25 May 2007) | 2 lines * Look nice for now ------------------------------------------------------------------------ r668099 | treat | 2007-05-25 00:30:47 -0400 (Fri, 25 May 2007) | 2 lines * Z-Value fixes and resize scene along with view ------------------------------------------------------------------------ r668094 | treat | 2007-05-24 23:32:16 -0400 (Thu, 24 May 2007) | 2 lines * Add some lines ------------------------------------------------------------------------ r668087 | treat | 2007-05-24 22:55:25 -0400 (Thu, 24 May 2007) | 3 lines * Setup for various item creation commands ------------------------------------------------------------------------ r668062 | treat | 2007-05-24 19:33:00 -0400 (Thu, 24 May 2007) | 2 lines * Undo and redo for the label command works. ------------------------------------------------------------------------ r668061 | treat | 2007-05-24 19:19:44 -0400 (Thu, 24 May 2007) | 2 lines * Create label command and object ------------------------------------------------------------------------ r668038 | treat | 2007-05-24 17:20:59 -0400 (Thu, 24 May 2007) | 2 lines * Break out ------------------------------------------------------------------------ r668031 | treat | 2007-05-24 16:51:01 -0400 (Thu, 24 May 2007) | 2 lines * Begin label command test design ------------------------------------------------------------------------ r668024 | treat | 2007-05-24 16:08:02 -0400 (Thu, 24 May 2007) | 2 lines * Move over ------------------------------------------------------------------------ r668023 | treat | 2007-05-24 16:05:44 -0400 (Thu, 24 May 2007) | 2 lines * Stub out items ------------------------------------------------------------------------ r667988 | treat | 2007-05-24 13:33:36 -0400 (Thu, 24 May 2007) | 2 lines * Default to current plotview ------------------------------------------------------------------------ r667984 | treat | 2007-05-24 13:24:58 -0400 (Thu, 24 May 2007) | 2 lines * Deletion order is important ------------------------------------------------------------------------ r667983 | treat | 2007-05-24 13:23:22 -0400 (Thu, 24 May 2007) | 2 lines * Work on command pattern ------------------------------------------------------------------------ r667794 | treat | 2007-05-23 19:40:52 -0400 (Wed, 23 May 2007) | 1 line ------------------------------------------------------------------------ r667792 | treat | 2007-05-23 19:35:21 -0400 (Wed, 23 May 2007) | 2 lines * Some stubbed files ------------------------------------------------------------------------ r667775 | treat | 2007-05-23 18:31:00 -0400 (Wed, 23 May 2007) | 2 lines * More placeholders ------------------------------------------------------------------------ r667753 | treat | 2007-05-23 16:56:07 -0400 (Wed, 23 May 2007) | 2 lines * Placeholder ------------------------------------------------------------------------ r667752 | treat | 2007-05-23 16:54:35 -0400 (Wed, 23 May 2007) | 2 lines * Placeholder ------------------------------------------------------------------------ r667751 | treat | 2007-05-23 16:52:27 -0400 (Wed, 23 May 2007) | 2 lines * Out of the way ------------------------------------------------------------------------ r667749 | treat | 2007-05-23 16:42:45 -0400 (Wed, 23 May 2007) | 2 lines * Move out of the way ------------------------------------------------------------------------ r642908 | treat | 2007-03-15 16:03:08 -0400 (Thu, 15 Mar 2007) | 3 lines * The waitcondition will take care of unlocking for us. ------------------------------------------------------------------------ r642854 | treat | 2007-03-15 12:11:38 -0400 (Thu, 15 Mar 2007) | 2 lines * Fix up connections ------------------------------------------------------------------------ r642848 | treat | 2007-03-15 11:44:34 -0400 (Thu, 15 Mar 2007) | 2 lines * No more crashing on close ------------------------------------------------------------------------ r642840 | treat | 2007-03-15 11:23:50 -0400 (Thu, 15 Mar 2007) | 2 lines * Install some icons ------------------------------------------------------------------------ r642732 | mlaurent | 2007-03-15 05:37:09 -0400 (Thu, 15 Mar 2007) | 2 lines Use cmake variable ------------------------------------------------------------------------ r642653 | treat | 2007-03-14 19:48:45 -0400 (Wed, 14 Mar 2007) | 2 lines * Bring back the actions ------------------------------------------------------------------------ r642635 | treat | 2007-03-14 18:36:18 -0400 (Wed, 14 Mar 2007) | 4 lines * Presenting Kst 1.99 extreme alpha: http://img358.imageshack.us/my.php?image=kst19extremealphano4.png ------------------------------------------------------------------------ r642607 | treat | 2007-03-14 16:35:00 -0400 (Wed, 14 Mar 2007) | 2 lines * This is a dialog ------------------------------------------------------------------------ r642606 | treat | 2007-03-14 16:29:33 -0400 (Wed, 14 Mar 2007) | 2 lines * Make sure to call setupUi ------------------------------------------------------------------------ r642594 | treat | 2007-03-14 15:37:23 -0400 (Wed, 14 Mar 2007) | 4 lines * Another missed export and a little cmake trickery and kst successfully compiles and links. We have an actual executable :) ------------------------------------------------------------------------ r642590 | treat | 2007-03-14 15:16:02 -0400 (Wed, 14 Mar 2007) | 2 lines * Main now compiles. ------------------------------------------------------------------------ r642585 | treat | 2007-03-14 14:55:16 -0400 (Wed, 14 Mar 2007) | 2 lines * libkstapp links! ------------------------------------------------------------------------ r642584 | treat | 2007-03-14 14:54:00 -0400 (Wed, 14 Mar 2007) | 2 lines * export ------------------------------------------------------------------------ r642582 | treat | 2007-03-14 14:43:10 -0400 (Wed, 14 Mar 2007) | 3 lines * Disable the plugindialog and old plugins, fix ui files, and make it compile. ------------------------------------------------------------------------ r642581 | treat | 2007-03-14 14:42:28 -0400 (Wed, 14 Mar 2007) | 2 lines * export ------------------------------------------------------------------------ r642580 | treat | 2007-03-14 14:41:43 -0400 (Wed, 14 Mar 2007) | 2 lines * Export ------------------------------------------------------------------------ r642316 | treat | 2007-03-13 18:58:05 -0400 (Tue, 13 Mar 2007) | 2 lines * Finally, libkstapp compiles. Next up, linking. ------------------------------------------------------------------------ r642224 | treat | 2007-03-13 13:49:00 -0400 (Tue, 13 Mar 2007) | 2 lines * Everything compiles now except kst.cpp... ------------------------------------------------------------------------ r642213 | treat | 2007-03-13 13:02:47 -0400 (Tue, 13 Mar 2007) | 2 lines * More porting ------------------------------------------------------------------------ r641967 | treat | 2007-03-12 19:34:46 -0400 (Mon, 12 Mar 2007) | 2 lines * Closer and closer ------------------------------------------------------------------------ r641949 | treat | 2007-03-12 18:29:19 -0400 (Mon, 12 Mar 2007) | 2 lines * Finally. All dialogs compile. Don't ask me if they work ;) ------------------------------------------------------------------------ r641881 | treat | 2007-03-12 15:58:51 -0400 (Mon, 12 Mar 2007) | 2 lines * More porting ------------------------------------------------------------------------ r641079 | treat | 2007-03-09 18:08:02 -0500 (Fri, 09 Mar 2007) | 2 lines * More port ------------------------------------------------------------------------ r641068 | treat | 2007-03-09 16:35:53 -0500 (Fri, 09 Mar 2007) | 2 lines * More porting ------------------------------------------------------------------------ r640437 | treat | 2007-03-07 20:18:30 -0500 (Wed, 07 Mar 2007) | 2 lines * Some more ------------------------------------------------------------------------ r640414 | treat | 2007-03-07 18:07:48 -0500 (Wed, 07 Mar 2007) | 2 lines * Lots of porting ------------------------------------------------------------------------ r640378 | treat | 2007-03-07 15:22:04 -0500 (Wed, 07 Mar 2007) | 2 lines * More porting ------------------------------------------------------------------------ r640357 | treat | 2007-03-07 13:56:53 -0500 (Wed, 07 Mar 2007) | 2 lines * Correct inheritance structure ------------------------------------------------------------------------ r640351 | treat | 2007-03-07 13:25:30 -0500 (Wed, 07 Mar 2007) | 2 lines * More porting ------------------------------------------------------------------------ r640345 | treat | 2007-03-07 12:53:03 -0500 (Wed, 07 Mar 2007) | 2 lines * Hate how designer handles this ------------------------------------------------------------------------ r639754 | treat | 2007-03-05 17:35:24 -0500 (Mon, 05 Mar 2007) | 7 lines * URL -> Url * Make some of the dialogs actually inherit QDialog * QWidget, QProgressBar, QStatusBar api changes * No more KProgress * QCoreApplication API changes * Begin DCOP -> DBus ------------------------------------------------------------------------ r639727 | treat | 2007-03-05 16:06:16 -0500 (Mon, 05 Mar 2007) | 2 lines * Revert and fix ------------------------------------------------------------------------ r639711 | treat | 2007-03-05 14:57:51 -0500 (Mon, 05 Mar 2007) | 4 lines * QListView -> Q3ListView * Port various props in ui files * fixes ------------------------------------------------------------------------ r639706 | treat | 2007-03-05 14:40:42 -0500 (Mon, 05 Mar 2007) | 5 lines * setRasterOp -> setCompositionMode * eliminate dead headers * KListView* K3ListView * add customwidget tags to *4.ui files that needed it ------------------------------------------------------------------------ r638650 | treat | 2007-03-02 14:50:04 -0500 (Fri, 02 Mar 2007) | 2 lines * Oopsies ------------------------------------------------------------------------ r638647 | treat | 2007-03-02 14:42:04 -0500 (Fri, 02 Mar 2007) | 2 lines * Less ctor params ------------------------------------------------------------------------ r638637 | treat | 2007-03-02 14:19:11 -0500 (Fri, 02 Mar 2007) | 2 lines * Bits ------------------------------------------------------------------------ r638621 | treat | 2007-03-02 13:39:43 -0500 (Fri, 02 Mar 2007) | 4 lines * Missing header * Bunch of QMenu related api changes * kst2dplot now compiles excepting the KMdi mess... woohoo! ------------------------------------------------------------------------ r638614 | treat | 2007-03-02 12:56:20 -0500 (Fri, 02 Mar 2007) | 2 lines * QWheelEvent no longer supplies keyboard modifier info either ------------------------------------------------------------------------ r638612 | treat | 2007-03-02 12:51:25 -0500 (Fri, 02 Mar 2007) | 2 lines * Some updates ------------------------------------------------------------------------ r638611 | treat | 2007-03-02 12:49:41 -0500 (Fri, 02 Mar 2007) | 4 lines * QMouseEvent doesn't deliver information on keyboard modifiers anymore. Not sure how to easily port so just comment out and note in PORTINGTODO. ------------------------------------------------------------------------ r638610 | treat | 2007-03-02 12:43:14 -0500 (Fri, 02 Mar 2007) | 3 lines * i18n changes * QPainter::drawWinFocusRect is no more... ------------------------------------------------------------------------ r638604 | treat | 2007-03-02 11:55:43 -0500 (Fri, 02 Mar 2007) | 5 lines * No more QPixmap::resize() * QStringList::findIndex - QStringList::indexOf * No more CoordinateMode * QClipboard->set*Mime*Data ------------------------------------------------------------------------ r638602 | treat | 2007-03-02 11:37:15 -0500 (Fri, 02 Mar 2007) | 6 lines * RasterOp -> CompositionMode CopyROP = CompositionMode_Source XorROP = CompositionMode_Xor NotROP = CompositionMode_Destination SetROP = CompositionMode_Source ------------------------------------------------------------------------ r638432 | treat | 2007-03-01 18:01:17 -0500 (Thu, 01 Mar 2007) | 2 lines * Various bits ------------------------------------------------------------------------ r638429 | treat | 2007-03-01 17:50:21 -0500 (Thu, 01 Mar 2007) | 2 lines * QRect and QString api changes ------------------------------------------------------------------------ r638422 | treat | 2007-03-01 17:31:57 -0500 (Thu, 01 Mar 2007) | 2 lines * KPopupMenu is no longer ------------------------------------------------------------------------ r638421 | treat | 2007-03-01 17:30:01 -0500 (Thu, 01 Mar 2007) | 2 lines * ascii -> toAscii, QList api bit, stuff ------------------------------------------------------------------------ r638415 | treat | 2007-03-01 17:06:20 -0500 (Thu, 01 Mar 2007) | 3 lines * KFontCombo -> QFontComboBox * KDualColorButton is no longer... ------------------------------------------------------------------------ r638414 | treat | 2007-03-01 16:51:49 -0500 (Thu, 01 Mar 2007) | 2 lines * KService changes ------------------------------------------------------------------------ r638398 | treat | 2007-03-01 15:20:58 -0500 (Thu, 01 Mar 2007) | 2 lines QMap::Iterator data -> value ------------------------------------------------------------------------ r638383 | treat | 2007-03-01 14:32:51 -0500 (Thu, 01 Mar 2007) | 4 lines * Remove needless include * ksdebug -> qdebug * KConfig ctor fixes ------------------------------------------------------------------------ r638382 | treat | 2007-03-01 14:24:33 -0500 (Thu, 01 Mar 2007) | 3 lines * Fix header, fix QByteArray bits, fix Q_EXPORT -> Q_CORE_EXPORT and use a typedef to temporarily get away from KMdi ------------------------------------------------------------------------ r638380 | treat | 2007-03-01 14:01:56 -0500 (Thu, 01 Mar 2007) | 3 lines * Q3GridLayout -> QGridLayout... ------------------------------------------------------------------------ r638371 | treat | 2007-03-01 13:42:42 -0500 (Thu, 01 Mar 2007) | 3 lines * QStringList::split -> QString::split * Q3TextStream -> QTextStream ------------------------------------------------------------------------ r638370 | treat | 2007-03-01 13:33:55 -0500 (Thu, 01 Mar 2007) | 2 lines * Missed these latin1 -> toLatin1 ------------------------------------------------------------------------ r638366 | treat | 2007-03-01 13:22:49 -0500 (Thu, 01 Mar 2007) | 2 lines * kMin/kMax -> qMin/qMax ------------------------------------------------------------------------ r638361 | treat | 2007-03-01 13:04:32 -0500 (Thu, 01 Mar 2007) | 3 lines * Move a bunch of decl/impl from ui files to actual files now that ui files no longer support them. ------------------------------------------------------------------------ r638190 | treat | 2007-02-28 21:26:45 -0500 (Wed, 28 Feb 2007) | 2 lines * Some easy stuff like latin1 - toLatin1 etc,... ------------------------------------------------------------------------ r638188 | treat | 2007-02-28 21:01:31 -0500 (Wed, 28 Feb 2007) | 2 lines * The ui files seem to be ok now ------------------------------------------------------------------------ r638181 | treat | 2007-02-28 19:56:41 -0500 (Wed, 28 Feb 2007) | 3 lines * Q3ButtonGroup is incompatible with QGridLayout and besides it can be safely replaced with QGroupBox in Qt4 ------------------------------------------------------------------------ r638177 | treat | 2007-02-28 19:45:47 -0500 (Wed, 28 Feb 2007) | 4 lines * Mostly porting of various problems in ui files KURLRequester -> KUrlRequester for instance. * Also cleanup includes in ui files. ------------------------------------------------------------------------ r638174 | treat | 2007-02-28 19:39:36 -0500 (Wed, 28 Feb 2007) | 2 lines * Argh, designer now wants all classes to match file names... ------------------------------------------------------------------------ r638171 | treat | 2007-02-28 19:32:37 -0500 (Wed, 28 Feb 2007) | 2 lines * Rename as other ui files are choking on it ------------------------------------------------------------------------ r638167 | treat | 2007-02-28 19:18:23 -0500 (Wed, 28 Feb 2007) | 3 lines * Clean up the ui files by eliminating unnecessary includes. ------------------------------------------------------------------------ r638146 | treat | 2007-02-28 18:34:13 -0500 (Wed, 28 Feb 2007) | 2 lines * New names ------------------------------------------------------------------------ r638144 | treat | 2007-02-28 18:22:53 -0500 (Wed, 28 Feb 2007) | 3 lines * Missed some converted ui files apparently. * Clean up the cmake list so I can see where things are. ------------------------------------------------------------------------ r638140 | treat | 2007-02-28 18:00:30 -0500 (Wed, 28 Feb 2007) | 7 lines * Tons of stuff going on here. I've run uic3 convert on remaining ui files and renamed them along with their implementation files to better keep track of them. I've run qt3to4 convert on all of the subsequent .cpp and .h files. Here we go... ------------------------------------------------------------------------ r638106 | treat | 2007-02-28 16:07:19 -0500 (Wed, 28 Feb 2007) | 29 lines * Begin port of libkstapp to Qt4. Starting with some ui file conversion and ui.h file conversion. uic3 -convert vectorsavedialog.ui > vectorsavedialog4.ui uic3: flag 'WordBreak' for widget 'QLabel' is not supported uic3 -convert kstsettingsdlg.ui > kstsettingsdlg4.ui uic3: slot `sourceChanged(QString)' for widget `KstSettingsDlg' of type `QDialog' is not supported; connection may fail. Line: 1332 Column: 16 uic3: slot `updateTimezone(double)' for widget `KstSettingsDlg' of type `QDialog' is not supported; connection may fail. Line: 1476 Column: 16 uic3 -convert viewlegendwidget.ui > viewlegendwidget4.ui uic3 -convert pluginmanager.ui > pluginmanager4.uiuic3: slot `selectionChanged(Q3ListViewItem*)' for widget `PluginManager' of type `QDialog' is not supported; connection may fail. Line: 173 Column: 16 uic3 -convert datasourcemetadatadialog.ui > datasourcemetadatadialog4.ui uic3: slot `updateMetadata(QString)' for widget `DataSourceMetaDataDialog' of type `QDialog' is not supported; connection may fail. Line: 114 Column: 16 uic3 -convert datawizard.ui > datawizard4.ui uic3: flag 'WordBreak' for widget 'QLabel' is not supported uic3: property `hidden' for widget `_testURL' of type `QPushButton' is not supported. Line: 167 Column: 48 uic3: property `margin' for widget `buttonGroup1' of type `Q3ButtonGroup' is not supported. Line: 980 Column: 60 uic3: enumerator 'NoFrame' for widget 'Q3ButtonGroup' is not supported uic3 -convert viewlabelwidget.ui > viewlabelwidget4.ui uic3 -convert extensiondlg.ui > extensiondlg4.ui uic3 -convert view2dplotwidget.ui > view2dplotwidget4.ui uic3 -convert debugdialog.ui > debugdialog4.ui uic3 -convert kstdatadialog.ui > kstdatadialog4.ui ------------------------------------------------------------------------ r638063 | treat | 2007-02-28 13:16:15 -0500 (Wed, 28 Feb 2007) | 4 lines * All widgets display in designer now although not all correctly. Missing pixmaps and some of the ui file conversions were less than perfect. ------------------------------------------------------------------------ r638039 | treat | 2007-02-28 11:59:15 -0500 (Wed, 28 Feb 2007) | 5 lines * Do the rest of the widget plugins for designer. Some crash designer as they still require bits from Kst libs which require bits from KDE libs and therefore should be KComponentData'ized. Or something. ------------------------------------------------------------------------ r638026 | pino | 2007-02-28 10:51:41 -0500 (Wed, 28 Feb 2007) | 2 lines QT -> Qt ------------------------------------------------------------------------ r637935 | mlaurent | 2007-02-28 03:00:02 -0500 (Wed, 28 Feb 2007) | 2 lines applnk dir is dead with kde4 ------------------------------------------------------------------------ r637889 | staikos | 2007-02-27 21:40:12 -0500 (Tue, 27 Feb 2007) | 2 lines make some of these tests pass ------------------------------------------------------------------------ r637888 | staikos | 2007-02-27 21:39:56 -0500 (Tue, 27 Feb 2007) | 2 lines i18n fix ------------------------------------------------------------------------ r637887 | staikos | 2007-02-27 21:39:33 -0500 (Tue, 27 Feb 2007) | 2 lines some KDE4 fixes, especially i18n related ------------------------------------------------------------------------ r637876 | treat | 2007-02-27 20:28:52 -0500 (Tue, 27 Feb 2007) | 2 lines * Make this a little easier. Rest of plugins to follow ------------------------------------------------------------------------ r637867 | treat | 2007-02-27 19:50:05 -0500 (Tue, 27 Feb 2007) | 3 lines * All of widgets now builds and links. Still some work converting from Q3Support though ------------------------------------------------------------------------ r637861 | treat | 2007-02-27 19:20:55 -0500 (Tue, 27 Feb 2007) | 3 lines * And the various selectors build now too. I renamed a class to make it more consistent. ------------------------------------------------------------------------ r637845 | treat | 2007-02-27 18:20:03 -0500 (Tue, 27 Feb 2007) | 4 lines * Large part of the port of widgets is done. I still have some more to go, but this eliminates a lot of old cruft and gets the designer files working with Qt4. ------------------------------------------------------------------------ r637799 | treat | 2007-02-27 16:03:49 -0500 (Tue, 27 Feb 2007) | 4 lines * Convert all .ui.h extension files into actual declarations and definitions. Clean up the source, add licenses and reformat. ------------------------------------------------------------------------ r637783 | treat | 2007-02-27 14:50:12 -0500 (Tue, 27 Feb 2007) | 3 lines * Begin port of widgets. The curve appearance widget is now a Qt4 widget with a designer2 plugin. ------------------------------------------------------------------------ r637782 | treat | 2007-02-27 14:47:16 -0500 (Tue, 27 Feb 2007) | 2 lines * No longer ------------------------------------------------------------------------ r637739 | treat | 2007-02-27 11:05:14 -0500 (Tue, 27 Feb 2007) | 2 lines * oops ------------------------------------------------------------------------ r637738 | treat | 2007-02-27 11:04:42 -0500 (Tue, 27 Feb 2007) | 2 lines * Convert all of the .cpp and .h files using qt3to4 ------------------------------------------------------------------------ r637736 | treat | 2007-02-27 11:01:00 -0500 (Tue, 27 Feb 2007) | 2 lines * Convert all ui.h files using qt3to4 ------------------------------------------------------------------------ r637621 | staikos | 2007-02-26 23:35:09 -0500 (Mon, 26 Feb 2007) | 2 lines more porting done ------------------------------------------------------------------------ r636983 | staikos | 2007-02-24 17:32:29 -0500 (Sat, 24 Feb 2007) | 9 lines This removes all Qt3compat from libkst, libkstmath, tests, most of the data sources. It fixes several bugs and gets a good portion of the testcases working again. It also starts switching over to KDE4 and Qt4 proper ways of doing things, and removes all deprecated calls. d2asc and d2d are also ported. ------------------------------------------------------------------------ r636397 | treat | 2007-02-22 18:58:58 -0500 (Thu, 22 Feb 2007) | 24 lines * Convert all the ui files to Qt Designer 4 counterparts: uic3 -convert comboboxselection.ui > comboboxselection4.ui uic3 -convert stringeditor.ui > stringeditor4.ui uic3 -convert scalareditor.ui > scalareditor4.ui uic3 -convert scalarselector.ui > scalarselector4.ui uic3 -convert matrixselector.ui > matrixselector4.ui uic3: signal `selectionChanged(QString)' for widget `MatrixSelector' of type `QWidget' is not supported; connection may fail. Line: 74 Column: 16 uic3 -convert vectorselector.ui > vectorselector4.ui uic3: signal `selectionChanged(QString)' for widget `VectorSelector' of type `QWidget' is not supported; connection may fail. Line: 92 Column: 16 uic3 -convert stringselector.ui > stringselector4.ui uic3 -convert editmultiplewidget.ui > editmultiplewidget4.ui uic3: slot `applyFilter(QString)' for widget `EditMultipleWidget' of type `QWidget' is not supported; connection may fail. Line: 139 Column: 16 uic3 -convert curveplacementwidget.ui > curveplacementwidget4.ui uic3 -convert curveappearancewidget.ui > curveappearancewidget4.ui uic3 -convert fftoptionswidget.ui > fftoptionswidget4.ui uic3 -convert datarangewidget.ui > datarangewidget4.ui uic3 -convert colorpalettewidget.ui > colorpalettewidget4.ui uic3: slot `updatePalette(QString)' for widget `ColorPaletteWidget' of type `QWidget' is not supported; connection may fail. Line: 76 Column: 16 uic3: slot `updatePalette(QString)' for widget `ColorPaletteWidget' of type `QWidget' is not supported; connection may fail. Line: 82 Column: 16 ------------------------------------------------------------------------ r636394 | treat | 2007-02-22 18:47:56 -0500 (Thu, 22 Feb 2007) | 2 lines * No longer in QPixmap api ------------------------------------------------------------------------ r636393 | treat | 2007-02-22 18:43:15 -0500 (Thu, 22 Feb 2007) | 2 lines * Get ready for widgets ------------------------------------------------------------------------ r636388 | staikos | 2007-02-22 18:04:04 -0500 (Thu, 22 Feb 2007) | 2 lines a bit of work done on indirect and comment out uncompilable sources for now ------------------------------------------------------------------------ r636385 | treat | 2007-02-22 17:59:32 -0500 (Thu, 22 Feb 2007) | 2 lines * Comment out for now ------------------------------------------------------------------------ r636381 | staikos | 2007-02-22 17:56:45 -0500 (Thu, 22 Feb 2007) | 2 lines qimagesource is ported and at least one bug is fixed. Will forward port ------------------------------------------------------------------------ r636379 | treat | 2007-02-22 17:55:16 -0500 (Thu, 22 Feb 2007) | 2 lines * Oops ------------------------------------------------------------------------ r636378 | staikos | 2007-02-22 17:50:59 -0500 (Thu, 22 Feb 2007) | 2 lines remove junk ------------------------------------------------------------------------ r636377 | staikos | 2007-02-22 17:50:44 -0500 (Thu, 22 Feb 2007) | 2 lines Frame is ported ------------------------------------------------------------------------ r636376 | staikos | 2007-02-22 17:49:37 -0500 (Thu, 22 Feb 2007) | 2 lines dirfile is ported ------------------------------------------------------------------------ r636374 | treat | 2007-02-22 17:45:28 -0500 (Thu, 22 Feb 2007) | 2 lines * SVN INFO for kstrevision.h ------------------------------------------------------------------------ r636372 | staikos | 2007-02-22 17:42:13 -0500 (Thu, 22 Feb 2007) | 2 lines go away ------------------------------------------------------------------------ r636371 | staikos | 2007-02-22 17:39:13 -0500 (Thu, 22 Feb 2007) | 2 lines most of ascii is ported but it still doesn't build ------------------------------------------------------------------------ r636367 | staikos | 2007-02-22 17:18:30 -0500 (Thu, 22 Feb 2007) | 2 lines correct data type ------------------------------------------------------------------------ r636295 | staikos | 2007-02-22 14:03:08 -0500 (Thu, 22 Feb 2007) | 2 lines More porting work ------------------------------------------------------------------------ r635810 | staikos | 2007-02-20 18:35:34 -0500 (Tue, 20 Feb 2007) | 2 lines definitely obsolete ------------------------------------------------------------------------ r635809 | staikos | 2007-02-20 18:33:26 -0500 (Tue, 20 Feb 2007) | 2 lines these don't apply anymore ------------------------------------------------------------------------ r635808 | staikos | 2007-02-20 18:32:04 -0500 (Tue, 20 Feb 2007) | 2 lines one thing's for sure: this isn't going to work in Kst2 ------------------------------------------------------------------------ r635806 | staikos | 2007-02-20 18:31:31 -0500 (Tue, 20 Feb 2007) | 2 lines a few more obsolete docs from this view ------------------------------------------------------------------------ r635805 | staikos | 2007-02-20 18:30:36 -0500 (Tue, 20 Feb 2007) | 2 lines remove some irrlevant things for the branch to clean up ------------------------------------------------------------------------ r635757 | treat | 2007-02-20 15:34:56 -0500 (Tue, 20 Feb 2007) | 2 lines * Compile libkstmath, but no linky yet ------------------------------------------------------------------------ r635754 | treat | 2007-02-20 15:33:20 -0500 (Tue, 20 Feb 2007) | 2 lines * Change QDir calls ------------------------------------------------------------------------ r635750 | treat | 2007-02-20 15:23:41 -0500 (Tue, 20 Feb 2007) | 2 lines * No more names in ctor for qobject ------------------------------------------------------------------------ r635731 | treat | 2007-02-20 14:11:11 -0500 (Tue, 20 Feb 2007) | 2 lines * search -> indexIn ------------------------------------------------------------------------ r635730 | treat | 2007-02-20 14:09:43 -0500 (Tue, 20 Feb 2007) | 2 lines * Using qDebug now ------------------------------------------------------------------------ r635728 | treat | 2007-02-20 14:02:15 -0500 (Tue, 20 Feb 2007) | 2 lines * Various QString api changes ------------------------------------------------------------------------ r635725 | treat | 2007-02-20 13:56:26 -0500 (Tue, 20 Feb 2007) | 2 lines * latin1 -> toLatin1 and erase -> remove ------------------------------------------------------------------------ r635724 | treat | 2007-02-20 13:55:25 -0500 (Tue, 20 Feb 2007) | 2 lines * i18n call changes ------------------------------------------------------------------------ r635722 | treat | 2007-02-20 13:53:53 -0500 (Tue, 20 Feb 2007) | 2 lines * RGB32 ------------------------------------------------------------------------ r635720 | treat | 2007-02-20 13:51:37 -0500 (Tue, 20 Feb 2007) | 2 lines * New QPainter semantics for drawing a polygon ------------------------------------------------------------------------ r635714 | treat | 2007-02-20 13:40:23 -0500 (Tue, 20 Feb 2007) | 2 lines * kMax to qMax ------------------------------------------------------------------------ r635713 | treat | 2007-02-20 13:39:27 -0500 (Tue, 20 Feb 2007) | 2 lines * QBrushStyle is global to Qt ------------------------------------------------------------------------ r635708 | treat | 2007-02-20 13:36:58 -0500 (Tue, 20 Feb 2007) | 2 lines * erase -> remove ------------------------------------------------------------------------ r635707 | treat | 2007-02-20 13:36:31 -0500 (Tue, 20 Feb 2007) | 3 lines * qSort algorithm is having problems with Q3ValueList Comment out and note in PORTINGTODO so it isn't lost. ------------------------------------------------------------------------ r635698 | treat | 2007-02-20 13:16:09 -0500 (Tue, 20 Feb 2007) | 3 lines * Typo, KService changes, Q3ValueList semantic problems in KstObjectCollection::findTag ------------------------------------------------------------------------ r634344 | treat | 2007-02-16 17:50:35 -0500 (Fri, 16 Feb 2007) | 2 lines * Should be index() as per george ------------------------------------------------------------------------ r634343 | treat | 2007-02-16 17:27:45 -0500 (Fri, 16 Feb 2007) | 3 lines * Need to find the generated ksttimers.h include... ------------------------------------------------------------------------ r634342 | treat | 2007-02-16 17:24:47 -0500 (Fri, 16 Feb 2007) | 2 lines * QString api has changed ------------------------------------------------------------------------ r634341 | treat | 2007-02-16 17:20:01 -0500 (Fri, 16 Feb 2007) | 2 lines * Missing header ------------------------------------------------------------------------ r634340 | treat | 2007-02-16 17:19:17 -0500 (Fri, 16 Feb 2007) | 2 lines * KConfig isn't so lenient now ------------------------------------------------------------------------ r634339 | treat | 2007-02-16 17:10:05 -0500 (Fri, 16 Feb 2007) | 2 lines * Compile ------------------------------------------------------------------------ r634338 | treat | 2007-02-16 17:07:47 -0500 (Fri, 16 Feb 2007) | 2 lines * Only use qdebug ------------------------------------------------------------------------ r634337 | treat | 2007-02-16 17:06:56 -0500 (Fri, 16 Feb 2007) | 2 lines * KService changes ------------------------------------------------------------------------ r634336 | treat | 2007-02-16 17:04:49 -0500 (Fri, 16 Feb 2007) | 2 lines * Using qDebug now... ------------------------------------------------------------------------ r634335 | treat | 2007-02-16 17:03:42 -0500 (Fri, 16 Feb 2007) | 2 lines * stripWhiteSpace -> trimmed ------------------------------------------------------------------------ r634313 | treat | 2007-02-16 16:02:05 -0500 (Fri, 16 Feb 2007) | 2 lines * QMap::Iterator data() -> value() ------------------------------------------------------------------------ r634309 | treat | 2007-02-16 15:52:38 -0500 (Fri, 16 Feb 2007) | 2 lines * Missing header ------------------------------------------------------------------------ r634308 | treat | 2007-02-16 15:51:30 -0500 (Fri, 16 Feb 2007) | 2 lines * Q3TextStream -> QTextStream ------------------------------------------------------------------------ r634306 | treat | 2007-02-16 15:44:58 -0500 (Fri, 16 Feb 2007) | 2 lines * Get include path right ------------------------------------------------------------------------ r634305 | treat | 2007-02-16 15:41:41 -0500 (Fri, 16 Feb 2007) | 3 lines * Running qt3to4 porting tool on files in libkstmath and adding the porting log ------------------------------------------------------------------------ r634302 | treat | 2007-02-16 15:34:39 -0500 (Fri, 16 Feb 2007) | 2 lines * Prepare to port libkstmath next ------------------------------------------------------------------------ r634284 | treat | 2007-02-16 14:51:33 -0500 (Fri, 16 Feb 2007) | 2 lines * Additional notes ------------------------------------------------------------------------ r634281 | treat | 2007-02-16 14:40:13 -0500 (Fri, 16 Feb 2007) | 6 lines * Clean-up formatting of cmake files * Get rid of ksdebug in favor of qDebug which is threadsafe * Link with kde3support for now And with that libkst can compile and link against KDE4 and Qt4 :) ------------------------------------------------------------------------ r634276 | treat | 2007-02-16 14:19:12 -0500 (Fri, 16 Feb 2007) | 2 lines * Use KToolInvocation and changes for i18n calls ------------------------------------------------------------------------ r634272 | treat | 2007-02-16 14:12:08 -0500 (Fri, 16 Feb 2007) | 2 lines * Define correct versioning in top-level cmake file ------------------------------------------------------------------------ r634245 | treat | 2007-02-16 12:42:32 -0500 (Fri, 16 Feb 2007) | 3 lines * Just comment out the references to the private d-pointer for now * This class will go away in favor of QWaitCondition in Qt4 anyway... ------------------------------------------------------------------------ r634244 | treat | 2007-02-16 12:40:47 -0500 (Fri, 16 Feb 2007) | 3 lines * Add a special header for revision information. The logger uses this. ------------------------------------------------------------------------ r634005 | treat | 2007-02-15 19:44:21 -0500 (Thu, 15 Feb 2007) | 2 lines * Update ------------------------------------------------------------------------ r634003 | treat | 2007-02-15 19:43:08 -0500 (Thu, 15 Feb 2007) | 3 lines * Small fixes. Not sure what to do about private qmutex header... ------------------------------------------------------------------------ r633997 | treat | 2007-02-15 19:05:59 -0500 (Thu, 15 Feb 2007) | 2 lines * Q3TextStream -> QTextStream ------------------------------------------------------------------------ r633995 | treat | 2007-02-15 18:47:12 -0500 (Thu, 15 Feb 2007) | 2 lines * Port ksttimezones to 4 ------------------------------------------------------------------------ r633987 | treat | 2007-02-15 18:28:43 -0500 (Thu, 15 Feb 2007) | 2 lines * Configure check and define ------------------------------------------------------------------------ r633983 | treat | 2007-02-15 18:13:06 -0500 (Thu, 15 Feb 2007) | 2 lines * Quick stuff for extdate/QDate fix ------------------------------------------------------------------------ r633982 | treat | 2007-02-15 18:09:02 -0500 (Thu, 15 Feb 2007) | 2 lines * Add a file to track todo items relating to the port ------------------------------------------------------------------------ r633979 | treat | 2007-02-15 18:02:29 -0500 (Thu, 15 Feb 2007) | 2 lines * QThread::currentThread -> QThread::currentThreadId ------------------------------------------------------------------------ r633974 | treat | 2007-02-15 17:45:00 -0500 (Thu, 15 Feb 2007) | 2 lines * QString::stripWhiteSpace -> QString::trimmed ------------------------------------------------------------------------ r633973 | treat | 2007-02-15 17:42:10 -0500 (Thu, 15 Feb 2007) | 3 lines * porting fixes for kstextension ------------------------------------------------------------------------ r633971 | treat | 2007-02-15 17:37:15 -0500 (Thu, 15 Feb 2007) | 2 lines * Use K3TempFile for now... ------------------------------------------------------------------------ r633969 | treat | 2007-02-15 17:26:33 -0500 (Thu, 15 Feb 2007) | 2 lines * Fix some qalgorithms ------------------------------------------------------------------------ r633968 | treat | 2007-02-15 17:17:35 -0500 (Thu, 15 Feb 2007) | 2 lines * KServiceType::offers() -> KServiceTypeTrader::self()->query() ------------------------------------------------------------------------ r633966 | treat | 2007-02-15 17:05:55 -0500 (Thu, 15 Feb 2007) | 2 lines * fix ------------------------------------------------------------------------ r633964 | treat | 2007-02-15 17:04:03 -0500 (Thu, 15 Feb 2007) | 2 lines * KURL -> KUrl ------------------------------------------------------------------------ r633958 | treat | 2007-02-15 16:49:56 -0500 (Thu, 15 Feb 2007) | 2 lines * Fix for QMaps ------------------------------------------------------------------------ r633943 | treat | 2007-02-15 15:20:43 -0500 (Thu, 15 Feb 2007) | 2 lines * Compile ------------------------------------------------------------------------ r633939 | treat | 2007-02-15 15:14:02 -0500 (Thu, 15 Feb 2007) | 5 lines * Missing header TODO: This plugin manager should be replaced with Qt plugin system? ------------------------------------------------------------------------ r633935 | treat | 2007-02-15 14:55:00 -0500 (Thu, 15 Feb 2007) | 2 lines * QString::findRev --> QString::lastIndexOf ------------------------------------------------------------------------ r633934 | treat | 2007-02-15 14:53:27 -0500 (Thu, 15 Feb 2007) | 2 lines * Use QDateTime for now ------------------------------------------------------------------------ r633930 | treat | 2007-02-15 14:47:50 -0500 (Thu, 15 Feb 2007) | 2 lines * Port ------------------------------------------------------------------------ r633926 | treat | 2007-02-15 14:40:38 -0500 (Thu, 15 Feb 2007) | 2 lines * QStringList::split() to QString::split() ------------------------------------------------------------------------ r633925 | treat | 2007-02-15 14:38:21 -0500 (Thu, 15 Feb 2007) | 2 lines * Need this define ------------------------------------------------------------------------ r633924 | treat | 2007-02-15 14:37:28 -0500 (Thu, 15 Feb 2007) | 3 lines * Initial run of qt3to4 porting script on libkst. The changes are logged in portinglog.txt. ------------------------------------------------------------------------ r633921 | treat | 2007-02-15 14:29:40 -0500 (Thu, 15 Feb 2007) | 3 lines * Add placeholder for config checks, create ksttimers.h properly, misc cmake build stuff ------------------------------------------------------------------------ r633802 | mlaurent | 2007-02-15 07:08:48 -0500 (Thu, 15 Feb 2007) | 2 lines ${KDE4_KIO_LIBS} already contains -lkdecore ------------------------------------------------------------------------ r633710 | treat | 2007-02-14 18:03:28 -0500 (Wed, 14 Feb 2007) | 2 lines * New plan. Porting of libkst goes first. Scratch extdate for now. ------------------------------------------------------------------------ r633705 | treat | 2007-02-14 16:58:13 -0500 (Wed, 14 Feb 2007) | 3 lines * Disable compilation of all besides libkstmath for now. * Require the KDE4 package for now. ------------------------------------------------------------------------ r633701 | treat | 2007-02-14 16:53:07 -0500 (Wed, 14 Feb 2007) | 2 lines * Disable misc, tests and plugins from build for now ------------------------------------------------------------------------ r633700 | treat | 2007-02-14 16:49:51 -0500 (Wed, 14 Feb 2007) | 4 lines * Add various CMakeLists.txt created by running the am2cmake script found in kdesdk/cmake in KDE svn. ------------------------------------------------------------------------ r633672 | treat | 2007-02-14 14:20:20 -0500 (Wed, 14 Feb 2007) | 2 lines * Open branch beginning work on porting kst to KDE/Qt4 Kst-2.0.8/qnx/0000755000175000017500000000000012320547027012166 5ustar synthsynthKst-2.0.8/qnx/README.QNX0000644000175000017500000000341512320547027013516 0ustar synthsynthKst works on the PlayBook! It's not in the App World yet (I'll send out a message to kst-dev if this ever changes), but it's only a little bit of a pain to get it working! 1) Sign up for signing keys at https://www.blackberry.com/SignedKeys/codesigning.html and follow the instructions in your email to get a debug token installed on the PlayBook via Momentics. Keep note of where it is (usually /home/[USER]/.rim/debugtoken*.bar). 2) Install the PlayBook 2.1.x beta at https://developer.blackberry.com/register/ 3) Download the BBNDK 2.1 beta at https://developer.blackberry.com/native/download | | The remaining steps take place in a bbndk environment, i.e., after | | running "source bbndk-evn.sh" and with a PlayBook in developer mode. 4) Build Qt for QNX via the instructions at http://qt-project.org/wiki/QNX 5a) Copy the needed Qt ARM libraries (usually from /usr/local/Trolltech/lib) to kst/qnk/kst/lib AND... 5b) ** cp -rf /usr/local/Trolltech/plugins/platforms/ ./kst/lib/kst2/plugins/ ** 6) cd kst/build ccmake -DCMAKE_BUILD_TYPE=Debug -Dkst_pch=0 -DCMAKE_TOOLCHAIN_FILE=../qnx/QNX.cmake .. # In ccmake, configure the project. cmake -DCMAKE_TOOLCHAIN_FILE=../qnx/QNX.cmake .. make cd ../qnx ./stage.sh blackberry-nativepackager -package out.bar -devMode ./kst-descriptor.xml -debugToken /home/[USER]/.rim/debugtoken[].bar blackberry-deploy -installApp -device xxx.xxx.xxx.xxx -password hunter2 out.bar 7) Find the Kst icon on your PlayBook and hack away. You may usually always want to preform incremental updates because they are a lot faster. If you want to just update libkst2widgets for example, you should run: blackberry-deploy -putFile ./kst/lib/libkst2widgets.so.2 app/native/lib/libkst2widgets.so.2 xxx.xxx.xxx.xxx -package out.bar -password hunter2 Kst-2.0.8/qnx/QNX.cmake0000644000175000017500000000503712277111530013640 0ustar synthsynth#INCLUDE(CMakeForceCompiler) SET(CMAKE_SYSTEM_NAME QNX) SET(CMAKE_SYSTEM_PROCESSOR ntoarm) # specify the cross compiler #CMAKE_FORCE_C_COMPILER(qcc GNU) #CMAKE_FORCE_CXX_COMPILER(QCC GNU) # where is the target environment SET(CMAKE_FIND_ROOT_PATH /hddhome/joshua/bbndk-2.1.0-beta1/target/qnx6/armle-/ /usr/local/Trolltech) #SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(QNX TRUE) SET(CMAKE_MAKE_PROGRAM "make${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Make Program") SET(CMAKE_SH "sh${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX shell Program") SET(CMAKE_AR "ntoarm-ar${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ar Program") SET(CMAKE_RANLIB "ntoarm-ranlib${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ranlib Program") SET(CMAKE_NM "ntoarm-nm${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX nm Program") SET(CMAKE_OBJCOPY "ntoarm-objcopy${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objcopy Program") SET(CMAKE_OBJDUMP "ntoarm-objdump${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objdump Program") SET(CMAKE_LINKER "ntoarm-ld" CACHE PATH "QNX Linker Program") SET(CMAKE_STRIP "ntoarm-strip${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Strip Program") SET(CMAKE_C_COMPILER ntoarmv7-gcc) SET(CMAKE_C_FLAGS_DEBUG "-fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_C_FLAGS_MINSIZEREL "-fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_C_FLAGS_RELEASE "-fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_COMPILER ntoarmv7-g++) SET(CMAKE_C_FLAGS "-fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_FLAGS "-lbps -fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_FLAGS_DEBUG "-lbps -fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_FLAGS_MINSIZEREL "-lbps -fPIC -fstack-protector -fstack-protector-all -Wno-psabi -lang-c++ -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_FLAGS_RELEASE "-lbps -fPIC -fstack-protector -fstack-protector-all -Wno-psabi -Wl,--export-dynamic -Wl,-E") SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-lbps -fPIC -fstack-protector -fstack-protector-all -Wno-psabi -lang-c++ -Wl,--export-dynamic -Wl,-E") Kst-2.0.8/qnx/stage.sh0000755000175000017500000000044612277111530013631 0ustar synthsynth#!/bin/sh echo Copying files... cp -rf ../build/build/bin/kst2 ./kst/kst cp -rf ../build/build/lib/* ./kst/lib/ cd ./kst/lib echo Stripping libraries... find -L . -name "*.so*" | xargs arm-unknown-nto-qnx6.5.0-strip cd ../../ echo Done. To deploy this onto your device, please read README.QNX Kst-2.0.8/qnx/deploy/0000755000175000017500000000000012277111530013457 5ustar synthsynthKst-2.0.8/qnx/deploy/pbsplash.png0000755000175000017500000043665012277111530016022 0ustar synthsynthPNG  IHDRX#bKGD pHYs  tIME jiTXtCommentCreated with GIMPd.e IDATxw(RDEAE/, 6@Q,D#Ez4l&/yg'S)dwOi<3us?@ !B!BJ4N6!B!BB!B!4!B!BB!B!4!B!BB!B!4!B!"M@!D } K!!BHIF>!B!X['BhB!/4! B)A_ R(BX.I_ BbfB!$p|>2#BH,в&BHhߞ%iB@!4! BEֵ"ȣ.!BB!FYnSsb&!B)?R4! BH9PBߌ @!!B]_o FMB!4!R,QHߪv4! BHL ?)͚4! BHvMDL3#iB@!~+bHF4#FMB!4!h4#ƀ*7j BB!E*n3߬)`{Fa 4! BߌC1 |O3k&qOB B!DMt42"bު)&iB@!VF_Fymv=BhB!D޺f)E3`4_kYs&!BTYovQBYo @!!B."D_1(>M @!!BbBGZ5j[Mk h4! B( Ϸ*HvzB_1^ ilB!E00hg(V۾|'o_:B B!k3vZW2 -*! ߎ{B!!RD޺Ng3W3ryf\=kO+ !+ BbWe~~^!"BH EoTgN`T+kϒHڿZB B!_ȿU^z6b =o 7%h=BhB!%\fiFG1NAt: R.:E>!B*ELbHfWo4򯶬\0@k!`A@!!_ohUF 3߮ZfSQ@ P jf>$) ! Bo%/~R30"{{fH7>4j BBH{1~3_D싈v=o&3@"_!t:CiupzYb>vq BAN"*VRJ_m5fS*'ſ\ER@pT ` @!!eo4jh6:\Q~"wQk;VKv }m!R_iE>!BH~Z@Qz=3CK\Aj_*!ZM BB\OD0/}/ڌ `?A.r@.!7m'7 "j) ! BJ0~VDYC@Pk |򈽞~|^p;ZTH+ݳ !4! [>߮}p~"~#]߈`PdJg,X]vEF EEjƀ^$"LJBBH%uԀH~QoG5-/%RE޳#@W>o)S >\.~4}H!$8Bh(Ro6?iC@}zc#5k?v|>|gHJJ A@|#헾 7.  76۞0B(i(leRg3HW5D.ۇ3gӡ m'>}: j5u Z#"#ղ2lljBBH XN,̊k3&V{cڵX|9> ^/}vzje˖U"焞S 4|{X P+ZR4MB@!$&L~ QCf#Zf ׋oW{<]\?D˖-C_y#u@4 d"ꕎuy!4!Knfݢ.7coFf(۱qFl߾yyypH*;4kLSErGTfPYԃW*VI!4!{8v!bWV"ӌ~۷o̐ v)–-[P~P\ˣfMi=YBC 0o @@!Hı:v-c/ @ĿQizdH.]o{̙3p\qQ\>>>sEڵ YI3?h""F""E !4!22dؕ/RL~#fY.]իW) r-ʔ)mۢ^zxW9u?J*~%Q)OZKw(-BL>h|+FB8%mgB`Cj+&~eg(H@ 6`8u|>jiii=z4Zl#++ UTQ]@ڵC׮]r =nw4GsK_K̈́{5AYOTi{i-k+MLJ0BJ菴QP&Yȿ]F,ݻ-BNNnwIIIU^yjժк)))߿?>O?x@<5qDv ~I=/uDP2~ !Ezd!ovz!Xf Ѩш$ pY8vCp}Ȑ!۷/UVh} ǵ^0!p]wK.Ji^R&R6Z-Y˨`t+SBRBĿ_0*#]d0@$vF>ϔ Ǐcʕسg<OH 9ժUC׮]1bk @ ǃ]bܹa\.6n܈{BZ:MvJ`7cP~"rH4< {B B!fF 3,HED -p~jhaHWƺu됝@ 8Pݺu1ydԪU /u^O,v_~Apy>|5jzZDЛ1"jv (5!1vMeB)o}I1̈#~5RE SNaΝXv-rssv eˢM64hnfa4^zPWre<쳅՞EʻH_[f2Y.V$DRt~P H B)_t^20zU#)HzĉX`Μ9*|'"qرӧ;ip})n8p"& W;_ )ET˨Jm.z2)3!d#iBk3F]5"eQ_iT-W;v`ӦM8rnҢy֭q"Qdn T\VZxâJd ֵ4vG^N}mx 3!3Do]&u$fĿ4*-W/d_>!x &LBff&ʔ)cJSA Fiqz}+E^iv`&!k+3!tu-QkbD2 (F )VK8p[nŮ]z U=*?0j׮mQٳgQfMe}>:tVZE2DT{H3L@q2FEZӴ*,#z\XR0BJ7W]OiD0E!"vD0ȑ#Xp!Ο?'A/ip8_z [N._<}Q̙3',ZrpB4o\Xp `6u`4^7R_i[JJ5F !E~e!OlH?12jjlLA?Yv_UH ԩ郶m* +&F"ǧOFݺuGѢE ,zfJ{#&{D;2hBRſX22"eXaD}> peظqch?$''Q|w+zYUW][oV :Nlݺ7|3 61R=Ng4F3D iEMTke=LB BnD[fj E_$RmۆM6!##mk/"N\s5BFݿ15#vo߾XjH;v/TP3*•9yHui6o&/7&0&MB-Yv 4"7"E1j ``eDCE*gX꟝C᧟~BVV~qqqZ*F.]/vhF)MZ*233Ö ^:zX P pF *%`Ŀ43ﵶwi@!%Djb<+f@Qv`ϿD}}>.^KСC|rHmxꩧp 7ݭ5vj&Ma9"Æ Xn233gUw}7t~_WECRXlYi_ڵkڶmkzVR`[BvG -o1|[ {Vĩh5j10ZLlM<_T gbϞ=Xr%I'''y2dnvC>zȑ#hԨr{ѰaCS*_R Hv<>[8Y@bfBH v*ZgDF1]ƢF,X'O}ſ1brʅRE"0ˌ !UcǎÖsXt)իgZɇT f@D(Fզ-0E> VyzRz"V{#)jm_M0k l=an ]6PAbϞ=ظq#8ۭXOׯ.]`РAkѡmho&m:8=== . p8zw^ԬYSh__6 @iO#EREPۆ1 bX9iBhBH 0DѵHZk틖l \Wm m CC"CQ~O]6Z=z4,2 ۷oGZZt}FFĿ6?[sF>RBm!FEӍVԌVMHϮǏǶm۰uV KII#<^zqaj(kTx0h <߿~jґJ`V ~+_M R#@)@)ƮȿȹL!_$hE3b (MW75o4$EǏǢEpi9N; !*Ve~?:tA_}0үVL%[ 0W3m4̢|VQFcd䘙Ʊ8 Hm@!1d/JˉgiFԄtQEi赹W?;wɓ'CètwCǎ %/ߎ%UJ5j^z饰eN'9/lٲ!c||Pm4j/}l_y 43@!D-@Zf 2BN1T>%Ff1jhχ\Z k׮-$5xj 'NDJb&ovDTDQ:-["77Wqf͚Aa!E3J`W?"}J寵ik9nf= !DfBH""T.DEĨMC3D [TVqE3&迚 w^lڴ G5ONN?;"--MXt۵ݢ_i;z"H.@ZZ7nիW+Fhlق:u( c`uhI/Ƚ4/K+[peEUVA@B5R4_kh3~s5sJF73D`,V Xp!.^F-˅ *^@޽mfn!CD@={[o [68$]w݅4ŨZL`؝gFE2hM7 B8 BAs@,R_ e?_iEH@-BĈŲep\t #E6rNu GÆ xBb0~Vߢ}}W7pZl+W pX~=T"d˳BRIDdh_y_o%02< !  J31}"jZDGBٳg~zlڴ n`=RSSѶm[7a獕ab5گFM鴧~+WT\6;;gΜW_-,+E$"hZ_$CIԮ_AQ͜BB7Rt\TjWތ!`K;*VM]"V;vqy|>6*Twy͛7GrÒ폔 =J [6X+T)=K#Kȱl*`vW:uq%#@*DtD-!!Ġ9'^kU7"1fh p3^ohtt>+WҥK}#?..M4!CСCE4 &$$$`Сx7ݳg5j801)BN4od|>-((R;J'N`ǎΆ6|ǣsxЪUERYGTdُ8|>,Z3f/aÆaԨQ瀨5+ѰaCݻWu+TھPpW5!/]FEAA2Z "2ve~?/d HEC|zmR`!/v.'N`HHH4'u977QI1kRCDJ0(?{.Tjpo~3gqмyaСHLLf;//ӦMwܡ:?##Cux⬸ `Ƌz|>_(cCMK_˳,~v  ||z/}~x^ddd`&-%mS4k zC=+"\I8N$''c9s&>}:lcǎhڴv6Í7ވubǎHV*󳸊A+U؈pN/((JP2F! aH)>jcKi#VsQ HAۍ wEÆ CEM|I^ZwaÆaݺu2O{1zhsS]$4c5=xT7 z&!X& 53@MkF,-Bt|EW/!~ ??ߴxC `w 25j~6cmm @JJPҀӟy̞=[ P3 UPz _ RBhBH ~oDەot? Ge˖x+̃jk#Iro'OF^^999P&L6mڠB x""xb7kaڴi8rHD>cԨQ>|f7\. , )eDÎQ#/fy뤒A(FJ+EYҵ]j* '*i BhBH3_:ώ~fEQJCm`G{۹ b =Cbbp >>CѣG}+8pSN[o裏зo_۲)rwZj8qD>8N>mڴ?3gΠcǎ*Uׯ/_|Kӧj֬>}`?l0;v g1B޽IIIh߾=|> FZh]EMz%zhߨiJ!4!F!IZL3UZe}G7Vh;IØ/?˖-CQL̞=ٖ[\93.]㑚VԱrhԨvVZ={DUH924ƒ3g?T=Ku7Rmt}bh?B BQ,J/1/WB-%(pjehݘk?0;v =zm݆W_}z @^^{9:t3gĝwW q|wPڶmswtg-4o-[pM7?֧~㑚}*f$$$`̘1Bu1Js0{J#heXFB@)ͧop~J7Jiz7FjmvCkF<M ^zI&B7"˨[.^}U8qcǎ 3Jz_FZZ|A={;wf͚UHaԩ[ѨQ#lڴIh[3f̈p~+}c #EcRQUz,JFqORE"} MfS[LvQlf8@+7_|F )<>|p;. 7p&O&Mrb! ,e. /u놺u4hÁ͛7qƦ>篿SOE-puaϞ=aW_}.]ؖ=RHe"?f6̶$3!Z؝6H#@LxMW+''bxh$V譻uV15³>Ccp`_vZ4iDWd?F۶mQ|y[֭#33/ԩ{WqiӦ5jg9R_Qv1tPK,cJ9UxՈЗo?ZB BHSk4#ľf#VRvydpQmݻbŊƈ#,`0]Ǭ `&`f8@;BRn6 Du'bhU6S_+@+@> &Tл!7R@)*{}hݺ5x<aw?Ǟ={ ^?v܉޽{àAci ;v,n݊˗VZϓNKK_+p9>*U5`ĉذa~~|QcǎUnXZ W 'x !4!M7" 5ת꯴ڣ@\Ĩ!v܈-~Nk{r E}>кukر}ڷo$!!P~;yyyؾ};ڶmcΜ9{ǐQFf͚p8!C)S<;:tu˅իO?ʼn'3ϠAxG5g޼y8|Tg;ŝwމ+BX~4 į"ӥ݅ nYfD>MB BHN"DE2tܠk׮EϞ=ѺukL0qqqp?''֬YYf/=O_{54j 4/g߾}(((^gE5'`p׆СCvZ۷=Xy\.?5p8PR%lR]f̘kdqxyn!k[=5zB8 !$ċ뙉k dGa`$%Pj7YYYزe ^z%HJJvFx'ѿ(_>3g#W_\dff ##UVǽ{j3+WFʕ|ͨT=/Ɖ'PbŨ &`޼yaY*ꫯЭ[7^M&LFo?0vލd`QN:aXbE!_qF4k ѣ-d|رcG^׋1cwr1lt/999X`AԎy @*UХKIIIx7:bA^^[v9:+7BBo"_Ϯ4 ~j7fG֭[1rH?ٳgrE СC={6իx͛"Ν;5-܂?Ra?ۍM/DVVwT 6Lq3fY@ 'xW^yrcƌj7@ ΝÆ (lO0ch]Ì"Fx!!Xa᠔""z3@'@ ZjΝ;c֬Yp\i@(W̙M6a\rF̞=#JQ-h5L!@yB BH3MQoV~3Q}3F@$j7)rsl'Obh֬}Q>|p:Bc׋@ ֭[cΜ98|0:wR?0x`$$$`ʔ)xWX.\'|ʕ+*,3 !! Ӊ"IiGΝu=PBv^@vv3g.\@Qg5~Z#7_<!4!%Nu5Vh>#Q6u^@ems <-[ȑ#`E^za߾}oѩSмR(_EѢE L2m8qyyyꫯFӦMC saɺNzvm8p8p (C||._wuF+cԩHJJƒ>ŋ ;uP ~>: jժ$0ZO?(GӀB37}vWiEľ/RJ_*&h7rZBUw^37x#q\|Y8ݻ7ϟ[o$_}~/|-`ԩx"Ə$\q;–=r~7Mq7L_$Ajj* `jt ֫W7Vp:E^@_ZFL#Q) !M@z3g:ftjjM*d5Ժ F23GEzz:.] á]V;bicA/)<|2d-n7j֬ٳg㦛n <ӉÇ [O>믿bPn]\6~7e˖裏PV-$%%?ᄏ âJ29V3.BBoAٚ|k.sRUZ5CP2RBhB(mF (73DȿV_Z0" OFF233v{ @bb"jԨ~rK:gZ=D^^N<{ ,جY3gԩ)))\r1'D5jUȑ#uUWaĈ>|8ʔ),;v8$;w8o˖-ڵk/Zj(sOx6+BR*V"fſHʿH-i_/U_!>!77qqqxf͚nn QWx}еkW\s5E.DIIIO<_~w{94k ={>P]Xp!ZnkfϞ=sDDAkПVqH ! 6(Ŀ+o'pE͔d5~?N'ZÇ;FFtˍo @FF͛ѣG#??˕+VZu6lX_| .j2e`ڵKQ3byhٲe'4`ҤIhժvlt3Q^DC3i$Rh>!!ԋh3QHߨ5^&͛qQSç~deeSNxРAPG+ƍ1|plܸQ϶.~TT yyyxqB˭Z ϟGr u@ Cr 4i 6ncʕ*R ދЄ%E(rkPfGB" $rsu5{т|f.6dCt9輑-4OU ?Νƍ1w\ڵ 999q\rСvލyiӦHHH(6"ov#++ ˗/GfдiS,[̲WL|+VǣSNa_t 3gTw"r̘1CW;HLLZ$&&}Sq-dPT! X)ce;0"Eh3 IDAT~_|y~ddd`Xhvө{v1e/PF-mvr0vXtMԩbwt{ƍO>Oڞ %핎EѰaCz-?>jmp8зo_(o=nv H.7Fߧ4M4S@H5IKW6!qe;v 'Μ9V_-܂=z/57@. 6mܹs{Ʊcp׆|xի_@˖-1h t]H$n7}QlٲEs?ӡCy,biPBhBJoU[߯6OI싈~v>Xbۇx<i;von!dD&IHHի1p@߿Ɔ BwNwz *Tv+*1rHe+ 8TY?++ 3fwީ\|||W\~yxBz<T^]sH;8~xP)))W7n7 z|b5j HY\.YF33&ZXDX5hBhBoe?3U"_ #G`׮]ؽ{wHTh^{-:uv)9Mp8 _} ab=¯%q̛73fmw}7-Z6o̘1رwj矇:T¸q0j(elق]v^z v~/^ ;RRRxtҥK|W^( @~ @=m}駟 MS6oެ͚5 qX|P"-- 'O ۧw}WsqŤ` V5mh-!4!1+E"fR^]_T+ ~iR4]ؠ,b `S;4i:tFVVnHn$%%鞳.] 8UqPPP~qX,믿dxa֭[qqTRESQ@_~%&LO<-[Lh;it 'NT_㭷*TD3V2rss -+*"˗^WWeDK k]Lj>!"PGLkzifzQtVq?B^7!2_:8FY4pB/,٬\2fϞo]q_/Rغ Vz)Ԙ={66ms255ç~v1f :G2Fk-ZT(Kp ??vn"HIWkW B BHLo&ߪ: }vl۶ G)t+ҷ?8f͚xq#55XޤFGFF&M /qqqx'лwo4o޼ɣeʔ1ycFٲey@^nH}4֬YÇ#33. .P!@ GE -[\o.&Ko壏>'|?#" / ==]=˔) 6N:7ǽM6R =Zhm݆gũST1n8 :Tʔ)š7ZTlJ n3==;wFJJJ:˗/Ǯ]Pvmn:l^{>\.{ ;DL2a\}Ֆ5.B@Aow?Ң_+owE#-@nx^={K,rp8 'rlSSS#`̘1ǫDӿ{ :4L!%%͚5ҥK ;v,^|Es\!_h{Err27n'I&K>P]˘?>z!c%R-_k} ر#z:toxiii΁~[iӦᡇjo^zE].֯_۷nݺ1.58 ! İi`wt*j?)"FZHsk.,_^77"qơaÆahX"ŽBfn7sN+mه뮻O>d@˗GhѢB9r7oF-x??xbb"i/8v*WoѢRSS0t8;w.^y啘VvcxWT ]/@/ @~]6BhBTFĿQ(෻p ,YOF^^^(5\tة cƌ?\_TD^qr!11. o}ddd}ڵkǣVZ~>=XF @"gUx0`>cBн{w,_̟?cǎENN-ۯT-[5jF{xꩧpe@ƍ1`׏c#-- wV]fݺu8x Wꫯb֬YvYL2 y#ƌ.-B BH1̊#V?j1?~Xt)lق|mڴkի#...NJX0117om6222PjU]l>}OUZ*Graر֭27o{]SSSѳgO|Wa[bb"^u<kEqBOhtD3f6!"71j_O+E֐xg飠k*Γηqa,\Ǐǚ5kh(T k׮ŷ~n QVqqqx"kj ͚5ƍ-Áu*!P!TcuX?)R/رctoÁ\<8zgϞSOEmof/_O;~?>Ck׮u-}/+C (Ŀ~fF޴,l߾'N8oTyݻ7x tf'|bKpժUѻwoS|qvq ~ѣѧOаRdddRJEڋ[@Hh%ow>|ŋe˖P߾}{{(_|Z}cYԋ `VêUЫW/:tȖ/_3gĽޫx~?a⋺:m7; .P:ۏ=-[I&Q/믰b4h͛WKq3hgQB BqĿ/ b_>mϞ=ؼy3W蕨R 틇~8SKSGfWzzL6 s;,oGA>}p]wȾ]_sf߿ϟ=z[oU&.nioSLo… o>ԨQChڴi-Z{AnPNޔCŸA l|Rm 2}YG˖-dɒQN'F>G6m0a„ï*$`ʕaL_̮[NRPc8>(>>-ŋq9\yQ;SLA Á'N`Μ9޽{LRXEyliBhB*ˍ3hj^4߮Z6n܈M6̙3*Z ڵk#==mڴArX 1o\OOOO?Tѻwoԯ_)gΜ)̚5kp!TVC|] Xd utŊѡC,[,l~bb"&Nz(d$J!jH"q\2U,%BlBJW3~ϧ(((@AAAJj?Ο?c„ X`N>]PF.8/!!7x#͛իWK.([lhV~#i^;wD.]p5`̙J0b!헓~!b7$}_| bU'86U!ЫW/p`طo_Lb>ǚⵊBs@C-_M\yA/}'Dؗ>N}:>#\P~QrꫯbѰaCǚ.p8r0n8ԩS<.]jܽ{k.Z _ܘ1c4EZ5x]Jޭ3l. 8yd\p!*RwקOx^e>+VĴ>3FϤ'  @/ .jC7bƌxqI|>!!,͛7;#SNa. hga. ؼy3!55:233-C 0x`ܹ-BZB*Wo=l'N`ӦMB7B~;&t?/N Ȼz.K\$ (GV$DTL(;9TEA& "H݉]alzwvWtWW7~&{hժZnݎ~tO2K T@@@!4.RT/J뾁@_5lbD'XcM;tӧf͚c8s+~-%/==s]w*a>p@Y&h_UU1i$,ZH<#P(HhlBn N.]vXKڹjFYfEa!?rJp 볲u/t@@/N CFc3DK V 0x?{b۶mصk@ĺ&i999߿?^ԯ_?O CKBY: N8?~p.{nlڴ ۷/vOvvֻ-[Į]H̙3ѽ{ɒBa=%a(d^@@@@ L kwA%u,XhQPn(5$ *TqwFTJƎ[dN@ZZ^z%L2.w.& +4@mD$ n02>߿m[ aa͚5CN.YG"!' WH?fz(ʕ+ӧOGnnnDOS۰d۷wygJ;?cX۬Z wj׮_vN Y?8rw7B{)_.|3N!Z?` #c 9p֬YS,DP{>-@*p^zOp! 80b#G&|Ln}( IDATL_RW*r A TO>5@B~(SPB(DDx뭷$ !̴3+Ç(aN'&M]b J˚@i1@\>Od"D"E֭[n: ڴicLx ̙3'ٳ˗^ MPT11Ӹ1M[0P'#x:T.|/^yEI!(J3f̀ r᭷SO=U"dzĈ?!'OLɻ0Bv^h@T+Hƀ(PbXd rss O2pK/s=^z%=,_UU?~ƍ Rە+Ww܁)SD~^nn.~|HQ"x g=C`PxM{7Z9ov,=z4Ǝ[d$*G(TT [š5߇XItRi0`@?87o.Hć1  o *'{ lآ<QCmڶEFzb߄ W}#~D_@Ixapݺu+mV"䱠9}:qٳgE#=z@*Ut:ѷo_?=PPd^B޴T0muCs=7n\e/sQw # @E.5޽H? @sⵏgDaH%OF;xFo+VٳgjPXyѨQ#L4 ͛7GfffTa➄>}O<"P~ᇘ:u**UP~ YYY[W TFx-F 7B9 5?Bʵ0vؘ5kl30f BL7(Jǿn#tl6ر[lA֭y+,W(h0$<vP#M6? kO<:v&_=`ӦM>}:⋔vӦMq}!///"x/Ǽ&UUpBB@`: D@3 (\zhPraĉx<%?,r{} 2/ !@`4=H6ҵkW(ydggcРAXr%V^FU(-[%^/ϟn ͛7ǶmR2)mԨ(x衇`bcVpkРN!'R@>Sqr^ޏ{ e|;e `?|_}F譋3H_ GNN:qIRBBM?-_[ot$ zA@8B4 c=Ǘ_~Yc!^?F0e&ɒX ֭[ 6I&0aڴis–hfx 3If,v &^z:t(6lؐqgݻ7 y+W{W_gh=h\ne7ݧkR P31 @ """E-YѺuk4i$3vSfo-Ljiߌ)jԨ=={w'^@Y e0͓M,CUը|ڴiFxe +Tyƍ裏f͚7n\FBA"nׯ_ߺuk|8}4nF+R PSX͋'ӶS. `Ng?Z?$TnӦMC֭ѢE l۶-k0a^o gv ~~Jk-fF~~~KlLDh4[A޽{RU `> =/ϧm `㒘4! AQ\N \ď׽R#gj3FXʽpBꫯ0dI_SiӦ =S۠?gZ?%D0# 1@EVpe 9!. Æ +s @'RFHk1ưn:?*UJX('m@*>S#0h tJ gSO=V0{K՘F7mF`ۏ'O? hD F) q@!U[p4iGpi[-{YC֯3]Ҟ[a|}X?L/G8lp/]_hI@ki@#R@Q={v8|pW^AΝ0s͋k΂b D#T ';'ag~fa֭ؿ?իWdXI$ b&%xcmн{w,X ,cҤI;vl抓'Z*ٳ4if̘[nӧOGvvvDѻwo9~?hiJ`ͽpϞi$h}kB!qESH˃)M&5`{kOH Nwf@={K2 rb,2FEQ(b~޽o]_vv6222p}_СCSNRcZ>#D 'DdͼB@ υPA@Yѵ[W\.|a:thwBd9r$̰2G# +"+ P@xs Y%}]/}ꋢ(a"r?˖- *3g=dYWTߺ~ʕx?BB{ݎ SNF}Ϟ=rJcꪫJt +f?xA/v|~8[4FE @V@هZyo fA488u~=`z!-[Wt)TZո֚5k⥗^ 7܀}뮋tM7aŊI%~0-' V4e0A|p8acǎС֮]~;wG}Mm޽^{mzBj֬~!-- N33nn]l6i]$I$IA !aE??Hl \|IP"Hy$A{׮]uR2sT{Oïܹs s6mڔ/999A&wf͂3f/z~_wHNޜ 5r_B@vAٵoıp^=ꑣ‹TϟJjz.?W)Ss3u?Մ5U$`o{w60=b -wɝ}CNN~4h-‘#Gzر#rrrbѺup dFä r W_UU#j;w.ZpP @6gT-{R0G w\_~˖-3":Ra`׹nz)0иqǎÚ5kV\rغb1-8ѵNt/5o͆Jqn~َwߋ AO1d׉ϴs{u#5^)F'AùoPT/tQdiU=cPV}5|$ƝaW>3w(*ʲ{;j(#G믿~( =^gR"$IBm"zrC@v1m P&I 6D:uNtx'EOv2f5{hѢzEw7o5k_ŤIcƌw-X=Zʼn]p{O7l]'݄tGX68uk_|-T"!/A@vCUStU@xi`GΈU/Dr"0mN  JYT_7#lw9̝;75m| )H̊lm ԍ[p#Ekw"xpk7a2;3zk2$BƉHA@@@@LzQ;p6o\dDgpa[hР GBP>Qdffo?~ ;v2~Cfff~s΅+u.L#9ߺUp[CpKo%Tsßcgb?||0hwNB} }kF1#( (0 CGn3ߟ!8?R5H˩R/n_,G<~p?3ן.H,AF C qhP Mc_Hx,Xcǎ = \̕x(ts]A% T# &>vaԩ *N{B]k*'ZgϞE>}кuk9Ν+1'N'Obh߾}XBPr91ãW?!_hˑ‹ NA sf'q[OP'[f2:d U hD(gz~}2'~K}{] Ԉ HOoBu{b3D uR*ԭ[}n?K17 a#ЕabFf{q}QN툿#F^L;DՑ$LJ(q2C2i0HlPrC v ˅+Fwɒ%df-o߾˰f(Rw\PUO?4\.W~(Z* ]vaȑ%: 5~R?8jL)얢v-Tπex=PsNU#ϟ1ʕyh>E_؃23 hpC0Pm3τ 3\ɂU#Q}I`|8 X4 h nOqiٰn:J^ )==\f }NTI/7FT  5D"9Nr-Wĉ M 29>}:ׯ|VJ}|5kVB}WMx'1o<8qo7n\ !`WDž^ҜzZDŸ_o54T>em\_Is@(WWbnObA|)ޜZ*~546"#lD#yCGkꫯ=JM@ TTN: YYY1c.\_~7|sX;ǃŋ8SlUBpak8Fg"|ruN uzdRgʉ*U4H<ニ2#lt F?Ӽ1ad?x3p f-gz* j{7$#wފ+r`I'|bY-OɿFډ K1f 0bwF-r1@ǃɓ&D رcXdIԱ ʟp +pqYY7!\a(SDSj.RURJQw) ~?|d[oŲep <8#FD8uo 󣟇!B@ȿ?h&+%.ȸBz! #8; E?I$2 PXǍD#֭dY֭Sѐ(Wm&Dz'N`ٲeӧӃΩM6VZؾ_|Μ9S'Wɛ{#e^?ϝ|țW _:)fC!P|z[b-I"P%T6m±]wn9x}/˃ϟ E#ő_Kz2p?e @߯ Pj Bcy.W\qV< TmpmCaZjԉSO=)cD} JJqn=e;P CAV|^0UAQ6Β@M~a:N@ X'WD IBm)lG16"#fi#Nj/inѵ1V; 鮔 T'd' 0Eb dG-:uz۷oǾ}ur֯_?Û +VDصk]/WJ 0n|jժUuq O GQ"NUTp:A UreH9U U8Z;EyğMby _}-ޚEL.Qҏ SpnN AM"ya^yjVY(RÛp?tUjDRfSƠ86|&ǽ*0? 2(>c((Uߧ'|. $^zx7q_ѣcƌAŚoӽA} .#,+x#+*@F_;v5, ]p80g;8|Y(ƨG00y7i|(M 0AD#tD 6n۲,O>)^{-bٲeA}6m4j W\qnfc?bxwQeR'wb;W٢9?7 |%mXjס u#mݤ}ߴj~JS[_+`wʞ5pnؓ8*Y2m15⃢ܻ,9R6S%tiF IB0Vj5p? j ` .'}8F,"<_7"(EB!}lذwƐ!C͚5C.]b|r|> ~֣"k$Z a2sZ^2/T2e`ƌZJUL 3SE}Y89. =dQ}a(U c'>%;; 65ãLR֣GTX1fۇ~'N3!C`Νd_4n-R/D%8N{?SU0`ʏ7j?jkנH5v-.ʕaXK^ /㪶 .j9Zٕ `^q8<zǠ;R~EyN%7Pd^}N~fz-^Fi$kdl( I89~~ QgOf1 ݎkf(}coG۶mt:L:5.|!I6-RK>>c&e |0sLQAc4 0'"5IPZs:y5(7‚,T%JR@0\t?B|"IE_׻wo "//3gL: ;#B ܹsvgΜA 裏忬X`<O1T':wowE:Y֣ Үj[6ںQ~HHWs ̫V?;|-U-ey%b!2!qk7mFRj U!+^JÇ%\g%ђFG9ןyzoB =ްT+qؑj|m0-*׹0 !$|*.3*^yEXQ1ԯ_M6y3fĩ B~Rt2#$qUH)` Zt4c 1e߰vM+4v;T4fN dVh02gUL?C 09#B,Qx+j p\h֬Y :(Y٤ *ϞJIOD,7m.pfQBL5~셬As- H]NVG6X90kЛ:ēG +~Ox*; H@QTXؿobHuBY9F,G;sf.{#!}#SzkրY5UpB.^Fޒ8 Vj 0\h?3UVƍ_źu I6#pE,Fj\Ǡh(O~R2\ְ֭c+l6.Z!\TƠF폘aoAU0-$ɶac ^z͆]BRzjŊ?"EڧiӦ^zBwk\c8}]Eg8i=*M{{iKOk!#N(T߻pk|ȊT5l`O<딜̜^*c\}0#|r<pQF,FnNXA !Y<'1 /sVnzec1#+++f$ٸ1Z~?%axƵOm#$(o% /@K,[nY#>}5Nw0~"9sv; 0 (G2jDh޼9ʗ/5Bg-;xm'OUVnݺ U,i0@n+p\c^ٕƤ4 c 7߄s@23<׭7Uf1u?Z<+|l*@SN͔P$$tU~0BnƞЈ" %ZY?Wc2nX$Ez_OЬ$z3rto41U`!ݕGdրvHq1- W[PVژQ~\#"2J Pk=]h@$ui޼y 3gz"E*hZsNZL Sހ .*_TxRaF*sg/rV+p:vE $- F]yCO,tH~v#2@'( G ^-uQ#Tg |_J6b'1,^ǭފӧO'i3 +2&Qg'`<0N6Zwݎt-}R0"keUUUK\2_EW -rʸK>|x,J%޽{rl裏 J#sS… +cYa8۴A>F227 =W]oPGR^E! ͌2FZ.H@ G'0(禁8=#0I  G'Q ]f*QfM:t@^x {Qm$f? Jox$D Џiǩ[..廵߱TXyDGxx26ii땐 "@@@@@G+4X€$W^F@ubҥo 4@fbۿ?vQ&ɛoO?,ʡϑ~C2G#c ߎB1/h$B}vO~g[uD7@]2,<ԟ* 2cV?PO}u5y CF. N.u_7?3T(fEQp%b_۷?}t9{ 37#cF,vSa(?/q<؁T۩"P A_RzzBDZ@)34 Z%0` Pnݨ8uT qOU58qbdYƻkG+ $@H]pEHmwܐ,d?1 5g+E(<*!`iiOAޘ8Oo g?cf?Oo%L>Nᘪӣ85ɿQOKr!O `vTm)g%ȿhsyy睰u+V /Gy$澹wƃcD`k}nljU0bTxŐxkBK녥xů +TYFW^Ff6Q͈.*o yҟh)TUHFfYfQ~g nI;o0H3"0Ó3BԷrڸ5sVf9cOs=8`.SAe뇶ώ,<=j֬6m ꫱rJ|ܹw}74i̙3~Dק@޵;eeTzc 2￯\`kQ4gr~ GÆIUtDzW7Ǐ믿ƪUk /{v,\0Eiu}$QPl$ĥ^Z>S9iB(^xᅸX8q̙S;5p4j*iĿ_Л!Id=d'b tω*ڪMe8h_.23@N-T'[Ivʥý?˽8kk ,ιG3"VM۰6̙3cnw=X#N؉!ihr  ݻGP=^C<@?>23qG["r%:iC`+_}w]-( E`}ެ \İ.kD<?t_.JJiT⟈1]vؾ};Gع8p7nDǎIO +'y#j"ذe\)9sb2SJyX !)G23Q^/wej<b(,u>?ׇss[ ˄ˑ֤!j~I KaB>u»k65fVɜkEeTjw2-_FaϞ=Q۽OLK_'ĒzI2 PB i^z_UYQзo|銈Q`hf3 SU8*T~{V'R&IԆ n3 IDAT q h(#Nu#@AԨQuѣG#wٳ0<$w}wVZahذ!l6[/RrL*߂z⿑tq6[Il,(wȸrGLHB IȇzYhj: N(cn > RX1ʕdATKr^g!RTlnsY0sذa1B}>^{} ǡ*@I %u&F@=^0EѴ)`KDC@P3\sUVُV6;|#' gQH}UU!eggYry/h@QmjFAQB@@@@ʜ ci$TZ+Vz^'p%3f̈f5kڶmkL203w R\JgAS,Ƌ# ^"6 zI\rn: ! G QYl/4_[4eo1%pޱr)4sgbI*S{'gEFgyԟ>\{A+ۨR<7TW+Ǎ6f@ČA54[V m37o@p(LDa},1hb"%oقNKKC&MN?S| dmۢaÆ1}gRbl(|7c`*;+QJ I07:4b8TJAU5"9W0>j}mh}}wDClLƿlޗ2d`Zf l7.ar(eHi6CD WT>hq|?-C#63, 1;m .!]UW2^9\ժE^zaڵX~}вpB8xc$R0)< pd  "HRtoق :u2kg-EرcSBC뮘TUŔ)SJd<\xm "O[!pu 󄍌w I6lvc\$Y2z.ͮB +He %J&{V<\B\wux/Ǝh'=`Tχ* 83m9Oɫ RЫhrcAL/3yo,꽩Z*Zk.hi޼yTGBj#!- pbV/tx?b5t!q-P_$ryAb%%Kز%%(2!Iԉ=Vd c p٦x!l5k@xԀDXFb C#IsA]֪U[N[.1ƌgO 0J26=挘|}\1u"QsQڭ3Ԑ͒Wv6Fx&cT 31t;jtfD!\A$ED/1 l6h"~R,]4%B xbٶm>\d &Ūsx\fW`S&?c,Sڔifsǟݳس 5'OA)A(0(~=B<Ge ctRbzQ9ũjwaZjAˇjT`?cF? Y>bОŘG {f9?N-J{|ꆀz? - QB@@@@ʜ yV @h@AJ+"'''0|1{9>2$j5X~~JHUZ2;92p9uƅ$bMصjOWn݄#CzrܜXP]F%ǟh⃑i6m@ˇ}v :4lwlܸ|A],满{F7MU F@}%l4 0 VN\\gfjĜ9szN2j#za?ԇPr'P*iԩEx?3oߞ!GAѡCYq 877?S2W&L2k_x5k0`6/k>SPZ_>$3h"y spIdȿd[MQ_=*6̧;v ;GfC*UC!77gF-лwoԬY3汆=OH}f)h w-q4p1^鏁p3!tr ݾ};=UX?2O(YI@@@@JO P~^zs4hP] U2e%gܹsxѤIj {-}&tEAZ6puTf0${}fc N'͙V[6à {.@Qe"yzp0p64ROٳ'7nn @ 6ʕ+g̜9AO(}ft]_ `>f?=Ԟ m,_,?dWtQGN$ǻ!,03EQ*( 8><4 }2%5۷kh|?>c/8p *UYf`7,NG(<"9- mfxTgY..ߍre( 쑷zYP޿ujh( Hjvh!ESQjN~on۶ ;vD˖-rJؽ{7v * ###p&L_i`3BܙaҽXaa !msX`AJ}YK9L;;N"yY2 *Ą?1* )S$)N= "Y@.g~tWuLOEz|v0]]=7p03zPPPPsF 0 @,@t``B4,Y䴊̙3î?p5j:Z믣0}|? 'v8eV 0N.&t2JKE_ťעՌ׀KKmI IGN/?e %EѾ|>U7:+J;Zʲ^T~m޼W\qZnI&EIp[J^Y `02R]O3cT(лWԮUv|:uj$>&J,ׄ|9J )OL0I Q(((܀_:ni)Avj|i}/'_^16mt>III8x`s4O~"3PTTvȑ#qgÇǴi"'!8]7^/j-hLyKG׷)p8 .M k/_n6hƠpgdynʐM ">|իWGaa!VZW^yyn7@QQθ5HH j(t1<)30+%4bd'z~Svmlܸn[߾};fϞrI|皚G}&_nv`$%!iii2dxvڽ\.\.xt:u8x8 $*(((p(((=,ȤJ^f@!Fej;Ӊ^zaƍQVV)S=NJ4\s5?~ܟ_1(|]/xZ:[ \yw j|_ol, IDe2ȇ bL'ÄGp#R%#w6=(N4 cƌ Z?tP4nӧO{X7qW&dzˆY ` @NAO3O)I@I#55%h|yyy/ЧOlxc>WHon/TE{)((P- OdH%`/Ӊ.(X_{5W'yTzꫯu֘?Gԗ?qtkh2&rUZ_gZ=vQkV2l>eEHQn׾&FD'#re/15TZZoc #F@zzz%KO@*Uu"ϳ`Df廩p@+= d(Cdyy~f wn?駟ÇpBtRtY.RwF3ag9w8uгSP);+?7ىvG!UK}>PMF)(c +G_CR*h?bݶwnGwK]YY  <rOzz:[n]1!!@\))peA&y2Vg8u<=Cge8+"Y)2jsbL$(YʙBp.C((CD!2jp˞iWӑo;֗^z ]tй ҥKÖ6h{ ^%.WRCD&L5z qYL@24Fg'ݳ'w@](9|%Gq?.2B.35#V-ԨڵPY3$Iߏ> sſoG{ ̛7϶(^n/n7TW缕,q0BmNpӷuz_BRZDrng2&WDj Y͚UGo߾A'O,O)Eqq1q̘1|N~1&ORTΌwtAH&U&h- )Ƀ_n駟)))"`W `F)+|3 [ӝ.!!sBgYubpX bip:hѢV4V;v&UapƿD>?IΟM\(Й0Jnf;!6mdOp7"++\ I0gkT) 7Y=`sό˝ @eCrpIM;#S'2&JeM d[RiF ҥ =CY^?#bJV@SQQɿ*@PPPP=I v}v8k.乬[GԢO} N^7af㇫Y۴ٳ?:UPëjGŲePzuq,v{DGKr5|]Y:JJKE)tt? _Cj$4xA\.Q@{,}\ P3s˅ mcx= ˅U*W= ͪ^@Ԩ" gͲ PCB$ 1)(((95Ϋ8T@8R?6Zc.((~WQO81vyyyXtiҐ~?sOb4GJʟJVB,A#m;/hիѠA GMx\C/}֡K(.- ܖ0`avftQ N4x22@n]0@ LdѧO[@/veB0(ma3@(,vʨ͆`GJNFRVܩp8]F<L<8/$h57j׮B0o޼?SDA4ș_3,@1FءT@AAA.w6Tŗ+y` XuENNN}:kZ?A.]аaCy:!6%})EM7UΟR(4 m۶Ȑ!Cڏʕ+똚7k% KOϷZ|J%:pwZ:<p&'A#O"Iϱ<|3F= l{XbEߧ[3O$1̿ϵ@Q@S'"~wT@AA!BE0T@$-vHOOGFBu̙z:w2eJa(**²eмys+V@II V^Ç)+qSJO-`H.R6~j ~)ݻ7Xx7!AzZ.|3lߴ= 2l3Oc\psUb8pܹmgHڧQFҥK}gϞ&MW^رcGx hw~KU\\=*+ `|ĈG]лwodggc(,,L>]/>ڷC|S>{)OȦapNO;-iru@G<-M%}ske40rl{:۷֭KH3ߢwhV9IrFٿ<' ?RPPPEcD,0WVdP/^-|0^ ?ofy.zw!HrRB4$uGF"  0ЩS'4m4h?`Z ľ_xa+dff͍J!7jm;ozaOWgA3r( PPPP_ѕݺu '|}euFnOMpeV'g%3J] *8{ wuի]b s˱uOXx|py#IH̄'# c7)3L'#tu>Wj*\IIpFi;5(72ܼ]Dd }ƇNƾYYЧ5z}s4cƌ߿; F,fh f_ߏ iB ((((vZF RUЮ 333䘧NZ.?9x<9rd6l#GÇ1tP3x$F(ER7V   cϞ=Q]1 a/'<<3'Lb0K7 OAD0b33WO`|eqcf? ja nf,\ ߏٳgۺD .??P?s9X3gu)((P? !-009.|>8poxEVA"n;n8>|=z۩ҺT I99*pqIT^#GDII#9f@QQfϞr#ݻwܹsi~$XNs!T[<Wי^A "Bş0bDP8yeb_[&˄uDfD~?D!:&猓J9 CkBPPP8'~HElHT zhlۍuСqxrK} 0jmA V0UziGVVZl㢟\&c1x^5 8p ֮]8n8p˗/ǝw׫4YI^CuĴbuXHų^"['"#|+ ,s k+bhԇ):ưڶm53Qf~$ {C^A 4BEET?0b#22 nT@AAA!&_Qvht-VAaa!>f HA۶mm-[?IK>[bx4̛7vs=+ wq2220eʔgs!//K.EZ@)5L֮u^^n7,sR+շK-~g]HfA &B<DHB8eAƦaQ(**N1[5 ? R3I~81/EPPPPPs.Q7HUTACuW] x㍰KJJ0s̠l媄 T7B!bCѥKuvZ\p꫱p¨B>K.ů'|I7ƽgYN=d/fL3k?1DK*0,lP>c̢/5\vhժYreҚ ?YeFRItDsB @קOop8Hװ (((3)_ x<dgg$pԩVh۶m}'N:|(Ծ7^r%lذk_sO:MгgO_Mx| _cǎnX&:8)Sԙf:8!gZyLX>( ̀Q@s @s. 8rw===]VKb‰%#o`V?bB|g3ު &XO@րHB\r(;vio=?|в&<;w`CAA&ͥXv-6mvgD %߿m eff{AAAΝΝ;q(&7I1 [>"AB|DdK}*{ 4"{ Ɛχ$!*K-@Lk=ꫯa:BYYك6mD%(zLBK柫,2j!)`|EPPPPb%]v Y`>|8V1x PZANSRnvm?~b Ug ##j 9w}.O<"dy-[]w'NʐvW(R9s&%`-[_~8vX3f lق 6ફ *{Ą>y%_K g9X@/xg$Y-Uy>,zsl\ʿƁ)t(cV0IIrx_T##.g*`E_NN> h8U *] @<+]vo=)))޽{}7l؀i5H1ix~uQ+$ RSSѯ_u'NUƍ >rssqȑ[~}7>'OF#%u^oQo'F>쓭KAaAH`_gR&Q.)3/"8Cu$ƐOhfvaF& U?@} -}[9J@AAAAя# j]y:ԭ[@ <.p;@]Óp@rpdfLBHb,u 1 6DZn5k`۶m8q"\.WBױ)'YIica]-g06J? f BcC?@A@$!-Y\$bΤ9Խ{Ta=hb2 a?KЀ5?T @ =T@AAA!A_~?  ܹss9p~ᇈ^]vE:u"pf94p]p+V`РAAp5נzAwڅ~-" J*o߾Xf 6oތK/))) ݋־x).xBtxK*K^O$!{c} 1Dd9>$]K>gfc>YEX@]2\P7jx=*HHiI}?RGt\T@AAA!r[ԭ[A rss&7s̈r;x^,Y]t!Ce<;vȑ#R@40꥞~7)? 5^|Q|yןgUG@v$$r6^V]nD',m !!V1ByRĠx4:v쀲2x^|_T;PP wi93/W @Lfp@*((B9 ((6pnݺ'N,y<\wu!qHt >RnV@ݺumږ-[CY9N(4i222Я_?|7 㪫ž={zj 6rxknȋv A"H Q&͖-Hsag QKcchT6} ZXF! 0*Y@)B@AAA"0T@8-pzNw*WRTlԩ>wۏ1Rᇙ=UxC!G ZVVV;yغuk{ (--EYY9z^-9u NԩS(((d>ܟW'=EE(2J56 tt~ۋaGjj(SiN*DQQ! QT"DW|^>S(,,ĩB:U EϩZ 6mJ$>l`uNwF$WB @Q Fº((((B<,eõ"Э[7~sٰa6o , ![.Zha.W& q”kz9BKKKjժz+NgкC%4\ؽ{7rssѭ[l}>_\BB@A@;\KII#QS! )յHt~ *CYY)9G1yKرcU⧟RӯR O>>1?z_i-ȤA3@ׯA.K"Inᚘ_er柊Jfd-( (((D?ր@u `Æ QV-۠9Nſk7S>gQ$w零g1'2d4iΝ;cܸqaI `޽jVfM_ºupBTV-nߋxAkZ ({ֹSD7?X;S 0jB̞x08dff`oq}+Yo< ȿYv|>L X@Ó4 TV HOO}1FE 1KEeau,@'00BPPPP(kW`Gg}!e۶m;-7|3^$)I]g8vXԬY3gظq#n˗/GzЫWEn76lĠAPV-QL%g?& ߋ!֧Q*'L:w=ppt Q&UؐY[H?eAwT7t6 $ ph-c  мysA7 0Q\\Aĩ" !SLpA*4iu!h׮[nE\chٲ%z}%|cݺuصkn3>pXuLep白–OLz-A, %% eex鉸첮cQr Cp֛|H‚ )$(>]vBVVft?OBb&"`-2L8128, qPDCX*d/ѪU}+#,@U]][=Ԟ`oFݺuܹ7oرwꫯ?H踵kСCYfu>l,IJ)(%>yPOs$P ?@EJfe1ܵ?7k¡C㚛cX2d `P2 )ӵ(:I7 Н(+!(T[9Zj M"(̿ 6R_ 3/9*¹ z8F9*."n*Rw\s ~'4 ?1bs^:t邏>k~\,4 iO},ݸqpGy;~嗐~:u*:uʕ+R0~DuoQQeL$EBIVϙ}b9V[>B䌴08u0xױ~y~N*ENN@QPTXd!0M:~BNH}w⋯#_JSOd] ̡ v`lY !ΐ U5)Mdh3ڵse_IIIh֬YȱΙ3:wxOyK1x33~ם R5kI 'zB_;w&DSSSѵkW,] uǃ"Fm: IDATeWiKӴ{1+^\iD15~h~?~?=(j&ಚ?'TӠQ}?kiF9/M.7ț[$gp}wDqk 6&#b. 3LH `kGU qXA<䠼4iecǎ +2|"-B_IR?ixPfM{ߡiy睈J)>s\wuXtie˖;v,>ǣjժ3lH}7^(A4-r B&*:RYoC9XZ&3m: =N-VzJ5 x+P#zB퀷FpMjaHY/xj?_}j<P .R׍ ((((I#Y?\@(7րk&p7|;v*a 8J"\ !(]NbqsW^.п\.rssqUmXhQH+YfZjݻ7>r!Wʕ+1rH_$&3mf~xk)9D6bRsѼE[y*s>|8֯_?tzYa0m)>|J Q`f4RpÍ=ŽԩB1m"+?<O@wT= QY*((("d h,H e`$kf͚rAs{5NGfе3I81ÌbuY)Ĥ.EPx.ek«j|ذao۶ GF5pɓ }Ǚ_bƍζJ09' b( r(H/o>d"RT DJغgL4ocM@qqq`6m0e?~ӦME]V`߁Q̲y=H+=dRoJi'A( N3O nG!xj':@k2=ƶ@AArPPP(WCLeg@. 3WyXv혿 333E ~РAxgq)NJ1ֽ;}T^=BQz]۶mѩS'^ڲѣϑ[n}p`„ xt:guäp^58.$Nj (a?#O !>v{ۇ=794jСCкiӦcǎa5s.v(*)Lk\<rrrl !8z(>Ŋ"Ksq'njADw#|cƌn6Bv튷z ģ>*?ڙ&빫o%<`f9O0o;C˻OKKæM{ntpԫWa?g|Q)5R˙j]G)$eBS,ͯ{pJJJj*OdTOU``y?8 D.Js@AA!.R ]rNvd$gv/GTZh;wڞã>;C"._=q>|8l٢.3|>lݺw}76o ݻ76`йsgdeeĉ v/kz^o@]`řv/Lzfד %Řxr !999HRbȐ!O^z!B/ Hd eB]hѢ~Oo]EYI CjCÅ a pX3̨`>s@* I}ݿq?4![w-zxwqG lGMCBk. .P⟌AlقrKff&F}qby$z)š=LO?gORr/ƌBaaav8p@ g_WU G^ooQ^^mo|Pc^fd,;Di=uLb@4͏qcm߷ 7aո8?ɿ pG{' ]RGAAA7Od%b]vȱ.X [@y] ^^/MwBZjAj8;*))w}f͚/%tF5kN8ѣGq1OW]\e 6˅P!())kDvv6z^K~0OMMť^;v`ڵ3g  W ߯aF˂O̲\n+*$W柧Qdg7Åf6ϛ!9/Y^t5"@AAA*48J KY?Q ۍ֭[YG9 4e]vW^yEL?{m 8P|ϥx'ѦM\veعsgǾ[rJ۷O+k5b+7C)())OAK} 1##SL-[f4mu_0o<`6m>sA~~It&U,?#&.I53m-}{ٻw?~M!2X/M&?'Vr5ah##PPPP[)hڵ Z󝮹0`@mǏoc׮]8~z- 'bƍ9r$RRR{IhLUTw܁wť^ 63~6~/fed` /8rc8&Éj+jaװwބw`(((c=Ԫ3c ~a0v1tАA5jDKS_ׯf|FE$ϤҐ2Q)"*f`W{hNvlR|pBT-=L1K~|gFK#L }TPPPr [nWO;]E@U=zYb߾}qE$Bj}߾}#oɒ%(**<Λ7^x!Zl_~YUIWZ}{1۷ԩS[{aǎ7oj֬slу09A A9II)X t k3f˸nFlڴ ۷oǰalZhΝ;_NNrп 駟q,>a'JLrF~,s%d`#,`f]0QoUVA>:̘/~ݪ C@_Ȼ  (((B9G叴Mf͖̈́ݘ~r)v].ƍvq-J*1ߝDFi0V|rc 5!3bn³\awZBMx7t8D*R-Q *0/,\0 T jTԭ[7,Y<;wÆ }ףy{pQ˺'Obڴi}mݺ۷E]b[o6pK 1iҤ֍;rJ\☪adbrĉcNjwqgTn9CBOR(.xո;Pv].2JW_f͚-?r˨B0fT\9e.]aÆaoVI"{D3'zf^G/dq7/Wט;CӨ;~-;v B +?:$矙} t̿^oT@AAA~H TjԨƍ̴w}>wF 0?~I]h$c Þ={ .DZйsg,Z(1\pXz5mۆ^xB ߕS&\.[Ϋ=zbѢ ѣG|rKص U{k%?'݇Y4Ĩ0> "C ]FбcT^ȴ /MGZZ)*h YF %9VIЈ.J@AAAʙ%`,p:w G||Ͻ<-srrдiӘ?/''/2Ю];uwӉcڮ߿?`Ϟ= @<mB41/YqŲwfФI^?#Zha[UqnC3رuV9r$}'MdLx\۷믿SNaHMMק"}޽?-[Vn֭<]ɘ2eJо}.L:5d?_"c"dgKZ 3LF$F= *wrh-6ԩB«<{ܵ~?5aq@*((Ÿ0R ,/N3䘟zr!ΡM7qWx DqΝh߾=ú 0ɷ+Gr]N:tƍ?`Ȑ!HMMUd?Cii)x nu]8 =bȐ!p8߿?d|ͧmn(x>x\n%/@tO@fJpPPPP8}D8@e_~yFUj%`W$X% P{ilC1ԩSj[Yt:1-gTc?fTPPP?7h M,ZZ6o.N,^,ÑJkk׮\.f͚e;v`ŊAJ^?3:u6m`Μ98vXBwFF^|Eahݺ*2m6t9993gN8{<lׯ?>v3fa!!jBO[p1EZjׯ⋨ݾ}'Cr?SP3-Fp @@pa100>xM}#ӨRVB(1J@=+((BxK@'p8PF TV-dVW^ ~HJJ mv^?:.FiۣEo>v޽|r>|#F;4 &L^l| nRR~ilذ[nE]$P q߶mpmz葧,M,gx%LbDdL mtS3 TmvlN9( X̿I !1m3A@AAA*08Pіvwo{;wķ~ , !QFDK[l9l#c ݺuCƍ۷K.rOb֭ '##={D^^>#\}x<*_Rxgv1qD f͚xQZZ &EA{w̙gܜeggu v`-RVOp{#E ^X#@x,AWs8Uz}۰a3: BE@?L H+ *=,c ԭ[~ȱ1.phΝ&C)Sm۶+F^|E7t&Lؒ0c l۶ }i-??+W⪫B-3ϔk+WĞ={,߹]pM6DYY7wNu\pA)'kyOHKm/8bJ{ι *Ul #-=Ul3@X3#  ^p T4QK@"-աCoa[n]v}~(ضm𛗗I&vcԨQx.]Zj:ӉVZa֬Y(..}݇;Oe$X|9Zj.]`Ŋ(,,,cSNQ;:,\{ظq#6oތ3auh߾X֠A5 ^7*WO>4M/޴ě;2_/g(7m "}i>a; ɱ@&"(&rkw IDATST ((((T8я% PvX6m*leee zHBH?pqAjq͘1 6DVcǎ3whݺ5ƍ'/-[ 1NPxIO?rӝwމ-[`ݺu8p@QQƍk)2;\kѵ^7x۷og}mۚ3{c4hW_a˖-xvQ~}'g<r q,Vjj{U@!ᒜPZe%%yxb^c? $0/(өlT@AAA PXS t:mf`ڴiz\Z9}jժa}'+MJ*o4iw$''rY'Acؽ{7^u4i{Ν;S>Q1tPl޼| ׯoglכ8q)u!| BPRRw19S=q}+5gҭ "/E MO.h Ш8h@drhذ!*U(㏗ _oN:aɲ:<^m_BzZ MnѢ{9n&IٳgkEj0mڴ駟bp zQOÆ q."xO9'Sc[$ҿvi'ސVsF@:]:ߚU9}γfY?䟀N2ύ hhhH @CÜ9sҾ_+VkXx1/^[jX\wuˋPP+L|&~"J OU@sQAòO<_ϜL]4 R5?;c,۲(\@CCC4444*''X+M I@5j5j-gJBx≘]~_h"qѲepAXh#{/ıl޼> N;4i n7 Kb R Ĝ֮]xvnVG}DpYg[oZ1pg⢋.:)*zBp3Έl 7,1)b_)ՀPXSJk`Ԩ3 ?ֲڀ`W]CCC4444N@XY:U$vѲeKc\b8__eFP(+ُEGi+P8}tz{ewBNzj,^_=t?kN+χ+WLyUTߏ^{ {nrz~"?~*Uѣrx&"tA?#SUCԯƍ(T& 1Lz=ŀ @ bm:QAhbv'k hO& еkW[r+7a„84h;w]/$E~׭[ׯ3<3b+#O /5k`h۶mʁSsrJ ͛7ߟ5֭[c޼yضm^z%x^BѣG9/??'Nw}/Tk$b-b`JF/Pt˨Z]]^O`(?:%/͛ EpPP{'t`qhhhh.D?рg &` ѠADZb,y}ע~ 1f̘wލ'|tMQ`Сi7n_|`?05jIǢ",[ w?|̝;GI>ڷo=zRJq-?fԭ[> ~qQ)F>c}ea8sK/T5DٿKhhhI(KT^mڴql駟s 5k.oÇ%8b t͚5èQ6l޽{W3O<y晴7]w{DG ' 1|p4o:uªU̙U5uV~FsWJt2E;w. -fv,DIi JKP\RR|*Aq%(*2>;qEE8QTbs*62_X崟W)0_ *C@#&#GOM D{UF\y<ީZjXr%BFMзor=wgggO>#Gp5owy'7x$g*I۴iƌnݺaѢE8vXJPjpWO>=#{C cN@ eRݎkd2yn~' ٳ'.]'N=o֬|AbƍJJJаaCs91ɼL%w\Ì3p%`ҤI3f 8 |>:t˗/C ;  "D)h(R'5Q㧘9JUz6 5jTŬY_"F, xNf"gvajOiJ)ZlիV{9M,c͉SwSCC:' FRqߣpnyTP($F#wK֭[3gvϲeмy"z΋ XjՂw\nݺX~=*UΝ;-m-!CiӦYYY;v,*u>NRNANN-Z{YDѹsg7͚5֭[ѴiӈnwZ4b# a޽]lߛ+W .j{Wj>UUʖ{{Ǖ) 0$7jC̿@Fvv6>6;3=X =.M" rO- w/'߉ `}řg xވv㑿"8-HԲn8i4>K@u^<j8MM4vc4iRq-OK@X̲B,Y$~>fݻSLAVХK]6e7Cp- '''Ѧd2N<|>P444t@CCCb }ś O4HBvJ*hѢc}W.|~\_tV;wNP~}|W(((QPvm?.Ν:ukG}}lڴ y!? bʕxo9~vWf`J|F 0p(d$T ?S2ؑ|H]Sq'#++<<(1 $444t@CCC%`:;wv.++Ü9sb{:-[jG]wҥ8|p z 7ƣ>kݯ_?,\۷oG׮]s-[/ 9%\1cǎoG׮]S5I?0*(75D(5JaQP#^3~G3EyfQN~{|Ht ~+~ʪkw߭0 .HeP .g"sMtpKCCC4444 >KU- @QJ۠|Id׋%VVV^x2{A 4O?m۶| R{K"7lǚRYi>|}E֭/b)/VӧcǎOm{gdG\#9)ɪF62IOMx+Ѹ10ml2O97U<'|7ԮU>\c6}6=_o;~tDi_~M[qQPQ@xD&fx)~N}&^I?Ap:0s7|P(do9In?uʕ+e>~:^z%r- npݶ*B;1?33^7=z4⚸\.%a4E!BRys#<\\ rrr,)ȑ#1y`ִi#DkIo~ 8{'aF='|*1?q}2jL_KK0q4GQQf}:w=`!G8,TI/v\ҥٳQXXԹHr{w}aժUذaꪄB 6஻9眃C׫W>mۆ7|SSF i&bPVV/f9>MQ?Gd1'Uq_d` (…K@OQϸwNWzwC0vc[SQR\ DhP3HZ#EuACCC4444R D-f XZn͛7͐ٳgW% `f?c:u`ĈBxѢEeO5aݺuڵ+:t耙3gi~ʕѷo_TV-}',hӦ KoĦCF&Y,ק\BAo3fdooFFF̪_wւ_rh0B  Bg0Iw絽WCMD#(40#DCCCC4444  } @"4URuq̮7]DVVVڮ9眃 `ӦMx5O:$'ZlVZoiݺuؼysרO>6lV^~_~u9-RK9f0DUȟ'`$ G~7##J;}S?|?xGzUZ ]T\cǎ8v?cǎt| Ӿ_~`8vʔNƒ$$]t@CCC4444~'T*Rp\֭ !v ]b㢋.JT\ݻwիߣ{ήP p۩%xvd`x瑑'x)AxGsBo$rرcqYg94'"QE IDATހWO ?ΰϳ|>|ʨl0GA ж][4jkBw`ޝxk$8Ltz1կu;w?Z#X\o!={^jk 6m]{o EaHOr@0 S'{Z֬Y7v>X.|C&g}[nѶm%Gc5`d  'B֭[;uxR>7m۶Œ%K~z|8TR0^RtM2B^^rss唗XPR%?c ˓| :tVZaٲe(**J|UT ={ŋ?SNΖaر5J?dv(Je?1_d(0O̓U`hҸO*..΀6`iwy. MS 3?>!14 ?|p <-@->:t~%%%QE֭[N:רQO?3gQF'{tWK!˖-^z ǎKy8z(T"`Xʕqeɿ۵kcbǎ4ߗOS͟W/d0 jL]Ǭr*!3T 0<䈘ϢCQQ1rrrxK.rsjXHkB;Fh|d9!ʵJ(hhhhf N ?]Z_|% 1"G".''{rss[oaƍ=z44hUdV"{ߛ/Fzp7(8{l=z4 !>|85j 6`ʕ6l|>&$p(ѷUaz_yfd:R9c|!<τ=..xC mԭWZz1,\n<CvIx+m}PRRfQœ9 x87tsNbߛ'98Brc hOG]v'ѣzccǎxc\{H?b._*تٻw/ƌf͚/ݻSG͚5`͚5۷o{_mi7cPPP3<3fL#kf)\ }_g!TW=xj,!l=@(6sWFJb7KM@ƀb1_m{!s_F5+BRܹ /G:HkhhIf N~mv%ZlXp,_<ȕ`^^ΝOgVN 1`Ԯ]=6oޜ>^/Ə/ Z}gS i$w-n38T3 ?#/,3B|xՀ/gl,&P'0TP a໐\:luK97PRZo^/?Xp2!p`hhhh#iK0@]` ^GN; UV%xNc}w[omf͂-YN:*G}/L]{K_3^Oy?1+"-?̟<@)`h"L < 2(@57 ǍNǥ]|<ddx~+jԬzjKEQ MtXN*Vt`JCCCC444hUZ:xI,G˅Q po+P#b|ǨVn̙3'|>{ٳѫW/S=?~$ 7%c~Ĵ3xI< ?uiٰ/D̴TeQ[4-T? w#V~&q+/O1`z=sc+aKǡ1'xڑxC٦&:~9W RO`^z[myS=~f{lZAYfpСwŬYPv rgq dž1c`xuA3-bYibT@񠧜S"G€~3Yz"HKa(j5#GѤYo())IoOi˟R p퐓 fcߥ].+@`H礆hhhh>@'bs=ױ_gL=(`B3EщJJ(J)PQR##vgO!^5WŰa`)f͚0`>'믏X^T+?}}ˇ[}Tg"nWϫ߯p ?9~s_Fb'Bf@sԨqC<1gތ݄ SQ\\P($Ok_ڵkYM ш:f}9.7j>~ZOn Ш@,K@;ŸL{@]tq<{\@/ה?Ci CqSi  ~m׃<7o߆kzvǹZEQQQ_>ϟ77D~~>ࡇ]!K`>QdE?|AHaU]^}fWZ-L=OK{ 0ejI17Κ5 eee$w~%p2CqQee 5X5x\())ƢEEΗe&/qєƘ]bرcJT\r u^k~8?Evɜ<6{uP3.b̪/*} w#C 0,(cW)|Y RP\Rǟx_w.mڴFχP(l 681c|#2cSv=vz>x`$JeU:59khhF?x<@86mڄ-[hK@Rryq!6nOYq5o1^(((W_}+T]i=y,xزem{F_YX?SSϫ-j^~pNWtg+syڵc'ezx|>_sdjKE}̿ 2? )B;5k7F*L VEThhhh'p,Ywt8 TTɑ(6{q$ .Y?pToݺ5jԐ#_͚5ѫW/}ؽ{7>#4iK{F 7AEFJ?%FT+zj@UDԫfyCQWY6or|ۀn Vc`({ yǍ{/vI|H }vs~C!s"#5H=z:F%`Ŀ<*j*UV,{?Bv6?6mZceׯ֭[x<1c&Luutz~P%r>W3䄙YyFTL3_易F-jI 5AXyeOa_Uqr$ٖ`' 8ppW3v@VVt5~ϾDqqIT+ Q{@khhh& .%`,oE` PJ1O0!T!:vB> G[oOy :źk,"77ҥK/G|+ĭzm[V4R#d61t? ~ J>DsD?3, 3N!2|R7sW Bq3f0|z>V?53S¤?Q 0I4#3fl~ &A*k A=~B8e%JI?5E{"`F &1u}!.2h@V#Y`T9XBZڟ;v| gC^F)>)zB D]d^CCC444NIBrfoHU //m۶u|)u"=v|R3N 4HAU<3OMQ `q-AD(lY/b p?.nWQ#/LqsADbZ BmXDDd`(++wyޙ23@U"ϼ-⌦#LpSӼXNс H//K@ T.kԩ1'H,/9n)Ĉ]гgwٳ;m{W 4jHcΏCfqJ0j(̜9︪/U ?I%yٺ(wZD~%̛LjPPC4V<ƨE8=vV{BOquxgQ5`zC+VVBUPkQ8ASV!77fqkVPR㯔5$2?{)8xyzc6mZd[@ew޽@4kVoߖ޽˗/~q\2dVɓ'ѣxѺumNmD3L"q< F$(<ߴ3@c>$R5@6S&gj [Y QYoخR Tk]-J|g1c(Bf/6u?' vZFzY'*(:80?ipr *sϵŋc׮]%AVv3}*.g4)S&e}SO=e}c׮]߿| ?feD ˅gƕ_._|;ط`D?IJ~QTB?]D?րx@ SD e rFNNN1!{OL|5[bmTo>}:Fi?wܸ-(҈>9y5Soͨ \WM%~W-)By?3 T 0JZ ˸Y`v~LbyP+u?j0M@f"W 0K5h38v8֭%:u8.>l36]~p\x^KI?^kɸhr:8,ZFspݸ_klݺ5sqZǺw^-[qȑ_Z5L6 7nG}:uƎkΐ!Cƒ?P)YE[j3疪ei(-V+:Y5K ?jW*͆$rԂYD" r0g4 mUf!j@F PwժUM.] ~9Jrq_A mfIyXhG#yfj⯡Qm4K@;+ԤIdff:̙3eV0fX={Dݺu)mC裏pW+4h*Wqq)`]5So0Ck;y#c EjVϴL^fBf-j/L_9F(D4 sĭSëD<>c{~~oĵ\}%N;NkX~3nsyz9d둓 'IP(RӽDҝ5 (> DsHG //s'8qbҤd//6m;b޼yi~vv6.]7xcnA~W`͚5/liPL!Wa\bcsUo-)f IDATE7~}^9PȨ/2n ֲu|'"@d,ZV#j =:^`0n/Avl ObѲyXRko +H#Ա-?{PgH'NgS ~eexJ*(((H1֋SƜ1l߾êU_Eʕqш۷ǪURBdjaf~-`?v@8E g#ٲM2jjnԪA2PfYY82%f?>Q+eof*2 ҽv'Mx%nُlTCe<_MŸ)7ћjUەڗ3so`jPnif˳N܃ EH/Emz{줨ąr/2ƐCPVV&n>JJJ#mguw x^3wng'dHZcN$HqjOƟϝ^圲3\.3A@TPB8lI>=z/FΝ#K8q}Əo6-W^4h.2ԭ[{,zj,[ \pA\Ǜc; ~+ Al? wgg2w\.3F@ef gGؾ4D 1deV?L8ugAC<^Rn;o 7ٗFtCdحw)Y@L\;ĀeۨQ#l߾Yff&֬YM~֮./ظ֏!FvR. i5ʱ!M9Zz.2D([8Uݡ C `qVڟyx]IeV(bw3KyUzrwO9rw=Y>@ 0f<X("K*_X ;6@!%!ՠc5fPbxNw˧& ++S>3rssʁ: t(+ۮ٪UZVߩ  \XV .gc縆Ʃ -q"UK16~"$vc~衇*)|r4o_|1&NߦM^VСCZ#|VJ p^1u\^}0>u7E0\M.Ɖ3W'\0Ƴipl/[5SU)'n7GbĽ[p?Gao~nD# 43GBag0x(1B- .dG ?iGjgHap,DZ]dM=]sV<#3OYA 宀Ly*Ea'D3bTӆP .%TٮyFغ 4.Z5VX(PJQZ>ڵ?;3$pk[9p@Yt8h): ,goGc9TԡCZ`ۗ~S%G0{lo .+( ׯ/EhK80uT kN\A~0|T .6ؙIѻ aW# Dd3⽉8z$+a2?K;# U~(1c E4<]VQ?sR_0 )0( Dؙyr찈yrHpr)NE }'Mof5 ,|"v !].PV-2};p+Xϝ*bLhhhXZ@CCςP +hZvzwAaaap!c uźuj *U† о}{[=гgOZjo `ތ"!=J >Y-,r7^-&3P%z3D,aY 7S B^@—IжC%8cU 'VQ~D>m<$X)~"`Q'a}"P`߯1S+Q*,a{ܶ~ r_Z[ +ue>Ŷ266)(2dR-JMeAæMlC>}bjdddȾh: u@CԄn#*x^9$(^{P^\ ,mg(=5k38#sssѩS'7ok.bbʔ)q;cS~?vn=o`o!x .bzi켏_dqU6^;- u2T)},6z/ }ټfQ3WϘBsD2+Vs|<5Mm\zwן@R%)/7D/F LrL;(gϝT+bbf=cfѧ`3UsǷKTj?^QIվv*!&L#ܑ@l+T/b R@lʐ>މXvyatxOVVcXd ڶm+?裏l?!?bq|?$T̨3)oQOz˒KFa*dFg V XAZOqDq2\ؼzZ u-~nNs!y]f`%f,0dȼRI#3XTWa {^5`UQc5ԈTroUACunP{1\+ʱZaV#PFqCk"kC W_;YV̆Iɓ2@_v-ظqG#~';@l7<D↑ N:9jL0pJ%#Ku͛7cƍ+WbȐ!8p cQV-zزe fΜVZ&Mo~҅()fpqZJu5}j*B-Yg0݈^Uj6Wfm/u -|SWu[4e(\Qn¯[~J9cm韏o̪jN(zn3oV#@;q vC dخwo 0+#(JXvXϨY=/@):L(7EШq{@l; l(V{\9(.*INWscR\թ 5 ]vvx}T44t@CCC Dp"v8)6;  />8˫ ڵkꫯ\YYN*ŴiаaCt:>CPJM6wE&Mz>^۠V{+CyIdE='u{0SoC #2jo;. 5s %m.K}bj@3,ҫnif _~o^of ]Vj~yu+:5ܮ(PyhfDxDD2XX?8 =s="{21!)bH&*, fJ'|YXS|] .RC@Zգ~OKJʰr8)G0°aw8>N8&x3,mkhh{ȑ#i3dgX/R^tz9ܿ?o;ֽ{oO*kkCtѣGGUPvmSLѣGha @vv6.袈m'K#–0!`WuݤRZ&!S=! %Sa~P֭ē݇ټAZXI ST?O"_¬D{8~<:PV!j3M5@&O`q3ŖOSpdx 0-8+l l yTD_y Bc4L۵Ox%pICRRQ O14Ⱦϒ Lha;xftڊn|_uH^[w3fQa4M^>F/"(OJEl*!`6tQ@&x cEB''z$Pa PeW2?0vr068**3!êƵ^'a11fe+_lH$^TK(9cdu\hIEZCMlSFz^ވܐ󦂃rRiTMxfx'݌eo7c<|_m [Rh'`Ӈ- q x#玈$. |>|ln%Թ6 'O. IPMbk1+Vw,.\ .> sXI/Y(~*_( ի1}tR98;lߖǺ5lސŪx`eGUi2&>w&)HB֓K IDATZ πHXHuhn;Nd'!8pY}pU/?00QkЯ@ K|i49#Wh;FU3]Lr"dId`m5ZM2Aē ``B "B3$ +@I|K Ϙ 6'nO=サSx3s/D@jmK^k~߄ϝ@1/g}?)}Yat0bL\./ݻwO'%a@4PMX@] p…D+XZi(fdp-`퉉O>wygbt4pwĬQGԩSQWWׁjނGfF[@* &v16y*e"26GS@ 8j Y*pM*PUu~WG5 yc~ЎWX.,[C6@`$s~ 8f렬1$`acdu>N:&/FP4=|BEߦJ=y㑖(k@ͅD6%k PE' yW<*zO!3cPUeW/?_܂^߁ N3x>iHhHj!.AaY:"d@3ˇf썈&"SOob%TcĈ8묳J6β\ ..\%b@4Pg}/Rb@mm--[:}bE˰a裏T}쫖K".,1vkK0cЃlCjj1h |vrOwR cWs*`(JAxq pu9iG+,R+ UVUg&ʲ^Ң'}'p?TVz@^/nh}S +,ao@Ȏp  P ҕK@605aY-jzT+A]{a\usRs5p=&89>XՊ\sgobz}vbF^e,64D |cNZ1{f>ۦc(V矏tЙ$:W…B\\p"OՒRA1obz/B 3ƐfQSS>IA1chmms=WtN8_|q-e3n~'8Gg3nZ07U|x&*1K@0ho8j|8qM8 jRl0%ܘ¼TX >77>sJ# p }zLi8L Xꁈ=A3d7sV-oE8 <7(+{E0WOl54qr>V, rqۀFҕz*nHEt5=O +". 32 ~9qǟÍ,VU-H=`D(EΓQ݌h 0fb])q'г>r !<XA۷,'B6bB .\O`9m *xꩧk[lEY]P[l9䐢싆,[ {.>ކ?z**Y;#ĪoZWݘC Vi6b`U^gb.83uEP/<}K+ƾ]$T)=S mmnf }w ȟ2Z)Oג$gB){[3!8CUHUPў % F\4X 2:!az0V^#AϮ_0Σ-k Xv"F f8v5՘9}rT UOF¾{f2]= >pCGuï~^I ŗKL͵v rpm.\ؓp .\|t3%* |Y*'ZLXCGcc#xعsnhhرcνp^Gj^z_pM0b3qs˗dn3JeSek2 8'2g[ ل\GSJS1hVO-HX%J`pg8xz/<+`lj fR ʑ5ٮGTSam;g=^ c2`CX-BAJ@%FUזVUb j/!5>v㮛VϿ7aޜ=)Fs>5XfR ,c=IIFHē `CO'hmmEcc#ʦ'趤狁{u> .\(5K02 f̘k$ѣ1gΜ~ @Ś5k0dȐפEp{;vvx팵-z p@>)zVO|I΀~ @Tmd? FYF12aΓ[puk6Ah7h?(5s5B[UF G)|;C0h]!\nz5`X +y]ڏ0`b0z~ bBu,+Q9]݊7סCgR=` Z?Q8\bR){Ǡgϊ7@T*}wx%Iz\xᅨ,PP Z % blp).\HgA#+>_JMJzNygɅT*q>U,X˗/ȑ#F^h-:jc9?|^kvaӆ4&+(iO^ b"|p)ѷZ; JRPLE *@T=sv 9'>~\nnf5濰5ғ((I ̴XҜtCkk a8&d3̅stRw毮A=@_Z]'*Td+Ҳ&~ҕ6k-׮/o KaGb%J?}XzF0'Znb;s> 0t ضmS+HJGKJx.Ďrޅ *\ .>2@O+(cX-@.5AB.At7z%!#Bo@AJ&bME,~L# t/"^=ixgq+~X /²eUfЖa@>'2.X/@M>+q0>f9 L@,y ׈6SH8`  z\؂ k}K<׽&8`X| 8qTkkEY)@4"t;ow+`X c 5՘9sn EI+Э[kHz P1p"… % K(Q]]z |>qUUU?]]gtܞ={bEW3Mom)=YĄU>rfUeb3@.w@a F| UD4LKMj-Zc (yҽ!rX ,~~h۱uSVi($'#yfyii,<ǎ9<=kzlޘbУ!%KqPۑj?kE+D/5 %T-ր0.z>,C ,]Ԍ\~c!^d8\PTBXad1`B %=Doڨej}"0|=Iƅ GD>Of ;R B}\\pQ.\(EWG]e ,Gŋf͚,  ; 3);Ѳ=g~χ&N{5$"cFD8 9]衅?C>΅#I.=`ϙƓs!SMrոhi#k/׏äu6(vu֭*›,L5><ȕL~Ojm%C3wzt?ڻomzR)@a:|Dܽ{w\p+h 2J D[ \ . p… -鶤B㥗^sUjllĘ1cΝw>/^E%>~ǘC&bBVFV~TϮL<&M_LQb_A`kwLDUL@% ;:R_|[Y>i@QPo1@D}x =ł[7eq獫ؼ)LCCc-<a}mIOB?:`8}C&`;ӛp[\mC> uHhWmօ%DŽi%͢#Pɨ!ey҈K`^ kȉ4W\Psc!nO<17@[[T i iD;.\|ľ: .>j,PL ٬XdI" k֬'==f!+ਣ=wqذlkR& ^J% %QŰc܄Z|NcTtʨCVeXYulS~pqڋ.ݛ9ss5Mf#Pk@ Ξ~ ,'8&a:FV9n'N}D}i66@L.,iX {OԄ?YC!0k'3" S\p.\p &B %ا+$@}|_!ĉteƍ 51iK`,UX?F%OP'T c9415̲.AgbU'hd;ͳ[ (k{>ZuGRG5ps@*Ͱ{gߌZM볨`V@=TPJYiO>gZP0oZy@* ZC0`P% FAU;Ʀ 4N{\;a\Rksݾ-۱q];6omxy VlZ!@:B h-G\/JV%ԕz@Do݀YpG>pjVg}pֶ7*I[ =2ڃWyxlͨ/I0ưbr2 WzOuUխ}!߿?jkkk.\~;&Nג(I1}t~z_U"Ɓ?c \E8\;Zkd!?}?=6r~T Ĉ+',m9c`Tt5ZK{B7׀IkM: L$LbsrqօFIրOUr}~_yq].\VMF3&>I(a=pn M{_ò]HUxH5XU&*<wB 4@Juy@mU'e82-y]݆ukڱq]y z@e%`93aH rÈR;FLay)'`ܰoUi6n¨0VzK[pxwNxr=cW7t~Ku 7V' R)2s9-[>w#=1\pQβ:j \K@wD _ǬYNxb߿\1ʦ !fqaa] <nR%$[q>1;7p>=CG[o-b>قwt\f 6?j1hM֢oʜlg[a6TV1r9~1X4W\{V5[`3hۄIuªJ̓)i|# V<0Ӆ1K_#}Ĵ \R&ÑN&4 odE} 6Jo}4yd,|>-hec `潳<>.rt֭l1(2(VK]pD]pXMK_hhրMMMx7`2eJѹeq}ǖ-[}qlڏqXqFLq݌st-ihU.+*Ǩ)]D@k #~ x3sbD@1f$uz\ӫBȃjqQS㝷[rvI`k?fDJ1E䵔!Id(uݤCyI8?v~OP\(bI0Z/ڏ!G,1eGq;Mu HU ׮L:?UF&pbHR6 f3x[P{Fe`4 AI|#c>|xvQ^З)w:.\(1\pQ}m ꥘IvILR^z s΍Ik߿v@E.Cee%껍Ic|bUuBY'XQ5u.Adm [ -`< wۮPò+b#ָ*9a#T|9b3n 5^ĉTI^'T(-D0-J7@ #2D6yg¶aUąĆP~IP'l݀bȴِI 썡#jѷ58LN\Oһm-<:@Z0S)˙743UEmmmIRBIZЅ ] IDAT… e~hդCGz?j曱2Ɛ1l0=1.`|G&K/ g2n[JpLc}-[kOAA= `¶vS>LXhFr. `DaY@۵8"bz 8$6qa\*\(@p+ƹA᝷wcADPڏ ة=Ss"Xvy&+Y<΁9V4a&(XP`^ bOZ ys{[^u ~Cp1; 5#NB'u L6X5 TVVbg%V vsyn{e B =߬!Cp1p}|mᙄχA<܇K/w j&_kYy5/y.GJ#מ\HyasrZ){A %hMA%Bq5B>< 6?z;MlDj5hRϸ94V%Vs}n0>P @6zi]Qh\c | 0+l ϫ*L9o0x8\}5iy%V*K >\D\ %g|w‘䯞GMMUM[+ok̜MzrϕkbÆ EuZp) 7% \p .\Mz$=0|Ĥ\}罷W^_hPaWU圑rƀ334%5jh*G%WT1_j$QW MaQ>| O1X`0غlDEURύ e#;⬁@W ?ppմշmmNQ}ԥc뵰*d,-]M`Ua1 @ @n8BX - n9*sa侸q;#нG vZO D F]#0ygA}p ]\~!O<9CG6~bX 7xC@̀RI=p.\pE' (E; 3>FUpk֬ҥK) S4ٍm5xb Tr2Ɛ2h BQf%kAF{XAJ=4s2҆5jB,J1nyhW(qi[ DXe&z.*z.L/4dKcKx~d\3 {,o?$[c?7Jnc՘9X14o+-@]7ph]gD9rtz1a?XRRfv3h^vMC'XTΙ/1y&;cOhgOĊwZy}Skk?bkU}OītleL-0ilԵZ $"@a7O_]7?ǂ<P&DXƁ,}0ۥ Nὕ~?]{ǫ;e\t9`aʹ0cЭ\Nn =y6,y{E930a%a`_BcaUKiOymm*zڴJNЅ on \pbϓt$@GiH8Wu4nرc !pQGgϞ[a۳Q!E +cU=%^\|iӦe|U"R74{yiKWA!r7n%nd>6B3BTj9]Wq5AC's4Fv0(1Vਪpnqݝg6a*2ya uQVwؔU\it%1UZGa@}_8%pޔ&h^ @WG.1hH|y yh%R\3JW D $pe ",Fi0mxEZ񿵵O<255zC*cтenē+9Oy義v؇zQGfV-\P'':*W,[*Y.\p .\@ILtBUj?~0ЀO?v[r>]x2Z߫[O Xw5ٳdb_9nJJvb}ؕv)>0-~pA@xR<7`gbiVeW"ޔy 5`,cL۰Ax«qysr|#韥O>$|؜ӧ^}UmPWWhQ__omKQU_fg7+W_m&j5/&!Uk7&L{Sii-/M1 ہ#<` =o2TSUg3.|͸ "kg jg W=DL⣭ ҕ -^{q^}q;˗ _m#/,AAm ?S}{ _l&@ ;e(Y@gֹ.zho`)b-ߜy#ccCsU8]נ=өDm?S~$oI@*+oc#1JӟHӱG*T裘Kdr!wRķ .oG- .\35PNbIVeq!d%GT; H^p]k̲0}A^/_O)PdB&5 XLI >_&5uD {M20CFw d9A+1`'z`1==O?kVt?c!1 KҜ}0Z2vPIYWד8QP !73M ޯSNTӬ<`(FqwbjscR͹ \N29`AFD *L:X~b~XZ |,]/LjC2S?f| K.G[RK%ߘb3 .\ .>@ BK0` 6ĒB\qXhA!."̘1A>_WpI'J`vpRɄINrmCvzإI*l+mBf+PlMq ?N%xZ .\fF,i`qI?7+m0@*֌X;+N|puVӂKvcض%TS g qX__CV5DQA+RC!"9 yHꎑa9G>S5$,TϿ)^s"l f!Li %N,~>R[FY*1ҩ.G=O6M3}Ёӧ7֮ݐ6|qEK8… p…}HbPBW P&}b|ɸ曑J??C̞='xb^X#<MMMX~}/oDmm-pNT m1וhI9Lo>Wi D~~ϔ몫a@}Ռ把$_sՒs(3Fg<a]}U?FdF-RΘ* 0a8JtCQk`%h0 \ngr\b$f^)kz)Æm6{n;,܉\#"caF40'g}acq 8~R=y)'L&oJo@b.hIq}A50q"}&a9G[kq۟,ͮaM<7p ԋ]N0aǗA_x կLU!mɒ%ؾ};R~D޸ . ~r.\pD^j{g@TSMRZQ$Ml6N>7oNq|!"?0<̢5 oFbN+Bδ(gֵ3Alço'޶n@B?3~5r9m[rز)m[X oņl\׆f}{6^n<Ӳ@>Re@* SC1`H5B߁UTл_%|!8@DљHOyHW_1Gzo-N{a۳x.Ĕs'FmUX1aװuˎ.L49L0A6c[H@=N  g]-[[?l%>|8.Ғ:G!r5Z p .\(3mHP3mĦM3|l߾l]O?t 0k׮-ϛoW_{cnjPB+Z<zE)g>h_Ʒ*LqAD"bl,*)B9Xz vv°BKRiju>D _i |CSS#xyp.h6= xG,y֬Y[o߾E{# .\ .bb P2@>J 7sMrގiӦ>[;ַ+W~J<3sd+ػФ"q ҅ZZr$8@Y $"̜Gh\Xɢ׿7﮶އK^7aHӘ}Oc;tԩũ|Çcr/omqQrSYhQ,P '%*Y.\|sK… ɠz}g=yi}і?=믿 83J,XkV"KA5pҬd7e@X zpP^ ZȎBO@nᘐc236ݷApnysyj\ \̛9B,}GFݚ|1q̡v.d%Zn,r;ܰ)C_z}d~zM/i5ub{񷿸<,F9\v իgO=|n&}6lpe(y>``{hWΙ3?3$… p… {(SYs9$@@DرcQYYYp>]w>]!CN+߮]0sL*_Z' 5ִBJ X#,f)^0ݧs bZi^)J+i?w_ N!!=&.|ss3^xɹ;… p…=M, @GX5550`@s|衇b 7tS~BB*B.u%T7XZb !BvFrF ezl6Ȝ^sTufD=?| W8u~TQ-Y=vN`P"1yn߫*qõ31cA]mML+C2ѣ;>jtK***0{lEQ]p … {j X'م,};+V@*i,[ .Ę1cI"@FL4 O>dqB:U,%_W濂ݻwwXa5s,T7 yD6@t"5.~?Qi a~hjm* IDATFH~At#n1aֽ5BB;wĺu0|$FY.\p.\p~GKzN}y+%H/\c cGU%\ m_4zF?z̝֭[ܳL̶="J: pHH+d^D[2)xGaO )5 Š. YL7H{fA6vT ͜3ύ3*GhBqerA.n!4YC;4zPU$$Q5oʠQ7}LLr"<<!#nV5IJ++#@-o E+^6_0 J}ogm@_DLj7~#`17Sk(9Ij`*Jn[BhPg$~i@eegN_=1.?fbY޿5?#?i\x7ovU󿫀c p%\pb%_X`9_~֭[|U}e3!jn= L%5ObZ.߯U%X}mw^h%~D>w ϙ N4 > nF韇7sgV_.t׊0 RJ\ǔ~3nZ7݀z \//\Q "r 5~}6HWϬך2 vZxD}c何bcѿ=^>]zo-=8 3gN=3Ð!,<0j\SOuMk:}W .\ .(~ˡc/<^UUÇ{7c _җ1F>[vk CMhs*+zd+5 0e)A}zVrıJ=WW*;k.`tsТmN@>gZP>TLBkXD@qtbTjB+'qG*a-(W6k-ÈӀs7m6IJk6aw(M! 8T+Ж: rVLp R)t{|`AcÆ-:֟3Vr8A?zǏ[x8sIdhoϠ=l6(1VWc܆'|۷oDze:Ul.\| g… %Get&,P4he}AG>rlVO߶[6l@*_"kkkJ=E/_mm-w!ˇ]b1Y&=$AV5%yZԏJw*^&'5n8VC ;3 ƙNԄI4f&A%r Q<9.̲ )U%KG)d(z0nՀO @;qPp}AHiFZ_=k}*%'aTPX.Pמ!2Gu ~W笇TR&w D}z~м}^É7IŜr[$? $ݸqM@fshoo0Bj@kk[sJ=bh ҹ W98{o X~cY={oF*J|҇rp)fAG.F8.\؃L|!+R.InF=z4.]JzeG}U=Ir!81wܢkqWIS6,S0-KvxbM\ bq\1xs]AgN>7pa\ D- P[mI\0Jma=CrP)lFF1Uz ?tq'3%7V{&I!"` @y  #`Ȕľ܇Jl֌;"֭T6@faӦM?>>OtHZg.\ .\COAv& ЙBzBݱ}y睘:u*rƿ[1bĈ~K(ue@%8T}[!1co8,>jh ?aYA~A,Ȥn ?N V„٪.X3nu{\ mAXjuҗU.:/`' ;b\n Em(#J_BZ@q<?M$I.**p''_m[1̤ Rضm']};~.y?zI׌mi$0hmm7ݍ=Nu!w~sL>IwEY .ʋ}@ԗh @R+@Gh @.Ò%KBW_!^oB cXpa}2fLzVb cg8ܑAvme'" 93dF{MuޮX-a@Z Pu٪qHqce|oްzs18TU+??TzF4CX&q gxA_tY;aȂ U[ne:`lv0`8oʕ{[ ^^tg6GGcc)'G}Aq3,;2>*+xtֳxgt{nV3 SO=ƍCcccIr)5@p?/ .0 m$ƀB bN#GDϞ=Ғ8. sA6'kJpLuL|~YgN(DsrR*ENYI `rG<]J"ne P6k@k.t[/\6so0 AvLl|/E A*RPD繙# Bda`ċZԋc,6gRQ[L(m ʖ`4#0C𱃆aْ{Vcm]޽>z ѫW=,)q>db-E|oey ;w@\rt"!FSSLѣG#Nk=r*~/%3.\.\pѱ/l/T(&X(fpB<3cR)̛7#F A NowЫWвO8D?J(Pk `D@.^/RF!րҋy5 0NF~q.{) :թ8.cyJ#a2 b}/==f/r9Z cǎŮ]-^Ԡ*++qګ k~ob:RU>-큤rR*ݦ$o3 HA. a#@XSH 2OY Yq6'q#QMޮ#=-ai ˥5l6ƈsqEocݳ5SB}CwD|t pnaZ0~4L>cDb>C ƀTC*{XA`O@{{{<[y%% Us~:t(Nu?#..N8 .\(ڟnK9ߏ?x,_W/ב޿c͋}xgm]Kp4V .2EQBI+m@$j@$Tڀ*GH?6|ԣFaYS۞m1KS^!SN9v]If $)eeJp8j|2̘1eeqXJVd6ZlvaG<wusK Ϡ 6c6cscYڶmP(mcƌAN6kQƍqw޵^ǪU1cKuBO@$$At <ʣ8=7 zR'Y}_u.q򄊎4QuJ@ )7?.M݅‹T+]w0 ST̓8ᄜSJ1= DS"Ϗz*e=g@(A7;ce4*00TVV;dfy"vi F `Ӧ-HE04w`)GǏND1TTemh]vEfͤ_.⟯P[L1{^))SU d?׃g&Mo)SpwUVr\)oТE YV[}jxߧc͘7Ǟis 4||'"<|9gY^``,{@f-zWyjS- / XT|E1ASK0)G 9'lS%9+B$ƛ >W’>Ŭ#L cʴBE`_fֺ}q1]pG< DDT5gBYY K> -yoaӦ*D"#vygko|}{wnz+^ rch$}BлwobAD?+rwh``` [PW r=նTr?XEaݺuhڴi<<ڶ믿>P 㬳ai#F2e# 0|-g:)ru.BSU|z2]# bxB7 wEM-OЋ6 #_|?D T; UD3yST 2`}Ύ.$fq YSg>] UބX'f.fX?*BEE9'zd2ۦ[y d{B7)XoČ᫯G,E(d^-R.bH|$~S0000؂2~E|}-z+ p߿y'z衼 rH$g.#ěX((,(Pj&ϥޱ]nclOĠZs%S IDATM@vx;=bzyٶ> y"Ӽ\~Nxrwo TDQA y{b$x" *O{SJa2IʟV~{׀M)6mcc_-}%g%"|kB!,0Jk_|Du>2<;eŃ!2{o-B#XA9 ju*fn/0z%T ΊbڔXj'䌺# s9欘{ir|&R1@ e;2~(X=>:@g?ip .WX4c \ap/;Իu_H<~(?<%o )J"2U/: $#:) zз[ֵF)ńq3Pޠ  ˱qoʼn/?!뎑xqxڿ7(eVt|{_#?JQv˲PQQ/ȑĔ39yvcH&Sh޼fu--7ߛM10000BA._ A;MHT{믘>}:N=z;۷;.rUxEӷ/j3niD'˒;VJmu;k*9+j1(xX &k=bjs1諈AP PwdoF43>]/QF{YQ{>*wO"RJ;*\3;_cpMf]osfۯ{$zrx`{\|pت$ads{s$5o1zXrb"vMqY'裏U1c~^\Jt?_ }?_B!```` %z=HtTM˲r@<?~!R^'24  6JN9uhDU'*~O6}|aY;bPErm~^HO,(l֫ wyK5;.x;&=?X['\D}Z\,q$I+ bOg]oW^4$v&qqEm۷WW_hN0W>&ASIe!yu?2^,+x<;۶d2޽ݱۮmNZuu5+_n!D-```` $^g!I0l۶.[ VB6m۶?/_s_ٳKΰyԑ+$dGI=ѱ{Ly`VCtGz=Csk\kYrkѩD#Tܳ]jo';#d1'ZDf)Հ?+OD3x"FZTaX!ʍq ]K#cg\  Jcxt̴u кu+;lu$l"cGB+ zCӃh_ٴ, !mUb0sBD_(F Ͷks@fMLʴ&еUU #A {`````PA zXm=1tHԦ¡0(M# ϒQ1]<[(d/%B-1PB$/_ hSpMH$Rعmk >WLnכOU+QBAm~-x p! (/4kB"͹H?0nf4iҤ^c {,h^y7|?]vi \|rwm~^ug~^~_Z$׺j@wuM "RIM Q 8Dy}@ :1/R~N<T9~Jp|x! *Bݷ?v]'~_/?** 畫͏SqCeIߖ-G׮ cC21ˢ`%/"VIDQRafJA E0UkaŢhZmۈbc1p 8sG$)PʴnNu&/߈|t L` ~@g//vyE@KP^^rKϝv ǔ)Sr.H$gpWBȶDmhҴ߮sܧ5G.M8O윑? ~ěi}X|?kYĭ`zA4RA ohsѩv+bu 0U<~&<`7gV1GLS@UuX?+Q,+T'Jrn]rao1DMR*-õo<CHVP2*%1bQc=na|7EcA/v"95Ejj"YS_DJk1 ׶45 _b<b#, f 7܀P(T/T F[{߰, pv;o&Lŋ3f$ M]ܝzQo~_D1<3EřF`yjWԌ9 54®|+~bA ULT@׏'~^9P(3!go>9fѣ(Gee:ϱϱa&L2/$i,EǃÙgtEUU2v:]~YX@  ~Oc1xםPضR "pD |f@ P&c[}(g  ɤ ˲Ggbxyk :Q'B8"OA&cGq ?<`_$I^(!Z)0uR}\fu%AHVFKS(@.o_G(ʹ˗/… qQG{lR$Si@%I@*"ԅMg'[7)Dα^vCoAW De0aYa0fi) pC~Erh~uu"I~Aq_.>TUW5S0000F)z.3B&Lnݺ$ xPu|Xǟhؐ9KƲf%,c->:Ip.:֌N(8xTr?_#N~Z ^2YteFr^="\2?XW#I |8Ёӥ_o|ի~Cfׁ h6Vb 0sB|%ׯN:rH$ /!kI6*1w;?mާBηD_U6 gHJLpGN|(/!AI!Dr3SWU-t7S0000."APC\RBǎ"dK/t:h4Z/>Nav?\gFYu)0x yOw^d"U#:ⴁ'KРARaD%h>^tLLm3aנA{ckxoRlTkJ,H=\q8G'$S)6%%= $<_G?"`H)lo % 7;kԋ `Ĉ3fL'@<ѣ 4P V 0o to$ 0ƐLxw?Ou#ySkeGeWaӔ +EԞ|\jorD Y/ze^@0M5G j#D'|$W TCDC&A8F,NsCۣέUfx)>U巒\[x r%sW$jRɴ<8@!ZdMT/3-"+[CS-8Jw+p7XqDH$keHAH&S{Pa.c szy^_"*PL Z!0000d. :7;T@2СCQ^^hO6^**k{˻mxw`S[Ɏ94R,6?/:JjfuӶ#9# $ x@3u ^# );$߉y+̊\˴1䶜룼<+~ WyCFyy`L% z%'c1\~11釰s۝I: <3QʹOkmwRya NLb(2 Ə /?3ӯ9 K|-P[^x||C ( @>ӽb ͐@)E۶mѮ];|'I&ac>FiS%>y?s5wbyC{\Q{|kE~Sv G5Pl,[T9+}*TzT~uAS"vTE8? g\ksA.KxvԢEsޙ8ӐJ`ST6@,:_L/$FE#sHG;73ʰ?19xz˰, (~-B}O=ȺEa]_ f -o````-=Dz+Tl}AÆ eѢEXt)8z1l8ðx>y@|~ձVe9Ϲqc _@hk{߅B9.:ӾkD!];N;aUXAyrxJv7{+(5 ɠH**1&qHKR!@e.f3nhFD" tVy<. - bŘ8J$A)EUUMVu,˲enKsBe ^Ԁ |oARvZ>aĈxB0hР矝Cr~ev)Dnpr4fu7[5/Lyh=x_ n\(;[}G^J\q䜃P#;ۦt|[a=oW+WoW`=ڀ0+da?dgxm%f7oNe; 555cHglm@ "^T"HFeU@d'O%ME("<ęP`gGA8oò_Ϻ$pHn_W6h;\Ss !߷]>Xj]osrKu7S00000ʋ@צ}U\}8 _O?EAse]t|d~iӚ˲NH @A)J$blNheH:T] $|pk2u͟5߯jnB-ÿ{;pt*{ \ w: 6m*5R^^뮽G75.?ӺP>G0- BxEd , 6T,x=RRi?N%<<LƗ_}^z X4p8*~۽zwW ;lPj!g ` A8{u_QwsM'L A= J񠖋AS$l֬?x>_x`>lFp8Avms>>s0t_&O:zpcڧgEAkRP9+x@vuut H9YxеQ (|wڀ;@W3#P#FT0ό IDAT0xrs|e%!CSzFvzdSzS#wWmgCj%~b~JUM;XGd &lf'ψ{_'Ƅ膈X-YOd"r QO0M5@;N:;Oys95o68ߍ25z!)׺ҢeRP @)7 D+ht#JANH:\|@ ?AB49j{w#1 FcarCxٮcWYYifΤ\;&XzX%;;lwq-<Yظ7MUpG1J>F =g 2:SiSi?mw<><6jto!࣮*`qB$U#k3````PXr^擌ʛ:=h B!m_-GD6UlXGNUO9K\7e͟9d?*~ɤ DG^lCA-h=+O4rɥ{bSJ9A`|o:i|?J.L~t*;؍3 55I!E8F&Yo!סw/sv"Iq7^Fǃ qgwNE2_  jRDA@,a2"jGcðmW\yN8~fs9Q¯+eU (?%}\?纟#7000Q?+2b^F&M?,> zQx߾!6n܈oݺuպ-B㺡 xSODJ#@G 9W3G#pG A",SȮx9Q5@/VY IFѩAXGMl8𐿁1t:? mE5: D16 F+L:*00e,4hXgGUeMICЬYSRI,(D%e(CsLcSN( $T"Du1Z渶-BeoKuo @In%YU\ |Aɹ!`````P);V^\^^K//br <~{wj#}dC"PBQUq=I$Z+ՀLqүP$BѢ'5NwXDJ:aHonCJe\?P뮻[GC}H$C*!Sq)s!# H>55sp؃HF" OA@%'}"eX !m?\;G=ak1C08ͳ\( |cSu} rxlc6 J)9φB!|GXzfIA)@W'CG23ߚo'q8#Luԙɵ+Ί @=-&hTn+Ѣa.A)K'TWyQ hX_݋DMJWC$ƕלyT, \p66/0 {'5Ib$PJ4 " + OqK:ƂHN0}sY3FL: _C;Œo8罱_!ĸ*.Ԗ€)lC.Xf c 'tRαW^)8PJa\yy,IL $5R&,5 @iMt[@ƨ4c:DQCtM)ja&9W' U(Sd:?/o{'  TsǗsmի~/-ykҤ1.?g_]w T4dΑ0ޓP+*UL3 Nɧ!8 |rB%ד$Y6Ua,<>,_/s_Sb E/%xUnmA 0 s9[/`I~M6ѣ^yD"PW]uUN@*1zhGҟ{ +W;4W9?ѩ#+m@)?d2ߞY$}k)z "s|wbuIƍ]틪*0Dz:Gtg ̒ C`1g'Ң3>AB['LzA@6P† o1)X|%"0-P-[6Ǿ|!l'HX42!(+선,^v(`]_zms/)ld.2IZo}f͚裏o^,øq0x`DтըQ:_˲#˻܃=s; 6VJI}I;-۩( It(T(bȘi(8A ]3ѻQx׳'^ĩgUwM[ uKrG"at8a\@Q^^ +ZP@/^07Q h䛹w):h3<]~ xϯg  HGͷ hР,𱤔!LGN8Ъ"*D}"K$k95 A}_!````hG܃,_H*Hs 1 8oBP2_5~^ ~O>$rkV{=ۦ'v- !L=E)cZf'ZwGxV9r;GtfO4@E2)% !mQM1pa|m:1p7cwKvo{cșs" JlcyY8!?QpE/:˹gϴ!>u?D-W;'UjeB`+ϽG Lsva;t<vlLHmmwŒZ}WZ[Gn```L 1_gTuj_~błt:n-o1Ǒ#G\  h}7{GvU^5S ~B<b0Щ\0W1矝?7:”s^1)?޻1k38ӐH$xty_|_fu/̗1}:_^#S \@P=cG5MD!}byC r s]?t kM&LjH" ;EHk>k?-c```F````(lD 3H nr #B4iNlٲ^c =z@yy9s.5[ux%xjt,sϾ=;9b柨lyY75O4Rk+ +:؊7Wfu\;ɄG5wWQ$3kr:F\tvm$ԟWd,1 Oӭg98kǘ*cN8rt@vBuHsNQ OV$*2R1X,^ŋbԙǟd9k6z> ]$#!pyK } R$ R(00000 A BJt㮻ºuޫފxގIӦM1l0<9K36%4i5_br6Lw'UoAuRInLU(N;bRihb;cz6߈/|/t$ǻ c܃p(&EVAg_GN1Ϳn""Try4=g}Ի%TQN0`CO6G4:bB! Uոöm0PV/xE)EcaQ +H<)@wyer-w -7````sutJZş\gvt=cٳ'Noea޼yH&FJQ`˵=^3OnLyÙLaVG6O4|p;He28t׾f26^:!`D 4z} ^xv>q/гg~zw26rԼ(i0:T P|q ܫA7g3/9˜=!9 r1<#@ ƢEa70w;,dL.-vhWr% E H 6}5=bl mhP!3_穘j@__1aÆ!LO?aC4봞f/?vJɬ|hG;9}02G#!DR +F" mgpg&N8 h&BCʋG4!?zD 2WPȫUX "\k0>+0&+3j;p." ar ATI^}O># xhD y߽W'qH$EEm3_*||nOr:J5 4Ql_'@AzX͵b " k]۞m͗?yc/`/k̷a= C ɧN[!LAF <3zZ (Sϑ3d_%B ?ƥT^Z0ޠL ͷ?awjZDd1t:x<=:a|?;n_d_ v5,) ~m?[Wa7w8-nt9`Y֬Y3gOݹsghk֬ ˲lƸݧ;I=΁ğ9rs0j)[}gF<jSX%cW n7):ʬpߝOB!n#z>tt8R$(eH$S`Q̾fN=`?ȸC1g/# 9'>%B;LpTt5!^ע3 D&smOzXx$X4бT2Q?x 9, dj'ԋ@+Eson俘~BPS40000mׅ-==hPbЦM>! SONWyIгgς;89>lXA"]qXEf|?S9,wD]'Peqe-~Y?vE *A:~YcvCpp!!ch=t{\LjB )8&ܦf D* ~QpѷO'(Fz)0wޛӯ`AE:} W ok wRsIkj:`````u |ŚJZ [Dޟ;w.аaz;G}4cߢvanBo._uʗ׻۲۶iCnu?f@˾n{ɊD1M0Jv1d xHDLu&RzO؂\@g*Uj Y(|>t :KA(d_3G@ i8(|;E sbHe2B+h;.0nW$i;,}dy9ɽ+^,K=:=;g L`.AVϷޟ/ByZG:ȑ#qc5\wGE~[ Օ~um23Ss<^mwޞ5f7qeC;`T4, ?Ąqc_:Qcp啗I&Ȥ3_T+1n|LYzBJRb1ǧ9rt(tw> #Y8>k{i,[smT SCέaglI"jwM`ĺcX"u_\ PHP/7B0bܸq?K>s C-}nTr=MDɩScOeS8tN<eHv}~3seBj/a[KL+*7cPѰ!2KϘ2,By(|_'?#-Q`⓪-GeEmܣTY2e!QS>Cκ;~TVV#s5ksgyN? ;v~?6DA$TamAAF````x {|j]< ufرcQUUX,'|\rff*u84irOT'0uL\|H&R*S:qLdZfNPݪ;@7>tGj<8pmObvͺn~NAMl{itD IDATo~K=3}/2Q /=q@OP\P- >#0gXj c(|)IsZP(s{l:t9B0uTWtpwuѣ ~'kOEg10ʸ? Oz(dXCpT?w?spM]nMK6mvlIǀW{W8:_7ELF r/DCRIsLSۡKUz(0*/@}`#_+^caq?Uk&AFܹ#&O/ WL^-$x{T gˡp^#>AB~]( "T/ȃeNYoK'>Lc5[t)z-te307ĭI&ٳ'͛w O>6> k߲jjrX@rL4 5o:"c Z*0UU5hҴ^_=G8ƽI3Jo;bh H5U5xs$, c܏~}OB<9aL4B:-OһO0D" QDiFz ^(sr€P؂qM`7H$?P9Kv=\0V,y&LV(RA! 5c\C L '.u:h[(?<@4oeϱSJ3 AI, ƍgw_uZY?}BuM?#k#:j;:Rŋg9z9[W1t}֙Si5OeAt͙3U}! `s/cE4S$!I/TaÆ81vXDѬu=c{/~ٻwoj Vʹ/>_|{˿[7C4Ć\˼6gR`3; %[o-ZED2gF^z8&$rnZ'_RI勎^!:* b03AR5 ;dYxmGfZP,(hԨ]{:AuM?_,GJW-; g{/  1% ```` (R v݃rɵbX@}?Gqeu !H&kp-ydw=z“O>Yzϭa{ѤY#bWL4+k~M?~__e:t(nd"J*$*)?1CeTIgE q>#3=0+ 2 ȾLFǕx9xy\,_ш ^=!ѭ!8{'qdlvFDVk% cV?>TY.S00000(Pl_z͵;!D"8s| w<O<+ 6 MgF4ٿ ફU57_+d!J㲫~d@ӦM1v8~HR"HQ$r3'Аs]u_dP.3@¤qsܔ_|\AקQA֤J)C*\}=5D"z%+"T8Bcb(/1H3_uy#@0/&k L`+'.H~&Mv駟ɓ'#dW]] o߾E0<I{N8gH4gN삽tt0:dL7g3ݻ"ɤC{lP!if%glOeEcesi`SdP.@Qx2DfΚ^[ۦFÞm'UU5w=лwwtt7o"H{%)L?q+;~byk _u\ BB9G!@AѲeK\2A11c(ԭ}P{y`iNݦH$S<۞&g~&.ٹb80j]hԨ!l;F2,y27铝tiϏA(d?U/D!zg@j P]k=^PO!`+1j_p_ Ch޼.d88`i003>ޑ`꼑ʓ ^-!ZƻS0000  %H@)o `ms=8ѨQccٲe <{.삽 _ue۶mDMY4jK}Jr}kW]u9ZlT*L&kLsg껋.[ 4\1xF}.Hͅ_|9 ,a<~PT1Gn9̛7S|hwo8Vn7bO,Q (!M~mj~ !!47ePS`S03gfΜw} СCl2_^'ףſ|/g*Ass3,Ye˖.҅硳0vn>F.FKK &Oy>{}G,WD{!~.@\(qoD_q@BjMW•Ȯ2 Ba~ #8wn_<m Sَ:^KÏ[xbJT] tzAcw nVE9W"黹qnoD/(gu Q>9/ '5;RD"ma@ }B B!'7?ꚶA8aҥXti"^{5޽'t^MD?WzQwkV[@۰Ggvo`ɒoi>PQUABc_AĦ:ʏv#BIn6sx] "J"V3'nlLLͺqQESC$ A(m`ޤ !jM:ᡇ{<<~ûz]K1Ļrz?@u=ȟ5$^-U 0MNۮG!4!A:iR]@ ڿ?|A}R nf\wuEs\ƢEp뭷nSOŭ{.QTsi5/w _4 }Q胫,lSfB)n_y\7XG ? >;[>RsnzP\5`R{O O'1L~k4!DBH?߬T6U |H^Rۂ}}9&MJ(>Çcx?`۶mxhkmCRG|zl?`?R~>P\q@#f!!țT):@K/@T2jR(z}Kyܹg}vrx֬Y5k6mڔz;җo}[2d~}/G=E˪r F]%MWpz @g3&#BGX,Ph_lź'U?{8k_)YĴ_\TB@!WןT6 ."@}-GL? {/ZO=:;;~8:;;q_^x!~aҤIrȑ@Wtjn/P > ?3u: ?ӑTX 5ӥR 7x+{o5#oZ~!Lh }* 2dH>eℯ8hii8Z[[{vU !pqդCEDu+ΪMk@ ~B BipCDhǙ迼W r*Vozen9j9g}vr)}&`f͚ÇG#F_  om;oy=\AK 1S;j񡶭A4%WUA%(8 S(@@PPD!l)@KK ۇkį~oV͵@p&MqơRntT.5_nTTL.RFaHhvL&Γ5֍8 񨇮ITѿ$oT OqO -M! BOlT|ݳNiZNJR3-_iݣ\.GMgUO>YckѢEOju%-w-;\ wy'/^m/<> "Ν;bѢE?~M /g.(],Hx-nJ//S]G(ir|_v "hڊ_nz|GBRP(31a„HgH2D#˫}Qi# ysҗ0B|%:ME pgY:E(c֬YxǴXzuH>vN;T Z*e}W*;dY~U[ G"߀MZ+JSѣ>Xv]j!܌iӦa޼yhnn:D#3?ͼc{w1lM=! 2 tPΣZ y678k"Z /~4K=DW՘qzVm7pu"jؾPgums'V"K& ҄U~_~;v;f7nΝ'*^CI@`a5(Lu]}ISI `kB Bi 3 l{m6 ּ }0mnnɓo߾:Xlܸرc^ yB8p[wEP9XZ"P^@_Pρ1PV[[ ~2߿:fA|w^xϸZ !ԄQFa޼y8qb{^i4`"uBΟokd9 ' A MDD id)T*F똴zoƌx饗z}<w2I {Dž#\[/}W P6/"qG8Մ \p҂];_n!6mz vZuQ(0gq9rqt҉(ami:F֢&IqmUoc%rqQq7ym q5fŸg:?8|Y ~޾{Q"˗u\G d x_૩ܻ {pPpbCmZ<8 ̙3'v50 0 'M~&IYV=4!4!A~m[Jq7rD><67;{L2[lAwwvʕV~Q37p=.:~Sj4O(%AP)hnn^o~~B㞞L45@IDAT ǨQlNm`*LF 909"NLR[֨9@@! $u=uϪhMM_}6q"R2t7Y v;wG}7pCM[ c"fw WA7oT r)y2?/~XY_B^}BbW_݅u~twu~ERA{{;&M;cǎ5.fZFXh  D&LkR :gq(! Aj峛ou&jĻIA?].g?g[o^fx'pD1B P@CRjz?|/ JRQ3pd@Do'@SS [nw;wB\[`fΜTM e1`^V44M@Vҵte6Ըc\ . `gLؤI}Qٻw/6l؀.MtZ Mw\xگ|GR E) s& ϭnXbIwʔ)0|HQ_,ڧ)V_IƀItM]4⿿ B B!}(l#lHib!_Uj1~NS=1cƠe/~ \|AüL[/G;"('\ 8« ƀ ~T,sx5X(؇gΜѣG @ܳL"kF-c.mdM?yBGBj|nZ M=dxnZMGRZ'r9xO6n܈b={ESSSd*Asb~t!^.|.:8Pn d?p ^W5w3:Ԅ b?n^&tb.C` ~` oP# ?)B2nu#޺eH @m=inHuEq1gl޼90K.Ŋ+b(&|L@6\G '+@p8ւ{~oΌ3pYgSN1QlӎkFd5W1`4?'X3B,Qal  _H. .r=6mڤ=fMMMxpGzc؟]Džƍ x^p+eqǝZ(455aԩ?>ڬGuyK2i?}`"Ŀͼ4?IOI#!nmzқǵ4Q*jͮPIf̘1[lA\O===Xnf Sn5G?>s(#J%bXش饚ѣ=z4Νɓ'cذaZ!$Q?H"kG01tb?4yBM6GH!ja;'HZ 0 7Jp8f1{'0Losxa(Eg(/B>^|E,[[J%1\r &O(H4?k_="6 4Ҙy~SߗBBH? |ul0_5grӶKP-\? 8x0wcw'峀#9Z qBpvbZZ[`7=}YUynfϞ: 'pB/a%6?8K#-0y6)`-}ldSBBM a1lEDu$I|81qDݻW{lܸXF$޳M_s7/X,hvzw}7~Z y|O?^x!RQ?.&T';V }a:$ e⏦=rIqO@!$IgY %u"X,j3y̞=k׮~;wĴiz|uHcTw8W78~?Gg@bMMXy{{R`ܸq?>ƏOsM(ϦǢ!E@! U mkQSNETBOOOcӃ_WX|yPPO@ހ_Jxͷ?z;<q.ZZZp'I'd%&#yWCV` ~xBH=`@BL~MZUϣeMpKp;&-'/RM'8p@'P-ڶO;"^u,]?[pZs0ob 祝QF>۶mFCزe .qf[BbS/~VBWWQWu^\ưa0}tttt`رL]S넿aǂl@&uud?PBhBM¤rWQR=ݟ. lB`:t(:;;&-܂u?+ߋ֭pWcǎ֢_. KqZ<*g+Ug6zl#F^oBML1H3@Y2 xb{hnn7mڄ۷c̙FqBx^;v0yWw]z*~~YM (VA kB B! Y`) v/G p:ZP0m47˗c͚5SsobV:twݵooKN>d,\Æ {N#i=G)+ OUB B!_n/\@' ;::~zݼy38#FXX[aw}xgpm=z#F9spꩧbȑF*Vs?k#1 8yY>&!!͠i$@xY]q@SQd$DL_Tt0w~i įk,Yrٮ.+o/ hoo%\ӧuS^._~iF TbŸ !~KBſ"0U?0-=`~3B[Ç㦛nO<={X =?sS3@15 !a! rS jYaa~N]ttlٲE]Žދo~qe;XbVZe-&ֆSK/Ekkkj񞵨_GGѣ1|L4 mmmay>P=?!BB 7"UPGA)$MFs]P,{ كO5߾}x}}qBԧ0w\L2%QSێ]?|N $?㍺y_#' w ϷI]i{]]W@`S tRtwwk_5kߏe˖gCRJ.fq+qF}NG;H#G0|p\z饘={6ƌiD޼Mz}(g&ӊ+1YB@! I}X L(&I:  `ʕhjj6|+_g?^Q q$mL[Wn_6#4!L c It5?=_2P.q`:u* BE4čljp[C I׫m-8OM2#BHB9ojMV̏ 7GD T ɸxuqWbΝ׿Ç2$tfF>D$~zg%ŸB@FBȱG_DQIM"0Q F ep|p~SdDY?1qҀ0BHͯM|xp}8j@RQuZ> !jMGD4w?~jW~ B!!~qEmCW0 PN ХEE#&?gB!4!7Z^&3 CU .@]?NĿmN,vp#?Mz']3i'+!BBH n2O 3tM7j2?i$k"m|(#ӌgB B!P0jHzRT*sXg (83"n㌍$~B!!ILlS`#0hu:'L:4eD$ bŸB@!6lMS!TM9-nTG$ᝇw`ŸB@!AD~ml_'j%m"LuM~g~?!BBHiv(2L`k}B!!4&@^uL P4@ԴIo+m1̟Bi;5ƓBHCgB7O'uB==GO3o*ml` 'BFBIi# Eq?A&@G14ŸBHݻ1BHI*ĴiD@RT@i@73hZ 0ofŸB9`!̘LHmiѷ0 B!@!(6"fH#d0lKSB!4! 'm@0)O!BjY "G) !BHMu?>zY}~B!!0 $]D؊y6QB!4!>7҈4uћ%?F) !BH@ 9`#uۄ̧") !BBHCY~֐[!`*O!BVeۼ5( !BBȠ54L [F{dŸB!4!4 ؏'M>o~ B!!/&#?VsB!4! z n,QC^v>h??!BhBi( # _o#B!4!3&@Z# ˼4BSB!!4l>+B@!7^&s0"3%@ I!KR1)>ކdAL/c\&AdH0 `:i1h dH6( ,teiZ& .$IȌ@A` ƙAz%IcQ^p TPgL?%ɒbLiL$$.A:>> @x43B$yhEQZq,0΂D74y,\$K !1`  &o+ZPKb8F:ec K1IcP~ D:2!|bI`R9$8 HY'`X5kwɲ|mq EӴQ>„IpWUps|fzA` ]2v}O`to( Y!8c2!  $\ՌOrc`$c0 cd%$IVYGGGG ]k=,[ҹsgDEEa̘1,44tOfA$< MY!a}[x1Hb$ Ņ)@ ,Hʼn/C p9:k1gZԩ_]?##_u o֕g3ҹM$MyHd` } Ŷ2h*B OD#Fz$A1Yg9p@h MC2IOi,?LSݻwaÆK.YǍڠAt]SeFL0ph`\Ku%$ z02 aTDfE/)<' |%(A[Cu=Wr_|׹s甭[ *EQZZ!o"΅ѯ@4D}M=`($StJ[@z(L!!!BL9EDD0zp\_^xA3L]vELLLxJJʷ֕gT!rSڻ+D"'L _טtl_֬YSZ'^^PP`k۶-x O@鴪IOOǂ آEXNNfg oO>ݡC~f3,3^xQ>u ֖U*Z%D#:,anh߾k׮𒦣6m2͛7|aexWѪU~A̜9Yf|6oތٳg1c]K/aƌʛoѽ{w%K0i$ߠP6T 2"xD<,S|T <%$$Xڴi믇tY9}4,XpWP].;jՊuؑ`ӦMC9lj'wޠl6F[G0tB+A^)1٘Ѳ`yʂ~ӵkפٳg[V\iŔ)SؠA`oܸh"b:u*8ȑ#coa;wƍCV˗/K,[WQGƈY8an 6,t׮]J>}j*orW8x~zXVL:6 9996l tۑ˨]\*US^|EϽ EΝb⏱riPJ$92L) `L7I4Me0f}pƍÆ c_~sss=L4^ ,'ФI,] x饗PbE}t)))hڴ)fϞͦMt~ԨQ߿)11t/@6l(+Jiw?gX¤ ZӟMZ(ŋ㏃V+BBBPPPxl'ND-|r4hCݻQreXrf3N> M?@$DDD@$DFFK.hӦ f̘ "55駟"'';vDbb"z57Br!4/4yҐz8} -BYoťm۶9{ނND"v:tJS߾}iϞ=DDiҮ](""ϟODDB+WR֭ڵk9'E.h׮]ԣGU'"{`]r=**/!x{f6mbɚ0aͤV!֯_/uF1jҤ %$$PzHUUr8t?СCԡzujXvDD^4iB]u611>:*xf%EGGg̜93'77^33g $I4d;v,}DDB_Elae˖bK8p`TR%)U쑑 j)ˋUL&ӷ&)SNׯ_o眗^t+pX,4yd>|8-_rss KFnE¢gϞߺubbb̙3%?k,]v1`׬Yc h ͛7ŋیEƍqȑg>k}y-r\K,)O87|pdիӻK5"!eggBP_(aJ ףSzj^zCw nRN eJmhgh$iӞ)''*UD3f MnwYH7&/ըQ*軮_y2sMyF०Mf}̙3$QƍW^Ο={Φ~ZFU'Y"e<-Svn*̹LYq94~ Kю;J*TfM✓zv˙Gywe˖fjBP…~L] 6#""-(˯\"DqqqO>߿? hڴi078C=J?|JDĻoC}7crdj3AQ[S;恪r7^Ս̹?( 7i= SV^4l;88~# Ρ"wDဦ=#L(4@\3 ٠A2~'xB_>]|dUU ?%zgn+VRz(8m{*ر.;)Ȣ4eJ/Rڭy{6,VFВU։Am:ujժE:t INϿMwr3zjՈFҙH:ICUV-F7nGDD/7hl>ힷa955'}e9rW7P ^F(mÁx4oWn"@;h6r$O@$pTrcK 1//IեK]/zcԨQ#YF6'v1?T}IE}h=/[ ÆBԈA,#x/0QѽXsøq:\.7m!hX0fXllقy(ŏ׭[7C&+66^/\._3#.l/QnݺEDD-Z#FPxx8McvSVEʼLד)32e'Ӎ}Ghܹ4m4PB5M{n]`aaagO}eMzzgAWN<ٛubp,]3#i@/y&\.RSSѮ]; 0gΜ}0Oq%<>Qa(C! "}?Ng#b9SResi}WA~X1p@566[ Cxg1*7n|;v,z)\v slݺϟY"d& G3AY$}!336l0BP`TkA4?SJJJ*zyߏ  yns|h{ :.]5k֠K.HJJ¦MгgO0]*x2Ι& :+V$IA #)@5@sb0k֬IΝ֭[YtVX` -Xv->Cddd >> 4BDPUơjn7?!84M8 :t5=Q'8 ht,pZhݹs'o꘷};H !C?Ν+V ;;Vӧ1al68Nh իpv!##3ţa|N^N+Fg "&jB}a=֧FBGwmD܎S]paÇ~b#/@n7.]8|8pƮ]vZtͯ\.hx^8Ap'N]Θ9sFU@zQUtbӽ9G|r@Ŷٰ, UvмNXZLMӂTiӦbbb(;;˥*<[nиqgEFF(KQU(( .["#ҥK^z4sL]6Ra|/qnqvѶ/>sfg_ge]gf^/vzo KU?e CCC֭[lVVVjhZ~}߿?}7ԳgO@:tDxDQjvvDLL ɲL/4m4""r8iQxxM} |@?W98ubDf+dm6,纭(:܆$Iw1zў֭[HMΝ;ԡC5j,4b:rH$"qY1n8 0瞣UV,V_x1EFFRjٽӧvǷC׋zj%K/HOK߸~ξnRj {/` d2e?~<SN1hСeܹɓbPTT}G"--`b1F 6o6lHswuZfffҙ3gH$J3q.q6qȡ cDϞ]ٯ]=m_lyDmd^Mf5bĈESNj6mQݫW/bQfhrP_Bz1FI&ԩS(''ԺU :sj8y|8vd8|7mQJ%y󚼔+k,[֔.ZlJ7L233]n](JΝ1cŋVZ}NNg h„ A6&NH=egg墂rm۶ѧ~Jh3i޵gw"s|8z聄ݻ+VjEhhh=ztG^=QbEe=j$6oaXVU.=VpJB _^ ?k,5&2&O9s&kk׮я?HmI`X`2 Պppαb tO=4MCVh"̝;VZ2 p PqY<3to߃hpBYV 4n\Wo00Eq)*_/O%ApI$4xN}m>xVZFR{ـ̕*Ub%0,0ٌl$$$`Μ9ǨQz1{l IrPv]e {v0eK߶aȧt:=3ҦuSr= ܞv0ȝ 2{8Y\8 Ѫs/5k?gΜN34<<<ؼ}zPSLaVmbǎzJX q[Dp}#"K 0jԲ$x "0֏Eʕ+ ůnC#a'-Usd}z뷂Vb%J %8 <66SN'|իbu'0\L~sqoB5,l7.1cIq=_gk \x ZD3CGc߾ V֭BQe&?0K?V̘1Ѹq@QԨQիW+V@X0[~uBRbh[kB2 8pDFm/izQ2*ZPcq P􅳹[:ﻅk)y~wwZ٘I 4 Ozܾx}O`>0`?2N:\|&)S%K`}E8ne(*T>'F"maǭaӯYX( 73SIDAT]Vwp4vʂ,N#ק!RmA7Vm@!!X‹/3#z?.'Y?8e@&V5y=zmǰN͖AGHc{P$L&@{&!# dEákAL 3d3AS5dpl$lIh< "-Վ/ä7:Os;3Lq}zm۶mYjհ~we]t`r;U\Ou"3 1 jֵda`Đѹ#mv] M a!woӯhY1D'rg%ݴ][Ͷŋvɒ%3f kҤ1,Vm.@ tpp\XLط(֬ EkADEE`ذ~ѽzZsE7N~ R0fnJLOHAYӮ˗W|wǟ}Yhh;l\E)U<@sMIю-s$OA 'osTe9'|oɊ"YJ4`3±F,@X>EMۍZ꼴48׿ˆ0W]ũ.3ޙ4F?PPDϞ1xP4lP0c2HU dls`;tot/{jbYy>Lȃ% XO.f\KDFQ cp3??6o+ 9z_!-T^fE~V3t>ׯe_8 jբq\A^Kǚ[S'yn"ju>9B8_%@FF e~ăxͳDʕ1t09r{Z}8_[ؿ.&]Cݺ51eʫ1-/m?'n$UvI6Ua|-F{]xg7'$$[nҤ),VMև$DPj&Eزq/L&U*@VycԪSBQ֟~4q;ء3X㯨P! o:T8WDag^ekoQjTxO۶͵!^ es+.狉(_̞=:tPE5j֮[p4\pαk!_͚5 ~P0Hz87A6mڊ+~k7D[]HeJ|[TG@`G~Ç]v~ h޼y,3# ^Vlף{nxmDٳ+@3pAwzXj=q_> 3de~,ƍK 8Wlq IIظi+$In@TϺp̙TVV`%VJ DMb(K.>79l߾]9x<~xoJs !WTlٲ 9|l8NVn^%? P$"~U&`ϱHDٌ s;˷2qĞ_|Ez2E75??/߹oQ95M[JZmv{{ێK!/3jF^ ֈ%Jt˕"n8YsE" UT~>rzzƛAg.gAVV.HeŨ(.u-Eǡ"Ȑ /0?yc?cʲeJ"رc~ze˶|ٲ_׎yV_rү{56*\=[|!lł,]ĢOߧ 0@b fM>Hm. ~{ݻsHó>0}a>fY6aŢXZyܧD+ڌ;v5igϦ{UUr:3κp \uH kIrGE)m ";ɖ!p7(!P!e$oA G=)++)rr!;/n"ʄ$/l?^#8Y߽)`X6R-dB;1@P2v9*Q$.b 322j !g>td0AM^f c9k$7 c+E-Kt 7{HhČ(@(#1}_/~]O4|0"(0hwrfuwP4N TT_I96b(ۆls ˙R 1@b0( \ՠ%VTV+" + f0&) 4l|T?mB ŤxĊz.q(bўILN&kB %EW% 2 h^ӽHPA1ɐ@ H0Yt6t Q$ df1 IV˿JH RJfS"t1Uh^?dn`3AV l&Ĺb `2(N($?"(tuIENDB`Kst-2.0.8/qnx/kst-descriptor.xml0000755000175000017500000000303512277111530015666 0ustar synthsynth org.kde.kst Kst 2.0.6 Kst is the fastest real-time large-dataset viewing and plotting tool available. Now for PlayBook. none false true landscape -platform blackberry Nettek gYAAgISyPff3icYT0zYNfxjXN6g run_native access_shared armle-v7 kst pbsplash.png pbicon.png lib plugins pbicon.png pbsplash.png Kst-2.0.8/kst.pro0000644000175000017500000000043012277111530012675 0ustar synthsynthTEMPLATE = subdirs CONFIG += ordered qt thread SUBDIRS += \ src/libkst \ src/libkstmath \ src/datasources \ src/widgets \ src/libkstapp \ src/kst !macx:SUBDIRS += \ src/d2asc \ src/plugins \ tests !win32-msvc*:SUBDIRS += tests/dirfile_maker Kst-2.0.8/.travis.yml0000755000175000017500000000105412362705136013477 0ustar synthsynth # Travis-CI Build for kst2 # see travis-ci.org for details language: cpp install: - sudo apt-get update - sudo apt-get remove cmake mingw32-binutils mingw32-runtime mingw32 mingw-w64 g++-mingw-w64 gcc-mingw-w64 - sudo apt-get install m4 bison flex nsis-common nsis qt4-dev-tools subversion - sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386 # cmake is 32bit script: - ./cmake/travis.sh qt4 # - ./cmake/travis.sh qt5 - ./cmake/travis.sh qt5 x64 branches: only: - master - kst2.0.8 Kst-2.0.8/.krazy0000644000175000017500000000004612277111530012516 0ustar synthsynthIGNORESUBS old_tests old_datasources Kst-2.0.8/pyKst/0000755000175000017500000000000012362705136012475 5ustar synthsynthKst-2.0.8/pyKst/INSTALL0000644000175000017500000000323112277111530013517 0ustar synthsynthTo manually install pyKst: i) edit pykstpp_h.py to match your local invironment You probably only have to edit INCLUDES ii) install requirements -python2 (not python3), because of the following requirement -numpy >= 1.6 (1.6.1 is known to work) -scipy >= 0.9 (0.9.0 is known to work) These packages have requirements. -QtPy iii) copy pykstpp.py, pykstpp_h.py, and pykst.py to your system's python script directory eg, [host]$ sudo cp pykstpp.py pykstpp_h.py pykst.py /usr/lib/python2.7 iv) To test it, go into the demo directory, and try one. [host]$ python2 vectors.py I have no idea if this works on anything other than linux. ====== Example for ubuntu: 0) make sure you have the absolute latest kst2 from steve. See kst.kde.org 1) install dependencies for numpy and scipy sudo apt-get install python python-dev python-qt4 libatlas-base-dev gcc gfortran g++ 2) Install numpy 1.6.1 (ubuntu's default is not new enough) [host]$ tar xvfz numpy-1.6.1.tar.gz [host]$ cd numpy-1.6.1/ [host]$ python setup.py build --fcompiler=gnu95 [host]$ sudo python setup.py install 3) Install scipy-0.9.0 (ubuntu's default is not new enough) [host]$ tar xvfz scipy-0.9.0.tar.gz [host]$ cd scipy-0.9.0 [host]$ sudo python setup.py install 4) edit pykstpp_h.py Change INCLUDES as suggested by comments in pykstpp_h.py 5) copy files [host]$ sudo cp pykstpp.py pykstpp_h.py pykst.py /usr/lib/python2.7 6) test it [host]$ cd demo [host]$ python2.7 vectors.py ======== Try with cmake: # install the python files where they belong sudo cmake ../cmake/pyKst # Download, build, and install the right versions of numpy and scipy. # This is not needed if you already have them sudo make Kst-2.0.8/pyKst/pykstpp_h.py0000644000175000017500000000046012277111530015062 0ustar synthsynth# the followign for arch linux #INCLUDES=["/usr/include/QtCore","/usr/include/QtNetwork","/usr/include/Qt"] # the following for kubuntu INCLUDES=["/usr/include/qt4/QtCore","/usr/include/qt4/QtNetwork","/usr/include/qt4"] LIBS=["QtCore","QtNetwork"] LIBDIRS=["/usr/lib/x86_64-linux-gnu/", "/usr/lib/"] Kst-2.0.8/pyKst/demo/0000755000175000017500000000000012362705136013421 5ustar synthsynthKst-2.0.8/pyKst/demo/vectors.py0000644000175000017500000000117012277111530015451 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst from datetime import datetime from numpy import * from PyQt4 import QtCore, QtNetwork, QtGui from time import sleep client=kst.Client() dt=datetime.now() vec=kst.GeneratedVector(client,0,1000,100000,"Generated Vector") print("Took "+str((datetime.now()-dt))+" to generate an 100000-sample vector.") dt=datetime.now() pyar=vec.getNumPyArray() #print("Took "+str((datetime.now()-dt))+" to import an 100000-sample vector.") #dt=datetime.now() #e=kst.EditableVector(client) #e.setFromList(pyar) #print("Took "+str((datetime.now()-dt))+" to export an 100000-sample vector.") #client.plot(vec,e) Kst-2.0.8/pyKst/demo/testplugins.py0000755000175000017500000000135412362701575016365 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst client=kst.Client("TestPlugins") v1 = client.new_generated_vector(0, 10, 10) v2 = client.new_generated_vector(0, 20, 10) c1 = client.new_curve(v1, v2) v4 = c1.x_vector() print v4.handle print v4.name(), v4.value(0), v4.value(1) lf1 = client.new_linear_fit(v1, v2) v3 = lf1.parameters() print v3.handle print v3.name(), v3.value(0), v3.value(1) v4 = lf1.fit() print v4.name(), v4.value(0), v4.value(1) v5 = lf1.residuals() print v5.name(), v5.value(0), v5.value(1) v6 = lf1.covariance() print v6.name(), v6.value(0), v6.value(1) x1 = lf1.reduced_chi2() print x1.name(), x1.value() print lf1.slope(), lf1.intercept() x2 = client.new_generated_scalar(3) pf1 = client.new_polynomial_fit(x2, v1, v2) Kst-2.0.8/pyKst/demo/dataobjects.py0000755000175000017500000000413412320547027016260 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst from datetime import datetime from numpy import * from PyQt4 import QtCore, QtNetwork, QtGui from time import sleep client=kst.Client("DataObjects2") P1=kst.Plot(client,0.25,0.25,0.5,0.5,0, "P1") P2=kst.Plot(client,0.75,0.25,0.5,0.5,0, "P2") P3=kst.Plot(client,0.25,0.75,0.5,0.5,0, "P3") P4=kst.Plot(client,0.75,0.75,0.5,0.5,0, "P4") C1 = kst.Circle(client, 0.7,0.7,0.1, strokeBrushColor="red") dataVectorIndex=kst.DataVector(client,"/home/cbn/programs/KDE/kst_tutorial/gyrodata.dat",field="INDEX",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=1000,skip=0) dataVectorGY1=kst.DataVector(client,"/home/cbn/programs/KDE/kst_tutorial/gyrodata.dat",field="Column 1",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=1000,skip=0) GYCurve=kst.NewCurve(client,dataVectorIndex, dataVectorGY1, curvecolor="blue", curveweight=1, placeinexistingplot=P1) GYEquation=kst.NewEquation(client, "x^2", dataVectorIndex) GYEqCurve = kst.NewCurve(client,GYEquation.X(), GYEquation.Y(), curvecolor="black", curveweight=1, placeinexistingplot=P2) GYSpectrum=kst.NewSpectrum(client, dataVectorGY1, length = 12, vectorUnits="^o/s", rateUnits="Hz", rate=100.16) GYSpecCurve = kst.NewCurve(client,GYSpectrum.X(), GYSpectrum.Y(), curvecolor="green", curveweight=1, placeinexistingplot=P3) GYHist=kst.NewHistogram(client, dataVectorGY1, rtAutoBin=True) GYHistCurve = kst.NewCurve(client,GYHist.X(), GYHist.Y(), curvecolor="black", curveweight=1, uselines=False, usebargraph=True, bargraphfill="green",placeinexistingplot=P4) LFit=kst.NewSinusoidFit(client, dataVectorIndex, dataVectorGY1, 1000, 3) GYFitCurve = kst.NewCurve(client,dataVectorIndex, LFit.Fit(), curvecolor="black", curveweight=1, placeinexistingplot=P1) Fit=kst.NewGaussianFit(client, GYHist.X(), GYHist.Y(), GYHist.Y()) GYFitCurve = kst.NewCurve(client,GYHist.X(), Fit.Fit(), curvecolor="black", curveweight=1, placeinexistingplot=P4) Filter = kst.NewShift(client, dataVectorGY1, 22) FiltCurve = kst.NewCurve(client,dataVectorIndex, Filter.Y(), curvecolor="red", curveweight=1, placeinexistingplot=P1) Kst-2.0.8/pyKst/demo/ksnspire.py0000644000175000017500000000207312277111530015625 0ustar synthsynth#!/usr/bin/python import sip sip.setapi('QString', 1) import pykst as kst import sys import random from PyQt4 import QtCore, QtNetwork, QtGui class KsNspire: text="" def __init__(self,client): self.client=client self.s=QtNetwork.QLocalSocket() self.s.readyRead.connect(self.create) self.s2=QtNetwork.QLocalSocket() self.s2.readyRead.connect(self.changeValue) self.l=kst.LineEdit(client,"",self.s2,0.47,0.975,0.93,0.025) self.b=kst.Button(client,"Go!",self.s,0.97,0.975,0.05,0.025) self.plot=kst.Plot(client,0.5,0.4885,0.9,0.8,0,"KsNspirePLOT") self.genVec=kst.GeneratedVector(self.client,-100,100,1000) def create(self): eq = kst.NewEquation(self.client,self.text,self.genVec) kst.NewCurve(client,eq.X(), eq.Y(), curvecolor="black", curveweight=1, placeinexistingplot=self.plot) def changeValue(self): strx=QtCore.QString(self.s2.read(8000)) if strx.contains("valueSet:"): strx.remove("valueSet:") self.text=str(strx) client=kst.Client() app=QtGui.QApplication(sys.argv) m=KsNspire(client) app.exec_() Kst-2.0.8/pyKst/demo/testviewitems.py0000755000175000017500000000243212362701575016716 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst client=kst.Client("DataObjects2") P1=client.new_plot((0.25,0.25),(0.5,0.5),0) P2 = client.plot(P1.handle) P2.set_x_range(-10.0,10.0) P2.set_global_font("courier",False,False) P2.set_name("Fred the plot") C1 = client.new_circle((0.9,0.3),0.1, strokeBrushColor="red") C2 = client.circle(C1.handle) C2.set_fill_color("Green") B1 = client.new_box((0.9,0.9), (0.1,0.1), fillColor="pink") B2 = client.box(B1.handle) B2.set_fill_color("Green") E1 = client.new_ellipse((0.1, 0.7), (0.1, 0.1), 45, fillColor="blue") E2 = client.ellipse(E1.handle) E2.set_fill_color("Green") A1 = client.new_arrow((0.1, 0.5), 0.1, 45, False, True, 18) A2 = client.arrow(A1.handle) A2.set_stroke_style(3) L1 = client.new_line((0.1, 0.5), 0.1, 15, strokeWidth=4, strokeBrushColor="green") L2 = client.line(L1.handle) L2.set_stroke_style(2) I1 = client.new_picture("/home/cbn/Desktop/from_deck1_cropped.jpg",(0.4, 0.6), 0.3, 0) I2 = client.picture(I1.handle) I2.set_width(0.1) S1 = client.new_SVG("/home/cbn/notes/blastbus/layout.svg", (0.6, 0.3), 0.2, 0) S2 = client.SVG(S1.handle) S2.set_width(0.1) Label = client.new_label("Label Here", (0.7,0.7), 0, 16, fontFamily="courier") Label.set_font_italic(True) Label2 = client.label(Label.handle) Label2.set_text("changed label text") Kst-2.0.8/pyKst/demo/kstOwl.py0000644000175000017500000001056712277111530015261 0ustar synthsynth#!/bin/python import sip sip.setapi('QString', 1) import pykst as kst import sys import urllib.request as urllib2 import json import math import xml.dom.minidom import ctypes from PyQt4 import QtCore, QtNetwork, QtGui class KstOwl(QtCore.QObject) : labels=[] def __init__(self,client) : super(KstOwl, self).__init__(None) self.client=client self.ctimer = QtCore.QTimer() QtCore.QObject.connect(self.ctimer, QtCore.SIGNAL("timeout()"), self.update) self.ctimer.start(30) for i in range(1000): self.labels.append(0) css = urllib2.urlopen("http://hen.astro.utoronto.ca/cgi-bin/owl-cgi?blast2010:css") x=QtCore.QString(css.read()).split("\n") i=0 bg = list() fg = list() for i in range(0,x.count()): if((i+1)%3==1): y=x[i] y.remove(0,y.indexOf("color:")+6) z=y y.remove(y.indexOf(";"),99999) bg.append(y) z.remove(0,z.indexOf(":")+1) z.remove(z.indexOf(";")+1,99999) fg.append(y) response = urllib2.urlopen("http://hen.astro.utoronto.ca/cgi-bin/owl-cgi?blast2010:layout") dom=xml.dom.minidom.parseString(response.read()) for n in dom.getElementsByTagName("Owl"): for nn in n.getElementsByTagName("top"): top=nn.firstChild.toxml() for nn in n.getElementsByTagName("left"): left=nn.firstChild.toxml() for nn in n.getElementsByTagName("width"): width=nn.firstChild.toxml() for nn in n.getElementsByTagName("height"): height=nn.firstChild.toxml() rt=(float(top)+float(height)/2.0)/1200.0 rl=(float(left)+float(width)/2.0)/1200.0 rx=(float(width))/1200.0 ry=(float(height))/1200.0 self.owl=kst.Picture(client,"/home/joshua/owl0.png",rl,rt,math.sqrt(rx*rx+ry*ry)/2) for n in dom.getElementsByTagName("PBox"): for nn in n.getElementsByTagName("top"): top=nn.firstChild.toxml() for nn in n.getElementsByTagName("left"): left=nn.firstChild.toxml() for nn in n.getElementsByTagName("width"): width=nn.firstChild.toxml() for nn in n.getElementsByTagName("height"): height=nn.firstChild.toxml() for nn in n.getElementsByTagName("title"): title=nn.firstChild.toxml() for nn in n.getElementsByTagName("boxStyle"): style=nn.firstChild.toxml() rt=(float(top)+float(height)/2.0)/1200.0 rl=(float(left)+float(width)/2.0)/1200.0 rx=(float(width))/1200.0 ry=(float(height))/1200.0 box=kst.Box(client,"false",rl,rt,rx,ry,0,bg[int(style)],1,1,1,"black",1,1,1) label=kst.Label(client,title,6,"false","false",fg[int(style)],"Serif",(float(left)+5.0)/1200.0,(float(top)+float(4)/2.0)/1200.0,0,3,3,0,0) pos=14 maxl=0 c=0 ids=list() for nn in n.getElementsByTagName("PDataItem"): c+=1 #c++ for nnn in nn.getElementsByTagName("capStyle"): style=nnn.firstChild.toxml() for nnn in nn.getElementsByTagName("caption"): caption=nnn.firstChild.toxml() for nnn in nn.getElementsByTagName("dataID"): ids.append(int(nnn.firstChild.toxml())) label=kst.Label(client,caption,6,"false","false",fg[int(style)],"Serif",(float(left)+5.0)/1200.0,(float(top)+pos+float(8)/2.0)/1200.0,0,3,3,0,0) pos+=14 x=QtGui.QFontMetrics(QtGui.QFont("Serif",8)).width(caption) maxl=x if x>maxl else maxl i=0 pos=14 for i in range(0,c): self.labels[ids[i]]=kst.GeneratedString(client,"Loading","owl"+str(ids[i])) kst.Label(client,"[owl"+str(ids[i])+"]",6,"false","false","Black","Serif",(float(left)+5.0+maxl)/1200.0,(float(top)+pos+float(8)/2.0)/1200.0,0,3,3,0,0) pos+=14 def update(self): response = urllib2.urlopen("http://hen.astro.utoronto.ca/cgi-bin/owl-cgi?blast2010:data") objects=json.loads(str(response.read().decode('utf8'))) self.owl.setPic(QtCore.QString("/home/joshua/owl"+str(objects["owlData"]["owlStage"])+".png")) for o in objects["owlData"]["Obj"]: x=QtCore.QString(str(o)) if x.contains("{\'i\': "): y=QtCore.QString(str(x)) y.remove(0,6) y.remove(y.indexOf(","),99999) z=QtCore.QString(str(x)) z.remove(0,z.lastIndexOf(": ")+3) z.chop(2) if z.contains("src")==False: self.labels[int(str(y))].setValue(z) client=kst.Client() app=QtGui.QApplication(sys.argv) owl=KstOwl(client) app.exec_() Kst-2.0.8/pyKst/demo/matrix.py0000644000175000017500000000145712277111530015300 0ustar synthsynth#!/usr/bin/python import pykst as kst from datetime import datetime from numpy import * from PyQt4 import QtCore, QtNetwork, QtGui def mandelbrot( h,w, maxit=10 ): '''Returns an image of the Mandelbrot fractal of size (h,w). ''' y,x = ogrid[ -1.4:1.4:h*1j, -2:0.8:w*1j ] c = x+y*1j z = c divtime = maxit + zeros(z.shape, dtype=float64) for i in xrange(maxit): z = z**2 + c diverge = z*conj(z) > 2**2 # who is diverging div_now = diverge & (divtime==maxit) # who is diverging now divtime[div_now] = i # note when z[diverge] = 2 # avoid diverging too much return divtime client=kst.Client() dt=datetime.now() client.plot(mandelbrot(100,100)) arr_2d=kst.ExistingMatrix.getList(client)[-1].getNumPyArray() client.plot(arr_2d) Kst-2.0.8/pyKst/demo/testdataobjects.py0000755000175000017500000000043112362705136017157 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst client=kst.Client("TestPlugins") v1 = client.new_generated_vector(0, 10, 10) v4 = client.new_generated_vector(0, 20, 100) e1 = client.new_equation(v1, "x^2") e1.set_x(v4) v2 = e1.Y() v3 = e1.X() print v2.name(), v2.value(3), v3.value(3) Kst-2.0.8/pyKst/demo/primitives.py0000755000175000017500000000413412320547027016170 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst from datetime import datetime from numpy import * from PyQt4 import QtCore, QtNetwork, QtGui from time import sleep client=kst.Client("DataObjects2") P1=kst.Plot(client,0.25,0.25,0.5,0.5,0, "P1") P2=kst.Plot(client,0.75,0.25,0.5,0.5,0, "P2") P3=kst.Plot(client,0.25,0.75,0.5,0.5,0, "P3") P4=kst.Plot(client,0.75,0.75,0.5,0.5,0, "P4") C1 = kst.Circle(client, 0.7,0.7,0.1, strokeBrushColor="red") dataVectorIndex=kst.DataVector(client,"/home/cbn/programs/KDE/kst_tutorial/gyrodata.dat",field="INDEX",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=1000,skip=0) dataVectorGY1=kst.DataVector(client,"/home/cbn/programs/KDE/kst_tutorial/gyrodata.dat",field="Column 1",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=1000,skip=0) GYCurve=kst.NewCurve(client,dataVectorIndex, dataVectorGY1, curvecolor="blue", curveweight=1, placeinexistingplot=P1) GYEquation=kst.NewEquation(client, "x^2", dataVectorIndex) GYEqCurve = kst.NewCurve(client,GYEquation.X(), GYEquation.Y(), curvecolor="black", curveweight=1, placeinexistingplot=P2) GYSpectrum=kst.NewSpectrum(client, dataVectorGY1, length = 12, vectorUnits="^o/s", rateUnits="Hz", rate=100.16) GYSpecCurve = kst.NewCurve(client,GYSpectrum.X(), GYSpectrum.Y(), curvecolor="green", curveweight=1, placeinexistingplot=P3) GYHist=kst.NewHistogram(client, dataVectorGY1, rtAutoBin=True) GYHistCurve = kst.NewCurve(client,GYHist.X(), GYHist.Y(), curvecolor="black", curveweight=1, uselines=False, usebargraph=True, bargraphfill="green",placeinexistingplot=P4) LFit=kst.NewSinusoidFit(client, dataVectorIndex, dataVectorGY1, 1000, 3) GYFitCurve = kst.NewCurve(client,dataVectorIndex, LFit.Fit(), curvecolor="black", curveweight=1, placeinexistingplot=P1) Fit=kst.NewGaussianFit(client, GYHist.X(), GYHist.Y(), GYHist.Y()) GYFitCurve = kst.NewCurve(client,GYHist.X(), Fit.Fit(), curvecolor="black", curveweight=1, placeinexistingplot=P4) Filter = kst.NewShift(client, dataVectorGY1, 22) FiltCurve = kst.NewCurve(client,dataVectorIndex, Filter.Y(), curvecolor="red", curveweight=1, placeinexistingplot=P1) Kst-2.0.8/pyKst/demo/bonjourMonde.py0000644000175000017500000000132412277111530016426 0ustar synthsynth#!/usr/bin/python import sip sip.setapi('QString', 1) import pykst as kst import sys import random from PyQt4 import QtCore, QtNetwork, QtGui class Magic: def __init__(self,client): self.client=client def test(self): self.client=client random.seed() kst.Circle(self.client,random.random(),random.random(),random.random()/10.0,random.random()*180,"#"+str(random.randint(0,9))+str(random.randint(0,9))+str(random.randint(0,9)),1,1,4,"#"+str(random.randint(0,9))+str(random.randint(0,9))+str(random.randint(0,9))) client=kst.Client() app=QtGui.QApplication(sys.argv) m=Magic(client) s=QtNetwork.QLocalSocket() s.readyRead.connect(m.test) b=kst.Button(client,"Hello World!",s,0.5,0.5,0.2,0.1) app.exec_() Kst-2.0.8/pyKst/demo/testvector.py0000755000175000017500000000057512362705136016207 0ustar synthsynth#!/usr/bin/python2.7 import pykst as kst from datetime import datetime from numpy import * from PyQt4 import QtCore, QtNetwork, QtGui from time import sleep client=kst.Client("DataObjects2") dataVectorGY1=kst.DataVector(client,"/home/cbn/programs/KDE/kst_tutorial/gyrodata.dat",field="Column 1",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=1000,skip=0) Kst-2.0.8/pyKst/README0000644000175000017500000000231112277111530013344 0ustar synthsynthPyKst is, at the time of writing, not stable enough for serious use. For the time being, do not write scripts with it except to test and to send feedback. PyKst is tested on Python 2.6 and does not work with Python 3.x. PyKst needs NumPy 1.6 and does not work with NumPy 1.5. If it is very important that it should work with NumPy 1.5, modify pykstpp.py to work with the old API (and submit these changes to kst!!) or send an email to the devel list. PyKst currently is not portable as pykstpp.py contains C++ code which is compiled upon first use. It should, instead, create a dynamic library at Kst compile time. Also, it does not detect the location of the Qt library or include files, so to get it to compile you might have to modify pykstpp.py. Please email the Kst list with feature requests and bug reports. I am not able to work on scripting as much as I have had the chance to do in the past two weeks because of high school, but can certainly try to help with relatively minor fixes. The fastest way to get started is to take a look at the examples inside the svn tree at pyKst/ Documentation is available for now at hen.astro.utoronto.ca/pyKst or inside the svn tree at pyKst/doc. Josh ---------------- Kst-2.0.8/pyKst/html/0000755000175000017500000000000012362705136013441 5ustar synthsynthKst-2.0.8/pyKst/html/conf.py0000644000175000017500000001574112277111530014742 0ustar synthsynth# -*- coding: utf-8 -*- # # pykst documentation build configuration file, created by # sphinx-quickstart on Wed Aug 24 14:42:11 2011. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('../')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'pykst' copyright = u'2011-2012, Joshua Netterfield, C. Barth Netterfield' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = 'tp2' # The full version, including alpha/beta/rc tags. release = 'tp2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'pykstdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'pykst.tex', u'pykst Documentation', u'Joshua Netterfield and C. Barth Netterfield', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pykst', u'pykst Documentation', [u'Joshua Netterfield'], 1) ] Kst-2.0.8/pyKst/html/index.rst0000644000175000017500000000740712362705136015312 0ustar synthsynth.. toctree:: :maxdepth: 2 Welcome to pykst's documentation! ================================= PyKst is a python interface to kst. With PyKst, scripts can control and share data with a kst session. Clients ******************* To interact with a kst session, you must create a client. To open an interface with the last kst session started, or if none open, a new one, try:: import pykst as kst client = kst.Client() .. automodule:: pykst :members: Client :exclude-members: getArray, getList, send Primitives ********** Scalars, Vectors, Matrices, and Strings (Primitives) can be used in your scripts to share data with kst. All methods are pass-by-value: for example, if you get a value of a scalar and change it, the data inside kst is not changed. You need to explicitly call setValue(). You can get an instance of an existing primitive through the ExistingScalar, ExistingVector, ExistingMatrix, and ExistingString classes. These classes also provide a class method getList() which returns a list of all instances of that type. Scalars ------- .. autoclass:: DataSourceScalar :members: :inherited-members: .. autoclass:: VectorScalar :members: :inherited-members: .. autoclass:: GeneratedScalar :members: :inherited-members: Vectors ------- .. autoclass:: DataVector :members: :inherited-members: .. autoclass:: GeneratedVector :members: :inherited-members: Matrices --------- .. autoclass:: DataMatrix :members: :inherited-members: Strings ------- .. autoclass:: DataSourceString :members: :inherited-members: :exclude-members: setValue .. autoclass:: GeneratedString :members: :inherited-members: Relations ********* Relations are objects which can be added to a plot. Curves ------ .. autoclass:: Curve :members: :inherited-members: Annotations *********** Annotations along with interactive items (see the next section) can be used to turn kst into a graphing calculator, a tetris client, and maybe even a web browser... .. autoclass:: Label :members: :inherited-members: :exclude-members: set_fill_color, set_fill_style, set_stroke_style, set_stroke_width, set_stroke_brush_color, set_stroke_brush_style, set_stroke_join_style, set_stroke_cap_style, set_fixed_aspect_ratio, set_size .. autoclass:: Box :members: :inherited-members: .. autoclass:: Circle :members: :inherited-members: :exclude-members: set_stroke_join_style, set_stroke_cap_style, set_fixed_aspect_ratio, set_size .. autoclass:: Ellipse :members: :inherited-members: :exclude-members: set_stroke_join_style, set_stroke_cap_style .. autoclass:: Line :members: :inherited-members: :exclude-members: set_fill_color, set_fill_style, set_stroke_join_style, set_fixed_aspect_ratio, set_size .. autoclass:: Arrow :members: :inherited-members: :exclude-members: set_fill_color, set_fill_style, set_stroke_join_style, set_fixed_aspect_ratio, set_size .. autoclass:: Picture :members: :inherited-members: :exclude-members: set_fill_color, set_fill_style, set_stroke_style, set_stroke_width, set_stroke_brush_color, set_stroke_brush_style, set_stroke_join_style, set_stroke_cap_style .. autoclass:: SVG :members: :inherited-members: :exclude-members: set_fill_color, set_fill_style, set_stroke_style, set_stroke_width, set_stroke_brush_color, set_stroke_brush_style, set_stroke_join_style, set_stroke_cap_style .. autoclass:: Plot :members: :inherited-members: Interactive items ***************** Interactive items are controls which are part of a kst view and use QtNetwork.QLocalSocket to notify the script when the user has interacted with them. They can only be created through scripts. .. autoclass:: Button :members: :inherited-members: .. autoclass:: LineEdit :members: :inherited-members: Kst-2.0.8/pyKst/html/Makefile0000644000175000017500000001075212320547027015103 0ustar synthsynth# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pykst.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pykst.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/pykst" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pykst" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." Kst-2.0.8/pyKst/html/code.rst0000644000175000017500000000000012277111530015065 0ustar synthsynthKst-2.0.8/pyKst/html/make.bat0000644000175000017500000001001012277111530015030 0ustar synthsynth@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pykst.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pykst.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end Kst-2.0.8/pyKst/AddingInterfaces0000644000175000017500000000225012320547027015606 0ustar synthsynthHow to add an interface for a new NamedObject. -Create a class which inherits from ScriptInterface. eg, ScalarGenSI in scalarsscriptinterface.cpp -Implement the 5 methods. -doCommand actually parses the commands from pyKst.py -you probably want to call doNamedObjectCommand as is done in ScalarGenSI::doCommand() -Add virtual ScriptInterface* createScriptInterface() to the class you are making an interface for. eg, Scalar. ScriptInterface* Scalar::createScriptInterface() { return new ScalarGenSI(this); } -Create a command in ScripServer.h eg, QByteArray newGeneratedScalar(QByteArray& command, QLocalSocket* s,ObjectStore*_store); -Implement it in ScripServer.cpp QByteArray ScriptServer::newGeneratedScalar(QByteArray&, QLocalSocket* s,ObjectStore*) { if(_interface) { return handleResponse("To access this function, first call endEdit()",s); } else { _interface = ScalarGenSI::newScalar(_store); return handleResponse("Ok",s); } } -register it in _fnMap _fnMap.insert("newGeneratedScalar()",&ScriptServer::newGeneratedScalar); -Call the interface you just wrote in pyKst.py search for GeneratedScalar as an example. Kst-2.0.8/pyKst/pykstpp.py0000644000175000017500000001521712277111530014561 0ustar synthsynthimport numpy as npy from scipy.weave import inline import pykstpp_h as pykstpp_h def get_arr(arr,socket,handle): dtype2ctype = { npy.dtype(npy.float64): 'double', npy.dtype(npy.float32): 'float', npy.dtype(npy.int32): 'int', npy.dtype(npy.int16): 'short', } dt = dtype2ctype.get(arr.dtype) #I'm leaving this code here in case anyone wants to mess with it. assert(dt=='double') # Only use float64 arrays! code = \ """ // // I don't usually program in python, but when I do, I program in C++ // QLocalSocket s; s.connectToServer(QString(socket.c_str())); s.waitForConnected(300); s.write("Vector::getBinaryArray("+QByteArray(handle.c_str())+")"); QDataStream ds(&s); qint64 count; s.waitForReadyRead(-1); ds>>count; PyArray_Dims dims; dims.len = 1; dims.ptr = new npy_intp[1]; dims.ptr[0] = (npy_intp)count; PyArray_Resize(arr_array, &dims, 0, PyArray_ANYORDER); delete[]dims.ptr; NpyIter* it=NpyIter_New(arr_array,NPY_ITER_READWRITE,NPY_CORDER,NPY_NO_CASTING,NULL); char**dataptr = NpyIter_GetDataPtrArray(it); NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(it, NULL); do { char* data=*dataptr; //i.e., byte array while(ds.atEnd()) {s.waitForReadyRead(-1);} //possible optimization: call ds.atEnd() less ds>>((double*)data)[0]; //possible optimization: QByteArray switches the endianess twice... } while(iternext(it)); """ #% (dt) support_code = \ """ #include #include """ socket=str(socket) handle=str(handle) inline(code, ['arr','socket','handle'],support_code=support_code,include_dirs=pykstpp_h.INCLUDES,libraries=pykstpp_h.LIBS,runtime_library_dirs=pykstpp_h.LIBDIRS) # I'm not sure if the above line can be made portable or not... def get_matrix(arr,socket,handle): dtype2ctype = { npy.dtype(npy.float64): 'double', npy.dtype(npy.float32): 'float', npy.dtype(npy.int32): 'int', npy.dtype(npy.int16): 'short', } dt = dtype2ctype.get(arr.dtype) #I'm leaving this code here in case anyone wants to mess with it. assert(dt=='double') # Only use float64 arrays! code = \ """ // // I don't usually program in python, but when I do, I program in C++ // QLocalSocket s; s.connectToServer(QString(socket.c_str())); s.waitForConnected(300); s.write("Matrix::getBinaryArray("+QByteArray(handle.c_str())+")"); QDataStream ds(&s); qint64 count; s.waitForReadyRead(-1); qint32 nX,nY; double minX,minY,stepX,stepY; ds>>nX>>nY>>minX>>minY>>stepX>>stepY; PyArray_Dims dims; dims.len = 2; dims.ptr = new npy_intp[2]; dims.ptr[0] = (npy_intp)nX; dims.ptr[1] = (npy_intp)nY; PyArray_Resize(arr_array, &dims, 0, PyArray_ANYORDER); delete[]dims.ptr; NpyIter* it=NpyIter_New(arr_array,NPY_ITER_READWRITE,NPY_CORDER,NPY_NO_CASTING,NULL); char**dataptr = NpyIter_GetDataPtrArray(it); NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(it, NULL); do { char* data=*dataptr; //i.e., byte array while(ds.atEnd()) {s.waitForReadyRead(-1);} //possible optimization: call ds.atEnd() less ds>>((double*)data)[0]; //possible optimization: QByteArray switches the endianess twice... } while(iternext(it)); """ #% (dt) support_code = \ """ #include #include #include #include """ socket=str(socket) handle=str(handle) inline(code, ['arr','socket','handle'],support_code=support_code,include_dirs=pykstpp_h.INCLUDES,libraries=pykstpp_h.LIBS,runtime_library_dirs=pykstpp_h.LIBDIRS) # I'm not sure if the above line can be made portable or not... def set_arr(arr,socket,handle): dtype2ctype = { npy.dtype(npy.float64): 'double', npy.dtype(npy.float32): 'float', npy.dtype(npy.int32): 'int', npy.dtype(npy.int16): 'short', } dt = dtype2ctype.get(arr.dtype) assert(dt=='double') # Only use float64 arrays! code = \ """ // // I don't usually program in python, but when I do, I program in C++ // QLocalSocket s; s.connectToServer(QString(socket.c_str())); s.waitForConnected(300); s.write("EditableVector::setBinaryArray("+QByteArray(handle.c_str())+")"); s.waitForReadyRead(-1); QDataStream ds(&s); ds<<(qint64)PyArray_SIZE(arr_array); NpyIter* it=NpyIter_New(arr_array,NPY_ITER_READWRITE,NPY_CORDER,NPY_NO_CASTING,NULL); char**dataptr = NpyIter_GetDataPtrArray(it); NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(it, NULL); int l=0; int v=0; do { ++v; char* data=*dataptr; //i.e., byte array ds<<((double*)data)[0]; //possible optimization: QByteArray switches the endianess twice... if(++l==512) { while(s.bytesToWrite()) { s.waitForBytesWritten(-1); } l=0; } } while(iternext(it)); while(s.bytesToWrite()) { s.waitForBytesWritten(-1); } """ #% (dt) support_code = \ """ #include #include #include #include """ socket=str(socket) handle=str(handle) inline(code, ['arr','socket','handle'],support_code=support_code,include_dirs=pykstpp_h.INCLUDES,libraries=pykstpp_h.LIBS,runtime_library_dirs=pykstpp_h.LIBDIRS) # I'm not sure if the above line can be made portable or not... def set_matrix(arr,nX,nY,socket,handle): dtype2ctype = { npy.dtype(npy.float64): 'double', npy.dtype(npy.float32): 'float', npy.dtype(npy.int32): 'int', npy.dtype(npy.int16): 'short', } dt = dtype2ctype.get(arr.dtype) assert(dt=='double') # Only use float64 arrays! code = \ """ // // I don't usually program in python, but when I do, I program in C++ // QLocalSocket s; s.connectToServer(QString(socket.c_str())); s.waitForConnected(300); s.write("EditableMatrix::setBinaryArray("+QByteArray(handle.c_str())+","+QByteArray::number(nX)+","+QByteArray::number(nY)+","+"0.0,0.0,1.0,1.0)"); s.waitForReadyRead(-1); QDataStream ds(&s); NpyIter* it=NpyIter_New(arr_array,NPY_ITER_READWRITE,NPY_CORDER,NPY_NO_CASTING,NULL); char**dataptr = NpyIter_GetDataPtrArray(it); NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(it, NULL); int l=0; int v=0; do { ++v; char* data=*dataptr; //i.e., byte array ds<<((double*)data)[0]; //possible optimization: QByteArray switches the endianess twice... if(++l==512) { while(s.bytesToWrite()) { s.waitForBytesWritten(-1); } l=0; } } while(iternext(it)); while(s.bytesToWrite()) { s.waitForBytesWritten(-1); } """ #% (dt) support_code = \ """ #include #include #include #include """ socket=str(socket) handle=str(handle) inline(code, ['arr','nX','nY','socket','handle'],support_code=support_code,include_dirs=pykstpp_h.INCLUDES,libraries=pykstpp_h.LIBS,runtime_library_dirs=pykstpp_h.LIBDIRS) # I'm not sure if the above line can be made portable or not... Kst-2.0.8/pyKst/pykst.py0000644000175000017500000025214012362705136014225 0ustar synthsynth#import sip #sip.setapi('QString', 1) import sys import math import os import ctypes #from time import sleep #from PyQt4 import QtCore, QtNetwork from PySide import QtCore, QtNetwork from numpy import * #from pykstpp import * def b2str(val): if isinstance(val, bool): return "True" if val else "False" else: return str(val) class Client: """ An interface to a running kst session. Every class inside pykst accepts an instance of Client which it uses to interact with a kst session. Alternatively, the classes are accessable from the Client. In addition, it holds functions which effect the entire kst session. If serverName is specified, creates a connection to either a running kst session with serverName, or if none exists, a new one. If serverName is not specified, creates a connection to either the kst session with the name ``kstScript``, or if none exists, a new one. """ def __init__(self,serverName="kstScript"): self.ls=QtNetwork.QLocalSocket() self.ls.connectToServer(serverName) self.ls.waitForConnected(300) self.serverName=serverName if self.ls.state()==QtNetwork.QLocalSocket.UnconnectedState: os.system("kst2 --serverName="+str(serverName)+"&") while self.ls.state()==QtNetwork.QLocalSocket.UnconnectedState: self.ls.connectToServer(serverName) self.ls.waitForConnected(300) self.serverName=serverName def send(self,command): """ Sends a command to kst and returns a response. You should never use this directly, as there is no guarantee that the internal command list kst uses won't change. Instead use the convenience classes included with pykst. """ self.ls.write(command) self.ls.flush() self.ls.waitForReadyRead(300000) x=self.ls.readAll() return x def send_si(self, handle, command): self.send(b2str("beginEdit("+handle+")")) x = self.send(command) self.send(b2str("endEdit()")) return x def clear(self): """ Clears all objects from kst. Equivalent to file->close from the menubar inside kst. """ self.send("clear()") def open_kst_file(self, filename): """ open a .kst file in kst. """ self.send("fileOpen("+b2str(filename)+")") def save_kst_file(self, filename): """ save a .kst file in kst. """ self.send("fileSave("+b2str(filename)+")") def screen_back(self): """ Equivalent to "Range>Back One Screen" from the menubar inside kst. """ self.send("screenBack()") def screen_forward(self): """ Equivalent to "Range>Forward One Screen" from the menubar inside kst. """ self.send("screenForward()") def count_from_end(self): """ Equivalent to "Range>Count From End" from the menubar inside kst. """ self.send("countFromEnd()") def read_to_end(self): """ Equivalent to "Range>Read To End" from the menubar inside kst. """ self.send("readToEnd()") def set_paused(self): """ Equivalent to checking "Range>Pause" from the menubar inside kst.""" self.send("setPaused()") def unset_paused(self): """ Equivalent to unchecking "Range>Pause" from the menubar inside kst.""" self.send("unsetPaused()") def tab_count(self): """ Get the number of tabs open in the current document. """ return self.send("tabCount()") def new_tab(self): """ Create a new tab in the current document and switch to it. """ return self.send("newTab()") def set_tab(self,tab): """ Set the index of the current tab. tab must be greater or equal to 0 and less than tabCount(). """ self.send("setTab("+b2str(tab)+")") def new_generated_string(self, string, name=""): """ Create a new generated string in kst. See :class:`GeneratedString` """ return GeneratedString(self, string, name) def generated_string(self, name): """ Returns a generated string from kst given its name. See :class:`GeneratedString` """ return GeneratedString(self, "", name, new=False) def new_datasource_string(self, filename, field, name=""): """ Create a New Data Source String in kst. See :class:`DataSourceString` """ return DataSourceString(self, filename, field, name) def datasource_string(self, name): """ Returns a datasource string from kst given its name. See :class:`DataSourceString` """ return DataSourceString(self, "", "", name, new=False) def new_generated_scalar(self, value, name=""): """ Create a New Generated Scalar in kst. See :class:`GeneratedScalar` """ return GeneratedScalar(self, value, name) def generated_scalar(self, name): """ Returns a Generated Scalar from kst given its name. See :class:`GeneratedScalar` """ return GeneratedScalar(self, "", name, new=False) def new_datasource_scalar(self, filename, field, name=""): """ Create a New DataSource Scalar in kst. See :class:`DataSourceScalar` """ return DataSourceScalar(self, filename, field, name) def datasource_scalar(self, name): """ Returns a DataSource Scalar from kst given its name. See :class:`DataSourceScalar` """ return DataSourceScalar(self, "", "", name, new=False) def new_vector_scalar(self, filename, field, frame=-1, name=""): """ Create a New VectorScalar in kst. See :class:`VectorScalar` """ return VectorScalar(self, filename, field, frame, name) def vector_scalar(self, name): """ Returns a VectorScalar from kst given its name. See :class:`VectorScalar` """ return VectorScalar(self, "", "", 0, name, new=False) def new_data_vector(self, filename, field, start=0, NFrames=-1, skip=0, boxcarFirst=False, name="") : """ Create a New DataVector in kst. See :class:`DataVector` """ return DataVector(self, filename, field, start, NFrames, skip, boxcarFirst, name) def data_vector(self, name): """ Returns a DataVector from kst given its name. See :class:`DataVector` """ return DataVector(self, "", "", name=name, new=False) def new_generated_vector(self, X0, X1, N, name=""): """ Create a New GeneratedVector in kst. See :class:`GeneratedVector` """ return GeneratedVector(self, X0, X1, N, name) def generated_vector(self, name): """ Returns a GeneratedVector from kst given its name. See :class:`GeneratedVector` """ return GeneratedVector(self, 0, 0, 0, name, new=False) def new_data_matrix(self, filename, field, startX=0, startY=0, nX=-1, nY=-1, minX=0, minY=0, dX=1, dY=1,name="") : """ Create a New DataMatrix in kst. See :class:`DataMatrix` """ return DataMatrix(self, filename, field, startX, startY, nX, nY, minX, minY, dX, dY,name) def data_matrix(self, name): """ Returns a DataMatrix from kst given its name. See :class:`DataMatrix` """ return DataMatrix(self, "", "", name=name, new=False) def new_curve(self, xVector, yVector, name=""): """ Create a New Curve in kst. See :class:`Curve` """ return Curve(self, xVector, yVector, name) def curve(self, name): """ Returns a Curve from kst given its name. See :class:`Curve` """ return Curve(self, "", "", name, new=False) def new_image(self, matrix, name=""): """ Create a new Image in kst. See :class:`Image` """ return Image(self, matrix, name) def image(self, name): """ Returns an Image from kst given its name. See :class:`Image` """ return Image(self, "", "", name, new=False) def new_equation(self, x_vector, equation, name=""): """ Create a new Equation in kst. See :class:`Equation` """ return Equation(self, x_vector, equation, name) def equation(self, name): """ Returns an Equation from kst given its name. See :class:`Equation` """ return Equation(self, "", "", name, new=False) def new_linear_fit(self, xVector, yVector, weightvector = 0, name = ""): """ Create a New Linear Fit in kst. See :class:`LinearFit` """ return LinearFit(self, xVector, yVector, weightvector, name) def linear_fit(self, name): """ Returns a linear fit from kst given its name. See :class:`LinearFit` """ return LinearFit(self, "", "", 0, name, new=False) def new_polynomial_fit(self, order, xVector, yVector, weightvector = 0, name = ""): """ Create a New Polynomial Fit in kst. See :class:`PolynomialFit` """ return PolynomailFit(self, order, xVector, yVector, weightvector, name) def polynomial_fit(self, name): """ Returns a polynomial fit from kst given its name. See :class:`PolynomialFit` """ return PolynomialFit(self, 0, "", "", 0, name, new=False) def new_label(self, text, pos=(0.5,0.5), rot=0, fontSize=12, bold=False, italic=False, fontColor="black", fontFamily="Serif", name="") : """ Create a New Label in kst. See :class:`Label` """ return Label(self, text, pos, rot, fontSize, bold, italic, fontColor, fontFamily, name) def label(self, name): """ Returns a Label from kst given its name. See :class:`Label` """ return Label(self, "", name=name, new=False) def new_box(self, pos=(0.1,0.1), size=(0.1,0.1), rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeJoinStyle=1, strokeCapStyle=1, fixAspect=False, name="") : """ Create a New Box in kst. See :class:`Box` """ return Box(self, pos, size, rot, fillColor, fillStyle, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, strokeJoinStyle, strokeCapStyle, fixAspect, name) def box(self, name): """ Returns a Box from kst given its name. See :class:`Box` """ return Box(self, name=name, new=False) def new_circle(self, pos=(0.1, 0.1), diameter=0.1, fillColor="white",fillStyle=1,strokeStyle=1, strokeWidth=1,strokeBrushColor="grey",strokeBrushStyle=1, name="") : """ Create a New Circle in kst. See :class:`Circle` """ return Circle(self, pos, diameter, fillColor, fillStyle, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, name) def circle(self, name): """ Returns a Circle from kst given its name. See :class:`Circle` """ return Circle(self, name=name, new=False) def new_ellipse(self,pos=(0.1,0.1), size=(0.1,0.1), rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, fixAspect=False, name="") : """ Create a New Ellipse in kst. See :class:`Ellipse` """ return Ellipse(self,pos, size, rot, fillColor, fillStyle, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, fixAspect, name) def ellipse(self, name): """ Returns an ellipse from kst given its name. See :class:`Ellipse` """ return Ellipse(self, name=name, new=False) def new_line(self,pos=(0.1,0.1),length=0.1,rot=0, strokeStyle=1,strokeWidth=1,strokeBrushColor="black", strokeBrushStyle=1,strokeCapStyle=1, name="") : """ Create a New Line in kst. See :class:`Line` """ return Line(self,pos, length, rot, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, strokeCapStyle, name) def line(self, name): """ Returns a Line from kst given its name. See :class:`Line` """ return Line(self, name=name, new=False) def new_arrow(self,pos=(0.1,0.1), length=0.1, rot=0, arrowAtStart = False, arrowAtEnd = True, arrowSize = 12.0, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeCapStyle=1, name="") : """ Create a New Arrow in kst. See :class:`Arrow` """ return Arrow(self,pos, length, rot, arrowAtStart, arrowAtEnd, arrowSize, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, strokeCapStyle, name) def arrow(self, name): """ Returns a Arrow from kst given its name. See :class:`Arrow` """ return Arrow(self, name=name, new=False) def new_picture(self,filename,pos=(0.1,0.1), width=0.1,rot=0, name="") : """ Create a New Picture in kst. See :class:`Picture` """ return Picture(self,filename, pos, width, rot, name) def picture(self, name): """ Returns a Picture from kst given its name. See :class:`Picture` """ return Picture(self, "", name = name, new=False) def new_SVG(self, filename, pos=(0.1,0.1), width=0.1, rot=0, name="") : """ Create a New SVG in kst. See :class:`SVG` """ return SVG(self, filename, pos, width, rot, name) def SVG(self, name): """ Returns a SVG from kst given its name. See :class:`SVG` """ return SVG(self, "", name = name, new=False) def new_plot(self,pos=(0.1,0.1),size=(0.1,0.1),rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeJoinStyle=1, strokeCapStyle=1, fixAspect=False, name="") : """ Create a New Plot in kst. See :class:`Plot` """ return Plot(self, pos, size, rot, fillColor, fillStyle, strokeStyle, strokeWidth, strokeBrushColor, strokeBrushStyle, strokeJoinStyle, strokeCapStyle, fixAspect, name) def plot(self, name): """ Returns a Plot from kst given its name. See :class:`Plot` """ return Plot(self, name = name, new=False) class NamedObject: """ Convenience class. You should not use it directly.""" def __init__(self,client): self.client=client def set_name(self,name): """ Set the name of the object inside kst. """ self.client.send_si(self.handle, b2str("setName("+b2str(name)+")")) def name(self): """ Returns the name of the object from inside kst. """ return self.client.send_si(self.handle, "name()") class String(NamedObject) : """ Convenience class. You should not use it directly.""" def __init__(self,client) : NamedObject.__init__(self,client) def value(self) : """ Returns the string. """ return self.client.send_si(self.handle, "value()") class GeneratedString(String) : """ A string constant inside kst. This class represents a string you would create via "Create>String>Generated" from the menubar inside kst. :param string: The value of the string. To import the string "Hello World" into kst:: import pykst as kst client = kst.Client() s = client.new_generatedString("Hello World") """ def __init__(self,client,string,name="", new=True) : String.__init__(self,client) if (new == True): self.client.send("newGeneratedString()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_value(string) self.set_name(name) else: self.handle = name def set_value(self,val): """ set the value of the string inside kst. """ self.client.send_si(self.handle, b2str("setValue("+b2str(val)+")")) class DataSourceString(String) : """ A string read from a data source inside kst. This class represents a string you would create via "Create>String>Read from Data Source" from the menubar inside kst. :param filename: The name of the file/data source to read the string from. :param field: the name of the field in the data source. To read "File path" from the data source "tmp.dat" into kst:: import pykst as kst client = kst.Client() s = client.new_datasource_string("tmp.dat", "File Path") """ def __init__(self,client,filename,field,name="", new=True) : String.__init__(self,client) if (new == True): self.client.send("newDataString()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(filename, field) else: self.handle = name def change(self,filename,field): """ Change a DataSource String. Change the file and field of a DataSourceString in kst. :param filename: The name of the file/data source to read the string from. :param field: the name of the field in the data source. """ self.client.send_si(self.handle, b2str("change("+b2str(filename)+","+b2str(field)+")")) class Scalar(NamedObject) : """ Convenience class. You should not use it directly.""" def __init__(self,client) : NamedObject.__init__(self,client) def value(self) : """ Returns the scalar. """ return self.client.send_si(self.handle, "value()") class GeneratedScalar(Scalar) : """ A scalar constant inside kst. This class represents a scalar you would create via "Create>Scalar>Generate" from the menubar inside kst. :param value: the value to assign to the scalar constant. To import the scalar of value 42 into kst:: import pykst as kst client = kst.Client() s = client.new_generated_scalar(42) """ def __init__(self, client, value, name="", new=True) : Scalar.__init__(self,client) if (new == True): self.client.send("newGeneratedScalar()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_value(value) self.set_name(name) else: self.handle = name def set_value(self,val): """ set the value of the string inside kst. """ self.client.send_si(self.handle, b2str("setValue("+b2str(val)+")")) class DataSourceScalar(Scalar) : """ A scalar read from a data source inside kst. This class represents a scalar you would create via "Create>Scalar>Read from Data Source" from the menubar inside kst. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the field in the data source. To read "CONST1" from the data source "tmp.dat" into kst:: import pykst as kst client = kst.Client() x = client.new_datasource_scalar("tmp.dat", "CONST1") """ def __init__(self,client,filename,field,name="", new=True) : Scalar.__init__(self,client) if (new == True): self.client.send("newDataScalar()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(filename, field) else: self.handle = name def change(self,filename,field): """ Change a DataSource Scalar. Change the file and field of a DataSourceScalar in kst. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the field in the data source. """ self.client.send_si(self.handle, "change("+filename+","+field+")") def file(self) : """ Returns the the data source file name. """ return self.client.send_si(self.handle, "file()") def field(self) : """ Returns the field. """ return self.client.send_si(self.handle, "field()") class VectorScalar(Scalar) : """ A scalar in kst read from a vector from a data source. This class represents a scalar you would create via "Create>Scalar>Read from vector" from the menubar inside kst. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param frame: which frame of the vector to read the scalar from. frame = -1 (the default) reads from the end of the file. To read the last value of the vector INDEX from the file "tmp.dat" into kst:: import pykst as kst client = kst.Client() x = client.new_vector_scalar("tmp.dat", "INDEX", -1) """ def __init__(self, client, filename, field, frame=-1, name="", new=True) : Scalar.__init__(self,client) if (new == True): self.client.send("newVectorScalar()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(filename, field, frame) else: self.handle = name def change(self,filename,field,frame): """ Change a Vector Scalar in kst. Change the file, field and frame of a VectorScalar in kst. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param frame: which frame of the vector to read the scalar from. frame = -1 reads from the end of the file. """ self.client.send_si(self.handle, b2str("change("+b2str(filename)+","+b2str(field)+","+b2str(frame)+")")) def file(self) : """ Returns the the data source file name. """ return self.client.send_si(self.handle, "file()") def field(self) : """ Returns the field. """ return self.client.send_si(self.handle, "field()") def frame(self) : """ Returns the fame. """ return self.client.send_si(self.handle, "frame()") class VectorBase(NamedObject): """ Convenience class. You should not use it directly.""" def __init__(self,client) : NamedObject.__init__(self,client) def value(self,index): """ Returns element i of this vector. """ return self.client.send_si(self.handle, "value("+b2str(index)+")") def length(self): """ Returns the number of samples in the vector. """ return self.client.send_si(self.handle, "length()") def min(self): """ Returns the minimum value in the vector. """ return self.client.send_si(self.handle, "min()") def mean(self): """ Returns the mean of the vector. """ return self.client.send_si(self.handle, "mean()") def max(self): """ Returns the maximum value in the vector. """ return self.client.send_si(self.handle, "max()") def description_tip(self): """ Returns a string describing the vector """ return self.client.send_si(self.handle, "descriptionTip()") class DataVector(VectorBase): """ A vector in kst, read from a data source. This class represents a vector you would create via "Create>Vector>Read from Data Source" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Vector>Read from Data Source". :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param start: The starting index of the vector. start = -1 for count from end. :param NFrames: The number of frames to read. NFrames = -1 for read to end. :param skip: The number of frames per sample read. skip = 0 to read every sample. :param boxcarFirst: apply a boxcar filter before skiping. To create a vector from "tmp.dat" with field "INDEX" from frame 3 to frame 10, reading a sample every other frame without a boxcar filter:: import pykst as kst client = kst.Client() v = client.new_data_vector("tmp.dat", "INDEX", 3, 10, 2, False) """ def __init__(self, client, filename, field, start=0, NFrames=-1, skip=0, boxcarFirst=False, name="", new=True) : VectorBase.__init__(self,client) if (new == True): self.client.send("newDataVector()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(filename, field, start, NFrames, skip, boxcarFirst) else: self.handle = name def change(self, filename, field, start, NFrames, skip, boxcarFirst): """ Change the parameters of a data vector. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param start: The starting index of the vector. start = -1 for count from end. :param NFrames: The number of frames to read. NFrames = -1 for read to end. :param skip: The number of frames per sample read. skip = 0 to read every sample. :param boxcarFirst: apply a boxcar filter before skiping. """ self.client.send_si(self.handle, "change("+filename+","+field+"," +b2str(start)+","+b2str(NFrames)+","+b2str(skip) +","+b2str(boxcarFirst)+")") def field(self): """ Returns the fieldname. """ return self.client.send_si(self.handle, "field()") def filename(self): """ Returns the filename. """ return self.client.send_si(self.handle, "filename()") def start(self): """ Returns the index of first frame in the vector. -1 means count from end. """ return self.client.send_si(self.handle, "start()") def n_frames(self): """ Returns the number of frames to be read. -1 means read to end. """ return self.client.send_si(self.handle, "NFrames()") def skip(self): """ Returns number of frames to be skipped between samples read. """ return self.client.send_si(self.handle, "skip()") def boxcar_first(self): """ True if boxcar filtering has been applied before skipping. """ return self.client.send_si(self.handle, "boxcarFirst()") class GeneratedVector(VectorBase): """ Create a generated vector in kst. This class represents a vector you would create via "Create>Vector>Generate" from the menubar inside kst. :param X0: The first value in the vector. :param X1: The last value in the vector. :param N: The number of evenly spaced values in the vector. To create the vector {0, 0.2, 0.4, 0.6, 0.8, 1.0}:: import pykst as kst client = kst.Client() v = client.new_generated_vector(0, 1, 6) """ def __init__(self, client, X0, X1, N, name="", new=True) : VectorBase.__init__(self,client) if (new == True): self.client.send("newGeneratedVector()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(X0, X1, N) self.set_name(name) else: self.handle = name def change(self,X0, X1, N): """ Change the parameters of a Generated Vector inside kst. :param X0: The first value in the vector. :param X1: The last value in the vector. :param N: The number of evenly spaced values in the vector. """ self.client.send_si(self.handle, "change("+b2str(X0)+","+b2str(X1)+ ","+b2str(N)+")") class Matrix(NamedObject): """ Convenience class. You should not use it directly.""" def __init__(self,client) : NamedObject.__init__(self,client) def value(self,i_x, i_y): """ Returns element (i_x, i_y} of this matrix. """ return self.client.send_si(self.handle, "value("+b2str(i_x)+ ","+b2str(i_y)+")") def length(self): """ Returns the number of elements in the matrix. """ return self.client.send_si(self.handle, "length()") def min(self): """ Returns the minimum value in the matrix. """ return self.client.send_si(self.handle, "min()") def mean(self): """ Returns the mean of the matrix. """ return self.client.send_si(self.handle, "mean()") def max(self): """ Returns the maximum value in the matrix. """ return self.client.send_si(self.handle, "max()") def width(self): """ Returns the X dimension of the matrix. """ return self.client.send_si(self.handle, "width()") def height(self): """ Returns the Y dimension of the matrix. """ return self.client.send_si(self.handle, "height()") def dx(self): """ Returns the X spacing of the matrix, for when the matrix is used in an image. """ return self.client.send_si(self.handle, "dX()") def dy(self): """ Returns the Y spacing of the matrix, for when the matrix is used in an image. """ return self.client.send_si(self.handle, "dY()") def min_x(self): """ Returns the minimum X location of the matrix, for when the matrix is used in an image. """ return self.client.send_si(self.handle, "minX()") def min_y(self): """ Returns the minimum X location of the matrix, for when the matrix is used in an image. """ return self.client.send_si(self.handle, "minX()") def description_tip(self): """ Returns a string describing the vector """ return self.client.send_si(self.handle, "descriptionTip()") class DataMatrix(Matrix): """ Create a Data Matrix which reads from a data source inside kst. This class represents a matrix you would create via "Create>Vector>Read from Data Source" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Matrix>Read from Data Source". :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param startX/Y: the x/y index to start reading from. startX/Y = -1 to count from the right/bottom. :param nX/Y: the number of columns/rows to read. nX/Y = -1 to read to the end. :param minX/Y: Hint to Images of the coordinates corresponding to the the left/bottom of the Matrix :param stepX/Y: Hint to Images of the spacing between points. To create a matrix from 'foo.png' with field '1':: import pykst as kst client = kst.Client() v = client.new_data_matrix("foo.png", "1") """ def __init__(self,client,filename,field,startX=0,startY=0,nX=-1,nY=-1, minX=0, minY=0, dX=1, dY=1,name="", new=True) : Matrix.__init__(self,client) if (new == True): self.client.send("newDataMatrix()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.change(filename,field,startX,startY,nX,nY,minX,minY,dX,dY) else: self.handle = name def change(self,filename,field,startX=0,startY=0,nX=-1,nY=-1, minX=0, minY=0, dX=1, dY=1): """ Change the parameters if a Data Matrix inside kst. :param filename: The name of the file/data source to read the scalar from. :param field: the name of the vector in the data source. :param startX/Y: the x/y index to start reading from. startX/Y = -1 to count from the right/bottom. :param nX/Y: the number of columns/rows to read. nX/Y = -1 to read to the end. :param minX/Y: Hint to Images of the coordinates corresponding to the the left/bottom of the Matrix :param stepX/Y: Hint to Images of the spacing between points. """ self.client.send_si(self.handle, "change("+b2str(filename)+","+ b2str(field)+","+b2str(startX)+","+ b2str(startY)+","+b2str(nX)+","+b2str(nY)+","+ b2str(minX)+","+b2str(minY)+","+b2str(dX)+","+ b2str(dY)+")") def field(self): """ Returns the fieldname. """ return self.client.send_si(self.handle, "field()") def filename(self): """ Returns the filename. """ return self.client.send_si(self.handle, "filename()") def start_x(self): """ Returns the X index of the matrix in the file """ return self.client.send_si(self.handle, "startX()") def start_y(self): """ Returns the Y index of the matrix in the file """ return self.client.send_si(self.handle, "startX()") class Relation(NamedObject): """ Convenience class. You should not use it directly.""" def __init__(self,client) : NamedObject.__init__(self,client) def max_x(self): """ Returns the max X value of the curve or image. """ return self.client.send_si(self.handle, "maxX()") def min_x(self): """ Returns the min X value of the curve or image. """ return self.client.send_si(self.handle, "minX()") def max_y(self): """ Returns the max Y value of the curve or image. """ return self.client.send_si(self.handle, "maxY()") def min_y(self): """ Returns the min Y value of the curve or image. """ return self.client.send_si(self.handle, "minY()") def show_edit_dialog(self): """ shows the edit dialog for the curve or image. """ return self.client.send_si(self.handle, "showEditDialog()") class Curve(Relation): """ A Curve inside kst. This class represents a string you would create via "Create>Curve" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Curve". :param xVector: The vector which specifies the X coordinates of each point. :param xVector: The vector which specifies the Y coordinates of each point. Use the convenience function in client to create a curve in kst session "client" of vectors v1 and v2:: c1 = client.new_curve(v1, v2) """ def __init__(self,client, xVector, yVector, name="", new=True) : Relation.__init__(self,client) if (new == True): self.client.send("newCurve()") self.client.send("setXVector("+xVector.handle+")") self.client.send("setYVector("+yVector.handle+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_name(name) else: self.handle = name def set_y_error(self,vector, vectorminus=0): """ Set the Y Error flags for the curve. The error bars are symetric if vectorminus is not set. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setYError("+vector.handle+")") if vectorminus != 0: self.client.send("setYMinusError("+vectorminus.handle+")") else: self.client.send("setYMinusError("+vector.handle+")") self.client.send("endEdit()") def set_x_error(self,vector, vectorminus=0): """ Set the X Error flags for the curve. The error bars are symetric if vectorminus is not set. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setXError("+vector.handle+")") if vectorminus != 0: self.client.send("setXMinusError("+vectorminus.handle+")") else: self.client.send("setXMinusError("+vector.handle+")") self.client.send("endEdit()") def set_color(self,color): """ Set the color of the points and lines. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. """ self.client.send_si(self.handle, "setColor("+color+")") def set_head_color(self,color): """ Set the color of the Head marker, if any. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. """ self.client.send_si(self.handle, "setHeadColor("+color+")") def set_bar_fill_color(self,color): """ Set the fill color of the histogram bars, if any. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. """ self.client.send_si(self.handle, "setBarFillColor("+color+")") def set_has_points(self,has=True): """ Set whether individual points are drawn on the curve """ if (has == True): self.client.send_si(self.handle, "setHasPoints(True)") else: self.client.send_si(self.handle, "setHasPoints(False)") def set_has_bars(self,has=True): """ Set whether histogram bars are drawn. """ if (has == True): self.client.send_si(self.handle, "setHasBars(True)") else: self.client.send_si(self.handle, "setHasBars(False)") def set_has_lines(self,has=True): """ Set whether lines are drawn. """ if (has == True): self.client.send_si(self.handle, "setHasLines(True)") else: self.client.send_si(self.handle, "setHasLines(False)") def set_has_head(self,has=True): """ Set whether a point at the head of the line is drawn """ if (has == True): self.client.send_si(self.handle, "setHasHead(True)") else: self.client.send_si(self.handle, "setHasHead(False)") def set_line_width(self,x): """ Sets the width of the curve's line. """ self.client.send_si(self.handle, "setLineWidth("+b2str(x)+")") def set_point_size(self,x): """ Sets the size of points, if they are drawn. """ self.client.send_si(self.handle, "setPointSize("+b2str(x)+")") def set_point_density(self,density): """ Sets the point density. When show_points is true, this option can be used to only show a subset of the points, for example, to use point types to discriminate between different curves.. This does not effect 'lines', where every point is always connected. density can be from 0 (all points) to 4. """ self.client.send_si(self.handle, "setPointDensity("+b2str(density)+")") def set_point_type(self,pointType): """ Sets the point type. 0 is an X, 1 is an open square, 2 is an open circle, 3 is a filled circle, 4 is a downward open triangle, 5 is an upward open triangle, 6 is a filled square, 7 is a plus, 8 is a asterix, 9 is a downward filled triangle, 10 is an upward filled triangle, 11 is an open diamond, and 12 is a filled diamond. """ self.client.send_si(self.handle, "setPointType("+b2str(pointType)+")") def set_head_type(self,x): """ Sets the head point type. See set_point_type for details.""" self.client.send_si(self.handle, "setHeadType("+b2str(x)+")") def set_line_style(self,lineStyle): """ Sets the line type. 0 is SolidLine, 1 is DashLine, 2 is DotLine, 3 is DashDotLine, and 4 isDashDotDotLine, """ self.client.send_si(self.handle, "setLineStyle("+b2str(lineStyle)+")") def color(self): """ Returns the curve color. """ return self.client.send_si(self.handle, "color()") def head_color(self): """ Returns the curve head color. """ return self.client.send_si(self.handle, "headColor()") def bar_fill_color(self): """ Returns the bar fill color. """ return self.client.send_si(self.handle, "barFillColor()") def has_points(self): """ Returns True if the line has points. """ return (self.client.send_si(self.handle, "hasPoints()")=="True") def has_lines(self): """ Returns True if the line has lines. """ return (self.client.send_si(self.handle, "hasLines()")=="True") def has_bars(self): """ Returns True if the line has historgram bars. """ return (self.client.send_si(self.handle, "hasBars()")=="True") def has_head(self): """ Returns True if the last point has a special marker. """ return (self.client.send_si(self.handle, "hasHead()")=="True") def line_width(self): """ Returns the width of the line. """ return self.client.send_si(self.handle, "lineWidth()") def point_size(self): """ Returns the size of the points. """ return self.client.send_si(self.handle, "pointSize()") def point_type(self): """ Returns index of the point type. See set_point_type. """ return self.client.send_si(self.handle, "pointType()") def head_type(self): """ Returns index of the head point type. See set_point_type. """ return self.client.send_si(self.handle, "headType()") def line_style(self): """ Returns the index of the line style. See set_line_style. """ return self.client.send_si(self.handle, "lineStyle()") def point_density(self): """ Returns the density of points shown. see set_point_density. """ return self.client.send_si(self.handle, "pointDensity()") def x_vector(self): """ Returns the x vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "xVector()") return vec def y_vector(self): """ Returns the y vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "yVector()") return vec def x_error_vector(self): """ Returns the +x error vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "xErrorVector()") return vec def y_error_vector(self): """ Returns the +y error vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "yErrorVector()") return vec def x_minus_error_vector(self): """ Returns the -x error vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "xMinusErrorVector()") return vec def y_minus_error_vector(self): """ Returns the -y error vector of the curve. FIXME: should figure out what kind of vector this is and return that. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "yMinusErrorVector()") return vec class Image(Relation): """ An image inside kst. This class represents an image you would create via "Create>Image" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Curve". :param matrix: The matrix which defines the image. Use the convenience function in client to create an image in kst session "client" of Matrix m:: i1 = client.new_image(m) """ def __init__(self,client, matrix, name="", new=True) : Relation.__init__(self,client) if (new == True): self.client.send("newImage()") self.client.send("setMatrix("+matrix.handle+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_name(name) else: self.handle = name def setMatrix(self, matrix): """ change the matrix which is the source of the image. """ self.client.send_si(self.handle, "setMatrix("+matrix.handle+")") def setPalette(self, palette): """ set the palette, selected by index. 0 Grey 1 Red 2 Spectrum 3 EOS-A 4 EOS-B 5 8 colors 6 Cyclical Spectrum Note: this is not the same order as the dialog. """ self.client.send_si(self.handle, "setPalette("+b2str(palette)+")") def setRange(self, zmin, zmax): """ sets the z range of the color map.""" self.client.send_si(self.handle, "setFixedColorRange("+ b2str(zmin)+","+b2str(zmax)+")") def setAutoRange(self, saturated=0): """ Automatically set the z range of the color map :param saturated: The colormap range is set so that this fraction of the points in the matrix are saturated. Equal numbers of points are saturated at both ends of the color map. """ self.client.send_si(self.handle, "setAutoColorRange("+b2str(saturated) + ")") def max_z(self): """ Returns the max Z value of the curve or image. """ return self.client.send_si(self.handle, "maxZ()") def min_z(self): """ Returns the max Z value of the curve or image. """ return self.client.send_si(self.handle, "minZ()") # Equation ############################################################ class Equation(NamedObject) : """ An equation inside kst. :param x_vector: the x vector of the equation :param equation: the equation Vectors inside kst are refered to as [vectorname] or [scalarname]. """ def __init__(self, client, xvector, equation, name="", new=True) : NamedObject.__init__(self,client) if (new == True): self.client.send("newEquation()") self.client.send("setEquation(" + equation + ")") self.client.send("setInputVector(X,"+xvector.handle+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_name(name) else: self.handle = name def Y(self) : """ a vector containing the equation """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(O)") return vec def X(self) : """ a vector containing the x vector """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(XO)") return vec def set_x(self, xvector): self.client.send_si(self.handle, "setInputVector(X,"+xvector.handle+")") # FIT ################################################################### class Fit(NamedObject) : """ This is a class which provides some methods common to all fits """ def __init__(self,client) : NamedObject.__init__(self,client) def parameters(self) : """ a vector containing the Parameters of the fit """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Parameters Vector)") return vec def fit(self) : """ a vector containing the fit """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Fit)") return vec def residuals(self) : """ a vector containing the Parameters of the fit """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Residuals)") return vec def covariance(self) : """ a vector containing the Covariance of the fit """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Covariance)") return vec def reduced_chi2(self) : """ a scalar containing the Parameters of the fit """ X = Scalar(self.client) X.handle = self.client.send_si(self.handle, "outputScalar(chi^2/nu)") return X # LINEAR FIT ############################################################ class LinearFit(Fit) : """ A linear fit inside kst. If weightvector is 0, then the fit is unweighted. """ def __init__(self, client, xvector, yvector, weightvector=0, name="", new=True) : Fit.__init__(self,client) if (new == True): if weightvector==0: self.client.send("newPlugin(Linear Fit)") else: self.client.send("newPlugin(Linear Weighted Fit)") self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")") self.client.send("setInputVector(X Vector,"+xvector.handle+")") self.client.send("setInputVector(Y Vector,"+yvector.handle+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_name(name) else: self.handle = name def slope(self) : """ The slope of the fit. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Parameters Vector)") return vec.value(1) def intercept(self) : """ The intercept of the fit. """ vec = VectorBase(self.client) vec.handle = self.client.send_si(self.handle, "outputVector(Parameters Vector)") return vec.value(0) # POLYNOMIAL FIT ############################################################ class PolynomailFit(Fit) : """ A Polynomial fit inside kst. :param order: The order of the fit """ def __init__(self, client, order, xvector, yvector, weightvector=0, name="", new=True) : Fit.__init__(self,client) if (new == True): if weightvector==0: self.client.send("newPlugin(Polynomial Fit)") else: self.client.send("newPlugin(Polynomial Weighted Fit)") self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")") self.client.send("setInputVector(X Vector,"+xvector.handle+")") self.client.send("setInputVector(Y Vector,"+yvector.handle+")") self.client.send("setInputScalar(Order Scalar,"+order.handle+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_name(name) else: self.handle = name # View Items ################################################################ class ViewItem(NamedObject): """ Convenience class. You should not use it directly.""" def __init__(self,client): self.client=client def set_h_margin(self,margin): self.client.send_si(self.handle, "setLayoutHorizontalMargin("+b2str(margin)+")") def set_v_margin(self,margin): self.client.send_si(self.handle, "setLayoutVerticalMargin("+b2str(margin)+")") def set_h_space(self,space): self.client.send_si(self.handle, "setLayoutHorizontalSpacing("+b2str(space)+")") def set_v_space(self,space): self.client.send_si(self.handle, "setLayoutVerticalSpacing("+b2str(space)+")") def set_fill_color(self,color): """ Set the fill/background color. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. """ self.client.send_si(self.handle, b2str("setFillColor("+b2str(color)+")")) def set_fill_style(self,style): """ Set the background fill style. This is equivalent to setting the index of Apperance>Fill>Style within a view item dialog in kst.:: 0: NoBrush 1: SolidPattern 2: Dense1Pattern 3: Dense2Pattern 4: Dense3Pattern 5: Dense4Pattern 6: Dense5Pattern 7: Dense6Pattern 8: Dense7Pattern 9: HorPattern 11: VerPattern 12: CrossPattern, 13: BDiagPattern 14: FDiagPattern. """ self.client.send_si(self.handle, "setIndexOfFillStyle("+b2str(style)+")") def set_stroke_style(self,style): """ Set the stroke style of lines for the item. This is equivalent to setting the index of Apperance>Stroke>Style within a view item dialog in kst:: 0: SolidLine 1: DashLine 2: DotLine 3: DashDotLine 4: DashDotDotLine 5: CustomDashLine """ self.client.send_si(self.handle, "setIndexOfStrokeStyle("+b2str(style)+")") def set_stroke_width(self,width): """ Set the width of lines for the item. """ self.client.send_si(self.handle, "setStrokeWidth("+b2str(width)+")") def set_stroke_brush_color(self,color): """ Set the color for lines for the item. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. """ self.client.send_si(self.handle, "setStrokeBrushColor("+b2str(color)+")") def set_stroke_brush_style(self,style): """ Set the brush style for lines for the item. This is equivalent to setting the index of Apperance>Stroke>Brush Style within a view item dialog in kst. This sets the brush type for lines in the item, and not for the fill, so values other than ``1`` (SolidPattern) only make sense for wide lines and are rarely used:: 0: NoBrush 1: SolidPattern 2: Dense1Pattern 3: Dense2Pattern 4: Dense3Pattern 5: Dense4Pattern 6: Dense5Pattern 7: Dense6Pattern 8: Dense7Pattern 9: HorPattern 11: VerPattern 12: CrossPattern, 13: BDiagPattern 14: FDiagPattern. """ self.client.send_si(self.handle, "setIndexOfStrokeBrushStyle("+b2str(style)+")") def set_stroke_join_style(self,style): """ Set the style by which lines are joined in the item. This is equivalent to setting the index of Apperance>Stroke>Join Style within a view item dialog in kst. 0 is MiterJoin, 1 is BevelJoin, 2 is RoundJoin, and 3 is SvgMiterJoin. """ self.client.send_si(self.handle, "setIndexOfStrokeJoinStyle("+b2str(style)+")") def set_stroke_cap_style(self,style): """ Set the cap style for the ends of lines in the item. This is equivalent to setting the index of Apperance>Stroke>Cap Style within a view item dialog in kst. 0 is FlatCap, 1 is SquareCap, and 2 is RoundCap. """ self.client.send_si(self.handle, "setIndexOfStrokeCapStyle("+b2str(style)+")") def set_fixed_aspect_ratio(self, fixed=True): """ if True, fix the aspect ratio of the item to its current value. This is equivalent to checking Dimensions>Fix aspect ratio within a view item dialog in kst. """ if fixed == True: self.client.send_si(self.handle, b2str("checkFixAspectRatio()")) else: self.client.send_si(self.handle, b2str("uncheckFixAspectRatio()")) def set_pos(self,pos): """ Set the center position of the item. :param pos: a 2 element tuple ``(x,y)`` specifying the position. The Top Left is (0,0). The Bottom Right is (1,1) This is equivalent to setting Dimensions>Position within a view item dialog in kst. """ x,y = pos self.client.send("beginEdit("+self.handle+")") self.client.send("setPosX("+b2str(x)+")") self.client.send("setPosY("+b2str(y)+")") self.client.send("endEdit()") def set_size(self,size): """ Set the size of the item. :param size: a 2 element tuple ``(w,h)`` specifying the size. Elements go from 0 to 1. If the aspect ratio is fixed, then ``h`` is ignored. This is equivalent to setting Dimensions>Position within a view item dialog in kst. """ w,h = size self.client.send("beginEdit("+self.handle+")") self.client.send("setGeoX("+b2str(w)+")") self.client.send("setGeoY("+b2str(h)+")") self.client.send("endEdit()") def set_rotation(self,rot): """ Set the rotation of the item. This is equivalent to setting Dimensions>Rotation within a view item dialog. Scalars can be included by wrapping their names in ``[ ]``. eg ``[(X1)]`` Labels support a subset of latex. """ self.client.send_si(self.handle, b2str("setRotation("+b2str(rot)+")")) def remove(self): """ This removes the object from Kst. """ self.client.send("eliminate("+self.handle+")") # LABELS ###################################################################### class Label(ViewItem) : """ A floating label inside kst. :param text: the text of the label. Supports scalars, equations, and a LaTeX subset. :param pos: a 2 element tuple ``(x,y)`` specifying the position. (0,0) is top left. (1,1) is bottom right. :param rot: rotation of the label in degrees. :param fontSize: size of the label in points, when the printed at the reference size. :param fontColor: Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. :param fontFamily: The font family. eg, TimeNewRoman. Scalars and scalar equations can be displayed live in labels. When the scalar is updated, the label is updated. The format is:: Scalar: [scalarname] eg [GYRO1:Mean(X4)] Vector Element: [vectorName[index]] eg [GYRO1 (V2)[4]] Equation: [=equation] eg [=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]] Labels in kst support a derrivitive subset of LaTeX. For example, to display the equation for the area of a circle, you could set the label to ``A=2\pir^2``. Unlike LaTeX, it is not necessary to enter math mode using ``$``. Also, unlike LaTeX, variables are not automatically displayed in italic font. If desired, this must be done explicitly using ``\\textit{}``. Greek letters: \\\\name or \\\\Name. eg: ``\\alpha`` Other symbols: ``\\approx, \\cdot, \\ge, \\geq, \\inf, \\approx, \\cdot, \\ge, \\geq, \\inf, \\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\sum, \\sqrt`` Font effects: ``\\textcolor{colorname}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\underline{underlined text}, \\overline{overlined text}.`` Other:``x^y``, ``x_y``, ``\\t``, ``\\n``, ``\\[`` This class represents a label you would create via "Create>Annotations>Label" from the menubar inside kst. Use the convenience function in Client to create a label "Test Label" in kst:: import pykst as kst client = kst.Client() L = client.new_label("Test Label", (0.25, 0.25), fontSize=18) """ def __init__(self,client, text, pos=(0.5,0.5), rot=0, fontSize=12, bold=False, italic=False, fontColor="black", fontFamily="Serif", name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newLabel()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_text(text) self.set_label_font_size(fontSize) self.set_pos(pos) self.set_fixed_aspect_ratio(True) self.set_rotation(rot) self.set_font_color(fontColor) self.set_font_family(fontFamily) self.set_font_bold(bold) self.set_font_italic(italic) self.set_name(name) else: self.handle = name def set_text(self,text): """ Set text displayed by the label. Scalars and scalar equations can be displayed live in labels. When the scalar is updated, the label is updated. The format is:: Scalar: [scalarname] eg [GYRO1:Mean(X4)] Vector Element: [vectorName[index]] eg [GYRO1 (V2)[4]] Equation: [=equation] eg [=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]] Labels in kst support a derrivitive subset of LaTeX. For example, to display the equation for the area of a circle, you could set the label to ``A=2\pir^2``. Unlike LaTeX, it is not necessary to enter math mode using ``$``. Also, unlike LaTeX, variables are not automatically displayed in italic font. If desired, this must be done explicitly using ``\\textit{}``. Greek letters: \\\\name or \\\\Name. eg: ``\\alpha`` Other symbols: ``\\approx, \\cdot, \\ge, \\geq, \\inf, \\approx, \\cdot, \\ge, \\geq, \\inf, \\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\sum, \\sqrt`` Font effects: ``\\textcolor{colorname}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\underline{underlined text}, \\overline{overlined text}.`` Other:``x^y``, ``x_y``, ``\\t``, ``\\n``, ``\\[`` """ self.client.send_si(self.handle, b2str("setLabel("+b2str(text)+")")) def set_label_font_size(self,size): """ size of the label in points, when the printed at the reference size.""" self.client.send_si(self.handle, b2str("setFontSize("+b2str(size)+")")) def set_font_bold(self, bold = True): """ . . . """ if bold == True: self.client.send_si(self.handle, b2str("checkLabelBold()")) else: self.client.send_si(self.handle, b2str("uncheckLabelBold()")) def set_font_italic(self, italic = True): """ . . . """ if italic == True: self.client.send_si(self.handle, b2str("checkLabelItalic()")) else: self.client.send_si(self.handle, b2str("uncheckLabelItalic()")) def set_font_color(self,color): """ Colors are given by a name such as ``red`` or a hex number such as ``#FF0000`` """ self.client.send_si(self.handle, b2str("setLabelColor("+b2str(color)+")")) def set_font_family(self,family): """ set the font family. eg, TimeNewRoman. """ self.client.send_si(self.handle, b2str("setFontFamily("+b2str(family)+")")) class ExistingLabel(Label): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=client.send("getLabelList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingLabel(client,y)) return ret class Box(ViewItem) : """ A floating box inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param size: a 2 element tuple ``(w,h)`` specifying the size. ``(1,1)`` is the size of the window. :param rotation: rotation of the label in degrees. :param fillColor: the background color. :param fillStyle: the background fill style. See set_fill_style. :param strokeStyle: see set_stroke_style :param strokeWidth: the pen width for the box outline. :param strokeBrushColor: the box outline color :param strokeBrushStyle: see set_stroke_brush_style :param strokeJoinStyle: see set_stroke_join_style :param strokeCapStyle: see set_stroke_cap_style :param fixAspect: if true, the box will have a fixed aspect ratio. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents a box you would create via "Create>Annotations>Box" from the menubar inside kst. Use the convenience function in Client to create a box in kst:: import pykst as kst client = kst.Client() ... B = client.new_box((0.25, 0.25), (0.2, 0.1), fillColor="blue") """ def __init__(self,client, pos=(0.1,0.1), size=(0.1,0.1), rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeJoinStyle=1, strokeCapStyle=1, fixAspect=False, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newBox()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_size(size) self.set_fixed_aspect_ratio(fixAspect) self.set_rotation(rot) self.set_stroke_brush_color(strokeBrushColor) self.set_fill_color(fillColor) self.set_fill_style(fillStyle) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_stroke_join_style(strokeJoinStyle) self.set_stroke_cap_style(strokeCapStyle) self.set_name(name) else: self.handle = name @classmethod def getList(cls,client): x=client.send("getBoxList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Circle(ViewItem) : """ A floating circle inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param diameter: the diameter of the circle. 1 is the width of the window. :param fillColor: the background color. :param fillStyle: the background fill style. See set_fill_style. :param strokeStyle: see set_stroke_style :param strokeWidth: the pen width for the circle outline. :param strokeBrushColor: the circle outline color :param strokeBrushStyle: see set_stroke_brush_style Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents a circle you would create via "Create>Annotations>Circle" from the menubar inside kst. Use the convenience function in Client to create a circle in kst:: import pykst as kst client = kst.Client() ... Cr = client.new_circle((0.5, 0.5), 0.2, fillColor="red") """ def __init__(self,client,pos=(0.1, 0.1), diameter=0.1, fillColor="white",fillStyle=1,strokeStyle=1, strokeWidth=1,strokeBrushColor="grey",strokeBrushStyle=1, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newCircle()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_diameter(diameter) self.set_stroke_brush_color(strokeBrushColor) self.set_fill_color(fillColor) self.set_fill_style(fillStyle) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_name(name) else: self.handle = name @classmethod def getList(cls,client): x=client.send("getCircleList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret def set_diameter(self,diameter): """ set the diamter of the circle. The width of the window is 1.0. """ self.client.send_si(self.handle,"setGeoX("+b2str(diameter)+")") class Ellipse(ViewItem) : """ A floating ellipse inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param size: a 2 element tuple ``(w,h)`` specifying the size. ``(1,1)`` is the size of the window. :param fillColor: the background color. :param fillStyle: the background fill style. See set_fill_style. :param strokeStyle: see set_stroke_style :param strokeWidth: the pen width for the ellipse outline. :param strokeBrushColor: the ellipse outline color :param strokeBrushStyle: see set_stroke_brush_style Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents an ellipse you would create via "Create>Annotations>Ellipse" from the menubar inside kst. Use the convenience function in Client to create an Ellipse in kst:: import pykst as kst client = kst.Client() ... E = client.new_ellipse((0.25, 0.25), (0.2, 0.1), fillColor="green") """ def __init__(self,client,pos=(0.1,0.1), size=(0.1,0.1), rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, fixAspect=False, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newEllipse()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_size(size) if fixAspect==True: self.set_fixed_aspect_ratio(True) else: self.set_fixed_aspect_ratio(False) self.set_rotation(rot) self.set_stroke_brush_color(strokeBrushColor) self.set_fill_color(fillColor) self.set_fill_style(fillStyle) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_name(name) else: self.handle = name @classmethod def getList(cls,client): x=client.send("getEllipseList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Line(ViewItem) : """ A floating line inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position of the center of the line. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param length: The length of the line. 1 is the width of the window. :param rot: rotation of the line in degrees. :param strokeStyle: see set_stroke_style :param strokeWidth: the pen width for the ellipse outline. :param strokeBrushColor: the ellipse outline color :param strokeBrushStyle: see set_stroke_brush_style :param strokeCapStyle: see set_stroke_cap_style Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents a line you would create via "Create>Annotations>Line" from the menubar inside kst. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``". Use the convenience function in Client to create a line in kst:: import pykst as kst client = kst.Client() ... Ln = client.new_line((0.25, 0.25), 0.2, rot=15) """ def __init__(self,client,pos=(0.1,0.1),length=0.1,rot=0, strokeStyle=1,strokeWidth=1,strokeBrushColor="black", strokeBrushStyle=1,strokeCapStyle=1, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newLine()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_length(length) self.set_rotation(rot) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_stroke_cap_style(strokeCapStyle) self.set_name(name) else: self.handle = name @classmethod def getList(cls,client): x=client.send("getLineList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret def set_length(self, length): """ set the length of the line. The width of the window is 1.0. """ self.client.send_si(self.handle,"setGeoX("+b2str(length)+")") class Arrow(ViewItem) : """ A floating arrow inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position of the center of the line. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param length: The length of the line. 1 is the width of the window. :param rot: rotation of the line in degrees. :param arrowAtStart: if True, draw an arrow at the start of the line. :param arrowAtEnd: if True, draw an arrow at the end of the line. :param arrowSize: the size of the arrow. :param strokeStyle: see set_stroke_style. :param strokeWidth: the pen width for the ellipse outline. :param strokeBrushColor: the ellipse outline color :param strokeBrushStyle: see set_stroke_brush_style :param strokeCapStyle: see set_stroke_cap_style Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents an arrow you would create via "Create>Annotations>Arrow" from the menubar inside kst. Use the convenience function in Client to create an arrow in kst:: import pykst as kst client = kst.Client() ... Ln = client.new_arrow((0.25, 0.25), 0.2, rot=15, arrowAtStart=True) """ def __init__(self,client,pos=(0.1,0.1), length=0.1, rot=0, arrowAtStart = False, arrowAtEnd = True, arrowSize = 12.0, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeCapStyle=1, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newArrow()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_length(length) self.set_rotation(rot) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_stroke_cap_style(strokeCapStyle) self.set_arrow_at_start(arrowAtStart) self.set_arrow_at_end(arrowAtEnd) self.set_arrow_size(arrowSize) self.set_name(name) else: self.handle = name def set_arrow_at_start(self, arrow=True) : """ Set whether an arrow head is shown at the start of the line """ if arrow==True: self.client.send_si(self.handle, b2str("arrowAtStart(True)")) else: self.client.send_si(self.handle, b2str("arrowAtStart(False)")) def set_arrow_at_end(self, arrow=True) : """ Set whether an arrow head is shown at the end of the line """ if arrow==True: self.client.send_si(self.handle, b2str("arrowAtEnd(True)")) else: self.client.send_si(self.handle, b2str("arrowAtEnd(False)")) def set_arrow_size(self, arrowSize) : self.client.send_si(self.handle, b2str("arrowHeadScale("+b2str(arrowSize)+")")) def set_length(self, length): """ set the length of the line. The width of the window is 1.0. """ self.client.send_si(self.handle,"setGeoX("+b2str(length)+")") @classmethod def getList(cls,client): x=client.send("getArrowList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Picture(ViewItem) : """ A floating image inside kst. :param filename: the file which holds the image to be shown. :param pos: a 2 element tuple ``(x,y)`` specifying the position of the center of the picture. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param width: The width of the picture. 1 is the width of the window. :param rot: rotation of the picture in degrees. This class represents a picture you would create via "Create>Annotations>Picture" from the menubar inside kst. Use the convenience function in Client to create a picture in kst:: import pykst as kst client = kst.Client() ... pic = client.new_picture("image.jpg", (0.25, 0.25), 0.2) BUG: the aspect ratio of the picture is wrong. """ def __init__(self,client,filename,pos=(0.1,0.1), width=0.1,rot=0, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newPicture("+b2str(filename)+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_width(width) self.set_fixed_aspect_ratio(True) self.set_rotation(rot) self.set_name(name) else: self.handle = name def set_width(self, width): """ set the width of the picture. The width of the window is 1.0. """ self.client.send_si(self.handle,"setGeoX("+b2str(width)+")") def setPicture(self,pic): """ BUG: aspect ratio is not changed. There is no parellel for this function within the kst GUI. """ self.client.send_si(self.handle, b2str("setPicture("+b2str(pic)+")")) @classmethod def getList(cls,client): x=client.send("getPictureList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingPicture(client,y)) return ret class SVG(ViewItem) : """ A floating svg image inside kst. :param filename: the file which holds the svg image to be shown. :param pos: a 2 element tuple ``(x,y)`` specifying the position of the center of the picture. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param width: The width of the picture. 1 is the width of the window. :param rot: rotation of the picture in degrees. This class represents a picture you would create via "Create>Annotations>SVG" from the menubar inside kst. Use the convenience function in Client to create an SVG picture in kst:: import pykst as kst client = kst.Client() ... svg1 = client.new_SVG("image.svg", (0.25, 0.25), 0.2) """ def __init__(self,client,filename, pos=(0.1,0.1), width=0.1, rot=0, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newSvgItem("+b2str(filename)+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_width(width) self.set_fixed_aspect_ratio(True) self.set_rotation(rot) self.set_name(name) else: self.handle = name def set_width(self, width): """ set the width of the picture. The width of the window is 1.0. """ self.client.send_si(self.handle,"setGeoX("+b2str(width)+")") @classmethod def getList(cls,client): x=client.send("getSVGList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingSVG(client,y)) return ret class Plot(ViewItem) : """ A plot inside kst. :param pos: a 2 element tuple ``(x,y)`` specifying the position. ``(0,0)`` is top left. ``(1,1)`` is bottom right. :param size: a 2 element tuple ``(w,h)`` specifying the size. ``(1,1)`` is the size of the window. :param rotation: rotation of the label in degrees. :param fillColor: the background color. :param fillStyle: the background fill style. See set_fill_style. :param strokeStyle: see set_stroke_style :param strokeWidth: the pen width for the plot outline. :param strokeBrushColor: the plot outline color :param strokeBrushStyle: see set_stroke_brush_style :param strokeJoinStyle: see set_stroke_join_style :param strokeCapStyle: see set_stroke_cap_style :param fixAspect: if true, the plot will have a fixed aspect ratio. Colors are given by a name such as ``red`` or a hex number such as ``#FF0000``. This class represents a Plot you would create via "Create>Annotations>Plot" from the menubar inside kst. To create an plot in kst and plot a curve ``curve1``:: import pykst as kst client = kst.Client() ... P1 = client.new_plot((0.25, 0.25), (0.5,0.5)) P1.add(curve1) """ def __init__(self,client,pos=(0.1,0.1),size=(0.1,0.1),rot=0, fillColor="white", fillStyle=1, strokeStyle=1, strokeWidth=1, strokeBrushColor="black", strokeBrushStyle=1, strokeJoinStyle=1, strokeCapStyle=1, fixAspect=False, name="", new=True) : ViewItem.__init__(self,client) if (new == True): self.client.send("newPlot()") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) self.set_pos(pos) self.set_size(size) self.set_fixed_aspect_ratio(fixAspect) self.set_rotation(rot) self.set_stroke_brush_color(strokeBrushColor) self.set_fill_color(fillColor) self.set_fill_style(fillStyle) self.set_stroke_style(strokeStyle) self.set_stroke_width(strokeWidth) self.set_stroke_brush_color(strokeBrushColor) self.set_stroke_brush_style(strokeBrushStyle) self.set_stroke_join_style(strokeJoinStyle) self.set_stroke_cap_style(strokeCapStyle) self.set_name(name) else: self.handle = name def add(self, relation) : """ Add a curve or an image to the plot. """ self.client.send_si(self.handle, "addRelation(" + relation.handle + ")") def set_x_range(self,x0 = 0.0, x1 = 10.0) : """ Set X zoom range from x0 to x1 """ self.client.send_si(self.handle, "setXRange("+b2str(x0)+","+b2str(x1)+")") def set_y_range(self, y0 = 0.0, y1 = 10.0) : """ Set Y zoom range from y0 to y1 """ self.client.send_si(self.handle, "setYRange("+b2str(y0)+","+b2str(y1)+")") def set_x_auto(self) : """ Set X zoom range to autoscale """ self.client.send_si(self.handle,"setXAuto()") def set_y_auto(self) : """ Set Y zoom range to autoscale """ self.client.send_si(self.handle, "setPlotYAuto()") def set_x_auto_border(self) : """ Set X zoom range to autoscale with a small border """ self.client.send_si(self.handle, "setPlotXAutoBorder()") def set_y_auto_border(self) : """ Set Y zoom range to autoscale with a small border """ self.client.send_si(self.handle, "setYAutoBorder()") def set_x_no_spike(self) : """ Set X zoom range to spike insensitive autoscale """ self.client.send_si(self.handle, "setXNoSpike()") def set_y_no_spike(self) : """ Set Y zoom range to spike insensitive autoscale """ self.client.send_si(self.handle, "setYNoSpike()") def set_x_ac(self, r=0.2) : """ Set X zoom range to fixed range, centered around the mean. Similar to AC coupling on an oscilloscope. """ self.client.send_si(self.handle, "setXAC("+b2str(r)+")") def set_y_ac(self, r=0.2) : """ Set Y zoom range to fixed range, centered around the mean. Similar to AC coupling on an oscilloscope. """ self.client.send_si(self.handle, "setYAC("+b2str(r)+")") def set_global_font(self, family="", bold=False, italic=False) : """ Set the global plot font. By default, the axis labels all use this, unless they have been set to use their own. If the parameter 'family' is empty, the font family will be unchanged. The font will be bold if parameter 'bold' is set to 'bold' or 'True'. The font will be italic if parameter 'italic' is set to 'italic' or 'True'. """ self.client.send_si(self.handle, "setGlobalFont("+family+","+ b2str(bold)+","+b2str(italic)+")") def set_top_label(self, label="") : """ Set the plot top label """ self.client.send_si(self.handle, "setTopLabel("+label+")") def set_bottom_label(self, label="") : """ Set the plot bottom label """ self.client.send_si(self.handle, "setBottomLabel("+label+")") def set_left_label(self, label="") : """ Set the plot left label """ self.client.send_si(self.handle, "setLeftLabel("+label+")") def set_right_label(self, label="") : """ Set the plot right label """ self.client.send_si(self.handle, "setRightLabel("+label+")") def set_top_label_auto(self) : """ Set the top label to auto generated. """ self.client.send_si(self.handle, "setTopLabelAuto()") def set_bottom_label_auto(self) : """ Set the bottom label to auto generated. """ self.client.send_si(self.handle, "setBottomLabelAuto()") def set_left_label_auto(self) : """ Set the left label to auto generated. """ self.client.send_si(self.handle, "setLeftLabelAuto()") def set_right_label_auto(self) : """ Set the right label to auto generated. """ self.client.send_si(self.handle, "setRightLabelAuto()") def normalize_x_to_y(self) : """ Adjust the X zoom range so X and Y have the same scale per unit (square pixels) """ self.client.send_si(self.handle, "normalizeXtoY()") def set_log_x(self) : """ Set X axis to log mode. """ self.client.send_si(self.handle, "setLogX()") def set_log_y(self) : """ Set X axis to log mode. """ self.client.send_si(self.handle, "setLogY()") def set_y_axis_reversed(self, reversed=True) : """ set the Y axis to decreasing from bottom to top. """ if reversed == True: self.client.send_si(self.handle, "setYAxisReversed()") else: self.client.send_si(self.handle, "setYAxisNotReversed()") def set_x_axis_reversed(self, reversed=True) : """ set the X axis to decreasing from left to right. """ if reversed == True: self.client.send_si(self.handle, "setXAxisReversed()") else: self.client.send_si(self.handle, "setXAxisNotReversed()") class ExistingPlot(Plot): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=client.send("getPlotList()") ret=[] while x.contains('['): y=x y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingPlot(client,y)) return ret class Button(ViewItem) : """ This represents a button inside a View. When the button is pressed, it sends a message via a socket. socket is a QtNetwork.QLocalSocket that is not connected to anything. The message "clicked" will be sent when the button is pressed. See the bonjourMonde example. """ def __init__(self,client,text,socket,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newButton()") self.client.send("setPosX("+b2str(posX)+")") self.client.send("setPosY("+b2str(posY)+")") self.client.send("setGeoX("+b2str(sizeX)+")") self.client.send("setGeoY("+b2str(sizeY)+")") self.client.send("setText("+b2str(text)+")") self.client.send("setRotation("+b2str(rot)+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) socket.connectToServer(client.serverName) socket.waitForConnected(300) socket.write(b2str("attachTo("+self.handle+")")) def set_text(self,text): """ Sets the text of the button. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setText("+b2str(text)+")") self.client.send("endEdit()") class LineEdit(ViewItem) : """ This represents a line edit inside a View. When the lineedit's value is changed, it sends a message via a socket. socket is a QtNetwork.QLocalSocket that is not connected to anything. The message "valueSet:VAL" where VAL is some text will be sent when the text is changed. See the ksNspire example. """ def __init__(self,client,text,socket,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newLineEdit()") self.client.send("setPosX("+b2str(posX)+")") self.client.send("setPosY("+b2str(posY)+")") self.client.send("setGeoX("+b2str(sizeX)+")") self.client.send("setGeoY("+b2str(sizeY)+")") self.client.send("setText("+b2str(text)+")") self.client.send("setRotation("+b2str(rot)+")") self.handle=self.client.send("endEdit()") self.handle.remove(0,self.handle.indexOf("ing ")+4) socket.connectToServer(b2str(client.serverName)) socket.waitForConnected(300) socket.write(b2str("attachTo("+self.handle+")")) def set_text(self,text): """ Sets the text of the line edit. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setText("+b2str(text)+")") self.client.send("endEdit()") Kst-2.0.8/pyKst/pykst_old.py0000644000175000017500000032370612320547027015067 0ustar synthsynthimport sip sip.setapi('QString', 1) import sys import math import os import ctypes from time import sleep from PyQt4 import QtCore, QtNetwork from numpy import * from pykstpp import * def b2str(val): if isinstance(val, bool): return "true" if val else "false" else: return str(val) class Client: """ This class is an interface to a running kst session. Every convenience class inside pykst accepts an instance of Client which it uses to interact with a kst session. In addition, it holds functions which effect the entire kst session. If serverName is specified, creates a connection to either a running kst session with serverName, or if none exists, a new one. If serverName is not specified, creates a connection to either the kst session with the name "kstScript", or if none exists, a new one. """ def __init__(self,serverName="kstScript"): self.ls=QtNetwork.QLocalSocket() self.ls.connectToServer(serverName) self.ls.waitForConnected(300) self.serverName=serverName if self.ls.state()==QtNetwork.QLocalSocket.UnconnectedState: os.system("kst2 --serverName="+str(serverName)+"&") while self.ls.state()==QtNetwork.QLocalSocket.UnconnectedState: self.ls.connectToServer(serverName) self.ls.waitForConnected(300) self.serverName=serverName def send(self,command): """ Sends a command to kst and returns a response. You should never use this directly, as there is no guarantee that the internal command list kst uses won't change. Instead use the convenience classes included with pykst. """ ba=QtCore.QByteArray(b2str(command)) self.ls.write(ba) self.ls.flush() self.ls.waitForReadyRead(300000) x=self.ls.readAll() return x def send_si(self, handle, command): self.send(b2str("beginEdit("+handle.toAscii()+")")) x = self.send(command) self.send(b2str("endEdit()")) return x def getArray(self,command): """ Sends a request for a numPy.array. You should never use this directly, as there is no guarantee that the internal command list kst uses won't change. Instead use the convenience classes included with pykst. """ ret=array([0.0]) get_arr(ret,self.serverName,command) return ret def getArray2D(self,command): """ Sends a request for a numPy.array. You should never use this directly, as there is no guarantee that the internal command list kst uses won't change. Instead use the convenience classes included with pykst. """ ret=array([0.0]) get_matrix(ret,self.serverName,command) return ret def clear(self): """ Equivalent to file->close from the menubar inside kst. Clears all objects from kst.""" self.send("clear()") def screenBack(self): """ Equivalent to "Range>Back One Screen" from the menubar inside kst. """ self.send("screenBack()") def screenForward(self): """ Equivalent to "Range>Forward One Screen" from the menubar inside kst. """ self.send("screenForward()") def countFromEnd(self): """ Equivalent to "Range>Count From End" from the menubar inside kst. """ self.send("countFromEnd()") def readToEnd(self): """ Equivalent to "Range>Read To End" from the menubar inside kst. """ self.send("readToEnd()") def setPaused(self): """ Equivalent to checking "Range>Pause" from the menubar inside kst if "Range>Pause" is unchecked, otherwise no action. """ self.send("setPaused()") def unsetPaused(self): """ Equivalent to unchecking "Range>Pause" from the menubar inside kst if "Range>Pause" is checked, otherwise no action. """ self.send("unsetPaused()") def tabCount(self): """ Get the number of tabs open in the current document. """ return self.send("tabCount()") def newTab(self): """ Create a new tab in the current document and switch to it. """ return self.send("newTab()") def setTab(self,tab): """ Set the index of the current tab. It must be greater or equal to 0 and less than tabCount(). """ self.send("setTab("+b2str(tab)+")") def plot(self,*args): """ Create a new plot in the current tab in kst with arguments. Arguments may be 1D numPy arrays, 2D numPy arrays, pykst vectors or pykst matricies. In the case of the first two, they would be imported into kst. Formating based loosly on matplotlib.pyplot.plot strings like "r+" is also provided. Some examples:: client.plot(x, y) # plot x and y using default line style and color client.plot(x, y, 'bo') # plot x and y using blue circle markers client.plot(y) # plot y using x as index array 0..N-1 client.plot(y, 'r+') # ditto, but with red plusses See http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.plot A reference to the created plot is returned. """ s=-1 plot=0 makecurve=False for arg in args: if s==-1 and makecurve: if isinstance(arg,str): if '--' in arg: curvelinetype=1 arg=arg.replace('--','',1) elif '-..' in arg: curvelinetype=4 arg=arg.replace('-..','',1) elif '-.' in arg: curvelinetype=3 arg=arg.replace('-.','',1) elif ':' in arg: curvelinetype=2 arg=arg.replace(':','',1) elif '-' in arg: curvelinetype=0 arg=arg.replace('-','',1) if '.' in arg or ',' in arg or '<' in arg or '>' in arg or '3' in arg or '4' in arg or 'p' in arg or 'h' in arg or 'H' in arg or '|' in arg or '_' in arg: print("Warning: you are trying to use a marker type which is present in matplotlib.pyplot but not in pykst") usepoints=True pointtype=12 elif 'o' in arg: usepoints=True pointtype=2 elif 'v' in arg or '1' in arg: usepoints=True pointtype=4 elif '^' in arg or '2' in arg: usepoints=True pointtype=5 elif 's' in arg: usepoints=True pointtype=1 elif '*' in arg: usepoints=True pointtype=8 elif '+' in arg: usepoints=True pointtype=7 elif 'x' in arg: usepoints=True pointtype=0 elif 'D' in arg or 'd' in arg: usepoints=True pointtype=12 if 'b' in arg: color="blue" elif 'g' in arg: color="green" elif 'r' in arg: color="red" elif 'c' in arg: color="cyan" elif 'm' in arg: color="magenta" elif 'y' in arg: color="yellow" elif 'k' in arg: color="black" elif 'w' in arg: color="white" s=-2 NewCurve(self,x,y,0,0,0,0,False,False,color,curvelinetype,curveweight, uselines,usepoints,pointtype,pointdensity,usehead,headtype,color,usebargraph,bargraphfill, ignoreinauto,donotplaceinanyplot,placeinexistingplot,placeinnewplot) plot=ExistingPlot.getList(self)[-1] #i.e., last makecurve=False x=0 y=0 if s==-2: s=-1 continue s+=1 if s==0: while True: if isinstance(arg,Vector): x=arg break elif isinstance(arg,Matrix): ColorImage(self,arg,0,0,0,0,0,True,0,False,0 if not isinstance(plot,Plot) else plot,True if not isinstance(plot,Plot) else False) plot=ExistingPlot(self,ExistingPlot.getList(self)[-1]) #i.e., last s=-1 break elif isinstance(arg,ndarray): x=EditableVector(self) if arg.ndim==1 else EditableMatrix(self) x.setFromList(arg) arg=x else: print("Unknown arg. type...") break if s==1: if isinstance(arg,Vector): y=arg elif isinstance(arg,ndarray): y=EditableVector(self) y.setFromList(arg) else: continue color="black" curvelinetype=0 curveweight=2 uselines=True usepoints=False pointtype=0 pointdensity=0 usehead=False headtype=0 usebargraph=False bargraphfill="black" ignoreinauto=False donotplaceinanyplot=False placeinexistingplot=0 if not isinstance(plot,Plot) else plot placeinnewplot=True if not isinstance(plot,Plot) else False #no args after this makecurve=True s=-1 if makecurve: NewCurve(self,x,y,0,0,0,0,False,False,color,curvelinetype,curveweight,uselines,usepoints,pointtype,pointdensity,usehead,headtype,color,usebargraph,bargraphfill,ignoreinauto,donotplaceinanyplot,placeinexistingplot,placeinnewplot) plot=ExistingPlot(self,ExistingPlot.getList(self)[-1]) #i.e., last return plot class NamedObject: """ This is a class which some convenience classes within pykst use. You should not use it directly. """ def __init__(self,client): self.client=client def remove(self): """ This removes the object from Kst. You should be careful when using this, because any handles you have to this object will still exist and be invalid. """ self.client.send("eliminate("+self.handle.toAscii()+")") def getHandle(self): return self.handle def setName(self,name): """ Sets a descriptive name for this object. Descriptive names may be non-unique, and as such should not be used as handles. """ self.client.send("#setName("+self.handle.toAscii()+","+name+")") class Scalar(NamedObject): """ This is a class which some convenience classes within pykst use. You should not use it directly. """ def __init__(self,client) : NamedObject.__init__(self,client) def value(self): """ Returns the value of the scalar as a float. """ return QtCore.QString(self.client.send("Scalar::value("+self.handle+")")).toFloat()[0] def setValue(self,val): """ This function should only be used with GeneratedScalars and ExistingScalars. """ self.client.send("Scalar::value("+self.handle+","+b2str(val)+")") class DataSourceScalar(Scalar): """ This class represents a scalar you would create via "Create>Scalar>Read from Data Source" from the menubar inside kst. TODO: implement the configure widget within this widget The parameters of this function mirror the parameters within "Create>Scalar>Read from Data Source". To create a scalar from '/foo.bar' with field foobar and descriptive name "Bob" and print its value:: import pykst as kst client = kst.Client() dataSrcScalar = kst.DataSourceScalar(client,"/foo.bar","foobar","Bob") print(dataSrcScalar.value())""" def __init__(self,client,filename,field="INDEX",name=""): Scalar.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newScalarFromDataSource("+b2str(filename)+","+b2str(field)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class DataVectorScalar(Scalar): """ This class represents a scalar you would create via "Create>Scalar>Read from Data Vector" from the menubar inside kst. TODO: implement the configure widget within this widget, implement edit functions The parameters of this function mirror the parameters within "Create>Scalar>Read from Data Vector". """ def __init__(self,client,filename,field="INDEX",frame=-1,name=""): Scalar.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newScalarFromDataVector("+b2str(filename)+","+b2str(field)+","+b2str(frame)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class GeneratedScalar(Scalar): """ This class represents a scalar you would create via "Create>Scalar>Generate" from the menubar inside kst. TODO: implement edit functions The parameters of this function mirror the parameters within "Create>Scalar>Generate". """ def __init__(self,client,val,name=""): Scalar.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newScalarGenerated("+b2str(val)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingScalar(Scalar): """ This class allows access to a scalar created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a scalar created inside kst or through a script. To print out the name and value of all scalars:: import pykst as kst client = kst.Client() scalars = kst.ExistingScalar.getList(client) for s in sclars: print(s.getHandle()+":"+s.value()) """ def __init__(self,client,handle): Scalar.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): """ Returns a python list of all scalars. """ x=QtCore.QString(client.send("getScalarList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingScalar(client,y)) return ret class Vector(NamedObject): """ This is a class which some convenience classes within pykst use. You should not use it directly. "handle" is a descriptive or short name of a scalar created inside kst or through a script. """ def __init__(self,client) : NamedObject.__init__(self,client) def length(self) : """ Returns the count of elements inside the vector. """ return QtCore.QString(self.client.send("Vector::length("+self.handle+")")).toInt()[0] def interpolate(self,in_i,ns_i): """ Returns element i of this vector interpolated to have ns_i total samples. """ return QtCore.QString(self.client.send("Vector::interpolate("+self.handle+","+b2str(in_i)+","+b2str(ns_i)+")")).toDouble()[0] def interpolateNoHoles(self,in_i,ns_i): """ Returns element i of this vector interpolated to have ns_i total samples without any holes. """ return QtCore.QString(self.client.send("Vector::interpolateNoHoles("+self.handle+","+b2str(in_i)+","+b2str(ns_i)+")")).toDouble()[0] def __getitem__(self,index): """ Returns element i of this vector. """ return QtCore.QString(self.client.send("Vector::value("+self.handle+","+b2str(index)+")")).toDouble()[0] def value(self,index): """ Returns element i of this vector. """ return QtCore.QString(self.client.send("Vector::value("+self.handle+","+b2str(index)+")")).toDouble()[0] def min_(self) : """ Returns the value of the element with the minimum value. """ return QtCore.QString(self.client.send("Vector::min("+self.handle+")")).toDouble()[0] def max_(self) : """ Returns the value of the element with the maximum value. """ return QtCore.QString(self.client.send("Vector::max("+self.handle+")")).toDouble()[0] def ns_max(self) : """ Returns the value of the element with the maximum value while being insensitive to spikes. """ return QtCore.QString(self.client.send("Vector::ns_max("+self.handle+")")).toDouble()[0] def ns_min(self) : """ Returns the value of the element with the minimum value while being insensitive to spikes. """ return QtCore.QString(self.client.send("Vector::ns_min("+self.handle+")")).toDouble()[0] def mean(self) : """ Returns the mean of this vector. """ return QtCore.QString(self.client.send("Vector::mean("+self.handle+")")).toDouble()[0] def minPos(self) : """ Returns the value of the element with the minimum positive value. """ return QtCore.QString(self.client.send("Vector::minPos("+self.handle+")")).toDouble()[0] def numNew(self) : """ Returns the number of new samples in the vector since last newSync. See also newSync()""" return QtCore.QString(self.client.send("Vector::numNew("+self.handle+")")).toInt()[0] def numShift(self) : """ Returns the number of samples shifted in the vector since last newSync. See also newSync()""" return QtCore.QString(self.client.send("Vector::numShift("+self.handle+")")).toInt()[0] def isRising(self) : """ Returns true if a data vector is getting new data. """ return True if QtCore.QString(self.client.send("Vector::isRising("+self.handle+")"))==True else False def newSync(self) : """ See numNew() and numShift() """ QtCore.QString(self.client.send("Vector::newSync("+self.handle+")")) def resize(self,sz,init) : """ Sets the size of this vector to sz, and, if init is set to True, initializes new values to 0 """ QtCore.QString(self.client.send("Vector::resize("+self.handle+","+b2str(sz)+","+b2str(init)+")")) def setNewAndShift(self,inNew,inShift) : """ Sets the value which numNew() and numShift() will return. See also numNew() and numShift(). """ QtCore.QString(self.client.send("Vector::setNewAndShift("+self.handle+","+b2str(inNew)+","+b2str(inShift)+")")) def zero(self) : """ Sets all values in the vector to zero. """ QtCore.QString(self.client.send("Vector::zero("+self.handle+")")) def blank(self) : """ Sets all values in the vector to NOPOINT (NaN). """ QtCore.QString(self.client.send("Vector::blank("+self.handle+")")) def getNumPyArray(self) : """ Returns a numPy array of the vector. """ return self.client.getArray(self.handle) def changeFrames(self,f0,n,skip,in_doSkip,in_doAve) : """ For DataVectors, sets the start and ending frame as well as skipping parameters. f0 is the starting frame, n is the number of frames, skip is the number of samples to read per frame, in_doSkip should be set to true if you want to actually skip samples. in_doAve represents whether the box filter should be applied.""" return self.client.send("DataVector::changeFrames("+self.handle+","+b2str(f0)+","+b2str(n)+","+b2str(skip)+","+b2str(in_doSkip)+","+b2str(in_doAve)+")") def numFrames(self) : """ For DataVectors, returns the frame count of the data source. .. note:: length() is the number of samples in this vector. numFrames() is the number of frames in the data source. """ return self.client.send("DataVector::numFrames("+self.handle+","+")") def startFrame(self) : """ For DataVectors, returns the start frame from the data source. .. note:: This applies to the data source. The actual vector starts at frame 0. """ return self.client.send("DataVector::startFrame("+self.handle+")") def doSkip(self) : """ For DataVectors, whether or not samples are skipped. """ return True if self.client.send("DataVector::doSkip("+self.handle+")")=="true" else False def doAve(self) : """ For DataVectors, whether or not the box filter is applied. """ return True if self.client.send("DataVector::doAvg("+self.handle+")")=="true" else False def skip(self) : """ For DataVectors, if doSkip()==True, one sample is read every skip frames, else undefined. """ return int(self.client.send("DataVector::skip("+self.handle+")")) def reload_(self) : """ For DataVectors, reloads. """ self.client.send("DataVector::reload("+self.handle+")") def samplesPerFrame(self) : """ For DataVectors, number of samples contained per frame in the data source. (Not) to be confused with skip(), which is very different. """ return int(self.client.send("DataVector::samplesPerFrame("+self.handle+")")) def fileLength(self) : """ For DataVectors, . . . """ return int(self.client.send("DataVector::fileLength("+self.handle+")")) def readToEOF(self) : """ For DataVectors, returns True if read to end, else False. """ return True if self.client.send("DataVector::readToEOF("+self.handle+")") else False def countFromEOF(self) : """ For DataVectors, returns True if read from end, else False. """ return True if self.client.send("DataVector::readFromEOF("+self.handle+")") else False def descriptionTip(self) : """ For DataVectors, returns lots of really awesome information. But only for DataVectors! """ return str(self.client.send("DataVector::descriptionTip("+self.handle+")")) def isValid(self): """ For DataVectors, returns true if valid, else false. """ return True if self.client.send("DataVector::isValid("+self.handle+")") else False class DataVector(Vector): """ This class represents a vector you would create via "Create>Vector>Read from Data Source" from the menubar inside kst. TODO: implement the configure widget and implement edit functions. The parameters of this function mirror the parameters within "Create>Vector>Read from Data Source". start is start, or if from end, -1. drange is range, or if to end, -1. start and drange cannot both be -1, obviously. skip is False for no skip or the number of samples to read per frame. To create a vector from '/foo.bar' with field 'foo' from index 3 to index 10 skipping every other sample without a boxcar filter:: import pykst as kst client = kst.Client() v = kst.DataVector(client,"/foo.bar","foo",False,True,False,3,10,2,False) """ def __init__(self,client,filename,field="INDEX",changeDetection=False,timeInterval=True,dontUpdate=False,start=0,drange=-1,skip=False,boxcarFirst=False,name="") : Vector.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newVectorFromDataSource("+b2str(filename)+","+b2str(field)+","+b2str(changeDetection)+","+b2str(timeInterval)+","+b2str(dontUpdate)+","+b2str(start)+","+b2str(drange)+","+b2str(skip)+","+b2str(boxcarFirst)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class GeneratedVector(Vector) : """ This class represents a vector you would create via "Create>Vector>Generate" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Vector>Generate". TODO: implement edit functions.""" def __init__(self,client,sfrom,to,samples,name="") : Vector.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newVectorGenerate("+b2str(sfrom)+","+b2str(to)+","+b2str(samples)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class EditableVector(Vector) : """ Use this class to insert a vector into kst. Editable vectors can not be created by using the kst gui. TODO: implement names To import a numPy array of the first 20 powers of 2 into kst:: import pykst as kst from numpy import * a=array([]) a.resize(20) i=1 for x in a: x = i i*=2 client=kst.Client() v=kst.EditableVector(client) v.setFromList(a)""" def __init__(self,client) : Vector.__init__(self,client) self.handle=QtCore.QString(self.client.send("newEditableVectorAndGetHandle()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) def setFromList(self,arr): """ Imports a numPy array into kst.""" set_arr(arr,self.client.serverName,self.handle) return class ExistingVector(Vector) : """ This class allows access to a non-editable vector created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a vector created inside kst or through a script. """ def __init__(self,client,handle) : Vector.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): """ Returns a python list of all vectors. """ x=QtCore.QString(client.send("getVectorList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingVector(client,y)) return ret class Matrix(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. """ def __init__(self,client) : NamedObject.__init__(self,client) def getNumPyArray(self) : """ Returns a numPy array of the matrix. """ return self.client.getArray2D(self.handle) def setXMin(self,x0=0) : """ set the left edge of the map defined by the matrix """ self.client.send_si(self.handle, b2str("setXMinimum("+b2str(x0)+")")) def getXMin(self) : """ get the left edge of the map defined by the matrix """ return self.client.send_si(self.handle, b2str("getXMinimum()")) def setYMin(self,y0=0) : """ set the bottom edge of the map defined by the matrix """ self.client.send_si(self.handle, b2str("setYMinimum("+b2str(y0)+")")) def getYMin(self) : """ get the bottom edge of the map defined by the matrix """ return self.client.send_si(self.handle, b2str("getYMinimum()")) def setXStep(self,dx=0) : """ set the x step size of the map defined by the matrix """ self.client.send_si(self.handle, b2str("setXStepSize("+b2str(dx)+")")) def getXStep(self) : """ get the x step size of the map defined by the matrix """ return self.client.send_si(self.handle, b2str("getXStepSize()")) def setYStep(self,dy=0) : """ set the y step size of the map defined by the matrix """ self.client.send_si(self.handle, b2str("setYStepSize("+b2str(dy)+")")) def getYStep(self) : """ get the y step size of the map defined by the matrix """ return self.client.send_si(self.handle, b2str("getYStepSize()")) class DataMatrix(Matrix) : """ This class represents a matrix you would create via "Create>Matrix" from the menubar inside kst. TODO: edit functions, configure The parameters of this function mirror the parameters within "Create>Matrix". """ def __init__(self,client,filename,field,xstart,ystart,xnframe,ynframe,skip=False,boxcarFirst=False,xmin=0,ymin=0,xstep=1,ystep=1,name="") : Matrix.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newMatrix("+b2str(filename)+","+b2str(field)+","+b2str(xstart)+","+b2str(ystart)+","+b2str(xnframe)+","+b2str(ynframe)+","+b2str(skip)+","+b2str(boxcarFirst)+","+b2str(xmin)+","+b2str(ymin)+","+b2str(xstep)+","+b2str(ystep)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingMatrix(Matrix) : """ This class allows access to a matrix created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a vector created inside kst or through a script. """ def __init__(self,client,handle) : Matrix.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): """ Returns a python list of all matracies. """ x=QtCore.QString(client.send("getMatrixList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),99999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingMatrix(client,y)) return ret class EditableMatrix(Matrix) : """ Use this class to insert a matrix into kst. Editable vectors can not be created by using the kst gui. """ def __init__(self,client) : Matrix.__init__(self,client) self.handle=QtCore.QString(self.client.send("newEditableMatrixAndGetHandle()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) def setFromList(self,arr): """ Imports a numpy 2d array into kst.""" set_matrix(arr,arr.shape[0],arr.shape[1],self.client.serverName,self.handle) return class ExistingString(String) : """ This class allows access to a string created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a string created inside kst or through a script. """ def __init__(self,client,handle) : String.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getStringList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingString(client,y)) return ret class Curve(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewCurve(Curve) : """ This class represents a string you would create via "Create>Curve" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Curve". Colors are given by a name such as 'red' or a hex number such as '#FF0000'. curvelinetype is the index of a pen style where 0 is SolidLine, 1 is DashLine, 2 is DotLine, 3 is DashDotLine, and 4 isDashDotDotLine, pointtype is the index of a point style. 0 is an X, 1 is an open square, 2 is an open circle, 3 is a filled circle, 4 is a downward open triangle, 5 is an upward open triangle, 6 is a filled square, 7 is a plus, 8 is an asterisk, 9 is a downward filled triangle, 10 is an upward filled triangle, 11 is an open diamond, and 12 is a filled diamond. headtype is the index of a point style. See details for pointtype. To place in an existing plot, set placeinexistingplot = plot To prevent a the curve from being placed in any plot, set donotplaceinanyplot=True. The default is to place the curve in a new plot. Not specifying a parameter implies it's default value (i.e., the setting used on the previous curve whether through a script or by the GUI).""" def __init__(self,client,xaxis,yaxis,plusxerrorbar=0,plusyerrorbar=0,minusxerrorbar=0,minusyerrorbar=0,usexplusforminus=True,useyplusforminus=True,curvecolor="",curvelinetype="",curveweight="",uselines=True,usepoints=False,pointtype="",pointdensity="",usehead=False,headtype="",headcolor="",usebargraph=False,bargraphfill="",ignoreinauto="",donotplaceinanyplot=False,placeinexistingplot=0,placeinnewplot=True,placeinnewtab=False,scalefonts=True,autolayout=True,customgridcolumns=False,protectexistinglayout=False,name="") : Curve.__init__(self,client) if placeinexistingplot != 0: donotplaceinanyplot=False placeinnewplot=False placeinnewtab=False existingplothandle = placeinexistingplot.handle else: existingplothandle = " " if donotplaceinanyplot == True: placeinnewplot=False placeinnewtab=False existingplothandle = " " if plusxerrorbar==0: plusxerrorbarhandle = "" else: plusxerrorbarhandle = plusxerrorbar.handle if minusxerrorbar==0: minusxerrorbarhandle = "" else: minusxerrorbarhandle = minusxerrorbar.handle if plusyerrorbar==0: plusyerrorbarhandle = "" else: plusyerrorbarhandle = plusyerrorbar.handle if minusyerrorbar==0: minusyerrorbarhandle = "" else: minusyerrorbarhandle = minusyerrorbar.handle self.handle=QtCore.QString(self.client.send("#newCurve("+b2str(xaxis.handle)+","+b2str(yaxis.handle)+","+b2str(plusxerrorbarhandle)+","+b2str(plusyerrorbarhandle)+","+b2str(minusxerrorbarhandle)+","+b2str(minusyerrorbarhandle)+","+b2str(usexplusforminus)+","+b2str(useyplusforminus)+")")) self.client.send("#setCurveParameters("+b2str(curvecolor)+","+b2str(curvelinetype)+","+b2str(curveweight)+","+b2str(uselines)+","+b2str(usepoints)+","+b2str(pointtype)+","+b2str(pointdensity)+","+b2str(usehead)+","+b2str(headtype)+","+b2str(headcolor)+","+b2str(usebargraph)+","+b2str(bargraphfill)+","+b2str(ignoreinauto)+","+b2str(donotplaceinanyplot)+","+b2str(existingplothandle)+","+b2str(placeinnewplot)+","+b2str(placeinnewtab)+","+b2str(scalefonts)+","+b2str(autolayout)+","+b2str(customgridcolumns)+","+b2str(protectexistinglayout)+","+b2str(name)+")") self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingCurve(Curve) : """ This class allows access to a curve created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a curve created inside kst or through a script. """ def __init__(self,client,handle) : Curve.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getCurveList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingCurve(client,y)) return ret # EQUATIONS ################################################################### class Equation(NamedObject) : """ This is the base class for Kst Equations. To create a new equation use pykst.NewEquation() or to access an existing equation use pykst.ExistingEquation() For example, to plot f(x)=x^2 with x in range(-100,100) with 1000000 samples: :: import pykst as kst client = kst.Client() x=kst.GeneratedVector(client,-100,100,1000000) GYEquation=kst.NewEquation(client, "x^2", x) GYEqCurve = kst.NewCurve(client,GYEquation.X(), GYEquation.Y(), curvecolor="black", curveweight=1, placeinnewplot=True) TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ Returns a vector containing the output of the equation (ie, f(x)) """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", O)")) return ExistingVector(self.client, YHandle) def X(self) : """ Returns the vector which has been used as the independent variable of the equation """ XHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", XO)")) return ExistingVector(self.client, XHandle) class NewEquation(Equation) : """ This class represents an equation you would create via "Create>Equation" from the menubar inside kst. """ def __init__(self,client,equation,xvector,interploate=False,name="") : Equation.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newEquation("+b2str(equation)+","+b2str(xvector.handle)+","+b2str(interploate)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingEquation(Equation) : """ This class allows access to an equation created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of an equation created inside kst or through a script. """ def __init__(self,client,handle) : Equation.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getEquationList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingEquation(client,y)) return ret # FIT ################################################################### class Fit(NamedObject) : """ This is a class which provides some methods common to all fits """ def __init__(self,client) : NamedObject.__init__(self,client) def Fit(self) : """ a vector containing the fit """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Fit)")) return ExistingVector(self.client, YHandle) def Residuals(self) : """ a vector containing the Residuals """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Residuals)")) return ExistingVector(self.client, YHandle) def Parameters(self) : """ a vector containing the Parameters of the fit """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Parameters Vector)")) return ExistingVector(self.client, YHandle) def Covariance(self) : """ a vector containing the Covariance of the fit parameters """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Covariance)")) return ExistingVector(self.client, YHandle) def ReducedChi2(self) : """ a scalar containing the reduced chi2 of the fit """ YHandle = QtCore.QString(self.client.send("DataObject::outputScalarHandle("+self.handle+", chi^2/nu)")) return ExistingScalar(self.client, YHandle) # LINEAR FIT ################################################################# class LinearFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Low(self) : """ a vector containing the 1 sigma lower limit of the fit """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Lo Vector)")) return ExistingVector(self.client, YHandle) def High(self) : """ a vector containing the 1 sigma upper limit of the fit """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Hi Vector)")) return ExistingVector(self.client, YHandle) class NewLinearFit(LinearFit) : """ This class represents a fit you would create via "Create>Plugin->Linear Fit" from the menubar inside kst or by using "rmb->fit->[curvename]", and then selecting "Linear Fit" in the plugin combo. If the weightvector is listed, then it will be a weighted fit. Otherwise it will be unweighted. NewLinearFit() and ExistingLinearFit() have the same methods.""" def __init__(self,client,xvector,yvector,weightvector=0,name="") : LinearFit.__init__(self,client) if weightvector==0: QtCore.QString(self.client.send("newPlugin(Linear Fit)")) else: QtCore.QString(self.client.send("newPlugin(Linear Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingLinearFit(LinearFit) : """ This class allows access to an Linear Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Linear Fit created inside kst or through a script. """ def __init__(self,client,handle) : LinearFit.__init__(self,client) self.handle=handle # POLYNOMIAL FIT ################################################################# class PolynomialFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewPolynomialFit(PolynomialFit) : """ This class represents a fit you would create via "Create>Plugin->Polynomial Fit" from the menubar inside kst or by using "rmb->fit->[curvename]", and then selecting "Polynomial Fit" in the plugin combo. "order" can be either a Scalar or a number. If the weightvector is listed, then it will be a weighted fit. Otherwise it will be unweighted. NewPolynomialFit() and ExistingPolynomialFit() have the same methods.""" def __init__(self,client,xvector,yvector,order_in,name="", weightvector=0) : PolynomialFit.__init__(self,client) if isinstance(order_in, Scalar): order = order_in else : order = GeneratedScalar(client, order_in); if weightvector==0: QtCore.QString(self.client.send("newPlugin(Polynomial Fit)")) else: QtCore.QString(self.client.send("newPlugin(Polynomial Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Order Scalar,"+order.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingPolynomialFit(PolynomialFit) : """ This class allows access to an Polynomial Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Polynomial Fit created inside kst or through a script. """ def __init__(self,client,handle) : PolynomialFit.__init__(self,client) self.handle=handle # SINUSOID FIT ################################################################# class SinusoidFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewSinusoidFit(SinusoidFit) : """ This class represents a fit you would create via "Create>Plugin->Sinusoid Fit" from the menubar inside kst or by using "rmb->fit->[curvename]", and then selecting "Sinusoid Fit" in the plugin combo. Period and Harmonics can be either a Scalar or a number. If the weightvector is listed, then it will be a weighted fit. Otherwise it will be unweighted. NewSinusoidFit() and ExistingSinusoidFit() have the same methods.""" def __init__(self,client,xvector,yvector,period_in, harmonics_in, weightvector=0, name = "") : SinusoidFit.__init__(self,client) if isinstance(period_in, Scalar): period = period_in else : period = GeneratedScalar(client, period_in); if isinstance(harmonics_in, Scalar): harmonics = harmonics_in; else : harmonics = GeneratedScalar(client, harmonics_in); if weightvector==0: QtCore.QString(self.client.send("newPlugin(Sinusoid Fit)")) else: QtCore.QString(self.client.send("newPlugin(Sinusoid Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Period Scalar,"+period.handle+")")) QtCore.QString(self.client.send("setInputScalar(Harmonics Scalar,"+harmonics.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingSinusoidFit(SinusoidFit) : """ This class allows access to an Sinusoid Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Sinusoid Fit created inside kst or through a script. """ def __init__(self,client,handle) : SinusoidFit.__init__(self,client) self.handle=handle # LORENTZIAN FIT ################################################################# class LorentzianFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewLorentzianFit(LorentzianFit) : """ This class represents a linear fit you would create via "Create>Plugin->Lorentzian Fit" from the menubar inside kst or by using "rmb->fit->[curvename], and then selecting "Lorentzian Fit" in the plugin combo. NewLorentzianFit() and ExistingLorentzianFit() have the same methods.""" def __init__(self,client,xvector,yvector,weightvector=0,name="") : LorentzianFit.__init__(self,client) if weightvector==0: QtCore.QString(self.client.send("newPlugin(Lorentzian Fit)")) else: QtCore.QString(self.client.send("newPlugin(Lorentzian Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingLorentzianFit(LorentzianFit) : """ This class allows access to an Lorentzian Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Lorentzian Fit created inside kst or through a script. """ def __init__(self,client,handle) : LorentzianFit.__init__(self,client) self.handle=handle # GAUSSIAN FIT ################################################################# class GaussianFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewGaussianFit(GaussianFit) : """ This class represents a fit you would create via "Create>Plugin->Gaussian Fit" from the menubar inside kst or by using "rmb->fit->[curvename], and then selecting "Gaussian Fit" in the plugin combo. NewGaussianFit() and ExistingGaussianFit() have the same methods.""" def __init__(self,client,xvector,yvector,weightvector=0,name="") : GaussianFit.__init__(self,client) if weightvector==0: QtCore.QString(self.client.send("newPlugin(Gaussian Fit)")) else: QtCore.QString(self.client.send("newPlugin(Gaussian Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingGaussianFit(GaussianFit) : """ This class allows access to an Gaussian Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Gaussian Fit created inside kst or through a script. """ def __init__(self,client,handle) : GaussianFit.__init__(self,client) self.handle=handle # EXPONENTIAL FIT ################################################################# class ExponentialFit(Fit) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewExponentialFit(ExponentialFit) : """ This class represents an exponential fit you would create via "Create>Plugin->Exponential Fit" from the menubar inside kst or by using "rmb->fit->[curvename], and then selecting "Exponential Fit" in the plugin combo. NewExponentialFit() and ExistingExponentialFit() have the same methods.""" def __init__(self,client,xvector,yvector,weightvector=0,name="") : ExponentialFit.__init__(self,client) if weightvector==0: QtCore.QString(self.client.send("newPlugin(Exponential Fit)")) else: QtCore.QString(self.client.send("newPlugin(Exponential Weighted Fit)")) QtCore.QString(self.client.send("setInputVector(Weights Vector,"+weightvector.handle+")")) QtCore.QString(self.client.send("setInputVector(X Vector,"+xvector.handle+")")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingExponentialFit(ExponentialFit) : """ This class allows access to an Exponential Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Exponential Fit created inside kst or through a script. """ def __init__(self,client,handle) : ExponentialFit.__init__(self,client) self.handle=handle # FILTER ################################################################### class Filter(NamedObject) : """ This is a class which provides some methods common to many filters """ def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the filtered output """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Y Vector)")) return ExistingVector(self.client, YHandle) # LOW PASS FILTER ################################################################# class LowPassFilter(Filter) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewLowPassFilter(LowPassFilter) : """ This class represents a filter you would create via "Create>Filter Plugin->Low Pass Filter" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Low Pas Filter" in the plugin combo. The parameters of this function mirror the parameters within the latter dialog. NewLowPassFilter() and ExistingLowPassFilter() have the same methods.""" def __init__(self,client,yvector,order_in, cutoff_in,name="") : LowPassFilter.__init__(self,client) if isinstance(order_in, Scalar): order = order_in else : order = GeneratedScalar(client, order_in); if isinstance(cutoff_in, Scalar): cutoff = cutoff_in else : cutoff = GeneratedScalar(client, cutoff_in); QtCore.QString(self.client.send("newPlugin(Low Pass Filter)")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Order Scalar,"+order.handle+")")) QtCore.QString(self.client.send("setInputScalar(Cutoff / Spacing Scalar,"+cutoff.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingLowPassFilter(LowPassFilter) : """ This class allows access to an Linear Fit created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a LowPassFilter created inside kst or through a script. """ def __init__(self,client,handle) : LowPassFilter.__init__(self,client) self.handle=handle # HIGH PASS FILTER ################################################################# class HighPassFilter(Filter) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewHighPassFilter(HighPassFilter) : """ This class represents a filter you would create via "Create>Filter Plugin->High Pass Filter" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "High Pas Filter" in the plugin combo. The parameters of this function mirror the parameters within the latter dialog. NewHighPassFilter() and ExistingHighPassFilter() have the same methods.""" def __init__(self,client,yvector,order_in, cutoff_in,name="") : HighPassFilter.__init__(self,client) if isinstance(order_in, Scalar): order = order_in else : order = GeneratedScalar(client, order_in); if isinstance(cutoff_in, Scalar): cutoff = cutoff_in else : cutoff = GeneratedScalar(client, cutoff_in); QtCore.QString(self.client.send("newPlugin(High Pass Filter)")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Order Scalar,"+order.handle+")")) QtCore.QString(self.client.send("setInputScalar(Cutoff / Spacing Scalar,"+cutoff.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingHighPassFilter(HighPassFilter) : """ This class allows access to an HighPassFilter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a HighPassFilter created inside kst or through a script. """ def __init__(self,client,handle) : HighPassFilter.__init__(self,client) self.handle=handle # BAND PASS FILTER ################################################################# class BandPassFilter(Filter) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewBandPassFilter(BandPassFilter) : """ This class represents a filter you would create via "Create>Filter Plugin->Band Pass Filter" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Band Pas Filter" in the plugin combo. The parameters of this function mirror the parameters within the latter dialog. NewBandPassFilter() and ExistingBandPassFilter() have the same methods.""" def __init__(self,client,yvector,order_in, central_in, bandwidth_in,name="") : BandPassFilter.__init__(self,client) if isinstance(order_in, Scalar): order = order_in else : order = GeneratedScalar(client, order_in); if isinstance(central_in, Scalar): central = central_in else : central = GeneratedScalar(client, central_in); if isinstance(bandwidth_in, Scalar): bandwidth = bandwidth_in else : bandwidth = GeneratedScalar(client, bandwidth_in); QtCore.QString(self.client.send("newPlugin(Band Pass Filter)")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Order Scalar,"+order.handle+")")) QtCore.QString(self.client.send("setInputScalar(Central Frequency / Sample Rate Scalar,"+central.handle+")")) QtCore.QString(self.client.send("setInputScalar(Band width Scalar,"+bandwidth.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingBandPassFilter(BandPassFilter) : """ This class allows access to a BandPassFilter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a BandPassFilter created inside kst or through a script. """ def __init__(self,client,handle) : BandPassFilter.__init__(self,client) self.handle=handle # BAND STOP FILTER ################################################################# class BandStopFilter(Filter) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) class NewBandStopFilter(BandStopFilter) : """ This class represents a filter you would create via "Create>Filter Plugin->Band Stop Filter" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Band Pas Filter" in the plugin combo. The parameters of this function mirror the parameters within the latter dialog. NewBandStopFilter() and ExistingBandStopFilter() have the same methods.""" def __init__(self,client,yvector,order_in, central_in, bandwidth_in,name="") : BandStopFilter.__init__(self,client) if isinstance(order_in, Scalar): order = order_in else : order = GeneratedScalar(client, order_in); if isinstance(central_in, Scalar): central = central_in else : central = GeneratedScalar(client, central_in); if isinstance(bandwidth_in, Scalar): bandwidth = bandwidth_in else : bandwidth = GeneratedScalar(client, bandwidth_in); QtCore.QString(self.client.send("newPlugin(Band Stop Filter)")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Order Scalar,"+order.handle+")")) QtCore.QString(self.client.send("setInputScalar(Central Frequency / Sample Rate Scalar,"+central.handle+")")) QtCore.QString(self.client.send("setInputScalar(Band width Scalar,"+bandwidth.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingBandStopFilter(BandStopFilter) : """ This class allows access to an BandStopFilter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a BandPassFilter created inside kst or through a script. """ def __init__(self,client,handle) : BandStopFilter.__init__(self,client) self.handle=handle # CUMULATIVE SUM ################################################################# class CumulativeSum(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the cumulative sum """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", sum(Y)dX)")) return ExistingVector(self.client, YHandle) class NewCumulativeSum(CumulativeSum) : """ This class represents a filter you would create via "Create>Filter Plugin->Cumulative Sum" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Cumulative Sum" in the plugin combo. A cumulative sum is a a descrete integral. NewCumulativeSum() and ExistingCumulativeSum() have the same methods.""" def __init__(self,client,yvector,dx_in,name="") : CumulativeSum.__init__(self,client) if isinstance(dx_in, Scalar): dx = dx_in else : dx = GeneratedScalar(client, dx_in); QtCore.QString(self.client.send("newPlugin(Cumulative Sum)")) QtCore.QString(self.client.send("setInputVector(Vector In,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Scale Scalar,"+dx.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingCumulativeSum(CumulativeSum) : """ This class allows access to a CumulativeSum created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a CumulativeSum created inside kst or through a script. """ def __init__(self,client,handle) : CumulativeSum.__init__(self,client) self.handle=handle # Despike Filter ################################################################# class DespikeFilter(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the despiked timestream """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Y)")) return ExistingVector(self.client, YHandle) class NewDespikeFilter(DespikeFilter) : """ This class represents a filter you would create via "Create>Filter Plugin->Despike Filter" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Despike Filter" in the plugin combo. NewDespikeFilter() and ExistingDespikeFilter() have the same methods.""" def __init__(self,client,yvector,nsigma_in, spacing_in,name="") : DespikeFilter.__init__(self,client) if isinstance(nsigma_in, Scalar): nsigma = nsigma_in else : nsigma = GeneratedScalar(client, nsigma_in); if isinstance(spacing_in, Scalar): spacing = spacing_in else : spacing = GeneratedScalar(client, spacing_in); QtCore.QString(self.client.send("newPlugin(Despike Filter)")) QtCore.QString(self.client.send("setInputVector(Y Vector,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(NSigma Scalar,"+nsigma.handle+")")) QtCore.QString(self.client.send("setInputScalar(Spacing Scalar,"+spacing.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingDespikeFilter(DespikeFilter) : """ This class allows access to a DespikeFilter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a DespikeFilter created inside kst or through a script. """ def __init__(self,client,handle) : DespikeFilter.__init__(self,client) self.handle=handle # DIFFERENTIATION ################################################################# class Differentiation(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the Derrivative """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Y')")) return ExistingVector(self.client, YHandle) class NewDifferentiation(Differentiation) : """ This class represents a filter you would create via "Create>Filter Plugin->Fixed Step Differentiation" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Fixed Step Differentiation" in the plugin combo. NewDifferentiation() and ExistingDifferentiation() have the same methods.""" def __init__(self,client,yvector,dx_in, name="") : Differentiation.__init__(self,client) if isinstance(dx_in, Scalar): dx = dx_in else : dx = GeneratedScalar(client, dx_in); QtCore.QString(self.client.send("newPlugin(Fixed Step Differentiation)")) QtCore.QString(self.client.send("setInputVector(Vector In,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(Scalar In,"+dx.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingDifferentiation(Differentiation) : """ This class allows access to an Differentiation filter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Differentiation filter created inside kst or through a script. """ def __init__(self,client,handle) : Differentiation.__init__(self,client) self.handle=handle # SHIFT ################################################################# class Shift(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the shifted vector """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Shifted Vector)")) return ExistingVector(self.client, YHandle) class NewShift(Shift) : """ This class represents a filter you would create via "Create>Filter Plugin->Shift" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "Shift" in the plugin combo. NewShift() and ExistingShift() have the same methods.""" def __init__(self,client,yvector,dx_in, name="") : Shift.__init__(self,client) if isinstance(dx_in, Scalar): dx = dx_in else : dx = GeneratedScalar(client, dx_in); QtCore.QString(self.client.send("newPlugin(Shift)")) QtCore.QString(self.client.send("setInputVector(Vector In,"+yvector.handle+")")) QtCore.QString(self.client.send("setInputScalar(dX,"+dx.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingShift(Shift) : """ This class allows access to an Shift filter created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Shift filter created inside kst or through a script. """ def __init__(self,client,handle) : Shift.__init__(self,client) self.handle=handle # CUMULATIVE AVERAGE ################################################################# class CumulativeAverage(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions...""" def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ a vector containing the cumulative average """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", Avg(Y)")) return ExistingVector(self.client, YHandle) class NewCumulativeAverage(CumulativeAverage) : """ This class represents a filter you would create via "Create>Filter Plugin->Cumulative Average" from the menubar inside kst or by using "rmb->filter->[curvename], and then selecting "CumulativeAverage" in the plugin combo. NewCumulativeAverage() and ExistingCumulativeAverage() have the same methods.""" def __init__(self,client,yvector,name="") : CumulativeAverage.__init__(self,client) QtCore.QString(self.client.send("newPlugin(Cumulative Average)")) QtCore.QString(self.client.send("setInputVector(Vector In,"+yvector.handle+")")) self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingCumulativeAverage(CumulativeAverage) : """ This class allows access to Cumulative Average created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of a Cumulative Average created inside kst or through a script. """ def __init__(self,client,handle) : CumulativeAverage.__init__(self,client) self.handle=handle # IMAGE ################################################################# class Image(NamedObject) : """ This is a class which some convenience classes within pykst use. You should not use it directly. TODO: edit functions... """ def __init__(self,client) : NamedObject.__init__(self,client) class ColorImage(Image) : """ This class represents an image you would create via "Create>Image>Color Map" from the menubar inside kst. Not to be confused with Pictures, Images are representations of matrices and are placed within plots. The parameters of this function mirror the parameters within "Create>Image>Color Map". To place in an existing plot, specify placeinexistingplot = plot. To prevent a the curve from being placed in any plot, set donotplaceinanyplot=True. The default is to place the curve in a new plot. Not specifying a parameter implies it's default value (i.e., the setting used on the previous curve whether through a script or by the GUI).""" def __init__(self,client,matrix,palette,rtAutoThreshold,lower,upper,maxmin,smart,percentile,donotplaceinanyplot=False,placeinexistingplot=0,placeinnewplot=True,placeinnewtab=False,scalefonts=True,autolayout=True,customgridcolumns=False,protectexistinglayout=False,name="") : Image.__init__(self,client) if placeinexistingplot != 0: donotplaceinanyplot=False placeinnewplot=False placeinnewtab=False existingplothandle = placeinexistingplot.handle else: existingplothandle = " " if donotplaceinanyplot == True: placeinnewplot=False placeinnewtab=False existingplothandle = " " self.handle=QtCore.QString(self.client.send("#newImageFromColor("+b2str(matrix.handle)+","+b2str(palette)+","+b2str(rtAutoThreshold)+","+b2str(lower)+","+b2str(upper)+","+b2str(maxmin)+","+b2str(smart)+","+b2str(percentile)+","+b2str(donotplaceinanyplot)+","+b2str(existingplothandle)+","+b2str(placeinnewplot)+","+b2str(placeinnewtab)+","+b2str(scalefonts)+","+b2str(autolayout)+","+b2str(customgridcolumns)+","+b2str(protectexistinglayout)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ContourImage(Image) : """ This class represents an image you would create via "Create>Image>Contour Map" from the menubar inside kst. Not to be confused with Pictures, Images are representations of matrices and are placed within plots. The parameters of this function mirror the parameters within "Create>Image>Contour Map". To place in an existing plot, specify placeinexistingplot = plot. To prevent a the curve from being placed in any plot, set donotplaceinanyplot=True. The default is to place the curve in a new plot. Not specifying a parameter implies it's default value (i.e., the setting used on the previous curve whether through a script or by the GUI).""" def __init__(self,client,matrix,levels,color="black",weight="12",variable=False,donotplaceinanyplot=False,placeinexistingplot=0,placeinnewplot=True,placeinnewtab=False,scalefonts=True,autolayout=True,customgridcolumns=False,protectexistinglayout=False,name="") : Image.__init__(self,client) if placeinexistingplot != 0: donotplaceinanyplot=False placeinnewplot=False placeinnewtab=False existingplothandle = placeinexistingplot.handle else: existingplothandle = " " if donotplaceinanyplot == True: placeinnewplot=False placeinnewtab=False existingplothandle = " " self.handle=QtCore.QString(self.client.send("#newImageFromContourMap("+b2str(matrix.handle)+","+b2str(levels)+","+b2str(color)+","+b2str(weight)+","+b2str(variable)+","+b2str(donotplaceinanyplot)+","+b2str(existingplothandle)+","+b2str(placeinnewplot)+","+b2str(placeinnewtab)+","+b2str(scalefonts)+","+b2str(autolayout)+","+b2str(customgridcolumns)+","+b2str(protectexistinglayout)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ColorContourImage(Image) : """ This class represents an image you would create via "Create>Image>Color Map and Contour Map" from the menubar inside kst. Not to be confused with Pictures, Images are representations of matrices and are placed within plots. The parameters of this function mirror the parameters within "Create>Image>Color Map and Contour Map". To place in an existing plot, specify placeinexistingplot = plot. To prevent a the curve from being placed in any plot, set donotplaceinanyplot=True. The default is to place the curve in a new plot. Not specifying a parameter implies it's default value (i.e., the setting used on the previous curve whether through a script or by the GUI).""" def __init__(self,client,matrix,palette,rtAutoThreshold,lower,upper,maxmin,smart,percentile,levels,color="black",weight="12",variable=False,donotplaceinanyplot=False,placeinexistingplot=0,placeinnewplot=True,placeinnewtab=False,scalefonts=True,autolayout=True,customgridcolumns=False,protectexistinglayout=False,name="") : Image.__init__(self,client) if placeinexistingplot != 0: donotplaceinanyplot=False placeinnewplot=False placeinnewtab=False existingplothandle = placeinexistingplot.handle else: existingplothandle = " " if donotplaceinanyplot == True: placeinnewplot=False placeinnewtab=False existingplothandle = " " self.handle=QtCore.QString(self.client.send("#newImageFromColor("+b2str(matrix)+","+b2str(palette)+","+b2str(rtAutoThreshold)+","+b2str(lower)+","+b2str(upper)+","+b2str(maxmin)+","+b2str(smart)+","+b2str(percentile)+","+b2str(levels)+","+b2str(color)+","+b2str(weight)+","+b2str(variable)+","+b2str(donotplaceinanyplot)+","+b2str(existingplothandle)+","+b2str(placeinnewplot)+","+b2str(placeinnewtab)+","+b2str(scalefonts)+","+b2str(autolayout)+","+b2str(customgridcolumns)+","+b2str(protectexistinglayout)+","+b2str(name)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingImage(Image) : """ This class allows access to an image created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of an image created inside kst or through a script. """ def __init__(self,client,handle) : Image.__init__(self,client,handle) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getImageList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingImage(client,y)) return ret class Spectrum(NamedObject): """ This is the base class for Kst Spectra. To create a new spectrum, use pykst.NewSpectrum() or to access an existing equation use pykst.ExistingSpectrum() For example, to plot the spectrum of a pykst.DataVector() "dataVectorGY1": :: GYSpectrum=kst.NewSpectrum(client, dataVectorGY1, length = 12, vectorUnits="^o/s", rateUnits="Hz", rate=100.16) GYSpecCurve = kst.NewCurve(client,GYSpectrum.X(), GYSpectrum.Y(), curvecolor="green", curveweight=1, placeinnewplot=True) """ def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ Returns the Y vector of a spectrum """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", S)")) return ExistingVector(self.client, YHandle) def X(self) : """ Returns the X vector of a spectrum (ie, the frequency) """ XHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", F)")) return ExistingVector(self.client, XHandle) class NewSpectrum(Spectrum) : """ This class represents an spectrum you would create via "Create>Spectrum" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Spectrum". ToDo: examples """ def __init__(self,client,vector,removeMean=True,apodize=True,function="",sigma=1.0,interleaved=True,length=10,interpolate=True,rate=1.0,vectorUnits="",rateUnits="",outputType="",name="") : Spectrum.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newSpectrum("+b2str(vector.handle)+","+b2str(removeMean)+","+b2str(apodize)+","+b2str(function)+","+b2str(sigma)+","+b2str(interleaved)+","+b2str(length)+","+b2str(interpolate)+","+b2str(rate)+","+b2str(vectorUnits)+","+b2str(rateUnits)+","+b2str(outputType)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingSpectrum(Spectrum) : """ This class allows access to an spectrum created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of an spectrum created inside kst or through a script. """ def __init__(self,client,handle) : Spectrum.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getPSDList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingSpectrum(client,y)) return ret class Histogram(NamedObject): """ This is the base class for Kst Histograms. To create a new histogram, use pykst.NewHistogram() or to access an existing histogram use pykst.ExistingHistogram() For example, to plot the histogram of a pykst.DataVector() "dataVectorGY1": :: GYHist=kst.NewHistogram(client, dataVectorGY1, rtAutoBin=True) GYHistCurve = kst.NewCurve(client,GYHist.X(), GYHist.Y(), curvecolor="black", curveweight=1, uselines=False, usebargraph=True, bargraphfill="green",placeinnewplot=True) """ def __init__(self,client) : NamedObject.__init__(self,client) def Y(self) : """ Returns the Y vector of a histogram """ YHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", H)")) return ExistingVector(self.client, YHandle) def X(self) : """ Returns the X vector of a histogram """ XHandle = QtCore.QString(self.client.send("DataObject::outputVectorHandle("+self.handle+", B)")) return ExistingVector(self.client, XHandle) class NewHistogram(Histogram) : """ This class represents an histogram you would create via "Create>Histogram" from the menubar inside kst. The parameters of this function mirror the parameters within "Create>Histogram".""" def __init__(self,client,vector,rtAutoBin=True,binsFrom=0,binsTo=1,nbins=40,yaxisNormNumInBin=True,yaxisNormFracInBin=False,yaxisNormPercentInBin=False,yaxisNormPeakAt1=False,name="") : Histogram.__init__(self,client) self.handle=QtCore.QString(self.client.send("#newHistogram("+b2str(vector.handle)+","+b2str(rtAutoBin)+","+b2str(binsFrom)+","+b2str(binsTo)+","+b2str(nbins)+","+b2str(yaxisNormNumInBin)+","+b2str(yaxisNormFracInBin)+","+b2str(yaxisNormPercentInBin)+","+b2str(yaxisNormPeakAt1)+")")) self.handle.remove(0,self.handle.indexOf("ing ")+4) class ExistingHistogram(Histogram) : """ This class allows access to an histogram created inside kst or through a script given a descriptive or short name. "handle" is a descriptive or short name of an histogram created inside kst or through a script. """ def __init__(self,client,handle) : Histogram.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getPSDList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingHistogram(client,y)) return ret class Spectrogram(NamedObject): """ TODO... """ def __init__(self,client) : NamedObject.__init__(self,client) class ViewItem: """ This is a class which some convenience classes within pykst use. You should not use it directly. NOTE: Kst considers ViewItems to be NamedObjects, but except for plots, no mechanism for naming view items exists or would be useful. As such, within scripting, ViewItems do not have names.""" def __init__(self,client): self.client=client def setHMargin(self,margin): """ This is equivalent to setting Apperance>Layout>Horizontal Margin within a view item dialog in kst. """ #self.client.send(b2str("#setHMargin("+self.handle.toAscii()+","+b2str(margin)+")")) self.client.send_si(self.handle, b2str("setLayoutHorizontalMargin("+b2str(margin)+")")) def setVMargin(self,margin): """ This is equivalent to setting Apperance>Layout>Vertical Margin within a view item dialog in kst. """ #self.client.send(b2str("#setVMargin("+self.handle.toAscii()+","+b2str(margin)+")")) self.client.send_si(self.handle, b2str("setLayoutVerticalMargin("+b2str(margin)+")")) def setHSpace(self,space): """ This is equivalent to setting Apperance>Layout>Horizontal Spacing within a view item dialog in kst. """ #self.client.send(b2str("#setHSpace("+self.handle.toAscii()+","+b2str(space)+")")) self.client.send_si(self.handle, b2str("setLayoutHorizontalSpacing("+b2str(space)+")")) def setVSpace(self,space): """ This is equivalent to setting Apperance>Layout>Vertical Spacing within a view item dialog in kst. """ #self.client.send(b2str("#setVSpace("+self.handle.toAscii()+","+b2str(space)+")")) self.client.send_si(self.handle, b2str("setLayoutVerticalSpacing("+b2str(space)+")")) def setFillColor(self,color): """ This is equivalent to setting Apperance>Fill>Color within a view item dialog in kst. Not all view items support fill color. Colors are given by a name such as 'red' or a hex number such as '#FF0000'. """ self.client.send_si(self.handle, b2str("setFillColor("+b2str(color)+")")) def setFillStyle(self,style): """ This is equivalent to setting the index of Apperance>Fill>Style within a view item dialog in kst. Not all view items support fill styles. 0 is NoBrush, 1 is SolidPattern, 2 is Dense1Pattern, 3 is Dense2Pattern, 4 is Dense3Pattern, 5 is Dense4Pattern, 6 is Dense5Pattern, 7 is Dense6Pattern, 8 is Dense7Pattern 9 is HorPattern, 11 is VerPattern, 12 is CrossPattern, 13 is BDiagPattern and 14 is FDiagPattern.""" self.client.send_si(self.handle, b2str("setIndexOfFillStyle("+b2str(style)+")")) def setStrokeStyle(self,style): """ This is equivalent to setting the index of Apperance>Stroke>Style within a view item dialog in kst. Not all view items support stroke styles. 0 is SolidLine, 1 is DashLine, 2 is DotLine, 3 is DashDotLine, 4 is DashDotDotLine, and 5 is CustomDashLine""" self.client.send_si(self.handle, b2str("setIndexOfStrokeStyle("+b2str(style)+")")) def setStrokeWidth(self,width): """ This is equivalent to setting Apperance>Stroke>Width within a view item dialog in kst. Not all view items support stroke width.""" self.client.send_si(self.handle, b2str("setStrokeWidth("+b2str(width)+")")) def setStrokeBrushColor(self,color): """ This is equivalent to setting Apperance>Stroke>Brush Color within a view item dialog in kst. Not all view items support fill color. Colors are given by a name such as 'red' or a hex number such as '#FF0000'. """ self.client.send_si(self.handle, b2str("setStrokeBrushColor("+b2str(color)+")")) def setStrokeBrushStyle(self,style): """ This is equivalent to setting the index of Apperance>Stroke>Brush Style within a view item dialog in kst. Not all view items support stroke brush styles. 0 is NoBrush, 1 is SolidPattern, 2 is Dense1Pattern, 3 is Dense2Pattern, 4 is Dense3Pattern, 5 is Dense4Pattern, 6 is Dense5Pattern, 7 is Dense6Pattern, 8 is Dense7Pattern 9 is HorPattern, 11 is VerPattern, 12 is CrossPattern, 13 is BDiagPattern and 14 is FDiagPattern.""" self.client.send_si(self.handle, b2str("setIndexOfStrokeBrushStyle("+b2str(style)+")")) def setStrokeJoinStyle(self,style): """ This is equivalent to setting the index of Apperance>Stroke>Join Style within a view item dialog in kst. Not all view items support stroke join styles. 0 is MiterJoin, 1 is BevelJoin, 2 is RoundJoin, and 3 is SvgMiterJoin.""" self.client.send_si(self.handle, b2str("setIndexOfStrokeJoinStyle("+b2str(style)+")")) def setStrokeCapStyle(self,style): """ This is equivalent to setting the index of Apperance>Stroke>Cap Style within a view item dialog in kst. Not all view items support stroke cap styles. 0 is FlatCap, 1 is SquareCap, and 2 is RoundCap""" self.client.send_si(self.handle, b2str("setIndexOfStrokeCapStyle("+b2str(style)+")")) def setFixedAspectRatio(self, fixed=True): """ This is equivalent to checking Dimensions>Fix aspect ratio within a view item dialog in kst. The behaviour of this is undefined in view items which always have fixed aspect ratios (e.g., circles)""" if fixed == True: self.client.send_si(self.handle, b2str("checkFixAspectRatio()")) else: self.client.send_si(self.handle, b2str("uncheckFixAspectRatio()")) def setPosX(self,pos): """ This is equivalent to setting Dimensions>Position within a view item dialog in kst. Positions refer to the center of an object and x-values range from 0.0 (left) to 1.0 (right)""" self.client.send_si(self.handle, b2str("setPosX("+b2str(pos)+")")) def setPosY(self,pos): """ This is equivalent to setting Dimensions>Position within a view item dialog in kst. Positions refer to the center of an object and y-values range from 0.0(top) to 1.0(bottom)""" self.client.send_si(self.handle, b2str("setPosY("+b2str(pos)+")")) def setSizeX(self,size): """ This is equivalent to setting Dimensions>Size within a view item dialog. In cases where the aspect ratio is fixed, this changes both sizes (x and y)""" #self.client.send(b2str("#setSizeX("+self.handle+","+b2str(size)+")")) self.client.send_si(self.handle, b2str("setGeoX("+b2str(size)+")")) def setSizeY(self,size): """ This is equivalent to setting Dimensions>Size within a view item dialog. In cases where the aspect ratio is fixed, this behaviour of this function is undefined.""" #self.client.send(b2str("#setSizeY("+self.handle+","+b2str(size)+")")) self.client.send_si(self.handle, b2str("setGeoY("+b2str(size)+")")) def setRotation(self,rot): """ This is equivalent to setting Dimensions>Rotation within a view item dialog.""" #self.client.send(b2str("#setRot("+self.handle+","+b2str(rot)+")")) self.client.send_si(self.handle, b2str("setRotation("+b2str(rot)+")")) def remove(self): """ This removes the object from Kst. You should be careful when using this, because any handles you have to this object will still exist and be invalid. Additionally, in Kst, ViewItems are not actually deleted, only hidden, causing even more problems. """ self.client.send("eliminate("+self.handle.toAscii()+")") class ExistingViewItem(ViewItem) : def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle # LABELS ###################################################################### class Label(ViewItem) : """ This class represents a label you would create via "Create>Annotations>Label" from the menubar inside kst. The parameters of this function mirror the parameters within the label edit dialog which can be acessed by right clicking on a label and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'". See the kstOwl example.""" def __init__(self,client,text,fontSize=12,bold=False,italic=False,fontColor="black",fontFamily="Serif",posX=0.1,posY=0.1,rot=0): ViewItem.__init__(self,client) self.client.send("newLabel()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setText(text) self.setLabelFontSize(fontSize) self.setPosX(posX) self.setPosY(posY) self.setFixedAspectRatio(True) self.setRotation(rot) self.setFontColor(fontColor) self.setFontFamily(fontFamily) self.setFontBold(bold) self.setFontItalic(italic) def setText(self,text): """ Set text. It may be faster to insert strings within labels (e.g.,"[String (X1)]") and simply modify strings. """ self.client.send_si(self.handle, b2str("setLabel("+b2str(text)+")")) def setLabelFontSize(self,size): """ This does not actually represent point size but is relative to the size of the window. """ self.client.send_si(self.handle, b2str("setFontSize("+b2str(size)+")")) def setFontBold(self, bold = True): """ . . . """ if bold == True: self.client.send_si(self.handle, b2str("checkLabelBold()")) else: self.client.send_si(self.handle, b2str("uncheckLabelBold()")) def setFontItalic(self, italic = True): """ . . . """ if italic == True: self.client.send_si(self.handle, b2str("checkLabelItalic()")) else: self.client.send_si(self.handle, b2str("uncheckLabelItalic()")) def setFontColor(self,color): """ Colors are given by a name such as 'red' or a hex number such as '#FF0000' """ self.client.send_si(self.handle, b2str("setLabelColor("+b2str(color)+")")) def setFontFamily(self,family): """ . . . """ self.client.send_si(self.handle, b2str("setFontFamily("+b2str(family)+")")) class ExistingLabel(Label): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getLabelList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingLabel(client,y)) return ret class Box(ViewItem) : """ This class represents a box you would create via "Create>Annotations>Box" from the menubar inside kst. The parameters of this function mirror the parameters within the box edit dialog which can be acessed by right clicking on a box and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'". See the kstOwl example.""" def __init__(self,client,fixAspect=False,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0,fillColor="white",fillStyle=1,strokeStyle=1,strokeWidth=1,strokeBrushColor="black",strokeBrushStyle=1,strokeJoinStyle=1,strokeCapStyle=1) : ViewItem.__init__(self,client) self.client.send("newBox()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(sizeX) self.setSizeY(sizeY) if fixAspect==True: self.setFixedAspectRatio(True) else: self.setFixedAspectRatio(False) self.setRotation(rot) self.setStrokeBrushColor(strokeBrushColor) self.setFillColor(fillColor) self.setFillStyle(fillStyle) self.setStrokeStyle(strokeStyle) self.setStrokeWidth(strokeWidth) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeBrushStyle(strokeBrushStyle) self.setStrokeJoinStyle(strokeJoinStyle) self.setStrokeCapStyle(strokeCapStyle) @classmethod def getList(cls,client): x=QtCore.QString(client.send("getBoxList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Circle(ViewItem) : """ This class represents a circle you would create via "Create>Annotations>Circle" from the menubar inside kst. The parameters of this function mirror the parameters within the circle edit dialog which can be acessed by right clicking on a circle and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'". See the bonjourMonde example""" def __init__(self,client,posX=0.1,posY=0.1,size=0.1,fillColor="white",fillStyle=1,strokeStyle=1,strokeWidth=1,strokeBrushColor="grey",strokeBrushStyle=1,strokeJoinStyle=1,strokeCapStyle=1) : ViewItem.__init__(self,client) self.client.send("newCircle()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(size) self.setStrokeBrushColor(strokeBrushColor) self.setFillColor(fillColor) self.setFillStyle(fillStyle) self.setStrokeStyle(strokeStyle) self.setStrokeWidth(strokeWidth) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeBrushStyle(strokeBrushStyle) self.setStrokeJoinStyle(strokeJoinStyle) self.setStrokeCapStyle(strokeCapStyle) @classmethod def getList(cls,client): x=QtCore.QString(client.send("getCircleList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Ellipse(ViewItem) : """ This class represents an ellipse you would create via "Create>Annotations>Ellipse" from the menubar inside kst. The parameters of this function mirror the parameters within the ellipse edit dialog which can be acessed by right clicking on an ellipse and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'".""" def __init__(self,client,fixAspect=False,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0,fillColor="white",fillStyle=1,strokeStyle=1,strokeWidth=1,strokeBrushColor="black",strokeBrushStyle=1,strokeJoinStyle=1,strokeCapStyle=1) : ViewItem.__init__(self,client) self.client.send("newEllipse()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(sizeX) self.setSizeY(sizeY) if fixAspect==True: self.setFixedAspectRatio(True) else: self.setFixedAspectRatio(False) self.setRotation(rot) self.setStrokeBrushColor(strokeBrushColor) self.setFillColor(fillColor) self.setFillStyle(fillStyle) self.setStrokeStyle(strokeStyle) self.setStrokeWidth(strokeWidth) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeBrushStyle(strokeBrushStyle) self.setStrokeJoinStyle(strokeJoinStyle) self.setStrokeCapStyle(strokeCapStyle) @classmethod def getList(cls,client): x=QtCore.QString(client.send("getEllipseList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Line(ViewItem) : """ This class represents a line you would create via "Create>Annotations>Line" from the menubar inside kst. Colors are given by a name such as 'red' or a hex number such as '#FF0000'".""" def __init__(self,client,posX=0.1,posY=0.1,length=0.1,rot=0,strokeStyle=1,strokeWidth=1,strokeBrushColor="black",strokeBrushStyle=1,strokeJoinStyle=1,strokeCapStyle=1) : ViewItem.__init__(self,client) self.client.send("newLine()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(length) self.setRotation(rot) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeStyle(strokeStyle) self.setStrokeWidth(strokeWidth) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeBrushStyle(strokeBrushStyle) self.setStrokeJoinStyle(strokeJoinStyle) self.setStrokeCapStyle(strokeCapStyle) @classmethod def getList(cls,client): x=QtCore.QString(client.send("getCircleList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Arrow(ViewItem) : """ This class represents an arrow you would create via "Create>Annotations>Arrow" from the menubar inside kst. The parameters of this function mirror the parameters within the arrow edit dialog which can be acessed by right clicking on a arrow and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'".""" def __init__(self,client,posX=0.1,posY=0.1,length=0.1, rot=0,arrowAtStart = False, arrowAtEnd = True, arrowSize = 12.0, strokeStyle=1,strokeWidth=1,strokeBrushColor="black",strokeBrushStyle=1,strokeJoinStyle=1,strokeCapStyle=1) : ViewItem.__init__(self,client) self.client.send("newArrow()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(length) self.setRotation(rot) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeStyle(strokeStyle) self.setStrokeWidth(strokeWidth) self.setStrokeBrushColor(strokeBrushColor) self.setStrokeBrushStyle(strokeBrushStyle) self.setStrokeJoinStyle(strokeJoinStyle) self.setStrokeCapStyle(strokeCapStyle) self.setArrowAtStart(arrowAtStart) self.setArrowAtEnd(arrowAtEnd) self.setArrowSize(arrowSize) def setArrowAtStart(self, arrow=True) : """ Set whether an arrow head is shown at the start of the line """ if arrow==True: self.client.send_si(self.handle, b2str("arrowAtStart(true)")) else: self.client.send_si(self.handle, b2str("arrowAtStart(false)")) def setArrowAtEnd(self, arrow=True) : """ Set whether an arrow head is shown at the end of the line """ if arrow==True: self.client.send_si(self.handle, b2str("arrowAtEnd(true)")) else: self.client.send_si(self.handle, b2str("arrowAtEnd(false)")) def setArrowSize(self, arrowSize) : self.client.send_si(self.handle, b2str("arrowHeadScale("+b2str(arrowSize)+")")) @classmethod def getList(cls,client): x=QtCore.QString(client.send("getArrowList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingViewItem(client,y)) return ret class Picture(ViewItem) : """ This class represents a picture you would create via "Create>Annotations>Picture" from the menubar inside kst. The parameters of this function mirror the parameters within the picture edit dialog which can be acessed by right clicking on a picture and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'". See the kstOwl example.""" def __init__(self,client,filename,posX=0.1,posY=0.1,size=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newPicture("+b2str(filename)+")") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setFixedAspectRatio(True) self.setSizeX(size) #fixme: aspect ratio is wrong. #self.setSizeY(size) self.setRotation(rot) def setPicture(self,pic): """ BUG: aspect ratio is not changed. There is no parellel for this function within the kst GUI. """ self.client.send_si(self.handle, b2str("setPicture("+b2str(pic)+")")) class ExistingPicture(Picture): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getPictureList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingPicture(client,y)) return ret class SVG(ViewItem) : """ This class represents a SVG you would create via "Create>Annotations>SVG" from the menubar inside kst. The parameters of this function mirror the parameters within the SVG edit dialog which can be acessed by right clicking on a SVG and selecting Edit. Colors are given by a name such as 'red' or a hex number such as '#FF0000'".""" def __init__(self,client,filename,posX=0.1,posY=0.1,size=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newSvgItem("+b2str(filename)+")") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) self.setPosX(posX) self.setPosY(posY) self.setSizeX(size) self.setSizeY(size) self.setFixedAspectRatio(True) self.setRotation(rot) class ExistingSVG(SVG): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getSVGList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingSVG(client,y)) return ret class Plot(ViewItem) : """ This class represents a Plot you would create via "Create>Annotations>Plot" from the menubar inside kst. TODO: a lot. The parameters of this function mirror a few of the parameters within the plot edit dialog which can be acessed by right clicking on a plot and selecting Edit. To add curves and images to plots, use functions inside this class which don't exist yet or use the Curve/Equation/Image conb2structors. See the ksNspire example. """ def __init__(self,client,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0,name="") : ViewItem.__init__(self,client) self.client.send("newPlot()") self.client.send("setPosX("+b2str(posX)+")") self.client.send("setPosY("+b2str(posY)+")") self.client.send("setGeoX("+b2str(sizeX)+")") self.client.send("setGeoY("+b2str(sizeY)+")") self.client.send("setRotation("+b2str(rot)+")") if name!="": self.client.send("uncheckAuto()") self.client.send("setName("+b2str(name)+")") else: self.client.send("checkAuto()") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) def setXRange(self,x0 = 0.0, x1 = 10.0) : """ Set X zoom range from x0 to x1 """ self.client.send_si(self.handle, b2str("setXRange("+b2str(x0)+","+b2str(x1)+")")) def setYRange(self, y0 = 0.0, y1 = 10.0) : """ Set Y zoom range from y0 to y1 """ self.client.send_si(self.handle, b2str("setYRange("+b2str(y0)+","+b2str(y1)+")")) def setXAuto(self) : """ Set X zoom range to autoscale """ self.client.send_si(self.handle,b2str("setXAuto()")) def setYAuto(self) : """ Set Y zoom range to autoscale """ self.client.send_si(self.handle, b2str("setPlotYAuto()")) def setXAutoBorder(self) : """ Set X zoom range to autoscale with a small border """ self.client.send_si(self.handle, b2str("setPlotXAutoBorder()")) def setYAutoBorder(self) : """ Set Y zoom range to autoscale with a small border """ self.client.send_si(self.handle,b2str("setYAutoBorder()")) def setXNoSpike(self) : """ Set X zoom range to spike insensitive autoscale """ self.client.send_si(self.handle,b2str("setXNoSpike()")) def setYNoSpike(self) : """ Set Y zoom range to spike insensitive autoscale """ self.client.send_si(self.handle,b2str("setYNoSpike()")) def setXAC(self, r=0.2) : """ Set X zoom range to fixed range, centered around the mean. Similar to AC coupling on an oscilloscope. """ self.client.send_si(self.handle,b2str("setXAC("+b2str(r)+")")) def setYAC(self, r=0.2) : """ Set Y zoom range to fixed range, centered around the mean. Similar to AC coupling on an oscilloscope. """ self.client.send_si(self.handle,b2str("setYAC("+b2str(r)+")")) def setGlobalFont(self, family="", bold=False, italic=False) : """ Set the global plot font. By default, the axis labels all use this, unless they have been set to use their own. If the parameter 'family' is empty, the font family will be unchanged. The font will be bold if parameter 'bold' is set to 'bold' or 'true'. The font will be italic if parameter 'italic' is set to 'italic' or 'true'.""" self.client.send_si(self.handle,b2str("setGlobalFont("+family+","+b2str(bold)+","+b2str(italic)+")")) def setTopLabel(self, label="") : """ Set the plot top label """ self.client.send_si(self.handle,b2str("setTopLabel("+label+")")) def setBottomLabel(self, label="") : """ Set the plot bottom label """ self.client.send_si(self.handle,b2str("setBottomLabel("+label+")")) def setLeftLabel(self, label="") : """ Set the plot left label """ self.client.send_si(self.handle,b2str("setLeftLabel("+label+")")) def setRightLabel(self, label="") : """ Set the plot right label """ self.client.send_si(self.handle,b2str("setRightLabel("+label+")")) def setTopLabelAuto(self) : """ Set the top label to auto generated. """ self.client.send_si(self.handle,b2str("setTopLabelAuto()")) def setBottomLabelAuto(self) : """ Set the bottom label to auto generated. """ self.client.send_si(self.handle,b2str("setBottomLabelAuto()")) def setLeftLabelAuto(self) : """ Set the left label to auto generated. """ self.client.send_si(self.handle,b2str("setLeftLabelAuto()")) def setRightLabelAuto(self) : """ Set the right label to auto generated. """ self.client.send_si(self.handle,b2str("setRightLabelAuto()")) def normalizeXtoY(self) : """ Adjust the X zoom range so X and Y have the same scale per unit (square pixels) """ self.client.send_si(self.handle, b2str("normalizeXtoY()")) def setLogX(self) : """ Set X axis to log mode. """ self.client.send_si(self.handle, b2str("setLogX()")) def setLogY(self) : """ Set X axis to log mode. """ self.client.send_si(self.handle, b2str("setLogY()")) def setYAxisReversed(self, reversed=True) : """ set the Y axis to decreasing from bottom to top. """ if reversed == True: self.client.send_si(self.handle, b2str("setYAxisReversed()")) else: self.client.send_si(self.handle, b2str("setYAxisNotReversed()")) def setXAxisReversed(self, reversed=True) : """ set the X axis to decreasing from left to right. """ if reversed == True: self.client.send_si(self.handle, b2str("setXAxisReversed()")) else: self.client.send_si(self.handle, b2str("setXAxisNotReversed()")) class ExistingPlot(Plot): def __init__(self,client,handle): ViewItem.__init__(self,client) self.handle=handle @classmethod def getList(cls,client): x=QtCore.QString(client.send("getPlotList()")) ret=[] while x.contains('['): y=QtCore.QString(x) y.remove(0,1) y.remove(y.indexOf(']'),9999999) x.remove(0,x.indexOf(']')+1) ret.append(ExistingPlot(client,y)) return ret class Button(ViewItem) : """ This represents a button inside a View. When the button is pressed, it sends a message via a socket. socket is a QtNetwork.QLocalSocket that is not connected to anything. The message "clicked" will be sent when the button is pressed. See the bonjourMonde example. """ def __init__(self,client,text,socket,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newButton()") self.client.send("setPosX("+b2str(posX)+")") self.client.send("setPosY("+b2str(posY)+")") self.client.send("setGeoX("+b2str(sizeX)+")") self.client.send("setGeoY("+b2str(sizeY)+")") self.client.send("setText("+b2str(text)+")") self.client.send("setRotation("+b2str(rot)+")") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) socket.connectToServer(client.serverName) socket.waitForConnected(300) socket.write(b2str("attachTo("+self.handle+")")) def setText(self,text): """ Sets the text of the button. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setText("+b2str(text)+")") self.client.send("endEdit()") class LineEdit(ViewItem) : """ This represents a line edit inside a View. When the lineedit's value is changed, it sends a message via a socket. socket is a QtNetwork.QLocalSocket that is not connected to anything. The message "valueSet:VAL" where VAL is some text will be sent when the text is changed. See the ksNspire example. """ def __init__(self,client,text,socket,posX=0.1,posY=0.1,sizeX=0.1,sizeY=0.1,rot=0) : ViewItem.__init__(self,client) self.client.send("newLineEdit()") self.client.send("setPosX("+b2str(posX)+")") self.client.send("setPosY("+b2str(posY)+")") self.client.send("setGeoX("+b2str(sizeX)+")") self.client.send("setGeoY("+b2str(sizeY)+")") self.client.send("setText("+b2str(text)+")") self.client.send("setRotation("+b2str(rot)+")") self.handle=QtCore.QString(self.client.send("endEdit()")) self.handle.remove(0,self.handle.indexOf("ing ")+4) socket.connectToServer(b2str(client.serverName)) socket.waitForConnected(300) socket.write(b2str("attachTo("+self.handle+")")) def setText(self,text): """ Sets the text of the line edit. """ self.client.send("beginEdit("+self.handle+")") self.client.send("setText("+b2str(text)+")") self.client.send("endEdit()") Kst-2.0.8/CMakeLists.txt0000644000175000017500000004161212362707010014120 0ustar synthsynthcmake_minimum_required(VERSION 2.8) if(kst_clang) set(CMAKE_C_COMPILER "clang" CACHE PATH "Clang C compiler") set(CMAKE_CXX_COMPILER "clang++" CACHE PATH "Clang C++ compiler") endif() # figure out if we use MinGW with Ninja: call with -DCC=gcc if(WIN32 AND CMAKE_GENERATOR MATCHES Ninja AND CC MATCHES gcc) find_file(mingw_make mingw32-make.exe) get_filename_component(mingw_bin_dir ${mingw_make} PATH) set(CMAKE_RC_COMPILER ${mingw_bin_dir}/windres.exe) endif() set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") include(KstMacros) get_filename_component(kst_dir ${CMAKE_SOURCE_DIR} ABSOLUTE) get_filename_component(kst_build_dir ${CMAKE_BINARY_DIR}/build ABSOLUTE) set(kst_binary_name kst2) kst_option_init() kst_option(string "" all version_string "Version string") kst_option(bool OFF all release "Build release version: optimize for speed, don't embedded debug symbols") kst_option(bool OFF gcc deploy "Deploy into install dir") kst_option(bool OFF all merge_files "Merge files to speedup build about factor 5") kst_option(bool OFF all merge_rebuild "Rebuild generated files from merged files build") kst_option(bool OFF all verbose "Make verbose CMake run and Makefiles") kst_option(string "" all install_prefix "Install path for Kst, using a default if not set") kst_option(string "" all install_libdir "Install directory name for libraries") kst_option(bool ON all 3rdparty "Build plugins depending on 3rd party libraries") kst_option(bool ON all dataobjects "Build dataobject plugins") kst_option(bool OFF all test "Build unit tests") kst_option(bool ON all pch "Use precompiled headers") kst_option(bool ON all svnversion "Use svnversion's output for Kst's version information") kst_option(bool OFF gcc rpath "Use rpath") kst_option(bool OFF all 3rdparty_build "Download and build 3rd party libraries") kst_option(bool OFF win 3rdparty_download "Download precompiled 3rd party libraries") kst_option(bool OFF win console "Open console on Windows") kst_option(bool OFF win edit_cont "Enable \"Edit and Continue\" for Visual Studio") kst_option(bool OFF all python "Install Python support") kst_option(bool OFF all python_build "Download and build NumPy/SciPy then install Python support") kst_option(string "" all python_prefix "Path for installing python bindings") kst_option(string OFF all cross "Cross-compile on Linux for Windows") kst_option(string "" all qt4 "Use cross compiled Qt4 at given path") kst_option(string "" all qt5 "Use Qt5") kst_option(bool ON all qt5base_only "Only use Qt5 features available in qtbase") kst_option(bool OFF all clang "Use Clang compiler") kst_option(bool OFF all sanitize "Use Clang's sanitizers") kst_option(bool OFF all dbgsym "Build with debug symbols enabled") kst_option(bool OFF win noinstaller "Don't build installer") message(STATUS) if(kst_cross) include(KstCrossCompile) endif() project(Kst) if(kst_release) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) else() set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE) endif() if(kst_sanitize) include(Clang-sanitize) set(clang_flags "${clang_flags}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${clang_flags}") endif() set(kst_version_major 2) if(kst_version_string) set(kst_version ${kst_version_string}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "${kst_version}") else() set(kst_version_minor 0) set(kst_version_patch 8) set(kst_version ${kst_version_major}.${kst_version_minor}.${kst_version_patch}) set(kst_version_string ${kst_version}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "Kst ${kst_version}") endif() if(MINGW) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) message(STATUS "Using GCC version ${GCC_VERSION}") endif() if(MINGW) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) message(STATUS "Using GCC version ${GCC_VERSION}") endif() if(kst_3rdparty_build) set(kst_3rdparty_dir ${CMAKE_BINARY_DIR}/3rdparty/installed) add_subdirectory(cmake/3rdparty) elseif(kst_3rdparty_download) if(MINGW) if(GCC_VERSION VERSION_EQUAL 4.7.2 OR GCC_VERSION VERSION_GREATER 4.7.2) set(ver -dw2-4.7.2) set(md5 53edc4009d5c3ee5e11d1ba24cd8ae61) elseif(GCC_VERSION VERSION_EQUAL 4.7 OR GCC_VERSION VERSION_GREATER 4.7) set(ver 4.7) set(md5 de6e8dbab1bb17eee6057941fddc93e3) else(GCC_VERSION VERSION_EQUAL 4.6 OR GCC_VERSION VERSION_GREATER 4.6) set(ver 4.6) set(md5 70d8670af9c21eb8fb466654c95d8e4d) else(GCC_VERSION VERSION_GREATER 4.4) set(ver 4.4) set(md5 999248fb40a44543af4dd4cd1be0ceeb) else() message(FATA_ERROR "MinGW version ${GCC_VERSION} not supported") endif() endif() message(STATUS "Checking downloaded 3rd party binaries.") set(_deps kst-3rdparty-win32-gcc${ver}) set(_file ${_deps}.zip) set(_downloaded _downloaded-NOTFOUND CACHE PATH "3rd party binaries already downloaded" FORCE) find_file(_downloaded ${_file} ${CMAKE_BINARY_DIR}) if (NOT _downloaded) file(DOWNLOAD http://sourceforge.net/projects/kst/files/3rdparty/${_file} ${CMAKE_BINARY_DIR}/${_file} EXPECTED_MD5 ${md5} SHOW_PROGRESS) execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xfj ${CMAKE_BINARY_DIR}/${_file}) endif() set(kst_3rdparty_dir ${CMAKE_BINARY_DIR}/${_deps}) endif() kst_revision_project_name(Revision) add_definitions(-DKST_HAVE_REVISION_H) if(kst_revision) file(WRITE ${CMAKE_BINARY_DIR}/kstrevision.h.tmp "#define KST_REVISION \"${kst_revision}\"\n") configure_file(${CMAKE_BINARY_DIR}/kstrevision.h.tmp ${CMAKE_BINARY_DIR}/kstrevision.h COPYONLY) elseif(kst_svnversion) include(KstRevisionHeader) KstRevisionHeader(${kst_dir} ${kst_revision_project} ${CMAKE_BINARY_DIR}/kstrevision.h _modified) else() file(WRITE ${CMAKE_BINARY_DIR}/kstrevision.h.tmp "#define KST_REVISION \"unknown\"\n") configure_file(${CMAKE_BINARY_DIR}/kstrevision.h.tmp ${CMAKE_BINARY_DIR}/kstrevision.h COPYONLY) endif() # Find 3rd party libraries if(kst_3rdparty) message(STATUS "3rd party libs for plugins--------------------") find_package(Getdata) find_package(Gsl) find_package(Netcdf) find_package(Matio) find_package(CFITSIO) message(STATUS "----------------------------------------------") else() message(STATUS "Building plugins depending on 3rd party libraries suppressed") endif() message(STATUS) # Find 3rd party libraries if (kst_qt5) # http://doc-snapshot.qt-project.org/5.0/cmake-manual.html cmake_minimum_required(VERSION 2.8.9) macro(use_qt5lib qt5lib) find_package(${qt5lib} REQUIRED) include_directories(${${qt5lib}_INCLUDE_DIRS}) endmacro() use_qt5lib(Qt5Core) get_target_property(qmakebin Qt5::qmake IMPORTED_LOCATION) get_filename_component(QT_BINARY_DIR ${qmakebin} PATH) message(STATUS "Using Qt5 from ${QT_BINARY_DIR}") set(CMAKE_PREFIX_PATH ${QT_BINARY_DIR}/..) use_qt5lib(Qt5Concurrent) use_qt5lib(Qt5Widgets) use_qt5lib(Qt5Network) use_qt5lib(Qt5Xml) use_qt5lib(Qt5PrintSupport) add_definitions(-DQT5=1 -DQT_DISABLE_DEPRECATED_BEFORE) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DQT_NO_DEBUG") include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) # Qt5 bug? else() if(kst_cross) # Cross-compiled Qt, branch 4.8.4 from https://gitorious.org/~syntheticpp/qt/qt4 set(QT_MINGW_DIR ${kst_qt4} CACHE PATH "Qt for Mingw" FORCE) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLNAME} ${QT_MINGW_DIR} CACHE PATH "Mingw find root path" FORCE) endif() find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) if(MINGW) # seems there is a bug in FindQt4 macro(fix_it) foreach(_it ${ARGN}) if(QT_${_it}_LIBRARY_DEBUG AND QT_${_it}_LIBRARY_RELEASE) set(QT_${_it}_LIBRARY debug ${QT_${_it}_LIBRARY_DEBUG} optimized ${QT_${_it}_LIBRARY_RELEASE} CACHE STRING "Fixed ${_it}" FORCE) endif() endforeach() endmacro() fix_it(QTCORE QTGUI QTXML QTSVG QTNETWORK) endif() endif() #linguist tools if(WITH_QT5) find_package(Qt5LinguistTools) if(Qt5LinguistTools_FOUND) find_package(Qt5LinguistForKst) endif() else() find_package(LinguistForKst) endif() message(STATUS) # React on options if(kst_verbose) set(CMAKE_VERBOSE_MAKEFILE 1) else() set(CMAKE_VERBOSE_MAKEFILE 0) endif() if(kst_install_prefix) set(CMAKE_INSTALL_PREFIX ${kst_install_prefix} CACHE PATH "User's choice for install prefix" FORCE) set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) else() set(kst_install_prefix ${CMAKE_BINARY_DIR}/INSTALLED) set(CMAKE_INSTALL_PREFIX ${kst_install_prefix} CACHE PATH "Kst's default install prefix" FORCE) endif() if(NOT kst_install_libdir) set(kst_install_libdir lib) endif() if(NOT kst_install_plugins) set(kst_install_plugins ${kst_install_libdir}/${kst_binary_name}/plugins) endif() if(kst_rpath) # the RPATH to be used when installing set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${kst_install_libdir}") endif() #path to install the .desktop files set(kst_install_plugin_desktop_file_path share/services/kst) if(NOT kst_console) set(kst_win32 WIN32) if(kst_qt5 AND WIN32) set(kst_qtmain_library Qt5::WinMain) else() set(kst_qtmain_library ${QT_QTMAIN_LIBRARY}) endif() endif() if(APPLE AND NOT CMAKE_GENERATOR STREQUAL Xcode) set(kst_win32 MACOSX_BUNDLE) endif() if(APPLE OR kst_clang) set(kst_pch 0 CACHE BOOL "Disable pch on Mac, not supported yet" FORCE) endif() if(kst_merge_files) set(kst_pch 0 CACHE BOOL "Disable pch because we build merged" FORCE) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(x64 TRUE) endif() if(WIN32) add_definitions(-D_WIN32_WINNT=0x0501) # Windows XP # on 32 bit Windows we must explicitly enable >2GB support # maybe you have to ' 4-gigabyte tune' your Windows XP 32 bit system: # http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx macro(large_address var flag) set(${var} "${${var}} ${flag}") endmacro() macro(link_large_address flag) large_address(CMAKE_EXE_LINKER_FLAGS ${flag}) large_address(CMAKE_SHARED_LINKER_FLAGS ${flag}) large_address(CMAKE_MODULE_LINKER_FLAGS ${flag}) endmacro() if(MSVC) link_large_address(/LARGEADDRESSAWARE) elseif(NOT x64) link_large_address(-Wl,--large-address-aware) endif() endif() if(MSVC) add_definitions(-D_USE_MATH_DEFINES -DNOMINMAX) else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") if(kst_dbgsym) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") endif() endif() if(MSVC_IDE AND kst_edit_cont) # Enable in Visual Studio set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /ZI") if(kst_pch) # Studio bug: set(kst_pch 0 CACHE BOOL "Disable pch because of Edit&Continue" FORCE) endif() endif() if(MSVC) set(kst_debug_postfix d) endif() configure_file(${kst_dir}/cmake/config.h.cmake ${CMAKE_BINARY_DIR}/config.h) include_directories(${CMAKE_BINARY_DIR} ${QT_INCLUDES}) message(STATUS "Build summary----------------------------------") message(STATUS) message(STATUS "Version : ${kst_version}") message(STATUS "Path to source: ${kst_dir}") message(STATUS "Installation :") message(STATUS " ${kst_install_prefix}/bin") message(STATUS " ${kst_install_prefix}/${kst_install_libdir}") message(STATUS " ${kst_install_prefix}/${kst_install_plugins}") message(STATUS) message(STATUS "Used options:") kst_option_list_all() message(STATUS "-----------------------------------------------") message(STATUS) add_subdirectory(src) if(kst_test) enable_testing() add_subdirectory(tests) endif() if (NOT APPLE) add_subdirectory(misc) endif() if(kst_python) add_subdirectory(pyKst) endif() # CPack packaging # # http://cmake.org/cmake/help/cmake-2-8-docs.html#module:CPack if(WIN32) if(kst_noinstaller) set(CPACK_GENERATOR ZIP) set(CPACK_BINARY_ZIP 1) else() set(CPACK_GENERATOR NSIS) endif() endif() #adapted from [trojita.git] / CMakeLists.txt if(LinguistForKst_FOUND OR Qt5LinguistForKst_FOUND) file(GLOB_RECURSE kst_PO "${CMAKE_SOURCE_DIR}/po/kst_common_*.po") if(WITH_QT5) qt5_wrap_po(kst_QM ${kst_PO}) else() qt4_wrap_po(kst_QM ${kst_PO}) endif() set(language_summary "") foreach(po ${kst_PO}) string(REGEX REPLACE "^(.*)/kst_common_(.*).po" "\\2" lang ${po}) list(APPEND language_summary ${lang}) endforeach() list(SORT language_summary) list(LENGTH language_summary num_languages) if(num_languages) message(STATUS "Available languages: ${language_summary}") add_custom_target(qm DEPENDS ${kst_QM}) add_dependencies(${kst_binary_name} qm) install(DIRECTORY ${CMAKE_BINARY_DIR}/locale/ DESTINATION share/kst/locale FILES_MATCHING PATTERN *.qm) else() message(STATUS "No .po files found, will not install any languages") endif() else() message(STATUS "Qt Linguist (lupdate/lrelease/lconvert) not found, disabling localization support") endif() if(kst_install_prefix) if(WIN32) if(x64) set(CPACK_PACKAGE_FILE_NAME ${kst_install_prefix}-win64) else() set(CPACK_PACKAGE_FILE_NAME ${kst_install_prefix}-win32) endif() else() set(CPACK_PACKAGE_FILE_NAME kst-${kst_version_string}-binary) endif() set(CPACK_SOURCE_PACKAGE_FILE_NAME ${kst_install_prefix}) else() set(CPACK_SOURCE_PACKAGE_FILE_NAME Kst-${kst_version}) endif() set(CPACK_INSTALL_PREFIX "") set(CPACK_PACKAGE_NAME Kst) set(CPACK_PACKAGE_EXECUTABLES ${kst_binary_name} Kst2) set(CPACK_PACKAGE_VENDOR "The Kst Team") set(CPACK_PACKAGE_VERSION_MAJOR ${kst_version_major}) set(CPACK_PACKAGE_VERSION_MINOR ${kst_version_minor}) set(CPACK_PACKAGE_VERSION_PATCH ${kst_version_patch}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Kst 2") set(CPACK_PACKAGE_DESCRIPTION_FILE ${kst_dir}/README) set(CPACK_PACKAGE_CONTACT "http://bugs.kde.org}") set(CPACK_STRIP_FILES 1) # cmake bug, problems with the quotes in the gpl, fixed in 2.8.4 set(CPACK_RESOURCE_FILE_LICENSE "${kst_dir}/COPYING") # sources set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${kst_dir};/") # http://www.mail-archive.com/cmake@cmake.org/msg33720.html if(WIN32) set(CPACK_SOURCE_GENERATOR ZIP) else() set(CPACK_SOURCE_GENERATOR TGZ) endif() # rpm if(UNIX) set(CPACK_SET_DESTDIR "ON") endif() FILE(READ ${CPACK_RESOURCE_FILE_LICENSE} CPACK_RPM_PACKAGE_LICENSE) set(CPACK_RPM_PACKAGE_GROUP "Applications/Science") set(CPACK_RPM_PACKAGE_VENDOR ${CPACK_PACKAGE_VENDOR}) # deb # This is experimental # check also for plugin's 3rdparty libraries? set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqtgui4 (>= 4.4.3-0)") # Usage # # Source only .targz, .tar.bz2, .zip: # make package_source # # Binary .tar.gz and install .sh: # make package # # Binary .deb: # create : cpack -G DEB --config CPackConfig.cmake # list : dpkg-deb -c Kst-*.deb # install: dpkg -i Kst-*.deb # # Binary .rpm: # create : cpack -G RPM --config CPackConfig.cmake # list : rpm -qlp Kst-*.rpm # install: rpm -U Kst-*.rpm # CPack and Ubuntu # Found this: # http://www.purplekarrot.net/blog/dputCMake.html if(APPLE) # We start from build/bin/kst2.app, all is build into the final bundle folder # On the mac the pathes to needed shared libraries are hardcoded in the binary/library # which could be changed by the macro 'fixup_bundle' # libs which are hardcoded are resolved automatically # but the plugins must be passed as extra argument because they are not hardcoded in the binary set(bundle_dir ${kst_build_dir}/bin) set(contents_dir ${kst_binary_name}.app/Contents) set(app ${bundle_dir}/${kst_binary_name}.app) install(DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION ${bundle_dir}/${contents_dir}/plugins COMPONENT Runtime) install(CODE "file(GLOB qt_plugins \"${bundle_dir}/${contents_dir}/plugins/imageformats/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") file(GLOB kst_plugins \"${bundle_dir}/${contents_dir}/plugins/*${CMAKE_SHARED_MODULE_SUFFIX}\") set(libs \${qt_plugins} \${kst_plugins}) include(BundleUtilities) fixup_bundle(\"${app}\" \"\${libs}\" \"${dir}\") " COMPONENT RUNTIME) file(WRITE ${CMAKE_BINARY_DIR}/qt.conf "") install(FILES ${CMAKE_BINARY_DIR}/qt.conf DESTINATION ${contents_dir}/Resources COMPONENT Runtime) set(CPACK_GENERATOR DragNDrop) endif() include(CPack) Kst-2.0.8/INSTALL.qmake0000644000175000017500000001640312277111530013507 0ustar synthsynth Installation Notes for Kst 2.0.0 beta 3 ********************************************* Linux ********************************************* Preliminaries: 1. Download or otherwise install Qt 4.5 or greater. 2. Make sure your QTDIR is set to that Qt installation. 3. Optionally update your ./config.pri (you probably don't need to do this). Globally installed build/install: Follow Linux build steps 1-3 (Preliminaries) 4. ./install-kst [release|debug [INSTALL_PREFIX [INSTALL_LIBDIR]]] 5. kst2 Locally installed debug build: Follow Linux build steps 1-3 (Preliminaries) 4. ./build-kst 5. ./run-kst kst2 will be installed into ./build Create a package staged in /tmp/package/ for later installation in /usr: Follow Linux build steps 1-3 (Preliminaries) 4. ./install-kst release /tmp/package/usr Command line options for install-kst (all optional) INSTALL_PREFIX - Installation location - Defaults to '/usr' INSTALL_LIBDIR - Library Installation Directory name - Defaults to 'lib' release - optimized build (eg, -O2) for release (default) debug - debug build (eg, -g, no optimizations) Note: It is recommended that all installable builds be "release", since release mode does not set the RPATH directories. Setting RPATH can result in a security hole. The default for ./install-kst is release Note: build-kst and install-kst both build in ./build, so ./build should be [re-]moved before running ./install-kst if a debug build from ./build-kst already exists. Note: installation likely requires root privilidges. You can separate the build and install steps (only if you really want to) by, eg: ./build-kst release sudo ./install-kst release Examples: Build and run debug version. 1. Follow Linux build steps 1 - 3. 2. ./build-kst 3. ./run-kst Build and install to /usr/bin /usr/lib 1. Follow Linux build steps 1 - 3. 2. ./install-kst Build and install to specific location (/usr/local/bin /usr/local/libXX) 1. Follow Linux build steps 1 - 3. 2. ./install-kst release /usr/local libXX ********************************************* Mac OS ********************************************* Building without Xcode (out-of-source): qmake ../kst/kst.pro -spec macx-g++ -config release make Fixing the link pathes (installs kst frameworks to /Library/Frameworks) ../kst/misc/macdeploykst Starting Kst from command line: ./build/bin/kst2.app/Contents/MacOS/kst2 Creating a dmg in /build/bin: ../kst/misc/macdeploykst -dmg ********************************************* Windows ********************************************* Using Qt Creator Bundle (Prefered method) 1. Download or otherwise install the Qt Creator bundle including mingw 2. Open Kst.pro 3. Verify build settings 4. Click Build ------------------------------------------------------------- The following methods are not being activly tested, but might work. Windows using mingw Note: This process must be done using the windows shell directly. It cannot be done within cygwin or msys and neither can be included in the path. 1. Download or otherwise install Qt 4.5 or greater. 2. Update environment variables for build. a. This can be done using the Qt command line as installed in the Qt Creator bundle. b. This can be done using qtvars.bat generated by Qt and included below. c. This can be done manually following these steps. i. Make sure your QTDIR is set to that Qt installation. ii. Update your path to include ..\mingw\bin and %QTDIR%\bin iii. set QMAKESPEC environmental variable to %QTDIR%\mkspecs\win32-g++ 3. mkdir build && cd build 4. qmake -r ../kst.pro 5. mingw32-make Notes: Be careful to ensure there's nothing else in path that might interfere. Cygwin, msys and various other things all have individual make and sh executables that are slightly incompatible. qtvars.bat - mingw - Update directories to match machine configuration. @echo off rem rem This file is generated rem echo Setting up a MinGW/Qt only environment... echo -- QTDIR set to C:\Qt\4.5.1 echo -- PATH set to C:\Qt\4.5.1\bin echo -- Adding C:\Qt\MinGW\bin to PATH echo -- Adding %SystemRoot%\System32 to PATH echo -- QMAKESPEC set to win32-g++ set QTDIR=C:\Qt\4.5.1 set PATH=C:\Qt\4.5.1\bin set PATH=%PATH%;C:\Qt\MinGW\bin set PATH=%PATH%;%SystemRoot%\System32 set QMAKESPEC=win32-g++ ------------------------------------------------------------- Windows using Visual Studio Use a Qt build with Visual Studio. - open a Visual Studio console command promt - add path to qmake.exe to the PATH environment variable: set PATH=;%PATH% - to build Visual Studio project files call in kst: qmake -tp vc -recursive - open kst.sln from this console (e.g. vcexpress kst.sln) - build, run, and debug kst in Visual Studio ------------------------------------------------------------- Windows using Visual Studio & Cygwin Note: This has only been build using Visual Studio & Cygwin. The following steps are used on the current Windows build machine used for testing, but may vary. 1. Download or otherwise install Qt 4.5 or greater. 2. Make sure your QTDIR is set to that Qt installation. 3. Make sure your ./config.pri has the appropriate settings for you machine. 4. Start up Cygwin's bash shell - Required due to command line length limit in cmd.exe. 4a.Setup environment variables in Cygwin to link against Visual Studio - See qtvars.bat at end of file. It can be run as qtvars.bat vsbash to setup variables and start the shell. 5. mkdir build && cd build 6. qmake -r ../kst.pro 7. nmake 7a.If an error occurs, you may need to update Makefile.debug and replace "CXX = @echo compiling $< && cl" with "CXX=cl" 7b. If libkstapp fails to build the following steps should circumvent the error. 1) run nmake >makelog 2) locate the cl.exe command line including application.cpp and copy it 3) Replace all \ with \\ in the command 4) Starting in the build directory, cd src\libkstapp, paste the command line, return to the build directory 5) rerun nmake. 8. ../run-kst qtvars.bat - Visual Studio - Update directories to match machine configuration. @echo off rem rem This file is generated rem echo Setting up a Qt environment... echo -- QTDIR set to C:\Qt\4.5.0 echo -- Added C:\Qt\4.5.0\bin to PATH echo -- QMAKESPEC set to win32-msvc2005 set QTDIR=C:\Qt\4.5.0 set PATH=C:\Qt\4.5.0\bin;%PATH% set QMAKESPEC=win32-msvc2005 if not "%1"=="vsvars" goto END call "C:\Program Files\Microsoft Visual Studio 8\\Common7\Tools\vsvars32.bat" :END if not "%1"=="vsstart" goto ENDSTARTVS call "C:\Program Files\Microsoft Visual Studio 8\\Common7\Tools\vsvars32.bat" devenv /useenv :ENDSTARTVS if not "%1"=="vsbash" goto ENDBASH call "C:\Program Files\Microsoft Visual Studio 8\\Common7\Tools\vsvars32.bat" rem Don't launch batch with --login so it doesn't prepend /usr/bin to the path; this stops cygwin's bin/link for overriding Visual Studio's link.exe call "C:\cygwin\Cygwin.bat" -i :ENDBASH ------------------------------------------------------------- Windows Installation No installer exists for windows currently. To distribute / move locations. 1. Use the build directory with kst/bin and kst/plugin only 2. Copy mingwm10.dll libgcc_s_dw2-1 QtCore4.dll QtGui4.dll QtOpenGL4.dll QtSvg4.dll QtXml4.dll into kst/bin 4. Package the build directory or use from this location. Kst-2.0.8/AUTHORS0000644000175000017500000000104512277111530012425 0ustar synthsynthKST Developers C. Barth Netterfield George Staikos Andrew Walker Rick Chern Eli Filder Mike Fenton Matthew D Truch Nicolas Brisset Ted Kisner The University of British Columbia The University of Toronto Sumus Technology Limited Peter Kümmel Zongyi Zang Joshua Netterfield # File must be saved as UTF8! Kst-2.0.8/src/0000755000175000017500000000000012320547027012147 5ustar synthsynthKst-2.0.8/src/images/0000755000175000017500000000000012277111530013411 5ustar synthsynthKst-2.0.8/src/images/kst_stringedit.png0000644000175000017500000000164212277111530017157 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ŕ[LWYEE%xV* jPRjҴ4ML4c/k|`Fm5}0MF@1rQle N֠k'9ə3g̙3g*oBWWy|Z 뤪qWkQKZyx>q#.+YAO\Ōi3']7]`dM~SO[kn?Н(#IӲ]ɹvΡHByTl1xЗk7̈́Qa'G/ ?_P):= }} ߼  "_ɀZuߝo>ͣ;/hP߇!"R^aa=3ջ6cjz@ uB-@o{O:`p:tg 6/Rl]w}4v܄3!U~* +"rҬmBr>:kOA*AH{t6 HITmF U] |G-0S~"K&@$lNkݿ"i|l[a*4ƅ?\Fԑ%bq B%E$ (  [N~w0˱nk^_rb Dǁ d78Ab?Д ˀOUOyk{JoL{CmOYi}7ްdoE_\O~0ڠCUc#_TU͔s*`{__o{mif\IENDB`Kst-2.0.8/src/images/edit-undo.png0000644000175000017500000000230412277111530016006 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<AIDATxڵIh]Usy3uږmmH-B[\R.ąƅ.Vp,hmBC^p{NT|p;?*wuKbG:.qd2A}GGR-J6hZ.e#T.Rb7&Fv3n|LG hhK\qg/Nn v+% %PMDSŸ>5"oA)BC4uaΝ l*A[vT "(% k:/#PQ\zV`|Imh"ճeak({bÖ}7X ԬόR:CBK9Cq) kJ$ WVh#Qb!r وlahWCW;6IW Tp[Y0p"c<7n) d}:|8 #9G+qռR'x[e͎=EX'LFib2_/EJZI fM#sqp476fNc&BJA*'CG- Ȃ$qY [Z[JvWámK';"aUGp&DU*l| aUO r[ :EM7n'AA!ʵۋ~>p#2FZARyUxRX=9An~"@IئtuͼV*s[٤tdl0?.ԁOmGG yIENDB`Kst-2.0.8/src/images/kst_gfx_rectangle.png0000644000175000017500000000074612277111530017617 0ustar synthsynthPNG  IHDRĴl;IDAT8A=ߨpŚ\d>c` b`" ' ߿*]Dowvjvkz+mSw:-B%\5g \0]2v{\? æļlpUˌ%rʊo>;:g9$dA,9w{|2u,mć{ќde6ý<7ht,"al?o36{íot+f|l"}\..xs$r ޙpH806 Þ#:qpDde{尰SJRBi:f|;Nf! CP3+i6h-Y:=`lO*_Mk)-Z;[) Y^~6R4}AŎ|2쉊.0B*ђZ/ӬGs ~&Yhb؟5f]&x>cX/ߗk4vf{Ԛa ADQd'D[F[NhBP慬 ,쮯< !@&r݈Fa3XriA meu8VkBlL-m0>:h/ҴTi4#᫏X'NG81z釂 0϶@~FUn-HG7*,v,Cbn2"e+Bڦs`ܗݣyxj dZڤ59doH@z̮9Z)xZZJfҕxfzjoI[lhùΜM‘$lMK^Mjcf z(˿K.\.ce3|LՋ8cѓD 0F\k{Z7Sצ֡uG #̞8htn. HTp!EDQ@N0q uk`ﵖV&໮73JIVIENDB`Kst-2.0.8/src/images/kst_editplots.png0000644000175000017500000000204612277111530017011 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8Mh\Uwޛ7yԉfd҄4DFDSM)u!nR,~!.*QEFhA]Q.VM$ Mf1d2oޛw\$6sDj܂4FɩT WG"$^w[95+ `>tb B4m 455e PJHJʋvy?ANZk9|0n ?ԧx?atL@(~b]AOiֶw03 ^C9~H{`vT_fp:&,fNN$WeWJ5(:~?@`7w<ރ1Cydmr N`FiKTFUz &# mض]ׁ7؞PpͿ>Pd8,mq6"RlFf (ڃHB,cDno[(l iaR8`6zHHv9M0|%"(Zz+4a`t$~Æ6ЎS^B;NZŶm"lv\4Mh!(Z<0;E; RoǵZ '3DT= 6>m P.j xtP\s 1PUZq ~؅e(- kk9@ٶ&@lZ\duIx_@ hwϵ˱TzЍqɏ>new(> :;9 wJdZ;]egO4^P̥8гoI<H%(_GPVC҂>u-ު]"\y OUd…i$^Ac A$8##eͰ˲ژIENDB`Kst-2.0.8/src/images/kst_vectoredit.png0000644000175000017500000000202512277111530017147 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8mHel:ܤZ97އ"h8!C- ؂> XhQ0$m6j,c)M37tq׫gx=px_~DUKXhWjv,Sݩb[5t!v7b&_hy]t|!kkf1ᒏqh}z\"/ӡfz۞105o.@CD"D+ +n3 "~ 㽌z^]%jZY l';Y1u_(( '@(n2B\YWi2|`f?yҞ!}Ru6߲m~X@9t{;eUalLߗ|%ذ>J N?|a͡(l?Y]y,;{—TBɌ&f>&3KŌ.b;EjQp[AdAv˝=)8参a  $~񔵫N[1#UF^#^p^ ﷪^]Lc"TX^KDxij$7:#,] IENDB`Kst-2.0.8/src/images/transform-move.png0000644000175000017500000000211712277111530017077 0ustar synthsynthPNG  IHDRĴl;bKGD pHYstt~!gIDATxڥUmLSW>~ Ŗ*T|B1m!Y6S ~$3J&:nn˶eٟd.g(~eɒF@`C,C1 {9ǹds4{S4.9,&=ˎ`0pzo?8ŀq|ht|#' ];J _|HΏGPYU9 V;Dc#RddHNɳ>?MYy'48|%/mIΒ`IiI+05= Ḿ+s̝aPKnMB2sIiY_uM)s9FdyE/]s=J<]L2 mokoqm6KI 'DWw@H۶oK5D9ú".^`OoG5DEs\&$XTaC݆g8?q OMHnm0ýJi<6P J9a Q@$Q$f(8.%;PI$ў"2I$p ޤI8lބY1.54Kh@=Uj=bGQ+Hr00/ۿL&/_Ŋ(MھpC[=f s [6mn卬x€1:H.MNcfOEk0Ph)RF7s~5dyr~bzMVL˚+6PČlqtϙOА0`J?s<\3Ҷ}CVɪ&8N';;4_yy>aanف8nh=\SϾڊ|޾yM/BzɁTW`sS㘘Lͻ[u#}ZB>/VD:*&|3춚AσKOۻs5vu5X4Sjj;+Utٳ9GV}WQ:B{*yF,ijlrAMyZK `Mmjie](n:^JY!R*<QK b@UiUٞ?ÃC.+3ڏvUnl+=K^Xl v[^ Ft"~G̏r$`4DJPXX]d < VlGFc.c`Tsc!$"VۍuHm+]Hq;f)T bo:u} R5е I;8Rk G6 斀y ~A[RCAMp=kHh; l t=#drԕcH .$;\IENDB`Kst-2.0.8/src/images/kst_scalaredit.png0000644000175000017500000000206712277111530017120 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8[LUP.t-& hcc jDm1TFL4ikXVcvPR @BD Kw^Ƈ.k$̜L挨*YVdo [f k*N^O p vwx"R ~ r=-"4W~p8u@j%GE6In xj SCj"< H Pd~ h5Wc86m1`σ^.D. N(?%) `ɚC΅zb5gbC0 ͖G@qr̈́H^.{)u˭g|%AIENDB`Kst-2.0.8/src/images/text-x-log.png0000644000175000017500000000151212277111530016126 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵUn@=;vc(} BH; 6ln,݄?`۬hDUďuZ+D7gνsmH)qalТ+Ax$ Pa$"X1"MSh4FF=^9ömhLvLxE!fWżT/,CFh˰J%B(ժV\L̋GG,VH, v8i`2IH13R;풍=?4I@ɂ37Z[f2 !X&w–[B D`s(aa5Jd"@H R{gg(O9ajdap\zBRi$!LSm-La*RL'? }k5fO? T'뚎 jcUrp8qMF \Њ^3˭C (1'ꀨmôq'+S) 3dp.<4}}k%l6?mnn%m_Rml8VW( ~ 8{{{n˝s\ >.GkG5~!)LI O 9< =ϋk0_?M1zo`L6)IENDB`Kst-2.0.8/src/images/kst_psdnew.png0000644000175000017500000000206512277111530016303 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8]lTE9gl B[ϊ$5FlhTr41JJZo#h01¦!hdS0ҦJQ m%v[mٿ3^YAMN23o(]דܓ@ S|CS +BYqBMdRWJ t]M\mEuaj PRJDT8V`2MXG7mY;, i eAwH)>KJ(-=7wN|O~N7y%D"֮A4k`oyKodu^/̞:E4Ua rڐ^)aÇ)${F |>.ҵk@˵%it::@``[]]QwwllL-qzzk\6᪩UYs;w" HJ)u]J)d2i{~v ##FG 2\Mi>ܿ.UQAP-%,LMax x}}}MMMwBɭKOji4m&<{i/ݛg3MS&?o#-ZIENDB`Kst-2.0.8/src/images/32x32/0000755000175000017500000000000012277111530014172 5ustar synthsynthKst-2.0.8/src/images/32x32/kst.png0000644000175000017500000000500212277111530015476 0ustar synthsynthPNG  IHDR szzsBIT|d pHYs{{t_tEXtSoftwarewww.inkscape.org< IDATXW}Te=384HC*|J~K$" :jfn&GRGb3fY"h. !  7403?R9<9{s2" ZV?}fe"kddd~aaai#""T38` @ 9L6.((苭[i4.A C ]#G\  H۷xZϛ7o$477Kzɓ'[XBlee:DGG!,X>eʔVHHb;v>O%ɻ;744 Yl(00J‰'%bbbֆD̚5K,^aac୓&Mgt:ك? pttD" әVŜ9sXdd\.5g30ؠƌ3a„ͻw~9**jD"vtt`ǎhiiAPP>8::г"q65 omٌPrJ&J|[_ 0D>>>˽'%%),,LÕ+Wb-ZSNc#F ~{e3J%rJH$'>oo}~[l6)pႥ(&&@q hT:g6M׮C>=m ":;a6рH-͛=l2YSSt޽;v0fL @זw.'{qxC{ͨOLB58~8xô:u|GgG 466V={ C\mtËbčbHƽ44LF}h9w7WRLLL rjkk1E7xAװ'F*++\~itՅmGuxC9!~GXl/:(LNZ#F#Ͽa>$=h>bڵkHo$ÈjH uuu}vR*t@25+P||hiׯ[c;!{^LDvEDdff8DFF"!LzhoRܽ3x}hrrk}[оT)VQǭΆJ3bccӍsߞJu))#h;#L8CCCFg|KjjjpiTTT`ƌkkk@OORRRP^^)ҐsBBAEAA_}bgg|СD ܹC׮] 6իIR QSS#lܸŋd6ݻwiWCѭX~iPժJ5kք.\;X5 QQQc"''NB@tt4xr (--gnnN(, O38//l6kMD$tz꾫?U"())<ϑѤ'_KP_Ѿ 7:TWWDDDT̚5W. ~F`oK#"zf` nN-kgNd=9FVlkk7xmڴ 6/8EDza > %? p' )F/cDIC)cLΝ;}bcرuhmRLaFy*U; Y`-!jUщF/H^#A#@D^j u% < 'Z4Ju-|:a\ Av':ݕ~xu:cLBDAG5[l-wNa0 x3`8xNdp,p0(-)ǩS93"\ca2qlhd=1}Xxq}VV3ϕ7!sz1b0, s8W.vUު_h~4}=畹,h~jfuAcC+fÄM:ڵ9TVⶮW]U_(R~w13PVz/C c(z_$hlo G "jo,aPre5pJ۷[)n/P]]=?v)~:QSk`ڴi}}}'(ݸqChR)qQ[{$F "Lg: 1%##uky"!i ~5)>aiR.}f;?D!7U i>cb46f@j[M|__)|מg1zGh:D)k?F<b*~*@.?5/^1*zH)7!-~6&ZIٳgOSk$B° *Ȱ 0"J Cr\Ծ c$RVBgg] km|w=C)W233Î;p]08NlyZkRTdfy'JA-ZkRqm_+ ρ)2'O 턍w5:l>4A*p_os޾ºQmDBlyDaDzߞY?N2YJ堄e,{Lvm K+y\ wR%T##|EVlj峔&gg3y%>dıcϓd,,,=ù\N/-- :tt+ <|O=^9=L=w_Gf8z+"P{Yӥ\A( Ovc5n-up֭7M4!m6v?ECIENDB`Kst-2.0.8/src/images/pause.png0000644000175000017500000000200212277111530015226 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsItEXtSoftwarewww.inkscape.org<IDAT8Mh\U{ɋhbSBZ3"@7""u0̶Q7..ˀM@Wş5f2dC&q ݭ@A`w㥀#Fs ;~o?TxD!Xy|+/RbCk Ji~ȝ{ĭI~%{w,՗/W_\\1ܐI!hI)IƊ U<S\魼xRBy 9dJcڮeē~ś/ƟNNN`Xթ!}.ǵg|><5Ƴ~~cpƁ/|p3V/>M<<"Ͽ0tO*cD;J) r bm/ -N`XYsvhmȲ4#Ku$y |;XkJ=g!Y^8cR'ޙ3a ՚,P5"MqC&Ƶwerytvl-fV4)q㈏ji74%ˡch41Zn$Hz%qBF}u6C0Bd mH`?tp}ƘGG b 4gHe5$N`#< VC}WEbn{6cޟ~y=v[ WE)o1:U%h[k^Nv7X7p!,z`WZL5Zٗ\kG"[%L/{:$9?* ›pl `kk/YpIENDB`Kst-2.0.8/src/images/kst_gfx_arrow.png0000644000175000017500000000110612277111530016774 0ustar synthsynthPNG  IHDRĴl; IDAT8?kSasnD["t)tP*8(AIFO"`!V RH>@.U 5Mrq6mrg?ޟ;qHX+dy?M-#d%vQA`bܛ}o$1;ҐQl@ߎ{n}!2D'CyYݪZnaغ]'3/RQj4L D1q٤9-#Agޞguv=o5CƸf1FZqWV޸L:?kL5/IENDB`Kst-2.0.8/src/images/kst_error_2.png0000644000175000017500000000034312277111530016352 0ustar synthsynthPNG  IHDRaIDATœ10(rߤS QXH"Fl%I[|{HcBk$GHǽ-"=Abj TgN#4LXb Ԅ/[,@uhhsrgK)烃rVv:kT:OHͪIENDB`Kst-2.0.8/src/images/page-previous.png0000644000175000017500000000215412277111530016707 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsItEXtSoftwarewww.inkscape.org<IDAT8Mh\Uh&TDJQ#Im.Ԉ E EvwvbvنqaqӍ0Q[ۘtL2o>r1ɐ4spᜣ;1r#a_0⤏yQy<뮼| ,f<}iPρֆf\gTfetFg Nw (:FОGJ Zk2( 2BT٘!ϻ?Zb&ϻlO N ?EJI$R yd$}ySE.0қ~>s8֒*1k66izOHozXxׁukڢp;d1c-Jkhe78@q)NMvБGHf= =<߁/Ac$IH*RXkAd@ȋdchK^!ؗ>>{)@)!GD:Qq#@nu L/1Aju7z'} 4M( QRj?76P$|v( uS SJR%fQ,eY^Y\RR%alg}Dj:msyN(@0ay#f)'Y c[O=`K`$,bgujnRfs1:1N;C|;ȭ{Vx7~w!榮5ǦBG_l3ܮ 77uO78OxB[Ij;-Sq *K3_E,nn9[щqwlЃ?^qiFu qXęޫ>x#0;<nne1E IENDB`Kst-2.0.8/src/images/kst_graphics.png0000644000175000017500000000167112277111530016605 0ustar synthsynthPNG  IHDRĴl;IDAT8Oh\U羙$i:&h4S-.ll"Y"*]rѸpaJb B+H("b?&$u&3of̽H34 o6wDU]gd,B?b/~Vb5#_5kSaYWDeG./?]Fd\Й.}+`0T߿M\WЛ_U8Nj[t8DPM]ɱ*8&J:oI37-/ك\_ 7&gBk$_uj|.uALR ??yzqVXkd=Da~in&x!Vj y,Fzic0`8ٙk;}TrGba an-ܘ\=y"F$R qff:[OW•cZcd`^IENDB`Kst-2.0.8/src/images/kst_graphfile.png0000644000175000017500000000145012277111530016741 0ustar synthsynthPNG  IHDRĴl;IDATxkG?iV&Z#T\xo7 {L y1*{уZ=dgJxZEBMhclL}}o]{0>00}_>;R dSJ", x>@65T+0 J&sJL *mkAF9,`ki8.r^U< B"`c˲G\Qi=!,2d2Z[7'N/fmRNLVPC5oqwǘ<ߥ8"{Wƥi_ ;ҍ<]sMf =YqZ(5##?lN]{zx=g|ڶ G9Vg y'u|>#6Lx3&E wځ:8u ^5Ͱq8NxO'aZj0J%[u`˹nB#B̈́MFсux.kUY>cccŋlb?2?taeffxı H`T*e9Ø}C5 Zvn6p&BoN8套6Ia]57A>AT%4iY.֞ߗOw,-@5wVhmh+TS?|>5ɤpAg"ěmDIENDB`Kst-2.0.8/src/images/kst_datamode.png0000644000175000017500000000233112277111530016555 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<kIDAT8_LgpՕRc2PTL!39Md&ðEE7]2FH3fxa]a.&#dqY(:u5#3BL Ю%k_]Ŧx$9y3D"[,Zon7@G100 55x5ÁdJf3yyy @~~>FNV` #HRq\8lْB$y("++k\, q׳qo[n%UU}5e ccctr<%tnnի'pdddO!oG.o2:ucC}[Bz{{y8 %Lc1Us~oX "*'SF~})E###ˡ!zemcL{7M2}|W#։b*JO~,HO^=)EzY@$>yR/w}@F(x1i˷/ݽ]sb ycZdee!r|)jt[Xrl_1ϱddqFvԄ# x8='!k2Yc]Å5%h\lH[[>obAi6]ޏH)_2BoRgHEQXrĂl.gniܿݻw҂㡢h4ӧOv`6Ν;9.=>W\p9sdJKK)//jƿfNMM ncZCUUb|rZ ̻(2TZ~X?TQ| cJs g:-%F)}>:qg2] ߑ}:`[:'Tkl2tC)hXk Pڕ|gr|sY&O Z"P_, uJinsO˩=5<FZ7ȶzcu#FL7 5\lАR4(n 6W560v$t# 0 oŠ^pJ=(dDF`E2g" wWT| 5ï?;S0 V$`!'nMBtf͆QG(\eY^lw1Z ou"fتghꭼ<}D0#WM;JW/pj]{8tg{8xK/qTyIENDB`Kst-2.0.8/src/images/kst_advance.png0000644000175000017500000000071012277111530016377 0ustar synthsynthPNG  IHDRĴl;IDATxAj0EK/]A>O‹.rK/#Hed H ꢱj;NÀ_3$]q "1㽟]l6HXD>zG VUiZ/YGY/ /E H™E&Jۢ@^_SSG1Ȩ'")hI͑֓3mWJykQJʓGP!@6p:9kTߊmpKv+˒@u̓gu zMz)[ ZkGǀLa:ҹg#iia1fKɫAXzMߍM-.=J)A)j"@ǵs/qUU=&b]IENDB`Kst-2.0.8/src/images/resource-group.png0000644000175000017500000000227012277111530017101 0ustar synthsynthPNG  IHDRĴl;sRGB pHYsnnޱtIME  UCbKGD8IDATxKlTUޙ Ng- RPmhD u, ΅ 1l|kLC"bB, mycν2ݹw|w7φi HO:&_GDNScONnMk/ް'ϡ-`81Fqrd#CUkG&L&lQ{+D2 }fm'q_>g7o¶-r*%V*',z\o|T(AlIWg~\Z=8(N$T*<|G )ԑyR)cU;+YvifPj9]Ωjbx0m3ih4]$Iv@NP5iz1Ad(> 3ǎWTMVN骪J1A{{XҒLօ:&.an~#PP8&clÓ&Xd֮J3=?yr?<eZ&1339q4P(xp:z-@ǒH$Bff[B/o}ێQw+/ $o,ŖHkQ4M7QBH.{)kKvLq0l(A_533`XJړh:`iQQQ aamk׭5Mdoox (iT*!#SZX-mll\߰d; Ç kî,Zy/C" hhN#F {%|b=Z6uv=-UUs\joE $+͖&"Gq.Q0nc9нBqn'"2W7_vUMMMa2HpQjxZl{{ E ,6>v;'[?_p'ھ?K p8O{+*6QN~#g4:0 i@"Dyyx^00KKȈʕ#E_jj4%⌫GF.\X i:rp$paIog>I /?IENDB`Kst-2.0.8/src/images/tab-new.png0000644000175000017500000000142712277111530015460 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxՑOHQǿofv]ӝu\ VkUE%C VIu(tVQDDyRZjdd"캭YuG_ԃ0l>?R}<[SX\7=GVu{秃DtV6ŧ2F< @?2~p<~SJhjR(ZW ?.2 -7OI7o1= `ȐFa T7گϑE~n FZae-v|ww{OEEL*r:00è0!2vY JI[lUc cf8x&~=3TmnkQPPADŽM ՘[=[$ޙt_6ѮQHd*  CNncl}tX1:첞h<8} ۳KyoQc9LY|+`bV[Y U_wl>L [8 ўHlۋ fD"*8D2K bnk8V밶Io< ޑ _FRE&90 q M6 LLu'Ŭt:*I3b8 glQ/_ߺx:r_IENDB`Kst-2.0.8/src/images/kst_readToEnd.png0000644000175000017500000000237712277111530016656 0ustar synthsynthPNG  IHDRĴl;sRGBbKGDC pHYs ,tIME -R%IDAT8˝]ewvtvrt\1Kf!B0@ л ".*B+o{.+IG65Krwvgfgfg=]̶8眇UE'4H0")@ ot63[s'?l6A~(j[æ542ꪇks4yR"xx˾2/z$Ĵ  arM&/עBS㣣Ve<.Y(~FB3tC/Skipu&(M^Ny Ȟ@"[^#26na~m @18[Ȁa(oXK$gj0l'BZkɔZ>Q]^i]?g̴5 Z&346Td(4Qxav.\CwVi^ّB-̼ P0v)@Jv -ܶݖbNX V< oVW3lkibNsH9xT'I'J?w Hd fڜ7k#\< E~ki/؄Q!єe:6*0An-);NCNH I}s *h=/[2lA1YXʶx e<%=rZ,KyR]2G5D45g@Y;}ٞ~u?/8߯e2qJa@ 60~7mRȪz֬**WĵwT8;3G\ 1G 8ejBt`^yv k5)hz|8Iigb" 8}tD1i H ER JbM5`mҬMif>3>nKR|3C8?$ުqϛ[ a}ۮL9n3r_ue2m4l(sJaD#/)vlStq[48o*\l `wmz]7}dOt毽J;jMH\. %TgY( T0HX*Q0Hg䅴P^tʎox :ͳKq0D0wg6MEY@$X6ۦ|fѠYk`.!#cCݤ~o{;>T[@BVe`눶mSRٌP*31:yP0JL%"k!:%`V$vuƆ^˲(e-n/kj<][j*pw>7X(5$u@ p^G:<\ni]@8JS)n1U+9&p76TJNE]6"3qX)K;̶R% tTj:j*58B<`VlXgl2<Pu'&0=>wLɾ?pŕ4Ep \5 qQ jQG.] !9OWoS]!L'ѩ 0)24bSÓ{eumh TpLWMof) CQpi((S?x %]䮯$. EaM뭔xxyayZ>923Q/CzUsokr@-1zFSvM> )U "(`h?N[7TIENDB`Kst-2.0.8/src/images/kst_leftarrow.png0000644000175000017500000000250412277111530017006 0ustar synthsynthPNG  IHDRĴl;bKGD pHYs ,tIME 4ٸIDATxڍۋ\U{Oթ[Wv3t0J 3 C-,B<"/ DP$q=L NtWwUr.{IO4`}ǷYk)~JG $")@]6]wa'A(L;#M`^Ò{R? .y9NMx|szͲjFSFoT*;A:OdٷCx$opTN吓!__'M{ÓwΏ|z>sqt}JhDeNõLVj*˾o깲3 >6yw[1榓|tζ-Q$[ ٔQa fsp{rەK* |O=R$i݈\DU8{KԈ9=H!-=mU,@Y =WuA9)t"2!͞el?hvő= K}(@'|eɺwa%*~ieԝ 5;|rv_~1x_\+PI4r ll|.!lo8p}X\ 1 $i[ƶk<59R]xΆs߃7#cmQd6FILҍԭr^nvnUߏK 򗱴g,2\Zxl[XeK2`,B^Hڄծ8Yw-?$*']r!i?I&i/$mh&U!7o?٧>~9jU~Uz(;;*P$0 bk#v|MF' #$\Arym֙‰\BϔL.3ݏf)֬]PoGxsƁV-Wg&sNj`Rěj*ʩF]fεNjtt#]\ Db=Nl2_8qZT*/ȑ#G4>_GkUCۚr2^t44zA+3*qj%Hr^ns@T*{/{hRhIENDB`Kst-2.0.8/src/images/kst_reload.png0000644000175000017500000000240312277111530016245 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ[lTU>s3ә5\,۪D NgRʴޔP-I4 JJ TZ 4rDCo<4&Ac:{ƄI[A_xZzҨzv>kSdAOTaOa$3ﶻ=a(@g֕|ZhPO _/D*t}҅_ov~lو+a3մ|yЅe&g)D\+~>#a v|q>#bXnطV;f傾t@Ůi^EY=zpC {5]H:Wumcm1֟Y.Gv{6) SA~_>v-HjL j^ɞcBHoN1UBD)"ј K.E#?9j0bA}#9˸/MZV/'1#$o}maXr| 縟⤰EF/)+eP]1(ڧ-G_) `1^wsu8R\ؽEۊ橬To͐jR0! p~D޵<}^³{h.[qTvx1o<侖 PT];C,s*j$a JA iMfOS`5@\0\<'J*Wdg.:_ۧJ5s: }|{ᖚK ,҃)*I0}#nJ+qJWv^zu( r5Buh'B'!c[Vb*K+n܇m۬AI'𚢔Ns.#-"h\ 2dbqRHnM9H>}M:]5YM R"nB?ө(8S98wYGc[m(D31Āp!s码#r?paH=+.\sDq2F,8!y4̗P첫6߅,Oj22',x~JcYrtVR RVenP.8' &xxf[coU0ͨc3 TKuM!..{ʽlIENDB`Kst-2.0.8/src/images/kst_quickpsd.png0000644000175000017500000000114112277111530016620 0ustar synthsynthPNG  IHDRĴl;(IDATx1j#1?{-Rr G,sz!p9e {SopB o YgL , =inBPÆp~'1EQi5VU T(gV"sbBk6x V6x~~Zxousd0#CdmO}E=o,K{o5}ߛڞ4Xר~dbE~>rTUiӀ/-6IENDB`Kst-2.0.8/src/images/kbugbuster.png0000644000175000017500000000207012277111530016273 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڵKlUy;3㩓u┺J[(QQ*E%Bxl+X `UvJQ@U  Ħ*pPmx<K' ~ϽsϽc q\ő$ *3:P(G@0$I^Y~=r8ϛ;EbqZ` ~Xl>mW& ?Ay %㻴dvww_$\ֻg0 a=gd3T\8xBF< C3gH$cT[6{z.JR<+khM\.l̼zmkm;4eJ ]2/en!zi&o(Kȯy1rg$x3%L\|Rj-$+^ Qk"? !<;w;$ }A=Q߄5 [^;E ku4_0CT+? vl' @rH_XX#h'ƿDV2*N* Fg~8X&r "+kWwI"0I>]R7,is/mHl4rTaӄcJ0f4hRPXd Hlw>}:&b luڃ4T*Im0㎿Da}J1 CQZ'5򣪊RE0"L-0JY'8"?K~<=tKt6{᣹\NTJ/a EyU( ڴ-K§-BPzt9۲31f3~rX9)pVƴ/|Y7h 1v#q@9׽? >y 㡤kJ4BBIENDB`Kst-2.0.8/src/images/kst_vectornew.png0000644000175000017500000000172312277111530017017 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<eIDAT8mTe;suMjSe4aHZlNFo!I AaAF0;aKfɈJa(e̝afdͮm/>9繢*qDZaD:\R ̨` `KL$_.|ѕ/|Ȍ`<"{R5| ꇈkIjZu3V?`IJs]n/ܙHX&&IUqbE[ݸ#՛̳ChSd}xbjvk<ǙUs:- اSsyc<pa(xM<ϥwi , K*p$5‡0Ys43NN%AOT *dšZ(HU5᝛i \,Od$x 6c2)=A^"9"[,Ntr2&_J|hxaЀHӆ;BN)v4nV8;[ek>T)R/=#G8DSPX,RLݷ=chhl6[lJcyt/@,COW x}_mJ󘟟'> ?6Λ[Ha@VkACmvKhB!t]I]|y}" ݸ9!×M*[6u J.U~;-٫ē1[lyR-p'/g~꧂_ B}ܡurAN}9Bac R8|);45~a9t]'9\7Elfzz6 J[} i5 M#v R >::8G 4M2rه޽뺸9oMaN5ˁ`jl[V50BLR*T`ݫbVfݣ]@xx9H?uibLIENDB`Kst-2.0.8/src/images/no.png0000644000175000017500000000035412277111530014535 0ustar synthsynthPNG  IHDRRgAMA aPLTE@GtRNS@6:bKGDH pHYs  tIME 1P ]FIDATxc`@ PbP* 8 CT2 *@P0aj1Xn<F*2sIENDB`Kst-2.0.8/src/images/kst_gfx_label.png0000644000175000017500000000054512277111530016727 0ustar synthsynthPNG  IHDRĴl;bKGD pHYs  #utIME  | VIDATxS1E@}D% Q(A*6ؓ8mt$\B̯X|''fv͛veY!9Csm/ uw<ϣm\O!q4,S<4a\Ucʊu.Ym@˲u-MO-#lFE0M:cP9'KZba$ } Wqq Bg|V='E]1Xb; N9}?noaaS9[cejS\ oYF=J@&ҥpZaE2`VQx` @u<E%n["RxG)5]4@n:HDž?xZ1d@IENDB`Kst-2.0.8/src/images/kst_changefile.png0000644000175000017500000000230112277111530017061 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<SIDAT8Mle3el)*RB§B h=`Ġ$xG8qDh<4!j1QM biBnvfwy=4?yϫR4$DQ[LjRJMӄ|@?hP('eR$"w <N|kZbsOM yg4?[uQKk#LO2IqG ,Z_,vo^ťiM^x*r'$ϫt aI4D$cWXg3,fF]Ns&ٱOQ9 ; H[ ?~[W28RC eޏ!---39ݿ3t^)sKk[ JTLTiaT|udAxsHp8HN9rdg-[` p=p]pT>OP`4Wq,Ԡ䛟ưm{!8,\\B%؎G!7IeL0M("Tl)K04CrRJ;Ɖ'"D`zP= k32fA -MtP*+ !V*!$qz1Fz֐Ifܤo0˘aE[ecYU>qP={:!XVU2e /< u~6Jڕ_x`QJl[#38wqԄ%OޡmtwH?3*Ojn?xeC^/u]0 !38Eb:6/WyB|}oLqڞ!( (8m.:Yc 7+r_LFžQ7sTdEXݑOo+)^ #vnQ;!owG|R{6d5Y?;ΉVi!xzSV @72G8t]`ieUO ȱm}s=N%~C((J 7[عm H`NCC]ݔc~\ ]ะ0b3veeb{#yi:!( Wҭ D.1԰g{W+oM_&<Ӏ?\D$*k]Op,LWC dYú Rlm0XZC$GoX茅g; TmcaS-o9+9_U$` `9=13i?:#&uJ.=qgzV,QXE (3y[lfױs3ޢy&xf*65A!I\Ī-R>EF~&ol%A&+ޱ,sBV^⦪du]2nL0$28"R̚ZH<4iΟ"+/;n~LKNK/OSiڗjG͵YHE D~*Sn1M|guR\m s]_ҥ%0<A\A0ytIe[;Rcnd.g̝3Q"RJ DD* 5_F#A,lzhcwȒ>A,nU,n _ ūH//AJ/Ow0t"Cgk#~Ę9k'[0^ϓ-O\mz`G> DF\P吳$b`C}'`WY|CyV̵G*sɊuckkE W;zΡXפj =FWw\jSTͫhSmx0Xap /{X`a{IENDB`Kst-2.0.8/src/images/code-class.png0000644000175000017500000000157012277111530016137 0ustar synthsynthPNG  IHDRĴl;sRGBbKGD pHYsϐtIME5IDATxڝOheovI6Ic A*-x(JD&`AQWAh E*U@n667N؍a홗oB;ח?hRLӁr呉7f^{zD|p[iK1h6 Uk ENxI%ϷWZiubapCg[|t^ox ŠRN{~~Ů?XnU4U$)@}d/LR^f7, a' 9>'N'Ϡ5I%DYa0 W f"Pʠ"CA+MΒװV 1+؍# 8ܿ[#>|BJeYh!94$m {g?N~?Mf㠹vAM"e@XnhzkEs?vR04>M[lHr( @_:Wo| /@d{s>jHD2H'=t+Y;]r`wَĥO4ps;WϴʗALfWωO~Lm6>w˺m_/bt@ק/py[#-0:e܆M)joQq&B0Ylzĩ=B$ YAhSz{RvNt4oLl)70:rc tIENDB`Kst-2.0.8/src/images/kst_zoomtie.png0000644000175000017500000000217712277111530016475 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8]Te}ǝu-YedBpA5p/ ,*0QB,@B"(ڋ>qA,I->Vbfwggy9O3lZW?yci@ik yReYMliM>S.FoxQBPw *LݼI)\!m[DDW_z(FfkGcOhTzE oE"rKz׮eeǰS?KiʭŢ\ڳG{nrchH" }_ hM`6߇wŗhVm!TpFo 2"a;p j@CQ}ekbUBT'@qDĎ}s8{,Pc < a,ˢRDfX,;ݧ bضMX$Hy^@i]۶Jۮӓ^C'* 9]6 :P=弽o\rRϣrM"Q)"wSIŷ_$ 6YX(oD<{uMR uˢi~.ֆZвe|J~!of[{s{c8y$J)ǩ3FkmĶm̚J%) ȵkdŒd$(w@TBD}jU_C$addx}jhxAJi<ߓf5J%*! #^ 8qLs9ii>]'6lLH)40Z|g!!њ$A֧7+8n>r^Î%JSըVkDaܰ@kr6_Ͳm$b~zRjENkXy,IZW+<ïDQ @{JpuFUTH+֒K"֞ z;ٔsٸngz<ʭ_#ht8WFI /iX$ץْkg}WjŹ6ismBqcqLDQDF2Z\0R-5U\ܼs=22u[7 =$RkS--G+8 a cs7(H-}P@QS^ ܳ1 J 0Y;9a3?{zD]2GIcρI¸6c']͒U4xwC ZzZ6LI۴|6T&1ES_jGα}Cf@f^ y@=]}4=!@²w1]"0e Mtv׬IENDB`Kst-2.0.8/src/images/yes.png0000644000175000017500000000041312277111530014715 0ustar synthsynthPNG  IHDRgAMA aPLTE@@R,tRNS@6:bKGDH oFFsL pHYs  d_tIME 2+DkJIDATxc`V( (L @3gE!*H!YQP9`1ig P 2c6a,IENDB`Kst-2.0.8/src/images/kst_gfx_sharedaxisbox.png0000644000175000017500000000123112277111530020505 0ustar synthsynthPNG  IHDRĴl;sRGBbKGD pHYs  tIME R'+IDAT8OKTQ3OZCBALhE*+NM@:}ܵkAQl()Hn`{n99{i1c\B]>s8Y .4k/1nz\.ui<ʎd ,~3& SˌP<~t}blT A%xv&RUr@X"_66Fܫ*UĒ%~A X6`%N3Kop\ |*6Fk>=(p-Նњ/R*~Ŧ\ Hu ]cspKkՂ" K F d&3ӫ'6qZ#t켣譪R<3 {[O\(`(܅\՗{3ufBAZk PŢG9u6}$-vڶm"^5mOY JIENDB`Kst-2.0.8/src/images/magnifying_glass.png0000644000175000017500000000202412277111530017436 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDAT8]L[e|"v5B˜$ve&,q&z4ˌ0kX"cd,[+m)Ӟ˜̙y?(Dc5{x2ڿ kOu_jt!Vn3L "1,#"|>ӡ+)`ApSPdG>On+"hZ䦌邂azWWS[[7 <ϝ8u{Z AtȕT5+::'{/p3PE9QX&HQtH/Є,8lm$R@XTf@R]cNӴL#Q5AQ֠Eded)@4(U}äv(j,ӷSv B$E󂤧JenAoT4HVT6@Ȣ!g'azNtT1y+np&&e33)ݰijҝSWacXvOoZãט¤diR8m5+9YDVol;>sdvQc⅋_zym~vv='k]7C=#ύ^J2ҽϖjNb7& B}}CC ?|wH1mk{ynfeZ^F:T-,ܼ( B9Cp ]D1J,V>{dz=={yVlOG[[sggNL*kYAD]MMMZm ssP\~kخauww4!/ m=;u݌/Ea$DIENDB`Kst-2.0.8/src/images/hi32-mime-kst.png0000644000175000017500000000304412277111530016411 0ustar synthsynthPNG  IHDR szzIDAT(Ŗ]lWN];5!. E!AZUQn *&T|P>"Ԁ!5 U%REJm#Z* ؍Ib&ٙwֻv+!q{9+澵gϞ'`%iu.,,?s\)? !T-Z!P*ZcW(Xkgs_wKNJ %h|CmX(8((۰ ܷS3nLkclml7k1hmoe^kНmIB^M[[;ݛX/F+r5.]R"[*"N'ts"ŋ+d2I! r:Z#@k 5h211A.uľJ.f@˗/T c `% Cd2AJp\hkm{b!FFFϢAߡ볓 _嘥@tփ )c}>t"3:JO~3/PsmWUO"D`RJ>?/b[o"Y9i*{°&[cڞ>N"d EZw]v;ÏZK \OO~ooƛct BiTx$=;ˍ_W׾}/~@5_Ā2v.k|bUe۶P(SHLOOs8AR*q=l#f8\cDm,m@XljDzՂZvN6ۃfsDu'sss9s eFuRU0F$\мqC}O#Jhw;|tGOlߧWFovD @_])Lצ ҵ> !L@kEÇ }BF9˃c.ϞzJGC&Wjj5Q :*T|ުE*U=00hySejk."vA@3gID_:+Vo0FsOmVy≯qw1#yh fRJt;T|̽秧S, /|*fY"+++'OmVB晙EHWk5wf.p{waKK3L]0vS("0ctÿi-)MP/:HT-K3l> \}0$ k(!ZaR!J(m\"Ν;ܼysflllNȑ1ׂNr(,--͌3! w%1 n߾=311x}bȭ[f=x R]XXXRn_Nph(d ihhp{t$I`Ѕ%MpE8NMcdè\6X~oxx!f 6ߏg_~# b?҈r2\i1ű1 O}0OtʣPs8]b/5(76 ECaN) ǪR<_ oì~8ؠ\m}^F.4t7XZ9Ӷr!mx.1O@ӳozJB´.- }}$Ϝawk~}u2K`4wJ062AϧЪa rGS")p{(Iq2^+6ˇ1dݼ>99zfW(ؚPsLn:-t:12rh0$tr6lXVdYcVn\`E2L cBH$5B2nVdYsssD1F?޺Ѯ`QhRaI4%Y&_jolb]Y]Mp`0jOH$f /"C:Yͷߍ*o E>b FVeXqp8_SxC?ym孲KVOJzIENDB`Kst-2.0.8/src/images/kst_italic.png0000644000175000017500000000155412277111530016252 0ustar synthsynthPNG  IHDRB sBIT|dtEXtSoftwarewww.inkscape.org<IDAT81Uߛ[fWwbB42MBXXXp6  B -lAș7}0|̼扙qWkxMH^Fi0' y=Qw5Ww^4[ "`sGn{ݍ3SYx׺,UX9ډgfmdx|fKmD+, 48=T=yv{$}׉qh'6[[[!nea[䖋!N{&1ιi%I&4CŃbz=!@9JĴT0*U 1{s @qrKZY хBuIU4F9h,52(DqBzq`8nLTivH qeMnv8r,\Sh4"2Vϟh' < ͬp="BGDkt;І+-F#st:ix7@ e; bIuA\ʺEfEPUB ֦"L#QvQx/QjSmh-ܿuNߟDY g^G;!}n#S:q2Rw":bf}?%;Jz"g>IyK~~fq}#"y?/xʹZlIENDB`Kst-2.0.8/src/images/kst_choosecolor.png0000644000175000017500000000030712277111530017317 0ustar synthsynthPNG  IHDRĴl;tEXtSoftwarewww.inkscape.org<iIDAT8ݓQ Cvcu_VjhT߅<]MĿg|H)e$a0e{{/)(I͈][OB2xdYf%@$6qz>|"L ! u3+`8XXX4^55!Vhb"ډ TTTT_i ?!I!uXNV(>s'Ii鵿^@x<(//G`8@ I_z+rt:u:NL&j6Rp4%n,lnnxrxx$qT*Gl8;;{"-ƮbvCѠ`;;;1o$q;:y^n zŕ#pjj^mmmi+ xOT=C7Q<P{V>LNNpLzd'%O9,˔$CCC(:.z8#l?&Qo<0xv922B,)) "˞>.̅e4R:[yq(S(4&4 ,*H^ITTTtR]]7;;{)88o"t*P/V翃߻u; jE"b6~?v;~hh mjJPpLf8[ZZBk 8qH$\L6%]{ϱqLugvvZu;Zk/1UB5?؏F8N'؞CO7npw`0#Z@N~ =|gfH200"뢵&cAD $IRz{؁뺭׍1QDc" "Jl/JyjuJ)̼"lė#8fZ#]<_A޹R( %*Ovx6" "ED0X*0v >]c~Χ\dROg13_W+qc.çAQԴq(޼Il ]M1CIENDB`Kst-2.0.8/src/images/kst.ico0000644000175000017500000001027612277111530014714 0ustar synthsynth  ( @ @AA466  {||HKK ""K999QVV),-t<==hjkghhimlKRQZbc:AB@JJITUITUITTHSTHSTHRSGRS,34VVVMTRkyFOLpxwt\ijITUYYYGSPT][w@JJ6@?BNMITTIIIRUUTa^?HFS\\?CCHSTNNNptsfyt=GDaooetu7@@.```?JILYYHST,===U`ҧEP,9SZxz*1/BMMooorrrtG\Tc1Aɂѳnr}$,V)-$)*x000j666s@VQc9MP`窲{ffpnoP\] ]]]~~~ZZZFKK:@A"""@^^^dkkxMQQNNNccciiiYYYnnnbbbqww]``TTTrrrcccgggZZZX[[abcAAAwwwZZZQQQsssw{{cdd wwwWV^^^wwwGGGHHH~eee444x;:PMlllbbbpsseeecccWWWlmmddd'''Nbbb`]tq>: YWfffdddSSS-*62ON&$YYYAAhZYccc&ooovvv*&;8&#-*ac_]ooo"bbb222{cccooohhtbbb###@NNNxxx```JJDClaaaAAAwwwbbbzzaaa 444wcccggguuuYYYNNN___gggRRRaaaeeennn``````AAAwwwwwweeeVVV~~~zzzXXXWWW|||}}}}}}}}}~~~~~~???999hhh&,,,]YYYSSS'III?Kst-2.0.8/src/images/kst_viewmanager.png0000644000175000017500000000247312277111530017313 0ustar synthsynthPNG  IHDRĴl;tEXtSoftwarewww.inkscape.org<IDATx}[LTWs.ÀEPDZ/dImrk(ƨOmIk6Bkjo`( X//3sf}PqP־|{?koiԨQm:@}}}dzzc+0ϝ;7vOB1"PX;n}\RZOO\Ғu\qrB!Cx5~?C7i5115**X ݲSAK\ݶ~žb䆆y6w2zvu޽Kij*aa>>aA4c YfuTWWU,_VUag2OJJj{1s'@;No?, }((PI)'w h 4VZ׬н^ZYTiPUUqPw+'7' 2DB;䯲!VUۙ͌).FQUu( /l3<6V #QD.|a]rZ{5;ܴ_E MO7x2)-OYZtډM45r%d|:$zY`(˒ " i+K<.ظޤĄ􎳵hƆ hnnFQN'7nt˖-0~<}` o718]6ҥK!í:7o uրdEnii BHaa!oOKeMFSc˜ũs9pKR^^b I&o޼yH+(+tvR YgBt5✼_viQƗ| I +5 ,2†} ΁!wc=g`ŠSdQYuݻP[Sc~Br`#G|h9O3)2ٟqߘCBIxk}Ͼq[tD_U~y?'-QgM:6 YӋ{|E[vv6W1O~rqL)3pΎ$-lۻ***4kt:Qvg+'v~ڽ5ٝ)p{$x#866֝Ncc%99Oexܹ֫:W^vMf6~0? ,K $!lqZ[$,RuL&cmJ)VUrggdZ}UʨR{8b"Z!-J{P):ۛ Zk)96n F9C6Q*L5Բ_/s83C}Ku.@:"^p hūoןE:B-nll,^bcWP\Es0{kI\.1<<k7y^HtĞall \z#廀Ӄcee}?BL.>a&! !J:>t0) fY& !4-mGGGB@!m¬:;;ÌB__߿l===]WOk,loo(֘H$̥%.,,RYq6YB)5155# \Ir'_mL8'{I-l *e,rOHuGFFaeYJ)eiᕷQk|*8q"z92R ֞d1۵^ߛ|>wcؔu%`؆G}'_Cqw{H퍐 `$B%ߏk;${z} m33__s}D ԅQ8Ecڇ1 _^֞?8wU=<㡍:([ bp J+Qc ]GFXs uB+5Jk4t:dVnx`08c1D%1=A{{;n.kgX\.'\NRԿL&#\N&&&d||nmm}"KGчk"BcYEm۞=_#}%r*IENDB`Kst-2.0.8/src/images/kst.png0000644000175000017500000000437612277111530014732 0ustar synthsynthPNG  IHDR szzIDAT(WiPT=MKl]n+4j#3`$h+Q 4:M*D8 %DDW7pp4HC# t }!0,Tw߭{{G̅ j4Ηw8م\mcggu!==e3 nnn眜@[[cP(4ްarɨAzz:\.ӧOop8EEEEEEuW]FMDDTQQAqqqAŔM{!"PGG G 1eYGccc$$$eY?.]@ @LL !ɰqFBBBQFEEEaҥN .Ovvv0&&f)S8 DYYkk,,,`om q~>yx`޼yؼy3 L;u`ӦM[dkkGwww5kL411AMM mT H$?~@2KJr `hhN7`3gNBRR.Hdʂ1o-_Lj༻v h] ~pp"֭[pC.}W0 Y5{f4$t*Kn| ߅ `˅P$~5DFF!"JJJ'sI2ƒH$HJZX%Ybc7PJJ EEE]韴6)::sr/\7`@II R1Vc#x#lC?!"[P0=?`t xcΝ;GK,!HDt ڵk'EGG_PT_mCzv6,["TWWԩSx1\\\p:;;qaܽ{޽{qfAׂeYC[':t( ^zEeeeyf|bYjZv-ҙ3gHӽ.V\A ǔFEE)rkC9FPPPpoށرcx<bccaccFAA222`aaXBpܷ&M##H$ =3raO`L:uX,VuvvUR(55i߾}TYYI 3 o^(||׭a@XXOD sN G/,K:4Z%uԮh&t"8Nn\^Lhر BDvJp, y2p @NNFwϥTv2TVVO ÇURT*-r~"Ȳ r3R?S雑  xzNtP*pJΞ|-o ->haRV<,Ǜ7li'BhB`DXpu/ѡؚ8._rQXxͶĉPQٳ~ 'i6&763=V9X\c0ו ϫjn%&MEMMY=ô )AAA33S:A@נV23rÏ0"W7p,NIBMwߥM.FAtat1M2x{.Q+e#.\Vy5jk%O+`ȑ=,pX| "E3P*s9V\O&[¥WQXT. @`i4aVrDGaV?ţjB_rRerrd0&)saY]Yȿ_4n#tfs8#Ϧxh { KB ֌[ PTY{7 pk[_dr:/>x5scFfC lPQܮ!//Xyr"u\. p8wOoN(%FNM]M't"1}lZ?ŃAר}\811ZlVKdI!%tCOŀŀ€\4[00GյYX GW3#ܸmNO+9KJ4Z.lWw`!D^˜0p$dגumTx~&Y?b Y juXoKmtzWdo¶AX,hid/B[)wQo!@&RB7M ̶@muc 0^nhɍfn]Ͽ70Q%nbm0qU֒Tګ3tZYgULҎqѭifYW]qP{h囌囏 ^Z+/_V`jjʺjM}f><<-zf]UѰu"CJ|0oeLNZD:!H(ӓuL:|AOx\^= 47.%Ut÷yh4V dm%ql\oz8v(˿rl&'J#m#'iG/ecK`LLmmB`<{n 255% I:$(dSV ǁu&/? ,뻾 ph"Sh)Lԑ7w:|u?$B`IENDB`Kst-2.0.8/src/images/kst_gfx_ellipse.png0000644000175000017500000000156112277111530017304 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8MlLQΛNyT)!iJ  R V MHBj!BmFM)N|㽙h(prs!_O37+"˄M&wkhEQV-/3VKk++7y%zG ZdӅoe=9оk**MK ݱs` Kd9l @v٦`jڶ5Vػ6erފD@ѽJ2d:t\F%;ZczK˲pt'TT1~9˃hC4Ou+_D,|ԛΎ7<0owPɬTơU*ݩ,ܕ]YZ\GXEGL]PRydO RPpAqɻpX"@DCVAM @H@8V u ioYSKu]Bzm,k?emόNo1Dq:;tGby5;[}9̎tdp /0&\<דfyyc;* s [fyo?׌ݝXԴ\ `\$HT\DAt?5D~9g" џqh"V5Lb1sw io,&/IENDB`Kst-2.0.8/src/images/save-vectors.png0000644000175000017500000000264112277111530016543 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDAT8_l[W?kڎ}ob'i.hЦkGW@Q4a2i44u˴&4 Eb *:U+c[,iرsCjI>a[/ ݛ3_&VR8!Z1hZniۄah?e.ȑ#W~v(||{h`L1Qa0 ),..>sH!BE֛${xcLnq1==H!H&RJo>2AEDQ֚V=?vH;,bqH&Bp}F͠ޱ_|qxRRTzeƐvV7(vS(}5:w߃Zk㠵g?YT?13  8(Q'QciTRJ\]/' ILg)@Oyc}֙DOQ{1ApbJ)o盏|=+\%rZkV>W ^1q:Fc3GVq3 ٷs̜gnR*spNOԨ}S,Fwit:MVq=μ}]c|0qOX,=sE3f*r6wb9h Y}յ?^ݳ\^޽[xm&8ZF3PJ122BX8pumryǗ U^ߺJ8BXFJA \ץzs_jPɓ} `h밹+m_E_ΒJ4`h81N 6𪷊jk,:4v%[5/osYl^?fЎ?K6nnᯫwlZk>if|#IENDB`Kst-2.0.8/src/images/128x128/0000755000175000017500000000000012277111530014346 5ustar synthsynthKst-2.0.8/src/images/128x128/kst.png0000644000175000017500000004124512277111530015663 0ustar synthsynthPNG  IHDR>asBIT|d pHYs `atEXtSoftwarewww.inkscape.org< IDATx]w\TzY5+{y&M11&Ocoػرw,XcC Ue){-;~F;3w9sf #"?cД~.>tik `ty_?t>4ṞcJDdl"Ճ] Lc:5TP&OƎ OOOT**UD/_TQm"}~sc.qhݬY3 !!͞=*&L`D`{*[Y  `,cl(D"ׯ6m4iRPrejIDԐwQwAs1  =={vYb@r0`FDtze~?!cB7\ Ǵi0h 888;nݺƍ"'c,ьD%еkWL>mڴyǕ+W }p0J =}X vD$tuu#GI&`ݬ8匈8;;O>1% :/޽{!+ɓ'+˖-˻e˖L?|' >ǏONNN]%ooo7o5oޜw}GJ|r5jpjDaƌkd0 $O'Nuݹy۷oܹsC,_u)ˉpItؑխ[]r>>>P"55 Ba5?D"##߿_\¼&Hb3L&ck֬kԨA/_,jܸ16n܈_Mk%êUPNֹsgv@>}pƉ'pIT\e˖ūWsNy71ۗPI&\t]t)$ڞ>}=k,EŊ9wwwˋ9r$b>>>׿E(=<((www]󮻀o4/qp ԩ.]ۿSRR^.]⃂H(/UVGDD;wu֑5JMM%{{{@Ν3gСCU~-p Сt֭y͛7׸_|oݺW(tRoٲoذ1ԩ:uf͚E$J2@#c>]v%[yoܸ1'&&f2y)qRF#URJ%YyyyY2,+777+;;;++++K*ffY hO/{xx /^hLZ撵chTti#ÜJ*C<QRRܹ(mFYfӧ1F1믿(++bJh"@,% [m@ 4{H$Y'OjM*JTTpߟ쌕gooO .$TJgΜ *P||| E]v%4vXINN&777b65pJ_`t|jjUqj@nn.jRՔEyyyP(($$5kfVi4m4@n22OѼiFFq$(''[PД)S͍,YB&F/^e˖JKKlJJJ"LrmF]v6Q4۴i#=|Tfeee2Hdgg\.'ZM oQʕLDDDRhرMi„ dgggE,\LT\.7VC^^^ԴiSuURZjlѢEʂ J*D\SND"1R)wI; rtN"1-[f3MPPʔ)ݻw#''w,Y6ٞ(3 zs-bnݺ`\.-3JYoРС8q.^Hɓj92D18=eddL`o$HhʕzOhh(f͚ٔA|I PlX,)cLڥKٳg_~+ʔ)D-Z PH ƊvZ*]seQRJ"x ŹHhDׯ_77 FhnA}Iש _]A\0gqj<O8yf hx)SKbDEEիhѢEwNz̘Qڵkj*8pnܸa:4Vy;vL־}{ACVJ""mF3ʚiCWYz5yibcm!ӐBKy )佤,Y:IsRev&Pzߒew:NgK%Mn.={4 7qZhTR)H,WJu~Be˖8r^%4΁*05jHk-Zdz[KL&c+V]k׮]Ϟ=+&"… s͛BLP gm܌#oJe*lEgMr`nܴACA˩858^SC˩!;= rqAʕ!0a "2ֺ!0bWPTؼy7dH(-vXl9X7& Kb?'OX`֭S: 0c 5 hذ!`9AƗ] 5}O x9dHCQ@΃FiuN Z#EPP߳]x;vSz ]x:J􃓓#6nZ "'/z Fu8~"__F~GY,Y h ='fUrpi?9ƖP~跙@ڵѹsgc]_yyyVz&抠^={#O!tj7m5+o *B#Kc쩋KfNN>hڴiJ5sÆ +~ߛMi I~(kxgRF6uϚ%c_Ѫt2r('/^f= SJ{G)/(1;:N.ŝvӞJU)/%m[Qak׶G ^5m_EQ3UL+SRt<_( Qҥ 2W\bb3gZg Cr12^@ESM 8?~j3f`֭Xr%5klʜ61Yߙd Wi@b?ZBkpu^!@%CHnʘFʲxa(^l)iXYhڵx9N1oOVOЃZ>EժUi8(@@jX<ݨ(PPzg۵ksYנA{ cСV^m܏_^PN _J"AL.%YF]wsg{hr|Ahn-ٳgHTSi5 p*xǎ Kl+ P' Ϟ=Ԯ]}fjL4&[G9:<;6m qqWGEb]=?8.P>>GX^۷~oLPū l8rS$JƌFMh1'(S>DÇW_}W֮]#GGMj@ QG`B*8CqaҤIxH9T2 / d/_>SX5L 4HZQrfƚ.-T,X>F/^L~~~I0u lGCvҫxz2RZߔCi(==SjJ,%?BӇ>}Jw6, JRF-URR.U(rW04YK&IIIa0$ܳgL(ïK5 +6'/D ddggCT믿Ftt4\1nHu l߂:1vb!rqN G5pyhZTZʤax@C= 6nܘk޼VVcjȀ|>x݋aqBCCjV! 00>>>zEV.Gzu!rqnn@h:U?G(4~-N8n@  ``YBÂ"t^^8q~Eg!" ޛ"@޽5+W333{n(N_`=SwG8q'W *`ذa8p nܸ{{{1w гGDW[ s0ND EQ@B3<<$o J* ͇ͮMNƘ,88Jz[3}ߌL-...([,~GԬYݺuCll,D"zpDDD`yި BR42QQ!/Of[ YL@SwڽD|H)S˗ǴiPJ\ŋSrr2\j׮ PhA'6mڄ~ڵkpppȑ#q]pxÔ)SXU̙߰8::TRpY 8K,AN888 !! [o5K0ưe;ӇsH-[fU $$$dD"@+qKz̘1NF*t/gddNDٳg.]y)sqq ЫWhdggGIIIE~GLL 2e\b\?|poooE۵\ÇCr -yCihF 0|{c 1ǫTw] &OoXO2Zq8y$}qʳ ?~;wƾ}0sL+ ///̞=?oׯ_ǀߑҥKcܹ8y$Jqo*Ua+gyPq̙3vh܏)31qL] zn)SP^=̟?iiipwwѣ!о}{nJBJJ }7Vj9cH3Ly @ k{>؊ DDZ"ZT*ٺuƛ8q"##QR%P(Œ%K|r^Y:DDX Hd_mWWW{hѢvaЙ:u*?ףo߾f^<_ѢN8Ó'Zl i<bCO )S -+7D}M`1icLrJ2>52eP~4n7?BCC)..O7+ksrrH(*C PTXljԨ :tcǎzHHH02:$$sy;5`Fi~\2Μ9GqDVV·]R!L9  w:`_`c[sFDDa7\N8'O֩SG^dbB!Xl?~˗c˖-0X&PV-`׮]c이rq9'_0r0,Z!{{EFJ@jF-z$A`2HC>۱c\XhsΡ[nY&VX\bx9;ܾ}йsgjժDU2wso|]ѝ={cc_ ހ^:  ؔ@ 7y4jJIcu?oǎӵ-0gh44l(_=pJ$n^|ח9QtDݺuq%ܽ{&L0[ۮ];36H&}y-2L%弞>G/«'8}:P 2 pGЛcl>6l2̅8ax},[ܹhH$5jqM[ϟjARIjH "+CSbY& :lkXM- &c`g /_[67W2X3?L """[޼k%@_|׮]ܹs c{{{TZn݂3ܹ#G@V@@ @JJ:n޼-+ʄ0g%e{KXXڴicL&9s' GnnfBjj*F.yY[exD`xkL{WCоbY3 @(Êt0/]a& <96kVM`>۠һdddT2͗f pssCZX\\k=qתU -[$"qIdHjzf^IUF~CˢCpp$3϶( XZgO_si2K,17@^^*Trrrb $- 0p2x!4v@6.3$*ik4~sY5cx]vٹkKHKcM ?-_T*٦Mpĉ$Q,*V;wxE||1 糨cϋOkvУ8ܸ~{w{@Dh?4 [,D~],2+[ @uV@k16kݺuN_A*_<ݻw#< _._Vxú}Q3q DB_Wذ&c& JqոN,FǎӻVi+}!RM۲W>(H۝2ȑ#VL6v4 z w_CJ seHس8b c0V &MoܸaII&,** F# :ڊm`MIasXO'W`p4XVoU:!us,|B@ 2yg'GK)9ٹ rl?41bdd$7n\9alԨQ 8u>7ΙvR5Xȷ ,zA R& Ob fD@ & lW89xXm^Zń @:f޽k֬ k 5.^ѽWG(J3ɕaʘoP'.;th~9bڴiY Z-@gɃBNWȕ3Nx.|"B5K#M'orj*TwQsIqxx8 EtttiSq%9t J ׯFҵP89;!歏 j Fˀк]dKsPR9|(b1:ujAPv"<-Nj5N9<[󼮿Skpn 97@$Wg tRt3aɓ'k֬B֭x\ 1@KZ^w_(caU>}{Ko 9*îP<}d.N=; W2@DhժnݺܩS ZᆿBƍٳC,{̲e÷/])8},YHK}'q4u!ЩS Db``.#  5 <2_Iqy;vh p2=y7wWbn7c` ```|V.ΎV1{8\ļƍSO:188xD"1'~c^Iq4TP$@z5-o2S~wjag#=d#бc;56 'zN,߰'7p)\ ꨪT۲OқH N:PT[Jb111VL>-[ P*Tܭ ~_oX7W/݉[Up,ΟfֹbР~9bUXl`:M.\þ'Pߣ{K6jZRi6:u'hpQM飔6l?߹s'ƍg1є)ShŊLPaa=Q0IRuA|={"ʔFŔѿر#i@ptt0a:G dxGD8z/_ B~~5A=;[\#cpk@Si4f׭[cZ%V]tѣ R`g'F}g!FLcڴiPvɞŒ7b($wb-h2o ,/CHNNT^ճmfW^xT㸼t\z0PNCTSLq1''5#~2ν@&M0y$ѽB3h͵| ䷉—;ᓐ`j׮iŧʕsDWotd$6+an,t9|yCzǎ6-4|p,]bBuDb1zqQd柷gh z؃˗#"RPC/>":OD%:c`PuxcǏ!? ZhˋF?&1;"7><Ök< @|r^= eQdc@Q `㤤N8!##7m (--ݠ5_n "z熛1~"""[g0Ԙݻ+WcRcLMD%{#>6*<xt{ܤz"IyjjR'ݷoU+éZRX,Y|?M07E"QDm!A*bӦMXr B'n$H̙SJ'O$uvv΄ſkx 81ƞ*U*SPHHzi.]1`J{Gub0嫯BTT>|hx!nQ JnCAg }@GckA7ֽK?áXAIENDB`Kst-2.0.8/src/images/128x128/application-x-kst.png0000644000175000017500000002163212277111530020427 0ustar synthsynthPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy|Eǿ=pNEaKW<@AeeY<WauuFEPWATDEP}\!$LLf23d3IuWu]SQ]U- !wyj up]L{.+=裟 DBB=M4"D8Mn\eTV@ XylXA$->@T,KϏ{; 6mv Jzڟ8pMBnGUPX!i`b<gēȄ!;VEsU"5#DTn].8:GF&pPdS|vsqE$.:~>ʜg)\`nPm]1/[qQhUhb Z.8A ز߅%8kz'0I"†v\_ʆv:Wg5epU@AªHo>Lpz y--oG)s*xDTBHff$OwtG-z=ŞEP% @ME6ߕ0B`xo&3h:Nyp|%@^̒%!gXJ d(s^]_ʞ ' >|x`,/\tYjZd2!I3Ta+{.uZ8T}Iòeː\F#b$ѲeKvbk ѐ?3˖- #?\&2"6$I)uRhXQxQa&1KcH*jA mU""5TjDX&"QF{</*F`M2Ӽ[a`dށܼ%Kжmۀ}b戴 Gvv63f̨vueeekg$Ʊ` DLh1tPVZ̙3IMMe͚5]A1j(K.] {ƍ馛0`[lobsTvٹs'?0]taϞ=ݻm2g<ƍغu+;+dddдiS.\HVV'Ndȑ>}\:u+BVV#G ֣"Pѐ&)(k:tW_}'2tP}vlǎ4nܘaÆQ\\6lM6s9 8I&1l0udرcׯ-[$33.BMƐ!Cҥ ͛7硇[n2ft1~7rEƈ#(--Yfu]Ջ-[Ϫ1MT6D/^_dYŴiDٳG{b֬Y";;&Ekؽ{PoaÆbW\\\WTTrssũS* zݻW̝;wB #AӅ]t=X kU3$={Ҹqc ,71Vgf51v1.]J~~~9p~k?^VncDze P QU1wCu8kҤI 5~nbS&In"/7FaB$ҨWZ0?3ԙ@#Fرc\|3x(yt#I86}]J~>6?vn|tTxׯZ OSFbZ>Wm) R?ΩaWSP.۾z 9Ն+\Ml۶iV|LQJJ*]IB?Eeѿ=\]ZX#.B~ڵklj2;>w+<8xL&+!η9?OQ+o 17|XfѢEQgDZn͸qtP9} ėhI2"RbNIr)W4c&{U+(,)3׎uWos\H_m#F`(/ ++m7V?7fR|uh8! $n@o6ajH'TNXQPP=qT׊U=MpE@ Wemw_C/Az ?DE 0豞ɻm"Kٝ]8\V. ǎ#;xȲ -7e$yU :ziOKi-$9s0SB.aLޟhUrn9-;q.< Yv]x<-ݻtH aatJ'];Q |}%%@l߰e'7ɼV%V!p7oFǕNROC 1 S$6Jlm[ZS D Mf=JqNJ6}&ma/Kh'(dfDZU~z8`NNqf5mV6jdmY֯%0{WL&.Yܦ>r%ny vx%wdsإK2ݨ>x.7ꫯfhw@P ^ -"[:5nLǎ+Dv:Qra}=I wn_bݶS)h˹$W_͆ <U _F;$#_C0(:-.''?r9Ĥ^ .KSp')<~Gk$R Dz=8]'cXN4NMo<2s70XESNQ/2ΐ!wo]W~J\u ]\Mmذ! M۫Wſk|*^z)999 :4U2/GߧŇZ9)ܼQ_o sqUW:2"mju&NSf'ݷfͨߪ%)i-iж;`شiG@Qd?+Yڕۿ?ƍc'uqI46V'F^+2* [*c87o3G_%"4S$_LwWftЁ^zFʭ h-*ƴ*3큤CeK222:~1qW{e޽6]uV=\TTɓ'_~'ݻu_tRPP$Iő3&//HMM%>ޢ+Rw%@]JRss//gg-}4L%Nh#@F늪 %ءl=zĤQιWj*FQlzD1cu5]2\DP <_.%>1!W])+DYeZ"/EEFa`  ^v=rSC|+]m4kK|;_Jka{. Ál&>>lc T >W|O_QZ=B7b 2vIX,X, {!v_U>螺dK_0B׿.џ12 6A#vv1L:#TvE( p]w]3 ׇ~}{x I*NA4yEQp:zfY" I٬YZ<#̞=Mayᇑ$3f0zhGzz:K,aHĜ9s (..fʔ)ˤq=0zh.r>Yb ̛7$M$I7S2x`6m믿Ί+$3gҦMNڵkYd㏓/,YK/d:,Z!!Gg2tFH&==QFѱcG&MDVWɓ'aƌe]FVزe &L=z0n8 Xx1]wm۶eʕ >2b9q\yL0Çӷo_ׯ`РA <4墸}0rH, ӦM=rk$A6@0bcW\iaBƍ[n[nE 6aÆ<nܸkw-?hk׮3_} O3x`os,^7|_ &Sjl o<'{Ln2]ЬsZ s 0@7Dj8)Ʉ4gvQHqŅ~;g=[-к6-GN$>:Uܹs7l3 MWfR m$_h[5RؐjOv$;c0q꧄‰cNvBvdUD.qVJ'λ 9Dn_?PqP[.dZ0P+^ 7eem">@b'qňFy?FM$*raJu&P_ $ V?nsЫyjbʃ-?$E *veVz?@ݜ 9}P&o\=Ĺ:S^fBPPM3Nvmvto֢ {Qh4PIլ᠖lmJṣvN$p~4;R)om`DˠP B /.^ZnKtk#8r)"({giٸ$ЌwK{ٰē/wb,mLفׯVW\9zr#I۽/C4m֌Dt0jjnvBsL `Ļ V^fhK2C>hu`O!##͓Шi|IK?_J\S +Ea L&6l"_,,msE餵l9i-^4njم]x߿u\_"Z}' W:N&LhBe.]JIII,]D«p$(p-L{}jaStY2oͪIl6= Bg1xZ%BR}3$׏#^) 5vWz ,|r GYfK[lI8t\=T@Ӕ7珳܊8:%hiLsvD&-&dY棏>fTF|%/ kj,62~|sZ}ȥEIV,6@}w&ia@&Ch/((>}y(CZ՗gM#e_bV70mvp*,;woϒ5ߥiD"|e 3EU؉p^1W Iл ~؃*cɔo vMY윅yU=퀞ٺe;f`(ñ#(^#1dz|sÑߎq5wt8P/<6ڿh>xxk{l'vpBn7+VmMcO9{obr2fάWBpX6kY))˜Ya6ط7dYP#xG+~9pz(nLY9^#1)YۘzlOP_fS{cHdep1F?KBӧ (+H@aYYr%">@B|Ҭp-Ёr=Gfe;*IA~1Ǐe?ܶow9}dg!=| 8*p$b?xXjj?>Vՠ2齻?Bu$IkɼۭP4LR@df$ IDATxvNW[&{m$asJo[U@8EQOF|c p嗗_|ԢkϨ'xe|+?7Qb D!\,zjF|3x|w =l<ɇA_1%;1}LxϢN|c@Q!įwMEjɲg}FqqqԉumujI#Q'dU">=CoFx<>#>ԡఈo 1~W-%ߑmH<EQt! 駟70lQ> +gO_^kWT|i7`z ށOos(7e/Ɖ1f.),6c2?g+=3~%= |8! `^F3([.fćZRD=_~=Ŷ2@P(`Ĕc7 8 EaƍB|8+b@n7RZZZ+ć 3EQشiZ!>edYf͵N|81qe͛ZN|81WG:C|jbnJiiNκ1q%CO #B۴QgmDze KP;wzN8!!⤳z EQuP W9Ց#GbY$Ip8^:IENDB`Kst-2.0.8/src/images/kst_equationedit.png0000644000175000017500000000207712277111530017501 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8͕[lTUgz9ӁJBO6`DS>`bx0ш%>}1D BmA()W[2ivSRMJv˿{R"DJeXURHr¶I+ 6NͿQ!lrbˊzxZ}nUSs_WiG(: ϨBMXMj9:p ru._6?)'rϯPX#x#-K;(k]]]% Z! ϡWs93l^MlkSvnVt<~E<0"Ltd?GO/j$[CW_|fGxw*"A+A&wݞ;ٶa]Dv|\H](2^PA<=:Vd ¶6$Rpo1?-ӡr\_un@ў!Tw擃%)hJ:ܻ1ɑ5rkFKsn&웉7̄*6rψ,DZHgV:woH%%CZOGG55$Z˲s"$]ޝ|vloRkŭ5Q,j!9AeH'$J),R~?4M< ^L)ei,0ñ%i}NSDDR dzz:vR_ْMWd>D~5Zk,ˊ, ҇p1 >b>8O$`vh(FG8 ?̅緰=!HY@a. ˕0B?De󽓴O0uuӧٸ_,-)ɿ\ͤIGGG"1f W<nCi)/|l(ZEh& ›/PY控>|~m3rI۵e'Oʻ0^,ˢ~G.OAxٲB$ۓm6[Ҿ~wQ^M_D1b{bd eoYifIENDB`Kst-2.0.8/src/images/tied-zoom.png0000644000175000017500000000321112277111530016023 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsccΖstEXtSoftwarewww.inkscape.org<IDAT8{PUsﹻ3\^ ,RB%#jmL hMҚ$bg,JI%/H+"YcW!G0993sg!0Œg2 d/HT(UlO[7\.B9) k%xut\wтE?[2 !Ϛ?>}sD[l| #Ӯ֫y*(` ~.\߮x¯?]r]HOOWt:x0#<_"lXYZP(yV0 !IqAa BCttcDZ B !g_ngV8`2yri6耄 0*PeLdY@lR4oaN&QXhžO?$''K9G-.Kс#20 0 `EƏr[>R( Igά޴eXyncL&É@"14]1\|81*v5k" pឃ_~7;#c%'#EQP~ %D) !C`ݾN3vCCeFqluMrEeeB^## &u">ADWEBƂ0g1Zi4$TSSgXm;̉ڻgn1l/mXd*{qUd)D1 eqӭ֤!,477GRQz ^|Uqwڵꃪcwwo=|z:].Wb|jy^7G{Ja^g7o^:1a ^؛0"Tlrw߭jw*1BL|ggu:Վm6(nhm OM$Zp为1x3ȲZChE)))w*+)>}q`<La*nK9S}K!e{DR{unV|yYm-p ݮO8FF!_ѣ(̩'v߷T*Us\Fkt݂bXOHIK}e&CL&E)znazoҥ*)Za'1c(rl{{ςiCKyyJNظh%wekhԩ*̌ Y6N5;vfSqqXmP'{Av@GNSH2NZ:hκ!OŨT ϗܑ3pwjj[ fQd6FY :_2IENDB`Kst-2.0.8/src/images/kst_eventnew.png0000644000175000017500000000104412277111530016632 0ustar synthsynthPNG  IHDRĴl;IDAT=n0?:.CHG؈FZC>BJm(@OM"-VWqZ :٬㥐Dy@|C $1!ɜq#oөjP.C Ǒo8siGq|nq8=)@ = bi6TMz1*dOpѐ\ADG (A}%Fҭ{#2x})2T RIS zƟ@>yAv ##L6TyDm=|>ɭ>iɚ|+;suK-qmMGJUy_j{H:ihOAœz˭piNMp&+-s8+^.A)/voD $IƍhM~Z{^`zof]b`>rg'Zs(Ʈ9'6o^514+y2_/IENDB`Kst-2.0.8/src/images/themes.png0000644000175000017500000000235312277111530015407 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<hIDAT8OoE3:vcI[$ A$@"/@r+ 'q JPh %AmAU68wgCWMHygwx|qdc0ƠRVYǙqX\ !R"胵cPJ!Zk0D)4ٶmyƩ.1Wm#,/377Wm<޸8͙8N4 zI&q*FD0B#M%huԍ dx|KJzA@զlbwlJ38a0( ?am> (0THTr˲G4lMo2mU `@Za'ҵִMvU!ra$RVgwʤÁ0,^F C*'T"[tYR qUf/cY!(5n XxL$e @*IX=Ų#+RZ-\_&tbq7+8g~6f`]Z=A|GWu֨@`F11L*{~!8VH> ѳD fQ!h?!a2)üYy]Y~$QG~ǹRHV [:.`Bh'TzL2O! WtVNDf|EeӦ݆^/$ # H" 䭛Ft\dlAuom$aNAKk˲.;>@ AAJ,诐v 12 !ÎA0d2z5FKZ͜6` d,)ews\=L#1N,!vX.[O1Y[[ 8m^ W\rg2KҘ2 C㱚L&zիW~ׯߜ|} R;w)xYY0ʽ=>硵ivxZ]]V!ԅSSSb8lakkV.T*߾}yz,camqIENDB`Kst-2.0.8/src/images/kst_forward.png0000644000175000017500000000235612277111530016452 0ustar synthsynthPNG  IHDRĴl;bKGD pHYs ?@"tIME 2G9{IDATxڅKEUvwXdv bA$x0z'c 㥋>c;Fڦ}=o<]ɸSxB򹜏Ȣ0 M 3aw~VٝeZI%U_Wj<-~m; ԁg|sF ?"h9J靽o&Tʕ|U{ݽUʃy~2KPSu*@ԉ @2K=R6p2ֈ0傞>MuRŽmAsu v@\qq݋9 ੭[용c+ Md8:z ~u忌]u v,.ֺᕚs0IC&nJ(dAg&2noxdݪ+VR_tmBy`1H$IQql&IrR(GA>Il)q[ RS|4AxBз+zmG4ٌH OMM=p҆V N3l=t|!tѯfL!DR.WGeOՑ{\8߷o4 3_MBo8ՙ8V:nVN[9[%rp' z񥅾gq;e=Vٺ IFIENDB`Kst-2.0.8/src/images/kst_gfx_polyline.png0000644000175000017500000000142512277111530017501 0ustar synthsynthPNG  IHDRĴl;IDAT8ke_9g-9j9FI)~QuӅ؅1 ƛA*DX ,el9sypilngoxn6#7T7o|# @~,yd;Ya"<šƛ?X*#a̮^|=St*w.ͶAl;o-c&T})|B.4T&=+o;܍y _@G[z;[F؁mFq˗6i^;wjۤ%mw3xVS`75CclU,Ͻuw1ol[^KYKX8P3*Mgr> ؜z@˺7Ncl3s~O<p?i,,ĺ' Ow+ݖv a4 s}bXlDzxy=4N "b-K_~Ş~{KW,׏w`oޅ<?+ O#,ᠮ;56Ty:r Sy%P[I&$|$ yc=KvEs:^ԉI>.`gVF?.*by{ c+X5n|ۏއ?|>kbHI a-c'}׽̤ 1^tRIENDB`Kst-2.0.8/src/images/document-export.png0000644000175000017500000000147112277111530017257 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڥOSQ{}DkStЁ2 &A(F!90( N4M00Ib& 1c AhQ㵶^Ͼ;xsߞ{_%!m]\\&A3܆,K$)Q 57HzO C`b0pzd2@ #M%OH/0 Qh "Ȥldx(O0z{ o---%@b6`uWWB( fgg^oxqqtIyU0dJp{||}4M4 z Vx tOXV1<$33_> H ^CAU9&ZX|ݿ: 8<;1q A jp|Ag$'] z%_e׬Mr\[ '.(pIENDB`Kst-2.0.8/src/images/y-zoom.png0000644000175000017500000000215512277111530015354 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDAT8mL[eZ`8AfJAc2hqh4dCY2# n,̹e Ȉ 1NgB- lo_}@ 8^Or+Ngtlm!t]+7!}0!x3)] [FM1UҊZ_oE(|VS.xa#;] 7*0aCj>0-$ he0q`yZlW^x>c,3#iPe<-{ A"a?,fjfI.y7*$Gd/w8 R*iLo\fFb qMD*^ux@ÇGf]2z{׹'ꏱ'ޯi(68$X؁wqn8@WW*uXxxcη1 -u">Js(X_|79[GW=6Fqr ~qÑ<E63/sZPp5o;9ܴJQ_Nx3D7 6 ͯS?J3g  WA 5aMRiC z*sCC̏smn wztA8魔@ݻdhS"8p9JUaG('Ov6*{\)l}=ӧiq{U0 @t^UͷnU j# = CDd+Hċ{,N2j<IENDB`Kst-2.0.8/src/images/x-zoom.png0000644000175000017500000000220512277111530015347 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDAT8mL[U{K_愊Xܖ2TATl-}0&nal&.QgFc :T *eAK[eDINrΓs"*ٵKS>mk({Ӭ^)6ߝ? Uyf3˲r&$'Qm[TcPD8hUMo@ϴ׆q>-8>+xOU_LV.MZqVYl~/۲ShΜz/Ȉ"քdzL@$" Ke[[١OYȱe<,nӪ~ c3@(!,U=d'(]B0sؕ<( 9I FAx}0{&RB>Y{Y 2l.˧BKww߃FIq6;_JL1n{sܺޱc675sC˗[G$?޾W <v'*B0V_&I;?xG=e׬+ 4ֵ(͙Fsui4$ʶ_}$%pěx=;dW-VJ8;^rߜX'ͣ/l>ƫL޷$< BpvK;lTlx!"a˿y>< 0/]+ Z N ;1w9;w4B q2(anX&IzbzOM!%bCwX(w(`^\#zN֞9|.]m l_CsinDhc6LX?\GX,r:俤71~G'-e0K4,oEY]W=C3tz(%:eϸņF 㢟^p]0W@eUr`X-B{J̲@fjsYvTY6 SG$Rx[ӗk^~X :MkfBchv\S|yj%H90ZbWA)|| ^ Vץ f2~0ʱx,o}9 Qs5h\qKYn ,RT򆼊dzl( 6Uu܍-TD^TL/ h-ͷ3ۛ{keF6S 9/ ^qaO~9k@V%T+b., ykt^oӗctK^zj &XQ 85ݡYU/N:6mcŜ~:@UAU&@0eryk LmJY,30 .,Un8lDlKu#:TԪ>֡%"RFamd/7u1&'qyieDJԝQ'ohQKS7t46f!vHB0@飊K0nˁasNCxwoqgl)ׅשT+ʏ(U :fb107ng͂ϝfD%@*$Jߠ.7g`x/y#{*/XT7˅Eo`jn֜`YL ')b?\a7x.L?avPV6?#@ccSogĔe't!\G:eY)^ \/,PUT9b2L M &ɼ|?_胃@ o&&qv̢9&4Ϲr{6½ rD65G+ ,vGhT/Aw04?IENDB`Kst-2.0.8/src/images/kst_gfx_picture.png0000644000175000017500000000070512277111530017321 0ustar synthsynthPNG  IHDRĴl;IDATxŔjTAFOiZw..|wøpΝ".QḼsqdEuS|>|>은][_pJ̛a69e٫P wfpj!%pK%ͬC,΃XȾa =a+Pld#ǗiD3ɻ|a<ɣ}`x1 4D Oǻv Ysg$n쨵0)Ӈvg`im;D) ZRT5ˬ)"B<=$?vrvR-VNjؽlR2U+"w˖Ӂ UW~s0[`Yhc o3. $mj'u#PlMdIENDB`Kst-2.0.8/src/images/kst_back.png0000644000175000017500000000236712277111530015710 0ustar synthsynthPNG  IHDRĴl;bKGD pHYs ?@"tIME (d{IDATxڕ_U?~gY1$f$he(Bɷ걇@z=={XI:Z)ؔFr9 aՃ3 2f69eS3j=[=`7# T7`Fh~r} Q岙RANJ!49 i$IeW~ɿgփ8Wع4o:‘T ,u.|YsQо0bcC(@skniنe,۩AuA8eH6bu%OBPE{(9PRvvguBH;a`|7͈cHlA&Ě93D}:$DQVץIeu`ickoWnf&4)W-E{22}} '=޹`m;B'boO^/O&|mt+p7{T>ϻxJW,b_n1hHڏzjvthζ'hS^Dd.Hjtg.^,/Z>rZ}?dȞgӉ2MRr>:m._Sz;.mQxy&4ݹzcYh }2g1LIENDB`Kst-2.0.8/src/images/lo32-mime-kst.png0000644000175000017500000000111012277111530016413 0ustar synthsynthPNG  IHDR szzIDATxq0jHR.805@FSreBt8QĀk^zםпc=[q>֒Yl>pų{LEG!D:(zKaTM[o&3 L/\14k)I +<% . ?o#,GU_(Zyܣ`/C'M:ziy`Hxw8u )*"*>}/]+il{^Qr/\X {K %FBV ;qUuX+sTCR3Nٞo}C`D~;Ǿ `7^]'l,,LbmMo\ H)0ce~"η%a;77s90CV95P8`\'`.Y-<#ƍ;_= +<|.׀wզiQE#۵_wuO ?m2Hk-4[-{ALjcG8yHO=jHlsOSu/`Sih US^~ݣIENDB`Kst-2.0.8/src/images/lo16-mime-kst.png0000644000175000017500000000045512277111530016430 0ustar synthsynthPNG  IHDRaIDATx D#0L4>L&=Q['EWY f+}{3ZJ1ƶ-5%`+VUz1p_+3BS[1 /ض ̌R7ۅhJ) E9;jq5#U}h)E%fQsL'h%ZtlGb4_@GKa#LoIENDB`Kst-2.0.8/src/images/kstplot.png0000644000175000017500000002156112277111530015624 0ustar synthsynthPNG  IHDRK IDATxٶ8 P՝_ _@?3I2c@ J'H`(@`(@`(@`(@w}_dТƋ!]$ =[{,P<Hyugk9+^🫟8|ϧ\v)0i~8YϿ^Nm3$#%?+,k*I<a@OaB"Oazw P ~j~"+f<Ʈ5e/SЮ!t% MYϩ0mۻ"Axu[ȑR6T;0oʧk3LcA)+| ]?b/lJyt Ȧ {e`Tk𓪭J _#ٔ!N *%@ \ }?t2l* z9tT.A3hg ֥j,X [hcba=XɗR&nO5q'~/!0# :/p=l*2|xdŶ"]rY{t H1n.þONdwW~2mO*Iu8j98LʅztH0w3𔹌͹To>N+lsa7}%5~&~wӯlt+%.|p|]NEhvH#]IJbvy t] CY`KUU<@аFk!u)Y~@g"qJGb,a<ܭ[^uko#Y\V].lmkYUVGjӯû\l"3+a~5h 0R);bGtg/Ed5&ZbdCVzwNdnv@xr8G%JKTM4oP29k/JZZCwQ Οƍ;I SQ{{8No~ǓgfՖho>ϓߒGTAC‰O:¶B kt73]QANXN"CMЀJ(C)EC[`xpV1 t:| j ?`h^ݹ$b:Bh[J^Fa 2)_1,zR+iYZ0 AX2q#4Gh*GG؆CW`أ  MݐtcFi-Kڤ7І 6)#a]nYV;>k kŊ< |d=14Тpc50o55ِ j1ÊٜK'7R60\y}'LA#ldq 5tF=DyϷPOq)U8zT;e4ZCS}&nEW`*.m8>t` c%ggQrƜp<8}C.e±MppE7r$NL%ZA??; Ԙ_| I2ݭK,;#x09M}O_I^}Lg D<߆C^"I;7Ǟe8 k$,abZ.G>9tv,F¢,`]?CdBo7ؑww[Lp~`7W)zz19:=VyFXÏuؔD^N_3"):Ov֪$蝹Mɛdk.pץ58T ^sG@!ձİsa.tY^0ͳVVf!G S~~{wj*ӫwy󸿎\0r'o G)җ6֣襻_AtT׭]wg^.3%‰f ەk[W8ٔqjO.nԯ-нt+1VNT쐟a(N ^ }K)f=]{ o06}bߝ_>WՖ8eJ ՓI끦FwR mZlw_Y+g~7EѻPE%`x+*D 4\fHFnczx%؞[AUqkl.0m,mNAb<{?vX2ڒG*)>Vi7aզjLG(CW^.G?rYM?ۿS+dq߱nojr5:z"͊H9/ :]É{%U)5~]UfM[r0-ҏZAqI~t{fJOdz*Ld w^O7b4poD Z}T|SkK k4޽0JaIIu%!,w>~\g-(Y+hxow[wYrxwj5EgJ {=^so^5I020Nΰ9nXFW.;Hd;gCdr?M:|^V{!tևkWNZrdXEB:S^۟aXYσ|l c))0^ ԾÏl0eK/3[\@\f1:_WM6%P{ ~u]ٳ!uEH2,+Ğ de WGq5(Ph5G*h#aA\3ޘs0~5C%/qְ}!Gzp q#aPx{} _kǻxU@Gk^wW2Q%uktqFz8Hyt 6P:R}G`:"a-.7Th} P`N.j, V`r!o%Ħ3?V&[Zƈ8iJiK,C\J>eU穎MVkS~V2~s y7M[1x,}ðwcJIO4oq%R/SصSXgjj]x2Y!%P@xNaq🫟/9l}3n;PRv~@n}S?Q[!]$ qw UVx]6&[w} uíDK) [g _!-r٫\|GJog3w~cpRܚVi:Yxv-_9/,93[m"KM$*w~}+LfTgqؗ SיIʸ%B Ei<YC}7_6ۮ+e"+?ѕ-w'){UZH|d7E!@0@"m4/*]v=f>yY{sa7nej y6a#)ij…zgpYx;,SoY__.9-3+&nTЭ!0pxDS6K=-ofU^Ve,WF~UҝSPƁиn#̹`(@`(@`(@`(@`(d &t+BH-6R=%q$ǭM[a|ɔO#=?,Ͽ2!i,RHWTT{&JVޜ;_g*h]GYof_^#ժW,kM6:0 @0 @0P~W #,B\J?R_*%@0 @0`6$ nHWu7$]B/ 04TA(V; C+>s rXPƂ,}-g*J]ؒ^!÷wn9彯wpeG| @0P>^GjK# u?]:!?ɳWtCTij#w<k#+;`5=<(H7Y-*!ˬԫ Plg6O0M腸!U蟿y0  P  ZSglfFw+^KiE K7$ ,KytRꟵ"!.%P P /X;,'d LGB|=/e CQBLzd w!UPP)CQ$FXPf i}`gg*aLucX +w?{shz\PTPzsΗe]ؒPNo^v]7+hz!9kig*0 Vn$$@ƂJXPǂ q#n!B\wtH  ȦB8ݐ>(z"PP:b(JTCQ穂`(@+hVo(k04&{/k0(R0x P-g\i3輪Sw P+X c,wKO^6HG\ZWR5 jG/>ў tKthB/tC E 3)ۋ5kEԜGYJ ii^a4%TP\o  [iP x d ̆B8!}3Mu .} ( ZQB"RƂwS dSqUOG%AO$&f<"@0 @a"|W;pܞ6%-tRE1ҭ^|j06>sd(PجYKXP"kZJo%=w cV!*ԩp`+@ _Y%8|W){Yrז~?אR|6{ٵmDF/:gB(r\XuC'%^vGܵ]oB_rNx\ il5w@XNZCYpArzu ِ"1[X 3EN\(\`K]+tÚd2Q \ɉsaj..>O4JmV~M"'tCpzNf_^#k]x>WA}?z*V>. FZ 5rOgY| о_û\[Ib#)auةڎl&՞ {Z&=/7wYl)7UytN۾GZ]򞾵ȯN)1YW3.\A {W唳S,*ʿ.Vץ$ Dl(`a70HXvX?YvwoٗFt,-Hi"DSh;JlmkH韼tL^Mi#ZM)lB+;uHCCQ.p7qbVnt6[<0)ǓIʵ ]ռ )CU?VܪӊֳZ?8'Thw*/SLmӇe/ʮwK^t:^M;@ZOлl>2; x@0 @0 @0 @0$ue! IENDB`Kst-2.0.8/src/images/document-print.png0000644000175000017500000000156012277111530017071 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ=H[Qߛ{O!Ak%өCpP;wŭ"Y+th5m!b41?{x/|\8s~hJ)i80UE.Fojv'3sjڻT*T* ]7$# 뎊 n\08||rL +@(EpĊ ?|>;9k/* Ny&s[-6-;ܲsF>5MPGIlb-B'p8ihs[T*8u x`Zlmm DB ##~\&auuiNu(&ILNN( C[XGY2-#[g_a\01+++-ax#tw?a5ՏѤX..ED*Qjxv^@uB%hC Xa}Jiڭ  :mEWW9w5^g2)Ӭ(]ɑS7IU0 VAAA^7*0%* >ԥaIENDB`Kst-2.0.8/src/images/kst_datawizard.png0000644000175000017500000000233412277111530017134 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<nIDAT8klUoo1ce 6q .3qY0"q!&a^!t^FaaH 3Vjv]o{A]qF“<9y]K|pױfr1{l W-\\/ gnaPD"ξg>Iڱ X tѠdi!!|dr(F3;wa&al篙Z˛FdYFW⊝7OillN0$jFY< >)4lKC)NK*/0 p8qݴӓ*[VY3̴raѸ́H)3M*”C8o/|с |B!~?faIE%5zr ;sԹgDS<6s?>&R._L__t:- m1~ 8d$♽74otf fkzZ|mP$/jQ|F1S8EQQfv{f^dZ:HBNa$Qc&ܸefP(DAAT*Ӊ!tڨ\6:>qw555k8s@GGu$@"HڑR|zmϞ=I` P^jggH$nݺ(e|;, ,Yt@%ܱ (8 RIENDB`Kst-2.0.8/src/images/document-save.png0000644000175000017500000000143612277111530016675 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ]kAMo&闔ŏkZ?oMAH?@HHJAkۚݝYa Bp朰s}lvyP׮oGQ4>lLZRJ[hig2YJ3NR`st>6>uqݼ09R(DBsA8p<\C097Y+$ƱEKM,qsѕ)d2'qXc:`fI`ݚոڗCqjQ8ma8{ʂ5'wt BPi>9ɍ S;~v\4ĹaV:r#dd̰\fw0:[dp}@VQl4?O!0T8) C<}iZًr^z{{%~!"8ȢvaCpN@XX z S pnh_o4us1c~"IIQQs[,fjoLv}/3 [ kʃHyoRO58@~;Bb4T[woN z.T@'bɛk{6FU'i8bI0׮w*E1u믱8%5Fv.^%8~?X uW1+GQդ V :ƼT7.M(FU|lSxK ϴ Fr4)%C\w.t¡/<<ҙB_PРgC[,w}S4:oC##C!®1c.8YO4S0OQFIoi*Mc'>l늌Ky_B$ XBE FUgܼKr?YßK=]:3:|Q"k@hYHS87bώs2$ @UQUl--y4OA~"_"ݶȰ-sa뢪"=[ &p"s?lZ4IENDB`Kst-2.0.8/src/images/page-next.png0000644000175000017500000000217112277111530016010 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsItEXtSoftwarewww.inkscape.org<IDAT8Mh\U7y$$MZ'U*BKS$-4Ņ"[H.Z(dإ B*TDFI*pc4f޻_.26:ls;ױK˟) /OZ[AV}VJ>o/<ytqXy`gvPJs+R:7k֝'/^<7["ώ*/B`E)R )5R*AmΟnjܙ_~{%Ч/yܕ<99N_.tuB88BI Fsr wywv=(ZcHBk1k0`;^+# `ȹPeahcP &IR*hm;BiR tXmAx9|w>D܎Ru˻Qp0L8~k"PLn_dIENDB`Kst-2.0.8/src/images/lo16-app-kst.png0000644000175000017500000000045512277111530016261 0ustar synthsynthPNG  IHDRaIDATx D#0L4>L&=Q['EWY f+}{3ZJ1ƶ-5%`+VUz1p_+3BS[1 /ض ̌R7ۅhJ) E9;jq5#U}h)E%fQsL'h%ZtlGb4_@GKa#LoIENDB`Kst-2.0.8/src/images/kst_zoomy.png0000644000175000017500000000157312277111530016163 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org< IDAT8Mh\UI^f&-B,ETDcJW -7EBA]X]4B(tIqvS͈@th* i=ȼ䥩xnν@²PU1 j:]aLiǖt.ϫh^ k H?Lo{k$rY(LJ` |CkoVQ>@?BaCݢRoS%="qOyU@U)  :7sGē(P*p&mNQp0d}:cu9VGĵqEƺrǎC qoo=kJєăm&]IXqy]Z^]-h`Tl~)vK̃V-}y˪*Er^bSMU;55do;Q*qgtxw_ܷt=xXA>iϝlۆs].S_lHM+%IDATx[yXU~n`̨H9>>d͟??/77xީy}f xUٳgg=RQ-$pRNr\}Dz&{̟?߫O>5'U~7laak]&IYJ^N:=<<I84MQ/EQ<3f4ivEۥ˗KW^EZZ[.gnZ \^HT>$IB*yAAA5x^y%cƌqk+Wm/>cѰaCrl֬׬YS([o*5倀x{{qFluYz6LB &ӓ͛7y!߿l߾=oXDXX&˲^6](˃d2I|SN^NEEEl۶M UBFnݤ^zIyyyxwO?sݻ7###G|ÇV^MӠ*Ef\y*ԎAPmɒ%Be044L4ͼz*-Z`6nܘo###i٘[\x1 BY+Ӭ_>Ԫ!!!Z8p塥n֎i&cÆ VZ8pl߾=ׯ_υ $Q̙3tv;Eaøl2LNN… YTTĉ'rƌ U c8GkF/bo&VnW#`ǎ DFFZz=;w,~m^vIII1K7ޮ_NyꕫBQbK\ސ3} qI[n;SSS v+|qӦMB㍑yEo\O5N8!+]QUUVYq1|^p6} ߜ C_1gJ"R;j~ӋeE4t /19&MaHO9yd*Vk)KKxh{-`z##{D"$cnZـf޽{oݢ"f7n+z#Һ/VӲm;sۇ$A Jsg3_܂4^>z 5aaS!+C,G䀀{*U˖-W\ܹZ ?* \t -N_ITTΝ;/7D~K1sۨtpS <==ЧwwL6 @M&Tqul6Zbüyl/^dַ/7 !7"::111/~W$$$`Сpqq%BBFMVpQE~~~l޼yث*ÕOg΄_#ի8cXv-yB*Р @"| = =HF P+('@j@ZZK\25ˇgC6L9`UV\r% XVVƒZ,LY.`~~]uQ۷%IyQ;rEϒBd.ȇ~qT&rѣG+:w@ܓE֭[qQDDD`PU=N:W^yemPb`͚uwp1c6l$:nnҥ=|L^(0pQ0i${.]4}ǐz{{s̙Ȩq^.fϞCݻ7Ea\\سg.d q>8{:N|,ϔ.w~kwHiXRRR#hJҹB|r244˖-u>|XKSnj.]jVXVvԉB1z8/xvѢE3…S49>ns ^̙3sFA~pUu +Cyٳ bڵC jVz0$$G}%Ξ)'wI>|eWq?~~>zooJvUҢE !`bb"EQطo_zsDMiZ_Ϗ}[#誒Pљ/~K%o;wZ=]N?%z`s6lvԉR__mk׮7uTWxӧcǎłSrՒhl6ӧtR޽5W_}mwUXz)ap.(ņ?| ;Pef 4$$$KQK.-$]veLLPE!,˴X,$ɲ2dii)S3<<[laZZ34E5Mڹ~ZFKZ&&V-=ztV,z{('*3 LlllƏh߾Աcz:Pٕyxxv;-[%KǏGΝ WWW A@b$K/3)cڴErˮ}k7n,7 0gxx(oW$BqobƵhڴ \x|HV78AkN< S:vj܋"*{qXkz@MB.\=;zauG⑘#G`/t5;TUs@P5籪ЄRQ^ y|Euw oOǎlN7<7iZ@mx Iƴ hᨛڵKXX, ;,!5ECO 쀠sr#!T V-+)&3cgjh0Lxy!f$g-(*̋V<$6\RִiS_5z= wѬH/\d& $$H. 4ဥԎ훮bd|($ NOOw5::Z!ЮVk <zaI?7^6M5o2p$tni6hC :{=F (((ڵk[cܩhmC_ oh>366GCCׁB8G$(A"),֬ $4STG#ŭkf7o^|r#GJɓ`x,)TQK1N~WЬycL4}zw !477WXˬ8t$ 7Dzzv\Um$X,;P0n'Npڵ+` XhF B_`ﮃ(/±'qy x3a(/bw!^()YF-$!FI]vѣGK*Kw>f/d`ǏUWGaɗBS TIp \1vmڴT&6JsQs=dгBq?[cB=0;;[ ̙3;vs9 f!7;EE2I {1kt@@h*(b[W1lX{Go).=s; IƏXreH xqnO\w}3kb _~u w"?;v'[3fl݋q /a%Y1d͛7r뭷fq1R=6 ́qS&3$TMU Tչ'֭'Nkvٳf$A\3báܑ 1 +\]]%I@w1T\ޘ2U3:]=@UTίZq!,[RͽSnI\H@ruBPP H$**vrqqGB@ 4 >tCź_ffK&MhpVuMU LXn|Jj}NC5Nr;wv{\f1$O86`2@4 ѣGƭ(]޷gܫW,ՙ?@>>>)iii2IL^bEa&M~,?AUz u2d-ZFEE9$ISTT%kJ$8$IRbYMH^/<2IENDB`Kst-2.0.8/src/images/64x64/application-x-kst.png0000644000175000017500000000773712277111530020277 0ustar synthsynthPNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<\IDATxݛytTu?U*I,&@Ile0  ʒnmnc3д8ztѱA`7  ĩ,R[RUjMee9{ߋia[]rUU*K^_O0N}Ŋ F}a^^^̙3Z?¶mߍ*}8ǧhߪ |WUUESQ5ByQP`J6T˾*v$ʏWb|Ub7N5!{˯1k\O(-2ehhP=6Ycp#p*E&Ĥ0= ^NP"piIcLFJ ԝ[&IkcO{%hLο h9F߶0<߀˫bqԸ_wJpe&"[?㸟U_.:ڀ0*Ǜe\^/5"1o'|*4wH 盀(U`HYSah#V/b)hFqȬqhh됸v|6aFѿ»ElSWCӠ0;¸|(i!S*b՗$)4&K~}=F=$ YXrAп'*W%2nl\|r R2"Sd8v[ne֬Yª3 Ƹɒ(qy@aSQHA1c~{T*;dSIvl iM@կ~XmҒte3<öm&333zddd( $a2|deez1(( ~?fGff&~?2hhh 777j. ,vX566R^^C=O<}+Buu5Nٳy饗Xf >,555455!'Of׮],^ZV^O?͜9s$ ͆fh1 mZ HHEEk׮d2Q[[ VWWG͛7/R6m4}Q֭[ն 6&2Q~X@Br(Eev܉狫+77F: csWʾSaǎtvvFI_" Hw$ =C^^^$Ã8OYߛO~XXا1kjj(**D|֗s=nUSt\3++ɹ_)F zQ&E?^ T,x E^/u,\O}ʀR99 ݺKk?=2&G=/Y~~^߅MFZFGK[['aOwtfgӋtڑXZ鰶Ҽ't57xxjra9݅?r8z(ݘL>M`p~d9v Uȭbj._oNh" T7?c4ϯ2\į/>MNI :*ӧOv,A?b '~X(E<8`0P|I˯:F,I(@hO:'[W4&L]ew}-[pyZlٲYyWlٳof_`tvvs6l@kk+@Qd9WxQU ##~<yyy\.233鉄|>k׮D `Z$F#@|ߏdBH,JPBFKUMfΤOlT9q''m4~9!gJ ?m߻)$/^r ,O)e@mV7L~:.hdn{} %!k{.\qjLE**GST<@ PCKWKUHAg y̾!hjG]~AR=V}xsV~xors.)A;']坿a܄Jn4 9vͭ;alq+,$#X?ݻw$>)z3PUUEUD>O%tLx Z&B9Ԕe%!`tG n\rI97ޘxrV.Zw[o7O6սA Ly!N%KM|òet@8x @6X__3OW#Gt:W-]*\.תK}}#*Ǐvxef00 ۷o=˗/0À-[83335Ñt:i`,UJ!hIENDB`Kst-2.0.8/src/images/svg_icons/0000755000175000017500000000000012277111530015403 5ustar synthsynthKst-2.0.8/src/images/svg_icons/count-from-end.svgz0000644000175000017500000001713612277111530021163 0ustar synthsynth][s8~ eR+¸_qꪞ\-EK,(9iIƽI܁C͟IQ?~z/bL?}濣h[LxJF'e2}]oܭ#<oUmq{!wYG#0ӑ ףQ}իh\ハrbǟU:x}c:)߸Mh^N'"N5'mIě^AkJt:+K}a1bzHi%rEWaTmR!<ۖWn1_~v=/7zuNe9jR*4<]M, &(YNkv!$ˬR@{C5\כ_`pT|bt15,![Nfrkӽ>?H`ITVpҫ'_C4Hzy a _)kl$io/+.,-]tqmvb6=K>M>Yh@`kW ɬYoLś;CoQNbmMYhO2Hs:6 1p$1F`J͸e'Ὲ(\~a[X4x|] ]Vj)`►2C6mʀ6]?Xiכt)9ZI;rӿ"pʑj߽sc} {7#0=8ֆ5f2]Y8d X7uzI?&_Z,Sw 0~n5;P()EBRu1VL%2LS\Ǭଥ` JՂ8,rU{9fh; # S UH) X!@YqKZPz~ UFƘ!f!:+)HzYK\c̔DI-Cp{CZ2Bq%0J-4+t3Qik+Y  u lF'͙yTWQ@Od  D}KhŴPenB /Zn+ZZ $6T!aVefYK9{.)V!σE1,)9ʤ`"HI8Hy~$@ b WkWlHZCD(Q՟ XNm品 lb7uol='6j tRU+,E̘P5uinuO~%'LiRAQFW%@<%YP%820IKIKNG%Vs3B&;798Iƻ40>8x[bGaXZ몹Q4FD:ƙSZ~A({BN$qDZñ#:.f1hKHa c]&,D-+4DH "[EXq)]4Lz3Ɓ N U"fMpAF"lי<(cxZZ`w RLrH BU ¡3bfo_7i&攧D,xTCVW-%z,lKg1V)ӟ*e*BVxfxPYS=W{xMM-/gI?@|ݏ/~k =Q.EXXnG6vJZJ_*ۉ7)'aa51lgH[_ߞS#@7O̠DD`n'B >o$z>@=?0^p15vM#Ը݋+"TY] 1&TZѦ!"EI_Eʆ~&`Y|xU[aŐU'ʃ8bUkଥ`ym!5sfQ2jۼZpxAsB\Ġ߻|7:@נ ~l+sV?Qg '&}-ȭ&2<f*{|RW3NУ"zY.&u6ͽAɑ}`SvJWC0`a .@b7py[z >Ayn?O.}N%-8_W0O2j%#`hww<_Mhe6je<|d_:PFF,67T AӸ}+V4Ѣ=gjNzUm|9]}iۓ?c1Z2nvu;&",A -Tß{7U:MҲ R;#cۡvg_1I_Wk['[)[aƽl$mEnVMzl_ܾcDحݧHk2-lMY`o2^]ȤVtu4\O6PgW[TZI_ܺ޲G{A=P,;0~A-sn^ۢ|{7o-UA8lZgQ[e^-y!'՛dOM\p|q޾7Tb>IPW;+:ok0%$dkD.CI=xf29*[x_nz{fx֝PfO-c9p-lipz&tr=/mN[|H޺ڋy^L/:,<,h nw?jonC[twflXdZ"Z"m4kq? d&d eX RJTE<O=QcxMKUQoX"Cw{JݘC EI鮞,aEBGُWiH]usR)Dv`Ѓ.)Dfcv;25 /j1rO A8Qa#g!ea`+ 1 Z6P BTbqÅgΊZdw6xdAkB!Hu2h{1:r{<` >($nt; @}3M ž6pP`ll}kAsrA%xkOW쯂mFUw SʦmgrwN'sH%M-MmopZvH=rJ12fOTj!2̄C"P;ɇ, Eg8M*0|G溧}+8 &  [Xt&!i%6U.^ޱis1X$xLӋwY/y_R+6\yaޝ7y>60Ltdu;Lw;u7UmusyCW99%VK5t'gʜ6 SrFuSwn]dS,M#n88mbyӎ&ٸE`e'K49C,뉋w]l2/(_1NBTվ#v] ț]D譋&xwLzHn`P74]lwCw,f,4Ƃ&wIR R-1 9z:rx'dȱǞ%풣/^f8 y{]U;2/ LvKg<(3~Kߛz~vӞ LB\r1;kxj2Hph"'>uKtGOO3Y~_)F&-ȥD3^FJ:ywrqbuco.ygMOLUGU0}֬&JyDӪYWpI+_=OD+ F̹h]ȂwV^LRL($z$g$φˤ7'\&`~&lPIdl=˝̥w ApI 1'cʘiXqB(H"yIDv|9,_K$[`-T";&B%cn*X"sSa)DPqQM σƶvo~ITuWJ ,V1 |,4XDm$O,:Q6y@#/ϭӑ(ϲc *;^&S)%žⓓfEiܩy=*{TRY%" ٲhMd%Șro5ނE~-yZo_gͺ\O[gl*?S;K3ڨ}&v#^K㭫z ";5m#@H"R: CoOvzrzv*ulbHM[_?uul]^UphʣjX}dBWx aK7kԎ 5P47rjԨYkVnO> @{5Ȟ`H% 8B4* ըc7Pk<=fR6 "i|8MFcy}Z9gIWjQ~6Aى q:+GWC;S`=Qh;Kgd]'# pm/`HBve$Rty\2I$HvI`{s^ 棇aտ(MF?~}'?__]}]\,wW? ~w? z4z|5OOWWc~d<><;~ ]߬Fm>4HR|hފwݪWn=ݨן/? l/ DU5tWfJ٠ӈ5v=߼T|NKLɧl^MWntקl|u{?zu..O׏q{L??940y zrA ;| ԙfoq`q7Fzw=ͧ˱~^(ϿKS`kLon& Qw`jp~6ޘ-3Nj $-/$;^9(FKs!pgq2&]>iϤ,͡z5? 0x=pDv̗DOD̤Jf.?08B?ޤM!k}(s"7TNgk{1&Dq<wwGJGVH5~#&mf+mv>/.F;+nkW$Ͼ }jtqiI}~6ؤ)n*]W3'5t\s'LJ5ހץZՀ-Up Q a*[gﲱrgJiY r1]WKvKa硛4hT2*ei)BH)EX\)ql#g#7޼\\#M\֕'0H*0^O87t I":9)tOY > AuǐAa{#y9:e'gLچ9r蚴%%}pܶ1΂Z5 TN^TtS0d[*Wy=,*j o_(KUՆfYDP-r7aI?ce ei4歒y f0Nmӊ\ڬ1:o[.]Kʆ>oyweg[|ܦ'^HONyr X7|ψjt;Z '2;mƔ We3\GiPLU UL1␆J/$Jt2 FLT@kB)*n7M?>LlMcmg7&o'&&oC('.Qhŝ9s8 rGH+!O#%_C2ʺ<,e|\l'H]Kuz4i(|wEl5\{iag o2 XM[c/ X*\aƳ՚rWptoaX):Id^D([0[xDjf+M-bu;E e.6L1-:x("HzZ{'0ꈎ;<4ߠu xe i pA vR=Ao `Rp9=;jeh hyU`s]k5O)C7(Ph|V%h ##aj,}k&$L m1>'diSO<#^nVyhvG:pDs;Q:6op YnSoUE{ܟ؂lONvx=$J[͎gd{Vku&8{D1};1':5j. a o_c:ц(;243m:ʵߟ[ذWِ;y\1'ebg;lz~oF=Q*/9;eˡ'nFe!ӴW:iy奥6TC="Y΂l!B4 56gY2hkq"tPX:m|xSjFXF1pOݔ3euz5pѕ(肯MN6Yn |f|;1J]fG#B'.08ړk/RIދmf іp*NaK6J +IgMA-i{kxH;#юv A,NfsFRhFJeF (#EY@ 6ۂ~*ֳř1-kM mzu,=ڣ>U~k f\uPB׽χhuXlkV(U6*M/=j\IC @UXaQݚ$l`>d ބ Ba,fJ E 1`?v8hںV>yh)z5+Fo&!$p{ 3qW=>W/}-NJGZ-c%R%ީU)wN4C DV)e>MVm[k)%79X4c(r˩g}k(qf;sO׺}[pV9ɖԱz("^4ʾ("|1PU y1PE h yy1PZ9^6"3]u۳x8DEcBTx{s1"b&Znm/*)z?FDCG#q.ʵL}Q43 }!S-Rv!ڳh6}ܶ{ZL ;(E.c_@-Z9 p6lԐƗ&zpifcocWh&fb4n׵ ~;;6>_ jE;kSsdC΁hk4L1n㤶Iz1Z8kvϕ7WD'6Hg-:HIYml}m5ʦokiB&@׼K^6)l,VfXfgj9(F6N0 n8se\_coc\?+2-dT|@yTZn{#dp&y'oĺ-MTid`p7~QަsZ$\ Z/аS˺O#̢|f+]: \^#ͳ/6:CRAO@YA36 v_`*tuNq:UZŷ (R_ 3x̑b&1w6єwSYS4#ZPH]~P#6^JG9]ij}F?ch=M4Rw8<U wAPtH3@Q0mzȚ]gMK^}K5 {d#hvL^[yV#V.K8./~/3`RB2r=CG}7^Zҧ:wP쬭mĝ]|:p lU){ ^l2hڤd#TYؤ3KVȅ&^S~=6))2[uTNQV}ƂCԮZڶ5q2J:oUM F9&x 3pE,B3Q*N GIaX/4L!f# c n<̅ű䂭7I=qjsNzuxp[,G7,[C+ۍ 8JV4ѽb|8)f5wo}*5v4چv˥do'/opo.F.weq'`r'?o\>F܇UU.`m_q2{zo!STM|oާCj0x=HI2w/ HsDK#c>Uc64}Ŀ'o^m_7u(9 Pf4#Vuֵܿݽ0ÏsğҷrGOzQ<4z$}gzwW8eӨ]fUynx QŮ}=H+:EM9 QIU[bu!$F}^7Lwk3-)WÅ}.1՞FNQ68-v-v׶_]r-5"m*bg9Ռ*"i?rlU <ȕ;P͏{ZRp (k5 ǁg0]@qbk.ӁѴ8ԱU*1/(kK`(WKbaU!PhwرmU`5GhJNjҩSArXUN`2{ZwfKu.aIL 0 Wƙ=cX޹J U.%'wK7Q7Q,u^#:TgЙ әpAѶ+3^y훤3Xat iH/ΜuC_ :\8f>4IGx|ֳ>F2X2hϊ&sNElR_cVOQ\{tRoE4 B,ll`˷x!eDp8rQ1mѪgsLa:ΕKWyΣhD犍_ cэ<SkF^kub3/Ku`%tWQŌ(b_3zA: 3x[%)3+J-|tߧ E(N[9[♌9⾙xsD}7EsK vf>Ul)r]h $` ³Buʹߑ%]:{K;-I*taw{r!?NFK6e/"{SU Ji]E.^v!3C :ď<6$ov?-g gΛ2zUN&/ÈƑcItI9 Q5Ty'vH#l8/7,k b%d B/HFwF6A~h^Xٹz͐렄E5>#.ZGV|1m2պO$mv̦=#Sک &UDsw ,،39E0}:_*_<_(-2.9ލƿ*IraTLGaT3',hK+<YyD9AFUg qo{كKg8*b_J:hWwI7U!.;tYf y&!։bO ȩ B>DO^b-t[s/5޲E -]) &V1 o.}`AKX>~|7#`nFw+Ȭn?<~oXt>^Oӻ h<4%jܲ~"~^IV;`u/?ՀͯGnoL3CF\fn)ٿgMqǿJ.V _uysQIW?7.1a &;Ṫ]7i >d>G냻"\7yv}5?٪`@.qפm/8WOOw !/VMfD뫫r:{[tpvXxtdČ~Xt*UxdtKm NVZbc/L< }GuG~Zz݄Jm Dի&'3lAh-ӓ<Φ6?>U =x6nqQO9 Nf%sϞ}߿&~w;s-miC&}zA ֹ"w7/[߾M?</i׻QCP2bLj|w&6o['}k2"HK,yQk#:gƀg4TC{ 6q4_ߙ5=ǒI_WAnkX:T˺`^5HN:@9c1KUND5$%j)J|j( ?ᆐ!*W %y+M@cXxɅ.ee/zw+[ňJfkO%ׯkly5}1{oq=l9>W}gik:CqkQj:eQlQWn!ZψRCs!ٿ_19Z%-9ZNV/}~zqd6i?4qH O;/#%w50rSʁN!ҸDq@0 0uPa?Lih ږI"kʷT  "KF7#FJ !!*XqZ1#5&*v6@hL8V,bX2 d,C0Zx#&L|/S" ޟ{oa@V?X%;TفtY3OyC!0]f˶gퟄ&k{Ub{8p̦5 megvQD%!DaXfXӼ&[lc<d{P!;ao$F@\r* 2#j 8q\3tA94Wtah%⠨v+ Aji OhQ"'[x J`8QRO.4]|8=W'm?tq(IPq= Uq+}8U$L$ )D3T]k8n{O4DJIj1ŞG#^H|' #0ʳ? ֻ@E{-(?hy>$H bgAlTI3W@ ۯrHXft*vx0x $ (}#i]zF&$P*zc@Nhg8vl+t%h7+tƦF, @ vw20 ԃh8-DPCOplq#"xpt"-#8H4%5 \Xn_rGG\La٢ڑ@M9$ e+XY)`8|C K'A$"b PIxcXCa/ hFN; .2s$`cg `i:f_~/l9BXn!]A^-!+ aChX m.1G( ft Ddn!R%sepGȃQ:R>*`bWF$yF!S}OO  ?1{۶) A>*a" N-"A4 `$L"P-n#X@ _=ϼsIqXf.)JtZ݂V!UͲdujLzۯ%GGf}FO%% 1yZ4(A9!{}աoޅ*ѱɒfѤWUND 9L.OC-]RNGB҇Vi 䦡bG"3JH7e^9xHW4а I~`x1E (E `09 Ih4q1A/ ENZLM9<--Cٕ@g_o]G~}^Q1q)#i;e93:}vGW'CuS0K M cVb[ 6aQj !$i>)TcP Y/$Q1*$I֭(=mVMtx< ?OY g 3qm29H d&W6 DA' r**Ai9UA4A.hhyZh;3քuqF#@p%rlȪ lOؤ>*Py8b,62Es/ڤrdcZAZ;i$='m,QYd U NDR%24)yth^>@%]9iIwR 魖r84Z"X! jhI=LLe ";n=X& Hle(`~=evl7FÅEu v{\e(_D6_[Dcqj1 %/ R"%!Sia:ꯊB!ֺ$`5}:"C)1`|[{EHǀ&0t(ydmc@"&GE2H(PF(h‚t,1@g PEAJO VֹDRO2*u5JäK!T$W,rC5 Tk3 3uWDFDVOVX$Qf(IgACb5IðD̤ 8 WrBѪ>ws,Dv`݀} P *Ckrif,@7# x?V 4@ASJ*2j7[`r|q*Vչ; zBLN htA&3 ^K Ni): %@Ѐ4@r,+*$,K t2tmZd%$ym0x8%(zAptRөE4E- +q)B@`ZqrE-ddg0eEb=ٳA_Џ4g/O_dXx'>X2F41'c(!BH Jskq-4n*ZMvn((G P.CxHPb+CA:ĦK8BYX 0Rr݄kht/hzĀjJ9Y q &gNKɠp_֯3t K L瀵3>1arXp8T%gmn&1<ǩB:Ҳ<.a$V]KdHM.J1XΥC(7T_Y߳ [al0CSkFlz+quoiF6q!)XBɇԯV74Tj]dAt|}9cۓM>mOʃӃ ưkA0*H̽(Ppm<|zrH#դyۋ`7`-f!VP<-$衡a<{g3힑Cy%3r=LiZi2- m5DˀG7[ Y"kS/iY5 $Mـը{c*ҊDr-T&meh9T2B&O; 촣 U"&&z [Mp,4dMw n4QjPOH;|  9UT[ݵ\8?3?rKst-2.0.8/src/images/svg_icons/zoomxy.svg0000644000175000017500000004372012277111530017477 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/arrow.svg0000644000175000017500000001651312277111530017264 0ustar synthsynth arrow-right-blue buttons webpage hash computer arrow shape Benji Park Benji Park Benji Park image/svg+xml en Kst-2.0.8/src/images/svg_icons/themes.svgz0000644000175000017500000002125612277111530017611 0ustar synthsynth}ksƵ ]KTlCs*T|޺Io.;꠩px{U:Ze{w.~Z 3;/c._^4-뭶p<{136a /_ kiR/N>p}H<آ^[ɏf5#E##htHAi4H5nߧͷ=GY?5>SǩQT6_D}>p76ef8i#W1_z!h*Q8zrn  [I6/1O2㏧ul@q0Y| Iq~ Il'=^FjD2:XLǓtr\y$Mnsc1=,=iB'mT'lmC2ǏS`E!  d+i%VfT1 ؾ?T h-G*F#FVd14jݶͧH#cGmFͦsC~%':sRdDy ,! 43zx̓{S9TΦ?F'FlG5|.>}. iD؛ij ]1on#qۖKt~GVm_'$=.M2/2321ʒF}Ht}4?%|]Y2(m%b# m1do]Pb_]Pa]Pi{o_/<{3fqL՟7zg>_a׋ΎoVF:!+4wUIR7TIɫ豛V"`JUR x*N"DJ*i/2#( K @zK+bsN8sL!sbcΜ82>g(6 (l2PP=3OϘCRf)HUa,` %*؆) QVCGڛ^phnL}a&DgKƩqu|q7Wgʗٰ@ cqA?Bo; ,EҐzczIOSN}ՁBn~{|*Eb̚JMU :(i=2}{7W?.^^\^,ߏZu~p׶m]/.۳FVg^ ;=]c}IFuTLFVX)ah}! s`X=B%׭{Mz~|0#L.N*Cl`Z8"4ݹ"_J,Е0D^apM\!9EQ"Hh:i:uK:2_O]<)uC5WD qS8 8}ځCzxfzx% +CÓ想ԯǩ{gF]b̲)gIE@ڒaL><"5bP 01ͩP4cį{%JZ|Z8"c9gn6Uas`h5r<ãx>_QXJT!t$^2]V3TY C0$eQ}Y q ݧʰx# '|˄opTi_6ܟ/FbBv¶wG9ĆPiwDsL$lpG\iwĢLwMyF3 &nHebCsmڄ%W<Ć~u6Llhv8 Yfv0,īMcao/KMy .edH ,͟qY&r 7՟Zy Y&tcDi2ĦMgMS@dD¬ZWӮHLg &VP}W~ݍ.S1oLBהMQ37b:3Ls6ۖ/֯y܋>%}a~5cF o iV]gMJ3l|S2a&8Is4Lp|2 2']qOzAgfbbw [_x>m9eO_OxߧqPzWPh!6tT8‡<2(P?g`% M>uQD|uw >!*rx$%XI-X$ѣL8 2SQQGN d{_8afVOS>j]RL"fTa>$Ys# P`Cwx!_7x2)t cN$EvK(zBeZq4yЄ2r\t0͒`1} 2`XЁ,2Bpt kAǝIkT tQ0bnA-HQ`ua!EPr\ 9 P $x:PCJRԩzRIr>O$}=JGܩv[+٠zȟIujH\` K81dC{SZ %d#G!(+d:q~8h3xiK“Yu\mYv.v9 X5Y8%d: TpI0sb Q$paHN-!! D٠ jR<6lHн 9Œadž1SA9:#.kTHL>:Ќ串dUGV4McL&4B뚚iԅSɇ2![|$'%9}h] 3ʠZ%0(x ljkPapɮY(I%1Z!h|%?}A 7()lxR[Uv6jO\wI8zV!4m=,FO c 15A6 D ~A']n]_k8~8ln,ڵg˫jk#R?hÚ~߼X;wzy-crR9;+.%Duۦ1wm{ Ώ?,~ z`V!to*7Wc?]4=ZXY|(E=wӏn.OAw`]NwpeR\û&/*6|`.t CtrG Em;ƫ˜.m_6| Mc`m.ޜ]4EZZU={t&.~h񷋛ޓᤕZN__s{NN^˫pQywLe7<{?_ޞ1H\۫lחﯪzyŋw;՛&Y=oV3=9_Ųײf5Ϗ_uOg+rG߽<],AOoVľ25^S"h؅*Dq)y?Hxw|COhhs\__;9z2Aّdt`Lg>;RFZa.U[ɡiExxTԨA&@V`7(A1ã@MvmQ `+)b5DAl]խ֢G]Ԕ%I,zGL+n݆K0b`EcPq,r 4`J* `XQ*@B [[QҊJhe,VQ{צA jߏc4(nF~|rӢ{on?}e#ޟE70^ֿP{嘁 ܆Mp۠ ]o}g6rmIaSna6݆Ä۰ nFƸ tۈISnC{1R̯S CGg/,4>qҸ|@1qq-}R>q8j'4n cƱ+>qиMj<38?qԸMh\ <8׸q{(4{Db&:1(KF$nKSPkKTXLY:AK8CC"C)<7X́_uvi*sf-Q! "HP)W(jzvU!0nlf!+{ WZ &]hh]xĪ`޺ ! k@~ o& a oAf%ؕ!%m!ct ZCW!A4RpIC:ݔcn%F.S5DQXAj cIɈQS;s9%Nd`]= )rPuXeql 1G!M`'nGkΘiCKP7Ԩ#A,u +;m\RℾWPD&wbz UF-%RA j C՗@V#&SʬxM lrjC@ˊz1b.J"$E,ڿ5wz#kJ;y/7ȋ6f!ҥʠ[D+LLAn!d+0 v jtbŰ%ꆸ rtbzJ$L VQ+ $ X:OTpF 2ID>OlkgqvYO|nKL gڿ~JvNmRr<˓[h'^L>1힘za[whmE+(8ybg>rժ8kp?)RVpD JEy粈ܹo ߢ`q;y!)9~A-+uJ9<*dޥKFQMLj :{TDwTK $륧*P^ N$@f4L43Re\oG!u0^ C-R;P-D+CZs JZiK)*)VSdlٳHu8@g_j3-Ӣ3UTJ`D2١"j:`A%W()`!\\2 XB8Z%wk7 A;j! dlrBTQ+ޖ k-bP+",]=^L\}9ӈZ5P/2i% ! 8(BHeW7c$n L|qJrޔS Ou 9sfa&i/ Rh=RP_쌘}i?Ưȷ?~uUmyOjlzI?"]K׳\. sFU[{s&֥Z*纄I-X9L4( E1¨BR,I@p6`p"9zQhIRE`Z,=0c SL:< St绑փSN5*DB9P(@D[rj3(`zX+(ڴdYA-I)e%2X3 jH5X +B+!:嚤"S7 ,El0= Kn-t GGzSUkt,Lmp=sXי:ՓXQAzjMQ02([6X=߅LV=_H CqUS5*"Au|@ѮwEPUǗeO rGt ڎ/J`AHTOu|EGI1jǯ`׶.mXӲhf+tr>P,{K ٗRLh+u˙$bjD-Ytb`(q"fMߎMKUj 8H(–>[7ElpU >2Wr*A"+" j M)70 5өI*ө/t_/o!F0˴烛ew~w8Y%7D!4_3aaqKݳnŋ1=%R* ﷆ nˎ(`9'Vf{((mp pAT}Iv¼~5rBzt>U9ɕE W; {kMg@Z峨ya/+zXQcXuF:oӣE"  INQMӴ/A5y"FjwbP6"akAEҰfCXjT3jY)dg%#"{wo4:! nx "!=}70Q Nx8:q|&W3$== ʴIs ۇ~gLڼo< ]5h6|aOgxa^1zU`52Y4$q~AvRRO5ײ! E4H\)LDž, ipFȂ6$6_Tإh\@z!XZE'vqu&"in3oMdWK7Z%$$U%AjlP(YJ6^0 Ώ image/svg+xml Kst-2.0.8/src/images/svg_icons/kst.svg.hold0000644000175000017500000035170312277111530017663 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/xy-zoom.svgz0000644000175000017500000003303012277111530017737 0ustar synthsynthRLxy-zoom.svg]sIByRUf֗מ}؍{ -[1P[_fDP4HĎWj Y]j64J_^TӇ?~a/Fpy?o?j&_o/xP]yxxwuWuOW^ _~y&<|'궺+zx=|,UwwyύhX21+ WC1?/F߆GsY6ݷ[b6gg<]PٸOVZ\>9j4 d܏h\ͯןz3Y|fjPyfgP;xLGZ!, XHh/t,7zKobx}s[-G^}UW7h~餺sW7wOΧz׷nh}c__-۲@;b/oIu=AK/>L=h_rrdWOӇTcOLGa.P<ϸ\ppp9NV,y:\)Yݑ2%+SysA)J}6bHtNɝFf iig;>g<75麩3RVM*{9Dbp#;\*\dVG8>*x;ST8PϦK\g%yވ v:0ߒ90o)J.)Ƶ(mhpGc 1^5Xk)P`jExpU2L*#4x_a8s`\K;,f6zGZC!Bp A+LKXtңMrGʐ /IMomrK|Ϯ%t֥a6IU@x"YJZc,R!I؏jK7:`-g[n)m[ ͻf.-)E5a:zG75zsC١66xOutzߢqzH6 bt]O`ıq!SJ՘B G^D)cٱ%r&!^cO [gk eYHAxSl*t,DC( mX%aV3a~,G9 l2QsM%W KWZkbcrvYXp<;VbOb4|.欝;LAn7V&YfJ JO-kp׉%la[&a oTlءrDMI0 ZO?L{gc2j’7&:^f`fT g_S<hZ>6 CCfR2®(62~.˜L;8gy7;#agўFƌ7-9R! r heFl] ]$AkmˀqIdx=.wlX e^P'u_T~ghїQh3YoeɾAїceiax6QĮ8Z%"N]X0bCx6fY Kl( 5ZެqmxcC(Y|.޽ Ӫ@f:4be7|$9O *(:HƬPl`84?[+kظe{~kˣS(CHM}2O綏;Cb,IrmCj9*%ۈl:Y*om}/w['^h<'S=lXC3wx '0gW`P1F4潒yfۙ8Fi~G@zqEۉ:n뼇;t_z[1AWcIEVhl4XO͇|:Nb/Hjvon -3>A"|դYMPqj9\1& `^kK 8t F h$$'))b@Eyw{Yoă式LMmgqy'|' .ok7*M gڧ0|?yr;W9+CB3dM;Xn$#5#q\>u1*K9Hje 䍗BkA{XEW΂qݐ#s:]fJoXRlHGmIiV*2 t{ SVh?^+rϱVRHyNSg{V)N)^PNk)%7=,c: 9TԳэQ w8.gk]ɾ.,+[$[5Su֣lA=k}9PTEw@k΁(:k(TpK:LW/}ZPl=`쒢N(."|)Ynm-z!ގ/( 8y)]4kYr),F,4.+,f(t!ړH>n=|Ld;6ԇm~uju6Ca2Nֆ@.B9e8{_=#s M ti=i\ֵqhP:7g! :jqjsjeV0mwU+ʸ r&W9%I&vʢIȵq&2pK(AEϸnФ.7|\FsutzÍ鋚P=iѹ&gmOCkЀ[xH'F : t#,SceVUO w|hc1t?BV҉\ibgn_v{'%@X(z(kX0QAF&miWƴ[_UXO5 $=<}5Vji ^KA2/c,/6t]ci qh o~&. tR퐦-18頩ŗfF}?ؼ/s0v13┙ta#6Ѣy즲b,H^m~R#?xJx"ځ)@SjYyԇtm{J#[QǛHF#*+Q ZJ2OvR0via u'3JffA,kQ!X V|||ϫ|Kbݣ۵7u:5=?υ u~`r d[C_s0LokV16i9ʦ|J ("rf]V!xk NjS`>fŁge q-[)9iuDLccg`-d6n00iU_PL}cD_@ I6K"jɴ/FwHk_gY+u8Jcٯc-Oeٻƕ+>bDŹ $HL0YV5׶<ۯ+j(Z$%Z%"Ob ]5 uj r^ #!&u, laXg7e2LD܆BJS(LBr 9 GL\I[(xYM~nfhߴó/;o5+J8'+A70IuշT`܁stώiW*(ֻR/Y+Q[)6N~/)!9ufSkv7TJ鋛 ~3/TC?U1fS̽dvIF"hIg MؤJ@Xl+7Q:EUFZV[-,3%)869SVkYZJe(_~w `"6uf7 eѬVƸT$ D8mB h^hBM% cn$܂l vrcy"V]9Onteq㥲mDxw@JwN|Ii|y*K0]g}zsWߑϝ~{!i-p2J65&-o;A{jw{\wn[rm;yL{ܧw7plqK/r<,l\~^O.AQ<x`|I2Nu>Ooa@v$/5W}| H I#k|.To8>摒E\nFsh5b]hS[i~m5nJgKof%Sjӽ 6zSGÊzJ V(zQllѬ)& q؞1C\QQ 媂l Kf&,o ~Ki8ys<|&f>Naֽ>ʕ׾I>7g̖j̋qWyVk.3ɑ.(,_ͥnLgE9'`b lR-Obq\{zC!,}l[*p2|/ 2\{a8vU=#-q)v.ZtnȼtKFtN{hD犍?H:DUXt#ACe4\'1j f˴3-a"fLG~05f ϷRkR}^C j>5)FپrϹ!F7z_$9ṆBab{Isv|<ء@\k(lRK$1 <[*D ^^L;!<-' Sw9u޹ZqHmWa̦sU]HOөhc6cj^)˺hZCV28ĠC#~cS;NRVЮǥ짺P9oѫrvryF*$4+IH:xP-ybtIl]a)^{V0/ +!cTP`/({!4ɮb+ mt۾ؚ)I4W(M :|}UCdu<~ub=fwڻ-4d(ɾeItH-a497~it6$fW@Ҿf-JД]LSzg:)HvqF⧰0ł[bؔ7Xiڑ M@%ї&&ɦV$ L2vT"g oZŬ_^Pٹr͐ը!w1ͣ~(u-_MP⽏dmv̦=#Sڙg`H~Mt$!7Xe-oC ՉJɸ?%wH94Ȍ1?9[g+Wd+"lv4@T\>wPьDOZW/6bl>rMb%>eW>;_[LplHwGYs'hH_o:t>38QڝoTK/@*|_J:+e;Ĥc:-v&։|O u̧rJ但>DO,b|*d'n%NKP%Nl+ɦ=76OvQw0λmE yiz}P4{9 -ɪcA6GKp5@;##CS ⼿`oq]yqdСtX[m}?26dLSj[\QOū+N^St0AT|ȒOFƼ6 6&Ǽf-[5(P;c׎-5"8Q4j}{i.1w_g70Ѱ}]SuW< Ak\[v8M+ǵ u9^+3u+╚6z:~)ܷSЋڂ z^WiF!D*oTvY}[jH!C?j'(R$T(mU4&AkmhBU^zX򈴥O]3Ks 6/iW''sF3Xy +r=2oܮ7$+صvK~qVp4 y<5T<,Bڶ/հtrـu2_ZMqmMm H.@Z.k;=M(zT׆4kUݵ: ct yrgB8}/fڟ3wR-[E9$0uWN3=31 {^#%<6p{̵u3Vr_{-sdANcې';Pu/51wl^3,Q.)%s{>@wbd{hxޱs}!ޡ#K;~דZM?N'm(W=n& 0sWd:֩%$Xhw?at=<_gi*p%֑[sFaq#{6's@2}]ҟ>=~}&Gk/xS#xq~u5}Oiz˾Aj9`X,``vgyƕ\=u7<~\ y=ϕ0b1nFM5XWl|$wv~>Bv5d3%W||9-]2M&h1r"ok?_l֝e0= ւ ǗdşwċǏ7c}bk0`siNX<\^\<zc`eS4!+=Y).PXρbxiqtPc1)vUdσF,| /epܐ2D)U̘U)܋qZ1F5&<*6K5h6 hL t+}Z6 1~-^a2!-dthVU˩,3Κ !f1zDa[_KD e'Ŧh?%L_O|"*ne-7OŹ5XQwCԊ Hr T 'ym50M:X<ǜ6<ؐ$v+x:(X:`0f(R$2qX3v}4Wta`/b ,EvTeT4ȉvYE ̶%>:o},fժIn.#9aKt.5G`.'*sKc(JV"3ON 4pA@qu X,u:ܤ^gXO4TJIn`IDR0ٌmyeh1H0 5K `4ʂ@ ˯2X}4\i,Wy5.Yv+\e ^`2eգ(Kϑ. M-)0Hgljbd~bcG àfp$hAGE1C&SP"D`\Љ{ |`0 *prautT(+Pϳˣ9l1[t;+h#DP SQ r4) ]@_Bn ^DWĘ tΛZ̒P8}ȱ0ag`0,o@j~n=BXn#]C^+ aChXKm. * ftDn!Rߥp$zɨAD)_'*M[nv)+#6il4k1{ۮ+ |T2hL Bi i t\ =XX4Pѓ%K||UMtHQHig J.[_#R}1z+I0>:>2O;Gi> /GSPWfk/ӊQ˘JhކqnaBP><7A?\0:@25.sM-a&vzD!YəEԉB?4@e{ޑKTH*4Ph@eƳX &pWm .FN<4'dRǀ$nGuLhw5alX@ vIC{s@ z|Y2BwbRެl.Thw, l͂zpס2«#YeRG/L~9jV RCXFz& Pﰊ ؅}4 D`1eF3F8ow+JOb#F^RaRt+0C&1K0dKfze FtࡧBzl0l|AC` ; ` x.i:݂==y+NvRYSMrJ<K,MLѴ>BM*FYj @&nUXzwXtɵ E5("pn>_q0-%IeM3q+'mD+$a67]:w5t`SxgZ^_ڧkjE:$ݞi&z&2]b:.P 1ksPҌ[ uts!5b>fP$v2jolv# |S``^H~k֌F{Ere DY]lA0{]? n0/Q^"}W0w1`:*7 7"KOqHq锱"c6#5 !IDI((?``3C^:(Ú(L;|`Ԭ,!Wk:X! dl%H䪥wDX5 b5>PeĴJhÆZWf7DȮ#C 3\>b(D[5EL' E - VƂ4F[ J 5VD3lMyzQZ^6R҂FlOyy'lJlB$횋\KUDAA+5rA@EKFŚn/>hC׎fW~y:Jd+Q?Cbgs$iֳpaCŖnr=KxMῲ2vtBP]L>w: 256 "`l#j#:EFzpcskԤxx؂U&ELsUU3IPP|K6IAA@&v/ K(Kgǀ$ǎKst-2.0.8/src/images/svg_icons/page-next.svgz0000644000175000017500000001623512277111530020215 0ustar synthsynth]sƵ\ʗz.C3tڹNC͆"5$eK{AĂ\ eJbٳ7>'t1{=%b<|{/W{[p'o拣{ޏ7_1n9#8%7||i>Z&s,ix|Cr<)Z|sS~Z V~PFt+õMZϦ߂/㯖d[ ܙy>墸8dNWmRyn~2kxnduWX OLo~g|ןS2i9ܽΞ pqPsCkhf:Aw݁GyUB/#j*F`,&c*==R3`,zinSc5Ir( Us t ؤBUqUa n?xc L?=X,`(|+ɉ?S+ HG߉y*TֵнG6=`/] plnH#݋'"iФ>e Md EU>n,l۵>΅\ݹ [m:.8/ϭqYѾcL47~PUU܋2Z_ˉ *$Z=C^VdۘE}J}lrc3MOƯA$(,+mv8'_y#!*[~yl,v pLwt8?-g_$u8tL(v f4cޓ ~vZT?E\[o"VD#Ie'(юr/L6? K [%KOw6\o<.ߣК(Kn,Sdx]6 N?3Z_-j\$=y8q'Ϋgo@s"sp>TgSA8aB7hbe(c: S, sz ^' qéFzGeFoΉQA"NXNs4544\2R~EE|o!' maa!80PV}PܒF(yÍE68<(p "B?[$PKQՐ644|bJ^#r:m3)+ 1MIV_k8ihXn1s$?(("UR2t Y,C3f--YG2&V dA7GBZ0e0`9%hb *%ܧq 4dR}12q {|R*00U[~ĵ$FHn3,1ږacL.(4148a݊|Z#l13ND(]n`%uv4 τ:gmu%܁Un7XgI`6jFD]YM[Bo3R馃bFi;|ɡRmAcᢩr-(:]q^ع"TiL+ h£E5Va;uoWм[S(`4upr G4:Qv[& wDjNM4՜ø`ͬ@+X$HZՂ%$SqYBb Ĩ@vv$)`[L'Pkf0Ac ߊOʈޛ%d[23஁˚JfISf 7Mvd€ք(lbڙFԢl RiD!%8NNtݨ]+Xd+c(]d;8)ű:V /M/!ޓ(_M>lG4V 5)Rвt9XO=R\!f %`VrшɧǺzT O9'-;nfHG Gߙ o@bͯr hA u-#-7{X /s( ܃śM^3Qb&ɃdmGS1uOH=ʒ>B86?Tk2p͵֎%c:[5{j5S.V$KVjz@Tde%//M2i0EA_I"I%Ԓ%\Kbjj.ZTIST[r[90 #Rκ?́F12' JT垄^χ^}Pvb+䳀y|dGDR-{~$ @Y7Qnigmغὃa#aej05?FN0kWӍ*LUt4S=11v-8x,ќqtp[yg۬NbzsP˄<':\J&G`b>Uimԁ(ײyH (&戛9.gwWZ HJ_Xs&(o}vc>1vrAwTGsN7>໲ *CrNg߮V;|uyajNbYD[vq&~Rޙv ¦/)S~R*lP{CLEWbx:"/Ϗpq\*Xʞ iVTuZۓ*҄SM(*a}i8J9D!,'rTV(o.[ouiuJߎ6;Ҧ:s6,mh<ӼFR~ J &˂TkX+ X'fcչ1K>[5Y41Mn.?-_Q2_VҥSz;ѯ> Ǹ?߾q2wq^ /ϊ KxB< n^,ɲxE@BrP~:~-}apUە2`0.Օs24o[.uC~{fA Bh2DŽrK6 Y'75~aj6f{2j>|-Jz mG8Z.nL z\.ӽT6 >?P>~Y wօG3%盦rs6{"HYv.D 9D1kGZgY#/r՛d=Ücq՟WG&Ot{3ܿ>y\_cJZeII#dlG7xONݛ_oNt_A`VfmSIoΌG7Sz:z8z?{1oyƀfw$OOn9r9D!k8zq>$xxI,$7\o,EgрIC)7QDk6rضˤI UQe-{O;ٶdߤR&eڮ)0Y}`uƜ" x2a|r1Ub}Z&326Wz9JBgƹ>҆{*\m2[bY%bRgA1F̵\ =Yu;9DY8tݽQ @ Q@@#ɗ3VE6/"uv遆^X}QӋtQ p 'nI =+lہJz9}I6mա 7>sj`?Nf@ ]ZW*Ct'2yz)⦅ODO0T񽡆zDE2} -톆wFC+9qnu`6SmE4D!8LD,iեv‚3H&~paY,˓PY1tĂ$#%-XbSJeF^VfdF+J_hX4434P4QJTbCFĉ&m.9w9jR+b1n59Qr&EWr K#ayFs[WZY5*YbZ1PΏ,&l]B,g^(*$FQbxA<77H%Ca@ XiUixɨ\8^M|3E",澴e)|åqE2Iz8%{ͣrҚ#I ZәcMRvDl:v_]B<8=ONvba;/@Y"ȁu}=pdj,A\Xb Q%Hˊ|-#N(<9ldPQt)gZN5{Jג }uYci|݄EnQS͞ կ:Oj<{IX,z̺sY&"[Kvu~vX+Z-¸z_b{.Klwpn&,:6ꬎ ׵r[ r..dYoܗ>s Xưꉫ|#M_& ́0mT9 FF#`_L Uǻ%顥 NJiʪR_-SA/[}E'@,*$HqG wxM RY G}.njЙ^.obyqlp*,JoXaUhBD%۷IR Rn 9y:r2q8pQiNB~pg5U ~սjE] aBFo_uFyIKo/nwP gALh֮(i{M‚VS̶pzR\zORnōMjSU=^4Fjmuz~zu}coC.;wWSu^Ի CoYYZCsk}E4;DE۲h`R6ܖHJD5 RdcH d&@Sc vK$RZ KШ%QYK7R`7J2zFrv.qU ,n6hY-:u2 9pi"!3_AjӢXG !mӮ6ogcܡPN~!RjPfqZc?FKOH`TzJ:gd70AX揹Cc>@[)ހ8oВ2}8o`1(jӴ d#UI㏫ !Ho71U`hS#8"oj{gBZ1ЎiOB 'R?a2 OrT=*0;٣uF6Xڙ0Dz)G&<<ŌN3N 3lxe? W_CYHCyxwoKst-2.0.8/src/images/svg_icons/edit_vector.svg0000644000175000017500000003605712277111530020446 0ustar synthsynth image/svg+xml X * Kst-2.0.8/src/images/svg_icons/kst_gfx_ellipse.svgz0000644000175000017500000000322012277111530021475 0ustar synthsynthLkst_gfx_ellipse.svgWQ8~_ї.i']V}:+/8 *&_c&$dۻN*͌gyfXrfփȗ6AضdIжFȊ\.Y8JF&>m6[RZ7MS]wߣ[DEvo-ǹY˲o^ϓxiw 40]ɭ̛%x2."f^:Wʠn(\L]J@81oT)ـ>A*nFKOCK7 ]hJ}:%MrbHru)bYߧIYڔ꧍Lכ<҆~>!i`=>_m/a^ɴWx]Nexw<7xDID ~.{5['3v/Pə.IRW"NJq^Dhwx,;XB)*B-"UCd_5| 7[ V_x 7m)tBM0 (E Lu7#l8YU7j:>EpgJPQ/Qz( =a$VCS6`ם/y@oղoZC7idBݪ@mZbWשv C3.CN>0{ω>v @vOށnd #@ϱ A]!_NY!yH~] tJdՋD]j'qU#z#bԹ(:Y(*g> QFYr.kfigצ<\J2qԛb4EfgTi8ݼ !x"+nG1b+F ߯@G߽79շ*/vss4aߊNOjFn F[lgן$ަJԤYQ99髝Ѵp0*qӠg Ľ̖[U+0pw8T"U[k image/svg+xml Kst-2.0.8/src/images/svg_icons/new_vector.svg0000644000175000017500000003250412277111530020303 0ustar synthsynth image/svg+xml X * Kst-2.0.8/src/images/svg_icons/plainplot.svg0000644000175000017500000003034012277111530020126 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/new_equation.svg0000644000175000017500000003321312277111530020624 0ustar synthsynth image/svg+xml f(x) Kst-2.0.8/src/images/svg_icons/datamode_old.svg0000644000175000017500000002764512277111530020556 0ustar synthsynth image/svg+xml (X,Y) Kst-2.0.8/src/images/svg_icons/new_string.svg0000644000175000017500000003320712277111530020310 0ustar synthsynth image/svg+xml abc Kst-2.0.8/src/images/svg_icons/end.svg0000644000175000017500000002730712277111530016703 0ustar synthsynth image/svg+xml (X,Y) Kst-2.0.8/src/images/svg_icons/application-x-kst.svg0000644000175000017500000015471312277111530021506 0ustar synthsynth image/svg+xml KST Kst-2.0.8/src/images/svg_icons/kst.svg0000644000175000017500000035170312277111530016736 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/page-previous.svgz0000644000175000017500000001704212277111530021110 0ustar synthsynth][sȕ~ %%Z}hl$KZo.mf(RR4>FDl eO454Ot|9NV #d/l?~ٓj=ZLF"~sX'?Nj8|uzj8n~Y Hz3P:'Ť(zW?0 ɧt"#|/oOߏ>_)ɸ>et2>mX96ox}%< \~4N&Ӳ/_6bιSO9Ez\GQVUۭRz 6-ku0-~Lzt8AVdOΘ,/ˋ% ts^xu7ǫ|zl|3_f'hmz)}_.oN1_Η_ޜ|f7b?׏~[_͛a\g9KU|n/ 8+_7U$ \YQy# c>ϖ+~}w?E'YA6Gj֏s辀ଊ@ya4mN?-olVtOg->0p.qmm޾U34plߓb2zvNfC6ؐ#sV K{?9pPECkifc1[Yy?V^F4UBA:XL'v/"6Uyzf:r;~_K/ ӛҋuklPz]C`S.Qd7Zt&IgBR(Yn})w`e[~ #YR$0S vD-Z WfCčbtA14=Ō`>P6vtgz㌇pԹ.Tع"TiL+ hңE5Va7oә/ytQ"iDܡit4M[%wDjNM4՜ø`ͬFx: Vu x̭c\VX1j>Pݴ"a ؖ&mĉ5 pX4췢2cf6K-RKLpUM%ҜfESf 7M~d€ք(lbڙFԡlJ,Sd󂎐 c8NNtݸ]'Xd+c(]d;8) ű>VJ/K/>ޓ(_M>5lGYbhL5zjRX 0e5s駱W?{BJ&> 9Ǔ֧zTJxrOOZw41܂,8zhVZaWNRbH8 +}aS/lR IQU>G Gߙ8_Ђ8Z'Zn ^P,[OWÝ"f'lM{áڎCj;랐{%i}`2s=q*ŭm翫L yjeٻK^ lt2k^kX\t3GrYXjde%//M2i1G/Re0MpHXps/-ViK$ \[r `$AAFFRκ?́F1r' JԧBC9u(z; 1Y{Vn,Wͅ|3pE`?¸&[˥ Pe~6y H>n/7햛e2v:eI@/݄'3Pq:c셁7Ucߖ[s ظnl{>C_řvTl$:Gc4ݫwlėX}Z~A0ߜLGBt-/} S=D77|$xRhj1>Η7yJ#/:Y-zX=<-L_z-hԼudœK|iܜ͟r [8C8~ b7J}[6^&Xq)4Cs>+z>sNw|(^|k0%$tܫ)^^xdzo_gZ&#,{܍p|y~n}lT]y &;HlֽF'p~=~S8zM{/~/brB%bH_>.ǣ}2qE#,Wg|I$$דI7kjm˲3@:7.(EQ"O'hd`:/.-tf|";"SFY.H Q8j1x /Ǜ+J>[-0/*6:9->_laOՓ8U~ZIe6@8Kd/M`_}yĒяd^EJ7|% ٕ3dHijM|oY?70@ohh4TA҃DR2PzuFzmЌJcMt^ĸ㷖ҿzW/i/eQ<'KCeQرBHGbtX'T^"Z.L¨CEMWy@ڏ@ڛ@z@ J!#g@ OjJWbV\nަ+]0]ʹr\ p_zC)āA"-6X,߸0V4g͡9~{7f!"m(9?ޣ!=m<7=!P; bu=g\C*?61k+.BU.B)>&{1gU=ȉPK-ZnPP ,; ^4DALʙ{}ɉ7, D^-yw <yNSC) v&/w%]%'we=(FTj jD(xwnkM(pAq 1y:ulzUS_ ;+}ߑU+g6a> VXDŽmKՌ ](wuX /hG6)9xɨk_>,$4Vbچy]^2>& uW5E"(LK8cǕ9'RI3.Ey&K:Gl5~_Gj@7wǚBoM B-)tEpD_YAY!#`x9#%澞|825 /jq@ A$1a#g!AOpGGBA&<~:f aH !\br# fknj 2Λ 1ގ 4hB &ה0ɠ=?{ox|EM`/|6%{qܜAqva/эUt0nK:: Caz (,XQ"@*U NWlPD9I[$m{?ZJ_d.vi>&*i\ PW2PpF$p Sʾ|\0M.o,:ujNy%XaZWogpLzOYwqN6ϒuK &`%WM&W^wW q^na.P]@ ]WF~MXi[_J_lU{zwq.X+Z-Ҹf_b{.mJlwp&,ຘ6׵r; r.//dYUޗ>orX0.r^+d^P690վ!v([BӈSB5Hzh鼴RڼWW;+!V_n4; ʪC" 0z`QCt#olN6hH$Z:ѫ$M?-aPwI1l7![tsXAmT=vT[CiGoB&~)dPq69b;Am3 |{` Q^_oTk|! ;#ۼ$7ae7;(d pYWWfMV6#JZ㞧D0o=-;ŸuþRnÍ,Lj[ߩflߍxk叽 r;:>15]Q'e+?A1Ĺ}gMVb֟ ?`[ XJWцI Hf^LrL($z$WˤgCe[.}Lz? Iq`H ~6|t)koi e2]ZBy,INOe(,1BKH8I"eG$L"; ȎG%R-[D*ɩPMK77&A T0ʡ`ӝ <K&*u5(stTʳXkAToɼY z~(;uʄ%pyJ)& BVF+Z 8U~/{?B_~yE/?s}˫+vՕ6 M}.y/4]/@/?V;o_{MA7 Z:mKfVdZHm+ד]_\^drַണаX{ﮂCV5&蓤&C8UZ`^ǟ]vdQmQEhTףF2X'{[!@k5pn $R*(~ uyC5*HjTiTFըA , WWfca5?ۢX_A7~fHH9Eאڴ>#㸜6^a HpGq1 1bGJFeSkAĄCi*D[ _:`_ӝҎVFeC/VOhݸངO5.mo4K+֟`*A?g?֫hpkW?ʎ1u5>[,Oq2/[!۰an%Z.*ր/Sbk. d|Fff~Fr 7,Ir\9&L;^{DjRc{pZXWp;5Ն0|0扸g1 u? image/svg+xml Kst-2.0.8/src/images/svg_icons/datamode.svg0000644000175000017500000003034012277111530017702 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/kst_tiny.svg0000644000175000017500000021143712277111530020000 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/change-data-file.svgz0000644000175000017500000002062312277111530021372 0ustar synthsynthTLchange-data-file.svg]YsF~v .Ŏ%YDpgp3HPm_Y(A5սx,#t7=eNE?`v{+G{˕7{pgaqzVa_**a" zw4[Yύ '\zgt1S8/nz=ly4[?Vpt=>w ?yU3'j:Ĩx=8_Lpq;Կg%oo-|o<^j-n^'ݏ#nZ!"CBY>VޓS|Шz pm}g싵2ہ#_@Z.ȟ;WË?/rǫqOf_#oޛxywr0-/)'_gqߏxOH~^e?,|:Qjz44|:ZKBrs=jvQ?cL|LjCiFsg|xWåU BOJYO脋6>!ڥ~hV ~oxzƁ7h]dnM5 V 76kwdjsuT0c1@s1"ًoјpb%SAx)<N&KDRZ}PEB.TxJѼ<7 -R1*zFlңZiQlmҒǬPY/NqMpyVbLiǗhz`|ogxb)%4A+o B`|@=ijS[h..ӍxXlEU[IZ'g|ҍ{ g5A:pPA& '?Wɻ2P~ D` {r- @flҦ?ϼ/!D9<8:ضVhE8DE SoP%YԮ)꓾7}q}y>Q_[P[@KUfHĢp:TpٸQMkh\3hJ3I[t\A K4>iIG- 5-mZ r-`(#עEZR푶m\7H0Ѵ lɽ9UYT)M:X0†1췛 F{,e:̐Mx 9qa*۽h~;ßp| 7 ӇLˆơ@.b76f"m= #` +y:7ӤM4V7Q1Dk:YJb޸J(rX o ;ש.a;|~z>nx_EpMLj b1x\IIBaNm]zӏȕiv`j  k&THԠqP6Td,e]%N/h&dm޸>4_Nڋc+ɻV JGgkM6N(GmFqHh*Spj5˻ϑȢfʞe-QraL1#JkGF{p:f栀i3pbGEIoP{4a(W6o`B@i:VÛ.+NS%^Y5,=U}齚ՉNx&Ld"~&n"^{aO fM縡H$HĿTP$jBjt!(B!F`OkhW*?i8hY.bǹ8,q%R2&Т-u%T)#̬`kƵ .ւ^Ȕ1"HJ4( ܂iRڎ'U;1A NēU4$\᭝ 2JD8B]z N,8!pf S۲ e #xRtMP&_v,sL gg-AxR⥪/Kn cmGgKXǑ-$Ekk;e^<#t!TN& h$UɦQX[)/{eTgyw#}@: Ly l@: L@ ZˋK8dJ6d[hnnE^n/LP2'77KLGI4|mг XrDZT;66UL A!_5@]cGu5&ͮɚ ͆wVzm[k (I:Ӓp/ZLԚ-nLZfc"&e*.iU04eYi,4AfG 3j& 30faZvTpB~lK@ 'un,/#-Ŀl6M,IYCIжZΚuB1I"D(Nf 1V6 m$X;(' m{&{[byu %q)Pdań hnsr"P( LĖv∭a*F\UDemmퟁ3"ADgHI W# Ǭ;Afp9i#uN)p,N i!@"ܻ: F}8u&e2B뻰X5= u"e\}fDs5as*%D`:ʥL2r]%Qk1ZkN5-JziyHlLntcsXRrQI8ئN~T%\"#h͕I ̯+G KggxH;+x^= o AXg(q覐H$wI2ʐ4eDu A5s@Btxdר׃D6[!1-!!5j QM!!6HHh IZ:@H Zc&ZBBk AjDKHXZjIy#6?GgT|hc.m/Ɩ4>G}|__K|ypVI0à͏\=?p<,/,Iw=IJJ5@=4p1}UsMǵq V"j fsNUΜ*sdzr #:8`NN;*x}XgE.^BhSw\lzHWW%aS$ oylr"#^u퐖s#I7eo䍺~O[J,6D'LjjNHg &XaV+s4#4)€k6ɱí4vuTC+v*p!z5OnM5GJ&JSI_ &B0f*7`6/"zlשV⬝"A)uHxρ1(„8f"M$y8%ѯg]XN6*+/4Toښ\YY5ݿ]m5 id+2nӉ׫.A5m,5NliZWثX4SZD겚v'j7{13,A5Cx1#ܜ (U7q:/Q.26*CGEʯLT^X'̾1_ٺX'˾qoٱ1֡_a5ws2YYܤ}dB9Jzv9UovlG't]KvNO <(w"ܝu?fqwBK;Fݤlf#.38F`@#.|Lj!qTcxPKu:Qt#u#՝ej{09^idƄ[WA3.n$ypOY8̻X1G'sy=ݻ!z[ك{N|)Kk'cN}d0:uM P[NY'-f{㥻W~)*"-6fJxV^'7S g=P_?I`fNi+tRw֩iAF<`f6{>F.yWV=dޘ7MP3W󞂻olLeqW|_WV6ݾ==G8ġ%LEK%[m=R0Q zݼR~ʚ*-6%-q5&Կ AU~?\iDMwƣITppOwS0sc1ȴbꆋ[xwVtiD=TK;LEݻdO㜀}|JbN&C8QBlD{*0fJI3Js16Jp*P"NI'SE?\"lRʭFR'WP`䲈#N=GEJv uYϯ\@G)m##^ڴE0T;hF2`e2ƨ҃NzIYx!9fB73iU C,d?VSO}3gpWZAݏjslnS󩧾yA1@h2zNBNf4mDZ:pt9TC] !lڊ9;U` NJOk!D (+c386qk/wN1u#m6 MT/}vVHv)CHZ:W.)6$9 J>ؠd7M2;u9+R1C~|>(iɡ[q<3"%; ׸S>HɎ8~υ)9%$gq*yH(eV-I8`yñ_{׶6D}JEh S/yf6lee{$%R")Km#'eCxt>l uOdJEN Vw܈RƢVm]şQ}PPJ9YCsWͲ'_wB9}n~7V%~l p+-{|B{|.%\GqAjr2~t  zwa:裡6zR G4A~1AkZը$u,VRPl9IsJIJ6O塹M \8g4uH6W6yyCoxS%!S-OiNoݧF1iIf߰*1\ܤE4fjh̼Dc142 ^@tCx5X8sk,`rAvIoR x4}fںIE1\/|LOٝ51pc=T{P5^#JWYi,7{9$`soi#spIQfƑxl| Jdb 6a$}XrBoƃD++/ H.LddReI =Vs2Oc1ph##БGgy:.vaѠ!r!#G/9o+nvG`Υס:i e =si1Gs34RӔ"!1E/`" ,*#/Υ|@~_6\Ii򒔗tkAaFu.+Di.W|\ eszu;?r @(mUYI-7JOGiY!lNgܛ7*kcyY!lNc|{Fayir$WW|\"Y]_D[ (+?ee9]J .2Yp܆(}3ʓn u*Svd ,1 V٬]d?9"0%ۉwÚ(Ww !}^5fو3W:YZ*Dbou9<:j}!رTز7z MP VV[\.&}nqh7#bdQ,{t^0gqhc UHrJtc9b8 g [[Q$C&&h4(88d1f8$h  $[JH тyp8J1kDpIWN+pR쥐Z|B-n2&F5ΰGvKAi\)PVg<:l@/!l &/3oo)-?=ۻ'Kst-2.0.8/src/images/svg_icons/new_curve.svg0000644000175000017500000003445712277111530020136 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/magnifying_glass.svg0000644000175000017500000026410612277111530021456 0ustar synthsynth image/svg+xml Oxygen team Kst-2.0.8/src/images/svg_icons/layoutmode.svg0000644000175000017500000004717612277111530020325 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/zoomx.svg0000644000175000017500000003764712277111530017321 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/save-vectors.svgz0000644000175000017500000003031012277111530020734 0ustar synthsynth}oI2ƉTjۋ[b}j"ekZ~_̬'XTsmFeVTfD/##_~}^o6.B\7Wb[>ſgon}}ᗧz՗/_wb}b6ᇗO0O׫WO{θZ߯?vOWr!.7uf቟|xyr4_4g1+Sӷ(qߣJqEiuiޓ( éͷrcYғzwJjj)oftU-{/w"U`]M[Wb&ftsVV.Hq~Zo? \W )j&?*en?ܠ:b>-忶9m>?~^ݭKDC,-Z2>n:fs|zY~y]=mo>.ߓp[Ez|x#i\څq۽Y~q[euuJ}/onf r都.( rK Wu= Ăt渷n>ᑫ/fW~*U뗕!%/w͗y1hžچc;:<.T?iC&KUjܯ^V [zŞw#Kyٮ ui}u?N@y[ٻSPl>V8js+|' eqv]tv0a嘓Yݑͧ|~6 bǻ_הGVx,#osn#HaHhR/mS|q/ۻ?7nwTWOM]h&=i*!ػ||t~M{\>fܤ{م\-BDTy~UϷ x>6Os裏vGLLqS ;jO2wb^Mn.ŋFvޮVM=>:iH J7dOdR-O}D'L["%`vaS[aeKZ{mUR0B us9Bz-" q9茋4]=i1r+yn/fJA4u,by"ߢb: Q* kNʶn:=t hKQF}ooJW!F^+,)O?g6 ~6E~"ߑN?aR?sΤp !<a,_\z;s6YCzyÐ\x[J~@B.&>fDr឴v*%zx_B^4 W}ԋ||_M~YuGj?h@_[:Խ3ꪣ?z OInG+{<>hZ{O@u \Yr Ք>HhT"O_zlϥ)H7K#R(!tDߨ I**y^/@ops{*1O|+T6Ӆ#8ĝ0]Sw=M50r2-rµ˫9ļ+H05= k 5]tzдnqMe-(;",MnD'j> .>ۅ !;0˕Lok \k;^21IHou-j-;`T>B_=ĞB^ʷ~A^apqEn!-^-tcZk"U, dk*n u;\SO&F̳aw moݞA1k2n@*7گpMf sk2ka,}k2emTɟ1$eWH7G]FePHv 0 e΁C T =ny:ꎑOCiq7\>˧šx848!© ꍔOCap7P>C;?CNxR8C` q:Bá^T8 zP?8tRGNCixȊC8t l2g{:_|H/>RsŇyC!uNCV¡aj7VgŇC|!u:o|H+>RƇwqj7VgŇC|!u:o|H+>RƇwS8:K|H/>RŇyC\!_;䠍Aؐќz!ySԉ0(v 6VŮ.6,%<՟L{k\$݄N:Rz`Iw7Ptӽxk2n7*k2n*d]H=5u/>$ F83uOZ ZD\Yh`"ɬ{jn]zXwʼnB`;c_ل0bǠNGyCfh_0`1{nn9{"ddݾjܮۀk2^)1ʞ&~,]T 8̂lT:fϡwm%~Od]5֍zOƯnX[G=w7}/>Q=ɬ{a͛]qMfUB;ezj "ytXQGF;60(| (9 ƛ1,o*{jN8\wF9VzL6nT:0rwN'hsXE\wUU T07vt_q w< EnqMfUmPjT7pMf 1Xdž#ӇnaᔊJj2wM\2ٜihq&͎u\Ofaa'p4Rq}š;h_pzq,5F="SANvHs4Y\Q,6x퇷ުn,o,Q݄1us=G 0Q(߼Ը&G`,.^8u w,j d𣮼55D3ghn aR:o(ݖQAiqNuA(NwAF G̏9ykomz9Uz9*bt/\aL83iL/\&k=Xۈk2*=o3@l@>^TlfA綸5}mQ:77}_crk*{s[PF-uBN {ˈWtuDW Oqez*=%,!1<252@1?wAt{ay-v5uC`4sL<ƄngBkΡτ1 ]:)G:>}W8wQD\Y\ F:tnh5^q0ZQ ʋIRp=Kbr!U6r ab~$k/0x:e N4S'@ju-An~MZp( !,@:Ʈ]gN>[$=5Ɍm%GQ(O`gh`36 8g9텁Nۈwڈp#k5^hMtJR8E~sNׄwڄ[gaZMXE(aԆ`B L?KRҘu1Ӭfb(  V\ ڷRbX ]t-e:U/[t:/` n0TzԀډӫ}A i[Oγ݈i:-UŞN{/:T }=žQWJgWDӏ` zzAO'@8N^#]ⷕ )O%'g_zXXW\޸CsslUklhCp 0ZElF7ñQi4Y\эJ;Gd:{чG0sS T}w /[tRqeK''q nj@i5䚀<0aLqVw"qMu^tsXxۅ3TS 'TS_G7Cd{Υ@7U`םnM jnmX\_ZpBō,XjPs;{'Hc:.YRv..:liZZ {²Ѳu٫uu',Q^vީT)?Əxּlg{jk@1ǸMM honm>FF1E>hqb J6sBks GXӄ?<ꄕ3;6PSrA!:ݿ>=u L~|mc|WPЫ/+#.` ygj޽{L,t#Bv$4g20G d|{r|M9,6Gzq[Lr>" >p"ԋ-_o_xYZ!?& +?z}sZ>^!W=S^|\>$Fp5;|(QG uiTof/ LHLKN02,3O~B/aZ&:JP"2EelRVdτJmM,SӞ ]ʪSw__Ţԗ蒽`;P0 8R*hX~I$@LRɊEXMT~雊Badt*fs|Z萞0D1EEWҷ'δK,UoX X\cYHl`Z-biUYR%' ?mcټLXfNv/SܵnɚY&+:Qd1UN úgvV~BtՓfJ-*T+˵/:RZ[<0VPBq,F3-Q !T4L4EfBX#Juoi.)֝v' lRFa߻g?V[ϡF k3-ɑJCzAP/$Ey(S[T]Y ]{ ѯHh2Wo N ^< S:Ca9 8x3UVg~lQ={B~;VQnWazag5'wFe-~ܨlFRlC6 )R'*qR$g_K[ 풌阊e/'|r}*W*!fhv }5o /{~!t$g"<W LYԑKa|ǗJ\p7N#Pϵ |ԡWgS^)k֩UyYR]TiD{jMSi{Q &y*v<߇O>vq/ CgByYrQ}TP%4Ry}Mp\Kl&ˀ ePӐfvY#:kDUIaWA%Vu;1͆aN0]$wƃ.K[ VjLū5< ? =c~1 zH„O745@kΡEWh#g 5 t d-quu7 jIё]B;l+)4~:T ;jeJDϯ'AVSeTDxf56^jMlЩ2.m[ 3M%בhg "yP7kM"@plI5〚oFFRP*6@P .o:H3Si M^kyMC$<,8Pi`-pA2 e@dԾ&i`}Ξo`?,3阌!#lK<c-wU7,8Egn{XvcQQnX&te) 5kِGU3X)C/3NBd,d &5aJ:ֶ+ǩ&,c/K0YEӄɆte]< qM=6Áu*#MSUl4@NimcUe2XnS-FM=˥uoV>! B(bXeTVg4H%p$ ĘEKM  qoiY,XtP,vcJk;na!V"x4Q!`&[89  D&S3NR/o~l74E}nЧ`C@`t2}ue<.tU;irZ"\ PXG`aa22 GV٩<([wE[ceIR㥡 1ä5&J*QKn \Q#cykD?|#I"\KCM8 UG}aIYh1z1^TA\"*"i2 iȵ U*ulI8lN X74&Ҥ9D+xMVd6ꡌO6e!aE YeDEH]oA9=vTQU39zK<1 L^Ӕ"VLjUTUvHߡcI2c\s$I4TVe*r.QDgA)grȄS6=qg 9Y Ҁh '>RxsdpƠiյjL*1z*FM6R7Qޫ@T순Ŵj;Y Zs*PJ%TzR!RqXS\=8[FU2[S(t ܿ\<=jМKq! Q2%dB跱ut,.`T1&)PHP$Ma)OB^ȳ ;T߶E!)*L;{B݊'o`U?4ʶ8"vOFo-ld`84Zі`$OH֦D꭫̾M2zU9*on_9AڦZޖ7C4&Ka,ʦ:zZ芶ɟECNOy gi19S0?i,Z\&9=i: TO3.SVm4f-?S" 1ՀMA] )dcd38@Ǭgr*42P2^ f *{1yZбP3ۋMs^T8_qL̔SR( nK8`lP΅-d,`,v,6,,&&0|q bHٸI3`ڥh1VId2[F3{DgQfZa&巹R5ߧӪeы\1 ٣Ζ:^ǐz @ 4QV+ tzyCn:&J^XՂUI\>W wrſ8I-}רH,'J͓qJ&g9tn:U%MUI0U"qOf;4KݴZ]zr^khJώe ;%jEtPR/6Ք\"R+) bO #Xwi@.i MyMQO:Xi/Nr^M|)xHz0RJA~{?̱dGd]Z\?+5#d_7aZϘ"S ̊&">):.ˊF|96*|fE ESghd%X6fE# ^htj75ìhTu\A_-ܕyQ"^DQU 6=^+C]Lʐ,KJU@CXgUAYɋ(d|kR5DBU8&-Y*Gc H \ Kor;uB}P(3ޒ(We0 U2J$"<449?DNtXTT,2yPyTY.REP*"R`ghcl{LENɹ%S c">W7{J)TVnON’T6JAc:Zm J4yu(fd[Q58[·k p5ՑTT/SenťP"^=@?폛g?)G 'hڼSoqZT)MuX>TSkpHk{M]E{o1`7#Ryo6|~b#M|h  &UuuS't^X%l^]ּM/f#Gj̨؅ Qxf6 3]rQ\.¬_ZFvH7pa%yt) $\ vمjM8פma74D (d!;8 v{=\ۭne5?צ[->,T/|Jo-߯iE9QͱqY2"KRFC׼^4\Ss9 ZH hR"B4{X֭U'KLHCƼ3®Vtj%Zx;rXZQOaaZ&. $j@ qp@ yߐ8Ԟt%|HHPMl>х!C tQ SR=~ϱ;j'cZcwx HƙV=-88ֶ|zXuEJF&,EB]b*AQ˘Iw!!Iq^8YDac4)!N ߨK>C` 0cylG[  Mz*mqԖLy>-ט@m& Qo4.HX6ǜPÊ[# $֋{XRF$k:9XNUctA4yBFmDbĜ#=ʯFiLstLRb x0 Ĉp61"`zC 1tR{7~wGKga_A?{FW!-OPKst-2.0.8/src/images/svg_icons/edit_scalar.svg0000644000175000017500000003705512277111530020410 0ustar synthsynth image/svg+xml (x) Kst-2.0.8/src/images/svg_icons/new-log-event.svgz0000644000175000017500000007176612277111530021026 0ustar synthsynthi㸕(ݿBWda_n߰ݎǛwuT8+3C]տ@HQʥ%EBpxpOohI,7X7fu}{)v,~zݯWw>=<ܽ{_~)EO?byo߭S/Wr}_/߾>lopoyI޾9|>ͳY^o?ooҒk\[3!O~0M#&Vm@}~us"<נSrd7}sJ×(x7}=۷e#,5T̻0%.!P?~zO(9 ԏ?'W|-t=_gI49Sh>l oS IYN}K,B붐KVJq)&YR8\S!/ŀJ,E.3 09ԶM $'V3KSɴ% πui`çÏËG4#QQG,A1  `p|טό-V6 h"<8/.%BvWx_w77[6{HTA`tP(IQR 9$#KCPq Q{ MɂSmĠsLU߀ 4_J<=y %Cї̠R'_v-btp9}OK'nrRbp c)O =ۏIB*wi:Pvs)bt|_Iuͽ Isv(lw@r~Be@uRa1JM= _A8yʆx3|Xo@  K`wGfZgM0^8m;TgځX Z DZ 7dv 2;Gn*o6UJn#5ي40"{2[:3m"ff˙68(3m$iԉɎ*QK;5Yk=GDSx)TB -x܊%XI$Rd!ǀ IOI`@#mJH R[V3j{SƓ9B:!Q!LsIX*rLqL)җ`I_1"`4@8E)4=ŅSRE*]r!PJ5UG~J.B1f*0Kn61 ?3x#)I"&x~oVEHsEs՚c "ui.njKhա]b0$x_4-+lTp%8'K)$DҖRe\rފއ-0&Bq\?hCչG'|SVE*tqI'* t[aAs,u^0#<\Ow3eϱҗse|Y$h+MJP-_ʬ@'DL"RcXlVAR[PZm׻]xj2jLv\EZe*-jF3.jiv`OOT,Tr6WFc 2 ;9qO7IzƁղ/vBeSW[쿂0HN})( EswV cCeI2,HOU{ oܷobҎT7FԘh't:^eG0i5 /V( MJi,&u)~N+dU0j5ypF3f6^:KU0& WgڮWyhhXz  z R!VAo`%G EQ¡L,_K%gL~Ce'AYg?T=7&6!|44 pgG!7g(9C1цh*A fK\&ܯy zH<j6=xG¶mFl旤uG/jdɘΔ"sߗ_)DI&*`/R&ޟ=pTvM E-GFM e!+ApJT"_\ =# kj5s! nIN_@7€q7 XAJg<{?Sq?a?X9ϟJ$;ihKII$j7B/0C=~yND^r 79OХL@ cI ºLR!8fGlF3\EPcvd|KS,B !fgċ[@sVE0=+tTgc/qW6Wp2_h2~{Yp  V4vKJ$SLtʾ\Jp `. )HTXDyr0@`4Eje ޽+ ' !!I7!#M'LX\[Cn"Y M'Q:KQ&iOlg8.؛|DgO7C0WCFCP=y9Ū}K3fJd"]Lt?6/\]oȐ[ŔN7kNQs06?7'TY4/_}@OрD!rr+ WW")[-qЄs0^ *fRLT*N&X24uxi)c^? iM);t}JѱiMVO$_Q&hv<9+_ƹh՜ Mc0ɎV͙TRғr636z!z2`6КTW.5W.˥O?s/bbژ:p= 31ۜ\n!rQz f"8EW 7U 7/D^m\ra.bmOK/ 5H=2iG@glqI3N$glHaF-j v笧 |{LP1`kK "K7@nzKdrtX Y+vU| <-C-ǻ'Wc0K>cM4IXMyPQ aKv{1[(N5$ *dXrʇJl6OK4/ DnĔ |w 6 (XB[d KlX(NYx J'PŸ EkB] RbEleZiNg$]}WI[IdⅲHuaІ$^[&A1wdd-qn:|D^1NQh%XHC|mA_ I:!uUvhI8d#ܘ%:*Ey8UDZ *;hx +- ݢxۖYΊ)~~ZLBEbHװ_1#KjQoGv޶*90yamsӶ4@&I! !0Dd1Ui 3P]*;gfP̘vXcU8%)(TVu|FH?(IEO Ov,ճ ˔|x|7h^6m0Æx%KHh4-91]dž}[Y3ke%INY %2:~_$X%@0ڦ%L ('~lhhDE䋕ɹ\Ngh*e:uSXٍOVv q; 3Q PImc qmRi4b9aS#DP0R$^|pRO5LUİh-,@?QDʙ0û1I1,&#36kt[qE9m0&,qiVx{~m46fL5"[gxzն%q%s<)11?$kx5"I7Ņ l] =[$ jM>lD1n֌8pQf3iBδ#if-aJa!N :ǿNJtdR|>l1 ՆсVͩ)aXE cN jż/a'tH8ܩQ*-t-:M˧mՙM`" r )5pS<4F EFZب-&xłf\Jw)Yb>]R݄m-Vtx,3d)-zbX؏򐦲k;RDVaHnO~Fžr_M )=[R{#/1cuZ0%xrɷUrtE0ٿІ*@!{-7+߂m+L9;WAuw`?*xܢǿ Zr{S.9op qz|7**bY.u|`Ϊu&0KBض%O2-f9fU-:u8(2P;ZJ+Tp›MWV[/ QEC$#%~G-39 A7PǜVҞ^k sVg{k;? {r6*N,-%ݱ1;3&-@?naBkmBl`InLp'JfgƬdШd+wHu4Ш$6ۜ`̉rOnM ,0 mN0d'7&&0qg(&qls1'31#碍"B䒴qBSi Xm[ >GEDVT7 S!qيt4.)-\cx"RSS:osig|#lGv;);?xd &=x^j ;vqQOinwf;3/*568.&4&HUDv|ޝQɎj[Ev2(ٶ br,QeOi[Նu-eɅf7Z%AT2GL\ f mvk蜍xpct2ӌtD4ۜHk v[AsӐ,e1IމfSt)&6Pzkf .WINZBs1䇓;ʠBKe #Ԯ4(i%b7 j,0Zb7—iz]gW 2ܹ%y\UbQ/+DRmI_AVb={m&]*  G5 v-Фa*Q]r*ix VʸqJk`Ty朙21GA/`.|lJ^ocN0WcFE q.SvcOrmgs殂cܳrof$/OX\_[oΌ¼Ý}w!χ;ldîyVzZf7{Īwח-"M 񸓤1>bnʐDypRUsGb|{Y$N:H5N#P0Y"|04gA\LF`I#Ĭgz0YME`ikiĶ ?ؠMϯ0}(xJ@ -,$_ӟP'Ewz3B>Nt:iTp;a(PDPh@*Hܭvd*HK)I!;՛ ^̖.8[\@P9hvCR6Rr3T{t^ǿ?ɟFrVCFZ^`2ߍ"ޓ`Sz=jOmțƗTĎoB^r;@Sʫ̶w&;*d؃?wʀ2 ˕žP`s$%萙hrڛc5' ۡߜ$ޛH %oRuhkmɗCKOl'WolBhuByI\ZgƲڷJ80Q@=k33ShGÝf=a(ӄա}3(%$V &B͒!J \7_|O̹Y2& Q?E]/:@J&{/GƧ ="H4Vu];=n(p/eNVuCs2PaoJ(`jKJE&uǏ7)Km|) ;G sϪ4K #SmhM讉 8l?=LAgnl nno3U—<|e$ )>xiX@p P,.H;( "& (HР\J(lQ-Ha':)BJq6!Pf^ĀEIl{RZTsxJ8+".LkR M1%;SZ,QN^3S7< ER- P3RBz 0JqR +4B5KPdKbA -dbָaS~l2͇&/;[6!ӵ٬jy%G8݄L6>WNhhjvy]`b]$Lȍ)*oMk%q գgbvNlLK{Oal`71/Ÿ#>L+YgXM|ӎ71S泅fgf(1IllJƴcCwH4-0K^J+P{CsӦ/9庄m͵DZs.:v>^l0ca\t|6nvYP J{Dɉ61URjl7J˖ .sͣӫ=;y>hq׀\sRIǝ<pVcBkE| hb:3XydheV>+9hkIk0b6lSX uc%Oz(Ivk{JK|li19Pد8cWa䗏ڃPq13j4%, qɰ!r[%/Q_@sRҐХ1\K1m2]8dR 󌔳 +a-!m զ ڢ?,s;vN]' %sPaMI$D(A=W: (" %J6ʶ(% v3ufmuSl31RkC4ʱA16^6O؝kIG$`qpckjS.@2$]EiYU̓UN'ُoͩߝ/f]bK;PۢEZEv% *l S;T:?#XGvw,^@̩FN| 6t  u$̥"32@?(ST[0UB1dc=͋<*8;e UpRC*x G bQ ]VYi"v9; , sQ 3ڎL(xx@>uF\D. q9  ckFDka3 cSp0!Q^-:͘-K[CCWN@X]G4hˆ c%kJrMA(3_2#w]8*p9Gl#*s8*ŦV!4c.@ղ\\2]aD<&R)f]*[cQ IH/Ғi%쮿U79ucs\/5*d *YyDIQO \`-p35AS]ަU&,3tY2W{[a "H4,x.0E4 O1v2,=1E4%]buqP[Ne^Gr̎jV.ȉ6 y^,E3Ciah21B+QhKHhTkm%''G@=Tɚi޳90'Ԍ:<6'yUI^n@>lT`y5<ag@,37"/2@r,l_TC1O~ P@+ZT6/E3^T P[7{ό{ PSyt5@eS!e2zz[gaNx/e(uKȇȯs>4D mZЋ(h!iRq_>6ٻ^]i'c=,vTv z荦 ^sdG@+ZJnkRDIN9Г.wꞭ茣u)c85yς=nnn7ۇow[x=GjaMyY-+w-̸ht}W]dr)"=x3%#VZdV sK%zj(tIQKx䒢gZŵ{$15)~G1 >CFE[Y2F¢hI" !!YUQ-z|[|Շssv_^=|o3c8FՎdZ'y՛zdRP4MK׻͛DIlUmNu#ENEz=$ǻ SN`PY}@Q&_4Q=bt3K'yG-j4UKXQ (л c gEʈ5 E΁*̀@>gZ֏7R)Ñ^̾RεD.4þ0Jȅ*c+.[x{tyh # V )$T"ZRxgqEjFZ,Ѭi0fEj lȵ` ~aJ  LHQR .Y`z/_cI< Qy,ås%m,sS,G %%+z ܊,4 lq0bIt9YNQ|\uTXE>XMXxY hN!Ya{Nd]JB9Y^'e+7|ͳ&'l=|B"f*o Džpc8{^z>! rK6Y>dix66zhb}>0V9#Oжt:Gout|\YU%R>KfA(|`-(d8X@5#F+T qXdDDaľznq d ڬ7uPp)P4dk#9z,O5\q4WkwSPΜhIðRYq9G̵fFQqX=`˨ 2YQL(! iH7{[2:14 V9ۉ."ݓ@g,AigFMpJzک*4IAeznz(82* B9#m\HAUEpq`E[jhSK# -혶 %J"9Rd¹@աhUY:1OpLYAԻ@?÷47ӌS h^ uᨤ &X%ռԱԱ*fg`Q/I f$]Y9M/8\\߰[]e! \ sR"hMh4V,3[) R@5pYHĀ#"p(B2h,sB,7.bA*H,8臆5@{+4:N)G~H妞Pb ;weo~]|Ǣcʻ/Kg3x_NJ|.]i#Vc%,0mQ8H&Ҙ@wJ Z  I–q*^njG )>C{V x!c ,uM "pG- p-(@Ji9*nk.Jh9$QcHS~o9U&>{IM Ry0k5 BoڋpQk:TIB_O5x忠Jae/m?фt>[m-Ṍa˜BǼfT9:W^8&N6!+S400:Tc=U?HX)IgCn`$={Og =" b%(V#R`b4Kfu)KQuhsᕡDHdpZ'iHXUJ0Bk*=3]KJ[ \4Z1H- B@HN-,FqRLBʎ5I BJ raŒK! ";d)Ē5` x4wmE,֫}Ȑ P+ AYQp!c 6DR*8V\V8iEW,%_*8aPƶ&iV3!"Tr.0ӆj[&#M[<:8/OE9#R1W*L7JEē={D tNUAkyZ(Шp5 We¦XґIZb^g${@.s*IӁ1V)cK VL %ZҴМd퇧T`Dz'֬J˰s *0ibNs8Vh\o7?_mVݭ>n Xxo|o斋qWR`2$׿\mލCa6vH`Hiپ-(ꀴ!x[v3K$w_;շ-_Cj~T./[ba_n`ESDfB:pG|=:۷=\k-n,fuW`b[s?^~X]<^׫Wn76UtoP><\|<Ҕ}~?;\x=𲚋‹7"jhַȭarHiw?ܻ.X|u=a .nZWM.HJoo%8jzXOs ~{?x \n4`@[m|?nZ=v{G۷w_#< Wx CvsV6x[o{b_>liAPg8X5ysl@ui⚚yFzJ׋szD*csuzwu(qͯUsQ:EŊ#tjr0TRSiN\+gm :6vSLbwq_MY[lgD}ݑ ZA;0RYB?`RbTJ~DeFh$( =8oګח>*(SX |;mS^ɤEջJ(ΡR+GauXU(=#0\16%'oR2"Zdݪv9qƀV%';Q59-u4~_13/\r LHk٫샃$w9#;0H֫"xg&~ 4dBRaX/ 2Y]~S^/6fBMld0O,fcXbhM~fM`fp_k +EXJ/K`@\SKz1/M%8J`أ&cDGN&|̰hbBk&^@20IF`,+u`s}@u4~S|*c GIn`&S1'\T[K5qPcjKm~ 4L61a5]=&؋CT^NKl={?pM ױsռ{ӌ~ӎ4XcpQn{y T YBsKqy|$ppw1Dƨ}ꖓvh2d~GZDs9xg\l$MqCĸX HptYТ}`\!ii 1]1; gSozMM&\- U [1+ܞP P%H.;FF{Lu} L;2, dQ@L~XT^f\)t]YʒK9]>/‹ Hb+/& {`r0ljCt-e؇ Hb[[6X&@ wZiAf/@ykjIy`Z֫=~$%諱^k;;i});^2.0rBGPtl O+h7;wS)P( D pԌ҆c/fPKh-彪/;ôÞ)|Óq\=&Y2K#iߔ55{eD}#n+zVMk;;i}'#e J@% #T>'Jϥ\>0MH2߷M[AkQyas*jP6ʧP XSRi`@WTG-cM[,Z)}| ]NI'vfaA?x={*lAde-ux{iXQ!`-Np7JPlN ~4Xa-dǤE5 Cl į Q1@A>_%VxqbCvc>b/l)TuTBm (l>~Rd;PT&NU(=kbއ۫gHgrz=HhhPA_ 1LDW si'P@=DB!T-0c\T~A]LFt$"^TɤZLƪ$G'%@xZVMP!~_FCN_Cӎ~L׍IB+O ,-lKP?\t"ct|L?*eox'KTHR*c\Owtai Il~(1%čJ|@fdh Lq s%FP)5ehQnҀu Kɔ" /N,dQb"5b T;vڒA0- \vu-AbP8xg", lɈdكIjvgp%zۿC^cCr\f{gx*cdݟ0au>vCAj^Yx[8nK۷__ǁ~]a4o ;[gDYnk+z+=e?4FQ(~(?A.8[c&ζuss?jFQ`zdUGz{حc,azM^cY+T(.Pvߒa"B#Y2jˤHeeV a#pz#!jM-4 $nKa9!u-VV~Ӄ1(ԇaX%1QK^C煱 0WP"A&B XtBt+V0 &^Q띯@A7a΂φ HIX)Z+Fs=֡$ZJ- ocnP L3IKj{@?2^? *A8KKb(Rpn93 lIAXL! p8X|R*4d-$P vkGc~1-vY늤ۛXz"8Kb#,ipƪ&RXck& N &s+]"F$@V_FbDv00#< %p /KШ#% +K&8j)AWD#t̀SCGPDs'5XPR0v}Y l̶{/[fZemj {Mkߡ31Վ,%vo?=lS bld].{ Ϩ؉Y b4 d&Sj˕YtCUw 3a h;\*8576Oс,}u3(N8miDW^~;b TR- >c]fӗبR=1q{ >)Y:M 3U'5vwiU ;hLط ±&C`psyx6(H# 4|t~50j4KJ&ww\ FL<ҟWO$Si93˙*xxx % O8DmxiԊȱk < p k#YtbK^YCDCڱ<<@D(a%1wtIzJV[Y4k38_܃]OZ=,-&)χyxz}W2$ii҂S^nYQ!]_lbK^сh(hQK cV_4/XpOtsIJ/КzGVOp/X=юjy/tprF;2+@:laWMn'A?x)H%D&>&B7jtDDKŹ;8/n)]S00)ZQ|&҃ͽ`TjbȈ<7m,nJ{EJ9l,o%C p'Nt?oaP# \3+Xo",yq1Mpdu'6liMlb&NWfW1K4|cj Ι wťw}Kx\V [Pww{4ƻt|]z"pvj+ڕڇO|9-3GWٷռg)չcչ3sw0xQem5 `P+8wřF.ǼhGVnc5nOZ=*3X8p#Zpdۿ0-jh-2n.g0xu(x$LgW/KTu;{ZUO*7CWM<ҟٞLΧ|'K'E5$W=Π o@GF{/kH3QF6٘6a0&E@tPc_@23{՘wVR[K༢R+ֆ9;<8Xw h\$U,"ڎMϨ_O*UQ"' 5H-TST/12W7hMJn6Uun /p/*x-+x/d٩ q ͤc[ċ*朡5B QV`knQ8 ,3CV]Tcgo* U\ATAcbGZi. ,nO`9,8e$3t geWwè'èič-E]l[Mxa} X'r1ZX~?!#gʆuݿ5X)VeGŔӷ]Qa ݰmG-0s jǒ/:otB+Ľ ̭@ȊpŸFhxe:EK)#%U&$f8Ё /ҡh&JU$PD$9_ a(]P[k#P#32Bhi%#֣6GyI9(O%["KU]_cP c XW5beaB >s4E3ѡ qC0h>e|:’e>ͣ Ź@Hjt*%вHG\a_QX;8a&${!ȳ$`,1, .!<})dث2)[4s5"S,YVW]UVO<дAL# oTGyi vN(^R*\kr57YYb1E6zWtp`kK< H. Ve IG}!B:wx`3ρp})*_s3]QUKYEyڰ Lpԣfϊ X!c 98UR Ϊ mB-ll%4Dyxx^}v|^3M4o֗B@f' Td@h}.bhUI=Yqb^"sg W$ʵlB SSg2%;lV5qӸم7! 紏W,Rb=+:JѩyVKٿU\,V6Ǒz`Y%~X^eJa! uJ}}6.Wyds/x|d3{ ]32SI8 )z!gqrJ3#~~L1c.6u(g%@iccJnx"?fc9mvzAHUf@ؔ;L VuoZ RψJ{lG1LtP3! 'J%d "yF7QS"ҦǮD0I}PX4mhKGGz2?zdD &NWqgm>HAIgml bbFYN[+=mxݵmkģJ?yx_ 8Scxxhj5xZJxpذģE/ !zAt&De⁏"#i&̹35,]%^Biҥqi/bjFNNS7hJZFy~ߡ Z;dBw /;˭8fqyϓrrX?4wYߨlǡ{]usޅXَ}6,$2Z)qg΅9lkL޿Qy~9騝BCk'ϝRj><,;/tBK%~xkc[YNlJyb҄ѥh^>(\'g|kwsvvG`tc <Ymt9M9wԽPѽP7{J7\ʝߦ%hv3|y>Sip}+'׊ipԄ]b 4im+O[ʹ$"EUcEVKS׃X?7a*V5M4o{汆?6_vDNݫGW5s{N9Iۅw[N~Bv /m;gQs/׶=elNDƗ3Y>~:rFj ;s4שݹ#ѝyi6S^ʊij} ڍw[xBkvg~g7jI93Έotgvީ63{rFtf?x}أфūz y|x]vBr3NW`ÙZgf[bBrPf묯ϡz]ۯc`ݻk3\Y3NW1xYOWߵ#gUǜVgizW%,>ƻЍMA}A^^u.[)TJ<$y4Pϒ0Ot.Jœ'g}Wx~A2sH,JF&H"sIgy<2]n:~#4f/f/8pĻ(NOڧʲ(= (bKEg>Cr>'=Rx)y!]^F$'!HO:SgRx#'FFAC Fqp\'ݚW)$t$SNjx[!0#dHϪlē3 A8әUOL?!6'Ȝ>r!gMaiqP님{0)Ȝ>4t!1s:M}9ygN)9B!Ő~RC EO\$1s/Z؅}ʜ9}~REO5ӭyps/5E,vO$=tZh% I⿎'X\[Uu)Uc7Z$9ixL 3*5Y.L8LpkRP-=9j0rHPSmhf|. IF !.;))|j65`@ߠP!DOfXlݏu\Rux)fڵ-[}{+rG˻픐^ VDs!ѢN$ %PIE 0`OzfkI H8:- EO%FS$b@i#+?CZ>n<:jpaUlvvVh@knАer!Abo/PjÈ\(ʈ3.hAU?rvʰw&ndXL>ӫ6P\c@ڹU##nDyhh2TTOzWRB$EZi|i>#P* ! Ԁִ WZTMfd)L5[;!Sk'uک T́~8恵9޻$RkjH" }DH֕}[M3T%пL'Ґv<\R7'CZT;1ZC~2v IE::E3Gc{Ex~Q_qUPRF8Mpm!BDX{a\"55$nAS Oǹx+MH?G\֞;ݑzi~u-bOj%qb{nh]#VVAlׅMr=d[WiN̚Psp~ O[4%sf:/%G;9 cf*y\.*\hH3a eXwܸ\_@^.^v;ͼܾmRI ,ʥ G9C 4c L<mEm1Yw9A50)2龱(Ўְ\;[A1N˜MkHk/LN2&.i_h89} n& ~޴n(#HWm `BK>e``-춓9  ND'ƦOhh^p64.J㙕Xd^R 6cj!m.n1wuuH"c^)u~Cԧ~} ֣0L3Ϧ&-!)퉂6Fk}1skZi欏WQ.:wS@ە iv/gJlbDe㿊+%, ` :|nj\^2}R1,#88F{x.?Xnk9{P5EP pD͸цic|4) <|8o )z&|& *hĄ@2'ʦa|xp P3&voLK`pa /+I 2WܩNFL$lHonNb=tiPc&%NIF^jf_i >iChn2moF\& Z؉ȒPp"ɫ^̦N4/G%$ޝt:||<(EWBG(m|[{%zmb#p sDP.^ۊ꠫k @D5Q%ҠD0 vu0h&?'v{𼞿BS/eZߛ[reŜ院 BhtJb]](WͮuOj]/v˧.[WnQ(5'Tv.vzyP?CB9_>i[svpן_0B pUUcZznK\Z.vƦp%@wE$3ErY\\X|B1(}'~ 9F0+]nJUlKj]lϠwOev(ez}Xlh.WϕYyge} Ny4ŏCwPM#EMEAt|H>"_ T5[QZ}N⛯ޟԿ~:cw?F{Kst-2.0.8/src/images/svg_icons/edit_equation.svg0000644000175000017500000003730212277111530020763 0ustar synthsynth image/svg+xml f(x) Kst-2.0.8/src/images/svg_icons/read-to-end.svgz0000644000175000017500000001725312277111530020425 0ustar synthsynth]Ys8~ ]ˤc_qꪞ,-%K,$9p7PL9N w_nj=[.NGx1^Nfӣ*GfE|zX7E_Emdy~wh@(n >~] ;'0擁 ׃A}ͫ`X,֧G7xy{~9Z_m+Ws\O<54'm*mfcv wW.?&Ӽ/_c1ǔF"Z?.6|)R1>sۖZΎKf&GqG&Ѐjc<~ǟ֛j|<O{iarD9+Xwv'ޏ׸Tʩdl7IYcI1Oq'4]r\MU~ R:B}p% Կ+\>5lcc)tx߯V|Ov{pG[Q_,GѼ:"{"[V7x{%J{&ZϦ=ngǓx֋]t3_^#>V_WW1}7L^J$т>;X нݓ{|bMhmm߇9mc9%3Ulw='cvf/8~~fug_Ӈ{1O}ƀvU%ٯO~5p@}ATyce}#`NӝN&NӝNVn48N(&IQ* AL}Wk@J fX$ۋ= FH_2)*Ʈ~ܧcxJ{CWSJWf+xb )ΥgQ{ԤV&v0rpZ 7P~hio4|O [\2ckO$c̕6A7x完_^:6ˢ$i#K}eQѾY8EB&]6-H9=XjSŒ0l(0ҮbSR~RR}R)UPm-)1HP͝R,aXnӖZ6#FR) JR=)Dju:w#6ɶu;" r.hR} 9R[W!nDCDP"R'Gcv1od y"~g;MƛlMYUg]\|JM:CJm~J- XvpdٽȉV.oX<[0fOiiILgwᗜP܅+Vt5FKK$Eܩ&5'.H/7KýA o-ل&pe[|pvؿ%ώm{ٗ|"4< pKƋQb M0|ɨK_/$4cڄyY^2>& uW6E0N0(!YF7mNИ䨲 #*BY~$B;ͣxrR+å I j՛UkS);¶P3Aە p: SͰC]Pr޼ 3[; 0rؗzaP= " xD)Lj2r(B z"<,|04!.*gd..e mJ׻VĂ1$-Ԯ~Y-+G5\ $v%kKƗT" sM&W^wg@_j}~N\&ڀf8i A}/F~MURS_RֲUzzw~II+jɼBj_b{N.J?lwpl&Dl⦫*Fܿrڲ J6Ey gUK)}{yj }+Jj7{WLŴ7N+*yW`z"*-Iɍvs*NqV+8؍${z`AYuX8d=;l=0jBiM%"0 !Nj*^-S[ţ_ĖUVfQZ$`A7Bc,(^'Il&HE?p&dȱ˞-N/6ܦ? y:7>{QAkݫfm^+՚o>A fm^ޥ7anW@)P gZAkeg&"^_k}˩[[0z]wW՞{K723MA.}'~7RJ}wgWgڗ?VwTjyTt ծk!;}/?i+eQ97mXH,6 Rdc@ 8]b X\m-l"pO]t4fWTI)#7R= {dԖ!m}Ivd $8z,2D1_B\s q'Ϸyz-l޶Yll.QIxI;I_~WI7A;gDj8Q&2WǨ -aݵ,meFa1$R;e"UQߒ2 ak0*Dz0-ڴ۝Mr ؟t;d0eb@{Apw5f@-7k <5ɤ7~Zeb%MlRmgȁ}]d9rW52hAUG)YtR l'v2Bm$csOld?o| D|sR*#aR:0aH_Rt=H`;Sƣ82CEUIluqYo%[x1f˜~xx,h)^%qwlaE?'Dף񧛕%d4GLwHA@¬}+ߌE]UT+Clt盷#7Px&Kst-2.0.8/src/images/svg_icons/changefile2.svg0000644000175000017500000005245712277111530020310 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/zoomy.svg0000644000175000017500000004154112277111530017306 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/changerange.svg0000644000175000017500000003750112277111530020374 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/changefile.svg0000644000175000017500000006072612277111530020224 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/y-zoom.svgz0000644000175000017500000003210712277111530017553 0ustar synthsynth}isFw nK;>mOL;&ggb;cEQUZKb_ϓI AJ&7nY7xzs7f<=ތwMӇsj4NdJ+ (??GxܭJq#ۍz2]ݰP>O?Ɠ[9)'?O/ QojYB1ocKGx|xw3lP!~r|Oo>O/ DU5tWfJ٠ӈ5v3z2>KOOټT#O&Wwl|u0zu..O7OeyߘӇ?'j]t k.l@|ng&o~Ɨ?Ln9<cy&_f;L5Hi9?|XvEc4?|gz{<Vڵs7holdv Wx\ug iy9 i H?D|0Zꘛ6.mkOΧɘv?4Ռk'@`v ##>W#$/yH/3t{V0i,iY>OD̤Jf.?0鍜o&ֵ`6H SŞ|oyqfsFZ@Rh{J:=0W7A6Qm3[iyyw1Jwф]qver{Пތ?>? o&r|9ڭ~ǻ9ϓߨ?'[>=>C;~h>9-eA(| T1eJ5e!$thd+Vu#=Оf/28>p9MZFc:\[Tһetk(aMimdeC6+u\ \] ͞F; X=)q1\$jD2vo*PAIkFSg^}vK-UqX lw`TTfSDx1]s]Pl!VjT#oA鍉eƵ W*]?Ke` 4ZehaH` m73F]R/[ozgNks踖f;)LJ3ހץZՀ-Up Q a*[gﲱrgJiy r1]WKvKaa4hT2*eiz!tlGRJx)# $A7Hʖ 9]ER6>HJ37ڛƚprXtqYW[SaTJa^S87t Y":9)U㇧7Rnp18HR&x*`i7BzD\-;%llXh_Pt ;]:cٰ1eFk=}];G ?ԔeIɒ2!J@^r(qU'%V>N 2sC!LC)w&.<v]2'kend74gGZǸh^ : QpA0 ^X0fiaq TID+m`gʼ!2` {8Nq0;vrFiN@ >=(/’^0⎌@S_v3X04VH5R_ʄn0QhW[W)ucA:Cc0f? Ku kh ָmv]!Y| ś3,~U!̌N3PAMaAJiU(_izcHƬ(a`t l .k0u_ {~уaj+B5 ә9,?1ʫ.}POi,^j_FSxW@XzKjzip7abm_U#)B,h0XCy/lO]F`$]n:),@T{d3Mw}`5نFP Ool2Z`JG'TڨF:!At\rFAڋNw%[<ζTz8;5WӺf7'":茱|;lfpe] /_[f4.je=Ժ>ֵͨ=uژꕥW/>HwˠQ?fnkF6\,AACv,=dw =ΎM "0D'-\`F=eRVZ5hpAn=N*U$}7[F!m"7ji&P8ornlE@(PQmrHt]"fTJnPBxrjA l=M턥% v/:ؖ(Nji0ɚ;8_ f9sK,q:\YI6Hw|bP]y~o}Dyd6Z4ZJ{R(u>2r1D,\Pi_$ cȎ0dwEHAGDžE۰GN]D^䫶Nq>YЊKN``l:Y*om}0_]p{KWviڰ, ȃMX5~XCctZr=ydރv64@n>;6λ7Krһ| bG"hA^t]??i+=cpq>Cg#֍ Z3qw~CLfOИRlfH72 ] TP%#4 Lz!O.AU K0Z%C N'VRZJVyw{h 7afnwV.o 8m1ty;7QtyB9u)R@5.y1h# ȫ|tR2 {-{R@IXk :ĉ Ioк]ve ˗i p{˅*iQm;@{N;F4=xsl \G_m|>.Ahads`fLIu#b|OȀK ӦxG0ѱ D|2'uV\)CTZ5l,#[J{]Ϙa2[kjg5pѕ'59Q_k>4lm&%+ `4's*EtYYۏ0 T "޺2gkONK%' {/5[]q [:PZh#;DZ$њ,[\[}vF3 3kYPfsFRhfPf\JK c3+  d ބ Ba,>h3 r1a?v8hچV_R>ex){ 7B8R的 IW׼=>6V/}ui+Yr/NG{D3uyPޫL=*:<)xT-5z8)%794chr۩g}'DFѸ!vd u'ҭsmg۩cQl({( sL(΁2rk΁2-rEsˁ´:0<䈰a9Us:`l=1NQ!oR<&W\DmqѢx?OPD::y+wQdjlYY(+ u?7f* ўFm*԰:^2&E (6@!NֆSO"*ZWvmvl3:2SZOq; Y~#Nw?9qulR]+qP61RE Zl|cH{eczP;/3.RZQ0:v%ʃ lb ^mȮu*gmDz(Έ:$nx>yz?V#*$yTL{$#ӇGckkIIFP#5sL7R{Lg*SlOlZNxVz;[ջͶm9KRO<-dR v #5ʓP+<^Jmv;z5z콠ڨ>G&aЃY!glܛ.]3ݺ:'ٱ3Vek1* v&Xߺ >ipv :Jd*5~IKcD_2~%׽ ~B+M:sv0q ;$1izG `^nV]~ hWQNR]]URF-aY unT/;A_:gʹjtʅt8y L}۟Q.oGHu6onVSO] >5q2_ *mUMWN8GچRb|tzDz5azZdU6wS:S1b:{w RN~{,0;O՘g9gZ3g]qw?+_~ayar3Q*i31qKʠwIш_'h)E5Ѯ,y49&&v3KLKخyñQĨ050̘o h [C +}]-^9o oug2jΑuek"*7Mbyz[J\lf|ZFa{2ol*%xy2<%]^:GK;-Mvw*ao`Աm}Qy^bLx+u]M{{kͶ,1p?Ԏv~K{?,JS]ؠ9oU' 뢂R$R@7Z1,&}H^<*E~Εraa9v47 .cK/3\s9$7S7u]c}Źl/E̮.`p*W?t#S!uvH6s޲Zk ٙ`Ʀݍv1As4PáRpb[bo8loO@& ZVlvIga>[+&όM8&W5aӉ0wIkxˁ3vyY:\UBCxtNT Tsk< "J?ZzgSŸ$wH9ĖžJe E>\t}ڥfT.'i,(ZBl l~4HT\pPьDo1_se?S.FHL7cT(nf @sKcW٧DƉZܮmYCe52Tžzv}R)Ku+a ,։bOqx' J=woH<0M@Oj kˠf[#Yn ֮-PT`x0.NBN"2i4<Н{!Niq٢ֽm#{;x&=|8_9Kn~(zRu3\.U3ZEHYZPV+K݂'#H>Lˈ(# }Pm+xu3/G,Edd,vm:ic[@ԬePZ%QL8T p.~W߉ݽբlFB#;ܦ!&'rTݫ춶C; =++8ah+'fl99̐L66QqЖf˩dҋa/Pw 0ӹzu# Vz623cU|(a|EOfGk)1V0Z̔C4p5HP?^LnӧUarw+]V}$. Vzf2[~O+NUG/օ5x{f-W72>d.'!+;LaCȸFf3fq?Ūi+./~n^|&>#l_ܼDvVt0Lv|SCqU^njKz&ta2݌5.H-8}Jlu  ]O? V ݌ߒ?={/=V_4s;*aI-s, `4LF"P-n#a!8@=i^{X⹤ wP, j:Y}nAAk{D*fYM:sG5 XjW#0J#tT Wט42=Zlt0=Yʇzs*Tء$ {1&e[QɊI%Y1gv_=O" 0BId *;7ɻJ>ocu@t )@Sk ȁ瘅 D2%# :YSVAa Jad =L9;`рg ` ;FXJ` x/Ki:݂=ּJlȉN*6d=a@GU Xe'6/ldO7_I_Hv0#%IeM^;1t<2QoDv3L+V Q.pWC<%wU*6>]Wt)$L33I'*Y,&M@7ǪQI;( K)- tdCjޒɍX{v0 I>aI`nZi:A4RBZ_4#gh>O@>aW7RӃlr=]f zzWܣ^fʶz.o+gvCi4\XQg0궗UaEtg1M;JrMe, 5x)|! 3ԉ~US%{-\=XdB,9<#@ N1<6ͅ C)"$Sl҅1*G ϖNBBA4` l!>Lp*Qb| gXյ%6GZJQAEQ&] bbyEV+< U\Qͼg &2z T8*PJ=D^3ę=]zU ' =r&:H%%$8[儞WI|صV1CM+t' .tPX<ނ#/@ulO+ Po]4ƩX5qT 2 1R0πujF-31訔Cfb lh8.B`'/y/)zYéA1 Pc A-]-Y&fXq̴JW (3U(j v옧P$'>A,"r{*>=UX<S-H/XO|*]:Yb 'cJ J5~`"jEg # f0>1*V@mBCy" PTH`iJGhXeC%GMXZP >Ad+g)k LK*.k__2 K B}3:>1a Yp:Tdn&aHǩx|` i0N_G2TF֮ AX_eb}ōqP,!EmԛCGԯ4\FFlf+quoiN6y!,%XBɧԯV]o7˳+3Έ.akvKQ@03IПXdKCC ưkG@.SiU{3A'p/5j pҼRټ,Tz J(B9z!~6F g?9 )#u*lh|THn"Kaq[u!2ΙS}!빾4^d! S{c>[8|*v׽uuol^eY4Lc:@ɅЊZdZ1,S HT}f+Uvv']ĺDxR}UgDN $;2P}xma,0 r6¶z_kfA??i%Ck`Kst-2.0.8/src/images/svg_icons/edit_string.svg0000644000175000017500000003730112277111530020443 0ustar synthsynth image/svg+xml abc Kst-2.0.8/src/images/svg_icons/newplot.svg0000644000175000017500000003215412277111530017621 0ustar synthsynth image/svg+xml Data Manager cbn X Y Kst-2.0.8/src/images/svg_icons/tied-zoom.svg0000644000175000017500000026761112277111530020050 0ustar synthsynth image/svg+xml Oxygen team Kst-2.0.8/src/images/svg_icons/zoomzy.svg0000644000175000017500000004372012277111530017501 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/data-manager.svgz0000644000175000017500000030201512277111530020640 0ustar synthsynthLdata-manager.svgײX%WpT'@ޝZ8 583"#2r]eu [=19fR A d}2U_+X֨Ov賿?ܜEk{7KuAG_o|=o-M?:0Mͺ_+?'?W,n_{sg5;k#iF!/ٯz0 uloG{_kD.|( Ʊ="6B2R "g-܋mǟBO#HYJ~: /A8FZo݊%új&ryyuқܾ%eANŠܣ_ڜaRbZqrhm }؈y՗8.~=cmo)YP<[325.5 ‘'Sų\:AuzE‰(j3. .Ӡtltr @@mX3\fbush'$?PP&ȋIDCA!}NF:V_ #2[89BgKOi$,&@G{z5Ni\[P~$?DSR&Ycū>-N%y$r A}' * 5#GBi3C4V𔚓6hԷ\]DM8X.!H^{|MF [N˄7d*C=er>t uP>$aXbdǣZ>kk)w)۾ce~Y4}<& {^U14$ ~Rbkwri#f4. S~a#ќS ^"2QLl8+ g1F#:r̀yԵgߝTdDa, )͖4486M8:GaQj1o/}~"xG;G-gs@\ B"swU1 xV^ Egp‹vdKk-i{~bxi.eG%[/a7t G-pn72` qX]D潾f<^9)QBU۸O6$yX*$ȒKa!8- ) :Jޓ84 s3>EGOsv_s >|x"nt$YdžwzueRYgT v3N+ 7)Ʋ Lz K{\bG gB:BN]%묛-K_@\ߜK!i\D"ar'YA6d.tzw!qߵoar-T~cQx3^M"&% 9߁5jP3ڕ.ܦϴ}Qԙ5;Jnߠ饼7L^,@F1eG&udz+@ϡ$sCD -/V;Cow(,ѵ(vwINv7ߩ?Vɳh=G^r7C;kP\/ޥ5˟Km1B;Z%}-1rޔ-6s9o{/qK r%53hߑlﴷt~_ˇof G~m1W|s;o4[5xv4*G) @y^OlRGc"&|vرHc*(i:*YjuJE0Sg~Nד 7Uw*{>rgW%MY@DHM1AU`WMJK_hQ^9 /&}9# 0By>O[u\0]^Dfx̺E P9 *ThT뺻UBDC2O`0;@&+ѴW4lhfzգp8̘x+!U֚{%iZ޶LO&WwM7S۠c,1Qkh1KAChUFqշ#+̀_ו7d;fNLMW@7@1^e4zioz#e6We.[7o+{n-K-bg.~> [8/6'e~$ iTiގWR`%z0P3u=j^*-A[iG-Fme9~Ŗn~:IXFtqeap~%^RP\~3 ao &쌦"oA 3pM`ga=%+TdvWg@Lžl ɶ>H/+xƀ* K$s1 >VbbN6A0={1!{VעB2ě}:{3)=(ƅV<׵#2.a}mcތKŇw~u!*vRû:O/u^|c~'eHHxmsLZ }i<Ӊx4C&mbo|zkQ6ao-{ xJ/O:1Nޔ%av-Z(TnxܐxKXQZItw60Eeo6^$LqXO{r.PQh}Pc%1u^KwWo3˖2,[PxAlG7րqd? աT^ mImѓ%xz^`3R?->a>kP<И"(j¡mt4Gx}&i{Xʕph;?K[0"4? `HhՃ@*ݸr'"GF/KG\+/^S`7(aUCvkn { gGOwa) >"N2Y2z vYYvw{o.}P'#!%߲(bט^3m?+YF_bE "*@kMM/NxӼƫ%} `$9 oĕGd̠(D2 Rn~\ZRE!e}=dj+Džcf-{Bdv>rDi ![,NmJN|b/}'++07Vk<[ɪx8fŋKCfz7 oW>(Ae#\Ȑ:s'`]/$ )G R܌KMU2*r(/:v%hKO^ M{t:H=?V;%L}>Yo#=R7.qGd*Y06Al)w!,z{ȳdG'yT4D~d7f$ӭGsft_VE/J 5dMU7I+1Mq}՘ϐ Ymcn({BqaEx1)qGƗR-dQ&VYgUt>eZAR#ܐY|_^ܞ=Em `h2\'sHgߙoH))1|A /  ,`wΖ=DuMܧoT=EOkxȌ `(Du+{Gݧ3z=9K 5y ֒<1K~8x>/8wϜm*8q{X ̙T)1VZ'v^ٲ(Eby9fG"Hj~P$sP[18wk##~Ǟ!j!SsiJ["1.CV:e?q%V__ç }}8y04?lZ:BdON7S 1N|:oF҂R+=e=;'<^/ I}|!Y*)[+.?O1s܇*:-B/ڻWMdp=orE7 E~?h[k1q0r,vzi :_~(J*UES۳=ǘ624 4èV:=U".PnnsW C#ef./Ne_ƚ)޾b&\*ի?¾A@KM K^J?bgAcX}]"*~0EHGKrH]vFc̾ÊsB^aV.Zn252tX]npHo@|hBק1qChrgFbHK1 ;C\v٘s/2Tلo͝_-\?<Ĩ|;/ϩ"1MwI&{-.x2.7)dؕ@c1ۜɘlB B]paȴSKM }#!Ke|CC0 x ʅ!Tk1$\eDHQ7O}g"5NTu|$⏓|w~ce8!ܔ]ل,<_#i>psgjRndFQ~م u?Toҝ}v0N)e59őݥ37;BaPa<}"֑8qw ճGqR.=X>FfMz˰z]xɗQۘ%uzُ[JAnR qP*һF rKB;|7xpQ%!Aϴ Ġ4_>%C /8G@O, @Wz5žre蘀_ځGm3M"Km`oun`VGu?W[ӡ&|[ʩo#:Mfx αyaw]ג\+[S˞XY˺7e/pѪ|˂4KaƔLS .&pq[{״B}/tq<\_%E=7գcnU̷7yڞ!|(6|n-m[i4x ɘ^(K;nM-MUߞ9+YGj@OD>5-z~;juZ"峩.6#Tׇ>:gVr4^uՙ. 6>HL_e,=ъi |>mGe-`r뛟k M29$!N܄l0^A &w,}fϳLlM ~Lpi5FE\D=af<&jUAIVث-au.7ϯ7cCr1~ؤ*>!uS| t1\uԔf=vhTv#/{yBϑgREuIÐUŹ8}b c8V[ O_GP_J4"(왟@B/w|N8B|ۖ+6 &ΙE1(>Du }jbP2$3e_Se2^QCDů"9)H׼wg ꟋԞ[_N0'GQ9s b9qgnd݄~IlJqDYx4 /;8_!wu!W l8j"vQ nU.iqKc6?A rF[,e`߷n-D9b55s 3*4D"i(ݛiRt[kKh?m*qI4ׁsW*ћѺ=֧ W7%.)j%{3y>FX^ݵP1YikH9aǩXRYFI*Z<(^Ϝ$&h\jW'NUX#4!^I6a%[R/φ2c)KV6ߒGofX[d'ަ9]2O` P{,/TbQqʇr/#9Nig@ a?Ӷ}ВqySBڮp?7pxő鲠WFmT:}WX#RSؾeIkbb'6.qyWS{b\![*wrP"\"B.ib-G8[%Wc=+eP|.>qŇ.{ *qc&ZmUK @{vmO1$\$H]#ֺY49}IfE"h2Fmpk;XkE⼋|*7+yX3FW&N򵬭CY\,h'"2xU _99 AaE4/C]z,jY#sr/SͲ"Ooٿ#[ըlۍzS/ oœ+Cd}h|RFOS_ĨВ}v8l`ޅSԇp7ɀŗ+OXW<adLv w" 4(H1%#2ռ)k4r(‘:[Qln1fd1YeV#zdz C;=6AWg*-Pr&2c˯\?a,hnWK]dq y{?D0y!K1(]Xd} y~CK^$pt2>$`Oe,\yҖ 3}|;Ȏ8 h(0q:E(sE#'붫%¬!m k w @ɩFH-I^o3m\Rc5"*_JWbP# &Kbr's- <ߘb&j"'\-Vbn Ky+2{M3x_AUnAf46!F呹v /9-;*xH0vT{ WZ-ؾ&yoUX' xlj:Х,Nց%$sپq$cNfGaMˍ mYsis <<=}~Mc[on|L&"Ź_˶gs%2W[d}ʕqRſb\ ֒@b}%ecmRL1;u1fAuSL+5 3Xt0`\.^wF1dZ|W54)G[\$8ASAy#M6~F I9ך(`D[,%i"¢EIBY8wgݭgi*WrwS!NZF>7Y(狨Dyxp$PM gHO~;5,3?D9mي_J"Y2 OJ{]%[5~n<!T1Y.\~0 | %CҹUbd@s0˽/GQ>qDgߠUx̎5Gjq#^B/U4V=@q`dr9x *~J#a 2Cdakc\} _JL,7+PEG# `Q9>,dtr~9ˏJυ-v]ouLaҡBݎd&9ިq+կȽscP]g:An㹈7}> G$T:?O H~ Z;5:T`..Zb" lE>z$3":o1m8R+WV=i,c&bP^֣"uvnCL<$d*؃m_}; K Pm.O'ы?x#>x8i7OR+K`XT6믽Mؿ%Q"+xWi"d G*Thi\܀hzpo4`s`CˮHR@R[щUj_?$mNS}s` q*03}UxCN'̝&F%a^x E }Q?~P-S9y K[p֯UAֿލ-A_RJ?aW\pNpFVqsZzXo^љհ7X xi7L?mQߥZ}7b٦o H }eڥ"f|bUOܸ#LYDѯ#ϫOr9ц0oKU, #=&>/jN GYx]Odr>ۥ-D?1jy15\z`g563Lnmp:s}׉K|Y(kwi1}x5ZI^ ӎy,E eUd7#EKV=~%qUc <^8+e 1<ΰMVٟGG2?.}t=-΍WarF$ ho9҆Z3WĖ^nYLJ#S}c8JpBR!?T AtxlN;~[ڴ8@H95Ԟo8f-CQM9?ɓܯJTE4^PTt( vPK 38> i!Ig-+f-dWQ~#"L1ơ$K@(cYCvKu*612Xxp7Ʒ7Q}}z!Ut'| :> w0KM&G H0g/@ 5pD0e^6AycPǦ(wF4êٰ=H}A7Dj?ۺNMd=C"y k`+9ĸ~^m 2AX(WS_ن[jJo~,jxx[qmD}EJg"ՔbEg(\2vPNÏޭ;NyU+s⒜{^!iIa1e< x[H<aAl~/'Y.{Zf⪺]C `aԴ=ИZ /m9T;\οb;ÝOloOAG"haMXJ8 29pۄKzx74L?512/͈ϛ *1ŷi d ٨: TJ29DŽlLr ~&[Di#"#-L{N+ Ha??^S%N|~|iN@rӌ7g2r}y![mP;6 MY4sd`~v!%ᆕ N}mLy(Fu`(wF} HT4p+Ӳu&K{KCMB2D'G6S ֪0@&ډ?5\h"vyTX LnlL ШCsB.~T?% =3lJ%)6yt: H%> }ovˑt7mʆ7?9 !8֡:I$"]pF&CUI1l &kE(*Wby^wM)9o2uXXi>T[3dž"9N BeF* ~<e&#G26? hU'''$b1(oS3\$, LwH-[u|<7J'PdKt,m(,HFߎؘ-\;^J0ߋQ;N?4Kr~c.RWְQgJT%]J'.-1{D&%G!βeW5;*&VO\`?'fEՐ%y~h7g ʝn\ֆ'´Mc ֠\9u*+L{]{"ܪhrI*w^˪X|GFI/~9CA؆yt$:D)Г*(Wha,A Oؿ u5pdV~AaF-Ŗۓ`-.vK|ϤYlʉcp$Hw:/ >D=c6h3=!g%aryoS Z=rlT5DŽVN&7o<ŀ"ZP z2WӭCaG6&s8]i+kv|3.j"xNz^kF`,)Ҁ[Ԣ7-c#R#wƐ` 1T:]CFO=C&+Qjm" x@][Fgu].;e9Cv1YtW͜v Ꮫ @W$ <^,aT,B]i.L3UDoԫaeld~ȿa\Sc^Ľ1εkMop\7%#`fhAn-,tLm-yi9 k. 1;{s|meFK%8SHS84kB bwfE ΂y4}:h/)}!On_hAj|3)X 6sұ7=BiXjuQrgaՊKh z*HdxɚZG2S ytx%;]h 1jYJYҩ,KeS-B&q9t'pŸJvq²:ǥSϛ]3&bonP,<= y%?Qm6D(1.KI[ \H!8<D~WEA0iFgЄQkMLiI֨`,(%L qmZ".ywGu/iHZ&?}d{y+S_":dϫ܉Wݙtψv˰Lg+?SV{i:h@-Q«HzUdGgG(3 Zh$1MSwh%tNhr)Bw= V,lʑ29PpϙDC}بbMMn,6gEUњA8llKh.pOPIWfo$t2]\5bۤ |1r:?7S I)B{ xfxviӤ@[!|ò sM$%m=哭$+XCl?f@})OpYDHԒo;P`Fmur߅v~u5\85PDt3K7ǽԷHyK(zB*'ɢz^ZՆ'<.ђ>{ȈrvTRؘ9#3:OJ(e>:Ϻ ,j۱ip}4l/DsS ״g9R۪kS{|fGRW'N<>sT+TW{bU+ ~oXF t{mja/u&ʷsQLr.r{AO!. i^DK%?rj\ҜDmNss޴'pH93_VK7u~V҉SF|{>}ϟ L׾( UkUS3ȁ-ʌwE7G6$|Q V#P ܭPk#4>꛻p[I0ۿZx BVA'Wv~<%lg~Γ-YB*KCG̋%oI!uY8Y#1&CS1i"bwҳ,p+ ?MK%G?\oFr\kzϐnׂND\ v)P-lumX*|n^~ZJ/|l#ո6yݢjh`W A›;EKSު,n?cltq:9%ʎV(Iܪ.`>PE|f. jAHK <šPŠ jv[2>}p(&9yXSSr) Mݝ~1i}<2q| My*Ӝ ;stVIԘ%KoL;)>h~(P+U2WoE &9V\˅͝? Jco-6E -e!ċB)[nTn *F rƺ-nzw 9iK|]'o/FVܥ$KtKMIEy`Q`΄nפpX }h'svPokonPU]xM:<}KHM bv|'<;5VG@SF ymz;KЫ3[k:;'n85~}MX OHc j;vVԢ{>Qei\v.v6C*Fa?S f6\ڙJu{ŦX[q!wwxE+:8o92v}H)rvl<&Z@+PzaHLQY^B 6lJ Y_,!%2dbPHe>ptV)P3Re󮛊ȌޙUL% y-!m蠣:My` ŵ/loݎonL Mِn$'y7G22s&D]KuR-'}݃qZX"<+>0/4yV:&igIe]coOk[gv(sƌ~|9N_/TVE9ǤRD6:1vl['MU\@iw>9@G sG٨ r]$=VZǑR|X..ob5wU )!͖ܺ?1 `d:^h⑗.z!LҜqŝ~) Z=>tK^&ec]{P1+3hb~($=rx ͱ :r&kfeSN F_GxZ$Q "I_JrVO.jQ|Cݢ&`7.(xb,z;(Of.vJ;yT("xjh8V I|:ah?*T;9'ۨN?Nň tq풹¯(}eÆ!:s(;K ht${iz%wD(~ڷJiUywGNjc ,LVFƨ.AL"&;%]Dž#މ7K?s :U!i#q^\y xK/RP6" %e(ɻt0$e|%eįQ7_+\dv[fzdI&{7Tr:iT+jf%}g~{"LZCiQ]qiMMr˵b8*݅QԜ$@rj9T2*j_أr_Bt>4n3_T 3`ǝ/nhR(6 x̀}ʩZӆWE>ӷVwfzb5<@.vwg2iϖKf;iAy#Oxi9=mͪ Z ̹@1&ϔĎb'Z-Lʢ^o\*` p( hhy4B(G_Pd?s>띢tqX^? Z+iw.(ǺsZ QYy\9K({d4Un$Y OMnW+o+͍2Z$^=B$IGYɍLB)O\mRI-~o Z?QcNNn&SKSc4|KkA╏ҲDˑR+M%va57sCM@Kis6KΓ`vDNo UAv%xV77wǑT˩ͱlAR$f%@,SnLvUh*wnD}%"QժdgAo|ӖS:*0 Ee$aC2+/Z&e,)lhD~<K\^"@ȓЂ-kĭ%K<񣫆iJ뢔ʡ Ѡl.v% ٳ/mE MM.w"'eg;AR2GJsoxS+1p-g57%yܘx`s ۤ7Pti[ i@{ 3 I(_Y&b$"`4ā=N8W0s6Mi~KiZ˅Xoa$nW~.Otx(ÆKA IΚ_nʷz,'6H!,%^u;u I|WGk<̝ͣ3΄[0&l Yǻ,u֛XlS|RkTMǚ#d&y u^x&yrǭF@pbӇkƛ_yeM|6ĉS twUӐnGłOF*!FpEUޝ\62oN[(CsжC`.mã\rU:mT-5%pA#3\{d=?[M|uTroAOS y*XL6 .R`iAy18$NL>v/k #8H6ah{r>YF' @.w}E qba;|<.:ɔZ>xe rg_ <0. KJ.Z̝z(O'ZZW ^Ռg!,\ QuWĎ Vl?ZEjoyˍޱxH&ޒ,> { } ][|xʊ|\d2]p 6 a@FYYxZ^͔Šmx3]nqo7O Z7}.N{](CDbfxs> u$n@k_4T&zY7%#VͰϝ*[ҝF94t72_ C8ס;M4$R}fK>q$>!;\;d rl gi5aa*"ǹK%A&V!@S WD;"PM=ڊ2m%: ÝۋVс|O?ς>4(@ndI |i: \'I0({T_O8{lM CwR{C KRV D68B|nߟ҅+zI;9ox3Dq3ˠ AXڛ_Jx 2)Nۡߣp:r3&~{JAjZ Gh/o4m L<_I c^d Y+X.7EZ ^{soTꞿ(_䪱%ٯ.5$)emdNk:Ľ< ZZj^THZs)bF|TXz n5lqx@Ӻ;YX!az'*Sg;iV8 c,|5A{C19iI#h0T^y2::<5("r n(WN 1&oe** ̉7'~  iQI27C*@y[*1Lg^q5j ?ϛf˶ޔmy1M7%,i'kxR2wD-ku2 D= /S > ˤ2ͳ{gFoKcAm_̷ q3Iv" 9:o{1? ;Su[}z͙PW?CՁpU=ԅϵia>x1ꖷPlQ 3&KT*\&VJ?ﳺM[q('36H-oЪ \ߤd?.|>gTSߺIks$T1;##'`lI" |dU|XT|j)L=ОBR%ku3]A<`8,Cr ]7ܴ'QSf;R)ZExdJW>X)~ :5]^qT%5Po So23#`ۏ\;&?NȒbi|Cl>8l*PD'-\V̾܍qt۷kՃ=0ÒlLת*%Tf)КS JiVJ^{|U^ 5JPlxF_[XEUoapz"|*ڍoYcns\ `!zw#H&ȸ6o^{"_20Z߂sAʎ3LWf *򵋊t*a | ːrݡ54&-)ۢ..=Z/o)t>kwi 3}:ڂЦKDMa%WSF}[mt2;\ņ^_E" Лy'1) `ԨsY#-a~n %M3GCRۡ t'[GvPZ:L\O:>ՕُjFURF`>$N@%*u 6_D7آ~pu {09Uh+/Ϸ;[,!sD50 ʵCRo'1BVh’+ O}3I=sV I- n%=DػgpsZ؝PP=% l8*;MүI f~k:h3G>|Ey@{Q${.?7}8?گ{i.x eá)p=rLgS"{xλXBUf/ebST>@J!n@jpֲ?ԃ~o_j >a +(}{74 K#ቕ9i"1Ĕ9/jmFlԲ P-f -KA&1]MAU":jEr'|2_ΐ6}qcr;VvPXǗ7 r.ϑȆfo`>[E%$RYVo(Gs1_PƆ^\(>MO^BvWgH9s&TJ+,8϶7Rc O& Hc2m'-/cOr[a[s JIy T8. s|@79'o!RlK[qΞf-ly̸`m|=\ތmҔ<5+ys;$|Bdwu0<MjcrIc=hKt!SN1xe(^ k!`dB)*%L UD>翪t'Bd}WDm}(ip ~qSж6Sؠ͉͚BgwXvW wM'97߲U'ޤ񐪑G2*Eبdma`" +e\v˶\$K,׋ogW1K Yd?U]n QΆkl= `!Awh khg]a}c@SJoZ̊R>S\+Jd[5bZHxw~|>r-pJISHxݺ?e{-^ؘ' vr-:+.T6tӀw87&Y)Թ; H!{Qmϳk@*@]dLC$i H>%iG8=v_uy U$ֈ<;E.?r:OXԤIW͂706NRqel'Nڷ'"jxI;ģt=9A| TWjz;Y=/+#w-TQgg}V Zq=0sNKKfL._:nĶ!-V(QB'SޙV&S&)oե]fж F*Fc wdsyzrB(h!kf{r\Qpr:uJO|pDw,+[hpRjO K;¾$K8 ӹ)ۀLTuJ9#0X{Iub`sgvZ Oݜw5dCMҐmB3l1ɜ2pS#9o8`NnVIV;si2fx/t}>om:Y#% nNoFE{k TV LK=I3lnOAy5 cOn!Ti{%)RuʗzkJ)M]P֛ʮWG)XNn`-!i- GzS7y_LjCwEI'˯OXG[C[62Bhz?/ȑ$g-zdҵMȅt6S%2V"(@5-=yS^$-ц{帐sr4akSfFx%:7a|!ի 0~c_r\HysTOd{sկE0%c&yz_ٰ{hVl:ٱu/mљ쵬|NyQDt{r|m=ʹ8GVml`&_9=oG{Փ*%\y" KO(kV{ .-< N_UNJ^[%LGsxmޭI``Gt|K e 'CZ u}AOU^ڥ4J;(RH,/2X4]7 gkRh=KxDdB]#75P`jA3/|w$! ˵߳|cӉqޫ/?fLt!M$ޣިJh +y"~K.gږ?,bMq2:/ϔ5ہX,X νm\ʸ~,JTICPCxtaQDsTv(GFf,+3QE%{PS`"Q 3e @w a_XkŽ+,ncRЍ^\Oqjxw<˪io<[F:QDák/t oL =R~[QH³Hu vX0S)h;Cnj,g`0^ WtO1DkCZfv un6G M/I ^rlH)0ɷ`ae~Hi6Y7o<~ܻ_L<Ȣԏ%$f:0F Chd RGXJK/3WBƋD|Ty,!z'_Y}C՝* {% ׌2H/YTWI?Ctif.pBڸ<<:ADT_#Opj'^)_?)N3 w_.on`}ľt/W0~ΌE(o ס޸1nO!N+*#L'ruwf(?$DZ߭Ζ;|\/wTd!u ;)Kt um vyTG84L67wzA]fд_C ޱO$no0@]%T)|2Ѷ?qҽ. KD&m@B};2[ !d?_ $~'X@LTN=Z/G},I.ɇmi;D7)KagO(&+!gpĢxL^>2Du#4~_CCkv ߎă4ǰr 8+Lh),[wx裘hu*hARU:_G~y^So=A9'^?EC1^4Kf_:O 1WQ}tt{+!$⫝̸VN} Le[X{5eњ45#EQ`yƚHCT#R5T $jf&S$fW׶uq-2Fqcn믯); m2z+p8?ƤVg'ϠXW"g1אOhay87NN_3H0D8VyC%XcJGG,ͮޣd`t F&#L}j')qoSr-A] qkh;' UVɿ? #g9L3 69KcoߥOڣAJ ѭ !ecI8Z'U]w vjA*4z=Q#tI94g~OXid[ R|#+Z쁄]!mmLO}Z?1\|_= bD΁Y_I/&6úT4^Ano#=zbЎ1/۫FK`Q -_:w5/nj//J:AX * l| 2f 0(3BTcS,`t4}ɳ c+Pw,J|@!D1i?Td6Ɯ5~gϊWF/]ELxIwIȐ&}baoqʸZ %FyWc)kJ}J+uS#5QL'*(i^W]DtCľG_ԏZD඾o俑Tw+0N{Z.]O>y{UTճnFm9Lic #"`(YW Ю<Dtu91 #Q hį@JXm T(F]zSz_{*op}5b9@B;y.i/qU0aL3/"'TC._2tPظ`7\e|L+E[WqDZpg[a\ sIvq_\WcǠݺA- DE_HgAْ@fK4\6/%hN/I{[\ĵA-wvp☿.Kkx;L12敾nޑX=~_2|Y@&>hӎZ'mEn*.TAKJG*~V7uŠgl/S[&f8䳳S!Q&KtU,s$:,=uxS%[M)6n t ,^Мק\Zz,w-'I]Zm}]+5rC *Ba&ok]RĞq| q%!B(:wkXQfx3ìG~ ѦKoKI]7K?V^u$z5I=NW~rTLZW=G|ބ ;R1]7vIEx;;u zYM;DTGF\sx'6){.)F^Fg NBztL`3I|{_""AWh=+1A3tn8}2/JVy2o@e9K?ї l֍f9 uPkc dsvMSGNȥ?T'4c $ƨR+;N%C֤'ݬߠϿ#qXE'!\'63DnE ?^ґlϛp%{H/N>¨T,w2{Vg "۸_pPI8~Rτ80;hLq8y G3X{f  ثcߘ/SWTmd05}eŎ8#G4[/=] U} Zp`_Ŕ|5}ஏf={J!n//Y'c털`nZ.X~^B>hf9 ^/9kLK+t/ZmR:'AdR|Z{s漛7$E _]c}vzcCZP&3Oꑋ b0YGߖְ4|j6$^I⮭,Yd]IyKam+~GtpR**e v4a#L&Ǡ*mxD*$6't?<*W,t+&ҼGZ~G6a[@mH)yg+ζ&i@M8bt}*l^ş꺅 rN - H, ЭDӿ6opg43|jׂ!̝ʛo);-EKrM67%@^~iaS8"1.΍՚%EX Zr?܆hv>h&نljd0v=e:3]W5hs)ލg>&Z[q̠Q[s`6s~heu׋}N4nvͷ;gu,h:96mT'kxSגItߏ5k؏aE!_9`Kk֗=jH0K$93/Q8̲[S\l.2hah!*_N3ҫ*"O»d ],׉aJ\ VUzIkg>3+.'5Ľ_ ɦ+$ 1эD3{uEH?|_ͬ-? HL{JZS²]){Iо9PBcԞM*0O¢[+7N]4w*ſ|Y)!R:a t{1܇$dK[H^MȜ}BdvA0h[VoAvzAO2ı][וklND I4|C,ƓZg/䗝0爜MT4ªQ,\V"%5BtI;ΰYȣeZ|P&־H-ѮD*)" z: *RLA5%9(sp__#3$ ,B E2~*bd iۡͮ+sRoM@𑒐VƥSʼn"cDM/4HQơW uH?G7_0􉣷zK *>S +Y6 DT 6Ʒ!11چ@@;c[w!4T  Dhy X|l b2Y/VL VxX!C0Wb#I3`FLbaCۂC2-G 3_8m{8"IQٻ$Y96 3Te)\*2oxPT/?YT IrN9ĉV%S(M ]/CQI׹]{~Z|7zz1?8Լ5\oė/ly9mߛO|uϫ^4K5!ؙI7YA\,̓w$}( Z2lHotJLI}RƟ(Cp/\]mTOʺ(کNlI + %V򓙻!B:BpDOnKTH0CT#yynj0}uq\^r=9vtg>7hDK iӻ%gws=԰C语1PHZh6sV=yRBG/6\Ђ3~^d@s)FpotnouTi+ A@ 062\|R@ (}$zy!d 4۸+ܹXB>r;Kׁ"Q3)ߑڣ7CtYNDcfU ?n1c6A*jv|w]5# b̾0]>H=DW )hHz w3FgF\Mб!s%"2' g=zJ Z'V0j"@I\x#i):a9 g@WhhRnS+!U]b[h^߭:O$8*eg m_{J!CZJ3w'ϒ2'.{5$$% cF>Ku]ocH F7Vne95BP~MctJ"|K.א]6ڇ8q}sjdz={8c`yȼG2NhM2`ɾFi9}4s;`D;m_q1U[ڠk]6CGgp-*k ,sd瀇kn8w r87x\Gfuo4'CK@ B{U^W--gs)y_Y" itjz`X4񞘩U،a3ui'['霓{,[vcӟ|lflx;_N'qN:zIL#`d_H}V8B4_rq[>+ im. )0CZ^?o*Ekokb-#,) 3.xaod%*}o{mleM@E"oZN1 bȒIiIfx8x__l98 ƥ?/sz߾σ?_WNQPqtdC^?6h؊ؤvYS/v6?\JX MrCblN$?H!Av]KNƮHX\ݫV,SL̴{d .>edX3)im!qIU\pO./,$[rm0ct_rRcw_P$RmSǷ-9WUWuĹMYG2EXG!BI,<=$ j%ȇ,_ x ﵻ7o}N-Aܲf}Ƙκl2ӲiI7F3 -JN$c;9t2DomJ貊&u=3.= kx|e!_ _L LSxrǣ>!;=o#vupa }<0ZrjƱe{Ó}J.&Ixy~COv.rT_Jzu=oϞɴUC[44阨ؕ3_ pczmmPÜc1G#']rFͰ%\hq]DDOJz~ͻAx-uο|}'E~uauqDTAi^˽-ümr&Ik )q{^dPt$92[3P=\L6lԷ"i 0ygTXV[XaF@ܫqϼس ]Tnׂ ԝ"Vޘ` ogRi]+N&YbjXDXg%Z\tGm]\Dh![Sfel`E8.jVI>{kS T?U@jmY!(֎r,%i_!kSܕşMh|oo!0 v ZJ03IxK*װf)푪Ų6ڿNZKzj s[ Ag qIUM{.a~+:Ꙧ;#;:4Ế.! o4 )>⵸Moʊ)/߲~nޓJS Aywzb+6!~%Y8&M.#OB,' 3ܪJTO1X 7?#@bgBԐ#dw6! K)%@MVWi#ea{ކ!(Y}لHcv+xE|_>ݾG@Dd>G?;Ʀ Օ)<F=HsH+K?2çK;=zCOFkp֐\/7?t! tq<,,: cIHyrt G)Lß}"Wz`iflOS9ueʉ?,*MHm?)[~x?YK!|)%2MZ;iBWokWcǍnNNA(hz܈\G4-x}S]&Jy.jNK2R+}mJ5OniW#>%Km9Q1ef`'.COCyԲF iニ 8~ߡF.DCz K1Z{Zjm{ӰzDYz@[;79I( .ސvfTE!^/d@[-u.4$"5g`1}-kqT JaK$-ͳ ݣl*;"@*k#`?~N=p%M#Yoz 8huG]]'QWaUEEYym9LKU\=;^bIg`*կ[c[:z.W^dSXpz]/eŬ~ix=BيwmG8cnU]`ݽ B=N\l_K2dG8 _]ݳ @._Uty&!\ $4E ۀSY7qN &ԋeB[>" إ\E̫ @??|2Ru6^>qItԈe3Fϭ=?q bo#pF:z=hIPɹzxT!+H*GܸGZ& {p'|c/fKFpNJxu)G2vЩB܂\mnPEs[k ?oh)` WJDT28F{dB&eNY7ݏɘ?c;ci I 1ܪ L}D%wk܀B9Ŀۿs81dֿ.Ol|\Z4Օ}U')H֦ <7~uWE }MIyzB?#&6RjČ)#3/2}Z7NTT(h)66 g:}dlo{zxot_B;Тߍ؍~4$CrCԩT a /oXt|Vvن`G]ĸT~lI44A`;vRRSwC)NUI>@2M3&sO4vTj0m%P`m./SPjbYSG--g'dk&ꑵ;(!c8SR^b2e#CtW28&= ]tD{crbU}0OAL/u"G!E! hS9[n8hE)?g]w,MDtXN38~[9AFPR(bYԜsß;Iѫyisʬ.8q/-똂g@x>~^D'mkg`C,,115GGIF'}b6v'i>ͯkky"),h{|.]pވh^Z}Ӊޮ]2A~&bE1B9#wQ',W8̝)"E 2ZᐬfR0ژ8mBliÿO5{SIL=/r~UIp4 1xE+ qRy_!11ȱWf/#[Bq1nl:3$~!Meg-+d\$1 }E3U\15n=8SbuaN>'޻yA!<ӥ:Ox,rg3mC>-oƜ)Tӵeqsp511,D4hO|`BV?R,J< _f}QOB,Ak2Q:a 2k!U>" odhN2Dt .mIoc1w^8[ҙJۥkЍSVGA":bHß BwqwRJk-/_g d?L\}h L~7W]qLkc&9uzW1ה#M6`WJ4iS_9A׆Ԕ&OA3& ;"1U/S+t=\a{⤧&88ժae`%0VmU1Լnʍ@&8+sju؎'ncS!Kc. 9'zռl9-ɴ?/X=EQ.ʕOSXCV&F,1Y]/Yʸx7% s}@۰MnEx<~/јއWoWL_mqB_ԵwXhC rZ.~JϦjч~X?65yzV_ڋlp~ Dtneҙn5G:ɾb#ą^.#(A8}[|v!zNw+"D{g 3 Tґ<ُ=R T6됻*ʊ1\əu^7S>VE!sAyefD `M΄L Fw1p鿯t-䃠"N2c)9+aDsּ ?  !_@ZE DƘ! Y˘\1iEOyTU z[o ZG=NJwbs]57>POJY}F54 \T2DOɷ1pc&hKjqo:Nw[{,=de)Ex<= 1+i;}CZyh %PEX EǠsDswC%^sCs_e\tzf@LE| qRD=l'‘/"% mbl0J.!s򼽿}N=ҷ6Xθr_qH㼑VXwa;E_SۼQ/49 s4) \䪐pSnVAm޺biQ=u|_`n-i @ic*~XqH=߅ MElD\ѼPTԽ8](B_Vn')]|w3%h#09k}xga;#ME~A\Wu#]ax$emo m.H VC]Q$ VM%[=H~B?]%.ِvxW⸛>~A6,(dA_^c(kI `1k'7o8e릑~v J%jr,5y5dp?F+YNѯHj#񳀐BuOd6{y2vXLq05iX7&jab)\%ƷnGo?OSse>!ggśrAy0W\ ZVZz^ IDBlW cJLu:DX%$;\K9qػ|QOp"c$dM"_o@2!7΋o[d7ov"Kxf=J5,+ \nZs.u}BhûwM(:԰R-W,G#q( I2gm1}Mr̿ej)nP#x2m违Z 'lu@b@Q^jn5-p"[Dq 6r&u~cIb b5=@oB=jq\"ߗtIՏTDJqc+i knSP j$-w|`Rln߂D@q?` /h{՟D)h1$sR̹H#q/ xrE.h:"?C|b';Yd@E0_0%eE R"}QExJSiU*XO Gd2 ZWzȖXY},(MNkÜAD}c? 26A46w3ՙH3R\lMX,ДF|c>Q$ҰRRJOŽsw2WɴwRs 3,QmoTST_.7Pny ^ucUS{>Ll@>.} E,.P*wfa=DxXfX۾><~1v^7G+۟0`]2D\<mlf`OW7>TH!FLDJ^:JS\gsƿVʄVLǂƎ#xG}07zߧInc;>Sr4*b鹨 ۿ)0n\a88˼FZ7NR 7HhU~kjR˻F*u/}ϲ=^K@(H,FbL7a~Y2Ne#ET-EwuPA)tjzlz=d 7+6!Zx׈¾C*`ݩa=G\ޟx,ܟ'%hEg]4Yq?\+{&mΌޏ⦰&mLڀi dl^y}I8C|4 \E5OqzB3=X8^E 탴_n8i4B>i{L{șGbyo৴ԩl2i sL߮{<7r.T^x:O]{[ lJ'MWC/(w.d tLa,SBCWR9y*2ܭZ_ J9++{9)8$m?].ն2g-4'B3 ӿzueqϏ"M׼ݠ|N|;beY~cʗ_IAnx'`NB»ME&\CaCa1߄ a.oc}8f[Wu 󬗚hcWGzg;L d.U0~ݝ.hUJ,rQkuZr41G0ehĨ<$d>T:xYIWӭ)\5  cOLOAUt}mDdb10|.i'x1& *IuAlSjzO$9s~Uڰ%^\JG\W䧾N[㾰G꺣S6(r\7us/r91腧0vӔap Fz0>)'9B 5иc('N*> 8۶iG`}o |Vh42/Rĥ"4K>kRۍN>TX.z wR21Lm!9FĄN#er!g!QigaXbuЗR昃eTC7`>ެ-ץA7q>+I +N yF{S,PK|Zu ߯c)fkYѫv+0KmҬG++wQIo@r_Yj<ڒ~25=:BEb=TJ',ΠRؼX:-dH6/ uklr%g~W wwX;>8'Ԑ7W8Ƀ踬]U)K+Rߔ`y̿y!sHong)@;s!gCs2o=b LtȰE ?pGsqfL$|.8VALPxTW()>  h+bR,mf>쯡`)N9)3TkԙNfǕX lC)O]t+tUmKu(GFn vM $b(QV4lBYyrp6a?]2RѳrqLwkÈ2CvNl$o͂1,EQD/ݾA@;5 gs0ÄkԔGV1LmxAU(rmM@Rϊ"p%y+y-&` h7/"(8%% {@~bT?܁;BW*!E4KVC.1Ri7_Y#-Yp2H{PY 8 ! ta,쐕7e)6jMt}yQ_,I$O6kB8ŴFB(BAߣ9}%m],ŚBB+^'W Pj 1m6YvaΉvtIp( ;ǒKgzHp%R Bv̻d/*,d *B+7"23_U/3P-o7ovɼS~m*YD.V+>>x;MEj7h`vl,cFY9$]-730y6zs;ָlPoG!p@ԁbO2/;D ҆/hI =y97T sI%'Sl ߩ)>RNK|ѧ XЛahR#7$d|5;^bw)-x?I5:XqoC.ƀ4A^ü~"F1PP|<{*s{*Zܚo,V,< _$62Of>ખtV;)md.ݞE?⢿{8PzIiA.0 4$ʐJxl]Ln>ĵuR4)̌;ZYW{-6^y;n[ nI癅2T:LlLu.c"vq`V.Х\KgV $Ƥ_;''QPT\uIL4E8*&O]XIR[{Qܭtk-O1_"|yf"pL^u65B*`#2 <8ggAE}bUAi[燘T̡KN,m'tdiw b= XB(w\YԍX)Iѯǜk^%\w?? 5|^qA@;Uݠ4PXPX=$ wB6yGv 췮iH7, SOpо7]eR*V.)黎|/!/ m o ܌k2g,$5k۸0IsN}!A}eD:w|K$ z_-8M? 纎0^U_fr%]ImdFRMBy[$ 0=wA/ Fl%=T\ߪ +N[ /} oRR[OfjMw' 9ܠH̓0+Is9<[a&G%Q0:㙎/Z<6X=uXG}x:$|f ΔE"a?s^΁&vֱtLɎںEsf RUL=""]#*fM:M:/* $-wlk2K5:R%^*3σ#}Gd1# ^?#A߂G^ɛ Nhv=!0Y^փqˬns7"}?hXXzIyϓH{^uP~.`M/(gqD m(4Ydޱc)Oq!K\\6aZ5Ԣ&R&m`-&ȃ~ %jғyKKFڭquW(;!DS2FW)5;XPe?HgY mty@xTkR-qr5"MRmYm{끟#wdi G޴9GJH"{7}ɕ<::&_WlPh{/Lb*'T-D5X 'W֩A A3-)6OI BϬ i׸NUF-Nhx<Gq$\=/zJZ\O!YĘS@L1LvaA٦H{M\??ȭөc>D}>r .A+mj*Nsم*=n{V^}|N"`+L -M,HuLyWƴqB CYg#_8?w;N9YE|(.͵zz"2 :F!PV1lL9WU?u¹W~jI3P[V'LCB^pHT΄^{p)pvz=bFg#+%^ g9TR:zsaDJ_ow.q ?TG2d7NM ?F]מ|$&և3ۈZ<xČ$fNmbuz:ϴ"Y]5@E}I!)N(bz`WTuQ5Gi#٘2?I`wQwo8 V&G\:q 2eKÍ ݾ\Ƨ+8?jp9J6 &㊎Rd%.Gn8q#k'rsH f#e1꒧ .L(EG"_uϭY l|;jrmAF7_7T!0! /n N7"U5j5˭〷jܒ6$.uߜ"ΫK#"ۨ&~R^&Μz8"ϼu-jd=u$p-h#}{}2[kƃ{Vz$Jv|\Ó .XLd 0|6 1bg'28GM kj0 8i+d9\_:iQ1LY@_S3 =t{W# O>?'(} WD*LoX;v~ry#bB}K`2])CL.zhGWpppW\F2CY䗞RqRiNuQdHDXXGIg?bI` ?qsAI7ڧJ{֭0(x;ѰG%~K,v0`+ }*V '"m> }R]ҹM n urrL~+q{\?o_mϫ괸KK֋*r|>^y2u,fagn*+ \ҫ˗1DkԷ,Woi)E"YK Z4sxn d'oYW#L}EWi %@E΂nPTfs%ó\st0)7(p65Qԧ0ю9؇\@2RjW:|Rz$d Lr|U(cGBsŞtN}55PVDi&-(յ۟g]Ȟ?i`t,VW - S0Bi@A;@m̐ƉXFڿ:3}BDwDI>z勨i^ &-4~r\2!hJw* qL?;=hN]-zkB&QOp;<3_ R"Cep [ԻkXBCn{QPfȎ+P [Z8 LkU7/󳥧nsX3 8B?7ի$+)qT [Gמcˍ ]zU]:2L;DV1 'L%NU3 (/Ϋ6@FJn/M†(rVdмxnG8& 08թeGK㛿V{~]u$Ow):a[kT9%鑢՗Eڧ&J nI ~GIl~@Xm9gPY}. Lq=*;jQH,}S.hEo8DtD-ŏ1$^U% RγI gm%һ w+ ;]ֲueUBnno_M,p3,(NRWQ O[;v=߽^[.܁?kd}: 8K~()m &K8zx< <קmETPmnX- s2|E,_2PSzrQo'4IIT(?K?( ^AYnšo"7.m!(履$KĘa^ mvU[ix5ӒL"/ANXi~r^×H2|>_7pi tZ~&\&oN;㖭 ysսRi>"kG63'Gz i r7Eu =$b9G*\#Y8ᮛ[vMl:]SHkOwUH(-Bᠴ6VVѣ0jZ97f/ qhU ;UgE>h T>w" e&Gn8u/9?{Dͪe nS0Pq5ӐL@vؕ>imüz+҅yi1 S]{'RKkӿ,Y{tʅuv۫fRH-#FkA.&Π.ZL-7C$"|E=pj8 jߘ 2~C&9"jmz/2/Dץ?P7x+ĦIC""wMū }UeN"`:vR*g"@RLw廀lǔGe[u[Pގm3DO kΘ ;Q!Kx _u'0Ʈ:qlL<PV3_g׫)z5qepΫ/(ybi%?a^h&hC-1 S?cYcO+`fۅkk('X)F{T8*0JZ6f}qyfJSW2V(}_Gi @}Hvש'M^U԰Gr0߿=xr"J~(.G8՟X׍X}k߽ D܇ @w s.i 2bжo:+AσJaEń;FZi+cBY\P|,`_1pT$u2-f'ZJ'H]vc!L> . 璽a+mݯY 6$Y.kGI2,)m(isy*U؛4FwX5&m7,䀣_iX_Q d W9 ><-OIRAs3)Mlio'w$TSa|&s/}hGԤ86xNhH'hd$c6,o S,mWIw.׎IF5C#c!bjdwk 6|nw;43{8,3AikU~8(Cnl t=7S!̪x7 ԍYZ?~]$++AB.]jmT6C:Fq@_E9,>B)>XSr&񱟜 uPϘŎɚ6a]kU/?Շ(O8:/LZўYZDxv"o֌m;3lY%6Ծۅ@N Ha-CWOM-`3=?fcy,bBPi1~T.of1~?W,9X;חlše^z5Ő y7bp ^nYN?&un?曶x[%MsqNœF[LQ% nuNT~7_OX#ir0ͭ f:SaC ۼ扳 ߗբUs}u+d kF,Y Yѓu7#e)wo hJe=0JZU]LpzY3&sach4& 8V"$ՆGaϦZSKAƔn7z;RvVqiȍ;ND=wXL~J߃&II75'o}ϿYt4"֞/"6?h)UF/tٶdEq5;̲ u˿ayS"W g36N,⠰߿$S1mS}56#vu[WeQ$# ~v { 4}4 ] pc7$OPN*^ﰗO2h{d naȩ1)Ci?|))YySl0o]k4PDFDP)u̼[TrWzHSo-wӄ `nRmyL] avg(]񉦮DjSk9l_z'"R T2|*h?$`޷ɩf všoTn;Rx z(^E[|ߪ(6$x¨<YPf;m28Vl 8ǩؖg\^k2{!.1wYH⏝ m{ȦHg_Seqj#rI36~M{N_~)~.N'lY;} x`-i|>d2KFSE){O%e2\1|{n2妚@n9RhqT ]j*;8kTɎw{҈dGkr;8 ks=1aydK'yӉtq~\Ԏ#AEx$WM*)8(%BbuuzhGA:j֜oSV7jT;1e(:]`w)7Jjj.Rb͹yx0'~|4Й6 (—Gg:Q-tLY%8M~Q^yp p?cHܷl$n[0isCya#^a<[>V|OueU~u aތeP#Ase!ԮO'0xWI[LL-UvRHW&K{z.=g o N .$' !z?뗗IR füMxƕaX flHQ KH^/Q:a>GE `]Le#B]{].e:(%ݓ߃ſ !ͼeuC֡khbTRn !8NuՐz}dBYo-"a&ff/8Cjt{xeS`-iv$ҩFaʎN.28T_= 7:qY r\ ᬐ뗢PΞJw[giPUeeY~Ӄ*,5p&L ms )v'*#=mJ#Yoq%v;V]%Ԓc?N[;~&#ezL F wyKi2C`jk %6OP{ r\oZN3B/DrbVB}%ts}/> PJ|kY@V~?HTL==#YAɈń՝S,acùaB =!)}T dN잴g˘/H00m-A?}Ipm0beAFD[2LcV&B+2%!F@9 Y6w #bzOmՀ3AmW!vXiFZ߬ ?oDۻY9QZ6:FTmaqj,N*o-+ĵfC=1)8cRf{ ˕VGG\bVJn6p}.&``4^V.pǹX$<  1-[=s.O' Q3`l8qL>~9X{sx)c)!$χA+S+OwTw":>W[@ۆC3 Ig̃,#7A?߅!%k:;W*g f_nf~}CԦdi(jc7EYN7( }]߯띄q|1>X{s(̒ ܧ$[k8Hlm،mS){] TE'ٌ[cRԑ; Ɵ;w`ah mU+qo-6aEk/ik 2 uE1 Ðsl~W xXJ P\+H}A&q1fCiyQ igPI~Bh|?]-gEb~-tK`A.úU'~&jYOQ̐r "r(q uشt9Q³7A Nf>)#B\:{XbftAVf9FTPv4n榲z|S׷㓏c-BIqa v9ehfV[J zcGm9VTܟzkt$ҜS$b>S1)[z)ll_krM8^TTI-ԾȌ[Zv2څ EX2dWZTb(u*Ck3=n8/UR.3*)!BDq}Fi|Hqi/D#Dto}"% &(rqqަCIdOxEڅFqcSt=ͫ1XTX)ov{1e8 3{Xsqij{SiVKBsSU $,wHE5 - k#‘S =H!jz(_2+c9q@RA W<[/L[’kMj'R1jMm*|N=Z3knj9&O>&!ҹktyw0^p?ZRT8;ҽT x6Q?huX;4liJ {I g_Xp`PQ<]DƥMww[OT՟0ɫ ESNb%|&.B^lu$kH`[mKFf4Ec#Ҷu5p^K#<@2Ēph3Xuy* s߯lJKrum ~v毁Q3]L A/ePcwhz_3"8g.JY#} ȹ೷)y /ii8~uf=hz0Z3?;QGeMh}Ղ@ôE`߅SeA՛:@)_1N!J=&/g:$-Yʖ'I;c=8Ah%?)sȋEW/$ks5Chl ,Һ`lioVbl}F%{V7|3t@ţgrXxB 3)xxUv2,@6لgXHʝ|ĝ15#ڧA绿($.W;Kt,Hg4Zw$ NҤ{3P=LU5Vܪ-K?剦TbY Z+0kO4p|q*|QU^"BU]/O UIBD>ޥ7M .|`m.{zH!Øw $@AN\G[D/f#"}I,Wr~"فazKzƚM~Pԁ *P0WV#~Hh$9  kAɼj{P*PHtv(af{_Q++%VrYV 0Y(K}[Aqd.p-빿h~ϩtBnwuNhL'h6c ׭:a84rEc#~1߿@'u:="[B2EF|4wF<0# 0-)֧nNjһfЙC~K7Mٓ\amUKjͥ&Wu*m|^|CSR&M&rMl*ߕΣxSF ^,YomS#Z܈<( iwG8a9[ɀQ2Mw*]A4*tʼn=Q`f`$QEpǪ=ߠ-sXHՠN6 17e98 {9<TE@3Ye7X7;/9Ez]K5;cR='=:dG<00G"Q@3 @;۸P 헦*q݅+<˖3:DhqMDH"~LoyqԈ- ifS_o7DPm0^b /{6:м(ˉG8Ȫ弄!PW5wZ!/),ֳ;wTVrv(RлptA(;TqTCCxd;)x@tQH0زJLA_E|eÇCJ߂ŪlmVm[>bώAj.JUܯLS`(牄Jp+kʳIÙR77{ɄTx0=8ZdO1#/?4* m ܻeC%u-@NޙbkO8r^S>V|XyFmg*y!Q}=أLlj16E}UdgQј ^d:-y+5?! Ak{L v|9{^oύLmsWo|Xrf=x)t1ep3|UwR`#t,cްE)@gؠJZAD>;>2+TQ Jb&r$nGDKc v4"6\ж}12=VmT?' cW͋d.z_r_ʲ} DF e⏓y.CD+7= 7BHF=_21xN/#؉p]#Su[dŌ#R}\8W3X4$kKQfxJ?Lή ^>RFV9䆸G?.zl:ΓԗnI?Z4H[K)ӡ2 cȘі.>.|Ob̧X8UIy{~РxWFJL1bi,u?$u i;~C^'[&~(\0,-f"+ӧSG#ut+ܳ䧫5,7=PrkA)4B2Oo4pZ}Z=.=r&YFťi௱zxGe|;bؔc$X?6;en~~!(739c%l'5nٱ CExp^ZM}df &T+E;X08cB3(g|F 3zP&u!y a׏,FJ^BI(qԡ_z =Dh[+UP?e2=1??XFg 9~sG] )|eR7wB { ,H1+@a3ԇ {#[$1{K8~ )׃m]ADj_W~T?A`GT Zo4X#Q `(}<C5$Qo/=Էa["«=RSi#!|L0(\=XZTy5n"p&55-=Z>™g RYNԹsWv{Oko,SR\dxO~:j}!dHrzۗgٯz!y{`Gn{1|6j]ڰ;1QdJBqb۱mf8#DzYRQQTAEpD(bS`amRQMW /]kMO'{Okc3-d'ݦC~=M1DI1!Zqo_̻7lbyXkШ a/4vT X?,ZwSF0D4kt ramAtG$MRƨ2D5[lYTCZ[u!_@+}4Un'5S ǭndk@t׷v2W4#dp MmF8HMI{.o3@4iX;J6jnpHQBk37qa1˛Γ K"m[~b]y D!Pl3DH&ȷad(RL8|j-G-ѣLq ZO* ΀YgM:`3د?S<>8٘no2Ew>$mNkyTj^Q5rmA߱ڏ;dLD+txZ q]1oEI s}}wNxϬ,uV-;cOn1g}KgsFwhpAްZoa?A|P;y 4b뇱ю#IIOD^>[xzZI{ U [LIL&y›$PcɽϦ/LmadU]= zKO$,Hi !Bu><-nYOSr .äHo;!OraB+"D)͛hé~@氵4}ݨe1`J ?tn%|ӏT9.䟸i1<Ƒ, ;xz1jl'm-;$ /~]k=iV^6#xh&I<KT}(,k7S_5bހP|Yv1df{䃒neI9\M3sy ^Vi :!uo\_d#׽!7AoMG_@}.>aV$>x~T?F.cg]J  HP-#$CrSڗSa)+c@?a^ wZe;Z:_FY0 m4`%Yo'fY8$绀 a0wM"Fm.!(̼ xz M8 lu'FI/%dэ;.9wIDku^mQ'^HL.}#-J+bO|禡+Cߞy~qu^RF0M8k0cgh80@l^eGc>r`0 x1*Y;ՃCbB.ƈ񪦎E p f`oK4RggљV2Krw}NNKԗϚk>$V)nx<خcq6ǒs^6%K$Gp(*c:|vGP"!4!&u_ J|l:0|Чxi DU}kE&p^x0`m,?ίy@ DX[^3[i_+MےzS\ɔv;\T! Anӑ'%"گ, 7[my\;*zw6!H5oXS8_ Ç>5y-tD|ql.p<QBIB4cuC~v־1?l~VTͰ6( `8c16 1]#4:/x뜈y0p;oLb)ޚi1k4oFJw9V[J)_5]/b*F9|Ko챔yĆb-0{0mv2DU4q2| g5ٕwXJ%s@|+sUM]L!|gN{ro:*υҷEmQ33i|X{=)[[x hq/a>8;Z:|ɓI/#y0_a[#Z8 ֨G5g=ߦƾO_ߐJԑ/ GΆJ‘!Vgk~,B掲P4n,+ $!"?G8C\rU-aQ.?*;g, iCy% &ZMV#GT2m0ELn7xk5 |0g!ߩ³7IZ&JyUq\J.CBԕtn4"bgcU=F,՞ Dᐦ{Ӯ[Bi?vQ1Fu#P^%E  |Ky}p8Z2L_& im~cZ5w`X־/,,KBn vf)xstۏi{©gGEyvԾ;I5nlGj-Xit] Yb:‚DB=Н36U,M.]B[~$ t>"58@b-7Gi,SiU@|kmq^Rz_5{3SI$(M&Zp?M =?~@%?8T|R[TǁU~.E!;ڱ1 @"U_}-䩿ih${X* d}G2~n׷z2ף.c*IҫΟ0* ŵJ4_3o;Zqg"&ye9cWKM Y4*J}y#).SklU^,J\U95i%)+75GFQ;nL\&aShz&SV?aGGg"|Lm3V{>c>~ >>_ڵ7'xԐZgQQ#!R])Ͱ:H!G" 82#6)rAl3oIJo 5ΰ~޼V>ES5hԳha/<%.5l`ߋ0{Iڿ ʒy պs&$㩱y(zF:#8גs8ZȜІ%0e1qo|:v̓/~ 1>Ĝ:-6@ >}>.)114=H/ *dX~dKP}{~vZ,Cu]!~K(L'St㛌2PG^DaŗKB JÏ0Q')î aC/^6+^36AaXι J]5Ϩ?&%,KcV۶C x7 {YҠqZ ߀n y!*$*qC1IAc/ 'olQϿ p/>81l4 t߮@%ך ^eKx:TEќY_"=#ԏb^qkQ2MeF/2N $|GZ.DaKJM! OO%7˻[{ T#(ힷ\2&S:adrO'k\kxl,Y I!b~‡@>(pJ6NX} \RMߣrw .n;e34_m弳S鐷5KLٿYaS]T a=~x(~i=Ǧ?ߣatp﹀%ncU OM V%a+Q[=a|%m.D=zEo9o8XbN}V/ K ~OE25hȹ o6g?mx{2Hou@cFNj?T'-V]g5A0Nզ@ Ҷo$N>TGj[9 NJ?0gN8^[l~BMF*ʵ9Zz~ub>;oC3$9a[nCg,` SPz!E|-;T1_]- wwB!m/S`)Fڟ K$qI;}#H O _~9z҅z?{07%";zg@ފӵlaw>pKZE`G[ꨒeE,XgMP<5psߒryo! BQS`2/*Iʎ̕ko=2G1+oq`!E+DO߿ppχoqϔgO+tQz)Pxag+_:t3wt,)WIl ʒN5bCǙltv2 c8z@~ V6j8wVC'#IV蕎ZH~j){HR[oBGGG^FLAϩb\ach2e-oB;sk3L>k>ic (鵽t?z_U:DEy_+M裁_GE"aGX6Ew} JS"K˭\ԇb?R[̯]t'"QebU1#z y^/1{9Ԁx.OZﻸ{qgFſ!m(AcNŲcz44_"Sҏ-Bۅ:dU9^Tk$}5{k0+z-: ΕZλ~5#:y61]掁[LupblXִR- 4fX_پVw6 ~7TxrrirnJŧw(ov.hfM_M7+X\z9\^ ƴcF07JzJ.?vkٚ >/CRHN" KfeX+0WHb%-< [m ?%Rm:L6KXUQsmWZfP; KM7w( B?lϿ㧴v~SpYC{){n5Hδ<6 3Ї)/c!C(^576LĞR-l i)}5wƎ*2A40 yΘIҶh,k*ݡUEPMk"[3-L`]/r=>/>2FLS4oM쓂fsԽ,@M>", ME쏬9.yҌ4a݆ڝ$i'&~2\e>#CI<ż_J~*He_<0N#o֣֌#) v0}+c ѱjUN]rD)nUw3t%:);$ 6`s.6t]ziPa$4r/i74~-n]XJ5yM}DoBq|a'4 % s~B;*V\[8^V V$ qEh‘0=:[ dzOZN GZiVps?I1P~Ѽ1li{VKo-h~?Hl>tlK+}4tX١ځy\~׶!/t]g?]οq^4o3%Um~m+'@MK5~fߟT[V[HuI+>7 )!jY!fWw`Ak!D@' Sb9?\;-R\f!Y̱fsØWkc1W;4> MM3m1{ Xu)NuM ͋fy "X;:2ZɪK'5~Sd fK - ~,xƽJ_ǀhm3Iа/Ajk^l쒦Rt+$ 'gaL5`HA䷿*!눘Qy;$lj&||߷W৐qw۸nF8r+}|!ڍ$E&WxJgkNw7I)|7@В4az#1޶[0di,3 dslez|78D|Q0Z/P0{eRUF*zt f0JH]F#E1Ɲ9& .p+j|!xA%(,/<,9ǜ^,X/[Bt~qE< SQ􌓜1@Ifm+D+Kiwn&A(慟ig"PcL4,x$l>oulu65<*rr3, IUkht޿ 4ߠ.Y6exkR+U"!oB>f%*(̵V86_c^~3jsůȹu(Riq\7Gz$_l=FJK[rAUJcUN*|g]=ZDsLX2K7/xZ;6FR296K*Mߡ޾ڻg#(WTs9üE؛(]1L,X88ZLbQ3B IB[#/?csw|[k&&՟#1 [{j}ѠjXtp>pk~(s$QT`/O,]qT@)Wu|)(VlgXm?\AE5A-9AƆ dاtF@&q,ZhA'ĺĂ#dFydC/Ά2"93M\}؟di;*Uf2Ih_TF\ 6'cqCnD^}ĞtސbXcWtqdEHED\6/b\ujn ³@.J^,ʟopIzło_w6phLw?/A)x)e{菫1%m'N> ; ~%91S\Ge,Eyd|ZLPRϽs\Crn b4Y{ss iu$HT*Nu;)w@Nw<:' K 7 [F}ݳt ER6|!jXVǒGq7.A ^Oц kC%*QI8;aJ^ GT%pvM/܍-#6^)F׾z|9290ՠԒe\Vi'F/\Wt [7w&!j;ybN~Qm`5(M8mYBj:v$ 's8gԟx<;VMcVu_`\g3vfԈ4k?1-̑Nmkxe>>E'||I%_l/f"?jR&D1>/050TieS%RW -y# ^ġU;amv.T('k)(p1 2fDz'w]!kL"3A{F>虙[8(l{#1*xy5fTtzD?O (XYE-6">MQKXz*vs_ ޺~~7IVnxϠڂ}~;C{Ƿc=Kֱ/8٠&]v GߜoW+vW#Mb{&(,VG8 vd=[1!Gkq bTÚ y+$U[`~CiwۛyiQ˃ ܼ*oѼ$Up?`n4}7J98F"bmXɩ,vk"M1s<Kq:> N{֪W?.Vo0Ù}nNzyL;+ԫx@͵#ml1ϲ'Te_Ux[먽J_ð_Jq9(c@k|]1M,Ƶ&2ܾxsAN?o^ۉ~Qb-< w%]I*vϲ':wJGZ}YFEvs.S:iJBy/7ң>b OT#I1{$ˇ4xa*ƶXARM cwտ~>*+u4jBrم.|P#IU nus5?+倥I.d䑅heoި͔>lMǠ=R3WH*JL4<T93f1R7M')ob/VƋ[|yRꔼnוeeUnݦbY60mvAhKzA`PtfEذLxC<ΊJ3 OOm;[dxJۛޝ|DB1KovKI*nToׅOVaZgJ#|_xG }] ˑ-"dBp6+V ¢̙̑U<β(5U4#Z&V`zźGYK1^gUS+2>*O]_].gгq7Xu-`p;͔\`҆,2yRwm_\e>]Y7څκrbmf|\ MGF\_xbɲEZ}}Wlxk6FL>-oh2&X+lZ-W3R}țv}{zK6]؇@ŻfZ\*=P[޹Q^=95Uf]i,\436 ɨ-_Ve橵j^F+Iv4Wgb _*:l\wU6P$wx<;DrZNRtWU]u{Ju4siΪ_T^:aX^N#I88JV+nx0ae6\6^.Ǜ}h6`H~*W6< xi -9/Faq[x&V kjpboj2OOM7swwgZ2mFB6j>mMӍ}HKNa9\N&iVwIgd`Wuc|7xl]w=[IP&QuNŋ"Vr: #& (N5SZZnוn~oto03HQrfWl_eT{:OeZ~z]'x. IE{6v ^{&FY',™Yul{( {zlײd2>xViʞ/`:X4dme4# i^lFXꦐtlk"E5\mZYn+gz4w7l&gqzN:I6Z*P+W D/G7{@K ^V7I^MuR&^yؔȴSORqÒ29c{WDLr7NE~)/nWI]tTzr0ީYr[Y6Qd|{%"".MuYA3k6G%ش/T,~6/^=痪U^d"b,3i/ֱH X)vI^7{ME:^nqvwM"ӠbϋqIYLkAJ&Jb./ʽXUtWޤKX-YLxBF$ ji|]{͝oF&LJ=m.;.f~%ާ& e.T7E{Պl!bY4^ɢMooƼ[@ZOnb(.#1;~l寋}ڌuL ~ -rWryJ^k ,4_￈וN_Ai]f=SNcOx\ϛjS'˧aoVG~ WzU~kO~nV/mpz??>_Ys;Ziu8k igO$H$!.ϩ! zmAm[)>inx-mm֝ƨ7F{r4gc; l>l7h?ZvF|K*F֬9/TВC*5GS.{l'Ͻ~ g IJXjMH!ބcŰ.rI 5 IM=RO/B( 2 k"Dȏ"$9n="$ *򈐐&!hŤG^?MRxk#1tb$c?8/M ԁcee`iXS~P*E ^)i\Z:OF9o0la (ָq&k  a|_s/fqDSFCptHh.kS/Z`1璐O Cl=܌ [$٬SF^oаKh\4:yg4ĸUDg!iΓR.q M }ͯ=}搝FŲO 2- Y ~wuV~1"spdiH9%I)ZGpSN9$!^󩋥2$1Hn"ؖ$d)Bh 8(Bhd(vh {6yefKě|)vzuJAi[L|@׿.ou7k>5Fm86>wvA~K6 #eQg۠:Ҏ6vF,܎=B,S4D%QbaBqm̻R dH-̼47 If10YN]#fƺX^AaE $m2$/t!w#z.ተ|:oRH]Rk0>\R++؈Zuu+/~)BVL\AN$JH֨ #C\+PcWt'L&wN3|B.90%wr)Ύr3tBku  : XC->uf2 ?2'Qk !k 㧘+v-4nrP=kGbq-Lnx)9{B#h@Yv ٷ!t1މHD-$DG$|JgGSpuy;=o\E*#wt=|Dj}5%У1t]c%CJ2AGhZ&!LrFKgI2Mble<[9J00z-6-h6H,Zδ H kyh̡=2T;٧_@0GP/Cͤhqc³Fz"` \c)h`%,Kܧv,! '=K(AU;ӵeF@D0\!~.^]aӨh[>OwX8v1w:}^;;Fu֮Nյ^;@ߵ7R<%zV!ƒ8 #݀7!P&(?Y:8>1̉5! !VhP˂рO] 2"Π}*$lJ4W K<$ &G 'H   "L2P1cQ[@Gc?&`f2FrX 0Sx ]'/,87؟@yМ]y6PAj}X-DzAs3 -i`x#Ҁ#1V\Ge+5  *00bfs(F i ~Up 5X p_K`2lЂjNEiAOR C3hs2F% 2F 4Hܿ0mT?#fϽCLP@A?R!AEvnt0)T 9킰3B֊XB +@o%_Lo<4] ڗ!Ķ o@/P.1,/>XNs-2u5Zk,T_f#XXшg̙9+CL £)mP3g.m!$v)bk ß mU)~߃n';oi9(Hoį,|!K1(QB7;`` 4?s_;Ȃ9ϟ+c8֠0m0DQ @+a3#/ft{c1sk \jpT`+B-?qάY`PGZ~ V^OT%d+Q[G-AWGEb] \=e]g\Wμ+>x|:@/h@G}͛5'Λ%#b'I x}'DfaB[&Co2$bCai f%#ASƸ-遃6{c@pW98&! /O`y{q11hX?Gkie wX?*zu#kE'h:(U2b(d =Zz4ZZm7tJO"FH^rpDxҫ΍XMn8T~'i(+gi@JOo2߼'MX*df% dzDFJD:w|"1T;)v)lQvr=5'\{H@Bj-/O->q(舜+ן?l Jh"偰ī`Dq=" ݉UpAqTn:A e7:e" "v"bd~#xa*ف۠M| F?}~ K#5ɦ.j ./Lߏa0jx<4cJ>/[.b{'TGwSmAoըjd_u nCf蚨O} HCc4iw4臺͸eޡ ǑM cDyh8?O~LI?/IFNY v&~M?y<)"! pۜ/sü侉?ȁ/ݓ[<>>]}!e畄x^I(uy^I(~Tz&RoD%}g MOp.^ Ac`'3KtނlHFf%dLYx_~˂Z1?zfO"d'-Pl3c`E" >VA)8O7 0çs*Ey)y-P_aA}0EU,R& ̌s;*sf7p`y;A}W n9ٌwmZ)OfcY|Tc+@Ä8{N(\0)q>6/A\ەdļTJ] >`W|x>|lW?t%1|E`X*Jǐ?QNB8wGb`<#$Qkd{A{ɬ<]<ܟR^y H4 ZdA 2SΉ|C=E^NyXIpOrL iŔww;$ ,n;uWlG8~u5@U싗+J`pHJ@-EfgB656̑Fή<'N7dgou2~CsxCxGEfr 3BF⬟oSlzr^*ıN1TI}a;E@5<ǕI.7:K*&49jym:ɍ7ֈgfxnك57?OK?zo`"߷ݸ|ӻ?~ӧ?FOۍ[/;Z1|ˤ:6泐4q?h۟>;<}K:s/E;s=Ffʬcs(~ƱT[o{x;Z'>I* P}o;Snne G=Tsj!Oi[_Dc4OѹѲ"4"d-jw%Xk1~G?#'(q5xYWRY|<8d/ ;2C)˚뻟cdNhac`ϻކ|EBMme!Pfۋ@]@w^6^I5xT^N'{au>Fd h,$} O%]i%$a},33=bAWzƸ)>}RnOJvR}*h<4Lbƅ4}1]sQęI>ux'h &zepgdRV>qk!5Vyi%[xn/=^?|ZS֢Zuûݟo y3G_ _}VUH>T\%|lO0h\_^I0@NșAL]NE` B",KB,4 u^b_bn!Hne€u,1%Fζ;+iRgvSaV uE!$BZe۩S􋅾͉ غvz8lΉzv$I/v9-~ 6ȩl4ȼ?[ܸw?>BZd Op NdނAdkآ bw'Q64p9h'Bf8$!UDN;s%٘.13[^#Pe !I2Vĉa ?( }-PxFvUT*&iqK 6뛟|QAMD " [t 9e"s$h>+n&7 0;kf.GJtbt&iX\"KXPC\ ܞ@A@jyhvKO9p&lk}bRh(U+zS׾9Bt3؇ӻc*ƳΆI*'YHf,FAT9Fyp+>'S,-O1-;Q,ڀcgmYL@r}fbuT’FqAf'm(q]CAыd2٩d.L:6ժPfs~D*lH=ia, }ERk_JZTxĜ{8zu K]*e;@;.J[_7=$Q;<0{ A?# T[2Q$=* [C ]aP+.xA.SP6W8F{pm㏑JsN.Z!{揨sӽ1>'K>tp9[oR窆邏=3>A@N:-h$$*q[vt1̜ՅA%Ε(bqq׉qK|`B}H0ȊΗv:h֤$"Z MQ+1U n@ρb?uC* j77;W6Ro~b6p{G XfJ^˒OۚsD6Rr "JӅ.2̙];L:!qBtKvS2C( OJaܘ(\(aszBDpN5'^B Gy^`n׳𐄍~AG9)8ajI>`ld}%N v[(nZ_W%:U>Kw i2έƙܧ,4M1CnplNMzVe}A'VÇz{\ߧz;h7 6.>`M}8lm<mޒGk&r+kݑP`}E$(iv]JQzS~b@%~}gl8*.*`MdL`F@ 4ͽl^ԚCӀk`Ty% d<Uó4zIzP1JP6nǝoӱZyP 3O [zCZg`F4]i$ě y?iGI-%N20I;^Qk >,^|5CdwC2-1k|V_9&|hN4#"S'KPII!(bxj$fo$?lMe{\^\C[GYﱢ&L>hwMc1 .&SSjx yT2A9)hڀq5$`-=A`19Zp1._BҎ80G&"c *vn+m-0l.@- \gY! m847n(j&䯅eMj8lŹ̚4orWA.m >LB 7*h9aQd9>i%(5md6"S Xd&n÷" [Jxg&"IՃ$ q>+W<d0r# µB1E0jWYaq+NWW_UСj\O)kHLQvi' $*!#\HXjqD(Nb$YTР~Kc, $ ) ~NV1$ь%٬>A9yS6;J!r3n ALZ|Tg8DnBVLx![+2+Y}ijhnڣ4dW!3q4Ŷo3>JM1DٲGDa9 b  eMhQ偄 ТTDpy?%Vmt$R*PF={ 05NbI"1>ӨųP[R G?(rub&\#9sHj2`lƃVEPLfYa?^ J%j% Qmd,#٭{fEiWHf; /I6N>&uB %] @ !B26CY&sGۡm]<%Lr[jN=li74xuup|\"+R1v-)qcK mv$p?IZI 5 YBdgv2bQn61 _[<:ovOc~m#Iّha9[akq㍝[./tMc Ο֙(^hcx"䚿Jܰehǖ W"I$3&upJcH;Hk}ߘSֽ0ywӟ"eЋ\k1!!#!t=L,Fr^0~'if[_W<#1<_qW!IǛR! H{T}31(ʑ$Vb.%g2#1@sUFlDO{F ` +@3j-BJH چUƄa^|S,{eQ j?n+\]RBpь*7!z7q .Ppe{ؑ 7;'u n>2 XZS# לsUv+9Tz89փ L:29puz٤Bs6}w-NUQSZ^CS=!2h!x9L3ٴ8h F5eH(&EErte~1/ye<ը9X81=&o1 <BQ<,aLɥ笇}:"6\4,(TuPuH,cEVf;^g16VuS^%UW>Sdu+%7&{!K4Z7<L(o(Zslnɍz`p)bJHJH9ϭZNcZ_f%0R1療Z_M٬Z!übB ElM6Rݘm}>'FjT͆QiePx{(,BX  fK%uH(*ƌ&@F慱Y bo~jÓtW A4.Wz~6]/%%廽)~cxճvakq.WjD8C [!lnѮV%,[-O0/ʯ _WX.iDA&D9W%*,aAA LnHP fa\avu]Ic[SbVR99LUͱJXROAtM#g#k!4'_-.Zhif󐞗;pUߦǀb{tA&n /ݔeIS˩ZQL'IRe@1ќD[s E/bo\b[f/+ ˦I]iJaKU!j1]C?n7#Kԃ3_-SDOT{!Ra%;c`bmʊ{_?X(_ 3NӶ=zwu,݉,ڕ*Iw߸N5xyELo߻2|+zvn$7.9t4Mw?/.-<0]|sN< r[ǂlG Yw8KVr4f]UKVaG%M VvTWܒ"nu+hJNާŝ|ukDTYUTш>ELi'2Fc#,~rzne!a>_M9*H-Gs͗_^T[{툽 &eam|L݃uًwj4{Ѥ}b/^k~^PK9"h#!Yy'8i6of{dOih%9bH'H+ N`-ޗwJ~'uҦ)`h BF╲rڒ W2gx =vn;m@" qm/^$;a^%Ay)w#gՕ>1] O}dj1#!L1IrwN[ʒF4{v¶b\""D=\hr§[ƴYiuPi>Y ?1曃Z9H, [Ph2 oJ&2kqq%ѥ>pٹWP#fIGq__k-wby'~%XIBλz8CQ {*;Ni"g 0Y' @$ߖ$9al6G%lJ5˧XC T}нpJPynW2Q> +GuS!u4cknKbׄyUI(9ދ.fN93-=L9Yt o/OΖY`-Ft nWp,%:+'[:ܨl[ =($ ĿVo:s5y^`H$!#VTd4=]~KWӗ~I"d)ӆ#GA5ψrOUeGt$[X=۳q{oji7(xϦs(H7u#wG텥ʨ_|3w7R7˃_HԼ|yٕ6 ,73=OML)ؼeaﮚﮚǮצwDCd[u.zF=v+'v<*"Ko4Ii= LId{;Tr0uHסOTIгaT;Z++Oա4dƺit*xN{k=\ӑgӈ_EuINKst-2.0.8/src/images/svg_icons/image-x-generic.svgz0000644000175000017500000004020512277111530021260 0ustar synthsynth}isXz/$t=J2NTSEȒJy$ dVwƞ ~OnWO7w?ѵzSW7wxzz^]-nV?wg>qx^]U.t/lO_nO_rWʻ?N~ޜͧI:|̅1s1|4^g(.z0k{um.X?>.W׸rU߭/8WU6kwnaX._n5$_Zݼy7x?T'x#U[SNmnѡݮ||X_?߯V7Omp>=庺>=?>ϯonWe݋?.n{|X>]ǘ,Asvqypap|m}2bp{Wꇻ~zS'|ngg|7}X-*oT[H ??sջ*8 9zɿ7ĿajoL6`Ug;|zR^)v f"fL)TJx[c.BTTs_6#Z%fWT5.8##nA+98j1i [,]{#p6n :!pv 䙲M!Ω3}frut&nb]ONi\U0 nV:XMPCZ__95^znxW2x < j 1J F;82==? Tr55qqCd={׿i{H6KmVj^ufq v_V?ȃeS1wW<@PljȠ8|JU^F3c $kk\`fv=MmkI=U N!X G9Am\;Lz#&2P|]ŻÍlb#:Bz-|[|bVrs%t0%8 q׫8>Ĵ7]/ YC:Ղܾq{]^݆SH˻Ɯ~b,;WwhőQE}Ybwm싡8F\_-n{9ԗYNp6t(QP yBZcҺr( FeG_E7.Z-i/t̹1K1pB+_]g3dmLMxL k'16˻FF$Ց78c_DR'gk#-ʟTQ2([K j6fFɯ)}=N~]_(*p8bdf>& iT}ߤ`[7!d~cT#ItfTGqGqB$}لCg;s̄s>|Aq. 'eaY:騕d']Vjf=%_%0"#P#&lrni,QN:DmuS =H3W[ABc5Hgـ3Uuv)V;瘝j\'V1.c(WIk5!ɷ q)g5f͏]S.v =e8R}'`2!Dc2'lw4Eh`"PM 5{PZqo7xW(xK ^{nx/i!ڋh]Z@4r 0Lnu-]-smaB+j똀`@\ ᥔq@h8θ>G`B $lla|ZS Gzv2ptpn2$iK|p`15kSt,jY][\z}3L,<̾a9_kmฆa` ~ .d8H68TV.lq`T ~mBa;] "68\؞UKS?3GI@E/(rϚsÚӮO`fiW:@QjH[AM 4VT y0Db̮ѩگg)+е,9L9g *UJoA@N:rsHwaOd &tx1spuNwg9S9dHL"]z Ky( se\rݱ`"ed2 "m}%::V eI0:4VBrq8p:B_>B> :ɛٜ{V0ԘT4[Scuxnɺ^ .y(\'3pa]1xpL]zl2^ѣGs 6 q0R6B$ m!`ړE_+T}I*w5|ؑxS=L5 JLDepHj]p[j'5e@2fk9k`յg2Oh 6qU(k;Δ)fY.WG('㔚ql9GMnlL4ˁr3ns8l ZxeHez4vt JUQoaAMSffs]`J~ p]?;g{VcQzT򫅽~+;iT6}k7HF9HM)h{Gɹuq@(wg+sd]Râ߸)AWzm2g]gGsT)-"=]c']]͂ĀLIu`Q8N饼_nK0ډD#8ШKMcSjᠭq*{'ol `{ak-*|nN-o/͇_WW =Hw[oX,W|R.V: 7>Ǜ7w| .?w>TtOkF"IoxVb>uܵ7ko~y-pw0n'\(n?7m$FMYA; Ňrt{F򏗯R`3m}|kǸZ6u kX˦F,ٜ~z],?WVBǫwt:.W*C⼫;*o>.~~?}9i#û{pË.H紹ϲf~5zb 'n+Ȝo~^W;LJWFق͚ѝ-A*-Fޖeҏ|kPY6(<Ӎղ2P/0`i鐫9,g*:XQl}T3kj /2L)Hm,n+8+aqE2{n+,t ҭlGMBCs'[g&Bu3|80GleN=& ?icaP. |:;nN=O@7SI5ik=lZ5}Bp83ӛ\4*ݾњ# `9:s bg*©\V.p edr t#j4ր$aOD[+vȇXڭ<+mA!V)PY qW:F[W9^ɱ{ڐBe/B,@vy #xb4D*V pVZ+wqQ|Po Iygǘ]h9qiYç/$l,sykwx*+Od`sF͂Xf{uΥaSen"x T&kk0mV t\8`)?ޮޭ~^ˮ^jا@CVD%:141hxănSbh:0oEc] "PP2Y gIa} c*f%8NQH!9U. s+hY(^q ylE0ø9KR9_(M ( w^KtF_A*`++Vtk+lu,'TFd1gEb @bȌ(QS$8 xςCkhusZIg7„FFa_HX70pa6}G$s:Mkϛ]"n8g`(<,E3KR04!Ҽ2!Y 7%CawtccP$1<xĢ.z A#L/@@\9% R`Dt4-g9QJ(S.‚hOKOѬa!nXO!LC%XӐD+ DbL9PfI 4_eZ< hdyFߠQGnLX|% \e>M# <9\~cŒĸwI{QsIݥpUԏMmԘ᰾T=p.K6K3n65#li  VF!bb1*NRQ A5@AkLp)Gq_pkTVzf"nx])I-G̕,Y+&t+9+uȪ_2P^ @2M4H4c)ú6+ |m4gFݖZNV"o`-2+D/Vuy-kI4p8R[.WMaub^ĉ"&̺j3۔V)Ll0XΒ5%+uf rFvF(Ա GbUgXEL;XEdvM?t;p^'8rCQ,"r.PڬdsHh IE^CW?^ dmC-97JRWCɳv5ɉ^>\ç*Y>Kãb<hR)"Lֳ)&Y,89d!Iph(3Xm: 60:RT @"`ˤPa>,FT)%;l+Ra0Cvb0 s(vWAtAʾD&"|y=۰> uN)~ 8b`窵E,:)b ʆX2h5$s"i3=b&CT!E ?IRahQJX>q7! Cp5K!F:N;D'&0qxg˄rcht;h_F < q$_IxS3,f (L V`gGGcڏF?ƃ8p_M|bO}4cM\vFc:FHFFCAZNeGS$RUDW3ǚP\Ic_TOgrM3ę Ԇ V=gDR.f WZW(2hdNH!b8`[ۊl%,@eaR:OL[s +Xx]|C]]Bim7l蟳@GiHۦ ,h9s}doYy-[Q3_,v?22T$?Hh&.*eܟtq0AI )Mc?;' r$I H`i'd פ&E#aRT=뛃_O\bݭ%7F!)--)Xc =H 3Yudv+GpwYA8$T3yFWCm) wE𯏢(-p"fȦ1de*gxQX8"6CS+uq*)sYVmFZIỶ XQ2R"Apjjl?K}aL\j]M(t}OV_#[f.FMR-f+S4%αR M)8P "L80:O^|utƑv0:E3+(;Ci f"JKdORтٻeXb2D9l!FfX)p8Ep /άb\d@ƷfLeqX #˼N܌DG4.UW1aVlu#(IqNK?Ǘ N@52wyR`BxEĒrR~FNg dVh̐kȞzQRT`3/'_+ W8%[ߔaJCd#K  L,$4 g6.̗dō T̊]x#;Ur{$8ӉUfxN,}^b & a<:'֢1˦r20yh]&3;teR=㒳ni(ҽ;gtr]#; L%imY{ : .Kt,-wTS~P܊R2 }Vge/W&|Xƾхi>+^ x{C0XrMEeO\ Írl3Ƥ"I<4o8**.l]-9k2>օScKfrJYB8 s~"=3xS)lu"AP'Q0f 8$ytCBJƽ>Ž 3)E=W/\J*s,:ϙ g@!&Kw]c82Px&B5LaYi,/Yd^249eidPbSh%1:2Q "X+$ TkPXGy3$iA6Rm5@8bˌp)/'2Qr,4seOKuIтKhlVx+r%8,) Yd~JAp8/;@3KT X*si<>8;,Ƴď`c)uBtBPg_ hC$>e>,JM#y9/ 6ɱh*3\lSjtQRWi9}EKq - kAz`C5nM8ˇ tk6JrpO|& ̾d1& YJ2 mpҙ58MPm|+8ɪypa>&Y04li˰c<#c=өDz9B eXG ~Tb4DhrX_~\|J1"-Z !-N[se?XJtF=-:j*)L =%jY6' R[ܒ(a[>cQXA`q4)?JkZvK}1pċ-stX%d*)}H/*"ɉX&1r&Q'P0ZO(Ai212to[a#Do$5 2)0mޡdĮv3s=Fĭc2@%\@W$W%NFfM6%--,=7II_ڲGhz&xTiȷD=CLxUb6<+I׺1=Ä 0p lbsh4L08nk 'b&l4ȁcځ[:L l膈W`/9џFUqE`cd#݌ddOvEĈ-%6l2!UVlt!ӣloM‹ ͎$0+$8bcyG wTdC6|(4- C,ܼ dk0;$v7s5)+BV BZ'YerDL +O8yL"9`(|Q8' †9 $er.3tWDOy;E_ٙLi68-vTU![ e ceFX:+d$k,YvWw{* YeRr e4GFd̠yZŧvyI1\(u)Hה=+nɍp儨,t:ߌw* S8Fi)d4?`qipDRJxXFDVeǩw+[lV.SFفD+tj.4J6s Idsh-22EA"Ӹ`AʒPp(##EiP9Qjhs&3^tf3 ,}-o ilV }~al$60)ݹ0 S#,y^+(Cժ*S0MmP5S,1 PeZv6T Un%}3- Q|dbivӛ밲~ENrXUpCa"ى>sx6clNj8a/N֤ z(F۱G=bI\䏶^4uVY@Yjڠcs@/RmLAȎc{ioQAtq/ӞU,vҏ[p 0 wR#JpZ2 -#K{ba)I6G6G[TB'f?9< !O-wyҁ%z&*W9iL4d &IKr/)&;zbdd͵%59*m~9]F3 ɳ|KR8Fmh74,gx<*; Xvmbز7Wːiɞƚ+e8 ORKܐKi/2(c~ZE*4Z,> 8ƭSqN4gm\OM:V6*'hcRb:;e\` g 9Ww2BBMvHfr#,Sa4NsT(Jl 8*v3F0IQ m8Hv(a}e|֥_Z*dfj!irC[qTr.;D"3,&,bMѬǬ:CElelbdDQS+BT $Z̗j)у½%r8m䨉 ێ(˚$C N3rdQFiQZo>2JZ6PBܑ WL6L9H&'P&3eFe &Ƃm:a,aXZ`0MSfrR ‰;M˼T(-ְbDMRW8HJ~؛a$!K'DJ:N+3XHq%#>X)6QU=ۡHQJL^Â*;S'{jqT*3Dm™6=tҳA?6Jd|W6Wt4[kdλ d8>XBNS! 6r勲ce;b p*s^<}L:Y_1o.2oSѵD 5L&}qs9cOt y}jOsܽp>*_no;>>-iAuб4Jw%uU<1b>S$w`"ryTm[R.un6>>1J}ig?h5Kst-2.0.8/src/images/svg_icons/data_manager.svg0000644000175000017500000004037712277111530020542 0ustar synthsynth image/svg+xml Data Manager cbn 42.618.433.522.8 Kst-2.0.8/src/images/svg_icons/kst_mime.svg0000644000175000017500000015471312277111530017747 0ustar synthsynth image/svg+xml KST Kst-2.0.8/src/images/svg_icons/pause.svgz0000644000175000017500000001627012277111530017441 0ustar synthsynth]Ysȵ~%Kz_%uj$o.e)[il@4 YC׌H@g?}/w׋ї(^WwQջqz.b,Wyhfhbq$F"x៿nVf*m9B<Iv\Wo_^F#xh~wi9:<\Qh&b+̏'WXO^,VIr| N~~W6_דݻutOVp}xFכu<9_W@9oW=Mo(GrTcZolS~J8 q8\iq&mR `$~%7ɡPs?"o+V:V{#ۚ !g +{'t':f _r y:?1d3-ƄԼyOL38縳Ǭnvy36T0HJߗXGn)V#\Vl6NԬtv,4{o@~.zIᤗlCE5Qԗ^}}MO/-ڴjC6ͱ*}zZ|K,*_$8E~T 4 t2Fwp.p5_;yi]F0"SeWBmkgG DžGG+N=*Ruz]pj'yt$a9:]Fjp~^ZNτS$pf\FtEƤ1#e a o-j:.n6~Xv إWG~t6]>,R<|N_\bYkx^6.ދ,27YjЀ2DW5Ob~{^$VFpo04cGa$ Ԍo6brmaʆw'pu};!Dђ[)2.o[VGϿX ǚNΖ~Wje߃$[ ,/%9}1?GK!k#o/g+rFA.1[j7:,TpRUea , d >GFTZA2-TѰIJݩ72% 4ذjX!*Ȝae}Xo7kh[%XX4@pͰDdC("@bAJmGB)4 E L$81QQvvI3.Ji#HQ 8TA`$!;d%ŖAWN]Z<$K1%5kՙ6ՙ/8aJ"6"/q'//N%Sc :+Kc(ZjICVG%[m r}qi`0r]ptRŔy°e3ã$4"V 5δRв"jw*H"z9=P\0 0@9b` C]=,_4e 8ӚHd_=4+.İ-^0=ȉ.률Z/`6Jd&0ob@r h5 b .hA`A e=;x<\>40Djg9{N73i]Pa)ѡAʞ5t+׫ZOJT 9&i=dkd%nU>ԏ6=ЌǏXHg[5촤7umN!i2UvjZ/à'E- T)u Li09%Rmz65a`t}ֳ Hm(ۍZܔ1xkp +[pkhUL5 lpRc8V=e2 cy3 t_k? xj}ѳ/}e *g}g߁4wԃӑKXQp q,O43Fxك`-{nϿ@uIO,퉺=i^bL4g!O0FvhXj.$עVvoQI3*pٺo 'igRFҺ5Vj"ؔ ֐qx$; bcZd.z_i Ec ]mGjN ϽT؊Y˥o#^ڸ6/v2Zz)h-}F/:k̎zڦxw8-=ZOg_RȾW6MP!AeҺ/H2ZQ[5"|a:i^T9Vz]6oxd~ ۍwzx;BSzwJbG|h\:1.[xxbЛi;/8^vlbS5ScN )Te-sh7s1*_u&Զgio6©(gWPWiY-"`Q )Npq$'V5]rQ\܂T'l% էdN}ẶYɷyFl5*,/Fr/԰1;XQ\ߘ]rdUMv`i"`.C'|isFK,u3fl6n~=Mw^7bu.G*EHR+W׿C̗WUI{{Iv(,CCvSOYrb*Qt}xt۴tofwaˎe唐 VYvV1W}(]qu &=޿[ )O5U!ٕĮ{s?]èƔʒ$JF߳6dx ];kΔ6 /Wнݿgrdm[yld߻mc9%8Jj܍k: ?loN|'_{6O}Üƀv2K>~&6?BYu1V( ZD;݉:d' 3 }IXɬf.䣈xRVi +b3Ꟁ0dp'7Pah`4Լ' eL!Vz˱ԨTۤyU̕6^78_妣,_N&uIVYJ9qbRb9arj1R+֫ EMNĤw18RO[޼7=^S&Jp3YM > -9 w+Vv5F+K$eܩ&.-7K½C/o-لϓp)dV[|H>4wKV&җ|"4< pKgp_ ϰGT& *w~ΨKW+0m¼* ukㇺ۫i"anHFMd"1|8Qe+#*BYq$B;ͣ8rR+åI j5UwRm g2+A*ugKNv|ɡvl!/Ö#M?rط ~aT_Ȟ%p<DG&3 99!OB f .b L CbIxlVV<#mXmhd^sB!H9ĈYN=_iBO7@ ыl^q f쫲wxaۙ "^/A`F)B"e#Dv9X8mg8MJ0lvSYBSIGK}/9`G0nUb *Qc#K $ &-փD -B)rfIV\Bd$u£ጀq!?dc%B])R2PpȎvIfXsQʾ|ɋNm,ZujN!i)U ¤[r1X{LS^=KΗ/De\M|O0g5qNϵ>9nh?6,Oڼ >ȭʖdmK˓JgW'ԺbiNϔ9-'3gv76n%TӦ/...Nqw]+崥 N6E9 uK)|{$륾MqSm$D9 \w%X #gU N"Bg_D0Qǻ%!qҎsʪR_-NDg;}y'U#K+$q =it^2hӵB e28 6V0pvN^YřEi WƘW}$eO Ð#3!G/{2UKLj$;_Q^5jWݫfmޕj+gܫ3 ~sYz~Qv\ ^@ٽ bGŶ@v`Z)Dku5uKtKs'ٙ:-Zܤ6Ten\ǧǦޗ;V풚Ssn}bZ†zWn5QTz_'|Ez֟/?`WsS҆<S&;"II0IΆxˤ_&zot'g$@2 ~6ݾNU'VeApd,D$) <1H1ɩ  t -)?lys["[Hl)Z,D$|%%7-ܔD1.Y6yawDW(pbI3BEF}5dAZ-%pUX:Ŋi$Jq](&IYlcۍ$lP&"(FLe"<NUH2t5I~ƷEQa9 SLEx4_Zoҍ image/svg+xml a b c e k f u v x Kst-2.0.8/src/images/svg_icons/plotdialog.svg0000644000175000017500000004445512277111530020276 0ustar synthsynth image/svg+xml Data Manager cbn X Y Kst-2.0.8/src/images/svg_icons/edit_matrix.svg0000644000175000017500000004727112277111530020450 0ustar synthsynth image/svg+xml Kst-2.0.8/src/images/svg_icons/new_matrix.svg0000644000175000017500000004333712277111530020313 0ustar synthsynth image/svg+xml a e u b n x c k v Kst-2.0.8/src/images/svg_icons/lr_arrow.svg0000644000175000017500000003331012277111530017753 0ustar synthsynth arrow-right-blue buttons webpage hash computer arrow shape Benji Park Benji Park Benji Park image/svg+xml en Kst-2.0.8/src/images/svg_icons/new_scalar.svg0000644000175000017500000003275012277111530020251 0ustar synthsynth image/svg+xml (x) Kst-2.0.8/src/images/data-manager.png0000644000175000017500000000233412277111530016442 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<YIDAT8MlTU7o̔J:" @l&4\X0`+u17FeeB1hH+BL[Nu=.Z5Ɠ=ߜ{7b"\lO{U|_޷h] v >1V^ G#VE]$`BL覔 tu9ї*-a[ cBGwJ,P za 6vv`N^燻{Z;' kS_-[H]xb[G|2\ X1čiztthRŦ[B(כ4Mc/]Bܗlf \w"ΞiR$~h暾 3oŰ- &c8\"#cqI-o) zgn8d݆Dr/aQ]DڋcR""оQpy [vdCP!n siEkumy{w/`9_g-iSK`xi,Ex N{vyh+` r- 2gƝۺ6/oRlOvq$Id >AĴ:fnRn>1Nq[ks*HBoH| &c>b=2=N@D{\)ɦlNHu| }7\`݌L# &=?l aas ~{_^왋 ZIu/^_W q$!HJhp"-@V&$CUljOycZ꿚cjԢ 4s11ab ^PNN~(-靃pfҸ&87G0$d'A0 >k'hg‰TWvڤVv,hi`aA;n%x3#'OCr^S}AV!IVޒRIƙ88^yn-\=6j )p2&oì1`ۇ ό΄4Jq{-[3g\zpJNjݨ>7C^y( \`^j?3uֵ!<0E_;QW*YEҔ?{Q+MEj*dfgSRPpҾP0 '%F^5;,XUurrxrZ޲bRf_HNo R~j-K \níN x(0T ]|/!HW& -Xh+?fksIENDB`Kst-2.0.8/src/images/kst_bold.png0000644000175000017500000000174512277111530015727 0ustar synthsynthPNG  IHDRB sBIT|dtEXtSoftwarewww.inkscape.org<wIDAT8Mh\U73oJv&HFIp"YMхB pEq…6j4VP AfiPhDRIܹ.hý{~p{^7m]J5!#Si붜o~?>KG:ub)[n~Gi<_@RA4'?Ggq!B^ ӑyG e2/@4jM=*hkq)ǁʎwYfZR|xy9đjкQAFZkR}>H'\В{{{wYYYIT*|yJQM*!x[QxErJcP" W QY-aT.1\.GVZjJEdP"m{1qbuR}X$loo0sssAЬ (-ⶢODZW,666XZZboo^R7T9N:錺 FFFfqY_^fffj68bryT*!w[1DOhd*qM\a3I{mE:Z:Ja"lnnR({X__CXdE11::JFۇruQ&[SSH{wt|0SKZ(l=^5Zkjh; -Ġs6~oϦ yr8}gho^{s+B5ӭX]IENDB`Kst-2.0.8/src/images/plainplot.png0000644000175000017500000000065612277111530016130 0ustar synthsynthPNG  IHDRĴl;uIDATxUm Nir s>tS*͇0fc$$Xۣa "Db"1iXLD*E4 NX5} +GɁ г[\-}fŋuIeR:~]4nm*;KtקtW{*cUBe™3i kc[o/ e$zzyR(RC^ ։VASbQº:1 ٮnܔ\>BuVV079u9ľz0w}7wbaJ-%?ʭ<ϡlw$k#f!j$O=Ͽ 2@'2qzҳ֑=O\XQx}dbZ_ĥp.J)!bUć)<UwX)t 딤-'{V D IK^ 1H e} Bzu7P|8@#F߄Ik3l`368Sŷ $Mt#0'FАY$uᣨ} |?'fEgBR?B<Qk8}5h4 4~iIFxeNu{d:`lS4(=H$557߂Jb ~L#eWKpK6 (:@8e:>53owk/…$Y~0#8+cPbA gs(@/ bF "V [SXr}{ۣ/&"0 J I#,=@Iә2 j<Xf<) fy56؅'>Z?(!3*?lIENDB`Kst-2.0.8/src/images/edit-redo.png0000644000175000017500000000233512277111530015776 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<ZIDATxڵk\Uǿw&L&GټZhE+VBPх΍_Tp!pP(RRE6&ih$޹Ð6pq؉>񘒹R]~sfyx'Љx8܄0I\ҋwroI)9 z![Oaݡ"z"0.SuX.azX& '{w N ONT; v !lm XMhDkwǞD\;~D#8`@B TiKqվz]UV dPHA`|2 7aHP@jt4ّHD) lVAF97P/bhM ef ~T?;FU*WtTX$EETP_eM\b֕Rp;Q JFIxG.\.P2U8~] o+>S&"}`H~XȤحmSqip؃dp<Iԕ ZyAUg# yH6O~[;4"WZ_^UTUQUi-L=4ϡHX"-+VT V&UȖe"Fq`CGM:ƋԞ`|Ϊc}x;7Ocɓ_y#B'5. 1/ $3Orv++jش!-B \m. 떖C̓=uZgWWp62 M?<=M CZbJ|@P? I j>2[$w cbKb1=%d2-3g{<#IAeF#t&]6;fk8Euu'ݥ_yNwd_r%z<`fb̌JܘLr{x-p˜Dj{}5'XE<8] +Sk#p8 #]/G᫚MAplo]ǥKV&J PuuPtct?Bkf8 OL0F-nKohh`` N4Aٕ)D.t"_ `WW:ݴ=|$G+Ӻ76^KO):%*)"G%$,c>.n6Ra=TR%,'`/C(HHl覗\;'#:龾Bx 6r{p9E-M!1 :v^ 8aɠILUℜk7fG/}~/)% q:bobqlB2==ǝp8 jw۞ֽxBQ0.މ \._i[|R$BYgRiƙOMM-y[Vwk n>D:6ދ|Tr%+n2eE8VE"w[aјx!\~7Ol]#P8q2Liǟy\`ޭ&@,IENDB`Kst-2.0.8/src/images/kst_differentiatecurves.png0000644000175000017500000000032012277111530021034 0ustar synthsynthPNG  IHDRĴl;tEXtSoftwarewww.inkscape.org<rIDAT8A ?(P*1 }Յt> Y`@}L!Z@j(HqބAQ@C'ՙ$(/ Q/475Ҷl$IENDB`Kst-2.0.8/src/images/draw-eraser.png0000644000175000017500000000222412277111530016333 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵmH[Wǟs574Q̷ۘFSM+j[ v@q{R2JF[?ح-kqӍk sMsΕ"ũ-py1(B)o5]C ^Y  \eź.=xPl< WCzz!>x=Km' VxT? @qf(u]]]Nw -{O罠J@!nKsss5_xmJw߷CꊄY0b ᫪Jjxkې|;'dNZRblydM^ eLбR`iqsiRufQ,0}![֒PUssscl#@M G7#%\,bQ7:e~t+ kOцiH {vPgRS rc=D24"_kҠHGRR|Y/#}ဤsGvuhOCCHdbV=PHxtɾf2s E&ݻ33vT y' _ݸ]:jkT"I"'MpEPtqlʲ\[#D+g?&@\RRRv R /޹<*׽* I?-Uѥ֊ni~~mkStI`2:4nc?̮ R A_hٹ4q `Ϸ}}}&}p0 aׄ8VR+Ӯ}WAAqpǩ*ЅXEv׷yQ~~g_MNN3'v'=$7%ݒ=A,WE'8DhD8!ǿx0s,>Ya]< bmr͹+KŅM$N_2݊cg Y^kGGbyتd<`lDBY4;f{3vzߔeI/R=٪"p {_0 ?%YF X^QdO&ApHIENDB`Kst-2.0.8/src/images/kst_csdnew.png0000644000175000017500000000067612277111530016274 0ustar synthsynthPNG  IHDRĴl;IDAT8AN0?A2GͶ]p EX&'aĶ@{p:~+sg?Ic7JfC1/&c`\ IѶJ{&^3TESanR<%Թ^.!zg*Xװ,(?&'I"TVҍ;IVNdι8/TVac[SIZ)lhA?+ސ>cXN!(W; S\ ~h;h$K5m#~o~PٴGt(4 4RE(-M[DՍ-Ь6h7!Bh6T.Cb/I|휋wreh{={C)Lf2``jQں>JmZ+HJi𬁤ٗry>]l^d-7O TY`L:O.{ r?q沢/?hZ6ö܃ :Sgwa{.w~$:AduSӟ*z{{~Z]<,{5Yc[X?Åbzx`\ĹaP^>~⯫W9t~>x+2|h݃6V#!ټ^Xٷ5w]]yaDGAkxv-bO}jj:RRTc5)#MsvZ"x`"w JsySƫvp@744֨氘ac/Y΃2uΉsvŐly&@"A!?ӒIyEh:yL#KJ-rwJu۶9 ȊWƌUsyLrdGgf;曋Df,Yr?0y`+:Wb\~b'C*8LȲz  (6vi+8;kh"a``ذ}qϞ .Nn׮wws->?zS̽*ULIiK[YdR]*%JH2J)yyy1BHJ!$㭭捛6u\BJ) 6_M4e馲7q<,p8"  EPB0z 0ժ!I2[X*" f3AAVv)Kr׿OC&XIIh4H R9 sssTYBϹR)*-//2I)&5k,[@<K[L)bZT3*,&##:4HSyYnF$b- Ur{Q~ڜKBABIӰ5yW@(H=քL,tA}ptȽ$0fA_ұ&b: R 9$9lr0GP1n ج |7] SHQb_lY@tM6˷Ӧ`]9rqsUl};qwXnRr󾣏F`g?6!Mw/#6SZjn0Va:KJ)`yax`y h7qz9|TqvT/8ɯ0̗Z[ &g~mۓGY֨{xkxmiyђUޑ}&;˯ 7s|@Pspǝ>}tj ZL 0GIENDB`Kst-2.0.8/src/images/kst_stringnew.png0000644000175000017500000000147312277111530017025 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8[Hagw2ݡ6v2 +PA*z1".tyeBv!J (ꡢ kΞELt~QU2uIJ&ƴ,mf*H`˧i[dn{#눕 +X4%OhZ)GIOFȘhL۳jӢrJ6݇`>Cݾ̯5 0]GJsLvX6ۋF2D4,]8@+즇desa#| UЙivv)0 314šhL[I"S)T I6x;yߓJq5( t]W% ӦjYt8;hL ִ"޽~݌y"B'6בld;;4@ɪYB P2 \Ue_bd T1ӴoǏ0@Uҩ<,kuWU3|q; 3ת釾hz`W7M@y"o8=]2@-$|N9z 8`L< xρbe>#Ed('}EDr} P%( |Y # (U.c@\U/HE?X> DHIENDB`Kst-2.0.8/src/images/48x48/0000755000175000017500000000000012277111530014210 5ustar synthsynthKst-2.0.8/src/images/48x48/kst.png0000644000175000017500000001106712277111530015524 0ustar synthsynthPNG  IHDR00WsBIT|d pHYs99g 7tEXtSoftwarewww.inkscape.org<IDAThY{XUUs($7媁"`^B4)hF8TWj:7ꘉ} ʘ̢CF$9C8IϯYϳk9"GY֬ꍏ|h"CqU \S 8OOOHsIII܈#EFF\hӦM"w^HHȼ΀4IIIv7nP3;{,DQƛ| ߁ѱaM%3,|j<a \p!!#1`#Z 1? GE%(+n\~}}bbYncNNNí`;O>o-C/?_mێhݸ $ b&M0[Z`?Vׯ BBBuV01lEQtzYd!__<-O?4kjjUjATE]\DՍGU~T@ɟRz?K tbwhTUuLF5n hph̙ ޲eK-Iv.&x֭-0tP&2KOO=o^8}ӦvQ}4 1 Vq<WEp=p}Ϥѣ[BZ!aּq*l$N{٦q"zFf6%IZʜF׮]XP!0s{rܯppZhMhܷOo߆^z{@SS233'Nd2A%<;+^q"MMMiiiV6mBYYY8Y pruN!BDD8Y$Y!IV@1?(ʜ"a"Sğ}j4B3w$Iصkك3f ۶m'@%(Y.p,AcNZ$dY:M7wSO5PQRR'O> 8s ֯_WWW &SJKKju<&O?-G[[+Z3o,A%+"Y@\wx-薯jjjswwGDK/ȍ<[ЭEk֬AEE, V\I9^_+((yr{غ/@nn._/h]Snܸ ``wS_~%ۇ͛7Svv6͞=zZZ!==aaaܺus^}Xv-^{5Lcƌj!fFL6 999?>1ȊI6C,xaA4 pi>PUS}C@O0JA*ˆ~[CSLJ|5(,V[M0R5ҹShh}w:r3?2?c㟰# tkjj ]~VVyfcDp 6oN±c_;D~.YKY"AemfHї-hlVCYY@Gj>'_~޽{9x.??8xD FT^7Ca( } G|g>0@a2ѿxy{ߏcĈ1s DH1"*iiiqto[:?~)mhpu&M߰h7IiDž&Ɣ(G<3mDnE lD7shU_F8"0 8NGDNl\?P^:vjI8&X`@¥0>X ˲?Wq2Ch;LV]kA-(hDkm :!+- ,+8~⇖i M8nС/^ t/ı⵷V30thv;.<߄\:ϣ$0E֎gF;`x< _n'E{jȅww#G?>NMAHpVH/Z14X5=(PYnBOͰ<|upq@Vd4cߞhiDA,xa1p Z&v{)GBѣGW:T*lذg_t X;nr"SgA`tg ,,zYQ75w9T}F#ҡCh4"<<]>;eߩ/6 13= &A[GeU+Vp(,ر#(99spphF:(]RcLØ IOr9fF>&o#Đ}y登*+jqX,f _ uRqhkps$NK99ͱЌ3{Q/_C~ؾu^Fd444S>LFƊwސ$ f Dъ"K!Iv0zN{,RA;=@HH|bqc \ѥ0lMRPrӧOĵIBP~BoX߾1OX NRqԏc"FD={5##^s= |3K(ZS'~ol[o.3RlW_ bkgѐ Ɂ}vܹsUJbڱ3~_@c:-BFJ{ 1#Do11F8_V3vw94ڧO@{{ь1?pl6#!^Ry`/&I;G7oo*/^U[{rt|{J5(?]LRLwO`[ Q>hGYuC67oW/U!˖-++**⣣}||_oz݉ ;;'<.$CIENDB`Kst-2.0.8/src/images/48x48/application-x-kst.png0000644000175000017500000000535612277111530020276 0ustar synthsynthPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< kIDAThř{p\U?wnv<[m6HQV֡mki2gکR3Lm(q(AQH !m6fټ6>lZs{~眕?~HIt\:|>[n}@NVzZrGOCSSLS .0LDdHx_KOc׼,G}Ny̗[Ng4X97 sƫdi4˘ D1Ln D7U6D@O 1̬r|{:2aIʝ: Թ4TY' FC6zGԂ&("=첄pPWKN\&PuP49_ɻ*Mvdn22n03)sQYvKl7B$||~4T5qM8z%ʀH8eF)0rf-.g$d+Km !?$_Lm躎ӑ_)gΜabb"hq0LseN'WK0r lWxp8DѸS.H$Bkk+O>dAI%cX~=k֬a``I, x^$tR~?SSS\.Z[[# "2˗/ѣ/<¹f5/ {<ws}(JLsB$azX1vSKݱWW72-cyےq?'-,j]#Xd( \Խ"Bg;`:Q5L46p< ܪK,sČSJy Fǐe+uG_օ ~ׄ6C}PKLN_b2!z{wqqan>i :n{YDD>9W܁y!vw / 7QG$L̢c$1mE61w~W_Gr:Çh@WWW"VE}ei^&."_lruMC7T ؈i(B(tRRRT***D"B!l6nOFGeY)--%  ">s&044ƍgdd$p555A4MCAmm-(f t]nSVV8*a9N2qvsB\r}&b* 3Z`kt%ld4Mt]!l$2ww6S9l$W\װXK?+ErHr_e}-[x<455qETUrxC,477344$x<Z8NZZ9yϟ׎PA¢iHr vٻw/7\BJTTVbiv=_0R Q>̆}~H!TgaUg9_RleNMM)H`6,v~%ɧwj7חGxq^yOWj*n}2} M,Ͷm/H`60t$+ 'UȐ7%W̓`MOOρk~#ߌ<0d4ݟ6E4j모rs~V+VFu ǘ7W X$7NW V"E ===_v:;~K갠GLzL!0 \榼ID'TU`&݊2mL[`ݺu9ϙ>ah蚊kȤfl藳l6cjmD__^w!)0V^)nڡAHײ p.\ؿaÆ%P۷oŋwXFII?,gSctt4u/@[[[IٳgRz 켢0

kstplot.png plainplot.png kst.png kst_blank.png kst_changefile.png kst_changenpts.png kst_choosecolor.png kst_csdnew.png kst_curvenew.png kst_datamanager.png kst_datamode.png kst_datawizard.png kst_differentiatecurves.png kst_editplots.png kst_equationedit.png kst_equationnew.png kst_error_1.png kst_error_2.png kst_eventnew.png kst_gfx_label.png kst_gfx_arrow.png kst_gfx_ellipse.png kst_gfx_line.png kst_gfx_picture.png kst_gfx_polygon.png kst_gfx_polyline.png kst_gfx_rectangle.png kst_gfx_rounded_rectangle.png kst_gfx_layout.png kst_gfx_sharedaxisbox.png kst_gfx_breaklayout.png kst_graphics.png kst_histogramnew.png kst_imagenew.png kst_layoutmode.png kst_matrixedit.png kst_matrixnew.png kst_newplot.png kst_pluginnew.png kst_psdnew.png kst_quickcurves.png kst_quickpsd.png kst_scalaredit.png kst_scalarnew.png kst_stringedit.png kst_stringnew.png kst_vectoredit.png kst_vectornew.png kst_viewmanager.png kst_zoomtie.png kst_zoomx.png kst_zoomxy.png kst_zoomy.png no.png yes.png kst_rightarrow.png kst_leftarrow.png kst_uparrow.png kst_downarrow.png kst_bold.png kst_italic.png kst_reload.png application-exit.png document-open.png document-print.png document-save.png edit-redo.png edit-undo.png draw-bezier-curves.png document-save-as.png kbugbuster.png tab-close.png tab-new.png tools-wizard.png transform-move.png configure.png office-chart-area-stacked.png code-class.png resource-group.png draw-eraser.png image-x-generic.png dialog-information.png text-x-log.png document-export.png tied-zoom.png change-data-file.png data-manager.png kst_gfx_circle.png x-zoom.png y-zoom.png xy-zoom.png document-close.png page-previous.png page-next.png pause.png count-from-end.png read-to-end.png new-log-event.png save-vectors.png themes.png magnifying_glass.png Kst-2.0.8/src/images/kst_gfx_circle.png0000644000175000017500000000204212277111530017103 0ustar synthsynthPNG  IHDRĴl;IDAT8OoU̼xlc;ICD뢔R.ԨQOT|JAb 6(!Rq,&!jEHo}G(̌t--hDy&A*/kLK՝k e?x|ꅄRbKD\$b0v/feegӲJ7?ixzhh&v~;w[6^ܮvƉ2{OV1xuL콙#?>rLt4]`=;L}~xܩYXw?Y޿Oƴ3citCp_ tPf_/]N-;MY 7jd&rqT[/BDI覞ѼQ>ipz+H Jy9Ci "(D9I bc?C I$&j8n8ұ83#<= @ ڽ@m{qMUXe 0;` &^5ΤжDpd%,yYJmmŅ1<  X ^Z_i?Ÿ.IFߓNd|VTUu՞n7-P ">9#g%+S8+L3uప#?ܼe={lƴu?|NLG! B4%jk[5mPb1oRs^0cHs/rBJ8^d/4oܨowJVm|0z|$.S3Q%D 0UY ,ijo>Pl=EIENDB`Kst-2.0.8/src/images/kst_quickcurves.png0000644000175000017500000000113712277111530017346 0ustar synthsynthPNG  IHDRĴl;&IDATx=n0?9€\N  i K@ )r O..@1)dR?Vn@$7o Gx5ƨp^y}}%1eY7tRsgvUejf;cU"1f~z464pIDH8tzPAUEsNGy[{'//`,2.23]f."**bZemkbl̡h{]T(3u&Ӂn}|n\Ԣ(͢Ԓ {UEEW].euݤcSY>HM!2B"WU5)>?9ގZ;O6~ chRٺ.zgz;JR87Mzi1G酴-MmP9SIGiq2R }>CT%[fZruU=]1NQw8~j۶5!SU!7­Oi^.s<˝sjnN@IENDB`Kst-2.0.8/src/images/kst_gfx_breaklayout.png0000644000175000017500000000257012277111530020172 0ustar synthsynthPNG  IHDRĴl;bKGD pHYs  tIME '̞IDAT8˵[LW^u HQ*j -iiJ&jCR|ύCZӤч^a ]\@daYؙ9}(A?=@Y~wa)0}l. sݝG&|#?zMK0G D\EUX; XJy0%DV`= 0(|x](_P_xCOmb9!?v D~0UK<7 Gԙmw6AcLSVo]vcJ)B@1tqCB)XulSaE}'NiGnW&-+i$V5ͮ$Y&0v<; _\rc,v|xBYEinTF8%欮K Lbb0aTVk-/1:B̤'[Xٵ-<~;cx,,I#YXye%fi48BLNZUQopRY8K#]=6e PFʩ3g:::YB=;Г4eI.mRkepAB2$djR'O 8] pMMM6[6TD\2 QpJ~I:|x_ss󋮮4`)--444BD"!<'eY^u󪪮AQu=LSIENDB`Kst-2.0.8/src/images/count-from-end.png0000644000175000017500000000215212277111530016754 0ustar synthsynthPNG  IHDRĴl;sBIT|d pHYsItEXtSoftwarewww.inkscape.org<IDAT8[h\U\56ĤUVmh-j1,4ԗůc JiRl\' ggy@Xy~ W89kx+Q.))xiG ~1ƢAkCF lȱuw>3 R b$0rZ|ߧVis o?c{oc,qH"jnxn1Z ?~V8 È Vl5}JCZcxM|&)3Η#!3 %M-`M 7mH!Z]mhlIISY\Xb -ԟ&($Ci> \)8Wkôf܆T9[*3j:1XSpIT ?ŃԡǹVW%L`RTب|~AϹZY LUJ.|$N>Q- G+b>u74Axݔ bVJclGh!]_",C8n{%jV 4RыX}KTf(Rqkhc7_Mv#äN pRC׿ !=]}5C@?ЇpZ)@Ѧ }efVIENDB`Kst-2.0.8/src/images/kst_equationnew.png0000644000175000017500000000177212277111530017346 0ustar synthsynthPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8͕Oh\UͼdˌRMiZ,M;T]d#VEQluхE&*Ū͢ El-fB[-Fk$yyf$m҅\8=,F6#v$q󹼞?ºNo1l#fd޺~ Sv-E6#b2{)F4Ǝ&S~MJAG"f\^Kf$ tmқ͵o>!QPH̝O\ P=v',U-Ti DN.ٽ$+o"l/7$bnK2]% ^ҮokóּG'p^ݸN&uB,LB42c 7PUGÖ5.Zmrdkc{d/=ń*CAy4*ec:,]ѣxqvVugBva$ꍜPhxß~ˏVigsyzt]]3!6 ^U8Z@J~ӫYCbY/IJ(<3Њr\RT=׾\^j_Y߯pxzAxd2Q-ջ>jпmL lhqQm.(~n}"\4rWR)y6k]-8fUUb) ҮKU.`8D {EZ" $8R]M o?j9ʚIENDB`Kst-2.0.8/src/images/lo32-app-kst.png0000644000175000017500000000111012277111530016244 0ustar synthsynthPNG  IHDR szzIDATxq0jHR.805@FSreBt // Visual Leak Detector // http://sites.google.com/site/dmoulding/vld #include "vld.h" typedef int (*Main)(int argc, char *argv[]); int main(int argc, char *argv[]) { // build kst as Dll HMODULE kst = LoadLibraryA("kst2d.exe"); Main m = (Main)GetProcAddress(kst, "main"); return (*m)(argc, argv); } Kst-2.0.8/src/kst/main.cpp0000644000175000017500000000572312362701575014415 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "application.h" #include "settings.h" #include #include #include #include #ifdef Q_CC_MSVC __declspec(dllexport) #endif int main(int argc, char *argv[]) { #if !defined(Q_OS_WIN) && QT_VERSION < 0x050000 && QT_VERSION >= 0x040500 // The GraphicsSystem needs to be set before the instantiation of the QApplication. // Therefore we need to parse the current setting in this unusual place :-/ QSettings& settings = Kst::createSettings("application"); if (settings.value("general/raster", false).toBool()) { QApplication::setGraphicsSystem("raster"); } else { // this must be actually set, since raster is now the // default under linux. Native is strongly prefered // for remote X, and raster mildly prefered otherwise. // Note: for QT5, "native" is gone. Which is bad for // remote X users. Sigh... QApplication::setGraphicsSystem("native"); } #endif Kst::Application app(argc, argv); //-------- QTranslator qtTranslator; qtTranslator.load(QLatin1String("qt_") + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); QLatin1String localeSuffix("/locale/"); QString localeName(QLatin1String("kst_common_") + QLocale::system().name()); // The "installed to system" localization: // FIXME: see https://bugs.kde.org/show_bug.cgi?id=323197 #ifdef PKGDATADIR QTranslator appSystemTranslator; appSystemTranslator.load(localeName, PKGDATADIR + localeSuffix); app.installTranslator(&appSystemTranslator); #endif // The "in the directory with the binary" localization QTranslator kstDirectoryTranslator; bool ok = kstDirectoryTranslator.load(localeName, app.applicationDirPath() + "/../share/kst" + localeSuffix); // qDebug() << "Translation file " + localeName + " loaded:" << ok; // qDebug() << "Dir = " + app.applicationDirPath() + "/../share/kst" + localeSuffix; app.installTranslator(&kstDirectoryTranslator); app.initMainWindow(); if (app.mainWindow()->initFromCommandLine()) { app.mainWindow()->show(); return app.exec(); } return 0; } Kst-2.0.8/src/kst/kst.1.txt0000644000175000017500000001236512277111530014455 0ustar synthsynth.\" The kst man page .\" .\" (C) 2011 Matthew Truch (and other kst authors) .\" .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\" .\" This file is part of kst .\" .\" Permission is granted to copy, distribute and/or modify this document .\" under the terms of the GNU Free Documentation License, Version 1.2 or .\" any later version published by the Free Software Foundation; with no .\" Invariant Sections, with no Front-Cover Texts, and with no Back-Cover .\" Texts. A copy of the license is included in the `COPYING.DOC' file .\" as part of this distribution. .\" .TH kst 1 "22 February 2011" "Version @kst_version@" "@kst_binary_name@" .SH NAME kst \(em plots scientific data .SH SYNOPSIS .nh .ad l .TP \fBkst .TP \fBkst .RB "[ " \-F " DATASOURCE ] [ " \-f " STARTFRAME ] [ " \-n " NUMFRAMES ] [ " .BR \-s " FRAMESPERSAMPLE [ " \-a " ] ] kstfile" .TP \fBkst .RB "datasource [ " \-f " STARTFRAME ] [ " \-n " NUMFRAMES ] [ " \-s .RB " FRAMESPERSAMPLE [ " \-a " ] ] " .RB "[ " \-P " PLOTNAME ] [ " \-A "] " .RB "[ " \-d " ] [ " \-l " ] [ " \-b " ] " .RB "[ " \-x " FIELD ] [ " \-e " FIELD ] [ " \-r " RATE ] " .RB "[ " \-y " FIELD ] [ " \-p " FIELD ] [ " \-h " FIELD ] [ " \-z " FIELD ] " .RB "[ " \-\-png " filename ] " .RB "[ " \-\-print " filename [ " \-\-landscape " | " \-\-portrait " ] " .RB "[ " \-\-Letter " | " \-\-A4 " ] ]" .hy .ad n .SH DESCRIPTION kst is a graphical data plotting tool, which includes the ability to plot live data (contiuously update the plot as new data becomes available). kst may be run entirely from within its GUI, in which case no command line arguments are needed. kst has a powerful wizard for easily setting up new plots. In the second invocation, kst loads pre-saved plot specifications from the file .I kstfile and optionally may override some of the settings in that file. In the third invocation, kst displays plots of the data as directed in the default manner. Additional datasources may be specified on the command line with options for that datasource following it. Command line options generally apply to all subsequent options unless later overridden. .SH OPTIONS .TP .B \-A\fR plot all curves in separate plots .TP .B \-a\fR average frames (simple mean) when plotting with .B -s\fR. .TP .B \-\-A4\fR use A4 sized paper for printing. Requires .B \-\-print\fR. .TP .B \-b\fR plot as bargraphs. .TP .B \-d\fR use points when plotting curves. .TP .B \-e\ FIELD\fR use .I FIELD as the magnitude of error bars applied to the next plot. .TP .BR \-F\ datasource\fR override the datasource indicated in the .I kstfile and instead use .I datasource\fR. .TP .B \-f\ STARTFRAME\fR begin plotting at .I STARTFRAME frames into the data. Set to -1 to start at .I NUMFRAMES from the end of the data. .TP .B \-h\ FIELD\fR plot .I FIELD as a histogram. .TP .B \-l\fR use lines when plotting curves. .TP .B \-\-landscape\fR use landscape orientation for printing. Requires .B \-\-print\fR. .B \-\-Letter\fR use US Letter sized paper for printing. Requires .B \-\-print\fR. .TP .B \-n\ NUMFRAMES\fR plot at most .I NUMFRAMES frames of data. Set to -1 to indicate all of the data. .TP .B \-P\ PLOTNAME\fR plot all plots in the plot named .I PLOTNAME\fR. .TP .B \-p\ FIELD\fR plot .I FIELD as a power spectrum plot. .TP .B \-\-png\ filename\fR render to a portable network graphics (png) image with file name .I filename and quit. .TP .B \-\-portrait\fR use portrait orientation for printing. Requires .B \-\-print\fR. .TP .B \-\-print\ filename print the plot to file .I filename and quit. .TP .B \-s\ FRAMESPERSAMPLE\fR plot every .I FRAMESPERSAMPLE frames when plotting. .TP .B \-x\ FIELD\fR use .I FIELD as the X-axis vector. .TP .B \-y\ FIELD\fR plot .I FIELD\fR as an XY plot. .TP .B \-z\ FIELD\fR plot .I FIELD as an image. .SH EXAMPLES Plot all data in column 2 from data.dat. kst data.dat -y 2 Same as above, except only read 20 lines, starting at line 10. kst data.dat -f 10 -n 20 -y 2 also read col 1. One plot per curve. kst data.dat -f 10 -n 20 -y 1 -y 2 Read col 1 from data2.dat and col 1 from data.dat kst data.dat -f 10 -n 20 -y 2 data2.dat -y 1 Same as above, except read 40 lines starting at 30 in data2.dat kst data.dat -f 10 -n 20 -y 2 data2.dat -f 30 -n 40 -y 1 Specify the X vector and error bars: Plot x = col 1 and Y = col 2 and error flags = col 3 from data.dat kst data.dat -x 1 -e 3 -y 2 Get the X vector from data1.dat, and the Y vector from data2.dat. kst data1.dat -x 1 data2.dat -y 1 Placement: Plot column 2 and column 3 in plot P1 and column 4 in plot P2 kst data.dat -P P1 -y 2 -y 3 -P P2 -y 4 .SH BUGS Please report bugs to either the kst mailing list at .I kst@kde.org or to the kde bugzilla under the kst product at .I http://bugs.kde.org/\fR. If you can run kst, you can easily report bugs by selecting .I Bug Report Wizard from the .I Help menu. .SH AUTHOR Matthew Truch .SH LICENSE Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the `COPYING.DOC' file as part of the kst distribution. Kst-2.0.8/src/kst/kstbasicplugin.desktop0000644000175000017500000000013612277111530017362 0ustar synthsynth[Desktop Entry] Type=ServiceType X-KDE-ServiceType=Kst Basic Plugin X-KDE-Derived=Kst/Plugin Kst-2.0.8/src/kst/kst2.desktop0000644000175000017500000000170212362705136015231 0ustar synthsynth[Desktop Entry] Type=Application Exec=kst2 Icon=kst X-DocPath=kst2/index.html MimeType=application/x-kst; Categories=Qt;KDE;Education;Science; Name=Kst2 Name[bs]=Kst2 Name[ca]=Kst2 Name[ca@valencia]=Kst2 Name[cs]=Kst2 Name[de]=Kst2 Name[fr]=Kst2 Name[it]=Kst2 Name[nb]=Kst2 Name[nl]=Kst2 Name[pl]=Kst2 Name[pt]=Kst2 Name[pt_BR]=Kst2 Name[sk]=Kst2 Name[sv]=Kst2 Name[uk]=Kst2 Name[x-test]=xxKst2xx GenericName=Data Viewer GenericName[ca]=Visor de dades GenericName[ca@valencia]=Visor de dades GenericName[cs]=Prohlížeč dat GenericName[de]=Daten-Betrachter GenericName[fr]=Afficheur de données GenericName[it]=Visore dati GenericName[nb]=Dataviser GenericName[nl]=Bekijken van gegevens GenericName[pl]=Przeglądarka danych GenericName[pt]=Visualizador de Dados GenericName[pt_BR]=Visualizador de dados GenericName[sk]=Prehliadač údajov GenericName[sv]=Datavisning GenericName[uk]=Засіб перегляду даних GenericName[x-test]=xxData Viewerxx Kst-2.0.8/src/kst/kst_icon.rc0000644000175000017500000000010412277111530015077 0ustar synthsynthIDI_ICON1 ICON DISCARDABLE "../images/kst.ico" Kst-2.0.8/src/kst/kst2.sh.cmake0000755000175000017500000000170012320547027015247 0ustar synthsynth#! /bin/sh makeAbsolute() { case $1 in /*) # already absolute, return it echo "$1" ;; *) # relative, prepend $2 made absolute echo `makeAbsolute "$2" "$PWD"`/"$1" | sed 's,/\.$,,' ;; esac } me=`which "$0"` # Search $PATH if necessary if test -L "$me"; then # Try readlink(1) readlink=`type readlink 2>/dev/null` || readlink= if test -n "$readlink"; then # We have readlink(1), so we can use it. Assuming GNU readlink (for -f). me=`readlink -nf "$me"` else # No readlink(1), so let's try ls -l me=`ls -l "$me" | sed 's/^.*-> //'` base=`dirname "$me"` me=`makeAbsolute "$me" "$base"` fi fi bindir=`dirname "$me"` libpath=`cd "$bindir/../lib" ; pwd` LD_LIBRARY_PATH=$libpath${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} export LD_LIBRARY_PATH echo $LD_LIBRARY_PATH exec "$bindir/@kst_renamed@" ${1+"$@"} Kst-2.0.8/src/kst/kstplugin.desktop0000644000175000017500000000024212277111530016356 0ustar synthsynth[Desktop Entry] Type=ServiceType X-KDE-ServiceType=Kst/Plugin [PropertyDef::X-Kst-Plugin-Author] Type=QString [PropertyDef::X-Kst-Plugin-Version] Type=QString Kst-2.0.8/src/kst/kstrcmisc11.upd0000644000175000017500000000243712277111530015631 0ustar synthsynth# Update: move things around # Id=kstrcmisc1.1 File=kstrc Group=Kst,EMail Key=EMail Sender,Sender Key=EMail Server,Server Key=EMail Port,Port Key=EMail Authenticate,Authenticate Key=EMail Username,Username Key=EMail Password,Password Key=EMail Encryption,Encryption Key=EMail Authentication,Authentication RemoveKey=EMail Sender RemoveKey=EMail Server RemoveKey=EMail Port RemoveKey=EMail Authenticate RemoveKey=EMail Username RemoveKey=EMail Password RemoveKey=EMail Encryption RemoveKey=EMail Authentication Group=Kst,Grid Lines Key=X Major Grid Lines,X Major Key=Y Major Grid Lines,Y Major Key=X Minor Grid Lines,X Minor Key=Y Minor Grid Lines,Y Minor Key=Major Grid Lines Color,Major Color Key=Minor Grid Lines Color,Minor Color Key=Default Major Grid Lines Color,Default Major Color Key=Default Minor Grid Lines Color,Default Minor Color RemoveKey=X Major Grid Lines RemoveKey=Y Major Grid Lines RemoveKey=X Minor Grid Lines RemoveKey=Y Minor Grid Lines RemoveKey=Major Grid Lines Color RemoveKey=Minor Grid Lines Color RemoveKey=Default Major Grid Lines Color RemoveKey=Default Minor Grid Lines Color Group=Kst,X Axis Key=X Axis Interpret,Interpret Key=X Axis Interpretation,Interpretation Key=X Axis Display,Display RemoveKey=X Axis Interpret RemoveKey=X Axis Interpretation RemoveKey=X Axis Display Kst-2.0.8/src/kst/kstautosave11.upd0000644000175000017500000000022212277111530016166 0ustar synthsynth# Update: kstautosaverc goes away in Kst 1.1 # Id=kstautosave1.1 File=kstautosaverc,kstrc Group=AutoSaveImages AllKeys RemoveGroup=AutoSaveImages Kst-2.0.8/src/kst/kstextension.desktop0000644000175000017500000000026512277111530017101 0ustar synthsynth[Desktop Entry] Type=ServiceType X-KDE-ServiceType=Kst Extension X-KDE-Derived=Kst/Plugin [PropertyDef::X-Kst-Enabled] Type=bool [PropertyDef::X-Kst-Extension-Name] Type=QString Kst-2.0.8/src/CMakeLists.txt0000644000175000017500000000041312320547027014705 0ustar synthsynthadd_subdirectory(libkst) add_subdirectory(libkstmath) add_subdirectory(widgets) add_subdirectory(libkstapp) add_subdirectory(kst) add_subdirectory(datasources) if(kst_dataobjects) add_subdirectory(plugins) endif() #add_subdirectory(d2asc) #add_subdirectory(d2d) Kst-2.0.8/src/datasources/0000755000175000017500000000000012362701575014472 5ustar synthsynthKst-2.0.8/src/datasources/datasources.pro0000644000175000017500000000070612277111530017523 0ustar synthsynthinclude($$PWD/../../config.pri) TEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ ascii \ qimagesource \ sampledatasource LibExists(cfitsio) { message(CFITSIO configured. Plugins will be built.) SUBDIRS += fitsimage } LibExists(getdata) { message(DIRFILE configured. Plugins will be built.) SUBDIRS += dirfilesource } LibExists(netcdf) { message(netCDF configured. Plugins will be built.) SUBDIRS += netcdf } Kst-2.0.8/src/datasources/fitstable/0000755000175000017500000000000012362705136016444 5ustar synthsynthKst-2.0.8/src/datasources/fitstable/fitstable.h0000644000175000017500000001247512362701575020606 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Northwestern University * * nchapman@u.northwestern.edu * * g-novak@northwestern.edu * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITSTABLE_H #define FITSTABLE_H #include #include #include class DataInterfaceFitsTableScalar; class DataInterfaceFitsTableString; class DataInterfaceFitsTableVector; class DataInterfaceFitsTableMatrix; class FitsTableSource : public Kst::DataSource { Q_OBJECT public: FitsTableSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~FitsTableSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); int readScalar(double *v, const QString& field); int readString(QString *stringValue, const QString& stringName); int readField(double *v, const QString& field, int s, int n); int readMatrix(double *v, const QString& field); int samplesPerFrame(const QString& field); int frameCount(const QString& field = QString()) const; int validField(int typecode); QString fileType() const; void save(QXmlStreamWriter &streamWriter); class Config; private: QMap _frameCounts; long _maxFrameCount; // FITS file object fitsfile *_fptr; mutable Config *_config; // Primitive lists QMap _strings; /* dictionary-like container of strings */ QMap _scalars; /* dictionary-like container of scalars */ QStringList _fieldList; /* list of vector names */ QStringList _matrixList; /* list of matrix names (not implemented) */ QStringList _colName; /* Name in FITS file of each item in _fieldList */ QList _colRepeat; /* FITS repeat count of each item in _fieldList */ QList _colType; /* FITS typecode for each item in _fieldList */ QList _colOffset; /* Offset of data, useful when repeat > 1 */ QList tableHDU; /* Array of HDU numbers with FITS tables */ QList tableRow; /* number of rows for each HDU in tableHDU */ friend class DataInterfaceFitsTableScalar; friend class DataInterfaceFitsTableString; friend class DataInterfaceFitsTableVector; friend class DataInterfaceFitsTableMatrix; DataInterfaceFitsTableScalar* is; DataInterfaceFitsTableString* it; DataInterfaceFitsTableVector* iv; DataInterfaceFitsTableMatrix* im; }; class FitsTableSourcePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~FitsTableSourcePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/fitstable/fitstable.pro0000644000175000017500000000040412362701575021144 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_fitstable) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/fitstable/tmp SOURCES += \ fitstable.cpp HEADERS += \ fitstable.h Kst-2.0.8/src/datasources/fitstable/kstdata_fitstable.desktop0000644000175000017500000000170312362705136023530 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=fitstable X-Kst-Plugin-Author=Nicholas Chapman Name=FITS Table reader Name[ca]=Lector de taules FITS Name[nl]=Leesprogramma voor FITS-tabellen Name[pl]=Czytnik tablic FITS Name[pt]=Leitor de tabelas FITS Name[pt_BR]=Leitor de tabelas FITS Name[sv]=FITS-tabelläsare Name[uk]=Засіб читання таблиць FITS Name[x-test]=xxFITS Table readerxx Comment=FITS table reader plugin for Kst Comment[ca]=Connector de lectura de taules FITS pel Kst Comment[nl]=Plugin voor lezen van FITS-tabellen voor Kst Comment[pl]=Wtyczka czytnika tablic FITS dla Kst Comment[pt]=Um 'plugin' de leitura de tabelas FITS para o Kst Comment[pt_BR]=Plugin para leitura de tabelas FITS no Kst Comment[sv]=Insticksprogram med FITS-tabelläsare för Kst Comment[uk]=Додаток для читання таблиць FITS у Kst Comment[x-test]=xxFITS table reader plugin for Kstxx Kst-2.0.8/src/datasources/fitstable/fitstable.cpp0000644000175000017500000011075112362701575021135 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Northwestern University * * nchapman@u.northwestern.edu * * g-novak@northwestern.edu * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitstable.h" #include #include #define DBG if(0) using namespace Kst; /* Scalar interface */ class DataInterfaceFitsTableScalar : public DataSource::DataInterface{ public: DataInterfaceFitsTableScalar(FitsTableSource& s) : source(s) {} // read one element int read(const QString&, DataScalar::ReadInfo&); // named elements QStringList list() const { return source._scalars.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); } void setDataInfo(const QString&, const DataScalar::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: FitsTableSource& source; }; int DataInterfaceFitsTableScalar::read(const QString& scalar, DataScalar::ReadInfo& p){ DBG qDebug() << "Entering DataInterfaceFitsTableScalar::read() with scalar: " << scalar << endl; return source.readScalar(p.value, scalar); } bool DataInterfaceFitsTableScalar::isValid(const QString& scalar) const{ DBG qDebug() << "Entering DataInterfaceFitsTableScalar::isValid() with scalar: " << scalar << endl; return source._scalars.contains( scalar ); } /* String interface */ class DataInterfaceFitsTableString : public DataSource::DataInterface{ public: DataInterfaceFitsTableString(FitsTableSource& s) : source(s) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return source._strings.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: FitsTableSource& source; }; int DataInterfaceFitsTableString::read(const QString& string, DataString::ReadInfo& p){ DBG qDebug() << "Entering DataInterfaceFitsTableString::read() with string: " << string << endl; if (isValid(string) && p.value) { *p.value = source._strings[string]; return 1; } return 0; } bool DataInterfaceFitsTableString::isValid(const QString& string) const{ DBG qDebug() << "Entering DataInterfaceFitsTableString::isValid() with string: " << string << endl; return source._strings.contains( string ); } /* Vector interface */ class DataInterfaceFitsTableVector : public DataSource::DataInterface{ public: DataInterfaceFitsTableVector(FitsTableSource& s) : source(s) {} // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return source._fieldList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&); private: FitsTableSource& source; }; const DataVector::DataInfo DataInterfaceFitsTableVector::dataInfo(const QString &field) const{ DBG qDebug() << "Entering DataInterfaceFitsTableVector::dataInfo() with field: " << field << endl; if (!source._fieldList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(source.frameCount(field), source.samplesPerFrame(field)); } int DataInterfaceFitsTableVector::read(const QString& field, DataVector::ReadInfo& p){ DBG qDebug() << "Entering DataInterfaceFitsTableVector::read() with field: " << field << endl; return source.readField(p.data, field, p.startingFrame, p.numberOfFrames); } bool DataInterfaceFitsTableVector::isValid(const QString& field) const{ DBG qDebug() << "Entering DataInterfaceFitsTableVector::isValid() with field: " << field << endl; return source._fieldList.contains(field); } QMap DataInterfaceFitsTableVector::metaScalars(const QString& field){ Q_UNUSED(field); QMap fieldScalars; DBG qDebug() << "Entering DataInterfaceFitsTableVector::metaScalars() with field: " << field << endl; return fieldScalars; } QMap DataInterfaceFitsTableVector::metaStrings(const QString& field){ QMap fieldStrings; DBG qDebug() << "Entering DataInterfaceFitsTableVector::metaStrings() with field: " << field << endl; return fieldStrings; } /* Matrix interface */ class DataInterfaceFitsTableMatrix : public DataSource::DataInterface{ public: DataInterfaceFitsTableMatrix(FitsTableSource& s) : source(s) {} // read one element int read(const QString&, DataMatrix::ReadInfo&); // named elements QStringList list() const { return source._matrixList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataMatrix::DataInfo dataInfo (const QString&) const; void setDataInfo(const QString&, const DataMatrix::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: FitsTableSource& source; }; const DataMatrix::DataInfo DataInterfaceFitsTableMatrix::dataInfo(const QString& matrix) const{ DBG qDebug() << "Entering DataInterfaceFitsTableMatrix::dataInfo() with matrix: " << matrix << endl; if (!source._matrixList.contains( matrix ) ) { return DataMatrix::DataInfo(); } DataMatrix::DataInfo info; info.samplesPerFrame = 1; info.xSize = 32; info.ySize = 12; return info; } int DataInterfaceFitsTableMatrix::read(const QString& field, DataMatrix::ReadInfo& p){ DBG qDebug() << "Entering DataInterfaceFitsTableMatrix::read() with field: " << field << endl; int count = source.readMatrix(p.data->z, field); p.data->xMin = 0; p.data->yMin = 0; p.data->xStepSize = 1; p.data->yStepSize = 1; return count; } bool DataInterfaceFitsTableMatrix::isValid(const QString& field) const { DBG qDebug() << "Entering DataInterfaceFitsTableMatrix::isValid() with field: " << field << endl; return source._matrixList.contains(field); } /********************** FitsTableSource - This class defines the main DataSource which derives from DataSource. The key functions that this class must provide is the ability to create the source, provide details about the source be able to process the data. ***********************/ FitsTableSource::FitsTableSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _fptr(0L), _config(0L), is(new DataInterfaceFitsTableScalar(*this)), it(new DataInterfaceFitsTableString(*this)), iv(new DataInterfaceFitsTableVector(*this)), im(new DataInterfaceFitsTableMatrix(*this)){ DBG qDebug() << "Entering FitsTableSource::FitsTableSource() with filename: " << filename << endl; setInterface(is); setInterface(it); setInterface(iv); setInterface(im); setUpdateType(None); if (!type.isEmpty() && type != "FITS Table") { return; } _valid = false; _maxFrameCount = 0; _filename = filename; if (init()) { _valid = true; } registerChange(); } FitsTableSource::~FitsTableSource() { DBG qDebug() << "Entering FitsTableSource::~FitsTableSource()\n"; int status = 0; if (_fptr) { fits_close_file( _fptr, &status ); _fptr = 0L; } } void FitsTableSource::reset() { DBG qDebug() << "Entering FitsTableSource::reset()\n"; int status = 0; if (_fptr){ fits_close_file(_fptr, &status); _fptr = 0L; } _maxFrameCount = 0; _valid = init(); } int FitsTableSource::validField(int typecode){ /* check to see if typcode is one of the supported ones. If yes, return 1, else return 0 */ int tmp; switch(typecode){ case TINT: case TLONG: /* also covers TINT32BIT */ case TFLOAT: case TDOUBLE: case TLOGICAL: tmp = 1; break; default: tmp = 0; } return tmp; } // If the datasource has any predefined fields they should be populated here. bool FitsTableSource::init() { int status = 0; /* cfitsio status flag */ int colnum; /* column number in table */ int ncol; /* number of columns in table */ long nrow; /* number of rows in table */ char colname[512]; /* Name for column */ int typecode; /* data type of column in FITS table */ long width; /* width codes from fits_get_coltype(). not used */ int hdutype; /* FITS HDU type */ long repeat; /* used to determine if matrix or vector */ long i,j,k; /* loop variables */ char coltemplate[512]; /* template for reading column names */ QString tmp; /* format string for bolometer array */ int numHDU; /* total number of HDUs in FITS file */ int idx; /* used to get index of elements in lists, so we don't add the same scalar name, vector name, etc to the relevant list twice */ int naxis; /* length of naxes variable. Used for reading TDIM */ long *naxes; /* array to contain dimensionality of FITS columns */ int maxdim; /* maximum allowed array size of naxes */ QStringList allcols; /* list of all column names */ int nkeys; /* Number of header keywords in current HDU */ int keylength; /* length of keyword in characters (not used) */ int keyclass; /* class of FITS header keyword, e.g., TYP_USER_KEY */ char keyname[10]; /* array to hold FITS keyword name */ char keyvalue[128]; /* array to hold FITS keyword value */ char keycomment[128]; /* array to hold FITS keyword comment */ char fitsrecord[128]; /* array to hold one line of FITS header */ char keytype; /* FITS key type (string, float, int, etc) */ maxdim = 2; naxes = (long *) malloc(maxdim*sizeof(long)); DBG qDebug() << "Entering FitsTableSource::init() with filename: " << _filename.toAscii() << endl; // First, try to open the file if(fits_open_file( &_fptr, _filename.toAscii(), READONLY, &status )){ fits_close_file( _fptr, &status ); _fptr = 0L; _valid = false; return false; } _scalars.clear(); _fieldList.clear(); _matrixList.clear(); _strings.clear(); _colName.clear(); _colRepeat.clear(); _colType.clear(); _colOffset.clear(); tableHDU.clear(); tableRow.clear(); // Some standard stuff _fieldList += "INDEX"; _colName += "INDEX"; _colRepeat << 1; _colType << 1; _colOffset << 0; _strings = fileMetas(); _maxFrameCount = 0; /* get total number of HDUs */ if (fits_get_num_hdus(_fptr, &numHDU, &status)){ fits_report_error(stderr,status); _fptr = 0L; _valid = false; return false; } /* can't read number of HDUs, so quit */ nrow = 0; for (i=1; i<= numHDU; i++){ /* loop over all HDUs */ if (fits_movabs_hdu(_fptr, i, &hdutype, &status)){ fits_report_error(stderr,status); status = 0; continue; } /* failed moving to an HDU, so try to skip and go to next one */ /* read header to assign string and scalar values. For now only read USER_KEYs. May want to add UNIT_KEYs eventually, to get the units for every vector */ if(fits_get_hdrspace(_fptr, &nkeys, NULL, &status)){ /* total # of keys */ fits_report_error(stderr,status); status = 0; continue; } for (j=1; j<= nkeys; j++){ /* loop over keys */ if(fits_read_record(_fptr, j, fitsrecord, &status)){ fprintf(stderr,"Failed to read record number %ld\n",j); fits_report_error(stderr,status); status = 0; continue; } /* failed to read a record, so skip and continue */ if (fits_get_keyname(fitsrecord, keyname, &keylength, &status)){ fprintf(stderr,"Failed to read keyword from record = %s\n",fitsrecord); fits_report_error(stderr,status); status = 0; continue; } /* failed to read keyword name, so skip and continue */ if (fits_parse_value(fitsrecord, keyvalue, keycomment, &status)){ fprintf(stderr,"Failed to read value and comment from key = %s\n",keyname); fits_report_error(stderr,status); status = 0; continue; } /* failed to read keyword value or comment, so skip and continue */ if (fits_get_keytype(keyvalue, &keytype, &status)){ fprintf(stderr,"Failed to read type (string, int, float) for key = %s, value = %s\n",keyname,keyvalue); fits_report_error(stderr,status); status = 0; continue; } /* failed to read keytype, so skip and continue */ keyclass = fits_get_keyclass(fitsrecord); if (keyclass == TYP_USER_KEY){ if (keytype == 'C' || keytype == 'L'){ /* string or logical */ _strings[QString(keyname)] = QString(keyvalue); } else if (keytype == 'I' || keytype == 'F'){ /* int or float */ _scalars[QString(keyname)] = atof(keyvalue); } } } /* check if table HDU, and skip if not */ if (hdutype == ASCII_TBL || hdutype == BINARY_TBL){ if(fits_get_num_cols(_fptr, &ncol, &status)){ /* read # of columns */ fprintf(stderr,"Failed to read # of columns in HDU = %ld\n",i); fits_report_error(stderr,status); status = 0; continue; } /* failed to read number of columns, so skip and continue */ if(fits_get_num_rows(_fptr, &nrow, &status)){ /* read # of rows */ fprintf(stderr,"Failed to read # of rows in HDU = %ld\n",i); fits_report_error(stderr,status); status = 0; continue; } /* failed to read number of rows, so skip and continue */ tableRow << nrow; tableHDU << i; } else continue; /* skip non-table HDUs for reading table columns */ for (j=1; j<= ncol; j++){ sprintf(coltemplate,"%ld",j); if(fits_get_colname(_fptr, CASEINSEN, coltemplate, colname, &colnum, &status)){ fprintf(stderr,"Failed to read column name for column = %ld\n",j); fits_report_error(stderr,status); status = 0; continue; } /* failed to read column name, so skip and continue */ if(fits_get_coltype(_fptr, colnum, &typecode,&repeat,&width, &status)){ fprintf(stderr,"Failed to read column type for column = %s\n",colname); fits_report_error(stderr,status); status = 0; continue; } /* failed to read column type, so skip and continue */ if (validField(typecode)){ if (repeat == 1){ /* not an array of values */ idx = _fieldList.indexOf(QString(colname)); if (idx == -1){ /* not present in list already */ _fieldList << QString(colname); _colName << QString(colname); _colRepeat << repeat; _colType << typecode; _colOffset << 0; } _frameCounts[QString(colname)] += nrow; if (_frameCounts[QString(colname)] > _maxFrameCount) _maxFrameCount = _frameCounts[QString(colname)]; } else{ /* is an array of values */ /* TODO: should these be matrices instead (or perhaps as well?) I don't understand how matrices should work with KST */ if(fits_read_tdim(_fptr,colnum,maxdim, &naxis, naxes, &status)){ fprintf(stderr,"Failed to read dimensions of column = %s\n",colname); fits_report_error(stderr,status); status = 0; continue; } for (k=0; k < repeat; k++){ if (naxis == 1) tmp.sprintf("%s_%02ld",colname,k%naxes[0]+1); else if (naxis == 2) tmp.sprintf("%s_%02ld_%02ld",colname,k/naxes[0]+1,k%naxes[0]+1); else /* 3-D arrays not supported right now */ break; idx = _fieldList.indexOf(tmp); if (idx == -1){ /* not present already */ _fieldList << tmp; _colName << QString(colname); _colRepeat << repeat; _colType << typecode; _colOffset << k; } _frameCounts[tmp] += nrow; if (_frameCounts[QString(colname)] > _maxFrameCount) _maxFrameCount = _frameCounts[QString(colname)]; } } } else /* end if(validField) */ fprintf(stderr,"Skipping unsupported type for column = %s\n",colname); } /* end loop over columns */ } /* end loop over HDUs */ /* set all fields to have _maxFrameCount size */ allcols = _frameCounts.keys(); for (i=0; i < allcols.size(); i++) _frameCounts[allcols[i]] = _maxFrameCount; registerChange(); free(naxes); return true; // false if something went wrong } /* Check if the data in the from the source has updated. Considering how FITS files are built up we can consider that they are always fixed */ Kst::Object::UpdateType FitsTableSource::internalDataSourceUpdate() { DBG qDebug() << "Entering FitsTableSource::internalDataSourceUpdate()\n"; return Kst::Object::NoChange; } int FitsTableSource::readScalar(double *v, const QString& field){ DBG qDebug() << "Entering FitsTableSource::readScalar() with field: " << field << endl; *v = _scalars[field]; return 1; } int FitsTableSource::readString(QString *stringValue, const QString& stringName){ DBG qDebug() << "Entering FitsTableSource::readString() with field: " << stringName << endl; *stringValue = _strings[stringName]; return 1; } int FitsTableSource::readField(double *v, const QString& field, int s, int n) { int status = 0; /* cfitsio status flag */ int colnum; /* column number in table */ int anynul; /* Number of null values read by fits_read_col() */ int typecode; /* data type of column in FITS table */ long repeat; /* used to determine if matrix or vector */ void *data; /* empty pointer for reading data */ long nelements; /* size of data to read */ long offset; /* offset for data when repeat > 1 */ long idx; /* used when reading from Pixel Readout and tracking which section of data array is being read by fits_read_col */ long totalidx; /* to keep track of our location in the v array */ long i,j,k; /* loop variables */ long nrow; /* number of rows read for each data chunk */ long maxrow; /* maximum number of rows to read at once. Later re-used to signify the number of rows to read for the current HDU, which may not be tableRow[i], due to the fact that the offset, s, may not be zero. */ long currow; /* current row index (when looping over data chunks */ int hdutype; /* FITS HDU type */ char *colname; /* Name for column */ int firstHDU; /* Flag to control whether we are reading the first HDU containing data for a field. Necessary to keep track of s, the offset from the beginning of data */ QByteArray ba; /* needed to convert a QString to char array */ DBG qDebug() << "Entering FitsTableSource::readField() with params: " << field << ", from " << s << " for " << n << " frames" << endl; /* For INDEX field */ if (field.toLower() == "index") { if (n < 0) { v[0] = double(s); return 1; } for (int i = 0; i < n; ++i) { v[i] = double(s + i); } return n; } idx = _fieldList.indexOf(field); /* get index of field in list */ repeat = _colRepeat[idx]; typecode = _colType[idx]; /* FITS type code for field */ ba = _colName[idx].toLocal8Bit(); /* FITS column name of field */ colname = ba.data(); offset = _colOffset[idx]; /* data offset */ firstHDU = 1; maxrow = 100000/repeat; /* cap on max rows to read at once */ nelements = maxrow * repeat; /* so we read an integer number of 'repeat' at a time */ if (typecode == TINT) data = (int *) malloc(nelements*sizeof(int)); else if (typecode == TLONG || typecode == TINT32BIT) data = (long *) malloc(nelements*sizeof(long)); else if (typecode == TFLOAT) data = (float *) malloc(nelements*sizeof(float)); else if (typecode == TDOUBLE) data = (double *) malloc(nelements*sizeof(double)); else if (typecode == TLOGICAL) data = (bool *) malloc(nelements*sizeof(bool)); totalidx = 0; for (i=0; i < tableHDU.size(); i++){ /* loop over table HDUs */ if (totalidx >= n) /* quit when we have read all data requested */ break; if (fits_movabs_hdu(_fptr, tableHDU[i], &hdutype, &status)){ fits_report_error(stderr,status); status = 0; continue; } /* failed moving to an HDU, so try to skip and go to next one */ if(fits_get_colnum(_fptr, CASEINSEN, colname, &colnum, &status)){ status = 0; /* column not found in this HDU, so skip. */ continue; } if (firstHDU == 1){ maxrow = tableRow[i] - s; firstHDU = 0; currow = s + 1; /* FITS starts counting from row 1 */ } else{ maxrow = tableRow[i]; currow = 1; /* FITS starts counting from row 1 */ } /* figure out how many chunks we need to read the rows in this HDU */ idx = (maxrow*repeat)%nelements; if (idx == 0) /* divides evenly */ idx = (maxrow*repeat)/nelements; else idx = (maxrow*repeat)/nelements + 1; for (j=0; j < idx; j++){ /* loop over row chunks */ if (totalidx >= n) /* quit when we have read all data requested */ break; if (j == (idx - 1)) /* last iteration */ nrow = (maxrow*repeat - j*nelements)/repeat; else nrow = nelements/repeat; /* check to make sure we don't read more data than requested */ if (totalidx + nrow > n) nrow = n - totalidx; if (typecode == TINT){ if (fits_read_col(_fptr, typecode, colnum, currow, 1, nrow*repeat, NULL, &(((int *)data)[0]), &anynul, &status)){ fprintf(stderr,"Failed to read column = %s, filling with NaNs\n",colname); fits_report_error(stderr,status); status = 0; for (k=0; k < nrow; k++) v[totalidx+k] = sqrt(-1); } else { for (k=0; k < nrow; k++){ v[totalidx+k] = (double) ((int *)data)[k*repeat+offset]; } } } else if (typecode == TLONG || typecode == TINT32BIT){ if (fits_read_col(_fptr, typecode, colnum, currow, 1, nrow*repeat, NULL, &(((long *)data)[0]), &anynul, &status)){ fprintf(stderr,"Failed to read column = %s, filling with NaNs\n",colname); fits_report_error(stderr,status); status = 0; for (k=0; k < nrow; k++) v[totalidx+k] = sqrt(-1); } else { for (k=0; k < nrow; k++){ v[totalidx+k] = (double) ((long *)data)[k*repeat+offset]; } } }else if (typecode == TFLOAT){ if (fits_read_col(_fptr, typecode, colnum, currow, 1, nrow*repeat, NULL, &(((float *)data)[0]), &anynul, &status)){ fprintf(stderr,"Failed to read column = %s, filling with NaNs\n",colname); fits_report_error(stderr,status); status = 0; for (k=0; k < nrow; k++) v[totalidx+k] = sqrt(-1); } else { for (k=0; k < nrow; k++) v[totalidx+k] = (double) ((float *)data)[k*repeat+offset]; } }else if (typecode == TDOUBLE){ if (fits_read_col(_fptr, typecode, colnum, currow, 1, nrow*repeat, NULL, &(((double *)data)[0]), &anynul, &status)){ fprintf(stderr,"Failed to read column = %s, filling with NaNs\n",colname); fits_report_error(stderr,status); status = 0; for (k=0; k < nrow; k++) v[totalidx+k] = sqrt(-1); } else { for (k=0; k < nrow; k++) v[totalidx+k] = (double) ((double *)data)[k*repeat+offset]; } }else if (typecode == TLOGICAL){ if (fits_read_col(_fptr, typecode, colnum, currow, 1, nrow*repeat, NULL, &(((bool *)data)[0]), &anynul, &status)){ fprintf(stderr,"Failed to read column = %s, filling with NaNs\n",colname); fits_report_error(stderr,status); status = 0; for (k=0; k < nrow; k++) v[totalidx+k] = sqrt(-1); } else { for (k=0; k < nrow; k++) v[totalidx+k] = (double) ((bool *)data)[k*repeat+offset]; } } totalidx += nrow; currow += nrow; } /* end loop over row chunks */ } /* end loop over HDUs */ for (i=totalidx; i< n; i++) /* fill remainder with NaNs */ v[i] = sqrt(-1); free(data); return n; } int FitsTableSource::readMatrix(double *v, const QString& field){ int status = 0; /* cfitsio status flag */ int colnum; /* column number in table */ int anynul; /* Number of null values read by fits_read_col() */ int typecode; /* data type of column in FITS table */ long width; /* width code from fits_get_coltype(). not used */ long repeat; /* used to determine if matrix or vector */ long n; /* total size */ long nrow; /* number of rows */ void *data; /* empty pointer for reading data */ /* TODO: The code in this function is probably all wrong. Since fitstable does not currently implement matrices, this function never gets called */ DBG qDebug() << "Entering FitsTableSource::readMatrix() with field: " << field << endl; if (fits_get_colnum(_fptr, CASEINSEN, field.toAscii().data(), &colnum, &status)) fits_report_error(stderr,status); if (fits_get_coltype(_fptr, colnum, &typecode, &repeat, &width, &status)) fits_report_error(stderr,status); if (fits_get_num_rows(_fptr, &nrow, &status)) fits_report_error(stderr,status); n = repeat*nrow; if (typecode == TLONG || typecode == TINT32BIT) data = (int *) malloc(n*sizeof(int)); else if (typecode == TFLOAT) data = (float *) malloc(n*sizeof(float)); else if (typecode == TDOUBLE) data = (double *) malloc(n*sizeof(double)); else if (typecode == TLOGICAL) data = (bool *) malloc(n*sizeof(bool)); if (fits_read_col(_fptr, typecode, colnum, 1, 1, n, NULL, data, &anynul, &status)) fits_report_error(stderr,status); for (int i=0; i < n; i++){ if (typecode == TLONG || typecode == TINT32BIT) v[i] = (double) ((int *)data)[i]; else if (typecode == TFLOAT) v[i] = (double) ((float *)data)[i]; else if (typecode == TDOUBLE) v[i] = (double) ((double *)data)[i]; else if (typecode == TLOGICAL) v[i] = (double) ((bool *)data)[i]; } free(data); return n; } int FitsTableSource::frameCount(const QString& field) const { DBG qDebug() << "Entering FitsTableSource::frameCount() with field: " << field << endl; if (field.isEmpty() || field.toLower() == "index") { return _maxFrameCount; } else { return _frameCounts[field]; } } QString FitsTableSource::fileType() const { return "FITS Table Datasource"; } void FitsTableSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } int FitsTableSource::samplesPerFrame(const QString& field) { return 1; } // Name used to identify the plugin. Used when loading the plugin. QString FitsTableSourcePlugin::pluginName() const { return "FITS Table Datasource Reader"; } QString FitsTableSourcePlugin::pluginDescription() const { return "FITS Table Datasource Reader"; } /********************** FitsTablesourcePlugin - This class defines the plugin interface to the DataSource defined by the plugin. The primary requirements of this class are to provide the necessary connections to create the object which includes providing access to the configuration widget. ***********************/ Kst::DataSource *FitsTableSourcePlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new FitsTableSource(store, cfg, filename, type, element); } // Provides the matrix list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of matrices. QStringList FitsTableSourcePlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { DBG qDebug() << "Entering FitsTableSourcePlugin::matrixList()\n"; if (typeSuggestion) { *typeSuggestion = "FITS Table Datasource"; } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } QStringList matrixList; return matrixList; } /* Provides the scalar list that this dataSource can provide from the provided filename. This function should use understands to validate the file and then open and calculate the list of scalars if necessary. */ QStringList FitsTableSourcePlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; DBG qDebug() << "Entering FitsTableSourcePlugin::scalarList()\n"; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "FITS Table Datasource"; } scalarList.append("FRAMES"); return scalarList; } /* Provides the string list that this dataSource can provide from the provided filename. This function should use understands to validate the file and then open and calculate the list of strings if necessary. */ QStringList FitsTableSourcePlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; DBG qDebug() << "Entering FitsTableSourcePlugin::stringList()\n"; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "FITS Table Datasource"; } stringList.append("FILENAME"); return stringList; } /* Provides the field list that this dataSource can provide from the provided filename. This function should use understands to validate the file and then open and calculate the list of fields if necessary. */ QStringList FitsTableSourcePlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg) Q_UNUSED(filename) Q_UNUSED(type) DBG qDebug() << "Entering FitsTableSourcePlugin::fieldList()\n"; if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = "FITS Table Datasource"; } QStringList fieldList; return fieldList; } /* The main function used to determine if this plugin knows how to process the provided file. Each datasource plugin should check the file and return a number between 0 and 100 based on the likelyhood of the file being this type. 100 should only be returned if there is no way that the file could be any datasource other than this one. */ int FitsTableSourcePlugin::understands(QSettings *cfg, const QString& filename) const { /* This function will attempt to open the file as a FITS file, then loop through the HDUs to see if any are binary or ascii tables. If so, and if any table has > 0 rows, then this is a FITS table that can be read by this plugin. A value of 80 is returned, otherwise zero */ Q_UNUSED(cfg) fitsfile *ff; int status = 0; /* FITS error status */ int i; /* loop variable */ int ret_val = 0; int numHDU; /* total number of HDUs in FITS file */ int hdutype; /* FITS HDU type */ long nrow; /* number of rows in table */ DBG qDebug() << "Entering FitsTableSourcePlugin::understands()\n"; if(fits_open_file(&ff, filename.toAscii(), READONLY, &status)){ fits_close_file(ff,&status); return 0; } if (fits_get_num_hdus(ff, &numHDU, &status)){ fits_close_file(ff,&status); return 0; } for(i=1; i<= numHDU; i++){ if (fits_movabs_hdu(ff, i, &hdutype, &status)){ fits_report_error(stderr,status); status = 0; continue; } if (hdutype == ASCII_TBL || hdutype == BINARY_TBL){ if(fits_get_num_rows(ff, &nrow, &status)){ fits_report_error(stderr,status); status = 0; continue; } if (nrow > 0){ ret_val = 80; break; } } } status = 0; fits_close_file(ff,&status); return ret_val; } bool FitsTableSourcePlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return false; } QStringList FitsTableSourcePlugin::provides() const { QStringList rc; rc += "FITS Table Datasource"; return rc; } // Request for this plugins configuration widget. Kst::DataSourceConfigWidget *FitsTableSourcePlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_fitstable, FitsTableSourcePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/dirfilesource/0000755000175000017500000000000012362705136017326 5ustar synthsynthKst-2.0.8/src/datasources/dirfilesource/kstdata_dirfilesource.desktop0000644000175000017500000000271212362705136025275 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=dirfilesource X-Kst-Plugin-Author=The University of Toronto Name=DirFile Reader Name[ca]=Lector de DirFile Name[ca@valencia]=Lector de DirFile Name[de]=DirFile-Leser Name[es]=Lector DirFile Name[fr]=Lecteur DirFile Name[it]=Lettore file .dir Name[nb]=DirFile-leser Name[nl]=DirFile Reader Name[pl]=Czytnik DirFile Name[pt]=Leitor do 'DirFile' Name[pt_BR]=Leitor do DirFile Name[sk]=Čítač DirFile Name[sv]=DirFile-läsare Name[uk]=Засіб читання DirFile Name[x-test]=xxDirFile Readerxx Comment=Plugin to read the dirfile format. Comment[ca]=Connector per llegir el format DirFile. Comment[ca@valencia]=Connector per llegir el format DirFile. Comment[de]=Modul zum Lesen des DirFile-Formats Comment[es]=Complemento para leer el formato dirfile. Comment[fr]=Module pour lire le format dirfile. Comment[it]=Estensione per leggere il formato file .dir. Comment[nb]=Programtillegg som leser dirfile-formatet. Comment[nl]=Plugin voor het lezen van het dirfile-formaat. Comment[pl]=Wtyczka do odczytywania formatu dirfile. Comment[pt]=Um 'plugin' para ler o formato 'dirfile'. Comment[pt_BR]=Plugin para ler o formato dirfile. Comment[sk]=Plugin na čítanie formátu dirfile. Comment[sv]=Insticksprogram för att läsa DirFile-formatet. Comment[uk]=Додаток для читання даних у форматі dirfile. Comment[x-test]=xxPlugin to read the dirfile format.xx Kst-2.0.8/src/datasources/dirfilesource/dirfilesource.cpp0000644000175000017500000003776112320547027022704 0ustar synthsynth/*************************************************************************** dirfile.cpp - data source for dirfiles ------------------- begin : Tue Oct 21 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dirfilesource.h" #include #include #include using namespace Kst; static const QString dirfileTypeString = "Directory of Binary Files"; class DirFileSource::Config { public: Config() { } void read(QSettings *cfg, const QString& fileName = QString()) { Q_UNUSED(fileName); cfg->beginGroup(dirfileTypeString); cfg->endGroup(); } void save(QXmlStreamWriter& s) { Q_UNUSED(s); } void load(const QDomElement& e) { Q_UNUSED(e); } }; // // Scalar Interface // class DataInterfaceDirFileScalar : public DataSource::DataInterface { public: DataInterfaceDirFileScalar(DirFileSource& d) : dir(d) {} // read one element int read(const QString&, DataScalar::ReadInfo&); // named elements QStringList list() const { return dir._scalarList; } bool isListComplete() const { return true; } bool isValid(const QString& field) const { return dir._scalarList.contains( field ); } // T specific: not used for scalars const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); } void setDataInfo(const QString&, const DataScalar::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } DirFileSource& dir; }; int DataInterfaceDirFileScalar::read(const QString& field, DataScalar::ReadInfo& p) { return dir.readScalar(*p.value, field); } // // String Interface // class DataInterfaceDirFileString : public DataSource::DataInterface { public: DataInterfaceDirFileString(DirFileSource& d) : dir(d) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return dir._stringList; } bool isListComplete() const { return true; } bool isValid(const QString& field) const { return dir._stringList.contains( field ); } // T specific: not used for Strings const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } DirFileSource& dir; }; int DataInterfaceDirFileString::read(const QString& field, DataString::ReadInfo& p) { return dir.readString(*p.value, field); } // // Vector interface // class DataInterfaceDirFileVector : public DataSource::DataInterface { public: DataInterfaceDirFileVector(DirFileSource& d) : dir(d) {} // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return dir._fieldList; } bool isListComplete() const { return true; } bool isValid(const QString& field) const { return dir._fieldList.contains( field ); } // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&); DirFileSource& dir; }; const DataVector::DataInfo DataInterfaceDirFileVector::dataInfo(const QString &field) const { if (!dir._fieldList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(dir._frameCount, dir.samplesPerFrame(field)); } int DataInterfaceDirFileVector::read(const QString& field, DataVector::ReadInfo& p) { return dir.readField(p.data, field, p.startingFrame, p.numberOfFrames); } QMap DataInterfaceDirFileVector::metaScalars(const QString& field) { QStringList keys = dir.fieldScalars(field); QList values; int scalars = dir.readFieldScalars(values, field, true); QMap m; for (int i = 0; i < scalars; i++) { if (values.size() > i && keys.size() > i) m[keys.at(i)] = values.at(i); } return m; } QMap DataInterfaceDirFileVector::metaStrings(const QString& field) { QStringList keys = dir.fieldStrings(field); QStringList values; int strings = dir.readFieldStrings(values, field, true); QMap m; for (int i = 0; i < strings; i++) { if (values.size() > i && keys.size() > i) m[keys.at(i)] = values.at(i); } return m; } // // DirFileSource // DirFileSource::DirFileSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _config(0L), iv(new DataInterfaceDirFileVector(*this)), ix(new DataInterfaceDirFileScalar(*this)), is(new DataInterfaceDirFileString(*this)), _resetNeeded(false) { setInterface(iv); setInterface(ix); setInterface(is); setUpdateType(None); _valid = false; if (!type.isEmpty() && type != dirfileTypeString) { return; } _config = new DirFileSource::Config; _config->read(cfg, _filename); if (!e.isNull()) { _config->load(e); } _valid = true; _directoryName = DirFilePlugin::getDirectory(_filename); init(); registerChange(); } DirFileSource::~DirFileSource() { delete _config; _config = 0L; delete _dirfile; _dirfile = 0L; } void DirFileSource::reset() { resetFileWatcher(); if (_dirfile) { delete _dirfile; } init(); Object::reset(); } bool DirFileSource::init() { _fieldList.clear(); _scalarList.clear(); _stringList.clear(); _frameCount = 0; _dirfile = new Dirfile(_directoryName.toLatin1(), GD_RDONLY); if (_dirfile->Error() == GD_E_OK) { const char **vl = _dirfile->VectorList(); for (int i = 0; vl[i]!=NULL; i++) { _fieldList.append(QString::fromUtf8(vl[i])); } _scalarList.append("FRAMES"); const char **xl = _dirfile->FieldListByType(ConstEntryType); for (int i = 0; xl[i]!=NULL; i++) { _scalarList.append(QString::fromUtf8(xl[i])); } _stringList.append("FILE"); const char **tl = _dirfile->FieldListByType(StringEntryType); for (int i = 0; tl[i]!=NULL; i++) { _stringList.append(QString::fromUtf8(tl[i])); } _writable = true; _frameCount = _dirfile->NFrames(); } if (_fieldList.count() > 1) { QString filePath = _dirfile->ReferenceFilename(); } setUpdateType(Timer); registerChange(); return true; } Kst::Object::UpdateType DirFileSource::internalDataSourceUpdate() { int newNF = _dirfile->NFrames(); bool isnew = newNF != _frameCount; _resetNeeded |= (_frameCount>newNF); _frameCount = newNF; if (_resetNeeded && newNF>0) { _resetNeeded = false; reset(); } return (isnew ? Updated : NoChange); } int DirFileSource::readField(double *v, const QString& field, int s, int n) { if (n < 0) { return _dirfile->GetData(field.toUtf8().constData(), s, 0, /* 1st sframe, 1st samp */ 0, 1, /* num sframes, num samps */ Float64, (void*)v); } else { return _dirfile->GetData(field.toUtf8().constData(), s, 0, /* 1st sframe, 1st samp */ n, 0, /* num sframes, num samps */ Float64, (void*)v); } } // int DirFileSource::writeField(const double *v, const QString& field, int s, int n) { // int err = 0; // // return PutData(_directoryName.toLatin1(), field.left(FIELD_LENGTH).toLatin1(), // s, 0, /* 1st sframe, 1st samp */ // n, 0, /* num sframes, num samps */ // 'd', (void*)v, // &err); // } int DirFileSource::samplesPerFrame(const QString &field) { return int(_dirfile->SamplesPerFrame(field.toUtf8().constData())); } int DirFileSource::frameCount(const QString& field) const { Q_UNUSED(field) return _frameCount; } bool DirFileSource::isEmpty() const { return _frameCount < 1; } QString DirFileSource::fileType() const { return dirfileTypeString; } void DirFileSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } int DirFileSource::readScalar(double &S, const QString& scalar) { if (scalar == "FRAMES") { S = _frameCount; return 1; } else { _dirfile->GetConstant(scalar.toUtf8().constData(), Float64, (void *)&S); if (_dirfile->Error() == GD_E_OK) { return 1; } } return 0; } int DirFileSource::readString(QString &S, const QString& string) { if (string == "FILE") { S = _filename; return 1; } else { char tmpstr[4097]; _dirfile->GetString(string.toUtf8().constData(), 4097, tmpstr); if (_dirfile->Error() == GD_E_OK) { S = QString::fromUtf8(tmpstr); return 1; } } return 0; } //QStringList fieldScalars(const QString& field); QStringList DirFileSource::fieldScalars(const QString& field) { const char **mflist = _dirfile->MFieldListByType(field.toAscii(), ConstEntryType); if (!mflist) { return QStringList(); } QStringList scalars; for (int i=0; mflist[i]; i++) { scalars.append(mflist[i]); } return scalars; } int DirFileSource::readFieldScalars(QList &v, const QString& field, bool init) { int nc=0; if (init) { // only update if we need to initialize. Otherwise preserve old values. v.clear(); nc = _dirfile->NMFieldsByType(field.toAscii(),ConstEntryType); double *vin = (double *)_dirfile->MConstants(field.toAscii(), Float64); for (int i=0; iMFieldListByType(field.toAscii(), StringEntryType); if (!mflist) { return QStringList(); } QStringList strings; for (int i=0; mflist[i]; i++) { strings.append(mflist[i]); } return strings; } int DirFileSource::readFieldStrings(QStringList &v, const QString& field, bool init) { int nc=0; if (init) { // only update if we need to initialize. Otherwise preserve old values. v.clear(); nc = _dirfile->NMFieldsByType(field.toAscii(),StringEntryType); char **str_in = (char **)_dirfile->MStrings(field.toAscii()); for (int i=0; i #include #include using namespace GetData; class QFileSystemWatcher; class DataInterfaceDirFileVector; class DataInterfaceDirFileScalar; class DataInterfaceDirFileString; class DirFileSource : public Kst::DataSource { Q_OBJECT public: DirFileSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~DirFileSource(); bool init(); virtual UpdateType internalDataSourceUpdate(); int readField(double *v, const QString &field, int s, int n); // int writeField(const double *v, const QString &field, int s, int n); int samplesPerFrame(const QString &field); int frameCount(const QString& field = QString()) const; QString fileType() const; void save(QXmlStreamWriter &streamWriter); bool isEmpty() const; virtual void reset(); class Config; int readScalar(double &S, const QString& scalar); int readString(QString &S, const QString& string); virtual QStringList fieldScalars(const QString& field); virtual int readFieldScalars(QList &v, const QString& field, bool init); virtual QStringList fieldStrings(const QString& field); virtual int readFieldStrings(QStringList &v, const QString& field, bool init); virtual const QString& typeString() const; //static const QString staticTypeString; //static const QString staticTypeTag; private: QString _directoryName; Dirfile *_dirfile; QStringList _scalarList; QStringList _stringList; QStringList _fieldList; int _frameCount; mutable Config *_config; DataInterfaceDirFileVector* iv; DataInterfaceDirFileScalar* ix; DataInterfaceDirFileString* is; friend class DataInterfaceDirFileVector; friend class DataInterfaceDirFileScalar; friend class DataInterfaceDirFileString; bool _resetNeeded; }; class DirFilePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~DirFilePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; static QString getDirectory(QString filepath); virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/dirfilesource/dirfilesource.pro0000644000175000017500000000054312277111530022703 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_dirfilesource) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/dirfilesource/tmp LIBS += -lgetdata++ win32:LIBS += -lgetdata macx:LIBS += -lgetdata -lz -lbz2 SOURCES += \ dirfilesource.cpp HEADERS += \ dirfilesource.h Kst-2.0.8/src/datasources/CMakeLists.txt0000644000175000017500000000225312362701575017234 0ustar synthsynth kst_init_plugin(src/datasources datasource) if(MSVC OR MINGW) add_definitions(-DKST_USE_KST_ATOF) endif() if(UNIX) # speedup on Linux x2.7 add_definitions(-DKST_USE_KST_ATOF) endif() kst_add_plugin(. ascii) kst_add_plugin(. qimagesource) kst_add_plugin(. sampledatasource) kst_add_plugin(. sourcelist) if(getdata) include_directories(${GETDATA_INCLUDE_DIR}) kst_add_plugin(. dirfilesource) kst_link(${GETDATA_LIBRARIES}) endif() if(cfitsio) include_directories(${CFITSIO_INCLUDE_DIR}) kst_add_plugin(. fitsimage) #kst_add_plugin(. fitstable) #kst_add_plugin(. healpix) kst_link(${CFITSIO_LIBRARIES}) endif() #if(healpix) # kst_add_plugin(. healpix) #endif() #if(lfioo) # kst_add_plugin(. lfiio) #endif() if(netcdf) include_directories(${NETCDF_INCLUDE_DIR}) kst_add_plugin(. netcdf) kst_link(${NETCDF_LIBRARIES}) endif() #if(planckIDEF) # kst_add_plugin(. planckIDEF) #endif() #if(dmc) # include_directories(${DMC_INCLUDE_DIR}) # kst_add_plugin(. dmc) # #kst_link(${DMC_LIBRARIES}) #endif() if(matio) include_directories(${MATIO_INCLUDE_DIR}) kst_add_plugin(. matlab) # Directory named after the file format, not the lib kst_link(${MATIO_LIBRARIES}) endif() Kst-2.0.8/src/datasources/sampledatasource/0000755000175000017500000000000012362705136020023 5ustar synthsynthKst-2.0.8/src/datasources/sampledatasource/sampledatasource.h0000644000175000017500000000704512277111530023530 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SAMPLEDATASOURCE_H #define SAMPLEDATASOURCE_H #include #include class SampleDatasourceSource : public Kst::DataSource { Q_OBJECT public: SampleDatasourceSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~SampleDatasourceSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); QString fileType() const; void save(QXmlStreamWriter &streamWriter); class Config; private: mutable Config *_config; }; class SampleDatasourcePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~SampleDatasourcePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/sampledatasource/sampledatasource.cpp0000644000175000017500000002112412320547027024060 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "sampledatasource.h" #include #include #include /********************** SampleDatasourceSource::Config - This class defines the config widget that will be added to the Dialog Config Button for configuring the plugin. This is only needed for special handling required by the plugin. Many plugins will not require configuration. See plugins/sampleplugin for additional details. ***********************/ class SampleDatasourceSource::Config { public: Config() { } void read(QSettings *cfg, const QString& fileName = QString()) { Q_UNUSED(fileName); cfg->beginGroup("Sample Datasource"); cfg->endGroup(); } void save(QXmlStreamWriter& s) { Q_UNUSED(s); } void load(const QDomElement& e) { Q_UNUSED(e); } }; /********************** SampleDatasourceSource - This class defines the main DataSource which derives from DataSource. The key functions that this class must provide is the ability to create the source, provide details about the source be able to process the data. ***********************/ SampleDatasourceSource::SampleDatasourceSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _config(0L) { startUpdating(None); _valid = false; if (!type.isEmpty() && type != "Sample Datasource") { return; } _config = new SampleDatasourceSource::Config; _config->read(cfg, filename); if (!e.isNull()) { _config->load(e); } if (init()) { _valid = true; } registerChange(); } SampleDatasourceSource::~SampleDatasourceSource() { } void SampleDatasourceSource::reset() { init(); Object::reset(); } // If the datasource has any predefined fields they should be populated here. bool SampleDatasourceSource::init() { registerChange(); return true; // false if something went wrong } // Check if the data in the from the source has updated. Typically done by checking the frame count of the datasource for // changes. Kst::Object::UpdateType SampleDatasourceSource::internalDataSourceUpdate() { return Kst::Object::NoChange; } // TODO a DataSource::DataInterface implementation as example QString SampleDatasourceSource::fileType() const { return "Sample Datasource"; } void SampleDatasourceSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } // Name used to identify the plugin. Used when loading the plugin. QString SampleDatasourcePlugin::pluginName() const { return tr("Sample Datasource Reader"); } QString SampleDatasourcePlugin::pluginDescription() const { return tr("Sample Datasource Reader"); } /********************** SampleDatasourcePlugin - This class defines the plugin interface to the DataSource defined by the plugin. The primary requirements of this class are to provide the necessary connections to create the object which includes providing access to the configuration widget. ***********************/ Kst::DataSource *SampleDatasourcePlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new SampleDatasourceSource(store, cfg, filename, type, element); } // Provides the matrix list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of matrices. QStringList SampleDatasourcePlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if (typeSuggestion) { *typeSuggestion = "Sample Datasource"; } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } QStringList matrixList; return matrixList; } // Provides the scalar list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of scalars if necessary. QStringList SampleDatasourcePlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Sample Datasource"; } scalarList.append("FRAMES"); return scalarList; } // Provides the string list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of strings if necessary. QStringList SampleDatasourcePlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Sample Datasource"; } stringList.append("FILENAME"); return stringList; } // Provides the field list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of fields if necessary. QStringList SampleDatasourcePlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg) Q_UNUSED(filename) Q_UNUSED(type) if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = "Sample Datasource"; } QStringList fieldList; return fieldList; } // The main function used to determine if this plugin knows how to process the provided file. // Each datasource plugin should check the file and return a number between 0 and 100 based // on the likelyhood of the file being this type. 100 should only be returned if there is no way // that the file could be any datasource other than this one. int SampleDatasourcePlugin::understands(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0; } bool SampleDatasourcePlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return true; } QStringList SampleDatasourcePlugin::provides() const { QStringList rc; rc += "Sample Datasource"; return rc; } // Request for this plugins configuration widget. Kst::DataSourceConfigWidget *SampleDatasourcePlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_sampledatasource, SampleDatasourcePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/sampledatasource/kstdata_sampledatasource.desktop0000644000175000017500000000314212362705136026465 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=sampledatasource X-Kst-Plugin-Author=The University of Toronto Name=File Reader Template Name[ca]=Plantilla de lector de fitxer Name[ca@valencia]=Plantilla de lector de fitxer Name[de]=Vorlage für Dateileser Name[fr]=Modèle de lecteur de fichier Name[it]=Modello lettore di file Name[nb]=Filleser-mal Name[nl]=File Reader Template Name[pl]=Szablon czytnika plików Name[pt]=Modelo de Leitor de Ficheiros Name[pt_BR]=Modelo de leitor de arquivos Name[sk]=Šablóna čítača súborov Name[sv]=Mall för filläsare Name[uk]=Шаблон засобу для читання файлів Name[x-test]=xxFile Reader Templatexx Comment=Code template for a file reader plugin. Comment[ca]=Plantilla de codi per un connector de lector de fitxer. Comment[ca@valencia]=Plantilla de codi per un connector de lector de fitxer. Comment[de]=Quelltext-Vorlage für Dateileser-Module Comment[fr]=Modèle de code pour un module de lecture de fichiers. Comment[it]=Modello codice per un'estensione del lettore file. Comment[nb]=Kodemal for et tillegg som leser filer. Comment[nl]=Sjabloon voor code voor een plugin voor het lezen van bestanden. Comment[pl]=Szablon kodu dla wtyczki czytnika plików. Comment[pt]=Um modelo de código para um 'plugin' de leitura de ficheiros. Comment[pt_BR]=Modelo de código para um plugin de leitura de arquivos. Comment[sv]=Kodmall för ett insticksprogram för filläsning. Comment[uk]=Шаблон коду додатка для читання файлів. Comment[x-test]=xxCode template for a file reader plugin.xx Kst-2.0.8/src/datasources/sampledatasource/sampledatasource.pro0000644000175000017500000000044012277111530024071 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_sampledatasource) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/sampledatasource/tmp SOURCES += \ sampledatasource.cpp HEADERS += \ sampledatasource.h Kst-2.0.8/src/datasources/matlab/0000755000175000017500000000000012362705136015727 5ustar synthsynthKst-2.0.8/src/datasources/matlab/matfile_format.pdf0000644000175000017500000224307612277111530021423 0ustar synthsynth%PDF-1.5 % 1213 0 obj <> endobj 1223 0 obj <>/Filter/FlateDecode/ID[<258A2F88EC4AD672B41A7D43FE901E42>]/Index[1213 22]/Info 1212 0 R/Length 63/Prev 606843/Root 1214 0 R/Size 1235/Type/XRef/W[1 2 1]>>stream hbbd``b`>$+C`L@ HGČaWmY|@&` endstream endobj startxref 0 %%EOF 1234 0 obj <>stream hb```f``   [ g\5u/ge8]_q˃X,%˴CK z:ǯ鲉2l[``s]+ګVX^|EyX8g@} #o瞼q0Pb5eu'XBx W! 3h,L?y'`9Pj@B88::Ȅą`A,'`]YQ2YQ LR84 Y8=t^0@Yvno"mT0#ǾrWXfd``_ W3pʼni6f jD0pu@>y! endstream endobj 1214 0 obj <> endobj 1215 0 obj <> endobj 1216 0 obj <>stream h̕[o: pQwP I&CoXzEDI9v`+]_H;Ks񺞷C M$E}q&4L8LDb]Y(-I ɑB}g NOQ+-6k+($L#ѤИEPMlײj6ob<npd{vI^7XT?ഛ[6Mʣp:﹄ecک>id9lXd4Iwp ](,/DZ ,U %ٺn?ڑ]3!":Cm7Au08 29!q'eq>Ӗ6k$R.CQrt,RhJk|\L|_ҼWUj0k"4Qf4VҡKfyս,388|4)3e.~8#̾rsC  P{ kJrgl86#W 9+^ `?K?|E?;N[?fk4oEzэE՞>CG?}Y@{aX=a b*g, kjKU-l>yx\e01|FgpS 簄/ba^zbUBa>44RI O^)f.YFb,[ kG[(ul+ͶW:*F#hBϭRhl+Zi":2#]3{{'"f-. <J6ذ)ps4_QqlxGxEf d=4:ei ӰGwtmS5h,#fLnyk6vhylmB` endstream endobj 1217 0 obj <>stream h|J1 yd]tDуڛxX]vqXh:64(xxw1 :)$rqpx0^ƙ>*z*cXpx]}Óؤ4So7[\o'rݠ+ҤJ30?'B$n[pT(ڀbۋg3?k 3ξcXmt1aJ(Aˮ%+HF endstream endobj 1218 0 obj <>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 1219 0 obj <>stream htW TҞqPuF NƮ"@@@@@=Hyq nj7qۋhT5ƿzHr̟3ӷꫪ{2N2\΍ ?6T_4/'+E jbO G&[f˛L|WX vzZI.߰?gǹiz!^>t_!)9SSfHɝfe%<}xj^jn!v'sS2H175Eϙ*3C13'-7iZFr~BjŒ,ZUO29]2+L%,k)d!uEXe2!")e>ed5_ZyN>XaؠxceQlqqgL e7] 'QŖ 0 Q - A b:ʷB4h<5n10c`@Hq4m症+'AUY(o9llc,ST-o1BDh `ė͒# z@nGq?jqͬjHuv|tZd{+֮];TQАcgcy42܍{Zp~wz7j[Y @StS3C$w "B<gx1˕xĔ`M_ 0U=oXN`,b`=$L 46*Ǚ1G7 K黷!L!Lܕn8~Vh>M !jt )]w!\\spyE(ጱGOLg v(׌<8d];WDAcJ9Br ۙqɦm c#!B!.h,eL0V8k?rψe|7qqR?v׎w,kcN|DC͡zs,Ǟh?~L[P9$;4QC ]yhېt˕}4 cvuR"`$%\!!Ҙ{'_\s3ք:ݱӢ8` ǚWo#,/L'F+ddPP}ڄL{ y\6.Z]B؋ؔ]$Ը[!n^|b oSᷥ @mX,2b' IBƒkXfaW ă : xjKE i@ߖ#įg}"(9 `  h} kSơX ɍV}yUxRdQ3-s >xy81fa6 i ^QYh,5 f1V"!yɡJӡU&PQay1  OM@3!+.EOĪ[Z#N4ΔT"I 5PKdAqDPf1=?@)]-K .مy X vBjSt7T0 _6JtqZ?s,@Ϊqꔒ`ɨXh8"ӎuXk0Xʚ)*ؖ ŬjGg]qFk ҅CGjbdž=ݙI|fe/_Ӏʻon&cmԦ#C+-ާSXGHI$nBoZ,=|EdM THRrb=QuEhi5?]oi>/\388?#s_+ VbP 5,7I[I,HSXpIm@ K$DJbX Gգօ%.Roh_=5ސ87ƫ `ǣ'+lE:BE'\d8ہuBP_.\6@>\SݜV ~ uO]&N(HHD\ԚjJ?W# O\oNK*ORҫE/L=Q Wۛ뒢_24#v4}-gQy}3IHT<x!Y@.d7=Q[w43v#oh635qqMuYnwFQμOJUAX&Pb42텨'gOoul[ŢO*u0D.7wU60#*A^1S Bu@1%z{Pb9{')OEn;NYpx|cBrXq+W %+Rv#OZ*0CZsׄ܈B?慄5˒g-Tۍ۱b4P zMX,h,݈ME/,JSr+p . 뭻~n2'<} endstream endobj 1220 0 obj <>stream hTP]Ha~?lr,,eIT?,ȋ淹%AP]mBTA?AEFEP҅a좋"΄U9/ (-[VF`v=+%n9JGזӿe Yڊ3G6GcF7!|JQS_JV4uw0ЏŎ`ԈE@BU n\qHJ0\4H~$`n hE{@w8m@w2HjXd(l9+gkX5nByVlb/jӉMcIaJ)'6jT}+x6b-Ш:(B7@QsT`6 Sg*+[OlF8UPce?_7>u}|R0AC8SxaKo;ȝbn ֐FCNL_NIZTekKJ8s>stream hLP{L[U?bb{pDGt-?t 3-ʅBKY1!8]Ā<;QcdXTt# (rcSNI<|9ׇQaʲ'*v'Z1?f`,f"Bo fk:2`<9v_7۔C\o#%vu{]I tw mcHE$mQ80Dm&vҤҡJx!9H]"F"z=(BqTj1TP2 #@U E4ħ|  E8 r1 fF#!+ ^ZYc;K&Xrk?55"oMHOskFZpZoQ56 >HBIH/H/Ѣ !:`:+HdiC`?\et9Ά}$5#D97ThP\DH /׫/.5yKS7إlx]4zjsDe>R펱g7vnn'Ëp`Ru#*^1IJ6Cguecf_5aa5YyfW?Y?o,O%+GEt(>ٕ|.qZމU)ю%5pG=ngʮ-1Nvt>LiRA]FxQ&o{7o~訍C߭,XmWPc=z~F5wuUߣ!fXOmY͈=?ee$787t!2]a-}Vn@97"N>Y2 ;}w>stream Adobed     "")""""""),))))),222222;;;;;;;;;;;;;;; %%2%##%2;2.,,.2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?$I$)$IK$2JRI$I"$I)I$JRI$I $I)I$JRI$I$$HI$JY$RI$I%,t)I$JRI$I $HdI%)$IK$I)I$JRI$:I)dIJI$R'LI$&NJY$R'I%,t!JM*DVL!RR H $1ǂ =J[/B*RvhILRNJT΅9G3GܞgB$L:@JJSGs[wÅƳبDx(I$L⒘<$NQIK$2Jd@* mL$2n#栦3I,S)&I #AMTHR'Lk>*(V!%,uo4)3Y(JPS#> dx$zVYM)) ςg4RY))*V@T!p$5k-N(i^䔂BhILa%(JS<% )P BJc B% )I$)$IJI$R'LI$$HI$JRI$I$$H)I$JRI$I$$HI$JRI$I$RI$$$I)I$JRI$I$&N*Y$RI$IIK$I)I$JRI$:I)dIJL$IIK$I)II:v)\I Lt>)v|R$hTRDOp{%%1w@II?%2tJJPJ$T2E$Tj)ӑ:94FD꒖I$R) RJ`tg<&q3Lv&!E%)2tR`);P J`t)JOդx$)Rk>)IOa-%#L锽7$3Y* aa3%1I H] RR`OJJO)WxIKpyOI ?S0eIڴ RS+[GtoR@(?pBFgv"!%,tR'I,I N*uI$I$RI$I%,t)I$JRI$I$$I)I$ RI$I$$I)I$JRI$I$&NJY$AJI$R'LI$$HI$JRI$I$N%)$IJL$I$I$$I)I$JY$RI$IK$I)@J0ܟ ܟS!JPRB\|R㔜>));8QI %12&ڒO )'T$IJtN.*))I$*Rv9Gtr> ))IN2p$kt);;($NJX2 e#g%0I$R!E;L%')$*LiRƩ%.CG)Og3⠒/%;51⢜2I;)JeBդ$E$4↦cr1IHƭ#U9N%1I9dڀ~J ›ui5CBRi)d$3PBG7wi)R0CSZgKn0}턔$I I$R'I%,t)I$W)$IJI$RI$I%,t)I$JRI$I$$I)I$ RI$I$$I)I$JRI$I$&N Y$IJI$R'I,t)I$*RI$I$$I)dIJI$R'I%,I$$I)I$JRI$I:dI%);B`%HIKOtROjS꒖!qJ]EDzJX'"c⛁IK)p>)d[~JXQR#2JY$))@F{vL  ELRI${DPILRNdR⢔JY%'gE%)8i){9Ӡ%2q!@yRRR$JduoAMQIK$2Jd@**CV~*)L$ )?QIK)YR:u n)$O|TQ>ה2#Bf1a%'>)),BS RS N@) 7PG%/Y; Dx7QE:dI%)$INI$I$JRI$I$$I)I$JY$IJI$RI$TI%)$IJI$RI$I%)$IJI$RI$I%,t)I$*RI$I$I$I%)$IJI$RI$I$I$&NJY$IJI$RI$I%,tIKBC]R'L|R7oG9%,t 'w\IJ L5R))cNJ2uOLNt IK$2J]12dc@))dDyG=II$0RI%) M > gRR0RRɓ$$Q))o( cJXyI$R0S$ϊJbI$`)?X))I$3M@{9)$Jduh**MT`)'" &ILݡ4 8A6߂A!bGJFY⢔J_蟂pQI%,<֍eE JH j(4$I I$RI2JuRN5rI$I%)$IJI$RI$IK$I)I$JRI$I$$I)I$ RI$I$$I)I$*RI$I$N%)$IJI$R'LI$$I)I$JRI$:dI%)$IK$2JRI$I$$I)J^I Rj#NN|RRRJsMIJC@D:c'E%"d|RRd$&HI%,x )I$R'N4:PN jJbI$$q)yۧޢDQ))I$I$RA NDƁE%(NTT%1I$R߂dGJbI$';9$IJR:u$)$H] g0Jg%1I$S'>**GVR߬>[ILJd*(Pȃ%2:ࢤdx$ԫ0dpRR@g楣OjIN|TB$JRI$TI5rI$I%)$IJI$RI$$I$$HI$JRI$I$$H)I$JRI$I$$HI$JRI$:I)dI%)$IJI$R$JRI$I$$I)I$JY$IJI$R'I%,I$$I)I RR]:K0TNt3|S&RRI J\LSM$;O\S%8)x$$512"NBZ*NQIJI$Re?̦IK'L !d;e9ED$Ne2*Y$R;h>I)e&QN%,w0%,2$NN j$U'j~J))I`H%(0$ OHYKT$$lB  $٬0AIK$ L [HiU* );Jg%K0RSacPuh> )L'ovڍ!úJHṨ LJbI$$I)I$W)$IJI$RI$I%)2I$$I)I$*RI$I$$I)I$ RI$I$$I)I$*RI$I$$I)I$JY$IJI$RI$IK$I)I$JRI$I$&NJY$IJI$R'LJMRJ!.JS'$R> LJJSI )CN H 'Do = 8a⒖q$(&RIK' H IRRS 'ILSJbLI)dI ]O))?]RSI%)$EK> *M0S%,S5*$JY;u&N%1I;LI$S'QRI%2`{S-o eGsG3 MS/SK$̒[> ;ϊvQI B]aA$(ڤ(G )JVk%~od$S7AKRR0e;@))of)PBg$$0Ƈ$"0߄Nᤡp~|RJ"4LI2I)I$W)$IJI$RI$$I$$HI$JRI$I$$I)I$ RI$I$$I)I$*RI$I$$I)I$JRdRI$I%)$IK$I)I$JRI$I$$I)dIJI$RI$%<ƉJ[ rR:&)8K rS${'L5)xɾ)3ḩwCMTRR %#JY$RRdI%2oNRSI%)2tMRBA D&HIK$ dI%)KJ3EL $&N%2vTƭI%.ê:wg%1N\hKL]:vIKos**GV$$IJOg3⢤uh))I&I uLDLg3⒘I)տA )u&k!A; dkLxIK⢦!FE ILTƭ#AJx)RI%$<dA'j~Ix%*`v)gA%3A&o4ngMQ))VgAAo %)$$]$ArI$I%)2I$$HI$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$&NJY$IJI$RI$IK$I)I$JRI$I$$I)dIJNtH$H&))C8.vIKrܤ))IIL|TέJ )H?z,Z` 64%/fQS~JfZG-v)i)I$3PBfH )JLGPN]&pBdl4܄5:ݮERR+9AMڴJ`ṡ%nRR4G:rjς*fi#)"dyȈ<<S\%;CINI$&I$I)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$TI%)$IJI$RI$I%)$IJI$R'LI$$I)I$JRdRI$I%)$IJI$IK!H)IG8$))~5"$ddh'IKJ:$re %%+9)R>)N$H );]RRɓIJI$TҝE%.K:d)L4Ԩ))whTTTRR'LLj߂Jb$JJS[?Ӏp&cSۡIHZh8(Jl6{ )I$W)$IJI$RI$I%)$EJI$RI$I%)$IJI2H)t$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$IRI$$I)INHJQM$JPH!J_)dJPLh%E%.8R:'&RE2J\xNt2JR\I$RJRe.~*))I$iJQQI$TIMRRRI%,DSLIǴOthZ3ILRI$->J*L ƉKJY?dJX%H%IKryILQN1BJY8L!%,I$p%2w&IJI$%(!E92%. $2p{$S$I$$"~i{)R'L0RLp@*1:$'Sg;`R~[ILS'L1IS'**NՠR[ILHԘa1a$,IS& xBe+5SL C$)&I%2Âb n|RSLVPSP%) `IS;D9AM|RݫAMJ`IC>Y* uPI,w l4!VAi; RsvQI !(٬;($t4Aa;5i4JV"^A$;I$j$I)I$%.dRI%)$IJI$RI$I%)$$LJ]$$L%)$IJI$RI2J]$$LJ]2I$$I)I$*RtRLJRI$IJW p\꒔J\&?))`&S` ) JQ2J@$䔷)A1))p!dpDz`Sq쒖~`%%($SHIJHiZO )I$! IK$I)I)'$~J)BJRdBRNtݬ2s$EJLRI%.d%GI> Jb:d**NՠSI)HTT!%0I$Rg)׬$I)JNՠT#T$IKRC|SI$3^))GXPNͧp {8?HpV^ࠒ}KL RG|RS/Kw 䉿~)%LII$$I)I$JRI$IR&I%.$RI$I%)$IJI$RI$I%)$IJI$RI$TI%)$IJI$RI$I%)$IJI$F)\% y%,R> IK'C%(d%,$%%+1)$ JQN7%<蒘~ɓGtܔ@|FS>))DdIK5L R)M?rJQBw&IJI$RJRsL)!d$NJ24QIJN )dj)'"{` A )I&IJL2JdZAMR`$RqhIK9|TTA$ $JYMgXILRKȩJUrS )GC S⠒ )$ Jg($)x$":IoI),#܅&3B$j$ڨrBpL) $Hgf|B,7~J mՄxj$I) gV| JLüwA!0%B%x)V۫%05FLJENI$I$%.dRI)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI?!.uJ2 R&)sJPK'%+JQH$u)7%(Roe!IK4H9IKS)@IJ%))DdI $I)sIK&N%)$EKGEI*0<𓌔@NӪd)DAo|TR$J] g0=JbN $z2r!2*R@IKTߨA%)2t)h?%!HE%)2v(kyԤAsDvKӏa8qp! %3R6|IL3()X<J]=fR$ X=J|TS?T@*Gk ӲuagPN )z􄤅W#ARus!A; RRɔ⢒רp:8(Rȭ|4O(Sn#撘L)UxO=[ $))X!FSI&RI$I$$H)I$JRI$I$$I)I$JRI$I$$HI$JRI$I$$I)I$JRI$IR&I%.dR$5N7 y%/)E:J[R%.J~ɒR$SRㄔR)IK'9IJR)y&IKS' R$%(&Lh%%($)9ENR &RIJHI$Jbe8QIJI$)I$ I)e!I&IJI$R9TJrd|SL:d˖⢒$hqH͟5:~ ٬2I$&I%2h?%LZ|e @Ju)zQx<I D# )SL$GL;%7RRdj5 )?|RPSpk* )@ƪVh?$N0AIKpT=Z!3$VjB+ Ӊ %;I$j$I)I$JRI$I$$I)I$JRI$I$$I)I&I%.dR&I%.dR&I%)$IJI$RI$$I2I)tJQRRtIJ%#A/2:|{ZyRcf|EyN\B WJ3kScZdFV_TP}003@J Nit>E/1BxGog7x^^mM,w|y8Nj Ұɟ*;h*F5!>@:S$kӪGIS1Q{ ~ Uk#$i$*gf%>Y* )%gp,P|JSy)44JP K'%(kL蒔0"RR> )p)&IK ))L2JeL!)RS$NRR0"IJp[IKvM3be8IJ> I%.5LL(<RR@e1%)$$Ʃ)p$$d몊v%(S)RI$T|RRRcDTRR$%2:TT&IJSgT@ ý8ILI):h$)$$\ࢤd($$I)@Ʃ'j")%)mo Y**L$d6>j Utx!=᠓ )3Q.B܋2o˝zy>ѣ+1֧v1NՅ I\~Ii\hXZk/A/CRQ\U1@Vkjʑh2TxWYZRg :UZgVė.ՏJm>K+T2)Sc\Q}.0Ƽ&rSx87sG.ZyqS0O8(pAiS5NcdV)PIKJ* vk$5' {x1t:"\58(hz<0cx%VO'"e$&/]$$LJ]$$$JRI$I$$I)I$JRI$IR&I%.dR&I%.dR&I%)$RRJp9Jg:N%2Q&JDHh%%(vH%*{3|S$GT2Jd40 RRMR%8IJ> IJ)Ro))$?dp?d~ɔT$RQ&RR4L))be2I$$I)JNE)SLLI)I!EI|R3QNS$I$LL2)RhqIJ>ʂrgT!{9#APIJI$R0Bg0Jg$)I)MsH<( AvS>t('LY( jDLn$E%/qhꆚYn=^+gdK7yCn&=~gQ_V6rdcLQ9rso6<ǯܮ 4W-%cU(U]guZE٦Vdn*ӒX_Z+Q{Bkx[\k!Uh[[uF g٠w# ȮuVz?2Qsp4'kZUZ܎Үmj~J eȨά6jJ`IB`h8(on䝺 Rc] a0oҟ4R~i$ $(vRI2c"&I%.dR&I%.dRI%)$IJI$RI$I%)$IJI$RLJ]$$L4 %(4wO!GxJ'RKbg@JSxIJS TQNL4%('EJ4IK)JS$RRq%,;R %,`%9=R<& JRrjԤ$)J\jTZRR*)IK&HLL4 BI %%/LddIK\CQ )d$I⒔tHȩwr?#%)2I$$&L:QIKEKRR$JRq!2L0RRI=9TR$HdA L0SRɒI%)H߂5$)5@n0ho `2Jd* vk($$I)h?$25a(dCsVT-EF ܭA'`}hꄏEFrëbCsbqtȈkdtck4<UgCt=RuWiljdmƂZhdRZ5A2 CWC ngkAvcf'5tNhpBw`Cs+ҵZ*2܉h՟}pVU/df%y/c;_9p;~P.1[仪ܴO>/9r>Yj.3!HdQGv ⢒x0RCILCbPѫv0HI2I$IIK$IIKI$I%)$IJI$RI$I%)$JA)d4%1 )`|S (:BJQ1@N-3)) e#%(itJr; )r@Lr"{$'&L'> 7.9%(6R%)S$Ʃ)p?E%2jd S&S))p~)vOE%2 %2*)$M%%%,$IҖҙ8JJS$x$T@))dLH )>))D@dRLj!2JRsL$dɧU'vw=SOjJXLI)< a X*҈mc^*ԶXPL7q$m`, !,dNw7-RFy)T4C[d ^ sU]X>XqV+Q,u]gΣpǟW>c\Oҳg0{|PnV^uVXWyN E ,4Ku 57j| $ L0TRIInlˇnPB} M$M^I%)$IJI$RI$I%)$$LJ]$$O)vIKGSAmDzJ_oG4ǙMIKςra7(Jx$ۉ"c⒕ pR HIJ&SHԦJr7))qS){&ƂS$LhIJ:H̤ RRƁE$⒗q2IJwd$%()L|SRR:Hrwre!IJwd%.|$N7RwxKI+ q|TS)B{$4%))L%2udK⒘H@IH)dIJ)1%,t2DdLA )7t(< ))I$%)H|SY )I'hJ\{D* dʊHfd('i8AI&IJRn0 $Χh %;ݸ(nՠhZGA%)$I >)1)JHY 6k.,^gLp%]:Ğݑaܕ9d[VO{HYV#d;acu Zi+λyPSM]sVƙA+Su@`VjEAZj]Nr Pfss9RZBEBKaʥhf\f BUl Ul K8jXTjxUmj%$hVsV?_V*t WtlO?ܽ㕣|Q=aXeLҦ6N T>DJR5k N$ILݫAMT4줒IԒI$$I)I$JRI$I$$I)I$D$JcJP))@JR a%,DRS(KJJ_̦M2|RRRN*T )DqqIJN4L)p<`"SLJRs"e$)9BfR&RRF"e%)H!09 $9:(!dT)dTS$'*) )dLRox$? p$)JN2I$%.EJN42wx$LJdu&J@s%,%2IR&I%)H&obRREKQIJI2I)JC%0a'>I)sE;uIRɒS'0oޥ:nI$!JO-2IRI2*HḂ;ߚ8Rt$C:LRCIb$B>%0*)Pm08S;>o`ԣeKWZ8qG]f|FLӽ̨|OV6U5h:/v_Lc̴z!s;~՝X9R.!KU*ƈ A5a\*r8lVBZHUtY=u$J&VsjxV,Դ*o T+-^kZ <)W-j~R?˗79Mq{3ᗁis}fhAe0>S.O+pKN?SpFri HT-RJy a_R$ȺdIJI$RI$I%)$I NrI\0 %9w`1)?ry12Ҝ%(Ԧ&S>)LcQ&SH %ҘNhjura%,IBVjPS&I$S̏JfS9au?ga-0HgF˒\I:ʵv598ur$rt4eO 6u?d44)jRWvuhzD 3!͚{q,S#Vij+/SNOPV AZ(حZVbHA=V^ 3.VI$UU4Y7 U[7sVhW [j< +/ pkU[X[]к1\};ٿeзOv]nZ8{YH)6U>& ҬTe5#Yw&<'08ngHQֱPծ5c])INIL^I%)$IJI$RL IJT )))r1tE03QtpN4Ԥƚbe8 )p;D`%%.])8 RJNthA1tIL|RsA)RcDTȩI΂obe%)? )%)8OasNRqJTp.,jTTRR$%)DzdHj:'S$\dQILJx1waJd pLHLt%2jSHRyZ(oJdG`tLLwJYI> ;A )be$$'L&N4d$`p}>I4Ij{(dR۬RRydnT\dJY$$ӷPBv))dp C&瀙Γ)~RQR:2I$&I$TPL.Y)}=JS{GA$!S Vt?VILI$*a%1LJw$(J6F˝=CwY4|Og*XdcW?5ٷ]$Z@,#gr <W kq.?5m4"o.li+Ͽհm\JW6*7Z|;g$u^,#!0#(b-^E%阮R1[A=Ze-6prnݒI$kUUz |M]b`V{j< +/ dk*5[x@)SI#B5 y.[܍~#Xձ[/cߌoU.,|Cx~O^+8*nV*tU ' Mqi8{\dii -$I(RI$뤒IԒI$$$I;'SDΝ p#R6&RS)1LhH4s(@F12Rv )`%9"&JJ_iOh$Je p?IJNܦqRp%EHDw))DdMJJ]DzI{$΂R&S<'.RS06_NEɺN4;7E%)LQh2RR2wiJY;|TTo%,&JJX)|RѼLJJd;D$ ϔ0!A%2nwE%.tJbdJRIIL'A ))~)Cʉΰ8 ۠IIJN)7M|Rp2R&I%.$%2:6:P:$$ddIL&=oy8 )2IR!E; L &EJL@n0S:>nqq_Qx$$)XG Uc$)I%)2uRS;NG`>,ާ[^^th(zZRGY#Gce2JKG>s3%6Rb(96l$s)R1抿\_ٺk,Z6pPG͓'2Ga/V,8 ;kEdz>_@  ATVa,l0#QɘSʨnT3['WitYxiTtY7ssREDAr J՟xScmi=WxV\źfE pAxGpBpRKq/eN5UXՎq@#0~+ALڭJ&=c$ $bzn;&L H"tG׏$CcȤ={~a I,2?EؒI5zI2J]$@F%(Ԧ&R&S$ԇRԦ&RR)}JQ;t2@JJ\ $?{$)}h$&RRO0D=JQt2qdILOudIL;bdwiLJJPD=dSnJ i$())'I*8IK'g?.IK)rI> )O=R )Bw)S& LRS&S)ƀwc35) N%,OH%'RRC@J$QR eS&y)2e;tEIhI'h:TRsdv**GA))bddIJRvEI IJwj%E%.$Rcړ4Q%%. I ճI2I!JNm`x $Ω%Rϊ-$)&I%)$I͞Ot2 w:N|RSLI$Vs>* GV| JRe3sQs))e;5$I I)ILTIJ%E"Pn4$VexL4~'.>nx'=EJTߢ?Q3pԑIDhiF6U[Mhgf~(<0 j>#艟mab>ZX+aq\U ye~.)\XPjɑz,b aX(,S1,Fb;9VUkZA5tEf㕡QTr9`$S*!Q]RK&Qn®ো(B @XmW@dO|Bjr+[H+ǴXDW|GA1_t2(XGSjfZCtxIHHd$t)#RN\){RRxN9"{ĺS)l)5))a2*D>iZA)IK;AOC&uIJI2I)t$sc'6WQw&RR$%.$%3c&2{$2e2*];LQI%2xTߨA%)2I$Ll<Ih>ig $HRdIL|Pݫ S*rJdÂ>sXR?_Y>' CspWPW 2""c/Q%9*),x*K9vĠR=kK }FV@;ES64WdzUrpٴp˂Lg.^#VTF8hY36^X`A`V2m$hF`Bj3e&`GhA`GjFbQ*MZ^a- QTi*ETS l%E9* ڭ=U>,j'?)h zXzž, ')BNnn -{58=>J­`RDÀ+Ek~ya t Ve^c.?o$ئiS '1%va T44O':x9x4M>Iا}NAhqI$ T`m4*))I))}RRcS$4IpDwN:=%,L%&瀒#̨$LI%.Ѹw:O_Dy&DN&%,a2}~䔧08 )&S!⢝XRS&0%;AG%6D 8<$ O maJy)pߊJ\^v ))E'2%3fTUw)W(ԸoAI )e&s> CFRRҗ)HSοTIVI\jgB{7Jf'(&T⠒R=ʈa;ΰ8 )I$h E&ϊJfS 8G%,߽3x ))II%)$;Jel}e'dpRR&I%)$IKA3x*Mդxj$TLJv34ɉ))IIJI$!դxjY2@N)}wܠpRR&)77})O2`pRI%)IxPR`'?6)ydIJSwm0k'LIJRpAEK&Nd7L= $JRv*)$NaEMüTRtLh$Xc;%^)4%)2TRBI$aJgA9%oPNn2RRRKuR&Y([S"T 0pb~p\S~DׂI_t`d=SctOYydV8\_a.qԒdjQJoɷyr NTF&fޓh2hEhChE`PBfV"(8JV!&b;X½+QZV1,FbK biTZaU6 0ʄY(/N(nDz6B'9h^0^" @𖥁mZɖ: Y5d})?ES Sb5Gt$hT-0UVXV8mȭf ~IU K4)S:9ۊNt8LIELw))N?8QLJ]IhߺM))t)7AR&RIK;ALh~J))I$e/2IӀI) $ʓU7{ZEL$I!I%,I$50PN'%.%'2~J )u.QXuIJtRɔɓ:$NѠ|TdlO "Ļ(3W)Oh䤥 Lo2T`iCIKIIΓ*A2a )4r^J;$ $J\ ;n&h $R>f :8ɔ0e;j8* mm?$T$$${T.)R&I%3whYt6ˏd{GeҒJRI$VPNALJ`)X08 cgA%)$$CSn#UJRRtJ=wܢC20HX=_~'O5Z}:zVoQŁӴȵߺ=nԥYy䬖ls?0g1Dz>Ɵͯ? I*%;('UB=t+5Ҥ;bZE]*u)Exfc@ED**)ISw9 Pȶ6?h% y*RZ6N<]s3Ll~Ɨ]|Uٴ.xEvl? GX >Eو͡ FY5mEjEbQXYf#5 Q&03QfdZaUX0$&J4ʈS P܈]/Pr dNAr3nEzSP(@rD*'xU¶/+XչsU>cAycQzy7jOIYNS]}Sʊd蚹ML^MO-'JSJ]qt8 ϰGrq? $ʗ $ԝ@I2䔲|ςѿ$%){9"=2Uܧn7'%M:~yR-)!gqEL٤0y <ǷE%3 i e68'yh좝5TRR&R`䒗>rdR$擽甪e&RR&I%)$$:"]E;RKI$)$IJD-ǔ4F|yI,^NI$$dγH Ljg%1H IR.RRxp/tx Vlߏ.G%m=x*/Zɕ c&O惩 cAHPWl"6tR)Ng FЌԦ8ZB&TBJq'RRIJ(KI\S\ƹ*rb9Dd،T!=$s>%DMMy*ӝJLno ϗ8O#|*$=ۉ%@^ 8@ 6"!"(4BF L,+QXf&@Cj+S FjQZ(Jf5),)X0FaPɎITCiS`!DL9ra7 NREpB"') DT !P)(ʃ 9CxO WL&]v0~v 0ap5u+/41D\~7ıK‰(U)tRq|{I%& RܥxT\S$r䝬̄0$Ry8 )Nk*)È%)u<tSqhEiद*Lx zg;@ SdI$5ELQ&Tc;( ԇܨn0LJY2JL|*]ֆTیIK&Ӏ4 _3ࢤk@uILfRL 0kcA=OQIL$w)3@\Rf䠦o%1I2bO%/fɔJe^|a %F93IK)izIIK  !)FIKʕceIL[̞Jݸ9Oi)F =|kgPIJSfAI߽%1&RLJ]I= WP&uILDŽnҢ6䒘kcLwALn2I2I!t)1u$GS?;q*|RKI$)!)3@]J^5f pa2üTRI$ɍ|ۄTR e;u3⠒IIJ%IXH- )fXc&y=[?M÷\ @ϞߩXq)0仱[R S2ОJRU"R1ri)LJrra$q3.Q.P.Q.Q3F (&3F (9ɋ,+Ѫ>S/=@=Gխx}yCo&Dղ7hZzl\z%fC韢2rY.AMD)FYC6f"(]!'$$ϵܨn>IRJ5LHgg;AM'E; {GdCIK$CRc&xHIK)1u(ݽ))dILg)W($JD9+u_NR9W7 5Dʾ8:MGve[[ MnBޛzo.ېއ.ې&އ.[&.H\ D4xB2&Ae%Ʉd\($ƛZ:}3*FlhyVlZ9_Vɝ(V%VIw||1-ʐQ aV-664" L,#QZV@Bj3J𑨭Cj+TeIZ6FPR5MEj)6XRҦ \9HRI9#r\"r\0^T x\BSBSQ*5Z(6]'i<~KNW3#ӵԞ$|B+꯮ݿ}v7qׄD )ZS'--E/ʛѴ|77LJe=ʂNv)Rmr`pRɒHkJfwܡ*V))Jl@jah쒘8a%3֓㢂XAqRR$XOT! &RIL7Ln2kKtCI+@]CS4$7C7h>j 2ɂH =ۜJz %u6h~HjoѠ|S)V%$/fS$Fv{-$8%%Q{J'Nww(WhR'{–{%1Rk'|0&JJEۨPI SjƲx $ɔI%)Ǫn0ݸ$gx(i$ȍ JnJd}A;ݸʊJ]2I$Mv)t("ww$6 JdIIK?PPSgRd\Tho~JJRIEKH)Z!D+ ;䂑ʞ~s06'K kD]-pa?Q7Gz[7ޗxKzĞރ6zm[oC< w/BޛzIJ^^^\J\\\^f\\\\kY+:* 6S64cjx!7,OUɀ@Z9zm\mޣԼp8*H2.ˆS 2FFHj#T5mDji^5MFjadJF 65FPR5MEj)65DViDBu'Q()$+9 ȮCrxHD7"9 P"* ^2SBSX7RN=~i?+}'m`L_Yon?% Nn>J+EY Rn|ϱܤOiw4 ~!))osv5?%%1I$$MwsPRt($٠.=Pah쒘II +\{(*O߽A$wjvI tI i>:()u8 %JEeAq+ 8$)&SK!{4($dɃq'sNwA%.^}TRLJHt`:)Z}ᢂJ]L)Ze*JR4%7heA%3oxj[LivE'I[u76F7v^\^Kdܥ:O!:4~{WL% |#ų%V-oUDD\-oUDD\-鷠oKzVޫKzVo@ޖ<)/Aޘ+O bҵRb-)A4Jn(d|OQޡ. +;7C}W&5YK*%_˻cW=wc'.G 2Jr͙w1p f 0i^5,ڈ50mEjQYV" L+mEjaBF5 "50jTXR5mD "A$TbI!I$Ib7"9 H܆G!JnC(P*@Q*eD%Q*ED)Q*e@ E9O7[{&lRI$FJkpoJI;He"wq)Ju/=;a))R8y$Qd7!En%K'::}z4|]˚꯿?G_ qFD3mrp]YY3:wqʫk'0&L$w M㪂JR#T0$$ SJUNOEK;kS)AxNɗ47BIIZ&r~;dnRAI<k%0Dw{Jf3QsEK$db%Dz# I2I!/oiTp$Ɨw:+ A%)$I D̰CSIq$Pԭwc4SH*GR 5Yb4lyO9IdF.WKpkF{>|Ndy$4p2N&2쏦@&SvN$H)dI$seWe1 g/8p0QӅYPrOPt/*ѫV{X`Sz2يI$TI$$I)I$JRI$I$%'7aqPX~Dj-[.7= VQ`-B~Jg1^K#`TJr*."R pf 0  WmSjTژYC65AM+6 M,+QFj+PڈBF5 "‚ͪa@)°jCj QH$$I)I$JYnDrN FTPܤ 2R \TJzDTJ)`S)>I-gITΜwN\9Цw{PS'0Tao)5xRRyCRPq()ĺLɒIL7Okh֗|J]$u d5EK٤3A"dLkC|u*,nݹĠ)$q3>ꆥkCE7{X- t1I2[4*"X*)']][Cq:~mi4 )10$Y$OXI$TLPJ$IY$A+$I%J`*iKRp噗û-%ʁQO-y^FgT|WM uj(4RNAi1I$JRI$I$+/vTsB1mJl8s P=U01u(e- 㣍6K?W??#{RRs*1B,SH( hp)p )K dWmDjTښWDjQWmDjaJF5 L(f@@VmS S if@0+R$$I)I$JYee8)P*eA@#*D*O "TʉO\"SĨ"QSHE/V2x Z$dI$G{Ԩ2xsILanZ(i${9یhYGc_N%0H " zKdTLCGA.S$`Ϊ,n =۝))d%JHkK!JR%~] $I +]*n7U: J`dBF{Z]㢂ֆJcωCDHoIL$$V|TRK*۸wD._ `w:t。kIdXvPELn v=' wCIKV$jcC{JH`n2$R5q׎RR&I%%~TmLZ_J;p4PI$PH{Ɨ!ʕp˒JV-5E6g׎er:O6|q[ 1}\@jYұeYk2IQV#V~] KEY$фu:2t!dI$2t%dI*L2 Y$I*L2 RdJ'L:dU9]Q"SeWf._OYVꎫU ʴVYB+y8EZ I$TJ1xf"",N ǒݢ5^Q\VE沜*M̻t+K+IS>N"rx#Q9)#n.`L H& A5p\)K dF56AAxfVzF5 M*HF ڈ 0L+ 6ej@fLRI$I%,2S9#*M%H"D9L QE/V"^{(:+ {AkINɓԢnRe2JRmujTϱ)ݸdILiY< T QhRRv?Ȣ7{]Sk5CD>꒘&S$HeX{Tawi%I7) !kE$R V\|U!Ӱnp (i. )kĨI%3npLn$W\JR%Z}JFSG<u?-'~DQs=ʕcΥ=mct™X})߸ʊ |SS$-Sdjn2Q JRI)V;wIL<Ԭv*))I$J\ !k}gh/"RJKe Rkoq«v]t7AHʐTcv:T#̪6T#"6տ?wP'h JqF=-,ӗZ I$jI$R$ RdJ'LT:d$$H%d$&N)2t.RdR'LT:dDLA+/Σ9@*㽛8vTdb:G CzVcG%t};Vt3[``k~y*y+7Y3w |8E)\E}Y*N ‰ A0NWL H( WAL(0^@2PM^ D s65AmL(HFF3 aAa0f€S if€S 2ͩ5:bI$$I)g(7(@BSQ*eD%Q*eD2L_@IOhV|JDw{JBL.qqdC:۸nT<JIJwHdc{JݸʊIR%ZK7RR 0~E $0m)X"2ôƁCPK C'(^4ɒ%)ֆʋRSIq] )HP wtxh$;F))# JK($>5"]>JgX7Vg~JA+{q+& 3ot3߼ʓPB*l< PhosIJ|IK4*AnS>j7˲I`!yHj` ]~R7_)lK$auo7IѪRoqo/q(jx| E6WY]ޣV+7$ۻ@ %pm\' 5x\' 5p\)8Ap\)H 2 mQ a4 TBM\M-Sjxf@@W3j#T†mD D LQ a0,P a0f€R EIRI$I$TܠST pKQ O TʁO TʉOKTʉELJL4w>)Lm< y6V7nJl-<73Q)1("c'"(Zn3۲dRAn-n{]$ $HgSw;^ĕ/7~D4S< RR@g(rg2Jf-<;Pm~waN$sKt)huiD)!z, $Jt% k%#I%${T2gTAO;m)))&I%%o蝍->"}$X8/hYn@0n08Nɓ Ɔw:dJISdjn2ThgsCIJ2v ;$sn-v> 731FYYwq>])jtaxAu5THqBm7!$Iy$6\Bi iĔ)Hi 5 %%,("^x )U,{% GsfCljV?yݔRC:E.2T(i)Ju6NAcC;RS;q;ȓnw?qɡw=ʺR`ⵞUkLTiœK蠮FbbJp04TI'-RI$I$$I)I$JRI$I$&N$I+$H%dI$I I$ I$I$VI$J$ Y$I+$h(("2yq5_}ԝIP`v]<q*ag)!dK}3Rˤ5Ps|RRLJKW_g2 (U$vy I%)kC~eFp X%%1I$RO_]qnDf-.wB%ֵ4H;PsKy44:4~ֹ$4wm-ΨNבRiq* ?xI,J(c ]*s!>Ή!p l h.a "Zv۟J\d) ~I)3*-; dDs@4sJo;))E;i>]RdwwU܍cBpIM{kԔ{I0,~=Qc#a;PW E] 0BɀQYJv$I)I$JRI$I$$I)I$ Y$I+$2 Y$I+$2 Y$I*LS(%dI$I N$2t)dI$gdZr47 W>KS|۪!$M(i)>χvy9<?εӁRWkHf*vDƎ)M $`7{SsLI)H{Z*5sJnq))IIIkϙCIK%xmd蒘I$1{]ħIwCIJN$ȔJJZ.h9+`&à#F}k%Py~Tߒ%JMJIW|Pɕ;OJ]NNv0v⒘&JdIIl)=43qׁRK%"P!8<Co0B;$>:qU Rn+Nʕg<$qgս )[H̅><:KPɀKX[)(2"LGu$HI$JRI$I$$H)dI%L2 Y$I*L2 Y$I*L2 Y$I*L2 RdJ'L p?EaULz]cJ7^*#_(Yb:) phSi-bel2o6fD荗J'u|!bT NJ`IJ(F8I8Q))()8Ap\' p$.`M\  )/ SD02 aEL RɪaD)†AL(0T)J iC BL+Y iC0…I$I%)@BTJpKTʉO `TJP),JD*8.`TJQ)bTTdTqi߁BImii-)W.j3I: HJ/ ѣO4g|IJI[o:9@jIU[ߢ$ɀ!ODXS9 )H,RJ.4K}3Ô4*(3Jbnq*)$vˇEIIK$@IkIR(Pŵ%+=Sͭe"CG(~)%`$S0p?*zBI EglnJI%0I$$$m2gTKLC򡤕$M'IKlڔ4v%2JI[mwQ{ F8dBBgNQwh|RR&pp'̡;c~GhJf8(jLyaZ5f%"IIFOILH:r`Pѣ!O)) mjԝ\ թ)%MSw8x(ۉ))dI$$g:![ gTHIj=R2gT$ ~DCefISFݝΥA`&X|IF w'%#`p4 8lTſf@Ik*INpY1ha KGa;1D|h\ņ(*I$)2t%I$IY2t%I$ Y2t%I$JY2tJ9-Iw*9Yk}=>*T9-2⛩5S?̭-Z4 pc݂sSCnOxj}_zU/d*.t)%@JruqQ)H%6 : $p:KRpNjH)WHRpL. L) @&L.LMS `J ))H&pBM*dM+W AD)҆AH( P' t҆i$jI$$xI"SDĨ")Q)bTJP)sE2rĒu))>FEne%/Pxw9^fL!%,.ΎCs οk\%ֵ40 0S:|(R\Kv('xT[c{ؑQ˔M|C )6ֻ nwF6|<|CM{uymaO ]L j˳u:p<&٣wX`)$)lQ庂1/\ H7Kk~[B"4))w<$ IIeP0l[jsQ ' s))V}KpBI%%-jӔ"IHD1-$`Gh"؏ftJ4=cn68$nq8쒕_{JAV_))~l?c7@Ch%0N0p?*# ܍GJF\)L)FͽݩBNJd$J~%*iJd:|iq%& {I7 Z`I$F{_I,tI)w7i2%ࡤ:KN`*L&I$ݺBN{&{vdwO[7>ֻ{dsPh55V[;*Z@m dS96T>> )ך7j 3\$(N;*̅6<:CL"ZBIB੫` IDY$R$JY%me-fݝfGk<{Le3=m>TS' tcx&S@yf4@NL&sUI)cCeBu^z) S-i$)OcjiLx`RUPIMI7_D85JJh\SfRSkMCIO`遨Kc<#"n#FdII7y:?,26ߣR$F2HWϊaIsDV4:`qkx&uas5Rdž@LJdǖ {[fJMcBJX4)؋'55 *H[Ϣ$2IԤ jd^CNז )d Q!i%!PI%)$I EBE,<ȄcTRRИ$ВRS$$PwWV+))̲ZʖU%9LʐZ:206( ,BJK:qs+#~j$x6T\8#`42fҎʑ[Z*`fN*VZ*!!HWwPjP%5MICXK=Js]R:GINмv'VGvA+$ߕ0t5wJXֹ툰|=ƿ(*LNGJbI:Ȯ8ng܄-2?MgR;HD4`ʐt~%+s|]k;-j&X[#E$73CDenQ&~ )X]?Ig^`$բt;K^ݭCl$Y)κJ$*ðzc愑3I%35eNcvw$$ "R֘?4IK"Nè(h7ww )W#Q+x}cILN[7S&|~H㲂JRtBJy~SK!Ntmp;%#eju)WR]JYunʡṰZ5aa@$xG!Cl"Tv4kIH(NJHD<#W>hI)hItBײGg I(I-ƴ@%Kk~=CA,]0BBi$onV)1)jJD'yPߠ#̤2w([b.%ZK:y$V٦>RR46;^IK28SłY%6( s$3 Pߠ#Ϻp٣>*aaq.ԙLI),j[P>BGe&${^`p8R?l~s"Biyk08"65}#$h%SJl0pR2I2S'LkK;\ 8 6ntI%I$He[7;wJ3۲#"IR#6;PIK(ͳߑIv~D+ҒI!I$[7;wI,g"jߏkn Ʃ)b#B-tPlՍ?$$I q %:L<4qi%I$٭m?5$mmv'sujX^1Q)6;^EnB{O%23q:A$TQ>))JO%%(N&TckTR@I,-~E{q^Od|G%)&\du֎P@ӴloyyRR$lwNE9r@HSZpy=ۉ%Jv JFX`IK"Ѳ;(ׁIe%1I$BJa !Ѻ;I,v{]RI$-w4Ju%+ u)nxی$B64Jyx"J4"4DDR43PӓLv=Tif "Ѳ{$÷q!MkOkv$Ii2I)͇Kuk]mt?*(=PS6HwNB0/bejcSmk`h_]v6CQ_gR Wߠ(nai)<6rIDp6>JH2$0BlsLJHX9CN jD]^)) Hg1#F)fPsGsmh${gy>6?q$̩v?ww<(9 I Q6ySӹТ:IDD4;kI Y?4IJDm֗ VNIHκI)HZ\`)Z;G%#O!'%,DhRtzGP n>))kN;sCNuLI$#=#Bx ĝR "Z&;UIK$IK;%cLߑ %3oơ Nmp)Xͮ!%0I:dD*Kn>*Υ%2àtQpc2%üBJFI$$ "WS0@>#D' \!꒑$IIL`>&Jp- ?ݽΥ%#{L2JR<i%,ÏޠI:Ld5))OS=̩[kBJFI$5I$PHG~iJhd7d4vԬΣ7W)"# GqyR VrPV\OGŐeAjp0 `jjjjAP1xB”'-La<''- BxOZ<'KBP ZBB$:H)I'JB| GDȸR4GE.2y*)9|aݡs^}gs% |KtxzZ3*VXձE hlR{tI kַBEԖT:I!#Hַ(I%ddj|@(HjƟJR.?#I撘$`))k=0v↤dS:H2hxV^4";ݽΥ%#{M IKB4**usRR$INh/?0pӤD᪂FtIH%'7i!2JS[R8 M!JYMᢌ)ը- )JP%,tRS:F5R+ux$$I$Z|a"?ݝ)T2d(*- )IIK$2JfX-?JBv!R RڅBp8J[O P[O P!h0<%jinבr|@))I$a#D2=JFX*~oty5% p4sܨs%,1{G?>Hdd܀T7U~ծo$/U4)sfu !+uk]I).# $ZO(vr#EI-ӑ "ý@ $ŦB'L[ߠ>e%/ŬCPs*Ax h0vkŮ$`V!9>Y~ y??5 iyIꛘK .gm<]{\Ĩr@F%$mB{ˏh&/SFjOv)(e[A2x ?qa6ZuEGD[<YeZNNKtK:,$rO.XF7)WѭdUf%H,~{s8ZV 27{=b=瀠L(.YE;C↔LzGp;q$ҖPv3qț7Dtpr[B_1mLT&G3]䔺I%$._(JqYVd\w(h - BtBp4n J ? Y(N(ZNrJghw“]xjwA+XN )%(t;\ iI%/cv[5$4%ch/=Rh$g]QT$p'SE cp`3a/$ǰp?*tBU2dQnR'I%)i7~ #_ ̕)) 8+NBϹc-|uY16qɎg--Oj}@ĘbqXB}{SL O Eږ=j+E-Z'=mJl!(S SJ(J8J0 BV0)BP% P!jZR̝gʛ)fYG xwGoH>!+̮X݄#"182K$cUjueR,]VkO!5W`'I:JR%䆉_\NĩneDn>%%0e.vAQlscvsqS:zݨkBJDI$:!)VaCI,'LW"ի>hI)I$Hn6;=fIQsJ ̟%!fsKLTQ6PF0I;X]žƷ ![x)uޤh ;Qkx|כ`| 7n1 E׌̮MDc xGr39?% Ө/`wA+2qݍka wQ7q\e}*nfQ?&V|20=7``"Xc8 ikgShʋyIaL1IH\W1!/S Mc{ oUryhťlYu ໟlws⸋'ꑜ|]Ts_ jr'uDkdQb3}: X4p))G遵{yZ_4`YyO)7!O>Cͭ/b}]΁|6{*8 ɭ3W͸_[:>_k:%_ג`%Nb?7C?8=z:u-.h7K$+#8nܖR"j" ?X7ȧ˗SM=7kv~We HY$'ŰxC[A$w۹Ͽ~Oj4al8%<-+eR&+g}yʍtT߀m\G6OMq@J5_d&2<\t. #v|L3#'wshpȕ>ܬ;kpi#ȴHL"dHXH4ϡ|Of;myÿظ u1%̻U>hc,F`< P tn;?YǩV.1#r?ѵYcɐew,0g!-ˢsYy5;&&?<gCFdP5xxVafۃhqz>cs)ec%%Xs{$9_{%Q{@sx/c"&~NS}utv\:I(9{OY !41ZWkwGHqǺ 5C~~EkG!Fat;H)&A,l8"V|R'I%)a-p4H{=LXG%I"NJfuy4JoJY$RdtpCJ$Ф$1! l\ŨdxF֤4 }6nVW?C Z7_n':&SDږ՟n PԶO EOj}Z'=jp"mKjVG B&Զji"mKjV`[SmJkh'ښMJQR(JU|I7~DxB1ܬɒ8e-<ܝg=ς[1d5Va,?AٕU5#(UVbe!LGkS5"FK<#c($I'ȂlSV^b|ivA8${dI%)kp4J5$x$2JR+Hַ))I$ XIHI$G! Nh*.ao)+.:D"Ojh >})aQT 'ȩ)>B"4)"|PR4NajvO*F:K}nGܮ?\թqb@xtNf0@wѺlDpizQsˆ+,ոAaZ'OS]~oA|澨u/z>o]=GhyN&1=АDVO"Px`.qW=WJD*\1^lXDϾ|8(UOiwOiÝW*~wkly9oR>7qRkOu0Y*Hoph$<"s[8sQ\]T2\윞>~Mt*]0wȚXvxUsҵiN_ޮ;}?EW3Ś jf1Ijϊ1=)ٙH<~jk'7vpi I'R~}!lLvXYBv?yO>E?* /*Vy6bs*ռ{^ O'ݽBs? ڏ3!5U"=@nCN'VzUF@?e=Ec ;/Q͚koW97~o'&tImPR))b0n-/ѭ\5)ϰ;O˪>ZE2]Q4}?GdyD+zq "?F]w~lÿt+1ݸdZ~K>Չ[ɗKFbeDA:w)*mňP&OM5ѷ%>Kw:݁HcOʽ#JPS=7åtYp/Mlx:hm%[8\w))FR%) . %*HRLRS Nƫ\$$2 V`1Ts6{CǯO6l=_o(NkG{цmSڟjG>Mh{SDڟjE>MmJhjPmKj,&ڍmKj.RZ-B.R-ڍmLZBfǀ)F"D" e T*ө!@ZjJp[.0G9]6 j[̪ [[ƣ0A$+l%͇CIpp$ʀivFJfdrLY梒Jgh栋I))wqi2<ꆒF5:L<$i'x%)kW"ի\)IHI$2>P-Սw$I$JtR|RM\\Zd)*QhRFh/LXju)iw ^o? G<C hI@{pK?nx}RWZ2W' 6%l0rWç}$d4{-㟽wKR:Ms?? 3=6*8ף?-v 7j8켘ЮRf c*cEx0{P4c ji ή4} , [IzOůrp DlYC9B.-ߕvR#N'e?gW_%ӈahs}[ߵgRXݿ?Nk~`-uClC/0c.ipǵ=`WGpwa2>}>9*7 Vh?#g}8wpo#'-c>f{q1KrZ=?od;K7_KP{.k!ضr+0. ;5! q6Xi|4R@9E|ೝu< L*ŞѴ|wq?v3SSkZpw^Tŷ-db&F9Z3*|9T=Vzmcפ,,nw * yaX39B==ـZO~Ϋe˯ykP_I$jjE %) `I$y|CEPx$L 5*84DŽ<B9P*ծo$INsK1CΥH]؍:ٰnrU2=FǗ$mwk:&ͭMyy*ww욑=.2vw>tӃ\2xpоe1[~EuZy$jy!"fœyԾdžXK}Ygᱎc .zڳ|ݴ*mc>NEBgr`2x w[w~U}G?X??ry6ȴy;wz))ĘY΋_7-8e?H=}ReSf^ccy:n Ʈ{*ϒ@~%m0hЗ|?`(EΨOECzkw^Tŷ/8XUm5ͣuc 6JgUE^1C-ˁictLK~ЭvW XgRuZ8ױsi>YF5~;䠈ZG )dIJECI8IH'" &EJI$S:#(Bv CJbI$|v16;` XIN*I$JgV38$I Ij5);h u*W,j(s.bfA( wVô*=k揨69lI$6)$IJI$RI$I%)$IJI$RIQm3g>*Lx\0Vq▁&ns1<5a>R.)u/yJ5u#ˎ;͜=25{X1T$zVꮵeL#5)&٭@"0MnJ*Yx`ϙLmfi!#5 %:6[z`d)VVos^.b-r>`d5җr :>m4+£0 Udkid{uJ=AnF|]U^ki鹏!35x #t*}iӠM=k#6i}TX[? cބ( 9FG,"#ёaj,SP~UTki" EK,uMa1?@Kr"0'>^.fŻj똁[Xw~q (_P kziX[֏L̉.Nֺ]YCGX8@V\<&1Nƿ\WaդH>Ep7#-~pX+a#ʟ?J"B_bQ4^IRe=c:l;5qS"nj%S7 |K\{1a55տ}GrWΨ6\jms;Z?qHfI:{xW3z?WoH}7Lw6gi2ȭg0HXj`M{&"OUÒ6+`?v1*hF_b\:iRN?5QNTW,ߩ}B{ju;Kԛښ}b{}tꂺF]\X~{Os}RwicI.ԫ36k,&vNaFBϊ~jx=ֶ2eU:Ķ夏 B+ϣnJkf fQ74#P7&vppq7;M=csO Z~"ALGXX+cA'gR9W$ma'bL.Xj-kUHΤ۔h /n%&W}\YIFC^t`iԴoVd <xf&صɲkm c9%aݎ8%TEóZ4p?TB?!^17ul`;tmmWOc"?uVN8;ZYj-&I5ǂǏ Kf N6T}㢉qVgT$Jd= hn2%2{U7j|4PIJL$üB',Nx NO1EL\%2I$vjPSI$RX)I)H\'JdÈU JiZJ-+ĒU(<>*9>Sc`@$J*I$I%)$IJI$RNexl:rY|'9c\.ͼYdzr֔Z[pCx`)6$TI$2~DqڪuW)x,ppV\;gYnjd&)\'i~mI`JI$RI$ ]^ڽ.,3jqo=nqeTrn&a. lr=Y}rѡwq$b%j| 5u#!,N")3}! !JkD5{v1;F@p{QAKJ*k!#LI)HjkJFIR,Ս?$4Nj$$-խ>P_$I)HjjJFI$T4y C]R$I%%QBRx>iZ64$$(Hj7PK.0`&ORC4) J&â#F RhjuQ2d1$a O;'qL^SQccx 2RS= cOQN0S&׷Wpw*fͦJ4> )IFI|BǞ OvE$$'sw{x9-2%0R~q(:7)%2I$'k IL GNB"9I+$I!I$JeT=vN}Ia$I$BI$Wouvă$I$BI$7wAIbhߺDɒHRI$i)X!2h?$I2o~!dIL۫HAJHR'I%,Yl䒕ahCSXwPIJI$R+G|TTݫA%0I$RgRcgSQs))|B!ՀI$oҟ7j~I)I$Sk@`)Xc8 )k~PDX>!A%,I$ujHE i)V\^SFޜ?Nz֪d(Ю 6Bu_ yn%arqS0?]HN"C@2>rU L\\,Mw:n~!NPW~~ /&/3ckO#r#lxywe}3 fTpPrlmRρDeJ4\>h9R;*EeHbHV3!L24Rm yIHTNu@9))zshRq$xDAG Ս?$$E Dva %I$JR#5 %I$Jkc|xR$ RkՎR$I)Hַ(hk- )I&IJEva . GmD0wIMtb%/X>:mkks r{Vk] )o}z˚JlRƵH=Pp>jϥU))=;PkwM^6u<qq'tZ\`)(i)I %Mh>i):I$"шS0@~J$ɒI$C0ک=E yI,RSs4B n?%q'tę2I$)1ѡ਩1Ig}H,pI:I!e&7q{I,^~QRiद '"4I$,XQtRyh$$ɒ^ d!w7iȏ4;PR:ȍ $c8 S+O߂JY$RI]8 77wj uw%0H H0h~I)O;FCNJdZGANRɓSn#U:$m'J\{=jOv*))Հ6j Y$B|BcO%"(nE%5j*d渻V"_uhZ95{=q.9W 5+V))PR~JM\a*M% e(̥"tx6F|\8D R O )`nP]4A!%# V<}{F)j>E C4I%)IoCRJ`w$yIJS‚@qi/JRz85S;D<5\> !$)a%Jeh梉:: <)z!crFJQ [8M! %$u: z5$xA$\GHR/5| -Z򔒉$IJWOTTCBJt$›s4Uct;MQh]QsIKu6ɔO$R$xPS'!-w>))vqNXBw{FIK=E$RG7{FIK=ۏI$Ӣ$}7RI$7{甘 n?%gTAI%1I;Mɂ=Dz3aQA*I$C7AJR BI]ѻe'N($I!f} vkE,Zۏ96;I$20Na)%vqL}$1{%S6j ~j L0AIi!$I$BL0ݸ$f9AM TRI$&j TS%1RcdI ~e2I$L0S!VuKFK0kIM?E8ZӊB:*!&֬pH )bjjxILCQ!XIH:I$I@k֝G*?̏5:vp>i)b JwyPIK' I%$CϚ%چ!&)$jkJY$IIlՍ?$$Q_SeEڝm ҿ%3 D!F NN$$R[ki$!$' Ly C]Jqx;\JcJVyj))I$JuNt n;FL^E:@JJS[wt'h纂JY$Llx )v><? d4)Gjϵ%,Ѱni)}ç↧QG%)$$Ԇ#U:$I)IE%.;%6j< %.d)N`3()d$P*8 JRR6 ǞNfn?F$='UdPXbI!R=mSI%1 !UKuk]䒑Bt$Ƶe w7$hzCqGCsˌgRI))w$y_ϞhI$JI~;!"Z|$!$$R;Z0kpI$ַ(HjK|ABIJI)SNIL;we*n)/E4))-z愉}CIJI$Ғ7Z<(Hk! %)$II]@YnPe%.I%%SCDV0%.iJRSQPS%K`<ǰOsv@Pq%%,I$4n04pʂJRI$˶h>i`A%2sAŠvRsA)0G5'y%1&LI$)$JHp2T0O %I$Jm$`m4 䠐0Tu%6焔{GE$S7PRfN077}jot8 ))4E:#DI$h('{E+HhR$HR 8Rl:v"7RI$)L|[R4IJSsf7qݸI^I!A;LS!$1L2JR 8S'q *vk -n )=y()X2h+5$ $JRv I%/`K5xq#{pL*v:}Ta @+D8 IJSfp)}J`DBd ?xEKݣ@NQ"VI$C*8qiSO$IK"s_W\)IHI$\vۻ(1@o %k\\{hx5I$[kN"I$TACD]I)I$JIF$JL<(CILRI$΃ .< V{tVF @LRILvG.G$I)GkMhRR4I%$0 dyIHI$R[ %64II PQjկo$$I!Rkw$I0>i9 oC())&Rh)1 \vIHɓ%2-(IK)x {JbL PRR!(*ll 䒗p$w M Odj8))I%,ILd)) h)AIJsvLxB J]|{%' o~RR'?tTHSp.E%0cw$MmBR'T8*0T o$ gRc;JJY$$)Ja*0T G%dTR|ʂSAIJiAI %I|SPSAAK'kwJ 7̤!)!ɜ ")%()!I` PPRQ $)Soss$J JYM*`<5IH)AM$,x)AILg>rtA%$I()AI RȨS- )I%,x)|Rmg)RfFn%JJbx))٨iP))dRNZ!AL;(5J^<SkxpRS:5:<(CPSAEK)٫~JQ ϑIH':(AN%1" 'N #GIK< $SAII.5! jIK&O()!%z愋@%BTPRaA ;>ziJ JP0eO CϞpQn$JU_%I7)w^+ wBM@IHRO())d[uc ())IAJ JR%8(M_ PRRȷ! +5R$ dNx$SAIIqϾl%'SL2C|ֱf8hv= ypΔvz~K_p6|;p~iHH>e^ꀵ:0IҲ)h\_9c ح덱2ֻ+6WQ{|HӠ\zNʯ3&GvbX<)2(оXtwu!2`䪙V`dYp?V6;>1xKӧ]B7-vzoBo}C9'l.fⳫ1/qn<ܛ zA'R$ndqQ)dz SKZ\`L5J޾%#k<~E}Qe۫_k 䥐QLN^! l4~ci4񅉍V je-89u\Thׂ=̮N.ُC)\Hf`D$}Q>k!G[{@p+_t,j+uv$32NCjniưV?Ngһ PPR .%(6 {0'tbk\l}Qck~}kíkFul۴?s≙[K}SX=g$adۈ{݁"VwV gNMm$XZwx}`<;\}hPxl:j7u$2ԍ E\@]p]-_T긯:U鱡 g}z!fZ9 1St{r;xy:ËSn e_t*PMi۽oGޏZ G9 GOLp1AxDs@]~U.yfALw:eYٕ>a|` N!uً=s]>7~ajeǢFU<&Ye,؝A-_a<I$2t)I$J]$IJI$CI-9I$JRI$I$$I)I$JRI$I$$I%dI%,I $I%I$ Y$IJI$J$ RI$:I)dI$I $I%I$JRdRI$I$TI$$H)IIJI$R$IRI$I $I%dI%,I $I)I$IY$IJI$R$JRI$T:dI)$I+$I)I$ RdRI$I$I$&NJY$AK@&00hgѫV0t} CON1|rc[AK۰Zwu~yߑaA5|/ H0}GnOPUOhw09d!#ze#szA\CO0S&s͆\RŤZ?kOetϬ'&GV0=xO.VzwQʳa H| +J.,t apu̬NV7ܹޡj}:Q]WH*'b;z^%wa[}f^)eOkkm3zlbb r#4uf[\_2NgZ5Qm-3eoywrљ7cIb;VUYp(~Ul΂CGcM~)$F"&@HBˬ}Rp Aww1 P粙cetӝezVK[> 3ٺώԮV_Oq綅Q:X㉱Ȟm1ۅe2NY Z%ĭ߮]Ku|lq/anǍ78#r׫EBB/qRooJ XgeہfWR}'!Y1fSvOB51ײ0[W`=[wx4Ljwpuz p9(?8 _ ;/~KC: ֺۨcC|@ԟU~NSVQLI6ɧ˷ѿ<|x-oA֗nn;F}.w?UWݖ,.7Fz?Zpkl>տv'D~D<+Ƒ _W}N!Yu/ez4[tW*]#UdSkr^݌ 9OBS\nǹ/2wJ@":LH1;_GsYqҸk~Ťm lt\֗a[-e?njn} kGtzEi!v !`cQ DOQ׿t%}&C4çķ]f^{9lwoٿWshXwQ9Գ]2xZi<#Aѐ֚$I$JY:I$$I)I$HvI%)$IJI$RI$I%)$IJI$RI$I$I$I$I$$AK$I)I$IY$AJI$RI$I$T:dI$$IJL2JRI$I$JI$I)2t)I$JY$I*I$RI$I$I$I$I%)$I+$I)I$ Y$IJI$J'LI $I%dI%)$AJL2JRI$VI$RI$I%,I $I)ecwf- Ws#kO-O{ WLfp;fm>Cx)gu Co 8xo&= sU:wR}nɒWHdI$,I$$H)I$JRd$I$I$I $I%I$JY$IK$2 RI$I$$I)I$HRI$Ih9I$RI$I%)$IJI$RI$I%)$I+$I)dI)$I*I$R$ RI$VI$RI$I%,I$&N)$I*I$R'I%,I I$I%)$AJL2JRI$I$JI$I)$I+$I)dI)$IJI$J$JRI$I$RI$I%,I $I%dI%)$AJL$I$VI:dI$$IK$H)I$JY$IJI$JI$I$I:dI)$IJI$J$JY$RI$I$$IJL$I$I:I)dI%)$IJI$)d$ s%¤%¤%¤%¤%¤%¤%¤%¤^%$%ä%ä^%ä%$%$^%Ĥ%Ĥ%Ĥ%$^2AOhI/hIOhIOfAOdRI/dRIOdRAOdq$Iq$Iq$Iq$Iq Iq$Ir $Ir) Ir)$Ir)$IrI$IrI Iri$Iri$Iri$Ir Ir$Ir$Ir$Ir Ir$LtS$tK$tSӤSӤSӦ\I)\I%\H)R\I)S.m$.m$.m$.m$8Iz4˝I%=KI%=KI=KI$KI%= KI%= KI= KI%=u$%$%$ endstream endobj 1 0 obj <> endobj 2 0 obj <>stream h޴ZrƖ}Wi<ʼnOʼnOT25ED Zߘk %9G:5sJUbݽoW6շ7W޺Yvhg,#I7\4a"|vW/EhI/c8+v)*bǩ*qFfؓpWl2N^)io&!y> w(D*C HXv)S.hF҉d}:]ϫR**z~o.T"Ϫl?%4'o.X]ɠwK)[tEUѮ_h?.pM);-*,Q1nt}]qwlխH8Z]rltGD::8Ys]m:8BudǐE~c fQ9b^ökhwi/4BBO}&u<{rdsD3or%6rENQ+9jj.l|{5*:i$x'Y 3h&q)%ҟx܋l(M\B$2!q5J MNȣyUeOSs <(o0#%cy!D<)Sxᮃ8Mbv}ڥ"Nn#+=AeNWLל!ګKFLt;9L-@'xbb ޅj -_R ±YxeS&/8;`Лg[l()!4$puA\QU$@!/Vق**]d1j*dKDN݀D=%]k A (!:߳E$"c8*L0bm.+?+LK0Ԝa6DvquI2dodhmj$Ń>֜:8HWP1 >&ֵ}bhIVK4zLcKU.GjXu|kT۷08Hr3<ʶwqő a+2?I娤L\* {(!Trghg n+$ +?wQϼ xv(OKeȐ錞JU Dy#hbӲ A;RSW,snf:;FBe:}"CQ")ǰĦNДh`އu*Ȩs"d(5O83- 6_5w?`d򀍒VI9Lk$A>AHJx%㩥P~KN "(S NtC+QOq@ ly4X3hVօ-55MM'%s , 4ʼn'~`%g(?1}ME'l4oCX֤օG g!h7~glox?S Kn 6dcxhFʖٜ;Hj^AG:I(4W\:'R~y Z2܈?kJ5f3e牅<\lB*=NS߫zȜiE셰Vwbk^^vC]hفlE4=y 6 3CAnwל#2Ư"轫i'Mg1,r¼Wh+(,9-{g* ifFz'pS!Ddgj;g@+9}1 7u'L m Mi Yg|:suUTzkh5ӈto.d-C_g3=OY-c [ ~Ò+ QCDڛHn\f sFF S[))5/j/0|)\U[/}rѼQl7=a!B+)[$&Z,x9[R P ߲(ڧ1h,LWF9Rőq:Xqaecv3$9*(LdW*&}4]55{uJ߃0eƓeSan*e^jV3'xNfNFO4ύUu?tx➝mj7~OTTA/,X*{A`^HucH>SKӭԲ"C+[ۇҟ |CH%,۳"مqyu"`1рJkՉDΓB^N4~L;_FZ8+_ٯn7Q7 W3υƩ SyɄ WgNL:M/[jm; k`-=F 9X [͵-`Kjup\2FCH#[4ѰaGf0c( Ľi ihך˞1!4+UJ夨 #3|wFW k&d&2XouYݨ깴:6Z4.1/ '݇)FM[J>/Filter/CCITTFaxDecode/Height 165/ImageMask true/Length 371/Subtype/Image/Type/XObject/Width 274>>stream &x2 iAh_E=<0 ~-6mPmA>=]b`x/.{??^᭿vooo#_!9 ~{~{~{~{~{~{~{^_{說{zZVC_J·|J; Kw_j~lɼ0 [?8/N)“' N.~O_NFÚ4 N֤)S!ZzDE endstream endobj 4 0 obj <>/Filter/CCITTFaxDecode/Height 126/ImageMask true/Length 276/Subtype/Image/Type/XObject/Width 121>>stream &x,H d@A<"Lz ) ނ  &Mz^zM?M>?ޑD>ї@$¾_@"O%$U/K_J^_}ƫIzꗯZI~*^Z^wI~kJKK--]Ղ[Bw m{L& 8jo~{{a2 .a@0  JCjClK  endstream endobj 5 0 obj <>/Filter/CCITTFaxDecode/Height 108/ImageMask true/Length 205/Subtype/Image/Type/XObject/Width 159>>stream & 2<:A[ql޹ -fW ce#PxA޺|gm ^ڇ߫H7{kWLdH $ =>/Filter/CCITTFaxDecode/Height 162/ImageMask true/Length 150/Subtype/Image/Type/XObject/Width 153>>stream &$ /og{{Z׭zZ_Chx].K}oo! @@ endstream endobj 7 0 obj <>/Filter/CCITTFaxDecode/Height 105/ImageMask true/Length 266/Subtype/Image/Type/XObject/Width 152>>stream &H8k _0_aai~_A~_ᆗh/a/i~__A0K l _KKh/L% RA~Tn_/ k>o&Mp&oAiA a7HC&A 0IM  &I7L?o &!1A endstream endobj 8 0 obj <>stream hތAK@n6QJUS tZ HwVxy섉DA(~5(\>os_Wq&5txG,=-Q?ht9Ҟ y_v 6; y@Ϥ!)3y4`>e endstream endobj 9 0 obj <> endobj 10 0 obj <>stream hWnG+`FQ7X_(e0Ie򍩥g1mRV`WU.M~x-TݻEl3T€ocoS ]_Zg_u׸,ިW}۬nVujױJM8q{ynwuc\@v΋I3G͸\7E2VmOn_gt9Bf\; r‡??эxaH JSw`#&&a$[(+z0ꀈ{ѩ徧"fbۚ#}kKUcZl 6MOhZ#1zyP!nx" M֡WH>Tz/1O2H T Tx*@]: U򭦓jb%gF' jV?D@MI ͑BR~D R 0"'HT$ۀҡ6 äG )#`Ҹ4PρrדϣT!) |-zqawēw=!._0[n>/w?fQ_X18EJ Vn*V`(X8KuRIm:`ƎjHǞ#AC^)Uv=eB Qu |ECaulga6 k%& zpRXGwۙn2sjq&Y}wGz'x="dq0TZ͂ѪY1y3@ڔ9!U'n=٣zb  bc,Q@cgd(AˉDk%h9!.pH#j^`Zcq }x!vA0HaJO='*UpL LvfhAkB@"D->stream h20U0Pw(q.I,I݃  ́2Avvny%@Q7c1HP?$H (?98$Z?M?$$ A] endstream endobj 12 0 obj <> endobj 13 0 obj <>stream h endstream endobj 14 0 obj <>stream h20S0P(ON-pq0MH endstream endobj 15 0 obj <> endobj 16 0 obj <>stream hUnH+x. =st8>K-,.$Q iƭ!eADžGwuuU)w?q*P\ύ-\Ru9bݍ*En exe᮴ޖ@¢) ^0QZ|=4F4V4ʖ\ 倧4pW8Vf 2@ aqW/o}j4\ac5Dzy~úƙcNZ{C!8 2, &7X\9E m_4O vJr*%>stream hެKKC1,ua23\PjqQJZ B+5BNr2!|J(%HY~ZfJBU WCU1&Ⱥ09`T(E}X_ u[~Un# q(,& cSٞM-N_gkޗvZG4E`h‰C]z%󑽣Ե^ɹFmfrFҊ١v\lC˙!LkZ%pQ"Kd|:&Ȭt-Y&=mրԡkNFC[28M unsG&E%W3(zbw>7e8)ϥp/s}Mceف>g\)Ch֫Ť-3;ݔy 0&qG endstream endobj 18 0 obj <> endobj 19 0 obj <>stream hޜY[ ~_aiTĊF]}d-(r΃֖cBw_~$G=AV!C~H'2޼_ݼv,"r\ƕ~:$/Ɵcտhv.;7jr$685(2ܵt);YaC"K)uכ4]( iD]}~}W)}T]m}ΕSeSc7 -I~s\Om߱"VTep.*W Yf- Zc9l;F˴̦_M7əM3яSWf!ŜnjM;r$ ©U=dm?'+ּvo;GKKBhL %M{SӱtVܓZ?uKՐLmjU\-smD [7-[Z'7z3ƴtV h=*9yЈ34FX1I? Gi6u9:HԬIPS3@^.zMt w.M&p34g*|@Gvhy=[78 .~R*lؿ?5?)Y.yL;; Q2҉u81o4 ɂw 'WDh[}i2^Z\gzQbΎn,-2ʉY 4[JHS9 {3b7cM7t:0Mhg HhyRj&*hx-Vzb-$aiAYnQOCK =J |ԕ_ XU*N5;nZO֛:B%l%8s~#+‘!3Bmu":!. kM:E[^YIsYQ2ql/Y"'n$Ɣ/̈S4n3A&:0|SjM `4$d>ԧQ$&OC8 'ɰ ޙCs='YKn͖d_6y$l'Jghe9;GԈpZqseOq0ޝdqnJIϴ YIOnj{m?ӮL¡Á0@Hl=8]O QKשƙh(P-OS$:F #z ϸҸ:!rH$#!dz'ːd$ТdW戟̲?6YY?&-3 ٞ2;NW lm9v@RJd-AN酡\ { e /|~HQ'Gy=oP;31Fc>8x)'PRNƁ"1cCyo]%>]*Ě78SԳ)c ֫is6m-شNj)?<3,Aa)ۖdT{yYJ )1}us^ɩ]πXh64)c!b\+7eBm#RsPij83MnPȴ,_;=e{8eQƦLeM9{θY|R·OiOH3 gw+o@qu^rAZ ҊOfȉRQń墬e3Phxkꫀ3iPonuYƥ1 4 "7T}Y 4Y eġoqIHh\uLT4c V7ԋHЫJ}{Nmv[5S=ř7~jtpo?@G3_#yv$T^ rVFiT; :蟰O_lognϑt<7ո}J6Jk\2`*:2RKomWKfI蹀ءrJQ``K+cN[j@#r 8*x~`sF*6ZEVNU!Ġ8HWkȜ EcGh߳1ltd88H8I1*t/BX|/e_evsۢ%#3[ hSGpwYfnՉvoC7d ep4C81v6^~nFrA$:́ӕy˞3}=?,7CciJ;D 4Ȇp(f}X/`SQFե9rJ9U*K˘mDyU:2ыb,x }Jdr ジ@8=- D=jj<̆n7<ۢ2mBb6_Űj[<8EN^A 8(,k]q&+J2-,"~fEѮ_Q}#*b8'T}79lc9𸂣E`#/;齭[cť0'@,bl=hV"-ɲJ !dg<_y s#ż~pOm]/H8Ns3~wl?G? gʜ\@#/%Ͽ!@:W+i=k_]0j%&!yYo;|ϵGh5s-G\B 7)w((;ڡHwe ` endstream endobj 20 0 obj <>stream h,1 &q0UӁ[GJDZx"=% ˲:Y4Ac^h)gN/s&aډSHWTBx[% endstream endobj 21 0 obj <> endobj 22 0 obj <>stream h|WnF+)BLкhtSY]e)Hl;=G€yݹsOVrmnUѯ _׹`L^iUWyQlA~qYȝj.j> }KU^C@&i:UzVU\^u]^eńn%٨څa݉1:C!r;/L0Wc76e|3"i}w:uJBK5iu;vm2>ryYg5&kla'Tؿ}8LuV V_unedQȅ2[cM$>hl)5@:w|dx^ÊqjO!l̲',Y3N 8jbeY }z(hq<Y^ [&vKn)ҚQa-?!ӨG%Ql̒'N$Rc_=iU痃 XyYqi,;^p4_  * كS laTm|rnItQ[2:<貤H#œBFbzCug(|%˨{jo|'"A$k4fxD"^X[8Ȯ,=xPʡ\AZLDu=Y& $< ːS$bpqselﵬDq#>$E0ې.*vDcHP-m"U B@Gl41YN5 Tb{L+Qxg0Fn3 tF1t9qm;Sj{ȿC{,ut`tE ˅"}{P3,:^o콀©EE[q8u=.mDB $ndc$n1 $v98Zq NmtwD,#-ujS_+HNǧ X{FWPK݆Z.SحKF?JK^8y|>DZNZTNIlM쫓rQL2NKS&Ώ2%=HyHXۙz@PVSA0DG TZ~ӴW2dDK[ֹA(zhYEʅEheqaņI4o&[pU&s U endstream endobj 23 0 obj <>stream hެOK1ſ`23C5Fޤz.{y 02 0TDBU 침LQbba-˸o=p7iBFAAr_gOÇ17Eh<(̆U=r 2bt8g;({->:`<' =y9.M==%{Fϴxȫ.?T# f_z6Mq%mM n-8£{W>ɻ|o=.^/[ݧC5ͯv9 endstream endobj 24 0 obj <> endobj 25 0 obj <>stream hެWɒWXPT O#iɼ(:pIHD=Ao^&f3>9:تry2_ngw~fg͓Ef%5EEk6l~x*g[Wdl6rS»w 7d^>fuY83b4y o;\ٷY-y>].9d>yO'*bqV5XgE]ڧ94>3wVzW%8PTΫvnOB,*8`KZg0a>w)Qȫ<9;դ/ k \5&Xe֍k5\d  ȂYOÒF7C ]WoGG*uV1&2A:@kp7k2}NMV2=9}ʴk d| =4|zQy>wU b{=/C7D_AѾ9O~53ԛ>cھ"h37n=lH| D`I cqX"Ƞ0|h[K\1j' 4`~ XxE  jF lxr J#|Po,J.5\XHNo@E E9E0IvX$ )R䊯};ߛZ;0 J$¹/=ݡH:5s\CjZfg^Q/Y]w~M̻崫;a@8Է? !iSYHZ0`8AsdvѰbP-CWؼNR RQVwi 8WM$WbvBrOeNד^e~F_Th)1-A8:)I|Ib=d.+M D^UJ*76wY4pDcBlE/ʒbp0g}5FZXbcyQO?Ω+|#%z"haS{BKtv=2}9vkL-֭~Uj^j%J$Kٺb erwFE wl_~kme/_v 1ll=&̻FږML1] %:JXޥ|vس[Kdt&HXF<w g%"2f@hdzeʠmЗLͱ1o y8 +d̯*|ΘMD&d$l^uK^xs3 7f:6;|a(]۱WwF e 2"$?zqRtxR>TgY} (Xn@ Lrc18|;ߍhn:1jVΞ":ḑƼ?WzBiMVضJ\!L*9f,_@5+= it_3NW:"8oJ!"o0[TIX>_UߝҭEf@ #~M?ȉr=N@NUfcb/U[IY =kWdrф=6yprݟttOSS_c(㡹:p\*+,ZffV$?撷]sm6ǯXi%ʨQ^BtKr1~>stream hޤJ1_ez0$]( J^„rEWJ@;K=@ ! {7;> 0 tuM.xzZhgϧهͶ9wp RL\:SC8;`f#8S<;O ]s%t&`˷lXyh"\:"tF`c8PmD;gF?USy z˦l=I59m@b.㘽f~V#c}MvmӮ> endstream endobj 27 0 obj <> endobj 28 0 obj <>stream hXr7W8s}r$U.+UXE$%|R%13P"K)U э^Kwd Ν 1͢PKkZx"p)qIȊ_MPOx(Z("xa4yYOIʧ5 ;/EIu~:{9lAxUI/liCUE#22nT-zS'gt饐V<QF>,WM6xu9a$&"qHXdQ蠤Ngibړe]nK(M J֒TH}_h }HͷLCrAV7x ˴USb536YNCFؗ7C􎄳B ɗub6+Nڱ%m!<4[IMFYh=r2b5~WRip]5KIqR5"Xb=o d*M-Ƀ&a ǀB;3Na(NN72cփv7YY}P䎪 f.i 4l_cx ,, 96revU9%Lhiq 'D7,w'L`*~v]/&v1DmDC\Mv7t&h4B>)Kƕ C-1Qr`k2 >ƣ5GSLG`lJV·j$6r {DJ4if͐y(7}FRVSfMF̳& m4IFeyY+5ήFusz܎+Y4u5y(=^uʵo}(ŷY'sMB[fX{G?1ǟF(wEׁ7!zB1dzglJjr [VS[j-~Ҧ3Em5]y0M`A0XzfZ 4g6$U%x-TShNfhm9BwO~Fk7j|\Oj_ T8KZh\P֞<]B 5!=R*H7`pLVnqe{zvTIKN!_l{% QƏ^ 8тNh3Z0?\{7v́J[nz6|?Lz0Á_:^^a$2ؾ}ވkb#}͗9_\E =p7ċtԍ4и-Igs;B~^1)POL^%_yLDOâgW$D|2`< -{p:>stream application/postscript Adobe Illustrator CS2 2008-01-31T11:13:17-05:00 2008-03-04T09:21:12-05:00 2008-03-04T09:21:12-05:00 164 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACkAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXkev+WvzdsPP1zrek63I2h6tqNjbjThLLdCGyaJYrhlt5YGhtTG3OYurtzPEfDuGVRPkry3+f2n 69pTeZvMunaj5etgy6hbQrS4kH1NY4/ja1VnIuQXLeohPU7HgFXqeKuxV2KuxV2KuxV2KuxV2Kux V2KpNb+btHubeK4gS9kgmRZIpBp99RkYVUj9z3BxVCaDeaFoeiWOjWUOofU9Ogjtrfnp97y9OJQq 14wKOg7DFUcPM+mkkCG+22P+4+++f++cVSqyOgWnmXU/MEa6kbzVYLW2uIzptyIwlmZTGVK2qyFj 67VLu3YCgGKpr/ifTagejfVO4/3H33b/AJ44qkms23lzVvMeg6/cjVFu/Lr3MllHHp90I2N3CYJP V5WzSEBTsFdRXc1oMVTs+Z9NBAMN9vsP9x998/8AfOKpP5wTQPNXl260K+bVra1uzGZJrSyvI5h6 UqyrxZrd1oWjANV3G2KpwfM+mgEmG+oNz/uPvv8Aqjirm8yaYylWgvirChH6Pvuh/wCeOKpH5HtP LXk3yvZeW9LGqzWFh6gge6srySWkkjSkFlt0FAXoNumKp4PM+mkVEN93H/HPvu23++cVSjSE8vaV reuaxbrqj3OvzQXF4kljeMiNb26WyCIC3DAFIwTyJ36UG2Kpv/ifTakejfVG5/3H33f/AJ44qlt9 J5dvde0vW7iC/a70hLlLJf0dd8Va7VEeSpt+fIIhUUYCjGoJ48VUyPmfTQQDDfb7D/cfffP/AHzi qQ+dLHyz5v0qHTNTGqxW8F1Beo1tY3iP6ls/NAS9s44167Yqnk/mzSIIJJ5kvY4YlLyyNp98FVVF WJPo9AMVTQXNu07W4lQzqOTRBhzA23K9e4xVUxV2KpV5T/5RXRv+YG2/5Mriqa4qtT7Un+t/xqMV XYqtP98v+q36xiq7FVr/AGo/9b/jU4quxVbN/cv/AKp/Viq7FXYqti+yf9Zv+JHFV2KrR/fN/qr+ s4quxVa/2o/9b/jU4quxVKvNn/KK6z/zA3P/ACZbFUXJ/wAdW3/4wT/8ThxVFYq7FUn8pwxf4V0b 4F/3htuw/wB8riqbejD/ACL9wxVYkMXKT4F+14D+UYqv9GH+RfuGKrDDF6q/Av2W7DxGKr/Rh/kX 7hiqx4YuUfwL9rwH8pxVf6MP8i/cMVWTQxek/wAC/ZPYeGKr/Rh/kX7hirvRh/kX7hiqyKGLifgX 7Tdh/McVX+jD/Iv3DFVghi9VvgX7K9h4nFV/ow/yL9wxVY8MXKP4F+14D+U4qv8ARh/kX7hiqU+b IYv8K6z8C/7w3PYf75bFUdJ/x1bf/jBP/wAThxVFYq7FUn8po3+FdG/eN/vDbfy/75X2xVNuDf78 b/hf6YqsRG5SfvG+1/k/yj2xVfwb/fjf8L/TFVhRvVX9432W/l8R7Yqv4N/vxv8Ahf6YqsdG5R/v G+1/k/yn2xVfwb/fjf8AC/0xVZMjek/7xvsn+Xw+WKr+Df78b/hf6Yq7g3+/G/4X+mKrIkbif3jf ab+X+Y+2Kr+Df78b/hf6YqsCN6rfvG+yv8vifbFV/Bv9+N/wv9MVWOjco/3jfa/yf5T7Yqv4N/vx v+F/piqU+bEb/Cus/vG/3huf5f8AfLe2Ko6T/jq2/wDxgn/4nDiqKxV2KpP5TMv+FdG+Ff8AeG2/ aP8AvlfbFU2rN/Kv/BH+mKrEMvKT4V+1/Mf5R7YqvrN/Kv8AwR/piqwmX1V+Ffst+0fEe2Kr6zfy r/wR/piqxzLyj+FftfzH+U+2Kr6zfyr/AMEf6YqsmMvpP8K/ZP7R8Pliq+s38q/8Ef6Yq6s38q/8 Ef6YqsiMvE/Cv2m/aP8AMfbFV9Zv5V/4I/0xVYDL6rfCv2V/aPifbFV9Zv5V/wCCP9MVWOZeUfwr 9r+Y/wAp9sVX1m/lX/gj/TFUp82GX/Cus/Cv+8Nz+0f98t7YqjpP+Orb/wDGCf8A4nDiqKxV2KpP 5Tmi/wAK6N8a/wC8Nt3H++VxVNvWh/nX7xiqxJouUnxr9rxH8oxVf60P86/eMVWGaL1V+Nfst3Hi MVX+tD/Ov3jFVjzRco/jX7XiP5Tiq/1of51+8Yqsmmi9J/jX7J7jwxVf60P86/eMVd60P86/eMVW RTRcT8a/abuP5jiq/wBaH+dfvGKrBNF6rfGv2V7jxOKr/Wh/nX7xiqx5ouUfxr9rxH8pxVf60P8A Ov3jFUp82TRf4V1n41/3hue4/wB8tiqOk/46tv8A8YJ/+Jw4qisVdiqVeU/+UV0b/mBtv+TK4qmu KrU+1J/rf8ajFV2KrT/fL/qt+sYquxVa/wBqP/W/41OKrsVWzf3L/wCqf1YquxV2KrYvsn/Wb/iR xVdiq0f3zf6q/rOKrsVWv9qP/W/41OKrsVSrzZ/yius/8wNz/wAmWxVFyf8AHVt/+ME//E4cVRWK uxVJ/KcS/wCFdG3b/eG2/ab/AHyvviqbekvi3/BN/XFViRLyk3b7X8zfyj3xVf6S+Lf8E39cVWGJ fVXdvst+03iPfFV/pL4t/wAE39cVWPEvKPdvtfzN/KffFV/pL4t/wTf1xVZNEvpPu32T+03h88VX +kvi3/BN/XFXekvi3/BN/XFVkUS8Tu32m/ab+Y++Kr/SXxb/AIJv64qsES+q27fZX9pvE++Kr/SX xb/gm/riqx4l5R7t9r+Zv5T74qv9JfFv+Cb+uKpT5siX/Cus7t/vDc/tN/vlvfFUdJ/x1bf/AIwT /wDE4cVRWKuxVJ/KYl/wro3xL/vDbfsn/fK++KptSb+Zf+BP9cVWIJeUnxL9r+U/yj3xVfSb+Zf+ BP8AXFVhEvqr8S/Zb9k+I98VX0m/mX/gT/XFVjiXlH8S/a/lP8p98VX0m/mX/gT/AFxVZMJfSf4l +yf2T4fPFV9Jv5l/4E/1xV1Jv5l/4E/1xVZEJeJ+JftN+yf5j74qvpN/Mv8AwJ/riqwCX1W+Jfsr +yfE++Kr6TfzL/wJ/riqxxLyj+Jftfyn+U++Kr6TfzL/AMCf64qlPmwS/wCFdZ+Jf94bn9k/75b3 xVAfmBJPH5d1eSCc206aPqLRXAuBZmNxGhVxcnaGh39T9nrirDP+cZtT17UPy9kl16a7n1NLxllk v7i7uZipgidCWu/s1V60iPD6ajFXrWKpP5Tdv8K6N+7b/eG2/l/3yvviqbc2/wB9t/wv9cVWI7cp P3bfa/yf5R74qv5t/vtv+F/riqwu3qr+7b7Lfy+I98VeafmF+UOseaPMFxrmleYpfLl/LZW9nDe2 lvW8iNvLK7cblLmFvSlWch4gBUhW5fDTFV835XeaJdSaefzhqUtrNey3IthJdxGOKS8NyII2hvo1 4+j/AKOeSEcQCgT4gyrDdL/5x98/PpGkrd+fNTs9U0e6vTbXCmWZhbNwhtUSt7wReEHqFaUpIUoO NSqynWfyh803ukXttH541SC7bVr3VNPv6yPJa2t3atbpZJW5+JYi3IPUd+KqTyxVT0z8ovN1nb6o +o+arjzDd6jFbxFb0TxRcYLtblkKm6uY1SQc4zxjqFIoR8RdVuy/IqKz17yzq0OplT5dtrC2aEWq UnNgkkfq19aiu6SBKlW4rUDehVVjtj+Q3n2G4FhF541ODSbG1P6NlR5xHHdSpLat6cC3vNfRiWOR f3nAOzcV4koqrOPKH5eeZtD812+sal5hudehi0xrAi6Lh1l9HT4mdFeWdaTPYSTSU4nk+/Pc4qz4 O3qt+7b7K/y+J98VX82/323/AAv9cVWO7co/3bfa/wAn+U++Kr+bf77b/hf64qlPmx2/wrrP7tv9 4bn+X/fLe+KoXzrcRW2j6jcS2lvfxQ6VfyPY3kkUNtOqrGTFNLP+5SN+jNJ8IHXbFWKfkDeWV75S vLqDQ9K0Kd73jeQaHe2l7aSzJbwr64FizQQMygAxDw5H7WKvTcVSfynNF/hXRvjX/eG27j/fK4qm 3rQ/zr94xVYk0XKT41+14j+UYqv9aH+dfvGKrDNF6q/Gv2W7jxGKr/Wh/nX7xiqx5ouUfxr9rxH8 pxVf60P86/eMVWTTRek/xr9k9x4Yqv8AWh/nX7xirvWh/nX7xiqyKaLifjX7Tdx/McVX+tD/ADr9 4xVYJovVb41+yvceJxVf60P86/eMVWPNFyj+NfteI/lOKr/Wh/nX7xiqU+bJov8ACus/Gv8AvDc9 x/vlsVQHn8Wh8vasLy0jv7Q6PqP1ixmuVso5o+CconumKrArjYyEjj1xVLfyVaH/AJV5p62ejWug 6YjTLp2n2eqDWoxF6rFmN4gKMWlL/CrvQU3Bqqqs5xVKvKf/ACiujf8AMDbf8mVxVNcVWp9qT/W/ 41GKrsVWn++X/Vb9YxVdiq1/tR/63/GpxVdiq2b+5f8A1T+rFV2KuxVbF9k/6zf8SOKrsVWj++b/ AFV/WcVXYqtf7Uf+t/xqcVXYqlXmz/lFdZ/5gbn/AJMtiqUfmV9Z/wAKa59W9D6z+hNT9H636H1f n6acfW+tf6P6dfter8FPtbYqk/5AzaxJ+V+lpq1vawXUT3Ch9OOnfUZUM7ur236Ld7YKOXBqBTzV qjuVXomKpP5TRv8ACujfvG/3htv5f98r7Yqm3Bv9+N/wv9MVWIjcpP3jfa/yf5R7Yqv4N/vxv+F/ piqwo3qr+8b7Lfy+I9sVX8G/343/AAv9MVWOjco/3jfa/wAn+U+2Kr+Df78b/hf6YqsmRvSf9432 T/L4fLFV/Bv9+N/wv9MVdwb/AH43/C/0xVZEjcT+8b7Tfy/zH2xVfwb/AH43/C/0xVYEb1W/eN9l f5fE+2Kr+Df78b/hf6YqsdG5R/vG+1/k/wAp9sVX8G/343/C/wBMVSnzYjf4V1n943+8Nz/L/vlv bFUH54e0TR783kbS2Z028W6VfqYIhb0lkY/pErZ0RCWPr/BQbg9MVSn8mdS0i68mLa6VKk1rp1zP bhoxpKqOb/WFXjosk1kCqTqG4cSx+IqK4qzrFUn8pmX/AAro3wr/ALw237R/3yvtiqbVm/lX/gj/ AExVYhl5SfCv2v5j/KPbFV9Zv5V/4I/0xVYTL6q/Cv2W/aPiPbFV9Zv5V/4I/wBMVWOZeUfwr9r+ Y/yn2xVfWb+Vf+CP9MVWTGX0n+Ffsn9o+HyxVfWb+Vf+CP8ATFXVm/lX/gj/AExVZEZeJ+FftN+0 f5j7YqvrN/Kv/BH+mKrAZfVb4V+yv7R8T7YqvrN/Kv8AwR/piqxzLyj+FftfzH+U+2Kr6zfyr/wR /piqU+bDL/hXWfhX/eG5/aP++W9sVQnneOSTRtRjjv00uRtKvwmpSTNbJbnjHSZp0IaIJ9ouPs9c VSL8l11D/D2oSX3mq282ySX7FL20vhqMcEawQotv6ypEoZQvIjgKluZ3bFXoGKpP5TlX/CujbN/v Dbfst/vlfbFU29VfBv8AgW/piqxJV5SbN9r+Vv5R7Yqv9VfBv+Bb+mKrDKvqrs32W/ZbxHtiq/1V 8G/4Fv6YqseVeUezfa/lb+U+2Kr/AFV8G/4Fv6YqsmlX0n2b7J/Zbw+WKr/VXwb/AIFv6Yq71V8G /wCBb+mKrIpV4nZvtN+y38x9sVX+qvg3/At/TFVglX1W2b7K/st4n2xVf6q+Df8AAt/TFVjyryj2 b7X8rfyn2xVf6q+Df8C39MVSnzZKv+FdZ2b/AHhuf2W/3y3tiqRfmvFM3ljUbhNRbTo7PTL+5uG9 K3nhlijjUvDcJcW18DEw+1xiLfPdSqgP+cf5Gk/KzSmU2ElsZLr6rPpYmS3lj+syfGIp4bVom58g V4AbVFK8Qq9ExVKvKf8Ayiujf8wNt/yZXFU1xVan2pP9b/jUYquxVaf75f8AVb9YxVdiq1/tR/63 /GpxVdiq2b+5f/VP6sVXYq7FVsX2T/rN/wASOKrsVWj++b/VX9ZxVdiq1/tR/wCt/wAanFV2KpV5 s/5RXWf+YG5/5Mtiqh5p0ca1az6QzRrHf2V1bzeqhljaORolkR0V4mIdCVPF1O+xBxVZ5H8rf4X8 vx6Or27RRSSyRpZwSW0Ces5kcJHLNdybyMzfFKetOlMVT/FUn8pwxf4V0b4F/wB4bbsP98riqbej D/Iv3DFViQxcpPgX7XgP5Riq/wBGH+RfuGKrDDF6q/Av2W7DxGKr/Rh/kX7hiqx4YuUfwL9rwH8p xVf6MP8AIv3DFVk0MXpP8C/ZPYeGKr/Rh/kX7hirvRh/kX7hiqyKGLifgX7Tdh/McVX+jD/Iv3DF Vghi9VvgX7K9h4nFV/ow/wAi/cMVWPDFyj+BfteA/lOKr/Rh/kX7hiqU+bIYv8K6z8C/7w3PYf75 bFUdJ/x1bf8A4wT/APE4cVRWKuxVJ/KYl/wro3xL/vDbfsn/AHyvviqbUm/mX/gT/XFViCXlJ8S/ a/lP8o98VX0m/mX/AIE/1xVYRL6q/Ev2W/ZPiPfFV9Jv5l/4E/1xVY4l5R/Ev2v5T/KffFV9Jv5l /wCBP9cVWTCX0n+Jfsn9k+HzxVfSb+Zf+BP9cVdSb+Zf+BP9cVWRCXifiX7Tfsn+Y++Kr6TfzL/w J/riqwCX1W+Jfsr+yfE++Kr6TfzL/wACf64qscS8o/iX7X8p/lPviq+k38y/8Cf64qlPmwS/4V1n 4l/3huf2T/vlvfFUdJ/x1bf/AIwT/wDE4cVRWKuxVJ/Kbt/hXRv3bf7w238v++V98VTbm3++2/4X +uKrEduUn7tvtf5P8o98VX82/wB9t/wv9cVWF29Vf3bfZb+XxHviq/m3++2/4X+uKrHduUf7tvtf 5P8AKffFV/Nv99t/wv8AXFVC9uRDZzzPG3CKN3anGtFUk98VU/r93/1bbn/grf8A6rYq76/d/wDV tuf+Ct/+q2KrYr+64n/cbc/ab9q3/mP/ABdiq76/d/8AVtuf+Ct/+q2KrRf3Xqt/uNufsr+1b+J/ 4uxVd9fu/wDq23P/AAVv/wBVsVWvf3XKP/cbc/a/mt/5T/xdiq76/d/9W25/4K3/AOq2KpT5u1G4 XyprTPp1wqiwuSzFrfYCFqnaUnFU5k/46tv/AMYJ/wDicOKorFXYqkHlTVdLXyto4N5ACLG2BBkS oPor74qmv6W0r/ltg/5Gp/XFViatpXKT/TIPtf79T+Ue+Kr/ANLaV/y2wf8AI1P64qsOraV6q/6Z B9lv92p4j3xVf+ltK/5bYP8Akan9cVWPq2lco/8ATIPtf79T+U++Kr/0tpX/AC2wf8jU/riqC1vV tK/Qt/8A6bB/vNN/u1P99n3xVV/xP5a/6u1n/wBJEX/NWKu/xP5a/wCrtZ/9JEX/ADVirH/N0+na 9on1HTfNsGiXQuopxfW86l+MMwkaIhJoSVkC8W+LocVYBa/l/qls7cPzTAjmSZJI4LieCGNphOxl jha+m+IyzI2zrTh8JAJGKq935Fnm1XWLq2/NBbWTUZIp4uEkheEqJI61+vcSSjBfhVU+H7OKojXP IkOp3dxfx/mP9T1F5GNpeRTtzt4nmWVo41N3w3VTHsoAVjQCpxVmPlCbSdA0eDT77zVb6xciQvJf TzqHcmOjEh5perAnY03xVP8A/E/lr/q7Wf8A0kRf81Yqk3nTzH5ek8na7HHqlo7vp12qIs8RJJgc AABsVZDJ/wAdW3/4wT/8ThxVFYq7FUl8kf8AKF6B/wBs20/5MJiqdYqkfmm680W2mNJ5atIr3Uvr MKtDOQE9BiombeSDdUqR8X0HFXns/mL/AJyKhEAh8vWEj3LzEiYI/pUt0mjj5Q3iLT1BLFV6D7NW JpzVTPVNU/O6PWr4adpNpNYKblrAyeieSpDALdP96om/eTNIX5UpQAbdVXXV9+ecl8bm30+zht4b mCOOw/cuk1vIgE8kkhuOYMbMSOJX7P2WHVVlfk+4823GjQS+a7aG01d5C0lvb8fTRWj5BQVkm5cS SteW9PpKrIMVSrzZ/wAotrP/ADA3P/JlsVTXFWMec778wLV7M+U9OtL+Nq/XhdPwZR60KAR/vIgf 3Tyvuf2KdWGKsbstY/PIyxerolgI2M/r/wB2FBjuKRhKXjN+9hqamtD2FKMq9LxVKrb/AJSnUP8A mBsv+T13irCb3Vfzzlvnjg0aytrEXMixyxvE8pt0ef02Jkn4/vEWGv7uoq3T9lVUh1X87XgtJLjR 9PiujxaaJSpQEoOaf71Magh+JDU3FQabqoOLWvz7S4tLc6FaywSIJLu8kNspjb4mKAJemv7K09M0 G/Njiqf3Nz5pufyv1mbzPaw2Wrvpt2Zra3pwT/RjUVEs4+1Xo+Ksqk/46tv/AMYJ/wDicOKorFXY qxTyXoNi/k7QXMt2C2nWhIW9u1G8CdAJQB9GKpz/AIesP9+3n/Sdef8AVbFVieXrDlJ+9vPtf8t1 5/KP+LcVSbzXqPlLyraQXWs3d/FDcSGJDHdX8p+FGkdiqSk8URCx+4VJAxVJJvzA/LCFJLiTVdQW K2ma0uCJdVYrKQGReKszN6gpw4A8iQBvtiqf+Xb3yf5jS4fRtQvLn6oyJcqbrUYnjaRBIoZJXRhV WB6Yqmr+XrDlH+9vPtf8t15/Kf8Ai3FV/wDh6w/37ef9J15/1WxVK/NWgWK+WNYYS3lRZXJFb28I 2ibsZaYqmn+HrD/ft5/0nXn/AFWxV3+HrD/ft5/0nXn/AFWxVB3thomm6dcX97cXsdrbB5JnW8v3 IUMeiJIzMfZRXFWIv+ZX5VLcR2y6tqL3MiW8vo+pqsbJFdTCCN3EpTjRz8S/aUVJG2Krk85/lk8s N7ZX+oXkuorDHAYZ9SDSRrIlGrJJGvBPrisd+haleJoqpR/mh+U7BfU1bUoG9MvIkr6sDGwiM5ie hP70RgtwFTT5iqrN00TTJ47eaKa9aOWjo3129FVZCQaGUEYqrf4esP8Aft5/0nXn/VbFUm86aDYp 5O15xLdkrp12QGvbthtA/UGUg/TiqeiFI9ZEgClriGQs3BAw9MxqAHCh6Gu9ScVR2KuxVIPKtlq9 t5X0e2aeFWgsbaMgwsSCkKruRLTtiqa+nqv/AC0Qf8iH/wCq2KrEj1XlJ/pEH2v98P8Ayj/i7FUN qehLqsKw6nFYX8KEskdzZ+soLKUJAeRgCVYr8jiqV3XkHQriJrV9O0xIZnFxIIbP0WMsZHGTnFKj ch0rXpUdDiqY6T5dh0eJotKgsLCN+PqLbWfpcuChFLcJRyIVQAT2xVGPHqvKP/SIPtf74f8AlP8A xdiq/wBPVf8Alog/5EP/ANVsVQesadql7pN7ZG7gQXVvLCXFu54+ohWtPW7VxVGenqv/AC0Qf8iH /wCq2Ku9PVf+WiD/AJEP/wBVsVUGs764t3hnktpYZCweKS3ZlYcjsQZaHFUpXyB5cSSSRdG0VZJn EkzjTIgXdSCrMee7AqCCfDFVWDyfpcMsQh0/SohaoBbBNPRfSDEVEdH+Gvpp0/lHgMVQ6fl35aSN oho+jmJnaQRNp6NGrPEsL8EaQqgaNArBQAe/U4qnf1fUYxDHHNbpGh4oi27AABSAABL0xVV9PVf+ WiD/AJEP/wBVsVSjzhBqb+UtbRriHi1hdBqQPWhhYbfvTiqXfms1onknzG15HJNaLoOqm4hhkWKR 4xCvJUkZJVRiOjFGp4HFXkvlDzEdD/IDyvqnl7XLjQtMn1C4T0dRmgmljhDXQa3juotJu1p60Xrc ntCaVXmPhxV7Z9V82/4D+q/pKD/Fv6N9P9K8V+r/AF/0Kevx9Pjw9X4v7ulP2e2KploBjOhacYzG YzawlDCrLGV9NacFf4gvgDviqOxVan2pP9b/AI1GKrsVWn++X/Vb9YxVivn3zP5l0BbGbRdIfWEf 12uraKGeR29KPlGiyQhxEXb9pkatKAVOKsfm/NLzYlvIzeTLv64t+LSyt3aWL6xG8LyeopeCvwU+ MKrfCrMCaUxVSf8AM78wJbazkg8l3NvJdRiWRJo7uQwVEa+m4WBKtylLVqNkIIH2gqqXv5n+dI4d O9PyPfSG8Fyt2CJx6Jhu0tY60gfiJkf11Lfsqe3xhVGaT+ZfmTUU0xl8o3UYvYZ5bpmeXjbSQS8P Qci3/vKVqG4kMCtDQnFWNt+c/wCZL3Twx/l3fxo7WccLtFfN6ZuEVpZX/wBFRHjiL8aBlYFTyoN8 VRVl+cPn6aASn8ttRjDyzxJG73AkDRo8ilx9T4qjsnAPyO5HWuKs38l+ZtZ11dROp6LNo5s7j0bf 1hKPXjKhhIolii6V4niWFe+KsiH983+qv6ziq7FVr/aj/wBb/jU4quxVC6sHOlXoT1OZgl4+goeW vA09NWoC/wDKD3xVIvP8csvl7Vo4o5JZX0fUVSKG1j1CRmKIAqWcpEdwx7ROaP8AZPXFXmkXkTX/ ADZ+Sfl7StLtLOG+tby4lng1/SLbSQqh7qFj+jYIr2CGSsgKlQCft8gTir2j9F2P6K/Rf1aH6h6H 1X6p6Y9D0eHp+n6X2eHHbj4bYqlnlnXEuvLelXMxnlmns7eSWX6vP8TPErM32O5OKpn+k7b+Sf8A 6R5/+aMVWJqdtyk+Cf7X/LPP/KP8jFV/6Ttv5J/+kef/AJoxVYdTtvVX4J/st/x7z+I/yMVX/pO2 /kn/AOkef/mjFVj6nbco/gn+1/yzz/yn/IxVf+k7b+Sf/pHn/wCaMVUL7W7C2sri4mE6QwxPJK5t 5zRVUljsnYDFVf8ASdt/JP8A9I8//NGKu/Sdt/JP/wBI8/8AzRiqyLU7bifgn+03/HvP/Mf8jFV/ 6Ttv5J/+kef/AJoxVYNTtvVb4J/sr/x7z+J/yMVX/pO2/kn/AOkef/mjFVj6nbco/gn+1/yzz/yn /IxVf+k7b+Sf/pHn/wCaMVSzzPrNpD5b1aZopXWOzuHZHguVUhYmNGKqrAfIg++Koi+t7DVLyfTb yKO4tXtZre7tZTG4ljuPTDKY6luPHZuQHXFVXQ/L2g6BZtY6Hp1tplm0jTNbWkSQRmR/tNxjCipo B8tsVTDFUl8kf8oXoH/bNtP+TCYqnWKrU+1J/rf8ajFWNefdK866jp9tH5T1KLTLyOVpJpZSQGUR OIxX056gTFGZStCBvUfCVWJ6hoX54x2VyYNdt5Lw3YezWAQs62kgCyr+/t442ZCS6B607lqcWVZb 5Hs/PltbXQ83X1veyu0RsvQC8o1EKiVZGSK3Vj6vIii/0CrJH+1H/rf8anFV2KpV5s/5RbWf+YG5 /wCTLYqmuKuxVAapDqc+kXcOl3AtdQkV1trlgCI3LGjUZZF291PyxV5yfLP5/SXlZfM1gbKH6sIY xxWSRoZ1klmlaOyioZYwUMY+D5V2VRsHlv8AOGdNPi1LzDalowj6m1t+5LujwMojKW6NwJjmDAkV D0NduKqWQeWf+cgki4p5mtFeAPbxif0pFaP6qPTlEgsyzyfWW+JnRdl+y1alV6pAtwsFqtywe4UK JnHQuEPIjZep9sVV8VSXzv8A8oXr/wD2zbv/AJMPirXmfVZdItLrVYoY7iWw069uUgmnjtY3aIRu Fe4l/dwqaULvsvU4qk3lj80/Lmo+T7bzFrmoaVofqzPa3UX6Wsru3huFLMsP1yJxC7tEBJxG4BxV lX6W0r9F/pb65B+ivR+tfpD1U+r+hx5+r6teHDj8XKtKb4qgNA0TSotC06L6nB+7tYV6Ry9I1H94 qhX/ANYdcVR/6J0r/lig/wCRSf0xVYmk6Vyk/wBDg+1/vpP5R7Yqv/ROlf8ALFB/yKT+mKrDpOle qv8AocH2W/3UniPbFVK4h8t209vb3CWcNxdsUtIZBEryso5MsamhchdzTFV503R2MZW1t2BcgERo RUBqjp7YqsuIfLdspa5SzhVTxYyCJAG4l6GtN+A5fLfFW59N0NoCDa2xWZWCAxxkOOJO22+2+Kqw 0rST0s4P+Raf0xVRlg8uRet6sdnH9XUPccliHpq1eLPX7INDSuKqkWk6VxP+hwfab/dSfzH2xVtN M0d15JaW7LuKiNCKg0PbFWhpOleq3+hwfZX/AHUnifbFV/6J0r/lig/5FJ/TFVj6TpXKP/Q4Ptf7 6T+U+2Kr/wBE6V/yxQf8ik/piqXeYtF0iXy/qcbQQQK9pOpn9ENwBjYc+KqWPHrQCuKpd+ZSep5U 11PRt7nlompj6veS/V7aSsafBNN6lv6cbdGb1EoN+Q64q8G83X2raN/zjj5OurG0i0u+ttVmMCeX 7+SWOFCL4E297Fc3bsGRjzAuDuSu32cVfQv6G0n/AAF+h/0Y/wCiv0Z9W/Q/NfV9D0OH1f1PW48+ Pw8vX678/wBrFUz0N4pNF0+SJkeJ7aFo3jT0kKmMEFY/2Fp0XtiqNxVan2pP9b/jUYquxVaf75f9 Vv1jFWOedvIWk+b7aG21G4uIIolmSlsYhyWdAjBvUjl6UBFKfdtirGrj8ivK7wSWn1y9a1vb9b++ ikaI83SFkovGNAOW3MsG5LyU/arircX5CeT44LKEXd8VsIhDCWa2ZioaJqsTB1rAvTp1G+KtXv5E eUZ4bESXmoEaYLkwAyQHkLq8S/kD8oTsJIgq8aUX/K+LFUVpP5LeXLBNMDXd3OdJhntrXkYgpjmk EgLqUasg4glloGarcegCqQp/zjH5ES6S4GoapzSS1lUc7Mb2aIkY5C1D8CI915UrUqAcVX2X/ONP kGGAILrUXIlnd5XktzI6zI8LRO/ocigV6geIG+Ks58neRdJ8qDURp80836TuBdXBuDESHCBPh9OO Lw35VNe+KsgH983+qv6ziq7FVr/aj/1v+NTiq7FUHrTtHo1+6s6MlvKweJgkgIQmqM2yt4E4qlPn bRzrejalowjMp1LSr+0EQlEBb1ljTiJjHOI68vtGNqdeJ6YqkP5d/llp+lfl9YeUvMej2d5a6XcT yWVvdSpqygSSySLKXltLNQ/75gKRCi99yAq9AxVJ9C0yaDRNPgS9ulSK2hRVljhjkAWMAB0MZKt4 iu2Ko76lc/8ALfP/AMDB/wBUsVWJZ3PKT/T5/tfywfyj/irFV/1K5/5b5/8AgYP+qWKrDZ3Pqr/p 8/2W/Zg8R/xViq/6lc/8t8//AAMH/VLFVj2dzyj/ANPn+1/LB/Kf+KsVX/Urn/lvn/4GD/qliqya yufRk/0+f7J/Zg8P+MWKr/qVz/y3z/8AAwf9UsVd9Suf+W+f/gYP+qWKrIrO54n/AE+f7TfswfzH /irFV/1K5/5b5/8AgYP+qWKrBZ3Pqt/p8/2V/Zg8T/xViq/6lc/8t8//AAMH/VLFVj2dzyj/ANPn +1/LB/Kf+KsVX/Urn/lvn/4GD/qliqX+YdOml0DU4n1C4CPaTqxEcLkAxsDRVjBb5A4qmotoRcG4 oxlK8almIANKhVJ4rXiK0GKquKuxVB6LQ6NYUAUfV4qBZPWUDgOku/qD/K79cVRmKpN5qv8AWNP8 s61faLbC81e1tppdPtGR5BLOkVY0KRlXYM1BRTXFXmVt+d/nyHWLHQtR/L6+kv5tPtryS4h9aJJp XtYZbtLeKSGRR9Xmn9NvUnoKULcyqMq3Y/nH+ZmpNIYvy4vtNaGAuq3ou2Msr6fcXSRoFtYwAtxb xwsxbq6iisaBVZf/AJ/eaNPNpFeeQryGe9v76xgEkl1EHSzhiljuUWSxWVkm9R6KI+dEbgJG+DFU X5X/ADj86eZPMOhWieRL/TNG1CQyzazOJJoDbmw+sRtE6RxxjnK4UO7UoP5iQiqWWX55fmnLFyn/ ACy1BHUTXDkx36L6S/WPStx/obv659OIcgpVuVaIOiqc6z+bHn6GfR4rPyBqEkF9oj6zqMpWdhBO LWeT9GVWFeE5mijTk2/xf3e4OKoGL87vzKMdpNN+VOqiK7jjk4xyzNLFzuPQZZo3tI+LBQZKBieP EniCxVVMND/Nn8wL7zRZ6Vf+QLywsbtrRHvmN20cAuIpJnkaT6osbemBHG6sU4yEipG+KpTcfnX+ Zr3T22n/AJaahHDHG7vfXK3jL6wtzIYliS0UvS5IiDBuLUr8KnkqqZz/AJsfmLZ/oK2b8vr3ULi/ 0aLVNUu4fXggtrng7zWfAwXBEo9OiIz8izKpoPixVD3/AObn5l22galqUH5eX9zfi/Fnp1mqTALC bcuJZR6ZnkKTKVdliWE1ASVqcmVXeY/zI/ODSdSulg8ltf2VlpltdcIIppJLq8+uxwXMcMkLSoiN AzyRqwMigBnXqgVel6Dqd1qmhaTqd3YyaZdX1vDcXGnT19W3klh5tC9Qh5ITxNVB9h0xVM8VQurc /wBFXvDnz9CXj6cghevA04ytsjeDHp1xVFYq7FXYqxny55v8tP5e0t5dW0+KVrSAyRLPAiqxiUlQ gICgHtTbFUx/xZ5V/wCrzY/9JMP/ADViqxPNnlXlJ/uZsftf8tMP8o/ysVWv5i8lvcx3T6nprXMK vHDOZ4DIiSFS6q3KoDGNeQHWg8MVXHzZ5V9Vf9zNj9lv+PmHxH+ViqA1if8ALLWmhbWZNF1NrdZE gN4bScxrOvCUJ6nLiJFFGp1HXFUavmfyhCkEUWrafHFHRI40uIVVVVSAAA1AAMVVf8WeVf8Aq82P /STD/wA1Yqsm82eVfSf/AHM2P2T/AMfMPh/rYqv/AMWeVf8Aq82P/STD/wA1Yq7/ABZ5V/6vNj/0 kw/81Yqsi82eVeJ/3M2P2m/4+Yf5j/lYqv8A8WeVf+rzY/8ASTD/AM1YqsHmzyr6rf7mbH7K/wDH zD4n/KxVf/izyr/1ebH/AKSYf+asVWP5s8q8o/8AczY/a/5aYf5T/lYqv/xZ5V/6vNj/ANJMP/NW Kpf5h83eWl0DUmi1PT7iUWs5jt2nidZGEbUQqGqwY7UxVkuKuxV2Kv8A/9k= uuid:47133E7013D0DC11A72BA736C17DCD1C uuid:54491B3EF6E9DC118669A8FCEEB2D9C6 uuid:46133E7013D0DC11A72BA736C17DCD1C uuid:4497280377CEDC11945D974E704A7427 endstream endobj 30 0 obj <>stream h,A 0E27` UAw`(F,<~gݟB/S}8'9V e᜺m4$PF*>4X4Ck#Z4 X=xjJ-'<}qy(#E' 0v6 endstream endobj 31 0 obj <> endobj 32 0 obj <>stream hޜYێ}# ~יcVA(.o#ߘ:Uݜ|I,v[Wԩw{fWnL+eʠg'W:)Uzlf2FkY`y1_XW}b/ٛJs"Kd./SeyKmsE1W_iSZ7sU(Jۄgj_^ ?S;3V|!kkkQWIݺ.-BHtYWIvXA2^aFIkb`Жs-J2 =)*' vyC>x=yM^a i9-Ǎ-MSQCe *z ﰇ'eAz+ e-}=b/;&ӲVAm_/{c WhcA2vZQe^,[dW% W{Pvn|_ӕVrts\k+ R}'Sz)C2#ltM6k|Rv*tiMed/5Xg(ZP0ܓXO;,rlղ5,~[UPg6 X5fեŔ\ ]^ B>CKj7لqF&PUQWK9*Ƥ,:W@ep+&[|MPOY@0 %bdW}qV3씣 vT$t\G`(~=IK(oUTl$ q>nTڱM:=-b9Nyn#3/>ӊkId+FwsgQh8dlNxt\-(8Kεs4HP)]"$JzR!<:lr[b)< Dܾ|%%0J;8DL 6<3Ԁ•$400>=w cxO!UH~-z MI M0nmMpˆ[y"61;JnDo:Wf2Eͯ?euc|6D+mB<#1z^XL! V5S3ZdF=kΦGGq7gZ\.C.֟%~Qi g]1a38?DfKۜiA\cN-X1QAs}ǤILv' Zn"3Ձ5Va8o7|GsSy`+c h |Vxz^!; 6{WqGJVr7bdeM@l]ݶLAБ\ȁnn'&4Q`km`p?ʿҧf>D=\7J}z)8ZcQOd981vm+|*s| QN!1|db\Ϊ&2xrn/a=HwAe/Dq< xJf#|v U#;a:SC0'u endstream endobj 33 0 obj <>stream hޜMK0`GRPòa]#J{nMIfFkSGmsbZU# endstream endobj 34 0 obj <> endobj 35 0 obj <>stream hބXr}Wq2``.<ڱ8Jʬ݇<@$H"[o$t@JR`fzrtb>ݼ߼ b6_Yg9')4z?=NPJ|̿ WSwE%lK|nU&kdCѵߗ$'uܝ 4b8VQ!IsltSV|9o:>MeIn{ѻ@8˦TΪn!3ÞkT!+ĺ/&DQ>ܫ8D5lWY;ıcq|ACJX&@-l jRgk@cl]CyNMݩKuto jwhn%?p8Ѹk[Ӳv;:%Xyl'/CIO'Vڹ±hki '*XeѢU;ՎI〪QꠧsZL!}m#Ԯ"4rZ |pFco4h&'.!e4#^M`PAYsYu-"b . "3:iI5M8㚊Z]spBPLַx%Xvx~)ĊE~uy.Js0dcQS՗W|:4uHr $Aj>}+q_fmI&,ZU1X?|O| <6`zZ\':6TWNJ+%Y/ewvj/vN,7467piZ {dXhZ!HKwTw' ԬS9Il> ED/M;}o )0Rw1'?fVƶ2 uݟ$_&zE Va'"bu+IcQ xAr{'p E{-d\K}˼׳s)-1 ‹tnvR€>l8iC| ?LtR j@`(<_bZ2NO( eOȫW󅡾""!S(&b vqI"D p:-+:V{愒5ߗ^+w)W؀@ (vZAAXI6:&SF+eiM(cU}TxԦ"hyy`>vel\<:1\鹘|OmFB0 BEl%f3&KqS]Yǿ! &::&, H<IɾES\<ڟzPOgP|X(_ 0g"j񡰵= T||l6>D#jHQJcIQ{}uqU2{U$EKݱ#ѠM!H˖0Z:0ICʹޝ R]Y{ (~ f竱 NVSaR`N-jOZV&RE6:'6i)p1q VGxCAI"<Ņ>0ۈ vݞY &^Pϴ6\dH %Fu<:n>%(+=k fQڟVCX" r и'9y4. sun"͛$~eخ8F'5V3ī:I4xQ'=oʧ&e%Mk 'FFa${br֤_? Fա;B*+=lz:}]ݦ|RbJ^VwFVTc}}8J<E{]fE.;dI;Joo.Q}Tݨﺝ#wr]Eg&zNJϻxFe?hlx->!>-n/I덚){8slݵqj[쐚$xz]C-A^-A]n)Oah~cɣ.[VS}Eb endstream endobj 36 0 obj <>stream hެJ0_ezv/moeFa}{'O?0{@`АF*% 8l4?y@=GMo ,LNy`UpU2NhbҮq1+>j:5F#AMV^b+]f$$[VCsߞ9iu'b44fUhmu j BԾgnW~N]ʃo[ӧs>)} endstream endobj 37 0 obj <> endobj 38 0 obj <>stream hXMFW\vIv `b3@_5qfo6cWդ4Y`}YQU^u Wul~;u]V>XvYkml|;;/|N7z:aymY'˪j<4_*mk)ksGg6}^ԭ-s?E([-.Nեoe6+}cȎ6m7.Fl[VN~wʮ޿v٫7gW6{!+;!;SV&}V?8Ffl3b lז75`luƮlYgهIveW1RH~U㺦5֕GqUYj+;ӭt$\e;+y]Jlsg5IMz*|@Y|.աw) fj;#v8䐴.q|j龆"P+(~:Yt5ǦB;hi(=ۉ) } WٲEpY(ltB}jՑ*Ã.]pj͏kd;*)#:Dlh6,I݄GCI?,wJʑZUYѵu"QyxNh6 f\훶 J݈FSтA7 `4/zqa^&#5R>];aj\Lf͛i^ %xYdvz<7X/f6k7Imdޣ7cVqБ9#u; ҳ`0+ߋG9:ͮ1o76e4 ]:3sc8?n%\'sJgs^޲E;.uN/yၰ?N'`-M7gq…aw| 9ߡB(cSr cC͉/O8I%ʮ!q|X)3^黳5_RͥExIe;!EF7ai$5p h 7 "ݤ""XO!~.6x)iI-!1߈iV5\K.+o9Wh1U7󡩓o5_~]l2E3D-ώZ&8)0d] #Iː:KehS }šZ:*N?nzT7 ̛WH:8FmesZVsP];Q̫@5wtE-ZyBB[ڜ *PUܬsS2h2b:%-ĩonkMRn̰`+c'Ҽzd1{ fgG1v#­A\J{oԛufF} 3g[Z,N%_68%ϵKklR82h=y." 笢XL-n:k 8*Hn6b)Mp^zHkҠZ [a^ѕ|: At?BR[)FNoꎘ{4Tĉ3c9ChBqVa!{7I[Ƽ%B[&p7 c.HF0ZNU%P}oJެA{`$p7{L@STkqMߏje4oq$r&t wW;sN̖^stD^f)XB)2TӠS5[^]D3>' Q*~YI7T%]7# endstream endobj 39 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-30T19:19:24-05:00 2008-01-30T19:22:08-05:00 2008-01-30T19:22:08-05:00 256 88 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAWAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq+XbL/G3ky91fzTp2lS27afJqMmqp+jZbM3cdzrhEUUs9wCl/K0Momglh4+mi+n vyxVkOnah+fOlecY9NkudQ1OCXU7f9IXVzaA2TRGCwV/QkitGRImrdkhZY1VkUlgxKzKvSfyl1Tz rqGi6g3m1bj69DfPHBJcWosw0XpxtSKPhE3BXZlBYN02klFHKrOMVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVSrWPMVnpWo6NY3EUzya5dPZWskaqY0lS3luf3pLLQFLdqUBNe3fFU1xV2Ku xVJ9O8z2t95m1jy8trcw3WjRWk8k8qoIZ470Sem0BV2chWgdW5qu42qN8VTjFXYqlfmjzBB5e0G8 1qe2mu4LJBJNDb+kJOHIB35TyQRKqKS7s7gBQTiqL0vUINS0y01G3DrBewx3ESyLxcJKgdQynoaH cYqicVdiqQL520ZvPR8lIJW1dNOOrSOqqYEhEywcGflyEtZA3Hj9neu4qqnN3ZWd5B6F5BHcwFkc xTIrpyjcSI3FgRVXUMp7EVxVWxVLfMuvWfl7y9qWu3qSSWml20t5cRwhWkaOFC7BAzIpai7VYYqu 8va3ba5otpq1qvC3vE9SNfVt56CpH97ay3EDdOqSMMVTDFXYqx6bzzo0XniHyYVkbVprRb7kDCI1 iYyhfhaQTMf9HapSMqvw8iCy1VZDirsVUryeWC0mnit5LuWJGdLWExiSVlFQiGVoowzdBzdR4kYq l/lbzDbeY/L1hrtrbzWttqMQnghuRGJfTYngx9J5Uoy/EpViCCMVTXFXYqx7XPPOi6L5p8veW71Z RfeZjdLp8qhPRVrONZHErM6sC3MBOKtv1pirIcVdirsVdirsVYtafmX5YvLWG7tYtWntbhFlgnj0 XV2R43AZXVhaUKsDUHFVC/8ANXlG/nsJ7vT9Yll0y4+t2LfoXWl9OcwyQc6LagN+6ndaNUb+NMVR n/KwdB/5ZdY/7gesf9kmKtf8rC0CtPqusV8P0HrH/ZJirf8AysHQf+WXWP8AuB6x/wBkmKpZY695 LsdY1LWLWx11L/VjE1+x0rXnjdoIxFGywvbtFGQigEoor3riqZ/8rB0H/ll1j/uB6x/2SYq0PzC0 A9LXWD/249Y/7JMVQOt+ZvKOt6bJpuoWeuNaytG7ejpOvW0gaJ1kRkmgt45UIdAaqwxVEWHnPytY WNvYWdhq8FnaRJBbQroescUjjUIiitp0CimKqx/MLQBStrrG/T/cHrH/AGSYq3/ysHQf+WXWP+4H rH/ZJiqULqn5eJ5lPmdND1FPMDQNayakmgauszxP6dVkYWg509FApapUbCgJqqm//KwdB/5ZdY/7 gesf9kmKrIvzH8uTKXig1eRQzIWXRNXI5IxR12tOqspB98VUr/zn5Yv7C5sLqz1pra7ieCdU0bW4 2McilGAeO1V1ND1UgjtiqjovmfyfounRadpthrMNpEXdVbRtblYvLI0sjvJJbO7u8jszMzEkmpxV Gn8wtAHW11gf9uPWP+yTFW/+Vg6D/wAsusf9wPWP+yTFUon1XyHP5kg8yS6ZrLazbRCCG4/RGuhQ iiULWEW/pMyi4lCuU5AOwBoTiqb/APKwdB/5ZdY/7gesf9kmKtD8wtANaWusbdf9wesf9kmKqd15 38uXVrNazWmtGGdGikC6LrSNxcFTRktVZTQ9Qa4qs0/zj5W06wttPsrDV4bOziS3toRomskJFEoR FFbUnZQBiqufzC0AdbXWB/249Y/7JMVb/wCVg6D/AMsusf8AcD1j/skxVKNX1XyFrGp6dqeoaZrU 15pTF7KQaRrsaqS8cvxpHbqkoEkEbqJAwDKGG4xVN/8AlYOg/wDLLrH/AHA9Y/7JMVR2h+atH1ue 6t7E3C3FkI2uYLu0urKRVm5em3C6ihYhvTbcDtiqbYq7FXYqxv8ALP8A8lv5U/7Y+n/9QseKskxV 2KrD/fL/AKrfrXFV+Ksc/MDzafKvli61SK2e8vQkiWNsgQh51ieVefN4VCKsZZviBoNqmgxViVz+ f/lq1XUZpLC5ey0r6yl3eRzWHB5rWS1RkhDXIB5Leq4DsrUFOPLbFUZrH5zaLoer6hpd9pl87Wpl azng+rsl36VvBdypEJJomWRIrnlxcAFVYg7UxVMfJf5reXPNut6jothDc2+oaWoN3Dc+hVWHEOlI ZpmqjSBeRAVjXgzAE4qzPFVkn24/9b/jU4qvxV2KuxVKvLP/ABzpv+Y7UP8AqOmxVNcVdiqyb7A/ 1l/4kMVQPmHXIdD0mTUZbea6CPDEltb+n6sklxMkEar6rxR7vIN2cDFWDt+fHlk6TY6jBpep3P6Q eCKC1jS1Ewe5kuYkDepcpGPjsnB+PuvvRVJ0/wCclfKtpbvJq1ndp6lww094Vtgs9o9xJDDKiy3K yFh6YEilQ1alVKAkKp35u/NdtG4WNnpN0dcvlsWtYplt3jSW/kEawScbqPlKiJI+ziM8aepUjFUv 1P8APvTdDj1pNX0q7a6027uLazMAgEN1S5nht0RmnaRXK2zly6L9hmApSqqaaX+dvlnUfMq+XY7K 9TURPDa3JY2jRwTTLIeEzR3DlSrwNGRSpNCoZSGxVn832B/rL/xIYqvxV2KuxVielwxTfmB5qhmR ZIpLDS0kjcBlZWN4CrA7EEYqjtBsYbSTzBbabFDZgXo9BViHpI7WNsQxjQx1HLcgEV8cVYNon5w3 WnTQwec5YJH1LWb3RNOm02ze2hjewvjY852uLy4ZzO7IypECyDkTVVLBVmPkX8wNI852l1dabbXV tHavCCLtY0Z0uraK7glQRyS/BJBcIw5UYVoQDiqB/LnXLOH8vfK8TxXfOPSLBG42V2wqtsgNGWIg /MYqyL/ENh/vq8/6Qbz/AKo4q7/ENh/vq8/6Qbz/AKo4qsPmGw9Zf3V59lv+PG88V/4qxVf/AIhs P99Xn/SDef8AVHFUHqtz5Z1iyew1bTJdRsZCDJa3emXM8TFTVSUkgZTQ9NsVSuXy9+WU0ckcvlW2 kjmeSSZH0ORld5ijSMwNtuXMKFievFa9BiqE8xeWfI3mSsl/YXaTFLiB5oNOnWR1nhktfjdrZmbh DM6oDsOR2xVOdLj8m6TM8+l6KbCaWOOGWW10meFmjhXjEjNHApKoooo6AdMVTL/ENh/vq8/6Qbz/ AKo4qsk8w2HOP91efa/5Ybz+U/8AFWKr/wDENh/vq8/6Qbz/AKo4q7/ENh/vq8/6Qbz/AKo4q7/E Nh/vq8/6Qbz/AKo4qluga1bQWMqSwXqMby9kANjefZkvJXQ/3XdWBxVMv8Q2H++rz/pBvP8Aqjir v8Q2H++rz/pBvP8AqjiqybzDYcB+6vPtL/x43n8w/wCKsVW3GsaRcx+lcWt1NHyV+Emn3bLyjYOj UMJ3VlDDwOKpXBpn5f28rSweXI4pXeKR5E0aVWZ7cFYWJFvUmMMQh/ZrtiqHPlv8ryXY+U7XlI6S yH9BvVpIgVjc/wCjbsgYhT2riqOk/wAI3OonULjR2mv41SGO7k0q4eZYkZZUjWQwFgqyDmBWgbfr iqBu9B8g3OoR6h+hnhuRefX7t4dJmQ3cwt57dTdH6tyl4rduRU1r3pUFVEWumfl/aXSXdr5djt7u No3juItGlSRWhjMUTB1twwKRuyL4KSBtiqbTeYbDgP3V59pf+PG8/mH/ABViq/8AxDYf76vP+kG8 /wCqOKu/xDYf76vP+kG8/wCqOKu/xDYf76vP+kG8/wCqOKpBoN4JvPHmm7ggndBZaYEjeJ4Hdk+t EqonEW/xDc0Hviqe6HFd+rqdzc2z2n1y6E0UMrRs4RbaGGrek8i7tEf2sVSq5/LDyLc3dpdzaWGu LK8m1G3kE060ubm6W+lZwsgEitcxrJweqAjYYqh/y0/LmHyPY6jbJem9a/uUn5cGjSOOGCO2iiRG kmICxwjowXsiooChVMfy8/5QDyz/ANsqx/6hkxVkGKuxVYf75f8AVb9a4qvxV2KuxVZD9g/6zf8A Ejiq/FXYqsk+3H/rf8anFV+KuxV2KrIfsH/Wb/iRxVfirsVWTfYH+sv/ABIYqvxV2KuxVZH9uT/W /wCNRiq/FXYqsm+wP9Zf+JDFV+KuxV2Ksd0+GKbzb5jhmRZIpLaxSSNwGVlZZwVYHYgjFVfy3Z2d nda5b2cEdtAt+pWKFFRATZWxNFUAb4qneKuxVLvLayL5d0tZbNdOkFnAH09BRLdvSWsKjwj+yPli qY4q7FVh/vl/1W/WuKr8VdirsVWQ/YP+s3/Ejiq/FXYqsk+3H/rf8anFV+KuxV2KrIfsH/Wb/iRx VfirsVWTfYH+sv8AxIYqvxV2KuxVZH9uT/W/41GKr8Vdiqyb7A/1l/4kMVX4q7FXYqlGnrpo8y6u 0Jk+vtFafXA3H0+IEvpcKCtftcq+2KrtG/46Ovf8xyf9QNtiqG8qeevK/muJ5dCu3uFjjinIlt7i 1Ywz8vRmRbmOJnjk9NuLqCpod9sVTmC8tLh544J45pLWT0blI2VjFJwWThIAfhbhIrUO9CD3xVA+ VzbHy1pJtbt7+1Nlb+hfShhJPH6S8ZXDUbk4+I13xVM8Vdiqw/3y/wCq361xVfirsVdiqyH7B/1m /wCJHFV+KuxVZJ9uP/W/41OKr8VeZfmD59/Mby95hNno/lyXV9LaKGSK7tbK4uiJJn4iFzHJGq0E E3qSb+mHiPFtwVWOat51/Nx7OSwbRbqG41S2vZpr6z07UGFuV0lLi3WNvrMhhkS4/clVX9632Qj1 xVG+SfOv5pS+b7XTtS0K5/ROrXt1JcalLZXUcEMUVkDGUMsvK0V5owRFIjVLsvIMpqqg5PzL/NyG 2s7oeW5pby5s3kvI49I1RkLQSXS0hie4RYXAWJ1SXg06mlUbguKvW/KuoanqPljSNQ1W1Nlql5ZW 899ZlGjMU8kStJGUcsycWJHFjUdDiqYzfYH+sv8AxIYqvxV2KuxVZH9uT/W/41GKr8Vdiqyb7A/1 l/4kMVX4q7FXYqgrYX36VvTKYjZlIfqwX+8DfH6nP2+zx+nFUPo3/HR17/mOT/qBtsVeNJ+SHn+X yqmlXNzpkc0Wn6RozwQzyvFPaaXLc3DSPJNaOqs808Z9NoJEKqVP2uSqoPT/APnHrzpZSaU8U+kp c2l/Yahe6mkkwupXggsUuNzbGp9SznZW5B29ZviQGRZVXvGhC7GiaeLy1jsbwW0IubKHj6UMnpjn FHxLLxRvhFDSmKo7FXYqsP8AfL/qt+tcVX4q7FXYqsh+wf8AWb/iRxVfirsVWSfbj/1v+NTiq/FX Yq7FVkP2D/rN/wASOKr8Vdiqyb7A/wBZf+JDFV+KuxV2KrI/tyf63/GoxVfirsVWTfYH+sv/ABIY qvxV2KuxVKrH6h/iHVfSjlW99K1+tSNT02WknphN+o+Llt4Yq7Rv+Ojr3/Mcn/UDbYqmuKuxVIPy +Zm8heWmc8nbSrIsx6km3SpxVP8AFXYqsP8AfL/qt+tcVX4q7FXYqsh+wf8AWb/iRxVfirsVWSfb j/1v+NTiq/FXYq7FVkP2D/rN/wASOKr8Vdiqyb7A/wBZf+JDFV+KuxV2KrI/tyf63/GoxVfirsVW TfYH+sv/ABIYqvxV2KuxVJ9Pv7yXzPrFlJJytbWKze3j4gcWlEvqHkNzXgOuKr9G/wCOjr3/ADHJ /wBQNtiqa4q7FWIaBp3n3R9C03SVj0qZdOtYbRZjNcKXEEax8iPSNK8a4qj/AFPP/wDyz6V/yPuf +qOKu9Tz/wD8s+lf8j7n/qjirRbz/wAw31fStgRT17nvT/ir2xVv1PP/APyz6V/yPuf+qOKu9Tz/ AP8ALPpX/I+5/wCqOKu9Tz//AMs+lf8AI+5/6o4q0jef1FPq+lHcn+/ue5r/AL6xVv1PP/8Ayz6V /wAj7n/qjirvU8//APLPpX/I+5/6o4q0zefyVP1fSvhNf7+58CP99e+Kt+p5/wD+WfSv+R9z/wBU cVd6nn//AJZ9K/5H3P8A1RxV3qef/wDln0r/AJH3P/VHFWkbz+op9X0o7k/39z3Nf99Yq36nn/8A 5Z9K/wCR9z/1RxV3qef/APln0r/kfc/9UcVadvP7Cn1fShuD/f3PY1/31irfqef/APln0r/kfc/9 UcVd6nn/AP5Z9K/5H3P/AFRxV3qef/8Aln0r/kfc/wDVHFWlbz+Cx+r6V8Rr/f3PgB/vr2xVv1PP /wDyz6V/yPuf+qOKu9Tz/wD8s+lf8j7n/qjirTt5/YU+r6UNwf7+57Gv++sVb9Tz/wD8s+lf8j7n /qjirvU8/wD/ACz6V/yPuf8AqjirvU8//wDLPpX/ACPuf+qOKt6NpGuJf6rf6nJBBcahHBFF9SLP 6YhVxzrMgBasmwKkbYqmemaYLEXBNxLdTXUvrTzzemGZhGkQ2iSNAAkajZcVRmKuxV//2Q== uuid:6DFD6EE3D0FA11DC88C2B553B10A7876 uuid:6DFD6EE5D0FA11DC88C2B553B10A7876 uuid:4196EAF480CEDC11945D974E704A7427 uuid:4497280377CEDC11945D974E704A7427 endstream endobj 40 0 obj <>stream hޜn0 _E0IEJ[E[j@! ~hI)Jxщ%Bؠ-T z5vb-{Yղ߫&_YX7\5ch3)N_>y";'Ux!gZc׼=:EGQ LI@˯<l&:A ;\+pje^}WRST) bVE*OIvvY\ Ll`}kkqwllkգcK>I7Lr˛O 0D endstream endobj 41 0 obj <> endobj 42 0 obj <>stream hޤn$o^zf$A\Ȗl+eCϑ<>㞪nRLr))V懟Dr}g.M"nJ'%e!eb(~(K?_g/_Y,J ]¤_6=˜-dZg*3/WYn >.AM OY. wٿ.vKlY6*)*lQ021*l, v cFVj[V^*g3Mۊ }Bo h_Wԙ<=t=³us6][[v/8 ۆZaYpe"<6hHNw#3C }~D^a_&Qď?#hR,3rx!鬈 FAh߽6Ky3hp &FH@ARnD&d"t5y`Y CӉÀ|G1"hBRB%J_aOD̤=C]˷WE&8,v&O=xJM`wTI\*]gxtqyD+tΎlsk KZNŨ(;ϓ8jT{M e L?Uzy0Rhz  !qXs= -:.7A}>{8PGQ*;ĩ13V{&^pk| h8$77+{ 8'bDpV98i8I%VYZߒ4}SrB䔜(0RHpmU WSp OGq5&1 pl Ueʱ[rtW ǟ XJ?_\\dfHBk=ƿQDŽqԳ3Xn)gTkCbbk*JwhEG/`8|ľ܇ﰘjmj%*u|ŃH|-rSvRF,hFX8.ǥl/yu;rՑy߯?N a>&GF;I8R+IhcuE&#DC!u5quiMdu*+,D=y3\HĐm\\(R6=(i(ԓPhFHHKsEcg>w,:ݠɖEJzUӪ8Tx\(*,}NE%ׯzg*6\M F<*T,&J18m3x.}I)pߢ5#Ԗ&y7ʗ+v6Yo.hfdmh Ѯ%%M I\A[f/T (ח ش I7|RDt|dV>qtVGJtq Q3a.DYp/Ʀgv>vbBA{ o-xh'`2w=_IE^UwH endstream endobj 43 0 obj <>stream hތj@ @Ec;tgAK,BxH+ҿx=XXT=\EZ4'Ҁ|ևz|Ԟ*8l/o}9~awq4Áғ[K^/Ճfmk1f6ӨfoF Ry/vy^y:Y{ܭU~p"R endstream endobj 44 0 obj <> endobj 45 0 obj <>stream hެYrF}W56}eJ*ݍUAf".h?c^=dRScҍA{<&WŭMt2]MOLW:u$ͤHt?O4u8ּE0L"7jz̭R6ͬynmչWT>qtbl|&khOrW5Ml*.׆^ԉyaN _,Z*}еjD!uyHC2+R'jض7tٱz}*q%6}V4m1Nhh)]CJS" KR[6Ee jlͽ{K3,pw9zr x!4"j9D-ǧnjqGv:b,S淪3}~{I+V"Ӵ2mHkYrQ8u$Ѻ ܤdElO3G66iVcFw܏^=by: .P$ɝq&a3oiuѰ VW=/vg,S$#F4} ÍUZ[_U^[3o^J9x~4"g "*Ny^*ky4[FM)|8lڅɶ^*HO#<{ðrΈUuI3O3QbyIAIY@Fu\|7tY@ǎ*5yS#/^88ժ~!UQ3kvopJQWݷkUɖAY`XȜ=ǖ aus{WW Ju{-zh7p+4)B0QaR_F?{/Wo.y)  ٗ}9>=Ie ͡@j =L5jZ ~&q>z]^k_KŰyڶ]7Z@G NzMy 4wi㢤b;@L`+> i3?(uyQ-%%nƢ #Dn͐X׵IV=c U_BgEwԫҗLu= L.xaϐtApJBΨԭҶ}9D/cd]2 1 U,fBiXR(N;gJOq1DS#-]"l\5fwCRvn=򆽓F鲧U[7RD.mE< XHfB zOfmK zШȴd5"u䯟+CʘŤJ%38hŴcG q~@~Mc^j H9nrf +K>YEcFyi;3[#' [ls؇;ìv&ڱYC̆òɆ7dFG)(;IyaQ!>-dչ. ݣ54cjs"vLO岃 @yjc_sd}(5R:֣^"MќnK)5ҹ{} $:rzŶA֌^(3;sȵ{a6E?WYv1™0_zGP\cWMUs'Ǭy_ |5gC~Kp@4҂4w܅e?ހE h(dQN-.< Z/2Q%~j%6I} 푍\1\ &8cAvm-8L#ѣs(gP @xlv+I#s)!9V-[ t뀿%C>P1[T#D>{lQIm5`ҧ쳥( wBM3Wp#@oL<6 i^lͽN 4Q34!'Br+40s÷1wX"'m*e+xWRD(7Дπmrn<B @E_å+w"A̪!$pscKg`yE}'=vaK=@԰ |9pܧJoVtcxr&pjB2 7N[>X|`} Żza1Ͱ8 k\\O.w>OW¼0)o?%)%wrrս7t8J7[%ϹdZBN֓q0k^8kiO[:y8EaIQRT=`TkޙŎn&D%N+ . *kG5" cM)ʂ<_RTƺW5&SOM<Rc/K% E+nIJ| na%)mK>2HFM8C,Dkr+>_-0j^-Gb/Y.K$3IS;z@se4xN>x͓5{wMqǗ ~.5&~m<;2 DEý1BA8D)@zA)ԑXȔ1pHi"%4I 0mϞ endstream endobj 46 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-30T20:17:30-05:00 2008-01-30T20:17:30-05:00 2008-01-30T20:17:30-05:00 256 44 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXnX58tbL5Gt2u47Wa0XWdHNzFqDiKyeIajDzW6kZJVSEjaRijALXY9MVefeQ /PXnHTLLT/KejWVqserzX115fuRFPcWsFlDdXr3Iiq8JlgiCW62p+Dksi1HYKozSfzv86xw+WrSS 2ttYlvvL66le6gkTR87oWt3LKOEEkrj6vLaJDOIoG+Nj/dHhGyr0j8qfOeoebvLc2pX/AKBnhunt vUtU4wsEjjeqFZ7yNwDIV5RzMNt+LckVVmWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXNb 0zQ9IvNY1Wb6tp1hE093PxZ+EaCrNxQMx+QFcVRiOrorqaqwBU+xxVvFXYqhtT1Ky0vTbrUr6T0b KyhkuLmXizcYolLu3FQzGijoBXFVLQ9c0vXNLh1TS5jPZTl1R2R4mDRO0ciPHIqSI6SIysrKCCKH FUdirsVQuq6pYaTpl3qmoSiCwsYZLi6mILBIolLu1FBY0UdAK4qs0XWtN1vTIdT02UzWc/IRuyPE waNzG6vHKqSIyOhVlZQQRQ4qjcVdiqldXVvaWs11cyCK3t0aWaVtlVEBZmPsAMVUNG1fTtZ0mz1f TZfX0/UIUubSfiyc4pVDI3FwrCqnoQDirT6Lpj61FrTwctTgt5LOG4LN8EErpJIqrXgOTRLU0rt1 xVG4qg9Z1fTtG0m81fUpfQ0/T4Xubufiz8IolLO3FAzGijoATiq/TdQg1GxivbdJkhmBKLcwTWso oSPjhuEilTp+0oxVE4q7FUHrOsado2mzalqMphs4OPqOqPKxLsERUjjV3dmdgqqqkkmgGKqmm6ha alp9tqFm5ktLyJJ7d2VkJjkUMpKOFdTQ9GAI74qiMVdiqE1bVLXStPmv7pZ3t4KGRba3nu5aMwX4 YbZJZW3O/FTQbnYHFXaRq1hrGlWeradL62n6hBHdWkxVk5wzKHjbi4VhyVgdxXFUXirsVQGua7pm h6a+palI8dqjxRVjilnkaSeVYYkjihWSV3eSRVVVUkk4qq6VqdhqumWmqafKLiwvoY7m0nAIDxSq HRqMARVWB3GKorFXYqlXmvQh5g8razoJm+rDV7G5sTccefp/WYWi58Kry4860qK4qmcMfpwpHWvB QtelaCmKrsVdiqF1W3vrnS7y3sLoWN9NDJHa3pjEwhlZSEl9MlOfBjy41FcVS/yX5el8ueV9P0SW aK5ksYzG1xBE8CSfEW5lJJbl+bVq7NIeTVbatAqnWKuxVDanb3lxpt1b2VwLO8mhkS2u2jEoikZS EkMZKhwrb8aivjiqWeSfLR8s+WLLRGufrjWvqF7ng0fNpZXlb4XeZ+slKvIzHqzM1SVU8xV2KpZ5 n0C28w+X7/Q7qea3ttRha3nltyglEb7MB6iyJRh8JDKQRsRiqH8keWm8r+UdI8utevqB0q2jtReS IkTOsY4r8CbKANlFSaDcsakqp3irsVSrzTosmueXb/SElih+vRGB2uITcQlH2dJIg8JZXSqmjqd9 iDiqj5L8t/4a8s2Wieutx9U9T95HH6EY9SVpeEUXKT04o+fCNOR4qAKnFU7xV2KpD578pwebfK15 oM7xxpctBIGmi9eLnbTx3CCWHlH6kZeIB15Cq1FRiqL8r6IdC8taTohuGuzpdnb2ZunHFpfQiWP1 CKtQtxrSpxVM8VdiqW+ZtKutX8uappNpd/ULnULWa1iveHqmEzIU9QJyj5FeVR8Q3xVF2FjbWFhb WNqvC2tIkggT+WONQqj6AMVV8VdiqQeevKz+aPLc2jx3f1GV5rW4iueMjcXtLmO5X+5ltphVoqVj lRx1VgcVRflXQ10DyzpOhLN9YXSrOCyE/AR8xbxrHy4CoWvGtK4qmmKvMfy7/L7y5qv5f+WNUv21 Ge/v9Jsbm7nOq6kpeaa2R5HotwFHJmJ2GKsh/wCVWeTv5NQ/7i2qf9lOKqVx+W3kS2RXuXvYEd0i RpNY1JAZJWCRoC10Ks7sFUdztiqr/wAqs8nfyah/3FtU/wCynFUNJ+XfkK2W1W6lvIZLt1htll1n UkMsxQv6cYa6HJ+KM3Eb0B8MVVLX8tvIl3bRXVo97cW06iSGeLWNSeN0YVVlZbohgR0IxVV/5VZ5 O/k1D/uLap/2U4q7/lVnk7+TUP8AuLap/wBlOKofSPy28qz6TZTSrftLLBE7t+k9S3ZkBJ/3o8cV Rf8AyrDyh/vu+/7impf9lGKqU35d+RoHhSdruJ7h/St1fVtRUyScWfggNz8TcEZqDsCe2Kqv/KsP KH++77/uKal/2UYqsi/LLyiYkJS+JKgk/pTUvD/mIxVf/wAqw8of77vv+4pqX/ZRirv+VYeUP993 3/cU1L/soxV3/KsPKH++77/uKal/2UYqgdI/LLynPpVlNKNQaWWCJ5G/Sup7syAk7XPjiqL/AOVW eTv5NQ/7i2qf9lOKu/5VZ5O/k1D/ALi2qf8AZTiqyX8rfJ4ichNQBCkg/pbVPD/mJxVf/wAqs8nf yah/3FtU/wCynFXf8qs8nfyah/3FtU/7KcVd/wAqs8nfyah/3FtU/wCynFVB/wAt/Ipknto3vTdQ RrJLCNY1IyIsnIRsy/WqgMY24k9aHwxVX/5VZ5O/k1D/ALi2qf8AZTirv+VWeTv5NQ/7i2qf9lOK u/5VZ5O/k1D/ALi2qf8AZTiqyX8rfJ4ichNQBCkg/pbVPD/mJxVf/wAqs8nfyah/3FtU/wCynFXf 8qs8nfyah/3FtU/7KcVd/wAqs8nfyah/3FtU/wCynFWPfmJ+X3lzSvy/8z6pYNqMF/YaTfXNpONV 1Jik0Ns7xvRrgqeLKDuMVZJ+U/8A5Kzyb/2w9N/6g48VYl50/Lz8z77XrvVvLvmFrQTNfKllLqN/ DAYriwgtbb92izRRPb3AmnqkdSeO9SSqqB1L8p/zDudYu7t9aN9p07LONLn1bU4o/Xi1tb6Jo2Cz fVitlGsQaFQVboKfFiqt5K/K/wDM7S/MGnXnmDzXd6rZW8kUt7E2qXTJL6VrIiKlusFuAEmZOfOV xKBydeW2KphoP5c+cV8z2esa1q/1y1sdXutQtIfrl3JS2uIbyNAImCxxsFuYI/SFUVY2IPxsCqw+ 6/KX8zrfybZ+Uodalj+vm5sZFgvL2e1htRp8EkbPM8cbQpJe6f6fAKwSOd0SoJxVlGjfl5+Z1n5g h1C58xS3Fl+mZb6azl1O7liWxcycIY4/QiJ4xsiek8jJyXnXfhir1fFUDoX/ABxNP/5hof8Ak2MV R2KvOvzJ8j+dNf1ywvtDv4beCxtrn0Enuru3EV3JZ3dukqx26lXLNdR1kLK8YQ8N2OKsU0D8pvza 06W2ln8wCW4bVrTUNQuv0tfmSW1tvSjEEi+gsU/7mEq/JF9Xl8RXgKqrfM/lD8w9N8weZLzRry/f TNVs7/V4bezuL1m+swadFZW1uCNopJZbuWRUjJ2hjIpwACrJ/wAufIf5gaF5nu9S8w69calp81vJ Fb2T6lcXcMJYwGOMQz28ZZoRHIv1hpebg1Zaljir0vFXYqgdC/44mn/8w0P/ACbGKo7FXYqsn/uZ P9U/qxVfirsVdirxe+/K38zG803msW+srDbXOowXM7JqmoLNJZ297cTrEyek0aoLa4EP1Yfu6jly FTVVNfyp/Lz8wPKmtudY1ZLny/Hp0dla2CX95dr60QhAnEV1GFhLFJieD8aMqhfh5FV6nirsVWT/ ANzJ/qn9WKr8VdirsVYr+bH/AJKzzl/2w9S/6g5MVeafl7/0Ml/gHy1+iP8ABv6J/RVj+j/rf6U+ sfV/qyel63p/B6nCnPjtXpirIP8ArKf/AL8b/ub4q7/rKf8A78b/ALm+Ku/6yn/78b/ub4qti/6G l9JOP+B+PEUr+l60piq7/rKf/vxv+5virv8ArKf/AL8b/ub4q7/rKf8A78b/ALm+KoXSf+hoP0VZ /V/8E+h6Efpep+lufDgOPKm1adaYqiv+sp/+/G/7m+Ku/wCsp/8Avxv+5virv+sp/wDvxv8Aub4q ti/6Gl9JOP8AgfjxFK/petKYqu/6yn/78b/ub4q7/rKf/vxv+5virv8ArKf/AL8b/ub4qhdJ/wCh oP0VZ/V/8E+h6Efpep+lufDgOPKm1adaYqiv+sp/+/G/7m+Ku/6yn/78b/ub4qtl/wChpfSfl/gf jxNafpetKYqu/wCsp/8Avxv+5virv+sp/wDvxv8Aub4q7/rKf/vxv+5viq2X/oaX0n5f4H48TWn6 XrSmKrv+sp/+/G/7m+Ku/wCsp/8Avxv+5virv+sp/wDvxv8Aub4qtl/6Gl9J+X+B+PE1p+l60piq 7/rKf/vxv+5virv+sp/+/G/7m+Ku/wCsp/8Avxv+5virH/zC/wChkv8AAPmX9L/4N/RP6Kvv0h9U /Sn1j6v9Wf1fR9T4PU4V4ctq9cVf/9k= uuid:B6C01652D10211DC88C2B553B10A7876 uuid:B6C01653D10211DC88C2B553B10A7876 uuid:81CE9478D0FE11DC88C2B553B10A7876 uuid:81CE9476D0FE11DC88C2B553B10A7876 endstream endobj 47 0 obj <>stream hެj0 _ؖe;ڥJ[!m=(II=~R\Fߟla@/E,iOjaG5kES}6/p VD"\ûzr>M8-*H0˝BXK d N݇lX=w]&Fya 0 =` J+p'r%2:w6d0h O@3^V[Cߠ-5=?>Ʌ8j)Kz:-J@8mHʐEYpjVj'9` .iCjCVl5tC< u_GUq endstream endobj 48 0 obj <> endobj 49 0 obj <>stream hZYoF~_GraM2olV"N%1CÎl+F.4Inv*1zOJɅeam)Ӷ|5+YQ'nfӿe-"˛"/:6gUU4 Y^&]|f_e-|_?^g.$m߄%۶IzV9WT6ZW4v|cBQZ}ovMH\( Ɲn-Z7#=)>}g^{>[EEkS_c%a}[ӥ>ŋ,<37=~ AnJl*_%5Qz /h%D|Y0.enK5C,.ˉpHwԹxnڢ&M}G۾@m JVm R}{.209… &}4i<͵ʣy(56(|:lwA,_ }w|DUـ9%Lꄧ*D#ĒbJY%1s6 e欃I?LߒS\!)z/.iŀ՝vqg/# T#xFFGN`Ju# 3L cD؎0nM}9K݌8292NVw0>:"HIW8.HF'?j.걳*]gvksnWRP3e-ebMi;(Hd8"o SJ uH3iWs-)R*o)h5.Vq~-愬YIY7㊱n+-FHjy}C uVi>ժI^AV%`[Z/C?[Jb?It'@snYZVJSۊRvH2GbonJ~gKӎcqT-#dw6^ --(u/ 3vQ@僸_e^wʦכY/"X]^6؇QG҃Y*(;'#A[iZHwB LWŁ/g>yllwIQßwgo;J>%>HW߿cdHfR;&n8W&`eP ppg tG0rihCX}k ]`XLpcKP3$Y5Y /**!5ABgu ,Xl8{ylmi{N.rt-ݼcYXGD-!h801d3/X̑Қ2 ZqEyQjidꯊbZȂ'+3t,=Qtb+e"zm!\  KA>mFNڕu8Y(#Anp6Y3ah,fC3cNmIxDNŴe ?=y;G>mj N,N6oe:Q&3jCoН2neε6=H靧&ƇU t{m?oK/Xܗti ߍjAj&qZ_]=Zg/< @Dl]uQ,bh5T2jeQ8N/)9۬؝OGmD%<_vd912Ji g/~yiKr+oG|#<:hdbđryfOv|Դ': x4[9A2MLʙ:!Esf*~hˑ8 ")q R<:x!xn;00CRnVwr VeSc;η;ҫ8VJQUVOEmEOKŖ~s+/.e W{a #yJ._aZ ؝P>h9y+NnGu}ڝ6vl8&"zΡm#GGZʺiC g=cǵF 4'ta?$gqtS RBgzq+6q{mQč Iȏg8 f'h^ԕ-N>i!: V'jDc+q,vF#z/.N(ka qWh+ktJPqxniW!ȄٕBW:>(’yR?u"[B<~v+?JUh*.f!N hobL #c<F?j8d;ۍ*^pf$L:p0f|\聡w{ X0rZ}z6~O!VB?XB׷qH'g|3 #~7B)5)YTM f䫙K牢A٫ uEfcWh&7EG`# endstream endobj 50 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-30T19:22:59-05:00 2008-01-30T19:29:35-05:00 2008-01-30T19:29:35-05:00 256 92 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqwH81NJ 86arL5ftNChefShqNrcaykb2yGlrfWtxGzm4Ib0kSKViIfjLBB9nlirzeL/oatodbvpLW6hv5o4Y tHsUutEeJCvqNJI5aMpUSunEcatECjNzCSYqjfzU1784vLVzreoaPqTw2V+ZpNMWQWVxFDHZ6VFf SyQIySSgh9PuYXV/g/eqw+PfFWS+UZvzufzXoh1mOQ+VntrltRluX00ThjcXhtvWS1WpmMH1TeFv THx1BY/Cq9UxV2KuxV2KsL8v/mx5c1jWRpTQXOmSTm7GnXF8bZIrz6hdNaXAt/TmleqyoaLIqMy/ EAQDRVMNK/Mn8v8AVrt7PTfMWnXVylwtoIo7mItJM8YlVIan97yQ7GOo2YdVYBVOdN1jSdUikm0y 9t76GGV4JpLaVJlSaP7cbFCwDrXdTuMVReKuxVhnnyL8xZNX0NvKkzRadE/PWEUWhEo+vWS8H+sq z8fqbXbfuipqBvXiCq82iT/nKm4We4eSWzkhhtBbWh/QhWaePS5jdFyBKQsmpRQhaOvwSH7NPgVQ Wn6V/wA5OaJ5I0fSNDt3W4sYprYJcSaQWjWOys1gDUEiSRrOLoRUYOfgMpoKMqyj8ydA/N7VLK58 v6Rc3F/pl1oj2l7OTpcQnupLS9Eyz8kjlSSSU2ap6QWPgZK0NDiqT+brP84PLPnDV7vyzM1poOrX lpawPMunNDJPdWVhpNrLFGFa4WSCcyTOhRY+MS/slsVVktv+clLWXX7WNppLRBdvod36ulzTSs+r RvAOEwTg/wBSMu7t6aoVAQOvEqvaNHN+dJsjqI46h9Xi+uKWViJuA9QckCIfiruqgeAxVF4q7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FUm8n/wDKOWn/AD0/5Otiqc4q7FXYq7FXYq8M17/nH2/i0zWJ 9KvopdWu5XfTntLVLKZZbnVFvTcXkzzyLcvbRs8aHiv7rkoBJxVN5f8AnHuyPmaDU4NWMOlW13Dd QaUsMq8UhSxHpGWO4jRxy0qErziKjeqs3BkVZf8Alv5C/wAF6XeaeL4Xkdxcm4hVIBbpDH6aRLGq 85T/ALrr9riK0RUUBQqy3FXYq7FXYq7FUn0L/jqeYv8AtoR/90+0xVOMVdirsVdirsVdirsVdirs VdirsVY/5msNcuNY8r3GmSzLbWmpO+sRxy+nG9o1jcoPVSq+qBcNDRd996bVCrIMVdirsVYpoFj5 gi8/eary8S9TRrqPT10v17lJrVnhif15LeESs9vyMio6ekoYpz5Ny+FVleKpN5P/AOUctP8Anp/y dbFUL+Ydnq955P1C20eO6l1GQRi3WxuPqtwD6qnkkvrWeyj4mX14+agryFcVTPy5DqUPl7S4dUYt qcdpAl8zOJCZ1iUSkuAoY86/FTfFUwxV2KsKj0zz/wD8rffVZpkPkg6O9pb20dy9FvBPDIJprZlA 9VgZEVlLDgu5UmjKs1xV2KpN50stVvvJ+t2ekTTW+q3FjcR2E1swSZZ2iYRmNy8IV+VOJLrQ9xiq l5Fg1u38qWEOtwm31ONXWaJppbh+Ilb0y8k0965do+LMDPJxPwh2AriqfYq7FWD3unedz+bllfwm V/KA09IpgJykKXANyZKwicc3YvB1gbYbSJxKyKs4xVJ9C/46nmL/ALaEf/dPtMVR2rRGbS7yIRyz F4JFENvM1tM5KEcY51aJonPRXDrxO9RiqW+RdL1TSvJ+j2GrTy3Oqw2sf6QmuJnuJDcMvOYerI0j OFdiq1Y7U3xVPMVdirB/Omn+eJfPfk3UNCaZtFsZLsa7bpMsdvIk4hjQ3EbSxl/Tj9V4+KSHmAKK GLhVnGKuxV2KuxV2KsA8pad501ryro2sz+cLuKfU7G2vJY47PT+CvPCsjKtYCaAttU4qm3+FvN3/ AFOd7/0iad/2T4q7/C3m7/qc73/pE07/ALJ8VWnyx5v9RV/xne0IJ/3j07sR/wAu/virbeWPNiqW bzpehQKkm004AAf9G+KpJB/jG7jE+m65rd/ZPvBex2eixRyr/NGLgQyMh/ZbhxYbqSCDiqp9T/ML /q469/0j+Xv+a8VQumab5/gsYoludatQnIehDFoLop5GtGkkLmp3Nfo2xVEPa/mCqlv0hr7UFaC3 8vE/QOeKo7StM8warZi7s/O1+0fJkdXsbCOSORDR45I3tldHU9VYVxVFN5Y83hkA853vxGh/0PTv An/ln9sVXf4W83f9Tne/9Imnf9k+Ku/wt5u/6nO9/wCkTTv+yfFXf4W83f8AU53v/SJp3/ZPiqC0 jRPOV7aSTSecbxWW5uoAFs9Opxt7iSFTvb9SsYriqN/wt5u/6nO9/wCkTTv+yfFXf4W83f8AU53v /SJp3/ZPiq2Tyx5vVQR5zveqj/ePTu5A/wCWfFV3+FvN3/U53v8A0iad/wBk+Ku/wt5u/wCpzvf+ kTTv+yfFUJqml+YNLs2u73zvfJCGVFC2NhI7vIwREREtmd3ZiAqqCScVSSyt/NdtfXb6jrWraNBf XUYjvZrXSpI5JDBFEpmMSz+gzFOC8gqfZH22oVWTf4W83f8AU53v/SJp3/ZPirv8Lebv+pzvf+kT Tv8AsnxVbJ5Y83qoI853vVR/vHp3cgf8s+Krv8Lebv8Aqc73/pE07/snxV3+FvN3/U53v/SJp3/Z Pirv8Lebv+pzvf8ApE07/snxVT8tXXmKDX9f0a91E6wbG3s7iyluI4bdudyJwyM1vGo41hXfgSN+ uKp7pGo3V2byK7t47e4spxA6xSmZGrDHMGDMkR6S0pxxVMMVdirG/wAs/wDyW/lT/tj6f/1Cx4qy TFXYqsP98v8Aqt+tcVS3zZZ3V75Y1aztU9W4uLOeOKEED1GaMgR1YgDn9mtdq4qxvzbfeate0TSJ /wAv9QaASX0a6nPCLT1YrYKyzI8d7HKEkjYiqcOYIoR1GKsD1Tyn+Z+palqbXmhlptUtrd2voJbC KATx6Ne20qSATLMzm5u1VW4MOP7QVRirdn+VXmQ6hrMuq6Pb6raNqlrqOjQ3DW8giQazdXN1EvqF uHKKQyk9xLx6gjFU9/LzSvPNj5iR9ftdYttKs4boxahf6lHcRypLKZIori3+v3vA26swElHZ/hq8 arwKrN/K88N7e6xqtmeWm3txH9VnH2LgwwJE9xH/ADIxUIrdGCVFVoSqnsn24/8AW/41OKr8Vdir sVSryz/xzpv+Y7UP+o6bFU1xV2KrJvsD/WX/AIkMVX4q7FWNedZVtBp2pzrIbGymmNzLEyo0HrW0 sKXHJyFXiz8OTEKvPkxCqTiryvTrX8wbacvrkUy6Bq2nahY2fl+61Vr65e8vDGYU+F7s3C8OKrMZ zwT1JGESngFXu0CSRwRpJJ6siqqvLSnJgKFqdq4qvxVZN9gf6y/8SGKr8VdirsVYto3/AJMXzP8A 8wWlfru8VTHTIIZ7vzDBPGssEt4qSxOAysrWFsGVlOxBHUYq8X07T/Onk3UdOg8o+XnsbXU/Mupr qyW+nIsUlh+mBFameVIpHSKOzmkaH+7QL8QchfTdVmf5GecPMnmXTdYfXrt7u5tJ7RB6kEduYnn0 62uLiJBGkYeJLiWQROeXJOJ5MDyKqI/LvRfN0n5f+WZIfMnowvpNi0UP1KF+Cm2QqvImpoNq4qyD 9A+dP+pp/wCnCD+uKu/QPnT/AKmn/pwg/riqw6D509Zf+do/Zb/jwg8V98VX/oHzp/1NP/ThB/XF Uuvfy91G+uDc3uqWd1csArTTaTZyOQvQFmqdsVUP+VXyf8tmn/8AcGsf6Yqsi/LCUqa3mn/ab/pT WP8AMfbFV4/K+UEEXmngggg/oax2I3B6YqnA0DzmBQeaKAdB9Qg/riqyTQfOnOP/AJ2j9r/lgg/l Pviq/wDQPnT/AKmn/pwg/rirv0D50/6mn/pwg/rirv0D50/6mn/pwg/riqWeXdD84tp8pTzNwH12 /BH1GA7i9mBO57nfFUz/AED50/6mn/pwg/rirv0D50/6mn/pwg/riqyXQfOnAf8AO0ftL/x4QfzD 3xVf+gfOn/U0/wDThB/XFXfoHzp/1NP/AE4Qf1xV36B86f8AU0/9OEH9cVS7TPIer6dcTzafrFrZ zSHjJLBpVpEzA0YglKE/Fv8APFUx/QPnT/qaf+nCD+uKu/QPnT/qaf8Apwg/riqyXQfOnAf87R+0 v/HhB/MPfFV/6B86f9TT/wBOEH9cVd+gfOn/AFNP/ThB/XFXfoHzp/1NP/ThB/XFUp8t2OqxecfN 1ve3v6SunsNN4S0+p7MLsKvKHkyb/truMVZD5YQRLqMDW31e4huwtyfrU156jm3hcP6s4V/sMq0p tTFU6xVCabpGk6XA8GmWUFjBJI00kVtEkKNLIavIVQKCzHqepxVJvyz/APJb+VP+2Pp//ULHirJM Vdiqw/3y/wCq361xVfirsVdiqQ+R9P1XT/LkVnqk01xdw3F4BPcy+vM8Ju5TAzyVNT6JT5dMVT7F XYqsk+3H/rf8anFV+KuxV2KpV5Z/4503/MdqH/UdNiqa4q7FVk32B/rL/wASGKr8VdirsVYb5Jst dh8zearjULXUbSynuY109b68S7glRDIzT26i4nMHMvT0vTjUIE2LcqKsyxV2KrJvsD/WX/iQxVfi rsVdirFtG/8AJi+Z/wDmC0r9d3iqaaN/x0de/wCY5P8AqBtsVTXFXYqwH8ubTzmfy+8sGDVNOjgO k2JiR9Ond1T6snEMwvUDEDqeIr4DFWQ/U/PP/V30z/uGXH/Zfirvqfnn/q76Z/3DLj/svxVYbPzz 6y/7l9M+y3/SsuPFf+X/ABVf9T88/wDV30z/ALhlx/2X4q76n55/6u+mf9wy4/7L8Vd9T88/9XfT P+4Zcf8AZfiqyKz888T/ALl9M+03/SsuP5j/AMv+Kr/qfnn/AKu+mf8AcMuP+y/FXfU/PP8A1d9M /wC4Zcf9l+KrJLPzzyj/ANy+mfa/6tlx/Kf+X/FV/wBT88/9XfTP+4Zcf9l+Ku+p+ef+rvpn/cMu P+y/FXfU/PP/AFd9M/7hlx/2X4qlfly087HT5eGraaq/Xb+obTZya/XZuR2vhsT0xVNPqfnn/q76 Z/3DLj/svxV31Pzz/wBXfTP+4Zcf9l+KrJbPzzxH+5fTPtL/ANKy4/mH/L/iq/6n55/6u+mf9wy4 /wCy/FXfU/PP/V30z/uGXH/Zfirvqfnn/q76Z/3DLj/svxVZHZ+eeUn+5fTPtf8AVsuP5R/y/wCK r/qfnn/q76Z/3DLj/svxV31Pzz/1d9M/7hlx/wBl+KrJbPzzxH+5fTPtL/0rLj+Yf8v+Kr/qfnn/ AKu+mf8AcMuP+y/FXfU/PP8A1d9M/wC4Zcf9l+Ku+p+ef+rvpn/cMuP+y/FUp8qR6pH5980LqVxB c3H1PSiJLaB7dONbug4PLcGvvy+jFU+0b/jo69/zHJ/1A22KvGvK/wCcnmTSvL8V5rNxJ5lvL/R9 G1G1t2SKBxealLdLPAv1G2LGNILQzgCF5OKt9rsqi9I/5yK1Cdra5vdChXTdU1K2tNPMN05uY7e5 g0+XnNEYWVnU6pGSeSx9U5BvT9ZV6X+Wf/kt/Kn/AGx9P/6hY8VZJirsVWH++X/Vb9a4qvxV2KrJ 3lSCR4o/VlVWMcVQvJgKheR2FT3xVjH5aWfmCy8sfVdbW4WeK6uTbG+mE90bd5mkjE7ie9BZOZQf vnqqg7V4qqyrFXYqsk+3H/rf8anFV+KuxV2KpV5Z/wCOdN/zHah/1HTYqmuKuxVZN9gf6y/8SGKr 8VdirsVYX5J0zzza+b/N935imSXTL+4t5NDSG5kmhjijEsfBYZET0H9FYTLxqrOWYHsFWaYq7FVk 32B/rL/xIYqvxV2KuxVi2jf+TF8z/wDMFpX67vFU00b/AI6Ovf8AMcn/AFA22KoaHyB5EhsJdOh8 uaXHp88izTWaWVusLyx/YkaMJxZl7EioxVcPIfkcTRTjy7pgmgMLQy/U7fkhtlCQFW4VUxKOKU+y OmKsd/Lq085t+X3lgwapp0cB0mxMSPp07uqfVk4hnF6gYgdTxFfAYqyH6n55/wCrvpn/AHDLj/sv xV31Pzz/ANXfTP8AuGXH/Zfiqw2fnn1l/wBy+mfZb/pWXHiv/L/iq/6n55/6u+mf9wy4/wCy/FXf U/PP/V30z/uGXH/Zfirvqfnn/q76Z/3DLj/svxVZFZ+eeJ/3L6Z9pv8ApWXH8x/5f8VX/U/PP/V3 0z/uGXH/AGX4q76n55/6u+mf9wy4/wCy/FVkln555R/7l9M+1/1bLj+U/wDL/iq/6n55/wCrvpn/ AHDLj/svxV31Pzz/ANXfTP8AuGXH/Zfirvqfnn/q76Z/3DLj/svxVK/Llp52Ony8NV01V+u39Q2m zsa/XZuR2vhsT0/jiqafU/PP/V30z/uGXH/Zfirvqfnn/q76Z/3DLj/svxVZLZ+eeI/3L6Z9pf8A pWXH8w/5f8VX/U/PP/V30z/uGXH/AGX4q76n55/6u+mf9wy4/wCy/FXfU/PP/V30z/uGXH/Zfiqy Oz888pP9y+mfa/6tlx/KP+X/ABVf9T88/wDV30z/ALhlx/2X4q76n55/6u+mf9wy4/7L8VWS2fnn iP8Acvpn2l/6Vlx/MP8Al/xVf9T88/8AV30z/uGXH/Zfirvqfnn/AKu+mf8AcMuP+y/FXfU/PP8A 1d9M/wC4Zcf9l+KpT5Uj1SPz75oXUriC5uPqelESW0D26ca3dBweW4Nffl9GKp9o3/HR17/mOT/q BtsVTXFXYqxv8s//ACW/lT/tj6f/ANQseKskxV2KrD/fL/qt+tcVX4q7FVsil42VW4lgQGHUEjri rEvypsPMun+T4LPzEsw1CGR1Mt1O9xcSrt+8mZ7rUOLM/L4VnZaUIC14Kqy/FXYqsk+3H/rf8anF V+KuxV2KpV5Z/wCOdN/zHah/1HTYqmuKuxVZN9gf6y/8SGKr8VdirsVYR5H0/wA5W3m7zdPrnqNp lzcRNpEjzF4zGHmosURnmVOMJi5ERRVbqHpzxVm+KuxVZN9gf6y/8SGKr8VdirsVYto3/kxfM/8A zBaV+u7xVNNG/wCOjr3/ADHJ/wBQNtiqa4q7FXjXkb/lf3+CfL/6L/wp+jP0bZ/UfrP6R9f0PQT0 vV4fBz4U5cdq9MVTz/rJD/vzv+5pirv+skP+/O/7mmKrT/0Md6q/8ofy4tT/AI6lKVGKrv8ArJD/ AL87/uaYq7/rJD/vzv8AuaYq7/rJD/vzv+5piq2P/oY7iaf4Ppybr+lOvI1xVd/1kh/353/c0xV3 /WSH/fnf9zTFVr/9DHckr/g+vLb/AI6nXicVXf8AWSH/AH53/c0xV3/WSH/fnf8Ac0xV3/WSH/fn f9zTFUu0L/oYb6lL9W/wj6f1u95ep+k+XqfW5fUpx/Z9Tlx9qV3xVMf+skP+/O/7mmKu/wCskP8A vzv+5piq2T/oY7iK/wCD6cl6fpTryFMVXf8AWSH/AH53/c0xV3/WSH/fnf8Ac0xV3/WSH/fnf9zT FVqf9DHcnp/g+vLf/jqdeIxVd/1kh/353/c0xV3/AFkh/wB+d/3NMVWyf9DHcRX/AAfTkvT9KdeQ piq7/rJD/vzv+5pirv8ArJD/AL87/uaYq7/rJD/vzv8AuaYqqeR/8W/4j82/4s+p/pn6pp9f0J63 pejS69Ph9Y/eerXl7dMVZb5b+o+nffVvrPrfWf8ATfrlfV9X0Iqde3pcKUxVOMVdir//2Q== uuid:6DFD6EE6D0FA11DC88C2B553B10A7876 uuid:6DFD6EE8D0FA11DC88C2B553B10A7876 uuid:6DFD6EE5D0FA11DC88C2B553B10A7876 uuid:6DFD6EE3D0FA11DC88C2B553B10A7876 endstream endobj 51 0 obj <>stream hޜMK@`vwJ@[Ӌbr+=v$%{g(ygEkAZ1*=r`|B<1 ;ɰ܋Uݻ|0чx/^ӁvƒA_*b!EF$^N݇hrz캞W^ٌ٬+٢1xSlcŸs{Hz-K|uM-պVyU}GLT=Eeɉ,r8M2iۡ?ԉvbDϣs.|q4׎MR VN endstream endobj 52 0 obj <> endobj 53 0 obj <>stream h|Yr+ ^r[1wq A@H>8}{@JU.xtt߾$͇t$*\**VyDeRU&^oLM3]F|(6Gq9l6(Țu& (5Z)La'Qf> cQnAB97wF._q+Wъ|uVQiEJ(][EĥtQEe]|scf8D+Ny!@bJ%zM&.VAw38 ^}BvQ)|lI"dj tVV쉰]ybH9r~`NͶ݋ѶB2HpBD`YO T/nh$ӽms3=o" " bT~h}0hW#TKPee8ڪXOa/DN.Bz^+P4_( %AG>P:H$wpsNwfplP:cѠo%L2m7r{Ζv$dG3\@-U_GKTJ]gD'(Dwt"M}8J‖o K!-,vT* K D6$F)) <1.J<Žo d`QGp 4/rH|˕R܌z]KLզ<J_In)sP1H*/Q/}kRf i>D`RtxO|Icy]G>stream hެAO1`ٶ!`p®'DK_TL^i@΀1( 4J#q"S.%5~Wv~Ƿ E7]ea2*w)5X}.}:Iv(dO4bgOd}"[Md#7{&^IA_Ȗ}]9ɢߠoqV*3"/kRzٵQҒ%dN!8Oւ35IΈy߭8XClKt endstream endobj 55 0 obj <> endobj 56 0 obj <>stream hެW]o6}#9T!J[6Æ= h8,~ι8ha-ĤHޏs=|뵙.We95nR獟+M^i0&MLͤ.&yQ8L昴_&lިNܨ\T)?SWJ[}r27|C-~zb,U8ԅ<Lge^c5gV͆ otf~:XFg * 88b6{ۋ#oډj&S_Ms_5M=ݤt./l\^qńq]b~5Dp'?~hZBC(ozվX0C,mz!ŗmkMވy5:kuΕMz]j<$vW`>_2|o%6d+CDᜁ88bC#xb56-C# *fE>~]Gb~TLov+rjLz|'{?j Xy`F: h=q`Ù]\6 I 8w r$V: ; !TS5Y!ZuŢfVJB[HẊWؕ.i|} J.~NqLQLYs[h}[2H6]G/ ??:Td /̘gl>t}Ĕ 3<΄gdp?D JsCj9St=p@N>uf6vbsüj9 ȫ0&mr1ᠾհ* 'Qڔ2G aka$ XOihXvQLl)&ͅdzIC'ݪ[ߎ< WB-h݂K?;eRݬ ]9Vr '[pdձu%&n9K 3U'gnDg30E3;eBͣ5I7LҚm"lpW=RRh:%,p$!]G,#J j̖g|楪1uƧ 2_ endstream endobj 57 0 obj <>stream h,M PE,k|*ȃtBԝ({A6rwr!PB@a~jKa_ѱ1[|O4:@+ :<=0s<|L%H">|mYjH X1+F6+/ZikO-Ys+: endstream endobj 58 0 obj <> endobj 59 0 obj <>stream hXr}Wq Ff7Y⊜JćrDBx#|cNw@Җd*O)>ËL񸛼N.޻ӇqEEcNmjR?2Wr:a^F;{vXut,SM2h/ղ/+ͶnԪ4/:훢[ESh6~CtHitmez3; Żծ) } 󯻫0l6 _~;K4Ţ on+K:֦xc5,jLrr7Eejx.|t:6Vr";1˺u_dE~::"8[DeT R: Piw 7G =no_ HO!C&4{ˮ8f]&'/-'0-<%'Z4Vj?7hu@9Ym׹|Ե /<u[wt%enHШm.#)NZ&X]; 8Eڦ]^{o7Bnbu$FP0v!5\S Xb MHq H-*?w3OpdU9O, ׆Y.qy6P98p\YT6fg k͉*ՑU^V t|$XH=shnE~˭&:t\&!7,u92LJ m~!o @jΪrHfi~LGm5Jeww?i RЅȩڌȸdul[iӮ"##K&@H@ YlБ ,+T.`JƽuH^J@]k5Kmt$NwYQX{󚬗D: PtU9zVbsnLS}K.\`~i/+'HA })PУ4|#wAܙ'xf9Qv{,^~>I8 ~a7JsqPFԖgT%TV-@CwGMRz;.f@e 0G>z @]TrYBzX ee!'ITc_Z(m>/Or*`NԊL}gg1heM$5+Sm 9aT ~~Ck霕ϗ`",4#.;gwԴ-d$_nd#QFSO؜/mfD;M<ЊV%dINcg<7nrI(-ϨQ0̫qvpэQOYψgeԆAlťUcJx2j MRw`f,ltrI?q7v?ɨȲ8Ft ``ڔ^m`wR6eI[8s{nd8UɁ #U_A~ 4pfm&=ܳzEGʎI, }7}Ą&!bvὄ9%%`&#-C|̨AM !"v5%̃f)a\n(1 AB(BI3/2M Vg=! [Ɨ gBJWdf sAXJ[9#* /U`#/ q&qs3X ?J0cNIê.e ؈PB\(zlSHcSkNrH޸)@9 )IV˟mlWݞoboq'6pMsv !opDi3GD&2:QhG$VF<˞͇7,d;JF Ïmfc$j endstream endobj 60 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-30T19:31:25-05:00 2008-03-04T09:24:47-05:00 2008-03-04T09:24:47-05:00 256 204 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAzAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq8k/PPyT5n8yajoM2i6THqiWttqEEzyC3LW81xLZtDLG89xbNA4FvJSeNZWT/fb VxVjAu/+chdTsm1rR7ufUJrc32lRQWkmlwW7vYXllaSXJFzHwMlz9WvZFfgwjJUKoWodV6T+XUv5 nSanrD+c4WgtTBp402OtmYlnWBkvvS+rF5WV5VElZiPtcVUBasqznFXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FUjvda1CDzppOjosR0+/sb65lcq3rCW0ktVQK3LiFK3LVBUnpuO6qe Yq7FWJ/mZ5tuvK3lyPUrSeyhuJLy2tIxqHIRSG4kEYQMHi4E1qXZuKKGYg0pirLMVdirGfzK8yXv lnyPquuWUtrDdWMayRPfKzwFi6rwKrJBVpK8ErIo5EVNMVZKjFkViKEgEjf+IBxVvFUn85azf6J5 U1bVtPs5NQ1CztZZbKyijeZpZwp9JOEdXKl6cuO9K4q35O1i41vyloms3KLHc6nYWt5PGisqq88K yMqq5LAAttU4qm+Kpb5n1C+03y1q2o2EaTX1nZXFxaRS/wB28sUTPGr7p8JYAH4h88VQnkbzA/mH ynp2sSMry3UbGR44xEhdHaNiirNdpwqvwsszqw+JWIIxVPcVadiqMwHIgEhR1NO2KsR/KXzje+cv y/0vzHfJHHdX3r+qkCGOIGKeSKiKZbjaidfUNevw/ZCrL8VdirG/JWuavqx11r97eWCw1a4sNOuL aJ4RJDbrGr81eW4q8dx6sTMCAeFeK9MVZJirsVYX5E86arr/AJj83aZeRQRwaBfC0s2hV1dkPP8A vSzMC3wBui9fs8eLuqzTFXYq7FXYq7FXYq7FXYqwnQL78wdd09tSt9T0mzge5u4YbeTTLmd1S2up IF5SDUIQxIiqaIMVTL6h+ZH/AFfdH/7g91/3k8Vd9Q/Mj/q+6P8A9we6/wC8niq1LL8yGFf05o/U j/jkXXY0/wCrniq76h+ZH/V90f8A7g91/wB5PFXfUPzI/wCr7o//AHB7r/vJ4qtWy/Mglh+nNH+E 0/45F14A/wDVz98VXfUPzI/6vuj/APcHuv8AvJ4q76h+ZH/V90f/ALg91/3k8VWiy/MjmV/Tmj7A Gv6Iuu9f+1n7Yqu+ofmR/wBX3R/+4Pdf95PFXfUPzI/6vuj/APcHuv8AvJ4qhJB+ZCarb2H6a0Y+ vBPP6n6JutvQeFONP0l+16/j2xVF/UPzI/6vuj/9we6/7yeKu+ofmR/1fdH/AO4Pdf8AeTxVabL8 yOYX9OaPuCa/oi67U/7Wfviq76h+ZH/V90f/ALg91/3k8Vd9Q/Mj/q+6P/3B7r/vJ4qtay/MgFR+ nNH+I0/45F14E/8AVz9sVXfUPzI/6vuj/wDcHuv+8nirvqH5kf8AV90f/uD3X/eTxVa9l+ZCiv6c 0fqB/wAci67mn/VzxVd9Q/Mj/q+6P/3B7r/vJ4q76h+ZH/V90f8A7g91/wB5PFUs8zX35iaBoF9r Umq6Rdx6fE072y6XcxGQJuVEh1GTiT48T8sVZPc6pPb6pa2klofq95IYYroOtOYhebdPtUpERiqL nvLS3eCOeZInupPRtldgpkk4NJwQH7TcI2ag7A4qq4ql8+qTwapb2ktoRb3chhgug6kFxC8xqn2g KRMMVTDFXYq7FWLfln/yiMf/ADG6n/3UbjFWU4q7FVsX2T/rN/xI4qgtftL+80LUbTT5/q2oXNrN FZ3PJk9OZ42WN+S1ZeLEGo3xV46fye/NaMy3EPmWGXUbXUhdaHeXdxd3UkFoBex+i7yozlvRvgm7 N9NBVVLdK/5x380ppU9lqd3pd1IYXgtm4SN9WK6bcabHwaWN+XOD6pzPFd4/ssRyZVlPkf8AKHXv LvnCLV55bCaxgmm4iNpVleF7doYJGiVI4FktqFY1UcFW4mC8QFUqvWsVWj++b/VX9ZxVdirsVSq5 /wCUp0//AJgb3/k9aYqmuKuxVaf75f8AVb9YxVdirsVeTfmx+VfmPzT5ih1PSX04xfU1tpYtQ5Hn JFJI8cZpDOPQb1S7jqWRKcT8aqvWQKADrTFXYqtl+yP9Zf8AiQxVdirsVYt+af8A5LrzD/zBS/qx VE+b9Q/RyabqH1ae8+p3E8/1S0T1biX0tPun9OGOo5yNSirXc4q8m/K3SU1P819T1e+0W/t0ie91 HTbrUPKltonGS4lVFH6Sjf17hlilkHGVAX5F23UUVe84qlWs/wDHR0H/AJjn/wCoG5xVNcVdiqU2 E2pXOsajyuVWzsrhYEthGKsGtYpeReta85T9GKvM/K0cv6Ll43d3GpvtQPCK7uI0Fb6boiSKo+gY qm/pz/8ALdff9Jt3/wBVcVd6c/8Ay3X3/Sbd/wDVXFWhHOOl9ff9Jt3/ANVcVb9Of/luvv8ApNu/ +quKu9Of/luvv+k27/6q4q16c4r/AKdfb9f9Nu/+quKt+nP/AMt19/0m3f8A1VxV3pz/APLdff8A Sbd/9VcVa9Oetfr19Xx+u3f/AFVxVv05/wDluvv+k27/AOquKu9Of/luvv8ApNu/+quKpD/i3ye7 pdN5nVZFLW8ckmqyowLSMjIvKYH4ntm+fD2xVPvTn/5br7/pNu/+quKu9Of/AJbr7/pNu/8Aqrir Xpz1r9evq+P127/6q4q36c//AC3X3/Sbd/8AVXFXenP/AMt19/0m3f8A1VxVr05zT/Tr7bp/pt3/ ANVcVb9Of/luvv8ApNu/+quKu9Of/luvv+k27/6q4q0Y5z1vr7/pNu/+quKt+nP/AMt19/0m3f8A 1VxV3pz/APLdff8ASbd/9VcVSLzxHN/hHVeV5eOpt2qj3dy6keBVpCpHzxV6VqFmLfzLpt+qW5a8 ma2djbp6wUWs0lRP9vrEBTwxVFWHmnyxqGqXOk2Gr2V5qtly+uafBcRS3EPBgj+rEjF04sQp5DY7 YqmmKpVrP/HR0H/mOf8A6gbnFU1xV2KpVo3/AB0de/5jk/6gbbFXlPlzWdHh0+aKa+t4pUvr8PG8 qKwP12bqCa4qmn+INB/6uVr/AMjo/wDmrFXf4g0H/q5Wv/I6P/mrFXf4g0H/AKuVr/yOj/5qxV3+ INB/6uVr/wAjo/8AmrFXf4g0H/q5Wv8AyOj/AOasVd/iDQf+rla/8jo/+asVd/iDQf8Aq5Wv/I6P /mrFXf4g0H/q5Wv/ACOj/wCasVd/iDQf+rla/wDI6P8A5qxV3+INB/6uVr/yOj/5qxV3+INB/wCr la/8jo/+asVebeZPy+8v3byXmk+ZjHfSST/up7y3Fskd60puOKCGQ7if2LBVHNT8WKvSf8QaD/1c rX/kdH/zVirv8QaD/wBXK1/5HR/81Yq7/EGg/wDVytf+R0f/ADVirv8AEGg/9XK1/wCR0f8AzVir v8QaD/1crX/kdH/zVirv8QaD/wBXK1/5HR/81Yq7/EGg/wDVytf+R0f/ADVirv8AEGg/9XK1/wCR 0f8AzVirv8QaD/1crX/kdH/zVirv8QaD/wBXK1/5HR/81Yq7/EGg/wDVytf+R0f/ADViqS+dNb0a XyrqccV/bSSPCQiLMhYkkbAA4q9c1n/jo6D/AMxz/wDUDc4q8Q/Ky8Nx+fPmuOLzDpM4tTqTtpen aZHa3vFbwIYry8bTIGlRGcFilyWaQA/GKkqs5/Kj8wfOnm+SObVNJ+p6X9SWV7trK8shJO7J6bwG 5ZllilX1CoQtxVUZmDSemirNtZ/46Og/8xz/APUDc4qmuKuxVKtG/wCOjr3/ADHJ/wBQNtiqX/l1 /wAopF/zF6h/1Hz4qyXFXYqti+yf9Zv+JHFV2KuxVan2pP8AW/41GKrsVdiq0f3zf6q/rOKrsVQ+ o30Gn6fdX9xUW9pE88xUVPCJS7UHc0GKvLR/zkPoC31va3GkXUV0wvPrkX1iwP1YWvqHjKWuECuw hXdqR/FtIwVjir1HS9RttT0y01K1JNrewx3MBYcSY5UDrUdjRsVROKrT/fL/AKrfrGKrsVdiq1/t R/63/GpxVdirsVWy/ZH+sv8AxIYquxV2Ksa/Mr/lAtc/5hHxVMNZ/wCOjoP/ADHP/wBQNziryf8A LXzNb6r+dHmjTX1TT76WyTUY4bWGfX5ry3UXsaSIy6iW0+NfhUOLYD4gAvwDFU8/Jr8l7TyBcalf DhHdXYFosVs90sckFvLJ6dzcJNc3Mb3EyFWJVVEe6ooq3JVnms/8dHQf+Y5/+oG5xVNcVdiqVaN/ x0de/wCY5P8AqBtsVYl5I8229n5fFs1jdSNFeagC8focT/p0x25SqfvGKp9/ji1/6t15/wBO/wD1 WxV3+OLX/q3Xn/Tv/wBVsVWp52tgpB0686k/8e/ck/7+xVd/ji1/6t15/wBO/wD1WxV3+OLX/q3X n/Tv/wBVsVWr52tgzk6debmo/wB5/AD/AH9iq7/HFr/1brz/AKd/+q2Ku/xxa/8AVuvP+nf/AKrY qtHna29Rm/R15QgD/j37E/8AF3viq7/HFr/1brz/AKd/+q2KrZPOljIjRyaZdvG4KujC2IIOxBBm 6Yqx1NO/LJGHp+RbRE4MhC2GmjZl9Omz9OFV+W2Kshg846dbwR29vpV1DBCqxxRRrbKiIooqqomA AAFABiq//HFr/wBW68/6d/8Aqtiq0+drb1Fb9HXlACP+PfuR/wAXe2Krv8cWv/VuvP8Ap3/6rYq7 /HFr/wBW68/6d/8Aqtiq1vO1sWQjTrzY1P8AvP4Ef7+xVd/ji1/6t15/07/9VsVd/ji1/wCrdef9 O/8A1WxVa/na2KgDTrzqD/x79iD/AL+xVd/ji1/6t15/07/9VsVd/ji1/wCrdef9O/8A1WxVj/5g +cba48laxALC6QyWzLzf0OIrTc8ZWP3DFWTahdifzLptkbiyjNrM1wIWuf8AS3JtZk4rbcP+LOVe fQYq1Z+SdItddGuJc6lLfBp2CT6lfzWw+sGrBbWSZrdVXoihKLttUAhVP8VSrWf+OjoP/Mc//UDc 4qmuKuxVKtG/46Ovf8xyf9QNtirzXyt/xypP+Y2//wCo2bFU3xV2KuxV2KuxV2KuxV2KuxV2KuxV 5Hq35kfmFpEskVxpp9GKS656hLpl36BWKS5MSKyTD+8SJBzI4oPiJYN8Kr1zFXYq7FXYq7FXYq7F XYq7FXYq7FUj88/8ojqv/GBv4Yq9P1n/AI6Og/8AMc//AFA3OKpfZ/mN5OvNaj0W2vXfUZZprZIv q1yqerbtMrgytGIgGa1mEbFqScG4FuJxVkuKpVrP/HR0H/mOf/qBucVTXFXYqlWjf8dHXv8AmOT/ AKgbbFWBeUPL/mC40Zp7eO0MD3t+UMk8iPT69N1UQOB9+Kp1/hfzT/vqx/6SZv8AsnxV3+F/NP8A vqx/6SZv+yfFWl8seaGFRFY9SP8Aembsaf8ALPirf+F/NP8Avqx/6SZv+yfFXf4X80/76sf+kmb/ ALJ8VaHljzQSw9Kx+E0P+kzeFf8Aln98Vb/wv5p/31Y/9JM3/ZPirv8AC/mn/fVj/wBJM3/ZPirX +GPNHIr6VjUAH/embvX/AJd/bFW/8L+af99WP/STN/2T4q7/AAv5p/31Y/8ASTN/2T4qh7zyVrV6 iwXtlptzEGWVY5ppJFDxsGRgGtiOStQg9sVRH+F/NP8Avqx/6SZv+yfFXf4X80/76sf+kmb/ALJ8 Va/wx5o5BfSsakE/70zdqf8ALv74q3/hfzT/AL6sf+kmb/snxV3+F/NP++rH/pJm/wCyfFWj5Y80 AqPSsfiNB/pM3hX/AJZ/bFW/8L+af99WP/STN/2T4q7/AAv5p/31Y/8ASTN/2T4q03ljzQoqYrHq B/vTN3NP+WfFW/8AC/mn/fVj/wBJM3/ZPirv8L+af99WP/STN/2T4qkPnzy35ji8n6tJNHZiJLdi 5S4lZqClaAwKCfpxV6DrP/HR0H/mOf8A6gbnFXiv5Y6V6X56+ZZoLYy0udRnumuPMmn6gsTSzBDP DpVtb/WYJSAsX7114RkoWJoCq9/xVKtZ/wCOjoP/ADHP/wBQNziqa4q7FUq0b/jo69/zHJ/1A22K pf8Al1/yikX/ADF6h/1Hz4qyXFXYqti+yf8AWb/iRxVdirsVWp9qT/W/41GKrsVdiq0f3zf6q/rO KrsVdiq0/wB8v+q36xiq7FXYqtP98v8Aqt+sYquxV2KrX+1H/rf8anFV2KuxVbL9kf6y/wDEhiq7 FXYqxr8yv+UC1z/mEfFUw1n/AI6Og/8AMc//AFA3OKvJ/wAudD1KL85/MN8/mjy1c2pa+ZdH0VNN GrKrXQpFqDR2cdyUj5AyfvuXqheRbeqr23FUq1n/AI6Og/8AMc//AFA3OKprirsVSrRv+Ojr3/Mc n/UDbYqlv5dox8qxfGw/0vUNvh/5b5/bFWS8G/343/C/0xV3Bv8Afjf8L/TFVkSNxP7xvtN/L/Mf bFV/Bv8Afjf8L/TFXcG/343/AAv9MVWIjcpP3jfa/wAn+Ue2Kr+Df78b/hf6Yq7g3+/G/wCF/piq wI3qt+8b7K/y+J9sVX8G/wB+N/wv9MVQuq2l7caZeW9ndNb3c0Ekdvcbfu5GQhH2H7LGuKvDI/yg /OSO8t2i1m0ht7RL02dsur6u3xXSS0MrhIy7LJcEeqoWQj4i3ILRV7holpqVto1hb6ldG41GG2hj vbhaESTLGBI4JVTRnBPTFUbwb/fjf8L/AExVYUb1V/eN9lv5fEe2Kr+Df78b/hf6Yq7g3+/G/wCF /piqx0blH+8b7X+T/KfbFV/Bv9+N/wAL/TFXcG/343/C/wBMVWSo3EfvG+0v8v8AMPbFV/Bv9+N/ wv8ATFXcG/343/C/0xVjP5lI3+A9c+Nj/oj7fD/TFUz1n/jo6D/zHP8A9QNzirxL8o57Ob8/vN1N X0a8mhTU1jsLDT3s72EHUIuf1q4WxtI7grxCszTSHluK1LYq+gsVSrWf+OjoP/Mc/wD1A3OKvLrL 82/NN/5on0OxvLC71e11p7G68vwaPqMrxWEWorbyTyaol0bRSlo6zMTHsxCFa7Yq9mxVKtG/46Ov f8xyf9QNtiqX/l1/yikX/MXqH/UfPirJcVdiq2L7J/1m/wCJHFV2KuxVan2pP9b/AI1GKrsVdiq0 f3zf6q/rOKrsVdiq0/3y/wCq36xiq7FXYqtP98v+q36xiq7FXYqtf7Uf+t/xqcVXYq7FVsv2R/rL /wASGKrsVdirGvzK/wCUC1z/AJhHxVFardwSa5o1pGS1xDdvLKgViFQ2VwORanGlXA698VU7PyTp Frro1xLnUpb4NOwSfUr+a2H1g1YLayTNbqq9EUJRdtqgEKp/iqVaz/x0dB/5jn/6gbnFXin5X3mm 3X556zHpr20N1bnWhqduFupXMS6gqr6bSandRxM87eox+qRU+IBaOrYq9Vl/MOzi86xeU5tI1OGe eX0LfVJII0sZW+qG7rDK0geUBEZGMaNwcUfjVSVU20b/AI6Ovf8AMcn/AFA22KvLfLWm6fLp0skt rC8jXt/ydo1JP+mzdSRiqa/onSv+WKD/AJFJ/TFXfonSv+WKD/kUn9MVd+idK/5YoP8AkUn9MVd+ idK/5YoP+RSf0xV36J0r/lig/wCRSf0xV36J0r/lig/5FJ/TFXfonSv+WKD/AJFJ/TFXfonSv+WK D/kUn9MVd+idK/5YoP8AkUn9MVd+idK/5YoP+RSf0xV36J0r/lig/wCRSf0xVijeePy5RQZo/RYv LGEfT5y37h5Ekb4YW+FPRZmP7I4lqchVVlf6J0r/AJYoP+RSf0xV36J0r/lig/5FJ/TFXfonSv8A lig/5FJ/TFXfonSv+WKD/kUn9MVd+idK/wCWKD/kUn9MVd+idK/5YoP+RSf0xV36J0r/AJYoP+RS f0xV36J0r/lig/5FJ/TFXfonSv8Alig/5FJ/TFXfonSv+WKD/kUn9MVd+idK/wCWKD/kUn9MVSTz tpmmp5U1R0tIVdYGKssagg1HQgYq9U1OH0db0m4ilmV7m6aGeP1pTEyCzncD0S3pD4o1NQtcVTnF XYqlWs/8dHQf+Y5/+oG5xV5/5X/NDztc/mFquheYfLl7ZaHFc3FtpeoxaRqPpPwuEit2N2pnjdJU LsztHEigA8jXZVh+oz6Lo/8AzkH+nfM93Y6HPHcyvbT3NzKqS2j2AtkKyyabGnIkKzIb/hH8QCnd mVe4aKQdR10jcG+Sh/6MbbFXnPla2vP0U5FrcMpvL8hlhlZSDezEEEKQcVTf6re/8sdz/wBI83/N OKu+q3v/ACx3P/SPN/zTirhbXp6Wdz/0jzdv9jirvqt7/wAsdz/0jzf804q76re/8sdz/wBI83/N OKuFtemv+h3O3X/R5v8AmnFXfVb3/ljuf+keb/mnFXfVb3/ljuf+keb/AJpxV31a9rT6nc1H/LvN /wA04q76re/8sdz/ANI83/NOKu+q3v8Ayx3P/SPN/wA04qwbzB+TGh6m73FpYXdhqczs0l6Ev3Yx ytI0yBBIijl9YfxXfdWX4cVZz9Vvf+WO5/6R5v8AmnFXfVb3/ljuf+keb/mnFXfVr2tPqdzU/wDL vN/zTirvqt7/AMsdz/0jzf8ANOKu+q3v/LHc/wDSPN/zTirjbXop/odzv0/0eb/mnFXfVb3/AJY7 n/pHm/5pxV31W9/5Y7n/AKR5v+acVcba9HWzuf8ApHm7/wCxxV31W9/5Y7n/AKR5v+acVd9Vvf8A ljuf+keb/mnFUj872l8fKeqD6pcCsBFWglUbkdSVAGKvS9Z/46Og/wDMc/8A1A3OKprirsVSrWf+ OjoP/Mc//UDc4q8q/LvR7XSvzp15lsryGbVE1S6N1MZ1ifjeWwYfv9K04zD419Pjd3CoOVD8XMqo jyromnSfmbH5jTz9oeoaxqrG5uNN0pZIJLy3SzNssawjU7qJ40MQl5mBn5L9sLsFXpujf8dHXv8A mOT/AKgbbFUJ5D/5RmD/AIz3n/UXLirIMVdiq2L7J/1m/wCJHFV2KuxVan2pP9b/AI1GKrsVdiq0 f3zf6q/rOKrsVdiq0/3y/wCq36xiq7FXYqtP98v+q36xiq7FXYqtf7Uf+t/xqcVXYq7FVsv2R/rL /wASGKrsVdirH/P/APyhurf8YD+sYqi9Z/46Og/8xz/9QNziqa4q7FUq1n/jo6D/AMxz/wDUDc4q 8a/KjSvL+n/nn5qks7pZtTv/ANKT3KRLYMQovoOSzNa6jeyR8Hb4Ve1gZyWL7rxCqJ/Lv8jPN3lv zlZa7f6v69nbSK0untey3duzLZz23rQwNa2qwsokiSFOTejGGXm4YcVXrmjf8dHXv+Y5P+oG2xVB eRDL/hmGirT17ynxH/lrl9sVZBWb+Vf+CP8ATFXVm/lX/gj/AExVZEZeJ+FftN+0f5j7YqvrN/Kv /BH+mKurN/Kv/BH+mKrEMvKT4V+1/Mf5R7YqvrN/Kv8AwR/pirqzfyr/AMEf6YqsBl9VvhX7K/tH xPtiq+s38q/8Ef6Yq6s38q/8Ef6YqsJl9VfhX7LftHxHtiq+s38q/wDBH+mKurN/Kv8AwR/piqwm X1V+Ffst+0fEe2Kr6zfyr/wR/pirqzfyr/wR/piqxzLyj+FftfzH+U+2Kr6zfyr/AMEf6Yq6s38q /wDBH+mKrJTLxHwr9pf2j/MPbFV9Zv5V/wCCP9MVdWb+Vf8Agj/TFWP+fzL/AIN1aqrT0D+0fEe2 Ko3Wf+OjoP8AzHP/ANQNziqa4q7FUq1n/jo6D/zHP/1A3OKoCy8haXaeYY9fF/qs99G10wjuNSvJ bU/W25FfqrSegqxj4Y1VAoFCQWVWCrJMVSrRv+Ojr3/Mcn/UDbYqhPIf/KMwf8Z7z/qLlxVkGKux VbF9k/6zf8SOKrsVdiq1PtSf63/GoxVdirsVWj++b/VX9ZxVdirsVWn++X/Vb9YxVdirsVWn++X/ AFW/WMVXYq7FVr/aj/1v+NTiq7FXYqtl+yP9Zf8AiQxVdirsVY/5/wD+UN1b/jAf1jFUXrP/AB0d B/5jn/6gbnFXmnkzz5qeu/mffeX4PONvf/oe8v2vtFS0kjb6pHJJEFaWSyhXlBLLDGoSc7IzM8vM CNV7BiqVaz/x0dB/5jn/AOoG5xVNcVdiqVaN/wAdHXv+Y5P+oG2xVBeREb/DMPxsP395t8P/AC1y +2Ksg4N/vxv+F/piruDf78b/AIX+mKrIkbif3jfab+X+Y+2Kr+Df78b/AIX+mKu4N/vxv+F/piqx EblJ+8b7X+T/ACj2xVfwb/fjf8L/AExV3Bv9+N/wv9MVWBG9Vv3jfZX+XxPtiq/g3+/G/wCF/pir uDf78b/hf6YqsKN6q/vG+y38viPbFV/Bv9+N/wAL/TFXcG/343/C/wBMVWFG9Vf3jfZb+XxHtiq/ g3+/G/4X+mKu4N/vxv8Ahf6YqsdG5R/vG+1/k/yn2xVfwb/fjf8AC/0xV3Bv9+N/wv8ATFVkqNxH 7xvtL/L/ADD2xVfwb/fjf8L/AExV3Bv9+N/wv9MVY/5/Rv8ABurfvGP7g/y+I9sVRus/8dHQf+Y5 /wDqBucVeQ/l/qEcv5163b32sXxVZr79GWVx5ttL+B5lmIMSaNb8JouMXNgkvMRgUI5AEKvc8VSr Wf8Ajo6D/wAxz/8AUDc4qmuKuxVKtG/46Ovf8xyf9QNtiqE8h/8AKMwf8Z7z/qLlxVkGKuxVbF9k /wCs3/Ejiq7FXYqtT7Un+t/xqMVXYq7FVo/vm/1V/WcVXYq1JIkaNJIwSNAWd2NAANyST2xViqfm j+XEj2zL5l04C5jmeDlcxpyjh5l5fiIpEBbyESH4SFqCcVZVHIkiLJGweNwGR1NQQdwQR2xVvFVp /vl/1W/WMVXYq7FVr/aj/wBb/jU4quxV2KrZfsj/AFl/4kMVXYq7FWP+f/8AlDdW/wCMB/WMVRes /wDHR0H/AJjn/wCoG5xV5R+WflvUtP8Azq8zak+hWVrbXyagW1e3t9ehmctfRvGs0mpcLGQyCrVt Qw+H4SE6qvbMVSrWf+OjoP8AzHP/ANQNziqa4q7FUq0b/jo69/zHJ/1A22KoLyJFEfLMJKKSZ7yp oP8AlrlxVkHow/yL9wxV3ow/yL9wxVZFDFxPwL9puw/mOKr/AEYf5F+4Yq70Yf5F+4YqsSGLlJ8C /a8B/KMVX+jD/Iv3DFXejD/Iv3DFVghi9VvgX7K9h4nFV/ow/wAi/cMVQ2o6XZahp91YXEYNvdxP BNxoDwkUo1D2NDirzP8A6F48t/Xhct5g11rilwySfWLZPTe5UrLJEqWyrEzM/OqAfFTttir0nSNG stK0my0u2Utb2EEVtC0nEuUhQIpYgAE0XfbFUZ6MP8i/cMVWGGL1V+Bfst2HiMVX+jD/ACL9wxV3 ow/yL9wxVY8MXKP4F+14D+U4qv8ARh/kX7hirvRh/kX7hiqyWGLiPgX7S9h/MMVX+jD/ACL9wxV3 ow/yL9wxVj/n+KIeTdWIRa+gew8RiqN1n/jo6D/zHP8A9QNziryH8ttJm0z87fMF9Jo1nbpqx1KN NTs7PzGs0hW8WX/SJ79P0bRuJ5NCac6BDxIBVe54qlWs/wDHR0H/AJjn/wCoG5xVNcVdiqVaN/x0 de/5jk/6gbbFUF5EkUeWYRRv7+8/Zb/lrl9sVZB6q+Df8C39MVd6q+Df8C39MVWRSrxOzfab9lv5 j7Yqv9VfBv8AgW/pirvVXwb/AIFv6YqsSVeUmzfa/lb+Ue2Kr/VXwb/gW/pirvVXwb/gW/piqwSr 6rbN9lf2W8T7Yqv9VfBv+Bb+mKu9VfBv+Bb+mKrDKvqrs32W/ZbxHtiq/wBVfBv+Bb+mKu9VfBv+ Bb+mKrDKvqrs32W/ZbxHtiq/1V8G/wCBb+mKu9VfBv8AgW/piqx5V5R7N9r+Vv5T7Yqv9VfBv+Bb +mKu9VfBv+Bb+mKrJZV4jZvtL+y38w9sVX+qvg3/AALf0xV3qr4N/wAC39MVY/5/kU+TdW2b+4P7 LeI9sVRus/8AHR0H/mOf/qBucVTXFXYqlWs/8dHQf+Y5/wDqBucVTXFXYqlWjf8AHR17/mOT/qBt sVQnkP8A5RmD/jPef9RcuKsgxV2KrYvsn/Wb/iRxVdirsVWp9qT/AFv+NRiq7FXYqtH983+qv6zi q7FXYqtP98v+q36xiq7FXYqtP98v+q36xiq7FXYqtf7Uf+t/xqcVXYq7FVsv2R/rL/xIYquxV2Ks f8//APKG6t/xgP6xiqL1n/jo6D/zHP8A9QNziqa4q7FUq1n/AI6Og/8AMc//AFA3OKprirsVSrRv +Ojr3/Mcn/UDbYqgvIjt/hmH4GP7+83+H/lrl98VZBzb/fbf8L/XFXc2/wB9t/wv9cVWRO3E/u2+ 038v8x98VX82/wB9t/wv9cVdzb/fbf8AC/1xVYjtyk/dt9r/ACf5R74qv5t/vtv+F/rirubf77b/ AIX+uKrA7eq37tvsr/L4n3xVfzb/AH23/C/1xV3Nv99t/wAL/XFVhdvVX9232W/l8R74qv5t/vtv +F/rirubf77b/hf64qsLt6q/u2+y38viPfFV/Nv99t/wv9cVdzb/AH23/C/1xVY7tyj/AHbfa/yf 5T74qv5t/vtv+F/rirubf77b/hf64qslduI/dt9pf5f5h74qv5t/vtv+F/rirubf77b/AIX+uKsf 8/u3+DdW/dsP3B/l8R74qjdZ/wCOjoP/ADHP/wBQNziqa4q7FUq1n/jo6D/zHP8A9QNziqa4q7FU q0b/AI6Ovf8AMcn/AFA22KoTyH/yjMH/ABnvP+ouXFWQYq7FVsX2T/rN/wASOKrsVdiq1PtSf63/ ABqMVXYq7FVo/vm/1V/WcVXYq7FVp/vl/wBVv1jFV2KuxVaf75f9Vv1jFV2KuxVa/wBqP/W/41OK rsVdiq2X7I/1l/4kMVXYq7FWP+f/APlDdW/4wH9YxVF6z/x0dB/5jn/6gbnFU1xV2KpVrP8Ax0dB /wCY5/8AqBucVTXFXYqklt+g/wDEV19X+t/pL1B9b4/XfqvqfV0py/49OXo8Pw/axVhWhf8AKyvq DfoP6t+ivrN39V+scPUp9Zkryp/lVp7YqmH/ACGX/lx/4XFXf8hl/wCXH/hcVWx/8rk4mn1H7Tfy +JxVd/yGX/lx/wCFxV3/ACGX/lx/4XFVqf8AK5OT0+o/a3+z4DFV3/IZf+XH/hcVd/yGX/lx/wCF xVaP+Vyeo3+8NeIr9nxOKrv+Qy/8uP8AwuKu/wCQy/8ALj/wuKrT/wArk9Rf94a8TT7PiMVXf8hl /wCXH/hcVd/yGX/lx/4XFVp/5XJ6i/7w14mn2fEYqu/5DL/y4/8AC4q7/kMv/Lj/AMLiq1/+Vyck r9R+1t9nwOKrv+Qy/wDLj/wuKu/5DL/y4/8AC4qtk/5XJxFfqP2l/l8Riq7/AJDL/wAuP/C4q7/k Mv8Ay4/8LiqW+Y/+Vm/oS7/TP1b9FcR9d9Dh6vpchy4V74qzi5/Qf+IrT6x9b/SPqH6ny+ufVfU+ ryV4/wDHry9Hn/t4qnWKuxVJZv0H/iKD1/rf6R9Q/Vef1z6r6n1dq+nX/ReXo8+nv3xVOsVf/9k= uuid:6DFD6EE9D0FA11DC88C2B553B10A7876 uuid:55491B3EF6E9DC118669A8FCEEB2D9C6 uuid:4897280377CEDC11945D974E704A7427 uuid:4297280377CEDC11945D974E704A7427 endstream endobj 61 0 obj <>stream hޜ?k0ſʍPK`h:K!2 6oߓBO:y\E``{Vm-K$/G=|'坶bOt0d!*f뎢~.K)䞛T3p 0& endstream endobj 62 0 obj <> endobj 63 0 obj <>stream hYrW` 2 :;\rYr%$ ɋ! >\3zfh ;Iɯ{'%+UJ*Ns=8dѫMlr3j jS66 Ɣ1GUv;* Go-c4.wZ4m àWoF4K㱟/}ݰKbÞdb#\ci1:Vdzgt,b!><=kLs,bu-=["'#ߔMX̷tYlٍnFsem:} ee_ )eېlqTU,<Pv-d3h帠 ,U.4pϯtWyƋ'gwSYdW6i>.9bY.1 SZ:X(h' ue7t{uV O?ӔM"i V0:S6m_V]P>~H&є!  _C$?ZFI-7ơj V9u 5" yĄgⲣ%7lu~'VFv0V\Lh{ A FUim<4nc*kԫz "< S)D"=o Z36bl t4߾8m!0:plIBɿ#`)~ֹ$&}yc绗\c,uvw}nӽxlz?6ɖw_/626_w'V-њYI_jyr ז q4VvÔt-xO= 9}T9?Dȴ5|7]>n朕 c5unby<>t}M' Yf Ze΃C2 ׃#)հuZB?c$M !6tu)N%ޜ|%Q\pRD C&da 5XCwTA͑z]Eza(!U^F%s~\i`|"|G8݋*9[;1/f0$I6İs6_|:HORl v,5]kpt269? KrKݟp0C=o^Ʀs~p)MIh+V(HL>Neɜ7e1U?N)CEiöNYI,X]kV0U on((nRd=c !}rfOH$E@ PD@ Hxctj[ս 5ט 9ZeP#٫sܖ42Or`.iyZh&s E`Smf5Kw[$nD$Td ",%rXz%C{H7;ΔmZ]Ao*3c+ u>=,_4U#a< /g\TNy}~{$ƶ`iKh \;ЀtP*vYc]O8\urz]l` ؟SB4g&_ iݜGze+F  k[;z7^c)]9;m*ɀ=l M]Tpr9u(cBj6]!awnE%kU tMbg;Ըi7ꔠӥMMr4Ø|\.~RwMk9|R)BFZOנX)!IJ(KM)4a/SȾ1+xϠZx+T;JH1ke5&*+Xs@xZ7U#WX(Qe{OT`~Io4j \#eƂgL~Vtn ͤ4 l&(5̼w̛aɵ!6zڕ'(DDANU 6k6cxRz6N&Bwt<KS?Ɓa]QkcjçĤ(XuڃwBVCk /xB5 'ttdC%0+ {/4{}/G'__X^>%5ZPG]ͥc.ɥ1lt1 eղEC?:rt/MŐmmX-W+WeDJ GUٞ 5!Uľ|N8t X :d^8 a< .rH,$+lIe&vPxi[W]bW[3z;7/9jyK .[3G{?=\wz`s!fq c6m_z 3L7Ø *q(ܕƽ Fju؏ [Y YeAfB*0f>G"%]Xҁ[cf;4Xkl[{~EVXp2Do䆂R{uZo+$ZP>stream application/postscript Adobe Illustrator CS2 2008-01-30T20:04:28-05:00 2008-01-30T20:14:22-05:00 2008-01-30T20:14:22-05:00 256 124 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAfAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXnX58tbL5Gt2u47Wa0XWdHNzFqDiKyeIajDzW6kZJVSEjaRijALXY9MVefeQ /PXnHTLLT/KejWVqserzX115fuRFPcWsFlDdXr3Iiq8JlgiCW62p+Dksi1HYKozSfzv86xw+WrSS 2ttYlvvL66le6gkTR87oWt3LKOEEkrj6vLaJDOIoG+Nj/dHhGyr0j8qfOeoebvLc2pX/AKBnhunt vUtU4wsEjjeqFZ7yNwDIV5RzMNt+LckVVmWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXNb 0zQ9IvNY1Wb6tp1hE093PxZ+EaCrNxQMx+QFcVRiOrorqaqwBU+xxVvFXYqhtT1Ky0vTbrUr6T0b KyhkuLmXizcYolLu3FQzGijoBXFVLQ9c0vXNLh1TS5jPZTl1R2R4mDRO0ciPHIqSI6SIysrKCCKH FUdirsVQuq6pYaTpl3qmoSiCwsYZLi6mILBIolLu1FBY0UdAK4qs0XWtN1vTIdT02UzWc/IRuyPE waNzG6vHKqSIyOhVlZQQRQ4qjcVdiqldXVvaWs11cyCK3t0aWaVtlVEBZmPsAMVUNG1fTtZ0mz1f TZfX0/UIUubSfiyc4pVDI3FwrCqnoQDirT6Lpj61FrTwctTgt5LOG4LN8EErpJIqrXgOTRLU0rt1 xVG4qg9Z1fTtG0m81fUpfQ0/T4Xubufiz8IolLO3FAzGijoATiq/TdQg1GxivbdJkhmBKLcwTWso oSPjhuEilTp+0oxVE4q7FUHrOsado2mzalqMphs4OPqOqPKxLsERUjjV3dmdgqqqkkmgGKqmm6ha alp9tqFm5ktLyJJ7d2VkJjkUMpKOFdTQ9GAI74qiMVdiqE1bVLXStPmv7pZ3t4KGRba3nu5aMwX4 YbZJZW3O/FTQbnYHFXaRq1hrGlWeradL62n6hBHdWkxVk5wzKHjbi4VhyVgdxXFUXirsVQGua7pm h6a+palI8dqjxRVjilnkaSeVYYkjihWSV3eSRVVVUkk4qq6VqdhqumWmqafKLiwvoY7m0nAIDxSq HRqMARVWB3GKorFXYqlXmvQh5g8razoJm+rDV7G5sTccefp/WYWi58Kry4860qK4qmcMfpwpHWvB QtelaCmKrsVdiqF1W3vrnS7y3sLoWN9NDJHa3pjEwhlZSEl9MlOfBjy41FcVS/yX5el8ueV9P0SW aK5ksYzG1xBE8CSfEW5lJJbl+bVq7NIeTVbatAqnWKuxVDanb3lxpt1b2VwLO8mhkS2u2jEoikZS EkMZKhwrb8aivjiqWeSfLR8s+WLLRGufrjWvqF7ng0fNpZXlb4XeZ+slKvIzHqzM1SVU8xV2KpZ5 n0C28w+X7/Q7qea3ttRha3nltyglEb7MB6iyJRh8JDKQRsRiqH8keWm8r+UdI8utevqB0q2jtReS IkTOsY4r8CbKANlFSaDcsakqp3irsVSrzTosmueXb/SElih+vRGB2uITcQlH2dJIg8JZXSqmjqd9 iDiqj5L8t/4a8s2Wieutx9U9T95HH6EY9SVpeEUXKT04o+fCNOR4qAKnFU7xV2KpD578pwebfK15 oM7xxpctBIGmi9eLnbTx3CCWHlH6kZeIB15Cq1FRiqL8r6IdC8taTohuGuzpdnb2ZunHFpfQiWP1 CKtQtxrSpxVM8VdiqW+ZtKutX8uappNpd/ULnULWa1iveHqmEzIU9QJyj5FeVR8Q3xVF2FjbWFhb WNqvC2tIkggT+WONQqj6AMVV8VdiqQeevKz+aPLc2jx3f1GV5rW4iueMjcXtLmO5X+5ltphVoqVj lRx1VgcVRflXQ10DyzpOhLN9YXSrOCyE/AR8xbxrHy4CoWvGtK4qmmKvnnyX5bstQ8naFf3l3qct 3d6daT3Ep1TURyklgR3ai3AAqx7DFU4/wZo/+/8AUv8AuK6l/wBlGKu/wZo/+/8AUv8AuK6l/wBl GKqZ8q+XxcLbG81AXDo0iQnV9R5lEIVmC/WalVLqCfcYqp2fl3yvemcWeo3tybWVre5EOs6hJ6cy fbjfjcni613U7jFVSTyr5fikiilvNQSSdikCNq+ohnYKXKoDc/EQqltuwxVU/wAGaP8A7/1L/uK6 l/2UYqoah5Q0qOwuZEuNSDpE7Kf0rqRoQpI63GKp75I/KTyPqXk/y7qF7BfTXl9pdrc3Uv6V1Nec ssEbu1FuQoqzHYCmKo2D8rfyll1T9EpJM+qx24uZ9PXW9RNwsbFQsjRC75qhLUrSmKoyP8lfy8Pp Vtb74kJP+5bVeu3/AC9e+Kpfr35P+RLXy/fXUFvfJcQ2M80b/pXVDSRI+StQ3JGxxVG+U/y28rXn lbRru5/SElxcWNtLM/6V1McneFWY0FyAKk9sVTB/y28iJcx2rverczK8kMB1jUhI6RlQ7Kv1qpCm ReRHSo8cVVf+VWeTv5NQ/wC4tqn/AGU4q7/lVnk7+TUP+4tqn/ZTirzew8o6VLYW0slxqbO8SM5/ SupbkqCf+PjFVf8AwZo/+/8AUv8AuK6l/wBlGKu/wZo/+/8AUv8AuK6l/wBlGKu/wZo/+/8AUv8A uK6l/wBlGKu/wZo/+/8AUv8AuK6l/wBlGKu/wZo/+/8AUv8AuK6l/wBlGKu/wZo/+/8AUv8AuK6l /wBlGKqcflXy/LJLFFeag8kDBJ0XV9RLIxUOFcC5+ElWDb9jiqnp/l3yvqNol5p+o3t5aSV9O4t9 Z1CWNuJKtxdLkqaMCDiqofKvl8XC2xvNQFw6NIkJ1fUeZRCFZgv1mpVS6gn3GKqn+DNH/wB/6l/3 FdS/7KMVd/gzR/8Af+pf9xXUv+yjFXf4M0f/AH/qX/cV1L/soxV3+DNH/wB/6l/3FdS/7KMVd/gz R/8Af+pf9xXUv+yjFUn86eW7LT/J2u39nd6nFd2mnXc9vKNU1E8ZIoHdGo1wQaMO4xVNfy8/5QDy z/2ybH/qGTFWQYqwbzh5V866tr0Eul6r9T0YvZtdxrd3NtLwgef6xGiwLT98kyfFzU1UexxVjF9+ WH5mXE8NwuvmO6itI7ZruPUbuOVwIbVXQFoJREPWtnlZ1BaStGp1CqKi/LHz1b2l7bWWvvaBry7u tMaO9vD6S3F1ayp6in4ZKRx3HJX5LyevdjiqJ8r/AJfedbDzDpV/q+qvqFpYM0nG51G5u5EZoLmJ gqtBBHJzM6HmwDKF4io6qvTcVQuqf8cy7/4wyf8AEDirNPy2/wDJf+U/+2LZf9Q0WKvO/OX5QeeN Q8y6xrvlrV10+51eF0jcX99aSxqYNPjUo8KSrEfUs3LcVPJeKntwVUPKPl380rzz5Pez393DpGn6 o8kkd3d6lHFcQG5uiyw28kaRuqwyQoqxt6FArcmaqhV6v5n/AOUV1P8A7Zt1/wAmcVb8kf8AKF6B /wBs20/5MJirzzzV+Wn5kanqWpXun6vHBPKt1FYXH6RvopUiur20mAiKROLMpbWzRUi5KzAMwbm4 xVS0j8uPzdt9XsLu/wDMH1mKG606e8H6W1HjIsApd/6OsUcXF/2IqhWbdyR8GKvYsVeSaX/xzLT/ AIwx/wDEBiqKxV2KuxV2KuxV5zqnkz8xLu6vjDrfoQGaWXTyl5dow5fXpIhIiIAoSS6t14VZWWLf suKoGy/Lbz0uoRzXOsskEl3NPqP1a/ula5Vre1gVpQ0R5chBL+7DKI+Y4N8NMVQ1p+WH5lWuhWdh B5jaGe1t0tSYb27VPSV7pmROUbqhKy26LJwLIENNgAyrJPKnk7zNp3mddV1a9F7FHpwskke7nuJe Zisw49N4441Hq2srGRfik5AsK4qznFXYq7FXYq7FWP8A5h/8oB5m/wC2Tff9Qz4qnmjflN530jR7 HSrbzRpj2+n28VrC8mjXBcpCgjUsV1NRyou9AMVRn/KuvP8A/wBTNpP/AHBrn/vKYq7/AJV15/8A +pm0n/uDXP8A3lMVd/yrrz//ANTNpP8A3Brn/vKYq7/lXXn/AP6mbSf+4Nc/95TFXf8AKuvP/wD1 M2k/9wa5/wC8pirv+Vdef/8AqZtJ/wC4Nc/95TFUm1Pyj59lnk0ew8waVfXrLwulXSLiOK3jcbtN L+knCMVNVQKWPhxqwVZTonlX8ytH0fTtKtfMmjPb6ZaxWcDy6LdFzHCixqXK6qoLUQVoBiqMXSfz SXjTzFofwLxH+4S76bf9rb2xVy6T+aS8aeYtD+BeI/3CXfTb/tbe2Koe/wDLn5m3unz2MvmPRViu IJLZ2XRLsMElXiSK6qRWntiqX2+j/nTo1laafp+qeX7zTrCCK3jdtNu1umSJAg/dnUFiLUHeRRiq /wDSv5lxbahqun6e3U+r5dvZYwP5mmttWnhUf6zjFUbp8nn/AFKNpNO83eXLyNDxd7fSLmVQfAlN XNMVRf6N/NP/AKmHQ/8AuCXn/eWxVjtv+Wnn2CCOFPM+lFYlVFJ0a4rRRQV/3J4qv/5V15//AOpm 0n/uDXP/AHlMVd/yrrz/AP8AUzaT/wBwa5/7ymKu/wCVdef/APqZtJ/7g1z/AN5TFXf8q68//wDU zaT/ANwa5/7ymKu/5V15/wD+pm0n/uDXP/eUxV3/ACrrz/8A9TNpP/cGuf8AvKYq7/lXXn//AKmb Sf8AuDXP/eUxV3/KuvP/AP1M2k/9wa5/7ymKu/5V15//AOpm0n/uDXP/AHlMVd/yrrz/AP8AUzaT /wBwa5/7ymKu/wCVdef/APqZtJ/7g1z/AN5TFXf8q68//wDUzaT/ANwa5/7ymKu/5V15/wD+pm0n /uDXP/eUxV3/ACrrz/8A9TNpP/cGuf8AvKYqg9Z/Kbzvq+j32lXPmjTEt9Qt5bWZ49GuA4SZDGxU tqbDlRtqg4q9VxV2KuxV2KuxVp3SNGkkYIiAs7saAAbkknFUg+vahr/waW7WejN9vVaUlnXwtFb7 KH/fzDcf3YNQ4VTjT9OstOtVtbKIQwLU8RUksxqzMxqzMx3ZmNSdziqIxV2KuxV2KuxV2KoG/wBC 0XUJFkvrGC5lQUjmkjVpFH+S5HJfoOKoX/DrQ/7wapfWncqZvrSk+/1wXDAeyFcVdTzfb0obDUgd jX1bFlA77fXQ5PyXFXHzDJAK3+lX1qvZ0iF2pI6hRZtcSU8CyL/DFUTY6/ol/KYLO+gmuAKtbK6+ sv8ArRE81+kYqj8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQeqatZaZAst0x5SN6dvB GC8s0hBISKNas7UBO3QVJoATiqWppN7rDrca8ojtAQ9voikPGCN1a7YfDM468B+7U/zkK+Kp9irs VdirsVdirsVdirsVdirsVdirsVQ19pmm6hEIr+0hu4gaiOeNZFB8aOCMVQI8s2kO+n3V3pzdFEE7 PEo8Ft5/Wt1+iPFWvq3mq2P7m8tdQiXZYrqJoJm93uIS8f8AwNvirhrep24pqGjzoF/vLizZLuED /JUGO5b6IMVVIPNGgTTLB9dSC6c0S1ueVtOflDOI5P8AhcVTTFXYq7FXYq7FXYq7FXYq7FXYq7FX YqlOo6463TabpcIvtVABkj5cYbdWFQ9zIA3Co+ygBduw48mVVdpehpaztf3kxvtXlXhLeuvEKhNT FBHVhFFX9kEk0Bdmb4sVTTFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVO4t7e5heC4iS aCQUkikUMjDwKmoOKpX/AIT0aP8A3iSTTSN1Wxlktowf5jDGywsf9ZDirv0f5kg/3m1dLlerC/tk dyfBXtjaqoPujYq79KeYID/pejGVez6fcRzADvyFwLRvoUNirh5t0BCFu7k6ex6C/jkswT3CNcLG r/7EnFU3R0dFdGDIwBVgagg7ggjFW8VdirsVdirsVdirz/8AMjzh5m07WNO8veX7S3knv7ee8urq e6a1ZILeSKIpCy294BI7Tr8TIaAHapBCqW6d5z85adara2XlPSYoVJYj9NXTMzsas7u2mFndjuzM SzHcmuKon/lYvn//AKlnSf8AuM3P/eLxV3/KxfP/AP1LOk/9xm5/7xeKu/5WL5//AOpZ0n/uM3P/ AHi8Vd/ysXz/AP8AUs6T/wBxm5/7xeKu/wCVi+f/APqWdJ/7jNz/AN4vFXf8rF8//wDUs6T/ANxm 5/7xeKu/5WL5/wD+pZ0n/uM3P/eLxV3/ACsXz/8A9SzpP/cZuf8AvF4q7/lYvn//AKlnSf8AuM3P /eLxV3/KxfP/AP1LOk/9xm5/7xeKu/5WL5//AOpZ0n/uM3P/AHi8Vd/ysXz/AP8AUs6T/wBxm5/7 xeKpvp2v/mdf6fbX0PlzRFiu4knjV9buwwWRQwDU0oitD44qiP0l+af/AFL2h/8AcbvP+8Tirv0l +af/AFL2h/8AcbvP+8Tiqhb67+Z8811EnlzRA1pKIZCdbu6FjEkvw/7ienGUfTiqv+kvzT/6l7Q/ +43ef94nFXfpL80/+pe0P/uN3n/eJxVQuNd/M+Ca1ify5oha7lMMZGt3dAwieX4v9xPTjEfpxVX/ AEl+af8A1L2h/wDcbvP+8Tirv0l+af8A1L2h/wDcbvP+8Tirv0l+af8A1L2h/wDcbvP+8TirHLf8 y/PlzbRTr5Y0r05kV1DazcVowrv/ALjD44qlr6zrxdnh8m6RZSuSZJbHXLyzkeu/xvbabEzfScVW /wCLfzYg3srLTmA2WK+1SW5jUexj0u2mJ92lOKsp8h+evMOs6ze6Jr2mWllfWNpb3huLG6luYpVu JJY6cZYLdoypgPduuKs4xV2KuxV2KvMPP/8A5MzRP+2LqH/UXZ4qtxV2KuxV2KpLr3mvTtEurO2u 45nkvf7oxKpA/wBIt7b4uTL+3eIflX6VWIT/AJ06czW7W+m3ccUZ9fUVnWAuLVtOl1CIxelcOGeV EHHsNw3E8aqrIPzk9TzBJbyaRfW9kLOKWCxmt4o76S4kv/qJBL3KJGqyMoCstT8R5CgDKrr387NL m0K/vtF06+mmgSlnJcQLHbysbeacuGaWMtHELVxJQ8q/ZBxV6VirsVdirsVdirUH5xaH5f0Oztbj TNQuRZW0cLz2wtSjNbaWmpXPESXEb/ubYhm5KOXRORxVdY/85AeXb6AzW+hawwaKKa2UpZKZxM1m EEdbsAErqcD/ABlRxJ7imKoOw/5yH0T6oLm+0rUZbaQXd2NQs7UG1gsYbm7SFrl5JVZJTBYO7IBU kUUV+HFXoHlrUI7uPUtR4NDHcTQ3HpycS6K9hbPxb02kQkV34sR4E4q8/k/5yI0NWtb8aberpE1p dzyQskBvC9vDZ3iOnG4MPp/U7xpGDNzqONOXwlVE2P576WmpRaJqthcx6vcahd2UEtukT23px3z2 dtO9J2lVHYLG547SdQoZaqsq0bV7jWtC8laxcoiXOpJBeTpGCEV59NmkYKGLHiC21TiqR65+cWn+ XNb1iy1mznktbG6WOK4s0RvSt/Q07nLcepKjN/pGqxoBEpNP2dicVVNM/N/Tb7Ura3Gn30ZvZbe0 js5IrdZYJpLi9gklmlF08bRj9HsaICQNxz5cVVX/AJdfmvZeeta1ODTbaW20/T7W0lpdIqTma4kn qaxySxPE0McTxsp3DVriqQ6R/wAcmy/4wRf8QGKovFXYqu8gf+TM1v8A7Yun/wDUXeYq9PxV2Kux V2KvKfzQuhp/n3RNQnt7qSz/AEVfQGa2tbi6CyvcWrqrfV45StVRiK+GKpP/AIz0f/fGpf8AcK1L /snxV3+M9H/3xqX/AHCtS/7J8Vd/jPR/98al/wBwrUv+yfFXf4z0f/fGpf8AcK1L/snxVC32ueUr 94Hv9Lu7t7VxLatPot/IYpAQQ8Ze2PFhTqMVQjz/AJfPIsj+X5GkRDEjnQb0sIzEICgP1XZfSUR0 /l26YquguvIFv6foaDLF6ShIuGg3q8VWX1gq0tdgJfj/ANbfriqmx/Llo3iby45ikaNpEOgXhVmh UpESPqm5RGKr4A0GKpv/AIz0f/fGpf8AcK1L/snxV3+M9H/3xqX/AHCtS/7J8Vd/jPR/98al/wBw rUv+yfFXf4z0f/fGpf8AcK1L/snxV3+M9H/3xqX/AHCtS/7J8VTfTdV/KOfSLI6zoIudRNraLeyX Pl+8mkaS3hWNebtaNyMY+FTXYdMVV9Y1D8nNVsEsJ9NmjtVlt5Gji0K9UOttJBIsLg2bBon+qRI6 U3VQOwoqiZdd/JuW5gupdDElzbNztp28vXpeNvUM3JGNnVT6rF9v2jXriqtonn/yTpxvraCK9tLE TRrYwQ6RqUcawR2kEKrGiWwCKvplQBSlMVSLy5D+S2iaM2lGwuNSgeVpne+0C5cln9IH4IrCKIf7 zxk8UFWUM1W3xVNRrX5MC7W8Ggr9bS4e8S4/w9eeoLmQhnnD/U+QkYqCz9TQYqibj8wvJkT6NDZR 3sVpYT7RRaRqSJFCtpNEgVRbABQWVQBiqjq/mL8ptXLyX2nTTXRLSR3raFftcRytGsXrRytaMyyB I0AYb/CvgMVQHly6/KDQ9Ks9Ojs7m9+ozG5t7q60G69VZvXluUdPRsIY4zFJcSen6aLwrt3xVNdF 82flRoYkGiaW+liagm+paDf2/MLUry9K0WtORpXFWE6d5t0uHT7WGS31JZI4Y0df0VqRoyqARtb4 qiP8Z6P/AL41L/uFal/2T4q7/Gej/wC+NS/7hWpf9k+Kpx+V90NQ8+63qEFvdR2f6KsYBNc2txah pUuLp2VfrEcRaiupNPHFXq2KuxV2KuxV2KuxVj3kXXtS1zRri61JIY7q31LUrBltwwj42N9NaoRz LNUrCCT49h0xVkOKuxVies+YfMFr+YGg6JZ/U5tM1COaW/gKSvexxQxylrnmrrFFEsvoRDkjF2cj 4eNcVZZirsVSXzjqOqad5fuLvS5LeG8jaLjJdxTXKBGlVZOFvblJp5ShYRRIwLvxWu+Kt+StbuNe 8n6HrdzGkVzqdhbXk8URrGkk8KyOqkk7BmoN8VTnFXYqwHyP+ZbeZvzA86eXUFutj5be1hsmQn6z I5M0V56qljQRzwcVoo+Egn7QxVn2KuxVhXnvzfr2heY/LNrZwxnRtRmMesXbW/1l4ud3aWtuqgXN p6Yle7KmQLLxNDwIrirNcVdiqSed9euPL/k3XddtolmuNLsLm8hikrwZ4ImkUPQg8arvv0xVS8ia /fa75Zgv9RjWHUVmurS+iRPTCT2dzJbSLwEtyq0aE1CyuPBmG+KsgxV2KsUste1+X8y9R0Ey2c2i WemQXrLHBIl1BNcytHDHJMZ5I5A4t5n2iQgcevUqsrxV2KsD/ODz7q/kzRtNvdLhgmlu7028wuY5 JVEaWk9ydonjKVMAVpTVYwSzAgYqzzFXYq7FXYq7FXYq7FXYqpWtnaWiNHawR28bySTOkSqgaSZz JI5CgVZ3Ysx6kmpxVVxV2Kpdc+W/Lt1rFvrdzpdnPrNonp2upyQRPdRJ8XwxzMpkUfvG2B7nxxVM cVdiqF1TStL1axl0/VbODULCenrWl1Gk0L8WDLyjkDK1GUEVHXFVa2tre1t4ra2iSC2gRY4II1CI iIOKqqrQKqgUAGKqmKuxVSSztEupbtII1u50SOa4CqJHSIsY1ZwOTKhkbiD05HxxVKV88+SXvLyx XzBprXunLK+oWovIDLbrb19Zpk58oxHQ8+QHHviqdKysoZSGVhVWG4IPcYqgtQ0LQ9RurO71DTra 8utOcy6fcXEMcslvISCXhdwWjb4RutOgxVHYq7FVk8EFxBJb3EazQTK0csUihkdGFGVlNQQQaEHF VHTdM03S7GKw0y0hsbGAEQWltGsMSAksQkaBVXck7DFUTirsVUIbCwhu7i8htooru74fWrhEVZJf SHGP1HA5PwBotemKq+KuxVB6pouj6tFFDqthb6hDBKtxDHdRJMqTJXhIokDBXWpow3GKozFXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXznLa/mBb6rqUum2F291ot/5w1PSkXSbmJoZ rpLs2cwvJy9vfCd5EEcEMf7QLV44qnOiar+b2n3mmWkkmsXqz6/fjU/rNkrAWpvYvQVZ2gEYgNrI 0go0aj4gsoKLAyr3PFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== uuid:81CE9479D0FE11DC88C2B553B10A7876 uuid:81CE947CD0FE11DC88C2B553B10A7876 uuid:81CE9478D0FE11DC88C2B553B10A7876 uuid:81CE9476D0FE11DC88C2B553B10A7876 endstream endobj 65 0 obj <>stream hޤN0Dep^u,J. UPT*5R{IzidP@A4"LE<(\hD+A@,ǮHH|wn[浭"j=~L}gYILFV8^E3ϴmW%E6gqVRB&U"S%&yS.BAKGOmB{*œsy:ZgD,=ᄏ9TGCf3tMnsznL Jld}Gm`0ڋǑed $8 Memz*ϻt'y6)mnݸ`-_ endstream endobj 66 0 obj <> endobj 67 0 obj <>stream hޜZr8}W2H@c'f_6[SD˜%(%w~({*}7jN޼'j2;Sy$r]ZMRUMgdA3|=TTɝbRJO\G-ǣ7*-Gr%~ikA؊>܁t$ /cT xJtSMtN @ήbߊ+(U#_0>.T#m4aab|I:\ڊrѾ~}?yj2erSi{+.-υI# HrEaᮟPhorhXI4H`eK@ jq ؔx ȱ 4Ǭ\S6x U$r}T/ԛMC8T uMNWk\Bg6RͶ\ad/r) RHZ3oVm<? rfgzEN[$W ZGO0rʧ )S&.plD~c(E(0-~E)o+Ahl< gFL '8hj)n Ζ&O*e? (+8|c\FWGDWMIDiS6ޯtv>~Ձw<|rڏHIkvI7#v2_#ՁhXX#IG&^1(&!j-.8TJsXv R܎i♢k- LchJA>u\MضuG~S;9CF Ϣw~PXĒ[砃 ưĜ=~?#l5IEn gCBC\@F9/ȣc5 1kpHMK/(憽Jqm#ғ u0DA҅A>2V4_v]1Ai&+dhBL)DԌZ*"5>Ik.+e׿^\byAe%P[I"D<9r.j$e8K6.$HVuNk(]l$N^QiTb#4R;Ŗ3SC*.kjH<~ [+SRe~](9[.W'uJRkgw $q᳓URoWBoB; 15JJB .E&}Ĺћ/I1U/{0v%PoE"*+V 1T2Fr^|r)ױGSN߉.+dp6hr.=,؅&b BX?qv[>]v"L1Ȅ%rνC/~GYkx@՜^zDof9Dڸxد,1jۢ_P.s(/s:~pe9;e+!/OncFΙ-ݗl ͻ$>Cqn k{Q?l?rIyşg7ͬfVJ9vAB ne=.? 4@"5plP[>j2z3}Qw/'h_Mp鿳:迃Rw2/O Z| /'\^C]Uzˇ?\W1]ѤҞcㇺ&bqo-XQbV>)X59]m#kDCs8?  0'!ԙZԊsv5G*-/Wz{mܝ6u̬ L 9@_37u#f4NUu߂x _GNFhfY=Zɝ9ukdž=mMYKFGpJz(43l endstream endobj 68 0 obj <>stream hެOK1ſ`IʂR҃"JP)ޛoEZTX },n>d^7;w;Ms_ўbE 2`~?xm+ɰ#Zb!"9^BnȡԆ>*ɴcjȏ9_ HϦl?OYӞ5d. ?dǑ4ˊU0v혎yu %C endstream endobj 69 0 obj <> endobj 70 0 obj <>stream h޴ZnH}W豹}Sd6 ' 5,ɦm-t DىNUmK [թK*ϛ.9y;>y$?R yU5/NI^^e䳺+Ug>j miU?UGYyPcL"4i6'>7r?8]y.w^NSH {TVlz ˼T"9ތl&xw4.j!=$WlX̆F6UjMKL3Vą< |Q~ w`]ܜͣiG #l+F5ůvv-]/EqLDDkӗ48$k Rl |AcR'[N$ h/l}͗ MV͌,3㾾 ܓ'I~Mڻ11wf#Z[_vX[2F&PX9erOu+Av+Îv&?41%,xI@n.!t5ou%qg|[P\V^SehOnwnwdnvE=x v8Igt1˧h2ʼAw^{W [5)HwMFX2 xH^oO[y2_.it.9!2 {OCSSؽ1`ͫ1ݟ;`=}{8z=dAwu/wc㞇'w(@Xξ>&YG\qkpώ:|ʽ qȾ` #el&րg/zvվN@wP8 a^Ҁ~5Y1E2s&Kp(bQ2(ֆȀI_(|x:_YY*Zy!qd䉢ml+}TcHE(.cHQAy.?|.}'yP-xefYoy8(_g 4M! p& $e{ՙyP(zЬ.[xOE>e7MY ɵ@+*|x7YO6uYM+ ʮEQDusJ`|}om#jtG x'S҅NA9-jWK( _K1Q'ڟzNKT51FGob%U;d3j=]EKo$BV_ni:.y!0 z3\+"2姕l'ΫTP܎Idb KRK_284>stream h,1 `W#lVMLoU/_Jރ1E<& eyh$F X~`3In߉n=^p#r#| endstream endobj 72 0 obj <> endobj 73 0 obj <>stream hޔYrH}W豹e1fL5I&LdBYYҒT2^MǙT,} @.ի7.͕M-'\ڸUWbK;zelTF3Y]ƕq-$Xy{ILYFY7}fF4qfhYƹG6SW?W.}ȓ*"EUpVqh\,>f\յKH23Rf7^5qӉ>Vݷ⊅SEm,g{t#m@22M'#X`ӾX[.qKkkeȪЮZhYh rqiymp ~/m쬳ARh6;<[V4>ў\6WA`.dp?F^+$~8V)NK#-+i83qv@ DT_*&%I3 XȒG}wwX(Okq gtD8"YBWD Sl0r2}b߾ebg0zpxvv_A+3N4:Ɩ5P_^B_\ㄲcZ J~ISNZ\b+&b.\jEvQ9%Nj+^ Oh߅tGDVli& ?4ap;O$z/a"dx^?o2ɮ 䤤3|dh-eIes`eqwo%;HAD*.S5GqVF8G?;$-tH.爖%9ӝ`f9b3ȉBX :ȰHLu(egq)eY&GB0mel:R'f tq-4&HnpP'90#^/c2daF\M 38R+(\bf90y.Fia~ f# {QC5i+ٽ%DNH!qu X |'p(+&|F wDIDT'Rb gBqv9M!~5ۑcp2 0/ёڵdLAjx|KPa8 ru̱fy%dlyniQFs6Y.ryĺ,[nmw\V@tFkrKV++'<]?mCԆcx+7Fդ>Q1-7l3Ւsa!{d3l%p-{Chkm j1J} iL̎ՍkO# cR=aajزq se $ÚI@nvI 1:X'#@Bo4B:Ή $d* #Ai,jUތ͙D$ F /M^(9 nx-Yl:Y;q-gYMkh=vTU͟RKA Gv}۵#"|H.l'TiLlV*`b z^jQ oE媏KЂoI%_^6d{MܮȹQKf_wٟ- V# ~ Nj#A{w\6OMkd=7.:i!vhsI]*C[ E{iIi:JQ|9n}q*N<fq^KVㄐЀFMШZS.Lz! weL؋9 Bp%]j5\kFWXH\)`Cii@q:*p - lЈBeI/:*B ʔr%/7\c 7ӵԅb\ReOYdɓZNEw).(E4}#8lgpC6FQᲝJx~Xn]+=ZDquHH5bЃ{Apw`^bZѕp<;)IslI!%RYx~>Xx'U?Xubar2/3[$ 75$ >^hrOeC!4Ӄ؞VGܕ5Kl?j ?|\Q gD [J{8V!?! [n2 y 59Nb{5Ap!ІSºR-7S#qs~(C:^hmR[D4B}wB'0U%X.`r endstream endobj 74 0 obj <>stream hެOK1ſ`2LAYPtVz5Fm׃x! LBHP4`=2s }OyآƝ^r7kɇ%*Tѩ聣xKv]_w3)4gډm6d&ӄrGQ{him黵B<_X0ǹvb3zc˪)ůV*]]15p> endobj 76 0 obj <>stream hތWێ}W/NN`cyXF4 t貶CƜSդffm'`ԗSow;]&fqjդRjݴlJnROד=& Lf?O>tU2}TlGoT|W]՚{W8nTNA*4zn1)fzeYpܼ V,? xeE9sf~s(-~`q5fW d_-v88TUNIhvԩjk*?BR7=$z_E7WvlSNm8k_yP<$.W|:Ϡuog3:Yڨ|3=RSu#bTc/'xe<A+sx{7òZ0O=tt.cˢTIJ\< 5xJžl Cߘ72K:3ΏffϷqH ¬j J>e+.C<`^rwUZsP,@,\m6KNm^"ՈR G.58+AX+5Qy2әvG1;}Ѭ݆3Py~TW[!2x˖uX|ё b2iԝ/VZ"qmke7 L]x4X8J6CRf$d{64q lO88Kn{ΚЩe>FeW߀6l8?ȕZ=ۋ*=`RD5<_>T̔t/;AXA9JxuxS0Yn.4At5=UsR4-VPS&f9.+FSY [ - lE?/V>qMUBBh" hPid&C~\4f}#&mV<~>VX "qρZS>y\˂e 91[^Rf$L7,oÐb8S}>{zwra VU!őKfV3%"jī Y?+yf#5$ļS i)Wm?`˄Ou:4G*HGc< >cPR)8 BnӰ⇕0Q#hAb>rTvŗF+@7WYèЅ>ְI5!mTm&+ŬlYبrvd> ִF2{頒I46߂[j^ ,pV BVk:t>CIw)[I3,}釦KZYA,,Jb@x_/Q2==p"jЪ{kI22O.Ic{rc.j Mc2 sޙk9-=9&vpQGÆ評Nz}+ݔi|x&~[ 饣:#>Zw(زa1(Ooѩ3K׊ ϏWo8*6SEwKi2/'Gn_&?’g17-8En -*ztϺ >\NHO7A>:܃ Xc+cRsqMe;m]Km:zyVJ(K9~-}&UD Mgy" C_rP;zS)%6, mmP=|%[kfS6F}젚{ q%^|9[Zd֤ endstream endobj 77 0 obj <>stream h,O @2:n,ChyԁJcH5dnV EX/ =FXƦI\a<pn|j3 #{/ӻ˚Z&M=4XXp*Vlv8Lc_n؄; 8 endstream endobj 78 0 obj <> endobj 79 0 obj <>stream hXnG}WcBņt bDv Ȇ2ҒTll+9!E&V,kRU]}ݥ\W~Hͣ喊WNJdp:5z3m<Ĝq68 kXS[nںNroucZhY Js*'"wp7>P2mAa"Tq~ΖʼnOO' W\Vܛ,5sŕ>WaKEդ6HZ.lM4Ak܊X .WZq/B4&ȲT\:[Yĝp`Zv W{c N8 (79wY8n-9wTf7Fuhΰӝ\j8@{"ʎUSMI 'ǚv0?_e2wȯ+R]8 2*BE,Q+׾>ɴ-&F3ZEIN.el4m@hn^˻I zz,|Fs {)r:66*kk%d \19L`cEvioDaMHyoIKNZ`G$3/Bh\=QYްXu&2-ȗ#7}FjӤKv$b- 6vzt$B@QRgaREB~8T%` k,#>'ëh`v2EiotymjZ%My6jeMt0 Jv` OA* *DEg I{`=LH1þd)lLt4Aͯs_YrkZsv ,`ws^Z2赇b< b"է7bγc>E*>SڡM7a`!A }Bhr -<8i/,ʣ|twkn4n")qƝ%^tS fsӡ c6!GL%R3I+WW5F2}d(0ѓ]^Q*w+90뙎V"("ev<:8~[wrz[[/^J "UbWUb9,u >.X8wPUW(Qp/0 endstream endobj 80 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-29T10:27:44-05:00 2008-01-29T10:35:11-05:00 2008-01-29T10:35:11-05:00 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq8D806N598r+d/Onn7T7CK3tLaBry2vm+qhr2NRpPOyd/UlnYSR2NzHGpgT02bk jO0gCqoiax/5yU07U44LK4n1OCafne6hO+lCHibGyXlHAyo4VbhboCNPT+LgxYjlzVeo/l2fNx8n 2H+L1kXzCPWF56xtmkIE7iJm+pgW4Ji4miVp0JJqcVZHirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdiqQzTa+vnu0hR5G8vy6XcvPGIl9NLyK4txETNTlyeKWSicqfCTTFU+xV2KsV8y3 +vQedPKVrYS3SaZcyXv6YjiszPbPElsfSE1wscht3E7IY6uisA9SdgVWVYq7FWG+d9S8z2nmPyrD oz3Ztrq8MeqQQWnr27W3KMO9xP6Mvo8FJ4D1IuVWPJinpsqzLFXYqxD8w9R872c3lpfLFpJPBPrN pHr80axSGPTmfhNVJDyoxcEugJVQTt1xVl+KuxViP5g6h5osZfLL6ElzLDNrVrb6xDaRiR2spQ6u XZre6WOJG4tIx9P4QQJEJBxVl2KuxVh/5i6p5r0+Tyx/h+G5ljutctLfWPqsKzsti6yeoZOUcoji 5Becnw0H7akjFWYYq7FWOed28wC20lNDuLm3uptVso7h7aKKZDaGWt2J/VinCJ9XV6OOJ58Pi3oV WR4q7FWF/mxqXnLTvLltP5TSd9Ra+t45hbW4un9BuXOqFJKLUKC1P9kg+NVWaYq7FXYq7FXYq7FX Yq8282fnx5V8sa9faNf2N5JPp7cbiSKbTV+EWovGkWGa8hujGsRpz9Khf4Fq1AVXoEF1NNczIIlE ETBDIWIckor/AGCv+X/NirC/Kz/mLr/l7T9a/wAQWNr+kIVnFuNMZxGH348jdLyp40xVNP0N+Yv/ AFM9l/3Cj/2V4q79DfmL/wBTPZf9wo/9leKrU0j8xWFf8T2PUj/jlHsaf8teKrv0N+Yv/Uz2X/cK P/ZXiqXXVz5ktJ57e689aPbz2sYmuYZbFEeONmCq8itegqpZ1AJ7kYqgb3zNd6fKsOo/mV5esp2M oSK4toImPoSvBJRXvgfgkidG8GUg7g4qmNk/mq/l9Gx876RdS0LenBYLI1AkUhNFvSaBLmJvk6n9 oVVR36G/MX/qZ7L/ALhR/wCyvFVqaR+YrCv+J7HqR/xyj2NP+WvFV36G/MX/AKmey/7hR/7K8Vd+ hvzF/wCpnsv+4Uf+yvFUJpdp+Y17bPMfMlihS4uYKDSmO1vO8IP+9f7Xp1xVF/ob8xf+pnsv+4Uf +yvFXfob8xf+pnsv+4Uf+yvFVqaR+YrCv+J7HqR/xyj2NP8AlrxVd+hvzF/6mey/7hR/7K8VUrux 89WdrNd3fm3Tra1t0aWe4l0zhHHGg5M7u14FVVAqScVS221TXLnURpsHn/Q5dQeaW3is0s42maWB BJNGIxe8i8a7utKqOuKpv+hvzF/6mey/7hR/7K8Vd+hvzF/6mey/7hR/7K8VWrpH5iksP8T2Pwmn /HKPgD/y1++Krv0N+Yv/AFM9l/3Cj/2V4q79DfmL/wBTPZf9wo/9leKq3k6/1yebXrHWbqG8uNJ1 BbSK5ggNsrRvY2t0KxmSbcNcsK8sVZHirsVdirsVdirxryhbfmBr/nrR/OV9Hr2laRfwxXU+jzS2 506IPp3D0+Eeqc+Jnb1KvYc68ahCGbFXq9ncQfX76D1F9YzKwi5DlT0It+PXFUk/Kz/yXXl7/mCi /VirKcVdiq2L7J/1m/4kcVSfznoOoa/5Yv8AR9O1afQ727RUh1W15etAQ6sWTg8TVIUrsw64q831 r/nHqbWLy5ub/wA13lyZo/qqCeNp2WzR/Xit2klmd2CXUUE3KtW4EH7ZIVWx/wDOPEb6XBp83mS6 mitzf8ZTF6Upe/tkhlPO3khNPXR5iP2uZVq7kqsv8lflw3ljV31FdRW69XT7bTZY/qyxkpZRosDh w7NXkZy/8wdBt6fxKs1xVbF9k/6zf8SOKrsVdiqVeWv+OdN/zHah/wBR02KprirsVWxfZP8ArN/x I4quxVL/ADFpCazoGpaQ7+kuoW01t6pXnwMqFA/GorxrXrirCdO/Ku/h88weabrW1na2vJp2s0t5 YkeNraS3t46C5aKsKzEl2japqyhGdyyr0bFXYqtT7Un+t/xqMVXYq7FWN+VP+O95z/7bEP8A3R9P xVkmKuxV2KuxV2KuxVCWxne9u2aZjHFII0honEAxI3Xjy6sf2sVYZ+Xvk/y/ceSdGnlgkMklsjMV uLhRU+CrIAPoGKsh/wAEeW/98S/9JVz/ANVMVd/gjy3/AL4l/wCkq5/6qYqsi8keW+J/cS/ab/j6 uf5j/wAWYqsvPKnk+xtJry9ra2lujS3FzNeXEcccaCrO7tKFVVG5JxViGu+Zvyp0iJpx62pWwtje C4069a5QxrcpakArcjcSy0322beopiqAt/On5d3F9c6fYaJq9/dWdxd2t0kFwB6c9r9af02Et7Ga ypYu8dBShXlxrirIfJbeSvNtnJd2Om39rEkdtKDdXEo5LdwLcR8TFcTDZHFd/AiqlWKrI/8ABHlv /fEv/SVc/wDVTFVkXkjy3xP7iX7Tf8fVz/Mf+LMVX/4I8t/74l/6Srn/AKqYq7/BHlv/AHxL/wBJ Vz/1UxVLPLvkvy6+nyloJai9vx/vTcjZb2YDpJ4DFUz/AMEeW/8AfEv/AElXP/VTFXf4I8t/74l/ 6Srn/qpiqyLyR5b4n9xL9pv+Pq5/mP8AxZiq/wDwR5b/AN8S/wDSVc/9VMVd/gjy3/viX/pKuf8A qpirHPKQ8jeZbvWrexs7uN9GvZLK5MtzKQZIneJipiuJePxQseEnFwOJKgMKqsj/AMEeW/8AfEv/ AElXP/VTFXf4I8t/74l/6Srn/qpiqxPJHlvlJ+4l+1/y1XP8o/4sxVf/AII8t/74l/6Srn/qpirv 8EeW/wDfEv8A0lXP/VTFUv8AJmm29nf+b7OzLwRLrERVgxkcV0qwY/FL6lfpxVkmnySvbEyOXdZJ Y+ZABIjlZBXiAOi+GKonFXYq7FXYq7FULZf703//ABnX/kxFirDPy882aHB5I0aGSWUSR2yKwFvc MKivRljIP0YqyL/Gfl//AH9N/wBItz/1TxV3+M/L/wDv6b/pFuf+qeKrY/OXl8Kayzfab/j1ue7H /ivFUNq+u+T9Y0q70rUvWuNPv4Xt7uA292oeKVSrryVFYVB7HFWMN5R/Jlo4Yzp03pQQPaxx8dT4 ei8jSlWXo/7yQuvKpVqEUIFFUTZaP+VVvJfahbWU8M2oSXN3eXcMeoozuqzW883qIAVKJdOhZSON R0IWiqY+XB5B8p29xaaPDdWUE00azxyRajKPWito4o1/frJxYW0MYoP2QDiqcp5x0F0V0e4ZHWJ0 YWl2QVnPGJh+66SNsvj2xVdbeZtLljLRpduoeRSVsrwjkjsrDaLqGBBxVW/xDYf76vP+kG8/6o4q 7/ENh/vq8/6Qbz/qjiqSaB5s0SCymjledJBe35Kta3II5XsxFf3fgcVTL/Gfl/8A39N/0i3P/VPF Xf4z8v8A+/pv+kW5/wCqeKrY/OXl8Kayzfab/j1ue7H/AIrxVd/jPy//AL+m/wCkW5/6p4q7/Gfl /wD39N/0i3P/AFTxVKNCu/ImiXGpT6ctxDLqdw11du0V9LykkZpG4+qr8F5yOQiUUVNBiqb/AOM/ L/8Av6b/AKRbn/qnirv8Z+X/APf03/SLc/8AVPFVqecvL4Z6yzbtt/otz/KP+K8VXf4z8v8A+/pv +kW5/wCqeKu/xn5f/wB/Tf8ASLc/9U8VQHki+tr7U/N1zbMzQtrEYBZGjO2k2APwuFYfdiqWfmcL qT8s9Ys7d7eL9ITtYXE15cx2Vslvd33oTmW4k+wDE7KOKs3IgKpOKsJ8n6X+eyeV7NI9RK29q622 lpZy6XcW0+m2ekv9VuEuZIZZHW+vVi5M1HCNUBNyFUz8iap+caea9A0XzZd8hNZXd/qiSR2KzcLS 4ngjDLZ+rGn1hb20f4ZNjCwFavir2DFXYq7FULZf703/APxnX/kxFiryXyN/yiOlf8YF/jiqY6vq ltpWlXep3QY21lC9xNwoW4RqWalSB0HjirznUfz88vQHT5IbK8+r3Xqzu7xwkvaRROS8IWapb1VC 7joCTQUJVUrD8+tMEEl7qWnXqWVws1zp3owREi1iDcWkf6y/JpDGeiKFPX4fjKrLvKHneHzNqWqx WsDRWenelGpl9P1TKZJkl5COSXiB6I4huLdyKEYqyjFV9n/yjb/9s/zD/wBRi4qj/MX97c/9thP+ 6WuKqWl/8crT/wDmB8uf9RbYqt1XTfPt9o0Y8o6pDpk0d9qrXRmEf73/AEub0kDSW92FHP7R4dOx xVhUv+LUv3t7zzfGmoR3Zt5F+tahHE13PGiRogWBIirTKUKoOEdCR8RZQqrflsPNur6w01t5ij1f SbLUlubgtdaxG5tpI5uCcLiNEZvjjfgHMft9klVkf/Hzff8AMbef9RUmKt4q7FXYqh9RvY7DT7m+ lV3itYnndIxycrGpYhRtUmm2KvN9b/Pzy3Z2d3PaWtzKLSWFfXcW4hmiaQCR4G9dTIfTB4AbnY0K hiFVsH576R9c1KS4sLz9GW1rbXkBjgjMghmiDM8jG4oSZGEYVE268iD8KrI/Jf5h2fmzU7yOwheK ytrS1uF9cIs/O4aWoZEkkKrxjXjyA5faXkhViqy/FXYq7FXYqmP5Yf33mz/tsp/3SrDFVXzl5Rn8 1eWodOgl9GSDWbe+LetNADHaakJpRyg+IsY1bhXYPxOxAYKvHLz8vPzo8m+RLy1Os3eo/urG2sLT SLzVJnjNpZ3MVIUgg9a2jMjQGiVV2Qc+CMeCr2P8vvLnnDR7/wAxTeYNQ+u22o3rXGlI13cXbwwM zngwlWOKEAMoEcS0FN2brirMsVdirsVQtl/vTf8A/Gdf+TEWKvNfIXlrXpfJ2kSRLamN7dShaaRW oa9QIWp9+Kp//hXzH/JZ/wDI+X/qhirv8K+Y/wCSz/5Hy/8AVDFVq+V/MTCoSz6kf38vY0/3xiq7 /CvmP+Sz/wCR8v8A1QxV3+FfMf8AJZ/8j5f+qGKqcHlvzSmmPZrDYtW31O2Dm6mG9/cCVWp9WP2O NDiqK1DQvM95JKTBZRrJereD/SpWIC2gtuP+8w7jliqnaaB5qgtLaA29ixgt9MgLfWptzp0xlY/7 zft1oPDFUwsbbzVDptxarBawyTTXciXMV2/OP6xcSSqVElpInJOf7Ske2KpJJ+XFvcXdvfX2lxXm o28y3Qu21W8iLXC7iVoreCGDlWp+GMCpJp8RqqmPl3yofLstzLpGj2sEt5Q3LvqV5OWozP1mhkp8 UjE06k4qlmnaF5hvUublYrRBJe3tVNxIaFbuVT/ujxGKov8Awr5j/ks/+R8v/VDFXf4V8x/yWf8A yPl/6oYqtXyv5iYVCWfUj+/l7Gn++MVXf4V8x/yWf/I+X/qhirv8K+Y/5LP/AJHy/wDVDFVo8r+Y iWHCz+E0P7+Xwr/vj3xVd/hXzH/JZ/8AI+X/AKoYq7/CvmP+Sz/5Hy/9UMVWjyv5iJYcLP4TQ/v5 fCv++PfFV3+FfMf8ln/yPl/6oYq7/CvmP+Sz/wCR8v8A1QxVb5Etr3T5PN8cxRbhdYjJMSyXCiul 2HRVEbtt7Yqy3TeH1QFH9QM8jMxVo/jaRi44N8Qo1RQ4qisVdirsVdirsVQtl/vTf/8AGdf+TEWK pJ+Wv/KBaH/zCJirJcVdiq2L7J/1m/4kcVXYq8b8xW/5+65pGp2EtpBp0klpGdPvdJuWs7hZ5JYG lj5G8lX4I/UXnxG61FA1MVQqeUvzZaJ7m9m1KfWDN6UctnqbQ2YYX96z3BtjdRRrG1v6BReDlaqD G4V1xV6X+Xlhq9j5RsoNXF2uoF7iWWHULgXlxEJriSVIXuFkn9URI4RW5mqgdOgVZHiq2L7J/wBZ v+JHFV2KuxVKvLX/ABzpv+Y7UP8AqOmxVNcVdiq2L7J/1m/4kcVXYq7FWEflxpnnCy1LzS/mBrg2 1xqc8mkief1wbdppWRox61x6amJ4wFHpgAAekpBLKs3xV2KrU+1J/rf8ajFV2KuxVjvlb/juecP+ 2vF/3SLDFVHzD5juvL/l0XtnZx313PqkVhb200xtozJf6kLRGeVY7hlVWm5GkZ6YqxzRvz48pTWs h1stp2oxX1xpklhaQ32pMtzZvBBMrNBagf391GkZGz806OxRVUwl/PH8rorCXUDrLPZxGLlPFaXk qsJoppkdPThbmgjs5izpVV4MGIIxVfdfnJ5Ft71IPr/qRme/sWEdvfS3D3mmvCs8VvBFbSGdU9er ujUFKryAcoq62/Oz8srqKaa21hpYoZ4bYulpeEPJcySxRejSH96rPayrzj5KOJqRirOMVQtl/vTf /wDGdf8AkxFirFPy60y9k8j6K66tdxK1qhEaLalVHgOUDN95xVkf6Jv/APq9Xn/AWf8A2T4q79E3 /wD1erz/AICz/wCyfFVkWk3/ABP+5q8+037Fn/Mf+XfFV/6Jv/8Aq9Xn/AWf/ZPirv0Tf/8AV6vP +As/+yfFUDo/parZC80vzNLf2jO6rcWzWE0ZZWIIDpAy1HfFUd+ib/8A6vV5/wABZ/8AZPirv0Tf /wDV6vP+As/+yfFVkWk3/E/7mrz7TfsWf8x/5d8VX/om/wD+r1ef8BZ/9k+Ku/RN/wD9Xq8/4Cz/ AOyfFUr8uaVfHT5iNZvF/wBNvxQJZ9r2YV3tz1xVNP0Tf/8AV6vP+As/+yfFXfom/wD+r1ef8BZ/ 9k+KrItJv+J/3NXn2m/Ys/5j/wAu+Kr/ANE3/wD1erz/AICz/wCyfFXfom//AOr1ef8AAWf/AGT4 qgdO9K/mvI7HzNLdSWcxgu0gawkMUqgBo5AsB4OO6nfFUd+ib/8A6vV5/wABZ/8AZPirv0Tf/wDV 6vP+As/+yfFViaTf8pP9zV59r+Sz/lH/AC74qv8A0Tf/APV6vP8AgLP/ALJ8Vd+ib/8A6vV5/wAB Z/8AZPiqVeTYZIdW83RyTvcuNXjrNKEDGuk2B39NY129lxVDec5fJ9v5IvrzzhJJBoFnd/WLi4ha 6SSKSK/5QSI9kRcKyTBCCnT5YqwKw1b/AJxstrNNRslmazR57wXyW+syxs1lLZST3DTcHDgT2dpy kJIdxSpZmDKo7yd5L/5x31L19K8s2Ecn6RgFxPbo2oR84U09IQ5MrLx5WeuDwLGQnd0YqqyhvyW/ LhghOmzetFNPcRXQv78XCS3KQxSslwJ/WXlHaxps2yjiNiwKq7/lTH5bCyFkmkGK0DRt6EVzdxof SmuLhFYJKvJBLezNwPwnluKKtFWa4qhbL/em/wD+M6/8mIsVST8tf+UC0P8A5hExVkuKuxVbF9k/ 6zf8SOKrsVca0269sVSLyXoF1oeifU7y6ivbx55p7q8hgNsJZJZCxb0zJPxp9lQGoqgKAABiqe4q 7FVsX2T/AKzf8SOKrsVdiqVeWv8AjnTf8x2of9R02KprirsVWxfZP+s3/Ejiq7FXYqkXlrQLvTL3 Wrq7uorufU71rhZI4DAY4eIWKA1klDemvdQtWLNSrHFU9xV2KrU+1J/rf8ajFV2KuxVjXluaKHWP OMkrrHGurw8nchQK6Tp43JxVEX3l3R/Mfl6bS9Wia40+4uGm4xyywMTFd/WIZElgaORaOispVh92 KpXa/lD+Xlro1vo1tpRh060gmtrWJLm6DRx3FzFeScZfV9QMbi3jkD8uSldiMVVfK35b6F5a8wXm q6YixRz6fY6Xa2wDs0UFh6lOU0kkjyFxIq1PQIvXrirLMVdirsVQtl/vTf8A/Gdf+TEWKsU/Lry9 oE3kfRZZtMtJJXtUZ5HgjZmJ6kkrU4qyP/DHlr/q02f/AEjxf804q7/DHlr/AKtNn/0jxf8ANOKr IvLHlvif9xNn9pv+PeL+Y/5OKr/8MeWv+rTZ/wDSPF/zTirHNe1n8rtFi1H14tKnvNKj9W902AWR u0X4OsLsjAn1UoD15CnUYqxK3/Nj8rJdDXWoPLUsunNd3NlJN9UsIxFPBEZysnqzR8VZQQH+wKEu VX4sVekafo3lW/sLa+g0i1EN1Ek8QktY0cLIoZeSlaqaHcYqiP8ADHlr/q02f/SPF/zTiqyLyx5b 4n/cTZ/ab/j3i/mP+Tiq/wDwx5a/6tNn/wBI8X/NOKu/wx5a/wCrTZ/9I8X/ADTiqV+XPLXlxtPm LaVZk/Xb8VNvEdhezAD7Phiqaf4Y8tf9Wmz/AOkeL/mnFXf4Y8tf9Wmz/wCkeL/mnFVkXljy3xP+ 4mz+03/HvF/Mf8nFV/8Ahjy1/wBWmz/6R4v+acVd/hjy1/1abP8A6R4v+acVY55Sv/IvmW81q3sd FhjfRr2SyujLb2pBkid4WKmJpePxQseEnFwOJKgMKqsj/wAMeWv+rTZ/9I8X/NOKu/wx5a/6tNn/ ANI8X/NOKrE8seW+Un+4mz+1/wAs8X8o/wAnFV/+GPLX/Vps/wDpHi/5pxV3+GPLX/Vps/8ApHi/ 5pxVJ/KVhZw6l5wtbeJbe3GrxcY4P3IFdKsGNPT40qfDFWQ6czNbHkxbhLMgLEk8UlZVqTudh3xV E4q7FXYq7FXYqhbL/em//wCM6/8AJiLFWKfl1rllF5H0WJo7sslqgJSzunWo8GWIqfmDirI/8Q2H ++rz/pBvP+qOKu/xDYf76vP+kG8/6o4qoWnmjSpomeJLx1EkqEixvPtRyMjj+57MpGKq/wDiGw/3 1ef9IN5/1RxVimoeTvy01HUdT1G80W7lvdYCLqUv1fU19UR+lxqFUKtPq8f2QOnzxVQtfKX5WT6T NYw6PdfUXuXkdI7fVEpcQw/UC4ZVDK6xRcKg9Ry+1virLbXV9ItLWG1tre8it7dFihjFjeUVEAVV H7rsBiqr/iGw/wB9Xn/SDef9UcVULTzRpU0TPEl46iSVCRY3n2o5GRx/c9mUjFVf/ENh/vq8/wCk G8/6o4q7/ENh/vq8/wCkG8/6o4qlflzX7FdPmBivP97b87WV4et7Me0WKpp/iGw/31ef9IN5/wBU cVd/iGw/31ef9IN5/wBUcVULbzRpUhmREvGaCRo5QLG8+FiA9D+5/lcHFVf/ABDYf76vP+kG8/6o 4q7/ABDYf76vP+kG8/6o4qknl0+T9JvNXk0q1vY57y7abUS1tqMp9aQeuQPVR+C1nLBEoo5bDFU7 /wAQ2H++rz/pBvP+qOKu/wAQ2H++rz/pBvP+qOKqEHmjSpJblES8ZoZAkoFjefCxjR6H9z/K4OKq /wDiGw/31ef9IN5/1RxV3+IbD/fV5/0g3n/VHFUq8m3Mdzq3m6aMOqNq8dBLG8TbaTYDdJArD6Ri qC8+aXrmsfl/qmjaJbrc3mqzSWUiSSi3jFtPeFLppJSGZV+rl/sIzeCnFWCeWtB/5yAsNBhsZryS 1bTZvqNnaQvpksT2On6VItvN680EkrfXL9Iw/MB1U14pvRVH+RNU/ONPNegaL5su+Qmsru/1RJI7 FZuFpcTwRhls/VjT6wt7aP8ADJsYWArV8VewYq7FXYqhbL/em/8A+M6/8mIsVST8tf8AlAtD/wCY RMVUdc83eYdP846foln5buL/AEq5hjmvNbR3WOBpLlbf0+AhdXZQ/qtWRaICe2KsrxVKvLX/ABzp v+Y7UP8AqOmxVDa35nuNN8y+X9Fj09rmPXWuUa9DlUt2tYhNRwEevqJz47jcU77Kp9iqVeWv+OdN /wAx2of9R02Koq91jSLC4tbe+vre1uL1/Ts4Z5UjeZ6gcYlYguauooviMVReKpV5a/4503/MdqH/ AFHTYqhvMvmTUtI1DQ7W00a41SLVbwWl3cW4crZxkV+sS8UdeAPXky4qn2KpV5a/4503/MdqH/Ud Niqrq+oahaSadHZ2Jvfrl2lvcPyZFt4SjyPOxVJenp8VBoCzAchiqYYqlWif7263/wAxw/6hYMVV dX1DULSTTo7OxN79cu0t7h+TItvCUeR52KpL09PioNAWYDkMVTDFUq0b/jo67/zHJ/1A22KoHz15 q1Ly3pdveadoV35guJ7qO3NnZK7OiOGZ5nKJJRUCdxuSBUVxVkeKpVo3/HR13/mOT/qBtsVQvnvz RceV/LN1rcGnvqj2zRILKNikjtPKsKBSEk/bkWu2wqe2Kp/irHfK3/Hc84f9teL/ALpFhiqh5k0T Vdb8tNp+mXj2Mz6lG888c89q5totQElyiTWxWVWkhV1HEjruQMVeW2/5R/ns+mXtte+c2N1cCCRL mLVdRUCeCxvIaoFijaJGuZ7eR0Vir+mWI6JirLPLvkX8ztO88aXf3fmBbryvZQXcM9lJd3s87h7q 8e1BWX93KVgnt1eWUmSsVAaVLKvT8VdirsVQtl/vTf8A/Gdf+TEWKsU/LqfXx5H0UQ2do8QtU4O9 1IjEdiVFu4H3nFWR/WPMv/LBZ/8ASZL/ANkuKu+seZf+WCz/AOkyX/slxVB6VF5ls7V4vqdk/K4u ZuX1uUf39xJLT/eY/Z50xVXca488c76XYNPCGEUpupC6B6cgrG1qOXEVpiqr9Y8y/wDLBZ/9Jkv/ AGS4qg9Ki8y2dq8X1OyflcXM3L63KP7+4klp/vMfs86YqjPrHmX/AJYLP/pMl/7JcVd9Y8y/8sFn /wBJkv8A2S4qg9Ki8y2dq8X1OyflcXM3L63KP7+4klp/vMfs86YqjPrHmX/lgs/+kyX/ALJcVd9Y 8y/8sFn/ANJkv/ZLiqV+XJ/Mf6Pm42NmR9dv+t3KN/rs1f8Aj2PfFU0+seZf+WCz/wCkyX/slxV3 1jzL/wAsFn/0mS/9kuKoLT4vMtvLfS/U7JvrlwZuP1uUcaRpFT/ebf8Auq/TiqN+seZf+WCz/wCk yX/slxV31jzL/wAsFn/0mS/9kuKoOxi8y291qMv1Oyb63cLNx+tyjjS3iip/vNv/AHVfpxVGfWPM v/LBZ/8ASZL/ANkuKu+seZf+WCz/AOkyX/slxVB2MXmW3utRl+p2TfW7hZuP1uUcaW8UVP8Aebf+ 6r9OKq841y4QR3Gl2E0aukipJdSMA8TiSNgDan4kdQynsRXFVX6x5l/5YLP/AKTJf+yXFUk8rtfN f+cTLH6V1+l4qpauslP9xVh9lpkjU7darirI9N9P6oOHP7cnP1ePPn6jc68Ph+1XpiqKxV2KuxV2 KuxVC2X+9N//AMZ1/wCTEWKpJ+Wv/KBaH/zCJirJcVdiq2L7J/1m/wCJHFUn842fmi88v3Fv5Xv4 9N1pmjNveTKrooDguCrxzr8SAj7BxV5hqX5R+ftT159S1S60rUXWRPSu5B6M8ltBHMn1aYQ2qoRd iZVnYdhQKwCgKpRrH5Eeer60dLa50yIw3NxdWEJml9ONriKNFiq1rKEjtHtkERVeTLupiYKQqz/8 tfI3mDy9qVzeautkXnsbG09S1l9Zg1naw25HKS0gm4sYS4/fcd/sVqxVeg4qti+yf9Zv+JHFV2Ku xVKvLX/HOm/5jtQ/6jpsVTXFXYqti+yf9Zv+JHFV2KqN9B9YsriDir+tG8fByyqeSkULL8QHuN8V eeflb+XWq+V9Z1K7vbfT4YJ4mjtRYyMzqZb24u3RwLe0j4Kk8SpxUUKseI5mqr0nFXYqtT7Un+t/ xqMVXYq7FWO+Vv8AjuecP+2vF/3SLDFU40z/AHmf/jPcf8n3xVFYq7FXYq7FXk3/ACtjzIPzzPkJ obH9ENLxhkAJvGjGnC6cuDOGTjMQFb6uyOpI5KUNVXp9l/vTf/8AGdf+TEWKsU/LrQ7KXyPosrSX YZ7VCQl5dItT4KsoUfIDFWR/4esP9+3n/Sdef9VsVd/h6w/37ef9J15/1WxVZF5esOJ/e3n2m/4/ rz+Y/wDFuKr/APD1h/v28/6Trz/qtirv8PWH+/bz/pOvP+q2KrIvL1hxP728+03/AB/Xn8x/4txV f/h6w/37ef8ASdef9VsVd/h6w/37ef8ASdef9VsVWReXrDif3t59pv8Aj+vP5j/xbiq//D1h/v28 /wCk68/6rYqlOoXPlLT31JLy/vY20i0W/wBQAutRf07d/U4sOLtzJ9F/gSre24qqx4+dPyr0yVrF 9U1CGc3F2BAr6wzPLHK5m4Ba8+UvJUK1DvVU5MCMVZla6RpF3aw3VtcXktvcIssMgvryjI4DKw/e 9wcVVf8AD1h/v28/6Trz/qtiqyLy9YcT+9vPtN/x/Xn8x/4txVf/AIesP9+3n/Sdef8AVbFXf4es P9+3n/Sdef8AVbFVieXrDlJ+9vPtf8t15/KP+LcVX/4esP8Aft5/0nXn/VbFXf4esP8Aft5/0nXn /VbFVieXrDlJ+9vPtf8ALdefyj/i3FV/+HrD/ft5/wBJ15/1WxV3+HrD/ft5/wBJ15/1WxVKvJtt Hbat5uhjLsi6vHQyyPK2+k2B3eQsx+k4qnumf7zP/wAZ7j/k++KorFXYq7FXYq8Ru9btdG/N6ezt PLes6/K9+80N5b6pf/Vob2SwEskH1fUHtdMMn1d2dFSZiENAF4gBV7HZf70X3b9+u3/PCLFWK/l1 5h0CHyPosU2p2kcqWqK8bzxqykdQQWqMVZH/AIn8tf8AV2s/+kiL/mrFXf4n8tf9Xaz/AOkiL/mr FVkXmfy3xP8AuWs/tN/x8RfzH/KxVf8A4n8tf9Xaz/6SIv8AmrFXf4n8tf8AV2s/+kiL/mrFVkXm fy3xP+5az+03/HxF/Mf8rFV/+J/LX/V2s/8ApIi/5qxV3+J/LX/V2s/+kiL/AJqxVZF5n8t8T/uW s/tN/wAfEX8x/wArFV/+J/LX/V2s/wDpIi/5qxVI9Xh8l6pNqMs2uxRHVLAaZeLFc2wBtwJ+nMOQ 1bpjX2HatVWI3v5Zflpf6iupy+Z5Uu4Z7ma3dLqwAiM07zqFDQtURTyNInKtSaPyWi4q9B03V/KW m6da6da6rZrbWcMdvApuIiRHEoRQfi8BiqJ/xP5a/wCrtZ/9JEX/ADViqyLzP5b4n/ctZ/ab/j4i /mP+Viq//E/lr/q7Wf8A0kRf81Yq7/E/lr/q7Wf/AEkRf81YqsTzP5b5Sf7lrP7X/LRF/KP8rFV/ +J/LX/V2s/8ApIi/5qxV3+J/LX/V2s/+kiL/AJqxVYnmfy3yk/3LWf2v+WiL+Uf5WKr/APE/lr/q 7Wf/AEkRf81Yq7/E/lr/AKu1n/0kRf8ANWKpV5NurW61bzdPazJPC2rx8ZYmDqaaTYA0ZSR1xVPd M/3mf/jPcf8AJ98VRWKuxV2KuxV4p+X9/Zv5x06OL8obTy27lgNbgs5YZLYtbSu/xy6ZZKOJUQvS WjFx6ZlXmVVew2X+9N//AMZ1/wCTEWKpJ+Wv/KBaH/zCJirJcVdiq2L7J/1m/wCJHFV2KuxVbF9k /wCs3/Ejiq7FXYqti+yf9Zv+JHFV2KsN8x+fb/R/MB0ldKWeOW1M1ndGd0Dz/WbW2WOQLBIsac75 SWDs4AJ9OhBxVg1v/wA5EXjfouL/AA3GJ9W9RrcfXn4Lyne3h5t9VqOU8TB/h+FKMORPEKvX9G1J NU0ex1ONDHHfW8VykbfaUTIHCn3HLFUZiq2L7J/1m/4kcVXYq7FVqfak/wBb/jUYquxV2KrU+1J/ rf8AGoxVdirsVY75W/47nnD/ALa8X/dIsMVVr7zFpPl7QptU1aV4rOO6kiLRQzXDl5rtoo1WKBJJ GLO4HwqcVXeVfOXlzzXZTX2gXTXtlDM9u1z6M0UbSRmjiN5UjEgB25JUe+Kp1irsVdirxr8vvyI1 ry7e+XLy+1iwpockk1xaabYS2wu5DBNbQvO/1n0HljjuKet9VEjDZ2b7WKvW7L/em/8A+M6/8mIs VYp+XWp3sfkfRUXSbuVVtUAkRrUKw8RynVvvGKsj/S1//wBWW8/4Oz/7KMVd+lr/AP6st5/wdn/2 UYqsi1a/4n/cLefab9uz/mP/AC8Yqv8A0tf/APVlvP8Ag7P/ALKMVd+lr/8A6st5/wAHZ/8AZRiq yLVr/if9wt59pv27P+Y/8vGKr/0tf/8AVlvP+Ds/+yjFXfpa/wD+rLef8HZ/9lGKrItWv+J/3C3n 2m/bs/5j/wAvGKr/ANLX/wD1Zbz/AIOz/wCyjFUsvtN0m/upLu+8n/W7qWIwS3E8WnSSPCRQxs7T ElP8k7YqgIvKvlIQ+kPINv6YaaifVdL4/vx6cu3q/wC7EUK3iNjtirII9SvI0WOPQ7tI0AVEVrIA AbAAC46Yqu/S1/8A9WW8/wCDs/8AsoxVZFq1/wAT/uFvPtN+3Z/zH/l4xVf+lr//AKst5/wdn/2U Yq79LX//AFZbz/g7P/soxVYmrX/KT/cLefa/ns/5R/y8Yqv/AEtf/wDVlvP+Ds/+yjFXfpa//wCr Lef8HZ/9lGKrE1a/5Sf7hbz7X89n/KP+XjFV/wClr/8A6st5/wAHZ/8AZRirv0tf/wDVlvP+Ds/+ yjFUq8mzSTat5ukkge2c6vHWGUoWFNJsBv6bSLv7NirXmLypD5q8tnSJ7h7aA6lHczPEXV2S01AX DRq8bxSRmQRcOatVa1HTFU28ueW9E8t6VHpOiWq2WnRPLJHbozMqtNI0slOZY0LuTToO22Kplirs VdirsVQtl/vTf/8AGdf+TEWKpJ+Wv/KBaH/zCJirJcVdiq2L7J/1m/4kcVXYq7FVsX2T/rN/xI4q uxV2KrYvsn/Wb/iRxVdirzzzbrnmy380XltpcuorYRWEZlEWmvNEJZrmINJaTi2mEk0FtHOzIzMG LxqqFg2KvObfzf8AnoY9L5fpj0ZfrB1WX9EL6kTCRg/BPqW/pwBJYvhPOQlf3lPTVV75oUuoTaJp 8upJ6eoyW0L3sdKcZ2jBkWns9cVRuKrYvsn/AFm/4kcVXYq7FVqfak/1v+NRiq7FXYqtT7Un+t/x qMVXYq7FWO+Vv+O55w/7a8X/AHSLDFU40z/eZ/8AjPcf8n3xVFYq7FXYq7FXYqhbL/em/wD+M6/8 mIsVYp+XUGvnyPophvLRIjapwR7WR2A7AsLhAfuGKsj+r+Zf+W+z/wCkOX/sqxV31fzL/wAt9n/0 hy/9lWKrIrfzJxP+n2f2m/485f5j/wAvWKr/AKv5l/5b7P8A6Q5f+yrFXfV/Mv8Ay32f/SHL/wBl WKrIrfzJxP8Ap9n9pv8Ajzl/mP8Ay9Yqv+r+Zf8Alvs/+kOX/sqxV31fzL/y32f/AEhy/wDZViqy K38ycT/p9n9pv+POX+Y/8vWKr/q/mX/lvs/+kOX/ALKsVd9X8y/8t9n/ANIcv/ZViqyK38ycT/p9 n9pv+POX+Y/8vWKr/q/mX/lvs/8ApDl/7KsVd9X8y/8ALfZ/9Icv/ZViqyK38ycT/p9n9pv+POX+ Y/8AL1iq/wCr+Zf+W+z/AOkOX/sqxV31fzL/AMt9n/0hy/8AZViqxLfzJyk/0+z+1/yxy/yj/l6x Vf8AV/Mv/LfZ/wDSHL/2VYq76v5l/wCW+z/6Q5f+yrFViW/mTlJ/p9n9r/ljl/lH/L1iq/6v5l/5 b7P/AKQ5f+yrFXfV/Mv/AC32f/SHL/2VYqlXk1bpdW83C6kSWb9Lx8niQxqf9xNhSis8hG3+Viqe 6Z/vM/8AxnuP+T74qisVdirsVdirsVQtl/vTf/8AGdf+TEWKpJ+Wv/KBaH/zCJirJcVdiq2L7J/1 m/4kcVXYq7FVsX2T/rN/xI4quxV2KrYvsn/Wb/iRxVdirznzd+XfmPVfON3rtteWtzp93pUWmHSL r1IkAgvI7tldwtwjpcBXik/diikfapTFXnlv/wA49ecFj0up0crp/wBYW5tvVm9O5LyM55n6p/x8 Iwt5fhP7tB9v7AVe+aFYz6fomn2FxL689pbQwSz/AM7xRhGff+YiuKo3FVsX2T/rN/xI4quxV2Kr U+1J/rf8ajFV2KuxVan2pP8AW/41GKrsVdirGvLc0UOsecZJXWONdXh5O5CgV0nTxuTiqc6S6PaF 0YMjTTlWBqCDO5BBGKozFXYq7FXYq7FULZf703//ABnX/kxFirFPy60Oyl8j6LK0l2Ge1QkJeXSL U+CrKFHyAxVkf+HrD/ft5/0nXn/VbFXf4esP9+3n/Sdef9VsVWReXrDif3t59pv+P68/mP8Axbiq H1Oz8uaVZvfapqM1hZRlRJdXWp3MMSl2CqGd51UVYgDfrirEdS8/+SLTUksoDqeppL6Kw3thqRnt 3lukka3iDC9Dc5vRYLVadCxCkHFUsvvza/L7TYEe6j1pC11PZyobyRTFNbiJplcveKpKfWAtELFm BCcjx5Ksm8sa95X8x6hNY2J1JJILW1vHM2oSKeF5DHPGBEt282ySrVinCtQGJGKsm/w9Yf79vP8A pOvP+q2KrIvL1hxP728+03/H9efzH/i3FV/+HrD/AH7ef9J15/1WxV3+HrD/AH7ef9J15/1WxVLd A0W1nsZXlnvXYXl7GCb68+zHdyog/veyqBiqZf4esP8Aft5/0nXn/VbFXf4esP8Aft5/0nXn/VbF VkXl6w4n97efab/j+vP5j/xbiq//AA9Yf79vP+k68/6rYqp3GiWENvLNyv5PSRn9OO9vGduIrxVf W3J7DFWLeTfMXl3zReXNtZ22sWzQrJI0lxfSNH+6uHtGUPb3k6k+pA1D9kjoSVYKqy3/AA9Yf79v P+k68/6rYq7/AA9Yf79vP+k68/6rYqsTy9YcpP3t59r/AJbrz+Uf8W4qv/w9Yf79vP8ApOvP+q2K u/w9Yf79vP8ApOvP+q2KpP5Ss1h1LzhbwyyoBq8XGVnaaQV0qwP25vUJ+nFWRafJJJbVkbmyySx8 yACRHIyAmgArRcVRGKuxV2KuxV2KoWy/3pv/APjOv/JiLFWKfl15h0CHyPosU2p2kcqWqK8bzxqy kdQQWqMVZH/ify1/1drP/pIi/wCasVd/ify1/wBXaz/6SIv+asVWReZ/LfE/7lrP7Tf8fEX8x/ys VQOvT+Q9f0yXS9XvrK6sJipkhN0qVKMGX4kdW2YeOKpAfJX5NfXJrwPapcTyNNKyalMimVw49Xgs 4UOvqNwYCqV+GmKqEvkL8lbqCeOdrZluOaykapcKxDIYZKOtwGBljNJSD+8/b5HFU78uWX5deXCx 0jUYoQ8ccLJJqctwhSFFjj+CeeReSxxqnKnLiAK0xVPP8T+Wv+rtZ/8ASRF/zViqyLzP5b4n/ctZ /ab/AI+Iv5j/AJWKr/8AE/lr/q7Wf/SRF/zVirv8T+Wv+rtZ/wDSRF/zViqWeXvMXl+OwlWTU7RG N7fMA08YPFryZlO7dCpBGKpn/ify1/1drP8A6SIv+asVd/ify1/1drP/AKSIv+asVWReZ/LfE/7l rP7Tf8fEX8x/ysVX/wCJ/LX/AFdrP/pIi/5qxVZN5i8rzQvDJqtmY5FKOBcxg0YUO4YEYqkXlyw/ LjQL+9vdLv4I7q9Cx3U0upSXBkVHknHL15pd/VuZG5dascVZB/ify1/1drP/AKSIv+asVd/ify1/ 1drP/pIi/wCasVWJ5n8t8pP9y1n9r/loi/lH+Viq/wDxP5a/6u1n/wBJEX/NWKu/xP5a/wCrtZ/9 JEX/ADViqVeTbq1utW83T2syTwtq8fGWJg6mmk2ANGUkdcVT3TP95n/4z3H/ACffFUVirsVdirsV diqFsv8Aem//AOM6/wDJiLFUk/LX/lAtD/5hExVkuKuxVbF9k/6zf8SOKrsVdiq2L7J/1m/4kcVX Yq7FVsX2T/rN/wASOKrsVYd5n836tpVz5jhgFqP0doqajpYmDkyXJ+tlkejrzXjaghEoevxb/Cq8 31n89fNWn62unQ/or6s91fwyXUkUpFutvcSRfvaXKgmCNFuJvs1jcf3Y+MqvbNCvp9Q0TT7+4i9C e7toZ5YP5HljDsm/8pNMVRuKrYvsn/Wb/iRxVdirsVWp9qT/AFv+NRiq7FXYqtT7Un+t/wAajFV2 KuxVjvlb/juecP8Atrxf90iwxVONM/3mf/jPcf8AJ98VRWKuxV2KuxV2KoWy/wB6b/8A4zr/AMmI sVYp+XU+vjyPoohs7R4hapwd7qRGI7EqLdwPvOKsj+seZf8Algs/+kyX/slxV31jzL/ywWf/AEmS /wDZLiqyK48ycT/oFn9pv+PyX+Y/8uuKr/rHmX/lgs/+kyX/ALJcVd9Y8y/8sFn/ANJkv/ZLiqyK 48ycT/oFn9pv+PyX+Y/8uuKr/rHmX/lgs/8ApMl/7JcVd9Y8y/8ALBZ/9Jkv/ZLiqyK48ycT/oFn 9pv+PyX+Y/8ALriq/wCseZf+WCz/AOkyX/slxV31jzL/AMsFn/0mS/8AZLiqyK48ycT/AKBZ/ab/ AI/Jf5j/AMuuKr/rHmX/AJYLP/pMl/7JcVd9Y8y/8sFn/wBJkv8A2S4qsiuPMnE/6BZ/ab/j8l/m P/Lriq/6x5l/5YLP/pMl/wCyXFXfWPMv/LBZ/wDSZL/2S4qsS48ycpP9As/tf8tkv8o/5dcVX/WP Mv8AywWf/SZL/wBkuKu+seZf+WCz/wCkyX/slxVYlx5k5Sf6BZ/a/wCWyX+Uf8uuKr/rHmX/AJYL P/pMl/7JcVd9Y8y/8sFn/wBJkv8A2S4qlXk1rptW83G6jSKb9Lx8kicyKP8AcTYUozJGTt/k4qnu mf7zP/xnuP8Ak++KorFXYq7FXYq7FULZf703/wDxnX/kxFiqSflr/wAoFof/ADCJirJcVdiq2L7J /wBZv+JHFV2KuxVbF9k/6zf8SOKrsVdiq2L7J/1m/wCJHFV2KvNvNOlef5PNV/Np8d9Npc8ARfq1 4kMZhDWjNDFG1zCY7giK5AmCqf3i/vKD4VXn9v5Q/PQR6Xy/THoxfWBqsX6XX1JWMjF+D/XdvUgK RRfEOEgLfu6+oyr3zQotQh0TT4tSf1NRjtoUvZK15TrGBI1fd64qjcVWxfZP+s3/ABI4quxV2KrU +1J/rf8AGoxVdirsVWp9qT/W/wCNRiq7FXYqx3yt/wAdzzh/214v+6RYYqk/5h6trul+R5Z9Clmh 1ObVbe0ga1W2ec/W9UWBkjF4Gt+TLIVBk+EddsVTD8sbXzbbeUYo/NsMEGvNc3kt2lssKRH1buWR HUQAJ8aMGJPxEmrfFXFWVYq7FXYq7FULZf703/8AxnX/AJMRYqxT8utMvZPI+iuurXcStaoRGi2p VR4DlAzfecVZH+ib/wD6vV5/wFn/ANk+Ku/RN/8A9Xq8/wCAs/8AsnxVZFpN/wAT/uavPtN+xZ/z H/l3xVf+ib//AKvV5/wFn/2T4q79E3//AFerz/gLP/snxVZFpN/xP+5q8+037Fn/ADH/AJd8VX/o m/8A+r1ef8BZ/wDZPirv0Tf/APV6vP8AgLP/ALJ8VWRaTf8AE/7mrz7TfsWf8x/5d8VX/om//wCr 1ef8BZ/9k+KpddXmnWlxPbXfm1re5tYPrdzBLJpyPFbg8fWkVoAVjqacztiqXReavKRh9Uefrf0y 01H+taXx/cD1Jd/S/wB1owZvAbnbFWQR6beSIskeuXbxuAyOq2RBB3BBFv0xVd+ib/8A6vV5/wAB Z/8AZPiqyLSb/if9zV59pv2LP+Y/8u+Kr/0Tf/8AV6vP+As/+yfFXfom/wD+r1ef8BZ/9k+KrE0m /wCUn+5q8+1/JZ/yj/l3xVf+ib//AKvV5/wFn/2T4q79E3//AFerz/gLP/snxVYmk3/KT/c1efa/ ks/5R/y74qv/AETf/wDV6vP+As/+yfFXfom//wCr1ef8BZ/9k+KpV5Nhkh1bzdHJO9y41eOs0oQM a6TYHf01jXb2XFU90z/eZ/8AjPcf8n3xVFYq7FXYq7FXYqhbL/em/wD+M6/8mIsVST8tf+UC0P8A 5hExVkuKuxVbF9k/6zf8SOKrsVdiq2L7J/1m/wCJHFV2KuxVbF9k/wCs3/Ejiq7FWDa9+W95qXmG 41e21WO2WbjKlvJbPKVuENqysXWeKsddPiqnEHdvi32VYbb/APOO94v6Ll/xJGZ9J9Rbc/UX4Nxn e4h5r9aqeM8rF/i+JKKOJHIqvX9G01NL0ex0yNzJHY28VskjfaYQoEDH3PHFUZiq2L7J/wBZv+JH FV2KuxVan2pP9b/jUYquxV2KrU+1J/rf8ajFV2KuxVjvlb/juecP+2vF/wB0iwxVONM/3mf/AIz3 H/J98VRWKuxV2KuxV2KoWy/3pv8A/jOv/JiLFWKfl15e0CbyPoss2mWkkr2qM8jwRszE9SSVqcVZ H/hjy1/1abP/AKR4v+acVd/hjy1/1abP/pHi/wCacVWReWPLfE/7ibP7Tf8AHvF/Mf8AJxVf/hjy 1/1abP8A6R4v+acVd/hjy1/1abP/AKR4v+acVWReWPLfE/7ibP7Tf8e8X8x/ycVX/wCGPLX/AFab P/pHi/5pxV3+GPLX/Vps/wDpHi/5pxVZF5Y8t8T/ALibP7Tf8e8X8x/ycVX/AOGPLX/Vps/+keL/ AJpxViura95D03WLrSpPL6TXFtGCHitrPhLOzW6rbJzdGEh+uw7uFT4vt7HFWLQfm7+VzLZKPK0/ q6l6rWUX1TT+TgSNGm/r8R6syNGtTsRVuK0YqvStN0jylqWnWuo2ulWbW15DHcQMbeIExyqHUn4f A4qif8MeWv8Aq02f/SPF/wA04qsi8seW+J/3E2f2m/494v5j/k4qv/wx5a/6tNn/ANI8X/NOKu/w x5a/6tNn/wBI8X/NOKrE8seW+Un+4mz+1/yzxfyj/JxVf/hjy1/1abP/AKR4v+acVd/hjy1/1abP /pHi/wCacVWJ5Y8t8pP9xNn9r/lni/lH+Tiq/wDwx5a/6tNn/wBI8X/NOKu/wx5a/wCrTZ/9I8X/ ADTiqVeTbW1tdW83QWsKQQrq8fGKJQiiuk2BNFUAdcVT3TP95n/4z3H/ACffFUVirsVdirsVdiqE t1mjvLoNE3pzSCRJgV40ESJQjlyrVT2xVhvknzVY6V5T0vTb+x1aK8tIFinjGj6o4V12IDJbMrfM GmKp3/j3Q/8All1f/uC6v/2S4q7/AB7of/LLq/8A3BdX/wCyXFVkfnzRApra6v8AaY/8cXV+5P8A y64qv/x7of8Ayy6v/wBwXV/+yXFXf490P/ll1f8A7gur/wDZLiqyPz5ogU1tdX+0x/44ur9yf+XX FV/+PdD/AOWXV/8AuC6v/wBkuKu/x7of/LLq/wD3BdX/AOyXFVkfnzRApra6v9pj/wAcXV+5P/Lr iq//AB7of/LLq/8A3BdX/wCyXFUg1Nvy81PUpdSvNN1xryaP0pJI9O8wQinwfEEihRFkHpR0kA5/ Cu/wiiqSxeU/ycWOFf0DrgNsZRbN9S8yc4xKSfgf0+S8SS6UPwOSy0Yk4qzS185+W7S1htbay1aK 3t0WKGMaLq9FRAFVR/ovYDFVX/Huh/8ALLq//cF1f/slxVZH580QKa2ur/aY/wDHF1fuT/y64qv/ AMe6H/yy6v8A9wXV/wDslxV3+PdD/wCWXV/+4Lq//ZLiqxPPmiBnra6vu1R/uF1fwH/Lriq//Huh /wDLLq//AHBdX/7JcVd/j3Q/+WXV/wDuC6v/ANkuKrE8+aIGetrq+7VH+4XV/Af8uuKr/wDHuh/8 sur/APcF1f8A7JcVd/j3Q/8All1f/uC6v/2S4qh/J929xdeaNRjtLtYLvVY5LVLm2ms5ZEXTbKFn WO7WBuIeNhWlNjTFWRWEUkdvSReLNJLJxNCQJJGcA0qKgNvTFURirsVdirsVf//Z uuid:4297280377CEDC11945D974E704A7427 uuid:4897280377CEDC11945D974E704A7427 uuid:4197280377CEDC11945D974E704A7427 uuid:F996D8AF60CBDC118424F744D6481B7A endstream endobj 81 0 obj <>stream h,Mk0 aWj;Pk;Bir 9x#ݿGz$dYZ Jg4۱}LZN!1Lߔ4k豕nΏ0Tտ_7y> FOLIRӞkU'jS-rdrD-Ԫ8 N&shnK*_Pn444+gE/)u]5]n!=L|0/|9y`GVR endstream endobj 82 0 obj <> endobj 83 0 obj <>stream hYYo~篘Ǚ`wȃkar /J$.x($'%%_UpHl${誃Mq 0fШyQ՘-.nJk+| ?.wߪڪWQrZ.2ra!maQ *+xMPW> 4@)^ }9`p/ê\:P~N˖=^W0XΪ1ꄕ5gOK*VL'[ D S6r<TEhjlbVY^IIFy 3)mb75\ 3t2rP\~(eW?~0ĕ?2EF9h ZjZpmf4 `8m-w`OA9Rp-wcxMUT"%Ia9U|*B5 X:QHba=bFYc 01$j@I٠.е4c1~/74ͷ½N VPgҭ9t.y";R[o4rxZG#+Q##:aDȦ7?|ZGη_Ǽ|d[@r 3Mi5~0? B!9&r P/T-{[BP|,|qV\)&oaAqR^UŒuLm+~KӤ=7ݗ7<м@yfa1&WvxFqeI{xi2e`cbtxh&xy ,`WB^]3_ -?K1s8gnaF)["eO7A ăN٩Hy?oC̐G ^Ytv_*6ϙ=NZ}4%pKxF&kzaY*?ʂ 9Ӄ'Hl~Fl}:G^ Sz|pQ}T!FBsE ^5 2@z}Kj[RvADi خxQh_-Roヽy%<ь`՝_3xa*D?8Qکldc:wmk.EӸla} KTr3H#ҐZZKS c;dkm7JlG\wh}i!y[mXSZ/_6Ý pkHϠSF.[:kL⁲EJ_Tw7E1rj]Y68{^7hpѤm'mȵ *5fFz[-ᩅ]w܉fDm Y&o}w=¿|}?}oi̾끺ma?E|-Ֆ_Vϼklr0hyE'<y׌^:18P. GS$*x 'Fm!'D΂w %gPX%8\3[wXm=ha$m;𤀄2}唷:AS9|aj0'n(]>=RLVT\ncuy#ֽ# mn>ʧ^So} )zowWr,mdu ֭JO\].率TjˇYz<Z;x:zƼSfu=Ȇ+u^ZQ2ږ'UG\箊J⦊l<=BeE_:q\Q!oUy/_*Q(HGF/Ga@s91zATW\242! ȟ.\_غ0DDD35.;ju-^OE^l)p!3P?j9ˊW\ˌ\jc!z"1r}VHԫ86z%RjKT5ܘ4*bvXq"-nt<gVOTQ+!6ە4;<yR m2vpg6,Hڒ봉Jpf<>sn+Rn1 ǰ<&Y1Jx}V%mHeڪܯPYJ}wsҼbc_C<}&|"s% 7zͥP2j+SKS42MS8҈AۀXٗ!NMHb2ҶFy7 UxL:_~)? z:J',A-eKCss(ElDZ 0Ӆ 0B endstream endobj 84 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-31T10:45:44-05:00 2008-01-31T10:53:20-05:00 2008-01-31T10:53:20-05:00 256 160 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAoAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq8D806N598r+d/Onn7T7CK3tLaBry2vm+qhr2NRpPOyd/UlnYSR2NzHGpgT02bk jO0gCqoiax/5yU07U44LK4n1OCafne6hO+lCHibGyXlHAyo4VbhboCNPT+LgxYjlzVeo/l2fNx8n 2H+L1kXzCPWF56xtmkIE7iJm+pgW4Ji4miVp0JJqcVZHirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdiqQzTa+vnu0hR5G8vy6XcvPGIl9NLyK4txETNTlyeKWSicqfCTTFU+xV2KsV8y3 +vQedPKVrYS3SaZcyXv6YjiszPbPElsfSE1wscht3E7IY6uisA9SdgVWVYq7FWG+d9S8z2nmPyrD oz3Ztrq8MeqQQWnr27W3KMO9xP6Mvo8FJ4D1IuVWPJinpsqzLFXYqxD8w9R872c3lpfLFpJPBPrN pHr80axSGPTmfhNVJDyoxcEugJVQTt1xVl+KuxViP5g6h5osZfLL6ElzLDNrVrb6xDaRiR2spQ6u XZre6WOJG4tIx9P4QQJEJBxVl2KuxVh/5i6p5r0+Tyx/h+G5ljutctLfWPqsKzsti6yeoZOUcoji 5Becnw0H7akjFWYYq7FWOed28wC20lNDuLm3uptVso7h7aKKZDaGWt2J/VinCJ9XV6OOJ58Pi3oV WR4q7FWF/mxqXnLTvLltP5TSd9Ra+t45hbW4un9BuXOqFJKLUKC1P9kg+NVWaYq7FXYq7FXYq7FX Yq8282fnx5V8sa9faNf2N5JPp7cbiSKbTV+EWovGkWGa8hujGsRpz9Khf4Fq1AVXoEF1NNczIIlE ETBDIWIckor/AGCv+X/NirC/Kz/mLr/l7T9a/wAQWNr+kIVnFuNMZxGH348jdLyp40xVNP0N+Yv/ AFM9l/3Cj/2V4q79DfmL/wBTPZf9wo/9leKtJpH5isK/4nsupH/HKPY0/wCWvFW/0N+Yv/Uz2X/c KP8A2V4ql11c+ZLSee3uvPWj289rGJrmGWxRHjjZgqvIrXoKqWdQCe5GKoG+8zXenyrDqP5leXrK djKEiuLeCJj6ErwSUV75T8EsTo3gykHcHFUxsn81X8vo2PnfSLqWhb04LBZGoEikJot6TQJcxN8n U/tCqqO/Q35i/wDUz2X/AHCj/wBleKtJpH5isK/4nsupH/HKPY0/5a8Vb/Q35i/9TPZf9wo/9leK u/Q35i/9TPZf9wo/9leKoTTLP8xr22eY+ZLFCs9xBQaUx2gneEH/AHr7+nXFUX+hvzF/6mey/wC4 Uf8AsrxV36G/MX/qZ7L/ALhR/wCyvFWk0j8xWFf8T2XUj/jlHsaf8teKt/ob8xf+pnsv+4Uf+yvF Wjo/5hqCzeaLEAbknSjQD/pLxVLdJvvMWsSPHpXnzRtQeNebLa2STkJyMfMiO9bb1EZK+II6jFUz /Q35i/8AUz2X/cKP/ZXirv0N+Yv/AFM9l/3Cj/2V4q0ukfmKSw/xPZfCaf8AHKPgD/y1++Kt/ob8 xf8AqZ7L/uFH/srxV36G/MX/AKmey/7hR/7K8VVvJ1/rk82vWOs3UN5caTqC2kVzBAbZWjextboV jMk24a5YV5YqyPFXYq7FXYq7FXjXlC2/MDX/AD1o/nK+j17StIv4YrqfR5pbc6dEH07h6fCPVOfE zt6lXsOdeNQhDNir1ezuIPr99B6i+sZlYRchyp6EW/HriqSflZ/5Lry9/wAwUX6sVZTirsVWxfZP +s3/ABI4qk/nPQdQ1/yxf6Pp2rT6He3aKkOq2vL1oCHViycHiapCldmHXFXm+tf849TaxeXNzf8A mu8uTNH9VQTxtOy2aP68Vu0kszuwS6igm5Vq3Ag/bJCrSf8AOPEb6Xb6fN5kuZorf6/xkMXpSl7+ 2SGU87eSE0M6PMR+1zKtXclVl3kr8uG8sau+orqK3Xq6fbabLH9WWMlLKNFgcOHZq8jOX/mDoNvT +JVmuKrYvsn/AFm/4kcVXYq7FUr8t/8AHPm/5jb/AP6jZsVTTFXYqti+yf8AWb/iRxVdirsVYf5M 8i3Ogavd38+oR3puLaKF1W29FvrTSy3V5chvVk/3qmuORSnwhVHI0rirMMVdiq1PtSf63/GoxVdi rsVY35U/473nP/tsQ/8AdH0/FWSYq7FXYq7FXYq7FUJbGd727ZpmMcUgjSGicQDEjdePLqx/axVh n5e+T/L9x5J0aeWCQySWyMxW4uFFT4KsgA+gYqyH/BHlv/fEv/SVc/8AVTFXf4I8t/74l/6Srn/q piq2PyR5b4n9xL9pv+Pm5/mP/FmKqd55U8n2NpNeXtbW0t0aW4uZry4jjjjQVZ3dpQqqo3JOKsQ1 3zN+VOkRNOPW1K2FsbwXGnXrXKGNblLUgFbkbiWWm+2zb1FMVQFv50/Lu4v7nT7DRNXv7qzuLu1u kgnA9Oe1+tP6bCW9jNZUsXeOgpQry41xVkPktvJXm2zku7HTb+1iSO2lBuriUclu4FuI+JiuJhsj iu/gRVSrFVkf+CPLf++Jf+kq5/6qYqtj8keW+J/cS/ab/j5uf5j/AMWYqu/wR5b/AN8S/wDSVc/9 VMVd/gjy3/viX/pKuf8AqpiqWeXvJfl17CUtBKSLy+X/AHpuRst5KB0k8BiqZ/4I8t/74l/6Srn/ AKqYq7/BHlv/AHxL/wBJVz/1UxVbH5I8t8T+4l+03/Hzc/zH/izFV3+CPLf++Jf+kq5/6qYq7/BH lv8A3xL/ANJVz/1UxVjnlMeRvMt3rVtY2d3G+jXkllcmW5lIMkTvExUxXEtPihY8JOLgcSVAYVVZ H/gjy3/viX/pKuf+qmKu/wAEeW/98S/9JVz/ANVMVWp5I8t8n/cS/a/5abn+Uf8AFmKrv8EeW/8A fEv/AElXP/VTFXf4I8t/74l/6Srn/qpiqX+TNNt7O/8AN9nZl4Il1iIqwYyOK6VYMfil9Sv04qyT T5JXtiZHLusksfMgAkRysgrxAHRfDFUTirsVdirsVdiqFsv96b//AIzr/wAmIsVYb+XvmrRLfyTo 0EskokjtkVwttcMKjwZYyD9BxVkX+MtA/wB+zf8ASLdf9U8Vd/jLQP8Afs3/AEi3X/VPFVsfnHQA prLP1Y/7y3Xcn/ivFULq+ueT9Y0q70rUhNcaffwvb3cBtrtQ8UqlXXksasKg9jirGG8ofk00cMZ0 2b0oIHtY4+Op8PReRpSrL0f95IXXlUq1CKECiqO03y7+WgkvdQsNNuln1GeaW7u7aHU1Z5mWe3kc SRiquEuJEqpBXtQqKKpn5Y0/yf5XtprXQ7G/tYLho3lja31OYFooY7dCPWWTjSGFE27KMVTr/ENh /vq8/wCkG8/6o4qpW3mXTJIy0aXbqHkUlbK8I5I5VhtF1DAg4qq/4hsP99Xn/SDef9UcVd/iGw/3 1ef9IN5/1RxVJtB816LDZTRyvOji9viVNrdVHK8lYV/d+BxVMf8AGWgf79m/6Rbr/qnirv8AGWgf 79m/6Rbr/qniq2PzjoAU1ln6sf8AeW67k/8AFeKrv8ZaB/v2b/pFuv8Aqnirv8ZaB/v2b/pFuv8A qniqUaFdeRdEuNRn05LiGXU7hrq7dor+XlJIzSNx9VX4LzkchEooqaDFU3/xloH+/Zv+kW6/6p4q 7/GWgf79m/6Rbr/qniq1POOgBnrLPuaj/RbrwH/FeKrv8ZaB/v2b/pFuv+qeKu/xloH+/Zv+kW6/ 6p4qgPJN7b3up+brm3LNC+rx8SyPGdtJsAfhcKw3HhiqV/mcLqT8s9Ys7d7eL9ITtYXE15cx2Vsl vd33oTmW4k+wDE7KOKs3IgKpOKsJ8n6X+eyeV7NI9RK29q622lpZy6XcW0+m2ekv9VuEuZIZZHW+ vVi5M1HCNUBNyFUz8iap+caea9A0XzZd8hNZXd/qiSR2KzcLS4ngjDLZ+rGn1hb20f4ZNjCwFavi r2DFXYq7FULZf703/wDxnX/kxFiryryR/wAonpf/ABgX+OKphq+p22laVd6nchjbWULzzcKFuEal mpUqOg8cVed3/wCfPl6FtOeGzuxBd+pO7SJEWe0ijkLPCEmJJ9VQu46Ak0FCVVGx/PnSxDJealp1 6tncLLc6d6MEJP1WLnxaR/rL8mk9M9EUKevw/GVWXeUfO0PmXUtVitYWis9PESIZOHqmUyTpLyEc knEfuRxDcW7kUIxVk+Ksm8j/APKOx/8AMTe/9Rk2Kpf5s83ajpHmny9pVsLcwaqziaOVWM0tJ7eE rbkSIAYkuGmf4H+FDsOuKsuxVgerab59vtHjHlHVIdMmjvtUa6Mwj/e/6VN6SBpLe7Cjn9o8OnY4 qwmX/FqX72955vjTUI7s28i/WtQjia7njRI0QLAkRVplKFUHCOhI+IsoVVvy2Hm3V9Yaa28xR6vp NlqS3NwWutYjc20kc3BOFxGiM3xxvwDmP2+ySqyYf70Xv/Mbef8AUTJiq7FXYq7FUPqN7HY6fc30 qu8drE8zpGOTssaliFFRUmm2KvN9b/Pvy3Z2V5PaW1xKLOWFTO4g9GaJpQJGgb11Mh9MHgBuTQ0K hiFWoPz20j69qT3Fhefo21tbe8gaOCMyCGaMMzyMZ/iJkdYwiJt1qQfhVZH5N/MGz816neRWELxW VtaWs6+uEWfncNLUMiyOVXjGvHkBy+0vJCpKrLsVdirsVdiqYflp/e+av+2wn/dLscVXecvKM/mr y1Dp0EvoyQazb3xb1poAY7TUhNKOUHxFjGrcK7B+J2IDBV45efl5+dHk3yJeWp1m71H91Y21haaR eapM8ZtLO5ipCkEHrW0ZkaA0SquyDnwRjwVex/l95c84aPf+YpvMGofXbbUb1rjSka7uLt4YGZzw YSrHFCAGUCOJaCm7N1xVmWKuxV2KoWy/3pv/APjOv/JiLFXnHkTy9rs3k/SZYltTE9urIXmkVqGv UCFgPvxVPv8ADHmL+Sz/AOR8v/VDFXf4Y8xfyWf/ACPl/wCqGKtL5a8xMKhLTqR/fy9jT/fGKt/4 Y8xfyWf/ACPl/wCqGKu/wx5i/ks/+R8v/VDFUw0C08zabposzaWUvGa4fn9blWolneUbfVj050xV MfrHmX/lgs/+kyX/ALJcVd9Y8y/8sFn/ANJkv/ZLiqXWVt5pi024tVgtYpJpruRLmK7bnGbieSQF RJaSJyTn+0pHtiqSSflxb3F3b319pcV5qNvMt0LttVvIi1wu4laK3ghg5VqfhjAqSafEaqpj5d8q Hy7Lcy6Ro9rBLeUNy76leTlqMz9ZoZKfFIxNOpOKpfp2ieYLyO5uVitEEl5e1U3EhoRdSg/7o8Ri qK/wx5i/ks/+R8v/AFQxV3+GPMX8ln/yPl/6oYq0vlrzEwqEtOpH9/L2NP8AfGKt/wCGPMX8ln/y Pl/6oYq7/DHmL+Sz/wCR8v8A1QxVoeWvMRJHC0+E0P7+Xwr/AL4xVv8Awx5i/ks/+R8v/VDFXf4Y 8xfyWf8AyPl/6oYq0PLXmIkjhafCaH9/L4V/3xirf+GPMX8ln/yPl/6oYq7/AAx5i/ks/wDkfL/1 QxVb5HgvLGTzdHMUS4TWI6mNZLhfi0uwOyqI3bY+GKsr03h9UBR/UDPIzMVaP42kYuODfEKNUUOK orFXYq7FXYq7FULZf703/wDxnX/kxFiqSflr/wAoFof/ADCJirJcVdiq2L7J/wBZv+JHFV2KvG/M Vv8An7rmkanYS2kGnSSWkZ0+90m5azuFnklgaWPkbyVfgj9RefEbrUUDUxVDL5S/Nlonur2bUp9Y Moijls9TaGzDC/vWkuTbG6ijWNrf0Ci8HK1UNG4V1xV6V+Xlhq9j5RsoNXF2uoF7iWWHULgXlxEJ riSVIXuFkn9URI4RW5mqgdOgVZHiq2L7J/1m/wCJHFV2KuxVK/Lf/HPm/wCY2/8A+o2bFU0xV2Kr Yvsn/Wb/AIkcVXYq06lkZQxUkEch1Fe4rXFWB/l9pXm+z1Y/pwXohh0fT7czXF4LmKa+UN9aPp+r IwdAI/3nH4yzVY0XFWe4q7FVqfak/wBb/jUYquxV2Ksd8rf8dzzh/wBteL/ukWGKpxpn+8z/APGe 4/5PviqKxV2KuxV2KuxVC2X+9N//AMZ1/wCTEWKsU/LrTL2TyPorrq13ErWqERotqVUeA5QM33nF WR/om/8A+r1ef8BZ/wDZPirv0Tf/APV6vP8AgLP/ALJ8VWR6Tf8AE/7mrz7TfsWf8x/5d8VX/om/ /wCr1ef8BZ/9k+Ku/RN//wBXq8/4Cz/7J8VQWkelqtmLzS/M0t9aM7qtxbNYTRllYggOkDLUd8VR v6Jv/wDq9Xn/AAFn/wBk+Ku/RN//ANXq8/4Cz/7J8VWR6Tf8T/uavPtN+xZ/zH/l3xVf+ib/AP6v V5/wFn/2T4q79E3/AP1erz/gLP8A7J8VSzy7pV8dPlI1i8X/AE2+FAlp2vJhXe3PXFUz/RN//wBX q8/4Cz/7J8Vd+ib/AP6vV5/wFn/2T4qsj0m/4n/c1efab9iz/mP/AC74qv8A0Tf/APV6vP8AgLP/ ALJ8Vd+ib/8A6vV5/wABZ/8AZPiqB070dQlvI7DzNLdvZzG3u1gawkMUyABo5AsB4OD1U74qjv0T f/8AV6vP+As/+yfFXfom/wD+r1ef8BZ/9k+KrE0m/wCT/wC5q8+1/JZ/yj/l3xVf+ib/AP6vV5/w Fn/2T4q79E3/AP1erz/gLP8A7J8VSrybDJDq3m6OSd7lxq8dZpQgY10mwO/prGu3suKqHmvXNW0b yylxpJt1v7rWLbT4pLuN54UF/qqWrSNHHJAz8FmLAeou+KsJ0H/nIKL0JbfVtMudS1aLU7nSmXSI YIoOdpPZ2gkVru9Usk8+oQlD+yHodkMjKoiL/nJvyBc6VdanYWeo39vamPmtuloZCsltdXbNxe5T h6UWnTc1k4tsOKsGBxVG3X58aBHq9vYwWGoTyz3WpadBYJDbia5n05baUyxSyXcUccLQXBkT1QDI u44/CJFVlj/zkT5OvbCe/g07VDaRS28cczRWyrLHcz3Nutwpa4HCJJLGUOZeB6UBriqCm8+62n59 QeU49bml0+advU0draxjjiiTS/XYCQNJeyhpikiycI1FXWsgHwKvVbL/AHpv/wDjOv8AyYixVJPy 1/5QLQ/+YRMVZLirsVWxfZP+s3/Ejiq7FXGtNuvbFUj8maBdaHov1O7uYr28eaae6vIYDbCWSWQs W9MyT8afZUBqKoCgAAYqnmKuxVbF9k/6zf8AEjiq7FXYqlflv/jnzf8AMbf/APUbNiqaYq7FVsX2 T/rN/wASOKrsVdirHfLXlifStY13UZ7tLl9WuFeOOKFoVhhj5GOP4pZqn94SxXiparBAWaqrIsVd iq1PtSf63/GoxVdirsVY75W/47nnD/trxf8AdIsMVSX8y9b0rQ/y21bVNV0e11+zguQraVftFHbS tNqAiT1JJkliQK8gbk60FNyOoVea6X+bOiyeV7PzFZfl1pFtp0tveX1mj3MULrDp13ZWUZNLExRM 1wbfq4VEiV+XwKAqyf8ALbX/ACX5r1J9Lg8i6dpkc+mW2qXUixW8kbQ3FnDHaqaQRrJVLu8t+vwr EwpxkoFWft+XnkBrQ2beWdKa0Z3ka2NjbGMvKYzIxThxq5gjLHvxXwGKqsvkbyVMiJL5f02RI5Fm jV7OBgsiPJIjgFNmV7iVgexdj+0cVeWXet2ujfm9PZ2nlvWdfle/eaG8t9Uv/q0N7JYCWSD6vqD2 umGT6u7OipMxCGgC8QAq9jsv96L7t+/Xb/nhFirFfy68vaBN5H0WWbTLSSV7VGeR4I2ZiepJK1OK sj/wx5a/6tNn/wBI8X/NOKu/wx5a/wCrTZ/9I8X/ADTiqyPyx5b4n/cTZ/ab/j3i/mP+Tiq//DHl r/q02f8A0jxf804q7/DHlr/q02f/AEjxf804qk/leHyrr2myXkfl+Kz9K4ntpILq2tvUWSGQo4rE ZozxYFTRjQgg0IIxVOP8MeWv+rTZ/wDSPF/zTirv8MeWv+rTZ/8ASPF/zTiqyPyx5b4n/cTZ/ab/ AI94v5j/AJOKr/8ADHlr/q02f/SPF/zTirv8MeWv+rTZ/wDSPF/zTirzyLQtE9a9H6PtqC9vAB6M ewF1IAOmKqn6D0T/AKt9t/yJj/pirv0Hon/Vvtv+RMf9MVd+gtE/6t9t/wAiY/6Yq79B6J/1b7b/ AJEx/wBMVSu5vPy+tbia2uZ9JguLYgXEMj2yPGShkAdWIK1QFt+2+KpRpvnL8sNQluFibTo4bSMy XF1KbNYUAuHthybmftPHVdvssv8AMMVZFY2nlS/jeSxhsLuOKRoZHgWGRVkQ0dGKg0Ze46jFUT+g 9E/6t9t/yJj/AKYq79BaJ/1b7b/kTH/TFXfoPRP+rfbf8iY/6Yq79B6J/wBW+2/5Ex/0xVOfytt4 Lc+aYoI1iiXWF4xooVRXS7EmgG2Ksu0z/eZ/+M9x/wAn3xVFYqg4NI0+DVLvVYoqX99HDDdTlnbl HbGQwoFYlVCmZz8IG7EnFUZirsVeH/lj5i8o6tf6BqmhflxpNk2oyuF1rR0t5vqCC3m9UXLra2s8 EvqRiKhT03D1SVhQMq9msv8Aem//AOM6/wDJiLFWKfl1rllF5H0WJo7sslqgJSzunWo8GWIqfmDi rI/8Q2H++rz/AKQbz/qjirv8Q2H++rz/AKQbz/qjiqyPzDYcT+6vPtN/x43n8x/4qxVf/iGw/wB9 Xn/SDef9UcVaPmCwIp6V7/0g3n/VLFUq8sXXlnSNHj0/SIdQFhbvLHGslvqVwylJGV19SdJH2ZT+ 1iqbf4hsP99Xn/SDef8AVHFXf4hsP99Xn/SDef8AVHFVkfmGw4n91efab/jxvP5j/wAVYqv/AMQ2 H++rz/pBvP8Aqjirv8Q2H++rz/pBvP8AqjirBLW4eZruWK0vHje9vSrCzuqf71S/8V4qrc5/+WK9 /wCkO6/6p4q7nP8A8sV7/wBId1/1TxVZBdGdC8Npeugd4yRZ3X2o3KOP7vsykYqv5z/8sV7/ANId 1/1TxViN7+WHlrU9S1DUNX0m/vp764WcH6vqMXphIBAqAR8Rt8ZrQfa9hircH5deSne9RdH1G4d/ 9HvBMNVmI5SLd8P3pbjV3Eh49a4qmHk/yxJ5bsLm0SG+nFxcvcA/UbxVRSqxpGocStRUjUfap/KF WihVPec//LFe/wDSHdf9U8VUf0hCJHjaOdJIyFkR7edWUlQwqGQHowOKt/X4P5Zv+RM3/NGKu+vw fyzf8iZv+aMVTP8AL6R4IPM90QqJLqyPEZyYVK/o6yjJJKkr8SkbjFWX6apFoCWRjI8klYm5pSSR nFGoK/a8MVRWKuxV2KuxVINN8geSdNn065sdDsoLvSYlt9PvFhT6xFEkRhCCcgykemabsa4qmtl/ vTf/APGdf+TEWKpJ+Wv/ACgWh/8AMImKslxVxrTbr2xVi/5aXWv3Xk+2m16S4m1E3F4pmvIBaXDw peSpA8kAit+BaFUNPTX+JVZRirsVSvy3/wAc+b/mNv8A/qNmxVNMVeZ+dvPvn+0m1rTtG8qXsi23 pw6drNsWlaSSWLmJBA9rJGY42Uq/xnsNuVVVYfb+Y/z5azV7lL+Ge0MSzejYxGO5juYbm5eShtJp Ee3/AHMJ4K1JFPwScghVeyeTLjV7nyhodzrIcavNYW0moCWP0ZPrDwqZecfGLg3Mmq8Fof2V6Yqn GKpX5b/4583/ADG3/wD1GzYqknnjWvN2n635Zh0LT57uwmvOevSwxLIqWnKO24uWPJaNdif93VqR HbjyxVl+KpX5b/4583/Mbf8A/UbNirH/AM0Lzzta2OmP5T9b1/rTtf8AoxJMTbx2s0lCrw3FayKg 4rwZj8Ida1xVmmKpXo//AB0Nc/5jU/6grbFUh/NK+852eh2UvlJJXvzep9aEESTN9WSGWR6q8c23 JFFAAzfZVlLBgqzLFXlv5ga7JoR13VIrY3ksNxbJHbAupdpo7eID93HM/V+ixsT2BOKvPbr8yvPU tzGLfyff2kdvdyQziVLhxNDw4pIGitZqKryB2K1rxovMciqq/TfzK81WdrpcGteXrlZbqeGzkvrj 1Yi0jyRxySFIrT04/wC+BjVmAYKw5VX4lXtfkX+51b/mO/7FLfFUD588xXugfl/ql9p8jR6rLNJZ 6Y8cRuJBdXl4beF44FWRpmRpOfAK3KnQ4qwTy1+fXmO60GGa40COeezm/Rep3M1zLayve2WlSajq TfVFs5Gj4GB0RDuzbHjiqceR/wA9JvNF9pFmdA+qyarBc3PqRXi3UKR2Ul3DcESxxKj8JLe2Aofi E9R9j4lWNa5/zlO+jeX9O1W58sK8l6ZOdqmogcV+p2N5CY2ktozKWXVI1dQoZKMRyUVxVG3/APzk jeaTDO2reWo4ZIr2OxQW9/LcK5a41G2cg/U435mXSWEa8KNzXkyb0Ve34qhbL/em/wD+M6/8mIsV Yp+XU+vjyPoohs7R4hapwd7qRGI7EqLdwPvOKsj+seZf+WCz/wCkyX/slxV31jzL/wAsFn/0mS/9 kuKrI7jzJxP+gWf2m/4/Jf5j/wAuuKr/AKx5l/5YLP8A6TJf+yXFXfWPMv8AywWf/SZL/wBkuKoP S4/MtpbPF9Ts35XFzNy+tyj+/neWn+8x+zzpiqM+seZf+WCz/wCkyX/slxV31jzL/wAsFn/0mS/9 kuKrI7jzJxP+gWf2m/4/Jf5j/wAuuKr/AKx5l/5YLP8A6TJf+yXFXfWPMv8AywWf/SZL/wBkuKpX 5dn8x/o+XjY2ZH12/wCt3KN/rs1f+PY98VTT6x5l/wCWCz/6TJf+yXFXfWPMv/LBZ/8ASZL/ANku KoPS4/MtpbPF9Ts35XFzNX63KP7+d5af7zH7POmKoz6x5l/5YLP/AKTJf+yXFXfWPMv/ACwWf/SZ L/2S4qg7KPzLBc6hL9Ts2+t3CzU+tyjjSCKKn+82/wDdV+nFUZ9Y8y/8sFn/ANJkv/ZLirvrHmX/ AJYLP/pMl/7JcVY5f+WNd1C9vJ57axZLiWOX0XnkcK0UcYU72+5DRhgabHFW/wDDHmT+Sz/6SJf+ qGKqF35J1W89H63Z6dc/VpVuLf1ZXf05krwkTlbni612YbjFUb5PF7GnmO0kQpdWmppG31Z1evKw s5aqZlRfsyUNRirJNN9P6oOHP7cnP1ePPn6jc68Ph+1XpiqKxVBvpGnvrEWsNFy1GC3ks4Ziz0WC Z0kkUJXh8bwoSaV+Eb4qjMVdirsVQtl/vTf/APGdf+TEWKpJ+Wv/ACgWh/8AMImKslxV2KrYvsn/ AFm/4kcVdIHMbCM0kIPAnoDTbFXj2qflx+cGq2cEer69p2qTQ29ytZUWA+tdRyWp4y29ojLGsMvO nE8nFDtQqqg4vyJ12TXdTvLy6sbzSdS1Ge+k024DyxoxvrKZXCtGV5yW9o8cg6fClOrUVZ3+UXkv VPJ3k2HRdTe3e6SQufqh5QgemifDSK1XfhU0iXrVuTcnZVmmKrYvsn/Wb/iRxVdirsVSvy3/AMc+ b/mNv/8AqNmxVNMVdiq2L7J/1m/4kcVXYqh9Rs4r7T7qymUPFdRPDIhJAKyKVIJG/Q9sVYf+Xfkm +8vX+o3V7Haie4sdJ0/6xayOzTDTbT02eZHjjo/qSMFYM1U47KRuqzjFXYqtT7Un+t/xqMVXYq7F WO+Vv+O55w/7a8X/AHSLDFU40z/eZ/8AjPcf8n3xVFYq7FXYq7FXYqhbL/em/wD+M6/8mIsVYp+X Wh2UvkfRZWkuwz2qEhLy6RanwVZQo+QGKpvLaaBFqtvpL3V6NQuoZbiCH65fmsUDIsjFhJwWhlXY mp7VoaKoz/D1h/v28/6Trz/qtiqX6Ho1tcWUkk094zrd3kYP127HwxXUsaDaXsqgYqu1CLy3p95p 1neXt3FdatO1tp8P12+ZpZUiedgOMpoBHExLNQdq1Iqqjv8AD1h/v28/6Trz/qtiqX6Ho1tcWUkk 094zrd3kYP127HwxXUsaDaXsqgYq1qS+W9NvbCzvLnUI59SkMVpS51J0Lig4vIjtHHUuAvNhU7Cu Kpj/AIesP9+3n/Sdef8AVbFUv0PRra4spJJp7xnW7vIwfrt2PhiupY0G0vZVAxVu8h8v2epWOmz3 GofXdR9Q2sSXOoyArCFMjO0bssar6i/E5AqQOuKo/wDw9Yf79vP+k68/6rYqlfl3QLFtPlJlvP8A e2/G17eDpezDtLirest5Z0Z7RdRur+I30yW9uUudSlHqSyJEnMxO4jX1JUXm9FBIqcVTP/D1h/v2 8/6Trz/qtiqX6Ho1tcWUkk094zrd3kYP127HwxXUsaDaXsqgYq7V08t6QbIahd30R1G6jsbMLdah KXnlBKqRG78RRSS7UVR1IxVMP8PWH+/bz/pOvP8AqtiqX6Zo1tLe6tHJPeMlvdrHCPrt2KKbWCSm 0u/xOTvirWuJ5d0OxF9qVxqMdqZI4ecVxqVwQ8rcE5LA8jKCxA5EU98VTH/D1h/v28/6Trz/AKrY ql+maNbS3urRyT3jJb3axwj67diim1gkptLv8Tsd8VQ+vXnlHQJLWPVb6+gkvfUFpGtzqUzStEoZ lRYnclqEcV6sdlqcVR+nadompafbahZXN5LaXcST28n12+XlHIoZTxaVWXY9CKjFUH5Nto7bVvN0 MZdkXV46GWR5W30mwO7yFmP0nFUXfeYtJ8vaFNqmrSvFZx3UkRaKGa4cvNdtFGqxQJJIxZ3A+FTi q7yr5y8uea7Ka+0C6a9soZnt2ufRmijaSM0cRvKkYkAO3JKj3xVOsVdirsVdiqFsv96b/wD4zr/y YixVin5deYdAh8j6LFNqdpHKlqivG88aspHUEFqjFU1n1DyjNrFnqz6xai5sobi3iUXMPApctEz8 hWtQYFpv44qjv8T+Wv8Aq7Wf/SRF/wA1Yqlnl3zL5cXT5Q2q2YP12+NDcRDY3sxB+14YqhtbtfIO s63omtXmqwDUNAlll0+SK+Ea/v04SJIivxdWop3HbwJBVTz/ABP5a/6u1n/0kRf81Yqlnl3zL5cX T5Q2q2YP12+NDcRDY3kxB+13GKrNTm8rahrGlanJ5hiiOkPLLDax3FoYJJJk9PnIJFd+SIXVSjKQ GbxxVNv8T+Wv+rtZ/wDSRF/zViqWeXfMvlxdPlDarZg/Xb40NxENjeTEH7XcYqo60vkvV9U0jU7j WreK50WZ5rYxXFsOXqABkZmDSBTxFQjLy6GqkjFU5/xP5a/6u1n/ANJEX/NWKpV5e8z+WksJQ2rW an67fGhuIgaG8mI/a7jFVPzFJ5N14WC3evW8cVhdwXyRR3FoVeW1lWaLn6iyMtHjG8ZVuo5UJxVN /wDFXlj/AKvFl/0kxf8ANWKpZ5e8z+WlsJQ2rWSn67fGhuIhsbyYg/a7jFVDzMvkjzC+kvd67DA+ j38Op2zW93boWlgrRHLc/wB2wajcaEjavXFU6/xV5Y/6vFl/0kxf81Yqlmk+Z/LS3+tFtWsgGvUK k3EW4+p24qPi8RiqprOo+TtWggt7rWbQQwXVtehEuYByks5luIQ1S3wiWNW2oduuKo//ABV5Y/6v Fl/0kxf81Yqlmk+Z/LS3+tFtWsgGvUKk3EW4+p24qPi8RiqG81ReR/MkVkl5rsED6fcC7tJbe6tg yTqjKj0kEqngX5AFaVArUbYqj9E1Tyfo+j2WlWus2jW9hBHbxPJcwF2WJQoLcSq1NN6AD2xVQ8mX drd6r5untZo7iBtXj4yxMHQ00mwBoykjrirvMXlSHzV5bOkT3D20B1KO5meIurslpqAuGjV43ikj Mgi4c1aq1qOmKpt5c8t6J5b0qPSdEtVstOieWSO3RmZVaaRpZKcyxoXcmnQdtsVTLFXYq7FXYqhb L/em/wD+M6/8mIsVST8tf+UC0P8A5hExVS1jzw+n+e9F8rLYGZdWVmkvubj0qRTyL8KxOhr9VI/e SJWvwc6MAqyrFUr8t/8AHPm/5jb/AP6jZsVSrXvO0+lardWI0710t10thMZgnIanfPZsePBqelw5 Df4jt8I+LFWU4qlflv8A4583/Mbf/wDUbNiqVeavPK+X/MPl/SpLQSw65K0BumlMZjk9WGKNY04O JGZp+RBZaKpO/TFWU4qlflv/AI583/Mbf/8AUbNiqR+dfPWpeXprmC00hdRlj02TUbQPdC39eWK5 hga1WkUxDt9YXgaHkxC03rirMB08PbFXm8f9/e/8x17/ANRUuKqmKuxV2KuxVjOqfmV5K0q+ubDU NR9C6tHWOeMwXBozxGZQrLGVeqKT8JPh12xVKbL84PL0k139ejmsLayiaaWWWG65kC8e0HGL0Azb qhan2S3H9lqKss0XXtK1q3kudMmM8MUphdykkfxhVbYSKpZSrqysPhYGoJGKphirsVdirsVTD8tP 73zV/wBthP8Aul2OKsq0z/eZ/wDjPcf8n3xVFYq7FXYq7FXYqhYIrmO7uGKoYJnEgfkeYIjRKceN P2P5sVYh5T1DzLovlvT9JufKWpyz2UIhkkhm0oxsV7qXvkah91GKoufUZbjUbXU7jyDfzalZBxZX sn6FaeESKVcRSG+LpyViDxO4xVGf4p1z/qT9X/5G6R/2X4qgtI13zDZ2kkUvlDVizXN1MOM2kkcZ 7iSVet+N+LiuKqk+r3c8jSz+RdRlkcRh3dtGZiIXMsQJN9/uuQ8l8DuN8VRP+Kdc/wCpP1f/AJG6 R/2X4qgtI13zDZ2kkUvlDVizXN1MOM2kkcZ7iSVet+N+LiuKt3eoS3l7aX935Bv7i+sOZsbuX9Cv LAZKc/Ska+LJy4ivE70xVGf4p1z/AKk/V/8AkbpH/ZfiqC0jXfMNnaSRS+UNWLNc3Uw4zaSRxnuJ JV63434uK4q1qd4dVT09U/L++v0K8Cl0NFmHEOstKPfNt6kSN81B6gYqjv8AFOuf9Sfq/wDyN0j/ ALL8VYiiebxJcsfKWpUlubiZf3+lfZmneRa/6d14sK4qup5u/wCpS1L/AJH6V/2XYq6nm7/qUtS/ 5H6V/wBl2Kup5u/6lLUv+R+lf9l2Kup5u/6lLUv+R+lf9l2KpG3kmWW7vru7/L+5vbi/mE88l1+h ZiGWFYQqlruvEIvQ+J8cVX2/ktLYSi3/AC1aETgLP6cehrzUNzAel2OQ5fFv3xVf5b8s675ftLi2 sfKWqFLm4kupS02jL+8koDQR3ca7BQOlT1YliSVU2p5u/wCpS1L/AJH6V/2XYq6nm7/qUtS/5H6V /wBl2Kup5u/6lLUv+R+lf9l2Kup5u/6lLUv+R+lf9l2Kp7+X1hr1nba9cX2mvp89/qQuLW1uZYCx iWxtYOTNbPcovxwvQVrtirKrKGSGDjJTmzySMFJIBkkZ6AkCtOVOmKq+KuxV2KuxV//Z uuid:40133E7013D0DC11A72BA736C17DCD1C uuid:45133E7013D0DC11A72BA736C17DCD1C uuid:3F133E7013D0DC11A72BA736C17DCD1C uuid:9C0ECDE40DD0DC11A72BA736C17DCD1C endstream endobj 85 0 obj <>stream h,j0 _Eر;X۹J[K=(qp4~r?%ρJCQI>ěg|o^ɢ e(. *bݳ &>ヵ1`]C S1kȅдZ㉧)2)B0"V & 4_][WԄŊpږqqR6xhYا#Lχr^9{t7JvVUt endstream endobj 86 0 obj <> endobj 87 0 obj <>stream hZvF+2!~N猕3gfagAITgWުAP$df1ljDnU.ŏ&y ^\$IڲM^%6M"yGqlf:/Clor^7달.raV.J'r fh xd2 IcT7XBjwS.V+ 8wnuɣh~B؏{./t&Et{s6p@J|mrS)#9] ѽ~uсR'-*O%; $u8⪠:>W7mt"i{@QD@]Cf/N*.&_ҨE"} %^қ_lʂN[7 x=Aw-_AoV6=B3굶&KƓZP]wPwWב]< Om׹|. A3tGi~SDJq|Y'8ńu;vDMwUG8} N;@ӷ,f籏11eT7\o3t{(pFދ'܄3'e Ku$L DlN.r #@z HsT OVVz d;Xt)\󺼵;$9 vI9K ~2?2 i) cגwv^t68zB,3Md,`oy^l^Rᡌ4ACu'9 1&sr𖣬 a~ݹ /W7֕HApϡ mDӛ!qA%DScY{/+IoưmܕLzKn΋Kt JOw"wuo]W{+㥥Ej[ <\RC8>wN긋-4mvJLжfq`EJ\wJg| ~כnab9B(jH_[7ZZ}7~\(Xc.".}K.@&3V?H+_Cmk}<&k/he7RcV,TlA+ҁCIFEƿL7xD!&ZODzx 5#Y2U$ºTIx#(.rw%%2N㰁ocF]N+ gљ 8E-de%R̜G *8|^ۅc$s9AAkl J_-UnQ蹞Aڡ0X*㫊儯$7r5*wAM6lEn1;&(ԡ1X)&.S ! n`+y[塝1,ʤ81QB<3?߳5M ߔS ~PX/hD7Z^s-.E E[ өť#rNg |f$pxu+fN5וs4xqZ~C`6Gi*`¼5J\s=o6Z uȒU"G9z3E]bJY~ye?[2uW>stream application/postscript Adobe Illustrator CS2 2008-01-30T20:01:07-05:00 2008-01-30T20:03:11-05:00 2008-01-30T20:03:11-05:00 256 72 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgASAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq8V/wCchtB1XVNQ0NrHTJNQMem61FE0enT6gY7ucWYthFJDtZTsUb0rmT4YyCSD iqXa9rH5sXd9rmmW99qENv5W1TTA76ZFHNdT297eJdUPpwzvILSyYK4C/vP21ccgVUHZ+a/+chms Ib69ivI+coQ2MNhzuDcLGhlj+LT0SO3DycU5/C3F/wDSwArMq+h8VdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVSnzJ5ls9AgsZ7uCeaO/v7TTUNuqt6ct7MIInl5MnGP1HUMRU79DiqbYq7FX Yqkd55stbPzXp/luWzuvX1KKSW2vlWM2xMSszxk+p6vJVWpIj4DkoLcmAKqeYq7FXYqkHk/znp3m mDUpLO3ntm0q9k067iufR5CeOOORh+5kmXYTAMpYMrVVlVgRiqf4q7FUk86eb9H8n+WL/wAx6uX+ oaegeVYgGlcswREjVigLMzACpAxVOY5BJGsi9HAYV60IriqnBZWdvJPLbwRwyXUnrXTxoqtLIEWP nIQPibgirU9gB2xVWxVjd356061892XkySzuzfX1ob2K/CRiyCgy/umlaRXMpEDHgqHbfpWirJMV dirsVY35D8/aJ530mfVdGEn1OG4a2DyNA3MqiSBx6EswUFZB8L8XH7SjFWSYq7FUs8z69H5f0C+1 uW1mvINPia4uIbdoFk9KP4pHBuJIIqIlWNXGw2qdsVRWl3w1DTLS/EMluLuGOcW84VZYxKgfhIFL qHWtGoxFe+KonFXYqxu58/aPb+fbXyS8NwdVu7MX8cwEfoCMmYUNZBLX/RmqwjKCqgsCygqskxV2 KuxV2KsOH5yflUQCPNemEHcEXMf9cVQmqfmZ+TeqQRQX/mXTJoobi3u41+tBaT2kyzwvVWU/BLGr U6Gm+2Kov/lcf5V/9TVpv/SQn9cVd/yuP8q/+pq03/pIT+uKu/5XH+Vf/U1ab/0kJ/XFUom88fkj N5ng8zv5nsxrNvbm0jmTUpUiMBLMUe3SVYJBycn40O9D1VaKpv8A8rj/ACr/AOpq03/pIT+uKqkf 5t/llKCY/M2nuB1Kzqf1Yqv/AOVq/lx/1Mdj/wAjlxVKPLnmv8m/LkFzBpGt2cEd3N9YuOd3JOzS CNIV+Od5GCrFEiKgPFVAAAGKpv8A8rV/Lj/qY7H/AJHLiqz/AJW3+WX/AFM2n/8AI9cVS3zF53/J XzJpM+ka7rGlahp1ypWW3nlRhuCAymvJHWvwupDKdwQcVRtp+aH5U2drDaWnmHTILW3jWK3gjlRU SNAFRFUbAKBQDFVRvze/LBBVvNGnKOlTOg/jiqz/AJXH+Vf/AFNWm/8ASQn9cVSqfz3+SM/mG38w zeZLB9VtY/St5Dfv6Siki8vq4k9D1OM8i+pw58WIrTFU1/5XH+Vf/U1ab/0kJ/XFXf8AK4/yr/6m rTf+khP64q7/AJXH+Vf/AFNWm/8ASQn9cVSjy152/Izy1az2uieYNNtYLiX15UN4Zfj4LGADK7lU VI1VUWiqBRQBiqb/APK4/wAq/wDqatN/6SE/rirv+Vx/lX/1NWm/9JCf1xVBa3+ZH5Ma5pVzpOqe ZNNuNPvE9O5g+thA6VBKlkZWoabiu42O2Ko3/lcf5V/9TVpv/SQn9cVd/wArj/Kv/qatN/6SE/ri rv8Alcf5V/8AU1ab/wBJCf1xVJ5vOn5FTeZ4fNEuv6a2uW8It4rr66QojUSBaxB/SLKLiQK5TkAz AGhxVOP+Vx/lX/1NWm/9JCf1xVOvL3m7yv5jSeTQdUttTS2KrcG2kWTgXBKhuJ2rTbFU3xV2KvDv y8/5QDyz/wBsmx/6hkxVkGKpHq/nXy3o96LLULl4bg+nsIJ5FHqiQpV442QfDBIxqdgpJoMVQUX5 neSZRaelfSP9fVHtAtrdEyCWZ4IwAIq1eSJuKncgFvs74qoy/mx5DVCyai0pMcMsYjtrp+YuQPRV CsTcnev2B8WzVHwtRVkWi6kNT0aw1IR+kL63iufSry4esgfjyoK05UrTFUbirJfI39/qH+rB+uXF Vnnf8wovK2saBpz2L3Q1qcxyTr6oWCJZYYmkPpxTAnlcrRXKA7gNy4qyqhB+dH5a3C27was0sd0s bwSJaXjIfVlSFUZhDRX5zJyRqMoPIgLvirNsVQuk/wDHKsv+MEX/ABAYqxS//NzyhY3zJczvHp0T XMFzqLw3Colza3NvamIL6VXQyXQHrKSgod+tFUz0H8wfKevao+l6VePPexwvctG1tcxL6Uc5tmcS Sxoh/eqVFG+KlRUb4qo+f/8AePTP+Y3/ALFp8VYtirsVdirsVdirTsqIzsaKoJJ9hirEZPzZ8iRr Ez30wEyGSMfUr2pVQGJp6NRRGD0P7JDfZIOKq5/MzyUtzFam/cXM4QxwfVrrmTI7RKpX0qhvVQx8 TuHotORAxVlGKuxV2KuxV2KuxVU/Kr/lM/Ov/bs/5MSYq9NxV2KvnryF5p8sQeRfLkM2r2UU0Wl2 SSRvcRKystugKsC1QQcVT3/F/lP/AKvdh/0lQ/8ANWKpHrlv+VWuzLNq15p11IskEysb1V+O29T0 jRJVFF9d9uhrvXbFUBa+W/yXtdRttSiuLE39pxMFzJqTyuCkvrqSZJ25H1N6t8um2KrJ/Kv5JTSx ytLp6ywo0cMkeotEyK1w12eDJOpU+tIzVG4+z9nbFWUWXmPyVZWcFla6xYR21tGkMEf1uI8Y41Cq KlyTQDviqt/i/wAp/wDV7sP+kqH/AJqxVk/kbzZ5WMt+w1mx4lYQD9ZhpUGSv7Xviqba6fy118wn V73T7v0FZYg12igK0kcrCiyLWr26Hfw8CcVYV/yrT8qjq7O+tWv+HvqUtmNHTULhHZ53jeSSS5F5 yeojIPwc2DEM7KFUKvSx5s8qAUGs2IA6D6zD/wA1YqgNL86+TV0y0Vte05WWGMMpu4AQQg2Px4qx y+0H8j79JUu76wlWaee6YHVXHGW6kSWf06XA9NHeIVRKL1FKM1VUTpVn+Tuk6uur2OqWMd+nrcZG 1VpVBuHLyt6ck7x8mLU5cahaKPhAGKrfPfnLyhJZ6d6euae/G85NxuoDQfV5hU0bxIxVi/8Ai/yn /wBXuw/6Sof+asVd/i/yn/1e7D/pKh/5qxV3+L/Kf/V7sP8ApKh/5qxV3+L/ACn/ANXuw/6Sof8A mrFXf4v8p/8AV7sP+kqH/mrFWn82+UXRkbWrAqwII+tQ9D/ssVYnc6H+TsXrXizWk0wtxD6Eeouf USKAwIgiE/Av6TFFPHlv1xVE3vlz8nxqstxPc2QvY5XLuNRdCJTIzs/ETABxI3IGlQQpG6rRVkn+ L/Kf/V7sP+kqH/mrFXf4v8p/9Xuw/wCkqH/mrFXf4v8AKf8A1e7D/pKh/wCasVd/i/yn/wBXuw/6 Sof+asVd/i/yn/1e7D/pKh/5qxV3+L/Kf/V7sP8ApKh/5qxVNPyevrK+82edLiyuIrqAnTAJYXWR CRBJUclJGKvVMVdiqVf4T8q/9Wax/wCkaH/mnFXf4T8q/wDVmsf+kaH/AJpxV3+E/Kv/AFZrH/pG h/5pxV3+E/Kv/Vmsf+kaH/mnFXf4T8q/9Wax/wCkaH/mnFXf4T8q/wDVmsf+kaH/AJpxV3+E/Kv/ AFZrH/pGh/5pxV3+E/Kv/Vmsf+kaH/mnFXf4T8q/9Wax/wCkaH/mnFXf4T8q/wDVmsf+kaH/AJpx V3+E/Kv/AFZrH/pGh/5pxV3+E/Kv/Vmsf+kaH/mnFXf4T8q/9Wax/wCkaH/mnFXf4T8q/wDVmsf+ kaH/AJpxV3+E/Kv/AFZrH/pGh/5pxV3+E/Kv/Vmsf+kaH/mnFXf4T8q/9Wax/wCkaH/mnFXf4T8q /wDVmsf+kaH/AJpxV3+E/Kv/AFZrH/pGh/5pxV3+E/Kv/Vmsf+kaH/mnFXf4T8q/9Wax/wCkaH/m nFUp82+V/LUXlTWpYtJso5Y7C5aORbeJWVlhYgghagg4qm7eVfK7sWbR7JmY1ZjbREknufhxVr/C flX/AKs1j/0jQ/8ANOKu/wAJ+Vf+rNY/9I0P/NOKu/wn5V/6s1j/ANI0P/NOKu/wn5V/6s1j/wBI 0P8AzTirv8J+Vf8AqzWP/SND/wA04q7/AAn5V/6s1j/0jQ/804qjLHTNNsEZLC0htEc1dYI0jDEb VIQCuKonFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUn85f8ohrn/b Puv+TDYqnGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5H5V/wCchtM8 wL5NRdJe2ufNM95BdQtPUWAtI2kV3Yxr6nrIFZNl2qe2Ksps/wA4vy7vfq62erCSa7YpZxNBdRtK 1Eb4VaLlQJNHIWpQRsJPsENiqH0z86vy/u10+KXUwl5fLbALFBevbCW6jgkVVuXt4UK/6ZCOThae onIKWAxVXu/zl/Le19X1tX3hZ0lCW11IVMTXSyEhIm+FP0dcFm6AIWJoQSqj3/MbycnlkeZmvm/Q 5nFp6ot7ky/WDN9X9E24j+sCT1vg48K1xVBXH5wflzAAX1gNVIpEEUFzKXWdbR4igjjblzXUranH +f2aiqXXv54+S41spbB57+GbUE0+/C2t5HPbCS3uphL9XaD1paPYSRMqL8LBgSCjDFUe35yflwBy XVjKr8BbvDa3cy3DSSRwhLZo4mFw6yTxo6xcipYBgMVVfOP5p+VPK1tdfXZpJNRgsJNRi05IZ/Uk RIpZURmEZSJ5Ft5CBIQaI7UojEKqd/568rzaNpmn+Ypm026802KlbVY7pgi3Rit25SvBH6QEt1HG GnSP4mGwO2KrZfzm/LeK2a5fVmEKuU5C1uySoikn9VQISWg9K3kf1lHp0Vjy2xVXvfzY8hWMl9He ajJbtpsyW936lpdqA8kckyshMNJY/RgeUyx8kVBzLBd8Van/ADa8gwGT1dRkVIrmezeX6pdmMSWj +ncsJBDwMUL7SSg+mtRVhUYqjdf/ADD8neX72Sy1jURa3EVs95KDHM6rCkcsx5OiMgdo7aVkjrzc I3EGhxVAH83fIYE1bu6DW7xRSxnTtR5+pPCLiONU+r8mcwH1eKgkJViKAnFUXpf5l+RdURpLDV4p olt7i9eXjIsa21mYxNKzsqqqL6yEEn4garUb4qlC/nR5PfWkso5X+pizmubi5khuYp45o57SGG3+ pSQrcO9x+kI2jovxbcQ3IYq2fzz/ACvHMnV5AsUhhmkNlfcI5VjEzxyP6HFHjjJeRWIKKGLUCtRV G335teQLGW6iudTZXs39KQJa3UgdxcLaMsBSJhcFLh1if0eXFjRqHFUDa/nh+XlxfXNoLq5UwNF6 U5s7pop4pbaO79eFo43/AHKRTIXkYKFBUn4WRmVZ7irsVdirsVdirsVdirsVdirsVdirsVeY2H/O PHkKxRVt5b9GVLdPVWdUf/RrCbTlYMkalWaG5LMyUJdVO1KFV2i/84++UNIuoLq11DUhNbXL3duF e1hjSWeKKC5KxW9vDHS5hgWOT4elePEmuKqlp+QXku1t7KCO5vylg8Lw8pYqkwDTQvKkQ6/oSCv+ s/ivFVbJ/wA4/wDkyS41GZrzUaaj9aDRerDxiW9iv4pVi/c8qf7l52HMseXHsKFVPv8AlWHl3/Dv 6A9W5+pfpX9Nc+aep9Z+u/X+NeFPT9XalK8e9d8VSGL/AJx/8mRXVrOt5qJFnBYwRQmWHh/uP+oi OQ/ueXN10m3V/i40B4hSa4qrN+RnlhZHmtdR1KzuXuvrqzxSW5ZJeeoP8IlgkXj/ALmJhup2C+B5 KobQv+cdfy70O7iudOSeJree2uLYUtuUbWt1FdhfWEAnkV5bdeQkkagqE44qnXm/8pPLHmrU7jUN Rlu43u7RrO4hgkRY2/0e6to5qMjt6kUWoThKHj8XxK1BRVFeYPy20DXbqyubyW5R7C3jtYRE6AGO K9tL9eXJG39XT4wafslu9CFWPJ/zj/5NFq9s15qLoYJLOEtLBWK0eyurBLdKQj4IotQlKFqtypyZ gKYqqaj+RHlTU7K6stSvr68trnUW1VEnFlJ6MzxNA6JytjyQwuI19XmyBV4MrLXFUVqf5LeVdQsl s2ub2CH19Sml9KSKssWsTi4vLV+cT/uXZVA40cAfa6nFVTzv+TnljzlrA1XVbm8jnFpLYhIHh4CO aC4t2ZDLFK8ZKXbVCMFYqhdW4jFV2uflB5Z1i01C1uZ7tYtTvLa/uQrQupe0s0sUQxzRSxPG0UYJ V1b4viWhC0VS/wAr/ktomjSeZbSSsuj61ptnokMfqEzfVLaxW0meQhI0SWeg58BQ8VbrsFUKn/OO X5fJYNafv6PHIjyLHYxhmee1nEjQR2yWzFGsIhxaIqw5c1bliqq//OPfkH9ESaVCbu1s5HeVkt2g j+OTSzpTsAIeNXiYyNtvIeXT4cVREX5D+Q4rzUbyOOVLnUb2C/eZRbrJG0F59f8ASSUQiVo5J6Fx IzGgVQQFWiqHf/nH/wAotBHbfpDUhaxpZoIeVq29jaQ2SSK7W7SRyvDax1kjZWUisZTk1VX/2Q== uuid:81CE9476D0FE11DC88C2B553B10A7876 uuid:81CE9478D0FE11DC88C2B553B10A7876 uuid:4796EAF480CEDC11945D974E704A7427 uuid:4296EAF480CEDC11945D974E704A7427 endstream endobj 89 0 obj <>stream h,Ok0 ſa8 νPBYAوCA'=8(^B[X~9|`QR.~^hUT UhMEɩ3sxqY<l[?au8l\ږpQ#j$ 3a*j0<$giHYV$3u4,uDcy سqW6MzR5'u: AeU endstream endobj 90 0 obj <> endobj 91 0 obj <>stream hޤYn8}W#H+Md<" /b!ն}Zw7n*R}c` -JdXs◿_啟lqQM 2R!Lfbrwջ!<6+szQ4zQ`oTi\OKjM)(u6@ \WfrGv|fʫIY$wUo/ܛ6M˼0/%t7tM M2.6>Zl1Nqlh@6?E`P.¢Rm3\|s7ӰVtbQ6u13PY^6]K?>SLF˙fХTrݎ\tpڥN8"^mֲb`qQ@# z3{ MFpM7Ed[>ZA}dׂ֝zq p`Dsj09ۤL>&$7bHxM;]-plT%[{˰̚BA kEypVm]+{U #x~ܽ˒^5.K-ɟoCӭp?y6Z5}%iG9B?zɿ=0tjԫoBE/?ŧ<]^_Π~uO(7gЦp\7 -˝3 PȖĴRЇ &U$3 B}y/vE%xӭD*5| oʱh 9 @.\q7ʑT<'JS +gxߊB)n 8}`g504)6{r-b@s B3) `H`dZi( m]4mNq|+0.M5KA>IK ͚ r[u5mArfʛQ~dŶ-%I44 9#Z  >7'L^Q J!U1uwk?6J ! $!Ahr8֘Ty}=k + XDǎEp885E! =ΑL⡖ .Y?[۝~L/5p_Jȟ2p*+E>yN pɧWYnoxW_Kx){gt6*bP9ܔzJXOL!@K@"!3!R#GL>mpS(Bp 4+a Ȁe6z eV8S'CȦ+FJh}+"qYp$|r,dY5<~&oD |t L P! G)dD O7b}zLeeOe%e?~tUaكP$A2pÅzPO8u+'݊a&6ceDC6/jDkK@ad)j)(iu1T-ZPRL2 0TwX]4znEh2[i32j{.@ 2Y0J( i|İciekN%(73XP ᇕ = ɗlS6f%u&)2yQ<_F 4.^d%a~Hdz3 iR߃M^*-<{,8X+k,FJt=uҮIa1eiŒqDV:D5;sBWHؙf-QntQ]" _3ha8]';>)kf8bGPL9g^q0Pƞ};"i5m"=֬cJEEl=9KTWR|Ƭp%֨;n8VzgɎ͑,߫ =܍@JUK_4VJŠ~bFu2jϼ͘puVm>MP#?(, Z2ċf+9drgp>颔G#QQp.-w줓;wDAXWę0t?u9؍*TIMn[ηRTKB|Bz?+SŪ Q*nlJH.v t›}I*kS/P<г&6[); ,blA'$nG@,zLBA5HV1cRLVaE 'Ϫxw}oPPLϙF+RzN 2#F,8MKIȃœ!C?USiI}$*d ;n;6g!MW۾ɅĎlԌݮy q^ a2_:BİqqU0LR[1qBM2UE@Y?T|C:H\D!J )J6c"..c*LlCWL9uX|ob+Sbr$]8O>stream hެAK$1J׃IRJ@/{gn\fdw/ؗWUׯSQ!bL LiSISNM#$fS4RSTŅ:-wz|?<>cRQ\9d]v~yߴr?aم.EOZ \d" e4`39dH9wphϤ'-਋=+)}JZ> endobj 94 0 obj <>stream hXKHv`S:"oJxIY>̒Crj8\k NJs%ģ ~fܼ]|sf(蟌lțEmLMXlr?(?JN<|e;p^U?wUK]*U}Ow:s+utZZuyY/" ^e_ &.W҂_:/˥{C\|U}m-u&7IۼTBl?鬤#}K6Ͷ[NECFg6* 9<{"C4LG4ڱO*nEG.L[3uwOؿ¾&Hӥ:̥mi-ɭwvS˵PbqwKZ]ӗQ^h)'\Vke2`3ފxQBQ澌Q0Fyh%=E#sABL[CFn񓂩FO[KN>tN23jB[tIKuӓF t8mw?ٓM^Ż=IhZc+cC`մsGNP(J3 c (`rH=91nX6Kr,GVW+g[8ڈ҆d|V-rVdxhLZ!{VZ}NȲnH6QԁL@ʎ6f`prF 1[zW(y С;yh #tΖ6c{ *YuXZ_1W3h4@)i1+ >l-SRwi'՗1$yA3[cw7[?b|:w_iҀiK\Q"Ϩ-+Ml 0hOzPFf%9S`׊,%"1\d&bH5 < ^f {83wDE3%Q;!dٻ@@ugnRBfp3 HnEY[jRzH Dhi䑿6GH(t3;$)\ lȝ=i i]23mxjWԕ,9f{Y> }vRj`{i_ytEd:g1x&Q2װFBꈢۨIҕzv$h08E& $TXZ''' (ȱ%-ڂxV]; pJ{:Gn4ڒNJ# ^+ VC?vӆՎwuS9T3lL1{Ȱ{O .1<% $JX}Uj2bTYrXc#Sx]+ܳ5-u.G9(wV+~ъK+3mUL1Z*-X_/Jd 13zoD~ZYK!4MxQ>m*xI4U9Y'Y@8vZ^6fjG3KS>Ȍ%:z;" b 5Z woL06za*E.oZh:I1O2Jt,~.7ip9e}B;m{G+ "kS1o@'I֖/vJP,skЇblUܒ%S>;e_"[l{o]&Ǯ=ʆM JpT.2<(-Ш8,2SRƛP7&"R nj.Oky(y +oSe+Fs[%r@kG}K_Sh}={V?L?>stream hެMK@`vwf J@Ci{+=h B"u͇Biޙ3w_B&2B ;l s`)W N4oHs GAz iOie>e.#o̥Ǵ7L\(}H{n^.iSYu 65R}aTb% b< hE58 F?wvSѿQ F4@`c`0ڹE1w0yЃ H1oFt\&s00ɷڦT^m y$ٲ)KUMiE2$CU18{)';ۡyN8 ֧^t(O&;\ endstream endobj 96 0 obj <> endobj 97 0 obj <>stream hYn#}W#;@Ӽ7_;$+-`fȖlk#;}哒_ɩ"%fL .VOo F+_jt;her72*h-[R5Z Tu7JYYٚR`sLur:)a/*o}r7r >FK525yA8uö֌IPoM4F@dqdLLz@_)ُͤHHq3-1%kc.c8-/wObSCxfipVx!~d3zMR\A.U]^vlPGdžy͚ 앗_Zc#6g+or2g#-4dl6TPm9|{q<atplƀ} WsU1p/ &O(w"n\(TL2ZsJ 7T ĭeF\v M$ J岸4MA(UL^ ϢTq\m _%7ʺ *ruQvt-2~TI N. mTuJ%F9*1cd^N:NQ_ D-]P':\+oR*8ԛrYL⺔ȸ^ Fug#ڰEĎ24f_QtLI8P}:S){N^釳t۶ t;< +p>l]~ȓLș3p\`,bbܹ6LX|vJ~?d`%z2;{:o \@a}D2xJ4 =ՁemF#ݰ[~\NZM!ɉRw׎-DzE:q [}K  H'+ƓlyG/`XR$]7Wh:ּukk㾬GY7W\Jgv$@9+s(d"(vi*MbJC)W]a}9b9j?~Ցq9m-_{Q8ʫb.7rspN##uKDE9x1-@z&xgN_oGɱMFġjV c 2̙u5Rޔ.ޅүR{؋Olę5E# JWD/E1&~gM6b s qBMT˓#Ge˚Dx1&Z6üW1|}*p`%k"e񘁔5x>;ܒNvz/2Z0q,.ubSC(KbLj&Q*PPz/Χsb#qWL\¹Q!P֑KKEGmHk)]1 YԑnG }R`D,2 qALH#ҕb旨Jtd$aƉg7L234̒𘞎jf5]vej/&3ՙ#8l2uc-1,.(!hTy;Zv>dRYֲ:r!%Y3]`6v/֓iNS~vsumkq*Vx(0PHCÅ1lP2[kb=IK%n~ :ċHF䚅#ͅ$x#z^ ;MM(By|<uBc/b/n3mp78^|=x9CS"wt ̈́R֓Cڢ9huΦIߵBmk naXJYQ>r L`M٭Wa0W&*Mu +#G7 endstream endobj 98 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-30T19:48:11-05:00 2008-03-04T09:29:56-05:00 2008-03-04T09:29:56-05:00 256 244 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA9AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq8D806N598r+d/Onn7T7CK3tLaBry2vm+qhr2NRpPOyd/UlnYSR2NzHGpgT02bk jO0gCqoiax/5yU07U44LK4n1OCafne6hO+lCHibGyXlHAyo4VbhboCNPT+LgxYjlzVeo/l2fNx8n 2H+L1kXzCPWF56xtmkIE7iJm+pgW4Ji4miVp0JJqcVZHirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdiqQzTa+vnu0hR5G8vy6XcvPGIl9NLyK4txETNTlyeKWSicqfCTTFU+xV2KsV8y3 +vQedPKVrYS3SaZcyXv6YjiszPbPElsfSE1wscht3E7IY6uisA9SdgVWVYq7FWG+d9S8z2nmPyrD oz3Ztrq8MeqQQWnr27W3KMO9xP6Mvo8FJ4D1IuVWPJinpsqzLFXYqxD8w9R872c3lpfLFpJPBPrN pHr80axSGPTmfhNVJDyoxcEugJVQTt1xVl+KuxViP5g6h5osZfLL6ElzLDNrVrb6xDaRiR2spQ6u XZre6WOJG4tIx9P4QQJEJBxVl2KuxVh/5i6p5r0+Tyx/h+G5ljutctLfWPqsKzsti6yeoZOUcoji 5Becnw0H7akjFWYYq7FWOed28wC20lNDuLm3uptVso7h7aKKZDaGWt2J/VinCJ9XV6OOJ58Pi3oV WR4q7FWF/mxqXnLTvLltP5TSd9Ra+t45hbW4un9BuXOqFJKLUKC1P9kg+NVWaYq7FXYq7FXYq7FX Yq8282fnx5V8sa9faNf2N5JPp7cbiSKbTV+EWovGkWGa8hujGsRpz9Khf4Fq1AVXoEF1NNczIIlE ETBDIWIckor/AGCv+X/NirC/Kz/mLr/l7T9a/wAQWNr+kIVnFuNMZxGH348jdLyp40xVNP0N+Yv/ AFM9l/3Cj/2V4q79DfmL/wBTPZf9wo/9leKtJpH5isK/4msupH/HKPY0/wCWvFW/0N+Yv/Uz2X/c KP8A2V4ql11c+ZLSee3uvPWj289rGJrmGWxRHjjZgqvIrXoKqWdQCe5GKoG+8z3enyrDqP5k+XrK djKEiuLeCJj6ErwSUV75T8EsTo3gykHcHFUxsn81X8vo2PnfSLqWhb04LBZGoEikJot6TQJcxN8n U/tCqqO/Q35i/wDUz2X/AHCj/wBleKtJpH5isK/4msupH/HKPY0/5a8Vb/Q35i/9TPZf9wo/9leK u/Q35i/9TPZf9wo/9leKoTS7T8xr22eY+ZLFCk9xBQaUx2t53hB/3r/a9OuKov8AQ35i/wDUz2X/ AHCj/wBleKu/Q35i/wDUz2X/AHCj/wBleKtJpH5isK/4msupH/HKPY0/5a8Vb/Q35i/9TPZf9wo/ 9leKqV3Y+erO1mu7vzbp1ta26NLPcS6ZwjjjQcmd3a8CqqgVJOKpfa6lr11qH6Ot/P2iTX5lkgW0 jso3mMsCh5kEYveXKMGrilR3xVNf0N+Yv/Uz2X/cKP8A2V4q79DfmL/1M9l/3Cj/ANleKtLpH5ik sP8AE1l8Jp/xyj4A/wDLX74q3+hvzF/6mey/7hR/7K8Vd+hvzF/6mey/7hR/7K8VVvJ1/rk82vWO s3UN5caTqC2kVzBAbZWjextboVjMk24a5YV5YqyPFXYq7FXYq7FXjXlC2/MDX/PWj+cr6PXtK0i/ hiup9Hmltzp0QfTuHp8I9U58TO3qVew5141CEM2KvV7O4g+v30HqL6xmVhFyHKnoRb8euKpJ+Vn/ AJLry9/zBRfqxVlOKuxVbF9k/wCs3/EjiqT+c9B1DX/LF/o+natPod7doqQ6ra8vWgIdWLJweJqk KV2YdcVeb61/zj1NrF5c3N/5rvLkzR/VUE8bTstmj+vFbtJLM7sEuooJuVatwIP2yQqtj/5x4jfS 4NPm8yXU0Vub/jKYvSlL39skMp528kJp66PMR+1zKtXclVl/kr8uG8sau+orqK3Xq6fbabLH9WWM lLKNFgcOHZq8jOX/AJg6Db0/iVZriq2L7J/1m/4kcVXYq7FUq8tf8c6b/mO1D/qOmxVNcVdiq2L7 J/1m/wCJHFV2Kpf5i0hNZ0DUtId/SXULaa29Urz4GVCgfjUV41r1xViGlflpqNt5tbXrrWUuV+um 6e1W1eP4I7eWC2jRvrDonBblvUYR/vCOVFapKrP8Vdiq1PtSf63/ABqMVXYq7FWN+VP+O95z/wC2 xD/3R9PxVkmKuxV2KuxV2KuxVCWxne9u2aZjHFII0honEAxI3Xjy6sf2sVYZ+Xvk/wAv3HknRp5Y JDJJbIzFbi4UVPgqyAD6BirIf8EeW/8AfEv/AElXP/VTFXf4I8t/74l/6Srn/qpiqyLyR5b4n9xL 9pv+Pq5/mP8AxZiqy88qeT7G0mvL2traW6NLcXM15cRxxxoKs7u0oVVUbknFWIa75m/KnSImnHra lbC2N4LjTr1rlDGtylqQCtyNxLLTfbZt6imKoC386fl3cX1zp9homr391Z3F3a3SQXAHpz2v1p/T YS3sZrKli7x0FKFeXGuKsh8lt5K822cl3Y6bf2sSR20oN1cSjkt3AtxHxMVxMNkcV38CKqVYqsj/ AMEeW/8AfEv/AElXP/VTFVkXkjy3xP7iX7Tf8fVz/Mf+LMVX/wCCPLf++Jf+kq5/6qYq7/BHlv8A 3xL/ANJVz/1UxVLPLvkvy6+nyloJai9vx/vTcjZb2YDpJ4DFUz/wR5b/AN8S/wDSVc/9VMVd/gjy 3/viX/pKuf8AqpiqyLyR5b4n9xL9pv8Aj6uf5j/xZiq//BHlv/fEv/SVc/8AVTFXf4I8t/74l/6S rn/qpirHPKQ8jeZbvWrexs7uN9GvZLK5MtzKQZIneJipiuJePxQseEnFwOJKgMKqsj/wR5b/AN8S /wDSVc/9VMVd/gjy3/viX/pKuf8AqpiqxPJHlvlJ+4l+1/y1XP8AKP8AizFV/wDgjy3/AL4l/wCk q5/6qYq7/BHlv/fEv/SVc/8AVTFUv8mabb2d/wCb7OzLwRLrERVgxkcV0qwY/FL6lfpxVkmnySvb EyOXdZJY+ZABIjlZBXiAOi+GKonFXYq7FXYq7FULZf703/8AxnX/AJMRYqwr8vfOGg2/knRoJZJx JHbIrhbW5cVFejLGVP0HFWRf438u/wC/bj/pDu/+qWKu/wAb+Xf9+3H/AEh3f/VLFVsfnby6FIMt x1Y/7x3fck/76xVC6v5h8maxpV3pWpCe40+/he3u4Da3qh4pVKuvJY1YVB7HFWMN5W/Jdo4Yzptx 6UED2scfp6rw9F5GlKsvR/3khdeVSrUIoQKKphpnl38sw95qFhpl0s2pTzzXV3bw6mrPM6z28jh0 AKuEuJEqpBXtQqKKpp5Y0/yf5XtprXQ7G/tYLho3lja31OYFooY7dCPWWTjSGFE27KMVTr/ENh/v q8/6Qbz/AKo4qo23mbS5Yy0aXbqHkUlbK8I5I7Kw2i6hgQcVVv8AENh/vq8/6Qbz/qjirv8AENh/ vq8/6Qbz/qjiqV+XNfsV0+YGK8/3tvztZXh63sx7RYqmn+IbD/fV5/0g3n/VHFXf4hsP99Xn/SDe f9UcVWReYbDif3V59pv+PG8/mP8AxViq/wDxDYf76vP+kG8/6o4q7/ENh/vq8/6Qbz/qjiqT6FD5 V0W51KfTbK+hl1K4a5vGa21GXlJIxkbj6qPwXnK5CJRRU0GKpx/iGw/31ef9IN5/1RxV3+IbD/fV 5/0g3n/VHFVieYbDlJ+6vPtf8sN5/KP+KsVX/wCIbD/fV5/0g3n/AFRxV3+IbD/fV5/0g3n/AFRx VKvJtzHc6t5umjDqjavHQSxvE22k2A3SQKw+kYqlP5nC6k/LPWLO3e3i/SE7WFxNeXMdlbJb3d96 E5luJPsAxOyjirNyICqTirCfJ+l/nsnlezSPUStvauttpaWcul3FtPptnpL/AFW4S5khlkdb69WL kzUcI1QE3IVTPyJqn5xp5r0DRfNl3yE1ld3+qJJHYrNwtLieCMMtn6safWFvbR/hk2MLAVq+KvYM VdirsVQtl/vTf/8AGdf+TEWKvJfI3/KI6V/xgX+OKpjq+qW2laVd6ndBjbWUL3E3ChbhGpZqVIHQ eOKvOdR/Pzy9AdPkhsrz6vderO7vHCS9pFE5LwhZqlvVULuOgJNBQlVRsPz60wQSXupadepZXCzX OnejBESLWLnxaR/rL8mkMZ6IoU9fh+Mqsv8AKHneHzNqWqxWsDRWenelGpl9P1TKZJkl5COSXiB6 I4huLdyKEYqyjFWVeR/+Uci/5iLz/qLlxVL/ADZ5u1HSPNPl7SrYW5g1VnE0cqsZpaT28JW3IkQA xJcNM/wP8KHYdcVZdirCbyw86XekW48ralBp00Wr30l8bhFdZYBez1iHKOalT3FD74q8z1Kz/MH1 NRh/x0lvr/rNZwc7q+W2a7uZYTCoVbVIVVBE8dIkNN6ty51VT38s017VNUsLm18yfpqy0wIurepc avEH5idozHHcrxkIEkZ+N25DrSiYq9Q8tf8AHOm/5jtQ/wCo6bFU1xV2KrYvsn/Wb/iRxVca0269 sVeT6P8Ana0GhWuoa/Al0rC7NxeaWgWFkt7u6iWeJZp3Horb2EkjkSud1oPi44qtuv8AnJHyRZR6 hNdafqkaWVtbXsh9K3YMl1FbSIiFZyC6rdKW34/C1CduSrLPy+/MTT/O1vc3mnwPFZKscts0hQuU kaSOj+k8sYbnbs3wufgKnvirLsVWp9qT/W/41GKrsVdirHfK3/Hc84f9teL/ALpFhiqX+cvKM/mr y1Dp0EvoyQazb3xb1poAY7TUhNKOUHxFjGrcK7B+J2IDBV45efl5+dHk3yJeWp1m71H91Y21haaR eapM8ZtLO5ipCkEHrW0ZkaA0SquyDnwRjwVex/l95c84aPf+YpvMGofXbbUb1rjSka7uLt4YGZzw YSrHFCAGUCOJaCm7N1xVmWKuxV2KoWy/3pv/APjOv/JiLFXmPkTy55nl8n6TJBFZNC9upjL3MqsQ a0qot3AP0nFU9/wx5t/3xYf9Jc3/AGS4q7/DHm3/AHxYf9Jc3/ZLirS+WfNhFRBYdSP96puxp/yz Yq3/AIY82/74sP8ApLm/7JcVd/hjzb/viw/6S5v+yXFU38vWvmfTdLW0e0spGWW4cuLuUD97O8lP 95u3OmKpl9Y8y/8ALBZ/9Jkv/ZLirvrHmX/lgs/+kyX/ALJcVS6xtvNUOm3FqsFrDJNNdyJcxXb8 4/rFxJKpUSWkick5/tKR7Yqkkn5cW9xd299faXFeajbzLdC7bVbyItcLuJWit4IYOVan4YwKkmnx GqqY+XfKh8uy3MukaPawS3lDcu+pXk5ajM/WaGSnxSMTTqTiqv5cn8x/o+bjY2ZH12/63co3+uzV /wCPY98VTT6x5l/5YLP/AKTJf+yXFXfWPMv/ACwWf/SZL/2S4qsiuPMnE/6BZ/ab/j8l/mP/AC64 qv8ArHmX/lgs/wDpMl/7JcVUz+nTcC4OmWBuFQxrN9ak5hGIJUN9VrQlQaYq2lx5k5Sf6BZ/a/5b Jf5R/wAuuKtR/p2OSWWPTLBJZyGmdbqQM5VQoLEWu5CgDftiqp9Y8y/8sFn/ANJkv/ZLiqxLjzJy k/0Cz+1/y2S/yj/l1xVf9Y8y/wDLBZ/9Jkv/AGS4q76x5l/5YLP/AKTJf+yXFUk8rzXq3/nGSdEg uRq8VViEl0o/3FWA2AWJ229tsVZHpvD6oCj+oGeRmYq0fxtIxccG+IUaoocVRWKuxV2KuxV2KoWy /wB6b/8A4zr/AMmIsVST8tf+UC0P/mETFWS4q7FVsX2T/rN/xI4quxV435it/wA/dc0jU7CW0g06 SS0jOn3uk3LWdws8ksDSx8jeSr8EfqLz4jdaigamKoVPKX5stE9zezalPrBm9KOWz1NobMML+9Z7 g2xuoo1ja39AovBytVBjcK64q9L/AC8sNXsfKNlBq4u11AvcSyw6hcC8uIhNcSSpC9wsk/qiJHCK 3M1UDp0CrI8VWxfZP+s3/Ejiq7FXYqlXlr/jnTf8x2of9R02KprirsVWxfZP+s3/ABI4quxV2KsI /LjTPOFlqXml/MDXBtrjU55NJE8/rg27TSsjRj1rj01MTxgKPTAAA9JSCWVZvirsVWp9qT/W/wCN Riq7FXYqx3yt/wAdzzh/214v+6RYYqo+YfMd15f8ui9s7OO+u59UisLe2mmNtGZL/UhaIzyrHcMq q03I0jPTFWOaN+fHlKa1kOtltO1GK+uNMksLSG+1JlubN4IJlZoLUD+/uo0jI2fmnR2KKqmEv54/ ldFYS6gdZZ7OIxcp4rS8lVhNFNMjp6cLc0EdnMWdKqvBgxBGKr7r85PItvepB9f9SMz39iwjt76W 4e8014Vnit4IraQzqnr1d0agpVeQDlFXW352flldRTTW2sNLFDPDbF0tLwh5LmSWKL0aQ/vVZ7WV ecfJRxNSMVZxiqFsv96b/wD4zr/yYixVin5daZeyeR9FddWu4la1QiNFtSqjwHKBm+84qyP9E3// AFerz/gLP/snxV36Jv8A/q9Xn/AWf/ZPiqyLSb/if9zV59pv2LP+Y/8ALviq/wDRN/8A9Xq8/wCA s/8AsnxV36Jv/wDq9Xn/AAFn/wBk+KoHR/R1ayF5pfmaW/s2d1W5tWsJoyVYggOkDLt88VR36Jv/ APq9Xn/AWf8A2T4q79E3/wD1erz/AICz/wCyfFVkWk3/ABP+5q8+037Fn/Mf+XfFV/6Jv/8Aq9Xn /AWf/ZPirv0Tf/8AV6vP+As/+yfFUr8uaVfHT5iNZvF/02/FAln2vZhXe3PXFU0/RN//ANXq8/4C z/7J8Vd+ib//AKvV5/wFn/2T4qsi0m/4n/c1efab9iz/AJj/AMu+Kr/0Tf8A/V6vP+As/wDsnxV3 6Jv/APq9Xn/AWf8A2T4qgdO9HUJr2Ow8zS3b2c5t7tIGsJDDMgAaOQLAeDg9VO+Ko79E3/8A1erz /gLP/snxV36Jv/8Aq9Xn/AWf/ZPiqxNJv+Un+5q8+1/JZ/yj/l3xVf8Aom//AOr1ef8AAWf/AGT4 q79E3/8A1erz/gLP/snxVKvJsMkOrebo5J3uXGrx1mlCBjXSbA7+msa7ey4qhvOcvk+38kX155wk kg0Czu/rFxcQtdJJFJFf8oJEeyIuFZJghBTp8sVYFYat/wA42W1mmo2SzNZo894L5LfWZY2aylsp J7hpuDhwJ7O05SEkO4pUszBlUd5O8l/8476l6+leWbCOT9IwC4nt0bUI+cKaekIcmVl48rPXB4Fj ITu6MVVZQ35LflwwQnTZvWimnuIroX9+LhJblIYpWS4E/rLyjtY02bZRxGxYFVd/ypj8thZCyTSD FaBo29CK5u40PpTXFwisElXkglvZm4H4Ty3FFWirNcVQtl/vTf8A/Gdf+TEWKpJ+Wv8AygWh/wDM ImKslxV2KrYvsn/Wb/iRxVdiriARQ7g9RirHvI/lm48v6VcW9zdpe3V1dS3U88ULQR8n4pxSN5bh wqrGAoMh4iirRQoCrIcVdiq2L7J/1m/4kcVXYq7FUq8tf8c6b/mO1D/qOmxVNcVdiq2L7J/1m/4k cVXYq7FWO+WfLE+laxr2oz3aXL6tcK8ccULQrDDHyMcfxSzVP7wlivFS1WCAs1VWRYq7FVqfak/1 v+NRiq7FXYqxry3NFDrHnGSV1jjXV4eTuQoFdJ08bk4qiL7y7o/mPy9NperRNcafcXDTcY5ZYGJi u/rEMiSwNHItHRWUqw+7FUrtfyh/Ly10a30a20ow6daQTW1rElzdBo47i5ivJOMvq+oGNxbxyB+X JSuxGKqvlb8t9C8teYLzVdMRYo59PsdLtbYB2aKCw9SnKaSSR5C4kVanoEXr1xVlmKuxV2KoWy/3 pv8A/jOv/JiLFWKfl15e0CbyPoss2mWkkr2qM8jwRszE9SSVqcVZH/hjy1/1abP/AKR4v+acVd/h jy1/1abP/pHi/wCacVSryza+Utd0ePU7fQ4LeOWW4jMNzawpKjwTvC6uq8gDzjPfFU1/wx5a/wCr TZ/9I8X/ADTirv8ADHlr/q02f/SPF/zTiqV+XPLfl19PlL6XZsRe34qYIjst7MAPs9gKYqmn+GPL X/Vps/8ApHi/5pxVjmva3+VmiJfrcppMt9psZlutLiNl9cVQA39zI0bVIYEDqailajFWJW/5tflT LZw3UHl15baUuJpfq2notu5a44JcerMnp8xaOwY/AFozMqmuKvQNAsvKOuaFp2tWmj2yWup20N3A ktvBzCToJFDcOa1o37LEeBIxVMP8MeWv+rTZ/wDSPF/zTiqV+XPLXlxtPmLaVZk/Xb8VNvEdhezA D7Phiq3zAnlDRDpouNChn/Sl9Fp8RhtrakckwYh5DIYwEHD9mrE0CqTiqbf4Y8tf9Wmz/wCkeL/m nFXnI0LRPrF6P0fbUF7eAfuY9gLmQAdOwxVd+gtE/wCrfbf8iY/6Yq79BaJ/1b7b/kTH/TFUNqFp 5T021e81GGws7SMgPcXCwxRqWIVQXcBRVjQYqkOt+bvyv0dpI7mTTZZ4TMs9vCbVpImgjd2WRCyl WJj9MA/tkL3xVMbbUPy+nkigEmlLdymJVtGa1Mwe4T1Ik4KW+J0FVA6jcYqm36C0T/q323/ImP8A pirv0Fon/Vvtv+RMf9MVd+gtE/6t9t/yJj/piqcfldZ2yJ5stooxDB+mUokNYqf7i7A7cONN/DFU 81/zJ/h3yfqWtPC17JYCcW1qX4tPKJmht4PUIehkconIg9a74qkOj/nh5Ev9NtLmWe4gup0thc2i Wd7c+hcXNp9dMDSwwNGWihVmkINEAq3HFUy0D82fy/197NNJ1X6y9+OVovoXEZdaXRrSSNKD/cdc Vr0K0/aXkql13+fP5UWWm2upXmtm2s715Y7aSa0vYyXhhiuGBRoQ6VhuI3TkBzDDjWuKq0X52/lr JHK/6Tmi9GZbeRJ7C/hcOxuB9iWBG4obGf1HpxT025laYqznFULZf703/wDxnX/kxFirFPy61yyi 8j6LE0d2WS1QEpZ3TrUeDLEVPzBxVkf+IbD/AH1ef9IN5/1RxV3+IbD/AH1ef9IN5/1RxVB6VqGi afaG2s7a8ih9aebh9Svm+OeZ5pDVoifid2OKoz/ENh/vq8/6Qbz/AKo4q7/ENh/vq8/6Qbz/AKo4 ql2haxbW9lLHNBeq7Xd7IB9Suz8Mt3LIh2i7qwOKpj/iGw/31ef9IN5/1RxVi2seUfy21m6u7rUt Gu7i4vpIprpzbamvOSFGjjNEVQOKORtiqhD5J/LEJLw0W8QytEXdINUR+VpC1rAwdQGDRwtxVga9 +oBxVk2l3+h6XptppljbXsVlYwx29tGbO/crFEoRAXeNnYhR1YknviqK/wAQ2H++rz/pBvP+qOKp X5c1+xXT5gYrz/e2/O1leHrezHtFiq/WT5b1kWQ1G1v5Rp91FfWoW11GICeAkxswjRPUUE14PVSa VGwxVMf8Q2H++rz/AKQbz/qjirBQbj1rtvqN9xku7qRD9Tut1kuHdT/d91IxVdyuP+WG+/6Qrr/q niruVx/yw33/AEhXX/VPFUn80eXk8x6S2lXdpfi1kmgknVbO8BdIZVkaPkioy8wvGoO1cVSN/wAn /Ibm6r5e1EC9kE9yqjVlVpRWj8VYAEciNuxp0xVfd/lnpDanpt/p+n3tjJZTW8kxWz1B2ljtAnox VNFAHpLXkrA+HLiyqswDXFT/AKFe/wDSHdf9U8Vb5XH/ACw33/SFdf8AVPFXcrj/AJYb7/pCuv8A qniqN/LmZ4E83TOnokaynw3XO2pXS7AfFzXkvt8O+KsivfLeja/oY07W7aHUNPluBdSWvJnt5GS4 +sRhwOIlQOFJVwVNNwcVSyy/KT8u7GzlsrPRY4LOa5uL17ZJJhF615avZTFU58UVraVowi0RR9kC gxVQ0j8p/LGj+Y9P1bTovSh06yvbOG3kee4lZ9QuEuJZXuZ5ZJDur0H+WxriqH1H8ivys1GxhsLv RS9nAAscK3d7GCohtrcK/pzKXUR6fbijVFUDfaqSqiNV/Jj8s9VRk1DRVnR7hbt1M9yAZknubkMe Mo/3bqE7U6fHSlAoCrNcVQtl/vTf/wDGdf8AkxFiqSflr/ygWh/8wiYqyXFXYqti+yf9Zv8AiRxV dirxvzF+YH5tahpGpwaT5XvtB1KG0jmsL2NDfK7zSwDgYprSMepHHIxKhiAQwNaAhVCprv5xPE97 dPqVleet6Mek21hFPamc397G49X6pLL6KwQRMrtIiupWrp6gcKvS/wAvLnW7ryjZXOtTXFxfzPcO ZL22+pXIia4kMCT24jgCSJDwVqIASKivUqsjxVbF9k/6zf8AEjiq7FXYqlXlr/jnTf8AMdqH/UdN iqa4q7FVsX2T/rN/xI4quxVpwxRgh4sQeLEVAPY02xVgX5fap5wu9WMOuPe8ItH0+W4F1ZrbxNfz BvX9OVYowZEEYMiVoOYoq8TVVn2KuxVan2pP9b/jUYquxV2Ksd8rf8dzzh/214v+6RYYqnGmf7zP /wAZ7j/k++KorFXYq7FXYq7FULZf703/APxnX/kxFirFPy6n18eR9FENnaPELVODvdSIxHYlRbuB 95xVkf1jzL/ywWf/AEmS/wDZLirvrHmX/lgs/wDpMl/7JcVWRXHmTif9As/tN/x+S/zH/l1xVf8A WPMv/LBZ/wDSZL/2S4q76x5l/wCWCz/6TJf+yXFVkVx5k4n/AECz+03/AB+S/wAx/wCXXFV/1jzL /wAsFn/0mS/9kuKu+seZf+WCz/6TJf8AslxVZFceZOJ/0Cz+03/H5L/Mf+XXFV/1jzL/AMsFn/0m S/8AZLirvrHmX/lgs/8ApMl/7JcVSvy5P5j/AEfNxsbMj67f9buUb/XZq/8AHscVTT6x5l/5YLP/ AKTJf+yXFXfWPMv/ACwWf/SZL/2S4qsiuPMnE/6BZ/ab/j8l/mP/AC64qv8ArHmX/lgs/wDpMl/7 JcVd9Y8y/wDLBZ/9Jkv/AGS4qsS48ycpP9As/tf8tkv8o/5dcVX/AFjzL/ywWf8A0mS/9kuKu+se Zf8Algs/+kyX/slxVYlx5k5Sf6BZ/a/5bJf5R/y64qv+seZf+WCz/wCkyX/slxV31jzL/wAsFn/0 mS/9kuKpV5Na6bVvNxuo0im/S8fJInMij/cTYUozJGTt/k4qnFrdWttZmS5mSCNrqWJXkYIDJLdN HGgLEfE7sFUdyaYqj8VdirsVdirsVQtl/vTf/wDGdf8AkxFiqSflr/ygWh/8wiYqyXFXYqti+yf9 Zv8AiRxVdiq2RS8bKrcSwIDDqCR1xVif5X+VL/yx5YGm331dZRLyENoxaBOMUcTFS0cBrK8TSt8H 2nPXqVWXYq7FVsX2T/rN/wASOKrsVdiqVeWv+OdN/wAx2of9R02KprirsVWxfZP+s3/Ejiq7FXYq kXljQG0i78wP8Hpanqj38KoWJUS28CPy5DZjLG7UG2+Kp7irsVWp9qT/AFv+NRiq7FXYqx3yt/x3 POH/AG14v+6RYYqlfn/y/wCbPMHkDUtK8p6n+h9dnuWNrqHrS2/phL3nIPUgDSDkisuw74qyzSrB dP021shJLMLeNY/VnlknlYqKFnllLSOT4sa4qisVdirsVeTf8rY8yD88z5CaGx/RDS8YZACbxoxp wunLgzhk4zEBW+rsjqSOSlDVV6fZf703/wDxnX/kxFirFPy60Oyl8j6LK0l2Ge1QkJeXSLU+CrKF HyAxVkf+HrD/AH7ef9J15/1WxV3+HrD/AH7ef9J15/1WxVZF5esOJ/e3n2m/4/rz+Y/8W4qv/wAP WH+/bz/pOvP+q2Ku/wAPWH+/bz/pOvP+q2KpZ5eXy5rli15ptzfyQrLJE4ludRt3V1NSrRzPHIuz A7r03xVM/wDD1h/v28/6Trz/AKrYq7/D1h/v28/6Trz/AKrYqsi8vWHE/vbz7Tf8f15/Mf8Ai3FV /wDh6w/37ef9J15/1WxV3+HrD/ft5/0nXn/VbFXnFnYFWvlW91BFXUL9VVNQvVAAvJQNlmAxVEfU n/6uGpf9xK+/6rYq76k//Vw1L/uJX3/VbFXCyf8A5b9S/wC4jff9VsVd9Sf/AKuGpf8AcSvv+q2K u+pP/wBXDUv+4lff9VsVS7TdS0vUpRHY6rqczNbxXYIvtSVfRnqI2LNIFq3A0BNdumKpj9Sf/q4a l/3Er7/qtirvqT/9XDUv+4lff9VsVcLJ9/8AT9S/7iN9/wBVsVd9Sf8A6uGpf9xK+/6rYq76k/8A 1cNS/wC4lff9VsVTf8q1ZH82IZZZuOtKA88sk0m+lWB3klZ3PXucVZhpn+8z/wDGe4/5PviqKxV2 KuxV2KvEbvW7XRvzens7Ty3rOvyvfvNDeW+qX/1aG9ksBLJB9X1B7XTDJ9XdnRUmYhDQBeIAVex2 X+9F92/frt/zwixViv5deYdAh8j6LFNqdpHKlqivG88aspHUEFqjFWR/4n8tf9Xaz/6SIv8AmrFX f4n8tf8AV2s/+kiL/mrFVkXmfy3xP+5az+03/HxF/Mf8rFV/+J/LX/V2s/8ApIi/5qxVo+ZvLdP+ OtZj3+sRf81YqlHlWfytoGjJpsfmGK+CSzSNdXdxa+tI80rSSPIYVhVmZ2LE8aknFU4/xP5a/wCr tZ/9JEX/ADVirv8AE/lr/q7Wf/SRF/zViqyLzP5b4n/ctZ/ab/j4i/mP+Viq/wDxP5a/6u1n/wBJ EX/NWKu/xP5a/wCrtZ/9JEX/ADViry+38z+W0mv1fVrNT+kNQNDcRA0N7KQftdwcVVv8VeWP+rxZ f9JMX/NWKu/xV5Y/6vFl/wBJMX/NWKuHmnyx/wBXey/6SYv+asVd/iryx/1eLL/pJi/5qxV5zP5A /L/UNTm1TUvMcS3r3t9dIttdWfolLtiqrIkkbCSkdOXPlX7J5IFUKrLL8rvyotIBFH5hB4o6Rubn T1IZ+RWSkcKK0kbNyRmBIIHYAYqyf8v59E8u+V7fS7zWdMNwktxK4t7iD0h607yqF4pbrsrjpGo9 sVZF/iryx/1eLL/pJi/5qxV3+KfLH/V3sv8ApJi/5qxV3+KvLH/V4sv+kmL/AJqxV3+KvLH/AFeL L/pJi/5qxVO/yq1Czmj823dvKtzbHWk4ywfvgaaVYKePp8q0PhirN9NVhakspXnLM4DAqeLysy1B 3Gx74qisVdirsVdirxryHcaWfNemCD8q7Dy/cSGUNqVvY3MFxZfuHJLzT6VY2x5U9I+hdPXl8PJa nFXrdl/vTf8A/Gdf+TEWKpJ+Wv8AygWh/wDMImKslxV2KrYvsn/Wb/iRxVdirzLzD+fXlWz0nULv QVOtXmn263MmnyLc2DMsksUUZWSe34FW9YHlXpQgEGoVQlr+d19dwS6hYaBHLo0X7155bySK5CPe 3NqtbYWrhX5Wp5B5AEr8bKqswVZ95O16817y/Bql5ZLYTzSTp9Xjm+sxlIZ3ijljm4Rc0lRBIp4D ZvpxVOsVWxfZP+s3/Ejiq7FXYqlXlr/jnTf8x2of9R02KprirsVWxfZP+s3/ABI4quxVpyyoxVeT AEhRQEnw3xVg/kP8yh5p1W4sfqC2bxWNnfOfXMjc7qCOVo1UxRcljWVfjB6/aVfh5Ks5xV2KrU+1 J/rf8ajFV2KuxVjXluJZdY84oxYKdXhqUZkO2k6edmUg4qnemcvqpBZm4yzIC7FjRZnUAliSaAYq isVdirsVdirxr8vvyI1ry7e+XLy+1iwpockk1xaabYS2wu5DBNbQvO/1n0HljjuKet9VEjDZ2b7W KvW7L/em/wD+M6/8mIsVYp+XWp3sfkfRUXSbuVVtUAkRrUKw8RynVvvGKsj/AEtf/wDVlvP+Ds/+ yjFXfpa//wCrLef8HZ/9lGKrItWv+J/3C3n2m/bs/wCY/wDLxiq/9LX/AP1Zbz/g7P8A7KMVSg6L oJ518lIfVjWGSsGm/FHHx4I377dV9NaDtQeGKtNpOiT0afyYsrJcNdKzw6axE/qyyeqCZvt855G5 daux/aOKo7TXTS7GKw0zy1NY2MAIgtLYWEMSAksQkaTqq7knYYqiv0tf/wDVlvP+Ds/+yjFVkWrX /E/7hbz7Tft2f8x/5eMVX/pa/wD+rLef8HZ/9lGKu/S1/wD9WW8/4Oz/AOyjFUr8uarfDT5gNGvG /wBNvzUPZ972Y03uB0xVNP0tf/8AVlvP+Ds/+yjFXfpa/wD+rLef8HZ/9lGKrItWv+J/3C3n2m/b s/5j/wAvGKr/ANLX/wD1Zbz/AIOz/wCyjFXfpa//AOrLef8AB2f/AGUYql9hHa2VzLcWflaS2nKR 25lhTT439GJf3cXJZweCVPFegxVMP0tf/wDVlvP+Ds/+yjFXfpa//wCrLef8HZ/9lGKrE1a/5Sf7 hbz7X89n/KP+XjFV/wClr/8A6st5/wAHZ/8AZRirv0tf/wDVlvP+Ds/+yjFUq8mzSTat5ukkge2c 6vHWGUoWFNJsBv6bSLv7Niqe6Z/vM/8AxnuP+T74qisVdirsVdirsVQtl/vTf/8AGdf+TEWKpJ+W v/KBaH/zCJirJcVdiq2L7J/1m/4kcVXYqtkLiNjGKyAHgD0JptirE/yvv/Mt95YE3mH6wbz1aK93 ALWdgYo2l5RCK34hLhpUX4BVVB36lVl2KuxVbF9k/wCs3/Ejiq7FXYqlXlr/AI503/MdqH/UdNiq a4q7FVsX2T/rN/xI4quxV2KpF5Yk1trvzBHqkjyxw6o66a7xLEPqjW8EiKvEDmqO7pz3Jpiqe4q7 FVqfak/1v+NRiq7FXYqx3yt/x3POH/bXi/7pFhirHvzR1DWrLyJ/uBMH6cudatLfS0uUilRp5NVX j8EoZaqAX5AVSnIEcahVk3kf/EX+GbT/ABF9YOrcpvX+ufVPrHH1n9L1PqH+jV9Pj/d9uvxVxVPc VdirsVdiqFsv96b/AP4zr/yYixVin5dQa+fI+imG8tEiNqnBHtZHYDsCwuEB+4YqyP6v5l/5b7P/ AKQ5f+yrFXfV/Mv/AC32f/SHL/2VYqsit/MnE/6fZ/ab/jzl/mP/AC9Yqv8Aq/mX/lvs/wDpDl/7 KsVd9X8y/wDLfZ/9Icv/AGVYqsit/MnE/wCn2f2m/wCPOX+Y/wDL1iq/6v5l/wCW+z/6Q5f+yrFX fV/Mv/LfZ/8ASHL/ANlWKrIrfzJxP+n2f2m/485f5j/y9Yqv+r+Zf+W+z/6Q5f8AsqxV31fzL/y3 2f8A0hy/9lWKpX5cg8x/o+bjfWYH12/62kp3+uzV/wCPkd8VTT6v5l/5b7P/AKQ5f+yrFXfV/Mv/ AC32f/SHL/2VYqsit/MnE/6fZ/ab/jzl/mP/AC9Yqv8Aq/mX/lvs/wDpDl/7KsVd9X8y/wDLfZ/9 Icv/AGVYqsS38ycpP9Ps/tf8scv8o/5esVX/AFfzL/y32f8A0hy/9lWKu+r+Zf8Alvs/+kOX/sqx VYlv5k5Sf6fZ/a/5Y5f5R/y9Yqv+r+Zf+W+z/wCkOX/sqxV31fzL/wAt9n/0hy/9lWKpV5NW6XVv NwupElm/S8fJ4kMan/cTYUorPIRt/lYqnumf7zP/AMZ7j/k++KorFXYq7FXYq7FULZf703//ABnX /kxFiqSflr/ygWh/8wiYqyXFXYqti+yf9Zv+JHFV2KuNabde2KsY/Lny5deX/LS2N3bWtpdPcTzz QWDs9qhlkLBYeUUBVVWigcK7VYliSVWT4q7FVsX2T/rN/wASOKrsVdiqVeWv+OdN/wAx2of9R02K prirsVWxfZP+s3/Ejiq7FXYqxLyX5WvNG1vzNfTxW1vBq1769vBauz/CORMstYoP3svqcnrzIO3q MoQKqy3FXYqtT7Un+t/xqMVXYq7FWNeW5oodY84ySusca6vDydyFArpOnjcnFU50l0e0LowZGmnK sDUEGdyCCMVRmKuxV2KuxV2KoWy/3pv/APjOv/JiLFWKfl1odlL5H0WVpLsM9qhIS8ukWp8FWUKP kBirI/8AD1h/v28/6Trz/qtirv8AD1h/v28/6Trz/qtiqyLy9YcT+9vPtN/x/Xn8x/4txVD6nZ+X NKs3vtU1GawsoyokurrU7mGJS7BVDO86qKsQBv1xViOpef8AyRaakllAdT1NJfRWG9sNSM9u8t0k jW8QYXobnN6LBarToWIUg4qll9+bX5fabAj3UetIWup7OVDeSKYprcRNMrl7xVJT6wFohYswITke PJVk3ljXvK/mPUJrGxOpJJBa2t45m1CRTwvIY54wIlu3m2SVasU4VqAxIxVk3+HrD/ft5/0nXn/V bFVkXl6w4n97efab/j+vP5j/AMW4qv8A8PWH+/bz/pOvP+q2Ku/w9Yf79vP+k68/6rYqlflzQLFt PmJlvP8Ae2/G17eDpezDtLiqaf4esP8Aft5/0nXn/VbFXf4esP8Aft5/0nXn/VbFVkXl6w4n97ef ab/j+vP5j/xbiq//AA9Yf79vP+k68/6rYqsm0KwiheTnfPwUtwS9vCzUFaKPW3JxViPlXzX5T8w6 9Lodsmr2+pJbzXk0NxeXFI0t7t7BlLxXUqMxlhYrwJBWhruMVZj/AIesP9+3n/Sdef8AVbFXf4es P9+3n/Sdef8AVbFVieXrDlJ+9vPtf8t15/KP+LcVX/4esP8Aft5/0nXn/VbFXf4esP8Aft5/0nXn /VbFUn8pWaw6l5wt4ZZUA1eLjKztNIK6VYH7c3qE/TirItPkkktqyNzZZJY+ZABIjkZATQAVouKo jFXYq7FXYq7FULZf703/APxnX/kxFirFPy68w6BD5H0WKbU7SOVLVFeN541ZSOoILVGKsj/xP5a/ 6u1n/wBJEX/NWKu/xP5a/wCrtZ/9JEX/ADViqyLzP5b4n/ctZ/ab/j4i/mP+ViqB16fyHr+mS6Xq 99ZXVhMVMkJulSpRgy/Ejq2zDxxVID5K/Jr65NeB7VLieRppWTUpkUyuHHq8FnCh19RuDAVSvw0x VQl8hfkrdQTxztbMtxzWUjVLhWIZDDJR1uAwMsZpKQf3n7fI4qnflyy/Lry4WOkajFCHjjhZJNTl uEKQoscfwTzyLyWONU5U5cQBWmKp5/ify1/1drP/AKSIv+asVWReZ/LfE/7lrP7Tf8fEX8x/ysVX /wCJ/LX/AFdrP/pIi/5qxV3+J/LX/V2s/wDpIi/5qxVLPL3mLy/HYSrJqdojG9vmAaeMHi15Mynd uhUgjFUz/wAT+Wv+rtZ/9JEX/NWKu/xP5a/6u1n/ANJEX/NWKrIvM/lvif8ActZ/ab/j4i/mP+Vi q/8AxP5a/wCrtZ/9JEX/ADViqybzF5YmheJ9XtAsilWKXSIwDCh4ujqyn3BqMVY/5d0j8rNAuorr SpLC3u7W1/R0N210JZ/qn7tlheaWR5JFQxrw5seIFFoNsVZH/ify1/1drP8A6SIv+asVd/ify1/1 drP/AKSIv+asVWJ5n8t8pP8ActZ/a/5aIv5R/lYqv/xP5a/6u1n/ANJEX/NWKu/xP5a/6u1n/wBJ EX/NWKpV5NurW61bzdPazJPC2rx8ZYmDqaaTYA0ZSR1xVPdM/wB5n/4z3H/J98VRWKuxV2KuxV2K oWy/3pv/APjOv/JiLFUk/LX/AJQLQ/8AmETFWS4q7FVsX2T/AKzf8SOKrsVdiq2L7J/1m/4kcVXY q7FVsX2T/rN/xI4quxVhnmvzhq+kTeZI4Pqa/o3RU1HTDcniHuT9bLrKzywoUC2oagZaDkS38qry qH/nIjzPKNMa2bSns9RNy7XkttNEIESR1BmjN2eJgjVbiYF/7twPg+2VXvehX0+oaJp9/cRehPd2 0M8sH8jyxh2Tf+UmmKo3FVsX2T/rN/xI4quxV2KrU+1J/rf8ajFV2KuxVan2pP8AW/41GKrsVdir HfK3/Hc84f8AbXi/7pFhiqcaZ/vM/wDxnuP+T74qisVdirsVdirsVQtl/vTf/wDGdf8AkxFirFPy 6n18eR9FENnaPELVODvdSIxHYlRbuB95xVkf1jzL/wAsFn/0mS/9kuKu+seZf+WCz/6TJf8AslxV ZFceZOJ/0Cz+03/H5L/Mf+XXFV/1jzL/AMsFn/0mS/8AZLirvrHmX/lgs/8ApMl/7JcVWRXHmTif 9As/tN/x+S/zH/l1xVf9Y8y/8sFn/wBJkv8A2S4q76x5l/5YLP8A6TJf+yXFVkVx5k4n/QLP7Tf8 fkv8x/5dcVX/AFjzL/ywWf8A0mS/9kuKu+seZf8Algs/+kyX/slxVZFceZOJ/wBAs/tN/wAfkv8A Mf8Al1xVf9Y8y/8ALBZ/9Jkv/ZLirvrHmX/lgs/+kyX/ALJcVWRXHmTif9As/tN/x+S/zH/l1xVf 9Y8y/wDLBZ/9Jkv/AGS4q76x5l/5YLP/AKTJf+yXFViXHmTlJ/oFn9r/AJbJf5R/y64qv+seZf8A lgs/+kyX/slxV31jzL/ywWf/AEmS/wDZLiqxLjzJyk/0Cz+1/wAtkv8AKP8Al1xVf9Y8y/8ALBZ/ 9Jkv/ZLirvrHmX/lgs/+kyX/ALJcVSrya102rebjdRpFN+l4+SROZFH+4mwpRmSMnb/JxVLPzD1b XdL8jyz6FLNDqc2q29pA1qts85+t6osDJGLwNb8mWQqDJ8I67Yqjfyzt/P0fl1pfPV162vT3M7NA i2whghWVlhWE26ryVowr/vGZt96dMVZbirsVdirsVQtl/vTf/wDGdf8AkxFiqSflr/ygWh/8wiYq yXFXYqti+yf9Zv8AiRxVdirsVWxfZP8ArN/xI4quxV2KrYvsn/Wb/iRxVdirz3zdpfm+813Wjpce qQWsmhXFrZXNtdxCCS+nAZDHA13btDJB6IVJAFLNK1XVVBxV5zD5W/PaUaZNJDqtvEDctq1jFrPM lnkdnSGV73lR4CkMJLArIpf4K+oyr3vQotQh0TT4tSf1NRjtoUvZK15TrGBI1fd64qjcVWxfZP8A rN/xI4quxV2KrU+1J/rf8ajFV2KuxVan2pP9b/jUYquxV2Ksd8rf8dzzh/214v8AukWGKpxpn+8z /wDGe4/5PviqKxV2KuxV2KuxVC2X+9N//wAZ1/5MRYqxT8utMvZPI+iuurXcStaoRGi2pVR4DlAz fecVZH+ib/8A6vV5/wABZ/8AZPirv0Tf/wDV6vP+As/+yfFVkWk3/E/7mrz7TfsWf8x/5d8VX/om /wD+r1ef8BZ/9k+Ku/RN/wD9Xq8/4Cz/AOyfFVkWk3/E/wC5q8+037Fn/Mf+XfFV/wCib/8A6vV5 /wABZ/8AZPirv0Tf/wDV6vP+As/+yfFVkWk3/E/7mrz7TfsWf8x/5d8VX/om/wD+r1ef8BZ/9k+K pbd32mWdzcWt35uNvdWlu17dQSy6ckkVqlA88itCCsS8hVzsK9cVQEXmnyn6Jk/x7b+nyn+P61pd P3A9SXf0v91owZvAbnFU/j028kRZI9cu3jcBkdVsiCDuCCLfpiq79E3/AP1erz/gLP8A7J8VWRaT f8T/ALmrz7TfsWf8x/5d8VX/AKJv/wDq9Xn/AAFn/wBk+Ku/RN//ANXq8/4Cz/7J8VWJpN/yk/3N Xn2v5LP+Uf8ALviq/wDRN/8A9Xq8/wCAs/8AsnxV36Jv/wDq9Xn/AAFn/wBk+KrE0m/5Sf7mrz7X 8ln/ACj/AJd8VX/om/8A+r1ef8BZ/wDZPirv0Tf/APV6vP8AgLP/ALJ8VSrybDJDq3m6OSd7lxq8 dZpQgY10mwO/prGu3suKp7pn+8z/APGe4/5PviqKxV2KuxV2KuxVA2c8Avr6EyKJjMrCKo5FfQj3 49aYqlH5a/8AKBaH/wAwiYqyXFXYqti+yf8AWb/iRxVdirsVWxfZP+s3/Ejiq7FXYqti+yf9Zv8A iRxVdirDfM/5f3GuateXv16GGC60u80v6s1vMxrerEDM7x3MAYqbdKcVV+NV5048VWDw/wDOPeqM 2m3Vz5rFzf6YZONzLYsTM/rvcxvMBdfEfrErtJQjktFHAjkVXr2jaaml6PY6ZG5kjsbeK2SRvtMI UCBj7njiqMxVbF9k/wCs3/Ejiq7FXYqtT7Un+t/xqMVXYq7FVqfak/1v+NRiq7FXYqxry3NFDrHn GSV1jjXV4eTuQoFdJ08bk4qnWlkNaFlNVaadlYbgq0zkEexGKovFXYq7FXYq7FXYq88k/wChe/Uf 1P8ACXqcj6nL9G8uVfirXvXriq3/AKx3/wC/R/7lmKu/6x3/AO/R/wC5Zirj/wBC8d/8I/8AcsxV 3/WO/wD36P8A3LMVd/1jv/36P/csxVx/6F47/wCEf+5Zirv+sd/+/R/7lmKu/wCsd/8Av0f+5Zir j/0Lx3/wj/3LMVd/1jv/AN+j/wByzFXf9Y7/APfo/wDcsxVx/wCheO/+Ef8AuWYq7/rHf/v0f+5Z irv+sd/+/R/7lmKuP/QvHf8Awj/3LMVd/wBY7/8Afo/9yzFXf9Y7/wDfo/8AcsxV3/WPH/fo+3/H MxV3/WO//fo/9yzFXf8AWO//AH6P/csxV3/WPH/fo+3/ABzMVd/1jv8A9+j/ANyzFXf9Y7/9+j/3 LMVZV5S/wT+j5v8ACH6N/R/rn6x+iPQ9H6xwTlz+r/D6np8K13pTtTFU7xV2KuxV2KuxV//Z uuid:81CE9473D0FE11DC88C2B553B10A7876 uuid:56491B3EF6E9DC118669A8FCEEB2D9C6 uuid:4897280377CEDC11945D974E704A7427 uuid:4297280377CEDC11945D974E704A7427 endstream endobj 99 0 obj <>stream h,n0De^R&u.n%lƜ<;<+[kF{ͅNr({qt =},JU=C-3k& `%y^47;qE4ykn>y] k](FFŨF ~"&f@9XcT&iX,X&mL曎nŗQ'.G+Z>Z tw o<T_sv4*/V6 endstream endobj 100 0 obj <> endobj 101 0 obj <>stream hެYnFaQќ Khؕ@[,hUX+ɦ>3$_XG33~3:fjl6>h]V⟎\[YhlfIlΏ'泟MY, eY.{7e,LbGm|-*s䓦f[|vw'of'!fl1+BݶMOtqh2ܡm |Vlb4,=3y('xA6pfR[5;Hђl"OxP)6ej %-t#oH PJJcYl",a?,16v0o#T? }U{H@;ْo0>{f?U`6+l ݫ,24XV=6HAGc>nݨaκ KN\[h{?Qˆi F|l*]]7'1hax 39^RZ#mѨ5H͑991~PqE M3(<bB\M&}x{o߫VTmdIuăuu LvLKǵ#INt6>6e@% s_2Aou5=y3iY-?bl|pֶsv0qhzI:%YjT+ݖ٢gEi8 8`XV 6@[7Zw~5PBiޣy`qy!cc"?ugc R9$Jn* !GE^%ǦLd8R%=Yl`dr()\~ZɨE5~JeuSJGGSd&09]P-Hn$>`.Z<*+-W|Q~H]g?nL(C^^wP`šl[},oܠJH \$C$K1s " L۲u 6R}D\H&^q~[6u \I`aoqܶd$X 7ݚ_~@eS׻[AF%XPڬ׺F>ٗ]Nڡ.A"wͫ`tP~*%8лyHLh;əƭM:Ild[rqXjzCZqp=^ȯכe#WU5x֒tn^i(#JCypށ-Rξ:Lw5UAx6IYK'܎9|=3kg .!6cjd(/B]W1O϶1o̶6`{! h;V6Le)W֠L$љ"88Ff9eKS:Ϧ{F?g]OxqurԱ"; 2&χR޳֕ɉqLUMm=ZZiLyX]Y2W9Syhl5#ijlt1dfJ 2tk<{հ <B#M$}E=G?2,M| >}@kc&U%2UI^"Mxs}#YEr:‰Iq̧؃-_DQJfwY@.3ߘTki 4}Ys݌vbT 0{K{*&f$\ @* Ądk@qP$8aF3g!W9/ 0>a |J@ ?ʝ> %`rK%"}7tAe>$ 5Q IwBIEXG@ 6Z7z*ўQR"Q$~Kk409߱aƆaTqT=n.*^`q{JOYAq+(^aVY}X5 SG%ۣ\VwJ b(+_tkΠNVlS#@[H{Jgn=| `dž Yr } :I $`zkwq[m8t<ζ{O wYJȲ4t|"f6fۏğs6\n/JhZԄJq3S#>7%SY?@ =q̫)ܢ1 4H3`~9=ݘWרּ!iU D}w+ss4n'Cx.d jt])+u=3@,mHǏ! !(Է FCAzEիaD[j_]NʋNxE_%8FA*MctT_?J\{E_T1Lܺb$r>e:sfikC|>n0OV^J 3N_\5x/M-;<~D`M-iq-)FWJcn\Y){ 5o_R#]f_‡fE>-\2TVN}(&]7A⹏!A)sOϗ۩rtڕiդ@;_;i k/c7i[ g>n9X_STUyХ-Z˽4, F2sqtj*tuw= pPL`W endstream endobj 102 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-29T11:03:09-05:00 2008-01-29T11:03:09-05:00 2008-01-29T11:03:09-05:00 256 44 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXnX58tbL5Gt2u47Wa0XWdHNzFqDiKyeIajDzW6kZJVSEjaRijALXY9MVefeQ /PXnHTLLT/KejWVqserzX115fuRFPcWsFlDdXr3Iiq8JlgiCW62p+Dksi1HYKozSfzv86xw+WrSS 2ttYlvvL66le6gkTR87oWt3LKOEEkrj6vLaJDOIoG+Nj/dHhGyr0j8qfOeoebvLc2pX/AKBnhunt vUtU4wsEjjeqFZ7yNwDIV5RzMNt+LckVVmWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXNb 0zQ9IvNY1Wb6tp1hE093PxZ+EaCrNxQMx+QFcVRiOrorqaqwBU+xxVvFXYqhtT1Ky0vTbrUr6T0b KyhkuLmXizcYolLu3FQzGijoBXFVLQ9c0vXNLh1TS5jPZTl1R2R4mDRO0ciPHIqSI6SIysrKCCKH FUdirsVQuq6pYaTpl3qmoSiCwsYZLi6mILBIolLu1FBY0UdAK4qs0XWtN1vTIdT02UzWc/IRuyPE waNzG6vHKqSIyOhVlZQQRQ4qjcVdiqldXVvaWs11cyCK3t0aWaVtlVEBZmPsAMVUNG1fTtZ0mz1f TZfX0/UIUubSfiyc4pVDI3FwrCqnoQDirT6Lpj61FrTwctTgt5LOG4LN8EErpJIqrXgOTRLU0rt1 xVG4qg9Z1fTtG0m81fUpfQ0/T4Xubufiz8IolLO3FAzGijoATiq/TdQg1GxivbdJkhmBKLcwTWso oSPjhuEilTp+0oxVE4q7FUHrOsado2mzalqMphs4OPqOqPKxLsERUjjV3dmdgqqqkkmgGKqmm6ha alp9tqFm5ktLyJJ7d2VkJjkUMpKOFdTQ9GAI74qiMVdiqE1bVLXStPmv7pZ3t4KGRba3nu5aMwX4 YbZJZW3O/FTQbnYHFXaRq1hrGlWeradL62n6hBHdWkxVk5wzKHjbi4VhyVgdxXFUXirsVQGua7pm h6a+palI8dqjxRVjilnkaSeVYYkjihWSV3eSRVVVUkk4qq6VqdhqumWmqafKLiwvoY7m0nAIDxSq HRqMARVWB3GKorFXYqlXmvQh5g8razoJm+rDV7G5sTccefp/WYWi58Kry4860qK4qmcMfpwpHWvB QtelaCmKrsVdiqF1W3vrnS7y3sLoWN9NDJHa3pjEwhlZSEl9MlOfBjy41FcVS/yX5el8ueV9P0SW aK5ksYzG1xBE8CSfEW5lJJbl+bVq7NIeTVbatAqnWKuxVDanb3lxpt1b2VwLO8mhkS2u2jEoikZS EkMZKhwrb8aivjiqWeSfLR8s+WLLRGufrjWvqF7ng0fNpZXlb4XeZ+slKvIzHqzM1SVU8xV2KpZ5 n0C28w+X7/Q7qea3ttRha3nltyglEb7MB6iyJRh8JDKQRsRiqH8keWm8r+UdI8utevqB0q2jtReS IkTOsY4r8CbKANlFSaDcsakqp3irsVSrzTosmueXb/SElih+vRGB2uITcQlH2dJIg8JZXSqmjqd9 iDiqj5L8t/4a8s2Wieutx9U9T95HH6EY9SVpeEUXKT04o+fCNOR4qAKnFU7xV2KpD578pwebfK15 oM7xxpctBIGmi9eLnbTx3CCWHlH6kZeIB15Cq1FRiqL8r6IdC8taTohuGuzpdnb2ZunHFpfQiWP1 CKtQtxrSpxVM8VdiqW+ZtKutX8uappNpd/ULnULWa1iveHqmEzIU9QJyj5FeVR8Q3xVF2FjbWFhb WNqvC2tIkggT+WONQqj6AMVV8VdiqQeevKz+aPLc2jx3f1GV5rW4iueMjcXtLmO5X+5ltphVoqVj lRx1VgcVRflXQ10DyzpOhLN9YXSrOCyE/AR8xbxrHy4CoWvGtK4qmmKvn/yV5X0/UfJug6heXWpy 3l5p1pcXMp1TURzklgR3ai3AAqxrsMVTr/BGif7+1L/uK6n/ANlGKu/wRon+/tS/7iup/wDZRiqk fKPlwXC2xu9QFw6NIkJ1fUebIhVWYL9ZqVUuoJ9xiqnZ+WvKd8ZxZahe3RtZWt7n0dZ1CT0pkpzi k43J4utd1O4xVUk8o+XIpIo5bvUEknYpAjavqIZ2ClyqA3PxEKpag7DFVX/BGif7+1L/ALiup/8A ZRirv8EaJ/v7Uv8AuK6n/wBlGKsy0r8tvKk2l2csi37SSQRu7HVNS3ZkBJ/3oxVankn8uZNVk0iO 6mfVoYhPNp66zfm4SFiAJGiF1zCEmnIimKoz/lWHlD/fd9/3FNS/7KMVd/yrDyh/vu+/7impf9lG KoTTvyw8oy6fayyLqDSSQxs7fpXU9yVBJ/3pxVe/5beREuY7V3vVuZleSGA6xqQkdIyodlX61UhT IvIjpUeOKqv/ACqzyd/JqH/cW1T/ALKcVd/yqzyd/JqH/cW1T/spxV5/Y+TNHksreR59SLvEjMf0 rqW5Kgn/AI+MVV/8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8 EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRiqlH5R8uSySxxXeoPJAw SdF1fUSyMVDhXAufhJVg1D2OKqen+WvKepWiXmnahe3tnLX07m31nUJY24kq3F0uSpowIOKqh8o+ XBcLbG71AXDo0iQnV9R5siFVZgv1mpVS6gn3GKqv+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV 1P8A7KMVd/gjRP8Af2pf9xXU/wDsoxV3+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV1P8A7KMV SXzr5X0/TvJuvahZ3WpxXlnp13cW0o1TUTwkigd0ajXBBowruMVTf8uf/Je+WP8Atk2P/UMmKshx VgvnLyp531bX7eTS9V+p6IXsmvI0u7q2m4W7z/WY41gWn75Jk+L1FNUHscVYvffld+ZtzPFcDzAU uobSO1a7i1G7jmkAhtFdAzQTCEetbPKzoC0taNTqFUXF+V/nu3tb23svMD2ga+u7vTHjvbw+itzd WsqCRD8MlI47jkrhlLPX9pjiqJ8r/l551sPMWkX+r6q+oWenFpONzqNzeSIzQ3ULBVaC3ik5m4Q8 2AZQpUVHVV6dirsVZ5ov/HGsP+YeL/iAxV5L54/J/wA8ah5o13X/AC1q66fcasrxxuL++tJY1MFg ilHhSVYz6lk5bip5LxU9uCql5X8u/mleefL2+n1C7h0jT9YaSSO7u9SjiuIDc3hZYbeSNI3VYZIU VY29CgVuTNVQq9rxVC6T/wAcqy/4wRf8QGKvLPNX5afmRqepale6fq8cE8q3UVhcfpG+ilSK6vbS YCIpE4syltbNFSLkrMAzBubjFVLSPy4/N231ewu7/wAwfWYobrTp7wfpbUeMiwCl3/o6xRxcX/Yi qFZt3JHwYq9ixV5fpv8AxzrX/jDH/wARGKojFXYq7FXYq7FXnGqeSvzFu7u/MOuehbmaSbTil5do w5fX5IhIiIAqxyXduvDkyssW/ZcVQVj+WvnpNUjnudZZLeS8nuNR+rX90rXKvb2sCNKGiPLl9Xl/ dhlEXMcH+GmKoSy/K78y7TQLLT4PMrQz2tsloTDe3Sp6SvdsyR8o3VCVltkWT0yyBDx2ADKsl8p+ TfM2neaV1bVr365DHposkeS7nuZebRWYcenJHHEo9W1lcyLRpOYLCoxVnWKuxV2KuxV2Kse/Mb/y Xvmf/tk33/UM+KsE8l/8rz/wdoP6N/wx+jv0dafUvrP6Q9f0PQT0/V4fBz4U5cdq9MVTn/rIP/v0 v+5lirv+sg/+/S/7mWKu/wCsg/8Av0v+5lirv+sg/wDv0v8AuZYq7/rIP/v0v+5lirv+sg/+/S/7 mWKu/wCsg/8Av0v+5lirLdL/AOhoP0Zaeh/gj0fRj9Ln+luXHgOPKm1adcVRP/WU/wD343/c3xV3 /WU//fjf9zfFXf8AWU//AH43/c3xVD6d/wBDQ/o+29H/AAR6XpJ6fP8AS3LjxFOVNq0xVEf9ZT/9 +N/3N8Vd/wBZT/8Afjf9zfFXf9ZT/wDfjf8Ac3xVgdj/AMr/APqVv6X+FPS9NOHL9JcuPEUrTviq t/1kH/36X/cyxV3/AFkH/wB+l/3MsVd/1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/ AFkH/wB+l/3MsVd/1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/AFkH/wB+l/3MsVd/ 1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/AFkH/wB+l/3MsVSbzp/yvP8Awdr36S/w x+jv0dd/Xfq36Q9f0PQf1PS5/Bz4V48tq9cVf//Z uuid:4896EAF480CEDC11945D974E704A7427 uuid:990574AF83CEDC11945D974E704A7427 uuid:4696EAF480CEDC11945D974E704A7427 uuid:4596EAF480CEDC11945D974E704A7427 endstream endobj 103 0 obj <>stream hޤMk0Cfa!M\ޖ=Bz*lmnefG򫱈$#VbHb5&`qh-%DȀ+uC6˧gBY?C1Q *2p "IQOY9ۚ]clFMiQɃV9T΢A&4؉TXO052q,C̄*E:BklJm%[Nh W s%K'(i$xMÐ t-{:! Wz^nnGz3d\n5- kpȵ8ˏnExlrחԥԥP 5Y7(:͓ch;'R\R/[ "n* 0>~6}:婼x#oI}Tf9 OC``EF endstream endobj 104 0 obj <> endobj 105 0 obj <>stream hެXn)W g8$ HghQȂiK$ࢋ>C}~9C$E8ÙG;}&ɋbjIHk?𓇼i妥iu=o&qfY[\Z6)Sk,/rS_ iefAVHq[̗'(Zbo/AxLil :X mSF0< o=xPq2Sq`*R+VG.*\% ĥrqG4f>j =ld]'C0\%R`(5 3k0OHT N>pYj=~e@X"s=̳YR1٨&"n+l m^T) ̑ݮ_2v5ۃ"ߢei6CmRlSޝ4ۯiMjRJl0CBDjޅJS*kQH*uX=7=ρm^[sk`\7$kǙs8Ku;4Q|]JKPV:U5MSq Yxa=>;>hR|U$iebջxy.'-f24J[XMԔj鉜Vd,xO㋒<[sVҲ W?Dv͸٩,K!Pd0Uzl~6#pA8J {NsfWy/]'^ڻ~"ɭw_=!uun~bYmonʹ^7݈F?2?]|";!7+| J Xnj,yh3$ A;mL2<12$2~ȨJȄYN| =`Qhs":+ ]/-UŻ3)j۸^tG8oq DS_= s [$%G1BB~0.V<:AÖ`H8CauNzٴ Zx* oK?ivڄ?Q&&`vq#J#+u x\dA#b;^cO^&أm]ѮXMXx,F"kJ|UYQz-!r ё4L:@#cN%ԘIfr pFH(LC:;8lMI:0A6(VO (3$GI5lZ7(M?B7xӳPsR ȱR_:ZG0LM1( Vrcq: z3;cFRNEPVYTsKl#agbn@>Ƈclu+g 8=F %>y9R?|i6 :ԛXW^N:Olߔ0GW?Ԍj;Lb'\f[ŒriXf7oql/b_j*7{_3c5kyiaQ% D.Vw;sF/R`$7 endstream endobj 106 0 obj <>stream hޤKK0J0}C@;ô҅DhFN :'s8HTA4) N2Oj17Xg;myOwʱbt:4F$/LP?^{_Lqj?1x+9j 4d)9 2ri顿Z^}lWSݵR s4X%mHB%4 +o:~ٮCy^r\y:fmLWNuS~ endstream endobj 107 0 obj <> endobj 108 0 obj <>stream hZn}WaZ}MI5lh X0-p!ɆJNeȡ#dawUWw]O n&/瓓s$Hͣb3'%2F6_OyWpx49=ǵ1s!!͋i\5sM;\7+|v9m6mYO%_|<59O1'"wDP8ƍ1}Q0t\Ac󒫴//..vU Q-Z!W Gv1=ZIcI-vtҍkPRf<*m\* 92)|?/ 8~d`rw/_J0;Dn6m#j72X |-dz|og{h(G6%=܈ToS0<QCΘռ# K%0N6B"K\G4os Հzޜ^%N+t0hB6Ͻ3¿ʋ|s _U&8oȭʹڪB}-ޫ.ZzJΣ;J"R2 = hu($=*X5h`> PTtkozwPmP>5j{X}{u׋~[qJNm8[wBYHtMO:)P)3P-w$ɈpHjj52xMpjs'5[ܖ4"44~[\_nltyK0(iRG|MuwL^2_ϓaM8J7QN54*_neʤLn*3WfUDZǶ|_H5l^ΖY)m>b8vltE?co?+V;>͌ޟ? BGJ8.u~pٜn>ӯpvC ؜}YT$ү <]>Ϧ-w N$DM-N[ +[N*D CsԜMd4KEA|immU~!CN#r`9\۠ endstream endobj 109 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-31T10:05-05:00 2008-01-31T10:44:42-05:00 2008-01-31T10:44:42-05:00 204 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADMAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXmX5r+R/N+r+YdC8z+Wbq3tLzy7aamIp5Q0sqTXcCxo8VuIZROQob4C6fFxryFVKqT6foH /OR9xpUVynmOwspry0uZ5LS5RXkgvLphLAnJrR+CW4Yx8Dz6ftVARV69p6XkdhbJeyCW8SJFuZRS jShQHYUWMbtX9kfIYqr4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUHqutaNpECT6rf2+nwSuIo5 bqVIUaQqWCK0hUFuKMaeAOKsY8weYvy+1m3tIn8z6TG1ne2t/HIbq2chrWZZeK1kHEuqlOXgTiqa /wDKwPIf/UyaX/0m2/8AzXirv+VgeQ/+pk0r/pNt/wDmvFWPeUtV8h6BLrkp81aJKda1ObUytvLb Wqx+qiRhComkDvxiBeTYuxLEb4qyH/lYHkP/AKmTSv8ApNt/+a8VY7r2p+QtV80eW9c/xVokX+H5 bmbi01u88v1m2a39NJ/XX0k+Pm44NyKruKGqrIv+VgeQ/wDqZNK/6Tbf/mvFVG889eSZrSeGDzVp dvNJGyRXAvLZjGzKQrhS9DxO9MVSvyXr/kfy35S0jQJPN2lXraVaRWf1sXNvF6ghQIG4GaTiSBv8 RxVOR+YPkIio8y6URuNr236jY/t4qkela15F0/zVruuDzbpDx62loDaie0V43tI2jLGf1C8gdStE NFShI3ZsVT3/AJWB5D/6mTSv+k23/wCa8VY5571LyR5p0m2sIvOel6e1veQXhkM9ncq6wsSY2jkk 4/ED8LdUYBhuMVZH/wArA8h/9TJpf/Sbb/8ANeKu/wCVgeQ/+pk0r/pNt/8AmvFUn8t65+XWhpqX peZtIeXVNQudSuXS5tYgXuG+EcRIalYkRWYn4iC21aBVOP8AlYHkP/qZNK/6Tbf/AJrxVjuq6l5C v/Oug+Z/8X6XH+g7e+txafWrc+r9eEI5c/WHHh6HTia17UxVksHnnyTcTxW8HmDTZp5nWKGGO8gZ 3dyFVFUPUszGgAxVO8VdirsVdirsVeLflXZ6zrf5g+Y9avh5w0uy06+abS4NYvroabew3JuY6RWN zaWvpxopSQRksUPDcUPJVntxBBC3klYY1jU31SqAKKnSLzegxVlmKuxVbD/dJ/qj9WKsE86XP5vt e31r5XtrOOxaAixv3EZmS44qQzCWXgU5FgR6VduuKsfA/wCcgrwySSiLTfVimlSC3exaSGUSTvbw M8sc6MhjliRnAJ5Rk9D8SrKvy+/5WP699/jEUj4xCxo1qw5BB6xJgWNvtEcajsx2+EYqzGX7I/1l /wCJDFV2KuxVK/Lf/HPm/wCY2/8A+o2bFU0xVaf71f8AVb9YxVdiqQeeB5sOgSnysf8AcsrVjT9y C68WHENOGjX4qGpB+WKoH8uW89vp943m9DFMZYvqEbG2ZhD9Wi51a2op/fc+o9x8JACrLcVWj+9b /VX9ZxVdiqQ+dv8AjjW//bU0j/uqW2Kp9irsVdirsVdirsVYbqNjcTw+UUW7e0le/MqTWwBKA6Xd /CoufrS0oaYqnX6C1T/qYtQ/5F6f/wBkmKu/QWqf9TFqH/IvT/8AskxVZFoWqekn/Oxah9kf7r0/ w/5hMVY55h80aToF+NOv/NWq/pBkDx20dpaPyqCwAl+peiG4qTRnGKpDJ+aGlJfx2ceq+YJ7udOU MEdvpIZlSRUc8niRBxMy9TXwrirIvKusT+ZGlFrq2tWyxQwzF7iPSeJ9YsOFYYZqOhjPIGnYioIO Kp/JoWqcR/zsWofaX/den/zD/l0xVf8AoLVP+pi1D/kXp/8A2SYq79Bap/1MWof8i9P/AOyTFUs8 vaJqbWEpHmDUF/02+FBHYdryYV3tT164qmf6C1T/AKmLUP8AkXp//ZJiqw6Fqnqr/wA7FqH2W/3X p/iP+XTFV/6C1T/qYtQ/5F6f/wBkmKoLWoLrR9IvNVu/MWpfVbKJ55uMem14oKmnK1VR82IHiRiq 3QYLrV9FsdUtPMWpC2vYEmhDR6dXi6gj7Nqyn5gkeBOKo/8AQWqf9TFqH/IvT/8AskxVYNC1T1W/ 52LUPsr/ALr0/wAT/wAumKr/ANBap/1MWof8i9P/AOyTFUp8zaPfRWNpJNrV7dxpqelk28qWYRqa jb0qYreN9jvswxVksEtwb64glZGREjkiKqVIDs4o1Wav2Bvtiq6xv7HULOG9sLiK7s7hRJb3MDrJ FIh6MjoSrA+IOKq+KuxV2KuxViGt6glha+T7l4nmVbxRwi48t9Lux+2yD8cVRv8AjW1/6t93/wBO /wD1WxV3+NbX/q33f/Tv/wBVsVaTznbKiqdPu6gAH/eft/z2xVCXOteXLq5W6udAee5ShSeWG0eR SvSjNKSKYqpafN5bub6SGy8qcpLOKBgVgsECKS6RBSZVpx9Ggp0oMVTHS7Ww0lpW0rym2ntOI1mN rHp8JdYV4RhvTnWoRfhWvQbDFURfeYLq2gWSXRr0K0sMQo1mfillWNf+Pj+Zxiq678wy2drLd3el 3NvawIZJ7iWWxSNEUVZndrkBQB1JxVQ0/wA42mo1/R9rJeULg/V7jT5d4mCyD4Lo/YYgN4HFUu0b zXHa2s8E2nXYkW8vSwH1c05XcrU/vu1cVR3+NbX/AKt93/07/wDVbFWj5ztuYb9H3dACP+PfvT/i 72xVv/Gtr/1b7v8A6d/+q2Kqdz5r0y6t5La60q4ntplKTQyrbOjqwoVZWlIIPgcVW2fmrTbO0htb bSriCCBFjihiW2REVRQKqiUAAYqrf41tf+rfd/8ATv8A9VsVaHnO25lv0fd0IA/49+1f+LvfFW/8 a2v/AFb7v/p3/wCq2KpZ5g80295aWlstncxNJqWmAPJ6PEU1CA78ZWPbwxVE/mDqVvpvlbzVez3T WMcOjv8A6XGqvJGzLOqNGjvCrvyI4qXWp2qOuKvIfLPljQbzRDb6N+aVxo1tAtzo2m6a13HbzWt5 dXtw0DTQ2V7FbSysPVECoih0Cso+EUVel/lXp+qxyaxqE3mR/MujXH1O20a++spcwyi2t/8AS7iP 05JlQyXk0qMtaj0wvRVJVZ/irsVdirA/OUsUWkeUXldY0F6lWYgD/jmXXc4qlst/p7xugvIkLKQH WRaiopUb4q8/v/I2q3iqX89SpMlTG6l6I/pyxq6KbnZh6wNa/s/cquk8h3CRTRWPnOW1SeS4eVQx IYXAl/ZE6LUNNy5AA/COlBRVnGnz6dZ6fbWn12F/q8SRc+ajlwULWlTStMVTfylrmi2+t6oZ9Qto Q9tZ8TJNGtaSXNaVPauKozWI/LWo+ZdH1v8AxBZxfon1f3HqRMX9QU+CT1F9Ov7fwnkNtsVRnmLz J5dawiC6rZsfrtiaC4iOwvIST9rsMVYR+adv5K8w6tpTLZWmuajZn1JZGuZLcRWwDkejcLc2cAl9 WlBzZhseNPjVVL/yykvNL8yrcX+naZolhLHdiZ4tT9ejTGGf7DahcITJN6lW9KoCgVA6qp5HqmmP Ldul3CyNeXZVhIhBBuZCCDXFVT9Jad/y1Q/8jF/rirv0lp3/AC1Q/wDIxf64qo3d3Yz2k0CX0cLy xsizJIvJCwIDChG464qwaXyPfyrbl/OsrTw8S0zM7VYFA/FTc0QSIhU/6x8TVVSj/L66hsTYQ+dZ VsvQaAWxZ/ToyxLX4bhGApE2wI+2feqr0C3vNOht4ofrkTemipyLrvxFK9cVVP0lp3/LVD/yMX+u Ku/SWnf8tUP/ACMX+uKoW+vrKR9PSO4jdzqem0VXUk/6fB2BxV6Be6dY6z+lNOv4Hl0+7tUtLmNx JEsisZVkVXHAn4W6qcVYbrH5E+T7i/TUdHiGlX82t2eu6rc8rm4Ny9m8j8FVp1SIv67jkAVFfsHa irNPLPlnRfLGiW2iaJAbXTLTn9XgaWWYr6jtI3xzNI5q7k7tiqaYq7FXYqxq56+Tf+Ysf90u7xVk uKuxVbD/AHSf6o/VirHvOXmXXNESzOlaFLrZuHK3AiZ1MKBkXn8EU3L7daHjsDvirB28/fm3TUHP lxYFtTC0Eosbu4M0LRytIqwrLG/qLIgA3pQjufhVZ/5O1bWdV0drzV7X6lcm4njS2aGWBlijkKJy WapNQKhhswoaCvEKp1L9kf6y/wDEhiq7FXYqlflv/jnzf8xt/wD9Rs2Kppiq0/3q/wCq36xiq7FU u8yX2oafoGoXunWxvL62t5Jba1VGkaSRVJVVRSrOT2UEV6VHXFVvli+v7/y7pt7qFubS+uLaKS4t mVo2jdlBKlGLFSO6kmnieuKpniq0f3rf6q/rOKrsVSXzf/xyYP8AtpaX/wB1G3xVVur+z0ltU1C9 neKws7Rby6d2kkWNE9Z5XVfjOyp0UdumKr9B8x6Vr1mLzTHlktzyHKa3ntiGSV4XQrOkTB0khYMp FRtUbiqqZYqshmSZOaBgAzLR0aM1Rip+FwppUbHoRuNsVX4q7FWKanBJNF5OjjuJLZjdg+rEIywp pd3t+8WRfwxVOf0Tf/8AV6vP+As/+yfFXfom/wD+r1ef8BZ/9k+KrItJv/ST/c1efZH7Fn4f8w+K r/0Tf/8AV6vP+As/+yfFUGkbNq0umrr94b6KCO4eH07Soikd0Vq/VuO7Ie9cVRn6Jv8A/q9Xn/AW f/ZPiqyTSb/iP9zV59pf2LP+Yf8ALviq/wDRN/8A9Xq8/wCAs/8AsnxV36Jv/wDq9Xn/AAFn/wBk +KpX5d0q+Ony01m8X/Tb8UCWfa9mFd7c9cVTT9E3/wD1erz/AICz/wCyfFVh0m/9Vf8Ac1efZb9i z8R/y74qv/RN/wD9Xq8/4Cz/AOyfFVK5sbu3t5LiTWb8xxKXcRw2sj0UVPFEtmdj7KK4qo6TDJqO l2l/Z67eyWt1EksDmK1QlHUFTxe2Vht2IriqL/RN/wD9Xq8/4Cz/AOyfFVg0m/8AVb/c1efZX9iz 8T/y74qv/RN//wBXq8/4Cz/7J8VSjzPp15Fp9rJJql1cIupaXWGRbYK3+5G36+nCjfc2Kq3m5dGb RPMq63O9rozaQ66ncxgl47YpcCZ0AWQllSpFFPyOKvEda0L/AJx5leDzHrPmHV7j6rZO41GSzmMf G/f62LqseniNJfU1iN1KceLFPhqDiqdaP+Q35O+btHvl0fV9UuoY7sxXN0XT1o5atePb1urYni31 xWdaGpVeXxq2Ksjm/wCccPIc+o31/Nc38kt/c3N6ys9txjnu43jMifuORMXq8oOZb0mFUpVuSqb/ APKmvLP/ACq7/lW/1q8/Qla/Wq231uv1r659r0PR/vNq+l0998VZ7irFNTnkhi8nSR28lywuwPSi MYY10u73/eNGv44qnP6Wv/8Aqy3n/B2f/ZRirv0tf/8AVlvP+Ds/+yjFVkWrX/pJ/uFvPsj9uz8P +YjFV/6Wv/8Aqy3n/B2f/ZRiqBj1EHXJ5l0S8/SK20KStztdoWklKD/ejj9pX6b/AIYqjv0tf/8A VlvP+Ds/+yjFVkmrX/Ef7hbz7S/t2f8AMP8Al4xVf+lr/wD6st5/wdn/ANlGKu/S1/8A9WW8/wCD s/8AsoxVLPLuq3w0+UDRrxv9NvjUPZ972Y03uB0xVM/0tf8A/VlvP+Ds/wDsoxVBXvmr6ncwx3Ol XkbypI0YratUIUDfZnPTmMVU/wDG1t/1bbz/AKdv+q2KqF/5o06/sbixudMvjbXUbwzBHhiYpIpV gskdwrqaHqpBHbFWtP8ANNhY2FtZQaZerDbRJDErNA5CooUAu87M2w6k1xVEf42tv+rbef8ATt/1 WxVaPOtv6hb9G3lCAP8Aj27V/wCLvfFV3+Nrb/q23n/Tt/1WxVLdf81QXtrZ2y2VzE0mpaYBJJ6H EU1CA78JXbt4YqyL6tbajNqNtfQRT2k8K209pKpdJIqyhvUSVFVkcMRT4gd8VUJfJHkyazNjLoGn SWTIsTWrWkDRGNBEFQoU48VFtFQU/YT+UUVVvL3lzTdAtbq3sFIW8vbrULhm4gtNeTtO/wBhUFF5 8V2rxAqSdyqmmKuxV2Ksauevk3/mLH/dLu8VZLiqhfwS3FjcQQyGGWWJ0jmU8WRmUgMCOhB3xVS0 aC5t9IsYLqT1bmK3iSeWpblIqAM3JtzU9ziqMxVK7f8A5SjUP+YKy/5O3WKppiry7UvJ35xXkbc/ NMSSJOkto8ZaIIAyN6ciQwxCVOSEENvxNK4qnPkfyj5x0bXbu71fWGv9PuLRES2e6urgrc+vI7uF uKqq+myKOFPClAMVZxiqV+W/+OfN/wAxt/8A9Rs2KrLTTdVj8zX+oTXJk06eGKO1t/VkIjZPt/uS PSG+/MfEa0OyjFUq85/8dXTP+MF3/wATt8VSfFXYqwvzVYfmhdaxXy3qFtY6aixchcemef2vV4D6 vO4b7O7GntiqUSeX/wA4LHT7qW01iO5uwg9GD1FlZ+FuECg3ECRqxm+MttX/AIXFXpFv63oR+tQz cV9Qjpypv+OKr8VQmo9bD/tp6Z/1HwYqzPVv0hd2+uQ6JPEmrNYejZTSMfTjuiJxH6hQOyhXILUB PtirzXSvy4/O7QdFTRND812Vtp+mWNxb6SgiQq9w1xI9u8y3FrdyxxxQyBOImf7C7mrVVTC30388 76PWbI+YIrK6s5LWG0vvq0KRySfo2Se4aIy2soeI3tzBHXh9iJqEPyGKoUeVf+clX5O3nLTIHS7D QRrbxSxtaF5GZZq2Ubs6r6SrwZKjlU1o2Ksj/Q/5xf8AKq/0b+nbD/lY/wD1evTX6nT63z+x9X4/ 7y/B/c/a/wCCxVnuKsU1O0tLuLydDdQx3EJuwTFKodSRpd3T4WBGKpz/AIY8tf8AVps/+keL/mnF Xf4Y8tf9Wmz/AOkeL/mnFVkXljy36Sf7ibP7I/494vD/AFcVYJ5086+TPLV7fadH5TGoajaQGeNU t7ZIZWCq/pLJ8bh6SCn7unvirH1/NPy1dNJPpXkiCeF4pZ7e5njEMc1vbSXA5KUtZ25tGkcqx8a8 ZPbdVlX5fa/5a83z30X+GrKxNksRNUVy5lQMVCvBCfgqOXhVa7mgVZjJ5Y8t8R/uJs/tL/x7xfzD /JxVf/hjy1/1abP/AKR4v+acVd/hjy1/1abP/pHi/wCacVSzy75a8uNp8pbSrMn67fCpt4jsLyYA fZ7DFUz/AMMeWv8Aq02f/SPF/wA04qsPljy0JlI0mzrxYV+rxdyv+Tiqp/hvy7/1arP/AJERf804 qx3z9deW/KPlmfXX0KyuY7d4kkRogihZZAnImKC4k25dFjNfxxVvyFP5Y81+VrPXI9Fs4VueY9IQ q9DG5QiskML1qu9UG+Ksh/w35d/6tVn/AMiIv+acVWDy35d9Vh+i7SnFf90ReJ/ycVX/AOG/Lv8A 1arP/kRF/wA04qlHmfQ9FttPtprfT7aGZNS0vhLHDGrCuo242YAHFU9twU1G5jDMUMcUnFmZgGdp A1ORNB8I2G2KovFUHeJS9sZAzgmVkZQ7BSvoyH4kB4ncdxiqMxV2KuxVimprdtF5OFrJHFN9bFHl jMq0/Rd3X4VeI/8ADYqnP1fzL/y32f8A0hy/9lWKu+r+Zf8Alvs/+kOX/sqxVZFb+ZPST/T7P7I/ 485fD/mKxVq4/TtvC89xqdhDDGKvLJayKqjxLG6AGKpVN5nt4GeSfzTokSAIpd1CgEsVAqbzuTTF UVpurz6ozrpnmDSb5o0SSRbaEzFUlFY2PC7aiuN1PfFUZJb+ZOI/0+z+0v8Ax5y/zD/l6xVf9X8y /wDLfZ/9Icv/AGVYq76v5l/5b7P/AKQ5f+yrFUs8uweY/wBHy8b6zA+u33W0lO/1yav/AB8jviqZ /V/Mv/LfZ/8ASHL/ANlWKrDb+ZPVX/T7P7Lf8ecviP8Al6xVf9X8y/8ALfZ/9Icv/ZViqncfp22g kuLjU7CG3hUvLNJayIiKoqWZjdAAAdScVWWX6duLOC4t9TsJoJY1eKWO1kdGVhUMrC6oQR3GKq/1 fzL/AMt9n/0hy/8AZViqwW/mT1W/0+z+yv8Ax5y+J/5esVX/AFfzL/y32f8A0hy/9lWKpR5nh1xb C1Nzd2skI1LS+aR20kbH/cjb9GM8gG/+Tiqfx/8AHVuP+MEH/E5sVRWKoW9/3psP+M7f8mJcVRWK uxV2KsR1nULXT7fyfc3RYQreKCUjeVqnS7sD4Y1dvwxVMf8AG/l3/flx/wBId5/1SxV3+N/Lv+/L j/pDvP8Aqliq2Pzt5eEagyXFQAD/AKHd+H/GLFWJeY9F/LbzBr0OuX8l/wDXoQqKY7S4UFFVl4km 3Z+JDnYNiqCsfI35by6tFdwT6rcXthCi1+rXBPCVgWLqLYD961uCfkaUGKsl8p6Voflppzb3Gr3n rRwwgXdlM3prCGPwGK0iPxu7OwJI5E0p0xVPLnzNpcUYaRLtFLxoC1leAcndVUf3XUsQBiqt/iGw /wB9Xn/SDef9UcVd/iGw/wB9Xn/SDef9UcVSPQvOGhQWc8UrXKyC9viV+p3e3K8lI6ReBxVMf8b+ Xf8Aflx/0h3n/VLFVp87eXvUU+pcUAI/3ju+5H/FWKrv8b+Xf9+XH/SHef8AVLFUDrnmDyrrOj3m lXM95FBexPDJLDaXaSqHFOUbGFuLDqDTY4qt0DzB5W0bRLHSoJ7ySGyhSFJJrS7aVggpydhCOTHq TTc4qmH+N/Lv+/Lj/pDvP+qWKrR528veox9S4oQB/vHd9if+KsVXf438u/78uP8ApDvP+qWKpX5i 816Le2dpa27zGaTUtMCB7W5jXbUIDuzxqo6dzirJ4/8Ajq3H/GCD/ic2KorFULe/702H/Gdv+TEu KorFXYq7FWDebv8Ajl+Uf+Y1P+6ZdYqgpfUEb+kAZOJ4BunKm1cVYBf6t+cjKr2ei2i8at6TPFVy sctFc/WSArOI/s7/AMFV0l/+cNvFMqadaXjvJcekxaJSi0lMBr60YYV9JaFa9anwVZvp/wBb/R9t 9c/3r9JPrP2f7ziOf2fh+14bYqnnkv8A47mrf8w1l/ycusVTHWP8V/4l0f8ARv8AxxP3v6U/uadP h58/3v8Aqel3+1tiqL8yf8c+H/mNsP8AqNhxV57+aFnrtnLazXvnW907Tr66uo7aK0gigEHq2riL 1J0ntHeODiXoSzE1O1AyKsT8kapeeZPMy2WneddXl+sMkoS5iKxelYzpeSIvDUGkUyx3McLNw3VW rsRirOo/7+9/5jr3/qKlxVUxV2KrZTIInMQBlCngD0LU2rirzvUNV/O30oJLPR7L1SUd7f8Ad0AC /vEkka76EnYovbwxVttQ/OmGxkhXTLW5uG9X07ktCrrVZzGeHrKho3ogfTXxCr0G39b6vF6399wX 1aU+1T4unviqpirsVQmo9bD/ALaemf8AUfBir0WP/jq3H/GCD/ic2KorFULe/wC9Nh/xnb/kxLiq KxV2KuxViOtada6hbeT7a6DmFrxSRHJJE1Rpd2R8UbI344qmH+BvLn++7n/pNvP+q2Ku/wADeXP9 93P/AEm3n/VbFVsfkfy6Y1JjuakAn/Tbzw/4zYqlHmO2/Lzy2ts2sS3duLx/Tt+NxqUvJqgUPpO/ EVcCrUG+KsVtfzA/LmC51BrGx1prm3NvFeol1LGwR0lljkLS3kaGMUccg2xr4GirO/Lv6E1/T2v7 M6lHbiaWFDNe3QL+i5QuvGdxxJHzHQgEEYqjrryxpcsSpK926iSNwDfXn2kkV1P972ZQcVWjyfoI vjqAjnF+YxAbv63desYg3IR+p6vLhy341pXFUR/h6w/37ef9J15/1WxVItD8naFcWk8sy3LSG9vg W+u3YrxvJQOkvgMVTH/A3lz/AH3c/wDSbef9VsVWnyP5d9RR6dzQgn/e287Ef8XYqu/wN5c/33c/ 9Jt5/wBVsVS7zDoXlHQdCv8AWryG8e106CS5nWK8uy5SNSx48p0WtB3YDxOKonTvKXlm90+2vI47 r07mJJk5Xl4GpIoYVHrdd8VRH+BvLn++7n/pNvP+q2KrR5H8u+ow9O5oAD/vbedyf+LsVXf4G8uf 77uf+k28/wCq2KpX5i8p6JZWdpdW6TiaPUtMKF7q5kXfUIBukkjKevcYqx//AJyEhtpvyz80Q3N7 a6dDJb6epvL6OWaCMm92LJBFcy1J2UrGaNQ4qyL8n9KttL/LHy1a21xFdxNYxXH1q3iWCGRrlfXZ 441htaIWkPHnGHI3erVOKsmvf96bD/jO3/JiXFUVirsVdirFNTa7WLycbWOOWb62KJLIYlp+i7uv xKkp/wCFxVOfrHmX/lgs/wDpMl/7JcVd9Y8y/wDLBZ/9Jkv/AGS4qsiuPMnpJ/oFn9kf8fkvh/zC 4qh76x1DUAgv9E0y7EdfTE9w0nGpBNOdoabqPuxVBP5cjkWaCTyxorwSqoliZwUYfEPiU2dDsxG/ jiqPsLXVNOg+r6fo2m2dvyaT0YLh4k5ueTtxS0AqzGpPfFVaS48ycR/oFn9pf+PyX+Yf8uuKr/rH mX/lgs/+kyX/ALJcVd9Y8y/8sFn/ANJkv/ZLiqWeXZ/Mf6Pl42NmR9dvut3KN/rk1f8Aj2PfFUz+ seZf+WCz/wCkyX/slxVYbjzJ6q/6BZ/Zb/j8l8R/y64qv+seZf8Algs/+kyX/slxVRu01q8tZbS7 0rT7i1nQxz28t1I8bowoyujWpDAjqDirdtJ5hjt4o49OskjRFVFW7lAAAoAALXbFVX6x5l/5YLP/ AKTJf+yXFVguPMnqt/oFn9lf+PyXxP8Ay64qv+seZf8Algs/+kyX/slxVKPM82uNYWoubS1jhOpa XzeO5kkYf7kbfopgjB3/AMrFWN/nzDaT/l75hgu9Kutahmi02P8ARtjKYbmV3v8AjH6TiK4+IOQa em3Lp3xVlX5bTpP+X3lyWOzm0+JtNtPSs7mRZpY0EKhA0ihQx49+K/6q9MVTm9/3psP+M7f8mJcV RWKuxV5v+V2u+eNS81+c7fzDLcvpljetFokdzZraqsIu7taxyiOP119NI15BnHw1rVsVT3U7u0tI vJ011NHbwi7AMsrBFBOl3dPiYgYqnP8Aify1/wBXaz/6SIv+asVd/ify1/1drP8A6SIv+asVWReZ /LfpJ/uWs/sj/j4i8P8AWxVf/ify1/1drP8A6SIv+asVSS2u/LUfm++1ttb05jcWVvapArxrIgjk lcs8vqnnzLbAoOPHbq1VU7/xP5a/6u1n/wBJEX/NWKrJPM/lviP9y1n9pf8Aj4i/mH+Viq//ABP5 a/6u1n/0kRf81Yq7/E/lr/q7Wf8A0kRf81Yqlnl3zL5cXT5Q2q2YP12+NDcRDY3kxB+13GKpn/if y1/1drP/AKSIv+asVWHzP5aMygatZ14safWIuxX/ACsVVP8AEnl3/q62f/I+L/mrFUHrOreX9Q0m 8sU1ewRrqF4Q8zxTRgupWrxeonNd915CuKqHlm/8v6R5e03S31q0uHsraKBp/Vij5lFALcObBa/y g0HQYqmf+JPLv/V1s/8AkfF/zViqweZPLvqsf0paU4r/ALvi8T/lYqv/AMSeXf8Aq62f/I+L/mrF Uo8z65otzp9tDb6hbTTPqWl8Io5o2Y01G3Oygk4qkf506rruk+TNav8AQbj6rq0Q0sWs/qxwBWfU Ah5SSkRhSGo3I0K1B2xVlHkXUb/UvJWgajqDiW/vNOtZ7uQNG4aWSFWdg0IWI1Yn7A4+GKple/70 2H/Gdv8AkxLiqKxV2KvHfye/Le90Xzd5j1280W58vx3k4l0+2WW1ghaFnuAsEttp1zPbTejG8bK7 xqwYkDlQsyrPbnr5N/5ix/3S7vFWS4qoX8lzHY3ElqgkukidoEapVpApKg03oT4YqpaNPc3GkWM9 1H6VzLbxPPFQrxkZAWXi24oexxVGYqldv/ylGof8wVl/ydusVTTFXl2pfmN+ZLRs1l5NljME6AxS LPMZ4eSMTG3p26o/AsAGqOXemKpz5H8y+fNS127s/MGlraWCWiXFtcpaz249R55E9EtLLKHZY0Vj sp3rShGKs4xVK/Lf/HPm/wCY2/8A+o2bFUNp2s65P5s1bTLnTHt9HtY4DpupEHjcSFeVwK12Ceog XYVIbrTZVAec/wDjq6Z/xgu/+J2+KpPirsVYX5q8/axo2sfo7T/LlzrKqsRlmt/WPp+tyoXEcEwC jh/NX2xVKJPzN822Gn3V/qXlmQW1sgdn43FuqhbcSuxaSJvhMh4D4du++2KvSLeUywRylShkVW4n qOQrTFV+KoTUeth/209M/wCo+DFWS+dPJWkec7LUNB1WS4is7iCAs9pKYZAwebif2kbidwHVhWhp UDFU90TSoNH0ax0m3eSWDT7eK1hklKmRkhQIpcqFWtF3oAMVX3v+9Nh/xnb/AJMS4qisVdirxv8A 5x68neYfLk3mF9U8l2vk+3vVsfqa295JeSTiFZQ/qmS7u+PDmOICp9rflSoVZzqcEk0Xk6OO4ktm N2D6sQjLCml3e37xZF/DFU5/RN//ANXq8/4Cz/7J8Vd+ib//AKvV5/wFn/2T4qsi0m/9JP8Ac1ef ZH7Fn4f8w+KoDVr7TdHeKPVfNr2Ms9TbxXD6fG8vGgIjRoAzmpGyg4qx2Xzt5LtLyS7l823izXEa QiltGzSCESyhEQWZLMFZ2oor92Ksi0G8t9fsmvdK8wX09ukslu5aC3hZZYjxdGSW1RwQfEYqj5NJ v+I/3NXn2l/Ys/5h/wAu+Kr/ANE3/wD1erz/AICz/wCyfFXfom//AOr1ef8AAWf/AGT4qlnl3Sr4 6fKRrF4v+m3woEtO15MK72564qmf6Jv/APq9Xn/AWf8A2T4qgb3yqb26gkudVvJHhSRYzS1WgcoW +zAP5Biqz/BNt/1cbz/p2/6o4qoah5Y0vT7Ge+vNVvIrW2RpZnpAxCqKmirAWY+AAqe2Ku0/ytp9 9Y295Bqd60NxGskbFYEJDCoqrQBl+RFcVV/8E23/AFcbz/p2/wCqOKtDyXb8yv6RvKAA/wDHv3r/ AMU+2Kt/4Jtv+rjef9O3/VHFUt8weVYLK1s7lb25laPUtMIjk9Dia6hAN+ESN38cVZXH/wAdW4/4 wQf8TmxVFYqhb3/emw/4zt/yYlxVFYq7FXYqxTU55IYvJ0kdvJcsLsD0ojGGNdLu9/3jRr+OKpz+ lr//AKst5/wdn/2UYq79LX//AFZbz/g7P/soxVD6fr91dWFtdQ6NemGeJJYyWswSrqGGxuPA4ql2 vaNpmvvE+reWby5aGnpEzW6UowcfYul6MK4qlDeUPJ0+otbv5RumuLVUuVrPD8H1h5hyU/W9js67 dF+EfDtiqf6Ha22hWklppPly7tbaWeW6kjWS1YGadzJI3x3LU5Ma0Gw7Yqib7X7q2hWSXRr0K0sM QIazPxSyrGn/AB8fzMMVRH6Wv/8Aqy3n/B2f/ZRirv0tf/8AVlvP+Ds/+yjFUs8u6rfDT5QNHvG/ 02+NQ9p3vJjTe4HTFUz/AEtf/wDVlvP+Ds/+yjFUO+v3S38NqdGvfWlillQcrOnGNo1bf6x4yLiq I/S1/wD9WW8/4Oz/AOyjFULqj/pXTrnTdQ8v3dxY3kbQ3MDPaAPG4owqLkEbeGKpT5f816NaaFp9 tp2l3kWnw28SWkZMLFYgg4Al52Y7eJxVMP8AGtt/1brz/p3/AOq2KrR50tuZb9HXdCAP+PftX/i7 3xVd/jW2/wCrdef9O/8A1WxVLPMHmmC8tbS2WyuYmk1LTAJJPR4imoQHfjKzdvDFWVx/8dW4/wCM EH/E5sVRWKoW9/3psP8AjO3/ACYlxVFYq7FXYqxq56+Tf+Ysf90u7xVNNf0dNY0xrFpTCGlglEgB JBgmSYbAr1MdMVTHFUr8q/8AKL6P/wAwVt/yaXFVLyv5fn0WHUUnvWvpL/ULm/8AUZOBQXD8lhHx NURrRQfDFVW3/wCUo1D/AJgrL/k7dYqoav5cOo+YNE1UyQLHo7TyGJ4OczvNH6a+nOHQxBQTyXiw bbpTFVfzJ/xz4f8AmNsP+o2HFUXqVkt9p11YsxRbqGSBnG5AkUrUfKuKoXyzo8mi+X7DSpZ0uXso VhM8cKWyPxFKiGP4E+QxVry3/wAc+b/mNv8A/qNmxVTtPL31fzVqOvesh+v2tta+gsfFh9XaRuby cjz5erQDiONPc4qqXH/KUaf/AMwV7/ydtcVQ3nLyzN5i0yCyivTYNDd292ZfTEwYQSBzGULL9qmz fsmjDcYqnuKvLdA/44Wnf8wsP/JtcVSzzb5f1nWRbR6dq0mkpGs4nmiMvMmROCUWN4q8TU7tt233 CrHovyu1mK6ku18z3JuGcSLJxkDAiVpCOXrtsylY28VFOmwVZR5P0zWtN0KK11q6F5qAeRpJlkll WjOSqh5iZDQeP0bYqj9R62H/AG09M/6j4MVeh28kcmqXRjYOFihRipBAdXlqpp3FdxiqMxVC3v8A vTYf8Z2/5MS4qwDyprPmDV/OV7Fb+Z0v49J1G5j1rRwiJbxWTidLL6vWxhneb1I1Eh+tOg4vuahV Vek4q7FWH63Y2N9H5Ktr23iurdr4FoZkWRCRpN4RVWBGxxVOP8GeT/8Aqxaf/wBIkH/NGKu/wZ5P /wCrFp//AEiQf80Yqsi8meT/AEk/3Baf9kf8ekHh/qYqwTzo9zpl7fWGgflzZag0UBey1BrUPDJO FVhG0aQLsefHkJex2xVIBf8Am289SW0/LexsYpIpp7Y3WlerJxiknMUEkQktykskPoGpbjy5r1+y qyn8vrFtZnvk8xeTbDTEgWL6sW0sQeozIGlFXaVTwJA261IFeJJVZjL5M8n8R/uC0/7S/wDHpB/M P8jFV/8Agzyf/wBWLT/+kSD/AJoxV3+DPJ//AFYtP/6RIP8AmjFUs8veT/KT2EpfRLBiLy+UE2sJ NFvJQBuvYCgxVM/8GeT/APqxaf8A9IkH/NGKrD5M8n+qv+4LT/st/wAekHiP8jFV/wDgzyf/ANWL T/8ApEg/5oxVjvn7RdO0byzPqOg+VLHUdQheIC0i02K6kZGkCvwhRrcuQp/34Kde2Kr/ACDpGmaz 5VstQ1nyvaafqMocT2kunx2zrxcqKxOZiNh15mvUdcVZD/g/yl/1ZLD/AKRYf+acVWDyh5T9Vh+h LCnFf+PWHxP+Tiq//B/lL/qyWH/SLD/zTiqS+a/Lfl2z060ubTS7O3uI9V0nhNFBEjrXU7YGjKoI qDTFWSW68NSukDOUMcUnFnZgGZ5QeIYnj9kbDFUZiqFvf96bD/jO3/JiXFXkP5a/k9rejfmj5n82 ahd6jYW95fzXdpaQX0bWd8txLdf71W6LyIiWZWjVj8JPKtSyoq9oxV2KsR1iG9kh8miymiguFvAV kmiaZKfoq7BqiyQnof5sVTb6r5w/6uen/wDcPn/7LcVd9V84f9XPT/8AuHz/APZbiqyK184ekn+5 PT/sj/pXz+H/ADG4qleq+ZLjSbj6rqPmjRba84eoLN7ST6wyGvxLCL4yMNj0XFUnm/MuyhuPTfzP p5mdQUhTSL+SRgHCEqiXDMQrSLUgUFd8VTfQvMepa67ppmtWUrRxRzt6mkX0H7uYsEIM1zHXdGUg bqRQ0OKprJa+cOI/3J6f9pf+lfP/ADD/AJfcVX/VfOH/AFc9P/7h8/8A2W4q76r5w/6uen/9w+f/ ALLcVSzy9a+bjYS8NS08D67fVBsJjv8AXJq/8fg74qmf1Xzh/wBXPT/+4fP/ANluKrDa+cPVX/cn p/2W/wClfP4j/l9xVf8AVfOH/Vz0/wD7h8//AGW4qh9Ql8zafZT3t3q+nxW1uhklf9HXDUVdzRVv CxPgAKnFVulyeZr/AE62vbTV9PktriNZIn/R1wpKkdw14GB8QRXFUV9V84f9XPT/APuHz/8AZbiq wWvnD1W/3J6f9lf+lfP4n/l9xVf9V84f9XPT/wDuHz/9luKpR5ntfMn1C0N5f2ctsNT0oyRw2csT mmpW5FHa6lA3/wAk4qyWP/jq3H/GCD/ic2KorFULe/702H/Gdv8AkxLiqKxV2KuxViWr31tYweT7 i5ZliW7AJVHkNTpd2B8KBm/DFU0/xhoP+/Zv+ka5/wCqeKu/xhoP+/Zv+ka5/wCqeKrY/N2giNQZ ZqgAH/Rrnw/4x4qkurQflxq2oR6hqNtJcXcZUpI0N6BVQVFVVQp2YjcYqgrTQPysbUle202eW7so ouDrBqMjojEhatxb7Zg3r9oipriqb+XrHyj5eM/6Js9RgFwsSSh4dUnFIF4JQTLIF26lacjuanFU zuvM+lwxK8qXiKZI0BNjefakkVFH9z3ZgMVVv8Q2H++rz/pBvP8Aqjirv8Q2H++rz/pBvP8Aqjiq TaB5q0WKymSV50cXt8SptbkEVvJSKj0/fFUy/wAYaD/v2b/pGuf+qeKrT5u0H1FPqzUAI/3mue5H /FeKrv8AGGg/79m/6Rrn/qniqF1TXPKWq6bdabf+rPY3kTwXMJt7pQ8cg4stVQMKg9jiq3SNc8qa VpVpplj6sFnZQpBbwi3umCJGoVVqyEmgHc4qjP8AGGg/79m/6Rrn/qniq0ebtB9Rj6s1CAP95rns T/xXiq7/ABhoP+/Zv+ka5/6p4qlXmTzLo93ZWtvBJI0smpaWFDQToNtRgP2nRVHTucVZJH/x1bj/ AIwQf8TmxVFYqhb3/emw/wCM7f8AJiXFUVirsVdirBvN3/HL8o/8xqf90y6xVBShzG4jbhIVIRiK 0NNjTFWAX+hfnDOqvBrlnBIlWRB9gOI5VUsRbAuCzxkqdtvvVXSeXfzWhimjs9ft39WS4as9TxWU SmPgTDIylGdNqkAL86qs30+G4h0+2huX9W4iiRJpKluTqoDNU7mp8cVTzyX/AMdzVv8AmGsv+Tl1 iqY6xpGv3PmXR7+zvfR0yz9X69berInPkKL+6UGOWvT4yOPVd8VRfmT/AI58P/MbYf8AUbDirzX8 z/KOh3Wp20N1c6xrM9zNc3E+k290ZvqsF1bvAbmO1FvdOqJTjHsqcqipLFXVY35I8lwap5mUXGhe YNHgnZJpbq9ZeH+gTpfwROsmnxrxea4Zf7ytI6fzYqzqP+/vf+Y69/6ipcVVMVdiq2USGJxGwWQq QjHcBqbGmKvO9Q8u/nNNFA1t5itYrlSjuPgWIMq0YcRacpFep2Zh2OKtt5a/N6KxktbfzBbMJPV/ eTFjKokWfjxk9BmFHkip4BNvAqvQbdJEt4klbnIqKHfxYChOKqmKuxVCaj1sP+2npn/UfBir0WP/ AI6tx/xgg/4nNiqKxVC3v+9Nh/xnb/kxLiqKxV2KuxViWr2FtfW/k+3uVZomuwSEd4zUaXdkfEhV vxxVM/8ABugf76m/6Srr/qpirv8ABugf76m/6Srr/qpiq2PydoBjQmKepAJ/0q68P+MmKsd85XHk 7yolm17Yahci9cxp9VuJW4UZF5SepcR/DWQfZqfbFWFR/mVpdu2pXFv5fuLX6n9XFxcS6teQRSQN HNL6iyxrJy9NkZeBFep7jkq9E8nTad5l0dtTQXcEX1ieCNV1O7lqIJDHViJE4tVTVabdiRQlVOLn y1pkkYWR7t1DxsA17eEckcMp3l6hgCMVVf8AD1h/v28/6Trz/qtirv8AD1h/v28/6Trz/qtiqS6D 5T0SaymklSd3N7fAsbq5qaXkoFf3ngMVTL/Bugf76m/6Srr/AKqYqtPk7QPUUelPQgn/AHquvEf8 WYqu/wAG6B/vqb/pKuv+qmKpb5k0by7omgahrD208yWFvJcNELu6XkI1LUqHcjp2UnwB6Yq15Z0b y9rfl7TdXW2niW/t47gRm7ujQSKG6l0PfuoPiBiqZ/4N0D/fU3/SVdf9VMVWjydoHqMPSnoAD/vV deJ/4sxVd/g3QP8AfU3/AElXX/VTFUq8x+WdHs7K0uYI5RNHqWllS1xO431GAfZd2U9e4xViP/OT M/oflL5sfirE2+mqA6LIPiv+NeLbVFdj2O+Ksp/JbTl0/wDKjyrEBxaXToLqRfShgAkukE7gRwRw oAGkP7PI9WLNUlVlV7/vTYf8Z2/5MS4qisVdirsVYpqa3bReThayRxTfWxR5YzKtP0Xd1+FXiP8A w2Kpz9X8y/8ALfZ/9Icv/ZVirvq/mX/lvs/+kOX/ALKsVWRW/mT0k/0+z+yP+POXw/5isVX/AFfz L/y32f8A0hy/9lWKoVJ9XbUZbFdX05r2KJJZLYWzmVY2Zgrsn1rkFJBocVRX1fzL/wAt9n/0hy/9 lWKrJLfzJxH+n2f2l/485f5h/wAvWKr/AKv5l/5b7P8A6Q5f+yrFXfV/Mv8Ay32f/SHL/wBlWKpX 5dg8x/o+XjfWYH12/wCtpKd/rs1f+Pkd8VTT6v5l/wCW+z/6Q5f+yrFVht/Mnqr/AKfZ/Zb/AI85 fEf8vWKr/q/mX/lvs/8ApDl/7KsVU7j9O20ElxcanYQ28Kl5ZpLWRERVFSzMboAADqTiqyy/TtxZ wXFvqdhNBLGrxSx2sjoysKhlYXVCCO4xVX+r+Zf+W+z/AOkOX/sqxVYLfzJ6rf6fZ/ZX/jzl8T/y 9Yqv+r+Zf+W+z/6Q5f8AsqxVKPM8OuLp9qbm7tZIRqWl80jtpI2P+5G36MZ5AN/8nFUm/OTT9U1H yZrtjpeiQeYr64i06OLSLn1PSl5XpBLGKS3deA+Pl6ihaVJoDirI/wAv01FPI+gR6jYR6VepYWyz adD6nCArEo9ICWsi8enFiSOnJuuKpre/702H/Gdv+TEuKorFXYq7FWKandR20Xk6WRZGUXYFIo5J m30u7/YjV2/DFU5/xDYf76vP+kG8/wCqOKu/xDYf76vP+kG8/wCqOKrIvMNh6Sfurz7I/wCPG88P +MWKr/8AENh/vq8/6Qbz/qjiqVW95oyeZrzU/U1CS7mtLeA2rWNwUiiR5WVkAtxIPUYtyJYhuI/l xVNf8Q2H++rz/pBvP+qOKrJPMNhxH7q8+0v/AB43n8w/4qxVf/iGw/31ef8ASDef9UcVd/iGw/31 ef8ASDef9UcVSvy7r9iunygxXn+9t+drK8PW9mPaLFU0/wAQ2H++rz/pBvP+qOKoefzXo0E8azG5 iZ1cor2d2pIUrUisW9KjFXf4y0D/AH7N/wBIt1/1TxVD6j5m8v3thcWn1u6t/rEbR+vFaz+onIU5 JzhdeQ7VU4qoaDrnlnSNFsdLgnupIrKFIUkltrlpGCKBydhEoLHqTTc4qj/8ZaB/v2b/AKRbr/qn iq0ecdA9Rj6s9CAP95brxP8AxXiq7/GWgf79m/6Rbr/qniqVeY/M2j3llaW0Ekpmk1LSwoa3nQba jAftOiqOnc4qkv55TxQeRNemlvLmwWJNMcXllEs1xGy3/JWRGntBUMBv6op13pQqsp/L25uLryF5 cubiSaW4n0yzkmlueQmZ3gQs0nN5W5kmrVdjXucVTa9/3psP+M7f8mJcVRWKuxV2Ksauevk3/mLH /dLu8VZLiqhfrdNY3C2jcLsxOLdyAQJCp4Gh2NG8cVUtG+u/oix+vf72/V4vrX2f73gOf2fh+1Xp tiqMxVK7f/lKNQ/5grL/AJO3WKppiry7Urv8+Z42MFnZWskU6NAsXohJYgyN6cpllnZSaMnJKda0 xVOfI8X5mx67d/4nlaXSXtEe2L/U6rdGeTkii2RHosXD7XL51rirOMVSvy3/AMc+b/mNv/8AqNmx VDaf/ir/ABjq/wBcp/hr6tafor+6r69ZPrP2f3v8n29v5e9VUB5z/wCOrpn/ABgu/wDidviqT4q7 FWF+atZ/Mq31j6v5a0eC+sVWIyzThVpz5cyrPcQByvEfCF+nFUok1n85LDT7q7l0yK7aJAUhKRyO eNuCeEVtNyZmn241O3T+YqvSLdpHgjeVeErKpdPBiNxiq/FUJqPWw/7aemf9R8GKsv8AMfl2LzAL zT3v7/TC8EJS90y5ktLmNiZ1qrpsdm6OCK70qBiqbaVp66dplpp6zy3K2kMcAuLhg80gjULzkYBQ ztSpNOuKuvf96bD/AIzt/wAmJcVRWKuxV2KsU1O1juYvJ0UjSKpuwaxSSQttpd3+3GyN+OKpz/h6 w/37ef8ASdef9VsVd/h6w/37ef8ASdef9VsVWReXrD0k/e3n2R/x/Xnh/wAZcVSPzLrHkvy1JBFq 99qEMt1/vOiT6lLyPIKAWjdkSrMAObDFWLXP5kfl9aXYmMGtNdXarBEqXU/KRoklmWOpuwo+EPQs QPfFWW+UbzQPNGlyajY/pKGOG5mtJI57645iW3fg+8VzKhFfBsVTiTy9YcR+9vPtL/x/Xn8w/wCL cVX/AOHrD/ft5/0nXn/VbFXf4esP9+3n/Sdef9VsVSzy7oFi2nyky3n+9t8Nr28HS9mHaXFUz/w9 Yf79vP8ApOvP+q2Koefynos1zFJMLmV40dUL3l21AxQtSsp68Rirf+D9B/31N/0k3P8A1UxVAa/p XlTQ9FvdYvop/qlhC883C5n5cUFSBylVa/MgeJxVEWPlny9dWVvdJFPwnjSVa3NwDR1DCtJPfFVf /B+g/wC+pv8ApJuf+qmKrR5R0H1GHpTUAB/3pue5P/FmKrv8H6D/AL6m/wCkm5/6qYqlXmTy1o9p ZWtxBHIssepaWVLTzuN9RgH2XdlPXuMVZJH/AMdW4/4wQf8AE5sVRWKoW9/3psP+M7f8mJcVRWKu xV2KsU1NrtYvJxtY45ZvrYokshiWn6Lu6/EqSn/hcVTn6x5l/wCWCz/6TJf+yXFXfWPMv/LBZ/8A SZL/ANkuKoXTNT8wXmm2l3Fp9oI7mGOVA15IGCuoYVpbHffFVt9p19qDI1/oel3bJ9gzztIV3rtz tDTfFUvXTEl1Ke0PlrSDLDFHOzNJVf8ASJZiaf6JWpdGZvc1xVNLO31axjaKy0jTrWJ5HmdIbl41 aSRuTuQtqKszGrHucVW6hqfmC1gSWTT7Qq00EQC3khPKaZIl62w25OK4qivrHmX/AJYLP/pMl/7J cVd9Y8y/8sFn/wBJkv8A2S4qlnl2fzH+j5eNjZkfXb7rdyjf67NX/j2PfFUz+seZf+WCz/6TJf8A slxVCyan5gXUoLQ6faepNDNKp+uSceMTxK1f9G6/vRTFUV9Y8y/8sFn/ANJkv/ZLiqjdprV5ay2l 3pWn3FrOhjnt5bqR43RhRldGtSGBHUHFUj0zztey6dayQaVBHA8MbRR/WWXipUFRQQUFBiqJ/wAZ an/1bYf+kp/+qGKrR5w1PmW/RsG4A/3qftX/AIo98VXf4y1P/q2w/wDSU/8A1QxVLtc8z315BZW0 tjFEkmpaYDItwzkU1CA/ZMKV6eOKsyj/AOOrcf8AGCD/AInNiqKxVC3v+9Nh/wAZ2/5MS4qisVdi rsVYhqup2FjB5RuNQnWxgivfTkkuz9XVX/Rl2KEy8O+KrvMWteQdc09bG61/SzALi3uHD3FtJUW8 yTcQC+3Phxr2BxVM/wDG/kv/AKv+m/8ASXB/zXiqWeWfOnk6Py3pMcmu6ckiWduro13ACCIlBBBf YjFUl8mw+SPLWpaleJ5r0ydL/gFiE0EZUISR6jmZ/UIrRTQU38cVTq386eTh5kvpDrunCNrOzVX+ twUJWW6JAPPqOQxVLtbufKGp+bNB15fN2nW8ei+vzs/Wtn9f1k4ikpkDRce/EfF0O2Kpj5g86eTp LCJU13TnYXlixC3cBNFvImY7P0AFTiq7zDr/AJI1nRrrTH8x6dCLlQBKLqBuJVgwNPUWu6+OKu8v 6/5I0bSYdOTzHp0qQtIVc3UANJJWkA3kbpzp13xVb5f86eTo7CVX13TkY3l8wDXcANGvJWU7v0IN RiqFsdR8l2vnDVPMY81ae41O1tbU2f1mAKhtTIefP1DXl6vSgpv4nFUVcedPJx8yWMg13TjGtneK z/W4KAtLakAnn1PE4qgPPN35N8z6OLBPNWmWcqs7pM80E6VkglgPKL1ow4pMdiaYqnlp5v8AJFta w26a/poSGNY1Au4aUQACnKRj27k4q850PzR5ZTRdPR9XsldbaEMpuIgQRGKgjliqWebbuw1kW0en ebrXSUjWcTzRXQ5kyJwSixyxV4mp3bbtvuFWOxeWdPiupLtfP8RuGcSLJ64DAiVpCOX1ltmUrG3i op02CrKPJ+sWOm6FFa615jsLzUA8jSTLeeqtGclVDzOZDQeP0bYqmlx5h0C6n023tdTtJ531PTeE UU8bu1L+EmiqxJ2GKvU7duepXThXCCOKPkyMoLK8pPEsBy+0NxiqMxVB3jVvLFArkrKzswRioX0Z F3cDiNyO+KozFXYq/wD/2Q== uuid:9C0ECDE40DD0DC11A72BA736C17DCD1C uuid:3F133E7013D0DC11A72BA736C17DCD1C uuid:81CE9475D0FE11DC88C2B553B10A7876 uuid:81CE9473D0FE11DC88C2B553B10A7876 endstream endobj 110 0 obj <>stream h,A E27PM6U2i;T&F:ߙݟ_~F h@Ou\jA*eIy8'n#r5U ԇC MX:ƒ)ƫShI?i{O*?1J#R_)A7E endstream endobj 111 0 obj <> endobj 112 0 obj <>stream hެYr}WpfyJ+u%+kW!.^dڵw䓒_93 RZ[w7Edz=jL W7&oL&ըHnFyQ8чm1ۼM&]fcWGwYu:$&~esKiܔ8K_G;#@b48xe*蜿l:w=(* Pq-^lXbuKl #MGe׉/'eseݶMFףʹIպq:. 8^x7S:\aVNQN'63 ̛$*Ho[3ZܘN | -k3‚fMxxMm3y'өU@gȕ+ lki 0x=_wXvsXPNhO;pL3*>zJŽ$1ryQ,a|4`pO(CX2Us0 ]s8lx0n8GT;t,9]АL'" h)|{ 3^GF(,хANBDCt2-B6DkbpLKq-'nFtDȲWkDH'raQ:Fa,4aw=8d#|hgpgflh8ٖINW j>V ܱ)C }S}sOn}>m3/h?.BHf9KUJzt Pl6K{e`zE,XcܠL9`Y3m[cNlaGhDD(os\R39X}hdL",s}{/Ƿ+b pV^Yؿs~e[M]u%?%(0tK@Rxv0vhj]](Fh(8q2 Ԡ$ˌŪ z~2ǁ2-9 idv.c W8a}ia>Ql>agV[&k-u.g Oa ur$ RϟzcqoN4yt=+9}p5np)6BmDÿ6JR) KoB{i0.$q,*dn3$>cKӚ=,PC,dfIK ;//g9{_VɧL%~ƇIWHX+W+HON d U1_yg a\Sz{W"ZKhh˵?㊼)#!du2~:gBR.Y iVhs8Ba{S'cIϒ)(|B'E.>wg}{>S0 z&v[L<ӟ́gh*y p4vf1]o_0GD7a/G1+Iשm?=],%G^Tx 0یnVraB'B`(xCxV4atMϨRSȜ{MIģv5K!%OaҪx&{` c0~HL.joSzInUk ,b yp)ykއc@]j "?>i#fUQ'=sEN劜41ː뵑ѻF6 .+F zDn'W-2k~{i-÷Mۢ{RJ%S:+e9~aU̓~Է?BA}:[h>stream application/postscript Adobe Illustrator CS2 2008-01-29T10:50:07-05:00 2008-01-29T10:50:07-05:00 2008-01-29T10:50:07-05:00 256 44 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXnX58tbL5Gt2u47Wa0XWdHNzFqDiKyeIajDzW6kZJVSEjaRijALXY9MVefeQ /PXnHTLLT/KejWVqserzX115fuRFPcWsFlDdXr3Iiq8JlgiCW62p+Dksi1HYKozSfzv86xw+WrSS 2ttYlvvL66le6gkTR87oWt3LKOEEkrj6vLaJDOIoG+Nj/dHhGyr0j8qfOeoebvLc2pX/AKBnhunt vUtU4wsEjjeqFZ7yNwDIV5RzMNt+LckVVmWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXNb 0zQ9IvNY1Wb6tp1hE093PxZ+EaCrNxQMx+QFcVRiOrorqaqwBU+xxVvFXYqhtT1Ky0vTbrUr6T0b KyhkuLmXizcYolLu3FQzGijoBXFVLQ9c0vXNLh1TS5jPZTl1R2R4mDRO0ciPHIqSI6SIysrKCCKH FUdirsVQuq6pYaTpl3qmoSiCwsYZLi6mILBIolLu1FBY0UdAK4qs0XWtN1vTIdT02UzWc/IRuyPE waNzG6vHKqSIyOhVlZQQRQ4qjcVdiqldXVvaWs11cyCK3t0aWaVtlVEBZmPsAMVUNG1fTtZ0mz1f TZfX0/UIUubSfiyc4pVDI3FwrCqnoQDirT6Lpj61FrTwctTgt5LOG4LN8EErpJIqrXgOTRLU0rt1 xVG4qg9Z1fTtG0m81fUpfQ0/T4Xubufiz8IolLO3FAzGijoATiq/TdQg1GxivbdJkhmBKLcwTWso oSPjhuEilTp+0oxVE4q7FUHrOsado2mzalqMphs4OPqOqPKxLsERUjjV3dmdgqqqkkmgGKqmm6ha alp9tqFm5ktLyJJ7d2VkJjkUMpKOFdTQ9GAI74qiMVdiqE1bVLXStPmv7pZ3t4KGRba3nu5aMwX4 YbZJZW3O/FTQbnYHFXaRq1hrGlWeradL62n6hBHdWkxVk5wzKHjbi4VhyVgdxXFUXirsVQGua7pm h6a+palI8dqjxRVjilnkaSeVYYkjihWSV3eSRVVVUkk4qq6VqdhqumWmqafKLiwvoY7m0nAIDxSq HRqMARVWB3GKorFXYqlXmvQh5g8razoJm+rDV7G5sTccefp/WYWi58Kry4860qK4qmcMfpwpHWvB QtelaCmKrsVdiqF1W3vrnS7y3sLoWN9NDJHa3pjEwhlZSEl9MlOfBjy41FcVS/yX5el8ueV9P0SW aK5ksYzG1xBE8CSfEW5lJJbl+bVq7NIeTVbatAqnWKuxVDanb3lxpt1b2VwLO8mhkS2u2jEoikZS EkMZKhwrb8aivjiqWeSfLR8s+WLLRGufrjWvqF7ng0fNpZXlb4XeZ+slKvIzHqzM1SVU8xV2KpZ5 n0C28w+X7/Q7qea3ttRha3nltyglEb7MB6iyJRh8JDKQRsRiqH8keWm8r+UdI8utevqB0q2jtReS IkTOsY4r8CbKANlFSaDcsakqp3irsVSrzTosmueXb/SElih+vRGB2uITcQlH2dJIg8JZXSqmjqd9 iDiqj5L8t/4a8s2Wieutx9U9T95HH6EY9SVpeEUXKT04o+fCNOR4qAKnFU7xV2KpD578pwebfK15 oM7xxpctBIGmi9eLnbTx3CCWHlH6kZeIB15Cq1FRiqL8r6IdC8taTohuGuzpdnb2ZunHFpfQiWP1 CKtQtxrSpxVM8VdiqW+ZtKutX8uappNpd/ULnULWa1iveHqmEzIU9QJyj5FeVR8Q3xVF2FjbWFhb WNqvC2tIkggT+WONQqj6AMVV8VdiqQeevKz+aPLc2jx3f1GV5rW4iueMjcXtLmO5X+5ltphVoqVj lRx1VgcVRflXQ10DyzpOhLN9YXSrOCyE/AR8xbxrHy4CoWvGtK4qmmKvn/yV5X0/UfJug6heXWpy 3l5p1pcXMp1TURzklgR3ai3AAqxrsMVTr/BGif7+1L/uK6n/ANlGKu/wRon+/tS/7iup/wDZRiqk fKPlwXC2xu9QFw6NIkJ1fUebIhVWYL9ZqVUuoJ9xiqnZ+WvKd8ZxZahe3RtZWt7n0dZ1CT0pkpzi k43J4utd1O4xVUk8o+XIpIo5bvUEknYpAjavqIZ2ClyqA3PxEKpag7DFVX/BGif7+1L/ALiup/8A ZRirv8EaJ/v7Uv8AuK6n/wBlGKsy0r8tvKk2l2csi37SSQRu7HVNS3ZkBJ/3oxVankn8uZNVk0iO 6mfVoYhPNp66zfm4SFiAJGiF1zCEmnIimKoz/lWHlD/fd9/3FNS/7KMVd/yrDyh/vu+/7impf9lG KoTTvyw8oy6fayyLqDSSQxs7fpXU9yVBJ/3pxVe/5beREuY7V3vVuZleSGA6xqQkdIyodlX61UhT IvIjpUeOKqv/ACqzyd/JqH/cW1T/ALKcVd/yqzyd/JqH/cW1T/spxV5/Y+TNHksreR59SLvEjMf0 rqW5Kgn/AI+MVV/8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8 EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRirv8EaJ/v7Uv+4rqf/ZRiqlH5R8uSySxxXeoPJAw SdF1fUSyMVDhXAufhJVg1D2OKqen+WvKepWiXmnahe3tnLX07m31nUJY24kq3F0uSpowIOKqh8o+ XBcLbG71AXDo0iQnV9R5siFVZgv1mpVS6gn3GKqv+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV 1P8A7KMVd/gjRP8Af2pf9xXU/wDsoxV3+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV1P8A7KMV SXzr5X0/TvJuvahZ3WpxXlnp13cW0o1TUTwkigd0ajXBBowruMVTf8uf/Je+WP8Atk2P/UMmKshx VgvnLyp531bX7eTS9V+p6IXsmvI0u7q2m4W7z/WY41gWn75Jk+L1FNUHscVYvffld+ZtzPFcDzAU uobSO1a7i1G7jmkAhtFdAzQTCEetbPKzoC0taNTqFUXF+V/nu3tb23svMD2ga+u7vTHjvbw+itzd WsqCRD8MlI47jkrhlLPX9pjiqJ8r/l551sPMWkX+r6q+oWenFpONzqNzeSIzQ3ULBVaC3ik5m4Q8 2AZQpUVHVV6dirsVZ5ov/HGsP+YeL/iAxV5L54/J/wA8ah5o13X/AC1q66fcasrxxuL++tJY1MFg ilHhSVYz6lk5bip5LxU9uCql5X8u/mleefL2+n1C7h0jT9YaSSO7u9SjiuIDc3hZYbeSNI3VYZIU VY29CgVuTNVQq9rxVC6T/wAcqy/4wRf8QGKvLPNX5afmRqepale6fq8cE8q3UVhcfpG+ilSK6vbS YCIpE4syltbNFSLkrMAzBubjFVLSPy4/N231ewu7/wAwfWYobrTp7wfpbUeMiwCl3/o6xRxcX/Yi qFZt3JHwYq9ixV5fpv8AxzrX/jDH/wARGKojFXYq7FXYq7FXnGqeSvzFu7u/MOuehbmaSbTil5do w5fX5IhIiIAqxyXduvDkyssW/ZcVQVj+WvnpNUjnudZZLeS8nuNR+rX90rXKvb2sCNKGiPLl9Xl/ dhlEXMcH+GmKoSy/K78y7TQLLT4PMrQz2tsloTDe3Sp6SvdsyR8o3VCVltkWT0yyBDx2ADKsl8p+ TfM2neaV1bVr365DHposkeS7nuZebRWYcenJHHEo9W1lcyLRpOYLCoxVnWKuxV2KuxV2Kse/Mb/y Xvmf/tk33/UM+KsE8l/8rz/wdoP6N/wx+jv0dafUvrP6Q9f0PQT0/V4fBz4U5cdq9MVTn/rIP/v0 v+5lirv+sg/+/S/7mWKu/wCsg/8Av0v+5lirv+sg/wDv0v8AuZYq7/rIP/v0v+5lirv+sg/+/S/7 mWKu/wCsg/8Av0v+5lirLdL/AOhoP0Zaeh/gj0fRj9Ln+luXHgOPKm1adcVRP/WU/wD343/c3xV3 /WU//fjf9zfFXf8AWU//AH43/c3xVD6d/wBDQ/o+29H/AAR6XpJ6fP8AS3LjxFOVNq0xVEf9ZT/9 +N/3N8Vd/wBZT/8Afjf9zfFXf9ZT/wDfjf8Ac3xVgdj/AMr/APqVv6X+FPS9NOHL9JcuPEUrTviq t/1kH/36X/cyxV3/AFkH/wB+l/3MsVd/1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/ AFkH/wB+l/3MsVd/1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/AFkH/wB+l/3MsVd/ 1kH/AN+l/wBzLFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/AFkH/wB+l/3MsVSbzp/yvP8Awdr36S/w x+jv0dd/Xfq36Q9f0PQf1PS5/Bz4V48tq9cVf//Z uuid:4596EAF480CEDC11945D974E704A7427 uuid:4696EAF480CEDC11945D974E704A7427 uuid:4496EAF480CEDC11945D974E704A7427 uuid:4296EAF480CEDC11945D974E704A7427 endstream endobj 114 0 obj <>stream hޜMk1C9$ vT7ŕ5;Yc4d^Lb!DC#1Gpv`2O]KZ1Dm,ݻz0H״kcPIƇ 7z$_*prU=h(Ba:a qoB+hFQi, Iu##mdG+V058E3G2U_/iͱݦ> endobj 116 0 obj <>stream hޔXMFϯбhvI6a {Yx|X+8%LFonJAz볞=77o-7:Ok3?e괚ZNldG?oNhu!]Z[^?l4 ſeQ,<)\ݵR[RܥM6c77&Om9+:-g,U]YouQ3tfF=l,6J]*1}w wr2s2O:>~ %],X5<R[$󒼳I,9š\ rߍI֊:%\hZiݸS!SS~}x.h`Yn0SVdVqt?-8ۼIF ވ5" =.lTL:&95]r5E,ܺܓk2V={U⧦ 6CW.tAf8?@EE%sBؑ+>ې4%[;ohy<ڹ{ܻ"bRAG8cuI(膬 _@(6JxhiDyY蔆Q`+wJL`CHP<3&--4wO#߁2S5OFE ȅ5͢M8 B5j+7fǝ_ṢsTx# Avr<h2"A¶?pPmjħv!p6uŦF=4_65 Ls4@3v=@m0@X L(=x'BTdπ??7CN<)BSvB[]nXuΔgr buSp }%a5%3p݋ZI؟>-ܕp{E_( * 7hr&sf{rfP tAibT*T~QTJ3j y v4 M:J-)im5um&&5g\#9aQM =OPk vwI=,)cVg.x1T]HbH8<`$^/f @ji0\m }KdѯRi29]5 7xg:Jʂ/mn@nJ4A-7oŤN( 6N2@KHCүhЖ+n MrunC-aԥ CtY,@$$4-#i鸔Qz:vu*$%"nuA`&t*QO`/$HE>ʄRK@9ByKT"kIv#-aބO!A,1E#mƒm+? ؉jz>/3Aj?C71~6<oauҖ7c3)˳ SpBRg3}^;$TȉB>PQC?-||1)@c燵\D?\_B6eL'K0~ :apG*M QfX}<uu=r2j.g* IʭI?~D_kdt_dJdz#oz9)B ̦<n>,n'Z endstream endobj 117 0 obj <>stream hެQK0G}0]FA݋cÜDhFA\Ceb)NARIapRty:(& s7OiZy2g{Cl!oǭE$*AV3c|Ke|5CI8]f`FVmf/ejgC&:"bʷB.epyUU9f)-333r!M^?c^yU"`]6mkiWCJt ʃ=a@iS^X<f̐y׶_ _1 endstream endobj 118 0 obj <> endobj 119 0 obj <>stream hެWMFW\,i?:kOCV she-!yIL.aDvwU׫W/ًjn-bE浵Ekc/r~?+aŏm)]MՅ5,7+*kڢ1 ncŷpO~[6_(B-frfb{seWEeFs,fgy+'gGq be,yhϋΏl=/*7/Z7غ(K&*?l[z[88齋4`dョ`9GV|*VV7|_v%n/W+^+nˇ饻>-R'v Tڐ*9W'P(>vzmմ,Uk4DxBoݎw2x_.JgIYkOf 3f$Mk0iSwR#:$IuԴKY&Fmʨ -Tr6Y`mS$EXBv`78d{[dϼ<EZ+ժ UIjR ^JgK:s13F4B-,9Tj}KGp}|i ъ HۢC(1Jy9˨EDHBa.r7X׍SE4LKir#ZՉ K?QAKR9`{6>`!" endstream endobj 120 0 obj <>stream hޜJ0@ez0$v/mou B+5&ni<›4 ``: glüeGM >S6 Ph؀JfG}=ަwW9xU8> endobj 122 0 obj <>stream h[[oF_Gr~ٷĎulXhmr p$'mъϜ9sߙ|?lrr QObA6O20WX!!7ovE0)E5M3ڳ-Srm0h|Y^(.ד戮T(bo(!j1i2 Zsƍ,&Ӗ^ $1p,&CE2E8v|29 -ezB3'5B hJ$+W[^ۋJp&Ws~nsr<Q+ס03LX3đ<9ea^9T|7yL|Vb|L P Ҫ &A2cL(u| eVrJQ\܇^rhLI}jwLZGA JgeB"XFm4RL]7=0P<Ί : ' u'a9B%>QN-j%^<;b!Lhh1\ؗ %Oj&%4Q[xwkÉ!sӔenmCU U7:wИ10iD`&pd`?h2ONzdufC;l<\K=,smY5zElEcD]yYByHVZv_I Ejdywbdn8wK~ZkUpdhq9:I6 uBeh)ꈥlԢTno=6!Aex'bkODwoynq~T* {Q-?%&m,g.F6XtYN^ܓh=9G:]4;ƴR S[O1Tb(&Eß~jΠE&t_tWHj^^m y{V au@fQOOԲlZʬMq.ƺҔuO`#/CĄ.6yU[]޴J_US1U0G<UKE٭AEcՊZcË͑A94<1=zxtRTY،4;5%Y7"$2mO4[%:+C5}ywоZћ.[[4=L ՝s~}}{kЮn>z:bbdk<:p ư8;xwzD?u|?7nto>ؚ  @#7Ԙq`&3E݃#ubnՉ"ҵ I~nT\-hb Fw:B ˓mV(B A?dN QW-|{ /[{^xƠJvgfHbO=* Yr`汙Ԛͼ#r yÞm×ٶڛy+gAޟym3o9&󎉌ȼh`qsv5;1laͽ$CAK65//.bC\c7i_.˗w#Z|ɑڅr -]X+`v z-4i훒賍Gɀ| tA&xС)a$QFKcl2rxמvC[\1KE{v9@ڽ^Nǂo;a,Dp_ijvU ۺ1nh)/ԠDvBCN9~Qwv‘O(älğ{e`LԈD3ĭu"b,-Xńca{rAn 8ІM&Ԏq a_h :1$=N @qN EZT'zh-h;[OMMa$hhOC2PN|z0=;W*2qR!7!ȧ.hՠdAAG: &H™&0rA4N:#I2A'/r@[$Jd'h'6|dӴ IM1 :TAZ>O+F3iMͰ GH"Ex9 Fv0tt>_畴n,[<+ޞ杇4Rjt:nΏӽw&Tk7Mj޸T´mw|ƿ|-[w Dy@ (FvH##BPn F\:. `Y7|syK{sqJY[5Ty* JyC/-:/p_+U*|/jR]c)4ܗOWO*dI[Ϊ@u{גO+kO W.ojNf3~ęi,L6"rWS endstream endobj 123 0 obj <>stream h|VyT2Aᥖi($-SQDE*Ȧ""*$ʢa`+%AkEE6eSd' "hۣw藾s~;gw~2߻0m-bvqpp\%xxNJyHv~гY6w=>MHxph/Ytwgb0mf?eC]$Dtrrz]PddɒRZ*N FDKDKbCfi44&TazJcCC(8IkpQ̞5V lDAb$F* F9+ FIw5 9"I1QPޱ 3F%^̠DOk JBc;{$ وġa5L1fafa1 cؗf氱EYb59`#90 ۀa1lYG0Lg:/?I$6Oa +u5euLֿ؎KA9;8=O5\{NzƲgΌyWw^=]uNMDY63i%j棕p8;|S?roXo5_HCj!2KDma@MZs0?9o.v`3ϭ9Q{⪎?!>m2䡡Is55Ok5aV<ElHIk񤮸gѯ 6F+jvCF Ve @ =3lA^_x]CE$o7HC`av04 3frt'ƽKWvIYL~z~v^V8jό2y#XfCgSGVCM0A01 siྈ#9TX.7sCq~WgEa^h>F]bojb DD.k28iddQLYEQqŻ)0Gl{RUo R*7P)$sk }VR +OU]>(t TqnaqQdBJBBJN: ~57m@='sVE'렯t*G` p!EڭF@a+^M^f,mxMk d'IDƫ \y*MP{&'|DݢvqJ.5^z(ueS._.O ?[G\G+*!,De?Z`_ZCп}*3\پy.wߵ'_dQ>Y; m:<p׬bs yc m,8^p9s2 .XKT)tID"@f}a87¦-'MqGRSI=}%@f聾~# 1B\pp̆YٶTrU @k4$TޗUr 2'm4*'5zϒj=PۑY4#30;r8"UPݿvSERm4j!w>_q1hKM:O`wd@vTWExvnM!R ?^c)Ci(q(O*wڞQ L!q#>*GJy$3uשs ͂_iJ ] ?O{Y 7?|(WS^w_Bn=8~6Fd)( 3*2ArϏ|hL> oL.do9#)#=lϿL:2H뎱o[ԓ'oAKw=//m=Gϕg7 Ƞۼ9hdw2gHHTNц| biMR88o>j ,p:pxLrσ607.iIedž7`ô' ˏ/%!Fh7,灮ͪ׌IG>rALۅa`-870 a;SA(>|lE@$"aoLEٕ_ j) 1 B)-7$("bD-uljTRNv6 ާK$1Ml_=r. d I\dj)ryNKrZYZwCc[~^Rh+2]OB+qcVXE渣&˫/0Aӏ]IXgS!}:;,_=Ìy|Tέp&U捚Œ暻5d/ӯ7 AT6AAhtK .ϻ/Gnn9E)eY)2Y v-`ªl:Y #@" ‘ 21}w r/-2C#SY-?V~,` vHDMLO 4g]S81!w h1A7߂; )&}m-EɸWo>ȫI]; SIƽAQPkm|*[u EKFsT.C67<*uPIsew@@ Sˉ{\)6tZ]a!&Tȟ? |kB`bʹ( W bb:p?GyJCmj o,@lUfj'S򜌓D*X3w!EM4R:o}䴃dHrp.e347o]=K*p"s <RP8MT2@`2y}Lu+t.Ozn-} _ⰄNXHJָVRPf2 PӁw Ð'X |P&ggYK2cWAT=eGpwoo49P/'^pd3Does)~LLpH(IL޸q?u4<]W_NP S სU O ;~_z`1\e>.bҳم.T.)PnxoJ ҹq{b(TmƸgݬaeR{ |t"*/]h:r,iJ7lDP{\\ڧ"g$ ȁ99S?1ql*:X1.Yt(z3guzO|EO endstream endobj 124 0 obj <>stream h\=o0wDXE5iː!w6M?|>'fg '?=NvxG>stream h|VyTYOU3#a4eWevEFM\٢0 M$AGAhV[h5"(D[igڙ[||;Ϋ{{clru_+Meb.ИLPfh/c;;͞pgǸIF*뜜l `%Yvh'&+$b8Y|,T!oA2\"K4Lpv]vDhΰc=woc5FrDġ,A)CFHʢq%Kc,% +I846b 7%<.!V!JkR&.clp<9.'ppqs8k8{ǝr8\xSAHgm?N1n!wHm4[w8xb\w|6u/&RvS#S{SOӎy&睞< yeǥlc&so6-W H:`fgo؈Xgn _ ;Agy"D$J>qHX3%+|">#؍o sr5E{ѮʞDȾ!thcAhvpQp:os8P/A"-?߮ʼn۱Ay'Й8QۈkA;Y [#f^c*I5m$`&79VѾq kn=_TCpHAƯCyeB(P}INc;$ aNRMvzvz7'>O ʓ'Ħ&|s~9ME-u:_v3,ZP]Z'bӪ-ۅhc^pM.=\-{XUVNT,~T?/;;ߟܺhP*J익 }>)(AJ!Zh8Ek&| HXp]@ӧ _7X";bia;p? ֜16A9Nԁb|rÉ~dE'`1 .1:.0zbC-| '߃;${`?uiVy^+p@Ȇ¹G1hS^ě  kƦ}m(2#;D#_O=dHVv69zuQ>tWNXm;+do`K s@,-}kV|BP[8\zRY"-fI"thԺ>p|̅)1C C<` $;h;{cWYq<%U4H?b4s%2<(w)ORЕ5F z)f*Xlc YiQL}OEuqţ`f`1 /O@̩ДfU{;.?Kݼ^Av[[uculAa8\c.߇LSy+ "tl SA~N" ~ v9WSZ>yݥ{߉|!sķXJ:*z?vhSzw"B'ȅR3ӑ~!ɴ[Zu pSG >=5ŔkFqz=˚ӵ]:| 0-D 0";rS'$Bmavpۑ+#R;d~5\ T#˃`sFڱj;?RGId" ,).;54s'y-2I5j_϶G񳹂[|OEO OW䴒j͢%h4ZM[ٴD{V.8;΂.p?Nd=cv l,OĀqh8U_ܺ"Bo1z'T%2bFh[z\%6 =flP\P$2VI6E`H Q'8vz-uwHle?O\1 :BM6zTz{m/gwctfnV^H V2n={V*eQi{U`ӽy5MYNb}Id9⢕hVI^-8X]d !jRjHdl%Wh 0jsq8`pUU[S2(X`Fםӏn (JuR$TK7Xvs_B8 D&W]P*  ٢?#-C˦VʧwJ cXjtҗqk*Z-~ vY uӃR3tVX]pQIJ*=pp^s"0H-.@YpW7`o$&eA ;t\^][~JU…hZg Z *gXfQ zbTg1-xt>Rr H /PMuȁڀ48u|pjK%$%ęĽ ޤspȾxCoa[&\G4G50@<5P`YG6FAoxnՒhMp{S0}ĭ_9!DV*X M?7.uB\_5,) .<53AĿa<>Q37B<(H̙::U%'ܣ{9J]!zHdآ6h4*XX2[t۷=Oip" Y-De|kfgq =3z>Uq?f9f0`8 endstream endobj 126 0 obj <>stream h\Qn0 St2&Rtpd5P˂ T>zsq9 v41X4$+8aq(BN0_]'WBs-v랈OM@YB?V=f;yLP+r-IrUZDšUP&KePQf^B## Ĕ0Eg30972<V`XQd"&2Db͝OQB8 guICe19䥾h) endstream endobj 127 0 obj <>stream application/postscript 2010-12-07T16:28:47-05:00 2010-12-07T16:28:47-05:00 2010-12-07T16:28:46-05:00 Adobe Illustrator CS4 184 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAC4AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq89/M/wDK+/8AN+qaTq1jq36OutFgvUgiVOLyS3Kp6bJeKTLaFHhWskaM1PaoKqRaf+Snni0n il/5WRqfBQHntws3CWdrtbqaR/8ASQPjoY6Rqg49vtBlXr+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV hOmfmtpl/wCZLrQ10jUYPqdxLaXGoyC0a2SSITsOaxXMlwnqJaO6hogePFiArqSqn995jFvewWVt p13f3E8L3HCAQxlI0dUq/wBalt+rNsBXFUtuJrqfW7LWX8tap9csILi2gpJpnH07toWkr/pdetsl KHFUcfMOqggHy1qW+w/ead8/+WzFUq8xJd69BZQXWgatDHZX1rqK+k+kEvJZyiaNGMtxKQjOo5cO LU25AE1VVZ/zDtLe+bT59Nniv148rR7vSVmHNHlWsZveW8cMjjb7KseinFWO63+ZvkfzHompaHJO voX1tLb3bW+p6EZUilURuw5Xsiqf3gFSvUjFWT6Nrtwmj2KWGg6hc2C28QtLlZtMkWSEIBG4dLzi wZaGo2OKotfMOqsAR5a1Kh3H7zTv+yzFUp8sx3vl+wmsrfQ9auo5ru6vWkuptLeQSXk7XEihkuY/ hDyNxrU++Kpja+ar+6jaSHy5qTIskkRPPTh8cMjRuN7vsyEYqlmi2suj6prWpWvl3V2uNduEurxZ JdMKLJHEsI9MLdLQcUFa1Pviqcf4h1WpH+GtSqN/7zTu/wD0eYqkv1Of/Gf+Lf0Drf1/9Hfoo2v1 jTfqvo+v6/qel9ar6nLbly6dsVVb/wDMzS9OupLXULOSzuYl9SWCe90iJ0Tg0nJle+BA4Izb9gT2 xVvVz+nhpct35a1GeDTryLU7VRJpbI80SOIWJN0xojOJFKEHko341BVTQ+YdVAqfLWpdh/ead32/ 5bMVSLzzpjec/K935c1Ty/rMFjemIzSWs2lxzD0ZkmUKzXUgFWjAO3TFU3u/NV5YWU15deXtRitL WJpp5S+nnjHGpZm4pdkmijoBirIcVdirsVdirzfyN+W+o+VI/MerazqNvqWpa7bRtqD2lvJakyxf WJJHZ5Z7kOzfWOIIRAAo+HFU+mi1c+cbRYbiGKcaZN6rTRmcH/SI6U4Na/qxVOPq/mX/AJb7P/pD l/7KsVWPb+ZOSf6fZ/a/5Y5f5T/y9YqgPMljeT+X9Si1u8sZNGa1m/SSNZ3BBt+BMoIS65kcK/Z3 xV4R9V/IXS7yW402zilu47S5hZI7TUoZBHJK1rd26293qEDiXjPIW+CoTka0xVrUb38qJUjmvPLk 0NvPCYzM9s9oI1tDPH9WeNtXhkiVP0a4KcBGOK8qbYq970Gy1iLQ9Oisbu2isY7WFbWKa1nkkWJY 1CK7veSMzBaVJYk+JxVGRW/mT0k/0+z+yP8Ajzl8P+YrFV/1fzL/AMt9n/0hy/8AZViqWeXYPMf6 Pl431mB9dvutpKd/rk1f+Pkd8VTP6v5l/wCW+z/6Q5f+yrFVgt/Mnqt/p9n9lf8Ajzl8T/y9Yqv+ r+Zf+W+z/wCkOX/sqxV5r508ueW5vzE0Gy1tBc6/5mW4+p3MKX0cCHS7diHlWPUYlRo0uX9J1SoZ iQQxrir0Sz0zXLO0gs7W7sYba2jWGCJbOUKkcahVUf6V0AFMVXyW/mTiP9Ps/tL/AMecv8w/5esV X/V/Mv8Ay32f/SHL/wBlWKpN50g8wjydrpkvbRkGnXfNVtJVJHoPUAm5an3YqyM3Mq3ot3RRE0by JKGJPwFAQylQB9v+Y4qvs7y0vbSG8s547m0uUWW3uIWWSOSNxyV0dSVZWBqCMVUb7WNJ0+W1hv72 3tJr6UQWUc8qRtNMekcQcgu5/lXfFUXiqF1b/jlXv/GCX/iBxVhXne5jg84WBe6e1DafOOSTPBX9 /HtVGSuKsZ8weZ9VsYozo4m1iVw9U/TBtgjChXm0kh+Fvi3UEg02oahVjX+OfzOkhlYaKIJhOvoo +vCQeirQh91mXkXVpip+HjxFVOKo2Dzp57mms45dMNoks8K3s518ziGFnf1mCh4mcqirT3boeO6r KbnVrYG2H6YmCNd2qyn6/N/dNcxrJU+rsOBNT2xVkWuXegQ6LfzaRqiXOqx28rWFvJq84SScITEj E3MYoz0H2l+Y64q7Q7vQZtFsJdY1VLfVpLeJtQgi1ecxpOUBlVf9Jk2D1A+JvmeuKsK80y/86tYX +nefLrSbyaytoPqltKt9O95KULSiKe4QsVXlyQEUWrdsVY/5W1nUtU8zJpsvnfzBFYywJdpd39it nCqwEwS28lw1z/fTsolA9IUU7bbBVmVrqGnRm5S31eQQi7u/T438xFDcyGtfV3r1riqv+lbX/q8T f9J83/VXFWv0paVr+mJa/wDMfN/1VxVI/MPmzX7KRU0W3l1cMqt6ra39VRTyIZW5u71pQrRSDvWl N1WPXHnn80RflYNFR7NZpOMj+YOLtAqsEFBKeLO6q5begPHjUcsVTbTfN/nG51WzgvbNtO05zIb2 7/ThuCgWBWQKiyRn4pmK132WtPi2VZOdUtD11iX/AKT5v+quKt/pW1/6vE3/AEnzf9VcVSvzRqdu 3lnV1GqyuTZXACG9lYGsTbcTIa18MVema1pbavHdafL61ta3Vlc2cl5CyLIv1lUXlETzIdQDQslK +OKvP7//AJxr/L68tvq/rX8SR2LaZaMJIJXtrU3bXarC88EzK0fqGFHJLCPavL4sVVbv/nHvyfqG nNbalcXEly15fX0d5EsIaKS+ngkpEk6XKoIobOKBR04chTfZVD+UPyJs9D8xm9kuZTYac+mvo7et FNcyvp8N1Dyu3+qQGjJd0ChnI40DhAqBV6fq3/HKvf8AjBL/AMQOKpJqF1Pb+d7cxWk12W0yYFYT ECv+kR7n1ZIh92Kpn+lr/wD6st5/wdn/ANlGKrH1a/5J/uFvPtfz2f8AKf8Al4xVf+lr/wD6st5/ wdn/ANlGKvLfMXlb8yZViub7zvrFjbxXFsYnWDSLULM8saLHyiuYlkWWairHKHrXj8VTVVX038v/ ADzYTaS0eva5PFZSLJqC3Uxna7peRXBHJ9V4x1hg9ChVl4u54knZV6X+lr//AKst5/wdn/2UYqsi 1a/9JP8AcLefZH7dn4f8xGKr/wBLX/8A1Zbz/g7P/soxVLPLuq3w0+UDR7xv9NvjUPad7yY03uB0 xVM/0tf/APVlvP8Ag7P/ALKMVWDVr/1W/wBwt59lf27PxP8Ay8Yqv/S1/wD9WW8/4Oz/AOyjFWM6 5+mLvzx5avIpr+wj0+K/ln0BJbQDUUdIoubqLxarau6t9hqMw6Yqyb9LX/8A1Zbz/g7P/soxVZJq 1/xH+4W8+0v7dn/MP+XjFV/6Wv8A/qy3n/B2f/ZRiqTedNUvm8na6raPdoG067BdntKKDA+54zk7 ewxVF+arG6nsdRh02dLDUrvS76OC/LGL05iiLFK8igsBGxry6jtirx4Hz9F6n6D/ADO0WwSe3jFn Yzaqmq+nOZ0IX6zfwTzSo0N2rB6KxZ413QLVVPNO078+9Vtb2/0/zxot9FJO50s2SwNa+hJFMU9R /qc7c0Z4GXixqvKtaglVGWvlf/nIOCxggHmjT2kgksKlgJPUhhilW8QySWbvWVjFRm5NVWbkvLgF Xp+rf8cq9/4wS/8AEDiqSagmoP53t/qU0MLDTJuZmiaYEfWI+gWSGmKpn9X8y/8ALfZ/9Icv/ZVi qXarf67YXWlQS3VvI2pXZtIWjsnKo/1eaflJyu1PHjAV+GpqRtSpCqY/V/Mv/LfZ/wDSHL/2VYql XmWz1qXTY47q4sp4WvLH92bWdfj+uRcGqt0D8D0anemKpr9X8y/8t9n/ANIcv/ZVirFvMH5iWug6 /Z+XtQ1iBdZvzCLS1j0u8cP67lF/fCf0F+yxIZwaD5VVYnB+f0JSItbXkcLyR2yTyaYiAzSNbqq8 W1ESU43sUgbhxKGqk9MVeq/V/Mv/AC32f/SHL/2VYqlnl2DzH+j5eN9ZgfXb7raSnf65NX/j5HfF UNo/mfUdW8w65oNteW63mgG3W9Z7M8G+tIzp6fG9Z6AIQSyjfYVINFW9S1rzJYao9oZ7OX9xFLz+ rSr9t5FpT6w38mKqP+J/MX89n/yIl/6r4ql+o+Yb63lGu3rWaPplvcUuPQnPpwScJJvhWff+4U9C dtsVYtP/AM5I+W4mhUataymZWkASwvKrGtsLsyENIp4+kynap36daKo7SPzzsdXuNOsYb2CLUNTH O1sprG6SSqJ6jqWErRfBxKllcryBAJpirK/8T+Yv57P/AJES/wDVfFUp83eZNfk8qa1G72nB7C5V uMEgNDCwNCZj+rFWWeYL2z0+31K+1XmdOt9PuriRkchlt4UVpwoRUZSR0PMnbamKvAl1r8hdN8qw WWoeStUsrYWEmq6rZJcy0tXa8jtbq3lkuLy2nkkW8sY0KcNyB8P2hirO9M/NbyJ5H8pJaWel6q2l aXc31rNKY7RCJLa6gS8nYtNBGU+t6hxrGKcg9FCgHFXal/zk75I0+0a9m0nWHsUSwdrmOG1K11O1 +t2ycTciQsUBU0WgYdaUOKvVdW/45V7/AMYJf+IHFWN64+kL51tP0lefU0/Rs3pt9ae05H146iqP HyxVE+t5L/6vf/c2n/6r4qkXmfVLO2n0ZNCukvo7i/ij1aWTWZEFvZEH1ZVDXcZZh2Ar8jiqe+t5 L/6vf/c2n/6r4ql2vP5QexiEWsF2F3ZEqNUnb4Vu4ixp65+yoJr264qmPreS/wDq9/8Ac2n/AOq+ KsO1rzDrKapd2ukWlrJp0If6rqc/mWUvMfqrvHS1EsfEfWQsbcpehr48VWPx6/8AmXFY+rL+ippy aLbW+qzEKiLdKSJJdWi9Tm0VuyVVNpCrUKkhV6XZXHlZrOBrzWVS7aNDcImrT8RIVHML/pDbBvfF UH5fm8nfUJeetcT9cvqD9Kzrt9cloaev3H34qmXreS/+r3/3Np/+q+KoaW3/AC/muWkm1SOSTgq8 21SYmgLECpn7VOKtfUfy6/6uMX/cTm/6r4qw7zJ6H+IksNOt7O+8uTrZx3E82p8jxmuSl/zV9QiP CO1+JaRsS23Fh0VZiLD8uAABqMQA2AGpzf8AVfFUNc6H+Vs1xb3Ut1bSXVqx+qzvqEjSRepRZPTY zVXkuzU6jFUT9R/Lr/q4xf8AcTm/6r4qlPm+y8gDynrRg1CNpxYXRiUalK9W9FuI4mY8t+1MVZN5 hj1pbPWX0AH9Lvp9x9TLRxKv10RD6rR5FVX+LryYqO9MVeZX+tf85IWOpS6RZWFhqAEMN3aXU91Z NdTGI2wuYwi/UFeHkzqz+hGfiFGX4cVRU+rfntoPlyA2GgaXPORKZLeUWtp/pN1fXTJsl9HAiiIQ BlDuxaWvN2VgyqJk8z/85AyXSz6XoGi6jo91qDCzuFnVP9xQZWiuTILuQSNNE+3FPh414nkAFXp+ rf8AHKvf+MEv/EDiqSag+oJ53t/qUEMzHTJuYmlaEAfWI+hWOauKpn9Y8y/8sFn/ANJkv/ZLiqFu 9T8wQT2UT6faFrqYxRkXklAwhkl+L/RunGM4quvtZ1XT4RPfxabaQM6RLLPfvGhkkYIiBntgOTMQ FHc4q868/eVPzau7e8uP8YPp+mTShUs7IpHJD60/pxelcRW8E/wLIoPKQ1I5eACqWeXfL/nvSvMm n6zd+Z73VI7aa7mv7G4vLn0bsXMIjiQxbwRLA/KRRHEBU0oAoxV6P/jLU/8Aq2w/9JT/APVDFVqe cNTVFX9GwbAD/ep+3/PDFV3+MtT/AOrbD/0lP/1QxVCaX5l1WztnhbT4HLT3E9RdONp53mA/uOwe mKov/GWp/wDVth/6Sn/6oYqtHnDU+Zb9GwbgD/ep+1f+KPfFV3+MtT/6tsP/AElP/wBUMVYT5ntf O2reddJ8xafrk+kWGniFbvQ4bl3tbpYpzK/MemgBlU8C3E7AfLFWbf4y1P8A6tsP/SU//VDFVr+c NTYU/RsHUH/ep+xr/vjFV3+MtT/6tsP/AElP/wBUMVSjzf5u1GXylrcTadCqyWF0pYXLEgGFhWno Cv34qzVoYl1mKRUVZJIJvUcAAtxaICp70xVjH5g/lP5c89Xuk3mrXN7by6M7SWwsplhDFnR6SVR2 I5RLShGKsLP/ADjdocPmvRLmwlkg0PSvqlw1ZYDMZ7AUijjhFnRY5HHqzt6/xuSeHLi6qvS/I/k3 SvJvlm08uaU80mn2RkMBuGVpB6sjSsKosa05Oei4qmerf8cq9/4wS/8AEDirEfNd1fQec7I2ly9s zadMGZFjYkevHt+8RxirH7rQILvzXZ+bbi4mfzDp8JtrO+/dApCwkBTgEEZB9d+q/qFFU2nutZnl t5ZNUnL2shlhpHbCjGN4t/3O/wAMjYqg9esptfs0s9WvZrm3jkWZE4wJR1BXrHGpoysystaMpKkE EjFUTqE2r39qba41SdomZHICWwNY3Ei7iH+ZRiqD/R93/wBXK5/4G2/6o4q79H3f/Vyuf+Btv+qO Ku/R93/1crn/AIG2/wCqOKu/R93/ANXK5/4G2/6o4q79H3f/AFcrn/gbb/qjirv0fd/9XK5/4G2/ 6o4q79H3f/Vyuf8Agbb/AKo4q79H3f8A1crn/gbb/qjirv0fd/8AVyuf+Btv+qOKu/R93/1crn/g bb/qjirv0fd/9XK5/wCBtv8Aqjirv0fd/wDVyuf+Btv+qOKpZ5osbpfLOrsdRuGAsrglStvQ/um2 NIgcVetSf8dW3/4wT/8AE4cVRWKuxV2KoXVv+OVe/wDGCX/iBxVgf5gR2D+b9O+uW4uFGnz8VMLT 0PrR70VXpiqU/V/Ln/VsH/SDJ/1SxV31fy5/1bB/0gyf9UsVd9X8uf8AVsH/AEgyf9UsVd9X8uf9 Wwf9IMn/AFSxV31fy5/1bB/0gyf9UsVd9X8uf9Wwf9IMn/VLFXfV/Ln/AFbB/wBIMn/VLFXfV/Ln /VsH/SDJ/wBUsVd9X8uf9Wwf9IMn/VLFXfV/Ln/VsH/SDJ/1SxV31fy5/wBWwf8ASDJ/1SxV31fy 5/1bB/0gyf8AVLFXfV/Ln/VsH/SDJ/1SxV31fy5/1bB/0gyf9UsVd9X8uf8AVsH/AEgyf9UsVd9X 8uf9Wwf9IMn/AFSxVLPM0Hl8eW9WMenBXFnccG+pOtD6TUPIxinzxV7LJ/x1bf8A4wT/APE4cVRW KuxV2KoXVv8AjlXv/GCX/iBxVifmjT9TvfOdktgkDumnTF/XleIUM8fQpHLXFUJPpus297a2NxJp UN7fep9StZL6RZZvRXlJ6SG3DPwU1biNh1xVu60fzRbz2kLW9kWvJTDGRdS0DCKSap/0bpSIjFUN rsep6DZreas1hbWzyLCrm4uXq7At0S0Y0VVZmalFUFmoATiqvqel+ZdOszdz29k0SvFGQl1KWrLI sYO9uOhfFUF6urf8s1v/AMj3/wCqOKu9XVv+Wa3/AOR7/wDVHFXerq3/ACzW/wDyPf8A6o4q71dW /wCWa3/5Hv8A9UcVd6urf8s1v/yPf/qjirvV1b/lmt/+R7/9UcVd6urf8s1v/wAj3/6o4q71dW/5 Zrf/AJHv/wBUcVd6urf8s1v/AMj3/wCqOKu9XVv+Wa3/AOR7/wDVHFXerq3/ACzW/wDyPf8A6o4q 71dW/wCWa3/5Hv8A9UcVSvzTJqh8s6vyt4Av1K45ETuSB6TdB6QxV6zJ/wAdW3/4wT/8ThxVFYq7 FXYqhdW/45V7/wAYJf8AiBxViXmu6vrfznZG0uXtmbTpgzIsbEj149v3iviqW3Md3dapZarcXskl /pyzJYzslvWIXAVZeI9LjVggFaVpUDqcVRE15rE0kEkmpTM9s5lhPC3HFyjRk7Rb/BIw3xVZfyX2 oQrBf3X1uFXSVYp7e0lUSRtyRwrwkclYVB7HFW7241W+tzb3OozPCzI5XhbrvG4ddxEDsyjFUL9U uP8Altm+6H/qnirvqlx/y2zfdD/1TxV31S4/5bZvuh/6p4qxnzb5uby3cWlt9T1vWJ7tJJFj0m1t 7lkSJkVmkUhCBWUUxVJz+Y2ufpG5tx5X8yNa20rR/WRawgyqKBXiVo1VgW5dXHw0O5NAqyfy1rUX mGzuLuznvYY7a5ms2FxHAhZ4G4uy0RqrXocVTf6pcf8ALbN90P8A1TxV31S4/wCW2b7of+qeKu+q XH/LbN90P/VPFXfVLj/ltm+6H/qnirvqlx/y2zfdD/1TxV31S4/5bZvuh/6p4qlfmm1nHljVybyZ gLK4JUiGh/dNttGMVZ558gs7jQNXgvrr6jZTaNqUd1e8Gl9CJo0Dy+mvxPwWrcRucVeA6rpvkuK/ +qWH5n6jpNtffVo9O8vw6PdxMLu1mS3WZbW2S2pKJ9OK/u4U4tQbVHJV6t+VHnf8votOsfKWl+Yx rWqGSWUP6F5GztfetqQDG5MzgiIt/eys3w/Eee2KvTcVQurf8cq9/wCMEv8AxA4qwbz4LQ+b9P8A rMPrL+j5+I9JpaH14+yq1MVSvhov/LD/ANOkn/VPFXcNF/5Yf+nST/qniruGi/8ALD/06Sf9U8Vd w0X/AJYf+nST/qniruGi/wDLD/06Sf8AVPFXcNF/5Yf+nST/AKp4q7hov/LD/wBOkn/VPFXcNF/5 Yf8Ap0k/6p4q7hov/LD/ANOkn/VPFXcNF/5Yf+nST/qniruGi/8ALD/06Sf9U8Vdw0X/AJYf+nST /qniruGi/wDLD/06Sf8AVPFXcNF/5Yf+nST/AKp4q7hov/LD/wBOkn/VPFXcNF/5Yf8Ap0k/6p4q lnmdNH/w1q3Cy4v9SuOLfVXWh9JqGvDbFXrd7bW91epbXMST209rcxzwSKHR0dolZWVqhlYGhBxV BHyL5IOojUz5e0w6kH9UXv1O39f1Ofqc/U4c+XM8q1674qq2Xk7yhY3iXtloen2t5EQY7mG1hjlU rGYVKuqhhSJig3+zt0xVN8VQurf8cq9/4wS/8QOKsU8z6dqN750slsVhZk02Yv68jRihnj6cY5a4 qhZ9L1aC9trGebTIr29Ehs7V711lmEIDSmJDByfgGBbiNu+Kt3WjeZbeezhaCyY3kxgUi5l+EiGS ap/0fwipiqG12O/0GzW81aSxtrZ5FhVzPcPV2BbolqxoqqzM1KKoLNQAnFVbVNL8w6bZm7mgtHjW SKNglzLy/eyrECKwDoXriqE9TUf98Q/8jW/6p4q71NR/3xD/AMjW/wCqeKu9TUf98Q/8jW/6p4q7 1NR/3xD/AMjW/wCqeKu9TUf98Q/8jW/6p4q71NR/3xD/AMjW/wCqeKu9TUf98Q/8jW/6p4q71NR/ 3xD/AMjW/wCqeKu9TUf98Q/8jW/6p4q71NR/3xD/AMjW/wCqeKu9TUf98Q/8jW/6p4q71NR/3xD/ AMjW/wCqeKpX5qe//wAMavyhiA+pXNSJWJp6Tf8AFYxV6tJ/x1bf/jBP/wAThxVFYq7FXYqhdW/4 5V7/AMYJf+IHFWGec9WbTfONg634sPU06debGEcqTxmn71WH3Yqlc3mGzmvbe+m1q2kvbRZEtLp1 sGliWbiJRG5i5IH4Lyod6CuKr5vNKTSQSSeYUZ7ZzLCeVoOLlGjJ2j3+CRhviqy/8w2eoQrBf6zb XcKukqxTrYSqJI25I4V4iOSsKg9jiq698yxXtube68wJJCWRyvO0X4o3DqaqgOzKDiqF/SWmf9Xt P+Rlt/zTirv0lpn/AFe0/wCRlt/zTirv0lpn/V7T/kZbf804q79JaZ/1e0/5GW3/ADTirv0lpn/V 7T/kZbf804q79JaZ/wBXtP8AkZbf804q79JaZ/1e0/5GW3/NOKu/SWmf9XtP+Rlt/wA04q79JaZ/ 1e0/5GW3/NOKu/SWmf8AV7T/AJGW3/NOKu/SWmf9XtP+Rlt/zTirv0lpn/V7T/kZbf8ANOKpZ5n1 DTm8tasq6yjsbO4AQSW55ExNtstd8VexSf8AHVt/+ME//E4cVRWKuxV2KvN/KnnG71vWfPulXF5c XB0RjEltNZQ2kcKO1wE9KRJp5JgyxjeQIdgwUBsVV/PM8sXnDTzHbyXBOnzgrGYwR+/j3PqOmKpf +kLv/q23P/BW3/VbFXfpC7/6ttz/AMFbf9VsVd+kLv8A6ttz/wAFbf8AVbFXfpC7/wCrbc/8Fbf9 VsVd+kLv/q23P/BW3/VbFXfpC7/6ttz/AMFbf9VsVd+kLv8A6ttz/wAFbf8AVbFXfpC7/wCrbc/8 Fbf9VsVd+kLv/q23P/BW3/VbFXfpC7/6ttz/AMFbf9VsVd+kLv8A6ttz/wAFbf8AVbFXfpC7/wCr bc/8Fbf9VsVd+kLv/q23P/BW3/VbFXfpC7/6ttz/AMFbf9VsVd+kLv8A6ttz/wAFbf8AVbFXfpC7 /wCrbc/8Fbf9VsVSzzRfXTeWdXU6dcKDZXALFreg/dNuaSk4q9ak/wCOrb/8YJ/+Jw4qisVdirsV eOflh5L1vQL7ztfXGiN5f0vVvUuLSwdNNrV3mIUS2UtzKwjSjUkcKpkKItE5MqzPX9Jn1HzraJDc JbmPTZiS8ZlrWeMdA8dMVVv8G6j/ANXGH/pGb/qvirTeT9RBUfpGH4jT/eZvAn/f/tiqG1XQX0rT LrU77VY47Kyiee4kWzlkKxxjkxCRys7Gg6KCTirzaH84PItzrL6XZ6rcXLpBLdm5GlzRxejbwzzT vSWeOUen9WKUKCrsoWoJIVQ0v5yeX7d5FvbfVLP040lJm0+3AJk9MpH8OoMRKRL/AHbUb4WFKimK vT9E0O41jRrDVrXUYxbajbRXcAa2qwjnQSLUx3DoTRv2WI8CcVRieT9RZFb9IwioBp9Wbv8A898V b/wbqP8A1cYf+kZv+q+KoXTfLeo3tu8316GPhPcQcfq7N/vPO8PL++H2vTriqK/wbqP/AFcYf+kZ v+q+KtDyfqPMr+kYdgDX6s3ev/F/tirf+DdR/wCrjD/0jN/1XxVhHm3zZpHlfzho3lO/vJpdU1xr dLU29jyiX61M0EbSM90mwaNi3EHiOvUYqzf/AAbqP/Vxh/6Rm/6r4q03k/UVFf0jD1A/3mbuaf7/ AMVb/wAG6j/1cYf+kZv+q+KpR5w8pX8XlLW5W1CJglhdMVFswJAhY0r6xpirNArjV6yEnlE/1ccg VCgx+pUcFIJbjT4m+jFUbiqgbiQXy25QcHjaRJAxrVCoIK0/y/HFVfFXhX5FWdpaab5jS2urW6WX TLKZ5LfT59LI9SO4ZUMUsEHrhQdrhnkkk6uw+EYq9I1ttJXzranUrv6on6Nm9NvrT2vI+vHtyR4+ XyxVE+r5N/6vX/c2n/6r4qseTybyT/c0ftb/AO5afwP/ABfiqnf3XlaGxuJrTU/rd1HE729r+mZo /VkVSUj5tPxXk23I9MVee3/mzzs3qLb6Ra2pCMsTP5kN1EZ0uFCNz+uWj+nJDUr+65ByK0FcVQ8v mD8zo44ZOOlSMEkW5todWmc+orXIR4pZdWtwVZYrchWQH94alOJxV6VZXHlZrOBrzWVS7aNDcImr T8RIVHML/pDbBvfFV8M/kswoRrdQVBqNWn8P+M+Kr/W8l/8AV7/7m0//AFXxVLvL8nlAWEvPWSp+ uXtB+lZ12+uS8TT1x1G9e+Kpl6vk3/q9f9zaf/qviqwSeTfUb/c0acR/0tp/E/8AF+Kr/V8m/wDV 6/7m0/8A1XxVj+s6gkXm3y/baXeQz+Xbhbz/ABDfSaxMJbfhGptRCv1tC3qSVDfA1B4YqyD1fJv/ AFev+5tP/wBV8VWSSeTeIprR+0v/AEtp/Ef8X4qv9Xyb/wBXr/ubT/8AVfFUn84SeUT5R1sRaxzl +oXXpp+lJ35N6LUHEzkNU9qYqn/mzWl0KwvdbdFkXTNNvrxo5GaNGEAjkozokrKDx6hGp4HFVnkD zVN5s8n6X5ils/qDanF662oaVwqFjwIeaG1duS0avp8T+yWWjFVNpP8Ajq2//GCf/icOKorFUHqs ca6bfOqgObZ1LACpVUYqK+A5GmKsT812t9cecrIWls9yy6dMWVGjUgevHv8AvHQYqknmDyx5/voo 00d5tIcB1lk9KyuSeVOLIJJwqsvHuGFCdq0IVYz/AMqz/N4wyxz+Zr15Jp1lWRLWwiIEbQsiUS5F BxgZWC8VbmajFUdB+X/5rCazN3rl3cwW88MtzELbToTOkTu7xl4pkKiTkgNOy9PiOKp9q5utPk0/ 6/Atm0t9ZmBbi5sojK0d1E3pxB515u3RVHcjFUwv/wAxPL2vaPd6fpGqRw3eoRS2lne2l/pkrxzy gRK0YjvVYuskqUCsDUgAgkYqnuhz6vp2i2Fhc2GoX9xaW8UE19K9p6kzxoFaVuV07VcipqxPiT1x VhnmjyUmueWNOtrrye+patFaWtg0lzcRRwJDGySSVMN5FJTlHVeO/LjXYbKpHpP5ceYLnVJYfMfk 6xj8vXtlNFqEenahdm7e4lmkYhXe7iT0njmPPbkSafZoMVZVY2Os3C3MsGlz+k13ecayW1RS6kBB rN2IxVE/orX/APq1Tf8AIy2/6rYq1+i9eqR+ipqjf+8tu/8Az2xVI/MPlL8yL+Rf0Pdz6NDxUOqw WFy/NWJ5K0s/EBgaMCp6ChG9VWKah5F/MyPXLaCbzpcWl1fTT3Gn6aYtMVpeCMCsSNc8pFhjdSVo VqOZWprirINN8jfmbDqtnd6hql1f2dqZDLY+hYW4mLQLEvJ4px9l+UlCCKt/kjFWTnS9eAqdKm6g f3lt32/39irf6K1//q1Tf8jLb/qtiqVebNL1xfKuss+mTIgsbks5ktiABC1TtKT92Kss8+G6Gg6q bRbp7r9Eah6Cae7RXhfgnEW8iRzuktfsMsbEHop6Yqq/l62oN5C8uNqP1n9INplmbwXpZroTGBDI J2cK5kDV5lgCTiqbSf8AHVt/+ME//E4cVRWKoXVv+OVe/wDGCX/iBxVJNQTUH872/wBSmhhYaZNz M0TTAj6xH0CyQ0xVM/q/mX/lvs/+kOX/ALKsVWPb+ZOSf6fZ/a/5Y5f5T/y9Yqv+r+Zf+W+z/wCk OX/sqxV5f5m/JfyBpOj3+sXeiafPBbos13FBa3PKRYqVYo1+iOwA5Hkat13Y4qyKL8odIhl02SFb aJtIINgsY1BVSlyl5RkW/CyL9YiSQq4IJVa9BirLvq/mX/lvs/8ApDl/7KsVWRW/mT0k/wBPs/sj /jzl8P8AmKxVf9X8y/8ALfZ/9Icv/ZViqWeXYPMf6Pl431mB9dvutpKd/rk1f+Pkd8VTP6v5l/5b 7P8A6Q5f+yrFVgt/Mnqt/p9n9lf+POXxP/L1iq/6v5l/5b7P/pDl/wCyrFWNaxo5uvPXlye+NtPr djb6jcaPfC2nEdupEENyrKL1QWlSZQtUbYNuO6rJfq/mX/lvs/8ApDl/7KsVWSW/mTiP9Ps/tL/x 5y/zD/l6xVf9X8y/8t9n/wBIcv8A2VYqk3nSDzCPJ2umS9tGQadd81W0lUkeg9QCblqfdiqz8zri yt/KGvz31sbyyi0PVHubRX9IyxLEheMScZOBZduXE08MVRP5aHSm/Lzy1JpNr9R02bTbWa0tCQxj SWFZArMqoGb4vianxHfFU7k/46tv/wAYJ/8AicOKorFULq3/AByr3/jBL/xA4qxvXH0hfOtp+krz 6mn6Nm9NvrT2nI+vHUVR4+XyxVE+t5L/AOr3/wBzaf8A6r4qtebyZyT/AHN/tf8AV2n/AJT/AMX4 qu9byX/1e/8AubT/APVfFXnfm7zX5wha6g8vabYMiyFbHUbvzPI6vSQpH6lsJ7Zk9SittK1Aafa6 KrfLuvefpvMmnprw0y18v3M12NQa31md5rWGOENa0lOot6zSysUYiBaBa8RUUVejet5L/wCr3/3N p/8Aqviq2KbyZ6Sf7m/2R/0tp/D/AIz4qu9byX/1e/8AubT/APVfFUt8vzeTvqEvPWuJ+uX1B+lZ 12+uS0NPX7jv3xVMvW8l/wDV7/7m0/8A1XxVasvk0ysBrVaKtaatP3J/4vxVU5eT/wDq8n/uK3H/ AFXxVItWvIY/M+hwabexTaDOLr9OXcmrziSDjGpt/TH1tD8cmxoj/wCx64qnvLyf/wBXk/8AcVuP +q+KrJG8n8RTWSd1/wClrceI/wCL8VX8vJ//AFeT/wBxW4/6r4qk/nFvKf8AhHXPS1cvJ+j7rgn6 Tnerei1BxM5DV8KYqnPnTTtY1LTLvT9GuhZand2F1DbXfN4jGXaJSySxhnjcKTwcKeLUbi1KFVHe VbDUtP8ALOk2GqT/AFrUrSzggvbnkX9WaONVkk5GhPJgTXFUVJ/x1bf/AIwT/wDE4cVRWKoXVv8A jlXv/GCX/iBxVJNQup7fzvbmKzmuy2mTArCYgV/0iPc+rJEPuxVM/wBLX/8A1Zbz/g7P/soxVLtV l1a7utKlisNQtlsbs3EscclqBOn1eaL0pON0oK1lD/FUVUbVoQqmP6Wv/wDqy3n/AAdn/wBlGKpD r3m2zkkXSmh9HUYrmzme0lutPWULHL9a3j+s8/ihtZWXborHoCQqpQ/m95KmZ1hv7SVoxykVNS0l iq1AqaXmwq6/eMVSfU9M/MHW9Wj1jSvMV/DoExiu7DTILfTJICAiNGfrUN5FNNDIQWZedGDdtsVY 3F+Vf5ivbsJ/OPmWRmjmMIWWOJIpprcQpIPT1JHZY3VZBG7lag0pyYlV6hoEusaZoen6ddWOoajc 2VtDbz6hM9p6lw8SBGmet055SEcjud8VUvLuq3w0+WmjXjf6bfmoez73sxpvcDpiqrp8mrWt/qdz JYajcR6hOk8MDyWpW3VLeKExx8rpgFZojIeIA5Mdq1JVS3WLbW77WHuotJuFj+rxRUeS1DVR5WPS cinxjFUN+itf/wCrVN/yMtf+q2KpL5hub6yjbTeUOna3fxNHpMd3dWMbPO4KQ8Y3mJf94RsFNfDF WPzflz+c83olvMlwnpKxIjsdPUmU2whDErcqCqy8peLAjenYHFURpvkf83NN1LRlbUZtR0S2Dpqc Nylks8gEfCDhL6kkjfFxLF5OVaks1eIVZl+itf8A+rVN/wAjLX/qtiqU+bNL11fKuss+mTIgsbks 5ktiABC1TtKT92KvRRJz1gK3wmKFxGKP8YcxljUqqfCQBsx69sVRuKoWT/jq2/8Axgn/AOJw4qis VQurf8cq9/4wS/8AEDiqSagmoP53t/qU8MLDTJuZmiaYEfWI+gWSGmKpn9X8y/8ALfZ/9Icv/ZVi qx7fzJyT/T7P7X/LHL/Kf+XrFUB5ksbyfy/qUWt3ljJozWs36SRrO4INvwJlBCXXMjhX7O+KvCPq v5C6XeS3Gm2cUt3HaXMLJHaalDII5JWtbu3W3u9QgcS8Z5C3wVCcjWmKtaje/lRKkc155cmht54T GZntntBGtoZ4/qzxtq8MkSp+jXBTgIxxXlTbFXveg2WsRaHp0Vjd20VjHawraxTWs8kixLGoRXd7 yRmYLSpLEnxOKoyK38yekn+n2f2R/wAecvh/zFYqv+r+Zf8Alvs/+kOX/sqxVLPLsHmP9Hy8b6zA +u33W0lO/wBdmr/x8jviqZ/V/Mv/AC32f/SHL/2VYqsFv5k9Vv8AT7P7K/8AHnL4n/l6xVf9X8y/ 8t9n/wBIcv8A2VYq8487aB5aufzQ8njXreG88033qvod9Hb3SxQnSf8ASlMypfxr8LTEpVGqxpir 0f6v5l/5b7P/AKQ5f+yrFVklv5k4j/T7P7S/8ecv8w/5esVX/V/Mv/LfZ/8ASHL/ANlWKpN50g8w jydrpkvbRkGnXfNVtJVJHoPUAm5an3Yqmmv6rDpCTarOjSQ2Fhd3MscZQOyxek5CmVo46kDbkwHi Riqn5L826d5u8s2XmHTo3isr9WeGOV4HkAVynxG3lnjBqu686jo1GqAqmMn/AB1bf/jBP/xOHFUV iqF1b/jlXv8Axgl/4gcVYV52tY7jzjYK9q10F06chVhaen7+Peiq9MVY15g0nzH6UY8u6Pa+qQ4l bULG74qdijKIYqt3BWq9Qa7UKrGf8PfnE8MoltNHinedXiMWn3xURo0PwDnA1PURZudeRqw4sKYq joNC/M55rMXen6SkCzwtftbadfiRoVdzMsQljkUFl9NRX/K3G1FWUXWlW6m2b9DzcFu7Qy0sJj+6 FzGZKgRbjhWo8MVZFrlpoM2i38Wj6Ulvq0lvKunzy6ROY0nKERM3+jSbB6E/C3yPTFXaHaaBDoth Dq+lpc6rHbxLf3EekThJJwgErqBbRijPU/ZX5DpirCvM/lLQdR8r6dLHY65Hq5tLW0a10yC5siXL JJLK8htZEV14mrv1A4V+I1VSTSfKtxqeqS6fqWgeZNC0q8spml1f14Z5YLh5pB6UcMdnIQxikBWQ GiAKBRhXFWW2Wl6c63DW+kyND9buxGwsJRsLmQdPSFPliqI/RFt/1Z5f+kGX/qnirX6Jta/8ciWv /MDL/wBU8VSPzDpHnAyKvlzSLBYiqlpNRsb1mVwx5AJDGAwZaUPIUI6NXZVj1x5d/ORr8vBbaMlo JpJEhbTb5mMXFkjjY+iPhHwO1KNyr8XHbFU203Q/zBbVbNtV07Tl0uMyG9Sz069E0lYFWML6sbgD 1izHcGnHfrVVk50m176RL/0gy/8AVPFW/wBEW3/Vnl/6QZf+qeKpX5p0q3Tyxq7DSZUK2VwQ5spV pSJt+RjFKeOKsx/NKKCbyb5hiuHljgfQtUWWSCMTTKhiTkY4meIO4H2V5rU7VGKoj8q44ovyx8pJ FJ6sS6NYenLx48l+rR8W4mtKjtiqfSf8dW3/AOME/wDxOHFUViqF1b/jlXv/ABgl/wCIHFUk1B9Q Tzvb/UoYZmOmTcxNK0IA+sR9Csc1cVTP6x5l/wCWCz/6TJf+yXFVj3HmTkn+gWf2v+WyX+U/8uuK r/rHmX/lgs/+kyX/ALJcVeUebfyktRYvq2v6pq0lnp7RXReTXLy49B4mQ+tEPqckkR5KHJipTtQD ZVGab+ROn6ZNpMmn262o0mRZUjju4KTst5Fe1nJ00uSZLaNeSsrcBxBoTVV6X9Y8y/8ALBZ/9Jkv /ZLiqyK48yekn+gWf2R/x+S+H/MLiq/6x5l/5YLP/pMl/wCyXFUs8uz+Y/0fLxsbMj67fdbuUb/X Jq/8ex74qmf1jzL/AMsFn/0mS/8AZLiqwXHmT1W/0Cz+yv8Ax+S+J/5dcVX/AFjzL/ywWf8A0mS/ 9kuKsU17SJNQ8/8AlbUryGOPWtIg1KfSrWO8l9CVJUhguWmP1JhVBKnAc16kitDRVlf1jzL/AMsF n/0mS/8AZLiqyS48ycR/oFn9pf8Aj8l/mH/Lriq/6x5l/wCWCz/6TJf+yXFUm86T+YT5O10SWVoq HTrvmy3crED0HqQDbLX78VWfmd+jf8Ia/wDpMyjTf0Hqn1026q0wh9JPUMasyKX414gsBXFUT+Wk GlQfl55aj0mSaXS/0batZSXBPrNC0KshcFpOJ4n7Iai9BsMVTuT/AI6tv/xgn/4nDiqKxVC6t/xy r3/jBL/xA4qkmoWs9x53txFdzWhXTJiWhERLf6RHsfVjlH3Yqmf6Jv8A/q9Xn/AWf/ZPiqx9Jv8A kn+5q8+1/JZ/yn/l3xVf+ib/AP6vV5/wFn/2T4q8386+cvMlpHfabZ+WfM2uFS8YEltp62NyqO0Z AkWC5ejlPh5wiqnl0Iqq35d87fmHqnmTT9NvfLutaXpmoTXcf6SmNuzW0dtCJY5LmP8ARyxJ6zOE QLMw5BqEgbqvR/0Tf/8AV6vP+As/+yfFVkWk3/pJ/uavPsj9iz8P+YfFV/6Jv/8Aq9Xn/AWf/ZPi qWeXdKvjp8pGsXi/6bfCgS07XkwrvbnriqZ/om//AOr1ef8AAWf/AGT4qsGk3/qt/uavPsr+xZ+J /wCXfFV/6Jv/APq9Xn/AWf8A2T4qx7WBrFr5v8v2UQ1C9jv0vEn1hY7TjYpGiSUZhZsAJ2VVozpW m3IimKsh/RN//wBXq8/4Cz/7J8VWSaTf8R/uavPtL+xZ/wAw/wCXfFV/6Jv/APq9Xn/AWf8A2T4q k3nTS75fJ2us2sXbhdOuyUZLSjAQPseMAO/scVX/AJgWmrXuhajZaRbx3Wo3em3lvbwzLC6FpTEh JjuAYJOIYn05Pgf7LEA1xVHeSrO/svJ2h2eoQx21/bWFtFd28KJHFHKkKq6xpFRFUMCAq7AYqj5S BqluTsBBPU/7OHFUD5e836B5hMw0qaWQwpHKwmtri25RTcvSmi+sRxerFJ6bcZI6oabHFUfq3/HK vf8AjBL/AMQOKsb1xNIbzrafpKz+uJ+jZvTX6q93xPrx1PFEk4/PFUT6Pkv/AKsn/cpn/wCqGKpf qtloMt1pbWGmLBDDdl9RRtImPrW31eZfTFbV6H1WjfYqfh602KqYej5L/wCrJ/3KZ/8AqhiqB1m1 8qSWca22iH1BdWjNx0qdT6a3MbSf7oG3ANXFUd6Pkv8A6sn/AHKZ/wDqhirCddsPN8uvsdI0/RIf LqSJJFHJo+oLfSKgUtDJIbaeELI3IcljqopSu9VWLxeUfzckgb1NV02NvTme3WHQWr6rW4WBJXk0 yQNEs6hjxRXozbn4Qqr0/QLPQ4ND0+HWtLS61iK2hTUbqLSJ1jluVQCWRFFslFZ6kDiMVWeX4fJ3 1CXnovI/XL6h/RU7bfXJaCvodh27Yqp6TZaamqavLqelxyafLMh0iBNLmZo4VjAfmRZQkFpKniWe n83YKoLWbLSH1h3s9GlFt9XiFI9MuFXmHlLbeiN6FcVQ31Cz/wCrNcf9w64/6o4qhdStDHp909ho Us2oLDI1pC+nXAV5QpKKx9Ndi1AdxirD5tM/N+T0fT0rR4Aqs0tNO1M8pDbAKhDW7fALksSQQeAX 3BVRGm2f5jWmpaNaanotrf6Y4ddW1CHTbtJ0KR0jbiyRqzSyAElI6b04qBUqsy+oWf8A1Zrj/uHX H/VHFUr80WNovlnV2XSZ0Isrghzp86hT6Tb8jEAKeOKvWBKsusBVoDbwurjkhJ9QxsKKGLD7P7QG Ko3FUFdf8dCL/mGuPD+aLxrirx//AJxa1DzDe+WNQGr2LiO1kigsNXmvo795YfT5LbKV5OkcClWA 5cOUjcQtCoVex6t/xyr3/jBL/wAQOKpJqD6gnne3+pQwzMdMm5iaVoQB9Yj6FY5q4qmf1jzL/wAs Fn/0mS/9kuKrHuPMnJP9As/tf8tkv8p/5dcVQmuDXLnRr6C5S30+2kgkWe+g1GW3lgQqeUqTfVv3 ZQb8+3XFXh8nlf8AL601OXX5POF1qdx9Sk9S7GuSaggilMunib1otPlLSQ/Xnjjq5KV6dcVSlvKn 5JzMktjdT26X1uqQ3Fk94YngjLD0xKNIkRnc6e1eTGVijEGtaqvoLy3Hq9l5d0uysLW1msbazght ZpLp1d4o4lVGZUs4lBKgEgIo9h0xVHxXHmT0k/0Cz+yP+PyXw/5hcVX/AFjzL/ywWf8A0mS/9kuK pZ5dn8x/o+XjY2ZH12+63co3+uTV/wCPY98VTP6x5l/5YLP/AKTJf+yXFVguPMnqt/oFn9lf+PyX xP8Ay64qv+seZf8Algs/+kyX/slxV5l598qaRq/5neULzXLhrXzDy9TQdMgvpfq1w+lubty4NhIB QS1f415AAdsVem/WPMv/ACwWf/SZL/2S4qskuPMnEf6BZ/aX/j8l/mH/AC64qv8ArHmX/lgs/wDp Ml/7JcVSbzpP5hPk7XRJZWiodOu+bLdysQPQepANstfvxVOdVv7bTpTf3RZbW0s7qedkR5WEcZiZ iscYd2NB0UEntiq7QNe0zX9IttX0t5JNPvF520ksM1uzJUgN6c6RSAGlVJXcbjY4qrSf8dW3/wCM E/8AxOHFUViqF1b/AI5V7/xgl/4gcVYl5qur63852RtLl7Zm06YMUWNqj14/9+K+KpJ5g88a9o0U b11XUmlD8I9PtLeduSU+Fv3ahOQJoWIXY71oCqxn/lcnm+WGWWLQPMfKKdY445rG3jYpyhSRzSJu nrOVC8gwQ/EMVRf/ACs/zFqAt7GTRde9LUZIra4S9sLNYEiuGdJGnKpMOKIhLClPiUd9lUwvPLul PcQSm0s/rFxeQRyT/o/TjIRd3KJOeRtju4dqnvirJfMvkXR4ND1G9+ojVpraC4uI9P8AqWmu88hW WRowPqchLTNNJWikku2xLGqqbaBaareaFp13Ne32mzXFtDLJpzJZhrdnQEwmtqh+CvHdR8h0xVhf mrUfzOsPLGl6poOswTzXtrapHZ3cEbzzXk5RmESQxJVFh5sVFW/a6LQqpNpPmz87dY1SXS7S1uLS aWymurLUNTsJLSxSRZpIo4Z5Gti/PiI5OIX4hX7OxxVldhe63apcW6anMAl3eA/BbmpN1IWNfR7n FUT+l9e/6uc3/Iu2/wCqWKtfpXXqk/pOap2/u7bt/wA8sVSPzD+YOv6LIsQi1nVHdVdf0dZW0y0L FWBcoiKVoCQxBIO1d6KsUv8A80dek122uJfKWu3dzp81xFZ6o2nWbSRQshWR4HeLkrTPEF4ghSlC W/ZxVkGm/mb5nv8AVbOwWw1y0S5MnrXl5Z2sUMKpAso5MqSbsziMDbcNvtuqyc6rrxFDqc3Y/wB3 bdt/99Yq3+l9e/6uc3/Iu2/6pYqlPm3VdcbyrrKvqUrI1jchlMduAQYWqNogcVZD+acSy+TPMMbX KWatoOqhruUSGOIektZHESSycU6ngjHwBxVd+UOnWunflb5UtbZIUjGlWkjG3AWN5JYVkklFAtTI 7FyxFSTU74qyST/jq2//ABgn/wCJw4qisVQurf8AHKvf+MEv/EDirHNbXSW862o1Kz+uJ+jZvTX6 q93xPrx1PFEk4/PFUT6Xkz/qyf8Acpn/AOqGKrHi8m8k/wBwv7X/AFaZ/wCU/wDFGKr/AEvJn/Vk /wC5TP8A9UMVeZaxo/5oXTxfVB5esY45YpP3WgageYDKzxSiaGbkuxXlG0bEb7Hoq3pvlnz7bTaS Lu5tL+JZFbWmk0j0iU+uRMywLHpC8h9TjkShZSXevIBRVV6X6Pkv/qyf9ymf/qhiqyKHyX6Sf7hP 2R/0qZ/D/jBiq/0fJf8A1ZP+5TP/ANUMVS/QYvJ/1GXlo1T9bvaH9FTnb63LQf3HYYqmPpeTP+rJ /wBymf8A6oYqsEXk31W/3C7cR/0qZ/E/8UYqv9LyZ/1ZP+5TP/1QxVj2s6ekvm3y/caXZQW/ly3W 8/xDZyaRMZrjnGotfRJtH4+nJVm+Ndtt8VZD6Xkz/qyf9ymf/qhiqySLybxH+4X9pf8ApUz/AMw/ 4oxVf6Xkz/qyf9ymf/qhiqT+cI/KI8o62YtH4S/o+69N/wBFzpxb0WoeRgAWh71xVH/mXHbS+U9d jurv6hbPomprNfUdvQQxoGl4xh3PAfFRQT4Yqify0soLH8vPLVnbX36StoNMtEt7+nESxCFfTdRx jIThTjVa0pWp3xVOpP8Ajq2//GCf/icOKorFULq3/HKvf+MEv/EDiqSagmoP53t/qU8MLDTJuZmi aYEfWI+gWSGmKpn9X8y/8t9n/wBIcv8A2VYqse38yck/0+z+1/yxy/yn/l6xVf8AV/Mv/LfZ/wDS HL/2VYq8s/Mr80fLcWk6t5f1PUHvJSskFzaWWjXfqn03ZHaCa4mjtnZJIyAVc/EPbFUZ5d/OyPXv Mmn6FaLPFJqs13BYXlxpojhkNjCJ5WK/pAzxrwdePqRKamlK1oq9H+r+Zf8Alvs/+kOX/sqxVZFb +ZPST/T7P7I/485fD/mKxVf9X8y/8t9n/wBIcv8A2VYqlugQeY/qMvG+swPrl71tJTv9clr/AMfI xVMvq/mX/lvs/wDpDl/7KsVWC38yeq3+n2f2V/485fE/8vWKr/q/mX/lvs/+kOX/ALKsVYprt5cW f5g+Vre6uom1jULfUrbTZIrJjCsfGCe49Utdh9/QTjwr/lbUOKsr+r+Zf+W+z/6Q5f8AsqxVZJb+ ZOI/0+z+0v8Ax5y/zD/l6xVf9X8y/wDLfZ/9Icv/AGVYqk3nSDzCPJ2umS9tGQadd81W0lUkeg9Q Cblqfdiq38y/0gfK+rx6dbG8v5tJvobW39BboGSX0o1L27rIsqKW5OnBuSggKx+Eqo78vo7uLyH5 divIPq12mmWi3Ft6aQ+nIIEDp6UaxonFtuKooHYDpiqayf8AHVt/+ME//E4cVRWKobVFZtMu1RSz NDIFVQSSShoAB1xViuu33l+PzjZS6tfjToX02b0WlupLAsfrEdR9uFj8jiqt+l/y8/6mWL/uNS/9 lGKpfqut+U0utLGn+YLaSB7srqbSazLVLb6vMeUf+lp8XrCMdG2J27hVMP0v+Xn/AFMsX/cal/7K MVQOs635FjtI2tvMkfqG5tFbjrErH03uY1k2+sHb0y1T264qjv0v+Xn/AFMsX/cal/7KMVYTrvnm 9g19rPSba0udFjkRjq7eaQZJYQFMipaNcwFJDVlQtLxqN9jsqxeLzv8Amk8DHjoNuUjmkiDa7JK8 hW3DQQFRqsaxs06lDJzYUYfCONWVen6BrnlObQ9Pm1rXra21iS2hfUraHWpTHHcsgMyIfrT1VXqA eR2xVrQ9V8gLZSCTzFEjfW7wgHWJV+E3UpU0+sDqtDXviqhpHmDQJdY1qLU9ZtbfSoJol0SdNaf1 J4jCplaQC8kpxl5Baqu3bFUHrPmXytBrDx2nmRPq31eJhx1WRhzLyhviMx7BdsVQ3+LPL/8A1Mq/ 9xR/+q2KoXUvOuiWmn3V3Drv1qe3hkkitk1STnKyKWEa0lbdiKdMVYfN+avnBvR+r6aigq0kxk8y wkf7zCRYhSZSGNw3p8qEfDXodlURpv5pax+ktG03WVWIXwcXmp22ttJBA0MXIs6K7+n6jr8KtIdi PiZqgKsy/wAWeX/+plX/ALij/wDVbFUs8zeZ9Dl8t6tHH5hEsj2dwqRfpJ35ExMAvH1Tyr4Yq9hY l9Vj4q1IoZVdyrBau0RUBiOJ2U9MVReKoN25avCAr0SCXk/BuFWeKg50412O1cVRmKv/2Q== uuid:9DD31B8C24D0DC11A72BA736C17DCD1C uuid:72201E0019D0DC11A72BA736C17DCD1C uuid:72201E0019D0DC11A72BA736C17DCD1C xmp.iid:DB30AFF94802E0118446938619C183E0 xmp.did:DB30AFF94802E0118446938619C183E0 converted from application/postscript to application/vnd.adobe.illustrator saved xmp.iid:DB30AFF94802E0118446938619C183E0 2010-12-07T16:28:47-05:00 Adobe Illustrator CS4 / uuid:72201E0019D0DC11A72BA736C17DCD1C 558.000000 648.000000 Points 1 False False UniversLTStd-CnObl UniversLTStd CnObl CnObl Unknown Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Regular.otf UniversLTStd-Cn UniversLTStd Cn Cn Unknown Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Regular.otf UniversLTStd-LightCn UniversLTStd LightCn LightCn Unknown Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Regular.otf Cyan Magenta Yellow Black Default Swatch Group 0 endstream endobj 128 0 obj <>stream hޤSj0=c9Pe JY\g\J;RBYхsJ O*~#x^cqg7f9[dƹ)uMә ~Y՝V6EUi: Ui"m;b4NIY R$!rg7Qۍ3;AmFbXå׬vF٠ː-L?0q<"cKƜrlQ'z5{Jdea`l endstream endobj 129 0 obj <> endobj 130 0 obj <>stream hYr8}WLi Ap;)'-kkyeVJ$'__sAJ-I>l%e>}E lFoǣ:1zJJMSӶx1*QQS<>,Ev/L:rW¥&M:"gfy2L] UE4+yYeAp?Y^zuQ)l:N\a]ct-ԇe7bCbj-V٢n/\RTMۆdݍGsEmuEEiu^T zUGr\>VGI[>NAN?^~䷮9][uCeI\OBP iټNIO#L n-Oe$ҳz1GUqpȻ=Ε>j},T8s&raع 乂̪ O./!tL{#dPNl[@(nmCsi 9!}O qݒRhT_<#7$EӚfRwMwd[k>쓎.ⶡ~vjK&we738^ ehgqn ,F#ʗdoӹKХ@"2j8JԯYNty#ǃt{6oʫY lQ ւ=#[Ɠd#ң>d6JgqSH :й9~ӿ !:Gu%O4u@ f:Vr4;eiLGDq!Ӯ#:5Z>=z򴸖≽#V@]r!"U8㌯XQjW!= Bko:Rف,y$eY+g묈/"ǷcS *'7&UOHc4CN-bW|;t SFo0`nfh u/]=΋tN;p~^ճOB;&yƔ2ϨFK!b(跰}ut#`AGˆ&6JHP$_v_Q0*|-*2U+4}wTј*`m=h4ۭ7PѾ~U]T'ui u8& V%J@D}E%X^SI?Jp;nl~L'LqPu6 x.?WZ)h':/hTFEC Cϖry$J#Tyx-FtN{L[U}v̛'2zaC *X.j p;⋆;o7.6+QVdő#^Grk+UG jJB-mVj\t̍lz-879ճ$;\b/TzaUuec/t=ۭ=2[j]IdZmow]rb^EGQ|>>bƶҜ"v^0")}d,?Պ\ID61mho-:-;XLl eïOkܓTs /og\۽Zk /+i)#Mz{7ɜ_vD!zm # t5S'oOO4%~dh)Es$N'Ӎ+t?9~rBAB֣ܬLZSDLɊՊܩuMf6U?0l;!0:A/F_ɷJ'~Nj/_L2KF )VB3IċaLphoQ)E eTmhKe|JZ_[Ih#S60J(S õD(h%5)4V|;U$=N;Lqr-N}>߽?Gusu5 i/.U&'uĦI>jk`b=ӈE_M§Yհ3Wv%)1r3 ź4&T'n# m& MnCV{\U^3i7C * uR){F,NK endstream endobj 131 0 obj <>stream application/postscript Adobe Illustrator CS2 2008-01-29T10:47:42-05:00 2008-01-29T10:50:20-05:00 2008-01-29T10:50:20-05:00 256 44 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXnX58tbL5Gt2u47Wa0XWdHNzFqDiKyeIajDzW6kZJVSEjaRijALXY9MVefeQ /PXnHTLLT/KejWVqserzX115fuRFPcWsFlDdXr3Iiq8JlgiCW62p+Dksi1HYKozSfzv86xw+WrSS 2ttYlvvL66le6gkTR87oWt3LKOEEkrj6vLaJDOIoG+Nj/dHhGyr0j8qfOeoebvLc2pX/AKBnhunt vUtU4wsEjjeqFZ7yNwDIV5RzMNt+LckVVmWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXNb 0zQ9IvNY1Wb6tp1hE093PxZ+EaCrNxQMx+QFcVRiOrorqaqwBU+xxVvFXYqhtT1Ky0vTbrUr6T0b KyhkuLmXizcYolLu3FQzGijoBXFVLQ9c0vXNLh1TS5jPZTl1R2R4mDRO0ciPHIqSI6SIysrKCCKH FUdirsVQuq6pYaTpl3qmoSiCwsYZLi6mILBIolLu1FBY0UdAK4qs0XWtN1vTIdT02UzWc/IRuyPE waNzG6vHKqSIyOhVlZQQRQ4qjcVdiqldXVvaWs11cyCK3t0aWaVtlVEBZmPsAMVUNG1fTtZ0mz1f TZfX0/UIUubSfiyc4pVDI3FwrCqnoQDirT6Lpj61FrTwctTgt5LOG4LN8EErpJIqrXgOTRLU0rt1 xVG4qg9Z1fTtG0m81fUpfQ0/T4Xubufiz8IolLO3FAzGijoATiq/TdQg1GxivbdJkhmBKLcwTWso oSPjhuEilTp+0oxVE4q7FUHrOsado2mzalqMphs4OPqOqPKxLsERUjjV3dmdgqqqkkmgGKqmm6ha alp9tqFm5ktLyJJ7d2VkJjkUMpKOFdTQ9GAI74qiMVdiqE1bVLXStPmv7pZ3t4KGRba3nu5aMwX4 YbZJZW3O/FTQbnYHFXaRq1hrGlWeradL62n6hBHdWkxVk5wzKHjbi4VhyVgdxXFUXirsVQGua7pm h6a+palI8dqjxRVjilnkaSeVYYkjihWSV3eSRVVVUkk4qq6VqdhqumWmqafKLiwvoY7m0nAIDxSq HRqMARVWB3GKorFXYqlXmvQh5g8razoJm+rDV7G5sTccefp/WYWi58Kry4860qK4qmcMfpwpHWvB QtelaCmKrsVdiqF1W3vrnS7y3sLoWN9NDJHa3pjEwhlZSEl9MlOfBjy41FcVS/yX5el8ueV9P0SW aK5ksYzG1xBE8CSfEW5lJJbl+bVq7NIeTVbatAqnWKuxVDanb3lxpt1b2VwLO8mhkS2u2jEoikZS EkMZKhwrb8aivjiqWeSfLR8s+WLLRGufrjWvqF7ng0fNpZXlb4XeZ+slKvIzHqzM1SVU8xV2KpZ5 n0C28w+X7/Q7qea3ttRha3nltyglEb7MB6iyJRh8JDKQRsRiqH8keWm8r+UdI8utevqB0q2jtReS IkTOsY4r8CbKANlFSaDcsakqp3irsVSrzTosmueXb/SElih+vRGB2uITcQlH2dJIg8JZXSqmjqd9 iDiqj5L8t/4a8s2Wieutx9U9T95HH6EY9SVpeEUXKT04o+fCNOR4qAKnFU7xV2KpD578pwebfK15 oM7xxpctBIGmi9eLnbTx3CCWHlH6kZeIB15Cq1FRiqL8r6IdC8taTohuGuzpdnb2ZunHFpfQiWP1 CKtQtxrSpxVM8VdiqW+ZtKutX8uappNpd/ULnULWa1iveHqmEzIU9QJyj5FeVR8Q3xVF2FjbWFhb WNqvC2tIkggT+WONQqj6AMVV8VdiqQeevKz+aPLc2jx3f1GV5rW4iueMjcXtLmO5X+5ltphVoqVj lRx1VgcVRflXQ10DyzpOhLN9YXSrOCyE/AR8xbxrHy4CoWvGtK4qmmKvn/yV5X0/UfJug6heXWpy 3l5p1pcXMp1TURzklgR3ai3AAqxrsMVTr/BGif7+1L/uK6n/ANlGKu/wRon+/tS/7iup/wDZRirv 8EaJ/v7Uv+4rqf8A2UYq7/BGif7+1L/uK6n/ANlGKqQ8o+XDcNbC71A3CIsjwjV9R5qjllViv1mo VijAH2OKqv8AgjRP9/al/wBxXU/+yjFXf4I0T/f2pf8AcV1P/soxVmWlflt5Um0uzlkW/aSSCN3Y 6pqW7MgJP+9GKrU8k/lzJqsmkR3Uz6tDEJ5tPXWb83CQsQBI0QuuYQk05EUxVGf8qw8of77vv+4p qX/ZRirv+VYeUP8Afd9/3FNS/wCyjFUJp35YeUZdPtZZF1BpJIY2dv0rqe5Kgk/704qvf8tvIiXM dq73q3MyvJDAdY1ISOkZUOyr9aqQpkXkR0qPHFVX/lVnk7+TUP8AuLap/wBlOKu/5VZ5O/k1D/uL ap/2U4q8/sfJmjyWVvI8+pF3iRmP6V1LclQT/wAfGKq/+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9q X/cV1P8A7KMVd/gjRP8Af2pf9xXU/wDsoxV3+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV1P8A 7KMVd/gjRP8Af2pf9xXU/wDsoxV3+CNE/wB/al/3FdT/AOyjFXf4I0T/AH9qX/cV1P8A7KMVUovK PlyZpUiu9QkeB/TnVNX1Fij8Q/FwLn4W4upoexGKqv8AgjRP9/al/wBxXU/+yjFXf4I0T/f2pf8A cV1P/soxV3+CNE/39qX/AHFdT/7KMVd/gjRP9/al/wBxXU/+yjFXf4I0T/f2pf8AcV1P/soxVJfO vlfT9O8m69qFndanFeWenXdxbSjVNRPCSKB3RqNcEGjCu4xVN/y5/wDJe+WP+2TY/wDUMmKshxVj HnPy5r+sFG0rUpNPMVhqEMXp3E8AN5cJGlrK4h+0sVJPtV4kggE4qwqX8t/zQNrc28XmS4USiApK 2rXTTn004tH6v1UJGA25dYi0lPi48jRVF6p+XP5gTaPp9pZeZrmOeO0txqT/AKQu45JbyGYtI0dw VmZEliuJgaxmhSL4aLsqn/kvyn5j0jXdU1DWL1b/AOt29tbw3Bmlllb0Hmero6JHFQTBQI9moWIB Y4qzLFXYqzzRf+ONYf8AMPF/xAYq8l88fk/541DzRruv+WtXXT7jVleONxf31pLGpgsEUo8KSrGf UsnLcVPJeKntwVUvK/l380rzz5e30+oXcOkafrDSSR3d3qUcVxAbm8LLDbyRpG6rDJCirG3oUCty ZqqFXteKoXSf+OVZf8YIv+IDFXlnmr8tPzI1PUtSvdP1eOCeVbqKwuP0jfRSpFdXtpMBEUicWZS2 tmipFyVmAZg3NxiqlpH5cfm7b6vYXd/5g+sxQ3WnT3g/S2o8ZFgFLv8A0dYo4uL/ALEVQrNu5I+D FXsWKvL9N/451r/xhj/4iMVRGKuxV2KuxV2KsF8++TvN+t3ktxoutT6dH9Xt4YoIbya0BZJZnnJK RzqpblDRwhYhSnwhicVSfWPIH5mXc9y1p5jltY2u9UnteF/cqRHdrF9UWUGF1ZY+Eg9JOIjqGVma vJVdfflx5/a8Q2fmm7XT4J1FtB9euEk9EEy855JI7lpmWWaRPTNA8Yjqw40xVkv5ceWda8v6TeQ6 zOlxfXdytxJMtxPdliLWCBmeW4VJCXeBm49FBCjYYqyvFXYq7FXYq7FWPfmN/wCS98z/APbJvv8A qGfFWCeS/wDlef8Ag7Qf0b/hj9Hfo60+pfWf0h6/oegnp+rw+Dnwpy47V6YqnP8A1kH/AN+l/wBz LFXf9ZB/9+l/3MsVd/1kH/36X/cyxV3/AFkH/wB+l/3MsVd/1kH/AN+l/wBzLFXf9ZB/9+l/3MsV d/1kH/36X/cyxVlul/8AQ0H6MtPQ/wAEej6Mfpc/0ty48Bx5U2rTriqJ/wCsp/8Avxv+5virv+sp /wDvxv8Aub4q7/rKf/vxv+5viqH07/oaH9H23o/4I9L0k9Pn+luXHiKcqbVpiqI/6yn/AO/G/wC5 virv+sp/+/G/7m+Ku/6yn/78b/ub4qwOx/5X/wDUrf0v8Kel6acOX6S5ceIpWnfFVb/rIP8A79L/ ALmWKu/6yD/79L/uZYq7/rIP/v0v+5lirv8ArIP/AL9L/uZYq7/rIP8A79L/ALmWKu/6yD/79L/u ZYq7/rIP/v0v+5lirv8ArIP/AL9L/uZYq7/rIP8A79L/ALmWKu/6yD/79L/uZYq7/rIP/v0v+5li rv8ArIP/AL9L/uZYq7/rIP8A79L/ALmWKu/6yD/79L/uZYqk3nT/AJXn/g7Xv0l/hj9Hfo67+u/V v0h6/oeg/qelz+Dnwrx5bV64q//Z uuid:4296EAF480CEDC11945D974E704A7427 uuid:4796EAF480CEDC11945D974E704A7427 uuid:4196EAF480CEDC11945D974E704A7427 uuid:4497280377CEDC11945D974E704A7427 endstream endobj 132 0 obj <>stream hޜMO0 p 4Ilt&MiiSq?8"'?$V0> $> endobj 134 0 obj <>stream hޔXnF}Wm%}aDŋ @&J@7dfSդdpdrTWm={sf^/gƥgOFJy0&-MU,g3ewV7G,=6~eZUTԩ~ iuIsu?LjCAR8PϬK}JW"S_TU9?e+&ʹ ifeR*XZHiDU6Mߧg][`=TJkD$'A:IGTN'޴ O+:~';^uy: WlNF 8n4̑>#U4h=ʮn h[3骟=脀bM $0 /&фIޟM:"aڨv7%^dg>^CuX6SzJ`lg }UL ѳ5Ica/RL"HDp~ C8+JzXOs_#a֝RoWc#^i P]Qc>q٠>*g7 YXNpN@v?];\ƺ,5O6®5ac?Fs4M(6jiW8訠vA+dqNvd|!nAV&[LitHYJÔ#1H 5 }mw= KD|pJv#%N+Z)fmEyaljr\dIYL&$6S]6.-YÎwz_b3b'Yhz4 aAxV4I/|sP-( u< oAU9R߳˝G {YcT`h8HI gOorEkoB)ے )0HoZWgyr1VCoM^;Ќ11ըI46⍬&dC7 \e ԫ="O/X7P }&E m=#ǰ?"Ϡ7zY7xA;/HDfsw$)d'` G'8k x-g;I% 5ȲՎoȝs R8C6 sr= jm|AXQC儍.yqd ""p@Q%%Xg,]$F\*d (vɻ4sãW!Eԙ33瑇xžaiԙ6n{R(6‡K@`t|d wmvPP zy$[2fD ĊbĞF#8Dd j:y$,ՒŒǚS׈ȉ˗ExYӺuD:jfW`Ć0]s0 J #)fvґbnf9()VE:~9BUndՈ*xť6p:22wQio]pW̎cr H1^ 2áHG-`: JUqb>D`A[S)Ev|~2N8.6}ja9>'E˿I *@|¥7Rt!goc |n% #cU+|g`F= endstream endobj 135 0 obj <>stream hެKk@,EGs-"/TR@sF j8w.ܑuIΪ$G@TO}s *$eY UU`8PBEvDPGja$ @*x:k Ǜὄ]8<{aaZ(X>_ ǟݮV'AA-sC7X#GY˅c \JÒ5ƊU &Z8F5vVsZVsNidZUzd2y7^~ ;Z3HJ>2poN#6zz56tZͮ1z /~;~[|3tmԥ2Da*w;F[[x8ø6nx}& endstream endobj 136 0 obj <> endobj 137 0 obj <>stream hXnSST49wl/$YVFP(V YI. Gj_9H#[Nb <Rҥ(_UOwӗl o21SK53o9q{^g8 dNfFgG,e5n`XUㄓ |5@lf9|RIDݨ(|ʧź݌s*Xj۟df+4aQxvƔUL%Au󊄹%Ѣ| ʲH=dKrBе*2;Qܵy46q]_=n{PuLNjWn"%16[r a Me- j`y]8[ʑ*>ϖ{d-k,{ʪsYuQvE.C]'hp.gsvl1rXq !'_Et$b|Lde7{?ӝhMX$j9*JU/,g-†}46٪k`{8l;GǫM9p\?:wA(w ͝Mk&/di=ƆctZg|hs"7y ߉L{{D8F !k3VFb2Ŧ|_}D[B gVx%$]Nr:yy6&"=z6X{Տ-*@n]-U3hm}o19) zDi(qR1EKsl3#y=A@a7(!2Oag7dzh::#)\f~_.(TNKqzb89&] 67K>e$x-.aztri\~!j^\-h`\ÇjD㓀y'wg3ܼԛy'l0$5D0`C ]=lTQ?:PG꥖zXHY{eX]Y;ɫ0#m8^H0kۋAp~]_ʀnr]l)G$VhÛRТX%/x yw/Ļ`M*mɎ.r dyGOۂԨ Q"~j4|2Qbdӝ,!^YXQ$g'.ߍݡ1vha2D=) J4 >stream application/postscript Adobe Illustrator CS2 2008-01-29T10:28:16-05:00 2008-01-29T10:46:53-05:00 2008-01-29T10:46:53-05:00 256 216 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA2AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYqp3PP6vLwrz4Nxp1rTalMVfP/kTzZ+a2h+WdIt7qwupbzXtTg0uM639fuLiG4awsZJZ/ 9Na2naIejqErxgcBJRY3KDkyqJ0r8zPz4Gl3TXWgxyyWmlWc8Ukuj6slzJdv9SFyXijCwylfrFwo iiZW5RliFj3Kr3DR7m6utIsbq7iaC7nt4pbiB09NkkdAzoU5ScSrGlORp4nFUXirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVSO91rUIPOmk6OixHT7+xvrmVyresJbSS1VArcuIUrctUFS em47qp5irsVYx+Zvma88seR9U1yymtILyzRDbNfgm3aR5VjSN6SQU9QtwDGRVUmrHiDirJY3Ekau pDBwGBU8lIIrse4xVdiriaAnrTFWHflZ5w1DzX5euNQvpbO4kgvZrWO705WS2mSNUIkjDS3GxLH/ AHZX+YI3JFVZjirsVYlo/nLUL78yfMPlaawktrHSLKxuLS8khlUXL3JkMzpKf3RjWiIoG/JX3NPh VZPPZWc81vPPBHLPaOZLSV0VnidkaNmjYiqMY3ZSR2JHQ4qrYqxHzF5vv9L/ADC8p+XlEQsNfTUP WYoJJzLaQrLGE/fxGNKFi7+lJvxX4eXIKsuxV2KsQ/NrzlfeTfIWo+YrGOOS5s2twomT1IwJriOJ mZPVtuVFc8R6i1NN8VZcp5KD0qK03/jTFW8VWyCQxsImCyEHgzAsoamxKgrUe1RirH/y+1vVdd8o 2Or6mYHuLwzSRS20TwRS23ruLWZYpJLhk9W3CSEeo3XY0xVkWKuxVg/kTz3qWv8Am3zhod7FBGnl 66iitWhDBjFK0yr63J3+P9xy+ymx2UrxdlWcYq7FXYq7FXYq7FXYqw3QvM3n/WtE0/WLXQNKS21K 2hvIEl1e5EgjnjEihwumsAwDb0JxVHfX/wAyP+rFo/8A3GLr/vGYq76/+ZH/AFYtH/7jF1/3jMVa Go/mOSw/QWj/AAmn/HYuvAH/AKtnvirf1/8AMj/qxaP/ANxi6/7xmKu+v/mR/wBWLR/+4xdf94zF Wv0j+Y/IL+gtHqQT/wAdi67U/wC1Z74q39f/ADI/6sWj/wDcYuv+8Zirvr/5kf8AVi0f/uMXX/eM xVptR/MdRX9BaP1A/wCOxddzT/q2Yq39f/Mj/qxaP/3GLr/vGYq76/8AmR/1YtH/AO4xdf8AeMxV 31/8yP8AqxaP/wBxi6/7xmKofTtc/MO/0+1votB0hYrqJJ41fV7kMFkUMAaaYRWhxVEfX/zI/wCr Fo//AHGLr/vGYq76/wDmR/1YtH/7jF1/3jMVaXUfzHYV/QWj9SP+OxddjT/q2Yq39f8AzI/6sWj/ APcYuv8AvGYq76/+ZH/Vi0f/ALjF1/3jMVa/SP5j8iv6C0eoAP8Ax2LrvX/tWe2Kt/X/AMyP+rFo /wD3GLr/ALxmKu+v/mR/1YtH/wC4xdf94zFWjqP5jgqP0Fo/xGn/AB2LrwJ/6tntirf1/wDMj/qx aP8A9xi6/wC8Zirvr/5kf9WLR/8AuMXX/eMxVA675m8/6LomoaxdaBpT22m2015OkWr3JkMcEZkY IG01QWIXapGKsyxV2KuxV2KuxV2Ksb/LP/yW/lT/ALY+n/8AULHirJMVdiq1PtSf63/GoxVdirw2 fRf+cipzdNJfTSSRQWk+mkzWUEYu1ubSeeKQWvo84uMcsZ5hqpUVPI8lUDd+WPz9v7y5e5N5DaTi 8uVgg1UQSo+pwCSO2i9GVPh065hiTkZFHBn4h+TYqibzyb+dMGrTm1udSn0+SW8mj9LVShELXMjL AfrM859SWzX0YnXisTyI9EaNmxV7viq2X7I/1l/4kMVXYq7FXYqlXlP/AJRbRv8AmBtv+TK4qmuK uxVbF9k/6zf8SOKrsVQOux6lLoeox6WwTU3tplsXJoFnMZERJ7UemKvDrzyx+eIggFol6zGwZLqJ 7+YP6sV7ctCqt+l6h5o5I2kb1TwVQqyMKxFV7+K0HIUPcDcV/DFXYqtf7Uf+t/xqcVXYq7FWN/mZ /wCS381/9sfUP+oWTFWSYq7FXYq7FXYq7FWDfl3a+a/+Vf8Alj0dRsEh/RNj6aPYzOwX6slAzC7Q MadTxHyxVkP1Xzh/1c9P/wC4fP8A9luKu+q+cP8Aq56f/wBw+f8A7LcVWJa+cOUn+5PT/tf9W+f+ Uf8AL7iq/wCq+cP+rnp//cPn/wCy3FXfVfOH/Vz0/wD7h8//AGW4qsNr5w9Vf9yen/Zb/pXz+I/5 fcVX/VfOH/Vz0/8A7h8//ZbirvqvnD/q56f/ANw+f/stxVZLa+cOI/3J6f8AaX/pXz/zD/l9xVf9 V84f9XPT/wDuHz/9luKu+q+cP+rnp/8A3D5/+y3FXfVfOH/Vz0//ALh8/wD2W4qlfla183HyzpBT UtPVPqVvxBsJiQPSWlSLwV+7FU0+q+cP+rnp/wD3D5/+y3FXfVfOH/Vz0/8A7h8//ZbiqyK184cT /uT0/wC03/Svn/mP/L7iq/6r5w/6uen/APcPn/7LcVd9V84f9XPT/wDuHz/9luKrBa+cPVb/AHJ6 f9lf+lfP4n/l9xVf9V84f9XPT/8AuHz/APZbirvqvnD/AKuen/8AcPn/AOy3FVj2vnDlH/uT0/7X /Vvn/lP/AC+4qv8AqvnD/q56f/3D5/8AstxV31Xzh/1c9P8A+4fP/wBluKse/MS181/8q/8AM/ra jYPD+ib71ESxmRiv1Z6hWN24U06HiflirJ9V1K+sZIXW2ilsZJYIJZTMySq9xMsI4xekysAXU/3g 7/SqmWKuxV2KuxV2Ksd/Lf8A8l35W/7ZFh/1DR4qyLFXYqtT7Un+t/xqMVXYq8dv/wApvzCu7vUX m15bq0vJ9UljtLq8vJo0S6tpIbNY0kWRIvSad+XpgClPtUACqAsfyO82x+bzrlxqFkY7y/hudQsQ 0skT2ZuFu7q3o8QqwmjiEbbVUNUDlTFV9j+Reo2c+nxw6Xoi2dqLBblo5Hjlkkt0Uz3ScbP4J2Km JSzN+7ZmQxOW5KvbsVWy/ZH+sv8AxIYquxV2KuxVKvKf/KLaN/zA23/JlcVTXFXYqti+yf8AWb/i RxVdirsVYZF5O1L/AJW9L5xkeD6iNF/RUSKzetU3Czjkpj6cg+4lp9n4KgsVWZ4q7FVr/aj/ANb/ AI1OKrsVdirHfzI/8l35p/7ZF/8A9Q0mKo3zN/xzof8AmO0//qOhxViH5gfmrH5V87+VvL/Oz9DV nJ1X6zJ6cyQzTR2lsbccgGYzzF3qDSNH6dcVUE/PjQm0KfW/0DrIs4LCx1IKI7NppI9Uuja2UccS 3TO0kzIzqtPsjchiFKqc+QfzV8t+eXlXRIboehbxXVw1xGkYjS4llSBWAdzylSAyqKfYKk0JpirM sVdiryPyFq2ur5F8uKmpSog0uyCoI7cgAW6UG8RP34qn36Y8wf8AV0m/5F23/VHFVObX9agT1JtY kijqq83S1UcnYKoqYurMQB74qpr5l1L689iuuH68IxO9rS09URE8BIY/S5cSVpWlK4qqNr+tLMkD axIJpAzRxFLUMypQMQvpVIXkK/PFVT9MeYP+rpN/yLtv+qOKo/QLzWLzVfRuNSmaMQSOBwtxuHjH aL/KxVkv1K5/5b5/+Bg/6pYqhNMurPVbNb3S9b+v2bkhLm1e1miJU0YB0jZTQ9d8Va1W2vUtFMWp XEbtPbpzC25IDzorfahI6HwxViur+f8Ayzpd5fWE3mXUZdS090insobSJ5DJIpdFVvqgjNQN258V /aIxVLE/NbQ2hkkOo6wjx3ENs0LrpKtynCkHccQB6gBq1fAGq1VZB5W1yfzDNdRRXWsWLWkdvKxu 00ujrdKXj4egs/7IqeVOvzoqlGj6nrkOkWMMWpzLFHbxIi+nbmiqgAFTET0xVGfpjzB/1dJv+Rdt /wBUcVd+mPMH/V0m/wCRdt/1RxVoavr4FBqk3c/3dt33/wB84q3+mPMH/V0m/wCRdt/1RxVZNr2t wxPNNrEkUMSl5JHS1VVVRUsxMVAAMVUX8zahHdwWz66Uu7tWa2gYWgklWKhcxoYqsF5CtOlcVVZN f1qJo1k1iRGmbhEGS1Bd6FuK1i3PFSaDwxVU/THmD/q6Tf8AIu2/6o4q0dX18kE6pNtuP3dt8v8A fOKt/pjzB/1dJv8AkXbf9UcVd+mPMH/V0m/5F23/AFRxVIfPura63kXzGr6lK6HS70MhjtwCDbvU bRA/dir0fzN/xzof+Y7T/wDqOhxV5x+cvnseV9f0+3l0KyvtI1G2ifzDd3dvDMZLSHU7S2WIFp4f 7n6/JIPURl5stBT1CFUJP+a/5VTeXIWm8m3Muk3kNtbX+nyafY/6PDDfy2VnBc28kw5BLqKT00jD 8OtFrirNPyth8rXOjXPmTy9Zy2Fvr8yvJZTLbI1uLCJNOjtkS1LxxpEtpsnIlSTWn2QqzPFXYq8b 8h/8oN5d/wC2ZZ/9Q6YqmWraeupaVe6czmJbyCW3aRdyolQpyHuK4q80m/I2SaG89TW1Fzf31vqF zOtmR8duJf7sGclT+/8AgYseNO+KqVr+QcccsE02so8sVs8DelZJChlMs8scwRJOKtEbheNOhQEE dlU68jflVL5X1i31KTVUv3hsXsmUWgtyS8ok5KVkZUX4d0C7tViak4q9AxVNvKn/AB3P+jaX/k5F irMJIxJG0bdHBU060IpirH/InlKTyvog06W8F9MWQvOsRgUiG3itowIzJNT93bry+LdqnatMVTXV /wDeSP8A5ibX/qIjxVjvnjSdIaznS20WO61zURSCZNPS5ZmUqGLzPFJbo/A/uzcMEr12rirAx5L8 7yfot/8ADGnwxwxquolrbR/rclx9cUiQUSSARrbW8deJDbjivJRRV6L+Xmj3ul+WbaHUbKKy1Ec1 nWKK1h5KJXaMlLQCFah+XFSaV6k1JVYrpv8AxzrX/jDH/wARGKojFXYq7FXYq8mufyGM8txM+tRv NNbCyAlsvUj9FUEcYkUzjmUVQw3A9QBwBSmKui/IOH6xbS3esrcrBcTyyobKNfWhm9D91LSSj/7z nkzA8uRJHiqjvLH5OT6LrenapNrS3zafcXE/BrQRs4uIygHNZTRxy+KQhmcUHYYq9LxV2KuxV2Kp H58/5QbzF/2zLz/qHfFXo/mnUdPSK1sXuYlvZbzT3itWdRKyi+i+JUJ5EfCe3bFUfqWg6HqhVtT0 61vii8ENzDHMQpdJeI5q23qQo9P5lU9QMVYprf5L/l/q13ocraZBZ2ugyNLbadaW1pFbSFpY5+Mi mFmC+pECRGycqsG5KxGKsv0vStL0mxi0/SrODT7CCvo2lrGkMKcmLNxjjCqtWYk0HXFUVirsVYb+ XXl3y/J+X3liSTTLR3fSbFndoIySTbISSSuKsh/w15c/6tVn/wBI8X/NOKu/w15c/wCrVZ/9I8X/ ADTiqxPLfl3k/wDuKs9m2/cRfyj/ACcVX/4a8uf9Wqz/AOkeL/mnFUl1i/8Ayu0a5a01STR7O+EJ uBYyi3Fy0ShiXSCnquPgb7KnocVSoeevyjhk9SAwO6hEaO20+eWX9+trJF+7hgaSji+goaUq1Oqs AqmOj+b/AMvdX1l9GsY+WoJ1jl065t0PwepRZZoI4mJj+MANuu42xVkv6J0r/lig/wCRSf0xVRut D0WaH05dPtpELISjwxsKhwRsR2IxVb/hjy1/1abP/pHi/wCacVd/hjy1/wBWmz/6R4v+acVd/hjy 1/1abP8A6R4v+acVSzyv5e0CTyzpEkmmWjyPZW7O7QRkkmJSSSV3JxVNP8NeXP8Aq1Wf/SPF/wA0 4q7/AA15c/6tVn/0jxf804qsj8t+XSprpVn9pv8AdEX8x/ycVX/4a8uf9Wqz/wCkeL/mnFXf4a8u f9Wqz/6R4v8AmnFUpB8h/wCKW8s/UrT9M/UhqAtfqnw/V/VMXL1fT9Lly/Y5cqb0pviqbf4a8uf9 Wqz/AOkeL/mnFXf4a8uf9Wqz/wCkeL/mnFVj+W/LvJP9xVnu2/7iL+U/5OKr/wDDXlz/AKtVn/0j xf8ANOKu/wANeXP+rVZ/9I8X/NOKse/MXy75fj/L7zPJHplojppN8yOsEYIItnIIIXFU68w/XoBb 3ltfTQKLmzhe1VYGidZruON+ReNpKlJCPhcYqnGKuxV2KuxV2KsM/LvzH5ei/L/yzHJqlokiaTYq 6NPEGVhbICCC2xGKsh/xP5a/6u1n/wBJEX/NWKu/xP5a/wCrtZ/9JEX/ADViqxPM/lvlJ/uWs/tf 8tEX8o/ysVX/AOJ/LX/V2s/+kiL/AJqxVhfm7yf+W3mnUrjUNR1xUnubRLFxBd2yqIo5xOCAyueX NfHpiqCtfy8/Ku01W31CHWVF3FBDbtL9ctqyR2j2TwK/w78G09aU/nfxHFVM9A8v+S9F80X3mKLz Sbq6vy7S208+n+grSrEkjIIoYpAzrbRc2LktwHKuKsu/xP5a/wCrtZ/9JEX/ADViqyXzP5b4j/ct Z/aX/j4i/mH+Viq//E/lr/q7Wf8A0kRf81Yq7/E/lr/q7Wf/AEkRf81Yq7/E/lr/AKu1n/0kRf8A NWKpX5V8y+XF8saOrarZqy2VsGU3EQIIiXY/Fiqaf4n8tf8AV2s/+kiL/mrFXf4n8tf9Xaz/AOki L/mrFVkXmfy3xP8AuWs/tN/x8RfzH/KxVf8A4n8tf9Xaz/6SIv8AmrFXf4n8tf8AV2s/+kiL/mrF WPRWvkhPPM3m/wDTcLam9h+jhG1zbGJYGkWQhTT1R8UQPH1OFSx41JOKsh/xP5a/6u1n/wBJEX/N WKu/xP5a/wCrtZ/9JEX/ADViqx/M/lvlH/uWs/tf8tEX8p/ysVX/AOJ/LX/V2s/+kiL/AJqxV3+J /LX/AFdrP/pIi/5qxVj35ieY/L0v5f8AmaOPVLR5H0m+VEWeIszG2cAABtycVT7zN/xzof8AmO0/ /qOhxVhP5ljzUfO/lX9DfpL0NvU+p/WvqfqfpTTfU+u+h+44/o/63T19uvH4+OKse0Tzx+daPo0L eX1j0sJp0d5DPY6lNdBXTS1uq3c10x5KdRuTylViPq7c+R5FVV+j/mX+dL6bpF7q3ldFZ5XbVrW1 07UfU9D6zYwhIxM8bRSol3O55LIj+iSh4/FiqWRfmb+dK215qJ8sSNeiOCJWGlaybeRkj1GUJDZv MJF9SaG3hM7RoR6gaReCoAqnWo/mF+clpJcMvl9JoDfRx2yxaXfyyram81G2ZSFn4ySGOztpRKWj RVlqQQVqq9A/Lf8A8l35W/7ZFh/1DR4qyLFXYqtT7Un+t/xqMVXYq7FUmk1ydPOcGgtaUgn06a+j v/UG7wzxRPD6VK7CZW5cvamKpzirsVWy/ZH+sv8AxIYquxV2KuxVKvKf/KLaN/zA23/JlcVTXFXY qti+yf8AWb/iRxVdirsVSVtdnTzmmgtaUgn0576O/wDUG7wzrE8PpUrsJlbly9qYqnWKuxVa/wBq P/W/41OKrsVdirHfzI/8l35p/wC2Rf8A/UNJiqN8zf8AHOh/5jtP/wCo6HFWE/mT54/MfQfMdvZ+ WtB/Sumvpl5cyzfU7y4b65FbXMlvEstufSUGaGJWR6M3McD14qpN5u89fnhoVhe3Nno1pq8trf2l nDBbaXqTGeJtNF5czp6U87BfrB+rxniVV/tnwVZj+X3mzzJr2o+Y7XVrWC3j0G9bTBJCrr6s8byS NIOTyURrSW1YDqGL7kUoqzPFXYqwz8u9dsY/y/8ALMbRXZZNJsVJWyu2WotkGzLEQR7jFWQ/4hsP 99Xn/SDef9UcVd/iGw/31ef9IN5/1RxVYnmCw5P+6vN2/wCWG8/lH/FWKr/8Q2H++rz/AKQbz/qj irv8Q2H++rz/AKQbz/qjiqFfXdE/SUMjW9z9dEMqxSGwu/UEReMyBW9GvHlwqPliqK/xDYf76vP+ kG8/6o4q7/ENh/vq8/6Qbz/qjiqyTzBYFR+6vPtL/wAeN5/MP+KsVX/4hsP99Xn/AEg3n/VHFXf4 hsP99Xn/AEg3n/VHFXf4hsP99Xn/AEg3n/VHFUr8r69ZR+WdIRorzkllbq1LK8IqIlHURUxVNP8A ENh/vq8/6Qbz/qjirv8AENh/vq8/6Qbz/qjiqBj87eXRzUy3AZXdWH1O72ZXIIP7rsRiq/8Axv5d /wB+3H/SHd/9UsVd/jfy7/v24/6Q7v8A6pYqo/4s8rG8F2fVNwsZiSc2V1zCM3J0DelUKSqkj2Hh iqt/jfy7/v24/wCkO7/6pYq7/G/l3/ftx/0h3f8A1SxVa3nXy8WQiW42NT/ol34Ef76xVd/jfy7/ AL9uP+kO7/6pYq7/ABv5d/37cf8ASHd/9UsVY/8AmH5y0CXyB5miSWfnJpV8q1tbpRU2zgVJiAH0 4qyLzBLcTTWunRJFR7i0naV5kRgIbpJWAjPxN8MW1O+Kp3irsVUbWxsrT1fqtvHb+vI08/pIqc5X +3I/EDk7U3Y7nFVbFXYqx38t/wDyXflb/tkWH/UNHirIsVdiqR6Bq1/eax5jtLpYlj0y+jgtDGGD NFJZW89ZCxNW5St0AFPvKqeYq7FUun/5SKy/5hLv/k7bYqmOKsc/MPzdN5S8qXeuw2I1GS2aJVtG lMAb1ZVjJ9QRzU4hq/YOKvMtY/PXzRBLA9vo0H1eO+uYdSth6k0qQ6bFbzXbQScoRIwDzGOqLyoo 4g4qjfKv5sedNR83+XdIvk05rTV3lN0sNvNDNFH+i4b+Hg0l1JyPOR0YrG2yioTkDir2PFXYql3l v/lHdL/5hIP+TS4qkfnLzbf6Jr3lvT7b6t6OsXJgvGnWUvDEJYUEy+n8NGklW2Aan72aNq8VZWVZ birzY/71Xv8AzG3f/UTJireKuxV2KvIU/wCcgrR5RbCxtEunKBOV85hRZeAV55RbcIwhZhKNypA6 gkqq3pX526tcW0dzLpVvMjSXMUkUErqU+p28E8rFir/EfUk4x8f5QX6nFWfeRPNY81eWbXXBbpai 5aVfRjl9dR6cjR7ScI614/y4qn+KuxVIvP3/ACgvmP8A7Zd7/wBQ74q9M80W9u9nbzNEjTJfaeEk KgsB9eh6HqMVYp+YH5qx+VfO/lby/wA7P0NWcnVfrMnpzJDNNHaWxtxyAZjPMXeoNI0fp1xVQT8+ NCbQp9b/AEDrIs4LCx1IKI7NppI9Uuja2UccS3TO0kzIzqtPsjchiFKqvov55+T9Z0LVtasbe+a0 0TTv0tfq0cSSLCzTeknEy09SaO3MqAmnAqWKk0xVA3f/ADkP5RsrprS80vVoLmO1v7q4jMVs4ifT HvEmtpHjuHjEzfoydo6MVYD7XWiqjN/zkd5WguDazaBrwvEaT1rWK1guXihgnltZ7mT6tcTKIop7 aRGNa7VAKkEqsl/LvVL5Py/8squkXcirpNiBIr2nFgLZNxynU0PuMVZD+lr/AP6st5/wdn/2UYq7 9LX/AP1Zbz/g7P8A7KMVWJq1/wAn/wBw159r+ez/AJR/y8Yqv/S1/wD9WW8/4Oz/AOyjFXfpa/8A +rLef8HZ/wDZRiqDlvdSbV7a6GjXfCK3niZednyrI8LCn+kUp+7NcVRn6Wv/APqy3n/B2f8A2UYq 79LX/wD1Zbz/AIOz/wCyjFVkmrX/ABH+4a8HxL+3Z/zD/l4xVf8Apa//AOrLef8AB2f/AGUYq79L X/8A1Zbz/g7P/soxV36Wv/8Aqy3n/B2f/ZRiqW+WtXvT5d0oro14ymztyGD2e49Jd97jFUy/S1// ANWW8/4Oz/7KMVd+lr//AKst5/wdn/2UYqwp7DzKLi6ZNBu5ElubiVGWWxA4yzO4+1cg1AahxVr6 l5o/6l68/wCR1h/2VYq76l5o/wCpevP+R1h/2VYq76n5mrT/AA/eVG5HrWHf/o6xVQsdE12wsoLK 08tXkVrbIsUMfr2J4oooBVronp44qrmx8zkUPl68p/xmsP8AsqxVA6N5Z1XRdPi07T/LV9Faxs5R HubSZi0jGRy0kt27sSzE/E2Ko76l5o/6l68/5HWH/ZVirvqXmj/qXrz/AJHWH/ZViqR+fLHzJ/gb zF6mhXcUf6MvOcrS2JVR9XerELcs1B7AnFXonmOWR7yzs3uxbWrT2krA2VxNyeO6V0T60jrDHzZF SjCor7jFUzvNE0W++sfXbC2uvrcccF160McnqxQszxRycgeaI8jMqnYEkjriqGm8o+VJ7CTT5tFs JbCaGC2ls3toWheC1YvbxNGV4lIWYtGpFFPTFULpPkTyzpY1mOCzje11x4jeWUkcX1cQwWkVlHbJ CqKggWGAUQg9T22xVVuPI3kq5uze3Pl/TZrwpNGbmSzgeXhcmRp15lC1JTPIXFfi5tX7RxVu58ke S7qRZbnQNNnkSQTI8lpA7CUSSSiQFkNG9SeR69eTMepOKof8t/8AyXflb/tkWH/UNHirIsVdiq1P tSf63/GoxVdirB/zO8xeftGt7V/KOmx6hIY5pbpZbW4uqlJII4419CWHgzCZ335bIdu4VYGvmP8A PKTW7eJ4b1NNuk021llSxiWW2kuo4Zbq5UvAyMsXpyxuGBCs67bYqyn8stT/ADHuNfu7XzO13JYR 6fZyxzXVrHADcy2ttJKFaO3tl5LM8ysoeTpQiPjR1XpeKrZfsj/WX/iQxVdirsVdiqVeU/8AlFtG /wCYG2/5Mriqa4q7FVsX2T/rN/xI4quxV2KsL0/VPNr/AJq6lp11BOvltLAPYyiMC3Mg9E8mkMG8 jNJKoUXJ2U1jGzlVmmKuxVa/2o/9b/jU4quxV2Ksd/Mj/wAl35p/7ZF//wBQ0mKo3zN/xzof+Y7T /wDqOhxVDa3568r6JqtvpWpXbxXtyISiJb3EyILmb6vA00sUbxwiWb92hlZQzbDFU00rVLHVtLs9 V0+X17DUII7q0moy84ZkEkbcWCsOSsDQiuKorFXYq7FWGfl3P5hH5f8AlkR2Vo0Y0mx4M13KrFfq yUJUWzUPtU4qyH6x5l/5YLP/AKTJf+yXFXfWPMv/ACwWf/SZL/2S4qhLLVPMU9zfxDTrNTaTrCxN 5L8RMEUtR/ovhLTFUX9Y8y/8sFn/ANJkv/ZLirvrHmX/AJYLP/pMl/7JcVQkuqeY01W2s/0dZlpo J5g/1yWgELwqR/vL39bFUX9Y8y/8sFn/ANJkv/ZLirvrHmX/AJYLP/pMl/7JcVQmp6p5jtLZJW06 zYNPbw0F5L1nnSIH/eXsXriqL+seZf8Algs/+kyX/slxV31jzL/ywWf/AEmS/wDZLirvrHmX/lgs /wDpMl/7JcVSvyrP5j/wxo/Gxsyv1K2oTdyg09Je31Y4qmn1jzL/AMsFn/0mS/8AZLirvrHmX/lg s/8ApMl/7JcVQmmap5ju7Z5V06zULPcQ0N5L1gneIn/eXuUriqL+seZf+WCz/wCkyX/slxV31jzL /wAsFn/0mS/9kuKpRfeadYsdTktJtNty4gilDJduRR3kWm9uv++8VWf411H/AKtsP/SU3/VDFXf4 11H/AKtsP/SU3/VDFVrec9RJU/o2H4TX/epvAj/fHviq7/Guo/8AVth/6Sm/6oYq7/Guo/8AVth/ 6Sm/6oYqkH5gecL+XyH5kibTolV9KvVLC5YkA27itPRFfvxVm3mb/jnQ/wDMdp//AFHQ4qlGs+T9 aufNR13SdaTTUurW0sdUt3tBcvLBZ3MtwqwyNKiwmQXMkblo3+E/DxYBsVebSf8AOMlz6100XmSE w3mlWGkXEE+nySJImnQWccTyKl7ErcZLD1EXiPtlXLpsVWc/ln+WEvkq+1u7k1OLUG1g25Iis1tW U2/qDlIwkm5krKBReCKF+FRU4qzzFXYqx38t/wDyXflb/tkWH/UNHiqN1eHVpNV0N7MsLOG6lbUw rhQYTaTKnJajmPWZNt99+2KpriqVaN/x0dd/5jk/6gbbFUD+YSecH8q3S+T5DFr5aL6s49AkKJVM n+9IaLeOo3Hy3xVkMZcxqZBSQgcwOgNN8VSy5/5SnT/+YG9/5PWmKpriqU+V7fVrfSTHqrO139av XBkcSN6L3cr245AtsIWSg7DbtirfmX/jnQ/8x2n/APUdDiqa4qlWkQ6tHquuPeFjZzXUTaYGcMBC LSFX4rU8B6yvttvv3xVNcVSryn/yi2jf8wNt/wAmVxVL9cTzp/jHy6+lPTy2ouhr8X+j0blGBbn4 x63wv09Mj/KqMVZLiqVeWv8AjnTf8x2of9R02KpT+ZknnuPywzeSIfX1r1V/dq9tG/pcWqUa7V4a 8+NQw3WtCDQ4qysVoOXXvTpXFWEeaf8AlJ5P+YK2/wCTtxiqXYqxTz5qHme1fQYvL3J7m61JEuYR 6NJLdIpJZUdph8K8Y9ylG8MVYGbP897qJPrf16J2juYZBBcaWpCuWMDMyemOfJV9RkVSEpw+LnVV F2mpfmjo+p+X7TW7qb0b6aKEoPqEgZ/rCJJHIxBndRaqZKoS/IlmPEHiq9cxVI/Pn/KDeYv+2Zef 9Q74q9P8zf8AHOh/5jtP/wCo6HFWIfmD+Tlj5x1S61V71LPUZLSws7G8+rJPNaCzu5rmZonZ1p9Z Sf0nG3wjfkDTFWG/9CsaZLo8Gn3erW8xtbWa0tJDp/IQrL+k2HpCa4mdQkuqpIBz6wKa1oVVeg+R vy1i8q+ZfM+uLfG8k8yzx3EoZZRIrI8r/G7zSo9PX4pwROKqBud8VZrirsVYr+XtlP8A4B8tcb2d V/RVjRQIaAfVk23jJxVkH1K5/wCW+f8A4GD/AKpYq76lc/8ALfP/AMDB/wBUsVQ1ppEkE97Kl/cc rqYSy1EFOQhji2/dfyxjFUT9Suf+W+f/AIGD/qlirvqVz/y3z/8AAwf9UsVQ0mkSNqUF2b+49WGG aJNoKcZWiZqj0vGIYqifqVz/AMt8/wDwMH/VLFXfUrn/AJb5/wDgYP8AqliqG1DSJLqBIpb+44rN BKOIgB5QzJKv+6v5kFcVRP1K5/5b5/8AgYP+qWKu+pXP/LfP/wADB/1SxV31K5/5b5/+Bg/6pYqh tM0iSz020tIr+49K3hjij5CAniihRU+l4DFUT9Suf+W+f/gYP+qWKu+pXP8Ay3z/APAwf9UsVQ2n 6RJawPFFf3HFpp5TyEBPKaZ5W/3V/M5piqJ+pXP/AC3z/wDAwf8AVLFXfUrn/lvn/wCBg/6pYqlV 95ThvdQe6m1C6EvoxxHj9XA4ozsNjCe7nFVP/A9r/wBXG8/6d/8Aqjirv8D2v/VxvP8Ap3/6o4qt byTagqP0hefEaH/efwJ/3z7Yqu/wPa/9XG8/6d/+qOKu/wAD2v8A1cbz/p3/AOqOKpD5+8l2qeRf Mb/X7tuOl3rcT6FDS3c0NIQcVZpe6PY3txFPceqzQMjxos8yRconEiM0SOsbEOAfiU4qjcVdirsV dirsVSjyfb2lt5S0S3s7kXlpDYWsdveBTGJo0hUJJwJJXmo5U7Yqm+KuxVan2pP9b/jUYquxV2Kr T/fL/qt+sYquxV2KrZfsj/WX/iQxVdirsVdiq2H+5T/VH6sVXYq7FVsX2T/rN/xI4quxV2KrR/fN /qr+s4quxV2KrX+1H/rf8anFV2KuxVJvOljdX/k7XbG0jM11d6ddwW8QIBeSSB1RQTQbsab4qnOK uxV2KuxV2KuxVA6Etyuiaet3FBBdC2hE8FqKW6SCMckhFT+7U7Lv0xVHYq7FVqfak/1v+NRiq7FX YqtP98v+q36xiq7FXYqtl+yP9Zf+JDFV2KuxV2KrYf7lP9UfqxVdirsVWxfZP+s3/Ejiq7FXYqtH 983+qv6ziq7FXYqtf7Uf+t/xqcVXYq7FUp83fU/8Ka19d9f6n9QufrP1Xj9Y9L0W5+jy+H1ONeNd q4qm2KuxV2KuxV2KuxVLPK8cMflrSY4LWWxgSyt1isZ6+rAgiULFJy+Lmg+Fq98VTPFXYqtT7Un+ t/xqMVXYq7FVp/vl/wBVv1jFV2KuJCgsxoBuSegGKpbpvmHQNagMuj6naalEjJzeznjnUVcqKmNm p8SMPmD4YqmWKrJp4IFDzSLErMsas7BQXkYIignuzEADucVdHPBK0qRSK7Qt6cyqwJR+IfiwHQ8W BoexGKqf1m3hS3SaVI2nIjgV2Cl34F+KA/abihNB2BxVXxVaJoTM0IdTMqh2jqOQViQrEdaEqafL FXRfZP8ArN/xI4quxV2KrR/fN/qr+s4quxV2KrX+1H/rf8anFV2KuxVLvMcssXl7VJYrxdPljtJ2 jv3FVgYRMRMwoaiM/Edu2KpjirsVdirsVdirsVS3y1JHL5c0qSK8fUYns7dk1CRWV7hTEpEzK3xB pB8RB33xVMsVdiq1PtSf63/GoxVdirsVWn++X/Vb9YxVdirsVeKeaPyKstf1O7Nl5ohttTSKSG4h +qRXLJHd3816vrRNMCVBnPCtPiUOKEYqnHmb8jf035nvdZ/TYgg1AXQubF7OOav1nTxYVWUurqaA M/ZwFUj4QcVSX/oWiFTeQx67HHYXWlx6WtqunRDhwmt55JPUEoZlke3YmP7PJ2brXkqp+aPyLi07 SLnV4tQt7uXToLBhBd2sPoNb6bAscsUhmubeP05vSWRleRFqgqduQVVV/wCcftSv7KOa68wi1uZb bT1+rrZxzLFJaaclm6SOXX6yjMpIEi0Cll/aJxVBT/8AOMkEVlBDF5mhtdQltvqUtydOiK3UnqNN yeFpvjoigKtSV4KwPwiiqcWf5A2Gk6lpupLq1qq2N5ptxynsFL8rNt0hczqsbXM0rOxZH+NgwHMB sVU9Y/5x8n1QavInmKO2uNS1HUb6NhpsLpGmoPbkwyR+oBLw+phvUNGL0f7S1Kr2UCgArWm1T1xV 2KrR/fN/qr+s4quxV2KrX+1H/rf8anFV2KuxVL/MMVxNoGpxW1pHf3MlpOsFjNT0p3aNgsUnIqOL n4TUjbFUwxV2KuxV2KuxV2KoHQvrP6E0/wCteh9a+rQ+v9V/3n9T0xy9H/iuv2fbFUdirsVWp9qT /W/41GKrsVdiq0/3y/6rfrGKrsVdiryDzj+QEGuazq+sWurQ6ddareWtyD+j45+CQqqzROHkUSid 1V2qAPhWoJFcVX+b/wAhrnzFJNTX47aKX9Fir6etxN/uLikjDGaSblzk9Z/iXjxBpvUkqqvlb8h4 /Lfm+012w1hEsbW5urldJSyjRALmB4VSKRZKw8Q45cVo4VQQKAhVb5a/IVNK0DU9IvdXh1BdR0uT SvUGnx26oj3U90rCJZGj4xvcniiBd9yfshVVTS/yQWz0zzDFHqkBvNetIrSG8bT43MKpQu8qSSut w85RWm5cVkYVK9sVb8wfkauttC15qsUzwabbaYHuLITswt7e4t2lctN9o/XHdaU4t9ovtRVQX8g4 xqWq3Ump2txDf3n1y2gn04SfV1W5S5SBWNxQxsY6SgKvOifZ47qqPlD8gJNC1PR9SOvJcTaZdXE9 yy2CxyXCO0XpRCVppXiEfotWhPLmw2BNVXsOKuxVaP75v9Vf1nFV2KuxVa/2o/8AW/41OKrsVdiq U+bktH8qa0l5FLNaNYXIuIbenrPGYW5rFXbmV2X3xVNsVdirsVdirsVdiqW+Wo44vLmlRxWb6dEl nbqmnyMzPbqIlAhZm+ItGPhJO+2KplirsVWp9qT/AFv+NRiq7FXYqtP98v8Aqt+sYquxV2KrZfsj /WX/AIkMVXYq7FXYqth/uU/1R+rFV2KuxVbF9k/6zf8AEjiq7FXYqtH983+qv6ziq7FXYqtf7Uf+ t/xqcVXYq7FUt8yyGLy5qsgvP0cUs7hhqHEt9XpEx9biNz6f2qDwxVMsVdirsVdirsVdiqWeV5IZ PLWkyQXUt9A9lbtFfT19WdDEpWWTl8XNx8TV74qmeKuxVan2pP8AW/41GKrsVdiq0/3y/wCq36xi q7FXYqtl+yP9Zf8AiQxVdirsVdiq2H+5T/VH6sVXYq7FVsX2T/rN/wASOKrsVdiq0f3zf6q/rOKr sVdiq1/tR/63/GpxVdirsVS/zClw+gamltbwXdy1pOILW6ANvK5jbjHMGKgxsdmqRtiqYYq7FXYq 7FXYq7FUo8n6hcaj5R0TULkKLi80+1uJgg4pzlhV24qOgqdhiqb4q7FVqfak/wBb/jUYquxV2KrT /fL/AKrfrGKrsVdiq2X7I/1l/wCJDFV2KuxV2KrYf7lP9UfqxVdirsVWxfZP+s3/ABI4quxV2KrR /fN/qr+s4quxV2KrX+1H/rf8anFV2KuxVJ/Ob2cfk/XZL2Jp7JNPu2uoY24O8QgcuqtvxLLUA4qn GKuxV2KuxV2KuxVhnle582aR5a0nSp/Lksk2n2VvayyJdWvFmhiWNitXBoSu2Kpn+nvM3/Usz/8A SVaf9VMVd+nvM3/Usz/9JVp/1UxVauueZwXP+GZ/iNR/pVp4Af78xVd+nvM3/Usz/wDSVaf9VMVd +nvM3/Usz/8ASVaf9VMVWnXPM/qBv8Mz0AI/3qtO9P8Aiz2xVd+nvM3/AFLM/wD0lWn/AFUxV36e 8zf9SzP/ANJVp/1UxVa+ueZ2AA8sz9Qf96rTsQf9+Yqu/T3mb/qWZ/8ApKtP+qmKu/T3mb/qWZ/+ kq0/6qYq79PeZv8AqWZ/+kq0/wCqmKrY9c8zrGqnyzPUAA/6Vadv+emKrv095m/6lmf/AKSrT/qp irv095m/6lmf/pKtP+qmKrU1zzOoIPlmfqT/AL1Wnck/78xVd+nvM3/Usz/9JVp/1UxV36e8zf8A Usz/APSVaf8AVTFVo1zzP6hb/DM9CAP96rTtX/iz3xVd+nvM3/Usz/8ASVaf9VMVd+nvM3/Usz/9 JVp/1UxVa2ueZyUP+GZ/hNT/AKVaeBH+/MVXfp7zN/1LM/8A0lWn/VTFXfp7zN/1LM//AElWn/VT FUs80XPmzV/LWraVB5cljm1CyuLWKR7q14q00TRqWo5NAW3xVmeKuxV2KuxV2KuxV//Z uuid:4497280377CEDC11945D974E704A7427 uuid:4196EAF480CEDC11945D974E704A7427 uuid:4397280377CEDC11945D974E704A7427 uuid:4297280377CEDC11945D974E704A7427 endstream endobj 139 0 obj <>stream hތOk0 ſa%n %K/+&CzP6h})va'==mg ,8˰B-pZ=`6/Mw]i5dOf{yxO/R I d&p'>g_gnys]7 iffɂ4M%M.:y.Jk`-K<DzMdh! Q4AI;vbd^S(/:sчQJsfw9 6vro00 TJ*@^NĹq endstream endobj 140 0 obj <> endobj 141 0 obj <>stream hޜZr}Wq`M7lƕ8 JI`2oL"\̭=y\]Ndi\IB/Si,'U2ygsJh/".-ũ9'If1&*بY䜚FY ժq>t}4-b֑VC_ngW&ĖMbe1뫥o4. 5HfmW~ٜ6,XOS" G[Qj2;<.hSڦP$uɑdSl;oNRnXof3#1qQ&`fB L5hj :CC38Ej@UMDnCdT;u,i\ݚ&K55zVwє>ݼū:,SB`{ۯCݷanrx_Vs^,m8EgG84D"/'Sm4/jSʚQ2bMDmd #H݆LфtV5AJGV 4> ^O‚9̻ VMVhh~miWU.ٕ:Q@ASy|4ݓ4,Fp`gdAն_q: (| Obs~ŋj>&hDղfLّQH(xA^րW4bشyb.q- ?)9v0%4X$=4~L=8^ͦ#cZ7{Bdm|]г3yhe?Cg'g vgCX!UJɧMD1gBTm` J4BvJN2#-9`8`QL&R~eܮva:g ;?eXj [8!/ej:[R}3>9l=0!?ȭ[hB2 xs~ŗC`F fD<2pphh\юl90|r'Yq4ͱ} <3B`DH[sͅ*(,iLB<(| '^yzŵD8Vv'C%\Up,I4=$e j=t$x@ 34svALs7RP!fj%t/yhqZΥlb uJӴڱ`|),2Rr+jQre^|_P]]D?"O/8SB/tJeJn&&KNOZyyp`2X|Gnu. sd0|j|BqBfy?%󃋥ő?7_:* '! #F cBZEMOL|Dcx`bl.6hR $~#a0! uuX{)dN-ԗ8Jey~. p#pɶv_i쎝0좂a/8 yN]gRF+x!Prkq$ɫ>Q-,hP+B@ `їZ_}Lu2V@~ U*0E' شs" nh).F[()#\pYV<ݰoXrBK2j_(MDEc.ՍWhV squڅDžP=l)yps9V8F8>stream h,= 0 q)bHWMÛ8E{\SҠ岄:YjRH9ɮNdcڻTxy[x endstream endobj 143 0 obj <> endobj 144 0 obj <>stream h޼Zr}WHL3~mToSEQ $sN,!UK==}}_aw~ff*,?yp.Ϭclg7Y7[x-OIEf>yΫ,$ߦelHϊdn}fMutn,oӹ\<,qƕY9 yBV2Wu5577(2og.*]d+T:E4ʢA.TX-9HYܦd{Dx-21䰆(ۘ.ăx|Msin } @mV: (ܥ߄k3!^M~hZT0󅡆}\ubc Qy+#-N0sd (f(&5s÷(h.|XOؚ<gAnYۻjyh0 暼qz'0SО-+ 8<6:$w bCJQzveSz,p`%qIlZuu`&7X&&%Kc@9MPT=b:QEU{{~]B~9ovդ`?{(DB$ޒzqAu) <rrs9 Ns$qΘBˊ ( _Y_(ļ*zBanH -"5_.Hj袰P]906@/8fP D1 [PS:JJtOU"8fFTғT\\'J?ꤧW{U}])sJtzffQOkF-CӰl¨ڦē5Xas fE8 Ap8aݞ>zm7]_{a3q/^Ln]+Yc#)tnx 6^|k~KQJjf\Aݶ!&~@ H!A'MZ0DMxH@ ,.<P2 ѭWH%n Z%̎rf5q*GZg XDC-DX4OM{W.(#Y:e<#:O9\,F9NaU7CL9b.rXXv4*YiNO>jJ`4IQ b 'NV'+7 8qnq;]ݑŞa򂍔K +j!URjDVq,ܬE)>!:ԃdx/X/7UQfFC(+ E<璇F5Wg q٪kj4sF/[.Dc:>5& [{- &>^!<3AKeJjEi?Sɴ&.դFQoAԸ Tk9?sgT|-[.Ldm~5]sԍG?c49s+#nEqA[1²o6O6h 3siО H?Nf=~W~9phyM@dE&xlO #*8QS,EyҳB E3EP # (%u,z^e 61(D- Ή-؈x*6i!4G\6RPkδ5I,dZӄ?:%)BaG֔W5}o*V}Zevþ^wa$ҵS.M?|?9t/4pnx+)6?U>SYci8/m6#/eyG\>stream h,= O\J8ê-|5bQtRYT]61<7ͨuC l_rN`Yb6-/\Ҏi XG'- endstream endobj 146 0 obj <> endobj 147 0 obj <>stream hތYێ}߯ x;rX@È^p1z眪nZQ Ad_ztw?jg_w߽gvXCw-#0Ye.qV9rC)øoE܉?NܷDۦ%ܩ= }Qlg ^pi屲|.7å]bi5v7x7[$ 5?u帻v !r5k-TpY*L:w\gyY=_{8C1@ C455Hv0nݬŔ-0Φe-*&1S}aFx3#Xoֽ 8;ƴj SFN0$}$_J'a12dtJ{9* 8dS .kޭ9fv~.pl ,˞9#'\6K@@2YD"){1Z*v k|ydfʑ5! [{NdauԚk{=ٚU;i̤bcFaq(⴬"a8p}!Nvq1_ T_h@q<}@8i瑞(L7l- Y&p3 eUJbg%> \8 #`Dd^H0rqYx(yܫd騒iџSeぱ[gq^*37/~D:9lֹbZ3*^)|C v@N(BGiFiwêC0›FnSKid`y6Tо;j띵d*.ZX<{e F\&Q?jE2sǼ9$lS*0fސjXjKFI0*~(V$l8OH L=\PA oBA'v >BQR;&&,ü%pLhtIsWH{)da%R/` w I/nfKKgcX5ΌI߇|e|F# C6/sƚUlpmۼ}5Vʛga6Ң(>cjYC]C]V񯒲9'\k9ӾA.MDUBc=a|HXdyf }NJ6XeDV3p|]o!>n?jipМV#E|`K?%4K\Vˋ/̽MRFAX(DZic|cXn cCFGKSO|\<ŋ+W]!]9q'@mju*r S #\EyZ88s>nLj=Pz |!o;H%L^v"0ڲ>BB%nBqO4vZ3BMp\[H'(l]vV4PX@CthIl 9Aq6&5l˥il>yB_(C)P` Asa']6BR#091lN{ u6ZVӀla>stream h,; EѭhA["tZI,ݜ<#ND;9IJ,c'ͨ Xف͜۲"^HVc\m . endstream endobj 149 0 obj <> endobj 150 0 obj <>stream hޜVo0~_09Dh V4x!<-hZ ʏ*hjФIž;?ss17gFH#d' cq̀s(2`ʠqό[r#²7꓏ҀfuHl>umqSN wy^7/-ۡIڸ oFgf"^Pפ,BFfK}#e<-ܑܤF]ag\wləLmre%.f3kra 6:~XZ LuW$`>6UFӓ\ 4ոڞ,Fzy>\u8e8Q"-LNz N?jk:}juY4E ԕD8MK\OvsX#tڠReB:# `A(jlʥ$7hKc]HZh3i'o'>ip+ZYM%j!!މUv*)(D5,.BPfY#p狻tz1G>̑Y] 9Cn:!P,>w},R坕Gu|^o@`L M7-4(wfySB_A9?=qg =SsؾU-{}I/r0 KyѵE(W?hjH~-*IRteXb#4(q gԗi G>stream h21T0Pw(q.I,I݃  ́2Avvny%@Q73bdA'D釤VW endstream endobj 152 0 obj <> endobj 153 0 obj <>stream hTTn6+$#>Dt:)Z4jS 8c K,'R:b_ιOmKl ]4ǝ*_LTkh89c'lûAE༲gUUW$Ch;YZU-IAyq,i}iv* _E a 1bvE]G"ګd6x .Z ~mtN@g4NiN}>d}Nni@wY2GQF9@پHoLnh? *5uze:U_S}f3QDm,#ء`WS[v^iֈá@ExݦbJёOU:#Q(΋,kw'D,mj' 1߲d9X S\F7@␣! 5b:I[dc;F |F f=>Spu?:-m@߄}Zӏ-Rm|ϴb3HH_*M f%9 >nU$Z/(0KAa $t-sl9Cn0ɺ7Mڵ4(~0"bz&7&ܲJ-1CU~3Է4}>Pq[yVe=wgi[;lxJC;wM<ZS\%]~X|)/ :f]:mХxq4`!bZ endstream endobj 154 0 obj <>stream h214P0Pw(q.I,I݃  ́2Avvny%@Q7c1HPT 3H?$H6A'D釤V endstream endobj 155 0 obj <> endobj 156 0 obj <>stream hXnF}Wq(G'q5Z4|+@I@Rr٥D:֥M€E33g27?`M2M06:Hlm֓oɛ&PAhAL|aueA'QfBM8YP&qP~Oͼ~mI,yD"{4}VŷiOBNJvP"eL ™ОyzibFH u%&x]WeM8ÞG‰e|VWQu(*kV24JL#-ղqOu Ta$A""(߳ԙ^5d\+Dڮ8D:7jͶ׍07! -dTtR n[-CZ,?}{165$ϒdyJ|nWt[W2fe\*?J|gh JR8ԜLmT\VW~lo·RSq'V4dȝ 3". ;+Vk#XKUf]`5R}U+iɃKNetkKOv8-jTBCttxVG]UӃ(ױ[fj[=4 *'u&ʖ\04e(v,\)@|hYnZԂSwo++U=wGCR`r[d +n  ەgvަ/Ʃx]L;1MRiy0S}! 9>#^(bEu<0Jڶϝ*+8,fq{Ggrz(֙vO{^5s-7{b8A-ظtq@'̊%Z1iR8S&99 !0 ?ĜrIa!ܸ5 t^RG:w;X.܏Zbt."SdBߺb~gÅ78S7(XsF*Sr*0?ZΝ';)ff*z D{>(:3K:3HL_D>b"A<1,d<*btr3&  @C:4!z_b챉6s1xk %džFƹ$UϠXa `u>vÇ>|/Vӌt| x,w'Rd%g}[퀪3_bɂq8B0vGvYsvh%gSWלO'Ă_E,hA5PŘ/C]:ZSFi!=^]rs\^!W5':7ጏJH-6 WhS^yr_iUyg񎎁>eHҀ [h3rAϊHԬ{)tm9G endstream endobj 157 0 obj <>stream hެ; K\9 6RnlXκ;$H$X=\JTjQ"q-VW/jymk^GQ%(L^P25ɬ`E+4 ` `!PWUQ.@5 Z#VZ.0;̓VX,QXa >VQ%<* PX=W{O C\xjhEaF\"UZaAsESDZJ\墥̸|uJh.8-ҔV['X ѓؼɉbT` {b%fb8R)Zlܢi|b q q֋S@p K'4 )n6=],xc#rro^-Cs :=BJK/PG3B顰5ʯҢ |UqaaS⟃U.EAHoj% ~ iK- ";!;qt???SE՟??_1TQ~Ǘovܤo?߿O_>?wd=asjj}C` pyM&-wcg7~Hk!7Mu#+ȔɎj5΅Af=E,?FѼylmD|}!f5M=o2ciAi+YC-eZzNrZ:]"F+=VB#`ψy]6O䩇_Oimï'vb7=lxu2c:hCCH9]BF.VFN4&GҺRd͹s6ݭ3q>?] ϋ`&wpSpfpzGh6\%_m=fuzTTp11sAl6E}y$lXϯVWAӱ/WUhXQ+#>ٻ"h,3=NaJ,U:moP̀>gN=Ai<0r{{lct]$Ag,i- {6Gݤޣ|39XK<v{(F\"% 0sixN endstream endobj 158 0 obj <>stream hެ1k0ʍN֝A:K{3TC)ŽB+Z:tz{s`!8'j6SY[Kv}yӛ@&⩜ulM!F"xFR4F4kο%+ى1 A5LW-:H)glIk5ľ'`x|xܷؗ9 0h endstream endobj 159 0 obj <> endobj 160 0 obj <>stream hX]o6}#9@%) nh`@ŖSdKc٩-0ATď{/9.Scǩ-/]3Λp#0:iaEQ_]ĥ\D,5ljl- 7xN3'*ՅavQߵ˺{2IsQojFӫ<k%ԉ)S0>-E3oՋfQ$`EJ|lQ`ln%ZII=qZQKEut3,hedjΛ5*dF9/Is" aB@2)h/%21 'Ač$OdQL]m[Yh L vj7CaC_h&|KK3r'3By|(O!xx6*C P{jؗVsSOny/&n$Ij*4#3[1ńthE=;L. v`u#^tde?,Igbr,%Ve{sHU4y6"b1Q"cu_Btv paBB uOÄ=y v=aBTo.ľB%5SVc!>2<[jQ*X էTQ`ic JؠBG)q (7LhLvwZ,h4&h^SUabH\~4U FcʟMhc)avPF:n[Bس%k@AhAuU&3J(+߉GsbêhiUko;$XɧpvZ<3@h((}Ol]WD3wP#%C({ҭ(ZF. xT$0iMhs7G:4}H!x|VYUaS3ߣP?4byc[ݲp|'!8@Slgf]$fC׹␬g )tGpapv-EÌ<}6,˜(o' ׻ q kOGP.qZ'ZwEv|QPտ6ϏEQܷh;TB%;;uYtXmni{7k$i솁BLپ?~8=st}_wkdR]©w`V^ {G,`oy:-wmݖ.hho;ggf}@V<}dc[xuOXJgRtETf&ql4;h].(=b95FP;p\riZnZ<7 ?nE!W׳URl!2=`ƻ 9)B dRoU8wpsO5JAnS>z[7Yp~x";vX@-.872.zUa$0 lH;ԅ ^Tm9m\U; endstream endobj 161 0 obj <>stream hެ7_:aI@8 l`X^ !޷߿iEF79}4?uYKGjg+EOEMbO..Q> |OjA+D01ZH,0B @ 9ns``x^sr _r S FXª9E:[, (k.sjrSTƤb5&v9"A9"b90H 䞂;SQJO9.EK1̧*'nEhEb]PVc]ދ1XWQȁAʗ R\8'7/(-i:`%^ F:c c /s VrZ/F[-P[:R#ai>(|_-QB5ߴc/z/pV*j`7on}/*Dx?cm_/N.2o1x{_~>G~2n_fU̱~~j@o 29;h}V g=$'+ lEbkxoOY!UVgMIf)Ldt4̰qcgK]γHVzk,m# dTvj*q^If3L`?vYl8dt mM/™ƹ 2-w6\/Zy^[$;N/, I.P~%F@e3Y" %6cT ed"B)#ymk t9X-6VfFMv:OqfIUY0 '.厥}k) *隴ڂޖ\g aBFwG`Cf*g`*a }m:UZN@m;#6鎑 jfWev%NwDOhCm';IFƶ%&Ы"bUf=Qll@DEfuylZiM5t֏ۈV 8 Ӈ_c‰G$q+h+͆N@f=}MG>v|zu?[Z'qYe6!"kAEy MYÈ+z:>Ύv} =a[kMAA;;ltnw6v3;;fv{l@+7v~ =z$)gk&UFQ[%JWA^7Z'tNf;y+?#⧗ϟxVCЊSGrƎ!~w{{]: endstream endobj 162 0 obj <>stream hޜz |UwNUu^[,,I! a3 G80(.4\FqiGΝ!; "slu9 @@>a|wNwpM,@\-6-[U< s9lCDS/Bʮk|]T,ruVu<,wh_~&.| ;UgԿzRǚo.WxuuGoكsi% ;/]߾fZN9E:u#xmX +:f`1(?Yx V ܣ:?`O[s"ۆ_B`_^ZuٸA߮zC,?d  S;Qh@!&!jqW G) `VC {yxׂ a.-'۹P8&xD@qT%\Ka+pka5#B=;C>k`6_o ޿H&'qBݡsȱP&u(EG$Cit#,5Z pl_/WCLdI#9$t.NS.Ⲹܳ{|?4Q r`:sQqmC(9$r yt~r[;':}^BgB8fzIJۆ_Zڹ6۠Џ9 GJ*^OkԇXH'4mGN^B}AS+M; %si'M勵p ICyBaKExݿ~?W ~RćJCM͡]Q[Ło%J Y *k`2-ld nE)w^p'x%}}< '/ o{<| _ PFDIE]L#d6i$rN'xN%~~Mka(Oi- ZILvz=@W>d.[%n^[>(ʅ:Kk[v,G~\":I&~"Ӊ`7?y w Gc}i qcV T$Bx0vi'Ē7x<7Ѕtέi\}>Rdwbr0'vZ¥(d{YS&$'#aR|\lfMF>JըUJQ!%QJoOqf/k$l ~>RƑ+)GFʗFT%RK Q¹XUj#U2tRR TWi 8`Q@.%zR\f*uJBKj_h\UtdfH2f!PL@QßV1q`t,LXM.w-o_[7Wefy{f 9|us@U1H03;V竬la_3U4o|xWe_%j_v)00^'{ङȵv19,NJnd11#pUR@֋Ɗ M3員afwu(sW3C߼MOR{23Mҏ +.Kᬄ\O0\u"i44=VA߲"W ABy S!dK\#_}ElX%r ==0e M.GAC32Ս*w:wʰ+H]qAv4Dϥ׽.tl2ҟ` CH?OtSvƥxnoATc(U>o_`ȷ%\}" ȷtTj 7@tE3G["%a~~f;np%FT8X{ٸST7q,gIɯ ϯ;*E/`1؊PKw b6ػ8~#чX؃X8b=؋sTyv\ vṇH Mp-;/7fvYXzn|'OPC/֧b_.!Yx04 3oHmH!4-2=?lw`N{!. _\,爓pPpt|w5ǝ\+wc|D:.,91uòf2Oa"DX.v%_EC }^]y[rm\ JuDb|N|A3-}{Ki6+Aݬb t1~PV?,\ 'uB ,sk a|~>$Sy']h^1& сhE܁(A_ o0e~|畐Ұ29` 6;77# D0eN|9JX<0yMp *xY,x`D(r3OP//YXD'øe3A1>:A/f S(C#h oA2e>&|3\&8xjP9+= ZE8p'}3`8٨~u{&]bcyf2Љq8&B!BX>d9'[\Bqz7_+}%e {V4 Ч}l\pq qs·&r?u$昍.6Űv1,Lƛ 7|4bZ` &To1'?>m<GbA1.|=ӹ-\*(0໧؜~(kH0.&CpLf b<0*_$q-1E|#K"lScC 1;8+᷸0]9/B3ӕ0IAs+_a"N`鷐^Tkuh~݉yq?kI#XfJ'^) vO€s9zC{p<<ᅥpLx<˛ ^x&|J:ӊHue/KoB$Osװm$/D B#/#&ʗ+ADetXX~KAH:1E V QD )D!6'1! 2r5hӈsOvu 0=ߐ[pƞAb~qC*5A~7<M]xE4~Cz6$ƱmYNjm%vxɋ6~كg]f!~7  d@Z-{gTJp#^qqq^"z8Ѐ8B|P\j">!!gppH:9$j8FCipp@:9 h8Նjjyuj,0,x 4t6|>|&y&g6 msP>H}mmyܼ[Q8ugPn$/#eG!s8Y%Hנjwr=I*t{Oʯ%iPdH5:D-J2ѣ#ʚ6A)z5=bf~Qq@sZ hΉg4CXB/n()6EzA%/:N~A : n ڄ]]=O/uGi!;'} b,eCu5FɨkA$oG[y#B!/GY! B#dn̉ː"C5K7/"N#^@CD ы q-b9 ъXh|sGyU!x q6Ǩ2d,GD?jQ v$&)2AUڕVYiRQJRT*J^Ic$3H}2_*~$ k @Qz=fyذ![tGAq엡 {w1JaIgDcmϚߋpowz'W/R |L 3Z*GSTFqΖVCWiiN-qx &%u+{uaqaV^>}hUG@B;UPTu ]g; 2#a%5 ^!wtq\5gA %fcrJḾOA\LiMpw&>28Nc2>ĝ( /Fg5hAYvȀ,9Zu8'a= b ?m 1lPR rs9/ЖQ[HjEbs1G6eO;IےU:$qy\mo#9ςQ$N$lA/=6}^ԟ$ `6:6Z8)[jSRSh~nݽfbo- _cv/,4i: ٭Tb #Nᦈ-k[7q7;~z; W"ߢGb{wͬݾKف/|u{n@9[Jan42%>?g:Ly*UKWzjf>l r&z_ y49 97V+Llt:9TX%5*u=yG<I<]]BpM42uoʹGm[mw8ۚ1--HZvHV p=~ZQƉ5M#Y)49^Lh"MD" M{fv7Ik&<9e5Lpg^SHm-dȐh90ev='SNp-:al{;(T>EmIM3%8BO,oԹ5ĝS6=&k5<ޱ%+&ZmGڧTD[lxxWC59 hVw},sX赀~'[S-:ku5@` 9f5lV8[#o6.JӨj AX6;= ڐǣ֭-AHV+lPX8 d3!6kxB6JB.2`,1̣/c%F0_ۊkHYI623R\} RZNJl{E)VFY0؊:v1D2 lCÞ13YMcG-  GKscIWxBd##b4 V9 VW832J6c[K6If{VE S'EuI[SRO;{ FtU /Ȩvd$IтYhɐȋ^տ1*_[fd/n])Ⱦ6#OPjiL gă͑4QpQ8hΰ z §Gf㼺.O ҉:a3sHDB0Md~2#f:e$)WgdF=ُ_sGΕ95vk\RY@'ɼ7{cG ~+R4نEgLHqMwNMy?#,  NB i6衼Vg*Ƨ+rbVyb؆Xo?v VN vv!£^Y1yӎmpShuZj"FшKʈaFNQּ5 }c+V+l{^YWKMvr`ctwZ"-Hlܔa\ҵb>arns_oSݦM3ܗt{P$RGR)ӢfF]CVҍMQ͇-Y4ҶlW $;no2QQ.&J1I;K-E==~L,eY5p^1jE]z*ӳ1 jI-9KSzH-/1FPuud_1DeGa lm+z]+au0)ʬIia%w㄁;k䙛O_]U{/왵So޷_k]s_V=+Wl5ܲ~#RZ) <\)N-L+ԥ֤-jJlImJ[%N]v[TTEutXAD',~TYl@=چ# *0tE@1I-޻?(a" 0Ñ8|rYtr˟sļ)ȮtDϨi.{C?.^##Ol_R:kFsr)>mߤg{Gy豳,ӽodrvIDT*Rfc|`XqIba'{䤇[P0eǨˏTܚ<MrjƑV'uD#ka>i.N5)~:FNȱSe*EUy5g,J9*}FUnBd8/ړ[M1P멼f@C(| M S UaZap:F0DJ;zMH0) Fc,NPĸX% NA$pMIq8b9b/}z( ;X7zHk)R'M/%ۉluLYvFҷ^yE,)a+9GsĦ'VpΰKp=}FK˲ƎĊ7 V-Z3y)T#|gכ&So/>of=fvg&$v UM̡(%! hB/Q-UD݀ZQނ𾍭Fjݼlؾ?峙>mm3l3n7ؠ\b˝*v>unDG!C@sWu/|7?2> "5) Rp"Wω^wI}^/ZTg9`;c;oF6€B5eXQKj<03 1bo!)q{JR{^ҥ%!e}(t PHYF}xlL1rlJ Gq3Y%tQ% @ȯlT@WuI ^TBT$2((&W䂟>KO?pdT_0yzño۞g=98eˎf?trf>ϼyךo?Z?.A亪kP WS "rVA `aHE ev)]J߮|̂9n&i eK&va2/Me GD\_PWsØHD?ٓ(P "S H&D!|B^ j$?|;e \"߫ilu 2/͚)GT4*Ҽ[brm…%w?nmF$6d׆xGr%{jpW+TCunnp fd} %:R)P<iI.?! bony! Պm_;=ZE9Fj*ӊBTx>e@)|8Dl'"X&1FXq3/)&cQ}E2{$C>d*%Z| r#`l>%Z>'sYsmdtsaNnj ]\ $a쇻ދ^"K&^!+mŶ]ݫ_iLoVߣw6D +Oe@  yFK3+L^J#!r:H{^$L$/ 2(@^96 C.&{}~]II9t!W;GP?a;KR7^O#[kOR'O[` "T0A70&r]UY'gT]umEtFga m/9oLI ]k*N/gxS)7?` 'Q\2K6mGdi)2جm6q&WxDѾI˟g715u1q{ ҴWQ"u"TsZPjI=AɀkH *5^XR; {`^_|_%z%㏳qe?Se_>]=s(?@M|f{DOHH)v-_ʎ!"dvy )]נ p& )Kz`O#αpB,pɅfঝ̈́M 0qAډk|Տ= \ڰ}eSiߐ-޺Pf7M$2C]^ڝ^Y6^N޶LQC\ #:|xvodO|yBǺ=-Spu{l {(ދ" ,Tww8ɨB`Ol9Tʤ(I B? )&qαҀsˉ-̤TT6(3ýgt DK]DVC]bt0z"JQ.*D;) 8Ss6;9}aT/S>^Υ*Z2yE3Y+A9]Lȉȡ\x~a\u@ s{S0^7pr˒)W.?nSX<`Gvi^}PT{iy ζrXø1El 7#%ReMtW.+$hUE݂ޠP*ƴ"~ʈ\z!FD6X朊) Jsàܫ+1c5GCs˦Ncw=) ~wӧz"ccmţ?|@y׾ײz4O/jXpNEB'I<+ֶRR:;h͵͵ۿ Vmom4m!Θ3lt;8w;Gfti8[NZb @ G2B e v'pS,搄aa@65]c;EѢ HTY΅__n_CK :j#efĨ3ݬPQX MiK8r L+*\nҚr +'!혌5Nah Ȝ nxXpn)%5q^s)¼l̷iȄ2^ ɶ%Uяrq!XA2Ӷ0^Xʲι1@VOT_nlёHJbCpHH( hA"FlDEVjCVzfC?7g{%XmHTIx8+,#ۇexʲ #L浄CUDk)&!#0V AkuuB9, `Մ|cq\)"lx<Y36 '=HÊR%.JD^;E+U:0_iʏoc a0ej!Rr ge ENqv \b'M*g&5ٳ[/&DrRɤn/Ӌ5dRzq 5˴"y?BmX1 wbBW~,U()4+~Gc(/-((Xшt~`?<KpH\oئq2=DpRdQpYv‰p{xK +/k>_~Dn6[q; 9m+{drULET ȝăAke05_Jhpcr-X |m]}̹<-s5rtXm'X-%[d N7 7>0Hd`Rj|m\#jhȸܯ99 H+]Z*R6Iu?.*>#֊u-psLNEmHDagUeP7Q{ JTT>#832.W 9>p#8׶$gUܑ}7`2y?f5^?ٟLH^zKͺK|v+ڲl0K 𴷱뺖CbsPZ}‚E.RVhjn'k7%w/f9F1^;EϲFDB: E4Y:,% b)"$i~~?ͫ8tj!6bImHm+G0n6O+=~?%:d O?"A2j5H!iմtF ,uxGCdx/xI+։LJqk*BDygl4̺>?ΜW]q-<?z=sc0لCȦ`] ݤ0>i ?Yp(M4 p2 n>goؖ $rB&j7-kEfsS M96:ha>#S[R܏UiHvʌ/}k 5ks{@u!Y1g_?Q̭B1g'BğńK;bگ0)yb= zy^Z%k3 "F~gbߍHI;$&~Yl bձ + q3ӣu'ȣA@װ[MyUՀQ.@XM })>H n0KG^- `3説=aѾzlJ]MՒ.XsV}JC6)&/ P΃HQۃۯzi}GQWPМȿcLF¸ڱ݌J{p e5F7*ؒxAC"npbT.gKe uU H38Vil\,Gj{U#Jyl:'fnw\5/fG3C_-fG|M ;{s07XW4ѣ8cA_ %X/p:7 ʤƣzsAWEtZ,@nQ1ye>nWQE! ^ qT:H{E!v)gߠow J6>ù18z:242Қ- GL0ՏBH%F钷$gLls?Ʋ/~=}b 3MF>Ւ#E ZtלpeQ~Fl5HL#Rb՜ů_xelwo¤ b4qN~~z@łИ_%*_;`_Jy{Ҽo&TյL3yWfkd8 ^m5fg+$V=i9Ⱦx'U |WnQ_ŰFƛZ-[]$k!ll6`6l2al3Fs?]@_VG4Z;=3{e_FDU01'=`gD_;naCҔJE뉪zͱҵHW._vYzBoGILx!$9BC#xO%nk]ߎHkg($LA˺H܄&y/y2/eꬸTE/}솩 UFu$&kR"٦& E\6iP ʡmEnpqR,9]l9.m2@HqNRPZj%Ϥo1~d|,eɤ#*U[ytǙC3=Fs!qCBq 44;E1E6vM `l8 /Q<DZFUHq%g_tUSUw m+fYg0Ba̘/|SnʦgӜ>(<=@ȧ] z22"NwuʼnNb4:*m_I;X.OW K;[d_K!Qi]d Shv S!^%{DžyEITXP&29cIn~A,#V's LMN?B[G2,aQ0s̑ndssx{|i5T2B&-1"g୊{voEw?> ʺ lB6 qTge~m_Dq4,~V3:"qʼ<[(F"nm-tY-51}N|ZP@Ō+i. 6aŌ҇P,t(t$t*HzCT,T!r;CD`dLDP@_0PpJLW)W\W /ǿPC"%_8(:ȊDmZ1X{vC%:{bWT K!8I Sv_#H^sґ=&I |hOoֹe*f_rofՓ-kR4-ZX*#Y ;Z+orƒ`h.}ذyU6^D2#( ~sMWԦ 9|䡝3V=RějUa8 ƋA+N9Ef,BL~BҒ%sRPC){FQ &كPM&:%xRưM[Fޡ h^;og)ݛBIލ+C&ϐ9]rP2z»4o Lp“L\wΎLKӊ:EK*;baӒ-V|bErr!\+h)R xTG5ɜOFx[A,:SXz0W[D:AG賴\hj鷐dv,P`^73Vld@i@YdVdd4XҴJ~J Ddɦ9x;w0 ۟3ɺs[pwN}}}$xyܸM-` k>R%\AgiܹQF!_ \5"lV+SN@Rƙ'mֿ l-Y2 ܛ JS޶Df[e5.ܰ/O8c5IMM,6aߣJgO_۲-}߶)@{֔Uνgza`<(>zTG% g"{)NfI+?aUQ-$24CQrrZLH{swȉgmv*j7{WfH~dO7ZC_$ WbO(͗w}(]=:/F!g:ۂR&@eKul6MqM}Z[́ D<3 f,`2Q={VWmV\Tm'wrBlz?|ݗ{;KV-|BO nj.+NR٢LyT!IzTXEaX4 mv@{E;UmT;*'Gl=ɞae,Q-~F'E9wdcS5<<"m})Id.S#adyvj;m.'؜_nq%?-A'uؔؔ8[1ЛbU_zfv]A5TK(Nw'@lȚUzH˿_cUx5ފGg{TY7qe\53+8Y]99iT]MDDOEFF(TeT,q$(w)3chٚm[l نeju7Zsὼ2 Q4 m'mgaXDM"p*p6@{*p"- hM~vZzU iZA˵D.):S/4 BK@KT ɦAb{c}=EX)Ȣ-6fVUthǚi9 Y`{lYl-}yfn]z9ӓG|O,L{;ė" ;]T`ͲͨF4c.W!УɜV ~ Q-GbGh:d:e:kbL&Cp >,eYI&]k7I <5\Z7gV/g'7:,9܅>rYЃcʾ'ibh7V(EjPh4cl4)AI F4/V'IQXG/Otջκ.d宄uW]8 ^tZGc"l6v'Ev9Cv#AR|Va2Mq[-7l*lvr)<,uߴ,qfY^R|ռۍ=C8}|+];7NJOƊK[W6,z+q'#Ї~#gv)P,-.f-fAaXv 3*8ټ Ͳ`4t:E g 6Av?+bh.`;lS:Z7D%Du 'p?>Oa9:DBg%t#9++Ix:iEIH$P:"eN Y%B,N )ײ9%@

hsY6e`5T55N>թXǗrv)irZ';%Câؘ1vj5 ՜g 6VkwHiaVi+Bv ͆:.5 Ϥ2vPY6PyX!h1 hG^EjJ]BeCyȬHuY@B -84 \aY,FA 7e9 $#tnY,S@MMKW-/<ޅ3&J'hdh4?o|9Luj'd)Y*N=O) qK< nD?k`R)FOkFz+><{>~@(hNMA{RU#\^p >VyHL(ԚQѲJp5%JNȰw%H[>}xIAʄWٯTA) hJ ƮI-/%_Q9)TcV}E>guPe25sLgч?J>RCgZBYc h&vMY]fXl[h10~U>R qtjcQ^J51 qGܽպ |c!ՐFs8 FC3!js0p""FE3SPNTzx7) V;/ϕĪcىl:2Q(QEߍWq_*+3dpQs΂1!R4 hHM,UiMld0:C,EFRʉ NDYaAʖK)D Y8Xs cƓ浂4{tSԑ#Gp~<37|Wyw3g\3/mw;v3o]m9{9+?>izc[;Oc5z(7̖Yt?MO| c4Xjٞ?mܫiJ;dB}2RY:g,5#lTpO2˶ z%I@Q vy& R8b( |(WBv.֫ Iۅy%9j/] k'፻om!|fF.7- h2+A% XA!*G )GY ͐l)H-"ʧ_>[uבDS>~G{s ܸd?% endstream endobj 163 0 obj <>stream hޜy \Us{aw. 3  0 (xAQFS ("Jkx#55mul@,l׮[u.kj Y<>LX eW/Zo[d tKbϸ1Kqqb͢yIgR ?kޭKkp0oH]9'1@`?RrW7 X[xٽ:|~ b oՌM%Cd_۪fy79Whab"d/}" /Fx ,iHmnP?ݫԯ\'৿{{/~`Vwz~/U-< އ!(#``,Lbr Af8!n$'qUt*p#g4d`(UӰpR (,Kx:ꞇ(axFB*a79 RX m"|BD | ZwpӛI>e²6} < UaI|d9LJzW½3q0rL+a ۿN2-d+Ej~<Ò{HĮe[=!8Oo;H$IFбEn CL#c11 [ Dp jk5mVSp^?!bOK )RN%&'kHB㲹ܝn8'TP'w. x. b&K 53̂*H ܄[a{CcXX>+EĐdB[J vD&ODmK3Z@BM[J Who.|12tJ'Ă9bI $$EPKXHDRBݕ rZNɝ.l ZirF~:xp<9@$IJTG}dAtJ(:.@l}B_o7;[7pUhmsK9]+ԗ; okhN!G LNb8_|D|KJʥۤ{:Ϋ݄XQok# jȃp OsDa5a=l YM'zZCl\$ͧX8H@ w}i=SB>uI"LE <8Q9K/N.l `6u7NoF{vj0][I>,Ch64'{龴ԔI~ %>.rF;6E6N < ?>={q'$$ O$Uªܯ1;vnDF:Gk^pwQ;7h:px; y L TX='X:P$cowLX`86(igǁM!fW"xT(r_oAe93Cwʃ!ʏC>:|n9[[{{&_;ڊ 4#xJyJ-aǘR7%LcxT-1U LYS?Eiބ`[Q]n)KL{&x&#] n2v"v^z;}P&wHs%)i0 C6UDt>W*gd@Cv}1IXU~ 1KƢjQQ`w #dPZ*g" LC~="HLgLTʹ\]^Es> , ꒯3[a q=>v^Hj--OnNjT:ZZR[f{=uQaUߑBjFwп 4圛V&aw!nW? Mx]DMXC&soߊ , h.i¹%ڌ 8ւ?CX]X7b=7F2v#`vlFp6 wGs+Z]Ty21?—8)mƯ`BFzX( 1q- R-|{EXiOd"Cm9Ƀz".~ І܈)G:y|#BתY3 Hq#&L/5b͡*{P6=pG5[qIxCڹ v315~2|VMkUٮLk+@' *>ߨ~ϹKiTElaU %~K(CQXZm8kEOx:A"Fz)& xX|`ӥG#? UX1|si ӟ+_`=G"y>g2 w{R?5aڸ<ũ;]kz|bewmt^}^܇'Xce6 lF&avl(f#Θ9Mϱnz}zo2Y6l2;|ɼWp$#>K}36O/gfp NyO\}ߢ4@}\%8Fiu0ڸpϏbN93c\|Va7ZOlg`/;د@؟Ű`2k6>}9H[?;MW/$ cM[df0(A-l&{({bB~&b)b׫`x +cqqt/#=hG^^ P2 jEϻp6cZ.zc ӭ~>28,F"' O~ڃ8N.tPa*Ϩhxx+v0؞ѯ+㧾2X?t2n8QQ5ǯFGCk%΁0 c,{gw%D{ǰSv2밀{FWN.4Vo=qzJLEݡi2;>0p}6|=i!rO~+B_z.bl}pV|Z\x_!QK9%YJ^ckJN 1m>>'YX=}y :١#OJe uP6[@PySXM' F$!YH V+ S?өyNeNϬ˟_wa݁^e^IX'J\Ϫח ҳP*Qּ9|Yh+S,,;[&͞f3/yʲe)NCY,k-\NE8T__oѷE~=/<, -6C )R/H*i[z\:)2Li8KZ$.bPM~3-ܶjmm$% +H$:ӏhcI% Q_9Ҡ )u\Pvt8Nw@9q_G˔C*߱qfiBdzIy8N0zk?;N>qh}`$G5vqt6`ZVk6Jk Ư6`|eo6o`yqB[ .zڀNd-9v֖hdE&M盌O66g5GG<\kyO3g{yƆyO29h<ԑIPpDV"rpgLD$==;Bǩ=ءYv'3'B=1~/! o;oPF~(ƷCEK؈.$9]tn ;3i8R@hU!yP:@ - TG!ќ$CG2ez<zS8PA.4 ![:N: .CCvD_jR^|HaxщGqgfA1dWvIぺyʯB|~\7*esqR;Zm{J'p=U Apf2Q&8BtXy9=dPI8o@8$DuBb8A"v1~^၎b[ye$:;8D|2By&&Y'qq#'=t<@>8ާF^8(ԇqׇAy^9C#{zpdꙢ95Ǚp AiOJm#RRmԶPj/UKmR BJytX]Ωs:N֙tN'xՁRd;XeFD֗)kaDGHcHq( ^ 7C10_1SC}A}l ڟBŞ׺_cvQu p4;, ~GR\trDQZE!_kf4⩌Mk46*3.xࡸ Q*1S=3ʏNlaqz <]p  *mq81l36N4i=le$ckfh2ile4$H}tKJ$E$q%pr*q `jA5}v rD0]3gzM('~шF{G6/ckH|f̥:S1vF=B hU1y(N#q?E$]0*1Aw ;}r#"IXJSIPacTl }M_{+G$;N8lA"$~ؤ76|\kjbsM8AVƪ[ kCw 8;w_;lm֐:!B+O)/ 9oJn,hBϻ9}͞?ps lc]jJm JO0r~DBwp4bϞJdᏤ Kyr8<<ȿ`I$aþpŰ3x|wB;G)/}„r \ F)rG7Z<$mrbxŪ3xw Fb@rYPZfVfbZx<l+$r^9lxxŜi{lRhz2Iq~WiͬlDZrsѹb̋ Yr-84')B:>']Di+yyRd"% 4dpN.Amd' sJsV{GOtqmヒ&d4th:>7v~>!~iTljZZldr@78%-eۣt؁rR-KM:{nJ]l0$4 h{nD/\o\be'wfviN[T8O\ 5 #bD,둁L #.JP%{b`%{!`юlfI1o~oOi ul$WJ@t/xtܽ̓vF oޱF8]vG(!O,Z|t¿ȭ#τ7c֖y5l@NF<_8fR.n FWLLd_J? @dLL/gYRK[B䷙k5Zbe]ejmY%$ ҷHTrH"X,=6rIXė3G $G}LIi EEvJH/;%]E"|۲|>)bάXtK*ӣ.|T3TzR|)*{-Gi#ȠġazˆVv5ٙ$r]W&og'CLrt*oh Ϟ᫞~"mgwmXOov%PkYS*yQӌ1nwdbjR Ҳu x#4{jjYV^2m,*Vn%~)ED4~XTfmRkZlf#SԁLSǘ( ~OZPEoP궁Q' L)̙zjBQӌgUӮ>\!CtU+Esq=߰y꽙EGG͞w3S3r0HIyQ%IɿI |{a5t1Fkqq$v>T?.ȄGd)P4.a tKhyi^͓Pfsm67 ĚN)^wNB .AbO;<O#%~'leEdj =iP:"SM%_B7AwXsZ._>6+r3]r^ǝĉ ?pPYIAH> yI%GA!4L/^?O=/ ^{L4/|2n~5xsLZPI 5yP:LC@4@69`{ 0Tf#v&Igsll`Sllm[{Ce_<Ѯb%p3eb~.U5El>-{pؗ}K'Fc;ϒ:G!~O-5W7sfel;R XBٯٌ6-aП, [,,,ﱈ'ZIqhM(6|g ]1W2FƩӲ|PskbʀKh+ $dk+[ͱ _t6kl|xnb/YG[ݴcsfȄ؍n4O]㹏>nHi$B9@%51H ;Cb1hRb#"ʜ.6rqqU15%GD;&f8W7KMuLq9Regtjä:iF1RPf\|yҩ:%ř}/US T‚ņʏ*]Ĩ$PQ^'R:Vzz2:w rAʆ`FׄZ=rl(d$}z%^HO,#"_#&\#)~Mݟ;ڪ&N: A8}^89\eț:)Icsd_(w]OzzK -y\鑑z5< ZcK n93R\.gFDr3;2KR>w>IO_/cpNp'Kvg䬰ND!_Hu?Yb#eolbLMJxWܑ0_#&Ip_Ԓ@b.C€@Ct9$iV$>)ɦAJN]ѮAOegXzǝ:%]+ߵŻӏ!YPۓA]?!Gþ{aQw5-c#7`ȯy# d5t[ ﷖Y4JS!LMWEUJ~ȯ^D NIDL&ɾ\_qZ_E\\2]|_~mrKH=& i`T9|Fޤftb70ĸBtJdGHf1=ULfTdPJRQ6(b_9R^S>RDEJG *)*mYW;KQXU$D"%Z}\˷+̼749ya2 .|TOܐ9!xGt`萡єMpD 虼'Quo]ow~׼=;%4`)=uh85koᱥeM| TRSA0]t<)D !<5U<t瘚Z-INtR*&P4v8+#3#3f]dX]1$ Y$?=NaSO\ ⩘5v%ӻ[kyEbڍAnA1Z3>IjJv\+︂$LF\H@d(2#qD34 P"x[##-G a!OoЋFߟ}+;0 yA{25"}6VWW3[|--*=RpXg}EvIPREo>ᮭfZ KgVl;iSFEggb_$LjLiiI"S{R>wA 3a.wRdSػ^n2adžk² HP}fgR99`F3Y,MdDh$/X D`\zCWD7,d'6jmcKwj*57>r,,?8kQqE9kϾԶΞ՝udU .<,r}%vnIM`#ˊβܝצ7Տ ,8(|D)]Z_*q{" a#)˿{L:8{J{ZB -#\nv{<;$1 b7@Lq L$pN_ӿ?NӯЯђ)'݌; w{}-+B nzݸۍ: nqiwo f%Zj3k2&Yt"1|_'(t$1xYWaE_^xUY~ۿhZLYwmSoJVoٳWԚ:EpBg!vFs("PnqxiIvrQW_y/W|D),PR}J(HrA|Għ{9B'&N9 )0ZAAE;/ynk:-v%f_:}7];±{n n lntȟr;?Vxʋ %-_n ^ J{ezR ԔJF#EK^}ARv\jV^ jY$-~KY&-[$~Th,{ 5J:UCq դ%ՏU*fԭN=*RP%cq4WVEP2 ٫l(Ƒ=5Q62ʐ],>[DuigVQIyz`-iطjjm=&{ccJžDO;:^:6#&`HBh\9."ܮJfbCܡ<),,͉?i giKi^y7!abufqHBqZ+"y3I\ 8'LM"wˡ^"e:fRGV7e ]H>5AI3uzrúΡʚx5&G-7Pa_uu+wնUW--wihP-G!y# mBs| DaCEI0 O1f9ĜQmeGO:C! YX-< PWuK7465КXb%X}  -S\dԂ, v94Ԁ:4,t0̽Y%+̽I ??lWmfT.[+"9j7[dPc=:e"T"[l] %m;ztmaN2m}=̲Y482485?T,+?Y984lE{@I4 0+{F1+zԳhQ#;VnL7v o|~ӿbFzzlfFG6F,;-HI6_D6'ԗA}GFPv~azXGb_;7{%@ꝛ 59 J}0`݋`Tiv3ڳI3ڶPqew%:v:n7`AtMz39g uo eɠ:Q+%ȃgѦ& bh8! e9x$*^og&0hv>stream hބXTٶ*Dm*cBI f%JPP2QhOGgŀLCI$QߨӮo_ﯿX[us[*ՑHҁn3fy6zyP±"GjRqh7wL% }!?9+6Ȥ Qׄ 50b,`|H" [l.jjfNakcׄ,0s 273s 7^k&dmȚ`9*rEXpHdlpQk"H%RT&a$^ƒAk]AWO$@" H6H$^$mD&/\ΐnK:u٬S&,;'5ݫO~>Jz"[7C/X^{/^^{Ho{_]ڻg^>:շEn'_+o's/_};?ӿpf<ÿY36`o4B. # UB!$PȀ } .Rl$.c8&-`J >5%2t)fjt ' C-5K-Fs51T)} b(0Y<'6t:Qoz J/"e>Y+$:9 [T"^}L Z9^_e͊sJ9/*r~;idw8uhўb=+:9(1lSR0̤Ţ2Ė,<ݬ|O-̝dz̶R du2ɳS(i9zߓdWvD}Ҷ``sXK FJaZe dxZnN#G2fΕѐ}|3F^'!mniB9XeI` l~h0u !C[`/߭#ˁ&[em=gy`\~.7}c g_wŘ皾œLw;``р< K%ljy{y"'UC)GMpqa F8\  Mm.l5fCL:kr:3Dz L۠'63^W:D޾ewrh%Bq^&G4-0[qw5v52SA <#_g҂v)+wl&Jm ~l H  >0B.UGq.-{sƌ5|OΓ͂|]-~"…N6hDo0/_7h 0wʪ4!9s/,jo}q=gD[:ֵbz h рA;t2VO[cQg$t`UFϵQkƑ-jjFVp*.{RtbigsG/'?%&X%%~2n+`t.^ҘI hFq#Q 7>nUG+Sܟ2rK@O wi_,-xG,rJ7^p4tVjNw^]9> R7A 9(Ǹw'xw  Cc-@#pnޠ i=_6 -kb Akq6NAFiH 4ؽ~ F6Y8ߒf}hoԸD=huk<5< N5:ËP/u7]4{VxT^3Eð6 *q"Jp ~ C lp*EMpT/MVF,m٘15c ~l6x H6v`DkA%2[ebCՋє)xK:y}rBKlK*`/Z0Z/TmF(~G<7jS n}?SiOO=PΠFD }Uh?e b1 5n;M1Gb Xv@U,p_7-p0!g0=Xs8zLj=p -mpCbWяo w/d{h ?KkiXmuDXnjx;dOI8g /ZK ?tܡwl]ĊMӻuZQŃ*/̴>V\oCȘAZ4r+a砸>/,S_P/&EܺƛVB z&Vv({ep+txubCS,1+@ďQsV~Rv[a!/:kf0hsp0gc9D%M/ĨnO4j!14~@S_IJ Y{p$-)u~AKw]2*v=f 5.S5lUcn{6{SLɉȝd ŀ 8z w2.ΎYocV%o?iV=;D,g㋋2ؼ-9zzYx|1XkDZ2lVÙ\8 7CK`5f8ɡ{DEOH7^Hyy|hW#in &NF#%4#soLkX~h-8+-L ^Y6e𿣻/)CgGҐEܔh`;5Rr|A9u2.r] Pܪ#}<+FZ?OS>|X.vQo =ԃ`PO KWSyC/R}굻ʺyCgP)4s9\8rzӱɻ~嫙WSl!bFAՠ[+<[!1Y3@_' >Y#`'ϰ(=TUR ;ԲjxHuhjHΉFqRx\-!kBJz#$y7 x nw%3M8d& ˫K990.f&R|0ĂϊƸCjwgeبԲ$yt[3XaE;Yb e4DJ9J)$N4%(zU[ 9j 1 oQ=TA=[_d\Hg^:҅drs.Y֋ D7]\*zq^;a?1XaO%anNk hTZZHy#pLΪaHןiaփѓoI֖g-,-+ Mz 3/ZZkڤhQ 9/DZyjjk~2`InhнQ.^7?i}S q]Ao ıvY>?G[sjaiNzN|U'^]ΫV/7O|n<m#c~4Y?!.!\A v|1^N꜐zZ̫j~i fJW\\pD'z~NRQp2QOȍ)HBשǁ?Ɛ橾e b endstream endobj 165 0 obj <>stream h|RP߽^Tq &A@@ rIPi¡8<IM`E&P,;` BƦJ\%L^1f:vyeeЬgf>|Ma1>mT=Z5"8 ?B}R麴].f4,ѽ^QsS.4?3=Ub[;,bk,g*ycqUKKd(YBbtX6LTWXKJr~I}ò"W))/a1È,2iX1L2<0hu cL!t3Dh19̌ ~$)7֧YҴhEqU\/6LmU|Gn ,\`qAa/VVQnwͭ0 L+ ^;|:E V r)$*YO~ё!_dȨI3!:p<{z! 5 @2/(Uط|9JXO^~|<^yAx V/B|#~N@2.iRHJ BNnC Ԁ?"t4fl/ ZjTFr@Qgvܫ.ra X0ᙔp? pZ' O<ށ#w$3ú{sF66%m5[TzajP ^A F]0FMyۻs^u4+ N4W_*^Vg i>TJw Ef:CAG?g--F_['| ya/7),SSTd+MnDԹᾛ}&<SKƸӣ &tݘnXLj$= a8M`\ԴC7Nt5Kl>EA#y"ppo]nu-KQe[ߓ/(o=+TUs=g|Qqg=P!ܚ p 2w?~(y/h'l:<"]8I$`%fi-@zB!C-SPݻ˺]NaWjY7-'wELBg)͎{ুg  Z̝tnOl^cnݳ7l7 8 O/rXR#'-پ'"ޖf-swtm&(LKA,,ptzTRWj-7GG3#RyBG!a=uW; }_U7WUtCMn8PSWX_&a4z72|{iMsgl|?m|zRт{z>yq `="Y'y)?˴=unX^.P.:H'`b.m96vu>KMeO$tGyzЈ99q+& yy,pVA%`&a$1DĆmTq8EkO 4+a[s.иV丠SCC&5ؐzSˤfC=e]riьFljof(̦fǛ.zçVu=e ,B~qhj]`o$ uv3Z#MW:}x7jدѦ Cm= axZ#[ endstream endobj 166 0 obj <>stream h{{|SE3sIܚ6mi i+BK(E)R@Ȳ؀ X.z`uQw5 jA.**+MgI+߾gf9s̤-A8)Xgi G]@,_vc̹ H@0V\yg}ߴ-wNmM_hLI+z}MO_7aNڗ5}o"\ـ=VR8hDҝXw:Upʰ b? F."#rۊ?CJ3/>S#|79{%SV=>QS 5x2L8zXJvdiGv\A‘\-OH$Z` 8/Jr#/C#1ROc ca'FNw 28 z~ #qiu[Z7E;tB>LC"KGI8(!b'c6r|F.Q=uc$ q{㠗%_Oo-{C +x pa9c$eD"sKruy9wcT.<(U}iltG!g -%rl VZD 5-Xg0 :Ny.+"9c)El2ԑd)YFV{s%1P#t ]Ko\*e/W&1%QX$>VM Gj#"Eތ\DthE'!=b 8C3|Q؈ecug݇2CAP ZMxEgGk"QX>-ёl,nK |H.FQ/fG~ q!ߐ:O/8kwX;4UU[U?\a#;,!igc+A m4pڨV+b[{{b-2W|胪Ř'3ܥzނv9\ϥC/B OC9-&kEI"VW!t#6#lDxa k|Mh) wV`}nU} .<0_|8>_< *.H[/"W4Ss«C_#K'7D|Ee 4|,yKL8g/6L5oZ03CK>g.XtrHsq%D~piG|-B[a&LOW@:?* y_W+ɸ :4Fc3PC xd_듌O>>jp ܪ Nj P0Z t }u1!SO!ii s#(q2܊y;Ý+!0"wf{Rރk[PMjK蓛i|.;Wyb# Jhj.0vx Xyd~0a)|i [ OZ.俞@>e a'}  OQ:7w帉|0RM\#k8TRa> k``|!9S+xDv[9v~E;u3[] Pϛ)⍈yl|h&(u˜VR3Cڻ}U)& S) 0A\34t{Fp.11Daf7u䒂Sx-˅,sm1:N~ޯ՘Rφ ;P7etUFN[#' #oN U$W0Pms?ژ[.}6xWrkXg1\ W}}r>B:w hT86t/s$A2Ǹ׊!`e;W l; :(HUE"|FoB̫O"܌p'#8v/?5?E3SDIxެpJ|50+iHE c8**vvB)B)Y=a*`#H6\[`]T` q+BpW.Ol[n}JoD07[[]`LҒXЎ1~G|zo8ijX"PlBn%aY/1wѱ~5HX[Vf:dٮ ]hh(hѓGV5|;{yUP# ]BWP@ A+#V*%%J\ zhw+^ֶm\z)Dksim/zvw`7ݻnvu`5\ݻWƯl_y TU }3 z_A(mVAo)7 z]A)%)hZBALAHA T S<QP4 R)SQH .#|pc/"!<aN6!FhCXЂ$+= ^QЀ^T*(IA UZA4X4MGb>G bR'6b:SmSgԩdu:AmRzVVUj^MՀiɤ:4 B_sV, $dɡj RwuHS{mBv yI8[-컑P%[wYl$$յar?-Zoz{ebLe^LBUu:;ʕL 0q"?MccP889(K:ޞ|d?ĺCZ&Mb$ugMEI7[QPI::::0Cnhek?*[CRIсLT 6f(xJy5!Gtە̮}-b6gS`la yxkBB "fSh'S`=Ċ.۸˒߂ m%h +=MƑ~8/'q pADž$wYE^_ gp7n[ڡݴ\v0~%&_g_(ZB(SC!z16f %U't`P}gOI}}-WkڠiZI[A{vp7ȔR9R)[ΰ[*%;O!#HVIae,Ar,VWhVm"k|)H4ʑʎ+2+ۑII%%6xrg/mqg]`kgv]O>cg=9`go[8"!m+hKBp!ּϥ.r"D܏kfd(`g /EaZ L7֜q@TIr']&zEI<#~! ʍƋ#.ƕŕyLe(9U |qeѩCv\7m">bG3rb4fiIqZWeNHJd(@g`G!IRe\ccgYl0vje{]߿p=ak _{GזUeI:Rٸ!M>XW5ۘ1nP)~r3@K 8tUuUOűHW" Is;22 ;;TUJY^iI$3OpI9'$}LNN&O\0n^@vh,}7G'?RZ 5hF¦`ٲQ5>Y>{ \Q{Zcm0xxΈ6`¨ch)fӉ:1{3EIi I' ?R XQ$i4#H:/ ?Xn,w_m ^؈!3aԉIL-y4o>^4}ҼYOu4[CjKXXXhΙ -ڭ/7w/ryۡziϵ+N7oȽgC*k'SuRgyM KV<~ǻopfHJD0HJLHJJL4MhR?/bj ~2K$&ALXWKƑ~g)׼|͵f9`ـh3{̂eה)7CÙА砢|Qʶ廷m<>K Hj)-@bb})(QK9m(Lix)yHuyGwn, 6c;`<)F B}a!axS4PZQUYKYzo/%EF f3\dSR Zbжk=/Bv)myr\I 0#d]<>؃e',NbwX*oIbx-Ɉ|YT'sʘ|JH\`XEbܬ-C6!߽x\ԗ+QħddTJvm^šdδ>kS\WoDN cTb8g]IП $ǜ_8#N;r;4qFד7!^*J8>Ouަ$]7ꆛ~]@ԩ@I[0ƋY&&e5׎Ύu=G` ⱕ/a+ ܳį[lPqO 4Atjy y=e{)PSN4;g^a 줝=lоw?0y5Iʛ5e1}rO0BV}uj)ΟȽO5Ogv"3 z ilߎI&={JٞŃ*% K?)iK.#ckF94D7YdԦoVLۗ6v6M@Z(MH;L ]9 axhB9z x;:Q%4t۲cviLm\VA尹$k-><&׋=mz\{';7oAy%IAĤ/$呮yqy;Э \.k+p]x@~M@ji41l>a/Qen5}2$On=&KBrg,'eddge8m}͎Cwtm^| YwpY8~}}g _s:bx`ZoMcD<:3w)Gc|1Vw YR!z*?x. ׀"Iq1&N֨KW6kܼskuvw=kR Ԝ7:TwuS Ww$O撹EDخ' ͙vjtI«xRLt!x.R*!x$x:ؒ-//y/Xn s"n#Wġ<߿/Tӯo1[ 0Y>&ϻExv[N\ϗ,4> ?H-)-C͚,KOҺLbV6V HTMlI.G%IO~[[X 6d5dTn. ϚQţ췃r`gR%;tq8[#8tXYiĮjM%rtfcu͹h,><8jt|¨HN0$yg\B)4 ."@H+ǛɼʹOJ)JkY5[NJ(uy&L+0};vF"h\N59e/-  ߼ȏ>Ȁc~r4Ey< HĦ]'bcŽ6Πk.uz)1ƊC3j>UD:RLzI_'Y݅q/5x8G|NMS3 wZL)$hnNK!5!dT7^qDLK%IL +1S j93gs$dCkIYnvܦ7<9o&$O3 ' =ecGEk.T $1>㠁8vC lqwJ Jҧ4BUZAk %b n1wĭ+p5q떔 xbHbh[Jm?%қ’݅ Hѡ`24)nT>9s>vd. vb]SZ.+AYo>WGe W|)e97!n?KNq׺iTnPD[DV$z5)..iSSbY8jԆ؄X15u$Ib LKrFv&ƎIm1 x *jx1xRa:f5&b5R5O/Ɠg^SVZc~b8!vb<u1cyrsq^prbIv Q` -r2[ɩZ?H7ed)bF?,Y[=Yz!W=L`|kM~͚s(ep oQ l`89(?xorRnn VR*oevIč.0Er۰UO\5tts2RI]N :2 w63Y5z˹ LFf%E`]an)~qGbJ4PJ\.Jr~ķU-bP;E~Y%????]C%c"1'SR-iWrcӦ挌] |x`ARA hpMy*X#|W^ۏ<ץհ\:Htx Vap-lxY`/L6qmSkmWF<ma-}\R@sKӲfcf8z %B飉)@l&wIlaoȿR-,ւ5QQ0|ܛᚡ6#mMF]Q՘u)Շ,y֦WR$ݞM)Lpߨ|5ڱ֪u*Ǚ>Ք$$#FF@>GM1#$EGH%q= P$ x%C4 p5 z"QtstJ?p)tu5C:s WUe>È o>stream H\T{TWϐdҒ6QD"UTRy2 (܅-ZSueVjE,(բ(T@Şa&| ͽs%$27 A.M_|b'Z !* vk 5$]FLD^;@^MhN*z%;̆S.,vg` ?B<Ҍ(,WnVAdv9*xu }~=01Xz"A:-/n廚NNZ7 :` =a2g[q XRPA8NCCy!mGOjzj#fU a9A !o'-=nmIA9[eC:;~w*C àfo ~শw1i7x0eY*pGK GVeyrx_5_D".ˆh6 #  q|Hl s9䀭f|t% L|JG.<1{l =S7]G 2$"Nug~;7QϵE ӷ :?޹vf;zk:g\6,!e&߸ A-2<|۝7>vʂ8CJ?X으vtdH3qE&Vb٬/ܣU)6?#q3G$Dn`]ȭq8}x^P] ۡj9fVgl!['Ʃb|Ҳg8ˆukmwbi@{`zU=7 HZNC#l-!6֘J N:9@-0L^E2rzD'kBK1.xE*9 }`E'rTttR1RJcbuy!YÒ%ldz%AU9UƑ5OZvn+8z/Oֱp՟d{62UF;L>,}n{kiOETOHk8Y޳;,A Q"?ZK&']6ArKzٙ[ :P^.<} ίO_I5=|x׽,]j}LYqi5TRNTqI(w]:zi֠&(J8u:"RGtX+`/fś0Qfܲ4 jט7Ps)S5k8c~y_</V.5;:- 񙮑ԅ[_>xnNc /\U;`l#uKNĢ`MT mvOQUQqsQ:^T0btb^Q~B,zDJEsPQe=3X=!O%hNjڵ|% 9x<䏎@ x8cZHv!$ vCb#?w'ʆXdWZxEC|PDaW>0!31|!\h 5_2Swe}}~V~50$m?vӓ?9EMh_Qd endstream endobj 168 0 obj <>stream HlTkPWfn`N( 8 >PP,#ZY^,M#5.`0d7-DYm0& jTʬZnʥvJxfjs;;9T`Eo,. 6{ai:TSXmjd:'LPEbzf=jo4ѳV[Zm~'kVԚRRҤjkA*i; v-K`U8 R,v`7ؚyI&T!9lՆ [d5JS\il[cU]}d1XuzRenU2 Zrڬ5Rbu6QiJ+RZhGDXd 6Gh3٫MUbO^WRw.UWA" MQ45fST"M%RPYrTI ),oSE^25BϥsĀ^kxG\`A`?0L |\c)6mgqG>iܠ`:$rHPHN ],3nܰlxvxKZVX&츢N\ɺ#PmyY87̆ ̢8/mʆl$gV*-Vٞ}= 019cEV Ѱ.@nq8\ ;0EC,,HqqӌEaed-$4 z]sڶ-$UׁI%b yIDt&fjܚjp=KL[내:!u:Y~vWï!4ҥ(+9c0] GxE>#)P+$'>߂a9;\8kbf'uw=HXpLw{?yطe-H\YMrӽ2ltkơE j&n$YwIsݐ;.gM{-&9RFjPjm3VNǼ ` hg^+dDY>R1x'G`}Ntß/Bpv'8 W~?)hg0R1\+DlP슇l&uA0ಷ76Ŵ0ݞwد'JsO,:|Q( upF_ICBFkϟlZP!/6 ӏFF+ }PkO:'Mmk)ҐiBǿmT߭'Wc!zO gZj-LҴ1(&a\HGQA2.e#OZnr@1,P]ZX3E-4(UhGsğs1 32 ; \`o`1#^ ZUϸX3Z2Id$i9{ڕ l5Ns_}İ,K7N ߼/l=8~ VU?Dj'6Xe쉔#V _AN?'aUq|z'P .E?{V-VىX.dO^'ExB^;XC-X&` b8`&b K pƏ#T30e< gKi;c3Pդឮ$-`;] t( W2|rn i ~9x0t^& t8MmO+͇GҢ$ʙD)45{nD"ȯ!G 2䇙DX.HT{'@#F`?xGH{\|=5CR 5(l!hgڴ \ǖJEP)@8Vma7ߜ4'i]W0K lQVrSg.3s I9xa96sɮ{\GSDD9 j ņ ( `?׻B@[`m"q[`K츟c]syCШfbLjveh(8nbؒhfmm#ULh@G*gdQ@;l+͘}ߵ~zfiM5H] {-Ȫp<_е Nw :&;:^d])øZ 9)d+kd= 8=y8N_18ۼotDz32{u,#_U׃UOХWV,6j*U2QZ̧n8jɴ6SL}شY4Q:ΝX!kfw"e5OV(3SN*:Q֜:`1Y \Q^ooxrK^re%W0kȍ޺˼ԏD?n/tyHUzHh+PsঽVc W0WTLJ Qp|9p_P^w*Ajb+M endstream endobj 169 0 obj <>stream hYmo6^:|ll:b3neɕmCR%K.`DCrH= ^ >G)X=*#x4C(B2za<.}G(l"=@'B3!=ɕ 'U>#ϩPFTN兎G !ZF'cqYZ''8f# Fw@SX̟s3$pEsHat^L?1L`!*a!R W0KCQ'g03R(ZC?*i Qܨ OU?w'@ء7$%??V[y4K۾LV.W}V\cQ1iOW c =NPjqg?q:B͜>4M"<woOJrrᅪf|t.ˮЅu( |)dm sn"ʡ gx"4>:h!׏z0{_pyDJGZQ&>(EEڧ$;ft|&:np˶ ~Re$hykTzRFG;qer#=7<|+lM:Veʑ#c!qEɰTm0LD$1F*B` ø1)Cc4xd'ŝ6jF 5Ⱦ֣Ƭ uц:HlWEZymutrBgrM# O=u܏n?Fzy4;_={naW8u%ٹj݀#;FOI{#`ۯR v x Vt|ԶKJuDk&^ R?1l,U$1Cvۢ뺱y7O Qښ{MW;Vo76lN{Nexk9kDv}m@fΨ w *=]e7˞9̿`bâ1#vGA2eR+sq^] JLĔNl΋+t¶K9g=΍>xX|?6 {]va܃m쉰m&|GS]rps=%aث߷g-5|؝ž85=O-mw֮WL{vhGLzݰ'wCq8&ܟ-ɚߎyvVgY %?s endstream endobj 170 0 obj <>stream hޜYYo8+|lݴ&X}P%q#6_CqE}H$K||sp(k!XŴLbIh2 cFuY1ky*"ߑ Px&p 6i9<1fer1d. gBX yi%4 5D3a*Ä3HTY&+X1tO gRj|? #o5Z`( *OE<:8 uŔ)eB }Q^O[Wvr^Cm߲ yDm4h$dOJX`F1b`y'+9{'f"o -,XT1|(-0S)f?1oZfWbf@ qf˓v㕓ECUzWvρ=yt?\pz\ьT9><\rŢ_6& s?͏sloNP@?̥L-؅7 ŋ]<%\CG b66 WCݷlӮ>RL__Ts~oꫦP攺M ~) _>}\|Y6+r~.[vQ r$8*JHyʐ}ms*'X4Ogif^mpKD@2O@d#(hB/P 2dHa(8<{[2vմKVm֗=Ab~Cj\`ih;ֱFV$R>nvW}F- 6ȋaBa'p}B[l֥GV6`BSq&JQ BlLΫ:\1.&h?~6^mkzcn\ri~JB*<|Ɍ8VP1y* `ŔIwwZe96OtJbWM'MUFؗi [ջU}Xg{->qdD+U/M H\2tܮl؊M>n5Q/$$OMl~,A-6nUsd[e?v}\WF흳,%qzS$y$pG:AgJ<;8e"UFP  D:\UY(Y:1F#>>7&#in< 9YI!7&U0RnP$%XY^@d!E?t%Hb YH!KHّ];f20X{A(=:f髻xV"Tꊅ+:~(Fzb' auژg4\sE*ù@+NA_I3T 鋦 endstream endobj 171 0 obj <>stream hޤZMk +^,d].jd") m }fqa98Fuۭ7{Gcģ׭hmhMlif|Ro{6 fejDcU4-4I.7嶽a}¸bdwW+|U h`dnrѪxb5USZF9Mz}o>q<=c 1 =:} hc. {c-GDzNpaX)--yЇf}lz|`s&bh9Z+"f&Z 8bLxȨa1r+{GDmG7ۢc0>&tآic1>fm>Ǣ}0:faк}8gF(чs>64jF6H-hkU1laTÜ (ޠ؂wjC[XejѢ :9}t/G@.1nrs||ǧ=>~5F㧟>o09Mc~~!=rEE 4v#4 Z݄V)Ԃ'(:, 2BU9Φ'(:9!eI̕ ~ANe?* ǥggWK_~Z#A䵔=Oh%(<*{lB~'$6aT%q&쑙Z =6'( b$$recѼ%seyHy`+AaqR޹D$췰28n MB+:EGa-je b'[!o$ )>:AB>k:/.g#STgQZt |q,V-Aa% **@$qf)bx;!1' QQO@!r' uʇ h$3Aʨne=Xʾ3QwEُͥ%.~F*#AQٯ8-JPEGOPxT+_- bJ#Ve$qZԑ([  FzbP$VDMط$ZS(X ⢵ &QCZ ~U2B:{^ILD^*kRT>QcM=|ŴU>Z)*@X*1"|qB*a,W \o T(r٫| ^;APƼVFb4PFb4P߱c$T!_ "a =AAUƒ̒ V`-A8{H%7=JiOK5=AO* b꼬 !F-Z X ;A\SՈ {TQ8Ea#AQ_Hux~(Vz-@dEڪm \R8/[!lM[e2pY w {Зrv$*gU/q\vDCT,!f/KxBG8VA/6-!QVl^)kJeyaz?9sY_gfz bgϲg>@k*hBSh pfuzl)߉`^R׸ l)k\,&i3BȤJm3p=Q#R\Puե1= f2UGj.+AQ8'(WO%AQϧ-޻:g9mݟ% }%tW8d+U.Qʥm\`K}U.@h yxBh#{eZWDbA%mZmRV|U(6U&?F9c0yp;Ֆyq^u$󒪜ok%L& )ɉT@ 'kT[jdbFrJ(gvyΓ-7 aRi,STDRyx&Bt>RvоWݟIU ?jk \5WLU!@U! :e  1E&m{9⚇Vi x9V^LR)S Yxԓi+Uɴדi/LwדiCA `)@'ӾW4D)[D$3zn$֓%IWXɭ'FyK$5>stream hޤK!D L F Gf^@AP>2xie4VDiEd%k-Qf2*"ˆXL܋egZ[0^<,!q-)D&艖+-'NhRtgc&8=ILYZFG_He$ J &J̘8cH'jA ik¤#ubdʆu eLj4P'Q'WxDCpe–F:ʭ'(QX!(Ϣi&c:(XFͥiO wy'5YNn"<|#Gеãica\m7a|}tO|ox{ߞFWx#۫ч^Wn- endstream endobj 173 0 obj <>stream h̕9n1Ep)@P8@pClDc ?k -̰bwV"XzSQ7YDS*EDU X7V/#j+ڋwe:KuxRK#)] < 0PxhA!L'IO٫OFfE*_)Jm-u/>i@ PdB%P(R "Q(PA66!d'0 d r#0ȭAvmBvȝ5K! !2<CC'+ $#BpW+Rin<4Rz*CO334HԷqŪwf3e'"lS=[T=!,ܲb[YI{>,'3yd#G&8 Lp@ 晓 R>%֌%8j&Hfj&H˭fk 2:& e 2$ӗ_H/~x̠7Pڽab #3[C<{Cqdgb C=?QC=d!c>jhDqi桝a5zp:M4X~Z}p*zNi^ zaΆiŰ^ 'e^1^/{V_߅{܏]]:=>V7{Ho}\te>n߯{}yu?߫ޠ{^s`M, endstream endobj 174 0 obj <>stream hK1 DDR fdrAv@a$̦[cZ-JLLqr i BNSzTєjKoF~Z5jd,qgqOOKWqo2{hU ^$K6IcqHSfci,^21YbM,bRTܪr*j訸uy.iJOhQF45nT5] Fْp2N_CƠpAcGƠkMR]JWAkGFPqHz;25Ȥ#c|LdL@Ƣ@Li4x|:HiZW]͡F@k!|j-b"cźh>h>C|&Z4G5%iZ4_-||~lx{;ǂ:q94_|.~'nSuc߰8V噇9v{8yz9m?gcڑ׋_r7?%+vO7m_[s[Y3x>Ȼwz*>stream hܗMn@R7H_W7@?^đ:A@̔+i{<:ŭCf{ʞ[]d'6[WمՅh 6_lN e6bT6ofͪ2G7fuR)lR%kyr6oY8nj* l. -QQz(tz8r>JKx=]QQh.p4;]Nٖ:2͠##) i꾰H1(6'(N$# dg'YJ c=hyq,Ź\sIln%Slp.68,TK.1\ˇL9d˴^\tT NҜspe"99T-h>4^4/d$ͱmQH2& IBFѼQ4/d͡`//KX4Ǧm/dl)>h qP4_[\i*oE?/_$pqv͛_?r|p^3w83x!_y&z}?qqwNv~<-<_O>stream h޴10 ĢeL}AA~t+yht"Agd*LC ` S!6 =˔$`kam)b˖/vy0|;7_xUUW%X~o endstream endobj 177 0 obj <>stream h2420Q0P0420U02T+-(] 8 endstream endobj 178 0 obj <>stream Acrobat Distiller 9.0.0 (Windows) PScript5.dll Version 5.2.2 2012-02-06T04:40:34-05:00 2012-02-06T04:40:34-05:00 application/pdf Print Preview - C:\TEMP\Apdf_2087_3180\home\AppData\Local\PTC\Arbortext\Editor\.aptcache\ae1ss703/tf1ssa4s batserve uuid:0e8d2647-b246-445c-bb50-7b10e22a54a0 uuid:703495b7-4c91-4296-883c-1219e8c435e0 endstream endobj 179 0 obj <>stream hޜ1n0 EH /ACAOel/&%O$pl5$EjR(aҠ52cy%My9nLT{R>stream h|j0DE؇knέAC{Y2+%W{yL%+)@ewc ~P^L:Z?:R6$T$@@ݬ]RS#%qN|D˓7(>g>- :G,^ (@`ig<(Sl(SEC<O ["a'EFh7?j}29wD<~ zhB@][ #ԋ_ endstream endobj 181 0 obj <>/Filter/FlateDecode/ID[<258A2F88EC4AD672B41A7D43FE901E42>]/Info 1212 0 R/Length 700/Root 1214 0 R/Size 1213/Type/XRef/W[1 3 1]>>stream h]La=3fZ6.$݄E(I![DMm{"+Ql.$M 6d\ %\`׮3LWCy3ygj|,R#V:/lZ)ۄ:ݎ!.-bzSĮx{ a!%ܐx|7.rVwXVضq'ajaak"]&'  ("yF^`YRU*41+,^῍ݣߊ,ԙɮ}:o4MLp3SvOų^˄Nj!O=QErP suLqȀc?bܝRށQ̸,ɬj daN8 6QÐuOᦫy.ovF4ëV,pH!_\NF,RΕy13:%t+:p 1~P\yq=vg7T˻|vJ&ɗ #include #include class DataInterfaceMatlabScalar; class DataInterfaceMatlabString; class DataInterfaceMatlabVector; class DataInterfaceMatlabMatrix; class MatlabSource : public Kst::DataSource { Q_OBJECT public: MatlabSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~MatlabSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); int readScalar(double *v, const QString& field); int readString(QString *stringValue, const QString& stringName); int readField(double *v, const QString& field, int s, int n); int readMatrix(double *v, const QString& field); int samplesPerFrame(const QString& field); int frameCount(const QString& field = QString()) const; QString fileType() const; void save(QXmlStreamWriter &streamWriter); class Config; private: QMap _frameCounts; int _maxFrameCount; // Matio file object mat_t *_matfile; mutable Config *_config; // Primitive lists QMap _strings; QStringList _scalarList; QStringList _fieldList; QStringList _matrixList; friend class DataInterfaceMatlabScalar; friend class DataInterfaceMatlabString; friend class DataInterfaceMatlabVector; friend class DataInterfaceMatlabMatrix; DataInterfaceMatlabScalar* is; DataInterfaceMatlabString* it; DataInterfaceMatlabVector* iv; DataInterfaceMatlabMatrix* im; }; class MatlabSourcePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~MatlabSourcePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/matlab/matlab.cpp0000644000175000017500000006160212320547027017675 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "matlab.h" #include #include using namespace Kst; // Define enum to handle the various classes of variables with readable code // (taken from matio 1.3.4, file mat5.c static const char *class_type_desc at line 33 // and turned into an enum). Some overlap with the data type, see below. I don't exactly // understand why... enum matio_class_type {UNDEFINED_CT, CELL_ARRAY_CT, STRUCTURE_CT, OBJECT_CT, CHARACTER_ARRAY_CT, SPARSE_ARRAY_CT, DOUBLE_PRECISION_ARRAY_CT, SINGLE_PRECISION_ARRAY_CT, EIGHT_BIT_SIGNED_INT_ARRAY_CT, EIGHT_BIT_UNSIGNED_INT_ARRAY_CT, SIXTEEN_BIT_SIGNED_INT_ARRAY_CT, SIXTEEN_BIT_UNSIGNED_INT_ARRAY_CT, THIRTYTWO_BIT_SIGNED_INT_ARRAY_CT, THIRTYTWO_BIT_UNSIGNED_INT_ARRAY_CT, MATLAB_ARRAY_CT, COMPRESSED_DATA_CT}; // Define enum to handle the various data types with readable code // (taken from matio 1.3.4, file mat5.c static const char *data_type_desc at line 39) enum matio_data_type {UNKNOWN_DT, EIGHT_BIT_SIGNED_INT_DT, EIGHT_BIT_UNSIGNED_INT_DT, SIXTEEN_BIT_SIGNED_INT_DT, SIXTEEN_BIT_UNSIGNED_INT_DT, THIRTYTWO_BIT_SIGNED_INT_DT, THIRTYTWO_BIT_UNSIGNED_INT_DT, IEEE_754_SINGLE_PRECISION_DT, RESERVED_1_DT, IEEE_754_DOUBLE_PRECISION_DT, RESERVED_2_DT, RESERVED_3_DT, SIXTYFOUR_BIT_SIGNED_INT_DT, SIXTYFOUR_BIT_UNSIGNED_INT_DT, MATLAB_ARRAY_DT, COMPRESSED_DATA_DT, UTF8_CHARACTER_DATA_DT, UTF16_CHARACTER_DATA_DT, UTF32_CHARACTER_DATA_DT, STRING_DT, CELL_ARRAY_DT, STRUCTURE_DT}; // // Scalar interface // class DataInterfaceMatlabScalar : public DataSource::DataInterface { public: DataInterfaceMatlabScalar(MatlabSource& s) : matlab(s) {} // read one element int read(const QString&, DataScalar::ReadInfo&); // named elements QStringList list() const { return matlab._scalarList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); } void setDataInfo(const QString&, const DataScalar::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: MatlabSource& matlab; }; int DataInterfaceMatlabScalar::read(const QString& scalar, DataScalar::ReadInfo& p) { return matlab.readScalar(p.value, scalar); } bool DataInterfaceMatlabScalar::isValid(const QString& scalar) const { return matlab._scalarList.contains( scalar ); } // // String interface // class DataInterfaceMatlabString : public DataSource::DataInterface { public: DataInterfaceMatlabString(MatlabSource& s) : matlab(s) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return matlab._strings.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: MatlabSource& matlab; }; int DataInterfaceMatlabString::read(const QString& string, DataString::ReadInfo& p) { if (isValid(string) && p.value) { *p.value = matlab._strings[string]; return 1; } return 0; } bool DataInterfaceMatlabString::isValid(const QString& string) const { return matlab._strings.contains( string ); } /********************** Vector interface ***********************/ class DataInterfaceMatlabVector : public DataSource::DataInterface { public: DataInterfaceMatlabVector(MatlabSource& s) : matlab(s) {} // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return matlab._fieldList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&); private: MatlabSource& matlab; }; const DataVector::DataInfo DataInterfaceMatlabVector::dataInfo(const QString &field) const { if (!matlab._fieldList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(matlab.frameCount(field), matlab.samplesPerFrame(field)); } int DataInterfaceMatlabVector::read(const QString& field, DataVector::ReadInfo& p) { return matlab.readField(p.data, field, p.startingFrame, p.numberOfFrames); } bool DataInterfaceMatlabVector::isValid(const QString& field) const { return matlab._fieldList.contains( field ); } QMap DataInterfaceMatlabVector::metaScalars(const QString& field) { Q_UNUSED(field); QMap fieldScalars; return fieldScalars; } QMap DataInterfaceMatlabVector::metaStrings(const QString& field) { QMap fieldStrings; return fieldStrings; } // // Matrix interface // class DataInterfaceMatlabMatrix : public DataSource::DataInterface { public: DataInterfaceMatlabMatrix(MatlabSource& s) : matlab(s) {} // read one element int read(const QString&, DataMatrix::ReadInfo&); // named elements QStringList list() const { return matlab._matrixList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataMatrix::DataInfo dataInfo (const QString&) const; void setDataInfo(const QString&, const DataMatrix::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: MatlabSource& matlab; }; const DataMatrix::DataInfo DataInterfaceMatlabMatrix::dataInfo(const QString& matrix) const { if (!matlab._matrixList.contains( matrix ) ) { return DataMatrix::DataInfo(); } QByteArray bytes = matrix.toLatin1(); matvar_t *matvar = Mat_VarRead(matlab._matfile, bytes.data()); if (!matvar) { return DataMatrix::DataInfo(); } if (matvar->rank != 2) { return DataMatrix::DataInfo(); } DataMatrix::DataInfo info; info.samplesPerFrame = 1; info.xSize = matvar->dims[0]; info.ySize = matvar->dims[1]; Mat_VarFree(matvar); return info; } int DataInterfaceMatlabMatrix::read(const QString& field, DataMatrix::ReadInfo& p) { int count = matlab.readMatrix(p.data->z, field); p.data->xMin = 0; p.data->yMin = 0; p.data->xStepSize = 1; p.data->yStepSize = 1; return count; } bool DataInterfaceMatlabMatrix::isValid(const QString& field) const { return matlab._matrixList.contains( field ); } /********************** MatlabDatasourceSource - This class defines the main DataSource which derives from DataSource. The key functions that this class must provide is the ability to create the source, provide details about the source be able to process the data. ***********************/ MatlabSource::MatlabSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _matfile(0L), _config(0L), is(new DataInterfaceMatlabScalar(*this)), it(new DataInterfaceMatlabString(*this)), iv(new DataInterfaceMatlabVector(*this)), im(new DataInterfaceMatlabMatrix(*this)) { setInterface(is); setInterface(it); setInterface(iv); setInterface(im); setUpdateType(None); if (!type.isEmpty() && type != "Matlab") { return; } _valid = false; _maxFrameCount = 0; _filename = filename; if (init()) { _valid = true; } registerChange(); } MatlabSource::~MatlabSource() { Mat_Close(_matfile); _matfile = 0L; } void MatlabSource::reset() { Mat_Close(_matfile); _matfile = 0L; _maxFrameCount = 0; _valid = init(); } // If the datasource has any predefined fields they should be populated here. bool MatlabSource::init() { // First, try to open the file _matfile = Mat_Open(_filename.toStdString().c_str(),MAT_ACC_RDONLY); if (!_matfile) { _valid = false; return false; } _scalarList.clear(); _fieldList.clear(); _matrixList.clear(); _strings.clear(); // Some standard stuff _fieldList += "INDEX"; _strings = fileMetas(); _maxFrameCount = 0; // Now iterate over the variables and keep the usable ones plus store some interesting data like number of samples matvar_t *matvar = Mat_VarReadNextInfo(_matfile); while (matvar) { switch (matvar->class_type) { // All array types = matrix, scalar or vector - check rank and sizes to determine which case DOUBLE_PRECISION_ARRAY_CT: case SINGLE_PRECISION_ARRAY_CT: case EIGHT_BIT_SIGNED_INT_ARRAY_CT: case EIGHT_BIT_UNSIGNED_INT_ARRAY_CT: case SIXTEEN_BIT_SIGNED_INT_ARRAY_CT: case SIXTEEN_BIT_UNSIGNED_INT_ARRAY_CT: case THIRTYTWO_BIT_SIGNED_INT_ARRAY_CT: case THIRTYTWO_BIT_UNSIGNED_INT_ARRAY_CT: case MATLAB_ARRAY_CT: case COMPRESSED_DATA_CT: // Scalar if ( (matvar->rank == 1 && matvar->dims[0] == 1) || (matvar->rank == 2 && matvar->dims[0] == 1 && matvar->dims[1] == 1) ) { _scalarList << QString(matvar->name); // qDebug() << "Found a scalar: " << matvar->name; } // Vector if ( (matvar->rank == 1 && matvar->dims[0] > 1) || (matvar->rank == 2 && matvar->dims[0] == 1 && matvar->dims[1] > 1) || // matrix with one "flat" dim and at least 2 samples in the other direction (matvar->rank == 2 && matvar->dims[1] == 1 && matvar->dims[0] > 1) ) { // symmetrical case to the previous one _fieldList << QString(matvar->name); int fc = (matvar->rank == 1) ? matvar->dims[0] : qMax(matvar->dims[0], matvar->dims[1]); _maxFrameCount = qMax(_maxFrameCount, fc); _frameCounts[matvar->name] = fc; // qDebug() << "Found a vector: " << matvar->name << ", size: [" << matvar->dims[0] << "x" << matvar->dims[1] << "]"; } // Dimension 2 matrix if ( matvar->rank == 2 && matvar->dims[0] > 1 && matvar->dims[1] > 1 ) { _matrixList << QString(matvar->name); // qDebug() << "Found a matrix: " << matvar->name << ", size: [" << matvar->dims[0] << "x" << matvar->dims[1] << "]"; } break; case CHARACTER_ARRAY_CT: { // String matvar_t *string = Mat_VarRead(_matfile, matvar->name); _strings[QString(matvar->name)] = QString((char*)string->data); Mat_VarFree(string); // qDebug() << "Found a string: " << matvar->name << ", size: [" << matvar->dims[0] << "x" << matvar->dims[1] << "]"; break; } default: // qDebug() << "Variable " << matvar->name << ", type not supported (" << matvar->class_type << ")"; break; } matvar = Mat_VarReadNextInfo(_matfile); } Mat_VarFree(matvar); registerChange(); return true; // false if something went wrong } // Check if the data in the from the source has updated. // Considering how Matlab files are built up we can consider that they are always fixed Kst::Object::UpdateType MatlabSource::internalDataSourceUpdate() { return Kst::Object::NoChange; } int MatlabSource::readScalar(double *v, const QString& field) { matvar_t *matvar = Mat_VarRead(_matfile, field.toLatin1().data()); if (matvar) { // TODO: add data type check. Or is the cast enough? *v = (double)*(double *)matvar->data; Mat_VarFree(matvar); return 1; } qDebug() << "Error reading scalar " << field; return 0; } int MatlabSource::readString(QString *stringValue, const QString& stringName) { // TODO more error handling? Especially data type matvar_t *matvar = Mat_VarRead(_matfile, stringName.toLatin1().data()); if (matvar) { *stringValue = QString((const char*)matvar->data); Mat_VarFree(matvar); return 1; } return 0; } int MatlabSource::readField(double *v, const QString& field, int s, int n) { KST_DBG qDebug() << "Entering MatlabSource::readField with params: " << field << ", from " << s << " for " << n << " frames" << endl; /* For INDEX field */ if (field.toLower() == "index") { if (n < 0) { v[0] = double(s); return 1; } for (int i = 0; i < n; ++i) { v[i] = double(s + i); } return n; } /* For a variable from the Matlab file */ matio_data_type dataType; matvar_t *matvar = Mat_VarRead(_matfile, field.toLatin1().data()); if (!matvar) { KST_DBG qDebug() << "MatlabSource: queried field " << field << " which can't be read" << endl; return -1; } if (s >= _frameCounts[field]) { return 0; } dataType = (matio_data_type) matvar->data_type; switch (dataType) { // We have to be careful with the dimension of data elements case EIGHT_BIT_SIGNED_INT_DT: { int8_t *dataPointer = (int8_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case EIGHT_BIT_UNSIGNED_INT_DT: { uint8_t *dataPointer = (uint8_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case SIXTEEN_BIT_SIGNED_INT_DT: { int16_t *dataPointer = (int16_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case SIXTEEN_BIT_UNSIGNED_INT_DT: { uint16_t *dataPointer = (uint16_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case THIRTYTWO_BIT_SIGNED_INT_DT: { int32_t *dataPointer = (int32_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case THIRTYTWO_BIT_UNSIGNED_INT_DT: { uint32_t *dataPointer = (uint32_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case IEEE_754_SINGLE_PRECISION_DT: { float *dataPointer = (float*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case IEEE_754_DOUBLE_PRECISION_DT: { double *dataPointer = (double*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case SIXTYFOUR_BIT_SIGNED_INT_DT: { int64_t *dataPointer = (int64_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; case SIXTYFOUR_BIT_UNSIGNED_INT_DT: { uint64_t *dataPointer = (uint64_t*)matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i+s]; } } break; default: KST_DBG qDebug() << "MatlabSource, field " << field << ": wrong datatype for kst, no values read" << endl; return -1; break; } KST_DBG qDebug() << "Finished reading " << field << endl; Mat_VarFree(matvar); return n; } int MatlabSource::readMatrix(double *v, const QString& field) { /* For a variable from the Matlab file */ matvar_t *matvar = Mat_VarRead(_matfile, field.toLatin1().data()); if (!matvar) { KST_DBG qDebug() << "MatlabSource: queried matrix " << field << " which can't be read" << endl; return -1; } // Matrices are always read from the beginning to the end // But we have to first store the data in a buffer of the right type, then copy it to v int n = matvar->dims[0] * matvar->dims[1]; matio_data_type dataType = (matio_data_type) matvar->data_type; switch (dataType) { case EIGHT_BIT_SIGNED_INT_DT: { int8_t *dataPointer = (int8_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case EIGHT_BIT_UNSIGNED_INT_DT: { uint8_t *dataPointer = (uint8_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } free(dataPointer); } break; case SIXTEEN_BIT_SIGNED_INT_DT: { int16_t *dataPointer = (int16_t *) matvar->data;; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case SIXTEEN_BIT_UNSIGNED_INT_DT: { uint16_t *dataPointer = (uint16_t *) matvar->data;; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case THIRTYTWO_BIT_SIGNED_INT_DT: { int32_t *dataPointer = (int32_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case THIRTYTWO_BIT_UNSIGNED_INT_DT: { uint32_t *dataPointer = (uint32_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case IEEE_754_SINGLE_PRECISION_DT: { float *dataPointer = (float *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case IEEE_754_DOUBLE_PRECISION_DT: { double *dataPointer = (double *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case SIXTYFOUR_BIT_SIGNED_INT_DT: { int64_t *dataPointer = (int64_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; case SIXTYFOUR_BIT_UNSIGNED_INT_DT: { uint64_t *dataPointer = (uint64_t *) matvar->data; for (int i = 0; i < n; ++i) { v[i] = (double)dataPointer[i]; } } break; default: KST_DBG qDebug() << "MatlabSource, field " << field << ": wrong datatype for kst, no values read" << endl; return -1; break; } Mat_VarFree(matvar); return n; } int MatlabSource::frameCount(const QString& field) const { if (field.isEmpty() || field.toLower() == "index") { return _maxFrameCount; } else { return _frameCounts[field]; } } QString MatlabSource::fileType() const { return "Matlab Datasource"; } void MatlabSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } int MatlabSource::samplesPerFrame(const QString& field) { return 1; } // Name used to identify the plugin. Used when loading the plugin. QString MatlabSourcePlugin::pluginName() const { return tr("Matlab Datasource Reader"); } QString MatlabSourcePlugin::pluginDescription() const { return tr("Matlab's .mat Datasource Reader"); } /********************** MatlabDatasourcePlugin - This class defines the plugin interface to the DataSource defined by the plugin. The primary requirements of this class are to provide the necessary connections to create the object which includes providing access to the configuration widget. ***********************/ Kst::DataSource *MatlabSourcePlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new MatlabSource(store, cfg, filename, type, element); } // Provides the matrix list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of matrices. QStringList MatlabSourcePlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if (typeSuggestion) { *typeSuggestion = "Matlab Datasource"; } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } QStringList matrixList; return matrixList; } // Provides the scalar list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of scalars if necessary. QStringList MatlabSourcePlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Matlab Datasource"; } scalarList.append("FRAMES"); return scalarList; } // Provides the string list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of strings if necessary. QStringList MatlabSourcePlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Matlab Datasource"; } stringList.append("FILENAME"); return stringList; } // Provides the field list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of fields if necessary. QStringList MatlabSourcePlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg) Q_UNUSED(filename) Q_UNUSED(type) if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = "Matlab Datasource"; } QStringList fieldList; return fieldList; } // The main function used to determine if this plugin knows how to process the provided file. // Each datasource plugin should check the file and return a number between 0 and 100 based // on the likelyhood of the file being this type. 100 should only be returned if there is no way // that the file could be any datasource other than this one. int MatlabSourcePlugin::understands(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) QFileInfo fi(filename); if (fi.suffix() == "mat") { return 80; } else return 0; } bool MatlabSourcePlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return false; } QStringList MatlabSourcePlugin::provides() const { QStringList rc; rc += "Matlab Datasource"; return rc; } // Request for this plugins configuration widget. Kst::DataSourceConfigWidget *MatlabSourcePlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_matlab, MatlabSourcePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/matlab/matlab.pro0000644000175000017500000000037212277111530017705 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_matlabio) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/matlab/tmp SOURCES += \ matlab.cpp HEADERS += \ matlab.h Kst-2.0.8/src/datasources/ascii/0000755000175000017500000000000012362705136015557 5ustar synthsynthKst-2.0.8/src/datasources/ascii/kst_atof.h0000644000175000017500000000466612362701575017561 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_ATOF_H #define KST_ATOF_H #include #include #include #include "math_kst.h" #ifdef Q_CC_MSVC #define KST_THREAD_LOCAL __declspec(thread) #else #define KST_THREAD_LOCAL __thread #endif class LexicalCast { public: static LexicalCast& instance(); enum NaNMode { NullValue, NaNValue, PreviousValue }; struct AutoReset { AutoReset(bool useDot, NaNMode); ~AutoReset(); }; void setUseDotAsDecimalSeparator(bool useDot); char localSeparator() const; #ifdef KST_USE_KST_ATOF double fromDouble(const char* p) const; #else inline double fromDouble(const char* p) const { return atof(p); } #endif double fromTime(const char*) const; inline double toDouble(const char* p) const { return _isFormattedTime ? fromTime(p) : fromDouble(p); } void setTimeFormat(const QString& format); double nanValue() const; private: LexicalCast(); ~LexicalCast(); NaNMode _nanMode; static KST_THREAD_LOCAL double _previousValue; char _separator; QByteArray _originalLocal; QString _timeFormat; int _timeFormatLength; bool _isFormattedTime; bool _timeWithDate; void resetLocal(); inline bool isDigit(const char c) const { return (c >= 48) && (c <= 57) ? true : false; } }; //------------------------------------------------------------------------------------------- inline double LexicalCast::nanValue() const { switch (_nanMode) { case NullValue: return 0; case NaNValue: return Kst::NOPOINT; case PreviousValue: return _previousValue; default: return 0; } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciisource.h0000644000175000017500000001041512320547027020237 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_SOURCE_H #define ASCII_SOURCE_H #include "asciidatareader.h" #include "asciisourceconfig.h" #include "datasource.h" #include "dataplugin.h" #include class QFile; class DataInterfaceAsciiString; class DataInterfaceAsciiVector; class QProgressBar; class QLabel; class AsciiSource : public Kst::DataSource { Q_OBJECT public: AsciiSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e = QDomElement()); ~AsciiSource(); bool initRowIndex(); UpdateType internalDataSourceUpdate(bool read_completely); virtual UpdateType internalDataSourceUpdate(); void prepareRead(int count); void readingDone(); int readField(double *v, const QString &field, int s, int n); QString fileType() const; void setUpdateType(UpdateCheckType); void save(QXmlStreamWriter &s); void parseProperties(QXmlStreamAttributes &properties); bool isEmpty() const; bool supportsTimeConversions() const; int sampleForTime(double ms, bool *ok); int sampleForTime(const QDateTime& time, bool *ok); bool isTime(const QString &field) const; virtual void reset(); void updateLists(); virtual const QString& typeString() const; static const QString asciiTypeKey(); static QStringList fieldListFor(const QString& filename, AsciiSourceConfig cfg); static QStringList unitListFor(const QString& filename, AsciiSourceConfig cfg); static QStringList scalarListFor(const QString& filename, AsciiSourceConfig cfg); static QStringList stringListFor(const QString& filename, AsciiSourceConfig cfg); Kst::ObjectList autoCurves(Kst::ObjectStore& objectStore); QString timeFormat() const; void triggerRowProgress() { emit signalRowProgress(); } signals: void signalRowProgress(); private: AsciiDataReader _reader; AsciiFileBuffer _fileBuffer; bool _busy; int _read_count_max; int _read_count; friend class AsciiConfigWidget; mutable AsciiSourceConfig _config; qint64 _fileSize; bool _haveHeader; bool _fieldListComplete; bool _haveWarned; double _fileCreationTime_t; bool _showFieldProgress; double _progress; double _progressSteps; void updateFieldMessage(const QString&); void updateFieldProgress(const QString&); void emitProgress(int precent, const QString&); QString _actualField; QStringList _scalarList; QMap _strings; QStringList _fieldList; QHash _fieldLookup; QMap _fieldUnits; bool useThreads() const; bool useSlidingWindow(qint64 bytesToRead) const; int tryReadField(double *v, const QString &field, int s, int n); int parseWindowSinglethreaded(QVector& fileData, int col, double* v, int start, const QString& field, int sRead); int parseWindowMultithreaded(QVector& fileData, int col, double* v, int start, const QString& field); int columnOfField(const QString& field) const; static int splitHeaderLine(const QByteArray& line, const AsciiSourceConfig& cfg, QStringList* parts = 0); DataInterfaceAsciiString* is; DataInterfaceAsciiVector* iv; int _progressValue; qint64 _progressRows; static void rowProgress(QObject*); QTime _progressTimer; // TODO remove friend class DataInterfaceAsciiString; friend class DataInterfaceAsciiVector; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/namedparameter.h0000644000175000017500000000507412277111530020715 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_NAMED_PARAMETER #define KST_NAMED_PARAMETER #include #include #include #include template class NamedParameter { public: // this is not nice, it sets not the value but its default NamedParameter(const T& default_value) : _value(default_value), _default_value(default_value), _value_set(false) { } void operator>>(QSettings& settings) const { const QVariant var = QVariant::fromValue(value()); settings.setValue(Key, var); } void operator<<(QSettings& settings) { const QVariant var = settings.value(Key); if (!var.isNull()) { Q_ASSERT(var.canConvert()); setValue(var.value()); } } void operator>>(QXmlStreamWriter& xml) { xml.writeAttribute(Tag, QVariant(value()).toString()); } void operator<<(QXmlStreamAttributes& att) { setValue(QVariant(att.value(Tag).toString()).value()); } void operator<<(const QDomElement& e) { if (e.hasAttribute(Tag)) { setValue(QVariant(e.attribute(Tag)).value()); } } void setValue(const T& t) { _value = t; _value_set = true; } const T& value() const { if (!_value_set) { //qDebug() << "Using unset value " << Key << " using default: " << _default_value; return _default_value; } return _value; } operator const T&() const { return value(); } NamedParameter& operator=(const T& t) { setValue(t); return *this; } bool operator==(const T& rhs) const { return value() == rhs; } bool operator!=(const T& rhs) const { return !operator==(rhs); } private: T _value; T _default_value; bool _value_set; }; #endif Kst-2.0.8/src/datasources/ascii/asciidatareader.cpp0000644000175000017500000004000612362701575021373 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciidatareader.h" #include "asciisourceconfig.h" #include "math_kst.h" #include "kst_inf.h" #include "kst_atof.h" #include "measuretime.h" #include #include #include #include #include #include #include #include using namespace AsciiCharacterTraits; // Enable QASSERT in QVarLengthArray when using [] on data #if 0 #define checkedData constArray #else #define checkedData constPointer // loads faster in debug mode #endif //------------------------------------------------------------------------------------------- AsciiDataReader::AsciiDataReader(AsciiSourceConfig& config) : _progressValue(0), _progressRows(0), _numFrames(0), _progressMax(0), _progressDone(0), _config(config), isDigit(), isWhiteSpace() { } //------------------------------------------------------------------------------------------- AsciiDataReader::~AsciiDataReader() { } //------------------------------------------------------------------------------------------- void AsciiDataReader::clear() { _rowIndex.clear(); setRow0Begin(0); _numFrames = 0; } //------------------------------------------------------------------------------------------- void AsciiDataReader::setRow0Begin(qint64 begin) { _rowIndex.resize(1); _rowIndex[0] = begin; } //------------------------------------------------------------------------------------------- void AsciiDataReader::detectLineEndingType(QFile& file) { QByteArray line; int line_size = 0; while (line_size < 2 && !file.atEnd()) { line = file.readLine(); line_size = line.size(); } file.seek(0); if (line_size < 2) { _lineending = LineEndingType(); } else { _lineending.is_crlf = line[line_size - 2] == '\r' && line[line_size - 1] == '\n' ; _lineending.character = _lineending.is_crlf ? line[line_size - 2] : line[line_size - 1]; } } //------------------------------------------------------------------------------------------- void AsciiDataReader::toDouble(const LexicalCast& lexc, const char* buffer, qint64 bufread, qint64 ch, double* v, int) const { if ( isDigit(buffer[ch]) || buffer[ch] == '-' || buffer[ch] == '.' || buffer[ch] == '+' || isWhiteSpace(buffer[ch])) { *v = lexc.toDouble(&buffer[ch]); } else if ( ch + 2 < bufread && tolower(buffer[ch]) == 'i' && tolower(buffer[ch + 1]) == 'n' && tolower(buffer[ch + 2]) == 'f') { *v = INF; } else if ((*v = lexc.fromTime(&buffer[ch])) != lexc.nanValue()) { // string is a date starting with a character (Jun 2 17:52:44 2014) } else { /* TODO enable by option: "Add unparsable lines as strings" if (_rowIndex.size() > row + 1) { QString unparsable = QString::fromAscii(&buffer[_rowIndex[row]], _rowIndex[row + 1] - _rowIndex[row]); _strings[QString("Unparsable %1").arg(row)] = unparsable.trimmed(); } */ } } //------------------------------------------------------------------------------------------- bool AsciiDataReader::findAllDataRows(bool read_completely, QFile* file, qint64 byteLength, int col_count) { detectLineEndingType(*file); _progressMax = byteLength; _progressDone = 0; bool new_data = false; AsciiFileData buf; const qint64 more = read_completely ? qMin(qMax(byteLength, AsciiFileData::Prealloc - 1), 100 * AsciiFileData::Prealloc) : AsciiFileData::Prealloc - 1; do { // Read the tmpbuffer, starting at row_index[_numFrames] buf.clear(); qint64 bufstart = _rowIndex[_numFrames]; // always read from the start of a line _progressDone += buf.read(*file, bufstart, byteLength - bufstart, more); if (buf.bytesRead() == 0) { return false; } if (_config._delimiters.value().size() == 0) { const NoDelimiter comment_del; if (_lineending.isLF()) { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakLF(_lineending), comment_del, col_count); } else { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakCR(_lineending), comment_del, col_count); } } else if (_config._delimiters.value().size() == 1) { const IsCharacter comment_del(_config._delimiters.value()[0].toLatin1()); if (_lineending.isLF()) { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakLF(_lineending), comment_del, col_count); } else { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakCR(_lineending), comment_del, col_count); } } else if (_config._delimiters.value().size() > 1) { const IsInString comment_del(_config._delimiters.value()); if (_lineending.isLF()) { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakLF(_lineending), comment_del, col_count); } else { new_data = findDataRows(buf.checkedData(), buf.begin(), buf.bytesRead(), IsLineBreakCR(_lineending), comment_del, col_count); } } QMutexLocker lock(&_progressMutex); _progressRows = _numFrames; _progressValue = 100.0 * _progressDone / (1.0 * _progressMax); } while (buf.bytesRead() == more && read_completely); return new_data; } //------------------------------------------------------------------------------------------- template bool AsciiDataReader::findDataRows(const Buffer& buffer, qint64 bufstart, qint64 bufread, const IsLineBreak& isLineBreak, const CommentDelimiter& comment_del, int col_count) { const IsWhiteSpace isWhiteSpace; bool new_data = false; bool row_has_data = false; bool is_comment = false; const qint64 row_offset = bufstart + isLineBreak.size; qint64 row_start = 0; const qint64 old_numFrames = _numFrames; // _rowIndex[_numFrames] already set, find next row for (qint64 i = 0; i < bufread; ++i) { if (comment_del(buffer[i])) { is_comment = true; } else if (isLineBreak(buffer[i])) { if (row_has_data) { ++_numFrames; if (_numFrames + 1 >= _rowIndex.size()) { if (_rowIndex.capacity() < _numFrames + 1) { qint64 more = qMin(qMax(2 * _numFrames, AsciiFileData::Prealloc), 100 * AsciiFileData::Prealloc); _rowIndex.reserve(_numFrames + more); } _rowIndex.resize(_numFrames + 1); } row_start = row_offset + i; _rowIndex[_numFrames] = row_start; new_data = true; } else if (is_comment) { row_start = row_offset+i; } row_has_data = false; is_comment = false; } else if (!row_has_data && !isWhiteSpace(buffer[i]) && !is_comment) { row_has_data = true; } } if (_numFrames > old_numFrames) _rowIndex[_numFrames] = row_start; if (_config._columnType == AsciiSourceConfig::Fixed) { // only read complete lines, last column could be only 1 char long if (_rowIndex.size() > 1) { for (qint64 i = 1; i <= _numFrames; ++i) { if (_rowIndex[i] <= _rowIndex[i - 1] + col_count * (_config._columnWidth - 1) + 1) { _rowIndex.resize(i); _numFrames = i - 1; } } } } return new_data; } //------------------------------------------------------------------------------------------- int AsciiDataReader::readFieldFromChunk(const AsciiFileData& chunk, int col, double *v, int start, const QString& field) { Q_ASSERT(chunk.rowBegin() >= start); return readField(chunk, col, v + chunk.rowBegin() - start, field, chunk.rowBegin(), chunk.rowsRead()); } //------------------------------------------------------------------------------------------- double AsciiDataReader::progressValue() { QMutexLocker lock(&_progressMutex); return _progressValue; } //------------------------------------------------------------------------------------------- qint64 AsciiDataReader::progressRows() { QMutexLocker lock(&_progressMutex); return _progressRows; } //------------------------------------------------------------------------------------------- int AsciiDataReader::readField(const AsciiFileData& buf, int col, double *v, const QString& field, int s, int n) { if (_config._columnType == AsciiSourceConfig::Fixed) { //MeasureTime t("AsciiSource::readField: same width for all columns"); const LexicalCast& lexc = LexicalCast::instance(); // buf[0] points to some row start, _rowIndex[i] is absolute, so we have to subtract buf.begin(). const char*const col_start = &buf.checkedData()[0] + _config._columnWidth * (col - 1) - buf.begin(); for (int i = 0; i < n; ++i) { v[i] = lexc.toDouble(col_start + _rowIndex[i + s] ); } return n; } else if (_config._columnType == AsciiSourceConfig::Custom) { if (_config._columnDelimiter.value().size() == 1) { //MeasureTime t("AsciiSource::readField: 1 custom column delimiter"); const IsCharacter column_del(_config._columnDelimiter.value()[0].toLatin1()); return readColumns(v, buf.checkedData(), buf.begin(), buf.bytesRead(), col, s, n, _lineending, column_del); } if (_config._columnDelimiter.value().size() > 1) { //MeasureTime t(QString("AsciiSource::readField: %1 custom column delimiters").arg(_config._columnDelimiter.value().size())); const IsInString column_del(_config._columnDelimiter.value()); return readColumns(v, buf.checkedData(), buf.begin(), buf.bytesRead(), col, s, n, _lineending, column_del); } } else if (_config._columnType == AsciiSourceConfig::Whitespace) { //MeasureTime t("AsciiSource::readField: whitespace separated columns"); const IsWhiteSpace column_del; return readColumns(v, buf.checkedData(), buf.begin(), buf.bytesRead(), col, s, n, _lineending, column_del); } return 0; } // // template instantiation chain to generate optimal code for all possible data configurations // //------------------------------------------------------------------------------------------- template int AsciiDataReader::readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const LineEndingType& lineending, const ColumnDelimiter& column_del) const { if (_config._delimiters.value().size() == 0) { const NoDelimiter comment_del; return readColumns(v, buffer, bufstart, bufread, col, s, n, lineending, column_del, comment_del); } else if (_config._delimiters.value().size() == 1) { const IsCharacter comment_del(_config._delimiters.value()[0].toLatin1()); return readColumns(v, buffer, bufstart, bufread, col, s, n, lineending, column_del, comment_del); } else if (_config._delimiters.value().size() > 1) { const IsInString comment_del(_config._delimiters.value()); return readColumns(v, buffer, bufstart, bufread, col, s, n, lineending, column_del, comment_del); } return 0; } //------------------------------------------------------------------------------------------- template int AsciiDataReader::readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const LineEndingType& lineending, const ColumnDelimiter& column_del, const CommentDelimiter& comment_del) const { if (_config._columnWidthIsConst) { const AlwaysTrue column_withs_const; if (lineending.isLF()) { return readColumns(v, buffer, bufstart, bufread, col, s, n, IsLineBreakLF(lineending), column_del, comment_del, column_withs_const); } else { return readColumns(v, buffer, bufstart, bufread, col, s, n, IsLineBreakCR(lineending), column_del, comment_del, column_withs_const); } } else { const AlwaysFalse column_withs_const; if (lineending.isLF()) { return readColumns(v, buffer, bufstart, bufread, col, s, n, IsLineBreakLF(lineending), column_del, comment_del, column_withs_const); } else { return readColumns(v, buffer, bufstart, bufread, col, s, n, IsLineBreakCR(lineending), column_del, comment_del, column_withs_const); } } } //------------------------------------------------------------------------------------------- template int AsciiDataReader::readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const IsLineBreak& isLineBreak, const ColumnDelimiter& column_del, const CommentDelimiter& comment_del, const ColumnWidthsAreConst& are_column_widths_const) const { const LexicalCast& lexc = LexicalCast::instance(); const QString delimiters = _config._delimiters.value(); bool is_custom = (_config._columnType.value() == AsciiSourceConfig::Custom); qint64 col_start = -1; for (int i = 0; i < n; i++, ++s) { bool incol = false; int i_col = 0; const qint64 chstart = _rowIndex[s] - bufstart; if (is_custom && column_del(buffer[chstart])) { // row could start with delemiter incol = true; } if (are_column_widths_const()) { if (col_start != -1) { v[i] = lexc.toDouble(&buffer[0] + _rowIndex[s] + col_start); continue; } } v[i] = lexc.nanValue(); for (qint64 ch = chstart; ch < bufread; ++ch) { if (isLineBreak(buffer[ch])) { break; } else if (column_del(buffer[ch])) { //<- check for column start if ((!incol) && is_custom) { ++i_col; if (i_col == col) { v[i] = NAN; } } incol = false; } else if (comment_del(buffer[ch])) { break; } else { if (!incol) { incol = true; ++i_col; if (i_col == col) { toDouble(lexc, &buffer[0], bufread, ch, &v[i], i); if (are_column_widths_const()) { if (col_start == -1) { col_start = ch - _rowIndex[s]; } } break; } } } } } return n; } //------------------------------------------------------------------------------------------- template<> int AsciiDataReader::splitColumns(const QByteArray& line, const IsWhiteSpace& isWhitespace, QStringList* cols) { int colstart = 0; const int size = line.size(); //ignore whitespace at the beginning for (; colstart < size && isWhitespace(line[colstart]); colstart++) {} int count = 0; int incol = true; for (int i = colstart; i < size; i++) { // entering column if (!incol && !isWhitespace(line[i])) { incol = true; colstart = i; continue; } // leaving column if (incol && isWhitespace(line[i])) { count++; if (cols) { const QByteArray col(line.constData() + colstart, i - colstart); cols->push_back(QString(col)); } incol = false; } } if (incol) { const QByteArray col(line.begin() + colstart, size - 1 - colstart); QString lastCol = QString(col).simplified(); if (!lastCol.isEmpty()) { count++; if (cols) cols->push_back(lastCol); } } return count; } // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciifilebuffer.h0000644000175000017500000000445512277111530021054 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2012 Peter Kümmel * * email : syntheticpp@gmx.net * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_FILE_BUFFER_H #define ASCII_FILE_BUFFER_H #include "asciifiledata.h" #include #include class AsciiFileBuffer { public: AsciiFileBuffer(); ~AsciiFileBuffer(); typedef QVarLengthArray RowIndex; inline qint64 begin() const { return _begin; } inline qint64 bytesRead() const { return _bytesRead; } void clear(); void setFile(QFile* file); bool readWindow(QVector& window) const; void useOneWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, int numChunks); void useSlidingWindow(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize); void useSlidingWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize, int numWindowChunks); QVector >& fileData() { return _fileData; } static bool openFile(QFile &file); private: QFile* _file; QVector > _fileData; qint64 _begin; qint64 _bytesRead; const QVector splitFile(qint64 chunkSize, const RowIndex& rowIndex, qint64 start, qint64 bytesToRead) const; qint64 findRowOfPosition(const AsciiFileBuffer::RowIndex& rowIndex, qint64 searchStart, qint64 pos) const; void useSlidingWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize, int numWindowChunks, bool reread); friend class AsciiSourceTest; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciiplugin.cpp0000644000175000017500000001600012320547027020564 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciiplugin.h" #include "asciiconfigwidget.h" #include "asciisourceconfig.h" #include "kst_atof.h" #include #include #include #include #include QString AsciiPlugin::pluginName() const { return tr("ASCII File Reader"); } QString AsciiPlugin::pluginDescription() const { return tr("ASCII File Reader"); } Kst::DataSource *AsciiPlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new AsciiSource(store, cfg, filename, type, element); } QStringList AsciiPlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if (typeSuggestion) { *typeSuggestion = AsciiSource::asciiTypeKey(); } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } return QStringList(); } QStringList AsciiPlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = AsciiSource::asciiTypeKey(); } AsciiSourceConfig config; config.readGroup(*cfg, filename); QStringList rc = AsciiSource::fieldListFor(filename, config); if (complete) { *complete = rc.count() > 1; } return rc; } QStringList AsciiPlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = AsciiSource::asciiTypeKey(); } AsciiSourceConfig config; config.readGroup(*cfg, filename); QStringList rc = AsciiSource::scalarListFor(filename, config); if (complete) { *complete = rc.count() > 1; } return rc; } QStringList AsciiPlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = AsciiSource::asciiTypeKey(); } AsciiSourceConfig config; config.readGroup(*cfg, filename); QStringList rc = AsciiSource::stringListFor(filename, config); if (complete) { *complete = rc.count() > 1; } return rc; } int AsciiPlugin::understands(QSettings *cfg, const QString& filename) const { AsciiSourceConfig config; config.readGroup(*cfg, filename); if (!QFile::exists(filename) || QFileInfo(filename).isDir()) { return 0; } if (!config._fileNamePattern.value().isEmpty()) { QRegExp filenamePattern(config._fileNamePattern); filenamePattern.setPatternSyntax(QRegExp::Wildcard); if (filenamePattern.exactMatch(filename)) { return 100; } } QFile f(filename); if (f.open(QIODevice::ReadOnly)) { QRegExp commentRE; QRegExp dataRE; if (config._columnType == AsciiSourceConfig::Custom && !config._columnDelimiter.value().isEmpty()) { commentRE.setPattern(QString("^[%1]*[%2].*").arg(QRegExp::escape(config._columnDelimiter)).arg(config._delimiters)); dataRE.setPattern(QString("^[%1]*(([Nn][Aa][Nn]|(\\-\\+)?[Ii][Nn][Ff]|[0-9\\+\\-\\.eE]+)[\\s]*)+").arg(QRegExp::escape(config._columnDelimiter))); } else { commentRE.setPattern(QString("^\\s*[%1].*").arg(config._delimiters)); dataRE.setPattern(QString("^[\\s]*(([Nn][Aa][Nn]|(\\-\\+)?[Ii][Nn][Ff]|[0-9\\+\\-\\.eE]+)[\\s]*)+")); } int skip = config._dataLine; bool done = false; while (!done) { const QByteArray line = f.readLine(); const int rc = line.size(); if (skip > 0) { --skip; if (rc <= 0) { done = true; } continue; } if (rc <= 0) { done = true; } else if (rc == 1) { // empty line; do nothing } else if (commentRE.exactMatch(line)) { // comment; do nothing } else if (dataRE.exactMatch(line)) { // a number - this may be an ascii file - assume that it is // This line checks for an indirect file and gives that a chance too. // Indirect files look like ascii files. return 75; //return QFile::exists(line.trimmed()) ? 49 : 75; } else { return 20; } } } else { return 0; } return 1; // still might be ascii - ex: header with no data yet. } bool AsciiPlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return true; } QStringList AsciiPlugin::provides() const { return QStringList() <load(); config->setFilename(filename); return config; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_ascii, AsciiPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciifiledata.h0000644000175000017500000000514612277111530020512 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2012 Peter Kümmel * * email : syntheticpp@gmx.net * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_FILE_DATA_H #define ASCII_FILE_DATA_H #include #include class QFile; template class QVarLengthArray; class AsciiFileData { public: enum SizeOnStack { Prealloc = #if defined(__ANDROID__) || defined(__QNX__) || defined(KST_SMALL_PRREALLOC) // Some mobile systems really do not like you allocating 1MB on the stack. 1 * 1024 #else 1 * 1024 * 1024 #endif }; typedef QVarLengthArray Array; AsciiFileData(); ~AsciiFileData(); inline bool reread() const { return _reread; } inline void setReread(bool value) { _reread = value; } inline qint64 begin() const { return _begin; } inline qint64 bytesRead() const { return _bytesRead; } inline void setBegin(qint64 begin) { _begin = begin; } inline void setBytesRead(qint64 read) { _bytesRead = read; } inline void setFile(QFile* file) { _file = file; } bool read(); qint64 read(QFile&, qint64 start, qint64 numberOfBytes, qint64 maximalBytes = -1); char* data(); const char* const constPointer() const; const Array& constArray() const; bool resize(qint64 size); void clear(bool forceDeletingArray = false); inline qint64 rowBegin() const { return _rowBegin; } inline qint64 rowsRead() const { return _rowsRead; } inline void setRowBegin(qint64 begin) { _rowBegin = begin; } inline void setRowsRead(qint64 read) { _rowsRead = read; } void setSharedArray(AsciiFileData&); void logData() const; static void logData(const QVector& chunks); private: QSharedPointer _array; QFile* _file; bool _fileRead; bool _reread; qint64 _begin; qint64 _bytesRead; qint64 _rowBegin; qint64 _rowsRead; }; Q_DECLARE_TYPEINFO(AsciiFileData, Q_MOVABLE_TYPE); #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciisourceconfig.cpp0000644000175000017500000003066212362701575021774 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciisourceconfig.h" #include "asciisource.h" #include "datasource.h" // // AsciiSourceConfig // #define DEFAULT_COMMENT_DELIMITERS "#" #define DEFAULT_COLUMN_WIDTH 16 const char AsciiSourceConfig::Key_fileNamePattern[] = "Filename Pattern"; const char AsciiSourceConfig::Tag_fileNamePattern[] = "filenamepattern"; const char AsciiSourceConfig::Key_delimiters[] = "Comment Delimiters"; const char AsciiSourceConfig::Tag_delimiters[] = "delimiters"; const char AsciiSourceConfig::Key_indexVector[] ="Index"; const char AsciiSourceConfig::Tag_indexVector[] ="vector"; const char AsciiSourceConfig::Key_indexInterpretation[] = "Default INDEX Interpretation"; const char AsciiSourceConfig::Tag_indexInterpretation[] = "interpretation"; const char AsciiSourceConfig::Key_timeAsciiFormatString[] = "ASCII Time format"; const char AsciiSourceConfig::Tag_timeAsciiFormatString[] = "asciiTimeFormat"; const char AsciiSourceConfig::Key_columnType[] = "Column Type"; const char AsciiSourceConfig::Tag_columnType[] = "columntype"; const char AsciiSourceConfig::Key_columnDelimiter[] = "Column Delimiter"; const char AsciiSourceConfig::Tag_columnDelimiter[] = "columndelimiter"; const char AsciiSourceConfig::Key_columnWidth[] = "Column Width"; const char AsciiSourceConfig::Tag_columnWidth[] = "columnwidth"; const char AsciiSourceConfig::Key_columnWidthIsConst[] = "Column Width is const"; const char AsciiSourceConfig::Tag_columnWidthIsConst[] = "columnwidthisconst"; const char AsciiSourceConfig::Key_dataLine[] = "Data Start"; const char AsciiSourceConfig::Tag_dataLine[] = "headerstart"; const char AsciiSourceConfig::Key_readFields[] = "Read Fields"; const char AsciiSourceConfig::Tag_readFields[] = "readfields"; const char AsciiSourceConfig::Key_readUnits[] = "Read Units"; const char AsciiSourceConfig::Tag_readUnits[] = "readunits"; const char AsciiSourceConfig::Key_useDot[] = "Use Dot"; const char AsciiSourceConfig::Tag_useDot[] = "usedot"; const char AsciiSourceConfig::Key_fieldsLine[] = "Fields Line"; const char AsciiSourceConfig::Tag_fieldsLine[] = "fields"; const char AsciiSourceConfig::Key_unitsLine[] = "Units Line"; const char AsciiSourceConfig::Tag_unitsLine[] = "units"; const char AsciiSourceConfig::Key_limitFileBuffer[] = "Limit file buffer size"; const char AsciiSourceConfig::Tag_limitFileBuffer[] = "limitFileBuffer"; const char AsciiSourceConfig::Key_limitFileBufferSize[] = "Size of limited file buffer"; const char AsciiSourceConfig::Tag_limitFileBufferSize[] = "limitFileBufferSize"; const char AsciiSourceConfig::Key_useThreads[] = "Use threads when parsing Ascii data"; const char AsciiSourceConfig::Tag_useThreads[] = "useThreads"; const char AsciiSourceConfig::Key_dataRate[] = "Data Rate for index"; const char AsciiSourceConfig::Tag_dataRate[] = "dataRate"; const char AsciiSourceConfig::Key_offsetDateTime[] = "use an explicit date/time offset"; const char AsciiSourceConfig::Tag_offsetDateTime[] = "offsetDateTime"; const char AsciiSourceConfig::Key_offsetFileDate[] = "use file time/date as offset"; const char AsciiSourceConfig::Tag_offsetFileDate[] = "offsetFileDate"; const char AsciiSourceConfig::Key_offsetRelative[] = "use relative file time offset"; const char AsciiSourceConfig::Tag_offsetRelative[] = "offsetRelavive"; const char AsciiSourceConfig::Key_dateTimeOffset[] = "date/time offset"; const char AsciiSourceConfig::Tag_dateTimeOffset[] = "dateTimeOffset"; const char AsciiSourceConfig::Key_relativeOffset[] = "relative offset"; const char AsciiSourceConfig::Tag_relativeOffset[] = "relativeOffset"; const char AsciiSourceConfig::Key_nanValue[] = "NaN value"; const char AsciiSourceConfig::Tag_nanValue[] = "nanValue"; const char AsciiSourceConfig::Key_updateType[] = "updateType"; const char AsciiSourceConfig::Tag_updateType[] = "updateType"; AsciiSourceConfig::AsciiSourceConfig() : _delimiters(DEFAULT_COMMENT_DELIMITERS), _indexVector("INDEX"), _indexInterpretation(Unknown), _timeAsciiFormatString("hh:mm:ss.zzz"), _fileNamePattern(""), _columnType(Whitespace), _columnDelimiter(","), _columnWidth(DEFAULT_COLUMN_WIDTH), _columnWidthIsConst(false), _dataLine(0), _readFields(false), _readUnits(false), _fieldsLine(0), _unitsLine(0), _useDot(true), _limitFileBuffer(false), _limitFileBufferSize(100), _useThreads(false), _dataRate(1.0), _offsetDateTime(false), _offsetFileDate(false), _offsetRelative(true), _dateTimeOffset(QDateTime::currentDateTime()), _relativeOffset(0), _nanValue(0), _updateType(Kst::DataSource::Timer) { } void AsciiSourceConfig::save(QSettings& cfg) const { _fileNamePattern >> cfg; _indexVector >> cfg; _delimiters >> cfg; _indexInterpretation >> cfg; _columnType >> cfg; _columnDelimiter >> cfg; _columnWidth >> cfg; _dataLine >> cfg; _readFields >> cfg; _useDot >> cfg; _fieldsLine >> cfg; _columnWidthIsConst >> cfg; _readUnits >> cfg; _unitsLine >> cfg; _limitFileBuffer >> cfg; _limitFileBufferSize >> cfg; _useThreads >> cfg; _timeAsciiFormatString >> cfg; _dataRate >> cfg; _offsetDateTime >> cfg; _offsetFileDate >> cfg; _offsetRelative >> cfg; _dateTimeOffset >> cfg; _relativeOffset >> cfg; _nanValue >> cfg; _updateType >> cfg; } void AsciiSourceConfig::saveDefault(QSettings& cfg) const { cfg.beginGroup(AsciiSource::asciiTypeKey()); save(cfg); cfg.endGroup(); } void AsciiSourceConfig::saveGroup(QSettings& cfg, const QString& fileName) const { if (fileName.isEmpty()) return; cfg.beginGroup(AsciiSource::asciiTypeKey()); cfg.beginGroup(fileName); save(cfg); cfg.endGroup(); cfg.endGroup(); } void AsciiSourceConfig::read(QSettings& cfg) { _fileNamePattern << cfg; _indexVector << cfg; _delimiters << cfg; _indexInterpretation << cfg; _columnType << cfg; _columnDelimiter << cfg; _columnWidth << cfg; _dataLine << cfg; _readFields << cfg; _useDot << cfg; _fieldsLine << cfg; _columnWidthIsConst << cfg; _readUnits << cfg; _unitsLine << cfg; _limitFileBuffer << cfg; _limitFileBufferSize << cfg; _useThreads << cfg; _timeAsciiFormatString << cfg; _dataRate << cfg; _offsetDateTime << cfg; _offsetFileDate << cfg; _offsetRelative << cfg; _dateTimeOffset << cfg; _relativeOffset << cfg; _nanValue << cfg; _updateType << cfg; } const AsciiSourceConfig& AsciiSourceConfig::readGroup(QSettings& cfg, const QString& fileName) { cfg.beginGroup(AsciiSource::asciiTypeKey()); read(cfg); if (!fileName.isEmpty()) { cfg.beginGroup(fileName); read(cfg); cfg.endGroup(); } _delimiters = QRegExp::escape(_delimiters).toLatin1(); cfg.endGroup(); return *this; } void AsciiSourceConfig::save(QXmlStreamWriter& s) { s.writeStartElement("properties"); if (_indexInterpretation != AsciiSourceConfig::Unknown) { _indexVector >> s; _indexInterpretation >> s; } _delimiters >> s; _columnType >> s; if (_columnType == Fixed) { _columnWidth >> s; } else if (_columnType == Custom) { _columnDelimiter >> s; } _dataLine >> s; _fieldsLine >> s; _readFields >> s; _useDot >> s; _columnWidthIsConst >> s; _readUnits >> s; _unitsLine >> s; _limitFileBuffer >> s; _limitFileBufferSize >> s; _useThreads >> s; _timeAsciiFormatString >> s; _dataRate >> s; _offsetDateTime >> s; _offsetFileDate >> s; _offsetRelative >> s; _dateTimeOffset >> s; _relativeOffset >> s; _nanValue >> s; _updateType >> s; s.writeEndElement(); } void AsciiSourceConfig::parseProperties(QXmlStreamAttributes& attributes) { _fileNamePattern << attributes; _indexVector << attributes; _delimiters << attributes; _indexInterpretation << attributes; _columnType << attributes; _columnDelimiter << attributes; _columnWidth << attributes; _dataLine << attributes; _readFields << attributes; _useDot << attributes; _fieldsLine << attributes; _columnWidthIsConst << attributes; _readUnits << attributes; _unitsLine << attributes; _limitFileBuffer << attributes; _limitFileBufferSize << attributes; _useThreads << attributes; _timeAsciiFormatString << attributes; _dataRate << attributes; _offsetDateTime << attributes; _offsetFileDate << attributes; _offsetRelative << attributes; _dateTimeOffset << attributes; _relativeOffset << attributes; _nanValue << attributes; _updateType << attributes; } void AsciiSourceConfig::load(const QDomElement& e) { QDomNode n = e.firstChild(); while (!n.isNull()) { QDomElement elem = n.toElement(); if (!elem.isNull()) { if (elem.tagName() == "properties") { _fileNamePattern << elem; _indexVector << elem; _delimiters << elem; _indexInterpretation << elem; _columnType << elem; _columnDelimiter << elem; _columnWidth << elem; _dataLine << elem; _readFields << elem; _useDot << elem; _fieldsLine << elem; _columnWidthIsConst << elem; _readUnits << elem; _unitsLine << elem; _limitFileBuffer << elem; _limitFileBufferSize << elem; _useThreads << elem; _timeAsciiFormatString << elem; _dataRate << elem; _offsetDateTime << elem; _offsetFileDate << elem; _offsetRelative << elem; _dateTimeOffset << elem; _relativeOffset << elem; _nanValue << elem; _updateType << elem; } } n = n.nextSibling(); } } bool AsciiSourceConfig::operator==(const AsciiSourceConfig& rhs) const { return _fileNamePattern == rhs._fileNamePattern && _indexVector == rhs._indexVector && _delimiters == rhs._delimiters && _indexInterpretation == rhs._indexInterpretation && _columnType == rhs._columnType && _columnDelimiter == rhs._columnDelimiter && _columnWidth == rhs._columnWidth && _dataLine == rhs._dataLine && _readFields == rhs._readFields && _useDot == rhs._useDot && _fieldsLine == rhs._fieldsLine && _columnWidthIsConst == rhs._columnWidthIsConst && _readUnits == rhs._readUnits && _unitsLine == rhs._unitsLine && _limitFileBuffer == rhs._limitFileBuffer && _limitFileBufferSize == rhs._limitFileBufferSize && _useThreads == rhs._useThreads && _timeAsciiFormatString == rhs._timeAsciiFormatString && _dataRate == rhs._dataRate && _offsetDateTime == rhs._offsetDateTime && _offsetFileDate == rhs._offsetFileDate && _offsetRelative == rhs._offsetRelative && _dateTimeOffset == rhs._dateTimeOffset && _relativeOffset == rhs._relativeOffset && _nanValue == rhs._nanValue && _updateType == rhs._updateType; } bool AsciiSourceConfig::operator!=(const AsciiSourceConfig& rhs) const { return !operator==(rhs); } bool AsciiSourceConfig::isUpdateNecessary(const AsciiSourceConfig& rhs) const { return _fileNamePattern != rhs._fileNamePattern || _indexVector != rhs._indexVector || _delimiters != rhs._delimiters || _indexInterpretation != rhs._indexInterpretation || _columnType != rhs._columnType || _columnDelimiter != rhs._columnDelimiter || _columnWidth != rhs._columnWidth || _dataLine != rhs._dataLine || _readFields != rhs._readFields || _useDot != rhs._useDot || _fieldsLine != rhs._fieldsLine || _columnWidthIsConst != rhs._columnWidthIsConst || _readUnits != rhs._readUnits || _unitsLine != rhs._unitsLine || _timeAsciiFormatString != rhs._timeAsciiFormatString || _dataRate != rhs._dataRate || _offsetDateTime != rhs._offsetDateTime || _offsetFileDate != rhs._offsetFileDate || _offsetRelative != rhs._offsetRelative || _dateTimeOffset != rhs._dateTimeOffset || _relativeOffset != rhs._relativeOffset || _nanValue != rhs._nanValue; } Kst-2.0.8/src/datasources/ascii/asciifilebuffer.cpp0000644000175000017500000002131412362701575021411 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2012 Peter Kümmel * * email : syntheticpp@gmx.net * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciifilebuffer.h" #include "debug.h" #include #include #include //------------------------------------------------------------------------------------------- extern int MB; extern size_t maxAllocate; //------------------------------------------------------------------------------------------- AsciiFileBuffer::AsciiFileBuffer() : _file(0), _begin(-1), _bytesRead(0) { } //------------------------------------------------------------------------------------------- AsciiFileBuffer::~AsciiFileBuffer() { clear(); } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::setFile(QFile* file) { delete _file; _file = file; } //------------------------------------------------------------------------------------------- bool AsciiFileBuffer::openFile(QFile &file) { // Don't use 'QIODevice::Text'! // Because CR LF line ending breaks row offset calculation return file.open(QIODevice::ReadOnly); } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::clear() { _fileData.clear(); _begin = -1; _bytesRead = 0; } //------------------------------------------------------------------------------------------- qint64 AsciiFileBuffer::findRowOfPosition(const AsciiFileBuffer::RowIndex& rowIndex, qint64 searchStart, qint64 pos) const { if (rowIndex.isEmpty() || pos < 0 || pos >= rowIndex[rowIndex.size() - 1] || // within the file searchStart > rowIndex.size()-1 || pos < rowIndex[searchStart]) //within the search region return -1; // get close with a binary search... const qint64 indexOfLastRow = rowIndex.size() - 2; qint64 i0 = searchStart; qint64 i1 = indexOfLastRow; qint64 im = (i0+i1)/2; while (i1 - i0 > 1L ) { if (pos < rowIndex[im]) { i1 = im; } else { i0 = im; } im = (i0+i1)/2; } // now find the exact row... (FIXME - could be cleaner!) im = qMax(im-4, searchStart); for (qint64 row = im; row <= indexOfLastRow; ++row) { if (pos < rowIndex[row]) { return row - 1; } } if (pos < rowIndex[indexOfLastRow + 1]) // length of file in the last element return indexOfLastRow; return -1; } //------------------------------------------------------------------------------------------- const QVector AsciiFileBuffer::splitFile(qint64 chunkSize, const RowIndex& rowIndex, qint64 start, qint64 bytesToRead) const { const qint64 end = start + bytesToRead; // position behind last valid seekable byte in file if (chunkSize <= 0 || rowIndex.isEmpty() || start >= end || start < 0 || bytesToRead <= 0 || start + bytesToRead > rowIndex[rowIndex.size() - 1]) return QVector(); qint64 nextRow = findRowOfPosition(rowIndex, 0, start); QVector chunks; chunks.reserve(bytesToRead / chunkSize); qint64 pos = start; qint64 rows = rowIndex.size(); while (pos < end) { // use for storing reading information only AsciiFileData chunk; // error if chunkSize is too small for one row if (nextRow + 1 < rows && rowIndex[nextRow + 1] - rowIndex[nextRow] > chunkSize) return QVector(); // read complete chunk or to end of file qint64 endRead = (pos + chunkSize < end ? pos + chunkSize : end); // adjust to row end: pos + chunkRead is in the middle of a row, find index of this row const qint64 rowBegin = nextRow; nextRow = findRowOfPosition(rowIndex, nextRow, endRead - 1); if (nextRow == -1 || nextRow >= rows) return QVector(); // read until the beginning of the found row if (nextRow == rows - 2) { // last valid row // if exactly at the end of the row, read this row if (endRead == rowIndex[rows - 1]) { nextRow++; endRead = end; } else { // find complete last row next time endRead = end - 1; } } else { // if exactly at the end of the row, read this row if (endRead == rowIndex[nextRow + 1]) nextRow++; endRead = rowIndex[nextRow]; } // set information about positions in the file chunk.setBegin(rowIndex[rowBegin]); chunk.setBytesRead(rowIndex[nextRow] - rowIndex[rowBegin]); // set information about rows chunk.setRowBegin(rowBegin); chunk.setRowsRead(nextRow - rowBegin); chunks << chunk; pos = rowIndex[nextRow]; } //qDebug() << "File split into " << chunks.size() << " chunks:"; AsciiFileData::logData(chunks); return chunks; } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::useOneWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, int numChunks) { useSlidingWindowWithChunks(rowIndex, start, bytesToRead, bytesToRead, numChunks, false); } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::useSlidingWindow(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize) { useSlidingWindowWithChunks(rowIndex, start, bytesToRead, windowSize, 1, true); } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::useSlidingWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize, int numWindowChunks) { useSlidingWindowWithChunks(rowIndex, start, bytesToRead, windowSize, numWindowChunks, true); } //------------------------------------------------------------------------------------------- void AsciiFileBuffer::useSlidingWindowWithChunks(const RowIndex& rowIndex, qint64 start, qint64 bytesToRead, qint64 windowSize, int numWindowChunks, bool reread) { clear(); if (!_file) return; if (bytesToRead <= 0 || numWindowChunks <= 0 || windowSize <= 0) return; qint64 chunkSize = windowSize / numWindowChunks; QVector chunks = splitFile(chunkSize, rowIndex, start, bytesToRead); // chunks.size() could be greater than numWindowChunks! // no sliding window if (bytesToRead == windowSize) { for (int i = 0; i < chunks.size(); i++) { chunks[i].setFile(_file); chunks[i].setReread(reread); _bytesRead += chunks[i].bytesRead(); } _fileData.push_back(chunks); } else { // sliding window // prepare window with numSubChunks chunks QVector window; window.reserve(numWindowChunks); for (int i = 0; i < numWindowChunks; i++) { AsciiFileData sharedArray; if (!sharedArray.resize(chunkSize)) { Kst::Debug::self()->log(QString("AsciiFileBuffer: not enough memory available for sliding window")); return; } sharedArray.setFile(_file); window.push_back(sharedArray); } _fileData.reserve(bytesToRead / windowSize); int i = 0; while (i < chunks.size()) { QVector windowChunks; windowChunks.reserve(window.size()); for (int s = 0; s < window.size(); s++) { AsciiFileData chunk = chunks[i]; chunk.setSharedArray(window[s]); chunk.setFile(_file); chunk.setReread(reread); _bytesRead += chunk.bytesRead(); windowChunks.push_back(chunk); i++; if (i >= chunks.size()) break; } // each entry is one slide of the window _fileData.push_back(windowChunks); //qDebug() << "Window chunks:"; AsciiFileData::logData(windowChunks); } } _begin = start; if (_bytesRead != bytesToRead) { clear(); Kst::Debug::self()->log(QString("AsciiFileBuffer: error while splitting into file %1 chunks").arg(_fileData.size())); } } //------------------------------------------------------------------------------------------- bool AsciiFileBuffer::readWindow(QVector& window) const { for (int i = 0; i < window.size(); i++) { if (!window[i].read()) { return false; } } return true; } Kst-2.0.8/src/datasources/ascii/asciisourceconfig.h0000644000175000017500000001410612277111530021423 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_ASCII_SOURCE_CONFIG_H #define KST_ASCII_SOURCE_CONFIG_H #include "namedparameter.h" #include #include class AsciiSourceConfig { // TODO translate keys? static const char Key_fileNamePattern[]; static const char Tag_fileNamePattern[]; static const char Key_delimiters[]; static const char Tag_delimiters[]; static const char Key_indexVector[]; static const char Tag_indexVector[]; static const char Key_indexInterpretation[]; static const char Tag_indexInterpretation[]; static const char Key_timeAsciiFormatString[]; static const char Tag_timeAsciiFormatString[]; static const char Key_columnType[]; static const char Tag_columnType[]; static const char Key_columnDelimiter[]; static const char Tag_columnDelimiter[]; static const char Key_columnWidth[]; static const char Tag_columnWidth[]; static const char Key_columnWidthIsConst[]; static const char Tag_columnWidthIsConst[]; static const char Key_dataLine[]; static const char Tag_dataLine[]; static const char Key_readFields[]; static const char Tag_readFields[]; static const char Key_readUnits[]; static const char Tag_readUnits[]; static const char Key_useDot[]; static const char Tag_useDot[]; static const char Key_fieldsLine[]; static const char Tag_fieldsLine[]; static const char Key_unitsLine[]; static const char Tag_unitsLine[]; static const char Key_limitFileBuffer[]; static const char Tag_limitFileBuffer[]; static const char Key_limitFileBufferSize[]; static const char Tag_limitFileBufferSize[]; static const char Key_useThreads[]; static const char Tag_useThreads[]; static const char Key_dataRate[]; static const char Tag_dataRate[]; static const char Key_offsetDateTime[]; static const char Tag_offsetDateTime[]; static const char Key_offsetFileDate[]; static const char Tag_offsetFileDate[]; static const char Key_offsetRelative[]; static const char Tag_offsetRelative[]; static const char Key_dateTimeOffset[]; static const char Tag_dateTimeOffset[]; static const char Key_relativeOffset[]; static const char Tag_relativeOffset[]; static const char Key_nanValue[]; static const char Tag_nanValue[]; static const char Key_updateType[]; static const char Tag_updateType[]; public: AsciiSourceConfig(); bool operator==(const AsciiSourceConfig&) const; bool operator!=(const AsciiSourceConfig& rhs) const; bool isUpdateNecessary(const AsciiSourceConfig& rhs) const; void saveDefault(QSettings& cfg) const; void saveGroup(QSettings& cfg, const QString& fileName) const; const AsciiSourceConfig& readGroup(QSettings& cfg, const QString& fileName = QString()); void save(QXmlStreamWriter& s); void parseProperties(QXmlStreamAttributes &properties); void load(const QDomElement& e); enum Interpretation { Unknown = 0, NoInterpretation, CTime, Seconds, FormattedTime, FixedRate, IntEnd = 0xffff }; enum ColumnType { Whitespace = 0, Fixed, Custom, ColEnd = 0xffff }; NamedParameter _delimiters; NamedParameter _indexVector; NamedParameter _indexInterpretation; NamedParameter _timeAsciiFormatString; NamedParameter _fileNamePattern; NamedParameter _columnType; NamedParameter _columnDelimiter; NamedParameter _columnWidth; NamedParameter _columnWidthIsConst; NamedParameter _dataLine; NamedParameter _readFields; NamedParameter _readUnits; NamedParameter _fieldsLine; NamedParameter _unitsLine; NamedParameter _useDot; NamedParameter _limitFileBuffer; NamedParameter _limitFileBufferSize; NamedParameter _useThreads; NamedParameter _dataRate; NamedParameter _offsetDateTime; NamedParameter _offsetFileDate; NamedParameter _offsetRelative; NamedParameter _dateTimeOffset; NamedParameter _relativeOffset; NamedParameter _nanValue; NamedParameter _updateType; private: void save(QSettings& cfg) const; void read(QSettings& cfg); }; Q_DECLARE_METATYPE(AsciiSourceConfig::Interpretation) Q_DECLARE_METATYPE(AsciiSourceConfig::ColumnType) #endif Kst-2.0.8/src/datasources/ascii/asciifiledata.cpp0000644000175000017500000001543412277111530021046 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2012 Peter Kümmel * * email : syntheticpp@gmx.net * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciifiledata.h" #ifndef QT5 // needed to track memeory usage #include "qplatformdefs.h" #include void* fileBufferMalloc(size_t bytes); void fileBufferFree(void* ptr); #define malloc fileBufferMalloc #define qMalloc fileBufferMalloc #define free fileBufferFree #define qFree fileBufferFree #include #undef malloc #undef qMalloc #undef free #undef qFree #endif #include "debug.h" #include #include #include int MB = 1024*1024; // Simulate out of memory scenario //#define KST_TEST_OOM #ifdef KST_TEST_OOM size_t maxAllocate = 1 * MB; #else size_t maxAllocate = (size_t) -1; #endif #define KST_MEMORY_DEBUG if(0) //------------------------------------------------------------------------------------------- static QMap allocatedMBs; //------------------------------------------------------------------------------------------- static void logMemoryUsed() { size_t sum = 0; QMapIterator it(allocatedMBs); while (it.hasNext()) { it.next(); sum += it.value(); } if(sum / MB != 0) Kst::Debug::self()->log(QString("AsciiFileData: %1 MB used").arg(sum / MB), Kst::Debug::Warning); KST_MEMORY_DEBUG if(sum / MB != 0) qDebug() << "AsciiFileData: " << sum / MB<< "MB used"; } //------------------------------------------------------------------------------------------- void* fileBufferMalloc(size_t bytes) { void* ptr = 0; #ifdef KST_TEST_OOM if (bytes <= maxAllocate) #endif ptr = malloc(bytes); if (ptr) { allocatedMBs[ptr] = bytes; KST_MEMORY_DEBUG if(bytes / MB != 0) qDebug() << "AsciiFileBuffer: " << bytes / MB << "MB allocated"; KST_MEMORY_DEBUG if(bytes / MB != 0) logMemoryUsed(); } else { Kst::Debug::self()->log(QString("AsciiFileData: failed to allocate %1 MBs").arg(bytes / MB), Kst::Debug::Warning); logMemoryUsed(); KST_MEMORY_DEBUG qDebug() << "AsciiFileData: error when allocating " << bytes / MB << "MB"; } return ptr; } //------------------------------------------------------------------------------------------- void fileBufferFree(void* ptr) { if (allocatedMBs.contains(ptr)) { KST_MEMORY_DEBUG if(allocatedMBs[ptr] / MB != 0) qDebug() << "AsciiFileData: " << allocatedMBs[ptr] / MB << "MB freed"; allocatedMBs.remove(ptr); } KST_MEMORY_DEBUG logMemoryUsed(); free(ptr); } //------------------------------------------------------------------------------------------- AsciiFileData::AsciiFileData() : _array(new Array), _file(0), _fileRead(false), _reread(false), _begin(-1), _bytesRead(0), _rowBegin(-1), _rowsRead(0) { } //------------------------------------------------------------------------------------------- AsciiFileData::~AsciiFileData() { } //------------------------------------------------------------------------------------------- char* AsciiFileData::data() { return _array->data(); } //------------------------------------------------------------------------------------------- const char* const AsciiFileData::constPointer() const { return _array->data(); } const AsciiFileData::Array& AsciiFileData::constArray() const { return *_array; } //------------------------------------------------------------------------------------------- bool AsciiFileData::resize(qint64 bytes) { try { _array->resize(bytes); } catch (const std::bad_alloc&) { // work around Qt bug: Qt4 does not release the heap allocated memory clear(true); return false; } return true; } //------------------------------------------------------------------------------------------- void AsciiFileData::clear(bool forceDeletingArray) { // force deletion of heap allocated memory if any if (forceDeletingArray || _array->capacity() > Prealloc) { _array = QSharedPointer(new Array); } _begin = -1; _bytesRead = 0; _fileRead = false; } //------------------------------------------------------------------------------------------- qint64 AsciiFileData::read(QFile& file, qint64 start, qint64 bytesToRead, qint64 maximalBytes) { _begin = -1; _bytesRead = 0; if (bytesToRead <= 0 || start < 0) return 0; if (maximalBytes == -1) { if (!resize(bytesToRead + 1)) return 0; } else { bytesToRead = qMin(bytesToRead, maximalBytes); if (!resize(bytesToRead + 1)) return 0; } if (!file.seek(start)) // expensive? return 0; qint64 bytesRead = file.read(_array->data(), bytesToRead); if (!resize(bytesRead + 1)) return 0; _array->data()[bytesRead] = '\0'; _begin = start; _bytesRead = bytesRead; return bytesRead; } //------------------------------------------------------------------------------------------- bool AsciiFileData::read() { if (_fileRead && !_reread) { return true; } if (!_file || _file->openMode() != QIODevice::ReadOnly) { return false; } qint64 start = _begin; qint64 bytesToRead = _bytesRead; read(*_file, start, bytesToRead); if (begin() != start || bytesRead() != bytesToRead) { clear(true); return false; } _fileRead = true; return true; } //------------------------------------------------------------------------------------------- void AsciiFileData::logData() const { QString this_str; QString data_str; this_str.sprintf("%p", this); data_str.sprintf("%p", _array.data()); qDebug() << QString("AsciiFileData %1, array %2, byte %3 ... %4 (%8), row %5 ... %6 (%9), lazy: %7") .arg(this_str) .arg(data_str) .arg(begin(), 8).arg(begin() + bytesRead(), 8) .arg(rowBegin(), 8).arg(rowBegin() + rowsRead(), 8) .arg(_reread).arg(bytesRead(), 8).arg(rowsRead(), 8); } //------------------------------------------------------------------------------------------- void AsciiFileData::logData(const QVector& chunks) { foreach (const AsciiFileData& chunk, chunks) { chunk.logData(); } } //------------------------------------------------------------------------------------------- void AsciiFileData::setSharedArray(AsciiFileData& arrayData) { _array = arrayData._array; } Kst-2.0.8/src/datasources/ascii/asciidatareader.h0000644000175000017500000000770112277111530021034 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_DATA_READER_H #define ASCII_DATA_READER_H #include "asciifilebuffer.h" #include "asciicharactertraits.h" #include #include class QFile; class LexicalCast; class AsciiSourceConfig; class AsciiDataReader { public: explicit AsciiDataReader(AsciiSourceConfig& config); ~AsciiDataReader(); void clear(); void setRow0Begin(qint64 begin); inline qint64 beginOfRow(qint64 row) const { return _rowIndex[row]; } inline qint64 numberOfFrames() const { return _numFrames; } // where const AsciiFileBuffer::RowIndex& rowIndex() const { return _rowIndex; } void detectLineEndingType(QFile& file); bool findAllDataRows(bool read_completely, QFile* file, qint64 _byteLength, int col_count); int readField(const AsciiFileData &buf, int col, double *v, const QString& field, int start, int n); int readFieldFromChunk(const AsciiFileData& chunk, int col, double *v, int start, const QString& field); template static int splitColumns(const QByteArray& line, const ColumnDelimiter& column_del, QStringList* cols = 0); double progressValue(); qint64 progressRows(); private: QMutex _progressMutex; double _progressValue; qint64 _progressRows; qint64 _numFrames; qint64 _progressMax; qint64 _progressDone; AsciiFileBuffer::RowIndex _rowIndex; AsciiSourceConfig& _config; AsciiCharacterTraits::LineEndingType _lineending; const AsciiCharacterTraits::IsDigit isDigit; const AsciiCharacterTraits::IsWhiteSpace isWhiteSpace; template bool resizeBuffer(T& buffer, qint64 bytes); template int readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const AsciiCharacterTraits::LineEndingType&, const ColumnDelimiter&) const; template int readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const AsciiCharacterTraits::LineEndingType&, const ColumnDelimiter&, const CommentDelimiter&) const; template int readColumns(double* v, const Buffer& buffer, qint64 bufstart, qint64 bufread, int col, int s, int n, const IsLineBreak&, const ColumnDelimiter&, const CommentDelimiter&, const ColumnWidthsAreConst&) const; template bool findDataRows(const Buffer& buffer, qint64 bufstart, qint64 bufread, const IsLineBreak&, const CommentDelimiter&, int col_count); void toDouble(const LexicalCast& lexc, const char* buffer, qint64 bufread, qint64 ch, double* v, int row) const; mutable QMutex _localeMutex; }; template<> int AsciiDataReader::splitColumns(const QByteArray& line, const AsciiCharacterTraits::IsWhiteSpace& column_del, QStringList* cols); #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciiconfig.ui0000644000175000017500000010731512320547027020400 0ustar synthsynth AsciiConfig 0 0 739 524 1280 1024 4 0 0 0 0 Apply these settings as default Qt::Horizontal 40 20 Preview First 1000 Lines in New Window First lines 0 0 640 100 [Preview] Qt::Horizontal Header 3 3 0 Data starts at line: false _startLine 2 0 1 9999999 1 Read field names from line: false 2 0 1 9999999 1 false Read units from line: false 2 0 1 9999999 1 Comment indicators: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _delimiters You can use more than one symbol here, like "#!C" for instance, but it will slow down reading ASCII files Decimal Separator: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Dot false Comma true Qt::Horizontal 40 20 Qt::Vertical 20 40 Data Column Layout 3 0 0 Space/tab delimited true 0 0 Custom delimiter false 0 0 40 16777215 Qt::Horizontal 40 20 0 0 Reading is faster if each column can be assumed to have its own constant width. Each column has its own constant width 0 0 Fixed Width false 0 0 1 16 Qt::Horizontal 40 20 Qt::Vertical 20 40 0 0 General Options 3 Limit Buffer Size: false MB 0 16000 100 100 Use threads 0 0 Always accept files matching: false Interpret empty value as: Qt::Horizontal 13 16 Zero true NaN false Previous value false Qt::Vertical 20 40 Qt::Horizontal 40 20 Date/Time Interpretation true false Value 3 Interpret field 1 0 as: false Qt::Horizontal 40 20 C Time true Seconds Qt::Horizontal 40 20 Index with frequency false Hz 6 10000000.000000000000000 1.000000000000000 1000.000000000000000 0 0 Formatted String. Format: false 200 0 Refer to the documentation of QDateTime for details.<br>You can use a combination of y,M,d for dates and h,m,s,z for times (z for milliseconds).<br>Space is allowed between date and time columns, but you must select the first column as X vector. hh:mm:ss.zzz Qt::Horizontal 40 20 0 0 d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond Qt::Vertical 20 40 Offset Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 3 0 0 Date/Time: false 8 0 0 2000 1 1 2000 1 1 dd/MM/yyyy HH:mm:ss.zzz true Qt::UTC File date false Relative false 0 0 Seconds Qt::Horizontal 40 20 Qt::Vertical 20 30 Qt::Horizontal 40 20 _fixed toggled(bool) _columnWidth setEnabled(bool) 407 348 455 349 _readFields toggled(bool) _fieldsLine setEnabled(bool) 107 274 300 277 _readUnits toggled(bool) _unitsLine setEnabled(bool) 141 300 300 303 _custom toggled(bool) _columnDelimiter setEnabled(bool) 429 277 562 278 _readFields toggled(bool) _readUnits setEnabled(bool) 136 274 141 300 _offsetDateTime toggled(bool) _dateTimeOffset setEnabled(bool) 567 442 895 441 _offsetRelative toggled(bool) _relativeOffset setEnabled(bool) 553 493 608 495 _offsetRelative toggled(bool) label_5 setEnabled(bool) 553 493 654 491 _limitFileBuffer toggled(bool) _limitFileBufferSize setEnabled(bool) 762 250 899 252 _interpret toggled(bool) groupBox setChecked(bool) 405 391 383 418 _indexFreq toggled(bool) _dataRate setEnabled(bool) 262 451 382 453 _formattedString toggled(bool) _timeAsciiFormatString setEnabled(bool) 87 480 403 482 _readFields toggled(bool) _unitsLine setEnabled(bool) 56 263 200 289 interpretationChanged() Kst-2.0.8/src/datasources/ascii/asciisource.cpp0000644000175000017500000006355712362702652020614 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciisource.h" #include "asciidatainterfaces.h" #include "curve.h" #include "colorsequence.h" #include "objectstore.h" #include "math_kst.h" #include "kst_atof.h" #include "measuretime.h" #include "debug.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace Kst; const int BIG_READ=100000; //------------------------------------------------------------------------------------------- struct ms : QThread { static void sleep(int t) { QThread::msleep(t); } }; //------------------------------------------------------------------------------------------- static const QString asciiTypeString = "ASCII file"; //------------------------------------------------------------------------------------------- const QString AsciiSource::asciiTypeKey() { return asciiTypeString; } //------------------------------------------------------------------------------------------- AsciiSource::AsciiSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _reader(_config), _fileBuffer(), _busy(false), _read_count_max(-1), _read_count(0), _showFieldProgress(false), is(new DataInterfaceAsciiString(*this)), iv(new DataInterfaceAsciiVector(*this)) { setInterface(is); setInterface(iv); reset(); _source = asciiTypeString; if (!type.isEmpty() && type != asciiTypeString) { return; } _config.readGroup(*cfg, filename); if (!e.isNull()) { _config.load(e); } // TODO only works for local files setUpdateType((UpdateCheckType)_config._updateType.value()); _valid = true; registerChange(); internalDataSourceUpdate(false); _progressTimer.restart(); } //------------------------------------------------------------------------------------------- AsciiSource::~AsciiSource() { } //------------------------------------------------------------------------------------------- void AsciiSource::reset() { // forget about cached data _fileBuffer.clear(); _reader.clear(); _haveWarned = false; _valid = false; _fileSize = 0; _haveHeader = false; _fieldListComplete = false; _fieldList.clear(); _fieldLookup.clear(); _scalarList.clear(); _strings.clear(); Object::reset(); _strings = fileMetas(); prepareRead(0); } //------------------------------------------------------------------------------------------- bool AsciiSource::initRowIndex() { _reader.clear(); _fileSize = 0; if (_config._dataLine > 0) { QFile file(_filename); if (!AsciiFileBuffer::openFile(file)) { return false; } qint64 header_row = 0; qint64 left = _config._dataLine; qint64 didRead = 0; while (left > 0) { QByteArray line = file.readLine(); if (line.isEmpty() || file.atEnd()) { return false; } didRead += line.size(); --left; if (header_row != _config._fieldsLine && header_row != _config._unitsLine) { _strings[QString("Header %1").arg(header_row, 2, 10, QChar('0'))] = QString::fromAscii(line).trimmed(); } header_row++; } _reader.setRow0Begin(didRead); } return true; } //------------------------------------------------------------------------------------------- void AsciiSource::updateLists() { _fieldList = fieldListFor(_filename, _config); QStringList units; if (_config._readUnits) { units += unitListFor(_filename, _config); for (int index = 0; index < _fieldList.size(); ++index) { if (index >= units.size()) { break; // Missing units => the user's fault, but at least don't crash } _fieldUnits[_fieldList[index]] = units[index]; } } _fieldListComplete = _fieldList.count() > 1; _fieldLookup.clear(); for (int i = 0; i < _fieldList.size(); i++) _fieldLookup[_fieldList[i]] = i; // Re-update the scalar list _scalarList = scalarListFor(_filename, _config); } //------------------------------------------------------------------------------------------- Kst::Object::UpdateType AsciiSource::internalDataSourceUpdate() { return internalDataSourceUpdate(true); } //------------------------------------------------------------------------------------------- Kst::Object::UpdateType AsciiSource::internalDataSourceUpdate(bool read_completely) { //MeasureTime t("AsciiSource::internalDataSourceUpdate: " + _filename); if (_busy) return NoChange; // forget about cached data _fileBuffer.clear(); if (!_haveHeader) { _haveHeader = initRowIndex(); if (!_haveHeader) { return NoChange; } } updateLists(); QFile file(_filename); if (!AsciiFileBuffer::openFile(file)) { // Qt: If the device is closed, the size returned will not reflect the actual size of the device. return NoChange; } bool force_update = true; if (_fileSize == file.size()) { force_update = false; } const qint64 oldFileSite = _fileSize; if (read_completely) { // Update _fileSize only when we read the file completely _fileSize = file.size(); } _fileCreationTime_t = QFileInfo(file).created().toTime_t(); int col_count = _fieldList.size() - 1; // minus INDEX bool new_data = false; // emit progress message if there are more than 100 MB to parse if (file.size() - oldFileSite > 100 * 1024 * 1024 && read_completely) { _showFieldProgress = true; emitProgress(1, tr("Parsing '%1' ...").arg(_filename)); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); QFuture future = QtConcurrent::run(&_reader, &AsciiDataReader::findAllDataRows, read_completely, &file, _fileSize, col_count); _busy = true; while (_busy) { if (future.isFinished()) { try { new_data = future; } catch ( const std::exception&) { // TODO out of memory? } _busy = false; emitProgress(50, tr("Finished parsing '%1'").arg(_filename)); } else { ms::sleep(500); emitProgress(1 + 99.0 * _reader.progressValue() / 100.0, tr("Parsing '%1': %2 rows").arg(_filename).arg(QString::number(_reader.progressRows()))); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } } } else { _showFieldProgress = false; new_data = _reader.findAllDataRows(read_completely, &file, _fileSize, col_count); } return (!new_data && !force_update ? NoChange : Updated); } //------------------------------------------------------------------------------------------- int AsciiSource::columnOfField(const QString& field) const { if (_fieldLookup.contains(field)) { return _fieldLookup[field]; } if (_fieldListComplete) { return -1; } bool ok = false; int col = field.toInt(&ok); if (ok) { return col; } return -1; } //------------------------------------------------------------------------------------------- bool AsciiSource::useSlidingWindow(qint64 bytesToRead) const { return _config._limitFileBuffer && _config._limitFileBufferSize < bytesToRead; } //------------------------------------------------------------------------------------------- int AsciiSource::readField(double *v, const QString& field, int s, int n) { _actualField = field; if (n>BIG_READ) { updateFieldMessage(tr("Reading field: ")); } // TODO multi threading problem: could trigger a dead-lock // FIXME: Debug::trace() here is a memory leak, which is serious for large quickly updating files. //Debug::trace(QString("AsciiSource::readField() %1 s=%2 n=%3").arg(field.leftJustified(15)).arg(QString("%1").arg(s, 10)).arg(n)); int read = tryReadField(v, field, s, n); if (isTime(field)) { if (_config._indexInterpretation == AsciiSourceConfig::FixedRate ) { double rate = _config._dataRate.value(); if (rate>0) { rate = 1.0/rate; } else { rate = 1.0; } for (int i=0; i 0) { if (!_haveWarned) QMessageBox::warning(0, "Error while reading ASCII file", msg.arg("The file was read only partially")); _haveWarned = true; return read; } else if (read == 0) { if (!_haveWarned) { // TODO Why is nothing read? Only log once because of the danger of a dead-lock Debug::warning("AsciiSource: 0 bytes read from file"); } _haveWarned = true; } else if (read == -3) { if (!_haveWarned) QMessageBox::warning(0, "Error while reading ASCII file", "The file could not be opened for reading"); _haveWarned = true; } emitProgress(100, QString()); return 0; } //------------------------------------------------------------------------------------------- bool AsciiSource::useThreads() const { // only use threads for files > 1 MB return _config._useThreads && _fileSize > 1 * 1024 * 1024; } //------------------------------------------------------------------------------------------- void AsciiSource::prepareRead(int count) { _read_count_max = count; _read_count = 0; _progress = 0; _progressSteps = 0; } //------------------------------------------------------------------------------------------- void AsciiSource::readingDone() { // clear emit progress(100, ""); } //------------------------------------------------------------------------------------------- int AsciiSource::tryReadField(double *v, const QString& field, int s, int n) { if (n < 0) { n = 1; /* n < 0 means read one sample, not frame - irrelevent here */ } if (field == "INDEX") { for (int i = 0; i < n; i++) { v[i] = double(s + i); } if (n>BIG_READ) { updateFieldMessage(tr("INDEX created")); } return n; } int col = columnOfField(field); if (col == -1) { _read_count_max = -1; return -2; } // check if the already in buffer const qint64 begin = _reader.beginOfRow(s); const qint64 bytesToRead = _reader.beginOfRow(s + n) - begin; if ((begin != _fileBuffer.begin()) || (bytesToRead != _fileBuffer.bytesRead())) { QFile* file = new QFile(_filename); if (!AsciiFileBuffer::openFile(*file)) { delete file; _read_count_max = -1; return -3; } // prepare file buffer _fileBuffer.setFile(file); int numThreads; if (!useThreads()) { numThreads = 1; } else { numThreads = QThread::idealThreadCount(); numThreads = (numThreads > 0) ? numThreads : 1; } if (useSlidingWindow(bytesToRead)) { if (useThreads()) { _fileBuffer.useSlidingWindowWithChunks(_reader.rowIndex(), begin, bytesToRead, _config._limitFileBufferSize, numThreads); } else { _fileBuffer.useSlidingWindow(_reader.rowIndex(), begin, bytesToRead, _config._limitFileBufferSize); } } else { _fileBuffer.useOneWindowWithChunks(_reader.rowIndex(), begin, bytesToRead, numThreads); } if (_fileBuffer.bytesRead() == 0) { _fileBuffer.clear(); _read_count_max = -1; return 0; } _reader.detectLineEndingType(*file); } // now start reading LexicalCast::NaNMode nanMode; switch (_config._nanValue.value()) { case 0: nanMode = LexicalCast::NullValue; break; case 1: nanMode = LexicalCast::NaNValue; break; case 2: nanMode = LexicalCast::PreviousValue; break; default:nanMode = LexicalCast::NullValue; break; } LexicalCast::AutoReset useDot(_config._useDot, nanMode); if (field == _config._indexVector && _config._indexInterpretation == AsciiSourceConfig::FormattedTime) { LexicalCast::instance().setTimeFormat(_config._timeAsciiFormatString); } QVector >& slidingWindow = _fileBuffer.fileData(); int sampleRead = 0; _progressSteps = 0; for (int i = 0; i < slidingWindow.size(); i++) { _progressSteps += slidingWindow[i].size() * 2; } if (_read_count_max == -1) { _progress = 0; } else { _progressSteps *= _read_count_max; } for (int i = 0; i < slidingWindow.size(); i++) { int read; if (useThreads()) read = parseWindowMultithreaded(slidingWindow[i], col, v, s, field); else read = parseWindowSinglethreaded(slidingWindow[i], col, v, s, field, sampleRead); // something went wrong abort reading if (read == 0) { break; } sampleRead += read; } if (useSlidingWindow(bytesToRead)) { // only buffering the complete file makes sense _fileBuffer.clear(); } if (n>BIG_READ) { updateFieldMessage(tr("Finished reading: ")); } _read_count++; if (_read_count_max == _read_count) _read_count_max = -1; return sampleRead; } //------------------------------------------------------------------------------------------- int AsciiSource::parseWindowSinglethreaded(QVector& window, int col, double* v, int start, const QString& field, int sRead) { int read = 0; for (int i = 0; i < window.size(); i++) { Q_ASSERT(sRead + start == window[i].rowBegin()); if (!window[i].read() || window[i].bytesRead() == 0) return 0; _progress++; read += _reader.readFieldFromChunk(window[i], col, v, start, field); _progress += window.size(); } return read; } //------------------------------------------------------------------------------------------- int AsciiSource::parseWindowMultithreaded(QVector& window, int col, double* v, int start, const QString& field) { updateFieldProgress(tr("reading ...")); for (int i = 0; i < window.size(); i++) { if (!window[i].read()) { return 0; } _progress++; updateFieldProgress(tr("reading ...")); } updateFieldProgress(tr("parsing ...")); QFutureSynchronizer readFutures; foreach (const AsciiFileData& chunk, window) { QFuture future = QtConcurrent::run(&_reader, &AsciiDataReader::readFieldFromChunk, chunk, col, v, start, field); readFutures.addFuture(future); } readFutures.waitForFinished(); _progress += window.size(); updateFieldProgress(tr("parsing ...")); int sampleRead = 0; foreach (const QFuture future, readFutures.futures()) { sampleRead += future.result(); } return sampleRead; } //------------------------------------------------------------------------------------------- void AsciiSource::emitProgress(int percent, const QString& message) { if (_progressTimer.elapsed() < 500) { // don't flood the gui with progress messages return; } emit progress(percent, message); _progressTimer.restart(); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } //------------------------------------------------------------------------------------------- void AsciiSource::updateFieldMessage(const QString& message) { // hide progress bar emitProgress(100, message + _actualField); } //------------------------------------------------------------------------------------------- void AsciiSource::updateFieldProgress(const QString& message) { if (_read_count_max == 0) { //emitProgress(-1, ""); // indicate "busy" FIXME: commented out because it doesn't go away. } else { if (_progressSteps != 0 && _read_count_max != -1) { emitProgress(50 + 50 * _progress / _progressSteps, _actualField + ": " + message); } } } //------------------------------------------------------------------------------------------- QString AsciiSource::fileType() const { return asciiTypeString; } //------------------------------------------------------------------------------------------- void AsciiSource::setUpdateType(UpdateCheckType updateType) { if (_config._updateType != updateType) { //Q_ASSERT(AsciiSourceConfig().readGroup(*_cfg, _filename) == _config); _config._updateType = updateType; _config.saveGroup(*_cfg, _filename); } DataSource::setUpdateType(updateType); } //------------------------------------------------------------------------------------------- bool AsciiSource::isEmpty() const { return _reader.numberOfFrames() < 1; } //------------------------------------------------------------------------------------------- QStringList AsciiSource::scalarListFor(const QString& filename, AsciiSourceConfig) { QFile file(filename); if (!AsciiFileBuffer::openFile(file)) { return QStringList(); } return QStringList() << "FRAMES"; } //------------------------------------------------------------------------------------------- QStringList AsciiSource::stringListFor(const QString& filename, AsciiSourceConfig) { QFile file(filename); if (!AsciiFileBuffer::openFile(file)) { return QStringList(); } return QStringList() << "FILE"; } //------------------------------------------------------------------------------------------- int AsciiSource::splitHeaderLine(const QByteArray& line, const AsciiSourceConfig& cfg, QStringList* stringList) { QStringList dummy; QStringList& parts(stringList ? *stringList : dummy); parts.clear(); const QRegExp regexColumnDelimiter(QString("[%1]").arg(QRegExp::escape(cfg._columnDelimiter.value()))); if (cfg._columnType == AsciiSourceConfig::Custom && !cfg._columnDelimiter.value().isEmpty()) { parts += QString(line).trimmed().split(regexColumnDelimiter, QString::SkipEmptyParts); } else if (cfg._columnType == AsciiSourceConfig::Fixed) { int cnt = line.length() / cfg._columnWidth; for (int i = 0; i < cnt; ++i) { QString sub = line.mid(i * cfg._columnWidth).left(cfg._columnWidth); parts += sub.trimmed(); } } else { if (!stringList) { //MeasureTime t("AsciiDataReader::countColumns()"); int columns = AsciiDataReader::splitColumns(line, AsciiCharacterTraits::IsWhiteSpace()); // The following assert crashes (sometimes?) when kst is pointed at an // executable. So... rather than crashing, lets just bail. if (columns != QString(line).trimmed().split(QRegExp("\\s"), QString::SkipEmptyParts).size()) { return 0; } Q_ASSERT(columns == QString(line).trimmed().split(QRegExp("\\s"), QString::SkipEmptyParts).size()); return columns; } else { //MeasureTime t("AsciiDataReader::countColumns(parts)"); AsciiDataReader::splitColumns(line, AsciiCharacterTraits::IsWhiteSpace(), &parts); Q_ASSERT(parts == QString(line).trimmed().split(QRegExp("\\s"), QString::SkipEmptyParts)); } } return parts.count(); } //------------------------------------------------------------------------------------------- QStringList AsciiSource::fieldListFor(const QString& filename, AsciiSourceConfig cfg) { QFile file(filename); if (!AsciiFileBuffer::openFile(file)) { return QStringList(); } QStringList fields; fields += "INDEX"; if (cfg._readFields) { int fieldsLine = cfg._fieldsLine; int currentLine = 0; // Explicit line counter, to make the code easier to understand while (currentLine < cfg._dataLine) { const QByteArray line = file.readLine(); int r = line.size(); if (currentLine == fieldsLine && r >= 0) { QStringList parts; AsciiSource::splitHeaderLine(line, cfg, &parts); fields += parts; break; } currentLine++; } QStringList trimmed; foreach(const QString& str, fields) { trimmed << str.trimmed(); } return trimmed; } QRegExp regex; if (cfg._columnType == AsciiSourceConfig::Custom && !cfg._columnDelimiter.value().isEmpty()) { regex.setPattern(QString("^[%1]*[%2].*").arg(QRegExp::escape(cfg._columnDelimiter.value())).arg(cfg._delimiters)); } else { regex.setPattern(QString("^\\s*[%1].*").arg(cfg._delimiters)); } bool done = false; int skip = cfg._dataLine; //FIXME This is a hack which should eventually be fixed by specifying // the starting frame of the data when calling KstDataSource::fieldListForSource // and KstDataSource::fieldList. If the skip value is not specified, then // we scan a few lines and take the maximum number of fields that we find. int maxcnt; if (skip > 0) { maxcnt = -1; } else { maxcnt = 0; } int cnt; int nextscan = 0; int curscan = 0; while (!file.atEnd() && !done && (nextscan < 200)) { QByteArray line = file.readLine(); int r = line.size(); if (skip > 0) { //keep skipping until desired line --skip; if (r < 0) { return fields; } continue; } if (maxcnt >= 0) { //original skip value == 0, so scan some lines if (curscan >= nextscan) { if (r > 1 && !regex.exactMatch(line)) { cnt = splitHeaderLine(line, cfg); if (cnt > maxcnt) { maxcnt = cnt; } } else if (r < 0) { return fields; } nextscan += nextscan + 1; } curscan++; continue; } if (r > 1 && !regex.exactMatch(line)) { //at desired line, find count maxcnt = splitHeaderLine(line, cfg); done = true; } else if (r < 0) { return fields; } } for (int i = 1; i <= maxcnt; ++i) { fields += tr("Column %1").arg(i).trimmed(); } return fields; } //------------------------------------------------------------------------------------------- QStringList AsciiSource::unitListFor(const QString& filename, AsciiSourceConfig cfg) { QFile file(filename); if (!AsciiFileBuffer::openFile(file)) { return QStringList(); } QStringList units; units += ""; // To go with INDEX int unitsLine = cfg._unitsLine; int currentLine = 0; while (currentLine < cfg._dataLine) { const QByteArray line = file.readLine(); int r = line.size(); if (currentLine == unitsLine && r >= 0) { QStringList parts; AsciiSource::splitHeaderLine(line, cfg, &parts); units += parts; break; } currentLine++; } QStringList trimmed; foreach(const QString& str, units) { trimmed << str.trimmed(); } return trimmed; } //------------------------------------------------------------------------------------------- void AsciiSource::save(QXmlStreamWriter &s) { Kst::DataSource::save(s); _config.save(s); } //------------------------------------------------------------------------------------------- void AsciiSource::parseProperties(QXmlStreamAttributes &properties) { _config.parseProperties(properties); reset(); internalDataSourceUpdate(); } //------------------------------------------------------------------------------------------- bool AsciiSource::supportsTimeConversions() const { return false; //fieldList().contains(_config._indexVector) && _config._indexInterpretation != AsciiSourceConfig::Unknown && _config._indexInterpretation != AsciiSourceConfig::INDEX; } //------------------------------------------------------------------------------------------- int AsciiSource::sampleForTime(double ms, bool *ok) { switch (_config._indexInterpretation) { case AsciiSourceConfig::Seconds: // FIXME: make sure "seconds" exists in _indexVector if (ok) { *ok = true; } return 0; case AsciiSourceConfig::CTime: // FIXME: make sure "seconds" exists in _indexVector (different than above?) if (ok) { *ok = true; } return 0; default: return Kst::DataSource::sampleForTime(ms, ok); } } //------------------------------------------------------------------------------------------- const QString& AsciiSource::typeString() const { return asciiTypeString; } //------------------------------------------------------------------------------------------- int AsciiSource::sampleForTime(const QDateTime& time, bool *ok) { switch (_config._indexInterpretation) { case AsciiSourceConfig::Seconds: // FIXME: make sure "time" exists in _indexVector if (ok) { *ok = true; } return time.toTime_t(); case AsciiSourceConfig::CTime: // FIXME: make sure "time" exists in _indexVector (different than above?) if (ok) { *ok = true; } return time.toTime_t(); default: return Kst::DataSource::sampleForTime(time, ok); } } //------------------------------------------------------------------------------------------- bool AsciiSource::isTime(const QString &field) const { return (_config._indexInterpretation.value() != AsciiSourceConfig::NoInterpretation) && (field == _config._indexVector); } //------------------------------------------------------------------------------------------- QString AsciiSource::timeFormat() const { if (_config._indexInterpretation.value() != AsciiSourceConfig::FormattedTime) { return QString(""); } else { return _config._timeAsciiFormatString; } } //------------------------------------------------------------------------------------------- Kst::ObjectList AsciiSource::autoCurves(ObjectStore& objectStore) { // here we could do more sophisticated stuff when generating a list of curves return ObjectList(); } // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/kstdata_ascii.desktop0000644000175000017500000000350412362705136021757 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=ascii X-Kst-Plugin-Author=The University of Toronto Name=ASCII File Reader Name[ca]=Lector de fitxers ASCII Name[ca@valencia]=Lector de fitxers ASCII Name[de]=ASCII-Dateileser Name[es]=Lector de archivos ASCII Name[fr]=Lecteur de fichier ASCII Name[hu]=ASCII fájlolvasó Name[it]=Lettore di file ASCII Name[nb]=ASCI filleser Name[nl]=ASCII File Reader Name[pl]=Czytnik plików ASCII Name[pt]=Leitor de Ficheiros ASCII Name[pt_BR]=Leitor de arquivos ASCII Name[sk]=Čítač ASCII súborov Name[sv]=ASCII-filläsare Name[uk]=Засіб читання файлів ASCII Name[x-test]=xxASCII File Readerxx Comment=Implements support for reading ASCII files into Kst. Comment[ca]=Implementació que permet llegir fitxers ASCII en el Kst. Comment[ca@valencia]=Implementació que permet llegir fitxers ASCII en el Kst. Comment[de]=Unterstützung für das Einlesen von ASCII-Dateien in Kst Comment[es]=Implementa la lectura de archivos ASCII en Kst. Comment[fr]=Implémente la prise en charge de la lecture de fichiers ASCII dans Kst. Comment[hu]=Támogatást valósít meg az ASCII fájlok olvasásához a Kst-be. Comment[it]=Implementa il supporto per la lettura di file ASCII con Kst. Comment[nb]=Legger til støtte for å lese ASCII-filer i Kst. Comment[nl]=Implementeert ondersteuning voor het lezen van ASCII-bestanden in Kst. Comment[pl]=Implementuj obsługę odczytu plików ASCII w Kst. Comment[pt]=Implementa o suporte para ler ficheiros ASCII para o Kst. Comment[pt_BR]=Implementa o suporte para leitura de arquivos ASCII no Kst. Comment[sv]=Implementerar stöd för att läsa ASCII-filer i Kst. Comment[uk]=Реалізує підтримку читання файлів ASCII у Kst. Comment[x-test]=xxImplements support for reading ASCII files into Kst.xx Kst-2.0.8/src/datasources/ascii/asciidatainterfaces.h0000644000175000017500000001131512277111530021711 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCIIDATAINTERFACES_H #define ASCIIDATAINTERFACES_H #include "datasource.h" #include "dataplugin.h" #include "curve.h" #include "colorsequence.h" #include "objectstore.h" using namespace Kst; // // Vector interface // //------------------------------------------------------------------------------------------- class DataInterfaceAsciiVector : public DataSource::DataInterface { public: explicit DataInterfaceAsciiVector(AsciiSource& a) : ascii(a) {} void prepareRead(int); void readingDone(); // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return ascii._fieldList; } bool isListComplete() const { return ascii._fieldListComplete; } bool isValid(const QString& field) const { return ascii._fieldLookup.contains( field ); } // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&); AsciiSource& ascii; }; //------------------------------------------------------------------------------------------- const DataVector::DataInfo DataInterfaceAsciiVector::dataInfo(const QString &field) const { if (!ascii._fieldLookup.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(ascii._reader.numberOfFrames(), 1); } //------------------------------------------------------------------------------------------- void DataInterfaceAsciiVector::prepareRead(int number_of_read_calls) { ascii.prepareRead(number_of_read_calls); } //------------------------------------------------------------------------------------------- void DataInterfaceAsciiVector::readingDone() { ascii.readingDone(); } //------------------------------------------------------------------------------------------- int DataInterfaceAsciiVector::read(const QString& field, DataVector::ReadInfo& p) { return ascii.readField(p.data, field, p.startingFrame, p.numberOfFrames); } //------------------------------------------------------------------------------------------- // TODO FRAMES only in vector? QMap DataInterfaceAsciiVector::metaScalars(const QString&) { QMap m; m["FRAMES"] = ascii._reader.numberOfFrames(); return m; } QMap DataInterfaceAsciiVector::metaStrings(const QString& field) { QMap m; if (ascii._fieldUnits.contains(field)) { m["units"] = ascii._fieldUnits[field]; } return m; } // // String interface // class DataInterfaceAsciiString : public DataSource::DataInterface { public: explicit DataInterfaceAsciiString(AsciiSource& s) : ascii(s) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return ascii._strings.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: AsciiSource& ascii; }; //------------------------------------------------------------------------------------------- int DataInterfaceAsciiString::read(const QString& string, DataString::ReadInfo& p) { if (isValid(string) && p.value) { *p.value = ascii._strings[string]; return 1; } return 0; } //------------------------------------------------------------------------------------------- bool DataInterfaceAsciiString::isValid(const QString& string) const { return ascii._strings.contains( string ); } #endif Kst-2.0.8/src/datasources/ascii/ascii.pro0000644000175000017500000000074412277111530017370 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_ascii) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/ascii/tmp SOURCES += \ asciisource.cpp \ asciisourceconfig.cpp \ asciiplugin.cpp \ kst_atof.cpp HEADERS += \ asciisource.h \ asciisourceconfig.h \ asciiplugin.h \ namedparameter.h \ kst_atof.h \ ../../libkst/kst_inf.h FORMS += asciiconfig.ui win32:DEFINES += KST_USE_KST_ATOF Kst-2.0.8/src/datasources/ascii/asciiconfigwidget.h0000644000175000017500000000427112277111530021410 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCIICONFIGWINDGET_H #define ASCIICONFIGWINDGET_H #include "asciisource.h" #include "dataplugin.h" #include "ui_asciiconfig.h" class QTextStream; class AsciiConfigWidgetInternal : public QWidget, public Ui_AsciiConfig { Q_OBJECT public: explicit AsciiConfigWidgetInternal(QWidget *parent); AsciiSourceConfig config(); void setConfig(const AsciiSourceConfig&); void setFilename(const QString& filename); private Q_SLOTS: void showBeginning(); void showPreviewWindow(); protected Q_SLOTS: void interpretationChanged(bool enabled); void testAsciiFormatString(QString format); private: const int _index_offset; QString _filename; QPlainTextEdit _previewWidget; QString readLine(QTextStream& in, int maxLength); void showBeginning(QPlainTextEdit* widget, int numberOfLines); }; class AsciiConfigWidget : public Kst::DataSourceConfigWidget { Q_OBJECT public: explicit AsciiConfigWidget(QSettings&); ~AsciiConfigWidget(); void load(); void save(); bool isOkAcceptabe() const; void setDialogParent(QDialog* parent); void setFilename(const QString& filename); AsciiConfigWidgetInternal *_ac; AsciiSourceConfig _oldConfig; public Q_SLOTS: void updateIndexVector(); virtual void cancel(); private: bool _busy_loading; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/kst_atof.cpp0000644000175000017500000001355112362701575020105 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // patched BSD V7 code // http://www.bsdlover.cn/study/UnixTree/V7/usr/src/libc/gen/atof.c.html #include "kst_atof.h" #include "math_kst.h" #include #include #include #include #include #include #include #define LOGHUGE 39 //------------------------------------------------------------------------------------------- #ifdef KST_USE_KST_ATOF double LexicalCast::fromDouble(const char* signedp) const { unsigned char* p = (unsigned char*)signedp; unsigned char c; double fl, flexp, exp5; double big = 72057594037927936.; /*2^56*/ int nd; int eexp, exp, neg, negexp, bexp; neg = 1; while((c = *p++) == ' ') ; if (c == '-') neg = -1; else if (c=='+') ; else --p; if (_nanMode != NullValue && c != '-' && c != '+' && c != _separator && !isDigit(c)) { return nanValue(); } exp = 0; fl = 0; nd = 0; while ((c = *p++), isDigit(c)) { if (fl>= 1; if (exp==0) break; exp5 *= exp5; } if (negexp<0) fl /= flexp; else fl *= flexp; fl = ldexp(fl, negexp*bexp); if (neg<0) fl = -fl; _previousValue = fl; return(fl); } #endif //------------------------------------------------------------------------------------------- LexicalCast::AutoReset::AutoReset(bool useDot, NaNMode mode) { instance().setUseDotAsDecimalSeparator(useDot); instance()._nanMode = mode; } //------------------------------------------------------------------------------------------- LexicalCast::AutoReset::~AutoReset() { instance().resetLocal(); instance()._isFormattedTime = false; instance()._timeFormat.clear(); instance()._nanMode = NullValue; } //------------------------------------------------------------------------------------------- LexicalCast& LexicalCast::instance() { static LexicalCast lexcInstance; return lexcInstance; } //------------------------------------------------------------------------------------------- LexicalCast::LexicalCast() : _nanMode(NullValue), _isFormattedTime(false), _timeWithDate(false) { } KST_THREAD_LOCAL double LexicalCast::_previousValue = 0; //------------------------------------------------------------------------------------------- LexicalCast::~LexicalCast() { resetLocal(); } //------------------------------------------------------------------------------------------- void LexicalCast::resetLocal() { if (!_originalLocal.isEmpty()) { setlocale(LC_NUMERIC, _originalLocal.constData()); _originalLocal.clear(); } } //------------------------------------------------------------------------------------------- void LexicalCast::setUseDotAsDecimalSeparator(bool useDot) { useDot ? _separator = '.' : _separator = ','; if (_separator != localSeparator()) { _originalLocal = QByteArray((const char*) setlocale(LC_NUMERIC, 0)); if (useDot) { setlocale(LC_NUMERIC, "C"); } else { setlocale(LC_NUMERIC, "de"); } } else { resetLocal(); } } //------------------------------------------------------------------------------------------- char LexicalCast::localSeparator() const { return *setlocale(LC_NUMERIC, 0); } //------------------------------------------------------------------------------------------- void LexicalCast::setTimeFormat(const QString& format) { _timeFormat = format.trimmed(); // remove space at start/end _isFormattedTime = !format.isEmpty(); _timeWithDate = format.contains("d") || format.contains("M") || format.contains("y"); _timeFormatLength = _timeFormat.size(); } //------------------------------------------------------------------------------------------- double LexicalCast::fromTime(const char* p) const { for (int i = 0; i < _timeFormatLength; i++) { if (*(p + i) == '\0') return nanValue(); } const QString time = QString::fromLatin1(p, _timeFormatLength); double sec = nanValue(); if (_timeWithDate) { QDateTime t = QDateTime::fromString(time, _timeFormat); if (!t.isValid()) { return nanValue(); } t.setTimeSpec(Qt::UTC); #if QT_VERSION >= 0x040700 sec = t.toMSecsSinceEpoch() / 1000.0; #else sec = t.toTime_t(); #endif } else { const QTime t = QTime::fromString(time, _timeFormat); if (t.isValid()) sec = QTime(0, 0, 0).msecsTo(t) / 1000.0; } _previousValue = sec; return sec; } // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/notes.txt0000644000175000017500000000107012277111530017440 0ustar synthsynthNotes for the ASCII data source ------------------------------- Time ---- Two time modes are supported: 1) C Time Equivalent to time_t, including epoch. This is an absolute measure. 2) Seconds This is a relative measure. Time is equivalent to the value of the index vector in seconds Broken ------ 1) We have to update() from the constructor because KstRVector doesn't update the data source. This has to be reworked in Kst-core so that the update thread no longer does data sources. Should give a performance boost. 2) Time code is unfinished. Kst-2.0.8/src/datasources/ascii/asciicharactertraits.h0000644000175000017500000000614212277111530022121 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2010 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_CHARACTER_TRAITS_H #define ASCII_CHARACTER_TRAITS_H #include namespace AsciiCharacterTraits { struct LineEndingType { inline LineEndingType() {} bool is_crlf; char character; inline bool isCR() const { return character == '\r'; } inline bool isLF() const { return character == '\n'; } }; // column and comment delimiter functions struct AlwaysTrue { inline AlwaysTrue() {} inline bool operator()() const { return true; } }; struct AlwaysFalse { inline AlwaysFalse() {} inline bool operator()() const { return false; } }; struct NoDelimiter { inline NoDelimiter() {} inline bool operator()(const char) const { return false; } }; struct IsWhiteSpace { inline IsWhiteSpace() {} inline bool operator()(const char c) const { return c == ' ' || c == '\t'; } }; struct IsDigit { inline IsDigit() {} inline bool operator()(const char c) const { return (c >= 48) && (c <= 57) ? true : false; } }; struct IsCharacter { inline IsCharacter(char c) : character(c) {} const char character; inline bool operator()(const char c) const { return character == c; } }; struct IsInString { inline IsInString(const QString& s) : str(s), chars(s.size()) { QByteArray ascii = str.toLatin1(); for (int i = 0; i < 6 && i < chars; i++) { ch[i] = ascii[i]; } } const QString str; const int chars; char ch[6]; inline bool operator()(const char c) const { switch (chars) { case 0: return false; case 1: return ch[0]==c; case 2: return ch[0]==c || ch[1]==c; case 3: return ch[0]==c || ch[1]==c || ch[2]==c; case 4: return ch[0]==c || ch[1]==c || ch[2]==c || ch[3]==c; case 5: return ch[0]==c || ch[1]==c || ch[2]==c || ch[3]==c || ch[4]==c; case 6: return ch[0]==c || ch[1]==c || ch[2]==c || ch[3]==c || ch[4]==c || ch[5]==c; default: return str.contains(c); } } }; struct IsLineBreakLF { inline IsLineBreakLF(const LineEndingType&) : size(1) {} const int size; inline bool operator()(const char c) const { return c == '\n'; } }; struct IsLineBreakCR { inline IsLineBreakCR(const LineEndingType& t) : size( t.is_crlf ? 2 : 1 ) {} const int size; inline bool operator()(const char c) const { return c == '\r'; } }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciiconfigwidget.cpp0000644000175000017500000003431512362701575021756 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "asciiconfigwidget.h" #include "objectstore.h" #include "kst_atof.h" #include #include #include #include #include // // AsciiConfigWidgetInternal // AsciiConfigWidgetInternal::AsciiConfigWidgetInternal(QWidget *parent) : QWidget(parent), Ui_AsciiConfig(), _index_offset(1) { setupUi(this); QButtonGroup* bgroup = new QButtonGroup(this); bgroup->addButton(_whitespace, AsciiSourceConfig::Whitespace); bgroup->addButton(_custom, AsciiSourceConfig::Custom); bgroup->addButton(_fixed, AsciiSourceConfig::Fixed); _showBeginning->setFont(QFont("Courier")); _showBeginning->setReadOnly(true); _showBeginning->setLineWrapMode(QPlainTextEdit::NoWrap); _showBeginning->setMinimumSize(640, 100); _previewWidget.setFont(QFont("Courier")); _previewWidget.setReadOnly(true); _previewWidget.setLineWrapMode(QPlainTextEdit::NoWrap); _previewWidget.setMinimumSize(640, 300); QObject::connect(_ctime, SIGNAL(toggled(bool)), this, SLOT(interpretationChanged(bool))); QObject::connect(_seconds, SIGNAL(toggled(bool)), this, SLOT(interpretationChanged(bool))); QObject::connect(_indexFreq, SIGNAL(toggled(bool)), this, SLOT(interpretationChanged(bool))); QObject::connect(_formattedString, SIGNAL(toggled(bool)), this, SLOT(interpretationChanged(bool))); QObject::connect(_previewButton, SIGNAL(clicked()), this, SLOT(showPreviewWindow())); //QObject::connect(_timeAsciiFormatString, SIGNAL(textEdited(QString)), this, SLOT(testAsciiFormatString(QString))); } void AsciiConfigWidgetInternal::testAsciiFormatString(QString format) { // FIXME: add a format validator } QString AsciiConfigWidgetInternal::readLine(QTextStream& in, int maxLength) { const QString line = in.readLine(); if (line.size() > maxLength) { // very log line, don't show it complete return line.mid(0, maxLength) + " ..."; } return line; } void AsciiConfigWidgetInternal::showBeginning() { showBeginning(_showBeginning, 100); _labelBeginning->setText(tr("First lines of file '%1'").arg(QFileInfo(_filename).fileName())); } void AsciiConfigWidgetInternal::showPreviewWindow() { showBeginning(&_previewWidget, 1000); _previewWidget.setWindowTitle(_filename); _previewWidget.show(); } void AsciiConfigWidgetInternal::showBeginning(QPlainTextEdit* widget, int numberOfLines) { QFile file(_filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } int lines_read = 1; QTextStream in(&file); QStringList lines; while (!in.atEnd() && lines_read <= numberOfLines) { lines << QString("%1: ").arg(lines_read, 3) + readLine(in, 1000); lines_read++; } widget->setPlainText(lines.join("\n")); widget->moveCursor(QTextCursor::Start); } void AsciiConfigWidgetInternal::interpretationChanged(bool enabled) { if (enabled) { if (_ctime->isChecked()) { _offsetDateTime->setEnabled(false); _offsetFileDate->setEnabled(false); _offsetRelative->setEnabled(true); _offsetRelative->setChecked(true); } else if (_formattedString->isChecked()) { _offsetDateTime->setEnabled(true); _offsetFileDate->setEnabled(true); _offsetRelative->setEnabled(true); } else { _offsetDateTime->setEnabled(true); _offsetFileDate->setEnabled(true); _offsetRelative->setEnabled(false); if (_offsetRelative->isChecked()) { _offsetDateTime->setChecked(true); } } } } AsciiSourceConfig AsciiConfigWidgetInternal::config() { AsciiSourceConfig config; config._fileNamePattern = _fileNamePattern->text(); config._indexVector = _indexVector->currentText(); if (_interpret->isChecked()) { if (_ctime->isChecked()) { config._indexInterpretation = AsciiSourceConfig::CTime; } else if (_seconds->isChecked()) { config._indexInterpretation = AsciiSourceConfig::Seconds; } else if (_formattedString->isChecked()) { config._indexInterpretation = AsciiSourceConfig::FormattedTime; } else if (_indexFreq->isChecked()) { config._indexInterpretation = AsciiSourceConfig::FixedRate; } else { config._indexInterpretation = AsciiSourceConfig::NoInterpretation; } } else { config._indexInterpretation = AsciiSourceConfig::NoInterpretation; } config._delimiters = _delimiters->text(); if (_whitespace->isChecked()) { config._columnType = AsciiSourceConfig::Whitespace; } else if (_custom->isChecked()) { config._columnType = AsciiSourceConfig::Custom; } else if (_fixed->isChecked()) { config._columnType = AsciiSourceConfig::Fixed; } config._columnDelimiter = _columnDelimiter->text(); config._columnWidth = _columnWidth->value(); config._columnWidthIsConst = _colWidthConst->isChecked(); config._readFields = _readFields->isChecked(); config._readUnits = _readUnits->isChecked(); config._useDot = _useDot->isChecked(); config._dataLine = _startLine->value() - _index_offset; config._fieldsLine = _fieldsLine->value() - _index_offset; config._unitsLine = _unitsLine->value() - _index_offset; config._limitFileBuffer = _limitFileBuffer->isChecked(); config._limitFileBufferSize = (qint64)_limitFileBufferSize->value() * 1024 * 1024; config._useThreads =_useThreads->isChecked(); config._timeAsciiFormatString = _timeAsciiFormatString->text(); config._dataRate = _dataRate->value(); config._offsetDateTime = _offsetDateTime->isChecked(); config._offsetFileDate = _offsetFileDate->isChecked(); config._offsetRelative = _offsetRelative->isChecked(); config._dateTimeOffset = _dateTimeOffset->dateTime(); config._relativeOffset = _relativeOffset->value(); config._nanValue = _nanNull->isChecked() ? 0 : _nanNAN->isChecked() ? 1 : _nanPrevious->isChecked() ? 2 : 0; return config; } void AsciiConfigWidgetInternal::setFilename(const QString& filename) { _filename = filename; //_dateTimeOffset->setDateTime(QFileInfo(_filename).lastModified()); showBeginning(); } void AsciiConfigWidgetInternal::setConfig(const AsciiSourceConfig& config) { _delimiters->setText(config._delimiters); _fileNamePattern->setText(config._fileNamePattern); _columnDelimiter->setText(config._columnDelimiter); _columnWidth->setValue(config._columnWidth); _colWidthConst->setChecked(config._columnWidthIsConst); _readFields->setChecked(config._readFields); _readUnits->setChecked(config._readUnits); _useDot->setChecked(config._useDot); _useComma->setChecked(!config._useDot); _startLine->setValue(config._dataLine + _index_offset); _fieldsLine->setValue(config._fieldsLine + _index_offset); _unitsLine->setValue(config._unitsLine + _index_offset); AsciiSourceConfig::ColumnType ct = (AsciiSourceConfig::ColumnType) config._columnType.value(); if (ct == AsciiSourceConfig::Fixed) { _fixed->setChecked(true); } else if (ct == AsciiSourceConfig::Custom) { _custom->setChecked(true); } else { _whitespace->setChecked(true); } _limitFileBuffer->setChecked(config._limitFileBuffer); _limitFileBufferSize->setValue(config._limitFileBufferSize / 1024 / 1024); _useThreads->setChecked(config._useThreads); _timeAsciiFormatString->setText(config._timeAsciiFormatString); _dataRate->setValue(config._dataRate.value()); _offsetDateTime->setChecked(config._offsetDateTime.value()); _offsetFileDate->setChecked(config._offsetFileDate.value()); _offsetRelative->setChecked(config._offsetRelative.value()); _dateTimeOffset->setDateTime(config._dateTimeOffset.value()); _relativeOffset->setValue(config._relativeOffset.value()); switch (config._nanValue.value()) { case 0: _nanNull->setChecked(true); break; case 1: _nanNAN->setChecked(true); break; case 2: _nanPrevious->setChecked(true); break; default: _nanNull->setChecked(true); break; } } AsciiConfigWidget::AsciiConfigWidget(QSettings& s) : Kst::DataSourceConfigWidget(s), _busy_loading(false) { QGridLayout *layout = new QGridLayout(this); _ac = new AsciiConfigWidgetInternal(this); layout->addWidget(_ac, 0, 0); layout->activate(); _oldConfig = _ac->config(); connect(_ac->_readFields, SIGNAL(clicked()), this, SLOT(updateIndexVector())); connect(_ac->_fieldsLine, SIGNAL(valueChanged(int)), this, SLOT(updateIndexVector())); connect(_ac->_whitespace, SIGNAL(clicked()), this, SLOT(updateIndexVector())); connect(_ac->_custom, SIGNAL(clicked()), this, SLOT(updateIndexVector())); connect(_ac->_fixed, SIGNAL(clicked()), this, SLOT(updateIndexVector())); } AsciiConfigWidget::~AsciiConfigWidget() { } void AsciiConfigWidget::setDialogParent(QDialog* parent) { parent->setWindowModality(Qt::WindowModal); DataSourceConfigWidget::setDialogParent(parent); } void AsciiConfigWidget::setFilename(const QString& filename) { _ac->setFilename(filename); } void AsciiConfigWidget::updateIndexVector() { if (_busy_loading) return; save(); _ac->_indexVector->clear(); if (hasInstance()) { Kst::SharedPtr src = Kst::kst_cast(instance()); _ac->_indexVector->addItems(src->fieldListFor(src->fileName(), _ac->config())); } } void AsciiConfigWidget::cancel() { // revert to _oldConfig _ac->setConfig(_oldConfig); if (hasInstance()) { Kst::SharedPtr src = Kst::kst_cast(instance()); _ac->config().saveGroup(settings(), src->fileName()); // Update the instance from our new settings if (src->reusable()) { src->_config.readGroup(settings(), src->fileName()); if (_ac->config().isUpdateNecessary(_oldConfig)) { src->reset(); src->updateLists(); } } } } void AsciiConfigWidget::load() { _busy_loading = true; AsciiSourceConfig config; if (hasInstance()) config.readGroup(settings(), instance()->fileName()); else config.readGroup(settings()); _ac->setConfig(config); // Now handle index _ac->_indexVector->clear(); if (hasInstance()) { Kst::SharedPtr src = Kst::kst_cast(instance()); _ac->_indexVector->addItems(src->fieldListFor(src->fileName(), _ac->config())); if (src->_config._indexInterpretation == AsciiSourceConfig::CTime) { _ac->_interpret->setChecked(true); _ac->_ctime->setChecked(true); } else if (src->_config._indexInterpretation == AsciiSourceConfig::Seconds) { _ac->_interpret->setChecked(true); _ac->_seconds->setChecked(true); } else if (src->_config._indexInterpretation == AsciiSourceConfig::FormattedTime) { _ac->_interpret->setChecked(true); _ac->_formattedString->setChecked(true); } else if (src->_config._indexInterpretation == AsciiSourceConfig::FixedRate) { _ac->_interpret->setChecked(true); _ac->_indexFreq->setChecked(true); } else if (src->_config._indexInterpretation == AsciiSourceConfig::NoInterpretation) { _ac->_interpret->setChecked(false); } if (src->vector().list().contains(src->_config._indexVector)) { int idx = _ac->_indexVector->findText(src->_config._indexVector); if (idx == -1) idx = _ac->_indexVector->findText("INDEX"); _ac->_indexVector->setCurrentIndex(idx == -1 ? 0 : idx); } } else { _ac->_indexVector->addItem("INDEX"); if (config._indexInterpretation == AsciiSourceConfig::CTime) { _ac->_interpret->setChecked(true); _ac->_ctime->setChecked(true); } else if (config._indexInterpretation == AsciiSourceConfig::Seconds) { _ac->_interpret->setChecked(true); _ac->_seconds->setChecked(true); } else if (config._indexInterpretation == AsciiSourceConfig::FormattedTime) { _ac->_interpret->setChecked(true); _ac->_formattedString->setChecked(true); } else if (config._indexInterpretation == AsciiSourceConfig::FixedRate) { _ac->_interpret->setChecked(true); _ac->_indexFreq->setChecked(true); } else if (config._indexInterpretation == AsciiSourceConfig::NoInterpretation) { _ac->_interpret->setChecked(false); } } if (_ac->_interpret->isChecked()) { _ac->_indexVector->setEnabled(hasInstance()); } _oldConfig = _ac->config(); _busy_loading = false; } void AsciiConfigWidget::save() { if (_busy_loading) return; if (hasInstance()) { Kst::SharedPtr src = Kst::kst_cast(instance()); if (_ac->_applyDefault->isChecked()) { _ac->config().saveDefault(settings()); } _ac->config().saveGroup(settings(), src->fileName()); // Update the instance from our new settings if (src->reusable()) { src->_config.readGroup(settings(), src->fileName()); if (_ac->config().isUpdateNecessary(_oldConfig)) { src->reset(); src->updateLists(); src->store()->resetDataSourceDependents(src->fileName()); } } } } bool AsciiConfigWidget::isOkAcceptabe() const { AsciiSourceConfig config = _ac->config(); QString msg; if (config._readFields) { if (config._fieldsLine == config._dataLine) { msg = tr("Line %1 can not list field names AND values!").arg(config._fieldsLine + 1); } if (config._readUnits) { if (config._unitsLine == config._dataLine) { msg = tr("Line %1 can not list units AND values!").arg(config._unitsLine + 1); } if (config._unitsLine == config._fieldsLine) { msg = tr("Line %1 can not list field names AND units!").arg(config._unitsLine + 1); } } } if (!msg.isEmpty()) { QMessageBox::critical(0, tr("Inconsistent parameters"), msg); return false; } return true; } // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/ascii/asciiplugin.h0000644000175000017500000000603112277111530020231 0ustar synthsynth/*************************************************************************** * * * Copyright : (C) 2003 The University of Toronto * * email : netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ASCII_PLUGIN_H #define ASCII_PLUGIN_H #include "asciisource.h" #include "dataplugin.h" class AsciiPlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~AsciiPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return true; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/netcdf/0000755000175000017500000000000012362705136015732 5ustar synthsynthKst-2.0.8/src/datasources/netcdf/kstdata_netcdf.desktop0000644000175000017500000000323312362705136022304 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=netcdf X-Kst-Plugin-Author=Nicolas Brisset Name=netCDF File Reader Name[ca]=Lector de fitxers netCDF Name[ca@valencia]=Lector de fitxers netCDF Name[de]=netCDF-Dateileser Name[fr]=Lecteur de fichier netCDF Name[it]=Lettore di file netCDF Name[nb]=netCDF filleser Name[nl]=netCDF File Reader Name[pl]=Czytnik plików netCDF Name[pt]=Leitor de Ficheiros do netCDF Name[pt_BR]=Leitor de arquivos do netCDF Name[sk]=Čítač súborov netCDF Name[sv]=netCDF-filläsare Name[uk]=Засіб читання файлів netCDF Name[x-test]=xxnetCDF File Readerxx Comment=Implements support for reading netCDF files into Kst. Comment[ca]=Implementació que permet llegir fitxers netCDF en el Kst. Comment[ca@valencia]=Implementació que permet llegir fitxers netCDF en el Kst. Comment[de]=Unterstützung für das Einlesen von netCDF-Dateien in Kst Comment[fr]=Implémente la prise en charge de la lecture de fichiers netCDF dans Kst. Comment[it]=Implementa il supporto per la lettura di file netCDF con Kst. Comment[nb]=Legger til støtte for å lese netCDF-filer i Kst. Comment[nl]=Implementeert ondersteuning voor het lezen van netCDF-bestanden in Kst. Comment[pl]=Implementuj obsługę odczytu plików netCDF w Kst. Comment[pt]=Implementa o suporte para ler os ficheiros do netCDF no Kst. Comment[pt_BR]=Implementa o suporte para leitura de arquivos do netCDF no Kst. Comment[sv]=Implementerar stöd för att läsa netCDF-filer i Kst. Comment[uk]=Реалізує підтримку читання файлів netCDF у Kst. Comment[x-test]=xxImplements support for reading netCDF files into Kst.xx Kst-2.0.8/src/datasources/netcdf/netcdfplugin.cpp0000644000175000017500000001046512320547027021123 0ustar synthsynth/*************************************************************************** netcdf.cpp - netCDF file data source reader ------------------- begin : 17/06/2004 copyright : (C) 2004 Nicolas Brisset email : kst@kde.org modified : 03/14/05 by K. Scott ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "netcdfplugin.h" #include "netcdfsource.h" #include // // NetCdfPlugin // QString NetCdfPlugin::pluginName() const { return tr("netCDF Reader"); } QString NetCdfPlugin::pluginDescription() const { return tr("netCDF Reader"); } Kst::DataSource *NetCdfPlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new NetcdfSource(store, cfg, filename, type, element); } QStringList NetCdfPlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { return QStringList(); } QStringList NetCdfPlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg); Q_UNUSED(type) QStringList scalarList; return scalarList; } QStringList NetCdfPlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg); Q_UNUSED(type) QStringList stringList; return stringList; } QStringList NetCdfPlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg); Q_UNUSED(type) QStringList fieldList; return fieldList; } bool NetCdfPlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return true; } QStringList NetCdfPlugin::provides() const { return QStringList() << NetcdfSource::netcdfTypeKey(); } Kst::DataSourceConfigWidget *NetCdfPlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } /** understands_netcdf: returns true if: - the file is readable (!) - the file can be opened by the netcdf library **/ int NetCdfPlugin::understands(QSettings *cfg, const QString& filename) const { QFile f(filename); if (!f.open(QFile::ReadOnly)) { KST_DBG qDebug() << "Unable to read file !" << endl; return 0; } NcFile *ncfile = new NcFile(filename.toUtf8().data()); if (ncfile->is_valid()) { KST_DBG qDebug() << filename << " looks like netCDF !" << endl; delete ncfile; return 80; } else { delete ncfile; return 0; } } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_netcdfsource, NetCdfPlugin) #endif Kst-2.0.8/src/datasources/netcdf/netcdfsource.cpp0000644000175000017500000004304312277111530021120 0ustar synthsynth/*************************************************************************** netcdf.cpp - netCDF file data source reader ------------------- begin : 17/06/2004 copyright : (C) 2004 Nicolas Brisset email : kst@kde.org modified : 03/14/05 by K. Scott ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ // TODO move //#define KST_DEBUG_SHARED #include "sharedptr.h" #include "netcdfsource.h" #include "debug.h" #include #include #include #include using namespace Kst; static const QString netCdfTypeString = "netCDF Files"; // // Scalar interface // class DataInterfaceNetCdfScalar : public DataSource::DataInterface { public: DataInterfaceNetCdfScalar(NetcdfSource& s) : netcdf(s) {} // read one element int read(const QString&, DataScalar::ReadInfo&); // named elements QStringList list() const { return netcdf._scalarList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); } void setDataInfo(const QString&, const DataScalar::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: NetcdfSource& netcdf; }; int DataInterfaceNetCdfScalar::read(const QString& scalar, DataScalar::ReadInfo& p) { return netcdf.readScalar(p.value, scalar); } bool DataInterfaceNetCdfScalar::isValid(const QString& scalar) const { return netcdf._scalarList.contains( scalar ); } // // String interface // class DataInterfaceNetCdfString : public DataSource::DataInterface { public: DataInterfaceNetCdfString(NetcdfSource& s) : netcdf(s) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return netcdf._strings.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: NetcdfSource& netcdf; }; //------------------------------------------------------------------------------------------- int DataInterfaceNetCdfString::read(const QString& string, DataString::ReadInfo& p) { //return netcdf.readString(p.value, string); if (isValid(string) && p.value) { *p.value = netcdf._strings[string]; return 1; } return 0; } bool DataInterfaceNetCdfString::isValid(const QString& string) const { return netcdf._strings.contains( string ); } // // Vector interface // class DataInterfaceNetCdfVector : public DataSource::DataInterface { public: DataInterfaceNetCdfVector(NetcdfSource& s) : netcdf(s) {} // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return netcdf._fieldList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&); private: NetcdfSource& netcdf; }; const DataVector::DataInfo DataInterfaceNetCdfVector::dataInfo(const QString &field) const { if (!netcdf._fieldList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(netcdf.frameCount(field), netcdf.samplesPerFrame(field)); } int DataInterfaceNetCdfVector::read(const QString& field, DataVector::ReadInfo& p) { return netcdf.readField(p.data, field, p.startingFrame, p.numberOfFrames); } bool DataInterfaceNetCdfVector::isValid(const QString& field) const { return netcdf._fieldList.contains( field ); } QMap DataInterfaceNetCdfVector::metaScalars(const QString& field) { NcVar *var = netcdf._ncfile->get_var(field.toLatin1().constData()); if (!var) { KST_DBG qDebug() << "Queried field " << field << " which can't be read" << endl; return QMap(); } QMap fieldScalars; fieldScalars["NbAttributes"] = var->num_atts(); for (int i=0; inum_atts(); ++i) { NcAtt *att = var->get_att(i); // Only handle char attributes as fieldStrings, the others as fieldScalars if (att->type() == ncByte || att->type() == ncShort || att->type() == ncInt || att->type() == ncLong || att->type() == ncFloat || att->type() == ncDouble) { // Some attributes may have multiple values => load the first as is, and for the others // add a -2, -3, etc... suffix as obviously we can have only one value per scalar. // Do it in two steps to avoid a test in the loop while keeping a "clean" name for the first one fieldScalars[QString(att->name())] = att->values()->as_double(0); for (int j=1; jvalues()->num(); ++j) { fieldScalars[QString(att->name()) + QString("-") + QString::number(j+1)] = att->values()->as_double(j); } } } return fieldScalars; } QMap DataInterfaceNetCdfVector::metaStrings(const QString& field) { NcVar *var = netcdf._ncfile->get_var(field.toLatin1().constData()); if (!var) { KST_DBG qDebug() << "Queried field " << field << " which can't be read" << endl; return QMap(); } QMap fieldStrings; QString tmpString; for (int i=0; inum_atts(); ++i) { NcAtt *att = var->get_att(i); // Only handle char/unspecified attributes as fieldStrings, the others as fieldScalars if (att->type() == ncChar || att->type() == ncNoType) { fieldStrings[att->name()] = QString(att->values()->as_string(0)); } // qDebug() << att->name() << ": " << att->values()->num() << endl; } return fieldStrings; } // // Matrix interface // class DataInterfaceNetCdfMatrix : public DataSource::DataInterface { public: DataInterfaceNetCdfMatrix(NetcdfSource& s) : netcdf(s) {} // read one element int read(const QString&, DataMatrix::ReadInfo&); // named elements QStringList list() const { return netcdf._matrixList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataMatrix::DataInfo dataInfo (const QString&) const; void setDataInfo(const QString&, const DataMatrix::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: NetcdfSource& netcdf; }; const DataMatrix::DataInfo DataInterfaceNetCdfMatrix::dataInfo(const QString& matrix) const { if (!netcdf._matrixList.contains( matrix ) ) { return DataMatrix::DataInfo(); } QByteArray bytes = matrix.toLatin1(); NcVar *var = netcdf._ncfile->get_var(bytes.constData()); // var is owned by _ncfile if (!var) { return DataMatrix::DataInfo(); } if (var->num_dims() != 2) { return DataMatrix::DataInfo(); } DataMatrix::DataInfo info; info.samplesPerFrame = 1; // TODO is this right? info.xSize = var->get_dim(0)->size(); info.ySize = var->get_dim(1)->size(); return info; } int DataInterfaceNetCdfMatrix::read(const QString& field, DataMatrix::ReadInfo& p) { int count = netcdf.readMatrix(p.data->z, field); p.data->xMin = 0; p.data->yMin = 0; p.data->xStepSize = 1; p.data->yStepSize = 1; return count; } bool DataInterfaceNetCdfMatrix::isValid(const QString& field) const { return netcdf._matrixList.contains( field ); } // // NetcdfSource // NetcdfSource::NetcdfSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement &element) : Kst::DataSource(store, cfg, filename, type), _ncfile(0L), _ncErr(NcError::silent_nonfatal), is(new DataInterfaceNetCdfScalar(*this)), it(new DataInterfaceNetCdfString(*this)), iv(new DataInterfaceNetCdfVector(*this)), im(new DataInterfaceNetCdfMatrix(*this)) { setInterface(is); setInterface(it); setInterface(iv); setInterface(im); setUpdateType(None); if (!type.isEmpty() && type != "netCDF") { return; } _valid = false; _maxFrameCount = 0; _filename = filename; _strings = fileMetas(); _valid = initFile(); } NetcdfSource::~NetcdfSource() { delete _ncfile; _ncfile = 0L; } void NetcdfSource::reset() { delete _ncfile; _ncfile = 0L; _maxFrameCount = 0; _valid = initFile(); } bool NetcdfSource::initFile() { _ncfile = new NcFile(_filename.toUtf8().data(), NcFile::ReadOnly); if (!_ncfile->is_valid()) { qDebug() << _filename << ": failed to open in initFile()" << endl; return false; } KST_DBG qDebug() << _filename << ": building field list" << endl; _fieldList.clear(); _fieldList += "INDEX"; int nb_vars = _ncfile->num_vars(); KST_DBG qDebug() << nb_vars << " vars found in total" << endl; _maxFrameCount = 0; for (int i = 0; i < nb_vars; i++) { NcVar *var = _ncfile->get_var(i); if (!var) { continue; } if (var->num_dims() == 0) { _scalarList += var->name(); } else if (var->num_dims() == 1) { _fieldList += var->name(); int fc = var->num_vals() / var->rec_size(); _maxFrameCount = qMax(_maxFrameCount, fc); _frameCounts[var->name()] = fc; } else if (var->num_dims() == 2) { _matrixList += var->name(); } } // Get strings int globalAttributesNb = _ncfile->num_atts(); for (int i = 0; i < globalAttributesNb; ++i) { // Get only first value, should be enough for a start especially as strings are complete NcAtt *att = _ncfile->get_att(i); if (att) { QString attrName = QString(att->name()); char *attString = att->as_string(0); QString attrValue = QString(att->as_string(0)); delete[] attString; //TODO port //KstString *ms = new KstString(KstObjectTag(attrName, tag()), this, attrValue); _strings[attrName] = attrValue; } delete att; } // TODO update(); // necessary? slows down initial loading return true; } Kst::Object::UpdateType NetcdfSource::internalDataSourceUpdate() { //TODO port /* if (KstObject::checkUpdateCounter(u)) { return lastUpdateResult(); } */ _ncfile->sync(); bool updated = false; /* Update member variables _ncfile, _maxFrameCount, and _frameCounts and indicate that an update is needed */ int nb_vars = _ncfile->num_vars(); for (int j = 0; j < nb_vars; j++) { NcVar *var = _ncfile->get_var(j); if (!var) { continue; } int fc = var->num_vals() / var->rec_size(); _maxFrameCount = qMax(_maxFrameCount, fc); updated = updated || (_frameCounts[var->name()] != fc); _frameCounts[var->name()] = fc; } return updated ? Object::Updated : Object::NoChange; } int NetcdfSource::readScalar(double *v, const QString& field) { // TODO error handling QByteArray bytes = field.toLatin1(); NcVar *var = _ncfile->get_var(bytes.constData()); // var is owned by _ncfile if (var) { var->get(v); return 1; } return 0; } int NetcdfSource::readString(QString *stringValue, const QString& stringName) { // TODO more error handling? NcAtt *att = _ncfile->get_att((NcToken) stringName.toLatin1().data()); if (att) { *stringValue = QString(att->as_string(0)); delete att; return 1; } return 0; } int NetcdfSource::readField(double *v, const QString& field, int s, int n) { NcType dataType = ncNoType; /* netCDF data type */ /* Values for one record */ NcValues *record = 0;// = new NcValues(dataType,numFrameVals); KST_DBG qDebug() << "Entering NetcdfSource::readField with params: " << field << ", from " << s << " for " << n << " frames" << endl; /* For INDEX field */ if (field.toLower() == "index") { if (n < 0) { v[0] = double(s); return 1; } for (int i = 0; i < n; ++i) { v[i] = double(s + i); } return n; } /* For a variable from the netCDF file */ QByteArray bytes = field.toLatin1(); NcVar *var = _ncfile->get_var(bytes.constData()); // var is owned by _ncfile if (!var) { KST_DBG qDebug() << "Queried field " << field << " which can't be read" << endl; return -1; } dataType = var->type(); if (s >= var->num_vals() / var->rec_size()) { return 0; } bool oneSample = n < 0; int recSize = var->rec_size(); double add_offset = 1.0, scale_factor = 1.0; switch (dataType) { case ncShort: { // Check for special attributes add_offset and scale_factor indicating the use of the convention described in // bool packed = iv->metaScalars(field).contains("add_offset") && iv->metaScalars(field).contains("scale_factor"); if (packed) { // Get the values into local vars add_offset = iv->metaScalars(field)["add_offset"]; scale_factor = iv->metaScalars(field)["scale_factor"]; } if (oneSample) { record = var->get_rec(s); v[0] = packed ? record->as_short(0)*scale_factor+add_offset : record->as_short(0); delete record; } else { for (int i = 0; i < n; i++) { record = var->get_rec(i+s); if (packed) { for (int j = 0; j < recSize; j++) { v[i*recSize + j] = record->as_short(j)*scale_factor+add_offset; } } else { for (int j = 0; j < recSize; j++) { v[i*recSize + j] = record->as_short(j); } } delete record; } } } break; case ncInt: { if (oneSample) { record = var->get_rec(s); v[0] = record->as_int(0); delete record; } else { for (int i = 0; i < n; i++) { record = var->get_rec(i+s); KST_DBG qDebug() << "Read record " << i+s << endl; for (int j = 0; j < recSize; j++) { v[i*recSize + j] = record->as_int(j); } delete record; } } } break; case ncFloat: { if (oneSample) { record = var->get_rec(s); v[0] = record->as_float(0); delete record; } else { for (int i = 0; i < n; i++) { record = var->get_rec(i+s); for (int j = 0; j < recSize; j++) { v[i*recSize + j] = record->as_float(j); } delete record; } } } break; case ncDouble: { if (oneSample) { record = var->get_rec(s); v[0] = record->as_double(0); delete record; } else { for (int i = 0; i < n; i++) { record = var->get_rec(i+s); for (int j = 0; j < recSize; j++) { v[i*recSize + j] = record->as_double(j); } delete record; } } } break; default: KST_DBG qDebug() << field << ": wrong datatype for kst, no values read" << endl; return -1; break; } KST_DBG qDebug() << "Finished reading " << field << endl; return oneSample ? 1 : n * recSize; } int NetcdfSource::readMatrix(double *v, const QString& field) { /* For a variable from the netCDF file */ QByteArray bytes = field.toLatin1(); NcVar *var = _ncfile->get_var(bytes.constData()); // var is owned by _ncfile if (!var) { KST_DBG qDebug() << "Queried field " << field << " which can't be read" << endl; return -1; } int xSize = var->get_dim(0)->size(); int ySize = var->get_dim(1)->size(); var->get(v, xSize, ySize); return xSize * ySize; } int NetcdfSource::samplesPerFrame(const QString& field) { if (field.toLower() == "index") { return 1; } QByteArray bytes = field.toLatin1(); NcVar *var = _ncfile->get_var(bytes.constData()); if (!var) { KST_DBG qDebug() << "Queried field " << field << " which can't be read" << endl; return 0; } return var->rec_size(); } int NetcdfSource::frameCount(const QString& field) const { if (field.isEmpty() || field.toLower() == "index") { return _maxFrameCount; } else { return _frameCounts[field]; } } QString NetcdfSource::fileType() const { return "netCDF"; } bool NetcdfSource::isEmpty() const { return frameCount() < 1; } const QString& NetcdfSource::typeString() const { return netCdfTypeString; } const QString NetcdfSource::netcdfTypeKey() { return ::netCdfTypeString; } Kst-2.0.8/src/datasources/netcdf/netcdfsource.h0000644000175000017500000000562312277111530020567 0ustar synthsynth/*************************************************************************** netcdf_source.h - netCDF data source reader ------------------- begin : 28/01/2005 copyright : (C) 2004 Nicolas Brisset email : kst@kde.org modified : 03/16/05 by K. Scott ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef NETCDFSOURCE_H #define NETCDFSOURCE_H #include "datasource.h" #include "dataplugin.h" #include #include class DataInterfaceNetCdfScalar; class DataInterfaceNetCdfString; class DataInterfaceNetCdfVector; class DataInterfaceNetCdfMatrix; class NetcdfSource : public Kst::DataSource { public: NetcdfSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement &element); ~NetcdfSource(); bool initFile(); Kst::Object::UpdateType internalDataSourceUpdate(); virtual const QString& typeString() const; static const QString netcdfTypeKey(); int readScalar(double *v, const QString& field); int readString(QString *stringValue, const QString& stringName); int readField(double *v, const QString& field, int s, int n); int readMatrix(double *v, const QString& field); int samplesPerFrame(const QString& field); int frameCount(const QString& field = QString()) const; QString fileType() const; void save(QTextStream &ts, const QString& indent = QString()); bool isEmpty() const; void reset(); private: QMap _frameCounts; int _maxFrameCount; NcFile *_ncfile; // we must hold an NcError to overwrite the exit-on-error behaviour of netCDF NcError _ncErr; QMap _strings; // TODO remove friend QStringList _scalarList; QStringList _fieldList; QStringList _matrixList; //QStringList _stringList; friend class DataInterfaceNetCdfScalar; friend class DataInterfaceNetCdfString; friend class DataInterfaceNetCdfVector; friend class DataInterfaceNetCdfMatrix; DataInterfaceNetCdfScalar* is; DataInterfaceNetCdfString* it; DataInterfaceNetCdfVector* iv; DataInterfaceNetCdfMatrix* im; }; #endif Kst-2.0.8/src/datasources/netcdf/netcdf.pro0000644000175000017500000000055312277111530017714 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_netcdfsource) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/netcdf/tmp LIBS += -l$$kstlib(netcdf_c++) -l$$kstlib(netcdf) SOURCES += \ netcdfsource.cpp \ netcdfplugin.cpp HEADERS += \ netcdfsource.h \ netcdfplugin.h Kst-2.0.8/src/datasources/netcdf/netcdfplugin.h0000644000175000017500000000634612277111530020570 0ustar synthsynth/*************************************************************************** netcdf_source.h - netCDF data source reader ------------------- begin : 28/01/2005 copyright : (C) 2004 Nicolas Brisset email : kst@kde.org modified : 03/16/05 by K. Scott ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef NETCDFPLUGIN_H #define NETCDFPLUGIN_H #include "dataplugin.h" class NetCdfPlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~NetCdfPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif Kst-2.0.8/src/datasources/fitsimage/0000755000175000017500000000000012362705136016437 5ustar synthsynthKst-2.0.8/src/datasources/fitsimage/kstdata_fitsimage.desktop0000644000175000017500000000247512362705136023525 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=fitsimage X-Kst-Plugin-Author=The University of Toronto Name=fitsimage Name[ca]=Imatge FITS Name[ca@valencia]=Imatge FITS Name[de]=Fitsimage Name[es]=fitsimage Name[fr]=fitsimage Name[hu]=fitsimage Name[it]=immagine fits Name[nb]=fitsimage Name[nl]=fits-afbeelding Name[pl]=fitsimage Name[pt]=Imagem FITS Name[pt_BR]=Imagem FITS Name[sk]=fitsimage Name[sv]=FITS-bild Name[uk]=fitsimage Name[x-test]=xxfitsimagexx Comment=Plugin to read a FITS image. Comment[ca]=Connector per llegir una imatge FITS. Comment[ca@valencia]=Connector per llegir una imatge FITS. Comment[de]=Modul zum Lesen von FITS-Bildern Comment[es]=Complemento para leer imágenes FITS. Comment[fr]=Module pour lire une image FITS. Comment[it]=Estensione per leggere un'immagine FITS. Comment[nb]=Programtillegg som leser et FITS-bilde. Comment[nl]=Plugin voor het inlezen van FITS-afbeeldingen. Comment[pl]=Wtyczka do odczytywania obrazów FITS. Comment[pt]=Um 'plugin' para ler uma imagem do FITS. Comment[pt_BR]=Plugin para ler uma imagem do FITS. Comment[sk]=Plugin na čítanie FITS obrázku. Comment[sv]=Insticksprogram för att läsa en FITS-bild. Comment[uk]=Додаток для читання зображень FITS. Comment[x-test]=xxPlugin to read a FITS image.xx Kst-2.0.8/src/datasources/fitsimage/fitsimage.pro0000644000175000017500000000043112277111530021121 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_fitsimage) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/fitsimage/tmp LIBS += -lcfitsio SOURCES += \ fitsimage.cpp HEADERS += \ fitsimage.h Kst-2.0.8/src/datasources/fitsimage/fitsimage.h0000644000175000017500000000761112277111530020557 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITSIMAGE_H #define FITSIMAGE_H #include #include //#include #include class DataInterfaceFitsImageMatrix; class DataInterfaceFitsImageString; class FitsImageSource : public Kst::DataSource { Q_OBJECT public: FitsImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~FitsImageSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); bool isEmpty() const; QString fileType() const; void save(QXmlStreamWriter &streamWriter); virtual const QString& typeString() const; class Config; private: int _frameCount; fitsfile *_fptr; mutable Config *_config; QMap _strings; DataInterfaceFitsImageString* is; DataInterfaceFitsImageMatrix* im; friend class DataInterfaceFitsImageString; }; class FitsImagePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~FitsImagePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/fitsimage/fitsimage.cpp0000644000175000017500000004025412320547027021115 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitsimage.h" #include #include #include using namespace Kst; static const QString fitsTypeString = "FITS image"; static const QString DefaultMatrixName = "1"; class FitsImageSource::Config { public: Config() { } void read(QSettings *cfg, const QString& fileName = QString()) { Q_UNUSED(fileName); cfg->beginGroup(fitsTypeString); cfg->endGroup(); } void save(QXmlStreamWriter& s) { Q_UNUSED(s); } void load(const QDomElement& e) { Q_UNUSED(e); } }; // // String interface // class DataInterfaceFitsImageString : public DataSource::DataInterface { public: DataInterfaceFitsImageString(FitsImageSource& s) : source(s) {} // read one element int read(const QString&, DataString::ReadInfo&); // named elements QStringList list() const { return source._strings.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); } void setDataInfo(const QString&, const DataString::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } private: FitsImageSource& source; }; //------------------------------------------------------------------------------------------- int DataInterfaceFitsImageString::read(const QString& string, DataString::ReadInfo& p) { // TODO read strings from file if (isValid(string) && p.value) { *p.value = source._strings[string]; return 1; } return 0; } //------------------------------------------------------------------------------------------- bool DataInterfaceFitsImageString::isValid(const QString& string) const { // TODO read strings from file return source._strings.contains( string ); } // // Matrix interface // class DataInterfaceFitsImageMatrix : public DataSource::DataInterface { public: DataInterfaceFitsImageMatrix(fitsfile **fitsfileptr) : _fitsfileptr(fitsfileptr) {} // read one element int read(const QString&, DataMatrix::ReadInfo&); // named elements QStringList list() const { return _matrixHash.keys(); } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataMatrix::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataMatrix::DataInfo&) {} // meta data QMap metaScalars(const QString &m); QMap metaStrings(const QString &m); // no interface fitsfile **_fitsfileptr; QHash _matrixHash; void init(); void clear(); }; void DataInterfaceFitsImageMatrix::clear() { _matrixHash.clear(); } void DataInterfaceFitsImageMatrix::init() { int hdu; int nhdu; int status=0; int type; QString name; char instr[32]; char tmpstr[1024]; fits_get_hdu_num(*_fitsfileptr, &hdu); _matrixHash.insert(DefaultMatrixName, hdu); fits_get_num_hdus(*_fitsfileptr, &nhdu, &status); for (hdu = 1; hdu <= nhdu; ++hdu) { fits_movabs_hdu(*_fitsfileptr, hdu, &type, &status); fits_get_hdu_type(*_fitsfileptr, &type, &status); if (type == IMAGE_HDU) { fits_read_key_str(*_fitsfileptr, "EXTNAME", instr, tmpstr, &status); if (status) { name = QString("HDU%1").arg(hdu); } else { name = QString(instr).trimmed(); } _matrixHash.insert(name, hdu); } } } const DataMatrix::DataInfo DataInterfaceFitsImageMatrix::dataInfo(const QString& matrix) const { long n_axes[3]; int status = 0; int type; if ( !*_fitsfileptr || !_matrixHash.contains( matrix ) ) { return DataMatrix::DataInfo(); } fits_movabs_hdu(*_fitsfileptr, _matrixHash[matrix], &type, &status); fits_get_img_size( *_fitsfileptr, 2, n_axes, &status ); if (status) { return DataMatrix::DataInfo(); } DataMatrix::DataInfo info; info.samplesPerFrame = 1; info.xSize = n_axes[0]; info.ySize = n_axes[1]; char charCDelt1[] = "CDELT1"; char charCDelt2[] = "CDELT2"; double dx,dy; fits_read_key(*_fitsfileptr, TDOUBLE, charCDelt1, &dx, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCDelt2, &dy, NULL, &status); if (!status) { info.invertXHint = (dx<0); info.invertYHint = (dy<0); } return info; } QMap DataInterfaceFitsImageMatrix::metaScalars(const QString &matrix) { qDebug() << "metascalars for " << matrix; QMap M; return M; } QMap DataInterfaceFitsImageMatrix::metaStrings(const QString &matrix) { QMap M; int status = 0; int type; char instr[128]; M.clear(); if ( !*_fitsfileptr || !_matrixHash.contains( matrix ) ) { return M; } fits_movabs_hdu(*_fitsfileptr, _matrixHash[matrix], &type, &status); fits_read_key(*_fitsfileptr, TSTRING, "CTYPE1", instr, NULL, &status); if (!status) { M.insert("x_quantity", QString(instr).trimmed()); } status = 0; fits_read_key(*_fitsfileptr, TSTRING, "CTYPE2", instr, NULL, &status); if (!status) { M.insert("y_quantity", QString(instr).trimmed()); } status = 0; fits_read_key(*_fitsfileptr, TSTRING, "CRUNIT1", instr, NULL, &status); if (!status) { M.insert("x_units", QString(instr).trimmed()); } status = 0; fits_read_key(*_fitsfileptr, TSTRING, "CRUNIT2", instr, NULL, &status); if (!status) { M.insert("y_units", QString(instr).trimmed()); } status = 0; fits_read_key(*_fitsfileptr, TSTRING, "BUNIT", instr, NULL, &status); if (!status) { M.insert("z_units", QString(instr).trimmed()); } status = 0; return M; } int DataInterfaceFitsImageMatrix::read(const QString& field, DataMatrix::ReadInfo& p) { long n_axes[2], fpixel[2] = {1, 1}; double nullval = NAN; double blank = 0.0; long n_elements; int px, py, anynull; int status = 0, type; double *buffer; if ((!*_fitsfileptr) || (!_matrixHash.contains(field))) { return 0; } fits_movabs_hdu(*_fitsfileptr, _matrixHash[field], &type, &status); fits_get_img_size( *_fitsfileptr, 2, n_axes, &status ); if (status) { return 0; } n_elements = n_axes[0]*n_axes[1]; buffer = (double*)malloc(n_elements*sizeof(double)); fits_read_pix( *_fitsfileptr, TDOUBLE, fpixel, n_elements, &nullval, buffer, &anynull, &status ); // Check to see if the file is using the BLANK keyword // to indicate the NULL value for the image. This is // not correct useage for floating point images, but // it is used frequently nonetheless... char charBlank[] = "BLANK"; fits_read_key(*_fitsfileptr, TDOUBLE, charBlank, &blank, NULL, &status); if (status) { //keyword does not exist, ignore it status = 0; } else { //keyword is used, replace pixels with this value double epsilon = fabs(1e-4 * blank); for (long j = 0; j < n_elements; j++) { if (fabs(buffer[j]-blank) < epsilon) { buffer[j] = NAN; } } } int y0 = p.yStart; int y1 = p.yStart + p.yNumSteps; int x0 = p.xStart; int x1 = p.xStart + p.xNumSteps; double* z = p.data->z; int ni = p.xNumSteps * p.yNumSteps - 1; // set the suggested matrix transform params: pixel index.... double x, y, dx, dy, cx, cy; char charCRVal1[] = "CRVAL1"; char charCRVal2[] = "CRVAL2"; char charCDelt1[] = "CDELT1"; char charCDelt2[] = "CDELT2"; char charCRPix1[] = "CRPIX1"; char charCRPix2[] = "CRPIX2"; fits_read_key(*_fitsfileptr, TDOUBLE, charCRVal1, &x, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCRVal2, &y, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCDelt1, &dx, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCDelt2, &dy, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCRPix1, &cx, NULL, &status); fits_read_key(*_fitsfileptr, TDOUBLE, charCRPix2, &cy, NULL, &status); int i = 0; if ((dx<0) && (dy>0)) { for (px = p.xStart; px < x1; ++px) { for (py = y1-1; py >= p.yStart; --py) { z[ni - i] = buffer[px + py*n_axes[0]]; i++; } } } else if ((dx>0) && (dy>0)) { for (px = x1-1; px >= p.xStart; --px) { for (py = y1-1; py >= p.yStart; --py) { z[ni - i] = buffer[px + py*n_axes[0]]; i++; } } } else if ((dx>0) && (dy<0)) { for (px = x1-1; px >= p.xStart; --px) { for (py = p.yStart; py < y1; ++py) { z[ni - i] = buffer[px + py*n_axes[0]]; i++; } } } else if ((dx<0) && (dy<0)) { for (px = p.xStart; px < x1; ++px) { for (py = p.yStart; py < y1; ++py) { z[ni - i] = buffer[px + py*n_axes[0]]; i++; } } } free(buffer); if (status) { p.data->xMin = x0; p.data->yMin = y0; p.data->xStepSize = 1; p.data->yStepSize = 1; } else { dx = fabs(dx); dy = fabs(dy); p.data->xStepSize = dx; p.data->yStepSize = dy; p.data->xMin = x - cx*dx; p.data->yMin = y - cy*dy; } return(i); } bool DataInterfaceFitsImageMatrix::isValid(const QString& field) const { return _matrixHash.contains( field ); } FitsImageSource::FitsImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _config(0L), is(new DataInterfaceFitsImageString(*this)), im(new DataInterfaceFitsImageMatrix(&_fptr)) { setInterface(is); setInterface(im); setUpdateType(None); _fptr = 0L; _valid = false; if (!type.isEmpty() && type != fitsTypeString) { return; } _config = new FitsImageSource::Config; _config->read(cfg, filename); if (!e.isNull()) { _config->load(e); } if (init()) { _valid = true; } registerChange(); } FitsImageSource::~FitsImageSource() { int status = 0; if (_fptr) { fits_close_file( _fptr, &status ); _fptr = 0L; } delete _config; _config = 0L; } const QString& FitsImageSource::typeString() const { return fitsTypeString; } void FitsImageSource::reset() { init(); Object::reset(); } bool FitsImageSource::init() { int status = 0; fits_open_image( &_fptr, _filename.toAscii(), READONLY, &status ); im->clear(); _strings = fileMetas(); if (status == 0) { im->init(); registerChange(); return true; } else { fits_close_file( _fptr, &status ); _fptr = 0L; return false; } } Kst::Object::UpdateType FitsImageSource::internalDataSourceUpdate() { return (Kst::Object::NoChange); } bool FitsImageSource::isEmpty() const { return im->dataInfo(DefaultMatrixName).xSize < 1; } QString FitsImageSource::fileType() const { return fitsTypeString; } void FitsImageSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } QString FitsImagePlugin::pluginName() const { return tr("FITS Image Source Reader"); } QString FitsImagePlugin::pluginDescription() const { return tr("FITS Image Source Reader"); } Kst::DataSource *FitsImagePlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new FitsImageSource(store, cfg, filename, type, element); } QStringList FitsImagePlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(type) QStringList matrixList; if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = fitsTypeString; } if ( understands(cfg, filename) ) { fitsfile* ffits; int status = 0; int hdu; int nhdu; int type; QString name; char instr[32]; char tmpstr[1024]; fits_open_image( &ffits, filename.toAscii(), READONLY, &status ); matrixList.append( DefaultMatrixName ); fits_get_num_hdus(ffits, &nhdu, &status); for (hdu = 1; hdu <= nhdu; ++hdu) { fits_movabs_hdu(ffits, hdu, &type, &status); fits_get_hdu_type(ffits, &type, &status); if (type == IMAGE_HDU) { fits_read_key_str(ffits, "EXTNAME", instr, tmpstr, &status); if (status) { name = QString("HDU%1").arg(hdu); } else { name = QString(instr).trimmed(); } matrixList.append(name); } } fits_close_file( ffits , &status ); } return matrixList; } QStringList FitsImagePlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = fitsTypeString; } scalarList.append("FRAMES"); return scalarList; } QStringList FitsImagePlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = fitsTypeString; } stringList.append("FILENAME"); return stringList; } QStringList FitsImagePlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(type) Q_UNUSED(cfg) Q_UNUSED(filename) QStringList fieldList; if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = fitsTypeString; } return fieldList; } int FitsImagePlugin::understands(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) fitsfile* ffits; int status = 0; int ret_val = 0; int naxis; fits_open_image( &ffits, filename.toAscii(), READONLY, &status ); fits_get_img_dim( ffits, &naxis, &status); if ((status == 0) && (naxis > 1)) { ret_val = 95; } else { ret_val = 0; } // status !=0 should prevent close from having trouble... fits_close_file( ffits , &status ); return ret_val; } bool FitsImagePlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return false; } QStringList FitsImagePlugin::provides() const { QStringList rc; rc += fitsTypeString; return rc; } Kst::DataSourceConfigWidget *FitsImagePlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_qimagesource, FitsImagePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/sourcelist/0000755000175000017500000000000012362705136016663 5ustar synthsynthKst-2.0.8/src/datasources/sourcelist/kstdata_sourcelist.desktop0000644000175000017500000000122312362705136024163 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=sourcelist X-Kst-Plugin-Author=C. Barth Netterfield Name=Data Source List Name[ca]=Llista de fonts de les dades Name[ca@valencia]=Llista de fonts de les dades Name[de]=Datenquellenliste Name[fr]=Liste de sources de données Name[it]=Elenco fonte dati Name[nb]=Datakilde-liste Name[nl]=Lijst met gegevensbronnen Name[pl]=Wykaz danych źródłowych Name[pt]=Lista de Fontes de Dados Name[pt_BR]=Lista de fontes de dados Name[sk]=Zoznam zdrojov údajov Name[sv]=Lista över datakällor Name[uk]=Список джерел даних Name[x-test]=xxData Source Listxx Kst-2.0.8/src/datasources/sourcelist/sourcelist.pro0000644000175000017500000000041012277111530021566 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_sourcelist) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/sourcelist/tmp SOURCES += \ sourcelist.cpp HEADERS += \ sourcelist.h Kst-2.0.8/src/datasources/sourcelist/sourcelist.cpp0000644000175000017500000003417312320547027021570 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2013 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "sourcelist.h" #include "datasourcepluginmanager.h" #include #include #include #include #include using namespace Kst; static const QString sourceListTypeString = "List of Datasources"; // // Vector interface // class DataInterfaceSourceListVector : public DataSource::DataInterface { public: DataInterfaceSourceListVector(SourceListSource& d) : sourcelist(d) {} // read one element int read(const QString& field, DataVector::ReadInfo& p) {return sourcelist.readField(field, p);} // named elements QStringList list() const { return sourcelist._fieldList; } bool isListComplete() const { return true; } bool isValid(const QString& field) const { return sourcelist._fieldList.contains( field ); } // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } //QMap metaScalars(const QString&); //QMap metaStrings(const QString&); SourceListSource& sourcelist; }; const DataVector::DataInfo DataInterfaceSourceListVector::dataInfo(const QString &field) const { if (!sourcelist._fieldList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(sourcelist._frameCount, sourcelist.samplesPerFrame(field)); } /********************** SourceListSource::Config - This class defines the config widget that will be added to the Dialog Config Button for configuring the plugin. This is only needed for special handling required by the plugin. Many plugins will not require configuration. See plugins/sampleplugin for additional details. ***********************/ class SourceListSource::Config { public: Config() { } void read(QSettings *cfg, const QString& fileName = QString()) { Q_UNUSED(fileName); cfg->beginGroup("Source List"); cfg->endGroup(); } void save(QXmlStreamWriter& s) { Q_UNUSED(s); } void load(const QDomElement& e) { Q_UNUSED(e); } }; /********************** SourceListSource - This class defines the main DataSource which derives from DataSource. The key functions that this class must provide is the ability to create the source, provide details about the source be able to process the data. ***********************/ SourceListSource::SourceListSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _config(0L), iv(new DataInterfaceSourceListVector(*this)) { setInterface(iv); //setInterface(ix); //setInterface(is); //setInterface(im); startUpdating(None); _store = store; _valid = false; if (!type.isEmpty() && type != "Source List") { return; } _config = new SourceListSource::Config; _config->read(cfg, filename); if (!e.isNull()) { _config->load(e); } if (init()) { _valid = true; } registerChange(); } SourceListSource::~SourceListSource() { } void SourceListSource::reset() { init(); Object::reset(); } // If the datasource has any predefined fields they should be populated here. bool SourceListSource::init() { _fieldList.clear(); _scalarList.clear(); _stringList.clear(); _matrixList.clear(); _frameCount = 0; // create the child sources, and create the list _sources.clear(); // also deletes the smart pointers... _sizeList.clear(); if (!QFile::exists(_filename)) { return 0; } QFile f(_filename); if (!f.open(QIODevice::ReadOnly)) { return 0; } QByteArray line; _frameCount = 0; while (1) { line = f.readLine(5000).trimmed(); if (line.isEmpty()) { break; } // create the data source and add it to _sources DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource(_store, line); if (ds) { _sources.append(ds); } } if (_sources.size()>0) { _fieldList.append(_sources.at(0)->vector().list()); foreach (DataSourcePtr ds, _sources) { DataVector::DataInfo info = ds->vector().dataInfo(ds->vector().list().at(0)); _sizeList.append(info.frameCount); _frameCount += info.frameCount; } } startUpdating(Timer); registerChange(); return true; // false if something went wrong } int SourceListSource::samplesPerFrame(const QString &field) { if (_sources.size()>0) { DataSourcePtr ds = _sources.at(0); DataVector::DataInfo info = ds->vector().dataInfo(field); return info.samplesPerFrame; } return 1; } // Check if the data in the from the source has updated. // For source list, we only check // -if a new file has been added // -if the last file has grown. Kst::Object::UpdateType SourceListSource::internalDataSourceUpdate() { QFile f(_filename); if (!f.open(QIODevice::ReadOnly)) { return Kst::Object::NoChange; } QByteArray line; // check if the list has changed for (int i = 0; i<_sources.size(); i++) { line = f.readLine(5000).trimmed(); if (line!=_sources.at(i)->fileName()) { // error: better reset qDebug() << "source list internal ds update: file list changed"; reset(); return (Kst::Object::Updated); } } line = f.readLine(5000).trimmed(); if (!line.isEmpty()) { // create the data source and add it to _sources DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource(_store, line); if (ds) { _sources.append(ds); } } if (_sources.size()>0) { if (_fieldList.size()<1) { _fieldList.append(_sources.at(0)->vector().list()); } _sizeList.clear(); int oldFrameCount = _frameCount; _frameCount = 0; foreach (DataSourcePtr ds, _sources) { DataVector::DataInfo info = ds->vector().dataInfo(ds->vector().list().at(0)); _sizeList.append(info.frameCount); _frameCount += info.frameCount; } if (_frameCount != oldFrameCount) { return Kst::Object::Updated; } } return Kst::Object::NoChange; } // TODO a DataSource::DataInterface implementation as example QString SourceListSource::fileType() const { return "Source List"; } void SourceListSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } // 0 1000 2000 3000 // 0 1 2 3 int SourceListSource::readField(const QString& field, DataVector::ReadInfo& p) { int f0 = p.startingFrame; int nf = p.numberOfFrames; int i_file = 0; DataVector::ReadInfo ri; int samp_read = 0; int f_offset = 0; //if (f0<0 && nf >0) { // f0 = qMax(_frameCount - nf, 0); //} else if (nf<0 && f0>=0) { // nf = qMax(_frameCount-f0, 0); //} if (f0 >= 0) { while ((f0 >= _sizeList.at(i_file)) && (i_file < _sizeList.size()-1)) { f0 -= _sizeList.at(i_file); f_offset += _sizeList.at(i_file); i_file++; } if (nf>0) { while ((nf>0) && (i_file < _sizeList.size())) { int nr = qMin(nf, _sizeList.at(i_file)-f0); ri = p; ri.startingFrame = f0; ri.numberOfFrames = nr; ri.data = p.data+samp_read; if (field == "INDEX") { for (int i=0; ivector().read(field, ri); } nf -= nr; f0 = 0; f_offset += _sizeList.at(i_file); i_file++; } } else if (nf == -1) { // read one sample ri = p; ri.startingFrame = f0; ri.numberOfFrames = nf; samp_read += _sources[i_file]->vector().read(field, ri); } } return samp_read; } // Name used to identify the plugin. Used when loading the plugin. QString SourceListPlugin::pluginName() const { return tr("Source List Reader"); } QString SourceListPlugin::pluginDescription() const { return tr("Source List Reader"); } /********************** SourceListPlugin - This class defines the plugin interface to the DataSource defined by the plugin. The primary requirements of this class are to provide the necessary connections to create the object which includes providing access to the configuration widget. ***********************/ Kst::DataSource *SourceListPlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new SourceListSource(store, cfg, filename, type, element); } // Provides the matrix list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of matrices. QStringList SourceListPlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if (typeSuggestion) { *typeSuggestion = "Source List"; } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } QStringList matrixList; return matrixList; } // Provides the scalar list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of scalars if necessary. QStringList SourceListPlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Source List"; } scalarList.append("FRAMES"); return scalarList; } // Provides the string list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of strings if necessary. QStringList SourceListPlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = "Source List"; } stringList.append("FILENAME"); return stringList; } // Provides the field list that this dataSource can provide from the provided filename. // This function should use understands to validate the file and then open and calculate the // list of fields if necessary. QStringList SourceListPlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(cfg) Q_UNUSED(filename) Q_UNUSED(type) if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = "Source List"; } QStringList fieldList; return fieldList; } // The main function used to determine if this plugin knows how to process the provided file. // Each datasource plugin should check the file and return a number between 0 and 100 based // on the likelyhood of the file being this type. 100 should only be returned if there is no way // that the file could be any datasource other than this one. int SourceListPlugin::understands(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) if (!QFile::exists(filename)) { return 0; } QFile f(filename); if (f.open(QIODevice::ReadOnly)) { QByteArray line; int i; for (i=0; i<5; i++) { line = f.readLine(5000).trimmed(); if (line.isEmpty()) { break; } if (!QFile::exists(line) && !QFileInfo(line).isDir()) { return 0; } } if (i>0) { // all lines (1 or more) listed files return 80; } } return 0; } bool SourceListPlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return true; } QStringList SourceListPlugin::provides() const { QStringList rc; rc += sourceListTypeString; return rc; } // Request for this plugins configuration widget. Kst::DataSourceConfigWidget *SourceListPlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_SourceList, SourceListPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/sourcelist/sourcelist.h0000644000175000017500000001050412277111530021222 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SOURCELIST_H #define SOURCELIST_H #include #include class DataInterfaceSourceListVector; class DataInterfaceSourceListScalar; class DataInterfaceSourceListString; class DataInterfaceSourceListMatrix; using namespace Kst; class SourceListSource : public Kst::DataSource { Q_OBJECT public: SourceListSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~SourceListSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); QString fileType() const; void save(QXmlStreamWriter &streamWriter); class Config; int samplesPerFrame(const QString &field); int readField(const QString& field, DataVector::ReadInfo& p); private: mutable Config *_config; int _frameCount; QStringList _scalarList; QStringList _stringList; QStringList _fieldList; QStringList _matrixList; DataInterfaceSourceListVector* iv; //DataInterfaceSourceListScalar* ix; //DataInterfaceSourceListString* is; //DataInterfaceSourceListMatrix* im; friend class DataInterfaceSourceListVector; //friend class DataInterfaceSourceListScalar; //friend class DataInterfaceSourceListString; //friend class DataInterfaceSourceListMatrix; DataSourceList _sources; QList _sizeList; }; class SourceListPlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~SourceListPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/qimagesource/0000755000175000017500000000000012362705136017153 5ustar synthsynthKst-2.0.8/src/datasources/qimagesource/qimagesource.cpp0000644000175000017500000003255512320547027022352 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "qimagesource.h" #include #include #include using namespace Kst; static const QString qimageTypeString = "QImage image"; class QImageSource::Config { public: Config() { } void read(QSettings *cfg, const QString& fileName = QString()) { Q_UNUSED(fileName); cfg->beginGroup(qimageTypeString); cfg->endGroup(); } void save(QXmlStreamWriter& s) { Q_UNUSED(s); } void load(const QDomElement& e) { Q_UNUSED(e); } }; // // Vector interface // class DataInterfaceQImageVector : public DataSource::DataInterface { public: DataInterfaceQImageVector(QImage* img) : _image(img) {} // read one element int read(const QString&, DataVector::ReadInfo&); // named elements QStringList list() const { return _vectorList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataVector::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataVector::DataInfo&) {} // meta data QMap metaScalars(const QString&); QMap metaStrings(const QString&) { return QMap(); } // no interface QImage* _image; QStringList _vectorList; int _frameCount; void init(); void clear(); }; void DataInterfaceQImageVector::clear() { _vectorList.clear(); _frameCount = 0; } void DataInterfaceQImageVector::init() { _vectorList.append( "GRAY" ); _vectorList.append( "RED" ); _vectorList.append( "GREEN" ); _vectorList.append( "BLUE" ); } const DataVector::DataInfo DataInterfaceQImageVector::dataInfo(const QString &field) const { if (!_vectorList.contains(field)) return DataVector::DataInfo(); return DataVector::DataInfo(_frameCount, 1); } int DataInterfaceQImageVector::read(const QString& field, DataVector::ReadInfo& p) { int i = 0; int s = p.startingFrame; int n = p.numberOfFrames; if ( field=="INDEX" ) { for ( i=0; iwidth(); int py = i/_image->width(); p.data[i-s] = qGray( _image->pixel( px, py ) ); } } else if ( field=="RED" ) { for ( i=s; iwidth(); int py = i/_image->width(); p.data[i-s] = qRed( _image->pixel( px, py ) ); } } else if ( field=="GREEN" ) { for ( i=s; iwidth(); int py = i/_image->width(); p.data[i-s] = qGreen( _image->pixel( px, py ) ); } } else if ( field=="BLUE" ) { for ( i=s; iwidth(); int py = i/_image->width(); p.data[i-s] = qBlue( _image->pixel( px, py ) ); } } return i; } bool DataInterfaceQImageVector::isValid(const QString& field) const { return _vectorList.contains( field ); } // TODO FRAMES only in vector? QMap DataInterfaceQImageVector::metaScalars(const QString&) { QMap m; m["FRAMES"] = _frameCount; return m; } // // Matrix interface // class DataInterfaceQImageMatrix : public DataSource::DataInterface { public: DataInterfaceQImageMatrix(QImage* img) : _image(img) {} // read one element int read(const QString&, DataMatrix::ReadInfo&); // named elements QStringList list() const { return _matrixList; } bool isListComplete() const { return true; } bool isValid(const QString&) const; // T specific const DataMatrix::DataInfo dataInfo(const QString&) const; void setDataInfo(const QString&, const DataMatrix::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } // no interface QImage* _image; QStringList _matrixList; void init(); void clear(); }; void DataInterfaceQImageMatrix::clear() { _matrixList.clear(); } void DataInterfaceQImageMatrix::init() { _matrixList.append( "GRAY" ); _matrixList.append( "RED" ); _matrixList.append( "GREEN" ); _matrixList.append( "BLUE" ); } const DataMatrix::DataInfo DataInterfaceQImageMatrix::dataInfo(const QString& matrix) const { if ( !_image || _image->isNull() || !_matrixList.contains( matrix ) ) { return DataMatrix::DataInfo(); } DataMatrix::DataInfo info; info.samplesPerFrame = 1; info.xSize = _image->width(); info.ySize = _image->height(); return info; } int DataInterfaceQImageMatrix::read(const QString& field, DataMatrix::ReadInfo& p) { if ( _image->isNull() ) { return 0; } int y0 = p.yStart; int y1 = p.yStart + p.yNumSteps; int x0 = p.xStart; int x1 = p.xStart + p.xNumSteps; double* z = p.data->z; int i = 0; if ( field=="GRAY") { for (int px = p.xStart; px=p.yStart; py-- ) { z[i] = qGray( _image->pixel( px, py ) ); ++i; } } } else if ( field=="RED" ) { for (int px = p.xStart; px=p.yStart; py-- ) { z[i] = qRed( _image->pixel( px, py ) ); ++i; } } } else if ( field=="GREEN" ) { for (int px = p.xStart; px=p.yStart; py-- ) { z[i] = qGreen( _image->pixel( px, py ) ); ++i; } } } else if ( field=="BLUE" ) { for (int px = p.xStart; px=p.yStart; py-- ) { z[i] = qBlue( _image->pixel( px, py ) ); ++i; } } } // set the suggested matrix transform params: pixel index.... p.data->xMin = x0; p.data->yMin = y0; p.data->xStepSize = 1; p.data->yStepSize = 1; return i; } bool DataInterfaceQImageMatrix::isValid(const QString& field) const { return _matrixList.contains( field ); } // // QImageSource // QImageSource::QImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e) : Kst::DataSource(store, cfg, filename, type), _config(0L), iv(new DataInterfaceQImageVector(&_image)), im(new DataInterfaceQImageMatrix(&_image)) { setInterface(iv); setInterface(im); startUpdating(None); _valid = false; if (!type.isEmpty() && type != qimageTypeString) { return; } _config = new QImageSource::Config; _config->read(cfg, filename); if (!e.isNull()) { _config->load(e); } _image = QImage(); if (init()) { _valid = true; } registerChange(); } QImageSource::~QImageSource() { delete _config; _config = 0L; } const QString& QImageSource::typeString() const { return qimageTypeString; } void QImageSource::reset() { init(); Object::reset(); } bool QImageSource::init() { _image = QImage(); iv->clear(); im->clear(); if (!_image.load( _filename ) ) { return false; } iv->init(); im->init(); registerChange(); return true; } Kst::Object::UpdateType QImageSource::internalDataSourceUpdate() { int newNF = _image.width()*_image.height(); bool isnew = newNF != iv->_frameCount; iv->_frameCount = newNF; return (isnew ? Kst::Object::Updated : Kst::Object::NoChange); } bool QImageSource::isEmpty() const { return iv->_frameCount < 1; } QString QImageSource::fileType() const { return qimageTypeString; } void QImageSource::save(QXmlStreamWriter &streamWriter) { Kst::DataSource::save(streamWriter); } /* TODO needed? int QImageSource::readScalar(double &S, const QString& scalar) { if (scalar == "FRAMES") { S = _frameCount; return 1; } return 0; } int QImageSource::readString(QString &S, const QString& string) { if (string == "FILE") { S = _filename; return 1; } return 0; } */ // // QImageSourcePlugin // QString QImageSourcePlugin::pluginName() const { return tr("QImage Source Reader"); } QString QImageSourcePlugin::pluginDescription() const { return tr("QImage Source Reader"); } Kst::DataSource *QImageSourcePlugin::create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const { return new QImageSource(store, cfg, filename, type, element); } QStringList QImageSourcePlugin::matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { if (typeSuggestion) { *typeSuggestion = qimageTypeString; } if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } QStringList matrixList; if (complete) { *complete = true; } if ( !QImageReader::imageFormat( filename ).isEmpty() ) { matrixList.append( "GRAY" ); matrixList.append( "RED" ); matrixList.append( "GREEN" ); matrixList.append( "BLUE" ); } return matrixList; } QStringList QImageSourcePlugin::scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList scalarList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = qimageTypeString; } scalarList.append("FRAMES"); return scalarList; } QStringList QImageSourcePlugin::stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { QStringList stringList; if ((!type.isEmpty() && !provides().contains(type)) || 0 == understands(cfg, filename)) { if (complete) { *complete = false; } return QStringList(); } if (typeSuggestion) { *typeSuggestion = qimageTypeString; } stringList.append("FILENAME"); return stringList; } QStringList QImageSourcePlugin::fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const { Q_UNUSED(type) Q_UNUSED(cfg) QStringList fieldList; if (complete) { *complete = true; } if (typeSuggestion) { *typeSuggestion = qimageTypeString; } if ( !QImageReader::imageFormat( filename ).isEmpty() ) { fieldList.append("INDEX"); fieldList.append( "GRAY" ); fieldList.append( "RED" ); fieldList.append( "GREEN" ); fieldList.append( "BLUE" ); } return fieldList; } int QImageSourcePlugin::understands(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) QList formats = QImageReader::supportedImageFormats(); bool matches = false; foreach (const QByteArray &ext, formats) { if (filename.toLower().endsWith(ext.toLower())) { matches = true; break; } } if (!matches) { return 0; } QString ftype( QImageReader::imageFormat( filename ) ); if ( ftype.isEmpty() ) return 0; //QImageReader is incorrectly identifying some ascii files with // images. Enforce filenames (may not be needed anymore, since // we already know that the extension matches *some* image format. //if ( ftype == "TIFF" ) { // if ( !filename.toLower().endsWith(".tif") ) return 0; //} //if ( ftype == "pcx" ) { // if ( !filename.toLower().endsWith(".pcx") ) return 0; //} return 90; } bool QImageSourcePlugin::supportsTime(QSettings *cfg, const QString& filename) const { //FIXME Q_UNUSED(cfg) Q_UNUSED(filename) return true; } QStringList QImageSourcePlugin::provides() const { QStringList rc; rc += qimageTypeString; return rc; } Kst::DataSourceConfigWidget *QImageSourcePlugin::configWidget(QSettings *cfg, const QString& filename) const { Q_UNUSED(cfg) Q_UNUSED(filename) return 0;; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstdata_qimagesource, QImageSourcePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/qimagesource/qimagesource.pro0000644000175000017500000000042012277111530022347 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/../../../datasourceplugin.pri) TARGET = $$kstlib(kst2data_qimagesource) INCLUDEPATH += $$OUTPUT_DIR/src/datasources/qimagesource/tmp SOURCES += \ qimagesource.cpp HEADERS += \ qimagesource.h Kst-2.0.8/src/datasources/qimagesource/kstdata_qimagesource.desktop0000644000175000017500000000270612362705136024752 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-KDE-Library=qimagesource X-Kst-Plugin-Author=The University of Toronto Name=qimagesource Name[ca]=Font QImage Name[ca@valencia]=Font QImage Name[de]=QImagesource Name[fr]=qimagesource Name[it]=qimagesource Name[nb]=qimagesource Name[nl]=qimagesource Name[pl]=qimagesource Name[pt]=Fonte QImage Name[pt_BR]=Fonte QImage Name[sk]=qimagesource Name[sv]=qimage-källa Name[uk]=qimagesource Name[x-test]=xxqimagesourcexx Comment=Plugin to read a qimage compatible image. Comment[ca]=Connector per llegir una imatge compatible amb QImage. Comment[ca@valencia]=Connector per llegir una imatge compatible amb QImage. Comment[de]=Modul zum Lesen von QImage-kompatiblen Bildern Comment[fr]=Module pour lire une image compatible qimage. Comment[it]=Esrensione per leggere un'immagine qimage compatibile. Comment[nb]=Programtillegg som leser et bilde kompatibelt med qimage. Comment[nl]=Plugin voor het lezen van afbeeldingen die compatibel zijn met gimage. Comment[pl]=Wtyczka do odczytywania obrazów zgodnych z qimage. Comment[pt]=Um 'plugin' para ler uma imagem compatível com a QImage. Comment[pt_BR]=Plugin para ler uma imagem compatível com a QImage. Comment[sv]=Insticksprogram för att läsa en qimage-kompatibel bild. Comment[uk]=Додаток для читання зображень, сумісних з форматом qimage. Comment[x-test]=xxPlugin to read a qimage compatible image.xx Kst-2.0.8/src/datasources/qimagesource/qimagesource.h0000644000175000017500000000752012277111530022006 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef QIMAGESOURCE_H #define QIMAGESOURCE_H #include #include class DataInterfaceQImageVector; class DataInterfaceQImageMatrix; class QImageSource : public Kst::DataSource { Q_OBJECT public: QImageSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e); ~QImageSource(); bool init(); virtual void reset(); Kst::Object::UpdateType internalDataSourceUpdate(); bool isEmpty() const; QString fileType() const; void save(QXmlStreamWriter &streamWriter); virtual const QString& typeString() const; class Config; //int readScalar(double &S, const QString& scalar); //int readString(QString &S, const QString& string); private: QImage _image; mutable Config *_config; DataInterfaceQImageVector* iv; DataInterfaceQImageMatrix* im; }; class QImageSourcePlugin : public QObject, public Kst::DataSourcePluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataSourcePluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0") public: virtual ~QImageSourcePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual bool hasConfigWidget() const { return false; } virtual Kst::DataSource *create(Kst::ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const; virtual int understands(QSettings *cfg, const QString& filename) const; virtual bool supportsTime(QSettings *cfg, const QString& filename) const; virtual QStringList provides() const; virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/datasources/HOWTO_add_a_datasource.txt0000644000175000017500000001430612320547027021453 0ustar synthsynth*** Introduction *** You can find here detailed instructions how to add a custom datasource to Kst (version 2.x), i.e. make it read a new file format. Kst offers a plugin-based framework for datasources, allowing you to add support for your own datasource (or file format) fairly easily. You basically need to implement 3 classes derived from classes provided by Kst. A good starting point is to copy the sampledatasource/ directory and start implementing the functions. It is advisable to have some understanding of C++, and to have a look at other implementations, particularly the initial svn commit for this file which shows more or less all the bits required to add complete support for a new file type, in that case Matlab's .mat using the matio/ library. The use of the excellent QtCreator tool can make your life much easier, with code-completion, code navigation and integrated documentation. If you have plans to develop for Kst, we recommend contacting us on the kst@kde.org mailing list to announce your plans and discuss technical issues as well as to get some support. *** Outline *** The way Kst accesses data is completely decoupled from the internal plotting and computation logics. Basically, you *have to* implement the following methods for your new datasource: - Test if a file is supported (may be as simple as checking the file extension, or some magic number in the header) - Return the list of scalars, vectors, matrices and strings available. Don't worry if only some of the types are supported. - For a given data item, return the number of samples available - For a given data item, return a range of values (i.e. samples #100 to #199) When this is done, just add the new datasource to the build (details below) and start debugging (unless you're a code guru and got it right directly)! On top of that basic functionality, you *may* also add the following optional features: - Support for file or data item metadata, e.g. scalars or strings adding some information to the data item like units or experiment conditions. If you want to support metadata, you may want to look at the netCDF datasource which currently has a quite extensive support for metadata. Metadata can be browsed via the View->Scalars/Vectors/Strings/Matrices menus. - Support for real-time (streaming) data, i.e. files which are being written to and read/plotted from simultaneously. ASCII and dirfilesource implement such a feature (check the internalDataSourceUpdate() method) - Support for time-based access (warning: this feature is not really used right now and probably still has some rough edges) *** Step-by-step instructions (minimal datasource), based on the matlab example *** replace "matlab" with your file type *** ** Step 1: Create the source directory and do the initial configuration ** - Copy the sampledatasource directory (warning: don't copy the .svn subfolder!!!): "mkdir matlab; cp sampledatasource/* matlab/" - Change the names of all files to something more relevant (sampledatasource -> matio) - Edit the contents of the .desktop file, especially the X-KDE-Library entry - Edit the .pro file (if you are using qmake, which is being deprecated) or the [root]/src/datasources/CMakeList.txt file to activate the build. If needed, look at other examples to see how to detect the presence of the required librqries to make it conditional (check [root]/cmake/modules) - Once the output of cmake is as wished, the data source will be compiled: start filling out the contents of the actual code files ** Step 2: Implement the important classes ** To get your datasource to work, you have to: 1a) Implement the MatlabSourcePlugin::provides() (trivial) 1b) Implement MatlabSourcePlugin::understands() For that second function, the easiest is to check only the file extension. All plugins are queried to select the most appropriate one. The plugin which returns the highest number is chosen. By convention 100 means the plugin can certainly understand it, and 0 means it certainly cannot. 80 is a reasonable number if you are reasonably sure this plugin is correct. 2) Decide which kind of primitives you want to support. Primitives are scalars (1 value), strings, vectors (an array of values) and matrices (2-dimensional arrays). The most usual type to support is vector, you will probably want to start with that. The interface between Kst core and the datasource plugins uses templates. See the definition of DataInterfaceMatlabVector for an example, and note that since it uses templates the declaration and implementation have to be in the .cpp file. The classes you implement (as a minimum MatlabSourcePlugin, MatlabSource and DataInterfaceMatlabVector) can be all together in the same file, or one per file. 3) Implement the most important functions: -MatlabSource::MatlabSource -MatlabSource::~MatlabSource -MatlabSource::init() - most of the interesting data is usually gathered and cached into member variables here -MatlabSource::readField() - returns a range of values for a given vector, and possibly some others in MatlabSource. 4) Implement the interface for each primitive, which is mostly only a thin layer above the data source class. Start with DataInterfaceMatlabVector and add other types progressively. Hints: you can use qDebug() as a stream to produce debug output, and the Help->Debug Dialog also provides some interesting information, in particular plugin loading errors. ** Step 3: Polish ** This step is important, don't neglect it! It is important to check: - That your code is well documented/commented and easy to understand - That you don't have crashes or memleaks. Beware the conversions to double, this can be tricky and Kst always expects double values! - If you can add some metadata support. Each primitive supports meta-strings and meta-scalars. See netCDF for details. - Whether you can improve your data source by adding a configuration widget. Currently only ASCII provides one, so look there for inspiration (warning: ASCII is complex!) - If performance can be improved (performance is very important to Kst!!!) - If some sample files can be added to the sample_data/ subdir so that others can perform some tests if required Kst-2.0.8/src/widgets/0000755000175000017500000000000012362705136013620 5ustar synthsynthKst-2.0.8/src/widgets/datarange.ui0000644000175000017500000002121112277111530016074 0ustar synthsynth DataRange 0 0 611 156 0 0 0 0 Data Range false 0 0 Select this to average the skipped frames together. Provides simple low pass filtering. Boxcar &filter first 0 0 Save memory by sparsely sampling the data Select this to skip frames, rather than reading all of the data. This is useful for reading very long but slowly changing data files. Read &1 sample per: 0 0 Select this to read all of the data up to the end of the file. Read to &end true 0 0 or false 0 0 or false Select this to read data from the end of the file. This is useful for scrolling displays when the file is being appended by another application. Co&unt from end false Number of frames to skip, if "Read 1 sample per" is selected. frame(s) 1 2147483647 0 0 &Start: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _start 0 0 Select this to average the skipped frames together. Provides simple low pass filtering. &Range: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _range Input a number (starting from 0 for the first value), or the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates. The index of the first data read. For ASCII files, this is the data row number in the file. For frame based files, this is the first frame. 0 false Input a number (starting from 0 for the first value), or the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates. The amount of data to read into the vector. For ASCII files, this is the number of data rows. For frame files there may be more than one sample per frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]. start units false range units _start _startUnits _countFromEnd _range _rangeUnits _readToEnd _doSkip _skip _doFilter Kst-2.0.8/src/widgets/fftoptions.h0000644000175000017500000000553412277111530016165 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FFTOPTIONS_H #define FFTOPTIONS_H #include #include "ui_fftoptions.h" #include "psd.h" #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT FFTOptions : public QWidget, public Ui::FFTOptions { Q_OBJECT public: explicit FFTOptions(QWidget *parent = 0); ~FFTOptions(); double sampleRate() const; bool sampleRateDirty() const; void setSampleRate(const double sampleRate); double sigma() const; bool sigmaDirty() const; void setSigma(const double sigma); bool interleavedAverage() const; bool interleavedAverageDirty() const; void setInterleavedAverage(const bool interleavedAverage); int FFTLength() const; bool FFTLengthDirty() const; void setFFTLength(const int FFTLength); bool apodize() const; bool apodizeDirty() const; void setApodize(const bool apodize); bool removeMean() const; bool removeMeanDirty() const; void setRemoveMean(const bool removeMean); QString vectorUnits() const; bool vectorUnitsDirty() const; void setVectorUnits(const QString vectorUnits); QString rateUnits() const; bool rateUnitsDirty() const; void setRateUnits(const QString rateUnits); ApodizeFunction apodizeFunction() const; bool apodizeFunctionDirty() const; void setApodizeFunction(const ApodizeFunction apodizeFunction); PSDType output() const; bool outputDirty() const; void setOutput(const PSDType output); bool interpolateOverHoles() const; bool interpolateOverHolesDirty() const; void setInterpolateOverHoles(const bool interpolateOverHoles); void disableInterpolateOverHoles(); void clearValues(); void setWidgetDefaults(); void loadWidgetDefaults(); Q_SIGNALS: void modified(); public slots: void changedApodizeFxn(); void clickedInterleaved(); void clickedApodize(); void synch(); bool checkValues(); bool checkGivenValues(double sampRate, int FFTLen); private: void init(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/stringselector.cpp0000644000175000017500000001037512277111530017373 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "stringselector.h" #include "dialoglauncher.h" #include "objectstore.h" namespace Kst { StringSelector::StringSelector(QWidget *parent, ObjectStore *store) : QWidget(parent), _allowEmptySelection(false), _store(store) { setupUi(this); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _newString->setIcon(QPixmap(":kst_stringnew.png")); _editString->setIcon(QPixmap(":kst_stringedit.png")); _newString->setFixedSize(size + 8, size + 8); _editString->setFixedSize(size + 8, size + 8); _selectString->setFixedSize(size + 8, size + 8); fillStrings(); connect(_newString, SIGNAL(pressed()), this, SLOT(newString())); connect(_editString, SIGNAL(pressed()), this, SLOT(editString())); connect(_string, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSelectionChanged())); connect(_string, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDescriptionTip())); } StringSelector::~StringSelector() { } void StringSelector::setObjectStore(ObjectStore *store) { _store = store; fillStrings(); } void StringSelector::updateDescriptionTip() { if (selectedString()) { setToolTip(selectedString()->descriptionTip()); } else { setToolTip(QString()); } } void StringSelector::emitSelectionChanged() { emit selectionChanged(_string->currentText()); } StringPtr StringSelector::selectedString() const { return _string->itemData(_string->currentIndex()).value(); } void StringSelector::setSelectedString(StringPtr selectedString) { int i=-1; for (int j=0; j<_string->count() ; ++j) { if (selectedString.data() == _string->itemData(j).value()) { i=j; break; } } Q_ASSERT(i != -1); _string->setCurrentIndex(i); } void StringSelector::newString() { QString stringName; DialogLauncher::self()->showStringDialog(stringName, 0, true); fillStrings(); StringPtr string = kst_cast(_store->retrieveObject(stringName)); if (string) { setSelectedString(string); emitSelectionChanged(); } } void StringSelector::editString() { QString stringName; DialogLauncher::self()->showStringDialog(stringName, ObjectPtr(selectedString()), true); fillStrings(); } void StringSelector::fillStrings() { if (!_store) { return; } QHash strings; StringList stringList = _store->getObjects(); StringList::ConstIterator it = stringList.constBegin(); for (; it != stringList.constEnd(); ++it) { StringPtr string = (*it); string->readLock(); strings.insert(string->CleanedName(), string); string->unlock(); } QStringList list = strings.keys(); qSort(list); StringPtr current = selectedString(); _string->clear(); foreach (const QString &string, list) { StringPtr s = strings.value(string); _string->addItem(string, qVariantFromValue(s.data())); } if (_allowEmptySelection) //reset the setAllowEmptySelection(true); if (current) setSelectedString(current); _editString->setEnabled(_string->count() > 0); } bool StringSelector::allowEmptySelection() const { return _allowEmptySelection; } void StringSelector::setAllowEmptySelection(bool allowEmptySelection) { _allowEmptySelection = allowEmptySelection; int i = _string->findText(tr("")); if (i != -1) _string->removeItem(i); if (_allowEmptySelection) { _string->insertItem(0, tr(""), qVariantFromValue(0)); _string->setCurrentIndex(0); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/stringselector.ui0000644000175000017500000000544612277111530017231 0ustar synthsynth StringSelector 0 0 296 35 0 0 Select a string to utilize. If you wish to create a new string, select the icon to the right. 0 0 0 QComboBox::AdjustToMinimumContentsLength 0 0 ... 0 0 Create a new string. false 0 0 Edit selected string. Kst::ComboBox QComboBox

combobox.h
_string _selectString _newString _editString Kst-2.0.8/src/widgets/dialogdefaults.h0000644000175000017500000001052312277111530016753 0ustar synthsynth/*************************************************************************** dialogdefaults.h ------------------- begin : November 13, 2007 copyright : (C) 2007 C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KSTDIALOGDEFAULTS #define KSTDIALOGDEFAULTS #include "datavector.h" #include "psd.h" #include "generatedvector.h" #include "datamatrix.h" #include "histogram.h" #include "kstwidgets_export.h" class QSettings; namespace Kst { KSTWIDGETS_EXPORT QSettings& dialogDefaults(); KSTWIDGETS_EXPORT void setDataVectorDefaults(DataVectorPtr); KSTWIDGETS_EXPORT void setGenVectorDefaults(GeneratedVectorPtr V); KSTWIDGETS_EXPORT void setDataMatrixDefaults(DataMatrixPtr M); KSTWIDGETS_EXPORT void setHistogramDefaults(HistogramPtr H); KSTWIDGETS_EXPORT void saveDialogDefaultsBrush(const QString &group_name, const QBrush &b); KSTWIDGETS_EXPORT void saveDialogDefaultsLockPosToData(const QString &group_name, const bool lockPosToData); KSTWIDGETS_EXPORT void saveDialogDefaultsPen(const QString &group_name, const QPen &p); KSTWIDGETS_EXPORT QBrush dialogDefaultsBrush(const QString &group_name); KSTWIDGETS_EXPORT QPen dialogDefaultsPen(const QString &group_name); KSTWIDGETS_EXPORT bool dialogDefaultsLockPosToData(const QString &group_name); } #endif // Dialog defaults are stored and retrieved from the Kst::dialogDefaults. // As you add defaults, add them here! // Name Type Where used // vector/datasource QString vectordialog datawizard // vector/range int datarange // vector/start int datarange // vector/countFromEnd bool datarange // vector/readToEnd bool datarange // vector/skip int datarange // vector/doSkip bool datarange // vector/doAve bool datarange // // genVector/min" int vectordialog // genVector/max" int vectordialog // genVector/length int vectordialog // spectrum/freq double FFToptions // spectrum/average bool FFToptions // spectrum/len int FFToptions // spectrum/apodize bool FFToptions // spectrum/removeMean bool FFToptions // spectrum/vUnits QString FFToptions // spectrum/rUnits QString FFToptions // spectrum/apodizeFxn int FFToptions // spectrum/gaussianSigma double FFToptions // spectrum/output int FFToptions // spectrum/interpolateHoles bool FFToptions // curve/xvectorfield QString datawizard, curvedialog // export/filename QString exportgraphicsdialog // export/format QString exportgraphicsdialog // export/xsize exportgraphicsdialog // export/ysize exportgraphicsdialog // export/sizeOption exportgraphicsdialog // picture/startdir pictureitem.cpp // histogram/realTimeAutoBin histogramdialog.cpp // matrix/datasource matrixdialog.cpp // matrix/reqXStart matrixdialog.cpp // matrix/reqYStart matrixdialog.cpp // matrix/xCountFromEnd matrixdialog.cpp // matrix/xNumSteps matrixdialog.cpp // matrix/xReadToEnd matrixdialog.cpp // matrix/yCountFromEnd matrixdialog.cpp // matrix/yNumSteps matrixdialog.cpp // matrix/yReadToEnd matrixdialog.cpp // wizard/doPSD bool datawizard.cpp // wizard/doXY bool datawizard.cpp // wizard/curvePlacement enum datawizard.cpp // wizard/plotCount int datawizard.cpp // changedatafile/newFileName QString changefiledialog.cpp Kst-2.0.8/src/widgets/scalarlistselector.h0000644000175000017500000000260212277111530017665 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SCALARLISTSELECTOR_H #define SCALARLISTSELECTOR_H #include #include "ui_scalarlistselector.h" #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT ScalarListSelector : public QDialog, public Ui::ScalarListSelector { Q_OBJECT public: explicit ScalarListSelector(QWidget *parent = 0); virtual ~ScalarListSelector(); QString selectedScalar() const; void fillScalars(QStringList& scalars); void clear(); public Q_SLOTS: void filter(const QString& filter); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/filerequester.h0000644000175000017500000000325212277111530016644 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FILEREQUESTER_H #define FILEREQUESTER_H #include #include #include "kstwidgets_export.h" class QLineEdit; class QToolButton; namespace Kst { class KSTWIDGETS_EXPORT FileRequester : public QWidget { Q_OBJECT Q_PROPERTY(QString file READ file WRITE setFile USER true) public: explicit FileRequester(QWidget *parent = 0); virtual ~FileRequester(); QString file() const; void setMode(QFileDialog::FileMode mode) { _mode = mode; } QLineEdit *_fileEdit; public Q_SLOTS: void setFile(const QString &file); void updateFile(const QString &file); Q_SIGNALS: void changed(const QString &file); private Q_SLOTS: void chooseFile(); private: void setup(); QToolButton *_fileButton; QString _file; QFileDialog::FileMode _mode; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveplacement.ui0000644000175000017500000002065112277111530017172 0ustar synthsynth CurvePlacement 0 0 368 177 0 0 Placement Scale fonts true 0 0 Place in &new plot true 0 0 In ne&w tab false 0 0 The name of the data file which will be read for this vector. true QComboBox::InsertAtTop QComboBox::AdjustToMinimumContentsLength true false place In Existing Plot 0 0 Place in &existing plot 0 0 Do not pl&ace in any plot Qt::Horizontal QSizePolicy::Fixed 20 20 0 0 true 0 0 0 0 Automati&c layout true 0 0 Custom &grid false 1 10 false 0 0 Colu&mns _gridColumns &Protect existing layout _noPlot _existingPlot _newPlot _newTab _scaleFonts _autoLayout _customGrid _gridColumns _protectLayout Kst-2.0.8/src/widgets/datasourceselectordialog.cpp0000644000175000017500000000606412277111530021377 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasourceselectordialog.h" #include "datasource.h" #include "datasourcepluginmanager.h" #include #include namespace Kst { DataSourceSelectorDialog::DataSourceSelectorDialog(QString &file, QWidget *parent) : QFileDialog(parent) { setFileMode(QFileDialog::Directory); selectFile(file); currentChanged(file); connect(this, SIGNAL(currentChanged(QString)), this, SLOT(currentChanged(QString))); } DataSourceSelectorDialog::~DataSourceSelectorDialog() { } QString DataSourceSelectorDialog::selectedDataSource() { return selectedFiles().first(); } void DataSourceSelectorDialog::currentChanged(const QString ¤t) { //qDebug() << "currentChanged" << current; if (current.isEmpty()) { setFileMode(QFileDialog::Directory); } else { QFileInfo fileInfo(current); if (fileInfo.isDir()) { //qDebug() << "Directory Selected - valid?" << DataSourcePluginManager::validSource(current); if (DataSourcePluginManager::validSource(current)) { setFileMode(QFileDialog::Directory); } else { setFileMode(QFileDialog::ExistingFile); } } else if (fileInfo.exists()) { //qDebug() << "File Selected - valid?" << DataSourcePluginManager::validSource(current); if (DataSourcePluginManager::validSource(current)) { setFileMode(QFileDialog::ExistingFile); } else { setFileMode(QFileDialog::Directory); } } } QStringList filters; filters << "Any files (*)"; setNameFilters(filters); } void DataSourceSelectorDialog::accept() { QStringList files = selectedFiles(); if (files.isEmpty()) { return; } for (int i = 0; i < files.count(); ++i) { QFileInfo info(files.at(i)); if (!info.exists()) { #ifndef QT_NO_MESSAGEBOX QString message = tr("%1\nFile not found.\nPlease verify the " "correct file name was given."); QMessageBox::warning(this, windowTitle(), message.arg(info.fileName())); #endif // QT_NO_MESSAGEBOX return; } if (info.isDir()) { if (info.fileName().isEmpty() || (info.filePath() == directory().path())) { QDialog::accept(); return; } } } QFileDialog::accept(); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/datarange.cpp0000644000175000017500000001522612277111530016252 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datarange.h" #include "dialogdefaults.h" namespace Kst { DataRange::DataRange(QWidget *parent) : QWidget(parent) { setupUi(this); connect(_countFromEnd, SIGNAL(toggled(bool)), this, SLOT(countFromEndChanged())); connect(_readToEnd, SIGNAL(toggled(bool)), this, SLOT(readToEndChanged())); connect(_doSkip, SIGNAL(toggled(bool)), this, SLOT(doSkipChanged())); connect(_start, SIGNAL(textChanged(QString)), this, SIGNAL(modified())); connect(_range, SIGNAL(textChanged(QString)), this, SIGNAL(modified())); connect(_skip, SIGNAL(valueChanged(int)), this, SIGNAL(modified())); connect(_doFilter, SIGNAL(toggled(bool)), this, SIGNAL(modified())); connect(_countFromEnd, SIGNAL(toggled(bool)), this, SIGNAL(modified())); connect(_readToEnd, SIGNAL(toggled(bool)), this, SIGNAL(modified())); connect(_doSkip, SIGNAL(toggled(bool)), this, SIGNAL(modified())); QLabel* siHack=new QLabel(this); siHack->hide(); siHack->setProperty("si","read 1 sample per"); siHack->setBuddy(_skip); } DataRange::~DataRange() { } void DataRange::clearValues() { _start->clear(); _range->clear(); _skip->clear(); _doFilter->setCheckState(Qt::PartiallyChecked); _readToEnd->setCheckState(Qt::PartiallyChecked); _doSkip->setCheckState(Qt::PartiallyChecked); } qreal DataRange::start() const { return _start->text().toDouble(); } bool DataRange::startDirty() const { return !_start->text().isEmpty(); } void DataRange::setStart(qreal start) { _start->setText(QString::number(start, 'g', 12)); } void DataRange::clearIndexList() { _startUnits->clear(); _rangeUnits->clear(); } void DataRange::updateIndexList(const QStringList &indexFields) { _startUnits->clear(); _startUnits->addItems(indexFields); setStartUnits(_requestedStartUnits); _rangeUnits->clear(); _rangeUnits->addItems(indexFields); setRangeUnits(_requestedRangeUnits); } QString DataRange::startUnits() const { return _startUnits->currentText(); } int DataRange::startUnitsIndex() const { return _startUnits->currentIndex(); } void DataRange::setStartUnits(const QString &startUnits) { _requestedStartUnits = startUnits; int i = _startUnits->findText(startUnits); if (i>=0) { _startUnits->setCurrentIndex(i); } } qreal DataRange::range() const { return _range->text().toDouble(); } int DataRange::rangeUnitsIndex() const { return _rangeUnits->currentIndex(); } bool DataRange::rangeDirty() const { return !_range->text().isEmpty(); } void DataRange::setRange(qreal range) { _range->setText(QString::number(range)); } QString DataRange::rangeUnits() const { return _rangeUnits->currentText(); } void DataRange::setRangeUnits(const QString &rangeUnits) { _requestedRangeUnits = rangeUnits; int i = _rangeUnits->findText(rangeUnits); if (i>=0) { _rangeUnits->setCurrentIndex(i); } else { _rangeUnits->setCurrentIndex(0); } } int DataRange::skip() const { return _skip->value(); } bool DataRange::skipDirty() const { return !_skip->text().isEmpty(); } void DataRange::setSkip(int skip) { _skip->setValue(skip); } bool DataRange::countFromEnd() const { return _countFromEnd->isChecked(); } void DataRange::setCountFromEnd(bool countFromEnd) { _countFromEnd->setChecked(countFromEnd); } bool DataRange::countFromEndDirty() const { return _readToEnd->checkState() == Qt::PartiallyChecked; } bool DataRange::readToEnd() const { return _readToEnd->isChecked(); } bool DataRange::readToEndDirty() const { return _readToEnd->checkState() == Qt::PartiallyChecked; } void DataRange::setReadToEnd(bool readToEnd) { _readToEnd->setChecked(readToEnd); } bool DataRange::doSkip() const { return _doSkip->isChecked(); } bool DataRange::doSkipDirty() const { return _doSkip->checkState() == Qt::PartiallyChecked; } void DataRange::setDoSkip(bool doSkip) { _doSkip->setChecked(doSkip); } bool DataRange::doFilter() const { return _doFilter->isChecked(); } bool DataRange::doFilterDirty() const { return _doFilter->checkState() == Qt::PartiallyChecked; } void DataRange::setDoFilter(bool doFilter) { _doFilter->setChecked(doFilter); } void DataRange::countFromEndChanged() { if (countFromEnd()) { setReadToEnd(false); } _start->setEnabled(!countFromEnd()); _startUnits->setEnabled(!countFromEnd()); } void DataRange::readToEndChanged() { if (readToEnd()) { setCountFromEnd(false); } _range->setEnabled(!readToEnd()); _rangeUnits->setEnabled(!readToEnd()); } void DataRange::doSkipChanged() { _skip->setEnabled(doSkip()); _doFilter->setEnabled(doSkip()); } void DataRange::setWidgetDefaults() { //FIXME Do we need a V->readLock() here? dialogDefaults().setValue("vector/range", range()); dialogDefaults().setValue("vector/start", start()); dialogDefaults().setValue("vector/countFromEnd", countFromEnd()); dialogDefaults().setValue("vector/readToEnd", readToEnd()); dialogDefaults().setValue("vector/skip", skip()); dialogDefaults().setValue("vector/doSkip", doSkip()); dialogDefaults().setValue("vector/doAve", doFilter()); dialogDefaults().setValue("vector/rangeUnits", rangeUnits()); dialogDefaults().setValue("vector/startUnits", rangeUnits()); } void DataRange::loadWidgetDefaults() { setRange(dialogDefaults().value("vector/range", 1).toInt()); setStart(dialogDefaults().value("vector/start", 0).toInt()); setCountFromEnd(dialogDefaults().value("vector/countFromEnd",false).toBool()); setReadToEnd(dialogDefaults().value("vector/readToEnd",true).toBool()); setSkip(dialogDefaults().value("vector/skip", 0).toInt()); setDoSkip(dialogDefaults().value("vector/doSkip", false).toBool()); setDoFilter(dialogDefaults().value("vector/doAve",false).toBool()); setRangeUnits(dialogDefaults().value("vector/rangeUnits",tr("frames")).toString()); setStartUnits(dialogDefaults().value("vector/startUnits",tr("frames")).toString()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/scalarselector.cpp0000644000175000017500000001676512277111530017343 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "scalarselector.h" #include "dialoglauncher.h" #include "datacollection.h" #include "objectstore.h" #include "updateserver.h" #include "enodes.h" namespace Kst { ScalarSelector::ScalarSelector(QWidget *parent, ObjectStore *store) : QWidget(parent), _store(store) { _defaultsSet = false; setupUi(this); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _newScalar->setIcon(QPixmap(":kst_scalarnew.png")); _editScalar->setIcon(QPixmap(":kst_scalaredit.png")); _newScalar->setFixedSize(size + 8, size + 8); _editScalar->setFixedSize(size + 8, size + 8); _selectScalar->setFixedSize(size + 8, size + 8); _scalarListSelector = new ScalarListSelector(this); _scalar->resize(10,5); connect(_newScalar, SIGNAL(pressed()), this, SLOT(newScalar())); connect(_editScalar, SIGNAL(pressed()), this, SLOT(editScalar())); connect(_selectScalar, SIGNAL(pressed()), this, SLOT(selectScalar())); connect(_scalar, SIGNAL(editTextChanged(QString)), this, SLOT(emitSelectionChanged())); connect(_scalar, SIGNAL(editTextChanged(QString)), this, SLOT(updateDescriptionTip())); connect(UpdateServer::self(), SIGNAL(objectListsChanged()), this, SLOT(updateScalarList())); } ScalarSelector::~ScalarSelector() { } void ScalarSelector::setObjectStore(ObjectStore *store) { _store = store; fillScalars(); } void ScalarSelector::updateDescriptionTip() { bool editable; setToolTip(selectedScalarString(&editable)); _editScalar->setEnabled(editable); } void ScalarSelector::emitSelectionChanged() { emit selectionChanged(_scalar->currentText()); } void ScalarSelector::setDefaultValue(double value) { QString string = QString::number(value); int index = _scalar->findText(string); if (index<0) { _scalar->addItem(string, qVariantFromValue(0)); _scalar->setCurrentIndex(_scalar->findText(string)); } else { _scalar->setCurrentIndex(index); } _defaultsSet = true; } ScalarPtr ScalarSelector::selectedScalar() { bool existingScalar; if (_scalar->findText(_scalar->currentText(), Qt::MatchExactly) == -1) { // Value typed in. existingScalar = false; } else { if (_scalar->itemData(_scalar->findText(_scalar->currentText())).value()) { existingScalar = true; } else { // Default Value. Doesn't exist as scalar yet. existingScalar = false; } } if (!existingScalar) { // Create the Scalar. bool ok = false; double value = _scalar->currentText().toDouble(&ok); if (!ok) { value = Equations::interpret(_store, _scalar->currentText().toLatin1(), &ok); } if (!ok) { return 0; } // Check if a scalar with this value exist & is hidden. foreach(Scalar* scalar, _store->getObjects()) { if (scalar->hidden()) { if (scalar->value() == value) { return scalar; } } } ScalarPtr scalar = _store->createObject(); scalar->setValue(value); scalar->setEditable(false); scalar->setDescriptiveName(QString()); scalar->setOrphan(true); scalar->setHidden(true); _scalar->clearEditText(); fillScalars(); scalar->writeLock(); scalar->registerChange(); scalar->unlock(); setSelectedScalar(scalar); return scalar; } return _scalar->itemData(_scalar->currentIndex()).value();; } QString ScalarSelector::selectedScalarString(bool *editable) { if (_scalar->findText(_scalar->currentText(),Qt::MatchExactly) == -1) { if (editable) { *editable = false; } return _scalar->currentText(); } Scalar* scalar = _scalar->itemData(_scalar->currentIndex()).value();; if (scalar) { if (editable) { *editable = scalar->editable(); } return scalar->descriptionTip(); } else { if (editable) { *editable = false; } return QString(); } } void ScalarSelector::setSelectedScalar(QString Name) { bool ok; double value = Name.toDouble(&ok); if (ok) { setDefaultValue(value); } else { Kst::Object* object = _store->retrieveObject(Name); Kst::Scalar* scalar = static_cast(object); if (scalar) { setSelectedScalar(scalar); } } } void ScalarSelector::setSelectedScalar(ScalarPtr selectedScalar) { int i=-1; for (int j=0; j<_scalar->count() ; ++j) { if (selectedScalar.data() == _scalar->itemData(j).value()) { i=j; break; } } if (i==-1) { setDefaultValue(selectedScalar->value()); } else { _scalar->setCurrentIndex(i); _defaultsSet = false; } } void ScalarSelector::newScalar() { QString scalarName; DialogLauncher::self()->showScalarDialog(scalarName, 0, true); fillScalars(); ScalarPtr scalar = kst_cast(_store->retrieveObject(scalarName)); if (scalar) { setSelectedScalar(scalar); emitSelectionChanged(); } } void ScalarSelector::editScalar() { if (selectedScalar()->provider()) { DialogLauncher::self()->showObjectDialog(selectedScalar()->provider()); } else { QString scalarName; DialogLauncher::self()->showScalarDialog(scalarName, ObjectPtr(selectedScalar()), true); } fillScalars(); } void ScalarSelector::selectScalar() { if (_scalarListSelector->exec() == QDialog::Accepted) { _scalar->setCurrentIndex(_scalar->findText(_scalarListSelector->selectedScalar())); } } void ScalarSelector::fillScalars() { if (!_store) { return; } QHash scalars; ScalarList scalarList = _store->getObjects(); ScalarList::ConstIterator it = scalarList.constBegin(); for (; it != scalarList.constEnd(); ++it) { ScalarPtr scalar = (*it); scalar->readLock(); if (!scalar->hidden()) { scalars.insert(scalar->CleanedName(), scalar); } scalar->unlock(); } QStringList list = scalars.keys(); qSort(list); QString current_text = _scalar->currentText(); ScalarPtr current = _scalar->itemData(_scalar->currentIndex()).value(); _scalar->clear(); foreach (const QString &string, list) { ScalarPtr v = scalars.value(string); _scalar->addItem(string, qVariantFromValue(v.data())); } _scalarListSelector->clear(); _scalarListSelector->fillScalars(list); if (current) { setSelectedScalar(current); } else { _scalar->addItem(current_text, qVariantFromValue(0)); _scalar->setCurrentIndex(_scalar->findText(current_text)); _defaultsSet = true; } _editScalar->setEnabled(_scalar->count() > 0); _selectScalar->setEnabled(_scalar->count() > 0); updateDescriptionTip(); } void ScalarSelector::updateScalarList() { if (_defaultsSet) { QString defaultText = _scalar->currentText(); fillScalars(); setDefaultValue(defaultText.toDouble()); } else { fillScalars(); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/kstwidgets_export.h0000644000175000017500000000224212277111530017554 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_WIDGETS_EXPORT_H #define KST_WIDGETS_EXPORT_H #include #if (defined(Q_OS_WIN32) || defined(Q_OS_WIN64)) # if defined(BUILD_KSTWIDGETS) # define KSTWIDGETS_EXPORT Q_DECL_EXPORT # else # define KSTWIDGETS_EXPORT Q_DECL_IMPORT # endif #else # define KSTWIDGETS_EXPORT #endif #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/scalarselector.ui0000644000175000017500000000506712277111530017167 0ustar synthsynth ScalarSelector 0 0 230 27 Select a scalar to utilize. If you wish to create a new scalar, select the icon to the right. 0 true QComboBox::AdjustToMinimumContentsLength 0 0 ... 0 0 Create a new scalar. false 0 0 Edit selected scalar. Kst::ComboBox QComboBox
combobox.h
_scalar _selectScalar _newScalar _editScalar
Kst-2.0.8/src/widgets/labelbuilder.h0000644000175000017500000000305112277111530016410 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2008 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LABELBUILDER_H #define LABELBUILDER_H #include #include "ui_labelbuilder.h" #include #include "kstwidgets_export.h" #include "modelessinfobox.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT LabelBuilder : public QWidget, public Ui::LabelBuilder { Q_OBJECT public: explicit LabelBuilder(QWidget *parent = 0, ObjectStore *store = 0); virtual ~LabelBuilder(); void setObjectStore(ObjectStore *store); QString labelText() const; void setLabelText(const QString &label); Q_SIGNALS: void labelChanged(); public Q_SLOTS: void showHelp(); private: ObjectStore *_store; ModelessInfoBox *_helpBox; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/CMakeLists.txt0000644000175000017500000000040612320547027016355 0ustar synthsynthkst_init(${kst_binary_name} widgets) if(kst_qt5) kst_files_ignore(widgets) endif() if(QNX) kst_files_ignore(widgets) endif() kst_files_find(src/widgets) kst_include_directories(core app math) kst_add_library(SHARED) kst_link(${libcore} ${libmath}) Kst-2.0.8/src/widgets/widgets.pro0000644000175000017500000000403512277111530016004 0ustar synthsynthTOPOUT_REL=../.. include($$PWD/$$TOPOUT_REL/kst.pri) QT += gui TEMPLATE = lib CONFIG += dll DEFINES += BUILD_KSTWIDGETS CONFIG += designer TARGET = $$kstlib(kst2widgets) DESTDIR = $$OUTPUT_DIR/lib QT += core xml gui !isEmpty(INSTALL_PREFIX) { target.path = $$INSTALL_PREFIX/$$INSTALL_LIBDIR INSTALLS += target } INCLUDEPATH += tmp \ $$TOPLEVELDIR/src/libkst \ $$TOPLEVELDIR/src/libkstmath \ $$OUTPUT_DIR/src/widgets/tmp macx { CONFIG += lib_bundle LIBS += -F$$OUTPUT_DIR/lib qtAddLibrary(kst2lib) qtAddLibrary(kst2math) } else { LIBS += \ -L$$OUTPUT_DIR/lib \ -L$$OUTPUT_DIR/plugin \ -l$$kstlib(kst2math) \ -l$$kstlib(kst2lib) } SOURCES += \ colorbutton.cpp \ colorpalette.cpp \ combobox.cpp \ curveappearance.cpp \ curveplacement.cpp \ curveselector.cpp \ datarange.cpp \ datasourceselectordialog.cpp \ datasourceselector.cpp \ dialogdefaults.cpp \ fftoptions.cpp \ filerequester.cpp \ gradienteditor.cpp \ labelbuilder.cpp \ labellineedit.cpp \ matrixselector.cpp \ scalarlistselector.cpp \ scalarselector.cpp \ stringselector.cpp \ vectorselector.cpp \ widgets.cpp \ cclineedit.cpp HEADERS += \ colorbutton.h \ colorpalette.h \ combobox.h \ curveappearance.h \ curveplacement.h \ curveselector.h \ datarange.h \ datasourceselectordialog.h \ datasourceselector.h \ dialogdefaults.h \ fftoptions.h \ filerequester.h \ gradienteditor.h \ labelbuilder.h \ labellineedit.h \ matrixselector.h \ scalarselector.h \ scalarlistselector.h \ stringselector.h \ vectorselector.h \ widgets.h \ cclineedit.h \ cclineedit_p.h FORMS += \ colorpalette.ui \ curveappearance.ui \ curveplacement.ui \ curveselector.ui \ datarange.ui \ fftoptions.ui \ labelbuilder.ui \ matrixselector.ui \ scalarlistselector.ui \ scalarselector.ui \ stringselector.ui \ vectorselector.ui RESOURCES += \ $$TOPLEVELDIR/src/images/images.qrc Kst-2.0.8/src/widgets/labelbuilder.ui0000644000175000017500000000474512277111530016611 0ustar synthsynth LabelBuilder 0 0 610 149 0 0 16777215 16777215 0 0 true Supports LaTeX symbols, live strings & scalars, and embedded equations. 0 0 &Label: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _label 0 0 Help Kst::SVCCTextEdit QTextEdit
cclineedit.h
_label
Kst-2.0.8/src/widgets/curveappearance.ui0000644000175000017500000002506612277111530017326 0ustar synthsynth CurveAppearance 0 0 498 171 0 0 0 0 0 50 false Appearance 0 0 &Weight: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _spinBoxLineWidth false Point Type If "Show Points" is checked, the selected point type will be drawn at each data point. Line Type If "Show Lines" is checked, the selected line style. line style 0 0 100 16 QFrame::NoFrame QFrame::Plain true false 0 0 Check this to cause lines to be drawn between data points. &Lines true 0 0 Check this to cause the selected points to be drawn at each data point. Po&ints 0 0 &Head 0 0 Check this to cause lines to be drawn between data points. &Bargraph false 0 0 curve color 0 0 curve bar fill Line Width If "Show Lines" is checked, the selected line width. 50 &Size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _spinBoxPointSize Point &Density: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _comboPointDensity false Point Type If "Show Points" is checked, the selected point type will be drawn at each data point. All High Medium Low 0 0 curve head color Kst::ColorButton QToolButton
colorbutton.h
_showLines _comboLineStyle _spinBoxLineWidth _color _showPoints _comboPointSymbol _comboPointDensity _showHead _comboHeadSymbol _headColor _showBars _barFillColor kst_export.h
Kst-2.0.8/src/widgets/matrixselector.ui0000644000175000017500000000435612277111530017226 0ustar synthsynth MatrixSelector 0 0 271 26 Select a vector to utilize. If you wish to create a new vector, click on the icon to the right. 0 0 QComboBox::AdjustToMinimumContentsLength 0 0 Create a new vector. Opens a vector dialog to create a new vector, which will become the selected vector. false 0 0 Edit selected vector. Opens a vector dialog to edit selected vector. Kst::ComboBox QComboBox
combobox.h
Kst-2.0.8/src/widgets/colorpalette.ui0000644000175000017500000000363512277111530016655 0ustar synthsynth ColorPalette 0 0 474 30 0 0 0 0 C&olor palette: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _palette 0 0 false 0 0 false Kst-2.0.8/src/widgets/gradienteditor.cpp0000644000175000017500000001273612277111530017333 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "gradienteditor.h" #include #include #include #include #include namespace Kst { GradientEditor::GradientEditor(QWidget *parent) : QWidget(parent), _gradient(0), _movingStop(-1), _dirty(false) { setMouseTracking(true); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); _gradient = new QLinearGradient(1,0,0,0); _gradient->setCoordinateMode(QGradient::ObjectBoundingMode); } GradientEditor::~GradientEditor() { delete _gradient; } QSize GradientEditor::sizeHint() const { return QSize(120,120); } QGradient GradientEditor::gradient() const { _gradient->setStops(gradientStops()); return *_gradient; } void GradientEditor::setGradient(const QGradient &gradient) { _dirty = false; setGradientStops(gradient.stops()); update(); } void GradientEditor::setDefaultGradientStops(QGradientStops stops) { _defaultGradientStops = stops; } void GradientEditor::resetGradient() { _dirty = true; QLinearGradient defaultGradient(1,0,0,0); clearGradientStops(); setGradientStops(_defaultGradientStops); emit changed(gradient()); update(); } void GradientEditor::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); QList stops = _stopHash.values(); foreach (const Stop &stop, stops) { if (stop.path.contains(event->pos())) { _movingStop = stop.pos; return; } } } void GradientEditor::mouseReleaseEvent(QMouseEvent *event) { QWidget::mouseReleaseEvent(event); if (_movingStop != -1) { _movingStop = -1; return; } bool ok; QRgb color = QColorDialog::getRgba(Qt::white, &ok, parentWidget()); if (ok) { int position = event->pos().x(); Stop stop; stop.pos = position; stop.color = color; stop.path = marker(position); _stopHash.insert(position, stop); _dirty = true; emit changed(gradient()); update(); } } void GradientEditor::mouseMoveEvent(QMouseEvent *event) { QWidget::mouseMoveEvent(event); if (_movingStop != -1) { int position = event->pos().x(); Stop stop = _stopHash.take(_movingStop); stop.pos = position; stop.path = marker(position); _stopHash.insert(position, stop); _movingStop = position; _dirty = true; emit changed(gradient()); } update(); } void GradientEditor::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.fillRect(rect(), QBrush(gradient())); if (isEnabled()) { QPoint cursor = QWidget::mapFromGlobal(QCursor::pos()); if (rect().contains(cursor)) { painter.setPen(Qt::black); QLine line(QPoint(cursor.x(), rect().y()), QPoint(cursor.x(), rect().bottom())); painter.drawLine(line); } QList stops = _stopHash.values(); foreach (const Stop &stop, stops) { if (stop.path.contains(cursor)) { painter.setPen(Qt::white); painter.setBrush(Qt::black); painter.drawPath(stop.path); } else { painter.setPen(Qt::black); painter.setBrush(Qt::white); painter.drawPath(stop.path); } } } } bool GradientEditor::isStopAt(const QPoint &point) const { return _stopHash.contains(point.x()); } QPainterPath GradientEditor::marker(int x) const { qreal length = 15.; qreal altitude = length * 0.8660254037844386468; QLine line(QPoint(x, rect().y()), QPoint(x, rect().bottom())); QPainterPath path; //top triangle QPolygonF top; top << line.p1() - QPointF(length/2., 0.) << line.p1() + QPointF(length/2., 0.) << line.p1() + QPointF(0., altitude); path.addPolygon(top); path.closeSubpath(); //bottom triangle QPolygonF bot; bot << line.p2() - QPointF(length/2., 0.) << line.p2() + QPointF(length/2., 0.) << line.p2() + QPointF(0., -altitude); path.addPolygon(bot); path.closeSubpath(); return path; } QGradientStops GradientEditor::gradientStops() const { QGradientStops realStops; QList stops = _stopHash.values(); foreach (const Stop &stop, stops) { qreal realStop = 1.0 - qreal(stop.pos) / qreal(rect().width()); realStops << qMakePair(realStop, stop.color); } return realStops; } void GradientEditor::setGradientStops(const QGradientStops &stops) { _stopHash.clear(); foreach (const QGradientStop &gradientStop, stops) { int position = int(-((gradientStop.first - 1.0) * qreal(rect().width()))); Stop stop; stop.pos = position; stop.color = gradientStop.second; stop.path = marker(position); _stopHash.insert(position, stop); } } void GradientEditor::clearGradientStops() { _stopHash.clear(); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/labellineedit.h0000644000175000017500000000237112277111530016563 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2008 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LABELLINEEDIT_H #define LABELLINEEDIT_H #include #include #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT LabelLineEdit : public QLineEdit { Q_OBJECT public: explicit LabelLineEdit(QWidget *parent = 0); virtual ~LabelLineEdit(); virtual void focusInEvent ( QFocusEvent * event ); Q_SIGNALS: void inFocus(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/matrixselector.cpp0000644000175000017500000000765612277111530017401 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "matrixselector.h" #include "objectstore.h" #include "dialoglauncher.h" #include "datacollection.h" namespace Kst { MatrixSelector::MatrixSelector(QWidget *parent, ObjectStore *store) : QWidget(parent), _store(store) { setupUi(this); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _newMatrix->setIcon(QPixmap(":kst_matrixnew.png")); _editMatrix->setIcon(QPixmap(":kst_matrixedit.png")); _newMatrix->setFixedSize(size + 8, size + 8); _editMatrix->setFixedSize(size + 8, size + 8); fillMatrices(); connect(_newMatrix, SIGNAL(pressed()), this, SLOT(newMatrix())); connect(_editMatrix, SIGNAL(pressed()), this, SLOT(editMatrix())); connect(_matrix, SIGNAL(currentIndexChanged(int)), this, SLOT(matrixSelected(int))); connect(_matrix, SIGNAL(editTextChanged(QString)), this, SLOT(matrixSelected(QString))); } MatrixSelector::~MatrixSelector() { } void MatrixSelector::setObjectStore(ObjectStore *store) { _store = store; fillMatrices();; } MatrixPtr MatrixSelector::selectedMatrix() const { ObjectPtr p=_store->retrieveObject(_matrix->currentText()); if(p.isPtrValid()) return kst_cast(p); else return NULL; } bool MatrixSelector::selectedMatrixDirty() const { return _matrix->currentIndex() != -1; } void MatrixSelector::matrixSelected(int index) { Q_UNUSED(index) if (index != -1) emit selectionChanged(); } void MatrixSelector::matrixSelected(QString) { emit selectionChanged(); } void MatrixSelector::setSelectedMatrix(MatrixPtr selectedMatrix) { int i = _matrix->findData(qVariantFromValue(selectedMatrix.data())); if (i != -1) { _matrix->setCurrentIndex(i); } } void MatrixSelector::newMatrix() { QString matrixName; DialogLauncher::self()->showMatrixDialog(matrixName, 0, true); fillMatrices(); MatrixPtr matrix = kst_cast(_store->retrieveObject(matrixName)); if (matrix) { setSelectedMatrix(matrix); } } void MatrixSelector::editMatrix() { if (selectedMatrix()->provider()) { DialogLauncher::self()->showObjectDialog(selectedMatrix()->provider()); } else { QString matrixName; DialogLauncher::self()->showMatrixDialog(matrixName, ObjectPtr(selectedMatrix()), true); } } void MatrixSelector::clearSelection() { _matrix->setCurrentIndex(-1); } void MatrixSelector::updateMatrices() { fillMatrices();; } void MatrixSelector::fillMatrices() { if (!_store) { return; } QHash matrices; MatrixList matrixList = _store->getObjects(); MatrixList::ConstIterator it = matrixList.constBegin(); for (; it != matrixList.constEnd(); ++it) { MatrixPtr matrix = (*it); matrix->readLock(); matrices.insert(matrix->CleanedName(), matrix); matrix->unlock(); } QStringList list = matrices.keys(); qSort(list); MatrixPtr current = selectedMatrix(); _matrix->clear(); foreach (const QString &string, list) { MatrixPtr m = matrices.value(string); _matrix->addItem(string, qVariantFromValue(m.data())); } if (current) setSelectedMatrix(current); _editMatrix->setEnabled(_matrix->count() > 0); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/combobox.h0000644000175000017500000000253512277111530015600 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef COMBOBOX_H #define COMBOBOX_H #include #include "kstwidgets_export.h" /* FIXME!! This class needs to be rewritten to give completion... */ namespace Kst { class KSTWIDGETS_EXPORT ComboBox : public QComboBox { Q_OBJECT public: explicit ComboBox(QWidget *parent=0); explicit ComboBox(bool editable, QWidget *parent=0); virtual ~ComboBox(); void setEditable(bool editable); private: void setupLineEdit(); private: bool _editable; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveplacement.cpp0000644000175000017500000001256012277111530017337 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curveplacement.h" #include "plotiteminterface.h" namespace Kst { CurvePlacement::CurvePlacement(QWidget *parent) : QWidget(parent) { setupUi(this); _plotList->resize(10,5); connect(_existingPlot, SIGNAL(toggled(bool)), _plotList, SLOT(setEnabled(bool))); connect(_newPlot, SIGNAL(toggled(bool)), this, SLOT(updateButtons())); connect(_customGrid, SIGNAL(toggled(bool)), this, SLOT(updateButtons())); _noPlot->setProperty("si","Do not pl&ace in any plot"); _existingPlot->setProperty("si","Place in &existing plot:"); _newPlot->setProperty("si","Place in &new plot"); _newTab->setProperty("si","In ne&w tab"); _scaleFonts->setProperty("si","Scale fonts"); _autoLayout->setProperty("si","Automati&c layout"); _customGrid->setProperty("si","Custom &grid:"); _gridColumnsLabel->setProperty("si","Colu&mns"); _protectLayout->setProperty("si","&Protect existing layout"); _plotList->setProperty("si","place In Existing Plot"); } CurvePlacement::~CurvePlacement() { } void CurvePlacement::updateButtons() { _layoutGroup->setEnabled(_newPlot->isChecked()); _gridColumns->setEnabled(_customGrid->isChecked()); _gridColumnsLabel->setEnabled(_customGrid->isChecked()); _newTab->setEnabled(_newPlot->isChecked()); if (!_newPlot->isChecked()) { _newTab->setChecked(false); } } CurvePlacement::Place CurvePlacement::place() const { if (/*(!isVisible()) ||*/ _noPlot->isChecked()) //the dialogscriptinterface hides dialogs. //instead, before calling place() make sure //editmode()==New return NoPlot; else if (_existingPlot->isChecked()) return ExistingPlot; else if (_newTab->isChecked()) return NewPlotNewTab; else return NewPlot; } void CurvePlacement::setPlace(CurvePlacement::Place place) { switch (place) { case NoPlot: _noPlot->setChecked(true); break; case ExistingPlot: _existingPlot->setChecked(true); break; case NewPlot: _newPlot->setChecked(true); break; case NewPlotNewTab: _newPlot->setChecked(true); _newTab->setChecked(true); default: break; } } bool CurvePlacement::scaleFonts() const { return _scaleFonts->isChecked(); } CurvePlacement::Layout CurvePlacement::layout() const { if (_autoLayout->isChecked()) return Auto; else if (_customGrid->isChecked()) return Custom; else return Protect; } void CurvePlacement::setLayout(CurvePlacement::Layout layout) { switch (layout) { case Auto: _autoLayout->setChecked(true); break; case Custom: _customGrid->setChecked(true); break; case Protect: _protectLayout->setChecked(true); break; default: break; } } PlotItemInterface *CurvePlacement::existingPlot() const { QString shortName; QRegExp rx("(\\(|^)([A-Z]\\d+)(\\)$|$)"); rx.indexIn(_plotList->currentText()); shortName = rx.cap(2); int xi=-1; for(int i=0;i<_plotList->count();i++) { if(_plotList->itemText(i).contains(shortName)) { xi= i; break; } } if(xi==-1) ++xi; return _plotList->itemData(xi).value(); } void CurvePlacement::setExistingPlots(const QList &existingPlots) { _plots.clear(); _plots.append(existingPlots); updatePlotListCombo(); } void CurvePlacement::updatePlotListCombo() { QString shortName; QRegExp rx("(\\(|^)([A-Z]\\d+)(\\)$|$)"); rx.indexIn(_plotList->currentText()); shortName = rx.cap(2); int xi=-1; for(int i=0;i<_plotList->count();i++) { if(_plotList->itemText(i).contains(shortName)) { xi= i; break; } } if(xi==-1) ++xi; _plotList->clear(); foreach (PlotItemInterface *plot, _plots) { _plotList->addItem(plot->plotCleanedName(), qVariantFromValue(plot)); } if ((xi>0) && (xi<_plotList->count())) { _plotList->setCurrentIndex(xi); } } bool CurvePlacement::event(QEvent * event) { if ((event->type() == QEvent::Resize)) { updatePlotListCombo(); } return QWidget::event(event); } void CurvePlacement::setCurrentPlot(const PlotItemInterface *currentPlot) { if (currentPlot) { int n = _plotList->count(); for (int i=0; iitemData(i).value()->plotName() == currentPlot->plotName()) { _plotList->setCurrentIndex(i); return; } } } } int CurvePlacement::gridColumns() const { return _gridColumns->value(); } void CurvePlacement::setGridColumns(int columns) { _gridColumns->setValue(columns); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveplacement.h0000644000175000017500000000361212277111530017002 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVEPLACEMENT_H #define CURVEPLACEMENT_H #include #include "ui_curveplacement.h" #include "kstwidgets_export.h" namespace Kst { class PlotItemInterface; class KSTWIDGETS_EXPORT CurvePlacement : public QWidget, public Ui::CurvePlacement { Q_OBJECT public: enum Place { NewPlot, ExistingPlot, NoPlot, NewPlotNewTab }; enum Layout { Auto, Custom, Protect }; explicit CurvePlacement(QWidget *parent = 0); virtual ~CurvePlacement(); Place place() const; void setPlace(Place place); bool scaleFonts() const; PlotItemInterface *existingPlot() const; void setExistingPlots(const QList &existingPlots); void setCurrentPlot(const PlotItemInterface *currentPlot); void updatePlotListCombo(); Layout layout() const; void setLayout(Layout layout); int gridColumns() const; void setGridColumns(int gridColumns); virtual bool event(QEvent * event); public Q_SLOTS: void updateButtons(); private: QList _plots; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/datasourceselectordialog.h0000644000175000017500000000253612277111530021044 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASOURCESELECTORDIALOG_H #define DATASOURCESELECTORDIALOG_H #include #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT DataSourceSelectorDialog : public QFileDialog { Q_OBJECT public: explicit DataSourceSelectorDialog(QString &file, QWidget *parent = 0); virtual ~DataSourceSelectorDialog(); QString selectedDataSource(); public Q_SLOTS: void currentChanged(const QString ¤t); protected: void accept(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveappearance.h0000644000175000017500000000556612277111530017143 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVEAPPEARANCE_H #define CURVEAPPEARANCE_H #include #include "ui_curveappearance.h" #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT CurveAppearance : public QWidget, public Ui::CurveAppearance { Q_OBJECT public: explicit CurveAppearance(QWidget *parent = 0); virtual ~CurveAppearance(); bool showLines() const; bool showLinesDirty() const; void setShowLines(const bool showLines); bool showPoints() const; bool showPointsDirty() const; void setShowPoints(const bool showPoints); bool showHead() const; bool showHeadDirty() const; void setShowHead(const bool showHead); bool showBars() const; bool showBarsDirty() const; void setShowBars(const bool showBars); QColor color() const; bool colorDirty() const; void setColor(const QColor &c); QColor headColor() const; bool headColorDirty() const; void setHeadColor(const QColor &c); int pointType() const; bool pointTypeDirty() const; void setPointType(const int pointType); int headType() const; bool headTypeDirty() const; void setHeadType(const int headType); int lineStyle() const; bool lineStyleDirty() const; void setLineStyle(int lineStyle); int lineWidth() const; bool lineWidthDirty() const; void setLineWidth(const int lineWidth); double pointSize() const; bool pointSizeDirty() const; void setPointSize(double pointSize); QColor barFillColor() const; bool barFillColorDirty() const; void setBarFillColor(const QColor &c); int pointDensity() const; bool pointDensityDirty() const; void setPointDensity(int pointDensity); void clearValues(); void setWidgetDefaults(bool nextColor = true); void loadWidgetDefaults(); private slots: void enableSettings(); void drawSampleLine(); void populateSymbolCombos(); void populateSymbolCombo(QComboBox *combo, QColor color); void populateLineStyleCombo(); Q_SIGNALS: void modified(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/datasourceselector.h0000644000175000017500000000330312277111530017655 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASOURCESELECTOR_H #define DATASOURCESELECTOR_H #include #include #include "kstwidgets_export.h" class QLineEdit; class QToolButton; namespace Kst { class KSTWIDGETS_EXPORT DataSourceSelector : public QWidget { Q_OBJECT Q_PROPERTY(QString file READ file WRITE setFile USER true) public: explicit DataSourceSelector(QWidget *parent = 0); virtual ~DataSourceSelector(); QString file() const; void setMode(QFileDialog::FileMode mode) { _mode = mode; } QLineEdit *_fileEdit; public Q_SLOTS: void setFile(const QString &file); void updateFile(const QString &file); Q_SIGNALS: void changed(const QString &file); private Q_SLOTS: void chooseFile(); private: void setup(); QToolButton *_fileButton; QFileDialog::FileMode _mode; QString _file; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/vectorselector.ui0000644000175000017500000000457412277111530017226 0ustar synthsynth VectorSelector 0 0 273 28 Select a vector to utilize. If you wish to create a new vector, click on the icon to the right. 0 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 Create a new vector Opens a vector dialog to create a new vector, which will become the selected vector. false 0 0 Edit selected vector. Opens a vector dialog to edit selected vector. Kst::ComboBox QComboBox
combobox.h
Kst-2.0.8/src/widgets/colorbutton.h0000644000175000017500000000312712277111530016340 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef COLORBUTTON_H #define COLORBUTTON_H #include #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT ColorButton : public QToolButton { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor USER true) public: explicit ColorButton(QWidget *parent = 0); explicit ColorButton(const QColor &color, QWidget *parent = 0); virtual ~ColorButton(); QColor color() const; bool colorDirty() const; void clearSelection(); public Q_SLOTS: void setColor(const QColor &color); Q_SIGNALS: void changed(const QColor &color); protected: virtual void paintEvent(QPaintEvent *event); private Q_SLOTS: void chooseColor(); private: QColor _color; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/matrixselector.h0000644000175000017500000000337212277111530017035 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef MATRIXSELECTOR_H #define MATRIXSELECTOR_H #include #include "ui_matrixselector.h" #include #include "kstwidgets_export.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT MatrixSelector : public QWidget, public Ui::MatrixSelector { Q_OBJECT public: explicit MatrixSelector(QWidget *parent = 0, ObjectStore *store = 0); virtual ~MatrixSelector(); void setObjectStore(ObjectStore *store); MatrixPtr selectedMatrix() const; bool selectedMatrixDirty() const; void setSelectedMatrix(MatrixPtr selectedMatrix); void clearSelection(); Q_SIGNALS: void selectionChanged(); public Q_SLOTS: void updateMatrices(); void matrixSelected(int index); void matrixSelected(QString text); private Q_SLOTS: void newMatrix(); void editMatrix(); private: ObjectStore *_store; void fillMatrices(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/fftoptions.ui0000644000175000017500000003153712320547027016360 0ustar synthsynth FFTOptions 0 0 737 194 0 0 0 0 FFT Options 0 Default Bartlett Blackman Connes cosine Gaussian (Custom Sigma) Hamming Hann Welch false 0 0 S&igma: false _sigma false 0.010000000000000 0 0 Select from this pulldown the source vector for the Curve's y axis error bars. If "<None>" is selected, there will be no y axis error bars drawn. Create new vectors with the "Vectors" tab. Apodi&ze true 0 0 Fun&ction: false _apodizeFunction Remo&ve mean true 0 0 0 FFT &length: 2^ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _FFTLength Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, etc. The larger the number, the larger the noise and resolution. 4 24 10 Interleave&d average true Interpolate over &holes false 0 0 0 Sa&mple rate: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _sampleRate The sample rate at which the measurements were acquired, for proper normalization. 60.0 0 0 Apply new data sample specifications to selected vectors. Vector units: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _vectorUnits The units of the Data Vector - for automatic labels. V 0 0 Rate units: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _rateUnits The units for the sample rate. Used for automatic labels. Hz 0 0 0 Ou&tput: false _output Amplitude Spectral Density (V/Hz^1/2) Power Spectral Density (V^2/Hz) Amplitude Spectrum (V) Power Spectrum (V^2) _removeMean _apodize _apodizeFunction _sigma _interleavedAverage _FFTLength _interpolateOverHoles _sampleRate _vectorUnits _rateUnits _output Kst-2.0.8/src/widgets/dialogdefaults.cpp0000644000175000017500000001334112277111530017307 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dialogdefaults.h" #include "datasource.h" #include "settings.h" #include namespace Kst { QSettings& dialogDefaults() { static QSettings& settingsObject = createSettings("dialog"); return settingsObject; } void setDataVectorDefaults(DataVectorPtr V) { dialogDefaults().setValue("vector/datasource", V->filename()); } void setGenVectorDefaults(GeneratedVectorPtr V) { dialogDefaults().setValue("genVector/min", V->min()); dialogDefaults().setValue("genVector/max", V->max()); dialogDefaults().setValue("genVector/length", V->length()); } void setDataMatrixDefaults(DataMatrixPtr M) { //qDebug() << "M...filename: " << M->dataSource()->fileName(); // FIXME: data source filename isn't valid... dialogDefaults().setValue("matrix/datasource",M->dataSource()->fileName()); dialogDefaults().setValue("matrix/xCountFromEnd",M->xCountFromEnd()); dialogDefaults().setValue("matrix/yCountFromEnd",M->yCountFromEnd()); dialogDefaults().setValue("matrix/xReadToEnd",M->xReadToEnd()); dialogDefaults().setValue("matrix/yReadToEnd",M->yReadToEnd()); dialogDefaults().setValue("matrix/xNumSteps",M->xNumSteps()); dialogDefaults().setValue("matrix/yNumSteps",M->yNumSteps()); dialogDefaults().setValue("matrix/reqXStart",M->reqXStart()); dialogDefaults().setValue("matrix/reqYStart",M->reqYStart()); } void setHistogramDefaults(HistogramPtr H) { dialogDefaults().setValue("histogram/realTimeAutoBin", H->realTimeAutoBin()); dialogDefaults().setValue("histogram/normalizationType",H->normalizationType()); } void saveDialogDefaultsLockPosToData(const QString &group_name, const bool lockPosToData) { dialogDefaults().setValue(group_name+"/lockPosToData", QVariant(lockPosToData).toString()); } void saveDialogDefaultsBrush(const QString &group_name, const QBrush &b) { // Save the brush dialogDefaults().setValue(group_name+"/fillBrushColor", QVariant(b.color()).toString()); dialogDefaults().setValue(group_name+"/fillBrushStyle", QVariant((int)b.style()).toString()); dialogDefaults().setValue(group_name+"/fillBrushUseGradient", QVariant(bool(b.gradient())).toString()); if (b.gradient()) { QString stopList; foreach(const QGradientStop &stop, b.gradient()->stops()) { qreal point = (qreal)stop.first; QColor color = (QColor)stop.second; stopList += QString::number(point); stopList += ','; stopList += color.name(); stopList += ','; } dialogDefaults().setValue(group_name+"/fillBrushGradient", stopList); } } void saveDialogDefaultsPen(const QString &group_name, const QPen &p) { // Save stroke... QBrush b = p.brush(); dialogDefaults().setValue(group_name+"/strokeStyle", QVariant((int)p.style()).toString()); dialogDefaults().setValue(group_name+"/strokeWidth", p.widthF()); dialogDefaults().setValue(group_name+"/strokeJoinStyle", QVariant(p.joinStyle()).toString()); dialogDefaults().setValue(group_name+"/strokeCapStyle", QVariant(p.capStyle()).toString()); dialogDefaults().setValue(group_name+"/strokeBrushColor", QVariant(b.color()).toString()); dialogDefaults().setValue(group_name+"/strokeBrushStyle", QVariant((int)b.style()).toString()); } QBrush dialogDefaultsBrush(const QString &group_name) { //set the brush QBrush brush; bool useGradient = dialogDefaults().value(group_name +"/fillBrushUseGradient", false).toBool(); if (useGradient) { QStringList stopInfo = dialogDefaults().value(group_name +"/fillBrushGradient", "0,#000000,1,#ffffff,"). toString().split(',', QString::SkipEmptyParts); QLinearGradient gradient(1,0,0,0); gradient.setCoordinateMode(QGradient::ObjectBoundingMode); for (int i = 0; i < stopInfo.size(); i+=2) { gradient.setColorAt(stopInfo.at(i).toDouble(), QColor(stopInfo.at(i+1))); } brush = QBrush(gradient); } else { QColor color = dialogDefaults().value(group_name +"/fillBrushColor",QColor(Qt::white)).value(); brush.setColor(color); brush.setStyle((Qt::BrushStyle)dialogDefaults().value(group_name +"/fillBrushStyle",1).toInt()); } return brush; } QPen dialogDefaultsPen(const QString &group_name) { QPen pen; QColor color; QBrush brush; pen.setStyle((Qt::PenStyle)dialogDefaults().value(group_name +"/strokeStyle", 1).toInt()); pen.setWidthF(dialogDefaults().value(group_name +"/strokeWidth",0).toDouble()); pen.setJoinStyle((Qt::PenJoinStyle)dialogDefaults().value(group_name +"/strokeJoinStyle",64).toInt()); pen.setCapStyle((Qt::PenCapStyle)dialogDefaults().value(group_name +"/strokeCapStyle",16).toInt()); color = dialogDefaults().value(group_name +"/strokeBrushColor",QColor(Qt::black)).value(); brush.setColor(color); brush.setStyle((Qt::BrushStyle)dialogDefaults().value(group_name +"/strokeBrushStyle",1).toInt()); pen.setBrush(brush); return pen; } bool dialogDefaultsLockPosToData(const QString &group_name) { return dialogDefaults().value(group_name+"/lockPosToData",false).toBool(); } } Kst-2.0.8/src/widgets/colorbutton.cpp0000644000175000017500000000467212362705136016707 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "colorbutton.h" #include #include #include namespace Kst { ColorButton::ColorButton(QWidget *parent) : QToolButton(parent), _color(Qt::black) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); connect (this, SIGNAL(clicked()), this, SLOT(chooseColor())); } ColorButton::ColorButton(const QColor &color, QWidget *parent) : QToolButton(parent), _color(color) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); connect (this, SIGNAL(clicked()), this, SLOT(chooseColor())); } ColorButton::~ColorButton() { } QColor ColorButton::color() const { return _color; } void ColorButton::clearSelection() { setColor(QColor(Qt::transparent)); } bool ColorButton::colorDirty() const { return _color != QColor(Qt::transparent); } void ColorButton::setColor(const QColor &color) { _color = color; update(); emit changed(color); } void ColorButton::paintEvent(QPaintEvent *event) { QToolButton::paintEvent(event); if (!isEnabled()) return; QPainter painter(this); QBrush brush(_color); int m = (rect().height())/6; #ifndef QT5 // TODO qDrawShadePanel(&painter, rect().x() + m, rect().y() + m, rect().width() - 2*m, rect().height() - 2*m, palette(), /*sunken*/ isDown(), /*lineWidth*/ 1, /*fill*/ &brush); #endif } void ColorButton::chooseColor() { bool ok; if (_color == Qt::transparent) { _color = Qt::black; } QColor color = QColorDialog::getColor(_color, parentWidget(), "Choose Color", QColorDialog::ShowAlphaChannel); if (color.isValid()) { setColor(color); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/labelbuilder.cpp0000644000175000017500000002016312320547027016751 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2008 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "labelbuilder.h" #include "objectstore.h" namespace Kst { LabelBuilder::LabelBuilder(QWidget *parent, ObjectStore *store) : QWidget(parent), _store(store), _helpBox(0) { setupUi(this); _label->setWhatsThis(tr("The syntax for labels is a derivative of a subset of LaTeX. " "Supported syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, " "\\textcolor{color name}{colored text}, \\textbf{bold text}, " "\\textit{italicized text}, \\t, \\sum, \\sqrt, " "\\underline{underlined text}, \\overline{overlined text}, " "x^y, x_y. " "Scalars, equations, and vector elements can be embedded. " "Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[.")); _label->setToolTip(tr("Label text. A subset of LaTeX is supported. Click 'Help' for help.")); connect(_label, SIGNAL(textChanged()), this, SIGNAL(labelChanged())); connect(_help, SIGNAL(clicked()), this, SLOT(showHelp())); _label->setFocus(); } LabelBuilder::~LabelBuilder() { if (_helpBox) { delete _helpBox; _helpBox = 0; } } void LabelBuilder::showHelp() { if (!_helpBox) { _helpBox = new ModelessInfoBox(this); } _helpBox->show(); _helpBox->setText(tr("" "

Scalars & equations
" "Scalars and scalar equations can be displayed live in labels. When the scalar " "is updated, the label is updated. Scalar names are autocompleted. The format is:

" "

Scalar: [scalar" "name], e.g. [GYRO1:Mean" "(X4)]

" "

Vector Element:" "[vectorName[index]], " "e.g., [GYRO1 (V2)[4]]" "

" "

Equation: [=equation], " "e.g. [=[GYRO1:Mean" "(X4)]/[GYRO1:Sigma (X4)]]

" "

Supported LaTeX Subset
" "Labels in kst " "support a derivative subset of LaTeX. For example, to display the equation for the area of a " "circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it is not necessary to enter math mode using '$'. Also, " "unlike LaTeX, variables are not automatically displayed in italic font. If desired, this must " "be done explicitly using \\textit{}. Supported sequences are:

" "

Greek letters: \\name or " "\\Name. e.g.: \\alpha

" "

Other symbols: \\approx," "\\cdot," "\\ge," "\\geq," "\\inf," "\\int," "\\le," "\\leq," "\\ne," "\\partial," "\\prod," "\\pm," "\\sum," "\\sqrt

" "

Font effects: \\textcolor{color" "name}{colored " "text}, \\textbf{bold " "text}," "\\textit{italicized " "text}," "\\underline{underlined " "text}," "\\overline{overlined " "text}." "

Other:x^y," "x_y, \\t," "\\n, \\[

" )); _helpBox->setWidth(100); } void LabelBuilder::setObjectStore(ObjectStore *store) { _store = store; _label->setObjectStore(store); } QString LabelBuilder::labelText() const { return _label->toPlainText(); } void LabelBuilder::setLabelText(const QString &label) { _label->setPlainText(label); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/scalarlistselector.cpp0000644000175000017500000000344312277111530020224 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "scalarlistselector.h" namespace Kst { ScalarListSelector::ScalarListSelector(QWidget *parent) : QDialog(parent) { setupUi(this); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); connect(_search, SIGNAL(textChanged(QString)), this, SLOT(filter(QString))); } ScalarListSelector::~ScalarListSelector() { } QString ScalarListSelector::selectedScalar() const { if (_scalars->currentItem()) { return _scalars->currentItem()->text(); } return QString(); } void ScalarListSelector::fillScalars(QStringList &scalars) { _scalars->addItems(scalars); } void ScalarListSelector::clear() { _scalars->clear(); } void ScalarListSelector::filter(const QString& filter) { for (int i = 0; i < _scalars->count(); i++) { QListWidgetItem *item = _scalars->item(i); item->setHidden(!item->text().contains(filter, Qt::CaseInsensitive)); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/cclineedit_p.h0000644000175000017500000001122312277111530016404 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 Joshua Netterfield * * joshua.netterfield@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. * * * ***************************************************************************/ #include #include #include #include #include #include "cclineedit.h" #ifndef CCLINEEDIT_P_H #define CCLINEEDIT_P_H class QPushButton; namespace Kst { class CCTableModel; class CCTableView; class CategoricalCompleter : public QCompleter { Q_OBJECT QList _data; CCTableView* _tableView; CompletionCase* _currentSubset; public: friend class CCCommonEdit; friend class CCLineEdit; friend class CCTextEdit; friend class SVCCLineEdit; friend class SVCCTextEdit; /** * Creates an autocompleter for child. * * Each QStringList inside "data" represents a column. * The first element of each column is the column title (category) * The remaining elements are items under that category. * * CategoricalCompleter does not take ownership of data. */ CategoricalCompleter(QLineEdit *lineEdit, QList data); CategoricalCompleter(QTextEdit *textEdit, QList data); ~CategoricalCompleter(); protected: bool eventFilter(QObject *o, QEvent *e); // QStringList splitPath(const QString &path) const; // QString pathFromIndex(const QModelIndex &index) const; static QStringList join(CompletionCase&,QString prefix="",QStringList searchpattern=QStringList(),int complength=0); static QStringList getDefault(QList&); public slots: void verifyPrefix(); }; class CCTableModel : public QAbstractTableModel { Q_OBJECT QList _visibleData; QSize s_minSizeCache[32]; public: explicit CCTableModel(const QList& visibleData) : _visibleData(visibleData) { for(int i=0;i<32;i++) { s_minSizeCache[i]=QSize(-1,-1); } } int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; signals: void checkSize() const; }; class CCTableView : public QTableView { Q_OBJECT CompletionCase* _data; QAbstractItemModel* origModel; CategoricalCompleter* completer; CCLineEdit* _le; CCTextEdit* _te; QString _prefix; bool _goingRight; #if defined(__QNX__) || defined(__ANDROID__) QPushButton* _close; #endif public: friend class CCLineEdit; friend class CCTextEdit; friend class CategoricalCompleter; explicit CCTableView(CompletionCase* _data); const QString& prefix() { return _prefix; } protected: void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); void showEvent(QShowEvent *); void resizeEvent(QResizeEvent *event); int widgetCursorPosition() { if(_le) { return _le->cursorPosition(); } else if (_te) { return _te->textCursor().anchor(); } else { qDebug()<<"CCTableView::widgetCursorPosition(): invalid widget"; return -1; } } QString widgetText() { if(_le) { return _le->text(); } else if (_te) { return _te->toPlainText(); } else { qDebug()<<"CCTableView::widgetText(): invalid widget"; return "CCTableView::widgetText(): invalid widget"; } } public slots: void updateSuggestions(); void setColumnHeaders(QStringList columnHeaders); void setCompleter(CategoricalCompleter* completer); void setData(CompletionCase* data,QString prefix=""); void setLineEdit(CCLineEdit* le) { bool set=_le; _le=le; if(set) le->fillKstObjects(); } void setTextEdit(CCTextEdit* te) { _te=te;} signals: void activateHint(const QString&); }; } #endif // CCLINEEDIT_P_H Kst-2.0.8/src/widgets/colorpalette.h0000644000175000017500000000302012277111530016453 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef COLORPALETTE_H #define COLORPALETTE_H #include #include "ui_colorpalette.h" #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT ColorPalette : public QWidget, public Ui::ColorPalette { Q_OBJECT public: explicit ColorPalette(QWidget *parent = 0); ~ColorPalette(); QString selectedPalette(); bool selectedPaletteDirty() const; void refresh(const QString &palette = QString()); int currentPaletteIndex(); void setPalette(const QString palette); void clearSelection(); public slots: void updatePalette(const QString &palette = QString()); Q_SIGNALS: void selectionChanged(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/combobox.cpp0000644000175000017500000000303212277111530016124 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "combobox.h" #include #include namespace Kst { ComboBox::ComboBox(QWidget *parent) : QComboBox(parent), _editable(true) { setupLineEdit(); } ComboBox::ComboBox(bool editable, QWidget *parent) : QComboBox(parent), _editable(editable) { setupLineEdit(); } void ComboBox::setupLineEdit() { setInsertPolicy(QComboBox::NoInsert); setLineEdit(new QLineEdit(this)); QCompleter *currentCompleter = completer(); currentCompleter->setCompletionMode(QCompleter::PopupCompletion); currentCompleter->setCaseSensitivity(Qt::CaseSensitive); } ComboBox::~ComboBox() { } void ComboBox::setEditable(bool editable) { _editable = editable; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/fftoptions.cpp0000644000175000017500000002255612362701575016534 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fftoptions.h" #include "dialogdefaults.h" namespace Kst { FFTOptions::FFTOptions(QWidget *parent) : QWidget(parent) { setupUi(this); connect(_interleavedAverage, SIGNAL(clicked()), this, SLOT(clickedInterleaved())); connect(_apodize, SIGNAL(clicked()), this, SLOT(clickedApodize())); connect(_apodizeFunction, SIGNAL(currentIndexChanged(int)), this, SLOT(changedApodizeFxn())); connect(_apodize, SIGNAL(clicked()), this, SLOT(changedApodizeFxn())); connect(_apodizeFunction, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_output, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_apodize, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_removeMean, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_interleavedAverage, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_interpolateOverHoles, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_sampleRate, SIGNAL(textChanged(QString)), this, SIGNAL(modified())); connect(_vectorUnits, SIGNAL(textChanged(QString)), this, SIGNAL(modified())); connect(_rateUnits, SIGNAL(textChanged(QString)), this, SIGNAL(modified())); connect(_sigma, SIGNAL(valueChanged(double)), this, SIGNAL(modified())); connect(_FFTLength, SIGNAL(valueChanged(int)), this, SIGNAL(modified())); _FFTLength->setEnabled(false); _sigmaLabel->setProperty("si","S&igma:"); _apodize->setProperty("si","Apodi&ze"); textLabel2->setProperty("si","Fun&ction:"); _removeMean->setProperty("si","Remo&ve mean"); _FFTLengthLabel->setProperty("si","FFT &length: 2^"); _interleavedAverage->setProperty("si","Interleave&d average"); _interpolateOverHoles->setProperty("si","Interpolate over &holes"); TextLabel1_9_2->setProperty("si","Sa&mple rate:"); TextLabel1_9_3->setProperty("si","Vector units:"); TextLabel1_9_2_2->setProperty("si","Rate units:"); textLabel1_2->setProperty("si","Ou&tput:"); } FFTOptions::~FFTOptions() {} void FFTOptions::init() { update(); } double FFTOptions::sampleRate() const { return _sampleRate->text().toDouble(); } bool FFTOptions::sampleRateDirty() const { return !_sampleRate->text().isEmpty(); } void FFTOptions::setSampleRate(const double sampleRate) { _sampleRate->setText(QString::number(sampleRate)); } double FFTOptions::sigma() const { return _sigma->value(); } bool FFTOptions::sigmaDirty() const { return !_sigma->text().isEmpty(); } void FFTOptions::setSigma(const double sigma) { _sigma->setValue(sigma); } bool FFTOptions::interleavedAverage() const { return _interleavedAverage->isChecked(); } bool FFTOptions::interleavedAverageDirty() const { return _interleavedAverage->checkState() == Qt::PartiallyChecked; } void FFTOptions::setInterleavedAverage(const bool interleavedAverage) { _interleavedAverage->setChecked(interleavedAverage); _FFTLength->setEnabled(interleavedAverage); } bool FFTOptions::apodize() const { return _apodize->isChecked(); } bool FFTOptions::apodizeDirty() const { return _apodize->checkState() == Qt::PartiallyChecked; } void FFTOptions::setApodize(const bool apodize) { _apodize->setChecked(apodize); _apodizeFunction->setEnabled(apodize); } bool FFTOptions::removeMean() const { return _removeMean->isChecked(); } bool FFTOptions::removeMeanDirty() const { return _removeMean->checkState() == Qt::PartiallyChecked; } void FFTOptions::setRemoveMean(const bool removeMean) { _removeMean->setChecked(removeMean); } bool FFTOptions::interpolateOverHoles() const { return _interpolateOverHoles->isChecked(); } bool FFTOptions::interpolateOverHolesDirty() const { return _interpolateOverHoles->checkState() == Qt::PartiallyChecked; } void FFTOptions::setInterpolateOverHoles(const bool interpolateOverHoles) { _interpolateOverHoles->setChecked(interpolateOverHoles); } int FFTOptions::FFTLength() const { return _FFTLength->value(); } bool FFTOptions::FFTLengthDirty() const { return !_FFTLength->text().isEmpty(); } void FFTOptions::setFFTLength(const int FFTLength) { _FFTLength->setValue(FFTLength); } QString FFTOptions::vectorUnits() const { return _vectorUnits->text(); } bool FFTOptions::vectorUnitsDirty() const { return !_vectorUnits->text().isEmpty(); } void FFTOptions::setVectorUnits(const QString vectorUnits) { _vectorUnits->setText(vectorUnits); } QString FFTOptions::rateUnits() const { return _rateUnits->text(); } bool FFTOptions::rateUnitsDirty() const { return !_rateUnits->text().isEmpty(); } void FFTOptions::setRateUnits(const QString rateUnits) { _rateUnits->setText(rateUnits); } ApodizeFunction FFTOptions::apodizeFunction() const { return (ApodizeFunction)_apodizeFunction->currentIndex(); } bool FFTOptions::apodizeFunctionDirty() const { return _apodizeFunction->currentIndex() != -1; } void FFTOptions::setApodizeFunction(const ApodizeFunction apodizeFunction) { _apodizeFunction->setCurrentIndex((ApodizeFunction)apodizeFunction); } PSDType FFTOptions::output() const { return (PSDType)_output->currentIndex(); } bool FFTOptions::outputDirty() const { return _output->currentIndex() != -1; } void FFTOptions::setOutput(const PSDType output) { _output->setCurrentIndex((PSDType)output); } void FFTOptions::clearValues() { _sigma->clear(); _FFTLength->clear(); _sampleRate->clear(); _vectorUnits->clear(); _rateUnits->clear(); _apodize->setCheckState(Qt::PartiallyChecked); _interleavedAverage->setCheckState(Qt::PartiallyChecked); _removeMean->setCheckState(Qt::PartiallyChecked); _interpolateOverHoles->setCheckState(Qt::PartiallyChecked); _apodizeFunction->setCurrentIndex(-1); _output->setCurrentIndex(-1); } void FFTOptions::disableInterpolateOverHoles() { _interpolateOverHoles->setChecked(false); _interpolateOverHoles->setEnabled(false); } void FFTOptions::changedApodizeFxn() { int gaussianIndex = 5; if (_apodizeFunction->itemText(0).isEmpty()) { ++gaussianIndex; } _sigma->setEnabled(_apodizeFunction->currentIndex() == gaussianIndex && _apodize->isChecked()); _sigmaLabel->setEnabled(_apodizeFunction->currentIndex() == gaussianIndex && _apodize->isChecked()); } void FFTOptions::clickedInterleaved() { _FFTLength->setEnabled(_interleavedAverage->isChecked()); _FFTLengthLabel->setEnabled(_interleavedAverage->isChecked()); } void FFTOptions::clickedApodize() { _apodizeFunction->setEnabled(_apodize->isChecked()); } void FFTOptions::synch() { clickedInterleaved(); clickedApodize(); } bool FFTOptions::checkValues() { double new_freq = _sampleRate->text().toDouble(); int new_len = _FFTLength->text().toInt(); return checkGivenValues(new_freq, new_len); } bool FFTOptions::checkGivenValues(double sampleRate, int FFTLength) { if (sampleRate <= 0) { return false; } if (FFTLength < 2) { return false; } return true; } // store the current state of the widget as the default void FFTOptions::setWidgetDefaults() { dialogDefaults().setValue("spectrum/freq", sampleRate()); dialogDefaults().setValue("spectrum/average", interleavedAverage()); dialogDefaults().setValue("spectrum/len", FFTLength()); dialogDefaults().setValue("spectrum/apodize", apodize()); dialogDefaults().setValue("spectrum/removeMean", removeMean()); dialogDefaults().setValue("spectrum/vUnits", vectorUnits()); dialogDefaults().setValue("spectrum/rUnits", rateUnits()); dialogDefaults().setValue("spectrum/apodizeFxn", apodizeFunction()); dialogDefaults().setValue("spectrum/gaussianSigma", sigma()); dialogDefaults().setValue("spectrum/output", output()); dialogDefaults().setValue("spectrum/interpolateHoles", interpolateOverHoles()); } // set the widget to the stored default values void FFTOptions::loadWidgetDefaults() { setSampleRate(dialogDefaults().value("spectrum/freq",100.0).toDouble()); setInterleavedAverage(dialogDefaults().value("spectrum/average",true).toBool()); setFFTLength(dialogDefaults().value("spectrum/len",12).toInt()); setApodize(dialogDefaults().value("spectrum/apodize",true).toBool()); setRemoveMean(dialogDefaults().value("spectrum/removeMean",true).toBool()); setVectorUnits(dialogDefaults().value("spectrum/vUnits","V").toString()); setRateUnits(dialogDefaults().value("spectrum/rUnits","Hz").toString()); setApodizeFunction(ApodizeFunction(dialogDefaults().value("spectrum/apodizeFxn",WindowOriginal).toInt())); setSigma(dialogDefaults().value("spectrum/gaussianSigma",1.0).toDouble()); setOutput(PSDType(dialogDefaults().value("spectrum/output",PSDPowerSpectralDensity).toInt())); setInterpolateOverHoles(dialogDefaults().value("spectrum/interpolateHoles",true).toInt()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/gradienteditor.h0000644000175000017500000000414212277111530016770 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef GRADIENTEDITOR_H #define GRADIENTEDITOR_H #include #include #include #include "kstwidgets_export.h" namespace Kst { class KSTWIDGETS_EXPORT GradientEditor : public QWidget { Q_OBJECT public: explicit GradientEditor(QWidget *parent = 0); virtual ~GradientEditor(); virtual QSize sizeHint() const; QGradient gradient() const; void setDefaultGradientStops(QGradientStops stops); bool dirty() const { return _dirty; } public Q_SLOTS: void setGradient(const QGradient &gradient); void resetGradient(); Q_SIGNALS: void changed(const QGradient &gradient); protected: virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); virtual void paintEvent(QPaintEvent *event); private: bool isStopAt(const QPoint &point) const; QPainterPath marker(int x) const; QGradientStops gradientStops() const; void setGradientStops(const QGradientStops &stops); void clearGradientStops(); struct Stop { int pos; QColor color; QPainterPath path; }; private: QGradient *_gradient; QHash _stopHash; int _movingStop; QGradientStops _defaultGradientStops; bool _dirty; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/datasourceselector.cpp0000644000175000017500000000720212277111530020212 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasourceselector.h" #include "datasourceselectordialog.h" #include #include #include #include #include #include #include #include #include #include namespace Kst { DataSourceSelector::DataSourceSelector(QWidget *parent) : QWidget(parent), _mode(QFileDialog::ExistingFile) { setup(); QLabel* l=new QLabel(this); l->hide(); l->setProperty("si","data source"); l->setBuddy(_fileEdit); } DataSourceSelector::~DataSourceSelector() { } void DataSourceSelector::setup() { _fileEdit = new QLineEdit(this); _fileButton = new QToolButton(this); _fileButton->setProperty("si","file browse button"); QHBoxLayout * layout = new QHBoxLayout(this); layout->setMargin(0); layout->addWidget(_fileEdit); layout->addWidget(_fileButton); setLayout(layout); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _fileButton->setIcon(QPixmap(":kst_changefile.png")); _fileButton->setFixedSize(size + 8, size + 8); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); //connect (_fileEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(changed(const QString &))); connect (_fileEdit, SIGNAL(textChanged(QString)), this, SLOT(updateFile(QString))); connect (_fileButton, SIGNAL(clicked()), this, SLOT(chooseFile())); QFileSystemModel *dirModel = new QFileSystemModel; dirModel->setFilter(QDir::AllEntries); dirModel->setRootPath(QString('/')); QCompleter *completer = new QCompleter(this); completer->setModel(dirModel); _fileEdit->setCompleter(completer); } QString DataSourceSelector::file() const { return _file; } void DataSourceSelector::setFile(const QString &file) { _file = file; //FIXME grrr QLineEdit doc *lies* to me... the textEdited signal is being triggered!! _fileEdit->blockSignals(true); _fileEdit->setText(_file); _fileEdit->blockSignals(false); emit changed(file); } void DataSourceSelector::updateFile(const QString &file) { if (file.contains('~')) { QString home = qgetenv("HOME"); // linux if (!home.isEmpty()) { QString changed_file = file; changed_file.replace('~', home); setFile(changed_file); } home = qgetenv("USERPROFILE"); // windows, maybe (?) if (!home.isEmpty()) { QString changed_file = file; changed_file.replace('~', home); setFile(changed_file); } } else { _file = file; emit changed(file); } } void DataSourceSelector::chooseFile() { QString file; QPointer dialog = new DataSourceSelectorDialog( _file, this ); if (dialog->exec() == QDialog::Accepted) { file = dialog->selectedDataSource(); if (!file.isEmpty()) { setFile(file); } } delete dialog; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveselector.ui0000644000175000017500000000245712277111530017046 0ustar synthsynth CurveSelector 0 0 318 25 Select a curve to utilize. 0 0 0 0 0 0 300 72 Kst::ComboBox QComboBox
combobox.h
Kst-2.0.8/src/widgets/cclineedit.cpp0000644000175000017500000011111012277111530016414 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 Joshua Netterfield * * joshua.netterfield@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. * * * ***************************************************************************/ #include "cclineedit.h" #include "cclineedit_p.h" #include "dialoglauncher.h" #include "scalar.h" #include "vector.h" #include "objectstore.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef QT5 #define setResizeMode setSectionResizeMode #endif namespace Kst { QList CCCommonEdit::_u; // CompletionCase bool operator<(const CompletionCase&a,const CompletionCase&b) { return a.prefix().size() data) : QCompleter(getDefault(data)), _data(data), _tableView(new CCTableView(&_data[0])), _currentSubset(&data[0]) { setPopup(_tableView); lineEdit->setCompleter(this); _tableView->setCompleter(this); _tableView->updateSuggestions(); setCompletionMode(PopupCompletion); setCaseSensitivity(Qt::CaseInsensitive); setWrapAround(false); qSort(_data.begin(),_data.end()); connect(_tableView,SIGNAL(activateHint(QString)),this,SIGNAL(activated(QString))); } CategoricalCompleter::CategoricalCompleter(QTextEdit *textEdit, QList data) : QCompleter(getDefault(data)), _data(data), _tableView(new CCTableView(&_data[0])), _currentSubset(&data[0]) { setPopup(_tableView); _tableView->setCompleter(this); _tableView->updateSuggestions(); setCompletionMode(PopupCompletion); setCaseSensitivity(Qt::CaseInsensitive); setWrapAround(false); qSort(_data.begin(),_data.end()); connect(_tableView,SIGNAL(activateHint(QString)),this,SIGNAL(activated(QString))); } bool CategoricalCompleter::eventFilter(QObject *o, QEvent *e) { if(e->type()!=QEvent::KeyPress) { return QCompleter::eventFilter(o,e); } else { QKeyEvent *ke = static_cast(e); int key=ke->key(); #if defined(__QNX__) || defined(__ANDROID__) if (key == Qt::Key_Return || key == Qt::Key_Enter) { _tableView->hide(); return 1; } #endif int cc=_tableView->currentIndex().column(); bool cantMoveRight=(cc==_tableView->model()->columnCount()-1); bool cantMoveLeft=!cc; if(!cantMoveLeft) { bool ok=1; for(int i=0;imodel()->data(_tableView->model()->index(_tableView->currentIndex().row(),i)).toString().isEmpty()) { ok=0; break; } } cantMoveLeft=ok; } if(!cantMoveRight) { bool ok=1; for(int i=cc+1;i<_tableView->model()->columnCount();i++) { if(!_tableView->model()->data(_tableView->model()->index(_tableView->currentIndex().row(),i)).toString().isEmpty()) { ok=0; break; } } cantMoveRight=ok; } if((key!=Qt::Key_Left||!cantMoveLeft)&&(key!=Qt::Key_Right||!cantMoveRight)) { if(_tableView->isVisible()) { _tableView->keyPressEvent(ke); } } if(_tableView->isHidden()||((key!=Qt::Key_Enter)&&(key!=Qt::Key_Return)/*&&(key!=Qt::Key_Space)*/&&(key!=Qt::Key_Up)&&(key!=Qt::Key_Down&&key!=Qt::Key_PageDown&&key!=Qt::Key_PageUp))) { if(_tableView->isHidden()||(((key==Qt::Key_Left&&cantMoveLeft)||(key==Qt::Key_Right&&cantMoveRight))||(key!=Qt::Key_Left&&key!=Qt::Key_Right))) { if(_tableView->isHidden()||(!(cantMoveRight&&key==Qt::Key_Right&&_tableView->widgetCursorPosition()==_tableView->widgetText().size()))) { if(_tableView->isHidden()||(!(cantMoveLeft&&key==Qt::Key_Left&&!_tableView->widgetCursorPosition()))) { if(key!=Qt::Key_Alt&&key!=Qt::Key_Shift) { _tableView->_goingRight=key==Qt::Key_Right; (static_cast(widget()))->event(ke); //in QWidget, event(...) is protected } } } } } switch (key) { case Qt::Key_Return: case Qt::Key_Enter: case Qt::Key_Tab: if(_tableView->isVisible()) { if(_tableView->currentIndex().row()!=-1&&_tableView->currentIndex().column()!=-1) { setCompletionPrefix(_tableView->currentIndex().model()->data(_tableView->currentIndex()).toString()); emit activated(completionPrefix()); _tableView->hide(); } } break; case Qt::Key_Backtab: case Qt::Key_Escape: _tableView->hide(); break; default: break; } verifyPrefix(); } return 1; } void CategoricalCompleter::verifyPrefix() { QString search=completionPrefix(); QString altsearch=search; QStringList altlist; if(search.contains("*")) { search.remove(search.indexOf('*'),99999); altsearch.remove(0,altsearch.indexOf('*')+1); altlist=altsearch.split('*'); setCompletionPrefix(search); } for(int i=_data.size()-1;i>=0;i--) { if(!_data[i].prefix().size()||!search.indexOf(_data[i].prefix())) { SVCCLineEdit* hack=qobject_cast(widget()); if(hack&&_data[i].prefix().isEmpty()&&_data[i].size()&&_data[i][0].title().contains("Fun")) { QString operatorNextList="])0123456789"; QString functionNextList="&=<>!+-/*&^|("; int last1=-1,last2=-1; for(int i=0;itext().lastIndexOf(operatorNextList[i],hack->cursorPosition()-1)); } last1=qMax(last1,hack->text().lastIndexOf("PI ",hack->cursorPosition()-1,Qt::CaseInsensitive)); last1=qMax(last1,hack->text().lastIndexOf("e ",hack->cursorPosition()-1,Qt::CaseInsensitive)); for(int i=0;itext().lastIndexOf(functionNextList[i],hack->cursorPosition()-1)); } if(last2setData(&_data[i],_data[i].prefix()); complete(); _currentSubset=&_data[i]; setCompletionPrefix(search); } break; } } } CategoricalCompleter::~CategoricalCompleter() { //_tableView is child } QStringList CategoricalCompleter::join(CompletionCase& l,QString prefix,QStringList searchpattern,int complength) { QStringList ret; for(int i=0;i& ccl) { for(int i=0;imaxIndex) { maxIndex=x.lastIndexOf(possiblePhraseEndings[j]); search=possiblePhraseEndings[j]; } } } if(!caught||(x.lastIndexOf(']')maxIndex) { maxIndex=x.lastIndexOf(possiblePhraseEndings[i]); search=possiblePhraseEndings[i]; } } } if(!caught&&x.lastIndexOf("\\")>x.lastIndexOf(search)&&x.lastIndexOf("\\")) // this is an exception to allow non-space-sperated Latex commands { caught=1; x.remove(0,x.lastIndexOf("\\")); } else if(x.lastIndexOf(search)) { x.remove(0,x.lastIndexOf(search)+(caught?0:1)); } ChangeCurrentPrefix(x); } void CCLineEdit::keyPressEvent(QKeyEvent*ev) { if(!_cc) { QLineEdit::keyPressEvent(ev); return; } _cc->_tableView->keyPressEvent(ev); QLineEdit::keyPressEvent(ev); _cc->verifyPrefix(); _cc->_tableView->updateSuggestions(); } void CCTextEdit::insert(const QString &i, bool stringIsCompletion) { Insert(i,stringIsCompletion); } void CCTextEdit::divide(QString x) { Divide(x); } void CCTextEdit::keyPressEvent(QKeyEvent*ev) { if(!_cc) { QTextEdit::keyPressEvent(ev); return; } _cc->_tableView->keyPressEvent(ev); QTextEdit::keyPressEvent(ev); _cc->verifyPrefix(); _cc->_tableView->updateSuggestions(); } void CCLineEdit::mousePressEvent(QMouseEvent*ev) { if(ev->buttons()==Qt::LeftButton) { _cc->verifyPrefix(); _cc->_tableView->updateSuggestions(); } QLineEdit::mousePressEvent(ev); } void CCLineEdit::ChangeCurrentPrefix(QString x) { emit currentPrefixChanged(x); } void CCTextEdit::ChangeCurrentPrefix(QString x) { emit currentPrefixChanged(x); } void CCLineEdit::init(QList data) { delete _cc; _cc=new CategoricalCompleter(this,data); setCompleter(0); connect(this,SIGNAL(textChanged(QString)),this,SLOT(divide(QString))); connect(this,SIGNAL(cursorPositionChanged(int,int)),this,SLOT(divide())); connect(this,SIGNAL(currentPrefixChanged(QString)),_cc,SLOT(setCompletionPrefix(QString))); connect(_cc,SIGNAL(activated(QString)),this,SLOT(insert(QString))); _cc->_tableView->setLineEdit(this); _cc->setWidget(this); } void CCTextEdit::init(QList data) { delete _cc; _cc=new CategoricalCompleter(this,data); connect(this,SIGNAL(textChanged()),this,SLOT(divide())); connect(this,SIGNAL(cursorPositionChanged()),this,SLOT(divide())); connect(this,SIGNAL(currentPrefixChanged(QString)),_cc,SLOT(setCompletionPrefix(QString))); connect(_cc,SIGNAL(activated(QString)),this,SLOT(insert(QString))); _cc->_tableView->setTextEdit(this); _cc->setWidget(this); } void CCLineEdit::insert(const QString &i,bool stringIsCompletion) { Insert(i,stringIsCompletion); QTimer* timer=new QTimer; connect(timer,SIGNAL(timeout()),_cc->_tableView,SLOT(updateSuggestions())); connect(timer,SIGNAL(timeout()),timer,SLOT(deleteLater())); timer->start(0); #if !defined(__QNX__) && !defined(__ANDROID__) setFocus(); #endif } void CCLineEdit::divide(QString x) { Divide(x); } // SVCCLineEdit & SVCCTextEdit SVCCLineEdit::SVCCLineEdit(QWidget*p) : CCLineEdit(p),_extraData(0),_svData(0),_allData(0) { } SVCCTextEdit::SVCCTextEdit(QWidget*p) : CCTextEdit(p),_extraData(0),_svData(0),_allData(0) { } SVCCLineEdit::SVCCLineEdit(const QString &s, QWidget *p) : CCLineEdit(s,p),_extraData(0),_svData(0),_allData(0) { } SVCCTextEdit::SVCCTextEdit(const QString &s, QWidget *p) : CCTextEdit(s,p),_extraData(0),_svData(0),_allData(0) { } SVCCLineEdit::~SVCCLineEdit() { delete _extraData; delete _svData; delete _allData; } SVCCTextEdit::~SVCCTextEdit() { delete _extraData; delete _svData; delete _allData; } void SVCCLineEdit::setObjectStore(ObjectStore *store) { _store=store; fillKstObjects(); } void SVCCTextEdit::setObjectStore(ObjectStore *store) { _store=store; fillKstObjects(); } void SVCCLineEdit::init(QList data) { if(data.size()) { _extraData=_extraData?_extraData:new QList(); *_extraData=data; } if(_cc) { delete _allData; } _allData = new QList; for(int i=0;_extraData&&i<_extraData->size();i++) { _allData->push_back((*_extraData)[i]); } if(!_allData->size()) { _allData->push_back(CompletionCase("")); } //hacky { if(!_svData||!_svData->size()||(_svData->at(0).size()<2)) { return; } for(int i=0;i<_svData->front().size();i++) { _allData[0][1].push_back(_svData->front()[i]); } for(int i=1;_svData&&i<_svData->size();i++) { _allData->push_back((*_svData)[i]); } // } CCLineEdit::init(*_allData); } void SVCCTextEdit::init(QList data) { if(data.size()) { _extraData=_extraData?_extraData:new QList(); *_extraData=data; } if(_cc) { delete _allData; } _allData = new QList; for(int k=0;k<2;k++) { QList* add=k?_svData:_extraData; for(int i=0;add&&isize();i++) { _allData->push_back((*add)[i]); } } _allData->push_back(CompletionCase("\\")); /*The syntax for labels is a derivative of a subset of LaTeX. " "Supported syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, " "\\textcolor{color name}{colored text}, \\textbf{bold text}, " "\\textit{italicized text}, \\t, \\sum, \\sqrt, " "\\underline{underlined text}, \\overline{overlined text}, " "x^y, x_y. " "Scalars, equations, and vector elements can be embedded. " "Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[.*/ _allData->back().push_back(Category("Greek Letter Names")); _allData->back().back().push_back("Alpha"); _allData->back().back().push_back("Beta"); _allData->back().back().push_back("Gamma"); _allData->back().back().push_back("Delta"); _allData->back().back().push_back("Epsilon"); _allData->back().back().push_back("Zeta"); _allData->back().back().push_back("Eta"); _allData->back().back().push_back("Theta"); _allData->back().back().push_back("Iota"); _allData->back().back().push_back("Kappa"); _allData->back().back().push_back("Lambda"); _allData->back().back().push_back("Mu"); _allData->back().back().push_back("Nu"); _allData->back().back().push_back("Xi"); _allData->back().back().push_back("Omicron"); _allData->back().back().push_back("Pi"); _allData->back().back().push_back("Rho"); _allData->back().back().push_back("Sigma"); _allData->back().back().push_back("Tau"); _allData->back().back().push_back("Upsilon"); _allData->back().back().push_back("Phi"); _allData->back().back().push_back("Chi"); _allData->back().back().push_back("Psi"); _allData->back().back().push_back("Omega"); int max=_allData->back().back().size(); for(int i=0;iback().back().push_back(_allData->back().back()[i].toLower()); } _allData->back().push_back(Category("Math Symbols")); _allData->back().back().push_back("Approx"); _allData->back().back().push_back("Cdot"); _allData->back().back().push_back("Epsilon"); _allData->back().back().push_back("Ell"); _allData->back().back().push_back("Geq"); _allData->back().back().push_back("Ge"); _allData->back().back().push_back("Inf"); _allData->back().back().push_back("Int"); _allData->back().back().push_back("Leq"); _allData->back().back().push_back("Le"); _allData->back().back().push_back("Ne"); _allData->back().back().push_back("Overline{"); _allData->back().back().push_back("Odot"); _allData->back().back().push_back("Partial"); _allData->back().back().push_back("Prod"); _allData->back().back().push_back("Pm"); _allData->back().back().push_back("Textcolor{"); _allData->back().back().push_back("Textbf{"); _allData->back().back().push_back("Textit{"); _allData->back().back().push_back("Sum"); _allData->back().back().push_back("Sqrt"); _allData->back().back().push_back("Underline{"); CCTextEdit::init(*_allData); } #define SIZE_LIMITED_NAME sizeLimitedName( (_cc&&_cc->_tableView)?_cc->_tableView->font():QFont(), \ (_cc&&_cc->_tableView)? ((_cc->_tableView->width()/2-50)): INT_MAX) void SVCCLineEdit::fillKstObjects() { if(!_store) { qDebug()<<"Warning: SVCCLineEdit::fillKstObjects() called without object store..."; return; } if(_svData) { delete _svData; } CCLineEdit::init(*_extraData); _svData = new QList; _svData->push_back(CompletionCase("")); _svData->back().push_back(Category("Scalars")); _svData->back().back().push_back("PI "); _svData->back().back().push_back("e "); _svData->back().push_back(Category("Vectors")); _svData->push_back(CompletionCase("[")); _svData->back().push_back(Category("Scalars")); _svData->back().push_back(Category("Vectors")); ScalarList scalarList = _store->getObjects(); VectorList vectorList = _store->getObjects(); if(_cc&&_cc->_tableView) { _cc->_tableView->setFixedWidth(_cc->_tableView->width()); } ScalarList::ConstIterator scalarIt = scalarList.constBegin(); for (; scalarIt != scalarList.constEnd(); ++scalarIt) { ScalarPtr scalar = (*scalarIt); scalar->readLock(); if (!scalar->hidden()) { _svData->back()[0].push_back(scalar->SIZE_LIMITED_NAME+']'); _svData->front()[0].push_back('['+scalar->SIZE_LIMITED_NAME+']'); } scalar->unlock(); } VectorList::ConstIterator vectorIt = vectorList.constBegin(); for (; vectorIt != vectorList.constEnd(); ++vectorIt) { VectorPtr vector = (*vectorIt); vector->readLock(); _svData->back()[1].push_back(vector->SIZE_LIMITED_NAME+']'); _svData->front()[1].push_back('['+vector->SIZE_LIMITED_NAME+']'); vector->unlock(); } init(); } void SVCCTextEdit::fillKstObjects() { if(!_store) { qDebug()<<"Warning: SVCCTextEdit::fillKstObjects() called without object store..."; return; } if(_svData) { delete _svData; } if(!_extraData) _extraData=new QList; CCTextEdit::init(*_extraData); _svData = new QList; _svData->push_back(CompletionCase("[")); _svData->back().push_back(Category("Scalars")); if(_cc&&_cc->_tableView) { _cc->_tableView->setFixedWidth(_cc->_tableView->width()); } ScalarList scalarList = _store->getObjects(); StringList stringList = _store->getObjects(); ScalarList::ConstIterator scalarIt = scalarList.constBegin(); for (; scalarIt != scalarList.constEnd(); ++scalarIt) { ScalarPtr scalar = (*scalarIt); scalar->readLock(); _svData->back()[0].push_back(scalar->SIZE_LIMITED_NAME+']'); scalar->unlock(); } _svData->back().push_back(Category("Strings")); StringList::ConstIterator stringIt = stringList.constBegin(); for (; stringIt != stringList.constEnd(); ++stringIt) { StringPtr string = (*stringIt); string->readLock(); _svData->back()[1].push_back(string->SIZE_LIMITED_NAME+']'); string->unlock(); } init(); } void SVCCLineEdit::contextMenuEvent(QContextMenuEvent *event) { QMouseEvent fake(QEvent::MouseButtonPress,event->pos(),Qt::NoButton,Qt::NoButton,Qt::NoModifier); mousePressEvent(&fake); //update cursor QMenu *menu = createStandardContextMenu(); QAction* newVectorAction=new QAction(tr("Insert New &Vector"),this); connect(newVectorAction,SIGNAL(triggered()),this,SLOT(newVector())); menu->insertAction(menu->actions()[0],newVectorAction); QAction* newScalarAction=new QAction(tr("Insert New &Scalar"),this); connect(newScalarAction,SIGNAL(triggered()),this,SLOT(newScalar())); menu->insertAction(menu->actions()[1],newScalarAction); QAction* editAction=0; QString x=text(); int openVector=x.lastIndexOf("[",cursorPosition()); int closeVector=x.indexOf("]",cursorPosition()); if(openVector!=-1&&closeVector!=-1) { x.remove(0,openVector+1); x.remove(closeVector-openVector-1,99999); if(x.indexOf("[")==x.indexOf("]")&&x.indexOf("[")==-1) { QString x=text(); int openVector=x.lastIndexOf("[",cursorPosition()); int closeVector=x.indexOf("]",cursorPosition()); if(openVector!=-1&&closeVector!=-1) { x.remove(0,openVector+1); x.remove(closeVector-openVector-1,99999); if(x.indexOf("[")==x.indexOf("]")&&x.indexOf("[")==-1) { ObjectPtr ptr = _store->retrieveObject(x); VectorPtr vector = kst_cast(ptr); ScalarPtr scalar = kst_cast(ptr); if((scalar&&scalar->editable())||(vector&&vector->editable())) { editAction=new QAction(tr("Edit")+" "+x,this); connect(editAction,SIGNAL(triggered()),this,SLOT(editItem())); menu->insertAction(menu->actions()[2],editAction); } } } } } menu->insertSeparator(menu->actions()[editAction?3:2]); menu->exec(event->globalPos()); delete menu; delete newVectorAction; delete newScalarAction; delete editAction; } void SVCCTextEdit::contextMenuEvent(QContextMenuEvent *event) { QMouseEvent fake(QEvent::MouseButtonPress,event->pos(),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier); mousePressEvent(&fake); //update cursor QMenu *menu = createStandardContextMenu(); /*QAction* newVectorAction=new QAction(tr("Insert New &Vector"),this); connect(newVectorAction,SIGNAL(triggered()),this,SLOT(newVector())); menu->insertAction(menu->actions()[0],newVectorAction);*/ QAction* newScalarAction=new QAction(tr("Insert New &Scalar"),this); connect(newScalarAction,SIGNAL(triggered()),this,SLOT(newScalar())); menu->insertAction(menu->actions()[0],newScalarAction); QAction* newStringAction=new QAction(tr("Insert New &String"),this); connect(newStringAction,SIGNAL(triggered()),this,SLOT(newString())); menu->insertAction(menu->actions()[1],newStringAction); QAction* editAction=0; QString x=toPlainText(); int openVector=x.lastIndexOf("[",textCursor().position()); int closeVector=x.indexOf("]",textCursor().position()); if(openVector!=-1&&closeVector!=-1) { x.remove(0,openVector+1); x.remove(closeVector-openVector-1,99999); if(x.indexOf("[")==x.indexOf("]")&&x.indexOf("[")==-1) { QString x=toPlainText(); int openVector=x.lastIndexOf("[",textCursor().position()); int closeVector=x.indexOf("]",textCursor().position()); if(openVector!=-1&&closeVector!=-1) { x.remove(0,openVector+1); x.remove(closeVector-openVector-1,99999); if(x.indexOf("[")==x.indexOf("]")&&x.indexOf("[")==-1) { ObjectPtr ptr = _store->retrieveObject(x); //VectorPtr vector = kst_cast(ptr); ScalarPtr scalar = kst_cast(ptr); StringPtr string = kst_cast(ptr); if((scalar&&scalar->editable())||(string&&string->editable())) { editAction=new QAction(tr("Edit")+" "+x,this); connect(editAction,SIGNAL(triggered()),this,SLOT(editItem())); menu->insertAction(menu->actions()[2],editAction); } } } } } menu->insertSeparator(menu->actions()[editAction?3:2]); menu->exec(event->globalPos()); delete menu; //delete newVectorAction; delete newScalarAction; delete newStringAction; delete editAction; } void CCCommonEdit::NewVector() { QString newName; DialogLauncher::self()->showVectorDialog(newName, 0, true); foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } VectorPtr vector = kst_cast(_store->retrieveObject(newName)); if (vector) { QString vName='['+vector->Name()+']'; Insert(vName,0); } } void CCCommonEdit::NewScalar() { QString scalarName; DialogLauncher::self()->showScalarDialog(scalarName, 0, true); foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } ScalarPtr scalar = kst_cast(_store->retrieveObject(scalarName)); if (scalar) { QString sName='['+scalar->Name()+']'; Insert(sName,0); } } void CCCommonEdit::NewString() { QString stringName; DialogLauncher::self()->showStringDialog(stringName, 0, true); foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } StringPtr string = kst_cast(_store->retrieveObject(stringName)); if (string) { QString sName='['+string->Name()+']'; Insert(sName,0); } } void CCCommonEdit::EditItem() { QString x=Text(); int openVector=x.lastIndexOf("[",CursorPosition()); int closeVector=x.indexOf("]",CursorPosition()); if(openVector!=-1&&closeVector!=-1) { x.remove(0,openVector+1); x.remove(closeVector-openVector-1,99999); if(x.indexOf("[")==x.indexOf("]")&&x.indexOf("[")==-1) { ObjectPtr ptr = _store->retrieveObject(x); //could be: VectorPtr vector = kst_cast(ptr); ScalarPtr scalar = kst_cast(ptr); StringPtr string = kst_cast(ptr); if(vector) { if (vector->provider()) { DialogLauncher::self()->showObjectDialog(vector->provider()); } else { if(ObjectPtr(vector)) { QString vectorName; DialogLauncher::self()->showVectorDialog(vectorName,ObjectPtr(vector),1); } } foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } } else if(scalar) { if (scalar->provider()) { DialogLauncher::self()->showObjectDialog(scalar->provider()); } else { if(ObjectPtr(scalar)) { QString scalarName; DialogLauncher::self()->showScalarDialog(scalarName,ObjectPtr(scalar),1); } } foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } } else if(string) { if (string->provider()) { DialogLauncher::self()->showObjectDialog(string->provider()); } else { if(ObjectPtr(string)) { QString stringName; DialogLauncher::self()->showScalarDialog(stringName,ObjectPtr(string),1); } } foreach(CCCommonEdit* ccc, _u) { ccc->fillKstObjects(); } } } } } // CCTableModel int CCTableModel::rowCount(const QModelIndex &) const { int max=0; for(int i=0;i<_visibleData.size();i++) { max=qMax(max,_visibleData[i].size()); } return max-1; // top row is title } int CCTableModel::columnCount(const QModelIndex &) const { return _visibleData.size(); } QVariant CCTableModel::data(const QModelIndex &index, int role) const { if(role==Qt::SizeHintRole) { //evil problems have evil solutions -_- emit checkSize(); if(index.column()>=columnCount(QModelIndex())) { return QVariant(); } if(s_minSizeCache[index.column()]!=QSize(-1,-1)) { return s_minSizeCache[index.column()]; } QLabel tmp; int wid=0; for(int i=0;i<_visibleData[index.column()].size();i++) { tmp.setText(_visibleData[index.column()][i]); wid=qMax(wid,tmp.sizeHint().width()); } QSize s=tmp.sizeHint(); s.setWidth(wid*1.1); return const_cast(this)->s_minSizeCache[index.column()]=s; } if(role!=Qt::DisplayRole) return QVariant(); // Return unvalid QVariant Q_ASSERT(index.column()=_visibleData[index.column()].size()) return QVariant(""); // +1 because top row is title return _visibleData[index.column()][index.row()+1]; // +1 because top row is title } Qt::ItemFlags CCTableModel::flags(const QModelIndex &) const { return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } QVariant CCTableModel::headerData ( int section, Qt::Orientation orientation, int role ) const { Q_UNUSED(orientation); if(role!=Qt::DisplayRole) return QVariant(); else return _visibleData[section][0]; } // CCTableView CCTableView::CCTableView(CompletionCase* data) : _data(data), origModel(0), completer(0), _le(0), _te(0), _goingRight(0) { #if defined(__QNX__) || defined(__ANDROID__) _close = new QPushButton("X", this); _close->setGeometry(width()-50,0,40,40); _close->show(); connect(_close, SIGNAL(clicked()), this, SLOT(hide())); #endif setSelectionMode(QAbstractItemView::SingleSelection); setSelectionBehavior(QAbstractItemView::SelectItems); setMinimumHeight(150); verticalHeader()->hide(); setWindowModality(Qt::NonModal); } void CCTableView::updateSuggestions() { if(parentWidget()) { setFixedWidth(qMin(width(),parentWidget()->width())); } //this could be made more efficient. if(!model()||(!_le&&!_te)) { return; } if(!origModel) origModel=model(); else delete model(); QList items; for(int i=0;i<_data->size();i++) { items.push_back(QStringList()); items[i].push_back((*_data)[i].title()); } QString x=completer->completionPrefix(); if(_le) { x.truncate(_le->cursorPosition()); } else if (_te) { x.truncate(_te->textCursor().position()); } for(int i=0;icompletionCount();i++) { completer->setCurrentRow(i); QString item=completer->currentCompletion(); item.remove(_prefix); int x=-1; for(int j=0;j<_data->size();j++) { switch((*_data)[j].indexOf(item)) { case -1: break; default: x=j; break; } if(x==j) break; } if(x!=-1) { items[x]<<_data->prefix()+item; } } for(int i=0;ihideSection(i); } else { horizontalHeader()->showSection(i); } } CCTableModel* tmodel=new CCTableModel(items); setModel(tmodel); int minOK=-1; int maxOK=-1; for(int i=0;i<_data->size();i++) { if(items[i].size()>1) { minOK=(minOK==-1)?i:minOK; maxOK=i; } } if(minOK!=-1) { setCurrentIndex(model()->index(0,_goingRight?maxOK:minOK)); } resizeColumnsToContents(); horizontalHeader()->setStretchLastSection(1); completer->complete(); } void CCTableView::setColumnHeaders(QStringList columnHeaders) { for(int i=0;isetHeaderData(i,Qt::Horizontal,columnHeaders[i]); } } void CCTableView::setCompleter(CategoricalCompleter* completer) { setWindowModality(Qt::NonModal); this->completer=completer; } void CCTableView::setData(CompletionCase* data,QString prefix) { _prefix=prefix; _data=data; origModel=0; updateSuggestions(); } void CCTableView::keyPressEvent(QKeyEvent *event) { QTableView::keyPressEvent(event); } void CCTableView::mousePressEvent(QMouseEvent *event) { QPoint pos = event->pos(); QModelIndex idx = indexAt(pos); setCurrentIndex(idx); if(currentIndex().row()!=-1&¤tIndex().column()!=-1) { completer->setCompletionPrefix(currentIndex().model()->data(currentIndex()).toString()); emit activateHint(completer->completionPrefix()); if(_le) { _le->insert(completer->completionPrefix()); } else { _te->insert(completer->completionPrefix()); } hide(); } else { hide(); return; } completer->verifyPrefix(); updateSuggestions(); } void CCTableView::showEvent(QShowEvent *) { horizontalHeader()->setResizeMode(QHeaderView::Interactive); horizontalHeader()->setStretchLastSection(1); } void CCTableView::resizeEvent(QResizeEvent*ev) { #if defined(__QNX__) || defined(__ANDROID__) _close->setGeometry(width()-50,0,40,40); #endif QTableView::resizeEvent(ev); } } Kst-2.0.8/src/widgets/modelessinfobox.h0000644000175000017500000000276212277111530017172 0ustar synthsynth/*************************************************************************** modelessinfobox.h: a dialog with a read-only texedit in it for displaing help modelessly. ------------------- begin : June, 2012 copyright : (C) 2012 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef MODELESSINFOBOX_H #define MODELESSINFOBOX_H #include namespace Ui { class ModelessInfoBox; } class ModelessInfoBox : public QDialog { Q_OBJECT public: explicit ModelessInfoBox(QWidget *parent = 0); ~ModelessInfoBox(); void setText(QString text); void setWidth(int charwidth); private: Ui::ModelessInfoBox *ui; }; #endif // MODELESSINFOBOX_H Kst-2.0.8/src/widgets/filerequester.cpp0000644000175000017500000000666012277111530017205 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "filerequester.h" #include #include #include #include #include #include #include #include namespace Kst { FileRequester::FileRequester(QWidget *parent) : QWidget(parent), _mode(QFileDialog::AnyFile) { setup(); } FileRequester::~FileRequester() { } void FileRequester::setup() { _fileEdit = new QLineEdit(this); _fileButton = new QToolButton(this); QHBoxLayout * layout = new QHBoxLayout(this); layout->setMargin(0); layout->addWidget(_fileEdit); layout->addWidget(_fileButton); setLayout(layout); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _fileButton->setIcon(QPixmap(":kst_changefile.png")); _fileButton->setFixedSize(size + 8, size + 8); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); connect (_fileEdit, SIGNAL(textChanged(QString)), this, SLOT(updateFile(QString))); connect (_fileButton, SIGNAL(clicked()), this, SLOT(chooseFile())); QFileSystemModel *dirModel = new QFileSystemModel(this); dirModel->setFilter(QDir::AllEntries); dirModel->setRootPath(QString('/')); QCompleter *completer = new QCompleter(this); completer->setModel(dirModel); _fileEdit->setCompleter(completer); } QString FileRequester::file() const { return _file; } void FileRequester::setFile(const QString &file) { _file = file; //FIXME grrr QLineEdit doc *lies* to me... the textEdited signal is being triggered!! _fileEdit->blockSignals(true); _fileEdit->setText(_file); _fileEdit->blockSignals(false); emit changed(file); } void FileRequester::updateFile(const QString &file) { if (file.contains('~')) { QString home = qgetenv("HOME"); // linux if (!home.isEmpty()) { QString changed_file = file; changed_file.replace('~', home); setFile(changed_file); return; } home = qgetenv("USERPROFILE"); // windows, maybe (?) if (!home.isEmpty()) { QString changed_file = file; changed_file.replace('~', home); setFile(changed_file); return; } } _file = file; emit changed(file); } void FileRequester::chooseFile() { QString file; if (_mode == QFileDialog::ExistingFile) { file = QFileDialog::getOpenFileName(this, tr("Open File"), _file, tr("All Files (*)")); } else if (_mode == QFileDialog::Directory) { file = QFileDialog::getExistingDirectory(this, tr("Logfile Directory"), _file); } else { file = QFileDialog::getSaveFileName(this, tr("Save File"), _file, tr("All Files (*)")); } if (!file.isEmpty()) { setFile(file); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/modelessinfobox.ui0000644000175000017500000000321712277111530017354 0ustar synthsynth ModelessInfoBox 0 0 400 300 Dialog true Qt::Horizontal 325 20 0 0 Close pushButton clicked() ModelessInfoBox reject() 344 293 266 277 Kst-2.0.8/src/widgets/widgets.cpp0000644000175000017500000000617212277111530015772 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef __QNX__ #include "widgets.h" namespace Kst { Widgets::Widgets(QObject *parent) : QObject(parent) { _plugins.append(new ColorButtonPlugin(this)); _plugins.append(new DataSourceSelectorPlugin(this)); _plugins.append(new GradientEditorPlugin(this)); _plugins.append(new FileRequesterPlugin(this)); _plugins.append(new ComboBoxPlugin(this)); _plugins.append(new DataRangePlugin(this)); _plugins.append(new CurveSelectorPlugin(this)); _plugins.append(new VectorSelectorPlugin(this)); _plugins.append(new MatrixSelectorPlugin(this)); _plugins.append(new ScalarSelectorPlugin(this)); _plugins.append(new StringSelectorPlugin(this)); _plugins.append(new CurvePlacementPlugin(this)); _plugins.append(new CurveAppearancePlugin(this)); _plugins.append(new FFTOptionsPlugin(this)); _plugins.append(new ColorPalettePlugin(this)); _plugins.append(new LabelBuilderPlugin(this)); _plugins.append(new LabelLineEditPlugin(this)); } Widgets::~Widgets() { } WidgetPlugin::WidgetPlugin(QObject *parent) : QObject(parent), _initialized(false) { } WidgetPlugin::~WidgetPlugin() { } QString WidgetPlugin::group() const { return tr("Kst Widgets"); } QString WidgetPlugin::toolTip() const { return QString(); } QString WidgetPlugin::whatsThis() const { return QString(); } QString WidgetPlugin::instanceName() const { //QString name = static_cast(this)->name().replace("", ""); QString name = static_cast(this)->name(); QChar camel = name.at(0).toLower(); return name.replace(0,1,camel.toLower()); } QString WidgetPlugin::includeFile() const { return instanceName().toLower() + ".h"; } QString WidgetPlugin::domXml() const { QString name = static_cast(this)->name(); return QString::fromUtf8("") .arg(name).arg(instanceName()); } bool WidgetPlugin::isContainer() const { return false; } bool WidgetPlugin::isInitialized() const { return _initialized; } QIcon WidgetPlugin::icon() const { return QIcon(); } void WidgetPlugin::initialize(QDesignerFormEditorInterface *) { if (_initialized) return; _initialized = true; } Q_EXPORT_PLUGIN2(widgets, Widgets) } #endif // __QNX__ // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/stringselector.h0000644000175000017500000000342312277111530017034 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STRINGSELECTOR_H #define STRINGSELECTOR_H #include #include "ui_stringselector.h" #include #include "kstwidgets_export.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT StringSelector : public QWidget, public Ui::StringSelector { Q_OBJECT public: explicit StringSelector(QWidget *parent = 0, ObjectStore *store = 0); virtual ~StringSelector(); void setObjectStore(ObjectStore *store); StringPtr selectedString() const; void setSelectedString(StringPtr selectedString); bool allowEmptySelection() const; void setAllowEmptySelection(bool allowEmptySelection); void fillStrings(); Q_SIGNALS: void selectionChanged(const QString&); private Q_SLOTS: void newString(); void editString(); void emitSelectionChanged(); void updateDescriptionTip(); private: bool _allowEmptySelection; ObjectStore *_store; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/vectorselector.cpp0000644000175000017500000001473412277111530017372 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "vectorselector.h" #include "dialoglauncher.h" #include "datacollection.h" #include "objectstore.h" #include "dialogdefaults.h" #include "curve.h" #include "updateserver.h" namespace Kst { VectorSelector::VectorSelector(QWidget *parent, ObjectStore *store) : QWidget(parent), _allowEmptySelection(false), _isX(false), _store(store) { setupUi(this); int size = style()->pixelMetric(QStyle::PM_SmallIconSize); _newVector->setIcon(QPixmap(":kst_vectornew.png")); _editVector->setIcon(QPixmap(":kst_vectoredit.png")); _newVector->setFixedSize(size + 8, size + 8); _editVector->setFixedSize(size + 8, size + 8); _vector->resize(10,5); fillVectors(); connect(_newVector, SIGNAL(pressed()), this, SLOT(newVector())); connect(_editVector, SIGNAL(pressed()), this, SLOT(editVector())); connect(_vector, SIGNAL(activated(int)), this, SLOT(emitSelectionChanged())); connect(_vector, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDescriptionTip())); connect(UpdateServer::self(), SIGNAL(objectListsChanged()), this, SLOT(fillVectors())); } VectorSelector::~VectorSelector() { } void VectorSelector::setObjectStore(ObjectStore *store) { _store = store; fillVectors(); } void VectorSelector::updateDescriptionTip() { if (selectedVector()) { setToolTip(selectedVector()->descriptionTip()); } else { setToolTip(QString()); } } void VectorSelector::emitSelectionChanged() { if (_allowEmptySelection && (_vector->count()>0)) { _editVector->setDisabled(_vector->currentIndex()==0); } emit selectionChanged(_vector->currentText()); } VectorPtr VectorSelector::selectedVector() const { QString shortName; QRegExp rx("(\\(|^)([A-Z]\\d+)(\\)$|$)"); rx.indexIn(_vector->currentText()); shortName = '('+rx.cap(2)+')'; for(int i=0;i<_vector->count();i++) { if(_vector->itemText(i).contains(shortName)) { return _vector->itemData(i).value(); } } return _vector->itemData(_vector->currentIndex()).value(); } bool VectorSelector::vectorSelected() const { return (_vector->currentIndex()>=0); } bool VectorSelector::selectedVectorDirty() const { return _vector->currentIndex() != -1; } void VectorSelector::setSelectedVector(VectorPtr selectedVector) { if (!selectedVector) { return; } // "findData can't work here" says the trolls... so we do it 'manually'. //int i = _vector->findData(qVariantFromValue(selectedVector.data())); int i=-1; for (int j=0; j<_vector->count() ; ++j) { if (selectedVector.data() == _vector->itemData(j).value()) { i=j; break; } } Q_ASSERT(i != -1); _vector->setCurrentIndex(i); } void VectorSelector::clearSelection() { _vector->setCurrentIndex(-1); } bool VectorSelector::allowEmptySelection() const { return _allowEmptySelection; } void VectorSelector::setAllowEmptySelection(bool allowEmptySelection) { _allowEmptySelection = allowEmptySelection; int i = _vector->findText(tr("")); if (i != -1) _vector->removeItem(i); if (_allowEmptySelection) { _vector->insertItem(0, tr(""), qVariantFromValue(0)); _vector->setCurrentIndex(0); _editVector->setEnabled(false); } } void VectorSelector::newVector() { QString newName; if (_isX) { newName = dialogDefaults().value("curve/xvectorfield","INDEX").toString(); } DialogLauncher::self()->showVectorDialog(newName, 0, true); fillVectors(); VectorPtr vector = kst_cast(_store->retrieveObject(newName)); if (vector) { setSelectedVector(vector); emitSelectionChanged(); emit contentChanged(); } } void VectorSelector::editVector() { if (!selectedVector()) { return; // Don't crash when the user clicks the Edit vector button and there is no selected vector } else if (selectedVector()->provider()) { DialogLauncher::self()->showObjectDialog(selectedVector()->provider()); } else { QString vectorname; DialogLauncher::self()->showVectorDialog(vectorname, ObjectPtr(selectedVector()), true); } fillVectors(); // we might have just changed the name, so refill the combo. emit contentChanged(); } void VectorSelector::setToLastX(QString field) { if (!_store) { return; } int match = -1; VectorList vectors = _store->getObjects(); int size = vectors.size(); for (int i = 0; i < size; ++i) { if (vectors.at(i)->descriptiveName() == field) { match = i; } } if (match >-1) { setSelectedVector(vectors.at(match)); } else { CurveList objects = _store->getObjects(); if (objects.count()>0) { setSelectedVector(objects.at(objects.count()-1)->xVector()); } } } void VectorSelector::fillVectors() { if (!_store) { return; } int current_index = _vector->currentIndex(); VectorPtr current = selectedVector(); QHash vectors; VectorList vectorList = _store->getObjects(); VectorList::ConstIterator it = vectorList.constBegin(); for (; it != vectorList.constEnd(); ++it) { VectorPtr vector = (*it); if (vector->isScalarList()) continue; vector->readLock(); vectors.insert(vector->CleanedName(), vector); vector->unlock(); } QStringList list = vectors.keys(); qSort(list); _vector->clear(); foreach (const QString &string, list) { VectorPtr v = vectors.value(string); _vector->addItem(string, qVariantFromValue(v.data())); } _editVector->setEnabled(_vector->count() > 0); if (_allowEmptySelection) //reset the setAllowEmptySelection(true); if (current_index==-1) { _vector->setCurrentIndex(current_index); } else if (current) { setSelectedVector(current); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/modelessinfobox.cpp0000644000175000017500000000313712277111530017522 0ustar synthsynth/*************************************************************************** modelessinfobox.cpp: a dialog with a read-only texedit in it for displaing help modelessly. ------------------- begin : June, 2012 copyright : (C) 2012 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "modelessinfobox.h" #include "ui_modelessinfobox.h" ModelessInfoBox::ModelessInfoBox(QWidget *parent) : QDialog(parent), ui(new Ui::ModelessInfoBox) { ui->setupUi(this); } ModelessInfoBox::~ModelessInfoBox() { delete ui; } void ModelessInfoBox::setText(QString text) { ui->_text->setText(text); } void ModelessInfoBox::setWidth(int charwidth) { float one_char = ui->_text->fontMetrics().averageCharWidth(); ui->_text->setMinimumWidth(charwidth*one_char); //setGeometry(geo); } Kst-2.0.8/src/widgets/curveselector.h0000644000175000017500000000345012277111530016652 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVESELECTOR_H #define CURVESELECTOR_H #include #include "ui_curveselector.h" #include #include "kstwidgets_export.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT CurveSelector : public QWidget, public Ui::CurveSelector { Q_OBJECT public: explicit CurveSelector(QWidget *parent = 0, ObjectStore *store = 0); virtual ~CurveSelector(); void setObjectStore(ObjectStore *store); CurvePtr selectedCurve() const; bool selectedCurveDirty() const; void setSelectedCurve(CurvePtr selectedCurve); bool allowEmptySelection() const; void setAllowEmptySelection(bool allowEmptySelection); void clearSelection(); virtual bool event(QEvent * event); Q_SIGNALS: void selectionChanged(const QString&); private Q_SLOTS: void emitSelectionChanged(); private: void fillCurves(); private: bool _allowEmptySelection; ObjectStore *_store; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/datarange.h0000644000175000017500000000501212277111530015707 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATARANGE_H #define DATARANGE_H #include #include "ui_datarange.h" #include "kstwidgets_export.h" namespace Kst { //FIXME Need to add time related methods/functionality class KSTWIDGETS_EXPORT DataRange : public QWidget, public Ui::DataRange { Q_OBJECT public: explicit DataRange(QWidget *parent = 0); virtual ~DataRange(); qreal start() const; bool startDirty() const; void setStart(qreal start); QString startUnits() const; int startUnitsIndex() const; void setStartUnits(const QString &startUnits); qreal range() const; bool rangeDirty() const; void setRange(qreal range); void updateIndexList(const QStringList &indexFields); void clearIndexList(); //FIXME Probably should be an enum... QString rangeUnits() const; int rangeUnitsIndex() const; void setRangeUnits(const QString &rangeUnits); int skip() const; bool skipDirty() const; void setSkip(int skip); bool countFromEnd() const; bool countFromEndDirty() const; void setCountFromEnd(bool countFromEnd); bool readToEnd() const; bool readToEndDirty() const; void setReadToEnd(bool readToEnd); bool doSkip() const; bool doSkipDirty() const; void setDoSkip(bool doSkip); bool doFilter() const; bool doFilterDirty() const; void setDoFilter(bool doFilter); void clearValues(); void setWidgetDefaults(); void loadWidgetDefaults(); Q_SIGNALS: void modified(); private Q_SLOTS: void countFromEndChanged(); void readToEndChanged(); void doSkipChanged(); private: QString _requestedRangeUnits; QString _requestedStartUnits; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/scalarlistselector.ui0000644000175000017500000000275412277111530020063 0ustar synthsynth ScalarListSelector 0 0 283 284 Dialog 70 240 201 32 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok 20 10 41 21 Search: 70 10 201 21 20 40 256 192 Kst-2.0.8/src/widgets/labellineedit.cpp0000644000175000017500000000437012277111530017117 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2008 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "labellineedit.h" #include namespace Kst { LabelLineEdit::LabelLineEdit(QWidget *parent) : QLineEdit(parent) { setWhatsThis(tr("The syntax for labels is a derivative of a subset of LaTeX. " "Supported syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, " "\\textcolor{color name}{colored text}, \\textbf{bold text}, " "\\textit{italicized text}, \\t, \\sum, \\sqrt, " "\\underline{underlined text}, \\overline{overlined text}, " "x^y, x_y. " "Scalars, equations, and vector elements can be embedded. " "Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[.")); setToolTip(tr("Label text. A subset of LaTeX is supported. See What's This.")); } LabelLineEdit::~LabelLineEdit() { } void LabelLineEdit::focusInEvent ( QFocusEvent * event ) { emit inFocus(); QLineEdit::focusInEvent(event); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveselector.cpp0000644000175000017500000000700112277111530017201 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curveselector.h" #include "dialoglauncher.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { CurveSelector::CurveSelector(QWidget *parent, ObjectStore *store) : QWidget(parent), _allowEmptySelection(false), _store(store) { setupUi(this); fillCurves(); connect(_curve, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSelectionChanged())); } CurveSelector::~CurveSelector() { } void CurveSelector::setObjectStore(ObjectStore *store) { _store = store; fillCurves(); } void CurveSelector::emitSelectionChanged() { emit selectionChanged(_curve->currentText()); } CurvePtr CurveSelector::selectedCurve() const { return _curve->itemData(_curve->currentIndex()).value(); } bool CurveSelector::selectedCurveDirty() const { return _curve->currentIndex() != -1; } void CurveSelector::setSelectedCurve(CurvePtr selectedCurve) { //FIXME: findData doesn't work, but the loop here - which is supposed // to do exactly the same thing - does. WHY??? //int i = _curve->findData(qVariantFromValue(selectedVector.data())); int i=-1; for (int j=0; j<_curve->count() ; j++) { if (selectedCurve.data() == _curve->itemData(j).value()) { i=j; break; } } Q_ASSERT(i != -1); _curve->setCurrentIndex(i); } void CurveSelector::clearSelection() { _curve->setCurrentIndex(-1); } bool CurveSelector::allowEmptySelection() const { return _allowEmptySelection; } void CurveSelector::setAllowEmptySelection(bool allowEmptySelection) { _allowEmptySelection = allowEmptySelection; int i = _curve->findText(tr("")); if (i != -1) _curve->removeItem(i); if (_allowEmptySelection) { _curve->insertItem(0, tr(""), qVariantFromValue(0)); _curve->setCurrentIndex(0); } } void CurveSelector::fillCurves() { if (!_store) { return; } QHash curves; CurveList curveList = _store->getObjects(); CurveList::ConstIterator it = curveList.constBegin(); for (; it != curveList.constEnd(); ++it) { CurvePtr curve = (*it); curve->readLock(); curves.insert(curve->Name(), curve); curve->unlock(); } QStringList list = curves.keys(); qSort(list); CurvePtr current = selectedCurve(); _curve->clear(); foreach (const QString &string, list) { CurvePtr r = curves.value(string); _curve->addItem(string, qVariantFromValue(r.data())); } if (_allowEmptySelection) //reset the setAllowEmptySelection(true); if (current) setSelectedCurve(current); } bool CurveSelector::event(QEvent * event) { if (event->type() == QEvent::WindowActivate) { fillCurves(); } return QWidget::event(event); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/curveappearance.cpp0000644000175000017500000004102712277111530017466 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curveappearance.h" #include "curvepointsymbol.h" #include "linestyle.h" #include #include "dialogdefaults.h" #include "colorsequence.h" namespace Kst { CurveAppearance::CurveAppearance(QWidget *parent) : QWidget(parent) { setupUi(this); populateSymbolCombos(); populateLineStyleCombo(); drawSampleLine(); connect(_showPoints, SIGNAL(stateChanged(int)), this, SLOT(enableSettings())); connect(_showLines, SIGNAL(stateChanged(int)), this, SLOT(enableSettings())); connect(_showBars, SIGNAL(stateChanged(int)), this, SLOT(enableSettings())); connect(_showHead, SIGNAL(stateChanged(int)), this, SLOT(enableSettings())); connect(_color, SIGNAL(changed(QColor)), this, SLOT(populateSymbolCombos())); connect(_color, SIGNAL(changed(QColor)), this, SLOT(populateLineStyleCombo())); connect(_headColor, SIGNAL(changed(QColor)), this, SLOT(populateSymbolCombos())); connect(_headColor, SIGNAL(changed(QColor)), this, SLOT(populateLineStyleCombo())); connect(_color, SIGNAL(changed(QColor)), this, SLOT(drawSampleLine())); connect(_headColor, SIGNAL(changed(QColor)), this, SLOT(drawSampleLine())); connect(_barFillColor, SIGNAL(changed(QColor)), this, SLOT(drawSampleLine())); connect(_showLines, SIGNAL(clicked()), this, SLOT(drawSampleLine())); connect(_showPoints, SIGNAL(clicked()), this, SLOT(drawSampleLine())); connect(_showHead, SIGNAL(clicked()), this, SLOT(drawSampleLine())); connect(_comboPointSymbol, SIGNAL(currentIndexChanged(int)), this, SLOT(drawSampleLine())); connect(_comboLineStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(drawSampleLine())); connect(_comboHeadSymbol, SIGNAL(currentIndexChanged(int)), this, SLOT(drawSampleLine())); connect(_spinBoxLineWidth, SIGNAL(valueChanged(int)), this, SLOT(drawSampleLine())); connect(_spinBoxPointSize, SIGNAL(valueChanged(double)), this, SLOT(drawSampleLine())); connect(_showBars, SIGNAL(clicked()), this, SLOT(drawSampleLine())); connect(_color, SIGNAL(changed(QColor)), this, SIGNAL(modified())); connect(_headColor, SIGNAL(changed(QColor)), this, SIGNAL(modified())); connect(_barFillColor, SIGNAL(changed(QColor)), this, SIGNAL(modified())); connect(_showLines, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_showPoints, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_showHead, SIGNAL(clicked()), this, SIGNAL(modified())); connect(_comboPointDensity, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_comboPointSymbol, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_comboHeadSymbol, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_comboLineStyle, SIGNAL(currentIndexChanged(int)), this, SIGNAL(modified())); connect(_spinBoxLineWidth, SIGNAL(valueChanged(int)), this, SIGNAL(modified())); connect(_spinBoxPointSize, SIGNAL(valueChanged(double)), this, SIGNAL(modified())); connect(_showBars, SIGNAL(clicked()), this, SIGNAL(modified())); _showLines->setProperty("si","&Lines"); _showPoints->setProperty("si","Po&ints"); _showHead->setProperty("si","&Head"); _textLabelPointDensity->setProperty("si","&Density:"); _showBars->setProperty("si","&Bargraph"); _textLabelWeight->setProperty("si","&Weight:"); } CurveAppearance::~CurveAppearance() { } void CurveAppearance::populateSymbolCombos() { populateSymbolCombo(_comboPointSymbol, color()); populateSymbolCombo(_comboHeadSymbol, headColor()); } void CurveAppearance::populateSymbolCombo(QComboBox *combo, QColor symbolColor) { if (symbolColor == Qt::transparent) { symbolColor = Qt::black; } QStyleOptionComboBox option; option.initFrom(combo); option.currentIcon = combo->itemIcon(combo->currentIndex()); option.currentText = combo->itemText(combo->currentIndex()); option.editable = combo->isEditable(); option.frame = combo->hasFrame(); option.iconSize = combo->iconSize(); QRect rect = combo->style()->subControlRect( QStyle::CC_ComboBox, &option, QStyle::SC_ComboBoxEditField, combo ); rect.setLeft( rect.left() + 2 ); rect.setRight( rect.right() - 2 ); rect.setTop( rect.top() + 2 ); rect.setBottom( rect.bottom() - 2 ); combo->setIconSize(QSize(rect.width(), rect.height())); // fill the point type dialog with point types QPixmap ppix( rect.width(), rect.height() ); QPainter pp( &ppix ); int currentItem = combo->currentIndex(); combo->clear(); pp.setPen(symbolColor); for (int ptype = 0; ptype < KSTPOINT_MAXTYPE; ptype++) { pp.fillRect(pp.window(), QColor("white")); CurvePointSymbol::draw(ptype, &pp, ppix.width()/2, ppix.height()/2, 3); combo->addItem(QIcon(ppix), QString()); } if (currentItem > 0) { combo->setCurrentIndex( currentItem ); } } void CurveAppearance::enableSettings() { bool enable; // Use an intermediate boolean to avoid having to use setEnabled(true) and setEnabled(false) enable = showLines() || showBars(); // Line appearance options common to lines and bars _comboLineStyle->setEnabled(enable); // Option specific to bars enable = showBars(); _barFillColor->setEnabled(enable); // Now point options enable = showPoints(); _comboPointSymbol->setEnabled(enable); _spinBoxPointSize->setEnabled(enable); _textLabelPointSize->setEnabled(enable); // and disable widget if not using lines, as using only points and not plotting all of them sounds weird enable = enable && showLines(); _comboPointDensity->setEnabled(enable); _textLabelPointDensity->setEnabled(enable); // Heads enable = showHead(); _comboHeadSymbol->setEnabled(enable); _headColor->setEnabled(enable); } bool CurveAppearance::showLines() const { return _showLines->checkState() == Qt::Checked; } bool CurveAppearance::showLinesDirty() const { return _showLines->checkState() != Qt::PartiallyChecked; } void CurveAppearance::setShowLines(const bool showLines) { _showLines->setChecked(showLines); _showLines->setTristate(false); enableSettings(); drawSampleLine(); } bool CurveAppearance::showPoints() const { return _showPoints->checkState() == Qt::Checked; } bool CurveAppearance::showPointsDirty() const { return _showPoints->checkState() != Qt::PartiallyChecked; } void CurveAppearance::setShowPoints(const bool showPoints) { _showPoints->setChecked(showPoints); _showPoints->setTristate(false); enableSettings(); drawSampleLine(); } bool CurveAppearance::showHead() const { return _showHead->checkState() == Qt::Checked; } bool CurveAppearance::showHeadDirty() const { return _showHead->checkState() != Qt::PartiallyChecked; } void CurveAppearance::setShowHead(const bool showHead) { _showHead->setChecked(showHead); _showHead->setTristate(false); enableSettings(); drawSampleLine(); } bool CurveAppearance::showBars() const { return _showBars->checkState() == Qt::Checked; } bool CurveAppearance::showBarsDirty() const { return _showBars->checkState() != Qt::PartiallyChecked; } void CurveAppearance::setShowBars(const bool showBars) { _showBars->setChecked(showBars); _showBars->setTristate(false); enableSettings(); drawSampleLine(); } QColor CurveAppearance::color() const { return _color->color(); } bool CurveAppearance::colorDirty() const { return _color->colorDirty(); } void CurveAppearance::setColor(const QColor & c) { _color->setColor(c); enableSettings(); drawSampleLine(); } QColor CurveAppearance::headColor() const { return _headColor->color(); } bool CurveAppearance::headColorDirty() const { return _headColor->colorDirty(); } void CurveAppearance::setHeadColor(const QColor & c) { _headColor->setColor(c); enableSettings(); drawSampleLine(); } QColor CurveAppearance::barFillColor() const { return _barFillColor->color(); } bool CurveAppearance::barFillColorDirty() const { return _barFillColor->colorDirty(); } void CurveAppearance::setBarFillColor(const QColor & c) { _barFillColor->setColor(c); enableSettings(); drawSampleLine(); } int CurveAppearance::pointType() const { return _comboPointSymbol->currentIndex(); } bool CurveAppearance::pointTypeDirty() const { return _comboPointSymbol->currentIndex() != -1; } void CurveAppearance::setPointType(const int pointType) { _comboPointSymbol->setCurrentIndex(pointType); enableSettings(); drawSampleLine(); } int CurveAppearance::headType() const { return _comboHeadSymbol->currentIndex(); } bool CurveAppearance::headTypeDirty() const { return _comboHeadSymbol->currentIndex() != -1; } void CurveAppearance::setHeadType(const int pointType) { _comboHeadSymbol->setCurrentIndex(pointType); enableSettings(); drawSampleLine(); } int CurveAppearance::lineStyle() const { return _comboLineStyle->currentIndex(); } bool CurveAppearance::lineStyleDirty() const { return _comboLineStyle->currentIndex() != -1; } void CurveAppearance::setLineStyle(int lineStyle) { if (lineStyle < 0 || lineStyle >= (int)LINESTYLE_MAXTYPE) { lineStyle = 0; } _comboLineStyle->setCurrentIndex(lineStyle); enableSettings(); drawSampleLine(); } int CurveAppearance::pointDensity() const { return _comboPointDensity->currentIndex(); } bool CurveAppearance::pointDensityDirty() const { return _comboPointDensity->currentIndex() != -1; } void CurveAppearance::setPointDensity(int pointDensity) { if (pointDensity < 0 || pointDensity >= POINTDENSITY_MAXTYPE) { pointDensity = 0; } _comboPointDensity->setCurrentIndex(pointDensity); enableSettings(); drawSampleLine(); } int CurveAppearance::lineWidth() const { if (_spinBoxLineWidth->text() == " ") { return 0; } else { return _spinBoxLineWidth->value(); } } bool CurveAppearance::lineWidthDirty() const { return !_spinBoxLineWidth->text().isEmpty(); } void CurveAppearance::setLineWidth(const int lineWidth) { _spinBoxLineWidth->setValue(lineWidth); enableSettings(); drawSampleLine(); } double CurveAppearance::pointSize() const { if (_spinBoxPointSize->text() == " ") { return CURVE_DEFAULT_POINT_SIZE; } else { return _spinBoxPointSize->value(); } } bool CurveAppearance::pointSizeDirty() const { return !_spinBoxPointSize->text().isEmpty(); } void CurveAppearance::setPointSize(double pointSize) { if (pointSize<0.1) { pointSize = CURVE_DEFAULT_POINT_SIZE; } _spinBoxPointSize->setValue(pointSize); enableSettings(); drawSampleLine(); } void CurveAppearance::clearValues() { _color->clearSelection(); _headColor->clearSelection(); _barFillColor->clearSelection(); _spinBoxLineWidth->clear(); _spinBoxPointSize->clear(); _comboHeadSymbol->setCurrentIndex(-1); _comboPointSymbol->setCurrentIndex(-1); _comboPointDensity->setCurrentIndex(-1); _comboLineStyle->setCurrentIndex(-1); _showPoints->setCheckState(Qt::PartiallyChecked); _showLines->setCheckState(Qt::PartiallyChecked); _showBars->setCheckState(Qt::PartiallyChecked); drawSampleLine(); } void CurveAppearance::populateLineStyleCombo() { QStyleOptionComboBox option; option.initFrom(_comboLineStyle); option.currentIcon = _comboLineStyle->itemIcon(_comboLineStyle->currentIndex()); option.currentText = _comboLineStyle->itemText(_comboLineStyle->currentIndex()); option.editable = _comboLineStyle->isEditable(); option.frame = _comboLineStyle->hasFrame(); option.iconSize = _comboLineStyle->iconSize(); QRect rect = _comboLineStyle->style()->subControlRect( QStyle::CC_ComboBox, &option, QStyle::SC_ComboBoxEditField, _comboLineStyle ); rect.setLeft(rect.left() + 2); rect.setRight(rect.right() - 2); rect.setTop(rect.top() + 2); rect.setBottom(rect.bottom() - 2); _comboLineStyle->setIconSize(QSize(rect.width(), rect.height())); // fill the point type dialog with point types QPixmap ppix(rect.width(), rect.height()); QPainter pp(&ppix); QColor lineColor(color()); if (lineColor == Qt::transparent) { lineColor = Qt::black; } QPen pen(lineColor, 1); int currentItem = _comboLineStyle->currentIndex(); _comboLineStyle->clear(); for (int style = 0; style < (int)LINESTYLE_MAXTYPE; style++) { pen.setStyle(LineStyle[style]); pp.setPen(pen); pp.fillRect( pp.window(), QColor("white")); pp.drawLine(1,ppix.height()/2,ppix.width()-1, ppix.height()/2); _comboLineStyle->addItem(QIcon(ppix), QString()); } if (currentItem > 0) { _comboLineStyle->setCurrentIndex( currentItem ); } } void CurveAppearance::drawSampleLine() { //_label->resize(_label->height()*7, _label->height()); QPixmap pix(_label->contentsRect().width(), _label->contentsRect().height()); QPainter p(&pix); QPen pen(color(),lineWidth(),LineStyle[lineStyle()]); p.fillRect(p.window(), QColor("white")); if (showBars()) { QRect rectBar((pix.width()-pix.height())/2, pix.height()/2, pix.height(), (pix.height()/2)+1); p.fillRect(rectBar,QBrush(QColor(barFillColor()))); p.setPen(QPen(QColor(color()),lineWidth(), LineStyle[lineStyle()])); p.drawRect(rectBar); } #ifdef Q_OS_WIN32 // Note: This modification was made in response to an apparent bug in Qt 4.4.0 in which any // painting done with a cosmetic pen resulted in a crash. // When this is no longer required similar code should also be removed in ViewItemDialog.cpp and // curve.cpp - setLineWidth(). if (pen.isCosmetic()) { pen.setWidth(1); } #endif p.setPen(pen); if (showLines()) { if (showHead()) { p.drawLine(1, pix.height()/2, pix.width()-10, pix.height()/2); } else { p.drawLine(1, pix.height()/2, pix.width()-1, pix.height()/2); } } if (showPoints()) { pen.setStyle(Qt::SolidLine); p.setPen(pen); CurvePointSymbol::draw(pointType(), &p, pix.width()/2, pix.height()/2, 1.0/2.7*pointSize()); } if (showHead()) { pen.setStyle(Qt::SolidLine); pen.setColor(headColor()); p.setPen(pen); CurvePointSymbol::draw(headType(), &p, pix.width()-10, pix.height()/2, 1.0/2.7*pointSize()); } _label->setPixmap(pix); } // store the current state of the widget as the default void CurveAppearance::setWidgetDefaults(bool nextColor) { if (nextColor) { ColorSequence::self().next(); } dialogDefaults().setValue("curves/showPoints",showPoints()); dialogDefaults().setValue("curves/showLines", showLines()); dialogDefaults().setValue("curves/showBars",showBars()); dialogDefaults().setValue("curves/lineWidth",lineWidth()); dialogDefaults().setValue("curves/pointSize",pointSize()); dialogDefaults().setValue("curves/lineStyle",lineStyle()); dialogDefaults().setValue("curves/pointType", pointType()); dialogDefaults().setValue("curves/headType", headType()); dialogDefaults().setValue("curves/pointDensity", pointDensity()); dialogDefaults().setValue("curves/showHead", showHead()); } // set the widget to the stored default values void CurveAppearance::loadWidgetDefaults() { setColor(ColorSequence::self().current()); ColorSequence::self().next(); setHeadColor(ColorSequence::self().current()); ColorSequence::self().next(); setBarFillColor(ColorSequence::self().current()); setShowPoints(dialogDefaults().value("curves/showPoints",false).toBool()); setShowLines(dialogDefaults().value("curves/showLines",true).toBool()); setShowBars(dialogDefaults().value("curves/showBars",false).toBool()); setShowHead(dialogDefaults().value("curves/showHead",false).toBool()); setLineWidth(dialogDefaults().value("curves/lineWidth",0).toInt()); setPointSize(dialogDefaults().value("curves/pointSize",0).toInt()); setLineStyle(dialogDefaults().value("curves/lineStyle",0).toInt()); setPointType(dialogDefaults().value("curves/pointType",0).toInt()); setHeadType(dialogDefaults().value("curves/headType",0).toInt()); setPointDensity(dialogDefaults().value("curves/pointDensity",0).toInt()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/widgets.h0000644000175000017500000002163712277111530015442 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef WIDGETS_H #define WIDGETS_H #include #include #include #include "colorbutton.h" #include "gradienteditor.h" #include "filerequester.h" #include "combobox.h" #include "datarange.h" #include "curveselector.h" #include "vectorselector.h" #include "matrixselector.h" #include "scalarselector.h" #include "stringselector.h" #include "curveappearance.h" #include "curveplacement.h" #include "fftoptions.h" #include "colorpalette.h" #include "datasourceselector.h" #include "labelbuilder.h" #include "labellineedit.h" #ifndef QNX // Qt for QNX doesn't include the designer interfaces by default namespace Kst { class Widgets : public QObject, public QDesignerCustomWidgetCollectionInterface { Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) Q_OBJECT public: explicit Widgets(QObject *parent = 0); virtual ~Widgets(); QList customWidgets() const { return _plugins; } private: QList _plugins; }; class WidgetPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT public: explicit WidgetPlugin(QObject *parent = 0); virtual ~WidgetPlugin(); QString group() const; QString toolTip() const; QString whatsThis() const; QString instanceName() const; QString includeFile() const; QString domXml() const; bool isContainer() const; bool isInitialized() const; QIcon icon() const; void initialize(QDesignerFormEditorInterface *); private: bool _initialized; }; class ColorButtonPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit ColorButtonPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("ColorButton"); } //do not translate QWidget *createWidget(QWidget *parent) { return new ColorButton(parent); } }; class DataSourceSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit DataSourceSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("DataSourceSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new DataSourceSelector(parent); } }; class GradientEditorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit GradientEditorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("GradientEditor"); } //do not translate QWidget *createWidget(QWidget *parent) { return new GradientEditor(parent); } }; class FileRequesterPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit FileRequesterPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("FileRequester"); } //do not translate QWidget *createWidget(QWidget *parent) { return new FileRequester(parent); } }; class ComboBoxPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit ComboBoxPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("ComboBox"); } //do not translate QWidget *createWidget(QWidget *parent) { return new ComboBox(parent); } }; class DataRangePlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit DataRangePlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("DataRange"); } //do not translate QWidget *createWidget(QWidget *parent) { return new DataRange(parent); } }; class CurveSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit CurveSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("CurveSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new CurveSelector(parent); } }; class VectorSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit VectorSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("VectorSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new VectorSelector(parent); } }; class MatrixSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit MatrixSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("MatrixSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new MatrixSelector(parent); } }; class ScalarSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit ScalarSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("ScalarSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new ScalarSelector(parent); } }; class StringSelectorPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit StringSelectorPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("StringSelector"); } //do not translate QWidget *createWidget(QWidget *parent) { return new StringSelector(parent); } }; class CurveAppearancePlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit CurveAppearancePlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("CurveAppearance"); } //do not translate QWidget *createWidget(QWidget *parent) { return new CurveAppearance(parent); } }; class CurvePlacementPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit CurvePlacementPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("CurvePlacement"); } //do not translate QWidget *createWidget(QWidget *parent) { return new CurvePlacement(parent); } }; class FFTOptionsPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit FFTOptionsPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("FFTOptions"); } //do not translate QWidget *createWidget(QWidget *parent) { return new FFTOptions(parent); } }; class ColorPalettePlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit ColorPalettePlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("ColorPalette"); } //do not translate QWidget *createWidget(QWidget *parent) { return new ColorPalette(parent); } }; class LabelBuilderPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit LabelBuilderPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("LabelBuilder"); } //do not translate QWidget *createWidget(QWidget *parent) { return new LabelBuilder(parent); } }; class LabelLineEditPlugin : public WidgetPlugin { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit LabelLineEditPlugin(QObject *parent = 0) : WidgetPlugin(parent) {} QString name() const { return QLatin1String("LabelLineEdit"); } //do not translate QWidget *createWidget(QWidget *parent) { return new LabelLineEdit(parent); } }; } #endif // __QNX__ #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/kstwidgets_pch0000644000175000017500000000216112277111530016557 0ustar synthsynth #include "kstmath_pch.h" #ifdef KST_PCH_RECURSIVE // math headers #include "basicplugin.h" #include "basicpluginfactory.h" #include "builtinobjects.h" #include "builtinpalettes.h" #include "builtinrelations.h" #include "colorsequence.h" #include "csd.h" #include "csdfactory.h" #include "curve.h" #include "curvefactory.h" #include "curvehint.h" #include "curvepointsymbol.h" #include "dataobject.h" #include "dataobjectplugin.h" #include "dialoglauncher.h" #include "doublecompare.h" #include "emailthread.h" #include "enodefactory.h" #include "enodes.h" #include "eparse-eh.h" #include "eparse.h" #include "equation.h" #include "equationfactory.h" #include "eventmonitorentry.h" #include "eventmonitorfactory.h" #include "histogram.h" #include "histogramfactory.h" #include "image.h" #include "imagefactory.h" #include "kstmath_export.h" #include "labelparser.h" #include "linestyle.h" #include "objectfactory.h" #include "painter.h" #include "palette.h" #include "plotdefines.h" #include "psd.h" #include "psdcalculator.h" #include "psdfactory.h" #include "relation.h" #include "relationfactory.h" #include "settings.h" #endif Kst-2.0.8/src/widgets/scalarselector.h0000644000175000017500000000366012277111530016776 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SCALARSELECTOR_H #define SCALARSELECTOR_H #include #include "ui_scalarselector.h" #include "scalarlistselector.h" #include #include "kstwidgets_export.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT ScalarSelector : public QWidget, public Ui::ScalarSelector { Q_OBJECT public: explicit ScalarSelector(QWidget *parent = 0, ObjectStore *store = 0); virtual ~ScalarSelector(); void setObjectStore(ObjectStore *store); ScalarPtr selectedScalar(); void setSelectedScalar(ScalarPtr selectedScalar); void setSelectedScalar(QString name); void fillScalars(); QString selectedScalarString(bool *editable = NULL); void setDefaultValue(double value); Q_SIGNALS: void selectionChanged(const QString&); private Q_SLOTS: void newScalar(); void editScalar(); void selectScalar(); void emitSelectionChanged(); void updateDescriptionTip(); void updateScalarList(); private: ScalarListSelector* _scalarListSelector; ObjectStore *_store; bool _defaultsSet; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/vectorselector.h0000644000175000017500000000414512277111530017032 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef VECTORSELECTOR_H #define VECTORSELECTOR_H #include #include "ui_vectorselector.h" #include #include "kstwidgets_export.h" namespace Kst { class ObjectStore; class KSTWIDGETS_EXPORT VectorSelector : public QWidget, public Ui::VectorSelector { Q_OBJECT public: explicit VectorSelector(QWidget *parent = 0, ObjectStore *store = 0); virtual ~VectorSelector(); void setObjectStore(ObjectStore *store); VectorPtr selectedVector() const; bool vectorSelected() const; bool selectedVectorDirty() const; void setSelectedVector(VectorPtr selectedVector); bool allowEmptySelection() const; void setAllowEmptySelection(bool allowEmptySelection); void clearSelection(); void setToLastX(QString field = QString()); void setIsX(bool is_x) {_isX = is_x;} int count() {return _vector->count();} public Q_SLOTS: void fillVectors(); Q_SIGNALS: void selectionChanged(const QString&); void contentChanged(); // something in the combo changed (new or edit) private Q_SLOTS: void newVector(); void editVector(); void emitSelectionChanged(); void updateDescriptionTip(); private: bool _allowEmptySelection; bool _isX; ObjectStore *_store; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/colorpalette.cpp0000644000175000017500000000662212277111530017021 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "colorpalette.h" #include #include #include "palette.h" namespace Kst { ColorPalette::ColorPalette(QWidget *parent) : QWidget(parent) { setupUi(this); connect(_palette, SIGNAL(highlighted(QString)), this, SLOT(updatePalette(QString))); connect(_palette, SIGNAL(currentIndexChanged(QString)), this, SLOT(updatePalette(QString))); connect(_palette, SIGNAL(currentIndexChanged(int)), this, SIGNAL(selectionChanged())); refresh(DefaultPalette); updatePalette(DefaultPalette); _label->setProperty("si","C&olor palette:"); } ColorPalette::~ColorPalette() {} void ColorPalette::updatePalette(const QString &palette) { QString paletteName = palette; if (!paletteName.isEmpty()) { paletteName = selectedPalette(); } Palette* newPalette = new Palette(palette); int numberOfColors = newPalette->colorCount(); int height = _palette->height()?_palette->height():1; int width = 7 * height; int size = 1; int step = 1; if (numberOfColors > 0) { size = width / numberOfColors; if (size == 0) { size = 1; step = numberOfColors / width; } } int pos = 0; QPixmap pix(width, height); QPainter p(&pix); p.fillRect(p.window(), QColor("white")); for (int i=0; iheight(), QBrush(newPalette->color(i))); ++pos; } _paletteDisplay->setPixmap(pix); delete newPalette; } QString ColorPalette::selectedPalette() { return _palette->currentText(); } void ColorPalette::setPalette(const QString palette) { _palette->setCurrentIndex(_palette->findText(palette)); updatePalette(palette); } bool ColorPalette::selectedPaletteDirty() const { return _palette->currentIndex() != -1; } void ColorPalette::clearSelection() { _palette->setCurrentIndex(-1); QPixmap pix(7 *_palette->height(), _palette->height()); QPainter p(&pix); p.fillRect(p.window(), QColor("white")); _paletteDisplay->setPixmap(pix); } void ColorPalette::refresh( const QString & palette ) { _palette->clear(); QStringList paletteList = Palette::getPaletteList(); paletteList.sort(); _palette->addItems(paletteList); if (!palette.isEmpty()) { int i; for (i = 0; i < _palette->count(); ++i) { if (_palette->itemText(i) == palette) { break; } } if (i == _palette->count()) { i = _palette->findText(DefaultPalette); if (i<0) { i=0; } } _palette->setCurrentIndex(i); } } int ColorPalette::currentPaletteIndex() { return _palette->currentIndex(); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/widgets/cclineedit.h0000644000175000017500000001505512277111530016074 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 Joshua Netterfield * * joshua.netterfield@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. * * * ***************************************************************************/ #ifndef CCLINEEDIT_H #define CCLINEEDIT_H #include #include #include #include "kstwidgets_export.h" namespace Kst { /** * A category is a list of possible completions under a certain title. * For example, a Category could be a list of Vector names. */ class Category : public QStringList { QString _title; public: Category(QString title) : QStringList(), _title(title) { } Category(QString title, QString i) : QStringList(i), _title(title) { } Category(QString title, QStringList l) : QStringList(l), _title(title) { } const QString& title() const { return _title; } }; /** * A completion case is a prefix for Categories. */ class CompletionCase : public QList { QString _prefix; public: CompletionCase(QString prefix) : QList(), _prefix(prefix) { } CompletionCase(QString prefix,QList l) : QList(l), _prefix(prefix) { } const QString& prefix() const { return _prefix; } }; bool operator<(const CompletionCase&a,const CompletionCase&b); class CategoricalCompleter; class ObjectStore; class CCCommonEdit { protected: ObjectStore *_store; static QList _u; virtual QString Text()=0; virtual void SetText(QString text)=0; virtual int CursorPosition()=0; virtual void SetCursorPosition(int)=0; virtual void NewPrefix(QString)=0; virtual void SetCompleter(QCompleter*) {} virtual void ChangeCurrentPrefix(QString)=0; void Divide(QString x="\0"); virtual void fillKstObjects() {} void NewVector(); void NewScalar(); void NewString(); void EditItem(); void Insert(const QString&i,bool stringIsCompletion=true); CCCommonEdit() : _store(0) {_u.push_back(this); } ~CCCommonEdit() { _u.removeOne(this); } }; /** * This is a LineEdit with autocompletion. The completion items are divided into cases, categories and items. * @sa CompletionCase, Category */ class KSTWIDGETS_EXPORT CCLineEdit : public QLineEdit, public CCCommonEdit { Q_OBJECT protected: CategoricalCompleter* _cc; virtual QString Text(){return text();} virtual void SetText(QString text){setText(text);} virtual int CursorPosition(){return cursorPosition();} virtual void SetCursorPosition(int x){setCursorPosition(x);} virtual void NewPrefix(QString x){emit currentPrefixChanged(x);} virtual void SetCompleter(QCompleter*c) {setCompleter(c);} virtual void ChangeCurrentPrefix(QString x); public: friend class CCTableView; explicit CCLineEdit(QWidget*p=0); explicit CCLineEdit(const QString&s,QWidget*p=0); ~CCLineEdit(); virtual void init(QList data); public slots: virtual void fillKstObjects() {} void insert(const QString &i,bool stringIsCompletion=true); protected slots: void divide(QString x="\0"); protected: void keyPressEvent(QKeyEvent *); void mousePressEvent(QMouseEvent *); signals: void currentPrefixChanged(QString); }; /** * This is a special version of CCLineEdit which is used to display scalars and vectors. * You can still send your own QList* in init() which will be added to the list of scalars and vectors. * @sa CCLineEdit */ class KSTWIDGETS_EXPORT SVCCLineEdit : public CCLineEdit { Q_OBJECT QList *_extraData, *_svData, *_allData; public: explicit SVCCLineEdit(QWidget*p=0); explicit SVCCLineEdit(const QString&s,QWidget*p=0); ~SVCCLineEdit(); void setObjectStore(ObjectStore *store); virtual void init(QList data=QList()); public Q_SLOTS: void fillKstObjects(); protected: void contextMenuEvent(QContextMenuEvent *); public slots: inline void newVector(){NewVector();} inline void newScalar(){NewScalar();} inline void editItem(){EditItem();} }; /** * This is a TextEdit with audocompletion. * @sa CCLineEdit */ class KSTWIDGETS_EXPORT CCTextEdit : public QTextEdit, public CCCommonEdit { Q_OBJECT protected: CategoricalCompleter* _cc; virtual QString Text(){return toPlainText();} virtual void SetText(QString text){bool dirty=document()->isModified();setPlainText(text);document()->setModified(dirty);} virtual int CursorPosition(){return textCursor().position();} virtual void SetCursorPosition(int x){QTextCursor tc=textCursor();tc.setPosition(x);setTextCursor(tc);} virtual void NewPrefix(QString x){emit currentPrefixChanged(x);} virtual void SetCompleter(QCompleter*) {} virtual void ChangeCurrentPrefix(QString x); public: friend class CCTableView; explicit CCTextEdit(QWidget*p=0); explicit CCTextEdit(const QString&s,QWidget*p=0); ~CCTextEdit(); virtual void init(QList data); public slots: void insert(const QString &i,bool stringIsCompletion=true); virtual void fillKstObjects() {} protected slots: void divide(QString x="\0"); protected: void keyPressEvent(QKeyEvent *e); signals: void currentPrefixChanged(QString); }; /** * This is a special version of CCTextEdit which is used to display scalars and vectors. * @sa SVCCLineEdit */ class KSTWIDGETS_EXPORT SVCCTextEdit : public CCTextEdit { Q_OBJECT QList *_extraData, *_svData, *_allData; public: explicit SVCCTextEdit(QWidget*p=0); explicit SVCCTextEdit(const QString&s,QWidget*p=0); ~SVCCTextEdit(); void setObjectStore(ObjectStore *store); virtual void init(QList data=QList()); public slots: void fillKstObjects(); protected: void contextMenuEvent(QContextMenuEvent *); public slots: inline void newVector(){NewVector();} inline void newScalar(){NewScalar();} inline void newString(){NewString();} inline void editItem(){EditItem();} }; } #endif // ACLINEEDIT_H Kst-2.0.8/src/d2asc/0000755000175000017500000000000012320547027013143 5ustar synthsynthKst-2.0.8/src/d2asc/CMakeLists.txt0000644000175000017500000000024512320547027015704 0ustar synthsynthkst_init(d2asc) kst_files_find(src/d2asc) kst_include_directories(core math) kst_add_executable() kst_link(${libcore} ${libmath}) kst_install_executable() Kst-2.0.8/src/plugins/0000755000175000017500000000000012320547027013630 5ustar synthsynthKst-2.0.8/src/plugins/HOWTO_add_a_plugin.txt0000644000175000017500000000620612320547027017763 0ustar synthsynthThis file summarizes the steps needed to add a plugin to Kst. Note that in Kst 1.x times it was easier as one could compile a plugin outside of the source tree. At the moment, this is not possible with Kst 2.x. Kst 2.x offers more flexibility as to the way the plugin UI can be done, but it requires more code. First, some info regarding plugins: - Plugins are useful when you need to work on many samples at once (statistics, filters, etc...) because that's not possible with equations, which treat vectors one sample at a time - Plugins must implement 3 classes. Exampel for a plugin named GreatIdea: * class GreatIdeaSource : public Kst::BasicPlugin, responsible for data transfer, config loading and saving and the algorithm itself * class GreatIdeaPlugin : public QObject, public Kst::DataObjectPluginInterface, which implements the interface with the core of Kst * class ConfigWidgetGreatIdeaPlugin : public Kst::DataObjectConfigWidget, public Ui_GreatIdeaConfig which defines the configuration widget - Plugins have a type: either Filter (then they appear in the Filter context menu) or Fit (which puts them in the Fit menu) or Generic, in which case they can be created from the Create->Plugin menu. It is not possible at the moment to have more than one type, though this may change in the future. The type is set by implementing the corresponding method in the class derived, e.g.: virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } - Plugins crash the whole session if they crash, so please check all boundary conditions and corner cases. - Performance being an important feature in Kst, and some people having vectors with millions of points, try to optimize the code as much as possible. STEPS TO FOLLOW: 1. Create the directory and add to CMakeLists.txt - Create a directory under the relevant subdirectory and edit src/plugins/CMakeLists.txt to add it to the list. The easiest way to initialize the plugin is to copy one that is similar (inputs/outputs) and then rename the files - If the plugin has a dependency (on an external lib for instance) you may have to add a cmake test for it. In that case take a look at the gsl example, which is required by a lot of plugins 2. Edit the .desktop file This is the file that contains information displayed in the interface for the user. It is a simple text file 3. Edit the configuration UI in QT Designer (using Qt Creator, just open the .ui file). Pay attention to the fact that according to how you configured the tool, it could be that you don't see the scalar or vector selectors. Use the object hierarchy to check what widgets are included in your design. Pay attention to the way you name the selector widgets; you'll use them in the code. 4. Edit the .h and .cpp files, replacing the plugin name whereever appropriate and adapting to the given in/outputs. Start from the to and work your way through the file. It is somewhat tedious, but not very complicated. The core of the action goes to GreatIdeaSource::algorithm(). 5. Once you've reached the point where it compiles, optimize and debug as much as possible and then either commit it or send a patch to the list for review Happy hacking! Kst-2.0.8/src/plugins/sampleplugin/0000755000175000017500000000000012362705136016333 5ustar synthsynthKst-2.0.8/src/plugins/sampleplugin/kstplugin_sampleplugin.desktop0000644000175000017500000000343112362705136024527 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=sampleplugin X-Kst-Plugin-Author=The University of Toronto Name=Sample Data Object Plugin Name[ca]=Connector d'objecte de dades de mostra Name[ca@valencia]=Connector d'objecte de dades de mostra Name[de]=Beispiel-Datenobjekt-Modul Name[fr]=Module DataObject d'échantillonnage Name[it]=Estensione oggetto dati campione Name[nl]=Sample Data Object Plugin Name[pl]=Implementuje wtyczkę obiektu danych dopasowania próbki dla Kst. Name[pt]='Plugin' de Objecto de Dados de Exemplo Name[pt_BR]=Plugin de objeto de dados de exemplo Name[sv]=Dataobjekt-insticksprogram för sampling Name[uk]=Додаток для роботи з об’єктами даних вибірок Name[x-test]=xxSample Data Object Pluginxx Comment=Implements a sample Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de mostra pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de mostra pel Kst. Comment[de]=Implementiert ein Beispiel-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject d'échantillonnage pour Kst. Comment[it]=Implementa un'estensione oggetto dati campione per Kst. Comment[nl]=Implementeert een voorbeeld van een plugin voor een gegevensobject in Kst. Comment[pl]=Implementuje wtyczkę obiektu danych próbki dla Kst. Comment[pt]=Implementa um 'plugin' de objecto de dados de amostras de exemplo para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de exemplo para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för sampling. Comment[uk]=Реалізує додаток для роботи з об’єктами даних вибірок у Kst. Comment[x-test]=xxImplements a sample Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/sampleplugin/sampleplugin.h0000644000175000017500000000502712277111530021202 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SAMPLEPLUGIN_H #define SAMPLEPLUGIN_H #include #include #include class SamplePluginSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: SamplePluginSource(Kst::ObjectStore *store); ~SamplePluginSource(); friend class Kst::ObjectStore; }; class SamplePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) public: virtual ~SamplePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/sampleplugin/sampleplugin.cpp0000644000175000017500000002551612277111530021542 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "sampleplugin.h" #include "objectstore.h" #include "ui_samplepluginconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scalar In"; static const QString& STRING_IN = "String In"; static const QString& VECTOR_OUT = "Vector Out"; static const QString& SCALAR_OUT = "Scalar Out"; static const QString& STRING_OUT = "String Out"; /********************** ConfigWidgetSamplePlugin - This class defines the config widget that will be added to the BasicPluginDialog container for configuring the plugin. By default the BasicPluginDialog has no controls and thus all desired inputs/outputs/options should included in the .ui. DataObjectConfigWidget is defined in dataobject.h ***********************/ class ConfigWidgetSamplePlugin : public Kst::DataObjectConfigWidget, public Ui_SamplePluginConfig { public: ConfigWidgetSamplePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_SamplePluginConfig() { setupUi(this); } ~ConfigWidgetSamplePlugin() {} void setObjectStore(Kst::ObjectStore* store) { // _store must be set here. Any additional controls requiring the objectstore should also // have it set at this time. _store = store; _vector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { // In order to for Apply button logic to function. All controls change state must be linked to // the dialog's modified signal. connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } // All information in the config widget must be publically accessible so that the plugin can pull // the required information and use it construct the object. Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; // This function is required and is used when editing of the object is triggered. It must be able // to configure the widget with the settings currently in use by the object. virtual void setupFromObject(Kst::Object* dataObject) { if (SamplePluginSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); } } // This function is used when loading a .kst file from disk. The plugins are expected to store any // required parameters as attributes of the plugin tag. The name and type are handled by BasicPluginFactory // as are all inputs and outputs. This should be used for any non-generic attributes associated with the plugin. // If false is returned, the creation of the object will not occur. // NOTE: Saving of the object is done in the objects saveProperties function. Values must match between them. virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: // Dialog Defaults control - Save // Uses the provided QSettings Object to save the plugin default details as a new group. // Called every time a new dialog request is made. Does not affect editing. virtual void save() { if (_cfg) { _cfg->beginGroup("Sample DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->endGroup(); } } // Dialog Defaults control - Load // Uses the provided QSettings Object to load the plugin default details. // Called every time a new dialog request is completed. Does not get called on edit. virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Sample DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; /********************** SamplePluginSource - This class defines the main DataObject which derives from BasicPlugin (a DataObject). The key functions that this class must provide is the ability to create/modify the object, setup outputs, and be able to process the data (algorithm function). ***********************/ SamplePluginSource::SamplePluginSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } SamplePluginSource::~SamplePluginSource() { } QString SamplePluginSource::_automaticDescriptiveName() const { return QString("Test Plugin Object"); } // Change is used to configure the DataObject and will be run immediately after initial creation as well as // when modifications have occured. void SamplePluginSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetSamplePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); } } void SamplePluginSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } // The algorithm function must handle all the data calculations for the plugin. This function is run during // each update of the input objects which includes after creation of the object. Only output objects that have // have setOutputVector/setOutputScalar/setOutputString should be updated as others will not appear outside of // the plugin. bool SamplePluginSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; outputVector->resize(inputVector->length(), false); // Sample only. Copy all values from input vector to output vector. for (int i = 0; i < inputVector->length(); i++) { outputVector->value()[i] = inputVector->value(i); } // Return true to continue update. Returning false indicates that the update did not result in the output // objects changing and will not trigger updates of objects using them. return true; } Kst::VectorPtr SamplePluginSource::vector() const { return _inputVectors[VECTOR_IN]; } QStringList SamplePluginSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList SamplePluginSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList SamplePluginSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList SamplePluginSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList SamplePluginSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList SamplePluginSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } // This function allows for support of saving / loading this object from a .kst file. The function should only // write attributes as any other advancement of the StreamWriter will result in a malformed Xml document. All // values required to recreate the should be saved here. All Input/Output Objects are saved by BasicPlugin and do // not need to be stored here. This should be used for any non-generic attributes associated with the plugin. // NOTE: Loading of the object is done in the configWidgets configurePropertiesFromXml function. Values must match between them. void SamplePluginSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString SamplePlugin::pluginName() const { return "Sample DataObject Plugin"; } QString SamplePlugin::pluginDescription() const { return "Sample DataObject Plugin Description"; } /********************** SamplePlugin - This class defines the plugin interface to the DataObject defined by the plugin. The primary requirements of this class are to provide the necessary connections to create the object which includes providing access to the configuration widget. ***********************/ // The create function is responsible for creating the DataObject. It is provided the ObjectStore as well as a // fully configured configWidget to setup the object from. // setupInputOutputs is a flag to mark whether the object should automatically setup the inputs and outputs. New // creations will always configure them. When loading from a .kst file they will be done manually. Kst::DataObject *SamplePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetSamplePlugin* config = static_cast(configWidget)) { // Create a generic object. SamplePluginSource* object = store->createObject(); // Setup the object values based on the config widget. // object->setValue(config->value()); // If the inputs/outputs should be configured, setup them up from the configWidget. if (setupInputsOutputs) { object->setInputVector(VECTOR_IN, config->selectedVector()); object->setupOutputs(); } // Set the pluginName. object->setPluginName(pluginName()); // Trigger an update of the object. This is required to trigger the algorithm call and creation of the output. // If inputs/outputs was not triggered, this will also be run a second time after all inputs/outputs have been // configured. object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } // Request for this plugins configuration widget. Kst::DataObjectConfigWidget *SamplePlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetSamplePlugin *widget = new ConfigWidgetSamplePlugin(settingsObject); return widget; } Q_EXPORT_PLUGIN2(kstplugin_sampleplugin, SamplePlugin) // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/sampleplugin/sampleplugin.pro0000644000175000017500000000037012277111530021547 0ustar synthsynthTOPOUT_REL=../../.. include($$PWD/$$TOPOUT_REL/kst.pri) include($$PWD/$$TOPOUT_REL/dataobjectplugin.pri) TARGET = $$kstlib(kstplugin_sampleplugin) SOURCES += \ sampleplugin.cpp HEADERS += \ sampleplugin.h FORMS += samplepluginconfig.ui Kst-2.0.8/src/plugins/sampleplugin/samplepluginconfig.ui0000644000175000017500000000305612277111530022556 0ustar synthsynth SamplePluginConfig 0 0 425 50 400 0 0 0 Sample Input Vector false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/CMakeLists.txt0000644000175000017500000000456412320547027016401 0ustar synthsynth kst_init_plugin(src/plugins) kst_add_plugin(dataobject bin) kst_add_plugin(dataobject chop) kst_add_plugin(dataobject linefit) kst_add_plugin(dataobject lockin) kst_add_plugin(dataobject phase) kst_add_plugin(dataobject shift) kst_add_plugin(dataobject statistics) kst_add_plugin(dataobject syncbin) kst_add_plugin(dataobject crossspectrum) kst_add_plugin(dataobject effectivebandwidth) kst_add_plugin(dataobject genericfilter) kst_add_plugin(dataobject activitylevel) kst_add_plugin(filters cumulativesum) kst_add_plugin(filters cumulativeaverage) kst_add_plugin(filters despike) kst_add_plugin(filters unwind) kst_add_plugin(filters differentiation) if(gsl) include_directories(${GSL_INCLUDE_DIR}) macro(kst_add_gsl_plugin dir name) kst_add_plugin(${dir} ${name}) kst_link(${GSL_LIBRARIES}) endmacro() kst_add_gsl_plugin(dataobject/convolution convolve) kst_add_gsl_plugin(dataobject/convolution deconvolve) kst_add_gsl_plugin(dataobject/correlation autocorrelation) kst_add_gsl_plugin(dataobject/correlation crosscorrelation) kst_add_gsl_plugin(dataobject/interpolations akima) kst_add_gsl_plugin(dataobject/interpolations akimaperiodic) kst_add_gsl_plugin(dataobject/interpolations cspline) kst_add_gsl_plugin(dataobject/interpolations csplineperiodic) kst_add_gsl_plugin(dataobject/interpolations linear) kst_add_gsl_plugin(dataobject/interpolations polynomial) kst_add_gsl_plugin(dataobject noiseaddition) kst_add_gsl_plugin(dataobject periodogram) kst_add_gsl_plugin(filters butterworth_bandpass) kst_add_gsl_plugin(filters butterworth_bandstop) kst_add_gsl_plugin(filters butterworth_highpass) kst_add_gsl_plugin(filters butterworth_lowpass) kst_add_gsl_plugin(fits exponential_unweighted) kst_add_gsl_plugin(fits exponential_weighted) kst_add_gsl_plugin(fits gaussian_unweighted) kst_add_gsl_plugin(fits gaussian_weighted) kst_add_gsl_plugin(fits gradient_unweighted) kst_add_gsl_plugin(fits gradient_weighted) kst_add_gsl_plugin(fits kneefrequency) kst_add_gsl_plugin(fits linear_unweighted) kst_add_gsl_plugin(fits linear_weighted) kst_add_gsl_plugin(fits lorentzian_unweighted) kst_add_gsl_plugin(fits lorentzian_weighted) kst_add_gsl_plugin(fits polynomial_unweighted) kst_add_gsl_plugin(fits polynomial_weighted) kst_add_gsl_plugin(fits sinusoid_unweighted) kst_add_gsl_plugin(fits sinusoid_weighted) endif() Kst-2.0.8/src/plugins/plugins_subsub.pri0000644000175000017500000000006012277111530017401 0ustar synthsynthTOPOUT_REL=../../../../.. include(plugins.pri) Kst-2.0.8/src/plugins/dataobject/0000755000175000017500000000000012277111530015725 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/correlation/0000755000175000017500000000000012277111530020246 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/correlation/correlation.pro0000644000175000017500000000013712277111530023312 0ustar synthsynthTEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ autocorrelation \ crosscorrelation Kst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/0000755000175000017500000000000012362705136023647 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui0000644000175000017500000000466312277111530030772 0ustar synthsynth CrossCorrelationConfig 0 0 428 86 400 0 0 0 Input Vector One false 0 0 0 0 Input Vector Two false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.pro0000644000175000017500000000033512277111530027757 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_crosscorrelation) LIBS += -l$$kstlib(gsl) SOURCES += \ crosscorrelation.cpp HEADERS += \ crosscorrelation.h FORMS += crosscorrelationconfig.ui Kst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.h0000644000175000017500000000526712277111530027417 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CROSSCORRELATIONPLUGIN_H #define CROSSCORRELATIONPLUGIN_H #include #include #include class CrossCorrelationSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorOne() const; Kst::VectorPtr vectorTwo() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CrossCorrelationSource(Kst::ObjectStore *store); ~CrossCorrelationSource(); friend class Kst::ObjectStore; }; class CrossCorrelationPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CrossCorrelationPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/kstplugin_crosscorrelation.desktop0000644000175000017500000000406312362705136032740 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=crosscorrelation X-Kst-Plugin-Author=The University of Toronto Name=Cross Correlation Data Object Plugin Name[ca]=Connector d'objecte de dades de correlació creuada Name[ca@valencia]=Connector d'objecte de dades de correlació creuada Name[de]=Kreuzkorrelation-Datenobjekt-Modul Name[fr]=Module DataObject de corrélation croisée Name[it]=Estensione oggetto dati di correlazione incrociata Name[nl]=Cross Correlation Data Object Plugin Name[pl]=Wtyczka obiektu danych korelacji krzyżowej Name[pt]='Plugin' de Objectos de Dados de Correlação Cruzada Name[pt_BR]=Plugin de objetos de dados de correlação cruzada Name[sv]=Dataobjekt-insticksprogram för korskorrelation Name[uk]=Додаток для роботи з об’єктами перехресної кореляції даних Name[x-test]=xxCross Correlation Data Object Pluginxx Comment=Implements a Cross Correlation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de correlació creuada pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de correlació creuada pel Kst. Comment[de]=Implementiert ein Kreuzkorrelations-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de corrélation croisée pour Kst. Comment[it]=Implementa un'estensione oggetto dati di correlazione incrociata per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor kruiscorrelatie. Comment[pl]=Implementuje wtyczkę obiektu danych korelacji krzyżowej dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de correlação cruzada para o Kst. Comment[pt_BR]=Implementa um plugin de objetos de dados de correlação cruzada para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för korskorrelation. Comment[uk]=Реалізує додаток для роботи з об’єктами перехресної кореляції даних у Kst. Comment[x-test]=xxImplements a Cross Correlation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp0000644000175000017500000002544412362701575027762 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "crosscorrelation.h" #include "objectstore.h" #include "ui_crosscorrelationconfig.h" #include #include static const QString& VECTOR_IN_ONE = "Vector One In"; static const QString& VECTOR_IN_TWO = "Vector Two In"; static const QString& VECTOR_OUT_STEP = "Offset"; static const QString& VECTOR_OUT_CORRELATED = "C"; class ConfigCrossCorrelationPlugin : public Kst::DataObjectConfigWidget, public Ui_CrossCorrelationConfig { public: ConfigCrossCorrelationPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CrossCorrelationConfig() { _store = 0; setupUi(this); } ~ConfigCrossCorrelationPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorOne->setObjectStore(store); _vectorTwo->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorOne, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorTwo, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorOne() { return _vectorOne->selectedVector(); }; void setSelectedVectorOne(Kst::VectorPtr vector) { return _vectorOne->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorTwo() { return _vectorTwo->selectedVector(); }; void setSelectedVectorTwo(Kst::VectorPtr vector) { return _vectorTwo->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CrossCorrelationSource* source = static_cast(dataObject)) { setSelectedVectorOne(source->vectorOne()); setSelectedVectorTwo(source->vectorTwo()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Cross Correlation DataObject Plugin"); _cfg->setValue("Input Vector One", _vectorOne->selectedVector()->Name()); _cfg->setValue("Input Vector Two", _vectorTwo->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Cross Correlation DataObject Plugin"); QString vectorName = _cfg->value("Input Vector One").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorOne(vector); } vectorName = _cfg->value("Input Vector Two").toString(); Kst::Object* object2 = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object2); if (vector2) { setSelectedVectorTwo(vector2); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CrossCorrelationSource::CrossCorrelationSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CrossCorrelationSource::~CrossCorrelationSource() { } QString CrossCorrelationSource::_automaticDescriptiveName() const { return tr("Cross Correlation"); } void CrossCorrelationSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigCrossCorrelationPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } } void CrossCorrelationSource::setupOutputs() { setOutputVector(VECTOR_OUT_STEP, ""); setOutputVector(VECTOR_OUT_CORRELATED, ""); } bool CrossCorrelationSource::algorithm() { Kst::VectorPtr inputVectorOne = _inputVectors[VECTOR_IN_ONE]; Kst::VectorPtr inputVectorTwo = _inputVectors[VECTOR_IN_TWO]; Kst::VectorPtr outputVectorStep = _outputVectors[VECTOR_OUT_STEP]; Kst::VectorPtr outputVectorCorrelated = _outputVectors[VECTOR_OUT_CORRELATED]; if (inputVectorOne->length() <= 0 || inputVectorTwo->length() <= 0 || inputVectorOne->length() != inputVectorTwo->length()) { _errorString = tr("Error: Input Vectors - invalid size"); return false; } double* pdArrayOne; double* pdArrayTwo; double* pdResult[2]; double dReal; double dImag; int iLength; int iLengthNew; bool bReturn = false; // // zero-pad the array... // iLength = inputVectorOne->length(); iLength *= 2; outputVectorStep->resize(inputVectorOne->length(), false); outputVectorCorrelated->resize(inputVectorTwo->length(), false); // // round iLength up to the nearest power of two... // iLengthNew = 64; while( iLengthNew < iLength && iLengthNew > 0) { iLengthNew *= 2; } iLength = iLengthNew; if (iLength <= 0) { _errorString = tr("Error: Invalid Input length calculated"); return false; } pdArrayOne = new double[iLength]; pdArrayTwo = new double[iLength]; if (pdArrayOne != NULL && pdArrayTwo != NULL) { // // zero-pad the two arrays... // memset( pdArrayOne, 0, iLength * sizeof( double ) ); memcpy( pdArrayOne, inputVectorOne->value(), inputVectorOne->length() * sizeof( double ) ); memset( pdArrayTwo, 0, iLength * sizeof( double ) ); memcpy( pdArrayTwo, inputVectorTwo->value(), inputVectorTwo->length() * sizeof( double ) ); // // calculate the FFTs of the two functions... // if (gsl_fft_real_radix2_transform( pdArrayOne, 1, iLength ) == 0) { if (gsl_fft_real_radix2_transform( pdArrayTwo, 1, iLength ) == 0) { // // multiply one FFT by the complex conjugate of the other... // for (int i=0; ivalue(); pdResult[1] = outputVectorCorrelated->value(); if (pdResult[0] != NULL && pdResult[1] != NULL) { for (int i = 0; i < inputVectorOne->length(); ++i) { outputVectorStep->value()[i] = pdResult[0][i]; } for (int i = 0; i < inputVectorTwo->length(); ++i) { outputVectorCorrelated->value()[i] = pdResult[1][i]; } for (int i = 0; i < inputVectorOne->length(); i++) { outputVectorStep->value()[i] = (double)( i - ( inputVectorOne->length() / 2 ) ); } memcpy( &(outputVectorCorrelated->value()[inputVectorOne->length() / 2]), &(pdArrayOne[0]), ( ( inputVectorOne->length() + 1 ) / 2 ) * sizeof( double ) ); memcpy( &(outputVectorCorrelated->value()[0]), &(pdArrayOne[iLength - (inputVectorOne->length() / 2)]), ( inputVectorOne->length() / 2 ) * sizeof( double ) ); bReturn = true; } } } } } delete[] pdArrayOne; delete[] pdArrayTwo; return bReturn; } Kst::VectorPtr CrossCorrelationSource::vectorOne() const { return _inputVectors[VECTOR_IN_ONE]; } Kst::VectorPtr CrossCorrelationSource::vectorTwo() const { return _inputVectors[VECTOR_IN_TWO]; } QStringList CrossCorrelationSource::inputVectorList() const { QStringList vectors(VECTOR_IN_ONE); vectors += VECTOR_IN_TWO; return vectors; } QStringList CrossCorrelationSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList CrossCorrelationSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CrossCorrelationSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_CORRELATED); vectors += VECTOR_OUT_STEP; return vectors; } QStringList CrossCorrelationSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CrossCorrelationSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CrossCorrelationSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CrossCorrelationPlugin::pluginName() const { return tr("Cross Correlation"); } QString CrossCorrelationPlugin::pluginDescription() const { return tr("Generates the correlation of one vector with another."); } Kst::DataObject *CrossCorrelationPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigCrossCorrelationPlugin* config = static_cast(configWidget)) { CrossCorrelationSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); object->setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CrossCorrelationPlugin::configWidget(QSettings *settingsObject) const { ConfigCrossCorrelationPlugin *widget = new ConfigCrossCorrelationPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, CrossCorrelationPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/0000755000175000017500000000000012362705136023466 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/kstplugin_autocorrelation.desktop0000644000175000017500000000356312362705136032402 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=autocorrelation X-Kst-Plugin-Author=The University of Toronto Name=Bin Data Object Plugin Name[ca]=Connector d'objecte de dades classificades Name[ca@valencia]=Connector d'objecte de dades classificades Name[de]=Binär-Datenobjekt-Modul Name[fr]=Module DataObject de classement (Bin) Name[it]=Estensione oggetto dati di collocazione Name[nl]=Bin Data Object Plugin Name[pl]=Wtyczka obiektu danych przedziału Name[pt]='Plugin' de Objecto de Dados Compartimentados Name[pt_BR]=Plugin de objeto de dados compartimentados Name[sv]=Intervalldataobjekt-insticksprogram Name[uk]=Додаток для об’єктів комбінування даних Name[x-test]=xxBin Data Object Pluginxx Comment=Implements a Auto Correlation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'autocorrelació pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'autocorrelació pel Kst. Comment[de]=Implementiert ein Autokorrelations-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject d'auto-corrélation pour Kst. Comment[it]=Implementa un'estensione oggetto dati di auto correlazione per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor autocorrelatie. Comment[pl]=Implementuje wtyczkę obiektu danych korelacji wzajemnej dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de correlação automática para o Kst. Comment[pt_BR]=Implementa um plugin de objetos de dados de correlação automática para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för autokorrelation. Comment[uk]=Реалізує додаток для роботи з об’єктами автокореляції даних у Kst. Comment[x-test]=xxImplements a Auto Correlation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/autocorrelation.h0000644000175000017500000000520712277111530027047 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef AUTOCORRELATIONPLUGIN_H #define AUTOCORRELATIONPLUGIN_H #include #include #include class AutoCorrelationSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: AutoCorrelationSource(Kst::ObjectStore *store); ~AutoCorrelationSource(); friend class Kst::ObjectStore; }; class AutoCorrelationPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~AutoCorrelationPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp0000644000175000017500000002203512362701575027411 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "autocorrelation.h" #include "objectstore.h" #include "ui_autocorrelationconfig.h" #include #include static const QString& VECTOR_IN = "Vector In"; static const QString& VECTOR_OUT_AUTO = "Auto-Correlated"; static const QString& VECTOR_OUT_STEP = "Step Value"; class ConfigAutoCorrelationPlugin : public Kst::DataObjectConfigWidget, public Ui_AutoCorrelationConfig { public: ConfigAutoCorrelationPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_AutoCorrelationConfig() { _store = 0; setupUi(this); } ~ConfigAutoCorrelationPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (AutoCorrelationSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Auto Correlation DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Auto Correlation DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; AutoCorrelationSource::AutoCorrelationSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } AutoCorrelationSource::~AutoCorrelationSource() { } QString AutoCorrelationSource::_automaticDescriptiveName() const { return tr("Auto Correlation Plugin Object"); } void AutoCorrelationSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigAutoCorrelationPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); } } void AutoCorrelationSource::setupOutputs() { setOutputVector(VECTOR_OUT_AUTO, ""); setOutputVector(VECTOR_OUT_STEP, ""); } bool AutoCorrelationSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::VectorPtr outputVectorAuto = _outputVectors[VECTOR_OUT_AUTO]; Kst::VectorPtr outputVectorStep = _outputVectors[VECTOR_OUT_STEP]; //Make sure there is at least 1 element in the input vector if (inputVector->length() < 1) { _errorString = tr("Error: Input Vector invalid size"); return false; } double* pdArrayOne; double* pdResult; double* pdCorrelate; double dReal; double dImag; int iLength; int iLengthNew; bool bReturn = false; // // zero-pad the array... // iLength = inputVector->length(); iLength *= 2; outputVectorAuto->resize(inputVector->length(), false); outputVectorStep->resize(inputVector->length(), false); // // round iLength up to the nearest power of two... // iLengthNew = 64; while( iLengthNew < iLength && iLengthNew > 0) { iLengthNew *= 2; } iLength = iLengthNew; if (iLength <= 0) { _errorString = tr("Error: Invalid Input length calculated"); return false; } pdArrayOne = new double[iLength]; if (pdArrayOne != NULL) { // // zero-pad the two arrays... // memset( pdArrayOne, 0, iLength * sizeof( double ) ); memcpy( pdArrayOne, inputVector->value(), inputVector->length() * sizeof( double ) ); // // calculate the FFTs of the two functions... // if (gsl_fft_real_radix2_transform( pdArrayOne, 1, iLength ) == 0) { // // multiply the FFT by its complex conjugate... // for (int i=0; ivalue(); pdCorrelate = outputVectorAuto->value(); if (pdResult != NULL && pdCorrelate != NULL) { for (int i = 0; i < inputVector->length(); ++i) { outputVectorStep->value()[i] = pdResult[i]; } for (int i = 0; i < inputVector->length(); ++i) { outputVectorAuto->value()[i] = pdCorrelate[i]; } for (int i = 0; i < inputVector->length(); i++) { outputVectorStep->value()[i] = (double)( i - ( inputVector->length() / 2 ) ); } memcpy( &(outputVectorAuto->value()[inputVector->length() / 2]), &(pdArrayOne[0]), ( ( inputVector->length() + 1 ) / 2 ) * sizeof( double ) ); memcpy( &(outputVectorAuto->value()[0]), &(pdArrayOne[iLength - (inputVector->length() / 2)]), ( inputVector->length() / 2 ) * sizeof( double ) ); bReturn = true; } } } } delete[] pdArrayOne; return bReturn; } Kst::VectorPtr AutoCorrelationSource::vector() const { return _inputVectors[VECTOR_IN]; } QStringList AutoCorrelationSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList AutoCorrelationSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList AutoCorrelationSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList AutoCorrelationSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_AUTO); vectors += VECTOR_OUT_STEP; return vectors; } QStringList AutoCorrelationSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList AutoCorrelationSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void AutoCorrelationSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString AutoCorrelationPlugin::pluginName() const { return tr("Auto Correlation"); } QString AutoCorrelationPlugin::pluginDescription() const { return tr("Generates the auto-correlation of a vector."); } Kst::DataObject *AutoCorrelationPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigAutoCorrelationPlugin* config = static_cast(configWidget)) { AutoCorrelationSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *AutoCorrelationPlugin::configWidget(QSettings *settingsObject) const { ConfigAutoCorrelationPlugin *widget = new ConfigAutoCorrelationPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, AutoCorrelationPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui0000644000175000017500000000305512277111530030422 0ustar synthsynth AutoCorrelationConfig 0 0 429 49 400 0 0 0 Input Vector false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/correlation/autocorrelation/autocorrelation.pro0000644000175000017500000000033012277111530027410 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_autocorrelation) LIBS += -l$$kstlib(gsl) SOURCES += \ autocorrelation.cpp HEADERS += \ autocorrelation.h FORMS += autocorrelationconfig.ui Kst-2.0.8/src/plugins/dataobject/activitylevel/0000755000175000017500000000000012362705136020617 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/activitylevel/activitylevel.cpp0000644000175000017500000004255012362701575024220 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2013 The Kst Team * * kst@kde.org * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "activitylevel.h" #include "objectstore.h" #include "ui_activitylevel.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN_SAMPLING = "Sampling"; static const QString& SCALAR_IN_WINDOWWIDTH = "Window Width"; static const QString& SCALAR_IN_THRESHOLD = "Threshold"; static const QString& VECTOR_OUT_ACTIVITY = "Activity"; static const QString& VECTOR_OUT_REVERSALS = "Nb Reversals"; static const QString& VECTOR_OUT_STDDEV = "Sliding Standard Deviation"; static const QString& VECTOR_OUT_DENOISED = "Denoised Input"; class ConfigWidgetActivityLevelPlugin : public Kst::DataObjectConfigWidget, public Ui_ActivityLevelConfig { public: ConfigWidgetActivityLevelPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_ActivityLevelConfig() { setupUi(this); } ~ConfigWidgetActivityLevelPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _windowWidth->setObjectStore(store); _windowWidth->setDefaultValue(3); _samplingTime->setObjectStore(store); _samplingTime->setDefaultValue(0.025); _noiseThreshold->setObjectStore(store); _noiseThreshold->setDefaultValue(0.2); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_samplingTime, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_windowWidth, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_noiseThreshold, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedSamplingTime() { return _samplingTime->selectedScalar(); }; void setSelectedSamplingTime(Kst::ScalarPtr scalar) { return _samplingTime->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedWindowWidth() { return _windowWidth->selectedScalar(); }; void setSelectedWindowWidth(Kst::ScalarPtr scalar) { return _windowWidth->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedNoiseThreshold() { return _noiseThreshold->selectedScalar(); }; void setSelectedNoiseThreshold(Kst::ScalarPtr scalar) { return _noiseThreshold->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (ActivityLevelSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedSamplingTime(source->samplingTime()); setSelectedWindowWidth(source->windowWidth()); setSelectedNoiseThreshold(source->noiseThreshold()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Activity Level DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar Sampling Time", _samplingTime->selectedScalar()->Name()); _cfg->setValue("Input Scalar Window Width", _windowWidth->selectedScalar()->Name()); _cfg->setValue("Input Scalar Noise Threshold", _noiseThreshold->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Activity Level DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } // Sampling Time QString scalarName = _cfg->value("Input Scalar Sampling Time").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalar = static_cast(object); if (scalar) { setSelectedSamplingTime(scalar); } // Window Width scalarName = _cfg->value("Input Scalar Window Width").toString(); object = _store->retrieveObject(scalarName); scalar = static_cast(object); if (scalar) { setSelectedWindowWidth(scalar); } // Noise Threshold scalarName = _cfg->value("Input Scalar Noise Threshold").toString(); object = _store->retrieveObject(scalarName); scalar = static_cast(object); if (scalar) { setSelectedNoiseThreshold(scalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; ActivityLevelSource::ActivityLevelSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } ActivityLevelSource::~ActivityLevelSource() { } QString ActivityLevelSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Activity Level").arg(vector()->descriptiveName()); } else { return tr("Activity Level"); } } QString ActivityLevelSource::descriptionTip() const { QString tip; tip = tr("Activity Level: %1\n Sampling Time: %2 (s)\n Window width: %3 (s)\n Noise Threshold: %4 \n"). arg(Name()).arg(samplingTime()->value()).arg(windowWidth()->value()).arg(noiseThreshold()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void ActivityLevelSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetActivityLevelPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN_SAMPLING, config->selectedSamplingTime()); setInputScalar(SCALAR_IN_WINDOWWIDTH, config->selectedWindowWidth()); setInputScalar(SCALAR_IN_THRESHOLD, config->selectedNoiseThreshold()); } } void ActivityLevelSource::setupOutputs() { setOutputVector(VECTOR_OUT_ACTIVITY, ""); setOutputVector(VECTOR_OUT_REVERSALS, ""); setOutputVector(VECTOR_OUT_STDDEV, ""); setOutputVector(VECTOR_OUT_DENOISED, ""); } bool ActivityLevelSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr samplingTime = _inputScalars[SCALAR_IN_SAMPLING]; Kst::ScalarPtr windowWidth = _inputScalars[SCALAR_IN_WINDOWWIDTH]; Kst::ScalarPtr noiseThreshold = _inputScalars[SCALAR_IN_THRESHOLD]; Kst::VectorPtr outputVectorActivity = _outputVectors[VECTOR_OUT_ACTIVITY]; Kst::VectorPtr outputVectorReversals = _outputVectors[VECTOR_OUT_REVERSALS]; Kst::VectorPtr outputVectorStdDeviation = _outputVectors[VECTOR_OUT_STDDEV]; Kst::VectorPtr outputVectorDenoised = _outputVectors[VECTOR_OUT_DENOISED]; int i, length; // Check for consistent values if (windowWidth->value() < samplingTime->value() || samplingTime->value() == 0.0) { return false; } int iSamplesForWindow = (int) (windowWidth->value() / samplingTime->value()); double dStandardDeviation = 0.0, dTotal = 0.0, dVariance = 0.0, dSquaredTotal = 0.0; int iTrendPrevious = 0, iTrend = 0; double dNbReversals = 0.0; // Compute as a double since we output a vector of doubles anyway length = inputVector->length(); /* The metric is computed over a couple of seconds, let us compute the corresponding number of samples */ if (iSamplesForWindow > length) { _errorString = tr("Error: Input vector too short."); return false; } if (iSamplesForWindow < 2) { _errorString = tr("Error: the window must be broader."); return false; } /* Array allocations */ outputVectorActivity->resize(length, true); outputVectorReversals->resize(length, true); outputVectorStdDeviation->resize(length, true); outputVectorDenoised->resize(length, true); // /* Requantize to avoid noise creating many unwanted sign changes */ // if (noiseThreshold->value() > 0.0) { // for (i = 0; i < length; ++i) { // outputVectorDenoised->value()[i] = (double) rint( inputVector->value()[i] / noiseThreshold->value() ) * noiseThreshold->value(); // } // } /* Recompute input data, taking direction changes only when they exceed a given threshold */ if (noiseThreshold->value() > 0.0) { iTrendPrevious = (inputVector->value()[1]-inputVector->value()[0] > 0) ? 1 : -1; outputVectorDenoised->value()[0] = inputVector->value()[0]; bool bFreeze = false; for (i = 1; i < length; ++i) { // Update current trend if (inputVector->value()[i] == inputVector->value()[i-1]) { iTrend = 0; } else { iTrend = ( (inputVector->value()[i]-inputVector->value()[i-1]) > 0) ? 1 : -1; } // Check what to do with the value if ( iTrendPrevious * iTrend >= 0 && !bFreeze) { outputVectorDenoised->value()[i] = inputVector->value()[i]; iTrendPrevious = iTrend; } else { // Change of direction: check whether the delta is significant, otherwise freeze the value if ( qAbs(inputVector->value()[i] - outputVectorDenoised->value()[i-1]) >= noiseThreshold->value() ) { // Delta is significant: keep value outputVectorDenoised->value()[i] = inputVector->value()[i]; bFreeze = false; iTrendPrevious = iTrend; } else { outputVectorDenoised->value()[i] = outputVectorDenoised->value()[i-1]; bFreeze = true; } } } } /* Compute initial values for first windowWidth seconds */ dTotal = outputVectorDenoised->value()[0] + outputVectorDenoised->value()[1]; dSquaredTotal += outputVectorDenoised->value()[0] * outputVectorDenoised->value()[0] + outputVectorDenoised->value()[1] * outputVectorDenoised->value()[1]; outputVectorReversals->value()[1] = outputVectorReversals->value()[0] = 0.0; outputVectorStdDeviation->value()[1] = outputVectorStdDeviation->value()[0] = 0.0; outputVectorActivity->value()[1] = outputVectorActivity->value()[0] = 0.0; for (i = 2; i < iSamplesForWindow; ++i) { /* Update previous sign if needed */ if (outputVectorDenoised->value()[i-1] != outputVectorDenoised->value()[i-2]) { iTrendPrevious = ( (outputVectorDenoised->value()[i-1] - outputVectorDenoised->value()[i-2]) > 0 ) ? 1 : -1; } /* Compute current sign */ if (outputVectorDenoised->value()[i] != outputVectorDenoised->value()[i-1]) { iTrend = ( (outputVectorDenoised->value()[i] - outputVectorDenoised->value()[i-1]) > 0 ) ? 1 : -1; } else { iTrend = 0; } /* Check for reversal */ if ( iTrend * iTrendPrevious < 0 ) { dNbReversals += 1.0; } dTotal += outputVectorDenoised->value()[i]; dSquaredTotal += outputVectorDenoised->value()[i] * outputVectorDenoised->value()[i]; /* Store zeros as long as we do not have enough values */ outputVectorReversals->value()[i] = 0.0; outputVectorStdDeviation->value()[i] = 0.0; outputVectorActivity->value()[i] = 0.0; } dVariance = 1.0 / ( (double)iSamplesForWindow - 1.0 ); dVariance *= dSquaredTotal - ( dTotal * dTotal / (double)iSamplesForWindow ); if( dVariance > 0.0 ) { // The computation method can have numerical artefacts leading to negative values here! dStandardDeviation = sqrt( dVariance ); } else { dVariance = 0.0; dStandardDeviation = 0.0; } /* Now, we can actually store the first useful value (exactly the right number of samples processed) */ outputVectorReversals->value()[i] = dNbReversals; outputVectorStdDeviation->value()[i] = dStandardDeviation; outputVectorActivity->value()[i] = dNbReversals * dStandardDeviation; /* Finally, update continuously for each new value for the rest of values */ double outgoingValue, outgoingValuePrev, outgoingValueNext, incomingValue, incomingValuePrev, incomingValueNext; for (i = iSamplesForWindow; i < length; ++i) { dTotal += outputVectorDenoised->value()[i] - outputVectorDenoised->value()[i-iSamplesForWindow]; dSquaredTotal += outputVectorDenoised->value()[i] * outputVectorDenoised->value()[i] - outputVectorDenoised->value()[i-iSamplesForWindow] * outputVectorDenoised->value()[i-iSamplesForWindow]; dVariance = 1.0 / ( (double)iSamplesForWindow - 1.0 ); dVariance *= dSquaredTotal - ( dTotal * dTotal / (double)iSamplesForWindow ); if( dVariance > 0.0 ) { dStandardDeviation = sqrt( dVariance ); } else { dVariance = 0.0; dStandardDeviation = 0.0; } /* Update the number of reversals, by removing 1 if the outgoing data point was a reversal and adding 1 if the incoming point is one */ outgoingValue = outputVectorDenoised->value()[i-iSamplesForWindow]; outgoingValuePrev = outputVectorDenoised->value()[i-iSamplesForWindow-1]; outgoingValueNext = outputVectorDenoised->value()[i-iSamplesForWindow+1]; incomingValue = outputVectorDenoised->value()[i]; incomingValuePrev = outputVectorDenoised->value()[i-1]; if (i == length-1) { // Protect against accessing past the boundary of the vector incomingValueNext = outputVectorDenoised->value()[i]; } else { incomingValueNext = outputVectorDenoised->value()[i+1]; } if ( (outgoingValue-outgoingValuePrev)*(outgoingValueNext-outgoingValue) < 0) { dNbReversals = qMax(dNbReversals - 1.0, qreal(0.0)); // Avoid getting negative values, which can happen } if ( (incomingValue-incomingValuePrev)*(incomingValueNext-incomingValue) < 0) { dNbReversals += 1.0; } /* Store values */ outputVectorReversals->value()[i] = dNbReversals; outputVectorStdDeviation->value()[i] = dStandardDeviation; outputVectorActivity->value()[i] = dNbReversals * dStandardDeviation; } return true; } Kst::VectorPtr ActivityLevelSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr ActivityLevelSource::samplingTime() const { return _inputScalars[SCALAR_IN_SAMPLING]; } Kst::ScalarPtr ActivityLevelSource::windowWidth() const { return _inputScalars[SCALAR_IN_WINDOWWIDTH]; } Kst::ScalarPtr ActivityLevelSource::noiseThreshold() const { return _inputScalars[SCALAR_IN_THRESHOLD]; } QStringList ActivityLevelSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList ActivityLevelSource::inputScalarList() const { QStringList scalars( SCALAR_IN_SAMPLING ); scalars += SCALAR_IN_WINDOWWIDTH; scalars += SCALAR_IN_THRESHOLD; return scalars; } QStringList ActivityLevelSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList ActivityLevelSource::outputVectorList() const { QStringList vectors( VECTOR_OUT_ACTIVITY ); vectors += VECTOR_OUT_REVERSALS; vectors += VECTOR_OUT_STDDEV; vectors += VECTOR_OUT_DENOISED; return vectors; } QStringList ActivityLevelSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList ActivityLevelSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void ActivityLevelSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString ActivityLevelPlugin::pluginName() const { return tr("Activity Level"); } QString ActivityLevelPlugin::pluginDescription() const { return tr("Computes the activity level of a signal as the product of standard deviation and number of reversals over a sliding window."); } Kst::DataObject *ActivityLevelPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetActivityLevelPlugin* config = static_cast(configWidget)) { ActivityLevelSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_SAMPLING, config->selectedSamplingTime()); object->setInputScalar(SCALAR_IN_WINDOWWIDTH, config->selectedWindowWidth()); object->setInputScalar(SCALAR_IN_THRESHOLD, config->selectedNoiseThreshold()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ActivityLevelPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetActivityLevelPlugin *widget = new ConfigWidgetActivityLevelPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ActivityLevelPlugin, ActivityLevelPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/activitylevel/activitylevel.h0000644000175000017500000000520312277111530023646 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2013 The Kst Team * * kst@kde.org * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ACTIVITYLEVELPLUGIN_H #define ACTIVITYLEVELPLUGIN_H #include #include #include class ActivityLevelSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr samplingTime() const; Kst::ScalarPtr windowWidth() const; Kst::ScalarPtr noiseThreshold() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: ActivityLevelSource(Kst::ObjectStore *store); ~ActivityLevelSource(); friend class Kst::ObjectStore; }; class ActivityLevelPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ActivityLevelPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/activitylevel/activitylevel.ui0000644000175000017500000000722112277111530024036 0ustar synthsynth ActivityLevelConfig 0 0 419 130 400 0 0 0 Input Vector false 0 0 0 0 Sampling Time (s) false 0 0 Window Width (s) false 0 0 Noise Threshold false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/activitylevel/kstplugin_activitylevel.desktop0000644000175000017500000000467612362705136027213 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=activitylevel X-Kst-Plugin-Author=Nicolas Brisset Name=Activity Level Data Object Plugin Name[ca]=Connector d'objecte de dades de nivell d'activitat Name[ca@valencia]=Connector d'objecte de dades de nivell d'activitat Name[de]=Aktivitätsstufen-Datenobjekt-Modul Name[fr]=Module de niveau d'activité Name[it]=Estensione oggetto dati di livello attività Name[nl]=Activity Level Data Object Plugin Name[pl]=Wtyczka obiektu danych poziomu aktywności Name[pt]='Plugin' de Objecto de Dados ao Nível da Actividade Name[pt_BR]=Plugin de objeto de dados ao nível de atividade Name[sv]=Dataobjekt-insticksprogram för aktivitetsnivå Name[uk]=Додаток для роботи з об’єктами даних щодо рівня активності Name[x-test]=xxActivity Level Data Object Pluginxx Comment=Computes an activity level (workload) based on signal reversals and amplitude of changes. Comment[ca]=Calcula un nivell d'activitat (càrrega de treball) basat les inversions de senyals i l'amplitud dels canvis. Comment[ca@valencia]=Calcula un nivell d'activitat (càrrega de treball) basat les inversions de senyals i l'amplitud dels canvis. Comment[de]=Berechnet eine Aktivitätsstufe (Arbeitsbelastung) auf der Grundlage von Signalumkehrung und der Amplitude von Änderungen. Comment[fr]=Calcule un niveau d'activité (charge de travail) basé sur les inversions de signaux et l'amplitude des changements. Comment[it]=Calcola un livello attività (carico lavoro) basato su storni di segnali e ampiezza di modifiche. Comment[nl]=Berekent een activiteitsniveau (workload) gebaseerd op omkeringen van signalen en amplitude van wijzigingen. Comment[pl]=Oblicz poziom aktywności (obłożenie) na podstawie odwrócenia sygnałów i zmian amplitud. Comment[pt]=Calcula um nível de actividade (carga) com base nas inversões de sinal e na amplitude das alterações. Comment[pt_BR]=Calcula um nível de atividade (carga) com base nas inversões de sinal e na amplitude das alterações. Comment[sv]=Beräknar en aktivitetsnivå (arbetslast) baserad på signalomkastningar och ändringsamplitud. Comment[uk]=Обчислює рівень активності (навантаження) на основі даних щодо зміни сигналу та амплітуди змін. Comment[x-test]=xxComputes an activity level (workload) based on signal reversals and amplitude of changes.xx Kst-2.0.8/src/plugins/dataobject/genericfilter/0000755000175000017500000000000012362705136020555 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/genericfilter/polynom.h0000644000175000017500000001342712277111530022424 0ustar synthsynth/****************************************************************************** * polynom.h : polynom class. Implements the following operations: * * - the sum, the difference and the product between polynoms ; * * - the multiplication and the division by a scalar ; * * - the derivative and the integrate. * * * * Copyright 2005, Jean-Paul Petillon * * This program is free software; you can 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. * * * ******************************************************************************/ #ifndef POLYNOM_H #define POLYNOM_H template class polynom { public: polynom(int n); // constructor polynom(const polynom& P); // copy constructor ~polynom(); // destructor S& operator[] (int i); // ith coefficient access (read/write) S operator() (S x); // value at x polynom& operator=(const polynom& P); // set a polynom equal to another one polynom operator+(const polynom& P); // sum of 2 polynoms polynom operator-(const polynom& P); // difference between 2 polynoms polynom operator*(const polynom& P); // product of 2 polynoms polynom operator*(const S& x); // product by a scalar polynom operator/(const S& x); // division by a scalar polynom Derivative(); // derivative polynom Integrate(); // integrate int GetDegree(); void SetDegree(int n); private: S* C; // coefficients S NulC; // null coefficient (for i>n) int n; // degree of polynom (table size is n+1) }; // constructor template polynom::polynom(int n) { C = new S[n+1]; for (int i=0; i<=n; i++) C[i]=0.0; NulC = 0.0; this->n = n; }; //------------------------------------------------------------------------------ // copy constructor template polynom::polynom(const polynom& P) { n = P.n; C = new S[n+1]; for (int i=0; i<=n; i++) C[i]=P.C[i]; } //------------------------------------------------------------------------------ // destructor template polynom::~polynom() { delete[] C; }; //------------------------------------------------------------------------------ // coefficient access (read or write) template S& polynom::operator[] (int i) { return i<=n ? C[i] : NulC; }; //------------------------------------------------------------------------------ // value at x template S polynom::operator() (S x) { S r=0.0; S xpi=1.0; // x at the power i for (int i=0; i<=n; i++) { r+=C[i]*xpi; xpi*=x; } return r; }; //------------------------------------------------------------------------------ // set a polynom equal to another one template polynom& polynom::operator=(const polynom& P) { if (n!=P.n) { // reallocate memory if different size delete[] C; n = P.n; C = new S[n+1]; this->n = n; } for (int i=0; i<=n; i++) C[i]=P.C[i]; return *this; }; //------------------------------------------------------------------------------ // polynom sum template polynom polynom::operator+(const polynom& P) { polynom r(n>P.n?n:P.n); for (int i=0; i<= n; i++) r.C[i]+= C[i]; for (int i=0; i<=P.n; i++) r.C[i]+=P.C[i]; return r; }; //------------------------------------------------------------------------------ // polynom difference template polynom polynom::operator-(const polynom& P) { polynom r(n>P.n?n:P.n); for (int i=0; i<= n; i++) r.C[i]+= C[i]; for (int i=0; i<=P.n; i++) r.C[i]-=P.C[i]; return r; }; //------------------------------------------------------------------------------ // polynom product template polynom polynom::operator*(const polynom& P) { polynom r(n+P.n); for (int i=0; i<=r.n; i++) { r.C[i]=0; for (int j=(0>i-n?0:i-n); j<=(i polynom polynom::operator*(const S& x) { polynom r(n); for (int i=0; i<=n; i++) r.C[i]=C[i]*x; return r; }; //------------------------------------------------------------------------------ // scalar division template polynom polynom::operator/(const S& x) { polynom r(n); for (int i=0; i<=n; i++) r.C[i]=C[i]/x; return r; }; //------------------------------------------------------------------------------ // derivative template polynom polynom::Derivative() { polynom r(n-1); for (int i=0; i<=r.n; i++) r.C[i]=(i+1)*C[i+1]; return r; }; //------------------------------------------------------------------------------ // integrate template polynom polynom::Integrate() { polynom r(n+1); r.C[0]=0; for (int i=1; i<=r.n; i++) r.C[i]=C[i-1]/i; return r; }; //------------------------------------------------------------------------------ template int polynom::GetDegree() { return n; } //------------------------------------------------------------------------------ template void polynom::SetDegree(int n) { if (this->n != n) { delete[] C; C = new double[n+1]; this->n = n; for (int i=0; i<=n; i++) C[i]=0.0; } } #endif // ifndef POLYNOM_H Kst-2.0.8/src/plugins/dataobject/genericfilter/genericfilter.pro0000644000175000017500000000032112277111530024107 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_genericfilter) SOURCES += \ genericfilter.cpp HEADERS += \ genericfilter.h \ polynom.h \ filter.h FORMS += genericfilterconfig.ui Kst-2.0.8/src/plugins/dataobject/genericfilter/genericfilterconfig.ui0000644000175000017500000001212412277111530025116 0ustar synthsynth GenericFilterConfig 0 0 426 170 400 0 0 0 Input Vector false Qt::Horizontal 40 20 0 0 0 0 Sampling interval (s) false Qt::Horizontal 40 20 0 0 Numerator (increasing order) false Qt::Horizontal 40 20 0 0 Denominator (increasing order) false Qt::Horizontal 40 20 Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst::StringSelector QWidget
stringselector.h
Kst-2.0.8/src/plugins/dataobject/genericfilter/genericfilter.cpp0000644000175000017500000002613312362701575024113 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "genericfilter.h" #include "objectstore.h" #include "ui_genericfilterconfig.h" #include "polynom.h" #include "filter.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scalar In"; static const QString& STRING_IN_NUMERATOR = "String In Numerator"; static const QString& STRING_IN_DENOMINATOR = "String In Denominator"; static const QString& VECTOR_OUT = "Filtered"; class ConfigGenericFilterPlugin : public Kst::DataObjectConfigWidget, public Ui_GenericFilterConfig { public: ConfigGenericFilterPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_GenericFilterConfig() { _store = 0; setupUi(this); } ~ConfigGenericFilterPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarInterval->setObjectStore(store); _stringNumerator->setObjectStore(store); _stringDenominator->setObjectStore(store); _scalarInterval->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarInterval, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_stringNumerator, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_stringDenominator, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarInterval->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarInterval->setSelectedScalar(scalar); }; Kst::StringPtr selectedStringNumerator() { return _stringNumerator->selectedString(); }; void setSelectedStringNumerator(Kst::StringPtr string) { return _stringNumerator->setSelectedString(string); }; Kst::StringPtr selectedStringDenominator() { return _stringDenominator->selectedString(); }; void setSelectedStringDenominator(Kst::StringPtr string) { return _stringDenominator->setSelectedString(string); }; virtual void setupFromObject(Kst::Object* dataObject) { if (GenericFilterSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->scalarInterval()); setSelectedStringNumerator(source->stringNumerator()); setSelectedStringDenominator(source->stringDenominator()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Generic Filter DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar Interval", _scalarInterval->selectedScalar()->Name()); if (_stringNumerator->selectedString()) { _cfg->setValue("Input String Numerator", _stringNumerator->selectedString()->Name()); } if (_stringDenominator->selectedString()) { _cfg->setValue("Input String Denominator", _stringDenominator->selectedString()->Name()); } _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Generic Filter DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Scalar Interval").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* binScalar = static_cast(object); if (binScalar) { setSelectedScalar(binScalar); } QString stringName = _cfg->value("Input String Numerator").toString(); object = _store->retrieveObject(stringName); Kst::String* stringNum = static_cast(object); if (stringNum) { setSelectedStringNumerator(stringNum); } stringName = _cfg->value("Input String Denominator").toString(); object = _store->retrieveObject(stringName); Kst::String* stringDenom = static_cast(object); if (stringDenom) { setSelectedStringDenominator(stringDenom); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; GenericFilterSource::GenericFilterSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } GenericFilterSource::~GenericFilterSource() { } QString GenericFilterSource::_automaticDescriptiveName() const { return tr("Generic Filter Plugin Object"); } void GenericFilterSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigGenericFilterPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); setInputString(STRING_IN_NUMERATOR, config->selectedStringNumerator()); setInputString(STRING_IN_DENOMINATOR, config->selectedStringDenominator()); } } void GenericFilterSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool GenericFilterSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::StringPtr inputStringNumerator = _inputStrings[STRING_IN_NUMERATOR]; Kst::StringPtr inputStringDenominator = _inputStrings[STRING_IN_DENOMINATOR]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; //Validate the Numerator. if (!inputStringNumerator || inputStringNumerator->value().isEmpty()) { _errorString = tr("Error: Input String Numerator is Empty"); return false; } //Validate the Denominator. if (!inputStringDenominator || inputStringDenominator->value().isEmpty()) { _errorString = tr("Error: Input String Denominator is Empty"); return false; } int length = inputVector->length(); // Extract polynom coefficients and instantiate polynoms QStringList numCoeffs = inputStringNumerator->value().split(QRegExp("\\s*(,|;|:)\\s*")); QStringList denCoeffs = inputStringDenominator->value().split(QRegExp("\\s*(,|;|:)\\s*")); int numDegree = numCoeffs.count() - 1, denDegree = denCoeffs.count() - 1; polynom Num(numDegree), Den(denDegree); double tmpDouble = 0.0; bool ok = false; for (int i=0; i<=numDegree; i++) { tmpDouble = numCoeffs[i].toDouble(&ok); if (ok) Num[i]= tmpDouble; else Num[i] = 0.0; } for (int i=0; i<=denDegree; i++) { tmpDouble = denCoeffs[i].toDouble(&ok); if (ok) Den[i] = tmpDouble; else Den[i] = 0.0; } // Time step double DeltaT = inputScalar->value(); // Allocate storage for output vectors outputVector->resize(length, true); // Create filter filter theFilter(Num,Den,DeltaT); double in = 0.0; theFilter.ConnectTo(in); // the filter keeps a pointer to "in" theFilter.Reset(); for (int i=0; ivalue()[i]; theFilter.NextTimeStep(); outputVector->value()[i] = theFilter.out; } return true; } Kst::VectorPtr GenericFilterSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr GenericFilterSource::scalarInterval() const { return _inputScalars[SCALAR_IN]; } Kst::StringPtr GenericFilterSource::stringNumerator() const { return _inputStrings[STRING_IN_NUMERATOR]; } Kst::StringPtr GenericFilterSource::stringDenominator() const { return _inputStrings[STRING_IN_DENOMINATOR]; } QStringList GenericFilterSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList GenericFilterSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList GenericFilterSource::inputStringList() const { QStringList strings(STRING_IN_NUMERATOR); strings += STRING_IN_DENOMINATOR; return strings; } QStringList GenericFilterSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList GenericFilterSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList GenericFilterSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void GenericFilterSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString GenericFilterPlugin::pluginName() const { return tr("Generic Filter"); } QString GenericFilterPlugin::pluginDescription() const { return tr("Generates a discrete filter from a continuous-time definition."); } Kst::DataObject *GenericFilterPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigGenericFilterPlugin* config = static_cast(configWidget)) { GenericFilterSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setInputString(STRING_IN_NUMERATOR, config->selectedStringNumerator()); object->setInputString(STRING_IN_DENOMINATOR, config->selectedStringDenominator()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *GenericFilterPlugin::configWidget(QSettings *settingsObject) const { ConfigGenericFilterPlugin *widget = new ConfigGenericFilterPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, GenericFilterPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/genericfilter/genericfilter.h0000644000175000017500000000514412277111530023546 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef GENERICFILTERPLUGIN_H #define GENERICFILTERPLUGIN_H #include #include #include class GenericFilterSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr scalarInterval() const; Kst::StringPtr stringNumerator() const; Kst::StringPtr stringDenominator() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: GenericFilterSource(Kst::ObjectStore *store); ~GenericFilterSource(); friend class Kst::ObjectStore; }; class GenericFilterPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~GenericFilterPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/genericfilter/kstplugin_genericfilter.desktop0000644000175000017500000000374412362705136027102 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=genericfilter X-Kst-Plugin-Author=The University of Toronto Name=Generic Filter Data Object Plugin Name[ca]=Connector d'objecte de filtre genèric Name[ca@valencia]=Connector d'objecte de filtre genèric Name[de]=Datenobjekt-Modul für allgemeine Filter Name[fr]=Module DataObject de filtre générique Name[it]=Estensione oggetto dati filtro generico Name[nl]=Generic Filter Data Object Plugin Name[pl]=Wtyczka obiektu danych zwykłego filtra Name[pt]='Plugin' de Objectos de Dados de Filtro Genérico Name[pt_BR]=Plugin de objetos de dados de filtro genérico Name[sv]=Dataobjekt-insticksprogram för generellt filter Name[uk]=Додаток для роботи з об’єктами загального фільтрування даних Name[x-test]=xxGeneric Filter Data Object Pluginxx Comment=Implements a Generic Filter Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de filtre genèric pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de filtre genèric pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für allgemeine Filter für Kst. Comment[fr]=Implémente un module DataObject de filtre générique pour Kst. Comment[it]=Implementa un'stensione oggetto dati filtro generico per Kst. Comment[nl]=Implementeert een algemene plugin voor een gegevensobject in Kst voor filteren. Comment[pl]=Implementuje wtyczkę obiektu danych zwykłego filtra dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com um filtro genérico para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de filtro genérico para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för generellt filter. Comment[uk]=Реалізує додаток для роботи з об’єктами загального фільтрування даних у Kst. Comment[x-test]=xxImplements a Generic Filter Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/genericfilter/filter.h0000644000175000017500000000723312277111530022212 0ustar synthsynth/****************************************************************************** * filter.h : Digital Filter. Specified by its "s" transfer function. * * Synthesis of "z" transfert function is done by bilinear * * transformation : 2 z-1 * * p -> --- ----- * * T z+1 * * Copyright 2005, Jean-Paul Petillon * * This program is free software; you can 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. * ******************************************************************************/ #ifndef FILTER_H #define FILTER_H #include "polynom.h" template class filter { public: S out; // output filter( // constructor // "s" transfert function polynom& Ns, // numerator polynom& Ds, // denominator double dT // sampling period (s) ); void Reset(); // reset void ConnectTo( // connector S& in // input address ); void NextTimeStep(); // update ~filter(); // destructor private: // pointer on input S* in; // order int n; // "z" transfert function polynom Nz; // numerator polynom Dz; // denominator // state vector S* x; }; template filter::filter(polynom& Ns, polynom& Ds, double dT) :Nz(0), Dz(0) { // the greatest degree between N & D n=Ns.GetDegree()>Ds.GetDegree() ? Ns.GetDegree() : Ds.GetDegree(); // allocate memory for state vector x = new S[n]; // reset it Reset(); // as well as the output out=0.0; // computes "z" transfer function polynom potzm1odt(0); potzm1odt[0]=1.0; // [2(z-1)/dT]^i polynom dzm1odt(1); dzm1odt[1]=2.0/dT; dzm1odt[0]=-2.0/dT; // 2(z-1)/dT for (int i=0; i<=n; i++) { // (z+1)^(n-i) = 1 polynom pozp1(0); pozp1[0]=1.0; // z+1 polynom zp1(1); zp1[1]=1.0; zp1[0]=1.0; // (z+1)^(n-i) for (int j=i+1; j<=n; j++) pozp1 = (pozp1 * zp1); polynom dNz(0); dNz[0]=Ns[i]; dNz = dNz * pozp1 * potzm1odt; Nz = Nz + dNz; polynom dDz(0); dDz[0]=Ds[i]; dDz = dDz * pozp1 * potzm1odt; Dz = Dz + dDz; potzm1odt = potzm1odt * dzm1odt; } } //------------------------------------------------------------------------------ template void filter::Reset() // reset state vector { for (int i=0; i void filter::ConnectTo(S& in) { // memorizes input address this->in = ∈ } //------------------------------------------------------------------------------ template void filter::NextTimeStep() { // Compute output out = (x[n-1] + *in * Nz[n])/ Dz[n]; // update state vector x[0] .. x[n-1] (goes from output to input) for (int i=n-1; i>0; i--) { x[i] = x[i-1] + Nz[i]*(*in) - Dz[i]*out; } x[0] = Nz[0]*(*in) - Dz[0]*out; } //------------------------------------------------------------------------------ template filter::~filter() { // deallocate memory used by state vector delete[] x; } //------------------------------------------------------------------------------ #endif // #ifndef FILTER_H Kst-2.0.8/src/plugins/dataobject/syncbin/0000755000175000017500000000000012362705136017400 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/syncbin/syncbin.h0000644000175000017500000000535112277111530021214 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SYNCBINPLUGIN_H #define SYNCBINPLUGIN_H #include #include #include class SyncBinSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::ScalarPtr scalarBins() const; Kst::ScalarPtr scalarXMin() const; Kst::ScalarPtr scalarXMax() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: SyncBinSource(Kst::ObjectStore *store); ~SyncBinSource(); friend class Kst::ObjectStore; }; class SyncBinPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~SyncBinPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/syncbin/syncbin.pro0000644000175000017500000000023212277111530021556 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_syncbin) SOURCES += \ syncbin.cpp HEADERS += \ syncbin.h FORMS += syncbinconfig.ui Kst-2.0.8/src/plugins/dataobject/syncbin/syncbin.cpp0000644000175000017500000003275212362701575021565 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* bin Y values into N bins from X min to X max, according to their X values. This is like a 1D map, where X specifices the pixel the data go into. */ #include "syncbin.h" #include "objectstore.h" #include "ui_syncbinconfig.h" // macros to find the top, bottom, and middle of a bin #define BINMID(x) XMin+(XMax-XMin)*(double(x)+0.5)/double(nbins) #define BIN( x ) int(double(nbins)*(x-XMin)/(XMax-XMin)) static const QString& VECTOR_IN_X = "Vector In X"; static const QString& VECTOR_IN_Y = "Vector In Y"; static const QString& SCALAR_IN_BINS = "Number of Bins"; static const QString& SCALAR_IN_XMIN = "X Min"; static const QString& SCALAR_IN_XMAX = "X Max"; static const QString& VECTOR_OUT_X_OUT = "X out"; static const QString& VECTOR_OUT_Y_OUT = "Y out"; static const QString& VECTOR_OUT_Y_ERROR = "Y error"; static const QString& VECTOR_OUT_N = "N"; class ConfigSyncBinPlugin : public Kst::DataObjectConfigWidget, public Ui_SyncBinConfig { public: ConfigSyncBinPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_SyncBinConfig() { _store = 0; setupUi(this); } ~ConfigSyncBinPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _scalarBins->setObjectStore(store); _scalarXMin->setObjectStore(store); _scalarXMax->setObjectStore(store); _scalarBins->setDefaultValue(0); _scalarXMin->setDefaultValue(0); _scalarXMax->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarBins, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarXMin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarXMax, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarBins() { return _scalarBins->selectedScalar(); }; void setSelectedScalarBins(Kst::ScalarPtr scalar) { return _scalarBins->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarXMin() { return _scalarXMin->selectedScalar(); }; void setSelectedScalarXMin(Kst::ScalarPtr scalar) { return _scalarXMin->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarXMax() { return _scalarXMax->selectedScalar(); }; void setSelectedScalarXMax(Kst::ScalarPtr scalar) { return _scalarXMax->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (SyncBinSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedScalarBins(source->scalarBins()); setSelectedScalarXMin(source->scalarXMin()); setSelectedScalarXMax(source->scalarXMax()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("SyncBin DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Scalar Number of Bins", _scalarBins->selectedScalar()->Name()); _cfg->setValue("Input Scalar X Min", _scalarXMin->selectedScalar()->Name()); _cfg->setValue("Input Scalar X Max", _scalarXMax->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("SyncBin DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorX = static_cast(object); if (vectorX) { setSelectedVectorX(vectorX); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorY = static_cast(object); if (vectorY) { setSelectedVectorY(vectorY); } QString scalarName = _cfg->value("Input Scalar Number of Bins").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarBins = static_cast(object); if (scalarBins) { setSelectedScalarBins(scalarBins); } scalarName = _cfg->value("Input Scalar X Min").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarXMin = static_cast(object); if (scalarXMin) { setSelectedScalarXMin(scalarXMin); } scalarName = _cfg->value("Input Scalar X Max").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarXMax = static_cast(object); if (scalarXMax) { setSelectedScalarXMax(scalarXMax); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; SyncBinSource::SyncBinSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } SyncBinSource::~SyncBinSource() { } QString SyncBinSource::_automaticDescriptiveName() const { return tr("SyncBin Plugin Object"); } void SyncBinSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigSyncBinPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputScalar(SCALAR_IN_BINS, config->selectedScalarBins()); setInputScalar(SCALAR_IN_XMIN, config->selectedScalarXMin()); setInputScalar(SCALAR_IN_XMAX, config->selectedScalarXMax()); } } void SyncBinSource::setupOutputs() { setOutputVector(VECTOR_OUT_X_OUT, ""); setOutputVector(VECTOR_OUT_Y_OUT, ""); setOutputVector(VECTOR_OUT_Y_ERROR, ""); setOutputVector(VECTOR_OUT_N, ""); } bool SyncBinSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::ScalarPtr inputScalarBins = _inputScalars[SCALAR_IN_BINS]; Kst::ScalarPtr inputScalarXMin = _inputScalars[SCALAR_IN_XMIN]; Kst::ScalarPtr inputScalarXMax = _inputScalars[SCALAR_IN_XMAX]; Kst::VectorPtr outputVectorX = _outputVectors[VECTOR_OUT_X_OUT]; Kst::VectorPtr outputVectorY = _outputVectors[VECTOR_OUT_Y_OUT]; Kst::VectorPtr outputVectorYError = _outputVectors[VECTOR_OUT_Y_ERROR]; Kst::VectorPtr outputVectorN = _outputVectors[VECTOR_OUT_N]; int nbins = int( inputScalarBins->value() ); int n_in; double XMin = inputScalarXMin->value(); double XMax = inputScalarXMax->value(); double *Xout, *Yout, *Yerr, *N; //Make sure there is at least 1 element in the input vector if (inputVectorX->length() < 1) { _errorString = tr("Error: Input Vector X invalid size"); return false; } if (inputVectorX->length() != inputVectorY->length()) { _errorString = tr("Error: Input Vector lengths do not match"); return false; } if (nbins < 2) { _errorString = tr("Error: Bins must be at least 2"); return false; } //resize the output arrays outputVectorX->resize(nbins, true); outputVectorY->resize(nbins, true); outputVectorYError->resize(nbins, true); outputVectorN->resize(nbins, true); // convenience definitions n_in = int( inputVectorX->length() ); const double *Xin = inputVectorX->value(); const double *Yin = inputVectorY->value(); Xout = outputVectorX->value(); Yout = outputVectorY->value(); Yerr = outputVectorYError->value(); N = outputVectorN->value(); // set/check XMax and XMin if ( XMax <= XMin ) { // autobin XMax = XMin = Xin[0]; for (int i=1; iXin[i] ) XMax = Xin[i]; if ( XMin0) { last_sY/=last_N; if ( (last_bin>=0) && (last_bin0) { last_sY/=last_N; if ( (last_bin>=0) && (last_bin0 ) { Yerr[i] = sqrt( Yerr[i] - Yout[i]*Yout[i]/N[i] )/N[i]; Yout[i]/=N[i]; } } return true; } Kst::VectorPtr SyncBinSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr SyncBinSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::ScalarPtr SyncBinSource::scalarBins() const { return _inputScalars[SCALAR_IN_BINS]; } Kst::ScalarPtr SyncBinSource::scalarXMin() const { return _inputScalars[SCALAR_IN_XMIN]; } Kst::ScalarPtr SyncBinSource::scalarXMax() const { return _inputScalars[SCALAR_IN_XMAX]; } QStringList SyncBinSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList SyncBinSource::inputScalarList() const { QStringList scalars(SCALAR_IN_BINS); scalars += SCALAR_IN_XMIN; scalars += SCALAR_IN_XMAX; return scalars; } QStringList SyncBinSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList SyncBinSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_X_OUT); vectors += VECTOR_OUT_Y_OUT; vectors += VECTOR_OUT_Y_ERROR; vectors += VECTOR_OUT_N; return vectors; } QStringList SyncBinSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList SyncBinSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void SyncBinSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString SyncBinPlugin::pluginName() const { return tr("SyncBin"); } QString SyncBinPlugin::pluginDescription() const { return tr("Synchronously coadd vector Y into inputScalarBins defined by vector X. Like a 1D map."); } Kst::DataObject *SyncBinPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigSyncBinPlugin* config = static_cast(configWidget)) { SyncBinSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_BINS, config->selectedScalarBins()); object->setInputScalar(SCALAR_IN_XMIN, config->selectedScalarXMin()); object->setInputScalar(SCALAR_IN_XMAX, config->selectedScalarXMax()); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *SyncBinPlugin::configWidget(QSettings *settingsObject) const { ConfigSyncBinPlugin *widget = new ConfigSyncBinPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, SyncBinPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/syncbin/syncbinconfig.ui0000644000175000017500000001124212277111530022564 0ustar synthsynth SyncBinConfig 0 0 438 94 400 0 0 0 Input Vector X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Input Vector Y Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Number of Bins false 0 0 0 0 X Min Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 X Max Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/syncbin/kstplugin_syncbin.desktop0000644000175000017500000000416712362705136024550 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=syncbin X-Kst-Plugin-Author=The University of Toronto Name=Sync Bin Data Object Plugin Name[ca]=Connector d'objecte de dades classificades sincronitzades Name[ca@valencia]=Connector d'objecte de dades classificades sincronitzades Name[de]=Datenobjekt-Modul für den Abgleich binärer Daten Name[fr]=Module DataObject de classement synchrone (sync bin) Name[it]=Estensione oggetto dati di collocazione sincronici Name[nl]=Sync Bin Data Object Plugin Name[pl]=Wtyczka obiektu danych synchronizacji przedziału Name[pt]='Plugin' de Objecto de Dados Compartimentados Sincronizados Name[pt_BR]=Plugin de objeto de dados compartimentados sincronizados Name[sv]=Synkront intervalldataobjekt-insticksprogram Name[uk]=Додаток для роботи з об’єктами синхронізованих комбінацій даних Name[x-test]=xxSync Bin Data Object Pluginxx Comment=Implements a Sync Bin Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades classificades sincronitzades pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades classificades sincronitzades pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für den Abgleich binärer für Kst. Comment[fr]=Implémente un module DataObject de classement synchrone (sync bin) pour Kst. Comment[it]=Implementa un'estensione oggetti dati di collocazione sincronica per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor syncen van klassen. Comment[pl]=Implementuje wtyczkę obiektu danych synchronizacji przedziału dla Kst. Comment[pt]=Implementa um 'plugin' de objecto de dados compartimentados sincronizados para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados compartimentados sincronizados para o Kst. Comment[sv]=Implementerar ett Kst synkront intervalldataobjekt-insticksprogram. Comment[uk]=Реалізує додаток для роботи з об’єктами синхронізованих комбінацій даних у Kst. Comment[x-test]=xxImplements a Sync Bin Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/linefit/0000755000175000017500000000000012362705136017365 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/linefit/linefit.pro0000644000175000017500000000023212277111530021530 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_linefit) SOURCES += \ linefit.cpp HEADERS += \ linefit.h FORMS += linefitconfig.ui Kst-2.0.8/src/plugins/dataobject/linefit/linefitconfig.ui0000644000175000017500000000463112277111530022542 0ustar synthsynth LineFitConfig 0 0 421 78 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/linefit/linefit.h0000644000175000017500000000516412277111530021170 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LINEFITPLUGIN_H #define LINEFITPLUGIN_H #include #include #include class LineFitSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: LineFitSource(Kst::ObjectStore *store); ~LineFitSource(); friend class Kst::ObjectStore; }; class LineFitPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~LineFitPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/linefit/kstplugin_linefit.desktop0000644000175000017500000000361012362705136024512 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=linefit X-Kst-Plugin-Author=The University of Toronto Name=Line Fit Data Object Plugin Name[ca]=Connector d'objecte d'ajust lineal Name[ca@valencia]=Connector d'objecte d'ajust lineal Name[de]=Lineares Näherungs-Datenobjekt-Modul Name[fr]=Module DataObject de régression linéaire Name[it]=Estensione oggetto dati di adattamento riga Name[nl]=Line Fit Data Object Plugin Name[pl]=Wtyczka obiektu danych dopasowania linii Name[pt]='Plugin' de Objectos de Dados de Ajuste Linear Name[pt_BR]=Plugin de objeto de dados de ajuste linear Name[sv]=Dataobjekt-insticksprogram för linjeanpassning Name[uk]=Додаток для роботи з об’єктами лінійного наближення Name[x-test]=xxLine Fit Data Object Pluginxx Comment=Implements a Line Fit Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte d'ajust lineal pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte d'ajust lineal pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für lineare Näherung für Kst. Comment[fr]=Implémente un module DataObject de régression linéaire pour Kst. Comment[it]=Implementa un'estensione oggetto dati di adattamento riga per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor aanpassen aan een lijn. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania linii dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com ajuste linear para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de ajuste linear para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för linjeanpassning. Comment[uk]=Реалізує додаток для роботи з об’єктами лінійного наближення даних у Kst. Comment[x-test]=xxImplements a Line Fit Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/linefit/linefit.cpp0000644000175000017500000002353512362701575021536 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "linefit.h" #include "objectstore.h" #include "ui_linefitconfig.h" #include "math_kst.h" static const QString& VECTOR_IN_X = "Vector In X"; static const QString& VECTOR_IN_Y = "Vector In Y"; static const QString& VECTOR_OUT_X = "X Interpolated"; static const QString& VECTOR_OUT_Y = "Y Interpolated"; static const QString& SCALAR_OUT_A = "a"; static const QString& SCALAR_OUT_B = "b"; static const QString& SCALAR_OUT_CHI2 = "chi^2"; class ConfigWidgetLineFitPlugin : public Kst::DataObjectConfigWidget, public Ui_LineFitConfig { public: ConfigWidgetLineFitPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_LineFitConfig() { _store = 0; setupUi(this); } ~ConfigWidgetLineFitPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (LineFitSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Line Fit DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Line Fit DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorY(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; LineFitSource::LineFitSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } LineFitSource::~LineFitSource() { } QString LineFitSource::_automaticDescriptiveName() const { return tr("Line Fit Plugin Object"); } void LineFitSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetLineFitPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void LineFitSource::setupOutputs() { setOutputVector(VECTOR_OUT_X, ""); setOutputVector(VECTOR_OUT_Y, ""); setOutputScalar(SCALAR_OUT_A, ""); setOutputScalar(SCALAR_OUT_B, ""); setOutputScalar(SCALAR_OUT_CHI2, ""); } bool LineFitSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorX = _outputVectors[VECTOR_OUT_X]; Kst::VectorPtr outputVectorY = _outputVectors[VECTOR_OUT_Y]; Kst::ScalarPtr outputScalarA = _outputScalars[SCALAR_OUT_A]; Kst::ScalarPtr outputScalarB = _outputScalars[SCALAR_OUT_B]; Kst::ScalarPtr outputScalarChi = _outputScalars[SCALAR_OUT_CHI2]; int i = 0; double a = 0.0, b = 0.0, sx = 0.0, sy = 0.0, sxoss = 0.0, st2 = 0.0, chi2 = 0.0; double xScale; if (inputVectorY->length() < 1) { _errorString = tr("Error: Input Vector Y Length invalid"); return false; } if (inputVectorX->length() < 1) { _errorString = tr("Error: Input Vector X Length invalid"); return false; } outputVectorX->resize( 2, false ); outputVectorY->resize( 2, false ); if (inputVectorY->length() == 1) { outputVectorX->value()[0] = inputVectorX->value()[0]; outputVectorX->value()[1] = inputVectorX->value()[inputVectorX->length() - 1]; outputVectorY->value()[0] = inputVectorY->value()[0]; outputVectorY->value()[1] = inputVectorY->value()[0]; outputScalarA->setValue( inputVectorY->value()[0] ); outputScalarB->setValue( 0 ); outputScalarChi->setValue( chi2 ); return true; } xScale = inputVectorX->length()/inputVectorY->length(); for (i = 0; i < inputVectorY->length(); ++i) { double z = xScale*i; long int idx = long(Kst::roundDouble(z)); double skew = z - floor(z); /* [0..1] */ long int idx2 = idx + 1; sy += inputVectorY->value()[i]; while (idx2 >= inputVectorY->length()) { idx2--; } sx += inputVectorX->value()[idx] + (inputVectorX->value()[idx2] - inputVectorX->value()[idx])*skew; } sxoss = sx / inputVectorX->length(); for (i = 0; i < inputVectorX->length(); ++i) { double t = inputVectorX->value()[i] - sxoss; st2 += t * t; b += t * inputVectorY->value()[i]; } b /= st2; a = (sy - sx*b)/inputVectorX->length(); /* could put goodness of fit, etc, in here */ outputVectorX->value()[0] = inputVectorX->value()[0]; outputVectorX->value()[1] = inputVectorX->value()[inputVectorX->length()-1]; outputVectorY->value()[0] = a+b*outputVectorX->value()[0]; outputVectorY->value()[1] = a+b*outputVectorX->value()[1]; for (i = 0; i < inputVectorX->length(); ++i) { double z = xScale*i; long int idx = long(Kst::roundDouble(z)); double skew = z - floor(z); /* [0..1] */ long int idx2 = idx + 1; double newX; double ci; while (idx2 >= inputVectorX->length()) { idx2--; } newX = inputVectorX->value()[idx] + (inputVectorX->value()[idx2] - inputVectorX->value()[idx])*skew; ci = inputVectorY->value()[i] - a - b*newX; chi2 += ci*ci; } outputScalarA->setValue( a ); outputScalarB->setValue( b ); outputScalarChi->setValue( chi2 ); return true; } Kst::VectorPtr LineFitSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr LineFitSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList LineFitSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList LineFitSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList LineFitSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList LineFitSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_X); vectors += VECTOR_OUT_Y; return vectors; } QStringList LineFitSource::outputScalarList() const { QStringList scalars(SCALAR_OUT_A); scalars += SCALAR_OUT_B; scalars += SCALAR_OUT_CHI2; return scalars; } QStringList LineFitSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void LineFitSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString LineFitPlugin::pluginName() const { return tr("Line Fit"); } QString LineFitPlugin::pluginDescription() const { return tr("Generates a line of best fit for a set of data."); } Kst::DataObject *LineFitPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetLineFitPlugin* config = static_cast(configWidget)) { LineFitSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *LineFitPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetLineFitPlugin *widget = new ConfigWidgetLineFitPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, LineFitPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/effectivebandwidth/0000755000175000017500000000000012362705136021560 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/effectivebandwidth/kstplugin_effectivebandwidth.desktop0000644000175000017500000000415412362705136031104 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=effectivebandwidth X-Kst-Plugin-Author=The University of Toronto Name=Effective Bandwidth Data Object Plugin Name[ca]=Connector d'objecte de dades d'amplada de banda efectiva Name[ca@valencia]=Connector d'objecte de dades d'amplada de banda efectiva Name[de]=Datenobjekt-Modul für effektive Bandbreite Name[fr]=Module DataObject de bande passante effective Name[it]=Estensione oggetto dati di larghezza banda effettiva Name[nl]=Effective Bandwidth Data Object Plugin Name[pl]=Wtyczka obiektu danych efektywnego pasma Name[pt]='Plugin' de Objectos de Dados de Largura de Banda Efectiva Name[pt_BR]=Plugin de objeto de dados de largura de banda efetiva Name[sv]=Dataobjekt-insticksprogram för effektiv bandbredd Name[uk]=Додаток для роботи з об’єктами ефективної смуги даних Name[x-test]=xxEffective Bandwidth Data Object Pluginxx Comment=Implements a Effective Bandwidth Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'amplada de banda efectiva pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'amplada de banda efectiva pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul effektive Bandbreite für Kst. Comment[fr]=Implémente un module DataObject de bande passante effective pour Kst. Comment[it]=Implementa un'estensione oggetto dati di larghezza banda effettiva per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor effectieve bandbreedte. Comment[pl]=Implementuje wtyczkę obiektu danych efektywnego pasma dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de largura de banda efectiva para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de largura de banda efetiva para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för effektiv bandbredd. Comment[uk]=Реалізує додаток для роботи з об’єктами ефективної смуги даних у Kst. Comment[x-test]=xxImplements a Effective Bandwidth Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui0000644000175000017500000001103412277111530027123 0ustar synthsynth EffectiveBandwidthConfig 0 0 428 109 400 0 0 0 Input Vector X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Input Vector Y Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Min. White Noise Freq. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 SamplingFrequency (Hz) false 0 0 K Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/effectivebandwidth/effectivebandwidth.h0000644000175000017500000000546212277111530025557 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EFFECTIVEBANDWIDTHPLUGIN_H #define EFFECTIVEBANDWIDTHPLUGIN_H #include #include #include class EffectiveBandwidthSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::ScalarPtr scalarMin() const; Kst::ScalarPtr scalarFreq() const; Kst::ScalarPtr scalarK() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: EffectiveBandwidthSource(Kst::ObjectStore *store); ~EffectiveBandwidthSource(); friend class Kst::ObjectStore; }; class EffectiveBandwidthPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~EffectiveBandwidthPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp0000644000175000017500000003162412362701575026122 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "effectivebandwidth.h" #include "objectstore.h" #include "ui_effectivebandwidthconfig.h" static const QString& VECTOR_IN_X = "Vector In X"; static const QString& VECTOR_IN_Y = "Vector In Y"; static const QString& SCALAR_IN_MIN = "Min. White Noise Freq."; static const QString& SCALAR_IN_FREQ = "Sampling Frequency (Hz)"; static const QString& SCALAR_IN_K = "K"; static const QString& SCALAR_OUT_LIMIT = "White Noise Limit"; static const QString& SCALAR_OUT_SIGMA = "White Noise Sigma"; static const QString& SCALAR_OUT_BANDWIDTH = "Effective Bandwidth"; class ConfigEffectiveBandwidthPlugin : public Kst::DataObjectConfigWidget, public Ui_EffectiveBandwidthConfig { public: ConfigEffectiveBandwidthPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_EffectiveBandwidthConfig() { _store = 0; setupUi(this); } ~ConfigEffectiveBandwidthPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _scalarMin->setObjectStore(store); _scalarFreq->setObjectStore(store); _scalarK->setObjectStore(store); _scalarMin->setDefaultValue(0); _scalarFreq->setDefaultValue(0); _scalarK->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarMin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarFreq, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarK, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarMin() { return _scalarMin->selectedScalar(); }; void setSelectedScalarMin(Kst::ScalarPtr scalar) { return _scalarMin->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarFreq() { return _scalarFreq->selectedScalar(); }; void setSelectedScalarFreq(Kst::ScalarPtr scalar) { return _scalarFreq->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarK() { return _scalarK->selectedScalar(); }; void setSelectedScalarK(Kst::ScalarPtr scalar) { return _scalarK->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (EffectiveBandwidthSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedScalarMin(source->scalarMin()); setSelectedScalarFreq(source->scalarFreq()); setSelectedScalarK(source->scalarK()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Effective Bandwidth DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Scalar Min. White Noise Freq.", _scalarMin->selectedScalar()->Name()); _cfg->setValue("Input Scalar Sampling Frequency (Hz)", _scalarFreq->selectedScalar()->Name()); _cfg->setValue("Input Scalar K", _scalarK->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Effective Bandwidth DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorX = static_cast(object); if (vectorX) { setSelectedVectorX(vectorX); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorY = static_cast(object); if (vectorY) { setSelectedVectorY(vectorY); } QString scalarName = _cfg->value("Input Scalar Min. White Noise Freq.").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarMin = static_cast(object); if (scalarMin) { setSelectedScalarMin(scalarMin); } scalarName = _cfg->value("Input Scalar Sampling Frequency (Hz)").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarFreq = static_cast(object); if (scalarFreq) { setSelectedScalarFreq(scalarFreq); } scalarName = _cfg->value("Input Scalar K").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarK = static_cast(object); if (scalarK) { setSelectedScalarK(scalarK); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; EffectiveBandwidthSource::EffectiveBandwidthSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } EffectiveBandwidthSource::~EffectiveBandwidthSource() { } QString EffectiveBandwidthSource::_automaticDescriptiveName() const { return tr("Effective Bandwidth Plugin Object"); } void EffectiveBandwidthSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigEffectiveBandwidthPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputScalar(SCALAR_IN_MIN, config->selectedScalarMin()); setInputScalar(SCALAR_IN_FREQ, config->selectedScalarFreq()); setInputScalar(SCALAR_IN_K, config->selectedScalarK()); } } void EffectiveBandwidthSource::setupOutputs() { setOutputScalar(SCALAR_OUT_LIMIT, ""); setOutputScalar(SCALAR_OUT_SIGMA, ""); setOutputScalar(SCALAR_OUT_BANDWIDTH, ""); } bool EffectiveBandwidthSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::ScalarPtr inputScalarMin = _inputScalars[SCALAR_IN_MIN]; Kst::ScalarPtr inputScalarFreq = _inputScalars[SCALAR_IN_FREQ]; Kst::ScalarPtr inputScalarK = _inputScalars[SCALAR_IN_K]; Kst::ScalarPtr outputScalarLimit = _outputScalars[SCALAR_OUT_LIMIT]; Kst::ScalarPtr outputScalarSigma = _outputScalars[SCALAR_OUT_SIGMA]; Kst::ScalarPtr outputScalarBandwidth = _outputScalars[SCALAR_OUT_BANDWIDTH]; //Make sure there is at least 1 element in the input vector if (inputVectorX->length() < 1) { _errorString = tr("Error: Input Vector X invalid size"); return false; } // Make sure the input vectors match. if (inputVectorX->length() != inputVectorY->length()) { _errorString = tr("Error: Input Vector X and Input Vector Y are not the same length"); return false; } double minWhiteNoiseFreq, samplingFrequency, radiometerConstantK; minWhiteNoiseFreq = inputScalarMin->value(); samplingFrequency = inputScalarFreq->value(); radiometerConstantK = inputScalarK->value(); int minWhiteNoiseIndex; //fast calculation of index for minWhiteNoiseFreq int i_bot, i_top; i_bot = 0; i_top = inputVectorX->length() - 1; while (i_bot + 1 < i_top) { int i0 = (i_top + i_bot)/2; if (minWhiteNoiseFreq < inputVectorX->value()[i0]) { i_top = i0; } else { i_bot = i0; } } minWhiteNoiseIndex = i_top; //verify calculated indices. if ( !(minWhiteNoiseIndex>0) || !(minWhiteNoiseIndex<(inputVectorX->length()-1)) ) { _errorString = tr("Error: Calculated Indices invalid"); return false; } // calculate white noise limit double sumY, sumY2; sumY = sumY2 = 0; int i; double yi; for (i = minWhiteNoiseIndex; i < inputVectorX->length(); i++) { yi = inputVectorY->value()[i]; sumY += yi; sumY2 += pow(yi,2); } double ybar, ysigma; ybar = sumY/(inputVectorX->length() - minWhiteNoiseIndex); ysigma = sqrt((sumY2 - 2*ybar*sumY + pow(ybar,2)*(inputVectorX->length() - minWhiteNoiseIndex))/(inputVectorX->length() - minWhiteNoiseIndex)); // end calculate white noise limit double effectiveBandwidth = 2*samplingFrequency*pow(radiometerConstantK*inputVectorY->value()[0]/ysigma,2); // output fit data outputScalarLimit->setValue(ybar); outputScalarSigma->setValue(ysigma); outputScalarBandwidth->setValue(effectiveBandwidth); return true; } Kst::VectorPtr EffectiveBandwidthSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr EffectiveBandwidthSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::ScalarPtr EffectiveBandwidthSource::scalarMin() const { return _inputScalars[SCALAR_IN_MIN]; } Kst::ScalarPtr EffectiveBandwidthSource::scalarFreq() const { return _inputScalars[SCALAR_IN_FREQ]; } Kst::ScalarPtr EffectiveBandwidthSource::scalarK() const { return _inputScalars[SCALAR_IN_K]; } QStringList EffectiveBandwidthSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList EffectiveBandwidthSource::inputScalarList() const { QStringList scalars(SCALAR_IN_MIN); scalars += SCALAR_IN_FREQ; scalars += SCALAR_IN_K; return scalars; } QStringList EffectiveBandwidthSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList EffectiveBandwidthSource::outputVectorList() const { return QStringList( /*VECTOR_OUT*/ ); } QStringList EffectiveBandwidthSource::outputScalarList() const { QStringList scalars(SCALAR_OUT_LIMIT); scalars += SCALAR_OUT_SIGMA; scalars += SCALAR_OUT_BANDWIDTH; return scalars; } QStringList EffectiveBandwidthSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void EffectiveBandwidthSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString EffectiveBandwidthPlugin::pluginName() const { return tr("Effective Bandwidth"); } QString EffectiveBandwidthPlugin::pluginDescription() const { return tr("Calculates effective bandwidth from an amplitude spectrum."); } Kst::DataObject *EffectiveBandwidthPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigEffectiveBandwidthPlugin* config = static_cast(configWidget)) { EffectiveBandwidthSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_MIN, config->selectedScalarMin()); object->setInputScalar(SCALAR_IN_FREQ, config->selectedScalarFreq()); object->setInputScalar(SCALAR_IN_K, config->selectedScalarK()); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *EffectiveBandwidthPlugin::configWidget(QSettings *settingsObject) const { ConfigEffectiveBandwidthPlugin *widget = new ConfigEffectiveBandwidthPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, EffectiveBandwidthPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/effectivebandwidth/effectivebandwidth.pro0000644000175000017500000000030612277111530026120 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_effectivebandwidth) SOURCES += \ effectivebandwidth.cpp HEADERS += \ effectivebandwidth.h FORMS += effectivebandwidthconfig.ui Kst-2.0.8/src/plugins/dataobject/shift/0000755000175000017500000000000012362705136017050 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/shift/shift.h0000644000175000017500000000522012277111530020327 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SHIFTPLUGIN_H #define SHIFTPLUGIN_H #include #include #include class ShiftSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr scalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: ShiftSource(Kst::ObjectStore *store); ~ShiftSource(); friend class Kst::ObjectStore; }; class ShiftPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ShiftPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/shift/shift.pro0000644000175000017500000000022212277111530020675 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_shift) SOURCES += \ shift.cpp HEADERS += \ shift.h FORMS += shiftconfig.ui Kst-2.0.8/src/plugins/dataobject/shift/shift.cpp0000644000175000017500000002044512362701575020701 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* shift a vector by an integer number of samples */ #include "shift.h" #include "objectstore.h" #include "ui_shiftconfig.h" #include "math_kst.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "dX"; static const QString& VECTOR_OUT = "Shifted Vector"; class ConfigWidgetShiftPlugin : public Kst::DataObjectConfigWidget, public Ui_ShiftConfig { public: ConfigWidgetShiftPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_ShiftConfig() { _store = 0; setupUi(this); } ~ConfigWidgetShiftPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarShift->setObjectStore(store); _scalarShift->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarShift, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarShift->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarShift->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (ShiftSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->scalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Shift DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar Shift", _scalarShift->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Shift DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Scalar Shift").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalar = static_cast(object); if (scalar) { setSelectedScalar(scalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; ShiftSource::ShiftSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } ShiftSource::~ShiftSource() { } QString ShiftSource::_automaticDescriptiveName() const { return tr("Shift Plugin Object"); } QString ShiftSource::descriptionTip() const { QString tip; tip = tr("Shift: %1\n dX: %2\n", "Phase shift. dX is the amount of the shift").arg(Name()).arg(scalar()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void ShiftSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetShiftPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); } } void ShiftSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool ShiftSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; int delay = 0; /* Memory allocation */ outputVector->resize(inputVector->length(), false); delay = (int)inputScalar->value(); /* Protect against invalid inputs */ if (delay > inputVector->length()) { delay = inputVector->length(); } else if (delay < -inputVector->length()) { delay = -inputVector->length(); } /* First case: positive shift (forwards/right shift)*/ if (delay >= 0) { /* Pad beginning with zeros */ for (int i = 0; i < delay; i++) { outputVector->value()[i] = NAN; } /* Then, copy values with the right offset */ for (int i = delay; i < inputVector->length(); i++) { outputVector->value()[i] = inputVector->value()[i-delay]; } } /* Second case: negative shift (backwards/left shift)*/ else if (delay < 0) { delay = -delay; /* Easier to visualize :-) */ /* Copy values with the right offset */ for (int i = 0; i < inputVector->length()-delay; i++) { outputVector->value()[i] = inputVector->value()[i+delay]; } /* Pad end with zeros */ for (int i = inputVector->length()-delay; i < inputVector->length(); i++) { outputVector->value()[i] = NAN; } } return true; } Kst::VectorPtr ShiftSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr ShiftSource::scalar() const { return _inputScalars[SCALAR_IN]; } QStringList ShiftSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList ShiftSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList ShiftSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList ShiftSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList ShiftSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList ShiftSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void ShiftSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString ShiftPlugin::pluginName() const { return tr("Shift"); } QString ShiftPlugin::pluginDescription() const { return tr("Shifts (and truncates) a vector."); } Kst::DataObject *ShiftPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetShiftPlugin* config = static_cast(configWidget)) { ShiftSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ShiftPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetShiftPlugin *widget = new ConfigWidgetShiftPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, ShiftPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/shift/shiftconfig.ui0000644000175000017500000000443112277111530021706 0ustar synthsynth ShiftConfig 0 0 490 62 400 0 0 0 Input Vector Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Shift value (# points, negative allowed) false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/shift/kstplugin_shift.desktop0000644000175000017500000000345012362705136023662 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=shift X-Kst-Plugin-Author=The University of Toronto Name=Shift Data Object Plugin Name[ca]=Connector d'objecte de dades de decalatge Name[ca@valencia]=Connector d'objecte de dades de decalatge Name[de]=Verschiebungs-Datenobjekt-Modul Name[fr]=Module DataObject de modulation Name[it]=Estensione oggetto dati di spostamento Name[nl]=Shift Data Object Plugin Name[pl]=Wtyczka obiektu danych przesunięcia Name[pt]='Plugin' de Objectos de Dados de Deslocamento Name[pt_BR]=Plugin de objeto de dados de deslocamento Name[sv]=Skiftdataobjekt-insticksprogram Name[uk]=Додаток для роботи з об’єктами даних щодо зсуву фази Name[x-test]=xxShift Data Object Pluginxx Comment=Implements a Shift Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de decalatge pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de decalatge pel Kst. Comment[de]=Implementiert ein Verschiebungs-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de modulation pour Kst. Comment[it]=Implementa un'estensione oggetto dati di spostamento per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor shift (verschuiven) Comment[pl]=Implementuje wtyczkę obiektu danych przesunięcia dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de deslocamento para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de deslocamento para o Kst. Comment[sv]=Implementerar ett Kst skiftdataobjekt-insticksprogram. Comment[uk]=Реалізує додаток для роботи з об’єктами даних щодо зсуву фази у Kst. Comment[x-test]=xxImplements a Shift Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/chop/0000755000175000017500000000000012362705136016664 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/chop/chop.h0000644000175000017500000000507212277111530017764 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CHOPPLUGIN_H #define CHOPPLUGIN_H #include #include #include class ChopSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: ChopSource(Kst::ObjectStore *store); ~ChopSource(); friend class Kst::ObjectStore; }; class ChopPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ChopPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/chop/kstplugin_chop.desktop0000644000175000017500000000337612362705136023321 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=chop X-Kst-Plugin-Author=The University of Toronto Name=Chop Data Object Plugin Name[ca]=Connector d'objecte de dades de retall Name[ca@valencia]=Connector d'objecte de dades de retall Name[de]=Teilungs-Datenobjekt-Modul Name[fr]=Module DataObject de découpage (Chop) Name[it]=Estensione oggetto dati di ritaglio Name[nl]=Chop Data Object Plugin Name[pl]=Wtyczka obiektu danych Chop Name[pt]='Plugin' de Objecto de Dados com Recorte Name[pt_BR]=Plugin de objeto de dados com recorte Name[sv]=Dataobjekt-insticksprogram för uppdelning Name[uk]=Додаток для роботи з об’єктами розрізаних даних Name[x-test]=xxChop Data Object Pluginxx Comment=Implements a Chop Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de retall pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de retall pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul zur Aufteilung für Kst. Comment[fr]=Implémente un module DataObject de découpage (Chop) pour Kst. Comment[it]=Implementa un'estensione oggetto dati di ritaglio per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor in in stukjes hakken. Comment[pl]=Implementuje wtyczkę obiektu danych Chop dla Kst. Comment[pt]=Implementa um 'plugin' de objecto de dados com recorte para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados com recorte para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för uppdelning. Comment[uk]=Реалізує додаток для роботи з об’єктами розрізаних даних у Kst. Comment[x-test]=xxImplements a Chop Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/chop/chop.pro0000644000175000017500000000021612277111530020330 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_chop) SOURCES += \ chop.cpp HEADERS += \ chop.h FORMS += chopconfig.ui Kst-2.0.8/src/plugins/dataobject/chop/chop.cpp0000644000175000017500000001622312362701575020330 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* FIXME: rename to something more clear */ /* differences even samples from odd samples. Used for LFI, whose Dicky-switch produces even samples looking at a cold load, and odd samples looking at the sky */ #include "chop.h" #include "objectstore.h" #include "ui_chopconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& VECTOR_OUT_ODD = "Odd Vector"; static const QString& VECTOR_OUT_EVEN = "Even Vector"; static const QString& VECTOR_OUT_DIFFERENCE = "Difference Vector"; static const QString& VECTOR_OUT_INDEX = "Index Vector"; class ConfigWidgetChopPlugin : public Kst::DataObjectConfigWidget, public Ui_ChopConfig { public: ConfigWidgetChopPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_ChopConfig() { _store = 0; setupUi(this); } ~ConfigWidgetChopPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (ChopSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Chop DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Chop DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; ChopSource::ChopSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } ChopSource::~ChopSource() { } QString ChopSource::_automaticDescriptiveName() const { return tr("Chop Plugin Object"); } void ChopSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetChopPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); } } void ChopSource::setupOutputs() { setOutputVector(VECTOR_OUT_ODD, ""); setOutputVector(VECTOR_OUT_EVEN, ""); setOutputVector(VECTOR_OUT_DIFFERENCE, ""); setOutputVector(VECTOR_OUT_INDEX, ""); } bool ChopSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::VectorPtr outputVectorOdd = _outputVectors[VECTOR_OUT_ODD]; Kst::VectorPtr outputVectorEven = _outputVectors[VECTOR_OUT_EVEN]; Kst::VectorPtr outputVectorDifference = _outputVectors[VECTOR_OUT_DIFFERENCE]; Kst::VectorPtr outputVectorIndex = _outputVectors[VECTOR_OUT_INDEX]; //Make sure there is at least 1 element in the input vector if (inputVector->length() < 1) { _errorString = tr("Error: Input Vector invalid size"); return false; } int iLength = inputVector->length(); int iLengthNew = (int)ceil(iLength / 2.0); outputVectorOdd->resize(iLengthNew, false); outputVectorEven->resize(iLengthNew, false); outputVectorDifference->resize(iLengthNew, false); outputVectorIndex->resize(iLengthNew, false); for (int i = 0; i < iLength; i+=2) { outputVectorOdd->value()[i/2] = inputVector->value()[i]; outputVectorEven->value()[i/2] = inputVector->value()[i+1]; outputVectorDifference->value()[i/2] = inputVector->value()[i] - inputVector->value()[i+1]; outputVectorIndex->value()[i/2] = i/2; } return true; } Kst::VectorPtr ChopSource::vector() const { return _inputVectors[VECTOR_IN]; } QStringList ChopSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList ChopSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList ChopSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList ChopSource::outputVectorList() const { QStringList vectorList(VECTOR_OUT_ODD); vectorList += VECTOR_OUT_EVEN; vectorList += VECTOR_OUT_DIFFERENCE; vectorList += VECTOR_OUT_INDEX; return vectorList; } QStringList ChopSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList ChopSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void ChopSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString ChopPlugin::pluginName() const { return tr("Chop"); } QString ChopPlugin::pluginDescription() const { return tr("Chops a given data set into odd, even, difference, and Index data sets."); } Kst::DataObject *ChopPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetChopPlugin* config = static_cast(configWidget)) { ChopSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ChopPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetChopPlugin *widget = new ConfigWidgetChopPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ChopPlugin, ChopPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/chop/chopconfig.ui0000644000175000017500000000302712277111530021336 0ustar synthsynth ChopConfig 0 0 423 43 400 0 0 0 Input Vector false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/noiseaddition/0000755000175000017500000000000012362705136020564 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui0000644000175000017500000000453112277111530025137 0ustar synthsynth NoiseAdditionConfig 0 0 419 97 400 0 0 0 Input Vector false 0 0 0 0 Sigma false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/noiseaddition/kstplugin_noiseaddition.desktop0000644000175000017500000000377712362705136027126 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=noiseaddition X-Kst-Plugin-Author=The University of Toronto Name=Noise Addition Data Object Plugin Name[ca]=Connector d'objecte de dades d'addició de soroll Name[ca@valencia]=Connector d'objecte de dades d'addició de soroll Name[de]=Datenobjekt-Modul für das Hinzufügen von Rauschen Name[fr]=Module DataObject d'ajout de bruit Name[it]=Estensione oggetto dati per l'aggiunta di rumore Name[nl]=Plugin gegevensobject voor toevoegen van ruis Name[pl]=Wtyczka obiektu danych dodawania szumu Name[pt]='Plugin' de Objectos de Dados de Adição de Ruído Name[pt_BR]=Plugin de objeto de dado de adição de ruído Name[sv]=Dataobjekt-insticksprogram för brustillägg Name[uk]=Додаток для роботи з об’єктами даних додавання шуму Name[x-test]=xxNoise Addition Data Object Pluginxx Comment=Implements a Noise Addition Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'addició de soroll pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'addició de soroll pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für das Hinzufügen von Rauschen für Kst. Comment[fr]=Implémente un module DataObject d'ajout de bruit pour Kst. Comment[it]=Implementa un'estensione oggetto dati per l'aggiunta di rumore per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor toevoeging van ruis. Comment[pl]=Implementuje wtyczkę obiektu danych dodawania szumu dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de adição de ruído para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de adição de ruído para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för brustillägg. Comment[uk]=Реалізує додаток для роботи з об’єктами даних додавання шуму у Kst. Comment[x-test]=xxImplements a Noise Addition Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/noiseaddition/noiseaddition.pro0000644000175000017500000000031212277111530024125 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_noiseaddition) LIBS += -l$$kstlib(gsl) SOURCES += \ noiseaddition.cpp HEADERS += \ noiseaddition.h FORMS += noiseadditionconfig.ui Kst-2.0.8/src/plugins/dataobject/noiseaddition/noiseaddition.cpp0000644000175000017500000001741612362701575024135 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "noiseaddition.h" #include "objectstore.h" #include "ui_noiseadditionconfig.h" #include #include static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scalar In"; static const QString& VECTOR_OUT = "Vector Out"; class ConfigNoiseAdditionPlugin : public Kst::DataObjectConfigWidget, public Ui_NoiseAdditionConfig { public: ConfigNoiseAdditionPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_NoiseAdditionConfig() { _store = 0; setupUi(this); } ~ConfigNoiseAdditionPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarSigma->setObjectStore(store); _scalarSigma->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarSigma, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarSigma->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarSigma->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (NoiseAdditionSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->scalarSigma()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Noise Addition DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar Sigma", _scalarSigma->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Noise Addition DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Scalar Sigma").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalar = static_cast(object); if (scalar) { setSelectedScalar(scalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; NoiseAdditionSource::NoiseAdditionSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } NoiseAdditionSource::~NoiseAdditionSource() { } QString NoiseAdditionSource::_automaticDescriptiveName() const { return tr("Noise Addition Plugin Object"); } void NoiseAdditionSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigNoiseAdditionPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); } } void NoiseAdditionSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool NoiseAdditionSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; //Make sure there is at least 1 element in the input vector if (inputVector->length() < 1) { _errorString = tr("Error: Input Vector invalid size"); return false; } const gsl_rng_type* pGeneratorType; gsl_rng* pRandomNumberGenerator; double* pResult[1]; int iRetVal = false; int iLength = inputVector->length(); outputVector->resize(iLength, false); pResult[0] = outputVector->value(); pGeneratorType = gsl_rng_default; pRandomNumberGenerator = gsl_rng_alloc( pGeneratorType ); if (pRandomNumberGenerator != NULL) { if (pResult[0] != NULL) { for (int i=0; ivalue()[i] = inputVector->value()[i] + gsl_ran_gaussian( pRandomNumberGenerator, inputScalar->value() ); } iRetVal = true; } gsl_rng_free( pRandomNumberGenerator ); } return iRetVal; } Kst::VectorPtr NoiseAdditionSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr NoiseAdditionSource::scalarSigma() const { return _inputScalars[SCALAR_IN]; } QStringList NoiseAdditionSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList NoiseAdditionSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList NoiseAdditionSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList NoiseAdditionSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList NoiseAdditionSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList NoiseAdditionSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void NoiseAdditionSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString NoiseAdditionPlugin::pluginName() const { return tr("Noise Addition"); } QString NoiseAdditionPlugin::pluginDescription() const { return tr("Adds Gaussian noise to a set of data, of a specified standard deviation."); } Kst::DataObject *NoiseAdditionPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigNoiseAdditionPlugin* config = static_cast(configWidget)) { NoiseAdditionSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *NoiseAdditionPlugin::configWidget(QSettings *settingsObject) const { ConfigNoiseAdditionPlugin *widget = new ConfigNoiseAdditionPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, NoiseAdditionPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/noiseaddition/noiseaddition.h0000644000175000017500000000524112277111530023562 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef NOISEADDITIONPLUGIN_H #define NOISEADDITIONPLUGIN_H #include #include #include class NoiseAdditionSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr scalarSigma() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: NoiseAdditionSource(Kst::ObjectStore *store); ~NoiseAdditionSource(); friend class Kst::ObjectStore; }; class NoiseAdditionPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~NoiseAdditionPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/lockin/0000755000175000017500000000000012362705136017212 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/lockin/lockin.cpp0000644000175000017500000002562512362701575021212 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * sbenton@phsyics.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "lockin.h" #include "objectstore.h" #include "ui_lockinconfig.h" #include "iirfilter.h" #include #include using std::vector; typedef std::complex complex; //TODO maybe use Qt vector types, and kst filters //TODO allow reference waveforms other than square wave //TODO these parameters, and filter cutoffs, and the guess period should be made commandable const double f_samp = 4.0E6/384.0/104.0; //sample frequency const int DELAY = 0; static const QString& PLUGIN_NAME = "Lock-In DataObject Plugin"; static const QString& IN_INPUT_VECTOR = "Input Vector"; static const QString& IN_REF_VECTOR = "Reference Vector"; static const QString& OUT_REF_VECTOR_NORM = "Normalized Reference Vector"; static const QString& OUT_LOCKIN_RESULT = "Lock-In Result"; class ConfigLockInPlugin : public Kst::DataObjectConfigWidget, public Ui_LockInConfig { public: ConfigLockInPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_LockInConfig() { _store = 0; setupUi(this); } ~ConfigLockInPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _inputVector->setObjectStore(store); _refVector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_inputVector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_refVector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedInputVector() { return _inputVector->selectedVector(); }; void setSelectedInputVector(Kst::VectorPtr vector) { return _inputVector->setSelectedVector(vector); }; Kst::VectorPtr selectedRefVector() { return _refVector->selectedVector(); }; void setSelectedRefVector(Kst::VectorPtr vector) { return _refVector->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (LockInSource* source = static_cast(dataObject)) { setSelectedInputVector(source->inputVector()); setSelectedRefVector(source->refVector()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup(PLUGIN_NAME); _cfg->setValue(IN_INPUT_VECTOR, _inputVector->selectedVector()->Name()); _cfg->setValue(IN_REF_VECTOR, _refVector->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup(PLUGIN_NAME); QString vectorName = _cfg->value(IN_INPUT_VECTOR).toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedInputVector(vector); } vectorName = _cfg->value(IN_REF_VECTOR).toString(); Kst::Object* object2 = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object2); if (vector2) { setSelectedRefVector(vector2); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; LockInSource::LockInSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } LockInSource::~LockInSource() { } QString LockInSource::_automaticDescriptiveName() const { return tr("Lock-In DataObject Plugin"); } void LockInSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigLockInPlugin* config = static_cast(configWidget)) { setInputVector(IN_INPUT_VECTOR, config->selectedInputVector()); setInputVector(IN_REF_VECTOR, config->selectedRefVector()); } } void LockInSource::setupOutputs() { setOutputVector(OUT_REF_VECTOR_NORM, ""); setOutputVector(OUT_LOCKIN_RESULT, ""); } /* REALLY BAD CODE * use two copies of this function, to have independent static variables */ static complex f_pll(double ref) { static double period = 20.0; static double phase = 0.0; static double T = 0.0; static int ref_edge = 0; static int pll_edge = 0; static double ph = 0.0; static double dph = 0.0; static BesselHP1 fref(0.0125/f_samp); static BesselLP1 fperiod(0.15/f_samp); static BesselLP1 fphase(0.15/f_samp); double ref_ = fref(ref); ph += dph; T += 1.0; double pll_ref = cos(ph); if(ref_edge == 0 && ref_ >= 0.0) { period = fperiod(T); ref_edge = 1; dph = (2.0*M_PI)/period; T = 0.0; } else if(ref_edge == 1 && ref_ < 0.0 && T > 1.0) { ref_edge = 0; } if(pll_edge == 0 && (pll_ref >= 0.0)) { phase = fphase(T*dph); pll_edge = 1; } else if(pll_edge == 1 && (pll_ref < 0.0)) { pll_edge = 0; } return complex( ((cos(ph+phase) > 0.0) ? 1 : -1), ((sin(ph+phase) > 0.0) ? 1 : -1) ); } static complex b_pll(double ref) { static double period = 20.0; static double phase = 0.0; static double T = 0.0; static int ref_edge = 0; static int pll_edge = 0; static double ph = 0.0; static double dph = 0.0; static BesselHP1 fref(0.0125/f_samp); static BesselLP1 fperiod(0.15/f_samp); static BesselLP1 fphase(0.15/f_samp); double ref_ = fref(ref); ph += dph; T += 1.0; double pll_ref = cos(ph); if(ref_edge == 0 && ref_ >= 0.0) { period = fperiod(T); ref_edge = 1; dph = (2.0*M_PI)/period; T = 0.0; } else if(ref_edge == 1 && ref_ < 0.0 && T > 1.0) { ref_edge = 0; } if(pll_edge == 0 && (pll_ref >= 0.0)) { phase = fphase(T*dph); pll_edge = 1; } else if(pll_edge == 1 && (pll_ref < 0.0)) { pll_edge = 0; } return complex( ((cos(ph+phase) > 0.0) ? 1 : -1), ((sin(ph+phase) > 0.0) ? 1 : -1) ); } bool LockInSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[IN_INPUT_VECTOR]; Kst::VectorPtr refVector = _inputVectors[IN_REF_VECTOR]; Kst::VectorPtr normRefVector = _outputVectors[OUT_REF_VECTOR_NORM]; Kst::VectorPtr lockinResult = _outputVectors[OUT_LOCKIN_RESULT]; if (inputVector->length() <= 0 || refVector->length() <= 0 || inputVector->length() != refVector->length()) { _errorString = tr("Error: Input Vectors - invalid size"); return false; } int iLength = inputVector->length(); normRefVector->resize(iLength, false); lockinResult->resize(iLength, false); double* pdInput = inputVector->value(); double* pdRef = refVector->value(); double* pdNormRef = normRefVector->value(); double* pdResult = lockinResult->value(); /* to remove initial settling, evaluate the result separately in forward and backward direction */ BesselHP1 f_filt_d(0.15/f_samp); BesselLP4 f_filt_li(0.39/f_samp); BesselHP1 b_filt_d(0.15/f_samp); BesselLP4 b_filt_li(0.39/f_samp); for (int i=0; i= iLength/2) { if (i >= (iLength*3)/4) { //for first and last quarter of the domain, use backward and forward result pdResult[i] = f_result; pdResult[iLength-i-1] = b_result; } else { //for middle half, use weight that changes linearly between the extremes double weight = 2.0*double(i)/double(iLength) - 0.5; pdResult[i] = weight*f_result + (1.0-weight)*b_result; pdResult[iLength-i-1] = weight*b_result + (1.0-weight)*f_result; } //for the reference, just split the result at the middle pdNormRef[i] = f_pll_ref.real(); pdNormRef[iLength-i-1] = b_pll_ref.real(); } } return true; } Kst::VectorPtr LockInSource::inputVector() const { return _inputVectors[IN_INPUT_VECTOR]; } Kst::VectorPtr LockInSource::refVector() const { return _inputVectors[IN_REF_VECTOR]; } QStringList LockInSource::inputVectorList() const { QStringList vectors(IN_INPUT_VECTOR); vectors += IN_REF_VECTOR; return vectors; } QStringList LockInSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList LockInSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList LockInSource::outputVectorList() const { QStringList vectors(OUT_LOCKIN_RESULT); vectors += OUT_REF_VECTOR_NORM; return vectors; } QStringList LockInSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList LockInSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void LockInSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString LockInPlugin::pluginName() const { return tr("Lock-In"); } QString LockInPlugin::pluginDescription() const { return tr("Lock-In amplifies Input using a Reference carrier wave"); } Kst::DataObject *LockInPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigLockInPlugin* config = static_cast(configWidget)) { LockInSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(IN_INPUT_VECTOR, config->selectedInputVector()); object->setInputVector(IN_REF_VECTOR, config->selectedRefVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *LockInPlugin::configWidget(QSettings *settingsObject) const { ConfigLockInPlugin *widget = new ConfigLockInPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_LockInPlugin, LockInPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/lockin/lockin.h0000644000175000017500000000473112277111530020641 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * sbenton@physics.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LOCKINPLUGIN_H #define LOCKINPLUGIN_H #include #include #include class LockInSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr inputVector() const; Kst::VectorPtr refVector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: LockInSource(Kst::ObjectStore *store); ~LockInSource(); friend class Kst::ObjectStore; }; class LockInPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~LockInPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/lockin/kstplugin_lockin.desktop0000644000175000017500000000435412362705136024172 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=lockin X-Kst-Plugin-Author=The University of Toronto Name=Lock-In Amplification Data Object Plugin Name[ca]=Connector d'objecte d'amplificació bloquejada Name[ca@valencia]=Connector d'objecte d'amplificació bloquejada Name[de]=Datenobjekt-Modul für Lock-In-Verstärkung Name[fr]=Module DataObject de détection synchrone Name[it]=Estensione oggetto dati di amplificazione lock-in Name[nl]=Lock-In Amplification Data Object Plugin Name[pl]=Wtyczka obiektu danych woltomierza wektorowego Name[pt]='Plugin' de Objectos de Dados de Amplificação Bloqueada Name[pt_BR]=Plugin de objeto de dados de amplificação bloqueada Name[sv]=Inlåsande förstärkningsdataobjekt-insticksprogram Name[uk]=Додаток для роботи з об’єктами замкнутого підсилення даних Name[x-test]=xxLock-In Amplification Data Object Pluginxx Comment=Lock-In amplification of channel to reference Data Object Plugin for Kst. Comment[ca]=Connector d'objecte de dades d'amplificació de canal bloquejada a referència pel Kst. Comment[ca@valencia]=Connector d'objecte de dades d'amplificació de canal bloquejada a referència pel Kst. Comment[de]=Datenobjekt-Modul für Lock-In-Verstärkung von Mess- zu Referenzsignal für Kst. Comment[fr]=Module DataObject de détection synchrone de canal vers référence pour Kst. Comment[it]=Amplificazione lock-in del canale per l'estensione oggetto dati di riferimento per Kst. Comment[nl]=Gekoppelde kanaalversterking voor referentie gegevensobject in Kst. Comment[pl]=Wtyczka obiektu danych wzmocnienia woltomierza wektorowego kanału do odniesienia dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com amplificação bloqueada para o Kst. Comment[pt_BR]=Amplificação bloqueada do canal de referência do plugin de objeto de dados para o Kst. Comment[sv]=Dataobjekt-insticksprogram med inlåsande förstärkning av kanal med referens för Kst Comment[uk]=Додаток для роботи з об’єктами замкнутого підсилення даних каналу щодо еталона для Kst. Comment[x-test]=xxLock-In amplification of channel to reference Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/lockin/lockinconfig.ui0000644000175000017500000000452112277111530022212 0ustar synthsynth LockInConfig 0 0 428 40 400 0 0 0 Input Vector Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Reference Vector false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/lockin/lockin.pro0000644000175000017500000000022612277111530021205 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_lockin) SOURCES += lockin.cpp HEADERS += lockin.h iirfilter.h FORMS += lockinconfig.ui Kst-2.0.8/src/plugins/dataobject/lockin/iirfilter.h0000644000175000017500000001657612277111530021365 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * sbenton@phsyics.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #ifndef IIRFILTER_H #define IIRFILTER_H using std::deque; using std::vector; typedef std::complex complex; /* * allows for definition of general recursive/IIR filters * * Probably doesn't need to be a template, but I was experimenting * now you can filter a series of vectors! (or rather float/long double/complex) * */ template class IIRFilter { public: IIRFilter(unsigned int order); //do fitlering by calling your instance with most recent input T operator() (T x); //clear the filter history void clear(); //evaluate transfer function at complex point z complex transfer(complex z); //function generates data stream containing impulse and frequency response //clears filter both before and after int FilterResponse(const char* out, double max_f=0.5, unsigned int n=100); protected: //to be used in derived class constructors void setCoefficients(vector na, vector nb); private: deque x0; //last filter input deque y0; //last filter output vector a; //coefficients to multiply y0 vector b; //coefficients to multiply x, x0 unsigned int order; //order of the filter }; /* * A few sample filter types. Analytic forms for a few low-order Bessel filters * * TODO: it would be great to use numerically designed filters * */ //1st order bessel low-pass, with knee frequency f (in sample rate units) template class BesselLP1 : public IIRFilter { public: BesselLP1(double f); }; //1st order bessel high-pass, with knee frequency f (in sample rate units) template class BesselHP1 : public IIRFilter { public: BesselHP1(double f); }; //4th order bessel low-pass, with knee frequency f (in sample rate units) template class BesselLP4 : public IIRFilter { public: BesselLP4(double f); }; /******************************************************************************* * IMPLEMENTATION * g++ doesn't support 'export' for template implementations in another file * so, all the implementations are here ******************************************************************************/ #include #include #include #include using std::cerr; using std::endl; template IIRFilter::IIRFilter(unsigned int order) { this->order = order; x0.resize(order, 0.0); y0.resize(order, 0.0); a.resize(order, 0.0); b.resize(order+1, 0.0); //includes coefficient for new inupt x } template T IIRFilter::operator() (T x) { T y = b[0]*x; //cerr << "y = (" << b[0] << ")*x[n]" << endl; for (unsigned int i=0; i void IIRFilter::clear() { x0.resize(order, T()); y0.resize(order, T()); } template complex IIRFilter::transfer(complex z) { complex numer = pow(z,4)*b[0]; complex denom = pow(z,4); for (unsigned int i=0; i int IIRFilter::FilterResponse(const char* out, double max_f, unsigned int n) { std::ofstream oo(out); if (!oo) { cerr << "Couldn't open FilterResponse output file" << endl; return 1; } this->clear(); oo << "INDEX\timpulse\tfreq\tgain\tphase" << endl; for (unsigned int i=0; iclear(); return 0; } template void IIRFilter::setCoefficients(vector na, vector nb) { if (na.size() != order || nb.size() != order+1) { cerr << "Invalid size of coefficient vector\n" << endl; return; } a = na; b = nb; } //The filter forms below were solved analytically using a bilinear transform //bessel scale factors //convert normalization from unit delay at f=0 to 3dB attenutation at 1rad/s const double norm_bessel_O1 = 1.0; const double norm_bessel_O2 = 1.36165412871613; const double norm_bessel_O3 = 1.75567236868121; const double norm_bessel_O4 = 2.11391767490422; const double norm_bessel_O5 = 2.42741070215263; const double norm_bessel_O6 = 2.70339506120292; const double norm_bessel_O7 = 2.95172214703872; const double norm_bessel_O8 = 3.17961723751065; const double norm_bessel_O9 = 3.39169313891166; const double norm_bessel_O10 = 3.59098059456916; template BesselLP1::BesselLP1(double f) : IIRFilter(1) { vector a(1), b(2); double alpha = M_PI*f/norm_bessel_O1; alpha = tan(alpha); //pre-warp a[0] = (alpha-1.0)/(1.0+alpha); b[0] = alpha/(1.0+alpha); b[1] = alpha/(1.0+alpha); this->setCoefficients(a, b); } template BesselHP1::BesselHP1(double f) : IIRFilter(1) { vector a(1), b(2); double alpha = M_PI*f/norm_bessel_O1; alpha = tan(alpha); //pre-warp a[0] = (alpha-1.0)/(1.0+alpha); b[0] = 1.0/(1.0+alpha); b[1] = -1.0/(1.0+alpha); this->setCoefficients(a, b); } template BesselLP4::BesselLP4(double f) : IIRFilter(4) { vector a(4), b(5); double alpha = M_PI*f/norm_bessel_O4; alpha = tan(alpha); //pre-warp double denom = (1.0 + 1.0/alpha + 45.0/105.0/pow(alpha,2) + 10.0/105.0/pow(alpha,3) + 1.0/105.0/pow(alpha,4)); a[0] = (4.0 + 2.0/alpha - 20.0/105.0/pow(alpha,3) - 4.0/105.0/pow(alpha,4))/denom; a[1] = (6.0 - 90.0/105.0/pow(alpha,2) + 6.0/105.0/pow(alpha,4))/denom; a[2] = (4.0 - 2.0/alpha + 20.0/105.0/pow(alpha,3) - 4.0/105.0/pow(alpha,4))/denom; a[3] = (1.0 - 1.0/alpha + 45.0/105.0/pow(alpha,2) - 10.0/105.0/pow(alpha,3) + 1.0/105.0/pow(alpha,4))/denom; b[0] = 1.0/denom; b[1] = 4.0/denom; b[2] = 6.0/denom; b[3] = 4.0/denom; b[4] = 1.0/denom; /* cerr << "y = (" << b[0] << ")*x[n]" << endl; for (unsigned int i=0; i<4; i++) { cerr << " + (" << b[i+1] << ")*x[n-" << i+1 << "]"; cerr << " - (" << a[i] << ")*y[n-" << i+1 << "]" << endl; } */ this->setCoefficients(a, b); } #endif Kst-2.0.8/src/plugins/dataobject/phase/0000755000175000017500000000000012362705136017033 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/phase/phase.pro0000644000175000017500000000022212277111530020643 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_phase) SOURCES += \ phase.cpp HEADERS += \ phase.h FORMS += phaseconfig.ui Kst-2.0.8/src/plugins/dataobject/phase/phase.h0000644000175000017500000000547512277111530020311 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PHASEPLUGIN_H #define PHASEPLUGIN_H #include #include #include class PhaseSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorTime() const; Kst::VectorPtr vectorData() const; Kst::ScalarPtr scalarPeriod() const; Kst::ScalarPtr scalarZeroPhase() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: PhaseSource(Kst::ObjectStore *store); ~PhaseSource(); private: void swap(double* pData[], int iOne, int iTwo); void quicksort(double* pData[], int iLeft, int iRight); friend class Kst::ObjectStore; }; class PhasePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~PhasePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/phase/phaseconfig.ui0000644000175000017500000000746412277111530021665 0ustar synthsynth PhaseConfig 0 0 430 87 400 0 0 0 Input Vector Time false 0 0 0 0 Input Vector Data Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Period Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Zero Phase Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/phase/kstplugin_phase.desktop0000644000175000017500000000323012362705136023624 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=phase X-Kst-Plugin-Author=The University of Toronto Name=Phase Data Object Plugin Name[ca]=Connector d'objecte de dades de fase Name[ca@valencia]=Connector d'objecte de dades de fase Name[de]=Phasen-Datenobjekt-Modul Name[fr]=Module DataObject de phase Name[it]=Estensione oggetto dati di fase Name[nl]=Phase Data Object Plugin Name[pl]=Wtyczka obiektu danych fazy Name[pt]='Plugin' de Objectos de Dados de Fase Name[pt_BR]=Plugin de objeto de dados de fase Name[sv]=Fasdataobjekt-insticksprogram Name[uk]=Додаток для роботи з об’єктами фазових даних Name[x-test]=xxPhase Data Object Pluginxx Comment=Implements a Phase Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de fase pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de fase pel Kst. Comment[de]=Implementiert ein Phasen-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de phase pour Kst. Comment[it]=Implementa un'estensione oggetto dati di fase per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor fase. Comment[pl]=Implementuje wtyczkę obiektu danych fazy dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de ajuste de fase para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de fase para o Kst. Comment[sv]=Implementerar ett Kst fasdataobjekt-insticksprogram. Comment[uk]=Реалізує додаток для роботи з об’єктами фазових даних у Kst. Comment[x-test]=xxImplements a Phase Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/phase/phase.cpp0000644000175000017500000002716612362701575020656 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* FIXME: figure out what this plugin is supposed to do, and comment accordingly. */ #include "phase.h" #include "objectstore.h" #include "ui_phaseconfig.h" static const QString& VECTOR_IN_TIME = "Vector In Time"; static const QString& VECTOR_IN_DATA = "Vector In Data"; static const QString& SCALAR_IN_PERIOD = "Period"; static const QString& SCALAR_IN_ZEROPHASE = "Zero Phase"; static const QString& VECTOR_OUT_PHASE = "Phase"; static const QString& VECTOR_OUT_DATA = "Data Out"; class ConfigPhasePlugin : public Kst::DataObjectConfigWidget, public Ui_PhaseConfig { public: ConfigPhasePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_PhaseConfig() { _store = 0; setupUi(this); } ~ConfigPhasePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorTime->setObjectStore(store); _vectorData->setObjectStore(store); _scalarPeriod->setObjectStore(store); _scalarZeroPhase->setObjectStore(store); _scalarPeriod->setDefaultValue(0); _scalarZeroPhase->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorTime, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorData, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarPeriod, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarZeroPhase, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorTime() { return _vectorTime->selectedVector(); }; void setSelectedVectorTime(Kst::VectorPtr vector) { return _vectorTime->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorData() { return _vectorData->selectedVector(); }; void setSelectedVectorData(Kst::VectorPtr vector) { return _vectorData->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarPeriod() { return _scalarPeriod->selectedScalar(); }; void setSelectedScalarPeriod(Kst::ScalarPtr scalar) { return _scalarPeriod->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarZeroPhase() { return _scalarZeroPhase->selectedScalar(); }; void setSelectedScalarZeroPhase(Kst::ScalarPtr scalar) { return _scalarZeroPhase->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (PhaseSource* source = static_cast(dataObject)) { setSelectedVectorTime(source->vectorTime()); setSelectedVectorData(source->vectorData()); setSelectedScalarPeriod(source->scalarPeriod()); setSelectedScalarZeroPhase(source->scalarZeroPhase()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Phase DataObject Plugin"); _cfg->setValue("Input Vector Time", _vectorTime->selectedVector()->Name()); _cfg->setValue("Input Vector Data", _vectorData->selectedVector()->Name()); _cfg->setValue("Input Scalar Period", _scalarPeriod->selectedScalar()->Name()); _cfg->setValue("Input Scalar Zero Phase", _scalarZeroPhase->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Phase DataObject Plugin"); QString vectorName = _cfg->value("Input Vector Time").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorTime = static_cast(object); if (vectorTime) { setSelectedVectorTime(vectorTime); } vectorName = _cfg->value("Input Vector Data").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorData = static_cast(object); if (vectorData) { setSelectedVectorData(vectorData); } QString scalarName = _cfg->value("Input Scalar Period").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarPeriod = static_cast(object); if (scalarPeriod) { setSelectedScalarPeriod(scalarPeriod); } scalarName = _cfg->value("Input Scalar Zero Phase").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarZeroPhase = static_cast(object); if (scalarZeroPhase) { setSelectedScalarZeroPhase(scalarZeroPhase); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; PhaseSource::PhaseSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } PhaseSource::~PhaseSource() { } QString PhaseSource::_automaticDescriptiveName() const { return tr("Phase Plugin Object"); } void PhaseSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigPhasePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_TIME, config->selectedVectorTime()); setInputVector(VECTOR_IN_DATA, config->selectedVectorData()); setInputScalar(SCALAR_IN_PERIOD, config->selectedScalarPeriod()); setInputScalar(SCALAR_IN_ZEROPHASE, config->selectedScalarZeroPhase()); } } void PhaseSource::setupOutputs() { setOutputVector(VECTOR_OUT_PHASE, ""); setOutputVector(VECTOR_OUT_DATA, ""); } bool PhaseSource::algorithm() { Kst::VectorPtr inputVectorTime = _inputVectors[VECTOR_IN_TIME]; Kst::VectorPtr inputVectorData = _inputVectors[VECTOR_IN_DATA]; Kst::ScalarPtr inputScalarPeriod = _inputScalars[SCALAR_IN_PERIOD]; Kst::ScalarPtr inputScalarZeroPhase = _inputScalars[SCALAR_IN_ZEROPHASE]; Kst::VectorPtr outputVectorPhase = _outputVectors[VECTOR_OUT_PHASE]; Kst::VectorPtr outputVectorDataOut = _outputVectors[VECTOR_OUT_DATA]; double* pResult[2]; double dPhasePeriod = inputScalarPeriod->value(); double dPhaseZero = inputScalarZeroPhase->value(); int iLength; bool bReturn = false; if (dPhasePeriod <= 0.0) { _errorString = tr("Error: Input Scalar Phase must be greater than zero."); return false; } if (inputVectorTime->length() != inputVectorData->length()) { _errorString = tr("Error: Input Vector lengths do not match."); return false; } iLength = inputVectorTime->length(); outputVectorPhase->resize(iLength, true); pResult[0] = outputVectorPhase->value(); outputVectorDataOut->resize(iLength, true); pResult[1] = outputVectorDataOut->value(); if (pResult[0] != NULL && pResult[1] != NULL) { for (int i = 0; i < outputVectorPhase->length(); ++i) { outputVectorPhase->value()[i] = pResult[0][i]; } for (int i = 0; i < outputVectorDataOut->length(); ++i) { outputVectorDataOut->value()[i] = pResult[1][i]; } /* determine the outputVectorPhase... */ for (int i=0; ivalue()[i] = fmod( ( inputVectorTime->value()[i] - dPhaseZero ) / dPhasePeriod, 1.0 ); } /* sort by outputVectorPhase... */ memcpy( outputVectorDataOut->value(), inputVectorData->value(), iLength * sizeof( double ) ); double* sort[2]; sort[0] = outputVectorPhase->value(); sort[1] = outputVectorDataOut->value(); quicksort( sort, 0, iLength-1 ); bReturn = true; } return bReturn; } void PhaseSource::swap(double* pData[], int iOne, int iTwo) { double dTemp; for (int i=0; i<2; i++) { dTemp = pData[i][iOne]; pData[i][iOne] = pData[i][iTwo]; pData[i][iTwo] = dTemp; } } void PhaseSource::quicksort( double* pData[], int iLeft, int iRight) { double dVal = pData[0][iRight]; int i = iLeft - 1; int j = iRight; if (iRight <= iLeft) { return; } while (1) { while (pData[0][++i] < dVal) {} while (dVal < pData[0][--j]) { if (j == iLeft) { break; } } if (i >= j) { break; } swap( pData, i, j ); } swap( pData, i, iRight ); quicksort( pData, iLeft, i-1 ); quicksort( pData, i+1, iRight ); } Kst::VectorPtr PhaseSource::vectorTime() const { return _inputVectors[VECTOR_IN_TIME]; } Kst::VectorPtr PhaseSource::vectorData() const { return _inputVectors[VECTOR_IN_DATA]; } Kst::ScalarPtr PhaseSource::scalarPeriod() const { return _inputScalars[SCALAR_IN_PERIOD]; } Kst::ScalarPtr PhaseSource::scalarZeroPhase() const { return _inputScalars[SCALAR_IN_ZEROPHASE]; } QStringList PhaseSource::inputVectorList() const { QStringList vectors(VECTOR_IN_TIME); vectors += VECTOR_IN_DATA; return vectors; } QStringList PhaseSource::inputScalarList() const { QStringList scalars(SCALAR_IN_PERIOD); scalars += SCALAR_IN_ZEROPHASE; return scalars; } QStringList PhaseSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList PhaseSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_PHASE); vectors += VECTOR_OUT_DATA; return vectors; } QStringList PhaseSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList PhaseSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void PhaseSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString PhasePlugin::pluginName() const { return tr("Phase"); } QString PhasePlugin::pluginDescription() const { return tr("Phases a given data set to the specified period and zero outputVectorPhase."); } Kst::DataObject *PhasePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigPhasePlugin* config = static_cast(configWidget)) { PhaseSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_PERIOD, config->selectedScalarPeriod()); object->setInputScalar(SCALAR_IN_ZEROPHASE, config->selectedScalarZeroPhase()); object->setupOutputs(); object->setInputVector(VECTOR_IN_TIME, config->selectedVectorTime()); object->setInputVector(VECTOR_IN_DATA, config->selectedVectorData()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *PhasePlugin::configWidget(QSettings *settingsObject) const { ConfigPhasePlugin *widget = new ConfigPhasePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, PhasePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/bin/0000755000175000017500000000000012362705136016503 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/bin/bin.h0000644000175000017500000000513112277111530017416 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BINPLUGIN_H #define BINPLUGIN_H #include #include #include class BinSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr binScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: BinSource(Kst::ObjectStore *store); ~BinSource(); friend class Kst::ObjectStore; }; class BinPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~BinPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/bin/kstplugin_bin.desktop0000644000175000017500000000341212362705136022746 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=bin X-Kst-Plugin-Author=The University of Toronto Name=Bin Data Object Plugin Name[ca]=Connector d'objecte de dades classificades Name[ca@valencia]=Connector d'objecte de dades classificades Name[de]=Binär-Datenobjekt-Modul Name[fr]=Module DataObject de classement (Bin) Name[it]=Estensione oggetto dati di collocazione Name[nl]=Bin Data Object Plugin Name[pl]=Wtyczka obiektu danych przedziału Name[pt]='Plugin' de Objecto de Dados Compartimentados Name[pt_BR]=Plugin de objeto de dados compartimentados Name[sv]=Intervalldataobjekt-insticksprogram Name[uk]=Додаток для об’єктів комбінування даних Name[x-test]=xxBin Data Object Pluginxx Comment=Implements a Bin Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades classificades pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades classificades pel Kst. Comment[de]=Implementiert ein binäres Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de classement (Bin) pour Kst. Comment[it]=Implementa un'estensione oggetto dati di collocazione per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor klassenindeling Comment[pl]=Implementuje wtyczkę obiektu danych przedziału dla Kst. Comment[pt]=Implementa um 'plugin' de objecto de dados compartimentados para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados compartimentados para o Kst. Comment[sv]=Implementerar ett Kst intervalldataobjekt-insticksprogram. Comment[uk]=Реалізує додаток для роботи з об’єктами комбінування даних у Kst. Comment[x-test]=xxImplements a Bin Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/bin/bin.pro0000644000175000017500000000021212277111530017762 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_bin) SOURCES += \ bin.cpp HEADERS += \ bin.h FORMS += binconfig.ui Kst-2.0.8/src/plugins/dataobject/bin/bin.cpp0000644000175000017500000001661612362701575017774 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* 'boxcar decimation filter': not very useful. */ #include "bin.h" #include "objectstore.h" #include "ui_binconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scalar In"; static const QString& VECTOR_OUT = "Bins"; class ConfigWidgetBinPlugin : public Kst::DataObjectConfigWidget, public Ui_BinConfig { public: ConfigWidgetBinPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_BinConfig() { _store = 0; setupUi(this); } ~ConfigWidgetBinPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarBin->setObjectStore(store); _scalarBin->setDefaultValue(10); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarBin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarBin->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarBin->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (BinSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->binScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Bin DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Bin Scalar", _scalarBin->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Bin DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Bin Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* binScalar = static_cast(object); if (binScalar) { setSelectedScalar(binScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; BinSource::BinSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } BinSource::~BinSource() { } QString BinSource::_automaticDescriptiveName() const { return tr("Bin Plugin Object"); } void BinSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetBinPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); } } void BinSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool BinSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; //Make sure there is at least 1 element in the input vector if (inputVector->length() < 1) { _errorString = tr("Error: Input Vector invalid size"); return false; } //Make sure the bin size is at least 1 if (inputScalar->value() < 1) { _errorString = tr("Error: No Bins"); return false; } // allocate the lengths outputVector->resize(int(inputVector->length() / inputScalar->value()), false); //now bin the data for (int i = 0; i < outputVector->length(); i++) { outputVector->value()[i] = 0; //add up the elements for this bin for (int j = 0; j < inputScalar->value(); j++) { outputVector->value()[i] += inputVector->value()[int(i*inputScalar->value()+j)]; } //find the mean outputVector->value()[i] /= inputScalar->value(); } return true; } Kst::VectorPtr BinSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr BinSource::binScalar() const { return _inputScalars[SCALAR_IN]; } QStringList BinSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList BinSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList BinSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList BinSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList BinSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList BinSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void BinSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString BinPlugin::pluginName() const { return tr("Bin"); } QString BinPlugin::pluginDescription() const { return tr("Bins data into the given size bins. Each bin contains the mean of the elements belonging to the bin."); } Kst::DataObject *BinPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetBinPlugin* config = static_cast(configWidget)) { BinSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *BinPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetBinPlugin *widget = new ConfigWidgetBinPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, BinPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/bin/binconfig.ui0000644000175000017500000000450612277111530020777 0ustar synthsynth BinConfig 0 0 423 78 400 0 0 0 Input Vector false 0 0 0 0 Bin Size false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/0000755000175000017500000000000012277111530020777 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/polynomial/0000755000175000017500000000000012362705136023170 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/polynomial/polynomial.cpp0000644000175000017500000002011712362701575026063 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "polynomial.h" #include "objectstore.h" #include "ui_polynomialconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetPolynomialPlugin : public Kst::DataObjectConfigWidget, public Ui_PolynomialConfig { public: ConfigWidgetPolynomialPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_PolynomialConfig() { _store = 0; setupUi(this); } ~ConfigWidgetPolynomialPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (PolynomialSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Polynomial DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Polynomial DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; PolynomialSource::PolynomialSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } PolynomialSource::~PolynomialSource() { } QString PolynomialSource::_automaticDescriptiveName() const { return tr("Interpolation Polynomial Plugin Object"); } void PolynomialSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetPolynomialPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void PolynomialSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool PolynomialSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_polynomial); } Kst::VectorPtr PolynomialSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr PolynomialSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr PolynomialSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList PolynomialSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList PolynomialSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList PolynomialSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList PolynomialSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList PolynomialSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList PolynomialSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void PolynomialSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString PolynomialPlugin::pluginName() const { return tr("Interpolation Polynomial Spline"); } QString PolynomialPlugin::pluginDescription() const { return tr("Generates a polynomial interpolation for a set of data."); } Kst::DataObject *PolynomialPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetPolynomialPlugin* config = static_cast(configWidget)) { PolynomialSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *PolynomialPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetPolynomialPlugin *widget = new ConfigWidgetPolynomialPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, PolynomialPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/polynomial/kstplugin_polynomial.desktop0000644000175000017500000000434512362705136031054 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=polynomialinterpolation X-Kst-Plugin-Author=The University of Toronto Name=Polynomial Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació polinòmica Name[ca@valencia]=Connector d'objecte de dades d'interpolació polinòmica Name[de]=Datenobjekt-Modul für Polynom-Interpolation Name[fr]=Module DataObject d'interpolation polynomiale Name[it]=Estensione oggetto dati di interpolazione polinomiale Name[nl]=Polynomial Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych interpolacji wielomianowej Name[pt]='Plugin' de Objectos de Dados de Interpolação Polinomial Name[pt_BR]=Plugin de objeto de dados de interpolação polinomial Name[sv]=Dataobjekt-insticksprogram för polynom-interpolation Name[uk]=Додаток для роботи з об’єктами поліноміальної інтерполяції даних Name[x-test]=xxPolynomial Interpolation Data Object Pluginxx Comment=Implements a Polynomial Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació polinòmica pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació polinòmica pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für Polynom-Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation polynomiale pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione polinomiale per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor interpolatie naar een veelterm. Comment[pl]=Implementuje wtyczkę obiektu danych interpolacji wielomianowej dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação polinomial para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação polinomial para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för polynom-interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами поліноміальної інтерполяції даних у Kst. Comment[x-test]=xxImplements a Polynomial Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui0000644000175000017500000000643312277111530027100 0ustar synthsynth PolynomialConfig 0 0 419 121 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/polynomial/polynomial.pro0000644000175000017500000000032112277111530026063 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_polynomialinterpolation) LIBS += -l$$kstlib(gsl) SOURCES += \ polynomial.cpp HEADERS += \ polynomial.h FORMS += polynomialconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/polynomial/polynomial.h0000644000175000017500000000525612277111530025526 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef POLYNOMIALPLUGIN_H #define POLYNOMIALPLUGIN_H #include #include #include class PolynomialSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: PolynomialSource(Kst::ObjectStore *store); ~PolynomialSource(); friend class Kst::ObjectStore; }; class PolynomialPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~PolynomialPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/akima/0000755000175000017500000000000012362705136022067 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/akima/akima.pro0000644000175000017500000000026012277111530023663 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_akima) LIBS += -l$$kstlib(gsl) SOURCES += \ akima.cpp HEADERS += \ akima.h FORMS += akimaconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/akima/kstplugin_akima.desktop0000644000175000017500000000407312362705136026650 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=akima X-Kst-Plugin-Author=The University of Toronto Name=Akima Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació Akima Name[ca@valencia]=Connector d'objecte de dades d'interpolació Akima Name[de]=Datenobjekt-Modul für Akima-Interpolation Name[fr]=Module DataObject d'interpolation Akima Name[it]=Estensione oggetto dati di interpolazione Akima Name[nl]=Akima Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych interpolacji Akima Name[pt]='Plugin' de Objectos de Dados de Interpolação Akima Name[pt_BR]=Plugin de objeto de dados de interpolação Akima Name[sv]=Dataobjekt-insticksprogram för Akima-interpolation Name[uk]=Додаток для роботи з об’єктами інтерполяції даних за Акімою Name[x-test]=xxAkima Interpolation Data Object Pluginxx Comment=Implements a Akima Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació Akima pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació Akima pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für Akima-Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation Akima pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione Akima per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Akima interpolatie. Comment[pl]=Implementuje wtyczkę obiektu danych interpolacji Akima dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação Akima para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação Akima para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för Akima-interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами інтерполяції даних за Акімою у Kst. Comment[x-test]=xxImplements a Akima Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/akima/akima.h0000644000175000017500000000521312277111530023315 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef AKIMAPLUGIN_H #define AKIMAPLUGIN_H #include #include #include class AkimaSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: AkimaSource(Kst::ObjectStore *store); ~AkimaSource(); friend class Kst::ObjectStore; }; class AkimaPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~AkimaPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/akima/akima.cpp0000644000175000017500000001756512362701575023676 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "akima.h" #include "objectstore.h" #include "ui_akimaconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetAkimaPlugin : public Kst::DataObjectConfigWidget, public Ui_AkimaConfig { public: ConfigWidgetAkimaPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_AkimaConfig() { _store = 0; setupUi(this); } ~ConfigWidgetAkimaPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (AkimaSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Akima DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Akima DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; AkimaSource::AkimaSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } AkimaSource::~AkimaSource() { } QString AkimaSource::_automaticDescriptiveName() const { return tr("Interpolation Akima Plugin Object"); } void AkimaSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetAkimaPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void AkimaSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool AkimaSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_akima); } Kst::VectorPtr AkimaSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr AkimaSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr AkimaSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList AkimaSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList AkimaSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList AkimaSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList AkimaSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList AkimaSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList AkimaSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void AkimaSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString AkimaPlugin::pluginName() const { return tr("Interpolation Akima Spline"); } QString AkimaPlugin::pluginDescription() const { return tr("Generates a non-rounded Akima interpolation for a set of data."); } Kst::DataObject *AkimaPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetAkimaPlugin* config = static_cast(configWidget)) { AkimaSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *AkimaPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetAkimaPlugin *widget = new ConfigWidgetAkimaPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, AkimaPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/akima/akimaconfig.ui0000644000175000017500000000642112277111530024673 0ustar synthsynth AkimaConfig 0 0 422 127 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/0000755000175000017500000000000012362705136024161 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/kstplugin_csplineperiodic.desktop0000644000175000017500000000520512362705136033032 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=csplineperiodic X-Kst-Plugin-Author=The University of Toronto Name=Cubic Spline Periodic Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació periòdica Spline cúbica Name[ca@valencia]=Connector d'objecte de dades d'interpolació periòdica Spline cúbica Name[de]=Datenobjekt-Modul für periodische kubische Spline-Interpolation Name[fr]=Module DataObject d'interpolation périodique Spline cubique Name[it]=Estensione oggetto dati di interpolazione periodica spline cubica Name[nl]=Cubic Spline Periodic Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych okresowej interpolacji f. sklejaną sześcienną Name[pt]='Plugin' de Objectos de Dados de Interpolação em Curva Cúbica Periódica Name[pt_BR]=Plugin de objeto de dados de interpolação periódica em curva cúbica Name[sv]=Dataobjekt-insticksprogram för kubisk spline-interpolation Name[uk]=Додаток для роботи з об’єктами періодичної інтерполяції даних кубічними сплайнами Name[x-test]=xxCubic Spline Periodic Interpolation Data Object Pluginxx Comment=Implements a Cubic Spline Periodic Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació periòdica Spline cúbica pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació periòdica Spline cúbica pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für periodische kubische Spline-Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation périodique Spline cubique pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione periodica spline cubica per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor periodieke CSpline-interpolatie. Comment[pl]=Implementuje wtyczkę obiektu danych okresowej interpolacji f. sklejaną sześcienną dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação periódica sobre uma curva periódica cúbica ('c-spline') para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação periódica em curva cúbica para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för kubisk spline-interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами періодичної інтерполяції даних кубічними сплайнами у Kst. Comment[x-test]=xxImplements a Cubic Spline Periodic Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.h0000644000175000017500000000535512277111530027510 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CUBICSPLINEPERIODICPLUGIN_H #define CUBICSPLINEPERIODICPLUGIN_H #include #include #include class CubicSplinePeriodicSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CubicSplinePeriodicSource(Kst::ObjectStore *store); ~CubicSplinePeriodicSource(); friend class Kst::ObjectStore; }; class CubicSplinePeriodicPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CubicSplinePeriodicPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui0000644000175000017500000000645512277111530031066 0ustar synthsynth CubicSplinePeriodicConfig 0 0 422 126 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp0000644000175000017500000002074312362701575030052 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "csplineperiodic.h" #include "objectstore.h" #include "ui_csplineperiodicconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetCubicSplinePeriodicPlugin : public Kst::DataObjectConfigWidget, public Ui_CubicSplinePeriodicConfig { public: ConfigWidgetCubicSplinePeriodicPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CubicSplinePeriodicConfig() { _store = 0; setupUi(this); } ~ConfigWidgetCubicSplinePeriodicPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CubicSplinePeriodicSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Cubic Spline Periodic DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Cubic Spline Periodic DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CubicSplinePeriodicSource::CubicSplinePeriodicSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CubicSplinePeriodicSource::~CubicSplinePeriodicSource() { } QString CubicSplinePeriodicSource::_automaticDescriptiveName() const { return tr("Interpolation Cubic Spline Periodic Plugin Object"); } void CubicSplinePeriodicSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetCubicSplinePeriodicPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void CubicSplinePeriodicSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool CubicSplinePeriodicSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_cspline_periodic); } Kst::VectorPtr CubicSplinePeriodicSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr CubicSplinePeriodicSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr CubicSplinePeriodicSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList CubicSplinePeriodicSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList CubicSplinePeriodicSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList CubicSplinePeriodicSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CubicSplinePeriodicSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList CubicSplinePeriodicSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CubicSplinePeriodicSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CubicSplinePeriodicSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CubicSplinePeriodicPlugin::pluginName() const { return tr("Interpolation Cubic Spline Periodic Spline"); } QString CubicSplinePeriodicPlugin::pluginDescription() const { return tr("Generates a cubic spline interpolation for a set of data."); } Kst::DataObject *CubicSplinePeriodicPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetCubicSplinePeriodicPlugin* config = static_cast(configWidget)) { CubicSplinePeriodicSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CubicSplinePeriodicPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetCubicSplinePeriodicPlugin *widget = new ConfigWidgetCubicSplinePeriodicPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, CubicSplinePeriodicPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.pro0000644000175000017500000000033012277111530030045 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_csplineperiodic) LIBS += -l$$kstlib(gsl) SOURCES += \ csplineperiodic.cpp HEADERS += \ csplineperiodic.h FORMS += csplineperiodicconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/0000755000175000017500000000000012362705136023606 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.h0000644000175000017500000000530312277111530026553 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef AKIMAPERIODICPLUGIN_H #define AKIMAPERIODICPLUGIN_H #include #include #include class AkimaPeriodicSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: AkimaPeriodicSource(Kst::ObjectStore *store); ~AkimaPeriodicSource(); friend class Kst::ObjectStore; }; class AkimaPeriodicPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~AkimaPeriodicPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.pro0000644000175000017500000000032112277111530027117 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_akimaperiodic) LIBS += -l$$kstlib(gsl) SOURCES += \ akimaperiodic.cpp HEADERS += \ akimaperiodic.h FORMS += akimaperiodicconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui0000644000175000017500000000644112277111530030133 0ustar synthsynth AkimaPeriodicConfig 0 0 424 110 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/kstplugin_akimaperiodic.desktop0000644000175000017500000000455512362705136032113 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=akimaperiodic X-Kst-Plugin-Author=The University of Toronto Name=Akima Periodic Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació periòdica Akima Name[ca@valencia]=Connector d'objecte de dades d'interpolació periòdica Akima Name[de]=Datenobjekt-Modul für periodische Akima-Interpolation Name[fr]=Module DataObject d'interpolation périodique Akima Name[it]=Estensione oggetto dati di interpolazione periodica Akima Name[nl]=Akima Periodic Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych okresowej interpolacji Akima Name[pt]='Plugin' de Objectos de Dados de Interpolação Periódica Akima Name[pt_BR]=Plugin de objeto de dados de interpolação periódica Akima Name[sv]=Dataobjekt-insticksprogram för periodisk Akima-interpolation Name[uk]=Додаток для роботи з об’єктами періодичної інтерполяції даних за Акімою Name[x-test]=xxAkima Periodic Interpolation Data Object Pluginxx Comment=Implements a Akima Periodic Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació periòdica Akima pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació periòdica Akima pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für periodische Akima-Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation périodique Akima pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione periodica Akima per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor periodieke Akima-interpolatie. Comment[pl]=Implementuje wtyczkę obiektu danych okresowej interpolacji Akima dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação periódica Akima para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação periódica Akima para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för periodisk Akima-interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами періодичної інтерполяції даних за Акімою у Kst. Comment[x-test]=xxImplements a Akima Periodic Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp0000644000175000017500000002035312362701575027121 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "akimaperiodic.h" #include "objectstore.h" #include "ui_akimaperiodicconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetAkimaPeriodicPlugin : public Kst::DataObjectConfigWidget, public Ui_AkimaPeriodicConfig { public: ConfigWidgetAkimaPeriodicPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_AkimaPeriodicConfig() { _store = 0; setupUi(this); } ~ConfigWidgetAkimaPeriodicPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (AkimaPeriodicSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Akima Periodic DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Akima Periodic DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; AkimaPeriodicSource::AkimaPeriodicSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } AkimaPeriodicSource::~AkimaPeriodicSource() { } QString AkimaPeriodicSource::_automaticDescriptiveName() const { return tr("Interpolation Akima Periodic Plugin Object"); } void AkimaPeriodicSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetAkimaPeriodicPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void AkimaPeriodicSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool AkimaPeriodicSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_akima_periodic); } Kst::VectorPtr AkimaPeriodicSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr AkimaPeriodicSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr AkimaPeriodicSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList AkimaPeriodicSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList AkimaPeriodicSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList AkimaPeriodicSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList AkimaPeriodicSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList AkimaPeriodicSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList AkimaPeriodicSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void AkimaPeriodicSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString AkimaPeriodicPlugin::pluginName() const { return tr("Interpolation Akima Periodic Spline"); } QString AkimaPeriodicPlugin::pluginDescription() const { return tr("Generates a non-rounded periodic Akima interpolation for a set of data."); } Kst::DataObject *AkimaPeriodicPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetAkimaPeriodicPlugin* config = static_cast(configWidget)) { AkimaPeriodicSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *AkimaPeriodicPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetAkimaPeriodicPlugin *widget = new ConfigWidgetAkimaPeriodicPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, AkimaPeriodicPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/linear/0000755000175000017500000000000012362705136022257 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/linear/linear.cpp0000644000175000017500000001762712362701575024255 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "linear.h" #include "objectstore.h" #include "ui_linearconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetLinearPlugin : public Kst::DataObjectConfigWidget, public Ui_LinearConfig { public: ConfigWidgetLinearPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_LinearConfig() { _store = 0; setupUi(this); } ~ConfigWidgetLinearPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (LinearSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Linear DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Linear DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; LinearSource::LinearSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } LinearSource::~LinearSource() { } QString LinearSource::_automaticDescriptiveName() const { return tr("Interpolation Linear Plugin Object"); } void LinearSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetLinearPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void LinearSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool LinearSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_linear); } Kst::VectorPtr LinearSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr LinearSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr LinearSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList LinearSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList LinearSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList LinearSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList LinearSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList LinearSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList LinearSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void LinearSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString LinearPlugin::pluginName() const { return tr("Interpolation Linear Spline"); } QString LinearPlugin::pluginDescription() const { return tr("Generates a linear interpolation for a set of data."); } Kst::DataObject *LinearPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetLinearPlugin* config = static_cast(configWidget)) { LinearSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *LinearPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetLinearPlugin *widget = new ConfigWidgetLinearPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, LinearPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/linear/linear.h0000644000175000017500000000520612277111530023677 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LINEAR_H #define LINEAR_H #include #include #include class LinearSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: LinearSource(Kst::ObjectStore *store); ~LinearSource(); friend class Kst::ObjectStore; }; class LinearPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~LinearPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/linear/linear.pro0000644000175000017500000000030112277111530024237 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_linearinterpolation) LIBS += -l$$kstlib(gsl) SOURCES += \ linear.cpp HEADERS += \ linear.h FORMS += linearconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/linear/linearconfig.ui0000644000175000017500000000642312277111530025255 0ustar synthsynth LinearConfig 0 0 421 113 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/linear/kstplugin_linear.desktop0000644000175000017500000000416112362705136027226 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=linearinterpolation X-Kst-Plugin-Author=The University of Toronto Name=Linear Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació lineal Name[ca@valencia]=Connector d'objecte de dades d'interpolació lineal Name[de]=Datenobjekt-Modul für lineare Interpolation Name[fr]=Module DataObject d'interpolation linéaire Name[it]=Estensione oggetto dati di interpolazione lineare Name[nl]=Linear Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych interpolacji liniowej Name[pt]='Plugin' de Objectos de Dados de Interpolação Linear Name[pt_BR]=Plugin de objeto de dados de interpolação linear Name[sv]=Dataobjekt-insticksprogram för linjär interpolation Name[uk]=Додаток для роботи з об’єктами лінійної інтерполяції даних Name[x-test]=xxLinear Interpolation Data Object Pluginxx Comment=Implements a Linear Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació lineal pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació lineal pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für lineare Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation linéaire pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione lineare per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor lineaire interpolatie. Comment[pl]=Implementuje wtyczkę obiektu danych interpolacji liniowej dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação linear para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação linear para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för linjär interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами лінійної інтерполяції даних у Kst. Comment[x-test]=xxImplements a Linear Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/cspline/0000755000175000017500000000000012362705136022442 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/interpolations/cspline/cspline.pro0000644000175000017500000000027012277111530024612 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_cspline) LIBS += -l$$kstlib(gsl) SOURCES += \ cspline.cpp HEADERS += \ cspline.h FORMS += csplineconfig.ui Kst-2.0.8/src/plugins/dataobject/interpolations/cspline/cspline.h0000644000175000017500000000526512277111530024252 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CUBICSPLINEPLUGIN_H #define CUBICSPLINEPLUGIN_H #include #include #include class CubicSplineSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorX1() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CubicSplineSource(Kst::ObjectStore *store); ~CubicSplineSource(); friend class Kst::ObjectStore; }; class CubicSplinePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CubicSplinePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/cspline/kstplugin_akima.desktop0000644000175000017500000000424412362705136027223 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=cspline X-Kst-Plugin-Author=The University of Toronto Name=CSpline Interpolation Data Object Plugin Name[ca]=Connector d'objecte de dades d'interpolació CSpline Name[ca@valencia]=Connector d'objecte de dades d'interpolació CSpline Name[de]=Datenobjekt-Modul für CSpline-Interpolation Name[fr]=Module DataObject d'interpolation CSpline Name[it]=Estensione oggetto dati di interpolazione CSpline Name[nl]=CSpline Interpolation Data Object Plugin Name[pl]=Wtyczka obiektu danych interpolacji f. sklejaną sześcienną Name[pt]='Plugin' de Objectos de Dados de Interpolação em Curva Name[pt_BR]=Plugin de objeto de dados de interpolação CSpline Name[sv]=Dataobjekt-insticksprogram för C-spline-interpolation Name[uk]=Додаток об’єкта даних інтерполяції за C-сплайнами Name[x-test]=xxCSpline Interpolation Data Object Pluginxx Comment=Implements a CSpline Interpolation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'interpolació CSpline pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'interpolació CSpline pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für CSpline-Interpolation für Kst. Comment[fr]=Implémente un module DataObject d'interpolation CSpline pour Kst. Comment[it]=Implementa un'estensione oggetto dati di interpolazione CSpline per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor CSpline-interpolatie. Comment[pl]=Implementuje wtyczkę obiektu danych interpolacji f. sklejaną sześcienną dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados com a interpolação periódica sobre uma curva ('c-spline') para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de interpolação CSpline para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för C-spline-interpolation. Comment[uk]=Реалізує додаток для роботи з об’єктами інтерполяції даних C-сплайнами у Kst. Comment[x-test]=xxImplements a CSpline Interpolation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/interpolations/cspline/csplineconfig.ui0000644000175000017500000000643512277111530025626 0ustar synthsynth CubicSplineConfig 0 0 423 125 400 0 0 0 Input Vector X false 0 0 0 0 Input Vector Y false 0 0 0 0 Input Vector X' false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/interpolations/cspline/cspline.cpp0000644000175000017500000002016012362701575024605 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "cspline.h" #include "objectstore.h" #include "ui_csplineconfig.h" #include #include "../interpolations.h" static const QString& VECTOR_IN_X = "Vector X In"; static const QString& VECTOR_IN_Y = "Vector Y In"; static const QString& VECTOR_IN_X1 = "Vector X' In"; static const QString& VECTOR_OUT = "Y Interpolated"; class ConfigWidgetCubicSplinePlugin : public Kst::DataObjectConfigWidget, public Ui_CubicSplineConfig { public: ConfigWidgetCubicSplinePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CubicSplineConfig() { _store = 0; setupUi(this); } ~ConfigWidgetCubicSplinePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorX1->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); }; void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CubicSplineSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorX1(source->vectorX1()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Interpolation Cubic Spline DataObject Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Interpolation Cubic Spline DataObject Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorX(vector); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object); if (vector2) { setSelectedVectorY(vector2); } vectorName = _cfg->value("Input Vector X'").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorX1 = static_cast(object); if (vectorX1) { setSelectedVectorX1(vectorX1); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CubicSplineSource::CubicSplineSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CubicSplineSource::~CubicSplineSource() { } QString CubicSplineSource::_automaticDescriptiveName() const { return tr("Interpolation Cubic Spline Plugin Object"); } void CubicSplineSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetCubicSplinePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } } void CubicSplineSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool CubicSplineSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_cspline); } Kst::VectorPtr CubicSplineSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr CubicSplineSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr CubicSplineSource::vectorX1() const { return _inputVectors[VECTOR_IN_X1]; } QStringList CubicSplineSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_X1; return vectors; } QStringList CubicSplineSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList CubicSplineSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CubicSplineSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList CubicSplineSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CubicSplineSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CubicSplineSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CubicSplinePlugin::pluginName() const { return tr("Interpolation Cubic Spline Spline"); } QString CubicSplinePlugin::pluginDescription() const { return tr("Generates a spline interpolation for a set of data."); } Kst::DataObject *CubicSplinePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetCubicSplinePlugin* config = static_cast(configWidget)) { CubicSplineSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CubicSplinePlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetCubicSplinePlugin *widget = new ConfigWidgetCubicSplinePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, CubicSplinePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/interpolations/interpolations.h0000644000175000017500000000555012277111530024227 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include bool interpolate(Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr x1Vector, Kst::VectorPtr yOutVector, const gsl_interp_type* pType) { gsl_interp_accel *pAccel = NULL; gsl_interp *pInterp = NULL; gsl_spline *pSpline = NULL; int iLengthData; int iLengthInterp; bool bReturn = false; double* pResult[1]; iLengthData = xVector->length(); if (yVector->length() < iLengthData) { iLengthData = yVector->length(); } iLengthInterp = x1Vector->length(); if (iLengthInterp > 0) { if (yOutVector->length() != iLengthInterp) { yOutVector->resize(iLengthInterp, true); pResult[0] = (double*)realloc( yOutVector->value(), iLengthInterp * sizeof( double ) ); } else { pResult[0] = yOutVector->value(); } if (pResult[0] != NULL) { for (int i = 0; i < iLengthInterp; ++i) { yOutVector->value()[i] = pResult[0][i]; } pInterp = gsl_interp_alloc( pType, iLengthData ); if (pInterp != NULL) { // // check that we have enough data points... // if ((unsigned int)iLengthData > gsl_interp_min_size( pInterp )) { pAccel = gsl_interp_accel_alloc( ); if (pAccel != NULL) { pSpline = gsl_spline_alloc( pType, iLengthData ); if (pSpline != NULL) { if (!gsl_spline_init( pSpline, xVector->value(), yVector->value(), iLengthData )) { for( int i=0; ivalue()[i] = gsl_spline_eval( pSpline, x1Vector->value()[i], pAccel ); } bReturn = true; } gsl_spline_free( pSpline ); } gsl_interp_accel_free( pAccel ); } } gsl_interp_free( pInterp ); } } } return bReturn; } Kst-2.0.8/src/plugins/dataobject/interpolations/interpolations.pro0000644000175000017500000000022412277111530024571 0ustar synthsynthTEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ akima \ akimaperiodic \ cspline \ csplineperiodic \ linear \ polynomial Kst-2.0.8/src/plugins/dataobject/convolution/0000755000175000017500000000000012277111530020304 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/convolution/convolution.pro0000644000175000017500000000012212277111530023400 0ustar synthsynthTEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ convolve \ deconvolve Kst-2.0.8/src/plugins/dataobject/convolution/convolve/0000755000175000017500000000000012362705136022145 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/convolution/convolve/convolve.h0000644000175000017500000000517712277111530024155 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CONVOLVEPLUGIN_H #define CONVOLVEPLUGIN_H #include #include #include class ConvolveSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorOne() const; Kst::VectorPtr vectorTwo() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: ConvolveSource(Kst::ObjectStore *store); ~ConvolveSource(); friend class Kst::ObjectStore; }; class ConvolvePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ConvolvePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/convolution/convolve/convolve.cpp0000644000175000017500000002417512362701575024520 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "convolve.h" #include "objectstore.h" #include "ui_convolveconfig.h" #include #include static const QString& VECTOR_IN_ONE = "Vector One In"; static const QString& VECTOR_IN_TWO = "Vector Two In"; static const QString& VECTOR_OUT = "Vector Out"; class ConfigWidgetConvolvePlugin : public Kst::DataObjectConfigWidget, public Ui_ConvolveConfig { public: ConfigWidgetConvolvePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_ConvolveConfig() { _store = 0; setupUi(this); } ~ConfigWidgetConvolvePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorOne->setObjectStore(store); _vectorTwo->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorOne, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorTwo, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorOne() { return _vectorOne->selectedVector(); }; void setSelectedVectorOne(Kst::VectorPtr vector) { return _vectorOne->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorTwo() { return _vectorTwo->selectedVector(); }; void setSelectedVectorTwo(Kst::VectorPtr vector) { return _vectorTwo->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (ConvolveSource* source = static_cast(dataObject)) { setSelectedVectorOne(source->vectorOne()); setSelectedVectorTwo(source->vectorTwo()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Convolve DataObject Plugin"); _cfg->setValue("Input Vector One", _vectorOne->selectedVector()->Name()); _cfg->setValue("Input Vector Two", _vectorTwo->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Convolve DataObject Plugin"); QString vectorName = _cfg->value("Input Vector One").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorOne(vector); } vectorName = _cfg->value("Input Vector Two").toString(); Kst::Object* object2 = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object2); if (vector2) { setSelectedVectorTwo(vector2); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; ConvolveSource::ConvolveSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } ConvolveSource::~ConvolveSource() { } QString ConvolveSource::_automaticDescriptiveName() const { return tr("Convolve Plugin Object"); } void ConvolveSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetConvolvePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } } void ConvolveSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool ConvolveSource::algorithm() { Kst::VectorPtr inputVectorOne = _inputVectors[VECTOR_IN_ONE]; Kst::VectorPtr inputVectorTwo = _inputVectors[VECTOR_IN_TWO]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; if (inputVectorOne->length() <= 0 && inputVectorTwo->length() <= 0) { _errorString = tr("Error: Input Vectors - invalid size"); return false; } double* pdResponse; double* pdConvolve; double* pdResult; double dReal; double dImag; Kst::VectorPtr response; Kst::VectorPtr convolve; int iLength; int iLengthNew; bool bReturn = false; int iResponseMidpoint; // determine which is the response function: // i.e. which is shorter... if (inputVectorOne->length() < inputVectorTwo->length()) { response = inputVectorOne; convolve = inputVectorTwo; } else { response = inputVectorTwo; convolve = inputVectorOne; } outputVector->resize(convolve->length(), false); iResponseMidpoint = response->length() / 2; iLength = convolve->length() + iResponseMidpoint; // round iLength up to the nearest factor of two... iLengthNew = 64; while (iLengthNew < iLength && iLengthNew > 0) { iLengthNew *= 2; } iLength = iLengthNew; if (iLength <= 0) { _errorString = tr("Error: Invalid Input length calculated"); return false; } pdResponse = new double[iLength]; pdConvolve = new double[iLength]; if (pdResponse != NULL && pdConvolve != NULL) { // // sort the response function into wrap-around order... // memset( pdResponse, 0, iLength * sizeof( double ) ); for (int i = 0; i < iResponseMidpoint; i++) { pdResponse[i] = response->value()[iResponseMidpoint+i]; pdResponse[iLength-iResponseMidpoint+i] = response->value()[i]; } // // handle the case where the response function has an odd number of points... // if (iResponseMidpoint % 2 == 1) { pdResponse[iResponseMidpoint] = response->value()[response->length()-1]; } // // zero-pad the convolve array... // memset( pdConvolve, 0, iLength * sizeof( double ) ); memcpy( pdConvolve, convolve->value(), convolve->length() * sizeof( double ) ); // // calculate the FFTs of the two functions... // if (gsl_fft_real_radix2_transform( pdResponse, 1, iLength ) == 0) { if (gsl_fft_real_radix2_transform( pdConvolve, 1, iLength ) == 0) { // // multiply the FFTs together... // for (int i=0; i < iLength/2; i++) { if (i==0 || i==(iLength/2)-1) { pdResponse[i] = pdResponse[i] * pdConvolve[i]; } else { dReal = pdResponse[i] * pdConvolve[i] - pdResponse[iLength-i] * pdConvolve[iLength-i]; dImag = pdResponse[i] * pdConvolve[iLength-i] + pdResponse[iLength-i] * pdConvolve[i]; pdResponse[i] = dReal; pdResponse[iLength-i] = dImag; } } // // do the inverse FFT... // if (gsl_fft_halfcomplex_radix2_inverse( pdResponse, 1, iLength) == 0) { pdResult = outputVector->value(); if (pdResult != NULL) { for (int i = 0; i < convolve->length(); ++i) { outputVector->value()[i] = pdResult[i]; } memcpy( pdResult, pdResponse, convolve->length() * sizeof( double ) ); bReturn = true; } } } } } delete[] pdResponse; delete[] pdConvolve; return bReturn; } Kst::VectorPtr ConvolveSource::vectorOne() const { return _inputVectors[VECTOR_IN_ONE]; } Kst::VectorPtr ConvolveSource::vectorTwo() const { return _inputVectors[VECTOR_IN_TWO]; } QStringList ConvolveSource::inputVectorList() const { QStringList vectors(VECTOR_IN_ONE); vectors += VECTOR_IN_TWO; return vectors; } QStringList ConvolveSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList ConvolveSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList ConvolveSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList ConvolveSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList ConvolveSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void ConvolveSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString ConvolvePlugin::pluginName() const { return tr("Convolve"); } QString ConvolvePlugin::pluginDescription() const { return tr("Generates the convolution of one vector with another."); } Kst::DataObject *ConvolvePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetConvolvePlugin* config = static_cast(configWidget)) { ConvolveSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); object->setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ConvolvePlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetConvolvePlugin *widget = new ConfigWidgetConvolvePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, ConvolvePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/convolution/convolve/convolveconfig.ui0000644000175000017500000000464312277111530025526 0ustar synthsynth ConvolveConfig 0 0 429 70 400 0 0 0 Input Vector One false 0 0 0 0 Input Vector Two false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/convolution/convolve/convolve.pro0000644000175000017500000000027412277111530024517 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_convolve) LIBS += -l$$kstlib(gsl) SOURCES += \ convolve.cpp HEADERS += \ convolve.h FORMS += convolveconfig.ui Kst-2.0.8/src/plugins/dataobject/convolution/convolve/kstplugin_convolve.desktop0000644000175000017500000000345512362705136027502 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=convolve X-Kst-Plugin-Author=The University of Toronto Name=Convolve Data Object Plugin Name[ca]=Connector d'objecte de dades de convolució Name[ca@valencia]=Connector d'objecte de dades de convolució Name[de]=Konvolutions-Datenobjekt-Modul Name[fr]=Module DataObject de convolution Name[it]=Estensione oggetto dati di convoluzione Name[nl]=Convolve Data Object Plugin Name[pl]=Wtyczka obiektu danych splotu Name[pt]='Plugin' de Objectos de Dados de Convolução Name[pt_BR]=Plugin de objetos de dados de convolução Name[sv]=Dataobjekt-insticksprogram för faltning Name[uk]=Додаток для роботи з об’єктами згорнутих даних Name[x-test]=xxConvolve Data Object Pluginxx Comment=Implements a Convolve Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de convolució pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de convolució pel Kst. Comment[de]=Implementiert ein Konvolutions-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de convolution pour Kst. Comment[it]=Implementa un'estensione oggetto dati di convoluzione per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor convolutie. Comment[pl]=Implementuje wtyczkę obiektu danych splotu dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de convolução para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de convolação para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för faltning. Comment[uk]=Реалізує додаток для роботи з об’єктами згорнутих даних у Kst. Comment[x-test]=xxImplements a Convolve Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/convolution/deconvolve/0000755000175000017500000000000012362705136022456 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/convolution/deconvolve/deconvolve.pro0000644000175000017500000000030412277111530025333 0ustar synthsynthinclude(../../../plugins_subsub.pri) TARGET = $$kstlib(kstplugin_deconvolve) LIBS += -l$$kstlib(gsl) SOURCES += \ deconvolve.cpp HEADERS += \ deconvolve.h FORMS += deconvolveconfig.ui Kst-2.0.8/src/plugins/dataobject/convolution/deconvolve/deconvolve.h0000644000175000017500000000522112277111530024765 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DEDeconvolvePlugin_H #define DEDeconvolvePlugin_H #include #include #include class DeconvolveSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorOne() const; Kst::VectorPtr vectorTwo() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: DeconvolveSource(Kst::ObjectStore *store); ~DeconvolveSource(); friend class Kst::ObjectStore; }; class DeconvolvePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~DeconvolvePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp0000644000175000017500000002464112362701575025340 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "deconvolve.h" #include "objectstore.h" #include "ui_deconvolveconfig.h" #include #include static const QString& VECTOR_IN_ONE = "Vector One In"; static const QString& VECTOR_IN_TWO = "Vector Two In"; static const QString& VECTOR_OUT = "Vector Out"; class ConfigWidgetDeconvolvePlugin : public Kst::DataObjectConfigWidget, public Ui_DeconvolveConfig { public: ConfigWidgetDeconvolvePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_DeconvolveConfig() { _store = 0; setupUi(this); } ~ConfigWidgetDeconvolvePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorOne->setObjectStore(store); _vectorTwo->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorOne, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorTwo, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorOne() { return _vectorOne->selectedVector(); }; void setSelectedVectorOne(Kst::VectorPtr vector) { return _vectorOne->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorTwo() { return _vectorTwo->selectedVector(); }; void setSelectedVectorTwo(Kst::VectorPtr vector) { return _vectorTwo->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (DeconvolveSource* source = static_cast(dataObject)) { setSelectedVectorOne(source->vectorOne()); setSelectedVectorTwo(source->vectorTwo()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Deconvolve DataObject Plugin"); _cfg->setValue("Input Vector One", _vectorOne->selectedVector()->Name()); _cfg->setValue("Input Vector Two", _vectorTwo->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Deconvolve DataObject Plugin"); QString vectorName = _cfg->value("Input Vector One").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVectorOne(vector); } vectorName = _cfg->value("Input Vector Two").toString(); Kst::Object* object2 = _store->retrieveObject(vectorName); Kst::Vector* vector2 = static_cast(object2); if (vector2) { setSelectedVectorTwo(vector2); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; DeconvolveSource::DeconvolveSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } DeconvolveSource::~DeconvolveSource() { } QString DeconvolveSource::_automaticDescriptiveName() const { return tr("Deconvolve Plugin Object"); } void DeconvolveSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetDeconvolvePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } } void DeconvolveSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool DeconvolveSource::algorithm() { Kst::VectorPtr inputVectorOne = _inputVectors[VECTOR_IN_ONE]; Kst::VectorPtr inputVectorTwo = _inputVectors[VECTOR_IN_TWO]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; if (inputVectorOne->length() <= 0 && inputVectorTwo->length() <= 0) { _errorString = tr("Error: Input Vectors - invalid size"); return false; } double* pdResponse; double* pdConvolve; double* pdResult; double dReal; double dImag; double dSize; Kst::VectorPtr response; Kst::VectorPtr deconvolve; int iLength; int iLengthNew; bool bReturn = false; int iResponseMidpoint; // determine which is the response function: // i.e. which is shorter... if (inputVectorOne->length() < inputVectorTwo->length()) { response = inputVectorOne; deconvolve = inputVectorTwo; } else { response = inputVectorTwo; deconvolve = inputVectorOne; } outputVector->resize(deconvolve->length(), false); iResponseMidpoint = response->length() / 2; iLength = deconvolve->length() + iResponseMidpoint; // round iLength up to the nearest factor of two... iLengthNew = 64; while (iLengthNew < iLength && iLengthNew > 0) { iLengthNew *= 2; } iLength = iLengthNew; if (iLength <= 0) { _errorString = tr("Error: Invalid Input length calculated"); return false; } pdResponse = new double[iLength]; pdConvolve = new double[iLength]; if (pdResponse != NULL && pdConvolve != NULL) { // // sort the response function into wrap-around order... // memset( pdResponse, 0, iLength * sizeof( double ) ); for ( int i=0; i < iResponseMidpoint; i++) { pdResponse[i] = response->value()[iResponseMidpoint+i]; pdResponse[iLength-iResponseMidpoint+i] = response->value()[i]; } // // handle the case where the response function has an odd number of points... // if (iResponseMidpoint % 2 == 1) { pdResponse[iResponseMidpoint] = response->value()[response->length()]; } // // zero-pad the convolve array... // memset( pdConvolve, 0, iLength * sizeof( double ) ); memcpy( pdConvolve, deconvolve->value(), deconvolve->length() * sizeof( double ) ); // // calculate the FFTs of the two functions... // if (gsl_fft_real_radix2_transform( pdResponse, 1, iLength ) == 0) { if (gsl_fft_real_radix2_transform( pdConvolve, 1, iLength ) == 0) { // // divide one FFT by the other... // for ( int i=0; i < iLength/2; i++) { if (i==0 || i==(iLength/2)-1) { pdResponse[i] = pdConvolve[i] / pdResponse[i]; } else { dSize = ( pdResponse[i] * pdResponse[i] ) + ( pdResponse[iLength-i] * pdResponse[iLength-i] ); dReal = pdResponse[i] * pdConvolve[i] + pdResponse[iLength-i] * pdConvolve[iLength-i]; dImag = pdResponse[i] * pdConvolve[iLength-i] - pdResponse[iLength-i] * pdConvolve[i]; dReal /= dSize; dImag /= dSize; pdResponse[i] = dReal; pdResponse[iLength-i] = dImag; } } // // do the inverse FFT... // if (gsl_fft_halfcomplex_radix2_inverse( pdResponse, 1, iLength ) == 0) { pdResult = outputVector->value(); if (pdResult != NULL) { for (int i = 0; i < deconvolve->length(); ++i) { outputVector->value()[i] = pdResult[i]; } memcpy( pdResult, pdResponse, deconvolve->length() * sizeof( double ) ); bReturn = true; } } } } } delete[] pdResponse; delete[] pdConvolve; return bReturn; } Kst::VectorPtr DeconvolveSource::vectorOne() const { return _inputVectors[VECTOR_IN_ONE]; } Kst::VectorPtr DeconvolveSource::vectorTwo() const { return _inputVectors[VECTOR_IN_TWO]; } QStringList DeconvolveSource::inputVectorList() const { QStringList vectors(VECTOR_IN_ONE); vectors += VECTOR_IN_TWO; return vectors; } QStringList DeconvolveSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList DeconvolveSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList DeconvolveSource::outputVectorList() const { return QStringList(VECTOR_OUT); } QStringList DeconvolveSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList DeconvolveSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void DeconvolveSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString DeconvolvePlugin::pluginName() const { return tr("Deconvolve"); } QString DeconvolvePlugin::pluginDescription() const { return tr("Generates the deconvolution of one vector with another."); } Kst::DataObject *DeconvolvePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetDeconvolvePlugin* config = static_cast(configWidget)) { DeconvolveSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); object->setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *DeconvolvePlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetDeconvolvePlugin *widget = new ConfigWidgetDeconvolvePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_DeconvolvePlugin, DeconvolvePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/convolution/deconvolve/kstplugin_deconvolve.desktop0000644000175000017500000000357212362705136030324 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=deconvolve X-Kst-Plugin-Author=The University of Toronto Name=Deconvolve Data Object Plugin Name[ca]=Connector d'objecte de dades de desconvolució Name[ca@valencia]=Connector d'objecte de dades de desconvolució Name[de]=Dekonvolutions-Datenobjekt-Modul Name[fr]=Module DataObject de déconvolution Name[it]=Estensione oggetto dati di deconvoluzione Name[nl]=Deconvolve Data Object Plugin Name[pl]=Wtyczka obiektu danych odplatania Name[pt]='Plugin' de Objectos de Dados de Desconvolução Name[pt_BR]=Plugin de objeto de dados de desconvolução Name[sv]=Dataobjekt-insticksprogram för dekonvolution Name[uk]=Додаток для роботи з об’єктами розгорнутих даних Name[x-test]=xxDeconvolve Data Object Pluginxx Comment=Implements a Deconvolve Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de desconvolució pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de desconvolució pel Kst. Comment[de]=Implementiert ein Dekonvolutions-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de déconvolution pour Kst. Comment[it]=Implementa un'estensione oggetto dati di deconvoluzione per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor deconvolutie. Comment[pl]=Implementuje wtyczkę obiektu danych odplatania dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de desconvolução para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de desconvolução para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för dekonvolution. Comment[uk]=Реалізує додаток для роботи з об’єктами розгорнутих даних у Kst. Comment[x-test]=xxImplements a Deconvolve Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui0000644000175000017500000000464712277111530026354 0ustar synthsynth DeconvolveConfig 0 0 429 73 400 0 0 0 Input Vector One false 0 0 0 0 Input Vector Two false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/dataobject.pro0000644000175000017500000000065112277111530020551 0ustar synthsynthinclude($$PWD/../../../config.pri) TEMPLATE = subdirs CONFIG += ordered DEMOS += \ linefit \ genericfilter SUBDIRS += \ bin \ chop \ crossspectrum \ effectivebandwidth \ lockin \ periodogram \ phase \ shift \ statistics \ syncbin LibExists(gsl) { SUBDIRS += convolution \ correlation \ interpolations \ noiseaddition } Kst-2.0.8/src/plugins/dataobject/statistics/0000755000175000017500000000000012362705136020125 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/statistics/statistics.cpp0000644000175000017500000002501012362701575023024 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "statistics.h" #include "objectstore.h" #include "ui_statisticsconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_OUT_MEAN = "Mean"; static const QString& SCALAR_OUT_MINIMUM = "Minimum"; static const QString& SCALAR_OUT_MAXIMUM = "Maximum"; static const QString& SCALAR_OUT_VARIANCE = "Variance"; static const QString& SCALAR_OUT_STANDARD_DEVIATION = "Standard deviation"; static const QString& SCALAR_OUT_MEDIAN = "Median"; static const QString& SCALAR_OUT_ABSOLUTE_DEVIATION = "Absolute deviation"; static const QString& SCALAR_OUT_SKEWNESS = "Skewness"; static const QString& SCALAR_OUT_KURTOSIS = "Kurtosis"; class ConfigWidgetStatisticsPlugin : public Kst::DataObjectConfigWidget, public Ui_StatisticsConfig { public: ConfigWidgetStatisticsPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_StatisticsConfig() { _store = 0; setupUi(this); } ~ConfigWidgetStatisticsPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (StatisticsSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Statistics DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Statistics DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; StatisticsSource::StatisticsSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } StatisticsSource::~StatisticsSource() { } QString StatisticsSource::_automaticDescriptiveName() const { return tr("%1 Statistics", "arg1 is a vector").arg(_inputVectors[VECTOR_IN]->descriptiveName()); } void StatisticsSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetStatisticsPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); } } void StatisticsSource::setupOutputs() { setOutputScalar(SCALAR_OUT_MEAN, ""); setOutputScalar(SCALAR_OUT_MINIMUM, ""); setOutputScalar(SCALAR_OUT_MAXIMUM, ""); setOutputScalar(SCALAR_OUT_VARIANCE, ""); setOutputScalar(SCALAR_OUT_STANDARD_DEVIATION, ""); setOutputScalar(SCALAR_OUT_MEDIAN, ""); setOutputScalar(SCALAR_OUT_ABSOLUTE_DEVIATION, ""); setOutputScalar(SCALAR_OUT_SKEWNESS, ""); setOutputScalar(SCALAR_OUT_KURTOSIS, ""); } bool StatisticsSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr outputScalarMean = _outputScalars[SCALAR_OUT_MEAN]; Kst::ScalarPtr outputScalarMin = _outputScalars[SCALAR_OUT_MINIMUM]; Kst::ScalarPtr outputScalarMax = _outputScalars[SCALAR_OUT_MAXIMUM]; Kst::ScalarPtr outputScalarVariance = _outputScalars[SCALAR_OUT_VARIANCE]; Kst::ScalarPtr outputScalarSD = _outputScalars[SCALAR_OUT_STANDARD_DEVIATION]; Kst::ScalarPtr outputScalarMedian = _outputScalars[SCALAR_OUT_MEDIAN]; Kst::ScalarPtr outputScalarAD = _outputScalars[SCALAR_OUT_ABSOLUTE_DEVIATION]; Kst::ScalarPtr outputScalarSkewness = _outputScalars[SCALAR_OUT_SKEWNESS]; Kst::ScalarPtr outputScalarKurtosis = _outputScalars[SCALAR_OUT_KURTOSIS]; //Make sure there is at least 1 element in the input vector if (inputVector->length() < 1) { _errorString = tr("Error: Input Vector invalid size"); return false; } double* pCopy; double dMean = 0.0; double dMedian = 0.0; double dStandardDeviation = 0.0; double dTotal = 0.0; double dSquaredTotal = 0.0; double dMinimum = 0.0; double dMaximum = 0.0; double dVariance = 0.0; double dAbsoluteDeviation = 0.0; double dSkewness = 0.0; double dKurtosis = 0.0; int iLength = inputVector->length(); for (int i=0; ivalue()[i] < dMinimum) { dMinimum = inputVector->value()[i]; } if (i == 0 || inputVector->value()[i] > dMaximum) { dMaximum = inputVector->value()[i]; } dTotal += inputVector->value()[i]; dSquaredTotal += inputVector->value()[i] * inputVector->value()[i]; } dMean = dTotal / (double)iLength; if (iLength > 1) { dVariance = 1.0 / ( (double)iLength - 1.0 ); dVariance *= dSquaredTotal - ( dTotal * dTotal / (double)iLength ); if (dVariance > 0.0) { dStandardDeviation = sqrt( dVariance ); } else { dVariance = 0.0; dStandardDeviation = 0.0; } } for (int i=0; ivalue()[i] - dMean ); dSkewness += pow( inputVector->value()[i] - dMean, 3.0 ); dKurtosis += pow( inputVector->value()[i] - dMean, 4.0 ); } dAbsoluteDeviation /= (double)iLength; dSkewness /= (double)iLength * pow( dStandardDeviation, 3.0 ); dKurtosis /= (double)iLength * pow( dStandardDeviation, 4.0 ); dKurtosis -= 3.0; /* sort by phase... */ pCopy = (double*)calloc( iLength, sizeof( double ) ); if (pCopy != NULL) { memcpy( pCopy, inputVector->value(), iLength * sizeof( double ) ); quicksort( pCopy, 0, iLength-1 ); dMedian = pCopy[ iLength / 2 ]; free( pCopy ); } outputScalarMean->setValue(dMean); outputScalarMin->setValue(dMinimum); outputScalarMax->setValue(dMaximum); outputScalarVariance->setValue(dVariance); outputScalarSD->setValue(dStandardDeviation); outputScalarMedian->setValue(dMedian); outputScalarAD->setValue(dAbsoluteDeviation); outputScalarSkewness->setValue(dSkewness); outputScalarKurtosis->setValue(dKurtosis); return true; } void StatisticsSource::swap( double* pData, int iOne, int iTwo) { double dTemp; dTemp = pData[iOne]; pData[iOne] = pData[iTwo]; pData[iTwo] = dTemp; } void StatisticsSource::quicksort( double* pData, int iLeft, int iRight) { double dVal = pData[iRight]; int i = iLeft - 1; int j = iRight; if (iRight <= iLeft) { return; } while (1) { while (pData[++i] < dVal) { } while(dVal < pData[--j]) { if (j == iLeft) { break; } } if (i >= j) { break; } swap( pData, i, j ); } swap( pData, i, iRight ); quicksort( pData, iLeft, i-1 ); quicksort( pData, i+1, iRight ); } Kst::VectorPtr StatisticsSource::vector() const { return _inputVectors[VECTOR_IN]; } QStringList StatisticsSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList StatisticsSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList StatisticsSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList StatisticsSource::outputVectorList() const { return QStringList( /*VECTOR_OUT*/ ); } QStringList StatisticsSource::outputScalarList() const { QStringList scalars(SCALAR_OUT_MEAN); scalars += SCALAR_OUT_MINIMUM; scalars += SCALAR_OUT_MAXIMUM; scalars += SCALAR_OUT_VARIANCE; scalars += SCALAR_OUT_STANDARD_DEVIATION; scalars += SCALAR_OUT_MEDIAN; scalars += SCALAR_OUT_ABSOLUTE_DEVIATION; scalars += SCALAR_OUT_SKEWNESS; scalars += SCALAR_OUT_KURTOSIS; return scalars; } QStringList StatisticsSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void StatisticsSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString StatisticsPlugin::pluginName() const { return tr("Statistics"); } QString StatisticsPlugin::pluginDescription() const { return tr("Determines statistics for a given inputVector set."); } Kst::DataObject *StatisticsPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetStatisticsPlugin* config = static_cast(configWidget)) { StatisticsSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *StatisticsPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetStatisticsPlugin *widget = new ConfigWidgetStatisticsPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ChopPlugin, StatisticsPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/statistics/kstplugin_statistics.desktop0000644000175000017500000000350112362705136026011 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=statistics X-Kst-Plugin-Author=The University of Toronto Name=Statistics Data Object Plugin Name[ca]=Connector d'objecte de dades estadístiques Name[ca@valencia]=Connector d'objecte de dades estadístiques Name[de]=Statistik-Datenobjekt-Modul Name[fr]=Module DataObject de statistiques Name[it]=Estensione oggetto dati statistici Name[nl]=Statistics Data Object Plugin Name[pl]=Wtyczka obiektu danych statystyki Name[pt]='Plugin' de Objectos de Dados Estatísticos Name[pt_BR]=Plugin de objeto de dados de estatística Name[sv]=Dataobjekt-insticksprogram för statistik Name[uk]=Додаток для роботи з об’єктами статистичних даних Name[x-test]=xxStatistics Data Object Pluginxx Comment=Implements a Statistics Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades estadístiques pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades estadístiques pel Kst. Comment[de]=Implementiert ein Statistik-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de statistiques pour Kst. Comment[it]=Implementa un'estensione oggetto dati statistici per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor statistiek. Comment[pl]=Implementuje wtyczkę obiektu danych statystyki dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados para estatísticas para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de estatística para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för statistik. Comment[uk]=Реалізує додаток для роботи з об’єктами статистичних даних у Kst. Comment[x-test]=xxImplements a Statistics Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/statistics/statisticsconfig.ui0000644000175000017500000000304312277111530024036 0ustar synthsynth StatisticsConfig 0 0 429 57 400 0 0 0 Input Vector false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/dataobject/statistics/statistics.pro0000644000175000017500000000024612277111530023035 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_statistics) SOURCES += \ statistics.cpp HEADERS += \ statistics.h FORMS += statisticsconfig.ui Kst-2.0.8/src/plugins/dataobject/statistics/statistics.h0000644000175000017500000000534012277111530022464 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STATISTICSPLUGIN_H #define STATISTICSPLUGIN_H #include #include #include class StatisticsSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: StatisticsSource(Kst::ObjectStore *store); ~StatisticsSource(); private: void swap( double* pData, int iOne, int iTwo ); void quicksort( double* pData, int iLeft, int iRight ); friend class Kst::ObjectStore; }; class StatisticsPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~StatisticsPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/crossspectrum/0000755000175000017500000000000012362705136020647 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/crossspectrum/fftsg_h.c0000644000175000017500000025776012277111530022446 0ustar synthsynth/* Copyright(C) 1996-2001 Takuya OOURA email: ooura@mmm.t.u-tokyo.ac.jp download: http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html You may use, copy, modify this code for any purpose and without fee. */ /* Fast Fourier/Cosine/Sine Transform dimension :one data length :power of 2 decimation :frequency radix :split-radix data :inplace table :not use functions cdft: Complex Discrete Fourier Transform rdft: Real Discrete Fourier Transform ddct: Discrete Cosine Transform ddst: Discrete Sine Transform dfct: Cosine Transform of RDFT (Real Symmetric DFT) dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) function prototypes void cdft(int, int, double *); void rdft(int, int, double *); void ddct(int, int, double *); void ddst(int, int, double *); void dfct(int, double *); void dfst(int, double *); macro definitions USE_CDFT_PTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=8192 CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536 USE_CDFT_WINTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=32768 CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288 -------- Complex DFT (Discrete Fourier Transform) -------- [definition] X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k cdft(2*n, 1, a); cdft(2*n, -1, a); [parameters] 2*n :data length (int) n >= 1, n = power of 2 a[0...2*n-1] :input/output data (double *) input data a[2*j] = Re(x[j]), a[2*j+1] = Im(x[j]), 0<=j RDFT R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0 IRDFT (excluding scale) a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k rdft(n, 1, a); rdft(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[2*k] = R[k], 0<=k input data a[2*j] = R[j], 0<=j IDCT (excluding scale) C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k DCT C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k ddct(n, 1, a); ddct(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = C[k], 0<=k IDST (excluding scale) S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k DST S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0 ddst(n, 1, a); ddst(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) input data a[j] = A[j], 0 output data a[k] = S[k], 0= 2, n = power of 2 a[0...n] :input/output data (double *) output data a[k] = C[k], 0<=k<=n [remark] Inverse of a[0] *= 0.5; a[n] *= 0.5; dfct(n, a); is a[0] *= 0.5; a[n] *= 0.5; dfct(n, a); for (j = 0; j <= n; j++) { a[j] *= 2.0 / n; } . -------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- [definition] S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = S[k], 0= 0) { cftfsub(n, a); } else { cftbsub(n, a); } } void rdft(int n, int isgn, double *a) { double xi; if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xi = a[0] - a[1]; a[0] += a[1]; a[1] = xi; } else { a[1] = 0.5 * (a[0] - a[1]); a[0] -= a[1]; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } } static void ddct(int n, int isgn, double *a) { int j; double xr; if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = a[j] - a[j - 1]; a[j] += a[j - 1]; } a[1] = a[0] - xr; a[0] += xr; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } if (n > 4) { dctsub(n, a); } else { dctsub4(n, a); } if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = a[j] - a[j + 1]; a[j] += a[j + 1]; } a[n - 1] = xr; } } static void ddst(int n, int isgn, double *a) { int j; double xr; if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = -a[j] - a[j - 1]; a[j] -= a[j - 1]; } a[1] = a[0] + xr; a[0] -= xr; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } if (n > 4) { dstsub(n, a); } else { dstsub4(n, a); } if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = -a[j] - a[j + 1]; a[j] -= a[j + 1]; } a[n - 1] = -xr; } } void dfct(int n, double *a) { int j, k, m, mh; double xr, xi, yr, yi, an; m = n >> 1; for (j = 0; j < m; j++) { k = n - j; xr = a[j] + a[k]; a[j] -= a[k]; a[k] = xr; } an = a[n]; while (m >= 2) { ddct(m, 1, a); if (m > 2) { bitrv1(m, a); } mh = m >> 1; xi = a[m]; a[m] = a[0]; a[0] = an - xi; an += xi; for (j = 1; j < mh; j++) { k = m - j; xr = a[m + k]; xi = a[m + j]; yr = a[j]; yi = a[k]; a[m + j] = yr; a[m + k] = yi; a[j] = xr - xi; a[k] = xr + xi; } xr = a[mh]; a[mh] = a[m + mh]; a[m + mh] = xr; m = mh; } xi = a[1]; a[1] = a[0]; a[0] = an + xi; a[n] = an - xi; if (n > 2) { bitrv1(n, a); } } void dfst(int n, double *a) { int j, k, m, mh; double xr, xi, yr, yi; m = n >> 1; for (j = 1; j < m; j++) { k = n - j; xr = a[j] - a[k]; a[j] += a[k]; a[k] = xr; } a[0] = a[m]; while (m >= 2) { ddst(m, 1, a); if (m > 2) { bitrv1(m, a); } mh = m >> 1; for (j = 1; j < mh; j++) { k = m - j; xr = a[m + k]; xi = a[m + j]; yr = a[j]; yi = a[k]; a[m + j] = yr; a[m + k] = yi; a[j] = xr + xi; a[k] = xr - xi; } a[m] = a[0]; a[0] = a[m + mh]; a[m + mh] = a[mh]; m = mh; } a[1] = a[0]; a[0] = 0; if (n > 2) { bitrv1(n, a); } } /* -------- child routines -------- */ #include #ifndef M_PI_2 #define M_PI_2 1.570796326794896619231321691639751442098584699687 #endif #ifndef WR5000 /* cos(M_PI_2*0.5000) */ #define WR5000 0.707106781186547524400844362104849039284835937688 #endif #ifndef WR2500 /* cos(M_PI_2*0.2500) */ #define WR2500 0.923879532511286756128183189396788286822416625863 #endif #ifndef WI2500 /* sin(M_PI_2*0.2500) */ #define WI2500 0.382683432365089771728459984030398866761344562485 #endif #ifndef WR1250 /* cos(M_PI_2*0.1250) */ #define WR1250 0.980785280403230449126182236134239036973933730893 #endif #ifndef WI1250 /* sin(M_PI_2*0.1250) */ #define WI1250 0.195090322016128267848284868477022240927691617751 #endif #ifndef WR3750 /* cos(M_PI_2*0.3750) */ #define WR3750 0.831469612302545237078788377617905756738560811987 #endif #ifndef WI3750 /* sin(M_PI_2*0.3750) */ #define WI3750 0.555570233019602224742830813948532874374937190754 #endif #ifdef USE_CDFT_PTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 8192 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 65536 #endif #include #include #include #define cdft_thread_t pthread_t #define cdft_thread_create(thp,func,argp) { \ if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ if (pthread_join(th, NULL) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #endif /* USE_CDFT_PTHREADS */ #ifdef USE_CDFT_WINTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 32768 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 524288 #endif #include #include #include #define cdft_thread_t HANDLE #define cdft_thread_create(thp,func,argp) { \ DWORD thid; \ *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ if (*(thp) == 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ WaitForSingleObject(th, INFINITE); \ CloseHandle(th); \ } #endif /* USE_CDFT_WINTHREADS */ #ifndef CDFT_LOOP_DIV /* control of the CDFT's speed & tolerance */ #define CDFT_LOOP_DIV 32 #endif #ifndef RDFT_LOOP_DIV /* control of the RDFT's speed & tolerance */ #define RDFT_LOOP_DIV 64 #endif #ifndef DCST_LOOP_DIV /* control of the DCT,DST's speed & tolerance */ #define DCST_LOOP_DIV 64 #endif static void cftfsub(int n, double *a) { if (n > 8) { if (n > 32) { cftmdl1(n, a); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a); } else if (n > 128) { cftleaf(n, 1, a); } else { cftfx41(n, a); } bitrv2(n, a); } else if (n == 32) { cftf161(a); bitrv216(a); } else { cftf081(a); bitrv208(a); } } else if (n == 8) { cftf040(a); } else if (n == 4) { cftx020(a); } } static void cftbsub(int n, double *a) { if (n > 8) { if (n > 32) { cftb1st(n, a); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a); } else if (n > 128) { cftleaf(n, 1, a); } else { cftfx41(n, a); } bitrv2conj(n, a); } else if (n == 32) { cftf161(a); bitrv216neg(a); } else { cftf081(a); bitrv208neg(a); } } else if (n == 8) { cftb040(a); } else if (n == 4) { cftx020(a); } } void bitrv2(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double xr, xi, yr, yi; m = 4; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; if (l == 8) { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= 2; k1 -= nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh + 2; k1 += nh + 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh - m; k1 += 2 * m - 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } else { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } } void bitrv2conj(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double xr, xi, yr, yi; m = 4; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; if (l == 8) { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= 2; k1 -= nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh + 2; k1 += nh + 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh - m; k1 += 2 * m - 2; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } else { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; _j1 += m; k1 += m; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } } void bitrv216(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; a[2] = x8r; a[3] = x8i; a[4] = x4r; a[5] = x4i; a[6] = x12r; a[7] = x12i; a[8] = x2r; a[9] = x2i; a[10] = x10r; a[11] = x10i; a[14] = x14r; a[15] = x14i; a[16] = x1r; a[17] = x1i; a[20] = x5r; a[21] = x5i; a[22] = x13r; a[23] = x13i; a[24] = x3r; a[25] = x3i; a[26] = x11r; a[27] = x11i; a[28] = x7r; a[29] = x7i; } void bitrv216neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i, x15r, x15i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x9r = a[18]; x9i = a[19]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; x15r = a[30]; x15i = a[31]; a[2] = x15r; a[3] = x15i; a[4] = x7r; a[5] = x7i; a[6] = x11r; a[7] = x11i; a[8] = x3r; a[9] = x3i; a[10] = x13r; a[11] = x13i; a[12] = x5r; a[13] = x5i; a[14] = x9r; a[15] = x9i; a[16] = x1r; a[17] = x1i; a[18] = x14r; a[19] = x14i; a[20] = x6r; a[21] = x6i; a[22] = x10r; a[23] = x10i; a[24] = x2r; a[25] = x2i; a[26] = x12r; a[27] = x12i; a[28] = x4r; a[29] = x4i; a[30] = x8r; a[31] = x8i; } void bitrv208(double *a) { double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; x1r = a[2]; x1i = a[3]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x6r = a[12]; x6i = a[13]; a[2] = x4r; a[3] = x4i; a[6] = x6r; a[7] = x6i; a[8] = x1r; a[9] = x1i; a[12] = x3r; a[13] = x3i; } void bitrv208neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; a[2] = x7r; a[3] = x7i; a[4] = x3r; a[5] = x3i; a[6] = x5r; a[7] = x5i; a[8] = x1r; a[9] = x1i; a[10] = x6r; a[11] = x6i; a[12] = x2r; a[13] = x2i; a[14] = x4r; a[15] = x4i; } void bitrv1(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double x; nh = n >> 1; x = a[1]; a[1] = a[nh]; a[nh] = x; m = 2; for (l = n >> 2; l > 2; l >>= 2) { m <<= 1; } if (l == 2) { _j1 = m + 1; k1 = m + nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); k = k0; for (j = _j0; j < _j0 + k0; j += 2) { x = a[j]; a[j] = a[k]; a[k] = x; _j1 = j + m; k1 = k + m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += nh; k1++; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= m; k1 -= m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1++; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += m; k1 += m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= nh; k1--; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= m; k1 -= m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 1; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += m; k1 += m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; } } else { _j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); k = k0; for (j = _j0; j < _j0 + k0; j += 2) { x = a[j]; a[j] = a[k]; a[k] = x; _j1 = j + nh; k1 = k + 1; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1++; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= nh; k1--; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 1; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; } } } void cftb1st(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; mh = n >> 3; m = 2 * mh; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = -a[1] - a[j2 + 1]; x1r = a[0] - a[j2]; x1i = -a[1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; a[j2] = x1r + x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r - x3i; a[j3 + 1] = x1i - x3r; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; ew = M_PI_2 / m; w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wd1r -= ss1 * wk1i; wd1i += ss1 * wk1r; wd3r -= ss3 * wk3i; wd3i += ss3 * wk3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = -a[j + 1] - a[j2 + 1]; x1r = a[j] - a[j2]; x1i = -a[j + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = a[j + 2] + a[j2 + 2]; x0i = -a[j + 3] - a[j2 + 3]; x1r = a[j + 2] - a[j2 + 2]; x1i = -a[j + 3] + a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[j + 2] = x0r + x2r; a[j + 3] = x0i - x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] + a[j2]; x0i = -a[_j0 + 1] - a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = -a[_j0 + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = -a[_j0 - 1] - a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = -a[_j0 - 1] + a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i - x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; wk1r -= ss1 * wd1i; wk1i += ss1 * wd1r; wk3r -= ss3 * wd3i; wk3i += ss3 * wd3r; } if (i0 == mh - 4) { break; } wd1r = cos(ew * i0); wd1i = sin(ew * i0); wd3i = 4 * wd1i * wd1r; wd3r = wd1r - wd3i * wd1i; wd3i = wd1i - wd3i * wd1r; wk1r = w1r * wd1r - w1i * wd1i; wk1i = w1r * wd1i + w1i * wd1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; i = i0; } wd1r = WR5000; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = -a[_j0 - 1] - a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = -a[_j0 - 1] + a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i - x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[_j0] + a[j2]; x0i = -a[_j0 + 1] - a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = -a[_j0 + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wd1r * (x0r - x0i); a[j2 + 1] = wd1r * (x0i + x0r); x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = -wd1r * (x0r + x0i); a[j3 + 1] = -wd1r * (x0i - x0r); x0r = a[_j0 + 2] + a[j2 + 2]; x0i = -a[_j0 + 3] - a[j2 + 3]; x1r = a[_j0 + 2] - a[j2 + 2]; x1i = -a[_j0 + 3] + a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[_j0 + 2] = x0r + x2r; a[_j0 + 3] = x0i - x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } #ifdef USE_CDFT_THREADS struct cdft_arg_st { int n0; int n; double *a; }; typedef struct cdft_arg_st cdft_arg_t; void cftrec4_th(int n, double *a) { void *cftrec1_th(void *p); void *cftrec2_th(void *p); int i, idiv4, m, nthread; cdft_thread_t th[4]; cdft_arg_t ag[4]; nthread = 2; idiv4 = 0; m = n >> 1; if (n > CDFT_4THREADS_BEGIN_N) { nthread = 4; idiv4 = 1; m >>= 1; } for (i = 0; i < nthread; i++) { ag[i].n0 = n; ag[i].n = m; ag[i].a = &a[i * m]; if (i != idiv4) { cdft_thread_create(&th[i], cftrec1_th, &ag[i]); } else { cdft_thread_create(&th[i], cftrec2_th, &ag[i]); } } for (i = 0; i < nthread; i++) { cdft_thread_wait(th[i]); } } void *cftrec1_th(void *p) { int cfttree(int n, int j, int k, double *a); void cftleaf(int n, int isplt, double *a); void cftmdl1(int n, double *a); int isplt, j, k, m, n, n0; double *a; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; m = n0; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m]); } cftleaf(m, 1, &a[n - m]); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } return (void *) 0; } void *cftrec2_th(void *p) { int cfttree(int n, int j, int k, double *a); void cftleaf(int n, int isplt, double *a); void cftmdl2(int n, double *a); int isplt, j, k, m, n, n0; double *a; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; k = 1; m = n0; while (m > 512) { m >>= 2; k <<= 2; cftmdl2(m, &a[n - m]); } cftleaf(m, 0, &a[n - m]); k >>= 1; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } return (void *) 0; } #endif /* USE_CDFT_THREADS */ void cftrec4(int n, double *a) { int isplt, j, k, m; m = n; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m]); } cftleaf(m, 1, &a[n - m]); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } } int cfttree(int n, int j, int k, double *a) { int i, isplt, m; if ((k & 3) != 0) { isplt = k & 1; if (isplt != 0) { cftmdl1(n, &a[j - n]); } else { cftmdl2(n, &a[j - n]); } } else { m = n; for (i = k; (i & 3) == 0; i >>= 2) { m <<= 2; } isplt = i & 1; if (isplt != 0) { while (m > 128) { cftmdl1(m, &a[j - m]); m >>= 2; } } else { while (m > 128) { cftmdl2(m, &a[j - m]); m >>= 2; } } } return isplt; } void cftleaf(int n, int isplt, double *a) { if (n == 512) { cftmdl1(128, a); cftf161(a); cftf162(&a[32]); cftf161(&a[64]); cftf161(&a[96]); cftmdl2(128, &a[128]); cftf161(&a[128]); cftf162(&a[160]); cftf161(&a[192]); cftf162(&a[224]); cftmdl1(128, &a[256]); cftf161(&a[256]); cftf162(&a[288]); cftf161(&a[320]); cftf161(&a[352]); if (isplt != 0) { cftmdl1(128, &a[384]); cftf161(&a[480]); } else { cftmdl2(128, &a[384]); cftf162(&a[480]); } cftf161(&a[384]); cftf162(&a[416]); cftf161(&a[448]); } else { cftmdl1(64, a); cftf081(a); cftf082(&a[16]); cftf081(&a[32]); cftf081(&a[48]); cftmdl2(64, &a[64]); cftf081(&a[64]); cftf082(&a[80]); cftf081(&a[96]); cftf082(&a[112]); cftmdl1(64, &a[128]); cftf081(&a[128]); cftf082(&a[144]); cftf081(&a[160]); cftf081(&a[176]); if (isplt != 0) { cftmdl1(64, &a[192]); cftf081(&a[240]); } else { cftmdl2(64, &a[192]); cftf082(&a[240]); } cftf081(&a[192]); cftf082(&a[208]); cftf081(&a[224]); } } void cftmdl1(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; mh = n >> 3; m = 2 * mh; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = a[1] + a[j2 + 1]; x1r = a[0] - a[j2]; x1i = a[1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; a[j2] = x1r - x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i - x3r; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; ew = M_PI_2 / m; w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wd1r -= ss1 * wk1i; wd1i += ss1 * wk1r; wd3r -= ss3 * wk3i; wd3i += ss3 * wk3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = a[j + 1] + a[j2 + 1]; x1r = a[j] - a[j2]; x1i = a[j + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = a[j + 2] + a[j2 + 2]; x0i = a[j + 3] + a[j2 + 3]; x1r = a[j + 2] - a[j2 + 2]; x1i = a[j + 3] - a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[j + 2] = x0r + x2r; a[j + 3] = x0i + x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] + a[j2]; x0i = a[_j0 + 1] + a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = a[_j0 + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = a[_j0 - 1] + a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = a[_j0 - 1] - a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i + x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; wk1r -= ss1 * wd1i; wk1i += ss1 * wd1r; wk3r -= ss3 * wd3i; wk3i += ss3 * wd3r; } if (i0 == mh - 4) { break; } wd1r = cos(ew * i0); wd1i = sin(ew * i0); wd3i = 4 * wd1i * wd1r; wd3r = wd1r - wd3i * wd1i; wd3i = wd1i - wd3i * wd1r; wk1r = w1r * wd1r - w1i * wd1i; wk1i = w1r * wd1i + w1i * wd1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; i = i0; } wd1r = WR5000; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = a[_j0 - 1] + a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = a[_j0 - 1] - a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i + x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[_j0] + a[j2]; x0i = a[_j0 + 1] + a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = a[_j0 + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wd1r * (x0r - x0i); a[j2 + 1] = wd1r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = -wd1r * (x0r + x0i); a[j3 + 1] = -wd1r * (x0i - x0r); x0r = a[_j0 + 2] + a[j2 + 2]; x0i = a[_j0 + 3] + a[j2 + 3]; x1r = a[_j0 + 2] - a[j2 + 2]; x1i = a[_j0 + 3] - a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[_j0 + 2] = x0r + x2r; a[_j0 + 3] = x0i + x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } void cftmdl2(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wn4r, wk1r, wk1i, wk3r, wk3i, wl1r, wl1i, wl3r, wl3i, wd1r, wd1i, wd3r, wd3i, we1r, we1i, we3r, we3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; mh = n >> 3; m = 2 * mh; wn4r = WR5000; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] - a[j2 + 1]; x0i = a[1] + a[j2]; x1r = a[0] + a[j2 + 1]; x1i = a[1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wn4r * (x2r - x2i); y0i = wn4r * (x2i + x2r); a[0] = x0r + y0r; a[1] = x0i + y0i; a[_j1] = x0r - y0r; a[_j1 + 1] = x0i - y0i; y0r = wn4r * (x3r - x3i); y0i = wn4r * (x3i + x3r); a[j2] = x1r - y0i; a[j2 + 1] = x1i + y0r; a[j3] = x1r + y0i; a[j3 + 1] = x1i - y0r; wl1r = 1; wl1i = 0; wl3r = 1; wl3i = 0; we1r = wn4r; we1i = wn4r; we3r = -wn4r; we3i = -wn4r; ew = M_PI_2 / (2 * m); w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; wd1r = wn4r * (w1r - w1i); wd1i = wn4r * (w1i + w1r); ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; wd3r = -wn4r * (wk3r - wk3i); wd3i = -wn4r * (wk3i + wk3r); i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wl1r -= ss1 * wk1i; wl1i += ss1 * wk1r; wl3r -= ss3 * wk3i; wl3i += ss3 * wk3r; we1r -= ss1 * wd1i; we1i += ss1 * wd1r; we3r -= ss3 * wd3i; we3i += ss3 * wd3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] - a[j2 + 1]; x0i = a[j + 1] + a[j2]; x1r = a[j] + a[j2 + 1]; x1i = a[j + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wd1r * x2r - wd1i * x2i; y2i = wd1r * x2i + wd1i * x2r; a[j] = y0r + y2r; a[j + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wk3r * x1r + wk3i * x1i; y0i = wk3r * x1i - wk3i * x1r; y2r = wd3r * x3r + wd3i * x3i; y2i = wd3r * x3i - wd3i * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; x0r = a[j + 2] - a[j2 + 3]; x0i = a[j + 3] + a[j2 + 2]; x1r = a[j + 2] + a[j2 + 3]; x1i = a[j + 3] - a[j2 + 2]; x2r = a[_j1 + 2] - a[j3 + 3]; x2i = a[_j1 + 3] + a[j3 + 2]; x3r = a[_j1 + 2] + a[j3 + 3]; x3i = a[_j1 + 3] - a[j3 + 2]; y0r = wl1r * x0r - wl1i * x0i; y0i = wl1r * x0i + wl1i * x0r; y2r = we1r * x2r - we1i * x2i; y2i = we1r * x2i + we1i * x2r; a[j + 2] = y0r + y2r; a[j + 3] = y0i + y2i; a[_j1 + 2] = y0r - y2r; a[_j1 + 3] = y0i - y2i; y0r = wl3r * x1r + wl3i * x1i; y0i = wl3r * x1i - wl3i * x1r; y2r = we3r * x3r + we3i * x3i; y2i = we3r * x3i - we3i * x3r; a[j2 + 2] = y0r + y2r; a[j2 + 3] = y0i + y2i; a[j3 + 2] = y0r - y2r; a[j3 + 3] = y0i - y2i; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] - a[j2 + 1]; x0i = a[_j0 + 1] + a[j2]; x1r = a[_j0] + a[j2 + 1]; x1i = a[_j0 + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wd1i * x0r - wd1r * x0i; y0i = wd1i * x0i + wd1r * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[_j0] = y0r + y2r; a[_j0 + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wd3i * x1r + wd3r * x1i; y0i = wd3i * x1i - wd3r * x1r; y2r = wk3i * x3r + wk3r * x3i; y2i = wk3i * x3i - wk3r * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; x0r = a[_j0 - 2] - a[j2 - 1]; x0i = a[_j0 - 1] + a[j2 - 2]; x1r = a[_j0 - 2] + a[j2 - 1]; x1i = a[_j0 - 1] - a[j2 - 2]; x2r = a[_j1 - 2] - a[j3 - 1]; x2i = a[_j1 - 1] + a[j3 - 2]; x3r = a[_j1 - 2] + a[j3 - 1]; x3i = a[_j1 - 1] - a[j3 - 2]; y0r = we1i * x0r - we1r * x0i; y0i = we1i * x0i + we1r * x0r; y2r = wl1i * x2r - wl1r * x2i; y2i = wl1i * x2i + wl1r * x2r; a[_j0 - 2] = y0r + y2r; a[_j0 - 1] = y0i + y2i; a[_j1 - 2] = y0r - y2r; a[_j1 - 1] = y0i - y2i; y0r = we3i * x1r + we3r * x1i; y0i = we3i * x1i - we3r * x1r; y2r = wl3i * x3r + wl3r * x3i; y2i = wl3i * x3i - wl3r * x3r; a[j2 - 2] = y0r + y2r; a[j2 - 1] = y0i + y2i; a[j3 - 2] = y0r - y2r; a[j3 - 1] = y0i - y2i; wk1r -= ss1 * wl1i; wk1i += ss1 * wl1r; wk3r -= ss3 * wl3i; wk3i += ss3 * wl3r; wd1r -= ss1 * we1i; wd1i += ss1 * we1r; wd3r -= ss3 * we3i; wd3i += ss3 * we3r; } if (i0 == mh - 4) { break; } wl1r = cos(ew * i0); wl1i = sin(ew * i0); wl3i = 4 * wl1i * wl1r; wl3r = wl1r - wl3i * wl1i; wl3i = wl1i - wl3i * wl1r; we1r = wn4r * (wl1r - wl1i); we1i = wn4r * (wl1i + wl1r); we3r = -wn4r * (wl3r - wl3i); we3i = -wn4r * (wl3i + wl3r); wk1r = w1r * wl1r - w1i * wl1i; wk1i = w1r * wl1i + w1i * wl1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; wd1r = wn4r * (wk1r - wk1i); wd1i = wn4r * (wk1i + wk1r); wd3r = -wn4r * (wk3r - wk3i); wd3i = -wn4r * (wk3i + wk3r); i = i0; } wl1r = WR2500; wl1i = WI2500; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] - a[j2 - 1]; x0i = a[_j0 - 1] + a[j2 - 2]; x1r = a[_j0 - 2] + a[j2 - 1]; x1i = a[_j0 - 1] - a[j2 - 2]; x2r = a[_j1 - 2] - a[j3 - 1]; x2i = a[_j1 - 1] + a[j3 - 2]; x3r = a[_j1 - 2] + a[j3 - 1]; x3i = a[_j1 - 1] - a[j3 - 2]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wd1r * x2r - wd1i * x2i; y2i = wd1r * x2i + wd1i * x2r; a[_j0 - 2] = y0r + y2r; a[_j0 - 1] = y0i + y2i; a[_j1 - 2] = y0r - y2r; a[_j1 - 1] = y0i - y2i; y0r = wk3r * x1r + wk3i * x1i; y0i = wk3r * x1i - wk3i * x1r; y2r = wd3r * x3r + wd3i * x3i; y2i = wd3r * x3i - wd3i * x3r; a[j2 - 2] = y0r + y2r; a[j2 - 1] = y0i + y2i; a[j3 - 2] = y0r - y2r; a[j3 - 1] = y0i - y2i; x0r = a[_j0] - a[j2 + 1]; x0i = a[_j0 + 1] + a[j2]; x1r = a[_j0] + a[j2 + 1]; x1i = a[_j0 + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wl1r * x0r - wl1i * x0i; y0i = wl1r * x0i + wl1i * x0r; y2r = wl1i * x2r - wl1r * x2i; y2i = wl1i * x2i + wl1r * x2r; a[_j0] = y0r + y2r; a[_j0 + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wl1i * x1r - wl1r * x1i; y0i = wl1i * x1i + wl1r * x1r; y2r = wl1r * x3r - wl1i * x3i; y2i = wl1r * x3i + wl1i * x3r; a[j2] = y0r - y2r; a[j2 + 1] = y0i - y2i; a[j3] = y0r + y2r; a[j3 + 1] = y0i + y2i; x0r = a[_j0 + 2] - a[j2 + 3]; x0i = a[_j0 + 3] + a[j2 + 2]; x1r = a[_j0 + 2] + a[j2 + 3]; x1i = a[_j0 + 3] - a[j2 + 2]; x2r = a[_j1 + 2] - a[j3 + 3]; x2i = a[_j1 + 3] + a[j3 + 2]; x3r = a[_j1 + 2] + a[j3 + 3]; x3i = a[_j1 + 3] - a[j3 + 2]; y0r = wd1i * x0r - wd1r * x0i; y0i = wd1i * x0i + wd1r * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[_j0 + 2] = y0r + y2r; a[_j0 + 3] = y0i + y2i; a[_j1 + 2] = y0r - y2r; a[_j1 + 3] = y0i - y2i; y0r = wd3i * x1r + wd3r * x1i; y0i = wd3i * x1i - wd3r * x1r; y2r = wk3i * x3r + wk3r * x3i; y2i = wk3i * x3i - wk3r * x3r; a[j2 + 2] = y0r + y2r; a[j2 + 3] = y0i + y2i; a[j3 + 2] = y0r - y2r; a[j3 + 3] = y0i - y2i; } void cftfx41(int n, double *a) { if (n == 128) { cftf161(a); cftf162(&a[32]); cftf161(&a[64]); cftf161(&a[96]); } else { cftf081(a); cftf082(&a[16]); cftf081(&a[32]); cftf081(&a[48]); } } void cftf161(double *a) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = WR5000; wk1r = WR2500; wk1i = WI2500; x0r = a[0] + a[16]; x0i = a[1] + a[17]; x1r = a[0] - a[16]; x1i = a[1] - a[17]; x2r = a[8] + a[24]; x2i = a[9] + a[25]; x3r = a[8] - a[24]; x3i = a[9] - a[25]; y0r = x0r + x2r; y0i = x0i + x2i; y4r = x0r - x2r; y4i = x0i - x2i; y8r = x1r - x3i; y8i = x1i + x3r; y12r = x1r + x3i; y12i = x1i - x3r; x0r = a[2] + a[18]; x0i = a[3] + a[19]; x1r = a[2] - a[18]; x1i = a[3] - a[19]; x2r = a[10] + a[26]; x2i = a[11] + a[27]; x3r = a[10] - a[26]; x3i = a[11] - a[27]; y1r = x0r + x2r; y1i = x0i + x2i; y5r = x0r - x2r; y5i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y9r = wk1r * x0r - wk1i * x0i; y9i = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y13r = wk1i * x0r - wk1r * x0i; y13i = wk1i * x0i + wk1r * x0r; x0r = a[4] + a[20]; x0i = a[5] + a[21]; x1r = a[4] - a[20]; x1i = a[5] - a[21]; x2r = a[12] + a[28]; x2i = a[13] + a[29]; x3r = a[12] - a[28]; x3i = a[13] - a[29]; y2r = x0r + x2r; y2i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y10r = wn4r * (x0r - x0i); y10i = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; y14r = wn4r * (x0r + x0i); y14i = wn4r * (x0i - x0r); x0r = a[6] + a[22]; x0i = a[7] + a[23]; x1r = a[6] - a[22]; x1i = a[7] - a[23]; x2r = a[14] + a[30]; x2i = a[15] + a[31]; x3r = a[14] - a[30]; x3i = a[15] - a[31]; y3r = x0r + x2r; y3i = x0i + x2i; y7r = x0r - x2r; y7i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y11r = wk1i * x0r - wk1r * x0i; y11i = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y15r = wk1r * x0r - wk1i * x0i; y15i = wk1r * x0i + wk1i * x0r; x0r = y12r - y14r; x0i = y12i - y14i; x1r = y12r + y14r; x1i = y12i + y14i; x2r = y13r - y15r; x2i = y13i - y15i; x3r = y13r + y15r; x3i = y13i + y15i; a[24] = x0r + x2r; a[25] = x0i + x2i; a[26] = x0r - x2r; a[27] = x0i - x2i; a[28] = x1r - x3i; a[29] = x1i + x3r; a[30] = x1r + x3i; a[31] = x1i - x3r; x0r = y8r + y10r; x0i = y8i + y10i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; x3r = y9r - y11r; x3i = y9i - y11i; a[16] = x0r + x2r; a[17] = x0i + x2i; a[18] = x0r - x2r; a[19] = x0i - x2i; a[20] = x1r - x3i; a[21] = x1i + x3r; a[22] = x1r + x3i; a[23] = x1i - x3r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); x0r = y5r + y7i; x0i = y5i - y7r; x3r = wn4r * (x0r - x0i); x3i = wn4r * (x0i + x0r); x0r = y4r - y6i; x0i = y4i + y6r; x1r = y4r + y6i; x1i = y4i - y6r; a[8] = x0r + x2r; a[9] = x0i + x2i; a[10] = x0r - x2r; a[11] = x0i - x2i; a[12] = x1r - x3i; a[13] = x1i + x3r; a[14] = x1r + x3i; a[15] = x1i - x3r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r + y3r; x2i = y1i + y3i; x3r = y1r - y3r; x3i = y1i - y3i; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x0r - x2r; a[3] = x0i - x2i; a[4] = x1r - x3i; a[5] = x1i + x3r; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftf162(double *a) { double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, x0r, x0i, x1r, x1i, x2r, x2i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = WR5000; wk1r = WR1250; wk1i = WI1250; wk2r = WR2500; wk2i = WI2500; wk3r = WR3750; wk3i = WI3750; x1r = a[0] - a[17]; x1i = a[1] + a[16]; x0r = a[8] - a[25]; x0i = a[9] + a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y0r = x1r + x2r; y0i = x1i + x2i; y4r = x1r - x2r; y4i = x1i - x2i; x1r = a[0] + a[17]; x1i = a[1] - a[16]; x0r = a[8] + a[25]; x0i = a[9] - a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y8r = x1r - x2i; y8i = x1i + x2r; y12r = x1r + x2i; y12i = x1i - x2r; x0r = a[2] - a[19]; x0i = a[3] + a[18]; x1r = wk1r * x0r - wk1i * x0i; x1i = wk1r * x0i + wk1i * x0r; x0r = a[10] - a[27]; x0i = a[11] + a[26]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y1r = x1r + x2r; y1i = x1i + x2i; y5r = x1r - x2r; y5i = x1i - x2i; x0r = a[2] + a[19]; x0i = a[3] - a[18]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[10] + a[27]; x0i = a[11] - a[26]; x2r = wk1r * x0r + wk1i * x0i; x2i = wk1r * x0i - wk1i * x0r; y9r = x1r - x2r; y9i = x1i - x2i; y13r = x1r + x2r; y13i = x1i + x2i; x0r = a[4] - a[21]; x0i = a[5] + a[20]; x1r = wk2r * x0r - wk2i * x0i; x1i = wk2r * x0i + wk2i * x0r; x0r = a[12] - a[29]; x0i = a[13] + a[28]; x2r = wk2i * x0r - wk2r * x0i; x2i = wk2i * x0i + wk2r * x0r; y2r = x1r + x2r; y2i = x1i + x2i; y6r = x1r - x2r; y6i = x1i - x2i; x0r = a[4] + a[21]; x0i = a[5] - a[20]; x1r = wk2i * x0r - wk2r * x0i; x1i = wk2i * x0i + wk2r * x0r; x0r = a[12] + a[29]; x0i = a[13] - a[28]; x2r = wk2r * x0r - wk2i * x0i; x2i = wk2r * x0i + wk2i * x0r; y10r = x1r - x2r; y10i = x1i - x2i; y14r = x1r + x2r; y14i = x1i + x2i; x0r = a[6] - a[23]; x0i = a[7] + a[22]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[14] - a[31]; x0i = a[15] + a[30]; x2r = wk1i * x0r - wk1r * x0i; x2i = wk1i * x0i + wk1r * x0r; y3r = x1r + x2r; y3i = x1i + x2i; y7r = x1r - x2r; y7i = x1i - x2i; x0r = a[6] + a[23]; x0i = a[7] - a[22]; x1r = wk1i * x0r + wk1r * x0i; x1i = wk1i * x0i - wk1r * x0r; x0r = a[14] + a[31]; x0i = a[15] - a[30]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y11r = x1r + x2r; y11i = x1i + x2i; y15r = x1r - x2r; y15i = x1i - x2i; x1r = y0r + y2r; x1i = y0i + y2i; x2r = y1r + y3r; x2i = y1i + y3i; a[0] = x1r + x2r; a[1] = x1i + x2i; a[2] = x1r - x2r; a[3] = x1i - x2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r - y3r; x2i = y1i - y3i; a[4] = x1r - x2i; a[5] = x1i + x2r; a[6] = x1r + x2i; a[7] = x1i - x2r; x1r = y4r - y6i; x1i = y4i + y6r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[8] = x1r + x2r; a[9] = x1i + x2i; a[10] = x1r - x2r; a[11] = x1i - x2i; x1r = y4r + y6i; x1i = y4i - y6r; x0r = y5r + y7i; x0i = y5i - y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[12] = x1r - x2i; a[13] = x1i + x2r; a[14] = x1r + x2i; a[15] = x1i - x2r; x1r = y8r + y10r; x1i = y8i + y10i; x2r = y9r - y11r; x2i = y9i - y11i; a[16] = x1r + x2r; a[17] = x1i + x2i; a[18] = x1r - x2r; a[19] = x1i - x2i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; a[20] = x1r - x2i; a[21] = x1i + x2r; a[22] = x1r + x2i; a[23] = x1i - x2r; x1r = y12r - y14i; x1i = y12i + y14r; x0r = y13r + y15i; x0i = y13i - y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[24] = x1r + x2r; a[25] = x1i + x2i; a[26] = x1r - x2r; a[27] = x1i - x2i; x1r = y12r + y14i; x1i = y12i - y14r; x0r = y13r - y15i; x0i = y13i + y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[28] = x1r - x2i; a[29] = x1i + x2r; a[30] = x1r + x2i; a[31] = x1i - x2r; } void cftf081(double *a) { double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = WR5000; x0r = a[0] + a[8]; x0i = a[1] + a[9]; x1r = a[0] - a[8]; x1i = a[1] - a[9]; x2r = a[4] + a[12]; x2i = a[5] + a[13]; x3r = a[4] - a[12]; x3i = a[5] - a[13]; y0r = x0r + x2r; y0i = x0i + x2i; y2r = x0r - x2r; y2i = x0i - x2i; y1r = x1r - x3i; y1i = x1i + x3r; y3r = x1r + x3i; y3i = x1i - x3r; x0r = a[2] + a[10]; x0i = a[3] + a[11]; x1r = a[2] - a[10]; x1i = a[3] - a[11]; x2r = a[6] + a[14]; x2i = a[7] + a[15]; x3r = a[6] - a[14]; x3i = a[7] - a[15]; y4r = x0r + x2r; y4i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; x2r = x1r + x3i; x2i = x1i - x3r; y5r = wn4r * (x0r - x0i); y5i = wn4r * (x0r + x0i); y7r = wn4r * (x2r - x2i); y7i = wn4r * (x2r + x2i); a[8] = y1r + y5r; a[9] = y1i + y5i; a[10] = y1r - y5r; a[11] = y1i - y5i; a[12] = y3r - y7i; a[13] = y3i + y7r; a[14] = y3r + y7i; a[15] = y3i - y7r; a[0] = y0r + y4r; a[1] = y0i + y4i; a[2] = y0r - y4r; a[3] = y0i - y4i; a[4] = y2r - y6i; a[5] = y2i + y6r; a[6] = y2r + y6i; a[7] = y2i - y6r; } void cftf082(double *a) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = WR5000; wk1r = WR2500; wk1i = WI2500; y0r = a[0] - a[9]; y0i = a[1] + a[8]; y1r = a[0] + a[9]; y1i = a[1] - a[8]; x0r = a[4] - a[13]; x0i = a[5] + a[12]; y2r = wn4r * (x0r - x0i); y2i = wn4r * (x0i + x0r); x0r = a[4] + a[13]; x0i = a[5] - a[12]; y3r = wn4r * (x0r - x0i); y3i = wn4r * (x0i + x0r); x0r = a[2] - a[11]; x0i = a[3] + a[10]; y4r = wk1r * x0r - wk1i * x0i; y4i = wk1r * x0i + wk1i * x0r; x0r = a[2] + a[11]; x0i = a[3] - a[10]; y5r = wk1i * x0r - wk1r * x0i; y5i = wk1i * x0i + wk1r * x0r; x0r = a[6] - a[15]; x0i = a[7] + a[14]; y6r = wk1i * x0r - wk1r * x0i; y6i = wk1i * x0i + wk1r * x0r; x0r = a[6] + a[15]; x0i = a[7] - a[14]; y7r = wk1r * x0r - wk1i * x0i; y7i = wk1r * x0i + wk1i * x0r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y4r + y6r; x1i = y4i + y6i; a[0] = x0r + x1r; a[1] = x0i + x1i; a[2] = x0r - x1r; a[3] = x0i - x1i; x0r = y0r - y2r; x0i = y0i - y2i; x1r = y4r - y6r; x1i = y4i - y6i; a[4] = x0r - x1i; a[5] = x0i + x1r; a[6] = x0r + x1i; a[7] = x0i - x1r; x0r = y1r - y3i; x0i = y1i + y3r; x1r = y5r - y7r; x1i = y5i - y7i; a[8] = x0r + x1r; a[9] = x0i + x1i; a[10] = x0r - x1r; a[11] = x0i - x1i; x0r = y1r + y3i; x0i = y1i - y3r; x1r = y5r + y7r; x1i = y5i + y7i; a[12] = x0r - x1i; a[13] = x0i + x1r; a[14] = x0r + x1i; a[15] = x0i - x1r; } void cftf040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r - x3i; a[3] = x1i + x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftb040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r + x3i; a[3] = x1i - x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r - x3i; a[7] = x1i + x3r; } void cftx020(double *a) { double x0r, x0i; x0r = a[0] - a[2]; x0i = a[1] - a[3]; a[0] += a[2]; a[1] += a[3]; a[2] = x0r; a[3] = x0i; } void rftfsub(int n, double *a) { int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[j + 2] -= yr; a[j + 3] -= yi; a[k - 2] += yr; a[k - 1] -= yi; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr - wki * xi; yi = wkr * xi + wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[2] -= yr; a[3] -= yi; a[n - 2] += yr; a[n - 1] -= yi; } void rftbsub(int n, double *a) { int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[j + 2] -= yr; a[j + 3] -= yi; a[k - 2] += yr; a[k - 1] -= yi; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr + wki * xi; yi = wkr * xi - wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[2] -= yr; a[3] -= yi; a[n - 2] += yr; a[n - 1] -= yi; } void dctsub(int n, double *a) { int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[j - 1] - wdr * a[k + 1]; xi = wdr * a[j - 1] + wdi * a[k + 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[j] - wkr * a[k]; yi = wkr * a[j] + wki * a[k]; wdr -= ss * wki; wdi += ss * wkr; a[k + 1] = xr; a[k] = yr; a[j - 1] = xi; a[j] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m - 1] - wdr * a[m + 1]; a[m - 1] = wdr * a[m - 1] + wdi * a[m + 1]; a[m + 1] = xr; a[m] *= WR5000; } void dstsub(int n, double *a) { int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[k + 1] - wdr * a[j - 1]; xi = wdr * a[k + 1] + wdi * a[j - 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[k] - wkr * a[j]; yi = wkr * a[k] + wki * a[j]; wdr -= ss * wki; wdi += ss * wkr; a[j - 1] = xr; a[j] = yr; a[k + 1] = xi; a[k] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m + 1] - wdr * a[m - 1]; a[m + 1] = wdr * a[m + 1] + wdi * a[m - 1]; a[m - 1] = xr; a[m] *= WR5000; } void dctsub4(int n, double *a) { int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[1] - wdr * a[3]; a[1] = wdr * a[1] + wdi * a[3]; a[3] = xr; } a[m] *= wki; } void dstsub4(int n, double *a) { int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[3] - wdr * a[1]; a[3] = wdr * a[3] + wdi * a[1]; a[1] = xr; } a[m] *= wki; } Kst-2.0.8/src/plugins/dataobject/crossspectrum/crossspectrum.h0000644000175000017500000000535712277111530023740 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CROSSSPECTRUMPLUGIN_H #define CROSSSPECTRUMPLUGIN_H #include #include #include class CrossSpectrumSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorOne() const; Kst::VectorPtr vectorTwo() const; Kst::ScalarPtr scalarFFT() const; Kst::ScalarPtr scalarRate() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CrossSpectrumSource(Kst::ObjectStore *store); ~CrossSpectrumSource(); friend class Kst::ObjectStore; }; class CrossSpectrumPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CrossSpectrumPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui0000644000175000017500000000750312277111530025307 0ustar synthsynth CrossSpectrumConfig 0 0 425 104 400 0 0 0 Input Vector One false 0 0 0 0 Input Vector Two Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 FFT Length = 2^ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Sample Rate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/crossspectrum/crossspectrum.pro0000644000175000017500000000030212277111530024272 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_crossspectrum) SOURCES += \ fftsg_h.c \ crossspectrum.cpp HEADERS += \ crossspectrum.h FORMS += crossspectrumconfig.ui Kst-2.0.8/src/plugins/dataobject/crossspectrum/crossspectrum.cpp0000644000175000017500000003146612362701575024304 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "crossspectrum.h" #include "objectstore.h" #include "ui_crossspectrumconfig.h" static const QString& VECTOR_IN_ONE = "Vector In One"; static const QString& VECTOR_IN_TWO = "Vector In Two"; static const QString& SCALAR_IN_FFT = "Scalar In FFT"; static const QString& SCALAR_IN_RATE = "Scalar In Sample Rate"; static const QString& VECTOR_OUT_FREQ = "Frequency"; static const QString& VECTOR_OUT_IMAG = "Imaginary"; static const QString& VECTOR_OUT_REAL = "Real"; class ConfigCrossSpectrumPlugin : public Kst::DataObjectConfigWidget, public Ui_CrossSpectrumConfig { public: ConfigCrossSpectrumPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CrossSpectrumConfig() { _store = 0; setupUi(this); } ~ConfigCrossSpectrumPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorOne->setObjectStore(store); _vectorTwo->setObjectStore(store); _scalarFFT->setObjectStore(store); _scalarRate->setObjectStore(store); _scalarFFT->setDefaultValue(10); _scalarRate->setDefaultValue(100); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorOne, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorTwo, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarFFT, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarRate, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorOne() { return _vectorOne->selectedVector(); }; void setSelectedVectorOne(Kst::VectorPtr vector) { return _vectorOne->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorTwo() { return _vectorTwo->selectedVector(); }; void setSelectedVectorTwo(Kst::VectorPtr vector) { return _vectorTwo->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarFFT() { return _scalarFFT->selectedScalar(); }; void setSelectedScalarFFT(Kst::ScalarPtr scalar) { return _scalarFFT->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarRate() { return _scalarRate->selectedScalar(); }; void setSelectedScalarRate(Kst::ScalarPtr scalar) { return _scalarRate->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CrossSpectrumSource* source = static_cast(dataObject)) { setSelectedVectorOne(source->vectorOne()); setSelectedVectorTwo(source->vectorTwo()); setSelectedScalarFFT(source->scalarFFT()); setSelectedScalarRate(source->scalarRate()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Cross Spectrum DataObject Plugin"); _cfg->setValue("Input Vector One", _vectorOne->selectedVector()->Name()); _cfg->setValue("Input Vector Two", _vectorTwo->selectedVector()->Name()); _cfg->setValue("Input Scalar FFT", _scalarFFT->selectedScalar()->Name()); _cfg->setValue("Input Scalar Sample Rate", _scalarRate->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Cross Spectrum DataObject Plugin"); QString vectorName = _cfg->value("Input Vector One").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorOne = static_cast(object); if (vectorOne) { setSelectedVectorOne(vectorOne); } vectorName = _cfg->value("Input Vector Two").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorTwo = static_cast(object); if (vectorTwo) { setSelectedVectorTwo(vectorTwo); } QString scalarName = _cfg->value("Input Scalar FFT").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarFFT = static_cast(object); if (scalarFFT) { setSelectedScalarFFT(scalarFFT); } scalarName = _cfg->value("Input Scalar Sample Rate").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarRate = static_cast(object); if (scalarRate) { setSelectedScalarRate(scalarRate); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CrossSpectrumSource::CrossSpectrumSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CrossSpectrumSource::~CrossSpectrumSource() { } QString CrossSpectrumSource::_automaticDescriptiveName() const { return tr("Cross Spectrum Plugin Object"); } void CrossSpectrumSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigCrossSpectrumPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); setInputScalar(SCALAR_IN_FFT, config->selectedScalarFFT()); setInputScalar(SCALAR_IN_RATE, config->selectedScalarRate()); } } void CrossSpectrumSource::setupOutputs() { setOutputVector(VECTOR_OUT_FREQ, ""); setOutputVector(VECTOR_OUT_IMAG, ""); setOutputVector(VECTOR_OUT_REAL, ""); } #define KSTPSDMAXLEN 27 extern "C" void rdft(int n, int isgn, double *a); //fast fourier transform... bool CrossSpectrumSource::algorithm() { Kst::VectorPtr inputVectorOne = _inputVectors[VECTOR_IN_ONE]; Kst::VectorPtr inputVectorTwo = _inputVectors[VECTOR_IN_TWO]; Kst::ScalarPtr inputScalarFFT = _inputScalars[SCALAR_IN_FFT]; Kst::ScalarPtr inputScalarRate = _inputScalars[SCALAR_IN_RATE]; Kst::VectorPtr outputVectorFrequency = _outputVectors[VECTOR_OUT_FREQ]; Kst::VectorPtr outputVectorImaginary = _outputVectors[VECTOR_OUT_IMAG]; Kst::VectorPtr outputVectorReal = _outputVectors[VECTOR_OUT_REAL]; double SR = inputScalarRate->value(); // sample rate double df; int i, xps_len; double *a, *b; double mean_a, mean_b; int dv0, dv1, v_len; int i_subset, n_subsets; int i_samp, copyLen; double norm_factor; /* parse fft length */ xps_len = int( inputScalarRate->value() - 0.99); if ( xps_len > KSTPSDMAXLEN ) { xps_len = KSTPSDMAXLEN; } if ( xps_len<2 ) { xps_len = 2; } xps_len = int ( pow( 2.0, xps_len ) ); /* input vector lengths */ v_len = ( ( inputVectorOne->length() < inputVectorTwo->length() ) ? inputVectorOne->length() : inputVectorTwo->length() ); dv0 = v_len/inputVectorOne->length(); dv1 = v_len/inputVectorTwo->length(); while ( xps_len > v_len ) { xps_len/=2; } // allocate the lengths outputVectorReal->resize( xps_len, false ); outputVectorImaginary->resize( xps_len, false ); outputVectorFrequency->resize( xps_len, false ); /* Fill the frequency and zero the xps */ df = SR/( 2.0*double( xps_len-1 ) ); for ( i=0; ivalue()[i] = double( i ) * df; outputVectorReal->value()[i] = 0.0; outputVectorImaginary->value()[i] = 0.0; } /* allocate input arrays */ int ALen = xps_len * 2; a = new double[ALen]; b = new double[ALen]; /* do the fft's */ n_subsets = v_len/xps_len + 1; for ( i_subset=0; i_subsetvalue()[i] ); i = ( i_samp + i_subset*xps_len )/dv1; mean_b += ( b[i_samp] = inputVectorTwo->value()[i] ); } if (copyLen>1) { mean_a/=(double)copyLen; mean_b/=(double)copyLen; } /* Remove Mean and apodize */ for (i_samp=0; i_sampvalue()[0] += ( a[0]*b[0] ); outputVectorReal->value()[xps_len-1] += ( a[1]*b[1] ); for (i_samp=1; i_sampvalue()[i_samp]+= ( a[i_samp*2] * b[i_samp*2] - a[i_samp*2+1] * b[i_samp*2+1] ); outputVectorImaginary->value()[i_samp]+= ( -a[i_samp*2] * b[i_samp*2+1] + a[i_samp*2+1] * b[i_samp*2] ); }// (a+ci)(b+di)* = ab+cd +i(-ad + cb) } /* renormalize */ norm_factor = 1.0/((double(SR)*double(xps_len))*double(n_subsets)); for ( i=0; ivalue()[i]*=norm_factor; outputVectorImaginary->value()[i]*=norm_factor; } delete[] b; delete[] a; return true; } Kst::VectorPtr CrossSpectrumSource::vectorOne() const { return _inputVectors[VECTOR_IN_ONE]; } Kst::VectorPtr CrossSpectrumSource::vectorTwo() const { return _inputVectors[VECTOR_IN_TWO]; } Kst::ScalarPtr CrossSpectrumSource::scalarFFT() const { return _inputScalars[SCALAR_IN_FFT]; } Kst::ScalarPtr CrossSpectrumSource::scalarRate() const { return _inputScalars[SCALAR_IN_RATE]; } QStringList CrossSpectrumSource::inputVectorList() const { QStringList vectors(VECTOR_IN_ONE); vectors += VECTOR_IN_TWO; return vectors; } QStringList CrossSpectrumSource::inputScalarList() const { QStringList scalars(SCALAR_IN_FFT); scalars += SCALAR_IN_RATE; return scalars; } QStringList CrossSpectrumSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CrossSpectrumSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_FREQ); vectors += VECTOR_OUT_IMAG; vectors += VECTOR_OUT_REAL; return vectors; } QStringList CrossSpectrumSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CrossSpectrumSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CrossSpectrumSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CrossSpectrumPlugin::pluginName() const { return tr("Cross Spectrum DataObject Plugin"); } QString CrossSpectrumPlugin::pluginDescription() const { return tr("Generates the cross power spectrum of one vector with another."); } Kst::DataObject *CrossSpectrumPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigCrossSpectrumPlugin* config = static_cast(configWidget)) { CrossSpectrumSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_FFT, config->selectedScalarFFT()); object->setInputScalar(SCALAR_IN_RATE, config->selectedScalarRate()); object->setupOutputs(); object->setInputVector(VECTOR_IN_ONE, config->selectedVectorOne()); object->setInputVector(VECTOR_IN_TWO, config->selectedVectorTwo()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CrossSpectrumPlugin::configWidget(QSettings *settingsObject) const { ConfigCrossSpectrumPlugin *widget = new ConfigCrossSpectrumPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, CrossSpectrumPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/crossspectrum/kstplugin_crossspectrum.desktop0000644000175000017500000000371312362705136027262 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=crossspectrum X-Kst-Plugin-Author=The University of Toronto Name=Cross Spectrum Data Object Plugin Name[ca]=Connector d'objecte de dades d'espectre creuat Name[ca@valencia]=Connector d'objecte de dades d'espectre creuat Name[de]=Kreuzspektrum-Datenobjekt-Modul Name[fr]=Module DataObject de spectre croisé Name[it]=Estensione oggetto dati spettro incrociato Name[nl]=Cross Spectrum Data Object Plugin Name[pl]=Wtyczka obiektu danych widma krzyżowego Name[pt]='Plugin' de Objectos de Dados de Espectro Cruzado Name[pt_BR]=Plugin de objeto de dados de espectro cruzado Name[sv]=Dataobjekt-insticksprogram för korsspektrum Name[uk]=Додаток для роботи з об’єктами перехресного спектра даних Name[x-test]=xxCross Spectrum Data Object Pluginxx Comment=Implements a Cross Spectrum Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades d'espectre creuat pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades d'espectre creuat pel Kst. Comment[de]=Implementiert ein Kreuzspektrum-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de spectre croisé pour Kst. Comment[it]=Implementa un'estensione oggetto dati spettro incrociato per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor een kruisspectrum. Comment[pl]=Implementuje wtyczkę obiektu danych widma krzyżowego dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de espectro cruzado para o Kst. Comment[pt_BR]=Implementa um plugin de objetos de dados de espectro cruzado para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för korsspektrum. Comment[uk]=Реалізує додаток для роботи з об’єктами перехресного спектра даних у Kst. Comment[x-test]=xxImplements a Cross Spectrum Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/periodogram/0000755000175000017500000000000012362705136020243 5ustar synthsynthKst-2.0.8/src/plugins/dataobject/periodogram/periodogram.pro0000644000175000017500000000025212277111530023266 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_periodogram) SOURCES += \ periodogram.cpp HEADERS += \ periodogram.h FORMS += periodogramconfig.ui Kst-2.0.8/src/plugins/dataobject/periodogram/periodogramconfig.ui0000644000175000017500000000754412277111530024304 0ustar synthsynth PeriodogramConfig 0 0 424 76 400 0 0 0 Input Vector Time Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Input Vector Data Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Oversampling factor Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Average Nyquist frequency factor false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/dataobject/periodogram/kstplugin_periodogram.desktop0000644000175000017500000000362012362705136026247 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=periodogram X-Kst-Plugin-Author=The University of Toronto Name=Periodogram Data Object Plugin Name[ca]=Connector d'objecte de dades de periodograma Name[ca@valencia]=Connector d'objecte de dades de periodograma Name[de]=Wellenschaubild-Datenobjekt-Modul Name[fr]=Module DataObject de périodogramme Name[it]=Estensione oggetto dati di periodogramma Name[nl]=Periodogram Data Object Plugin Name[pl]=Wtyczka obiektu danych periodogramu Name[pt]='Plugin' de Objectos de Dados de Medição do Período Name[pt_BR]=Plugin de objeto de dados de medição do período Name[sv]=Dataobjekt-insticksprogram för periodogram Name[uk]=Додаток для роботи з об’єктами періодограм даних Name[x-test]=xxPeriodogram Data Object Pluginxx Comment=Implements a Periodogram Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de periodograma pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de periodograma pel Kst. Comment[de]=Implementiert ein Wellenschaubild-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de périodogramme pour Kst. Comment[it]=Implementa un'estensione oggetto dati di periodogramma per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor periodogram. Comment[pl]=Implementuje wtyczkę obiektu danych periodogramu dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de medição de períodos para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de medição do período para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för periodogram. Comment[uk]=Реалізує додаток для роботи з об’єктами періодограм даних у Kst. Comment[x-test]=xxImplements a Periodogram Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/dataobject/periodogram/periodogram.h0000644000175000017500000000754412277111530022730 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PERIODOGRAMPLUGIN_H #define PERIODOGRAMPLUGIN_H #include #include #include class PeriodogramSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorTime() const; Kst::VectorPtr vectorData() const; Kst::ScalarPtr scalarOversampling() const; Kst::ScalarPtr scalarANFF() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: PeriodogramSource(Kst::ObjectStore *store); ~PeriodogramSource(); private: int max(int a, int b); int min(int a, int b); void spread(double y, double yy[], unsigned long n, double x, int m); void four1(double data[], unsigned long nn, int isign); void realft(double data[], unsigned long n, int isign); void avevar(double const data[], unsigned long n, double* ave, double* var); void FastLombPeriodogram( double const x[], double const y[], unsigned long n, double ofac, double hifac, double wk1[], double wk2[], unsigned long ndim, unsigned long* nout, unsigned long* jmax, double* prob, double* pvar, int iIsWindowFunction); void SlowLombPeriodogram( double const x[], double const y[], unsigned long n, double ofac, double hifac, double px[], double py[], unsigned long ndim, unsigned long* nout, unsigned long* jmax, double* prob, double* pvar, int iIsWindowFunction); friend class Kst::ObjectStore; }; class PeriodogramPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~PeriodogramPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Generic; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/dataobject/periodogram/periodogram.cpp0000644000175000017500000005717212362701575023276 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* a type of spectrum. I'm not sure how this relates to the built in power spectrums. It could be removed from the default build (?) */ #include "periodogram.h" #include "objectstore.h" #include "ui_periodogramconfig.h" #define ONE_PI 3.1415926535897930475926 #define TWO_PI 6.2831853071795858696103 #define MACC 4.0 static const QString& VECTOR_IN_TIME = "Vector In Time"; static const QString& VECTOR_IN_DATA = "Vector In Data"; static const QString& SCALAR_IN_OVERSAMPLING = "Oversampling factor"; static const QString& SCALAR_IN_ANFF = "Average Nyquist outputVectorFrequency factor"; static const QString& VECTOR_OUT_FREQUENCY = "Frequency"; static const QString& VECTOR_OUT_PERIODOGRAM = "Periodogram"; class ConfigPeriodogramPlugin : public Kst::DataObjectConfigWidget, public Ui_PeriodogramConfig { public: ConfigPeriodogramPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_PeriodogramConfig() { _store = 0; setupUi(this); } ~ConfigPeriodogramPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorTime->setObjectStore(store); _vectorData->setObjectStore(store); _scalarOversampling->setObjectStore(store); _scalarANFF->setObjectStore(store); _scalarOversampling->setDefaultValue(0); _scalarANFF->setDefaultValue(0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorTime, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorData, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOversampling, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarANFF, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } Kst::VectorPtr selectedVectorTime() { return _vectorTime->selectedVector(); }; void setSelectedVectorTime(Kst::VectorPtr vector) { return _vectorTime->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorData() { return _vectorData->selectedVector(); }; void setSelectedVectorData(Kst::VectorPtr vector) { return _vectorData->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarOversampling() { return _scalarOversampling->selectedScalar(); }; void setSelectedScalarOversampling(Kst::ScalarPtr scalar) { return _scalarOversampling->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarANFF() { return _scalarANFF->selectedScalar(); }; void setSelectedScalarANFF(Kst::ScalarPtr scalar) { return _scalarANFF->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (PeriodogramSource* source = static_cast(dataObject)) { setSelectedVectorTime(source->vectorTime()); setSelectedVectorData(source->vectorData()); setSelectedScalarOversampling(source->scalarOversampling()); setSelectedScalarANFF(source->scalarANFF()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Periodogram DataObject Plugin"); _cfg->setValue("Input Vector Time", _vectorTime->selectedVector()->Name()); _cfg->setValue("Input Vector Data", _vectorData->selectedVector()->Name()); _cfg->setValue("Input Scalar Oversampling factor", _scalarOversampling->selectedScalar()->Name()); _cfg->setValue("Input Scalar Average Nyquist outputVectorFrequency factor", _scalarANFF->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Periodogram DataObject Plugin"); QString vectorName = _cfg->value("Input Vector Time").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorTime = static_cast(object); if (vectorTime) { setSelectedVectorTime(vectorTime); } vectorName = _cfg->value("Input Vector Data").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorData = static_cast(object); if (vectorData) { setSelectedVectorData(vectorData); } QString scalarName = _cfg->value("Input Scalar Oversampling factor").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarOversampling = static_cast(object); if (scalarOversampling) { setSelectedScalarOversampling(scalarOversampling); } scalarName = _cfg->value("Input Scalar Average Nyquist outputVectorFrequency factor").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* scalarANFF = static_cast(object); if (scalarANFF) { setSelectedScalarANFF(scalarANFF); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; PeriodogramSource::PeriodogramSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } PeriodogramSource::~PeriodogramSource() { } QString PeriodogramSource::_automaticDescriptiveName() const { return tr("Periodogram Plugin Object"); } void PeriodogramSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigPeriodogramPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_TIME, config->selectedVectorTime()); setInputVector(VECTOR_IN_DATA, config->selectedVectorData()); setInputScalar(SCALAR_IN_OVERSAMPLING, config->selectedScalarOversampling()); setInputScalar(SCALAR_IN_ANFF, config->selectedScalarANFF()); } } void PeriodogramSource::setupOutputs() { setOutputVector(VECTOR_OUT_FREQUENCY, ""); setOutputVector(VECTOR_OUT_PERIODOGRAM, ""); } bool PeriodogramSource::algorithm() { Kst::VectorPtr inputVectorTime = _inputVectors[VECTOR_IN_TIME]; Kst::VectorPtr inputVectorData = _inputVectors[VECTOR_IN_DATA]; Kst::ScalarPtr inputScalarOversampling = _inputScalars[SCALAR_IN_OVERSAMPLING]; Kst::ScalarPtr inputScalarANFF = _inputScalars[SCALAR_IN_ANFF]; Kst::VectorPtr outputVectorFrequency = _outputVectors[VECTOR_OUT_FREQUENCY]; Kst::VectorPtr outputVectorPeriodogram = _outputVectors[VECTOR_OUT_PERIODOGRAM]; unsigned long lSizeWork; unsigned long lSizeOut = 0; unsigned long lSizeIn; unsigned long lFreqt; unsigned long lFreq; unsigned long lMax; double dProb; double dVar; double* pResult[2]; bool bReturn = false; //Make sure the input sizes match if (inputVectorTime->length() != inputVectorData->length()) { _errorString = tr("Error: Input Vector lengths do not match"); return false; } lSizeIn = inputVectorTime->length(); if (lSizeIn > 1) { lFreqt = (unsigned long)( MACC * inputScalarOversampling->value() * inputScalarANFF->value() * lSizeIn ); lFreq = 64; while (lFreq < lFreqt) { lFreq *= 2; } lSizeWork = lFreq * 2; outputVectorFrequency->resize(lSizeWork, true); pResult[0] = outputVectorFrequency->value(); outputVectorPeriodogram->resize(lSizeWork, true); pResult[1] = outputVectorPeriodogram->value(); if (pResult[0] != NULL && pResult[1] != NULL) { for (int i = 0; i < outputVectorFrequency->length(); ++i) { outputVectorFrequency->value()[i] = pResult[0][i]; } for (int i = 0; i < outputVectorPeriodogram->length(); ++i) { outputVectorPeriodogram->value()[i] = pResult[1][i]; } if (lSizeIn > 100) { FastLombPeriodogram( (double*)&(inputVectorTime->value()[-1]), (double*)&(inputVectorData->value()[-1]), inputVectorTime->length(), inputScalarOversampling->value(), inputScalarANFF->value(), (double*)&(outputVectorFrequency->value()[-1]), (double*)&(outputVectorPeriodogram->value()[-1]), lSizeWork, &lSizeOut, &lMax, &dProb, &dVar, 0 ); } else { SlowLombPeriodogram( (double*)&(inputVectorTime->value()[-1]), (double*)&(inputVectorData->value()[-1]), inputVectorTime->length(), inputScalarOversampling->value(), inputScalarANFF->value(), (double*)&(outputVectorFrequency->value()[-1]), (double*)&(outputVectorPeriodogram->value()[-1]), lSizeWork, &lSizeOut, &lMax, &dProb, &dVar, 0 ); } if (lSizeOut > 0 && lSizeOut <= lSizeWork) { outputVectorFrequency->resize(lSizeOut, false); outputVectorPeriodogram->resize(lSizeOut, false); bReturn = true; } } } return bReturn; } Kst::VectorPtr PeriodogramSource::vectorTime() const { return _inputVectors[VECTOR_IN_TIME]; } Kst::VectorPtr PeriodogramSource::vectorData() const { return _inputVectors[VECTOR_IN_DATA]; } Kst::ScalarPtr PeriodogramSource::scalarOversampling() const { return _inputScalars[SCALAR_IN_OVERSAMPLING]; } Kst::ScalarPtr PeriodogramSource::scalarANFF() const { return _inputScalars[SCALAR_IN_ANFF]; } QStringList PeriodogramSource::inputVectorList() const { QStringList vectors(VECTOR_IN_TIME); vectors += VECTOR_IN_DATA; return vectors; } QStringList PeriodogramSource::inputScalarList() const { QStringList scalars(SCALAR_IN_OVERSAMPLING); scalars += SCALAR_IN_ANFF; return scalars; } QStringList PeriodogramSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList PeriodogramSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_FREQUENCY); vectors += VECTOR_OUT_PERIODOGRAM; return vectors; } QStringList PeriodogramSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList PeriodogramSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void PeriodogramSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } int PeriodogramSource::max(int a, int b) { if (a > b) { return a; } return b; } int PeriodogramSource::min(int a, int b) { if (a < b) { return a; } return b; } void PeriodogramSource::spread(double y, double yy[], unsigned long n, double x, int m) { int ihi; int ilo; int ix; int j; int nden; double fac; static int nfac[] = { 0, 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 39916800, 479001600 }; ix = (int)x; if (x == (double)ix) { yy[ix] += y; } else { ilo = min(max((int)(x - 0.5*m + 1.0), 1), (int)(n - m + 1)); ihi = ilo + m - 1; nden = nfac[m]; fac = x - ilo; for (j = ilo + 1;j <= ihi;++j) { fac *= x - (double)j; } yy[ihi] += y*fac/(double)(nden*(x - ihi)); for (j = ihi-1;j >= ilo;j--) { nden=(nden/(j+1-ilo))*(j-ihi); yy[j] += y*fac/(double)(nden*(x - j)); } } } void PeriodogramSource::four1(double data[], unsigned long nn, int isign) { unsigned long n; unsigned long mmax; unsigned long m; unsigned long j; unsigned long istep; unsigned long i; double dtemp; double wtemp; double wr; double wpr; double wpi; double wi; double theta; double tempr; double tempi; n = nn << 1; j = 1; for (i = 1;i < n;i += 2) { if (j > i) { dtemp = data[i]; data[i] = data[j]; data[j] = dtemp; dtemp = data[i+1]; data[i+1] = data[j+1]; data[j+1] = dtemp; } m = n >> 1; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax = 2; while (n > mmax) { istep = mmax * 2; theta = isign*(TWO_PI/mmax); wtemp = sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi = sin(theta); wr = 1.0; wi = 0.0; for (m = 1;m < mmax;m += 2) { for (i = m;i <= n;i += istep) { j = i + mmax; tempr = wr*data[j] - wi*data[j+1]; tempi = wr*data[j+1] + wi*data[j]; data[j] = data[i] - tempr; data[j+1] = data[i+1] - tempi; data[i] += tempr; data[i+1] += tempi; } wr = (wtemp = wr)*wpr - wi*wpi + wr; wi = wi*wpr + wtemp*wpi + wi; } mmax = istep; } } void PeriodogramSource::realft(double data[], unsigned long n, int isign) { unsigned long i; unsigned long i1; unsigned long i2; unsigned long i3; unsigned long i4; unsigned long np3; double c1 = 0.5; double c2; double h1r; double h1i; double h2r; double h2i; double wr; double wi; double wpr; double wpi; double wtemp; double theta; theta = ONE_PI / (double)(n>>1); if (isign == 1) { c2 = -0.5; four1(data, n>>1, 1); } else { c2 = 0.5; theta = -theta; } wtemp = sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi = sin(theta); wr = 1.0 + wpr; wi = wpi; np3 = n+3; for (i = 2;i <= (n>>2);++i) { i1 = (2*i) - 1; i2 = i1 + 1; i3 = np3 - i2; i4 = i3 + 1; h1r = c1*(data[i1] + data[i3]); h1i = c1*(data[i2] - data[i4]); h2r = -c2*(data[i2] + data[i4]); h2i = c2*(data[i1] - data[i3]); data[i1] = h1r + wr*h2r - wi*h2i; data[i2] = h1i + wr*h2i + wi*h2r; data[i3] = h1r - wr*h2r + wi*h2i; data[i4] = -h1i + wr*h2i + wi*h2r; wtemp = wr; wr = wr*wpr - wi*wpi + wr; wi = wi*wpr + wtemp*wpi + wi; } if (isign == 1) { h1r = data[1]; data[1] = h1r + data[2]; data[2] = h1r - data[2]; } else { h1r = data[1]; data[1] = c1*(h1r + data[2]); data[2] = c1*(h1r - data[2]); four1(data, n>>1, -1); } } void PeriodogramSource::avevar( double const data[], unsigned long n, double* ave, double* var) { unsigned long j; double s; double ep; *ave = 0.0; *var = 0.0; ep = 0.0; if (n > 0) { for (*ave = 0.0, j = 1;j <= n;++j) { *ave += data[j]; } *ave /= n; if (n > 1) { for (j = 1;j <= n;++j) { s = data[j] - (*ave); ep += s; *var += s*s; } *var = (*var - ep * ep / n) / (n - 1); } } } void PeriodogramSource::FastLombPeriodogram( double const x[], double const y[], unsigned long n, double ofac, double hifac, double wk1[], double wk2[], unsigned long ndim, unsigned long* nout, unsigned long* jmax, double* prob, double* pvar, int iIsWindowFunction) { unsigned long j; unsigned long k; double ave; double ck; double ckk; double cterm; double cwt; double den; double df; double effm; double expy; double fac; double fndim; double hc2wt; double hs2wt; double hypo; double pmax; double sterm; double swt; double xdif; double xmax; double xmin; if (n > 0) { *nout = (unsigned long)(0.5 * ofac * hifac * n); if (iIsWindowFunction) { ave = 0.0; *pvar = 0.0; } else { avevar(y, n, &ave, pvar); } xmax = x[1]; xmin = x[1]; for (j = 2;j <= n;++j) { if (x[j] < xmin) { xmin = x[j]; } if (x[j] > xmax) { xmax = x[j]; } } xdif = xmax - xmin; for (j = 1;j <= ndim;++j) { wk1[j] = 0.0; wk2[j] = 0.0; } fac = ndim / (xdif * ofac); fndim = ndim; for (j = 1;j <= n;++j) { ck = (x[j] - xmin) * fac; ck = fmod(ck, fndim); ckk = 2.0*(ck++); ckk = fmod(ckk, fndim); ++ckk; spread(y[j] - ave, wk1, ndim, ck, (int)MACC); spread(1.0, wk2, ndim, ckk, (int)MACC); } realft(wk1, ndim, 1); realft(wk2, ndim, 1); df = 1.0 / (xdif * ofac); pmax = -1.0; for (k = 3, j = 1;j <= (*nout);j++, k += 2) { hypo = sqrt(wk2[k]*wk2[k] + wk2[k+1]*wk2[k+1]); hc2wt = 0.5 * wk2[k ] / hypo; hs2wt = 0.5 * wk2[k+1] / hypo; cwt = sqrt(0.5 + hc2wt); swt = fabs(sqrt(0.5 - hc2wt)); if (hs2wt < 0.0) { swt *= -1.0; } den = 0.5*n + hc2wt*wk2[k] + hs2wt*wk2[k+1]; cterm = pow(cwt*wk1[k+0] + swt*wk1[k+1], 2.0) / den; if ((double)n - den == 0.0) { sterm = 0.0; } else { sterm = pow(cwt*wk1[k+1] - swt*wk1[k+0], 2.0) / ((double)n - den); } wk1[j] = (double)j * df; wk2[j] = (cterm + sterm); if (*pvar > 0.0) { wk2[j] /= (2.0 * *pvar); } if (wk2[j] > pmax) { pmax = wk2[ (*jmax = j) ]; } } expy = exp(-pmax); effm = 2.0 * (*nout) / ofac; *prob = effm * expy; if (*prob > 0.01) { *prob = 1.0 - pow(1.0 - expy, effm); } } else { *nout = 0; } } void PeriodogramSource::SlowLombPeriodogram( double const x[], double const y[], unsigned long n, double ofac, double hifac, double px[], double py[], unsigned long /*ndim*/, unsigned long* nout, unsigned long* jmax, double* prob, double* pvar, int iIsWindowFunction) { unsigned long i; unsigned long j; double* wi = NULL; double* wpi = NULL; double* wpr = NULL; double* wr = NULL; double arg; double wtemp; double ave; double c; double cc; double cwtau; double effm; double expy; double pnow; double pymax; double s; double ss; double sumc; double sumcy; double sums; double sumsh; double sumsy; double swtau; double wtau; double xave; double xdif; double xmax; double xmin; double yy; if (n > 0) { wi = (double*)calloc(n+1, sizeof(double)); wpi = (double*)calloc(n+1, sizeof(double)); wpr = (double*)calloc(n+1, sizeof(double)); wr = (double*)calloc(n+1, sizeof(double)); if (wi != NULL && wpi != NULL && wpr != NULL && wr != NULL) { *nout = (unsigned long)(0.5*ofac*hifac*n); if (iIsWindowFunction) { ave = 0.0; *pvar = 0.0; } else { avevar(y, n, &ave, pvar); } xmax = x[1]; xmin = x[1]; for (j=1;j<=n;++j) { if (x[j] > xmax) { xmax = x[j]; } if (x[j] < xmin) { xmin = x[j]; } } xdif = xmax-xmin; xave = 0.5*(xmax+xmin); pymax = 0.0; pnow = 1.0/(xdif*ofac); for (j=1;j<=n;++j) { arg = TWO_PI*((x[j]-xave)*pnow); wpr[j] = -2.0*(sin(0.5*arg)*sin(0.5*arg)); wpi[j] = sin(arg); wr[j] = cos(arg); wi[j] = wpi[j]; } for (i=1;i<=(*nout);++i) { sumsh = 0.0; sumc = 0.0; px[i] = pnow; for (j=1;j<=n;++j) { c = wr[j]; s = wi[j]; sumsh += s*c; sumc += (c-s)*(c+s); } wtau = 0.5 * atan2(2.0 * sumsh, sumc); swtau = sin(wtau); cwtau = cos(wtau); sums = 0.0; sumc = 0.0; sumsy = 0.0; sumcy = 0.0; for (j=1;j<=n;++j) { s = wi[j]; c = wr[j]; ss = s*cwtau-c*swtau; cc = c*cwtau+s*swtau; sums += ss*ss; sumc += cc*cc; yy = y[j]-ave; sumsy += yy*ss; sumcy += yy*cc; wtemp = wr[j]; wr[j] = (wr[j]*wpr[j]-wi[j]*wpi[j])+wr[j]; wi[j] = (wi[j]*wpr[j]+wtemp*wpi[j])+wi[j]; } py[i] = (sumcy * sumcy / sumc + sumsy * sumsy / sums); if (*pvar > 0.0) { py[i] /= (2.0 * (*pvar)); } if (py[i] >= pymax) { *jmax = i; pymax = py[i]; } pnow += 1.0/(xdif*ofac); } expy = exp(-pymax); effm = 2.0*(*nout)/ofac; *prob = effm*expy; if (*prob > 0.01) { *prob = 1.0 - pow(1.0 - expy, effm); } } if (wi != NULL) { free(wi); } if (wpi != NULL) { free(wpi); } if (wpr != NULL) { free(wpr); } if (wr != NULL) { free(wr); } } else { *nout = 0; } } QString PeriodogramPlugin::pluginName() const { return tr("Periodogram"); } QString PeriodogramPlugin::pluginDescription() const { return tr("Takes the outputVectorPeriodogram of a given inputVectorData set. The inputVectorData is not assumed to be sampled at equal inputVectorTime intervals."); } Kst::DataObject *PeriodogramPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigPeriodogramPlugin* config = static_cast(configWidget)) { PeriodogramSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_OVERSAMPLING, config->selectedScalarOversampling()); object->setInputScalar(SCALAR_IN_ANFF, config->selectedScalarANFF()); object->setupOutputs(); object->setInputVector(VECTOR_IN_TIME, config->selectedVectorTime()); object->setInputVector(VECTOR_IN_DATA, config->selectedVectorData()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *PeriodogramPlugin::configWidget(QSettings *settingsObject) const { ConfigPeriodogramPlugin *widget = new ConfigPeriodogramPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, PeriodogramPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/plugins.pro0000644000175000017500000000026512277111530016033 0ustar synthsynthinclude($$PWD/../../config.pri) TEMPLATE = subdirs CONFIG += ordered DEMOS += \ sampleplugin SUBDIRS += \ filters \ dataobject LibExists(gsl) { SUBDIRS += fits } Kst-2.0.8/src/plugins/plugins.pri0000644000175000017500000000011012277111530016012 0ustar synthsynthinclude($$PWD/../../kst.pri) include($$PWD/../../dataobjectplugin.pri) Kst-2.0.8/src/plugins/fits/0000755000175000017500000000000012277111530014572 5ustar synthsynthKst-2.0.8/src/plugins/fits/common.h0000644000175000017500000001113712277111530016236 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #define XVALUES 0 #define YVALUES 1 #define WEIGHTS 2 double interpolate(int iIndex, int iLengthDesired, const double* pArray, int iLengthActual) { double value; double fj; double fdj; int j; if (iLengthDesired == iLengthActual) { value = pArray[iIndex]; } else { fj = (double)(iIndex * (iLengthActual-1)) / (double)(iLengthDesired-1); j = (int)floor(fj); fdj = fj - (double)j; //Don't read an invalid index from pArray... found by valgrind double A = j+1 < iLengthActual ? pArray[j+1] : 0; double B = j < iLengthActual ? pArray[j] : 0; value = A * fdj + B * (1.0 - fdj); } return value; } void assign( Kst::VectorPtr targetVector, double* pResult[], int iIndex, int iLength ) { for (int i = 0; i < iLength; i++) { targetVector->value()[i] = pResult[iIndex][i]; } } bool precursor( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr weightsVector, int *piLength, bool bWeighted, bool bLowHigh, int iNumParams, double* pInputs[], Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::VectorPtr vectorOutYLo, Kst::VectorPtr vectorOutYHi) { bool bRetVal = false; int iNumCovar = ( iNumParams * ( iNumParams + 1 ) ) / 2; int i; pInputs[XVALUES] = 0L; pInputs[YVALUES] = 0L; if (bWeighted) { pInputs[WEIGHTS] = 0L; } if( xVector->length() >= 2 && yVector->length() >= 2 && (!bWeighted || weightsVector->length() >= 2) ) { *piLength = xVector->length(); if( yVector->length() > *piLength ) { *piLength = yVector->length(); } // // do any necessary interpolations... // pInputs[XVALUES] = (double*)malloc(*piLength * sizeof( double )); if (xVector->length() == *piLength) { for( i=0; i<*piLength; i++) { pInputs[XVALUES][i] = xVector->value()[i]; } } else { for( i=0; i<*piLength; i++) { pInputs[XVALUES][i] = interpolate( i, *piLength, xVector->value(), xVector->length() ); } } pInputs[YVALUES] = (double*)malloc(*piLength * sizeof( double )); if (yVector->length() == *piLength) { for( i=0; i<*piLength; i++) { pInputs[YVALUES][i] = yVector->value()[i]; } } else { for( i=0; i<*piLength; i++) { pInputs[YVALUES][i] = interpolate( i, *piLength, yVector->value(), yVector->length() ); } } if (bWeighted) { pInputs[WEIGHTS] = (double*)malloc(*piLength * sizeof( double )); if (weightsVector->length() == *piLength) { for( i=0; i<*piLength; i++) { pInputs[WEIGHTS][i] = weightsVector->value()[i]; } } else { for( i=0; i<*piLength; i++) { pInputs[WEIGHTS][i] = interpolate( i, *piLength, weightsVector->value(), weightsVector->length() ); } } } if( *piLength > iNumParams + 1 ) { vectorOutYFitted->resize(*piLength); vectorOutYResiduals->resize(*piLength); vectorOutYParameters->resize(iNumParams); vectorOutYCovariance->resize(iNumCovar); if( bLowHigh ) { vectorOutYLo->resize(*piLength); vectorOutYHi->resize(*piLength); } bRetVal = true; } } return bRetVal; } void postcursor( bool bWeighted, double* pInputs[]) { if (pInputs[XVALUES] != 0L ) { free( pInputs[XVALUES] ); } if (pInputs[YVALUES] != 0L ) { free( pInputs[YVALUES] ); } if( bWeighted ) { if (pInputs[WEIGHTS] != 0L ) { free( pInputs[WEIGHTS] ); } } } Kst-2.0.8/src/plugins/fits/exponential_unweighted/0000755000175000017500000000000012362705136021351 5ustar synthsynthKst-2.0.8/src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp0000644000175000017500000002502012362701575027333 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitexponential_unweighted.h" #include "objectstore.h" #include "ui_fitexponential_unweightedconfig.h" #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitExponentialUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitExponential_UnweightedConfig { public: ConfigWidgetFitExponentialUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitExponential_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitExponentialUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitExponentialUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Exponential Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Exponential Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitExponentialUnweightedSource::FitExponentialUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitExponentialUnweightedSource::~FitExponentialUnweightedSource() { } QString FitExponentialUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Unweighted Exponential").arg(vectorY()->descriptiveName()); } void FitExponentialUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitExponentialUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void FitExponentialUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { Q_UNUSED( pdX ) Q_UNUSED( pdY ) Q_UNUSED( iLength ) pdParameterEstimates[0] = 1.0; pdParameterEstimates[1] = 0.0; pdParameterEstimates[2] = 0.0; } double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dExp; double ddScale; double ddLambda; double ddOffset; dExp = exp( -dLambda * dX ); ddScale = dExp; ddLambda = -dX * dScale * dExp; ddOffset = 1.0; pdDerivatives[0] = ddScale; pdDerivatives[1] = ddLambda; pdDerivatives[2] = ddOffset; } bool FitExponentialUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Exponential Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Exponential Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear( inputVectorX, inputVectorY, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitExponentialUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitExponentialUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList FitExponentialUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitExponentialUnweightedSource::inputScalarList() const { return QStringList(); } QStringList FitExponentialUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitExponentialUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitExponentialUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitExponentialUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitExponentialUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitExponentialUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Scale"; break; case 1: parameter = "Lambda"; break; case 2: parameter = "Offset"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitExponentialUnweightedPlugin::pluginName() const { return tr("Exponential Fit"); } QString FitExponentialUnweightedPlugin::pluginDescription() const { return tr("Generates an exponential fit for a set of data."); } Kst::DataObject *FitExponentialUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitExponentialUnweightedPlugin* config = static_cast(configWidget)) { FitExponentialUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitExponentialUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitExponentialUnweightedPlugin *widget = new ConfigWidgetFitExponentialUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitExponentialUnweightedPlugin, FitExponentialUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/exponential_unweighted/kstplugin_fits_exponential_unweighted.desktop0000644000175000017500000000273012362705136032644 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitexponential_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Exponential Plugin Name[ca]=Fits - Connector exponencial Name[ca@valencia]=Fits - Connector exponencial Name[de]=Exponential-Anpassungs-Modul Name[fr]=Module de régression exponentielle Name[it]=Estensione fits esponenziale Name[nl]=Fits - Exponential Plugin Name[pl]=Wtyczka dopasowania wykładniczego Name[pt]='Plugin' de Ajuste Exponencial Name[pt_BR]=Plugin de ajuste exponencial Name[sv]=Anpassning - Exponentiellt insticksprogram Name[uk]=Додаток експоненційного наближення Name[x-test]=xxFits - Exponential Pluginxx Comment=Implements an Exponential Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits exponencial pel Kst. Comment[de]=Implementiert ein Exponential-Anpassungs-Modul für Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor exponentiële aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania wykładniczego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste exponencial para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste exponencial para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för exponentiell anpassning. Comment[uk]=Реалізує додаток експоненційного наближення у Kst. Comment[x-test]=xxImplements an Exponential Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/exponential_unweighted/exponential_unweighted.pro0000755000175000017500000000037212277111530026643 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitexponential_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitexponential_unweighted.cpp HEADERS += \ fitexponential_unweighted.h FORMS += fitexponential_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui0000644000175000017500000000502112277111530030342 0ustar synthsynth FitExponential_UnweightedConfig 0 0 427 117 400 0 0 0 X: false 0 0 0 0 Y: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/exponential_unweighted/fitexponential_unweighted.h0000644000175000017500000000543412277111530026776 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITEXPONENTIALUNWEIGHTEDPLUGIN_H #define FITEXPONENTIALUNWEIGHTEDPLUGIN_H #include #include #include class FitExponentialUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitExponentialUnweightedSource(Kst::ObjectStore *store); ~FitExponentialUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitExponentialUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitExponentialUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/linear.h0000644000175000017500000001213612277111530016220 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include "common.h" double calculate_matrix_entry( double dX, int iPos ); extern "C" bool kstfit_linear_unweighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi, int iNumParams); bool kstfit_linear_unweighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi, int iNumParams) { gsl_matrix* pMatrixX = NULL; gsl_matrix* pMatrixCovariance = NULL; gsl_vector* pVectorY = NULL; gsl_vector* pVectorParameters = NULL; gsl_multifit_linear_workspace* pWork = NULL; double dXInterpolated; double dX; double dY; double dChiSq = 0.0; int i = 0; int j; int iStatus = 0; int iLength; bool bReturn = false; if (xVector->length() >= 2 && yVector->length() >= 2 ) { iLength = yVector->length(); if( xVector->length() > iLength ) { iLength = xVector->length(); } if( iLength > iNumParams + 1 ) { vectorOutYFitted->resize(iLength); vectorOutYResiduals->resize(iLength); vectorOutYParameters->resize(iNumParams); vectorOutYCovariance->resize(iNumParams * iNumParams); // // create the matrices and vectors... // pMatrixX = gsl_matrix_alloc( iLength, iNumParams ); if( pMatrixX != NULL ) { pVectorY = gsl_vector_alloc( iLength ); if( pVectorY != NULL ) { pVectorParameters = gsl_vector_alloc( iNumParams ); if( pVectorParameters != NULL ) { pMatrixCovariance = gsl_matrix_alloc( iNumParams, iNumParams ); if( pMatrixCovariance != NULL ) { pWork = gsl_multifit_linear_alloc( iLength, iNumParams ); if( pWork != NULL ) { // // fill in the matrices and vectors... // for( i=0; ivalue(), yVector->length())); dXInterpolated = interpolate(i, iLength, xVector->value(), xVector->length()); for( j=0; jvalue()[i] = dY; vectorOutYResiduals->value()[i] = interpolate(i, iLength, yVector->value(), yVector->length()) - dY; } for( i=0; ivalue()[i] = gsl_vector_get( pVectorParameters, i ); for( j=0; jvalue()[(i*iNumParams)+j] = gsl_matrix_get( pMatrixCovariance, i, j ); } } scalarOutChi->setValue(dChiSq / ( (double)iLength - (double)iNumParams )); bReturn = true; } gsl_multifit_linear_free( pWork ); } gsl_matrix_free( pMatrixCovariance ); } gsl_vector_free( pVectorParameters ); } gsl_vector_free( pVectorY ); } gsl_matrix_free( pMatrixX ); } } } return bReturn; } Kst-2.0.8/src/plugins/fits/non_linear.h0000644000175000017500000001617012277111530017074 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "common.h" struct data { size_t n; const double* pdX; const double* pdY; }; void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ); double function_calculate( double dX, double* pdParameters ); void function_derivative( double dX, double* pdParameters, double* pdDerivatives ); int function_f( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF ); int function_df( const gsl_vector* pVectorX, void* pParams, gsl_matrix* pMatrixJ ); int function_fdf( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF, gsl_matrix* pMatrixJ ); bool kstfit_nonlinear( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi ); int function_f( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF ) { double dParameters[NUM_PARAMS]; double dY; data* pData = (data*)pParams; size_t i; for( i=0; in; i++ ) { dY = function_calculate( pData->pdX[i], dParameters ); gsl_vector_set( pVectorF, i, dY - pData->pdY[i] ); } return GSL_SUCCESS; } int function_df( const gsl_vector* pVectorX, void* pParams, gsl_matrix* pMatrixJ ) { double dParameters[NUM_PARAMS]; double dDerivatives[NUM_PARAMS]; data* pData = (data*)pParams; size_t i; size_t j; for( i=0; in; i++ ) { function_derivative( pData->pdX[i], dParameters, dDerivatives ); for( j=0; jlength() >= 2 && yVector->length() >= 2 ) { iLength = yVector->length(); if( xVector->length() > iLength ) { iLength = xVector->length(); } pInputX = (double*)malloc(iLength * sizeof( double )); if (xVector->length() == iLength) { for( i=0; ivalue()[i]; } } else { for( i=0; ivalue(), xVector->length() ); } } pInputY = (double*)malloc(iLength * sizeof( double )); if (yVector->length() == iLength) { for( i=0; ivalue()[i]; } } else { for( i=0; ivalue(), yVector->length() ); } } if( iLength > NUM_PARAMS ) { vectorOutYFitted->resize(iLength); vectorOutYResiduals->resize(iLength); vectorOutYParameters->resize(NUM_PARAMS); vectorOutYCovariance->resize(NUM_PARAMS * NUM_PARAMS); pType = gsl_multifit_fdfsolver_lmsder; pSolver = gsl_multifit_fdfsolver_alloc( pType, iLength, NUM_PARAMS ); if( pSolver != NULL ) { d.n = iLength; d.pdX = pInputX; d.pdY = pInputY; function.f = function_f; function.df = function_df; function.fdf = function_fdf; function.n = iLength; function.p = NUM_PARAMS; function.params = &d; pMatrixCovariance = gsl_matrix_alloc( NUM_PARAMS, NUM_PARAMS ); if( pMatrixCovariance != NULL ) { function_initial_estimate( pInputX, pInputY, iLength, dXInitial ); vectorViewInitial = gsl_vector_view_array( dXInitial, NUM_PARAMS ); gsl_multifit_fdfsolver_set( pSolver, &function, &vectorViewInitial.vector ); // // iterate to a solution... // do { iStatus = gsl_multifit_fdfsolver_iterate( pSolver ); if( iStatus == GSL_SUCCESS ) { iStatus = gsl_multifit_test_delta( pSolver->dx, pSolver->x, 1.0e-6, 1.0e-6 ); } iIterations++; } while( iStatus == GSL_CONTINUE && iIterations < MAX_NUM_ITERATIONS ); gsl_multifit_covar( pSolver->J, 0.0, pMatrixCovariance ); // // determine the fitted values... // for( i=0; ix, i ); } for( i=0; ivalue()[i] = function_calculate( pInputX[i], dXInitial ); vectorOutYResiduals->value()[i] = pInputY[i] - vectorOutYFitted->value()[i]; } // // fill in the parameter values and covariance matrix... // for( i=0; ivalue()[i] = gsl_vector_get( pSolver->x, i ); for( j=0; jvalue()[(i*NUM_PARAMS)+j] = gsl_matrix_get( pMatrixCovariance, i, j ); } } // // determine the value of chi^2/nu // scalarOutChi->setValue(gsl_blas_dnrm2( pSolver->f )); bReturn = true; gsl_matrix_free( pMatrixCovariance ); } gsl_multifit_fdfsolver_free( pSolver ); } } free( pInputX ); free( pInputY ); } return bReturn; } Kst-2.0.8/src/plugins/fits/linear_weighted.h0000644000175000017500000001317012277111530020077 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include "common.h" double calculate_matrix_entry( double dX, int iPos ); extern "C" bool kstfit_linear_weighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr weightsVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi, int iNumParams); bool kstfit_linear_weighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr weightsVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi, int iNumParams) { gsl_matrix* pMatrixX = NULL; gsl_matrix* pMatrixCovariance = NULL; gsl_vector* pVectorY = NULL; gsl_vector* pVectorWeights = NULL; gsl_vector* pVectorParameters = NULL; gsl_multifit_linear_workspace* pWork = NULL; double dX; double dY; double dChiSq = 0.0; int i = 0; int j; int iStatus = 0; int iLength; bool bReturn = false; if (xVector->length() >= 2 && yVector->length() >= 2 && weightsVector->length() >= 2) { iLength = yVector->length(); if( xVector->length() > iLength ) { iLength = xVector->length(); } if( iLength > iNumParams + 1 ) { vectorOutYFitted->resize(iLength); vectorOutYResiduals->resize(iLength); vectorOutYParameters->resize(iNumParams); vectorOutYCovariance->resize(iNumParams * iNumParams); // create the matrices and vectors... // pMatrixX = gsl_matrix_alloc( iLength, iNumParams ); if( pMatrixX != NULL ) { pVectorY = gsl_vector_alloc( iLength ); if( pVectorY != NULL ) { pVectorParameters = gsl_vector_alloc( iNumParams ); if( pVectorParameters != NULL ) { pMatrixCovariance = gsl_matrix_alloc( iNumParams, iNumParams ); if( pMatrixCovariance != NULL ) { pWork = gsl_multifit_linear_alloc( iLength, iNumParams ); if( pWork != NULL ) { pVectorWeights = gsl_vector_alloc( iLength ); if( pVectorWeights != NULL ) { // // fill in the matrices and vectors... // for( i=0; ivalue(), yVector->length())); gsl_vector_set( pVectorWeights, i, interpolate(i, iLength, weightsVector->value(), weightsVector->length())); for( j=0; jvalue(), xVector->length()), j ); gsl_matrix_set( pMatrixX, i, j, dX ); } } iStatus = gsl_multifit_wlinear( pMatrixX, pVectorWeights, pVectorY, pVectorParameters, pMatrixCovariance, &dChiSq, pWork ); if( iStatus == 0 ) { // // fill in the output arrays and scalars... // for( i=0; ivalue()[i] = dY; vectorOutYResiduals->value()[i] = interpolate(i, iLength, yVector->value(), yVector->length()) - dY; } for( i=0; ivalue()[i] = gsl_vector_get( pVectorParameters, i ); for( j=0; jvalue()[(i*iNumParams)+j] = gsl_matrix_get( pMatrixCovariance, i, j ); } } scalarOutChi->setValue(dChiSq / ( (double)iLength - (double)iNumParams )); bReturn = true; } gsl_vector_free( pVectorWeights ); } gsl_multifit_linear_free( pWork ); } gsl_matrix_free( pMatrixCovariance ); } gsl_vector_free( pVectorParameters ); } gsl_vector_free( pVectorY ); } gsl_matrix_free( pMatrixX ); } } } return bReturn; } Kst-2.0.8/src/plugins/fits/gradient_unweighted/0000755000175000017500000000000012362705136020620 5ustar synthsynthKst-2.0.8/src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp0000644000175000017500000002516012362701575026056 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitgradient_unweighted.h" #include "objectstore.h" #include "ui_fitgradient_unweightedconfig.h" #include #include "../common.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& VECTOR_OUT_Y_LO = "Lo Vector"; static const QString& VECTOR_OUT_Y_HI = "Hi Vector"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitGradientUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitGradient_UnweightedConfig { public: ConfigWidgetFitGradientUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitGradient_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitGradientUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitGradientUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Gradient Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Gradient Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitGradientUnweightedSource::FitGradientUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitGradientUnweightedSource::~FitGradientUnweightedSource() { } QString FitGradientUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Unweighted Gradient").arg(vectorY()->descriptiveName()); } void FitGradientUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitGradientUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void FitGradientUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputVector(VECTOR_OUT_Y_LO, ""); setOutputVector(VECTOR_OUT_Y_HI, ""); setOutputScalar(SCALAR_OUT, ""); } bool FitGradientUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::VectorPtr outputVectorYLo = _outputVectors[VECTOR_OUT_Y_LO]; Kst::VectorPtr outputVectorYHi = _outputVectors[VECTOR_OUT_Y_HI]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Gradient Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Lower Limit"); outputVectorYLo->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Upper Limit"); outputVectorYHi->setLabelInfo(label_info); int i = 0; int iLength = 0; bool bReturn = false; double* pInputs[3]; double c0 = 0.0; double cov00 = 0.0; double dSumSq = 0.0; double y; double yErr; if( precursor( inputVectorX, inputVectorY, 0, &iLength, false, true, 2, pInputs, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputVectorYLo, outputVectorYHi ) ) { if( !gsl_fit_mul( pInputs[XVALUES], 1, pInputs[YVALUES], 1, iLength, &c0, &cov00, &dSumSq ) ) { for( i=0; ivalue()[i] = y; outputVectorYResiduals->value()[i] = pInputs[YVALUES][i] - y; outputVectorYLo->value()[i] = y - yErr; outputVectorYHi->value()[i] = y + yErr; } outputVectorYParameters->value()[0] = c0; outputVectorYCovariance->value()[0] = cov00; outputScalar->setValue(dSumSq / ( (double)iLength - 2.0 )); bReturn = true; } } postcursor( false, pInputs ); return bReturn; } Kst::VectorPtr FitGradientUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitGradientUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList FitGradientUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitGradientUnweightedSource::inputScalarList() const { return QStringList(); } QStringList FitGradientUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitGradientUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_LO; vectors += VECTOR_OUT_Y_HI; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitGradientUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitGradientUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitGradientUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitGradientUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Gradient"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitGradientUnweightedPlugin::pluginName() const { return tr("Gradient Fit"); } QString FitGradientUnweightedPlugin::pluginDescription() const { return tr("Generates a gradient fit for a set of data."); } Kst::DataObject *FitGradientUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitGradientUnweightedPlugin* config = static_cast(configWidget)) { FitGradientUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitGradientUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitGradientUnweightedPlugin *widget = new ConfigWidgetFitGradientUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitGradientUnweightedPlugin, FitGradientUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gradient_unweighted/fitgradient_unweighted.h0000644000175000017500000000540712277111530025514 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITGRADIENTUNWEIGHTEDPLUGIN_H #define FITGRADIENTUNWEIGHTEDPLUGIN_H #include #include #include class FitGradientUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitGradientUnweightedSource(Kst::ObjectStore *store); ~FitGradientUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitGradientUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitGradientUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gradient_unweighted/gradient_unweighted.pro0000755000175000017500000000035612277111530025363 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitgradient_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitgradient_unweighted.cpp HEADERS += \ fitgradient_unweighted.h FORMS += fitgradient_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui0000644000175000017500000000501212277111530027060 0ustar synthsynth FitGradient_UnweightedConfig 0 0 420 89 400 0 0 0 X: false 0 0 0 0 Y: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/gradient_unweighted/kstplugin_fits_gradient_unweighted.desktop0000644000175000017500000000316312362705136031363 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitgradient_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gradient Plugin Name[ca]=Fits - Connector en gradient Name[ca@valencia]=Fits - Connector en gradient Name[de]=Verlauf-Anpassungs-Modul Name[fr]=Module de régression à gradient Name[it]=Estensione fits gradiente Name[nl]=Fits - Gradient Plugin Name[pl]=Wtyczka dopasowania gradientowego Name[pt]='Plugin' de Ajuste em Gradiente Name[pt_BR]=Plugin de ajuste em gradiente Name[sv]=Anpassning - Gradientinsticksprogram Name[uk]=Додаток градієнтного наближення Name[x-test]=xxFits - Gradient Pluginxx Comment=Implements a Gradient Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits en gradient pel Kst. Comment[ca@valencia]=Implementa un connector Fits en gradient pel Kst. Comment[de]=Implementiert ein Verlauf-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression à gradient pour Kst. Comment[it]=Implementa un'estensione fits gradiente per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor helling (gradient) aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania gradientowego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste em gradiente para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste em gradiente para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för gradientanpassning. Comment[uk]=Реалізує додаток градієнтного наближення у Kst. Comment[x-test]=xxImplements a Gradient Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/sinusoid_unweighted/0000755000175000017500000000000012362705136020660 5ustar synthsynthKst-2.0.8/src/plugins/fits/sinusoid_unweighted/kstplugin_fits_sinusoid_unweighted.desktop0000644000175000017500000000317312362705136031464 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitsinusoid_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Sinusoid Plugin Name[ca]=Fits - Connector sinusoïdal Name[ca@valencia]=Fits - Connector sinusoïdal Name[de]=Sinuskurven-Anpassungs-Modul Name[fr]=Module de régression sinusoïdale Name[it]=Estensione fits sinusoide Name[nl]=Fits - Sinusoid Plugin Name[pl]=Wtyczka dopasowania sinusoidalnego Name[pt]='Plugin' de Ajuste Sinusoidal Name[pt_BR]=Plugin de ajuste sinusoidal Name[sv]=Anpassning - Sinusinsticksprogram Name[uk]=Наближення: синусоїдальний додаток Name[x-test]=xxFits - Sinusoid Pluginxx Comment=Implements a Sinusoid Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits sinusoïdal pel Kst. Comment[ca@valencia]=Implementa un connector Fits sinusoïdal pel Kst. Comment[de]=Implementiert ein Sinuskurven-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression sinusoïdale pour Kst. Comment[it]=Implementa un'estensione fits sinusoide per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor aanpassing aan een sinusoïde. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania sinusoidalnego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste sinusoidal para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste sinusoidal para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för sinusanpassning. Comment[uk]=Реалізує додаток синусоїдального наближення у Kst. Comment[x-test]=xxImplements a Sinusoid Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/sinusoid_unweighted/sinusoid_unweighted.pro0000755000175000017500000000035612277111530025463 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitsinusoid_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitsinusoid_unweighted.cpp HEADERS += \ fitsinusoid_unweighted.h FORMS += fitsinusoid_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui0000644000175000017500000000762212277111530027171 0ustar synthsynth FitSinusoid_UnweightedConfig 0 0 419 198 400 0 0 0 X: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Harmonics: false 0 0 Period: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp0000644000175000017500000003146612362701575026164 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitsinusoid_unweighted.h" #include "objectstore.h" #include "ui_fitsinusoid_unweightedconfig.h" #include // #include "../common.h" #include "../linear.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_IN_PERIOD = "Period Scalar"; static const QString& SCALAR_IN_HARMONICS = "Harmonics Scalar"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitSinusoidUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitSinusoid_UnweightedConfig { public: ConfigWidgetFitSinusoidUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitSinusoid_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitSinusoidUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _scalarHarmonics->setObjectStore(store); _scalarPeriod->setObjectStore(store); _scalarHarmonics->setDefaultValue(0); _scalarPeriod->setDefaultValue(1); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarHarmonics, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarPeriod, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarHarmonics() { return _scalarHarmonics->selectedScalar(); }; void setSelectedScalarHarmonics(Kst::ScalarPtr scalar) { return _scalarHarmonics->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarPeriod() { return _scalarPeriod->selectedScalar(); }; void setSelectedScalarPeriod(Kst::ScalarPtr scalar) { return _scalarPeriod->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitSinusoidUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedScalarHarmonics(source->scalarHarmonics()); setSelectedScalarPeriod(source->scalarPeriod()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Sinusoid Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Scalar Harmonics", _scalarHarmonics->selectedScalar()->Name()); _cfg->setValue("Input Scalar Period", _scalarPeriod->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Sinusoid Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } QString scalarName = _cfg->value("Harmonics Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* harmonicsScalar = static_cast(object); if (harmonicsScalar) { setSelectedScalarHarmonics(harmonicsScalar); } scalarName = _cfg->value("Period Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* periodScalar = static_cast(object); if (periodScalar) { setSelectedScalarPeriod(periodScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitSinusoidUnweightedSource::FitSinusoidUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitSinusoidUnweightedSource::~FitSinusoidUnweightedSource() { } QString FitSinusoidUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Sinusoid").arg(vectorY()->descriptiveName());; } void FitSinusoidUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitSinusoidUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputScalar(SCALAR_IN_HARMONICS, config->selectedScalarHarmonics()); setInputScalar(SCALAR_IN_PERIOD, config->selectedScalarPeriod()); } } void FitSinusoidUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } double g_dPeriod; double calculate_matrix_entry( double dX, int iPos ) { double dY; if( iPos == 0 ) { dY = 1.0; } else if( iPos % 2 == 1 ) { dY = cos( (double)( ( iPos + 1 ) / 2 ) * 2.0 * M_PI * dX / g_dPeriod ); } else { dY = -sin( (double)( ( iPos + 0 ) / 2 ) * 2.0 * M_PI * dX / g_dPeriod ); } return dY; } bool FitSinusoidUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::ScalarPtr inputScalarHarmonics = _inputScalars[SCALAR_IN_HARMONICS]; Kst::ScalarPtr inputScalarPeriod = _inputScalars[SCALAR_IN_PERIOD]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Sinusoidal Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Sinusoidal Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; int iNumParams; iNumParams = 3 + ( 2 * (int)floor( inputScalarHarmonics->value() ) ); if( iNumParams >= 3 ) { g_dPeriod = inputScalarPeriod->value(); if( g_dPeriod > 0.0 ) { bReturn = kstfit_linear_unweighted( inputVectorX, inputVectorY, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar, iNumParams ); } } return bReturn; } Kst::VectorPtr FitSinusoidUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitSinusoidUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::ScalarPtr FitSinusoidUnweightedSource::scalarHarmonics() const { return _inputScalars[SCALAR_IN_HARMONICS]; } Kst::ScalarPtr FitSinusoidUnweightedSource::scalarPeriod() const { return _inputScalars[SCALAR_IN_PERIOD]; } QStringList FitSinusoidUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitSinusoidUnweightedSource::inputScalarList() const { QStringList scalars(SCALAR_IN_HARMONICS); scalars += SCALAR_IN_PERIOD; return scalars; } QStringList FitSinusoidUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitSinusoidUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitSinusoidUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitSinusoidUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitSinusoidUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitSinusoidUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Mean"; break; case 1: parameter = "cos(%1 2PI x/P)"; parameter = parameter.arg((index + 1 ) / 2); break; case 2: parameter = "-sin(%1 2PI x/P)"; parameter = parameter.arg((index + 0 ) / 2); break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitSinusoidUnweightedPlugin::pluginName() const { return tr("Sinusoid Fit"); } QString FitSinusoidUnweightedPlugin::pluginDescription() const { return tr("Generates a sinusoid fit for a set of data."); } Kst::DataObject *FitSinusoidUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitSinusoidUnweightedPlugin* config = static_cast(configWidget)) { Kst::ScalarPtr harmonics; Kst::ScalarPtr period; // access/create input scalars before creating plugin // in order to preserve continuous scalar shortnames if (setupInputsOutputs) { harmonics = config->selectedScalarHarmonics(); period = config->selectedScalarPeriod(); } FitSinusoidUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_HARMONICS, harmonics); object->setInputScalar(SCALAR_IN_PERIOD, period); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitSinusoidUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitSinusoidUnweightedPlugin *widget = new ConfigWidgetFitSinusoidUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitSinusoidUnweightedPlugin, FitSinusoidUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.h0000644000175000017500000000553412277111530025615 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITSINUSOIDUNWEIGHTEDPLUGIN_H #define FITSINUSOIDUNWEIGHTEDPLUGIN_H #include #include #include class FitSinusoidUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::ScalarPtr scalarHarmonics() const; Kst::ScalarPtr scalarPeriod() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitSinusoidUnweightedSource(Kst::ObjectStore *store); ~FitSinusoidUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitSinusoidUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitSinusoidUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/fits.pro0000644000175000017500000000100412277111530016254 0ustar synthsynthinclude($$PWD/../../../config.pri) TEMPLATE = subdirs CONFIG += ordered LibExists(gsl) { SUBDIRS += \ exponential_unweighted \ exponential_weighted \ gaussian_unweighted \ gaussian_weighted \ gradient_weighted \ gradient_unweighted \ kneefrequency \ linear_weighted \ linear_unweighted \ lorentzian_unweighted \ lorentzian_weighted \ polynomial_unweighted \ polynomial_weighted \ sinusoid_unweighted \ sinusoid_weighted } Kst-2.0.8/src/plugins/fits/linear_weighted/0000755000175000017500000000000012362705136017732 5ustar synthsynthKst-2.0.8/src/plugins/fits/linear_weighted/kstplugin_fits_linear_weighted.desktop0000644000175000017500000000341112362705136027603 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitlinear_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Linear Weighted Plugin Name[ca]=Fits - Connector lineal ponderat Name[ca@valencia]=Fits - Connector lineal ponderat Name[de]=Gewichtetes Linear-Anpassungs-Modul Name[fr]=Module de régression linéaire pondérée Name[it]=Estensione fits pesata lineare Name[nl]=Fits - Linear Weighted Plugin Name[pl]=Wtyczka dopasowania linowego ważonego Name[pt]='Plugin' de Ajuste Linear Ponderado Name[pt_BR]=Plugin de ajuste linear ponderado Name[sv]=Anpassning - Linjärt viktat insticksprogram Name[uk]=Наближення: лінійний зважений додаток Name[x-test]=xxFits - Linear Weighted Pluginxx Comment=Implements a Linear Weighted Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits lineal ponderat pel Kst. Comment[ca@valencia]=Implementa un connector Fits lineal ponderat pel Kst. Comment[de]=Implementiert ein gewichtetes Linear-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression linéaire pondérée pour Kst. Comment[it]=Implementa un'estensione fits pesata lineare Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor gewogen lineaire aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania liniowego ważonego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste linear ponderado para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste linear ponderado para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för linjär viktad anpassning. Comment[uk]=Реалізує додаток лінійного зваженого наближення у Kst. Comment[x-test]=xxImplements a Linear Weighted Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui0000644000175000017500000000636512277111530025320 0ustar synthsynth FitLinear_WeightedConfig 0 0 447 80 400 0 0 0 Input Vector - X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Input Vector - Y Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Input Vector - Weights false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/linear_weighted/fitlinear_weighted.h0000644000175000017500000000542612277111530023741 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITLINEARWEIGHTEDPLUGIN_H #define FITLINEARWEIGHTEDPLUGIN_H #include #include #include class FitLinearWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitLinearWeightedSource(Kst::ObjectStore *store); ~FitLinearWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitLinearWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitLinearWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/linear_weighted/linear_weighted.pro0000755000175000017500000000033612277111530023605 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitlinear_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitlinear_weighted.cpp HEADERS += \ fitlinear_weighted.h FORMS += fitlinear_weightedconfig.ui Kst-2.0.8/src/plugins/fits/linear_weighted/fitlinear_weighted.cpp0000644000175000017500000002774512362701575024315 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitlinear_weighted.h" #include "objectstore.h" #include "ui_fitlinear_weightedconfig.h" #include #include "../common.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& VECTOR_OUT_Y_LO = "Lo Vector"; static const QString& VECTOR_OUT_Y_HI = "Hi Vector"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitLinearWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitLinear_WeightedConfig { public: ConfigWidgetFitLinearWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitLinear_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitLinearWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitLinearWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Linear Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Linear Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitLinearWeightedSource::FitLinearWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitLinearWeightedSource::~FitLinearWeightedSource() { } QString FitLinearWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Linear").arg(vectorY()->descriptiveName()); } void FitLinearWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitLinearWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } } void FitLinearWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputVector(VECTOR_OUT_Y_LO, ""); setOutputVector(VECTOR_OUT_Y_HI, ""); setOutputScalar(SCALAR_OUT, ""); } bool FitLinearWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::VectorPtr outputVectorYLo = _outputVectors[VECTOR_OUT_Y_LO]; Kst::VectorPtr outputVectorYHi = _outputVectors[VECTOR_OUT_Y_HI]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Linear Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Linear Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); label_info.name = tr("Linear Fit Lower Limit"); outputVectorYLo->setLabelInfo(label_info); label_info.name = tr("Linear Fit Upper Limit"); outputVectorYHi->setLabelInfo(label_info); int i = 0; int iLength = 0; bool bReturn = false; double* pInputs[3]; double c0 = 0.0; double c1 = 0.0; double cov00 = 0.0; double cov01 = 0.0; double cov11 = 0.0; double dSumSq = 0.0; double y; double yErr; if( precursor( inputVectorX, inputVectorY, inputVectorWeights, &iLength, true, true, 2, pInputs, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputVectorYLo, outputVectorYHi ) ) { if( !gsl_fit_wlinear( pInputs[XVALUES], 1, pInputs[WEIGHTS], 1, pInputs[YVALUES], 1, iLength, &c0, &c1, &cov00, &cov01, &cov11, &dSumSq ) ) { for( i=0; ivalue()[i] = y; outputVectorYResiduals->value()[i] = pInputs[YVALUES][i] - y; outputVectorYLo->value()[i] = y - yErr; outputVectorYHi->value()[i] = y + yErr; } outputVectorYParameters->value()[0] = c0; outputVectorYParameters->value()[1] = c1; outputVectorYCovariance->value()[0] = cov00; outputVectorYCovariance->value()[1] = cov01; outputVectorYCovariance->value()[2] = cov11; outputScalar->setValue(dSumSq / ( (double)iLength - 2.0 )); bReturn = true; } } postcursor( true, pInputs ); return bReturn; } Kst::VectorPtr FitLinearWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitLinearWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitLinearWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } QStringList FitLinearWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitLinearWeightedSource::inputScalarList() const { return QStringList(); } QStringList FitLinearWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitLinearWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_LO; vectors += VECTOR_OUT_Y_HI; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitLinearWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitLinearWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitLinearWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitLinearWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Intercept"; break; case 1: parameter = "Gradient"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitLinearWeightedPlugin::pluginName() const { return tr("Linear Weighted Fit"); } QString FitLinearWeightedPlugin::pluginDescription() const { return tr("Generates a linear weighted fit for a set of data."); } Kst::DataObject *FitLinearWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitLinearWeightedPlugin* config = static_cast(configWidget)) { FitLinearWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitLinearWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitLinearWeightedPlugin *widget = new ConfigWidgetFitLinearWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitLinearWeightedPlugin, FitLinearWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/sinusoid_weighted/0000755000175000017500000000000012362705136020315 5ustar synthsynthKst-2.0.8/src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp0000644000175000017500000003373212362701575025254 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitsinusoid_weighted.h" #include "objectstore.h" #include "ui_fitsinusoid_weightedconfig.h" #include // #include "../common.h" #include "../linear_weighted.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_IN_PERIOD = "Period Scalar"; static const QString& SCALAR_IN_HARMONICS = "Harmonics Scalar"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitSinusoidWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitSinusoid_WeightedConfig { public: ConfigWidgetFitSinusoidWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitSinusoid_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitSinusoidWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); _scalarHarmonics->setObjectStore(store); _scalarPeriod->setObjectStore(store); _scalarHarmonics->setDefaultValue(0); _scalarPeriod->setDefaultValue(1); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarHarmonics, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarPeriod, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarHarmonics() { return _scalarHarmonics->selectedScalar(); }; void setSelectedScalarHarmonics(Kst::ScalarPtr scalar) { return _scalarHarmonics->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarPeriod() { return _scalarPeriod->selectedScalar(); }; void setSelectedScalarPeriod(Kst::ScalarPtr scalar) { return _scalarPeriod->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitSinusoidWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); setSelectedScalarHarmonics(source->scalarHarmonics()); setSelectedScalarPeriod(source->scalarPeriod()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Sinusoid Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->setValue("Input Scalar Harmonics", _scalarHarmonics->selectedScalar()->Name()); _cfg->setValue("Input Scalar Period", _scalarPeriod->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Sinusoid Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } QString scalarName = _cfg->value("Harmonics Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* harmonicsScalar = static_cast(object); if (harmonicsScalar) { setSelectedScalarHarmonics(harmonicsScalar); } scalarName = _cfg->value("Period Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* periodScalar = static_cast(object); if (periodScalar) { setSelectedScalarPeriod(periodScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitSinusoidWeightedSource::FitSinusoidWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitSinusoidWeightedSource::~FitSinusoidWeightedSource() { } QString FitSinusoidWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Sinusoid").arg(vectorY()->descriptiveName());; } void FitSinusoidWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitSinusoidWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); setInputScalar(SCALAR_IN_HARMONICS, config->selectedScalarHarmonics()); setInputScalar(SCALAR_IN_PERIOD, config->selectedScalarPeriod()); } } void FitSinusoidWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } double g_dPeriod; double calculate_matrix_entry( double dX, int iPos ) { double dY; if( iPos == 0 ) { dY = 1.0; } else if( iPos % 2 == 1 ) { dY = cos( (double)( ( iPos + 1 ) / 2 ) * 2.0 * M_PI * dX / g_dPeriod ); } else { dY = -sin( (double)( ( iPos + 0 ) / 2 ) * 2.0 * M_PI * dX / g_dPeriod ); } return dY; } bool FitSinusoidWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::ScalarPtr inputScalarHarmonics = _inputScalars[SCALAR_IN_HARMONICS]; Kst::ScalarPtr inputScalarPeriod = _inputScalars[SCALAR_IN_PERIOD]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Sinusoidal Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Sinusoidal Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; int iNumParams; iNumParams = 3 + ( 2 * (int)floor( inputScalarHarmonics->value() ) ); if( iNumParams >= 3 ) { g_dPeriod = inputScalarPeriod->value(); if( g_dPeriod > 0.0 ) { bReturn = kstfit_linear_weighted( inputVectorX, inputVectorY, inputVectorWeights, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar, iNumParams ); } } return bReturn; } Kst::VectorPtr FitSinusoidWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitSinusoidWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitSinusoidWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } Kst::ScalarPtr FitSinusoidWeightedSource::scalarHarmonics() const { return _inputScalars[SCALAR_IN_HARMONICS]; } Kst::ScalarPtr FitSinusoidWeightedSource::scalarPeriod() const { return _inputScalars[SCALAR_IN_PERIOD]; } QStringList FitSinusoidWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitSinusoidWeightedSource::inputScalarList() const { QStringList scalars(SCALAR_IN_HARMONICS); scalars += SCALAR_IN_PERIOD; return scalars; } QStringList FitSinusoidWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitSinusoidWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitSinusoidWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitSinusoidWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitSinusoidWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitSinusoidWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Mean"; break; case 1: parameter = "cos(%1 2PI x/P)"; parameter = parameter.arg((index + 1 ) / 2); break; case 2: parameter = "-sin(%1 2PI x/P)"; parameter = parameter.arg((index + 0 ) / 2); break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitSinusoidWeightedPlugin::pluginName() const { return tr("Sinusoid Weighted Fit"); } QString FitSinusoidWeightedPlugin::pluginDescription() const { return tr("Generates a sinusoid weighted fit for a set of data."); } Kst::DataObject *FitSinusoidWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitSinusoidWeightedPlugin* config = static_cast(configWidget)) { Kst::ScalarPtr harmonics; Kst::ScalarPtr period; // access/create input scalars before creating plugin // in order to preserve continuous scalar shortnames if (setupInputsOutputs) { harmonics = config->selectedScalarHarmonics(); period = config->selectedScalarPeriod(); } FitSinusoidWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_HARMONICS, harmonics); object->setInputScalar(SCALAR_IN_PERIOD, period); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitSinusoidWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitSinusoidWeightedPlugin *widget = new ConfigWidgetFitSinusoidWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitSinusoidWeightedPlugin, FitSinusoidWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/sinusoid_weighted/kstplugin_fits_sinusoid_weighted.desktop0000644000175000017500000000357412362705136030563 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitsinusoid_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Sinusoid Weighted Plugin Name[ca]=Fits - Connector sinusoïdal ponderat Name[ca@valencia]=Fits - Connector sinusoïdal ponderat Name[de]=Gewichtetes Sinuskurven-Anpassungs-Modul Name[fr]=Module de régression sinusoïdale pondérée Name[it]=Estensione fits sinusoide pesata Name[nl]=Fits - Sinusoid Weighted Plugin Name[pl]=Wtyczka dopasowania sinusoidalnego ważonego Name[pt]='Plugin' de Ajuste Sinusoidal Ponderado Name[pt_BR]=Plugin de ajuste sinusoidal ponderado Name[sv]=Anpassning - viktat sinusinsticksprogram Name[uk]=Наближення: синусоїдальний зважений додаток Name[x-test]=xxFits - Sinusoid Weighted Pluginxx Comment=Implements a Sinusoid Weighted Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits sinusoïdal ponderat pel Kst. Comment[ca@valencia]=Implementa un connector Fits sinusoïdal ponderat pel Kst. Comment[de]=Implementiert ein gewichtetes Sinuskurven-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression sinusoïdale pondérée pour Kst. Comment[it]=Implementa un'estensione fits sinusoide pesata per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor gewogen aanpassing aan een sinusoïde. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania sinusoidalnego ważonego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste sinusoidal ponderado para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste sinusoidal ponderado para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för viktad sinusanpassning. Comment[uk]=Реалізує додаток синусоїдального зваженого наближення у Kst. Comment[x-test]=xxImplements a Sinusoid Weighted Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui0000644000175000017500000001456312277111530026265 0ustar synthsynth FitSinusoid_WeightedConfig 0 0 426 193 400 0 0 0 Input Vector - X false Qt::Horizontal 40 20 0 0 0 0 Input Vector - Y false Qt::Horizontal 40 20 0 0 0 0 Input Vector - Weights false Qt::Horizontal 40 20 0 0 0 0 Input Scalar - Harmonics false Qt::Horizontal 40 20 0 0 Input Scalar - Period false Qt::Horizontal 40 20 Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.h0000644000175000017500000000557012277111530024707 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITSINUSOIDWEIGHTEDPLUGIN_H #define FITSINUSOIDWEIGHTEDPLUGIN_H #include #include #include class FitSinusoidWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; Kst::ScalarPtr scalarHarmonics() const; Kst::ScalarPtr scalarPeriod() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitSinusoidWeightedSource(Kst::ObjectStore *store); ~FitSinusoidWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitSinusoidWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitSinusoidWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/sinusoid_weighted/sinusoid_weighted.pro0000755000175000017500000000034612277111530024554 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitsinusoid_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitsinusoid_weighted.cpp HEADERS += \ fitsinusoid_weighted.h FORMS += fitsinusoid_weightedconfig.ui Kst-2.0.8/src/plugins/fits/polynomial_weighted/0000755000175000017500000000000012362705136020643 5ustar synthsynthKst-2.0.8/src/plugins/fits/polynomial_weighted/polynomial_weighted.pro0000755000175000017500000000035612277111530025431 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitpolynomial_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitpolynomial_weighted.cpp HEADERS += \ fitpolynomial_weighted.h FORMS += fitpolynomial_weightedconfig.ui Kst-2.0.8/src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui0000644000175000017500000001261112277111530027131 0ustar synthsynth FitPolynomial_WeightedConfig 0 0 429 186 400 0 0 0 Input Vector - X false Qt::Horizontal 40 20 0 0 0 0 Input Vector - Y false Qt::Horizontal 40 20 0 0 0 0 Input Vector - Weights false Qt::Horizontal 40 20 0 0 0 0 Input Scalar - Order false Qt::Horizontal 40 20 Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp0000644000175000017500000003171612362701575026130 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitpolynomial_weighted.h" #include "objectstore.h" #include "ui_fitpolynomial_weightedconfig.h" #include // #include "../common.h" #include "../linear_weighted.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_IN = "Order Scalar"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitPolynomialWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitPolynomial_WeightedConfig { public: ConfigWidgetFitPolynomialWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitPolynomial_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitPolynomialWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarOrder->setDefaultValue(2); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarOrder() { return _scalarOrder->selectedScalar(); }; void setSelectedScalarOrder(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitPolynomialWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); setSelectedScalarOrder(source->scalarOrder()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Polynomial Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->setValue("Input Scalar Order", _scalarOrder->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Polynomial Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } QString scalarName = _cfg->value("Order Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* orderScalar = static_cast(object); if (orderScalar) { setSelectedScalarOrder(orderScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitPolynomialWeightedSource::FitPolynomialWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitPolynomialWeightedSource::~FitPolynomialWeightedSource() { } QString FitPolynomialWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Polynomial").arg(vectorY()->descriptiveName());; } void FitPolynomialWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitPolynomialWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); setInputScalar(SCALAR_IN, config->selectedScalarOrder()); } } void FitPolynomialWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } bool FitPolynomialWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::ScalarPtr inputScalarOrder = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Polynomial Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Polynomial Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; int iNumParams; iNumParams = 1 + (int)floor( inputScalarOrder->value() ); if( iNumParams > 0 ) { bReturn = kstfit_linear_weighted( inputVectorX, inputVectorY, inputVectorWeights, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar, iNumParams ); } return bReturn; } QString FitPolynomialWeightedSource::parameterVectorToString() const { QString str = Name(); if (hasParameterVector()) { Kst::VectorPtr vectorParam = _outputVectors["Parameters Vector"]; for (int i = 0; i < vectorParam->length(); i++) { QString paramName = parameterName(i); if (!paramName.isEmpty()) { if (_outputScalars.contains(paramName)) { QString name = _outputScalars[paramName]->Name(); double value = _outputScalars[paramName]->value(); QString sign(' '); if (value >= 0) { sign += '+'; } if (i == 0) { str += QString("\n[%1]").arg(name); } else if (i == 1) { // Special case x^1 to x str += QString("%1[%2]x").arg(sign).arg(name); } else { str += QString("%1[%2]%3").arg(sign).arg(name).arg(paramName); } } } } } return str; } Kst::VectorPtr FitPolynomialWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitPolynomialWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitPolynomialWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } Kst::ScalarPtr FitPolynomialWeightedSource::scalarOrder() const { return _inputScalars[SCALAR_IN]; } QStringList FitPolynomialWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitPolynomialWeightedSource::inputScalarList() const { return QStringList(SCALAR_IN); } QStringList FitPolynomialWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitPolynomialWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitPolynomialWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitPolynomialWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitPolynomialWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitPolynomialWeightedSource::parameterName(int index) const { return QString("x^%1").arg(index); } // Name used to identify the plugin. Used when loading the plugin. QString FitPolynomialWeightedPlugin::pluginName() const { return tr("Polynomial Weighted Fit"); } QString FitPolynomialWeightedPlugin::pluginDescription() const { return tr("Generates a polynomial weighted fit for a set of data."); } Kst::DataObject *FitPolynomialWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitPolynomialWeightedPlugin* config = static_cast(configWidget)) { Kst::ScalarPtr order; // access/create input scalars before creating plugin // in order to preserve continuous scalar shortnames if (setupInputsOutputs) { order = config->selectedScalarOrder(); } FitPolynomialWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, order); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitPolynomialWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitPolynomialWeightedPlugin *widget = new ConfigWidgetFitPolynomialWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitPolynomialWeightedPlugin, FitPolynomialWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/polynomial_weighted/kstplugin_fits_polynomial_weighted.desktop0000644000175000017500000000361012362705136031426 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitpolynomial_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Polynomial Weighted Plugin Name[ca]=Fits - Connector polinòmic ponderat Name[ca@valencia]=Fits - Connector polinòmic ponderat Name[de]=Gewichtetes Polynom-Anpassungs-Modul Name[fr]=Module de régression polynomiale pondérée Name[it]=Estensione fits polinomiale pesata Name[nl]=Fits - Polynomial Weighted Plugin Name[pl]=Wtyczka dopasowania wielomianowego ważonego Name[pt]='Plugin' de Ajuste Polinomial Ponderado Name[pt_BR]=Plugin de ajuste polinomial ponderado Name[sv]=Anpassning - Viktat polynom-insticksprogram Name[uk]=Наближення: поліноміальний зважений додаток Name[x-test]=xxFits - Polynomial Weighted Pluginxx Comment=Implements a Polynomial Weighted Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits polinòmic ponderat pel Kst. Comment[ca@valencia]=Implementa un connector Fits polinòmic ponderat pel Kst. Comment[de]=Implementiert ein gewichtetes Polynom-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression polynomiale pondérée pour Kst. Comment[it]=Implementa un'estensione fits polinomiale pesata per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor gewogen aanpassing aan een Lorentzfunctie. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania wielomianowego ważonego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste polinomial ponderado para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste polinomial ponderado para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för viktad polynom-anpassning. Comment[uk]=Реалізує додаток поліноміального зваженого наближення у Kst. Comment[x-test]=xxImplements a Polynomial Weighted Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.h0000644000175000017500000000561612277111530025564 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITPOLYNOMIALWEIGHTEDPLUGIN_H #define FITPOLYNOMIALWEIGHTEDPLUGIN_H #include #include #include class FitPolynomialWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; Kst::ScalarPtr scalarOrder() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitPolynomialWeightedSource(Kst::ObjectStore *store); ~FitPolynomialWeightedSource(); virtual QString parameterName(int index) const; virtual QString parameterVectorToString() const; friend class Kst::ObjectStore; }; class FitPolynomialWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitPolynomialWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/lorentzian_weighted/0000755000175000017500000000000012362705136020645 5ustar synthsynthKst-2.0.8/src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.h0000644000175000017500000000546112277111530025566 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITLORENTZIANWEIGHTEDPLUGIN_H #define FITLORENTZIANWEIGHTEDPLUGIN_H #include #include #include class FitLorentzianWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitLorentzianWeightedSource(Kst::ObjectStore *store); ~FitLorentzianWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitLorentzianWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitLorentzianWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/lorentzian_weighted/kstplugin_fits_lorentzian_weighted.desktop0000644000175000017500000000363612362705136031442 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitlorentzian_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gradient Lorentzian Plugin Name[ca]=Fits - Connector de Lorentz en gradient Name[ca@valencia]=Fits - Connector de Lorentz en gradient Name[de]=Verlauf-Lorentz-Anpassungs-Modul Name[fr]=Module de régression à gradient lorentzienne Name[it]=Estensione fits gradiente lorentziano Name[nl]=Fits - Gradient Lorentzian Plugin Name[pl]=Wtyczka dopasowania gradientowego Lorentza Name[pt]='Plugin' de Ajuste de Lorentz em Gradiente Name[pt_BR]=Plugin de ajuste de Lorentz em gradiente Name[sv]=Anpassning - Lorentz gradientinsticksprogram Name[uk]=Наближення: градієнтно-лоренців додаток Name[x-test]=xxFits - Gradient Lorentzian Pluginxx Comment=Implements a Gradient Lorentzian Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits de Lorentz en gradient pel Kst. Comment[ca@valencia]=Implementa un connector Fits de Lorentz en gradient pel Kst. Comment[de]=Implementiert ein Lorentz-Verlauf-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression à gradient lorentzienne pour Kst. Comment[it]=Implementa un'estensione fits gradiente lorentziano per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor aanpassing aan helling (gradiënt) Lorentzfunctie. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania gradientowego Lorentza dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste de Lorentz em gradiente para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste de Lorentz em gradiente para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Lorentz gradientanpassning. Comment[uk]=Реалізує додаток градієнтного лоренцевого наближення у Kst. Comment[x-test]=xxImplements a Gradient Lorentzian Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp0000644000175000017500000003003312362701575026123 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitlorentzian_weighted.h" #include "objectstore.h" #include "ui_fitlorentzian_weightedconfig.h" #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear_weighted.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitLorentzianWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitLorentzian_WeightedConfig { public: ConfigWidgetFitLorentzianWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitLorentzian_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitLorentzianWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitLorentzianWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Lorentzian Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Lorentzian Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitLorentzianWeightedSource::FitLorentzianWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitLorentzianWeightedSource::~FitLorentzianWeightedSource() { } QString FitLorentzianWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Lorentzian").arg(vectorY()->descriptiveName());; } void FitLorentzianWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitLorentzianWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } } void FitLorentzianWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { double dMin; double dMax; gsl_stats_minmax( &dMin, &dMax, pdX, 1, iLength ); pdParameterEstimates[0] = gsl_stats_mean( pdX, 1, iLength ); pdParameterEstimates[1] = ( dMax - dMin ) / 2.0; pdParameterEstimates[2] = gsl_stats_max( pdY, 1, iLength ); } double function_calculate( double dX, double* pdParameters ) { double dMean = pdParameters[0]; double dHW = pdParameters[1]; double dScale = pdParameters[2]; double dY; dY = ( dScale / M_PI ) * ( dHW / 2.0 ); dY /= ( ( dX - dMean ) * ( dX - dMean ) )+( ( dHW / 2.0 ) * ( dHW / 2.0 ) ); return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dMean = pdParameters[0]; double dHW = pdParameters[1]; double dScale = pdParameters[2]; double dDenom; double ddMean; double ddHW; double ddScale; dDenom = ( ( dX - dMean ) * ( dX - dMean ) ) + ( ( dHW / 2.0 ) * ( dHW / 2.0 ) ); ddMean = ( dScale / M_PI ) * dHW * ( dMean - dX ) / ( dDenom * dDenom ); ddHW = ( dScale / ( 2.0 * M_PI ) ) / ( dDenom * dDenom ); ddHW *= dDenom - ( dHW * dHW / 2.0 ); ddScale = ( 1.0 / M_PI ) * ( dHW / 2.0 ) / dDenom; pdDerivatives[0] = ddMean; pdDerivatives[1] = ddHW; pdDerivatives[2] = ddScale; } bool FitLorentzianWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Lorentzian Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Lorentzian Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear_weighted( inputVectorX, inputVectorY, inputVectorWeights, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitLorentzianWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitLorentzianWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitLorentzianWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } QStringList FitLorentzianWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitLorentzianWeightedSource::inputScalarList() const { return QStringList(); } QStringList FitLorentzianWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitLorentzianWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitLorentzianWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitLorentzianWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitLorentzianWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitLorentzianWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Mean"; break; case 1: parameter = "Half-width"; break; case 2: parameter = "Scale"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitLorentzianWeightedPlugin::pluginName() const { return tr("Lorentzian Weighted Fit"); } QString FitLorentzianWeightedPlugin::pluginDescription() const { return tr("Generates a lorentzian weighted fit for a set of data."); } Kst::DataObject *FitLorentzianWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitLorentzianWeightedPlugin* config = static_cast(configWidget)) { FitLorentzianWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitLorentzianWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitLorentzianWeightedPlugin *widget = new ConfigWidgetFitLorentzianWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitLorentzianWeightedPlugin, FitLorentzianWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/lorentzian_weighted/lorentzian_weighted.pro0000755000175000017500000000035612277111530025435 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitlorentzian_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitlorentzian_weighted.cpp HEADERS += \ fitlorentzian_weighted.h FORMS += fitlorentzian_weightedconfig.ui Kst-2.0.8/src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui0000644000175000017500000000650312277111530027140 0ustar synthsynth FitLorentzian_WeightedConfig 0 0 436 113 400 0 0 0 Input Vector - X false 0 0 0 0 Input Vector - Y false 0 0 0 0 Input Vector - Weights false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/linear_unweighted/0000755000175000017500000000000012362705136020275 5ustar synthsynthKst-2.0.8/src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp0000644000175000017500000002550112362701575025207 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitlinear_unweighted.h" #include "objectstore.h" #include "ui_fitlinear_unweightedconfig.h" #include #include "../common.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& VECTOR_OUT_Y_LO = "Lo Vector"; static const QString& VECTOR_OUT_Y_HI = "Hi Vector"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitLinearUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitLinear_UnweightedConfig { public: ConfigWidgetFitLinearUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitLinear_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitLinearUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitLinearUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Linear Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Linear Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitLinearUnweightedSource::FitLinearUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitLinearUnweightedSource::~FitLinearUnweightedSource() { } QString FitLinearUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Unweighted Linear").arg(vectorY()->descriptiveName()); } void FitLinearUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitLinearUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void FitLinearUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputVector(VECTOR_OUT_Y_LO, ""); setOutputVector(VECTOR_OUT_Y_HI, ""); setOutputScalar(SCALAR_OUT, ""); } bool FitLinearUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::VectorPtr outputVectorYLo = _outputVectors[VECTOR_OUT_Y_LO]; Kst::VectorPtr outputVectorYHi = _outputVectors[VECTOR_OUT_Y_HI]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; int i = 0; int iLength = 0; bool bReturn = false; double* pInputs[3]; double c0 = 0.0; double c1 = 0.0; double cov00 = 0.0; double cov01 = 0.0; double cov11 = 0.0; double dSumSq = 0.0; double y; double yErr; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Linear Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Linear Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); label_info.name = tr("Linear Fit Lower Limit"); outputVectorYLo->setLabelInfo(label_info); label_info.name = tr("Linear Fit Upper Limit"); outputVectorYHi->setLabelInfo(label_info); if( precursor( inputVectorX, inputVectorY, 0, &iLength, false, true, 2, pInputs, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputVectorYLo, outputVectorYHi ) ) { if( !gsl_fit_linear( pInputs[XVALUES], 1, pInputs[YVALUES], 1, iLength, &c0, &c1, &cov00, &cov01, &cov11, &dSumSq ) ) { for( i=0; ivalue()[i] = y; outputVectorYResiduals->value()[i] = pInputs[YVALUES][i] - y; outputVectorYLo->value()[i] = y - yErr; outputVectorYHi->value()[i] = y + yErr; } outputVectorYParameters->value()[0] = c0; outputVectorYParameters->value()[1] = c1; outputVectorYCovariance->value()[0] = cov00; outputVectorYCovariance->value()[1] = cov01; outputVectorYCovariance->value()[2] = cov11; outputScalar->setValue(dSumSq / ( (double)iLength - 2.0 )); bReturn = true; } } postcursor( false, pInputs ); return bReturn; } Kst::VectorPtr FitLinearUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitLinearUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList FitLinearUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitLinearUnweightedSource::inputScalarList() const { return QStringList(); } QStringList FitLinearUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitLinearUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_LO; vectors += VECTOR_OUT_Y_HI; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitLinearUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitLinearUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitLinearUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitLinearUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Intercept"; break; case 1: parameter = "Gradient"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitLinearUnweightedPlugin::pluginName() const { return tr("Linear Fit"); } QString FitLinearUnweightedPlugin::pluginDescription() const { return tr("Generates a linear fit for a set of data."); } Kst::DataObject *FitLinearUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitLinearUnweightedPlugin* config = static_cast(configWidget)) { FitLinearUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitLinearUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitLinearUnweightedPlugin *widget = new ConfigWidgetFitLinearUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitLinearUnweightedPlugin, FitLinearUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/linear_unweighted/fitlinear_unweighted.h0000644000175000017500000000537112277111530024646 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITLINEARUNWEIGHTEDPLUGIN_H #define FITLINEARUNWEIGHTEDPLUGIN_H #include #include #include class FitLinearUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitLinearUnweightedSource(Kst::ObjectStore *store); ~FitLinearUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitLinearUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitLinearUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui0000644000175000017500000000524712277111530026224 0ustar synthsynth FitLinear_UnweightedConfig 0 0 438 122 400 0 0 0 X: false _vectorX 0 0 0 0 Y: false _vectorY 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/linear_unweighted/kstplugin_fits_linear_unweighted.desktop0000644000175000017500000000302112362705136030506 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitlinear_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Linear Plugin Name[ca]=Fits - Connector lineal Name[ca@valencia]=Fits - Connector lineal Name[de]=Linear-Anpassungs-Modul Name[fr]=Module de régression linéaire Name[it]=Estensione fits lineare Name[nl]=Fits - Linear Plugin Name[pl]=Wtyczka dopasowania linowego Name[pt]='Plugin' de Ajuste Linear Name[pt_BR]=Plugin de ajuste linear Name[sv]=Anpassning - Linjärt insticksprogram Name[uk]=Наближення: лінійний додаток Name[x-test]=xxFits - Linear Pluginxx Comment=Implements a Linear Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits lineal pel Kst. Comment[ca@valencia]=Implementa un connector Fits lineal pel Kst. Comment[de]=Implementiert ein Linear-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression linéaire pour Kst. Comment[it]=Implementa un'estensione fits lineare per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor lineaire aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania liniowego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste linear para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste linear para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för linjär anpassning. Comment[uk]=Реалізує додаток лінійного наближення у Kst. Comment[x-test]=xxImplements a Linear Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/linear_unweighted/linear_unweighted.pro0000755000175000017500000000034612277111530024514 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitlinear_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitlinear_unweighted.cpp HEADERS += \ fitlinear_unweighted.h FORMS += fitlinear_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/kneefrequency/0000755000175000017500000000000012362705136017444 5ustar synthsynthKst-2.0.8/src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui0000644000175000017500000001107512277111530024536 0ustar synthsynth FitKneeFrequencyConfig 0 0 427 215 400 0 0 0 Input Vector - X false 0 0 0 0 Input Vector - Y false 0 0 0 0 Input Scalar - Max. 1/f^a Freq false 0 0 Input Scalar - Min. White Noise Freq false 0 0 Input Scalar - White Noise C false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/fits/kneefrequency/kneefrequency.pro0000755000175000017500000000032612277111530023030 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitkneefrequency) LIBS += -l$$kstlib(gsl) SOURCES += \ fitkneefrequency.cpp HEADERS += \ fitkneefrequency.h FORMS += fitkneefrequencyconfig.ui Kst-2.0.8/src/plugins/fits/kneefrequency/kstplugin_fits_kneefrequency.desktop0000644000175000017500000000352712362705136027037 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitkneefrequency X-Kst-Plugin-Author=The University of Toronto Name=Fits - Knee Frequency Plugin Name[ca]=Fits - Connector d'angle de curvatura de freqüència Name[ca@valencia]=Fits - Connector d'angle de curvatura de freqüència Name[de]=Grenzfrequenz-Anpassungs-Modul Name[fr]=Module de régression par fréquence coin (knee) Name[it]=Estensione fits frequenza di ginocchio Name[nl]=Fits - Knee Frequency Plugin Name[pl]=Wtyczka dopasowania częstotliwości kolana Name[pt]='Plugin' de Ajuste de Frequência Name[pt_BR]=Plugin de ajuste de frequência Name[sv]=Anpassning - Knäfrekvens-insticksprogram Name[uk]=Наближення: додаток частоти зламів Name[x-test]=xxFits - Knee Frequency Pluginxx Comment=Implements a Knee Frequency Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits d'angle de curvatura de freqüència pel Kst. Comment[ca@valencia]=Implementa un connector Fits d'angle de curvatura de freqüència pel Kst. Comment[de]=Implementiert ein Grenzfrequenz-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression par fréquence coin (knee) pour Kst. Comment[it]=Implementa un'estensione fits frequenza di ginocchio per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor de "knee frequency". Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania częstotliwości kolana dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste de frequência para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste de frequência para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för knäfrekvens-anpassning. Comment[uk]=Реалізує додаток частоти зламів (наближення) у Kst. Comment[x-test]=xxImplements a Knee Frequency Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/kneefrequency/fitkneefrequency.cpp0000644000175000017500000003760112362701575023531 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitkneefrequency.h" #include "objectstore.h" #include "ui_fitkneefrequencyconfig.h" #include #include "../common.h" #define KNEEFREQ_NUMPARAMETERS 5 static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& SCALAR_IN_MAX = "Max 1/f^a Freq Scalar"; static const QString& SCALAR_IN_MIN = "Min. White Noise Freq Scalar"; static const QString& SCALAR_IN_WHITENOISE = "White Noise C Scalar"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; class ConfigWidgetFitKneeFrequencyPlugin : public Kst::DataObjectConfigWidget, public Ui_FitKneeFrequencyConfig { public: ConfigWidgetFitKneeFrequencyPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitKneeFrequencyConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitKneeFrequencyPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _scalarMax->setObjectStore(store); _scalarMin->setObjectStore(store); _scalarWhiteNoise->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarMax, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarMin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarWhiteNoise, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarMax() { return _scalarMax->selectedScalar(); }; void setSelectedScalarMax(Kst::ScalarPtr scalar) { return _scalarMax->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarMin() { return _scalarMin->selectedScalar(); }; void setSelectedScalarMin(Kst::ScalarPtr scalar) { return _scalarMin->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedScalarWhiteNoise() { return _scalarWhiteNoise->selectedScalar(); }; void setSelectedScalarWhiteNoise(Kst::ScalarPtr scalar) { return _scalarWhiteNoise->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitKneeFrequencySource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedScalarMax(source->scalarMax()); setSelectedScalarMin(source->scalarMin()); setSelectedScalarWhiteNoise(source->scalarWhiteNoise()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Knee Frequency Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Scalar Max 1/f^a Freq", _scalarMax->selectedScalar()->Name()); _cfg->setValue("Input Scalar Min. White Noise Freq", _scalarMin->selectedScalar()->Name()); _cfg->setValue("Input Scalar White Noise C", _scalarWhiteNoise->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Knee Frequency Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } QString scalarName = _cfg->value("Input Scalar Max 1/f^a Freq").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* maxScalar = static_cast(object); if (maxScalar) { setSelectedScalarMax(maxScalar); } scalarName = _cfg->value("Input Scalar Min. White Noise Freq").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* minScalar = static_cast(object); if (minScalar) { setSelectedScalarMin(minScalar); } scalarName = _cfg->value("Input Scalar White Noise C").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* whiteNoiseScalar = static_cast(object); if (whiteNoiseScalar) { setSelectedScalarWhiteNoise(whiteNoiseScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitKneeFrequencySource::FitKneeFrequencySource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitKneeFrequencySource::~FitKneeFrequencySource() { } QString FitKneeFrequencySource::_automaticDescriptiveName() const { return tr("Fit Knee Frequency Plugin"); } void FitKneeFrequencySource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitKneeFrequencyPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputScalar(SCALAR_IN_MAX, config->selectedScalarMax()); setInputScalar(SCALAR_IN_MIN, config->selectedScalarMin()); setInputScalar(SCALAR_IN_WHITENOISE, config->selectedScalarWhiteNoise()); } } void FitKneeFrequencySource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); } bool FitKneeFrequencySource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::ScalarPtr inputScalarMax = _inputScalars[SCALAR_IN_MAX]; Kst::ScalarPtr inputScalarMin = _inputScalars[SCALAR_IN_MIN]; Kst::ScalarPtr inputScalarWhiteNoise = _inputScalars[SCALAR_IN_WHITENOISE]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; if (inputVectorX->length() != inputVectorY->length()) { _errorString = tr("Error: Input Vector Sizes do not match"); return false; } if (inputVectorX->length() < 1) { _errorString = tr("Error: Input Vector X invalid"); return false; } int inArraysLength = inputVectorX->length(); outputVectorYFitted->resize(inArraysLength); outputVectorYResiduals->resize(inArraysLength); outputVectorYParameters->resize(KNEEFREQ_NUMPARAMETERS); double xi, yi; int i; double maxOneOverFFreq, minWhiteNoiseFreq, whiteNoiseC; maxOneOverFFreq = inputScalarMax->value(); minWhiteNoiseFreq = inputScalarMin->value(); whiteNoiseC = inputScalarWhiteNoise->value(); int maxOneOverFIndex, minWhiteNoiseIndex; //fast calculation of index for maxOneOverFFreq int i_bot = 0; int i_top = inArraysLength - 1; while (i_bot + 1 < i_top) { int i0 = (i_top + i_bot)/2; if (maxOneOverFFreq < inputVectorX->value()[i0]) { i_top = i0; } else { i_bot = i0; } } maxOneOverFIndex = i_top; //top because we use i_bot+1. //fast calculation of index for minWhiteNoiseFreq i_bot = 0; i_top = inArraysLength - 1; while (i_bot + 1 < i_top) { int i0 = (i_top + i_bot)/2; if (minWhiteNoiseFreq < inputVectorX->value()[i0]) { i_top = i0; } else { i_bot = i0; } } minWhiteNoiseIndex = i_top; //verify calculated indices. if ( !(maxOneOverFIndex>0) || !(minWhiteNoiseIndex>=maxOneOverFIndex) || !(minWhiteNoiseIndex<(inArraysLength-1)) ) { _errorString = tr("Error: Input Frequencies are Invalid\n"); return false; } // calculate white noise limit double sumY, sumY2; sumY = sumY2 = 0; for (i = minWhiteNoiseIndex; i < inArraysLength; ++i) { yi = inputVectorY->value()[i]; sumY += yi; sumY2 += pow(yi,2); } double ybar, ysigma; ybar = sumY/(inArraysLength - minWhiteNoiseIndex); ysigma = sqrt((sumY2 - 2*ybar*sumY + pow(ybar,2)*(inArraysLength - minWhiteNoiseIndex))/(inArraysLength - minWhiteNoiseIndex)); // end calculate white noise limit // fit 1/f noise double sumLnXLnY, sumLnX, sumLnY, sumLnX2; sumLnXLnY = sumLnX = sumLnY = sumLnX2 = 0; for (i = 0; i < maxOneOverFIndex; ++i) { xi = inputVectorX->value()[i]; yi = inputVectorY->value()[i]; if (!(xi>0) || !((yi-ybar)>0)) { _errorString = tr("Error: Input Data Invalid.\n"); return false; } sumLnXLnY += log(xi)*log(yi-ybar); //-ybar to isolate 1/f noise. sumLnX += log(xi); sumLnY += log(yi-ybar); sumLnX2 += pow(log(xi),2); } double a, b; a = (maxOneOverFIndex*sumLnXLnY - sumLnX*sumLnY)/(maxOneOverFIndex*sumLnX2 - pow(sumLnX,2)); b = exp((sumLnY - a*sumLnX)/maxOneOverFIndex); // end fit 1/f noise double knee_freq = pow(ybar*whiteNoiseC/b,1.0/a); // calculate knee frequency. // output fit data for (i = 0; i < maxOneOverFIndex; ++i) { outputVectorYFitted->value()[i] = b * pow(inputVectorX->value()[i],a) + ybar; outputVectorYResiduals->value()[i] = inputVectorY->value()[i] - outputVectorYFitted->value()[i]; } for (i = maxOneOverFIndex; i < minWhiteNoiseIndex; ++i) { // zeros for unfitted region. outputVectorYFitted->value()[i] = 0; outputVectorYResiduals->value()[i] = 0; } for (i = minWhiteNoiseIndex; i < inArraysLength; ++i) { outputVectorYFitted->value()[i] = ybar; outputVectorYResiduals->value()[i] = outputVectorYFitted->value()[i] - ybar; } outputVectorYParameters->value()[0] = ybar; outputVectorYParameters->value()[1] = ysigma; outputVectorYParameters->value()[2] = b; outputVectorYParameters->value()[3] = -a; outputVectorYParameters->value()[4] = knee_freq; return true; } Kst::VectorPtr FitKneeFrequencySource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitKneeFrequencySource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::ScalarPtr FitKneeFrequencySource::scalarMax() const { return _inputScalars[SCALAR_IN_MAX]; } Kst::ScalarPtr FitKneeFrequencySource::scalarMin() const { return _inputScalars[SCALAR_IN_MIN]; } Kst::ScalarPtr FitKneeFrequencySource::scalarWhiteNoise() const { return _inputScalars[SCALAR_IN_WHITENOISE]; } QStringList FitKneeFrequencySource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitKneeFrequencySource::inputScalarList() const { QStringList scalars(SCALAR_IN_MAX); scalars += SCALAR_IN_MIN; scalars += SCALAR_IN_WHITENOISE; return scalars; } QStringList FitKneeFrequencySource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitKneeFrequencySource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitKneeFrequencySource::outputScalarList() const { return QStringList( /*SCALAR_OUT */); } QStringList FitKneeFrequencySource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitKneeFrequencySource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitKneeFrequencySource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "White Noise Limit"; break; case 1: parameter = "White Noise Sigma"; break; case 2: parameter = "1/f^a Amplitude"; break; case 3: parameter = "1/f^a Power Law a"; break; case 4: parameter = "Knee Frequency"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitKneeFrequencyPlugin::pluginName() const { return tr("Knee Frequency Fit"); } QString FitKneeFrequencyPlugin::pluginDescription() const { return tr("Generates a knee frequency fit for a set of data."); } Kst::DataObject *FitKneeFrequencyPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitKneeFrequencyPlugin* config = static_cast(configWidget)) { Kst::ScalarPtr max; Kst::ScalarPtr min; Kst::ScalarPtr noise; // access/create scalars before creating plugin // in order to preserve continuous scalar shortnames if (setupInputsOutputs) { max = config->selectedScalarMax(); min = config->selectedScalarMin(); noise = config->selectedScalarWhiteNoise(); } FitKneeFrequencySource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN_MAX, max); object->setInputScalar(SCALAR_IN_MIN, min); object->setInputScalar(SCALAR_IN_WHITENOISE, noise); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitKneeFrequencyPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitKneeFrequencyPlugin *widget = new ConfigWidgetFitKneeFrequencyPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitKneeFrequencyPlugin, FitKneeFrequencyPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/kneefrequency/fitkneefrequency.h0000644000175000017500000000552112277111530023161 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITKNEEFREQUENCY_H #define FITKNEEFREQUENCY_H #include #include #include class FitKneeFrequencySource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::ScalarPtr scalarMax() const; Kst::ScalarPtr scalarMin() const; Kst::ScalarPtr scalarWhiteNoise() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitKneeFrequencySource(Kst::ObjectStore *store); ~FitKneeFrequencySource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitKneeFrequencyPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitKneeFrequencyPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/non_linear_weighted.h0000644000175000017500000001753612277111530020763 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "common.h" struct data { size_t n; const double* pdX; const double* pdY; const double* pdWeight; }; void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ); double function_calculate( double dX, double* pdParameters ); void function_derivative( double dX, double* pdParameters, double* pdDerivatives ); int function_f( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF ); int function_df( const gsl_vector* pVectorX, void* pParams, gsl_matrix* pMatrixJ ); int function_fdf( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF, gsl_matrix* pMatrixJ ); bool kstfit_nonlinear_weighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr weightedVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi ); int function_f( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF ) { double dParameters[NUM_PARAMS]; double dY; data* pData = (data*)pParams; size_t i; for( i=0; in; i++ ) { dY = function_calculate( pData->pdX[i], dParameters ); gsl_vector_set( pVectorF, i, (dY - pData->pdY[i])*pData->pdWeight[i] ); } return GSL_SUCCESS; } int function_df( const gsl_vector* pVectorX, void* pParams, gsl_matrix* pMatrixJ ) { double dParameters[NUM_PARAMS]; double dDerivatives[NUM_PARAMS]; data* pData = (data*)pParams; size_t i; size_t j; for( i=0; in; i++ ) { function_derivative( pData->pdX[i], dParameters, dDerivatives ); for( j=0; jpdWeight[i] ); } } return GSL_SUCCESS; } int function_fdf( const gsl_vector* pVectorX, void* pParams, gsl_vector* pVectorF, gsl_matrix* pMatrixJ ) { function_f( pVectorX, pParams, pVectorF ); function_df( pVectorX, pParams, pMatrixJ ); return GSL_SUCCESS; } bool kstfit_nonlinear_weighted( Kst::VectorPtr xVector, Kst::VectorPtr yVector, Kst::VectorPtr weightsVector, Kst::VectorPtr vectorOutYFitted, Kst::VectorPtr vectorOutYResiduals, Kst::VectorPtr vectorOutYParameters, Kst::VectorPtr vectorOutYCovariance, Kst::ScalarPtr scalarOutChi ) { const gsl_multifit_fdfsolver_type* pType; gsl_multifit_fdfsolver* pSolver; gsl_multifit_function_fdf function; gsl_vector_view vectorViewInitial; gsl_matrix* pMatrixCovariance; struct data d; double dXInitial[NUM_PARAMS]; double* pInputs[3]; int iIterations = 0; int iLength; int bReturn = false; int iStatus; int i; int j; if (xVector->length() >= 2 && yVector->length() >= 2 && weightsVector->length() >= 2) { iLength = yVector->length(); if( xVector->length() > iLength ) { iLength = xVector->length(); } // do any necessary interpolation... pInputs[XVALUES] = (double*)malloc(iLength * sizeof( double )); if (xVector->length() == iLength) { for( i=0; ivalue()[i]; } } else { for( i=0; ivalue(), xVector->length() ); } } pInputs[YVALUES] = (double*)malloc(iLength * sizeof( double )); if (yVector->length() == iLength) { for( i=0; ivalue()[i]; } } else { for( i=0; ivalue(), yVector->length() ); } } pInputs[WEIGHTS] = (double*)malloc(iLength * sizeof( double )); if (weightsVector->length() == iLength) { for( i=0; ivalue()[i]; } } else { for( i=0; ivalue(), weightsVector->length() ); } } if( iLength > NUM_PARAMS ) { vectorOutYFitted->resize(iLength); vectorOutYResiduals->resize(iLength); vectorOutYParameters->resize(NUM_PARAMS); vectorOutYCovariance->resize(NUM_PARAMS * NUM_PARAMS); pType = gsl_multifit_fdfsolver_lmsder; pSolver = gsl_multifit_fdfsolver_alloc( pType, iLength, NUM_PARAMS ); if( pSolver != NULL ) { d.n = iLength; d.pdX = pInputs[XVALUES]; d.pdY = pInputs[YVALUES]; d.pdWeight = pInputs[WEIGHTS]; function.f = function_f; function.df = function_df; function.fdf = function_fdf; function.n = iLength; function.p = NUM_PARAMS; function.params = &d; pMatrixCovariance = gsl_matrix_alloc( NUM_PARAMS, NUM_PARAMS ); if( pMatrixCovariance != NULL ) { function_initial_estimate( pInputs[XVALUES], pInputs[YVALUES], iLength, dXInitial ); vectorViewInitial = gsl_vector_view_array( dXInitial, NUM_PARAMS ); gsl_multifit_fdfsolver_set( pSolver, &function, &vectorViewInitial.vector ); // // iterate to a solution... // do { iStatus = gsl_multifit_fdfsolver_iterate( pSolver ); if( iStatus == GSL_SUCCESS ) { iStatus = gsl_multifit_test_delta( pSolver->dx, pSolver->x, 1.0e-4, 1.0e-4 ); } iIterations++; } while( iStatus == GSL_CONTINUE && iIterations < MAX_NUM_ITERATIONS ); gsl_multifit_covar( pSolver->J, 0.0, pMatrixCovariance ); // // determine the fitted values... // for( i=0; ix, i ); } for( i=0; ivalue()[i] = function_calculate( pInputs[XVALUES][i], dXInitial ); vectorOutYResiduals->value()[i] = pInputs[YVALUES][i] - vectorOutYFitted->value()[i]; } // // fill in the parameter values and covariance matrix... // for( i=0; ivalue()[i] = gsl_vector_get( pSolver->x, i ); for( j=0; jvalue()[(i*NUM_PARAMS)+j] = gsl_matrix_get( pMatrixCovariance, i, j ); } } // // determine the value of chi^2/nu // scalarOutChi->setValue(gsl_blas_dnrm2( pSolver->f )); bReturn = true; gsl_matrix_free( pMatrixCovariance ); } gsl_multifit_fdfsolver_free( pSolver ); } } postcursor(true, pInputs); } return bReturn; } Kst-2.0.8/src/plugins/fits/gradient_weighted/0000755000175000017500000000000012362705136020255 5ustar synthsynthKst-2.0.8/src/plugins/fits/gradient_weighted/fitgradient_weighted.h0000644000175000017500000000544312277111530024606 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITGRADIENTWEIGHTEDPLUGIN_H #define FITGRADIENTWEIGHTEDPLUGIN_H #include #include #include class FitGradientWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitGradientWeightedSource(Kst::ObjectStore *store); ~FitGradientWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitGradientWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitGradientWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gradient_weighted/gradient_weighted.pro0000755000175000017500000000034612277111530024454 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitgradient_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitgradient_weighted.cpp HEADERS += \ fitgradient_weighted.h FORMS += fitgradient_weightedconfig.ui Kst-2.0.8/src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp0000644000175000017500000002742412362701575025155 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitgradient_weighted.h" #include "objectstore.h" #include "ui_fitgradient_weightedconfig.h" #include #include "../common.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& VECTOR_OUT_Y_LO = "Lo Vector"; static const QString& VECTOR_OUT_Y_HI = "Hi Vector"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitGradientWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitGradient_WeightedConfig { public: ConfigWidgetFitGradientWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitGradient_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitGradientWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitGradientWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Gradient Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Gradient Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitGradientWeightedSource::FitGradientWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitGradientWeightedSource::~FitGradientWeightedSource() { } QString FitGradientWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Gradient").arg(vectorY()->descriptiveName()); } void FitGradientWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitGradientWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } } void FitGradientWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputVector(VECTOR_OUT_Y_LO, ""); setOutputVector(VECTOR_OUT_Y_HI, ""); setOutputScalar(SCALAR_OUT, ""); } bool FitGradientWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::VectorPtr outputVectorYLo = _outputVectors[VECTOR_OUT_Y_LO]; Kst::VectorPtr outputVectorYHi = _outputVectors[VECTOR_OUT_Y_HI]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Gradient Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Lower Limit"); outputVectorYLo->setLabelInfo(label_info); label_info.name = tr("Gradient Fit Upper Limit"); outputVectorYHi->setLabelInfo(label_info); int i = 0; int iLength = 0; bool bReturn = false; double* pInputs[3]; double c0 = 0.0; double cov00 = 0.0; double dSumSq = 0.0; double y; double yErr; if( precursor( inputVectorX, inputVectorY, inputVectorWeights, &iLength, true, true, 2, pInputs, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputVectorYLo, outputVectorYHi ) ) { if( !gsl_fit_wmul( pInputs[XVALUES], 1, pInputs[WEIGHTS], 1, pInputs[YVALUES], 1, iLength, &c0, &cov00, &dSumSq ) ) { for( i=0; ivalue()[i] = y; outputVectorYResiduals->value()[i] = pInputs[YVALUES][i] - y; outputVectorYLo->value()[i] = y - yErr; outputVectorYHi->value()[i] = y + yErr; } outputVectorYParameters->value()[0] = c0; outputVectorYCovariance->value()[0] = cov00; outputScalar->setValue(dSumSq / ( (double)iLength - 2.0 )); bReturn = true; } } postcursor( true, pInputs ); return bReturn; } Kst::VectorPtr FitGradientWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitGradientWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitGradientWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } QStringList FitGradientWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitGradientWeightedSource::inputScalarList() const { return QStringList(); } QStringList FitGradientWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitGradientWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_LO; vectors += VECTOR_OUT_Y_HI; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitGradientWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitGradientWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitGradientWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitGradientWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Gradient"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitGradientWeightedPlugin::pluginName() const { return tr("Gradient Weighted Fit"); } QString FitGradientWeightedPlugin::pluginDescription() const { return tr("Generates a gradient weighted fit for a set of data."); } Kst::DataObject *FitGradientWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitGradientWeightedPlugin* config = static_cast(configWidget)) { FitGradientWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitGradientWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitGradientWeightedPlugin *widget = new ConfigWidgetFitGradientWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitGradientWeightedPlugin, FitGradientWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui0000644000175000017500000000645312277111530026164 0ustar synthsynth FitGradient_WeightedConfig 0 0 420 99 400 0 0 0 X: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Weights: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/gradient_weighted/kstplugin_fits_gradient_weighted.desktop0000644000175000017500000000353712362705136030462 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitgradient_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gradient Weighted Plugin Name[ca]=Fits - Connector en gradient ponderat Name[ca@valencia]=Fits - Connector en gradient ponderat Name[de]=Gewichtetes Verlauf-Anpassungs-Modul Name[fr]=Module de régression à gradient pondéré Name[it]=Estensione fits gradiente pesato Name[nl]=Fits - Gradient Weighted Plugin Name[pl]=Wtyczka dopasowania gradientowego ważonego Name[pt]='Plugin' de Ajuste em Gradiente Ponderado Name[pt_BR]=Plugin de ajuste em gradiente ponderado Name[sv]=Anpassning - Viktat gradientinsticksprogram Name[uk]=Наближення: додаток зважених градієнтів Name[x-test]=xxFits - Gradient Weighted Pluginxx Comment=Implements a Gradient Weighted Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits en gradient ponderat pel Kst. Comment[ca@valencia]=Implementa un connector Fits en gradient ponderat pel Kst. Comment[de]=Implementiert ein gewichtetes Verlauf-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression à gradient pondéré pour Kst. Comment[it]=Implementa un'estensione fits gradiente pesato per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor gewogen helling aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania gradientowego ważonego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste em gradiente ponderado para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste em gradiente ponderado para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för viktad gradientanpassning. Comment[uk]=Реалізує додаток зважених градієнтів (наближення) у Kst. Comment[x-test]=xxImplements a Gradient Weighted Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/gaussian_weighted/0000755000175000017500000000000012362705136020272 5ustar synthsynthKst-2.0.8/src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui0000644000175000017500000000650412277111530026213 0ustar synthsynth FitGaussian_WeightedConfig 0 0 426 114 400 0 0 0 X: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Weights: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/gaussian_weighted/kstplugin_fits_gaussian_weighted.desktop0000644000175000017500000000354312362705136030511 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitgaussian_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gradient Gaussian Plugin Name[ca]=Fits - Connector Gaussià en gradient Name[ca@valencia]=Fits - Connector Gaussià en gradient Name[de]=Verlauf-Gauss-Anpassungs-Modul Name[fr]=Module de régression gaussienne à gradient Name[it]=Estensione fits gradiente gaussiano Name[nl]=Fits - Gradient Gaussian Plugin Name[pl]=Wtyczka dopasowania gradientowego Gaussa Name[pt]='Plugin' de Ajuste Gaussiano em Gradiente Name[pt_BR]=Plugin de ajuste gaussiano em gradiente Name[sv]=Anpassning - Gaussiskt gradientinsticksprogram Name[uk]=Додаток градієнтно-гаусового наближення Name[x-test]=xxFits - Gradient Gaussian Pluginxx Comment=Implements a Gradient Gaussian Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits Gaussià en gradient pel Kst. Comment[ca@valencia]=Implementa un connector Fits Gaussià en gradient pel Kst. Comment[de]=Implementiert ein Anpassungs-Modul für Gauss-Verlauf für Kst. Comment[fr]=Implémente un module de régression gaussienne à gradient pour Kst. Comment[it]=Implementa un'estensione fits gradiente gaussiano per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor helling Gaussische aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania gradientowego Gaussa dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste gaussiano em gradiente para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste gaussiano em gradiente para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Gaussisk gradientanpassning. Comment[uk]=Реалізує додаток градієнтно-гаусового наближення у Kst. Comment[x-test]=xxImplements a Gradient Gaussian Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp0000644000175000017500000002772212362701575025210 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitgaussian_weighted.h" #include "objectstore.h" #include "ui_fitgaussian_weightedconfig.h" #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear_weighted.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitGaussianWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitGaussian_WeightedConfig { public: ConfigWidgetFitGaussianWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitGaussian_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitGaussianWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitGaussianWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Gaussian Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Gaussian Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitGaussianWeightedSource::FitGaussianWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitGaussianWeightedSource::~FitGaussianWeightedSource() { } QString FitGaussianWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Gaussian").arg(vectorY()->descriptiveName()); } void FitGaussianWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitGaussianWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } } void FitGaussianWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { double dMin; double dMax; gsl_stats_minmax( &dMin, &dMax, pdX, 1, iLength ); pdParameterEstimates[0] = gsl_stats_mean( pdX, 1, iLength ); pdParameterEstimates[1] = ( dMax - dMin ) / 2.0; pdParameterEstimates[2] = gsl_stats_max( pdY, 1, iLength ); } double function_calculate( double dX, double* pdParameters ) { double dMean = pdParameters[0]; double dSD = pdParameters[1]; double dScale = pdParameters[2]; double dY; dY = ( dScale / ( dSD * M_SQRT2 * M_SQRTPI ) ); dY *= exp( -( ( dX - dMean ) * ( dX - dMean ) ) / ( 2.0 * dSD * dSD ) ); return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dMean = pdParameters[0]; double dSD = pdParameters[1]; double dScale = pdParameters[2]; double dExp; double ddMean; double ddSD; double ddScale; dExp = exp( -( ( dX - dMean ) * ( dX - dMean ) ) / ( 2.0 * dSD * dSD ) ); ddMean = ( dX - dMean ) * dScale * dExp / ( dSD * dSD * dSD * M_SQRT2 * M_SQRTPI ); ddSD = dScale * dExp / ( dSD * dSD * M_SQRT2 * M_SQRTPI ); ddSD *= ( ( dX - dMean ) * ( dX - dMean ) / ( dSD * dSD ) ) - 1.0; ddScale = dExp / ( dSD * M_SQRT2 * M_SQRTPI ); pdDerivatives[0] = ddMean; pdDerivatives[1] = ddSD; pdDerivatives[2] = ddScale; } bool FitGaussianWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Gaussian Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Gaussian Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear_weighted( inputVectorX, inputVectorY, inputVectorWeights, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitGaussianWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitGaussianWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitGaussianWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } QStringList FitGaussianWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitGaussianWeightedSource::inputScalarList() const { return QStringList(); } QStringList FitGaussianWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitGaussianWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitGaussianWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitGaussianWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitGaussianWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitGaussianWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Mean"; break; case 1: parameter = "SD"; break; case 2: parameter = "Scale"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitGaussianWeightedPlugin::pluginName() const { return tr("Gaussian Weighted Fit"); } QString FitGaussianWeightedPlugin::pluginDescription() const { return tr("Generates a gaussian weighted fit for a set of data."); } Kst::DataObject *FitGaussianWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitGaussianWeightedPlugin* config = static_cast(configWidget)) { FitGaussianWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitGaussianWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitGaussianWeightedPlugin *widget = new ConfigWidgetFitGaussianWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitGaussianWeightedPlugin, FitGaussianWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gaussian_weighted/fitgaussian_weighted.h0000644000175000017500000000544312277111530024640 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITGAUSSIANWEIGHTEDPLUGIN_H #define FITGAUSSIANWEIGHTEDPLUGIN_H #include #include #include class FitGaussianWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitGaussianWeightedSource(Kst::ObjectStore *store); ~FitGaussianWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitGaussianWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitGaussianWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gaussian_weighted/gaussian_weighted.pro0000755000175000017500000000034612277111530024506 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitgaussian_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitgaussian_weighted.cpp HEADERS += \ fitgaussian_weighted.h FORMS += fitgaussian_weightedconfig.ui Kst-2.0.8/src/plugins/fits/polynomial_unweighted/0000755000175000017500000000000012362705136021206 5ustar synthsynthKst-2.0.8/src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp0000644000175000017500000002753512362701575027042 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitpolynomial_unweighted.h" #include "objectstore.h" #include "ui_fitpolynomial_unweightedconfig.h" #include // #include "../common.h" #include "../linear.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_IN = "Order Scalar"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitPolynomialUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitPolynomial_UnweightedConfig { public: ConfigWidgetFitPolynomialUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitPolynomial_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitPolynomialUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarOrder->setDefaultValue(2); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalarOrder() { return _scalarOrder->selectedScalar(); }; void setSelectedScalarOrder(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitPolynomialUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedScalarOrder(source->scalarOrder()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Polynomial Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Scalar Order", _scalarOrder->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Polynomial Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } QString scalarName = _cfg->value("Input Order Scalar").toString(); object = _store->retrieveObject(scalarName); Kst::Scalar* orderScalar = static_cast(object); if (orderScalar) { setSelectedScalarOrder(orderScalar); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitPolynomialUnweightedSource::FitPolynomialUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitPolynomialUnweightedSource::~FitPolynomialUnweightedSource() { } QString FitPolynomialUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Polynomial").arg(vectorY()->descriptiveName());; } void FitPolynomialUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitPolynomialUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputScalar(SCALAR_IN, config->selectedScalarOrder()); } } void FitPolynomialUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } bool FitPolynomialUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::ScalarPtr inputScalarOrder = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Polynomial Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Polynomial Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; int iNumParams; iNumParams = 1 + (int)floor( inputScalarOrder->value() ); if( iNumParams > 0 ) { bReturn = kstfit_linear_unweighted( inputVectorX, inputVectorY, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar, iNumParams ); } return bReturn; } // TODO merge with FitPolynomialWeightedSource QString FitPolynomialUnweightedSource::parameterVectorToString() const { QString str = Name(); if (hasParameterVector()) { Kst::VectorPtr vectorParam = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; for (int i = 0; i < vectorParam->length(); i++) { QString paramName = parameterName(i); if (!paramName.isEmpty()) { if (_outputScalars.contains(paramName)) { QString name = _outputScalars[paramName]->Name(); double value = _outputScalars[paramName]->value(); QString sign(' '); if (value >= 0) { sign += '+'; } if (i == 0) { str += QString("\n[%1]").arg(name); } else if (i == 1) { // Special case x^1 to x str += QString("%1[%2]x").arg(sign).arg(name); } else { str += QString("%1[%2]%3").arg(sign).arg(name).arg(paramName); } } } } } return str; } Kst::VectorPtr FitPolynomialUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitPolynomialUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::ScalarPtr FitPolynomialUnweightedSource::scalarOrder() const { return _inputScalars[SCALAR_IN]; } QStringList FitPolynomialUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitPolynomialUnweightedSource::inputScalarList() const { return QStringList(SCALAR_IN); } QStringList FitPolynomialUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitPolynomialUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitPolynomialUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitPolynomialUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitPolynomialUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitPolynomialUnweightedSource::parameterName(int index) const { return QString("x^%1").arg(index); } // Name used to identify the plugin. Used when loading the plugin. QString FitPolynomialUnweightedPlugin::pluginName() const { return tr("Polynomial Fit"); } QString FitPolynomialUnweightedPlugin::pluginDescription() const { return tr("Generates a polynomial fit for a set of data."); } Kst::DataObject *FitPolynomialUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitPolynomialUnweightedPlugin* config = static_cast(configWidget)) { Kst::ScalarPtr order; // access/create scalars before creating plugin // in order to preserve continuous scalar shortnames if (setupInputsOutputs) { order = config->selectedScalarOrder(); } FitPolynomialUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, order); object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitPolynomialUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitPolynomialUnweightedPlugin *widget = new ConfigWidgetFitPolynomialUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitPolynomialUnweightedPlugin, FitPolynomialUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/polynomial_unweighted/kstplugin_fits_polynomial_unweighted.desktop0000644000175000017500000000320112362705136032330 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitpolynomial_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Polynomial Plugin Name[ca]=Fits - Connector polinòmic Name[ca@valencia]=Fits - Connector polinòmic Name[de]=Polynom-Anpassungs-Modul Name[fr]=Module de régression polynomiale Name[it]=Estensione fits polinomiale Name[nl]=Fits - Polynomial Plugin Name[pl]=Wtyczka dopasowania wielomianowego Name[pt]='Plugin' de Ajuste Polinomial Name[pt_BR]=Plugin de ajuste polinomial Name[sv]=Anpassning - Polynom-insticksprogram Name[uk]=Наближення: поліноміальний додаток Name[x-test]=xxFits - Polynomial Pluginxx Comment=Implements a Polynomial Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits polinòmic pel Kst. Comment[ca@valencia]=Implementa un connector Fits polinòmic pel Kst. Comment[de]=Implementiert ein Polynom-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression polynomiale pour Kst. Comment[it]=Implementa un'estensione fits polinomiale per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor aanpassing aan een veelterm. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania wielomianowego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste polinomial para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste polinomial para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för polynom-anpassning. Comment[uk]=Реалізує додаток поліноміального наближення у Kst. Comment[x-test]=xxImplements a Polynomial Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui0000644000175000017500000000651112277111530030041 0ustar synthsynth FitPolynomial_UnweightedConfig 0 0 419 163 400 0 0 0 X: false 0 0 0 0 Y: false 0 0 0 0 Order: false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.h0000644000175000017500000000556212277111530026472 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITPOLYNOMIALUNWEIGHTEDPLUGIN_H #define FITPOLYNOMIALUNWEIGHTEDPLUGIN_H #include #include #include class FitPolynomialUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::ScalarPtr scalarOrder() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitPolynomialUnweightedSource(Kst::ObjectStore *store); ~FitPolynomialUnweightedSource(); virtual QString parameterName(int index) const; virtual QString parameterVectorToString() const; friend class Kst::ObjectStore; }; class FitPolynomialUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitPolynomialUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/polynomial_unweighted/polynomial_unweighted.pro0000755000175000017500000000036612277111530026340 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitpolynomial_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitpolynomial_unweighted.cpp HEADERS += \ fitpolynomial_unweighted.h FORMS += fitpolynomial_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/lorentzian_unweighted/0000755000175000017500000000000012362705136021210 5ustar synthsynthKst-2.0.8/src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.h0000644000175000017500000000542512277111530026474 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITLORENTZIANUNWEIGHTEDPLUGIN_H #define FITLORENTZIANUNWEIGHTEDPLUGIN_H #include #include #include class FitLorentzianUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitLorentzianUnweightedSource(Kst::ObjectStore *store); ~FitLorentzianUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitLorentzianUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitLorentzianUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp0000644000175000017500000002655712362701575027051 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitlorentzian_unweighted.h" #include "objectstore.h" #include "ui_fitlorentzian_unweightedconfig.h" #define NUM_PARAMS 4 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitLorentzianUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitLorentzian_UnweightedConfig { public: ConfigWidgetFitLorentzianUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitLorentzian_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitLorentzianUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitLorentzianUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Lorentzian Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Lorentzian Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitLorentzianUnweightedSource::FitLorentzianUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitLorentzianUnweightedSource::~FitLorentzianUnweightedSource() { } QString FitLorentzianUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Lorentzian").arg(vectorY()->descriptiveName());; } void FitLorentzianUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitLorentzianUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void FitLorentzianUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate(const double X[], const double Y[], int npts, double P[]) { double min_y = 1E300; double max_y = -1E300; double min_x = 1E300; double max_x = -1E300; double mean_y = 0.0; double x_at_min_y; double x_at_max_y; double A, B, D; // find peak, vally, and mean for (int i = 0; i Y[i]) { min_y = Y[i]; x_at_min_y = X[i]; } if (max_y < Y[i]) { max_y = Y[i]; x_at_max_y = X[i]; } mean_y += Y[i]; if (min_x > X[i]) { min_x = X[i]; } if (max_x < X[i]) { max_x = X[i]; } } if (npts>0) { mean_y /= double(npts); } // Heuristic for finding the sign : less time is spent in the peak than // in background if the range covers more than ~+- 2 sigma. // It will fail if you are // really zoomed in. Not sure what happens then :-( if (max_y - mean_y > mean_y - min_y) { // positive going gaussian A = max_y - min_y; D = min_y; B = x_at_max_y; } else { // negative going gaussian A = min_y - mean_y; D = max_y; B = x_at_min_y; } P[0] = A; // amplitude P[1] = B; // x0 P[2] = (max_x - min_x)*0.1; // Half Width: guess 1/10 the fit range P[3] = D; // offset } double function_calculate(double x, double P[]) { double A = P[0]; // amplitude double B = P[1]; // x0 double C = P[2]; // Half Width double D = P[3]; // offset x -= B; double Y = A/(1.0 + x*x/(C*C)) + D; return Y; } void function_derivative(double x, double P[], double dFdP[]) { double A = P[0]; // amplitude double B = P[1]; // x0 double C = P[2]; // Half Width double C2 = C*C; x -= B; double x2 = x*x; double m = (x2 + C2); dFdP[0] = 1.0/(1.0 + x2/C2); // dF/dA dFdP[1] = 2.0*A*C2*x/(m*m); dFdP[2] = 2.0*A*C*x2/(m*m); dFdP[3] = 1.0; } bool FitLorentzianUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Lorentzian Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Lorentzian Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear( inputVectorX, inputVectorY, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitLorentzianUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitLorentzianUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList FitLorentzianUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitLorentzianUnweightedSource::inputScalarList() const { return QStringList(); } QStringList FitLorentzianUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitLorentzianUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitLorentzianUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitLorentzianUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitLorentzianUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitLorentzianUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Amplitide"; break; case 1: parameter = "x_o"; break; case 2: parameter = "Half Width"; break; case 3: parameter = "Offset"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitLorentzianUnweightedPlugin::pluginName() const { return tr("Lorentzian Fit"); } QString FitLorentzianUnweightedPlugin::pluginDescription() const { return tr("Generates a lorentzian fit for a set of data."); } Kst::DataObject *FitLorentzianUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitLorentzianUnweightedPlugin* config = static_cast(configWidget)) { FitLorentzianUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitLorentzianUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitLorentzianUnweightedPlugin *widget = new ConfigWidgetFitLorentzianUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitLorentzianUnweightedPlugin, FitLorentzianUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/lorentzian_unweighted/kstplugin_fits_lorentzian_unweighted.desktop0000644000175000017500000000316712362705136032347 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitlorentzian_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Lorentzian Plugin Name[ca]=Fits - Connector de Lorentz Name[ca@valencia]=Fits - Connector de Lorentz Name[de]=Lorentz-Anpassungs-Modul Name[fr]=Module de régression linéaire lorentzienne Name[it]=Estensione fits lorentziana Name[nl]=Fits - Lorentzian Plugin Name[pl]=Wtyczka dopasowania Lorentza Name[pt]='Plugin' de Ajuste de Lorentz Name[pt_BR]=Plugin de ajuste de Lorentz Name[sv]=Anpassning - Lorentzinsticksprogram Name[uk]=Наближення: лоренців додаток Name[x-test]=xxFits - Lorentzian Pluginxx Comment=Implements a Lorentzian Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits de Lorentz pel Kst. Comment[ca@valencia]=Implementa un connector Fits de Lorentz pel Kst. Comment[de]=Implementiert ein Lorentz-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression linéaire lorentzienne pour Kst. Comment[it]=Implementa un'estensione fits lorentziana per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor aanpassing aan Lorentzfunctie. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania Lorentza dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste de Lorentz para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste de Lorentz para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Lorentzanpassning. Comment[uk]=Реалізує додаток лоренцевого наближення у Kst. Comment[x-test]=xxImplements a Lorentzian Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/lorentzian_unweighted/lorentzian_unweighted.pro0000755000175000017500000000036612277111530026344 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitlorentzian_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitlorentzian_unweighted.cpp HEADERS += \ fitlorentzian_unweighted.h FORMS += fitlorentzian_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui0000644000175000017500000000476712277111530030060 0ustar synthsynth FitLorentzian_UnweightedConfig 0 0 431 113 400 0 0 0 X: false 0 0 0 0 Y: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/gaussian_unweighted/0000755000175000017500000000000012362705136020635 5ustar synthsynthKst-2.0.8/src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp0000644000175000017500000002626112362701575026113 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitgaussian_unweighted.h" #include "objectstore.h" #include "ui_fitgaussian_unweightedconfig.h" #define NUM_PARAMS 4 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitGaussianUnweightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitGaussian_UnweightedConfig { public: ConfigWidgetFitGaussianUnweightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitGaussian_UnweightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitGaussianUnweightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitGaussianUnweightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Gaussian Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Gaussian Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitGaussianUnweightedSource::FitGaussianUnweightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitGaussianUnweightedSource::~FitGaussianUnweightedSource() { } QString FitGaussianUnweightedSource::_automaticDescriptiveName() const { return tr("%1 Unweighted Gaussian").arg(vectorY()->descriptiveName()); } void FitGaussianUnweightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitGaussianUnweightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } } void FitGaussianUnweightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate( const double X[], const double Y[], int npts, double P[] ) { double min_y = 1E300; double max_y = -1E300; double min_x = 1E300; double max_x = -1E300; double mean_y = 0.0; double x_at_min_y; double x_at_max_y; double A, C, D; // find peak, vally, and mean for (int i = 0; i Y[i]) { min_y = Y[i]; x_at_min_y = X[i]; } if (max_y < Y[i]) { max_y = Y[i]; x_at_max_y = X[i]; } mean_y += Y[i]; if (min_x > X[i]) { min_x = X[i]; } if (max_x < X[i]) { max_x = X[i]; } } if (npts>0) { mean_y /= double(npts); } // Heuristic for finding the sign of the : less time is spent in the peak than // in background if the range covers more than ~+- 2 sigma. // It will fail if you are // really zoomed into the gaussian. Not sure what happens then :-( if (max_y - mean_y > mean_y - min_y) { // positive going gaussian A = max_y - min_y; D = min_y; C = x_at_max_y; } else { // negative going gaussian A = min_y - mean_y; D = max_y; C = x_at_min_y; } // guess that the width of the gaussian is around 1/10 of the x range (?) P[0] = A; P[1] = (max_x - min_x)*0.1; P[2] = C; P[3] = D; } double function_calculate(double x, double P[]) { double A = P[0]; double B = 0.5/(P[1]*P[1]); double C = P[2]; double D = P[3]; x -= C; return A*exp(-B*x*x) + D; } void function_derivative( double x, double P[], double dFdP[] ) { double A = P[0]; double s = P[1]; double B = 0.5/(s*s); double C = P[2]; //double D = P[3]; x -= C; double E = exp(-B*x*x); dFdP[0] = E; dFdP[1] = A*x*x*E/(s*s*s); dFdP[2] = 2*A*B*x*E; dFdP[3] = 1.0; } bool FitGaussianUnweightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Gaussian Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Gaussian Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear( inputVectorX, inputVectorY, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitGaussianUnweightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitGaussianUnweightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } QStringList FitGaussianUnweightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; return vectors; } QStringList FitGaussianUnweightedSource::inputScalarList() const { return QStringList(); } QStringList FitGaussianUnweightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitGaussianUnweightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitGaussianUnweightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitGaussianUnweightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitGaussianUnweightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitGaussianUnweightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Amplitude"; break; case 1: parameter = "\\sigma"; break; case 2: parameter = "x_o"; break; case 3: parameter = "Offset"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitGaussianUnweightedPlugin::pluginName() const { return tr("Gaussian Fit"); } QString FitGaussianUnweightedPlugin::pluginDescription() const { return tr("Generates a gaussian fit for a set of data."); } Kst::DataObject *FitGaussianUnweightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitGaussianUnweightedPlugin* config = static_cast(configWidget)) { FitGaussianUnweightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitGaussianUnweightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitGaussianUnweightedPlugin *widget = new ConfigWidgetFitGaussianUnweightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitGaussianUnweightedPlugin, FitGaussianUnweightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gaussian_unweighted/gaussian_unweighted.pro0000755000175000017500000000035612277111530025415 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitgaussian_unweighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitgaussian_unweighted.cpp HEADERS += \ fitgaussian_unweighted.h FORMS += fitgaussian_unweightedconfig.ui Kst-2.0.8/src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui0000644000175000017500000000476112277111530027124 0ustar synthsynth FitGaussian_UnweightedConfig 0 0 426 79 400 0 0 0 X: false 0 0 0 0 Y: false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.h0000644000175000017500000000540712277111530025546 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITGAUSSIANUNWEIGHTEDPLUGIN_H #define FITGAUSSIANUNWEIGHTEDPLUGIN_H #include #include #include class FitGaussianUnweightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitGaussianUnweightedSource(Kst::ObjectStore *store); ~FitGaussianUnweightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitGaussianUnweightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitGaussianUnweightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/gaussian_unweighted/kstplugin_fits_gaussian_unweighted.desktop0000644000175000017500000000306512362705136031416 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitgaussian_unweighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gaussian Plugin Name[ca]=Fits - Connector Gaussià Name[ca@valencia]=Fits - Connector Gaussià Name[de]=Gauss-Anpassungs-Modul Name[fr]=Module de régression gaussienne Name[it]=Estensione fits gaussiana Name[nl]=Fits - Gaussian Plugin Name[pl]=Wtyczka dopasowania Gaussa Name[pt]='Plugin' de Ajuste Gaussiano Name[pt_BR]=Plugin de ajuste gaussiano Name[sv]=Anpassning - Gaussiskt insticksprogram Name[uk]=Додаток гаусового наближення Name[x-test]=xxFits - Gaussian Pluginxx Comment=Implements a Gaussian Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits Gaussià pel Kst. Comment[ca@valencia]=Implementa un connector Fits Gaussià pel Kst. Comment[de]=Implementiert ein Gauss-Anpassungs-Modul für Kst. Comment[fr]=Implémente un module de régression gaussienne pour Kst. Comment[it]=Implementa un'estensione fits gaussiana per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Gaussische aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania Gaussa dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste gaussiano para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste gaussiano para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Gaussisk anpassning. Comment[uk]=Реалізує додаток гаусового наближення у Kst. Comment[x-test]=xxImplements a Gaussian Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/exponential_weighted/0000755000175000017500000000000012362705136021006 5ustar synthsynthKst-2.0.8/src/plugins/fits/exponential_weighted/fitexponential_weighted.h0000644000175000017500000000547012277111530026070 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FITEXPONENTIALWEIGHTEDPLUGIN_H #define FITEXPONENTIALWEIGHTEDPLUGIN_H #include #include #include class FitExponentialWeightedSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vectorX() const; Kst::VectorPtr vectorY() const; Kst::VectorPtr vectorWeights() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FitExponentialWeightedSource(Kst::ObjectStore *store); ~FitExponentialWeightedSource(); virtual QString parameterName(int index) const; friend class Kst::ObjectStore; }; class FitExponentialWeightedPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FitExponentialWeightedPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Fit; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/exponential_weighted/kstplugin_fits_exponential_weighted.desktop0000644000175000017500000000372412362705136031742 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=fitexponential_weighted X-Kst-Plugin-Author=The University of Toronto Name=Fits - Gradient Exponential Plugin Name[ca]=Fits - Connector exponencial en gradient Name[ca@valencia]=Fits - Connector exponencial en gradient Name[de]=Verlauf-Exponential-Anpassungs-Modul Name[fr]=Module de régression exponentielle gradient Name[it]=Estensione fits gradiente esponenziale Name[nl]=Fits - Gradient Exponential Plugin Name[pl]=Wtyczka dopasowania gradientowego wykładniczego Name[pt]='Plugin' de Ajuste Exponencial em Gradiente Name[pt_BR]=Plugin de ajuste exponencial em gradiente Name[sv]=Anpassning - Exponentiellt gradientinsticksprogram Name[uk]=Додаток градієнтно-експоненційного наближення Name[x-test]=xxFits - Gradient Exponential Pluginxx Comment=Implements a Gradient Exponential Fits Plugin for Kst. Comment[ca]=Implementa un connector Fits exponencial en gradient pel Kst. Comment[ca@valencia]=Implementa un connector Fits exponencial en gradient pel Kst. Comment[de]=Implementiert ein Anpassungs-Modul für exponentiellen Verlauf für Kst. Comment[fr]=Implémente un module de régression exponentielle à gradient pour Kst. Comment[it]=Implementa un'estensione fits gradiente esponenziale per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor helling exponentiële aanpassing. Comment[pl]=Implementuje wtyczkę obiektu danych dopasowania gradientowego wykładniczego dla Kst. Comment[pt]=Implementa um 'plugin' de ajuste exponencial em gradiente para o Kst. Comment[pt_BR]=Implementa um plugin de ajuste exponencial em gradiente para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för exponentiell gradientanpassning. Comment[uk]=Реалізує додаток градієнтно-експоненційного наближення у Kst. Comment[x-test]=xxImplements a Gradient Exponential Fits Plugin for Kst.xx Kst-2.0.8/src/plugins/fits/exponential_weighted/exponential_weighted.pro0000755000175000017500000000036212277111530025734 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_fitexponential_weighted) LIBS += -l$$kstlib(gsl) SOURCES += \ fitexponential_weighted.cpp HEADERS += \ fitexponential_weighted.h FORMS += fitexponential_weightedconfig.ui Kst-2.0.8/src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp0000644000175000017500000002727012362701575026436 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "fitexponential_weighted.h" #include "objectstore.h" #include "ui_fitexponential_weightedconfig.h" #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include #include "../non_linear_weighted.h" static const QString& VECTOR_IN_X = "X Vector"; static const QString& VECTOR_IN_Y = "Y Vector"; static const QString& VECTOR_IN_WEIGHTS = "Weights Vector"; static const QString& VECTOR_OUT_Y_FITTED = "Fit"; static const QString& VECTOR_OUT_Y_RESIDUALS = "Residuals"; static const QString& VECTOR_OUT_Y_PARAMETERS = "Parameters Vector"; static const QString& VECTOR_OUT_Y_COVARIANCE = "Covariance"; static const QString& SCALAR_OUT = "chi^2/nu"; class ConfigWidgetFitExponentialWeightedPlugin : public Kst::DataObjectConfigWidget, public Ui_FitExponential_WeightedConfig { public: ConfigWidgetFitExponentialWeightedPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FitExponential_WeightedConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFitExponentialWeightedPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vectorX->setObjectStore(store); _vectorY->setObjectStore(store); _vectorWeights->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_vectorWeights, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVectorX(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVectorY(vector); } void setVectorsLocked(bool locked = true) { _vectorX->setEnabled(!locked); _vectorY->setEnabled(!locked); } Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); }; void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); }; void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); }; Kst::VectorPtr selectedVectorWeights() { return _vectorWeights->selectedVector(); }; void setSelectedVectorWeights(Kst::VectorPtr vector) { return _vectorWeights->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FitExponentialWeightedSource* source = static_cast(dataObject)) { setSelectedVectorX(source->vectorX()); setSelectedVectorY(source->vectorY()); setSelectedVectorWeights(source->vectorWeights()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Fit Exponential Weighted Plugin"); _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name()); _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name()); _cfg->setValue("Input Vector Weights", _vectorWeights->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Fit Exponential Weighted Plugin"); QString vectorName = _cfg->value("Input Vector X").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vectorx = static_cast(object); if (vectorx) { setSelectedVectorX(vectorx); } vectorName = _cfg->value("Input Vector Y").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectory = static_cast(object); if (vectory) { setSelectedVectorX(vectory); } vectorName = _cfg->value("Input Vector Weights").toString(); object = _store->retrieveObject(vectorName); Kst::Vector* vectorweights = static_cast(object); if (vectorweights) { setSelectedVectorX(vectorweights); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FitExponentialWeightedSource::FitExponentialWeightedSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FitExponentialWeightedSource::~FitExponentialWeightedSource() { } QString FitExponentialWeightedSource::_automaticDescriptiveName() const { return tr("%1 Weighted Exponential").arg(vectorY()->descriptiveName()); } void FitExponentialWeightedSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFitExponentialWeightedPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN_X, config->selectedVectorX()); setInputVector(VECTOR_IN_Y, config->selectedVectorY()); setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } } void FitExponentialWeightedSource::setupOutputs() { setOutputVector(VECTOR_OUT_Y_FITTED, ""); setOutputVector(VECTOR_OUT_Y_RESIDUALS, ""); setOutputVector(VECTOR_OUT_Y_PARAMETERS, ""); setOutputVector(VECTOR_OUT_Y_COVARIANCE, ""); setOutputScalar(SCALAR_OUT, ""); } void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { Q_UNUSED( pdX ) Q_UNUSED( pdY ) Q_UNUSED( iLength ) pdParameterEstimates[0] = 1.0; pdParameterEstimates[1] = 0.0; pdParameterEstimates[2] = 0.0; } double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dExp; double ddScale; double ddLambda; double ddOffset; dExp = exp( -dLambda * dX ); ddScale = dExp; ddLambda = -dX * dScale * dExp; ddOffset = 1.0; pdDerivatives[0] = ddScale; pdDerivatives[1] = ddLambda; pdDerivatives[2] = ddOffset; } bool FitExponentialWeightedSource::algorithm() { Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X]; Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y]; Kst::VectorPtr inputVectorWeights = _inputVectors[VECTOR_IN_WEIGHTS]; Kst::VectorPtr outputVectorYFitted = _outputVectors[VECTOR_OUT_Y_FITTED]; Kst::VectorPtr outputVectorYResiduals = _outputVectors[VECTOR_OUT_Y_RESIDUALS]; Kst::VectorPtr outputVectorYParameters = _outputVectors[VECTOR_OUT_Y_PARAMETERS]; Kst::VectorPtr outputVectorYCovariance = _outputVectors[VECTOR_OUT_Y_COVARIANCE]; Kst::ScalarPtr outputScalar = _outputScalars[SCALAR_OUT]; Kst::LabelInfo label_info = inputVectorY->labelInfo(); label_info.name = tr("Exponential Fit to %1").arg(label_info.name); outputVectorYFitted->setLabelInfo(label_info); label_info.name = tr("Exponential Fit Residuals"); outputVectorYResiduals->setLabelInfo(label_info); bool bReturn = false; bReturn = kstfit_nonlinear_weighted( inputVectorX, inputVectorY, inputVectorWeights, outputVectorYFitted, outputVectorYResiduals, outputVectorYParameters, outputVectorYCovariance, outputScalar ); return bReturn; } Kst::VectorPtr FitExponentialWeightedSource::vectorX() const { return _inputVectors[VECTOR_IN_X]; } Kst::VectorPtr FitExponentialWeightedSource::vectorY() const { return _inputVectors[VECTOR_IN_Y]; } Kst::VectorPtr FitExponentialWeightedSource::vectorWeights() const { return _inputVectors[VECTOR_IN_WEIGHTS]; } QStringList FitExponentialWeightedSource::inputVectorList() const { QStringList vectors(VECTOR_IN_X); vectors += VECTOR_IN_Y; vectors += VECTOR_IN_WEIGHTS; return vectors; } QStringList FitExponentialWeightedSource::inputScalarList() const { return QStringList(); } QStringList FitExponentialWeightedSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FitExponentialWeightedSource::outputVectorList() const { QStringList vectors(VECTOR_OUT_Y_FITTED); vectors += VECTOR_OUT_Y_RESIDUALS; vectors += VECTOR_OUT_Y_PARAMETERS; vectors += VECTOR_OUT_Y_COVARIANCE; vectors += VECTOR_OUT_Y_PARAMETERS; return vectors; } QStringList FitExponentialWeightedSource::outputScalarList() const { return QStringList( SCALAR_OUT ); } QStringList FitExponentialWeightedSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FitExponentialWeightedSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString FitExponentialWeightedSource::parameterName(int index) const { QString parameter; switch (index) { case 0: parameter = "Scale"; break; case 1: parameter = "Lambda"; break; case 2: parameter = "Offset"; break; } return parameter; } // Name used to identify the plugin. Used when loading the plugin. QString FitExponentialWeightedPlugin::pluginName() const { return tr("Exponential Weighted Fit"); } QString FitExponentialWeightedPlugin::pluginDescription() const { return tr("Generates an exponential weighted fit for a set of data."); } Kst::DataObject *FitExponentialWeightedPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFitExponentialWeightedPlugin* config = static_cast(configWidget)) { FitExponentialWeightedSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN_X, config->selectedVectorX()); object->setInputVector(VECTOR_IN_Y, config->selectedVectorY()); object->setInputVector(VECTOR_IN_WEIGHTS, config->selectedVectorWeights()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FitExponentialWeightedPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFitExponentialWeightedPlugin *widget = new ConfigWidgetFitExponentialWeightedPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FitExponentialWeightedPlugin, FitExponentialWeightedPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui0000644000175000017500000000650312277111530027442 0ustar synthsynth FitExponential_WeightedConfig 0 0 557 98 0 0 X: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Weights: false 0 0 400 0 Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/plugins_sub.pri0000644000175000017500000000005412277111530016672 0ustar synthsynthTOPOUT_REL=../../../.. include(plugins.pri) Kst-2.0.8/src/plugins/filters/0000755000175000017500000000000012362701575015306 5ustar synthsynthKst-2.0.8/src/plugins/filters/unwind/0000755000175000017500000000000012362705136016607 5ustar synthsynthKst-2.0.8/src/plugins/filters/unwind/unwind.pro0000755000175000017500000000025612277111530020635 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterunwind) SOURCES += \ filterunwind.cpp HEADERS += \ filterunwind.h FORMS += filterunwindconfig.ui Kst-2.0.8/src/plugins/filters/unwind/filterunwind.h0000644000175000017500000000543112277111530021467 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FILTERUNWINDPLUGIN_H #define FILTERUNWINDPLUGIN_H #include #include #include class FilterUnwindSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr minimumScalar() const; Kst::ScalarPtr maximumScalar() const; Kst::ScalarPtr stepScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterUnwindSource(Kst::ObjectStore *store); ~FilterUnwindSource(); friend class Kst::ObjectStore; }; class FilterUnwindPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FilterUnwindPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/unwind/kstplugin_filter_unwind.desktop0000644000175000017500000000353612362705136025162 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterunwind X-Kst-Plugin-Author=C. Barth Netterfield Name=Filter - Unwind Plugin Name[ca]=Filtre - Connector d'eliminació de pics angulars Name[ca@valencia]=Filtre - Connector d'eliminació de pics angulars Name[de]=Filter - Abwicklungsmodul Name[fr]=Module de filtre de déroulage d'angle Name[it]=Estensione filtro di rimozione Name[nl]=Filter - Unwind Plugin Name[pl]=Wtyczka filtra odwinięcia Name[pt]='Plugin' de Filtro de Eliminação de Picos Angulares Name[pt_BR]=Plugin de filtro de eliminação de picos angulares Name[sv]=Filter - Insticksprogram för avnystning Name[uk]=Додаток фільтрування з розгортанням Name[x-test]=xxFilter - Unwind Pluginxx Comment=Implements an angle unwind Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre d'eliminació de pics angulars pel Kst. Comment[ca@valencia]=Implementa un connector de filtre d'eliminació de pics angulars pel Kst. Comment[de]=Implementiert ein Filtermodul zur Abwicklung von Winkeln für Kst. Comment[fr]=Implémente un module de filtre de déroulage d'angle pour Kst. Comment[it]=Implementa un'estensione filtro di rimozione per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor hoekafwikkeling. Comment[pl]=Implementuje wtyczkę obiektu danych filtra odwinięcia dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados para a remoção de picos angulares no Kst. Comment[pt_BR]=Implementa um plugin de objetos de dados para remoção de picos angulares no Kst. Comment[sv]=Implementerar ett Kst insticksprogram för vinkelavnystning. Comment[uk]=Реалізує додаток для фільтрування з розгортанням за кутом у Kst. Comment[x-test]=xxImplements an angle unwind Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/unwind/filterunwind.cpp0000644000175000017500000002542012320547027022025 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "filterunwind.h" #include "objectstore.h" #include "ui_filterunwindconfig.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_MAXIMUM_IN = "Maximum Scalar"; static const QString& SCALAR_MINIMUM_IN = "Minimum Scalar"; static const QString& SCALAR_STEP_IN = "Step Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigWidgetFilterUnwindPlugin : public Kst::DataObjectConfigWidget, public Ui_FilterUnwindConfig { public: ConfigWidgetFilterUnwindPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterUnwindConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFilterUnwindPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarMinumum->setObjectStore(store); _scalarMaximum->setObjectStore(store); _scalarStep->setObjectStore(store); _scalarMinumum->setDefaultValue(0.0); _scalarMaximum->setDefaultValue(360.0); _scalarStep->setDefaultValue(50.0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarMinumum, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarMaximum, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarStep, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedMinimumScalar() { return _scalarMinumum->selectedScalar(); }; void setSelectedMinimumScalar(Kst::ScalarPtr scalar) { return _scalarMinumum->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedMaximumScalar() { return _scalarMaximum->selectedScalar(); }; void setSelectedMaximumScalar(Kst::ScalarPtr scalar) { return _scalarMaximum->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedStepScalar() { return _scalarStep->selectedScalar(); }; void setSelectedStepScalar(Kst::ScalarPtr scalar) { return _scalarStep->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterUnwindSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedMaximumScalar(source->maximumScalar()); setSelectedMinimumScalar(source->minimumScalar()); setSelectedStepScalar(source->stepScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter Unwind Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Minimum Scalar", _scalarMinumum->selectedScalar()->Name()); _cfg->setValue("Maximum Scalar", _scalarMaximum->selectedScalar()->Name()); _cfg->setValue("Step Scalar", _scalarStep->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter Unwind Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Maximum Scalar").toString(); _scalarMaximum->setSelectedScalar(scalarName); scalarName = _cfg->value("Minimum Scalar").toString(); _scalarMinumum->setSelectedScalar(scalarName); scalarName = _cfg->value("Step Scalar").toString(); _scalarStep->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterUnwindSource::FilterUnwindSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterUnwindSource::~FilterUnwindSource() { } QString FilterUnwindSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Unwind").arg(vector()->descriptiveName()); } else { return tr("Unwind"); } } QString FilterUnwindSource::descriptionTip() const { QString tip; tip = tr("Unwind Filter: %1\n %2 - %3\n Step: %4 %", "%2 - %3 specifies a numerical range").arg(Name()).arg(minimumScalar()->value()).arg(maximumScalar()->value()).arg(stepScalar()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void FilterUnwindSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFilterUnwindPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_MAXIMUM_IN, config->selectedMaximumScalar()); setInputScalar(SCALAR_MINIMUM_IN, config->selectedMinimumScalar()); setInputScalar(SCALAR_STEP_IN, config->selectedStepScalar()); } } void FilterUnwindSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool FilterUnwindSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr minimumScalar = _inputScalars[SCALAR_MINIMUM_IN]; Kst::ScalarPtr maximumScalar = _inputScalars[SCALAR_MAXIMUM_IN]; Kst::ScalarPtr stepScalar = _inputScalars[SCALAR_STEP_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } int N = inputVector->length(); double max = maximumScalar->value(); double min = minimumScalar->value(); double step = stepScalar->value(); double last_x_in; double range; double x; double wind = 0; int i; if (max=100) ) { return false; } outputVector->resize(N, false); step *= (max-min)/100.0; last_x_in = inputVector->value(0); outputVector->value()[0] = last_x_in; for (i=1; ivalue(i); if ((x>max) || (x step) { wind -= range; } else if (last_x_in - x > step) { wind += range; } outputVector->value()[i] = x + wind; last_x_in = x; } Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Unwind %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return true; } Kst::VectorPtr FilterUnwindSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterUnwindSource::maximumScalar() const { return _inputScalars[SCALAR_MAXIMUM_IN]; } Kst::ScalarPtr FilterUnwindSource::minimumScalar() const { return _inputScalars[SCALAR_MINIMUM_IN]; } Kst::ScalarPtr FilterUnwindSource::stepScalar() const { return _inputScalars[SCALAR_STEP_IN]; } QStringList FilterUnwindSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterUnwindSource::inputScalarList() const { QStringList inputScalars( SCALAR_MAXIMUM_IN ); inputScalars += SCALAR_MINIMUM_IN; inputScalars += SCALAR_STEP_IN; return inputScalars; } QStringList FilterUnwindSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterUnwindSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterUnwindSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterUnwindSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterUnwindSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString FilterUnwindPlugin::pluginName() const { return tr("Unwind Filter"); } QString FilterUnwindPlugin::pluginDescription() const { return tr("Unwinds data that have wrapped."); } Kst::DataObject *FilterUnwindPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFilterUnwindPlugin* config = static_cast(configWidget)) { FilterUnwindSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_MAXIMUM_IN, config->selectedMaximumScalar()); object->setInputScalar(SCALAR_MINIMUM_IN, config->selectedMinimumScalar()); object->setInputScalar(SCALAR_STEP_IN, config->selectedStepScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FilterUnwindPlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFilterUnwindPlugin *widget = new ConfigWidgetFilterUnwindPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FilterUnwindPlugin, FilterUnwindPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/unwind/filterunwindconfig.ui0000644000175000017500000000741312277111530023045 0ustar synthsynth FilterUnwindConfig 0 0 400 89 400 0 0 0 Input Vector: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Minimum: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Maximum: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Max Step (%): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/butterworth_lowpass/0000755000175000017500000000000012362705136021444 5ustar synthsynthKst-2.0.8/src/plugins/filters/butterworth_lowpass/butterworth_lowpass.h0000644000175000017500000000537612277111530025763 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUTTERWORTHLOWPASSPLUGIN_H #define BUTTERWORTHLOWPASSPLUGIN_H #include #include #include class FilterButterworthLowPassSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr orderScalar() const; Kst::ScalarPtr cutoffScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterButterworthLowPassSource(Kst::ObjectStore *store); ~FilterButterworthLowPassSource(); friend class Kst::ObjectStore; }; class ButterworthLowPassPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ButterworthLowPassPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui0000644000175000017500000000574412277111530030405 0ustar synthsynth FilterButterworthLowPassConfig 0 0 423 75 400 0 0 0 Input Vector: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Filter Order: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Cutoff Frequency / Sample Rate: false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/butterworth_lowpass/butterworth_lowpass.pro0000755000175000017500000000042112277111530026321 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterbutterworthlowpass) LIBS += -l$$kstlib(gsl) !win32:LIBS += -l$$kstlib(gsl)cblas SOURCES += \ butterworth_lowpass.cpp HEADERS += \ butterworth_lowpass.h FORMS += filterbutterworthlowpassconfig.ui Kst-2.0.8/src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp0000644000175000017500000002266512362701575026327 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "butterworth_lowpass.h" #include "objectstore.h" #include "ui_filterbutterworthlowpassconfig.h" #include "scalar.h" #include "../filters.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_ORDER_IN = "Order Scalar"; static const QString& SCALAR_CUTOFF_IN = "Cutoff / Spacing Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigFilterButterworthLowPassPlugin : public Kst::DataObjectConfigWidget, public Ui_FilterButterworthLowPassConfig { public: ConfigFilterButterworthLowPassPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterButterworthLowPassConfig() { _store = 0; setupUi(this); } ~ConfigFilterButterworthLowPassPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarCutoff->setObjectStore(store); _scalarOrder->setDefaultValue(4); _scalarCutoff->setDefaultValue(0.1); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarCutoff, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedOrderScalar() { return _scalarOrder->selectedScalar(); }; void setSelectedOrderScalar(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedCutoffScalar() { return _scalarCutoff->selectedScalar(); }; void setSelectedCutoffScalar(Kst::ScalarPtr scalar) { return _scalarCutoff->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterButterworthLowPassSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedOrderScalar(source->orderScalar()); setSelectedCutoffScalar(source->cutoffScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter Low Pass Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Order Scalar", _scalarOrder->selectedScalar()->Name()); _cfg->setValue("Cutoff / Spacing Scalar", _scalarCutoff->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter Low Pass Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Order Scalar").toString(); _scalarOrder->setSelectedScalar(scalarName); scalarName = _cfg->value("Cutoff / Spacing Scalar").toString(); _scalarCutoff->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterButterworthLowPassSource::FilterButterworthLowPassSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterButterworthLowPassSource::~FilterButterworthLowPassSource() { } QString FilterButterworthLowPassSource::_automaticDescriptiveName() const { return tr("%1 Low Pass").arg(vector()->descriptiveName()); } void FilterButterworthLowPassSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigFilterButterworthLowPassPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); setInputScalar(SCALAR_CUTOFF_IN, config->selectedCutoffScalar()); } } void FilterButterworthLowPassSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } int min_pad(Kst::ScalarList) { return 0.0; } double filter_calculate( double dFreqValue, Kst::ScalarList scalars ) { double dValue; dValue = 1.0 / ( 1.0 + pow( dFreqValue / scalars.at(1)->value(), 2.0 * scalars.at(0)->value() ) ); return dValue; } bool FilterButterworthLowPassSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr orderScalar = _inputScalars[SCALAR_ORDER_IN]; Kst::ScalarPtr cutoffScalar = _inputScalars[SCALAR_CUTOFF_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } Kst::ScalarList scalars; scalars.insert(0, orderScalar); scalars.insert(1, cutoffScalar); Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Filtered %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return kst_pass_filter( inputVector, scalars, outputVector); } Kst::VectorPtr FilterButterworthLowPassSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterButterworthLowPassSource::cutoffScalar() const { return _inputScalars[SCALAR_CUTOFF_IN]; } Kst::ScalarPtr FilterButterworthLowPassSource::orderScalar() const { return _inputScalars[SCALAR_ORDER_IN]; } QStringList FilterButterworthLowPassSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterButterworthLowPassSource::inputScalarList() const { QStringList inputScalars( SCALAR_CUTOFF_IN ); inputScalars += SCALAR_ORDER_IN; return inputScalars; } QStringList FilterButterworthLowPassSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterButterworthLowPassSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterButterworthLowPassSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterButterworthLowPassSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterButterworthLowPassSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString ButterworthLowPassPlugin::pluginName() const { return tr("Low Pass Filter"); } QString ButterworthLowPassPlugin::pluginDescription() const { return tr("Filters a vector with a zero phase low pass filter with a butterworth amplitude response."); } Kst::DataObject *ButterworthLowPassPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigFilterButterworthLowPassPlugin* config = static_cast(configWidget)) { FilterButterworthLowPassSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_CUTOFF_IN, config->selectedCutoffScalar()); object->setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ButterworthLowPassPlugin::configWidget(QSettings *settingsObject) const { ConfigFilterButterworthLowPassPlugin *widget = new ConfigFilterButterworthLowPassPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ButterworthLowPassPlugin, ButterworthLowPassPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_lowpass/kstplugin_filter_butterworth_lowpass.desktop0000644000175000017500000000401512362705136032645 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterbutterworthlowpass X-Kst-Plugin-Author=The University of Toronto Name=Filter - Butterworth Low Pass Plugin Name[ca]=Filtre - Connector de passabaix Butterworth Name[ca@valencia]=Filtre - Connector de passabaix Butterworth Name[de]=Filter - Butterworth-Tiefpass-Modul Name[fr]=Module de filtre passe bas de Butterworth Name[it]=Estensione filtro di Butterworth passa-basso Name[nl]=Filter - Butterworth Low Pass Plugin Name[pl]=Wtyczka filtra Butterwortha przepuszczania dolnego pasma Name[pt]='Plugin' de Filtro Passa-Baixo Butterworth Name[pt_BR]=Plugin de filtro de passagem baixa Butterworth Name[sv]=Filter - Insticksprogram för Butterworth-lågpass Name[uk]=Додаток фільтрування низьких частот за Баттервортом Name[x-test]=xxFilter - Butterworth Low Pass Pluginxx Comment=Implements a Butterworth Low Pass Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre passabaix Butterworth pel Kst. Comment[ca@valencia]=Implementa un connector de filtre passabaix Butterworth pel Kst. Comment[de]=Implementiert ein Butterworth-Tiefpass-Filtermodul für Kst. Comment[fr]=Implémente un module de filtre passe bas de Butterworth pour Kst. Comment[it]=Implementa un'estensione filtro di Butterworth passa-basso per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Butterworth laagdoorlaatfilter. Comment[pl]=Implementuje wtyczkę obiektu danych filtra Butterwortha przepuszczania dolnego pasma dla Kst. Comment[pt]=Implementa um 'plugin' de filtro passa-baixo Butterworth para o Kst. Comment[pt_BR]=Implementa um plugin de filtro de passagem baixa Butterworth para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Butterworth-lågpassfilter. Comment[uk]=Реалізує додаток для фільтрування низьких частот за Баттервортом у Kst. Comment[x-test]=xxImplements a Butterworth Low Pass Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/butterworth_bandpass/0000755000175000017500000000000012362705136021547 5ustar synthsynthKst-2.0.8/src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui0000644000175000017500000000767312277111530030616 0ustar synthsynth FilterButterworthBandPassConfig 0 0 500 100 400 0 0 0 0 0 Input Vector - Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Filter Order: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Central Frequency / Sample Rate: false 0 0 Band width: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/butterworth_bandpass/kstplugin_filter_butterworth_bandpass.desktop0000644000175000017500000000406212362705136033055 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterbutterworthbandpass X-Kst-Plugin-Author=The University of Toronto Name=Filter - Butterworth Band Pass Plugin Name[ca]=Filtre - Connector de passabanda Butterworth Name[ca@valencia]=Filtre - Connector de passabanda Butterworth Name[de]=Filter - Butterworth-Bandpass-Modul Name[fr]=Module de filtre passe bande de Butterworth Name[it]=Estensione filtro di Butterworth passa-banda Name[nl]=Filter - Butterworth Band Pass Plugin Name[pl]=Wtyczka filtra Butterwortha przepuszczania pasma Name[pt]='Plugin' de Filtro Passa-Banda Butterworth Name[pt_BR]=Plugin de filtro de passagem de faixa Butterworth Name[sv]=Filter - Insticksprogram för Butterworth-bandpass Name[uk]=Додаток фільтрування смугового пропускання за Баттервортом Name[x-test]=xxFilter - Butterworth Band Pass Pluginxx Comment=Implements a Butterworth Band Pass Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre passabanda Butterworth pel Kst. Comment[ca@valencia]=Implementa un connector de filtre passabanda Butterworth pel Kst. Comment[de]=Implementiert ein Butterworth-Bandpass-Filtermodul für Kst. Comment[fr]=Implémente un module de filtre passe bande de Butterworth pour Kst. Comment[it]=Implementa un'estensione del filtro di Butterworth passa-banda per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Butterworth banddoorlaat filter. Comment[pl]=Implementuje wtyczkę obiektu danych filtra Butterwortha przepuszczania pasma dla Kst. Comment[pt]=Implementa um 'plugin' de filtro passa-banda Butterworth para o Kst. Comment[pt_BR]=Implementa um plugin de filtro de passagem de faixa Butterworth para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Butterworth-bandpassfilter. Comment[uk]=Реалізує додаток для фільтрування смугового пропускання за Баттервортом у Kst. Comment[x-test]=xxImplements a Butterworth Band Pass Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp0000644000175000017500000002612612362701575026531 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "butterworth_bandpass.h" #include "objectstore.h" #include "ui_filterbutterworthbandpassconfig.h" #include "../filters.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_ORDER_IN = "Order Scalar"; static const QString& SCALAR_RATE_IN = "Central Frequency / Sample Rate Scalar"; static const QString& SCALAR_BANDWIDTH_IN = "Band width Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigFilterButterworthBandPassPlugin : public Kst::DataObjectConfigWidget, public Ui_FilterButterworthBandPassConfig { public: ConfigFilterButterworthBandPassPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterButterworthBandPassConfig() { _store = 0; setupUi(this); } ~ConfigFilterButterworthBandPassPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarRate->setObjectStore(store); _scalarBandwidth->setObjectStore(store); _scalarOrder->setDefaultValue(4); _scalarRate->setDefaultValue(0.052); _scalarBandwidth->setDefaultValue(0.096); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarRate, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarBandwidth, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedOrderScalar() { return _scalarOrder->selectedScalar(); }; void setSelectedOrderScalar(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedRateScalar() { return _scalarRate->selectedScalar(); }; void setSelectedRateScalar(Kst::ScalarPtr scalar) { return _scalarRate->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedBandwidthScalar() { return _scalarBandwidth->selectedScalar(); }; void setSelectedBandwidthScalar(Kst::ScalarPtr scalar) { return _scalarBandwidth->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterButterworthBandPassSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedOrderScalar(source->orderScalar()); setSelectedRateScalar(source->rateScalar()); setSelectedBandwidthScalar(source->bandwidthScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter Band Pass Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Order Scalar", _scalarOrder->selectedScalar()->descriptiveName()); _cfg->setValue("Central Frequency / Sample Rate Scalar", _scalarRate->selectedScalar()->descriptiveName()); _cfg->setValue("Band width Scalar", _scalarBandwidth->selectedScalar()->descriptiveName()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter Band Pass Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Order Scalar").toString(); _scalarOrder->setSelectedScalar(scalarName); scalarName = _cfg->value("Central Frequency / Sample Rate Scalar").toString(); _scalarRate->setSelectedScalar(scalarName); scalarName = _cfg->value("Band width Scalar").toString(); _scalarBandwidth->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterButterworthBandPassSource::FilterButterworthBandPassSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterButterworthBandPassSource::~FilterButterworthBandPassSource() { } QString FilterButterworthBandPassSource::_automaticDescriptiveName() const { return tr("%1 Band Pass", "arg1 is a vector").arg(vector()->descriptiveName()); } void FilterButterworthBandPassSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigFilterButterworthBandPassPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); setInputScalar(SCALAR_RATE_IN, config->selectedRateScalar()); setInputScalar(SCALAR_BANDWIDTH_IN, config->selectedBandwidthScalar()); } } void FilterButterworthBandPassSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } int min_pad(Kst::ScalarList scalars) { double hp = scalars.at(1)->value() - 0.5*scalars.at(2)->value(); if (hp >0) { return int (1.0/hp); } else { return 0.0; } } double filter_calculate( double dFreqValue, Kst::ScalarList scalars ) { double dValue; int order2 = int(2.0 * scalars.at(0)->value()); double lowpass = scalars.at(1)->value() + 0.5*scalars.at(2)->value(); double highpass = scalars.at(1)->value() - 0.5*scalars.at(2)->value(); if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + gsl_pow_int( dFreqValue / lowpass, order2) ); dValue *= 1.0 / ( 1.0 + gsl_pow_int( highpass / dFreqValue, order2) ); } else { dValue = 0.0; } return dValue; } bool FilterButterworthBandPassSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr orderScalar = _inputScalars[SCALAR_ORDER_IN]; Kst::ScalarPtr rateScalar = _inputScalars[SCALAR_RATE_IN]; Kst::ScalarPtr bandwidthScalar = _inputScalars[SCALAR_BANDWIDTH_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } Kst::ScalarList scalars; scalars.insert(0, orderScalar); scalars.insert(1, rateScalar); scalars.insert(2, bandwidthScalar); Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Filtered %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return kst_pass_filter( inputVector, scalars, outputVector); } Kst::VectorPtr FilterButterworthBandPassSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterButterworthBandPassSource::orderScalar() const { return _inputScalars[SCALAR_ORDER_IN]; } Kst::ScalarPtr FilterButterworthBandPassSource::rateScalar() const { return _inputScalars[SCALAR_RATE_IN]; } Kst::ScalarPtr FilterButterworthBandPassSource::bandwidthScalar() const { return _inputScalars[SCALAR_BANDWIDTH_IN]; } QStringList FilterButterworthBandPassSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterButterworthBandPassSource::inputScalarList() const { QStringList inputScalars( SCALAR_ORDER_IN ); inputScalars += SCALAR_RATE_IN; inputScalars += SCALAR_BANDWIDTH_IN; return inputScalars; } QStringList FilterButterworthBandPassSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterButterworthBandPassSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterButterworthBandPassSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterButterworthBandPassSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterButterworthBandPassSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString ButterworthBandPassPlugin::pluginName() const { return tr("Band Pass Filter"); } QString ButterworthBandPassPlugin::pluginDescription() const { return tr("Filters a vector with a zero phase band pass filter with a butterworth amplitude response."); } Kst::DataObject *ButterworthBandPassPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigFilterButterworthBandPassPlugin* config = static_cast(configWidget)) { FilterButterworthBandPassSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); object->setInputScalar(SCALAR_RATE_IN, config->selectedRateScalar()); object->setInputScalar(SCALAR_BANDWIDTH_IN, config->selectedBandwidthScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ButterworthBandPassPlugin::configWidget(QSettings *settingsObject) const { ConfigFilterButterworthBandPassPlugin *widget = new ConfigFilterButterworthBandPassPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ButterworthBandPassPlugin, ButterworthBandPassPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_bandpass/butterworth_bandpass.pro0000755000175000017500000000036012277111530026531 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterbutterworthbandpass) LIBS += -l$$kstlib(gsl) SOURCES += \ butterworth_bandpass.cpp HEADERS += \ butterworth_bandpass.h FORMS += filterbutterworthbandpassconfig.ui Kst-2.0.8/src/plugins/filters/butterworth_bandpass/butterworth_bandpass.h0000644000175000017500000000545712277111530026171 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUTTERWORTHBANDPASSPLUGIN_H #define BUTTERWORTHBANDPASSPLUGIN_H #include #include #include class FilterButterworthBandPassSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr orderScalar() const; Kst::ScalarPtr rateScalar() const; Kst::ScalarPtr bandwidthScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterButterworthBandPassSource(Kst::ObjectStore *store); ~FilterButterworthBandPassSource(); friend class Kst::ObjectStore; }; class ButterworthBandPassPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ButterworthBandPassPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_bandstop/0000755000175000017500000000000012362705136021566 5ustar synthsynthKst-2.0.8/src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp0000644000175000017500000002566012362701575026571 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "butterworth_bandstop.h" #include "objectstore.h" #include "ui_filterbutterworthbandstopconfig.h" #include "../filters.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_ORDER_IN = "Order Scalar"; static const QString& SCALAR_RATE_IN = "Central Frequency / Sample Rate Scalar"; static const QString& SCALAR_BANDWIDTH_IN = "Band width Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigFilterButterworthBandStopPlugin : public Kst::DataObjectConfigWidget, public Ui_FilterButterworthBandStopConfig { public: ConfigFilterButterworthBandStopPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterButterworthBandStopConfig() { _store = 0; setupUi(this); } ~ConfigFilterButterworthBandStopPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarRate->setObjectStore(store); _scalarBandwidth->setObjectStore(store); _scalarOrder->setDefaultValue(4); _scalarRate->setDefaultValue(.2); _scalarBandwidth->setDefaultValue(.02); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarRate, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarBandwidth, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedOrderScalar() { return _scalarOrder->selectedScalar(); }; void setSelectedOrderScalar(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedRateScalar() { return _scalarRate->selectedScalar(); }; void setSelectedRateScalar(Kst::ScalarPtr scalar) { return _scalarRate->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedBandwidthScalar() { return _scalarBandwidth->selectedScalar(); }; void setSelectedBandwidthScalar(Kst::ScalarPtr scalar) { return _scalarBandwidth->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterButterworthBandStopSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedOrderScalar(source->orderScalar()); setSelectedRateScalar(source->rateScalar()); setSelectedBandwidthScalar(source->bandwidthScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter Band Stop Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Order Scalar", _scalarOrder->selectedScalar()->Name()); _cfg->setValue("Central Frequency / Sample Rate Scalar", _scalarRate->selectedScalar()->Name()); _cfg->setValue("Band width Scalar", _scalarBandwidth->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter Band Stop Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Order Scalar").toString(); _scalarOrder->setSelectedScalar(scalarName); scalarName = _cfg->value("Central Frequency / Sample Rate Scalar").toString(); _scalarRate->setSelectedScalar(scalarName); scalarName = _cfg->value("Band width Scalar").toString(); _scalarBandwidth->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterButterworthBandStopSource::FilterButterworthBandStopSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterButterworthBandStopSource::~FilterButterworthBandStopSource() { } QString FilterButterworthBandStopSource::_automaticDescriptiveName() const { return tr("%1 Band Stop").arg(vector()->descriptiveName()); } void FilterButterworthBandStopSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigFilterButterworthBandStopPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); setInputScalar(SCALAR_RATE_IN, config->selectedRateScalar()); setInputScalar(SCALAR_BANDWIDTH_IN, config->selectedBandwidthScalar()); } } void FilterButterworthBandStopSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } int min_pad(Kst::ScalarList) { return 0.0; } double filter_calculate( double dFreqValue, Kst::ScalarList scalars ) { double dValue; int order2 = int(2.0 * scalars.at(0)->value()); double lowpass = scalars.at(1)->value() + 0.5*scalars.at(2)->value(); double highpass = scalars.at(1)->value() - 0.5*scalars.at(2)->value(); if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + gsl_pow_int( dFreqValue / lowpass, order2) ); dValue *= 1.0 / ( 1.0 + gsl_pow_int( highpass / dFreqValue, order2) ); dValue = 1.0 - dValue; } else { dValue = 0.0; } return dValue; } bool FilterButterworthBandStopSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr orderScalar = _inputScalars[SCALAR_ORDER_IN]; Kst::ScalarPtr rateScalar = _inputScalars[SCALAR_RATE_IN]; Kst::ScalarPtr bandwidthScalar = _inputScalars[SCALAR_BANDWIDTH_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } Kst::ScalarList scalars; scalars.insert(0, orderScalar); scalars.insert(1, rateScalar); scalars.insert(2, bandwidthScalar); Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Filtered %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return kst_pass_filter( inputVector, scalars, outputVector); } Kst::VectorPtr FilterButterworthBandStopSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterButterworthBandStopSource::orderScalar() const { return _inputScalars[SCALAR_ORDER_IN]; } Kst::ScalarPtr FilterButterworthBandStopSource::rateScalar() const { return _inputScalars[SCALAR_RATE_IN]; } Kst::ScalarPtr FilterButterworthBandStopSource::bandwidthScalar() const { return _inputScalars[SCALAR_BANDWIDTH_IN]; } QStringList FilterButterworthBandStopSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterButterworthBandStopSource::inputScalarList() const { QStringList inputScalars( SCALAR_ORDER_IN ); inputScalars += SCALAR_RATE_IN; inputScalars += SCALAR_BANDWIDTH_IN; return inputScalars; } QStringList FilterButterworthBandStopSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterButterworthBandStopSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterButterworthBandStopSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterButterworthBandStopSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterButterworthBandStopSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString ButterworthBandStopPlugin::pluginName() const { return tr("Band Stop Filter"); } QString ButterworthBandStopPlugin::pluginDescription() const { return tr("Filters a vector with a zero phase band stop filter with a butterworth amplitude response."); } Kst::DataObject *ButterworthBandStopPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigFilterButterworthBandStopPlugin* config = static_cast(configWidget)) { FilterButterworthBandStopSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); object->setInputScalar(SCALAR_RATE_IN, config->selectedRateScalar()); object->setInputScalar(SCALAR_BANDWIDTH_IN, config->selectedBandwidthScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ButterworthBandStopPlugin::configWidget(QSettings *settingsObject) const { ConfigFilterButterworthBandStopPlugin *widget = new ConfigFilterButterworthBandStopPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ButterworthBandStopPlugin, ButterworthBandStopPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui0000644000175000017500000001061612277111530030643 0ustar synthsynth FilterButterworthBandStopConfig 0 0 400 103 400 0 0 0 Input Vector: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Filter Order: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Central Frequency / Sample Rate: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Band width: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/butterworth_bandstop/butterworth_bandstop.h0000644000175000017500000000545712277111530026227 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUTTERWORTHBANDSTOPPLUGIN_H #define BUTTERWORTHBANDSTOPPLUGIN_H #include #include #include class FilterButterworthBandStopSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr orderScalar() const; Kst::ScalarPtr rateScalar() const; Kst::ScalarPtr bandwidthScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterButterworthBandStopSource(Kst::ObjectStore *store); ~FilterButterworthBandStopSource(); friend class Kst::ObjectStore; }; class ButterworthBandStopPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ButterworthBandStopPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_bandstop/kstplugin_filter_butterworth_bandstop.desktop0000644000175000017500000000411512362705136033112 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterbutterworthbandstop X-Kst-Plugin-Author=The University of Toronto Name=Filter - Butterworth Band Stop Plugin Name[ca]=Filtre - Connector de banda eliminada Butterworth Name[ca@valencia]=Filtre - Connector de banda eliminada Butterworth Name[de]=Filter - Butterworth-Bandstopp-Modul Name[fr]=Module de filtre coupe bande de Butterworth Name[it]=Estensione filtro di Butterworth elimina-banda Name[nl]=Filter - Butterworth Band Stop Plugin Name[pl]=Wtyczka filtra Butterwortha zatrzymywania pasma Name[pt]='Plugin' de Filtro Corta-Banda Butterworth Name[pt_BR]=Plugin de filtro de interrupção de faixa Butterworth Name[sv]=Filter - Insticksprogram för Butterworth-bandstopp Name[uk]=Додаток фільтрування смугового блокування за Баттервортом Name[x-test]=xxFilter - Butterworth Band Stop Pluginxx Comment=Implements a Butterworth Band Stop Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre banda eliminada Butterworth pel Kst. Comment[ca@valencia]=Implementa un connector de filtre banda eliminada Butterworth pel Kst. Comment[de]=Implementiert ein Butterworth-Bandstopp-Filtermodul für Kst. Comment[fr]=Implémente un module de filtre coupe bande de Butterworth pour Kst. Comment[it]=Implementa un'estensione del filtro di Butterworth elimina-banda per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Butterworth band stopfilter Comment[pl]=Implementuje wtyczkę obiektu danych filtra Butterwortha zatrzymywania pasma dla Kst. Comment[pt]=Implementa um 'plugin' de filtro corta-banda Butterworth para o Kst. Comment[pt_BR]=Implementa um plugin de filtro de interrupção de faixa Butterworth para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Butterworth-bandstoppfilter. Comment[uk]=Реалізує додаток для фільтрування смугового блокування за Баттервортом у Kst. Comment[x-test]=xxImplements a Butterworth Band Stop Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/butterworth_bandstop/butterworth_bandstop.pro0000755000175000017500000000036012277111530026567 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterbutterworthbandstop) LIBS += -l$$kstlib(gsl) SOURCES += \ butterworth_bandstop.cpp HEADERS += \ butterworth_bandstop.h FORMS += filterbutterworthbandstopconfig.ui Kst-2.0.8/src/plugins/filters/butterworth_highpass/0000755000175000017500000000000012362705136021562 5ustar synthsynthKst-2.0.8/src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui0000644000175000017500000000574612277111530030643 0ustar synthsynth FilterButterworthHighPassConfig 0 0 429 91 400 0 0 0 Input Vector: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Filter Order: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Cutoff Frequency / Sample Rate: false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/butterworth_highpass/butterworth_highpass.pro0000755000175000017500000000036012277111530026557 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterbutterworthhighpass) LIBS += -l$$kstlib(gsl) SOURCES += \ butterworth_highpass.cpp HEADERS += \ butterworth_highpass.h FORMS += filterbutterworthhighpassconfig.ui Kst-2.0.8/src/plugins/filters/butterworth_highpass/kstplugin_filter_butterworth_highpass.desktop0000644000175000017500000000401612362705136033102 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterbutterworthhighpass X-Kst-Plugin-Author=The University of Toronto Name=Filter - Butterworth High Pass Plugin Name[ca]=Filtre - Connector de passaalt Butterworth Name[ca@valencia]=Filtre - Connector de passaalt Butterworth Name[de]=Filter - Butterworth-Hochpass-Modul Name[fr]=Module de filtre passe haut de Butterworth Name[it]=Estensione filtro di Butterworth passa-alto Name[nl]=Filter - Butterworth High Pass Plugin Name[pl]=Wtyczka filtra Butterwortha przepuszczania górnego pasma Name[pt]='Plugin' de Filtro Passa-Alto Butterworth Name[pt_BR]=Plugin de filtro de passagem alta Butterworth Name[sv]=Filter - Insticksprogram för Butterworth-högpass Name[uk]=Додаток фільтрування високих частот за Баттервортом Name[x-test]=xxFilter - Butterworth High Pass Pluginxx Comment=Implements a Butterworth High Pass Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre passaalt Butterworth pel Kst. Comment[ca@valencia]=Implementa un connector de filtre passaalt Butterworth pel Kst. Comment[de]=Implementiert ein Butterworth-Hochpass-Filtermodul für Kst. Comment[fr]=Implémente un module de filtre passe haut de Butterworth pour Kst. Comment[it]=Implementa un'estensione filtro di Butterworth passa-alto per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor Butterworth hoogdoorlaat filter. Comment[pl]=Implementuje wtyczkę obiektu danych filtra Butterwortha przepuszczania górnego pasma dla Kst. Comment[pt]=Implementa um 'plugin' de filtro passa-alto Butterworth para o Kst. Comment[pt_BR]=Implementa um plugin de filtro de passagem alta Butterworth para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för Butterworth-högpassfilter. Comment[uk]=Реалізує додаток для фільтрування високих частот за Баттервортом у Kst. Comment[x-test]=xxImplements a Butterworth High Pass Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp0000644000175000017500000002317412362701575026557 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "butterworth_highpass.h" #include "objectstore.h" #include "ui_filterbutterworthhighpassconfig.h" #include "../filters.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_ORDER_IN = "Order Scalar"; static const QString& SCALAR_CUTOFF_IN = "Cutoff / Spacing Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigFilterButterworthHighPassPlugin : public Kst::DataObjectConfigWidget, public Ui_FilterButterworthHighPassConfig { public: ConfigFilterButterworthHighPassPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterButterworthHighPassConfig() { _store = 0; setupUi(this); } ~ConfigFilterButterworthHighPassPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarOrder->setObjectStore(store); _scalarCutoff->setObjectStore(store); _scalarOrder->setDefaultValue(4); _scalarCutoff->setDefaultValue(0.02); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarOrder, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarCutoff, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedOrderScalar() { return _scalarOrder->selectedScalar(); }; void setSelectedOrderScalar(Kst::ScalarPtr scalar) { return _scalarOrder->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedCutoffScalar() { return _scalarCutoff->selectedScalar(); }; void setSelectedCutoffScalar(Kst::ScalarPtr scalar) { return _scalarCutoff->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterButterworthHighPassSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedOrderScalar(source->orderScalar()); setSelectedCutoffScalar(source->cutoffScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter High Pass Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Order Scalar", _scalarOrder->selectedScalar()->Name()); _cfg->setValue("Cutoff / Spacing Scalar", _scalarCutoff->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter High Pass Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Order Scalar").toString(); _scalarOrder->setSelectedScalar(scalarName); scalarName = _cfg->value("Cutoff / Spacing Scalar").toString(); _scalarCutoff->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterButterworthHighPassSource::FilterButterworthHighPassSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterButterworthHighPassSource::~FilterButterworthHighPassSource() { } QString FilterButterworthHighPassSource::_automaticDescriptiveName() const { return tr("%1 High Pass").arg(vector()->descriptiveName()); } void FilterButterworthHighPassSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigFilterButterworthHighPassPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); setInputScalar(SCALAR_CUTOFF_IN, config->selectedCutoffScalar()); } } void FilterButterworthHighPassSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } int min_pad(Kst::ScalarList scalars) { double hp = scalars.at(1)->value(); if (hp >0) { return int (1.0/hp); } else { return 0.0; } } double filter_calculate( double dFreqValue, Kst::ScalarList scalars ) { double dValue; if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + pow( scalars.at(1)->value() / dFreqValue, 2.0 * scalars.at(0)->value() ) ); } else { dValue = 0.0; } return dValue; } bool FilterButterworthHighPassSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr orderScalar = _inputScalars[SCALAR_ORDER_IN]; Kst::ScalarPtr cutoffScalar = _inputScalars[SCALAR_CUTOFF_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } Kst::ScalarList scalars; scalars.insert(0, orderScalar); scalars.insert(1, cutoffScalar); Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Filtered %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return kst_pass_filter( inputVector, scalars, outputVector); } Kst::VectorPtr FilterButterworthHighPassSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterButterworthHighPassSource::cutoffScalar() const { return _inputScalars[SCALAR_CUTOFF_IN]; } Kst::ScalarPtr FilterButterworthHighPassSource::orderScalar() const { return _inputScalars[SCALAR_ORDER_IN]; } QStringList FilterButterworthHighPassSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterButterworthHighPassSource::inputScalarList() const { QStringList inputScalars( SCALAR_CUTOFF_IN ); inputScalars += SCALAR_ORDER_IN; return inputScalars; } QStringList FilterButterworthHighPassSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterButterworthHighPassSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterButterworthHighPassSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterButterworthHighPassSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterButterworthHighPassSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString ButterworthHighPassPlugin::pluginName() const { return tr("High Pass Filter"); } QString ButterworthHighPassPlugin::pluginDescription() const { return tr("Filters a vector with a zero phase high pass filter with a butterworth amplitude response."); } Kst::DataObject *ButterworthHighPassPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigFilterButterworthHighPassPlugin* config = static_cast(configWidget)) { FilterButterworthHighPassSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_CUTOFF_IN, config->selectedCutoffScalar()); object->setInputScalar(SCALAR_ORDER_IN, config->selectedOrderScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *ButterworthHighPassPlugin::configWidget(QSettings *settingsObject) const { ConfigFilterButterworthHighPassPlugin *widget = new ConfigFilterButterworthHighPassPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_ButterworthHighPassPlugin, ButterworthHighPassPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/butterworth_highpass/butterworth_highpass.h0000644000175000017500000000540512277111530026210 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUTTERWORTHHIGHPASSPLUGIN_H #define BUTTERWORTHHIGHPASSPLUGIN_H #include #include #include class FilterButterworthHighPassSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; Kst::VectorPtr vector() const; Kst::ScalarPtr orderScalar() const; Kst::ScalarPtr cutoffScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterButterworthHighPassSource(Kst::ObjectStore *store); ~FilterButterworthHighPassSource(); friend class Kst::ObjectStore; }; class ButterworthHighPassPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~ButterworthHighPassPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/despike/0000755000175000017500000000000012362705136016727 5ustar synthsynthKst-2.0.8/src/plugins/filters/despike/filterdespike.h0000644000175000017500000000537012277111530021731 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef FILTERDESPIKEPLUGIN_H #define FILTERDESPIKEPLUGIN_H #include #include #include class FilterDespikeSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr nSigmaScalar() const; Kst::ScalarPtr spacingScalar() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: FilterDespikeSource(Kst::ObjectStore *store); ~FilterDespikeSource(); friend class Kst::ObjectStore; }; class FilterDespikePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~FilterDespikePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/despike/filterdespike.cpp0000644000175000017500000002713012320547027022265 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "filterdespike.h" #include "objectstore.h" #include "ui_filterdespikeconfig.h" static const QString& VECTOR_IN = "Y Vector"; static const QString& SCALAR_NSIGMA_IN = "NSigma Scalar"; static const QString& SCALAR_SPACING_IN = "Spacing Scalar"; static const QString& VECTOR_OUT = "Y"; class ConfigWidgetFilterDespikePlugin : public Kst::DataObjectConfigWidget, public Ui_FilterDespikeConfig { public: ConfigWidgetFilterDespikePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_FilterDespikeConfig() { _store = 0; setupUi(this); } ~ConfigWidgetFilterDespikePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarNSigma->setObjectStore(store); _scalarSpacing->setObjectStore(store); _scalarNSigma->setDefaultValue(5.0); _scalarSpacing->setDefaultValue(1.0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarNSigma, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarSpacing, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedNSigmaScalar() { return _scalarNSigma->selectedScalar(); }; void setSelectedNSigmaScalar(Kst::ScalarPtr scalar) { return _scalarNSigma->setSelectedScalar(scalar); }; Kst::ScalarPtr selectedSpacingScalar() { return _scalarSpacing->selectedScalar(); }; void setSelectedSpacingScalar(Kst::ScalarPtr scalar) { return _scalarSpacing->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (FilterDespikeSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedNSigmaScalar(source->nSigmaScalar()); setSelectedSpacingScalar(source->spacingScalar()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Filter Despike Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Spacing Scalar", _scalarSpacing->selectedScalar()->Name()); _cfg->setValue("NSigma Scalar", _scalarNSigma->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Filter Despike Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Spacing Scalar").toString(); _scalarSpacing->setSelectedScalar(scalarName); scalarName = _cfg->value("NSigma Scalar").toString(); _scalarNSigma->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; FilterDespikeSource::FilterDespikeSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } FilterDespikeSource::~FilterDespikeSource() { } QString FilterDespikeSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Despiked", "arg 1 is the name of the vector which has been despiked").arg(vector()->descriptiveName()); } else { return tr("Despike"); } } QString FilterDespikeSource::descriptionTip() const { QString tip; tip = tr("Despike Filter: %1\n Spacing: %2\n NSigma: %3").arg(Name()).arg(spacingScalar()->value()).arg(nSigmaScalar()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void FilterDespikeSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigWidgetFilterDespikePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_NSIGMA_IN, config->selectedNSigmaScalar()); setInputScalar(SCALAR_SPACING_IN, config->selectedSpacingScalar()); } } void FilterDespikeSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool FilterDespikeSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr nSigmaScalar = _inputScalars[SCALAR_NSIGMA_IN]; Kst::ScalarPtr spacingScalar = _inputScalars[SCALAR_SPACING_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } int N = inputVector->length(); double last_good; double mdev = 0; double cut = nSigmaScalar->value(); int dx = int(spacingScalar->value()); int i; int spike_start = -1; int border = dx*2; if ( (N < 1) || (cut <= 0) || (dx < 1) || (dx > N/2) ) { return false; } /* get mean deviation of 3 pt difference */ for (i=dx; ivalue(i)-(inputVector->value(i-dx) + inputVector->value(i+dx))*0.5); } mdev /= double(N); cut *= mdev; // resize the output array outputVector->resize(inputVector->length(), false); // for first dx points, do a 2 point difference last_good = inputVector->value(0); for (i=0; ivalue(i) - inputVector->value(i+dx))>cut) { if (spike_start<0) { spike_start = i-border; if (spike_start<0) { spike_start = 0; } } } else { if (spike_start>=0) { i += 4*border-1; if (i>=N) { i=N-1; } for (int j=spike_start; j<=i; j++) { outputVector->value()[j] = last_good; } spike_start = -1; } last_good = outputVector->value()[i] = inputVector->value(i); } } // do a 3 point difference where it is possible for (i=dx; ivalue(i) - (inputVector->value(i-dx) + inputVector->value(i+dx))*0.5)>cut) { if (spike_start<0) { spike_start = i-border; if (spike_start<0) { spike_start = 0; } } } else { if (spike_start>=0) { i += 4*border-1; if (i>=N) { i=N-1; } for (int j=spike_start; j<=i; j++) { outputVector->value()[j] = last_good; } spike_start = -1; } else { last_good = outputVector->value()[i] = inputVector->value(i); } } } // do a 2 point difference for last dx points for (i=N-dx-1; ivalue(i-dx) - inputVector->value(i))>cut) { if (spike_start<0) { spike_start = i-border; if (spike_start<0) { spike_start = 0; } } } else { if (spike_start>=0) { i += 4*border-1; if (i>=N) { i=N-1; } for (int j=spike_start; j<=i; j++) { outputVector->value()[j] = last_good; } spike_start = -1; } else { last_good = outputVector->value()[i] = inputVector->value(i); } } } if (spike_start>=0) { for (int j=spike_start; jvalue()[j] = last_good; } } Kst::LabelInfo label_info = inputVector->labelInfo(); label_info.name = tr("Despiked %1").arg(label_info.name); outputVector->setLabelInfo(label_info); return true; } Kst::VectorPtr FilterDespikeSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr FilterDespikeSource::spacingScalar() const { return _inputScalars[SCALAR_SPACING_IN]; } Kst::ScalarPtr FilterDespikeSource::nSigmaScalar() const { return _inputScalars[SCALAR_NSIGMA_IN]; } QStringList FilterDespikeSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList FilterDespikeSource::inputScalarList() const { QStringList inputScalars( SCALAR_NSIGMA_IN ); inputScalars += SCALAR_SPACING_IN; return inputScalars; } QStringList FilterDespikeSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList FilterDespikeSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList FilterDespikeSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList FilterDespikeSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void FilterDespikeSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } // Name used to identify the plugin. Used when loading the plugin. QString FilterDespikePlugin::pluginName() const { return tr("Despike Filter"); } QString FilterDespikePlugin::pluginDescription() const { return tr("Finds and removes spikes using a 3 point difference."); } Kst::DataObject *FilterDespikePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigWidgetFilterDespikePlugin* config = static_cast(configWidget)) { FilterDespikeSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_SPACING_IN, config->selectedSpacingScalar()); object->setInputScalar(SCALAR_NSIGMA_IN, config->selectedNSigmaScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *FilterDespikePlugin::configWidget(QSettings *settingsObject) const { ConfigWidgetFilterDespikePlugin *widget = new ConfigWidgetFilterDespikePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_FilterDespikePlugin, FilterDespikePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/despike/filterdespikeconfig.ui0000644000175000017500000000605012277111530023301 0ustar synthsynth FilterDespikeConfig 0 0 400 75 400 0 0 0 Input Vector: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Spacing: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 NSigma: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/despike/despike.pro0000755000175000017500000000026212277111530021072 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_filterdespike) SOURCES += \ filterdespike.cpp HEADERS += \ filterdespike.h FORMS += filterdespikeconfig.ui Kst-2.0.8/src/plugins/filters/despike/kstplugin_filter_despike.desktop0000644000175000017500000000347412362705136025423 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=filterdespike X-Kst-Plugin-Author=The University of Toronto Name=Filter - Despike Plugin Name[ca]=Filtre - Connector d'eliminació de pics Name[ca@valencia]=Filtre - Connector d'eliminació de pics Name[de]=Filter - Modul zur Entfernung von Messspitzen Name[fr]=Module de filtre de suppression de pic Name[it]=Estensione filtro despike Name[nl]=Filter - Despike Plugin Name[pl]=Wtyczka filtra odimpulsowienia Name[pt]='Plugin' de Filtro de Eliminação de Picos Name[pt_BR]=Plugin de filtro de eliminação de picos Name[sv]=Filter - Insticksprogram för toppborttagning Name[uk]=Додаток фільтрування з метою усування піків Name[x-test]=xxFilter - Despike Pluginxx Comment=Implements a Despike Filter Plugin for Kst. Comment[ca]=Implementa un connector de filtre d'eliminació de pics pel Kst. Comment[ca@valencia]=Implementa un connector de filtre d'eliminació de pics pel Kst. Comment[de]=Implementiert ein Filtermodul zur Entfernung von Messspitzen für Kst. Comment[fr]=Implémente un module de filtre de suppression de pic pour Kst. Comment[it]=Implementa un'estensione del filtro despike Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor weghalen van spikes (uitschieters). Comment[pl]=Implementuje wtyczkę obiektu danych filtra odimpulsowienia dla Kst. Comment[pt]=Implementa um 'plugin' de filtro de eliminação de picos para o Kst. Comment[pt_BR]=Implementa um plugin de filtro de eliminação de pico para o Kst. Comment[sv]=Implementerar ett Kst insticksprogram för toppborttagningsfilter. Comment[uk]=Реалізує додаток для фільтрування з метою усування піків у Kst. Comment[x-test]=xxImplements a Despike Filter Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/differentiation/0000755000175000017500000000000012362705136020455 5ustar synthsynthKst-2.0.8/src/plugins/filters/differentiation/differentiation.cpp0000644000175000017500000001773212362701575024350 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "differentiation.h" #include "objectstore.h" #include "ui_differentiationconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scale Scalar"; static const QString& VECTOR_OUT = "dY/dX"; class ConfigDifferentiationPlugin : public Kst::DataObjectConfigWidget, public Ui_DifferentiationConfig { public: ConfigDifferentiationPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_DifferentiationConfig() { _store = 0; setupUi(this); } ~ConfigDifferentiationPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarStep->setObjectStore(store); _scalarStep->setDefaultValue(1.0); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarStep, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarStep->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarStep->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (DifferentiationSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->scalarStep()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Differentiation DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar", _scalarStep->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Differentiation DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Scalar").toString(); _scalarStep->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; DifferentiationSource::DifferentiationSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } DifferentiationSource::~DifferentiationSource() { } QString DifferentiationSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Derivative").arg(vector()->descriptiveName()); } else { return tr("Derivative"); } } QString DifferentiationSource::descriptionTip() const { QString tip; tip = tr("Derivative: %1\n dX: %2\n").arg(Name()).arg(scalarStep()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void DifferentiationSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigDifferentiationPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); } } void DifferentiationSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool DifferentiationSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT]; if (inputScalar->value() == 0) { _errorString = tr("Error: Input Scalar Step must be not be 0."); return false; } /* Memory allocation */ outputVector->resize(inputVector->length(), true); int i = 0; for (; i < inputVector->length()-1; i++) { outputVector->value()[i] = (inputVector->value()[i+1] - inputVector->value()[i]) / inputScalar->value(); } // Repeat the last point to keep the vector length, even though it does not bring much additional info outputVector->value()[i] = (inputVector->value()[i] - inputVector->value()[i-1]) / inputScalar->value(); return true; } Kst::VectorPtr DifferentiationSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr DifferentiationSource::scalarStep() const { return _inputScalars[SCALAR_IN]; } QStringList DifferentiationSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList DifferentiationSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList DifferentiationSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList DifferentiationSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList DifferentiationSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList DifferentiationSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void DifferentiationSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString DifferentiationPlugin::pluginName() const { return tr("Fixed Step Differentiation"); } QString DifferentiationPlugin::pluginDescription() const { return tr("Computes the discrete derivative of an input vector"); } Kst::DataObject *DifferentiationPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigDifferentiationPlugin* config = static_cast(configWidget)) { DifferentiationSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *DifferentiationPlugin::configWidget(QSettings *settingsObject) const { ConfigDifferentiationPlugin *widget = new ConfigDifferentiationPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, DifferentiationPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/differentiation/kstplugin_differentiation.desktop0000644000175000017500000000365112362705136027327 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=differentiation X-Kst-Plugin-Author=The University of Toronto Name=Differentiation Data Object Plugin Name[ca]=Connector d'objecte de dades de diferenciació Name[ca@valencia]=Connector d'objecte de dades de diferenciació Name[de]=Differenzierungs-Datenobjekt-Modul Name[fr]=Module DataObject de différentiation Name[it]=Estensione oggetto dati di differenziazione Name[nl]=Differentiation Data Object Plugin Name[pl]=Wtyczka obiektu danych różniczkowania Name[pt]='Plugin' de Objectos de Dados de Derivadas Name[pt_BR]=Plugin de objeto de dados de derivadas Name[sv]=Dataobjekt-insticksprogram för differentiering Name[uk]=Додаток для роботи з об’єктами диференціації даних Name[x-test]=xxDifferentiation Data Object Pluginxx Comment=Implements a Differentiation Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de diferenciació pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de diferenciació pel Kst. Comment[de]=Implementiert ein Differenzierungs-Datenobjekt-Modul für Kst. Comment[fr]=Implémente un module DataObject de différentiation pour Kst. Comment[it]=Implementa un'estensione oggetto dati di differenziazione Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor differentiatie. Comment[pl]=Implementuje wtyczkę obiektu danych różniczkowania dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados para o cálculo de derivadas no Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de derivadas para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för differentiering. Comment[uk]=Реалізує додаток для роботи з об’єктами диференціації даних у Kst. Comment[x-test]=xxImplements a Differentiation Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/differentiation/differentiationconfig.ui0000644000175000017500000000440412277111530025350 0ustar synthsynth DifferentiationConfig 0 0 428 44 400 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 Step (dX): false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/differentiation/differentiation.pro0000644000175000017500000000027212277111530024344 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_differentiation) SOURCES += \ differentiation.cpp HEADERS += \ differentiation.h FORMS += differentiationconfig.ui Kst-2.0.8/src/plugins/filters/differentiation/differentiation.h0000644000175000017500000000533212277111530023775 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DIFFERENTIATIONPLUGIN_H #define DIFFERENTIATIONPLUGIN_H #include #include #include class DifferentiationSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr scalarStep() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: DifferentiationSource(Kst::ObjectStore *store); ~DifferentiationSource(); friend class Kst::ObjectStore; }; class DifferentiationPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~DifferentiationPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/cumulativeaverage/0000755000175000017500000000000012362705136021014 5ustar synthsynthKst-2.0.8/src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp0000644000175000017500000001603412320547027025232 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "cumulativeaverage.h" #include "objectstore.h" #include "ui_cumulativeaverageconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& VECTOR_OUT = "Avg(Y)"; class ConfigCumulativeAveragePlugin : public Kst::DataObjectConfigWidget, public Ui_CumulativeAverageConfig { public: ConfigCumulativeAveragePlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CumulativeAverageConfig() { _store = 0; setupUi(this); } ~ConfigCumulativeAveragePlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CumulativeAverageSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Cumulative Average DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Cumulative Average DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CumulativeAverageSource::CumulativeAverageSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CumulativeAverageSource::~CumulativeAverageSource() { } QString CumulativeAverageSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Cumulative Average").arg(vector()->descriptiveName()); } else { return tr("Cumulative Average"); } } QString CumulativeAverageSource::descriptionTip() const { QString tip; tip = tr("Cumulative Average: %1\n").arg(Name()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void CumulativeAverageSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigCumulativeAveragePlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); } } void CumulativeAverageSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } // TODO bool CumulativeAverageSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } /* Memory allocation */ outputVector->resize(inputVector->length(), true); outputVector->value()[0] = inputVector->value()[0]; // i = 1 for (int i = 1; i < inputVector->length(); ++i) { outputVector->value()[i] = (inputVector->value()[i] + (i * outputVector->value()[i-1])) / (i+1); } return true; } Kst::VectorPtr CumulativeAverageSource::vector() const { return _inputVectors[VECTOR_IN]; } QStringList CumulativeAverageSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList CumulativeAverageSource::inputScalarList() const { return QStringList( /*SCALAR_IN*/ ); } QStringList CumulativeAverageSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CumulativeAverageSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList CumulativeAverageSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CumulativeAverageSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CumulativeAverageSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CumulativeAveragePlugin::pluginName() const { return tr("Cumulative Average"); } QString CumulativeAveragePlugin::pluginDescription() const { return tr("Computes the cumulative average of the input vector."); } Kst::DataObject *CumulativeAveragePlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigCumulativeAveragePlugin* config = static_cast(configWidget)) { CumulativeAverageSource* object = store->createObject(); if (setupInputsOutputs) { object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CumulativeAveragePlugin::configWidget(QSettings *settingsObject) const { ConfigCumulativeAveragePlugin *widget = new ConfigCumulativeAveragePlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, CumulativeAveragePlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/cumulativeaverage/cumulativeaverage.h0000644000175000017500000000530112277111530024667 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CUMULATIVEAVERAGEPLUGIN_H #define CUMULATIVEAVERAGEPLUGIN_H #include #include #include class CumulativeAverageSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CumulativeAverageSource(Kst::ObjectStore *store); ~CumulativeAverageSource(); friend class Kst::ObjectStore; }; class CumulativeAveragePlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CumulativeAveragePlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/cumulativeaverage/kstplugin_cumulativeaverage.desktop0000644000175000017500000000407612362705136030227 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=cumulativeaverage X-Kst-Plugin-Author=dkruger Name=Cumulative Average Data Object Plugin Name[ca]=Connector d'objecte de dades de mitjana acumulada Name[ca@valencia]=Connector d'objecte de dades de mitjana acumulada Name[de]=Datenobjekt-Modul für kumulierten Durchschnitt Name[fr]=Module DataObject de moyenne cumulée Name[it]=Estensione oggetto dati di media cumulativa Name[nl]=Cumulative Average Data Object Plugin Name[pl]=Wtyczka obiektu danych skumulowanej średniej Name[pt]='Plugin' de Objectos de Dados de Média Acumulada Name[pt_BR]=Plugin de objeto de dados de média acumulada Name[sv]=Dataobjekt-insticksprogram för ackumulerat medelvärde Name[uk]=Додаток для роботи з об’єктами накопичувального середнього даних Name[x-test]=xxCumulative Average Data Object Pluginxx Comment=Implements a Cumulative Averge Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de mitjana acumulada pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de mitjana acumulada pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für kumulierten Durchschnitt für Kst. Comment[fr]=Implémente un module DataObject de moyenne cumulée pour Kst. Comment[it]=Implementa un'estensione oggetto dati di media cumulativa per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor cumulatief gemiddelde. Comment[pl]=Implementuje wtyczkę obiektu danych skumulowanej średniej dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de média acumulada para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de média acumulada para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för ackumulerat medelvärde. Comment[uk]=Реалізує додаток для роботи з об’єктами накопичувального середнього даних у Kst. Comment[x-test]=xxImplements a Cumulative Averge Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/cumulativeaverage/cumulativeaverage.pro0000644000175000017500000000030212277111530025234 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_cumulativeaverage) SOURCES += \ cumulativeaverage.cpp HEADERS += \ cumulativeaverage.h FORMS += cumulativeaverageconfig.ui Kst-2.0.8/src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui0000644000175000017500000000311612277111530026245 0ustar synthsynth CumulativeAverageConfig 0 0 425 55 400 0 0 0 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst-2.0.8/src/plugins/filters/filters.h0000644000175000017500000001332112362701575017127 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /* * Generic pass filter plugin for KST. * Released under the terms of the GPL */ #include #include #include #include #include #include #include "vector.h" #include "scalar.h" double filter_calculate( double dFreqValue, Kst::ScalarList scalars ); int min_pad(Kst::ScalarList scalars); void fit_mb(double *y, int n, double &m, double &b) { if (n<5) { m = 0.0; b = y[0]; return; } double Sy=0; double x_ = 0; // mean of x double y_ = 0; // mean of y int i; double x; double Sdxdy=0; // sum(x - x_) double Sdx2=0; // sum((x - x_)^2) for (i = 0; ivalue() > 0.0 ) { iLengthData = vector->length(); if( iLengthData > 0 ) { // // round up to the nearest power of 2... // iLengthDataPadded = (int)pow( 2.0, ceil( log10( (double)iLengthData ) / log10( 2.0 ) ) ); // make sure the padding is long enough - this depends on the type of filter. if (iLengthDataPadded - iLengthData < min_pad(scalars)) { //qDebug() << "doubled length" << min_pad(scalars) << iLengthDataPadded - iLengthData << iLengthDataPadded; iLengthDataPadded *= 2.0; } pPadded = (double*)malloc( iLengthDataPadded * sizeof( double ) ); if( pPadded != 0L ) { outVector->resize(iLengthData); //outVector->resize(iLengthDataPadded); // DEBUG ************ real = gsl_fft_real_wavetable_alloc( iLengthDataPadded ); if( real != NULL ) { work = gsl_fft_real_workspace_alloc( iLengthDataPadded ); if( work != NULL ) { memcpy( pPadded, vector->value(), iLengthData * sizeof( double ) ); // We are going to do a cubic spline extrapolation on the data // to improve behavior for high pass filters. double m1, b1; double m2, b2; int nf = min_pad(scalars)/10.0; if (nf > iLengthData/5) nf = iLengthData/5; fit_mb(pPadded, nf, m2, b2); fit_mb(pPadded + (iLengthData-nf-1), nf, m1, b1); double a = b1; double b = m1; double X = double(nf + iLengthDataPadded - iLengthData); double d = (-2.0*b2 +m2*X + 2.0*b1 + m1*X)/(X*X*X); double c = (b2 - b1 - m1*X - d*X*X*X)/(X*X); // // polynomial extrapolation on the padded values... // for( i=iLengthData; ivalue()[iLengthData-1] - (double)( i - iLengthData + 1 ) * ( vector->value()[iLengthData-1] - vector->value()[0] ) / (double)( iLengthDataPadded - iLengthData ); } // // calculate the FFT... // iStatus = gsl_fft_real_transform( pPadded, 1, iLengthDataPadded, real, work ); if( !iStatus ) { // // apply the filter... // for( i=0; ivalue(), pPadded, iLengthData * sizeof( double ) ); //memcpy( outVector->value(), pPadded, iLengthDataPadded * sizeof( double ) ); // DEBUG ********************** bReturn = true; } gsl_fft_halfcomplex_wavetable_free( hc ); } } gsl_fft_real_workspace_free( work ); } gsl_fft_real_wavetable_free( real ); } free( pPadded ); } } } return bReturn; } Kst-2.0.8/src/plugins/filters/cumulativesum/0000755000175000017500000000000012362705136020206 5ustar synthsynthKst-2.0.8/src/plugins/filters/cumulativesum/cumulativesum.pro0000644000175000017500000000026212277111530023625 0ustar synthsynthinclude(../../plugins_sub.pri) TARGET = $$kstlib(kstplugin_cumulativesum) SOURCES += \ cumulativesum.cpp HEADERS += \ cumulativesum.h FORMS += cumulativesumconfig.ui Kst-2.0.8/src/plugins/filters/cumulativesum/cumulativesumconfig.ui0000644000175000017500000000440212277111530024630 0ustar synthsynth CumulativeSumConfig 0 0 425 55 400 0 0 0 0 0 Step (dX): false 0 0 Y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Kst::VectorSelector QWidget
vectorselector.h
Kst::ScalarSelector QWidget
scalarselector.h
Kst-2.0.8/src/plugins/filters/cumulativesum/kstplugin_cumulativesum.desktop0000644000175000017500000000376412362705136026616 0ustar synthsynth[Desktop Entry] Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=cumulativesum X-Kst-Plugin-Author=The University of Toronto Name=Cumulative Sum Data Object Plugin Name[ca]=Connector d'objecte de dades de suma acumulada Name[ca@valencia]=Connector d'objecte de dades de suma acumulada Name[de]=Datenobjekt-Modul für kumulierten Summen-Mittelwert Name[fr]=Module DataObject de somme cumulée Name[it]=Estensione oggetto dati di somma cumulativa Name[nl]=Cumulative Sum Data Object Plugin Name[pl]=Wtyczka obiektu danych skumulowanej sumy Name[pt]='Plugin' de Objectos de Dados de Soma Acumulada Name[pt_BR]=Plugin de objeto de dados de soma acumulada Name[sv]=Dataobjekt-insticksprogram för ackumulerad summa Name[uk]=Додаток для роботи з об’єктами накопичувальної суми даних Name[x-test]=xxCumulative Sum Data Object Pluginxx Comment=Implements a Cumulative Sum Data Object Plugin for Kst. Comment[ca]=Implementa un connector d'objecte de dades de suma acumulada pel Kst. Comment[ca@valencia]=Implementa un connector d'objecte de dades de suma acumulada pel Kst. Comment[de]=Implementiert ein Datenobjekt-Modul für kumulierten Summen-Mittelwert für Kst. Comment[fr]=Implémente un module DataObject de somme cumulée pour Kst. Comment[it]=Implementa un'estensione oggetto dati di somma cumulativa per Kst. Comment[nl]=Implementeert een plugin voor een gegevensobject in Kst voor cumulatieve som. Comment[pl]=Implementuje wtyczkę obiektu danych skumulowanej sumy dla Kst. Comment[pt]=Implementa um 'plugin' de objectos de dados de soma acumulada para o Kst. Comment[pt_BR]=Implementa um plugin de objeto de dados de soma acumulada para o Kst. Comment[sv]=Implementerar ett Kst dataobjekt-insticksprogram för ackumulerad summa. Comment[uk]=Реалізує додаток для роботи з об’єктами накопичувальної суми даних у Kst. Comment[x-test]=xxImplements a Cumulative Sum Data Object Plugin for Kst.xx Kst-2.0.8/src/plugins/filters/cumulativesum/cumulativesum.h0000644000175000017500000000531412277111530023257 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CUMULATIVESUMPLUGIN_H #define CUMULATIVESUMPLUGIN_H #include #include #include class CumulativeSumSource : public Kst::BasicPlugin { Q_OBJECT public: virtual QString _automaticDescriptiveName() const; virtual QString descriptionTip() const; Kst::VectorPtr vector() const; Kst::ScalarPtr scalarStep() const; virtual void change(Kst::DataObjectConfigWidget *configWidget); void setupOutputs(); virtual bool algorithm(); virtual QStringList inputVectorList() const; virtual QStringList inputScalarList() const; virtual QStringList inputStringList() const; virtual QStringList outputVectorList() const; virtual QStringList outputScalarList() const; virtual QStringList outputStringList() const; virtual void saveProperties(QXmlStreamWriter &s); protected: CumulativeSumSource(Kst::ObjectStore *store); ~CumulativeSumSource(); friend class Kst::ObjectStore; }; class CumulativeSumPlugin : public QObject, public Kst::DataObjectPluginInterface { Q_OBJECT Q_INTERFACES(Kst::DataObjectPluginInterface) Q_PLUGIN_METADATA(IID "com.kst.DataObjectPluginInterface/2.0") public: virtual ~CumulativeSumPlugin() {} virtual QString pluginName() const; virtual QString pluginDescription() const; virtual DataObjectPluginInterface::PluginTypeID pluginType() const { return Filter; } virtual bool hasConfigWidget() const { return true; } virtual Kst::DataObject *create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const; virtual Kst::DataObjectConfigWidget *configWidget(QSettings *settingsObject) const; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/cumulativesum/cumulativesum.cpp0000644000175000017500000001736212320547027023623 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "cumulativesum.h" #include "objectstore.h" #include "ui_cumulativesumconfig.h" static const QString& VECTOR_IN = "Vector In"; static const QString& SCALAR_IN = "Scale Scalar"; static const QString& VECTOR_OUT = "sum(Y)dX"; class ConfigCumulativeSumPlugin : public Kst::DataObjectConfigWidget, public Ui_CumulativeSumConfig { public: ConfigCumulativeSumPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_CumulativeSumConfig() { _store = 0; setupUi(this); } ~ConfigCumulativeSumPlugin() {} void setObjectStore(Kst::ObjectStore* store) { _store = store; _vector->setObjectStore(store); _scalarStep->setObjectStore(store); } void setupSlots(QWidget* dialog) { if (dialog) { connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); connect(_scalarStep, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified())); } } void setVectorX(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorY(Kst::VectorPtr vector) { setSelectedVector(vector); } void setVectorsLocked(bool locked = true) { _vector->setEnabled(!locked); } Kst::VectorPtr selectedVector() { return _vector->selectedVector(); }; void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); }; Kst::ScalarPtr selectedScalar() { return _scalarStep->selectedScalar(); }; void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarStep->setSelectedScalar(scalar); }; virtual void setupFromObject(Kst::Object* dataObject) { if (CumulativeSumSource* source = static_cast(dataObject)) { setSelectedVector(source->vector()); setSelectedScalar(source->scalarStep()); } } virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); bool validTag = true; // QStringRef av; // av = attrs.value("value"); // if (!av.isNull()) { // _configValue = QVariant(av.toString()).toBool(); // } return validTag; } public slots: virtual void save() { if (_cfg) { _cfg->beginGroup("Cumulative Sum DataObject Plugin"); _cfg->setValue("Input Vector", _vector->selectedVector()->Name()); _cfg->setValue("Input Scalar", _scalarStep->selectedScalar()->Name()); _cfg->endGroup(); } } virtual void load() { if (_cfg && _store) { _cfg->beginGroup("Cumulative Sum DataObject Plugin"); QString vectorName = _cfg->value("Input Vector").toString(); Kst::Object* object = _store->retrieveObject(vectorName); Kst::Vector* vector = static_cast(object); if (vector) { setSelectedVector(vector); } QString scalarName = _cfg->value("Input Scalar").toString(); _scalarStep->setSelectedScalar(scalarName); _cfg->endGroup(); } } private: Kst::ObjectStore *_store; }; CumulativeSumSource::CumulativeSumSource(Kst::ObjectStore *store) : Kst::BasicPlugin(store) { } CumulativeSumSource::~CumulativeSumSource() { } QString CumulativeSumSource::_automaticDescriptiveName() const { if (vector()) { return tr("%1 Integral").arg(vector()->descriptiveName()); } else { return tr("Integral"); } } QString CumulativeSumSource::descriptionTip() const { QString tip; tip = tr("Integral: %1\n dX: %2\n").arg(Name()).arg(scalarStep()->value()); tip += tr("\nInput: %1").arg(vector()->descriptionTip()); return tip; } void CumulativeSumSource::change(Kst::DataObjectConfigWidget *configWidget) { if (ConfigCumulativeSumPlugin* config = static_cast(configWidget)) { setInputVector(VECTOR_IN, config->selectedVector()); setInputScalar(SCALAR_IN, config->selectedScalar()); } } void CumulativeSumSource::setupOutputs() { setOutputVector(VECTOR_OUT, ""); } bool CumulativeSumSource::algorithm() { Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN]; Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN]; Kst::VectorPtr outputVector; // maintain kst file compatibility if the output vector name is changed. if (_outputVectors.contains(VECTOR_OUT)) { outputVector = _outputVectors[VECTOR_OUT]; } else { outputVector = _outputVectors.values().at(0); } /* Memory allocation */ outputVector->resize(inputVector->length(), true); outputVector->value()[0] = inputVector->value()[0]; for (int i = 1; i < inputVector->length(); i++) { outputVector->value()[i] = inputVector->value()[i]*inputScalar->value() + outputVector->value()[i-1]; } return true; } Kst::VectorPtr CumulativeSumSource::vector() const { return _inputVectors[VECTOR_IN]; } Kst::ScalarPtr CumulativeSumSource::scalarStep() const { return _inputScalars[SCALAR_IN]; } QStringList CumulativeSumSource::inputVectorList() const { return QStringList( VECTOR_IN ); } QStringList CumulativeSumSource::inputScalarList() const { return QStringList( SCALAR_IN ); } QStringList CumulativeSumSource::inputStringList() const { return QStringList( /*STRING_IN*/ ); } QStringList CumulativeSumSource::outputVectorList() const { return QStringList( VECTOR_OUT ); } QStringList CumulativeSumSource::outputScalarList() const { return QStringList( /*SCALAR_OUT*/ ); } QStringList CumulativeSumSource::outputStringList() const { return QStringList( /*STRING_OUT*/ ); } void CumulativeSumSource::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); // s.writeAttribute("value", _configValue); } QString CumulativeSumPlugin::pluginName() const { return tr("Cumulative Sum"); } QString CumulativeSumPlugin::pluginDescription() const { return tr("Computes the cumulative sum (integral) of the input vector."); } Kst::DataObject *CumulativeSumPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const { if (ConfigCumulativeSumPlugin* config = static_cast(configWidget)) { CumulativeSumSource* object = store->createObject(); if (setupInputsOutputs) { object->setInputScalar(SCALAR_IN, config->selectedScalar()); object->setupOutputs(); object->setInputVector(VECTOR_IN, config->selectedVector()); } object->setPluginName(pluginName()); object->writeLock(); object->registerChange(); object->unlock(); return object; } return 0; } Kst::DataObjectConfigWidget *CumulativeSumPlugin::configWidget(QSettings *settingsObject) const { ConfigCumulativeSumPlugin *widget = new ConfigCumulativeSumPlugin(settingsObject); return widget; } #ifndef QT5 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, CumulativeSumPlugin) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/plugins/filters/filters.pro0000644000175000017500000000052312277111530017467 0ustar synthsynthinclude($$PWD/../../../config.pri) TEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ despike \ cumulativesum \ differentiation \ cumulativeaverage LibExists(gsl) { SUBDIRS += butterworth_bandpass \ butterworth_bandstop \ butterworth_highpass \ butterworth_lowpass } Kst-2.0.8/src/d2d/0000755000175000017500000000000012320547027012620 5ustar synthsynthKst-2.0.8/src/d2d/d2d.cpp0000644000175000017500000001051712277111530013776 0ustar synthsynth/*************************************************************************** d2d.cpp ------------------- begin : Tue Jan 16 2007 copyright : (C) 2007 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include // atoi #include // hack to make main() a friend of kstdatasource #define protected public #include "datavector.h" #include "datacollection.h" #undef protected #include "dataplugin.h" void Usage() { fprintf(stderr, "usage: d2d in_filename out_filename [-t ]\n"); fprintf(stderr, " [-f ] [-n ] [-s skip [-a]] \n"); fprintf(stderr, " [-x] col1 [[-x] col2 ... [-x] coln]\n"); } static void exitHelper() { Kst::vectorList.clear(); Kst::scalarList.clear(); Kst::dataObjectList.clear(); } int main(int argc, char *argv[]) { atexit(exitHelper); Kst::DataSource::init(); char field_list[40][120], in_filename[180], out_filename[180], out_type[40]; int n_field=0; int start_frame=0, n_frames=-1; bool do_ave = false, do_skip = false; int n_skip = 0; if (argc < 4 || argv[1][0] == '-' || argv[2][0] == '-') { Usage(); return -1; } strncpy(in_filename, argv[1], 180); strncpy(out_filename, argv[2], 180); for (int i = 3; i < argc; i++) { if (argv[i][0] == '-') { if (argv[i][1] == 'f') { i++; start_frame = atoi(argv[i]); } else if (argv[i][1] == 'n') { i++; n_frames = atoi(argv[i]); } else if (argv[i][1] == 's') { i++; n_skip = atoi(argv[i]); if (n_skip>0) do_skip = true; } else if (argv[i][1] == 'a') { do_ave = true; } else if (argv[i][1] == 't') { i++; strncpy(out_type, argv[i], 40); } else { Usage(); } } else { strncpy(field_list[n_field], argv[i], 120); n_field++; } } if (!do_skip) do_ave = false; Kst::DataSourcePtr file = Kst::DataSource::loadSource(in_filename); if (!file || !file->isValid() || file->isEmpty()) { fprintf(stderr, "d2asc error: file %s has no data\n", in_filename); return -2; } if (n_frames < 0) { n_frames = file->frameCount(); } /** make vectors and fill the list **/ QList vlist; for (int i = 0; i < n_field; i++) { if (!file->isValidField(field_list[i])) { fprintf(stderr, "d2asc error: field %s in file %s is not valid\n", field_list[i], in_filename); return -3; } Kst::DataVectorPtr v = new Kst::DataVector(file, field_list[i], Kst::ObjectTag(field_list[i], file->tag()), start_frame, n_frames, n_skip, n_skip>0, do_ave); vlist.append(v); } /* find NS */ int NS=0; for (int i = 0; i < n_field; i++) { while (vlist.at(i)->update(-1) != Kst::Object::NO_CHANGE) ; // read vector if (vlist.at(i)->length() > NS) NS = vlist.at(i)->length(); } Kst::DataSourcePtr out_file; //FIXME #if 0 KService::List sl = KServiceTypeTrader::self()->query("Kst Data Source"); for (KService::List::ConstIterator it = sl.begin(); it != sl.end(); ++it) { if ((*it)->library() == out_type) { KstSharedPtr p = new KST::DataSourcePlugin(*it); out_file = p->create(kConfigObject, out_filename, QString::null); break; } } #endif if (out_file) { for (int i = 0; i < n_field; i++) { double *data = vlist.at(i)->value(); int n = out_file->writeField(data, field_list[i], start_frame, n_frames); qDebug() << "wrote" << n << "samples for field" << field_list[i]; } } } /* vim: sw=2 ts=2 et */ Kst-2.0.8/src/d2d/d2d.pro0000644000175000017500000000105112277111530014005 0ustar synthsynthinclude($$PWD/../../kst.pri) TEMPLATE = app TARGET = $$kstlib(d2d) DESTDIR = $$OUTPUT_DIR/bin CONFIG -= precompile_header INCLUDEPATH += \ tmp \ $$TOPLEVELDIR/src/libkst \ $$TOPLEVELDIR/src/libkstmath \ $$TOPLEVELDIR/src/widgets \ $$TOPLEVELDIR/src/libkstapp \ $$OUTPUT_DIR/src/kst/tmp LIBS += \ -L$$OUTPUT_DIR/lib \ -L$$OUTPUT_DIR/plugin \ -l$$kstlib(kst2app) \ -l$$kstlib(kst2widgets) \ -l$$kstlib(kst2math) \ -l$$kstlib(kst2lib) SOURCES += \ d2d.cpp QMAKE_RPATHDIR += $$OUTPUT_DIR/lib $$OUTPUT_DIR/plugin Kst-2.0.8/src/d2d/CMakeLists.txt0000644000175000017500000000023712320547027015362 0ustar synthsynthkst_init(d2d "") kst_files_find(src/d2d) kst_include_directories(core math) kst_add_executable() kst_link(${libcore} ${libmath}) kst_install_executable() Kst-2.0.8/src/libkstmath/0000755000175000017500000000000012362705136014314 5ustar synthsynthKst-2.0.8/src/libkstmath/fftsg_h.c0000644000175000017500000025754512277111530016114 0ustar synthsynth/* Copyright(C) 1996-2001 Takuya OOURA email: ooura@mmm.t.u-tokyo.ac.jp download: http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html You may use, copy, modify this code for any purpose and without fee. */ /* Fast Fourier/Cosine/Sine Transform dimension :one data length :power of 2 decimation :frequency radix :split-radix data :inplace table :not use functions cdft: Complex Discrete Fourier Transform rdft: Real Discrete Fourier Transform ddct: Discrete Cosine Transform ddst: Discrete Sine Transform dfct: Cosine Transform of RDFT (Real Symmetric DFT) dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) function prototypes void cdft(int, int, double *); void rdft(int, int, double *); void ddct(int, int, double *); void ddst(int, int, double *); void dfct(int, double *); void dfst(int, double *); macro definitions USE_CDFT_PTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=8192 CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536 USE_CDFT_WINTHREADS : default=not defined CDFT_THREADS_BEGIN_N : must be >= 512, default=32768 CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288 -------- Complex DFT (Discrete Fourier Transform) -------- [definition] X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k cdft(2*n, 1, a); cdft(2*n, -1, a); [parameters] 2*n :data length (int) n >= 1, n = power of 2 a[0...2*n-1] :input/output data (double *) input data a[2*j] = Re(x[j]), a[2*j+1] = Im(x[j]), 0<=j RDFT R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0 IRDFT (excluding scale) a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k rdft(n, 1, a); rdft(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[2*k] = R[k], 0<=k input data a[2*j] = R[j], 0<=j IDCT (excluding scale) C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k DCT C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k ddct(n, 1, a); ddct(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = C[k], 0<=k IDST (excluding scale) S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k DST S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0 ddst(n, 1, a); ddst(n, -1, a); [parameters] n :data length (int) n >= 2, n = power of 2 a[0...n-1] :input/output data (double *) input data a[j] = A[j], 0 output data a[k] = S[k], 0= 2, n = power of 2 a[0...n] :input/output data (double *) output data a[k] = C[k], 0<=k<=n [remark] Inverse of a[0] *= 0.5; a[n] *= 0.5; dfct(n, a); is a[0] *= 0.5; a[n] *= 0.5; dfct(n, a); for (j = 0; j <= n; j++) { a[j] *= 2.0 / n; } . -------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- [definition] S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0= 2, n = power of 2 a[0...n-1] :input/output data (double *) output data a[k] = S[k], 0= 0) { cftfsub(n, a); } else { cftbsub(n, a); } } void rdft(int n, int isgn, double *a) { double xi; if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xi = a[0] - a[1]; a[0] += a[1]; a[1] = xi; } else { a[1] = 0.5 * (a[0] - a[1]); a[0] -= a[1]; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } } static void ddct(int n, int isgn, double *a) { int j; double xr; if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = a[j] - a[j - 1]; a[j] += a[j - 1]; } a[1] = a[0] - xr; a[0] += xr; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } if (n > 4) { dctsub(n, a); } else { dctsub4(n, a); } if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = a[j] - a[j + 1]; a[j] += a[j + 1]; } a[n - 1] = xr; } } static void ddst(int n, int isgn, double *a) { int j; double xr; if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = -a[j] - a[j - 1]; a[j] -= a[j - 1]; } a[1] = a[0] + xr; a[0] -= xr; if (n > 4) { rftbsub(n, a); cftbsub(n, a); } else if (n == 4) { cftbsub(n, a); } } if (n > 4) { dstsub(n, a); } else { dstsub4(n, a); } if (isgn >= 0) { if (n > 4) { cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = -a[j] - a[j + 1]; a[j] -= a[j + 1]; } a[n - 1] = -xr; } } void dfct(int n, double *a) { int j, k, m, mh; double xr, xi, yr, yi, an; m = n >> 1; for (j = 0; j < m; j++) { k = n - j; xr = a[j] + a[k]; a[j] -= a[k]; a[k] = xr; } an = a[n]; while (m >= 2) { ddct(m, 1, a); if (m > 2) { bitrv1(m, a); } mh = m >> 1; xi = a[m]; a[m] = a[0]; a[0] = an - xi; an += xi; for (j = 1; j < mh; j++) { k = m - j; xr = a[m + k]; xi = a[m + j]; yr = a[j]; yi = a[k]; a[m + j] = yr; a[m + k] = yi; a[j] = xr - xi; a[k] = xr + xi; } xr = a[mh]; a[mh] = a[m + mh]; a[m + mh] = xr; m = mh; } xi = a[1]; a[1] = a[0]; a[0] = an + xi; a[n] = an - xi; if (n > 2) { bitrv1(n, a); } } void dfst(int n, double *a) { int j, k, m, mh; double xr, xi, yr, yi; m = n >> 1; for (j = 1; j < m; j++) { k = n - j; xr = a[j] - a[k]; a[j] += a[k]; a[k] = xr; } a[0] = a[m]; while (m >= 2) { ddst(m, 1, a); if (m > 2) { bitrv1(m, a); } mh = m >> 1; for (j = 1; j < mh; j++) { k = m - j; xr = a[m + k]; xi = a[m + j]; yr = a[j]; yi = a[k]; a[m + j] = yr; a[m + k] = yi; a[j] = xr + xi; a[k] = xr - xi; } a[m] = a[0]; a[0] = a[m + mh]; a[m + mh] = a[mh]; m = mh; } a[1] = a[0]; a[0] = 0; if (n > 2) { bitrv1(n, a); } } /* -------- child routines -------- */ #include #ifndef M_PI_2 #define M_PI_2 1.570796326794896619231321691639751442098584699687 #endif #ifndef WR5000 /* cos(M_PI_2*0.5000) */ #define WR5000 0.707106781186547524400844362104849039284835937688 #endif #ifndef WR2500 /* cos(M_PI_2*0.2500) */ #define WR2500 0.923879532511286756128183189396788286822416625863 #endif #ifndef WI2500 /* sin(M_PI_2*0.2500) */ #define WI2500 0.382683432365089771728459984030398866761344562485 #endif #ifndef WR1250 /* cos(M_PI_2*0.1250) */ #define WR1250 0.980785280403230449126182236134239036973933730893 #endif #ifndef WI1250 /* sin(M_PI_2*0.1250) */ #define WI1250 0.195090322016128267848284868477022240927691617751 #endif #ifndef WR3750 /* cos(M_PI_2*0.3750) */ #define WR3750 0.831469612302545237078788377617905756738560811987 #endif #ifndef WI3750 /* sin(M_PI_2*0.3750) */ #define WI3750 0.555570233019602224742830813948532874374937190754 #endif #ifdef USE_CDFT_PTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 8192 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 65536 #endif #include #include #include #define cdft_thread_t pthread_t #define cdft_thread_create(thp,func,argp) { \ if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ if (pthread_join(th, NULL) != 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #endif /* USE_CDFT_PTHREADS */ #ifdef USE_CDFT_WINTHREADS #define USE_CDFT_THREADS #ifndef CDFT_THREADS_BEGIN_N #define CDFT_THREADS_BEGIN_N 32768 #endif #ifndef CDFT_4THREADS_BEGIN_N #define CDFT_4THREADS_BEGIN_N 524288 #endif #include #include #include #define cdft_thread_t HANDLE #define cdft_thread_create(thp,func,argp) { \ DWORD thid; \ *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ if (*(thp) == 0) { \ fprintf(stderr, "cdft thread error\n"); \ exit(1); \ } \ } #define cdft_thread_wait(th) { \ WaitForSingleObject(th, INFINITE); \ CloseHandle(th); \ } #endif /* USE_CDFT_WINTHREADS */ #ifndef CDFT_LOOP_DIV /* control of the CDFT's speed & tolerance */ #define CDFT_LOOP_DIV 32 #endif #ifndef RDFT_LOOP_DIV /* control of the RDFT's speed & tolerance */ #define RDFT_LOOP_DIV 64 #endif #ifndef DCST_LOOP_DIV /* control of the DCT,DST's speed & tolerance */ #define DCST_LOOP_DIV 64 #endif static void cftfsub(int n, double *a) { if (n > 8) { if (n > 32) { cftmdl1(n, a); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a); } else if (n > 128) { cftleaf(n, 1, a); } else { cftfx41(n, a); } bitrv2(n, a); } else if (n == 32) { cftf161(a); bitrv216(a); } else { cftf081(a); bitrv208(a); } } else if (n == 8) { cftf040(a); } else if (n == 4) { cftx020(a); } } static void cftbsub(int n, double *a) { if (n > 8) { if (n > 32) { cftb1st(n, a); #ifdef USE_CDFT_THREADS if (n > CDFT_THREADS_BEGIN_N) { cftrec4_th(n, a); } else #endif /* USE_CDFT_THREADS */ if (n > 512) { cftrec4(n, a); } else if (n > 128) { cftleaf(n, 1, a); } else { cftfx41(n, a); } bitrv2conj(n, a); } else if (n == 32) { cftf161(a); bitrv216neg(a); } else { cftf081(a); bitrv208neg(a); } } else if (n == 8) { cftb040(a); } else if (n == 4) { cftx020(a); } } void bitrv2(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double xr, xi, yr, yi; m = 4; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; if (l == 8) { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= 2; k1 -= nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh + 2; k1 += nh + 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh - m; k1 += 2 * m - 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } else { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = a[_j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } } void bitrv2conj(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double xr, xi, yr, yi; m = 4; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; if (l == 8) { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; _j1 += m; k1 += 2 * m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= 2; k1 -= nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh + 2; k1 += nh + 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh - m; k1 += 2 * m - 2; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } else { _j0 = 0; for (k0 = 0; k0 < m; k0 += 4) { k = k0; for (j = _j0; j < _j0 + k0; j += 4) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; _j1 = j + m; k1 = k + m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += nh; k1 += 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += 2; k1 += nh; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 += m; k1 += m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= nh; k1 -= 2; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; _j1 -= m; k1 -= m; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 2; k1 += nh; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; _j1 += m; k1 += m; a[_j1 - 1] = -a[_j1 - 1]; xr = a[_j1]; xi = -a[_j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[_j1] = yr; a[_j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; a[k1 + 3] = -a[k1 + 3]; for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); } } } void bitrv216(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; a[2] = x8r; a[3] = x8i; a[4] = x4r; a[5] = x4i; a[6] = x12r; a[7] = x12i; a[8] = x2r; a[9] = x2i; a[10] = x10r; a[11] = x10i; a[14] = x14r; a[15] = x14i; a[16] = x1r; a[17] = x1i; a[20] = x5r; a[21] = x5i; a[22] = x13r; a[23] = x13i; a[24] = x3r; a[25] = x3i; a[26] = x11r; a[27] = x11i; a[28] = x7r; a[29] = x7i; } void bitrv216neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i, x15r, x15i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; x8r = a[16]; x8i = a[17]; x9r = a[18]; x9i = a[19]; x10r = a[20]; x10i = a[21]; x11r = a[22]; x11i = a[23]; x12r = a[24]; x12i = a[25]; x13r = a[26]; x13i = a[27]; x14r = a[28]; x14i = a[29]; x15r = a[30]; x15i = a[31]; a[2] = x15r; a[3] = x15i; a[4] = x7r; a[5] = x7i; a[6] = x11r; a[7] = x11i; a[8] = x3r; a[9] = x3i; a[10] = x13r; a[11] = x13i; a[12] = x5r; a[13] = x5i; a[14] = x9r; a[15] = x9i; a[16] = x1r; a[17] = x1i; a[18] = x14r; a[19] = x14i; a[20] = x6r; a[21] = x6i; a[22] = x10r; a[23] = x10i; a[24] = x2r; a[25] = x2i; a[26] = x12r; a[27] = x12i; a[28] = x4r; a[29] = x4i; a[30] = x8r; a[31] = x8i; } void bitrv208(double *a) { double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; x1r = a[2]; x1i = a[3]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x6r = a[12]; x6i = a[13]; a[2] = x4r; a[3] = x4i; a[6] = x6r; a[7] = x6i; a[8] = x1r; a[9] = x1i; a[12] = x3r; a[13] = x3i; } void bitrv208neg(double *a) { double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i; x1r = a[2]; x1i = a[3]; x2r = a[4]; x2i = a[5]; x3r = a[6]; x3i = a[7]; x4r = a[8]; x4i = a[9]; x5r = a[10]; x5i = a[11]; x6r = a[12]; x6i = a[13]; x7r = a[14]; x7i = a[15]; a[2] = x7r; a[3] = x7i; a[4] = x3r; a[5] = x3i; a[6] = x5r; a[7] = x5i; a[8] = x1r; a[9] = x1i; a[10] = x6r; a[11] = x6i; a[12] = x2r; a[13] = x2i; a[14] = x4r; a[15] = x4i; } void bitrv1(int n, double *a) { int _j0, k0, _j1, k1, l, m, i, j, k, nh; double x; nh = n >> 1; x = a[1]; a[1] = a[nh]; a[nh] = x; m = 2; for (l = n >> 2; l > 2; l >>= 2) { m <<= 1; } if (l == 2) { _j1 = m + 1; k1 = m + nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); k = k0; for (j = _j0; j < _j0 + k0; j += 2) { x = a[j]; a[j] = a[k]; a[k] = x; _j1 = j + m; k1 = k + m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += nh; k1++; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= m; k1 -= m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1++; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += m; k1 += m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= nh; k1--; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= m; k1 -= m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 1; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 += m; k1 += m; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; } } else { _j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = nh >> 1; i > (_j0 ^= i); i >>= 1); k = k0; for (j = _j0; j < _j0 + k0; j += 2) { x = a[j]; a[j] = a[k]; a[k] = x; _j1 = j + nh; k1 = k + 1; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1++; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; _j1 -= nh; k1--; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; for (i = nh >> 1; i > (k ^= i); i >>= 1); } k1 = _j0 + k0; _j1 = k1 + 1; k1 += nh; x = a[_j1]; a[_j1] = a[k1]; a[k1] = x; } } } void cftb1st(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; mh = n >> 3; m = 2 * mh; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = -a[1] - a[j2 + 1]; x1r = a[0] - a[j2]; x1i = -a[1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; a[j2] = x1r + x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r - x3i; a[j3 + 1] = x1i - x3r; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; ew = M_PI_2 / m; w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wd1r -= ss1 * wk1i; wd1i += ss1 * wk1r; wd3r -= ss3 * wk3i; wd3i += ss3 * wk3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = -a[j + 1] - a[j2 + 1]; x1r = a[j] - a[j2]; x1i = -a[j + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = a[j + 2] + a[j2 + 2]; x0i = -a[j + 3] - a[j2 + 3]; x1r = a[j + 2] - a[j2 + 2]; x1i = -a[j + 3] + a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[j + 2] = x0r + x2r; a[j + 3] = x0i - x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] + a[j2]; x0i = -a[_j0 + 1] - a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = -a[_j0 + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = -a[_j0 - 1] - a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = -a[_j0 - 1] + a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i - x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; wk1r -= ss1 * wd1i; wk1i += ss1 * wd1r; wk3r -= ss3 * wd3i; wk3i += ss3 * wd3r; } if (i0 == mh - 4) { break; } wd1r = cos(ew * i0); wd1i = sin(ew * i0); wd3i = 4 * wd1i * wd1r; wd3r = wd1r - wd3i * wd1i; wd3i = wd1i - wd3i * wd1r; wk1r = w1r * wd1r - w1i * wd1i; wk1i = w1r * wd1i + w1i * wd1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; i = i0; } wd1r = WR5000; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = -a[_j0 - 1] - a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = -a[_j0 - 1] + a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i - x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[_j0] + a[j2]; x0i = -a[_j0 + 1] - a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = -a[_j0 + 1] + a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i - x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2] = wd1r * (x0r - x0i); a[j2 + 1] = wd1r * (x0i + x0r); x0r = x1r - x3i; x0i = x1i - x3r; a[j3] = -wd1r * (x0r + x0i); a[j3 + 1] = -wd1r * (x0i - x0r); x0r = a[_j0 + 2] + a[j2 + 2]; x0i = -a[_j0 + 3] - a[j2 + 3]; x1r = a[_j0 + 2] - a[j2 + 2]; x1i = -a[_j0 + 3] + a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[_j0 + 2] = x0r + x2r; a[_j0 + 3] = x0i - x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i + x2i; x0r = x1r + x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r - x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } #ifdef USE_CDFT_THREADS struct cdft_arg_st { int n0; int n; double *a; }; typedef struct cdft_arg_st cdft_arg_t; void cftrec4_th(int n, double *a) { void *cftrec1_th(void *p); void *cftrec2_th(void *p); int i, idiv4, m, nthread; cdft_thread_t th[4]; cdft_arg_t ag[4]; nthread = 2; idiv4 = 0; m = n >> 1; if (n > CDFT_4THREADS_BEGIN_N) { nthread = 4; idiv4 = 1; m >>= 1; } for (i = 0; i < nthread; i++) { ag[i].n0 = n; ag[i].n = m; ag[i].a = &a[i * m]; if (i != idiv4) { cdft_thread_create(&th[i], cftrec1_th, &ag[i]); } else { cdft_thread_create(&th[i], cftrec2_th, &ag[i]); } } for (i = 0; i < nthread; i++) { cdft_thread_wait(th[i]); } } void *cftrec1_th(void *p) { int cfttree(int n, int j, int k, double *a); void cftleaf(int n, int isplt, double *a); void cftmdl1(int n, double *a); int isplt, j, k, m, n, n0; double *a; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; m = n0; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m]); } cftleaf(m, 1, &a[n - m]); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } return (void *) 0; } void *cftrec2_th(void *p) { int cfttree(int n, int j, int k, double *a); void cftleaf(int n, int isplt, double *a); void cftmdl2(int n, double *a); int isplt, j, k, m, n, n0; double *a; n0 = ((cdft_arg_t *) p)->n0; n = ((cdft_arg_t *) p)->n; a = ((cdft_arg_t *) p)->a; k = 1; m = n0; while (m > 512) { m >>= 2; k <<= 2; cftmdl2(m, &a[n - m]); } cftleaf(m, 0, &a[n - m]); k >>= 1; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } return (void *) 0; } #endif /* USE_CDFT_THREADS */ void cftrec4(int n, double *a) { int isplt, j, k, m; m = n; while (m > 512) { m >>= 2; cftmdl1(m, &a[n - m]); } cftleaf(m, 1, &a[n - m]); k = 0; for (j = n - m; j > 0; j -= m) { k++; isplt = cfttree(m, j, k, a); cftleaf(m, isplt, &a[j - m]); } } int cfttree(int n, int j, int k, double *a) { int i, isplt, m; if ((k & 3) != 0) { isplt = k & 1; if (isplt != 0) { cftmdl1(n, &a[j - n]); } else { cftmdl2(n, &a[j - n]); } } else { m = n; for (i = k; (i & 3) == 0; i >>= 2) { m <<= 2; } isplt = i & 1; if (isplt != 0) { while (m > 128) { cftmdl1(m, &a[j - m]); m >>= 2; } } else { while (m > 128) { cftmdl2(m, &a[j - m]); m >>= 2; } } } return isplt; } void cftleaf(int n, int isplt, double *a) { if (n == 512) { cftmdl1(128, a); cftf161(a); cftf162(&a[32]); cftf161(&a[64]); cftf161(&a[96]); cftmdl2(128, &a[128]); cftf161(&a[128]); cftf162(&a[160]); cftf161(&a[192]); cftf162(&a[224]); cftmdl1(128, &a[256]); cftf161(&a[256]); cftf162(&a[288]); cftf161(&a[320]); cftf161(&a[352]); if (isplt != 0) { cftmdl1(128, &a[384]); cftf161(&a[480]); } else { cftmdl2(128, &a[384]); cftf162(&a[480]); } cftf161(&a[384]); cftf162(&a[416]); cftf161(&a[448]); } else { cftmdl1(64, a); cftf081(a); cftf082(&a[16]); cftf081(&a[32]); cftf081(&a[48]); cftmdl2(64, &a[64]); cftf081(&a[64]); cftf082(&a[80]); cftf081(&a[96]); cftf082(&a[112]); cftmdl1(64, &a[128]); cftf081(&a[128]); cftf082(&a[144]); cftf081(&a[160]); cftf081(&a[176]); if (isplt != 0) { cftmdl1(64, &a[192]); cftf081(&a[240]); } else { cftmdl2(64, &a[192]); cftf082(&a[240]); } cftf081(&a[192]); cftf082(&a[208]); cftf081(&a[224]); } } void cftmdl1(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; mh = n >> 3; m = 2 * mh; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] + a[j2]; x0i = a[1] + a[j2 + 1]; x1r = a[0] - a[j2]; x1i = a[1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; a[j2] = x1r - x3i; a[j2 + 1] = x1i + x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i - x3r; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; ew = M_PI_2 / m; w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wd1r -= ss1 * wk1i; wd1i += ss1 * wk1r; wd3r -= ss3 * wk3i; wd3i += ss3 * wk3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] + a[j2]; x0i = a[j + 1] + a[j2 + 1]; x1r = a[j] - a[j2]; x1i = a[j + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1r * x0r - wk1i * x0i; a[j2 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r + wk3i * x0i; a[j3 + 1] = wk3r * x0i - wk3i * x0r; x0r = a[j + 2] + a[j2 + 2]; x0i = a[j + 3] + a[j2 + 3]; x1r = a[j + 2] - a[j2 + 2]; x1i = a[j + 3] - a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[j + 2] = x0r + x2r; a[j + 3] = x0i + x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 + 2] = wd1r * x0r - wd1i * x0i; a[j2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 + 2] = wd3r * x0r + wd3i * x0i; a[j3 + 3] = wd3r * x0i - wd3i * x0r; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] + a[j2]; x0i = a[_j0 + 1] + a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = a[_j0 + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wk1i * x0r - wk1r * x0i; a[j2 + 1] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3i * x0r + wk3r * x0i; a[j3 + 1] = wk3i * x0i - wk3r * x0r; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = a[_j0 - 1] + a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = a[_j0 - 1] - a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i + x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 - 2] = wd1i * x0r - wd1r * x0i; a[j2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 - 2] = wd3i * x0r + wd3r * x0i; a[j3 - 1] = wd3i * x0i - wd3r * x0r; wk1r -= ss1 * wd1i; wk1i += ss1 * wd1r; wk3r -= ss3 * wd3i; wk3i += ss3 * wd3r; } if (i0 == mh - 4) { break; } wd1r = cos(ew * i0); wd1i = sin(ew * i0); wd3i = 4 * wd1i * wd1r; wd3r = wd1r - wd3i * wd1i; wd3i = wd1i - wd3i * wd1r; wk1r = w1r * wd1r - w1i * wd1i; wk1i = w1r * wd1i + w1i * wd1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; i = i0; } wd1r = WR5000; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] + a[j2 - 2]; x0i = a[_j0 - 1] + a[j2 - 1]; x1r = a[_j0 - 2] - a[j2 - 2]; x1i = a[_j0 - 1] - a[j2 - 1]; x2r = a[_j1 - 2] + a[j3 - 2]; x2i = a[_j1 - 1] + a[j3 - 1]; x3r = a[_j1 - 2] - a[j3 - 2]; x3i = a[_j1 - 1] - a[j3 - 1]; a[_j0 - 2] = x0r + x2r; a[_j0 - 1] = x0i + x2i; a[_j1 - 2] = x0r - x2r; a[_j1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 - 2] = wk1r * x0r - wk1i * x0i; a[j2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 - 2] = wk3r * x0r + wk3i * x0i; a[j3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[_j0] + a[j2]; x0i = a[_j0 + 1] + a[j2 + 1]; x1r = a[_j0] - a[j2]; x1i = a[_j0 + 1] - a[j2 + 1]; x2r = a[_j1] + a[j3]; x2i = a[_j1 + 1] + a[j3 + 1]; x3r = a[_j1] - a[j3]; x3i = a[_j1 + 1] - a[j3 + 1]; a[_j0] = x0r + x2r; a[_j0 + 1] = x0i + x2i; a[_j1] = x0r - x2r; a[_j1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2] = wd1r * (x0r - x0i); a[j2 + 1] = wd1r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = -wd1r * (x0r + x0i); a[j3 + 1] = -wd1r * (x0i - x0r); x0r = a[_j0 + 2] + a[j2 + 2]; x0i = a[_j0 + 3] + a[j2 + 3]; x1r = a[_j0 + 2] - a[j2 + 2]; x1i = a[_j0 + 3] - a[j2 + 3]; x2r = a[_j1 + 2] + a[j3 + 2]; x2i = a[_j1 + 3] + a[j3 + 3]; x3r = a[_j1 + 2] - a[j3 + 2]; x3i = a[_j1 + 3] - a[j3 + 3]; a[_j0 + 2] = x0r + x2r; a[_j0 + 3] = x0i + x2i; a[_j1 + 2] = x0r - x2r; a[_j1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[j2 + 2] = wk1i * x0r - wk1r * x0i; a[j2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3 + 2] = wk3i * x0r + wk3r * x0i; a[j3 + 3] = wk3i * x0i - wk3r * x0r; } void cftmdl2(int n, double *a) { int i, i0, j, _j0, _j1, j2, j3, m, mh; double ew, w1r, w1i, wn4r, wk1r, wk1i, wk3r, wk3i, wl1r, wl1i, wl3r, wl3i, wd1r, wd1i, wd3r, wd3i, we1r, we1i, we3r, we3i, ss1, ss3; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; mh = n >> 3; m = 2 * mh; wn4r = WR5000; _j1 = m; j2 = _j1 + m; j3 = j2 + m; x0r = a[0] - a[j2 + 1]; x0i = a[1] + a[j2]; x1r = a[0] + a[j2 + 1]; x1i = a[1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wn4r * (x2r - x2i); y0i = wn4r * (x2i + x2r); a[0] = x0r + y0r; a[1] = x0i + y0i; a[_j1] = x0r - y0r; a[_j1 + 1] = x0i - y0i; y0r = wn4r * (x3r - x3i); y0i = wn4r * (x3i + x3r); a[j2] = x1r - y0i; a[j2 + 1] = x1i + y0r; a[j3] = x1r + y0i; a[j3 + 1] = x1i - y0r; wl1r = 1; wl1i = 0; wl3r = 1; wl3i = 0; we1r = wn4r; we1i = wn4r; we3r = -wn4r; we3i = -wn4r; ew = M_PI_2 / (2 * m); w1r = cos(2 * ew); w1i = sin(2 * ew); wk1r = w1r; wk1i = w1i; wd1r = wn4r * (w1r - w1i); wd1i = wn4r * (w1i + w1r); ss1 = 2 * w1i; wk3i = 2 * ss1 * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; ss3 = 2 * wk3i; wd3r = -wn4r * (wk3r - wk3i); wd3i = -wn4r * (wk3i + wk3r); i = 0; for (;;) { i0 = i + 4 * CDFT_LOOP_DIV; if (i0 > mh - 4) { i0 = mh - 4; } for (j = i + 2; j < i0; j += 4) { wl1r -= ss1 * wk1i; wl1i += ss1 * wk1r; wl3r -= ss3 * wk3i; wl3i += ss3 * wk3r; we1r -= ss1 * wd1i; we1i += ss1 * wd1r; we3r -= ss3 * wd3i; we3i += ss3 * wd3r; _j1 = j + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[j] - a[j2 + 1]; x0i = a[j + 1] + a[j2]; x1r = a[j] + a[j2 + 1]; x1i = a[j + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wd1r * x2r - wd1i * x2i; y2i = wd1r * x2i + wd1i * x2r; a[j] = y0r + y2r; a[j + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wk3r * x1r + wk3i * x1i; y0i = wk3r * x1i - wk3i * x1r; y2r = wd3r * x3r + wd3i * x3i; y2i = wd3r * x3i - wd3i * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; x0r = a[j + 2] - a[j2 + 3]; x0i = a[j + 3] + a[j2 + 2]; x1r = a[j + 2] + a[j2 + 3]; x1i = a[j + 3] - a[j2 + 2]; x2r = a[_j1 + 2] - a[j3 + 3]; x2i = a[_j1 + 3] + a[j3 + 2]; x3r = a[_j1 + 2] + a[j3 + 3]; x3i = a[_j1 + 3] - a[j3 + 2]; y0r = wl1r * x0r - wl1i * x0i; y0i = wl1r * x0i + wl1i * x0r; y2r = we1r * x2r - we1i * x2i; y2i = we1r * x2i + we1i * x2r; a[j + 2] = y0r + y2r; a[j + 3] = y0i + y2i; a[_j1 + 2] = y0r - y2r; a[_j1 + 3] = y0i - y2i; y0r = wl3r * x1r + wl3i * x1i; y0i = wl3r * x1i - wl3i * x1r; y2r = we3r * x3r + we3i * x3i; y2i = we3r * x3i - we3i * x3r; a[j2 + 2] = y0r + y2r; a[j2 + 3] = y0i + y2i; a[j3 + 2] = y0r - y2r; a[j3 + 3] = y0i - y2i; _j0 = m - j; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0] - a[j2 + 1]; x0i = a[_j0 + 1] + a[j2]; x1r = a[_j0] + a[j2 + 1]; x1i = a[_j0 + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wd1i * x0r - wd1r * x0i; y0i = wd1i * x0i + wd1r * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[_j0] = y0r + y2r; a[_j0 + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wd3i * x1r + wd3r * x1i; y0i = wd3i * x1i - wd3r * x1r; y2r = wk3i * x3r + wk3r * x3i; y2i = wk3i * x3i - wk3r * x3r; a[j2] = y0r + y2r; a[j2 + 1] = y0i + y2i; a[j3] = y0r - y2r; a[j3 + 1] = y0i - y2i; x0r = a[_j0 - 2] - a[j2 - 1]; x0i = a[_j0 - 1] + a[j2 - 2]; x1r = a[_j0 - 2] + a[j2 - 1]; x1i = a[_j0 - 1] - a[j2 - 2]; x2r = a[_j1 - 2] - a[j3 - 1]; x2i = a[_j1 - 1] + a[j3 - 2]; x3r = a[_j1 - 2] + a[j3 - 1]; x3i = a[_j1 - 1] - a[j3 - 2]; y0r = we1i * x0r - we1r * x0i; y0i = we1i * x0i + we1r * x0r; y2r = wl1i * x2r - wl1r * x2i; y2i = wl1i * x2i + wl1r * x2r; a[_j0 - 2] = y0r + y2r; a[_j0 - 1] = y0i + y2i; a[_j1 - 2] = y0r - y2r; a[_j1 - 1] = y0i - y2i; y0r = we3i * x1r + we3r * x1i; y0i = we3i * x1i - we3r * x1r; y2r = wl3i * x3r + wl3r * x3i; y2i = wl3i * x3i - wl3r * x3r; a[j2 - 2] = y0r + y2r; a[j2 - 1] = y0i + y2i; a[j3 - 2] = y0r - y2r; a[j3 - 1] = y0i - y2i; wk1r -= ss1 * wl1i; wk1i += ss1 * wl1r; wk3r -= ss3 * wl3i; wk3i += ss3 * wl3r; wd1r -= ss1 * we1i; wd1i += ss1 * we1r; wd3r -= ss3 * we3i; wd3i += ss3 * we3r; } if (i0 == mh - 4) { break; } wl1r = cos(ew * i0); wl1i = sin(ew * i0); wl3i = 4 * wl1i * wl1r; wl3r = wl1r - wl3i * wl1i; wl3i = wl1i - wl3i * wl1r; we1r = wn4r * (wl1r - wl1i); we1i = wn4r * (wl1i + wl1r); we3r = -wn4r * (wl3r - wl3i); we3i = -wn4r * (wl3i + wl3r); wk1r = w1r * wl1r - w1i * wl1i; wk1i = w1r * wl1i + w1i * wl1r; wk3i = 4 * wk1i * wk1r; wk3r = wk1r - wk3i * wk1i; wk3i = wk1i - wk3i * wk1r; wd1r = wn4r * (wk1r - wk1i); wd1i = wn4r * (wk1i + wk1r); wd3r = -wn4r * (wk3r - wk3i); wd3i = -wn4r * (wk3i + wk3r); i = i0; } wl1r = WR2500; wl1i = WI2500; _j0 = mh; _j1 = _j0 + m; j2 = _j1 + m; j3 = j2 + m; x0r = a[_j0 - 2] - a[j2 - 1]; x0i = a[_j0 - 1] + a[j2 - 2]; x1r = a[_j0 - 2] + a[j2 - 1]; x1i = a[_j0 - 1] - a[j2 - 2]; x2r = a[_j1 - 2] - a[j3 - 1]; x2i = a[_j1 - 1] + a[j3 - 2]; x3r = a[_j1 - 2] + a[j3 - 1]; x3i = a[_j1 - 1] - a[j3 - 2]; y0r = wk1r * x0r - wk1i * x0i; y0i = wk1r * x0i + wk1i * x0r; y2r = wd1r * x2r - wd1i * x2i; y2i = wd1r * x2i + wd1i * x2r; a[_j0 - 2] = y0r + y2r; a[_j0 - 1] = y0i + y2i; a[_j1 - 2] = y0r - y2r; a[_j1 - 1] = y0i - y2i; y0r = wk3r * x1r + wk3i * x1i; y0i = wk3r * x1i - wk3i * x1r; y2r = wd3r * x3r + wd3i * x3i; y2i = wd3r * x3i - wd3i * x3r; a[j2 - 2] = y0r + y2r; a[j2 - 1] = y0i + y2i; a[j3 - 2] = y0r - y2r; a[j3 - 1] = y0i - y2i; x0r = a[_j0] - a[j2 + 1]; x0i = a[_j0 + 1] + a[j2]; x1r = a[_j0] + a[j2 + 1]; x1i = a[_j0 + 1] - a[j2]; x2r = a[_j1] - a[j3 + 1]; x2i = a[_j1 + 1] + a[j3]; x3r = a[_j1] + a[j3 + 1]; x3i = a[_j1 + 1] - a[j3]; y0r = wl1r * x0r - wl1i * x0i; y0i = wl1r * x0i + wl1i * x0r; y2r = wl1i * x2r - wl1r * x2i; y2i = wl1i * x2i + wl1r * x2r; a[_j0] = y0r + y2r; a[_j0 + 1] = y0i + y2i; a[_j1] = y0r - y2r; a[_j1 + 1] = y0i - y2i; y0r = wl1i * x1r - wl1r * x1i; y0i = wl1i * x1i + wl1r * x1r; y2r = wl1r * x3r - wl1i * x3i; y2i = wl1r * x3i + wl1i * x3r; a[j2] = y0r - y2r; a[j2 + 1] = y0i - y2i; a[j3] = y0r + y2r; a[j3 + 1] = y0i + y2i; x0r = a[_j0 + 2] - a[j2 + 3]; x0i = a[_j0 + 3] + a[j2 + 2]; x1r = a[_j0 + 2] + a[j2 + 3]; x1i = a[_j0 + 3] - a[j2 + 2]; x2r = a[_j1 + 2] - a[j3 + 3]; x2i = a[_j1 + 3] + a[j3 + 2]; x3r = a[_j1 + 2] + a[j3 + 3]; x3i = a[_j1 + 3] - a[j3 + 2]; y0r = wd1i * x0r - wd1r * x0i; y0i = wd1i * x0i + wd1r * x0r; y2r = wk1i * x2r - wk1r * x2i; y2i = wk1i * x2i + wk1r * x2r; a[_j0 + 2] = y0r + y2r; a[_j0 + 3] = y0i + y2i; a[_j1 + 2] = y0r - y2r; a[_j1 + 3] = y0i - y2i; y0r = wd3i * x1r + wd3r * x1i; y0i = wd3i * x1i - wd3r * x1r; y2r = wk3i * x3r + wk3r * x3i; y2i = wk3i * x3i - wk3r * x3r; a[j2 + 2] = y0r + y2r; a[j2 + 3] = y0i + y2i; a[j3 + 2] = y0r - y2r; a[j3 + 3] = y0i - y2i; } void cftfx41(int n, double *a) { if (n == 128) { cftf161(a); cftf162(&a[32]); cftf161(&a[64]); cftf161(&a[96]); } else { cftf081(a); cftf082(&a[16]); cftf081(&a[32]); cftf081(&a[48]); } } void cftf161(double *a) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = WR5000; wk1r = WR2500; wk1i = WI2500; x0r = a[0] + a[16]; x0i = a[1] + a[17]; x1r = a[0] - a[16]; x1i = a[1] - a[17]; x2r = a[8] + a[24]; x2i = a[9] + a[25]; x3r = a[8] - a[24]; x3i = a[9] - a[25]; y0r = x0r + x2r; y0i = x0i + x2i; y4r = x0r - x2r; y4i = x0i - x2i; y8r = x1r - x3i; y8i = x1i + x3r; y12r = x1r + x3i; y12i = x1i - x3r; x0r = a[2] + a[18]; x0i = a[3] + a[19]; x1r = a[2] - a[18]; x1i = a[3] - a[19]; x2r = a[10] + a[26]; x2i = a[11] + a[27]; x3r = a[10] - a[26]; x3i = a[11] - a[27]; y1r = x0r + x2r; y1i = x0i + x2i; y5r = x0r - x2r; y5i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y9r = wk1r * x0r - wk1i * x0i; y9i = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y13r = wk1i * x0r - wk1r * x0i; y13i = wk1i * x0i + wk1r * x0r; x0r = a[4] + a[20]; x0i = a[5] + a[21]; x1r = a[4] - a[20]; x1i = a[5] - a[21]; x2r = a[12] + a[28]; x2i = a[13] + a[29]; x3r = a[12] - a[28]; x3i = a[13] - a[29]; y2r = x0r + x2r; y2i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y10r = wn4r * (x0r - x0i); y10i = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; y14r = wn4r * (x0r + x0i); y14i = wn4r * (x0i - x0r); x0r = a[6] + a[22]; x0i = a[7] + a[23]; x1r = a[6] - a[22]; x1i = a[7] - a[23]; x2r = a[14] + a[30]; x2i = a[15] + a[31]; x3r = a[14] - a[30]; x3i = a[15] - a[31]; y3r = x0r + x2r; y3i = x0i + x2i; y7r = x0r - x2r; y7i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; y11r = wk1i * x0r - wk1r * x0i; y11i = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; y15r = wk1r * x0r - wk1i * x0i; y15i = wk1r * x0i + wk1i * x0r; x0r = y12r - y14r; x0i = y12i - y14i; x1r = y12r + y14r; x1i = y12i + y14i; x2r = y13r - y15r; x2i = y13i - y15i; x3r = y13r + y15r; x3i = y13i + y15i; a[24] = x0r + x2r; a[25] = x0i + x2i; a[26] = x0r - x2r; a[27] = x0i - x2i; a[28] = x1r - x3i; a[29] = x1i + x3r; a[30] = x1r + x3i; a[31] = x1i - x3r; x0r = y8r + y10r; x0i = y8i + y10i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; x3r = y9r - y11r; x3i = y9i - y11i; a[16] = x0r + x2r; a[17] = x0i + x2i; a[18] = x0r - x2r; a[19] = x0i - x2i; a[20] = x1r - x3i; a[21] = x1i + x3r; a[22] = x1r + x3i; a[23] = x1i - x3r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); x0r = y5r + y7i; x0i = y5i - y7r; x3r = wn4r * (x0r - x0i); x3i = wn4r * (x0i + x0r); x0r = y4r - y6i; x0i = y4i + y6r; x1r = y4r + y6i; x1i = y4i - y6r; a[8] = x0r + x2r; a[9] = x0i + x2i; a[10] = x0r - x2r; a[11] = x0i - x2i; a[12] = x1r - x3i; a[13] = x1i + x3r; a[14] = x1r + x3i; a[15] = x1i - x3r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r + y3r; x2i = y1i + y3i; x3r = y1r - y3r; x3i = y1i - y3i; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x0r - x2r; a[3] = x0i - x2i; a[4] = x1r - x3i; a[5] = x1i + x3r; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftf162(double *a) { double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, x0r, x0i, x1r, x1i, x2r, x2i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; wn4r = WR5000; wk1r = WR1250; wk1i = WI1250; wk2r = WR2500; wk2i = WI2500; wk3r = WR3750; wk3i = WI3750; x1r = a[0] - a[17]; x1i = a[1] + a[16]; x0r = a[8] - a[25]; x0i = a[9] + a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y0r = x1r + x2r; y0i = x1i + x2i; y4r = x1r - x2r; y4i = x1i - x2i; x1r = a[0] + a[17]; x1i = a[1] - a[16]; x0r = a[8] + a[25]; x0i = a[9] - a[24]; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); y8r = x1r - x2i; y8i = x1i + x2r; y12r = x1r + x2i; y12i = x1i - x2r; x0r = a[2] - a[19]; x0i = a[3] + a[18]; x1r = wk1r * x0r - wk1i * x0i; x1i = wk1r * x0i + wk1i * x0r; x0r = a[10] - a[27]; x0i = a[11] + a[26]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y1r = x1r + x2r; y1i = x1i + x2i; y5r = x1r - x2r; y5i = x1i - x2i; x0r = a[2] + a[19]; x0i = a[3] - a[18]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[10] + a[27]; x0i = a[11] - a[26]; x2r = wk1r * x0r + wk1i * x0i; x2i = wk1r * x0i - wk1i * x0r; y9r = x1r - x2r; y9i = x1i - x2i; y13r = x1r + x2r; y13i = x1i + x2i; x0r = a[4] - a[21]; x0i = a[5] + a[20]; x1r = wk2r * x0r - wk2i * x0i; x1i = wk2r * x0i + wk2i * x0r; x0r = a[12] - a[29]; x0i = a[13] + a[28]; x2r = wk2i * x0r - wk2r * x0i; x2i = wk2i * x0i + wk2r * x0r; y2r = x1r + x2r; y2i = x1i + x2i; y6r = x1r - x2r; y6i = x1i - x2i; x0r = a[4] + a[21]; x0i = a[5] - a[20]; x1r = wk2i * x0r - wk2r * x0i; x1i = wk2i * x0i + wk2r * x0r; x0r = a[12] + a[29]; x0i = a[13] - a[28]; x2r = wk2r * x0r - wk2i * x0i; x2i = wk2r * x0i + wk2i * x0r; y10r = x1r - x2r; y10i = x1i - x2i; y14r = x1r + x2r; y14i = x1i + x2i; x0r = a[6] - a[23]; x0i = a[7] + a[22]; x1r = wk3r * x0r - wk3i * x0i; x1i = wk3r * x0i + wk3i * x0r; x0r = a[14] - a[31]; x0i = a[15] + a[30]; x2r = wk1i * x0r - wk1r * x0i; x2i = wk1i * x0i + wk1r * x0r; y3r = x1r + x2r; y3i = x1i + x2i; y7r = x1r - x2r; y7i = x1i - x2i; x0r = a[6] + a[23]; x0i = a[7] - a[22]; x1r = wk1i * x0r + wk1r * x0i; x1i = wk1i * x0i - wk1r * x0r; x0r = a[14] + a[31]; x0i = a[15] - a[30]; x2r = wk3i * x0r - wk3r * x0i; x2i = wk3i * x0i + wk3r * x0r; y11r = x1r + x2r; y11i = x1i + x2i; y15r = x1r - x2r; y15i = x1i - x2i; x1r = y0r + y2r; x1i = y0i + y2i; x2r = y1r + y3r; x2i = y1i + y3i; a[0] = x1r + x2r; a[1] = x1i + x2i; a[2] = x1r - x2r; a[3] = x1i - x2i; x1r = y0r - y2r; x1i = y0i - y2i; x2r = y1r - y3r; x2i = y1i - y3i; a[4] = x1r - x2i; a[5] = x1i + x2r; a[6] = x1r + x2i; a[7] = x1i - x2r; x1r = y4r - y6i; x1i = y4i + y6r; x0r = y5r - y7i; x0i = y5i + y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[8] = x1r + x2r; a[9] = x1i + x2i; a[10] = x1r - x2r; a[11] = x1i - x2i; x1r = y4r + y6i; x1i = y4i - y6r; x0r = y5r + y7i; x0i = y5i - y7r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[12] = x1r - x2i; a[13] = x1i + x2r; a[14] = x1r + x2i; a[15] = x1i - x2r; x1r = y8r + y10r; x1i = y8i + y10i; x2r = y9r - y11r; x2i = y9i - y11i; a[16] = x1r + x2r; a[17] = x1i + x2i; a[18] = x1r - x2r; a[19] = x1i - x2i; x1r = y8r - y10r; x1i = y8i - y10i; x2r = y9r + y11r; x2i = y9i + y11i; a[20] = x1r - x2i; a[21] = x1i + x2r; a[22] = x1r + x2i; a[23] = x1i - x2r; x1r = y12r - y14i; x1i = y12i + y14r; x0r = y13r + y15i; x0i = y13i - y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[24] = x1r + x2r; a[25] = x1i + x2i; a[26] = x1r - x2r; a[27] = x1i - x2i; x1r = y12r + y14i; x1i = y12i - y14r; x0r = y13r - y15i; x0i = y13i + y15r; x2r = wn4r * (x0r - x0i); x2i = wn4r * (x0i + x0r); a[28] = x1r - x2i; a[29] = x1i + x2r; a[30] = x1r + x2i; a[31] = x1i - x2r; } void cftf081(double *a) { double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = WR5000; x0r = a[0] + a[8]; x0i = a[1] + a[9]; x1r = a[0] - a[8]; x1i = a[1] - a[9]; x2r = a[4] + a[12]; x2i = a[5] + a[13]; x3r = a[4] - a[12]; x3i = a[5] - a[13]; y0r = x0r + x2r; y0i = x0i + x2i; y2r = x0r - x2r; y2i = x0i - x2i; y1r = x1r - x3i; y1i = x1i + x3r; y3r = x1r + x3i; y3i = x1i - x3r; x0r = a[2] + a[10]; x0i = a[3] + a[11]; x1r = a[2] - a[10]; x1i = a[3] - a[11]; x2r = a[6] + a[14]; x2i = a[7] + a[15]; x3r = a[6] - a[14]; x3i = a[7] - a[15]; y4r = x0r + x2r; y4i = x0i + x2i; y6r = x0r - x2r; y6i = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; x2r = x1r + x3i; x2i = x1i - x3r; y5r = wn4r * (x0r - x0i); y5i = wn4r * (x0r + x0i); y7r = wn4r * (x2r - x2i); y7i = wn4r * (x2r + x2i); a[8] = y1r + y5r; a[9] = y1i + y5i; a[10] = y1r - y5r; a[11] = y1i - y5i; a[12] = y3r - y7i; a[13] = y3i + y7r; a[14] = y3r + y7i; a[15] = y3i - y7r; a[0] = y0r + y4r; a[1] = y0i + y4i; a[2] = y0r - y4r; a[3] = y0i - y4i; a[4] = y2r - y6i; a[5] = y2i + y6r; a[6] = y2r + y6i; a[7] = y2i - y6r; } void cftf082(double *a) { double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; wn4r = WR5000; wk1r = WR2500; wk1i = WI2500; y0r = a[0] - a[9]; y0i = a[1] + a[8]; y1r = a[0] + a[9]; y1i = a[1] - a[8]; x0r = a[4] - a[13]; x0i = a[5] + a[12]; y2r = wn4r * (x0r - x0i); y2i = wn4r * (x0i + x0r); x0r = a[4] + a[13]; x0i = a[5] - a[12]; y3r = wn4r * (x0r - x0i); y3i = wn4r * (x0i + x0r); x0r = a[2] - a[11]; x0i = a[3] + a[10]; y4r = wk1r * x0r - wk1i * x0i; y4i = wk1r * x0i + wk1i * x0r; x0r = a[2] + a[11]; x0i = a[3] - a[10]; y5r = wk1i * x0r - wk1r * x0i; y5i = wk1i * x0i + wk1r * x0r; x0r = a[6] - a[15]; x0i = a[7] + a[14]; y6r = wk1i * x0r - wk1r * x0i; y6i = wk1i * x0i + wk1r * x0r; x0r = a[6] + a[15]; x0i = a[7] - a[14]; y7r = wk1r * x0r - wk1i * x0i; y7i = wk1r * x0i + wk1i * x0r; x0r = y0r + y2r; x0i = y0i + y2i; x1r = y4r + y6r; x1i = y4i + y6i; a[0] = x0r + x1r; a[1] = x0i + x1i; a[2] = x0r - x1r; a[3] = x0i - x1i; x0r = y0r - y2r; x0i = y0i - y2i; x1r = y4r - y6r; x1i = y4i - y6i; a[4] = x0r - x1i; a[5] = x0i + x1r; a[6] = x0r + x1i; a[7] = x0i - x1r; x0r = y1r - y3i; x0i = y1i + y3r; x1r = y5r - y7r; x1i = y5i - y7i; a[8] = x0r + x1r; a[9] = x0i + x1i; a[10] = x0r - x1r; a[11] = x0i - x1i; x0r = y1r + y3i; x0i = y1i - y3r; x1r = y5r + y7r; x1i = y5i + y7i; a[12] = x0r - x1i; a[13] = x0i + x1r; a[14] = x0r + x1i; a[15] = x0i - x1r; } void cftf040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r - x3i; a[3] = x1i + x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r + x3i; a[7] = x1i - x3r; } void cftb040(double *a) { double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[4]; x0i = a[1] + a[5]; x1r = a[0] - a[4]; x1i = a[1] - a[5]; x2r = a[2] + a[6]; x2i = a[3] + a[7]; x3r = a[2] - a[6]; x3i = a[3] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[2] = x1r + x3i; a[3] = x1i - x3r; a[4] = x0r - x2r; a[5] = x0i - x2i; a[6] = x1r - x3i; a[7] = x1i + x3r; } void cftx020(double *a) { double x0r, x0i; x0r = a[0] - a[2]; x0i = a[1] - a[3]; a[0] += a[2]; a[1] += a[3]; a[2] = x0r; a[3] = x0i; } void rftfsub(int n, double *a) { int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[j + 2] -= yr; a[j + 3] -= yi; a[k - 2] += yr; a[k - 1] -= yi; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr - wki * xi; yi = wkr * xi + wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[2] -= yr; a[3] -= yi; a[n - 2] += yr; a[n - 1] -= yi; } void rftbsub(int n, double *a) { int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[j + 2] -= yr; a[j + 3] -= yi; a[k - 2] += yr; a[k - 1] -= yi; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr + wki * xi; yi = wkr * xi - wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[2] -= yr; a[3] -= yi; a[n - 2] += yr; a[n - 1] -= yi; } void dctsub(int n, double *a) { int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[j - 1] - wdr * a[k + 1]; xi = wdr * a[j - 1] + wdi * a[k + 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[j] - wkr * a[k]; yi = wkr * a[j] + wki * a[k]; wdr -= ss * wki; wdi += ss * wkr; a[k + 1] = xr; a[k] = yr; a[j - 1] = xi; a[j] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m - 1] - wdr * a[m + 1]; a[m - 1] = wdr * a[m - 1] + wdi * a[m + 1]; a[m + 1] = xr; a[m] *= WR5000; } void dstsub(int n, double *a) { int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[k + 1] - wdr * a[j - 1]; xi = wdr * a[k + 1] + wdi * a[j - 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[k] - wkr * a[j]; yi = wkr * a[k] + wki * a[j]; wdr -= ss * wki; wdi += ss * wkr; a[j - 1] = xr; a[j] = yr; a[k + 1] = xi; a[k] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m + 1] - wdr * a[m - 1]; a[m + 1] = wdr * a[m + 1] + wdi * a[m - 1]; a[m - 1] = xr; a[m] *= WR5000; } void dctsub4(int n, double *a) { int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[1] - wdr * a[3]; a[1] = wdr * a[1] + wdi * a[3]; a[3] = xr; } a[m] *= wki; } void dstsub4(int n, double *a) { int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[3] - wdr * a[1]; a[3] = wdr * a[3] + wdi * a[1]; a[1] = xr; } a[m] *= wki; } Kst-2.0.8/src/libkstmath/builtinpalettes.h0000644000175000017500000013423412277111530017676 0ustar synthsynth/*************************************************************************** builtinpalettes.h: data for builting palettes ------------------- begin : September, 2010 copyright : (C) 2010 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUILTINPALETTES_H #define BUILTINPALETTES_H namespace Kst { static const int KstGrayscaleCount = 255; static const QString KstGrayscaleName = "Kst Grayscale"; static const char *const KstColors[] = { "red", "blue", "green", "black", "magenta", "steelblue", "#501010", "#105010" }; static const int KstColorsCount = sizeof(KstColors) / sizeof(char*); static const QString KstColorsName = "Kst Colors"; static const int CycleCount = 1021; static const QString CycleName = "Spectrum (Cyclical)"; static unsigned char Cycle[1022][3] = { {128, 238, 17}, {128, 238, 16}, {129, 238, 16}, {130, 237, 15}, {131, 237, 15}, {131, 236, 15}, {132, 236, 14}, {133, 235, 14}, {134, 235, 14}, {135, 235, 13}, {135, 234, 13}, {136, 234, 13}, {137, 233, 12}, {138, 233, 12}, {139, 232, 12}, {139, 232, 11}, {140, 232, 11}, {141, 231, 11}, {142, 231, 10}, {142, 230, 10}, {143, 230, 10}, {144, 229, 9}, {145, 229, 9}, {146, 228, 9}, {146, 228, 8}, {147, 227, 8}, {148, 227, 8}, {149, 226, 8}, {149, 226, 7}, {150, 225, 7}, {151, 225, 7}, {152, 224, 7}, {153, 224, 6}, {153, 223, 6}, {154, 223, 6}, {155, 222, 6}, {156, 222, 5}, {156, 221, 5}, {157, 221, 5}, {158, 220, 5}, {159, 219, 4}, {159, 219, 4}, {160, 218, 4}, {161, 218, 4}, {162, 217, 4}, {162, 217, 3}, {163, 216, 3}, {164, 215, 3}, {165, 215, 3}, {166, 214, 3}, {166, 214, 2}, {167, 213, 2}, {168, 213, 2}, {169, 212, 2}, {169, 211, 2}, {170, 211, 2}, {171, 210, 2}, {171, 210, 1}, {172, 209, 1}, {173, 208, 1}, {174, 208, 1}, {174, 207, 1}, {175, 207, 1}, {176, 206, 1}, {177, 205, 1}, {177, 205, 0}, {178, 204, 0}, {179, 203, 0}, {180, 203, 0}, {180, 202, 0}, {181, 201, 0}, {182, 201, 0}, {182, 200, 0}, {183, 200, 0}, {184, 199, 0}, {185, 198, 0}, {185, 198, 0}, {186, 197, 0}, {187, 196, 0}, {187, 196, 0}, {188, 195, 0}, {189, 194, 0}, {189, 194, 0}, {190, 193, 0}, {191, 192, 0}, {191, 192, 0}, {192, 191, 0}, {193, 190, 0}, {193, 190, 0}, {194, 189, 0}, {195, 188, 0}, {195, 187, 0}, {196, 187, 0}, {197, 186, 0}, {197, 185, 0}, {198, 185, 0}, {199, 184, 0}, {199, 183, 0}, {200, 182, 0}, {201, 182, 0}, {201, 181, 0}, {202, 180, 0}, {203, 180, 0}, {203, 179, 0}, {204, 178, 0}, {205, 177, 0}, {205, 177, 1}, {206, 176, 1}, {206, 175, 1}, {207, 175, 1}, {208, 174, 1}, {208, 173, 1}, {209, 172, 1}, {210, 172, 1}, {210, 171, 2}, {211, 170, 2}, {211, 169, 2}, {212, 169, 2}, {212, 168, 2}, {213, 167, 2}, {214, 166, 2}, {214, 166, 3}, {215, 165, 3}, {215, 164, 3}, {216, 163, 3}, {217, 163, 3}, {217, 162, 4}, {218, 161, 4}, {218, 160, 4}, {219, 160, 4}, {219, 159, 4}, {220, 158, 5}, {220, 157, 5}, {221, 157, 5}, {221, 156, 5}, {222, 155, 5}, {223, 154, 6}, {223, 153, 6}, {224, 153, 6}, {224, 152, 6}, {225, 151, 7}, {225, 150, 7}, {226, 150, 7}, {226, 149, 8}, {227, 148, 8}, {227, 147, 8}, {228, 146, 8}, {228, 146, 9}, {229, 145, 9}, {229, 144, 9}, {230, 143, 10}, {230, 143, 10}, {231, 142, 10}, {231, 141, 11}, {231, 140, 11}, {232, 139, 11}, {232, 139, 11}, {233, 138, 12}, {233, 137, 12}, {234, 136, 13}, {234, 136, 13}, {235, 135, 13}, {235, 134, 14}, {235, 133, 14}, {236, 132, 14}, {236, 132, 15}, {237, 131, 15}, {237, 130, 15}, {237, 129, 16}, {238, 128, 16}, {238, 128, 17}, {239, 127, 17}, {239, 126, 17}, {239, 125, 18}, {240, 124, 18}, {240, 124, 19}, {241, 123, 19}, {241, 122, 19}, {241, 121, 20}, {242, 121, 20}, {242, 120, 21}, {242, 119, 21}, {243, 118, 22}, {243, 117, 22}, {243, 117, 22}, {244, 116, 23}, {244, 115, 23}, {244, 114, 24}, {245, 113, 24}, {245, 113, 25}, {245, 112, 25}, {246, 111, 26}, {246, 110, 26}, {246, 110, 27}, {247, 109, 27}, {247, 108, 28}, {247, 107, 28}, {247, 106, 29}, {248, 106, 29}, {248, 105, 30}, {248, 104, 30}, {248, 103, 31}, {249, 103, 31}, {249, 102, 32}, {249, 101, 32}, {249, 100, 33}, {250, 100, 33}, {250, 99, 34}, {250, 98, 34}, {250, 97, 35}, {251, 96, 35}, {251, 96, 36}, {251, 95, 37}, {251, 94, 37}, {251, 93, 38}, {252, 93, 38}, {252, 92, 39}, {252, 91, 39}, {252, 90, 40}, {252, 90, 41}, {253, 89, 41}, {253, 88, 42}, {253, 87, 42}, {253, 87, 43}, {253, 86, 43}, {253, 85, 44}, {253, 84, 45}, {254, 84, 45}, {254, 83, 46}, {254, 82, 47}, {254, 81, 47}, {254, 81, 48}, {254, 80, 48}, {254, 79, 49}, {254, 79, 50}, {255, 78, 50}, {255, 77, 51}, {255, 76, 51}, {255, 76, 52}, {255, 75, 53}, {255, 74, 53}, {255, 73, 54}, {255, 73, 55}, {255, 72, 55}, {255, 71, 56}, {255, 71, 57}, {255, 70, 57}, {255, 69, 58}, {255, 69, 59}, {255, 68, 59}, {255, 67, 60}, {255, 66, 61}, {255, 66, 61}, {255, 65, 62}, {255, 64, 63}, {255, 64, 63}, {255, 63, 64}, {255, 62, 65}, {255, 62, 65}, {255, 61, 66}, {255, 60, 67}, {255, 60, 67}, {255, 59, 68}, {255, 58, 69}, {255, 58, 70}, {255, 57, 70}, {255, 56, 71}, {255, 56, 72}, {255, 55, 72}, {255, 54, 73}, {255, 54, 74}, {255, 53, 75}, {255, 52, 75}, {255, 52, 76}, {255, 51, 77}, {255, 51, 77}, {254, 50, 78}, {254, 49, 79}, {254, 49, 80}, {254, 48, 80}, {254, 47, 81}, {254, 47, 82}, {254, 46, 83}, {254, 46, 83}, {254, 45, 84}, {253, 44, 85}, {253, 44, 85}, {253, 43, 86}, {253, 43, 87}, {253, 42, 88}, {253, 41, 88}, {252, 41, 89}, {252, 40, 90}, {252, 40, 91}, {252, 39, 91}, {252, 39, 92}, {251, 38, 93}, {251, 37, 94}, {251, 37, 95}, {251, 36, 95}, {251, 36, 96}, {250, 35, 97}, {250, 35, 98}, {250, 34, 98}, {250, 34, 99}, {250, 33, 100}, {249, 33, 101}, {249, 32, 101}, {249, 31, 102}, {249, 31, 103}, {248, 30, 104}, {248, 30, 105}, {248, 29, 105}, {248, 29, 106}, {247, 28, 107}, {247, 28, 108}, {247, 27, 108}, {246, 27, 109}, {246, 26, 110}, {246, 26, 111}, {245, 26, 112}, {245, 25, 112}, {245, 25, 113}, {245, 24, 114}, {244, 24, 115}, {244, 23, 115}, {244, 23, 116}, {243, 22, 117}, {243, 22, 118}, {243, 21, 119}, {242, 21, 119}, {242, 21, 120}, {241, 20, 121}, {241, 20, 122}, {241, 19, 123}, {240, 19, 123}, {240, 18, 124}, {240, 18, 125}, {239, 18, 126}, {239, 17, 126}, {238, 17, 127}, {238, 16, 128}, {238, 16, 129}, {237, 16, 130}, {237, 15, 130}, {236, 15, 131}, {236, 14, 132}, {236, 14, 133}, {235, 14, 134}, {235, 13, 134}, {234, 13, 135}, {234, 13, 136}, {233, 12, 137}, {233, 12, 137}, {233, 12, 138}, {232, 11, 139}, {232, 11, 140}, {231, 11, 141}, {231, 10, 141}, {230, 10, 142}, {230, 10, 143}, {229, 9, 144}, {229, 9, 145}, {228, 9, 145}, {228, 9, 146}, {227, 8, 147}, {227, 8, 148}, {226, 8, 148}, {226, 7, 149}, {225, 7, 150}, {225, 7, 151}, {224, 7, 152}, {224, 6, 152}, {223, 6, 153}, {223, 6, 154}, {222, 6, 155}, {222, 5, 155}, {221, 5, 156}, {221, 5, 157}, {220, 5, 158}, {220, 4, 158}, {219, 4, 159}, {218, 4, 160}, {218, 4, 161}, {217, 4, 161}, {217, 3, 162}, {216, 3, 163}, {216, 3, 164}, {215, 3, 165}, {215, 3, 165}, {214, 3, 166}, {213, 2, 167}, {213, 2, 168}, {212, 2, 168}, {212, 2, 169}, {211, 2, 170}, {210, 2, 170}, {210, 1, 171}, {209, 1, 172}, {209, 1, 173}, {208, 1, 173}, {207, 1, 174}, {207, 1, 175}, {206, 1, 176}, {206, 1, 176}, {205, 1, 177}, {204, 0, 178}, {204, 0, 179}, {203, 0, 179}, {202, 0, 180}, {202, 0, 181}, {201, 0, 181}, {200, 0, 182}, {200, 0, 183}, {199, 0, 184}, {198, 0, 184}, {198, 0, 185}, {197, 0, 186}, {196, 0, 186}, {196, 0, 187}, {195, 0, 188}, {194, 0, 188}, {194, 0, 189}, {193, 0, 190}, {192, 0, 191}, {192, 0, 191}, {191, 0, 192}, {190, 0, 193}, {190, 0, 193}, {189, 0, 194}, {188, 0, 195}, {188, 0, 195}, {187, 0, 196}, {186, 0, 197}, {186, 0, 197}, {185, 0, 198}, {184, 0, 199}, {183, 0, 199}, {183, 0, 200}, {182, 0, 201}, {181, 0, 201}, {181, 0, 202}, {180, 0, 202}, {179, 0, 203}, {178, 0, 204}, {178, 0, 204}, {177, 1, 205}, {176, 1, 206}, {176, 1, 206}, {175, 1, 207}, {174, 1, 207}, {173, 1, 208}, {173, 1, 209}, {172, 1, 209}, {171, 1, 210}, {170, 2, 211}, {170, 2, 211}, {169, 2, 212}, {168, 2, 212}, {167, 2, 213}, {167, 2, 213}, {166, 3, 214}, {165, 3, 215}, {164, 3, 215}, {164, 3, 216}, {163, 3, 216}, {162, 3, 217}, {161, 4, 217}, {161, 4, 218}, {160, 4, 219}, {159, 4, 219}, {158, 5, 220}, {158, 5, 220}, {157, 5, 221}, {156, 5, 221}, {155, 5, 222}, {154, 6, 222}, {154, 6, 223}, {153, 6, 223}, {152, 6, 224}, {151, 7, 224}, {151, 7, 225}, {150, 7, 225}, {149, 7, 226}, {148, 8, 226}, {148, 8, 227}, {147, 8, 227}, {146, 9, 228}, {145, 9, 228}, {144, 9, 229}, {144, 9, 229}, {143, 10, 230}, {142, 10, 230}, {141, 10, 231}, {140, 11, 231}, {140, 11, 232}, {139, 11, 232}, {138, 12, 233}, {137, 12, 233}, {137, 12, 234}, {136, 13, 234}, {135, 13, 234}, {134, 13, 235}, {133, 14, 235}, {133, 14, 236}, {132, 15, 236}, {131, 15, 237}, {130, 15, 237}, {129, 16, 237}, {129, 16, 238}, {128, 16, 238}, {127, 17, 239}, {126, 17, 239}, {126, 18, 239}, {125, 18, 240}, {124, 18, 240}, {123, 19, 240}, {122, 19, 241}, {122, 20, 241}, {121, 20, 242}, {120, 21, 242}, {119, 21, 242}, {118, 21, 243}, {118, 22, 243}, {117, 22, 243}, {116, 23, 244}, {115, 23, 244}, {115, 24, 244}, {114, 24, 245}, {113, 25, 245}, {112, 25, 245}, {111, 26, 246}, {111, 26, 246}, {110, 27, 246}, {109, 27, 246}, {108, 28, 247}, {107, 28, 247}, {107, 29, 247}, {106, 29, 248}, {105, 30, 248}, {104, 30, 248}, {104, 31, 248}, {103, 31, 249}, {102, 32, 249}, {101, 32, 249}, {101, 33, 249}, {100, 33, 250}, {99, 34, 250}, {98, 34, 250}, {97, 35, 250}, {97, 35, 250}, {96, 36, 251}, {95, 36, 251}, {94, 37, 251}, {94, 38, 251}, {93, 38, 252}, {92, 39, 252}, {91, 39, 252}, {91, 40, 252}, {90, 40, 252}, {89, 41, 252}, {88, 42, 253}, {88, 42, 253}, {87, 43, 253}, {86, 43, 253}, {85, 44, 253}, {85, 44, 253}, {84, 45, 254}, {83, 46, 254}, {82, 46, 254}, {82, 47, 254}, {81, 48, 254}, {80, 48, 254}, {79, 49, 254}, {79, 49, 254}, {78, 50, 254}, {77, 51, 255}, {77, 51, 255}, {76, 52, 255}, {75, 53, 255}, {74, 53, 255}, {74, 54, 255}, {73, 54, 255}, {72, 55, 255}, {72, 56, 255}, {71, 56, 255}, {70, 57, 255}, {69, 58, 255}, {69, 58, 255}, {68, 59, 255}, {67, 60, 255}, {67, 60, 255}, {66, 61, 255}, {65, 62, 255}, {65, 62, 255}, {64, 63, 255}, {63, 64, 255}, {63, 64, 255}, {62, 65, 255}, {61, 66, 255}, {61, 67, 255}, {60, 67, 255}, {59, 68, 255}, {59, 69, 255}, {58, 69, 255}, {57, 70, 255}, {57, 71, 255}, {56, 71, 255}, {55, 72, 255}, {55, 73, 255}, {54, 74, 255}, {53, 74, 255}, {53, 75, 255}, {52, 76, 255}, {51, 76, 255}, {51, 77, 255}, {50, 78, 254}, {49, 79, 254}, {49, 79, 254}, {48, 80, 254}, {48, 81, 254}, {47, 82, 254}, {46, 82, 254}, {46, 83, 254}, {45, 84, 254}, {45, 85, 253}, {44, 85, 253}, {43, 86, 253}, {43, 87, 253}, {42, 87, 253}, {42, 88, 253}, {41, 89, 252}, {40, 90, 252}, {40, 90, 252}, {39, 91, 252}, {39, 92, 252}, {38, 93, 252}, {38, 94, 251}, {37, 94, 251}, {37, 95, 251}, {36, 96, 251}, {35, 97, 251}, {35, 97, 250}, {34, 98, 250}, {34, 99, 250}, {33, 100, 250}, {33, 100, 249}, {32, 101, 249}, {32, 102, 249}, {31, 103, 249}, {31, 103, 248}, {30, 104, 248}, {30, 105, 248}, {29, 106, 248}, {29, 107, 247}, {28, 107, 247}, {28, 108, 247}, {27, 109, 246}, {27, 110, 246}, {26, 110, 246}, {26, 111, 246}, {25, 112, 245}, {25, 113, 245}, {24, 114, 245}, {24, 114, 244}, {23, 115, 244}, {23, 116, 244}, {22, 117, 243}, {22, 118, 243}, {22, 118, 243}, {21, 119, 242}, {21, 120, 242}, {20, 121, 242}, {20, 121, 241}, {19, 122, 241}, {19, 123, 241}, {19, 124, 240}, {18, 125, 240}, {18, 125, 239}, {17, 126, 239}, {17, 127, 239}, {17, 128, 238}, {16, 129, 238}, {16, 129, 237}, {15, 130, 237}, {15, 131, 237}, {15, 132, 236}, {14, 132, 236}, {14, 133, 235}, {14, 134, 235}, {13, 135, 234}, {13, 136, 234}, {12, 136, 234}, {12, 137, 233}, {12, 138, 233}, {11, 139, 232}, {11, 140, 232}, {11, 140, 231}, {10, 141, 231}, {10, 142, 230}, {10, 143, 230}, {10, 143, 229}, {9, 144, 229}, {9, 145, 229}, {9, 146, 228}, {8, 147, 228}, {8, 147, 227}, {8, 148, 227}, {7, 149, 226}, {7, 150, 226}, {7, 150, 225}, {7, 151, 225}, {6, 152, 224}, {6, 153, 224}, {6, 154, 223}, {6, 154, 222}, {5, 155, 222}, {5, 156, 221}, {5, 157, 221}, {5, 157, 220}, {5, 158, 220}, {4, 159, 219}, {4, 160, 219}, {4, 160, 218}, {4, 161, 218}, {4, 162, 217}, {3, 163, 216}, {3, 164, 216}, {3, 164, 215}, {3, 165, 215}, {3, 166, 214}, {2, 167, 214}, {2, 167, 213}, {2, 168, 212}, {2, 169, 212}, {2, 170, 211}, {2, 170, 211}, {1, 171, 210}, {1, 172, 209}, {1, 172, 209}, {1, 173, 208}, {1, 174, 208}, {1, 175, 207}, {1, 175, 206}, {1, 176, 206}, {1, 177, 205}, {0, 178, 204}, {0, 178, 204}, {0, 179, 203}, {0, 180, 203}, {0, 180, 202}, {0, 181, 201}, {0, 182, 201}, {0, 183, 200}, {0, 183, 199}, {0, 184, 199}, {0, 185, 198}, {0, 185, 197}, {0, 186, 197}, {0, 187, 196}, {0, 188, 195}, {0, 188, 195}, {0, 189, 194}, {0, 190, 193}, {0, 190, 193}, {0, 191, 192}, {0, 192, 191}, {0, 192, 191}, {0, 193, 190}, {0, 194, 189}, {0, 194, 189}, {0, 195, 188}, {0, 196, 187}, {0, 196, 186}, {0, 197, 186}, {0, 198, 185}, {0, 198, 184}, {0, 199, 184}, {0, 200, 183}, {0, 200, 182}, {0, 201, 182}, {0, 202, 181}, {0, 202, 180}, {0, 203, 179}, {0, 204, 179}, {0, 204, 178}, {0, 205, 177}, {1, 205, 176}, {1, 206, 176}, {1, 207, 175}, {1, 207, 174}, {1, 208, 174}, {1, 208, 173}, {1, 209, 172}, {1, 210, 171}, {2, 210, 171}, {2, 211, 170}, {2, 212, 169}, {2, 212, 168}, {2, 213, 168}, {2, 213, 167}, {2, 214, 166}, {3, 214, 165}, {3, 215, 165}, {3, 216, 164}, {3, 216, 163}, {3, 217, 162}, {4, 217, 162}, {4, 218, 161}, {4, 218, 160}, {4, 219, 159}, {4, 220, 159}, {5, 220, 158}, {5, 221, 157}, {5, 221, 156}, {5, 222, 155}, {6, 222, 155}, {6, 223, 154}, {6, 223, 153}, {6, 224, 152}, {7, 224, 152}, {7, 225, 151}, {7, 225, 150}, {7, 226, 149}, {8, 226, 149}, {8, 227, 148}, {8, 227, 147}, {8, 228, 146}, {9, 228, 145}, {9, 229, 145}, {9, 229, 144}, {10, 230, 143}, {10, 230, 142}, {10, 231, 142}, {11, 231, 141}, {11, 232, 140}, {11, 232, 139}, {12, 233, 138}, {12, 233, 138}, {12, 233, 137}, {13, 234, 136}, {13, 234, 135}, {13, 235, 134}, {14, 235, 134}, {14, 236, 133}, {14, 236, 132}, {15, 236, 131}, {15, 237, 131}, {16, 237, 130}, {16, 238, 129}, {16, 238, 128}, {17, 238, 127}, {17, 239, 127}, {18, 239, 126}, {18, 240, 125}, {18, 240, 124}, {19, 240, 123}, {19, 241, 123}, {20, 241, 122}, {20, 241, 121}, {20, 242, 120}, {21, 242, 119}, {21, 242, 119}, {22, 243, 118}, {22, 243, 117}, {23, 244, 116}, {23, 244, 116}, {24, 244, 115}, {24, 244, 114}, {24, 245, 113}, {25, 245, 112}, {25, 245, 112}, {26, 246, 111}, {26, 246, 110}, {27, 246, 109}, {27, 247, 109}, {28, 247, 108}, {28, 247, 107}, {29, 247, 106}, {29, 248, 105}, {30, 248, 105}, {30, 248, 104}, {31, 249, 103}, {31, 249, 102}, {32, 249, 102}, {32, 249, 101}, {33, 250, 100}, {34, 250, 99}, {34, 250, 98}, {35, 250, 98}, {35, 250, 97}, {36, 251, 96}, {36, 251, 95}, {37, 251, 95}, {37, 251, 94}, {38, 251, 93}, {38, 252, 92}, {39, 252, 92}, {40, 252, 91}, {40, 252, 90}, {41, 252, 89}, {41, 253, 89}, {42, 253, 88}, {43, 253, 87}, {43, 253, 86}, {44, 253, 86}, {44, 253, 85}, {45, 253, 84}, {45, 254, 83}, {46, 254, 83}, {47, 254, 82}, {47, 254, 81}, {48, 254, 80}, {49, 254, 80}, {49, 254, 79}, {50, 254, 78}, {50, 255, 78}, {51, 255, 77}, {52, 255, 76}, {52, 255, 75}, {53, 255, 75}, {54, 255, 74}, {54, 255, 73}, {55, 255, 73}, {56, 255, 72}, {56, 255, 71}, {57, 255, 70}, {58, 255, 70}, {58, 255, 69}, {59, 255, 68}, {60, 255, 68}, {60, 255, 67}, {61, 255, 66}, {62, 255, 65}, {62, 255, 65}, {63, 255, 64}, {64, 255, 63}, {64, 255, 63}, {65, 255, 62}, {66, 255, 61}, {66, 255, 61}, {67, 255, 60}, {68, 255, 59}, {68, 255, 59}, {69, 255, 58}, {70, 255, 57}, {70, 255, 57}, {71, 255, 56}, {72, 255, 55}, {73, 255, 55}, {73, 255, 54}, {74, 255, 54}, {75, 255, 53}, {75, 255, 52}, {76, 255, 52}, {77, 255, 51}, {78, 255, 50}, {78, 254, 50}, {79, 254, 49}, {80, 254, 48}, {81, 254, 48}, {81, 254, 47}, {82, 254, 47}, {83, 254, 46}, {84, 254, 45}, {84, 253, 45}, {85, 253, 44}, {86, 253, 44}, {86, 253, 43}, {87, 253, 42}, {88, 253, 42}, {89, 253, 41}, {89, 252, 41}, {90, 252, 40}, {91, 252, 40}, {92, 252, 39}, {93, 252, 38}, {93, 251, 38}, {94, 251, 37}, {95, 251, 37}, {96, 251, 36}, {96, 251, 36}, {97, 250, 35}, {98, 250, 34}, {99, 250, 34}, {99, 250, 33}, {100, 249, 33}, {101, 249, 32}, {102, 249, 32}, {102, 249, 31}, {103, 248, 31}, {104, 248, 30}, {105, 248, 30}, {106, 248, 29}, {106, 247, 29}, {107, 247, 28}, {108, 247, 28}, {109, 247, 27}, {109, 246, 27}, {110, 246, 26}, {111, 246, 26}, {112, 245, 25}, {113, 245, 25}, {113, 245, 24}, {114, 244, 24}, {115, 244, 23}, {116, 244, 23}, {116, 243, 23}, {117, 243, 22}, {118, 243, 22}, {119, 242, 21}, {120, 242, 21}, {120, 242, 20}, {121, 241, 20}, {122, 241, 20}, {123, 241, 19}, {124, 240, 19}, {124, 240, 18}, {125, 240, 18}, {126, 239, 17}, {127, 239, 17} }; static const int RedTempCount = 256; static const QString RedTempName = "Red Temperature"; static unsigned char RedTemp[257][3] = { {0, 0, 0}, {0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {4, 0, 0}, {5, 0, 0}, {7, 0, 0}, {8, 0, 0}, {10, 0, 0}, {11, 0, 0}, {13, 0, 0}, {14, 0, 0}, {15, 0, 0}, {17, 0, 0}, {18, 0, 0}, {20, 0, 0}, {21, 0, 0}, {23, 0, 0}, {24, 0, 0}, {26, 0, 0}, {27, 0, 0}, {28, 0, 0}, {30, 0, 0}, {31, 0, 0}, {33, 0, 0}, {34, 0, 0}, {36, 0, 0}, {37, 0, 0}, {39, 0, 0}, {40, 0, 0}, {42, 0, 0}, {43, 0, 0}, {44, 0, 0}, {46, 0, 0}, {47, 0, 0}, {49, 0, 0}, {50, 0, 0}, {52, 0, 0}, {53, 0, 0}, {55, 0, 0}, {56, 0, 0}, {57, 0, 0}, {59, 0, 0}, {60, 0, 0}, {62, 0, 0}, {63, 0, 0}, {65, 0, 0}, {66, 0, 0}, {68, 0, 0}, {69, 0, 0}, {70, 0, 0}, {72, 0, 0}, {73, 0, 0}, {75, 0, 0}, {76, 0, 0}, {78, 0, 0}, {79, 0, 0}, {81, 0, 0}, {82, 0, 0}, {84, 0, 0}, {85, 0, 0}, {86, 0, 0}, {88, 0, 0}, {89, 0, 0}, {91, 0, 0}, {92, 0, 0}, {94, 0, 0}, {95, 0, 0}, {97, 0, 0}, {98, 0, 0}, {99, 0, 0}, {101, 0, 0}, {102, 0, 0}, {104, 0, 0}, {105, 0, 0}, {107, 0, 0}, {108, 0, 0}, {110, 0, 0}, {111, 0, 0}, {113, 0, 0}, {114, 0, 0}, {115, 0, 0}, {117, 0, 0}, {118, 0, 0}, {120, 0, 0}, {121, 0, 0}, {123, 0, 0}, {124, 0, 0}, {126, 0, 0}, {127, 0, 0}, {128, 0, 0}, {130, 0, 0}, {131, 0, 0}, {133, 0, 0}, {134, 0, 0}, {136, 0, 0}, {137, 0, 0}, {139, 0, 0}, {140, 0, 0}, {141, 0, 0}, {143, 0, 0}, {144, 0, 0}, {146, 0, 0}, {147, 0, 0}, {149, 0, 0}, {150, 0, 0}, {152, 0, 0}, {153, 0, 0}, {155, 0, 0}, {156, 0, 0}, {157, 0, 0}, {159, 0, 0}, {160, 0, 0}, {162, 0, 0}, {163, 0, 0}, {165, 0, 0}, {166, 0, 0}, {168, 0, 0}, {169, 0, 0}, {170, 0, 0}, {172, 0, 0}, {173, 0, 0}, {175, 1, 0}, {176, 3, 0}, {178, 5, 0}, {179, 7, 0}, {181, 9, 0}, {182, 11, 0}, {184, 13, 0}, {185, 15, 0}, {186, 17, 0}, {188, 18, 0}, {189, 20, 0}, {191, 22, 0}, {192, 24, 0}, {194, 26, 0}, {195, 28, 0}, {197, 30, 0}, {198, 32, 0}, {199, 34, 0}, {201, 35, 0}, {202, 37, 0}, {204, 39, 0}, {205, 41, 0}, {207, 43, 0}, {208, 45, 0}, {210, 47, 0}, {211, 49, 0}, {212, 51, 0}, {214, 52, 0}, {215, 54, 0}, {217, 56, 0}, {218, 58, 0}, {220, 60, 0}, {221, 62, 0}, {223, 64, 0}, {224, 66, 0}, {226, 68, 0}, {227, 69, 0}, {228, 71, 0}, {230, 73, 0}, {231, 75, 0}, {233, 77, 0}, {234, 79, 0}, {236, 81, 0}, {237, 83, 0}, {239, 85, 0}, {240, 86, 0}, {241, 88, 0}, {243, 90, 0}, {244, 92, 0}, {246, 94, 0}, {247, 96, 0}, {249, 98, 0}, {250, 100, 0}, {252, 102, 0}, {253, 103, 0}, {255, 105, 0}, {255, 107, 0}, {255, 109, 0}, {255, 111, 0}, {255, 113, 0}, {255, 115, 0}, {255, 117, 0}, {255, 119, 0}, {255, 120, 0}, {255, 122, 0}, {255, 124, 0}, {255, 126, 0}, {255, 128, 0}, {255, 130, 0}, {255, 132, 0}, {255, 134, 3}, {255, 136, 7}, {255, 137, 11}, {255, 139, 15}, {255, 141, 19}, {255, 143, 23}, {255, 145, 27}, {255, 147, 31}, {255, 149, 35}, {255, 151, 39}, {255, 153, 43}, {255, 154, 47}, {255, 156, 51}, {255, 158, 54}, {255, 160, 58}, {255, 162, 62}, {255, 164, 66}, {255, 166, 70}, {255, 168, 74}, {255, 170, 78}, {255, 171, 82}, {255, 173, 86}, {255, 175, 90}, {255, 177, 94}, {255, 179, 98}, {255, 181, 102}, {255, 183, 105}, {255, 185, 109}, {255, 187, 113}, {255, 188, 117}, {255, 190, 121}, {255, 192, 125}, {255, 194, 129}, {255, 196, 133}, {255, 198, 137}, {255, 200, 141}, {255, 202, 145}, {255, 204, 149}, {255, 205, 153}, {255, 207, 156}, {255, 209, 160}, {255, 211, 164}, {255, 213, 168}, {255, 215, 172}, {255, 217, 176}, {255, 219, 180}, {255, 221, 184}, {255, 222, 188}, {255, 224, 192}, {255, 226, 196}, {255, 228, 200}, {255, 230, 204}, {255, 232, 207}, {255, 234, 211}, {255, 236, 215}, {255, 238, 219}, {255, 239, 223}, {255, 241, 227}, {255, 243, 231}, {255, 245, 235}, {255, 247, 239}, {255, 249, 243}, {255, 251, 247}, {255, 253, 251}, {255, 255, 255} }; static const int SpectrumCount = 1021; static const QString SpectrumName = "Spectrum"; static unsigned char Spectrum[1022][3] = { {0, 0, 0}, {0, 0, 255}, {0, 1, 255}, {0, 2, 255}, {0, 3, 255}, {0, 4, 255}, {0, 5, 255}, {0, 6, 255}, {0, 7, 255}, {0, 8, 255}, {0, 9, 255}, {0, 10, 255}, {0, 11, 255}, {0, 12, 255}, {0, 13, 255}, {0, 14, 255}, {0, 15, 255}, {0, 16, 255}, {0, 17, 255}, {0, 18, 255}, {0, 19, 255}, {0, 20, 255}, {0, 21, 255}, {0, 22, 255}, {0, 23, 255}, {0, 24, 255}, {0, 25, 255}, {0, 26, 255}, {0, 27, 255}, {0, 28, 255}, {0, 29, 255}, {0, 30, 255}, {0, 31, 255}, {0, 32, 255}, {0, 33, 255}, {0, 34, 255}, {0, 35, 255}, {0, 36, 255}, {0, 37, 255}, {0, 38, 255}, {0, 39, 255}, {0, 40, 255}, {0, 41, 255}, {0, 42, 255}, {0, 43, 255}, {0, 44, 255}, {0, 45, 255}, {0, 46, 255}, {0, 47, 255}, {0, 48, 255}, {0, 49, 255}, {0, 50, 255}, {0, 51, 255}, {0, 52, 255}, {0, 53, 255}, {0, 54, 255}, {0, 55, 255}, {0, 56, 255}, {0, 57, 255}, {0, 58, 255}, {0, 59, 255}, {0, 60, 255}, {0, 61, 255}, {0, 62, 255}, {0, 63, 255}, {0, 64, 255}, {0, 65, 255}, {0, 66, 255}, {0, 67, 255}, {0, 68, 255}, {0, 69, 255}, {0, 70, 255}, {0, 71, 255}, {0, 72, 255}, {0, 73, 255}, {0, 74, 255}, {0, 75, 255}, {0, 76, 255}, {0, 77, 255}, {0, 78, 255}, {0, 79, 255}, {0, 80, 255}, {0, 81, 255}, {0, 82, 255}, {0, 83, 255}, {0, 84, 255}, {0, 85, 255}, {0, 86, 255}, {0, 87, 255}, {0, 88, 255}, {0, 89, 255}, {0, 90, 255}, {0, 91, 255}, {0, 92, 255}, {0, 93, 255}, {0, 94, 255}, {0, 95, 255}, {0, 96, 255}, {0, 97, 255}, {0, 98, 255}, {0, 99, 255}, {0, 100, 255}, {0, 101, 255}, {0, 102, 255}, {0, 103, 255}, {0, 104, 255}, {0, 105, 255}, {0, 106, 255}, {0, 107, 255}, {0, 108, 255}, {0, 109, 255}, {0, 110, 255}, {0, 111, 255}, {0, 112, 255}, {0, 113, 255}, {0, 114, 255}, {0, 115, 255}, {0, 116, 255}, {0, 117, 255}, {0, 118, 255}, {0, 119, 255}, {0, 120, 255}, {0, 121, 255}, {0, 122, 255}, {0, 123, 255}, {0, 124, 255}, {0, 125, 255}, {0, 126, 255}, {0, 127, 255}, {0, 128, 255}, {0, 129, 255}, {0, 130, 255}, {0, 131, 255}, {0, 132, 255}, {0, 133, 255}, {0, 134, 255}, {0, 135, 255}, {0, 136, 255}, {0, 137, 255}, {0, 138, 255}, {0, 139, 255}, {0, 140, 255}, {0, 141, 255}, {0, 142, 255}, {0, 143, 255}, {0, 144, 255}, {0, 145, 255}, {0, 146, 255}, {0, 147, 255}, {0, 148, 255}, {0, 149, 255}, {0, 150, 255}, {0, 151, 255}, {0, 152, 255}, {0, 153, 255}, {0, 154, 255}, {0, 155, 255}, {0, 156, 255}, {0, 157, 255}, {0, 158, 255}, {0, 159, 255}, {0, 160, 255}, {0, 161, 255}, {0, 162, 255}, {0, 163, 255}, {0, 164, 255}, {0, 165, 255}, {0, 166, 255}, {0, 167, 255}, {0, 168, 255}, {0, 169, 255}, {0, 170, 255}, {0, 171, 255}, {0, 172, 255}, {0, 173, 255}, {0, 174, 255}, {0, 175, 255}, {0, 176, 255}, {0, 177, 255}, {0, 178, 255}, {0, 179, 255}, {0, 180, 255}, {0, 181, 255}, {0, 182, 255}, {0, 183, 255}, {0, 184, 255}, {0, 185, 255}, {0, 186, 255}, {0, 187, 255}, {0, 188, 255}, {0, 189, 255}, {0, 190, 255}, {0, 191, 255}, {0, 192, 255}, {0, 193, 255}, {0, 194, 255}, {0, 195, 255}, {0, 196, 255}, {0, 197, 255}, {0, 198, 255}, {0, 199, 255}, {0, 200, 255}, {0, 201, 255}, {0, 202, 255}, {0, 203, 255}, {0, 204, 255}, {0, 205, 255}, {0, 206, 255}, {0, 207, 255}, {0, 208, 255}, {0, 209, 255}, {0, 210, 255}, {0, 211, 255}, {0, 212, 255}, {0, 213, 255}, {0, 214, 255}, {0, 215, 255}, {0, 216, 255}, {0, 217, 255}, {0, 218, 255}, {0, 219, 255}, {0, 220, 255}, {0, 221, 255}, {0, 222, 255}, {0, 223, 255}, {0, 224, 255}, {0, 225, 255}, {0, 226, 255}, {0, 227, 255}, {0, 228, 255}, {0, 229, 255}, {0, 230, 255}, {0, 231, 255}, {0, 232, 255}, {0, 233, 255}, {0, 234, 255}, {0, 235, 255}, {0, 236, 255}, {0, 237, 255}, {0, 238, 255}, {0, 239, 255}, {0, 240, 255}, {0, 241, 255}, {0, 242, 255}, {0, 243, 255}, {0, 244, 255}, {0, 245, 255}, {0, 246, 255}, {0, 247, 255}, {0, 248, 255}, {0, 249, 255}, {0, 250, 255}, {0, 251, 255}, {0, 252, 255}, {0, 253, 255}, {0, 254, 255}, {0, 255, 255}, {0, 255, 254}, {0, 255, 253}, {0, 255, 252}, {0, 255, 251}, {0, 255, 250}, {0, 255, 249}, {0, 255, 248}, {0, 255, 247}, {0, 255, 246}, {0, 255, 245}, {0, 255, 244}, {0, 255, 243}, {0, 255, 242}, {0, 255, 241}, {0, 255, 240}, {0, 255, 239}, {0, 255, 238}, {0, 255, 237}, {0, 255, 236}, {0, 255, 235}, {0, 255, 234}, {0, 255, 233}, {0, 255, 232}, {0, 255, 231}, {0, 255, 230}, {0, 255, 229}, {0, 255, 228}, {0, 255, 227}, {0, 255, 226}, {0, 255, 225}, {0, 255, 224}, {0, 255, 223}, {0, 255, 222}, {0, 255, 221}, {0, 255, 220}, {0, 255, 219}, {0, 255, 218}, {0, 255, 217}, {0, 255, 216}, {0, 255, 215}, {0, 255, 214}, {0, 255, 213}, {0, 255, 212}, {0, 255, 211}, {0, 255, 210}, {0, 255, 209}, {0, 255, 208}, {0, 255, 207}, {0, 255, 206}, {0, 255, 205}, {0, 255, 204}, {0, 255, 203}, {0, 255, 202}, {0, 255, 201}, {0, 255, 200}, {0, 255, 199}, {0, 255, 198}, {0, 255, 197}, {0, 255, 196}, {0, 255, 195}, {0, 255, 194}, {0, 255, 193}, {0, 255, 192}, {0, 255, 191}, {0, 255, 190}, {0, 255, 189}, {0, 255, 188}, {0, 255, 187}, {0, 255, 186}, {0, 255, 185}, {0, 255, 184}, {0, 255, 183}, {0, 255, 182}, {0, 255, 181}, {0, 255, 180}, {0, 255, 179}, {0, 255, 178}, {0, 255, 177}, {0, 255, 176}, {0, 255, 175}, {0, 255, 174}, {0, 255, 173}, {0, 255, 172}, {0, 255, 171}, {0, 255, 170}, {0, 255, 169}, {0, 255, 168}, {0, 255, 167}, {0, 255, 166}, {0, 255, 165}, {0, 255, 164}, {0, 255, 163}, {0, 255, 162}, {0, 255, 161}, {0, 255, 160}, {0, 255, 159}, {0, 255, 158}, {0, 255, 157}, {0, 255, 156}, {0, 255, 155}, {0, 255, 154}, {0, 255, 153}, {0, 255, 152}, {0, 255, 151}, {0, 255, 150}, {0, 255, 149}, {0, 255, 148}, {0, 255, 147}, {0, 255, 146}, {0, 255, 145}, {0, 255, 144}, {0, 255, 143}, {0, 255, 142}, {0, 255, 141}, {0, 255, 140}, {0, 255, 139}, {0, 255, 138}, {0, 255, 137}, {0, 255, 136}, {0, 255, 135}, {0, 255, 134}, {0, 255, 133}, {0, 255, 132}, {0, 255, 131}, {0, 255, 130}, {0, 255, 129}, {0, 255, 128}, {0, 255, 127}, {0, 255, 126}, {0, 255, 125}, {0, 255, 124}, {0, 255, 123}, {0, 255, 122}, {0, 255, 121}, {0, 255, 120}, {0, 255, 119}, {0, 255, 118}, {0, 255, 117}, {0, 255, 116}, {0, 255, 115}, {0, 255, 114}, {0, 255, 113}, {0, 255, 112}, {0, 255, 111}, {0, 255, 110}, {0, 255, 109}, {0, 255, 108}, {0, 255, 107}, {0, 255, 106}, {0, 255, 105}, {0, 255, 104}, {0, 255, 103}, {0, 255, 102}, {0, 255, 101}, {0, 255, 100}, {0, 255, 99}, {0, 255, 98}, {0, 255, 97}, {0, 255, 96}, {0, 255, 95}, {0, 255, 94}, {0, 255, 93}, {0, 255, 92}, {0, 255, 91}, {0, 255, 90}, {0, 255, 89}, {0, 255, 88}, {0, 255, 87}, {0, 255, 86}, {0, 255, 85}, {0, 255, 84}, {0, 255, 83}, {0, 255, 82}, {0, 255, 81}, {0, 255, 80}, {0, 255, 79}, {0, 255, 78}, {0, 255, 77}, {0, 255, 76}, {0, 255, 75}, {0, 255, 74}, {0, 255, 73}, {0, 255, 72}, {0, 255, 71}, {0, 255, 70}, {0, 255, 69}, {0, 255, 68}, {0, 255, 67}, {0, 255, 66}, {0, 255, 65}, {0, 255, 64}, {0, 255, 63}, {0, 255, 62}, {0, 255, 61}, {0, 255, 60}, {0, 255, 59}, {0, 255, 58}, {0, 255, 57}, {0, 255, 56}, {0, 255, 55}, {0, 255, 54}, {0, 255, 53}, {0, 255, 52}, {0, 255, 51}, {0, 255, 50}, {0, 255, 49}, {0, 255, 48}, {0, 255, 47}, {0, 255, 46}, {0, 255, 45}, {0, 255, 44}, {0, 255, 43}, {0, 255, 42}, {0, 255, 41}, {0, 255, 40}, {0, 255, 39}, {0, 255, 38}, {0, 255, 37}, {0, 255, 36}, {0, 255, 35}, {0, 255, 34}, {0, 255, 33}, {0, 255, 32}, {0, 255, 31}, {0, 255, 30}, {0, 255, 29}, {0, 255, 28}, {0, 255, 27}, {0, 255, 26}, {0, 255, 25}, {0, 255, 24}, {0, 255, 23}, {0, 255, 22}, {0, 255, 21}, {0, 255, 20}, {0, 255, 19}, {0, 255, 18}, {0, 255, 17}, {0, 255, 16}, {0, 255, 15}, {0, 255, 14}, {0, 255, 13}, {0, 255, 12}, {0, 255, 11}, {0, 255, 10}, {0, 255, 9}, {0, 255, 8}, {0, 255, 7}, {0, 255, 6}, {0, 255, 5}, {0, 255, 4}, {0, 255, 3}, {0, 255, 2}, {0, 255, 1}, {0, 255, 0}, {1, 255, 0}, {2, 255, 0}, {3, 255, 0}, {4, 255, 0}, {5, 255, 0}, {6, 255, 0}, {7, 255, 0}, {8, 255, 0}, {9, 255, 0}, {10, 255, 0}, {11, 255, 0}, {12, 255, 0}, {13, 255, 0}, {14, 255, 0}, {15, 255, 0}, {16, 255, 0}, {17, 255, 0}, {18, 255, 0}, {19, 255, 0}, {20, 255, 0}, {21, 255, 0}, {22, 255, 0}, {23, 255, 0}, {24, 255, 0}, {25, 255, 0}, {26, 255, 0}, {27, 255, 0}, {28, 255, 0}, {29, 255, 0}, {30, 255, 0}, {31, 255, 0}, {32, 255, 0}, {33, 255, 0}, {34, 255, 0}, {35, 255, 0}, {36, 255, 0}, {37, 255, 0}, {38, 255, 0}, {39, 255, 0}, {40, 255, 0}, {41, 255, 0}, {42, 255, 0}, {43, 255, 0}, {44, 255, 0}, {45, 255, 0}, {46, 255, 0}, {47, 255, 0}, {48, 255, 0}, {49, 255, 0}, {50, 255, 0}, {51, 255, 0}, {52, 255, 0}, {53, 255, 0}, {54, 255, 0}, {55, 255, 0}, {56, 255, 0}, {57, 255, 0}, {58, 255, 0}, {59, 255, 0}, {60, 255, 0}, {61, 255, 0}, {62, 255, 0}, {63, 255, 0}, {64, 255, 0}, {65, 255, 0}, {66, 255, 0}, {67, 255, 0}, {68, 255, 0}, {69, 255, 0}, {70, 255, 0}, {71, 255, 0}, {72, 255, 0}, {73, 255, 0}, {74, 255, 0}, {75, 255, 0}, {76, 255, 0}, {77, 255, 0}, {78, 255, 0}, {79, 255, 0}, {80, 255, 0}, {81, 255, 0}, {82, 255, 0}, {83, 255, 0}, {84, 255, 0}, {85, 255, 0}, {86, 255, 0}, {87, 255, 0}, {88, 255, 0}, {89, 255, 0}, {90, 255, 0}, {91, 255, 0}, {92, 255, 0}, {93, 255, 0}, {94, 255, 0}, {95, 255, 0}, {96, 255, 0}, {97, 255, 0}, {98, 255, 0}, {99, 255, 0}, {100, 255, 0}, {101, 255, 0}, {102, 255, 0}, {103, 255, 0}, {104, 255, 0}, {105, 255, 0}, {106, 255, 0}, {107, 255, 0}, {108, 255, 0}, {109, 255, 0}, {110, 255, 0}, {111, 255, 0}, {112, 255, 0}, {113, 255, 0}, {114, 255, 0}, {115, 255, 0}, {116, 255, 0}, {117, 255, 0}, {118, 255, 0}, {119, 255, 0}, {120, 255, 0}, {121, 255, 0}, {122, 255, 0}, {123, 255, 0}, {124, 255, 0}, {125, 255, 0}, {126, 255, 0}, {127, 255, 0}, {128, 255, 0}, {129, 255, 0}, {130, 255, 0}, {131, 255, 0}, {132, 255, 0}, {133, 255, 0}, {134, 255, 0}, {135, 255, 0}, {136, 255, 0}, {137, 255, 0}, {138, 255, 0}, {139, 255, 0}, {140, 255, 0}, {141, 255, 0}, {142, 255, 0}, {143, 255, 0}, {144, 255, 0}, {145, 255, 0}, {146, 255, 0}, {147, 255, 0}, {148, 255, 0}, {149, 255, 0}, {150, 255, 0}, {151, 255, 0}, {152, 255, 0}, {153, 255, 0}, {154, 255, 0}, {155, 255, 0}, {156, 255, 0}, {157, 255, 0}, {158, 255, 0}, {159, 255, 0}, {160, 255, 0}, {161, 255, 0}, {162, 255, 0}, {163, 255, 0}, {164, 255, 0}, {165, 255, 0}, {166, 255, 0}, {167, 255, 0}, {168, 255, 0}, {169, 255, 0}, {170, 255, 0}, {171, 255, 0}, {172, 255, 0}, {173, 255, 0}, {174, 255, 0}, {175, 255, 0}, {176, 255, 0}, {177, 255, 0}, {178, 255, 0}, {179, 255, 0}, {180, 255, 0}, {181, 255, 0}, {182, 255, 0}, {183, 255, 0}, {184, 255, 0}, {185, 255, 0}, {186, 255, 0}, {187, 255, 0}, {188, 255, 0}, {189, 255, 0}, {190, 255, 0}, {191, 255, 0}, {192, 255, 0}, {193, 255, 0}, {194, 255, 0}, {195, 255, 0}, {196, 255, 0}, {197, 255, 0}, {198, 255, 0}, {199, 255, 0}, {200, 255, 0}, {201, 255, 0}, {202, 255, 0}, {203, 255, 0}, {204, 255, 0}, {205, 255, 0}, {206, 255, 0}, {207, 255, 0}, {208, 255, 0}, {209, 255, 0}, {210, 255, 0}, {211, 255, 0}, {212, 255, 0}, {213, 255, 0}, {214, 255, 0}, {215, 255, 0}, {216, 255, 0}, {217, 255, 0}, {218, 255, 0}, {219, 255, 0}, {220, 255, 0}, {221, 255, 0}, {222, 255, 0}, {223, 255, 0}, {224, 255, 0}, {225, 255, 0}, {226, 255, 0}, {227, 255, 0}, {228, 255, 0}, {229, 255, 0}, {230, 255, 0}, {231, 255, 0}, {232, 255, 0}, {233, 255, 0}, {234, 255, 0}, {235, 255, 0}, {236, 255, 0}, {237, 255, 0}, {238, 255, 0}, {239, 255, 0}, {240, 255, 0}, {241, 255, 0}, {242, 255, 0}, {243, 255, 0}, {244, 255, 0}, {245, 255, 0}, {246, 255, 0}, {247, 255, 0}, {248, 255, 0}, {249, 255, 0}, {250, 255, 0}, {251, 255, 0}, {252, 255, 0}, {253, 255, 0}, {254, 255, 0}, {255, 255, 0}, {255, 254, 0}, {255, 253, 0}, {255, 252, 0}, {255, 251, 0}, {255, 250, 0}, {255, 249, 0}, {255, 248, 0}, {255, 247, 0}, {255, 246, 0}, {255, 245, 0}, {255, 244, 0}, {255, 243, 0}, {255, 242, 0}, {255, 241, 0}, {255, 240, 0}, {255, 239, 0}, {255, 238, 0}, {255, 237, 0}, {255, 236, 0}, {255, 235, 0}, {255, 234, 0}, {255, 233, 0}, {255, 232, 0}, {255, 231, 0}, {255, 230, 0}, {255, 229, 0}, {255, 228, 0}, {255, 227, 0}, {255, 226, 0}, {255, 225, 0}, {255, 224, 0}, {255, 223, 0}, {255, 222, 0}, {255, 221, 0}, {255, 220, 0}, {255, 219, 0}, {255, 218, 0}, {255, 217, 0}, {255, 216, 0}, {255, 215, 0}, {255, 214, 0}, {255, 213, 0}, {255, 212, 0}, {255, 211, 0}, {255, 210, 0}, {255, 209, 0}, {255, 208, 0}, {255, 207, 0}, {255, 206, 0}, {255, 205, 0}, {255, 204, 0}, {255, 203, 0}, {255, 202, 0}, {255, 201, 0}, {255, 200, 0}, {255, 199, 0}, {255, 198, 0}, {255, 197, 0}, {255, 196, 0}, {255, 195, 0}, {255, 194, 0}, {255, 193, 0}, {255, 192, 0}, {255, 191, 0}, {255, 190, 0}, {255, 189, 0}, {255, 188, 0}, {255, 187, 0}, {255, 186, 0}, {255, 185, 0}, {255, 184, 0}, {255, 183, 0}, {255, 182, 0}, {255, 181, 0}, {255, 180, 0}, {255, 179, 0}, {255, 178, 0}, {255, 177, 0}, {255, 176, 0}, {255, 175, 0}, {255, 174, 0}, {255, 173, 0}, {255, 172, 0}, {255, 171, 0}, {255, 170, 0}, {255, 169, 0}, {255, 168, 0}, {255, 167, 0}, {255, 166, 0}, {255, 165, 0}, {255, 164, 0}, {255, 163, 0}, {255, 162, 0}, {255, 161, 0}, {255, 160, 0}, {255, 159, 0}, {255, 158, 0}, {255, 157, 0}, {255, 156, 0}, {255, 155, 0}, {255, 154, 0}, {255, 153, 0}, {255, 152, 0}, {255, 151, 0}, {255, 150, 0}, {255, 149, 0}, {255, 148, 0}, {255, 147, 0}, {255, 146, 0}, {255, 145, 0}, {255, 144, 0}, {255, 143, 0}, {255, 142, 0}, {255, 141, 0}, {255, 140, 0}, {255, 139, 0}, {255, 138, 0}, {255, 137, 0}, {255, 136, 0}, {255, 135, 0}, {255, 134, 0}, {255, 133, 0}, {255, 132, 0}, {255, 131, 0}, {255, 130, 0}, {255, 129, 0}, {255, 128, 0}, {255, 127, 0}, {255, 126, 0}, {255, 125, 0}, {255, 124, 0}, {255, 123, 0}, {255, 122, 0}, {255, 121, 0}, {255, 120, 0}, {255, 119, 0}, {255, 118, 0}, {255, 117, 0}, {255, 116, 0}, {255, 115, 0}, {255, 114, 0}, {255, 113, 0}, {255, 112, 0}, {255, 111, 0}, {255, 110, 0}, {255, 109, 0}, {255, 108, 0}, {255, 107, 0}, {255, 106, 0}, {255, 105, 0}, {255, 104, 0}, {255, 103, 0}, {255, 102, 0}, {255, 101, 0}, {255, 100, 0}, {255, 99, 0}, {255, 98, 0}, {255, 97, 0}, {255, 96, 0}, {255, 95, 0}, {255, 94, 0}, {255, 93, 0}, {255, 92, 0}, {255, 91, 0}, {255, 90, 0}, {255, 89, 0}, {255, 88, 0}, {255, 87, 0}, {255, 86, 0}, {255, 85, 0}, {255, 84, 0}, {255, 83, 0}, {255, 82, 0}, {255, 81, 0}, {255, 80, 0}, {255, 79, 0}, {255, 78, 0}, {255, 77, 0}, {255, 76, 0}, {255, 75, 0}, {255, 74, 0}, {255, 73, 0}, {255, 72, 0}, {255, 71, 0}, {255, 70, 0}, {255, 69, 0}, {255, 68, 0}, {255, 67, 0}, {255, 66, 0}, {255, 65, 0}, {255, 64, 0}, {255, 63, 0}, {255, 62, 0}, {255, 61, 0}, {255, 60, 0}, {255, 59, 0}, {255, 58, 0}, {255, 57, 0}, {255, 56, 0}, {255, 55, 0}, {255, 54, 0}, {255, 53, 0}, {255, 52, 0}, {255, 51, 0}, {255, 50, 0}, {255, 49, 0}, {255, 48, 0}, {255, 47, 0}, {255, 46, 0}, {255, 45, 0}, {255, 44, 0}, {255, 43, 0}, {255, 42, 0}, {255, 41, 0}, {255, 40, 0}, {255, 39, 0}, {255, 38, 0}, {255, 37, 0}, {255, 36, 0}, {255, 35, 0}, {255, 34, 0}, {255, 33, 0}, {255, 32, 0}, {255, 31, 0}, {255, 30, 0}, {255, 29, 0}, {255, 28, 0}, {255, 27, 0}, {255, 26, 0}, {255, 25, 0}, {255, 24, 0}, {255, 23, 0}, {255, 22, 0}, {255, 21, 0}, {255, 20, 0}, {255, 19, 0}, {255, 18, 0}, {255, 17, 0}, {255, 16, 0}, {255, 15, 0}, {255, 14, 0}, {255, 13, 0}, {255, 12, 0}, {255, 11, 0}, {255, 10, 0}, {255, 9, 0}, {255, 8, 0}, {255, 7, 0}, {255, 6, 0}, {255, 5, 0}, {255, 4, 0}, {255, 3, 0}, {255, 2, 0}, {255, 1, 0}, {255, 0, 0} }; static const int EosACount = 256; static const QString EosAName = "EOS-A"; static unsigned char EosA[257][3] = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {127, 127, 127}, {123, 0, 193}, {119, 0, 195}, {114, 0, 197}, {110, 0, 199}, {106, 0, 201}, {102, 0, 204}, {97, 0, 206}, {84, 0, 187}, {80, 0, 189}, {76, 0, 191}, {80, 0, 214}, {76, 0, 216}, {72, 0, 218}, {67, 0, 221}, {63, 0, 223}, {59, 0, 225}, {55, 0, 227}, {45, 0, 206}, {42, 0, 208}, {38, 0, 210}, {38, 0, 235}, {33, 0, 238}, {29, 0, 240}, {25, 0, 242}, {21, 0, 244}, {16, 0, 246}, {12, 0, 248}, {7, 0, 225}, {3, 0, 227}, {0, 0, 229}, {0, 17, 255}, {0, 34, 255}, {0, 51, 255}, {0, 68, 255}, {0, 85, 255}, {0, 102, 255}, {0, 119, 255}, {0, 122, 229}, {0, 137, 229}, {0, 153, 229}, {0, 187, 255}, {0, 204, 255}, {0, 221, 255}, {0, 238, 255}, {0, 255, 255}, {0, 255, 238}, {0, 255, 221}, {0, 229, 183}, {0, 229, 168}, {0, 229, 152}, {0, 255, 153}, {0, 255, 135}, {0, 255, 118}, {0, 255, 101}, {0, 255, 84}, {0, 255, 67}, {0, 255, 50}, {0, 229, 30}, {0, 229, 15}, {0, 229, 0}, {8, 255, 0}, {17, 255, 0}, {25, 255, 0}, {34, 255, 0}, {42, 255, 0}, {51, 255, 0}, {59, 255, 0}, {61, 229, 0}, {68, 229, 0}, {76, 229, 0}, {93, 255, 0}, {102, 255, 0}, {110, 255, 0}, {119, 255, 0}, {127, 255, 0}, {136, 255, 0}, {144, 255, 0}, {137, 229, 0}, {145, 229, 0}, {153, 229, 0}, {178, 255, 0}, {187, 255, 0}, {195, 255, 0}, {204, 255, 0}, {212, 255, 0}, {221, 255, 0}, {229, 255, 0}, {214, 229, 0}, {221, 229, 0}, {229, 229, 0}, {255, 250, 0}, {255, 246, 0}, {255, 242, 0}, {255, 238, 0}, {255, 233, 0}, {255, 229, 0}, {255, 225, 0}, {229, 198, 0}, {229, 195, 0}, {229, 191, 0}, {255, 208, 0}, {255, 204, 0}, {255, 199, 0}, {255, 195, 0}, {255, 191, 0}, {255, 187, 0}, {255, 182, 0}, {229, 160, 0}, {229, 156, 0}, {229, 152, 0}, {255, 165, 0}, {255, 161, 0}, {255, 157, 0}, {255, 153, 0}, {255, 148, 0}, {255, 144, 0}, {255, 140, 0}, {229, 122, 0}, {229, 118, 0}, {229, 114, 0}, {255, 125, 0}, {255, 123, 0}, {255, 121, 0}, {255, 119, 0}, {255, 116, 0}, {255, 114, 0}, {255, 112, 0}, {229, 99, 0}, {229, 97, 0}, {229, 95, 0}, {255, 104, 0}, {255, 102, 0}, {255, 99, 0}, {255, 97, 0}, {255, 95, 0}, {255, 93, 0}, {255, 91, 0}, {229, 80, 0}, {229, 78, 0}, {229, 76, 0}, {255, 82, 0}, {255, 80, 0}, {255, 78, 0}, {255, 76, 0}, {255, 74, 0}, {255, 72, 0}, {255, 70, 0}, {229, 61, 0}, {229, 59, 0}, {229, 57, 0}, {255, 61, 0}, {255, 59, 0}, {255, 57, 0}, {255, 55, 0}, {255, 53, 0}, {255, 50, 0}, {255, 48, 0}, {229, 42, 0}, {229, 40, 0}, {229, 38, 0}, {255, 40, 0}, {255, 38, 0}, {255, 36, 0}, {255, 33, 0}, {255, 31, 0}, {255, 29, 0}, {255, 27, 0}, {229, 22, 0}, {229, 21, 0}, {229, 19, 0}, {255, 19, 0}, {255, 16, 0}, {255, 14, 0}, {255, 12, 0}, {255, 13, 0}, {255, 8, 0}, {255, 6, 0}, {229, 3, 0}, {229, 1, 0}, {229, 0, 0}, {253, 0, 0}, {251, 0, 0}, {249, 0, 0}, {248, 0, 0}, {246, 0, 0}, {244, 0, 0}, {242, 0, 0}, {217, 0, 0}, {215, 0, 0}, {213, 0, 0}, {236, 0, 0}, {234, 0, 0}, {232, 0, 0}, {230, 0, 0}, {229, 0, 0}, {227, 0, 0}, {225, 0, 0}, {201, 0, 0}, {200, 0, 0}, {198, 0, 0}, {218, 0, 0}, {217, 0, 0}, {215, 0, 0}, {213, 0, 0}, {211, 0, 0}, {210, 0, 0}, {208, 0, 0}, {186, 0, 0}, {184, 0, 0}, {182, 0, 0}, {201, 0, 0}, {199, 0, 0}, {198, 0, 0}, {196, 0, 0}, {194, 0, 0}, {192, 0, 0}, {191, 0, 0}, {170, 0, 0}, {169, 0, 0}, {167, 0, 0}, {184, 0, 0}, {182, 0, 0}, {180, 0, 0}, {179, 0, 0}, {177, 0, 0}, {175, 0, 0}, {174, 0, 0}, {155, 0, 0}, {153, 0, 0}, {151, 0, 0}, {167, 0, 0}, {165, 0, 0}, {163, 0, 0}, {161, 0, 0}, {160, 0, 0}, {158, 0, 0}, {156, 0, 0}, {139, 0, 0}, {138, 0, 0}, {136, 0, 0}, {149, 0, 0}, {148, 0, 0}, {146, 0, 0}, {144, 0, 0}, {143, 0, 0}, {141, 0, 0}, {139, 0, 0}, {124, 0, 0}, {122, 0, 0}, {120, 0, 0}, {132, 0, 0}, {130, 0, 0}, {130, 0, 0} }; static const int EosBCount = 256; static const QString EosBName = "EOS-B"; static unsigned char EosB[257][3] = { {0, 0, 0}, {255, 255, 255}, {255, 255, 255}, {127, 127, 127}, {0, 0, 131}, {0, 0, 136}, {0, 0, 140}, {0, 0, 144}, {0, 0, 148}, {0, 0, 153}, {0, 0, 157}, {0, 0, 145}, {0, 0, 149}, {0, 0, 170}, {0, 0, 174}, {0, 0, 178}, {0, 0, 182}, {0, 0, 187}, {0, 0, 191}, {0, 0, 195}, {0, 0, 199}, {0, 0, 183}, {0, 0, 187}, {0, 0, 212}, {0, 0, 216}, {0, 0, 221}, {0, 0, 225}, {0, 0, 229}, {0, 0, 233}, {0, 0, 238}, {0, 0, 242}, {0, 0, 221}, {0, 0, 225}, {0, 0, 255}, {0, 7, 247}, {0, 15, 239}, {0, 23, 231}, {0, 31, 223}, {0, 39, 215}, {0, 47, 207}, {0, 55, 199}, {0, 57, 172}, {0, 64, 164}, {0, 79, 175}, {0, 87, 167}, {0, 95, 159}, {0, 103, 151}, {0, 111, 143}, {0, 119, 135}, {0, 127, 127}, {0, 135, 119}, {0, 129, 100}, {0, 136, 93}, {0, 159, 95}, {0, 167, 87}, {0, 175, 79}, {0, 183, 71}, {0, 191, 63}, {0, 199, 55}, {0, 207, 47}, {0, 215, 39}, {0, 200, 28}, {0, 207, 21}, {0, 239, 15}, {0, 247, 7}, {0, 255, 0}, {9, 255, 0}, {18, 255, 0}, {27, 255, 0}, {36, 255, 0}, {45, 255, 0}, {49, 229, 0}, {57, 229, 0}, {72, 255, 0}, {81, 255, 0}, {91, 255, 0}, {100, 255, 0}, {109, 255, 0}, {118, 255, 0}, {127, 255, 0}, {136, 255, 0}, {131, 229, 0}, {139, 229, 0}, {163, 255, 0}, {173, 255, 0}, {182, 255, 0}, {191, 255, 0}, {200, 255, 0}, {209, 255, 0}, {218, 255, 0}, {227, 255, 0}, {213, 229, 0}, {221, 229, 0}, {255, 255, 0}, {255, 250, 0}, {255, 246, 0}, {255, 242, 0}, {255, 238, 0}, {255, 233, 0}, {255, 229, 0}, {255, 225, 0}, {229, 198, 0}, {229, 195, 0}, {255, 212, 0}, {255, 208, 0}, {255, 204, 0}, {255, 199, 0}, {255, 195, 0}, {255, 191, 0}, {255, 187, 0}, {255, 182, 0}, {229, 160, 0}, {229, 156, 0}, {255, 169, 0}, {255, 165, 0}, {255, 161, 0}, {255, 157, 0}, {255, 153, 0}, {255, 148, 0}, {255, 144, 0}, {255, 140, 0}, {229, 122, 0}, {229, 118, 0}, {255, 127, 0}, {255, 125, 0}, {255, 123, 0}, {255, 121, 0}, {255, 119, 0}, {255, 116, 0}, {255, 114, 0}, {255, 112, 0}, {229, 99, 0}, {229, 97, 0}, {255, 106, 0}, {255, 104, 0}, {255, 102, 0}, {255, 99, 0}, {255, 97, 0}, {255, 95, 0}, {255, 93, 0}, {255, 91, 0}, {229, 80, 0}, {229, 78, 0}, {255, 84, 0}, {255, 82, 0}, {255, 80, 0}, {255, 78, 0}, {255, 76, 0}, {255, 74, 0}, {255, 72, 0}, {255, 70, 0}, {229, 61, 0}, {229, 59, 0}, {255, 63, 0}, {255, 61, 0}, {255, 59, 0}, {255, 57, 0}, {255, 55, 0}, {255, 53, 0}, {255, 50, 0}, {255, 48, 0}, {229, 42, 0}, {229, 40, 0}, {255, 42, 0}, {255, 40, 0}, {255, 38, 0}, {255, 36, 0}, {255, 33, 0}, {255, 31, 0}, {255, 29, 0}, {255, 27, 0}, {229, 22, 0}, {229, 21, 0}, {255, 21, 0}, {255, 19, 0}, {255, 16, 0}, {255, 14, 0}, {255, 12, 0}, {255, 13, 0}, {255, 8, 0}, {255, 6, 0}, {229, 3, 0}, {229, 1, 0}, {255, 0, 0}, {253, 0, 0}, {251, 0, 0}, {249, 0, 0}, {247, 0, 0}, {245, 0, 0}, {243, 0, 0}, {241, 0, 0}, {215, 0, 0}, {214, 0, 0}, {235, 0, 0}, {234, 0, 0}, {232, 0, 0}, {230, 0, 0}, {228, 0, 0}, {226, 0, 0}, {224, 0, 0}, {222, 0, 0}, {198, 0, 0}, {196, 0, 0}, {216, 0, 0}, {215, 0, 0}, {213, 0, 0}, {211, 0, 0}, {209, 0, 0}, {207, 0, 0}, {205, 0, 0}, {203, 0, 0}, {181, 0, 0}, {179, 0, 0}, {197, 0, 0}, {196, 0, 0}, {194, 0, 0}, {192, 0, 0}, {190, 0, 0}, {188, 0, 0}, {186, 0, 0}, {184, 0, 0}, {164, 0, 0}, {162, 0, 0}, {178, 0, 0}, {176, 0, 0}, {175, 0, 0}, {173, 0, 0}, {171, 0, 0}, {169, 0, 0}, {167, 0, 0}, {165, 0, 0}, {147, 0, 0}, {145, 0, 0}, {159, 0, 0}, {157, 0, 0}, {156, 0, 0}, {154, 0, 0}, {152, 0, 0}, {150, 0, 0}, {148, 0, 0}, {146, 0, 0}, {130, 0, 0}, {128, 0, 0}, {140, 0, 0}, {138, 0, 0}, {137, 0, 0}, {135, 0, 0}, {133, 0, 0}, {131, 0, 0}, {129, 0, 0}, {127, 0, 0}, {113, 0, 0}, {111, 0, 0}, {121, 0, 0}, {119, 0, 0}, {117, 0, 0}, {117, 0, 0}, }; } #endif Kst-2.0.8/src/libkstmath/equation.h0000644000175000017500000000654712362701575016331 0ustar synthsynth/*************************************************************************** equation.h: Equation for KST ------------------- begin : Fri Feb 10 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling equations for kst *@author C. Barth Netterfield */ #ifndef EQUATION_H #define EQUATION_H #include "dataobject.h" #include "objectfactory.h" #include "kstmath_export.h" #define MAX_DIV_REG 100 class QXmlStreamWriter; namespace Equations { class Node; } namespace Kst { class ObjectStore; class KSTMATH_EXPORT Equation : public DataObject { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; void attach(); void save(QXmlStreamWriter &s); QString propertyString() const; /** equations used to edit the vector */ void setEquation(const QString &Equation); void setExistingXVector(VectorPtr xvector, bool do_interp); const QString& equation() const { return _equation; } const QString reparsedEquation() const; void updateVectorLabels(); VectorPtr vXIn() const { return _xInVector; } VectorPtr vX() const { return _xOutVector; } VectorPtr vY() const { return _yOutVector; } bool doInterp() const { return _doInterp; } bool isValid(); void showNewDialog(); void showEditDialog(); const CurveHintList *curveHints() const; DataObjectPtr makeDuplicate() const; bool uses(ObjectPtr p) const; virtual QString descriptionTip() const; virtual void internalUpdate(); virtual PrimitiveList inputPrimitives() const; virtual void replaceInput(PrimitivePtr p, PrimitivePtr new_p); virtual ScriptInterface* createScriptInterface(); protected: Equation(ObjectStore *store); ~Equation(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; QString readableEquation(const QString &equation) const; QByteArray parseableEquation() const; private: QString _equation; VectorMap VectorsUsed; ScalarMap ScalarsUsed; bool FillY(bool force = false); bool _isValid : 1; bool _doInterp : 1; int _numNew, _numShifted, _interp, _ns; VectorPtr _xInVector, _xOutVector, _yOutVector; Equations::Node *_pe; }; typedef SharedPtr EquationPtr; typedef ObjectList EquationList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/image.h0000644000175000017500000001311212362701575015550 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 by University of British Columbia * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef IMAGE_H #define IMAGE_H #include "matrix.h" #include "relation.h" #include "kstmath_export.h" #include "palette.h" #include "labelinfo.h" #include namespace Kst { class ObjectStore; class CoutourLineDetails { public: CoutourLineDetails() { } CoutourLineDetails(QLine line, int width) { _line = line; _lineWidth = width; } QLine _line; int _lineWidth; }; /**A class for handling images for Kst *@author University of British Columbia */ class KSTMATH_EXPORT Image : public Relation { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; virtual void showNewDialog(); virtual void showEditDialog(); virtual void save(QXmlStreamWriter &s); virtual void internalUpdate(); virtual QString propertyString() const; virtual bool getNearestZ(double x, double y, double& z, QPointF &matchedPoint); virtual QColor getMappedColor(double z); virtual void setPalette(const QString &palname); virtual void setUpperThreshold(double z); virtual void setLowerThreshold(double z); virtual void setAutoThreshold(bool yes); virtual void setThresholdToSpikeInsensitive(double per = 0.005); virtual double upperThreshold() const { return _zUpper; } virtual double lowerThreshold() const { return _zLower; } virtual bool autoThreshold() const { return _autoThreshold; } virtual void setMatrix(MatrixPtr in_matrix); virtual MatrixPtr matrix() const; virtual QString paletteName() const; virtual const Palette &palette() const { return _pal; } virtual void matrixDimensions(double &x, double &y, double &width, double &height); virtual void changeToColorOnly(MatrixPtr in_matrix, double lowerZ, double upperZ, bool autoThreshold, const QString &paletteName); virtual void changeToContourOnly(MatrixPtr in_matrix, int numContours, const QColor& contourColor, int contourWeight); virtual void changeToColorAndContour(MatrixPtr in_matrix, double lowerZ, double upperZ, bool autoThreshold, const QString &paletteName, int numContours, const QColor& contourColor, int contourWeight); //contour lines virtual int numContourLines() const { return _numContourLines; } virtual QList contourLines() const { return _contourLines; } virtual bool addContourLine(double line); virtual bool removeContourLine(double line); virtual void clearContourLines(); virtual const QColor& contourColor() const { return _contourColor; } virtual int contourWeight() const { return _contourWeight; } // a contour weight of -1 means variable weight //other properties virtual bool hasContourMap() const { return _hasContourMap; } virtual bool hasColorMap() const { return _hasColorMap; } // labels for plots virtual LabelInfo xLabelInfo() const; virtual LabelInfo yLabelInfo() const; virtual LabelInfo titleInfo() const; virtual RelationPtr makeDuplicate() const; // see KstRelation::distanceToPoint virtual double distanceToPoint(double xpos, double dx, double ypos) const; // see KstRelation::paint void paintObjects(const CurveRenderContext& context); // Update the curve details. void updatePaintObjects(const CurveRenderContext& context); // see KstRelation::yRange virtual void yRange(double xFrom, double xTo, double* yMin, double* yMax); // see KstRelation::paintLegendSymbol virtual QSize legendSymbolSize(QPainter *p); virtual void paintLegendSymbol(QPainter *p, const QSize &size); virtual bool symbolLabelOnTop() {return true;} virtual QString descriptionTip() const; virtual bool invertXHint() const; virtual bool invertYHint() const; virtual ScriptInterface* createScriptInterface(); protected: Image(ObjectStore *store); virtual ~Image(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); private: //use these to set defaults when either is not used. void setColorDefaults(); void setContourDefaults(); Palette _pal; //upper and lower thresholds double _zUpper; double _zLower; bool _autoThreshold; bool _hasColorMap; bool _hasContourMap; int _numContourLines; QList _contourLines; QColor _contourColor; int _contourWeight; //_contourWeight = -1 means variable weight QVector _lines; QImage _image; QPoint _imageLocation; }; typedef SharedPtr ImagePtr; typedef ObjectList ImageList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/objectfactory.h0000644000175000017500000000277612277111530017331 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef OBJECTFACTORY_H #define OBJECTFACTORY_H #include #include #include "dataobject.h" #include "kstmath_export.h" namespace Kst { class ObjectStore; class ObjectFactory { public: ObjectFactory(); virtual ~ObjectFactory(); // This takes ownership static void registerFactory(const QString& node, ObjectFactory *factory); static void registerFactory(const QStringList& nodes, ObjectFactory *factory); KSTMATH_EXPORT static DataObjectPtr parse(ObjectStore *store, QXmlStreamReader& stream); virtual DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream) = 0; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/colorsequence.h0000644000175000017500000000343312277111530017331 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2003 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef COLORSEQUENCE_H #define COLORSEQUENCE_H #include "kstmath_export.h" #include "nextcolor.h" #include "curve.h" class KPalette; namespace Kst { class KSTMATH_EXPORT ColorSequence : public NextColor { public: enum ColorMode { MonoChrome, GrayScale, Color }; void createPalette(); QColor next(); QColor current(); QColor next(const QColor& badColor); QColor next(const CurveList& Curves, const QColor& badColor); bool colorsTooClose(const QColor& color, const QColor& badColor); ColorMode colorMode(); void setColorMode(ColorMode mode); int count(); void reset(); QColor entry(int ptr); static ColorSequence& self(); private: ColorSequence(); ~ColorSequence(); static ColorSequence* _self; static void cleanup(); QHash _pal; int _count; int _ptr; // pointer to the next color ColorMode _mode; QString _palette; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/equationfactory.cpp0000644000175000017500000000615212277111530020233 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "equationfactory.h" #include "debug.h" #include "equation.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { EquationFactory::EquationFactory() : ObjectFactory() { registerFactory(Equation::staticTypeTag, this); } EquationFactory::~EquationFactory() { } DataObjectPtr EquationFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { QString tag, expression, xVector, output, descriptiveName; bool interpolate = false; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == "equation") { QXmlStreamAttributes attrs = xml.attributes(); tag = attrs.value("tag").toString(); expression = attrs.value("expression").toString(); interpolate = attrs.value("interpolate").toString().toLower() == "true"; xVector = attrs.value("xvector").toString(); output = attrs.value("output").toString(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); //FIXME Don't know if this is a bug in QXmlStreamReader or what, but readElementNext takes us //past the node to the node... //eq = xml.readElementText(); } else { return 0; } } else if (xml.isEndElement()) { if (n == "equation") { break; } else { Debug::self()->log(QObject::tr("Error creating equation from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr vector = 0; if (store && !xVector.isEmpty()) { vector = kst_cast(store->retrieveObject(xVector)); } if (!vector) { Debug::self()->log(QObject::tr("Error creating equation from Kst file. Could not find xVector."), Debug::Warning); return 0; } EquationPtr equation = store->createObject(); Q_ASSERT(equation); equation->setEquation(expression); equation->setExistingXVector(vector, interpolate); equation->setDescriptiveName(descriptiveName); equation->writeLock(); equation->registerChange(); equation->unlock(); return equation; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/enodes.h0000644000175000017500000001616012277111530015740 0ustar synthsynth/*************************************************************************** enodes.h ---------- begin : Feb 12 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ENODES_H #define ENODES_H #include "string_kst.h" #include "vector.h" #include "kstmath_export.h" #include "objectstore.h" #define EQ_FALSE 0.0 #define EQ_TRUE 1.0 namespace Equations { /* Global lock for the parser */ KSTMATH_EXPORT QMutex& mutex(); /* Evaluate the expression @p txt and returns the value as a double. * Returns the value, or 0.0 and sets ok = false on error. */ KSTMATH_EXPORT double interpret(Kst::ObjectStore *store, const char *txt, bool *ok = 0L, int len = -1); class KSTMATH_EXPORT Context { public: Context() : i(0), x(0.0), xVector(0L), noPoint(0.0), sampleCount(0) {} ~Context() {} long i; double x; Kst::VectorPtr xVector; double noPoint; long sampleCount; }; class NodeVisitor; class KSTMATH_EXPORT Node { public: Node(); virtual ~Node(); virtual bool isConst() = 0; // can't be const virtual bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); virtual bool takeVectors(const Kst::VectorMap& c); virtual double value(Context*) = 0; virtual void visit(NodeVisitor*); virtual Kst::Object::UpdateType update(Context *ctx); virtual QString text() const = 0; void parenthesize() { _parentheses = true; } protected: bool _parentheses; }; class KSTMATH_EXPORT BinaryNode : public Node { public: BinaryNode(Node *left, Node *right); virtual ~BinaryNode(); virtual bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); virtual bool takeVectors(const Kst::VectorMap& c); virtual void visit(NodeVisitor*); virtual Kst::Object::UpdateType update(Context *ctx); Node *& left(); Node *& right(); virtual QString text() const = 0; protected: Node *_left, *_right; }; class KSTMATH_EXPORT ArgumentList : public Node { friend class Function; public: ArgumentList(); virtual ~ArgumentList(); void appendArgument(Node *arg); // Makes no sense for this type double value(Context*) { return 0.0; } bool isConst(); bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); bool takeVectors(const Kst::VectorMap& c); double at(int, Context*); Node *node(int idx); Kst::Object::UpdateType update(Context *ctx); QString text() const; protected: QList _args; }; class KSTMATH_EXPORT Function : public Node { public: Function(char *name, ArgumentList *args); ~Function(); bool isConst(); double value(Context*); bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); bool takeVectors(const Kst::VectorMap& c); Kst::Object::UpdateType update(Context *ctx); QString text() const; protected: char *_name; ArgumentList *_args; void *_f; private: int _inputVectorCnt; int _inPid, _outputVectorCnt; int *_inArrayLens, *_outArrayLens; double *_inScalars, *_outScalars; double **_inVectors, **_outVectors; int _outputIndex; // -1 = scalar 0, -424242 = none/error, +0...n = vector void *_localData; int _argCount; }; class KSTMATH_EXPORT Number : public Node { public: explicit Number(double n); ~Number(); bool isConst(); double value(Context*); QString text() const; protected: double _n; }; class KSTMATH_EXPORT Identifier : public Node { public: explicit Identifier(char *name); ~Identifier(); bool isConst(); double value(Context*); const char *name() const; QString text() const; protected: char *_name; double *_const; }; class KSTMATH_EXPORT DataNode : public Node { friend class Function; public: DataNode(Kst::ObjectStore *store, char *name); ~DataNode(); bool isConst(); double value(Context*); bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); bool takeVectors(const Kst::VectorMap& c); Kst::Object::UpdateType update(Context *ctx); QString text() const; protected: Kst::ObjectStore *_store; QString _tagName; Kst::VectorPtr _vector; Kst::ScalarPtr _scalar; bool _isEquation; Node *_equation; QString _vectorIndex; }; class KSTMATH_EXPORT NodeVisitor { public: NodeVisitor(); virtual ~NodeVisitor(); virtual void visitNode(Node*) = 0; virtual void visitBinaryNode(BinaryNode*) = 0; }; class KSTMATH_EXPORT FoldVisitor : public NodeVisitor { public: FoldVisitor(Context*, Node**); ~FoldVisitor(); void visitNode(Node*); void visitBinaryNode(BinaryNode*); protected: Context *_ctx; }; class KSTMATH_EXPORT Negation : public Node { public: explicit Negation(Node *node); ~Negation(); bool isConst(); double value(Context*); QString text() const; bool collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t); protected: Node *_n; }; class KSTMATH_EXPORT LogicalNot : public Node { public: explicit LogicalNot(Node *node); ~LogicalNot(); bool isConst(); double value(Context*); QString text() const; protected: Node *_n; }; #define CreateNode(x) \ class KSTMATH_EXPORT x : public BinaryNode { \ public: \ x(Node *left, Node *right); \ ~x(); \ bool isConst(); \ double value(Context*); \ QString text() const; \ }; CreateNode(Addition) CreateNode(Subtraction) CreateNode(Multiplication) CreateNode(Division) CreateNode(Modulo) CreateNode(Power) CreateNode(BitwiseAnd) CreateNode(BitwiseOr) CreateNode(LogicalAnd) CreateNode(LogicalOr) CreateNode(LessThan) CreateNode(LessThanEqual) CreateNode(GreaterThan) CreateNode(GreaterThanEqual) CreateNode(EqualTo) CreateNode(NotEqualTo) #undef CreateNode } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/linestyle.h0000644000175000017500000000244512277111530016474 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 by University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #ifndef LINESTYLE_H #define LINESTYLE_H #include "kstmath_export.h" namespace Kst { KSTMATH_EXPORT extern const unsigned int LINESTYLE_MAXTYPE; KSTMATH_EXPORT extern Qt::PenStyle LineStyle[]; #define POINTDENSITY_MAXTYPE 4 #define LINEWIDTH_MAX 5 } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/equationfactory.h0000644000175000017500000000221712277111530017676 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EQUATIONFACTORY_H #define EQUATIONFACTORY_H #include "objectfactory.h" namespace Kst { class EquationFactory : public ObjectFactory { public: EquationFactory(); ~EquationFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/csdfactory.cpp0000644000175000017500000000740412362701575017171 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "csdfactory.h" #include "debug.h" #include "csd.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { CSDFactory::CSDFactory() : ObjectFactory() { registerFactory(CSD::staticTypeTag, this); } CSDFactory::~CSDFactory() { } DataObjectPtr CSDFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); double frequency=1.0, gaussianSigma=1.0; int length=8, windowSize=8, apodizeFunction=0, outputType=0; QString vectorName, vectorUnits, rateUnits, descriptiveName; bool average=false, removeMean=false, apodize=false; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == CSD::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); vectorName = attrs.value("vector").toString(); vectorUnits = attrs.value("vectorunits").toString(); rateUnits = attrs.value("rateunits").toString(); frequency = attrs.value("samplerate").toString().toDouble(); gaussianSigma = attrs.value("gaussiansigma").toString().toDouble(); length = attrs.value("fftlength").toString().toInt(); windowSize = attrs.value("windowsize").toString().toInt(); apodizeFunction = attrs.value("apodizefunction").toString().toInt(); outputType = attrs.value("outputtype").toString().toInt(); average = attrs.value("average").toString() == "true" ? true : false; removeMean = attrs.value("removemean").toString() == "true" ? true : false; apodize = attrs.value("apodize").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == CSD::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Spectrogram from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr vector = 0; if (store && !vectorName.isEmpty()) { vector = kst_cast(store->retrieveObject(vectorName)); } if (!vector) { Debug::self()->log(QObject::tr("Error creating Spectrogram from Kst file. Could not find Vector."), Debug::Warning); return 0; } CSDPtr csd = store->createObject(); csd->change(vector, frequency, average, removeMean, apodize, (ApodizeFunction)apodizeFunction, windowSize, length, gaussianSigma, (PSDType)outputType, vectorUnits, rateUnits); csd->setDescriptiveName(descriptiveName); csd->writeLock(); csd->registerChange(); csd->unlock(); return csd; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/doublecompare.h0000644000175000017500000000304012277111530017275 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DOUBLECOMPARE_H #define DOUBLECOMPARE_H #include #define SMALL_NON_ZERO 0.00000000001 template inline bool doubleEqual(const T& a, const T& b) { return a == b || fabs(a - b) < SMALL_NON_ZERO; } template inline bool doubleLessThan(const T& a, const T& b) { return b - a > SMALL_NON_ZERO; } template inline bool doubleLessThanEqual(const T& a, const T& b) { return doubleEqual(a, b) || doubleLessThan(a, b); } template inline bool doubleGreaterThan(const T& a, const T& b) { return a - b > SMALL_NON_ZERO; } template inline bool doubleGreaterThanEqual(const T& a, const T& b) { return doubleEqual(a, b) || doubleGreaterThan(a, b); } #endif Kst-2.0.8/src/libkstmath/psdfactory.cpp0000644000175000017500000000740412277111530017175 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "psdfactory.h" #include "debug.h" #include "psd.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { PSDFactory::PSDFactory() : ObjectFactory() { registerFactory(PSD::staticTypeTag, this); } PSDFactory::~PSDFactory() { } DataObjectPtr PSDFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); double frequency=1.0, gaussianSigma=1.0; int length=8, apodizeFunction=0, outputType=0; QString vectorName, vectorUnits, rateUnits, descriptiveName; bool average=false, removeMean=false, apodize=false, interpolateHoles=false; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == PSD::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); vectorName = attrs.value("vector").toString(); vectorUnits = attrs.value("vectorunits").toString(); rateUnits = attrs.value("rateunits").toString(); frequency = attrs.value("samplerate").toString().toDouble(); gaussianSigma = attrs.value("gaussiansigma").toString().toDouble(); length = attrs.value("fftlength").toString().toInt(); apodizeFunction = attrs.value("apodizefunction").toString().toInt(); outputType = attrs.value("outputtype").toString().toInt(); average = attrs.value("average").toString() == "true" ? true : false; interpolateHoles = attrs.value("interpolateholes").toString() == "true" ? true : false; removeMean = attrs.value("removemean").toString() == "true" ? true : false; apodize = attrs.value("apodize").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == PSD::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating PSD from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr vector = 0; if (store && !vectorName.isEmpty()) { vector = kst_cast(store->retrieveObject(vectorName)); } if (!vector) { Debug::self()->log(QObject::tr("Error creating PSD from Kst file. Could not find Vector."), Debug::Warning); return 0; } PSDPtr powerspectrum = store->createObject(); Q_ASSERT(powerspectrum); powerspectrum->writeLock(); powerspectrum->change(vector, frequency, average, length, apodize, removeMean, vectorUnits, rateUnits, (ApodizeFunction)apodizeFunction, gaussianSigma, (PSDType)outputType, interpolateHoles); powerspectrum->setDescriptiveName(descriptiveName); powerspectrum->registerChange(); powerspectrum->unlock(); return powerspectrum; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dataobjectscriptinterface.cpp0000644000175000017500000001744012362705136022234 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2012 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dataobjectscriptinterface.h" #include "objectstore.h" #include namespace Kst { /***************************/ /* dataobject commands */ /***************************/ QString DataObjectSI::setInputVector(QString& command) { QStringList vars = getArgs(command); QString key = vars.at(0); QString vec_name = vars.at(1); VectorPtr v = kst_cast(_dataObject->store()->retrieveObject(vec_name)); if (v) { _dataObject->setInputVector(key, v); return "Done"; } else { return QString("Vector %1 not found").arg(vec_name); } } QString DataObjectSI::setInputScalar(QString& command) { QStringList vars = getArgs(command); QString key = vars.at(0); QString x_name = vars.at(1); ScalarPtr x = kst_cast(_dataObject->store()->retrieveObject(x_name)); if (x) { _dataObject->setInputScalar(key, x); return "Done"; } else { return QString("Scalar %1 not found").arg(x_name); } } QString DataObjectSI::outputVector(QString& command) { QString key = getArg(command); VectorPtr vout = _dataObject->outputVector(key); if (vout) { return vout->shortName(); } else { return "Invalid"; } } QString DataObjectSI::outputScalar(QString& command) { QString key = getArg(command); ScalarPtr xout = _dataObject->outputScalar(key); if (xout) { return xout->shortName(); } else { return "Invalid"; } } /***************************/ /* PluginSI */ /***************************/ PluginSI::PluginSI(BasicPluginPtr plugin) { if (plugin) { _plugin = plugin; _dataObject = plugin; } else { _plugin = 0; _dataObject = 0; } _fnMap.insert("setInputVector",&PluginSI::setInputVector); _fnMap.insert("setInputScalar",&PluginSI::setInputScalar); _fnMap.insert("outputVector",&PluginSI::outputVector); _fnMap.insert("outputScalar",&PluginSI::outputScalar); } bool PluginSI::isValid() { return _plugin; } QByteArray PluginSI::endEditUpdate() { if (_plugin) { _plugin->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "%_plugin->Name()).toLatin1(); } else { return ("Finished editing invalid data object"); } } QString PluginSI::doCommand(QString command_in) { if (isValid()) { QString command = command_in.left(command_in.indexOf('(')); PluginInterfaceMemberFn fn=_fnMap.value(command,&PluginSI::noSuchFn); if(fn!=&PluginSI::noSuchFn) { return CALL_MEMBER_FN(*this,fn)(command_in); } QString v=doNamedObjectCommand(command_in, _plugin); if (!v.isEmpty()) { return v; } return "No such command"; } else { return "Invalid"; } } ScriptInterface* PluginSI::newPlugin(ObjectStore *store, QByteArray pluginName) { DataObjectConfigWidget* configWidget = DataObject::pluginWidget(pluginName); if (configWidget) { BasicPluginPtr plugin = kst_cast(DataObject::createPlugin(pluginName, store, configWidget)); return new PluginSI(kst_cast(plugin)); } return 0L; } /***************************/ /* EquationSI */ /***************************/ EquationSI::EquationSI(EquationPtr equation) { if (equation) { _equation = equation; _dataObject = equation; } else { _equation = 0; _dataObject = 0; } _fnMap.insert("setEquation",&EquationSI::setEquation); _fnMap.insert("equation",&EquationSI::equation); _fnMap.insert("setInputVector",&EquationSI::setInputVector); _fnMap.insert("setInputScalar",&EquationSI::setInputScalar); _fnMap.insert("outputVector",&EquationSI::outputVector); _fnMap.insert("outputScalar",&EquationSI::outputScalar); } bool EquationSI::isValid() { return _equation; } QByteArray EquationSI::endEditUpdate() { if (_equation) { _equation->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "%_equation->Name()).toLatin1(); } else { return ("Finished editing invalid equation"); } } QString EquationSI::doCommand(QString command_in) { if (isValid()) { QString command = command_in.left(command_in.indexOf('(')); EquationInterfaceMemberFn fn=_fnMap.value(command,&EquationSI::noSuchFn); if(fn!=&EquationSI::noSuchFn) { return CALL_MEMBER_FN(*this,fn)(command_in); } QString v=doNamedObjectCommand(command_in, _equation); if (!v.isEmpty()) { return v; } return "No such command"; } else { return "Invalid"; } } ScriptInterface* EquationSI::newEquation(ObjectStore *store) { EquationPtr equation = store->createObject(); return new EquationSI(equation); } QString EquationSI::equation(QString&) { if (_equation) { return _equation->equation(); } else { return "Invalid"; } } QString EquationSI::setEquation(QString& command) { if (_equation) { QString eq = getArg(command); _equation->setEquation(eq); return "done"; } else { return "Invalid"; } } /***************************/ /* SpectrumSI */ /***************************/ SpectrumSI::SpectrumSI(PSDPtr psd) { if (psd) { _psd = psd; _dataObject = psd; } else { _psd = 0; _dataObject = 0; } _fnMap.insert("setInputVector",&SpectrumSI::setInputVector); _fnMap.insert("setInputScalar",&SpectrumSI::setInputScalar); _fnMap.insert("outputVector",&SpectrumSI::outputVector); _fnMap.insert("outputScalar",&SpectrumSI::outputScalar); } bool SpectrumSI::isValid() { return _psd; } QByteArray SpectrumSI::endEditUpdate() { if (_psd) { _psd->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "%_psd->Name()).toLatin1(); } else { return ("Finished editing invalid spectrum"); } } QString SpectrumSI::doCommand(QString command_in) { if (isValid()) { QString command = command_in.left(command_in.indexOf('(')); SpectrumInterfaceMemberFn fn=_fnMap.value(command,&SpectrumSI::noSuchFn); if(fn!=&SpectrumSI::noSuchFn) { return CALL_MEMBER_FN(*this,fn)(command_in); } QString v=doNamedObjectCommand(command_in, _psd); if (!v.isEmpty()) { return v; } return "No such command"; } else { return "Invalid"; } } ScriptInterface* SpectrumSI::newSpectrum(ObjectStore *store) { PSDPtr psd = store->createObject(); return new SpectrumSI(psd); } QString SpectrumSI::change(QString& command) { /* if (_psd) { QStringList vars = getArgs(command); _psd->change(vector, sampleRate, interleavedAverage, FFTLength, apodize, removeMean, vectorUnits, rateUnits, apodizeFunction, sigma, output, interpolateOverHoles); return "done"; } else { return "Invalid"; } */ return "Invalid"; } } Kst-2.0.8/src/libkstmath/eventmonitorentry.h0000644000175000017500000000714312277111530020277 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EVENTMONITORENTRY_H #define EVENTMONITORENTRY_H #include #include "dataobject.h" #include "debug.h" namespace Equations { class Node; class Context; } namespace Kst { class KSTMATH_EXPORT EventMonitorEntry : public DataObject { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; void save(QXmlStreamWriter &s); QString propertyString() const; void showNewDialog(); void showEditDialog(); bool needToEvaluate(); bool isValid() { return _isValid; } void log(int idx); const QString& kstEvent() const { return _event; } const QString& description() const { return _description; } Debug::LogLevel level() const { return _level; } Equations::Node* expression() const { return _pExpression; } bool logDebug() const { return _logDebug; } bool logEMail() const { return _logEMail; } bool logELOG() const { return _logELOG; } const QString& eMailRecipients() const { return _eMailRecipients; } const QString& scriptCode() const; void setScriptCode(const QString& script); void setEvent(const QString& str); void setDescription(const QString& str); void setLevel(Debug::LogLevel level); void setExpression(Equations::Node* pExpression); void setLogDebug(bool logDebug); void setLogEMail(bool logEMail); void setLogELOG(bool logELOG); void setEMailRecipients(const QString& str); bool reparse(); DataObjectPtr makeDuplicate() const; bool uses(ObjectPtr p) const; virtual QString descriptionTip() const; virtual void internalUpdate(); protected: EventMonitorEntry(ObjectStore *store); ~EventMonitorEntry(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); bool event(QEvent *e); private slots: void doLog(const QString& logMessage) const; private: void logImmediately(bool sendEvent = true); static const QString OUTXVECTOR; static const QString OUTYVECTOR; VectorMap _vectorsUsed; QVector _indexArray; QString _event; QString _description; QString _eMailRecipients; Debug::LogLevel _level; Equations::Node* _pExpression; VectorMap::Iterator _xVector; VectorMap::Iterator _yVector; bool _logDebug; bool _logEMail; bool _logELOG; bool _isValid; int _numDone; QString _script; }; typedef SharedPtr EventMonitorEntryPtr; typedef ObjectList EventMonitorEntryList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/libkstmath.pro0000644000175000017500000000453012277111530017174 0ustar synthsynthTOPOUT_REL=../.. include($$PWD/$$TOPOUT_REL/kst.pri) TEMPLATE = lib CONFIG += dll DEFINES += BUILD_KSTMATH TARGET = $$kstlib(kst2math) DESTDIR = $$OUTPUT_DIR/lib !isEmpty(INSTALL_PREFIX) { target.path = $$INSTALL_PREFIX/$$INSTALL_LIBDIR INSTALLS += target } INCLUDEPATH += \ tmp \ $$TOPLEVELDIR/src/libkst \ $$OUTPUT_DIR/src/libkstmath/tmp macx { CONFIG += lib_bundle LIBS += -F$$OUTPUT_DIR/lib qtAddLibrary(kst2lib) } else { LIBS += \ -L$$OUTPUT_DIR/lib \ -l$$kstlib(kst2lib) } #Don't trigger qmake's lex/yacc handling by default. #Rather we want to use the files that are pre-generated and checked in. QMAKE_EXT_LEX = .lex QMAKE_EXT_YACC = .yacc SOURCES += \ basicplugin.cpp \ basicpluginfactory.cpp \ builtinobjects.cpp \ builtinrelations.cpp \ colorsequence.cpp \ csd.cpp \ csdfactory.cpp \ curve.cpp \ curvefactory.cpp \ curvehint.cpp \ curvepointsymbol.cpp \ dataobject.cpp \ dialoglauncher.cpp \ emailthread.cpp \ eparse.cpp \ eparse-eh.cpp \ enodes.cpp \ enodefactory.cpp \ escan.cpp \ equation.cpp \ equationfactory.cpp \ eventmonitorentry.cpp \ eventmonitorfactory.cpp \ fftsg_h.c \ histogram.cpp \ histogramfactory.cpp \ image.cpp \ imagefactory.cpp \ labelparser.cpp \ linestyle.cpp \ objectfactory.cpp \ painter.cpp \ palette.cpp \ psd.cpp \ psdcalculator.cpp \ psdfactory.cpp \ plottickcalculator.cpp \ relation.cpp \ relationfactory.cpp HEADERS += \ basicplugin.h \ basicpluginfactory.h \ builtinobjects.h \ builtinrelations.h \ builtinpalettes.h \ colorsequence.h \ csd.h \ csdfactory.h \ curve.h \ curvefactory.h \ curvehint.h \ curvepointsymbol.h \ dialoglauncher.h \ enodefactory.h \ enodes.h \ eparse-eh.h \ eparse.h \ dataobject.h \ dataobjectplugin.h \ emailthread.h \ equation.h \ equationfactory.h \ eventmonitorentry.h \ eventmonitorfactory.h \ histogram.h \ histogramfactory.h \ image.h \ imagefactory.h \ labelparser.h \ linestyle.h \ objectfactory.h \ painter.h \ palette.h \ plotdefines.h \ psd.h \ psdcalculator.h \ plottickcalculator.h \ relation.h \ relationfactory.h #LEXSOURCES += escan.l #YACCSOURCES += eparse.y Kst-2.0.8/src/libkstmath/relationfactory.cpp0000644000175000017500000000371512277111530020225 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "relationfactory.h" #include #include namespace Kst { static QMap *relation_factories = 0; void cleanupRelations() { foreach (RelationFactory *f, *relation_factories) { delete f; } delete relation_factories; relation_factories = 0; } RelationFactory::RelationFactory() { } RelationFactory::~RelationFactory() { } void RelationFactory::registerFactory(const QString& node, RelationFactory *factory) { if (!relation_factories) { relation_factories = new QMap; qAddPostRoutine(cleanupRelations); } relation_factories->insert(node, factory); } void RelationFactory::registerFactory(const QStringList& nodes, RelationFactory *factory) { foreach (const QString &n, nodes) { registerFactory(n, factory); } } RelationPtr RelationFactory::parse(ObjectStore *store, QXmlStreamReader& stream) { if (!relation_factories) { return 0; } RelationFactory *f = relation_factories->value(stream.name().toString()); if (!f) { return 0; } return f->generateRelation(store, stream); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/basicplugin.h0000644000175000017500000001020712362701575016770 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2006 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BASICPLUGIN_H #define BASICPLUGIN_H #include "dataobject.h" #include "kstmath_export.h" namespace Kst { class ObjectStore; class KSTMATH_EXPORT BasicPlugin : public DataObject { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; //The implementation of the algorithm the plugin provides. //Operates on the inputVectors, inputScalars, and inputStrings //to produce the outputVectors, outputScalars, and outputStrings. virtual bool algorithm() = 0; //String lists of the names of the expected inputs. virtual QStringList inputVectorList() const = 0; virtual QStringList inputScalarList() const = 0; virtual QStringList inputStringList() const = 0; //String lists of the names of the expected outputs. virtual QStringList outputVectorList() const = 0; virtual QStringList outputScalarList() const = 0; virtual QStringList outputStringList() const = 0; //Pure virtual methods inherited from DataObject //This _must_ equal the 'Name' entry in the .desktop file of //the plugin QString propertyString() const { return name(); } //no longer virtual //Provide an impl... virtual DataObjectPtr makeDuplicate() const; virtual QString descriptionTip() const; // Validator of plugin data. Expensive, only use to verify successful creation. virtual bool isValid() { return (inputsExist() && algorithm()); } QString errorMessage() { return _errorString; } public slots: //Pure virtual slots from DataObject //Each plugin can provide an implementation or use the default virtual void showNewDialog(); virtual void showEditDialog(); public: virtual void change(DataObjectConfigWidget *configWidget) = 0; //Returns the respective input object for name VectorPtr inputVector(const QString& name) const; ScalarPtr inputScalar(const QString& name) const; StringPtr inputString(const QString& name) const; void setOutputVector(const QString &type, const QString &name); void setOutputScalar(const QString &type, const QString &name); void setOutputString(const QString &type, const QString &name); void setPluginName(const QString &pluginName); QString pluginName() { return _pluginName; } //Regular virtual methods from DataObject virtual void save(QXmlStreamWriter &s); virtual void saveProperties(QXmlStreamWriter &s); void createScalars(); QString label(int precision) const; virtual void internalUpdate(); virtual bool hasParameterVector() const { return _outputVectors.contains("Parameters Vector");} virtual QString parameterVectorToString() const { return label(9);} virtual ScriptInterface* createScriptInterface(); protected: BasicPlugin(ObjectStore *store); virtual ~BasicPlugin(); //Pure virtual methods inherited from DataObject //We do this one ourselves for benefit of all plugins... virtual QString parameterName(int index) const; QString _errorString; virtual void _initializeShortName(); private: bool inputsExist() const; void updateOutput() const; QString _pluginName; }; typedef SharedPtr BasicPluginPtr; typedef ObjectList BasicPluginList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/imagefactory.h0000644000175000017500000000220412277111530017127 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef IMAGEFACTORY_H #define IMAGEFACTORY_H #include "relationfactory.h" namespace Kst { class ImageFactory : public RelationFactory { public: ImageFactory(); ~ImageFactory(); RelationPtr generateRelation(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/plottickcalculator.cpp0000644000175000017500000000714112277111530020720 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "plottickcalculator.h" #include #include #include namespace Kst { /* * Major ticks are always spaced by D = A*10^B where B is an integer, * and A is 1, 2 or 5. So: 1, 0.02, 50, 2000 are all possible major tick * spacings, but 30 is not. * * A and B are chosen so that there are as close as possible to M major ticks * on the axis (but at least 2). The value of M is set by the requested * MajorTickMode. */ void computeMajorTickSpacing(double *major_spacing, int *minor_count, MajorTickMode majorTickCount, double R) { qreal M = majorTickCount; qreal B = floor(log10(R/M)); qreal d1 = 1 * pow(10, B); // tick spacing qreal d2 = 2 * pow(10, B); qreal d5 = 5 * pow(10, B); qreal r1 = d1 * M; // tick range qreal r2 = d2 * M; qreal r5 = d5 * M; qreal s1 = qAbs(r1 - R); qreal s2 = qAbs(r2 - R); qreal s5 = qAbs(r5 - R); *minor_count = 5; if (s1 <= s2 && s1 <= s5) { *major_spacing = d1; } else if (s2 <= s5) { if ((M == 2) && (r2 > R)) { *major_spacing = d1; // Minimum ticks not met using d2 using d1 instead } else { *minor_count = 4; *major_spacing = d2; } } else { if ((M == 2) && (r5 > R)) { *minor_count = 4; *major_spacing = d2; // Minimum ticks not met using d5 using d2 instead } else { *major_spacing = d5; } } } // compute the major ticks for hours (base = 24) or min/sec (base = 60) void computeMajorTickSpacing(double *major_spacing, int *minor_count, MajorTickMode majorTickCount, double R, timeUnits time_units) { double base60list[] = {1.0,2.0,5.0,10.0,20.0,30.0,60.0}; int minorlist_minutes[] = { 6, 4, 5, 5, 4, 6, 4}; int minorlist_seconds[] = { 5, 4, 5, 5, 4, 6, 6}; int n60 = 7; double base24list[] = {1.0,2.0,4.0,6.0,12.0,24.0}; int minorlist_hours[] = { 4, 4, 4, 6, 6, 6}; int n24 = 6; double *baselist; int *minorlist; double n; if (R <= majorTickCount) { computeMajorTickSpacing(major_spacing, minor_count, majorTickCount, R); return; } if (time_units == Hour) { baselist = base24list; minorlist = minorlist_hours; n = n24; } else if (time_units == Minute) { baselist = base60list; minorlist = minorlist_minutes; n = n60; } else if (time_units == Second) { baselist = base60list; minorlist = minorlist_seconds; n = n60; } else { // unknown base - use base 10; computeMajorTickSpacing(major_spacing, minor_count, majorTickCount, R); return; } int best_i=0; double best_err = 1E88; double err; for (int i=0; i #include #include #include using namespace Label; // Debug output for Parsing - 0 Off 1 On #define DEBUG_PARSING 0 #if DEBUG_PARSING #define dumpattr(node, text) do { printf("%s: bold:%d italic:%d underline:%d\n", text, (node)->attributes.bold, (node)->attributes.italic, (node)->attributes.underline); } while(0) #else #define dumpattr(node, text) #endif Chunk::Chunk(Chunk *parent, VOffset dir, bool isGroup, bool inherit) : next(0L), prev(0L), up(0L), down(0L), group(0L), scalar(false), linebreak(false), tab(false), vector(false), vOffset(dir) { assert(parent || vOffset == None); if (parent) { // attach and inherit switch (vOffset) { case None: if (isGroup) { parent->group = this; } else { while (parent->next) { parent = parent->next; } parent->next = this; } break; case Up: assert(!parent->up); parent->up = this; break; case Down: assert(!parent->down); parent->down = this; break; } if (inherit) { // inherit these properties from the parent attributes = parent->attributes; } prev = parent; } } Chunk::~Chunk() { // These are set to 0 by the child if they're non-zero delete next; delete up; delete down; delete group; group = 0L; if (prev) { switch (vOffset) { case None: prev->next = 0L; // Note: kind of does the wrong thing if we're a group... no issue though break; case Up: prev->up = 0L; break; case Down: prev->down = 0L; break; } prev = 0L; } } bool Chunk::locked() const { return scalar || group || linebreak || tab || vector; } Parsed::Parsed() : chunk(0L) { } Parsed::~Parsed() { delete chunk; chunk = 0L; } inline void setNormalChar(QChar c, Chunk **tail) { if (*tail && !(*tail)->locked()) { (*tail)->text += c; } else { Chunk *f = new Chunk(*tail, Chunk::None, false, true); f->text += c; *tail = f; } } inline QColor parseColor(const QString& txt, int *skip) { const int end = txt.indexOf('}'); if (skip) { *skip = end; } if (end == -1) { return QColor(); } const QString endPart = txt.left(end); QColor color(endPart); // This one is slow. If we support our own formats // outside of QColor, make sure that this is called // -after- we try our own formats. Every cycle // counts in here. #if 0 // This is rr,gg,bb support. I'm not sure about supporting H,S,V or even // about compatibility with LaTeX so for now we don't support it. If it's // ever re-enabled, make sure that testcases are added. if (!color.isValid()) { // the color is in the format "r,g,b" QStringList components = QStringList::split(',', endPart, true); if (components.count() == 3) { int colors[3] = { 0, 0, 0 }; int base = 10; // assume the colors are given as decimal numbers unless we have a hex value in the string if (endPart.find(QRegExp("[A-F]", false)) != -1) { base = 16; } bool ok = true; colors[0] = components[0].toInt(&ok, base); if (ok) { colors[1] = components[1].toInt(&ok, base); } if (ok) { colors[2] = components[2].toInt(&ok, base); } if (ok) { color.setRgb(colors[0], colors[1], colors[2]); } // Should error out? } } #endif return color; } static Chunk *parseInternal(Chunk *ctail, const QString& txt, uint& start, uint cnt, bool interpretNewLine); #define EXPAND_GREEK(L_U, L_L, REST, SKIP, UCODE) \ case L_L: \ x=0x20; \ case L_U: \ if (txt.mid(from + 1).startsWith(REST)) { \ *skip = SKIP; \ setNormalChar(QChar(UCODE+x), tail); \ return true; \ } \ break; inline bool parseOutChar(const QString& txt, uint from, int *skip, Chunk **tail, bool interpretNewLine) { // STOP! Changes you make here should be made into cclineedit.cpp as well for completion. QChar c = txt[from]; bool upper = false; *skip = 1; short x = 0; #if DEBUG_PARSING qDebug() << "----- parsing " << txt; #endif switch (c.unicode()) { EXPAND_GREEK('B', 'b', "eta", 4, 0x392) EXPAND_GREEK('D', 'd', "elta", 5, 0x394) EXPAND_GREEK('Z', 'z', "eta", 4, 0x396) EXPAND_GREEK('K', 'k', "appa", 5, 0x39a) EXPAND_GREEK('M', 'm', "u", 2, 0x39c) EXPAND_GREEK('X', 'x', "i", 2, 0x39e) EXPAND_GREEK('R', 'r', "ho", 3, 0x3a1) case 'a': x = 0x20; case 'A': if (txt.mid(from + 1).startsWith(QLatin1String("lpha"))) { *skip = 5; setNormalChar(QChar(0x391+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("pprox"))) { *skip = 6; setNormalChar(QChar(0x2248), tail); return true; } break; case 'c': x = 0x20; case 'C': if (txt.mid(from + 1).startsWith(QLatin1String("hi"))) { *skip = 3; setNormalChar(QChar(0x3a7+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("dot"))) { *skip = 4; setNormalChar(QChar(0x2219), tail); return true; } break; case 'e': x = 0x20; case 'E': if (txt.mid(from + 1).startsWith(QLatin1String("psilon"))) { *skip = 7; setNormalChar(QChar(0x395+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("ta"))) { *skip = 3; setNormalChar(QChar(0x397+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("ll"))) { *skip = 3; setNormalChar(QChar(0x2113), tail); return true; } break; case 'g': x = 0x20; case 'G': if (txt.mid(from + 1).startsWith(QLatin1String("amma"))) { *skip = 5; setNormalChar(QChar(0x393+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("eq"))) { *skip = 3; setNormalChar(QChar(0x2265), tail); return true; } else if (txt.mid(from + 1).startsWith('e')) { *skip = 2; setNormalChar(QChar(0x2265), tail); return true; } break; case 'i': x = 0x20; case 'I': if (txt.mid(from + 1).startsWith(QLatin1String("ota"))) { *skip = 4; setNormalChar(QChar(0x399+x), tail); return true; } else if (!upper && txt.mid(from + 1).startsWith(QLatin1String("nf"))) { *skip = 3; setNormalChar(QChar(0x221E), tail); return true; } else if (!upper && txt.mid(from + 1).startsWith(QLatin1String("nt"))) { *skip = 3; setNormalChar(QChar(0x222B), tail); return true; } break; case 'l': x = 0x20; case 'L': if (txt.mid(from + 1).startsWith(QLatin1String("ambda"))) { *skip = 6; setNormalChar(QChar(0x39b+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("eq"))) { *skip = 3; setNormalChar(QChar(0x2264), tail); return true; } else if (txt.mid(from + 1).startsWith('e')) { *skip = 2; setNormalChar(QChar(0x2264), tail); return true; } break; case 'n': x = 0x20; case 'N': if (txt.mid(from + 1).startsWith('u')) { *skip = 2; setNormalChar(QChar(0x39D+x), tail); return true; } else if (txt.mid(from + 1).startsWith('e')) { *skip = 2; setNormalChar(QChar(0x2260), tail); return true; } else if (interpretNewLine) { *skip = 1; if (!*tail || !(*tail)->text.isEmpty() || (*tail)->locked()) { *tail = new Chunk(*tail, Chunk::None, false, true); } (*tail)->linebreak = true; *tail = new Chunk(*tail, Chunk::None, false, true); return true; } else { *skip = 1; setNormalChar(QChar(0x20), tail); return true; } break; case 'o': x = 0x20; case 'O': if (txt.mid(from + 1).startsWith(QLatin1String("verline{"))) { if ((*tail)->group) { *tail = new Chunk(*tail, Chunk::None, false, true); } Chunk *working = new Chunk(*tail, Chunk::None, true, true); dumpattr(working, "start group for overline"); uint parseStart = from + 9; working->attributes.overline = true; parseInternal(working, txt, parseStart, txt.length(), interpretNewLine); *skip = parseStart - from + 1; dumpattr(working, "end group for overline"); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("micron"))) { *skip = 7; setNormalChar(QChar(0x39F+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("mega"))) { *skip = 5; setNormalChar(QChar(0x3A9+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("dot"))) { *skip = 4; setNormalChar(QChar(0x2299), tail); return true; } break; case 'p': x = 0x20; case 'P': if (txt.mid(from + 1).startsWith('i')) { *skip = 2; setNormalChar(QChar(0x3a0+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("hi"))) { *skip = 3; setNormalChar(QChar(0x3A6+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("si"))) { *skip = 3; setNormalChar(QChar(0x3A8+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("artial"))) { *skip = 7; setNormalChar(QChar(0x2202), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("rod"))) { *skip = 4; setNormalChar(QChar(0x220F), tail); return true; } else if (txt.mid(from + 1).startsWith('m')) { *skip = 2; setNormalChar(QChar(0xb1), tail); return true; } break; case 't': x = 0x20; case 'T': if (txt.mid(from + 1).startsWith(QLatin1String("extcolor{"))) { // \textcolor{color}{text} if ((*tail)->group) { *tail = new Chunk(*tail, Chunk::None, false, true); } Chunk *working = new Chunk(*tail, Chunk::None, true, true); dumpattr(working, "start group for textcolor"); uint parseStart = from + 10; int firstSkip = 0; working->attributes.color = parseColor(txt.mid(parseStart), &firstSkip); if (!working->attributes.color.isValid() || txt[parseStart + firstSkip + 1] != '{') { return false; } parseStart += firstSkip + 2; parseInternal(working, txt, parseStart, txt.length(), interpretNewLine); *skip = parseStart - from + 1; dumpattr(working, "end group for textcolor"); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("extbf{"))) { if ((*tail)->group) { *tail = new Chunk(*tail, Chunk::None, false, true); } Chunk *working = new Chunk(*tail, Chunk::None, true, true); dumpattr(working, "start group for textbf"); uint parseStart = from + 7; working->attributes.bold = true; parseInternal(working, txt, parseStart, txt.length(), interpretNewLine); *skip = parseStart - from + 1; dumpattr(working, "end group for textbf"); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("extit{"))) { if ((*tail)->group) { *tail = new Chunk(*tail, Chunk::None, false, true); } Chunk *working = new Chunk(*tail, Chunk::None, true, true); dumpattr(working, "start group for textit"); uint parseStart = from + 7; working->attributes.italic = true; parseInternal(working, txt, parseStart, txt.length(), interpretNewLine); *skip = parseStart - from + 1; dumpattr(working, "end group for textit"); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("heta"))) { *skip = 5; setNormalChar(QChar(0x398+x), tail); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("au"))) { *skip = 3; setNormalChar(QChar(0x3A4+x), tail); return true; } else { *skip = 1; if (!*tail || !(*tail)->text.isEmpty() || (*tail)->locked()) { *tail = new Chunk(*tail, Chunk::None, false, true); } (*tail)->tab = true; *tail = new Chunk(*tail, Chunk::None, false, true); return true; } break; case 's': x = 0x20; case 'S': if (txt.mid(from + 1).startsWith(QLatin1String("igma"))) { *skip = 5; setNormalChar(QChar(0x3A3+x), tail); return true; } else if (!upper && txt.mid(from + 1).startsWith(QLatin1String("um"))) { *skip = 3; setNormalChar(QChar(0x2211), tail); return true; } else if (!upper && txt.mid(from + 1).startsWith(QLatin1String("qrt"))) { *skip = 4; setNormalChar(QChar(0x221A), tail); return true; } break; case 'u': x = 0x20; case 'U': if (txt.mid(from + 1).startsWith(QLatin1String("nderline{"))) { if ((*tail)->group) { *tail = new Chunk(*tail, Chunk::None, false, true); } Chunk *working = new Chunk(*tail, Chunk::None, true, true); dumpattr(working, "start group for underline"); uint parseStart = from + 10; working->attributes.underline = true; parseInternal(working, txt, parseStart, txt.length(), interpretNewLine); *skip = parseStart - from + 1; dumpattr(working, "end group for underline"); return true; } else if (txt.mid(from + 1).startsWith(QLatin1String("psilon"))) { *skip = 7; setNormalChar(QChar(0x3A5+x), tail); return true; } break; default: break; } return false; } static Chunk *parseInternal(Chunk *ctail, const QString& txt, uint& start, uint cnt, bool interpretNewLine) { Chunk *chead = ctail; if (ctail->group) { ctail = new Chunk(ctail, Chunk::None, false, true); } for (uint& i = start; i < cnt; ++i) { QChar c = txt[i]; Chunk::VOffset dir = Chunk::Down; switch (c.unicode()) { case '\n': if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { while (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { ctail = ctail->prev; } ctail = new Chunk(ctail, Chunk::None, false, true); } if (!ctail->text.isEmpty() || ctail->locked()) { if (ctail->vOffset != Chunk::None) { ctail = new Chunk(ctail->prev, Chunk::None, false, true); } else { ctail = new Chunk(ctail, Chunk::None, false, true); } } ctail->linebreak = true; ctail = new Chunk(ctail, Chunk::None, false, true); break; case '\t': if (!ctail->text.isEmpty() || ctail->locked()) { if (ctail->vOffset != Chunk::None) { ctail = new Chunk(ctail->prev, Chunk::None, false, true); } else { ctail = new Chunk(ctail, Chunk::None, false, true); } } ctail->tab = true; ctail = new Chunk(ctail, Chunk::None, false, true); break; case 0x5c: // \ /**/ if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { while (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { ctail = ctail->prev; } ctail = new Chunk(ctail, Chunk::None, false, true); } if (ctail->vOffset != Chunk::None && !ctail->text.isEmpty()) { ctail = new Chunk(ctail->prev, Chunk::None, false, true); } ++i; if (i == cnt) { setNormalChar('\\', &ctail); } else { int skip = 0; if (!parseOutChar(txt, i, &skip, &ctail, interpretNewLine)) { setNormalChar(txt[i], &ctail); } else { i += skip - 1; } } break; case 0x5e: // ^ dir = Chunk::Up; case 0x5f: // _ (dir is set to Down at beginning of loop) if (ctail->text.isEmpty() && !ctail->group) { setNormalChar(c, &ctail); } else { if (ctail->vOffset != Chunk::None) { if (ctail->vOffset != dir) { ctail = new Chunk(ctail->prev, dir, false, true); } else if (ctail->group) { ctail = new Chunk(ctail, dir, false, true); } else { ctail = new Chunk(ctail, dir, false, true); } } else { ctail = new Chunk(ctail, dir, false, true); } } break; case 0x7b: // { if (ctail->text.isEmpty() && !ctail->group) { bool rc = false; new Chunk(ctail, Chunk::None, true, true); dumpattr(ctail->group, "start group with non-group and empty text"); rc = 0L != parseInternal(ctail->group, txt, ++i, cnt, interpretNewLine); assert(rc); dumpattr(ctail->group, "after start group with non-group and empty text"); if (!rc) { return 0L; } } else { bool rc = false; if (ctail->vOffset == Chunk::None) { rc = 0L != parseInternal(new Chunk(ctail, Chunk::None, true, true), txt, ++i, cnt, interpretNewLine); } else { rc = 0L != parseInternal(new Chunk(ctail->prev, Chunk::None, true, true), txt, ++i, cnt, interpretNewLine); } if (!rc) { return 0L; } } break; case 0x7d: // } if (chead->prev && chead->prev->group == chead) { return chead; } else { setNormalChar(c, &ctail); } break; case '[': { bool vector = false; int vectorIndexStart = -1; int vectorIndexEnd = -1; int bracketStack = 1; int pos = -1; bool equation = txt[i + 1] == '='; for (uint searchPt = i + 1; bracketStack != 0 && searchPt < cnt; ++searchPt) { if (txt[searchPt] == ']') { if (--bracketStack == 0) { pos = searchPt; break; } else if (bracketStack == 1 && vector && vectorIndexEnd == -1) { vectorIndexEnd = searchPt - 1; } } else if (txt[searchPt] == '[') { ++bracketStack; if (!vector && !equation) { vector = true; vectorIndexStart = searchPt + 1; } } } if (pos < 0 || pos == int(i) + 1 /* empty [] */) { return 0L; } if (ctail->locked() || !ctail->text.isEmpty()) { if (ctail->vOffset != Chunk::None) { ctail = new Chunk(ctail->prev, Chunk::None, false, true); } else { ctail = new Chunk(ctail, Chunk::None, false, true); } } if (vector) { ctail->text = txt.mid(i + 1, vectorIndexStart - i - 2).trimmed(); ctail->expression = txt.mid(vectorIndexStart, vectorIndexEnd - vectorIndexStart + 1); ctail->vector = true; } else { ctail->text = txt.mid(i + 1, pos - i - 1).trimmed(); ctail->scalar = true; } i = uint(pos); } break; default: #if 0 if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { ctail = new Chunk(ctail->prev, Chunk::None, false, true); } #endif if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { while (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) { ctail = ctail->prev; } ctail = new Chunk(ctail, Chunk::None, false, true); } setNormalChar(c, &ctail); break; } } return chead; } Parsed *Label::parse(const QString& txt, bool interpret, bool interpretNewLine) { Parsed *parsed = new Parsed; Chunk *ctail = parsed->chunk = new Chunk(0L); if (!interpret) { ctail->text = txt; return parsed; } uint start = 0; uint cnt = txt.length(); Chunk *rc = parseInternal(ctail, txt, start, cnt, interpretNewLine); if (!rc) { // Parse error - how to recover? delete parsed; parsed = 0L; } return parsed; } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/csdfactory.h0000644000175000017500000000216612277111530016625 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CSDFACTORY_H #define CSDFACTORY_H #include "objectfactory.h" namespace Kst { class CSDFactory : public ObjectFactory { public: CSDFactory(); ~CSDFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/plottickcalculator.h0000644000175000017500000000262612277111530020370 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PLOTTICKCALCULATOR_H #define PLOTTICKCALCULATOR_H #include "kstmath_export.h" namespace Kst { enum MajorTickMode { TicksNone = 0, TicksCoarse = 2, TicksNormal = 5, TicksFine = 10, TicksVeryFine = 15 }; enum timeUnits {Hour, Minute, Second}; KSTMATH_EXPORT void computeMajorTickSpacing(double *major_spacing, int *minor_count, MajorTickMode majorTickCount, double range); KSTMATH_EXPORT void computeMajorTickSpacing(double *major_spacing, int *minor_count, MajorTickMode majorTickCount, double range, timeUnits time_units); } #endif // PLOTTICKCALCULATOR_H Kst-2.0.8/src/libkstmath/CMakeLists.txt0000644000175000017500000000030512320547027017047 0ustar synthsynthkst_init(${kst_binary_name} math) kst_files_find(src/libkstmath) kst_dont_merge(eparse.cpp escan.cpp fftsg_h.c) kst_include_directories(core math) kst_add_library(SHARED) kst_link(${libcore}) Kst-2.0.8/src/libkstmath/eventmonitorentry.cpp0000644000175000017500000002600212277111530020625 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include "eventmonitorentry.h" // include files for Qt #include #include #include // application specific includes #include "enodes.h" #include "dialoglauncher.h" #include "datacollection.h" #include #include "debug.h" #include #ifndef Q_OS_WIN32 #include #endif extern int yyparse(Kst::ObjectStore *store); extern void *ParsedEquation; extern struct yy_buffer_state *yy_scan_string(const char*); namespace Kst { const QString EventMonitorEntry::staticTypeString = "Event Monitor"; const QString EventMonitorEntry::staticTypeTag = "eventmonitor"; namespace { const int EventMonitorEventType = int(QEvent::User) + 2931; class EventMonitorEvent : public QEvent { public: EventMonitorEvent(const QString& msg) : QEvent(QEvent::Type(EventMonitorEventType)), logMessage(msg) {} QString logMessage; }; } //extern "C" int yyparse(); //extern "C" void *ParsedEquation; //extern "C" struct yy_buffer_state *yy_scan_string(const char*); const QString EventMonitorEntry::OUTXVECTOR('X'); const QString EventMonitorEntry::OUTYVECTOR('Y'); EventMonitorEntry::EventMonitorEntry(ObjectStore *store) : DataObject(store) { _level = Debug::Warning; _logDebug = true; _logEMail = false; _logELOG = false; const int NS = 1; _numDone = 0; _isValid = false; _pExpression = 0L; _typeString = staticTypeString; _type = "Event"; _initializeShortName(); VectorPtr xv = store->createObject(); xv->resize(NS); xv->setProvider(this); _xVector = _outputVectors.insert(OUTXVECTOR, xv); VectorPtr yv = store->createObject(); yv->resize(NS); yv->setProvider(this); _yVector = _outputVectors.insert(OUTYVECTOR, yv); } void EventMonitorEntry::_initializeShortName() { } bool EventMonitorEntry::reparse() { _isValid = false; if (!_event.isEmpty()) { Equations::mutex().lock(); yy_scan_string(_event.toLatin1()); int rc = yyparse(store()); if (rc == 0) { _pExpression = static_cast(ParsedEquation); Equations::Context ctx; Equations::FoldVisitor vis(&ctx, &_pExpression); StringMap stm; _pExpression->collectObjects(_vectorsUsed, _inputScalars, stm); for (ScalarMap::ConstIterator i = _inputScalars.constBegin(); i != _inputScalars.constEnd(); ++i) { if ((*i)->myLockStatus() == KstRWLock::UNLOCKED) { (*i)->readLock(); } } Equations::mutex().unlock(); _isValid = true; } else { delete (Equations::Node*)ParsedEquation; Equations::mutex().unlock(); } ParsedEquation = 0L; } return _isValid; } void EventMonitorEntry::save(QXmlStreamWriter &xml) { xml.writeStartElement(staticTypeTag); xml.writeAttribute("equation", _event); xml.writeAttribute("description", _description); xml.writeAttribute("logdebug", QVariant(_logDebug).toString()); xml.writeAttribute("loglevel", QVariant(_level).toString()); xml.writeAttribute("logemail", QVariant(_logEMail).toString()); xml.writeAttribute("logelog", QVariant(_logELOG).toString()); xml.writeAttribute("emailrecipients", _eMailRecipients); xml.writeAttribute("script", _script); xml.writeEndElement(); } EventMonitorEntry::~EventMonitorEntry() { logImmediately(false); delete _pExpression; _pExpression = 0L; } void EventMonitorEntry::internalUpdate() { writeLockInputsAndOutputs(); if (!_pExpression) { reparse(); } VectorPtr xv = *_xVector; VectorPtr yv = *_yVector; int ns = 1; for (VectorMap::ConstIterator i = _vectorsUsed.constBegin(); i != _vectorsUsed.constEnd(); ++i) { ns = qMax(ns, i.value()->length()); } double *rawValuesX = 0L; double *rawValuesY = 0L; if (xv && yv) { if (xv->resize(ns)) { rawValuesX = xv->value(); } if (yv->resize(ns)) { rawValuesY = yv->value(); } } Equations::Context ctx; ctx.sampleCount = ns; ctx.x = 0.0; if (needToEvaluate()) { if (_pExpression) { for (ctx.i = _numDone; ctx.i < ns; ++ctx.i) { const double value = _pExpression->value(&ctx); if (value != 0.0) { // The expression evaluates to true log(ctx.i); if (rawValuesX && rawValuesY) { rawValuesX[ctx.i] = ctx.i; rawValuesY[ctx.i] = 1.0; } } else { if (rawValuesX && rawValuesY) { rawValuesX[ctx.i] = ctx.i; rawValuesY[ctx.i] = 0.0; } } } _numDone = ns; logImmediately(); } } else { _numDone = ns; } unlockInputsAndOutputs(); return; } void EventMonitorEntry::setEvent(const QString& strEvent) { if (_event != strEvent) { _event = strEvent; _vectorsUsed.clear(); _inputScalars.clear(); _numDone = 0; _isValid = false; delete _pExpression; _pExpression = 0L; } } bool EventMonitorEntry::needToEvaluate() { return _logDebug || _logEMail || _logELOG || !_script.isEmpty(); } void EventMonitorEntry::logImmediately(bool sendEvent) { const int arraySize = _indexArray.size(); if (arraySize > 0) { QString logMessage; QString rangeString; bool makeRange = false; int idx = 0; int idxOld = 0; for (int i = 0; i < arraySize; ++i) { idx = _indexArray.at(i); if (i == 0) { rangeString.setNum(idx); } else if (!makeRange && idx == idxOld + 1) { makeRange = true; } else if (makeRange && idx != idxOld + 1) { rangeString = rangeString + QString(" - %1, %2").arg(idxOld).arg(idx); makeRange = false; } else if (idx != idxOld + 1) { rangeString = rangeString + QString(", %1").arg(idx); } idxOld = idx; } if (makeRange) { rangeString = rangeString + QString(", %1").arg(idx); } if (_description.isEmpty()) { logMessage = "Event Monitor: " + _event + ": " + rangeString; } else { logMessage = "Event Monitor: " + _description + ": " + rangeString; } _indexArray.clear(); if (sendEvent) { // update thread QApplication::postEvent(this, new EventMonitorEvent(logMessage)); } else { // GUI thread doLog(logMessage); } } } bool EventMonitorEntry::event(QEvent *e) { if (e->type() == EventMonitorEventType) { readLock(); doLog(static_cast(e)->logMessage); unlock(); return true; } return false; } void EventMonitorEntry::doLog(const QString& logMessage) const { if (_logDebug) { Debug::self()->log(logMessage, _level); } //if (_logEMail && !_eMailRecipients.isEmpty()) { // EMailThread* thread = new EMailThread(_eMailRecipients, "Kst Event Monitoring Notification", logMessage); // thread->send(); //} //FIXME ELOG need to be implemented. // if (_logELOG) { // KstApp::inst()->EventELOGSubmitEntry(logMessage); // } //FIXME PORT! // if (!_script.isEmpty()) { // DCOPRef ref(QString("kst-%1").arg(getpid()).toLatin1(), "KstScript"); // ref.send("evaluate", _script); // } } void EventMonitorEntry::log(int idx) { _indexArray.append(idx); if (_indexArray.size() > 1000) { logImmediately(); } } QString EventMonitorEntry::propertyString() const { return _event; } void EventMonitorEntry::showNewDialog() { DialogLauncher::self()->showEventMonitorDialog(); } void EventMonitorEntry::showEditDialog() { DialogLauncher::self()->showEventMonitorDialog(); } const QString& EventMonitorEntry::scriptCode() const { return _script; } void EventMonitorEntry::setScriptCode(const QString& script) { if (_script != script) { _script = script; } } void EventMonitorEntry::setDescription(const QString& str) { if (_description != str) { _description = str; } } void EventMonitorEntry::setLevel(Debug::LogLevel level) { if (_level != level) { _level = level; } } void EventMonitorEntry::setExpression(Equations::Node* pExpression) { if (_pExpression != pExpression) { _pExpression = pExpression; } } void EventMonitorEntry::setLogDebug(bool logDebug) { if (_logDebug != logDebug) { _logDebug = logDebug; } } void EventMonitorEntry::setLogEMail(bool logEMail) { if (logEMail != _logEMail) { _logEMail = logEMail; } } void EventMonitorEntry::setLogELOG(bool logELOG) { if (logELOG != _logELOG) { _logELOG = logELOG; } } void EventMonitorEntry::setEMailRecipients(const QString& str) { if (str != _eMailRecipients) { _eMailRecipients = str; } } DataObjectPtr EventMonitorEntry::makeDuplicate() const { EventMonitorEntryPtr eventMonitor = store()->createObject(); eventMonitor->setScriptCode(_script); eventMonitor->setEvent(_event); eventMonitor->setDescription(_description); eventMonitor->setLevel(_level); eventMonitor->setLogDebug(_logDebug); eventMonitor->setLogEMail(_logEMail); eventMonitor->setLogELOG(_logELOG); eventMonitor->setEMailRecipients(_eMailRecipients); if (descriptiveNameIsManual()) { eventMonitor->setDescriptiveName(descriptiveName()); } eventMonitor->reparse(); eventMonitor->writeLock(); eventMonitor->registerChange(); eventMonitor->unlock(); return DataObjectPtr(eventMonitor); } bool EventMonitorEntry::uses(ObjectPtr p) const { // check VectorsUsed in addition to _input*'s if (VectorPtr vect = kst_cast(p)) { for (VectorMap::ConstIterator j = _vectorsUsed.begin(); j != _vectorsUsed.end(); ++j) { if (j.value() == vect) { return true; } } } else if (DataObjectPtr obj = kst_cast(p) ) { // check all connections from this expression to p for (VectorMap::ConstIterator j = obj->outputVectors().constBegin(); j != obj->outputVectors().constEnd(); ++j) { for (VectorMap::ConstIterator k = _vectorsUsed.constBegin(); k != _vectorsUsed.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } } } return DataObject::uses(p); } QString EventMonitorEntry::_automaticDescriptiveName() const { return tr("event"); } QString EventMonitorEntry::descriptionTip() const { return tr("Event: %1").arg(Name()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/eventmonitorfactory.cpp0000644000175000017500000000612612277111530021140 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "eventmonitorfactory.h" #include "debug.h" #include "eventmonitorentry.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { EventMonitorFactory::EventMonitorFactory() : ObjectFactory() { registerFactory(EventMonitorEntry::staticTypeTag, this); } EventMonitorFactory::~EventMonitorFactory() { } DataObjectPtr EventMonitorFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); QString equation, description, emailRecipients, script; bool logDebug=false, logEmail=false, logELOG=false; int logLevel=1; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == EventMonitorEntry::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); equation = attrs.value("equation").toString(); description = attrs.value("description").toString(); emailRecipients = attrs.value("emailrecipients").toString(); script = attrs.value("script").toString(); logLevel = attrs.value("loglevel").toString().toInt(); logDebug = attrs.value("logdebug").toString() == "true" ? true : false; logEmail = attrs.value("logemail").toString() == "true" ? true : false; logELOG = attrs.value("logelog").toString() == "true" ? true : false; } else { return 0; } } else if (xml.isEndElement()) { if (n == EventMonitorEntry::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating EventMonitorEntry from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } EventMonitorEntryPtr eventMonitor = store->createObject(); Q_ASSERT(eventMonitor); eventMonitor->setScriptCode(script); eventMonitor->setEvent(equation); eventMonitor->setDescription(description); eventMonitor->setLevel((Debug::LogLevel)logLevel); eventMonitor->setLogDebug(logDebug); eventMonitor->setLogEMail(logEmail); eventMonitor->setLogELOG(logELOG); eventMonitor->setEMailRecipients(emailRecipients); eventMonitor->reparse(); eventMonitor->writeLock(); eventMonitor->registerChange(); eventMonitor->unlock(); return eventMonitor; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/histogram.h0000644000175000017500000001014612362705136016464 0ustar synthsynth/*************************************************************************** histogram.h: Histogram for KST ------------------- begin : Wed July 11 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling power spectra for kst *@author C. Barth Netterfield */ #ifndef HISTOGRAM_H #define HISTOGRAM_H #include "dataobject.h" #include "kstmath_export.h" namespace Kst { class ObjectStore; class KSTMATH_EXPORT Histogram : public DataObject { Q_OBJECT public: enum NormalizationType { Number, Percent, Fraction, MaximumOne}; public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; virtual void internalUpdate(); virtual void save(QXmlStreamWriter &xml); virtual QString propertyString() const; int numberOfBins() const; void setNumberOfBins(int in_n_bins); void setXRange(double xmin_in, double xmax_in); void setVector(VectorPtr); VectorPtr vector() const; bool isNormalizationNumber() const { return _NormalizationMode == Number; } void setIsNormalizationNumber() { _NormalizationMode = Number; } bool isNormalizationPercent() const { return _NormalizationMode == Percent; } void setIsNormalizationPercent() { _NormalizationMode = Percent; } bool isNormalizationFraction() const { return _NormalizationMode == Fraction; } void setIsNormalizationFraction() { _NormalizationMode = Fraction; } bool isNormalizationMaximumOne() const { return _NormalizationMode == MaximumOne; } void setIsNormNormalizationMaximumOne() { _NormalizationMode = MaximumOne; } void setNormalizationType(NormalizationType normType) { _NormalizationMode = normType; } NormalizationType normalizationType() const { return _NormalizationMode; } static void AutoBin(const VectorPtr, int *n, double *max, double *min); virtual void showNewDialog(); virtual void showEditDialog(); virtual bool slaveVectorsUsed() const; void setRealTimeAutoBin(bool autobin); bool realTimeAutoBin() const; VectorPtr vX() const { return _bVector; } VectorPtr vY() const { return _hVector; } double xMin() const { return _MinX; } double xMax() const { return _MaxX; } double width() const { return _W; } double vMax() const; double vMin() const; int vNumSamples() const; virtual DataObjectPtr makeDuplicate() const; virtual QString descriptionTip() const; void change(VectorPtr in_V, double xmin_in, double xmax_in, int in_n_bins, NormalizationType new_norm_in, bool realTimeAutoBin = false); protected: Histogram(ObjectStore *store); virtual ~Histogram(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); private: NormalizationType _NormalizationMode; VectorPtr _bVector, _hVector; double _MaxX; double _MinX; int _NS; int _NumberOfBins; unsigned long *_Bins; double _Normalization; double _W; bool _realTimeAutoBin; void internalSetNumberOfBins(int in_n_bins); void internalSetXRange(double xmin_in, double xmax_in); }; typedef SharedPtr HistogramPtr; typedef ObjectList HistogramList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dataobjectplugin.h0000644000175000017500000000422212277111530017776 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAOBJECTPLUGIN_H #define DATAOBJECTPLUGIN_H #include #include #include "sharedptr.h" #include "dataobject.h" #include "dataplugin.h" namespace Kst { class ObjectStore; class DataObjectPluginInterface : public PluginInterface { public: enum PluginTypeID { Generic, Fit, Filter }; virtual ~DataObjectPluginInterface() {} virtual DataObject *create(ObjectStore *store, DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true) const = 0; virtual DataObjectConfigWidget *configWidget(QSettings *settingsObject) const = 0; virtual PluginTypeID pluginType() const = 0; }; class BasicPluginInterface : public DataObjectPluginInterface { public: virtual ~BasicPluginInterface() {} virtual QStringList inputVectorList() const = 0; virtual QStringList inputScalarList() const = 0; virtual QStringList inputStringList() const = 0; virtual QStringList outputVectorList() const = 0; virtual QStringList outputScalarList() const = 0; virtual QStringList outputStringList() const = 0; }; typedef ObjectList DataObjectPluginList; } Q_DECLARE_INTERFACE(Kst::DataObjectPluginInterface, "com.kst.DataObjectPluginInterface/2.0") Q_DECLARE_INTERFACE(Kst::BasicPluginInterface, "com.kst.BasicPluginInterface/2.0") #endif Kst-2.0.8/src/libkstmath/eparse-eh.h0000644000175000017500000000350712277111530016335 0ustar synthsynth/*************************************************************************** eparse-eh.h ---------------- begin : Nov. 24, 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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 file must be C-clean */ #ifndef EPARSEEH_H #define EPARSEEH_H #ifdef __cplusplus #include "kstmath_export.h" #include namespace Equations { KSTMATH_EXPORT extern QStringList errorStack; } namespace Kst { class ObjectStore; } #endif #ifdef __cplusplus //extern "C" { #endif void yyerror(Kst::ObjectStore *store, const char *s); void yyerrortoken(char c); void yyClearErrors(); int yyErrorCount(); extern const char *EParseErrorEmpty; extern const char *EParseErrorEmptyArg; extern const char *EParseErrorTwoOperands; extern const char *EParseErrorEmptyParentheses; extern const char *EParseErrorMissingClosingParenthesis; extern const char *EParseErrorNoImplicitMultiply; extern const char *EParseErrorRequiresOperand; #ifdef __cplusplus //} #endif #endif /* vim: ts=2 sw=2 et */ Kst-2.0.8/src/libkstmath/eventmonitorfactory.h0000644000175000017500000000224312277111530020601 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EVENTMONITORFACTORY_H #define EVENTMONITORFACTORY_H #include "objectfactory.h" namespace Kst { class EventMonitorFactory : public ObjectFactory { public: EventMonitorFactory(); ~EventMonitorFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/psdcalculator.cpp0000644000175000017500000002411112277111530017651 0ustar synthsynth/*************************************************************************** psdcalculator.cpp: Power Spectra Calculator for KST ------------------- begin : 2006 copyright : (C) 2006 by Kst email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A utility class for calculating power spectra */ #include "psdcalculator.h" #include #include "debug.h" #include "vector.h" #include #include #include "measuretime.h" extern "C" void rdft(int n, int isgn, double *a); #define PSDMINLEN 2 #define PSDMAXLEN 27 inline double PSDCalculator::cabs2(double r, double i) { return r*r + i*i; } PSDCalculator::PSDCalculator() { _a = 0L; _w = 0L; _awLen = 0; _prevApodizeFxn = WindowUndefined; _prevGaussianSigma = 1.0; _prevOutputLen = 0; } PSDCalculator::~PSDCalculator() { delete[] _w; _w = 0L; delete[] _a; _a = 0L; } void PSDCalculator::updateWindowFxn(ApodizeFunction apodizeFxn, double gaussianSigma) { const double a = double(_awLen) / 2.0; double x; double sW = 0.0; switch (apodizeFxn) { case WindowOriginal: for (int i = 0; i < _awLen; ++i) { _w[i] = 1.0 - cos(2.0 * M_PI * double(i) / double(_awLen)); sW += _w[i] * _w[i]; } break; case WindowBartlett: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = 1.0 - fabs(x) / a; sW += _w[i] * _w[i]; } break; case WindowBlackman: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = 0.42 + 0.5 * cos(M_PI * x / a) + 0.08 * cos(2 * M_PI * x/a); sW += _w[i] * _w[i]; } break; case WindowConnes: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = pow(static_cast(1.0 - (x * x) / (a * a)), 2); sW += _w[i] * _w[i]; } break; case WindowCosine: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = cos(M_PI * x / (2.0 * a)); sW += _w[i] * _w[i]; } break; case WindowGaussian: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = exp(-1.0 * x * x/(2.0 * gaussianSigma * gaussianSigma)); } break; case WindowHamming: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = 0.53836 + 0.46164 * cos(M_PI * x / a); sW += _w[i] * _w[i]; } break; case WindowHann: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = pow(static_cast(cos(M_PI * x/(2.0 * a))), 2); sW += _w[i] * _w[i]; } break; case WindowWelch: for (int i = 0; i < _awLen; ++i) { x = i - a; _w[i] = 1.0 - x * x / (a * a); sW += _w[i] * _w[i]; } break; case WindowUniform: default: for (int i = 0; i < _awLen; ++i) { _w[i] = 1.0; } sW = _awLen; break; } double norm = sqrt((double)_awLen/sW); // normalization constant s.t. sum over (w^2) is _awLen for (int i = 0; i < _awLen; ++i) { _w[i] *= norm; } _prevApodizeFxn = apodizeFxn; _prevGaussianSigma = gaussianSigma; } int PSDCalculator::calculatePowerSpectrum( double *input, int inputLen, double *output, int outputLen, bool removeMean, bool interpolateHoles, bool average, int averageLen, bool apodize, ApodizeFunction apodizeFxn, double gaussianSigma, PSDType outputType, double inputSamplingFreq) { if (outputLen != calculateOutputVectorLength(inputLen, average, averageLen)) { Kst::Debug::self()->log(Kst::Debug::tr("in PSDCalculator::calculatePowerSpectrum: received output array with wrong length."), Kst::Debug::Error); return -1; } if (outputLen != _prevOutputLen) { delete[] _a; delete[] _w; _awLen = outputLen*2; _prevOutputLen = outputLen; _a = new double[_awLen]; _w = new double[_awLen]; updateWindowFxn(apodizeFxn, gaussianSigma); } if ( (_prevApodizeFxn != apodizeFxn) || (_prevGaussianSigma != gaussianSigma) ) { updateWindowFxn(apodizeFxn, gaussianSigma); } int currentCopyLen; int nsamples = 0; int i_samp; int ioffset; memset(output, 0, sizeof(double)*outputLen); // initialize output. // Mingw build could be 10 times slower (Gaussian apod, mostly 0 then?) //MeasureTime time_in_rfdt("rdft()"); bool done = false; for (int i_subset = 0; !done; i_subset++) { ioffset = i_subset*outputLen; //overlapping average => i_subset*outputLen // only zero pad if we really have to. It is better to adjust the last chunk's // overlap. if (ioffset + _awLen*5/4 < inputLen) { currentCopyLen = _awLen; //will copy a complete window. } else if (_awLen PSDMAXLEN) { psdloglen = PSDMAXLEN; } return int(pow(2.0, psdloglen - 1)); } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/painter.h0000644000175000017500000000375412277111530016132 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PAINTER_H #define PAINTER_H #include #include "kstmath_export.h" namespace Kst { class KSTMATH_EXPORT Painter : public QPainter { public: // KstPaintType - hints to paint to allow optimizations // P_PAINT: Neither 'data' nor 'plot' needs to change // P_PLOT: data didn't change // P_UPDATE: at least one curve was updated /* FIXME: Define P_PLOT better, and do we even need P_ZOOM, P_PLOT and P_PAINT? They should all do the same thing. */ enum PaintType { P_PAINT = 0, P_PLOT, P_ZOOM, P_UPDATE, P_PRINT, P_EXPORT }; explicit Painter(PaintType t = P_PAINT); virtual ~Painter(); // Defalut: P_PAINT void setType(PaintType t); PaintType type() const; // True if UI elements such as focus rect should be drawn. default: false bool drawInlineUI() const; void setDrawInlineUI(bool draw); inline QRegion& uiMask() { return _uiMask; } bool makingMask() const; void setMakingMask(bool making); int lineWidthAdjustmentFactor() const; private: PaintType _type; bool _drawInlineUI; bool _makingMask; QRegion _uiMask; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curvefactory.h0000644000175000017500000000220412277111530017171 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVEFACTORY_H #define CURVEFACTORY_H #include "relationfactory.h" namespace Kst { class CurveFactory : public RelationFactory { public: CurveFactory(); ~CurveFactory(); RelationPtr generateRelation(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dataobject.h0000644000175000017500000001752212362701575016577 0ustar synthsynth/*************************************************************************** dataobject.h: base class for data objects ------------------- begin : May 20, 2003 copyright : (C) 2003 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAOBJECT_H #define DATAOBJECT_H #include "curvehint.h" #include "string_kst.h" #include "object.h" #include "objectlist.h" #include "vector.h" #include "matrix.h" #include "kstmath_export.h" #include #include class QXmlStreamReader; class QXmlStreamWriter; namespace Kst { class DataObject; class Relation; class DataObjectConfigWidget; typedef SharedPtr DataObjectPtr; typedef ObjectList DataObjectList; typedef QMap DataObjectDataObjectMap; class KSTMATH_EXPORT DataObject : public Object { Q_OBJECT public: //enum Kind { GenericPlugin, PrimitivePlugin, FitPlugin, FilterPlugin }; virtual void attach(); // These static methods are not for plugins to use static void init(); static void cleanupForExit(); static void initPlugins(); /** Returns a list of object plugins found on the system. */ static QStringList pluginList(); static QStringList dataObjectPluginList(); static QStringList filterPluginList(); static QStringList fitsPluginList(); // static QWidget* pluginWidget(const QString& name, ObjectPtr objectPtr = 0, VectorPtr vector = 0); static DataObjectPtr createPlugin(const QString& name, ObjectStore *store, VectorPtr vector); static DataObjectConfigWidget* pluginWidget(const QString& name); static DataObjectPtr createPlugin(const QString& name, ObjectStore *store, DataObjectConfigWidget *configWidget, bool setupInputsOutputs = true); static QString pluginDescription(const QString &name); static int pluginType(const QString &name); virtual const QString& typeString() const { return _typeString; } virtual QString propertyString() const = 0; virtual const QString& type() const { return _type; } virtual int sampleCount() const { return 0; } // If you use these, you must lock() and unlock() the object as long as you // hold the reference const VectorMap& inputVectors() const { return _inputVectors; } const VectorMap& outputVectors() const { return _outputVectors; } VectorMap& inputVectors() { return _inputVectors; } VectorMap& outputVectors() { return _outputVectors; } const ScalarMap& inputScalars() const { return _inputScalars; } const ScalarMap& outputScalars() const { return _outputScalars; } ScalarMap& inputScalars() { return _inputScalars; } ScalarMap& outputScalars() { return _outputScalars; } const StringMap& inputStrings() const { return _inputStrings; } const StringMap& outputStrings() const { return _outputStrings; } StringMap& inputStrings() { return _inputStrings; } StringMap& outputStrings() { return _outputStrings; } const MatrixMap& inputMatrices() const { return _inputMatrices; } const MatrixMap& outputMatrices() const { return _outputMatrices; } MatrixMap& inputMatrices() { return _inputMatrices; } MatrixMap& outputMatrices() { return _outputMatrices; } VectorPtr outputVector(const QString& name) const; ScalarPtr outputScalar(const QString& name) const; StringPtr outputString(const QString& name) const; void setInputVector(const QString &type, VectorPtr ptr); void setInputScalar(const QString &type, ScalarPtr ptr); void setInputString(const QString &type, StringPtr ptr); virtual PrimitiveList inputPrimitives() const; PrimitiveList outputPrimitives(bool include_descendants = true) const; virtual void load(const QXmlStreamReader& s); virtual void save(QXmlStreamWriter& s); virtual int getUsage() const; virtual void readLock() const; virtual void writeLock() const; virtual void unlock() const; virtual bool isValid(); virtual const CurveHintList* curveHints() const; virtual void deleteDependents(); virtual DataObjectPtr makeDuplicate() const = 0; virtual void replaceInput(PrimitivePtr p, PrimitivePtr new_p); virtual bool uses(ObjectPtr p) const; //These are generally only valid for plugins... const QString& name() const { return _name; } const QString& author() const { return _author; } const QString& description() const { return _description; } const QString& version() const { return _version; } const QString& library() const { return _library; } void showDialog(bool isNew = true); // used for sorting dataobjects by Document::sortedDataObjectList() void setOutputFlags(bool flag); bool inputFlagsSet() const; // this is reimplemented but must not be virtual. QByteArray scriptInterface(QList&command); protected slots: virtual void showNewDialog() = 0; virtual void showEditDialog() = 0; protected: DataObject(ObjectStore *store); virtual ~DataObject(); double *vectorRealloced(VectorPtr v, double *memptr, int newSize) const; //The plugin infrastructure will read the desktop file and set these //Other objects that inherit can set the ones that apply if desired... void setName(const QString& str) { _name = str; } void setAuthor(const QString& str) { _author = str; } void setDescription(const QString& str) { _description = str; } void setVersion(const QString& str) { _version = str; } void setLibrary(const QString& str) { _library = str; } virtual void writeLockInputsAndOutputs() const; virtual void unlockInputsAndOutputs() const; VectorMap _inputVectors; VectorMap _outputVectors; ScalarMap _inputScalars; ScalarMap _outputScalars; StringMap _inputStrings; StringMap _outputStrings; MatrixMap _inputMatrices; MatrixMap _outputMatrices; QString _typeString, _type; CurveHintList *_curveHints; virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; private: QString _name; QString _author; QString _description; QString _version; QString _library; private: static QSettings& settingsObject(); static QMap url_map; static void scanPlugins(); }; class KSTMATH_EXPORT DataObjectConfigWidget : public QWidget { Q_OBJECT public: explicit DataObjectConfigWidget(QSettings*); // will be reparented later virtual ~DataObjectConfigWidget(); virtual void setupFromObject(Object* dataObject); virtual void setupSlots(QWidget* dialog); virtual void setVectorX(VectorPtr vector); virtual void setVectorY(VectorPtr vector); virtual void setVectorsLocked(bool locked = true); virtual bool configurePropertiesFromXml(ObjectStore *store, QXmlStreamAttributes& attrs); void setInstance(DataObjectPtr inst); DataObjectPtr instance() const; virtual void setObjectStore(ObjectStore* store); public slots: virtual void load(); virtual void save(); protected: QSettings *_cfg; private: friend class DataObject; }; } Q_DECLARE_METATYPE(Kst::DataObject*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/linestyle.cpp0000644000175000017500000000232312277111530017022 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 by University of British Columbia * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "linestyle.h" namespace Kst { const unsigned int LINESTYLE_MAXTYPE = 5; Qt::PenStyle LineStyle[LINESTYLE_MAXTYPE] = { Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine, Qt::DashDotDotLine }; } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/escan.cpp0000644000175000017500000014050712277111530016112 0ustar synthsynth#include "kstmath_export.h" #ifdef Q_CC_MSVC #define strdup _strdup #endif #line 4 "escan.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) //#define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); KSTMATH_EXPORT YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap() 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 29 #define YY_END_OF_BUFFER 30 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[44] = { 0, 0, 0, 0, 0, 30, 28, 27, 29, 6, 22, 7, 24, 25, 20, 18, 26, 19, 21, 1, 1, 11, 15, 13, 2, 4, 5, 23, 8, 3, 17, 9, 0, 0, 1, 12, 16, 14, 2, 10, 1, 0, 1, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1, 1, 5, 6, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 1, 17, 18, 19, 1, 1, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 22, 1, 23, 24, 1, 1, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[26] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[45] = { 0, 0, 0, 55, 54, 56, 59, 59, 59, 37, 59, 48, 59, 59, 59, 59, 59, 59, 59, 13, 22, 35, 34, 33, 7, 59, 59, 59, 11, 59, 59, 59, 14, 34, 0, 59, 59, 59, 11, 59, 24, 26, 32, 59, 32 } ; static yyconst flex_int16_t yy_def[45] = { 0, 43, 1, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 20, 43, 43, 43, 43, 43, 43, 43, 43, 0, 43 } ; static yyconst flex_int16_t yy_nxt[85] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 32, 38, 38, 40, 40, 38, 38, 29, 33, 32, 39, 34, 34, 40, 40, 42, 42, 33, 41, 33, 41, 42, 42, 42, 42, 37, 36, 35, 31, 30, 43, 8, 8, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 } ; static yyconst flex_int16_t yy_chk[85] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 24, 24, 32, 32, 38, 38, 44, 19, 20, 28, 20, 20, 40, 40, 41, 41, 20, 33, 40, 33, 42, 42, 33, 33, 23, 22, 21, 11, 9, 5, 4, 3, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "escan.l" #line 4 "escan.l" #include #include #include #include "eparse.h" #include "eparse-eh.h" int bracketCount = 0; char dataSpec[1024]; char *dataSpecPtr; //void yyerror(Kst::ObjectStore *store, const char *s); #define YY_DECL int yylex(Kst::ObjectStore *store) #line 506 "escan.cpp" #define INITIAL 0 #define DATA 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #ifndef Q_OS_WIN32 #include #endif #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); int yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif // static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 21 "escan.l" #line 697 "escan.cpp" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 44 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 59 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 23 "escan.l" { yylval.number = atof(yytext); return T_NUMBER; } YY_BREAK case 2: YY_RULE_SETUP #line 30 "escan.l" { yylval.data = strdup(yytext); /*printf("Found an ID [%s]\n", yylval.data);*/ return T_IDENTIFIER; } YY_BREAK case 3: YY_RULE_SETUP #line 36 "escan.l" { switch (*yytext) { case '[': ++bracketCount; *dataSpecPtr = *yytext; ++dataSpecPtr; break; case ']': if (--bracketCount == 0) { *dataSpecPtr = 0; yylval.data = strdup(dataSpec); if (dataSpecPtr == dataSpec) { yyerror(store, "Empty data reference."); yy_flush_buffer(YY_CURRENT_BUFFER); BEGIN(INITIAL); return T_INVALID; } BEGIN(INITIAL); return T_DATA; } *dataSpecPtr = *yytext; ++dataSpecPtr; break; default: *dataSpecPtr = *yytext; ++dataSpecPtr; break; } } YY_BREAK case YY_STATE_EOF(DATA): #line 66 "escan.l" { yyerror(store, "Invalid data reference."); yy_flush_buffer(YY_CURRENT_BUFFER); BEGIN(INITIAL); return T_INVALID; } YY_BREAK case 4: YY_RULE_SETUP #line 73 "escan.l" { bracketCount = 1; dataSpecPtr = dataSpec; *dataSpecPtr = 0; BEGIN(DATA); } YY_BREAK case 5: YY_RULE_SETUP #line 80 "escan.l" { yyerror(store, "Unmatched ']'."); yy_flush_buffer(YY_CURRENT_BUFFER); return T_INVALID; } YY_BREAK case 6: YY_RULE_SETUP #line 86 "escan.l" return T_NOT; YY_BREAK case 7: YY_RULE_SETUP #line 88 "escan.l" return T_AND; YY_BREAK case 8: YY_RULE_SETUP #line 90 "escan.l" return T_OR; YY_BREAK case 9: YY_RULE_SETUP #line 92 "escan.l" return T_LAND; YY_BREAK case 10: YY_RULE_SETUP #line 94 "escan.l" return T_LOR; YY_BREAK case 11: YY_RULE_SETUP #line 96 "escan.l" return T_LT; YY_BREAK case 12: YY_RULE_SETUP #line 98 "escan.l" return T_LE; YY_BREAK case 13: YY_RULE_SETUP #line 100 "escan.l" return T_GT; YY_BREAK case 14: YY_RULE_SETUP #line 102 "escan.l" return T_GE; YY_BREAK case 15: YY_RULE_SETUP #line 104 "escan.l" return T_EQ; YY_BREAK case 16: YY_RULE_SETUP #line 106 "escan.l" return T_EQ; YY_BREAK case 17: YY_RULE_SETUP #line 108 "escan.l" return T_NE; YY_BREAK case 18: YY_RULE_SETUP #line 110 "escan.l" return T_ADD; YY_BREAK case 19: YY_RULE_SETUP #line 112 "escan.l" return T_SUBTRACT; YY_BREAK case 20: YY_RULE_SETUP #line 114 "escan.l" return T_MULTIPLY; YY_BREAK case 21: YY_RULE_SETUP #line 116 "escan.l" return T_DIVIDE; YY_BREAK case 22: YY_RULE_SETUP #line 118 "escan.l" return T_MOD; YY_BREAK case 23: YY_RULE_SETUP #line 120 "escan.l" return T_EXP; YY_BREAK case 24: YY_RULE_SETUP #line 122 "escan.l" return T_OPENPAR; YY_BREAK case 25: YY_RULE_SETUP #line 124 "escan.l" return T_CLOSEPAR; YY_BREAK case 26: YY_RULE_SETUP #line 126 "escan.l" return T_COMMA; YY_BREAK case 27: YY_RULE_SETUP #line 128 "escan.l" {} YY_BREAK case 28: YY_RULE_SETUP #line 130 "escan.l" { /*printf("Found char '%c'\n", yytext[0]);*/ yylval.character = yytext[0]; return T_INVALID; } YY_BREAK case YY_STATE_EOF(INITIAL): #line 137 "escan.l" { /*printf("yyterminate\n");*/ yyterminate(); } YY_BREAK case 29: YY_RULE_SETUP #line 142 "escan.l" ECHO; YY_BREAK #line 990 "escan.cpp" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 44 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 44 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 43); return yy_is_jam ? 0 : yy_current_state; } #if 0 static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus #ifndef Q_OS_WIN32 extern int isatty (int ); #endif #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } #ifdef Q_OS_WIN32 b->yy_is_interactive = false; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 142 "escan.l" Kst-2.0.8/src/libkstmath/curvehint.cpp0000644000175000017500000000346112277111530017025 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curvehint.h" #include "datacollection.h" #include "relation.h" #include "curve.h" #include namespace Kst { CurveHint::CurveHint(const QString& name, const QString& x, const QString& y) : Shared(), _curveName(name), _xVectorName(x), _yVectorName(y) { } CurveHint::~CurveHint() { } const QString& CurveHint::xVectorName() const { return _xVectorName; } const QString& CurveHint::yVectorName() const { return _yVectorName; } #if 0 VectorPtr CurveHint::xVector() const { return *vectorList.findTag(_xVectorName); } VectorPtr CurveHint::yVector() const { return *vectorList.findTag(_yVectorName); } RelationPtr CurveHint::makeCurve(const QString& tag, const QColor& color) const { VectorPtr x = xVector(); VectorPtr y = yVector(); if (!x || !y) { qDebug() << "Couldn't find either " << _xVectorName << " or " << _yVectorName << endl; return 0L; } return new Curve(tag, x, y, 0L, 0L, 0L, 0L, color); } #endif } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dataobjectscriptinterface.h0000644000175000017500000000633312362705136021700 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2012 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include #include #include "scriptinterface.h" #include "basicplugin.h" #include "equation.h" #include "psd.h" #include "objectstore.h" #include "updatemanager.h" #include "updateserver.h" #ifndef DATAOBJECTSCRIPTINTERFACE_H #define DATAOBJECTSCRIPTINTERFACE_H namespace Kst { class KSTMATH_EXPORT DataObjectSI : public ScriptInterface { Q_OBJECT public: QString setInputVector(QString& command); QString setInputScalar(QString& command); QString outputVector(QString& command); QString outputScalar(QString& command); protected: DataObjectPtr _dataObject; }; class PluginSI; typedef QString (PluginSI::*PluginInterfaceMemberFn)(QString& command); class KSTMATH_EXPORT PluginSI : public DataObjectSI { Q_OBJECT public: explicit PluginSI(BasicPluginPtr plugin); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newPlugin(ObjectStore *store, QByteArray pluginName); protected: QString noSuchFn(QString&) {return ""; } private: BasicPluginPtr _plugin; QMap _fnMap; }; class EquationSI; typedef QString (EquationSI::*EquationInterfaceMemberFn)(QString& command); class KSTMATH_EXPORT EquationSI : public DataObjectSI { Q_OBJECT public: explicit EquationSI(EquationPtr equation); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newEquation(ObjectStore *store); protected: QString noSuchFn(QString&) {return ""; } private: EquationPtr _equation; QMap _fnMap; QString equation(QString &); QString setEquation(QString &eq); }; class SpectrumSI; typedef QString (SpectrumSI::*SpectrumInterfaceMemberFn)(QString& command); class KSTMATH_EXPORT SpectrumSI : public DataObjectSI { Q_OBJECT public: explicit SpectrumSI(PSDPtr psd); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newSpectrum(ObjectStore *store); protected: QString noSuchFn(QString&) {return ""; } private: PSDPtr _psd; QMap _fnMap; QString change(QString &command); //QString equation(QString &); //QString setEquation(QString &eq); }; } #endif // DATAOBJECTSCRIPTINTERFACE_H Kst-2.0.8/src/libkstmath/escan.l0000644000175000017500000000427312277111530015562 0ustar synthsynth%option noyywrap %x DATA %{ #include #include #include #include "eparse.h" #include "eparse-eh.h" int bracketCount = 0; char dataSpec[1024]; char *dataSpecPtr; //void yyerror(Kst::ObjectStore *store, const char *s); #define YY_DECL int yylex(Kst::ObjectStore *store) %} Number (0|[1-9][0-9]*)([\.][0-9]+)?([eE][\+\-]?[0-9]+)? Id [A-Za-z]+ %% {Number} { yylval.number = atof(yytext); /*printf("Found a number %.15f\n", yylval.number);*/ return T_NUMBER; } {Id} { yylval.data = strdup(yytext); /*printf("Found an ID [%s]\n", yylval.data);*/ return T_IDENTIFIER; } . { switch (*yytext) { case '[': ++bracketCount; *dataSpecPtr = *yytext; ++dataSpecPtr; break; case ']': if (--bracketCount == 0) { *dataSpecPtr = 0; yylval.data = strdup(dataSpec); if (dataSpecPtr == dataSpec) { yyerror(store, "Empty data reference."); yy_flush_buffer(YY_CURRENT_BUFFER); BEGIN(INITIAL); return T_INVALID; } BEGIN(INITIAL); return T_DATA; } *dataSpecPtr = *yytext; ++dataSpecPtr; break; default: *dataSpecPtr = *yytext; ++dataSpecPtr; break; } } <> { yyerror(store, "Invalid data reference."); yy_flush_buffer(YY_CURRENT_BUFFER); BEGIN(INITIAL); return T_INVALID; } "[" { bracketCount = 1; dataSpecPtr = dataSpec; *dataSpecPtr = 0; BEGIN(DATA); } "]" { yyerror(store, "Unmatched ']'."); yy_flush_buffer(YY_CURRENT_BUFFER); return T_INVALID; } "!" return T_NOT; "&" return T_AND; "|" return T_OR; "&&" return T_LAND; "||" return T_LOR; "<" return T_LT; "<=" return T_LE; ">" return T_GT; ">=" return T_GE; "=" return T_EQ; "==" return T_EQ; "!=" return T_NE; "+" return T_ADD; "-" return T_SUBTRACT; "*" return T_MULTIPLY; "/" return T_DIVIDE; "%" return T_MOD; "^" return T_EXP; "(" return T_OPENPAR; ")" return T_CLOSEPAR; "," return T_COMMA; [ \t] {} . { /*printf("Found char '%c'\n", yytext[0]);*/ yylval.character = yytext[0]; return T_INVALID; } <> { /*printf("yyterminate\n");*/ yyterminate(); } %% Kst-2.0.8/src/libkstmath/eparse.h0000644000175000017500000000623512277111530015744 0ustar synthsynth/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { T_NUMBER = 258, T_IDENTIFIER = 259, T_DATA = 260, T_OPENPAR = 261, T_CLOSEPAR = 262, T_COMMA = 263, T_INVALID = 264, T_LOR = 265, T_LAND = 266, T_OR = 267, T_AND = 268, T_NE = 269, T_EQ = 270, T_GE = 271, T_GT = 272, T_LE = 273, T_LT = 274, T_SUBTRACT = 275, T_ADD = 276, T_MOD = 277, T_DIVIDE = 278, T_MULTIPLY = 279, T_NOT = 280, U_SUBTRACT = 281, T_EXP = 282 }; #endif /* Tokens. */ #define T_NUMBER 258 #define T_IDENTIFIER 259 #define T_DATA 260 #define T_OPENPAR 261 #define T_CLOSEPAR 262 #define T_COMMA 263 #define T_INVALID 264 #define T_LOR 265 #define T_LAND 266 #define T_OR 267 #define T_AND 268 #define T_NE 269 #define T_EQ 270 #define T_GE 271 #define T_GT 272 #define T_LE 273 #define T_LT 274 #define T_SUBTRACT 275 #define T_ADD 276 #define T_MOD 277 #define T_DIVIDE 278 #define T_MULTIPLY 279 #define T_NOT 280 #define U_SUBTRACT 281 #define T_EXP 282 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 20 "../../../src/libkstmath/eparse.y" { char *data; double number; void *n; /* tree node */ char character; } /* Line 1529 of yacc.c. */ #line 110 "eparse.tab.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; Kst-2.0.8/src/libkstmath/relationscriptinterface.h0000644000175000017500000000773312362701575021425 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef RELATIONSCRIPTINTERFACE_H #define RELATIONSCRIPTINTERFACE_H #include #include "scriptinterface.h" #include "curve.h" #include "image.h" namespace Kst { class CurveSI; typedef QString (CurveSI::*CurveInterfaceMemberFn)(QString& command); class ImageSI; typedef QString (ImageSI::*ImageInterfaceMemberFn)(QString& command); class KSTMATH_EXPORT RelationSI : public ScriptInterface { Q_OBJECT public: QString maxX(QString&); QString minX(QString&); QString maxY(QString&); QString minY(QString&); QString showEditDialog(QString&); protected: RelationPtr relation; }; class KSTMATH_EXPORT CurveSI : public RelationSI { Q_OBJECT public: explicit CurveSI(CurvePtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newCurve(ObjectStore *store); protected: QString noSuchFn(QString&) {return ""; } private: CurvePtr curve; QMap _fnMap; QString setXVector(QString& command); QString setYVector(QString& command); QString setXError(QString& command); QString setYError(QString& command); QString setXMinusError(QString& command); QString setYMinusError(QString& command); QString setColor(QString& command); QString setHeadColor(QString& command); QString setBarFillColor(QString& command); QString setHasPoints(QString& command); QString setHasLines(QString& command); QString setHasBars(QString& command); QString setHasHead(QString& command); QString setLineWidth(QString& command); QString setPointSize(QString& command); QString setPointType(QString& command); QString setHeadType(QString& command); QString setLineStyle(QString& command); QString setPointDensity(QString& command); QString color(QString&); QString headColor(QString&); QString barFillColor(QString&); QString hasPoints(QString&); QString hasLines(QString&); QString hasBars(QString&); QString hasHead(QString&); QString lineWidth(QString&); QString pointSize(QString&); QString pointType(QString&); QString headType(QString&); QString lineStyle(QString&); QString pointDensity(QString& command); QString xVector(QString &); QString yVector(QString &); QString xErrorVector(QString &); QString yErrorVector(QString &); QString xMinusErrorVector(QString &); QString yMinusErrorVector(QString &); }; class KSTMATH_EXPORT ImageSI : public RelationSI { Q_OBJECT public: explicit ImageSI(ImagePtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newImage(ObjectStore *store); protected: QString noSuchFn(QString&) {return ""; } private: ImagePtr image; QMap _fnMap; QString setMatrix(QString& command); QString setPalette(QString& command); QString setFixedColorRange(QString& command); QString setAutoColorRange(QString& command); QString lowerThreshold(QString&); QString upperThreshold(QString&); }; } #endif // RELATIONSCRIPTINTERFACE_H Kst-2.0.8/src/libkstmath/csd.h0000644000175000017500000000712412277111530015234 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 by University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling cumulative spectral decay for kst */ #ifndef CSD_H #define CSD_H #include "dataobject.h" #include "psdcalculator.h" #include "kstmath_export.h" namespace Kst { class KSTMATH_EXPORT CSD : public DataObject { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; virtual void save(QXmlStreamWriter &s); virtual QString propertyString() const; void setVector(VectorPtr); VectorPtr vector() const; virtual bool slaveVectorsUsed() const; virtual void showNewDialog(); virtual void showEditDialog(); bool apodize() const; void setApodize(bool in_apodize); bool removeMean() const; void setRemoveMean(bool in_removeMean); bool average() const; void setAverage(bool in_average); double frequency() const; void setFrequency(double in_frequency); ApodizeFunction apodizeFxn() const; void setApodizeFxn(ApodizeFunction in_fxn); double gaussianSigma() const; void setGaussianSigma(double in_sigma); int windowSize() const; void setWindowSize(int in_size); int length() const; void setLength(int in_length); const QString& vectorUnits() const; void setVectorUnits(const QString& units); const QString& rateUnits() const; void setRateUnits(const QString& units); PSDType output() const; void setOutput(PSDType in_outputType); MatrixPtr outputMatrix() const; virtual DataObjectPtr makeDuplicate() const; void change(VectorPtr in_V, double in_freq, bool in_average, bool in_removeMean, bool in_apodize, ApodizeFunction in_apodizeFxn, int in_windowSize, int in_length, double in_gaussianSigma, PSDType in_outputType, const QString& in_vectorUnits, const QString& in_rateUnits); virtual QString descriptionTip() const; virtual void internalUpdate(); protected: CSD(ObjectStore *store); virtual ~CSD(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); private: void updateMatrixLabels(); double _frequency; bool _average; bool _removeMean; bool _apodize; ApodizeFunction _apodizeFxn; PSDType _outputType; double _gaussianSigma; int _windowSize; int _averageLength; int _length; QString _vectorUnits; QString _rateUnits; PSDCalculator _psdCalculator; // output matrix MatrixPtr _outMatrix; }; typedef SharedPtr CSDPtr; typedef ObjectList CSDList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/relationscriptinterface.cpp0000644000175000017500000003462212362701575021755 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "relationscriptinterface.h" #include "objectstore.h" #include "datasourcepluginmanager.h" #include "updatemanager.h" #include "updateserver.h" #include "vector.h" #include "colorsequence.h" #include "linestyle.h" #include "palette.h" #include namespace Kst { QString doRelationScriptCommand(QString command,Relation *relation) { QString v=ScriptInterface::doNamedObjectCommand(command, relation); if (!v.isEmpty()) { return v; } return QString(); } QString RelationSI::maxX(QString&) { return QString::number(relation->maxX()); } QString RelationSI::minX(QString&) { return QString::number(relation->minX()); } QString RelationSI::maxY(QString&) { return QString::number(relation->maxY()); } QString RelationSI::minY(QString&) { return QString::number(relation->minY()); } QString RelationSI::showEditDialog(QString&) { relation->showEditDialog(); return "done"; } /******************************************************/ /* Curves */ /******************************************************/ CurveSI::CurveSI(CurvePtr it) { curve=it; relation = it; _fnMap.insert("setXVector",&CurveSI::setXVector); _fnMap.insert("setYVector",&CurveSI::setYVector); _fnMap.insert("setXError",&CurveSI::setXError); _fnMap.insert("setYError",&CurveSI::setYError); _fnMap.insert("setXMinusError",&CurveSI::setXMinusError); _fnMap.insert("setYMinusError",&CurveSI::setYMinusError); _fnMap.insert("setColor",&CurveSI::setColor); _fnMap.insert("setHeadColor",&CurveSI::setHeadColor); _fnMap.insert("setBarFillColor",&CurveSI::setBarFillColor); _fnMap.insert("setHasPoints",&CurveSI::setHasPoints); _fnMap.insert("setHasLines",&CurveSI::setHasLines); _fnMap.insert("setHasBars",&CurveSI::setHasBars); _fnMap.insert("setHasHead",&CurveSI::setHasHead); _fnMap.insert("color",&CurveSI::color); _fnMap.insert("headColor",&CurveSI::headColor); _fnMap.insert("barFillColor",&CurveSI::barFillColor); _fnMap.insert("hasPoints",&CurveSI::hasPoints); _fnMap.insert("hasLines",&CurveSI::hasLines); _fnMap.insert("hasBars",&CurveSI::hasBars); _fnMap.insert("hasHead",&CurveSI::hasHead); _fnMap.insert("setLineWidth",&CurveSI::setLineWidth); _fnMap.insert("setPointSize",&CurveSI::setPointSize); _fnMap.insert("setPointType",&CurveSI::setPointType); _fnMap.insert("setHeadType",&CurveSI::setHeadType); _fnMap.insert("setLineStyle",&CurveSI::setLineStyle); _fnMap.insert("setPointDensity",&CurveSI::setPointDensity); _fnMap.insert("lineWidth",&CurveSI::lineWidth); _fnMap.insert("pointSize",&CurveSI::pointSize); _fnMap.insert("pointType",&CurveSI::pointType); _fnMap.insert("headType",&CurveSI::headType); _fnMap.insert("lineStyle",&CurveSI::lineStyle); _fnMap.insert("pointDensity",&CurveSI::pointDensity); // functions from relationSI _fnMap.insert("maxX",&CurveSI::maxX); _fnMap.insert("minX",&CurveSI::minX); _fnMap.insert("maxY",&CurveSI::maxY); _fnMap.insert("minY",&CurveSI::minY); _fnMap.insert("showEditDialog",&CurveSI::showEditDialog); _fnMap.insert("xVector",&CurveSI::xVector); _fnMap.insert("yVector",&CurveSI::yVector); _fnMap.insert("xErrorVector",&CurveSI::xErrorVector); _fnMap.insert("yErrorVector",&CurveSI::yErrorVector); _fnMap.insert("xMinusErrorVector",&CurveSI::xMinusErrorVector); _fnMap.insert("yMinusErrorVector",&CurveSI::yMinusErrorVector); } QString CurveSI::doCommand(QString command_in) { QString command = command_in.left(command_in.indexOf('(')); CurveInterfaceMemberFn fn=_fnMap.value(command,&CurveSI::noSuchFn); if(fn!=&CurveSI::noSuchFn) { return CALL_MEMBER_FN(*this,fn)(command_in); } QString v=doRelationScriptCommand(command_in, curve); if (!v.isEmpty()) { return v; } return "No such command"; } bool CurveSI::isValid() { return curve.isPtrValid(); } ScriptInterface* CurveSI::newCurve(ObjectStore *store) { CurvePtr curve; curve = store->createObject(); curve->setColor(ColorSequence::self().next()); return new CurveSI(curve); } QByteArray CurveSI::endEditUpdate() { curve->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+curve->Name()).toLatin1(); } /***************************/ /* commands */ /***************************/ QString CurveSI::setXVector(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setXVector(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setYVector(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setYVector(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setXError(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setXError(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setYError(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setYError(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setXMinusError(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setXMinusError(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setYMinusError(QString& command) { QString parameter = getArg(command); VectorPtr v = kst_cast(curve->store()->retrieveObject(parameter)); if (v) { curve->setYMinusError(v); return "Done"; } else { return QString("Vector %1 not found").arg(parameter); } } QString CurveSI::setColor(QString& command) { QString parameter = getArg(command); curve->setColor(QColor(parameter)); return "Done"; } QString CurveSI::setHeadColor(QString& command) { QString parameter = getArg(command); curve->setHeadColor(QColor(parameter)); return "Done"; } QString CurveSI::setBarFillColor(QString& command) { QString parameter = getArg(command); curve->setBarFillColor(QColor(parameter)); return "Done"; } QString CurveSI::setHasPoints(QString& command) { QString parameter = getArg(command); if (parameter.toLower() == "true") { curve->setHasPoints(true); } else { curve->setHasPoints(false); } return "Done"; } QString CurveSI::setHasLines(QString& command) { QString parameter = getArg(command); if (parameter.toLower() == "true") { curve->setHasLines(true); } else { curve->setHasLines(false); } return "Done"; } QString CurveSI::setHasBars(QString& command) { QString parameter = getArg(command); if (parameter.toLower() == "true") { curve->setHasBars(true); } else { curve->setHasBars(false); } return "Done"; } QString CurveSI::setHasHead(QString& command) { QString parameter = getArg(command); if (parameter.toLower() == "true") { curve->setHasHead(true); } else { curve->setHasHead(false); } return "Done"; } QString CurveSI::setLineWidth(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; if (x>100) x = 100; curve->setLineWidth(x); return "Done"; } QString CurveSI::setPointSize(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; if (x>100) x = 100; curve->setPointSize(x); return "Done"; } QString CurveSI::setPointType(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; curve->setPointType(x); return "Done"; } QString CurveSI::setHeadType(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; curve->setHeadType(x); return "Done"; } QString CurveSI::setLineStyle(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; curve->setLineStyle(x); return "Done"; } QString CurveSI::setPointDensity(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; if (x>POINTDENSITY_MAXTYPE) x = POINTDENSITY_MAXTYPE; curve->setPointDensity(x); return "Done"; } QString CurveSI::color(QString&) { return curve->color().name(); } QString CurveSI::headColor(QString&) { return curve->headColor().name(); } QString CurveSI::barFillColor(QString&) { return curve->barFillColor().name(); } QString CurveSI::hasPoints(QString&) { if (curve->hasPoints()) { return "True"; } else { return "False"; } } QString CurveSI::hasLines(QString&) { if (curve->hasLines()) { return "True"; } else { return "False"; } } QString CurveSI::hasBars(QString&) { if (curve->hasBars()) { return "True"; } else { return "False"; } } QString CurveSI::hasHead(QString&) { if (curve->hasHead()) { return "True"; } else { return "False"; } } QString CurveSI::lineWidth(QString&) { return QString::number(curve->lineWidth()); } QString CurveSI::pointSize(QString&) { return QString::number(curve->pointSize()); } QString CurveSI::pointType(QString&) { return QString::number(curve->pointType()); } QString CurveSI::headType(QString&) { return QString::number(curve->headType()); } QString CurveSI::lineStyle(QString&) { return QString::number(curve->lineStyle()); } QString CurveSI::pointDensity(QString& command) { return QString::number(curve->pointDensity()); } QString CurveSI::xVector(QString &) { return curve->xVector()->shortName(); } QString CurveSI::yVector(QString &) { return curve->yVector()->shortName(); } QString CurveSI::xErrorVector(QString &) { return curve->xErrorVector()->shortName(); } QString CurveSI::yErrorVector(QString &) { return curve->yErrorVector()->shortName(); } QString CurveSI::xMinusErrorVector(QString &) { return curve->xMinusErrorVector()->shortName(); } QString CurveSI::yMinusErrorVector(QString &) { return curve->yMinusErrorVector()->shortName(); } /******************************************************/ /* Images */ /******************************************************/ ImageSI::ImageSI(ImagePtr it) { image=it; relation = it; _fnMap.insert("setMatrix", &ImageSI::setMatrix); _fnMap.insert("setPalette", &ImageSI::setPalette); _fnMap.insert("setFixedColorRange", &ImageSI::setFixedColorRange); _fnMap.insert("setAutoColorRange", &ImageSI::setAutoColorRange); _fnMap.insert("minZ", &ImageSI::lowerThreshold); _fnMap.insert("maxZ", &ImageSI::upperThreshold); // functions from relationSI _fnMap.insert("maxX",&ImageSI::maxX); _fnMap.insert("minX",&ImageSI::minX); _fnMap.insert("maxY",&ImageSI::maxY); _fnMap.insert("minY",&ImageSI::minY); _fnMap.insert("showEditDialog",&ImageSI::showEditDialog); } QString ImageSI::doCommand(QString command_in) { QString command = command_in.left(command_in.indexOf('(')); ImageInterfaceMemberFn fn=_fnMap.value(command,&ImageSI::noSuchFn); if(fn!=&ImageSI::noSuchFn) { return CALL_MEMBER_FN(*this,fn)(command_in); } QString v=doRelationScriptCommand(command_in, image); if (!v.isEmpty()) { return v; } return "No such command"; } bool ImageSI::isValid() { return image.isPtrValid(); } ScriptInterface* ImageSI::newImage(ObjectStore *store) { ImagePtr image; image = store->createObject(); image->setAutoThreshold(true); image->setPalette(Palette::getPaletteList().at(0)); return new ImageSI(image); } QByteArray ImageSI::endEditUpdate() { image->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+image->Name()).toLatin1(); } /***************************/ /* commands */ /***************************/ QString ImageSI::setMatrix(QString& command) { QString parameter = getArg(command); MatrixPtr m = kst_cast(image->store()->retrieveObject(parameter)); if (m) { image->setMatrix(m); return "Done"; } else { return QString("matrix %1 not found").arg(parameter); } } QString ImageSI::setPalette(QString& command) { QString parameter = getArg(command); int x = parameter.toInt(); if (x<0) x = 0; QStringList palette_list = Palette::getPaletteList(); if (x>=palette_list.length()) { x = palette_list.length(); } image->setPalette(palette_list.at(x)); return "Done"; } QString ImageSI::setFixedColorRange(QString& command) { QStringList vars = getArgs(command); double zmin = vars[0].toDouble(); double zmax = vars[1].toDouble(); if (zmin==zmax) { image->setAutoThreshold(true); } else { if (zmin>zmax) { double z = zmax; zmax = zmin; zmin = z; } image->setAutoThreshold(false); image->setLowerThreshold(zmin); image->setUpperThreshold(zmax); } return "Done"; } QString ImageSI::setAutoColorRange(QString& command) { QString parameter = getArg(command); double per = parameter.toDouble(); image->setAutoThreshold(false); image->setThresholdToSpikeInsensitive(per); return "Done"; } QString ImageSI::lowerThreshold(QString&) { return QString::number(image->lowerThreshold()); } QString ImageSI::upperThreshold(QString&) { return QString::number(image->upperThreshold()); } } Kst-2.0.8/src/libkstmath/labelparser.h0000644000175000017500000000527712277111530016766 0ustar synthsynth/*************************************************************************** labelparser.h ---------------- begin : Dec 14 2004 Copyright (C) 2004, The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LABELPARSER_H #define LABELPARSER_H #include "string_kst.h" #include "kstmath_export.h" #include typedef quint16 KstLJustifyType; typedef quint8 KstLHJustifyType; typedef quint8 KstLVJustifyType; #define KST_JUSTIFY_H(x) (x & 0x000000ffL) #define KST_JUSTIFY_H_NONE 0 #define KST_JUSTIFY_H_LEFT 1 #define KST_JUSTIFY_H_RIGHT 2 #define KST_JUSTIFY_H_CENTER 3 #define KST_JUSTIFY_V(x) ((x >> 8) & 0x000000ffL) #define KST_JUSTIFY_V_NONE 0 #define KST_JUSTIFY_V_TOP 1 #define KST_JUSTIFY_V_BOTTOM 2 #define KST_JUSTIFY_V_CENTER 3 #define SET_KST_JUSTIFY(h,v) ( ( h & 0x000000ffL ) | ( ( v & 0x000000ffL ) << 8 ) ) namespace Label { struct KSTMATH_EXPORT ChunkAttributes { ChunkAttributes() : bold(false), italic(false), underline(false), overline(false) {} inline bool empty() const { return !bold && !italic && !underline && !overline && !color.isValid(); } bool bold; bool italic; bool underline; bool overline; QColor color; }; struct KSTMATH_EXPORT Chunk { enum VOffset { None = 0, Up = 1, Down = 2 }; Chunk(Chunk *parent, VOffset = None, bool isGroup = false, bool inherit = false); ~Chunk(); bool locked() const; Chunk *next, *prev, *up, *down, *group; bool scalar : 1; bool linebreak : 1; bool tab : 1; bool vector : 1; VOffset vOffset #ifndef Q_OS_WIN32 : 2 #endif ; ChunkAttributes attributes; QString text; QString expression; }; struct KSTMATH_EXPORT Parsed { Parsed(); ~Parsed(); Chunk *chunk; }; extern KSTMATH_EXPORT Parsed *parse(const QString&, bool interpret = true, bool interpretNewLine = true); } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/enodefactory.cpp0000644000175000017500000000517612277111530017505 0ustar synthsynth/*************************************************************************** enodefactory.cpp ---------- begin : Feb 12 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "enodefactory.h" #include "enodes.h" using namespace Equations; //extern "C" { #define CreateFactory(x) \ void *New##x(void *left, void *right) { \ Node *l = static_cast(left); \ Node *r = static_cast(right); \ return new x(l, r); \ } CreateFactory(Addition) CreateFactory(Subtraction) CreateFactory(Multiplication) CreateFactory(Division) CreateFactory(Modulo) CreateFactory(Power) CreateFactory(BitwiseAnd) CreateFactory(BitwiseOr) CreateFactory(LogicalAnd) CreateFactory(LogicalOr) CreateFactory(LessThan) CreateFactory(LessThanEqual) CreateFactory(GreaterThan) CreateFactory(GreaterThanEqual) CreateFactory(EqualTo) CreateFactory(NotEqualTo) #undef CreateFactory void *NewData(Kst::ObjectStore *store, char *name) { return new DataNode(store, name); } void *NewIdentifier(char *name) { return new Identifier(name); } void *NewFunction(char *name, void *args) { return new Function(name, static_cast(args)); } void *NewNumber(double n) { return new Number(n); } void *NewArgumentList() { return new ArgumentList(); } void AppendArgument(void *list, void *arg) { if (list && arg) { static_cast(list)->appendArgument(static_cast(arg)); } } void *NewNot(void *n) { return new LogicalNot(static_cast(n)); } void *NewNegation(void *n) { return new Negation(static_cast(n)); } void DeleteNode(void *n) { delete static_cast(n); } void ParenthesizeNode(void *n) { static_cast(n)->parenthesize(); } //} // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/builtinrelations.cpp0000644000175000017500000000207012277111530020400 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "builtinrelations.h" #include "curvefactory.h" #include "imagefactory.h" namespace Kst { namespace Builtins { void initRelations() { new CurveFactory; new ImageFactory; } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curve.cpp0000644000175000017500000012471612362701575016162 0ustar synthsynth/*************************************************************************** vcurve.cpp: holds info for a curve ------------------- begin : Fri Nov 3 2000 copyright : (C) 2000 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curve.h" // includes for KDE #include #include #include // application specific includes #include "dialoglauncher.h" #include "colorsequence.h" #include "datacollection.h" #include "debug.h" #include "linestyle.h" #include "math_kst.h" #include "datavector.h" #include "ksttimers.h" #include "objectstore.h" #include "relationscriptinterface.h" #include #include // #define DEBUG_VECTOR_CURVE // #define BENCHMARK // NOTE: on a modern (eg, sandybridge or later) cpu // the cpu's branch prediction is so good, this does // more or less nothing #ifndef KDE_IS_LIKELY #if __GNUC__ - 0 >= 3 # define KDE_ISLIKELY( x ) __builtin_expect(!!(x),1) # define KDE_ISUNLIKELY( x ) __builtin_expect(!!(x),0) #else # define KDE_ISLIKELY( x ) ( x ) # define KDE_ISUNLIKELY( x ) ( x ) #endif #endif // for painting #define MAX_NUM_POLYLINES 3 namespace Kst { const QString Curve::staticTypeString = "Curve"; const QString Curve::staticTypeTag = "curve"; static const QLatin1String& XVECTOR = QLatin1String("X"); static const QLatin1String& YVECTOR = QLatin1String("Y"); static const QLatin1String& EXVECTOR = QLatin1String("EX"); static const QLatin1String& EYVECTOR = QLatin1String("EY"); static const QLatin1String& EXMINUSVECTOR = QLatin1String("EXMinus"); static const QLatin1String& EYMINUSVECTOR = QLatin1String("EYMinus"); Curve::Curve(ObjectStore *store) : Relation(store) { setHasPoints(false); setHasHead(false); setHasBars(false); setHasLines(true); setLineWidth(1); setLineStyle(0); setPointDensity(0); setPointSize(CURVE_DEFAULT_POINT_SIZE); MaxX = MinX = MeanX = MaxY = MinY = MeanY = MinPosX = MinPosY = 0; NS = 0; _typeString = tr("Curve"); _type = "Curve"; _initializeShortName(); Color = QColor(); HeadColor = QColor(); BarFillColor = QColor(); } void Curve::_initializeShortName() { _shortName = 'C'+QString::number(_cnum); if (_cnum>max_cnum) max_cnum = _cnum; _cnum++; } Curve::~Curve() { } ScriptInterface* Curve::createScriptInterface() { return new CurveSI(this); } void Curve::internalUpdate() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); VectorPtr cxV = *_inputVectors.find(XVECTOR); VectorPtr cyV = *_inputVectors.find(YVECTOR); if (!cxV || !cyV) { return; } writeLockInputsAndOutputs(); MaxX = cxV->max(); MinX = cxV->min(); MeanX = cxV->mean(); MinPosX = cxV->minPos(); _ns_maxx = cxV->ns_max(); _ns_minx = cxV->ns_min(); if (MinPosX > MaxX) { MinPosX = 0; } MaxY = cyV->max(); MinY = cyV->min(); MeanY = cyV->mean(); MinPosY = cyV->minPos(); _ns_maxy = cyV->ns_max(); _ns_miny = cyV->ns_min(); if (MinPosY > MaxY) { MinPosY = 0; } NS = qMax(cxV->length(), cyV->length()); unlockInputsAndOutputs(); _redrawRequired = true; return; } void Curve::point(int i, double &x, double &y) const { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } } void Curve::getEXPoint(int i, double &x, double &y, double &ex) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr exv = xErrorVector(); if (exv) { ex = exv->interpolate(i, NS); } } void Curve::getEXMinusPoint(int i, double &x, double &y, double &ex) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr exmv = xMinusErrorVector(); if (exmv) { ex = exmv->interpolate(i, NS); } } void Curve::getEXPoints(int i, double &x, double &y, double &exminus, double &explus) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr exv = xErrorVector(); if (exv) { explus = exv->interpolate(i, NS); } VectorPtr exmv = xMinusErrorVector(); if (exmv) { exminus = exmv->interpolate(i, NS); } } void Curve::getEYPoint(int i, double &x, double &y, double &ey) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr eyv = yErrorVector(); if (eyv) { ey = eyv->interpolate(i, NS); } } void Curve::getEYMinusPoint(int i, double &x, double &y, double &ey) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr eyv = yMinusErrorVector(); if (eyv) { ey = eyv->interpolate(i, NS); } } void Curve::getEYPoints(int i, double &x, double &y, double &eyminus, double &eyplus) { VectorPtr xv = xVector(); if (xv) { x = xv->interpolate(i, NS); } VectorPtr yv = yVector(); if (yv) { y = yv->interpolate(i, NS); } VectorPtr eyv = yErrorVector(); if (eyv) { eyplus = eyv->interpolate(i, NS); } VectorPtr eymv = yMinusErrorVector(); if (eymv) { eyminus = eymv->interpolate(i, NS); } } bool Curve::hasXError() const { return _inputVectors.contains(EXVECTOR); } bool Curve::hasYError() const { return _inputVectors.contains(EYVECTOR); } bool Curve::hasXMinusError() const { return _inputVectors.contains(EXMINUSVECTOR); } bool Curve::hasYMinusError() const { return _inputVectors.contains(EYMINUSVECTOR); } void Curve::save(QXmlStreamWriter &s) { s.writeStartElement(staticTypeTag); s.writeAttribute("xvector", _inputVectors[XVECTOR]->Name()); s.writeAttribute("yvector", _inputVectors[YVECTOR]->Name()); if (_inputVectors.contains(EXVECTOR)) { s.writeAttribute("errorxvector", _inputVectors[EXVECTOR]->Name()); } if (_inputVectors.contains(EYVECTOR)) { s.writeAttribute("erroryvector", _inputVectors[EYVECTOR]->Name()); } if (_inputVectors.contains(EXMINUSVECTOR)) { s.writeAttribute("errorxminusvector", _inputVectors[EXMINUSVECTOR]->Name()); } if (_inputVectors.contains(EYMINUSVECTOR)) { s.writeAttribute("erroryminusvector", _inputVectors[EYMINUSVECTOR]->Name()); } s.writeAttribute("color", Color.name()); s.writeAttribute("alpha", QString::number(Color.alpha())); s.writeAttribute("headcolor", HeadColor.name()); s.writeAttribute("headalpha", QString::number(HeadColor.alpha())); s.writeAttribute("barfillcolor", BarFillColor.name()); s.writeAttribute("barfillalpha", QString::number(BarFillColor.alpha())); s.writeAttribute("haslines", QVariant(HasLines).toString()); s.writeAttribute("linewidth", QString::number(LineWidth)); s.writeAttribute("linestyle", QString::number(LineStyle)); s.writeAttribute("haspoints", QVariant(HasPoints).toString()); s.writeAttribute("pointtype", QString::number(PointType)); s.writeAttribute("pointdensity", QString::number(PointDensity)); s.writeAttribute("pointsize", QString::number(PointSize)); s.writeAttribute("hasbars", QVariant(HasBars).toString()); s.writeAttribute("ignoreautoscale", QVariant(_ignoreAutoScale).toString()); s.writeAttribute("hashead", QVariant(HasHead).toString()); s.writeAttribute("headtype", QString::number(HeadType)); saveNameInfo(s, CNUM); s.writeEndElement(); } void Curve::setXVector(VectorPtr new_vx) { if (new_vx) { _inputVectors[XVECTOR] = new_vx; } else { _inputVectors.remove(XVECTOR); } } void Curve::setYVector(VectorPtr new_vy) { if (new_vy) { _inputVectors[YVECTOR] = new_vy; } else { _inputVectors.remove(YVECTOR); } } void Curve::setXError(VectorPtr new_ex) { if (new_ex) { _inputVectors[EXVECTOR] = new_ex; } else { _inputVectors.remove(EXVECTOR); } } void Curve::setYError(VectorPtr new_ey) { if (new_ey) { _inputVectors[EYVECTOR] = new_ey; } else { _inputVectors.remove(EYVECTOR); } } void Curve::setXMinusError(VectorPtr new_ex) { if (new_ex) { _inputVectors[EXMINUSVECTOR] = new_ex; } else { _inputVectors.remove(EXMINUSVECTOR); } } void Curve::setYMinusError(VectorPtr new_ey) { if (new_ey) { _inputVectors[EYMINUSVECTOR] = new_ey; } else { _inputVectors.remove(EYMINUSVECTOR); } } // labels for plots LabelInfo Curve::xLabelInfo() const { return xVector()->labelInfo(); } LabelInfo Curve::yLabelInfo() const { return yVector()->labelInfo(); } LabelInfo Curve::titleInfo() const { return yVector()->titleInfo(); } QString Curve::propertyString() const { return tr("%1 vs %2", "a plot of arg1 vs arg2").arg(yVector()->Name()).arg(xVector()->Name()); } void Curve::showNewDialog() { DialogLauncher::self()->showCurveDialog(); } void Curve::showEditDialog() { DialogLauncher::self()->showCurveDialog(this); } int Curve::samplesPerFrame() const { const DataVector *rvp = qobject_cast(_inputVectors[YVECTOR].data()); return rvp ? rvp->samplesPerFrame() : 1; } VectorPtr Curve::xVector() const { return *_inputVectors.find(XVECTOR); } VectorPtr Curve::yVector() const { return *_inputVectors.find(YVECTOR); } VectorPtr Curve::xErrorVector() const { return *_inputVectors.find(EXVECTOR); } VectorPtr Curve::yErrorVector() const { return *_inputVectors.find(EYVECTOR); } VectorPtr Curve::xMinusErrorVector() const { return *_inputVectors.find(EXMINUSVECTOR); } VectorPtr Curve::yMinusErrorVector() const { return *_inputVectors.find(EYMINUSVECTOR); } bool Curve::xIsRising() const { return _inputVectors[XVECTOR]->isRising(); } inline int indexNearX(double x, VectorPtr& xv, int NS) { // monotonically rising: we can do a binary search // should be reasonably fast if (xv->isRising()) { int i_top = NS - 1; int i_bot = 0; // don't pre-check for x outside of the curve since this is not // the common case. It will be correct - just slightly slower... while (i_bot + 1 < i_top) { int i0 = (i_top + i_bot)/2; double rX = xv->interpolate(i0, NS); if (x < rX) { i_top = i0; } else { i_bot = i0; } } double xt = xv->interpolate(i_top, NS); double xb = xv->interpolate(i_bot, NS); if (xt - x < x - xb) { return i_top; } else { return i_bot; } } else { // Oh Oh... not monotonically rising - we have to search the entire curve! // May be unbearably slow for large vectors double rX = xv->interpolate(0, NS); double dx0 = fabs(x - rX); int i0 = 0; for (int i = 1; i < NS; ++i) { rX = xv->interpolate(i, NS); double dx = fabs(x - rX); if (dx < dx0) { dx0 = dx; i0 = i; } } return i0; } } /** getIndexNearXY: return index of point within (or closest too) x +- dx which is closest to y **/ int Curve::getIndexNearXY(double x, double dx_per_pix, double y) const { VectorPtr xv = *_inputVectors.find(XVECTOR); VectorPtr yv = *_inputVectors.find(YVECTOR); if (!xv || !yv) { return 0; // anything better we can do? } double xi, yi, dx, dxi, dy, dyi; bool first = true; int i,i0, iN, index; int sc = sampleCount(); if (xv->isRising()) { iN = i0 = indexNearX(x, xv, NS); xi = xv->interpolate(i0, NS); while (i0 > 0 && x-dx_per_pix < xi) { xi = xv->interpolate(--i0, NS); } xi = xv->interpolate(iN, NS); while (iN < sc-1 && x+dx_per_pix > xi) { xi = xv->interpolate(++iN, NS); } } else { i0 = 0; iN = sampleCount()-1; } index = i0; xi = xv->interpolate(index, NS); yi = yv->interpolate(index, NS); dx = fabs(x - xi); dy = fabs(y - yi); for (i = i0 + 1; i <= iN; ++i) { xi = xv->interpolate(i, NS); dxi = fabs(x - xi); if (dxi < dx_per_pix) { dx = dxi; yi = yv->interpolate(i, NS); dyi = fabs(y - yi); if (first || dyi < dy) { first = false; index = i; dy = dyi; } } else if (dxi < dx) { dx = dxi; index = i; } } return index; } void Curve::setHasPoints(bool in_HasPoints) { HasPoints = in_HasPoints; } void Curve::setHasHead(bool in_HasHead) { HasHead = in_HasHead; } void Curve::setHasLines(bool in_HasLines) { HasLines = in_HasLines; } void Curve::setHasBars(bool in_HasBars) { HasBars = in_HasBars; } void Curve::setLineWidth(int in_LineWidth) { #ifdef Q_OS_WIN32 if (in_LineWidth == 0) { in_LineWidth = 1; } #endif LineWidth = in_LineWidth; } void Curve::setLineStyle(int in_LineStyle) { LineStyle = in_LineStyle; } void Curve::setPointDensity(int in_PointDensity) { PointDensity = in_PointDensity; } void Curve::setPointType(int in_PointType) { PointType = in_PointType; } void Curve::setPointSize(double in_PointSize) { PointSize = in_PointSize; } void Curve::setHeadType(int in_HeadType) { HeadType = in_HeadType; } void Curve::setColor(const QColor& new_c) { Color = new_c; } void Curve::setHeadColor(const QColor& new_c) { HeadColor = new_c; } void Curve::setBarFillColor(const QColor &new_c) { BarFillColor = new_c; } double Curve::maxX() const { if (hasBars() && sampleCount() > 0) { return MaxX + (MaxX - MinX)/(2*(sampleCount()-1)); } return MaxX; } double Curve::minX() const { if (hasBars() && sampleCount() > 0) { return MinX - (MaxX - MinX)/(2*(sampleCount()-1)); } return MinX; } RelationPtr Curve::makeDuplicate() const { CurvePtr curve = store()->createObject(); if (descriptiveNameIsManual()) { curve->setDescriptiveName(descriptiveName()); } curve->setXVector(xVector()); curve->setYVector(yVector()); if (hasXError()) { curve->setXError(xErrorVector()); } if (hasYError()) { curve->setYError(yErrorVector()); } if (hasXMinusError()) { curve->setXMinusError(xMinusErrorVector()); } if (hasYMinusError()) { curve->setYMinusError(yMinusErrorVector()); } curve->setColor(Color); curve->setHeadColor(HeadColor); curve->setBarFillColor(BarFillColor); curve->setHasPoints(HasPoints); curve->setHasLines(HasLines); curve->setHasBars(HasBars); curve->setHasHead(HasHead); curve->setLineWidth(LineWidth); curve->setLineStyle(LineStyle); curve->setPointType(PointType); curve->setPointSize(PointSize); curve->setPointDensity(PointDensity); curve->writeLock(); curve->registerChange(); curve->unlock(); return RelationPtr(curve); } // FIXME: magic numbers (1/4000 and 1/2000) should be based on the reference plot size, // and not just pulled out of the air by what looks ~good. // They are currently "about right" for printing to US Letter. double Curve::pointDim(QRectF w) const { return qMax(qreal(1.01), PointSize * ((w.width() + w.height()) * (1.0 / 4000.0))); } double Curve::lineDim(const QRectF &R, double linewidth) { double lw = qMax(qreal(1.01), linewidth*(R.width()+R.height())*(1.0/2000.0)); // if you ask for a thicker line, make sure it is at least 2 px wide if (linewidth>1.9) { lw = qMax(qreal(2.0),lw); } return (int(lw+0.5)); } void Curve::paintObjects(const CurveRenderContext& context) { #ifdef BENCHMARK QTime bench_time; bench_time.start(); #endif QPainter *p = context.painter; double point_dim = pointDim(p->window()); p->save(); p->setRenderHint(QPainter::Antialiasing, context.antialias); Qt::PenStyle style = Kst::LineStyle[lineStyle()]; if (hasBars()) { p->setPen(QPen(barFillColor(), _width, style)); foreach(const QRectF& rect, _filledRects) { p->fillRect(rect, barFillColor()); } } p->setPen(QPen(color(), _width, style)); foreach(const QPolygonF& poly, _polygons) { p->drawPolyline(poly); } foreach(const QLineF& line, _lines) { p->drawLine(line); } foreach(const QRectF& rect, _rects) { p->drawRect(rect); } foreach(const QPointF& point, _points) { CurvePointSymbol::draw(PointType, p, point.x(), point.y(), point_dim); } if (hasHead() && _head_valid) { p->setPen(QPen(headColor(), _width, style)); CurvePointSymbol::draw(HeadType, p, _head.x(), _head.y(), point_dim); } p->restore(); #ifdef BENCHMARK std::cout << "curve drawing:" << bench_time.elapsed() << "ms\n"; #endif } void Curve::updatePaintObjects(const CurveRenderContext& context) { _polygons.clear(); _lines.clear(); _points.clear(); _filledRects.clear(); _rects.clear(); VectorPtr xv = *_inputVectors.find(XVECTOR); VectorPtr yv = *_inputVectors.find(YVECTOR); if (!xv || !yv) { return; } double Lx = context.Lx, Hx = context.Hx, Ly = context.Ly, Hy = context.Hy; double m_X = context.m_X, m_Y = context.m_Y; double b_X = context.b_X, b_Y = context.b_Y; double XMin = context.XMin, XMax = context.XMax; bool xLog = context.xLog, yLog = context.yLog; double xLogBase = context.xLogBase; double yLogBase = context.yLogBase; double maxY = 0.0, minY = 0.0; double rX = 0.0, rY, rEX, rEY; double X1 = 0.0, Y1 = 0.0; double X2 = 0.0, Y2 = 0.0; double last_x1, last_y1; bool overlap = false; int i_pt; #ifdef BENCHMARK QTime bench_time, benchtmp; int b_1 = 0, b_2 = 0, b_3 = 0, b_4 = 0; bench_time.start(); benchtmp.start(); int numberOfLinesDrawn = 0; int numberOfPointsDrawn = 0; int numberOfBarsDrawn = 0; #endif _width = lineDim(context.painter->window(), lineWidth()); //qDebug() << context.painter->device()->width() << context.painter->device()->logicalDpiX() << // context.painter->device()->width()/context.painter->device()->logicalDpiX(); double errorFlagDim = pointDim(context.painter->window()); if (sampleCount() > 0) { int i0, iN; if (xv->isRising()) { i0 = indexNearX(XMin, xv, NS); if (i0 > 0) { --i0; } iN = indexNearX(XMax, xv, NS); if (iN < sampleCount() - 1) { ++iN; } } else { i0 = 0; iN = sampleCount() - 1; } #ifdef BENCHMARK clock_t linesStart = clock(); #endif if (hasLines()) { QPolygonF points; points.reserve(MAX_NUM_POLYLINES); double lastPlottedX = 0; double lastPlottedY = 0; int index = 0; int i0Start = i0; // optimize - isnan seems expensive, at least in gcc debug mode // cachegrind backs this up. #undef isnan #define isnan(x) (x != x) rX = xv->interpolate(i0, NS); rY = yv->interpolate(i0, NS); // if invalid point then look backward for the last valid point. while (i0 > 0 && (isnan(rX) || isnan(rY))) { --i0; rX = xv->interpolate(i0, NS); rY = yv->interpolate(i0, NS); } // if invalid point then look forward for the next valid point... if (isnan(rX) || isnan(rY)) { i0 = i0Start; while (i0 < iN && (isnan(rX) || isnan(rY))) { ++i0; rX = xv->interpolate(i0, NS); rY = yv->interpolate(i0, NS); } } if (xLog) { rX = logXLo(rX, xLogBase); } if (yLog) { rY = logYLo(rY, yLogBase); } last_x1 = m_X*rX + b_X; last_y1 = m_Y*rY + b_Y; i_pt = i0; while (i_pt < iN) { X2 = last_x1; Y2 = last_y1; ++i_pt; rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); bool foundNan = false; // if necessary continue looking for the first valid point... while (i_pt < iN && (isnan(rX) || isnan(rY))) { #undef isnan foundNan = true; ++i_pt; rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); } if (KDE_ISUNLIKELY(foundNan)) { if (points.size()>0) { _polygons.append(points); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } points.resize(0); if (overlap) { if (X2 >= Lx && X2 <= Hx) { if (maxY > Hy && minY <= Hy) maxY = Hy; if (minY < Ly && maxY >= Ly) minY = Ly; if (minY >= Ly && minY <= Hy && maxY >= Ly && maxY <= Hy) { #ifdef BENCHMARK ++numberOfLinesDrawn; #endif double fX2 = floor(X2)+0.5; _lines.append(QLineF(fX2, minY, fX2, maxY)); } } overlap = false; } } if (xLog) { rX = logXLo(rX, xLogBase); } if (yLog) { rY = logYLo(rY, yLogBase); } X1 = m_X*rX + b_X; Y1 = m_Y*rY + b_Y; last_x1 = X1; last_y1 = Y1; if (KDE_ISLIKELY(!foundNan)) { if (KDE_ISLIKELY(samePixel(X1, X2))) { if (KDE_ISLIKELY(overlap)) { if (KDE_ISUNLIKELY(Y1 > maxY)) { maxY = Y1; } if (KDE_ISUNLIKELY(Y1 < minY)) { minY = Y1; } } else { if (Y1 < Y2) { minY = Y1; maxY = Y2; } else { maxY = Y1; minY = Y2; } overlap = true; } } else { if (KDE_ISLIKELY(overlap)) { if (KDE_ISLIKELY(X2 >= Lx && X2 <= Hx)) { if (KDE_ISUNLIKELY(maxY <= Hy && minY >= Ly)) { if (points.size()>MAX_NUM_POLYLINES-2) { _polygons.append(points); points.resize(0); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } double fX2 = floor(X2)+0.5; if (KDE_ISUNLIKELY(minY == maxY)) { points.append(QPointF(fX2, maxY)); } else if (KDE_ISUNLIKELY(Y2 == minY)) { points.append(QPointF(fX2, maxY)); points.append(QPointF(fX2, minY)); } else if (KDE_ISUNLIKELY(Y2 == maxY)) { points.append(QPointF(fX2, minY)); points.append(QPointF(fX2, maxY)); } else { points.append(QPointF(fX2, minY)); points.append(QPointF(fX2, maxY)); if (KDE_ISLIKELY(Y2 >= Ly && Y2 <= Hy)) { points.append(QPointF(fX2, Y2)); } } lastPlottedX = fX2; lastPlottedY = Y2; } else { if (KDE_ISUNLIKELY(maxY > Hy && minY <= Hy)) { maxY = Hy; } if (KDE_ISUNLIKELY(minY < Ly && maxY >= Ly)) { minY = Ly; } if (KDE_ISUNLIKELY(minY >= Ly && minY <= Hy && maxY >= Ly && maxY <= Hy)) { if (points.size()>0) { _polygons.append(points); points.resize(0); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } #ifdef BENCHMARK ++numberOfLinesDrawn; #endif double fX2 = floor(X2)+0.5; _lines.append(QLineF(fX2, minY, fX2, maxY)); } } } overlap = false; } if (KDE_ISLIKELY(!((X1 < Lx && X2 < Lx) || (X1 > Hx && X2 > Hx)))) { // trim the line to be within the plot... if (KDE_ISUNLIKELY(isinf(X1))) { Y1 = Y2; if (X1 > 0.0) { X1 = Hx; } else { X1 = Lx; } } if (KDE_ISUNLIKELY(isinf(X2))) { Y2 = Y1; if (X2 > 0.0) { X2 = Hx; } else { X2 = Lx; } } if (KDE_ISUNLIKELY(isinf(Y1))) { X1 = X2; if (Y1 > 0.0) { Y1 = Hy; } else { Y1 = Ly; } } if (KDE_ISUNLIKELY(isinf(Y2))) { X2 = X1; if (Y2 > 0.0) { Y2 = Hy; } else { Y2 = Ly; } } if (KDE_ISUNLIKELY(X1 < Lx && X2 > Lx)) { Y1 = (Y2 - Y1) / (X2 - X1) * (Lx - X1) + Y1; X1 = Lx; } else if (KDE_ISUNLIKELY(X2 < Lx && X1 > Lx)) { Y2 = (Y1 - Y2) / (X1 - X2) * (Lx - X2) + Y2; X2 = Lx; } if (KDE_ISUNLIKELY(X1 < Hx && X2 > Hx)) { Y2 = (Y2 - Y1) / (X2 - X1) * (Hx - X1) + Y1; X2 = Hx; } else if (KDE_ISUNLIKELY(X2 < Hx && X1 > Hx)) { Y1 = (Y1 - Y2) / (X1 - X2) * (Hx - X2) + Y2; X1 = Hx; } if (KDE_ISUNLIKELY(Y1 < Ly && Y2 > Ly)) { X1 = (X2 - X1) / (Y2 - Y1) * (Ly - Y1) + X1; Y1 = Ly; } else if (KDE_ISUNLIKELY(Y2 < Ly && Y1 > Ly)) { X2 = (X1 - X2) / (Y1 - Y2) * (Ly - Y2) + X2; Y2 = Ly; } if (KDE_ISUNLIKELY(Y1 < Hy && Y2 > Hy)) { X2 = (X2 - X1) / (Y2 - Y1) * (Hy - Y1) + X1; Y2 = Hy; } else if (KDE_ISUNLIKELY(Y2 < Hy && Y1 > Hy)) { X1 = (X1 - X2) / (Y1 - Y2) * (Hy - Y2) + X2; Y1 = Hy; } #ifdef DEBUG_VECTOR_CURVE bool xInBounds = (X1 >= Lx && X1 <= Hx && X2 >= Lx && X2 <= Hx); bool yInBounds = (Y1 >= Ly && Y1 <= Hy && Y2 >= Ly && Y2 <= Hy); if (!xInBounds) qDebug() << "x not in bounds" << "X1:" << X1 << "X2:" << X2 << "Lx:" << Lx << "Hx:" << Hx << endl; if (!yInBounds) qDebug() << "y not in bounds" << "Y1:" << Y1 << "Y2:" << Y2 << "Ly:" << Ly << "Hy:" << Hy << endl; #endif if (X1 >= Lx && X1 <= Hx && X2 >= Lx && X2 <= Hx && Y1 >= Ly && Y1 <= Hy && Y2 >= Ly && Y2 <= Hy) { if (KDE_ISUNLIKELY(points.size()==0)) { points.append(QPointF(X2, Y2)); points.append(QPointF(X1, Y1)); } else if (samePixel(lastPlottedX, X2) && samePixel(lastPlottedY,Y2) && index < MAX_NUM_POLYLINES) { points.append(QPointF(X1, Y1)); } else { if (KDE_ISLIKELY(points.size()>1)) { _polygons.append(points); points.resize(0); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } points.append(QPointF(X2, Y2)); points.append(QPointF(X1, Y1)); } lastPlottedX = X1; lastPlottedY = Y1; } } } // end if (X1 == X2) } // end if (!foundNan) } // end while // we might a have polyline left undrawn... if (points.size()>1) { _polygons.append(points); points.resize(0); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } // we might have some overlapping points still unplotted... if (overlap) { if (X2 >= Lx && X2 <= Hx) { if (maxY > Hy && minY <= Hy) { maxY = Hy; } if (minY < Ly && maxY >= Ly) { minY = Ly; } if (minY >= Ly && minY <= Hy && maxY >= Ly && maxY <= Hy) { #ifdef BENCHMARK ++numberOfLinesDrawn; #endif _lines.append(QLineF(X2, minY, X2, maxY)); } } overlap = false; } } // end if hasLines() #ifdef BENCHMARK clock_t linesEnd = clock(); std::cout << "\n Lines clocks: " << (linesEnd - linesStart) << "\n"; b_1 = benchtmp.elapsed(); #endif VectorPtr exv = _inputVectors.contains(EXVECTOR) ? *_inputVectors.find(EXVECTOR) : 0; VectorPtr eyv = _inputVectors.contains(EYVECTOR) ? *_inputVectors.find(EYVECTOR) : 0; VectorPtr exmv = _inputVectors.contains(EXMINUSVECTOR) ? *_inputVectors.find(EXMINUSVECTOR) : 0; VectorPtr eymv = _inputVectors.contains(EYMINUSVECTOR) ? *_inputVectors.find(EYMINUSVECTOR) : 0; // draw the bargraph bars, if any... if (hasBars()) { bool visible = true; double rX2 = 0.0; double drX = 0.0; QRectF lastRect; if (!exv) { // determine the bar position width. NOTE: This is done // only if xv->isRising() as in this case the calculation // is simple... drX = (maxX() - minX())/double(sampleCount()); if (xv->isRising()) { double oldX = 0.0; for (i_pt = i0; i_pt <= iN; ++i_pt) { rX = xv->interpolate(i_pt, NS); if (i_pt > i0) { if (rX - oldX < drX) { drX = rX - oldX; } } oldX = rX; } } } for (i_pt = i0; i_pt <= iN; ++i_pt) { visible = true; if (exv) { drX = exv->interpolate(i_pt, NS); } rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); rX -= drX/2.0; rX2 = rX + drX; if (xLog) { rX = logXLo(rX, xLogBase); rX2 = logXLo(rX2, xLogBase); } if (yLog) { rY = logYLo(rY, yLogBase); Y2 = Hy; } else { Y2 = b_Y; } X1 = m_X * rX + b_X; X2 = m_X * rX2 + b_X; Y1 = m_Y * rY + b_Y; if ((X1 > Hx) || (X2 < Lx) || (Y1 == Ly && Y2 == Ly) || (Y1 == Hy && Y2 == Hy)) { visible = false; } if (visible) { QRectF rect(X1, Y1, X2 - X1, Y2 - Y1); if (!lastRect.contains(rect)) { //if (barStyle() == 1) { // filled _filledRects.append(rect); //} else { _rects.append(rect); //} lastRect = rect; #ifdef BENCHMARK ++numberOfBarsDrawn; #endif } } } } #ifdef BENCHMARK b_2 = benchtmp.elapsed(); #endif // draw the points, if any... if (hasPoints()) { const double w = Hx - Lx; const double h = Hy - Ly; int size = 0; if (hasLines() && pointDensity() != 0) { // high density: 91 points // med density 27 // low density 9 points size = w / int(pow(3.0, POINTDENSITY_MAXTYPE - pointDensity()+1)); } QRectF rect(Lx, Ly, w, h); QPointF pt, lastPt; for (i_pt = i0; i_pt <= iN; ++i_pt) { rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); if (xLog) { rX = logXLo(rX, xLogBase); } if (yLog) { rY = logYLo(rY, yLogBase); } pt.setX(m_X * rX + b_X); pt.setY(m_Y * rY + b_Y); if (rect.contains(pt) && pt != lastPt && (lastPt.isNull() || (abs(pt.x() - lastPt.x()) > size) || ((size==0) && (abs(pt.y() - lastPt.y()) > 0)))) { #ifdef BENCHMARK ++numberOfPointsDrawn; #endif lastPt = pt; _points.append(pt); } } } _head_valid = false; if (hasHead()) { const double w = Hx - Lx; const double h = Hy - Ly; QRectF rect(Lx, Ly, w, h); rX = xv->interpolate(NS-1, NS); rY = yv->interpolate(NS-1, NS); if (xLog) { rX = logXLo(rX, xLogBase); } if (yLog) { rY = logYLo(rY, yLogBase); } _head.setX(m_X * rX + b_X); _head.setY(m_Y * rY + b_Y); if (rect.contains(_head)) { _head_valid = true; } } #ifdef BENCHMARK b_3 = benchtmp.elapsed(); #endif // draw the x-errors, if any... if ((exv || exmv) && !hasBars()) { double rX1; double rX2; bool do_low_flag = true; bool do_high_flag = true; bool errorSame = false; if (exv && exmv) { if (exv->shortName() == exmv->shortName()) { errorSame = true; } } for (i_pt = i0; i_pt <= iN; ++i_pt) { do_low_flag = true; do_high_flag = true; rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); if (errorSame) { rEX = fabs(exv->interpolate(i_pt, NS)); if (xLog) { rX1 = logXLo(rX - rEX, xLogBase); rX2 = logXLo(rX + rEX, xLogBase); } else { rX1 = rX - rEX; rX2 = rX + rEX; } } else if (exv && exmv) { double rEXHi = fabs(exv->interpolate(i_pt, NS)); double rEXLo = fabs(exmv->interpolate(i_pt, NS)); if (xLog) { rX1 = logXLo(rX - rEXLo, xLogBase); rX2 = logXLo(rX + rEXHi, xLogBase); } else { rX1 = rX - rEXLo; rX2 = rX + rEXHi; } } else if (exv) { rEX = exv->interpolate(i_pt, NS); if (xLog) { rX1 = logXLo(rX, xLogBase); rX2 = logXLo(rX + fabs(rEX), xLogBase); } else { rX1 = rX; rX2 = rX + fabs(rEX); } do_low_flag = false; } else { rEX = fabs(exmv->interpolate(i_pt, NS)); if (xLog) { rX1 = logXLo(rX - rEX, xLogBase); rX2 = logXLo(rX, xLogBase); } else { rX1 = rX - rEX; rX2 = rX; } do_high_flag = false; } if (yLog) { rY = logYLo(rY, yLogBase); } X1 = m_X * rX1 + b_X; X2 = m_X * rX2 + b_X; Y1 = m_Y * rY + b_Y; if (X1 < Lx && X2 > Lx) { X1 = Lx; do_low_flag = false; } if (X1 < Hx && X2 > Hx) { X2 = Hx; do_high_flag = false; } if (X1 >= Lx && X2 <= Hx && Y1 >= Ly && Y1 <= Hy) { _lines.append(QLineF(X1, Y1, X2, Y1)); if (do_low_flag) { _lines.append(QLineF(X1, Y1 + errorFlagDim, X1, Y1 - errorFlagDim)); } if (do_high_flag) { _lines.append(QLineF(X2, Y1 + errorFlagDim, X2, Y1 - errorFlagDim)); } } } } // draw the y-errors, if any... if (eyv || eymv) { double rY1; double rY2; bool do_low_flag = true; bool do_high_flag = true; bool errorSame = false; if (eyv && eymv) { if (eyv->shortName() == eymv->shortName()) { errorSame = true; } } for (i_pt = i0; i_pt <= iN; ++i_pt) { do_low_flag = true; do_high_flag = true; rX = xv->interpolate(i_pt, NS); rY = yv->interpolate(i_pt, NS); if (errorSame) { rEY = eyv->interpolate(i_pt, NS); if (yLog) { rY1 = logYLo(rY-fabs(rEY), yLogBase); rY2 = logYLo(rY+fabs(rEY), yLogBase); } else { rY1 = rY-fabs(rEY); rY2 = rY+fabs(rEY); } } else if (eyv && eymv) { double rEYHi = fabs(eyv->interpolate(i_pt, NS)); double rEYLo = fabs(eymv->interpolate(i_pt, NS)); if (yLog) { rY1 = logYLo(rY - rEYLo, yLogBase); rY2 = logYLo(rY + rEYHi, yLogBase); } else { rY1 = rY - rEYLo; rY2 = rY + rEYHi; } } else if (eyv) { rEY = fabs(eyv->interpolate(i_pt, NS)); if (yLog) { rY1 = logYLo(rY, yLogBase); rY2 = logYLo(rY + rEY, yLogBase); } else { rY1 = rY; rY2 = rY + rEY; } do_low_flag = false; } else { rEY = fabs(eymv->interpolate(i_pt, NS)); if (yLog) { rY1 = logYLo(rY - rEY, yLogBase); rY2 = logYLo(rY, yLogBase); } else { rY1 = rY - rEY; rY2 = rY; } do_high_flag = false; } if (xLog) { rX = logXLo(rX, xLogBase); } X1 = m_X * rX + b_X; Y1 = m_Y * rY1 + b_Y; Y2 = m_Y * rY2 + b_Y; if (Y1 < Ly && Y2 > Ly) { Y1 = Ly; do_low_flag = false; } if (Y1 < Hy && Y2 > Hy) { Y2 = Hy; do_high_flag = false; } if (X1 >= Lx && X1 <= Hx && Y1 >= Ly && Y2 <= Hy) { _lines.append(QLineF(X1, Y1, X1, Y2)); if (do_low_flag) { _lines.append(QLineF(X1 + errorFlagDim, Y1, X1 - errorFlagDim, Y1)); } if (do_high_flag) { _lines.append(QLineF(X1 + errorFlagDim, Y2, X1 - errorFlagDim, Y2)); } } } } // end if (hasYError()) } // end if (sampleCount() > 0) #ifdef BENCHMARK b_4 = benchtmp.elapsed(); #endif #ifdef BENCHMARK int i = bench_time.elapsed(); //qDebug() << endl << "Plotting curve " << (void *)this << ": " << i << "ms"; //qDebug() << " Without locks: " << b_4 << "ms"; //qDebug() << " Number of lines drawn:" << numberOfLinesDrawn; //qDebug() << " Number of points drawn:" << numberOfPointsDrawn; //qDebug() << " Number of bars drawn:" << numberOfBarsDrawn; std::cout << "\nPlotting curve " << (void *)this << ": " << i << " ms"; std::cout << "\n Without locks: " << b_4 << "ms"; std::cout << "\n Number of lines drawn:" << numberOfLinesDrawn; std::cout << "\n Number of points drawn:" << numberOfPointsDrawn; std::cout << "\n Number of bars drawn:" << numberOfBarsDrawn; if (b_1 > 0) std::cout << "\n Lines: " << b_1 << " ms\n"; if (b_2 - b_1 > 0) std::cout << "\n Bars: " << (b_2 - b_1) << " ms\n"; if (b_3 - b_2 > 0) std::cout << "\n Points: " << (b_3 - b_2) << " ms\n"; if (b_4 - b_3 > 0) std::cout << "\n Errors: " << (b_4 - b_3) << " ms\n"; #endif } void Curve::yRange(double xFrom, double xTo, double* yMin, double* yMax) { if (!yMin || !yMax) { return; } VectorPtr xv = *_inputVectors.find(XVECTOR); VectorPtr yv = *_inputVectors.find(YVECTOR); if (!xv || !yv) { *yMin = *yMax = 0; return; } // get range of the curve to search for min/max int i0, iN; if (xv->isRising()) { i0 = indexNearX(xFrom, xv, NS); iN = indexNearX(xTo, xv, NS); } else { i0 = 0; iN = sampleCount() - 1; } // search for min/max bool first = true; double newYMax = 0, newYMin = 0; for (int i_pt = i0; i_pt <= iN; ++i_pt) { double rX = xv->interpolate(i_pt, NS); double rY = yv->interpolate(i_pt, NS); // make sure this point is visible if (rX >= xFrom && rX <= xTo) { // update min/max if (first || rY > newYMax) { newYMax = rY; } if (first || rY < newYMin) { newYMin = rY; } first = false; } } *yMin = newYMin; *yMax = newYMax; } double Curve::distanceToPoint(double xpos, double dx, double ypos) const { // find the y distance between the curve and a point. return 1.0E300 if this distance is undefined. i don't want to use -1 because it will make the code which uses this function messy. VectorPtr xv = *_inputVectors.find(XVECTOR); if (!xv) { return 1.0E300; // anything better we can do? } double distance = 1.0E300; int i_near_x = getIndexNearXY(xpos, dx, ypos); double near_x, near_y; point(i_near_x, near_x, near_y); if (fabs(near_x - xpos) < dx) { distance = fabs(ypos - near_y); // initial estimate. } if (hasLines() && xv->isRising()) { // if hasLines then we should find the distance between the curve and the point, not the data and // the point. if isRising because it is (probably) to slow to use this technique if the data is // unordered. borrowed from indexNearX. use binary search to find the indices immediately above // and below our xpos. int i_top = NS - 1; int i_bot = 0; while (i_bot + 1 < i_top) { int i0 = (i_top + i_bot)/2; double rX = xv->interpolate(i0, NS); if (xpos < rX) { i_top = i0; } else { i_bot = i0; } } // end borrowed double x_bot, y_bot, x_top, y_top; point(i_bot, x_bot, y_bot); point(i_top, x_top, y_top); if (x_bot <= xpos && x_top >= xpos) { near_y = (y_top - y_bot) / (x_top - x_bot) * (xpos - x_bot) + y_bot; // calculate y value for line segment between x_bot and x_top. if (fabs(ypos - near_y) < distance) { distance = fabs(ypos - near_y); } } } return distance; } QSize Curve::legendSymbolSize(QPainter *p) { return QSize(p->fontMetrics().height()*3.5, p->fontMetrics().height()); } void Curve::paintLegendSymbol(QPainter *p, const QSize &size) { QRect bound(QPoint(0,0),size); int width; if (lineWidth() == 0) { width = 1; } else { width = lineWidth(); } p->save(); if (hasLines()) { // draw a line from left to right centered vertically p->setPen(QPen(color(), width, Kst::LineStyle[lineStyle()])); p->drawLine(QLineF(bound.left(), bound.top() + bound.height()*.5, bound.right(), bound.top() + bound.height()*.5)); } if (hasPoints()) { // draw a point in the middle p->setPen(QPen(color(), width)); double point_dim = pointDim(p->window()); CurvePointSymbol::draw(PointType, p, bound.left() + bound.width()*.5, bound.top() + bound.height()*.5, point_dim); } p->restore(); } QString Curve::_automaticDescriptiveName() const { return tr("%1 vs %2").arg(yVector()->descriptiveName()).arg(xVector()->descriptiveName()); } QString Curve::descriptionTip() const { QString tip; tip = tr("Curve: %1\nX: %2\nY: %3").arg(Name()).arg(xVector()->descriptionTip()).arg(yVector()->descriptionTip()); if (hasXError()) { tip += tr("\nX+ Error: %1").arg(xErrorVector()->Name()); } if (hasXMinusError()) { tip += tr("\nX- Error: %1").arg(xMinusErrorVector()->Name()); } if (hasYError()) { tip += tr("\nY+ Error: %1").arg(yErrorVector()->Name()); } if (hasYMinusError()) { tip += tr("\nY- Error: %1").arg(yMinusErrorVector()->Name()); } if (hasLines()) { tip += tr("\nLines: Width %1 and Style %2").arg(lineWidth()).arg(lineStyle()); } if (hasPoints()) { tip += tr("\nPoints: Style %1").arg(pointType()); } if (hasBars()) { tip += tr("\nBars"); } return tip; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/enodes.cpp0000644000175000017500000007033212277111530016274 0ustar synthsynth/*************************************************************************** enodes.cpp ---------- begin : Feb 12 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "enodes.h" #include #include #include #include #include #ifndef Q_OS_WIN32 #include #else #define strcasecmp _stricmp #endif #include #include #include "datacollection.h" #include "debug.h" #include "math_kst.h" #include "objectstore.h" #include "doublecompare.h" KSTMATH_EXPORT int yyparse(Kst::ObjectStore *store); KSTMATH_EXPORT extern void *ParsedEquation; KSTMATH_EXPORT/*"C"*/ struct yy_buffer_state *yy_scan_string(const char*); KSTMATH_EXPORT struct yy_buffer_state *yy_scan_bytes(const char*, int); typedef struct yy_buffer_state *YY_BUFFER_STATE; KSTMATH_EXPORT void yy_delete_buffer(YY_BUFFER_STATE); using namespace Equations; using namespace Kst; static QMutex _mutex; QMutex& Equations::mutex() { return _mutex; } double Equations::interpret(ObjectStore *store, const char *txt, bool *ok, int len) { if (!txt || !*txt) { if (ok) { *ok = false; } return 0.0; } mutex().lock(); YY_BUFFER_STATE b; if (len > 0) { b = yy_scan_bytes(txt, len); } else { b = yy_scan_string(txt); } int rc = yyparse(store); yy_delete_buffer(b); if (rc == 0) { Equations::Node *eq = static_cast(ParsedEquation); ParsedEquation = 0L; mutex().unlock(); Equations::Context ctx; ctx.sampleCount = 2; ctx.noPoint = Kst::NOPOINT; ctx.x = 0.0; ctx.xVector = 0L; Equations::FoldVisitor vis(&ctx, &eq); double v = eq->value(&ctx); delete eq; if (ok) { *ok = true; } return v; } else { ParsedEquation = 0L; mutex().unlock(); if (ok) { *ok = false; } return 0.0; } } Node::Node() { _parentheses = false; } Node::~Node() { } bool Node::collectObjects(Kst::VectorMap&, Kst::ScalarMap&, Kst::StringMap&) { return true; } bool Node::takeVectors(const Kst::VectorMap&) { return true; } void Node::visit(NodeVisitor* v) { v->visitNode(this); } Kst::Object::UpdateType Node::update(Context *ctx) { Q_UNUSED(ctx) return Kst::Object::NoChange; } ///////////////////////////////////////////////////////////////// BinaryNode::BinaryNode(Node *left, Node *right) : Node(), _left(left), _right(right) { } BinaryNode::~BinaryNode() { delete _left; _left = 0L; delete _right; _right = 0L; } bool BinaryNode::collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t) { bool ok = true; ok = _left->collectObjects(v, s, t) ? ok : false; ok = _right->collectObjects(v, s, t) ? ok : false; return ok; } bool BinaryNode::takeVectors(const Kst::VectorMap& c) { bool rc = _left->takeVectors(c); rc = _right->takeVectors(c) && rc; return rc; } void BinaryNode::visit(NodeVisitor* v) { v->visitBinaryNode(this); } Node *& BinaryNode::left() { return _left; } Node *& BinaryNode::right() { return _right; } Kst::Object::UpdateType BinaryNode::update(Context *ctx) { Kst::Object::UpdateType l = _left->update(ctx); Kst::Object::UpdateType r = _right->update(ctx); return (l == Kst::Object::Updated || r == Kst::Object::Updated) ? Kst::Object::Updated : Kst::Object::NoChange; } ///////////////////////////////////////////////////////////////// Addition::Addition(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Addition: %p + %p\n", (void*)this, (void*)left, (void*)right); } Addition::~Addition() { } double Addition::value(Context *ctx) { return _left->value(ctx) + _right->value(ctx); } bool Addition::isConst() { return _left->isConst() && _right->isConst(); } QString Addition::text() const { if (_parentheses) { return QString('(') + _left->text() + '+' + _right->text() + ')'; } else { return _left->text() + '+' + _right->text(); } } ///////////////////////////////////////////////////////////////// Subtraction::Subtraction(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Subtraction: %p - %p\n", (void*)this, (void*)left, (void*)right); } Subtraction::~Subtraction() { } double Subtraction::value(Context *ctx) { return _left->value(ctx) - _right->value(ctx); } bool Subtraction::isConst() { return _left->isConst() && _right->isConst(); } QString Subtraction::text() const { if (_parentheses) { return QString('(') + _left->text() + '-' + _right->text() + ')'; } else { return _left->text() + '-' + _right->text(); } } ///////////////////////////////////////////////////////////////// Multiplication::Multiplication(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Multiplication: %p - %p\n", (void*)this, (void*)left, (void*)right); } Multiplication::~Multiplication() { } double Multiplication::value(Context *ctx) { return _left->value(ctx) * _right->value(ctx); } bool Multiplication::isConst() { return _left->isConst() && _right->isConst(); } QString Multiplication::text() const { if (_parentheses) { return QString('(') + _left->text() + '*' + _right->text() + ')'; } else { return _left->text() + '*' + _right->text(); } } ///////////////////////////////////////////////////////////////// Division::Division(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Division: %p - %p\n", (void*)this, (void*)left, (void*)right); } Division::~Division() { } double Division::value(Context *ctx) { return _left->value(ctx) / _right->value(ctx); } bool Division::isConst() { return _left->isConst() && _right->isConst(); } QString Division::text() const { if (_parentheses) { return QString('(') + _left->text() + '/' + _right->text() + ')'; } else { return _left->text() + '/' + _right->text(); } } ///////////////////////////////////////////////////////////////// Modulo::Modulo(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Modulo: %p - %p\n", (void*)this, (void*)left, (void*)right); } Modulo::~Modulo() { } double Modulo::value(Context *ctx) { return fmod(_left->value(ctx), _right->value(ctx)); } bool Modulo::isConst() { return _left->isConst() && _right->isConst(); } QString Modulo::text() const { if (_parentheses) { return QString('(') + _left->text() + '%' + _right->text() + ')'; } else { return _left->text() + '%' + _right->text(); } } ///////////////////////////////////////////////////////////////// Power::Power(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Power: %p - %p\n", (void*)this, (void*)left, (void*)right); } Power::~Power() { } double Power::value(Context *ctx) { return pow(_left->value(ctx), _right->value(ctx)); } bool Power::isConst() { return _left->isConst() && _right->isConst(); } QString Power::text() const { if (_parentheses) { return QString('(') + _left->text() + '^' + _right->text() + ')'; } else { return _left->text() + '^' + _right->text(); } } ///////////////////////////////////////////////////////////////// static double cot(double x) { return 1.0/tan(x); } static double csc(double x) { return 1.0/sin(x); } static double sec(double x) { return 1.0/cos(x); } static double acosd(double x) { return 180.0/M_PI*acos(x); } static double asind(double x) { return 180.0/M_PI*asin(x); } static double atand(double x) { return 180.0/M_PI*atan(x); } static double cosd(double x) { return cos(fmod(x, 360.0)*M_PI/180.0); } static double cotd(double x) { return cot(fmod(x, 360.0)*M_PI/180.0); } static double cscd(double x) { return csc(fmod(x, 360.0)*M_PI/180.0); } static double secd(double x) { return sec(fmod(x, 360.0)*M_PI/180.0); } static double sind(double x) { return sin(fmod(x, 360.0)*M_PI/180.0); } static double tand(double x) { return tan(fmod(x, 360.0)*M_PI/180.0); } static double atanx(double *x) { return atan2(x[0],x[1]); } static double step(double x) { if (x>0.0) { return 1.0; } else { return 0.0; } } static struct { const char *name; double (*func)(double); } FTable[] = { {"abs", &fabs}, {"acos", &acos}, {"acosd", &acosd}, {"asin", &asin}, {"asind", &asind}, {"atan", &atan}, {"atand", &atand}, #ifndef Q_OS_WIN32 {"cbrt", &cbrt}, #endif {"cos", &cos}, {"cosd", &cosd}, {"cosh", &cosh}, {"cot", &cot}, {"cotd", &cotd}, {"csc", &csc}, {"cscd", &cscd}, {"exp", &exp}, {"log", &log10}, {"ln", &log}, {"sec", &sec}, {"secd", &secd}, {"sin", &sin}, {"sind", &sind}, {"sinh", &sinh}, {"sqrt", &sqrt}, {"step", &step}, {"tan", &tan}, {"tand", &tand}, {"tanh", &tanh}, {0, 0} }; static struct { const char *name; double (*func)(double*); } F2Table[] = { {"atanx", &atanx}, //{"atan2d", &atand2d}, {0, 0} }; Function::Function(char *name, ArgumentList *args) : Node(), _name(name), _args(args), _f(0L) { _argCount = 1; // Presently no functions take != 1 argument _inPid = 0L; _inScalars = 0L; _inVectors = 0L; _outScalars = 0L; _outVectors = 0L; _inArrayLens = 0L; _outArrayLens = 0L; _outputIndex = -424242; _localData = 0L; _outputVectorCnt = 0; _inputVectorCnt = 0; //printf("%p: New Function: %s - %p\n", (void*)this, name, (void*)args); for (int i = 0; FTable[i].name; ++i) { if (strcasecmp(FTable[i].name, name) == 0) { _f = (void*)FTable[i].func; break; } } if (!_f) { for (int i = 0; F2Table[i].name; ++i) { if (strcasecmp(F2Table[i].name, name) == 0) { _f = (void*)F2Table[i].func; _argCount = 2; break; } } } } Function::~Function() { free(_name); _name = 0L; delete _args; _args = 0L; _f = 0L; delete[] _inScalars; delete[] _inVectors; delete[] _outScalars; for (int i = 0; i < _outputVectorCnt; ++i) { free(_outVectors[i]); } delete[] _outVectors; delete[] _inArrayLens; delete[] _outArrayLens; } Kst::Object::UpdateType Function::update(Context *ctx) { _args->update(ctx); return Kst::Object::NoChange; } double Function::value(Context *ctx) { if (!_f) { return ctx->noPoint; } if (_argCount == 1) { double x = _args->at(0, ctx); return ((double (*)(double))_f)(x); } else if (_argCount > 1) { double *x = new double[_argCount]; for (int i = 0; i < _argCount; ++i) { x[i] = _args->at(i, ctx); } double r = ((double (*)(double*))_f)(x); delete[] x; return r; } else { return ((double (*)())_f)(); } } bool Function::isConst() { return _args->isConst(); } bool Function::collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t) { return _args->collectObjects(v, s, t); } bool Function::takeVectors(const Kst::VectorMap& c) { return _args->takeVectors(c); } QString Function::text() const { return QString::fromLatin1(_name) + '(' + _args->text() + ')'; } ///////////////////////////////////////////////////////////////// ArgumentList::ArgumentList() : Node() { //printf("%p: New Argument List\n", (void*)this); } ArgumentList::~ArgumentList() { qDeleteAll(_args); } void ArgumentList::appendArgument(Node *arg) { _args.append(arg); } double ArgumentList::at(int arg, Context *ctx) { Node *n = _args.value(arg); // catches out-of-bounds if (n) { return n->value(ctx); } return ctx->noPoint; } bool ArgumentList::isConst() { foreach (Node *i, _args) { if (!i->isConst()) { return false; } } return true; } bool ArgumentList::collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t) { bool ok = true; foreach (Node *i, _args) { ok = i->collectObjects(v, s, t) ? ok : false; } return ok; } bool ArgumentList::takeVectors(const Kst::VectorMap& c) { bool rc = true; foreach (Node *i, _args) { rc = i->takeVectors(c) && rc; } return rc; } Node *ArgumentList::node(int idx) { return _args.at(idx); } Kst::Object::UpdateType ArgumentList::update(Context *ctx) { bool updated = false; foreach (Node *i, _args) { updated = updated || Kst::Object::Updated == i->update(ctx); } return updated ? Kst::Object::Updated : Kst::Object::NoChange; } QString ArgumentList::text() const { QString rc; bool first = true; QListIterator it(_args); while (it.hasNext()) { if (!first) { rc += ", "; } else { first = false; } rc += it.next()->text(); } return rc; } ///////////////////////////////////////////////////////////////// static struct { const char *name; double value; } ITable[] = { {"e", 2.7128182846}, {"pi", 3.1415926536}, {0, 0.0} }; Identifier::Identifier(char *name) : Node(), _name(name), _const(0L) { //printf("%p: New Identifier: %s\n", (void*)this, name); for (int i = 0; ITable[i].name; ++i) { if (strcasecmp(ITable[i].name, name) == 0) { _const = &ITable[i].value; break; } } } Identifier::~Identifier() { free(_name); _name = 0L; } const char *Identifier::name() const { return _name; } double Identifier::value(Context *ctx) { if (_const) { return *_const; } else if (_name[0] == 'x' && _name[1] == 0) { return ctx->x; } else { return ctx->noPoint; } } bool Identifier::isConst() { return _const != 0L || !(_name[0] == 'x' && _name[1] == 0); } QString Identifier::text() const { return _name; } ///////////////////////////////////////////////////////////////// DataNode::DataNode(ObjectStore *store, char *name) : Node(), _store(store), _isEquation(false), _equation(0L) { //printf("%p: New Data Object: [%s]\n", (void*)this, name); // ObjectStore *store = 0L; // FIXME: initialize this Q_ASSERT(store); if (name[0] == '=') { _tagName = QString(&name[1]).trimmed(); _isEquation = true; } else if (strchr(name, '[')) { _tagName = QString(name).trimmed(); QRegExp re("(.*)\\[(.*)\\]"); int hit = re.indexIn(_tagName); #ifdef QT5 if (hit > -1 && re.captureCount() == 2) { #else if (hit > -1 && re.numCaptures() == 2) { #endif _vector = kst_cast(store->retrieveObject(re.cap(1))); if (_vector) { _vectorIndex = re.cap(2); } } } else { _tagName = QString(name).trimmed(); ObjectPtr o = store->retrieveObject(_tagName); if (kst_cast(o)) { _vector = kst_cast(o); } else if (kst_cast(o)) { _scalar = kst_cast(o); } } free(name); name = 0L; } DataNode::~DataNode() { delete _equation; _equation = 0L; } double DataNode::value(Context *ctx) { if (_isEquation) { if (!_equation) { mutex().lock(); YY_BUFFER_STATE b = yy_scan_bytes(_tagName.toLatin1(), _tagName.length()); int rc = yyparse(_store); yy_delete_buffer(b); if (rc == 0 && ParsedEquation) { _equation = static_cast(ParsedEquation); ParsedEquation = 0L; mutex().unlock(); Equations::Context ctx; ctx.sampleCount = 2; ctx.noPoint = Kst::NOPOINT; ctx.x = 0.0; ctx.xVector = 0L; Equations::FoldVisitor vis(&ctx, &_equation); } else { ParsedEquation = 0L; mutex().unlock(); _isEquation = false; return ctx->noPoint; } } return _equation->value(ctx); } else if (_vector) { if (!_equation && !_vectorIndex.isEmpty()) { mutex().lock(); YY_BUFFER_STATE b = yy_scan_bytes(_vectorIndex.toLatin1(), _vectorIndex.length()); int rc = yyparse(_store); yy_delete_buffer(b); if (rc == 0 && ParsedEquation) { _equation = static_cast(ParsedEquation); ParsedEquation = 0L; mutex().unlock(); Equations::Context ctx; ctx.sampleCount = 2; ctx.noPoint = Kst::NOPOINT; ctx.x = 0.0; ctx.xVector = 0L; Equations::FoldVisitor vis(&ctx, &_equation); } else { ParsedEquation = 0L; mutex().unlock(); _vectorIndex.clear(); _vector = 0L; return ctx->noPoint; } } if (_equation) { // Note: should we use a fresh context here? return _vector->value(int(_equation->value(ctx))); } return _vector->interpolate(ctx->i, ctx->sampleCount); } else if (_scalar) { return _scalar->value(); } else { return ctx->noPoint; } } bool DataNode::isConst() { return (_isEquation && _equation) ? _equation->isConst() : false; } bool DataNode::collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t) { if (_isEquation) { if (_equation) { _equation->collectObjects(v, s, t); } } else if (_vector && !v.contains(_tagName)) { v.insert(_tagName, _vector); } else if (_scalar && !s.contains(_tagName)) { s.insert(_tagName, _scalar); } else if (!_scalar && !_vector) { Kst::Debug::self()->log(Kst::Debug::tr("Equation has unknown object [%1].").arg(_tagName), Kst::Debug::Error); return false; } return true; } bool DataNode::takeVectors(const Kst::VectorMap& c) { if (_isEquation) { if (_equation) { return _equation->takeVectors(c); } return false; } if (!_scalar) { if (c.contains(_tagName)) { _vector = c[_tagName]; } else { return false; } } return true; } Kst::Object::UpdateType DataNode::update(Context *ctx) { Q_UNUSED(ctx) if (_isEquation) { if (_equation) { //return _equation->update(ctx); } } else if (_vector) { KstWriteLocker l(_vector); //return _vector->update(); } else if (_scalar) { KstWriteLocker l(_scalar); //return _scalar->registerChange(); } //return Kst::Object::NoChange; return Kst::Object::Updated; } // Hack alert: [ and ] in names confuse the parser, so strip them out. QString DataNode::text() const { if (_isEquation) { return QString("[=") + _tagName + ']'; } else if (_vector) { QString Name = _vector->Name(); Name.remove("\\[").remove("\\]"); return QString('[') + Name.remove('[').remove(']') + QString(']'); } else if (_scalar) { QString Name = _scalar->Name(); Name.remove("\\[").remove("\\]"); return QString('[') + Name.remove('[').remove(']') + QString(']'); } else { return QString(); } } ///////////////////////////////////////////////////////////////// Number::Number(double n) : Node(), _n(n) { } Number::~Number() { } double Number::value(Context*) { return _n; } bool Number::isConst() { return true; } QString Number::text() const { if (_parentheses) { return QString('(') + QString::number(_n, 'g', 15) + ')'; } else { return QString::number(_n, 'g', 15); } } ///////////////////////////////////////////////////////////////// Negation::Negation(Node *node) : Node(), _n(node) { //printf("%p: New Negation: %p\n", (void*)this, (void*)n); } Negation::~Negation() { delete _n; _n = 0L; } double Negation::value(Context *ctx) { double v = _n->value(ctx); return (v == v) ? -v : v; } bool Negation::collectObjects(Kst::VectorMap& v, Kst::ScalarMap& s, Kst::StringMap& t) { bool ok = _n->collectObjects(v, s, t); return ok; } bool Negation::isConst() { return _n->isConst(); } QString Negation::text() const { if (_parentheses) { return QString("(-") + _n->text() + ')'; } else { return QString('-') + _n->text(); } } ///////////////////////////////////////////////////////////////// LogicalNot::LogicalNot(Node *node) : Node(), _n(node) { //printf("%p: New LogicalNot: %p\n", (void*)this, (void*)n); } LogicalNot::~LogicalNot() { delete _n; _n = 0L; } double LogicalNot::value(Context *ctx) { double v = _n->value(ctx); return (v == v) ? (v == 0.0) : 1.0; } bool LogicalNot::isConst() { return _n->isConst(); } QString LogicalNot::text() const { if (_parentheses) { return QString("(!") + _n->text() + ')'; } else { return QString('!') + _n->text(); } } ///////////////////////////////////////////////////////////////// BitwiseAnd::BitwiseAnd(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New And: %p & %p\n", (void*)this, (void*)left, (void*)right); } BitwiseAnd::~BitwiseAnd() { } double BitwiseAnd::value(Context *ctx) { return long(_left->value(ctx)) & long(_right->value(ctx)); } bool BitwiseAnd::isConst() { return _left->isConst() && _right->isConst(); } QString BitwiseAnd::text() const { if (_parentheses) { return QString('(') + _left->text() + QString('&') + _right->text() + ')'; } else { return _left->text() + QString('&') + _right->text(); } } ///////////////////////////////////////////////////////////////// BitwiseOr::BitwiseOr(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Or: %p | %p\n", (void*)this, (void*)left, (void*)right); } BitwiseOr::~BitwiseOr() { } double BitwiseOr::value(Context *ctx) { return long(_left->value(ctx)) | long(_right->value(ctx)); } bool BitwiseOr::isConst() { return _left->isConst() && _right->isConst(); } QString BitwiseOr::text() const { if (_parentheses) { return QString('(') + _left->text() + QString('|') + _right->text() + ')'; } else { return _left->text() + QString('|') + _right->text(); } } ///////////////////////////////////////////////////////////////// LogicalAnd::LogicalAnd(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New And: %p && %p\n", (void*)this, (void*)left, (void*)right); } LogicalAnd::~LogicalAnd() { } double LogicalAnd::value(Context *ctx) { return (_left->value(ctx) && _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool LogicalAnd::isConst() { return _left->isConst() && _right->isConst(); } QString LogicalAnd::text() const { if (_parentheses) { return QString('(') + _left->text() + QString("&&") + _right->text() + ')'; } else { return _left->text() + QString("&&") + _right->text(); } } ///////////////////////////////////////////////////////////////// LogicalOr::LogicalOr(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New Or: %p || %p\n", (void*)this, (void*)left, (void*)right); } LogicalOr::~LogicalOr() { } double LogicalOr::value(Context *ctx) { return (_left->value(ctx) || _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool LogicalOr::isConst() { return _left->isConst() && _right->isConst(); } QString LogicalOr::text() const { if (_parentheses) { return QString('(') + _left->text() + QString("||") + _right->text() + ')'; } else { return _left->text() + QString("||") + _right->text(); } } ///////////////////////////////////////////////////////////////// LessThan::LessThan(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New LessThan: %p < %p\n", (void*)this, (void*)left, (void*)right); } LessThan::~LessThan() { } double LessThan::value(Context *ctx) { return doubleLessThan(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool LessThan::isConst() { return _left->isConst() && _right->isConst(); } QString LessThan::text() const { if (_parentheses) { return QString('(') + _left->text() + QString('<') + _right->text() + ')'; } else { return _left->text() + QString('<') + _right->text(); } } ///////////////////////////////////////////////////////////////// LessThanEqual::LessThanEqual(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New LessThanEqual: %p <= %p\n", (void*)this, (void*)left, (void*)right); } LessThanEqual::~LessThanEqual() { } double LessThanEqual::value(Context *ctx) { return doubleLessThanEqual(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool LessThanEqual::isConst() { return _left->isConst() && _right->isConst(); } QString LessThanEqual::text() const { if (_parentheses) { return QString('(') + _left->text() + QString("<=") + _right->text() + ')'; } else { return _left->text() + QString("<=") + _right->text(); } } ///////////////////////////////////////////////////////////////// GreaterThan::GreaterThan(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New GreaterThan: %p > %p\n", (void*)this, (void*)left, (void*)right); } GreaterThan::~GreaterThan() { } double GreaterThan::value(Context *ctx) { return doubleGreaterThan(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool GreaterThan::isConst() { return _left->isConst() && _right->isConst(); } QString GreaterThan::text() const { if (_parentheses) { return QString('(') + _left->text() + QString('>') + _right->text() + ')'; } else { return _left->text() + QString('>') + _right->text(); } } ///////////////////////////////////////////////////////////////// GreaterThanEqual::GreaterThanEqual(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New GreaterThanEqual: %p >= %p\n", (void*)this, (void*)left, (void*)right); } GreaterThanEqual::~GreaterThanEqual() { } double GreaterThanEqual::value(Context *ctx) { return doubleGreaterThanEqual(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool GreaterThanEqual::isConst() { return _left->isConst() && _right->isConst(); } QString GreaterThanEqual::text() const { if (_parentheses) { return QString('(') + _left->text() + QString(">=") + _right->text() + ')'; } else { return _left->text() + QString(">=") + _right->text(); } } ///////////////////////////////////////////////////////////////// EqualTo::EqualTo(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New EqualTo: %p == %p\n", (void*)this, (void*)left, (void*)right); } EqualTo::~EqualTo() { } double EqualTo::value(Context *ctx) { return doubleEqual(_left->value(ctx), _right->value(ctx)) ? EQ_TRUE : EQ_FALSE; } bool EqualTo::isConst() { return _left->isConst() && _right->isConst(); } QString EqualTo::text() const { if (_parentheses) { return QString('(') + _left->text() + QString("==") + _right->text() + ')'; } else { return _left->text() + QString("==") + _right->text(); } } ///////////////////////////////////////////////////////////////// NotEqualTo::NotEqualTo(Node *left, Node *right) : BinaryNode(left, right) { //printf("%p: New NotEqualTo: %p != %p\n", (void*)this, (void*)left, (void*)right); } NotEqualTo::~NotEqualTo() { } double NotEqualTo::value(Context *ctx) { return (!doubleEqual(_left->value(ctx), _right->value(ctx))) ? EQ_TRUE : EQ_FALSE; } bool NotEqualTo::isConst() { return _left->isConst() && _right->isConst(); } QString NotEqualTo::text() const { if (_parentheses) { return QString('(') + _left->text() + QString("!=") + _right->text() + ')'; } else { return _left->text() + QString("!=") + _right->text(); } } ///////////////////////////////////////////////////////////////// NodeVisitor::NodeVisitor() { } NodeVisitor::~NodeVisitor() { } ///////////////////////////////////////////////////////////////// FoldVisitor::FoldVisitor(Context* ctxIn, Node** rootNode) : NodeVisitor(), _ctx(ctxIn) { if ((*rootNode)->isConst() && dynamic_cast(*rootNode) == 0L) { double v = (*rootNode)->value(ctxIn); delete *rootNode; *rootNode = new Number(v); } else { (*rootNode)->visit(this); } _ctx = 0L; // avoids context being marked as 'still reachable' } FoldVisitor::~FoldVisitor() { } void FoldVisitor::visitNode(Node*) { // useful? } void FoldVisitor::visitBinaryNode(BinaryNode *n) { if (n->left()->isConst() && dynamic_cast(n->left()) == 0L) { double v = n->left()->value(_ctx); delete n->left(); n->left() = new Number(v); } else { n->left()->visit(this); } if (n->right()->isConst() && dynamic_cast(n->right()) == 0L) { double v = n->right()->value(_ctx); delete n->right(); n->right() = new Number(v); } else { n->right()->visit(this); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/psd.h0000644000175000017500000001004212362701575015253 0ustar synthsynth/*************************************************************************** psd.h: Power Spectra for KST ------------------- begin : Fri Feb 10 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling power spectra for kst *@author C. Barth Netterfield */ #ifndef PSD_H #define PSD_H #include "dataobject.h" #include "psdcalculator.h" #include "kstmath_export.h" namespace Kst { class ObjectStore; class KSTMATH_EXPORT PSD : public DataObject { Q_OBJECT public: static const QString staticTypeString; static const QString staticTypeTag; const QString& typeString() const { return staticTypeString; } virtual void save(QXmlStreamWriter &s); virtual QString propertyString() const; bool apodize() const; void setApodize(bool in_apodize); ApodizeFunction apodizeFxn() const; void setApodizeFxn(ApodizeFunction in_apodizeFxn); double gaussianSigma() const; void setGaussianSigma(double in_gaussianSigma); bool removeMean() const; void setRemoveMean(bool in_removeMean); bool average() const; void setAverage(bool in_average); double frequency() const; void setFrequency(double in_frequency); int length() const; void setLength(int in_length); void setVector(VectorPtr); VectorPtr vector() const; const QString& vectorUnits() const; void setVectorUnits(const QString& units); const QString& rateUnits() const; void setRateUnits(const QString& units); PSDType output() const; void setOutput(PSDType in_output); bool interpolateHoles() const; void setInterpolateHoles(bool interpolate); virtual bool slaveVectorsUsed() const; virtual void showNewDialog(); virtual void showEditDialog(); VectorPtr vX() const { return _fVector; } VectorPtr vY() const { return _sVector; } const CurveHintList *curveHints() const; virtual DataObjectPtr makeDuplicate() const; virtual QString descriptionTip() const; void change(VectorPtr in_V, double freq, bool average, int average_len, bool apodize, bool removeMean, const QString& VUnits, const QString& RUnits, ApodizeFunction in_apodizeFxn = WindowOriginal, double in_gaussianSigma = 3.0, PSDType in_output = PSDAmplitudeSpectralDensity, bool interpolateHoles = false); virtual void internalUpdate(); void setChanged() { _changed=true;} virtual ScriptInterface* createScriptInterface(); protected: PSD(ObjectStore *store); virtual ~PSD(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); private: void updateVectorLabels(); void _adjustLengths(); ApodizeFunction _apodizeFxn; double _gaussianSigma; bool _Apodize; bool _RemoveMean; bool _Average; bool _interpolateHoles; PSDType _Output; PSDType _prevOutput; int _last_n_subsets; int _last_n_new; int _last_n; double _Frequency; int _PSDLength; int _averageLength; PSDCalculator _psdCalculator; QString _vectorUnits; QString _rateUnits; VectorPtr _sVector, _fVector; bool _changed; }; typedef SharedPtr PSDPtr; typedef ObjectList PSDList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/builtinrelations.h0000644000175000017500000000203112277111530020042 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUILTINRELATIONS_H #define BUILTINRELATIONS_H #include "kstmath_export.h" namespace Kst { namespace Builtins { KSTMATH_EXPORT void initRelations(); } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/kstmath_pch0000644000175000017500000000271012277111530016536 0ustar synthsynth #include "kstcore_pch.h" #ifdef KST_PCH_RECURSIVE // libkst headers #include "builtindatasources.h" #include "builtinprimitives.h" #include "coredocument.h" #include "datacollection.h" #include "datamatrix.h" #include "dataplugin.h" #include "dataprimitive.h" #include "datascalar.h" #include "datasource.h" #include "datasourcefactory.h" #include "datasourcepluginfactory.h" #include "datasourcepluginmanager.h" #include "datastring.h" #include "datavector.h" #include "dateparser.h" #include "debug.h" #include "editablematrix.h" #include "editablevector.h" #include "events.h" #include "extension.h" #include "generatedmatrix.h" #include "generatedvector.h" //#include "index_kst.h" #include "kst_export.h" #include "kst_i18n.h" #include "kst_inf.h" #include "ksttimers.h" #include "logevents.h" #include "math_kst.h" #include "matrix.h" #include "matrixfactory.h" #include "measuretime.h" #include "namedobject.h" #include "nextcolor.h" #include "object.h" #include "objectlist.h" #include "objectmap.h" #include "objectstore.h" #include "plotiteminterface.h" #include "primitive.h" #include "primitivefactory.h" #include "procps.h" #include "psversion.h" #include "rwlock.h" #include "scalar.h" #include "scalarfactory.h" #include "sharedptr.h" //#include "stdinsource.h" #include "string_kst.h" #include "stringfactory.h" #include "sysinfo.h" #include "timezones.h" #include "updatemanager.h" #include "vector.h" #include "vectorfactory.h" #include "vscalar.h" #endif Kst-2.0.8/src/libkstmath/builtinobjects.h0000644000175000017500000000202312277111530017474 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUILTINOBJECTS_H #define BUILTINOBJECTS_H #include "kstmath_export.h" namespace Kst { namespace Builtins { KSTMATH_EXPORT void initObjects(); } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/palette.cpp0000644000175000017500000000656212277111530016461 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // application specific includes #include "palette.h" #include #include #include #include "builtinpalettes.h" namespace Kst { QStringList Palette::getPaletteList() { QStringList paletteList; paletteList.append(KstGrayscaleName); paletteList.append(RedTempName); paletteList.append(SpectrumName); paletteList.append(EosAName); paletteList.append(EosBName); paletteList.append(KstColorsName); paletteList.append(CycleName); //TODO: support loading palettes from disk. return paletteList; } Palette::Palette(): _colors(0), _count(0) { changePaletteName(DefaultPalette); } Palette::Palette(const QString &paletteName): _colors(0), _count(0) { changePaletteName(paletteName); } Palette::~Palette() { delete[] _colors; delete[] _rgb; _colors = 0; _count = 0; } void Palette::changePaletteName(const QString &paletteName) { if (_count==0) { _colors = new QColor[2048]; _rgb = new QRgb[2048]; } if (paletteName.isEmpty()) { _paletteName = KstColorsName; } else { _paletteName = paletteName; } if (_paletteName == KstColorsName) { for (int i = 0; i < KstColorsCount; i++) { _colors[i] = QColor(KstColors[i]); _rgb[i] = _colors[i].rgb(); } _count = KstColorsCount; } else if (_paletteName == RedTempName) { for (int i = 0; i < RedTempCount; i++) { _colors[i] = QColor(RedTemp[i][0], RedTemp[i][1], RedTemp[i][2]); _rgb[i] = _colors[i].rgb(); } _count = RedTempCount; } else if (_paletteName == SpectrumName) { for (int i = 0; i < SpectrumCount; i++) { _colors[i] = QColor(Spectrum[i][0], Spectrum[i][1], Spectrum[i][2]); _rgb[i] = _colors[i].rgb(); } _count = SpectrumCount; } else if (_paletteName == EosAName) { for (int i = 0; i < EosACount; i++) { _colors[i] = QColor(EosA[i][0], EosA[i][1], EosA[i][2]); _rgb[i] = _colors[i].rgb(); } _count = EosACount; } else if (_paletteName == EosBName) { for (int i = 0; i < EosBCount; i++) { _colors[i] = QColor(EosB[i][0], EosB[i][1], EosB[i][2]); _rgb[i] = _colors[i].rgb(); } _count = EosBCount; } else if (_paletteName == CycleName) { for (int i = 0; i < CycleCount; i++) { _colors[i] = QColor(Cycle[i][0], Cycle[i][1], Cycle[i][2]); _rgb[i] = _colors[i].rgb(); } _count = CycleCount; } else { for (int i = 0; i < KstGrayscaleCount; i++) { _colors[i] = QColor(i, i, i); _rgb[i] = _colors[i].rgb(); } _count = KstGrayscaleCount; } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curvepointsymbol.cpp0000644000175000017500000001210412277111530020434 0ustar synthsynth/*************************************************************************** curvepointsymbol.cpp ------------------- begin : Sunday June 17, 2001 copyright : (C) 2001 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * Permission is granted to link with any opensource library * * * ***************************************************************************/ #include "curvepointsymbol.h" #include #include namespace Kst { namespace CurvePointSymbol { void draw(int Type, QPainter *p, double x, double y, double pointSize) { double s = pointSize; double lw; bool int_draw = !(p->testRenderHint(QPainter::Antialiasing)); p->save(); QPen pen = p->pen(); lw = p->pen().widthF(); if (lw<=1.0) lw = 1.01; // QT4 line drawing is buggy for width < 1.0 pen.setWidthF(lw); p->setPen(pen); if (Type < 0 || Type > KSTPOINT_MAXTYPE) { Type = 0; } if (int_draw) { x = floor(x+0.5); y = floor(y+0.5); s = floor(s+0.5); if (p->transform().isTranslating()) { // translate to nearest pixel qreal dx = p->transform().dx(); qreal dy = p->transform().dy(); QTransform T; T.translate(floor(dx+0.5), floor(dy+0.5)); p->setTransform(T); } } switch (Type) { case 0: // X p->drawLine(QPointF(x-s, y-s), QPointF(x+s, y+s)); p->drawLine(QPointF(x-s, y+s), QPointF(x+s, y-s)); break; case 1: // unfilled square p->setBrush(Qt::NoBrush); p->drawRect(QRectF(x-s, y-s, 2.0*s, 2.0*s)); break; case 2: // unfilled circle p->setBrush(Qt::NoBrush); p->drawEllipse(QPointF(x,y), s, s); break; case 3: // filled circle p->setBrush(Qt::SolidPattern); p->setBrush(p->pen().color()); p->drawEllipse(QPointF(x,y), s, s); break; case 4: // unfilled down triangle { QPolygonF pts; pts << QPointF(x-s, y-s) << QPointF(x, y+s) << QPointF(x+s, y-s); p->setBrush(Qt::NoBrush); p->drawPolygon(pts); } break; case 5: // unfilled up triangle { QPolygonF pts; pts << QPointF(x-s, y+s) << QPointF(x,y-s) << QPointF(x+s,y+s); p->setBrush(Qt::NoBrush); p->drawPolygon(pts); } break; case 6: // filled square p->setBrush(Qt::SolidPattern); p->setBrush(p->pen().color()); p->drawRect(QRectF(x-s, y-s, 2.0*s+1.0, 2.0*s+1.0)); break; case 7: // + p->drawLine(QPointF(x-s, y), QPointF(x+s, y)); p->drawLine(QPointF(x, y-s), QPointF(x, y+s)); break; case 8: // * if (int_draw) { // diagonal lines need to be even num pix wide w/out antialiasing lw = floor(lw*0.5) * 2.0; } pen = p->pen(); pen.setWidthF(lw); p->setPen(pen); p->drawLine(QPointF(x-s, y-s), QPointF(x+s, y+s)); p->drawLine(QPointF(x-s, y+s), QPointF(x+s, y-s)); if (int_draw) { // vertical lines need to be odd num pix wide w/out antialiasing lw-=1; if (lw<0) lw = 0; pen = p->pen(); pen.setWidthF(lw); p->setPen(pen); } s*=1.4; p->drawLine(QPointF(x-s, y), QPointF(x+s, y)); p->drawLine(QPointF(x, y-s), QPointF(x, y+s)); break; case 9: // filled down triangle { QPolygonF pts; pts << QPointF(x-s, y-s) << QPointF(x, y+s) << QPointF(x+s, y-s); p->setBrush(Qt::SolidPattern); p->setBrush(p->pen().color()); p->drawPolygon(pts); } break; case 10: // filled up triangle { QPolygonF pts; pts << QPointF(x-s, y+s) << QPointF(x, y-s) << QPointF(x+s,y+s); p->setBrush(Qt::SolidPattern); p->setBrush(p->pen().color()); p->drawPolygon(pts); } break; case 11: // unfilled diamond { QPolygonF pts; pts << QPointF(x+s, y) << QPointF(x, y+s) << QPointF(x-s, y) << QPointF(x, y-s); p->setBrush(Qt::NoBrush); p->drawPolygon(pts); } break; case 12: // filled diamond { QPolygonF pts; pts << QPointF(x+s, y) << QPointF(x, y+s) << QPointF(x-s, y) << QPointF(x, y-s); p->setBrush(Qt::SolidPattern); p->setBrush(p->pen().color()); p->drawPolygon(pts); } break; } p->setBrush(Qt::NoBrush); p->restore(); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/painter.cpp0000644000175000017500000000436612277111530016465 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "painter.h" namespace Kst { Painter::Painter(PaintType t) : QPainter(), _type(t), _drawInlineUI(false), _makingMask(false) { } Painter::~Painter() { } void Painter::setType(PaintType t) { _type = t; } Painter::PaintType Painter::type() const { return _type; } bool Painter::drawInlineUI() const { return _drawInlineUI; } void Painter::setDrawInlineUI(bool draw) { _drawInlineUI = draw; } bool Painter::makingMask() const { return _makingMask; } void Painter::setMakingMask(bool making) { _makingMask = making; } int Painter::lineWidthAdjustmentFactor() const { int factor = 1; if (type() == P_PRINT || type() == P_EXPORT) { const QRect& w(window()); // // we want a line width of 1 to give a width of approximately 1 pt (where 1 pt = 1/72 // inch) when printing on letter sized paper. Assuming a margin of 0.25 inch in one // direction (on both sides) and 0.5 inch in the other direction (again on both sides) // and a printer resolution of 600 dpi: // // w.width() + w.height() = ( 8 + 11 - ( 2 * 0.5 ) - ( 2 * 0.25 ) ) * 600 = 10500 // // we want a scale factor of 600/72 = 8.333 in the line width, so our magic number simply // becomes: // // w.width() + w.height() / scale factor = 10200 / 8.333 ~ 1300 // factor = (w.width() + w.height()) / 1300; } return factor > 0 ? factor : 1; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/relation.h0000644000175000017500000001641612277111530016304 0ustar synthsynth/*************************************************************************** relation.h: base curve type for kst ------------------- begin : Fri Oct 22 2000 copyright : (C) 2000 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef RELATION_H #define RELATION_H #include #include "dataobject.h" #include "painter.h" #include "kstmath_export.h" #include "labelparser.h" #include "labelinfo.h" /**A class for handling curves for kst *@author C. Barth Netterfield */ class QXmlStreamWriter; namespace Kst { // context for rendering a curve in a plot class CurveRenderContext { public: // FIXME: use reasonable defaults CurveRenderContext() : painter(0L), Lx(0.0), Hx(0.0), Ly(0.0), Hy(0.0), m_X(0.0), m_Y(0.0), b_X(0.0), b_Y(0.0), x_max(0.0), y_max(0.0), x_min(0.0), y_min(0.0), XMin(0.0), YMin(0.0), XMax(0.0), YMax(0.0), xLog(false), yLog(false), xLogBase(0.0), yLogBase(0.0), penWidth(0), antialias(false) {} QPainter* painter; QRect window; double Lx, Hx, Ly, Hy; double m_X, m_Y, b_X, b_Y; double x_max, y_max, x_min, y_min; double XMin, YMin, XMax, YMax; // range and domain of plot bool xLog, yLog; double xLogBase, yLogBase; QColor foregroundColor; // plot foreground color QColor backgroundColor; // plot background color int penWidth; bool antialias; }; struct CurveContextDetails { double Lx, Hx, Ly, Hy; double m_X, m_Y; double b_X, b_Y; double XMin, XMax; bool xLog, yLog; double xLogBase, yLogBase; int penWidth; }; class ObjectStore; class Relation; class KSTMATH_EXPORT Relation : public Object { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } explicit Relation(ObjectStore *store); virtual ~Relation(); virtual void showNewDialog() { } virtual void showEditDialog() { } virtual void save(QXmlStreamWriter &s); virtual QString propertyString() const = 0; virtual int sampleCount() const { return NS; } virtual void setIgnoreAutoScale(bool ignoreAutoScale); virtual bool ignoreAutoScale() const { return _ignoreAutoScale; } virtual int samplesPerFrame() const { return 1; } virtual void deleteDependents(); virtual double maxX() const { return MaxX; } virtual double minX() const { return MinX; } virtual double maxY() const { return MaxY; } virtual double minY() const { return MinY; } virtual double minPosY() const { return MinPosY; } virtual double ns_maxX() const { return _ns_maxx; } virtual double ns_minX() const { return _ns_minx; } virtual double ns_maxY() const { return _ns_maxy; } virtual double ns_minY() const { return _ns_miny; } virtual double minPosX() const { return MinPosX; } virtual double midX() const { return (MaxX+MinX)*0.5; } virtual double midY() const { return (MaxY+MinY)*0.5; } virtual void yRange(double xFrom, double xTo, double* yMin, double* yMax) = 0; virtual bool uses(ObjectPtr p) const; // return closest distance to the given point // images always return a rating >= 5 virtual double distanceToPoint(double xpos, double dx, double ypos) const = 0; // render this curve void paint(const CurveRenderContext& context); virtual void paintObjects(const CurveRenderContext& context) = 0; virtual void updatePaintObjects(const CurveRenderContext& context) = 0; // render the legend symbol for this curve virtual QSize legendSymbolSize(QPainter *p) = 0; virtual void paintLegendSymbol(QPainter *p, const QSize &size) = 0; virtual bool symbolLabelOnTop() = 0; //virtual SharedPtr makeDuplicate(QMap< SharedPtr, SharedPtr > &duplicatedRelations) = 0; virtual SharedPtr makeDuplicate() const = 0; virtual void replaceInput(PrimitivePtr p, PrimitivePtr new_p); // Compare the cached the context to the provided one. bool redrawRequired(const CurveRenderContext& context); // If you use these, you must lock() and unlock() the object as long as you // hold the reference const VectorMap& inputVectors() const { return _inputVectors; } const VectorMap& outputVectors() const { return _outputVectors; } VectorMap& inputVectors() { return _inputVectors; } VectorMap& outputVectors() { return _outputVectors; } const ScalarMap& inputScalars() const { return _inputScalars; } const ScalarMap& outputScalars() const { return _outputScalars; } ScalarMap& inputScalars() { return _inputScalars; } ScalarMap& outputScalars() { return _outputScalars; } const StringMap& inputStrings() const { return _inputStrings; } const StringMap& outputStrings() const { return _outputStrings; } StringMap& inputStrings() { return _inputStrings; } StringMap& outputStrings() { return _outputStrings; } const MatrixMap& inputMatrices() const { return _inputMatrices; } const MatrixMap& outputMatrices() const { return _outputMatrices; } MatrixMap& inputMatrices() { return _inputMatrices; } MatrixMap& outputMatrices() { return _outputMatrices; } PrimitiveList inputPrimitives() const; virtual bool invertXHint() const {return false;} virtual bool invertYHint() const {return false;} virtual LabelInfo xLabelInfo() const = 0; virtual LabelInfo yLabelInfo() const = 0; virtual LabelInfo titleInfo() const = 0; protected: virtual void writeLockInputsAndOutputs() const; virtual void unlockInputsAndOutputs() const; virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; CurveHintList *_curveHints; QString _typeString, _type; VectorMap _inputVectors; VectorMap _outputVectors; ScalarMap _inputScalars; ScalarMap _outputScalars; StringMap _inputStrings; StringMap _outputStrings; MatrixMap _inputMatrices; MatrixMap _outputMatrices; double _ns_maxx; double _ns_minx; double _ns_maxy; double _ns_miny; double MaxX; double MinX; double MinPosX; double MeanX; double MaxY; double MinY; double MinPosY; int NS; bool _ignoreAutoScale; CurveContextDetails _contextDetails; bool _redrawRequired; private: void commonConstructor(); }; typedef SharedPtr RelationPtr; typedef ObjectList RelationList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/basicpluginfactory.h0000644000175000017500000000223612277111530020352 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BASICPLUGINFACTORY_H #define BASICPLUGINFACTORY_H #include "objectfactory.h" namespace Kst { class BasicPluginFactory : public ObjectFactory { public: BasicPluginFactory(); ~BasicPluginFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curvepointsymbol.h0000644000175000017500000000260512277111530020106 0ustar synthsynth/*************************************************************************** curvepointsymbol.h ------------------- begin : June 3 2001 copyright : (C) 2001 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVEPOINTSYMBOL_H #define CURVEPOINTSYMBOL_H #include "kstmath_export.h" #include #define KSTPOINT_MAXTYPE 13 namespace Kst { namespace CurvePointSymbol { /** draw the point on a painter the scale of the point is based on size */ KSTMATH_EXPORT void draw(int type, QPainter *p, double x, double y, double pointSize=4); } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/psdcalculator.h0000644000175000017500000000477112277111530017330 0ustar synthsynth/*************************************************************************** psdcalculator.cpp: Power Spectra Calculator for KST ------------------- begin : 2006 copyright : (C) 2006 by Kst email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A utility class for calculating power spectra */ #ifndef PSDCALCULATOR_H #define PSDCALCULATOR_H // the following should reflect the PSD type order in fftoptionswidget.ui enum PSDType { PSDUndefined = -1, PSDAmplitudeSpectralDensity = 0, PSDPowerSpectralDensity = 1, PSDAmplitudeSpectrum = 2, PSDPowerSpectrum = 3 }; // the following should reflect the window type order in fftoptionswidget.ui enum ApodizeFunction { WindowUndefined = -1, WindowOriginal = 0, WindowBartlett = 1, WindowBlackman = 2, WindowConnes = 3, WindowCosine = 4, WindowGaussian = 5, WindowHamming = 6, WindowHann = 7, WindowWelch = 8, WindowUniform = 9 }; class PSDCalculator { public: PSDCalculator(); ~PSDCalculator(); int calculatePowerSpectrum(double *input, int inputLen, double *output, int outputLen, bool removeMean, bool interpolateHoles, bool average, int averageLen, bool apodize, ApodizeFunction apodizeFxn, double gaussianSigma, PSDType outputType, double inputSamplingFreq); static int calculateOutputVectorLength(int inputLen, bool average, int averageLen); private: void updateWindowFxn(ApodizeFunction apodizeFxn, double gaussianSigma); void adjustInternalLengths(); double cabs2(double r, double i); double *_a; double *_w; int _awLen; //length of a and w. // keep track of prevs to avoid redundant regenerations ApodizeFunction _prevApodizeFxn; double _prevGaussianSigma; int _prevOutputLen; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/relationfactory.h0000644000175000017500000000301012277111530017656 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef RELATIONFACTORY_H #define RELATIONFACTORY_H #include #include #include "relation.h" #include "kstmath_export.h" namespace Kst { class ObjectStore; class RelationFactory { public: RelationFactory(); virtual ~RelationFactory(); // This takes ownership static void registerFactory(const QString& node, RelationFactory *factory); static void registerFactory(const QStringList& nodes, RelationFactory *factory); KSTMATH_EXPORT static RelationPtr parse(ObjectStore *store, QXmlStreamReader& stream); virtual RelationPtr generateRelation(ObjectStore *store, QXmlStreamReader& stream) = 0; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/imagefactory.cpp0000644000175000017500000000776212277111530017500 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "imagefactory.h" #include "debug.h" #include "image.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { ImageFactory::ImageFactory() : RelationFactory() { registerFactory(Image::staticTypeTag, this); } ImageFactory::~ImageFactory() { } RelationPtr ImageFactory::generateRelation(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); double lowerThreshold=0, upperThreshold=1; int numberOfContourLines=4, contourWeight=0; QString matrixName, paletteName, legend, contourColor, descriptiveName; bool hasColorMap=true, hasContourMap=false, autoThreshold=true; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == Image::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); matrixName = attrs.value("matrix").toString(); legend = attrs.value("legend").toString(); paletteName = attrs.value("palettename").toString(); hasColorMap = attrs.value("hascolormap").toString() == "true" ? true : false; lowerThreshold = attrs.value("lowerthreshold").toString().toDouble(); upperThreshold = attrs.value("upperthreshold").toString().toDouble(); hasContourMap = attrs.value("hascontourmap").toString() == "true" ? true : false; numberOfContourLines = attrs.value("numcontourlines").toString().toInt(); contourWeight = attrs.value("contourweight").toString().toInt(); contourColor = attrs.value("contourcolor").toString(); autoThreshold = attrs.value("autothreshold").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == Image::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Image from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } MatrixPtr matrix = 0; if (store && !matrixName.isEmpty()) { matrix = kst_cast(store->retrieveObject(matrixName)); } if (!matrix) { Debug::self()->log(QObject::tr("Error creating Image from Kst file. Could not find matrix."), Debug::Warning); return 0; } ImagePtr image = store->createObject(); if (hasColorMap && hasContourMap) { image->changeToColorAndContour(matrix, lowerThreshold, upperThreshold, autoThreshold, paletteName, numberOfContourLines, QColor(contourColor), contourWeight); } else if (hasContourMap) { image->changeToContourOnly(matrix, numberOfContourLines, QColor(contourColor), contourWeight); } else { image->changeToColorOnly(matrix, lowerThreshold, upperThreshold, autoThreshold, paletteName); } image->setDescriptiveName(descriptiveName); image->writeLock(); image->registerChange(); image->unlock(); return image; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/equation.cpp0000644000175000017500000003675012362701575016663 0ustar synthsynth/*************************************************************************** equation.cpp: Equations for KST ------------------- begin : Fri Feb 10 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling equations for kst *@author C. Barth Netterfield */ #include "equation.h" #include #include #include #include #include #include "dialoglauncher.h" #include "enodes.h" #include "eparse-eh.h" #include "datacollection.h" #include "debug.h" #include "generatedvector.h" #include "objectstore.h" #include "dataobjectscriptinterface.h" /*extern "C"*/ int yyparse(Kst::ObjectStore *store); extern void *ParsedEquation; /*extern "C"*/ struct yy_buffer_state *yy_scan_string(const char*); int yylex_destroy (void ); namespace Kst { const QString Equation::staticTypeString = "Equation"; const QString Equation::staticTypeTag = "equation"; static const QLatin1String& XINVECTOR = QLatin1String("X"); static const QLatin1String& XOUTVECTOR = QLatin1String("XO"); // Output (slave) vector static const QLatin1String& YOUTVECTOR = QLatin1String("O"); // Output (slave) vector Equation::Equation(ObjectStore *store) : DataObject(store), _doInterp(false), _xInVector(0) { _ns = 2; _pe = 0L; _typeString = "Equation"; _type = "Equation"; _initializeShortName(); Q_ASSERT(store); _xOutVector = store->createObject(); Q_ASSERT(_xOutVector); _xOutVector->setProvider(this); _xOutVector->setSlaveName("x"); _xOutVector->resize(2); _outputVectors.insert(XOUTVECTOR, _xOutVector); _yOutVector = store->createObject(); Q_ASSERT(_yOutVector); _yOutVector->setProvider(this); _yOutVector->setSlaveName("y"); _yOutVector->resize(2); _outputVectors.insert(YOUTVECTOR, _yOutVector); _isValid = false; _numNew = _numShifted = 0; } Equation::~Equation() { delete _pe; _pe = 0L; } void Equation::_initializeShortName() { _shortName = 'E'+QString::number(_enum); if (_enum>max_enum) max_enum = _enum; _enum++; } ScriptInterface* Equation::createScriptInterface() { return new EquationSI(this); } void Equation::attach() { } const CurveHintList *Equation::curveHints() const { _curveHints->clear(); _curveHints->append(new CurveHint(tr("Equation Curve"), _xOutVector->shortName(), _yOutVector->shortName())); return _curveHints; } bool Equation::isValid() { return _isValid; } void Equation::internalUpdate() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!_pe) { return; } writeLockInputsAndOutputs(); _xInVector = _inputVectors[XINVECTOR]; Equations::Context ctx; ctx.sampleCount = _ns; ctx.xVector = _xInVector; _pe->update(&ctx); _isValid = FillY(true); unlockInputsAndOutputs(); updateVectorLabels(); return; } const QString Equation::reparsedEquation() const { QString etext; if (!_equation.isEmpty()) { if (!Equations::mutex().tryLock()) { qDebug() << "Don't reparse equation while it is being reparsed..."; return (_equation); } yylex_destroy(); yy_scan_string(parseableEquation()); ParsedEquation = 0L; int rc = yyparse(store()); Equations::Node *en = static_cast(ParsedEquation); if (rc == 0 && en) { if (!en->takeVectors(VectorsUsed)) { Debug::self()->log(tr("Equation [%1] failed to find its vectors when reparsing.").arg(_equation), Debug::Warning); } etext = en->text(); } delete en; ParsedEquation = 0L; Equations::mutex().unlock(); //etext.replace("atanx(", "atan2("); //etext.replace("atanxd(", "atan2d("); } return (readableEquation(etext)); } /** function names can't have numerals in them, but * the best name for atan2 is ... atan2. So... * special case it is :-( */ QByteArray Equation::parseableEquation() const { QString eq = _equation; eq.replace("atan2(", "atanx(", Qt::CaseInsensitive); eq.replace("atan2d(", "atanxd(", Qt::CaseInsensitive); return eq.toAscii(); } QString Equation::readableEquation(const QString &equation) const { QString eq = equation; eq.replace("atanx(", "atan2(", Qt::CaseInsensitive); eq.replace("atanxd(", "atan2d(", Qt::CaseInsensitive); return eq; } void Equation::save(QXmlStreamWriter &s) { s.writeStartElement(staticTypeTag); // Reparse the equation, then write it back out in text so that we can update // any vectors or scalars that had name changes, but we don't get affected by // the optimizer if (!_equation.isEmpty()) { QMutexLocker ml(&Equations::mutex()); yylex_destroy(); yy_scan_string(parseableEquation()); ParsedEquation = 0L; int rc = yyparse(store()); Equations::Node *en = static_cast(ParsedEquation); if (rc == 0 && en) { if (!en->takeVectors(VectorsUsed)) { Debug::self()->log(tr("Equation [%1] failed to find its vectors when saving. Resulting Kst file may have issues.").arg(_equation), Debug::Warning); } QString etext = en->text(); s.writeAttribute("expression", etext); } delete en; ParsedEquation = 0L; } if (_xInVector) { s.writeAttribute("xvector", _xInVector->Name()); } if (_doInterp) { s.writeAttribute("interpolate", "true"); } saveNameInfo(s, VNUM|ENUM|XNUM); s.writeEndElement(); } void Equation::setEquation(const QString& in_fn) { // assert(*_xVector); - ugly, we have to allow this here due to // document loading with vector lazy-loading _equation = in_fn; VectorsUsed.clear(); ScalarsUsed.clear(); _ns = 2; // reset the updating delete _pe; _pe = 0L; if (!_equation.isEmpty()) { Equations::mutex().lock(); yylex_destroy(); yy_scan_string(parseableEquation()); int rc = yyparse(store()); _pe = static_cast(ParsedEquation); if (rc == 0 && _pe) { ParsedEquation = 0L; Equations::mutex().unlock(); Equations::Context ctx; ctx.sampleCount = _ns; ctx.xVector = _xInVector; Equations::FoldVisitor vis(&ctx, &_pe); StringMap sm; if (_pe->collectObjects(VectorsUsed, ScalarsUsed, sm)) { _pe->update(&ctx); } else { //we have bad objects... Debug::self()->log(tr("Equation [%1] references non-existent objects.").arg(_equation), Debug::Error); delete (Equations::Node*)ParsedEquation; ParsedEquation = 0L; //Equations::mutex().unlock(); } } else { // Parse error Debug::self()->log(tr("Equation [%1] failed to parse. Errors follow.").arg(_equation), Debug::Warning); for (QStringList::ConstIterator i = Equations::errorStack.constBegin(); i != Equations::errorStack.constEnd(); ++i) { Debug::self()->log(tr("Parse Error: %1").arg(*i), Debug::Warning); } delete (Equations::Node*)ParsedEquation; ParsedEquation = 0L; _pe = 0L; Equations::mutex().unlock(); } } _isValid = _pe != 0L; if (_isValid) { _equation = reparsedEquation(); // update the string } } void Equation::updateVectorLabels() { if (!_xInVector) { return; } _xOutVector->setLabelInfo(_xInVector->labelInfo()); QString yl; QString xl; QRegExp sn("(\\(V(\\d{1,2})\\))|\\[|\\]"); // short name yl = reparsedEquation(); yl.remove(sn); LabelInfo label_info; label_info.units.clear(); label_info.quantity.clear(); if (descriptiveNameIsManual()) { label_info.name = descriptiveName(); } else { label_info.name = yl; } _yOutVector->setTitleInfo(label_info); } void Equation::setExistingXVector(VectorPtr in_xv, bool do_interp) { if (!in_xv) { return; } VectorPtr v = _inputVectors[XINVECTOR]; if (v == in_xv) { return; } _inputVectors.remove(XINVECTOR); _xInVector = in_xv; _inputVectors.insert(XINVECTOR, in_xv); _ns = 2; // reset the updating _doInterp = do_interp; } //FIXME: equations should not use ScalarsUsed and VectorsUsed: //instead, they should use _inputScalars and _inputVectors only. //This code, and used() is only here because they don't. qint64 Equation::minInputSerial() const { qint64 minSerial = DataObject::minInputSerial(); foreach (const VectorPtr &P, VectorsUsed) { minSerial = qMin(minSerial, P->serial()); } foreach (const ScalarPtr &P, ScalarsUsed) { minSerial = qMin(minSerial, P->serial()); } return minSerial; } qint64 Equation::maxInputSerialOfLastChange() const { qint64 maxSerial = DataObject::maxInputSerialOfLastChange(); foreach (VectorPtr P, VectorsUsed) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (ScalarPtr P, ScalarsUsed) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } return maxSerial; } PrimitiveList Equation::inputPrimitives() const { PrimitiveList primitive_list = DataObject::inputPrimitives(); int n = VectorsUsed.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(VectorsUsed.values().at(i))); } n = ScalarsUsed.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(ScalarsUsed.values().at(i))); } return primitive_list; } void Equation::replaceInput(PrimitivePtr p, PrimitivePtr new_p) { DataObject::replaceInput(p, new_p); QString newExp = _equation; QString oldName = p->Name(); QString newName = new_p->Name(); newExp = newExp.replace('[' + oldName + ']', '[' + newName + ']'); setEquation(newExp); } /************************************************************************/ /* */ /* Fill Y: Evaluates the equation */ /* */ /************************************************************************/ bool Equation::FillY(bool force) { if (!_xInVector) { return false; } int v_shift=0, v_new; int i0=0; int ns; writeLockInputsAndOutputs(); // determine value of Interp if (_doInterp) { ns = _xInVector->length(); for (VectorMap::ConstIterator i = VectorsUsed.constBegin(); i != VectorsUsed.constEnd(); ++i) { if (i.value()->length() > ns) { ns = i.value()->length(); } } } else { ns = _xInVector->length(); } if (_ns != _xInVector->length() || ns != _xInVector->length() || _xInVector->numShift() != _xInVector->numNew()) { _ns = ns; VectorPtr xv = _xOutVector; VectorPtr yv = _yOutVector; if (!xv->resize(_ns)) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } if (!yv->resize(_ns)) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } yv->zero(); i0 = 0; // other vectors may have diffent lengths, so start over v_shift = _ns; } else { // calculate shift and new samples // only do shift optimization if all used vectors are same size and shift v_shift = _xInVector->numShift(); v_new = _xInVector->numNew(); for (VectorMap::ConstIterator i = VectorsUsed.constBegin(); i != VectorsUsed.constEnd(); ++i) { if (v_shift != i.value()->numShift()) { v_shift = _ns; } if (v_new != i.value()->numNew()) { v_shift = _ns; } if (_ns != i.value()->length()) { v_shift = _ns; } } if (v_shift > _ns/2 || force) { i0 = 0; v_shift = _ns; } else { VectorPtr xv = _xOutVector; VectorPtr yv = _yOutVector; for (int i = v_shift; i < _ns; i++) { yv->value()[i - v_shift] = yv->value()[i]; xv->value()[i - v_shift] = xv->value()[i]; } i0 = _ns - v_shift; } } _numShifted = _yOutVector->numShift() + v_shift; if (_numShifted > _ns) { _numShifted = _ns; } _numNew = _ns - i0 + _yOutVector->numNew(); if (_numNew > _ns) { _numNew = _ns; } _xOutVector->setNewAndShift(_numNew, _numShifted); _yOutVector->setNewAndShift(_numNew, _numShifted); double *rawxv = _xOutVector->value(); double *rawyv = _yOutVector->value(); VectorPtr iv = _xInVector; Equations::Context ctx; ctx.sampleCount = _ns; ctx.xVector = iv; if (!_pe) { if (_equation.isEmpty()) { unlockInputsAndOutputs(); return true; } QMutexLocker ml(&Equations::mutex()); yylex_destroy(); QString eq = _equation; yy_scan_string(parseableEquation()); int rc = yyparse(store()); _pe = static_cast(ParsedEquation); if (_pe && rc == 0) { Equations::FoldVisitor vis(&ctx, &_pe); StringMap sm; _pe->collectObjects(VectorsUsed, ScalarsUsed, sm); ParsedEquation = 0L; } else { delete (Equations::Node*)ParsedEquation; ParsedEquation = 0L; _pe = 0L; unlockInputsAndOutputs(); return false; } } for (ctx.i = i0; ctx.i < _ns; ++ctx.i) { rawxv[ctx.i] = iv->value(ctx.i); ctx.x = iv->interpolate(ctx.i, _ns); rawyv[ctx.i] = _pe->value(&ctx); } if (!_xOutVector->resize(iv->length())) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } unlockInputsAndOutputs(); return true; } QString Equation::propertyString() const { return equation(); } void Equation::showNewDialog() { DialogLauncher::self()->showEquationDialog(); } void Equation::showEditDialog() { DialogLauncher::self()->showEquationDialog(this); } DataObjectPtr Equation::makeDuplicate() const { EquationPtr equation = store()->createObject(); Q_ASSERT(equation); equation->setEquation(_equation); equation->setExistingXVector(_inputVectors[XINVECTOR], _doInterp); if (descriptiveNameIsManual()) { equation->setDescriptiveName(descriptiveName()); } equation->writeLock(); equation->registerChange(); equation->unlock(); return DataObjectPtr(equation); } bool Equation::uses(ObjectPtr p) const { // check VectorsUsed in addition to _input*'s if (VectorPtr vect = kst_cast(p)) { for (VectorMap::ConstIterator j = VectorsUsed.constBegin(); j != VectorsUsed.constEnd(); ++j) { if (j.value() == vect) { return true; } } } else if (DataObjectPtr obj = kst_cast(p) ) { // check all connections from this expression to p for (VectorMap::Iterator j = obj->outputVectors().begin(); j != obj->outputVectors().end(); ++j) { for (VectorMap::ConstIterator k = VectorsUsed.constBegin(); k != VectorsUsed.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } } } return DataObject::uses(p); } QString Equation::_automaticDescriptiveName() const { return _yOutVector->titleInfo().name; } QString Equation::descriptionTip() const { if(!_xInVector) { return QString(); } return tr("Equation: %1\n %2\nX: %3").arg(Name()).arg(equation()).arg(_xInVector->descriptionTip()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/enodefactory.h0000644000175000017500000000433412277111530017145 0ustar synthsynth/*************************************************************************** enodefactory.h ---------- begin : Feb 12 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ENODEFACTORY_H #define ENODEFACTORY_H #define CreateNodeBinary(x) void *New##x(void *left, void *right); #ifdef __cplusplus namespace Kst { class ObjectStore; } //extern "C" { #endif CreateNodeBinary(Addition) CreateNodeBinary(Subtraction) CreateNodeBinary(Multiplication) CreateNodeBinary(Division) CreateNodeBinary(Modulo) CreateNodeBinary(Power) CreateNodeBinary(BitwiseAnd) CreateNodeBinary(BitwiseOr) CreateNodeBinary(LogicalAnd) CreateNodeBinary(LogicalOr) CreateNodeBinary(LessThan) CreateNodeBinary(LessThanEqual) CreateNodeBinary(GreaterThan) CreateNodeBinary(GreaterThanEqual) CreateNodeBinary(EqualTo) CreateNodeBinary(NotEqualTo) void *NewData(Kst::ObjectStore *store, char *name); void *NewIdentifier(char *name); void *NewFunction(char *name, void *args); void *NewArgumentList(); void *NewNumber(double n); void *NewNot(void *n); void *NewNegation(void *n); void AppendArgument(void *list, void *arg); void DeleteNode(void *n); /* WARNING: this does evil things. will cause a crash if we ever do MI in the tree */ void ParenthesizeNode(void *n); #ifdef __cplusplus //} #endif #undef CreateNode #endif /* vim: ts=2 sw=2 et */ Kst-2.0.8/src/libkstmath/eparse.cpp0000644000175000017500000017225212277111530016302 0ustar synthsynth/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { T_NUMBER = 258, T_IDENTIFIER = 259, T_DATA = 260, T_OPENPAR = 261, T_CLOSEPAR = 262, T_COMMA = 263, T_INVALID = 264, T_LOR = 265, T_LAND = 266, T_OR = 267, T_AND = 268, T_NE = 269, T_EQ = 270, T_GE = 271, T_GT = 272, T_LE = 273, T_LT = 274, T_SUBTRACT = 275, T_ADD = 276, T_MOD = 277, T_DIVIDE = 278, T_MULTIPLY = 279, T_NOT = 280, U_SUBTRACT = 281, T_EXP = 282 }; #endif /* Tokens. */ #define T_NUMBER 258 #define T_IDENTIFIER 259 #define T_DATA 260 #define T_OPENPAR 261 #define T_CLOSEPAR 262 #define T_COMMA 263 #define T_INVALID 264 #define T_LOR 265 #define T_LAND 266 #define T_OR 267 #define T_AND 268 #define T_NE 269 #define T_EQ 270 #define T_GE 271 #define T_GT 272 #define T_LE 273 #define T_LT 274 #define T_SUBTRACT 275 #define T_ADD 276 #define T_MOD 277 #define T_DIVIDE 278 #define T_MULTIPLY 279 #define T_NOT 280 #define U_SUBTRACT 281 #define T_EXP 282 /* Copy the first part of user declarations. */ #line 2 "../../../src/libkstmath/eparse.y" #include #include #include #include #include "enodefactory.h" #include "eparse-eh.h" extern int yylex(Kst::ObjectStore *store); KSTMATH_EXPORT void *ParsedEquation = 0L; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 20 "../../../src/libkstmath/eparse.y" { char *data; double number; void *n; /* tree node */ char character; } /* Line 193 of yacc.c. */ #line 172 "eparse.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 185 "eparse.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 360 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 28 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 17 /* YYNRULES -- Number of rules. */ #define YYNRULES 68 /* YYNRULES -- Number of states. */ #define YYNSTATES 106 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 282 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 4, 7, 9, 10, 12, 16, 19, 21, 25, 28, 30, 34, 38, 42, 46, 50, 54, 57, 60, 63, 66, 69, 72, 74, 78, 82, 86, 90, 92, 95, 98, 102, 106, 110, 113, 116, 119, 121, 124, 127, 130, 132, 136, 140, 143, 146, 148, 152, 155, 157, 159, 164, 168, 174, 179, 183, 185, 188, 190, 193, 195, 199, 201, 205, 206, 210 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 29, 0, -1, -1, 30, 31, -1, 32, -1, -1, 33, -1, 33, 10, 34, -1, 10, 1, -1, 34, -1, 34, 11, 35, -1, 11, 1, -1, 35, -1, 35, 19, 36, -1, 35, 18, 36, -1, 35, 17, 36, -1, 35, 16, 36, -1, 35, 15, 36, -1, 35, 14, 36, -1, 19, 1, -1, 17, 1, -1, 18, 1, -1, 16, 1, -1, 15, 1, -1, 14, 1, -1, 36, -1, 36, 21, 37, -1, 36, 20, 37, -1, 36, 12, 37, -1, 36, 13, 37, -1, 37, -1, 12, 1, -1, 13, 1, -1, 37, 24, 38, -1, 37, 23, 38, -1, 37, 22, 38, -1, 24, 1, -1, 23, 1, -1, 22, 1, -1, 38, -1, 20, 38, -1, 25, 38, -1, 25, 1, -1, 39, -1, 39, 27, 39, -1, 39, 27, 1, -1, 39, 27, -1, 27, 1, -1, 40, -1, 6, 33, 7, -1, 6, 1, -1, 4, -1, 5, -1, 4, 6, 7, 1, -1, 4, 6, 7, -1, 4, 6, 41, 7, 1, -1, 4, 6, 41, 7, -1, 4, 6, 1, -1, 3, -1, 3, 1, -1, 9, -1, 6, 7, -1, 42, -1, 42, 8, 44, -1, 44, -1, 42, 8, 1, -1, -1, 43, 8, 44, -1, 32, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 46, 46, 46, 57, 60, 63, 67, 69, 71, 75, 77, 79, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 111, 113, 115, 117, 119, 121, 123, 127, 129, 131, 133, 135, 137, 139, 143, 145, 147, 149, 153, 155, 157, 159, 161, 165, 167, 169, 171, 173, 175, 180, 182, 184, 186, 188, 190, 192, 196, 200, 202, 204, 206, 206, 210 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "T_NUMBER", "T_IDENTIFIER", "T_DATA", "T_OPENPAR", "T_CLOSEPAR", "T_COMMA", "T_INVALID", "T_LOR", "T_LAND", "T_OR", "T_AND", "T_NE", "T_EQ", "T_GE", "T_GT", "T_LE", "T_LT", "T_SUBTRACT", "T_ADD", "T_MOD", "T_DIVIDE", "T_MULTIPLY", "T_NOT", "U_SUBTRACT", "T_EXP", "$accept", "WRAPPER", "@1", "PRESTART", "START", "BOOLEAN_OR", "BOOLEAN_AND", "COMPARISON", "EQUATION", "TERM", "NEG", "EXP", "ATOMIC", "ARGUMENTS", "ARGLIST", "@2", "ARGUMENT", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 28, 30, 29, 31, 31, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 42, 42, 43, 42, 44 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 1, 0, 1, 3, 2, 1, 3, 2, 1, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 3, 3, 2, 2, 1, 3, 2, 1, 1, 4, 3, 5, 4, 3, 1, 2, 1, 2, 1, 3, 1, 3, 0, 3, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 5, 1, 0, 51, 52, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 9, 12, 25, 30, 39, 43, 48, 59, 0, 50, 61, 0, 8, 11, 31, 32, 24, 23, 22, 20, 21, 19, 40, 38, 37, 36, 42, 41, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 68, 0, 62, 0, 64, 49, 7, 10, 18, 17, 16, 15, 14, 13, 28, 29, 27, 26, 35, 34, 33, 45, 44, 53, 0, 0, 0, 55, 65, 63, 67 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 1, 2, 25, 75, 27, 28, 29, 30, 31, 32, 33, 34, 76, 77, 78, 79 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -58 static const yytype_int16 yypact[] = { -58, 1, 221, -58, 46, 28, -58, 146, -58, 48, 54, 76, 79, 98, 99, 100, 101, 104, 120, 333, 141, 153, 166, 196, 177, -58, -58, 169, 181, 23, 15, 52, -58, 176, -58, -58, 121, -58, -58, 38, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, 246, 271, 296, 296, 296, 296, 296, 296, 308, 308, 308, 308, 333, 333, 333, 2, -58, 71, -58, 197, 204, 205, -58, -58, 181, 23, 15, 15, 15, 15, 15, 15, 52, 52, 52, 52, -58, -58, -58, -58, 176, -58, 96, 171, 221, -58, -58, -58, -58 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -58, -58, -58, -58, 212, 208, 160, 161, 147, -35, -19, 148, -58, -58, -58, -58, -57 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -67 static const yytype_int8 yytable[] = { 50, 3, -46, 96, 55, 4, 5, 6, 7, -46, -46, 8, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, 65, 66, 24, 89, 90, 91, 92, 36, 67, 68, 59, 60, 61, 62, 63, 64, 104, 105, 80, -58, 35, 57, 40, 93, 94, 95, -58, -58, 41, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -54, 98, -58, 69, 70, 71, 42, -54, -54, 43, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -56, 102, -54, 44, 45, 46, 47, -56, -56, 48, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, 49, 73, -56, 4, 5, 6, 7, 74, -66, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 51, 20, 21, 22, 23, 37, 24, 4, 5, 6, 7, 38, 52, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 53, 20, 21, 22, 23, 103, 24, 4, 5, 6, 7, 56, 57, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 58, 20, 21, 22, 23, 54, 24, 4, 5, 6, 7, 72, 99, 8, 83, 84, 85, 86, 87, 88, 100, 101, 26, 39, 19, 81, 0, 82, 97, 23, 0, 24, 4, 5, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 23, 0, 24, 4, 5, 6, 7, 0, 0, 8, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 23, 0, 24, 4, 5, 6, 7, 0, 0, 8, 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 23, 0, 24, 4, 5, 6, 7, 0, 0, 8, 0, 0, 11, 12, 0, 4, 5, 6, 7, 0, 19, 8, 20, 21, 22, 23, 0, 24, 0, 0, 0, 0, 19, 0, 20, 21, 22, 23, 0, 24, 4, 5, 6, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 23, 0, 24 }; static const yytype_int8 yycheck[] = { 19, 0, 0, 1, 23, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 12, 13, 27, 65, 66, 67, 68, 6, 20, 21, 14, 15, 16, 17, 18, 19, 100, 101, 7, 0, 1, 10, 1, 69, 70, 71, 7, 8, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 1, 27, 22, 23, 24, 1, 7, 8, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 1, 27, 1, 1, 1, 1, 7, 8, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 1, 1, 27, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 22, 23, 24, 25, 1, 27, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 22, 23, 24, 25, 1, 27, 3, 4, 5, 6, 1, 10, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 11, 22, 23, 24, 25, 1, 27, 3, 4, 5, 6, 27, 7, 9, 59, 60, 61, 62, 63, 64, 8, 8, 2, 7, 20, 57, -1, 58, 72, 25, -1, 27, 3, 4, 5, 6, -1, -1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, -1, 27, 3, 4, 5, 6, -1, -1, 9, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, -1, 27, 3, 4, 5, 6, -1, -1, 9, -1, -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, -1, 27, 3, 4, 5, 6, -1, -1, 9, -1, -1, 12, 13, -1, 3, 4, 5, 6, -1, 20, 9, 22, 23, 24, 25, -1, 27, -1, -1, -1, -1, 20, -1, 22, 23, 24, 25, -1, 27, 3, 4, 5, 6, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, 25, -1, 27 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 29, 30, 0, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 1, 6, 1, 7, 33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38, 1, 1, 1, 1, 38, 1, 10, 11, 14, 15, 16, 17, 18, 19, 12, 13, 20, 21, 22, 23, 24, 27, 1, 7, 32, 41, 42, 43, 44, 7, 34, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 1, 39, 1, 7, 8, 8, 1, 1, 44, 44 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (store, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex (store) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, store); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Kst::ObjectStore *store) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, store) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Kst::ObjectStore *store; #endif { if (!yyvaluep) return; YYUSE (store); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Kst::ObjectStore *store) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, store) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Kst::ObjectStore *store; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, store); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Kst::ObjectStore *store) #else static void yy_reduce_print (yyvsp, yyrule, store) YYSTYPE *yyvsp; int yyrule; Kst::ObjectStore *store; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , store); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, store); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Kst::ObjectStore *store) #else static void yydestruct (yymsg, yytype, yyvaluep, store) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Kst::ObjectStore *store; #endif { YYUSE (yyvaluep); YYUSE (store); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); /* switch (yytype) { default: break; } */ } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus KSTMATH_EXPORT int yyparse (Kst::ObjectStore *store); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Kst::ObjectStore *store) #else int yyparse (store) Kst::ObjectStore *store; #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 46 "../../../src/libkstmath/eparse.y" { (yyval.n) = 0L; yyClearErrors(); ParsedEquation = 0L; } break; case 3: #line 47 "../../../src/libkstmath/eparse.y" { (yyval.n) = ParsedEquation = (yyvsp[(2) - (2)].n); if (yyErrorCount() > 0) { DeleteNode((yyval.n)); (yyval.n) = 0L; ParsedEquation = 0L; YYERROR; } } break; case 4: #line 58 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 5: #line 60 "../../../src/libkstmath/eparse.y" { (yyval.n) = 0L; yyerror(store, EParseErrorEmpty); } break; case 6: #line 64 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 7: #line 68 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewLogicalOr((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 8: #line 70 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 9: #line 72 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 10: #line 76 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewLogicalAnd((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 11: #line 78 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 12: #line 80 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 13: #line 84 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewLessThan((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 14: #line 86 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewLessThanEqual((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 15: #line 88 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewGreaterThan((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 16: #line 90 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewGreaterThanEqual((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 17: #line 92 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewEqualTo((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 18: #line 94 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewNotEqualTo((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 19: #line 96 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 20: #line 98 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 21: #line 100 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 22: #line 102 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 23: #line 104 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 24: #line 106 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 25: #line 108 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 26: #line 112 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewAddition((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 27: #line 114 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewSubtraction((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 28: #line 116 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewBitwiseOr((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 29: #line 118 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewBitwiseAnd((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 30: #line 120 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 31: #line 122 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 32: #line 124 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 33: #line 128 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewMultiplication((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 34: #line 130 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewDivision((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 35: #line 132 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewModulo((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 36: #line 134 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 37: #line 136 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 38: #line 138 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorTwoOperands); (yyval.n) = 0L; } break; case 39: #line 140 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 40: #line 144 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewNegation((yyvsp[(2) - (2)].n)); } break; case 41: #line 146 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewNot((yyvsp[(2) - (2)].n)); } break; case 42: #line 148 "../../../src/libkstmath/eparse.y" { (yyval.n) = 0L; yyerror(store, EParseErrorRequiresOperand); } break; case 43: #line 150 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 44: #line 154 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewPower((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } break; case 45: #line 156 "../../../src/libkstmath/eparse.y" { DeleteNode((yyvsp[(1) - (3)].n)); (yyval.n) = 0L; yyerror(store, EParseErrorTwoOperands); } break; case 46: #line 158 "../../../src/libkstmath/eparse.y" { DeleteNode((yyvsp[(1) - (2)].n)); (yyval.n) = 0L; yyerror(store, EParseErrorTwoOperands); } break; case 47: #line 160 "../../../src/libkstmath/eparse.y" { (yyval.n) = 0L; yyerror(store, EParseErrorTwoOperands); } break; case 48: #line 162 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 49: #line 166 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(2) - (3)].n); ParenthesizeNode((yyval.n)); } break; case 50: #line 168 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorMissingClosingParenthesis); (yyval.n) = 0L; } break; case 51: #line 170 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewIdentifier((yyvsp[(1) - (1)].data)); } break; case 52: #line 172 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewData(store, (yyvsp[(1) - (1)].data)); } break; case 53: #line 174 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorNoImplicitMultiply); free((yyvsp[(1) - (4)].data)); (yyval.n) = 0L; } break; case 54: #line 176 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewFunction((yyvsp[(1) - (3)].data), NewArgumentList()); } break; case 55: #line 181 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorNoImplicitMultiply); DeleteNode((yyvsp[(3) - (5)].n)); free((yyvsp[(1) - (5)].data)); (yyval.n) = 0L; } break; case 56: #line 183 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewFunction((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].n)); } break; case 57: #line 185 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorMissingClosingParenthesis); free((yyvsp[(1) - (3)].data)); (yyval.n) = 0L; } break; case 58: #line 187 "../../../src/libkstmath/eparse.y" { (yyval.n) = NewNumber((yyvsp[(1) - (1)].number)); } break; case 59: #line 189 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorNoImplicitMultiply); (yyval.n) = 0L; } break; case 60: #line 191 "../../../src/libkstmath/eparse.y" { yyerrortoken((yyvsp[(1) - (1)].character)); (yyval.n) = 0L; } break; case 61: #line 193 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorEmptyParentheses); (yyval.n) = 0L; } break; case 62: #line 197 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; case 63: #line 201 "../../../src/libkstmath/eparse.y" { if ((yyvsp[(1) - (3)].n) && (yyvsp[(3) - (3)].n)) { AppendArgument((yyvsp[(1) - (3)].n), (yyvsp[(3) - (3)].n)); } else { DeleteNode((yyvsp[(1) - (3)].n)); DeleteNode((yyvsp[(3) - (3)].n)); (yyvsp[(1) - (3)].n) = 0L; } (yyval.n) = (yyvsp[(1) - (3)].n); } break; case 64: #line 203 "../../../src/libkstmath/eparse.y" { if ((yyvsp[(1) - (1)].n)) { (yyval.n) = NewArgumentList(); AppendArgument((yyval.n), (yyvsp[(1) - (1)].n)); } else { (yyval.n) = 0L; } } break; case 65: #line 205 "../../../src/libkstmath/eparse.y" { (yyval.n) = 0L; DeleteNode((yyvsp[(1) - (3)].n)); yyerror(store, EParseErrorEmptyArg); } break; case 66: #line 206 "../../../src/libkstmath/eparse.y" {} break; case 67: #line 207 "../../../src/libkstmath/eparse.y" { yyerror(store, EParseErrorEmptyArg); DeleteNode((yyvsp[(3) - (3)].n)); (yyval.n) = 0L; } break; case 68: #line 211 "../../../src/libkstmath/eparse.y" { (yyval.n) = (yyvsp[(1) - (1)].n); } break; /* Line 1267 of yacc.c. */ #line 1871 "eparse.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (store, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (store, yymsg); } else { yyerror (store, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, store); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, store); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (store, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, store); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, store); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 214 "../../../src/libkstmath/eparse.y" Kst-2.0.8/src/libkstmath/dialoglauncher.cpp0000644000175000017500000000710712277111530020000 0ustar synthsynth/*************************************************************************** dialoglauncher.cpp ------------------- begin : Nov. 24, 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dialoglauncher.h" #include namespace Kst { DialogLauncher *DialogLauncher::_self = 0L; void DialogLauncher::cleanup() { delete _self; _self = 0; } DialogLauncher *DialogLauncher::self() { Q_ASSERT(_self); return _self; } void DialogLauncher::replaceSelf(DialogLauncher *newInstance) { cleanup(); _self = newInstance; } DialogLauncher::DialogLauncher() { qAddPostRoutine(DialogLauncher::cleanup); } DialogLauncher::~DialogLauncher() { } void DialogLauncher::showVectorDialog(QString &vectorname, ObjectPtr objectPtr, bool modal) { Q_UNUSED(objectPtr); Q_UNUSED(vectorname); Q_UNUSED(modal); } void DialogLauncher::showMatrixDialog(QString &matrixName, ObjectPtr objectPtr, bool modal) { Q_UNUSED(objectPtr); Q_UNUSED(matrixName); Q_UNUSED(modal); } void DialogLauncher::showScalarDialog(QString &scalarname, ObjectPtr objectPtr, bool modal) { Q_UNUSED(objectPtr); Q_UNUSED(scalarname); Q_UNUSED(modal); } void DialogLauncher::showStringDialog(QString &scalarname, ObjectPtr objectPtr, bool modal) { Q_UNUSED(objectPtr); Q_UNUSED(scalarname); Q_UNUSED(modal); } void DialogLauncher::showCurveDialog(ObjectPtr objectPtr, VectorPtr vector) { Q_UNUSED(objectPtr); Q_UNUSED(vector); } void DialogLauncher::showMultiCurveDialog(QList curves) { Q_UNUSED(curves); } void DialogLauncher::showImageDialog(ObjectPtr objectPtr, MatrixPtr matrix) { Q_UNUSED(objectPtr); Q_UNUSED(matrix); } void DialogLauncher::showMultiImageDialog(QList images) { Q_UNUSED(images); } void DialogLauncher::showEquationDialog(ObjectPtr objectPtr) { Q_UNUSED(objectPtr); } void DialogLauncher::showEventMonitorDialog(ObjectPtr objectPtr) { Q_UNUSED(objectPtr); } void DialogLauncher::showHistogramDialog(ObjectPtr objectPtr, VectorPtr vector) { Q_UNUSED(objectPtr); Q_UNUSED(vector); } void DialogLauncher::showPowerSpectrumDialog(ObjectPtr objectPtr, VectorPtr vector) { Q_UNUSED(objectPtr); Q_UNUSED(vector); } void DialogLauncher::showCSDDialog(ObjectPtr objectPtr, VectorPtr vector) { Q_UNUSED(objectPtr); Q_UNUSED(vector); } void DialogLauncher::showBasicPluginDialog(QString pluginName, ObjectPtr objectPtr, VectorPtr vectorX, VectorPtr vectorY, PlotItemInterface *plotItem) { Q_UNUSED(pluginName); Q_UNUSED(objectPtr); Q_UNUSED(vectorX); Q_UNUSED(vectorY); Q_UNUSED(plotItem); } void DialogLauncher::showObjectDialog(ObjectPtr objectPtr) { Q_UNUSED(objectPtr); } void DialogLauncher::showMultiObjectDialog(QList objects) { Q_UNUSED(objects); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curve.h0000644000175000017500000001747412320547027015623 0ustar synthsynth/*************************************************************************** vcurve.h: defines a curve for kst ------------------- begin : Fri Oct 22 2000 copyright : (C) 2000 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVE_H #define CURVE_H #include "relation.h" #include "painter.h" #include "curvepointsymbol.h" #include "kstmath_export.h" #include "labelinfo.h" #include /**A class for handling curves for kst *@author C. Barth Netterfield */ #define CURVE_DEFAULT_POINT_SIZE 12 namespace Kst { class KSTMATH_EXPORT Curve: public Relation { Q_OBJECT public: static const QString staticTypeString; const QString& typeString() const { return staticTypeString; } static const QString staticTypeTag; virtual void internalUpdate(); virtual QString propertyString() const; virtual int getIndexNearXY(double x, double dx, double y) const; virtual bool hasXError() const; virtual bool hasYError() const; virtual bool hasXMinusError() const; virtual bool hasYMinusError() const; // Note: these are -expensive-. Don't use them on inner loops! virtual void point(int i, double &x1, double &y1) const; virtual void getEXPoint(int i, double &x1, double &y1, double &ex1); virtual void getEYPoint(int i, double &x1, double &y1, double &ey1); virtual void getEXMinusPoint(int i, double &x1, double &y1, double &ex1); virtual void getEYMinusPoint(int i, double &x1, double &y1, double &ey1); virtual void getEXPoints(int i, double &x, double &y, double &ex, double &exminus); virtual void getEYPoints(int i, double &x, double &y, double &ey, double &eyminus); void setXVector(VectorPtr new_vx); void setYVector(VectorPtr new_vy); void setXError(VectorPtr new_ex); void setYError(VectorPtr new_ey); void setXMinusError(VectorPtr new_ex); void setYMinusError(VectorPtr new_ey); /** Save curve information */ void save(QXmlStreamWriter &s); virtual bool xIsRising() const; virtual double maxX() const; virtual double minX() const; virtual double meanX() const { return MeanX; } virtual double meanY() const { return MeanY; } virtual void yRange(double xFrom, double xTo, double* yMin, double* yMax); virtual int samplesPerFrame() const; virtual void showNewDialog(); virtual void showEditDialog(); VectorPtr xVector() const; VectorPtr yVector() const; VectorPtr xErrorVector() const; VectorPtr yErrorVector() const; VectorPtr xMinusErrorVector() const; VectorPtr yMinusErrorVector() const; virtual bool hasPoints() const { return HasPoints; } virtual bool hasLines() const { return HasLines; } virtual bool hasBars() const { return HasBars; } virtual bool hasHead() const { return HasHead; } virtual void setHasPoints(bool in_HasPoints); virtual void setHasLines(bool in_HasLines); virtual void setHasBars(bool in_HasBars); virtual void setHasHead(bool in_HasHead); virtual void setLineWidth(int in_LineWidth); virtual void setLineStyle(int in_LineStyle); virtual void setPointDensity(int in_PointDensity); virtual void setPointType(int in_PointType); virtual void setPointSize(double in_PointSize); virtual void setHeadType(int in_HeadType); virtual int lineWidth() const { return LineWidth; } static double lineDim(const QRectF &R, double linewidth); virtual int lineStyle() const { return LineStyle; } virtual int pointDensity() const { return PointDensity; } virtual int pointType() const { return PointType; } virtual int headType() const { return HeadType; } virtual double pointSize() const { return PointSize; } virtual double pointDim(QRectF w) const; virtual QColor color() const { return Color; } virtual void setColor(const QColor& new_c); virtual QColor barFillColor() const { return BarFillColor; } virtual void setBarFillColor(const QColor& new_c); virtual QColor headColor() const { return HeadColor; } virtual void setHeadColor(const QColor& new_c); #if 0 void pushColor(const QColor& c) { _colorStack.push(color()); setColor(c); } void popColor() { setColor(_colorStack.pop()); } void pushLineWidth(int w) { _widthStack.push(lineWidth()); setLineWidth(w); } void popLineWidth() { setLineWidth(_widthStack.pop()); } void pushLineStyle(int s) { _lineStyleStack.push(lineStyle()); setLineStyle(s); } void popLineStyle() { setLineStyle(_lineStyleStack.pop()); } void pushPointStyle(int s) { _pointStyleStack.push(PointType); PointType = s; } void popPointStyle() { PointType = _pointStyleStack.pop(); } void pushHasPoints(bool h) { _hasPointsStack.push(hasPoints()); setHasPoints(h); } void popHasPoints() { setHasPoints(_hasPointsStack.pop()); } void pushHasLines(bool h) { _hasLinesStack.push(hasLines()); setHasLines(h); } void popHasLines() { setHasLines(_hasLinesStack.pop()); } void pushPointDensity(int d) { _pointDensityStack.push(pointDensity()); setPointDensity(d); } void popPointDensity() { setPointDensity(_pointDensityStack.pop()); } #endif //virtual RelationPtr makeDuplicate(QMap &duplicatedRelations); virtual RelationPtr makeDuplicate() const; // render this curve virtual void paintObjects(const CurveRenderContext& context); // Update the curve details. void updatePaintObjects(const CurveRenderContext& context); // render the legend symbol for this curve virtual QSize legendSymbolSize(QPainter *p); virtual void paintLegendSymbol(QPainter *p, const QSize &size); virtual bool symbolLabelOnTop() {return false;} // see KstRelation::distanceToPoint virtual double distanceToPoint(double xpos, double dx, double ypos) const; virtual QString descriptionTip() const; // labels for plots virtual LabelInfo xLabelInfo() const; virtual LabelInfo yLabelInfo() const; virtual LabelInfo titleInfo() const; virtual ScriptInterface* createScriptInterface(); protected: Curve(ObjectStore *store); virtual ~Curve(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); private: double MeanY; int LineWidth; int LineStyle; int PointDensity; int PointType; double PointSize; int HeadType; bool HasPoints; bool HasLines; bool HasBars; bool HasHead; QColor Color; QColor HeadColor; QColor BarFillColor; #if 0 QStack _widthStack; QStack _colorStack; QStack _pointStyleStack; QStack _lineStyleStack; QStack _hasPointsStack; QStack _hasLinesStack; QStack _pointDensityStack; #endif QVector _polygons; QVector _lines; QVector _points; QVector _filledRects; QVector _rects; QPointF _head; bool _head_valid; int _width; }; typedef SharedPtr CurvePtr; typedef ObjectList CurveList; } Q_DECLARE_METATYPE(Kst::Curve*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/eparse-eh.cpp0000644000175000017500000000446612277111530016675 0ustar synthsynth/*************************************************************************** eparse-eh.cpp ------------------- begin : Nov. 24, 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include #include "kstmath_export.h" #include "objectstore.h" namespace Equations { KSTMATH_EXPORT QStringList errorStack; } /*extern "C"*/ const char *EParseErrorEmpty = "Equations is empty."; /*extern "C"*/ const char *EParseErrorEmptyArg = "Function argument is empty."; /*extern "C"*/ const char *EParseErrorTwoOperands = "Two operands are required."; /*extern "C"*/ const char *EParseErrorEmptyParentheses = "Empty parentheses are forbidden except in function calls."; /*extern "C"*/ const char *EParseErrorMissingClosingParenthesis = "Closing parenthesis is missing."; /*extern "C"*/ const char *EParseErrorNoImplicitMultiply = "Term must be followed by an operator. Implicit multiplication is not supported."; /*extern "C"*/ const char *EParseErrorRequiresOperand = "This operator requires an operand."; /*extern "C"*/ const char *EParseErrorToken = "Unknown character '%1'."; /*extern "C"*/ void yyClearErrors() { Equations::errorStack.clear(); } /*extern "C"*/ int yyErrorCount() { return Equations::errorStack.count(); } /*extern "C"*/ void yyerror(Kst::ObjectStore *store, const char *s) { Q_UNUSED(store) Equations::errorStack << s; } /*extern "C"*/ void yyerrortoken(char c) { Equations::errorStack << QString(EParseErrorToken).arg(c); } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/eparse.y0000644000175000017500000001354612277111530015770 0ustar synthsynth %{ #include #include #include #include #include "enodefactory.h" #include "eparse-eh.h" extern int yylex(Kst::ObjectStore *store); void *ParsedEquation = 0L; %} %parse-param { Kst::ObjectStore *store } %lex-param { Kst::ObjectStore *store } %union { char *data; double number; void *n; /* tree node */ char character; } %token T_NUMBER T_IDENTIFIER T_DATA T_OPENPAR T_CLOSEPAR T_COMMA T_INVALID %left T_LOR %left T_LAND %left T_OR %left T_AND %left T_EQ T_NE %left T_LT T_LE T_GT T_GE %left T_ADD T_SUBTRACT %left T_MULTIPLY T_DIVIDE T_MOD %left T_NOT %nonassoc U_SUBTRACT %right T_EXP %start WRAPPER %% WRAPPER : { $$ = 0L; yyClearErrors(); ParsedEquation = 0L; } PRESTART { $$ = ParsedEquation = $2; if (yyErrorCount() > 0) { DeleteNode($$); $$ = 0L; ParsedEquation = 0L; YYERROR; } } ; PRESTART : START { $$ = $1; } | /**/ { $$ = 0L; yyerror(store, EParseErrorEmpty); } ; START : BOOLEAN_OR { $$ = $1; } ; BOOLEAN_OR : BOOLEAN_OR T_LOR BOOLEAN_AND { $$ = NewLogicalOr($1, $3); } | T_LOR error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | BOOLEAN_AND { $$ = $1; } ; BOOLEAN_AND : BOOLEAN_AND T_LAND COMPARISON { $$ = NewLogicalAnd($1, $3); } | T_LAND error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | COMPARISON { $$ = $1; } ; COMPARISON : COMPARISON T_LT EQUATION { $$ = NewLessThan($1, $3); } | COMPARISON T_LE EQUATION { $$ = NewLessThanEqual($1, $3); } | COMPARISON T_GT EQUATION { $$ = NewGreaterThan($1, $3); } | COMPARISON T_GE EQUATION { $$ = NewGreaterThanEqual($1, $3); } | COMPARISON T_EQ EQUATION { $$ = NewEqualTo($1, $3); } | COMPARISON T_NE EQUATION { $$ = NewNotEqualTo($1, $3); } | T_LT error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_GT error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_LE error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_GE error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_EQ error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_NE error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | EQUATION { $$ = $1; } ; EQUATION : EQUATION T_ADD TERM { $$ = NewAddition($1, $3); } | EQUATION T_SUBTRACT TERM { $$ = NewSubtraction($1, $3); } | EQUATION T_OR TERM { $$ = NewBitwiseOr($1, $3); } | EQUATION T_AND TERM { $$ = NewBitwiseAnd($1, $3); } | TERM { $$ = $1; } | T_OR error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_AND error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } ; TERM : TERM T_MULTIPLY NEG { $$ = NewMultiplication($1, $3); } | TERM T_DIVIDE NEG { $$ = NewDivision($1, $3); } | TERM T_MOD NEG { $$ = NewModulo($1, $3); } | T_MULTIPLY error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_DIVIDE error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | T_MOD error { yyerror(store, EParseErrorTwoOperands); $$ = 0L; } | NEG { $$ = $1; } ; NEG : T_SUBTRACT NEG %prec U_SUBTRACT { $$ = NewNegation($2); } | T_NOT NEG { $$ = NewNot($2); } | T_NOT error { $$ = 0L; yyerror(store, EParseErrorRequiresOperand); } | EXP { $$ = $1; } ; EXP : EXP T_EXP EXP { $$ = NewPower($1, $3); } | EXP T_EXP error { DeleteNode($1); $$ = 0L; yyerror(store, EParseErrorTwoOperands); } | EXP T_EXP /**/ { DeleteNode($1); $$ = 0L; yyerror(store, EParseErrorTwoOperands); } | T_EXP error { $$ = 0L; yyerror(store, EParseErrorTwoOperands); } | ATOMIC { $$ = $1; } ; ATOMIC : T_OPENPAR BOOLEAN_OR T_CLOSEPAR { $$ = $2; ParenthesizeNode($$); } | T_OPENPAR error { yyerror(store, EParseErrorMissingClosingParenthesis); $$ = 0L; } | T_IDENTIFIER { $$ = NewIdentifier($1); } | T_DATA { $$ = NewData(store, $1); } | T_IDENTIFIER T_OPENPAR T_CLOSEPAR error { yyerror(store, EParseErrorNoImplicitMultiply); free($1); $$ = 0L; } | T_IDENTIFIER T_OPENPAR T_CLOSEPAR { $$ = NewFunction($1, NewArgumentList()); } /* | T_IDENTIFIER T_OPENPAR ARGUMENTS error { yyerror(store, EParseErrorMissingClosingParenthesis); DeleteNode($3); free($1); $$ = 0L; } */ | T_IDENTIFIER T_OPENPAR ARGUMENTS T_CLOSEPAR error { yyerror(store, EParseErrorNoImplicitMultiply); DeleteNode($3); free($1); $$ = 0L; } | T_IDENTIFIER T_OPENPAR ARGUMENTS T_CLOSEPAR { $$ = NewFunction($1, $3); } | T_IDENTIFIER T_OPENPAR error { yyerror(store, EParseErrorMissingClosingParenthesis); free($1); $$ = 0L; } | T_NUMBER { $$ = NewNumber($1); } | T_NUMBER error { yyerror(store, EParseErrorNoImplicitMultiply); $$ = 0L; } | T_INVALID { yyerrortoken($1); $$ = 0L; } | T_OPENPAR T_CLOSEPAR { yyerror(store, EParseErrorEmptyParentheses); $$ = 0L; } ; ARGUMENTS : ARGLIST { $$ = $1; } ; ARGLIST : ARGLIST T_COMMA ARGUMENT { if ($1 && $3) { AppendArgument($1, $3); } else { DeleteNode($1); DeleteNode($3); $1 = 0L; } $$ = $1; } | ARGUMENT { if ($1) { $$ = NewArgumentList(); AppendArgument($$, $1); } else { $$ = 0L; } } | ARGLIST T_COMMA error { $$ = 0L; DeleteNode($1); yyerror(store, EParseErrorEmptyArg); } | {} /**/ T_COMMA ARGUMENT { yyerror(store, EParseErrorEmptyArg); DeleteNode($3); $$ = 0L; } ; ARGUMENT : START { $$ = $1; } ; %% Kst-2.0.8/src/libkstmath/psd.cpp0000644000175000017500000003062612362701575015620 0ustar synthsynth/*************************************************************************** psd.cpp: Power Spectra for KST ------------------- begin : Fri Feb 10 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling power spectra for kst *@author C. Barth Netterfield */ #include "psd.h" #include #include #include #include #include "dialoglauncher.h" #include "datacollection.h" #include "debug.h" #include "psdcalculator.h" #include "objectstore.h" #include "dataobjectscriptinterface.h" extern "C" void rdft(int n, int isgn, double *a); namespace Kst { const QString PSD::staticTypeString = "Power Spectrum"; const QString PSD::staticTypeTag = "powerspectrum"; static const QLatin1String& INVECTOR = QLatin1String("I"); static const QLatin1String& SVECTOR = QLatin1String("S"); static const QLatin1String& FVECTOR = QLatin1String("F"); #define KSTPSDMAXLEN 27 PSD::PSD(ObjectStore *store) : DataObject(store) { _changed = true; _typeString = staticTypeString; _type = "PowerSpectrum"; _initializeShortName(); Q_ASSERT(store); VectorPtr ov = store->createObject(); ov->setProvider(this); ov->setSlaveName("f"); ov->resize(2); _fVector = _outputVectors.insert(FVECTOR, ov).value(); ov = store->createObject(); ov->setProvider(this); ov->setSlaveName("psd"); ov->resize(2); _sVector = _outputVectors.insert(SVECTOR, ov).value(); } void PSD::_initializeShortName() { _shortName = 'S'+QString::number(_psdnum); if (_psdnum>max_psdnum) max_psdnum = _psdnum; _psdnum++; } ScriptInterface* PSD::createScriptInterface() { return new SpectrumSI(this); } void PSD::change(VectorPtr in_V, double in_freq, bool in_average, int in_averageLen, bool in_apodize, bool in_removeMean, const QString& in_VUnits, const QString& in_RUnits, ApodizeFunction in_apodizeFxn, double in_gaussianSigma, PSDType in_output, bool interpolateHoles) { if (in_V) { _inputVectors[INVECTOR] = in_V; } _Frequency = in_freq; _Average = in_average; _Apodize = in_apodize; _apodizeFxn = in_apodizeFxn; _gaussianSigma = in_gaussianSigma; _prevOutput = PSDUndefined; _RemoveMean = in_removeMean; _vectorUnits = in_VUnits; _rateUnits = in_RUnits; _Output = in_output; _interpolateHoles = interpolateHoles; _averageLength = in_averageLen; _last_n_subsets = 0; _last_n_new = 0; _last_n_new = 0; _PSDLength = 1; _fVector->resize(_PSDLength); _sVector->resize(_PSDLength); _changed = true; updateVectorLabels(); } PSD::~PSD() { _sVector = 0L; _fVector = 0L; } const CurveHintList *PSD::curveHints() const { _curveHints->clear(); _curveHints->append(new CurveHint(tr("PSD Curve"), _fVector->shortName(), _sVector->shortName())); return _curveHints; } void PSD::internalUpdate() { writeLockInputsAndOutputs(); VectorPtr iv = _inputVectors[INVECTOR]; const int v_len = iv->length(); _last_n_new += iv->numNew(); assert(_last_n_new >= 0); int n_subsets = (v_len)/_PSDLength; // determine if the PSD needs to be updated. // if not using averaging, then we need at least _PSDLength/16 new data points. // if averaging, then we want enough new data for a complete subset. // ... unless we are counting from end at fixed length (scrolling data). bool scrolling_data = (_last_n == iv->length()); if ( (!_changed) && ((_last_n_new < _PSDLength/16) || (_Average && scrolling_data && (_last_n_new < _PSDLength/16)) || (_Average && !scrolling_data && (n_subsets - _last_n_subsets < 1))) && iv->length() != iv->numNew()) { unlockInputsAndOutputs(); return; } _changed = false; _adjustLengths(); double *psd = _sVector->value(); double *f = _fVector->value(); int i_samp; for (i_samp = 0; i_samp < _PSDLength; ++i_samp) { f[i_samp] = i_samp * 0.5 * _Frequency / (_PSDLength - 1); } //f[0] = -1E-280; // really 0 (this shouldn't be needed...) _psdCalculator.calculatePowerSpectrum(iv->value(), v_len, psd, _PSDLength, _RemoveMean, _interpolateHoles, _Average, _averageLength, _Apodize, _apodizeFxn, _gaussianSigma, _Output, _Frequency); _last_n_subsets = n_subsets; _last_n_new = 0; _last_n = iv->length(); updateVectorLabels(); // should be updated by the update manager //_sVector->update(); //_fVector->update(); unlockInputsAndOutputs(); return; } void PSD::_adjustLengths() { int nPSDLen = PSDCalculator::calculateOutputVectorLength(_inputVectors[INVECTOR]->length(), _Average, _averageLength); if (_PSDLength != nPSDLen) { _sVector->resize(nPSDLen); _fVector->resize(nPSDLen); if ( (_sVector->length() == nPSDLen) && (_fVector->length() == nPSDLen) ) { _PSDLength = nPSDLen; } else { Debug::self()->log(tr("Attempted to create a PSD that used all memory."), Debug::Error); } _last_n_subsets = 0; _changed = true; } } void PSD::save(QXmlStreamWriter &s) { s.writeStartElement(staticTypeTag); s.writeAttribute("vector", _inputVectors[INVECTOR]->Name()); s.writeAttribute("samplerate", QString::number(_Frequency)); s.writeAttribute("gaussiansigma", QString::number(_gaussianSigma)); s.writeAttribute("average", QVariant(_Average).toString()); s.writeAttribute("fftlength", QString::number(int(ceil(log(double(_PSDLength*2)) / log(2.0))))); s.writeAttribute("removemean", QVariant(_RemoveMean).toString()); s.writeAttribute("apodize", QVariant(_Apodize).toString()); s.writeAttribute("apodizefunction", QString::number(_apodizeFxn)); s.writeAttribute("interpolateholes", QVariant(_interpolateHoles).toString()); s.writeAttribute("vectorunits", _vectorUnits); s.writeAttribute("rateunits", _rateUnits); s.writeAttribute("outputtype", QString::number(_Output)); saveNameInfo(s, VNUM|PSDNUM|XNUM); s.writeEndElement(); } bool PSD::apodize() const { return _Apodize; } void PSD::setApodize(bool in_apodize) { _Apodize = in_apodize; _changed = true; } bool PSD::removeMean() const { return _RemoveMean; } void PSD::setRemoveMean(bool in_removeMean) { _RemoveMean = in_removeMean; _changed = true; } bool PSD::average() const { return _Average; } void PSD::setAverage(bool in_average) { _Average = in_average; _changed = true; } double PSD::frequency() const { return _Frequency; } void PSD::setFrequency(double in_frequency) { if (in_frequency > 0.0) { _Frequency = in_frequency; } else { _Frequency = 1.0; } _changed = true; } int PSD::length() const { return _averageLength; } void PSD::setLength(int in_length) { if (in_length != _averageLength) { _averageLength = in_length; } _changed = true; } PSDType PSD::output() const { return _Output; } void PSD::setOutput(PSDType in_output) { if (in_output != _Output) { _Output = in_output; } _changed = true; } VectorPtr PSD::vector() const { return _inputVectors[INVECTOR]; } void PSD::setVector(VectorPtr new_v) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); VectorPtr v = _inputVectors[INVECTOR]; if (v) { if (v == new_v) { return; } v->unlock(); } _inputVectors.remove(INVECTOR); new_v->writeLock(); _inputVectors[INVECTOR] = new_v; _changed = true; } bool PSD::slaveVectorsUsed() const { return true; } QString PSD::propertyString() const { return tr("PSD: %1").arg(_inputVectors[INVECTOR]->Name()); } void PSD::showNewDialog() { DialogLauncher::self()->showPowerSpectrumDialog(); } void PSD::showEditDialog() { DialogLauncher::self()->showPowerSpectrumDialog(this); } const QString& PSD::vectorUnits() const { return _vectorUnits; } void PSD::setVectorUnits(const QString& units) { _vectorUnits = units; } const QString& PSD::rateUnits() const { return _rateUnits; } void PSD::setRateUnits(const QString& units) { _rateUnits = units; } ApodizeFunction PSD::apodizeFxn() const { return _apodizeFxn; } void PSD::setApodizeFxn(ApodizeFunction in_apodizeFxn) { if (_apodizeFxn != in_apodizeFxn) { _apodizeFxn = in_apodizeFxn; } _changed = true; } double PSD::gaussianSigma() const { return _gaussianSigma; } void PSD::setGaussianSigma(double in_gaussianSigma) { if (_gaussianSigma != in_gaussianSigma) { _gaussianSigma = in_gaussianSigma; } _changed = true; } DataObjectPtr PSD::makeDuplicate() const { PSDPtr powerspectrum = store()->createObject(); Q_ASSERT(powerspectrum); powerspectrum->writeLock(); powerspectrum->setVector(_inputVectors[INVECTOR]); powerspectrum->setFrequency(_Frequency); powerspectrum->setAverage(_Average); powerspectrum->setLength(_averageLength); powerspectrum->setApodize(_Apodize); powerspectrum->setRemoveMean(_RemoveMean); powerspectrum->setVectorUnits(_vectorUnits); powerspectrum->setRateUnits(_rateUnits); powerspectrum->setApodizeFxn(_apodizeFxn); powerspectrum->setGaussianSigma(_gaussianSigma); powerspectrum->setOutput(_Output); powerspectrum->setInterpolateHoles(_interpolateHoles); if (descriptiveNameIsManual()) { powerspectrum->setDescriptiveName(descriptiveName()); } powerspectrum->registerChange(); powerspectrum->unlock(); return DataObjectPtr(powerspectrum); } bool PSD::interpolateHoles() const { return _interpolateHoles; } void PSD::setInterpolateHoles(bool interpolate) { if (interpolate != _interpolateHoles) { _interpolateHoles = interpolate; } _changed = true; } void PSD::updateVectorLabels() { LabelInfo label_info; switch (_Output) { default: case 0: // amplitude spectral density (default) [V/Hz^1/2] label_info.quantity = tr("Spectral Density"); if (_vectorUnits.isEmpty() || _rateUnits.isEmpty()) { label_info.units.clear(); } else { label_info.units = QString("%1/%2^{1/2}").arg(_vectorUnits).arg(_rateUnits); } break; case 1: // power spectral density [V^2/Hz] label_info.quantity = tr("PSD"); if (_vectorUnits.isEmpty() || _rateUnits.isEmpty()) { label_info.units.clear(); } else { label_info.units = QString("%1^2/%2").arg(_vectorUnits).arg(_rateUnits); } break; case 2: // amplitude spectrum [V] label_info.quantity = tr("Amplitude Spectrum"); if (_vectorUnits.isEmpty() || _rateUnits.isEmpty()) { label_info.units.clear(); } else { label_info.units = QString("%1").arg(_vectorUnits); } break; case 3: // power spectrum [V^2] label_info.quantity = tr("Power Spectrum"); if (_vectorUnits.isEmpty() || _rateUnits.isEmpty()) { label_info.units.clear(); } else { label_info.units = QString("%1^2").arg(_vectorUnits); } break; } label_info.name.clear(); _sVector->setLabelInfo(label_info); label_info.quantity = tr("Frequency"); label_info.units = _rateUnits; _fVector->setLabelInfo(label_info); label_info.quantity.clear(); label_info.units.clear(); label_info.name = _inputVectors[INVECTOR]->labelInfo().name; label_info.file = _inputVectors[INVECTOR]->labelInfo().file; _sVector->setTitleInfo(label_info); } QString PSD::_automaticDescriptiveName() const { return vector()->descriptiveName(); } QString PSD::descriptionTip() const { QString tip; tip = tr("Spectrum: %1\n FFT Length: 2^%2").arg(Name()).arg(length()); if (average() || apodize() || removeMean()) { tip += "\n "; if (average()) tip += tr("Average; "); if (apodize()) tip += tr("Apodize; "); if (removeMean()) tip += tr("Remove Mean;"); } tip += tr("\nInput: %1").arg(_inputVectors[INVECTOR]->descriptionTip()); return tip; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/objectfactory.cpp0000644000175000017500000000353412277111530017655 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "objectfactory.h" #include #include namespace Kst { static QMap *factories = 0; void cleanupObjects() { foreach (ObjectFactory *f, *factories) { delete f; } delete factories; factories = 0; } ObjectFactory::ObjectFactory() { } ObjectFactory::~ObjectFactory() { } void ObjectFactory::registerFactory(const QString& node, ObjectFactory *factory) { if (!factories) { factories = new QMap; qAddPostRoutine(cleanupObjects); } factories->insert(node, factory); } void ObjectFactory::registerFactory(const QStringList& nodes, ObjectFactory *factory) { foreach (const QString &n, nodes) { registerFactory(n, factory); } } DataObjectPtr ObjectFactory::parse(ObjectStore *store, QXmlStreamReader& stream) { if (!factories) { return 0; } ObjectFactory *f = factories->value(stream.name().toString()); if (!f) { return 0; } return f->generateObject(store, stream); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/colorsequence.cpp0000644000175000017500000001463012277111530017665 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2003 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // application specific includes #include "colorsequence.h" #include #include #include namespace Kst { static const QLatin1String& KstColorSequenceName = QLatin1String("KstColors"); // Default palette that is used if "Kst Colors" is not found. static const char *const colors[] = { "red", "blue", "green", "black", "magenta", "steelblue", "#501010", "#105010" }; static const int colorcnt = sizeof(colors) / sizeof(char*); ColorSequence *ColorSequence::_self = &ColorSequence::self(); ColorSequence& ColorSequence::self() { if (!_self) { _self = new ColorSequence; qAddPostRoutine(ColorSequence::cleanup); } return *_self; } void ColorSequence::cleanup() { delete _self; _self = 0; } ColorSequence::ColorSequence() : _ptr(0), _mode(Color) { createPalette(); } ColorSequence::~ColorSequence() { } void ColorSequence::createPalette( ) { if (_palette != KstColorSequenceName) { _pal.clear(); _palette = KstColorSequenceName; for (int i = 0; i < colorcnt; i++) { _pal.insert(i, QColor(colors[i])); } _count = _pal.count(); _ptr = 0; } } QColor ColorSequence::next(const CurveList& curves, const QColor& badColor) { QColor color; int dark_factor; int ptrMin; int start; createPalette(); QVector usage(_count*2); for (int i = 0; i < _count*2; i++) { usage[i] = 0; } // check we are not already using this color, but if // we are then count the number of usages of each color // in the palette. start = _ptr; if (start >= _count * 2) { start = 0; } while (_ptr != start) { if (_ptr >= _count * 2) { _ptr = 0; } dark_factor = 100 + ( 50 * ( _ptr / _count ) ); color = _pal.value( _ptr % _count).dark(dark_factor); // if we are too close to the bad color then increase the usage count // to try and not use it. if (badColor.isValid() && colorsTooClose(color, badColor) ) { usage[_ptr] += 100; } for (int i = 0; i < (int)curves.count(); i++) { if (color == curves[i]->color()) { usage[_ptr]++; } } if (usage[_ptr] == 0) { break; } _ptr++; } // if we are already using this color then use the least used color for all the curves. if (usage[_ptr] != 0) { ptrMin = _ptr; while (_ptr != start) { if (_ptr >= _count * 2) { _ptr = 0; } if (usage[_ptr] < usage[ptrMin]) { ptrMin = _ptr; } _ptr++; } _ptr = ptrMin; } dark_factor = 100 + ( 50 * ( _ptr / _count ) ); color = _pal.value( _ptr++ % _count).dark(dark_factor); return color; } QColor ColorSequence::next() { createPalette(); if (_ptr >= _count * 2) { _ptr = 0; } int dark_factor = 100 + ( 50 * ( _ptr / _count ) ); return _pal.value( _ptr++ % _count).dark(dark_factor); } QColor ColorSequence::current() { createPalette(); if (_ptr >= _count * 2) { _ptr = 0; } int dark_factor = 100 + ( 50 * ( _ptr / _count ) ); return _pal.value( _ptr % _count).dark(dark_factor); } QColor ColorSequence::next(const QColor& badColor) { QColor color; int dark_factor; createPalette(); int start = _ptr; // find the next color in the sequence that it not too close to the bad color. if (badColor.isValid()) { do { if (_ptr >= _count * 2) { _ptr = 0; } dark_factor = 100 + ( 50 * ( _ptr / _count ) ); color = _pal.value( _ptr++ % _count).dark(dark_factor); } while (colorsTooClose(color, badColor) && start != _ptr); } // if we couldn't find one then just use the next color in the sequence. if (start == _ptr) { if (_ptr >= _count * 2) { _ptr = 0; } dark_factor = 100 + ( 50 * ( _ptr / _count ) ); color = _pal.value( _ptr++ % _count).dark(dark_factor); } return color; } bool ColorSequence::colorsTooClose(const QColor& color, const QColor& badColor) { double r1, h1, f1, x1, y1, z1; double r2, h2, f2, x2, y2, z2; double dc; int sugH, sugS, sugV; int badH, badS, badV; // make sure that the new color is not close to badColor. // to do this imagine HSV as defining a cone. // The distance from the point of the cone is R = V / 255 // Angle of rotational symetry is Theta = H * 2PI/360 // The 2nd angle is phi = S*(PI/4)/255 // a color is acceptable if |C1-C2|>dcMin color.getHsv(&sugH,&sugS,&sugV); badColor.getHsv(&badH, &badS, &badV); r1 = badV/255.0; h1 = badH*M_PI/180.0; f1 = badS*M_PI/4.0/255.0; x1 = r1*sin( h1 )*sin( f1 ); y1 = r1*cos( h1 )*sin( f1 ); z1 = r1*cos( f1 ); r2 = sugV/255.0; h2 = sugH*M_PI/180.0; f2 = sugS*M_PI/4.0/255.0; x2 = r2*sin( h2 )*sin( f2 ); y2 = r2*cos( h2 )*sin( f2 ); z2 = r2*cos( f2 ); dc = sqrt( ( x1-x2 )*( x1-x2 ) + ( y1-y2 )*( y1-y2 ) + ( z1-z2 )*( z1-z2 ) ); return dc < 0.3; } ColorSequence::ColorMode ColorSequence::colorMode() { return _mode; } void ColorSequence::setColorMode(ColorSequence::ColorMode mode) { _mode = mode; } int ColorSequence::count() { createPalette(); return _count * 2; } void ColorSequence::reset() { _ptr = 0; } QColor ColorSequence::entry(int ptr) { createPalette(); if (ptr >= _count * 2) { ptr = 0; } int dark_factor = 100 + ( 50 * ( ptr / _count ) ); return _pal.value( ptr % _count).dark(dark_factor); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curvefactory.cpp0000644000175000017500000001551412362701575017545 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "curvefactory.h" #include "debug.h" #include "curve.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { CurveFactory::CurveFactory() : RelationFactory() { registerFactory(Curve::staticTypeTag, this); } CurveFactory::~CurveFactory() { } RelationPtr CurveFactory::generateRelation(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); int lineStyle=0, lineWidth=0, pointType=0, pointDensity=0, pointSize = 0, headType=0; QString xVectorName, yVectorName, legend, errorXVectorName, errorYVectorName, errorXMinusVectorName; QString errorYMinusVectorName; QString colorName; QString headColorName; QString barFillColorName; QString descriptiveName; int alpha = 255; int barFillAlpha = 255; int headAlpha = 255; QString alphaStr; bool hasLines=true, hasPoints=false, hasBars=false, ignoreAutoScale=false, hasHead=false; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == Curve::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); xVectorName = attrs.value("xvector").toString(); yVectorName = attrs.value("yvector").toString(); legend = attrs.value("legend").toString(); colorName = attrs.value("color").toString(); headColorName = attrs.value("headcolor").toString(); barFillColorName = attrs.value("barfillcolor").toString(); alphaStr = attrs.value("alpha").toString(); if (!alphaStr.isEmpty()) { alpha = alphaStr.toInt(); } alphaStr = attrs.value("headalpha").toString(); if (!alphaStr.isEmpty()) { headAlpha = alphaStr.toInt(); } alphaStr = attrs.value("barfillalpha").toString(); if (!alphaStr.isEmpty()) { barFillAlpha = alphaStr.toInt(); } errorXVectorName = attrs.value("errorxvector").toString(); errorYVectorName = attrs.value("erroryvector").toString(); errorXMinusVectorName = attrs.value("errorxminusvector").toString(); errorYMinusVectorName = attrs.value("erroryminusvector").toString(); hasLines = attrs.value("haslines").toString() == "true" ? true : false; lineWidth = attrs.value("linewidth").toString().toInt(); lineStyle = attrs.value("linestyle").toString().toInt(); hasPoints = attrs.value("haspoints").toString() == "true" ? true : false; pointType = attrs.value("pointtype").toString().toInt(); pointDensity = attrs.value("pointdensity").toString().toInt(); pointSize = attrs.value("pointsize").toString().toInt(); if (pointSize < 1) { pointSize = CURVE_DEFAULT_POINT_SIZE; // FIXME: default if we were reading a pre kst2.0.7 kst file } hasHead = attrs.value("hashead").toString() == "true" ? true : false; headType = attrs.value("headtype").toString().toInt(); hasBars = attrs.value("hasbars").toString() == "true" ? true : false; ignoreAutoScale = attrs.value("ignoreautoscale").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == Curve::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Curve from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr xVector = 0; if (store && !xVectorName.isEmpty()) { xVector = kst_cast(store->retrieveObject(xVectorName)); } if (!xVector) { Debug::self()->log(QObject::tr("Error creating Curve from Kst file. Could not find xVector."), Debug::Warning); return 0; } VectorPtr yVector = 0; if (store && !yVectorName.isEmpty()) { yVector = kst_cast(store->retrieveObject(yVectorName)); } if (!yVector) { Debug::self()->log(QObject::tr("Error creating Curve from Kst file. Could not find yVector."), Debug::Warning); return 0; } VectorPtr errorXVector = 0; if (store && !errorXVectorName.isEmpty()) { errorXVector = kst_cast(store->retrieveObject(errorXVectorName)); } VectorPtr errorYVector = 0; if (store && !errorYVectorName.isEmpty()) { errorYVector = kst_cast(store->retrieveObject(errorYVectorName)); } VectorPtr errorXMinusVector = 0; if (store && !errorXMinusVectorName.isEmpty()) { errorXMinusVector = kst_cast(store->retrieveObject(errorXMinusVectorName)); } VectorPtr errorYMinusVector = 0; if (store && !errorYMinusVectorName.isEmpty()) { errorYMinusVector = kst_cast(store->retrieveObject(errorYMinusVectorName)); } CurvePtr curve = store->createObject(); curve->setXVector(xVector); curve->setYVector(yVector); curve->setXError(errorXVector); curve->setYError(errorYVector); curve->setXMinusError(errorXMinusVector); curve->setYMinusError(errorYMinusVector); QColor color(colorName); color.setAlpha(alpha); curve->setColor(color); QColor headColor(colorName); headColor.setAlpha(headAlpha); curve->setHeadColor(QColor(headColor)); if (barFillColorName.isEmpty()) { curve->setBarFillColor(curve->color()); } else { QColor barFillColor(barFillColorName); barFillColor.setAlpha(barFillAlpha); curve->setBarFillColor(barFillColor); } curve->setHasPoints(hasPoints); curve->setHasLines(hasLines); curve->setHasBars(hasBars); curve->setHasHead(hasHead); curve->setLineWidth(lineWidth); curve->setLineStyle(lineStyle); curve->setPointType(pointType); curve->setPointSize(pointSize); curve->setHeadType(headType); curve->setPointDensity(pointDensity); curve->setIgnoreAutoScale(ignoreAutoScale); curve->setDescriptiveName(descriptiveName); curve->writeLock(); curve->registerChange(); curve->unlock(); return curve; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/basicpluginfactory.cpp0000644000175000017500000001344412277111530020710 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "basicpluginfactory.h" #include "debug.h" #include "basicplugin.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { BasicPluginFactory::BasicPluginFactory() : ObjectFactory() { registerFactory(BasicPlugin::staticTypeTag, this); } BasicPluginFactory::~BasicPluginFactory() { } DataObjectPtr BasicPluginFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); DataObjectConfigWidget* configWidget; QString pluginName; QString descriptiveName; BasicPluginPtr dataObject; //bool validTag; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == BasicPlugin::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); pluginName = attrs.value("type").toString(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); configWidget = DataObject::pluginWidget(pluginName); if (configWidget) { if (!configWidget->configurePropertiesFromXml(store, attrs) ) { Debug::self()->log(QObject::tr("Error: unable to create data object from plugin"), Debug::Warning); return 0; } else { if (xml.isEndElement() && n == BasicPlugin::staticTypeTag) { break; } } } else { Debug::self()->log(QObject::tr("Error: unable to find plugin for data object"), Debug::Warning); return 0; } dataObject = kst_cast(DataObject::createPlugin(pluginName, store, configWidget, false)); QString expectedEnd; while (!(xml.isEndElement() && (xml.name().toString() == BasicPlugin::staticTypeTag))) { if (xml.isStartElement() && xml.name().toString() == "inputvector") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); VectorPtr vector = kst_cast(store->retrieveObject(tagName)); if (vector) { dataObject->setInputVector(type, vector); } } else if (xml.isStartElement() && xml.name().toString() == "inputscalar") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); ScalarPtr scalar = kst_cast(store->retrieveObject(tagName)); if (scalar) { dataObject->setInputScalar(type, scalar); } } else if (xml.isStartElement() && xml.name().toString() == "inputstring") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); StringPtr string = kst_cast(store->retrieveObject(tagName)); if (string) { dataObject->setInputString(type, string); } } else if (xml.isStartElement() && xml.name().toString() == "outputvector") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); dataObject->setOutputVector(type, tagName); } else if (xml.isStartElement() && xml.name().toString() == "outputscalar") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); dataObject->setOutputScalar(type, tagName); } else if (xml.isStartElement() && xml.name().toString() == "outputstring") { expectedEnd = xml.name().toString(); attrs = xml.attributes(); QString type = attrs.value("type").toString(); QString tagName = attrs.value("tag").toString(); dataObject->setOutputString(type, tagName); } else if (xml.isEndElement()) { if (xml.name().toString() != expectedEnd) { //validTag = false; break; } } xml.readNext(); } } else { return 0; } } if (xml.isEndElement()) { if (n == BasicPlugin::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Plugin Object from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } dataObject->setDescriptiveName(descriptiveName); dataObject->writeLock(); dataObject->registerChange(); dataObject->unlock(); return dataObject; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/histogramfactory.h0000644000175000017500000000222412277111530020044 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef HISTOGRAMFACTORY_H #define HISTOGRAMFACTORY_H #include "objectfactory.h" namespace Kst { class HistogramFactory : public ObjectFactory { public: HistogramFactory(); ~HistogramFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dialoglauncher.h0000644000175000017500000000611012277111530017436 0ustar synthsynth/*************************************************************************** dialoglauncher.h ------------------- begin : Nov. 24, 2004 copyright : (C) 2004 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DIALOGLAUNCHER_H #define DIALOGLAUNCHER_H #include #include "object.h" #include "vector.h" #include "matrix.h" #include "plotiteminterface.h" #include "kstmath_export.h" namespace Kst { class KSTMATH_EXPORT DialogLauncher : public QObject { Q_OBJECT protected: static DialogLauncher *_self; static void cleanup(); DialogLauncher(); virtual ~DialogLauncher(); public: static void replaceSelf(DialogLauncher *newInstance); static DialogLauncher *self(); public Q_SLOTS: //primitives virtual void showVectorDialog(QString &vectorname, ObjectPtr objectPtr = 0, bool modal = false) = 0; virtual void showMatrixDialog(QString &matrixName, ObjectPtr objectPtr = 0, bool modal = false) = 0; virtual void showScalarDialog(QString &scalarname, ObjectPtr objectPtr = 0, bool modal = false) = 0; virtual void showStringDialog(QString &scalarname, ObjectPtr objectPtr = 0, bool modal = false) = 0; //standard objects virtual void showCurveDialog(ObjectPtr objectPtr = 0, VectorPtr vector = 0) = 0; virtual void showMultiCurveDialog(QList curves) = 0; virtual void showImageDialog(ObjectPtr objectPtr = 0, MatrixPtr matrix = 0) = 0; virtual void showMultiImageDialog(QList images) = 0; //standard data objects virtual void showEquationDialog(ObjectPtr objectPtr = 0) = 0; virtual void showHistogramDialog(ObjectPtr objectPtr = 0, VectorPtr vector = 0) = 0; virtual void showPowerSpectrumDialog(ObjectPtr objectPtr = 0, VectorPtr vector = 0) = 0; virtual void showCSDDialog(ObjectPtr objectPtr = 0, VectorPtr vector = 0) = 0; virtual void showEventMonitorDialog(ObjectPtr objectPtr = 0) = 0; //plugins virtual void showBasicPluginDialog(QString pluginName, ObjectPtr objectPtr = 0, VectorPtr vectorX = 0, VectorPtr vectorY = 0, PlotItemInterface *plotItem = 0) = 0; //show appropriate dialog virtual void showObjectDialog(ObjectPtr objectPtr = 0) = 0; virtual void showMultiObjectDialog(QList names) = 0; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/csd.cpp0000644000175000017500000002341112362701575015575 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 by University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ /** A class for handling spectrograms for kst */ #include "csd.h" #include #include #include #include #include "dialoglauncher.h" #include "datacollection.h" #include "debug.h" #include "psdcalculator.h" #include "objectstore.h" extern "C" void rdft(int n, int isgn, double *a); namespace Kst { const QString CSD::staticTypeString = "Spectrogram"; const QString CSD::staticTypeTag = "csd"; static const QLatin1String CSD_INVECTOR = QLatin1String("I"); static const QLatin1String& OUTMATRIX = QLatin1String("M"); #define KSTCSDMAXLEN 27 CSD::CSD(ObjectStore *store) : DataObject(store) { _typeString = staticTypeString; _type = "Spectrogram"; _initializeShortName(); Q_ASSERT(store); MatrixPtr outMatrix = store->createObject(); outMatrix->setProvider(this); outMatrix->setSlaveName("SG"); outMatrix->change(2, 2); _outMatrix = _outputMatrices.insert(OUTMATRIX, outMatrix).value(); } void CSD::_initializeShortName() { _shortName = 'G'+QString::number(_csdnum); if (_csdnum>max_csdnum) max_csdnum = _csdnum; _csdnum++; } void CSD::change(VectorPtr in_V, double in_freq, bool in_average, bool in_removeMean, bool in_apodize, ApodizeFunction in_apodizeFxn, int in_windowSize, int in_length, double in_gaussianSigma, PSDType in_outputType, const QString& in_vectorUnits, const QString& in_rateUnits) { _inputVectors[CSD_INVECTOR] = in_V; QString vecName = in_V ? in_V->Name() : QString(); _frequency = in_freq; _average = in_average; _apodize = in_apodize; _windowSize = in_windowSize; _apodizeFxn = in_apodizeFxn; _gaussianSigma = in_gaussianSigma; _removeMean = in_removeMean; _averageLength = in_length; _vectorUnits = in_vectorUnits; _rateUnits = in_rateUnits; _outputType = in_outputType; if (_frequency <= 0.0) { _frequency = 1.0; } updateMatrixLabels(); } CSD::~CSD() { _outMatrix = 0L; } void CSD::internalUpdate() { VectorPtr inVector = _inputVectors[CSD_INVECTOR]; writeLockInputsAndOutputs(); double *tempOutput, *input; int tempOutputLen = PSDCalculator::calculateOutputVectorLength(_windowSize, _average, _averageLength); _length = tempOutputLen; tempOutput = new double[tempOutputLen]; input = inVector->value(); int xSize = 0; for (int i=0; i < inVector->length(); i+= _windowSize) { //ensure there is enough data left. if (i + _windowSize >= inVector->length()) { break; //If there isn't enough left for a complete window. } _psdCalculator.calculatePowerSpectrum(input + i, _windowSize, tempOutput, tempOutputLen, _removeMean, false, _average, _averageLength, _apodize, _apodizeFxn, _gaussianSigma, _outputType, _frequency); // resize output matrix _outMatrix->resize(xSize+1, tempOutputLen); if (_outMatrix->sampleCount() == (xSize+1)*tempOutputLen) { // all is well. // copy elements to output matrix for (int j=0; j < tempOutputLen; j++) { _outMatrix->setValueRaw(xSize, j, tempOutput[j]); } } else { Debug::self()->log(tr("Could not allocate sufficient memory for Spectrogram."), Debug::Error); break; } xSize++; } delete[] tempOutput; double frequencyStep = .5*_frequency/(double)(tempOutputLen-1); _outMatrix->change(xSize, tempOutputLen, 0, 0, _windowSize/_frequency, frequencyStep); unlockInputsAndOutputs(); return; } void CSD::save(QXmlStreamWriter &s) { s.writeStartElement(staticTypeTag); s.writeAttribute("vector", _inputVectors[CSD_INVECTOR]->Name()); s.writeAttribute("samplerate", QString::number(_frequency)); s.writeAttribute("gaussiansigma", QString::number(_gaussianSigma)); s.writeAttribute("average", QVariant(_average).toString()); s.writeAttribute("fftlength", QString::number(int(ceil(log(double(_length*2)) / log(2.0))))); s.writeAttribute("removemean", QVariant(_removeMean).toString()); s.writeAttribute("apodize", QVariant(_apodize).toString()); s.writeAttribute("apodizefunction", QString::number(_apodizeFxn)); s.writeAttribute("windowsize", QString::number(_windowSize)); s.writeAttribute("vectorunits", _vectorUnits); s.writeAttribute("rateunits", _rateUnits); s.writeAttribute("outputtype", QString::number(_outputType)); saveNameInfo(s,VNUM|XNUM|MNUM|CSDNUM); s.writeEndElement(); } void CSD::setVector(VectorPtr new_v) { VectorPtr v = _inputVectors[CSD_INVECTOR]; if (v) { if (v == new_v) { return; } v->unlock(); } _inputVectors.remove(CSD_INVECTOR); new_v->writeLock(); _inputVectors[CSD_INVECTOR] = new_v; } VectorPtr CSD::vector() const { return _inputVectors[CSD_INVECTOR]; } bool CSD::slaveVectorsUsed() const { return true; } QString CSD::propertyString() const { return tr("Spectrogram: %1").arg(_inputVectors[CSD_INVECTOR]->Name()); } void CSD::showNewDialog() { DialogLauncher::self()->showCSDDialog(); } void CSD::showEditDialog() { DialogLauncher::self()->showCSDDialog(this); } bool CSD::apodize() const { return _apodize; } PSDType CSD::output() const { return _outputType; } void CSD::setOutput(PSDType in_outputType) { _outputType = in_outputType; updateMatrixLabels(); } void CSD::setApodize(bool in_apodize) { _apodize = in_apodize; } bool CSD::removeMean() const { return _removeMean; } void CSD::setRemoveMean(bool in_removeMean) { _removeMean = in_removeMean; } bool CSD::average() const { return _average; } void CSD::setAverage(bool in_average) { _average = in_average; } double CSD::frequency() const { return _frequency; } void CSD::setFrequency(double in_frequency) { if (in_frequency > 0.0) { _frequency = in_frequency; } else { _frequency = 1.0; } } ApodizeFunction CSD::apodizeFxn() const { return _apodizeFxn; } void CSD::setApodizeFxn(ApodizeFunction in_fxn) { _apodizeFxn = in_fxn; } int CSD::length() const { return _averageLength; } void CSD::setLength(int in_length) { _averageLength = in_length; } int CSD::windowSize() const { return _windowSize; } void CSD::setWindowSize(int in_size) { _windowSize = in_size; } double CSD::gaussianSigma() const { return _gaussianSigma; } void CSD::setGaussianSigma(double in_sigma) { _gaussianSigma = in_sigma; } MatrixPtr CSD::outputMatrix() const { return _outMatrix; } const QString& CSD::vectorUnits() const { return _vectorUnits; } void CSD::setVectorUnits(const QString& units) { _vectorUnits = units; } const QString& CSD::rateUnits() const { return _rateUnits; } void CSD::setRateUnits(const QString& units) { _rateUnits = units; } DataObjectPtr CSD::makeDuplicate() const{ CSDPtr csd = store()->createObject(); csd->change(_inputVectors[CSD_INVECTOR], _frequency, _average, _removeMean, _apodize, _apodizeFxn, _windowSize, _averageLength, _gaussianSigma, _outputType, _vectorUnits, _rateUnits); if (descriptiveNameIsManual()) { csd->setDescriptiveName(descriptiveName()); } csd->writeLock(); csd->registerChange(); csd->unlock(); return DataObjectPtr(csd); } void CSD::updateMatrixLabels(void) { LabelInfo label_info; switch (_outputType) { default: case 0: // amplitude spectral density (default) [V/Hz^1/2] label_info.quantity = tr("Amplitude Spectral Density"); label_info.units = QString("%1/%2^{1/2}").arg(_vectorUnits).arg(_rateUnits); break; case 1: // power spectral density [V^2/Hz] label_info.quantity = tr("Power Spectral Density"); label_info.units = QString("%1^2/%2").arg(_vectorUnits).arg(_rateUnits); break; case 2: // amplitude spectrum [V] label_info.quantity = tr("Amplitude Spectrum"); label_info.units = QString("%1").arg(_vectorUnits); break; case 3: // power spectrum [V^2] label_info.quantity = tr("Power Spectrum"); label_info.units = QString("%1^2").arg(_vectorUnits); break; } label_info.name = _inputVectors[CSD_INVECTOR]->descriptiveName(); _outMatrix->setTitleInfo(label_info); label_info.name.clear(); label_info.units = _rateUnits; label_info.quantity = tr("Frequency"); _outMatrix->setYLabelInfo(label_info); label_info.quantity = tr("Time"); label_info.units = QString('s'); _outMatrix->setXLabelInfo(label_info); } QString CSD::_automaticDescriptiveName() const { return vector()->descriptiveName(); } QString CSD::descriptionTip() const { QString tip; tip = tr("Spectrogram: %1\n FFT Length: 2^%2").arg(Name()).arg(length()); if (average() || apodize() || removeMean()) { tip += "\n "; if (average()) tip += tr("Average; "); if (apodize()) tip += tr("Apodize; "); if (removeMean()) tip += tr("Remove Mean;"); } tip += tr("\nInput: %1").arg(_inputVectors[CSD_INVECTOR]->descriptionTip()); return tip; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/psdfactory.h0000644000175000017500000000216612277111530016642 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PSDFACTORY_H #define PSDFACTORY_H #include "objectfactory.h" namespace Kst { class PSDFactory : public ObjectFactory { public: PSDFactory(); ~PSDFactory(); DataObjectPtr generateObject(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/relation.cpp0000644000175000017500000004343512277111530016640 0ustar synthsynth/*************************************************************************** relation.cpp: base class for a curve ------------------- begin : June 2003 copyright : (C) 2003 University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * Permission is granted to link with any opensource library * * * ***************************************************************************/ #include "relation.h" #include "datacollection.h" #include "debug.h" #include "objectstore.h" #include namespace Kst { const QString Relation::staticTypeString = "Relation"; Relation::Relation(ObjectStore *store) : Object() { Q_UNUSED(store); commonConstructor(); } void Relation::commonConstructor() { _ns_maxx = _ns_minx = _ns_maxy = _ns_miny = MaxX = MinX = MinPosX = MeanX = MaxY = MinY = MinPosY = 0.0; NS = 0; _redrawRequired = true; _ignoreAutoScale = false; _contextDetails.Lx = 0.0; _contextDetails.Hx = 0.0; _contextDetails.Ly = 0.0; _contextDetails.Hy = 0.0; _contextDetails.m_X = 0.0; _contextDetails.m_Y = 0.0; _contextDetails.b_X = 0.0; _contextDetails.b_Y = 0.0; _contextDetails.XMin = 0.0; _contextDetails.XMax = 0.0; _contextDetails.xLog = false; _contextDetails.yLog = false; _contextDetails.xLogBase = 0.0; _contextDetails.yLogBase = 0.0; _contextDetails.penWidth = 0; } Relation::~Relation() { } void Relation::save(QXmlStreamWriter &s) { Q_UNUSED(s) } void Relation::deleteDependents() { Data::self()->removeCurveFromPlots(this); } void Relation::paint(const CurveRenderContext& context) { if (redrawRequired(context) || _redrawRequired) { updatePaintObjects(context); _redrawRequired = false; } paintObjects(context); } bool Relation::redrawRequired(const CurveRenderContext& context) { if ((_contextDetails.Lx == context.Lx) && (_contextDetails.Hx == context.Hx) && (_contextDetails.Ly == context.Ly) && (_contextDetails.Hy == context.Hy) && (_contextDetails.m_X == context.m_X) && (_contextDetails.m_Y == context.m_Y) && (_contextDetails.b_X == context.b_X) && (_contextDetails.b_Y == context.b_Y) && (_contextDetails.XMin == context.XMin) && (_contextDetails.XMax == context.XMax) && (_contextDetails.xLog == context.xLog) && (_contextDetails.yLog == context.yLog) && (_contextDetails.xLogBase == context.xLogBase) && (_contextDetails.yLogBase == context.yLogBase) && (_contextDetails.penWidth == context.penWidth) ) { return false; } else { _contextDetails.Lx = context.Lx; _contextDetails.Hx = context.Hx; _contextDetails.Ly = context.Ly; _contextDetails.Hy = context.Hy; _contextDetails.m_X = context.m_X; _contextDetails.m_Y = context.m_Y; _contextDetails.b_X = context.b_X; _contextDetails.b_Y = context.b_Y; _contextDetails.XMin = context.XMin; _contextDetails.XMax = context.XMax; _contextDetails.xLog = context.xLog; _contextDetails.yLog = context.yLog; _contextDetails.xLogBase = context.xLogBase; _contextDetails.yLogBase = context.yLogBase; _contextDetails.penWidth = context.penWidth; return true; } } void Relation::setIgnoreAutoScale(bool ignoreAutoScale) { _ignoreAutoScale = ignoreAutoScale; } qint64 Relation::minInputSerial() const{ qint64 minSerial = LLONG_MAX; foreach (VectorPtr P, _inputVectors) { minSerial = qMin(minSerial, P->serial()); } foreach (ScalarPtr P, _inputScalars) { minSerial = qMin(minSerial, P->serial()); } foreach (MatrixPtr P, _inputMatrices) { minSerial = qMin(minSerial, P->serial()); } foreach (StringPtr P, _inputStrings) { minSerial = qMin(minSerial, P->serial()); } return minSerial; } qint64 Relation::maxInputSerialOfLastChange() const { qint64 maxSerial = NoInputs; foreach (VectorPtr P, _inputVectors) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (ScalarPtr P, _inputScalars) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (MatrixPtr P, _inputMatrices) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (StringPtr P, _inputStrings) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } return maxSerial; } void Relation::writeLockInputsAndOutputs() const { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << endl; #endif QList inputs; QList outputs; QList sl = _inputStrings.values(); for (QList::Iterator i = sl.begin(); i != sl.end(); ++i) { inputs += (*i).data(); } sl = _outputStrings.values(); for (QList::Iterator i = sl.begin(); i != sl.end(); ++i) { outputs += (*i).data(); } QList sc = _inputScalars.values(); for (QList::Iterator i = sc.begin(); i != sc.end(); ++i) { inputs += (*i).data(); } sc = _outputScalars.values(); for (QList::Iterator i = sc.begin(); i != sc.end(); ++i) { outputs += (*i).data(); } QList vl = _inputVectors.values(); for (QList::Iterator i = vl.begin(); i != vl.end(); ++i) { inputs += (*i).data(); } vl = _outputVectors.values(); for (QList::Iterator i = vl.begin(); i != vl.end(); ++i) { outputs += (*i).data(); } QList ml = _inputMatrices.values(); for (QList::Iterator i = ml.begin(); i != ml.end(); ++i) { inputs += (*i).data(); } ml = _outputMatrices.values(); for (QList::Iterator i = ml.begin(); i != ml.end(); ++i) { outputs += (*i).data(); } qSort(inputs); qSort(outputs); QList::ConstIterator inputIt = inputs.constBegin(); QList::ConstIterator outputIt = outputs.constBegin(); while (inputIt != inputs.constEnd() || outputIt != outputs.constEnd()) { if (inputIt != inputs.constEnd() && (outputIt == outputs.constEnd() || (void*)(*inputIt) < (void*)(*outputIt))) { // do input if (!(*inputIt)) { qWarning() << "Input for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") KstDataObject::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": write locking input \"" << (*inputIt)->Name() << "\" (" << (void*)((KstRWLock*)*inputIt) << ")" << endl; #endif (*inputIt)->writeLock(); ++inputIt; } else { // do output if (!(*outputIt)) { qWarning() << "Output for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") KstDataObject::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": write locking output \"" << (*outputIt)->Name() << "\" (" << (void*)((KstRWLock*)*outputIt) << ")" << endl; #endif if ((*outputIt)->provider() != this) { } (*outputIt)->writeLock(); ++outputIt; } } } void Relation::unlockInputsAndOutputs() const { #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << endl; #endif for (MatrixMap::ConstIterator i = _outputMatrices.constBegin(); i != _outputMatrices.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output matrix for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output matrix \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (MatrixMap::ConstIterator i = _inputMatrices.constBegin(); i != _inputMatrices.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input matrix for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input matrix \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (VectorMap::ConstIterator i = _outputVectors.constBegin(); i != _outputVectors.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output vector for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output vector \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (VectorMap::ConstIterator i = _inputVectors.constBegin(); i != _inputVectors.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input vector for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input vector \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (ScalarMap::ConstIterator i = _outputScalars.constBegin(); i != _outputScalars.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output scalar for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output scalar \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (ScalarMap::ConstIterator i = _inputScalars.constBegin(); i != _inputScalars.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input scalar for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input scalar \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (StringMap::ConstIterator i = _outputStrings.constBegin(); i != _outputStrings.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output string for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output string \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (StringMap::ConstIterator i = _inputStrings.constBegin(); i != _inputStrings.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input string for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << this->Name() << ") Relation::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input string \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } } bool Relation::uses(ObjectPtr p) const { VectorPtr v = kst_cast(p); if (v) { for (VectorMap::ConstIterator j = _inputVectors.constBegin(); j != _inputVectors.constEnd(); ++j) { if (j.value() == v) { return true; } } QHashIterator scalarDictIter(v->scalars()); for (ScalarMap::ConstIterator j = _inputScalars.constBegin(); j != _inputScalars.constEnd(); ++j) { while (scalarDictIter.hasNext()) { scalarDictIter.next(); if (scalarDictIter.value() == j.value()) { return true; } } } QHashIterator stringDictIter(v->strings()); for (StringMap::ConstIterator j = _inputStrings.constBegin(); j != _inputStrings.constEnd(); ++j) { while (stringDictIter.hasNext()) { stringDictIter.next(); if (stringDictIter.value() == j.value()) { return true; } } } } else if (MatrixPtr matrix = kst_cast(p)) { for (MatrixMap::ConstIterator j = _inputMatrices.constBegin(); j != _inputMatrices.constEnd(); ++j) { if (j.value() == matrix) { return true; } } QHashIterator scalarDictIter(matrix->scalars()); for (ScalarMap::ConstIterator j = _inputScalars.constBegin(); j != _inputScalars.constEnd(); ++j) { while (scalarDictIter.hasNext()) { scalarDictIter.next(); if (scalarDictIter.value() == j.value()) { return true; } } } } else if (DataObjectPtr obj = kst_cast(p) ) { // check all connections from this object to p for (VectorMap::Iterator j = obj->outputVectors().begin(); j != obj->outputVectors().end(); ++j) { for (VectorMap::ConstIterator k = _inputVectors.constBegin(); k != _inputVectors.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } // also check dependencies on vector stats QHashIterator scalarDictIter(j.value()->scalars()); for (ScalarMap::ConstIterator k = _inputScalars.constBegin(); k != _inputScalars.constEnd(); ++k) { while (scalarDictIter.hasNext()) { scalarDictIter.next(); if (scalarDictIter.value() == k.value()) { return true; } } } // also check dependencies on vector strings QHashIterator stringDictIter(j.value()->strings()); for (StringMap::ConstIterator k = _inputStrings.constBegin(); k != _inputStrings.constEnd(); ++k) { while (stringDictIter.hasNext()) { stringDictIter.next(); if (stringDictIter.value() == k.value()) { return true; } } } } for (MatrixMap::Iterator j = obj->outputMatrices().begin(); j != obj->outputMatrices().end(); ++j) { for (MatrixMap::ConstIterator k = _inputMatrices.constBegin(); k != _inputMatrices.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } // also check dependencies on vector stats QHashIterator scalarDictIter(j.value()->scalars()); for (ScalarMap::ConstIterator k = _inputScalars.constBegin(); k != _inputScalars.constEnd(); ++k) { while (scalarDictIter.hasNext()) { scalarDictIter.next(); if (scalarDictIter.value() == k.value()) { return true; } } } } for (ScalarMap::Iterator j = obj->outputScalars().begin(); j != obj->outputScalars().end(); ++j) { for (ScalarMap::ConstIterator k = _inputScalars.constBegin(); k != _inputScalars.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } } for (StringMap::Iterator j = obj->outputStrings().begin(); j != obj->outputStrings().end(); ++j) { for (StringMap::ConstIterator k = _inputStrings.constBegin(); k != _inputStrings.constEnd(); ++k) { if (j.value() == k.value()) { return true; } } } } return false; } PrimitiveList Relation::inputPrimitives() const { PrimitiveList primitive_list; int n = _inputMatrices.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputMatrices.values().at(i))); } n = _inputStrings.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputStrings.values().at(i))); } n = _inputScalars.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputScalars.values().at(i))); } n = _inputVectors.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputVectors.values().at(i))); } return primitive_list; } void Relation::replaceInput(PrimitivePtr p, PrimitivePtr new_p) { if (VectorPtr v = kst_cast(p) ) { if (VectorPtr new_v = kst_cast(new_p)) { for (VectorMap::Iterator j = _inputVectors.begin(); j != _inputVectors.end(); ++j) { if (j.value() == v) { _inputVectors[j.key()] = new_v; } } } } else if (MatrixPtr m = kst_cast(p) ) { if (MatrixPtr new_m = kst_cast(new_p)) { for (MatrixMap::Iterator j = _inputMatrices.begin(); j != _inputMatrices.end(); ++j) { if (j.value() == m) { _inputMatrices[j.key()] = new_m; } } } } else if (StringPtr s = kst_cast(p) ) { if (StringPtr new_s = kst_cast(new_p)) { for (StringMap::Iterator j = _inputStrings.begin(); j != _inputStrings.end(); ++j) { if (j.value() == s) { _inputStrings[j.key()] = new_s; } } } } else if (ScalarPtr s = kst_cast(p) ) { if (ScalarPtr new_s = kst_cast(new_p)) { for (ScalarMap::Iterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) { if (j.value() == s) { _inputScalars[j.key()] = new_s; } } } } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/kstmath_export.h0000644000175000017500000000222112277111530017530 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_MATH_EXPORT_H #define KST_MATH_EXPORT_H #include #if (defined(Q_OS_WIN32) || defined(Q_OS_WIN64)) # if defined(BUILD_KSTMATH) # define KSTMATH_EXPORT Q_DECL_EXPORT # else # define KSTMATH_EXPORT Q_DECL_IMPORT # endif #else # define KSTMATH_EXPORT #endif #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/basicplugin.cpp0000644000175000017500000002423712362701575017333 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "basicplugin.h" #include #include #ifndef Q_OS_WIN32 #include #endif #include "debug.h" #include "dialoglauncher.h" #include "datacollection.h" #include "objectstore.h" #include "dataobjectplugin.h" #include "dataobjectscriptinterface.h" namespace Kst { const QString BasicPlugin::staticTypeString = "Plugin"; const QString BasicPlugin::staticTypeTag = "plugin"; BasicPlugin::BasicPlugin(ObjectStore *store) : DataObject(store) { _typeString = "Plugin"; _type = "Plugin"; _initializeShortName(); } BasicPlugin::~BasicPlugin() { } void BasicPlugin::_initializeShortName() { _shortName = 'P'+QString::number(_pnum); if (_pnum>max_pnum) max_pnum = _pnum; _pnum++; } ScriptInterface* BasicPlugin::createScriptInterface() { return new PluginSI(this); } void BasicPlugin::setPluginName(const QString &pluginName) { _pluginName = pluginName; } DataObjectPtr BasicPlugin::makeDuplicate() const { #if 0 BasicPluginPtr plugin = kst_cast(DataObject::createPlugin(propertyString())); // use same inputs for (VectorMap::ConstIterator iter = _inputVectors.begin(); iter != _inputVectors.end(); ++iter) { plugin->inputVectors().insert(iter.key(), iter.value()); } for (ScalarMap::ConstIterator iter = _inputScalars.begin(); iter != _inputScalars.end(); ++iter) { plugin->inputScalars().insert(iter.key(), iter.value()); } for (StringMap::ConstIterator iter = _inputStrings.begin(); iter != _inputStrings.end(); ++iter) { plugin->inputStrings().insert(iter.key(), iter.value()); } // create new outputs for (VectorMap::ConstIterator iter = outputVectors().begin(); iter != outputVectors().end(); ++iter) { KstWriteLocker blockVectorUpdates(&vectorList.lock()); VectorPtr v = new Vector(ObjectTag(iter.value()->tag().tag() + "'", iter.value()->tag().context()), 0, plugin.data()); // FIXME: unique tag generation plugin->outputVectors().insert(iter.key(), v); } for (ScalarMap::ConstIterator iter = outputScalars().begin(); iter != outputScalars().end(); ++iter) { ScalarPtr s = new Scalar(ObjectTag(iter.value()->tag().tag() + "'", iter.value()->tag().context()), plugin.data()); // FIXME: unique tag generation plugin->outputScalars().insert(iter.key(), s); } for (StringMap::ConstIterator iter = outputStrings().begin(); iter != outputStrings().end(); ++iter) { StringPtr s = new String(ObjectTag(iter.value()->tag().tag() + "'", iter.value()->tag().context()), plugin.data()); // FIXME: unique tag generation plugin->outputStrings().insert(iter.key(), s); } // set the same plugin plugin->setTagName(ObjectTag(tag().tag() + "'", tag().context())); // FIXME: unique tag generation method map.insert(this, DataObjectPtr(plugin)); return DataObjectPtr(plugin); #endif // FIXME: implement this return 0L; } void BasicPlugin::showNewDialog() { DialogLauncher::self()->showBasicPluginDialog(_pluginName); } void BasicPlugin::showEditDialog() { DialogLauncher::self()->showBasicPluginDialog(_pluginName, this); } VectorPtr BasicPlugin::inputVector(const QString& vector) const { VectorMap::ConstIterator i = _inputVectors.constFind(vector); if (i != _inputVectors.constEnd()) return *i; else return 0; } ScalarPtr BasicPlugin::inputScalar(const QString& scalar) const { ScalarMap::ConstIterator i = _inputScalars.constFind(scalar); if (i != _inputScalars.constEnd()) return *i; else return 0; } StringPtr BasicPlugin::inputString(const QString& string) const { StringMap::ConstIterator i = _inputStrings.constFind(string); if (i != _inputStrings.constEnd()) return *i; else return 0; } void BasicPlugin::setOutputVector(const QString &type, const QString &name) { QString txt = !name.isEmpty() ? name : type; Q_ASSERT(store()); VectorPtr v = store()->createObject(); v->setProvider(this); v->setSlaveName(txt); _outputVectors.insert(type, v); } void BasicPlugin::setOutputScalar(const QString &type, const QString &name) { QString txt = !name.isEmpty() ? name : type; Q_ASSERT(store()); ScalarPtr s = store()->createObject(); s->setProvider(this); s->setSlaveName(txt); _outputScalars.insert(type, s); } void BasicPlugin::setOutputString(const QString &type, const QString &name) { QString txt = !name.isEmpty() ? name : type; Q_ASSERT(store()); StringPtr s = store()->createObject(); s->setProvider(this); s->setSlaveName(txt); s->setOrphan(false); _outputStrings.insert(type, s); } void BasicPlugin::internalUpdate() { //Make sure we have all the necessary inputs if (!inputsExist()) return; writeLockInputsAndOutputs(); //Call the plugins algorithm to operate on the inputs //and produce the outputs if ( !algorithm() ) { Debug::self()->log(tr("There is an error in the %1 algorithm.").arg(propertyString()), Debug::Error); unlockInputsAndOutputs(); return; } //Perform update on the outputs updateOutput(); createScalars(); unlockInputsAndOutputs(); return; } // If a plugin provides a Parameters Vector, then scalars will be created, as well as a label. void BasicPlugin::createScalars() { // Assumes that this is called with a write lock in place on this object Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (hasParameterVector()) { VectorPtr vectorParam = _outputVectors["Parameters Vector"]; if (vectorParam) { QString paramName; int i = 0; int length = vectorParam->length(); Q_ASSERT(store()); for (paramName = parameterName(i); !paramName.isEmpty() && i < length; paramName = parameterName(++i)) { double scalarValue = vectorParam->value(i); if (!_outputScalars.contains(paramName)) { ScalarPtr s = store()->createObject(); s->setProvider(this); s->setSlaveName(paramName); s->setValue(scalarValue); s->writeLock(); _outputScalars.insert(paramName, s); } else { _outputScalars[paramName]->setValue(scalarValue); } } } } } QString BasicPlugin::parameterName(int /*index*/) const { return QString(); } QString BasicPlugin::label(int precision) const { Q_UNUSED(precision) QString label; QString paramName; VectorPtr yVector = outputVectors().value(outputVectorList().first()); label = yVector->labelInfo().name; if (hasParameterVector()) { VectorPtr vectorParam = _outputVectors["Parameters Vector"]; int length = vectorParam->length(); int i=0; for (paramName = parameterName(i); !paramName.isEmpty() && i < length; paramName = parameterName(++i)) { if (_outputScalars.contains(paramName)) { label += QString("\n%1: [%2]").arg(paramName).arg(_outputScalars[paramName]->Name()); } } } return label; } template static void writeVectors(T& vectors, const QString& element, QXmlStreamWriter& stream, QString (V::* name)() const) { for (QStringList::iterator it = vectors.ordered.begin(); it != vectors.ordered.end(); ++it) { typename T::iterator i = vectors.find(*it); stream.writeStartElement(element); stream.writeAttribute("type", i.key()); stream.writeAttribute("tag", (i.value()->*name)()); stream.writeEndElement(); } } void BasicPlugin::save(QXmlStreamWriter &stream) { stream.writeStartElement(staticTypeTag); stream.writeAttribute("type", _pluginName); saveNameInfo(stream, VNUM|PNUM|XNUM); writeVectors(_inputVectors, "inputvector", stream, &NamedObject::Name); writeVectors(_inputScalars, "inputscalar", stream, &NamedObject::Name); writeVectors(_inputStrings, "inputstring", stream, &NamedObject::Name); writeVectors(_outputVectors, "outputvector", stream, &Primitive::slaveName); writeVectors(_outputScalars, "outputscalar", stream, &Primitive::slaveName); writeVectors(_outputStrings, "outputstring", stream, &Primitive::slaveName); stream.writeEndElement(); } void BasicPlugin::saveProperties(QXmlStreamWriter &s) { Q_UNUSED(s); } //TODO Could use some templates perhaps... bool BasicPlugin::inputsExist() const { //First, check the inputVectors... QStringList iv = inputVectorList(); QStringList::ConstIterator ivI = iv.constBegin(); for (; ivI != iv.constEnd(); ++ivI) { if (!inputVector(*ivI)) return false; } //Now, check the inputScalars... QStringList is = inputScalarList(); QStringList::ConstIterator isI = is.constBegin(); for (; isI != is.constEnd(); ++isI) { if (!inputScalar(*isI)) return false; } //Finally, check the inputStrings... QStringList istr = inputStringList(); QStringList::ConstIterator istrI = istr.constBegin(); for (; istrI != istr.constEnd(); ++istrI) { if (!inputString(*istrI)) return false; } return true; } void BasicPlugin::updateOutput() const { //output vectors... //FIXME: _outputVectors should be used, not this string list! QStringList ov = outputVectorList(); QStringList::ConstIterator ovI = ov.constBegin(); for (; ovI != ov.constEnd(); ++ovI) { if (VectorPtr o = outputVector(*ovI)) { Q_ASSERT(o->myLockStatus() == KstRWLock::WRITELOCKED); vectorRealloced(o, o->value(), o->length()); // why here? o->setNewAndShift(o->length(), o->numShift()); // why here? } } } QString BasicPlugin::descriptionTip() const { return tr("Plugin: %1").arg(Name()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/palette.h0000644000175000017500000000473212277111530016123 0ustar synthsynth/******************************************************************************* * * * copyright : (C) 2010 C. Barth Netterfield * * * * This program is free software; you can 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. * * * *******************************************************************************/ #ifndef PALETTE_H #define PALETTE_H #include #include #include "kstmath_export.h" namespace Kst { typedef QHash PaletteData; const unsigned int maxColorTableSize = 2048; const QString DefaultPalette("Kst Grayscale"); class KSTMATH_EXPORT Palette { public: /** * @returns string list of avalible palettes */ static QStringList getPaletteList(); Palette(); explicit Palette(const QString &paletteName); virtual ~Palette(); void changePaletteName(const QString &paletteName); QString paletteName() const {return _paletteName;} int colorCount() const {return _count;} /** * Returns the color corresponding to colorId. * It truncates to max or min _color if colorId is out * of bounds, so bounds checking is not necessary in the * calling function. * @returns the QColor */ QColor color(const int colorId) const{ if (colorId<0) { return _colors[0]; } else if (colorId>=_count) { return _colors[_count-1]; } else { return _colors[colorId]; } } /** * Returns the rgb value for the color corresponding to colorId. * It truncates to max or min _rgb if colorId is out * of bounds, so bounds checking is not necessary in the * calling function. * @returns the QColor.rgb(). */ QRgb rgb(const int colorId) const{ if (colorId<0) { return _rgb[0]; } else if (colorId>=_count) { return _rgb[_count-1]; } else { return _rgb[colorId]; } } private: QColor *_colors; QRgb *_rgb; QString _paletteName; int _count; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/plotdefines.h0000644000175000017500000000641412277111530017000 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 by University of British Columbia * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PLOTDEFINES_H #define PLOTDEFINES_H #define MARKER_LABEL_PRECISION 15 enum AxisInterpretationType { AXIS_INTERP_YEAR, AXIS_INTERP_CTIME, AXIS_INTERP_JD, AXIS_INTERP_MJD, AXIS_INTERP_RJD, AXIS_INTERP_AIT, AXIS_INTERP_EXCEL}; enum AxisDisplayType { AXIS_DISPLAY_YEAR, AXIS_DISPLAY_YYMMDDHHMMSS_SS, AXIS_DISPLAY_DDMMYYHHMMSS_SS, AXIS_DISPLAY_QTTEXTDATEHHMMSS_SS, AXIS_DISPLAY_QTLOCALDATEHHMMSS_SS, AXIS_DISPLAY_JD, AXIS_DISPLAY_MJD, AXIS_DISPLAY_RJD, AXIS_DISPLAY_QTDATETIME_FORMAT}; struct AxisInterpretation { const char *label; AxisInterpretationType type; }; struct AxisDisplay { const char *label; AxisDisplayType type; }; //QT_TRANSLATE_NOOP3 ( context, sourceText, comment ) const AxisInterpretation AxisInterpretations[] = { { QT_TRANSLATE_NOOP("AxisTab", "Julian Year"), AXIS_INTERP_YEAR }, { QT_TRANSLATE_NOOP("AxisTab", "Standard C time"), AXIS_INTERP_CTIME }, { QT_TRANSLATE_NOOP("AxisTab", "Julian Date"), AXIS_INTERP_JD }, { QT_TRANSLATE_NOOP("AxisTab", "Modified Julian Date"), AXIS_INTERP_MJD }, { QT_TRANSLATE_NOOP("AxisTab", "Reduced Julian Date"), AXIS_INTERP_RJD }, { QT_TRANSLATE_NOOP("AxisTab", "International Atomic Time (TAI)"), AXIS_INTERP_AIT }, { QT_TRANSLATE_NOOP("AxisTab", "Excel time (Windows)"), AXIS_INTERP_EXCEL } }; const AxisDisplay AxisDisplays[] = { { QT_TRANSLATE_NOOP("AxisTab", "Julian Year"), AXIS_DISPLAY_YEAR }, { QT_TRANSLATE_NOOP("AxisTab", "YYYY/MM/DD HH:MM:SS.SS"), AXIS_DISPLAY_YYMMDDHHMMSS_SS }, { QT_TRANSLATE_NOOP("AxisTab", "DD/MM/YYYY HH:MM:SS.SS"), AXIS_DISPLAY_DDMMYYHHMMSS_SS }, { QT_TRANSLATE_NOOP("AxisTab", " HH:MM:SS.SS"), AXIS_DISPLAY_QTTEXTDATEHHMMSS_SS }, { QT_TRANSLATE_NOOP("AxisTab", " HH:MM:SS.SS"), AXIS_DISPLAY_QTLOCALDATEHHMMSS_SS }, { QT_TRANSLATE_NOOP("AxisTab", "Julian Date"), AXIS_DISPLAY_JD }, { QT_TRANSLATE_NOOP("AxisTab", "Modified Julian Date"), AXIS_DISPLAY_MJD }, { QT_TRANSLATE_NOOP("AxisTab", "Reduced Julian Date"), AXIS_DISPLAY_RJD }, { QT_TRANSLATE_NOOP("AxisTab", "Formatted String"), AXIS_DISPLAY_QTDATETIME_FORMAT } }; const unsigned int numAxisInterpretations = sizeof( AxisInterpretations ) / sizeof( AxisInterpretation ); const unsigned int numAxisDisplays = sizeof( AxisDisplays ) / sizeof( AxisDisplay ); #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/image.cpp0000644000175000017500000005741012362701575016114 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 by University of British Columbia * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "image.h" #include "dialoglauncher.h" #include "datacollection.h" #include "debug.h" #include "math_kst.h" #include "objectstore.h" #include "plottickcalculator.h" #include "relationscriptinterface.h" #include #include #include #include //#define BENCHMARK namespace Kst { const QString Image::staticTypeString = "Image"; const QString Image::staticTypeTag = "image"; static const QLatin1String& THEMATRIX = QLatin1String("THEMATRIX"); Image::Image(ObjectStore *store) : Relation(store) { _typeString = staticTypeString; _type = "Image"; _initializeShortName(); _hasContourMap = false; _hasColorMap = true; setColorDefaults(); setContourDefaults(); } Image::~Image() { } void Image::_initializeShortName() { _shortName = 'I'+QString::number(_inum); if (_inum>max_inum) max_inum = _inum; _inum++; } ScriptInterface* Image::createScriptInterface() { return new ImageSI(this); } void Image::save(QXmlStreamWriter &s) { s.writeStartElement(staticTypeTag); if (_inputMatrices.contains(THEMATRIX)) { s.writeAttribute("matrix", _inputMatrices[THEMATRIX]->Name()); } if (_pal.colorCount()>0) { s.writeAttribute("palettename", _pal.paletteName()); } s.writeAttribute("hascolormap", QVariant(_hasColorMap).toString()); s.writeAttribute("lowerthreshold", QString::number(_zLower)); s.writeAttribute("upperthreshold", QString::number(_zUpper)); s.writeAttribute("hascontourmap", QVariant(_hasContourMap).toString()); s.writeAttribute("numcontourlines", QString::number(_numContourLines)); s.writeAttribute("contourweight", QString::number(_contourWeight)); s.writeAttribute("contourcolor", _contourColor.name()); s.writeAttribute("autothreshold", QVariant(_autoThreshold).toString()); saveNameInfo(s, INUM); s.writeEndElement(); } void Image::internalUpdate() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); writeLockInputsAndOutputs(); if (_inputMatrices.contains(THEMATRIX)) { MatrixPtr mp = _inputMatrices[THEMATRIX]; // stats NS = mp->sampleCount(); MinX = mp->minX(); int xNumSteps = mp->xNumSteps(); double xStepSize = mp->xStepSize(); MaxX = xNumSteps*xStepSize + MinX; MinY = mp->minY(); int yNumSteps = mp->yNumSteps(); double yStepSize = mp->yStepSize(); MaxY = yNumSteps*yStepSize + MinY; _ns_maxx = MaxX; _ns_minx = MinX; _ns_maxy = MaxY; _ns_miny = MinY; MinPosY = MinY > 0 ? MinY : yStepSize*0.5; MinPosX = MinX > 0 ? MinX : xStepSize*0.5; //recalculate the thresholds if necessary if (_autoThreshold) { _zLower = mp->minValue(); _zUpper = mp->maxValue(); } //update the contour lines if (hasContourMap()) { double min = mp->minValue(), max = mp->maxValue(); double contourStep = (max - min) / (double)(_numContourLines + 1); if (contourStep > 0) { _contourLines.clear(); for (int i = 0; i < _numContourLines; i++) { _contourLines.append(min + (i+1) * contourStep); } } } _redrawRequired = true; } unlockInputsAndOutputs(); return; } QString Image::propertyString() const { if (_inputMatrices.contains(THEMATRIX)) { return tr("Image of %1" ).arg(_inputMatrices[THEMATRIX]->Name()); } else { return QString(); } } //FIXME: Inline and optimize! QColor Image::getMappedColor(double z) { int index; if (_zUpper - _zLower != 0) { index = (int)(((z - _zLower) * (_pal.colorCount() - 1)) / (_zUpper - _zLower)); } else { index = 0; } return _pal.color(index); } void Image::setPalette(const QString &palname) { _pal.changePaletteName(palname); } void Image::showNewDialog() { DialogLauncher::self()->showImageDialog(); } void Image::showEditDialog() { DialogLauncher::self()->showImageDialog(this); } void Image::setUpperThreshold(double z) { _zUpper = z; } void Image::setLowerThreshold(double z) { _zLower = z; } void Image::setThresholdToSpikeInsensitive(double per) { if (per==0) { setAutoThreshold(true); } else { matrix()->writeLock(); matrix()->calcNoSpikeRange(per); matrix()->unlock(); setLowerThreshold(matrix()->minValueNoSpike()); setUpperThreshold(matrix()->maxValueNoSpike()); setAutoThreshold(false); } } void Image::setMatrix(MatrixPtr in_matrix) { if (in_matrix) { _inputMatrices[THEMATRIX] = in_matrix; } } void Image::changeToColorOnly(MatrixPtr in_matrix, double lowerZ, double upperZ, bool autoThreshold, const QString &paletteName) { _inputMatrices[THEMATRIX] = in_matrix; _zLower = lowerZ; _zUpper = upperZ; _autoThreshold = autoThreshold; if (_pal.paletteName() != paletteName) { _pal.changePaletteName(paletteName); } _hasColorMap = true; _hasContourMap = false; } void Image::changeToContourOnly(MatrixPtr in_matrix, int numContours, const QColor& contourColor, int contourWeight) { _inputMatrices[THEMATRIX] = in_matrix; _numContourLines = numContours; _contourWeight = contourWeight; _contourColor = contourColor; _hasColorMap = false; _hasContourMap = true; } void Image::changeToColorAndContour(MatrixPtr in_matrix, double lowerZ, double upperZ, bool autoThreshold, const QString &paletteName, int numContours, const QColor& contourColor, int contourWeight) { _inputMatrices[THEMATRIX] = in_matrix; _zLower = lowerZ; _zUpper = upperZ; _autoThreshold = autoThreshold; if (_pal.paletteName() != paletteName) { _pal.changePaletteName(paletteName); } _numContourLines = numContours; _contourWeight = contourWeight; _contourColor = contourColor; _hasColorMap = true; _hasContourMap = true; } void Image::matrixDimensions(double &x, double &y, double &width, double &height) { if (_inputMatrices.contains(THEMATRIX)) { MatrixPtr mp = _inputMatrices[THEMATRIX]; if (_inputMatrices.contains(THEMATRIX)) { x = mp->minX(); y = mp->minY(); width = mp->xNumSteps() * mp->xStepSize(); height = mp->yNumSteps() * mp->yStepSize(); } else { x = y = width = height = 0; } } else { x = y = width = height = 0; } } //this should check for duplicates bool Image::addContourLine(double line) { _contourLines.append(line); return true; } bool Image::removeContourLine(double line) { return _contourLines.removeAll(line); } void Image::clearContourLines() { _contourLines.clear(); } bool Image::getNearestZ(double x, double y, double& z, QPointF &matchedPoint) { bool ok; z = _inputMatrices[THEMATRIX]->value(x, y, matchedPoint, &ok); return ok; } QString Image::paletteName() const { return _pal.paletteName(); } void Image::setColorDefaults() { _zLower = 0; _zUpper = 100; } void Image::setContourDefaults() { _contourColor = QColor("red"); _numContourLines = 1; _contourWeight = 0; } void Image::setAutoThreshold(bool yes) { _autoThreshold = yes; } RelationPtr Image::makeDuplicate() const { ImagePtr image = store()->createObject(); if (!_hasContourMap) { image->changeToColorOnly(_inputMatrices[THEMATRIX], _zLower, _zUpper, _autoThreshold, _pal.paletteName()); } else if (!_hasColorMap) { image->changeToContourOnly(_inputMatrices[THEMATRIX], _numContourLines, _contourColor, _contourWeight); } else { image->changeToColorAndContour(_inputMatrices[THEMATRIX], _zLower, _zUpper, _autoThreshold, _pal.paletteName(), _numContourLines, _contourColor, _contourWeight); } if (descriptiveNameIsManual()) { image->setDescriptiveName(descriptiveName()); } image->writeLock(); image->registerChange(); image->unlock(); return RelationPtr(image); } MatrixPtr Image::matrix() const { if (_inputMatrices.contains(THEMATRIX)) { return _inputMatrices[THEMATRIX]; } else { return NULL; } } bool Image::invertXHint() const { if (_inputMatrices.contains(THEMATRIX)) { return _inputMatrices[THEMATRIX]->invertXHint(); } else { return false; } } bool Image::invertYHint() const { if (_inputMatrices.contains(THEMATRIX)) { return _inputMatrices[THEMATRIX]->invertYHint(); } else { return false; } } LabelInfo Image::xLabelInfo() const { if (_inputMatrices.contains(THEMATRIX)) { return (_inputMatrices[THEMATRIX]->xLabelInfo()); } else { return LabelInfo(); } } LabelInfo Image::yLabelInfo() const { if (_inputMatrices.contains(THEMATRIX)) { return (_inputMatrices[THEMATRIX]->yLabelInfo()); } else { return LabelInfo(); } } LabelInfo Image::titleInfo() const { if (_inputMatrices.contains(THEMATRIX)) { return (_inputMatrices[THEMATRIX]->titleInfo()); } else { return LabelInfo(); } } double Image::distanceToPoint(double xpos, double dx, double ypos) const { Q_UNUSED(dx) // dx is not relevant for double clicks on images - clicks must be inside the image if (xpos <= MaxX && xpos >= MinX && ypos <= MaxY && ypos >= MinY) { return 0; } return 1.0E300; } void Image::paintObjects(const CurveRenderContext& context) { QPainter* p = context.painter; if (hasColorMap()) { p->drawImage(_imageLocation, _image); } if (hasContourMap()) { QColor lineColor = contourColor(); foreach(const CoutourLineDetails& lineDetails, _lines) { p->setPen(QPen(lineColor, lineDetails._lineWidth, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); p->drawLine(lineDetails._line); } } } void Image::updatePaintObjects(const CurveRenderContext& context) { double Lx = context.Lx, Hx = context.Hx, Ly = context.Ly, Hy = context.Hy; double m_X = context.m_X, m_Y = context.m_Y, b_X = context.b_X, b_Y = context.b_Y; double x_max = context.x_max, y_max = context.y_max, x_min = context.x_min, y_min = context.y_min; bool xLog = context.xLog, yLog = context.yLog; double xLogBase = context.xLogBase; double yLogBase = context.yLogBase; double x, y, width, height; double img_Lx_pix = 0, img_Ly_pix = 0, img_Hx_pix = 0, img_Hy_pix = 0; #ifdef BENCHMARK QTime bench_time, benchtmp; int b_1 = 0, b_2 = 0; bench_time.start(); benchtmp.start(); int numberOfLinesDrawn = 0; #endif ImagePtr image = this; _image = QImage(); _lines.clear(); if (_inputMatrices.contains(THEMATRIX)) { // don't paint if we have no matrix image->matrixDimensions(x, y, width, height); // figure out where the image will be on the plot if (xLog) { x_min = pow(xLogBase, x_min); x_max = pow(xLogBase, x_max); } if (yLog) { y_min = pow(yLogBase, y_min); y_max = pow(yLogBase, y_max); } // only draw if img is visible if (!(x > x_max || y > y_max || x + width < x_min || y + height < y_min)) { if (x < x_min) { img_Lx_pix = Lx; } else { if (xLog) { img_Lx_pix = logXLo(x, xLogBase) * m_X + b_X; } else { img_Lx_pix = x * m_X + b_X; } } if (y < y_min) { img_Hy_pix = Hy; } else { if (yLog) { img_Hy_pix = logYLo(y, yLogBase) * m_Y + b_Y; } else { img_Hy_pix = y * m_Y + b_Y; } } if (x + width > x_max) { img_Hx_pix = Hx; } else { if (xLog) { img_Hx_pix = logXLo(x + width, xLogBase) * m_X + b_X; } else { img_Hx_pix = (x + width) * m_X + b_X; } } if (y + height > y_max) { img_Ly_pix = Ly; } else { if (yLog) { img_Ly_pix = logYLo(y + height, yLogBase) * m_Y + b_Y; } else { img_Ly_pix = (y + height) * m_Y + b_Y; } } // color map QColor thisPixel; MatrixPtr m = _inputMatrices.value(THEMATRIX); if (image->hasColorMap()) { int hXlXDiff = d2i(img_Hx_pix - img_Lx_pix); int hYlYDiff = d2i(img_Hy_pix - img_Ly_pix - 1); _image = QImage(hXlXDiff, hYlYDiff, QImage::Format_RGB32); //_image.fill(0); int ih = _image.height(); int iw = _image.width(); double m_minX = m->minX(); double m_minY = m->minY(); double m_numY = m->yNumSteps(); double m_stepYr = 1.0/m->yStepSize(); double m_stepXr = 1.0/m->xStepSize(); int x_index; int y_index; int palCountMinus1 = _pal.colorCount() - 1; double palCountMin1_OverDZ = double(palCountMinus1) / (_zUpper - _zLower); for (int y = 0; y < ih; ++y) { bool okY = true; QRgb *scanLine = (QRgb *)_image.scanLine(y); double new_y; if (yLog) { new_y = pow(yLogBase, (y + 1 + img_Ly_pix - b_Y) / m_Y); } else { new_y = (y + 1 + img_Ly_pix - b_Y) / m_Y; } y_index = (int)((new_y - m_minY)*m_stepYr); if (y_index<0 || y_index>=m_numY) { okY = false; } double A = img_Lx_pix - b_X; double B = 1.0/m_X; for (int x = 0; x < iw; ++x) { bool okZ = true; double new_x; if (xLog) { new_x = pow(xLogBase, (x + img_Lx_pix - b_X) / m_X); } else { new_x = (x + A)*B; } x_index = (int)((new_x - m_minX)*m_stepXr); double z = m->Z(x_index * m_numY + y_index); okZ = (isfinite(z)); if (okZ && okY) { scanLine[x] = _pal.rgb((int)(((z - _zLower) * palCountMin1_OverDZ))); } else { scanLine[x] = Qt::transparent; } } } _imageLocation = QPoint(d2i(img_Lx_pix), d2i(img_Ly_pix + 1)); } #ifdef BENCHMARK b_1 = benchtmp.elapsed(); #endif //******************************************************************* // CONTOURS //******************************************************************* #ifndef CONTOUR_STEP #define CONTOUR_STEP 5 #endif //draw the contourmap if (image->hasContourMap()) { //QColor tempColor = image->contourColor(); bool variableWeight = image->contourWeight() < 0; int lineWeight=1; if (!variableWeight) { // + 1 because 0 and 1 are the same width lineWeight = image->contourWeight() + 1; } // do the drawing for each contour line QList lines = image->contourLines(); QPoint lastPoint; // used to remember the previous point bool hasPrevBottom = false; MatrixPtr mp = _inputMatrices[THEMATRIX]; for (int k = 0; k < lines.count(); ++k) { double lineK = lines[k]; if (variableWeight) { // + 1 because 0 and 1 are the same width lineWeight = k + 1; } int flImgHx = d2i(floor(img_Hx_pix)); int flImgHy = d2i(floor(img_Hy_pix)); int ceImgLy = d2i(ceil(img_Ly_pix)); for (int i = d2i(ceil(img_Lx_pix)); i + CONTOUR_STEP < flImgHx; i += CONTOUR_STEP) { for (int j = d2i(ceil(img_Ly_pix)); j + CONTOUR_STEP < flImgHy; j += CONTOUR_STEP) { // look at this group of 4 pixels and get the z values double zTL, zTR, zBL, zBR; double new_x_small = (i - b_X) / m_X, new_y_small = (j + 1 - b_Y) / m_Y; double new_x_large = (i + CONTOUR_STEP - b_X) / m_X, new_y_large = (j+1+CONTOUR_STEP - b_Y) / m_Y; if (xLog) { new_x_small = pow(xLogBase, new_x_small); new_x_large = pow(xLogBase, new_x_large); } if (yLog) { new_y_small = pow(yLogBase, new_y_small); new_y_large = pow(yLogBase, new_y_large); } zTL = mp->value(new_x_small, new_y_small, 0L); zTR = mp->value(new_x_large, new_y_small, 0L); zBL = mp->value(new_x_small, new_y_large, 0L); zBR = mp->value(new_x_large, new_y_large, 0L); // determine the lines to draw int numPoints = 0; bool passTop = false, passBottom = false, passLeft = false, passRight = false; QPoint topPoint, bottomPoint, leftPoint, rightPoint; // passes through the top if (hasPrevBottom) { topPoint = lastPoint; ++numPoints; passTop = true; } else if (j == ceImgLy && ((lineK < zTR && lineK > zTL) || (lineK < zTL && lineK > zTR))) { ++numPoints; passTop = true; topPoint.setX(int(((lineK - zTL)*CONTOUR_STEP + (zTR - zTL)*i) / (zTR - zTL))); topPoint.setY(j); } hasPrevBottom = false; // passes through the bottom if ((lineK < zBR && lineK > zBL) || (lineK < zBL && lineK > zBR)) { ++numPoints; passBottom = true; bottomPoint.setX(int(((lineK - zBL)*CONTOUR_STEP + (zBR - zBL)*i) / (zBR - zBL))); bottomPoint.setY(j + CONTOUR_STEP); if (j + 2*CONTOUR_STEP < flImgHy) { lastPoint = bottomPoint; hasPrevBottom = true; } } // passes through the left if ((lineK < zBL && lineK > zTL) || (lineK < zTL && lineK > zBL)) { ++numPoints; passLeft = true; leftPoint.setY(int(((lineK - zTL)*CONTOUR_STEP + (zBL - zTL)*j) / (zBL - zTL))); leftPoint.setX(i); } // passes through the right if ((lineK < zBR && lineK > zTR) || (lineK < zTR && lineK > zBR)) { ++numPoints; passRight = true; rightPoint.setY(int(((lineK - zTR)*CONTOUR_STEP + (zBR - zTR)*j) / (zBR - zTR))); rightPoint.setX(i + CONTOUR_STEP); } if (numPoints == 4) { // draw a cross _lines.append(CoutourLineDetails(QLine(topPoint, bottomPoint), lineWeight)); _lines.append(CoutourLineDetails(QLine(rightPoint, leftPoint), lineWeight)); #ifdef BENCHMARK numberOfLinesDrawn += 2; #endif } else if (numPoints == 3) { // draw a V opening to non-intersecting side if (!passTop) { _lines.append(CoutourLineDetails(QLine(leftPoint, bottomPoint), lineWeight)); _lines.append(CoutourLineDetails(QLine(bottomPoint, rightPoint), lineWeight)); } else if (!passLeft) { _lines.append(CoutourLineDetails(QLine(topPoint, rightPoint), lineWeight)); _lines.append(CoutourLineDetails(QLine(rightPoint, bottomPoint), lineWeight)); } else if (!passBottom) { _lines.append(CoutourLineDetails(QLine(leftPoint, topPoint), lineWeight)); _lines.append(CoutourLineDetails(QLine(topPoint, rightPoint), lineWeight)); } else { _lines.append(CoutourLineDetails(QLine(topPoint, leftPoint), lineWeight)); _lines.append(CoutourLineDetails(QLine(leftPoint, bottomPoint), lineWeight)); } #ifdef BENCHMARK numberOfLinesDrawn += 2; #endif } else if (numPoints == 2) { // two points - connect them QPoint point1, point2; bool true1 = false; if (passTop) { point1 = topPoint; true1 = true; } if (passBottom) { if (true1) { point2 = bottomPoint; } else { point1 = bottomPoint; true1 = true; } } if (passLeft) { if (true1) { point2 = leftPoint; } else { point1 = leftPoint; } } if (passRight) { point2 = rightPoint; } _lines.append(CoutourLineDetails(QLine(point1, point2), lineWeight)); #ifdef BENCHMARK ++numberOfLinesDrawn; #endif } } } } } } } #ifdef BENCHMARK b_2 = benchtmp.elapsed(); int i = bench_time.elapsed(); qDebug() << endl << "Plotting image " << (void *)this << ": " << i << "ms"; qDebug() << " Without locks: " << b_2 << "ms"; qDebug() << " Number of lines drawn: " << numberOfLinesDrawn; if (b_1 > 0) qDebug() << " Color Map: " << b_1 << "ms"; if (b_2 - b_1 > 0) qDebug() << " Coutour Lines: " << (b_2 - b_1) << "ms" << endl; #endif } void Image::yRange(double xFrom, double xTo, double* yMin, double* yMax) { if (!yMin || !yMax) { return; } // if x range overlaps with image x range, just return image y range if ((xFrom <= MinX && xTo >= MinX) || (xTo >= MaxX && xFrom <= MaxX) || (xFrom > MinX && xFrom < MaxX) || (xTo > MinX && xTo < MaxX)) { *yMin = MinY; *yMax = MaxY; return; } *yMin = 0; *yMax = 0; return; } QSize Image::legendSymbolSize(QPainter *p) { return QSize(p->fontMetrics().height()*7, 2*p->fontMetrics().height()); } void Image::paintLegendSymbol(QPainter *p, const QSize &size) { QRect bound(QPoint(0,0),size); if (hasColorMap() && (_pal.colorCount()>0)) { double spacing; int minor_ticks; computeMajorTickSpacing(&spacing, &minor_ticks, TicksCoarse, upperThreshold() - lowerThreshold()); int l = bound.left(), r = bound.right(), t = bound.top(), b = bound.bottom()-p->fontMetrics().height(); // draw the color palette p->drawRect(l,t,(r-l),(b-t)); p->save(); for (int i = l; i <= r; i++) { int index = (int)floor(static_cast(((i - l) * (_pal.colorCount() - 1))) / (r - l)); QColor sliceColor = _pal.color(index).rgb(); p->setPen(QPen(sliceColor, 1)); p->drawLine(i, t, i, b); } p->restore(); double min = int(lowerThreshold()/spacing)*spacing; if (minsave(); for (double tick = min; tick < upperThreshold(); tick+=spacing) { int x = (tick-lowerThreshold())*(r-l)/(upperThreshold()-lowerThreshold())+l; p->drawLine(x,b,x,b-p->fontMetrics().ascent()/3); QString tickStr = QString::number(tick); QRect bound = p->boundingRect(QRect(),Qt::AlignLeft|Qt::AlignBottom, tickStr); p->drawText(QPoint(x-bound.width()/2, b+p->fontMetrics().ascent()), tickStr); } p->restore(); } else if (hasContourMap()) { // draw a box with contour color p->setPen(QPen(_contourColor, 1)); p->drawRect(bound.left(), bound.top(), bound.width(), bound.height()); } } QString Image::_automaticDescriptiveName() const { return matrix()->descriptiveName(); } QString Image::descriptionTip() const { QString tip; tip = tr("Image: %1\n" ).arg(Name()); if (_hasContourMap) { tip += " Contour Map"; } if (_hasColorMap) { tip += " Color Map"; } tip += matrix()->descriptionTip(); return tip; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/builtinobjects.cpp0000644000175000017500000000243412277111530020035 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "builtinobjects.h" #include "equationfactory.h" #include "csdfactory.h" #include "histogramfactory.h" #include "psdfactory.h" #include "eventmonitorfactory.h" #include "basicpluginfactory.h" namespace Kst { namespace Builtins { void initObjects() { new EquationFactory; new CSDFactory; new HistogramFactory; new PSDFactory; new EventMonitorFactory; new BasicPluginFactory; } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/histogram.cpp0000644000175000017500000002351512362705136017023 0ustar synthsynth/*************************************************************************** histogram.cpp: Histogram for KST ------------------- begin : July 2002 copyright : (C) 2002 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "histogram.h" #include #include #include #include #include #include "dialoglauncher.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { const QString Histogram::staticTypeString = "Histogram"; const QString Histogram::staticTypeTag = "histogram"; static const QLatin1String& RAWVECTOR = QLatin1String("I"); static const QLatin1String& BINS = QLatin1String("B"); static const QLatin1String& HIST = QLatin1String("H"); Histogram::Histogram(ObjectStore *store) : DataObject(store) { setRealTimeAutoBin(false); _typeString = staticTypeString; _type = "Histogram"; _initializeShortName(); // _Bins, _bVector and _hVector need to be valid, // so initialize them as size 2 (where 2 is a small valid number) _Bins = new unsigned long[2]; _NumberOfBins = 0; VectorPtr v = store->createObject(); v->setProvider(this); v->setSlaveName("bin"); v->resize(2); _bVector = _outputVectors.insert(BINS, v).value(); v = store->createObject(); v->setProvider(this); v->setSlaveName("num"); v->resize(2); _hVector = _outputVectors.insert(HIST, v).value(); } void Histogram::_initializeShortName() { _shortName = 'H'+QString::number(_hnum); if (_hnum>max_hnum) max_hnum = _hnum; _hnum++; } void Histogram::change(VectorPtr in_V, double xmin_in, double xmax_in, int in_n_bins, NormalizationType in_norm_mode, bool realTimeAutoBin) { _NormalizationMode = in_norm_mode; _realTimeAutoBin = realTimeAutoBin; _NumberOfBins = 0; _inputVectors[RAWVECTOR] = in_V; if (xmax_in>xmin_in) { _MaxX = xmax_in; _MinX = xmin_in; } else { _MinX = xmax_in; _MaxX = xmin_in; } if (_MaxX == _MinX) { _MaxX += 1.0; _MinX -= 1.0; } _NumberOfBins = in_n_bins; if (_NumberOfBins < 2) { _NumberOfBins = 2; } delete[] _Bins; _Bins = new unsigned long[_NumberOfBins]; _NS = 3 * _NumberOfBins + 1; _bVector->resize(_NumberOfBins); _hVector->resize(_NumberOfBins); } Histogram::~Histogram() { _bVector = 0L; _hVector = 0L; delete[] _Bins; _Bins = 0L; } void Histogram::internalUpdate() { writeLockInputsAndOutputs(); int i_bin, i_pt, ns; double y = 0.0; double MaxY = 0.0; // do auto-binning if necessary if (_realTimeAutoBin) { int temp_NumberOfBins; double temp_xMin, temp_xMax; Histogram::AutoBin(_inputVectors[RAWVECTOR], &temp_NumberOfBins, &temp_xMax, &temp_xMin); internalSetNumberOfBins(temp_NumberOfBins); internalSetXRange(temp_xMin, temp_xMax); } _NS = 3 * _NumberOfBins + 1; _W = (_MaxX - _MinX)/double(_NumberOfBins); memset(_Bins, 0, _NumberOfBins*sizeof(*_Bins)); ns = _inputVectors[RAWVECTOR]->length(); for (i_pt = 0; i_pt < ns ; ++i_pt) { y = _inputVectors[RAWVECTOR]->interpolate(i_pt, ns); i_bin = (int)floor((y-_MinX)/_W); if (i_bin >= 0 && i_bin < _NumberOfBins) { _Bins[i_bin]++; } else { // the top boundary of the top bin is included in the top bin. // for all other bins, the top boundary is included in the next bin if (y == _MaxX) { _Bins[_NumberOfBins-1]++; } } } for (i_bin=0; i_bin<_NumberOfBins; ++i_bin) { y = _Bins[i_bin]; if (y > MaxY) { MaxY = y; } } LabelInfo label_info; switch (_NormalizationMode) { case Number: _Normalization = 1.0; label_info.quantity = tr("Number"); break; case Percent: if (ns > 0) { _Normalization = 100.0/(double)ns; } else { _Normalization = 1.0; } label_info.quantity = tr("Percent"); break; case Fraction: if (ns > 0) { _Normalization = 1.0/(double)ns; } else { _Normalization = 1.0; } label_info.quantity = tr("Fraction"); break; case MaximumOne: if (MaxY > 0) { _Normalization = 1.0/MaxY; } else { _Normalization = 1.0; } label_info.quantity = tr("Normalized Frequency"); break; default: _Normalization = 1.0; label_info.quantity = tr("Number"); break; } _bVector->setLabelInfo(_inputVectors[RAWVECTOR]->labelInfo()); label_info.quantity.clear(); label_info.units.clear(); label_info.name = tr( "Histogram of %1").arg(_bVector->labelInfo().name); label_info.file = _bVector->labelInfo().file; _hVector->setTitleInfo(label_info); double *bins = _bVector->value(); double *hist = _hVector->value(); for ( i_bin = 0; i_bin<_NumberOfBins; ++i_bin ) { bins[i_bin] = ( double( i_bin ) + 0.5 )*_W + _MinX; hist[i_bin] = _Bins[i_bin]*_Normalization; } unlockInputsAndOutputs(); } int Histogram::numberOfBins() const { return _NumberOfBins; } void Histogram::setXRange(double xmin_in, double xmax_in) { internalSetXRange(xmin_in, xmax_in); } void Histogram::internalSetXRange(double xmin_in, double xmax_in) { if (xmax_in > xmin_in) { _MaxX = xmax_in; _MinX = xmin_in; } else if (xmax_in < xmin_in) { _MinX = xmax_in; _MaxX = xmin_in; } else { _MinX = xmax_in - 1.0; _MaxX = xmax_in + 1.0; } _W = (_MaxX - _MinX)/double(_NumberOfBins); } void Histogram::internalSetNumberOfBins(int in_n_bins) { if (in_n_bins < 2) { in_n_bins = 2; } if (_NumberOfBins != in_n_bins) { _NumberOfBins = in_n_bins; delete[] _Bins; _Bins = new unsigned long[_NumberOfBins]; memset(_Bins, 0, _NumberOfBins*sizeof(*_Bins)); _bVector->resize(_NumberOfBins); _hVector->resize(_NumberOfBins); } _W = (_MaxX - _MinX)/double(_NumberOfBins); _NS = 3 * _NumberOfBins + 1; } void Histogram::setNumberOfBins(int in_n_bins) { _realTimeAutoBin = false; internalSetNumberOfBins(in_n_bins); } void Histogram::setVector(VectorPtr new_v) { if (new_v) { _inputVectors[RAWVECTOR] = new_v; } } VectorPtr Histogram::vector() const { return _inputVectors[RAWVECTOR]; } void Histogram::save(QXmlStreamWriter &xml) { xml.writeStartElement(staticTypeTag); xml.writeAttribute("vector", _inputVectors[RAWVECTOR]->Name()); xml.writeAttribute("numberofbins", QString::number(_NumberOfBins)); xml.writeAttribute("realtimeautobin", QVariant(_realTimeAutoBin).toString()); xml.writeAttribute("min", QString::number(_MinX)); xml.writeAttribute("max", QString::number(_MaxX)); xml.writeAttribute("normalizationmode", QString::number(_NormalizationMode)); saveNameInfo(xml, VNUM|HNUM|XNUM); xml.writeEndElement(); } QString Histogram::propertyString() const { return tr("Histogram: %1").arg(_inputVectors[RAWVECTOR]->Name()); } void Histogram::showNewDialog() { DialogLauncher::self()->showHistogramDialog(); } void Histogram::showEditDialog() { DialogLauncher::self()->showHistogramDialog(this); } void Histogram::AutoBin(VectorPtr V, int *n, double *max, double *min) { double m; *max = V->max(); *min = V->min(); *n = V->length(); if (*max < *min) { m = *max; *max = *min; *min = m; } if (*max == *min) { *max += 1.0; *min -= 1.0; } // we can do a better job auto-ranging using the tick rules from plot... // this has not been done yet, you will notice... *n /= 50; if (*n < 6) { *n = 6; } if (*n > 60) { *n = 60; } m = (*max - *min)/(100.0*double(*n)); *max += m; *min -= m; } bool Histogram::slaveVectorsUsed() const { return true; } void Histogram::setRealTimeAutoBin(bool autoBin) { _realTimeAutoBin = autoBin; } bool Histogram::realTimeAutoBin() const { return _realTimeAutoBin; } double Histogram::vMax() const { return _inputVectors[RAWVECTOR]->max(); } double Histogram::vMin() const { return _inputVectors[RAWVECTOR]->min(); } int Histogram::vNumSamples() const { return _inputVectors[RAWVECTOR]->length(); } DataObjectPtr Histogram::makeDuplicate() const { HistogramPtr histogram = store()->createObject(); histogram->setVector(_inputVectors[RAWVECTOR]); histogram->setXRange(_MinX, _MaxX); histogram->setNumberOfBins(_NumberOfBins); histogram->setNormalizationType(_NormalizationMode); histogram->setRealTimeAutoBin(_realTimeAutoBin); if (descriptiveNameIsManual()) { histogram->setDescriptiveName(descriptiveName()); } histogram->writeLock(); histogram->registerChange(); histogram->unlock(); return DataObjectPtr(histogram); } QString Histogram::_automaticDescriptiveName() const { return (_inputVectors[RAWVECTOR]->descriptiveName()); } QString Histogram::descriptionTip() const { QString tip; tip = tr("Histogram: %1").arg(Name()); if (realTimeAutoBin()) { tip+= tr("\n Auto-bin"); } else { tip += tr("\n %1 bins from %2 to %3").arg(numberOfBins()).arg(xMin()).arg(xMax()); } tip += tr("\nInput: %1").arg(_inputVectors[RAWVECTOR]->descriptionTip()); return tip; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/curvehint.h0000644000175000017500000000331212277111530016465 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef CURVEHINT_H #define CURVEHINT_H #include #include #include "vector.h" namespace Kst { class Relation; class CurveHint : public Shared { friend class DataObject; public: explicit CurveHint(const QString& name = QString(), const QString& x = QString(), const QString& y = QString()); virtual ~CurveHint(); virtual const QString& curveName() const { return _curveName; } virtual const QString& xVectorName() const; virtual const QString& yVectorName() const; #if 0 virtual VectorPtr xVector() const; virtual VectorPtr yVector() const; virtual SharedPtr makeCurve(const QString& tag, const QColor& color) const; #endif protected: QString _curveName, _xVectorName, _yVectorName; }; typedef SharedPtr CurveHintPtr; typedef QList CurveHintList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/histogramfactory.cpp0000644000175000017500000000643412277111530020406 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "histogramfactory.h" #include "debug.h" #include "histogram.h" #include "datacollection.h" #include "objectstore.h" namespace Kst { HistogramFactory::HistogramFactory() : ObjectFactory() { registerFactory(Histogram::staticTypeTag, this); } HistogramFactory::~HistogramFactory() { } DataObjectPtr HistogramFactory::generateObject(ObjectStore *store, QXmlStreamReader& xml) { Q_ASSERT(store); double min=-1, max=1; int numberOfBins=16, normalizationMode=0; QString VectorName, descriptiveName; bool realTimeAutoBin = true; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == Histogram::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); VectorName = attrs.value("vector").toString(); min = attrs.value("min").toString().toDouble(); max = attrs.value("max").toString().toDouble(); numberOfBins = attrs.value("numberofbins").toString().toInt(); normalizationMode = attrs.value("normalizationmode").toString().toInt(); realTimeAutoBin = attrs.value("realtimeautobin").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == Histogram::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Histogram from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr vector = 0; if (store && !VectorName.isEmpty()) { vector = kst_cast(store->retrieveObject(VectorName)); } if (!vector) { Debug::self()->log(QObject::tr("Error creating Histogram from Kst file. Could not find Vector."), Debug::Warning); return 0; } HistogramPtr histogram = store->createObject(); histogram->setVector(vector); histogram->setXRange(min, max); histogram->setNumberOfBins(numberOfBins); histogram->setNormalizationType((Histogram::NormalizationType)normalizationMode); histogram->setRealTimeAutoBin(realTimeAutoBin); histogram->setDescriptiveName(descriptiveName); histogram->writeLock(); histogram->registerChange(); histogram->unlock(); return histogram; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstmath/dataobject.cpp0000644000175000017500000007111712362701575017132 0ustar synthsynth/*************************************************************************** dataobject.cpp: base class for data objects ------------------- begin : May 20, 2003 copyright : (C) 2003 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dataobject.h" #include "datacollection.h" #include "dataobjectplugin.h" #include "debug.h" #include "objectstore.h" #include "relation.h" #include "sharedptr.h" #include "primitive.h" #include "settings.h" #include "dataobjectscriptinterface.h" #include #include #include #include #include #include #include #include #include #include //#define LOCKTRACE using namespace Kst; QSettings& DataObject::settingsObject() { static QSettings& settingsObject = createSettings("data"); return settingsObject; } QMap DataObject::url_map; void DataObject::init() { initPlugins(); } DataObject::DataObject(ObjectStore *store) : Object() { Q_UNUSED(store); _curveHints = new CurveHintList; } DataObject::~DataObject() { delete _curveHints; } static DataObjectPluginList _pluginList; void DataObject::cleanupForExit() { _pluginList.clear(); //FIXME? } void DataObject::attach() { } void DataObject::replaceInput(PrimitivePtr p, PrimitivePtr new_p) { if (VectorPtr v = kst_cast(p) ) { if (VectorPtr new_v = kst_cast(new_p)) { for (VectorMap::Iterator j = _inputVectors.begin(); j != _inputVectors.end(); ++j) { if (j.value() == v) { _inputVectors[j.key()] = new_v; } } } } else if (MatrixPtr m = kst_cast(p) ) { if (MatrixPtr new_m = kst_cast(new_p)) { for (MatrixMap::Iterator j = _inputMatrices.begin(); j != _inputMatrices.end(); ++j) { if (j.value() == m) { _inputMatrices[j.key()] = new_m; } } } } else if (StringPtr s = kst_cast(p) ) { if (StringPtr new_s = kst_cast(new_p)) { for (StringMap::Iterator j = _inputStrings.begin(); j != _inputStrings.end(); ++j) { if (j.value() == s) { _inputStrings[j.key()] = new_s; } } } } else if (ScalarPtr s = kst_cast(p) ) { if (ScalarPtr new_s = kst_cast(new_p)) { for (ScalarMap::Iterator j = _inputScalars.begin(); j != _inputScalars.end(); ++j) { if (j.value() == s) { _inputScalars[j.key()] = new_s; } } } } } VectorPtr DataObject::outputVector(const QString& vector) const { VectorMap::ConstIterator i = _outputVectors.constFind(vector); if (i != _outputVectors.constEnd()) return *i; else return 0; } ScalarPtr DataObject::outputScalar(const QString& scalar) const { ScalarMap::ConstIterator i = _outputScalars.constFind(scalar); if (i != _outputScalars.constEnd()) return *i; else return 0; } StringPtr DataObject::outputString(const QString& string) const { StringMap::ConstIterator i = _outputStrings.constFind(string); if (i != _outputStrings.constEnd()) return *i; else return 0; } void DataObject::setInputVector(const QString &type, VectorPtr ptr) { if (ptr) { _inputVectors[type] = ptr; } else { _inputVectors.remove(type); } } void DataObject::setInputScalar(const QString &type, ScalarPtr ptr) { if (ptr) { _inputScalars[type] = ptr; } else { _inputScalars.remove(type); } } void DataObject::setInputString(const QString &type, StringPtr ptr) { if (ptr) { _inputStrings[type] = ptr; } else { _inputStrings.remove(type); } } PrimitiveList DataObject::inputPrimitives() const { PrimitiveList primitive_list; int n = _inputMatrices.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputMatrices.values().at(i))); } n = _inputStrings.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputStrings.values().at(i))); } n = _inputScalars.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputScalars.values().at(i))); } n = _inputVectors.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_inputVectors.values().at(i))); } return primitive_list; } PrimitiveList DataObject::outputPrimitives(bool include_decendants) const { PrimitiveList primitive_list; int n = _outputMatrices.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_outputMatrices.values().at(i))); if (include_decendants) { primitive_list.append(_outputMatrices.values().at(i)->outputPrimitives()); } } n = _outputStrings.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_outputStrings.values().at(i))); if (include_decendants) { primitive_list.append(_outputStrings.values().at(i)->outputPrimitives()); } } n = _outputScalars.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_outputScalars.values().at(i))); if (include_decendants) { primitive_list.append(_outputScalars.values().at(i)->outputPrimitives()); } } n = _outputVectors.count(); for (int i = 0; i< n; i++) { primitive_list.append(kst_cast(_outputVectors.values().at(i))); if (include_decendants) { primitive_list.append(_outputVectors.values().at(i)->outputPrimitives()); } } return primitive_list; } // set flags on all output primitives // used for sorting dataobjects by Document::sortedDataObjectList() void DataObject::setOutputFlags(bool flag) { PrimitiveList output_primitives = outputPrimitives(); int n = output_primitives.count(); for (int i=0; isetFlag(flag); } } bool DataObject::inputFlagsSet() const { PrimitiveList input_primitives = inputPrimitives(); int n = input_primitives.count(); bool all_set = true; for (int i=0; iflagSet(); } return all_set; } // Scans for plugins and stores the information for them void DataObject::scanPlugins() { Debug::self()->log(tr("Scanning for data-object plugins.")); _pluginList.clear(); //FIXME? DataObjectPluginList tmpList; Debug::self()->log(tr("Scanning for data-object plugins.")); foreach (QObject *plugin, QPluginLoader::staticInstances()) { //try a cast if (DataObjectPluginInterface *basicPlugin = qobject_cast(plugin)) { tmpList.append(basicPlugin); } } QStringList pluginPaths = pluginSearchPaths(); foreach (const QString &pluginPath, pluginPaths) { QDir d(pluginPath); foreach (const QString &fileName, d.entryList(QDir::Files)) { QPluginLoader loader(d.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); if (plugin) { if (DataObjectPluginInterface *dataObjectPlugin = qobject_cast(plugin)) { tmpList.append(dataObjectPlugin); Debug::self()->log(QString("Plugin loaded: %1").arg(fileName)); } } else { Debug::self()->log(QString("Plugin failed to load: %1").arg(fileName)); } } } // This cleans up plugins that have been uninstalled and adds in new ones. // Since it is a shared pointer it can't dangle anywhere. _pluginList.clear(); _pluginList = tmpList; } void DataObject::initPlugins() { if (_pluginList.isEmpty()) { scanPlugins(); } } QStringList DataObject::pluginList() { // Ensure state. When using kstapp MainWindow calls init. init(); QStringList plugins; for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { plugins += (*it)->pluginName(); } return plugins; } QStringList DataObject::dataObjectPluginList() { // Ensure state. When using kstapp MainWindow calls init. init(); QStringList plugins; for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginType() == DataObjectPluginInterface::Generic) { plugins += (*it)->pluginName(); } } plugins.sort(); return plugins; } QStringList DataObject::filterPluginList() { // Ensure state. When using kstapp MainWindow calls init. init(); QStringList plugins; for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginType() == DataObjectPluginInterface::Filter) { plugins += (*it)->pluginName(); } } plugins.sort(); return plugins; } QStringList DataObject::fitsPluginList() { // Ensure state. When using kstapp MainWindow calls init. init(); QStringList plugins; for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginType() == DataObjectPluginInterface::Fit) { plugins += (*it)->pluginName(); } } plugins.sort(); return plugins; } DataObjectConfigWidget* DataObject::pluginWidget(const QString& name) { // Ensure state. When using kstapp MainWindow calls init. init(); for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginName() == name) { if ((*it)->hasConfigWidget()) { return (*it)->configWidget(&settingsObject()); } break; } } return 0L; } QString DataObject::pluginDescription(const QString& name) { // Ensure state. When using kstapp MainWindow calls init. init(); for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginName() == name) { return (*it)->pluginDescription(); } } return QString(); } int DataObject::pluginType(const QString& name) { // Ensure state. When using kstapp MainWindow calls init. init(); for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginName() == name) { return (*it)->pluginType(); } } return -1; } DataObjectPtr DataObject::createPlugin(const QString& name, ObjectStore *store, DataObjectConfigWidget *configWidget, bool setupInputsOutputs) { // Ensure state. When using kstapp MainWindow calls init. init(); for (DataObjectPluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if ((*it)->pluginName() == name) { if (DataObjectPtr object = (*it)->create(store, configWidget, setupInputsOutputs)) { return object; } } } #if 0 KService::List sl = KServiceTypeTrader::self()->query("Kst Data Object"); for (KService::List::ConstIterator it = sl.constBegin(); it != sl.constEnd(); ++it) { if ((*it)->name() != name) { continue; } else if (DataObjectPtr object = createPlugin(*it)) { return object; } } #endif return 0L; } double *DataObject::vectorRealloced(VectorPtr v, double *memptr, int newSize) const { if (!v) { return 0L; } // One would think this needs special locking, but it results in deadlock // in complicated object hierarchies such as filtered vectors. Therefore if // you call vectorRealloced() and v is not locked by you already, you'd // better lock it! return v->realloced(memptr, newSize); } void DataObject::load(const QXmlStreamReader &e) { qDebug() << QString("FIXME! Loading of %1 is not implemented yet.").arg(typeString()) << endl; Q_UNUSED(e) } void DataObject::save(QXmlStreamWriter& ts) { qDebug() << QString("FIXME! Saving of %1 is not implemented yet.").arg(typeString()) << endl; Q_UNUSED(ts) } int DataObject::getUsage() const { int rc = 0; for (VectorMap::ConstIterator i = _outputVectors.constBegin(); i != _outputVectors.constEnd(); ++i) { if (i.value().data()) { rc += i.value()->getUsage() - 1; } } for (ScalarMap::ConstIterator i = _outputScalars.constBegin(); i != _outputScalars.constEnd(); ++i) { if (i.value().data()) { rc += i.value()->getUsage() - 1; } } for (StringMap::ConstIterator i = _outputStrings.constBegin(); i != _outputStrings.constEnd(); ++i) { if (i.value().data()) { rc += i.value()->getUsage() - 1; } } for (MatrixMap::ConstIterator i = _outputMatrices.constBegin(); i != _outputMatrices.constEnd(); ++i) { if (i.value().data()) { rc += i.value()->getUsage() - 1; } } return Object::getUsage() + rc; } void DataObject::showDialog(bool isNew) { if (isNew) { QTimer::singleShot(0, this, SLOT(showNewDialog())); } else { QTimer::singleShot(0, this, SLOT(showEditDialog())); } } void DataObject::readLock() const { #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::readLock() by tid=" << (int)QThread::currentThread() << ": read locking myself" << endl; #endif Object::readLock(); } void DataObject::writeLock() const { #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::writeLock() by tid=" << (int)QThread::currentThread() << ": write locking myself" << endl; #endif Object::writeLock(); } void DataObject::unlock() const { #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlock() by tid=" << (int)QThread::currentThread() << ": unlocking myself" << endl; #endif Object::unlock(); } void DataObject::writeLockInputsAndOutputs() const { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << endl; #endif QList inputs; QList outputs; QList sl = _inputStrings.values(); for (QList::Iterator i = sl.begin(); i != sl.end(); ++i) { inputs += (*i).data(); } sl = _outputStrings.values(); for (QList::Iterator i = sl.begin(); i != sl.end(); ++i) { outputs += (*i).data(); } QList sc = _inputScalars.values(); for (QList::Iterator i = sc.begin(); i != sc.end(); ++i) { inputs += (*i).data(); } sc = _outputScalars.values(); for (QList::Iterator i = sc.begin(); i != sc.end(); ++i) { outputs += (*i).data(); } QList vl = _inputVectors.values(); for (QList::Iterator i = vl.begin(); i != vl.end(); ++i) { inputs += (*i).data(); } vl = _outputVectors.values(); for (QList::Iterator i = vl.begin(); i != vl.end(); ++i) { outputs += (*i).data(); } QList ml = _inputMatrices.values(); for (QList::Iterator i = ml.begin(); i != ml.end(); ++i) { inputs += (*i).data(); } ml = _outputMatrices.values(); for (QList::Iterator i = ml.begin(); i != ml.end(); ++i) { outputs += (*i).data(); } qSort(inputs); qSort(outputs); QList::ConstIterator inputIt = inputs.constBegin(); QList::ConstIterator outputIt = outputs.constBegin(); while (inputIt != inputs.constEnd() || outputIt != outputs.constEnd()) { if (inputIt != inputs.constEnd() && (outputIt == outputs.constEnd() || (void*)(*inputIt) < (void*)(*outputIt))) { // do input if (!(*inputIt)) { qWarning() << "Input for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": write locking input \"" << (*inputIt)->Name() << "\" (" << (void*)((KstRWLock*)*inputIt) << ")" << endl; #endif (*inputIt)->writeLock(); ++inputIt; } else { // do output if (!(*outputIt)) { qWarning() << "Output for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::writeLockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": write locking output \"" << (*outputIt)->Name() << "\" (" << (void*)((KstRWLock*)*outputIt) << ")" << endl; #endif if ((*outputIt)->provider() != this) { Debug::self()->log(tr("(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output %3 (not provider) -- this is probably an error. Please email kst@kde.org with details.").arg(this->type()).arg(reinterpret_cast(QThread::currentThread())).arg((*outputIt)->Name()), Debug::Error); } (*outputIt)->writeLock(); ++outputIt; } } } void DataObject::unlockInputsAndOutputs() const { #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << endl; #endif for (MatrixMap::ConstIterator i = _outputMatrices.constBegin(); i != _outputMatrices.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output matrix for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output matrix \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (MatrixMap::ConstIterator i = _inputMatrices.constBegin(); i != _inputMatrices.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input matrix for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input matrix \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (VectorMap::ConstIterator i = _outputVectors.constBegin(); i != _outputVectors.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output vector for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output vector \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (VectorMap::ConstIterator i = _inputVectors.constBegin(); i != _inputVectors.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input vector for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input vector \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (ScalarMap::ConstIterator i = _outputScalars.constBegin(); i != _outputScalars.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output scalar for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output scalar \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (ScalarMap::ConstIterator i = _inputScalars.constBegin(); i != _inputScalars.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input scalar for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input scalar \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (StringMap::ConstIterator i = _outputStrings.constBegin(); i != _outputStrings.constEnd(); ++i) { if (!(*i)) { qWarning() << "Output string for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking output string \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } for (StringMap::ConstIterator i = _inputStrings.constBegin(); i != _inputStrings.constEnd(); ++i) { if (!(*i)) { qWarning() << "Input string for data object " << this->Name() << " is invalid." << endl; } #ifdef LOCKTRACE qDebug() << (void*)this << " (" << this->type() << ": " << this->Name() << ") DataObject::unlockInputsAndOutputs() by tid=" << (int)QThread::currentThread() << ": unlocking input string \"" << (*i)->Name() << "\" (" << (void*)((KstRWLock*)*i) << ")" << endl; #endif (*i)->unlock(); } } bool DataObject::isValid() { return true; } const CurveHintList* DataObject::curveHints() const { return _curveHints; } void DataObject::deleteDependents() { DataObjectList dataObjects = _store->getObjects(); foreach (const DataObjectPtr &object, dataObjects) { bool usesObject = object->uses(this); if (!usesObject) { for (VectorMap::Iterator j = _outputVectors.begin(); !usesObject && j != _outputVectors.end(); ++j) { usesObject = object->uses(j.value().data()); } for (ScalarMap::Iterator j = _outputScalars.begin(); !usesObject && j != _outputScalars.end(); ++j) { usesObject = object->uses(j.value().data()); } for (StringMap::Iterator j = _outputStrings.begin(); !usesObject && j != _outputStrings.end(); ++j) { usesObject = object->uses(j.value().data()); } for (MatrixMap::Iterator j = _outputMatrices.begin(); !usesObject && j != _outputMatrices.end(); ++j) { usesObject = object->uses(j.value().data()); } } if (usesObject) { _store->removeObject(object); } } RelationList relations = _store->getObjects(); foreach (const RelationPtr &relation, relations) { bool usesRelation = relation->uses(this); if (!usesRelation) { for (VectorMap::Iterator j = _outputVectors.begin(); !usesRelation && j != _outputVectors.end(); ++j) { usesRelation = relation->uses(j.value().data()); } for (ScalarMap::Iterator j = _outputScalars.begin(); !usesRelation && j != _outputScalars.end(); ++j) { usesRelation = relation->uses(j.value().data()); } for (StringMap::Iterator j = _outputStrings.begin(); !usesRelation && j != _outputStrings.end(); ++j) { usesRelation = relation->uses(j.value().data()); } for (MatrixMap::Iterator j = _outputMatrices.begin(); !usesRelation && j != _outputMatrices.end(); ++j) { usesRelation = relation->uses(j.value().data()); } } if (usesRelation) { _store->removeObject(relation); } } foreach (const VectorPtr &vector, _outputVectors) { _store->removeObject(vector); } foreach (const MatrixPtr &matrix, _outputMatrices) { _store->removeObject(matrix); } foreach (const ScalarPtr &scalar, _outputScalars) { _store->removeObject(scalar); } foreach (const StringPtr &string, _outputStrings) { _store->removeObject(string); } } bool DataObject::uses(ObjectPtr p) const { PrimitiveList this_input_primitives; PrimitiveList p_output_primitives; this_input_primitives = inputPrimitives(); PrimitivePtr p_prim = kst_cast(p); DataObjectPtr p_dobj = kst_cast(p); if (p_prim) { p_output_primitives = p_prim->outputPrimitives(); p_output_primitives << p_prim; // include the object itself. } else if (p_dobj) { p_output_primitives = p_dobj->outputPrimitives(); } else { p_output_primitives.clear(); } // now check if any of this's input primitives are one of p's output primitives... int n_in = this_input_primitives.count(); for (int i_in = 0; i_inserial()); } foreach (const ScalarPtr &P, _inputScalars) { minSerial = qMin(minSerial, P->serial()); } foreach (const MatrixPtr &P, _inputMatrices) { minSerial = qMin(minSerial, P->serial()); } foreach (const StringPtr &P, _inputStrings) { minSerial = qMin(minSerial, P->serial()); } return minSerial; } qint64 DataObject::maxInputSerialOfLastChange() const { qint64 maxSerial = NoInputs; foreach (const VectorPtr &P, _inputVectors) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (const ScalarPtr &P, _inputScalars) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (const MatrixPtr &P, _inputMatrices) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } foreach (const StringPtr &P, _inputStrings) { maxSerial = qMax(maxSerial, P->serialOfLastChange()); } return maxSerial; } ///////////////////////////////////////////////////////////////////////////// DataObjectConfigWidget::DataObjectConfigWidget(QSettings *cfg) : QWidget(0L), _cfg(cfg) { } DataObjectConfigWidget::~DataObjectConfigWidget() { } void DataObjectConfigWidget::save() { } void DataObjectConfigWidget::load() { } void DataObjectConfigWidget::setObjectStore(ObjectStore* store) { Q_UNUSED(store); } void DataObjectConfigWidget::setupFromObject(Object* dataObject) { Q_UNUSED(dataObject); } void DataObjectConfigWidget::setVectorX(VectorPtr vector) { Q_UNUSED(vector); } void DataObjectConfigWidget::setVectorY(VectorPtr vector) { Q_UNUSED(vector); } void DataObjectConfigWidget::setupSlots(QWidget* dialog) { Q_UNUSED(dialog); } void DataObjectConfigWidget::setVectorsLocked(bool locked) { Q_UNUSED(locked); } bool DataObjectConfigWidget::configurePropertiesFromXml(ObjectStore *store, QXmlStreamAttributes& attrs) { Q_UNUSED(store); Q_UNUSED(attrs); return true; } QByteArray DataObject::scriptInterface(QList &c) { Q_ASSERT(c.size()); if(c[0]=="outputVectorHandle") { if (c.size()==2) { QString c1 = QString(c[1]).trimmed(); if (_outputVectors.contains(c1)) { return _outputVectors[c1]->Name().toAscii(); } else { return QByteArray("vector not found: ").append(c[1]); } } else { return "outputVectorHandle takes one arg"; } } else if(c[0]=="outputScalarHandle") { if (c.size()==2) { QString c1 = QString(c[1]).trimmed(); if (_outputScalars.contains(c1)) { return _outputScalars[c1]->Name().toAscii(); } else { return QByteArray("scalar not found: ").append(c[1]); } } else { return "outputScalarHandle takes one arg"; } } else if(c[0]=="outputMatrixHandle") { if (c.size()==2) { QString c1 = QString(c[1]).trimmed(); if (_outputMatrices.contains(c1)) { return _outputMatrices[c1]->Name().toAscii(); } else { return QByteArray("Matrix not found: ").append(c[1]); } } else { return "outputMatrixHandle takes one arg"; } } else if(c[0]=="outputStringHandle") { if (c.size()==2) { QString c1 = QString(c[1]).trimmed(); if (_outputStrings.contains(c1)) { return _outputStrings[c1]->Name().toAscii(); } else { return QByteArray("String not found: ").append(c[1]); } } else { return "outputStringHandle takes one arg"; } } return "No such command..."; } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/0000755000175000017500000000000012362705136013442 5ustar synthsynthKst-2.0.8/src/libkst/extension.h0000644000175000017500000000272712277111530015631 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EXTENSION_H #define EXTENSION_H #include #include #include "kst_export.h" class QMainWindow; namespace Kst { class KSTCORE_EXPORT Extension : public QObject { Q_OBJECT public: Extension(QObject *parent, const QStringList&); virtual ~Extension(); virtual void processArguments(const QString& args); // To save state virtual void load(const QDomElement& e); virtual void save(QTextStream& ts, const QString& indent = QString()); // Clear internal state virtual void clear(); QMainWindow *app() const; signals: void unregister(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/dataplugin.h0000644000175000017500000000703612277111530015743 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAPLUGIN_H #define DATAPLUGIN_H #include #include #include #include "sharedptr.h" #include "datasource.h" #ifndef QT5 #define Q_PLUGIN_METADATA(x) #endif namespace Kst { class ObjectStore; class DataSource; class DataSourceConfigWidget; KSTCORE_EXPORT QStringList pluginSearchPaths(); class PluginInterface : public Shared { public: PluginInterface() {} virtual ~PluginInterface() {} virtual QString pluginName() const { return QString(); } virtual QString pluginDescription() const { return QString(); } virtual bool hasConfigWidget() const { return false; } }; class DataSourcePluginInterface : public PluginInterface { public: virtual ~DataSourcePluginInterface() {} virtual DataSource *create(ObjectStore *store, QSettings *cfg, const QString &filename, const QString &type, const QDomElement &element) const = 0; virtual QStringList matrixList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const = 0; virtual QStringList scalarList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const = 0; virtual QStringList stringList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const = 0; virtual QStringList fieldList(QSettings *cfg, const QString& filename, const QString& type, QString *typeSuggestion, bool *complete) const = 0; virtual int understands(QSettings *cfg, const QString& filename) const = 0; virtual bool supportsTime(QSettings *cfg, const QString& filename) const = 0; virtual QStringList provides() const = 0; bool provides(const QString& type) const { return provides().contains(type); } virtual DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const = 0; }; } Q_DECLARE_INTERFACE(Kst::PluginInterface, "com.kst.PluginInterface/2.0") Q_DECLARE_INTERFACE(Kst::DataSourcePluginInterface, "com.kst.DataSourcePluginInterface/2.0") #endif Kst-2.0.8/src/libkst/math_kst.h0000644000175000017500000001010512277111530015414 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // NOTE: only include this from .cpp files #ifndef MATH_KST_H #define MATH_KST_H #include #include #include #include #ifdef __sun #include #endif #include "kst_export.h" #ifdef _MSC_VER inline double pow(float a, double b) { return pow((double)a, b); } inline double pow(int a, qreal b) { return pow((double)a, (double)b); } #endif namespace Kst { /* ** For systems without NAN, this is a NAN in IEEE double format. ** Code from KDE's kjs libarary. */ #if !defined(NAN) #include static double nan__() { /* work around some strict alignment requirements for double variables on some architectures (e.g. PA-RISC) */ typedef union { unsigned char b[8]; double d; } kjs_double_t; #if Q_BYTE_ORDER == Q_BIG_ENDIAN static const kjs_double_t NaN_Bytes = { { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 } }; #elif defined(arm) static const kjs_double_t NaN_Bytes = { { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 } }; #else static const kjs_double_t NaN_Bytes = { { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f } }; #endif const double NaN = NaN_Bytes.d; return NaN; } #define NAN (Kst::nan__()) #endif /* ** Both Solaris and FreeBSD-current do weird things with the ** isnan() defined in math.h - in particular on FreeBSD it ** gets #undeffed by the C++ math routines later. Use the ** std:: version in those cases. */ #ifdef isnan #define KST_ISNAN(a) isnan(a) #elif defined(__APPLE__) #define KST_ISNAN(a) (a == NAN ? 1 : 0) #else // HUH? Ok let's get rid of the silliness here sometime. #define KST_ISNAN(a) isnan(a) #endif KSTCORE_EXPORT extern const double NOPOINT; inline int d2i(double x) { return int(floor(x+0.5)); } inline bool samePixel(double x1, double x2) { //return (int(floor(x1)) == int(floor(x2))); return (int(x1) == int(x2)); } #if defined(__SVR4) && defined(__sun) inline int isinf(double x) { return x == x && !finite(x); } #endif #ifdef Q_CC_MSVC #ifndef isnan #define isnan _isnan #endif #ifndef finite #define finite _finite #endif #ifndef M_PI #define M_PI 3.14159265358979323 #endif #ifndef isinf #define isinf !_finite #endif template bool isfinite(T value) { return !isinf(value); } #endif #if 0 #define isnan _isnan #define finite _finite #ifndef M_PI #define M_PI 3.14159265358979323 #endif #define isinf !_finite #endif inline double logXLo(double x, double base = 10.0) { if (base == 10.0) { return x > 0.0 ? log10(x) : -350.0; } else { return x > 0.0 ? log10(x)/log10(base) : -350.0; } } inline double logXHi(double x, double base = 10.0) { if (base == 10.0) { return x > 0.0 ? log10(x) : -340.0; } else { return x > 0.0 ? log10(x)/log10(base) : -340.0; } } inline double logYLo(double x, double base = 10.0) { if (base == 10.0) { return x > 0.0 ? log10(x) : -350.0; } else { return x > 0.0 ? log10(x)/log10(base) : -350.0; } } inline double logYHi(double x, double base = 10.0) { if (base == 10.0) { return x > 0.0 ? log10(x) : -340.0; } else { return x > 0.0 ? log10(x)/log10(base) : -340.0; } } inline double roundDouble (double x) { #ifdef rint return rint(x); #else int i = (int) x; if (x >= 0.0) { return ((x-i) >= 0.5) ? (i + 1) : (i); } else { return (-x+i >= 0.5) ? (i - 1) : (i); } #endif } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datacollection.h0000644000175000017500000000445112277111530016576 0ustar synthsynth/*************************************************************************** datacollection.h ------------------- begin : June 12, 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATACOLLECTION_H #define DATACOLLECTION_H #include "datasource.h" #include "string_kst.h" #include "vector.h" #include "matrix.h" #include "kst_export.h" class QFile; namespace Kst { class Relation; class PlotItemInterface; class KSTCORE_EXPORT Data { protected: static Data *_self; static void cleanup(); Data(); virtual ~Data(); public: static Data *self(); static void replaceSelf(Data *newInstance); virtual void removeCurveFromPlots(Relation *c); // no sharedptr here /** The list of plots for the current view. */ virtual QList plotList() const; /** Returns the number of rows in the current view's layout. * -1 if not in layout. */ virtual int rows() const; /** Returns the number of columns in the given view's layout. * -1 if not in layout. */ virtual int columns() const; static double AvailableMemory(); }; /** Bad choice for location - maybe move it later */ template bool kstrealloc(T* &ptr, size_t size) { // don't overwrite old pointer when resize fails // it doesn't free the old pointer void* newptr = qRealloc(static_cast(ptr), size); if (!newptr) return false; ptr = static_cast(newptr); return true; } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/editablevector.h0000644000175000017500000000362112362705136016611 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EDITABLEVECTOR_H #define EDITABLEVECTOR_H #include "vector.h" #include "kst_export.h" /**A vector with n editable pts *@author cbn */ namespace Kst { class KSTCORE_EXPORT EditableVector : public Vector { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; void save(QXmlStreamWriter &s); void setSaveData(bool save); /** If value exceeds length, vector is resized * @sa Vector::change() */ void setValue(const int& i,const double&val); virtual QString descriptionTip() const; protected: long double _sum; EditableVector(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; }; typedef SharedPtr EditableVectorPtr; typedef ObjectList EditableVectorList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/shortnameindex.cpp0000644000175000017500000000340512277111530017172 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "namedobject.h" namespace Kst { int _vnum = 1; // vectors int _pnum = 1; // plugins int _csdnum = 1; // csd int _cnum = 1; // curves int _enum = 1; // equations int _hnum = 1; // histograms int _inum = 1; // images int _psdnum = 1; // psd int _xnum = 1; // scalars int _tnum = 1; // text string int _mnum = 1; // matrix int _plotnum = 1; // plots int _lnum = 1; // legend int _dnum = 1; // view item int _dsnum = 1; // datasource int max_vnum = 0; // vectors int max_pnum = 0; // plugins int max_csdnum = 0; // csd int max_cnum = 0; // curves int max_enum = 0; // equations int max_hnum = 0; // histograms int max_inum = 0; // images int max_psdnum = 0; // psd int max_xnum = 0; // scalars int max_tnum = 0; // text string int max_mnum = 0; // matrix int max_plotnum = 0; // plots int max_lnum = 0; // legends int max_dnum = 0; // view item int max_dsnum = 0; // datasource } Kst-2.0.8/src/libkst/datasourcepluginmanager.h0000644000175000017500000000624012277111530020513 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_DATA_SOURCE_PLUGIN_MANAGER_H #define KST_DATA_SOURCE_PLUGIN_MANAGER_H #include "dataplugin.h" #include "sharedptr.h" #include "datasource.h" #include #include namespace Kst { class ObjectStore; class KSTCORE_EXPORT DataSourcePluginManager { public: static const QMap urlMap(); static void init(); static void cleanupForExit(); static void initPlugins(); /** Returns a list of plugins found on the system. */ static QStringList pluginList(); static QString pluginFileName(const QString& pluginName); static SharedPtr loadSource(ObjectStore *store, const QString& filename, const QString& type = QString()); static SharedPtr loadSource(ObjectStore *store, QDomElement& e); static SharedPtr findOrLoadSource(ObjectStore *store, const QString& filename); static bool validSource(const QString& filename); static bool sourceHasConfigWidget(const QString& filename, const QString& type = QString()); static DataSourceConfigWidget *configWidgetForSource(const QString& filename, const QString& type = QString()); static bool pluginHasConfigWidget(const QString& plugin); static DataSourceConfigWidget *configWidgetForPlugin(const QString& plugin); //static QStringList matrixListForSource(const QString& filename, const QString& type = QString(), QString *outType = 0L, bool *complete = 0L); static QStringList scalarListForSource(const QString& filename, const QString& type = QString(), QString *outType = 0L, bool *complete = 0L); static QStringList stringListForSource(const QString& filename, const QString& type = QString(), QString *outType = 0L, bool *complete = 0L); private: static QSettings& settingsObject(); static QMap url_map; static QString obtainFile(const QString& source); struct PluginSortContainer { SharedPtr plugin; int match; int operator<(const PluginSortContainer& x) const; int operator==(const PluginSortContainer& x) const; }; static QList bestPluginsForSource(const QString& filename, const QString& type); static DataSourcePtr findPluginFor(ObjectStore *store, const QString& filename, const QString& type, const QDomElement& e = QDomElement()); }; } #endif Kst-2.0.8/src/libkst/objectlist.cpp0000644000175000017500000000157712277111530016314 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "objectlist.h" // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datavector.cpp0000644000175000017500000005446412362705136016317 0ustar synthsynth/*************************************************************************** datavector.cpp - a vector which gets its data from a datasource. ------------------- begin : Fri Sep 22 2000 copyright : (C) 2000-2010 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * Permission is granted to link with any opensource library * * * ***************************************************************************/ #include "datavector.h" #include #include #include #include #include #include "datacollection.h" #include "debug.h" #include "datasource.h" #include "math_kst.h" #include "objectstore.h" #include "updatemanager.h" #include "vectorscriptinterface.h" // ReqNF <=0 means read from ReqF0 to end of File // ReqF0 < means start at EndOfFile-ReqNF. // // ReqNF ReqF0 Action // < 1 >=0 read from ReqF0 to end of file // < 1 < 0 illegal: fixed in checkIntegrity // 1 ?? illegal: fixed in checkIntegrity // > 1 < 0 read the last ReqNF frames from the file // > 1 >=0 Read ReqNF frames starting at frame ReqF0 namespace Kst { const QString DataVector::staticTypeString = "Data Vector"; const QString DataVector::staticTypeTag = "datavector"; const int INVALIDS_PER_RESET = 5; DataVector::DataInfo::DataInfo() : frameCount(-1), samplesPerFrame(-1) { } DataVector::DataInfo::DataInfo(int fc, int spf) : frameCount(fc), samplesPerFrame(spf) { } /** Create a DataVector: raw data from a file */ DataVector::DataVector(ObjectStore *store) : Vector(store), DataPrimitive(this) { _saveable = true; //_dontUseSkipAccel = false; _numSamples = 0; _scalars["sum"]->setValue(0.0); _scalars["sumsquared"]->setValue(0.0); F0 = NF = 0; // nothing read yet N_AveReadBuf = 0; AveReadBuf = 0L; ReqF0 = 0; ReqNF = -1; Skip = 1; DoSkip = false; DoAve = false; _invalidCount = 0; } const QString& DataVector::typeString() const { return staticTypeString; } /** return true if it has a valid file and field, or false otherwise */ bool DataVector::isValid() const { if (dataSource()) { dataSource()->readLock(); bool rc = dataSource()->vector().isValid(_field); dataSource()->unlock(); return rc; } return false; } ScriptInterface* DataVector::createScriptInterface() { return new VectorDataSI(this); } bool DataVector::checkValidity(const DataSourcePtr& ds) const { if (ds) { ds->readLock(); bool rc = ds->vector().isValid(_field); ds->unlock(); return rc; } return false; } void DataVector::change(DataSourcePtr in_file, const QString &in_field, int in_f0, int in_n, int in_skip, bool in_DoSkip, bool in_DoAve) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); Skip = in_skip; DoSkip = in_DoSkip; DoAve = in_DoAve; if (DoSkip && Skip < 1) { Skip = 1; } //_dontUseSkipAccel = false; setDataSource(in_file); ReqF0 = in_f0; ReqNF = in_n; _field = in_field; if (dataSource()) { dataSource()->writeLock(); } reset(); if (dataSource()) { dataSource()->unlock(); } if (ReqNF <= 0 && ReqF0 < 0) { ReqF0 = 0; } registerChange(); } qint64 DataVector::minInputSerial() const { if (dataSource()) { return (dataSource()->serial()); } return LLONG_MAX; } qint64 DataVector::maxInputSerialOfLastChange() const { if (dataSource()) { return (dataSource()->serialOfLastChange()); } return NoInputs; } void DataVector::changeFile(DataSourcePtr in_file) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(tr("Data file for vector %1 was not opened.").arg(Name()), Debug::Warning); } setDataSource(in_file); if (dataSource()) { dataSource()->writeLock(); } reset(); if (dataSource()) { dataSource()->unlock(); } registerChange(); } void DataVector::changeFrames(int in_f0, int in_n, int in_skip, bool in_DoSkip, bool in_DoAve) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { dataSource()->writeLock(); } reset(); if (dataSource()) { dataSource()->unlock(); } Skip = in_skip; DoSkip = in_DoSkip; DoAve = in_DoAve; if (DoSkip && Skip < 1) { Skip = 1; } ReqF0 = in_f0; ReqNF = in_n; if (ReqNF <= 0 && ReqF0 < 0) { ReqF0 = 0; } registerChange(); } void DataVector::setFromEnd() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); ReqF0 = -1; if (ReqNF < 2) { ReqNF = numFrames(); if (ReqNF < 2) { ReqF0 = 0; } } registerChange(); } DataVector::~DataVector() { if (AveReadBuf) { free(AveReadBuf); AveReadBuf = 0L; } } bool DataVector::readToEOF() const { return ReqNF <= 0; } bool DataVector::countFromEOF() const { return ReqF0 < 0; } /** Return Starting Frame of Vector */ int DataVector::startFrame() const { return F0; } /** Return frames per skip to read */ int DataVector::skip() const { return DoSkip ? Skip : 0; } bool DataVector::doSkip() const { return DoSkip; } bool DataVector::doAve() const { return DoAve; } /** Return frames held in Vector */ int DataVector::numFrames() const { return NF; } int DataVector::reqNumFrames() const { return ReqNF; } int DataVector::reqStartFrame() const { return ReqF0; } /** Save vector information */ void DataVector::save(QXmlStreamWriter &s) { if (dataSource()) { s.writeStartElement("datavector"); saveFilename(s); s.writeAttribute("field", _field); s.writeAttribute("start", QString::number(ReqF0)); s.writeAttribute("count", QString::number(ReqNF)); if (doSkip()) { s.writeAttribute("skip", QString::number(Skip)); if (doAve()) { s.writeAttribute("doAve", "true"); } } else { s.writeAttribute("skip", QString::number(-1)); s.writeAttribute("doAve", "false"); } s.writeAttribute("startUnits", startUnits()); s.writeAttribute("rangeUnits", rangeUnits()); saveNameInfo(s, VNUM|XNUM); s.writeEndElement(); } } /** * @brief Generate default label info for axis associated with this vector. * Use meta-scalars "units" or "quantity" if they are defined. * Escape special characters in the field name. * * @return LabelInfo **/ LabelInfo DataVector::labelInfo() const { LabelInfo label_info; if (_fieldStrings.contains("quantity")) { label_info.quantity = _fieldStrings.value("quantity")->value(); label_info.quantity.replace('[', "\\[").replace(']', "\\]"); } else { label_info.quantity.clear(); } if (_fieldStrings.contains("units")) { label_info.units = _fieldStrings.value("units")->value(); label_info.units.replace('[', "\\[").replace(']', "\\]"); } else { label_info.units.clear(); } label_info.name = descriptiveName();// _field; label_info.file = filename(); return label_info; } void DataVector::reset() { // must be called with a lock Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); //_dontUseSkipAccel = false; if (dataSource()) { SPF = dataInfo(_field).samplesPerFrame; } F0 = NF = 0; resize(0); _numSamples = 0; _dirty = true; _resetFieldMetadata(); Object::reset(); } bool DataVector::checkIntegrity() { if (DoSkip && Skip < 1) { Skip = 1; } if (_dirty) { reset(); } // if the file seems to have shrunk/changed, return false. // if it has happened several times in a row, assume the // file has been over-written, and re-read it. // this is a hack to handle glitchy file system situations. // TODO: there has to be a better way. const DataInfo info = dataInfo(_field); if (dataSource() && (SPF != info.samplesPerFrame || info.frameCount < NF)) { _invalidCount++; if (_invalidCount>INVALIDS_PER_RESET) { reset(); _invalidCount=0; } return false; } // check for illegal NF and F0 values if (ReqNF < 1 && ReqF0 < 0) { ReqF0 = 0; // for this illegal case, read the whole file } if (ReqNF == 1) { ReqNF = 2; } _invalidCount = 0; return true; } // Some things to consider about the following routine... // Frames: // Some data sources have data divided into frames. Each field // has a fixed number of samples per frame. For some (eg, ascii files) // each frame has 1 sample. For others (eg, dirfiles) you may have more. // Different fields in the same data source may have different samples per frame. // Within a data source, it is assumed that the first sample of each frame is // simultaneous between fields. // Last Frame Read: // Only read the first sample of the last frame read, in cases where there are more // than one sample per frame. This allows for more sensible association of vectors // into curves, when the X and Y vectors have different numbers of samples per frame. // The rule is that we assume is that the first sample of each frame is simultaneous. // Skip reading: // -'Skip' means read 1 sample each 'Skip' frames (not read one sample, // then skip 'Skip' samples or something else). // -In order that the data are not re-drawn each time a new sample arrives, and to // ensure the re-usability (via shifting) of previously read data, and to make a // region of data look the same regardless of the chouse of f0, all samples // read with skip enabled are read on 'skip boundries'... ie, the first samples of // frame 0, Skip, 2*Skip... N*skip, and never M*Skip+1. void DataVector::internalUpdate() { int i, k, shift, n_read=0; int ave_nread; int new_f0, new_nf; bool start_past_eof = false; if (dataSource()) { dataSource()->writeLock(); } else { return; } const DataInfo info = dataInfo(_field); if (!checkIntegrity()) { if (dataSource()) { dataSource()->unlock(); } return; } if (DoSkip && Skip < 2 && SPF == 1) { DoSkip = false; } // set new_nf and new_f0 int fc = info.frameCount; if (ReqNF < 1) { // read to end of file new_f0 = ReqF0; new_nf = fc - new_f0; } else if (ReqF0 < 0) { // count back from end of file new_nf = fc; if (new_nf > ReqNF) { new_nf = ReqNF; } new_f0 = fc - new_nf; } else { new_f0 = ReqF0; new_nf = ReqNF; if (new_f0 + new_nf > fc) { new_nf = fc - new_f0; } if (new_nf <= 0) { // Tried to read starting past the end. new_f0 = 0; new_nf = 1; start_past_eof = true; } } if (DoSkip) { // in count from end mode, change new_f0 and new_nf so they both lie on skip boundaries if ((new_f0 != 0) && (ReqF0<0)) { new_f0 = ((new_f0-1)/Skip+1)*Skip; } new_nf = (new_nf/Skip)*Skip; } // shift vector if necessary if (new_f0 < F0 || new_f0 >= F0 + NF) { // No useful data around. reset(); } else { // shift stuff rather than re-read if (DoSkip) { shift = (new_f0 - F0)/Skip; NF -= (new_f0 - F0); _numSamples = NF/Skip; } else { shift = SPF*(new_f0 - F0); NF -= (new_f0 - F0); //_numSamples = (NF-1)*SPF; if (shift > 0) { if (SPF == 1) { _numSamples = NF; } else { _numSamples = (NF-1)*SPF; } } } memmove(_v, _v+shift, _numSamples*sizeof(double)); } if (DoSkip) { // reallocate V if necessary if (new_nf / Skip != _size) { if (! resize(new_nf/Skip)) { // TODO: Is aborting all we can do? fatalError("Not enough memory for vector data"); return; } } // FIXME maybe. // -skip acceleration is not supported by any current data sources. // -there is no API implemented to report if a data source implements skip accel // so: for now, just say it isn't supported here. Fix if we ever implement a data source // where skip accel is important (eg, planck HFI...) #if 0 _dontUseSkipAccel = true; if (!_dontUseSkipAccel) { // ie, use skip accel. Not used. int rc; int lastRead = -1; if (DoAve) { // We don't support boxcar inside data sources yet. _dontUseSkipAccel = true; } else { rc = readField(_v + _numSamples, _field, new_f0, (new_nf - NF)/Skip, Skip, &lastRead); if (rc != -9999) { if (rc >= 0) { n_read = rc; } else { n_read = 0; } } else { _dontUseSkipAccel = true; } } } #endif // if (_dontUseSkipAccel) { n_read = 0; /** read each sample from the File */ double *t = _v + _numSamples; int new_nf_Skip = new_nf - Skip; if (DoAve) { for (i = NF; new_nf_Skip >= i; i += Skip) { /* enlarge AveReadBuf if necessary */ if (N_AveReadBuf < Skip*SPF) { N_AveReadBuf = Skip*SPF; if (!kstrealloc(AveReadBuf, N_AveReadBuf*sizeof(double))) { qCritical() << "Vector resize failed"; } if (!AveReadBuf) { // FIXME: handle failed resize } } ave_nread = readField(AveReadBuf, _field, new_f0+i, Skip); for (k = 1; k < ave_nread; ++k) { AveReadBuf[0] += AveReadBuf[k]; } if (ave_nread > 0) { *t = AveReadBuf[0]/double(ave_nread); n_read++; } ++t; } } else { for (i = NF; new_nf_Skip >= i; i += Skip) { n_read += readField(t++, _field, new_f0 + i, -1); } } // } // end if _dontUseSkipAccel } else { // reallocate V if necessary if ((new_nf - 1)*SPF + 1 != _size) { if (!resize((new_nf - 1)*SPF + 1)) { // TODO: Is aborting all we can do? fatalError("Not enough memory for vector data"); return; } } //if (NF > 0) { // NF--; /* last frame read was only partially read... */ //} // read the new data from file if (start_past_eof) { _v[0] = NOPOINT; n_read = 1; } else if (info.samplesPerFrame > 1) { if (NF>0) { NF--; /* last frame read was only partially read... */ } int safe_nf = (new_nf>0 ? new_nf : 0); assert(new_f0 + NF >= 0); //assert(new_f0 + safe_nf - 1 >= 0); if ((new_f0 + safe_nf - 1 >= 0) && (safe_nf - NF > 1)) { n_read = readField(_v+NF*SPF, _field, new_f0 + NF, safe_nf - NF - 1); n_read += readField(_v+(safe_nf-1)*SPF, _field, new_f0 + safe_nf - 1, -1); } } else { assert(new_f0 + NF >= 0); if (new_nf - NF > 0 || new_nf - NF == -1) { n_read = readField(_v+NF*SPF, _field, new_f0 + NF, new_nf - NF); } } } NumNew = _size - _numSamples; NF = new_nf; F0 = new_f0; _numSamples += n_read; // if for some reason (eg, realtime reading an nfs mounted // dirfile) not all of the data was read, the data will never // be read; the samples will be filled in with the last data // point read, and a complete reset will be requested. // This is bad - I think it will be worthwhile // to add blocking w/ timeout to KstFile. // As a first fix, mount all nsf mounted dirfiles with "-o noac" _dirty = false; if (_numSamples != _size && !(_numSamples == 0 && _size == 1)) { _dirty = true; for (i = _numSamples; i < _size; ++i) { _v[i] = _v[0]; } } if (NumNew > _size) { NumNew = _size; } if (NumShifted > _size) { NumShifted = _size; } if (dataSource()) { dataSource()->unlock(); } if (n_read>0) { Vector::internalUpdate(); } } QByteArray DataVector::scriptInterface(QList &c) { Q_ASSERT(c.size()); if(c[0]=="changeFrames") { // int f0, int n, int skip, bool in_doSkip, bool in_doAve; if(c.size()!=6) { return QByteArray("Bad parameter count (!=5)."); } changeFrames(c[1].toInt(),c[2].toInt(),c[3].toInt(),(c[4]=="true")?1:0,(c[5]=="true")?1:0); return QByteArray("Done."); } else if(c[0]=="numFrames") { return QByteArray::number(numFrames()); } else if(c[0]=="startFrame") { return QByteArray::number(startFrame()); } else if(c[0]=="doSkip") { return QByteArray(doSkip()?"true":"false"); } else if(c[0]=="doAve") { return QByteArray(doAve()?"true":"false"); } else if(c[0]=="skip") { return QByteArray::number(skip()); } else if(c[0]=="reload") { reload(); return QByteArray("Done"); } else if(c[0]=="samplesPerFrame") { return QByteArray::number(samplesPerFrame()); } else if(c[0]=="fileLength") { return QByteArray::number(fileLength()); } else if(c[0]=="readToEOF") { return QByteArray(readToEOF()?"true":"false"); } else if(c[0]=="countFromEOF") { return QByteArray(countFromEOF()?"true":"false"); } else if(c[0]=="descriptionTip") { return QByteArray(descriptionTip().toLatin1()); } else if(c[0]=="isValid") { return isValid()?"true":"false"; } return "No such command..."; } /** Returns intrinsic samples per frame */ int DataVector::samplesPerFrame() const { return SPF; } int DataVector::fileLength() const { if (dataSource()) { int rc = dataInfo(_field).frameCount; return rc; } return 0; } void DataVector::reload() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { dataSource()->writeLock(); dataSource()->reset(); dataSource()->unlock(); reset(); _resetFieldMetadata(); registerChange(); } } void DataVector::_resetFieldMetadata() { _resetFieldScalars(); _resetFieldStrings(); } void DataVector::_resetFieldStrings() { const QMap meta_strings = dataSource()->vector().metaStrings(_field); QStringList fieldStringKeys = _fieldStrings.keys(); // remove field strings that no longer need to exist readLock(); for (int i=0; i it(meta_strings); while (it.hasNext()) { it.next(); QString key = it.key(); StringPtr sp; if (!_fieldStrings.contains(key)) { // insert a new one _strings.insert(key, sp = store()->createObject()); _fieldStrings.insert(key, sp); sp->setProvider(this); sp->setSlaveName(key); } else { // find it sp = _fieldStrings[key]; } sp->setValue(it.value()); } unlock(); } void DataVector::_resetFieldScalars() { const QMap meta_scalars = dataSource()->vector().metaScalars(_field); QStringList fieldScalarKeys = _fieldScalars.keys(); // remove field scalars that no longer need to exist readLock(); for (int i=0; i it(meta_scalars); while (it.hasNext()) { it.next(); QString key = it.key(); ScalarPtr sp; if (!_fieldScalars.contains(key)) { // insert a new one _scalars.insert(key, sp = store()->createObject()); _fieldScalars.insert(key, sp); sp->setProvider(this); sp->setSlaveName(key); } else { // find it sp = _fieldScalars[key]; } sp->setValue(it.value()); } unlock(); } PrimitivePtr DataVector::makeDuplicate() const { Q_ASSERT(store()); DataVectorPtr vector = store()->createObject(); vector->writeLock(); vector->change(dataSource(), _field, ReqF0, ReqNF, Skip, DoSkip, DoAve); if (descriptiveNameIsManual()) { vector->setDescriptiveName(descriptiveName()); } vector->registerChange(); vector->unlock(); return kst_cast(vector); } QString DataVector::_automaticDescriptiveName() const { QString name; name = _field; // un-escape escaped special characters so they aren't escaped 2x. name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]"); // now escape the special characters. name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); return name; } QString DataVector::descriptionTip() const { QString IDstring; //QString range_string; IDstring = tr( "Data Vector: %1\n" " %2\n" " Field: %3" ).arg(Name()).arg(dataSource()->fileName()).arg(_field); if (countFromEOF()) { IDstring += tr("\n Last %1 frames.").arg(numFrames()); } else if (readToEOF()) { IDstring += tr("\n Frame %1 to end.").arg(startFrame()); } else { IDstring += tr("\n %1 Frames starting at %2.").arg(numFrames()).arg(startFrame()); } if (skip()) { if (!doAve()) { IDstring+=tr("\n Read 1 sample per %1 frames.").arg(skip()); } else { IDstring+=tr("\n Average each %1 frames.").arg(skip()); } } return IDstring; } QString DataVector::propertyString() const { return tr("%2 F0: %3 N: %4 of %1", "%2 is a variable name. F0 is short for the first element. N is the number of elements").arg(dataSource()->fileName()).arg(_field).arg(startFrame()).arg(numFrames()); } int DataVector::readField(double *v, const QString& field, int s, int n, int skip) { ReadInfo par = {v, s, n, skip}; return dataSource()->vector().read(field, par); } const DataVector::DataInfo DataVector::dataInfo(const QString& field) const { dataSource()->readLock(); const DataInfo info = dataSource()->vector().dataInfo(field); dataSource()->unlock(); return info; } bool DataVector::isTime() const { return dataSource()->isTime(_field); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/string_kst.cpp0000644000175000017500000000541312320547027016335 0ustar synthsynth/*************************************************************************** string.cpp - the base string type ------------------- begin : Sept 29, 2004 copyright : (C) 2004 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "string_kst.h" #include "stringscriptinterface.h" #include #include namespace Kst { const QString String::staticTypeString = "String"; const QString String::staticTypeTag = "string"; String::String(ObjectStore *store) : Primitive(store, 0L), _orphan(false), _editable(false) { _value.clear(); setFlag(true); _initializeShortName(); } ScriptInterface* String::createScriptInterface() { return new StringGenSI(this); } void String::_initializeShortName() { _shortName = 'T'+QString::number(_tnum); if (_tnum>max_tnum) max_tnum = _tnum; _tnum++; } String::~String() { } const QString& String::typeString() const { return staticTypeString; } void String::save(QXmlStreamWriter &s) { if (provider()) { // Don't save datasource- or vector-derived strings return; } s.writeStartElement("string"); if (_orphan) { s.writeAttribute("orphan", "true"); } if (_editable) { s.writeAttribute("editable", "true"); } s.writeAttribute("value", value()); saveNameInfo(s, TNUM); s.writeEndElement(); } void String::internalUpdate() { // do nothing } String& String::operator=(const QString& v) { setValue(v); return *this; } String& String::operator=(const char *v) { setValue(v); return *this; } void String::setValue(const QString& inV) { _value = inV; } QString String::_automaticDescriptiveName() const { if (_orphan) { return value(); } else { return Primitive::_automaticDescriptiveName(); } } QString String::descriptionTip() const { return tr("String: %1").arg(Name()); } QString String::sizeString() const { return QString::number(_value.size()); } QString String::propertyString() const { return _value; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/updateserver.cpp0000644000175000017500000000320312277111530016647 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2013 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "updateserver.h" #include namespace Kst { UpdateServer *UpdateServer::_self = UpdateServer::self(); UpdateServer* UpdateServer::self() { if (!_self) { _self = new UpdateServer; qAddPostRoutine(UpdateServer::cleanup); } return _self; } void UpdateServer::cleanup() { delete _self; _self = 0; } UpdateServer::UpdateServer(): _signalSuspendDepthCounter(0) { } UpdateServer::~UpdateServer() { } void UpdateServer::endSuspendSignals() { if (_signalSuspendDepthCounter>0) { _signalSuspendDepthCounter--; } if (_signalRequested) { requestUpdateSignal(); } } void UpdateServer::requestUpdateSignal() { if (_signalSuspendDepthCounter==0) { emit objectListsChanged(); _signalRequested = false; } else { _signalRequested = true; } } } Kst-2.0.8/src/libkst/vectorscriptinterface.h0000644000175000017500000000365112362705136020230 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef VECTORSCRIPTINTERFACE_H #define VECTORSCRIPTINTERFACE_H #include #include "scriptinterface.h" #include "datavector.h" #include "generatedvector.h" namespace Kst { class KSTCORE_EXPORT VectorDataSI : public ScriptInterface { Q_OBJECT DataVectorPtr vector; public: explicit VectorDataSI(DataVectorPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newVector(ObjectStore *store); }; class KSTCORE_EXPORT VectorGenSI : public ScriptInterface { Q_OBJECT GeneratedVectorPtr vector; public: explicit VectorGenSI(GeneratedVectorPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newVector(ObjectStore *store); }; class KSTCORE_EXPORT VectorSI : public ScriptInterface { Q_OBJECT VectorPtr vector; public: explicit VectorSI(VectorPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newVector(ObjectStore *); }; } #endif // VECTORSCRIPTINTERFACE_H Kst-2.0.8/src/libkst/datasourcefactory.h0000644000175000017500000000303212277111530017325 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASOURCEFACTORY_H #define DATASOURCEFACTORY_H #include #include #include "datasource.h" #include "kst_export.h" namespace Kst { class ObjectStore; class KSTCORE_EXPORT DataSourceFactory { public: DataSourceFactory(); virtual ~DataSourceFactory(); // This takes ownership static void registerFactory(const QString& node, DataSourceFactory *factory); static void registerFactory(const QStringList& nodes, DataSourceFactory *factory); static DataSourcePtr parse(ObjectStore *store, QXmlStreamReader& stream); virtual DataSourcePtr generateDataSource(ObjectStore *store, QXmlStreamReader& stream) = 0; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/objectstore.h0000644000175000017500000000777112320547027016147 0ustar synthsynth/*************************************************************************** objectstore.h: store of Objects ------------------- begin : November 22, 2006 copyright : (C) 2006-2010 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef OBJECTSTORE_H #define OBJECTSTORE_H #include #include "kst_export.h" #include "object.h" #include "objectlist.h" #include "rwlock.h" #include "datasource.h" namespace Kst { class ObjectNameIndex; // The ObjectStore is responsible for storing all the Objects in an // application. class KSTCORE_EXPORT ObjectStore { public: ObjectStore(); ~ObjectStore(); template SharedPtr createObject(); template bool addObject(T *o); bool removeObject(Object *o); ObjectPtr retrieveObject(const QString& name) const; bool isEmpty() const; void clear(); /** get a list containing only objects of type T in the object store ** T must inherit from Kst::Object */ template const ObjectList getObjects() const; /** get just the data sources */ DataSourceList dataSourceList() const; /** Close all data sources, and reopen ones that are needed */ void rebuildDataSourceList(); /** remove unused data sources from the list */ void cleanUpDataSourceList(); /** reset dependents of a data source */ void resetDataSourceDependents(QString filename); /** get everything but the data sources */ QList objectList(); /** locking */ KstRWLock& lock() const { return _lock; } /** clear the 'used' flag on all objects in list */ void clearUsedFlags(); /** delete everything that doesn't have the used flag set. * Note: the caller is responsible to make sure that the * used flags are set properly. It is not done here! */ bool deleteUnsetUsedFlags(); // void deleteDependentObjects(const Primitive &p); // some variables for overriding data source properties // from the command line when opening a .kst file struct { QString fileName; int f0; int N; int skip; int doAve; } override; private: Q_DISABLE_COPY(ObjectStore) mutable KstRWLock _lock; // objects are stored in these lists DataSourceList _dataSourceList; QList _list; }; // this is an inefficient implementation for now template const ObjectList ObjectStore::getObjects() const { KstReadLocker l(&(this->_lock)); ObjectList rc; for (QList::ConstIterator it = _list.begin(); it != _list.end(); ++it) { SharedPtr x = kst_cast(*it); if (x != 0) { rc.append(x); } } return rc; } template SharedPtr ObjectStore::createObject() { KstWriteLocker l(&(this->_lock)); T *object = new T(this); addObject(object); return SharedPtr(object); } // Add an object to the store. template bool ObjectStore::addObject(T *o) { if (!o) { return false; } KstWriteLocker l(&this->_lock); o->_store = this; // put the object in the right place depending on its type if (DataSourcePtr ds = kst_cast(o)) { _dataSourceList.append(ds); } else { _list.append(o); } return true; } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/extension.cpp0000644000175000017500000000274712277111530016166 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // include files for KDE // application specific includes #include "extension.h" #include #include namespace Kst { Extension::Extension(QObject *parent, const QStringList&) : QObject(parent) { } Extension::~Extension() { emit unregister(); } void Extension::load(const QDomElement& e) { Q_UNUSED(e) } void Extension::save(QTextStream& ts, const QString& indent) { Q_UNUSED(ts) Q_UNUSED(indent) } void Extension::clear() { } QMainWindow* Extension::app() const { return qobject_cast(parent()); } void Extension::processArguments(const QString& args) { Q_UNUSED(args) } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/namedobject.h0000644000175000017500000001217512277111530016066 0ustar synthsynth/*************************************************************************** namedobject.h: adds naming features to objects... ------------------- begin : May 29, 2008 copyright : (C) 2008 C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ // name system: see object names devel doc for intended behavior #ifndef NAMEDOBJECT_H #define NAMEDOBJECT_H #include #include #include #include "kst_export.h" namespace Kst { // short name index variables KSTCORE_EXPORT extern int _vnum; // vectors KSTCORE_EXPORT extern int _pnum; // plugins KSTCORE_EXPORT extern int _csdnum; // csd KSTCORE_EXPORT extern int _cnum; // curves KSTCORE_EXPORT extern int _enum; // equations KSTCORE_EXPORT extern int _hnum; // histograms KSTCORE_EXPORT extern int _inum; // images KSTCORE_EXPORT extern int _psdnum; // psd KSTCORE_EXPORT extern int _xnum; // scalars KSTCORE_EXPORT extern int _tnum; // text string KSTCORE_EXPORT extern int _mnum; // matrix KSTCORE_EXPORT extern int _plotnum; // plot item KSTCORE_EXPORT extern int _lnum; // legend KSTCORE_EXPORT extern int _dnum; // view item (drawable) KSTCORE_EXPORT extern int _dsnum; // datasource KSTCORE_EXPORT extern int max_vnum; // vectors KSTCORE_EXPORT extern int max_pnum; // plugins KSTCORE_EXPORT extern int max_csdnum; // csd KSTCORE_EXPORT extern int max_cnum; // curves KSTCORE_EXPORT extern int max_enum; // equations KSTCORE_EXPORT extern int max_hnum; // histograms KSTCORE_EXPORT extern int max_inum; // images KSTCORE_EXPORT extern int max_psdnum; // psd KSTCORE_EXPORT extern int max_xnum; // scalars KSTCORE_EXPORT extern int max_tnum; // string KSTCORE_EXPORT extern int max_mnum; // matrix KSTCORE_EXPORT extern int max_plotnum; // plot item KSTCORE_EXPORT extern int max_lnum; // legend KSTCORE_EXPORT extern int max_dnum; // view item KSTCORE_EXPORT extern int max_dsnum; // datasource struct SizeCache { int nameWidthPixels; int fontSize; QString name; }; KSTCORE_EXPORT void resetNameIndexes(); class KSTCORE_EXPORT NamedObject { public: NamedObject(); virtual ~NamedObject(); enum ShortNameIndex { VNUM = 0x0001, PNUM = 0x0002, CSDNUM = 0x0004, CNUM = 0x0008, ENUM = 0x0010, HNUM = 0x0020, INUM = 0x0040, PSDNUM = 0x0080, XNUM = 0x0100, TNUM = 0x0200, MNUM = 0x0400, PLOTNUM= 0x0800, LNUM = 0x1000, DNUM = 0x2000, DSNUM = 0x4000 }; // name system: see object names devel doc QString Name() const; // eg GYRO1 (V1) QString CleanedName() const; // all \_ replaced with _ QString descriptiveName() const; // eg GYRO1: automatic or manual QString shortName() const; // eg V1: always automatically generated QString lengthLimitedName(int length = 20) const; // Name, but with descriptiveName truncated QString sizeLimitedName(const QFont&font,const int&width) const; // Name, shrunk to fit in width with font QString sizeLimitedName(const QWidget *widget) const; // Name, shrunk to fit in widget virtual QString descriptionTip() const = 0; // description for tooltips void setDescriptiveName(QString new_name); // auto if new_name.isEmpty() bool descriptiveNameIsManual() const; static void processShortNameIndexAttributes(QXmlStreamAttributes &attrs); // Reset all name indexes. Should only be used by ObjectStore when clearing the store entirely. static void resetNameIndex(); protected: virtual QString _automaticDescriptiveName() const= 0; virtual void _initializeShortName() = 0; QString _manualDescriptiveName; QString _shortName; virtual void saveNameInfo(QXmlStreamWriter &s, unsigned I = 0xffff); // object indices used for saving/resorting shortnames int _initial_vnum; // vectors int _initial_pnum; // plugins int _initial_csdnum; // csd int _initial_cnum; // curves int _initial_enum; // equations int _initial_hnum; // histograms int _initial_inum; // images int _initial_psdnum; // psd int _initial_xnum; // scalars int _initial_tnum; // text string int _initial_mnum; // matrix int _initial_plotnum; // plot item int _initial_lnum; // legend int _initial_dnum; // view item int _initial_dsnum; // datasource private: SizeCache *_sizeCache; }; KSTCORE_EXPORT bool shortNameLessThan(NamedObject *n1, NamedObject *n2); } #endif Kst-2.0.8/src/libkst/generatedvector.h0000644000175000017500000000367112320547027017000 0ustar synthsynth/*************************************************************************** generatedvector.h - a vector from x0 to x1 with n pts ------------------- begin : March, 2005 copyright : (C) 2005 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef GENERATEDVECTOR_H #define GENERATEDVECTOR_H #include "vector.h" // #include "kst_export.h" namespace Kst { /**A vector from x0 to x1 with n pts *@author cbn */ class KSTCORE_EXPORT GeneratedVector : public Vector { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; void save(QXmlStreamWriter &s); void changeRange(double x0, double x1, int n); void setSaveData(bool save); virtual QString descriptionTip() const; virtual QString propertyString() const; virtual ScriptInterface* createScriptInterface(); protected: GeneratedVector(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; }; typedef SharedPtr GeneratedVectorPtr; typedef ObjectList GeneratedVectorList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/scalarfactory.cpp0000644000175000017500000001405712277111530017004 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "scalarfactory.h" #include "debug.h" #include "scalar.h" #include "datascalar.h" #include "vscalar.h" #include "objectstore.h" #include "datasourcepluginmanager.h" namespace Kst { ScalarFactory::ScalarFactory() : PrimitiveFactory() { registerFactory(Scalar::staticTypeTag, this); } ScalarFactory::~ScalarFactory() { } PrimitivePtr ScalarFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QString descriptiveName; Q_ASSERT(store); bool orphan = true; bool editable = true; bool hidden = false; double value=0.0; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == Scalar::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); value = attrs.value("value").toString().toDouble(); orphan = attrs.value("orphan").toString() != "false" ? true : false; editable = attrs.value("editable").toString() != "false" ? true : false; hidden = attrs.value("hidden").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == "scalar") { break; } else { Debug::self()->log(QObject::tr("Error creating scalar from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } ScalarPtr scalar = store->createObject(); scalar->setValue(value); scalar->setOrphan(orphan); scalar->setHidden(hidden); scalar->setEditable(editable); scalar->setDescriptiveName(descriptiveName); return scalar; } //////////////////////////////////////// DataScalarFactory::DataScalarFactory() : PrimitiveFactory() { registerFactory(DataScalar::staticTypeTag, this); } DataScalarFactory::~DataScalarFactory() { } PrimitivePtr DataScalarFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QString descriptiveName; Q_ASSERT(store); QString provider, file, field; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == DataScalar::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); provider = attrs.value("provider").toString(); file = DataPrimitive::readFilename(attrs); field = attrs.value("field").toString(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == DataScalar::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating scalar from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } Q_ASSERT(store); DataSourcePtr dataSource = DataSourcePluginManager::findOrLoadSource(store, file); if (!dataSource) { return 0; //Couldn't find a suitable datasource } DataScalarPtr scalar = store->createObject(); scalar->writeLock(); scalar->change(dataSource, field); scalar->setDescriptiveName(descriptiveName); scalar->registerChange(); scalar->unlock(); return scalar; } //////////////////////////////////////// VScalarFactory::VScalarFactory() : PrimitiveFactory() { registerFactory(VScalar::staticTypeTag, this); } VScalarFactory::~VScalarFactory() { } PrimitivePtr VScalarFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QString descriptiveName; Q_ASSERT(store); QString provider, file, field; int f0=0; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == VScalar::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); provider = attrs.value("provider").toString(); file = DataPrimitive::readFilename(attrs); field = attrs.value("field").toString(); f0 = attrs.value("f0").toString().toInt(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == VScalar::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating scalar from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } Q_ASSERT(store); DataSourcePtr dataSource = DataSourcePluginManager::findOrLoadSource(store, file); if (!dataSource) { return 0; //Couldn't find a suitable datasource } VScalarPtr scalar = store->createObject(); scalar->writeLock(); scalar->change(dataSource, field, f0); scalar->setDescriptiveName(descriptiveName); scalar->registerChange(); scalar->unlock(); return scalar; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/editablevector.cpp0000644000175000017500000000604312362705136017145 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "editablevector.h" // use KCodecs::base64Encode() in kmdcodecs.h // Create QDataStream into a QByteArray // qCompress the bytearray #include #include "debug.h" namespace Kst { const QString EditableVector::staticTypeString = "Editable Vector"; const QString EditableVector::staticTypeTag = "editablevector"; EditableVector::EditableVector(ObjectStore *store) : Vector(store), _sum(0.0) { _editable = true; _saveable = true; _saveData = true; } const QString& EditableVector::typeString() const { return staticTypeString; } void EditableVector::setSaveData(bool save) { Q_UNUSED(save) } void EditableVector::setValue(const int &i, const double &val) { //sa Vector::change(...) writeLock(); Q_ASSERT(i>=0); if(i>_size) { resize(i,1); } _scalars["sum"]->setValue(_sum+val-_v[i]); _scalars["sumsquared"]->setValue(_sum*_sum); _scalars["max"]->setValue(qMax(_max,val)); _scalars["min"]->setValue(qMin(_min,_min)); double b=(float)(qMax((float)0.0f,(float)_minPos)); _scalars["minpos"]->setValue(qMin(_min,b)); _scalars["last"]->setValue(_v[_size-1]); _scalars["first"]->setValue(_v[0]); _v[i]=val; unlock(); } /** Save vector information */ void EditableVector::save(QXmlStreamWriter &s) { s.writeStartElement("editablevector"); saveNameInfo(s, VNUM|XNUM); if (_saveData) { QByteArray qba(length()*sizeof(double), '\0'); QDataStream qds(&qba, QIODevice::WriteOnly); for (int i = 0; i < length(); i++) { qds << _v[i]; } s.writeTextElement("data", qCompress(qba).toBase64()); } s.writeEndElement(); } QString EditableVector::_automaticDescriptiveName() const { QString name("("); if (length()>=1) { name += QString::number(_v[0]); } if (length()>=2) { name += ", " + QString::number(_v[1]); } if (length()>=3) { name += ", ..."; } name += ')'; return name; } QString EditableVector::descriptionTip() const { return tr("Editable Vector: %1\n" " %2 values").arg(Name()).arg(length()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datascalar.cpp0000644000175000017500000001146112320547027016245 0ustar synthsynth/*************************************************************************** datastscalar.cpp - a scalar from a data source ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datascalar.h" #include #include #include #include "debug.h" #include "objectstore.h" #include "scalarscriptinterface.h" namespace Kst { const QString DataScalar::staticTypeString = "Data Scalar"; const QString DataScalar::staticTypeTag = "datascalar"; /** Create a DataVector: raw data from a file */ DataScalar::DataScalar(ObjectStore *store) : Scalar(store), DataPrimitive(this) { setOrphan(true); } DataScalar::~DataScalar() { } QString DataScalar::_automaticDescriptiveName() const { QString name = _field; // un-escape escaped special characters so they aren't escaped 2x. name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]"); // now escape the special characters. name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); return name; } const QString& DataScalar::typeString() const { return staticTypeString; } ScriptInterface* DataScalar::createScriptInterface() { return new ScalarDataSI(this); } /** return true if it has a valid file and field, or false otherwise */ bool DataScalar::isValid() const { if (dataSource()) { dataSource()->readLock(); bool rc = dataSource()->scalar().isValid(_field); dataSource()->unlock(); return rc; } return false; } bool DataScalar::checkValidity(const DataSourcePtr& ds) const { if (ds) { ds->readLock(); bool rc = ds->scalar().isValid(_field); ds->unlock(); return rc; } return false; } void DataScalar::change(DataSourcePtr in_file, const QString &in_field) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); _field = in_field; setDataSource(in_file); } void DataScalar::changeFile(DataSourcePtr in_file) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(tr("Data file for scalar %1 was not opened.").arg(Name()), Debug::Warning); } setDataSource(in_file); } /** Save data scalar information */ void DataScalar::save(QXmlStreamWriter &s) { if (dataSource()) { s.writeStartElement("datascalar"); saveFilename(s); s.writeAttribute("field", _field); saveNameInfo(s, XNUM); s.writeEndElement(); } } /** Update a data Scalar */ void DataScalar::internalUpdate() { if (dataSource()) { dataSource()->writeLock(); ReadInfo readInfo(&_value); dataSource()->scalar().read(_field, readInfo); dataSource()->unlock(); } } PrimitivePtr DataScalar::makeDuplicate() const { Q_ASSERT(store()); DataScalarPtr scalar = store()->createObject(); scalar->writeLock(); scalar->change(dataSource(), _field); if (descriptiveNameIsManual()) { scalar->setDescriptiveName(descriptiveName()); } scalar->registerChange(); scalar->unlock(); return kst_cast(scalar); } qint64 DataScalar::minInputSerial() const { if (dataSource()) { return (dataSource()->serial()); } return LLONG_MAX; } qint64 DataScalar::maxInputSerialOfLastChange() const { if (dataSource()) { return (dataSource()->serialOfLastChange()); } return NoInputs; } QString DataScalar::descriptionTip() const { QString IDstring; IDstring = tr( "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" ).arg(Name()).arg(dataSource()->fileName()).arg(_field).arg(value()); return IDstring; } QString DataScalar::propertyString() const { return tr("%2 of %1 = %3").arg(dataSource()->fileName()).arg(_field).arg(value()); } void DataScalar::reload() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { dataSource()->writeLock(); dataSource()->reset(); dataSource()->unlock(); reset(); registerChange(); } } void DataScalar::reset() { ReadInfo readInfo(&_value); dataSource()->scalar().read(_field, readInfo); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/string_kst.h0000644000175000017500000000547712320547027016014 0ustar synthsynth/*************************************************************************** string.h - the base string type ------------------- begin : Sept 29, 2004 copyright : (C) 2004 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STRING_H #define STRING_H #include "primitive.h" class QXmlStreamWriter; namespace Kst { class ScriptInterface; class KSTCORE_EXPORT String : public Primitive { Q_OBJECT Q_PROPERTY(bool orphan READ orphan WRITE setOrphan) public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; virtual QString descriptionTip() const; virtual QString sizeString() const; virtual QString propertyString() const; virtual ScriptInterface* createScriptInterface(); protected: String(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); public: /** Update the string. */ virtual void internalUpdate(); virtual ~String(); /** Save information */ void save(QXmlStreamWriter &s); String& operator=(const QString& v); String& operator=(const char *v); virtual ObjectList outputPrimitives() const { return ObjectList(); } virtual PrimitiveMap metas() const { return PrimitiveMap(); } public slots: /* return the value of the string */ const QString& value() const { return _value; } /** Set the value of the string - ignored for some types */ void setValue(const QString& inV); bool orphan() const { return _orphan; } void setOrphan(bool orphan) { _orphan = orphan; } bool editable() const { return _editable; } void setEditable(bool editable) { _editable = editable; } protected: QString _value; private: bool _orphan : 1; bool _editable; }; typedef SharedPtr StringPtr; typedef ObjectList StringList; typedef ObjectMap StringMap; } Q_DECLARE_METATYPE(Kst::String*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/generatedmatrix.cpp0000644000175000017500000000671612277111530017335 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "generatedmatrix.h" #include #include #include #include namespace Kst { const QString GeneratedMatrix::staticTypeString = "Generated Matrix"; const QString GeneratedMatrix::staticTypeTag = "generatedmatrix"; GeneratedMatrix::GeneratedMatrix(ObjectStore *store) : Matrix(store) { _saveable = true; _editable = true; _zSize = 0; change(1, 0, 0, 0, 1, 1, 0, 1, true); } const QString& GeneratedMatrix::typeString() const { return staticTypeString; } void GeneratedMatrix::save(QXmlStreamWriter &xml) { xml.writeStartElement(staticTypeTag); xml.writeAttribute("xmin", QString::number(minX())); xml.writeAttribute("ymin", QString::number(minY())); xml.writeAttribute("nx", QString::number(xNumSteps())); xml.writeAttribute("ny", QString::number(yNumSteps())); xml.writeAttribute("xstep", QString::number(xStepSize())); xml.writeAttribute("ystep", QString::number(yStepSize())); xml.writeAttribute("gradzmin", QString::number(_gradZMin)); xml.writeAttribute("gradzmax", QString::number(_gradZMax)); xml.writeAttribute("xdirection", QVariant(_xDirection).toString()); saveNameInfo(xml, VNUM|MNUM|XNUM); xml.writeEndElement(); } void GeneratedMatrix::change(uint nX, uint nY, double minX, double minY, double stepX, double stepY, double gradZMin, double gradZMax, bool xDirection) { // some checks on parameters if (nX < 1) { nX = 1; } if (nY < 1) { nY = 1; } if (stepX <= 0) { stepX = 0.1; } if (stepY <= 0) { stepY = 0.1; } _nX = nX; _nY = nY; _minX = minX; _minY = minY; _stepX = stepX; _stepY = stepY; _gradZMin = gradZMin; _gradZMax = gradZMax; _xDirection = xDirection; if (_nX*_nY != _zSize) { resizeZ(_nX*_nY, false); } // zIncrement can be negative, to reverse gradient direction double zIncrement; if (_xDirection) { if (_nX > 1) { zIncrement = (_gradZMax - _gradZMin) / (_nX - 1); } else { zIncrement = 0; } } else { if (_nY > 1) { zIncrement = (_gradZMax - _gradZMin) / (_nY - 1); } else { zIncrement = 0; } } // fill in the matrix with the gradient for (int i = 0; i < _nX; i++) { for (int j = 0; j < _nY; j++) { if (_xDirection) { _z[i*nY + j] = _gradZMin + i*zIncrement; } else { _z[i*nY + j] = _gradZMin + j*zIncrement; } } } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/debug.cpp0000644000175000017500000001112312320547027015227 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "debug.h" #include #ifdef KST_HAVE_REVISION_H #include "kstrevision.h" #endif #include "datasource.h" #include "logevents.h" #include #include #include #include "datasourcepluginmanager.h" #include "ksttimers.h" namespace Kst { Debug *Debug::_self = 0L; void Debug::cleanup() { delete _self; _self = 0; } static QMutex soLock; Debug *Debug::self() { QMutexLocker ml(&soLock); if (!_self) { _self = new Debug; qAddPostRoutine(Debug::cleanup); } return _self; } Debug::Debug() : QObject() { _applyLimit = false; _limit = 10000; #ifdef KST_REVISION _kstRevision = QString::fromLatin1(KST_REVISION); #else _kstRevision = -1; #endif _hasNewError = false; } Debug::~Debug() { #ifdef BENCHMARK qDebug() << "DRAW COUNTS ---------------------------------------" << endl; for (QMap::ConstIterator i = _drawCounter.begin(); i != _drawCounter.end(); ++i) { qDebug() << i.key() << ": " << i.value() << endl; } #endif } int Debug::limit() const { QMutexLocker ml(&_lock); return _limit; } QStringList Debug::dataSourcePlugins() const { return DataSourcePluginManager::pluginList(); } void Debug::setHandler(QObject *handler) { _handler = handler; } void Debug::log(const QString& msg, LogLevel level) { QMutexLocker ml(&_lock); LogMessage message; message.date = QDateTime::currentDateTime(); message.msg = msg; message.level = level; _messages.append(message); if (_applyLimit && int(_messages.size()) > _limit) { QList::Iterator first = _messages.begin(); QList::Iterator last = first; last += _messages.size() - _limit; _messages.erase(first, last); } if (level == Error) { _hasNewError = true; } if (_handler) { LogEvent *e = new LogEvent(LogEvent::LogAdded); e->_msg = message; QApplication::postEvent(_handler, e); } } void Debug::clear() { clearHasNewError(); // has to be before the lock is acquired QMutexLocker ml(&_lock); _messages.clear(); LogEvent *e = new LogEvent(LogEvent::LogCleared); QApplication::postEvent(_handler, e); } QString Debug::label(LogLevel level) const { switch (level) { case Error: return tr("Error"); case Warning: return tr("Warning"); case Notice: return tr("Notice"); case Trace: return tr("Trace"); default: return tr("Other"); } } QString Debug::text() { QMutexLocker ml(&_lock); QString body = tr("Kst version %1\n\n\nKst log:\n").arg(KSTVERSION); QLocale locale; for (int i = 0; i < _messages.count(); i++ ) { body += QString("%1 %2: %3\n").arg(_messages[i].date.toString(locale.dateFormat())).arg(label(_messages[i].level)).arg(_messages[i].msg); } body += tr("\n\nData-source plugins:"); QStringList dsp = dataSourcePlugins(); for (QStringList::ConstIterator it = dsp.constBegin(); it != dsp.constEnd(); ++it) { body += '\n'; body += *it; } body += "\n\n"; return body; } void Debug::setLimit(bool applyLimit, int limit) { QMutexLocker ml(&_lock); _applyLimit = applyLimit; _limit = limit; } QList Debug::messages() const { QMutexLocker ml(&_lock); return _messages; } Debug::LogMessage Debug::message(unsigned n) const { QMutexLocker ml(&_lock); if (_messages.size() > int(n)) { return _messages[n]; } return Debug::LogMessage(); } int Debug::logLength() const { QMutexLocker ml(&_lock); return _messages.size(); } const QString& Debug::kstRevision() const { QMutexLocker ml(&_lock); return _kstRevision; } bool Debug::hasNewError() const { QMutexLocker ml(&_lock); return _hasNewError; } void Debug::clearHasNewError() { QMutexLocker ml(&_lock); _hasNewError = false; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/kstcore_pch0000644000175000017500000000016412277111530015664 0ustar synthsynth #include #include #include #include #include #include Kst-2.0.8/src/libkst/procps.h0000644000175000017500000001001612277111530015111 0ustar synthsynth/*************************************************************************** * * * This program is free software; you can 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 file is from the procps project at http://procps.sourceforge.net/ * * Copyright 1998-2003 Albert Cahalan * * * ***************************************************************************/ #ifndef PROCPS_PROC_PROCPS_H #define PROCPS_PROC_PROCPS_H #ifdef __cplusplus #define EXTERN_C_BEGIN extern "C" { #define EXTERN_C_END } #else #define EXTERN_C_BEGIN #define EXTERN_C_END #endif /* Some ports make the mistake of running a 32-bit userspace */ /* on a 64-bit kernel. Shame on them. It's not at all OK to */ /* make everything "long long", since that causes unneeded */ /* slowness on 32-bit hardware. */ /* */ /* SPARC: 32-bit kernel is an ex-penguin, so use "long long". */ /* */ /* MIPS: Used for embedded systems and obsolete hardware. */ /* Oh, there's a 64-bit version? SGI is headed toward IA-64, */ /* so don't worry about 64-bit MIPS. */ /* */ /* PowerPC: Big ugly problem! Macs are popular. :-/ */ /* */ /* Unknown: PA-RISC, zSeries, and x86-64 */ /* */ #if defined(k64test) || defined(__sparc__) /* || defined(__mips__) || defined(__powerpc__) */ #define KLONG long long /* not typedef; want "unsigned KLONG" to work */ #define KLF "L" #define STRTOUKL strtoull #else #define KLONG long #define KLF "l" #define STRTOUKL strtoul #endif /* since gcc-2.5 */ #define NORETURN __attribute__((__noreturn__)) #define FUNCTION __attribute__((__const__)) /* no access to global mem, even via ptr, and no side effect */ #ifndef __STDC_VERSION__ #define __STDC_VERSION__ 0 #endif #if !defined(restrict) && __STDC_VERSION__ < 199901 #if __GNUC__ > 2 || __GNUC_MINOR__ >= 92 #define restrict __restrict__ #else #warning No restrict keyword? #define restrict #endif #endif #if __GNUC__ > 2 || __GNUC_MINOR__ >= 96 /* won't alias anything, and aligned enough for anything */ #define MALLOC __attribute__ ((__malloc__)) /* no side effect, may read globals */ #define PURE __attribute__ ((__pure__)) /* tell gcc what to expect: if(unlikely(err)) die(err); */ #define likely(x) __builtin_expect(!!(x),1) #define unlikely(x) __builtin_expect(!!(x),0) #define expected(x,y) __builtin_expect((x),(y)) #else #define MALLOC #define PURE #define likely(x) (x) #define unlikely(x) (x) #define expected(x,y) (x) #endif #if defined(SHARED) && SHARED == 1 && (__GNUC__ > 2 || __GNUC_MINOR__ >= 96) #define LABEL_OFFSET #endif #define STRINGIFY_ARG(a) #a #define STRINGIFY(a) STRINGIFY_ARG(a) /* marks old junk, to warn non-procps library users */ #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 #define OBSOLETE __attribute__((deprecated)) #else #define OBSOLETE #endif #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 1 ) || __GNUC__ > 3 /* Tells gcc that function is library-internal; */ /* so no need to do dynamic linking at run-time. */ /* This might work with slightly older compilers too. */ #define HIDDEN __attribute__((visibility("hidden"))) /* Tell g++ that a function won't throw exceptions. */ #define NOTHROW __attribute__((__nothrow__)) #else #define HIDDEN #define NOTHROW #endif /* Like HIDDEN, but for an alias that gets created. */ /* In gcc-3.2 there is an alias+hidden conflict. */ /* Many will have patched this bug, but oh well. */ #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 2 ) || __GNUC__ > 3 #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x),visibility("hidden"))) #else #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x))) #endif #endif Kst-2.0.8/src/libkst/datasource.cpp0000644000175000017500000003517312362701575016314 0ustar synthsynth/*************************************************************************** datasource.cpp - abstract data source ------------------- begin : Thu Oct 16 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasource.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "datacollection.h" #include "debug.h" #include "objectstore.h" #include "scalar.h" #include "string.h" #include "nextcolor.h" #include "updatemanager.h" #include "dataplugin.h" // TODO DataSource should not need the plugin code #include "datasourcepluginmanager.h" using namespace Kst; template struct NotSupportedImp : public DataSource::DataInterface { // read one element int read(const QString&, typename T::ReadInfo&) { return -1; } // named elements QStringList list() const { return QStringList(); } bool isListComplete() const { return false; } bool isValid(const QString&) const { return false; } // T specific const typename T::DataInfo dataInfo(const QString&) const { return typename T::DataInfo(); } void setDataInfo(const QString&, const typename T::DataInfo&) {} // meta data QMap metaScalars(const QString&) { return QMap(); } QMap metaStrings(const QString&) { return QMap(); } }; const QString DataSource::staticTypeString = "Data Source"; const QString DataSource::staticTypeTag = "source"; Object::UpdateType DataSource::objectUpdate(qint64 newSerial) { if (_serial==newSerial) { return NoChange; } UpdateType updated = NoChange; if (!UpdateManager::self()->paused()) { // update the datasource updated = internalDataSourceUpdate(); if (updated == Updated) { _serialOfLastChange = newSerial; // tell data objects it is new } } _serial = newSerial; return updated; } void DataSource::_initializeShortName() { _shortName = QString("DS%1").arg(_dsnum); if (_dsnum>max_dsnum) max_dsnum = _dsnum; _dsnum++; } bool DataSource::isValid() const { return _valid; } bool DataSource::hasConfigWidget() const { return DataSourcePluginManager::sourceHasConfigWidget(_filename, fileType()); } DataSourceConfigWidget* DataSource::configWidget() { if (!hasConfigWidget()) return 0; DataSourceConfigWidget *w = DataSourcePluginManager::configWidgetForSource(_filename, fileType()); Q_ASSERT(w); //This is still ugly to me... w->_instance = this; // TODO check if not all plugins already have load() called w->load(); return w; } DataSource::DataSource(ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type) : Object(), _filename(filename), _alternateFilename(QString()), _cfg(cfg), interf_scalar(new NotSupportedImp), interf_string(new NotSupportedImp), interf_vector(new NotSupportedImp), interf_matrix(new NotSupportedImp), _watcher(0), _color(NextColor::self().next()) { Q_UNUSED(type) Q_UNUSED(store) _valid = false; _reusable = true; _writable = false; _watcher = 0L; _initializeShortName(); setDescriptiveName(QFileInfo(_filename).fileName() + " (" + shortName() + ')'); // Timer needs to be the default: File sometimes fails. startUpdating(Timer); } DataSource::~DataSource() { resetFileWatcher(); delete interf_scalar; delete interf_string; delete interf_vector; delete interf_matrix; } QMap DataSource::fileMetas() const { QMap map; QFileInfo info(_filename); map["File name"] = info.fileName(); map["File path"] = info.path(); map["File creation"] = info.created().toString(Qt::ISODate).replace('T', ' '); map["File modification"] = info.lastModified().toString(Qt::ISODate).replace('T', ' '); return map; } void DataSource::resetFileWatcher() { if (_watcher) { disconnect(_watcher, SIGNAL(fileChanged(QString)), this, SLOT(checkUpdate())); disconnect(_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(checkUpdate())); delete _watcher; _watcher = 0L; } } void DataSource::setInterface(DataInterface* i) { delete interf_scalar; interf_scalar = i; } void DataSource::setInterface(DataInterface* i) { delete interf_string; interf_string = i; } void DataSource::setInterface(DataInterface* i) { delete interf_vector; interf_vector = i; } void DataSource::setInterface(DataInterface* i) { delete interf_matrix; interf_matrix = i; } DataSource::UpdateCheckType DataSource::updateType() const { return _updateCheckType; } void DataSource::setUpdateType(UpdateCheckType updateType) { _updateCheckType = updateType; } void DataSource::startUpdating(UpdateCheckType updateType, const QString& file) { setUpdateType(updateType); resetFileWatcher(); if (_updateCheckType == Timer) { QTimer::singleShot(UpdateManager::self()->minimumUpdatePeriod()-1, this, SLOT(checkUpdate())); } else if (_updateCheckType == File) { // TODO only works on local files: // http://bugreports.qt.nokia.com/browse/QTBUG-8351 // http://bugreports.qt.nokia.com/browse/QTBUG-13248 _watcher = new QFileSystemWatcher(); const QString usedfile = (file.isEmpty() ? _filename : file); _watcher->addPath(usedfile); connect(_watcher, SIGNAL(fileChanged(QString)), this, SLOT(checkUpdate())); connect(_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(checkUpdate())); } } void DataSource::checkUpdate() { if (!UpdateManager::self()->paused()) { UpdateManager::self()->doUpdates(false); } if (_updateCheckType == Timer) { QTimer::singleShot(UpdateManager::self()->minimumUpdatePeriod()-1, this, SLOT(checkUpdate())); } } void DataSource::deleteDependents() { foreach (const PrimitivePtr &p, slavePrimitives) { store()->removeObject(p); } } const QString& DataSource::typeString() const { return staticTypeString; } QString DataSource::fileName() const { // Look to see if it was a URL and save the URL instead const QMap urlMap = DataSourcePluginManager::urlMap(); for (QMap::ConstIterator i = urlMap.begin(); i != urlMap.end(); ++i) { if (i.value() == _filename) { return i.key(); } } return _filename; } QString DataSource::alternateFilename() const { return _alternateFilename; } void DataSource::setAlternateFilename(const QString &file) { _alternateFilename = file; } QString DataSource::fileType() const { return QString(); } void DataSource::save(QXmlStreamWriter &s) { Q_UNUSED(s) } void DataSource::saveSource(QXmlStreamWriter &s) { QString name = _filename; // Look to see if it was a URL and save the URL instead const QMap urlMap = DataSourcePluginManager::urlMap(); for (QMap::ConstIterator i = urlMap.begin(); i != urlMap.end(); ++i) { if (i.value() == _filename) { name = i.key(); break; } } s.writeStartElement("source"); s.writeAttribute("reader", fileType()); s.writeAttribute("updateType", QString::number(int(_updateCheckType))); DataPrimitive::saveFilename(name, s); save(s); s.writeEndElement(); } void DataSource::parseProperties(QXmlStreamAttributes &properties) { Q_UNUSED(properties); } bool DataSource::isEmpty() const { return true; } void DataSource::reset() { Object::reset(); } bool DataSource::supportsTimeConversions() const { return false; } QString DataSource::timeFormat() const { return QString(); } int DataSource::sampleForTime(const QDateTime& time, bool *ok) { Q_UNUSED(time) if (ok) { *ok = false; } return 0; } int DataSource::sampleForTime(double ms, bool *ok) { Q_UNUSED(ms) if (ok) { *ok = false; } return 0; } QDateTime DataSource::timeForSample(int sample, bool *ok) { Q_UNUSED(sample) if (ok) { *ok = false; } return QDateTime::currentDateTime(); } bool DataSource::isTime(const QString& field) const { return (_timeFields.contains(field)); } double DataSource::relativeTimeForSample(int sample, bool *ok) { Q_UNUSED(sample) if (ok) { *ok = false; } return 0; } double DataSource::frameToIndex(int frame, const QString &field) { return readDespikedIndex(frame+1, field); } int DataSource::indexToFrame(double X, const QString &field) { const DataVector::DataInfo info = vector().dataInfo(field); int Fmin = 0; int Fmax = info.frameCount-1; double Xmin = readDespikedIndex(Fmin, field); double Xmax = readDespikedIndex(Fmax, field); int F0 = (Fmin + Fmax)/2; double X0; if (X>=Xmax) { return Fmax; } if (X<=Xmin) { return Fmin; } while (F0 != Fmin) { X0 = readDespikedIndex(F0, field); if ((X0>Xmax) || (X0= info.frameCount) { frame = info.frameCount - 2*margin_frames; } DataVector::ReadInfo par = {data, frame, 2*margin_frames, -1}; vector().read(field, par); bool spike_found; int n = 2*margin_samp-1; do { int j=0; spike_found = false; for (int i = 0; i < n; i++) { if (data[i+1] >= data[i]) { // increasing. This point is probably ok. data[j++] = data[i]; } else { i++; // this point and the next one are now suspect - skip them spike_found = true; } } n = j; } while(spike_found); // We found a spike - better check for wider ones. x = data[n/2]; // FIXME: we might be off by a couple samples if there were spikes. delete data; return(x); } QStringList &DataSource::timeFields() { if (_timeFields.size() == 0) { // FIXME: this must be created by the UI somehow. // or by the datasource itself. Or something // different than this! QStringList requestedFields; requestedFields.append("TIME"); requestedFields.append("Time"); requestedFields.append("time"); requestedFields.append("Temps"); requestedFields.append("TEMPS"); requestedFields.append("temps"); // Make sure the requested fields actually exist. foreach (const QString &field, requestedFields) { if (vector().list().contains(field)) { _timeFields.append(field); } } } return(_timeFields); } QStringList &DataSource::indexFields() { if (_frameFields.size() == 0) { _frameFields.append(tr("frames")); _frameFields.append(timeFields()); } return(_frameFields); } bool DataSource::reusable() const { return _reusable; } void DataSource::disableReuse() { _reusable = false; } QString DataSource::_automaticDescriptiveName() const { return fileName(); } QString DataSource::descriptionTip() const { return fileName(); } QColor DataSource::color() const { return _color; } void DataSource::setColor(const QColor& color) { _color = color; } ///////////////////////////////////////////////////////////////////////////// DataSourceConfigWidget::DataSourceConfigWidget(QSettings& settings) : QWidget(0L), _cfg(settings) { } DataSourceConfigWidget::~DataSourceConfigWidget() { } void DataSourceConfigWidget::setInstance(DataSourcePtr inst) { _instance = inst; } DataSourcePtr DataSourceConfigWidget::instance() const { return _instance; } QSettings& DataSourceConfigWidget::settings() const { return _cfg; } bool DataSourceConfigWidget::isOkAcceptabe() const { return true; } bool DataSourceConfigWidget::hasInstance() const { return _instance != 0L; } ValidateDataSourceThread::ValidateDataSourceThread(const QString& file, const int requestID) : QRunnable(), _file(file), _requestID(requestID) { } static QMutex _mutex; void ValidateDataSourceThread::run() { QFileInfo info(_file); if (!info.exists()) { emit dataSourceInvalid(_requestID); return; } // FIXME validSource(_file) is not thread safe, so wait // if there is another one running QMutexLocker locker(&_mutex); if (!DataSourcePluginManager::validSource(_file)) { emit dataSourceInvalid(_requestID); return; } emit dataSourceValid(_file, _requestID); } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/CMakeLists.txt0000644000175000017500000000064712320547027016206 0ustar synthsynthkst_init(${kst_binary_name} core) kst_include_directories(widgets) kst_files_ignore(stdinsource timezones) if(WIN32 OR APPLE OR QNX OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") kst_files_ignore(sysinfo psversion) else() if(NOT kst_clang) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt") endif() endif() kst_files_find(src/libkst) kst_dont_merge(sysinfo.c psversion.c) kst_add_library(SHARED) kst_link() Kst-2.0.8/src/libkst/scriptinterface.cpp0000644000175000017500000000336012320547027017332 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 Joshua Netterfield * * joshua.netterfield@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. * * * ***************************************************************************/ #include "scriptinterface.h" #include "namedobject.h" #include namespace Kst { QString ScriptInterface::doNamedObjectCommand(QString command, NamedObject *n) { if (command.startsWith("setName(")) { command.remove("setName(").chop(1); n->setDescriptiveName(command); return QString("Done"); } else if (command.startsWith("name(")) { return n->Name(); } return QString(); } // convenience functions... for parsing commands. QStringList ScriptInterface::getArgs(const QString &command) { int i0 = command.indexOf('(')+1; int i1 = command.lastIndexOf(')'); int n = i1-i0; QString x = command.mid(i0,n); return x.split(','); } QString ScriptInterface::getArg(const QString &command) { int i0 = command.indexOf('(')+1; int i1 = command.lastIndexOf(')'); int n = i1-i0; QString x = command.mid(i0,n); return x; } } Kst-2.0.8/src/libkst/kst_export.h0000644000175000017500000000247512277111530016017 0ustar synthsynth/*************************************************************************** kst_export.h ------------------- begin : Feb 07 2005 copyright : (C) 2005 Dirk Mueller email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_EXPORT_H #define KST_EXPORT_H #include #if (defined(Q_OS_WIN32) || defined(Q_OS_WIN64)) # if defined(BUILD_KSTCORE) # define KSTCORE_EXPORT Q_DECL_EXPORT # else # define KSTCORE_EXPORT Q_DECL_IMPORT # endif #else # define KSTCORE_EXPORT #endif #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/debug.h0000644000175000017500000000522112320547027014676 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DEBUG_H #define DEBUG_H #include #include #include #include #include #include #include "kst_export.h" namespace Kst { // This class has to be threadsafe class KSTCORE_EXPORT Debug : public QObject { Q_OBJECT public: enum LogLevel { Trace = 1, Notice = 2, Warning = 4, Error = 8 }; struct LogMessage { QDateTime date; QString msg; LogLevel level; }; static Debug *self(); void clear(); void log(const QString& msg, LogLevel level = Notice); void setLimit(bool applyLimit, int limit); QString text(); #define DEBUG_LOG_FUNC(X, T) static void X(const QString& msg) { self()->log(msg, T); } DEBUG_LOG_FUNC(error, Error); DEBUG_LOG_FUNC(warning, Warning); DEBUG_LOG_FUNC(notice, Notice); DEBUG_LOG_FUNC(trace, Trace); int logLength() const; QList messages() const; Debug::LogMessage message(unsigned n) const; QStringList dataSourcePlugins() const; QString label(LogLevel level) const; const QString& kstRevision() const; int limit() const; bool hasNewError() const; void clearHasNewError(); #ifdef BENCHMARK QMap& drawCounter() { return _drawCounter; } #endif void setHandler(QObject *handler); private: Debug(); ~Debug(); static Debug *_self; static void cleanup(); QList _messages; bool _applyLimit; bool _hasNewError; int _limit; mutable QMutex _lock; #ifdef BENCHMARK // If this is ever public we can't do this QMap _drawCounter; #endif QPointer _handler; QString _kstRevision; }; struct Sleep : QThread { static void ms(int t) { QThread::msleep(t); } }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datasourcepluginmanager.cpp0000644000175000017500000004025312277111530021050 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasourcepluginmanager.h" #include "datasource.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "datacollection.h" #include "debug.h" #include "objectstore.h" #include "scalar.h" #include "string.h" #include "updatemanager.h" #include "settings.h" #include "dataplugin.h" #define DATASOURCE_UPDATE_TIMER_LENGTH 1000 using namespace Kst; QStringList Kst::pluginSearchPaths() { QStringList pluginPaths; QDir rootDir = QApplication::applicationDirPath(); rootDir.cdUp(); QString path = rootDir.canonicalPath() + '/'; pluginPaths << path + QLatin1String("plugins"); pluginPaths << path + QLatin1String(KST_INSTALL_PLUGINS); #if defined(__QNX__) pluginPaths << "app/native/plugins"; #endif rootDir.cdUp(); path = rootDir.canonicalPath() + '/'; path += QLatin1String(KST_INSTALL_PLUGINS); // Visal Studio paths pluginPaths << path + QLatin1String("/Release"); pluginPaths << path + QLatin1String("/Debug"); pluginPaths << path + QLatin1String("/RelWithDebInfo"); Debug::self()->log(DataSource::tr("\nPlugin Search Paths:")); foreach(const QString& p, pluginPaths) { Debug::self()->log(QString("-> %1").arg(p)); } return pluginPaths; } QSettings& DataSourcePluginManager::settingsObject() { static QSettings& settingsObject = createSettings("data"); return settingsObject; } QMap DataSourcePluginManager::url_map; const QMap DataSourcePluginManager::urlMap() { return url_map; } void DataSourcePluginManager::init() { initPlugins(); } struct FoundPlugin { FoundPlugin(const SharedPtr& plug, const QString& path) : plugin(plug), filePath(path) {} SharedPtr plugin; // TODO add filepath to PluginInterface QString filePath; }; typedef QList PluginList; static PluginList _pluginList; void DataSourcePluginManager::cleanupForExit() { _pluginList.clear(); qDebug() << "cleaning up for exit in datasource"; // for (QMap::Iterator i = urlMap.begin(); i != urlMap.end(); ++i) { // KIO::NetAccess::removeTempFile(i.value()); // } url_map.clear(); } QString DataSourcePluginManager::obtainFile(const QString& source) { QUrl url; if (QFile::exists(source) && QFileInfo(source).isRelative()) { url.setPath(source); } else { url = QUrl(source); } // if (url.isLocalFile() || url.protocol().isEmpty() || url.protocol().toLower() == "nad") { return source; // } if (url_map.contains(source)) { return url_map[source]; } // FIXME: come up with a way to indicate the "widget" and fill it in here so // that KIO dialogs are associated with the proper window // if (!KIO::NetAccess::exists(url, true, 0L)) { // return QString(); // } QString tmpFile; // FIXME: come up with a way to indicate the "widget" and fill it in here so // that KIO dialogs are associated with the proper window // if (!KIO::NetAccess::download(url, tmpFile, 0L)) { // return QString(); // } url_map[source] = tmpFile; return tmpFile; } // Scans for plugins and stores the information for them in "_pluginList" static void scanPlugins() { PluginList tmpList; Debug::self()->log(DataSource::tr("Scanning for data-source plugins.")); foreach (QObject *plugin, QPluginLoader::staticInstances()) { //try a cast if (DataSourcePluginInterface *ds = qobject_cast(plugin)) { tmpList.append(FoundPlugin(ds, "")); } } QStringList pluginPaths = pluginSearchPaths(); foreach (const QString& pluginPath, pluginPaths) { QDir d(pluginPath); foreach (const QString &fileName, d.entryList(QDir::Files)) { #ifdef Q_OS_WIN if (!fileName.endsWith(QLatin1String(".dll"))) continue; #endif QPluginLoader loader(d.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); if (plugin) { if (DataSourcePluginInterface *ds = qobject_cast(plugin)) { tmpList.append(FoundPlugin(ds, d.absoluteFilePath(fileName))); Debug::self()->log(DataSource::tr("Plugin loaded: %1").arg(fileName)); } } else { Debug::self()->log(DataSource::tr("instance failed for %1 (%2)").arg(fileName).arg(loader.errorString())); } } } // This cleans up plugins that have been uninstalled and adds in new ones. // Since it is a shared pointer it can't dangle anywhere. _pluginList.clear(); _pluginList = tmpList; } void DataSourcePluginManager::initPlugins() { if (_pluginList.isEmpty()) { scanPlugins(); } } QStringList DataSourcePluginManager::pluginList() { // Ensure state. When using kstapp MainWindow calls init. init(); QStringList plugins; for (PluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { plugins += (*it).plugin->pluginName(); } return plugins; } QString DataSourcePluginManager::pluginFileName(const QString& pluginName) { for (PluginList::ConstIterator it = _pluginList.constBegin(); it != _pluginList.constEnd(); ++it) { if (it->plugin->pluginName() == pluginName) { return it->filePath; } } return "not available"; } int DataSourcePluginManager::PluginSortContainer::operator<(const PluginSortContainer& x) const { return match > x.match; // yes, this is by design. biggest go first } int DataSourcePluginManager::PluginSortContainer::operator==(const PluginSortContainer& x) const { return match == x.match; } QList DataSourcePluginManager::bestPluginsForSource(const QString& filename, const QString& type) { QList bestPlugins; DataSourcePluginManager::init(); PluginList info = _pluginList; if (!type.isEmpty()) { for (PluginList::Iterator it = info.begin(); it != info.end(); ++it) { if (DataSourcePluginInterface *p = (*it).plugin.data()) { if (p->provides(type)) { PluginSortContainer psc; psc.match = 100; psc.plugin = p; bestPlugins.append(psc); return bestPlugins; } } } } for (PluginList::Iterator it = info.begin(); it != info.end(); ++it) { PluginSortContainer psc; if (DataSourcePluginInterface *p = (*it).plugin.data()) { if ((psc.match = p->understands(&settingsObject(), filename)) > 0) { psc.plugin = p; bestPlugins.append(psc); } } } qSort(bestPlugins); return bestPlugins; } DataSourcePtr DataSourcePluginManager::findPluginFor(ObjectStore *store, const QString& filename, const QString& type, const QDomElement& e) { QList bestPlugins = bestPluginsForSource(filename, type); // we don't actually iterate here, unless the first plugin fails. (Not sure this helps at all.) for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { DataSourcePtr plugin = (*i).plugin->create(store, &settingsObject(), filename, QString(), e); if (plugin) { // add strings const QStringList strings = plugin->string().list(); if (!strings.isEmpty()) { foreach(const QString& key, strings) { QString value; DataString::ReadInfo readInfo(&value); plugin->string().read(key, readInfo); StringPtr s = store->createObject(); s->setProvider(plugin); s->setSlaveName(key); s->setValue(value); plugin->slavePrimitives.append(s); } } // add scalars const QStringList scalars = plugin->scalar().list(); if (!scalars.isEmpty()) { foreach(const QString& key, scalars) { double value; DataScalar::ReadInfo readInfo(&value); plugin->scalar().read(key, readInfo); ScalarPtr s = store->createObject(); s->setProvider(plugin); s->setSlaveName(key); plugin->slavePrimitives.append(s); s->setValue(value); } } return plugin; } } return 0L; } DataSourcePtr DataSourcePluginManager::loadSource(ObjectStore *store, const QString& filename, const QString& type) { #ifndef Q_OS_WIN32 //if (filename == "stdin" || filename == "-") { // FIXME: what store do we put this in? // return new StdinSource(0, settingsObject()); //} #endif QString fn = obtainFile(filename); if (fn.isEmpty()) { return 0; } if (!QFileInfo(fn).exists()) { Debug::self()->log(QObject::tr("File '%1' does not exist.").arg(fn), Debug::Warning); return 0; } DataSourcePtr dataSource = findPluginFor(store, fn, type); if (dataSource) { store->addObject(dataSource); } return dataSource; } DataSourcePtr DataSourcePluginManager::findOrLoadSource(ObjectStore *store, const QString& filename) { Q_ASSERT(store); DataSourcePtr dataSource = store->dataSourceList().findReusableFileName(filename); if (!dataSource) { dataSource = DataSourcePluginManager::loadSource(store, filename); } return dataSource; } bool DataSourcePluginManager::validSource(const QString& filename) { #ifndef Q_OS_WIN32 // if (filename == "stdin" || filename == "-") { // return true; // } #endif QString fn = obtainFile(filename); if (fn.isEmpty()) { return false; } DataSourcePluginManager::init(); PluginList info = _pluginList; for (PluginList::Iterator it = info.begin(); it != info.end(); ++it) { if (DataSourcePluginInterface *p = (*it).plugin.data()) { if ((p->understands(&settingsObject(), filename)) > 0) { return true; } } } return false; } bool DataSourcePluginManager::pluginHasConfigWidget(const QString& plugin) { initPlugins(); PluginList info = _pluginList; for (PluginList::ConstIterator it = info.constBegin(); it != info.constEnd(); ++it) { if ((*it).plugin->pluginName() == plugin) { return (*it).plugin->hasConfigWidget(); } } return false; } DataSourceConfigWidget* DataSourcePluginManager::configWidgetForPlugin(const QString& plugin) { initPlugins(); PluginList info = _pluginList; for (PluginList::Iterator it = info.begin(); it != info.end(); ++it) { if (DataSourcePluginInterface *p = (*it).plugin.data()) { if (p->pluginName() == plugin) { return p->configWidget(&settingsObject(), QString()); } } } return 0L; } bool DataSourcePluginManager::sourceHasConfigWidget(const QString& filename, const QString& type) { if (filename == "stdin" || filename == "-") { return 0L; } QString fn = obtainFile(filename); if (fn.isEmpty()) { return 0L; } QList bestPlugins = bestPluginsForSource(fn, type); for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { return (*i).plugin->hasConfigWidget(); } Debug::self()->log(DataSource::tr("Could not find a datasource for '%1'(%2), but we found one just prior. Something is wrong with Kst.").arg(filename).arg(type), Debug::Error); return false; } DataSourceConfigWidget* DataSourcePluginManager::configWidgetForSource(const QString& filename, const QString& type) { if (filename == "stdin" || filename == "-") { return 0L; } QString fn = obtainFile(filename); if (fn.isEmpty()) { return 0L; } QList bestPlugins = bestPluginsForSource(fn, type); for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { DataSourceConfigWidget *w = (*i).plugin->configWidget(&settingsObject(), fn); // Don't iterate. return w; } Debug::self()->log(DataSource::tr("Could not find a datasource for '%1'(%2), but we found one just prior. Something is wrong with Kst.").arg(filename).arg(type), Debug::Error); return 0L; } /* QStringList DataSourcePluginManager::fieldListForSource(const QString& filename, const QString& type, QString *outType, bool *complete) { if (filename == "stdin" || filename == "-") { return QStringList(); } QString fn = obtainFile(filename); if (fn.isEmpty()) { return QStringList(); } QList bestPlugins = bestPluginsForSource(fn, type); QStringList rc; for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { QString typeSuggestion; rc = (*i).plugin->fieldList(settingsObject(), fn, QString(), &typeSuggestion, complete); if (!rc.isEmpty()) { if (outType) { if (typeSuggestion.isEmpty()) { *outType = (*i).plugin->provides()[0]; } else { *outType = typeSuggestion; } } break; } } return rc; } */ # if 0 QStringList DataSourcePluginManager::matrixListForSource(const QString& filename, const QString& type, QString *outType, bool *complete) { if (filename == "stdin" || filename == "-") { return QStringList(); } QString fn = obtainFile(filename); if (fn.isEmpty()) { return QStringList(); } QList bestPlugins = bestPluginsForSource(fn, type); QStringList rc; for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { QString typeSuggestion; rc = (*i).plugin->matrixList(settingsObject(), fn, QString(), &typeSuggestion, complete); if (!rc.isEmpty()) { if (outType) { if (typeSuggestion.isEmpty()) { *outType = (*i).plugin->provides()[0]; } else { *outType = typeSuggestion; } } break; } } return rc; } #endif QStringList DataSourcePluginManager::scalarListForSource(const QString& filename, const QString& type, QString *outType, bool *complete) { if (filename == "stdin" || filename == "-") { return QStringList(); } QString fn = obtainFile(filename); if (fn.isEmpty()) { return QStringList(); } QList bestPlugins = bestPluginsForSource(fn, type); QStringList rc; for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { QString typeSuggestion; rc = (*i).plugin->scalarList(&settingsObject(), fn, QString(), &typeSuggestion, complete); if (!rc.isEmpty()) { if (outType) { if (typeSuggestion.isEmpty()) { *outType = (*i).plugin->provides()[0]; } else { *outType = typeSuggestion; } } break; } } return rc; } QStringList DataSourcePluginManager::stringListForSource(const QString& filename, const QString& type, QString *outType, bool *complete) { if (filename == "stdin" || filename == "-") { return QStringList(); } QString fn = obtainFile(filename); if (fn.isEmpty()) { return QStringList(); } QList bestPlugins = bestPluginsForSource(fn, type); QStringList rc; for (QList::Iterator i = bestPlugins.begin(); i != bestPlugins.end(); ++i) { QString typeSuggestion; rc = (*i).plugin->stringList(&settingsObject(), fn, QString(), &typeSuggestion, complete); if (!rc.isEmpty()) { if (outType) { if (typeSuggestion.isEmpty()) { *outType = (*i).plugin->provides()[0]; } else { *outType = typeSuggestion; } } break; } } return rc; } Kst-2.0.8/src/libkst/settings.h0000644000175000017500000000245212277111530015450 0ustar synthsynth/*************************************************************************** object.h: abstract base class for all Kst objects ------------------- copyright : (C) 2013 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SETTINGS_H #define SETTINGS_H #include "kst_export.h" #include namespace Kst { // QSettings objects should only be instantiated with this function KSTCORE_EXPORT QSettings& createSettings(const QString& scope); KSTCORE_EXPORT void deleteAllSettings(); } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/objectmap.cpp0000644000175000017500000000157612277111530016115 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "objectmap.h" // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/objectstore.cpp0000644000175000017500000001155112320547027016471 0ustar synthsynth/*************************************************************************** objectstore.cpp: store of Objects ------------------- begin : November 22, 2006 copyright : (C) 2006 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "objectstore.h" #include #include #include #include "object.h" #include "datavector.h" #include "datastring.h" #include "datascalar.h" #include "datamatrix.h" // NAMEDEBUG: 0 for no debug, 1 for some debug, 2 for more debug, 3 for all debug #define NAMEDEBUG 0 namespace Kst { ObjectStore::ObjectStore() { override.fileName.clear(); override.f0 = override.N = override.skip = override.doAve = -5; } ObjectStore::~ObjectStore() { } bool ObjectStore::removeObject(Object *o) { if (!this) { return false; } if (!o) { return false; } KstWriteLocker l(&this->_lock); DataSourcePtr ds = kst_cast(o); if (ds) { if (!_dataSourceList.contains(ds)) { return false; } } else if (!_list.contains(o)) { return false; } if (ds) { ds->deleteDependents(); _dataSourceList.removeAll(ds); } else { o->deleteDependents(); _list.removeAll(o); } o->_store = 0; return true; } ObjectPtr ObjectStore::retrieveObject(const QString& name) const { int match = -1; if (name.isEmpty()) { return NULL; } QString shortName; QRegExp rx("(\\(|^)([A-Z]\\d+)(\\)$|$)"); rx.indexIn(name); shortName = rx.cap(2); // 1) search for short names int size = _list.size(); for (int i = 0; i < size; ++i) { if (_list.at(i)->shortName()==shortName) return _list.at(i); } // 3) search for descriptive names: must be unique for (int i = 0; i < size; ++i) { if (_list.at(i)->descriptiveName() == name) { if (match != -1) return NULL; // not unique, so... no match match = i; } } if (match >-1) return _list.at(match); return NULL; } void ObjectStore::resetDataSourceDependents(QString filename) { PrimitiveList allPrimitives = getObjects(); foreach (PrimitivePtr P, allPrimitives) { DataPrimitive* dp = qobject_cast(P); if (dp) { if (filename == dp->filename()) { P->writeLock(); P->reset(); P->unlock(); } } } } void ObjectStore::rebuildDataSourceList() { cleanUpDataSourceList(); foreach (DataSourcePtr ds, _dataSourceList) { ds->writeLock(); ds->reset(); ds->unlock(); } foreach (ObjectPtr object, _list) { object->writeLock(); object->reset(); object->unlock(); } } void ObjectStore::cleanUpDataSourceList() { DataSourceList currentSourceList; currentSourceList.clear(); currentSourceList.append(_dataSourceList); // clean up unused data sources for (DataSourceList::Iterator it = currentSourceList.begin(); it != currentSourceList.end(); ++it) { if ((*it)->getUsage() <= 1) { removeObject(*it); //qDebug() << "remove" << (*it)->fileName() << "usage" << (*it)->getUsage(); } else { //qDebug() << " keep" << (*it)->fileName() << "usage" << (*it)->getUsage(); } } currentSourceList.clear(); } bool ObjectStore::isEmpty() const { KstReadLocker l(&_lock); return _list.isEmpty(); } void ObjectStore::clear() { KstWriteLocker l(&_lock); #if NAMEDEBUG > 0 qDebug () << "Clearing object store " << (void*) this; #endif foreach(DataSource *ds, _dataSourceList) { removeObject(ds); } foreach(Object *o, _list) { removeObject(o); } // Reset the named objects id's. NamedObject::resetNameIndex(); } DataSourceList ObjectStore::dataSourceList() const { KstReadLocker l(&_lock); return _dataSourceList; } QList ObjectStore::objectList() { KstReadLocker l(&_lock); return _list; } void ObjectStore::clearUsedFlags() { foreach (ObjectPtr p, _list) { p->setUsed(false); } } bool ObjectStore::deleteUnsetUsedFlags() { QList list = _list; bool some_deleted = false; foreach (ObjectPtr p, list) { if (!p->used()) { removeObject(p); some_deleted = true; } } return some_deleted; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/vector.cpp0000644000175000017500000004773312362705136015466 0ustar synthsynth/*************************************************************************** vector.cpp - description ------------------- begin : Fri Sep 22 2000 copyright : (C) 2000-2011 by C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * Permission is granted to link with any opensource library * * * ***************************************************************************/ #include "vector.h" #include #include #include #include #include #include #include "datacollection.h" #include "math_kst.h" #include "debug.h" #include "objectstore.h" #include "updatemanager.h" #include "vectorscriptinterface.h" namespace Kst { #define INITSIZE 1 const QString Vector::staticTypeString = "Vector"; const QString Vector::staticTypeTag = "vector"; /** Create a vector */ Vector::Vector(ObjectStore *store) : Primitive(store, 0L), _nsum(0), _labelInfo(LabelInfo()), _titleInfo(LabelInfo()) { _initializeShortName(); _editable = false; NumShifted = 0; NumNew = 0; _saveData = false; _isScalarList = false; _saveable = false; _labelInfo.name.clear(); _labelInfo.quantity.clear(); _labelInfo.units.clear(); int size = INITSIZE; _v = static_cast(malloc(size * sizeof(double))); if (!_v) { // Malloc failed _v = static_cast(malloc(sizeof(double))); _size = 1; } else { _size = size; } _is_rising = false; _scalars.clear(); _strings.clear(); CreateScalars(store); setFlag(true); blank(); } void Vector::_initializeShortName() { _shortName = 'V'+QString::number(_vnum); if (_vnum>max_vnum) max_vnum = _vnum; _vnum++; } Vector::~Vector() { if (_v) { free(_v); _v = 0; } } ScriptInterface* Vector::createScriptInterface() { return new VectorSI(this); } void Vector::deleteDependents() { for (QHash::Iterator it = _scalars.begin(); it != _scalars.end(); ++it) { _store->removeObject(it.value()); } for (QHash::Iterator it = _strings.begin(); it != _strings.end(); ++it) { _store->removeObject(it.value()); } Object::deleteDependents(); } const QString& Vector::typeString() const { return staticTypeString; } #define GENERATE_INTERPOLATION \ assert(_size > 0); \ /** Limits checks - optional? **/ \ if (in_i < 0 || _size == 1) { \ return _v[0]; \ } \ \ if (in_i >= ns_i - 1) { \ return _v[_size - 1]; \ } \ \ /** speedup check **/ \ if (ns_i == _size) { /* no extrapolating or decimating needed */ \ return _v[in_i]; \ } \ \ double fj = in_i * double(_size - 1) / double(ns_i-1); /* scaled index */ \ \ int j = int(fj); /* index of sample one lower */ \ /*assert(j==int(floor(fj)));*/ \ assert(j+1 < _size && j >= 0); \ if (_v[j + 1] != _v[j + 1] || _v[j] != _v[j]) { \ return NOPOINT; \ } \ \ double fdj = fj - float(j); /* fdj is fraction between _v[j] and _v[j+1] */ \ \ return _v[j + 1] * fdj + _v[j] * (1.0 - fdj); /** Return v[i], i is sample number, interpolated to have ns_i total samples in vector */ double Vector::interpolate(int in_i, int ns_i) const { GENERATE_INTERPOLATION } double kstInterpolate(double *_v, int _size, int in_i, int ns_i) { GENERATE_INTERPOLATION } #undef GENERATE_INTERPOLATION #define RETURN_FIRST_NON_HOLE \ for (int i = 0; i < _size; ++i) { \ if (_v[i] == _v[i]) { \ return _v[i]; \ } \ } \ return 0.; #define RETURN_LAST_NON_HOLE \ for (int i = _size - 1; i >= 0; --i) { \ if (_v[i] == _v[i]) { \ return _v[i]; \ } \ } \ return 0.; #define FIND_LEFT(val, idx) \ for (; idx >= 0; --idx) { \ if (_v[idx] == _v[idx]) { \ val = _v[idx]; break; \ } \ } #define FIND_RIGHT(val, idx) \ for (; idx < _size; ++idx) { \ if (_v[idx] == _v[idx]) { \ val = _v[idx]; break; \ } \ } #define GENERATE_INTERPOLATION \ assert(_size > 0); \ /** Limits checks - optional? **/ \ if (in_i <= 0 || _size == 1) { \ RETURN_FIRST_NON_HOLE \ } \ \ if (in_i >= ns_i - 1) { \ RETURN_LAST_NON_HOLE \ } \ \ /** speedup check **/ \ if (ns_i == _size) { \ if (_v[in_i] == _v[in_i]) { \ return _v[in_i]; \ } \ double left = 0., right = 0.; \ int leftIndex = in_i, rightIndex = in_i;\ FIND_LEFT(left, leftIndex) \ FIND_RIGHT(right, rightIndex) \ if (leftIndex == -1) { \ return right; \ } \ if (rightIndex == _size) { \ return left; \ } \ return left + (right - left) * double(in_i - leftIndex) / double(rightIndex - leftIndex); \ } \ abort(); /* FIXME; this is effectivly assert(ns_i == _size) */ \ double indexScaleFactor = double(_size - 1) / double(ns_i - 1); \ double fj = in_i * indexScaleFactor; /* scaled index */ \ \ int j = int(floor(fj)); /* index of sample one lower */ \ assert(j+1 < _size && j >= 0); \ if (_v[j + 1] != _v[j + 1] || _v[j] != _v[j]) { \ return NOPOINT; \ } \ \ double fdj = fj - float(j); /* fdj is fraction between _v[j] and _v[j+1] */ \ \ return _v[j + 1] * fdj + _v[j] * (1.0 - fdj); // FIXME: optimize me - possible that floor() (especially) and isnan() are // expensive here. double Vector::interpolateNoHoles(int in_i, int ns_i) const { GENERATE_INTERPOLATION } double kstInterpolateNoHoles(double *_v, int _size, int in_i, int ns_i) { GENERATE_INTERPOLATION } #undef FIND_LEFT #undef FIND_RIGHT #undef RETURN_LAST_NON_HOLE #undef RETURN_FIRST_NON_HOLE #undef GENERATE_INTERPOLATION double Vector::value(int i) const { if (i < 0 || i >= _size) { // can't look before beginning or past end return 0.0; } return _v[i]; } void Vector::CreateScalars(ObjectStore *store) { if (!_isScalarList) { _min = _max = _mean = _minPos = 0.0; Q_ASSERT(store); ScalarPtr sp; _scalars.insert("max", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Max"); _scalars.insert("min", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Min"); _scalars.insert("last", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Last"); _scalars.insert("first", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("First"); _scalars.insert("mean", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Mean"); _scalars.insert("sigma", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Sigma"); _scalars.insert("rms", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Rms"); _scalars.insert("ns", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("NS"); _scalars.insert("sum", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("Sum"); _scalars.insert("sumsquared", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("SumSquared"); _scalars.insert("minpos", sp = store->createObject()); sp->setProvider(this); sp->setSlaveName("MinPos"); } } void Vector::updateScalars() { if (!_isScalarList) { _scalars["ns"]->setValue(_size); if (_nsum >= 2) { double sum = _scalars["sum"]->value(); double sumsq = _scalars["sumsquared"]->value(); _scalars["mean"]->setValue(_mean = sum/double(_nsum)); _scalars["sigma"]->setValue(sqrt((sumsq - sum * sum / double(_nsum)) / double(_nsum-1))); _scalars["rms"]->setValue(sqrt(sumsq/double(_nsum))); } else { _scalars["sigma"]->setValue(_max - _min); _scalars["rms"]->setValue(sqrt(_scalars["sumsquared"]->value())); _scalars["mean"]->setValue(_mean = NOPOINT); } } } double* Vector::realloced(double *memptr, int newSize) { double *old = _v; _v = memptr; if (newSize < _size) { NumNew = newSize; // all new if we shrunk the vector } else { NumNew = newSize - _size; } _size = newSize; updateScalars(); return old; } void Vector::setV(double *memptr, int newSize) { _v = memptr; NumNew = newSize; _size = newSize; } void Vector::zero() { _ns_min = _ns_max = 0.0; memset(_v, 0, sizeof(double)*_size); updateScalars(); } void Vector::blank() { _ns_min = _ns_max = 0.0; for (int i = 0; i < _size; ++i) { _v[i] = NOPOINT; } updateScalars(); } bool Vector::resize(int sz, bool init) { if (sz > 0) { if (!kstrealloc(_v, sz*sizeof(double))){ qCritical() << "Vector resize failed"; return false; } if (init && _size < sz) { for (int i = _size; i < sz; ++i) { _v[i] = NOPOINT; } } _size = sz; updateScalars(); } return true; } void Vector::internalUpdate() { int i, i0; double sum, sum2, last, first, v; double last_v; double dv2 = 0.0, dv, no_spike_max_dv; const double epsilon=1e-300; _max = _min = sum = sum2 = _minPos = last = first = NOPOINT; _nsum = 0; if (_size > 0) { _is_rising = true; // Look for a valid (finite) point... for (i = 0; i < _size && !isfinite(_v[i]); ++i) { // do nothing } if (i == _size) { // there were no finite points: if (!_isScalarList) { _scalars["sum"]->setValue(sum); _scalars["sumsquared"]->setValue(sum2); _scalars["max"]->setValue(_max); _scalars["min"]->setValue(_min); _scalars["minpos"]->setValue(_minPos); _scalars["last"]->setValue(last); _scalars["first"]->setValue(first); } _ns_max = _ns_min = 0; updateScalars(); return; } i0 = i; if (i0 > 0) { _is_rising = false; } _max = _min = _v[i0]; sum = sum2 = 0.0; if (_v[i0] > epsilon) { _minPos = _v[i0]; } else { _minPos = 1.0E300; } last_v = _v[i0]; for (i = i0; i < _size; ++i) { v = _v[i]; // get rid of redirections if (isfinite(v)) { dv = v - last_v; dv2 += dv*dv; if (v <= last_v) { if (i != i0) { _is_rising = false; } } last_v = v; _nsum++; sum += v; sum2 += v*v; if (v > _max) { _max = v; } else if (v < _min) { _min = v; } if (v < _minPos && v > epsilon) { _minPos = v; } } else { _is_rising = false; } } no_spike_max_dv = 7.0*sqrt(dv2/double(_nsum)); _ns_max = _ns_min = last_v = _v[i0]; last = _v[_size-1]; first = _v[0]; for (i = i0; i < _size; ++i) { v = _v[i]; // get rid of redirections if (isfinite(v)) { if (fabs(v - last_v) < no_spike_max_dv) { if (v > _ns_max) { _ns_max = v; } else if (v < _ns_min) { _ns_min = v; } last_v = v; } else { i += 20; if (i < _size) { last_v = _v[i]; } i++; } } } if (_isScalarList) { _max = _min = _minPos = 0.0; } else { _scalars["sum"]->setValue(sum); _scalars["sumsquared"]->setValue(sum2); _scalars["max"]->setValue(_max); _scalars["min"]->setValue(_min); _scalars["minpos"]->setValue(_minPos); _scalars["last"]->setValue(last); _scalars["first"]->setValue(first); } updateScalars(); } } void Vector::save(QXmlStreamWriter &s) { if (provider()) { return; } s.writeStartElement("vector"); if (_saveData) { QByteArray qba(length()*sizeof(double), '\0'); QDataStream qds(&qba, QIODevice::WriteOnly); for (int i = 0; i < length(); ++i) { qds << _v[i]; } s.writeTextElement("data_v2", qCompress(qba).toBase64()); } saveNameInfo(s, VNUM|XNUM); s.writeEndElement(); } void Vector::setNewAndShift(int inNew, int inShift) { NumNew = inNew; NumShifted = inShift; } double *Vector::value() const { return _v; } void Vector::newSync() { NumNew = NumShifted = 0; } int Vector::getUsage() const { int adj = 0; for (QHash::ConstIterator it = _scalars.begin(); it != _scalars.end(); ++it) { adj += it.value()->getUsage() - 1; } return Object::getUsage() + adj; } bool Vector::saveable() const { return _saveable; } bool Vector::editable() const { return _editable; } void Vector::setEditable(bool editable) { _editable = editable; } bool Vector::saveData() const { return _saveData; } void Vector::setSaveData(bool save) { _saveData = save; } void Vector::oldChange(QByteArray &data) { if (!data.isEmpty()) { _saveable = true; _saveData = true; QDataStream qds(data); int sz = qMax(qint64((size_t)(INITSIZE)), qint64(data.size()/sizeof(double))); resize(sz, true); double sum=0.0; for (int i = 0; i> _v[i]; if(!i) { _min=_max=_minPos=sum=_v[i]; _minPos=qMax(_minPos,qreal(0.0)); } else { _min=qMin(_v[i],_min); _max=qMax(_v[i],_max); _minPos=qMin(qMax(_v[i],qreal(0.0)),_minPos); sum+=_v[i]; } } _mean=sum/double(_size); } updateScalars(); internalUpdate(); } void Vector::change(QByteArray &data) { if (!data.isEmpty()) { _saveable = true; _saveData = true; qint64 count; QDataStream qds(data); qds>>count; int sz = qMax(qint64((size_t)(INITSIZE)), count); resize(sz, true); double sum=0.0; for (int i = 0; i> _v[i]; if(!i) { _min=_max=_minPos=sum=_v[i]; _minPos=qMax(_minPos,qreal(0.0)); } else { _min=qMin(_v[i],_min); _max=qMax(_v[i],_max); _minPos=qMin(qMax(_v[i],qreal(0.0)),_minPos); sum+=_v[i]; } } _mean=sum/double(count); } updateScalars(); internalUpdate(); } QString Vector::propertyString() const { if(_provider) { return tr("Provider: %1").arg(_provider->Name()); } else { return Name(); } } QString Vector::descriptionTip() const { return tr("Vector: %1\n %2 samples\n%3").arg(Name()).arg(length()).arg(_provider->descriptionTip()); } QString Vector::sizeString() const { return QString::number(length()); } ObjectList Vector::outputPrimitives() const { PrimitiveList primitive_list; int n = _scalars.count(); for (int i = 0; i< n; ++i) { primitive_list.append(kst_cast(_scalars.values().at(i))); } n = _strings.count(); for (int i = 0; i< n; ++i) { primitive_list.append(kst_cast(_strings.values().at(i))); } return primitive_list; } PrimitiveMap Vector::metas() const { PrimitiveMap meta; for (QHash::ConstIterator it = _strings.begin(); it != _strings.end(); ++it) { meta[it.key()] = it.value(); } for (QHash::ConstIterator it = _scalars.begin(); it != _scalars.end(); ++it) { meta[it.key()] = it.value(); } return meta; } LabelInfo Vector::labelInfo() const { return _labelInfo; } LabelInfo Vector::titleInfo() const { return _titleInfo; } void Vector::setLabelInfo(const LabelInfo &label_info) { _labelInfo = label_info; } void Vector::setTitleInfo(const LabelInfo &label_info) { _titleInfo = label_info; } QByteArray Vector::scriptInterface(QList &c) { Q_ASSERT(c.size()); if(c[0]=="length") { return QByteArray::number(_size); } else if(c[0]=="interpolate") { if(c.size()!=3) { return "interpolate takes 2 args"; } return QByteArray::number(interpolate(c[1].toInt(),c[2].toInt())); } else if(c[0]=="interpolateNoHoles") { if(c.size()!=3) { return "interpolateNoHoles takes 2 args"; } return QByteArray::number(interpolateNoHoles(c[1].toInt(),c[2].toInt())); } else if(c[0]=="value") { if(c.size()!=2) { return "value takes 1 arg"; } readLock(); QByteArray ret = QByteArray::number(value(c[1].toDouble())); unlock(); return ret; } else if(c[0]=="min") { return QByteArray::number(min()); } else if(c[0]=="max") { return QByteArray::number(max()); } else if(c[0]=="ns_max") { return QByteArray::number(ns_max()); } else if(c[0]=="ns_min") { return QByteArray::number(ns_min()); } else if(c[0]=="mean") { return QByteArray::number(mean()); } else if(c[0]=="minPos") { return QByteArray::number(minPos()); } else if(c[0]=="numNew") { return QByteArray::number(numNew()); } else if(c[0]=="numShift") { return QByteArray::number(numShift()); } else if(c[0]=="isRising") { return isRising()?"true":"false"; } else if(c[0]=="newSync") { newSync(); return "Ok"; } else if(c[0]=="resize") { if(c.size()!=3) { return "takes 2 args"; } return resize(c[1].toInt(),c[2].toInt())?"true":"false"; } else if(c[0]=="setNewAndShift") { if(c.size()!=3) { return "takes 2 args"; } setNewAndShift(c[0].toInt(),c[1].toInt()); return "Ok"; } else if(c[0]=="zero") { zero(); return "Ok"; } else if(c[0]=="blank") { blank(); return "Ok"; } return "No such command..."; } QByteArray Vector::getBinaryArray() const { readLock(); QByteArray ret; QDataStream ds(&ret,QIODevice::WriteOnly); ds<<(qint64)_size; for(int i=0; i<_size; ++i) { ds<<(double)_v[i]; } unlock(); return ret; } #undef INITSIZE } // vim: et sw=2 ts=2 Kst-2.0.8/src/libkst/sysinfo.h0000644000175000017500000001176512277111530015311 0ustar synthsynth/*************************************************************************** * * * This program is free software; you can 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 file is from the procps project at http://procps.sourceforge.net/ * * * ***************************************************************************/ #ifdef __linux__ #ifndef PROC_SYSINFO_H #define PROC_SYSINFO_H #include #include #include "procps.h" EXTERN_C_BEGIN extern unsigned long long Hertz; /* clock tick frequency */ extern long smp_num_cpus; /* number of CPUs */ #if 0 #define JT double extern void seven_cpu_numbers(JT *uret, JT *nret, JT *sret, JT *iret, JT *wret, JT *xret, JT *yret); #undef JT #endif extern int uptime (double *uptime_secs, double *idle_secs); extern void loadavg(double *av1, double *av5, double *av15); /* obsolete */ extern unsigned long kb_main_shared; /* old but still kicking -- the important stuff */ extern unsigned long kb_main_buffers; extern unsigned long kb_main_cached; extern unsigned long kb_main_free; extern unsigned long kb_main_total; extern unsigned long kb_swap_free; extern unsigned long kb_swap_total; /* recently introduced */ extern unsigned long kb_high_free; extern unsigned long kb_high_total; extern unsigned long kb_low_free; extern unsigned long kb_low_total; /* 2.4.xx era */ extern unsigned long kb_active; extern unsigned long kb_inact_laundry; /* grrr... */ extern unsigned long kb_inact_dirty; extern unsigned long kb_inact_clean; extern unsigned long kb_inact_target; extern unsigned long kb_swap_cached; /* late 2.4+ */ /* derived values */ extern unsigned long kb_swap_used; extern unsigned long kb_main_used; /* 2.5.41+ */ extern unsigned long kb_writeback; extern unsigned long kb_slab; extern unsigned long nr_reversemaps; extern unsigned long kb_committed_as; extern unsigned long kb_dirty; extern unsigned long kb_inactive; extern unsigned long kb_mapped; extern unsigned long kb_pagetables; #define BUFFSIZE 8192 typedef unsigned long long jiff; extern void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff *restrict cxxx, jiff *restrict cyyy, unsigned long *restrict pin, unsigned long *restrict pout, unsigned long *restrict s_in, unsigned long *restrict sout, unsigned *restrict intr, unsigned *restrict ctxt, unsigned int *restrict running, unsigned int *restrict blocked, unsigned int *restrict btime, unsigned int *restrict processes); extern void meminfo(void); extern unsigned long vm_nr_dirty; extern unsigned long vm_nr_writeback; extern unsigned long vm_nr_pagecache; extern unsigned long vm_nr_page_table_pages; extern unsigned long vm_nr_reverse_maps; extern unsigned long vm_nr_mapped; extern unsigned long vm_nr_slab; extern unsigned long vm_pgpgin; extern unsigned long vm_pgpgout; extern unsigned long vm_pswpin; extern unsigned long vm_pswpout; extern unsigned long vm_pgalloc; extern unsigned long vm_pgfree; extern unsigned long vm_pgactivate; extern unsigned long vm_pgdeactivate; extern unsigned long vm_pgfault; extern unsigned long vm_pgmajfault; extern unsigned long vm_pgscan; extern unsigned long vm_pgrefill; extern unsigned long vm_pgsteal; extern unsigned long vm_kswapd_steal; extern unsigned long vm_pageoutrun; extern unsigned long vm_allocstall; extern void vminfo(void); typedef struct disk_stat{ unsigned long long reads_sectors; unsigned long long written_sectors; char disk_name [16]; unsigned int disk_type; unsigned inprogress_IO; unsigned merged_reads; unsigned merged_writes; unsigned milli_reading; unsigned milli_spent_IO; unsigned milli_writing; unsigned partitions; unsigned reads; unsigned weighted_milli_spent_IO; unsigned writes; }disk_stat; typedef struct partition_stat{ unsigned int disk_type; unsigned int partition_num; char partition_name [16]; unsigned long long reads_sectors; struct disk_stat* parent_disk; unsigned reads; unsigned writes; unsigned requested_writes; }partition_stat; extern unsigned int getpartitions_num(struct disk_stat *disks, int ndisks); extern unsigned int getdiskstat (struct disk_stat**,struct partition_stat**); typedef struct slab_cache{ char name[48]; unsigned active_objs; unsigned num_objs; unsigned objsize; unsigned objperslab; }slab_cache; extern unsigned int getslabinfo (struct slab_cache**); extern unsigned get_pid_digits(void) FUNCTION; EXTERN_C_END #endif /* SYSINFO_H */ #endif Kst-2.0.8/src/libkst/kst_inf.h0000644000175000017500000000316412277111530015246 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_INF_H #define KST_INF_H #include #include #include #include #ifdef __sun #include #endif #if !defined(INF) #include static double inf__() { /* work around some strict alignment requirements for double variables on some architectures (e.g. PA-RISC) */ typedef union { unsigned char b[8]; double d; } kjs_double_t; #if Q_BYTE_ORDER == Q_BIG_ENDIAN static const kjs_double_t Inf_Bytes = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } }; #elif defined(arm) static const kjs_double_t Inf_Bytes = { { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 } }; #else static const kjs_double_t Inf_Bytes = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } }; #endif const double Inf = Inf_Bytes.d; return Inf; } #define INF (::inf__()) #endif #endif // KST_INF_H Kst-2.0.8/src/libkst/stdinsource.cpp0000644000175000017500000000774412277111530016516 0ustar synthsynth/*************************************************************************** stdinsource.cpp - data source for stdin ------------------- begin : Fri Oct 31 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "kst_i18n.h" #include "config.h" #include "stdinsource.h" #include #include #include #include #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif namespace Kst { const QString StdinSource::staticTypeString = I18N_NOOP("Stdin Data Source"); StdinSource::StdinSource(ObjectStore *store, QSettings *cfg) : DataSource(store, cfg, "stdin", "stdin") { _file = new QTemporaryFile; _filename = _file->fileName(); // Unfortunately we have to update here. stdin is a special case. update(); _src = DataSource::loadSource(this->store(), _filename, "ASCII"); if (_src && _src->isValid()) { _valid = true; } } StdinSource::~StdinSource() { _file->close(); delete _file; _file = 0L; } const QString& StdinSource::typeString() const { return staticTypeString; } Object::UpdateType StdinSource::internalDataSourceUpdate() { if (!_valid) { _src = DataSource::loadSource(store(), _filename, "ASCII"); if (_src && _src->isValid()) { _valid = true; } else { return NoChange; } } fd_set rfds; struct timeval tv; int retval; char instr[4097]; int i = 0; bool new_data = false; bool got_some = false; int handle = _file->handle(); FILE *fp = fdopen(handle, "w+"); if (!fp) { return Object::NO_CHANGE; } do { /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to 0 seconds. */ tv.tv_sec = 0; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); new_data = false; if (retval > 0) { char *fgs = fgets(instr, 4096, stdin); if (fgs && fp) { got_some = true; fputs(instr, fp); new_data = true; } } } while (++i < 100000 && new_data); fclose(fp); if (got_some && _src) { return _src->update(); } return NoChange; } int StdinSource::readField(double *v, const QString& field, int s, int n) { if (isValid()) { return _src->readField(v, field, s, n); } return -1; } bool StdinSource::isValidField(const QString& field) const { if (isValid()) { return _src->isValidField(field); } return false; } int StdinSource::samplesPerFrame(const QString& field) { if (isValid()) { return _src->samplesPerFrame(field); } return 0; } int StdinSource::frameCount(const QString& field) const { if (isValid()) { return _src->frameCount(field); } return 0; } QString StdinSource::fileType() const { if (isValid()) { return _src->fileType(); } return QString::null; } void StdinSource::save(QXmlStreamWriter &s) { if (isValid()) { return _src->save(s); } DataSource::save(s); } bool StdinSource::isValid() const { return _valid && _src && _src->isValid(); } bool StdinSource::isEmpty() const { return !isValid() || _src->isEmpty(); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/settings.cpp0000644000175000017500000000305012277111530015776 0ustar synthsynth/*************************************************************************** object.cpp: abstract base class for all Kst objects ------------------- copyright : (C) 2013 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "settings.h" #include #include #include static QVector s_settings; QSettings& Kst::createSettings(const QString& scope) { const QString organization = "kst"; QSettings* setting = //new QSettings(QApplication::applicationDirPath() + "/" + organization + "-" + scope + ".ini", QSettings::IniFormat); new QSettings(organization, scope); s_settings << setting; return *setting; } void Kst::deleteAllSettings() { Q_FOREACH(QSettings* s, s_settings) { delete s; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/scalar.h0000644000175000017500000000564212320547027015064 0ustar synthsynth/*************************************************************************** kstscalar.h - the base scalar type ------------------- begin : March 24, 2003 copyright : (C) 2003 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SCALAR_H #define SCALAR_H #include "primitive.h" class QXmlStreamWriter; namespace Kst { /** The base class for all scalars. */ class KSTCORE_EXPORT Scalar : public Primitive { Q_OBJECT Q_PROPERTY(bool orphan READ orphan WRITE setOrphan) Q_PROPERTY(double value READ value WRITE setValue) Q_PROPERTY(bool displayable READ displayable WRITE setDisplayable) protected: Scalar(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _initializeShortName(); public: virtual ~Scalar(); /** Update the scalar.*/ virtual void internalUpdate(); virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; /* return a string representation of the scalar */ QString label() const; /** Save scalar information */ virtual void save(QXmlStreamWriter &s); Scalar& operator=(double v); virtual QString descriptionTip() const; virtual QString propertyString() const; virtual QString sizeString() const; virtual ObjectList outputPrimitives() const { return ObjectList(); } virtual PrimitiveMap metas() const { return PrimitiveMap(); } virtual ScriptInterface* createScriptInterface(); public slots: double value() const; /** Set the value of the scalar - ignored for some types */ void setValue(double inV); bool orphan() const; void setOrphan(bool orphan); bool displayable() const; void setDisplayable(bool displayable); bool editable() const; void setEditable(bool editable); protected: double _value; private: bool _orphan; bool _displayable; bool _editable; }; typedef SharedPtr ScalarPtr; typedef ObjectList ScalarList; typedef ObjectMap ScalarMap; } Q_DECLARE_METATYPE(Kst::Scalar*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datamatrix.cpp0000644000175000017500000004235312320547027016310 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datamatrix.h" #include #include #include #include #include #include #include "datacollection.h" #include "debug.h" #include "objectstore.h" #include "matrixscriptinterface.h" // xStart, yStart < 0 count from end // xNumSteps, yNumSteps < 1 read to end namespace Kst { const QString DataMatrix::staticTypeString = "Data Matrix"; const QString DataMatrix::staticTypeTag = "datamatrix"; DataMatrix::DataInfo::DataInfo() : samplesPerFrame(-1), xSize(-1), ySize(-1), invertXHint(false), invertYHint(false) { } DataMatrix::DataMatrix(ObjectStore *store) : Matrix(store), DataPrimitive(this) { } const QString& DataMatrix::typeString() const { return staticTypeString; } void DataMatrix::save(QXmlStreamWriter &xml) { if (dataSource()) { xml.writeStartElement(staticTypeTag); saveFilename(xml); xml.writeAttribute("field", _field); xml.writeAttribute("reqxstart", QString::number(_reqXStart)); xml.writeAttribute("reqystart", QString::number(_reqYStart)); xml.writeAttribute("reqnx", QString::number(_reqNX)); xml.writeAttribute("reqny", QString::number(_reqNY)); xml.writeAttribute("doave", QVariant(_doAve).toString()); xml.writeAttribute("doskip", QVariant(_doSkip).toString()); xml.writeAttribute("skip", QString::number(_skip)); xml.writeAttribute("xmin", QString::number(minX())); xml.writeAttribute("ymin", QString::number(minY())); xml.writeAttribute("xstep", QString::number(xStepSize())); xml.writeAttribute("ystep", QString::number(yStepSize())); saveNameInfo(xml, VNUM|MNUM|XNUM); xml.writeEndElement(); } } DataMatrix::~DataMatrix() { } ScriptInterface* DataMatrix::createScriptInterface() { return new MatrixDataSI(this); } void DataMatrix::change(DataSourcePtr file, const QString &field, int xStart, int yStart, int xNumSteps, int yNumSteps, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY) { KstWriteLocker l(this); commonConstructor(file, field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, minX, minY, stepX, stepY); } void DataMatrix::changeFrames(int xStart, int yStart, int xNumSteps, int yNumSteps, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY) { KstWriteLocker l(this); commonConstructor(dataSource(), _field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, minX, minY, stepX, stepY); } int DataMatrix::reqXStart() const { return _reqXStart; } int DataMatrix::reqYStart() const { return _reqYStart; } int DataMatrix::reqXNumSteps() const { return _reqNX; } int DataMatrix::reqYNumSteps() const { return _reqNY; } /* QString DataMatrix::filename() const { if (dataSource()) { return QString(dataSource()->fileName()); } return QString::null; } */ const QString& DataMatrix::field() const { return _field; } bool DataMatrix::xReadToEnd() const { return (_reqNX <= 0); } bool DataMatrix::yReadToEnd() const { return (_reqNY <= 0); } bool DataMatrix::xCountFromEnd() const { return (_reqXStart < 0); } bool DataMatrix::yCountFromEnd() const { return (_reqYStart < 0); } QString DataMatrix::label() const { bool ok; QString returnLabel; _field.toInt(&ok); if (ok && dataSource()) { dataSource()->readLock(); if (dataSource()->fileType() == "ASCII") { returnLabel = tr("Column %1").arg(_field); } else { returnLabel = _field; } dataSource()->unlock(); } else { returnLabel = _field; } return returnLabel; } bool DataMatrix::isValid() const { if (dataSource()) { dataSource()->readLock(); bool fieldValid = dataSource()->matrix().isValid(_field); dataSource()->unlock(); return fieldValid; } return false; } bool DataMatrix::checkValidity(const DataSourcePtr& ds) const { if (ds) { ds->readLock(); bool rc = ds->matrix().isValid(_field); ds->unlock(); return rc; } return false; } void DataMatrix::doUpdateSkip(int realXStart, int realYStart) { // since we are skipping, we don't need all the pixels // also, samples per frame is always 1 with skipping _nX = _nX / _skip; _nY = _nY / _skip; // resize the array if necessary int requiredSize = _nX * _nY; if (requiredSize != _zSize) { bool resizeOK = resizeZ(requiredSize); if (!resizeOK) { // TODO: Is aborting all we can do? fatalError("Not enough memory for matrix data"); return; } } // return data from readMatrix MatrixData matData; if (!_doAve) { // try to use the datasource's read with skip function - it will automatically // enlarge each pixel to correct for the skipping matData.z=_z; _NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, _skip); // -9999 means the skipping function is not supported by datasource if (_NS != -9999) { // set the recommended translate and scaling, and return _minX = matData.xMin; _minY = matData.yMin; _stepX = matData.xStepSize; _stepY = matData.yStepSize; } } // the skipping function is not supported by datasource; we need to manually skip if (_doAve) { // boxcar filtering is not supported by datasources currently; need to manually average if (_aveReadBufferSize < _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip) { _aveReadBufferSize = _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip; if (!kstrealloc(_aveReadBuffer, _aveReadBufferSize*sizeof(double))) { qCritical() << "Matrix resize failed"; } } _NS = 0; bool first = true; matData.z = _aveReadBuffer; double* zPos = _z; for (int i = 0; i < _nX; i++) { for (int j = 0; j < _nY; j++) { // read one buffer size in readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, _skip, _skip, -1); // take average of the buffer double bufferAverage = 0; for (int k = 0; k < _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip; k++) { bufferAverage += _aveReadBuffer[k]; } bufferAverage = bufferAverage / _aveReadBufferSize; // insert the average into the matrix *zPos = bufferAverage; zPos++; _NS++; if (first) { _minX = matData.xMin; _minY = matData.yMin; _stepX = matData.xStepSize * _skip * _samplesPerFrameCache; _stepY = matData.yStepSize * _skip * _samplesPerFrameCache; first = false; } } } } else { _NS = 0; bool first = true; for (int i = 0; i < _nX; i++) { for (int j = 0; j < _nY; j++) { // read one sample int samples = readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, -1, -1, -1); matData.z += samples; _NS += samples; if (first) { _minX = matData.xMin; _minY = matData.yMin; _stepX = matData.xStepSize * _skip * _samplesPerFrameCache; _stepY = matData.yStepSize * _skip * _samplesPerFrameCache; first = false; } } } } } void DataMatrix::doUpdateNoSkip(int realXStart, int realYStart) { // resize _z if necessary int requiredSize = _nX*_nY*_samplesPerFrameCache*_samplesPerFrameCache; if (requiredSize != _zSize) { bool resizeOK = resizeZ(requiredSize); if (!resizeOK) { // TODO: Is aborting all we can do? fatalError("Not enough memory for matrix data"); return; } } // read new data from file MatrixData matData; matData.z=_z; _NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, -1); // set the recommended translate and scaling _minX = matData.xMin; _minY = matData.yMin; _stepX = matData.xStepSize; _stepY = matData.yStepSize; } qint64 DataMatrix::minInputSerial() const { if (dataSource()) { return (dataSource()->serial()); } return NoInputs; } qint64 DataMatrix::maxInputSerialOfLastChange() const { if (dataSource()) { return (dataSource()->serialOfLastChange()); } return Forced; } void DataMatrix::_resetFieldMetadata() { _resetFieldScalars(); _resetFieldStrings(); } void DataMatrix::_resetFieldScalars() { } void DataMatrix::_resetFieldStrings() { const QMap meta_strings = dataSource()->matrix().metaStrings(_field); QStringList fieldStringKeys = _fieldStrings.keys(); // remove field strings that no longer need to exist readLock(); for (int i=0; i it(meta_strings); while (it.hasNext()) { it.next(); QString key = it.key(); StringPtr sp; if (!_fieldStrings.contains(key)) { // insert a new one _fieldStrings.insert(key, sp = store()->createObject()); sp->setProvider(this); sp->setSlaveName(key); } else { // find it sp = _fieldStrings[key]; } sp->setValue(it.value()); } unlock(); } LabelInfo DataMatrix::xLabelInfo() const { LabelInfo label_info; if (_fieldStrings.contains("x_quantity")) { label_info.quantity = _fieldStrings.value("x_quantity")->value(); } else { label_info.quantity.clear(); } if (_fieldStrings.contains("x_units")) { label_info.units = _fieldStrings.value("x_units")->value(); } else { label_info.units.clear(); } label_info.name.clear(); return label_info; } LabelInfo DataMatrix::yLabelInfo() const { LabelInfo label_info; if (_fieldStrings.contains("y_quantity")) { label_info.quantity = _fieldStrings.value("y_quantity")->value(); } else { label_info.quantity.clear(); } if (_fieldStrings.contains("y_units")) { label_info.units = _fieldStrings.value("y_units")->value(); } else { label_info.units.clear(); } label_info.name.clear(); return label_info; } LabelInfo DataMatrix::titleInfo() const { LabelInfo label_info; if (_fieldStrings.contains("z_quantity")) { label_info.quantity = _fieldStrings.value("z_quantity")->value(); } else { label_info.quantity.clear(); } if (_fieldStrings.contains("z_units")) { label_info.units = _fieldStrings.value("z_units")->value(); } else { label_info.units.clear(); } label_info.name = _field; return label_info; } void DataMatrix::internalUpdate() { if (dataSource()) { dataSource()->writeLock(); } else { return; } // see if we can turn off skipping (only check if skipping enabled) if (_doSkip && _samplesPerFrameCache == 1 && _skip < 2) { _doSkip = false; } // first get the real start and end range int realXStart; int realYStart; const DataInfo info = dataSource()->matrix().dataInfo(_field); int xSize = info.xSize; int ySize = info.ySize; _invertXHint = info.invertXHint; _invertYHint = info.invertYHint; if (_reqXStart < 0) { // counting from end realXStart = xSize - _reqNX; } else { realXStart = _reqXStart; } if (_reqYStart < 0) { // counting from end realYStart = ySize - _reqNY; } else { realYStart = _reqYStart; } if (_reqNX < 1) { // read to end _nX = xSize - _reqXStart; } else { _nX = _reqNX; } if (_reqNY < 1) { // read to end _nY = ySize - _reqYStart; } else { _nY = _reqNY; } // now do some sanity checks if (realXStart > xSize - 1) { realXStart = xSize - 1; } if (realXStart < 0) { realXStart = 0; } if (realYStart > ySize - 1) { realYStart = ySize - 1; } if (realYStart < 0) { realYStart = 0; } if (_nX < 1) { _nX = 1; } if (realXStart + _nX > xSize) { _nX = xSize - realXStart; } if (_nY < 1) { _nY = 1; } if (realYStart + _nY > ySize) { _nY = ySize - realYStart; } // do the reading; skip or non-skip version if (_doSkip) { doUpdateSkip(realXStart, realYStart); } else { doUpdateNoSkip(realXStart, realYStart); } // remember these as the last updated range _lastXStart = realXStart; _lastYStart = realYStart; _lastNX = _nX; _lastNY = _nY; _lastDoAve = _doAve; _lastDoSkip = _doSkip; _lastSkip = _skip; dataSource()->unlock(); Matrix::internalUpdate(); } void DataMatrix::reload() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { dataSource()->writeLock(); dataSource()->reset(); dataSource()->unlock(); reset(); } } PrimitivePtr DataMatrix::makeDuplicate() const { Q_ASSERT(store()); DataMatrixPtr matrix = store()->createObject(); matrix->writeLock(); matrix->change(dataSource(), _field, _reqXStart, _reqYStart, _reqNX, _reqNY, _doAve, _doSkip, _skip, _minX, _minY, _stepX, _stepY); if (descriptiveNameIsManual()) { matrix->setDescriptiveName(descriptiveName()); } matrix->registerChange(); matrix->unlock(); return kst_cast(matrix); } void DataMatrix::commonConstructor(DataSourcePtr in_file, const QString &field, int reqXStart, int reqYStart, int reqNX, int reqNY, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY) { _reqXStart = reqXStart; _reqYStart = reqYStart; _reqNX = reqNX; _reqNY = reqNY; setDataSource(in_file); _field = field; _doAve = doAve; _doSkip = doSkip; _skip = skip; _minX = minX; _minY = minY; _stepX = stepX; _stepY = stepY; _invertXHint = false; _invertYHint = false; _saveable = true; _editable = true; if (!dataSource()) { Debug::self()->log(tr("Data file for matrix %1 was not opened.").arg(Name()), Debug::Warning); } else { const DataInfo info = dataSource()->matrix().dataInfo(_field); _samplesPerFrameCache = info.samplesPerFrame; _invertXHint = info.invertXHint; _invertYHint = info.invertYHint; } _aveReadBuffer = 0L; _aveReadBufferSize = 0; _lastXStart = 0; _lastYStart = 0; _lastNX = 1; _lastNY = 1; _lastDoAve = false; _lastDoSkip = false;; _lastSkip = 1; _resetFieldMetadata(); } void DataMatrix::reset() { // must be called with a lock Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { const DataInfo info = dataSource()->matrix().dataInfo(_field); _samplesPerFrameCache = info.samplesPerFrame; _invertXHint = info.invertXHint; _invertYHint = info.invertYHint; } resizeZ(0); _NS = 0; _nX = 1; _nY = 0; _resetFieldMetadata(); } bool DataMatrix::doSkip() const { return _doSkip; } bool DataMatrix::doAverage() const { return _doAve; } int DataMatrix::skip() const { return _skip; } void DataMatrix::changeFile(DataSourcePtr in_file) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(tr("Data file for vector %1 was not opened.").arg(Name()), Debug::Warning); } setDataSource(in_file); if (dataSource()) { dataSource()->writeLock(); } reset(); if (dataSource()) { dataSource()->unlock(); } } QString DataMatrix::_automaticDescriptiveName() const{ QString name = field(); // un-escape escaped special characters so they aren't escaped 2x. name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]"); // now escape the special characters. name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); return name; } QString DataMatrix::descriptionTip() const { return tr( "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" ).arg(Name()).arg(dataSource()->fileName()).arg(field()).arg(_nX).arg(_nY); } QString DataMatrix::propertyString() const { if (dataSource().isPtrValid()) { return tr("%1 of %2", "field %1 from file %2").arg(field()).arg(dataSource()->fileName()); } else { return QString(); } } int DataMatrix::readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip) { ReadInfo p = { data, xStart, yStart, xNumSteps, yNumSteps, skip}; return dataSource()->matrix().read(matrix, p); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/vectorscriptinterface.cpp0000644000175000017500000001340612362705136020562 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "vectorscriptinterface.h" #include "objectstore.h" #include "datasourcepluginmanager.h" #include "updatemanager.h" #include "updateserver.h" #include namespace Kst { QString doVectorScriptCommand(QString command,Vector *vector) { QString v=ScriptInterface::doNamedObjectCommand(command, vector); if (!v.isEmpty()) { return v; } if (command.startsWith("value(")) { command.remove("value(").chop(1); return QString::number(vector->value(command.toInt())); } else if (command.startsWith("length(")) { return QString::number(vector->length()); } else if (command.startsWith("min(")) { return QString::number(vector->min()); } else if (command.startsWith("max(")) { return QString::number(vector->max()); } else if (command.startsWith("mean(")) { return QString::number(vector->mean()); } else if (command.startsWith("descriptionTip(")) { return vector->descriptionTip(); } return QString(); } /******************************************************/ /* Data Vectors */ /******************************************************/ VectorDataSI::VectorDataSI(DataVectorPtr it) { vector=it; } QString VectorDataSI::doCommand(QString command) { QString v=doVectorScriptCommand(command, vector); if (!v.isEmpty()) { return v; } if (command.startsWith(QLatin1String("change("))) { command.remove("change(").remove(')'); QStringList p = command.split(','); DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource( vector->store(), p.at(0)); vector->writeLock(); vector->change(ds, p.at(1), // field p.at(2).toInt(), // f0 p.at(3).toInt(), // n p.at(4).toInt(), // skip p.at(4).toInt() > 0, // do skip p.at(5) == "True" // do average ); vector->unlock(); return "Done"; } else if (command.startsWith("field(")) { return vector->field(); } else if (command.startsWith("filename(")) { return vector->filename(); } else if (command.startsWith("start(")) { return QString::number(vector->startFrame()); } else if (command.startsWith("NFrames(")) { return QString::number(vector->numFrames()); } else if (command.startsWith("skip(")) { return QString::number(vector->skip()); } else if (command.startsWith("boxcarFirst(")) { return vector->doAve()?"True":"False"; } return "No such command"; } bool VectorDataSI::isValid() { return vector.isPtrValid(); } ScriptInterface* VectorDataSI::newVector(ObjectStore *store) { DataVectorPtr vector; vector = store->createObject(); return new VectorDataSI(vector); } QByteArray VectorDataSI::endEditUpdate() { vector->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+vector->Name()).toLatin1(); } /******************************************************/ /* Generated Vectors */ /******************************************************/ VectorGenSI::VectorGenSI(GeneratedVectorPtr it) { vector=it; } QString VectorGenSI::doCommand(QString command) { QString v=doVectorScriptCommand(command, vector); if (!v.isEmpty()) { return v; } if (command.startsWith(QLatin1String("change("))) { command.remove("change(").remove(')'); QStringList p = command.split(','); vector->writeLock(); vector->changeRange( p.at(0).toDouble(), // start p.at(1).toDouble(), // end p.at(2).toInt() // number of points ); vector->unlock(); return "Done"; } return "No such command"; } bool VectorGenSI::isValid() { return vector.isPtrValid(); } ScriptInterface* VectorGenSI::newVector(ObjectStore *store) { GeneratedVectorPtr vector; vector = store->createObject(); return new VectorGenSI(vector); } QByteArray VectorGenSI::endEditUpdate() { vector->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+vector->Name()).toLatin1(); } /******************************************************/ /* Plain (base) Vectors */ /******************************************************/ VectorSI::VectorSI(VectorPtr it) { vector=it; } QString VectorSI::doCommand(QString command) { QString v=doVectorScriptCommand(command, vector); if (!v.isEmpty()) { return v; } return "No such command"; } bool VectorSI::isValid() { return vector.isPtrValid(); } ScriptInterface* VectorSI::newVector(ObjectStore *) { return 0L; } QByteArray VectorSI::endEditUpdate() { vector->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+vector->Name()).toLatin1(); } } Kst-2.0.8/src/libkst/stringscriptinterface.cpp0000644000175000017500000000605412320547027020564 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "stringscriptinterface.h" #include "objectstore.h" #include "datasourcepluginmanager.h" #include "updatemanager.h" #include "updateserver.h" #include namespace Kst { StringGenSI::StringGenSI(StringPtr it) { str=it; } QString StringGenSI::doCommand(QString x) { QString v=doNamedObjectCommand(x, str); if (!v.isEmpty()) { return v; } if (x.startsWith(QLatin1String("setValue("))) { str->writeLock(); str->setValue(x.remove("setValue(").remove(')')); str->unlock(); return "Done"; } else if (x.startsWith(QLatin1String("value()"))) { return str->value(); } return "No such command"; } bool StringGenSI::isValid() { return str.isPtrValid(); } ScriptInterface* StringGenSI::newString(ObjectStore *store) { StringPtr string; string = store->createObject(); string->setOrphan(true); string->setEditable(true); return new StringGenSI(string); } QByteArray StringGenSI::endEditUpdate() { UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+str->Name()).toLatin1(); } ///////////////////////////////////////////////////////////////////////////////////// StringDataSI::StringDataSI(DataStringPtr it) { str=it; } QString StringDataSI::doCommand(QString x) { QString v=doNamedObjectCommand(x, str); if (!v.isEmpty()) { return v; } if(x.startsWith(QLatin1String("change("))) { x.remove("change(").remove(')'); QStringList p = x.split(','); DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource( str->store(), p.at(0)); str->writeLock(); str->change(ds,p.at(1)); str->unlock(); return "Done"; } else if (x.startsWith(QLatin1String("value()"))) { return str->value(); } return "No such command"; } bool StringDataSI::isValid() { return str.isPtrValid(); } ScriptInterface* StringDataSI::newString(ObjectStore *store) { DataStringPtr string; string = store->createObject(); return new StringDataSI(string); } QByteArray StringDataSI::endEditUpdate() { UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+str->Name()).toLatin1(); } } Kst-2.0.8/src/libkst/scalarfactory.h0000644000175000017500000000302112277111530016436 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SCALARFACTORY_H #define SCALARFACTORY_H #include "primitivefactory.h" namespace Kst { class ScalarFactory : public PrimitiveFactory { public: ScalarFactory(); ~ScalarFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class DataScalarFactory : public PrimitiveFactory { public: DataScalarFactory(); ~DataScalarFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class VScalarFactory : public PrimitiveFactory { public: VScalarFactory(); ~VScalarFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/primitive.h0000644000175000017500000000626212277111530015623 0ustar synthsynth/*************************************************************************** primitive.h ------------------- begin : Tue Jun 20 2006 copyright : Copyright (C) 2006, The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PRIMITIVE_H #define PRIMITIVE_H #include #include "kst_export.h" #include "object.h" #include "objectlist.h" #include "objectmap.h" #include "dataprimitive.h" namespace Kst { class Primitive; typedef ObjectMap PrimitiveMap; class KSTCORE_EXPORT Primitive : public Object { Q_OBJECT Q_PROPERTY(Object* provider READ provider WRITE setProvider) Q_PROPERTY(bool hidden READ hidden WRITE setHidden) public: virtual const QString& typeString() const; static const QString staticTypeString; // Must not be a ObjectPtr! virtual void setProvider(Object* obj); inline ObjectPtr provider() const { return ObjectPtr(_provider); } void setSlaveName(QString slaveName); QString slaveName() const { return _slaveName; } virtual QString propertyString() const; virtual QString sizeString() const; virtual bool used() const; virtual void setUsed(bool used_in); virtual ObjectList outputPrimitives() const = 0; virtual PrimitiveMap metas() const = 0; // used for sorting dataobjects by Document::sortedDataObjectList() virtual bool flagSet() const { return _flag; } virtual void setFlag(bool f) { _flag = f;} public slots: bool hidden() const; void setHidden(bool hidden); protected: Primitive(ObjectStore *store, Object* provider = 0L); virtual ~Primitive(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; QString _slaveName; virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; virtual void fatalError(const QString& msg); protected: /** Possibly null. Be careful, this is non-standard usage of a KstShared. * FIXME: pretty sure this is wrong: it shouldn't be a qpointer... not sure * what should be going on here! */ QPointer _provider; private: bool _flag; // used for sorting dataobjects by Document::sortedDataObjectList() bool _hidden; // don't show in lists }; typedef SharedPtr PrimitivePtr; typedef ObjectList PrimitiveList; typedef ObjectMap PrimitiveMap; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/nextcolor.cpp0000644000175000017500000000226312277111530016160 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "nextcolor.h" using namespace Kst; NextColor* NextColor::_instance = 0; NextColor::NextColor() { NextColor::_instance = this; } NextColor::~NextColor() { NextColor::_instance = 0; } QColor NextColor::next() { return QColor(); } NextColor& NextColor::self() { Q_ASSERT(NextColor::_instance); return *NextColor::_instance; } Kst-2.0.8/src/libkst/vscalar.cpp0000644000175000017500000001171412320547027015602 0ustar synthsynth/*************************************************************************** vscalar.cpp - a scalar from a data source ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "vscalar.h" #include #include #include #include "debug.h" #include "objectstore.h" #include "updatemanager.h" #include "vscalar.h" #include "scalarscriptinterface.h" namespace Kst { const QString VScalar::staticTypeString = "Vector Field Scalar"; const QString VScalar::staticTypeTag = "vscalar"; /** Create a VScalar: a scalar from a single sample of a vector field */ VScalar::VScalar(ObjectStore *store) : Scalar(store) { _file = 0L; _field.clear(); setOrphan(true); } VScalar::~VScalar() { _file = 0; } QString VScalar::_automaticDescriptiveName() const { return field(); } const QString& VScalar::typeString() const { return staticTypeString; } ScriptInterface* VScalar::createScriptInterface() { return new ScalarVectorSI(this); } void VScalar::change(DataSourcePtr in_file, const QString &in_field, int in_f0) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); _field = in_field; _file = in_file; _f0 = in_f0; } void VScalar::changeFile(DataSourcePtr in_file) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(tr("Data file for scalar %1 was not opened.").arg(Name()), Debug::Warning); } } /** return the name of the file */ QString VScalar::filename() const { QString rc; if (_file) { _file->readLock(); rc = _file->fileName(); _file->unlock(); } return rc; } /** return the field */ const QString& VScalar::field() const { return _field; } /** return the sample number */ int VScalar::F0() const { return _f0; } /** Save data scalar information */ void VScalar::save(QXmlStreamWriter &s) { if (_file) { s.writeStartElement("vscalar"); _file->readLock(); s.writeAttribute("provider", _file->Name()); DataPrimitive::saveFilename(_file->fileName(), s); _file->unlock(); s.writeAttribute("field", _field); s.writeAttribute("f0", QString::number(_f0)); saveNameInfo(s, XNUM); s.writeEndElement(); } } /** Update a data Scalar */ void VScalar::internalUpdate() { if (_file) { int f0; if (_f0<0) { f0 = _file->vector().dataInfo(_field).frameCount-1; } else { f0 = _f0; } _file->writeLock(); DataVector::ReadInfo p = {&_value, f0, -1, -1}; _file->vector().read(_field, p); _file->unlock(); } } qint64 VScalar::minInputSerial() const { if (_file) { return (_file->serial()); } return LLONG_MAX; } qint64 VScalar::maxInputSerialOfLastChange() const { if (_file) { return (_file->serialOfLastChange()); } return NoInputs; } PrimitivePtr VScalar::_makeDuplicate() const { Q_ASSERT(store()); VScalarPtr scalar = store()->createObject(); scalar->writeLock(); scalar->change(_file, _field, _f0); if (descriptiveNameIsManual()) { scalar->setDescriptiveName(descriptiveName()); } scalar->registerChange(); scalar->unlock(); return kst_cast(scalar); } DataSourcePtr VScalar::dataSource() const { return _file; } QString VScalar::descriptionTip() const { QString IDstring; IDstring = tr( "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" ).arg(Name()).arg(dataSource()->fileName()).arg(field()).arg(value()).arg(F0()); return IDstring; } /** return true if it has a valid file and field, or false otherwise */ bool VScalar::isValid() const { if (_file) { _file->readLock(); bool rc = _file->vector().isValid(_field); _file->unlock(); return rc; } return false; } bool VScalar::_checkValidity(const DataSourcePtr ds) const { if (ds) { ds->readLock(); bool rc = ds->vector().isValid(_field); ds->unlock(); return rc; } return false; } QString VScalar::propertyString() const { return tr("%2 frame %3 of %1 = %4", "%2 is field name. %3 is frame/index. %1 is the file name. %4 is the value").arg(dataSource()->fileName()).arg(field()).arg(F0()).arg(value()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/primitive.cpp0000644000175000017500000000626112277111530016155 0ustar synthsynth/*************************************************************************** primitive.cpp ------------------- begin : Tue Jun 20, 2006 copyright : Copyright (C) 2006, The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * Permission is granted to link with any opensource library * * * ***************************************************************************/ //#define UPDATEDEBUG #include "primitive.h" #include #include #include #include "updatemanager.h" #include "datasource.h" namespace Kst { const QString Primitive::staticTypeString = "Primitive"; Primitive::Primitive(ObjectStore *store, Object *provider) : Object(), _provider(provider) { Q_UNUSED(store); _slaveName = "fixme: set _slaveName"; _hidden = false; } Primitive::~Primitive() { } const QString& Primitive::typeString() const { return staticTypeString; } void Primitive::setProvider(Object* obj) { _provider = obj; } void Primitive::setSlaveName(QString slaveName) { _slaveName=slaveName; } QString Primitive::_automaticDescriptiveName() const { QString name; if (_provider) { name = _provider->descriptiveName() + ':'; } name += _slaveName; return name; } qint64 Primitive::minInputSerial() const { if (_provider) { return (_provider->serial()); } return LLONG_MAX; } qint64 Primitive::maxInputSerialOfLastChange() const { if (_provider) { return (_provider->serialOfLastChange()); } return NoInputs; } QString Primitive::propertyString() const { return QString("Base Class Property String"); } QString Primitive::sizeString() const { return QString("Base Class Size String"); } bool Primitive::used() const { if (_provider) { return true; } else { return Object::used(); } } void Primitive::setUsed(bool used_in) { _used = used_in; if (_used && provider()) { provider()->setUsed(true); } } void Primitive::fatalError(const QString& msg) { QString message = msg; message +="\nError could be ignored, but chances are high that Kst will crash."; message += "\nWhen reading ASCII data you could limit the size of the file buffer to save memory."; QMessageBox::StandardButton btn = QMessageBox::critical(0, "A fatal error occurred", message, QMessageBox::Abort | QMessageBox::Ignore); if (btn == QMessageBox::Abort) { exit(-2); } } bool Primitive::hidden() const { return _hidden; } void Primitive::setHidden(bool hidden) { _hidden = hidden; } } // vim: et sw=2 ts=2 Kst-2.0.8/src/libkst/rwlock.h0000644000175000017500000000474612277111530015121 0ustar synthsynth/*************************************************************************** rwlock.h ------------------- begin : Feb 21, 2004 copyright : (C) 2004 The University of toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef RWLOCK_H #define RWLOCK_H #include #include #include #include #include #include "kst_export.h" // NOTE: In order to preserve binary compatibility with plugins, you must // update the plugin keys whenever you add, remove, or change member // variables or virtual functions, or when you remove or change // non-virtual functions. class KSTCORE_EXPORT KstRWLock { public: KstRWLock(); virtual ~KstRWLock(); virtual void readLock() const; virtual void writeLock() const; virtual void unlock() const; enum LockStatus {UNLOCKED, READLOCKED, WRITELOCKED}; virtual LockStatus lockStatus() const; virtual LockStatus myLockStatus() const; protected: #ifdef ONE_LOCK_TO_RULE_THEM_ALL static #else mutable #endif QMutex _mutex; mutable QWaitCondition _readerWait, _writerWait; mutable int _readCount, _writeCount; mutable int _waitingReaders, _waitingWriters; mutable Qt::HANDLE _writeLocker; mutable QMap _readLockers; }; class KSTCORE_EXPORT KstReadLocker { public: explicit KstReadLocker(KstRWLock *l) : _l(l) { _l->readLock(); } ~KstReadLocker() { _l->unlock(); } private: KstRWLock *_l; }; class KSTCORE_EXPORT KstWriteLocker { public: explicit KstWriteLocker(KstRWLock *l) : _l(l) { _l->writeLock(); } ~KstWriteLocker() { _l->unlock(); } private: KstRWLock *_l; }; #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/stringfactory.cpp0000644000175000017500000000467012277111530017045 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "stringfactory.h" #include "debug.h" #include "string_kst.h" #include "objectstore.h" namespace Kst { StringFactory::StringFactory() : PrimitiveFactory() { registerFactory(String::staticTypeTag, this); } StringFactory::~StringFactory() { } PrimitivePtr StringFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; Q_ASSERT(store); bool orphan = true; bool editable = true; QString value, descriptiveName; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == "string") { QXmlStreamAttributes attrs = xml.attributes(); value = attrs.value("value").toString(); orphan = attrs.value("orphan").toString() == "true" ? true : false; editable = attrs.value("editable").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == "string") { break; } else { Debug::self()->log(QObject::tr("Error creating string from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } StringPtr string = store->createObject(); string->setValue(value); string->setOrphan(orphan); string->setEditable(editable); string->setDescriptiveName(descriptiveName); return string; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/updatemanager.h0000644000175000017500000000362312277111530016426 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef UPDATEMANAGER_H #define UPDATEMANAGER_H #include "object.h" #include #include namespace Kst { class ObjectStore; class KSTCORE_EXPORT UpdateManager : public QObject { Q_OBJECT public: static UpdateManager *self(); void setMinimumUpdatePeriod(const int period) { _minUpdatePeriod = period; } int minimumUpdatePeriod() { return _minUpdatePeriod; } void setPaused(bool paused) { _paused = paused;} bool paused() { return _paused; } void setStore(ObjectStore *store) {_store = store;} public Q_SLOTS: void doUpdates(bool forceImmediate = false); void delayedUpdates(); void viewItemUpdateFinished() { _updateInProgress = false; } Q_SIGNALS: void objectsUpdated(qint64 serial); private: UpdateManager(); ~UpdateManager(); static void cleanup(); QTime _time; private: bool _delayedUpdate; int _minUpdatePeriod; bool _paused; bool _delayedUpdateScheduled; bool _updateInProgress; qint64 _serial; ObjectStore *_store; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/sysinfo.c0000644000175000017500000001516612277111530015303 0ustar synthsynth// Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm@redhat.com // Copyright 1998-2003 Albert Cahalan // // This file is placed under the conditions of the GNU Library // General Public License, version 2, or any later version. // See file COPYING for information on distribution conditions. // // File for parsing top-level /proc entities. // This file is from the procps project at http://procps.sourceforge.net/ #include #include #include #include #include #include #include #include #define BAD_OPEN_MESSAGE \ "Error: /proc must be mounted\n" \ " To mount /proc at boot you need an /etc/fstab line like:\n" \ " /proc /proc proc defaults\n" \ " In the meantime, mount /proc /proc -t proc\n" #define MEMINFO_FILE "/proc/meminfo" static int meminfo_fd = -1; static char buf[1024]; /* This macro opens filename only if necessary and seeks to 0 so * that successive calls to the functions are more efficient. * It also reads the current contents of the file into the global buf. */ #define FILE_TO_BUF(filename, fd) do{ \ static int local_n; \ if (fd == -1 && (fd = open(filename, O_RDONLY)) == -1) { \ fprintf(stderr, BAD_OPEN_MESSAGE); \ fflush(NULL); \ _exit(102); \ } \ lseek(fd, 0L, SEEK_SET); \ if ((local_n = read(fd, buf, sizeof buf - 1)) < 0) { \ perror(filename); \ fflush(NULL); \ _exit(103); \ } \ buf[local_n] = '\0'; \ }while(0) /* evals 'x' twice */ #define SET_IF_DESIRED(x,y) do{ if(x) *(x) = (y); }while(0) /***********************************************************************/ /* * Copyright 1999 by Albert Cahalan; all rights reserved. * This file may be used subject to the terms and conditions of the * GNU Library General Public License Version 2, or any later version * at your option, as published by the Free Software Foundation. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. */ typedef struct mem_table_struct { const char *name; /* memory type name */ unsigned long *slot; /* slot in return struct */ } mem_table_struct; static int compare_mem_table_structs(const void *a, const void *b){ return strcmp(((const mem_table_struct*)a)->name,((const mem_table_struct*)b)->name); } /* example data, following junk, with comments added: * * MemTotal: 61768 kB old * MemFree: 1436 kB old * MemShared: 0 kB old (now always zero; not calculated) * Buffers: 1312 kB old * Cached: 20932 kB old * Active: 12464 kB new * Inact_dirty: 7772 kB new * Inact_clean: 2008 kB new * Inact_target: 0 kB new * Inact_laundry: 0 kB new, and might be missing too * HighTotal: 0 kB * HighFree: 0 kB * LowTotal: 61768 kB * LowFree: 1436 kB * SwapTotal: 122580 kB old * SwapFree: 60352 kB old * Inactive: 20420 kB 2.5.41+ * Dirty: 0 kB 2.5.41+ * Writeback: 0 kB 2.5.41+ * Mapped: 9792 kB 2.5.41+ * Slab: 4564 kB 2.5.41+ * Committed_AS: 8440 kB 2.5.41+ * PageTables: 304 kB 2.5.41+ * ReverseMaps: 5738 2.5.41+ * SwapCached: 0 kB 2.5.??+ * HugePages_Total: 220 2.5.??+ * HugePages_Free: 138 2.5.??+ * Hugepagesize: 4096 kB 2.5.??+ */ /* obsolete */ unsigned long kb_main_shared; /* old but still kicking -- the important stuff */ unsigned long kb_main_buffers; unsigned long kb_main_cached; unsigned long kb_main_free; unsigned long kb_main_total; unsigned long kb_swap_free; unsigned long kb_swap_total; /* recently introduced */ unsigned long kb_high_free; unsigned long kb_high_total; unsigned long kb_low_free; unsigned long kb_low_total; /* 2.4.xx era */ unsigned long kb_active; unsigned long kb_inact_laundry; unsigned long kb_inact_dirty; unsigned long kb_inact_clean; unsigned long kb_inact_target; unsigned long kb_swap_cached; /* late 2.4 only */ /* derived values */ unsigned long kb_swap_used; unsigned long kb_main_used; /* 2.5.41+ */ unsigned long kb_writeback; unsigned long kb_slab; unsigned long nr_reversemaps; unsigned long kb_committed_as; unsigned long kb_dirty; unsigned long kb_inactive; unsigned long kb_mapped; unsigned long kb_pagetables; void meminfo(void){ char namebuf[16]; /* big enough to hold any row name */ mem_table_struct findme = { namebuf, NULL}; mem_table_struct *found; char *head; char *tail; static const mem_table_struct mem_table[] = { {"Active", &kb_active}, {"Buffers", &kb_main_buffers}, {"Cached", &kb_main_cached}, {"Committed_AS", &kb_committed_as}, {"Dirty", &kb_dirty}, {"HighFree", &kb_high_free}, {"HighTotal", &kb_high_total}, {"Inact_clean", &kb_inact_clean}, {"Inact_dirty", &kb_inact_dirty}, {"Inact_laundry",&kb_inact_laundry}, {"Inact_target", &kb_inact_target}, {"Inactive", &kb_inactive}, {"LowFree", &kb_low_free}, {"LowTotal", &kb_low_total}, {"Mapped", &kb_mapped}, {"MemFree", &kb_main_free}, {"MemShared", &kb_main_shared}, {"MemTotal", &kb_main_total}, {"PageTables", &kb_pagetables}, {"ReverseMaps", &nr_reversemaps}, {"Slab", &kb_slab}, {"SwapCached", &kb_swap_cached}, {"SwapFree", &kb_swap_free}, {"SwapTotal", &kb_swap_total}, {"Writeback", &kb_writeback}, }; const int mem_table_count = sizeof(mem_table)/sizeof(mem_table_struct); FILE_TO_BUF(MEMINFO_FILE,meminfo_fd); kb_inactive = ~0UL; head = buf; for(;;){ tail = strchr(head, ':'); if(!tail) break; *tail = '\0'; if(strlen(head) >= sizeof(namebuf)){ head = tail+1; goto nextline; } strcpy(namebuf,head); found = bsearch(&findme, mem_table, mem_table_count, sizeof(mem_table_struct), compare_mem_table_structs ); head = tail+1; if(!found) goto nextline; *(found->slot) = strtoul(head,&tail,10); nextline: tail = strchr(head, '\n'); if(!tail) break; head = tail+1; } if(!kb_low_total){ /* low==main except with large-memory support */ kb_low_total = kb_main_total; kb_low_free = kb_main_free; } if(kb_inactive==~0UL){ kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry; } kb_swap_used = kb_swap_total - kb_swap_free; kb_main_used = kb_main_total - kb_main_free; } Kst-2.0.8/src/libkst/object.cpp0000644000175000017500000000611312320547027015412 0ustar synthsynth/*************************************************************************** object.cpp: abstract base class for all Kst objects ------------------- begin : May 25, 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "object.h" class ScriptInterface; #include "objectstore.h" namespace Kst { const QString Object::staticTypeString = "Object"; Object::Object() : Shared(), KstRWLock(), NamedObject(), _store(0L), _serial(0), _serialOfLastChange(0), _interface(0) { } Object::~Object() { } QString Object::type() { return staticMetaObject.className(); } void Object::reset() { _serial = _serialOfLastChange = Forced; } const QString& Object::typeString() const { return staticTypeString; } ScriptInterface* Object::createScriptInterface() { return NULL; } ScriptInterface* Object::scriptInterface() { if (!_interface) { _interface = createScriptInterface(); } return _interface; } // Returns count - 1 to account for "this" and the list pointer, therefore // you MUST have a reference-counted pointer to call this function int Object::getUsage() const { return _KShared_count() - 1; } void Object::deleteDependents() { QList Objects = _store->objectList(); foreach (ObjectPtr object, Objects) { if (object->uses(this)) { _store->removeObject(object); } } } bool Object::uses(ObjectPtr p) const { Q_UNUSED(p) return false; } ObjectStore* Object::store() const { return _store; } // decide, based on serial numbers, whether to do an update. // if all inputs are up to date, update. Otherwise, defer. Object::UpdateType Object::objectUpdate(qint64 newSerial) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (newSerial == _serial) { return NoChange; } if (newSerial == Forced) { // register the forced update, but don't do it now. //qDebug()<<"Forced, def"; _serial = Forced; return Deferred; } else if (minInputSerial() < newSerial) { // if an input was forced, this will be true return Deferred; } else if ((_serialOfLastChange < maxInputSerialOfLastChange()) || (_serial == Object::Forced)) { internalUpdate(); _serialOfLastChange = newSerial; _serial = newSerial; return Updated; } // else _serial = newSerial; return NoChange; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/dateparser.cpp0000644000175000017500000000642012277111530016274 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dateparser.h" #include #include #include #include namespace Kst { QDateTime millisecondsToQDateTime(double ms) { QDateTime edt; edt.setTime_t(0); if (ms > 0.0) { double milli = fmod(ms, 1000.0); ms = (ms - milli) / 1000.0; assert(ms < 60*365*24*60*60); // we can't handle big dates yet // this will have to change when we do edt.setTime_t(int(ms)); QTime t = edt.time(); t.setHMS(t.hour(), t.minute(), t.second(), int(milli)); edt.setTime(t); } if (ms < 0.0) { abort(); // unhandled at this point } return edt; } double extDateTimeToMilliseconds(const QDateTime& edt) { double rc = 0.0; if (edt.isNull()) { return rc; } int year = edt.date().year(); if (year > 1969 && year < 2030) { // fix later rc = 1000.0 * edt.toTime_t() + edt.time().msec(); } else { // Manually construct rc abort(); } return rc; } QDateTime parsePlanckDate(const QString& dateString) { QStringList secondSplit = dateString.split('.'); if (secondSplit.isEmpty() || secondSplit.count() > 2) { return QDateTime(); } int seconds = 0; if (secondSplit.count() > 1) { seconds = secondSplit[1].toUInt(); } QStringList mainSplit = secondSplit[0].split(':'); QDateTime edt = QDateTime::currentDateTime(); int offset = QDateTime::currentDateTime().toUTC().toTime_t() - edt.toTime_t(); QDate d = edt.date(); QTime t = edt.time(); int i = 0; switch (mainSplit.count()) { default: return QDateTime(); case 5: { int years = mainSplit[i++].toInt(); if (years < 100) { if (years < 0) { years = 1970 - years; } else { years += 2000; } } d.setDate(years, d.month(), d.day()); } case 4: { unsigned month = mainSplit[i++].toUInt(); d.setDate(d.year(), month, d.day()); } case 3: { unsigned day = mainSplit[i++].toInt(); d.setDate(d.year(), d.month(), day); } edt.setDate(d); case 2: { unsigned hour = mainSplit[i++].toInt(); t.setHMS(hour, t.minute(), t.second()); } case 1: { unsigned minute = mainSplit[i].toInt(); t.setHMS(t.hour(), minute, t.second()); } case 0: t.setHMS(t.hour(), t.minute(), seconds); edt.setTime(t); break; } return edt.addSecs(-offset); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/builtinprimitives.h0000644000175000017500000000205612277111530017372 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef BUILTINPRIMITIVES_H #define BUILTINPRIMITIVES_H #include "kst_export.h" namespace Kst { class ObjectStore; namespace Builtins { KSTCORE_EXPORT void initPrimitives(); } } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/dateparser.h0000644000175000017500000000261012277111530015736 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2005 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATEPARSER_H #define DATEPARSER_H #include #include #include #include "kst_export.h" /* This is a public header */ namespace Kst { /* All times represented as doubles are the number of milliseconds since Jan 01 1970 00:00:00. Negative times are before then. */ KSTCORE_EXPORT extern QDateTime parsePlanckDate(const QString& dateString); KSTCORE_EXPORT extern double extDateTimeToMilliseconds(const QDateTime& edt); KSTCORE_EXPORT extern QDateTime millisecondsToQDateTime(double ms); } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/dataprimitive.cpp0000644000175000017500000000744312277111530017012 0ustar synthsynth/*************************************************************************** datastprimitive.cpp - add datasource handling capability to a primitive ------------------- begin : October, 2009 copyright : (C) 2009 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dataprimitive.h" #include "debug.h" #include "datasource.h" #include #include namespace Kst { struct DataPrimitive::Private { Primitive* _primitive; DataSourcePtr _file; static void saveFilename(const QString& fn, QXmlStreamWriter& s); }; void DataPrimitive::Private::saveFilename(const QString& fn, QXmlStreamWriter& s) { if (!fn.isEmpty()) { // QDir::current is set to *.kst's file path in mainwindow.cpp QDir current = QDir::current(); QString relFn = current.relativeFilePath(fn); s.writeAttribute("file", current.absoluteFilePath(fn)); if (QDir::isRelativePath(relFn)) { // is absolute if on a differnt disk/network s.writeAttribute("fileRelative", relFn); } } } DataPrimitive::DataPrimitive(Primitive* primitive) : d(*new Private) { d._file = 0; d._primitive = primitive; _field.clear(); } DataPrimitive::~DataPrimitive() { _field.clear(); d._file = 0; d._primitive = 0; delete &d; } void DataPrimitive::changeFile(DataSourcePtr in_file) { Q_ASSERT(d._primitive->myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(Primitive::tr("Data file for vector %1 was not opened.").arg(d._primitive->Name()), Debug::Warning); } d._file = in_file; if (d._file) { d._file->writeLock(); } d._primitive->reset(); if (d._file) { d._file->unlock(); } d._primitive->registerChange(); } /** return the name of the file */ QString DataPrimitive::filename() const { QString rc; if (d._file) { d._file->readLock(); rc = d._file->fileName(); d._file->unlock(); } return rc; } void DataPrimitive::saveFilename(QXmlStreamWriter& s) { if (d._file) { d._file->readLock(); DataPrimitive::Private::saveFilename(d._file->fileName(), s); d._file->unlock(); } } void DataPrimitive::saveFilename(const QString& fileName, QXmlStreamWriter& s) { DataPrimitive::Private::saveFilename(fileName, s); } QString DataPrimitive::readFilename(const QXmlStreamAttributes& attrs) { // TODO discuss strategy: // - first try relative path // - fall back to absolute path // QDir::current is set to *.kst's file path in mainwindow.cpp QDir current = QDir::current(); QString fnRel = attrs.value("fileRelative").toString(); if (!fnRel.isEmpty() && current.exists(fnRel)) { // internally only use absolute paths return current.absoluteFilePath(fnRel); } return attrs.value("file").toString(); } /** return the field */ const QString& DataPrimitive::field() const { return _field; } DataSourcePtr DataPrimitive::dataSource() const { return d._file; } void DataPrimitive::setDataSource(const DataSourcePtr& file) { d._file = file; } } Kst-2.0.8/src/libkst/datastring.h0000644000175000017500000000533112320547027015752 0ustar synthsynth/*************************************************************************** dataststring.h - a string from a data source ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASTRING_H #define DATASTRING_H #include "kst_export.h" #include "dataprimitive.h" #include "string_kst.h" class QXmlStreamWriter; namespace Kst { /**A class for handling data strings for kst. *@author cbn */ /** A string which gets its value from a data file. */ class KSTCORE_EXPORT DataString : public String, public DataPrimitive { Q_OBJECT protected: DataString(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; /** Update the string */ virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; public: virtual ~DataString(); virtual void internalUpdate(); struct KSTCORE_EXPORT ReadInfo { ReadInfo(QString* s) : value(s) {} QString* value; }; struct KSTCORE_EXPORT DataInfo { }; void reload(); virtual void reset(); virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; /** change the properties of a DataString */ void change(DataSourcePtr file, const QString &field); void changeFile(DataSourcePtr file); /** Save scalar information */ virtual void save(QXmlStreamWriter &s); virtual QString descriptionTip() const; virtual QString propertyString() const; bool isValid() const; virtual ScriptInterface* createScriptInterface(); private: /** make a copy of the DataString */ virtual PrimitivePtr makeDuplicate() const; virtual bool checkValidity(const DataSourcePtr& ds) const; }; typedef SharedPtr DataStringPtr; typedef ObjectList DataStringList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/measuretime.cpp0000644000175000017500000000445012320547027016466 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "measuretime.h" #include "debug.h" #include #include #ifdef Q_OS_WIN #include static qint64 largeIntToInt64(const LARGE_INTEGER& i) { return ((qint64)i.HighPart) << 32 | i.LowPart; } static double readFrequency() { LARGE_INTEGER largeInt; if (!QueryPerformanceFrequency(&largeInt)) return 0; return 1.0 / largeIntToInt64(largeInt); } static double frequency = readFrequency(); #endif MeasureTime::MeasureTime(const QString& n) : started(0), name(n) { restart(); } MeasureTime::~MeasureTime() { print(); } double MeasureTime::getTime() const { #ifdef Q_OS_WIN LARGE_INTEGER largeInt; if (!QueryPerformanceCounter(&largeInt)) return 0; return largeIntToInt64(largeInt) * frequency; #else #if defined(Q_OS_MAC) // TODO return 0; #else timespec t; #if defined(CLOCK_PROCESS_CPUTIME_ID) clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t); #elif defined(CLOCK_PROF) clock_gettime(CLOCK_PROF, &t); #else clock_gettime(CLOCK_REALTIME, &t); #endif return 1.0 * t.tv_sec + 1e-9 * t.tv_nsec; #endif #endif } void MeasureTime::restart() { started = getTime(); interval = 0; } void MeasureTime::measure() { double now = getTime(); interval += now - started; started = now; } void MeasureTime::print() { measure(); qWarning("MeasureTime in %s: %g sec", qPrintable(name), interval); Kst::Debug::trace(QString("Timing: %2 sec, Scope: %1").arg(name).arg(interval)); } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/scriptinterface.h0000644000175000017500000000325312320547027017000 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 Joshua Netterfield * * joshua.netterfield@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. * * * ***************************************************************************/ #ifndef SCRIPTINTERFACE_H #define SCRIPTINTERFACE_H #ifndef CALL_MEMBER_FN #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) #endif #include #include #include #include #include "kst_export.h" typedef QList QByteArrayList; namespace Kst { class NamedObject; /** A script interface represents an object exposed through the scripting interface. * (ex., dialog, primitive, etc.) */ class KSTCORE_EXPORT ScriptInterface : public QObject { Q_OBJECT public: virtual QString doCommand(QString)=0; virtual bool isValid()=0; virtual QByteArray endEditUpdate()=0; static QString doNamedObjectCommand(QString command, NamedObject *n); QStringList getArgs(const QString &command); QString getArg(const QString &command); }; } #endif // SCRIPTINTERFACE_H Kst-2.0.8/src/libkst/vectorfactory.cpp0000644000175000017500000002140312277111530017032 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "vectorfactory.h" #include "debug.h" #include "vector.h" #include "generatedvector.h" #include "editablevector.h" #include "datavector.h" #include "datacollection.h" #include "objectstore.h" #include "datasourcepluginmanager.h" namespace Kst { VectorFactory::VectorFactory() : PrimitiveFactory() { registerFactory(Vector::staticTypeTag, this); } VectorFactory::~VectorFactory() { } PrimitivePtr VectorFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; QString descriptiveName; Q_ASSERT(store); int saveVer=-1; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == Vector::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else if (n == "data"||n=="data_v2") { QString qcs(xml.readElementText().toLatin1()); QByteArray qbca = QByteArray::fromBase64(qcs.toLatin1()); data = qUncompress(qbca); saveVer=(n=="data")?1:2; } else { return 0; } } else if (xml.isEndElement()) { if (n == Vector::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating vector from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } VectorPtr vector = store->createObject(); if(saveVer==2) { vector->change(data); } else { vector->oldChange(data); } vector->setDescriptiveName(descriptiveName); vector->writeLock(); vector->registerChange(); vector->unlock(); return vector; } GeneratedVectorFactory::GeneratedVectorFactory() : PrimitiveFactory() { registerFactory(GeneratedVector::staticTypeTag, this); } GeneratedVectorFactory::~GeneratedVectorFactory() { } PrimitivePtr GeneratedVectorFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { double min=-1.0, max=1.0; int count=0; QString descriptiveName; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == GeneratedVector::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); min = attrs.value("min").toString().toDouble(); max = attrs.value("max").toString().toDouble(); count = attrs.value("count").toString().toInt(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == GeneratedVector::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating generated vector from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } GeneratedVectorPtr vector = store->createObject(); vector->changeRange(min, max, count); vector->setDescriptiveName(descriptiveName); vector->writeLock(); vector->registerChange(); vector->unlock(); return vector; } EditableVectorFactory::EditableVectorFactory() : PrimitiveFactory() { registerFactory(EditableVector::staticTypeTag, this); } EditableVectorFactory::~EditableVectorFactory() { } PrimitivePtr EditableVectorFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; QString descriptiveName; int dataVer=-1; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == EditableVector::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else if (n == "data" || n == "data_v2") { QString qcs(xml.readElementText().toLatin1()); QByteArray qbca = QByteArray::fromBase64(qcs.toLatin1()); data = qUncompress(qbca); dataVer=(n=="data_v2")?2:1; } else { return 0; } } else if (xml.isEndElement()) { if (n == EditableVector::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating vector from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } EditableVectorPtr vector = store->createObject(); if(dataVer==2) { vector->change(data); } else { vector->oldChange(data); } vector->setDescriptiveName(descriptiveName); vector->writeLock(); vector->registerChange(); vector->unlock(); return vector; } DataVectorFactory::DataVectorFactory() : PrimitiveFactory() { registerFactory(DataVector::staticTypeTag, this); } DataVectorFactory::~DataVectorFactory() { } PrimitivePtr DataVectorFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; //QString provider; QString file, field; QString descriptiveName; int start=0, count=0, skip = -1; bool doAve=false; QString start_units; QString range_units; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == DataVector::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); //provider = attrs.value("provider").toString(); file = DataPrimitive::readFilename(attrs); field = attrs.value("field").toString(); start = attrs.value("start").toString().toInt(); count = attrs.value("count").toString().toInt(); skip = attrs.value("skip").toString().toInt(); doAve = attrs.value("doAve").toString() == "true" ? true : false; start_units = attrs.value("startUnits").toString(); range_units = attrs.value("rangeUnits").toString(); // set overrides if set from command line if (!store->override.fileName.isEmpty()) { file = store->override.fileName; } if (store->override.f0 != -5) { start = store->override.f0; } if (store->override.N != -5) { count = store->override.N; } if (store->override.skip != -5 ) { skip = store->override.skip; } if (store->override.doAve != -5) { doAve = store->override.doAve; } if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else if (n == "data") { QString qcs(xml.readElementText().toLatin1()); QByteArray qbca = QByteArray::fromBase64(qcs.toLatin1()); data = qUncompress(qbca); } else { return 0; } } else if (xml.isEndElement()) { if (n == DataVector::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating vector from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } Q_ASSERT(store); DataSourcePtr dataSource = DataSourcePluginManager::findOrLoadSource(store, file); if (!dataSource) { return 0; //Couldn't find a suitable datasource } DataVectorPtr vector = store->createObject(); vector->writeLock(); vector->change(dataSource, field, start, count, skip, (skip != -1), doAve); vector->setDescriptiveName(descriptiveName); vector->setStartUnits(start_units); vector->setRangeUnits(range_units); vector->registerChange(); vector->unlock(); return vector; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/namedobject.cpp0000644000175000017500000002363012277111530016417 0ustar synthsynth/*************************************************************************** namedobject.cpp: adds naming to kst object ------------------- begin : May 29, 2008 copyright : (C) 2008 C. Barth Netterfield email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "namedobject.h" #include #include #include namespace Kst { NamedObject::NamedObject() : _manualDescriptiveName(QString()), _shortName(QString("FIXME - set _shortName")) { _initial_vnum = _vnum; // vectors _initial_pnum = _pnum; // plugins _initial_csdnum = _csdnum; // csd _initial_cnum = _cnum; // curves _initial_enum = _enum; // equations _initial_hnum = _hnum; // histograms _initial_inum = _inum; // images _initial_psdnum = _psdnum; // psd _initial_xnum = _xnum; // scalars _initial_tnum = _tnum; // text string _initial_mnum = _mnum; // text string _initial_plotnum = _plotnum; // plots _initial_lnum = _lnum; // legend _initial_dnum = _dnum; // view image _initial_dsnum = _dsnum; // datasource _sizeCache = new SizeCache; _sizeCache->fontSize = 0; _sizeCache->nameWidthPixels = 0; _sizeCache->name.clear(); } NamedObject::~NamedObject() { delete _sizeCache; } QString NamedObject::Name() const { return descriptiveName()+" ("+shortName()+')'; } /** limit the length of the string to length. However, do not shorten the name so much that the shortname is truncated. */ QString NamedObject::lengthLimitedName(int length) const { QString name = Name(); if (name.length()<=length) { return name; } length -= shortName().length() + 3; if (length <= 5) { // not enough room for "a...z (V2)" return '(' + shortName() + ')'; } int dnl = descriptiveName().length(); int d = dnl - length + 3; int s = (length-3)/2; return descriptiveName().replace(s, d, QString("...")) + " (" + shortName()+')'; } QString NamedObject::sizeLimitedName(const QFont& font, const int& width) const { return (CleanedName()); QFontMetrics fontMetrics=QFontMetrics(font); int mw = fontMetrics.maxWidth(); if ((_sizeCache->fontSize == font.pointSize() ) && (_sizeCache->name == Name()) && (_sizeCache->nameWidthPixels < width - mw)) { return (_sizeCache->name); } _sizeCache->name = Name(); _sizeCache->nameWidthPixels = fontMetrics.width(_sizeCache->name); _sizeCache->fontSize = font.pointSize(); if (_sizeCache->nameWidthPixels < width - mw) { return _sizeCache->name; } int combo_chars = width / fontMetrics.averageCharWidth() - 2; int nameLength = _sizeCache->name.length(); QString name = lengthLimitedName(combo_chars); while ((combo_chars <= nameLength+1) && (fontMetrics.width(name) < width - mw)) { combo_chars++; name = lengthLimitedName(combo_chars); } while ((combo_chars>0) && (fontMetrics.width(name) > width - mw)) { combo_chars--; name = lengthLimitedName(combo_chars); } return name; } QString NamedObject::sizeLimitedName(const QWidget *widget ) const { return (CleanedName()); return sizeLimitedName(widget->font(),widget->width()); } QString NamedObject::CleanedName() const { QString clean_name = Name(); clean_name.replace("\\_","_"); clean_name.replace("\\[","["); clean_name.replace("\\]","]"); return clean_name; } QString NamedObject::descriptiveName() const { if (_manualDescriptiveName.isEmpty()) { return _automaticDescriptiveName(); } else { return _manualDescriptiveName; } } QString NamedObject::shortName() const { return _shortName; } void NamedObject::setDescriptiveName(QString new_name) { _manualDescriptiveName = new_name; } bool NamedObject::descriptiveNameIsManual() const { return !(_manualDescriptiveName.isEmpty()); } // to keep the size of the saved xml files smaller, 'I' // should be set to only the types who are effected by the // creation of the Object. (So, the type itself and any slave // objects which are created) eg: Vectors: VNUM|XNUM // It doesn't hurt to add more (the default is all bits set) // except that it increases the size of the .kst file, and // slows loading (not much, but if you have hundreds of // objects....) void NamedObject::saveNameInfo(QXmlStreamWriter &s, unsigned I) { if (descriptiveNameIsManual()) { s.writeAttribute("descriptiveNameIsManual", "true"); s.writeAttribute("descriptiveName", descriptiveName()); } if (I & VNUM) s.writeAttribute("initialVNum", QString::number(_initial_vnum)); if (I & XNUM) s.writeAttribute("initialXNum", QString::number(_initial_xnum)); if (I & PNUM) s.writeAttribute("initialPNum", QString::number(_initial_pnum)); if (I & CSDNUM) s.writeAttribute("initialCSDNum", QString::number(_initial_csdnum)); if (I & CNUM) s.writeAttribute("initialCNum", QString::number(_initial_cnum)); if (I & ENUM) s.writeAttribute("initialENum", QString::number(_initial_enum)); if (I & HNUM) s.writeAttribute("initialHNum", QString::number(_initial_hnum)); if (I & INUM) s.writeAttribute("initialINum", QString::number(_initial_inum)); if (I & PSDNUM) s.writeAttribute("initialPSDNum", QString::number(_initial_psdnum)); if (I & TNUM) s.writeAttribute("initialTNum", QString::number(_initial_tnum)); if (I & MNUM) s.writeAttribute("initialMNum", QString::number(_initial_mnum)); if (I & PLOTNUM) s.writeAttribute("initialPlotNum", QString::number(_initial_plotnum)); if (I & LNUM) s.writeAttribute("initialLNum", QString::number(_initial_lnum)); if (I & DNUM) s.writeAttribute("initialDNum", QString::number(_initial_dnum)); if (I & DSNUM) s.writeAttribute("initialDSNum", QString::number(_initial_dsnum)); } void NamedObject::processShortNameIndexAttributes(QXmlStreamAttributes &attrs) { QStringRef R; R = attrs.value("initialVNum"); if (!R.isEmpty()) _vnum = R.toString().toInt(); R = attrs.value("initialXNum"); if (!R.isEmpty()) _xnum = R.toString().toInt(); R = attrs.value("initialPNum"); if (!R.isEmpty()) _pnum = R.toString().toInt(); R = attrs.value("initialCSDNum"); if (!R.isEmpty()) _csdnum = R.toString().toInt(); R = attrs.value("initialCNum"); if (!R.isEmpty()) _cnum = R.toString().toInt(); R = attrs.value("initialENum"); if (!R.isEmpty()) _enum = R.toString().toInt(); R = attrs.value("initialHNum"); if (!R.isEmpty()) _hnum = R.toString().toInt(); R = attrs.value("initialINum"); if (!R.isEmpty()) _inum = R.toString().toInt(); R = attrs.value("initialPSDNum"); if (!R.isEmpty()) _psdnum = R.toString().toInt(); R = attrs.value("initialTNum"); if (!R.isEmpty()) _tnum = R.toString().toInt(); R = attrs.value("initialMNum"); if (!R.isEmpty()) _mnum = R.toString().toInt(); R = attrs.value("initialPlotNum"); if (!R.isEmpty()) _plotnum = R.toString().toInt(); R = attrs.value("initialLNum"); if (!R.isEmpty()) _lnum = R.toString().toInt(); R = attrs.value("initialDNum"); if (!R.isEmpty()) _dnum = R.toString().toInt(); R = attrs.value("initialDSNum"); if (!R.isEmpty()) _dsnum = R.toString().toInt(); } // Reset all name indexes. Should only be used by ObjectStore when clearing the store entirely. void NamedObject::resetNameIndex() { _vnum = 1; // vectors _pnum = 1; // plugins _csdnum = 1; // csd _cnum = 1; // curves _enum = 1; // equations _hnum = 1; // histograms _inum = 1; // images _psdnum = 1; // psd _xnum = 1; // scalars _tnum = 1; // text string _mnum = 1; // matrix _plotnum = 1; // plots _lnum = 1; // legends _dnum = 1; // other view objects _dsnum = 1; // datasource max_vnum = 0; // vectors max_pnum = 0; // plugins max_csdnum = 0; // csd max_cnum = 0; // curves max_enum = 0; // equations max_hnum = 0; // histograms max_inum = 0; // images max_psdnum = 0; // psd max_xnum = 0; // scalars max_tnum = 0; // text string max_mnum = 0; // matrix max_plotnum = 0; max_lnum = 0; max_dnum = 0; max_dsnum = 0; } // for sorting a list in order of creation (ie, short name number) bool shortNameLessThan(NamedObject *o1, NamedObject *o2) { QString n1 = o1->shortName(); QString n2 = o2->shortName(); n1.remove(0,1); n2.remove(0,1); return (n1.toInt() < n2.toInt()); } void resetNameIndexes() { _vnum = 1; // vectors _pnum = 1; // plugins _csdnum = 1; // csd _cnum = 1; // curves _enum = 1; // equations _hnum = 1; // histograms _inum = 1; // images _psdnum = 1; // psd _xnum = 1; // scalars _tnum = 1; // text string _mnum = 1; // matrix _plotnum = 1; // plots _lnum = 1; // legend _dnum = 1; // view item _dsnum = 1; // datasource max_vnum = 0; // vectors max_pnum = 0; // plugins max_csdnum = 0; // csd max_cnum = 0; // curves max_enum = 0; // equations max_hnum = 0; // histograms max_inum = 0; // images max_psdnum = 0; // psd max_xnum = 0; // scalars max_tnum = 0; // text string max_mnum = 0; // matrix max_plotnum = 0; // plots max_lnum = 0; // legends max_dnum = 0; // view item max_dsnum = 0; // datasource } //void NamedObject::_initializeShortName() { //} // QString NamedObject::descriptionTip() const { // return Name(); // } } Kst-2.0.8/src/libkst/matrixscriptinterface.cpp0000644000175000017500000001063512320547027020562 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "matrixscriptinterface.h" #include "objectstore.h" #include "datasourcepluginmanager.h" #include "updatemanager.h" #include "updateserver.h" #include namespace Kst { QString doMatrixScriptCommand(QString command,Matrix *matrix) { QString v=ScriptInterface::doNamedObjectCommand(command, matrix); if (!v.isEmpty()) { return v; } if (command.startsWith("value(")) { command.remove("value(").chop(1); QStringList p = command.split(','); return QString::number(matrix->value(p[0].toDouble(), p[1].toDouble())); } else if (command.startsWith("length(")) { return QString::number(matrix->sampleCount()); } else if (command.startsWith("min(")) { return QString::number(matrix->minValue()); } else if (command.startsWith("max(")) { return QString::number(matrix->maxValue()); } else if (command.startsWith("mean(")) { return QString::number(matrix->meanValue()); } else if (command.startsWith("width(")) { return QString::number(matrix->xNumSteps()); } else if (command.startsWith("height(")) { return QString::number(matrix->yNumSteps()); } else if (command.startsWith("dX(")) { return QString::number(matrix->xStepSize()); } else if (command.startsWith("dY(")) { return QString::number(matrix->yStepSize()); } else if (command.startsWith("minX(")) { return QString::number(matrix->minX()); } else if (command.startsWith("minY(")) { return QString::number(matrix->minY()); } else if (command.startsWith("descriptionTip(")) { return matrix->descriptionTip(); } return QString(); } /******************************************************/ /* Data Matrixs */ /******************************************************/ MatrixDataSI::MatrixDataSI(DataMatrixPtr it) { matrix=it; } QString MatrixDataSI::doCommand(QString command) { QString v=doMatrixScriptCommand(command, matrix); if (!v.isEmpty()) { return v; } if (command.startsWith(QLatin1String("change("))) { command.remove("change(").remove(')'); QStringList p = command.split(','); DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource( matrix->store(), p.at(0)); matrix->writeLock(); matrix->change(ds, p.at(1), // field p.at(2).toInt(), // x start p.at(3).toInt(), // y start p.at(4).toInt(), // num x steps p.at(5).toInt(), // num y steps false, false, 0, p.at(6).toDouble(), // min x p.at(7).toDouble(), // min y p.at(8).toDouble(), // step x p.at(9).toDouble() // step y ); matrix->unlock(); return "Done"; } else if (command.startsWith("field(")) { return matrix->field(); } else if (command.startsWith("filename(")) { return matrix->filename(); } else if (command.startsWith("startX(")) { return QString::number(matrix->reqXStart()); } else if (command.startsWith("startY(")) { return QString::number(matrix->reqYStart()); } return "No such command"; } bool MatrixDataSI::isValid() { return matrix.isPtrValid(); } ScriptInterface* MatrixDataSI::newMatrix(ObjectStore *store) { DataMatrixPtr matrix; matrix = store->createObject(); return new MatrixDataSI(matrix); } QByteArray MatrixDataSI::endEditUpdate() { matrix->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+matrix->Name()).toLatin1(); } } Kst-2.0.8/src/libkst/stdinsource.h0000644000175000017500000000371312277111530016153 0ustar synthsynth/*************************************************************************** stdin.h - data source plugin for stdin ------------------- begin : Fri Oct 31 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STDINSRC_H #define STDINSRC_H #include "datasource.h" #include "kst_export.h" class QTemporaryFile; namespace Kst { class KST_EXPORT StdinSource : public DataSource { Q_OBJECT public: StdinSource(ObjectStore *store, QSettings *cfg); virtual ~StdinSource(); virtual const QString& typeString() const; static const QString staticTypeString; virtual Object::UpdateType internalDataSourceUpdate(); virtual int readField(double *v, const QString &field, int s, int n); virtual bool isValidField(const QString &field) const; virtual int samplesPerFrame(const QString &field); virtual int frameCount(const QString& field = QString::null) const; virtual QString fileType() const; virtual void save(QXmlStreamWriter& s); virtual bool isValid() const; virtual bool isEmpty() const; private: DataSourcePtr _src; QTemporaryFile *_file; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/scalarscriptinterface.h0000644000175000017500000000364612320547027020174 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef SCALARSCRIPTINTERFACE_H #define SCALARSCRIPTINTERFACE_H #include #include "scriptinterface.h" #include "datascalar.h" #include "vscalar.h" namespace Kst { class KSTCORE_EXPORT ScalarGenSI : public ScriptInterface { Q_OBJECT ScalarPtr scalar; public: explicit ScalarGenSI(ScalarPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newScalar(ObjectStore *store); }; class KSTCORE_EXPORT ScalarDataSI : public ScriptInterface { Q_OBJECT DataScalarPtr scalar; public: explicit ScalarDataSI(DataScalarPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newScalar(ObjectStore *store); }; class KSTCORE_EXPORT ScalarVectorSI : public ScriptInterface { Q_OBJECT VScalarPtr scalar; public: explicit ScalarVectorSI(VScalarPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newScalar(ObjectStore *store); }; } #endif // SCALARSCRIPTINTERFACE_H Kst-2.0.8/src/libkst/ksttimers.h.cmake0000644000175000017500000000017212277111530016711 0ustar synthsynth#ifndef KSTTIMERS_H #define KSTTIMERS_H #include #ifdef HAVE_KST_USE_TIMERS #define BENCHMARK #endif #endif Kst-2.0.8/src/libkst/datavector.h0000644000175000017500000001472612320547027015756 0ustar synthsynth/*************************************************************************** datavector.h - description ------------------- begin : Fri Sep 22 2000 copyright : (C) 2000 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAVECTOR_H #define DATAVECTOR_H #include "kst_export.h" #include "dataprimitive.h" #include "vector.h" namespace Kst { /**A class for handling data vectors for kst. *@author cbn */ class KSTCORE_EXPORT DataVector : public Vector, public DataPrimitive { Q_OBJECT public: /** Parameters for reading vectors a field from a file. Data is returned in the data; data points to allocated array which should be filled startingFrame is the starting frame numberOfFrames is the number of frames to read if numberOfFrames is -1, it means to read 1 -sample- from startingFrame. skipFrame: currently ignored by all data sources lastFrameRead: currently ignored */ struct KSTCORE_EXPORT ReadInfo { double* data; int startingFrame; int numberOfFrames; int skipFrame; }; struct KSTCORE_EXPORT DataInfo { DataInfo(); DataInfo(int frameCount, int samplesPerFrame); int frameCount; int samplesPerFrame; }; virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; virtual void reset(); // must be called with a lock /** change the properties of a DataVector */ void change(DataSourcePtr file, const QString &field, int f0, int n, int skip, bool in_doSkip, bool in_doAve); void changeFile(DataSourcePtr file); void changeFrames(int f0, int n, int skip, bool in_doSkip, bool in_doAve); //si /** Return frames held in Vector */ int numFrames() const; //si /** Return the requested number of frames in the vector */ int reqNumFrames() const; /** Return Starting Frame of Vector */ int startFrame() const; //si /** Return the requested starting frame of the Vector */ int reqStartFrame() const; /** Return frames to skip per read */ bool doSkip() const; //si^3 bool doAve() const; int skip() const; /** Return field used for generalized lookup */ QString startUnits() {return _startUnits;} void setStartUnits(const QString &field) {_startUnits = field;} QString rangeUnits() {return _rangeUnits;} void setRangeUnits(const QString &field) {_rangeUnits = field;} /** Reload the contents of the vector */ void reload(); //si /** Returns intrinsic samples per frame */ int samplesPerFrame() const; //si /** Save vector information */ virtual void save(QXmlStreamWriter &s); /** return a sensible label for this vector */ virtual LabelInfo labelInfo() const; /** return the length of the file */ int fileLength() const; //si /** return whether the vector is suppose to read to end of file */ bool readToEOF() const; //si /** read whether the vector is suppose to count back from end of file */ bool countFromEOF() const; //si /** Read from end */ void setFromEnd(); virtual QString descriptionTip() const; //si virtual QString propertyString() const; bool isValid() const; //si virtual void internalUpdate(); //implemented in Vector too but must not be virtual. QByteArray scriptInterface(QList &command); /** does the vector represent time? */ virtual bool isTime() const; virtual ScriptInterface* createScriptInterface(); protected: DataVector(ObjectStore *store); virtual ~DataVector(); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _resetFieldMetadata(); virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; private: virtual void _resetFieldScalars(); virtual void _resetFieldStrings(); bool _dirty; // different from the Object dirty flag /** Samples Per Frame */ int SPF; /** current number of frames */ int NF; /** current starting frame */ int F0; /** frames to skip per read */ bool DoSkip; bool DoAve; int Skip; /** max number of frames */ int ReqNF; int _invalidCount; /** Requested Starting Frame */ int ReqF0; /** generalized index field - empty if we are using frames. */ QString _startUnits; QString _rangeUnits; /** Number of Samples allocated to the vector */ int _numSamples; int N_AveReadBuf; double *AveReadBuf; bool checkIntegrity(); // must be called with a lock //bool _dontUseSkipAccel; // wrappers around DataSource interface functions int readField(double *v, const QString& field, int s, int n, int skip = -1); const DataInfo dataInfo(const QString& field) const; QHash _fieldScalars; QHash _fieldStrings; /** make a copy of the DataVector */ virtual PrimitivePtr makeDuplicate() const; virtual bool checkValidity(const DataSourcePtr& ds) const; friend class TestDataSource; friend class TestHistogram; friend class TestCSD; friend class TestPSD; friend class TestScalar; }; typedef SharedPtr DataVectorPtr; typedef ObjectList DataVectorList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/generatedvector.cpp0000644000175000017500000000557212362705136017340 0ustar synthsynth/*************************************************************************** generatedvector.cpp - a vector from x0 to x1 with n pts ------------------- begin : March, 2005 copyright : (C) 2005 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "generatedvector.h" #include "vectorscriptinterface.h" #include #include namespace Kst { const QString GeneratedVector::staticTypeString = "Generated Vector"; const QString GeneratedVector::staticTypeTag = "generatedvector"; GeneratedVector::GeneratedVector(ObjectStore *store) : Vector(store) { _saveable = true; _saveData = false; } const QString& GeneratedVector::typeString() const { return staticTypeString; } ScriptInterface* GeneratedVector::createScriptInterface() { return new VectorGenSI(this); } void GeneratedVector::save(QXmlStreamWriter &s) { s.writeStartElement("generatedvector"); s.writeAttribute("min", QString::number(min())); s.writeAttribute("max", QString::number(max())); s.writeAttribute("count", QString::number(length())); saveNameInfo(s, VNUM|XNUM); s.writeEndElement(); } void GeneratedVector::changeRange(double x0, double x1, int n) { if (n < 2) { n = 2; } if (n != length()) { resize(n, false); } if (x0 > x1) { double tx; tx = x0; x0 = x1; x1 = tx; } else if (x0 == x1) { x1 = x0 + 0.1; } for (int i = 0; i < n; i++) { _v[i] = x0 + double(i) * (x1 - x0) / double(n - 1); } _min = x0; _max = x1; _scalars["min"]->setValue(x0); _scalars["max"]->setValue(x1); registerChange(); } void GeneratedVector::setSaveData(bool save) { Q_UNUSED(save) } QString GeneratedVector::_automaticDescriptiveName() const { return QString::number(_v[0])+".."+QString::number(_v[length()-1]); } QString GeneratedVector::descriptionTip() const { return tr("Generated Vector: %1\n" " %2 values from %3 to %4").arg(Name()).arg(length()).arg(_v[0]).arg(_v[length()-1]); } QString GeneratedVector::propertyString() const { return tr("%3 points from %1 to %2").arg(_v[0]).arg(_v[length()-1]).arg(length()); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/matrixfactory.cpp0000644000175000017500000001736112277111530017044 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "matrixfactory.h" #include "debug.h" #include "matrix.h" #include "generatedmatrix.h" #include "editablematrix.h" #include "datamatrix.h" #include "objectstore.h" #include "datasourcepluginmanager.h" namespace Kst { GeneratedMatrixFactory::GeneratedMatrixFactory() : PrimitiveFactory() { registerFactory(GeneratedMatrix::staticTypeTag, this); } GeneratedMatrixFactory::~GeneratedMatrixFactory() { } PrimitivePtr GeneratedMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; QString descriptiveName; Q_ASSERT(store); bool xDirection=1; double gradZMin=-1, gradZMax=1, minX=0, minY=0, nX=10, nY=10, stepX=1, stepY=1; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == GeneratedMatrix::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); gradZMin = attrs.value("gradzmin").toString().toDouble(); gradZMax = attrs.value("gradzmax").toString().toDouble(); minX = attrs.value("xmin").toString().toDouble(); minY = attrs.value("ymin").toString().toDouble(); nX = attrs.value("nx").toString().toDouble(); nY = attrs.value("ny").toString().toDouble(); stepX = attrs.value("xstep").toString().toDouble(); stepY = attrs.value("ystep").toString().toDouble(); xDirection = attrs.value("xdirection").toString() == "true" ? true : false; if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == GeneratedMatrix::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Generated Matrix from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } GeneratedMatrixPtr matrix = store->createObject(); matrix->change(uint(nX), uint(nY), minX, minY, stepX, stepY, gradZMin, gradZMax, xDirection); matrix->setDescriptiveName(descriptiveName); matrix->writeLock(); matrix->registerChange(); matrix->unlock(); return matrix; } EditableMatrixFactory::EditableMatrixFactory() : PrimitiveFactory() { registerFactory(EditableMatrix::staticTypeTag, this); } EditableMatrixFactory::~EditableMatrixFactory() { } PrimitivePtr EditableMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; QString descriptiveName; Q_ASSERT(store); double minX=0, minY=0, nX=10, nY=10, stepX=1, stepY=1; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == EditableMatrix::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); minX = attrs.value("xmin").toString().toDouble(); minY = attrs.value("ymin").toString().toDouble(); nX = attrs.value("nx").toString().toDouble(); nY = attrs.value("ny").toString().toDouble(); stepX = attrs.value("xstep").toString().toDouble(); stepY = attrs.value("ystep").toString().toDouble(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else if (n == "data") { QString qcs(xml.readElementText().toLatin1()); QByteArray qbca = QByteArray::fromBase64(qcs.toLatin1()); data = qUncompress(qbca); } else { return 0; } } else if (xml.isEndElement()) { if (n == EditableMatrix::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Editable Matrix from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } EditableMatrixPtr matrix = store->createObject(); matrix->change(data, uint(nX), uint(nY), minX, minY, stepX, stepY); matrix->setDescriptiveName(descriptiveName); matrix->writeLock(); matrix->registerChange(); matrix->unlock(); return matrix; } DataMatrixFactory::DataMatrixFactory() : PrimitiveFactory() { registerFactory(DataMatrix::staticTypeTag, this); } DataMatrixFactory::~DataMatrixFactory() { } PrimitivePtr DataMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStreamReader& xml) { QByteArray data; QString descriptiveName; Q_ASSERT(store); bool doAve=false, doSkip=false; int requestedXStart=0, requestedYStart=0, requestedXCount=-1, requestedYCount=-1, skip=0; double minX=0, minY=0, stepX=1, stepY=1; QString provider, file, field; while (!xml.atEnd()) { const QString n = xml.name().toString(); if (xml.isStartElement()) { if (n == DataMatrix::staticTypeTag) { QXmlStreamAttributes attrs = xml.attributes(); provider = attrs.value("provider").toString(); file = DataPrimitive::readFilename(attrs); field = attrs.value("field").toString(); requestedXStart = attrs.value("reqxstart").toString().toInt(); requestedYStart = attrs.value("reqystart").toString().toInt(); requestedXCount = attrs.value("reqnx").toString().toInt(); requestedYCount = attrs.value("reqny").toString().toInt(); doAve = attrs.value("doave").toString() == "true" ? true : false; doSkip = attrs.value("doskip").toString() == "true" ? true : false; skip = attrs.value("skip").toString().toInt(); minX = attrs.value("xmin").toString().toDouble(); minY = attrs.value("ymin").toString().toDouble(); stepX = attrs.value("xstep").toString().toDouble(); stepY = attrs.value("ystep").toString().toDouble(); if (attrs.value("descriptiveNameIsManual").toString() == "true") { descriptiveName = attrs.value("descriptiveName").toString(); } Object::processShortNameIndexAttributes(attrs); } else { return 0; } } else if (xml.isEndElement()) { if (n == DataMatrix::staticTypeTag) { break; } else { Debug::self()->log(QObject::tr("Error creating Data Matrix from Kst file."), Debug::Warning); return 0; } } xml.readNext(); } if (xml.hasError()) { return 0; } Q_ASSERT(store); DataSourcePtr dataSource = DataSourcePluginManager::findOrLoadSource(store, file); if (!dataSource) { return 0; //Couldn't find a suitable datasource } DataMatrixPtr matrix = store->createObject(); matrix->change(dataSource, field, requestedXStart, requestedYStart, requestedXCount, requestedYCount, doAve, doSkip, skip, minX, minY, stepX, stepY); matrix->setDescriptiveName(descriptiveName); matrix->writeLock(); matrix->registerChange(); matrix->unlock(); return matrix; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datamatrix.h0000644000175000017500000001372412320547027015755 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAMATRIX_H #define DATAMATRIX_H #include "kst_export.h" #include "dataprimitive.h" #include "matrix.h" namespace Kst { class MatrixData { public: double xMin; double yMin; double xStepSize; double yStepSize; double *z; // the data }; class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive { Q_OBJECT public: /** Read the specified sub-range of the matrix, flat-packed in z in row-major order xStart - starting x *frame* yStart - starting y *frame* xNumSteps - number of *frames* to read in x direction; -1 to read 1 *sample* from xStart yNumSteps - number of *frames* to read in y direction; -1 to read 1 *sample* from yStart Will skip according to the parameter, but it may not be implemented. If return value is -9999, use the non-skip version instead. The suggested scaling and translation is returned in xMin, yMin, xStepSize, and yStepSize Returns the number of *samples* read **/ struct KSTCORE_EXPORT ReadInfo { MatrixData* data; int xStart; int yStart; int xNumSteps; int yNumSteps; int skip; }; struct KSTCORE_EXPORT DataInfo { DataInfo(); int samplesPerFrame; int xSize; int ySize; bool invertXHint; bool invertYHint; }; virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; // save DataMatrix virtual void save(QXmlStreamWriter &xml); // change properties of DataMatrix void change(DataSourcePtr file, const QString &field, int xStart, int yStart, int xNumSteps, int yNumSteps, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY); void changeFrames(int xStart, int yStart, int xNumSteps, int yNumSteps, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY); // return properties of DataMatrix int reqXStart() const; int reqYStart() const; int reqXNumSteps() const; int reqYNumSteps() const; //QString filename() const; const QString& field() const; bool xReadToEnd() const; bool yReadToEnd() const; bool xCountFromEnd() const; bool yCountFromEnd() const; bool doSkip() const; bool doAverage() const; int skip() const; // labels for this matrix virtual QString label() const; // returns true if the file and field is valid; false otherwise bool isValid() const; // reload contents of DataMatrix from file void reload(); virtual void reset(); // change the datasource for this matrix void changeFile(DataSourcePtr file); virtual QString descriptionTip() const; virtual QString propertyString() const; virtual void internalUpdate(); virtual LabelInfo xLabelInfo() const; virtual LabelInfo yLabelInfo() const; virtual LabelInfo titleInfo() const; virtual ScriptInterface* createScriptInterface(); protected: DataMatrix(ObjectStore *store); virtual ~DataMatrix(); // update DataMatrix virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual void _resetFieldMetadata(); private: void commonConstructor(DataSourcePtr file, const QString &field, int reqXStart, int reqYStart, int reqNX, int reqNY, bool doAve, bool doSkip, int skip, double minX, double minY, double stepX, double stepY); void doUpdateSkip(int realXStart, int realYStart); void doUpdateNoSkip(int realXStart, int realYStart); virtual void _resetFieldScalars(); virtual void _resetFieldStrings(); // values requested; may be different from actual matrix range int _reqXStart, _reqYStart, _reqNX, _reqNY; // matrix params since last update - used to determine if update is needed int _lastXStart, _lastYStart, _lastNX, _lastNY; bool _lastDoAve : 1; bool _lastDoSkip : 1; int _lastSkip; double* _aveReadBuffer; // buffer used when performing boxcar filter int _aveReadBufferSize; DataSourcePtr _file; QString _field; // field to read from _file bool _doAve : 1; bool _doSkip : 1; int _skip; int _samplesPerFrameCache; // cache the samples per frame of the field in datasource int readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip); QHash _fieldScalars; QHash _fieldStrings; // make a "copy" of this DataMatrix virtual PrimitivePtr makeDuplicate() const; virtual bool checkValidity(const DataSourcePtr& ds) const; }; typedef SharedPtr DataMatrixPtr; typedef ObjectList DataMatrixList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/plotiteminterface.cpp0000644000175000017500000000201412277111530017653 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "plotiteminterface.h" namespace Kst { PlotItemInterface::PlotItemInterface(): _serialOfLastChange(0) { } PlotItemInterface::~PlotItemInterface() { } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/measuretime.h0000644000175000017500000000270512277111530016131 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KST_MEASURE_TIME #define KST_MEASURE_TIME #include "kst_export.h" #include class KSTCORE_EXPORT MeasureTime { public: explicit MeasureTime(const QString& name); ~MeasureTime(); void restart(); /// print interval to console void print(); double getTime() const; private: double started; double interval; QString name; /// Increment interval by interval since last call/restart(). void measure(); }; #define TIME_IN_SCOPE(x) MeasureTime x(QString("%1 at %2, line %3, time in scope").arg(#x).arg(__FILE__).arg(__LINE__)) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/nextcolor.h0000644000175000017500000000227112277111530015624 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2003 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef NEXTCOLOR_H #define NEXTCOLOR_H #include #include "kst_export.h" class KPalette; namespace Kst { class KSTCORE_EXPORT NextColor { public: virtual ~NextColor(); virtual QColor next() = 0; static NextColor& self(); protected: NextColor(); private: static NextColor* _instance; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/primitivefactory.h0000644000175000017500000000277312277111530017216 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PRIMITIVEFACTORY_H #define PRIMITIVEFACTORY_H #include #include #include "primitive.h" #include "kst_export.h" namespace Kst { class PrimitiveFactory { public: PrimitiveFactory(); virtual ~PrimitiveFactory(); // This takes ownership static void registerFactory(const QString& node, PrimitiveFactory *factory); static void registerFactory(const QStringList& nodes, PrimitiveFactory *factory); KSTCORE_EXPORT static PrimitivePtr parse(ObjectStore *store, QXmlStreamReader& stream); virtual PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream) = 0; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/matrixscriptinterface.h0000644000175000017500000000247612320547027020233 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef MATRIXSCRIPTINTERFACE_H #define MATRIXSCRIPTINTERFACE_H #include #include "scriptinterface.h" #include "datamatrix.h" namespace Kst { class KSTCORE_EXPORT MatrixDataSI : public ScriptInterface { Q_OBJECT DataMatrixPtr matrix; public: explicit MatrixDataSI(DataMatrixPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newMatrix(ObjectStore *store); }; } #endif // MATRIXSCRIPTINTERFACE_H Kst-2.0.8/src/libkst/datascalar.h0000644000175000017500000000525012320547027015711 0ustar synthsynth/*************************************************************************** datastscalar.h - a scalar from a data source ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASCALAR_H #define DATASCALAR_H #include "kst_export.h" #include "dataprimitive.h" #include "scalar.h" class QXmlStreamWriter; namespace Kst { /**A class for handling data scalars for kst. *@author cbn */ /** A scalar which gets its value from a data file. */ class KSTCORE_EXPORT DataScalar : public Scalar, public DataPrimitive { Q_OBJECT protected: DataScalar(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; /** Update the scalar.*/ virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; public: virtual ~DataScalar(); struct ReadInfo { ReadInfo(double* d) : value(d) {} double* value; }; struct DataInfo { }; virtual void internalUpdate(); virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; /** change the properties of a DataScalar */ void change(DataSourcePtr file, const QString &field); void changeFile(DataSourcePtr file); /** Save scalar information */ virtual void save(QXmlStreamWriter &s); virtual QString descriptionTip() const; virtual QString propertyString() const; bool isValid() const; virtual void reset(); void reload(); virtual ScriptInterface* createScriptInterface(); private: /** make a copy of the DataScalar */ virtual PrimitivePtr makeDuplicate() const; virtual bool checkValidity(const DataSourcePtr& ds) const; }; typedef SharedPtr DataScalarPtr; typedef ObjectList DataScalarList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/matrix.cpp0000644000175000017500000004172612277111530015456 0ustar synthsynth/*************************************************************************** matrix.cpp: 2D matrix type for kst ------------------- begin : July 2004 ***************************************************************************/ /*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * netterfield@astro.utoronto.ca * copyright : (C) 2004 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "matrix.h" #include #include #include #include "debug.h" #include "math_kst.h" #include "datacollection.h" #include "objectstore.h" // used for resizing; set to 1 for loop zeroing, 2 to use memset #define ZERO_MEMORY 2 namespace Kst { const QString Matrix::staticTypeString = "Matrix"; Matrix::Matrix(ObjectStore *store) : Primitive(store, 0L), _NS(0), _NRealS(0), _nX(1), _nY(0), _minX(0), _minY(0), _stepX(1), _stepY(1), _invertXHint(false), _invertYHint(false), _editable(false), _saveable(false), _z(0L), _zSize(0) { _initializeShortName(); _scalars.clear(); _strings.clear(); _vectors.clear(); setFlag(true); createScalars(store); } Matrix::~Matrix() { if (_z) { _vectors["z"]->setV(0L, 0); free(_z); _z = 0L; } } void Matrix::_initializeShortName() { _shortName = 'M'+QString::number(_mnum); if (_mnum>max_mnum) max_mnum = _mnum; _mnum++; } void Matrix::deleteDependents() { for (QHash::Iterator it = _scalars.begin(); it != _scalars.end(); ++it) { _store->removeObject(it.value()); } for (QHash::Iterator it = _vectors.begin(); it != _vectors.end(); ++it) { _store->removeObject(it.value()); } Object::deleteDependents(); } const QString& Matrix::typeString() const { return staticTypeString; } int Matrix::sampleCount() const { return _nX*_nY; } double Matrix::value(double x, double y, bool* ok) const { int x_index = (int)((x - _minX) / (double)_stepX); int y_index = (int)((y - _minY) / (double)_stepY); int index = zIndex(x_index, y_index); if ((index < 0) || !isfinite(_z[index]) || KST_ISNAN(_z[index])) { if (ok) (*ok) = false; return 0.0; } if (ok) (*ok) = true; return _z[index]; } double Matrix::value(double x, double y, QPointF &matchedPoint, bool* ok) const { int x_index = (int)((x - _minX) / (double)_stepX); int y_index = (int)((y - _minY) / (double)_stepY); matchedPoint.setX((x_index+0.5)*_stepX+_minX); matchedPoint.setY((y_index+0.5)*_stepY+_minY); int index = zIndex(x_index, y_index); if ((index < 0) || !isfinite(_z[index]) || KST_ISNAN(_z[index])) { if (ok) (*ok) = false; return 0.0; } if (ok) (*ok) = true; return _z[index]; } double Matrix::valueRaw(int x, int y, bool* ok) const { int index = zIndex(x,y); if ((index < 0) || !isfinite(_z[index]) || KST_ISNAN(_z[index])) { if (ok) { (*ok) = false; } return 0.0; } if (ok) { (*ok) = true; } return _z[index]; } int Matrix::zIndex(int x, int y) const { if (x >= _nX || x < 0 || y >= _nY || y < 0) { return -1; } int index = x * _nY + y; if (index >= _zSize || index < 0 ) { return -1; } return index; } bool Matrix::setValue(double x, double y, double z) { int x_index = (int)floor((x - _minX) / (double)_stepX); int y_index = (int)floor((y - _minY) / (double)_stepY); return setValueRaw(x_index, y_index, z); } bool Matrix::setValueRaw(int x, int y, double z) { int index = zIndex(x,y); if (index < 0) { return false; } _z[index] = z; return true; } double Matrix::minValue() const { return _scalars["min"]->value(); } double Matrix::maxValue() const { return _scalars["max"]->value(); } double Matrix::minValueNoSpike() const { // FIXME: it is expensive to calcNoSpikeRange // so we have chosen here to only call it expicitly // and no attempt is made to check if it is still up to date... // It would be better to have these calls call // calcNoSpikeRange iff the values were obsolete. return _minNoSpike; } double Matrix::maxValueNoSpike() const { // FIXME: it is expensive to calcNoSpikeRange // so we have chosen here to only call it expicitly // and no attempt is made to check if it is still up to date... // It would be better to have these calls call // calcNoSpikeRange iff the values were obsolete. return _maxNoSpike; } void Matrix::calcNoSpikeRange(double per) { double *min_list, *max_list, min_of_max, max_of_min; int n_list; int max_n = 50000; // the most samples we will look at... double n_skip; double x=0; int n_notnan; int i,j, k; // count number of points which aren't nans. for (i=n_notnan=0; i<_NS; ++i) { if (!KST_ISNAN(_z[i])) { n_notnan++; } } if (n_notnan==0) { _minNoSpike = 0; _maxNoSpike = 0; return; } if (per < 0) { per = 0; } per *= (double)n_notnan/(double)_NS; max_n *= int((double)_NS/(double)n_notnan); n_skip = (double)_NS/max_n; if (n_skip<1.0) n_skip = 1.0; n_list = int(double(_NS)*per/n_skip); min_list = (double *)malloc(n_list * sizeof(double)); max_list = (double *)malloc(n_list * sizeof(double)); // prefill the list for (i=0; i max_of_min) { max_of_min = min_list[k]; } } } if (_z[j] > min_of_max) { // member for the max list //printf("******** z: %g min_of_max: %g\n", _z[j], min_of_max); // replace min of max with the new value for (k=0; kvalue(); } double Matrix::minValuePositive() const { return _scalars["minpos"]->value(); } int Matrix::numNew() const { return _numNew; } void Matrix::resetNumNew() { _numNew = 0; } void Matrix::zero() { for (int i = 0; i < _zSize; ++i) { _z[i] = 0.0; } updateScalars(); } void Matrix::blank() { for (int i = 0; i < _zSize; ++i) { _z[i] = NOPOINT; } updateScalars(); } int Matrix::getUsage() const { int scalarUsage = 0; for (QHash::ConstIterator it = _scalars.begin(); it != _scalars.end(); ++it) { scalarUsage += it.value()->getUsage() - 1; } return Object::getUsage() + scalarUsage; } void Matrix::internalUpdate() { // calculate stats _NS = _nX * _nY; if (_zSize > 0) { double min = NAN; double max = NAN; double minpos = NAN; double sum = 0.0, sumsquared = 0.0; bool initialized = false; _NRealS = 0; for (int i = 0; i < _zSize; ++i) { if (isfinite(_z[i]) && !KST_ISNAN(_z[i])) { if (!initialized) { min = _z[i]; max = _z[i]; minpos = (_z[0] > 0) ? _z[0] : 1.0E300; initialized = true; _NRealS++; } else { if (min > _z[i]) { min = _z[i]; } if (max < _z[i]) { max = _z[i]; } if (minpos > _z[i] && _z[i] > 0) { minpos = _z[i]; } sum += _z[i]; sumsquared += _z[i] * _z[i]; _NRealS++; } } } _scalars["sum"]->setValue(sum); _scalars["sumsquared"]->setValue(sumsquared); _scalars["max"]->setValue(max); _scalars["min"]->setValue(min); _scalars["minpos"]->setValue(minpos); updateScalars(); } } void Matrix::setXLabelInfo(const LabelInfo &label_info) { _xLabelInfo = label_info; } void Matrix::setYLabelInfo(const LabelInfo &label_info) { _yLabelInfo = label_info; } void Matrix::setTitleInfo(const LabelInfo &label_info) { _titleInfo = label_info; } LabelInfo Matrix::xLabelInfo() const { return _xLabelInfo; } LabelInfo Matrix::yLabelInfo() const { return _yLabelInfo; } LabelInfo Matrix::titleInfo() const { return _titleInfo; } bool Matrix::editable() const { return _editable; } void Matrix::setEditable(bool editable) { _editable = editable; } void Matrix::createScalars(ObjectStore *store) { Q_ASSERT(store); ScalarPtr sp; VectorPtr vp; _scalars.insert("max", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Max"); _scalars.insert("min", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Min"); _scalars.insert("mean", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Mean"); _scalars.insert("sigma", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Sigma"); _scalars.insert("rms", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Rms"); _scalars.insert("ns", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("NS"); _scalars.insert("sum", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("Sum"); _scalars.insert("sumsquared", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("SumSquared"); _scalars.insert("minpos", sp=store->createObject()); sp->setProvider(this); sp->setSlaveName("MinPos"); _vectors.insert("z", vp = store->createObject()); vp->setProvider(this); vp->setSlaveName("Z"); } void Matrix::updateScalars() { _scalars["ns"]->setValue(_NS); if (_NRealS >= 2) { _scalars["mean"]->setValue(_scalars["sum"]->value()/double(_NRealS)); _scalars["sigma"]->setValue( sqrt( (_scalars["sumsquared"]->value() - _scalars["sum"]->value()*_scalars["sum"]->value()/double(_NRealS))/ double(_NRealS-1) ) ); _scalars["rms"]->setValue(sqrt(_scalars["sumsquared"]->value()/double(_NRealS))); } else { _scalars["sigma"]->setValue(_scalars["max"]->value() - _scalars["min"]->value()); _scalars["rms"]->setValue(sqrt(_scalars["sumsquared"]->value())); _scalars["mean"]->setValue(0); } } bool Matrix::resizeZ(int sz, bool reinit) { // qDebug() << "resizing to: " << sz << endl; if (sz >= 1) { if (!kstrealloc(_z, sz*sizeof(double))) { qCritical() << "Matrix resize failed"; return false; } _vectors["z"]->setV(_z, sz); #ifdef ZERO_MEMORY if (reinit && _zSize < sz) { #if ZERO_MEMORY == 2 memset(&_z[_zSize], 0, (sz - _zSize)*sizeof(double)); #else for (int i = _zSize; i < sz; ++i) { _z[i] = 0.0; } #endif } #else // TODO: Is aborting all we can do? fatalError("Not enough memory for matrix data"); return false; #endif _zSize = sz; updateScalars(); } return true; } #if 0 bool Matrix::resize(int xSize, int ySize, bool reinit) { int oldNX = _nX; int oldNY = _nY; _nX = xSize; _nY = ySize; if (resizeZ(xSize*ySize, reinit)) { return true; } else { _nX = oldNX; _nY = oldNY; return false; } } #endif // Resize the matrix to xSize x ySize, maintaining the values in the current // positions. If reinit is set, new entries will be initialized to 0. // Otherwise, they will not be set. The behavior in that case is undefined. bool Matrix::resize(int xSize, int ySize, bool reinit) { if (xSize <= 0 || ySize <= 0) { return false; } // NOTE: _zSize is assumed to correctly represent the state of _z, while _nX // and _nY are the desired (but not necessarily actual) current size of the // matrix bool valid = (_zSize == _nX * _nY); // is the current matrix properly initialized? int sz = xSize * ySize; if (sz > _zSize) { // array is getting bigger, so resize before moving if (!kstrealloc(_z, sz*sizeof(double))) { qCritical() << "Matrix resize failed"; return false; } _vectors["z"]->setV(_z, sz); } if (valid && ySize != _nY && _nY > 0) { // move old values to new spots int source = 0; int target = 0; for (int row=1; row < qMin(xSize, _nX); ++row) { source += _nY; target += ySize; memmove(_z + target, _z + source, qMin(ySize, _nY)*sizeof(double)); if (reinit && ySize > _nY) { // initialize memory in new column(s) of previous row vacated by memmove memset(_z + source, 0, (ySize - _nY)*sizeof(double)); } } } if (sz < _zSize) { // array is getting smaller, so resize after moving if (!kstrealloc(_z, sz*sizeof(double))) { qCritical() << "Matrix resize failed"; return false; } _vectors["z"]->setV(_z, sz); } if (reinit && _zSize < sz) { // initialize new memory after old values for (int row=0; row < qMin(xSize, _nX); ++row) { for (int col = qMin(ySize,_nY); col> _z[i]; // stored in the same order as it was saved } if (i < nX*nY) { Debug::self()->log(tr("Saved matrix contains less data than it claims."), Debug::Warning); resizeZ(i, false); } internalUpdate(); } QString Matrix::descriptionTip() const { return tr("Matrix: %1\n %2 x %3", "%1 is the matrix name. %2 and %3 are its dimensions.").arg(Name()).arg(_nX).arg(_nY); } QString Matrix::sizeString() const { return QString("%1x%2").arg(_nX).arg(_nY); } ObjectList Matrix::outputPrimitives() const { PrimitiveList primitive_list; int n; n = _scalars.count(); for (int i = 0; i< n; ++i) { primitive_list.append(kst_cast(_scalars.values().at(i))); } n = _strings.count(); for (int i = 0; i< n; ++i) { primitive_list.append(kst_cast(_strings.values().at(i))); } n = _vectors.count(); for (int i = 0; i< n; ++i) { VectorPtr V = _vectors.values().at(i); primitive_list.append(kst_cast(V)); primitive_list.append(V->outputPrimitives()); } return primitive_list; } PrimitiveMap Matrix::metas() const { PrimitiveMap meta; for (QHash::ConstIterator it = _strings.begin(); it != _strings.end(); ++it) { meta[it.key()] = it.value(); } for (QHash::ConstIterator it = _scalars.begin(); it != _scalars.end(); ++it) { meta[it.key()] = it.value(); } for (QHash::ConstIterator it = _vectors.begin(); it != _vectors.end(); ++it) { meta[it.key()] = it.value(); } return meta; } QByteArray Matrix::getBinaryArray() const { readLock(); QByteArray ret; QDataStream ds(&ret, QIODevice::WriteOnly); ds<<(qint32)_nX<<(qint32)_nY<<_minX<<_minY<<_stepX<<_stepY; //fixme: this makes it not compatible w/ change(...) uint i; uint n = _nX*_nY; // fill in the raw array with the data for (i = 0; i < n; ++i) { ds << _z[i]; } unlock(); return ret; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/ksttimezone.cpp0000644000175000017500000000420112277111530016511 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "ksttimezone.h" namespace Kst { static QStringList _tzlist; KstTimeZone::KstTimeZone(QString name): _tzName(name) { setTZ(name); } bool KstTimeZone::setTZ(QString name) { bool ok = true; if (!recognised(name)) { ok = false; name = "GMT"; } _supportsDST = true; // force recalculation _tzName = name; _gmtOffset = gmtOffset(0); return ok; } void KstTimeZone::initTZList() { _tzlist.append("GMT"); for (double offset = 0.5; offset <= 12; offset+=0.5) { _tzlist.append(QString("GMT+%1").arg(offset)); } for (double offset = -0.5; offset >=- 12; offset-=0.5) { _tzlist.append(QString("GMT%1").arg(offset)); } } QStringList KstTimeZone::tzList() { if (_tzlist.length() == 0) { initTZList(); } return _tzlist; } bool KstTimeZone::recognised(QString name) { if (_tzlist.length() == 0) { initTZList(); } return (_tzlist.contains(name)); } int KstTimeZone::gmtOffset(time_t t) { if (!_supportsDST) { return _gmtOffset; } _supportsDST = false; if (_tzName == "GMT") { _gmtOffset = 0; } else if (_tzName.startsWith(QLatin1String("GMT"))) { QString tmp = _tzName; bool ok; double hours = 0; hours = tmp.remove("GMT").toDouble(&ok); _gmtOffset = hours * 3600.0; } else { _gmtOffset = 0; } return _gmtOffset; } } Kst-2.0.8/src/libkst/index_kst.h0000644000175000017500000000210112277111530015567 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2006 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef INDEX_KST_H #define INDEX_KST_H namespace Kst { class Index { public: Index() : isTime(false), index(0), time(0.0) {} bool isTime; union { int index; double time; }; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/events.h0000644000175000017500000000343312277111530015114 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EVENTS_H #define EVENTS_H #include #include class QDataStream; class QWidget; namespace Kst { #define EventTypeThread (QEvent::User + 1) #define ELOGCaptureEvent (QEvent::User + 2) #define ELOGConfigureEvent (QEvent::User + 3) #define ELOGAttrsEvent (QEvent::User + 4) #define ELOGDebugInfoEvent (QEvent::User + 5) #define ELOGAliveEvent (QEvent::User + 6) #define ELOGDeathEvent (QEvent::User + 7) #define EventTypeLog (QEvent::User + 8) struct ELOGCaptureStruct { QDataStream* pBuffer; int iWidth; int iHeight; }; enum ELOGAttribType { AttribTypeText = 0, AttribTypeBool, AttribTypeCombo, AttribTypeRadio, AttribTypeCheck }; struct ELOGAttribStruct { QString attribName; QString comment; QWidget *pWidget; ELOGAttribType type; QStringList values; bool bMandatory; int iMaxLength; }; typedef QList ELOGAttribList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/editablematrix.cpp0000644000175000017500000000442512277111530017143 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ // use KCodecs::base64Encode() in kmdcodecs.h // Create QDataStream into a QByteArray // qCompress the bytearray #include "editablematrix.h" #include "debug.h" #include #include namespace Kst { const QString EditableMatrix::staticTypeString = "Editable Matrix"; const QString EditableMatrix::staticTypeTag = "editablematrix"; EditableMatrix::EditableMatrix(ObjectStore *store) : Matrix(store) { _editable = true; _saveable = true; resizeZ(1, true); } const QString& EditableMatrix::typeString() const { return staticTypeString; } void EditableMatrix::save(QXmlStreamWriter &xml) { QByteArray qba(_zSize*sizeof(double), '\0'); QDataStream qds(&qba, QIODevice::WriteOnly); for (int i = 0; i < _zSize; i++) { qds << _z[i]; } xml.writeStartElement(staticTypeTag); saveNameInfo(xml, VNUM|MNUM|XNUM); xml.writeAttribute("xmin", QString::number(minX())); xml.writeAttribute("ymin", QString::number(minY())); xml.writeAttribute("nx", QString::number(xNumSteps())); xml.writeAttribute("ny", QString::number(yNumSteps())); xml.writeAttribute("xstep", QString::number(xStepSize())); xml.writeAttribute("ystep", QString::number(yStepSize())); xml.writeTextElement("data", qCompress(qba).toBase64()); xml.writeEndElement(); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datasourcefactory.cpp0000644000175000017500000000363712277111530017673 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasourcefactory.h" #include #include namespace Kst { static QMap *factories = 0; void cleanupDataSources() { foreach (DataSourceFactory *f, *factories) { delete f; } delete factories; factories = 0; } DataSourceFactory::DataSourceFactory() { } DataSourceFactory::~DataSourceFactory() { } void DataSourceFactory::registerFactory(const QString& node, DataSourceFactory *factory) { if (!factories) { factories = new QMap; qAddPostRoutine(cleanupDataSources); } factories->insert(node, factory); } void DataSourceFactory::registerFactory(const QStringList& nodes, DataSourceFactory *factory) { foreach (const QString &n, nodes) { registerFactory(n, factory); } } DataSourcePtr DataSourceFactory::parse(ObjectStore *store, QXmlStreamReader& stream) { if (!factories) { return 0; } DataSourceFactory *f = factories->value(stream.name().toString()); if (!f) { return 0; } return f->generateDataSource(store, stream); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/stringfactory.h0000644000175000017500000000221512277111530016503 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STRINGFACTORY_H #define STRINGFACTORY_H #include "primitivefactory.h" namespace Kst { class StringFactory : public PrimitiveFactory { public: StringFactory(); ~StringFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/generatedmatrix.h0000644000175000017500000000376612277111530017004 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef GENERATEDMATRIX_H #define GENERATEDMATRIX_H #include "matrix.h" #include "kst_export.h" namespace Kst { class KSTCORE_EXPORT GeneratedMatrix : public Matrix { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; virtual void save(QXmlStreamWriter &xml); void change(uint nX, uint nY, double minX, double minY, double stepX, double stepY, double gradZMin, double gradZMax, bool xDirection); // return gradient min and maxes in order double gradZMin() { return _gradZMin; } double gradZMax() { return _gradZMax; } bool xDirection() { return _xDirection; } protected: GeneratedMatrix(ObjectStore *store); friend class ObjectStore; private: double _gradZMin; double _gradZMax; bool _xDirection; }; typedef SharedPtr GeneratedMatrixPtr; typedef ObjectList GeneratedMatrixList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/math_kst.cpp0000644000175000017500000000175212277111530015757 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2004 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "math_kst.h" namespace Kst { #ifdef NAN const double NOPOINT = NAN; #else const double NOPOINT = 0.0/0.0; // NaN #endif } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/scalarscriptinterface.cpp0000644000175000017500000001217512320547027020524 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "scalarscriptinterface.h" #include "objectstore.h" #include "datasourcepluginmanager.h" #include "updatemanager.h" #include "updateserver.h" #include namespace Kst { /******************************************************/ /* Generated Scalars */ /******************************************************/ ScalarGenSI::ScalarGenSI(ScalarPtr it) { scalar=it; } QString ScalarGenSI::doCommand(QString x) { QString v=doNamedObjectCommand(x, scalar); if (!v.isEmpty()) { return v; } if (x.startsWith(QLatin1String("setValue("))) { scalar->writeLock(); scalar->setValue(x.remove("setValue(").remove(')').toDouble()); scalar->unlock(); return "Done"; } else if (x.startsWith(QLatin1String("value()"))) { return QString::number(scalar->value()); } return "No such command"; } bool ScalarGenSI::isValid() { return scalar.isPtrValid(); } ScriptInterface* ScalarGenSI::newScalar(ObjectStore *store) { ScalarPtr scalar; scalar = store->createObject(); scalar->setOrphan(true); scalar->setEditable(true); return new ScalarGenSI(scalar); } QByteArray ScalarGenSI::endEditUpdate() { UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+scalar->Name()).toLatin1(); } /******************************************************/ /* Data Scalars */ /******************************************************/ ScalarDataSI::ScalarDataSI(DataScalarPtr it) { scalar=it; } QString ScalarDataSI::doCommand(QString x) { QString v=doNamedObjectCommand(x, scalar); if (!v.isEmpty()) { return v; } if (x.startsWith(QLatin1String("change("))) { x.remove("change(").remove(')'); QStringList p = x.split(','); DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource( scalar->store(), p.at(0)); scalar->writeLock(); scalar->change(ds,p.at(1)); scalar->unlock(); return "Done"; } else if (x.startsWith(QLatin1String("file()"))) { return scalar->filename(); } else if (x.startsWith(QLatin1String("field()"))) { return scalar->field(); } else if (x.startsWith(QLatin1String("value()"))) { return QString::number(scalar->value()); } return "No such command"; } bool ScalarDataSI::isValid() { return scalar.isPtrValid(); } ScriptInterface* ScalarDataSI::newScalar(ObjectStore *store) { DataScalarPtr scalar; scalar = store->createObject(); return new ScalarDataSI(scalar); } QByteArray ScalarDataSI::endEditUpdate() { scalar->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+scalar->Name()).toLatin1(); } /******************************************************/ /* Vector Scalars */ /******************************************************/ ScalarVectorSI::ScalarVectorSI(VScalarPtr it) { scalar=it; } QString ScalarVectorSI::doCommand(QString x) { QString v=doNamedObjectCommand(x, scalar); if (!v.isEmpty()) { return v; } if (x.startsWith(QLatin1String("change("))) { x.remove("change(").remove(')'); QStringList p = x.split(','); DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource( scalar->store(), p.at(0)); scalar->writeLock(); scalar->change(ds,p.at(1), p.at(2).toInt()); scalar->unlock(); return "Done"; } else if (x.startsWith(QLatin1String("value()"))) { return QString::number(scalar->value()); } else if (x.startsWith(QLatin1String("file()"))) { return scalar->filename(); } else if (x.startsWith(QLatin1String("field()"))) { return scalar->field(); } else if (x.startsWith(QLatin1String("frame()"))) { return QString::number(scalar->F0()); } return "No such command"; } bool ScalarVectorSI::isValid() { return scalar.isPtrValid(); } ScriptInterface* ScalarVectorSI::newScalar(ObjectStore *store) { VScalarPtr scalar; scalar = store->createObject(); return new ScalarVectorSI(scalar); } QByteArray ScalarVectorSI::endEditUpdate() { scalar->registerChange(); UpdateManager::self()->doUpdates(true); UpdateServer::self()->requestUpdateSignal(); return ("Finished editing "+scalar->Name()).toLatin1(); } } Kst-2.0.8/src/libkst/labelinfo.h0000644000175000017500000000266312277111530015547 0ustar synthsynth/* Keeps track of information relevant to label creation. Copyright (C) 2011 Barth Netterfield netterfield@astro.utoronto.ca This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef LABELINFO_H #define LABELINFO_H #include #include "kst_export.h" namespace Kst { struct KSTCORE_EXPORT LabelInfo { LabelInfo() : name(QString()), quantity(QString()), units(QString()), file(QString()) {} bool operator==(const LabelInfo &l) const { return (l.name==name) && (l.quantity==quantity) && (l.units==units) && (l.file==file); } bool operator!=(const LabelInfo &l) const { return !(*this==l); } QString name; QString quantity; QString units; QString file; QString escapedFile(); QString singleRenderItemLabel() const; }; } #endif // LABELINFO_H Kst-2.0.8/src/libkst/datasource.h0000644000175000017500000003146012277111530015743 0ustar synthsynth/*************************************************************************** datasource.h - abstract data source ------------------- begin : Thu Oct 16 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATASOURCE_H #define DATASOURCE_H #include "kst_export.h" #include "object.h" #include "dateparser.h" #include "objectlist.h" #include "datascalar.h" #include "datastring.h" #include "datavector.h" #include "datamatrix.h" #include #include #include class QSettings; class QXmlStreamWriter; class QXmlStreamAttributes; class QFileSystemWatcher; namespace Kst { class DataSourceConfigWidget; //class DataSourcePlugin; class KSTCORE_EXPORT DataSource : public Object { Q_OBJECT public: DataSource(ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type); virtual ~DataSource(); /************************************************************/ /* Same interface for all supported Primitives */ /************************************************************/ template struct DataInterface { virtual ~DataInterface() {} // read data. The buffer and range info are in ReadInfo virtual int read(const QString& name, typename T::ReadInfo&) = 0; virtual void prepareRead(int number_of_read_calls) {} virtual void readingDone() {} // named elements virtual QStringList list() const = 0; virtual bool isListComplete() const = 0; virtual bool isValid(const QString& name) const = 0; // T specific virtual const typename T::DataInfo dataInfo(const QString& name) const = 0; virtual void setDataInfo(const QString& name, const typename T::DataInfo&) = 0; // meta data virtual QMap metaScalars(const QString& name) = 0; virtual QMap metaStrings(const QString& name) = 0; }; DataInterface& scalar() {Q_ASSERT(interf_scalar); return *interf_scalar; } DataInterface& string() {Q_ASSERT(interf_string); return *interf_string; } DataInterface& vector() {Q_ASSERT(interf_vector); return *interf_vector; } DataInterface& matrix() {Q_ASSERT(interf_matrix); return *interf_matrix; } const DataInterface& scalar() const {Q_ASSERT(interf_scalar); return *interf_scalar; } const DataInterface& string() const {Q_ASSERT(interf_string); return *interf_string; } const DataInterface& vector() const {Q_ASSERT(interf_vector); return *interf_vector; } const DataInterface& matrix() const {Q_ASSERT(interf_matrix); return *interf_matrix; } /************************************************************/ /* Dynamic type system */ /************************************************************/ virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; /************************************************************/ /* Methods for update system */ /************************************************************/ enum UpdateCheckType { Timer, File, None }; virtual void setUpdateType(UpdateCheckType updateType); UpdateCheckType updateType() const; void startUpdating(UpdateCheckType updateType, const QString& file = QString()); virtual UpdateType objectUpdate(qint64 newSerial); void internalUpdate() {return;} qint64 minInputSerial() const {return 0;} qint64 maxInputSerialOfLastChange() const {return 0;} /** Updates number of samples. For ascii files, it also reads and writes to a temporary binary file. It must be implemented by the datasource. */ virtual UpdateType internalDataSourceUpdate() = 0; /************************************************************/ /* Methods for handling time in vectors. */ /* not currently used - may be reworked (remove this note */ /* if you use it) */ /************************************************************/ static bool supportsTime(const QString& plugin, const QString& type = QString()); virtual QString timeFormat() const; /** Does it support time conversion of sample numbers, in general? */ virtual bool supportsTimeConversions() const; virtual int sampleForTime(const QDateTime& time, bool *ok = 0L); virtual int sampleForTime(double milliseconds, bool *ok = 0L); virtual QDateTime timeForSample(int sample, bool *ok = 0L); // in (ms) virtual double relativeTimeForSample(int sample, bool *ok = 0L); /************************************************************/ /* Methods for handling time in vectors. These are used. */ /************************************************************/ virtual bool isTime(const QString &field) const; /************************************************************/ /* Methods for using custom lookup vectors, like TIME. */ /* "Index" refers to custom lookup vector. */ /* For all of these, a default implementation is provided */ /* in the base class. */ /************************************************************/ /** returns the frame number corresponding to an index value from a frame */ virtual int indexToFrame(double index, const QString &field); virtual double frameToIndex(int frame, const QString &field); virtual double readDespikedIndex(int frame, const QString &field); virtual double framePerIndex(const QString &field); virtual QStringList &timeFields(); virtual QStringList &indexFields(); /************************************************************/ /* UI TODO leave here? */ /************************************************************/ bool hasConfigWidget() const; DataSourceConfigWidget *configWidget(); virtual void parseProperties(QXmlStreamAttributes &properties); bool reusable() const; void disableReuse(); /************************************************************/ /* Color for the "assign curve color per file" tool */ /************************************************************/ QColor color() const; void setColor(const QColor& color); /************************************************************/ /* File/data specific */ /************************************************************/ virtual bool isValid() const; // generally you don't need to change this virtual QString fileName() const; QString alternateFilename() const; void setAlternateFilename(const QString &file); QMap fileMetas() const; /** Returns the file type or an error message in a static string The string is stored in a separate static variable, so changes to this are ignored. It is updated each time the fn is called */ virtual QString fileType() const; void saveSource(QXmlStreamWriter &s); /** Save file description info into stream s. */ virtual void save(QXmlStreamWriter &s); const QString& sourceName() const { return _source; } /** Returns true if this file is empty */ virtual bool isEmpty() const; /** Reset to initial state of the source, just as though no data had been * read and the file had just been opened. */ virtual void reset(); virtual void deleteDependents(); virtual QString descriptionTip() const; /** Creates a list of curves without user interaction */ virtual ObjectList autoCurves(ObjectStore&) { return ObjectList(); } PrimitiveList slavePrimitives; public Q_SLOTS: virtual void checkUpdate(); Q_SIGNALS: void sourceUpdated(ObjectPtr sourceObject); void progress(int percent, const QString& message); protected: /** Is the object valid? */ bool _valid; bool _reusable; bool _writable; /** The filename. Populated by the base class constructor. */ QString _filename; /** an alias for the file: for example if the file were replaced at load time */ QString _alternateFilename; //friend class DataSourcePlugin; /** The source type name. */ QString _source; QSettings *_cfg; UpdateCheckType _updateCheckType; void resetFileWatcher(); virtual QString _automaticDescriptiveName() const; void _initializeShortName(); void setInterface(DataInterface*); void setInterface(DataInterface*); void setInterface(DataInterface*); void setInterface(DataInterface*); QStringList _frameFields; QStringList _timeFields; private: DataSource(); DataInterface* interf_scalar; DataInterface* interf_string; DataInterface* interf_vector; DataInterface* interf_matrix; QFileSystemWatcher *_watcher; QColor _color; // NOTE: You must bump the version key if you add new member variables // or change or add virtual functions. }; class DataSourceList : public QList { public: DataSourceList() : QList() {} DataSourceList(const DataSourceList& x) : QList(x) {} virtual ~DataSourceList() {} virtual DataSourcePtr findName(const QString name) { for (DataSourceList::Iterator it = begin(); it != end(); ++it) { if ((*it)->Name() == name) { return *it; } } return 0; } virtual DataSourcePtr findFileName(const QString& x) { for (DataSourceList::Iterator it = begin(); it != end(); ++it) { if ((*it)->fileName() == x) { return *it; } } return 0; } // @since 1.1.0 DataSourcePtr findReusableFileName(const QString& x) { for (DataSourceList::Iterator it = begin(); it != end(); ++it) { if ((*it)->reusable()) { if ((*it)->fileName() == x) { return *it; } else if ((*it)->alternateFilename() == x) { return *it; } } } return 0; } // @since 1.1.0 QStringList fileNames() const { QStringList rc; for (DataSourceList::ConstIterator it = begin(); it != end(); ++it) { rc << (*it)->fileName(); } return rc; } #if QT_VERSION < 0x040500 void append(const DataSourcePtr& ptr) { QList::append(ptr); } void append(const DataSourceList& list) { foreach(const DataSourcePtr& ptr, list) { QList::append(ptr); } } #endif }; // @since 1.1.0 class KSTCORE_EXPORT DataSourceConfigWidget : public QWidget { Q_OBJECT public: explicit DataSourceConfigWidget(QSettings&); // will be reparented later virtual ~DataSourceConfigWidget(); QSettings& settings() const; // If _instance is nonzero, then your settings are to be saved for this // particular instance of the source, as opposed to globally. void setInstance(DataSourcePtr inst); DataSourcePtr instance() const; bool hasInstance() const; // Check if the widget could be closed, // and the user has not entered invalid parameters. virtual bool isOkAcceptabe() const; virtual void setDialogParent(QDialog* parent) { setParent(parent); } public slots: virtual void load() = 0; virtual void save() = 0; virtual void cancel() {return;} private: DataSourcePtr _instance; QSettings& _cfg; friend class DataSource; }; class KSTCORE_EXPORT ValidateDataSourceThread : public QObject, public QRunnable { Q_OBJECT public: ValidateDataSourceThread(const QString& file, const int requestID); void run(); Q_SIGNALS: void dataSourceValid(QString filename, int requestID); void dataSourceInvalid(int requestID); private: ObjectStore *_store; QString _file; int _requestID; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/objectlist.h0000644000175000017500000000251612277111530015753 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef OBJECTLIST_H #define OBJECTLIST_H #include #include #include "rwlock.h" #include "sharedptr.h" namespace Kst { template class ObjectList : public QList > { #if QT_VERSION < 0x040500 public: void append(const SharedPtr& ptr) { QList >::append(ptr); } void append(const ObjectList& list) { foreach(const SharedPtr& ptr, list) { QList >::append(ptr); } } #endif }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/primitivefactory.cpp0000644000175000017500000000375012277111530017545 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "primitivefactory.h" #include #include namespace Kst { static QMap *primitive_factories = 0; void cleanupPrimitives() { foreach (PrimitiveFactory *f, *primitive_factories) { delete f; } delete primitive_factories; primitive_factories = 0; } PrimitiveFactory::PrimitiveFactory() { } PrimitiveFactory::~PrimitiveFactory() { } void PrimitiveFactory::registerFactory(const QString& node, PrimitiveFactory *factory) { if (!primitive_factories) { primitive_factories = new QMap; qAddPostRoutine(cleanupPrimitives); } primitive_factories->insert(node, factory); } void PrimitiveFactory::registerFactory(const QStringList& nodes, PrimitiveFactory *factory) { foreach (const QString &n, nodes) { registerFactory(n, factory); } } PrimitivePtr PrimitiveFactory::parse(ObjectStore *store, QXmlStreamReader& stream) { if (!primitive_factories) { return 0; } PrimitiveFactory *f = primitive_factories->value(stream.name().toString()); if (!f) { return 0; } return f->generatePrimitive(store, stream); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/psversion.c0000644000175000017500000000246112277111530015633 0ustar synthsynth/* Suite version information for procps utilities * Copyright (c) 1995 Martin Schulze * Ammended by cblake to only export the function symbol. * * Modified by Albert Cahalan, 2003 * * Redistributable under the terms of the * GNU Library General Public License; see COPYING */ #include #include #include #include "psversion.h" const char procps_version[] = "procps copy"; void display_version(void) { fprintf(stdout, "%s\n", procps_version); } /* Linux kernel version information for procps utilities * Copyright (c) 1996 Charles Blake */ #include #define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z) int linux_version_code; static void init_Linux_version(void) __attribute__((constructor)); static void init_Linux_version(void) { static struct utsname uts; int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */ if (uname(&uts) == -1) /* failure implies impending death */ exit(1); if (sscanf(uts.release, "%d.%d.%d", &x, &y, &z) < 3) fprintf(stderr, /* *very* unlikely to happen by accident */ "Non-standard uts for running kernel:\n" "release %s=%d.%d.%d gives version code %d\n", uts.release, x, y, z, LINUX_VERSION(x,y,z)); linux_version_code = LINUX_VERSION(x, y, z); } Kst-2.0.8/src/libkst/ksttimers.h0000644000175000017500000000171312277111530015634 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KSTTIMERS_H #define KSTTIMERS_H #include #ifdef HAVE_KST_USE_TIMERS #define BENCHMARK #endif #endif Kst-2.0.8/src/libkst/libkst.pro0000644000175000017500000000513312277111530015450 0ustar synthsynthTOPOUT_REL=../.. include($$PWD/$$TOPOUT_REL/kst.pri) TEMPLATE = lib CONFIG += dll DEFINES += BUILD_KSTCORE TARGET = $$kstlib(kst2lib) DESTDIR = $$OUTPUT_DIR/lib unix:QMAKE_LFLAGS_SHLIB *= -lrt macx:CONFIG += lib_bundle !isEmpty(INSTALL_PREFIX) { target.path = $$INSTALL_PREFIX/$$INSTALL_LIBDIR INSTALLS += target } INCLUDEPATH += tmp \ $$TOPLEVELDIR/src/widgets \ $$OUTPUT_DIR/src/libkst/tmp SOURCES += builtindatasources.cpp \ builtinprimitives.cpp \ coredocument.cpp \ datacollection.cpp \ datamatrix.cpp \ dataprimitive.cpp \ datasource.cpp \ datasourcefactory.cpp \ datasourcepluginfactory.cpp \ datasourcepluginmanager.cpp \ datavector.cpp \ datascalar.cpp \ datastring.cpp \ dateparser.cpp \ debug.cpp \ editablematrix.cpp \ editablevector.cpp \ extension.cpp \ generatedmatrix.cpp \ generatedvector.cpp \ labelinfo.cpp \ math_kst.cpp \ matrix.cpp \ matrixfactory.cpp \ measuretime.cpp \ namedobject.cpp \ nextcolor.cpp \ object.cpp \ objectlist.cpp \ objectmap.cpp \ objectstore.cpp \ plotiteminterface.cpp \ primitive.cpp \ primitivefactory.cpp \ rwlock.cpp \ scalar.cpp \ scalarfactory.cpp \ shortnameindex.cpp \ string_kst.cpp \ stringfactory.cpp \ updatemanager.cpp \ vector.cpp \ vectorfactory.cpp \ vscalar.cpp \ ksttimezone.cpp #!win32:SOURCES += stdinsource.cpp !macx:!win32:SOURCES += sysinfo.c \ psversion.c HEADERS += builtindatasources.h \ builtinprimitives.h \ coredocument.h \ datacollection.h \ datamatrix.h \ dataplugin.h \ dataprimitive.h \ datasource.h \ datasourcefactory.h \ datasourcepluginfactory.h \ datasourcepluginmanager.h \ datavector.h \ datascalar.h \ datastring.h \ dateparser.h \ debug.h \ editablematrix.h \ editablevector.h \ events.h \ extension.h \ generatedmatrix.h \ generatedvector.h \ kst_export.h \ kst_i18n.h \ ksttimers.h \ index_kst.h \ labelinfo.h \ logevents.h \ math_kst.h \ matrix.h \ matrixfactory.h \ measuretime.h \ namedobject.h \ object.h \ objectlist.h \ objectmap.h \ objectstore.h \ plotiteminterface.h \ primitive.h \ primitivefactory.h \ procps.h \ psversion.h \ rwlock.h \ scalar.h \ scalarfactory.h \ sharedptr.h \ # stdinsource.h \ string_kst.h \ stringfactory.h \ sysinfo.h \ timezones.h \ updatemanager.h \ vector.h \ vectorfactory.h \ vscalar.h \ ksttimezone.h Kst-2.0.8/src/libkst/psversion.h0000644000175000017500000000211612277111530015635 0ustar synthsynth#include #ifdef __linux__ #ifndef PROC_VERSION_H #define PROC_VERSION_H #ifndef S #define S(X) ((unsigned long long)(X) << 10) #endif #include "procps.h" /* Suite version information for procps utilities * Copyright (c) 1995 Martin Schulze * Linux kernel version information for procps utilities * Copyright (c) 1996 Charles Blake * Distributable under the terms of the GNU Library General Public License * * Copy right 2002 Albert Cahalan */ EXTERN_C_BEGIN extern void display_version(void); /* display suite version */ extern const char procps_version[]; /* global buf for suite version */ extern int linux_version_code; /* runtime version of LINUX_VERSION_CODE in /usr/include/linux/version.h */ /* Convenience macros for composing/decomposing version codes */ #define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z) #define LINUX_VERSION_MAJOR(x) (((x)>>16) & 0xFF) #define LINUX_VERSION_MINOR(x) (((x)>> 8) & 0xFF) #define LINUX_VERSION_PATCH(x) ( (x) & 0xFF) EXTERN_C_END #endif /* PROC_VERSION_H */ #endif Kst-2.0.8/src/libkst/vectorfactory.h0000644000175000017500000000337512277111530016507 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef VECTORFACTORY_H #define VECTORFACTORY_H #include "primitivefactory.h" namespace Kst { class VectorFactory : public PrimitiveFactory { public: VectorFactory(); ~VectorFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class GeneratedVectorFactory : public PrimitiveFactory { public: GeneratedVectorFactory(); ~GeneratedVectorFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class EditableVectorFactory : public PrimitiveFactory { public: EditableVectorFactory(); ~EditableVectorFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class DataVectorFactory : public PrimitiveFactory { public: DataVectorFactory(); ~DataVectorFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/updateserver.h0000644000175000017500000000370512277111530016323 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2013 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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 class will provide a signal when an update to object lists in * dialogs is needed. For instance, when a new vector is added, or its * name has been changed. */ #ifndef UPDATESERVER_H #define UPDATESERVER_H #include "kst_export.h" #include namespace Kst { /** A signal is requested by a call to requestUpdateSignal. The signal * will be emitted when the _signalSuspendDepthCounter is zero. If multiple * signals are requested while _signalSuspendDepthCounter is non zero, only one * will be emitted. beginSuspendSignals() increments _signalSuspendDepthCounter. * endSuspendSignals() decrements it. */ class KSTCORE_EXPORT UpdateServer : public QObject { Q_OBJECT public: static UpdateServer* self(); void beginSuspendSignals() {_signalSuspendDepthCounter++;} void endSuspendSignals(); void requestUpdateSignal(); private: UpdateServer(); ~UpdateServer(); static UpdateServer* _self; static void cleanup(); int _signalSuspendDepthCounter; bool _signalRequested; Q_SIGNALS: void objectListsChanged(); public slots: }; } #endif // UPDATESERVER_H Kst-2.0.8/src/libkst/sharedptr.h0000644000175000017500000001246412277111530015610 0ustar synthsynth/* This file is derived from the KDE libraries Copyright (c) 1999 Waldo Bastian Copyright (c) 2004 The University of Toronto This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. */ #ifndef SharedPTR_H #define SharedPTR_H #include #include //#define KST_DEBUG_SHARED #ifdef KST_DEBUG_SHARED #define KST_DBG if (true) #else #define KST_DBG if (false) #endif // NOTE: In order to preserve binary compatibility with plugins, you must // not add, remove, or change member variables or virtual functions. // You must also not remove or change non-virtual functions. // See KSharedPtr in KDE libraries for more information namespace Kst { #define SEMAPHORE_COUNT 999999 class Shared { public: /** * Standard constructor. This will initialize the reference count * on this object to 0. */ Shared() : sem(SEMAPHORE_COUNT) { } /** * Copy constructor. This will @em not actually copy the objects * but it will initialize the reference count on this object to 0. */ Shared( const Shared & ) : sem(SEMAPHORE_COUNT) { } /** * Overloaded assignment operator. */ Shared &operator=(const Shared & ) { return *this; } /** * Increases the reference count by one. */ void _KShared_ref() const { sem.acquire(1); KST_DBG qDebug() << "KShared_ref: " << (void*)this << " -> " << _KShared_count() << endl; } /** * Releases a reference (decreases the reference count by one). If * the count goes to 0, this object will delete itself. */ void _KShared_unref() const { sem.release(1); KST_DBG qDebug() << "KShared_unref: " << (void*)this << " -> " << _KShared_count() << endl; if (SEMAPHORE_COUNT == sem.available()) delete this; } /** * Return the current number of references held. * * @return Number of references */ int _KShared_count() const { return SEMAPHORE_COUNT - sem.available(); } protected: virtual ~Shared() { } private: mutable QSemaphore sem; }; template< class T > struct SharedPtr { public: /** * Creates a null pointer. */ SharedPtr() : ptr(0) { isPtrValid(); } /** * Creates a new pointer. * @param t the pointer */ SharedPtr( T* t ) : ptr(t) { if (isPtrValid()) ptr->_KShared_ref(); } /** * Copies a pointer. * @param p the pointer to copy */ SharedPtr( const SharedPtr& p ) : ptr(p.ptr) { if (isPtrValid()) ptr->_KShared_ref(); } template SharedPtr(SharedPtr& p) : ptr(p.data()) { if (isPtrValid()) ptr->_KShared_ref(); } /** * Unreferences the object that this pointer points to. If it was * the last reference, the object will be deleted. */ ~SharedPtr() { if (isPtrValid()) ptr->_KShared_unref(); } SharedPtr& operator= ( const SharedPtr& p ) { isPtrValid(); if ( ptr == p.ptr ) return *this; if (isPtrValid()) ptr->_KShared_unref(); ptr = p.ptr; if (isPtrValid()) ptr->_KShared_ref(); return *this; } template SharedPtr& operator=(SharedPtr& p) { isPtrValid(); if (ptr == p.data()) return *this; if (isPtrValid()) ptr->_KShared_unref(); ptr = p.data(); if (isPtrValid()) ptr->_KShared_ref(); return *this; } SharedPtr& operator= ( T* p ) { isPtrValid(); if (ptr == p) return *this; if (isPtrValid()) ptr->_KShared_unref(); ptr = p; if (isPtrValid()) ptr->_KShared_ref(); return *this; } bool operator== ( const SharedPtr& p ) const { isPtrValid(); return ( ptr == p.ptr ); } bool operator!= ( const SharedPtr& p ) const { isPtrValid(); return ( ptr != p.ptr ); } bool operator== ( const T* p ) const { isPtrValid(); return ( ptr == p ); } bool operator!= ( const T* p ) const { isPtrValid(); return ( ptr != p ); } bool operator!() const { isPtrValid(); return ( ptr == 0 ); } operator T*() const { isPtrValid(); return ptr; } /** * Returns the pointer. * @return the pointer */ T* data() { isPtrValid(); return ptr; } /** * Returns the pointer. * @return the pointer */ const T* data() const { isPtrValid(); return ptr; } const T& operator*() const { Q_ASSERT(isPtrValid()); return *ptr; } T& operator*() { Q_ASSERT(isPtrValid()); return *ptr; } const T* operator->() const { Q_ASSERT(isPtrValid()); return ptr; } T* operator->() { Q_ASSERT(isPtrValid()); return ptr; } /** * Returns the number of references. * @return the number of references */ int count() const { Q_ASSERT(isPtrValid()); return ptr->_KShared_count(); } // for debugging purposes bool isPtrValid() const { return ptr != 0; } private: T* ptr; }; template inline SharedPtr kst_cast(SharedPtr object) { return qobject_cast(object.data()); } // FIXME: make this safe template inline SharedPtr kst_cast(QObject *object) { return qobject_cast(object); } } #endif Kst-2.0.8/src/libkst/scalar.cpp0000644000175000017500000000715612320547027015421 0ustar synthsynth/*************************************************************************** scalar.cpp - the base scalar type ------------------- begin : March 24, 2003 copyright : (C) 2003 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "scalar.h" #include "scalarscriptinterface.h" #include #include #include namespace Kst { const QString Scalar::staticTypeString = "Scalar"; const QString Scalar::staticTypeTag = "scalar"; /** Create the base scalar */ Scalar::Scalar(ObjectStore *store) : Primitive(store, 0L), _value(0.0), _orphan(false), _displayable(true), _editable(false) { setFlag(true); _initializeShortName(); } void Scalar::_initializeShortName() { _shortName = 'X'+QString::number(_xnum); if (_xnum>max_xnum) max_xnum = _xnum; _xnum++; } Scalar::~Scalar() { //qDebug() << "scalar destructor for: " << Name(); } const QString& Scalar::typeString() const { return staticTypeString; } ScriptInterface* Scalar::createScriptInterface() { return new ScalarGenSI(this); } void Scalar::internalUpdate() { // do nothing } void Scalar::save(QXmlStreamWriter &s) { if (provider()) { return; } s.writeStartElement("scalar"); if (_orphan) { s.writeAttribute("orphan", "true"); } if (_editable) { s.writeAttribute("editable", "true"); } if (hidden()) { s.writeAttribute("hidden", "true"); } s.writeAttribute("value", QString::number(value())); saveNameInfo(s, XNUM); s.writeEndElement(); } Scalar& Scalar::operator=(double v) { setValue(v); return *this; } void Scalar::setValue(double inV) { writeLock(); if (_value != inV) { _value = inV; registerChange(); } unlock(); } QString Scalar::label() const { return QString::number(_value); } double Scalar::value() const { return _value; } bool Scalar::orphan() const { return _orphan; } void Scalar::setOrphan(bool orphan) { _orphan = orphan; } bool Scalar::displayable() const { return _displayable; } void Scalar::setDisplayable(bool displayable) { _displayable = displayable; } bool Scalar::editable() const { return _editable; } void Scalar::setEditable(bool editable) { _editable = editable; } QString Scalar::descriptionTip() const { if (_provider) { return tr("Scalar: %1 = %2\n%3", "%1 is the variable name. %2 is its value").arg(Name()).arg(value()).arg(_provider->descriptionTip()); } else { return tr("Scalar: %1 = %2", "%1 is the variable name. %2 is its value").arg(Name()).arg(value()); } } QString Scalar::_automaticDescriptiveName() const { if (_orphan) { return QString::number(value()); } else { return Primitive::_automaticDescriptiveName(); } } QString Scalar::sizeString() const { return QString("1"); } QString Scalar::propertyString() const { return tr("Value: %1").arg(value()); } } // vim: et ts=2 sw=2 Kst-2.0.8/src/libkst/updatemanager.cpp0000644000175000017500000000754312320547027016771 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "updatemanager.h" #include "primitive.h" #include "datasource.h" #include "objectstore.h" #include "measuretime.h" #include #include #include #define DEFAULT_MIN_UPDATE_PERIOD 2000 namespace Kst { static UpdateManager *_self = 0; void UpdateManager::cleanup() { delete _self; _self = 0; } UpdateManager *UpdateManager::self() { if (!_self) { _self = new UpdateManager; qAddPostRoutine(cleanup); } return _self; } UpdateManager::UpdateManager() { _serial = 0; _minUpdatePeriod = DEFAULT_MIN_UPDATE_PERIOD; _paused = false; _store = 0; _delayedUpdateScheduled = false; _updateInProgress = false; _time.start(); } UpdateManager::~UpdateManager() { } void UpdateManager::delayedUpdates() { _delayedUpdateScheduled = false; doUpdates(); } void UpdateManager::doUpdates(bool forceImmediate) { if (_delayedUpdateScheduled && !forceImmediate) { return; } if (!_store) { return; } //FIXME: should we just skip updating data sources in this case? if (_paused && !forceImmediate) { return; } int dT = _time.elapsed(); if (((dT<_minUpdatePeriod) || (_updateInProgress)) && (!forceImmediate)) { if (!_delayedUpdateScheduled) { _delayedUpdateScheduled = true; int deferTime = _minUpdatePeriod-dT; if (deferTime <= 0) { deferTime = 20; // if an update is already in progress, wait this long to check again. } QTimer::singleShot(deferTime, this, SLOT(delayedUpdates())); } return; } _updateInProgress = true; _time.restart(); _serial++; int n_updated=0, n_deferred=0, n_unchanged = 0; qint64 retval; // update the datasources foreach (DataSourcePtr ds, _store->dataSourceList()) { ds->writeLock(); retval = ds->objectUpdate(_serial); ds->unlock(); if (retval == Object::Updated) n_updated++; else if (retval == Object::Deferred) n_deferred++; else if (retval == Object::NoChange) n_unchanged++; } //qDebug() << "ds up: " << n_updated << " ds def: " << n_deferred << " n_no: " << n_unchanged; //MeasureTime t(" UpdateManager::doUpdates loop"); int i_loop = retval = 0; int maxloop = _store->objectList().size(); do { n_updated = n_unchanged = n_deferred = 0; // update data objects foreach (ObjectPtr p, _store->objectList()) { p->writeLock(); retval = p->objectUpdate(_serial); p->unlock(); if (retval == Object::Updated) n_updated++; else if (retval == Object::Deferred) n_deferred++; else if (retval == Object::NoChange) n_unchanged++; } maxloop = qMin(maxloop,n_deferred); //qDebug() << "loop: " << i_loop << " obj up: " << n_updated << " obj def: " << n_deferred << " obj_no: " << n_unchanged << "dt:" << double(_time.elapsed())/1000.0; i_loop++; } while ((n_deferred + n_updated > 0) && (i_loop<=maxloop)); if (forceImmediate) { foreach(DataSourcePtr ds, _store->dataSourceList()) { ds->vector().readingDone(); } } emit objectsUpdated(_serial); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/dataprimitive.h0000644000175000017500000000473612277111530016461 0ustar synthsynth/*************************************************************************** datastprimitive.h - add datasource handling capability to a primitive ------------------- begin : October, 2009 copyright : (C) 2009 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef DATAPRIMITIVE_H #define DATAPRIMITIVE_H #include "sharedptr.h" #include "kst_export.h" #include class QXmlStreamWriter; class QXmlStreamAttributes; namespace Kst { class DataSource; typedef SharedPtr DataSourcePtr; class Primitive; typedef SharedPtr PrimitivePtr; class KSTCORE_EXPORT DataPrimitive { public: virtual ~DataPrimitive(); /** return the name of the file */ QString filename() const; /** save filename to xml stream */ void saveFilename(QXmlStreamWriter&); static void saveFilename(const QString&, QXmlStreamWriter&); static QString readFilename(const QXmlStreamAttributes&); /** return the field name */ const QString& field() const; /** the data source */ DataSourcePtr dataSource() const; void setDataSource(const DataSourcePtr&); /** change the datasource */ virtual void changeFile(DataSourcePtr file); /** return true if it has a valid file and field, or false otherwise */ //virtual bool isValid() const = 0; /** file to read */ QString _field; virtual PrimitivePtr makeDuplicate() const = 0; virtual bool checkValidity(const DataSourcePtr& ds) const = 0; protected: DataPrimitive(Primitive* primitive); private: DataPrimitive(); struct Private; Private& d; }; } Q_DECLARE_INTERFACE(Kst::DataPrimitive, "DataPrimitive") #endif // DATAPRIMITIVE_H Kst-2.0.8/src/libkst/stringscriptinterface.h0000644000175000017500000000313612320547027020227 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2014 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STRINGSCRIPTINTERFACE_H #define STRINGSCRIPTINTERFACE_H #include #include "scriptinterface.h" #include "datastring.h" namespace Kst { class KSTCORE_EXPORT StringGenSI : public ScriptInterface { Q_OBJECT StringPtr str; public: explicit StringGenSI(StringPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newString(ObjectStore *store); }; class KSTCORE_EXPORT StringDataSI : public ScriptInterface { Q_OBJECT DataStringPtr str; public: explicit StringDataSI(DataStringPtr it); QString doCommand(QString); bool isValid(); QByteArray endEditUpdate(); static ScriptInterface* newString(ObjectStore *store); }; } #endif // STRINGSCRIPTINTERFACE_H Kst-2.0.8/src/libkst/datacollection.cpp0000644000175000017500000000503112277111530017124 0ustar synthsynth/*************************************************************************** datacollection.cpp ------------------- begin : June 12, 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datacollection.h" #include #include #include #include "debug.h" #include "sysinfo.h" #include "psversion.h" #ifdef Q_OS_WIN #include #endif namespace Kst { static QMutex bigLock; double Data::AvailableMemory() { double one_GB = 1024.0*1024.0*1024.0; double available_memory = 0; #ifdef Q_OS_WIN // (http://msdn.microsoft.com/en-us/library/aa366589) MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex); available_memory = statex.ullAvailPhys; #elif defined Q_OS_LINUX QMutexLocker ml(&bigLock); meminfo(); available_memory = double(S(kb_main_free + kb_main_cached)) - 30.0*1024.0*1024.0; // 30MB margin #else // TODO other OSs // or assume 32-bit on a big system available_memory = 4 * one_GB; #endif Debug::self()->log(QString("Available memory: %1 GB").arg(available_memory/one_GB)); return available_memory; } Data *Data::_self = 0L; void Data::cleanup() { delete _self; _self = 0; } Data *Data::self() { Q_ASSERT(_self); return _self; } void Data::replaceSelf(Data *newInstance) { cleanup(); _self = newInstance; } Data::Data() { qAddPostRoutine(Data::cleanup); } Data::~Data() { } void Data::removeCurveFromPlots(Relation *c) { Q_UNUSED(c) // meaningless in no GUI: no plots! } QList Data::plotList() const { return QList(); } int Data::rows() const { return -1; } int Data::columns() const { return -1; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/builtinprimitives.cpp0000644000175000017500000000263212277111530017725 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "builtinprimitives.h" #include "vectorfactory.h" #include "scalarfactory.h" #include "stringfactory.h" #include "matrixfactory.h" namespace Kst { namespace Builtins { void initPrimitives() { new VectorFactory(); new GeneratedVectorFactory(); new EditableVectorFactory(); new DataVectorFactory(); new ScalarFactory(); new DataScalarFactory(); new VScalarFactory(); new StringFactory(); new GeneratedMatrixFactory(); new EditableMatrixFactory(); new DataMatrixFactory(); } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/vscalar.h0000644000175000017500000000572112320547027015250 0ustar synthsynth/*************************************************************************** vscalar.h - a scalar from a sample of a vector field ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef VSCALAR_H #define VSCALAR_H #include "scalar.h" #include "datasource.h" #include "kst_export.h" class QXmlStreamWriter; namespace Kst { /**A class for handling vector scalars for kst. *@author cbn */ /** A scalar which gets its value from a vector field in a data file. */ class KSTCORE_EXPORT VScalar : public Scalar { Q_OBJECT protected: VScalar(ObjectStore *store); friend class ObjectStore; virtual QString _automaticDescriptiveName() const; virtual qint64 minInputSerial() const; virtual qint64 maxInputSerialOfLastChange() const; public: virtual ~VScalar(); /** Update the scalar. */ virtual void internalUpdate(); virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; /** change the properties of a VScalar */ void change(DataSourcePtr file, const QString &field, int f0); void changeFile(DataSourcePtr file); /** return the name of the file */ QString filename() const; /** return the field name */ const QString& field() const; /** return sample number */ int F0() const; /** Save scalar information */ virtual void save(QXmlStreamWriter &s); /** the data source */ DataSourcePtr dataSource() const; virtual QString descriptionTip() const; /** return true if it has a valid file and field, or false otherwise */ bool isValid() const; virtual QString propertyString() const; virtual ScriptInterface* createScriptInterface(); private: /** file to read for rvectors */ DataSourcePtr _file; /** For the scalar field in the data source */ QString _field; int _f0; /** make a copy of the VScalar */ virtual PrimitivePtr _makeDuplicate() const; virtual bool _checkValidity(const DataSourcePtr ds) const; }; typedef SharedPtr VScalarPtr; typedef ObjectList VScalarList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/matrix.h0000644000175000017500000001377512277111530015126 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2004 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef MATRIX_H #define MATRIX_H #include "scalar.h" #include "vector.h" #include "primitive.h" class QXmlStreamWriter; namespace Kst { class Matrix; typedef SharedPtr MatrixPtr; class KSTCORE_EXPORT Matrix : public Primitive { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; virtual QString descriptionTip() const; protected: Matrix(ObjectStore *store); virtual ~Matrix(); friend class ObjectStore; virtual void _initializeShortName(); public: void change(uint nX, uint nY, double minX=0, double minY=0, double stepX=1, double stepY=1); void change(QByteArray& data, uint nX, uint nY, double minX=0, double minY=0, double stepX=1, double stepY=1); // Return the sample count (x times y) of the matrix virtual int sampleCount() const; // return the z value of the rectangle in which the specified point lies // ok is false if the point is out of bounds double value(double x, double y, bool *ok = 0L) const; double value(double x, double y, QPointF &matchedPoint, bool *ok = 0L) const; // set the z value of the rectangle in which the specified point lies // return false if the point is out of bounds bool setValue(double x, double y, double z); // return the value of the specified rectangle // ok is false if the rectangle does not exist double valueRaw(int x, int y, bool *ok = 0L) const; // set the value of the specified rectangle // return false if the rectangle does not exist virtual bool setValueRaw(int x, int y, double z); // return some stats on the z values double minValue() const; double maxValue() const; // spike insensitive values void calcNoSpikeRange(double per = 0.005); double maxValueNoSpike() const; double minValueNoSpike() const; // return mean of the z values double meanValue() const; // return least positive z value double minValuePositive() const; // number of new samples in the matrix since last resetNumNew() int numNew() const; // reset numNew to 0 void resetNumNew(); // labels for plots virtual void setXLabelInfo(const LabelInfo &label_info); virtual void setYLabelInfo(const LabelInfo &label_info); virtual void setTitleInfo(const LabelInfo &label_info); virtual LabelInfo xLabelInfo() const; virtual LabelInfo yLabelInfo() const; virtual LabelInfo titleInfo() const; void zero(); // clear out the matrix void blank(); // get usage of this matrix by other objects virtual int getUsage() const; // save the matrix virtual void save(QXmlStreamWriter &s); // set the labels for this matrix void setLabel(const QString& newLabel); // whether or not this matrix can be edited bool editable() const; void setEditable(bool editable); // whether or not this matrix can be saved bool saveable() const; // matrix dimensions int xNumSteps() const { return _nX; } int yNumSteps() const { return _nY; } double xStepSize() const { return _stepX; } double yStepSize() const { return _stepY; } virtual bool invertXHint() const {return _invertXHint; } virtual bool invertYHint() const {return _invertYHint; } double minX() const { return _minX; } double minY() const { return _minY; } virtual bool resize(int xSize, int ySize, bool reinit = true); virtual void deleteDependents(); virtual QString sizeString() const; virtual void internalUpdate(); double Z(int i) const {return _z[i];} // output primitives: statistics scalars, etc. VectorMap vectors() const {return _vectors;} ScalarMap scalars() const {return _scalars;} StringMap strings() const {return _strings;} virtual PrimitiveMap metas() const; virtual ObjectList outputPrimitives() const; QByteArray getBinaryArray() const; protected: int _NS; int _NRealS; // number of samples with real values int _nX; //this can be 0 int _nY; //this should never be 0 double _minX; double _minY; double _stepX; double _stepY; bool _invertXHint; bool _invertYHint; int _numNew; // number of new samples bool _editable : 1; bool _saveable : 1; double _minNoSpike; double _maxNoSpike; // labels for this matrix LabelInfo _xLabelInfo; LabelInfo _yLabelInfo; LabelInfo _titleInfo; void createScalars(ObjectStore *store); void renameScalars(); void updateScalars(); // the flat-packed array in row-major order double *_z; int _zSize; // internally keep track of real _z size // for resizing the internal array _z only virtual bool resizeZ(int sz, bool reinit = true); // returns -1 if (x,y) is out of bounds int zIndex(int x, int y) const; ObjectMap _scalars; ObjectMap _vectors; ObjectMap _strings; }; typedef ObjectList MatrixList; typedef ObjectMap MatrixMap; } Q_DECLARE_METATYPE(Kst::Matrix*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/plotiteminterface.h0000644000175000017500000000270012277111530017322 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef PLOTITEMINTERFACE_H #define PLOTITEMINTERFACE_H #include #include #include "kst_export.h" namespace Kst { class KSTCORE_EXPORT PlotItemInterface { public: static const qint64 Forced = -1; PlotItemInterface(); virtual ~PlotItemInterface(); virtual QString plotName() const = 0; virtual QString plotCleanedName() const = 0; virtual bool handleChangedInputs(qint64 serial) = 0; void registerChange() {_serialOfLastChange = Forced;} protected: qint64 _serialOfLastChange; }; } Q_DECLARE_METATYPE(Kst::PlotItemInterface*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/matrixfactory.h0000644000175000017500000000310112277111530016474 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef MATRIXFACTORY_H #define MATRIXFACTORY_H #include "primitivefactory.h" namespace Kst { class GeneratedMatrixFactory : public PrimitiveFactory { public: GeneratedMatrixFactory(); ~GeneratedMatrixFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class EditableMatrixFactory : public PrimitiveFactory { public: EditableMatrixFactory(); ~EditableMatrixFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; class DataMatrixFactory : public PrimitiveFactory { public: DataMatrixFactory(); ~DataMatrixFactory(); PrimitivePtr generatePrimitive(ObjectStore *store, QXmlStreamReader& stream); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/coredocument.h0000644000175000017500000000336012277111530016276 0ustar synthsynth/*************************************************************************** coredocument.h ------------------- begin : October 3, 2007 copyright : (C) 2007 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef COREDOCUMENT_H #define COREDOCUMENT_H #include #include #include "kst_export.h" namespace Kst { class ObjectStore; class KSTCORE_EXPORT CoreDocument { public: CoreDocument(); virtual ~CoreDocument(); virtual QString fileName() const; virtual ObjectStore *objectStore() const; virtual bool open(const QString& file); virtual bool save(const QString& to = QString()); virtual bool isChanged() const; virtual void setChanged(bool changed); virtual bool isOpen() const; virtual QString lastError() const; private: ObjectStore *_objectStore; bool _dirty; bool _isOpen; QString _fileName; QString _lastError; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/logevents.h0000644000175000017500000000267612277111530015626 0ustar synthsynth/*************************************************************************** logevents.h ---------------- begin : Apr 01 2005 copyright : (C) 2005 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LOGEVENTS_H #define LOGEVENTS_H #include "debug.h" #include "events.h" //Added by qt3to4: #include namespace Kst { class LogEvent : public QEvent { public: enum LogEventType { Unknown = 0, LogAdded, LogCleared }; LogEvent(LogEventType et) : QEvent(QEvent::Type(EventTypeLog)), _eventType(et) {} virtual ~LogEvent() {} LogEventType _eventType; Debug::LogMessage _msg; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/datastring.cpp0000644000175000017500000001143612320547027016310 0ustar synthsynth/*************************************************************************** dataststring.cpp - a string from a data source ------------------- begin : September, 2008 copyright : (C) 2008 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datastring.h" #include "stringscriptinterface.h" #include #include #include #include "debug.h" #include "objectstore.h" namespace Kst { const QString DataString::staticTypeString = "Data String"; const QString DataString::staticTypeTag = "datastring"; /** Create a DataVector: raw data from a file */ DataString::DataString(ObjectStore *store) : String(store), DataPrimitive(this) { setOrphan(true); } DataString::~DataString() { } ScriptInterface* DataString::createScriptInterface() { return new StringDataSI(this); } QString DataString::_automaticDescriptiveName() const { QString name = _field; // un-escape escaped special characters so they aren't escaped 2x. name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]"); // now escape the special characters. name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); return name; } const QString& DataString::typeString() const { return staticTypeString; } /** return true if it has a valid file and field, or false otherwise */ bool DataString::isValid() const { if (dataSource()) { dataSource()->readLock(); bool rc = dataSource()->string().isValid(_field); dataSource()->unlock(); return rc; } return false; } bool DataString::checkValidity(const DataSourcePtr& ds) const { if (ds) { ds->readLock(); bool rc = ds->string().isValid(_field); ds->unlock(); return rc; } return false; } void DataString::change(DataSourcePtr in_file, const QString &in_field) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); _field = in_field; setDataSource(in_file); } void DataString::changeFile(DataSourcePtr in_file) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!in_file) { Debug::self()->log(tr("Data file for string %1 was not opened.").arg(Name()), Debug::Warning); } setDataSource(in_file); } /** Save data string information */ void DataString::save(QXmlStreamWriter &s) { if (dataSource()) { s.writeStartElement("datastring"); saveFilename(s); s.writeAttribute("field", _field); saveNameInfo(s, XNUM); s.writeEndElement(); } } /** Update a data String */ void DataString::internalUpdate() { if (dataSource()) { dataSource()->writeLock(); ReadInfo readInfo(&_value); dataSource()->string().read(_field, readInfo); dataSource()->unlock(); } } qint64 DataString::minInputSerial() const { if (dataSource()) { return (dataSource()->serial()); } return LLONG_MAX; } qint64 DataString::maxInputSerialOfLastChange() const { if (dataSource()) { return (dataSource()->serialOfLastChange()); } return NoInputs; } PrimitivePtr DataString::makeDuplicate() const { Q_ASSERT(store()); DataStringPtr string = store()->createObject(); string->writeLock(); string->change(dataSource(), _field); if (descriptiveNameIsManual()) { string->setDescriptiveName(descriptiveName()); } string->registerChange(); string->unlock(); return kst_cast(string); } QString DataString::descriptionTip() const { QString IDstring; IDstring = tr( "Data String: %1 = %4\n" " %2\n" " Field: %3" ).arg(Name()).arg(dataSource()->fileName()).arg(_field).arg(value()); return IDstring; } QString DataString::propertyString() const { return tr("%1 of %2").arg(_field).arg(dataSource()->fileName()); } void DataString::reload() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (dataSource()) { dataSource()->writeLock(); dataSource()->reset(); dataSource()->unlock(); reset(); registerChange(); } } void DataString::reset() { ReadInfo readInfo(&_value); dataSource()->string().read(_field, readInfo); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/editablematrix.h0000644000175000017500000000307512277111530016610 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * copyright : (C) 2005 University of British Columbia * * dscott@phas.ubc.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef EDITABLEMATRIX_H #define EDITABLEMATRIX_H #include "matrix.h" #include "kst_export.h" namespace Kst { class KSTCORE_EXPORT EditableMatrix : public Matrix { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; virtual void save(QXmlStreamWriter &xml); protected: EditableMatrix(ObjectStore *store); friend class ObjectStore; }; typedef SharedPtr EditableMatrixPtr; typedef ObjectList EditableMatrixList; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/vector.h0000644000175000017500000001515412362705136015123 0ustar synthsynth/*************************************************************************** vector.h - description ------------------- begin : Fri Sep 22 2000 copyright : (C) 2000 by cbn email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef VECTOR_H #define VECTOR_H #include #include #include "primitive.h" #include "scalar.h" #include "string_kst.h" #include "labelinfo.h" #include "kst_export.h" class QXmlStreamWriter; namespace Equation { class Node; } namespace Kst { class KstDataObject; // KST::interpolate is still too polluting KSTCORE_EXPORT double kstInterpolate(double *v, int _size, int in_i, int ns_i); KSTCORE_EXPORT double kstInterpolateNoHoles(double *v, int _size, int in_i, int ns_i); class Vector; typedef SharedPtr VectorPtr; /**A class for handling data vectors for kst. *@author cbn */ class KSTCORE_EXPORT Vector : public Primitive { Q_OBJECT public: virtual const QString& typeString() const; static const QString staticTypeString; static const QString staticTypeTag; protected: Vector(ObjectStore *store); virtual ~Vector(); friend class ObjectStore; virtual void _initializeShortName(); public: void change(QByteArray& data); void oldChange(QByteArray& data); inline int length() const { return _size; } /** Return V[i], interpolated/decimated to have ns_i total samples */ double interpolate(int i, int ns_i) const; /** Return V[i], interpolated/decimated to have ns_i total samples, without any holes */ double interpolateNoHoles(int i, int ns_i) const; /** Return V[i] uninterpolated */ double value(int i) const; /** Return Minimum value in Vector */ inline double min() const { return _min; } /** Return max value in Vector */ inline double max() const { return _max; } /** Return SpikeInsensitive max value in vector **/ inline double ns_max() const { return _ns_max; } /** Return SpikeInsensitive min value in vector **/ inline double ns_min() const { return _ns_min; } /** Return Mean value in Vector */ inline double mean() const { return _mean; } /** Return Least Positive value in Vector */ inline double minPos() const { return _minPos; } /** Number of new samples in the vector since last newSync */ inline int numNew() const { return NumNew; } /** Number of samples shifted since last newSync */ inline int numShift() const { return NumShifted; } inline bool isRising() const { return _is_rising; } /** reset New Samples and Shifted samples */ void newSync(); virtual bool resize(int sz, bool init = true); virtual void setNewAndShift(int inNew, int inShift); /** Clear out the vector by setting everything to 0.0 */ void zero(); /** Make the vector truly empty. All values set to NOPOINT (NaN). */ void blank(); /* Generally you don't need to call this */ void updateScalars(); /** return information for building a label for this vector */ virtual LabelInfo labelInfo() const; virtual LabelInfo titleInfo() const; virtual void setLabelInfo(const LabelInfo &label_info); virtual void setTitleInfo(const LabelInfo &label_info); virtual int getUsage() const; /** Save vector information */ virtual void save(QXmlStreamWriter &s); /** Return a pointer to the raw vector */ double *value() const; /** access functions for _isScalarList */ bool isScalarList() const { return _isScalarList; } bool saveable() const; bool editable() const; void setEditable(bool editable); bool saveData() const; virtual void setSaveData(bool save); virtual QString descriptionTip() const; virtual QString sizeString() const; virtual void internalUpdate(); // output primitives: statistics scalars, etc. ScalarMap scalars() const {return _scalars;} StringMap strings() const {return _strings;} virtual PrimitiveMap metas() const; virtual ObjectList outputPrimitives() const; virtual QString propertyString() const; // this is reimplemented but must not be virtual. QByteArray scriptInterface(QList&command); /** get an binary array with a number of doubles. */ QByteArray getBinaryArray() const; /** does the vector represent time? */ virtual bool isTime() const {return false;} virtual ScriptInterface* createScriptInterface(); protected: /** current number of samples */ int _size; /** number of valid points */ int _nsum; /** variables for SpikeInsensitiveAutoscale **/ double _ns_max; double _ns_min; /** Where the vector is held */ double *_v; /** number of samples shifted since last newSync */ int NumShifted; /** number of new samples since last newSync */ int NumNew; /** is the vector monotonically rising */ bool _is_rising : 1; /** if true then we have a scalar list and do not want to be able to use it in a curve, display statistics for it, etc. */ bool _isScalarList : 1; /** The user should not be permitted to edit the contents of the vector if this is false. */ bool _editable : 1; /** can/should the vector be saved */ bool _saveable : 1; /** should the vector data be saved? */ bool _saveData : 1; double _min, _max, _mean, _minPos; /** Scalar Maintenance methods */ void CreateScalars(ObjectStore *store); virtual void deleteDependents(); LabelInfo _labelInfo; LabelInfo _titleInfo; friend class DataObject; friend class Matrix; virtual double* realloced(double *memptr, int newSize); virtual void setV(double *memptr, int newSize); ObjectMap _scalars; ObjectMap _strings; }; typedef ObjectList VectorList; typedef ObjectMap VectorMap; } Q_DECLARE_METATYPE(Kst::Vector*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/rwlock.cpp0000644000175000017500000001372012277111530015444 0ustar synthsynth/*************************************************************************** rwlock.cpp ------------------- begin : Feb 21, 2004 copyright : (C) 2004 The University of toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "rwlock.h" #include //#define LOCKTRACE #ifdef ONE_LOCK_TO_RULE_THEM_ALL QMutex KstRWLock::_mutex(true); #endif KstRWLock::KstRWLock() : _readCount(0), _writeCount(0), _waitingReaders(0), _waitingWriters(0) { } KstRWLock::~KstRWLock() { } void KstRWLock::readLock() const { #ifndef ONE_LOCK_TO_RULE_THEM_ALL QMutexLocker lock(&_mutex); #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::readLock() by tid=" << (int)QThread::currentThreadId() << endl; // qDebug() << kstdBacktrace(6) << endl; #endif Qt::HANDLE me = QThread::currentThreadId(); if (_writeCount > 0 && _writeLocker == me) { // thread already has a write lock #ifdef LOCKTRACE qDebug() << "Thread " << (int)QThread::currentThreadId() << " has a write lock on KstRWLock " << (void*)this << ", getting a read lock" << endl; #endif } else { QMap::Iterator it = _readLockers.find(me); if (it != _readLockers.end() && it.value() > 0) { // thread already has another read lock } else { while (_writeCount > 0 || _waitingWriters) { // writer priority otherwise ++_waitingReaders; _readerWait.wait(&_mutex); --_waitingReaders; } } } _readLockers[me] = _readLockers[me] + 1; ++_readCount; #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::readLock() done by tid=" << (int)QThread::currentThread() << endl; #endif #else _mutex.lock(); #endif } void KstRWLock::writeLock() const { #ifndef ONE_LOCK_TO_RULE_THEM_ALL QMutexLocker lock(&_mutex); #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::writeLock() by tid=" << (int)QThread::currentThreadId() << endl; // qDebug() << kstdBacktrace(6) << endl; #endif Qt::HANDLE me = QThread::currentThreadId(); if (_readCount > 0) { QMap::Iterator it = _readLockers.find(me); if (it != _readLockers.end() && it.value() > 0) { // cannot acquire a write lock if I already have a read lock -- ERROR qDebug() << "Thread " << QThread::currentThread() << " tried to write lock KstRWLock " << (void*)this << " while holding a read lock" << endl; return; } } while (_readCount > 0 || (_writeCount > 0 && _writeLocker != me)) { ++_waitingWriters; _writerWait.wait(&_mutex); --_waitingWriters; } _writeLocker = me; ++_writeCount; #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::writeLock() done by tid=" << (int)QThread::currentThread() << endl; #endif #else _mutex.lock(); #endif } void KstRWLock::unlock() const { #ifndef ONE_LOCK_TO_RULE_THEM_ALL QMutexLocker lock(&_mutex); #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::unlock() by tid=" << (int)QThread::currentThreadId() << endl; #endif Qt::HANDLE me = QThread::currentThreadId(); if (_readCount > 0) { QMap::Iterator it = _readLockers.find(me); if (it == _readLockers.end()) { // read locked but not by me -- ERROR qDebug() << "Thread " << QThread::currentThread() << " tried to unlock KstRWLock " << (void*)this << " (read locked) without holding the lock" << endl; return; } else { --_readCount; if (it.value() == 1) { _readLockers.remove(it.key()); } else { --(it.value()); } } } else if (_writeCount > 0) { if (_writeLocker != me) { // write locked but not by me -- ERROR qDebug() << "Thread " << QThread::currentThread() << " tried to unlock KstRWLock " << (void*)this << " (write locked) without holding the lock" << endl; return; } else { --_writeCount; } } else if (_readCount == 0 && _writeCount == 0) { // not locked -- ERROR qDebug() << "Thread " << QThread::currentThread() << " tried to unlock KstRWLock " << (void*)this << " (unlocked) without holding the lock" << endl; return; } if (_readCount == 0 && _writeCount == 0) { // no locks remaining if (_waitingWriters) { _writerWait.wakeOne(); } else if (_waitingReaders) { _readerWait.wakeAll(); } } #ifdef LOCKTRACE qDebug() << (void*)this << " KstRWLock::unlock() done by tid=" << (int)QThread::currentThread() << endl; #endif #else _mutex.unlock(); #endif } KstRWLock::LockStatus KstRWLock::lockStatus() const { #ifndef ONE_LOCK_TO_RULE_THEM_ALL QMutexLocker lock(&_mutex); if (_writeCount > 0) { return WRITELOCKED; } else if (_readCount > 0) { return READLOCKED; } else { return UNLOCKED; } #else #error lockStatus() not supported using the single lock return UNLOCKED; #endif } KstRWLock::LockStatus KstRWLock::myLockStatus() const { #ifndef ONE_LOCK_TO_RULE_THEM_ALL QMutexLocker lock(&_mutex); Qt::HANDLE me = QThread::currentThreadId(); if (_writeCount > 0 && _writeLocker == me) { return WRITELOCKED; } else if (_readCount > 0 && _readLockers.find(me) != _readLockers.end()) { return READLOCKED; } else { return UNLOCKED; } #else #error myLockStatus() not supported using the single lock return UNLOCKED; #endif } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/objectmap.h0000644000175000017500000000317712277111530015561 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef OBJECTMAP_H #define OBJECTMAP_H #include #include #include "sharedptr.h" namespace Kst { template class ObjectMap : public QHash > { public: typedef QHash > HashMap; typename HashMap::iterator insert(const QString& key, const SharedPtr& value) { addKey(key); return HashMap::insert(key, value); } SharedPtr& operator[](const QString& key) { addKey(key); return HashMap::operator[](key); } const SharedPtr operator[](const QString& key) const { addKey(key); return HashMap::operator[](key); } void addKey(const QString& key) const { if (!ordered.contains(key)) { ordered << key; } } mutable QStringList ordered; }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/ksttimezone.h0000644000175000017500000000254612277111530016170 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 C. Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef KSTTIMEZONE_H #define KSTTIMEZONE_H #include "kst_export.h" #include #include namespace Kst { class KSTCORE_EXPORT KstTimeZone { public: explicit KstTimeZone(QString name = "GMT"); int gmtOffset(time_t t); bool setTZ(QString name); QString tzName() const {return _tzName;} static QStringList tzList(); static bool recognised(QString name); private: static void initTZList(); bool _supportsDST; int _gmtOffset; QString _tzName; }; } #endif // KSTTIMEZONE_H Kst-2.0.8/src/libkst/coredocument.cpp0000644000175000017500000000367312277111530016640 0ustar synthsynth/*************************************************************************** coredocument.cpp ------------------- begin : October 3, 2007 copyright : (C) 2007 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "coredocument.h" #include #include #include #include "objectstore.h" namespace Kst { CoreDocument::CoreDocument() : _objectStore(new ObjectStore()), _dirty(false), _isOpen(false) { _fileName.clear(); } CoreDocument::~CoreDocument() { delete _objectStore; _objectStore = 0; } QString CoreDocument::fileName() const { return _fileName; } ObjectStore* CoreDocument::objectStore() const { return _objectStore; } bool CoreDocument::save(const QString& to) { Q_UNUSED(to); return true; } bool CoreDocument::open(const QString& file) { Q_UNUSED(file); _isOpen = false; return _isOpen = true; } QString CoreDocument::lastError() const { return _lastError; } bool CoreDocument::isChanged() const { return _dirty; } bool CoreDocument::isOpen() const { return _isOpen; } void CoreDocument::setChanged(bool dirty) { _dirty = dirty; } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkst/labelinfo.cpp0000644000175000017500000000373112277111530016077 0ustar synthsynth/* Keeps track of information relevant to label creation. Copyright (C) 2011 Barth Netterfield netterfield@astro.utoronto.ca This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "labelinfo.h" namespace Kst { QString LabelInfo::singleRenderItemLabel() const { if (units.isEmpty() && quantity.isEmpty()) { // Nxx xxx return name; } else if (quantity.isEmpty()) { if (!name.isEmpty()) { return QString("%1 \\[%2\\]").arg(name).arg(units); // NxU } else { return units; // xxU } } else if (units.isEmpty()) { if (name.isEmpty()) { return quantity; // xQx } else { if (name.toLower().contains(quantity.toLower())) { return name; // NQx A } else { return QString("%1: %2").arg(name).arg(quantity); // NQx B } } } else if (name.isEmpty()) { return QString("%1 \\[%2\\]").arg(quantity).arg(units); // xQU } else { return QString("%1 \\[%2\\]").arg(quantity).arg(units); // NQU B } } QString LabelInfo::escapedFile() { QString escaped_file = file; escaped_file.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); return escaped_file; } } Kst-2.0.8/src/libkst/object.h0000644000175000017500000000602212320547027015056 0ustar synthsynth/*************************************************************************** object.h: abstract base class for all Kst objects ------------------- begin : May 22, 2003 copyright : (C) 2003 The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef OBJECT_H #define OBJECT_H #include #include #include #include #include #include #include #include #include "namedobject.h" #include "kst_export.h" #include "sharedptr.h" #include "rwlock.h" namespace Kst { class ObjectStore; class Object; class ScriptInterface; typedef SharedPtr ObjectPtr; class KSTCORE_EXPORT Object : public QObject, public Shared, public KstRWLock, public NamedObject { Q_OBJECT public: static QString type(); static const qint64 Forced = -1; static const qint64 NoInputs = -2; enum UpdateType { NoChange = 0, Updated, Deferred }; virtual UpdateType objectUpdate(qint64 newSerial); virtual void registerChange() {_serial = Forced; emit dirty();} virtual void reset(); qint64 serial() const {return _serial;} qint64 serialOfLastChange() const {return _serialOfLastChange;} virtual const QString& typeString() const; static const QString staticTypeString; ObjectStore *store() const; // Returns count - 2 to account for "this" and the list pointer, therefore // you MUST have a reference-counted pointer to call this function virtual int getUsage() const; virtual void deleteDependents(); virtual void internalUpdate() = 0; virtual bool used() const {return _used;} virtual void setUsed(bool used_in) {_used = used_in;} virtual bool uses(ObjectPtr p) const; virtual ScriptInterface* createScriptInterface(); ScriptInterface *scriptInterface(); protected: Object(); virtual ~Object(); friend class ObjectStore; ObjectStore *_store; // set by ObjectStore virtual qint64 minInputSerial() const = 0; virtual qint64 maxInputSerialOfLastChange() const = 0; qint64 _serial; qint64 _serialOfLastChange; bool _used; private: ScriptInterface *_interface; signals: void dirty(); }; } Q_DECLARE_METATYPE(Kst::Object*) #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/0000755000175000017500000000000012362705136014143 5ustar synthsynthKst-2.0.8/src/libkstapp/viewprimitivedialog.ui0000644000175000017500000000355412277111530020566 0ustar synthsynth ViewPrimitiveDialog 0 0 595 534 Primitive View Update Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() ViewPrimitiveDialog accept() 248 254 157 274 buttonBox rejected() ViewPrimitiveDialog reject() 316 260 286 274 Kst-2.0.8/src/libkstapp/formatgridhelper.cpp0000644000175000017500000002325412277111530020205 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2011 C. Barth Netterfield * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "formatgridhelper.h" #include "viewitem.h" #include namespace Kst { /*****************************************************************************/ /************** local helper functions for auto layout ***********************/ void appendEdge(QList &edges, double pos, double size, ViewItem *item) { struct AutoFormatEdges edge; edge.edge_number = -1; edge.item = item; edge.edge = pos; // left edge edge.left_or_top = true; edges.append(edge); edge.edge = pos+size; // right edge edge.left_or_top = false; edges.append(edge); } /*****************************************************************************/ /************** local helper functions for auto layout ***********************/ bool findNextEdgeLocation(QList &edges, QList &locations, qreal grid_resolution) { int n_edges = edges.size(); int i_best_edge = -1; int this_edge_count = 0; int best_edge_count = 0; for (int i_edge = 0; i_edge= edges.at(i_edge).edge - 0.0001) && (edges.at(j_edge).edge <= edges.at(i_edge).edge+grid_resolution)) { this_edge_count++; } } } if (this_edge_count > best_edge_count) { i_best_edge = i_edge; best_edge_count = this_edge_count; } } } // now i_best_edge holds the index of the edge with the most other edges // 'close' to it (ie, between edge and edge + grid_resolution) if (i_best_edge >= 0 ) { int edge_location = locations.size(); qreal sum_edge = 0.0; // to get the mean of this edge int n_this_edge = 0; // Set edge_number of all of the edges which are in this area qreal best_edge = edges.at(i_best_edge).edge; for (int i_edge = 0; i_edge < n_edges; i_edge++) { if (edges.at(i_edge).edge_number == -1) { if ((edges.at(i_edge).edge >= best_edge - 0.0001) && (edges.at(i_edge).edge <= best_edge+grid_resolution)) { edges[i_edge].edge_number = edge_location; sum_edge += edges.at(i_edge).edge; ++n_this_edge; } } } best_edge = sum_edge/qreal(n_this_edge); if (n_this_edge != best_edge_count) { qWarning() << "edge counting error in findNextEdgeLocation()"; } locations.append(best_edge); return true; } else { return false; } } /*****************************************************************************/ /************** local helper functions for auto layout ***********************/ void convertEdgeLocationsToGrid(const QList &locations, QList &grid_locations) { QList sorted_locations(locations); qSort(sorted_locations); int n_loc = locations.size(); for (int i_unsorted = 0; i_unsorted &viewItems, bool protectLayout) { const double min_size_limit = 0.02; double min_height = 100000.0; double min_width = 100000.0; n_rows = 0; n_cols = 0; // Find the smallest plots, to determine the grid resolution int n_view = viewItems.size(); for (int i_view = 0; i_viewrelativeWidth()relativeWidth()>min_size_limit)) { min_width = item->relativeWidth(); } if ((item->relativeHeight()relativeHeight()>min_size_limit)) { min_height = item->relativeHeight(); } } double grid_x_tolerance = min_width*0.3; double grid_y_tolerance = min_height*0.3; // Find all the edges QList x_edges; QList y_edges; for (int i_view = 0; i_viewrelativeCenter().x() - 0.5*item->relativeWidth(), item->relativeWidth(), item); appendEdge(y_edges, item->relativeCenter().y() - 0.5*item->relativeHeight(), item->relativeHeight(), item); } // find edge concentrations QList x_edge_locations; QList y_edge_locations; while (findNextEdgeLocation(x_edges, x_edge_locations, grid_x_tolerance)) { } while (findNextEdgeLocation(y_edges, y_edge_locations, grid_y_tolerance)) { } QList x_edge_grid; QList y_edge_grid; convertEdgeLocationsToGrid(x_edge_locations, x_edge_grid); convertEdgeLocationsToGrid(y_edge_locations, y_edge_grid); // x_edges: list of edges, each of which points to a x_edge_location and to a view item // x_edge_location: a list of where the edge concentrations are. // x_edge_grid: a list of grid indicies; same order as x_edge_location foreach (ViewItem *v, viewItems) { int left_gpos = 0; int right_gpos = 1; int top_gpos = 0; int bottom_gpos = 1; struct AutoFormatRC rc; foreach (const AutoFormatEdges &edge, x_edges) { if (edge.item == v) { if (edge.left_or_top) { left_gpos = x_edge_grid.at(edge.edge_number); } else { right_gpos = x_edge_grid.at(edge.edge_number); } } } foreach (const AutoFormatEdges &edge, y_edges) { if (edge.item == v) { if (edge.left_or_top) { top_gpos = y_edge_grid.at(edge.edge_number); } else { bottom_gpos = y_edge_grid.at(edge.edge_number); } } } rc.row = top_gpos; rc.col = left_gpos; rc.row_span = bottom_gpos - top_gpos; rc.col_span = right_gpos - left_gpos; rcList.append(rc); n_rows = qMax(rc.row + rc.row_span, n_rows); n_cols = qMax(rc.col + rc.col_span, n_cols); } a.resize(n_rows); for (int i_row = 0; i_row overlapedEntryIndices; int n_rc = rcList.length(); for (int i_rc = 0; i_rc < n_rc; i_rc++) { //foreach (const struct AutoFormatRC &rc, rcList) { for (int i_row = rcList.at(i_rc).row; i_row0) { overlapedEntryIndices.append(i_rc); } a[i_row][i_col]++; } } } if (!protectLayout) { // remove overlaps and delete empty rows // move overlaps if (overlapedEntryIndices.length()>0) { foreach (const int &i_ol, overlapedEntryIndices) { int row, col; getHole(row,col); rcList[i_ol].row = row; rcList[i_ol].col = col; } } // remove empty rows condense(); } } int FormatGridHelper::numHoles() { int n_holes = 0; for (int i_row = 0; i_row0) { row_used = true; } } if (!row_used) { a.remove(i_row); int n_rc = rcList.length(); for (int i_rc=0; i_rc < n_rc; i_rc++) { if (rcList[i_rc].row > i_row) { rcList[i_rc].row--; } } i_row--; n_rows--; } } // delete empty columns for (int i_col = 0; i_col < n_cols; i_col++) { bool col_used = false; for (int i_row = 0; i_row < n_rows; i_row++) { if (a[i_row][i_col]>0) { col_used = true; } } if (!col_used) { for (int j_row = 0; j_row i_col) { rcList[i_rc].col--; } } i_col--; n_cols--; } } } } Kst-2.0.8/src/libkstapp/debugdialog.ui0000644000175000017500000001540512320547027016752 0ustar synthsynth DebugDialog 0 0 666 422 Kst Debug Dialog 1 Build Information 0 6 Qt::RichText false Qt::Vertical QSizePolicy::Expanding 530 250 &Email Debugging Information Qt::Horizontal QSizePolicy::Expanding 301 21 Log Log level: &Error true &Warning true &Notice true true &Trace false Qt::Horizontal 221 20 Clea&r Data Sources 0 6 true Plugin Loaded Instance Qt::Horizontal QSizePolicy::Expanding 421 20 &Close _email _close _close clicked() DebugDialog close() 20 20 20 20 Kst-2.0.8/src/libkstapp/stroketab.h0000644000175000017500000000361612277111530016312 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef STROKETAB_H #define STROKETAB_H #include "dialogtab.h" #include "ui_stroketab.h" #include "kst_export.h" #include namespace Kst { class StrokeTab : public DialogTab, Ui::StrokeTab { Q_OBJECT public: explicit StrokeTab(QWidget *parent = 0); virtual ~StrokeTab(); void initialize(QPen *p); QPen pen(QPen pen = QPen()) const; Qt::PenStyle style() const; bool styleDirty() const; void setStyle(Qt::PenStyle style); qreal width() const; bool widthDirty() const; void setWidth(qreal width); QColor brushColor() const; bool brushColorDirty() const; void setBrushColor(const QColor &color); Qt::BrushStyle brushStyle() const; bool brushStyleDirty() const; void setBrushStyle(Qt::BrushStyle style); Qt::PenJoinStyle joinStyle() const; bool joinStyleDirty() const; void setJoinStyle(Qt::PenJoinStyle style); Qt::PenCapStyle capStyle() const; bool capStyleDirty() const; void setCapStyle(Qt::PenCapStyle style); void clearTabValues(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/labelrenderer.h0000644000175000017500000001002712277111530017114 0ustar synthsynth/*************************************************************************** labelrenderer.h ------------------ begin : Jun 17 2005 copyright : (C) 2005 by The University of Toronto email : netterfield@astro.utoronto.ca ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef LABELRENDERER_H #define LABELRENDERER_H #include #include #include #include #include #ifndef KST_NO_PRINTER #include #endif #include "vector.h" #include "scalar.h" #include "string.h" #include "kst_export.h" namespace Label { struct RenderedText { QPointF location; QString text; QFont font; QPen pen; }; // inline for speed. class RenderContext : public QObject { Q_OBJECT public: RenderContext(const QFont& font, QPainter *p) : QObject(), p(p), _fm(_font) { x = y = xMax = xStart = 0; precision = 8; setFont(font); lines = 0; } inline void addToCache(QPointF location, QString &text, QFont &font, QPen &pen) { RenderedText cacheEntry; cacheEntry.location = location; cacheEntry.text = text; cacheEntry.font = font; cacheEntry.pen = pen; cachedText.append(cacheEntry); } inline const QFont& font() const { if (p) { return p->font(); } else { return _font; } } inline void setFont(const QFont& f_in) { QFont f = f_in; _fontSize = f.pointSize(); if (p) { p->setFont(f); _ascent = p->fontMetrics().ascent(); _descent = p->fontMetrics().descent(); _height = p->fontMetrics().height(); _lineSpacing = p->fontMetrics().lineSpacing(); } else { _font = f; _fm = QFontMetrics(_font); _ascent = _fm.ascent(); _lineSpacing = _fm.lineSpacing(); _descent = _fm.descent(); _height = _fm.height(); } } inline void addObject(Kst::VectorPtr vp) { _refObjects.append(vp); connect(vp.data(), SIGNAL(dirty()), this, SIGNAL(labelDirty())); } inline void addObject(Kst::ScalarPtr scalar) { _refObjects.append(scalar); connect(scalar.data(), SIGNAL(dirty()), this, SIGNAL(labelDirty())); } inline void addObject(Kst::StringPtr string) { _refObjects.append(string); connect(string.data(), SIGNAL(dirty()), this, SIGNAL(labelDirty())); } inline int fontSize() const { return _fontSize; } inline int fontAscent() const { return _ascent; } inline int lineSpacing() const { return _lineSpacing; } inline int fontDescent() const { return _descent; } inline int fontHeight() const { return _height; } inline int fontWidth(const QString& txt) const { if (p) { return p->fontMetrics().width(txt); } else { return _fm.width(txt); } } int x, y; // Coordinates we're rendering at int xMax, xStart; QString fontName; int size; QPainter *p; int precision; QList _refObjects; QPen pen; int lines; QVector cachedText; Q_SIGNALS: void labelDirty(); private: QFont _font; QFontMetrics _fm; int _ascent, _descent, _height, _lineSpacing; // caches to avoid performance problem with QFont* int _fontSize; }; struct Chunk; void renderLabel(RenderContext& rc, Chunk *fi, bool cache, bool draw); void paintLabel(RenderContext& rc, QPainter *p); } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/plotitemdialog.cpp0000644000175000017500000011531112362701575017671 0ustar synthsynth/*******************F******************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "plotitemdialog.h" #include "contenttab.h" #include "axistab.h" #include "rangetab.h" #include "markerstab.h" #include "labeltab.h" #include "overridelabeltab.h" #include "dialogpage.h" #include "application.h" #include "objectstore.h" #include "mainwindow.h" #include "document.h" #include "curve.h" #include "curvedialog.h" #include "plotrenderitem.h" #include "plotitem.h" #include "image.h" #include "imagedialog.h" #include "dimensionstab.h" #include "filltab.h" #include "stroketab.h" #include "math_kst.h" #include "updateserver.h" namespace Kst { PlotItemDialog::PlotItemDialog(PlotItem *item, QWidget *parent) : ViewItemDialog(item, parent), _plotItem(item), _defaultTagString("") { Q_ASSERT(_plotItem); _store = kstApp->mainWindow()->document()->objectStore(); setWindowTitle(tr("Edit Plot Item")); _contentTab = new ContentTab(this, _store); connect(_contentTab, SIGNAL(apply()), this, SLOT(contentChanged())); DialogPage *contentsPage = new DialogPage(this); contentsPage->setPageTitle(tr("Contents")); contentsPage->addDialogTab(_contentTab); addDialogPage(contentsPage, true); _labelTab = new LabelTab(_plotItem, this); _topLabelTab = new OverrideLabelTab(tr("Top Font"), this); _bottomLabelTab = new OverrideLabelTab(tr("Bottom Font"), this); _leftLabelTab = new OverrideLabelTab(tr("Left Font"), this); _rightLabelTab = new OverrideLabelTab(tr("Right Font"), this); _axisLabelTab = new OverrideLabelTab(tr("Axis Font"), this); _labelPage = new DialogPageTab(this); _labelPage->setPageTitle(tr("Labels")); _labelPage->addDialogTab(_labelTab); _labelPage->addDialogTab(_topLabelTab); _labelPage->addDialogTab(_bottomLabelTab); _labelPage->addDialogTab(_leftLabelTab); _labelPage->addDialogTab(_rightLabelTab); _labelPage->addDialogTab(_axisLabelTab); addDialogPage(_labelPage, true); connect(_labelTab, SIGNAL(apply()), this, SLOT(labelsChanged())); connect(_labelTab, SIGNAL(globalFontUpdate()), this, SLOT(globalFontUpdate())); connect(_topLabelTab, SIGNAL(useDefaultChanged(bool)), this, SLOT(useTopDefaultChanged(bool))); connect(_bottomLabelTab, SIGNAL(useDefaultChanged(bool)), this, SLOT(useBottomDefaultChanged(bool))); connect(_leftLabelTab, SIGNAL(useDefaultChanged(bool)), this, SLOT(useLeftDefaultChanged(bool))); connect(_rightLabelTab, SIGNAL(useDefaultChanged(bool)), this, SLOT(useRightDefaultChanged(bool))); connect(_axisLabelTab, SIGNAL(useDefaultChanged(bool)), this, SLOT(useAxisDefaultChanged(bool))); connect(UpdateServer::self(), SIGNAL(objectListsChanged()), this, SLOT(setupContent())); _rangeTab = new RangeTab(_plotItem, this); DialogPage *rangePage = new DialogPage(this); rangePage->setPageTitle(tr("Range/Zoom")); rangePage->addDialogTab(_rangeTab); addDialogPage(rangePage, true); connect(_rangeTab, SIGNAL(apply()), this, SLOT(rangeChanged())); _xAxisTab = new AxisTab(this); _xAxisPage = new DialogPage(this); _xAxisPage->setPageTitle(tr("X-Axis")); _xAxisPage->addDialogTab(_xAxisTab); addDialogPage(_xAxisPage, true); connect(_xAxisTab, SIGNAL(apply()), this, SLOT(xAxisChanged())); _yAxisTab = new AxisTab(this); _yAxisTab->setAsYAxis(); _yAxisPage = new DialogPage(this); _yAxisPage->setPageTitle(tr("Y-Axis")); _yAxisPage->addDialogTab(_yAxisTab); addDialogPage(_yAxisPage, true); connect(_yAxisTab, SIGNAL(apply()), this, SLOT(yAxisChanged())); _xMarkersTab = new MarkersTab(this); DialogPage *xMarkersPage = new DialogPage(this); xMarkersPage->setPageTitle(tr("X-Axis Markers")); xMarkersPage->addDialogTab(_xMarkersTab); addDialogPage(xMarkersPage, true); _xMarkersTab->setObjectStore(_store); connect(_xMarkersTab, SIGNAL(apply()), this, SLOT(xAxisPlotMarkersChanged())); _yMarkersTab = new MarkersTab(this); DialogPage *yMarkersPage = new DialogPage(this); yMarkersPage->setPageTitle(tr("Y-Axis Markers")); yMarkersPage->addDialogTab(_yMarkersTab); addDialogPage(yMarkersPage, true); _yMarkersTab->setObjectStore(_store); connect(yMarkersPage, SIGNAL(apply()), this, SLOT(yAxisPlotMarkersChanged())); // addRelations(); This tends to clutter the plot dialog, let's test skipping it setupContent(); setupAxis(); setupRange(); setupLabels(); setupMarkers(); setSupportsMultipleEdit(true); if (_plotItem->descriptiveNameIsManual()) { setTagString(_plotItem->descriptiveName()); } else { setTagString(_defaultTagString); } QList list = ViewItem::getItems(); clearMultipleEditOptions(); foreach(PlotItem* plot, list) { addMultipleEditOption(plot->plotName(), plot->descriptionTip(), plot->shortName()); } QList > moveItems; moveItems << _listWidget->findItems("Appearance", Qt::MatchFixedString); moveItems << _listWidget->findItems("Size/Position", Qt::MatchFixedString); foreach(const QList& found, moveItems) { if (found.size() > 0) { _listWidget->addItem(_listWidget->takeItem(_listWidget->row(found.first()))); } } selectDialogPage(contentsPage); _saveAsDefault->show(); if (item->isInSharedAxisBox()) { _dimensionsTab->setEnabled(false); } connect(this, SIGNAL(editMultipleMode()), this, SLOT(editMultiple())); connect(this, SIGNAL(editSingleMode()), this, SLOT(editSingle())); connect(this, SIGNAL(apply()), this, SLOT(slotApply())); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // Make sure the labels are visible, doesn't work right now :-) } PlotItemDialog::~PlotItemDialog() { } void PlotItemDialog::editMultiple() { _xAxisTab->clearTabValues(); _yAxisTab->clearTabValues(); _rangeTab->clearTabValues(); _labelTab->clearTabValues(); _labelTab->enableSingleEditOptions(false); _topLabelTab->clearTabValues(); _bottomLabelTab->clearTabValues(); _leftLabelTab->clearTabValues(); _rightLabelTab->clearTabValues(); _axisLabelTab->clearTabValues(); _xMarkersTab->clearTabValues(); _yMarkersTab->clearTabValues(); _contentTab->setEnabled(false); //foreach(DialogPage* page, _relationPages) { // removeDialogPage(page); //} //_relationPages.clear(); } void PlotItemDialog::editSingle() { _contentTab->setEnabled(true); //updateRelations(); setupContent(); setupAxis(); setupRange(); setupLabels(); setupMarkers(); setAlwaysAllowApply(false); } void PlotItemDialog::slotApply() { if (editMode() == Single) { _plotItem->setDescriptiveName(tagString().remove(_defaultTagString)); } //FIXME: it is not clear that slotApply must be executed last. // experimentally, it seems to be... if (_saveAsDefault->isChecked()) { _plotItem->saveAsDialogDefaults(); } } void PlotItemDialog::setupLabels() { Q_ASSERT(_plotItem); _labelTab->enableSingleEditOptions(true); _labelTab->setLeftLabel(_plotItem->leftLabel()); _labelTab->setBottomLabel(_plotItem->bottomLabel()); _labelTab->setTopLabel(_plotItem->topLabel()); _labelTab->setRightLabel(_plotItem->rightLabel()); _labelTab->setAutoScaleNumbers(_plotItem->isUseAxisScale()); _labelTab->setLeftLabelAuto(_plotItem->leftLabelDetails()->isAuto()); _labelTab->setBottomLabelAuto(_plotItem->bottomLabelDetails()->isAuto()); _labelTab->setTopLabelAuto(_plotItem->topLabelDetails()->isAuto()); _labelTab->setRightLabelAuto(_plotItem->rightLabelDetails()->isAuto()); _labelTab->setShowLegend(_plotItem->showLegend()); _topLabelTab->enableSingleEditOptions(true); _topLabelTab->setUseDefault(_plotItem->topLabelDetails()->fontUseGlobal()); _topLabelTab->setLabelFont(_plotItem->topLabelDetails()->font()); _topLabelTab->setLabelFontScale(_plotItem->topLabelDetails()->fontScale()); _topLabelTab->setLabelColor(_plotItem->topLabelDetails()->fontColor()); _bottomLabelTab->enableSingleEditOptions(true); _bottomLabelTab->setUseDefault(_plotItem->bottomLabelDetails()->fontUseGlobal()); _bottomLabelTab->setLabelFont(_plotItem->bottomLabelDetails()->font()); _bottomLabelTab->setLabelFontScale(_plotItem->bottomLabelDetails()->fontScale()); _bottomLabelTab->setLabelColor(_plotItem->bottomLabelDetails()->fontColor()); _leftLabelTab->enableSingleEditOptions(true); _leftLabelTab->setUseDefault(_plotItem->leftLabelDetails()->fontUseGlobal()); _leftLabelTab->setLabelFont(_plotItem->leftLabelDetails()->font()); _leftLabelTab->setLabelFontScale(_plotItem->leftLabelDetails()->fontScale()); _leftLabelTab->setLabelColor(_plotItem->leftLabelDetails()->fontColor()); _rightLabelTab->enableSingleEditOptions(true); _rightLabelTab->setUseDefault(_plotItem->rightLabelDetails()->fontUseGlobal()); _rightLabelTab->setLabelFont(_plotItem->rightLabelDetails()->font()); _rightLabelTab->setLabelFontScale(_plotItem->rightLabelDetails()->fontScale()); _rightLabelTab->setLabelColor(_plotItem->rightLabelDetails()->fontColor()); _axisLabelTab->enableSingleEditOptions(true); _axisLabelTab->setUseDefault(_plotItem->numberLabelDetails()->fontUseGlobal()); _axisLabelTab->setLabelFont(_plotItem->numberLabelDetails()->font()); _axisLabelTab->setLabelFontScale(_plotItem->numberLabelDetails()->fontScale()); _axisLabelTab->setLabelColor(_plotItem->numberLabelDetails()->fontColor()); } void PlotItemDialog::setupRange() { _rangeTab->setupRange(); } void PlotItemDialog::setupAxis() { Q_ASSERT(_plotItem); _xAxisTab->enableSingleEditOptions(true); _xAxisTab->setAxisMajorTickSpacing(_plotItem->xAxis()->axisMajorTickMode()); _xAxisTab->setDrawAxisMajorTicks(_plotItem->xAxis()->drawAxisMajorTicks()); _xAxisTab->setDrawAxisMajorGridLines(_plotItem->xAxis()->drawAxisMajorGridLines()); _xAxisTab->setDrawAxisMinorTicks(_plotItem->xAxis()->drawAxisMinorTicks()); _xAxisTab->setDrawAxisMinorGridLines(_plotItem->xAxis()->drawAxisMinorGridLines()); _xAxisTab->setAutoMinorTickCount(_plotItem->xAxis()->axisAutoMinorTicks()); _xAxisTab->setAxisMajorGridLineColor(_plotItem->xAxis()->axisMajorGridLineColor()); _xAxisTab->setAxisMinorGridLineColor(_plotItem->xAxis()->axisMinorGridLineColor()); _xAxisTab->setAxisMajorGridLineWidth(_plotItem->xAxis()->axisMajorGridLineWidth()); _xAxisTab->setAxisMinorGridLineWidth(_plotItem->xAxis()->axisMinorGridLineWidth()); _xAxisTab->setAxisMajorGridLineStyle(_plotItem->xAxis()->axisMajorGridLineStyle()); _xAxisTab->setAxisMinorGridLineStyle(_plotItem->xAxis()->axisMinorGridLineStyle()); _xAxisTab->setLog(_plotItem->xAxis()->axisLog()); _xAxisTab->setReversed(_plotItem->xAxis()->axisReversed()); _xAxisTab->setBaseOffsetMode(_plotItem->xAxis()->axisAutoBaseOffset(), _plotItem->xAxis()->axisBaseOffset()); _xAxisTab->setForceOffsetMin(_plotItem->xAxis()->axisForceOffsetMin()); _xAxisTab->setInterpret(_plotItem->xAxis()->axisInterpret()); _xAxisTab->setAxisDisplay(_plotItem->xAxis()->axisDisplay()); _xAxisTab->setAxisDisplayFormatString(_plotItem->xAxis()->axisDisplayFormatString()); _xAxisTab->setAxisInterpretation(_plotItem->xAxis()->axisInterpretation()); _xAxisTab->setTimezone(_plotItem->xAxis()->timezoneName()); _xAxisTab->setHideTopRight(_plotItem->manuallyHideTopAxisLabel()); _xAxisTab->setHideBottomLeft(_plotItem->manuallyHideBottomAxisLabel()); _xAxisTab->setAxisMinorTickCount(_plotItem->xAxis()->axisMinorTickCount()); _xAxisTab->setSignificantDigits(_plotItem->xAxis()->axisSignificantDigits()); _xAxisTab->setLabelRotation(_plotItem->xAxis()->axisLabelRotation()); _yAxisTab->enableSingleEditOptions(true); _yAxisTab->setAxisMajorTickSpacing(_plotItem->yAxis()->axisMajorTickMode()); _yAxisTab->setDrawAxisMajorTicks(_plotItem->yAxis()->drawAxisMajorTicks()); _yAxisTab->setDrawAxisMajorGridLines(_plotItem->yAxis()->drawAxisMajorGridLines()); _yAxisTab->setDrawAxisMinorTicks(_plotItem->yAxis()->drawAxisMinorTicks()); _yAxisTab->setAutoMinorTickCount(_plotItem->yAxis()->axisAutoMinorTicks()); _yAxisTab->setDrawAxisMinorGridLines(_plotItem->yAxis()->drawAxisMinorGridLines()); _yAxisTab->setAxisMajorGridLineColor(_plotItem->yAxis()->axisMajorGridLineColor()); _yAxisTab->setAxisMinorGridLineColor(_plotItem->yAxis()->axisMinorGridLineColor()); _yAxisTab->setAxisMajorGridLineWidth(_plotItem->yAxis()->axisMajorGridLineWidth()); _yAxisTab->setAxisMinorGridLineWidth(_plotItem->yAxis()->axisMinorGridLineWidth()); _yAxisTab->setAxisMajorGridLineStyle(_plotItem->yAxis()->axisMajorGridLineStyle()); _yAxisTab->setAxisMinorGridLineStyle(_plotItem->yAxis()->axisMinorGridLineStyle()); _yAxisTab->setLog(_plotItem->yAxis()->axisLog()); _yAxisTab->setReversed(_plotItem->yAxis()->axisReversed()); _yAxisTab->setBaseOffsetMode(_plotItem->yAxis()->axisAutoBaseOffset(), _plotItem->yAxis()->axisBaseOffset()); _yAxisTab->setForceOffsetMin(_plotItem->yAxis()->axisForceOffsetMin()); _yAxisTab->setInterpret(_plotItem->yAxis()->axisInterpret()); _yAxisTab->setAxisDisplay(_plotItem->yAxis()->axisDisplay()); _yAxisTab->setAxisDisplayFormatString(_plotItem->yAxis()->axisDisplayFormatString()); _yAxisTab->setAxisInterpretation(_plotItem->yAxis()->axisInterpretation()); _yAxisTab->setTimezone(_plotItem->yAxis()->timezoneName()); _yAxisTab->setHideTopRight(_plotItem->manuallyHideRightAxisLabel()); _yAxisTab->setHideBottomLeft(_plotItem->manuallyHideLeftAxisLabel()); _yAxisTab->setAxisMinorTickCount(_plotItem->yAxis()->axisMinorTickCount()); _yAxisTab->setSignificantDigits(_plotItem->yAxis()->axisSignificantDigits()); _yAxisTab->setLabelRotation(_plotItem->yAxis()->axisLabelRotation()); } void PlotItemDialog::setupMarkers() { Q_ASSERT(_plotItem); _xMarkersTab->enableSingleEditOptions(true); _xMarkersTab->setPlotMarkers(_plotItem->xAxis()->axisPlotMarkers()); _yMarkersTab->enableSingleEditOptions(true); _yMarkersTab->setPlotMarkers(_plotItem->yAxis()->axisPlotMarkers()); } void PlotItemDialog::setupContent() { QStringList displayedRelations; QStringList availableRelations; QStringList allRelations; QStringList displayedRelationTips; QStringList availableRelationTips; QStringList allRelationTips; CurveList curves = _store->getObjects(); ImageList images = _store->getObjects(); foreach (RelationPtr relation, _plotItem->renderItem(PlotRenderItem::Cartesian)->relationList()) { displayedRelations.append(relation->Name()); displayedRelationTips.append(relation->descriptionTip()); } foreach (CurvePtr curve, curves) { allRelations.append(curve->Name()); allRelationTips.append(curve->descriptionTip()); if (!displayedRelations.contains(curve->Name())) { availableRelations.append(curve->Name()); availableRelationTips.append(curve->descriptionTip()); } } foreach (ImagePtr image, images) { allRelations.append(image->Name()); allRelationTips.append(image->descriptionTip()); if (!displayedRelations.contains(image->Name())) { availableRelations.append(image->Name()); availableRelationTips.append(image->descriptionTip()); } } _contentTab->setDisplayedRelations(displayedRelations, displayedRelationTips); _contentTab->setAvailableRelations(availableRelations, availableRelationTips); } #if 0 void PlotItemDialog::addRelations() { foreach (RelationPtr relation, _plotItem->renderItem(PlotRenderItem::Cartesian)->relationList()) { if (CurvePtr curve = kst_cast(relation)) { CurveTab* curveTab = new CurveTab(this); curveTab->setObjectStore(_store); curveTab->setXVector(curve->xVector()); curveTab->setYVector(curve->yVector()); if (curve->hasXError()) { curveTab->setXError(curve->xErrorVector()); } if (curve->hasYError()) { curveTab->setYError(curve->yErrorVector()); } if (curve->hasXMinusError()) { curveTab->setXMinusError(curve->xMinusErrorVector()); } if (curve->hasYMinusError()) { curveTab->setYMinusError(curve->yMinusErrorVector()); } curveTab->curveAppearance()->setColor(curve->color()); curveTab->curveAppearance()->setShowPoints(curve->hasPoints()); curveTab->curveAppearance()->setShowLines(curve->hasLines()); curveTab->curveAppearance()->setShowBars(curve->hasBars()); curveTab->curveAppearance()->setLineWidth(curve->lineWidth()); curveTab->curveAppearance()->setLineStyle(curve->lineStyle()); curveTab->curveAppearance()->setPointType(curve->pointType()); curveTab->curveAppearance()->setPointDensity(curve->pointDensity()); curveTab->curveAppearance()->setBarStyle(curve->barStyle()); curveTab->hidePlacementOptions(); DialogPage *curvePage = new DialogPage(this); curvePage->setPageTitle(curve->Name()); curvePage->addDialogTab(curveTab); addDialogPage(curvePage, false); _relationPages.append(curvePage); } else if (ImagePtr image = kst_cast(relation)) { ImageTab* imageTab = new ImageTab(this); imageTab->setObjectStore(_store); imageTab->setMatrix(image->matrix()); if (image->hasContourMap() && image->hasColorMap()) { imageTab->setColorAndContour(true); imageTab->setNumberOfContourLines(image->numContourLines()); imageTab->setContourColor(image->contourColor()); imageTab->setContourWeight(image->contourWeight()); imageTab->setLowerThreshold(image->lowerThreshold()); imageTab->setUpperThreshold(image->upperThreshold()); imageTab->setRealTimeAutoThreshold(image->autoThreshold()); imageTab->colorPalette()->setPalette(image->paletteName()); imageTab->setUseVariableLineWeight(image->contourWeight() == -1); } else if (image->hasContourMap()) { imageTab->setContourOnly(true); imageTab->setNumberOfContourLines(image->numContourLines()); imageTab->setContourColor(image->contourColor()); imageTab->setContourWeight(image->contourWeight()); imageTab->setUseVariableLineWeight(image->contourWeight() == -1); } else { imageTab->setColorOnly(true); imageTab->setLowerThreshold(image->lowerThreshold()); imageTab->setUpperThreshold(image->upperThreshold()); imageTab->setRealTimeAutoThreshold(image->autoThreshold()); imageTab->colorPalette()->setPalette(image->paletteName()); } imageTab->hidePlacementOptions(); DialogPage *imagePage = new DialogPage(this); imagePage->setPageTitle(image->Name()); imagePage->addDialogTab(imageTab); addDialogPage(imagePage, false); _relationPages.append(imagePage); } } } void PlotItemDialog::updateRelations() { foreach(DialogPage* page, _relationPages) { removeDialogPage(page); } _relationPages.clear(); addRelations(); } #endif void PlotItemDialog::contentChanged() { QStringList relation_names = _contentTab->displayedRelations(); RelationList relations; foreach (const QString &relation_name, relation_names) { if (RelationPtr relation = kst_cast(_store->retrieveObject(relation_name))) { relations.append(relation); } } _plotItem->renderItem(PlotRenderItem::Cartesian)->setRelationsList(relations); _plotItem->update(); } #if 0 void PlotItemDialog::relationChanged() { foreach(DialogPage* page, _relationPages) { if (CurvePtr curve = kst_cast(_store->retrieveObject(page->pageTitle()))) { CurveTab* curveTab = static_cast(page->currentWidget()); if (curveTab) { curve->writeLock(); curve->setXVector(curveTab->xVector()); curve->setYVector(curveTab->yVector()); curve->setXError(curveTab->xError()); curve->setYError(curveTab->yError()); curve->setXMinusError(curveTab->xMinusError()); curve->setYMinusError(curveTab->yMinusError()); curve->setColor(curveTab->curveAppearance()->color()); curve->setHasPoints(curveTab->curveAppearance()->showPoints()); curve->setHasLines(curveTab->curveAppearance()->showLines()); curve->setHasBars(curveTab->curveAppearance()->showBars()); curve->setLineWidth(curveTab->curveAppearance()->lineWidth()); curve->setLineStyle(curveTab->curveAppearance()->lineStyle()); curve->setPointType(curveTab->curveAppearance()->pointType()); curve->setPointDensity(curveTab->curveAppearance()->pointDensity()); curve->setBarStyle(curveTab->curveAppearance()->barStyle()); curve->registerChange(); curve->unlock(); } } else if (ImagePtr image = kst_cast(_store->retrieveObject(page->pageTitle()))) { ImageTab* imageTab = static_cast(page->currentWidget()); if (imageTab) { image->writeLock(); if (imageTab->colorOnly()) { image->changeToColorOnly(imageTab->matrix(), imageTab->lowerThreshold(), imageTab->upperThreshold(), imageTab->realTimeAutoThreshold(), imageTab->colorPalette()->selectedPalette()); } else if (imageTab->contourOnly()) { image->changeToContourOnly(imageTab->matrix(), imageTab->numberOfContourLines(), imageTab->contourColor(), imageTab->useVariableLineWeight() ? -1 : imageTab->contourWeight()); } else { image->changeToColorAndContour(imageTab->matrix(), imageTab->lowerThreshold(), imageTab->upperThreshold(), imageTab->realTimeAutoThreshold(), imageTab->colorPalette()->selectedPalette(), imageTab->numberOfContourLines(), imageTab->contourColor(), imageTab->useVariableLineWeight() ? -1 : imageTab->contourWeight()); } image->registerChange(); image->unlock(); } } } } #endif void PlotItemDialog::rangeChanged() { Q_ASSERT(_plotItem); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveRange(plotItem); } } else { saveRange(_plotItem); } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::saveRange(PlotItem *item) { ZoomState zoomstate; double newXMin, newXMax; double newYMin, newYMax; zoomstate = item->currentZoomState(); qreal xRange = _rangeTab->xRangeDirty() ? _rangeTab->xRange() :fabs(item->xMax() - item->xMin()); qreal xMax = _rangeTab->xMaxDirty() ? _rangeTab->xMax() :item->xMax(); qreal xMin = _rangeTab->xMinDirty() ? _rangeTab->xMin() :item->xMin(); qreal yRange = _rangeTab->yRangeDirty() ? _rangeTab->yRange() :fabs(item->yMax() - item->yMin()); qreal yMax = _rangeTab->yMaxDirty() ? _rangeTab->yMax() :item->yMax(); qreal yMin = _rangeTab->yMinDirty() ? _rangeTab->yMin() :item->yMin(); zoomstate.item = item; if ((_rangeTab->xModeDirty() && _rangeTab->xMean()) || (!_rangeTab->xModeDirty() && zoomstate.xAxisZoomMode == PlotAxis::MeanCentered)) { newXMax = xRange; newXMin = (item->xMin() + item->xMax() - newXMax)/2.0; } else { newXMin = qMin(xMax, xMin); newXMax = fabs(xMax - xMin); } if (newXMax == 0.0) newXMax = 0.2; if ((_rangeTab->yModeDirty() && _rangeTab->yMean()) || (!_rangeTab->yModeDirty() && zoomstate.yAxisZoomMode == PlotAxis::MeanCentered)) { newYMax = yRange; newYMin = (item->yMin() + item->yMax() - newYMax)/2.0; } else { newYMin = qMin(yMax, yMin); newYMax = fabs(yMax - yMin); } if (newYMax == 0.0) newYMax = 0.2; PlotAxis::ZoomMode xZoomMode = item->yAxis()->axisZoomMode(); PlotAxis::ZoomMode yZoomMode = item->yAxis()->axisZoomMode(); if (_rangeTab->xModeDirty()) { if (_rangeTab->xAuto()) { xZoomMode = PlotAxis::Auto; } else if (_rangeTab->xSpike()) { xZoomMode = PlotAxis::SpikeInsensitive; } else if (_rangeTab->xBorder()) { xZoomMode = PlotAxis::AutoBorder; } else if (_rangeTab->xMean()) { xZoomMode = PlotAxis::MeanCentered; } else if (_rangeTab->xFixed()) { xZoomMode = PlotAxis::FixedExpression; } } if (_rangeTab->yModeDirty()) { if (_rangeTab->yAuto()) { yZoomMode = PlotAxis::Auto; } else if (_rangeTab->ySpike()) { yZoomMode = PlotAxis::SpikeInsensitive; } else if (_rangeTab->yBorder()) { yZoomMode = PlotAxis::AutoBorder; } else if (_rangeTab->yMean()) { yZoomMode = PlotAxis::MeanCentered; } else if (_rangeTab->yFixed()) { yZoomMode = PlotAxis::FixedExpression; } } QRectF newProjectionRect(newXMin, newYMin, newXMax, newYMax); if (_rangeTab->xModeDirty()) { if (xZoomMode == PlotAxis::Auto) { item->zoomXMaximum(); } else if (xZoomMode == PlotAxis::AutoBorder) { item->zoomXAutoBorder(); } else if (xZoomMode == PlotAxis::SpikeInsensitive) { item->zoomXNoSpike(); } } if (xZoomMode == PlotAxis::FixedExpression) { item->zoomXRange(newProjectionRect); } if (xZoomMode == PlotAxis::MeanCentered) { item->zoomXMeanCentered(_rangeTab->xRange()); } if (_rangeTab->yModeDirty()) { if (yZoomMode == PlotAxis::Auto) { item->zoomYMaximum(); } else if (yZoomMode == PlotAxis::AutoBorder) { item->zoomYAutoBorder(); } else if (yZoomMode == PlotAxis::SpikeInsensitive) { item->zoomYNoSpike(); } } if (yZoomMode == PlotAxis::FixedExpression) { item->zoomYRange(newProjectionRect); } if (yZoomMode == PlotAxis::MeanCentered) { item->zoomYMeanCentered(_rangeTab->yRange()); } } void PlotItemDialog::xAxisChanged() { Q_ASSERT(_plotItem); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveAxis(plotItem->xAxis(), _xAxisTab); plotItem->setProjectionRect(plotItem->projectionRect(), plotItem->xAxis()->isDirty()); if (_xAxisTab->hideBottomLeftDirty()) { plotItem->setManuallyHideBottomAxisLabel(_xAxisTab->hideBottomLeft()); } if (_xAxisTab->hideTopRightDirty()) { plotItem->setManuallyHideTopAxisLabel(_xAxisTab->hideTopRight()); } } } else { saveAxis(_plotItem->xAxis(), _xAxisTab); _plotItem->setProjectionRect(_plotItem->projectionRect(), _plotItem->xAxis()->isDirty()); _plotItem->setManuallyHideBottomAxisLabel(_xAxisTab->hideBottomLeft()); _plotItem->setManuallyHideTopAxisLabel(_xAxisTab->hideTopRight()); _plotItem->setProjectionRect(_plotItem->computedProjectionRect(), true); //need to recompute } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::yAxisChanged() { Q_ASSERT(_plotItem); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveAxis(plotItem->yAxis(), _yAxisTab); plotItem->setProjectionRect(plotItem->projectionRect(), plotItem->yAxis()->isDirty()); if (_yAxisTab->hideBottomLeftDirty()) { plotItem->setManuallyHideLeftAxisLabel(_yAxisTab->hideBottomLeft()); } if (_yAxisTab->hideTopRightDirty()) { plotItem->setManuallyHideRightAxisLabel(_yAxisTab->hideTopRight()); } } } else { saveAxis(_plotItem->yAxis(), _yAxisTab); _plotItem->setProjectionRect(_plotItem->projectionRect(), _plotItem->yAxis()->isDirty()); _plotItem->setManuallyHideLeftAxisLabel(_yAxisTab->hideBottomLeft()); _plotItem->setManuallyHideRightAxisLabel(_yAxisTab->hideTopRight()); _plotItem->setProjectionRect(_plotItem->computedProjectionRect(), true); //need to recompute } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::saveAxis(PlotAxis *axis, AxisTab *axisTab) { Q_ASSERT(axis); if (axisTab->axisMajorTickSpacingDirty()) { axis->setAxisMajorTickMode(axisTab->axisMajorTickSpacing()); } if (axisTab->drawAxisMajorTicksDirty()) { axis->setDrawAxisMajorTicks(axisTab->drawAxisMajorTicks()); } if (axisTab->drawAxisMajorGridLinesDirty()) { axis->setDrawAxisMajorGridLines(axisTab->drawAxisMajorGridLines()); } if (axisTab->drawAxisMinorTicksDirty()) { axis->setDrawAxisMinorTicks(axisTab->drawAxisMinorTicks()); } if (axisTab->drawAxisMinorGridLinesDirty()) { axis->setDrawAxisMinorGridLines(axisTab->drawAxisMinorGridLines()); } if (axisTab->axisMajorGridLineColorDirty()) { axis->setAxisMajorGridLineColor(axisTab->axisMajorGridLineColor()); } if (axisTab->axisMinorGridLineColorDirty()) { axis->setAxisMinorGridLineColor(axisTab->axisMinorGridLineColor()); } if (axisTab->axisMajorGridLineWidthDirty()) { axis->setAxisMajorGridLineWidth(axisTab->axisMajorGridLineWidth()); } if (axisTab->axisMinorGridLineWidthDirty()) { axis->setAxisMinorGridLineWidth(axisTab->axisMinorGridLineWidth()); } if (axisTab->axisMajorGridLineStyleDirty()) { axis->setAxisMajorGridLineStyle(axisTab->axisMajorGridLineStyle()); } if (axisTab->axisMinorGridLineStyleDirty()) { axis->setAxisMinorGridLineStyle(axisTab->axisMinorGridLineStyle()); } if (axisTab->isLogDirty()) { axis->setAxisLog(axisTab->isLog()); } if (axisTab->isReversedDirty()) { axis->setAxisReversed(axisTab->isReversed()); } if (axisTab->isInterpretDirty()) { axis->setAxisInterpret(axisTab->isInterpret()); } if (axisTab->axisDisplayDirty()) { axis->setAxisDisplay(axisTab->axisDisplay()); } if (axisTab->axisDisplayFormatStringDirty()) { axis->setAxisDisplayFormatString(axisTab->axisDisplayFormatString()); } if (axisTab->axisInterpretationDirty()) { axis->setAxisInterpretation(axisTab->axisInterpretation()); } if (axisTab->timezoneDirty()) { axis->setTimezoneName(axisTab->timezone()); } if (axisTab->isBaseOffsetDirty()) { axis->setAxisBaseOffset(axisTab->isBaseOffset()); } if (axisTab->isForceOffsetMinDirty()) { axis->setAxisForceOffsetMin(axisTab->isForceOffsetMin()); } if (axisTab->axisMinorTickCountDirty()) { axis->setAxisMinorTickCount(axisTab->axisMinorTickCount()); } if (axisTab->isAutoMinorTickCountDirty()) { axis->setAxisAutoMinorTicks(axisTab->isAutoMinorTickCount()); } if (axisTab->significantDigitsDirty()) { axis->setAxisSignificantDigits(axisTab->significantDigits()); } if (axisTab->isAutoBaseOffsetDirty()) { axis->setAxisAutoBaseOffset(axisTab->isAutoBaseOffset()); } if (axisTab->labelRotationDirty()) { axis->setAxisLabelRotation(axisTab->labelRotation()); } } void PlotItemDialog::labelsChanged() { Q_ASSERT(_plotItem); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveLabels(plotItem); } } else { saveLabels(_plotItem); } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::saveLabels(PlotItem *item) { QString leftLabel = _labelTab->leftLabelDirty() ? _labelTab->leftLabel() :item->leftLabel(); bool leftLabelAuto = _labelTab->leftLabelAutoDirty() ? _labelTab->leftLabelAuto() :item->leftLabelDetails()->isAuto(); bool leftUseDefault = _leftLabelTab->useDefaultDirty() ? _leftLabelTab->useDefault() :item->leftLabelDetails()->fontUseGlobal(); QFont leftFont = _leftLabelTab->labelFontDirty() ? _leftLabelTab->labelFont(item->leftLabelDetails()->font()) :item->leftLabelDetails()->font(); qreal leftFontScale = _leftLabelTab->labelFontScaleDirty() ? _leftLabelTab->labelFontScale() :item->leftLabelDetails()->fontScale(); QColor leftFontColor = _leftLabelTab->labelColorDirty() ? _leftLabelTab->labelColor() :item->leftLabelDetails()->fontColor(); QString bottomLabel = _labelTab->bottomLabelDirty() ? _labelTab->bottomLabel() :item->bottomLabel(); bool bottomLabelAuto = _labelTab->bottomLabelAutoDirty() ? _labelTab->bottomLabelAuto() :item->bottomLabelDetails()->isAuto(); bool bottomUseDefault = _bottomLabelTab->useDefaultDirty() ? _bottomLabelTab->useDefault() :item->bottomLabelDetails()->fontUseGlobal(); QFont bottomFont = _bottomLabelTab->labelFontDirty() ? _bottomLabelTab->labelFont(item->bottomLabelDetails()->font()) :item->bottomLabelDetails()->font(); qreal bottomFontScale = _bottomLabelTab->labelFontScaleDirty() ? _bottomLabelTab->labelFontScale() :item->bottomLabelDetails()->fontScale(); QColor bottomFontColor = _bottomLabelTab->labelColorDirty() ? _bottomLabelTab->labelColor() :item->bottomLabelDetails()->fontColor(); QString rightLabel = _labelTab->rightLabelDirty() ? _labelTab->rightLabel() :item->rightLabel(); bool rightLabelAuto = _labelTab->rightLabelAutoDirty() ? _labelTab->rightLabelAuto() :item->rightLabelDetails()->isAuto(); bool rightUseDefault = _rightLabelTab->useDefaultDirty() ? _rightLabelTab->useDefault() :item->rightLabelDetails()->fontUseGlobal(); QFont rightFont = _rightLabelTab->labelFontDirty() ? _rightLabelTab->labelFont(item->rightLabelDetails()->font()) :item->rightLabelDetails()->font(); qreal rightFontScale = _rightLabelTab->labelFontScaleDirty() ? _rightLabelTab->labelFontScale() :item->rightLabelDetails()->fontScale(); QColor rightFontColor = _rightLabelTab->labelColorDirty() ? _rightLabelTab->labelColor() :item->rightLabelDetails()->fontColor(); QString topLabel = _labelTab->topLabelDirty() ? _labelTab->topLabel() :item->topLabel(); bool topLabelAuto = _labelTab->topLabelAutoDirty() ? _labelTab->topLabelAuto() :item->topLabelDetails()->isAuto(); bool topUseDefault = _topLabelTab->useDefaultDirty() ? _topLabelTab->useDefault() :item->topLabelDetails()->fontUseGlobal(); QFont topFont = _topLabelTab->labelFontDirty() ? _topLabelTab->labelFont(item->topLabelDetails()->font()) :item->topLabelDetails()->font(); qreal topFontScale = _topLabelTab->labelFontScaleDirty() ? _topLabelTab->labelFontScale() :item->topLabelDetails()->fontScale(); QColor topFontColor = _topLabelTab->labelColorDirty() ? _topLabelTab->labelColor() :item->topLabelDetails()->fontColor(); bool axisUseDefault = _axisLabelTab->useDefaultDirty() ? _axisLabelTab->useDefault() :item->numberLabelDetails()->fontUseGlobal(); QFont axisFont = _axisLabelTab->labelFontDirty() ? _axisLabelTab->labelFont(item->numberLabelDetails()->font()) :item->numberLabelDetails()->font(); qreal axisFontScale = _axisLabelTab->labelFontScaleDirty() ? _axisLabelTab->labelFontScale() :item->numberLabelDetails()->fontScale(); QColor axisFontColor = _axisLabelTab->labelColorDirty() ? _axisLabelTab->labelColor() :item->numberLabelDetails()->fontColor(); QFont globalFont = _labelTab->globalLabelFontDirty() ? _labelTab->globalLabelFont(item->globalFont()) :item->globalFont(); qreal globalFontScale = _labelTab->globalLabelFontScaleDirty() ? _labelTab->globalLabelFontScale() :item->globalFontScale(); QColor globalFontColor = _labelTab->globalLabelColorDirty() ? _labelTab->globalLabelColor() :item->globalFontColor(); bool showLegend = _labelTab->showLegendDirty() ? _labelTab->showLegend() :item->showLegend(); bool axisLabelScale = _labelTab->autoScaleNumbersDirty() ? _labelTab->autoScaleNumbers() :item->isUseAxisScale(); item->leftLabelDetails()->setDetails(leftLabel, leftLabelAuto, leftUseDefault, leftFont, leftFontScale, leftFontColor); item->bottomLabelDetails()->setDetails(bottomLabel, bottomLabelAuto, bottomUseDefault, bottomFont, bottomFontScale, bottomFontColor); item->rightLabelDetails()->setDetails(rightLabel, rightLabelAuto, rightUseDefault, rightFont, rightFontScale, rightFontColor); item->topLabelDetails()->setDetails(topLabel, topLabelAuto, topUseDefault, topFont, topFontScale, topFontColor); item->numberLabelDetails()->setDetails(QString(), false, axisUseDefault, axisFont, axisFontScale, axisFontColor); item->setGlobalFont(globalFont); item->setGlobalFontScale(globalFontScale); item->setGlobalFontColor(globalFontColor); item->setUseAxisScale(axisLabelScale); item->setShowLegend(showLegend, !item->showLegend()); // reset font size if legend isn't already shown. } void PlotItemDialog::xAxisPlotMarkersChanged() { Q_ASSERT(_plotItem); if (!_xMarkersTab->markersDirty()) { return; } PlotMarkers markers = _xMarkersTab->plotMarkers(); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveMarkers(plotItem->xAxis(), markers); } } else { saveMarkers(_plotItem->xAxis(), markers); } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::yAxisPlotMarkersChanged() { Q_ASSERT(_plotItem); if (!_yMarkersTab->markersDirty()) { return; } PlotMarkers markers = _yMarkersTab->plotMarkers(); if (editMode() == Multiple) { foreach(ViewItem* item, selectedMultipleEditObjects()) { PlotItem* plotItem = (PlotItem*)item; saveMarkers(plotItem->yAxis(), markers); } } else { saveMarkers(_plotItem->yAxis(), markers); } kstApp->mainWindow()->document()->setChanged(true); } void PlotItemDialog::saveMarkers(PlotAxis *axis, PlotMarkers &markers) { axis->setAxisPlotMarkers(markers); } void PlotItemDialog::useTopDefaultChanged(bool use) { if (use) { _labelPage->setTabText(1, tr("Top Font")); globalFontUpdate(); } else { _labelPage->setTabText(1, tr("Top Font*")); } } void PlotItemDialog::useBottomDefaultChanged(bool use) { if (use) { _labelPage->setTabText(2, tr("Bottom Font")); globalFontUpdate(); } else { _labelPage->setTabText(2, tr("Bottom Font*")); } } void PlotItemDialog::useLeftDefaultChanged(bool use) { if (use) { _labelPage->setTabText(3, tr("Left Font")); globalFontUpdate(); } else { _labelPage->setTabText(3, tr("Left Font*")); } } void PlotItemDialog::useRightDefaultChanged(bool use) { if (use) { _labelPage->setTabText(4, tr("Right Font")); globalFontUpdate(); } else { _labelPage->setTabText(4, tr("Right Font*")); } } void PlotItemDialog::useAxisDefaultChanged(bool use) { if (use) { _labelPage->setTabText(5, tr("Axis Font")); globalFontUpdate(); } else { _labelPage->setTabText(5, tr("Axis Font*")); } } void PlotItemDialog::globalFontUpdate() { qreal fontScale = _labelTab->globalLabelFontScale(); QFont font = _labelTab->globalLabelFont(QFont()); QColor color = _labelTab->globalLabelColor(); _topLabelTab->setFontSpecsIfDefault(font, fontScale, color); _bottomLabelTab->setFontSpecsIfDefault(font, fontScale, color); _leftLabelTab->setFontSpecsIfDefault(font, fontScale, color); _rightLabelTab->setFontSpecsIfDefault(font, fontScale, color); _axisLabelTab->setFontSpecsIfDefault(font, fontScale, color); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/dialog.cpp0000644000175000017500000001246012277111530016103 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "dialog.h" #include #include "dialogpage.h" #include #include namespace Kst { Dialog::Dialog(QWidget *parent) : QDialog(parent), _allowApply(false) { setupUi(this); _saveAsDefault->hide(); _applyToExisting->hide(); extensionWidget()->hide(); connect(_listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(selectPageForItem(QListWidgetItem*))); connect(_buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); setAttribute(Qt::WA_DeleteOnClose); resize(minimumSizeHint()); _saveAsDefault->setProperty("si","Save as default"); _applyToExisting->setProperty("si","Apply to existing objects"); #if defined(__QNX__) || defined(__ANDROID__) // Mobile environments don't have window managers, and so dialogs // are not a native concept. We may consider adding a "Back" // button to dialogs on mobile platform... // // In the meantime, dialogs should be fullscreen. A dialog without // borders looks really bad, and getting the size right is difficult. setWindowState(Qt::WindowFullScreen); #endif } Dialog::~Dialog() { } void Dialog::addDialogPage(DialogPage *page, bool addMinSize) { connect(page, SIGNAL(modified()), this, SLOT(modified())); connect(this, SIGNAL(apply()), page, SIGNAL(apply())); QListWidgetItem *item = new QListWidgetItem(page->pageIcon(), page->pageTitle(), _listWidget); _listWidget->addItem(item); _stackedWidget->addWidget(page); _itemHash.insert(item, page); int itemWidth = _listWidget->visualItemRect(item).width() + 4; if (addMinSize && _listWidget->width() < itemWidth) { _listWidget->setMinimumSize(itemWidth, _listWidget->size().height()); } } void Dialog::removeDialogPage(DialogPage *page) { disconnect(page, SIGNAL(modified()), this, SLOT(modified())); disconnect(this, SIGNAL(apply()), page, SIGNAL(apply())); QList items = _listWidget->findItems(page->pageTitle(), Qt::MatchExactly); foreach (QListWidgetItem* item, items) { _itemHash.remove(item); _listWidget->takeItem(_listWidget->row(item)); _stackedWidget->removeWidget(page); } resetListWidget(); } void Dialog::resetListWidget() { int extraSize = _listWidget->width() - 100; _listWidget->setMaximumWidth(100); _listWidget->setMinimumWidth(100); if (extraSize > 0 ) { QList splitterSize; splitterSize << 100; splitterSize << _splitter->sizes()[1] + extraSize; _splitter->setSizes(splitterSize); } } DialogPage* Dialog::getDialogPage(const QString& pageName) { QList items = _listWidget->findItems(pageName, Qt::MatchExactly); if (!items.empty()) { return _itemHash.value(items[0]); } return 0; } void Dialog::selectDialogPage(DialogPage *page) { QList items = _listWidget->findItems(page->pageTitle(), Qt::MatchExactly); foreach (QListWidgetItem* item, items) { _listWidget->setCurrentItem(item); selectPageForItem(item); } } void Dialog::setVisible(bool visible) { _listWidget->setVisible(_itemHash.count() > 1); _buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); QDialog::setVisible(visible); } QWidget *Dialog::leftCustomWidget() const { return _leftCustom; } QWidget *Dialog::rightCustomWidget() const { return _rightCustom; } QWidget *Dialog::topCustomWidget() const { return _topCustom; } QWidget *Dialog::bottomCustomWidget() const { return _bottomCustom; } QWidget *Dialog::extensionWidget() const { return _extensionWidget; } QDialogButtonBox *Dialog::buttonBox() const { return _buttonBox; } void Dialog::selectPageForItem(QListWidgetItem *item) { if (_itemHash.contains(item)) _stackedWidget->setCurrentWidget(_itemHash.value(item)); } void Dialog::buttonClicked(QAbstractButton *button) { QDialogButtonBox::StandardButton std = _buttonBox->standardButton(button); switch(std) { case QDialogButtonBox::Ok: emit apply(); emit ok(); break; case QDialogButtonBox::Apply: if (!_allowApply) { _buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); } emit apply(); break; case QDialogButtonBox::Cancel: emit cancel(); break; default: break; } } void Dialog::setAlwaysAllowApply(const bool allow) { _allowApply = allow; if (!allow) { _buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); } } void Dialog::modified() { _buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/pluginmenuitemaction.cpp0000644000175000017500000000230212277111530021076 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2010 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "pluginmenuitemaction.h" namespace Kst { PluginMenuItemAction::PluginMenuItemAction(const QString &text, QWidget *parent) : QAction(parent), m_text(text) { connect(this, SIGNAL(triggered()), this, SLOT(triggerWithName())); this->setText(text); } void PluginMenuItemAction::triggerWithName() { emit triggered(m_text); } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/defaultlabelpropertiestab.ui0000644000175000017500000001043612277111530021730 0ustar synthsynth DefaultLabelPropertiesTab 0 0 479 113 &Minimum font size (points): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _minFontSize 0 0 On window resize, fonts will be displayed at least this large. Reference view size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter When the window is this large, fonts will have stated size. Fonts are scaled with the window or print size. When the window/print is this large, the font sizes stated will be accurate. Custom reference size (cm): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _refViewWidth 0 0 2000.000000000000000 0 0 x Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _refViewHeight 0 0 2000.000000000000000 Qt::Vertical 20 40 Kst-2.0.8/src/libkstapp/arrowpropertiestab.h0000644000175000017500000000303312277111530020243 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef ARROWPROPERTIESTAB_H #define ARROWPROPERTIESTAB_H #include "dialogtab.h" #include "ui_arrowpropertiestab.h" #include "kst_export.h" namespace Kst { class ArrowPropertiesTab : public DialogTab, Ui::ArrowPropertiesTab { Q_OBJECT public: explicit ArrowPropertiesTab(QWidget *parent = 0); virtual ~ArrowPropertiesTab(); bool startArrowHead(); void setStartArrowHead(const bool enabled); bool endArrowHead(); void setEndArrowHead(const bool enabled); qreal startArrowScale(); void setStartArrowScale(const qreal scale); qreal endArrowScale(); void setEndArrowScale(const qreal scale); public Q_SLOTS: void update(); }; } #endif // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/layouttab.ui0000644000175000017500000001010412277111530016474 0ustar synthsynth LayoutTab 0 0 419 327 &Horizontal margin: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _horMargin layout horizontal margin 0 0 &Vertical margin: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _verMargin layout vertical margin 0 0 Hori&zontal spacing: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _horSpacing layout horizontal spacing 0 0 Ver&tical spacing: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _verSpacing layout vertical spacing 0 0 Qt::Vertical 401 121 Kst-2.0.8/src/libkstapp/builtingraphics.cpp0000644000175000017500000000315012277111530020027 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "builtingraphics.h" #include "boxitem.h" #include "lineitem.h" #include "ellipseitem.h" #include "labelitem.h" #include "layoutboxitem.h" #include "pictureitem.h" #include "plotitem.h" #include "svgitem.h" #include "arrowitem.h" #include "circleitem.h" #include "sharedaxisboxitem.h" #include "buttonitem.h" namespace Kst { namespace Builtins { void initGraphics() { new ArrowItemFactory; new BoxItemFactory; new CircleItemFactory; new EllipseItemFactory; new LabelItemFactory; new ButtonItemFactory; new LayoutBoxItemFactory; new LineItemFactory; new PictureItemFactory; new PlotItemFactory; #ifndef KST_NO_SVG new SvgItemFactory; #endif new SharedAxisBoxItemFactory; } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/csdtab.ui0000644000175000017500000000640712277111530015743 0ustar synthsynth CSDTab 0 0 549 590 Spectrogram Contents 0 0 Data vector: false Window size: false _windowSize 1 999999999 500 0 0 Image Options Kst::VectorSelector QWidget
vectorselector.h
Kst::CurvePlacement QWidget
curveplacement.h
Kst::FFTOptions QWidget
fftoptions.h
Kst::ColorPalette
colorpalette.h
Kst-2.0.8/src/libkstapp/datasourcedialog.cpp0000644000175000017500000000510312320547027020155 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2007 The University of Toronto * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "datasourcedialog.h" #include #include #include namespace Kst { DataSourceDialog::DataSourceDialog(DataDialog::EditMode mode, DataSourcePtr dataSource, QWidget *parent) : QDialog(parent), _dataSource(dataSource) { setWindowTitle(QString("Configure %1").arg(_dataSource->fileType())); QVBoxLayout *layout = new QVBoxLayout(this); _dataSource->readLock(); _configWidget = _dataSource->configWidget(); connect(this, SIGNAL(ok()), _configWidget, SLOT(save())); connect(this, SIGNAL(cancel()), _configWidget, SLOT(cancel())); if (mode == DataDialog::Edit) { // Why would we want a source to not be reuseable? // Note: this is the only place where reuse is ever disabled... //connect(this, SIGNAL(ok()), this, SLOT(disableReuse())); } _dataSource->unlock(); _configWidget->setDialogParent(this); layout->addWidget(_configWidget); _buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(_buttonBox); connect(_buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); setLayout(layout); setMaximumSize(QSize(1280, 1024)); resize(minimumSizeHint()); } DataSourceDialog::~DataSourceDialog() { } void DataSourceDialog::disableReuse() { _dataSource->disableReuse(); } void DataSourceDialog::buttonClicked(QAbstractButton *button) { QDialogButtonBox::StandardButton std = _buttonBox->standardButton(button); switch(std) { case QDialogButtonBox::Ok: if (_configWidget->isOkAcceptabe()) { emit ok(); accept(); } break; case QDialogButtonBox::Cancel: emit cancel(); reject(); break; default: break; } } } // vim: ts=2 sw=2 et Kst-2.0.8/src/libkstapp/TODO0000644000175000017500000000202412277111530014623 0ustar synthsynthView ---- - arrows - Box the objects so they can't be dragged out of the visible size of scene - Create an ItemModel to map the items into a model - gradient editor doesn't work - Edit dialog needs to be parented and probably should be one-per-view Dialogs ------- - Finish off DataManager - Add DataWizard - Polish the vector dialog and hook it up - Item dialogs - Matrix Dialog - make an item view that is a set of tabs containing tableviews - String+Scalar dialog - Dialogs for data objects - Add view manager -> just a view onto the item model Models ------ - Add support for objects appearing/disappearing - Implement SessionModel for the datamanager - Implement MatrixTableModel - Implement PrimitiveScalarModel (Strings+Scalars) - support grouping by parent Plotting -------- - Move algorithms into libkstmath - Separate Kst2DPlot into pieces - axis - ?? Document -------- - Move data collections into here somehow? Updates ------- - Add update loop Other ----- - Move actions from MainWindow to each Item Kst-2.0.8/src/libkstapp/labelpropertiestab.ui0000644000175000017500000000777712277111530020401 0ustar synthsynth LabelPropertiesTab Qt::NonModal 0 0 643 227 Font &size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _labelFontScale 1 -25.000000000000000 1.000000000000000 Font famil&y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter _family Italic true label italic label color Bold true label bold points Qt::Vertical 20 131 Kst::ColorButton QToolButton
colorbutton.h
Kst::LabelBuilder QWidget
labelbuilder.h
_labelFontScale _bold _italic _labelColor _family
Kst-2.0.8/src/libkstapp/commandlineparser.cpp0000644000175000017500000006004212277111530020346 0ustar synthsynth/*************************************************************************** * * * copyright : (C) 2008 Barth Netterfield * * netterfield@astro.utoronto.ca * * * * This program is free software; you can 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. * * * ***************************************************************************/ #include #include "commandlineparser.h" #include "datasource.h" #include "objectstore.h" #include "colorsequence.h" #ifdef KST_HAVE_REVISION_H #include "kstrevision.h" #endif #include #include #include #include #include "curve.h" #include "psd.h" #include "histogram.h" #include "datamatrix.h" #include "image.h" #include "palette.h" #include "updatemanager.h" #include "dialogdefaults.h" #include "datasourcepluginmanager.h" namespace Kst { static const char *usageMessage = "KST Command Line Usage\n" "************************\n" "*** Load a kst file: ***\n" "kst [OPTIONS] kstfile\n" "\n" "[OPTIONS] will override the datasource parameters for all data sources in the kst file:\n" " -F \n" " -f \n" " -n \n" " -s \n" " -a (apply averaging filter: requires -s)\n\n" "************************\n"; static const char *usageDetailsMessage = "*** Read a data file ***\n" "kst datasource OPTIONS [datasource OPTIONS []]\n" "\n" "OPTIONS are read and interpreted in order. Except for data object options, all are applied to all future data objects, unless later overridden.\n" "Output Options:\n" " --print Print to file and exit.\n" " --landscape Print in landscape mode.\n" " --portrait Print in portrait mode.\n" " --Letter Print to Letter sized paper.\n" " --A4 Print to A4 sized paper.\n" " --png Render to a png image, and exit.\n" "File Options:\n" " -f default: 'end' counts from end.\n" " -n default: 'end' reads to end of file\n" " -s default: 0 (read every sample)\n" " -a apply averaging filter: requires -s\n\n" "Position:\n" " -P : Place curves in one plot.\n" " -A Place future curves in individual plots.\n" " -T Place future curves a new tab.\n" "Appearance\n" " -d: use points for the next curve\n" " -l: use lines for the next curve\n" " -b: use bargraph for the next curve\n" " --xlabel Set X label of all future plots.\n" " --ylabel Set Y label of all future plots.\n" " --xlabelauto AutoSet X label of all future plots.\n" " --ylabelauto AutoSet Y label of all future plots.\n" "Data Object Modifiers\n" " -x : Create vector and use as X vector for curves.\n" " -e : Create vector and use as Y-error vector for next -y.\n" " -r : sample rate (spectra & spectograms).\n" "Data Objects:\n" " -y plot an XY curve of field.\n" " -p plot the spectrum of field.\n" " -h plot a histogram of field.\n" " -z plot an image of matrix field.\n" "\n" "****************\n" "*** Examples ***\n" "\n" "Data sources and fields:\n" "Plot all data in column 2 from data.dat.\n" " kst data.dat -y 2\n" "\n" "Same as above, except only read 20 lines, starting at line 10.\n" " kst data.dat -f 10 -n 20 -y 2\n" "\n" "... also read col 1. One plot per curve.\n" " kst data.dat -f 10 -n 20 -y 1 -y 2\n" "\n" "Read col 1 from data2.dat and col 1 from data.dat\n" " kst data.dat -f 10 -n 20 -y 2 data2.dat -y 1\n" "\n" "Same as above, except read 40 lines starting at 30 in data2.dat\n" " kst data.dat -f 10 -n 20 -y 2 data2.dat -f 30 -n 40 -y 1\n" "\n" "Specify the X vector and error bars:\n" "Plot x = col 1 and Y = col 2 and error flags = col 3 from data.dat\n" " kst data.dat -x 1 -e 3 -y 2\n" "\n" "Get the X vector from data1.dat, and the Y vector from data2.dat.\n" " kst data1.dat -x 1 data2.dat -y 1\n" "\n" "Placement:\n" "Plot column 2 and column 3 in plot P1 and column 4 in plot P2\n" " kst data.dat -P P1 -y 2 -y 3 -P P2 -y 4\n"; static void printText(const QString& text, const QString& detailText = QString(), const QString& t = QString()) { #ifdef Q_OS_WIN // No console on Windows. QMessageBox box(QMessageBox::Information, "Kst", text + t); if (!detailText.isEmpty()) { box.setDetailedText(detailText); } box.exec(); #else QString displayText = QString(text) + QString(detailText) + t; qWarning("%s", qPrintable(displayText)); #endif } void CommandLineParser::printUsage(const QString &t) { printText(tr(usageMessage), tr(usageDetailsMessage), '\n' + t); } CommandLineParser::CommandLineParser(Document *doc, MainWindow* mw) : _mainWindow(mw), _doAve(false), _doSkip(false), _doConsecutivePlots(true), _useBargraph(false), _useLines(true), _usePoints(false), _overrideStyle(false), _sampleRate(1.0), _numFrames(-1), _startFrame(-1), _skip(0), _plotName(), _errorField(), _fileName(), _xField(QString("INDEX")), _pngFile(QString()), _printFile(QString()), _landscape(false), _plotItem(0) { Q_ASSERT(QCoreApplication::instance()); _arguments = QCoreApplication::instance()->arguments(); _arguments.takeFirst(); //appname _document = doc; _fileNames.clear(); _vectors.clear(); _plotItems.clear(); _xlabel.clear(); _ylabel.clear(); } CommandLineParser::~CommandLineParser() { } bool CommandLineParser::_setIntArg(int *arg, QString Message, bool accept_end) { QString param; bool ok = true; if (_arguments.count()> 0) { param = _arguments.takeFirst(); if ((param==tr("end") || (param=="end")) && (accept_end)) { *arg = -1; } else { *arg = param.toInt(&ok); } } else { ok=false; } if (!ok) printUsage(Message); return ok; } bool CommandLineParser::_setDoubleArg(double *arg, QString Message) { QString param; bool ok = true; if (_arguments.count()> 0) { param = _arguments.takeFirst(); *arg = param.toDouble(&ok); } else { ok=false; } if (!ok) printUsage(Message); return ok; } bool CommandLineParser::_setStringArg(QString &arg, QString Message) { bool ok = true; if (_arguments.count()> 0) { arg = _arguments.takeFirst(); } else { ok=false; } if (!ok) printUsage(Message); return ok; } DataVectorPtr CommandLineParser::createOrFindDataVector(QString field, DataSourcePtr ds) { DataVectorPtr xv; bool found = false; if ((_startFrame==-1) && (_numFrames==-1)) { // count from end and read to end _startFrame = 0; } // Flaky magic: if ds is an ascii file, change fields named 0 to 99 to // Column xx. This allows "-y 2" but prevents ascii files with fields // actually named "0 to 99" from being read from the command line. if (ds->fileType() == "ASCII file") { QRegExp num("^[0-9]{1,2}$"); if (num.exactMatch(field)) { field = tr("Column %1").arg(field); } } // check to see if an identical vector already exists. If so, use it. for (int i=0; i<_vectors.count(); i++) { xv = _vectors.at(i); if (field == xv->field()) { if ((xv->reqStartFrame() == _startFrame) && (xv->reqNumFrames() == _numFrames) && (xv->skip() == _skip) && (xv->doSkip() == (_skip>0)) && (xv->doAve() == _doAve) ){ if (xv->filename()==ds->fileName()) { found = true; break; } } } } if (!found) { Q_ASSERT(_document && _document->objectStore()); xv = _document->objectStore()->createObject(); xv->writeLock(); xv->change(ds, field, _startFrame, _numFrames, _skip, _skip>0, _doAve); xv->registerChange(); xv->unlock(); _vectors.append(xv); } return xv; } void CommandLineParser::createCurveInPlot(VectorPtr xv, VectorPtr yv, VectorPtr ev) { CurvePtr curve = _document->objectStore()->createObject(); curve->setXVector(xv); curve->setYVector(yv); curve->setXError(0); curve->setXMinusError(0); curve->setColor(ColorSequence::self().next()); curve->setHasPoints(_usePoints); curve->setHasLines(_useLines); curve->setHasBars(_useBargraph); curve->setLineWidth(dialogDefaults().value("curves/lineWidth",0).toInt()); //curve->setPointType(ptype++ % KSTPOINT_MAXTYPE); if (ev) { curve->setYError(ev); curve->setYMinusError(ev); } else { curve->setYError(0); curve->setYMinusError(0); } curve->writeLock(); curve->registerChange(); curve->unlock(); addCurve(curve); } void CommandLineParser::addCurve(CurvePtr curve) { if (_doConsecutivePlots) { CreatePlotForCurve *cmd = new CreatePlotForCurve(); cmd->createItem(); _plotItem = static_cast(cmd->item()); _plotItem->view()->appendToLayout(CurvePlacement::Auto, _plotItem); applyLabels(); } PlotRenderItem *renderItem = _plotItem->renderItem(PlotRenderItem::Cartesian); renderItem->addRelation(kst_cast(curve)); _plotItem->update(); } void CommandLineParser::createImageInPlot(MatrixPtr m) { ImagePtr image = _document->objectStore()->createObject(); image->changeToColorOnly(m, 0.0, 1.0, true, Palette::getPaletteList().at(0)); image->writeLock(); image->registerChange(); image->unlock(); if (_doConsecutivePlots) { CreatePlotForCurve *cmd = new CreatePlotForCurve(); cmd->createItem(); _plotItem = static_cast(cmd->item()); _plotItem->view()->appendToLayout(CurvePlacement::Auto, _plotItem); applyLabels(); } PlotRenderItem *renderItem = _plotItem->renderItem(PlotRenderItem::Cartesian); renderItem->addRelation(kst_cast(image)); _plotItem->update(); } void CommandLineParser::createOrFindTab(const QString name) { bool found = false; int i; int n_tabs = _mainWindow->tabWidget()->count(); for (i=0; itabWidget()->tabText(i) == name) { found = true; _mainWindow->tabWidget()->setCurrentIndex(i); return; } } if (!found) { _mainWindow->tabWidget()->createView(); _mainWindow->tabWidget()->setCurrentViewName(name); } } void CommandLineParser::createOrFindPlot( const QString plot_name ) { bool found = false; PlotItem *pi; // check to see if a plot with this name exists. If so, use it. for (int i=0; i<_plotItems.count(); i++) { pi = _plotItems.at(i); if (plot_name == pi->descriptiveName()) { found = true; break; } } if (!found) { CreatePlotForCurve *cmd = new CreatePlotForCurve(); cmd->createItem(); pi = static_cast ( cmd->item() ); pi->setDescriptiveName( plot_name ); _plotItems.append(pi); pi->view()->appendToLayout(CurvePlacement::Auto, pi); _plotItem = pi; applyLabels(); } _plotItem = pi; } void CommandLineParser::applyLabels() { if (!_plotItem) { return; } if (!_xlabel.isEmpty()) { _plotItem->bottomLabelDetails()->setText(_xlabel); _plotItem->bottomLabelDetails()->setIsAuto(false); } if (!_ylabel.isEmpty()) { _plotItem->leftLabelDetails()->setText(_ylabel); _plotItem->leftLabelDetails()->setIsAuto(false); } } QString CommandLineParser::kstFileName() { if (_fileNames.size()>0) { return (_fileNames.at(0)); } else { return QString(); } } bool CommandLineParser::processCommandLine(bool *ok) { QString arg, param; *ok=true; bool new_fileList=true; bool dataPlotted = false; #ifndef KST_NO_PRINTER // set paper settings to match defaults. _paperSize = QPrinter::PaperSize(dialogDefaults().value("print/paperSize", QPrinter::Letter).toInt()); if (dialogDefaults().value("print/landscape",true).toBool()) { _landscape = true; } else { _landscape = false; } #endif while (*ok) { if (_arguments.count() < 1) { break; } arg = _arguments.takeFirst(); if ((arg == "--help")||(arg == "-help")) { printUsage(QString()); *ok = false; } else if (arg == "--version" || arg == "-version") { printText(QString("Kst ") + KSTVERSION #ifdef KST_REVISION + " Revision " + KST_REVISION #endif ); *ok = false; } else if (arg == "-f") { *ok = _setIntArg(&_startFrame, tr("Usage: -f \n"), true); _document->objectStore()->override.f0 = _startFrame; } else if (arg == "-n") { *ok = _setIntArg(&_numFrames, tr("Usage: -n \n"), true); _document->objectStore()->override.N = _numFrames; } else if (arg == "-s") { *ok = _setIntArg(&_skip, tr("Usage: -s \n")); _document->objectStore()->override.skip = _skip; } else if (arg == "-a") { _doAve = true; _document->objectStore()->override.doAve = _doAve; } else if (arg == "-P") { QString plot_name; *ok = _setStringArg(plot_name,tr("Usage: -P \n")); _doConsecutivePlots=false; createOrFindPlot(plot_name); } else if (arg == "-A") { _doConsecutivePlots = true; } else if (arg == "-T") { QString tab_name; _doConsecutivePlots = true; *ok = _setStringArg(tab_name,tr("Usage: -T \n")); if (dataPlotted) { createOrFindTab(tab_name); } else { _mainWindow->tabWidget()->setCurrentViewName(tab_name); } } else if (arg == "-d") { _useBargraph=false; _useLines = false; _usePoints = true; _overrideStyle = true; } else if (arg == "-l") { _useBargraph=false; _useLines = true; _usePoints = false; _overrideStyle = true; } else if (arg == "-b") { _useBargraph=true; _useLines = false; _usePoints = false; _overrideStyle = true; } else if (arg == "-x") { *ok = _setStringArg(_xField,tr("Usage: -x \n")); } else if (arg == "-e") { *ok = _setStringArg(_errorField,tr("Usage: -e \n")); } else if (arg == "-r") { *ok = _setDoubleArg(&_sampleRate,tr("Usage: -r \n")); } else if (arg == "-y") { QString field; *ok = _setStringArg(field,tr("Usage: -y \n")); if (_fileNames.size()<1) { printUsage(tr("No data files specified\n")); *ok = false; break; } for (int i_file=0; i_file<_fileNames.size(); i_file++) { QString file = _fileNames.at(i_file); QFileInfo info(file); if (!info.exists()) { printUsage(tr("file %1 does not exist\n").arg(file)); *ok = false; break; } DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource(_document->objectStore(), file); DataVectorPtr xv = createOrFindDataVector(_xField, ds); DataVectorPtr yv = createOrFindDataVector(field, ds); DataVectorPtr ev; if (!_errorField.isEmpty()) { ev = createOrFindDataVector(_errorField, ds); if (!_overrideStyle) { _useBargraph=false; _useLines = false; _usePoints = true; } } else { ev = 0; if (!_overrideStyle) { _useBargraph=false; _useLines = true; _usePoints = false; } } createCurveInPlot(xv, yv, ev); dataPlotted = true; } _errorField.clear(); new_fileList = true; _overrideStyle = false; } else if (arg == "-p") { QString field; *ok = _setStringArg(field,tr("Usage: -p \n")); if (*ok) { for (int i_file=0; i_file<_fileNames.size(); i_file++) { QString file = _fileNames.at(i_file); QFileInfo info(file); if (!info.exists()) { printUsage(tr("file %1 does not exist\n").arg(file)); *ok = false; break; } DataSourcePtr ds = DataSourcePluginManager::findOrLoadSource(_document->objectStore(), file); DataVectorPtr pv = createOrFindDataVector(field, ds); Q_ASSERT(_document && _document->objectStore()); PSDPtr powerspectrum = _document->objectStore()->createObject(); Q_ASSERT(powerspectrum); powerspectrum->writeLock(); powerspectrum->change(pv, _sampleRate, true, 14, true, true, QString(), QString()); powerspectrum->registerChange(); powerspectrum->unlock(); VectorPtr ev=0; if ( !_overrideStyle ) { _useBargraph=false; _useLines = true; _usePoints = false; } createCurveInPlot(powerspectrum->vX(), powerspectrum->vY(), ev); dataPlotted = true; } new_fileList = true; _overrideStyle = false; } } else if (arg == "--xlabel") { *ok = _setStringArg(_xlabel, "Usage -xlabel

Type Message Explanation/Suggested Action Unknown Kst Extension %1 loaded None. Unknown Error trying to load Kst extension %1. Code=%2, \"%3\" Make sure extension exists, meets the requirements for a &kst; extension, and is in the correct location. Unknown Unable to find required vector [%1] for data object %2. Ensure the indicated vector exists in the Data Manager. If so, try recreating the data object. Unknown Unable to find required scalar [%1] for data object %2. Ensure that the indicated scalar exists (try searching in View Scalars of the Data menu. Unknown Error loading data-source plugin [%1]: %2 A datasource reader (&kde; plugin) could not be loaded. Make sure the data-source reader meets requirements described in Creating Datasource Readers and is compiled correctly. If it is a built-in datasource reader, try recompiling and installing it again from the source package. Unknown Scanning for data-source plugins. &kst; is scanning for datasource readers. No action required. Unknown No data in file %1 Make sure file is supported by one of the datasource readers, and that the data is formatted correctly and is not corrupt. Unknown Unsupported element '%1' in file %2 Ensure that the file is not corrupt, and meets the specifications for the file format. Unknown Unable to find X vector for %2: [%1] ??? Unknown Unable to find Y vector for %2: [%1] ??? Unknown Undefined justification %1 in label \"%2\" This should not happen. Most likely it is the result of a bug. Unknown Internal error: No X scale type checked in %1. None. Unknown Internal error: No Y scale type checked in %1. None. Unknown Unable to load plugin %1 for \"%2\" Make sure that the plugin meets the requirements described in Creating Additional Plugins. In particular, make sure the shared object and *.xml file are in the same directory. If the plugin is a built-in plugin, try re-installing the plugin from the source package. Unknown Input vector [%1] for plugin %2 not found. Unable to continue. Ensure that the *.xml file for the plugin specifies all the inputs correctly and in the correct order. Check the source code for the shared object to ensure that it is using the correct arrays from the input array. Also ensure that the specified input vector still exists (check in the Data Manager). Unknown Output vector [%1] for plugin %2 not found. Unable to continue. Ensure that the *.xml file for the plugin specifies all the outputs correctly and in the correct order. Check the source code for the shared object to ensure that it is outputting the correct arrays in the output array. Unknown Data file for vector %1 was not opened. ??? Unknown Error parsing XML file '%1'; skipping. Check the XML file to make sure it has correct syntax and form for the intended use. If is an XML file for a plugin, check Creating Additional Plugins for more information. Unknown Detected disappearance of '%1'. None. Unknown Could not parse xml file '%1'. Check the XML file to make sure it has correct syntax and form for the intended use. If is an XML file for a plugin, check Creating Additional Plugins for more information. Unknown Could not find library '%1' while loading plugin. Make sure the library exists and is in the correct location. If this is a built-in plugin, try recompiling and installing the plugin again. Unknown Could not find symbol '%1' in plugin %2. A required C symbol could not be found in the plugin. Make sure the plugin meets the requirements described in Creating Additional Plugins. If this is a built-in plugin, try recompiling and re-installing the plugin. Unknown The %1 font was not found and was replaced by the %2 font; as a result, some labels may not display correctly." If this causes problems, install the missing font. Kst-2.0.8/docbook/kst/Screenshot-kst-datawizard1.png0000644000175000017500000002125712277111530021440 0ustar synthsynthPNG  IHDRe PLTEĪ~ί}ԳٷݻྉŽƒ̖Рөٸۿپٽٱܩީާݦܠң~|zvuspnkjp}hvp}Džǀ|yvsrpmliged~a|_{^y^y_w[vYvXuWtXsXqUqSpQnNmNlLkJjJiIhIgGfEeEdEcKfOhThLbF_A\?X>V>T8N6Jy1Es+>iSWa\\\]]\_^\ZZZUTRLLLCCC<<=38D'3L124''' $7VtRNS5[IDATxSTWǭ"9U HE@Ry >kkg*SIv&٬'֮3kԘdf2D1 A$d7͛ D| "hysݷMH~R~{ϒ% aDہwqI{`{OⶱtϴCn`0#uuG4%e=姚'F`Q.4z좄WF(e *֨qG%xh%|kT4L0q.NKW^fS55iWż]EAǶglT⦦S=²fl˿Z[ZZ\%-'N8iE4gD5JdJmFr**e|ɢJ.]aK_Q͢FEu2Y48ˣ^-hqE)<_wM) 5쨵$-芺6qEmcTD*6eT%o_ۆWF7slT]^~mzU:PDIE2XF%+UQ\GJ<4zQ4SQM2:x4D 6AhSmKi S3NW] 4\!D%5YTj/4ks_78)w/~^MmR[~ -sU wt\/D%JQ*Gr2*Uej5*jYɸfD=*h\>ƕiʖfKUt8ǢN ߹Kۭ _>^E鬚`zykU*Wuv+evkPdJ&ˌ-emmm%׋Ν;'%2xZLF9 *2hxTaQKGzlYD%.&y],tu5]ձ[=vjךw1Q'W&֪du9]imrOȦ7_N#e IJe|ˋ/-?d.7F(1LE <*Qej.5*jYQE\֤┊f-jxp={ 4KΟ7zF:Nvuv+:~<.Jڄę'ίAqUmz5dT>b*j7ڣPFV5tEaDvg.REG,[d?+2g{{{_׋,kZbLE9 4y8YTYZE W:,h6hF3kǢKNJ'~͎}tɿ(v ;8xs۫c,j\,g:+jW/TF 3_MjW`jPf,oԾ e6*,{eu\N$}Ⴛd;wd֞VŽ~Ys`wƻݙ[z;xwkWkeұk׮VE_q|[ce.MkWk8v wvX{2̮'vb'kd~,zzDtwӧ2vKJe.nY>vZg~/ |{7EՃ10LOM6i]k칽3Rk'y#.g bKDtb<۽8+-q A.ׁ :bk7TE%YTdaؒ/U5Ek,T˥Ӡ&d\K-lݭ4Ϋ`wKo,1xc-3;qZ'ǖko[/8:NKy+,ϔYRU%TRYԸ2L e4jPZ҂S̲E` s~?|\~`x <[[T/gE 豮_;v]iUg%t؃ZGǪ_c(k_| `ԚI*6p~xVJE;J2ݲN5ZN҂l8XAY)5G%#*-qɢƗ~Q4:xhDkFgFja?}&k }.}ا&mk9M-;cyE,kcQƹS;j0.)+¯rZXn]SZUb jT .UL%j(ms]z"m[$H\^K#Tq2X88]:N ؘ/c}c{zĢ7b~]{:0-GzX TXfڵ{晱-]E3 幃D-?XgJjjjTu>NբGq8Sb()Q΢&*Ω*j-Qmƺ3SyF6/~*fJ*)`U<) ҴA<ԜqSZ?ApWUU)r:WOTVV>X 3< (%Ru,j(Qcj4*XK*<*ja^rz!uϔl-h1BR<<)$]h|V ݚ!dgr<u fam-^C"ߐFb =q|԰̳1fd8aY*Y;JLo@["[wLH39Z"Y+˲HܽTvVD*߲uZ9-[GYdITeY:IբcSÔQ`e?g(+}YyҾ,$ P`E$Z-+@K!wTG&s, &eU$1 fLfхܑ rr={n<لܜn-[9Xg&̥h)"ڧY|>Mb܉nlMo9ۉE4u1Y?ט_DyM-y6cY0!Rc!rlױ[a5UrhzޝC˼YZ"9 ͯ/;2Er-䕋+;˝D[hO.Yd²;w&QQQLSX蓥r~rJ+sDHlޚm&CʻO~x ˿)i&̖e#$HRzewr0lj%sS^b܉C{ւ6B1CDE̍bŲ8@,Ee_et?az9&isLҦHYлG'(-}PO~Z%O=,qdetbk3]]Ъۉ|QL#\\<3fYXNQ()PLkRdQUƩW2nxKEcS&T!9dd.)]~'%ӛgO"%7Vu\_2[&Rzeouby_fb}g}'ybEfa-g;GF1Mb]cOV}_xGnW}:Kf"s~"}VG݃z^z/~V F$尢22tUܣ YMmXf*-L b \2v ѓSQ" Fq;;gM_l,er1?Řźt>Y [a̯B&xި"{LM'G۬ԑlޛ6x|̊'i{>Ejp|2cxtL^te'-RY7W.X,vOx<,2s3R0NXIz`x86N <2,+C7210='8GaY5{?(`ቦg11mcp_$#x{L?p9ѴLOy@"}i >rO0C548P,MIM|y;A_Bl:NTh:S8CbHg1LGòL_,+<c@Xfܓ_EqPcҊISܲL(>8NTh:x8CbHdbSij:ͷe;},Ku@<}"'},18P_:t7FZ!U7h'^4Qiy";l2tfLi?ѰlĘ;},2@<}e8B3 Kyؤ(Wh'_j:S8Ck3oNSi8Ϳeb̝>/] v#,EgX1hˡq݋Ugcgh~m?}1pLu?5Jͻe;F{2cgy >f23Xz`.,nn.:ljex8Ck3b|OݘJc?y  1Nwsڻ2@<}u!XF>}iDo#Fh'^6Ow3346;Oc*|ca,1wˢQl^mʊIFGղys;56з ` 2`e, X` 2e, X`e2eX, 2`e2,X` 2`e,X` 2e, X`e2eX, X`e2,X, 2`e,X` 2e, X` 2oeFZ/eOŰ̾>9\2X˾m?NMe`,Kv2x8 ,{ߡlr<`e瞺$,,YOoe ԖQɞϞ> @-ϚVP^щ=#? Ԗ n{ 4g#`s។mc`>!l3.M زuG 4 V2b˖?cǎme Ė=9ww]|qcm`eoGX`e2,X, 2`e,X` 2e, X` 2eX, X`e2,X, 2`e2,X` 2`e, X` 2eX, X`e2eX, 2`e2,X` 2`e, X` 2e, X`e2eX, 2`e2,X, 2`e,X` 2e, X`e2eX, X`e2,X, 2`e,X` 2`e, X` 2eX, X`e2,X, 2`e20:XЁ;&se2#nbPƲ!my*ϲP~\IJ63ť$7N^'!-[4sʍ׭[Gv̰7j1I)_@?ʟeqҸyqx}ai dF}VW/M_Nֲ̝+6E KMZaYL]~yp =>ZVB[FGI*laSsٲã2"VgA##W1k=P#Ӣwd,#$#[>;ByY-7LMLHVO#nB_1wVebiqևG&flLQSXHͨČ lUZ8IHa[#g#6zkٱk ߵw/}߷ x2gX:MVҞC봤^e Il~-S]gMt߲@eeBZ=X_!e aÛ@0 |,C_/o2enIJ6<f7_c,+yX, }PE~7s2}4@AB@EJKKKLWSSSWVY[_bcis~!PtRNS=3IDATxoG'<6?$!@e/pUV(7+Y8&0tEի&_NjQyt[ |OS6M!%ˌH]S&`fIӗb`[\\d\QbS[&[ٽ? 2kx|zw)r1i>Li[0"Xda2i;f72¨"~zlFj6s713e{6j1y`!O=@b ~fjjm[~~ f25eqbY@L ؿNBٙ6 J2q`FAII0 5Dן5CAIG0 CAAPj{ HeyH0`B?6J}l@Z.s?=_٠ޅꮞ\'oviUG]{~8xAzA#kӅX J"2wmGZи?1\M~xSUD;}2cD 3ӟ>,gƲ.i:y6_zc c0V?^{*6poʘ:΢{PDsR^7+~LZus~ˤ/PY +VH3!.`7?-1Jg.5>4Kv(q9 lo /^0n< 9{'u)]\Tr|W$=w: ̯{ソ듶:$֭^{9T1KΩ=f kK8}xza+%GWi03VHdj :0늤>&3iu?`Yxu\/?D]zlA}U ?b"oj9iwEC;;n;gzaJӚ>W+l-r$̊[Nm#amɪyvU:,OTww;wHmS4bY_("ZnI|W$=t.s{O!Es;%?uE^QDߒe*OVb$"+   `( PPR0|DEɓ2hėrd.`Cm8nQzr=0Bj^Eji0v WGʩE>omt̋?-~ig_,D˿?@[okm;~j%ܱcBz%RZIsG:VVWVVVWW;ͺchmm4„ mj83W$6f,`yL'4ԾU߽ۀuvv]Fmhknl<`kՑȹ%6~JR:幈{SVHW0|xI[[=T-`=ymQ=&꣄Q?BKQKX8b},e!ԥHY)ㄆ w6`{,_i` Lڢի1js{+V`؎<9g/`-=Z)oSk6I3ՒTL~[[kvמ=%z=Tf*L(g" m]eث2xC90@b0d)SfTf"qBC{?rHǞG ^_{4XsTv629gul1@uʪG>]Z--JJ`O c/'Z>n~$Oأ;~i"MT1n_"YnBómr 2Le$ldh6h3P#/Ca>Ofk8m\ eLCM)_K^OfiW{`}1jc)tܾ=}~~kDȞϽp7.q)R7A[+]&%%N C&87)t-:|7[>ׅno-bhG„n6k# 3@ ̋jڇ01iYq(C2/'!C#ܽr&e")_Z  9rn?3߁H =+uL>z50^x$qV}-=k0C7:/m+pv%OE؞ۇaC7fM^̜X߀Pc#u&:CuUX'1GO31jr 𚡢[ 9.;u{[嫉+崃SXdMR¤H 9S7,.M.k`=Rs/QNE7]j38&[n_VW`#mذ=_n} X#k ;Vh| Ac&O5xI"l8 &fmc4Ў`B(B{?: q{>ؒlUQy ";;o^޻wy0ӡ _߼qmk kK iS`B-a]}u͐ykgz(a{{:v{ȡ}=5jA`45as isZh} oRu0ڙ3gC޾^F ` C^T|0ƞI-Pj;s^&ț){yKXH띓/ߺ1g5V]COϟ_^/{M$do6yv\ a2$5|tÆ=l~lOQGK J,߾9{g"Fȥô9Df Z m~F7;x'B2`ċ5,VH."}3jmVd7nqL_\θ|DRuU"nuZ#TQtjpZH{4 f{//~Kwoٌdii)W=Bz J: h`=`c[)e[c%T,ZZwdin9lWQXRμ> ֣F(K{5{"vL`Aֽ޻m䛀k99lXUVJmAO4<0sK/N~wkZm{$T{`%6?g?Y>gzd}/9zƘDkN0a(65mPG$y㈀ܻ)6x0ڒf\C\-rrje5Ztw>u駩}K<`n׺W_`/&hP\mx=8~&?`F.?s#G{q~cyҰ#.&rtt"(`0<Ͱ0g=nK4p}":8nW-v-RڒoFk(mxp\+y XnNM/_~7ޤL. r=.^kkO4J f&Wr>GWm?Wdltl]І l./<>8?; V~ `̇fL`a>#VZ2EqXs:14MzaanJzaH; Xy#Z]3O/ݲVZkiQ?Pb`~%*2S4{,li^Zϓ0H1Q{+ ߌ\i7&/h-Gwۯ*j̺ w_&";<,8LXg-T%ԽJ7Avm>GFN<3sZ6ELGɛa"0DPPg %$,] U, %iaYFPP^EP0O CI0V9-;y'+}6730$Bj(xțD).`N g#(8 P1Ĺ `fyyM&r›hq'\ J HN?9Ce)4/ Mb9x՟,{`2 Fbׄ>U'OΫ?.["`Mds@8& >N<:K,/q7]ͅN~׍EI\ Ғ "(( I0+~/M_dE$?Ly.B&K'9_nbr; )9`&, `ރ4`&=D|M@Ňy˼hEQYFAbUfXzLSUAWRbD /D˟+8?)W+:}$ɺ$!*u-M0y&V`Z5 Rڱj"Eb(R@si2LS1,BJ;9@. 5'*J =2(VGi)0J/`Zri9LK0c<L`)`Z  H`1k0 X"C*m@_siU3A P-:, x,jvV `Z(`ZvE`ZӲL`,pz@ DƃL+:`1,f ,E1El(`D POi "J[ UZc{ŀiL+`@bW% `i_1`< 3L0ҲLK )`0+ }ai0,iZV#Z%X蜀XEDrX2LCX#Z+#g_LJAjEb!`5K 0ӲLK0Y1XK@:Es>Ӫ`a+2FpQӀiLK0-`Q–ƀs, IGXV@7V`2XH@ `QӒ\FQHUKfD+L5p/S 2`Z4 H2}Dw(-<KN~D"`qY+)VgwGѲ,sHFR0X3`i?R3p5Hu#T0R4+`ћ)HЀ$30>`H1}S54X^A$uT#9,n" `,5#e9<>y5#Ih #X)`u)$``%[ Ld>LkE KyFrX"%OE 0RS G*0 #5A,$lM 4XFPq/(^X4JT`ћ)KFH,{HـCXlFHųL+h(. `DI07 z JwZ雀T) 000c) )I ap"~FZB,D3v4#U*#~C8hFMǽ>F2>*@Aό{%`n (YP`@d]"(3PhuM|e|hgTy-ҟ!yrb0QQPL6`vGTV}0`(( I 0R `(9\H #۫ J 7(`ṣ3Y,LJ 򐡹ѣXيN!`X 9\]6S `( ZL^?m'c-z 0$D .fN+ [ I>=a r\-NO˙s8) 0"8LF069 F!w]{w&pރ!` ;6X `( dzDPҩ USZRN$!-a(1$0 ]Gw]v9C{}V{sbP`"B!<e&B,3X47v!s1 5v Fq|0a˫TIz0CQ XM@&HH}\Md)8;DZ`0q$@'A{ΎRTג#֥`WJénQ5 pM\zPw`EJT PÙ!` TEK L$@3J=!'C$KZ=0@D #lkfu6S `6Sd\iFdN V `@0,]  0 CjCa#``}0UAX_#⅀U䃡>XTp B6PC|0$8dSQ&A=4SFE0(`e\M]L^  RT:0fC+SN>`SZ>`?A ;Llv.NNc:Pn$3JҾ'`@vN^D> .`@$Ifb,7< a*qa}0W<%9pEϪY3۸%'r`.ܷ=go--wA>EsS/M@11Q=,tc(sH?/JE*fN0UBu¸#.|ZoW$ v|ONtn@Xvā |Ϛ .|l޾|)i!-T^{onF8u > 0H#dC;xFp4Ȼ% o P#@: $u;!)|]`G|O2s4E׍CR`)J|`XuC +*x!`LDC`X>QN@G@&+#`X$'u9'_[cޝL LFowl@P0 CW>#S0*Ŀ+ fb!0U&AUT:/um  , .1C$JQwB!<&Bg,!cCX47v!s12v  Fp%B&&NQ*"|*㓀 \;*XHDm"X$'DL$t/8OQ XZq `hgP Zq[&ea?0e$Yb/\(?KE^AJXNA2|TϒF* ӄXl3,  FI5](`ak*#`XE>X/k@4T|D *mG'`jn,oD0a3Eq\V/7%`a=dA V s"`>X1|H@'$ͧ 0B4` W >G`em0`P!`-U;a3E &{+˾nM$Ty]+(k rX(@PP*qQ* 뀂Uɝ/`̪Z4<l0>Trx|b,]0D)6`Y-DU0pkTTۋ1^bi&b"`,`V`ҡy6Di@C0:`SQڪ?l|ܮ<F%w* R *T}V1 bk9RB֘ 0(06`ho sB,_5`$9@V-0ksg:- )J\9`S&`v dN"6P Yܨ8CEB5S]T'VJ#e' VQ*h*%6X _j. 0pQ` Ge}T pE`MxXt8`-~@ B=/)`PUoe/a»~|` [z5 0F&ze X]/>?Z=f Fj^ A[#Hp@= |60 XnhLzX(*O,mN~`?f^k&(cM!G;nHFQF9`|e X"ìet "zoeHmP8p"` YcxC Psj x[]̧X)RB`꒯M_Q&4u D),udw?5 AFe `k Dt۠ qѢ[Z]L,!F2hQ)`-| YEKQ=ptHڔE*D`8at o,oR qVyaQ\|iarJ$O^01`"B&FZ` :Ă (3\( >;s ^_kωE@#LUAuT z7  p|WVO?q\YD[E$W*[9>xS;%N4YB(s^Vj0RlD` X$p1Xz<`°@-M-\NW"B (*1n['㜑Nz,ĀRݚ0|&(R1`i7dѢφ& {WS Ldj`P,sa 3ʹ'?`iA"?" &ZW 0Y*u+ΰ;"7^WJ-7TXuPru uҹN3:G+ BM@ XsU|O##Ie&2ަ0`V'C C V'v0TCAP0,_煟2;x'n]qzg!!B[}>dNg3gVo?`$  ^qAaQ|l+ 0,YrpX`_} %ayu% %a|9"  `(Uw(Q*zNlwUs C0 CP0 C +6|zHw;Y8_>>nk;Xp!i{w1}]x=ʒ3m;FamkpV {צ FA:CuEqĉcں"`(?I>|=1 z=|PuÖm?Om6[k8*QŦ`X P8|5G ]zu}N}'O|<+?`j~`v_^7q 8ܩ;go*gvi:䃁{ B V4 f:h0}[2';<`:mZ]yLo³47_ɧvPxP\C?<|0o+Ρ]S5wrmuqM{?|=V0XSӺYsu.+m{̡G`u$teK~92!Xȹ;:E"`!` `XugT[CAIC0 ;, JJrsB>GAIM~U$JIENDB`Kst-2.0.8/docbook/kst/scripttutorial/0000755000175000017500000000000012277111530016666 5ustar synthsynthKst-2.0.8/docbook/kst/scripttutorial/simple.js0000644000175000017500000000101012277111530020505 0ustar synthsynth// A very simple KstScript demo: plot column 1 of a file vs line number // open the file "demodata.dat" file = new DataSource("demodata.dat"); // grab the window var w = Kst.windows[0]; // add a plot to the window var p = new Plot(w); // create the X vector which is the line number of the file var x = new DataVector(file,"INDEX"); // create the Y vector, which is column 1 var y = new DataVector(file,"1"); // create a curve from x and y var c = new Curve(x,y); // put the curve in the plot p.curves.append(c); Kst-2.0.8/docbook/kst/scripttutorial/scripttutorial.docbook0000644000175000017500000002000412277111530023314 0ustar synthsynth KST"> KstScript"> ]> The &kjs; Tutorial Barth Netterfield
kst@kde.org
2006 Barth Netterfield 2006-03-19 1.2.0 &kjs; is a JavaScript binding for &kst;. It offers full control over all aspects of &kst; KDE kdeextragear Kst plotting plot JavaScript
Running a KstScript &kjs; is a JavaScript binding to &kst;. There are three ways to to run a &kjs; from the command line when starting &kst;: kst -E js:"loadScript('myscript.js')" using kstcmd kstcmd Attached to Kst session kst-17704 kst> loadScript(myscript.js) from the menu once &kst; is loaded: File->LoadJavaScript Note that with the first two methods, any KstScript command, or collection of KstScript commands can be substituted for the loadscript command. A simple KstScript Here we have the 'hello world' of KstScripts: plot a curve from a file. // simple.js: A very simple KstScript demo: plot column 1 of a file vs line number // open the file "demodata.dat" file = new DataSource("demodata.dat"); // grab the window var w = Kst.windows[0]; // add a plot to the window var p = new Plot(w); // create the X vector which is the line number of the file var x = new DataVector(file,"INDEX"); // create the Y vector, which is column 1 var y = new DataVector(file,"1"); // create a curve from x and y var c = new Curve(x,y); // put the curve in the plot p.curves.append(c); This script plots column 1 of the file 'demodata.dat' vs line number. It can be run by any of the three methods from . For example, kst -E js:"loadScript('simple.js')" Simple Output Tagnames and Variable names In the simple script from , we refered to all of the objects we created by their KstScript names. This, however, is not how they are refered to from the Kst UI. In the UI, objects are refered to by their Tag Name (or "Unique Name"). The script above did not define the tag names of any of the objects we created (plots, vectors and curves), so if you try to look things up in the data manager, you will get cryptic names like "anonymous vector 1", or, for the curve, "". If you ever plan to use the UI to work with objects you have created with a KstScript, you will want to set their tag name: x.tagName = "xv" Once you have set the tagName, you can use it to refer to the object as a parameter in the built in KstScript function calls. The following script does the same thing as the script in , except that it sets and refers to objects by their tagName. // very simple KstScript demo: plot a vector collumn from a file file = new DataSource("demodata.dat") var w = new Window; var p = new Plot(w); var x = new DataVector(file,"INDEX"); x.tagName = "xv" var y = new DataVector(file,"1"); y.tagName = "yv" var c = new Curve("xv","yv"); c.tagName = "c" p.curves.append("c"); Writing, Including, and Calling Subroutines As with any JavaScript environment, you can write and call functions with KstScript. Additionally, KstScript posseses a means for a KstScript to load functions from disk. Consider the following example: // subroutines.js // plot a field from a datasource in a previously created plot function addField(plot, field, f0, n, datasource) { var x1 = new DataVector(datasource, "INDEX", f0, n); x1.tagName = "INDEX" var y1 = new DataVector(datasource, field, f0, n); y1.tagName=field var c1 = new Curve(x1, y1); c1.tagName = field plot.curves.append(c1) plot.topLabel = plot.topLabel + field + " " } // create a plot and add a field curve to it. function plotField(field, f0, n, datasource) { var p1 = new Plot(Kst.windows[0]); p1.topLabel = "File: " + datasource.fileName + " Fields: " addField(p1,field, f0, n, datasource); p1.xAxis.label = "Index" return p1 } This example contains two functions: addField() reads data from a datasource, makes a curve from it, and plots the curve in an exisiting plot. Additionally, it appends the field name to the top label. plotField() creates a new plot, plots a curve in it, and sets the X axis label, and top label. The following script loads subroutines.js, and then uses plotField() and addField() to plot 3 columns of data from demodata.dat. Notice that subroutines.js is loaded using loadScript(), the same call that we used from the command line in . // callsubs.js // demonstrate calling subroutines loadScript('subroutines.js'); file = new DataSource("demodata.dat"); var p = plotField("1", 0, -1, file); addField(p, "2", 0, -1, file); addField(p, "3", 0, -1, file); CallSubs Output
Kst-2.0.8/docbook/kst/scripttutorial/subroutines.js0000644000175000017500000000125512277111530021611 0ustar synthsynth// subroutines.js // plot a field from a datasource in a previously created plot function addField(plot, field, f0, n, datasource) { var x1 = new DataVector(datasource, "INDEX", f0, n); x1.tagName = "INDEX" var y1 = new DataVector(datasource, field, f0, n); y1.tagName=field var c1 = new Curve(x1, y1); c1.tagName = field plot.curves.append(c1) plot.topLabel = plot.topLabel + field + " " } // create a plot and add a field curve to it. function plotField(field, f0, n, datasource) { var p1 = new Plot(Kst.windows[0]); p1.topLabel = "File: " + datasource.fileName + " Fields: " addField(p1,field, f0, n, datasource); p1.xAxis.label = "Index" return p1 } Kst-2.0.8/docbook/kst/scripttutorial/Screenshot-kst-scripttutorial-subroutines.png0000644000175000017500000011324112277111530027760 0ustar synthsynthPNG  IHDR`B^9 IDATxww炻+S  8PBBM=|K0Me?tI:Nb 4;wg_̮_=X#~cqIaHz .m21111111FH8[ .Udbbbbbbbf=,_K |`&`&&&&&&&hjjٱl`LLLLLLLLz?~|ܰa.gWaO,$ϔ|}|L0OeN0 6v]~O{wˉDG tp5111113{N$ ֬YìY(ܵ,ee:>,.Gx999T!Dd^W]v$AX3Ba[T u v޾añ=;2N{PVn23Y8A$!]{ !l73{zLeǟ@He|5^BUۑzLN;ᡰ5L] >Yi&6 7bĈ[׺o%X}Y$B@ z;S\Qh#Gw=dxYmsH;l? "KYwWfbbbbrU&`UUۻ3b.ԮIm%KY(4_}]#0lyYlp|1x0lr1Sr-A!@H ou8hj؍7-Œ$7O4&n|]}.76"5 G :"% fx#`+WbڴiԮȑ۶UʞX.H%L ! )_[LnxM$IXfI(sC*$X8Tl!kIbs J9NSEe8 "[:$ I脂aTU !X؝IS`:Re>l !iBie%.$@U1ړ)IQ,ܮ-- rLLLLL<3e[MMMid3jHnDfkOFƍb 2( a ~~I'O$.- 58rrx rslhjOcR innmMs3cwnc𷶦اQFS P4!(p |\J㋬MCZsKwYj^XQ~tdE&1#d`-m~4Z<u:.Wǁ0vSoٲ5&+ڕѣGJk,nBt]@0.GGmSZ@״z)EafF-46dp,4MbtڮkZکQ0bmmO쁼2*|aHq[e¾Y`P 7@`&`E"bA,ȊҞ !yy8( ~-Me%(tҵ(}nIRLd{Od1cF[bߣ׌GHnشi3Mf;G.,E?e%7JTE.V ޶s#Ԁ0 Rڬ(rv nSvGP ( Ha lTz1(ndiB_F- :HGģ(JV!6P|B~B5[6Y"d$ 0Hr˵qv3GLLLL<l5`7𽨨cXnFEij5Ua~wn~rKD #.HhHi$8$Yjuf=9pׅZXZ (@Z|8$؟7Y6<6lťXJ}]*'ߍ %nQ:=6~B51111fȦMcb6o#=J$ ZnH|t'y^ &~A#k1VѮ4&Ih )$EdIN*oxRT_W?:e+I2B(@tJj#Ӣ.' fUUǏ?I\y9|Xd I |xeX'ى:ZZH+ώ:YobbbbbM?n]:%`FǍ;8VinME XԲtoc׮FA=jEBmv! 5H Y]Jw3DQ\}n0EP4t8P ;n"ӦF2,aR&)))faGSH%B")6 u+Jy Jm! B0֨.#`ٳg۝n=M~? 6C!2GW>cuP/1Ҏ$vP!΂<4kn!Aȗz'Er:GXe=|B!@yyiZYYBt)++J<7m $*邼'h!|;Z0~Tm jN?SeIq<$Q^^AnnN}X(I9%P_אP$6X,>!!@"!aZۀffbbbrU0axHUc(B~djQGN-[{mzÐ1 ]%7Dzѳ5UTOc@j4֣2J/yC+$Q[[ l eeB "WRJ(t[|F*KRsQېmcid;yzjsa h X8;jT X t\7.ilBDOvfI$**3no!Dʶ |亜䖖`@FFjoj/5'h斃|7Nf&=d|ƶ3^o}_WtO #kzV{F{JNq ޚ&~M X-VllK֮]wLI L8 ע` L4 ^K'y@*26W^!nw_~YRM1}&MDNqp=@-y baE zZ>!҄;7E'^4a[fML}}&MbQSDNaqây1|#00 P,VJ).Aڱ:,u@Xk"ŞKe/ (l`۱?GJ: x lnwNB理_EXe (pݝdVT`f*)r/!JɞG@oY`Qd%yn,}>rrr츥=G=`qawq9: Iȱ@nn! ElIa&`oIlwSdltD$*++SnK_i}dEA+($!;s)u&mIC_Е\WvoJ$ ;?mX Xs&`&&&&&&&_ lڴq̍7_$I.?[ {$+7̼-_=ffbbbbbb ۅå'ltJZ[[V611111111ɞS$X⿴r?ޯ|YhӧOKH,*z<ĤoH%Ia&`&&&&&&&& a0gd?O=c=TLM} R@۞8uجm-wwȱB 6yA*:_7)uobq歗1c')Bz ![ni ?ozy!u?q 3|6\6x6/9/?eࡇ~֡x|n]cǾ3%.<OA555]Լ2y6}ɑyXøjf̳QA]lK8,?\NgyXU?*$csލY( P0lG+R)|>3_q-eEq gڴ)BĶ !y֧;RC`ə{߽kO+/=!'qvY.<2b}G}m G; !(S<ݜpMv``/p0Na~kvBsYzӧM'X|fr1cm:ڨ%Rh{=|QXu}~wp7׀ !0ڣ|'V@BvߑL>Ua`F~;n>,3v>ze>G0|Ǔz + qݩ{7'߀?J&*?l13ۇb4,t];s+a&-~N틜>$l~N?V3GW8fat_kvwe9&Gʄ"[&[V >b=j?y@6>^,W͟S:d;Žͪ9罿'Nԫ?2~߮.ͱ7y7^AIMS&8R?ҥ_N~C?s !_nOb?dsCoc,޿8D& 7o?:)ϒ%/pȘi|'1 Ϳ{ ڻdr G^P[XDItKb؏=OΟU=+A{qߘYIyՍ_<4>,r#L_3}so^&3z&ѥL_P 8sb#Psե]fP"v"N=,,X͋jY_3ٯ7}克88|!x=.Qv,ᑑN0p8Zzn1"ic,7 8ۗ62^})_3<nE?Ǯ7~B>"’NUc ^`Ν̳Y &Ǟuewft=n+9-s%pءIҝOrz xd^"I1tciG5||,v ;,q#3+?vG;ŏd)*zv;V M!⑻9 qBd,YZU,Er6\q憛'R5|xTdǎ?Չ+:}}W^SLymnkZѝ}ѲoJL Llw*xCނ=oEq eS!]o_؟<+?<hC wշzg[}y66,o-4NpglGTNdazF::a%qvo#޻qv;}lLͱGI,h ~''M1Gǹ̮_l$w;PοPHx3XS&6ƹ,]eQc8Z/] Gpܻt.*2ҵ .|mZK.3?;~6k'q}<}Sy[Yӹy)d_O&չГkYekahy޸B -rlCK KCC3ؙbMAN̾:'ϱ%rT^b&H)SYo7ܾx;|h]L _ ]M'h``9㶋W@"guFF ]5AF|U}o&5x1nߎVd!]_ڍ) ˩^#NF$׉ߞ껽 ѿ'ekԝ+Y_muQ)\,:onx4?`lW]:-ۗ󳅧s)<躎-,Ēmo%ؙl#v~y !?x3?2{BN*sOE!osg4t]C{ɹ587 M]3|>[9Æ cYp㖉?]ٝ+n'CӖ?Q]?.jq7 aT/ZeF/] 뺎;pSs!Mٙ32\Ū1γg#۵NlF}4Wpۥs-31 O+\$^;O΅~&9RՏ~7/#2ޝu ?tG7㕊۾}{wЃUwm#cSֿ`ruZ>ww^5='L=ǝZ IDATUYG$:uWV8\7~lڧ@6#8{kwFI>yž'YW.@ics**EKŕwyiBtkwW]"CW?ag<|s|*jnk&,~k> UMY/:xX 1i6žOaxhzN(t>p^8!ݴXL쮟=:eDW=s#XsDyt~>NunΑ7!D1)'΃/|@i$۶ɶMU o"/"#_"¯dj3XvG*s ys@ <}wTG:1oQN!ưa? dss [md&B.?Hd=#EEy̜9tiKw:.BLWoC~FFH?6 Z(pX-r`s¹Ew]P(DyyyV(2I3lnnNY͖P&sR*ϦWXXg${;N!0@hjj?]?~D쳦hCe`"o!'|T%O(x̝;uH10uPXE TMɃ`}L7l~U NJir+ǻpV RTzl ;~9Cz$[H q{xl»aM-({JNEҳjjj vڅjMcN~8/ &l6P(p \.~?eail2f̘q@˖Ϧ.]ٳ9.lٝ˕N~ʬl8P+g U*ҎaƏ/TzTWM*?`RP_FuM+cQdڼ բi:%4TUGU#wi``e vHntC?BzDhH!%SL⭷ͼyқXzVV֍fwp_~b@s& Pݤ'^_!)ʊ>6Vv,R;[9xP+!Ό:l@ٰ⚧h ּ29뱕}ZI>\.WFD+H2Jp#2/ͺ?^̰$e'8j($1kK~rJh|Dجu:>DUKYÃ`^vV_rYx6a֬Y~~7{6mV]ݩ# msPz/p88J_\|>޼~55lz |_8X2/s#Y5=RYmB'@^ۯ>}x lkn:t]K|@AUYI(bRN:iVtԼc&IZ,1{{ԥ;c$|z$`ߧG{7w aYpڒ簗Ţn1x` 뿨eХ@moxX!s8yj. 92#65e K5s߫prP~xdË\r%kbq LV՚U<&'_ )ض6=!uyj)IO?QF(orǭ 5𥂔': ]IEyՎzAJZobeHupɝ/ڸ1򪪊ꉾxCd*3*I1Bp$Œr1iG+[=ĻGeunqMt]%D==z [v@Pq1}q\||> Ubqasd-3VDO>0υ%Ӎu YrrEDN ܹGxika Dٴ(ZXΝ!\n\ecSa,SgŢnRRacÖ}UڧvT78+9QV8jxaCTbw:^=Qu`=fuVW_Cg H?.3Zja[}ĭ)-92a:RZs:y˞ȾH֭^ͬ_&8c~k.aa(0zLGpmnXR, YKmM͜qtaT ;UOeC}ķG~p8P U4ȎәTdXQՎUEn /g`yaV/5oѠH|醁aT5a=Z]ѯȻ,|Pޛ|aaA#NcއvYE~H%=~]D#ݵ]iUkvqԿzbXʙ39P+VDu] b8VB־V0uU+w \cXf66lp+n\.dAxAnOd/HoVә1 +,ޓ樒 '7ׇ~HkV1-. .uo͐쳙e 'TUe>ndtԴ)_H jv} lj&4?Gdi/۫q$-g444nC?#q9r '@}=ZLwq{iJ;}7;f />H1T|CFGʪ2xNM^& M;=?/Yо/q}ovq.9\âӏIDӕ+emmW_j]-??O|im漊 6>d d#Κƶz+ae6=uϫ'#`CJva :50s3"T}3NY'`k'„U Y$'ΙHeY>E]FkSh6 U O0LX)ME"2,sih&[zDF2}#YxD8|ީΆ?HnKuXjrh~@7~u|nnF%t] K2S DoCM۸ !NeǦaQc\%Ba :p9X, aUCvB'AVWM 0eTd5DW@vD0 0!Pa׸~D3xs|Yc( ܌/ )N3wb(! ?}]ٳyp\ve^cccCwߌmZ3uhN;5yx3gNZ}$%t_&7AA-ua‡"3f9; J ] UeԦn㼡CھM9rd%[lY.O`V\Ša̘%c<9!=b-[ >;{v1/,mdpH:Pޗo Vĕn>Lzo"(*!5gqK&Z/\ateGr>s|3a~3g2>\j.Ƞ&$jU!4=~N?X A]4ۨmf5EfmF~~1yyǒ/-. UtMCdYOVQ[´ib}wdbW]B!.w㎛ޭlP;'3ypXi^?6 曫9Cݙk~F-EQ5`(@ Rd=:׺`?a#lAskae2c%Nsڬ,/žnTn?d%/٣P݇Px%Rp*R@ @ ̹;sC.xYTb0wpGL,&;p}6mo1'u%`Hت% ʾc֭LZ' kՌ1X;\8S$Ӎ]w?CfԂ7e!!3&;ȝ`UkDB 4MG#wC!g޼HwJv*귝d^[*>av jTrrK)ph4{#Dx:mܦ1 CF$j[5VΧ#rQ0܅=tK.,4 Tc.FlA|I#-a(4G |g炷~*o Ζ4ȁP-4`O7 -bàQtݱ ޽n38W^y%ͫ -^ M`iÑUUQUvg>n' u!O. t#\1U3hnhu`UyIxXhڦM4_s kW^cs_$`EbBa"lVK<*{t dMHD!8{v1{}/VחxC~u*L5:zKEt1~,=m&VF=PQQq~ȿ/O9ﻏ iF_5+sL ^3ٯq-#Baa [+w`a\_?0sjEWoY a1B:2?a5לWԥpX#j$"kTM'jF0 ik „B*p`0~G~_uM4OǜjdQjb |uu5X,9hBa3it6nرc۝].b^%mtwI >zJZe"iVmk8ĉ-ÑL7ޖ|;tt٢44z4=Ԃ"ZĢȴx5^`8O]K4Q^98l2}BWPbhEDe9|,(upmPv<)r1yd=yZ]yJY$u9;Yg2pO V 4Q2}>{Rh۶mpHױtM̝; puqAi0ꞻ } M\{lsPXU;F1fC`0KӡKc_W= :tZ4;kT~[kG~? ,`̈́aEP #[X5b]t?0:m<N QK<~/kiO2T~Sň&a¢ȑ/gu;9U"ʿHsY8jb>|13}QUt:KFE#^5Ki~=4 G<#+ݴ]+矏O=0;?gݶm丬}Wd3K$+5͑:FC/G#`eLj t =hhjvF:8֬nE%3&<)H0p9mgI@:qXd ,aUdB0B p$^:`uǾkT_.$d!5W14[6` xw3fLz;]% e6OtQOIkǺu25ѹNDv"m % s,} aHq̀OW)4z#6jV\V"(+jx|:B[+GSga`Y$P$†`Sq#=jx*cǾf~_s2av;%+f7f˔QK `S WۂR9|7//?>كݖ~pp5 /pv-28ia5[w=&6n NAA.vƀnE梦fPuP$@c!jAuC^[^_ba!{.o6,SZZlH^/J^رorΤIbz2σKl5%1EIN~Y@H8s>Y%h >Ub}ϓH~o[.6#9k}9\˟bez?̞(KU/+=]mƹ] LiQty ur}zxrU IDATG+m![/QaQ9QduJf$ އ||+̺"gJ|-ͷrIcƓ3NOWvDh~qFIQ4*r>z.r8%IcsEW-cĿCH D۩pe̛s_UoݥulY<:b FԷACo34ZtCToR`ʫs$G#`)G'`# Z,1 Ä*`0jA4B06F1J,ԉW^o;:/ŽFJOwwI"c$`ˆiDL]ݭخ⇫qAeDΪC a-y{z[C Ss6\$ς.Y+xοZ|aMA"J!wLW]!jpM7qeqa;uO&%@}Ğ=Lu! @5BI!4ݱ_XV;|;dz6lG1hn>2e w_B RWP( ehvAXڧUU;oLL-\- H+UUUk=usU qu7'XT@Q--#MH=L6d2y ՘8qz8o~Um?WYhnbރҧ ~[ _dp݇Psȃw}K,Amm-;{; WYpGOu]~Z*l7`^Z y9 KM ;} \_U3PsoXF-I= F/w*{/v^~9V :={O>xq뭷矇Dyy9\dzgziK҅#1hܫE+q P>^| >W\GD~ Xz4m dtأ l>=^4 \j"z9{ѿ];:^n=>x=^Q={jC t=Z%Q egnj ϧXOE7.]ЩS\.`\Ae!mFUZTWSE!t$5m$2 .x[HeH Q< v{C|* U=MdW9X^6EY7Lf_t(2# 7zk%V(о&koB݅ygqlܝ~A7jw 5)GD\iL~}Xv-9\'t peCصσnř 42* 6gN]1`92e ={sN|a#uL1@C"edd@ph(|?*l]_ Et=߳Ri=zw\L7]'z5x=ؾOjDQ֥u“O>'[5a\eeO>9t=浑- ~xv۞c'e|gw3PROD!QK}AJ+]^tZ#SQw?[?~@t 8=я<+=knnԩSqcpݱ%Q(p͟ >Yӈs~/">IX]rڟSa;Z%ڶk8o&A82@g 8A~sy<8;@$c>z~߭1oBWoWط^݅7Tbոplѹ3gχ,]n-t p\#Z\!\i{~p/__~8a}tzNlRE;?) |v_ CdeZ_d+[u%A?Gχ2\2"uӦM?wy'ٵ+n݊:JוKwǃ]^oPdE_/<# u}0'w _vTChjxgODWa:oGWfzQWׄB\p77{B7Z `_3t]-?ϵ-qǝزp_n}7Է$^@_Y+|A~Lp` u'{o2S| u :>)ktitjuk]Np|k-2|9(*Ȅ ^)q3%G>?N ;'ǖ ZNz:&2f^g.xvznt >bc7wvw>'@s?bx;EE ƌQ{-бcK}C^Wu}1( 3Xmcf/u/t Y> P׌{nο]ͯ/|]A]M/2v/(jpJZc ``SjCǎze|۷/-[QFF°aЫW/t\|>ᭋ!kd2t< Ϛϕ\|!R=u@ 6]\j%ߋ6&7o['n7 nx46xv{Q'܍ͨoVzԏkjFcc`xیP kr[ U9o $fڵSc((AY!-@0h W瓪cLly.bVKW۩ //ónuਰ zֿ 84{6aj ̌n A 0n姽رf/vCzЌ|U76 O>ظq#:v5kओNRu-0|b<8mqZ<02vI&ՆZo6oތz—Ė-[m\1*3~ <Ԅ{]n#T}9=Ѱs'<2N; }XN.tLɀKk}GqN"AˎR}r/=ͪmգMB!=mw"gm۳T}=;POKZ7ȉ"/̯Zٳg\}ա/^}9szo>\tE_:u/[ץ΅.iCr 0%7x}!9WZqhuqt pzE|Wzܨ?x>uu5o:c`|P- pb <`̘ߠ0cƜA2,S.شi; [.}Vv)x~KR}hoFV@t}^jS&pׂ;!+z π#o`6/Rw)r3FTlb@Bti/}\Qv ? gۄ^١M}}=rrr[-=t!n Em̻ xj|}cԒdtruLu,tt,JNs`}QxWatX]].@x}MLi@vw? 7ٙ_CzGi>uϣ]x+P_dO rt\3Á׋ʃMݡ%n`$jս{w,]}W_}QF!3Sb^̓%89o4,|>N:$QGJN=TTTT`I$]rg߷ ?tMkѳgKXh/|ܗY)=g jӳ}EoVoJgaMaƬw]DyӧOӦM0)cWU8~1C~>O`~^~?C}q9[G*QQCMEEE=DTUաѮ].:wN} 4ַ$Wc&sVTc=[󇅅׉^)"x;KoAntUvNbl! |#?SD"Q]| _AcOcԨQhjjBccl+XtBp8 Ђ>ز7##Fְ(ޭ[X cСH-c<~Eز^n݊N>*t.dff #XzlnnFAAlQѧOÇo5# TR_sIWZggn}S{{-W׺}%J2%Lpxy硶55552lܸJRɏ?J>_`Ŋ8ԱߺukT ZSCy"HʩE]{ pd OQLW;om^{ 5558q"pp@hp8"ZWx n9#p8z}Xz Ν_O?y ꫯt͏c=VxקV=jt{QuȇC^Ĉ9/'p\-/-[p>lͯIy 6*w1b8 CV^;( <8/w*iFDDD[21`DDDD믿`mjGZK&b>R}-?_""""Jqz,"ui/B""""J1Zɦ盒 `DDDD1 Vz/t]PtEQĖG^1Z2lj.OIzT?GKǛ6?DDDĖmۢ<n+^'߆>s7 .~ ݚDɑ3-s3Z(-ZzTq:x{! ^}(锏_/-[˗c@裏д #B78c>rz%P."~ϵ^) %_f>w6b]_beK Q1yWwu#ĉ= [^@[tP9y |䔈GH>xd W'b1cwZrDQwF1|VQS8mCuDDDĖ-`.OjC;6a蓱jyR\6:b+b̿\LT.|>nj[`mڄߞ: 6UT =e"ΏfBEw?c Zo+Q_قWo3.l{ǰq?x惈pي|u8knFQ+ѫ(]Kw:a„3;YCDDDM՗nƍX`FBڵ Wg Q*05#"""2*4N/]DDDDq塚l-y'oWW}KFDDDg `쇬mvBFDD~;Nd0""!@dm @7`L%z=ϙ((9;lDQdgzQ̫=9ʤ%lɝbU] `j$&_5Z1?F֣&e*ܘ!vj|XR2r/5ZjAMfI%riK=}ci'S"B-ͮ)0@TOR#it*-Yi9[ھWVt cZ z'6kԆ=-V=ZOnY9`_byպ~S5'Bj늦t") hfmEoGjj*taֺSsFvYRSh /Cm1Iuj731Z.+`|jٖWf<foOF4{>|c|ŪfDɊoiͷz{\o׬R4?rѯ3:M<Ϫ@|`+5ӪrE˲ழ=IKq5<Ę %T\Io\YZCInVnZG䓩n8#7џAe]De`E)*YuMkUkRF[Zhx~"jҵ|gzUSR@C.XѢe7Ռ3B ]i-Pz[f1 3--U]J-EVosZ-kXFf!Uz1&)уzCnS;H*Y-!h`Lv\V;%j2Vu]_zZ &h[O۲ $jnI{&gUgZzK <*z0Ryfي,fRn5zvLl3/8zcd%fz0o6^7zaVj[u<33P82Մ-#g}jU zBv> =ہ-Izv֣xGIXO ϯcqЌ} "cl3sCYi7v'k0s3w6Q xmxD:LMYZnTQ=ƒpz}O/V) `VHDu70‚A_"z-@rJ3Vס=hU-঎-F>DK*QXy+_ckͤ%E/DtƪCLMHSUU·C#A.딈( i \Dmuas `l+bbkjc$v!/}g|}N/(Y3kY׻ԼFfLOdK獝1y@{/^ŋOL=c̪[䂫PkTbKaƲ猔 9¦JTn^Y#56 DՐ;y,Vf=#y߶4ZFOF[۴̓mHЋ.VSr"1wLO}#,\;n""J{A%;@4Rl5>FF0Fz1 &D(ۑN_ `xHDDɄ"R(ø?K] `c)xlF$ŋ= ӕmoC~ԜʎFjo-u xZkKصH5Z.z|Q"uZ36NKZ=)Oj{̨ s>7`ݭ6D-zPi*Hܵ s :6KYgF.\[M.m!T9!1^ɺۃj^]k:V=J-J|3QmXwKwz]f=JQJ<r-8n0c|.{PޓDD\J?dm2VןHf&jetZl# J!Mu}02`GoV,[Զ#銎~LOYT/% %T bFk+]oZǠ%"i,coL^ `dKSQ;lz[:^g)ŒJ.2z_)?oYd/ `Drj1Sm&EFgcnl}+JFc#X2i:XU&XXN0X `QjJ<D%U?[ᭈRRV2x)I:QK新 錷"4NDd((ajEDD(n&ק9؞(%kK~5Y,%d aѸM<0"Ι"Id3&hq,nb0Q\񬋈(qi1儗8X/#{鰏0JT>c(#J~9f=0e?(~e[Q2#`|ԕjaq:1ފ( oE:ҩ+|眊;j"JM>8"M֭DDDj1eĉbڜEz `dX_Ă;Y/H0" %")<,!$ FV//6}@2cЊ0$>j.)k';f"j->FїInX1aL͖z GkӨTV2lfI+Y/[io `v݈̗]\ѡ-o9;Y"2G*%^QR01?vz FDKE2v?&]WN2hzɼk=Rx$u\w`mӻ"Զ6y7#ֆݔ1딛t3T"2[xkK!AKc4V4eNm7`<>ke*+,5R{ oę3L/Rנ/Yb/%E cu2hK*$(>Nؤ/ɴ vԺﱎORv9%,܉Dy*z"ݢMi0Ң4içjFiڈyhufYE{W݋((:hNma'1G 53ڲj%ZI˙%*7b }J-27؎SF<'*Tu#u640""yR_,FX2w.+ -//3=(Y+~3GBm[[,0"%Μ}W`Unl`Ȇ- cFS0:(!ȝFI;$"Jǥ0"""Rm-ODDDVJĭm"3-cᭈ  "JU [RwZD*?K- `DDDDqFI+ȳB""J6 `(1QRQhρDD (i_^.hER}"CXra#""J2da(ijb+%ފpgs ZDDѭalҎ Eę3c!"jQ^Daw:DD$5y0qgBDON Cvw%iNjQɪ1FDDh_ `dk<#"RFDD¯/Μbl!K^ "Jox+0 ^%xl[㭈(Z5DD }1Qv  a0J8DDDlaR(ػ^ ,.@Aވlx{! UA6r0FD?-27؎SF<סQ[Kr6( OtϒV^^ߞ27vѾd"zWƜvગn Jl""Jl"ҥE,j\QP%Μjxx1x J~(]1QBCOc#"""Y c͸).%"":-`p$"tFcy 1řmoCDDDd[6&m""}sﻃ#öRKxRF(ߢ(ȊnHeZ.ִ `ܗMDDnH#P=Mcv030Rq㑓nKDыnj`falVMU~$"JbF>&q7٤O (1Lxŋ5y\mjYyKO@DD>kK5~XFB9\TЉ8.I3+=nm `v Bj)FhQ1=ǜvYp:1Ql&\+85O;:0s2DDDzevŁ(Z[~ok6)f8IDATvԤ 5jݵ*7$QҲ7(a< f* `<Q 2m̠yN%6 f, `jBUAE͆k>v܅0'c"""(i*N( =V*/[<}K[o|ߒ>1Q=RR)˖qْ>.[reKRyf[ ((}N]|<.6Bd' `{W݋((؛!xlQ^^vBV 468qlVP6W(l5yyvVGWt{gl #w0lx?g¸5@V7gF/`h_r,9{\^zt/|lu0""393 Y(8p-OSOWVş.3 {"Jel#R^^MUIM36UmoOOɃq܅/s瘱x+,F@V^GLuƌ:W[AQ ^""JEl#|sj֖߷`[r-Y3DFDDDg-`7n|l"""3-]4ADDDoQFDDDg `DDDDqFDDDg `DDDDq&y 3 >߬$2?_Dg̠F+_v[oaŊ 'OF׮] 5"+(ފwy'~!pkz5pCQTTT`Æ 5kJKK-a"""d';)ꇯ_~B .5DDD1Ðp8y(u~xuE_{餴}s3p84ݟ p8t˦l{᫡o}T\QoVb㖍zxꩧ` JKK[~o8t,=:!DyCxeie6'xFzvF"WQ?UM剢S!27Jw*--OszQT☂% Áܾ-ڣ1/XC!"+.AETTT_}j.˨n:l[b`G؏la22gl޼ْ%""{ ?HUTT`ݺuX[l =$]7siLՆ;\x㏱r՗ؼ{e4.ytem_ [޾57y?~ G<8= 'u!@ .D/v`szMxਨ/TTTkle+N۶u=0L6UUU?~TYƚ9%""do<3t;ml^2NAĩ߆psAC()`uO'x1\Dч'SnL<~fOk?ǔ'@lƕ;zZ>A N^o `k-CRءCa8F(~ άy#"do8s< }zcܔwyQcqcP6=Ӯ?m*#:HK|ii)͆+C. d:YAV,@U2;dǟ@ˁ8_Dկ ;'=Yߵ Z~+O)--EӉ~\}_.1YZWɣOD1ԋF@mW t8-^bˏ?0͞fMQj3,( 1oǶoƆblsEhߖGO vjX~|xFM[Qށowb??֯Vgο|1?oZz˕/"_WzټuKAqռno (ğ-C/gdo22 G㿳F󡵘ȖnU]9@`=xuN=H5jޛ ؿ-\%]EdƯAUeS7?Ŗ1M/C1vlj)E^?""Xmu-DuDDZPZZ}0 l8n3Ev22ٿ p pQslm` Ur=▞֜^8ŒsCdgwi5=~/dqC| tV8T\w vŕg`GV=%gPڥحuYU9Wu9'eL>%ވ- EI.SX}o.\;4V =󛗣Jߣ,tw}y].FГq2G;ߍAޗ`Pg*ӵ%e0h"YTچm%qXzrٽl4}Ip|rFu<f<>:MX]P?6yȌlrf9s}O,1G2: q]j ;MkxjNN 8pʬ'1m-n5eWUs`p8cA]඗Coa]TGF{&M+҈ln/{w;|;2ׅnDEAAEzr# {uO #|͵1#p{`8{% * |w 7 Z=~jliBK`h/{Fs.+/?j]5ǀꫯFΝnF~f>j+kt L~w8(uyg:ߎx:a߳Eh^!tyl>F%GEޥ 9 ls߹wOq9@w£]!ܰíu#`XW;bK6p_+hp/EÊdS@^ `=?{.Kֲ 镶] <UW]O<CСC1yd}ݘ2e E~xOk% V\?W0 lݲuW_=f=菒;NDj8Pť#nihoއ_xvV")fA0{ٷqKoCq5j.OXATn^`Uއv1"x1Ӫ}oTo vC2"3X?HՓe9_1sׁ[E~3И1W*0LW^zIqѢbдiD3]%СC>9 СCšC~?|ݞgE!0XTG<|xDb<zuK)Kǝu8wP]oV6_d8[;SpDA##N[%\ObaS3bOriyo~iI|)̮Z$>~TQ't~w)m,ZP|' n'L8S&L8S73'Mr^z)^!i1` 1Ztttttttttw8ëOK*6I3F_+QQbh6y$bҏH90l6:::::::_<+k6۶b[\~JͦTGGGGGGbп_fٿ__m߉)&G_aOu&ޘ%ܖ5A:OxetOΗI7@B cXدul:::::::G Hgj;DltXf ,iEQFă?Zf_Hwrp^^F3&P"Wtwnþ@|B21'BVxX[LN᳴n]۶P~AP[Fߞmn~n^z =<\KtMB"5MGGGG/\\:zbeaWCY߱|$at{0Ci<eso&ꚫk8vŌh?ϊKiі#5lGlHhÑ" H|9S𤥐[RwY5㬇zgw%6'rLr2)䖖 d`mR-4h ?ӿٻ#iK^syV쪈Ckxx\UT:&peH!{=X1M09,#juPg!SRHyE|^/“Y[CC@~~a>v8u@qV/w,<0i$]Ϻh#+G 4I󖂐~aÿ]Cyږh,rV.dvn7!.#0nyYgTcHH*x5\xYwcn&ЎUqS\TK͹oߢE FLĵGm7=9h0|AhccL\%*XɟyoUsзo_~GF#,( M|CBB$U<'ey$1|2+'|&K=DzU]K~Y S}FrT[p ynr+p5fY%;pCl>X?/_1p#eVA-GlӨbBTU4~,Ӊ!:f[r c3 Y+$y]?ɿ/ׂK@6i9ަU:iY\L6(Ql.$=m h}c2(Q$xD:p _Y{4es/̩V6$_BQ rK+A}vg}8;OgжU,KZvv+mvutttt$HIjX7(iX~c7Ʈ]޺q/zl}4I;w4;$eΞ,]f!^B}GR\e&Jm8U<%W],(,BB Zji4xe*ơ@h%6< 0%UL^՟>DiUQ{8!};k~ݏl}BRo "<͔98s׳1w=00:8F]/ oq):] {놑o>Kr$`0Ȝ>IϞ9EN^9ӎ$%6j* Kh»Sz N$zT0F$,%IF2ۘMvQ߸j$BhBC6% [1Fǐh©T%XUe ZuNXvwݻ)CqXdݖ|G0ΧpysuUT-o!k?BDž [r UGGGG0fVood5gmC{놑\z6wQL56g]ԋ;0 fHj 5KK!}c:4.@ԓQs1UazWE-+b6pTa.MCܚ' k߁䠪juEGp<9\g zM&qKH(L5l߻.#f֌~&$ޜsR/}淐rý 1[.Ț-;^ohh 7x(-?Bbq0X>N9RFEs G>z K2Rn'$dFR@{Tq;D2!N% ;r;?\p3#Z%/{ yv% R0.uII"NuM xbZq|/_ǰ3cz^ښ%7ctHOڨ>?/8׻ ,$J',v0c&.A0-?Bw:6dc(F}}׶|H>;o^?A1 ӫW/>t#{wFŅjh4CEUӖ"CvŘ^xE~r_!. G|sGh.oVO0t{+"r=+Xۗh6aYƺѷROH|^*=*|_JQe%?bJ=tRVj,,ٯL? ˺7CչA*f"x$acgqw5G.7<νط 2s d³Gw0Gmk=:::::GzK[G6Ơ&H ӞmJ@[#Grb7pxwEKs  T|g'C Fw`Db0%vO]RAMAoM[Ǣ|Tlg/ȑ5P[*'N;!,uRPY־@/Uf!_|b29DRRvoKSlvNI| ߒRgcLjGR~rʹ]m; F*Do{nԭ2w?l Jp+QU3zo Ɵ; `wCr%C~KAin%9{\ݶc'1iZ\~M{E) lwNY+n lGxěeL2 .E`wYUvͻ5Cu)49doi[dĘ6y[trCIAeu҆l;.I2mhP<*.ЪPQaǡ dLώ ƚ5hBEԔZrs.±ֱ]!F:e$95 ըjN{ 1Y0I( ,6'nbB.[BA=Y::::: Hb:H9 P=hi ly0UUͮIQ;)(I 9N.Q)8ۤ$W`FG!pUQΏLre6VMABӼeTUby_h&eQkȍ,ăA0ۑMJ<e6*X\nx 3k<@tcqzlcttttӒAM5An#v$TB['SuUIbo%hBB܉dehɯN.#hFQșzxr!~%[O}d8o 'ta$'dsF< "--hk܈gcOe]ͺ,mNH#寰]k0 dƥ嶴K:::::::L1 [r?ӜR>T"m30I9sUUlp;+q[1 Ჳ7BR,_8|\%d=*v-RDLӸ;gIB[(Z¿BQ:"7VN$ [x"1ɸ*dM<!8q,3m4v'CG,n =_~ 'sg6hñ ,Roz(zͷĚ_oo̧,yQ5tw1*LޑruH7K |~}>Tzr9x! 9edOu e[߹l{ O;+4Аm.[?zl;o}J@qpı8^G%5<ԗ^s;B}@o˧qݹ*Y#_4K=m(ed4P>[3=>W: ,?2w7%~i" W>,T>!w-]bu쨝w8}?%RSiHDbawd ۧ1a]_=΂t̵[( umTf aOy{dr o.YJ4/@⾹wP"^)#ḳx⡛H7MvzM(w߾:eVG/̿f!]i؆SfQN0m f]:DVjs \ޓ^5e(\:?%NkE)ч8}\6Frc;4֣el,U+>;y<77W[,!۞㶩sd[MGmC<+4מZ -W_I1S<7N֗ĺIt. Is϶$q0Ɖc&qi݄1lXB !pYzk1~8f;OOouilЇ[ooxL9x~>ݵ{/}z>f }!5MꌇӞqS2Y)Æx3~:;mlıy絛6mTVp|_{=I~z; K 9ޓ.х"!̭&: 0ʫB^ih+bЩ?>3Et'1m^V>yzSy<V>x IkP!SySS?ז2jJ9fj5:vO~6qFgw,/eeLy5Nɺo㨪irM-Plw_; fmt64!# =p|ןXIc;1~$zhb>gVCoYk1\6y^O:ӓ@gz;wNf%kٹz\tқiv}g*Ԑvzz3봓-OT<̹t1f2l(Ǝ9T_ꩉ!9!τZßT:-"n.0c< ڌky):4,^ɭ䚌8ybBê586?˖}qsoi}K[p=[/fԥyʬ&?25GkI}~o~0sN|и*N֌C6><6N> .uBU̴8Նu7}w"7@M?zJkK1Ֆ T߀XuߕL23fp}g]ƚ)הY?,Np<,Dl̫FyiMnB< usNȌ1/f1cwcwsN}>Jf^;nnK[(A@B%Ir!F&kV# EkxvhL%617NN_g >T_7gq(ZS3̫Fa|]ˇ[&_߇u+xk8LMaŇPy,X9KfD1VU8ېHtJ楷B"=(8x`{)Bv|אe˖lٲ:גpe5>_\U!#9Q4~ul,KݟB]n04/Tm Ks۶3OdԶ;Xݚr9_݅>1L8o}nyO g }momKfޅD3ۗk쌸ig~ ݪ۶ 0QI5hY VQAf$uk9 Mah)DLdeLq;0]}[7@vjxZrF}מkOgߠk?NQӇ}BxMnvB9h^#;h7ygfeC:Ͼ_ճz=Ά/ă~ qT.8egֱm/4Z.ĵWW_zb4=M_CnugS G\LK34{)ehծr8<+#2AT;EKu򂥔xTuKzԴ7Y(zԬ1{Ll$eGC9SwsUȨc>l||``!E湫?݉,(sw^]anlէ!W]-U}71x<~;Sλlnyv*tc vki1I nMnv0%fzz,k|9:dGceV>UKQԳzճ8Nh=eg|6JLsO̾y9'ZVZP`VlLt 7%u톎v>3&KzΨ*ʀQUA|l8J3IJɟ|&G6u䯿nݺiBRUUU);wrMyP߀sss(8Ol/ `rjEdb=ʫ_u]!}מcېF_ 5v5- IDATt8e ]孻nݺqtڕʉjՇuM?oԧ>$PO |kϟI\1>`C TWaUUQgnv;StrN7&3ԟïg8=gQ]<^D4Z$*t\6`BLm_ ?ĥzeXVM# F߿?hf /ՙ[JsPx:Qi R@D;#Ǻ)\v[4~o<@Ze,u3?[lgDgn4Ka^<zynH,_ǯkP_1sMcyś'9~9ثG֌mw6ngxbHΠ>6MLP}}n6s"6u4{5;w]|Ui׹ _n8g E]>Bxshx9-Vu#/<_n@}z<2zƻ3jgL^:fW,{|xXemwG; y/ϯh NG ?SφSw笇[6./.͝{Gm:XCQ/oÐӿOc__T@|zMx~?ᄏs`YYY::rNZlFi29!( jƥec!3t ܰ_q= Pez Kў={oe;XpmcnG~!3 d{gAڠw^0>J=|spQ 97ך+֒D6 !D a +7lM6ñesΝ6bb{L/iV;X0)w"kZB$&B4M$m"~࿳/' [oAcu_͌fmuuʇA*,_S'M?0L~HGGGGGGGG3`::::::::G=9QN6k֬7 .]Wء$V%HEs&y~Ғ͓ϰaM#%ߴi+'ljv6JJgHSS9ɯ s**;\ ۮl *%FHM0'c2-nCԑp'\H⺎&.mFT ZqeeeA󦤤`6҄u|.XZ0nwH]pY|RRRMޯFkh&>}:IW5&B@iiyj~ECQ4l6,Xb%gqrw)/1{^ʄ Ú]'$IM4U Up=GQ). )vj}yn,*VI2ښKUe0U19WSVyCFoۆ+ SdK*?q&n_GiyWR'\!PC|GDEE322d2?lr f3߿ql6rҢq:iixP֬YÈ# }rYի>ɸZiue>zC|O>$7pCD6*d+9d~3`iiil߾~h0*, W\ؑhCÅPTTI^~b4TZUdр݊wDQxT<C9ŴoE7J TMBxF1??~QRRl !q W_̤I魍j^ⰳ; \9߽4Őғs"N姞B;HAd!@nغ+DlCv䕪|ʏ$C4R-ĘTJ9XfOn:%:ń5F"ьϕE0%&:~涩xH*̒ذW h s' Ct.[-IG.d-o!i }2"O: XEl=hA4 EQv7U_H+;ѣXT?~d־}^fAؾkAnlUsy}|ܼxӸ< EJKM5f vv0L2| o HtjʽO~JAbB N7u>^xkϫ?o(TU \#R5$ǣ4-'IUUٴi?W3qFFZHq^*ٟ yGȯ?aԁX&ɘj%q(˖նPP2cct._֍^;rgVXX(stN6`=(T؟ߚ7:Y?+ Np@38@"'=i `f˧43"W@$y%9E:o]07ѥw2H2)))ٳQXU'Du  H.+'oYp8ztm< |YQnT׎WV_Wcդ7w.5V_K^ )yGI? )1H3WHvW_}]MU{C/RU5_ <=$x, k~)G-+.q󿟊ط-W_Md1cپ#v{;HIzzŎ8'b@@\;RTAx髪ʄ 'cX}&9[)0,[:Cy.b3mݛ޷ gM9  V|BTiDپ'=[5y*}eawaf&1yIJ7B woGQtH7ү̲UJG N;J"ds`L@TW,`0":/!45VlBΆb7hTL`￳m6MP"pUv.a `KBCq{_qqѴNK`|>b arVne1 ؑF,g^sb+YԜ q2u ky:${[ڣGr4s1uXM'8G`o3k`RUկ#~%,X' eDǿ7"Kx&`dž^ƔSZiVhvU[n͆?-K7/I &noS tELLdKnS*5)ҾmÛn +.{|N,R5 MxfZ'\l *,T[DH!/CQnt:KdKE^G۝Ȳ,˜p6miLCEs{758Nɳ=2lذ3|'[ '(1Q'Nb1f̘$I #!>8fh̴m9Xߓ4ܕ\ԥ Y( =z~Yۮo`ff]лwjcMy..κ]~ܟC;73Wбo8f) 9z\/*XW#mDxT `xkEfVDVGVLV_ocaN|??%Iw2k_qߏ?'[%Gko/"W3rܾY|qyp/w`>CIN$~%!w'w8P^ŲdV6SPC&Qp{TP(9 J+'PVVIaA)v3%͛7o>HLLuK|TEA Ȳڵ((l62l0DU}4|Ƹqmkh4-P Mq!J%!o$wK xˍ@ ˒-kUz)ͨFYezw \4SE&蝡u_w9Db|Lw<%7 ?Alr%L#Ar8 ?ɑCN{gԘMYWk Hs6Ğ{.}8x9tMzBa:Dm2tl:et!wrzeh{i]ڴiݻw'11={ؠ_dwaj*'c/G"OU988]vvF:+L;) AENBEa).pRafc6#O*><O]gў}؋/˯Y1X0yZ~) ƦPaןXjNzsaJ?߷LkÖ6lNoc~9>5k߾|[!Ml6Sx1~N#1"  QD$ꎇQZYxo;諊[7cz9L3f]).NRhr?f T:EU[hwذEz.V^CQTSNmxY8iT.~SOv_ >A;?4iPX2BֻN>wW(j:+eն®!> eAdrU$hHhY(Pp82[,Ih.PS(xfӽxd hϟ;= ZN#CFmW?_=T=]6Wu'4ĥfo"v ?~L2O?4e i vP*!ێ>rrrHc{F&Q U>ẈhWPZVΑ2v0yx|k_hmX5k9Ν͛q|.Sޚ6<7GV۟-6O*L\aSPU@CNd,9-!R< Lяْ׼ym7Tm9~ 1te \:tFGCݷXs,ǚ`ixVTi[/o<n3f( >5 y/#cdžݯn}` 1ev@yG9))7[f _O<.3I u:՜ݲ[94ܦq]{8mt;uGӠKﶸ\*2ļRv+=N7R{<ۣ(8]N7Vv'.˃tZkV쳧|3-,[Te&3F(Ӡ),hG Ѧ(Ύ;ӧOzKUh4.\) )" `Q vӿz3>!e=x^öP΄ 1c7|3;w0n<9aP@:mPb5ṛ1GqAJ}}Ƙ5OH&@Ӽ/Eb++I1RxUwEwn3c vڅ`0Pvxv%~B6tΕW^ /FB'/]኉:P$|$KUp?W;_f{/,ٛimf׷Ę`iCw[sկ'9y@n,ѧ3}>Bwo9r3Z#W_o{ WS3txmm$FNz5z9s(ع~]ǧ_ioEtJu>cMUcwTH|[$F%e'** FnigHONQlg);[P]/Yq;{6m_׬B92htt4/]vG܇lu KMG*0֗odd>Yk٫oBhYI Ϸ+=ylؑ"ԼڕnK69ɜ4/~fNЦU҃ԕӗKWMٗ ?.=[1X8`w  fjdd~o%PrAp,03cZQ IDAT(gi8n.Y~BQ֩SgF`}26ءw+' hԮ՛nO.E$=ך){Ss^k;%U(+sp81|j2ArڦxIqeB%V GOv>[& *1e~?KԷYnf/ .DlqTad>L^ذa#F 999lY>Bxy!:]38q`U&ՉAws,jF<3C%Dk`:4h0.FJJBHԿ]J:R$-,60wl+%QU^&Lv$J~vI0(-5N?>326‘2T%I}RH78.8~ _z56ށ;f?9F擕=*֭CQި?:ۓ|eOOfh 2$H7j }ot{;Rc\[54[*]u/L\=?FޚpS>?f^U>j( &Mb|۶\=DBǎa$Imʲ05ly) Vc`ޥ4UShՅYڟBIiFx(J82(vAq!X^f)DU夁àyށЍǣ 1ۍAt0(ڻ(ٖzI@HS84^lق",x AOg. *)t! &lMvfgv?+/dgyf<&iNzɸ&輽%'^vםKj`"]QRXIQ.U^}տ; ,.f;™X-e[YNzxU ǣct KVQnm NU`!IδF e 4t-jSH`4Q^^xfBNN,KGSIr3h , cbw8qv79 ݺv xSOy|[keu'#lqVҧPwjwEii)&M #{Ꮳs#ġjƆS8W+F˞Nác( 7Il2_yPxuH rrPYY/}݇^{Y *x3y.-܁N|q>>?gsfv=`9djΝSѱc* DlN[!))58z(--k5u!$7$_6K2.! ]#[s Dq5`ܹX k`6A.2:xo/x 9$8@ I'נƊ#@GD RUإlظ]ǣo7_e_X.Cnj/*k *1pP L&L&8 06mYgcȑ!=W$wwށadëV + YJ Y|K<>gt~ [CWԩڥ L&sc~D3}@u `?2!%ص1y\zl@اqR]T5U0$ wEO$<蕖YVW_}3LA#`q 3}3q˞p`ս# <>Ggo2n!x#0v!>~B)ϗpm@!޶1\(}˅ZM7okg 'ND^0ydw\Ç!Iuv pVBq"$H$+Lj_ 4.#`Q I'IZ]B? >Xi9D2:7!9x|0 /eU.9+V <\%T[x+j@q9?r*H[u6ňޝt+hںNUԤ[ b`ڴiXh =pTV0,\3H7m60;n o/± hwutehӶЮ]+kk.rvRo0ICpҊ"z[>|8>3'C t[N`.+:uq bbLPZun#..F ''|c$9gQuv=iI'\K4:uM; ?*q ߻`KIojy.>/^Lr8 Gիѽ{wv`XΝ1}t Ϝ#t]pg4+~f6xsaZqtL=/A꓾μ :Z"<݁*`o߼r8V(p@X2+0A/YPV?]PmXQYU ͆Z:Ur=bu=h.A7 ܹ |*˹FVx&g}n]:`0>!x{mw26]$m6GpGq$k´c}y:]0I`z.>c 00x`\ a#SIUwй-бCO7bݮr HM1j@4# h!*vtlGQ  ը`"q`ضmcAxO!l6/:I` _ "$] qyQ3z=A9hu_zB *++pxLGU;ŮD ke%f3jjjqT'2!<'Ok~=?;={!o9 8zCx}ҭ& 55$aw[^NN,8~}+tZRup`lA׸]gWp9gW M' ?+p|M 욢,srk}K.Xm HnVy.6}(CǷ~(;4t6 ;w?޽{cʕ1b1b <HMMj켼n^YOn~Gܰ^pV5eKƓ{[WNҹPO ufk @x l@Y6ZYkfA6z8f8Ͱlގ3zudK6|>}O>7nDbb ƌ9PQQf -sN/Ks0.I1__|uuH6-O@`կ&[.(vNw0070qH2W >`?I=my2ڥ" nZ[nFtmg^ I+!]ۙ!36T*EfdvqM=B1zh;B\\\POgp]VnX8Zv\;Ͼ#xJ}Ʀ>BbR2:v=3899ؽ{76#99Ǐjŵ:uwŴ R j+ֿƵ~K/zmkR e}݇>Rp] TLG h6u_|l6&NE>vBmi)=QyC*{ϐ7y^/g\ EyoTaTl8BU ,+D88'i gvBtHBX˻gYMҒgYu偡[s>X+ܳnV`CbkCɄj=t:8yǪU` .D6mosAbb"͆Z[n>> G饥8a{Ϝ%@vhqa֬/ƽ!%"9\_[+``6`6a`P[kj@mm,#,x}O|Rc69Iy7P9o^ ᜤ$޽{BHNNAm ƣm(w ;x:9u]HbD5 ?vpZ2&kbz`o3 q'Jhs3LohNK Fc3&0w̌?!IV( D*kAbbrP7^zaǎС6n܈#G p_ Y믻?Rtx6xr`!m6O1ieHnrMAA32We2sN@uIM؈m+ކܿZ:t={thWy Bj6T<+ KƒJpS尗ĭh׮;L&UVuQH;z\ino*Ͻ㪰*J{B9$`[*$݇BϾ[1g9ue8s8˪+?y.} y t[8|`3˝ pqw>u;fC^͆'No$Ia9ұ#s;v:RvhkYm1̄W-چ*p9t9b0k^&Îyer\[mFթ 6TVts2jw/SUQsuts_1zyh: GO@NN[ر3~}?Zץݿ&L@owI+)j,3и^hS 8+`9'_1Z]|9Uʷ5eCCs8VlʐlUj %%aSUU`q< /v1\!$ $I(--ū.ǬYuVcڴi8pvlߎ/߭]rVO` ={'Κ[n+G"99yyy^I=) S ӡDcqcGtqQwޕ_<>GشiS Jg(}5}KtAy'O_|12*մKڡ7~?qa Vaִ&ŊZ3jjlFmVf {vWcAo}?lC·֍oQ';e+vY$IBFFwZ>, te90߿?%z C N׼9`udu+cƓa]C2cFʫ^*lf`  :|'%cB6е-!/Z`T 6I@D ufPpO9@Ze'Xmo)C4ڧ&Bdi5P|=[06ӌN - HCխ[7Xz/#Fd}b_~9uι%Inȑ#q$''OGqq1$^x!1idvƾ"#ʟx z!{HO_|zzL&:ԥvpt:K%{{v,Ἧp}%3S! .לոW.I`^ӟ䱾3fx#2 : )[ y!ܗVgmm6Îj !]o1"#FO0)355FJdff\|6۷ڶMDN.מ]]TƴVk\'/nQh,8o'Κ-z 4|yK^uicqȆMy@`28oe2H6 tMc ;lw'm!pA1c.\#F555~GzNQ ]#y3RRRp9B[׮ rܗ#Cb=yi Λ! e׮]HKS())AΝ`4`2a4r}bAJl!z!C4YnĉN*j)%9P3 oyޖ 6}(C_Z?Ɩ2OWRUu.Ž;ZH4ٷwDm;V+֬Y /'k6oHˆ CZ~ žG^\TVQXRΙ'5I|Ďh ArQVVI&!...`}t:t:u:W9~.aos8-;lvF̛7˗// zϺt_U = k՘m(@x#F# Tly.+Wl:ꪫB-W]w׷oޢ.^SR[T݉5kiADDDDZ4p@߷m)X>h,9`DDDDj֭oݺU(9`DDDDl˖-䍇`gQx5 VXzEy1XDDDDQE`DDDD2ګ剐L(9ٚs$0""""/ < 0""""?r4A+GHa HaODDDGK'{0""""ibIΈB3D֐À I${*/ZRh-K,ˋֲ.eip%G@4)ف(v419`()Y^hnh6%Ek;FsTʒ0""""1oB$/ }BhN'j `DDDD cFDDD0`DDDD L0W^N$""pw41""""90+Q `FDDD0`DDIEFZLo=iC9bXᆧ/-)i}䏅M񳐢tH$%bQ-:sh$I¸ז]?Y /JΪEغNҷeNB˯Ì['xO$)CyVE0D!k 8_\$Y5#""pWDE;ߚyӑ>Ay'7A!.]"b5A]q4"9FDDD1 =^{vK"77{shU""""8#"R3OJms¹ 6`DDDD cFDDD0`DDDD L`DN pPh"^G$NFDDDrhcDE0""""jpOhԘKu"R`DDDD cFDD1*`DDDD cFDQOQi-47ZB3y\y9)51""b0+Q `FD-Y IDATFr9QPͩT4lCi )Fy غyHa =jY;u^SkwjΫIC<`DDD$Ɂyb0"UYDh\n6'_֣%Z3E'`DDDD cFD Q$0#"""R0hO 4J+6 w="]jiO"4yH0!/"j66c(gh&#""" (q4DMu<`_WϘԢXmU`DDDD cFDDaӜDHLo=iC9( (Y O_Z R Zg!EM赜;v,Ǝߢ(ZE:-,W{Բ,Z(Z#d LkcX4m{$a\FJ1&y H;iG()}ۡ]$0o EXV?ro$I"h#YsxJ`ߋQ\7|g#!96@$QtZ3Dw5F#}ԃ{NoroҥKQTSWWvKFzxt?&ܲt"0lXʶ?ιᬿj,ςL:'f{즗Enng>OQ"":Q0yɟm@>)4eFDDD0` !"& PTSǬm r]DS69洅rbFDDD0Y&i(%-7ңjQpsh<H^>OJ `7Xh|Zpj3kĴ]jV5<~ %(ى Ϥ% (hvha{~g G(D} DQS]HKrDF@eRSo5QӾ> %C >#"5R#`H4BK;J^` B!qJZ p /iwi'VHḴ'֣}xiI;.%ǹ\u.\\=4E;5/D0" haQ u$e(9<"0#"""RXL`r<-a(Phn&9lXg]vw¶(]G掆s.b2#"vyyI`95]HB8C. $IH"XOG!IQL`o*#I9R*'eVNᜏuӜ\xM[| w2{ P`9<_E@,d*#wГۋf\Wӷ`9[D)v+5j[E* W$F'1Ҧs i A#kZ?91S %XADD-w6l0Zyl}P۩<`~|[R볮87&tj*)$g{5c0m61WPR`{3Ga:1E宧ۡ9ucFzߢyZmS/0 B5<^Z&f0FDD‰ɻ edD ĝ;rPC*IGu Z(痚?" !Ͳ0 mCO6mGZDB ""p0 LuׂHXᆧ/-)i}䏅`,=OCDR55G^j7jVxj>ؒ1w~_;-xO$Hq.@ױ3嬒E:' pXQM sx\D$>ƕ|UK:<+q nX7n~/cǎxϕ eL"j"" ]9UKǕ|U}X|k.NG[إKX Ic3ZOhiӦY5"UoDy\YQp' p4Hg7Ş=s57`OY5""X_5։(Xԁ|m_lws#\\Ǣ=I0JVf,f0"rRIDz նA亳1tj9-00аOObOj޼U9F \9:C+Sh۞HQ۳ÑHy` u*zj.ګqHpώNDjkў^m px0N.jB-ҢFͣ>1"E#> ZH\9:Cd=7(-|k-a_$hrQödꪏZ>R˶p,%- Gt5O*{WOsDCߏVJ+0 hF%lDۄ(2SÅd.֗bm{I~S꧙̕C-gLi:y] 䪛"׼X 2.mu̺T3cHr NEMbrnC |10R o*8:s^u_iC8b%h$>Q18k`!|[ ˏԁJDj.2ZҖ#-ߪx&euU<ُkcѴ%M7?ZR7nHAl>O2h\2Cs}Qk-غNXUawPsYN#'>]xϕlID(⊆"coA Jvq./I$IĤdT<`r_yyB5OW\~hlhܦX[ek+DE;ߚyӑ>Ay'uM_~e׿_6 u &/o5_8qM~"))僳1.EDk{5~-lX(8Q{X$I³^r={p5A$ )8Uʓ_U-SO2>lIகmؤ*DzHI1!6DDDD9YSV;vke2esFK)Z=B Hϣ'M`Pb) ga #A"$ Qh`L& 2r97R9)S}1VS_FE"VCVoosJDjcD+ԢHf0""""bfZ# A4>Lk+`TEΗ67ET`䛿[-ۥļ#(EӉ8(Z8;g\&qt(X Ż=\1qAZHD]Z-c#"R泰aThjIjkC"Ւ̚ԃiZ^rm&"`OZ:X_DD-MQqNZ ݡ%V!'j0""""`A&|l;""R`UVhi݉(xHĪLѢd~B345Յ?gKtJ&}LFDDD-NbMs7I툈<1#Ґ`;Dkx"%0\"jH0R9IDD,`D T""r1DrPP}|QDQ͌)GMBDD1Q `FDDD0`u|]eA""R`,{ ҆Fx"ZPG" kj  O_Z R .0~RwCSк3>\""""8%Scؿv>M[Ϲ/U-R~{$"X%[lg\Aݦw^]>uI?=f5'hcۄb]ø"1lcoA Jvq./'݇#c?\`LٔS6:5+*؝ożH ޼B:&/2j_C-LkgÕnZDDDD'ۣ҆F=%sss={e\""""<]nJڞԍEH}DDT0JEFL`xm"""6 NE]$ce""҆H$b- Ei%+iKC L3#`DDDDт/QbF F 0""""1#"""R0^R#"X4BI_. x(0# Ո(*0!"XHa HaIC<`DywDDN/ZHMDD,#""" HQtcFb ADD0""""1#"""R0""""1#"""Rf1+ɁX`EDDDr`"V"""Ha ea@PBkEDDDLp藖x¦ 5"""(#[d|]ǢiK?6=wI0.#EDD+d tՙmü$CDDD Hp -(ҷ870""" _q\Q";!or/5B`ҥ()«+VU-"""m,mlڳ^r?77{{(0))LI-(("cT3/"""CCy;`DDDD cFDDD0`DDDD cFDDD0`DDDD cFDDD0c"V"""DDDDD1)俁"wvP #4`DDDD L&I"PdyZҢy۔QIg+c(Y#""<`DDDD1@3#`ZT[yZEkYJe)]^ty,K{i2&0^~$""hKDDDD cFDDD0`DY FXᆧ/-)i}䏅k9#0vX; CѤĨ񳐢wN _ĘÅ'Id|]K Kp"]%0c@:20~G#I?9obи Ҹ\ n\uϿQ_9dԑ&-]E5Exuj\?c|~~[9?O(q3nUT`ݢ"]'"""c,^SR[T݉} (1#"""R0""""1#"""R0""""1#"""R0""""1#"""R0""""1#"""RgAرCz ،3QXBzEy<~0""""1#"""R0""""1#"""R4d~YI^l6'`͚5())X&''SLA.]Z\"j>_DEr@uu5{1ݻPUSJuzOm|l߾ve0V[[*k*hGzr`5bɒ%ضmR&""JS~鰮 !8et::x?"G;!;.)B[w ?X~駟:J|'8^z0B/Pe_clWԫI*;;Lg~R4$ Z5,l9u#Ɯ;3;O8<& ! _u~] 'uΆAN%ZR((؎L|p[|t:% _>lӾEA77o$Ig{볺ujN3)[twj58QzA%7nDD- speZOQ,z]]c8y[=\xf, {^ : >*}io XI2a0Wvy/Ìţ=[:mwwZlhab/jVTWᨋ]I]iO7yd{2>~ǯe8 q(,d0}bo_'g|^mx?;;}㦱l3?+"@=^8~髸2-~zĥ [ǹ_k3緉O > TZ45;-88y)kA8j }RQG\iM.<윬@E7ąsqZ|w r6`#^ X %"g7Bol~]cYLgl/؊q`Qmeغ} ~ټ<_È+=wG1,1de=_~7/|a׿cضY+[F տ^W->wwoB|qM^coUSQxTlwz K,}䜠"l#μg?R}_̹ڸS'b{]̺*?]=v(U3 >.Vg߭ "pu Om$gG#+/-dff_:EdggohwEi7vJ]I3|ߛ} s]JI['y{gS%²kB$ĵ>ܤ~=O쥸c~z':tdyo..{K>b cntrwY:ߌV'w2c83y'e᱾m(? r_ [ly j_ :爗k&-my]c{,WwHm mpOdۘoSnE^A;cٗF-~b11+I}oY0o* <RI,,x_( =?g}|a=khßߊ"So]^.:{zSݜ=紻xץKvmXd AYPRQ.bD*=!C`VGDD1Dҷ `ѽKi' 8A3XBWwuaZN'e7Runz 菻Bmz8tdWj3n|}0mߗY+=ფ;0u\a ߇Y8EO̼:C<(/˻'ƛ_D9j_g"xcjKKN`quqBV[r3tTwsEO_Q,cODD1+Oк%pnLDJ7ɇQ`$᷃'C[$^$"""R)-F䭊T])M.A6^Uz W?J"""" V"I?XIENDB`Kst-2.0.8/docbook/kst/scripttutorial/callsubs.js0000644000175000017500000000033612277111530021036 0ustar synthsynth// callsubs.js // demonstrate calling subroutines loadScript('subroutines.js'); file = new DataSource("demodata.dat"); var p = plotField("1", 0, -1, file); addField(p, "2", 0, -1, file); addField(p, "3", 0, -1, file); Kst-2.0.8/docbook/kst/scripttutorial/demodata.dat0000644000175000017500000035105612277111530021150 0ustar synthsynth0.1371469069999982 -0.09102273199999882 -0.2417358600000009 0.1419084719999982 -0.09671080399999882 -0.2388918240000009 0.1428607849999982 -0.09197074399999881 -0.2332037520000009 0.1390515329999982 -0.0900747199999988 -0.2341517640000009 0.1409561589999982 -0.09481477999999881 -0.2388918240000009 0.1419084719999982 -0.09386676799999881 -0.2426838720000009 0.1419084719999982 -0.09386676799999881 -0.2388918240000009 0.1285760899999982 -0.09481477999999881 -0.2436318840000009 0.1323853419999982 -0.0900747199999988 -0.2578520640000009 0.1361945939999982 -0.08723068399999881 -0.2559560400000009 0.1304807159999982 -0.09386676799999881 -0.2474239320000009 0.1380992199999982 -0.0900747199999988 -0.2531120040000009 0.1380992199999982 -0.08723068399999881 -0.2654361600000009 0.1380992199999982 -0.09576279199999881 -0.2588000760000009 0.1476223499999982 -0.09576279199999881 -0.2455279080000009 0.1504792889999982 -0.09481477999999881 -0.2436318840000009 0.1390515329999982 -0.09102273199999882 -0.2417358600000009 0.1276237769999982 -0.09197074399999881 -0.2379438120000009 0.1380992199999982 -0.09386676799999881 -0.2407878480000009 0.1419084719999982 -0.08628267199999881 -0.2436318840000009 0.1447654109999982 -0.07869857599999881 -0.2379438120000009 0.1476223499999982 -0.08628267199999881 -0.2350997760000009 0.1390515329999982 -0.09386676799999881 -0.2398398360000009 0.1361945939999982 -0.09671080399999882 -0.2474239320000009 0.1419084719999982 -0.09765881599999882 -0.2559560400000009 0.1352422809999982 -0.09291875599999881 -0.2483719440000009 0.1276237769999982 -0.08154261199999881 -0.2407878480000009 0.1323853419999982 -0.08249062399999881 -0.2445798960000009 0.1323853419999982 -0.09197074399999881 -0.2455279080000009 0.1266714639999982 -0.08628267199999881 -0.2502679680000009 0.1295284029999982 -0.08723068399999881 -0.2521639920000009 0.1333376549999982 -0.09386676799999881 -0.2445798960000009 0.1247668379999982 -0.09481477999999881 -0.2464759200000009 0.1276237769999982 -0.09481477999999881 -0.2502679680000009 0.1371469069999982 -0.09860682799999881 -0.2369958000000009 0.1371469069999982 -0.08817869599999881 -0.2294117040000009 0.1352422809999982 -0.08154261199999881 -0.2369958000000009 0.1342899679999982 -0.08343863599999882 -0.2369958000000009 0.1333376549999982 -0.07869857599999881 -0.2398398360000009 0.1285760899999982 -0.08059459999999881 -0.2464759200000009 0.1314330289999982 -0.08817869599999881 -0.2455279080000009 0.1428607849999982 -0.09481477999999881 -0.2455279080000009 0.1361945939999982 -0.09386676799999881 -0.2474239320000009 0.1371469069999982 -0.09197074399999881 -0.2493199560000009 0.1380992199999982 -0.08533465999999881 -0.2559560400000009 0.1371469069999982 -0.08817869599999881 -0.2493199560000009 0.1380992199999982 -0.09671080399999882 -0.2417358600000009 0.1314330289999982 -0.09102273199999882 -0.2474239320000009 0.1342899679999982 -0.08154261199999881 -0.2502679680000009 0.1323853419999982 -0.07964658799999881 -0.2464759200000009 0.1285760899999982 -0.08343863599999882 -0.2445798960000009 0.1352422809999982 -0.09102273199999882 -0.2455279080000009 0.1342899679999982 -0.0900747199999988 -0.2436318840000009 0.1390515329999982 -0.08533465999999881 -0.2341517640000009 0.1466700369999982 -0.08154261199999881 -0.2341517640000009 0.1371469069999982 -0.08154261199999881 -0.2464759200000009 0.1400038459999982 -0.08249062399999881 -0.2455279080000009 0.1419084719999982 -0.0900747199999988 -0.2436318840000009 0.1380992199999982 -0.1023988759999988 -0.2464759200000009 0.1380992199999982 -0.09860682799999881 -0.2436318840000009 0.1352422809999982 -0.09576279199999881 -0.2417358600000009 0.1380992199999982 -0.1005028519999988 -0.2483719440000009 0.1323853419999982 -0.09386676799999881 -0.2569040520000009 0.1247668379999982 -0.08533465999999881 -0.2483719440000009 0.1238145249999982 -0.09481477999999881 -0.2426838720000009 0.1342899679999982 -0.09765881599999882 -0.2502679680000009 0.1419084719999982 -0.09102273199999882 -0.2474239320000009 0.1371469069999982 -0.09102273199999882 -0.2445798960000009 0.1333376549999982 -0.09481477999999881 -0.2474239320000009 0.1304807159999982 -0.09197074399999881 -0.2502679680000009 0.1380992199999982 -0.08723068399999881 -0.2426838720000009 0.1352422809999982 -0.08154261199999881 -0.2388918240000009 0.1314330289999982 -0.08249062399999881 -0.2417358600000009 0.1342899679999982 -0.08154261199999881 -0.2350997760000009 0.1361945939999982 -0.07869857599999881 -0.2360477880000009 0.1447654109999982 -0.0900747199999988 -0.2455279080000009 0.1447654109999982 -0.09102273199999882 -0.2417358600000009 0.1438130979999982 -0.08912670799999881 -0.2464759200000009 0.1447654109999982 -0.09765881599999882 -0.2531120040000009 0.1380992199999982 -0.09765881599999882 -0.2531120040000009 0.1266714639999982 -0.08628267199999881 -0.2531120040000009 0.1181006469999982 -0.09481477999999881 -0.2531120040000009 0.1228622119999982 -0.09671080399999882 -0.2540600160000009 0.1323853419999982 -0.08817869599999881 -0.2483719440000009 0.1304807159999982 -0.09291875599999881 -0.2455279080000009 0.1333376549999982 -0.09386676799999881 -0.2464759200000009 0.1419084719999982 -0.09291875599999881 -0.2398398360000009 0.1380992199999982 -0.09386676799999881 -0.2369958000000009 0.1352422809999982 -0.0900747199999988 -0.2464759200000009 0.1285760899999982 -0.0900747199999988 -0.2426838720000009 0.1181006469999982 -0.09386676799999881 -0.2369958000000009 0.1228622119999982 -0.08249062399999881 -0.2303597160000009 0.1257191509999982 -0.07775056399999881 -0.2275156800000009 0.1342899679999982 -0.08628267199999881 -0.2388918240000009 0.1485746629999982 -0.09576279199999881 -0.2398398360000009 0.1409561589999982 -0.09671080399999882 -0.2398398360000009 0.1314330289999982 -0.09765881599999882 -0.2493199560000009 0.1304807159999982 -0.1071389359999988 -0.2569040520000009 0.1361945939999982 -0.1033468879999988 -0.2559560400000009 0.1390515329999982 -0.09860682799999881 -0.2531120040000009 0.1361945939999982 -0.09197074399999881 -0.2550080280000009 0.1352422809999982 -0.08438664799999882 -0.2521639920000009 0.1400038459999982 -0.08723068399999881 -0.2464759200000009 0.1380992199999982 -0.08817869599999881 -0.2474239320000009 0.1314330289999982 -0.08533465999999881 -0.2464759200000009 0.1285760899999982 -0.08438664799999882 -0.2322557400000009 0.1247668379999982 -0.08723068399999881 -0.2303597160000009 0.1323853419999982 -0.09860682799999881 -0.2398398360000009 0.1438130979999982 -0.1052429119999988 -0.2350997760000009 0.1390515329999982 -0.09291875599999881 -0.2322557400000009 0.1371469069999982 -0.08817869599999881 -0.2369958000000009 0.1361945939999982 -0.08912670799999881 -0.2388918240000009 0.1323853419999982 -0.0900747199999988 -0.2417358600000009 0.1400038459999982 -0.09481477999999881 -0.2445798960000009 0.1380992199999982 -0.09481477999999881 -0.2445798960000009 0.1314330289999982 -0.09765881599999882 -0.2474239320000009 0.1342899679999982 -0.09576279199999881 -0.2483719440000009 0.1323853419999982 -0.1014508639999988 -0.2493199560000009 0.1380992199999982 -0.1023988759999988 -0.2483719440000009 0.1419084719999982 -0.09291875599999881 -0.2388918240000009 0.1371469069999982 -0.08249062399999881 -0.2360477880000009 0.1257191509999982 -0.08343863599999882 -0.2455279080000009 0.1295284029999982 -0.09291875599999881 -0.2455279080000009 0.1390515329999982 -0.08912670799999881 -0.2341517640000009 0.1400038459999982 -0.0900747199999988 -0.2322557400000009 0.1390515329999982 -0.09671080399999882 -0.2322557400000009 0.1304807159999982 -0.09860682799999881 -0.2388918240000009 0.1333376549999982 -0.09576279199999881 -0.2445798960000009 0.1352422809999982 -0.08723068399999881 -0.2398398360000009 0.1333376549999982 -0.08249062399999881 -0.2322557400000009 0.1361945939999982 -0.08912670799999881 -0.2341517640000009 0.1371469069999982 -0.1005028519999988 -0.2445798960000009 0.1323853419999982 -0.08912670799999881 -0.2502679680000009 0.1285760899999982 -0.08438664799999882 -0.2455279080000009 0.1342899679999982 -0.09481477999999881 -0.2502679680000009 0.1361945939999982 -0.09386676799999881 -0.2550080280000009 0.1342899679999982 -0.09576279199999881 -0.2483719440000009 0.1333376549999982 -0.09765881599999882 -0.2559560400000009 0.1333376549999982 -0.09386676799999881 -0.2578520640000009 0.1352422809999982 -0.09291875599999881 -0.2531120040000009 0.1371469069999982 -0.09576279199999881 -0.2559560400000009 0.1371469069999982 -0.09765881599999882 -0.2464759200000009 0.1438130979999982 -0.1014508639999988 -0.2436318840000009 0.1457177239999982 -0.09481477999999881 -0.2407878480000009 0.1380992199999982 -0.08628267199999881 -0.2313077280000009 0.1352422809999982 -0.08817869599999881 -0.2379438120000009 0.1371469069999982 -0.09291875599999881 -0.2417358600000009 0.1333376549999982 -0.09291875599999881 -0.2379438120000009 0.1333376549999982 -0.08817869599999881 -0.2426838720000009 0.1352422809999982 -0.09197074399999881 -0.2436318840000009 0.1314330289999982 -0.1005028519999988 -0.2445798960000009 0.1342899679999982 -0.09671080399999882 -0.2464759200000009 0.1380992199999982 -0.08628267199999881 -0.2512159800000009 0.1295284029999982 -0.07964658799999881 -0.2550080280000009 0.1219098989999982 -0.08343863599999882 -0.2540600160000009 0.1247668379999982 -0.0900747199999988 -0.2540600160000009 0.1295284029999982 -0.08059459999999881 -0.2559560400000009 0.1361945939999982 -0.08343863599999882 -0.2493199560000009 0.1304807159999982 -0.09860682799999881 -0.2388918240000009 0.1295284029999982 -0.0900747199999988 -0.2332037520000009 0.1314330289999982 -0.08154261199999881 -0.2284636920000009 0.1361945939999982 -0.08628267199999881 -0.2388918240000009 0.1466700369999982 -0.08533465999999881 -0.2455279080000009 0.1371469069999982 -0.0758545399999988 -0.2407878480000009 0.1238145249999982 -0.07775056399999881 -0.2379438120000009 0.1219098989999982 -0.08628267199999881 -0.2398398360000009 0.1200052729999982 -0.08628267199999881 -0.2493199560000009 0.1295284029999982 -0.09102273199999882 -0.2531120040000009 0.1323853419999982 -0.09955483999999881 -0.2493199560000009 0.1333376549999982 -0.09860682799999881 -0.2464759200000009 0.1314330289999982 -0.08817869599999881 -0.2550080280000009 0.1371469069999982 -0.08723068399999881 -0.2588000760000009 0.1400038459999982 -0.0900747199999988 -0.2512159800000009 0.1380992199999982 -0.09197074399999881 -0.2455279080000009 0.1390515329999982 -0.0900747199999988 -0.2455279080000009 0.1285760899999982 -0.08533465999999881 -0.2398398360000009 0.1314330289999982 -0.08723068399999881 -0.2369958000000009 0.1390515329999982 -0.08533465999999881 -0.2407878480000009 0.1409561589999982 -0.08249062399999881 -0.2474239320000009 0.1428607849999982 -0.0900747199999988 -0.2474239320000009 0.1409561589999982 -0.08628267199999881 -0.2350997760000009 0.1342899679999982 -0.08817869599999881 -0.2303597160000009 0.1333376549999982 -0.09860682799999881 -0.2332037520000009 0.1276237769999982 -0.09671080399999882 -0.2398398360000009 0.1276237769999982 -0.08912670799999881 -0.2502679680000009 0.1304807159999982 -0.09197074399999881 -0.2540600160000009 0.1342899679999982 -0.09481477999999881 -0.2512159800000009 0.1361945939999982 -0.08533465999999881 -0.2512159800000009 0.1333376549999982 -0.08249062399999881 -0.2521639920000009 0.1295284029999982 -0.08249062399999881 -0.2512159800000009 0.1266714639999982 -0.08438664799999882 -0.2455279080000009 0.1342899679999982 -0.08343863599999882 -0.2436318840000009 0.1304807159999982 -0.08912670799999881 -0.2483719440000009 0.1333376549999982 -0.09955483999999881 -0.2388918240000009 0.1400038459999982 -0.0900747199999988 -0.2284636920000009 0.1304807159999982 -0.08533465999999881 -0.2417358600000009 0.1295284029999982 -0.08723068399999881 -0.2474239320000009 0.1361945939999982 -0.08154261199999881 -0.2407878480000009 0.1371469069999982 -0.08533465999999881 -0.2426838720000009 0.1295284029999982 -0.09576279199999881 -0.2483719440000009 0.1314330289999982 -0.1005028519999988 -0.2493199560000009 0.1428607849999982 -0.09671080399999882 -0.2455279080000009 0.1361945939999982 -0.09102273199999882 -0.2445798960000009 0.1333376549999982 -0.09386676799999881 -0.2540600160000009 0.1304807159999982 -0.09386676799999881 -0.2616441120000009 0.1257191509999982 -0.08438664799999882 -0.2550080280000009 0.1257191509999982 -0.08059459999999881 -0.2483719440000009 0.1352422809999982 -0.08343863599999882 -0.2550080280000009 0.1390515329999982 -0.08628267199999881 -0.2569040520000009 0.1371469069999982 -0.08059459999999881 -0.2540600160000009 0.1419084719999982 -0.07490652799999881 -0.2436318840000009 0.1428607849999982 -0.07964658799999881 -0.2322557400000009 0.1428607849999982 -0.08723068399999881 -0.2379438120000009 0.1428607849999982 -0.08438664799999882 -0.2426838720000009 0.1428607849999982 -0.08628267199999881 -0.2407878480000009 0.1380992199999982 -0.08059459999999881 -0.2407878480000009 0.1323853419999982 -0.08249062399999881 -0.2398398360000009 0.1295284029999982 -0.09481477999999881 -0.2483719440000009 0.1352422809999982 -0.09197074399999881 -0.2540600160000009 0.1342899679999982 -0.08912670799999881 -0.2521639920000009 0.1285760899999982 -0.08817869599999881 -0.2483719440000009 0.1361945939999982 -0.08533465999999881 -0.2540600160000009 0.1390515329999982 -0.09860682799999881 -0.2635401360000009 0.1371469069999982 -0.09386676799999881 -0.2578520640000009 0.1438130979999982 -0.08912670799999881 -0.2483719440000009 0.1295284029999982 -0.09197074399999881 -0.2436318840000009 0.1247668379999982 -0.08533465999999881 -0.2483719440000009 0.1323853419999982 -0.0900747199999988 -0.2512159800000009 0.1276237769999982 -0.08723068399999881 -0.2455279080000009 0.1342899679999982 -0.08059459999999881 -0.2417358600000009 0.1333376549999982 -0.07869857599999881 -0.2398398360000009 0.1238145249999982 -0.0758545399999988 -0.2398398360000009 0.1266714639999982 -0.08249062399999881 -0.2388918240000009 0.1352422809999982 -0.08817869599999881 -0.2417358600000009 0.1333376549999982 -0.08438664799999882 -0.2417358600000009 0.1285760899999982 -0.09291875599999881 -0.2417358600000009 0.1314330289999982 -0.09386676799999881 -0.2426838720000009 0.1285760899999982 -0.09481477999999881 -0.2436318840000009 0.1380992199999982 -0.1005028519999988 -0.2474239320000009 0.1428607849999982 -0.09291875599999881 -0.2474239320000009 0.1314330289999982 -0.09197074399999881 -0.2550080280000009 0.1190529599999982 -0.09481477999999881 -0.2550080280000009 0.1200052729999982 -0.09291875599999881 -0.2464759200000009 0.1266714639999982 -0.09291875599999881 -0.2502679680000009 0.1257191509999982 -0.09197074399999881 -0.2502679680000009 0.1295284029999982 -0.08723068399999881 -0.2398398360000009 0.1342899679999982 -0.08628267199999881 -0.2417358600000009 0.1257191509999982 -0.09102273199999882 -0.2445798960000009 0.1247668379999982 -0.08154261199999881 -0.2407878480000009 0.1323853419999982 -0.08343863599999882 -0.2436318840000009 0.1333376549999982 -0.08912670799999881 -0.2483719440000009 0.1314330289999982 -0.08533465999999881 -0.2417358600000009 0.1333376549999982 -0.09197074399999881 -0.2388918240000009 0.1390515329999982 -0.08723068399999881 -0.2426838720000009 0.1476223499999982 -0.09197074399999881 -0.2350997760000009 0.1419084719999982 -0.09671080399999882 -0.2407878480000009 0.1371469069999982 -0.09291875599999881 -0.2512159800000009 0.1333376549999982 -0.09481477999999881 -0.2502679680000009 0.1323853419999982 -0.09481477999999881 -0.2474239320000009 0.1419084719999982 -0.09481477999999881 -0.2455279080000009 0.1400038459999982 -0.08628267199999881 -0.2521639920000009 0.1380992199999982 -0.07775056399999881 -0.2606961000000009 0.1400038459999982 -0.08059459999999881 -0.2606961000000009 0.1409561589999982 -0.08343863599999882 -0.2540600160000009 0.1400038459999982 -0.08912670799999881 -0.2474239320000009 0.1380992199999982 -0.09102273199999882 -0.2445798960000009 0.1361945939999982 -0.08628267199999881 -0.2398398360000009 0.1371469069999982 -0.0900747199999988 -0.2379438120000009 0.1371469069999982 -0.09386676799999881 -0.2417358600000009 0.1276237769999982 -0.09102273199999882 -0.2436318840000009 0.1200052729999982 -0.08723068399999881 -0.2398398360000009 0.1266714639999982 -0.08059459999999881 -0.2426838720000009 0.1333376549999982 -0.08059459999999881 -0.2398398360000009 0.1323853419999982 -0.09197074399999881 -0.2341517640000009 0.1285760899999982 -0.1005028519999988 -0.2455279080000009 0.1181006469999982 -0.0900747199999988 -0.2540600160000009 0.1228622119999982 -0.08723068399999881 -0.2540600160000009 0.1390515329999982 -0.09291875599999881 -0.2493199560000009 0.1409561589999982 -0.08912670799999881 -0.2521639920000009 0.1409561589999982 -0.08912670799999881 -0.2569040520000009 0.1333376549999982 -0.09102273199999882 -0.2531120040000009 0.1247668379999982 -0.08817869599999881 -0.2474239320000009 0.1342899679999982 -0.09291875599999881 -0.2407878480000009 0.1400038459999982 -0.09197074399999881 -0.2407878480000009 0.1333376549999982 -0.08154261199999881 -0.2493199560000009 0.1314330289999982 -0.08723068399999881 -0.2493199560000009 0.1333376549999982 -0.09102273199999882 -0.2407878480000009 0.1409561589999982 -0.0768025519999988 -0.2369958000000009 0.1466700369999982 -0.0758545399999988 -0.2474239320000009 0.1447654109999982 -0.08533465999999881 -0.2474239320000009 0.1295284029999982 -0.08249062399999881 -0.2445798960000009 0.1238145249999982 -0.07964658799999881 -0.2502679680000009 0.1342899679999982 -0.08912670799999881 -0.2521639920000009 0.1333376549999982 -0.09102273199999882 -0.2502679680000009 0.1304807159999982 -0.09481477999999881 -0.2550080280000009 0.1333376549999982 -0.0900747199999988 -0.2654361600000009 0.1380992199999982 -0.08343863599999882 -0.2578520640000009 0.1371469069999982 -0.09291875599999881 -0.2483719440000009 0.1323853419999982 -0.09481477999999881 -0.2464759200000009 0.1323853419999982 -0.08817869599999881 -0.2474239320000009 0.1333376549999982 -0.08438664799999882 -0.2512159800000009 0.1314330289999982 -0.08533465999999881 -0.2455279080000009 0.1314330289999982 -0.08817869599999881 -0.2379438120000009 0.1371469069999982 -0.09386676799999881 -0.2398398360000009 0.1390515329999982 -0.08817869599999881 -0.2483719440000009 0.1333376549999982 -0.08154261199999881 -0.2445798960000009 0.1266714639999982 -0.08438664799999882 -0.2360477880000009 0.1304807159999982 -0.08817869599999881 -0.2436318840000009 0.1400038459999982 -0.09481477999999881 -0.2436318840000009 0.1409561589999982 -0.1014508639999988 -0.2464759200000009 0.1438130979999982 -0.09671080399999882 -0.2521639920000009 0.1390515329999982 -0.08817869599999881 -0.2531120040000009 0.1247668379999982 -0.09291875599999881 -0.2540600160000009 0.1285760899999982 -0.09197074399999881 -0.2569040520000009 0.1333376549999982 -0.08817869599999881 -0.2483719440000009 0.1285760899999982 -0.09197074399999881 -0.2417358600000009 0.1371469069999982 -0.08533465999999881 -0.2483719440000009 0.1428607849999982 -0.08533465999999881 -0.2474239320000009 0.1314330289999982 -0.08343863599999882 -0.2436318840000009 0.1314330289999982 -0.08343863599999882 -0.2379438120000009 0.1333376549999982 -0.09197074399999881 -0.2341517640000009 0.1333376549999982 -0.08628267199999881 -0.2379438120000009 0.1323853419999982 -0.08154261199999881 -0.2445798960000009 0.1333376549999982 -0.08343863599999882 -0.2426838720000009 0.1390515329999982 -0.09386676799999881 -0.2426838720000009 0.1371469069999982 -0.09860682799999881 -0.2436318840000009 0.1304807159999982 -0.09481477999999881 -0.2445798960000009 0.1295284029999982 -0.09576279199999881 -0.2502679680000009 0.1342899679999982 -0.09291875599999881 -0.2512159800000009 0.1333376549999982 -0.09386676799999881 -0.2512159800000009 0.1323853419999982 -0.08723068399999881 -0.2521639920000009 0.1333376549999982 -0.07490652799999881 -0.2483719440000009 0.1266714639999982 -0.07490652799999881 -0.2474239320000009 0.1295284029999982 -0.08438664799999882 -0.2493199560000009 0.1361945939999982 -0.08723068399999881 -0.2531120040000009 0.1295284029999982 -0.0758545399999988 -0.2407878480000009 0.1295284029999982 -0.07964658799999881 -0.2341517640000009 0.1352422809999982 -0.07775056399999881 -0.2379438120000009 0.1428607849999982 -0.07775056399999881 -0.2369958000000009 0.1409561589999982 -0.08723068399999881 -0.2379438120000009 0.1333376549999982 -0.08154261199999881 -0.2388918240000009 0.1323853419999982 -0.08059459999999881 -0.2483719440000009 0.1352422809999982 -0.08912670799999881 -0.2521639920000009 0.1295284029999982 -0.09291875599999881 -0.2531120040000009 0.1333376549999982 -0.08628267199999881 -0.2550080280000009 0.1380992199999982 -0.08249062399999881 -0.2521639920000009 0.1333376549999982 -0.08723068399999881 -0.2502679680000009 0.1285760899999982 -0.08723068399999881 -0.2569040520000009 0.1304807159999982 -0.08249062399999881 -0.2663841720000009 0.1323853419999982 -0.08343863599999882 -0.2588000760000009 0.1276237769999982 -0.08438664799999882 -0.2455279080000009 0.1352422809999982 -0.08249062399999881 -0.2436318840000009 0.1333376549999982 -0.0768025519999988 -0.2464759200000009 0.1304807159999982 -0.08154261199999881 -0.2436318840000009 0.1342899679999982 -0.08438664799999882 -0.2436318840000009 0.1276237769999982 -0.07964658799999881 -0.2445798960000009 0.1333376549999982 -0.07490652799999881 -0.2445798960000009 0.1323853419999982 -0.07775056399999881 -0.2540600160000009 0.1295284029999982 -0.08628267199999881 -0.2559560400000009 0.1390515329999982 -0.08343863599999882 -0.2455279080000009 0.1400038459999982 -0.08249062399999881 -0.2455279080000009 0.1361945939999982 -0.08912670799999881 -0.2493199560000009 0.1352422809999982 -0.08533465999999881 -0.2531120040000009 0.1400038459999982 -0.08249062399999881 -0.2588000760000009 0.1390515329999982 -0.08628267199999881 -0.2578520640000009 0.1323853419999982 -0.08059459999999881 -0.2521639920000009 0.1304807159999982 -0.08059459999999881 -0.2578520640000009 0.1342899679999982 -0.07964658799999881 -0.2597480880000009 0.1352422809999982 -0.08438664799999882 -0.2578520640000009 0.1428607849999982 -0.0900747199999988 -0.2616441120000009 0.1371469069999982 -0.08059459999999881 -0.2550080280000009 0.1285760899999982 -0.08343863599999882 -0.2474239320000009 0.1266714639999982 -0.08723068399999881 -0.2483719440000009 0.1342899679999982 -0.08249062399999881 -0.2521639920000009 0.1371469069999982 -0.0758545399999988 -0.2455279080000009 0.1304807159999982 -0.07206249199999881 -0.2445798960000009 0.1314330289999982 -0.07395851599999881 -0.2521639920000009 0.1323853419999982 -0.08154261199999881 -0.2550080280000009 0.1333376549999982 -0.08817869599999881 -0.2625921240000009 0.1285760899999982 -0.08628267199999881 -0.2625921240000009 0.1238145249999982 -0.07775056399999881 -0.2512159800000009 0.1257191509999982 -0.08249062399999881 -0.2588000760000009 0.1238145249999982 -0.09955483999999881 -0.2692282080000009 0.1266714639999982 -0.08628267199999881 -0.2625921240000009 0.1342899679999982 -0.07490652799999881 -0.2625921240000009 0.1323853419999982 -0.08059459999999881 -0.2625921240000009 0.1342899679999982 -0.08343863599999882 -0.2521639920000009 0.1390515329999982 -0.08343863599999882 -0.2483719440000009 0.1419084719999982 -0.08343863599999882 -0.2483719440000009 0.1428607849999982 -0.08817869599999881 -0.2512159800000009 0.1390515329999982 -0.0900747199999988 -0.2417358600000009 0.1323853419999982 -0.08912670799999881 -0.2398398360000009 0.1295284029999982 -0.08438664799999882 -0.2455279080000009 0.1352422809999982 -0.07775056399999881 -0.2436318840000009 0.1400038459999982 -0.08059459999999881 -0.2464759200000009 0.1352422809999982 -0.08723068399999881 -0.2625921240000009 0.1323853419999982 -0.0900747199999988 -0.2578520640000009 0.1333376549999982 -0.08723068399999881 -0.2578520640000009 0.1361945939999982 -0.09197074399999881 -0.2483719440000009 0.1304807159999982 -0.09197074399999881 -0.2455279080000009 0.1266714639999982 -0.08154261199999881 -0.2512159800000009 0.1333376549999982 -0.07869857599999881 -0.2417358600000009 0.1238145249999982 -0.07869857599999881 -0.2398398360000009 0.1190529599999982 -0.07111447999999881 -0.2417358600000009 0.1228622119999982 -0.0635303839999988 -0.2398398360000009 0.1200052729999982 -0.0635303839999988 -0.2417358600000009 0.1152437079999982 -0.07016646799999882 -0.2436318840000009 0.1238145249999982 -0.07301050399999881 -0.2369958000000009 0.1219098989999982 -0.07301050399999881 -0.2398398360000009 0.1047682649999982 -0.0768025519999988 -0.2464759200000009 0.1066728909999982 -0.07111447999999881 -0.2388918240000009 0.1133390819999982 -0.06447839599999881 -0.2303597160000009 0.1142913949999982 -0.06447839599999881 -0.2284636920000009 0.1133390819999982 -0.06068634799999881 -0.2350997760000009 0.1171483339999982 -0.05784231199999881 -0.2360477880000009 0.1181006469999982 -0.0625823719999988 -0.2322557400000009 0.1219098989999982 -0.0635303839999988 -0.2275156800000009 0.1276237769999982 -0.0625823719999988 -0.2294117040000009 0.1228622119999982 -0.05499827599999881 -0.2275156800000009 0.1276237769999982 -0.0483621919999988 -0.2227756200000009 0.1361945939999982 -0.05689429999999881 -0.2199315840000009 0.1295284029999982 -0.06163435999999881 -0.2227756200000009 0.1314330289999982 -0.05784231199999881 -0.2256196560000009 0.1295284029999982 -0.05784231199999881 -0.2161395360000009 0.1238145249999982 -0.06163435999999881 -0.2208795960000009 0.1266714639999982 -0.06732243199999881 -0.2227756200000009 0.1285760899999982 -0.05973833599999881 -0.2123474880000009 0.1190529599999982 -0.04741417999999881 -0.2161395360000009 0.1161960209999982 -0.05025821599999881 -0.2132955000000009 0.1266714639999982 -0.05784231199999881 -0.2132955000000009 0.1219098989999982 -0.05594628799999881 -0.2189835720000009 0.1209575859999982 -0.04741417999999881 -0.2189835720000009 0.1276237769999982 -0.04077809599999881 -0.2151915240000009 0.1295284029999982 -0.04267411999999881 -0.2057114040000009 0.1333376549999982 -0.04172610799999881 -0.2019193560000009 0.1295284029999982 -0.03793405999999881 -0.1962312840000009 0.1276237769999982 -0.03414201199999881 -0.1990753200000009 0.1285760899999982 -0.02655791599999881 -0.2019193560000009 0.1314330289999982 -0.02750592799999881 -0.2019193560000009 0.1285760899999982 -0.03414201199999881 -0.2085554400000009 0.1295284029999982 -0.03888207199999881 -0.2085554400000009 0.1295284029999982 -0.04172610799999881 -0.2019193560000009 0.1285760899999982 -0.03793405999999881 -0.1971792960000009 0.1276237769999982 -0.03888207199999881 -0.2038153800000009 0.1200052729999982 -0.04172610799999881 -0.2057114040000009 0.1104821429999982 -0.04362213199999881 -0.2047633920000009 0.1152437079999982 -0.04457014399999881 -0.2066594160000009 0.1304807159999982 -0.04362213199999881 -0.2038153800000009 0.1333376549999982 -0.04551815599999881 -0.2057114040000009 0.1276237769999982 -0.05025821599999881 -0.2104514640000009 0.1200052729999982 -0.04741417999999881 -0.2076074280000009 0.1209575859999982 -0.04931020399999881 -0.1981273080000009 0.1200052729999982 -0.05405026399999881 -0.1905432120000009 0.1190529599999982 -0.03888207199999881 -0.1924392360000009 0.1171483339999982 -0.03698604799999881 -0.1867511640000009 0.1181006469999982 -0.04457014399999881 -0.1820111040000009 0.1266714639999982 -0.04362213199999881 -0.1867511640000009 0.1295284029999982 -0.03414201199999881 -0.1848551400000009 0.1190529599999982 -0.01992183199999881 -0.1839071280000009 0.1181006469999982 -0.02845393999999881 -0.1829591160000009 0.1238145249999982 -0.04457014399999881 -0.1858031520000009 0.1171483339999982 -0.04457014399999881 -0.1952832720000009 0.1228622119999982 -0.04551815599999881 -0.2000233320000009 0.1304807159999982 -0.03793405999999881 -0.1971792960000009 0.1285760899999982 -0.03793405999999881 -0.1943352600000009 0.1266714639999982 -0.04172610799999881 -0.1848551400000009 0.1266714639999982 -0.02845393999999881 -0.1839071280000009 0.1266714639999982 -0.02750592799999881 -0.1886471880000009 0.1295284029999982 -0.03224598799999881 -0.1829591160000009 0.1266714639999982 -0.02940195199999881 -0.1848551400000009 0.1257191509999982 -0.02655791599999881 -0.1829591160000009 0.1352422809999982 -0.01612978399999881 -0.1772710440000009 0.1314330289999982 -0.008545687999998807 -0.1725309840000009 0.1247668379999982 -0.01802580799999881 -0.1677909240000009 0.1266714639999982 -0.01328574799999881 -0.1639988760000009 0.1323853419999982 -0.008545687999998807 -0.1658949000000009 0.1342899679999982 -0.01423375999999881 -0.1696869480000009 0.1285760899999982 -0.02371387999999881 -0.1744270080000009 0.1266714639999982 -0.03319399999999881 -0.1763230320000009 0.1209575859999982 -0.02276586799999881 -0.1677909240000009 0.1200052729999982 -0.02371387999999881 -0.1725309840000009 0.1238145249999982 -0.03224598799999881 -0.1801150800000009 0.1181006469999982 -0.02371387999999881 -0.1810630920000009 0.1219098989999982 -0.02560990399999881 -0.1829591160000009 0.1276237769999982 -0.03129797599999881 -0.1753750200000009 0.1247668379999982 -0.02560990399999881 -0.1630508640000009 0.1219098989999982 -0.01802580799999881 -0.1564147800000009 0.1190529599999982 -0.01707779599999881 -0.1535707440000009 0.1200052729999982 -0.02181785599999881 -0.1564147800000009 0.1304807159999982 -0.01518177199999881 -0.1649468880000009 0.1333376549999982 -0.007597675999998808 -0.1592588160000009 0.1295284029999982 -0.01233773599999881 -0.1516747200000009 0.1266714639999982 -0.01423375999999881 -0.1602068280000009 0.1228622119999982 -0.01138972399999881 -0.1621028520000009 0.1209575859999982 -0.007597675999998808 -0.1545187560000009 0.1200052729999982 -0.01138972399999881 -0.1535707440000009 0.1219098989999982 -0.01612978399999881 -0.1573627920000009 0.1219098989999982 -0.01707779599999881 -0.1602068280000009 0.1276237769999982 -0.02086984399999881 -0.1554667680000009 0.1295284029999982 -0.02181785599999881 -0.1535707440000009 0.1295284029999982 -0.01044171199999881 -0.1526227320000009 0.1285760899999982 -1.357999999880739e-05 -0.1564147800000009 0.1219098989999982 -0.003805627999998808 -0.1592588160000009 0.1190529599999982 -0.006649663999998808 -0.1507267080000009 0.1247668379999982 -0.005701651999998808 -0.1469346600000009 0.1266714639999982 -0.003805627999998808 -0.1431426120000009 0.1285760899999982 -0.009493699999998807 -0.1365065280000009 0.1371469069999982 -0.01044171199999881 -0.1450386360000009 0.1361945939999982 -0.002857615999998807 -0.1488306840000009 0.1361945939999982 -1.357999999880739e-05 -0.1374545400000009 0.1390515329999982 0.007570516000001193 -0.1346105040000009 0.1314330289999982 0.01136256400000119 -0.1374545400000009 0.1209575859999982 -0.004753639999998808 -0.1412465880000009 0.1228622119999982 -0.01423375999999881 -0.1526227320000009 0.1266714639999982 -0.005701651999998808 -0.1535707440000009 0.1352422809999982 -0.009493699999998807 -0.1431426120000009 0.1409561589999982 -0.01707779599999881 -0.1478826720000009 0.1285760899999982 -0.005701651999998808 -0.1535707440000009 0.1266714639999982 -0.003805627999998808 -0.1516747200000009 0.1314330289999982 -0.01044171199999881 -0.1583108040000009 0.1323853419999982 -0.01044171199999881 -0.1573627920000009 0.1304807159999982 -0.01138972399999881 -0.1564147800000009 0.1266714639999982 -0.002857615999998807 -0.1469346600000009 0.1371469069999982 0.002830456000001192 -0.1355585160000009 0.1371469069999982 0.005674492000001193 -0.1279744200000009 0.1304807159999982 0.009466540000001192 -0.1232343600000009 0.1209575859999982 0.005674492000001193 -0.1270264080000009 0.1200052729999982 0.008518528000001193 -0.1346105040000009 0.1238145249999982 0.01515461200000119 -0.1327144800000009 0.1181006469999982 0.01894666000000119 -0.1260783960000009 0.1238145249999982 0.01041455200000119 -0.1289224320000009 0.1352422809999982 -0.003805627999998808 -0.1317664680000009 0.1352422809999982 0.005674492000001193 -0.1317664680000009 0.1276237769999982 0.006622504000001193 -0.1346105040000009 0.1209575859999982 -0.007597675999998808 -0.1355585160000009 0.1228622119999982 -0.0009615919999988072 -0.1393505640000009 0.1285760899999982 0.002830456000001192 -0.1478826720000009 0.1276237769999982 0.003778468000001192 -0.1393505640000009 0.1266714639999982 0.005674492000001193 -0.1289224320000009 0.1247668379999982 0.002830456000001192 -0.1270264080000009 0.1238145249999982 0.005674492000001193 -0.1260783960000009 0.1342899679999982 0.01799864800000119 -0.1184943000000009 0.1419084719999982 0.02084268400000119 -0.1023780960000009 0.1380992199999982 0.02179069600000119 -0.0976380360000009 0.1285760899999982 0.02937479200000119 -0.1128062280000009 0.1285760899999982 0.03411485200000119 -0.1194423120000009 0.1333376549999982 0.02558274400000119 -0.1099621920000009 0.1266714639999982 0.02368672000000119 -0.1109102040000009 0.1266714639999982 0.02937479200000119 -0.1128062280000009 0.1285760899999982 0.0303228040000012 -0.1156502640000009 0.1228622119999982 0.02179069600000119 -0.1203903240000009 0.1247668379999982 0.007570516000001193 -0.1175462880000009 0.1295284029999982 0.006622504000001193 -0.1156502640000009 0.1314330289999982 0.01420660000000119 -0.1156502640000009 0.1295284029999982 0.02653075600000119 -0.1147022520000009 0.1323853419999982 0.0303228040000012 -0.1080661680000009 0.1314330289999982 0.02558274400000119 -0.1099621920000009 0.1285760899999982 0.02653075600000119 -0.1156502640000009 0.1295284029999982 0.02368672000000119 -0.1071181560000009 0.1390515329999982 0.01894666000000119 -0.1004820720000009 0.1380992199999982 0.03221882800000119 -0.1014300840000009 0.1228622119999982 0.04075093600000119 -0.1023780960000009 0.1295284029999982 0.02842678000000119 -0.1014300840000009 0.1361945939999982 0.02273870800000119 -0.1071181560000009 0.1304807159999982 0.02842678000000119 -0.1109102040000009 0.1276237769999982 0.0303228040000012 -0.1061701440000009 0.1276237769999982 0.02463473200000119 -0.1052221320000009 0.1304807159999982 0.02747876800000119 -0.1090141800000009 0.1219098989999982 0.02842678000000119 -0.1156502640000009 0.1238145249999982 0.03411485200000119 -0.1118582160000009 0.1361945939999982 0.02937479200000119 -0.1118582160000009 0.1400038459999982 0.03221882800000119 -0.1165982760000009 0.1400038459999982 0.0473870200000012 -0.1099621920000009 0.1295284029999982 0.04454298400000119 -0.1071181560000009 0.1238145249999982 0.03601087600000119 -0.09953406000000091 0.1323853419999982 0.02179069600000119 -0.0900539400000009 0.1400038459999982 0.02653075600000119 -0.08720990400000091 0.1361945939999982 0.04169894800000119 -0.0957420120000009 0.1304807159999982 0.04169894800000119 -0.09479400000000091 0.1304807159999982 0.05023105600000119 -0.0881579160000009 0.1390515329999982 0.0473870200000012 -0.09384598800000091 0.1352422809999982 0.03885491200000119 -0.09194996400000091 0.1276237769999982 0.05023105600000119 -0.0834178560000009 0.1304807159999982 0.04549099600000119 -0.08720990400000091 0.1219098989999982 0.0369588880000012 -0.0976380360000009 0.1152437079999982 0.03411485200000119 -0.09858604800000091 0.1200052729999982 0.0303228040000012 -0.0976380360000009 0.1285760899999982 0.03601087600000119 -0.09194996400000091 0.1266714639999982 0.04169894800000119 -0.09100195200000091 0.1190529599999982 0.04549099600000119 -0.09100195200000091 0.1209575859999982 0.04075093600000119 -0.0843658680000009 0.1228622119999982 0.0464390080000012 -0.08626189200000091 0.1238145249999982 0.06255521200000119 -0.08057382000000091 0.1304807159999982 0.05876316400000119 -0.07204171200000091 0.1314330289999982 0.05212708000000119 -0.0710937000000009 0.1285760899999982 0.05117906800000119 -0.0767817720000009 0.1266714639999982 0.05117906800000119 -0.07962580800000091 0.1323853419999982 0.05876316400000119 -0.07393773600000091 0.1380992199999982 0.06160720000000119 -0.07772978400000091 0.1342899679999982 0.0578151520000012 -0.0834178560000009 0.1380992199999982 0.0530750920000012 -0.0834178560000009 0.1447654109999982 0.0464390080000012 -0.07962580800000091 0.1352422809999982 0.04928304400000119 -0.07867779600000091 0.1314330289999982 0.05497111600000119 -0.0824698440000009 0.1304807159999982 0.06160720000000119 -0.0891059280000009 0.1247668379999982 0.0578151520000012 -0.0891059280000009 0.1257191509999982 0.0540231040000012 -0.0843658680000009 0.1304807159999982 0.0597111760000012 -0.07962580800000091 0.1295284029999982 0.0606591880000012 -0.0691976760000009 0.1295284029999982 0.0597111760000012 -0.06635364000000091 0.1295284029999982 0.05686714000000119 -0.0701456880000009 0.1361945939999982 0.0672952720000012 -0.0635096040000009 0.1361945939999982 0.0748793680000012 -0.06540562800000091 0.1352422809999982 0.0663472600000012 -0.07204171200000091 0.1409561589999982 0.06445123600000119 -0.0701456880000009 0.1400038459999982 0.06539924800000119 -0.06730165200000091 0.1428607849999982 0.06919129600000119 -0.0682496640000009 0.1342899679999982 0.0672952720000012 -0.0691976760000009 0.1295284029999982 0.06255521200000119 -0.06540562800000091 0.1371469069999982 0.06919129600000119 -0.06445761600000091 0.1371469069999982 0.06919129600000119 -0.05971755600000091 0.1304807159999982 0.07108732000000119 -0.0635096040000009 0.1314330289999982 0.07677539200000119 -0.06635364000000091 0.1276237769999982 0.08341147600000119 -0.06066556800000091 0.1314330289999982 0.0739313560000012 -0.06540562800000091 0.1390515329999982 0.06350322400000119 -0.0710937000000009 0.1333376549999982 0.0663472600000012 -0.06540562800000091 0.1342899679999982 0.0672952720000012 -0.06066556800000091 0.1361945939999982 0.07108732000000119 -0.05308147200000091 0.1390515329999982 0.07013930800000119 -0.04644538800000091 0.1390515329999982 0.0663472600000012 -0.0473934000000009 0.1314330289999982 0.0739313560000012 -0.05213346000000091 0.1352422809999982 0.0872035240000012 -0.05308147200000091 0.1390515329999982 0.09004756000000119 -0.05213346000000091 0.1257191509999982 0.09099557200000119 -0.0511854480000009 0.1181006469999982 0.08435948800000119 -0.0549774960000009 0.1181006469999982 0.07867141600000119 -0.05687352000000091 0.1304807159999982 0.0729833440000012 -0.0559255080000009 0.1409561589999982 0.07772340400000119 -0.06540562800000091 0.1390515329999982 0.0872035240000012 -0.06445761600000091 0.1352422809999982 0.0881515360000012 -0.05876954400000091 0.1342899679999982 0.0815154520000012 -0.05971755600000091 0.1352422809999982 0.07772340400000119 -0.0691976760000009 0.1361945939999982 0.07772340400000119 -0.0682496640000009 0.1361945939999982 0.0805674400000012 -0.05876954400000091 0.1314330289999982 0.0947876200000012 -0.05876954400000091 0.1314330289999982 0.0947876200000012 -0.05023743600000091 0.1285760899999982 0.0872035240000012 -0.03601725600000091 0.1219098989999982 0.08246346400000119 -0.04265334000000091 0.1209575859999982 0.07582738000000119 -0.05023743600000091 0.1238145249999982 0.0796194280000012 -0.0436013520000009 0.1238145249999982 0.0881515360000012 -0.0379132800000009 0.1295284029999982 0.0881515360000012 -0.0379132800000009 0.1304807159999982 0.09099557200000119 -0.04265334000000091 0.1257191509999982 0.0928915960000012 -0.0379132800000009 0.1371469069999982 0.09004756000000119 -0.03317322000000091 0.1419084719999982 0.0928915960000012 -0.03980930400000091 0.1276237769999982 0.09573563200000119 -0.03886129200000091 0.1276237769999982 0.0938396080000012 -0.03980930400000091 0.1276237769999982 0.0796194280000012 -0.03980930400000091 0.1314330289999982 0.0815154520000012 -0.0369652680000009 0.1409561589999982 0.09763165600000119 -0.0369652680000009 0.1419084719999982 0.0947876200000012 -0.0303291840000009 0.1409561589999982 0.1004756920000012 -0.0284331600000009 0.1419084719999982 0.1052157520000012 -0.03601725600000091 0.1447654109999982 0.09668364400000119 -0.02938117200000091 0.1476223499999982 0.09668364400000119 -0.0236931000000009 0.1380992199999982 0.09194358400000119 -0.0284331600000009 0.1323853419999982 0.09004756000000119 -0.02274508800000091 0.1304807159999982 0.1033197280000012 -0.0217970760000009 0.1266714639999982 0.1061637640000012 -0.0284331600000009 0.1380992199999982 0.09194358400000119 -0.0255891240000009 0.1409561589999982 0.0928915960000012 -0.0199010520000009 0.1285760899999982 0.1014237040000012 -0.0255891240000009 0.1219098989999982 0.0995276800000012 -0.0312771960000009 0.1285760899999982 0.09763165600000119 -0.0341212320000009 0.1266714639999982 0.1023717160000012 -0.0379132800000009 0.1247668379999982 0.1004756920000012 -0.0284331600000009 0.1314330289999982 0.0995276800000012 -0.0236931000000009 0.1371469069999982 0.1137478600000012 -0.0255891240000009 0.1457177239999982 0.1222799680000012 -0.0180050280000009 0.1380992199999982 0.1127998480000012 -0.0151609920000009 0.1380992199999982 0.1071117760000012 -0.008524908000000903 0.1504792889999982 0.1071117760000012 7.199999999096818e-06 0.1428607849999982 0.1175399080000012 -0.005680872000000904 0.1295284029999982 0.1298640640000012 -0.006628884000000904 0.1295284029999982 0.1222799680000012 -0.0104209320000009 0.1361945939999982 0.1127998480000012 -0.0142129800000009 0.1400038459999982 0.1052157520000012 -0.01610900400000091 0.1352422809999982 0.1090078000000012 -0.0151609920000009 0.1209575859999982 0.1175399080000012 -0.0113689440000009 0.1133390819999982 0.1146958720000012 -0.0104209320000009 0.1257191509999982 0.1023717160000012 -0.008524908000000903 0.1361945939999982 0.1061637640000012 -0.0123169560000009 0.1352422809999982 0.1184879200000012 -0.0170570160000009 0.1295284029999982 0.1203839440000012 -0.0189530400000009 0.1257191509999982 0.1137478600000012 -0.0189530400000009 0.1276237769999982 0.1080597880000012 -0.0208490640000009 0.1295284029999982 0.1109038240000012 -0.01610900400000091 0.1257191509999982 0.1184879200000012 -0.008524908000000903 0.1314330289999982 0.1194359320000012 -0.003784848000000902 0.1428607849999982 0.1137478600000012 -0.006628884000000904 0.1428607849999982 0.1127998480000012 -0.009472920000000903 0.1409561589999982 0.1071117760000012 -0.003784848000000902 0.1428607849999982 0.1080597880000012 -0.002836836000000903 0.1438130979999982 0.1109038240000012 -0.0113689440000009 0.1419084719999982 0.1052157520000012 -0.01610900400000091 0.1247668379999982 0.1023717160000012 -0.0151609920000009 0.1171483339999982 0.1033197280000012 -0.0170570160000009 0.1323853419999982 0.1071117760000012 -0.0170570160000009 0.1419084719999982 0.1156438840000012 -0.0142129800000009 0.1409561589999982 0.1090078000000012 -0.0142129800000009 0.1266714639999982 0.1099558120000012 -0.0132649680000009 0.1228622119999982 0.1156438840000012 -0.009472920000000903 0.1342899679999982 0.1109038240000012 -0.0123169560000009 0.1428607849999982 0.1118518360000012 -0.0132649680000009 0.1447654109999982 0.1090078000000012 -0.0113689440000009 0.1409561589999982 0.1127998480000012 -0.005680872000000904 0.1438130979999982 0.1203839440000012 0.003799247999999096 0.1400038459999982 0.1203839440000012 -0.001888824000000903 0.1380992199999982 0.1184879200000012 -0.01610900400000091 0.1457177239999982 0.1137478600000012 -0.0199010520000009 0.1380992199999982 0.1004756920000012 -0.0151609920000009 0.1323853419999982 0.1014237040000012 -0.01610900400000091 0.1304807159999982 0.0985796680000012 -0.0265371360000009 0.1285760899999982 0.0928915960000012 -0.02938117200000091 0.1352422809999982 0.1090078000000012 -0.0217970760000009 0.1380992199999982 0.1109038240000012 -0.0217970760000009 0.1323853419999982 0.0995276800000012 -0.0265371360000009 0.1266714639999982 0.1080597880000012 -0.01610900400000091 0.1257191509999982 0.1137478600000012 -0.0113689440000009 0.1276237769999982 0.1061637640000012 -0.0113689440000009 0.1371469069999982 0.1023717160000012 -0.007576896000000903 0.1361945939999982 0.09668364400000119 -0.0123169560000009 0.1276237769999982 0.1033197280000012 -0.0180050280000009 0.1295284029999982 0.1165918960000012 -0.0208490640000009 0.1390515329999982 0.1184879200000012 -0.0151609920000009 0.1400038459999982 0.1213319560000012 -0.005680872000000904 0.1409561589999982 0.1137478600000012 -0.0151609920000009 0.1438130979999982 0.1061637640000012 -0.0274851480000009 0.1352422809999982 0.1099558120000012 -0.03317322000000091 0.1285760899999982 0.1033197280000012 -0.0255891240000009 0.1352422809999982 0.1052157520000012 -0.0180050280000009 0.1380992199999982 0.1146958720000012 -0.0189530400000009 0.1409561589999982 0.1099558120000012 -0.0189530400000009 0.1342899679999982 0.1099558120000012 -0.02274508800000091 0.1228622119999982 0.1090078000000012 -0.0284331600000009 0.1342899679999982 0.1061637640000012 -0.0236931000000009 0.1400038459999982 0.1080597880000012 -0.0132649680000009 0.1400038459999982 0.1090078000000012 -0.0151609920000009 0.1447654109999982 0.1071117760000012 -0.0132649680000009 0.1409561589999982 0.1118518360000012 -0.0113689440000009 0.1419084719999982 0.1109038240000012 -0.0151609920000009 0.1457177239999982 0.1118518360000012 -0.0189530400000009 0.1485746629999982 0.1175399080000012 -0.01610900400000091 0.1390515329999982 0.1156438840000012 -0.0113689440000009 0.1323853419999982 0.1109038240000012 -0.009472920000000903 0.1342899679999982 0.1061637640000012 -0.0132649680000009 0.1295284029999982 0.1099558120000012 -0.0180050280000009 0.1304807159999982 0.1109038240000012 -0.0142129800000009 0.1285760899999982 0.1061637640000012 -0.0170570160000009 0.1276237769999982 0.1099558120000012 -0.01610900400000091 0.1323853419999982 0.1080597880000012 -0.0189530400000009 0.1276237769999982 0.1061637640000012 -0.0274851480000009 0.1323853419999982 0.1090078000000012 -0.0284331600000009 0.1428607849999982 0.1080597880000012 -0.03222520800000091 0.1400038459999982 0.1109038240000012 -0.02938117200000091 0.1380992199999982 0.1099558120000012 -0.0236931000000009 0.1371469069999982 0.1127998480000012 -0.0199010520000009 0.1333376549999982 0.1165918960000012 -0.0189530400000009 0.1409561589999982 0.1127998480000012 -0.0170570160000009 0.1485746629999982 0.1165918960000012 -0.0132649680000009 0.1523839149999982 0.1194359320000012 -0.0151609920000009 0.1495269759999982 0.1099558120000012 -0.0170570160000009 0.1333376549999982 0.1118518360000012 -0.0180050280000009 0.1361945939999982 0.1175399080000012 -0.01610900400000091 0.1476223499999982 0.1080597880000012 -0.0199010520000009 0.1428607849999982 0.1052157520000012 -0.0199010520000009 0.1323853419999982 0.1080597880000012 -0.0208490640000009 0.1247668379999982 0.1061637640000012 -0.02274508800000091 0.1200052729999982 0.1042677400000012 -0.02274508800000091 0.1295284029999982 0.09763165600000119 -0.0303291840000009 0.1371469069999982 0.0995276800000012 -0.0312771960000009 0.1266714639999982 0.1090078000000012 -0.0303291840000009 0.1161960209999982 0.1090078000000012 -0.03222520800000091 0.1142913949999982 0.1090078000000012 -0.0303291840000009 0.1228622119999982 0.1071117760000012 -0.02938117200000091 0.1314330289999982 0.0985796680000012 -0.0189530400000009 0.1380992199999982 0.0995276800000012 -0.005680872000000904 0.1380992199999982 0.1080597880000012 -0.0104209320000009 0.1342899679999982 0.1194359320000012 -0.01610900400000091 0.1276237769999982 0.1194359320000012 -0.0170570160000009 0.1304807159999982 0.1127998480000012 -0.0208490640000009 0.1447654109999982 0.1099558120000012 -0.0104209320000009 0.1476223499999982 0.1099558120000012 -0.005680872000000904 0.1342899679999982 0.1137478600000012 -0.0113689440000009 0.1380992199999982 0.1033197280000012 -0.0180050280000009 0.1504792889999982 0.09763165600000119 -0.0274851480000009 0.1428607849999982 0.1061637640000012 -0.0236931000000009 0.1438130979999982 0.1052157520000012 -0.0208490640000009 0.1409561589999982 0.1033197280000012 -0.0246411120000009 0.1342899679999982 0.1146958720000012 -0.0274851480000009 0.1438130979999982 0.1165918960000012 -0.02274508800000091 0.1504792889999982 0.1080597880000012 -0.0170570160000009 0.1476223499999982 0.1127998480000012 -0.0132649680000009 0.1476223499999982 0.1146958720000012 -0.0189530400000009 0.1447654109999982 0.1052157520000012 -0.0180050280000009 0.1342899679999982 0.1090078000000012 -0.008524908000000903 0.1285760899999982 0.1184879200000012 -0.0132649680000009 0.1352422809999982 0.1194359320000012 -0.0142129800000009 0.1485746629999982 0.1127998480000012 -0.0113689440000009 0.1390515329999982 0.1099558120000012 -0.0151609920000009 0.1333376549999982 0.1052157520000012 -0.02274508800000091 0.1333376549999982 0.1052157520000012 -0.0199010520000009 0.1361945939999982 0.1090078000000012 -0.0189530400000009 0.1371469069999982 0.1052157520000012 -0.0255891240000009 0.1295284029999982 0.1118518360000012 -0.0284331600000009 0.1361945939999982 0.1023717160000012 -0.0274851480000009 0.1457177239999982 0.09668364400000119 -0.0217970760000009 0.1485746629999982 0.1071117760000012 -0.0189530400000009 0.1352422809999982 0.1109038240000012 -0.0217970760000009 0.1257191509999982 0.1127998480000012 -0.0303291840000009 0.1285760899999982 0.1099558120000012 -0.02938117200000091 0.1371469069999982 0.1080597880000012 -0.0236931000000009 0.1400038459999982 0.1156438840000012 -0.0142129800000009 0.1333376549999982 0.1251240040000012 -0.009472920000000903 0.1428607849999982 0.1241759920000012 -0.009472920000000903 0.1466700369999982 0.1127998480000012 -0.009472920000000903 0.1342899679999982 0.1175399080000012 -0.0151609920000009 0.1314330289999982 0.1184879200000012 -0.0142129800000009 0.1333376549999982 0.1080597880000012 -0.0142129800000009 0.1361945939999982 0.0995276800000012 -0.0180050280000009 0.1409561589999982 0.0947876200000012 -0.0199010520000009 0.1380992199999982 0.1033197280000012 -0.0217970760000009 0.1419084719999982 0.1042677400000012 -0.0208490640000009 0.1495269759999982 0.1023717160000012 -0.0236931000000009 0.1447654109999982 0.1061637640000012 -0.0217970760000009 0.1380992199999982 0.1109038240000012 -0.0180050280000009 0.1295284029999982 0.1109038240000012 -0.0199010520000009 0.1304807159999982 0.1099558120000012 -0.0180050280000009 0.1409561589999982 0.1118518360000012 -0.0151609920000009 0.1447654109999982 0.1080597880000012 -0.0113689440000009 0.1400038459999982 0.1071117760000012 -0.009472920000000903 0.1390515329999982 0.1118518360000012 -0.0170570160000009 0.1438130979999982 0.1090078000000012 -0.0189530400000009 0.1390515329999982 0.1090078000000012 -0.0170570160000009 0.1323853419999982 0.1099558120000012 -0.0170570160000009 0.1390515329999982 0.1023717160000012 -0.0151609920000009 0.1485746629999982 0.1004756920000012 -0.0123169560000009 0.1419084719999982 0.1033197280000012 -0.0113689440000009 0.1304807159999982 0.1080597880000012 -0.0274851480000009 0.1314330289999982 0.1023717160000012 -0.0312771960000009 0.1304807159999982 0.1014237040000012 -0.0274851480000009 0.1352422809999982 0.1099558120000012 -0.0265371360000009 0.1447654109999982 0.1052157520000012 -0.0189530400000009 0.1390515329999982 0.1014237040000012 -0.02274508800000091 0.1390515329999982 0.1052157520000012 -0.01610900400000091 0.1428607849999982 0.1127998480000012 -0.003784848000000902 0.1419084719999982 0.1118518360000012 -0.008524908000000903 0.1409561589999982 0.1090078000000012 -0.008524908000000903 0.1428607849999982 0.1137478600000012 0.003799247999999096 0.1409561589999982 0.1109038240000012 -0.003784848000000902 0.1285760899999982 0.1146958720000012 -0.0170570160000009 0.1276237769999982 0.1099558120000012 -0.0180050280000009 0.1419084719999982 0.09668364400000119 -0.0151609920000009 0.1380992199999982 0.0928915960000012 -0.0199010520000009 0.1314330289999982 0.0881515360000012 -0.0189530400000009 0.1314330289999982 0.09573563200000119 -0.01610900400000091 0.1333376549999982 0.1109038240000012 -0.0274851480000009 0.1371469069999982 0.1033197280000012 -0.0303291840000009 0.1390515329999982 0.1014237040000012 -0.0208490640000009 0.1380992199999982 0.1080597880000012 -0.0123169560000009 0.1352422809999982 0.1023717160000012 -0.0123169560000009 0.1457177239999982 0.1014237040000012 -0.0123169560000009 0.1523839149999982 0.1033197280000012 -0.0104209320000009 0.1457177239999982 0.1033197280000012 -0.0142129800000009 0.1476223499999982 0.1061637640000012 -0.0113689440000009 0.1419084719999982 0.1090078000000012 -0.008524908000000903 0.1438130979999982 0.1156438840000012 -0.006628884000000904 0.1533362279999982 0.1156438840000012 -0.004732860000000904 0.1447654109999982 0.1099558120000012 -0.009472920000000903 0.1390515329999982 0.1004756920000012 -0.0151609920000009 0.1371469069999982 0.09763165600000119 -0.0170570160000009 0.1276237769999982 0.1023717160000012 -0.0180050280000009 0.1190529599999982 0.1004756920000012 -0.0189530400000009 0.1219098989999982 0.1052157520000012 -0.01610900400000091 0.1295284029999982 0.1023717160000012 -0.0180050280000009 0.1438130979999982 0.1080597880000012 -0.0199010520000009 0.1457177239999982 0.1137478600000012 -0.02274508800000091 0.1409561589999982 0.1023717160000012 -0.0199010520000009 0.1400038459999982 0.0995276800000012 -0.0170570160000009 0.1361945939999982 0.1080597880000012 -0.0189530400000009 0.1400038459999982 0.1099558120000012 -0.0142129800000009 0.1380992199999982 0.1061637640000012 -0.009472920000000903 0.1352422809999982 0.1071117760000012 -0.008524908000000903 0.1380992199999982 0.1146958720000012 -0.0151609920000009 0.1333376549999982 0.1194359320000012 -0.0142129800000009 0.1295284029999982 0.1175399080000012 -0.0104209320000009 0.1352422809999982 0.1080597880000012 -0.0170570160000009 0.1419084719999982 0.09573563200000119 -0.02274508800000091 0.1380992199999982 0.0947876200000012 -0.0255891240000009 0.1400038459999982 0.1014237040000012 -0.0180050280000009 0.1380992199999982 0.1014237040000012 -0.0151609920000009 0.1361945939999982 0.1109038240000012 -0.0284331600000009 0.1447654109999982 0.1137478600000012 -0.0274851480000009 0.1485746629999982 0.1137478600000012 -0.0236931000000009 0.1457177239999982 0.1175399080000012 -0.0236931000000009 0.1476223499999982 0.1175399080000012 -0.0142129800000009 0.1457177239999982 0.1061637640000012 -0.009472920000000903 0.1380992199999982 0.0995276800000012 -0.0123169560000009 0.1428607849999982 0.1146958720000012 -0.006628884000000904 0.1466700369999982 0.1203839440000012 -0.005680872000000904 0.1419084719999982 0.1090078000000012 -0.008524908000000903 0.1295284029999982 0.1052157520000012 -0.0104209320000009 0.1323853419999982 0.1080597880000012 -0.0132649680000009 0.1457177239999982 0.1052157520000012 -0.0142129800000009 0.1342899679999982 0.1061637640000012 -0.0208490640000009 0.1352422809999982 0.1080597880000012 -0.0284331600000009 0.1457177239999982 0.1061637640000012 -0.0246411120000009 0.1409561589999982 0.1033197280000012 -0.0246411120000009 0.1485746629999982 0.1033197280000012 -0.02938117200000091 0.1571454799999982 0.1090078000000012 -0.0341212320000009 0.1466700369999982 0.1127998480000012 -0.03317322000000091 0.1419084719999982 0.1090078000000012 -0.0265371360000009 0.1447654109999982 0.1071117760000012 -0.0199010520000009 0.1485746629999982 0.1014237040000012 -0.0113689440000009 0.1457177239999982 0.1061637640000012 -0.002836836000000903 0.1380992199999982 0.1184879200000012 -0.001888824000000903 0.1352422809999982 0.1080597880000012 -0.0132649680000009 0.1352422809999982 0.0995276800000012 -0.0199010520000009 0.1457177239999982 0.1175399080000012 -0.0189530400000009 0.1409561589999982 0.1194359320000012 -0.0170570160000009 0.1295284029999982 0.1014237040000012 -0.0142129800000009 0.1285760899999982 0.1080597880000012 -0.0123169560000009 0.1333376549999982 0.1165918960000012 -0.0151609920000009 0.1371469069999982 0.1127998480000012 -0.0217970760000009 0.1323853419999982 0.1052157520000012 -0.0208490640000009 0.1247668379999982 0.1004756920000012 -0.0217970760000009 0.1247668379999982 0.1033197280000012 -0.0284331600000009 0.1342899679999982 0.1023717160000012 -0.0255891240000009 0.1380992199999982 0.1042677400000012 -0.02274508800000091 0.1428607849999982 0.1033197280000012 -0.0246411120000009 0.1428607849999982 0.1004756920000012 -0.0255891240000009 0.1428607849999982 0.1014237040000012 -0.0208490640000009 0.1495269759999982 0.1033197280000012 -0.0199010520000009 0.1476223499999982 0.1127998480000012 -0.0246411120000009 0.1400038459999982 0.1203839440000012 -0.0255891240000009 0.1409561589999982 0.1175399080000012 -0.0151609920000009 0.1495269759999982 0.1061637640000012 -0.008524908000000903 0.1476223499999982 0.1042677400000012 -0.009472920000000903 0.1447654109999982 0.1052157520000012 -0.0142129800000009 0.1504792889999982 0.1014237040000012 -0.0142129800000009 0.1485746629999982 0.1023717160000012 -0.01610900400000091 0.1390515329999982 0.1052157520000012 -0.0236931000000009 0.1390515329999982 0.1080597880000012 -0.0312771960000009 0.1447654109999982 0.1109038240000012 -0.0255891240000009 0.1400038459999982 0.1137478600000012 -0.0246411120000009 0.1466700369999982 0.1146958720000012 -0.03222520800000091 0.1466700369999982 0.1241759920000012 -0.0236931000000009 0.1361945939999982 0.1165918960000012 -0.01610900400000091 0.1409561589999982 0.1061637640000012 -0.0123169560000009 0.1438130979999982 0.1109038240000012 -0.0170570160000009 0.1485746629999982 0.1156438840000012 -0.0199010520000009 0.1447654109999982 0.1194359320000012 -0.009472920000000903 0.1371469069999982 0.1175399080000012 -0.0113689440000009 0.1466700369999982 0.1222799680000012 -0.0180050280000009 0.1466700369999982 0.1203839440000012 -0.0199010520000009 0.1323853419999982 0.1109038240000012 -0.0113689440000009 0.1295284029999982 0.1118518360000012 -0.0142129800000009 0.1380992199999982 0.1146958720000012 -0.0246411120000009 0.1361945939999982 0.1023717160000012 -0.02274508800000091 0.1390515329999982 0.1004756920000012 -0.0265371360000009 0.1523839149999982 0.1061637640000012 -0.0303291840000009 0.1438130979999982 0.1052157520000012 -0.0303291840000009 0.1333376549999982 0.1080597880000012 -0.03601725600000091 0.1390515329999982 0.1137478600000012 -0.0265371360000009 0.1323853419999982 0.1071117760000012 -0.0132649680000009 0.1400038459999982 0.1080597880000012 -0.0142129800000009 0.1476223499999982 0.1127998480000012 -0.008524908000000903 0.1447654109999982 0.1090078000000012 -0.007576896000000903 0.1447654109999982 0.1127998480000012 -0.0123169560000009 0.1438130979999982 0.1175399080000012 -0.0180050280000009 0.1476223499999982 0.1175399080000012 -0.0199010520000009 0.1466700369999982 0.1080597880000012 -0.0170570160000009 0.1447654109999982 0.09763165600000119 -0.0189530400000009 0.1409561589999982 0.1099558120000012 -0.0236931000000009 0.1400038459999982 0.1146958720000012 -0.0208490640000009 0.1419084719999982 0.1052157520000012 -0.0151609920000009 0.1361945939999982 0.1061637640000012 -0.0180050280000009 0.1380992199999982 0.1137478600000012 -0.02274508800000091 0.1457177239999982 0.1127998480000012 -0.0255891240000009 0.1438130979999982 0.1052157520000012 -0.0341212320000009 0.1371469069999982 0.1099558120000012 -0.0341212320000009 0.1333376549999982 0.1156438840000012 -0.0246411120000009 0.1400038459999982 0.1071117760000012 -0.0217970760000009 0.1419084719999982 0.1052157520000012 -0.0170570160000009 0.1466700369999982 0.1137478600000012 -0.0151609920000009 0.1533362279999982 0.1213319560000012 -0.0142129800000009 0.1476223499999982 0.1213319560000012 -0.0123169560000009 0.1523839149999982 0.1146958720000012 -0.0151609920000009 0.1561931669999982 0.1146958720000012 -0.0236931000000009 0.1476223499999982 0.1099558120000012 -0.0189530400000009 0.1428607849999982 0.1042677400000012 -0.0170570160000009 0.1371469069999982 0.1099558120000012 -0.02274508800000091 0.1333376549999982 0.1184879200000012 -0.0265371360000009 0.1304807159999982 0.1118518360000012 -0.02274508800000091 0.1276237769999982 0.1061637640000012 -0.01610900400000091 0.1266714639999982 0.1033197280000012 -0.0246411120000009 0.1314330289999982 0.1004756920000012 -0.02274508800000091 0.1400038459999982 0.0995276800000012 -0.0255891240000009 0.1438130979999982 0.0985796680000012 -0.0274851480000009 0.1447654109999982 0.1080597880000012 -0.0265371360000009 0.1514316019999982 0.1118518360000012 -0.02274508800000091 0.1447654109999982 0.1090078000000012 -0.0217970760000009 0.1380992199999982 0.1146958720000012 -0.0151609920000009 0.1457177239999982 0.1175399080000012 -0.0132649680000009 0.1485746629999982 0.1146958720000012 -0.0142129800000009 0.1580977929999982 0.1146958720000012 -0.0132649680000009 0.1552408539999982 0.1165918960000012 -0.0189530400000009 0.1428607849999982 0.1175399080000012 -0.0123169560000009 0.1342899679999982 0.1137478600000012 -0.0132649680000009 0.1361945939999982 0.1099558120000012 -0.0217970760000009 0.1400038459999982 0.1137478600000012 -0.0189530400000009 0.1457177239999982 0.1071117760000012 -0.0199010520000009 0.1457177239999982 0.1042677400000012 -0.0246411120000009 0.1380992199999982 0.1090078000000012 -0.0312771960000009 0.1476223499999982 0.1099558120000012 -0.0369652680000009 0.1580977929999982 0.1109038240000012 -0.0246411120000009 0.1485746629999982 0.1118518360000012 -0.0142129800000009 0.1323853419999982 0.1080597880000012 -0.02274508800000091 0.1390515329999982 0.1052157520000012 -0.0208490640000009 0.1466700369999982 0.1052157520000012 -0.0123169560000009 0.1476223499999982 0.1052157520000012 -0.0217970760000009 0.1428607849999982 0.1127998480000012 -0.0180050280000009 0.1409561589999982 0.1127998480000012 -0.0104209320000009 0.1466700369999982 0.1080597880000012 -0.0142129800000009 0.1466700369999982 0.1137478600000012 -0.008524908000000903 0.1476223499999982 0.1118518360000012 -0.0113689440000009 0.1438130979999982 0.1080597880000012 -0.0123169560000009 0.1380992199999982 0.1118518360000012 -0.0170570160000009 0.1390515329999982 0.1014237040000012 -0.0217970760000009 0.1380992199999982 0.09763165600000119 -0.0217970760000009 0.1409561589999982 0.1052157520000012 -0.0151609920000009 0.1457177239999982 0.1090078000000012 -0.01610900400000091 0.1485746629999982 0.1052157520000012 -0.0199010520000009 0.1495269759999982 0.1023717160000012 -0.0104209320000009 0.1485746629999982 0.0995276800000012 -0.0104209320000009 0.1361945939999982 0.1042677400000012 -0.009472920000000903 0.1419084719999982 0.1118518360000012 -0.009472920000000903 0.1466700369999982 0.1061637640000012 -0.001888824000000903 0.1409561589999982 0.1127998480000012 0.002851235999999096 0.1428607849999982 0.1194359320000012 -0.005680872000000904 0.1438130979999982 0.1137478600000012 -0.0170570160000009 0.1495269759999982 0.1099558120000012 -0.0217970760000009 0.1542885409999982 0.1033197280000012 -0.0170570160000009 0.1390515329999982 0.0985796680000012 -0.0132649680000009 0.1323853419999982 0.1004756920000012 -0.0123169560000009 0.1419084719999982 0.1014237040000012 -0.0208490640000009 0.1466700369999982 0.1014237040000012 -0.0274851480000009 0.1466700369999982 0.0985796680000012 -0.0255891240000009 0.1438130979999982 0.1033197280000012 -0.0208490640000009 0.1419084719999982 0.1071117760000012 -0.0132649680000009 0.1400038459999982 0.1071117760000012 -0.0113689440000009 0.1419084719999982 0.1080597880000012 -0.0113689440000009 0.1447654109999982 0.1052157520000012 -0.006628884000000904 0.1352422809999982 0.1052157520000012 -0.004732860000000904 0.1314330289999982 0.1127998480000012 -0.009472920000000903 0.1400038459999982 0.1033197280000012 -0.009472920000000903 0.1400038459999982 0.09668364400000119 -0.009472920000000903 0.1419084719999982 0.1127998480000012 -0.0123169560000009 0.1495269759999982 0.1156438840000012 -0.0151609920000009 0.1466700369999982 0.1071117760000012 -0.0189530400000009 0.1419084719999982 0.0938396080000012 -0.0142129800000009 0.1438130979999982 0.0985796680000012 -0.01610900400000091 0.1438130979999982 0.1080597880000012 -0.0217970760000009 0.1466700369999982 0.1004756920000012 -0.0208490640000009 0.1504792889999982 0.0985796680000012 -0.0265371360000009 0.1447654109999982 0.1052157520000012 -0.0265371360000009 0.1371469069999982 0.1052157520000012 -0.0265371360000009 0.1419084719999982 0.1033197280000012 -0.0284331600000009 0.1438130979999982 0.1090078000000012 -0.02274508800000091 0.1428607849999982 0.1118518360000012 -0.0142129800000009 0.1504792889999982 0.1052157520000012 -0.0151609920000009 0.1447654109999982 0.09668364400000119 -0.0151609920000009 0.1419084719999982 0.09573563200000119 -0.003784848000000902 0.1457177239999982 0.1071117760000012 -0.001888824000000903 0.1466700369999982 0.1137478600000012 -0.0104209320000009 0.1523839149999982 0.1071117760000012 -0.009472920000000903 0.1476223499999982 0.09668364400000119 -0.009472920000000903 0.1390515329999982 0.08909954800000119 -0.009472920000000903 0.1380992199999982 0.09099557200000119 -0.000940812000000903 0.1409561589999982 0.0947876200000012 -0.005680872000000904 0.1447654109999982 0.1014237040000012 -0.0208490640000009 0.1400038459999982 0.1099558120000012 -0.03222520800000091 0.1361945939999982 0.1090078000000012 -0.0284331600000009 0.1466700369999982 0.1033197280000012 -0.0236931000000009 0.1561931669999982 0.1061637640000012 -0.0199010520000009 0.1542885409999982 0.0995276800000012 -0.0142129800000009 0.1457177239999982 0.0928915960000012 -0.005680872000000904 0.1380992199999982 0.0928915960000012 -0.002836836000000903 0.1361945939999982 0.0938396080000012 -0.009472920000000903 0.1419084719999982 0.1014237040000012 -0.009472920000000903 0.1485746629999982 0.1109038240000012 -0.007576896000000903 0.1485746629999982 0.1080597880000012 -0.006628884000000904 0.1438130979999982 0.1014237040000012 -0.006628884000000904 0.1361945939999982 0.1071117760000012 -0.0151609920000009 0.1323853419999982 0.1052157520000012 -0.0170570160000009 0.1390515329999982 0.0985796680000012 -0.0123169560000009 0.1476223499999982 0.09573563200000119 -0.0151609920000009 0.1400038459999982 0.0985796680000012 -0.0123169560000009 0.1285760899999982 0.1004756920000012 -0.0208490640000009 0.1380992199999982 0.09573563200000119 -0.0284331600000009 0.1523839149999982 0.0985796680000012 -0.02274508800000091 0.1485746629999982 0.1118518360000012 -0.0217970760000009 0.1476223499999982 0.1156438840000012 -0.0180050280000009 0.1523839149999982 0.1109038240000012 -0.0113689440000009 0.1447654109999982 0.1023717160000012 -0.008524908000000903 0.1419084719999982 0.09668364400000119 -0.0151609920000009 0.1438130979999982 0.1052157520000012 -0.009472920000000903 0.1457177239999982 0.1099558120000012 -0.006628884000000904 0.1438130979999982 0.1090078000000012 -0.008524908000000903 0.1419084719999982 0.1137478600000012 -0.008524908000000903 0.1447654109999982 0.1146958720000012 -0.008524908000000903 0.1504792889999982 0.1118518360000012 -0.008524908000000903 0.1542885409999982 0.1071117760000012 -0.0180050280000009 0.1466700369999982 0.1023717160000012 -0.01610900400000091 0.1457177239999982 0.1080597880000012 -0.0189530400000009 0.1447654109999982 0.09668364400000119 -0.0246411120000009 0.1409561589999982 0.08909954800000119 -0.0208490640000009 0.1438130979999982 0.1071117760000012 -0.02274508800000091 0.1476223499999982 0.1109038240000012 -0.0255891240000009 0.1466700369999982 0.1080597880000012 -0.0208490640000009 0.1390515329999982 0.1099558120000012 -0.0236931000000009 0.1400038459999982 0.1052157520000012 -0.0255891240000009 0.1428607849999982 0.1033197280000012 -0.0170570160000009 0.1438130979999982 0.1004756920000012 -0.01610900400000091 0.1438130979999982 0.1042677400000012 -0.0142129800000009 0.1428607849999982 0.1071117760000012 -0.0104209320000009 0.1457177239999982 0.0985796680000012 -0.009472920000000903 0.1447654109999982 0.1042677400000012 -0.000940812000000903 0.1428607849999982 0.1203839440000012 -0.001888824000000903 0.1447654109999982 0.1146958720000012 -0.0113689440000009 0.1409561589999982 0.1090078000000012 -0.0113689440000009 0.1380992199999982 0.1118518360000012 -0.0123169560000009 0.1371469069999982 0.1052157520000012 -0.0142129800000009 0.1419084719999982 0.1014237040000012 -0.0180050280000009 0.1504792889999982 0.1042677400000012 -0.0217970760000009 0.1523839149999982 0.1014237040000012 -0.0217970760000009 0.1447654109999982 0.0995276800000012 -0.0236931000000009 0.1380992199999982 0.1023717160000012 -0.0303291840000009 0.1409561589999982 0.09668364400000119 -0.03222520800000091 0.1514316019999982 0.1014237040000012 -0.0265371360000009 0.1485746629999982 0.1109038240000012 -0.0189530400000009 0.1457177239999982 0.1099558120000012 -0.0113689440000009 0.1457177239999982 0.1080597880000012 -0.006628884000000904 0.1533362279999982 0.1071117760000012 -0.0123169560000009 0.1571454799999982 0.1052157520000012 -0.0170570160000009 0.1590501059999982 0.1099558120000012 -0.0123169560000009 0.1580977929999982 0.1090078000000012 -0.0132649680000009 0.1485746629999982 0.1061637640000012 -0.0151609920000009 0.1438130979999982 0.1071117760000012 -0.0113689440000009 0.1333376549999982 0.1042677400000012 -0.0113689440000009 0.1342899679999982 0.1023717160000012 -0.0274851480000009 0.1371469069999982 0.09763165600000119 -0.0350692440000009 0.1352422809999982 0.0995276800000012 -0.0208490640000009 0.1285760899999982 0.1061637640000012 -0.0142129800000009 0.1314330289999982 0.1023717160000012 -0.0180050280000009 0.1419084719999982 0.1014237040000012 -0.01610900400000091 0.1409561589999982 0.1033197280000012 -0.0170570160000009 0.1352422809999982 0.1109038240000012 -0.0208490640000009 0.1457177239999982 0.1080597880000012 -0.0142129800000009 0.1590501059999982 0.1004756920000012 -0.0104209320000009 0.1466700369999982 0.1071117760000012 -0.0151609920000009 0.1428607849999982 0.1127998480000012 -0.008524908000000903 0.1533362279999982 0.1146958720000012 0.0009552119999990966 0.1466700369999982 0.1080597880000012 -0.004732860000000904 0.1380992199999982 0.1109038240000012 -0.003784848000000902 0.1304807159999982 0.1194359320000012 -0.003784848000000902 0.1409561589999982 0.1156438840000012 -0.0104209320000009 0.1533362279999982 0.1099558120000012 -0.0132649680000009 0.1542885409999982 0.1090078000000012 -0.0217970760000009 0.1561931669999982 0.1061637640000012 -0.0246411120000009 0.1514316019999982 0.1090078000000012 -0.0199010520000009 0.1409561589999982 0.1090078000000012 -0.0189530400000009 0.1428607849999982 0.1071117760000012 -0.0284331600000009 0.1504792889999982 0.1090078000000012 -0.0312771960000009 0.1409561589999982 0.1023717160000012 -0.0217970760000009 0.1361945939999982 0.0985796680000012 -0.0208490640000009 0.1419084719999982 0.1042677400000012 -0.02274508800000091 0.1428607849999982 0.1090078000000012 -0.0265371360000009 0.1438130979999982 0.1109038240000012 -0.02274508800000091 0.1419084719999982 0.1052157520000012 -0.0132649680000009 0.1400038459999982 0.09194358400000119 -0.0151609920000009 0.1380992199999982 0.0928915960000012 -0.0123169560000009 0.1476223499999982 0.1033197280000012 -0.009472920000000903 0.1485746629999982 0.1127998480000012 0.003799247999999096 0.1457177239999982 0.1118518360000012 0.003799247999999096 0.1514316019999982 0.1033197280000012 -0.003784848000000902 0.1523839149999982 0.1071117760000012 -0.006628884000000904 0.1571454799999982 0.09573563200000119 -0.0132649680000009 0.1476223499999982 0.0862555120000012 -0.01610900400000091 0.1390515329999982 0.09763165600000119 -0.0236931000000009 0.1476223499999982 0.1014237040000012 -0.008524908000000903 0.1466700369999982 0.1109038240000012 -0.006628884000000904 0.1447654109999982 0.1241759920000012 -0.009472920000000903 0.1466700369999982 0.1175399080000012 -0.008524908000000903 0.1466700369999982 0.1127998480000012 -0.002836836000000903 0.1447654109999982 0.1156438840000012 -0.0104209320000009 0.1361945939999982 0.1090078000000012 -0.0217970760000009 0.1342899679999982 0.09763165600000119 -0.0199010520000009 0.1438130979999982 0.09668364400000119 -0.0104209320000009 0.1390515329999982 0.0938396080000012 -0.004732860000000904 0.1390515329999982 0.0985796680000012 -0.0180050280000009 0.1438130979999982 0.1109038240000012 -0.0236931000000009 0.1466700369999982 0.1127998480000012 -0.0199010520000009 0.1390515329999982 0.1109038240000012 -0.0199010520000009 0.1342899679999982 0.1127998480000012 -0.02274508800000091 0.1409561589999982 0.1118518360000012 -0.0255891240000009 0.1523839149999982 0.1090078000000012 -0.0199010520000009 0.1590501059999982 0.1033197280000012 -0.0199010520000009 0.1504792889999982 0.0995276800000012 -0.0170570160000009 0.1447654109999982 0.1090078000000012 -0.0104209320000009 0.1523839149999982 0.1061637640000012 -0.009472920000000903 0.1542885409999982 0.09668364400000119 -0.002836836000000903 0.1476223499999982 0.09668364400000119 0.001903223999999096 0.1514316019999982 0.1061637640000012 0.0009552119999990966 0.1533362279999982 0.1090078000000012 -0.007576896000000903 0.1457177239999982 0.1014237040000012 -0.0151609920000009 0.1438130979999982 0.09668364400000119 -0.0180050280000009 0.1438130979999982 0.0985796680000012 -0.0151609920000009 0.1428607849999982 0.1014237040000012 -0.0142129800000009 0.1447654109999982 0.0995276800000012 -0.0217970760000009 0.1361945939999982 0.1080597880000012 -0.0255891240000009 0.1438130979999982 0.1080597880000012 -0.02938117200000091 0.1485746629999982 0.09763165600000119 -0.0284331600000009 0.1380992199999982 0.0985796680000012 -0.0236931000000009 0.1380992199999982 0.1071117760000012 -0.0170570160000009 0.1476223499999982 0.1033197280000012 -0.008524908000000903 0.1561931669999982 0.1014237040000012 -0.0104209320000009 0.1561931669999982 0.1033197280000012 -0.002836836000000903 0.1552408539999982 0.1023717160000012 -0.002836836000000903 0.1533362279999982 0.09668364400000119 -0.006628884000000904 0.1457177239999982 0.1023717160000012 -0.007576896000000903 0.1438130979999982 0.1080597880000012 -0.0113689440000009 0.1476223499999982 0.0947876200000012 -0.0151609920000009 0.1438130979999982 0.09194358400000119 -0.0180050280000009 0.1476223499999982 0.09763165600000119 -0.0132649680000009 0.1533362279999982 0.0995276800000012 -0.0104209320000009 0.1504792889999982 0.0947876200000012 -0.0113689440000009 0.1400038459999982 0.0985796680000012 -0.0113689440000009 0.1333376549999982 0.0995276800000012 -0.01610900400000091 0.1352422809999982 0.0985796680000012 -0.0265371360000009 0.1352422809999982 0.1042677400000012 -0.01610900400000091 0.1438130979999982 0.1014237040000012 -0.006628884000000904 0.1428607849999982 0.0938396080000012 -0.0151609920000009 0.1419084719999982 0.1014237040000012 -0.0123169560000009 0.1533362279999982 0.1071117760000012 0.002851235999999096 0.1476223499999982 0.1052157520000012 0.002851235999999096 0.1390515329999982 0.1090078000000012 -0.003784848000000902 0.1438130979999982 0.1080597880000012 -0.006628884000000904 0.1457177239999982 0.1090078000000012 -0.007576896000000903 0.1419084719999982 0.1071117760000012 -0.0123169560000009 0.1419084719999982 0.1033197280000012 -0.0142129800000009 0.1457177239999982 0.1004756920000012 -0.006628884000000904 0.1552408539999982 0.09573563200000119 -0.0170570160000009 0.1514316019999982 0.1004756920000012 -0.0246411120000009 0.1428607849999982 0.1061637640000012 -0.01610900400000091 0.1438130979999982 0.1052157520000012 -0.0170570160000009 0.1466700369999982 0.0985796680000012 -0.0199010520000009 0.1523839149999982 0.09668364400000119 -0.0274851480000009 0.1514316019999982 0.1061637640000012 -0.0265371360000009 0.1504792889999982 0.1033197280000012 -0.0113689440000009 0.1457177239999982 0.1004756920000012 -0.0123169560000009 0.1485746629999982 0.1004756920000012 -0.006628884000000904 0.1571454799999982 0.1023717160000012 -0.001888824000000903 0.1447654109999982 0.1061637640000012 -0.008524908000000903 0.1438130979999982 0.1071117760000012 -0.005680872000000904 0.1514316019999982 0.1137478600000012 -0.007576896000000903 0.1476223499999982 0.1061637640000012 -0.0170570160000009 0.1447654109999982 0.0947876200000012 -0.0142129800000009 0.1380992199999982 0.0928915960000012 -0.008524908000000903 0.1409561589999982 0.09573563200000119 -0.0123169560000009 0.1504792889999982 0.09004756000000119 -0.0104209320000009 0.1485746629999982 0.09194358400000119 -0.0104209320000009 0.1390515329999982 0.1014237040000012 -0.0199010520000009 0.1371469069999982 0.09763165600000119 -0.0236931000000009 0.1419084719999982 0.1014237040000012 -0.0217970760000009 0.1552408539999982 0.1033197280000012 -0.0189530400000009 0.1600024189999982 0.1071117760000012 -0.0208490640000009 0.1447654109999982 0.1109038240000012 -0.0208490640000009 0.1371469069999982 0.1071117760000012 -0.01610900400000091 0.1533362279999982 0.1042677400000012 -0.01610900400000091 0.1523839149999982 0.1061637640000012 -0.0123169560000009 0.1371469069999982 0.1090078000000012 -0.0132649680000009 0.1419084719999982 0.1042677400000012 -0.01610900400000091 0.1476223499999982 0.1090078000000012 -0.0189530400000009 0.1514316019999982 0.1156438840000012 -0.0208490640000009 0.1466700369999982 0.1099558120000012 -0.0123169560000009 0.1380992199999982 0.1033197280000012 -0.0142129800000009 0.1409561589999982 0.1033197280000012 -0.0180050280000009 0.1485746629999982 0.1080597880000012 -0.0123169560000009 0.1457177239999982 0.1146958720000012 -0.0170570160000009 0.1380992199999982 0.1137478600000012 -0.0265371360000009 0.1390515329999982 0.1014237040000012 -0.0246411120000009 0.1428607849999982 0.0995276800000012 -0.0189530400000009 0.1438130979999982 0.1033197280000012 -0.0123169560000009 0.1390515329999982 0.1061637640000012 -0.0123169560000009 0.1428607849999982 0.1109038240000012 -0.0123169560000009 0.1533362279999982 0.1127998480000012 -0.008524908000000903 0.1628593579999982 0.1156438840000012 -0.0123169560000009 0.1600024189999982 0.1118518360000012 -0.0142129800000009 0.1447654109999982 0.1099558120000012 -0.01610900400000091 0.1419084719999982 0.1090078000000012 -0.0113689440000009 0.1533362279999982 0.0985796680000012 -0.0113689440000009 0.1485746629999982 0.0995276800000012 -0.0180050280000009 0.1333376549999982 0.1052157520000012 -0.01610900400000091 0.1438130979999982 0.1071117760000012 -0.0217970760000009 0.1457177239999982 0.1118518360000012 -0.0132649680000009 0.1514316019999982 0.1023717160000012 -0.002836836000000903 0.1466700369999982 0.0995276800000012 -0.003784848000000902 0.1438130979999982 0.1118518360000012 -0.0113689440000009 0.1390515329999982 0.1165918960000012 -0.0180050280000009 0.1428607849999982 0.1175399080000012 -0.0151609920000009 0.1457177239999982 0.1033197280000012 -0.0170570160000009 0.1438130979999982 0.0928915960000012 -0.0236931000000009 0.1409561589999982 0.1042677400000012 -0.0170570160000009 0.1438130979999982 0.1061637640000012 -0.0113689440000009 0.1476223499999982 0.1014237040000012 -0.0189530400000009 0.1390515329999982 0.09763165600000119 -0.02938117200000091 0.1361945939999982 0.1014237040000012 -0.0246411120000009 0.1457177239999982 0.1071117760000012 -0.01610900400000091 0.1485746629999982 0.1118518360000012 -0.0151609920000009 0.1457177239999982 0.1127998480000012 -0.007576896000000903 0.1495269759999982 0.1042677400000012 -0.009472920000000903 0.1495269759999982 0.1052157520000012 -0.0142129800000009 0.1523839149999982 0.1156438840000012 -0.01610900400000091 0.1533362279999982 0.1118518360000012 -0.0113689440000009 0.1571454799999982 0.1080597880000012 -0.006628884000000904 0.1523839149999982 0.1156438840000012 -0.0132649680000009 0.1438130979999982 0.1194359320000012 -0.0217970760000009 0.1438130979999982 0.1194359320000012 -0.0208490640000009 0.1457177239999982 0.1203839440000012 -0.009472920000000903 0.1438130979999982 0.1080597880000012 -0.0170570160000009 0.1457177239999982 0.1080597880000012 -0.0199010520000009 0.1523839149999982 0.0985796680000012 -0.0217970760000009 0.1495269759999982 0.0985796680000012 -0.0265371360000009 0.1476223499999982 0.1033197280000012 -0.0208490640000009 0.1419084719999982 0.1052157520000012 -0.0170570160000009 0.1523839149999982 0.1042677400000012 -0.007576896000000903 0.1590501059999982 0.1052157520000012 -0.009472920000000903 0.1580977929999982 0.1052157520000012 -0.01610900400000091 0.1447654109999982 0.1004756920000012 -0.0217970760000009 0.1342899679999982 0.1118518360000012 -0.0265371360000009 0.1428607849999982 0.1222799680000012 -0.0208490640000009 0.1438130979999982 0.1109038240000012 -0.02274508800000091 0.1466700369999982 0.09573563200000119 -0.0274851480000009 0.1476223499999982 0.09668364400000119 -0.0199010520000009 0.1352422809999982 0.1071117760000012 -0.0123169560000009 0.1361945939999982 0.1099558120000012 -0.0170570160000009 0.1476223499999982 0.1071117760000012 -0.0180050280000009 0.1542885409999982 0.1118518360000012 -0.005680872000000904 0.1514316019999982 0.1146958720000012 -0.006628884000000904 0.1428607849999982 0.1099558120000012 -0.0170570160000009 0.1371469069999982 0.1118518360000012 -0.0132649680000009 0.1400038459999982 0.1137478600000012 -0.006628884000000904 0.1523839149999982 0.1109038240000012 -0.0151609920000009 0.1542885409999982 0.1061637640000012 -0.0142129800000009 0.1466700369999982 0.1004756920000012 -0.0113689440000009 0.1428607849999982 0.1023717160000012 -0.0132649680000009 0.1419084719999982 0.09763165600000119 -0.0132649680000009 0.1419084719999982 0.1042677400000012 -0.0217970760000009 0.1457177239999982 0.1090078000000012 -0.02938117200000091 0.1466700369999982 0.1052157520000012 -0.02938117200000091 0.1552408539999982 0.1127998480000012 -0.0303291840000009 0.1600024189999982 0.1109038240000012 -0.0255891240000009 0.1495269759999982 0.0985796680000012 -0.0189530400000009 0.1428607849999982 0.0947876200000012 -0.0170570160000009 0.1485746629999982 0.1004756920000012 -0.0132649680000009 0.1476223499999982 0.1023717160000012 -0.0132649680000009 0.1400038459999982 0.1033197280000012 -0.0151609920000009 0.1400038459999982 0.1061637640000012 -0.01610900400000091 0.1447654109999982 0.1071117760000012 -0.008524908000000903 0.1552408539999982 0.1080597880000012 -0.002836836000000903 0.1523839149999982 0.1033197280000012 -0.0104209320000009 0.1419084719999982 0.0995276800000012 -0.0151609920000009 0.1333376549999982 0.1014237040000012 -0.0265371360000009 0.1390515329999982 0.0947876200000012 -0.0246411120000009 0.1438130979999982 0.0928915960000012 -0.0180050280000009 0.1409561589999982 0.1023717160000012 -0.0284331600000009 0.1380992199999982 0.1080597880000012 -0.03222520800000091 0.1285760899999982 0.1118518360000012 -0.0303291840000009 0.1314330289999982 0.1118518360000012 -0.0217970760000009 0.1447654109999982 0.0985796680000012 -0.0180050280000009 0.1495269759999982 0.1042677400000012 -0.0189530400000009 0.1514316019999982 0.1137478600000012 -0.01610900400000091 0.1542885409999982 0.1071117760000012 -0.0104209320000009 0.1552408539999982 0.1014237040000012 -0.008524908000000903 0.1504792889999982 0.1080597880000012 -0.008524908000000903 0.1552408539999982 0.1127998480000012 -0.006628884000000904 0.1590501059999982 0.1061637640000012 -0.009472920000000903 0.1523839149999982 0.1052157520000012 -0.006628884000000904 0.1552408539999982 0.1071117760000012 -0.005680872000000904 0.1561931669999982 0.1090078000000012 -0.0170570160000009 0.1457177239999982 0.1004756920000012 -0.0189530400000009 0.1409561589999982 0.09099557200000119 -0.01610900400000091 0.1409561589999982 0.09573563200000119 -0.0236931000000009 0.1428607849999982 0.1080597880000012 -0.0246411120000009 0.1419084719999982 0.1118518360000012 -0.0180050280000009 0.1352422809999982 0.1156438840000012 -0.0180050280000009 0.1419084719999982 0.1175399080000012 -0.0236931000000009 0.1561931669999982 0.1071117760000012 -0.02274508800000091 0.1580977929999982 0.09099557200000119 -0.0180050280000009 0.1533362279999982 0.0928915960000012 -0.007576896000000903 0.1476223499999982 0.1090078000000012 -0.001888824000000903 0.1457177239999982 0.1146958720000012 -0.000940812000000903 0.1438130979999982 0.1165918960000012 -0.0113689440000009 0.1400038459999982 0.1137478600000012 -0.01610900400000091 0.1371469069999982 0.1137478600000012 -0.0113689440000009 0.1390515329999982 0.1137478600000012 -0.0104209320000009 0.1495269759999982 0.1061637640000012 -0.009472920000000903 0.1561931669999982 0.1004756920000012 -0.0142129800000009 0.1590501059999982 0.1052157520000012 -0.0189530400000009 0.1514316019999982 0.1118518360000012 -0.0199010520000009 0.1371469069999982 0.1052157520000012 -0.0199010520000009 0.1419084719999982 0.1052157520000012 -0.0255891240000009 0.1457177239999982 0.1080597880000012 -0.0246411120000009 0.1419084719999982 0.1023717160000012 -0.0180050280000009 0.1419084719999982 0.0995276800000012 -0.0132649680000009 0.1371469069999982 0.09573563200000119 -0.0113689440000009 0.1352422809999982 0.0985796680000012 -0.0132649680000009 0.1438130979999982 0.1071117760000012 -0.0104209320000009 0.1571454799999982 0.1090078000000012 -0.0142129800000009 0.1609547319999982 0.1090078000000012 -0.01610900400000091 0.1523839149999982 0.1118518360000012 -0.0113689440000009 0.1409561589999982 0.1042677400000012 -0.0132649680000009 0.1333376549999982 0.0928915960000012 -0.0170570160000009 0.1371469069999982 0.1004756920000012 -0.0189530400000009 0.1476223499999982 0.1042677400000012 -0.0142129800000009 0.1409561589999982 0.1014237040000012 -0.0142129800000009 0.1352422809999982 0.1061637640000012 -0.0199010520000009 0.1476223499999982 0.1061637640000012 -0.0180050280000009 0.1514316019999982 0.1004756920000012 -0.0180050280000009 0.1428607849999982 0.0947876200000012 -0.0189530400000009 0.1457177239999982 0.1014237040000012 -0.0180050280000009 0.1495269759999982 0.1080597880000012 -0.01610900400000091 0.1504792889999982 0.1080597880000012 -0.003784848000000902 0.1504792889999982 0.1071117760000012 0.001903223999999096 0.1514316019999982 0.1090078000000012 -0.000940812000000903 0.1514316019999982 0.1184879200000012 -0.004732860000000904 0.1514316019999982 0.1232279800000012 -0.0123169560000009 0.1542885409999982 0.1099558120000012 -0.01610900400000091 0.1447654109999982 0.0985796680000012 -0.0199010520000009 0.1476223499999982 0.1004756920000012 -0.0132649680000009 0.1523839149999982 0.1023717160000012 -0.0132649680000009 0.1504792889999982 0.0995276800000012 -0.0217970760000009 0.1466700369999982 0.1033197280000012 -0.0208490640000009 0.1361945939999982 0.0995276800000012 -0.0255891240000009 0.1390515329999982 0.0938396080000012 -0.0303291840000009 0.1438130979999982 0.1014237040000012 -0.0284331600000009 0.1428607849999982 0.1080597880000012 -0.02274508800000091 0.1390515329999982 0.1184879200000012 -0.01610900400000091 0.1409561589999982 0.1052157520000012 -0.01610900400000091 0.1457177239999982 0.1004756920000012 -0.0199010520000009 0.1409561589999982 0.1156438840000012 -0.0170570160000009 0.1409561589999982 0.1203839440000012 -0.0113689440000009 0.1466700369999982 0.1175399080000012 -0.007576896000000903 0.1466700369999982 0.1175399080000012 -0.005680872000000904 0.1466700369999982 0.1175399080000012 -0.008524908000000903 0.1542885409999982 0.1099558120000012 -0.007576896000000903 0.1523839149999982 0.1014237040000012 -0.0113689440000009 0.1447654109999982 0.09668364400000119 -0.0199010520000009 0.1390515329999982 0.0995276800000012 -0.01610900400000091 0.1380992199999982 0.1099558120000012 -0.01610900400000091 0.1495269759999982 0.1127998480000012 -0.0189530400000009 0.1542885409999982 0.0995276800000012 -0.0217970760000009 0.1390515329999982 0.09668364400000119 -0.0246411120000009 0.1438130979999982 0.09763165600000119 -0.0246411120000009 0.1533362279999982 0.09763165600000119 -0.0180050280000009 0.1485746629999982 0.1023717160000012 -0.008524908000000903 0.1495269759999982 0.1071117760000012 -0.0180050280000009 0.1457177239999982 0.1004756920000012 -0.0217970760000009 0.1428607849999982 0.0995276800000012 -0.0104209320000009 0.1457177239999982 0.1156438840000012 -0.002836836000000903 0.1447654109999982 0.1071117760000012 -0.004732860000000904 0.1476223499999982 0.1052157520000012 -0.0142129800000009 0.1457177239999982 0.1080597880000012 -0.0151609920000009 0.1400038459999982 0.0985796680000012 -0.0104209320000009 0.1419084719999982 0.1071117760000012 -0.0123169560000009 0.1457177239999982 0.1099558120000012 -0.0142129800000009 0.1485746629999982 0.0938396080000012 -0.0132649680000009 0.1447654109999982 0.0853075000000012 -0.0123169560000009 0.1466700369999982 0.09573563200000119 -0.0151609920000009 0.1466700369999982 0.09099557200000119 -0.0274851480000009 0.1504792889999982 0.09763165600000119 -0.0246411120000009 0.1590501059999982 0.1052157520000012 -0.0180050280000009 0.1495269759999982 0.0947876200000012 -0.0246411120000009 0.1276237769999982 0.1004756920000012 -0.0284331600000009 0.1304807159999982 0.1033197280000012 -0.0255891240000009 0.1428607849999982 0.0995276800000012 -0.0189530400000009 0.1438130979999982 0.0995276800000012 -0.0170570160000009 0.1333376549999982 0.0985796680000012 -0.0199010520000009 0.1228622119999982 0.0995276800000012 -0.0142129800000009 0.1285760899999982 0.1090078000000012 -0.01610900400000091 0.1314330289999982 0.1042677400000012 -0.0151609920000009 0.1323853419999982 0.0947876200000012 -0.0142129800000009 0.1361945939999982 0.09763165600000119 -0.0208490640000009 0.1257191509999982 0.09668364400000119 -0.0189530400000009 0.1276237769999982 0.0928915960000012 -0.0142129800000009 0.1371469069999982 0.0947876200000012 -0.01610900400000091 0.1457177239999982 0.09573563200000119 -0.02274508800000091 0.1457177239999982 0.08341147600000119 -0.0246411120000009 0.1238145249999982 0.08246346400000119 -0.02938117200000091 0.1228622119999982 0.09194358400000119 -0.0379132800000009 0.1342899679999982 0.0928915960000012 -0.0350692440000009 0.1352422809999982 0.0872035240000012 -0.0274851480000009 0.1380992199999982 0.08435948800000119 -0.0208490640000009 0.1428607849999982 0.08909954800000119 -0.0274851480000009 0.1333376549999982 0.0938396080000012 -0.03222520800000091 0.1285760899999982 0.0938396080000012 -0.03317322000000091 0.1380992199999982 0.0947876200000012 -0.0379132800000009 0.1438130979999982 0.09763165600000119 -0.03601725600000091 0.1419084719999982 0.08341147600000119 -0.03222520800000091 0.1323853419999982 0.0815154520000012 -0.0274851480000009 0.1323853419999982 0.0862555120000012 -0.0265371360000009 0.1438130979999982 0.08246346400000119 -0.03222520800000091 0.1428607849999982 0.07677539200000119 -0.0436013520000009 0.1400038459999982 0.0748793680000012 -0.05023743600000091 0.1400038459999982 0.07867141600000119 -0.05308147200000091 0.1352422809999982 0.07772340400000119 -0.0540294840000009 0.1371469069999982 0.0853075000000012 -0.0492894240000009 0.1400038459999982 0.0872035240000012 -0.04265334000000091 0.1285760899999982 0.0796194280000012 -0.04265334000000091 0.1276237769999982 0.0748793680000012 -0.0417053280000009 0.1361945939999982 0.07582738000000119 -0.0417053280000009 0.1361945939999982 0.09194358400000119 -0.0445493640000009 0.1352422809999982 0.1061637640000012 -0.05308147200000091 0.1333376549999982 0.1004756920000012 -0.0578215320000009 0.1419084719999982 0.09194358400000119 -0.05308147200000091 0.1380992199999982 0.08435948800000119 -0.0473934000000009 0.1371469069999982 0.07677539200000119 -0.05023743600000091 0.1457177239999982 0.06919129600000119 -0.05971755600000091 0.1361945939999982 0.06255521200000119 -0.0578215320000009 0.1371469069999982 0.05876316400000119 -0.05213346000000091 0.1485746629999982 0.06255521200000119 -0.06066556800000091 0.1457177239999982 0.07013930800000119 -0.0701456880000009 0.1380992199999982 0.0672952720000012 -0.06635364000000091 0.1304807159999982 0.06445123600000119 -0.0701456880000009 0.1371469069999982 0.06824328400000119 -0.07298972400000091 0.1333376549999982 0.06824328400000119 -0.06730165200000091 0.1209575859999982 0.05686714000000119 -0.06635364000000091 0.1323853419999982 0.05591912800000119 -0.0682496640000009 0.1380992199999982 0.06539924800000119 -0.06445761600000091 0.1352422809999982 0.07013930800000119 -0.05876954400000091 0.1323853419999982 0.0748793680000012 -0.0549774960000009 0.1333376549999982 0.0720353320000012 -0.0511854480000009 0.1352422809999982 0.06255521200000119 -0.05687352000000091 0.1342899679999982 0.0578151520000012 -0.0691976760000009 0.1428607849999982 0.05686714000000119 -0.0701456880000009 0.1438130979999982 0.06539924800000119 -0.06730165200000091 0.1400038459999982 0.06824328400000119 -0.06635364000000091 0.1390515329999982 0.05876316400000119 -0.0691976760000009 0.1371469069999982 0.04833503200000119 -0.0758337600000009 0.1361945939999982 0.05117906800000119 -0.0824698440000009 0.1352422809999982 0.0530750920000012 -0.08626189200000091 0.1380992199999982 0.05212708000000119 -0.0843658680000009 0.1371469069999982 0.05212708000000119 -0.0834178560000009 0.1352422809999982 0.04928304400000119 -0.07962580800000091 0.1371469069999982 0.0530750920000012 -0.0710937000000009 0.1419084719999982 0.0597111760000012 -0.06540562800000091 0.1476223499999982 0.05876316400000119 -0.07204171200000091 0.1495269759999982 0.05591912800000119 -0.0748857480000009 0.1466700369999982 0.0530750920000012 -0.06635364000000091 0.1371469069999982 0.05686714000000119 -0.0682496640000009 0.1361945939999982 0.0578151520000012 -0.0748857480000009 0.1457177239999982 0.03790690000000119 -0.08057382000000091 0.1419084719999982 0.02747876800000119 -0.07867779600000091 0.1400038459999982 0.03790690000000119 -0.0881579160000009 0.1352422809999982 0.0464390080000012 -0.0976380360000009 0.1295284029999982 0.04549099600000119 -0.09194996400000091 0.1380992199999982 0.03790690000000119 -0.08720990400000091 0.1457177239999982 0.03885491200000119 -0.09100195200000091 0.1438130979999982 0.0435949720000012 -0.09384598800000091 0.1352422809999982 0.0398029240000012 -0.08626189200000091 0.1238145249999982 0.04549099600000119 -0.0881579160000009 0.1276237769999982 0.05117906800000119 -0.0843658680000009 0.1380992199999982 0.0473870200000012 -0.07772978400000091 0.1361945939999982 0.0464390080000012 -0.0834178560000009 0.1257191509999982 0.04264696000000119 -0.08531388000000091 0.1342899679999982 0.04075093600000119 -0.0834178560000009 0.1380992199999982 0.04549099600000119 -0.0843658680000009 0.1400038459999982 0.04075093600000119 -0.08720990400000091 0.1400038459999982 0.0398029240000012 -0.08531388000000091 0.1380992199999982 0.04454298400000119 -0.09100195200000091 0.1466700369999982 0.03411485200000119 -0.0957420120000009 0.1380992199999982 0.03127081600000119 -0.0900539400000009 0.1352422809999982 0.03411485200000119 -0.09289797600000091 0.1371469069999982 0.03601087600000119 -0.09479400000000091 0.1419084719999982 0.0398029240000012 -0.09194996400000091 0.1466700369999982 0.04264696000000119 -0.09289797600000091 0.1400038459999982 0.03411485200000119 -0.1042741200000009 0.1371469069999982 0.02747876800000119 -0.1042741200000009 0.1371469069999982 0.0331668400000012 -0.1033261080000009 0.1476223499999982 0.03127081600000119 -0.1033261080000009 0.1552408539999982 0.02842678000000119 -0.0957420120000009 0.1476223499999982 0.02842678000000119 -0.0900539400000009 0.1390515329999982 0.03221882800000119 -0.09194996400000091 0.1390515329999982 0.02747876800000119 -0.0957420120000009 0.1419084719999982 0.01989467200000119 -0.09479400000000091 0.1419084719999982 0.03221882800000119 -0.0976380360000009 0.1390515329999982 0.03601087600000119 -0.1042741200000009 0.1304807159999982 0.02937479200000119 -0.1099621920000009 0.1361945939999982 0.02558274400000119 -0.1090141800000009 0.1419084719999982 0.01799864800000119 -0.1099621920000009 0.1333376549999982 0.02273870800000119 -0.1147022520000009 0.1314330289999982 0.02368672000000119 -0.1232343600000009 0.1333376549999982 0.01515461200000119 -0.1222863480000009 0.1342899679999982 0.01799864800000119 -0.1118582160000009 0.1428607849999982 0.01799864800000119 -0.1118582160000009 0.1419084719999982 0.01136256400000119 -0.1090141800000009 0.1285760899999982 0.003778468000001192 -0.1090141800000009 0.1314330289999982 0.008518528000001193 -0.1147022520000009 0.1400038459999982 0.01420660000000119 -0.1014300840000009 0.1419084719999982 0.01799864800000119 -0.0891059280000009 0.1428607849999982 0.01894666000000119 -0.09479400000000091 0.1400038459999982 0.02179069600000119 -0.1118582160000009 0.1438130979999982 0.01989467200000119 -0.1213383360000009 0.1476223499999982 0.01041455200000119 -0.1194423120000009 0.1466700369999982 0.006622504000001193 -0.1165982760000009 0.1371469069999982 0.003778468000001192 -0.1184943000000009 0.1323853419999982 -0.0009615919999988072 -0.1241823720000009 0.1371469069999982 -0.005701651999998808 -0.1260783960000009 0.1380992199999982 0.001882444000001192 -0.1289224320000009 0.1400038459999982 0.007570516000001193 -0.1251303840000009 0.1457177239999982 0.003778468000001192 -0.1260783960000009 0.1476223499999982 0.008518528000001193 -0.1355585160000009 0.1504792889999982 0.01705063600000119 -0.1317664680000009 0.1495269759999982 0.01325858800000119 -0.1279744200000009 0.1409561589999982 0.006622504000001193 -0.1279744200000009 0.1457177239999982 0.003778468000001192 -0.1279744200000009 0.1428607849999982 -0.002857615999998807 -0.1308184560000009 0.1371469069999982 -0.002857615999998807 -0.1260783960000009 0.1409561589999982 0.006622504000001193 -0.1184943000000009 0.1333376549999982 0.007570516000001193 -0.1213383360000009 0.1323853419999982 0.004726480000001192 -0.1298704440000009 0.1380992199999982 -1.357999999880739e-05 -0.1308184560000009 0.1428607849999982 -0.004753639999998808 -0.1327144800000009 0.1380992199999982 -0.002857615999998807 -0.1365065280000009 0.1295284029999982 -0.005701651999998808 -0.1355585160000009 0.1247668379999982 -0.0009615919999988072 -0.1355585160000009 0.1304807159999982 -0.002857615999998807 -0.1402985760000009 0.1428607849999982 -0.009493699999998807 -0.1421946000000009 0.1428607849999982 -0.0009615919999988072 -0.1355585160000009 0.1428607849999982 0.0009344320000011924 -0.1336624920000009 0.1390515329999982 -0.0009615919999988072 -0.1393505640000009 0.1390515329999982 -0.001909603999998807 -0.1431426120000009 0.1457177239999982 -0.003805627999998808 -0.1355585160000009 0.1447654109999982 -0.001909603999998807 -0.1327144800000009 0.1428607849999982 -0.007597675999998808 -0.1393505640000009 0.1466700369999982 -0.01233773599999881 -0.1355585160000009 0.1495269759999982 0.002830456000001192 -0.1346105040000009 0.1476223499999982 0.003778468000001192 -0.1412465880000009 0.1438130979999982 -1.357999999880739e-05 -0.1374545400000009 0.1390515329999982 0.001882444000001192 -0.1365065280000009 0.1371469069999982 -0.006649663999998808 -0.1440906240000009 0.1390515329999982 -0.01138972399999881 -0.1469346600000009 0.1409561589999982 -0.01328574799999881 -0.1545187560000009 0.1390515329999982 -0.01518177199999881 -0.1583108040000009 0.1457177239999982 -0.01707779599999881 -0.1573627920000009 0.1438130979999982 -0.01707779599999881 -0.1573627920000009 0.1352422809999982 -0.01707779599999881 -0.1545187560000009 0.1285760899999982 -0.02466189199999881 -0.1611548400000009 0.1228622119999982 -0.03034996399999881 -0.1630508640000009 0.1352422809999982 -0.01802580799999881 -0.1602068280000009 0.1409561589999982 -0.01423375999999881 -0.1611548400000009 0.1371469069999982 -0.01707779599999881 -0.1573627920000009 0.1428607849999982 -0.01802580799999881 -0.1535707440000009 0.1457177239999982 -0.01423375999999881 -0.1554667680000009 0.1495269759999982 -0.01044171199999881 -0.1535707440000009 0.1447654109999982 -0.005701651999998808 -0.1564147800000009 0.1352422809999982 -0.004753639999998808 -0.1573627920000009 0.1400038459999982 -0.01328574799999881 -0.1592588160000009 0.1476223499999982 -0.01802580799999881 -0.1583108040000009 0.1447654109999982 -0.02655791599999881 -0.1554667680000009 0.1352422809999982 -0.03224598799999881 -0.1649468880000009 0.1361945939999982 -0.03034996399999881 -0.1668429120000009 0.1400038459999982 -0.01992183199999881 -0.1649468880000009 0.1390515329999982 -0.01328574799999881 -0.1725309840000009 0.1380992199999982 -0.01518177199999881 -0.1744270080000009 0.1352422809999982 -0.01897381999999881 -0.1687389360000009 0.1342899679999982 -0.02560990399999881 -0.1696869480000009 0.1390515329999982 -0.03224598799999881 -0.1687389360000009 0.1409561589999982 -0.03319399999999881 -0.1611548400000009 0.1428607849999982 -0.03034996399999881 -0.1583108040000009 0.1476223499999982 -0.01897381999999881 -0.1573627920000009 0.1514316019999982 -0.01707779599999881 -0.1658949000000009 0.1476223499999982 -0.02371387999999881 -0.1734789960000009 0.1409561589999982 -0.02181785599999881 -0.1687389360000009 0.1400038459999982 -0.02086984399999881 -0.1677909240000009 0.1361945939999982 -0.02750592799999881 -0.1706349600000009 0.1323853419999982 -0.04457014399999881 -0.1791670680000009 0.1419084719999982 -0.04931020399999881 -0.1810630920000009 0.1409561589999982 -0.04551815599999881 -0.1782190560000009 0.1361945939999982 -0.0483621919999988 -0.1810630920000009 0.1419084719999982 -0.04362213199999881 -0.1858031520000009 0.1438130979999982 -0.03793405999999881 -0.1895952000000009 0.1371469069999982 -0.03793405999999881 -0.1820111040000009 0.1333376549999982 -0.03698604799999881 -0.1725309840000009 0.1390515329999982 -0.03698604799999881 -0.1706349600000009 0.1447654109999982 -0.04077809599999881 -0.1696869480000009 0.1438130979999982 -0.04077809599999881 -0.1706349600000009 0.1400038459999982 -0.03888207199999881 -0.1696869480000009 0.1409561589999982 -0.03603803599999881 -0.1696869480000009 0.1428607849999982 -0.03319399999999881 -0.1744270080000009 0.1419084719999982 -0.03793405999999881 -0.1801150800000009 0.1352422809999982 -0.03793405999999881 -0.1971792960000009 0.1323853419999982 -0.03793405999999881 -0.2057114040000009 0.1342899679999982 -0.05025821599999881 -0.1962312840000009 0.1428607849999982 -0.05025821599999881 -0.1905432120000009 0.1438130979999982 -0.05025821599999881 -0.1895952000000009 0.1361945939999982 -0.05499827599999881 -0.1933872480000009 0.1390515329999982 -0.04646616799999881 -0.1990753200000009 0.1400038459999982 -0.03319399999999881 -0.1952832720000009 0.1390515329999982 -0.03414201199999881 -0.1905432120000009 0.1428607849999982 -0.04741417999999881 -0.1933872480000009 0.1419084719999982 -0.04551815599999881 -0.1848551400000009 0.1333376549999982 -0.04362213199999881 -0.1914912240000009 0.1352422809999982 -0.04172610799999881 -0.2028673680000009 0.1352422809999982 -0.03793405999999881 -0.1858031520000009 0.1361945939999982 -0.04457014399999881 -0.1791670680000009 0.1438130979999982 -0.04931020399999881 -0.1876991760000009 0.1333376549999982 -0.04931020399999881 -0.1962312840000009 0.1333376549999982 -0.05025821599999881 -0.1990753200000009 0.1409561589999982 -0.05025821599999881 -0.1962312840000009 0.1380992199999982 -0.05120622799999881 -0.1981273080000009 0.1419084719999982 -0.05784231199999881 -0.2038153800000009 0.1495269759999982 -0.05689429999999881 -0.2019193560000009 0.1457177239999982 -0.05405026399999881 -0.2000233320000009 0.1400038459999982 -0.06068634799999881 -0.2057114040000009 0.1457177239999982 -0.05689429999999881 -0.2180355600000009 0.1438130979999982 -0.05689429999999881 -0.2218276080000009 0.1342899679999982 -0.0635303839999988 -0.2151915240000009 0.1400038459999982 -0.0635303839999988 -0.2180355600000009 0.1466700369999982 -0.0692184559999988 -0.2246716440000009 0.1400038459999982 -0.07490652799999881 -0.2170875480000009 0.1304807159999982 -0.07016646799999882 -0.2095034520000009 0.1419084719999982 -0.07016646799999882 -0.2047633920000009 0.1495269759999982 -0.07206249199999881 -0.2028673680000009 0.1390515329999982 -0.06827044399999881 -0.2057114040000009 0.1390515329999982 -0.06637441999999881 -0.2000233320000009 0.1485746629999982 -0.05784231199999881 -0.2038153800000009 0.1466700369999982 -0.05784231199999881 -0.2104514640000009 0.1361945939999982 -0.05879032399999881 -0.2047633920000009 0.1390515329999982 -0.05499827599999881 -0.2085554400000009 0.1419084719999982 -0.0635303839999988 -0.2123474880000009 0.1314330289999982 -0.07395851599999881 -0.2085554400000009 0.1333376549999982 -0.0768025519999988 -0.2161395360000009 0.1390515329999982 -0.08059459999999881 -0.2237236320000009 0.1323853419999982 -0.08059459999999881 -0.2256196560000009 0.1295284029999982 -0.08817869599999881 -0.2294117040000009 0.1352422809999982 -0.08723068399999881 -0.2256196560000009 0.1352422809999982 -0.07869857599999881 -0.2256196560000009 0.1400038459999982 -0.08154261199999881 -0.2256196560000009 0.1457177239999982 -0.08059459999999881 -0.2284636920000009 0.1438130979999982 -0.07395851599999881 -0.2199315840000009 0.1428607849999982 -0.0768025519999988 -0.2113994760000009 0.1409561589999982 -0.0758545399999988 -0.2170875480000009 0.1304807159999982 -0.0692184559999988 -0.2180355600000009 0.1314330289999982 -0.06827044399999881 -0.2180355600000009 0.1400038459999982 -0.07395851599999881 -0.2208795960000009 0.1400038459999982 -0.0758545399999988 -0.2227756200000009 0.1390515329999982 -0.07206249199999881 -0.2189835720000009 0.1419084719999982 -0.08059459999999881 -0.2199315840000009 0.1400038459999982 -0.08438664799999882 -0.2294117040000009 0.1438130979999982 -0.07490652799999881 -0.2350997760000009 0.1466700369999982 -0.0768025519999988 -0.2341517640000009 0.1438130979999982 -0.0768025519999988 -0.2332037520000009 0.1371469069999982 -0.0768025519999988 -0.2350997760000009 0.1352422809999982 -0.08438664799999882 -0.2398398360000009 0.1419084719999982 -0.08249062399999881 -0.2436318840000009 0.1409561589999982 -0.08438664799999882 -0.2398398360000009 0.1428607849999982 -0.08817869599999881 -0.2284636920000009 0.1466700369999982 -0.0900747199999988 -0.2275156800000009 0.1457177239999982 -0.09481477999999881 -0.2350997760000009 0.1323853419999982 -0.08343863599999882 -0.2350997760000009 0.1266714639999982 -0.08059459999999881 -0.2322557400000009 0.1371469069999982 -0.09386676799999881 -0.2332037520000009 0.1409561589999982 -0.09291875599999881 -0.2407878480000009 0.1428607849999982 -0.09386676799999881 -0.2474239320000009 0.1447654109999982 -0.1014508639999988 -0.2417358600000009 0.1380992199999982 -0.1023988759999988 -0.2379438120000009 0.1371469069999982 -0.1023988759999988 -0.2474239320000009 0.1361945939999982 -0.09671080399999882 -0.2512159800000009 0.1352422809999982 -0.09386676799999881 -0.2455279080000009 0.1361945939999982 -0.09576279199999881 -0.2455279080000009 0.1400038459999982 -0.09386676799999881 -0.2531120040000009 0.1476223499999982 -0.09576279199999881 -0.2606961000000009 0.1476223499999982 -0.09860682799999881 -0.2578520640000009 0.1428607849999982 -0.09765881599999882 -0.2464759200000009 0.1390515329999982 -0.09197074399999881 -0.2360477880000009 0.1380992199999982 -0.09102273199999882 -0.2360477880000009 0.1390515329999982 -0.09291875599999881 -0.2407878480000009 0.1428607849999982 -0.09291875599999881 -0.2417358600000009 0.1438130979999982 -0.09197074399999881 -0.2369958000000009 0.1466700369999982 -0.09671080399999882 -0.2455279080000009 0.1476223499999982 -0.09102273199999882 -0.2474239320000009 0.1438130979999982 -0.09860682799999881 -0.2455279080000009 0.1314330289999982 -0.1099829719999988 -0.2483719440000009 0.1285760899999982 -0.1033468879999988 -0.2474239320000009 0.1304807159999982 -0.09671080399999882 -0.2493199560000009 0.1266714639999982 -0.1052429119999988 -0.2502679680000009 0.1361945939999982 -0.1061909239999988 -0.2474239320000009 0.1400038459999982 -0.1042948999999988 -0.2445798960000009 0.1352422809999982 -0.1033468879999988 -0.2407878480000009 0.1409561589999982 -0.1128270079999988 -0.2369958000000009 0.1495269759999982 -0.1061909239999988 -0.2322557400000009 0.1457177239999982 -0.08817869599999881 -0.2369958000000009 0.1342899679999982 -0.08912670799999881 -0.2445798960000009 0.1390515329999982 -0.08912670799999881 -0.2350997760000009 0.1438130979999982 -0.09102273199999882 -0.2294117040000009 0.1447654109999982 -0.09386676799999881 -0.2360477880000009 0.1504792889999982 -0.09671080399999882 -0.2407878480000009 0.1447654109999982 -0.1052429119999988 -0.2407878480000009 0.1361945939999982 -0.1090349599999988 -0.2417358600000009 0.1333376549999982 -0.1023988759999988 -0.2445798960000009 0.1333376549999982 -0.1042948999999988 -0.2426838720000009 0.1409561589999982 -0.1052429119999988 -0.2426838720000009 0.1361945939999982 -0.1109309839999988 -0.2493199560000009 0.1285760899999982 -0.1118789959999988 -0.2502679680000009 0.1380992199999982 -0.09576279199999881 -0.2445798960000009 0.1457177239999982 -0.09102273199999882 -0.2464759200000009 0.1438130979999982 -0.09860682799999881 -0.2407878480000009 0.1419084719999982 -0.09671080399999882 -0.2350997760000009 0.1447654109999982 -0.09671080399999882 -0.2379438120000009 0.1438130979999982 -0.09860682799999881 -0.2303597160000009 0.1333376549999982 -0.08912670799999881 -0.2275156800000009 0.1352422809999982 -0.09576279199999881 -0.2360477880000009 0.1428607849999982 -0.09481477999999881 -0.2350997760000009 0.1361945939999982 -0.09291875599999881 -0.2332037520000009 0.1304807159999982 -0.1033468879999988 -0.2322557400000009 0.1409561589999982 -0.1052429119999988 -0.2379438120000009 0.1409561589999982 -0.1014508639999988 -0.2483719440000009 0.1342899679999982 -0.09197074399999881 -0.2455279080000009 0.1390515329999982 -0.09197074399999881 -0.2455279080000009 0.1419084719999982 -0.1014508639999988 -0.2464759200000009 0.1428607849999982 -0.09955483999999881 -0.2369958000000009 0.1457177239999982 -0.09671080399999882 -0.2407878480000009 0.1419084719999982 -0.1005028519999988 -0.2502679680000009 0.1409561589999982 -0.09860682799999881 -0.2407878480000009 0.1485746629999982 -0.09860682799999881 -0.2294117040000009 0.1476223499999982 -0.09386676799999881 -0.2275156800000009 0.1419084719999982 -0.08817869599999881 -0.2256196560000009 0.1352422809999982 -0.08343863599999882 -0.2256196560000009 0.1371469069999982 -0.08723068399999881 -0.2294117040000009 0.1428607849999982 -0.09671080399999882 -0.2332037520000009 0.1361945939999982 -0.09671080399999882 -0.2322557400000009 0.1409561589999982 -0.09860682799999881 -0.2341517640000009 0.1400038459999982 -0.1042948999999988 -0.2388918240000009 0.1333376549999982 -0.1023988759999988 -0.2474239320000009 0.1380992199999982 -0.1014508639999988 -0.2464759200000009 0.1361945939999982 -0.09671080399999882 -0.2417358600000009 0.1323853419999982 -0.08912670799999881 -0.2512159800000009 0.1314330289999982 -0.09197074399999881 -0.2512159800000009 0.1342899679999982 -0.09765881599999882 -0.2474239320000009 0.1352422809999982 -0.1014508639999988 -0.2436318840000009 0.1419084719999982 -0.09386676799999881 -0.2388918240000009 0.1485746629999982 -0.0900747199999988 -0.2332037520000009 0.1428607849999982 -0.09481477999999881 -0.2360477880000009 0.1323853419999982 -0.09386676799999881 -0.2388918240000009 0.1371469069999982 -0.09386676799999881 -0.2388918240000009 0.1542885409999982 -0.0900747199999988 -0.2474239320000009 0.1504792889999982 -0.08438664799999882 -0.2417358600000009 0.1466700369999982 -0.0900747199999988 -0.2332037520000009 0.1504792889999982 -0.1023988759999988 -0.2417358600000009 0.1438130979999982 -0.09955483999999881 -0.2474239320000009 0.1485746629999982 -0.09102273199999882 -0.2464759200000009 0.1495269759999982 -0.09671080399999882 -0.2407878480000009 0.1352422809999982 -0.1061909239999988 -0.2445798960000009 0.1257191509999982 -0.09765881599999882 -0.2550080280000009 0.1295284029999982 -0.08912670799999881 -0.2493199560000009 0.1380992199999982 -0.08628267199999881 -0.2474239320000009 0.1419084719999982 -0.09102273199999882 -0.2502679680000009 0.1323853419999982 -0.09860682799999881 -0.2455279080000009 0.1304807159999982 -0.09765881599999882 -0.2407878480000009 0.1485746629999982 -0.09291875599999881 -0.2275156800000009 0.1495269759999982 -0.08438664799999882 -0.2256196560000009 0.1400038459999982 -0.08059459999999881 -0.2360477880000009 0.1342899679999982 -0.07775056399999881 -0.2341517640000009 0.1304807159999982 -0.08059459999999881 -0.2332037520000009 0.1276237769999982 -0.08817869599999881 -0.2379438120000009 0.1247668379999982 -0.09102273199999882 -0.2398398360000009 0.1314330289999982 -0.09291875599999881 -0.2502679680000009 0.1371469069999982 -0.1033468879999988 -0.2531120040000009 0.1295284029999982 -0.1090349599999988 -0.2512159800000009 0.1238145249999982 -0.09481477999999881 -0.2493199560000009 0.1361945939999982 -0.08533465999999881 -0.2388918240000009 0.1438130979999982 -0.08912670799999881 -0.2360477880000009 0.1380992199999982 -0.09386676799999881 -0.2417358600000009 0.1428607849999982 -0.09765881599999882 -0.2445798960000009 0.1400038459999982 -0.08628267199999881 -0.2474239320000009 0.1428607849999982 -0.08817869599999881 -0.2445798960000009 0.1552408539999982 -0.09765881599999882 -0.2379438120000009 0.1495269759999982 -0.08817869599999881 -0.2369958000000009 0.1390515329999982 -0.08249062399999881 -0.2360477880000009 0.1400038459999982 -0.08817869599999881 -0.2407878480000009 0.1495269759999982 -0.08628267199999881 -0.2417358600000009 0.1495269759999982 -0.07775056399999881 -0.2350997760000009 0.1476223499999982 -0.08059459999999881 -0.2369958000000009 0.1438130979999982 -0.08723068399999881 -0.2436318840000009 0.1304807159999982 -0.09481477999999881 -0.2474239320000009 0.1314330289999982 -0.09102273199999882 -0.2464759200000009 0.1361945939999982 -0.09197074399999881 -0.2445798960000009 0.1295284029999982 -0.09102273199999882 -0.2512159800000009 0.1304807159999982 -0.08154261199999881 -0.2540600160000009 0.1352422809999982 -0.08723068399999881 -0.2540600160000009 0.1361945939999982 -0.09481477999999881 -0.2559560400000009 0.1400038459999982 -0.09102273199999882 -0.2512159800000009 0.1447654109999982 -0.08438664799999882 -0.2512159800000009 0.1476223499999982 -0.08628267199999881 -0.2464759200000009 0.1495269759999982 -0.0900747199999988 -0.2341517640000009 0.1485746629999982 -0.0900747199999988 -0.2303597160000009 0.1438130979999982 -0.08343863599999882 -0.2294117040000009 0.1447654109999982 -0.0768025519999988 -0.2436318840000009 0.1504792889999982 -0.07964658799999881 -0.2493199560000009 0.1514316019999982 -0.07869857599999881 -0.2369958000000009 0.1466700369999982 -0.07395851599999881 -0.2369958000000009 0.1380992199999982 -0.08723068399999881 -0.2445798960000009 0.1333376549999982 -0.09576279199999881 -0.2531120040000009 0.1323853419999982 -0.09197074399999881 -0.2597480880000009 0.1304807159999982 -0.08628267199999881 -0.2436318840000009 0.1400038459999982 -0.08628267199999881 -0.2464759200000009 0.1409561589999982 -0.09197074399999881 -0.2597480880000009 0.1371469069999982 -0.08723068399999881 -0.2540600160000009 0.1409561589999982 -0.08438664799999882 -0.2426838720000009 0.1400038459999982 -0.0900747199999988 -0.2407878480000009 0.1333376549999982 -0.09102273199999882 -0.2322557400000009 0.1371469069999982 -0.09291875599999881 -0.2322557400000009 0.1371469069999982 -0.0900747199999988 -0.2417358600000009 0.1371469069999982 -0.08154261199999881 -0.2502679680000009 0.1438130979999982 -0.08723068399999881 -0.2464759200000009 0.1371469069999982 -0.09197074399999881 -0.2379438120000009 0.1352422809999982 -0.09291875599999881 -0.2436318840000009 0.1371469069999982 -0.09765881599999882 -0.2493199560000009 0.1314330289999982 -0.09576279199999881 -0.2521639920000009 0.1371469069999982 -0.09102273199999882 -0.2502679680000009 0.1457177239999982 -0.09576279199999881 -0.2426838720000009 0.1514316019999982 -0.09576279199999881 -0.2483719440000009 0.1466700369999982 -0.08438664799999882 -0.2550080280000009 0.1380992199999982 -0.08912670799999881 -0.2502679680000009 0.1333376549999982 -0.08817869599999881 -0.2398398360000009 0.1352422809999982 -0.08438664799999882 -0.2388918240000009 0.1390515329999982 -0.0900747199999988 -0.2464759200000009 0.1438130979999982 -0.09102273199999882 -0.2426838720000009 0.1457177239999982 -0.09197074399999881 -0.2313077280000009 0.1371469069999982 -0.08912670799999881 -0.2369958000000009 0.1352422809999982 -0.08154261199999881 -0.2426838720000009 0.1380992199999982 -0.08343863599999882 -0.2379438120000009 0.1438130979999982 -0.08817869599999881 -0.2417358600000009 0.1542885409999982 -0.09386676799999881 -0.2426838720000009 0.1476223499999982 -0.1005028519999988 -0.2436318840000009 0.1409561589999982 -0.09765881599999882 -0.2455279080000009 0.1419084719999982 -0.09765881599999882 -0.2502679680000009 0.1371469069999982 -0.09291875599999881 -0.2483719440000009 0.1352422809999982 -0.08817869599999881 -0.2426838720000009 0.1314330289999982 -0.09102273199999882 -0.2455279080000009 0.1228622119999982 -0.08817869599999881 -0.2550080280000009 0.1228622119999982 -0.08438664799999882 -0.2569040520000009 0.1304807159999982 -0.09102273199999882 -0.2550080280000009 0.1304807159999982 -0.09576279199999881 -0.2521639920000009 0.1304807159999982 -0.09481477999999881 -0.2464759200000009 0.1323853419999982 -0.09576279199999881 -0.2350997760000009 0.1276237769999982 -0.09955483999999881 -0.2360477880000009 0.1304807159999982 -0.1033468879999988 -0.2445798960000009 0.1400038459999982 -0.09765881599999882 -0.2388918240000009 0.1476223499999982 -0.08817869599999881 -0.2265676680000009 0.1485746629999982 -0.09386676799999881 -0.2246716440000009 0.1371469069999982 -0.09671080399999882 -0.2369958000000009 0.1409561589999982 -0.08249062399999881 -0.2436318840000009 0.1476223499999982 -0.08343863599999882 -0.2436318840000009 0.1428607849999982 -0.09765881599999882 -0.2445798960000009 0.1361945939999982 -0.09765881599999882 -0.2474239320000009 0.1295284029999982 -0.09576279199999881 -0.2436318840000009 Kst-2.0.8/docbook/kst/scripttutorial/simpleTags.js0000644000175000017500000000051012277111530021330 0ustar synthsynth// very simple KstScript demo: plot a vector collumn from a file file = new DataSource("demodata.dat") var w = Kst.windows[0]; var p = new Plot(w); var x = new DataVector(file,"INDEX"); x.tagName = "xv" var y = new DataVector(file,"1"); y.tagName = "yv" var c = new Curve("xv","yv"); c.tagName = "c" p.curves.append("c"); Kst-2.0.8/docbook/kst/Widget-kst-undock.png0000644000175000017500000000045312277111530017611 0ustar synthsynthPNG  IHDRЭIDAT(ϝS0[ aϘeb$ {mC-U4+%G^0U_m]ͽ>AԠRgɠ k }`Y3Vuu|V  6Uc"EaS쒉>E{$:A=((#ypw So[nm […lQ:3>=2; G63n&'H㲑7LJ{@ ϻ|VB U4IENDB`Kst-2.0.8/docbook/kst/Widget-kst-close.png0000644000175000017500000000047012277111530017432 0ustar synthsynthPNG  IHDRЭIDAT(ϝS10 [b@*` #c:x < i pr]:a' Xt6&1Dc[7ߨ\/:<xL@hIENDB`Kst-2.0.8/docbook/kst/Formula-kst-sinusoidfitequation.png0000644000175000017500000000453212277111530022620 0ustar synthsynthPNG  IHDR5;1 !IDATxMH[ElCn.B •  ! ..AAp PDD(HZ| (y 9od3YXL=q\jk+w]}x}⎻V;N+̲Gxn$9rGN7hO9"DÏ^Kq{f? O}y30Gyf2e+}py/%5dqqoq?a(s4' 9b|cAlD$W!}w=cAHtGh94E!='a Vr132}Ĝ($\:'Vnh*TIEqx<y<'d89wB{Og-_7hRltAjO<"'^}rv?SYAH8uEO@Wm{Ƹ?zGBL*z e=_-#HNb(uq5-T[F~ڕ㮂c~'fIn$~ˀwZjwddpL?SKrqSL'*)bx6²" {RgTbהI3 xk|s$Q>СH[ƍ1% yhFF}K*մ7i!J zSJ &DE?M'Cu($o8kps$Q׮ ps-~`0/sؠ3IB$: (%NjZ2wLβ"3'ÚI>_7GʵWF6͋uz(|^waS?+MŇTմ[r1m?LeTnC,T4mQDRIbP2S_}#$u҈ґH{Dwo ?[i?@).qilTxd"*J]ڕpFk6 2g:6ErTTX{Ej5) tJ &0PHpFm4I(.w·uF7@>uƽtp@0'E@ T\QEM'ҋ&Mzw&3QH8ƽgap(P>y{?a`N[#Rc@'|t03`-|l055:!RvY֩%%0F2X%m4kJ˲3#V5ʯ}l3]^l 񖀼IhxoiSz%I9|C)~##V KLCV-yЮ$8 Ӌ6%X>*}7NDW*ݑbcĪBɿmzn{efl̵3 OB 9v0#b9"鍘Pα;]qaLo$ 癄[`%nZEOBq۝NggELBqܝN~:QLo$wY,GQ21f9wS+F3`9"鍙(η;]% (ޘI2ө/b"`9"鍚fj"wWqwwWqwwWqwqQ@(cIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-curvewindow.png0000644000175000017500000001553712277111530021605 0ustar synthsynthPNG  IHDRiT]PLTEh O C5"+%   # +6 NX"L0S":X(;["Fl!GrGsFu@w$Jt-Qz.W"PK#Z/l:w?rBr>jJiFgLh\gpba^YWSSVRQSROPMB?:F>*Z=$v8;FW,p7с',JhܞϝƗ۹٭yϩoŠ`sjbzhwp|zv~ÝǝǛƘÄ~mdbcfaZMHHGLEEBAAAAAABIKKKJJJKSRRRSSVYZYZ^aabcckrsㄷ出ꊿݵ̿UDdtRNSJy6 IDATx{PW禤VECU##`YD3Z5JrTĘ-ZъAEL"'r.&7XEw+BS\V1lQŒMs0#4=ՙ;93gVBQgq'˥ezƐ}LfEy;$#Mj{.cJFҪ$ RW/yҪawQJd}2JŖJDjXC$wRb&[#v II/4/W֌{\礖]EiJ馃<$IEtΜ qaV {aaVmې| nkd; sҁjicNZFd HΪ*B򐤝i:iN=k]cods3ȝ)m#>̗Qg[IRTL H+VKs/SnZ$$eIbm*?c+͝ܭddgܛ=cKEywɩѷ)m%I eT+Q_>sf\JNcmR&ϥU YQ~JwRzƐ%rgnr %{8k[ѡSO}Y&׭%I5gTwH{ag.JyIi.ֺƶݪ:oTUY`rWKJF}|t:+SW;ݕiNzw˹"&:RYN#VLs}ge}}U rZٶ[aבedAdlظE#9[r+Ȫ4V$:RrUU*YY.%Fh|Nׅ1dlӼBdd(dv"d@d@d@d@fAT k>Y: .2 * dF ܳq-NLeP\lȄ 䵑'VCÙqkmsrRڱ !_(Mo@1p BW/mm#nײF(.KC-z8C0CI#CQ0(P 5' ` Q\/֨CIj&ﮖpEcoTqaXrJ5ϩs.6*SQqiz O5B&/4X؄C&}sJ>/Pj22*'FZIΓ)QܨQd?#E]ƃGٰ2Dԃ&FY:Nq$E<}s!FYpd <ߊ/E\]$-=$9dzsJG f(#Uo#ǍkYOj-c:2r-0wO`粓>:L=: wylو4ˀl& +|d@d%:5MS34|?SA@d@E5{ #S'ɼI PD%yy&¤("ȶԒ闖sr~ZL!Ck:#f(_,j{ŢdkX|T膸Z` xd b~1yqޏQ/'<Yݐp?wdzS:y{ }b&#kF6->>oBOC!;ZDs_ˆ5քDcaE#Poͭq/y'Ev-c6ӫ4 fSF&'j,&#xޑ 4$(2 2 2Ȁ Ȁ 2ȬVKiPf/TffY:J}w[B6@6KT|~7KEVn=]1Y΀u pŐG,% ~ OC7ש!MjN ۷;yd%FvId /4YA bH- YooNNoοS y0 #K$M3r?#PM䙫) ($ڔᤗ^J+ǫ9=ύ8md#ˉMVSDKEwZB֛7?\ɌK͟$1ѓHߢWv T˵w^co^ƺǗYzzr~_k?gy< 4nl9]dbaXf5A'gR| 1`y:@{z]֮l_"Wlm)^3DbH.׌[k;-z绷Ys%==Ek{Wri_j^o+K߿㥊.QTC&1ʈT0.5krzSk{QF_I^*Zخv{KvHi[xF'ҶovMpwK*}u^qb4bIb@+`8eo^k53OTAw;jzve*f(Lܖ΄DˈyybZ;1h8dvȸ@]4WV}z[}#E$t+ŅrynfFmY"W .ّEd,U=5\Ur1^La&##ƵV,dLIl2^ύ :NU-͝;uv>{ē-zݸ}٨nvc:y;wv *Wߨ99]&,ȝ+  mh>ICLӽcLj2RKeWXw搵k֦hۂr  n/2׶hv.J.Wg۫$Ē2]et?tt#SuEFHe3sKl1꾿p^,cFa6 mvӕd3>/>QlH_XJCн*74L'GIf@,ހsK }Ĩ'@ddIҐ:nٵYӐ/! LaȼWgF5ӘMDF? inW˳Y~ш1VjۏK~׾+o?$y)K{ IjȌtTSܭS\OzSddM! e/C|YH! e/82ė! e_meK{s_MeUlėEI|plK"ˢ+hQጇ2Ǘi5ėEI|~_e2ėEG| e/C|_f 2ė! eUe/C|<"q9@|Y9! @fA@AE jZ$h#eA@dA@d)eG ZZ%Z%Ⱦ3ݩZLAz٘EQ'Hae^̧WZMuFI)L<{*z,BR{`^ouFlEds6/Cb"Zm\Ͱ,JytŐPzlʑ}W6#`cJ5jVcQKՒreĶ+yV< yYH,UM%>#`cJ^FڐE}^yx |./<ʢ Rh3s9Y.W65,IVͳr˓e[7LvKբdQqSŻK.qLhR4KyDlEcgWrȌ)Ye}kլ.A&A3lOj QeJNZIŘE47UKRXGlFT-HՂT-H2dHՂT-Hj%*␪@fA@A@|ۊ_2ė_#C|_9e"ˬ/3'LD|ee&/,L4'LD|USS\&"̚2hFp2L ._f]|9e"ˬ/3'LD|_f2ė! eF2ė! /_Nq/)_@dA@dA@dP k i=jzh) +\o1aƭj:=2Y`Oa5L!rr؃dU&t0NX~A<];i J|y=w8jł%>W ?فq&# ՃؖDS{dZ8Yӗ鋦#b'al=(ZTkn8t/\c6-jԻ0\V1 eʬL|dCjAݢDO/20,dSM v8uѓuA>k~ ^8.B`+B6pG؜XL[:,n_ ,>A{>_o}zJ~V86ltqmQ1EΦbl'm(]7ZA㎲d>uAx+%J|@dhYH"Ė}꓏mdx)r1VWk ҄}i|\Qü|S>hr%Xt?z)weƴt-|Nl7^ȭ*  _F>7GȾ2RF;|}𩋽ros۟wq<{L6";xgJA;y=/m񫋂~޻~m7Gqi SC;Fdy}l1zh߁~s`~WWZ+J݇Gj}l4C}lDedpfJF$LdD3 "ɈN8!Ɉ+?4C^~LF$}7,p&#xzLF$v`M_f Ƿ} JoFd@f7JF#O8Q=b}Zq+ Fk\_}Xh/G?>kpD9$(d@d@d@d@d@dZ LIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-plotdialogcontent.png0000644000175000017500000002011312277111530022744 0ustar synthsynthPNG  IHDR8\FMPLTEžQTRRUSQTSPTTQTVQUWQUXOV\Gb~Z#?^$?a#>b!=b =b=b=b=c=c=c?eCkHt Ky Kz K{ K{ K{ L{ L{ L{ L{!Lz"Lz'Ly(My)N{+U.[/\0^3a5e5k7n:qCvE|EC?94~QTQQSQQSQQTQRURRURRURRURRURRURSVSUWUXXXZXbZTm]Iv`8}hBsKXhw`TRNKC=;:99:@AAAAABIJJJJNQRRSVYZ[^acq雯Ώ2tRNSƥrMIDATxkg,s^†C`!\ f"'Gf'5d']|L!I1K%%Ji 6 v穧~w~>U^{eBj7^-,^[^xEH Psj,=pJɍ_dsnW_pܘLFnܸqk23\:Yzk>/ aS['KO ͏/^!ܺ{oON7.<4;w8ww^bww}ު|I~ ἷpzY @G7opDnL8WFxO)}V9I/Q o _|vv {$=Ep rm|}鋧?q^&8xFOSve2Y _D.oӻ**o8rw,^ƫ_.p˥K&ըv ;5K&sR󭿕sd~pVn[UQƙ}?>~a^GaUըxwٸ'\bw5jA%R᤹md)s7_Z}eyk+w.LV.8}, ['KOwpCɿ=?jm?Z?O"v+~v.俉߅ג^nO/Z0񥭓S|ݵk_rRFە+++Wnq(kdɄCR]{'KO!GH4.!5ppppp!epv^d`yvzgZypv݌1ږ3R\p:Cx/ƿGugfy9Ӎhw~??Ds )yɌ'>pɉEA0FU ?ыRRp%\"48p?yz<Ǝ/Hg~GZp%/n0q}D_न:,㮔fwYЋxaѳ͸c׿pA+:pp^zj6}CN4T)|8']sΉxoOsYgG2 h `yu+:,sG2 h)'^&Hs-CJ3xv $qg]yg>n.O q48[=slsӢ<w2ނ 8egyd~2fbLXpD$摶*% leUXr"/M_ N6qskO\̯No{0\9Ee,yx^U*N jdCeH1m`d@y՞iNqx'*$6;Xሲ:IN G a /m 8qL2kN]uQaYSGC)#8'~J&ec]8[A6|6  ,3zL1 ;G`K@hTN+paƟ6-G9mrxpn68mi=pg8iͺm8mrڶ o8Ӏ!ᜒƐ3 81ppppppX~,0gD)&dt(8Np$|ݶe7)7E3 $~MGmM2mތi[Ɛu:̤Ĕmo8dQGkMҲ!8n8bq\kɶVwǵ UU>Lvҵ-wO^ hUGbq8p8r VqXU#gr1r 888885߾.7RynVR].FJ+ wpSKJڷr7X zPmਗF)G9}{pŲ.tˣ-׼HA_?7[,tc*_Uj~ݔ>ZspO/\=sY'ˣߙLuHkW/{U9_b83ճDZ[k^^ 'Wܫr{WU鐃T-k "!!!!88dlo#۵ q{R0RKPJE+zp6w0f 8C)Pgdo~B)_̮l#@N|鴇-.$. Kc(pkť?I ˥NT QdKc p(R:Ӏ3I36K$'tgGyK=})8;3qTO>}9љmS#_tp~6m8[tpgGrHwO_jW՛?dP, 8~Wl1G8p3-8NTgpqWUNqfXGzug5耩ى8I46ճqfYh-U|%jY8~|%j8Ep~589_笶qzv5YUq89ƙa325555Njaq8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p325?8Eeghrpѯpћ*Tc\TcylqT9_8'8)cw±pj 8epU88 ,q]p*±pJ8p,r pr*p2rJpiu8x8  8eD8iVF\e%p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p%8ۛv 8C)Phf0JM8pɠ΄ :|Uqppp($y$85L|7N 1%0ӨApqFp\8i d4qpf_U8U-.ݥpᴙp;⿏o.qϵai{:V`O){N?t0|uQϹEr ܫJ?(4$!(E[WA8"C,S\ilppppppCCCCCS ΒgLx/wK539+X4œ挢<29?gUEe`iZ7@sG8KΫW7~훯^%նyɌq{V}(io|q1,!Yibf߮zbΕ7\~{?xrN=ɽת[ G27smgfo[gJޕ7V839=};驣U%qN ]pw;qs?,-GsNU3±Z0UvDL 4p?<^'#E5C5Y8MeqwIȽC!&"_U{zp97O8nrpUnRhy93InHeLvS UUq88c+c1oSUU~ Wnh\i۫RnބJG+.qGn&)DC? }*9>rpp*ȱ8|bw|p#p8r Fp8r <;epǜ̦888888!!!!CH&ݫ,p)!!!!Bj^D-31[˩ZhA&7 rzy][hA&7  l.Go~n;t&啵 lA[>LN q<Ԁ7!h_ZNN-@4sEǰU'-#sL?Ǖ2,ёs%^`$3c I2jhxښF)zp&/4YQ^ 8<,(h[29ʼQvU1tTc8Gťc8HJKR戒'&q+c؋:=I{n=99TY (/PTz $a+{A[FT&Řf'ZpkM@3WTGf%ٷt\I]e+qK8eѦ])-&gL򘅒}pZƐWҒ>Qhұ%SRF tR{n=䆀dԞlcs G0_.J&Ps,=-q&)h>:O䊗j d-3!y.iA?<|rәMBO85;=&=Gw,2Mg?瘫ʁ,lCCCCCppppp'?@HyX&v\QIENDB`Kst-2.0.8/docbook/kst/Symbol-kst-theta.png0000644000175000017500000000037312277111530017456 0ustar synthsynthPNG  IHDR >֢0 pHYs  ~tIME3"bKGD̿IDATc_kgb?'"=3 U`:fsL_ 4r C2Sȹ سA,aG\dbq[ dx*96W$p~$I~{4IENDB`Kst-2.0.8/docbook/kst/Formula-kst-gaussianprobability.png0000644000175000017500000000327012277111530022563 0ustar synthsynthPNG  IHDRF5IDATh/h:!1 p`,`X.\0X`, 0 a00 CpsOOﯷ'g}<4f=mU۳wkޮo}W^.l[ V܄o#܈B.XxjO(yEdiQsח{ Vnj&Wu+F0NBz%. ]y; V뎵bOХx=!bՉX9XK79w]_Xv;0V)538\-9ͷ82ǯm,. *kk.7-BZٰn>%aaZZ*&N^#yIhbUoe7r XގzLʨS4)ZX}EM#aT<"X'}̕f_ k!-R\r44j` {/P 42[VQm_~kNZb=ࢦ51Q gM%‡D/ыs]ch47lrrgh&-eW(Qf)Vkҗ:n E)~'IPђN3Wcxv0GpGVxtJiIK\\%D"14VX+~@%a-Tdss!,DZP`Tn9٣GXn6m-yp"|o.-j<%$glNE%ohrBТ9 {@%856X g wcʉOUe0XBRs-0u)WJndmLEKfX~y5O?D)IDV%/Z&hX3gzG'֠ӰR[E%XLnkjs69oQى>p+xK'+o0rƤ`ڎ qK2m2Z}}ު{],[)ӂQ6v+'ҙݣ2ĴkKݗJ[dvjzUݼw[-"g]S5}L-G~&YffO%-z7QR-:5MtjSS`-(:?c +6_le~9Y0IENDB`Kst-2.0.8/docbook/kst/Diagram-kst-datatypes.png0000644000175000017500000002275312277111530020454 0ustar synthsynthPNG  IHDR}PLTEᴴ̻ĹŸĵ~~}}zz~xx|uu{ss}sszrr{qq{nnuiimffheefddfaad__baacmgh{{Əyyvvttssqqnnkkhhggeeccaa__^^\\[[ZZYYYYXXXXXXXXXXUUPPOO_SUWVWSSTOORMMOIIJFFGEEFDDDAAA@@A??A??@<:&̞^' ĀQA<^F]d5Pt%7*|+K+FF:[s0]*:wyğI}҈e5c538+lğ~4u#5qrrPF-aD&M'f=g#"4G)q)lsbBO"Vt_S"'#OO\N OORJQ@&'"V%9tz'lH)qZݻyd|+:#%9ɁR __NzKw)J3Cק>j.x+*#%9Nw٥x݈ m5#_x'ٸݭ[ߋ>w̷%x+ҥPOg<\>Kmn]x}#JzZCy}*.s.t+cҥ@#WؿZbh.Ľ[ƤKb,{Ō!Xh O]]HlH$d޸*V^۰< ؐtIaG46-LiD0NAb#%w^b̳ȯkHl@dpI>M~xtP3qU`$1M h& Aٚ$tpbHe`}E-txbSW[z֧Kf.!b%3n5Dې.B .\nqRvK3]ؖtb`R!enb{%VN۔.FsmC']iĐ SvГ:AlWd1b%3n۔ Hl_d&1+rb%S!tNVۙ.Kzևt\bHaqZb{%NR'kML'^~,C_d)ĐJb%9?epĶKCUvo#?] 92b %K!96i9utS2`od1 5Đ4NS.YD dkE5tKڈԿeĔKU#jf95ĴKZ-P zEIBjR' I>_]\ ZV|bz% FpWFjG7!Na {oSa> lE0bϚ|bz% $I@K?&7%d)$AR8-Ԥ8ּ뱃m~NLQx#aDo8qC018ooPFr<*iJ4 Tko?v(qiL/`o{XbTKZ[_ .!ٛvWe%dc7l&%3 7h+` e.1]⪆bcqI~v5C v4T\Զ~ĔKZَ=LoپfӖ.i!=yE\m}#f&1m&#vwEL$.]2XEr 70tb!;iK/2fӘ.C 3)9M"2]`WjKb:%ۈA3t6bXlmS)M#c[5 3iMl$N|=׮ ԦK6Cμne[.M$(hii81钽ą[hb%{au2tfb`>\mI`b%ۉϵ!0tnblC)Ol'H;ĴK\oN/j 1Đ qK4UdmCgtɾ)M9XY%.n5_LtZc]ˋ<ĴzS'J)a5n,*wm*Db)fԩ@y%mo~'WaU98 KL5VXM4=T0,10[/u*P\MmH #zɣ MzYxXz:鈟Vo~:Qy> #d Dl}װJVx(l^KߞP<*soτNO< #\ yA5U<`S/vQLqƞޑ.=(K쓺[HL*|rUK (d$v&q2;8%d$X?Q?#1#16H}[JS0izQuzd/} }LjӇ~S?CK̎n7yedztx|Ghi8CP}x|P]U.&Ib]uul6}߾&.!K!)8 b:ƿš 㛲FĮǂ㫀%8tʐq`2O]bʄg\{Ut$#KH&aod )M =I< ^HOISUC118$|;!{U UHWlǞixp7`8jXoNÙo-/ 87cQ#j$FbMA%dC-&~}&7 bCmqQoeh,Bh'Z'~UߐY^BY{1;2N,x7NI\pY"oTc+#n*#.^^2Tc[φw*6zx9]o$+#. q#`7>ةޥ0ξHX(c5R[%A6Ŝڤi*#D%Ĵ7ծ<ЍDຕ 2*HLYj"{m`g G{faZ5GqA% xbfB,(#\uw}PJvEf;. ߁IK_[ g6Fz-R oGfbG7<Oy3׋9q[Ev7.J}iYpo~#IL*3ϵ_<{Yoؠ9;8 ߲Gbɛ?sZ]WDbcr3<.٘eP _aԲL!y@$6 V\W,:cg+I5oY^F9em^JO,zbM %e{@$֕+}>ey@$֓+ygeJҤ*H=h毯4~Y k,"\3?ڷ,ʯ", Lb [`Db4SL\$x 5- 6ԆkUqTH6n i/XOLB_ig]Tb&qǾM'vTv UJ6m#6a$ӆ8HL 惃iM t) c⵷A #n;h}%N5a JW^盟@3jF< "s=m~nĦ6a3x`ͦ6a+iH0q- zsǧ #Xߧ 't?Eo`i]mqKZmG [N|; m٬r8;}$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fb$Fbsąv! /<;XFb #1EdTxG{D|&|`xH4i˭aa`$Fo|D),\-)zI1FGQD숈R<+sb*<_c|۸#LھNi奃׳dXdl(?Q? <g4gqS8QMaF-KnVpw;pbw}Sb8qKĮ@{=:Rf+#W%Pϕ־/4oy9{/X)& , KC/1lj? jc1f!Nz0%${.J+#r+x+)FroR^'22/lxc㨋=# z22K:-~0qo=ƽ[*m7Zꉷm[T1W$>߼5W~kXC 1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1] / x5gbͿKw+l)F#1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1c 1E_Hٛ׊u3~/BbGO7,7kQ6>bg׺2"2= G,xg7v1G!'qț5ÈO,n8dG &D;qdlt#mV]f&#B f*7~@1qԺA,#۵nf>¬Gvm;fn{qYhOtGچz)]Ȯd?6 4H6&~]GhnBn.X[˜juSݚnJ&f,BK..F۫ڒ&7~yl.bjuS4MnJFY#p G]B41r =M|]=I&u ;*HePo%|O|{b:LcMծ-4OZFv #~eDT:=dp VJ%&û.E3w`)C!VTIMq2'bio'{_ 𡕍abtNBTn gå8L[GOYKPVHKPCEI??B779324212"- BV "b)*h./V23@461-3 '1%1'0+-10/11011025T8[;`73}7zDj\Ac/_/}\8rXGcVRYUVVWXXY[^Y_gaelkkq~ux~~rXPPPHA@::99:@AAAAABIJJJJNQRSXYY[^bfrϝ tRNS߻rZUIDATxϋf,])X1XK3gݎ7]Xg;']fq 1l M`hܸ⃜`[JRu]U*$HUGz ~kmKHq}R3?R3bW,e35^"8_pݾKv?Ӷ?zYΗQ>m]s޾%C>3\> 6O~X%i/aS[/@ ի'wnpKz&/A˛\\ ~U?/;^K'kfswd.G~^~w]>z}p9 \ i0f灟kkk?;w*҃NuYwuLpnGn&Ry=|H/DUz:z<yG3j+Ǐ]WLsی׽ue\\>k돢ǿ~ zv9m*u͵ozj]ם_ll^ _.&xn(pF.+p}B4 #w݅yNVjpyG}m+s=1l F5ﶺZD?2A7i6B. ݆宭e(ۣNƕ+7Mؼy?< ^q@r&l,=|‰JҚ_֥Knw 7nO6ZqI,꾑r?x.ot{{^F7o=Qi ]:{m,pH9oyhe8dpR3!s?88888YpN'2,a\g1w2){/B8Vșϓٺ}ܺuK${\p&3pwOњ(p&i΋VfԞ8^Z[Y 5g1rޅS8[[fkK"Ac2cy9Ih%pNpNnY~|#G?Hk\,3N%4 |o\}jp2TxfymǬ^,i[f4G,:_ s=8Y(g N?{Vk`\L*wBZTGf|dY d~rpMppn#$$?u/RnUubE_NFw|bSUNz6&Tg*5zIuu9Lbk(R}x,el9yE9NgS8KȕNtXGbTcb'nq]UofxVal:=NG<'%|#>ÉQOU݁S/sBCCCC8[i8{;C9o9 J:Yu8LKjjyj55PP̷jqqqqq5ơơcj~"8P5?6U}or3ǁ\W'> 8kS8ppp8|s 888pҏ/8} N9R_ǁs~;pæ 8E8pCC8 g3rp:#p3׏pq7pCCC8!|HÁ\i@p; pS ([.pqS'\]N#=p8pppp8_ pj\ZJy@.~ܿ|pu89q98o8pCCC8!!p8pppp8888p8p8pCCC8!!p8pppp8888p8ɲ8ɲN<9Y pr^pp}ԅ5 '*ihnK88pѲ1]C+2U8p"pβ2N ˊ&8~90 pUe+XLi{c@!ppppښC SƘwUpfy}99pÙgipnyی8٠iۚdKWU)B:yyGg?#jkW7>oJp$("6ey=$GԶ,QryvW6PܰE<+) >jz`nlԏLEG!wFCJ'hKq|94'w gq^QbT`f! ,^Y8@frfYt_.?ؾ4 f}H:㨝Jws|ypB9O,p/Ōg4I*?V8f66*WuYG2햳|:;9k3α(Tyf2 +o|&5N~:Yi;cm63rl[}Tfv35E[rjkW/SY 'S)Hi$50ٟR]j +hf!h᧪C?r(>-y%~vjkW/{3_R,hx{i8JutˍL UrtAo11uƘw'p1i*!!!!r3t^q qh7YNAgk+%2 9 g~Rx,SƙS#݃.ܒ2>UUkTeT]A~y5 9pW\E;3v.ooU! pppppCCCCC>8{鳛rHo :8ƙr/TnAGVNIfBqN_*N%p*EP_t8T;݂?DzbV6Cc9gY71SO"ެmw 8m:LXOcf:\9Ʀ*ϯ-u<;脍j,lqV( cwR *vg4 TdXqs|h|" 8u%{888888!!!!!g )]y+ǿԒ꥖j\>>?rg ~C-DZTPgi7cX0pm #t|}c;=ۺ2\ܾĥ&y᜞pNOgaf+_+^0Y;>iszhJlҥl4])T/nocX;Sٙl;-Β$#z&7Qg/*kWc(Ms,s `/4V}q)7/:;<ᷪ_ ppppCCCCC8{鳛Ϭ\ˁp-.H ppppp!5 E5_Qɢ_) g[o~̅NpFZz7 .Id ZN|/x2Ғ+cԁ.NcS{M?pjg)\fPs*I/{X5邶N0P6SSy+ p E'"5S@<_,ق~~Yzq8|W8 ŒYzqci@+!!!!!!88";Bjo:!8 NfSIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-equationwindow.png0000644000175000017500000001465412277111530022305 0ustar synthsynthPNG  IHDRE|PLTEQTRJLK99:9p8x7~@KPOC>2*68::@AAABFJJJJJMQRRRSYZZZZ^abchns~郷燺fcbaT}KkIiFg5a+Y!M|!L{$Kz!Dm=a7X 3 ,+,RURSVSb^\vpnwwtuxvvxv|\w}žHKtRNS$(#(`IDATx_hG{dK`Ļ^ge/k|c '#A7ՆMc^L2}wA/~‘}Aտ͌gtuUWG]]uU9E{T**NQ\zr?@e~3>U[Z 1˚ާM[RlIy*t4|k4sB}Ui%Ŗ ӌ՛{Q:Ws.imcnS9kjvnë3Tk:Q`mkwn4?rEHV S'Չi{9a¾p;LU;\=[ekED&AJr^SU._ +NM\U4%-m;{1'64NqIo_tj弧Ǽ?o4/q>^V)+ 1^5A o8;~H,^)>27e yG}cUe1>$Alj4 r·h_%XW#EkE"sCP2 h^/h8 jB;W(^WP2I6T^ͯ|5x=rz |Er,i6?bJϼr] /zbזH!66;a=EyYꁗ|x`x~q4֨aAZ2ii`bDͮ-P葀Inz o}.ʔ*:PzZ$ٵz e>܁Eyi.tCFT%(_/m(_TV# T˰({6/ hx9EWU`_v~" (2d3,.XiLxx!WTmK@0C 5֮ץ/W4Ra2V_ETD[#j3zH^lӯxPWPA=rW?^*C{-Ɏ_xezD~Z/bLAqx~DbRuZAu~M7+"ZvPe0#q(Kw!U]ST+ T{H^wRaTWwa/&5ʮEJ c+˘a/VsPaW?Y7ܱFn> QxA^xAnBOT뵚mW0lPjxs!O$IU&DоX35lۯU7 ׯӞ ^/|^EоvBr+ *zP!77 !xxANj5Q*~߀`^^xx^^#:9z/ rG:./axAxAh". t9Ğ$K۾P+E뮯X"KF9 ў9+m:bsM͒K+8ނWj;x&cټۜ-%t^V3͵9´MQyGk%mSKz,= r"Q61"'iv5KoSk~0H=Zh}FHra?L ^;͂ / / / / Y!x9k*+c,OVµڹ/qmC`u1Ҷu+ټ5Nשmn<JËb5^켞0j^Eq̊y^jc yiW ֚!.omVץdkm sH^a=^ONjS#n%/U^x 2yQ\Va^*x9ˋ$^/ޢ[X_<>7h^$vB_/WDԌ7|xYhҟ]錓o'Fںz?N#L؝F}|_PQ]K^cYyջ>fnϖ+<BG`m>մ7nkgׯAL>rP-sx /$&jTAY^3~/ !$RA͸KչIe0 0k4x+2T,ubeduU%?^kS`t5g/ˆHR|5H3"4,,<0[lOn#||<05&hGC/jϫg5~(Sx-p7/WGy}f}ǟ*v%q)^o[i|_S\UJbDk2-̈u7._km׎J5ZEyE$CzeGb/^5:YqG9bkتʋs\] '(=8G~Q`iܗr\%+XQu wA7ESy5^wT-yV,6^~eCu9 ټCm]*/fP^JK;$KNQb}8+c6/6?,fKb<K0wy>?lNtҏ=v|:/{B9|tXJ;>^^K`.ckK 7~o͔`f ^ 1 ^.8jVl_ Pxua=N}+|X8/^Ƌė B yua=Fv<] ڕxƣ kë3R}~ϫ, %8~O78w8('Uu+ Gku^%8_y_T]#G=U_g DX $<=%/;y0+/ \nPvN|T^d8Ƈ!Rʡ^2Q>3:xʧE⚊?-^ϙ_BF^ewȇRrjTf^|EBeʢ/("U"^?ſCe? *(w_<ڤp)r3pMK~dT&ʝmn8)aMsGB9ʹیm꟢#ꕐj)QkGUnS`KmFd߭b3MM-z-(/Mo/.] XVM>/E7ZXrAJuU7qv-4P^J}M7߿D"ݏVlqPZt&Oõ ۯ߇Ou`S^ߣZ_%J9FaIPE"K^rϺ',.^ ύVG}lPMit,E:'`z"VG*AտP[ !~UgТn|![.t/;_j)*rJ:/*?|GUrI:?T^BC=/ʪZ/+~u=^UZo+w_S[w+- B(IENDB`Kst-2.0.8/docbook/kst/Icon-kst-tiedzoom.png0000644000175000017500000000043012277111530017620 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME"'ݟ\IDAT8˵ !DLˡ4ڠ #Ő8@oKef' 9c; 3ևṣ9gL@hlZgLp_*J<):KϦV̦dokx䈼cVE^U"B1yYۊ#')D֔IENDB`Kst-2.0.8/docbook/kst/plotsandwindows-chapter.docbook0000644000175000017500000015675512277111530022046 0ustar synthsynth Working with Plots and Windows This chapter details the concepts behind plots and windows, and provides information on viewing and manipulating the layout of plots and windows in &kst;. The following diagram illustrates the relationships between windows, plots, and plottable data objects. &kst; Window, Plot, and Curve relationships As can be seen from the above diagram, each window in &kst; can contain zero or more plots, and each plot can contain zero or more plottable data objects. The Plot Dialog The plot dialog provides a central location for managing plots. To access it, select Edit Plot... from the Plots menu. At the top of the dialog box you should see two drop-down lists: Top of Plot Dialog Top of Plot Dialog To modify a plot, select the window that contains the plot from the left drop-down list, and select the plot itself from the right drop-down list. New windows can be created by clicking the button in the middle. At the bottom of the plot dialog are four buttons. Delete deletes the currently selected plot, Apply as New applies the current plot settings to a new plot, Apply Edits applies the plot settings to the currently selected plot, and Close closes the plot dialog without applying or saving any settings. The plot settings available on each tab of the plot dialog are described below. Content Below is a screenshot of the Content tab. Plot Dialog Content Tab Plot Dialog Content Tab As the name implies, the settings on this tab specify the content of the plot. The following are brief explanations of the settings. Unique plot name The unique plot name is the identifier for the plot. There cannot be duplicate plot names. Displayed objects and Available objects Displayed objects lists the plottable data objects that should be plotted in the plot. Available objects lists all the current plottable data objects in &kst; that are not in the Displayed objects list. To move an item from one list to the other, first highlight the desired item, and click the appropriate arrow button in between the two lists (the left arrow to move a item from Available objects to Displayed objects, and the right arrow to move a item from Displayed objects to Available objects). Alternatively, dragging and dropping the items works as well. Foreground and background colors Select the foreground and background colors to use for this plot using the standard &kde; color chooser. The upper left box indicates the foreground colour, while the lower right box indicates the background colour. To edit a colour, double-click on the desired box, and a standard colour chooser dialog will appear. Click to swap the foreground and background colours. If you wish to quickly switch to a white background and black foreground, click Note that the foreground color only affects the axes lines and axes labels, and is independent of any colors used to plot data objects. Re-grid and Columns Check the Re-grid option to rearrange all plots in the selected window in a grid pattern with the specified number of columns. Axes Below is a screenshot of the Axes tab. Plot Dialog Axes Tab Plot Dialog Axes Tab The settings for the plot axes are specified on this tab. The axis settings are split into two identical sections—an x axis section and a y axis section. Auto scale Select this option to let &kst; automatically choose a scale for this axis based on the highest and lowest values for this axis found in the plotted objects. Auto up This option behaves similarly to Auto Scale, but the upper axis limit will only increase, and the lower axis limit will only decrease. Spike Insensitive Auto scale Select this option to let &kst; automatically choose a scale for this axis that is based on the values found in the plotted objects. In general, spikes, or sudden short increases or decreases in the value, will be ignored when determining the scale. Mean-centered Select this option to center the axis around the mean of the values found in the plot (x values are used to calculate the mean for the x axis, and y values are used to calculate the mean for the y axis). Specify the length of the axis in the Range text box. Fixed Manually specify lower and upper limits for the axis. Enter the limits in the textboxes to the right of Range. Logarithmic Enable this checkbox if you wish to use a logarithmic scale for the axis. Major tick density, Minor ticks, and Auto minor Change the density value for the major ticks on this axis by using the Major tick density field. The number of major ticks on the axis will be approximately equal to the density value, with slight variations depending on the plot size and zoom level. Select the number of minor ticks to show in between major ticks using the Minor ticks field. If Auto minor is checked, the number of minor ticks is automatically determined based on zoom level. In addition to axis ticks, grid lines can be shown on plots as well. Grid lines are drawn as thin dotted lines using the specified colors. Show major Select X major to show vertical grid lines corresponding to the x axis major tick marks. Select Y major to show horizontal grid lines corresponding to the y axis major tick marks. The color of both types of major lines can be specified by clicking the button next to Color. Show minor Select X minor to show vertical grid lines corresponding to the x axis minor tick marks. Select Y minor to show horizontal grid lines corresponding to the y axis minor tick marks. The color of both types of minor lines can be specified by clicking the button next to Color. Labels Below is a screenshot of the Labels tab. Plot Dialog Labels Tab Plot Dialog Labels Tab Settings for the plot labels can be specified on this tab. Brief descriptions of the settings are provided below. Current scalar list A list of the current scalars defined in &kst;. This list is primarily used to quickly insert values in the label texts. Choosing an item from this list will insert the item at the current text cursor position. Top label The label located at the top of the plot. Select a font size and enter the text for the label using the controls in this row. Y axis The label located vertically next to the y axis of the plot. Select a font size and enter the text for the label using the controls in this row. X axis The label located vertically next to the x axis of the plot. Select a font size and enter the text for the label using the controls in this row. Numbers, X angle and Y angle The numbers used to label both the x axis and the y axis of the plot. The size and angles of the numbers can be specified. Positive angles rotate the text clockwise, while negative angles rotate the text counter-clockwise. Font family The font used for all labels of the plot. Select an available font using the drop-down list. Also Apply Font and Angle Settings To Select the plots to which the specified label settings (except Label Text) should be applied. If All other plots or All other plots in this window is selected, previous label settings for the affected plots will be lost. Auto Label Click this button to automatically generate label texts for all labels on the plot. The text for Top label will be a list of paths to the data files used in the plot. The text for Y axis will be a list of the dependent variable descriptions (e.g. Number in Bin for a histogram). The text for X axis will be the name of the vector used as the independent variable. Labels (preview) The preview image at the bottom of the Labels tab provides previews of all four labels at 100% zoom. Legend Below is a screenshot of the Legend tab. Plot Dialog Legend Tab Plot Dialog Legend Tab Legend settings for the plot can be specified on this tab; most of these settings concern the appearance of the legend. The legend itself is optional. Show legend This option enables or disables the legend for the plot. If you wish to use a legend, you must select this checkbox. Display in legend box Select this option to display a border around the legend. Selecting this option also allows the background of the legend to be set using the color chooser located on this tab. Alignment The horizontal (left and right) alignment of the items in the legend. The available settings in the drop-down list are Right, Center, and Left. Font family The font to use for the legend text. Select a font from the drop-down list. Font size The size of the legend text. Note that the size is not specified in points, but is relative to a default size of 0. Colors This widget can be used to specify the colour of the legend text. The upper left box indicates the foreground colour, while the lower right box indicates the background colour (applicable only if Display in legend box is checked). To edit a colour, double-click on the desired box, and a standard colour chooser dialog will appear. Click to swap the foreground and background colours. If you wish to quickly return to the default colours, click Also Apply Settings To Select the plots to which the specified legend settings should be applied. If All other plots or All other plots in this window is selected, previous legend settings for the affected plots will be lost. Legend (preview) The image at the bottom of this tab provides a preview of the legend text at 100% zoom. Among other things, the preview can be useful in determining appropriate font sizes. Markers Below is a screenshot of the Markers tab. Plot Dialog Markers Tab Plot Dialog Markers Tab Plot markers provide an easy means of flagging areas of interest on a plot. The Markers tab provides full access to plot marker settings and options. Navigation functions for plot markers are described in the Scroll Menu section. To quickly create plot markers on a plot, place the mouse cursor over the plot and press the Insert key. A vertical dashed line should appear indicating the position of the plot marker. New and Add Use the New text field to manually enter a plot marker value. Values can be entered in floating point or scientific notation. Values in scientific notation must be entered in the form mEx or mex, where m is the mantissa and x is the exponent. For example, one way to enter the value 15000 in scientific notation is by typing 1.5e4. Click the Add button to create a new plot marker with the specified value. You will be warned if duplicate plot markers already exist, or if the entered value is not valid. Note that plot marker additions or removals made from the Markers tab are not applied unless the plot dialog settings are applied. Defined plot markers, Remove, and Remove All The list of existing plot markers for this plot are listed under Defined plot markers. To remove plot markers, highlight the desired markers in the list and click the Remove button. Multiple markers can be selected for removal by clicking and dragging within the list, or by holding down the Shift or Ctrl key and clicking on items in the list. To remove all plot markers for this plot, click the Remove All button. Note that plot marker additions or removals made from the Markers tab are not applied unless the plot dialog settings are applied. Automatic Marker Generation In addition to individually defining plot markers, curves, equations, power spectra, and histograms can be used to automatically generate plot markers as well. To use one of these data objects for plot marker generation, check the Use data object as marker source checkbox and select an item from the drop down list. Then select the criteria to use for creating plot markers. Selecting Rising edge causes plot markers to be created when the y value of the selected data object changes from zero to non-zero. Selecting Falling edge causes plot markers to be created when the y value of the selected data object changes from non-zero to zero. Selecting Both causes plot markers to be created on both rising edges and falling edges of the data object. In all cases, the x value of the point in the data object with the non-zero y value is used to create the new plot marker. If the selected data object is subsequently updated, additional plot markers will be created if necessary. However, plot markers will never be removed as a consequence of data object changes, so manually created plot markers will never be affected. The Plot Context Menu When working with plots, right-clicking on any plot will bring up a context menu that provides commonly used functions. The following list provides a brief overview of the menu items, often referring to other sections of this document that describe the functions in more detail. Delete Deletes the plot. Edit... Brings up the Plot Dialog, with this plot selected. See the Plot Dialog section for information on the settings. Maximize Expands the plot so that it takes up the entire area of the window. Uncheck this option to return the plot to its previous size. Pause Pauses automatic update of live data. This menu item duplicates the functionality of Pause from the Range menu. See Working with Live Data for more information. Zoom (submenu) The Zoom submenu is described in the section entitled The Zoom Menu. Scroll (submenu) This menu is described in the section entitled The Scroll Menu. Edit (submenu) This submenu displays a list of objects available for editing. Clicking on an object name from the submenu displays the Edit dialog for the object. Details on this dialog are available in the Curves. Fit (submenu) This submenu displays a list of curves, histograms, power spectra, and equations that can be fit. Selecting a name from the submenu displays the Fit Function dialog. This dialog is similar to the plugins dialog, but displays only those plugins that perform fits. The input vectors are selected based on the data object. In addition, curve appearance properties can be changed, as the Fit function creates vectors, and curves based on the vectors. Filter (submenu) This submenu displays a list of data objects that can be filtered. Selecting a name from the submenu displays the Filter Function dialog. This dialog is similar to the plugins dialog, but displays only those plugins that perform filtering. The input vector to be filtered is selected based on the curve. In addition, curve appearance properties can be changed, as the Filter function creates vectors, and curves based on the vectors. Remove (submenu) This submenu displays a list of curves currently in the plot. Clicking on a curve name from the submenu removes the curve from the plot (the curve itself, however, is not removed as a data object). The Label Editor The label editor allows custom labels to be placed in arbitrary locations in &kst; plot windows, in addition to the fixed labels created as part of plots. To use the label editor, select Label Mode from the Plots menu. The mouse mode will change to label editor mode. To exit label editor mode, select another mouse mode (such as XY Mouse Zoom). The following sections describe the functions available when in label editor mode. Creating New Labels To create a new label using the label editor, click anywhere within the x and y axes of a plot where there is not already an existing label. The label editor dialog should appear: The following are explanations of the dialog box elements. Scalars A list of scalars currently defined in &kst;. Selecting an item from the dropdown list inserts the value of the item at the current cursor position in Label text. Label text The text displayed by the label. You may enter text manually in this dialog and in combination with scalars selected from the Scalars dropdown list if you wish. Font The font to use for the label text. Select a font from the dropdown list. Size The size of the label text. 0 is the default value. Rotation The number of degrees to rotate the label. Positive values rotate the label clockwise, while negative values rotate the label counter-clockwise. Alignment The horizontal alignment of the label. Select one of Left, Center, or Right. Color Select the color to use for the label text. Clicking the button displays the standard &kde; color chooser. Selecting Use plot color uses the foreground color specified for the plot. Once you are satisfied with the label settings, click Apply to apply the label settings without closing the label editor dialog. Click OK to apply the label settings and close the dialog. Alternatively, you can click Close to close the label editor dialog without applying any label settings. Editing and Deleting Existing Labels To edit an existing label, click on the label in the plot. The label editor dialog should be displayed. You can delete the label from the label editor dialog by clicking the Delete button. Moving Labels To move an existing label in label editor mode, simply drag the label to the desired location, anywhere within the plot. Data Mode Data mode allows precise viewing of the data points use in a plotted data object. To toggle data mode, select Data Mode from the Plots menu. Now, when the cursor is moved over a plot, a coloured dot will indicate the closest data point to the cursor, as shown in the screenshot below. The status bar will display the coordinates of the data point (in terms of the x and y vectors used to plot the data object) in status bar at the lower right corner of the &kst; window. The status bar will also display the x, y, and z coordinates of any visible image. If images overlap, only the coordinates of the topmost image will be displayed. Note that all zooming functions are still available while in data mode. Top of Plot Dialog Top of Plot Dialog If the status bar is not visible, make sure Show Statusbar is checked in the Status menu. Zooming and Scrolling Zooming and scrolling in plots is easy and intuitive with &kst;. The following sections explain the different zooming and scrolling modes. Mouse Zoom Modes To access the different zoom modes, choose one of XY Mouse Zoom, X Mouse Zoom, or Y Mouse Zoom from the Plots menu. The different modes are described below. XY Mouse Zoom In XY Mouse Zoom mode, you can zoom into a specific rectangular area of the plot by simply clicking and dragging to draw a rectangle where desired. The x and y axes of the plot will change to reflect the new scale. This mode is often useful for quickly looking at an interesting area of the plot without having to specify exact axis scales. X Mouse Zoom In X Mouse Zoom mode, the y axis is fixed. Zooming in is performed by clicking and dragging a rectangular area; however, the upper and lower limits of the rectangle will always be equal to the current upper and lower limits of the y axis. This mode is often useful for looking at a certain time range, if the x axis happens to represent a time vector. You can quickly switch to X Mouse Zoom mode by holding down Ctrl. The mouse cursor will change to indicate the new mode. Releasing Ctrl will return you to the previous mouse zoom mode. Y Mouse Zoom In Y Mouse Zoom mode, the x axis is fixed. Zooming in is performed by clicking and dragging a rectangular area; however, the left and right limits of the rectangle will always be equal to the current left and right limits of the x axis. This mode is often useful for zooming in on data that is concentrated around a horizontal line. You can quickly switch to Y Mouse Zoom mode by holding down Shift. The mouse cursor will change to indicate the new mode. Releasing Shift will return you to the previous mouse zoom mode. The Zoom Menu The Zoom menu can be accessed by right-clicking on a plot and selecting the Zoom submenu from the context menu. A list of zoom actions and their corresponding keyboard shortcuts will be displayed. These actions are described below.
Zoom Action Keyboard Shortcut Description Zoom Maximum M Sets both the x axis and the y axis scales so that all data points are displayed. This is equivalent to the AutoScale setting of the Plot Dialog. Zoom Max Spike Insensitive S Sets both the x axis and the y axis scales so that most data points are displayed. Spikes, or sudden increases or decreases in x or y values, are excluded from the plot display. Zoom Previous R Returns to the most recent zoom setting used. Y-Zoom Mean-centered A Sets the Y axis so that the mean of the y values in the plot is centered vertically. The actual zoom level is not changed. X-Zoom Maximum CtrlM Sets the x axis scale such that the x values for all data points are between the minimum and maximum of the x axis. The y axis scale is unaltered. X-Zoom Out ShiftRight For a non-logarithmic x axis, increases the length of the x axis by a factor of approximately 0.5, without changing the midpoint of the x axis. The y axis scale is unaltered. X-Zoom In ShiftLeft For a non-logarithmic x axis, decreases the length of the x axis by a factor of approximately 0.5, without changing the midpoint of the x axis. The y axis scale is unaltered. Toggle Log X Axis G Enables or disables using a logarithmic scale for the x axis. Y-Zoom Maximum ShiftM Sets the y axis scale such that the y values for all data points are between the minimum and maximum of the y axis. The x axis scale is unaltered. Y-Zoom Out ShiftUp For a non-logarithmic y axis, increases the length of the y axis by a factor of approximately 0.5, without changing the midpoint of the y axis. The x axis scale is unaltered. Y-Zoom In ShiftDown For a non-logarithmic y axis, decreases the length of the y axis by a factor of approximately 0.5, without changing the midpoint of the y axis. The x axis scale is unaltered. Toggle Log Y Axis L Enables or disables using a logarithmic scale for the y axis. Many of the zoom actions are best used in conjunction with the various mouse zoom modes. Match Axis To quickly change the axes of a plot to match those of another plot, right-click on the plot and select a different plot name from the Match Axis... menu. Both the x and y axes scales of the current plot will change to match those of the selected plot. Note that this does not permanently tie the axes scales together; changing the zoom on either plot will unmatch the axes scales again. To tie the axes scales of two or more plots together, use the Tied Zoom feature. The Scroll Menu Functions for scrolling a plot are available by right-clicking a plot and selecting the Scroll submenu from the context menu. Most scrolling functions and their keyboard shortcuts should be self-explanatory. To quickly jump to a plot marker, select Next Plot Marker (to jump right) or Previous Plot Marker (to jump left). For more information on plot markers, see the Markers section. Assuming non-logarithmic axis scales are used, each function scrolls the plot in the indicated direction by 0.1 of the current length of the x axis (when scrolling left or right), or 0.25 of the current length of the y axis (when scrolling up or down). You can also scroll left or right in a plot by using the mouse wheel (if available). To quickly go forwards or backwards along the x axis, select Back 1 Screen or Advance 1 Screen from the Range menu. The keyboard shortcuts, CtrlLeft and CtrlRight respectively, can be used as well. Tied Zoom When looking at two or more related plots (for example, two curves on separate plots both dependent on the same time vector), it can sometimes be useful to zoom or scroll the plots simultaneously. This is possible using &kst;'s tied zoom feature. To activate tied zoom, click the small square at the top-right corner of the plots you wish to tie together. The squares will change colour to indicate the plots are tied, as shown below. Top of Plot Dialog Top of Plot Dialog Zooming and scrolling actions performed on one plot in a group of tied plots will be performed on on all the plots in the group. To remove a plot from the tied group, simply click on the small square at the top-right corner of the plot again. The square will become transparent to indicate that the plot is not tied. To quickly tie or untie all plots (including plots in other windows), select Tied Zoom from the Plots menu, or the corresponding icon on the &kst; toolbar. Working with Live Data &kst; features special zooming and scrolling functions designed to make it easy to work with live data, or data that is being updated while &kst; is running. These features are designed to be used in conjunction with the regular zooming and scrolling functions. Updating Plots Automatically To have a plot automatically update as data is being added to a data file, choose Read From End from the Range menu. The plot will automatically scroll to the right periodically, to display new data points. The update interval can be changed by selecting Configure Kst... from the Settings menu. Specify the update interval in the Plot Update Timer field. Pausing Plot Updates To pause automatic updating of plots, select Pause from the Range menu. You can still perform zooming and scrolling functions while the updating is paused. Selecting Read From End from the Range menu will resume automatic updating. Changing Data Sample Ranges To quickly change sample range settings associated with vectors, select Change Data Sample Ranges from the Range menu. Select one or more vectors, change the desired settings for the vectors, and click Apply to save the settings. These settings are a subset of those found in the Edit Vectors dialog. Manipulating Plot Layout Plots in a &kst; window are arranged in layers. Each plot is positioned on one layer, and each layer contains one plot. Thus, plots can overlap, with plots in higher layers taking precedence in visibility over those in lower ones. To change the layout of plots in &kst;, layout mode must be activated. Layout mode can be toggled by selecting Layout Mode from the Plots menu. Layout Mode Context Menu While layout mode is activated, right-clicking on any plot displays a modified context menu. The selections available in this menu are listed below. Delete Deletes the plot. Raise Raises the plot one layer up. Lower Lowers the plot one layer down. Raise to Top Raises the plot to the top-most layer, guaranteeing it will be visible. Lower to Bottom Lowers the plot to the bottom-most layer. Rename... Selecting this item displays a dialog box that allows the unique name of the plot to be changed. Move To Selecting a window name from this submenu moves the plot to the window with the corresponding name. Cleanup Layout Arranges the plots in the current window in a tile type pattern, with no overlap between plots. This action applies to all plots in the current window. Moving and Resizing Plots Moving and resizing plots in layout mode is analogous to moving and resizing regular windows. To move a plot, simply click anywhere on the desired plot and drag the plot. An outline of the plot will appear, indicating where the plot will be placed. You can drag plots anywhere within the current window. To resize a plot, move the mouse cursor to any edge or corner of the plot. The cursor will change to indicate that the plot can be resized. Click and drag the outline of the plot until the plot is the desired shape and size. Selecting Multiple Plots and Grouping Plots Two or more plots can be selected together in layout mode. To select the plots, hold down the Shift key and either sequentially click on each plot you wish to select, or drag to draw a dotted rectangle around a group of plots. The selected plots will be indicated by a gray border around each plot: Multiple Selected Plots Multiple Selected Plots Multiple selected plots can be moved simultaneously by dragging any single plot that is part of the selection (note that resizing any plot in the selection removes the selection). In addition, the layout mode context menu contains three additional items when multiple plots are selected. These items are described below. Make Same Resizes all the selected plots in the chosen dimension(s) to match the dimension(s) of the plot from which the context menu was invoked. For example, right-clicking on a plot in the group and selecting Width from the Make Same submenu will match the width of all the plots in the group to the width of the first plot. If Size is chosen, both the width and height of each plot in the selection will change. Align Aligns all plots in the selection to the plot directly underneath the context menu. Select from Left, Right, Top, or Bottom. Pack (submenu) The Pack submenu contains two functions. Pack Horizontally divides the entire width of the plot group evenly between the individual plot widths, while Pack Vertically divides the entire height of the plot group evenly between the individual plot heights. Packing plots usually results in a staggered or checkered pattern. To align the plots in a grid, use the Cleanup Layout function of the layout mode context menu. Group Objects Groups all the selected plots together. A group of plots is indicated by a blue outline around the entire group. The layout of the plots within a group cannot be altered, but a group of plots can be resized or moved as a whole in the same way the layout of a single plot can be changed. Grouped plots remain grouped even when layout mode is exited, so the Maximize or Delete functions of the plot context menu can be used on an entire group. To ungroup a group of plots, simply right-click on the group and select Ungroup. Working with Windows &kst; has a flexible window layout that makes use of Kmdi. Organizing plots on different windows allows for efficient viewing and manipulating of plots. MDI Modes There is a choice of four different MDI (Multi-Document Interface) modes available. To select a mode, choose one of the menu items from the MDI Mode... submenu of the Window menu. The selected MDI mode will take effect immediately. The sections below provide more information on each mode. Top Level Mode Top level mode is the mode traditionally used by other &kde; applications. In this mode, the parent window (the window containing all the main menus, toolbars, and status bars) is a separate window from the plot windows. The plot windows, while still functionally tied to the main window, appear as separate windows on the desktop. To quickly switch between plot windows in top level mode, you can click the buttons on the parent window, as shown below. Switching windows in top level mode Switching windows in top level mode Childframe Mode In childframe mode, all the plot windows appear inside the main &kst; window and can be individually resized. Each plot window contains buttons for minimizing, maximizing, closing, and docking themselves. The main &kst; window also contains functions for arranging the plot windows. The following lists the functionality of the buttons located in the top right corner of each plot window: Undocks the plot window. An undocked window is not contained within the main &kst; window, but is located directly on the desktop. You can also undock or dock a window by selecting its name from the Dock/Undock submenu of the Window menu. This is also the only way to dock an undocked window. Minimizes the plot window. Since the plot window is contained within the main &kst; window, clicking this button will minimize the window to a titlebar within the &kst; window. Maximizes the plot window. The plot window will take up the entirety of the main &kst; window. Closes the plot window. To quickly switch between plot windows in childframe mode, you can click the buttons on the parent window, as shown below. Switching windows in top level mode Switching windows in top level mode To easily organize the plot windows within the main &kst; window, you can choose one of the tiling functions from the Tile... submenu of the Window menu. These functions are described below. Cascade Windows Cascades the windows starting from the top left corner, maintaining the original window sizes. Cascade Windows Cascades the windows starting from the top left corner, but resizes each window so that the bottom right corner of each window reaches the bottom right of the main &kst; window. Expand Vertically Resizes each window to its maximum height. The widths of the windows are not changed. Expand Horizontally Resizes each window to its maximum width. The heights of the windows are not changed. Tile Non-overlapped Arranges the windows in a tile pattern, with no windows overlapping and each window being as close to a square as possible. Tile Overlapped Arranges the windows in three or four stacks, depending on the number of windows and the main &kst; window size. Tile Vertically Arranges the windows in a tile pattern, with each window having maximum height and no windows overlapping. Tab Page Mode Tab page mode arranges each plot window on a separate tab within the main &kst; window. In this mode, the plot windows are not independently resizeable or moveable—they conform to the size and shape of the main &kst; window. To switch between plot windows in tab page mode, you can click on the tabs corresponding to each window, as shown below. Switching windows in tab page mode Switching windows in tab page mode IDEAl Mode IDEAl mode seems to be identical to tab page mode. Creating and Deleting Windows New windows in &kst; can be created in a number of ways. To create a new, empty, window, select New Window from the File menu. You will be prompted for a unique name for the new window. You can also create a new window while creating a new plottable data object. See Placement for the specific details. To delete an existing window, simply select Close from the Window menu. To delete all current windows in &kst;, select Close All from the Window menu. By default, &kst; prompts for confirmation before closing any window. This behaviour can be changed by selecting Configure Kst... from the Settings menu and clicking on Prompt before closing windows. When a window is deleted, all plots within that window are deleted as well. However, data objects, such as curves, are not deleted. Moving Plots Between Windows To move a plot from one window to another, you can use the Move To function of the layout mode context menu. Kst-2.0.8/docbook/kst/Diagram-kst-array.png0000644000175000017500000001420512277111530017565 0ustar synthsynthPNG  IHDR38PLTE˭Ǭ}}}}}}zzvvrrrrvssoooiiibbbYYYSSSIII@@@:::000,,,((($$$  ,x@IDATxkO{/6/@#D@DnG(%[h:픹()ӮJٮYg WM4l՟(j~~4fC:-HLoՓh$^_|q44_7[S솺׸z6U 4X(ʮ;ҫdR2D{4r\1)>V~^vRhOthY*:wVbj.vq2_oOΨ4`ŽʳKQXkR8_k,Of T w 7'Jz51FhJ'9r~eO-@ETnN+oȕkUVR7Sqyݠ4Dp@;D@M4&h)&4 MhBЄ&4 MhBMM4!`qBThBЄ&4 MhBЄ&4S@h"&4D@q5)%44i5ьEdơ-4#1I @32{%4#1G?C32 dUhF&&A324#Dנk45dЌLk d\ͤm: d,uhF&Zh:ރfd2V 4#A321hF&cA32#4#q~fd2fd2ZQֳ) d\dЌLdyhF&5MB32'hF&c~ft2RtءSЌL{tX¡^ctɘaivs*42D5: B4EMcMtnIe,Vk4xOژ,U;]9VOJң%x N3^17VPL3hv1zK1Sޒw+* N /6&gcrxmʔO+͹uoeɝl=Ir\LUs|M֌:43h7&l=5C5hf LS]s$WSlt.t&oƳzD׼+ת;+%nV˧7ɛ.E=xfM]] jˀPƕL&ޮrtF٫Ĵ>HBS yZmJIxK^l4ORgZ!5+w"e+gbg|O.jQ5g5͓`q&w{NurE%JdoL抅f茪\4cqfoɮRNswLU5vZ@ˌyR3V}Jި_Q3V^!Xsѵi9b)4ISs%?%g`>j52kk^ݜ޶|b꣖1i>]LXwO.ۄ&g(MIW5TZ*̶sdzqI5493/'2 ˄2ZTe^8]L mYOwMΌE74^UO4 kIv;O5c+jUNc4A< Nv:^˘4McjѣV['X+0L3+41S3`f0f341kb3aFfY6ƌU&fc}&f_Y$ }h]v;Mnӟ6a+O0(hbU~dlgP+6>K:V:_q=BuoUihK 43Ϛ 436b 43L)6[T3H4Zhi&hBIMzͮNOVP49 j۝f'ASM ` a `Tci?0hqHQM%bGX4;iUMivЪ@S1z@MVJL8 QSU- `M%ӝj*Tk*T9^k *T핸AoUMYUο &gM%̗MVJAjUD._UkvJӽUt& 4زZ/n 4ؤBܪ@S}MV SM%>:8MV!P\[hjGCiת@SP roU;Yi٪@Siժ@So*T] VJ,/VJ<©֪@SժlB5c~ &ypOZSF"W4ŠC:dIhF&cfd2VC3dNC3ltɸO?C32NS@3dyA3l_5hF&ch-cz\h-c\h-CͰe\uf2Rtl?;4CFE٠tHcЌLƁz _G h/2 _}kQx&3dӻЌLƚ43 a]fd2&7hF'^fd2m gH4>t.ДdK%~CS63SHT8Cϟwkt(C{M hΐh~P^" ]OZ Dx5ս 9ߢ 4t?~كeSgV !寧LlcS:Q)RIHHAqX:-HLR)W 1n_N:zPF3GȭM,KȿϘ返Ko~w{YG~n^ϯt\v;ͪFvWَ19VJڭ?iڠ?͝NiUr!0v6# <~p؂g,|-3Չs"w{:Y;  99J'&/f,#)P>K'&'f?-)P>]K'&f-_>J'&f-[>J'&f-Y>]J'&,Υ]kO%)M ;KQ>J C|:NgMgLo-/{/^[^Mi_:40L.Ӷt:h:`ay4]ʧ]״i:Oiit*6N?KP>K Qӡ|ZNkMkL-/}*~[^VMiU:406ӢtZhZ`kڔϋE`X^jMyt^мKiU>/vvX^zM^:40d MV:͚f`YBӪ|KIӄ4KhZOsll %4-˧th`峵t65f[|kNzQsxg.i+_?0n@3JMh"&D@M4t ӒZ-±4f ô4٫#4%%<>iC-KJ(K5> RR~Ҿ*h.)hΞ|^'S:<@*mߒyo,)!Y|HUs|>DP2<>!#잾 ӒJ̚'kRc\)jfPp)yI 2W}ܶD}]"7n۪T"; NU/Y+|cbLo你9M4Є&h", }dc4t_s[*pKCSaB>>1Ue'זi[Jd/[{sݑ,4SeQz9)jgB+78wjWf}L!L=Zj)X1ęvR7/uM)v0r~ZjX1'u}3R:kMSԗne q|KC(,hs룖69FCIN̻=4=,#gLڨe*c!j􆾙{{hzS{HS"=4=d'ɠڃX$fA3JMh"cQIENDB`Kst-2.0.8/docbook/kst/Formula-kst-lorentzianfitequation.png0000644000175000017500000000237512277111530023153 0ustar synthsynthPNG  IHDRiMQIDATx?hPO! N2drsp"!K'ln2 "8t(AAPBlZͿ<3Yzo='$0#,"]̮@# 2Bb!Fb !Gz;ArogQK$.C`5=10o"tHdjk:=i#шq%?YB Kz-jTG24cKb*LF,#LԌa0% AXHMFS5.oF1ft@D2b9IP7M'I(l.L-mZD0޼dk>p |!h(r2A} uv~焢,Ol)6dYgG hʞ: +b˘gG3Ax닂 UgG'Hgט* Y 9 Aí daJ`Zy+7XT ;c7u9Ov:6moCK The &kst; &DCOP; Interface &kst; provides an interface that acts as a client using the the &kde; Desktop COmmunications Protocol (&DCOP;). The set of functions provided in the KstIface interface allows for easy control of &kst; by other applications or scripts. For more information on &DCOP;, refer to this webpage. Kst-2.0.8/docbook/kst/Formula-kst-deconvolution.png0000644000175000017500000000075712277111530021407 0ustar synthsynthPNG  IHDREByIDAT8cO 0M;cMY򑱝EarW)IZ G80#s)W]ٿ@LDKBllbzd~*CouJ s}O P6̈cskDѦ  EcAȦ`-BȟeaޅŐ'Y@64:)J!j!k) ?8ٔi/`Qy}d \6lJ~ F2 7(ٔD%__lt3#/x'$=C2E7YI,Xq9WSwS2-jᔈ,yFX&0=t2ÚS&V &O]ܐU!8c쌟O㱺Sa}3aWzk:IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-tutorial-gyro1.png0000644000175000017500000003535412277111530022132 0ustar synthsynthPNG  IHDR8g PLTE2/2253=V3Gt@LvOQp[Spa  %+/6|>BFP Y([_my -=Pcsޫܱ֬ΕƇ~yХiɜ_ȘSRLrKscS\XXYWWYYYWa]1/22/1921O9(G.C"C7,&     '2A I$B 5@?@ =H;W'>Y&;^,o+3"=)Gy*Ho!Hr Hr ItJuh&e6`H\Scctq|{xbSJ@e-tm>7s~Ưm43J]nqpnfez ){<)8xHU6]N!rݺZޭKlStfeBtjnmU{psٙv6Mi[))8!]btG$Dq·4͖Z NSrnmdn_{y'jb]O>Q:<}IF6)S'նUMZk<@ph4/>)FIĩZ-jkjk[[wn_a-vKm6cԹYO%46nfMM&'³ f`rXnt4<ԔcS26OsKK)2DfC)?rZuEo *:*;GyѫIٷϾj>Noey]gyB 쑄} 2GUm~]BSU\Nص\f{*Zm8=-z{55 Ųo GG*}?6{KF wӵ?߼"Y[2ɺ;K6n8ǙkM#=.eڱԻշW^q{E8d 9}fcpxeYuuotΫSg2N̬X:i4HC,0,mI2 fGը3sP~v]}1ǩU[=:H|Ou5/d`+_֣0qԹ;NX4̦ۋ_Ko}[Hcҟz8Ѷp_mmV#}k !6|d"ql3V .|4٥C{$8sW'RѪv܏rÈyK FՔ;6I8+ΖMNm#sW*ͪ[Frt\q5QԇSS,keG߄v@+yaWH뇳߼קc󶜟? @ pA J7sO! vnzmd6 <y2fkj7GXjnr SnTT+qꕫ7lhttp%FGFy$QzfԲt㚝Jt9T1$ڎk;G Y/ғ@,5JƬpRk58:Xv-ݡa>upFGslWGÎQQ'8ХK扃߻7W;'LÙL޹z5,|D"133,lEISIt9v#9>~bZ=*0RQ[qaس)^Z *Rו,k֗^Vci楯ZSpN=Eenb{Do=vmM$ǼF8ji!lT"l8+#iTK/*?}XqK pɔq692YqR۵fy\KS] sO;|v~V+ q18!SE͡5l'*X`iTSݼ^V_=G"1Lp]ٻ'Jm=,wv}ظ}pNv kb8f981ΆUJu"}|͆ YDZǵT}=a9#S P*lവj?#J p#b8J M5wMg%mXckwW;ѵ;ʚSIusog4J/:3耚o޸ڢǟPO,&'񁨡HD 'Gî!kVoQj6 >\Q? 39K̥:8[y$H5p K[+C=4P+͛C7OtgzIUNNjc"se*%RیC׎N_TEkpRY~uy |c)MV蟻o9Hqحe}mmKScJ}8OB8/VˢR;u8SߧGX?[g2)IV8MǑqD#7;1*\^zyTm@3585.ÉS-y'Ǝ R7h+X~4վm6zIT2~[1n.\=w5Z^knEϰ1FՌu22 g o(R幟)1vs9fC'gx9+Y+? ލ1QKh6*2i2rNq7Svc :;xƹXg8ۛvl` }'xU >w4|xCZAޥW ܾenčU;>`;֌%'eY̌R%0;c?vq:~uErBT05~sf-Ris]rR6MTQ> 57$"ƒzZDGܲH$XT;~m)f=G3=qP^#aS-śզD& F*j]dpl8/K)C6Oqgw=o8qۨڹsg9~A_{r\`\ݶQŒ߷V;8e2Ff17?_ڨZ")gY:+1ُ<裏PcXx26.UV\^իw2sΚH>rȒt8Th=I9>ǸNjJmZWĺ~{Ǐ2뙗hӛ#V>Twcj)s;Xjeţjp ip6?i Ug;༳c; 44vklؿFՎwts3Ǐ=$XarW pv184}ᳮ Cl;p}>t?W#4Xi"!8ߝGs$:Gy ;RۂrƏk85W԰.Wǡ<\d ~e:P=bWfJE}J >ND?n;OoFWKC){f8G9SQDfÔq=TAKƩ٩-dۈΜIivLgn{yMƎwmq/j`ڱc8~le{77oj5L jM3ٳg2{X q&no9~9niUP]͆ժיj|{EEKެ~pUHT4mʆ sSSg4tج_-J~c랻Fwd2 H5XhS8qߧ1NfY~||é<;2&iHtJthOs.vMWCѵӹj>b7/=s;3v׏*G_gG_ݲ^olg{om` u -ipxVe"Z*8Iq ik叾dv͑ћ];bsժZjsap;&QYdzN?CQɩnʻm1ӹjji:3qsq*՞{&2]sD c1d3T8|sx_N2‘{hnvHYe%I.#pX:I2431uU0j/{;W&F{NiqDEӭxo$>`ܹÒPz?L e.0p,HҌsfϨzw/ϰ8Ɩ_sծ.Yjζk>?S-BgUg=I&8mg 4}8ypKGO;b7>N|~h41R:s_96 if[14iþ}˃Wkr۷ꐧsԆ9CC.q\T7woÑNBw.nNbl G]3d>a=!u Aq8Yƙ1CzEziƜ9V8r՞ Ztچ S_6j޷X"g1:G3q5"u)կSZl!vR箃sܜogFՄg(@魱kj"|G-G-)ksDp"NpxQ㰨;N.Q.~  ]ٶ?W޷訧s>8606|CBW6oTOۼuk"Dvg?Auyw$fG!8OYh&8#93VT-1*#vNZ=+1ٽs>^.[2N ϘqTͶT7f;ۯX58|o||±w88,8+?9ݧywNZklqֹ9x}D wѨ4/$DSn^rgG;망}>FNpDGJ~sYgܰ vٴCcMxǣMKDbˬ9U>yh6q#Oc=ulM.Dk8hVbl! /p)\KT\4_(?w0Mk ^]3#A  8 EGB +cDvӪDsuԺ.HZ_l8u7<}K~WfCpdpHN}TMW 4VKM.*vJ}1ޫp=ybjfj!R:5Xw˼f8z@ .ɩo%Zp8s cu^B1"/0'l+L8<=~?p,!b8NN $!V@8si $-` !΍.0!cmCCr?C8!yC ;Z{tሒuI!;zIpvR8%9!yCęxT?+nS~!!Nߘf%L0t|>khA؎rLp go86/'8gu1K8xI'+C8$plW×8Ǖ!pQ:!E?OVp8$pIQO PB 0Av&R8Hp*2 NE xCC #lg_bm5{SaC)"86 ฎXxYqO<1}  ,pHpHp| / 81/8$88'̭/8xDpw8$ ( 8$Kk3/o>*\bpqM ǹjOjJ/+dQ=rˑy\8A!6pc%4H.[3`/dCZ! DZ^;xR88h?-x.g8$pvRp \E)(p'N1| 88npH! x{aCg -8Sph!89I}To8ppCpppzbqpTCpw88eN !888's5,J N1!e_8C e88^Q-!SNp|;\8iNjpǩҧp'{8Np(pk4t±;88868S''QSp,_8p'>Nah8^w)V88^aB %Jp &j 8888Y= ',&8NbR8'$X pڑqrC ׋pp7RC Nxxg8883MpD/f!88#,^8e ѣB]#8!O838a'x8688Y vJpBNdIOccpppb8}/ ppp NZ> G|b.088%z=xZpgARCgOSppp r)8vppppN`pJ8xvNp<.88ǡ !8Cꀓ pJN/dA)m8NQZp qu8Z8c7ppp#w88+Һ/aϓ _ k~g]:ppb?+pppeT[_8Spld ']sO8!HyK Pil8ywq8p88S88>*4Npr3888888E ҁc N9# ?(do(X8^  j7N,k8nqo ǻzypb[Sp}prג3|%g~U GNUgp>~'p4|8pSpp)78U'pr<Gը۟ 58^8S8NvYtk3N,TCS24f)8 :f8YL}8isA=ܛ88jSpB'u0,Kg|Ua8vj8##9 ܲu %͗4Ѭg+7)g8?8?jx( pNt%@ĽE/8s_*> N  ҧONqڅC _SU689͓w86|WiU8&9U{[?Nh|=N Gs)8 #Egj93e p'pr(l,88cp'pK$js8y^inNp2jcZ.8Ip#3>4)18)@8688a8ppppJ 㱚kk)28upppKN~x8'dX pM5)78pppt; 8E8 pDzarCTᘟxCpppx_2yTpppp'8nZ/S8\8Ny¡'quD8>CrC)N)Q_" QSp\Npppp'k8lNBX8Sp"8%N "'08O8SZM512O pp4)68p NUp }U'78~vppppppp$mpx8k=picJ B6R pJhF)p'8u *Rph&opܫquCá#) 7:Mpw84Dp0c8zM09cuV87 Wx1A898'jӓ48# 8c.w8u4 4;8܎5Zzp(q78?@j.> SZ8 K"ġ%eN}q, Tph>U$ieg<j{Gpp~;Q:Q?Rz[68{8 hpg ?_؂88a bS.i 5m:}SKST3Z188G8t`8 G8 pzw}@ <Ů4&@x & @A pآ/Kq*z8_M+, pA p p)+3O'(3gY^=P#^ڊ1O$|3i枍:MJ/>>;;;666://#3/F9W=_=a >c Ag!Kw!Kz"L{!L{!M|"N},Y0]5a7g9l8n:pEvE{C~<7CNJ@=<:99:@AAAAACIIJJJJJJKQRRRRRRRRSYZZZZZZZZZZ[abbccgkortxȶxdztRNS1u IDATx]h\UԉE1PLӉ CՆlB;8B %/Eֲ1ۮ6"AMt[uhLt*QxaӀsd7k2w{94ld@ilw(ΖM1(Z<-JVqM ;dl8M>~;ϟn*8(M!ahFk<To.vU6AI4amA#{ 'f{qik4VPyA q846>Hh5i%8/ jfi4J O{#{&eP+x8hmXHD!\+R]=8抃aXi5 -Te4T8[I.GNiaWW®p/UHhG1qj%ffOYq%qc3:;N:"}5*!a:L=V=KKя*tE҉g9/|iUr.Vq",u &zsV5J 5DfRE-Db'ڈc>r89ԩJV(ӾV&-q1!m5~>q0u ?i" iv8S9`We9Ji G]I4s}d4 GzpE3. " 1;7$ *G8G5wIO4=Ѷ6TUK4!=ǕiqӮ&1YcjQʱ-nqz;_쵫 3'εvW8A9%,$fqq@@@XMx+XOek]38˼JSPx?Se[iK_ B浛@_I۶B8id ,X}K) 9n4 ;O'P~LhFNHf\G/C0,3Ź)ta҄D &?O"=.VKk@ȺgqFGGC7.mx$Bš91eek-~G-ݤ Qyqy B/dsMCq6;MBuO׉sN-NTVY_տTa=8g~qfU`q1^̀8gq.bB956q,CIK¯#//T.K], PNyM,;wa$fo?*_7PKYj"Oce⌖BOZ,8%ބwEQt8, oqy\Yj)[`cL׺Y@e)ą8oKℬJx<̛ƚ#+۵~Vǫ_A?@@qc'sD 6"كL&K; p?HClMOӷXfkcG$n)8j&lI|\yՋD0֤V+_Zq^wPϓoKLtՑS֊:@UꊠH=xq2MqnִS44YVNwPg&::ix?88xx.(gi`;LJD/oJ,6HjX)(XqPW \v;$A>e"窌wjL|(&'%qjQK?Y) lTT ?Ɉ|tys1tkԻؐkڙ3:(o,$Ι]ᕻJq G:KJq֋FbN9{3R3n̍rw5?nq `CtwҪ81$Ί+ܪŜtwB/+5&|nb^;yf-{] IEy|_J:eU ];Y]Y'_}8/1o+=,9ƠsLV;e,W3<|2<4euY\%ET51 kƠICvaEce< @ IENDB`Kst-2.0.8/docbook/kst/Formula-kst-gaussianfitequation.png0000644000175000017500000000170612277111530022575 0ustar synthsynthPNG  IHDRDFIDATh홡\bD*D(FL4h2P(4l08|]uoEqs3ݣ%MX]ʳ:]@ֲ>T TA/XӚ "I]q#z3}}tL3q==g#g08#Z_fPϦugq%{˭ 'VB | Z9--78׭xk7ɺV}ɷi; ۝N1VV+uw \"4'E`;;9*+S E+ GQnZuH;D {Ei'P:@N8ZǼM^B9h7˝}|iԡ%=o|@%mWU`i2SXV8e)$?4m5(,]H bߩ|&ӶXl:Vv-RI7 ¡iimBƚ>2=|XN:z 4mN )օ ho<s0_+kk>+gcv%XJHu-Rq5!e/3NX[躮㛌ak-G Supporting Additional File Formats This section describes how to create additional readers for unsupported file formats. If you are not already familiar with data source concepts, please read Data Source Concepts Creating Datasource Readers If you wish to use a file format other than those currently supported, you might choose to write custom datasource readers. All &kst; datasource readers are regular &kde; plugins. Like all &kde; plugins, each datasource reader must have a shared object file and a *.desktop file. Before writing the reader, the library name of the plugin must be decided. This name must be a valid variable name in C, as it will be used in the function names of the shared object. For example, the library name of the reader for ASCII files is ascii. &kde; plugins are not the same as the &kst; plugins used to manipulate data. All references to plugins in this section are to &kde; plugins. The Shared Object A datasource reader should be a subclass of the abstract KstDataSource class. Ensure that you include the header file for KstDataSource in the source code for your datasource reader: #include <kstdatasource.h> There are certain requirements that a datasource reader must meet. One requirement concerns the presence of exported C functions. Other requirements are consequences of the fact that datasource readers inherit from KstDataSource. Both sets of requirements, along with suggestions and general explanations, are provided in the following sections. Exported C Functions The exported C functions are listed below. In the following examples, all instances of <libname> should be replaced with the actual library name of the plugin. KstDataSource *create_<libname>(const QString& filename, const QString& type) This function should create a new datasource reader of type <libname>, where <libname> is the library name of the plugin. A pointer of type KstDataSource to the new reader should be returned. bool understands_<libname>(const QString& filename) This function should return true if the file specified by filename is of a valid type supported by this reader, and false otherwise. The function should check the contents of the file for validity, and not rely on any filename extensions. QStringList provides_<libname>() This function should return a QStringList of the file types supported by this reader. The strings returned are arbitrary, but should be descriptive of and appropriate for the actual file types. Protected Member Variables KstDataSource contains various protected member variables that the custom datasource reader can use. These variables are described below. bool _valid This variable should be true if the custom datasource reader is valid. Most likely the reader will be valid, unless there is an error condition (such as the data file being unreadable by the reader). This variable is used by the isValid() function of KstDataSource, which is usually not reimplemented in subclasses. QStringList _fieldList This variable should hold a list of the field names in the data source. QString _filename This variable should hold the name of the data file this datasource reader is associated with. QString _source This variable should hold the type name of the source. Virtual Functions The KstDataSource class contains many virtual functions that should be redefined in the custom datasource reader. These functions are in the template files template.h and template.cpp, listed in the Example Templates section. Descriptions of the functions follow. TemplateSource(const QString&amp; filename, const QString&amp; type) The constructor for the datasource reader. filename is the name of the file to read data from, and type is the type of data the file contains. This constructor should most likely invoke the KstDataSource constructor in the constructor initializer list, and probably call the update function listed below to initialize member variables. In particular, the bool _valid variable should be set appropriately. virtual ~TemplateSource() The destructor for the datasource reader. Any dynamically allocated memory should be freed. virtual KstObject::UpdateType update(int = -1) This function should read any new data entered in the data file since the last time update was called, and update the member variables appropriately. The function should return KstObject::UPDATE if the file contained changes, or KstObject::NO_CHANGE otherwise. virtual int readField(double *v, const QString &field, int s, int n) This function should read n frames of data, starting at frame s from the field specified by the field name field, and return the contents in the array v. If n is less than 0, the function should instead read 1 sample from the start of frame s. The number of samples that were read should be returned. virtual bool isValidField(const QString &field) const This function should return true of the field specified by the field name field is a valid field in the current data source, or false if the field is not a valid field. virtual int samplesPerFrame(const QString& field) This function should return the ratio of samples per frame for the field specified by the field name field. For data sources that do not make use of this concept, the number of samples per frame can be set to 1. virtual int frameCount() const This function should return the total number of frames in the data source, as of the last time update was called. virtual QString fileType() const This function should return the file type of the data file currently being used, usually the same as the type parameter that was passed to the constructor. Alternatively, it can contain an error message (to indicate, for example, that the file is not valid). virtual void save(QTextStream &ts) This function should save the file description information to ts. In most cases the implementation provided by KstDataSource should be sufficient. Example Templates In general, the following two template files can be used to create new shared object files. Simply modify the function bodies as appropriate for your particular data source. /*************************************************************************** template.h - data source plugin template ------------------- begin : Fri Oct 17 2003 copyright : (C) 2003 The University of Toronto email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #ifndef TEMPLATE_H #define TEMPLATE_H #include &lt;kstdatasource.h&gt; class TemplateSource : public KstDataSource { public: TemplateSource(const QString& filename, const QString& type); virtual ~TemplateSource(); virtual KstObject::UpdateType update(int = -1); virtual int readField(double *v, const QString &field, int s, int n); virtual bool isValidField(const QString &field) const; virtual int samplesPerFrame(const QString &field); virtual int frameCount() const; virtual QString fileType() const; virtual void save(QTextStream &ts); }; #endif /*************************************************************************** template.cpp - data source template ------------------- begin : Fri Oct 17 2003 copyright : (C) 2003 The University of Toronto email : ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can 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. * * * ***************************************************************************/ #include "template.h" TemplateSource::TemplateSource(const QString& filename, const QString& type) : KstDataSource(filename, type) { } TemplateSource::~TemplateSource() { } KstObject::UpdateType TemplateSource::update(int u) { Q_UNUSED(u) return KstObject::NO_CHANGE; } int TemplateSource::readField(double *v, const QString& field, int s, int n) { Q_UNUSED(v) Q_UNUSED(field) Q_UNUSED(s) Q_UNUSED(n) return -1; } bool TemplateSource::isValidField(const QString& field) const { Q_UNUSED(field) return false; } int TemplateSource::samplesPerFrame(const QString &field) { Q_UNUSED(field) return 0; } int TemplateSource::frameCount() const { return 0; } QString TemplateSource::fileType() const { return QString::null; } void TemplateSource::save(QTextStream &ts) { KstDataSource::save(ts); } extern "C" { KstDataSource *create_template(const QString& filename, const QString& type) { return new TemplateSource(filename, type); } QStringList provides_template() { QStringList rc; // create the stringlist return rc; } bool understands_template(const QString& filename) { // determine if it is an X file Q_UNUSED(filename) return false; } } The <filename>.desktop</filename> File The following is an example of a .desktop file for the template plugin: [Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=Kst Data Source X-KDE-ModuleType=Plugin X-Kst-Plugin-Library=template X-Kst-Plugin-Author=The University of Toronto Name=File Reader Template Comment=Long description of the file reader template. You should add translations in additional languages for the Name and Comment fields by adding additional Name and Comment fields with [xx] appended to the end of the field names, where xx is the two-letter language code. For example, to add Spanish translations, the following lines would need to be added: Name[es]=Plantilla de lectura de ficheros Comment[es]=Plantilla de código para hacer un complemento de lectura de ficheros. The field X-Kst-Plugin-Library should be exactly the same as the decided library name for the plugin. Compiling and Copying To compile and install the new custom datasource reader, create a new directory under kst/datasources of the source package. Place the source files for the object, along with the .desktop file in the new directory. Then, edit kst/datasources/Makefile.am so that SUBDIRS contains the name of the new subdirectory. For example, if the new subdirectory is called template, SUBDIRS might be changed to the following: SUBDIRS=ascii dirfile frame indirect template $(PIOLIB_SUBDIR) $(FITSIO_SUBDIR) After the required files are in the newly created subdirectory, a Makefile.am needs to be created in there as well. Use the following sample as a template, replacing all instances of template with your custom library name in kde_module_LTLIBRARIES, kstdata_template_la_SOURCES and services_DATA. INCLUDES=-I$(srcdir)/../.. $(all_includes) kde_module_LTLIBRARIES=kstdata_template.la kstdata_template_la_LDFLAGS=$(all_libraries) -module -avoid-version kstdata_template_la_SOURCES=template.cpp METASOURCES=AUTO services_DATA=kstdata_template.desktop servicesdir=$(kde_servicesdir)/kst Once this is done, you can compile and re-install &kst; from the modified source package, or alternatively, only install the new libraries, like follows (using the template subdirectory as an example). First change to the root directory of the &kst; source package. Then, ./configure --prefix=`kde-config --prefix` cd ./kst/datasources/template make make install Restart &kst; and the new datasource reader should be loaded. Kst-2.0.8/docbook/kst/Screenshot-kst-imagewindow.png0000644000175000017500000001705612277111530021541 0ustar synthsynthPNG  IHDRAAAABIJJJKMQRRSUYZ[[^chr|낶爻obadXAsGkJiFg4_&R!M|!M{!Kz!Fn >a8U-B*0,-HFEUTRf`^zyżĽž:tRNS`IDATx_h׽5ZB(75咴8޸Ԩ)Gd]Ejز[[A`dpJмSD`.~rЧBP_`a93;;3Wo̜Ϟ3gg~lmQq_?z ultmjF~r\u{BTC#YClA ӫBЈ֒؂^}bz=2m+P18#[+(ދ M^oSMLKKN'#*%n0xwlS&h4uL?u"I9s=>C}q#8k99v_7"בh%jD ,}-LM?nݚ y0W1%kw@LbjR@/3K3M:R!>4^71fn4?`:%17iM:~C7f 8Xo5cquM?ZŠ;s! [Px&RT;tS>pez ]7وܡ'R4uZޭ(Ab z o8}DDȵ:#8pb 21 \F[Аb:QLG L0AL0AL0ALpajP{w0:_:C9ӷ 0+[{Qֺ Tvm"&L0Exh0`*JKM'!F A9&= &BYrb#wiI+}ZƸbʖI104f*&SjL#0ec"SZASDDڢ h@`X֦ 6JDYvDԦhX;ߛ&% Sr{{kJqS{z֎`iuX:&7SHߛ웧b]bb)-S jŋx݈Lhm- BX1 Ih& * * q*Sl@Z`N.g5zA#kTX$q?mܔR1u7S.N1 3}J (IYa"HLi; /Dw1A 4 $0{S_0C ]1EyBEݼcn]2JE]7{QrLe qv6ߝ6zLP]:;KfgC82;;՛@aL0L0LP^LJ&jBNO{9(`& & rSWQs%ۘ.^oF^`iP0Y?C~gawjV_࿔+&凁4L'`xݟ JVFm )Yf5zb.8Ivl==^_1*G_t]M0AL00LT::LQYƻr]j?j)aCuθX?qX˙ww#=yzŴ~i}[1Re+#cŖ~3M迌0}Y L1Ru &U1w^LqL̶ Lf{aƱ22SäG:&)6=GDeU~$_Vc*tDĞnT%o6Ϝdw(I|'>S`3Fuv3dIm#> IY[nϜdwM*Z22a*7!<zXs_a)ҺDLx'0L0LL0A ;A cr0AL0ALzXgnrLVSLL0XGdz}(]\YQu3[)u`%"uf:,TScҡ g&P7yȻd{#j_BT.-\sōgc! 4]T0嘇8ޓS=S@fsQuü7L9&`* LL0A9ikLӭ?AP9&O ֺw: gR/)kML7]))b^1#' A$1=)S'~[6!ъ/"9Z a :Lo_n1Emd.NL|ʊ0%Ů0-G"r "K򠔘jL[.4%秵 2Ӽ /|oI6=Ӧ114LC[Yyė7_Im.1e1D+nt#./)]ª\d"tEȢs'ͥ.݈Cz Ϙ,@R!&mQ4k|lg]yL:m71AR!&L<\4ݺ)2Õ[`LML.v)A\,VwE-`&`ڣz'dAl>L}$)Lḇr.=9aQ'ԧTm_4 0I2\WzY  cΟWivT&e6@ǥ 9ߵ)IbwHƴ6Lߛ%>,0TfIVMcv]^GpdS7>iWFâ~0=i`)m ލJ*|fA4rq6D>{ɜѢ+L=[֓]$[KXyVJ`" 1 L)˚S`DMh`Q6LZ 촫0>A>S1''4So6 LYeM)o>OH&'q'LD,ZS:"&^$&%Cfg]'mYW񰨧EzqL+[8y0i cb]zBzPJja\qe Xβ(d d0ZqL%b8JMA%&voݵQJwdd`*~*¡M4Ӟ|LLT[׌i l! &` &` ~av90Y[oo{%E OV` c '1Y4U$PgXl%0 #+,0uĽH$Kol^eɊ)]¦v,QزAS>cY`jOkԩ64zAƲ`zaŤPĝFcY`j;B/2zzjm"Fak=@i$^OƲdt@b&R;zd/4;x & & &`&` `t\t)0A &` &`y%0-qjY3ʁ |?YlƔ,^4,O~NYe( /^|XJ&^0RE Kn" q~T\EH'V'SgLﳍ &U&-BKcxBn` tL8Vܛ@0:)B<=YoemtLJGiXE*Fqs5Vb ΁G3p3ؓ^x*-/PZ' I|oٚ:&qO=\|e n)byĻ|V̾$3^|r "|QLH& & A aR3)=)M*43qTM%Ӆ'%^܅4q 'ILϴ2TL `Z)Ai;}9Sdݣmsm+7@00g)GL̂J"ur[B&\LRKEx L>FC4@3$;b cKynb1%I5sP5Lub[A6̣'ȴ YL#>~Uޒ H#P4>dZ揾ͤR5bb>II.D#gԾ글)e/úH9Vc2tIF]-Ĥ>$r2r *Ǥ L`L Ucbт˅0}*gAlMVi iXK*3db'sU)̧cRO 9)㵴V39͘:dX01Fe߀fQfN "1f0V0힜f^}j s'[P{:9$P~Z]ŤL@].&Ӓ !rzclkcJ4L]\SߛA^4v&9J"qS4:rDN%.-LLyهX1$mfl{jj^gZ} !dh<_c+vL( ek۬پ2rWS+sq'2pKýSLB7T'ۭKx^9t%3=߯h^ywk1x LCQ-ES` 1 `&`rӻ:ߠ\a߻!:/BL?SGAs[[~V ŷ[<-3LtSF|JL6~ZYpl6 v"[y%D7y4}g/7 ug7_Ů3_)ozbzlׇ||ʛn1}!5 >[8U{/ob%|TT]Fk!kRnILk~~[է뼲=^l󷡢Tl\E^|R U׾ťUM 1Z~G܁-`rڵ/("cعV{绪[]{wWڕ^]U#Wv6Y5Yjgő'/jF&Yvyո X|EiwBHe5U_A=_uP=qk5q躕aemUUp{}hu[\W,narhڽmB薅eyX;xma}x;=ܣ [ , d{q8Bq$The Kst Handbook

The Kst Handbook

Rick Chern <kst@kde.org>


Revision 1.0.0

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

Kst is a data plotting and manipulation program with powerful plugin support.


Table of Contents

1. Introduction
What is Kst?
Getting Started
2. Working With Data
Supported File Formats
Data Source Concepts
ASCII Input Files
BLAST Dirfiles
The Data Wizard
The Data Manager
Creating New Data Objects
Editing and Deleting Existing Data Objects
Data Types
Vectors
Curves
Equations
Histograms
Power Spectra
Plugins
Event Monitors
Matrices
Images
The Data Menu
3. Working with Plots and Windows
The Plot Dialog
Content
Axes
Labels
Legend
Markers
The Plot Context Menu
The Label Editor
Creating New Labels
Editing and Deleting Existing Labels
Moving Labels
Data Mode
Zooming and Scrolling
Mouse Zoom Modes
The Zoom Menu
Match Axis
The Scroll Menu
Tied Zoom
Working with Live Data
Manipulating Plot Layout
Layout Mode Context Menu
Moving and Resizing Plots
Selecting Multiple Plots and Grouping Plots
Working with Windows
MDI Modes
Creating and Deleting Windows
Moving Plots Between Windows
4. Saving and Printing
Saving Plot Definitions
Exporting Vectors and Plots
Exporting Vectors
Exporting Plots
Printing
5. Event Monitoring
Event Monitor Dialog
Expression
Kst Debug Log
E-Mail Notification
ELOG
The ELOG Extension
Server and Logging Settings
6. Plugins, Fits, and Filters
Adding and Removing Plugins
Built-in Plugins
Autocorrelation
Bin
Butterworth band-pass
Butterworth band-stop
Butterworth high-pass
Butterworth low-pass
Chop
Convolution
Crosscorrelation
Deconvolution
Fit exponential weighted
Fit exponential
Fit gaussian weighted
Fit gaussian
Fit gradient weighted
Fit gradient
Fit linear weighted
Fit linear
Fit lorentzian weighted
Fit lorentzian
Fit polynomial weighted
Fit polynomial
Fit sinusoid weighted
Fit sinusoid
Interpolation Akima spline
Interpolation Akima spline periodic
Interpolation cubic spline
Interpolation cubic spline periodic
Interpolation linear
Interpolation polynomial
Noise Addition
Periodogram
Statistics
7. The Toolbar and Keyboard Shortcuts
The Toolbar
The Toolbar Menu
Custom Shortcut Keys
8. Licensing
A. Command Line Usage and Examples
Command Line Synopsis
Command Line Examples
B. Creating Additional Plugins
Creating a Basic Plugin
The XML File
The Shared Object File
Compiling the Plugin
Creating Linear Fit Plugins
Header Files
Implementing Required Functions
Calling the Fitting Functions
Example
Creating Non-linear Fit Plugins
Header Files and Definitions
Implementing Required Functions
Calling the Fitting Functions
Example
Creating Pass Filter Plugins
Header Files
Required Functions
Calling the Filter Function
Example
C. Supporting Additional File Formats
Creating Datasource Readers
The Shared Object
The .desktop File
Compiling and Copying
D. The Kst DCOP Interface
E. The Debug Dialog
The Debug Log
F. Installation
Obtaining Kst
Installing Kst from Source
Requirements
Optional Libraries and Packages
Compiling and Installing

Chapter 1. Introduction

What is Kst?

Kst is a data plotting and viewing program. Some of the features include:

  • Robust plotting of live "streaming" data.

  • Powerful keyboard and mouse plot manipulation.

  • Powerful plugins and extensions support.

  • Large selection of built-in plotting and data manipulation functions, such as histograms, equations, and power spectra.

  • Color mapping and contour mapping capabilities for three-dimensional data.

  • Monitoring of events and notifications support.

  • Built-in filtering and curve fitting capabilities.

  • Convenient command-line interface.

  • Powerful graphical user interface.

Getting Started

There are two main methods of quickly obtaining plots in Kst. The Kst command-line interface provides quick access to the main Kst features, while the graphical data wizard enables intuitive fine tuning of plot and data settings.

We first need a data file. Copy and paste this simple 40-line set of data into a text file, and save it as simpledata.dat:

-20 100
-19 90.25
-18 81
-17 72.25
-16 64
-15 56.25
-14 49
-13 42.25
-12 36
-11 30.25
-10 25
-9 20.25
-8 16
-7 12.25
-6 9
-5 6.25
-4 4
-3 2.25
-2 1
-1 0.25
0 0
1 0.25
2 1
3 2.25
4 4
5 6.25
6 9
7 12.25
8 16
9 20.25
10 25
11 30.25
12 36
13 42.25
14 49
15 56.25
16 64
17 72.25
18 81
19 90.25
20 100

simpledata.dat is an example of an ASCII data file, one of the many file types Kst is capable of reading. For further details on file types, see Supported File Formats. To produce a simple plot using the first column (or “field”) of this file an x vector, and the second column as a y vector, enter the following:

kst -x 1 -y 2 simpledata.dat

Kst should start with the plot displayed:


Simpledata plot

Numerous other command-line options are available—using the command-line only, plots of data can be printed directly to files, and simple data manipulation such as creation of power spectra can be performed as well. For a complete list of command-line options, see Command Line Usage and Examples.

If Kst is started without any command-line options, a QuickStart dialog is shown by default:


The QuickStart dialog

The QuickStart dialog provides both a convenient facility for opening previously saved Kst sessions and a shortcut to the data wizard. To open an existing Kst session, either select a file from the Recent files list, or enter a path in the textbox underneath, and click Open File. Clicking the button to the right of the textbox displays a file browser dialog that can be used to graphically browse to a Kst file. If this is your first time using Kst, you most likely will not have any saved sessions. In this case, the data wizard can be used to quickly import data and produce plots. To start the data wizard, click the Data Wizard... button. The data wizard walks through specification of a data file, selection of fields, and selection of plot options. For detailed descriptions of the data wizard options and settings, refer to the Data Wizard section.

Tip

If you do not want the QuickStart dialog to be displayed at startup, simply uncheck Show this dialog at startup at the bottom of the QuickStart dialog. The QuickStart dialog can also be toggled by selecting Configure Kst... from the Settings menu and clicking on Show QuickStart dialog on startup.

Any plot displayed in Kst can be manipulated. For example, dragging a rectangle anywhere within a plot will zoom in to that section of the plot. Holding Ctrl or Shift while dragging will zoom in on the x or y axis only, respectively, and tapping the arrow keys scrolls a plot. See Working with Plots and Window for more details on manipulating plots and plot layout, as well as the different mouse modes.

Chapter 2. Working With Data

Supported File Formats

Currently, Kst supports ASCII text files, BOOMERANG frame files, and BLAST dirfile files as data sources, as well as PIOLib and FITS files with the appropriate libraries. This section describes basic data source concepts common to all file types, and specifically details the ASCII and BLAST dirfile file types.

Data Source Concepts

A data source in Kst is simply a supported data file. The following concepts are important in understanding how Kst works with different data sources. Some terminology is also introduced in this section.

Samples

A sample is considered to be the fundamental unit with respect to data files. Each sample consists of one data value in the file. Note, however, that one sample may not correspond to one value in a data vector in Kst, due to the concept of frames.

Fields

A field usually corresponds to one vector in Kst. For example, a column in an ASCII data file is considered to be one field. Each field can have an explicit or implicit name. Datasource readers provide functions for reading and obtaining fields and field names.

Frames

A frame corresponds to a set number of samples, and each field in a data file can have its own ratio of samples per frame. The size of a data file is measured by the number of frames it contains. For ASCII data files, the number of samples per frame is 1, but for some data files, there may be multiple samples per frame. In the below illustration, the first 3 frames of an imaginary data file are shown. In this particular data file, Field 1 has a ratio of 5 samples per frame, Field 2 has a ratio of 2 samples per frame, Field 3 has a ratio of 3 samples per frame, and Field 4 has a ratio of 1 sample per frame.

Depending on the specific data vector settings in Kst, data from files may be read as frames instead of samples, with either the first sample in a frame or the mean of all the samples in a frame representing the value of the frame.

INDEX Field

Some data files may not have a field that represents the x axis of a plot. However, Kst implicitly creates an INDEX field for all data sources. The INDEX field simply contains integers from 0 to N-1, where N is the number of frames in the data file.

ASCII Input Files

The simplest input file format is the ASCII text file. These files are usually human-readable and can be easily created by hand or simple scripts if desired. The following is an example of an ASCII input file.

112.5 3776 428
187.5 5380 429
262.5 5245 345
337.5 2942 184
412.5 1861 119
487.5 2424 138
567.5 2520 162
637.5 1868 144
712.5 1736 211
787.5 1736 211
862.5 2172 292
937.5 1174 377
1000.5 499 623

Each column of this file represents a field, while each row represents one frame. Columns are separated by tabs or spaces, and rows are separated by carriage returns. Note that due to their structure, ASCII files cannot have multiple samples per frame. Also, since the columns do not have labels, field names are assigned by Kst based on the order of the columns (the leftmost column has a field name of 1).

Commented lines in ASCII files start with one of the characters in the set {#, !, /, ;, c}. All commented lines and empty lines are ignored by Kst. Valid numbers include those with decimals, negative signs, or e, to indicate scientific notation. Invalid numbers (such as english words) are replaced with 0 by Kst.

BLAST Dirfiles

BLAST dirfile data sources are actually directories of files. Each directory represents one data source, and each file in the directory, with the exception of a file called format, represents a single field. The file named format lists each field and its properties. Below is example of such a file:

scount RAW f 1
fcount RAW f 20
sine RAW f 20
ssine RAW f 1
cos RAW f 20

In this example, scount, fcount, sine, ssine, and cos are field names. RAW indicates the file is written in raw format, and the last number in each row is the number of samples per frame.

When selecting a BLAST dirfile for use in Kst, the directory containing the field files should be selected. Kst will when automatically look for a format file, if it exists, to determine the fields and their properties.

The Data Wizard

The Data Wizard provides a quick and easy way of creating vectors, curves, power spectra, and plots in Kst from data files. To launch the wizard, select Data Wizard... from the Data menu. You will be prompted to select a data source. Browse to a valid data file (or enter in the path to a data file) and click Next. The following window will be displayed.


Data Wizard Screen 2

Select the fields you wish to import into Kst. You may filter the list of fields by entering a string to match (wildcards such as * are supported) into the text box above the list.

The Data Range section is used to specify the range of data to read from the selected vectors in the input file. The following discussion assumes knowledge of “frames”. For a detailed description of this concept, see File Formats.

Starting frame, Count from end, Number of frames, and Read to end

Using these four settings, the lower and upper boundaries of the data range can be set. For example, to read from frame 10 to frame 900, enter 10 for Starting frame and 890 for Number of frames. To read from frame 500 to the end of the file, enter 500 for Starting frame and select the Read to end option. To read only the last 450 frames from the file, select the Count from end option and enter 450 for Number of frames. The combinations used in the previous two examples are often useful for reading data from a file that is being updated in real time. Subsequent additions to the file are read, causing associated vectors to be updated as well.

Read 1 sample per N frames and Boxcar filter first

In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per N frames (where N is the entered value) is not selected, all samples in the selected range will be read. Alternatively, frames in the data file can be skipped by selecting Read 1 sample per N frames The value of the 1 sample that is used to represent a frame depends on whether or not Boxcar filter first is selected. If Boxcar filter first is not selected, the value is the same as the value of the 1st sample in the frame. If Boxcar filter first is selected, the value is the mean (average) of all the samples in that particular frame.

Power Spectrum and X axis settings can be specified within the Plot Types section. These settings are described below.

XY, Power Spectrum, and XY and Power Spectrum

Select whether to plot the power spectrum only, data (XY) only, or both. If the power spectrum is selected for plotting, additional settings in this section become available.

X Axis Vector

The vector to be used as the independent vector for the plots. You may select a field from your data file, or the INDEX vector. The INDEX vector is simply a vector containing elements from 0 to N-1, where N is the number of frames in the data file.

The FFT Options subsection in the Plot Types section is available only if a power spectrum is to be plotted. The below definitions assume basic knowledge of power spectra—for further details, refer to Numerical Recipes in C: The Art of Scientific Computing, published by Cambridge University Press.

Interleaved average and FFT Length

The power spectrum is defined as “the square root of the absolute value of the mean of the interleaved Fast Fourier Transforms of length 2^x”, where x is the value entered in the FFT Length selection box. Selecting Interleaved average allows the length of the interleaved Fast Fourier Transforms to be specified. If Interleaved average is unchecked, Kst will determine the length based on the length of the vector.

Data units and Rate units

The units specified in these textboxes are used for the purpose of auto-generating axes labels for the plots.

Sample rate

The sample rate is used to generate the X axis of power spectrum plots.

Appodize

If this option is selected, the data is appodized using a Hanning window, to reduce bin-to-bin leakage.

Remove Mean

Select this option to remove the mean from the selected data (i.e. translate the data so that the mean is zero).

Once you are satisfied with all the settings, click Next to advance to the next window. Select any filters you wish to apply to the data, and click Next to advance to the final window.


Data Wizard Screen 3

From here, you can change general plotting settings. Most of the settings are self-explanatory. A brief overview of each section is provided below.

Curve Style

Select whether to plot data points only, lines connecting the data points only, or both. By default, lines are continuous with weight 0, and data points are marked using crosses. Line and data point colours are chosen so that curves with identical colours are minimized. Note that the curve style settings apply to both Power Spectra and XY plots.

Curve Placement

Select the plots to place the new curves on. Cycle through distributes the curves on the plots by cycling through the plots. Note that the curve placement settings apply to both Power Spectra and XY plots.

Label Generation

Select the desired labels and legends to be placed on the plots.

Plot Placement

Select the desired window(s) to place the new plots on. New windows can be created for the plots by selecting In new window.

Once you are satisfied with all the settings, click Finish and the plots will be generated.

The Data Manager

The Data Manager provides a central location for adding, deleting, and modifying all the data objects used in Kst. It can be accessed by selecting Data Manager from the Data menu.

Creating New Data Objects

To create a new data object from the Data Manager, click on one of the buttons listed under New:. A new window will be displayed, allowing options and settings for the data object to be set.

Tip

You can also create new curves by right-clicking on a vector and choosing Make Curve...

Since you are creating a new data object, you may enter a unique name to identify the object. The default name can be used as well (if it is unique).

The settings for all plottable data objects except images have two common sections—Appearance and Placement (images only have the Placement section). These sections are described below. For data-specific settings, see Data Types.



Appearance

The Appearance section allows you to change the appearance of the data object when it is plotted.

Clicking this button displays a colour chooser dialog box, which can be used to change the colour of both the lines and points.

Show points

Selecting this checkbox shows the data points used to plot the data object. The drop-down list to the right allows the shape of the points to be changed.

Show lines

Selecting this checkbox shows the lines joining the data points for the data object. The thickness of the line as well as the line style can be changed.

Placement

The Placement section specifies the plotting location of new plottable data objects.

Plot window

Specify the window in which to plot the data object. You may create a new window by clicking the New... button.

Place in existing plot, Place in new plot and Do not place in any plot

You can choose whether or not to immediately plot the data object on a new or existing plot. If Place in new plot is selected, you can also choose to re-arrange the layout of the plots by selecting re-grid and entering the number of columns to use for the new layout grid.

Once all the desired settings for the new data object have been set, click the OK button to create the new data object.

Editing and Deleting Existing Data Objects

To edit an existing data object, simply highlight it in the Data Manager window and click the Edit button. The settings window for the selected object will be displayed. This window is identical to the one displayed when creating new data objects (with the exception that the Placement section may be absent), so refer to Creating New Data Objects for more information on the settings and options.

To delete a data object, highlight it in the Data Manager window and click the Delete button. Note that the entry in the # Used column for an object must be 0 before the object can be deleted. The # Used column indicates the number of times that a particular data object and its children (if any) are used by either other data object or by plots. Listed below are some consequences of this restriction to keep in mind when attempting to delete data objects.

  • All plottable objects (curves, equations, histograms, power spectra, and images) must be removed from plots before they can be deleted. An object can be removed from a plot by right-clicking on it in the Data Manager window and selecting the desired plot from the Remove From Plot submenu.

  • All data objects that use a particular data vector must be deleted before the data vector can be deleted.

  • All children of a parent data object must be unused before the parent data object can be deleted.

After a sequence of deletions and removals of plottable data objects from plots, you may find that there are numerous unused data objects displayed in the Data Manager. To quickly remove these objects, you can click the Purge button.

Data Types

There are nine main types of data objects in Kst. Data objects can contain other data objects, as represented by the tree structure view in the Data Manager. The following diagram illustrates the relationships between the different data types.

Kst Data Types

As can be seen from the above diagram, the curve, equation, histogram, power spectrum and image data objects are the only data objects that are plottable. All data objects (other than vectors) have the capability of using vectors, while equations, power spectra, events, and plugins all contain slave vectors.

Descriptions of each data type are provided below, along with overviews of the settings and options available when creating or editing each type of data object. Settings common to almost all data types have been omitted—see Creating New Data Objects for more information.

Vectors

Vectors are one of the most often-used data objects in Kst. As their name implies, vectors are simply ordered lists of numbers. Most often they contain the x or y coordinates of a set of data points.

As vectors can be potentially quite large, it is a good idea to be aware of the amount of memory Kst has allocated for use. The current available memory is displayed in the lower right corner of the status bar of the main Kst window.

Tip

If the status bar is not available, ensure that Show Statusbar is checked in the Settings menu.

The following is a screenshot of the window displayed when creating or editing vectors. Explanations of the settings are listed below.


Edit Vectors

Data Vector Parameters

The source file and field to read can be set using the following options.

File name

The path to the desired data file. Clicking the button to the right displays a file browser window that can be used to graphically browse to the file.

Field or column

The field or column to create a vector from.

Data Range

This section specifies the range of data to use from the selected field for the data vector.

Starting frame, Count from end, Number of frames, and Read to end

Using these four settings, the lower and upper boundaries of the data range can be set. For example, to read from frame 10 to frame 900, enter 10 for Starting frame and 890 for Number of frames. To read from frame 500 to the end of the file, enter 500 for Starting frame and select the Read to end option. To read only the last 450 frames from the file, select the Count from end option and enter 450 for Number of frames. The combinations used in the previous two examples are often useful for reading data from a file that is being updated in real time. Subsequent additions to the file are read, causing associated vectors to be updated as well.

Read 1 sample per and Boxcar filter first

In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per is not selected, all samples in the selected range will be read. If Read 1 sample per is selected, only 1 sample per N frames will be read, where N is the number entered in selection box to the right. The value of the 1 sample that is used to represent a frame depends on whether or not Boxcar filter first is selected. If Boxcar filter first is not selected, the value is the same as the value of the 1st sample in the frame. If Boxcar filter first is selected, the value is the mean (average) of all the samples in that particular frame.

Curves

Curves are primarily used to create plottable objects from vectors. Curves are created from two vectors - an “X axis vector” and a “Y axis vector”, that presumably provide a set of data points. Thus, a curve can be thought of as a set of data points and the lines that connect them (even though the points or lines may not be visible on plots).

The following is a screenshot of the window displayed when creating or editing curves. Explanations of the settings are listed below.


Edit Curves

Curve Contents

The contents of the curve can be set from this section.

X axis vector

The vector to use for the independent (horizontal) axis.

Y axis vector

The vector to use for the dependent (vertical) axis.

X error bar and Y error bar

The vectors containing error values corresponding to the X axis vector and Y axis vector, respectively. The vectors should contain the sizes of the error bars in the same order as the data points.

Equations

An equation data object consists of a mathematical expression and an independent variable. The expression is built using a combination of scalars, vectors, and operators, and usually represents the values of the dependent variable. The independent variable can be an existing vector or it can be generated when the equation object is created or edited. Since an equation ultimately consists of a set of data points, an equation object is plottable.

The following is a screenshot of the window displayed when creating or editing equations. Explanations of the settings are listed below.


Edit Equation

Equation

The mathematical expression representing the dependent variable can be modified from this section.

Operators

A list of available operators. Choosing an operator from the list inserts the operator at the current insertion point in the Equation text box.

Vectors

A list of the current vector objects in Kst. Choosing a vector from the list inserts the vector at the current insertion point in the Equation text box.

Scalars

A list of the available scalar values. This list is composed of both the scalar values in the current Kst session as well as some built-in constants. Choosing a scalar from the list inserts the scalar at the current insertion point in the Equation text box.

Equation

The mathematical expression representing the independent variable. You may manually type in this text box or you may select items to insert using the above drop-down lists.

Independent Variable

This section is used to specify the source of the values for the independent variable.

Use

Select this option to use an existing vector as the independent variable. Select a vector from the drop-down list, or quickly create a new one by clicking the button to the right.

Interpolate to highest resolution vector

Selecting this option interpolates the selected vector to the greatest number of samples possible.

Generate

Select this to generate a set of values to use as the independent variable. Specify the lowest value to generate in the From field, and the highest value to generate in the to field. Set the value for Number of samples to be the number of equally spaced values to generate between the lowest value and the highest value (inclusive).

Histograms

A histogram data object simply represents a histogram of a particular vector. Histogram objects are plottable.

The following is a screenshot of the window displayed when creating or editing histograms. Explanations of the settings are listed below.


Edit Equation

Histogram Properties

The source vector, as well as basic histogram properties, can be modified from this section. You can either manually specify settings or use the Auto Bin button.

Data vector

The data vector to create the histogram from. Although a vector is needed to create a histogram, the vector is treated as an unordered set for the purposes of creating a histogram.

From and to

The From field contains the left bound for the leftmost bin in the histogram. The to field contains the right bound for the rightmost bin in the histogram.

Num bins

Enter the total number of bins to use in the Num bins field.

Auto Bin

Instead of specifying values for From, to, and Num bins, you can click Auto Bin to automatically generate values for all three fields based based on the lowest and highest values, as well as the number of elements found in the source vector.

Y Axis Normalization

This section is used to specify the type of normalization used for the y axis of the histogram.

Number in bin

Selecting this option causes the y axis to represent the number of elements in each bin.

Fraction in bin

Selecting this option causes the y axis to represent the fraction of elements in each bin out of the total number of elements.

Percent in bin

Selecting this option causes the y axis to represent the percentage of elements (out of the total number of elements) in each bin.

Peak bin = 1.0

Selecting this option causes the y axis to represent the number of elements in each bin divided by the number of elements in the largest bin (the bin with the greatest number of elements). In other words, the y axis is normalized to 1.0.

Power Spectra

A power spectrum data object represents the power spectrum of a vector, defined as “the square root of the absolute value of the mean of the interleaved Fast Fourier Transforms of length 2^x of the vector”, where x is the value entered in the FFT Length selection box. The below definitions assume basic knowledge of power spectra—for further details, refer to Numerical Recipes in C: The Art of Scientific Computing, published by Cambridge University Press.


Power Spectra Window

Curve Contents

The source vector, as well as basic power spectrum properties, can be modified from this section.

Data vector

The data vector to create a power spectrum from.

Interleaved average and FFT Length

Selecting Interleaved average allows the length of the interleaved Fast Fourier Transforms to be specified. The length is specified as a power of 2. If Interleaved average is unchecked, Kst will determine the length based on the length of the vector.

Data units and Rate units

The units specified in these textboxes are used for the purpose of auto-generating axes labels for the plots.

Sample rate

The sample rate is used to generate the X axis of power spectrum plots.

Appodize

If this option is selected, the data is appodized using a Hanning window, to reduce bin-to-bin leakage.

Remove Mean

Select this option to remove the mean from the selected data (i.e. translate the data so that the mean is zero).

Plugins

A plugin data object represents a Kst plugin. All plugins have a common format, and show up as type “Plugin” in the Data Manager. For more information about plugins, please see Plugins and Filters

Event Monitors

An event monitor data object represents an instance of an event monitor. For more information on monitoring of events, see Event Monitoring.

Matrices

A matrix represents a set of three-dimensional data points (x, y, z) arranged in a two-dimensional grid. The z values of the matrix are obtained from a vector, and the grid structure is manually specified using the Edit or New Matrix dialog. The descriptions below refer to the following diagram depicting Kst's matrix structure.

A screenshot and explanation of the matrix dialog follow.


Matrix Window

Vector Selection

Z Vector

The data vector to obtain the z values from.

Grid Parameters

X Minimum and Y Minimum

The origin of the matrix is specified by the coordinates (X Minimum, Y Minimum). The location of the origin is represented by a red circle in the above diagram.

X Step Size and Y Step Size

These two values specify the dimensions of each rectangular cell in the matrix grid. All cells in the matrix have identical dimensions.

Dimensions and Use maximum x length

Enter the number of steps for the x dimension of the matrix, followed by the number of steps for the y dimension of the matrix. If Use maximum x length is checked, the x dimension of the matrix will be determined based on the length of the vector and the entered y dimension. If this option is checked and the length of the vector subsequently changes, the x dimension of the matrix will be updated accordingly.

Note that the minimum allowed y dimension is 1, while the minimum allowed x dimension is 0.

Images

Images are graphical representations of Matrices. Images can be plotted as color maps, contour maps, or both.


Image Window

Matrix Selection

Matrix

Select the matrix to use for this image. New matrices can be created by clicking on the button to the right.

Image Type

Color Map, Contour Map, and Color Map and Contour Map

Select the type of image to be plotted. Changing this selection enables or disables sections of the image dialog as appropriate.

Color Map Parameters

A color map represents the z value of each cell in the matrix using a color. This section is only available if Color Map or Color Map and Contour Map is selected under Image Type.

Color palette

Select the color palette to use for the color map. By default, two palettes suitable for color maps are installed by Kst—Kst Grayscale 256 (a 256 color grayscale palette) and Kst Spectrum 1021 (a 1021 color rainbow spectrum that ranges from blue to red). Additional palettes can be installed by simply copying GIMP compatible palette files to the colors subdirectory of the user configuration directory (for example, /usr/share/config/colors/). Note that saved images using a non-default palette may not be viewable by other users of Kst if they do not have the required palette. In such cases, a default grayscale palette is used instead.

Lower Z threshold, Upper Z threshold and Auto Threshold

Enter the lower and upper thresholds to use for the mapping of colors. Palette colors are evenly distributed between Lower Z threshold and Upper Z threshold. Any cells in the selected matrix with z values less than Lower Z threshold are mapped to the first color in the palette. Any cells in the selected matrix with z values greater than Upper Z threshold are mapped to the last color in the palette. Clicking Auto Threshold will fill in the lower and upper threshold values using the least and greatest z values found in the selected matrix.

Contour Map Parameters

A contour map draws a set of lines, with each line representing a certain z value. This section is only available if Contour Map or Color Map and Contour Map is selected under Image Type.

Number of contour levels

Select the number of contour levels to use. The contour levels will be distributed evenly between the lowest and highest z values found in the matrix.

Color

Select the color to use for the contour lines. Clicking this button displays a standard KDE color chooser dialog.

Weight and Use variable line weight

Select the weight, or “thickness” of the contour lines. If Use variable line weight is selected, contour lines representing higher elevations are drawn thicker than those representing lower elevations. Use discretion when selecting this option, as images with high contour line densities may become unreadable.

The Data Menu

The Data menu provides quick access to many features related to data objects in Kst. Most of the menu functions duplicate functions found elsewhere, so only brief descriptions are provided below.

Reload

Reloads all data vectors from their source files.

Data Wizard...

Displays the Data Wizard.

Data Manager

Displays the Data Manager.

New [data object]

Displays the corresponding dialog for creating the data object. Refer to Data Types for descriptions of each dialog.

View Scalars

Displays a dialog from which the values of all the scalars in the current Kst session can be viewed. The dialog is updated dynamically if the values change.

View Vectors

Displays a dialog from which the values in all the current vectors can be viewed. Select a vector to view using the drop-down list. The dialog is updated dynamically if the values change.

View Fit Results

Displays a dialog which shows all the resulting values from performed fits. Select a fit result to view using the drop-down list. The dialog is updated dynamically if the values change.

Change Data File

Displays a dialog for quickly changing data files that vectors are associated with. Select the vectors to change, and then browse to a different data file. Click Apply to save the changes.

Chapter 3. Working with Plots and Windows

This chapter details the concepts behind plots and windows, and provides information on viewing and manipulating the layout of plots and windows in Kst. The following diagram illustrates the relationships between windows, plots, and plottable data objects.

Kst Window, Plot, and Curve relationships

As can be seen from the above diagram, each window in Kst can contain zero or more plots, and each plot can contain zero or more plottable data objects.

The Plot Dialog

The plot dialog provides a central location for managing plots. To access it, select Edit Plots from the Plots menu. At the top of the dialog box you should see two drop-down lists:


Top of Plot Dialog

To modify a plot, select the window that contains the plot from the left drop-down list, and select the plot itself from the right drop-down list. New windows can be created by clicking the button in the middle.

At the bottom of the plot dialog are four buttons. Delete deletes the currently selected plot, Apply as New applies the current plot settings to a new plot, Apply Edits applies the plot settings to the currently selected plot, and Close closes the plot dialog without applying or saving any settings.

The plot settings available on each tab of the plot dialog are described below.

Content

Below is a screenshot of the Content tab.


Plot Dialog Content Tab

As the name implies, the settings on this tab specify the content of the plot. The following are brief explanations of the settings.

Unique plot name

The unique plot name is the identifier for the plot. There cannot be duplicate plot names.

Displayed objects and Available objects

Displayed objects lists the plottable data objects that should be plotted in the plot. Available objects lists all the current plottable data objects in Kst that are not in the Displayed objects list. To move an item from one list to the other, first highlight the desired item, and click the appropriate arrow button in between the two lists (the left arrow to move a item from Available objects to Displayed objects, and the right arrow to move a item from Displayed objects to Available objects). Alternatively, dragging and dropping the items works as well.

Foreground and background colors

Select the foreground and background colors to use for this plot using the standard KDE color chooser. The upper left box indicates the foreground colour, while the lower right box indicates the background colour. To edit a colour, double-click on the desired box, and a standard colour chooser dialog will appear. Click to swap the foreground and background colours. If you wish to quickly switch to a white background and black foreground, click Note that the foreground color only affects the axes lines and axes labels, and is independent of any colors used to plot data objects.

Re-grid and Columns

Check the Re-grid option to rearrange all plots in the selected window in a grid pattern with the specified number of columns.

Axes

Below is a screenshot of the Axes tab.


Plot Dialog Axes Tab

The settings for the plot axes are specified on this tab. The axis settings are split into two identical sections—an x axis section and a y axis section.

Auto scale

Select this option to let Kst automatically choose a scale for this axis based on the highest and lowest values for this axis found in the plotted objects.

Auto up

This option behaves similarly to Auto Scale, but the upper axis limit will only increase, and the lower axis limit will only decrease.

Spike Insensitive Auto scale

Select this option to let Kst automatically choose a scale for this axis that is based on the values found in the plotted objects. In general, “spikes”, or sudden short increases or decreases in the value, will be ignored when determining the scale.

Mean-centered

Select this option to center the axis around the mean of the values found in the plot (x values are used to calculate the mean for the x axis, and y values are used to calculate the mean for the y axis). Specify the length of the axis in the Range text box.

Fixed

Manually specify lower and upper limits for the axis. Enter the limits in the textboxes to the right of Range.

Logarithmic

Enable this checkbox if you wish to use a logarithmic scale for the axis.

Major tick density, Minor ticks, and Auto minor

Change the density value for the major ticks on this axis by using the Major tick density field. The number of major ticks on the axis will be approximately equal to the density value, with slight variations depending on the plot size and zoom level. Select the number of minor ticks to show in between major ticks using the Minor ticks field. If Auto minor is checked, the number of minor ticks is automatically determined based on zoom level.

In addition to axis ticks, grid lines can be shown on plots as well. Grid lines are drawn as thin dotted lines using the specified colors.

Show major

Select X major to show vertical grid lines corresponding to the x axis major tick marks. Select Y major to show horizontal grid lines corresponding to the y axis major tick marks. The color of both types of major lines can be specified by clicking the button next to Color.

Show minor

Select X minor to show vertical grid lines corresponding to the x axis minor tick marks. Select Y minor to show horizontal grid lines corresponding to the y axis minor tick marks. The color of both types of minor lines can be specified by clicking the button next to Color.

Labels

Below is a screenshot of the Labels tab.


Plot Dialog Labels Tab

Settings for the plot labels can be specified on this tab. Brief descriptions of the settings are provided below.

Current scalar list

A list of the current scalars defined in Kst. This list is primarily used to quickly insert values in the label texts. Choosing an item from this list will insert the item at the current text cursor position.

Top label

The label located at the top of the plot. Select a font size and enter the text for the label using the controls in this row.

Y axis

The label located vertically next to the y axis of the plot. Select a font size and enter the text for the label using the controls in this row.

X axis

The label located vertically next to the x axis of the plot. Select a font size and enter the text for the label using the controls in this row.

Numbers, X angle and Y angle

The numbers used to label both the x axis and the y axis of the plot. The size and angles of the numbers can be specified. Positive angles rotate the text clockwise, while negative angles rotate the text counter-clockwise.

Font family

The font used for all labels of the plot. Select an available font using the drop-down list.

Also Apply Font and Angle Settings To

Select the plots to which the specified label settings (except Label Text) should be applied.

Note

If All other plots or All other plots in this window is selected, previous label settings for the affected plots will be lost.

Auto Label

Click this button to automatically generate label texts for all labels on the plot. The text for Top label will be a list of paths to the data files used in the plot. The text for Y axis will be a list of the dependent variable descriptions (e.g. “Number in Bin” for a histogram). The text for X axis will be the name of the vector used as the independent variable.

Labels (preview)

The preview image at the bottom of the Labels tab provides previews of all four labels at 100% zoom.

Legend

Below is a screenshot of the Legend tab.


Plot Dialog Legend Tab

Legend settings for the plot can be specified on this tab; most of these settings concern the appearance of the legend. The legend itself is optional.

Show legend

This option enables or disables the legend for the plot. If you wish to use a legend, you must select this checkbox.

Display in legend box

Select this option to display a border around the legend. Selecting this option also allows the background of the legend to be set using the color chooser located on this tab.

Alignment

The horizontal (left and right) alignment of the items in the legend. The available settings in the drop-down list are Right, Center, and Left.

Font family

The font to use for the legend text. Select a font from the drop-down list.

Font size

The size of the legend text. Note that the size is not specified in points, but is relative to a default size of 0.

Colors

This widget can be used to specify the colour of the legend text. The upper left box indicates the foreground colour, while the lower right box indicates the background colour (applicable only if Display in legend box is checked). To edit a colour, double-click on the desired box, and a standard colour chooser dialog will appear. Click to swap the foreground and background colours. If you wish to quickly return to the default colours, click

Also Apply Settings To

Select the plots to which the specified legend settings should be applied.

Note

If All other plots or All other plots in this window is selected, previous legend settings for the affected plots will be lost.

Legend (preview)

The image at the bottom of this tab provides a preview of the legend text at 100% zoom. Among other things, the preview can be useful in determining appropriate font sizes.

Markers

Below is a screenshot of the Markers tab.


Plot Dialog Markers Tab

Plot markers provide an easy means of flagging areas of interest on a plot. The Markers tab provides full access to plot marker settings and options. Navigation functions for plot markers are described in the Scroll Menu section.

Tip

To quickly create plot markers on a plot, place the mouse cursor over the plot and press the Insert key. A vertical dashed line should appear indicating the position of the plot marker.

New and Add

Use the New text field to manually enter a plot marker value. Values can be entered in floating point or scientific notation. Values in scientific notation must be entered in the form mEx or mex, where m is the mantissa and x is the exponent. For example, one way to enter the value 15000 in scientific notation is by typing 1.5e4.

Click the Add button to create a new plot marker with the specified value. You will be warned if duplicate plot markers already exist, or if the entered value is not valid. Note that plot marker additions or removals made from the Markers tab are not applied unless the plot dialog settings are applied.

Defined plot markers, Remove, and Remove All

The list of existing plot markers for this plot are listed under Defined plot markers. To remove plot markers, highlight the desired markers in the list and click the Remove button. Multiple markers can be selected for removal by clicking and dragging within the list, or by holding down the Shift or Ctrl key and clicking on items in the list. To remove all plot markers for this plot, click the Remove All button. Note that plot marker additions or removals made from the Markers tab are not applied unless the plot dialog settings are applied.

Automatic Marker Generation

In addition to individually defining plot markers, curves, equations, power spectra, and histograms can be used to automatically generate plot markers as well. To use one of these data objects for plot marker generation, check the Use data object as marker source checkbox and select an item from the drop down list. Then select the criteria to use for creating plot markers. Selecting Rising edge causes plot markers to be created when the y value of the selected data object changes from zero to non-zero. Selecting Falling edge causes plot markers to be created when the y value of the selected data object changes from non-zero to zero. Selecting Both causes plot markers to be created on both rising edges and falling edges of the data object. In all cases, the x value of the point in the data object with the non-zero y value is used to create the new plot marker.

If the selected data object is subsequently updated, additional plot markers will be created if necessary. However, plot markers will never be removed as a consequence of data object changes, so manually created plot markers will never be affected.

The Plot Context Menu

When working with plots, right-clicking on any plot will bring up a context menu that provides commonly used functions. The following list provides a brief overview of the menu items, often referring to other sections of this document that describe the functions in more detail.

Delete

Deletes the plot.

Edit...

Brings up the Plot Dialog, with this plot selected. See the Plot Dialog section for information on the settings.

Maximize

Expands the plot so that it takes up the entire area of the window. Uncheck this option to return the plot to its previous size.

Pause

Pauses automatic update of live data. This menu item duplicates the functionality of Pause from the Range menu. See Working with Live Data for more information.

Zoom (submenu)

The Zoom submenu is described in the section entitled The Zoom Menu.

Scroll (submenu)

This menu is described in the section entitled The Scroll Menu.

Edit (submenu)

This submenu displays a list of objects available for editing. Clicking on an object name from the submenu displays the Edit dialog for the object. Details on this dialog are available in the Curves.

Fit (submenu)

This submenu displays a list of curves, histograms, power spectra, and equations that can be fit. Selecting a name from the submenu displays the Fit Function dialog. This dialog is similar to the plugins dialog, but displays only those plugins that perform fits. The input vectors are selected based on the data object. In addition, curve appearance properties can be changed, as the Fit function creates vectors, and curves based on the vectors.

Filter (submenu)

This submenu displays a list of data objects that can be filtered. Selecting a name from the submenu displays the Filter Function dialog. This dialog is similar to the plugins dialog, but displays only those plugins that perform filtering. The input vector to be filtered is selected based on the curve. In addition, curve appearance properties can be changed, as the Filter function creates vectors, and curves based on the vectors.

Remove (submenu)

This submenu displays a list of curves currently in the plot. Clicking on a curve name from the submenu removes the curve from the plot (the curve itself, however, is not removed as a data object).

The Label Editor

The label editor allows custom labels to be placed in arbitrary locations in Kst plot windows, in addition to the fixed labels created as part of plots. To use the label editor, select Label Editor from the Plots menu. The mouse mode will change to label editor mode. To exit label editor mode, select another mouse mode (such as XY Mouse Zoom). The following sections describe the functions available when in label editor mode.

Creating New Labels

To create a new label using the label editor, click anywhere within the x and y axes of a plot where there is not already an existing label. The label editor dialog should appear:



The following are explanations of the dialog box elements.

Scalars

A list of scalars currently defined in Kst. Selecting an item from the dropdown list inserts the value of the item at the current cursor position in Label text.

Label text

The text displayed by the label. You may enter text manually in this dialog and in combination with scalars selected from the Scalars dropdown list if you wish.

Font

The font to use for the label text. Select a font from the dropdown list.

Size

The size of the label text. 0 is the default value.

Rotation

The number of degrees to rotate the label. Positive values rotate the label clockwise, while negative values rotate the label counter-clockwise.

Alignment

The horizontal alignment of the label. Select one of Left, Center, or Right.

Color

Select the color to use for the label text. Clicking the button displays the standard KDE color chooser. Selecting Use plot color uses the foreground color specified for the plot.

Once you are satisfied with the label settings, click Apply to apply the label settings without closing the label editor dialog. Click OK to apply the label settings and close the dialog. Alternatively, you can click Close to close the label editor dialog without applying any label settings.

Editing and Deleting Existing Labels

To edit an existing label, click on the label in the plot. The label editor dialog should be displayed. You can delete the label from the label editor dialog by clicking the Delete button.

Moving Labels

To move an existing label in label editor mode, simply drag the label to the desired location, anywhere within the plot.

Data Mode

Data mode allows precise viewing of the data points use in a plotted data object. To toggle data mode, select Data Mode from the Plots menu. Now, when the cursor is moved over a plot, a coloured dot will indicate the closest data point to the cursor, as shown in the screenshot below. The status bar will display the coordinates of the data point (in terms of the x and y vectors used to plot the data object) in status bar at the lower right corner of the Kst window. The status bar will also display the x, y, and z coordinates of any visible image. If images overlap, only the coordinates of the topmost image will be displayed. Note that all zooming functions are still available while in data mode.


Top of Plot Dialog

Tip

If the status bar is not visible, make sure Show Statusbar is checked in the Status menu.

Zooming and Scrolling

Zooming and scrolling in plots is easy and intuitive with Kst. The following sections explain the different zooming and scrolling modes.

Mouse Zoom Modes

To access the different zoom modes, choose one of XY Mouse Zoom, X Mouse Zoom, or Y Mouse Zoom from the Plots menu. The different modes are described below.

XY Mouse Zoom

In XY Mouse Zoom mode, you can zoom into a specific rectangular area of the plot by simply clicking and dragging to draw a rectangle where desired. The x and y axes of the plot will change to reflect the new scale. This mode is often useful for quickly looking at an interesting area of the plot without having to specify exact axis scales.

X Mouse Zoom

In X Mouse Zoom mode, the y axis is fixed. Zooming in is performed by clicking and dragging a rectangular area; however, the upper and lower limits of the rectangle will always be equal to the current upper and lower limits of the y axis. This mode is often useful for looking at a certain time range, if the x axis happens to represent a time vector.

Tip

You can quickly switch to X Mouse Zoom mode by holding down Ctrl. The mouse cursor will change to indicate the new mode. Releasing Ctrl will return you to the previous mouse zoom mode.

Y Mouse Zoom

In Y Mouse Zoom mode, the x axis is fixed. Zooming in is performed by clicking and dragging a rectangular area; however, the left and right limits of the rectangle will always be equal to the current left and right limits of the x axis. This mode is often useful for zooming in on data that is concentrated around a horizontal line.

Tip

You can quickly switch to Y Mouse Zoom mode by holding down Shift. The mouse cursor will change to indicate the new mode. Releasing Shift will return you to the previous mouse zoom mode.

The Zoom Menu

The Zoom menu can be accessed by right-clicking on a plot and selecting the Zoom submenu from the context menu. A list of zoom actions and their corresponding keyboard shortcuts will be displayed. These actions are described below.

ndZ$!ԥ4֫1SMdgF}^usÀV07Ը/!3ez(3ffõKMҧM?!DBWK1,+"Ӂ4E֬u_BYH-0TxhEB.)ȿ=U뾄B s3 ! lb y"i$= F״!t1IH!v !PY;!^"jtnz}a;ٺi@LdONq\H!H/B /;4:0H!Bd|S뎄B7ٲ:8Zw"B!PπH!tIDyB!gdz2w^@OvsKO!4,0 ^ \nҹB#ۃ_~8} !.RYǹ=>jB/2/~He 6S-:B!.4jݟ6DXhބB$ jf_ֺ?!ԛ! WxfcjџPIs5O40rw𭙽[ӎz=3!PA !&Qsc3w]IzBIJڹ_HZ[$/$iIָk!8c'I׺/!2* !z uG MO0ls8Elܥρ5S OltA $zIHZ4!^T<6RVe*yՁ jݑB4071/JaYHCu?zpBf0?!pEaa:Y_¼lf IZ/ `Z`}]JG)=/M:==!`]I:RIo|Q`I_*$ :³.?M{=YkG9x3Э~B !*II2IԺ/@! l.,5Q>p4y2x 8x8JzTfk$=#i@IC$\^Kg$](IgKZ0@Ityz9D*N۬"i7IHU4_nMI,NI.'闒j%2y q{ jEGRG1 R 265Ϲ:9A7j~R뎄B(Y!;!^%2w:p#cZ+ϔ4X X>HAƴfx`Ik+S//YKZpqElKIiS$,+)<X:-$iNMx% 2OSI<܁ K\z aittZ*i  #igTXYx8=KV3)0gz'}Y88̾7Tfk3^cAIӛHf afYێv‡v2u3lefgC~yo;<`D?) I 62U[S׼:i ?ShL`g 4$0|*;p^g/<x@ᆲMLYa;uiEQx7j t>Dp-`=`eIٷS٧P#f6*ۑ[`3t+B Ȣ !6 #iIGHzOuG?f^`k|&еW`:*3;̎NnMw%pqqJqvOGcf̶0l;Tw%|8ǜ˒io`Q<3(InFf6|yBSPϒhJ0"iI/T Jd}|R>KEJCf' h?tC,@x؃@ `w ܜPyM32 C{ {B%u{ t_q"*?.BtoqbHVj̝?OćNdRVHY&?!]@ҜB’6oӬNwGH|91a )~}97kC 3HZ~OmXV{Bv_5%K5xN32$pJlpr$[ *%hu$=S)-_&-+ *fJL?Ge>~;s\|!iW5`gixܾ6 2=?LIg'3ی^ӇffY~6il-> TxFǥBS5?~Ni|fv]܀y%%!i:ai<t5w|(I?vK5m6N(/ bYڱ9^]3qN3^ƃ)A`rI* ½ IDAT }% @ fYq$ ^nNOX/40IgCI-* _:{ǥ֋ag,DILCيj⼕'pm{ ^h)<X8H>+i'Am&3ViBv/`~jsSÇ.&i!z!A̝B}dpT|P&/ `fT4+B "dzY&X3։f?n뙄z/ćz>RT 9[ee f:Rq)B:u niBF" iS|Ax'L8eK !4}Z#o&i$DIOǥGe!}g4ƇgnWhsǁ?\ V*LPC!2f6v26 :x8wBRV|&B Rap>Qd4ٵمB.׼x*~E?!ꗤÁV]U^W! ̖YW.BkάGOZ7.aZ^M*&Ϙ)[פ"cZFI9|R#'Z&HEJY˩IJaf-mWgUڄ_i*qۯӶցj>+[) xެôcf-J}_:^j XSć€ZOۮQ}Fj틿Zg֢}ȬJ΀ZMۮY>:%n=0̬e:6g^~Ƙ:/LYu9A)&:RjU%n; ZM-qπҾ΍ϘWZZ_(YGY>B3{_L | aB5T',Gx'g6 aĴ ɟ)$`4p)r2~px\ QIfnx`ױ> ;M`S|_+s+⨥dn7q<H:X|,|ZrjcRY⿟ہr܆4m@=r}n/s{Bﳔ?bAт_;۔ݗ`2}ɯĖ)?-,v,tYwKR6ٷ.Sꕤ- fEB]Swr}xc8̶/'`KObf`ۻ *|/0a<[\RQjY0zS#@MXY_KW=/*j#|=VR=,__ݤN2] k,~E 8 U+& T#}m\t_'gばr}mN`;}-+-`o#o^%6 mG| nzoێ3>`Ҷ+Vکc\g]0I%[g驁Bgf68(;!ުQj`f 4S@3{M5f-OJAR3Z&| mOuhVïT:CfRxF[O K0nLJ,b"pY˻Rp`CJ6 άTg-J׏R͝O0sf-Ja֒1Nև!V GoҾCCR͝LRER)!҇nHuhVZJ_mIC3KWZZR4pY˫R-R3Ʀ~jkGÆFRZ򔾯ܓ7=/$^k7|3~|#_:Fj]X/Derg0B-,I}-IK |bfgv+^5k)l!:']mvSN}qi /J,𕙝^VM !İzUϙ;WJ 25kww,B#̮ $͈ڃKbB!Bέf6Qxdï$mDeaC!$73[3]Aϩw!B^tv7>[I>dҰJBЖMOW>J&=߄k߾hYs>?4J:΢㳈B!P5u)/>̳مe%N"@iŔCrMx1mIg-@ \_ߏmO6qJp0YNB!BPw>2QSAfV4Ow3PBKY6  us`mz#gI TcFǙlhg_$B!F \<<I_B?Tm0Jh`t g{BU֖F_3_Nn0a&X`Oi:l0p_/}}ff&?NK'#i h́Sn$ίV!Pet"93,=F^y !ԇ\NS6[r /J<=VX}H{\4[!RTsJ73t24~934=)pi% &T 4=p2*<'3{;=ϒ[x8 c;?73{=h\̮MY-N4ڍKx# ö$X|`ff( `ngrgJ>=F{> m cffbG3FR!lf{Î?Iۚ͒bϒ.L#!P3 x?}@BTxYjک}|^t+^=q| \.왡?<@ߙN[G>~\B~)X1 Mt pCex&>߀ÏLJD~zxmQ3QD]zМN:J)v3fǧOBEǛ0ٛrx2$}Rv1g6wB pMH@n4Jm<*ie`_<𠤵 /~<}dfWh@,iL fgZaS`|ƴc9l0Iw٫L%Uϝ$O- efvgffINJCۤ^ afo2xw;8xJf;>4o><呴ϟMeBa"l nfJ}/-[X,8x |ܜGHm?Gҩf6J/ }?d$07ARH*UfO~O4e֙UQVE7df#R&xa/ddiӾ#f6,e6%>> 5_ho')6Aq2ixV}5~(lfIzt~4e@Om3c RMAf1FmxfI{p3f51exebbH:N+] i(s"BF 4㟋-A!9?SS^ă8`s|F&vq))2Y t7>ÌE!/{Cg?aIIz<26dRfɏYVxHX7i;i4=SxO*D}!g;=-0tXP9 E~鹙C[ ͣ ?LQ8'f/e/5s4v<8R (D}g8̏L>Bcy~< pvAgKWHwnΕt ^s1IƇjSӞV[.8#V3[}|.s{9 k-?YD>~x&B!C>??INNO<#ɮ3(4ѩÁgA-7GJ?!XJҪxas?CsJ}GlPCŽIk7ç?  Ҏ]!fMAC`O 5>gL6+aY72u~3ُLbIE# Wkf%:pK)U2'ϑ4 ٧l¬cE>&e-_h)~c45 ]6V_~ "cf7f3&ſ !mLǝTë;.jkV<֯sf| lg\hnu73^ |yfX*'0 ت8&e[m^L] 7 ̦xЍ|f6*O5/l4#^<7 X$?D[.K3b.|!| XQ!e7sit{V!)gzIk۝Ә8fCW77TP;Ǘ]mOJ_O O˿Hp8pN3BaR`pZ#JU`EL%ofOװ_!-[/v8}|~T=M^ kEN!BznY=>B\n^o@3>Jg}\\ԜB{w5ݲKGwS_B!B/Q#me`t-Еrds\ iC' I٨f !B ;/7 9 R@r&`/H`N6ڀ|թT |lf_w)qB!JU3 :B-'^3No?tB+|Xߔq-B!NhVă1wW!B<d IDAT!i}Y/Brppz89Pz%K*/6pY˛Rk_`sW^{<*+ef-owQ{[ɢڴ~!6[7LlzNbY AjmLZveBrKvӫHљEWlSt!zEl~ZVBS_ 'n:=/˭Un`^B^ڻ@;ͬe*^7DO3,&:sG,|flGSЭri4wUc!TZ%LԺ AuN륽E{jL8fΡ:'^;vioWh) V6#i`e/7{`w/>ʲ;B([[.S|\֜GlVj hܩVWq@S{ OU7NyU^r{*Pukj8) !Jwiw 7WA{2~Dp'.ՖMς7J۟֜Gh1R3 i;%n`W~\:J] ׌xfb5; Sm`:hWlaA0h*7lo(=@=R{  %gۚ;.3 o 0(=|լe;B\nx-rŇ9 Ժp>pYT/tk_LaeȪuJΏI[ <ÀlvUz%բdx%S{~I8v O. zѬexWRh4ϛ3ykٷrB囔3s,ӜY0I8R0 H92#m)]lg᰻z+3{Zn{[H:ERqC!*k `t.p勖 u@j]%RؽF كx͒S%-#w5V!4F l=s!i3Vs>ҜϏzBZvFtoWB',β!13{̾ǒJZ] !ү '%m|,i)r5YX[. p7Y!ԋ6`mo5$-LKB= iQ3Q?YҦfv[B!2w[`5k` p }V˾[rP^`{`|zffK3+'[!Ԋf _Rm=E sc5JijCkݏr?ӗk]ӫ} V~BOcf/H'l[!g<~8B;IH&N!-;7F`'4IH:=tejݯBavIt\;>ds|VÀMj۝!;=xbJje_;rJd"7% 0I qڜx:zNS(òef;dJ:g,ça!LE[.p&m^P3d3fI: cMzB=uZ};%ofqB/E$p"^?/Q"}Y~TA{v_! m!ٔRvB5/}\jBx3{ xBlXxu$4V-,4عQ?)hN(cwK!tYX̢4s= qOL>7B3X 8H VqBŘދJTò$&hA+IOéV>/q5r;ǕMV.Rղ; 5k9 $~+X)i8+=n!43 i ``(z K/3)zfդw!4\elr9cs>?B5Vj}¬Yx K%BhPf6Df?mw1jݷBI9p} ~BT5reYJl;ػ9vIJjZxsfp}qۚE;WxBHFոS!k+8%Bj.R`'#|PEmܼxf܌%nr|s>WvB?f(e#3lJ8.՝ I@F6uBbiµQnsB=E=gLFy+G1yaBrμ%nrxs>|v)KLL:..Ԫ_Kſ6NO &im`#3= љK4,WBOy3;>ɬ*$!NjX˖Q g Cj>5Z(Mgl:I[KafOuOwCmI+_ٴU㮅B"_ffS`[ iΧZ!5΄m ̖aqi]` `Bm>gd35=<X^k,"%BUf6)^gw)jQ;1i$MkӥG[./TWt{uawBI*L 'u¬cLP pY3_, ܂ϐ)>| IJZ BafjݧBF 6N4'p0Z:B#hN,q'b&;. ^UBE3k M3ef/YV4 BafJgAS!t_IsxM[?eBgm `@ lҜߵ . "Y<(pwcb*z3Ժ@),ܗ XZz!ҙDI,f( ! 1 %-<`Pu{B: X~՜ .~v ~vj@j]IJ3޾#4rIk$wwv@LB"S,X?028X /EaCԖf n_.Pqi_`AIWٿjݧPEYTO3f4q¿cfILY Fmܴ g~6L&f+n 2llRi'٩A[.7'pAٜ?ҕ A4;uGBdf  2>1&Df&p0Pb)'tB[.74` Mږˍ0rp gf%[6c {Bi6cfc%T1BCh_Iկh/j!ԕh0UURʎK13;N띐܄JSH]|A@AAXA@PH K B.lܙ;;s>ٰws5>"KKZNs9TI?1 67Y$5=%nf/,'ΩJ`BZ6S7V<Ɨt_α݋Ђ:JgI%"5},M O !ٵ6kfVI8reiê|d]zլ"c /CWҢ6?!$+tG)Mc@hU Aҧm:B13ίxi=gscV<ܓMeoVbD|E5|lq aP ^.%f1A&!$#2> ?>;] (`OI"/+31 %}̦_̞ÓH: K^԰$s=G`F 7lͽ00pMЫX ^>F]CρUrl_BaΑxb/z?/]`C[2wʃMB蛤 ╔YUΆ5F졎>bNhbC=s'b0(2rl 't(2vߨx٧bYvh! ! \9I6z]BR-byaɖ* ,af/w`oI.+2U \|5(21dXj5 0Nƫ]?7cDD'mPs$i]HhHЦI2ޯ!otlBHWPafOJ*4 8=Xph!43$iw`z֓ga3{_$s_v4Tuo=<~M?$sGE[d*D &!4L$wBh_'KR^`BlNXIOU|/Wlp{ <(i`W'&_/%}nu%t9<'i6ɛ7KiˋKi:zί&wnM?{sG߬%hNܢc d h^~pBhٴ/E&T &0k$<%i]I-Bx2`PeƙeB2詝A\I2'"= ,=1P5sai>4}!$mOeho$w=~=4aj0$-_ؽ%\64REfvk)'b~T_QoɛyUk'!l|ze#gj8/_QZsZ)Mot0!-24b/J{nnY efWH̦J:Mlo!go rɆU\kM7 Ki:dC=#f6S5f 3;642 (} d`>j{Sm i^ $-OYo|=o7Γ񩂳ߍ̬e"=ٲfVˍZ=.i IKnilnxRgA RMxBL(OVl$ye_3;!f+k8?!4rȱt`( ml <;Y)+j+TIҦ5/ c$jf,8 gfKp19IKu]dq{ ƹO'7I'=+'!! MHZQx|ЬNcj_:KiFB2.uO>~9Ks;68N1qti|fxks 7oal}݁[̬Q! 3lrf6VB,p~x >fRTHZo*h6qA'Ġ@C6O32-RN]y 80 < soo:/Fz$i353 $R3 G\xsԣqFwHZ83C )1njq0lEE4CZ1fP fK *XxBh:$ pjMR )z 9[ ]wYϝ <`yI}w-kj0=gXVS|M^-kd$+וQBh'$8namzO\XJGBc \/˾Ch9՗qQ%TNOR>BhzR(bfѣfvoy2I~+ 21B~08~5Xh}C6cfsl6?^"_ YPs?plc B(V9Ivě'ŗcMwBnYΟK2yEӎl^u!in3蘆"3@R (-QaZN9Io CKuN-u>vhӀ*jom%$fhàf` 'i"P6`5`Sh4 m$ι4}n$u^?']P`hm2#MwXtNIIq0P$$ƗH}&vҴ!*|"ڍ|ff6+#)~BC P6!B<$ \ ̕c66Fqf7I;1 p pm.Id7czluYbl K̢3 9Yow..u>v {Of%+~f,?i13}Ŋ *ߟ7Ji:Ў*KO཯“q^j)̘H2ot/cfS%m6O~Yph!VN*ui`ͮ#^JuP+Cr'3̎7gԀCD$wʒ^ǫt.t~WBD$fMFBۺ Œ؝Rhd-NxzH `fӀ$}o:@\l94ŕ7K>x5ˎ:ufǚY$vZݞ$uh1S;3K}$N5VnUb9!4rlWRA }|n^4 ,;u`f/k: +d QG:`O`CLx6Iߑ\5FOW$`CCJfvEӿeH闲?x%j IDAT _xYi_O/>j=/.iv"NGׁk f6@H-IÀyB ('ɧ{o?gT1)>Wh@ xCKX8@Z|0xf2ɝH8|T*_$OsX!U*zn݋4 iOxx/}\,,i3[%iE3.X`IٳEW9Iv/XÍo\JӉ=m`fJ'Kmfk]18`uv%#Ь6ιcrC3 h֟-! 7}AC{2, -kF=BݵJΪf6]oʁ9*Y +'@)g4o'aUɕ/Jz gV2G^4?^{PXYnfHBMI28JiUs^I_'шgf_3@L5zk&P6W٪BrlO]=擀m&%Я5l%YB=&~/{╼wS39si<YbG"x߉)U Z$Y`8.A?x/sHZEc3Bk;KE3$?c@w76Bnsq^!N̚~"sX1!˂Ǘ")GQK">QNxo~$f&HZ^.80pJzI Uh -1u(>B]9I'kصSU!/3{nU!c-}73FǫafiaQى77$ |`f'W(V9IVۗҴx:X^M5fl;}`fHxo,z%vF;fUءM3Z;6qb3(isIc)|{[:^o'3.ތ[fgb(jqKɒKbgīq3ј6 r NbKNhCﲑU$j~ٻ+_^񄂙٤ΜlfִI>uhvqFPdKxBŗT]MCzײ?k!Th)yf6 񰙕>"/N/U0CY9I. ˀKiqc ! Rf6x6ˉQBlfi`-i`Z=PK2 YOMvQL$Y oJ[Kb5`!5{%}_a-lWlY3%Km?!*ol֒4;] wwCs4\ UNEIo_bˁ"BCLy1㼔Qr@I5ސ%I{go & ̼;4)3X $$7}Ju3z)MoTJ*7~\t<4VN:{#iyIJMҲMFV=JrFx $I+7ѭrN[U<. <zVNU `HfS.U {X L,i9 .O;:VfC3_dp]Bsհo-Jiv}t'B|'?o 8oڠ8CZNvelwCj8d,u!C9I%sXEb'6~pYɵ̶v^{qYm -Cғ˯ٕFj`53{Rf^A('^*w|?M;P<N1/4DOʽ5y_X̦H9E3{A0V̞3ifvKt%ͦ$ Yw5BWtJkznwPǫt 2#i!I^@d3Sj@c1('>>u$v NvIs/4TK%wBhv2}m*_)MZJSkLd!.Rlx6 } 'fjc}hSN'37^ݐHZBI5Ox_jl^JUy`3;X >StLOӺ=˲BCIJ]9I7>Ъo\BhR1sr!I-{s+'<@=d6iNI§n"Kd6`-SBFaD$&45Movk)M'; Z/>A҂ ,TVf𹳈@B߲-|I;IZI_rkXy- ~>b!2ɝ%;uϚYf/`B# m$wg UsF4=&&b.0^dfW XϬMdf$xn/.З`bZ)'0<}Tϊv`f]͒,:BhνF4B+'"$+^.V 8Xwaa~^:,[*ɝ07:-83;X^GI[S`*yخSP;z硢 !4Hcj3%} oV^'2$I9I×`Ucs)M*u0P3{ X?/N ^hvkF5,PWf 6PCadS)AoSުD-e}KT-@EZ[KM0%- iR㡮O[WN_xǗtz !44BWtE-˾a0$|A9I.WbD:wٳ>gfS;ey6mt,LrGFxsiٸ#lB;o 0a CS9I6a(* Si-&XY,3haE>)*P=fN;e ϧ&{WJTtLmh1|ȓ9z> :"~DrGҧsf/$jKAWxr 8Շ2!`Ϭcy` j!i^ \ҵM("*MN5?׀N%0p5%4%CyW)Mz7HyXK{x`%;(#$}/yp<8r:%p( RJ7ZatSalRfvv祐Më>M(.6efoH1ٔ!I+r>;GVA4=<3{R0I1狎|-fwnZz<2FNCxuL$!̢$% ,s~)MNCUxމkؿҼZKge/_)[Effg=YAI[S+Ji٠ZxTm`<;I`CmVsU*w /i2^-H(CU9IVa 9ý !#u+=\Va~+#\O /x.tM-, $%iGu}vnfF5 -HfY XYpM_;HZo\n 8H[7B<\H5=('`W<V9E)M߯B^Zޑ"pT*nftM6)nGdQ`l`f n3xÀj*v/vzI.&9q~'Rf}%N7++ןn`!Fr ~9`UOS10T*'HwD}-R>QZPq^=]pXfnIs05sj##>RNM.0"=|E2uOT}<>mf"i !~DrG҆IfvjRN=]1u:t|ίc\g;IӲ~  ONItn6>lMl/?tI2>>;ǖl lJP9|/pi[sIZm a&-b/;K9I ,_C 4ʰBoN~<Z^̦Xh.f69{#`w|ܼWUl3,3?pբNY*i>(|B -U; f!f}wZ\om`+<3-(!p;Pqq^ V?$i#j`v|ђ~mf\hjH郁ImfW:XN1$F7MҰv_*15sdfw\hiMܑ4^yR1 4cz8E5 `k5ꤜ$9[f_n.(! 4Q?Qy)d|Yj͒2 /433;A /H8PN%n:-DB4IJfhII{ < XBkkpިvx^֎A/YX<M(p.p~ I\ғZK6NzM_ҟ%wzwM֧g齢i2UqyLg,%xi8qx&πC|#ifikncU+4#i>|T˟̦K:x/; 鮚O*V9IeUk18˫zs{)M:'iR/7eL$zzzԁ',x${` gá5uDS6efH"iKC3kdq95ۥ4xBm*Of[{$- t NqUooe ɳ,L$ECѕ;gFNـM$ff] cqݷtT}B I(38V<^◲M^\]J '0\?|b]ˊ%M~y)rP+l6nؼ X3{ԹYGgkSYbg4g,3K9IS.Fd`Q3{ZҼy4 Klx\xUFݤ>6+HOhS%w{KwЮ3G>[x)T$s≛MW2{RhO%s]'+?rUt1yKdWI\;&JۚM*wf3)V7vwo⽁W&u$`/Ikٛ=møx~26Ϗ+J;S̬*_97` IDATsC m䎙}!@ ;fWǒ8{d>vmK$Kb>>>&hV9DBH !U&w$-Sy^:7 VdU+sW=0~v_זSha3*c$m[ސTNMͪ凥4ճ,1?YvI:wz@X I[Ux*8(zYV~;_;c|8> c9zӒI2oRWfaЈ^̢:'0_؜xߝ5o :^0 ߙ7 a|I_*hX$no.FK˦_?0'ڡ!KvLoAm~Bȭْ;=!c,+3EI3Df>xǟ~71>BBKWU(i`bBjKK^5#%}HyBj&iv;&k} H /*sBCSpT34S;;=+)|FZ(\QAj-K $4ρu&7nqOy;ƗƦf`]"<_x~YGK>gfOfCfϮm/tpbb ;&i^`n//|K:l.^Bx5x^*94}ؐB~7u{y1`s_X#FOkKWn@udfI&KZc3VtlUNu$B;Iݺ'o SӱkTP2M5rl i[lT 1O4[r|iQU<s<~B2upNj"~ɜJijFB [絊nRݓ=f= fvoVcf]?v«lG5U;E5w4{%l)}$mW,O?O{qMlc7ћ 'yHWIz w8OR /<8дɝjf:ɝMG?}< , ϋJxErav{3{Dҗpb6 mGg67z `Jeb'9 8 z 3{b?viܷP7;dWN:5&},i)`M{!<B4crgL O蕤y~ɝ*38KiZUBhq>"K XOv1%{l l 63CKʖ< ik!%ک鱥4MOY"yIIZ̞=GJ=AjZ-=_1xlBqŗf/ !1SKB$3;SkCԉ8?s~-2鋏ѕ6 6xQrOu~M_L~>apY5R7wG/_#xR:3o_R2x9s;ȬAs#|M9b^}fǿ%r7ͬRsI`o!{::^g?;|:xѽs7ӬR<9 \jqԹ6^\d=t "3x6ŗ Q t'K >.f+OEY|߆v;[Y_-6V" =QqÛoFuCJ3%w[Krǀg}]akR;6'㘛67㙋6\Sfc_E05+]?Q[5';VԙeU]2jY.u8a9TΝ5or˞R節S`cy}]:w.$¢RxbZK3~,O_&3 žRA{K?!5>>w*;POrHVҞ\Uʻf{;/AdfHZ֝jM~"i~>/[Cᢶ$5ySJӖz7IS~f{@[ؑ^FI0 ͔Hγ-]0%-%OS0I6I$==ϽmZqaf~:ΨMgMj~}]lD-|-V+wj`W'UJ  Ը5'{<R}ҡx%a-Amw0TV߯ݨx:ZOdf/H:ʹo.".4 ɝ0XfM='?Gm04@fvmOfSWLA$4)IwBCJrgE`]Tڣ~<OX}&w 1aLg'jÙm>~{اlp3Ib%Ldf3zl/DFm3i}_?ޏ/n<\ 5~Go'I>7z{17CuUKp~WT8.T׺?JumweN_b_;0k WDg߹˹ëCԝxuH|C^Ӏ?GS]%؇>5!775RSX o t^98OP܈W:>1ji|iB5kWҀ *_ ܊WYT&x_*cABdH]b~at%kf,:.$ٔa 钮6%-af/U|n-[t7.̚g}w P-0g$ 0Y!P3{jRxuOerc63;a[c{@M܊WRU.c@хB@ر4dg;$mjfwV|fX?}m jnk"i|̲lɫBmDx$F"W~~=Ifdch fvm_lͬY[xUWuVU3f=&IS9IsA\Xx ۉ56 F,}5crg^IU<;~.8zs/""IP%KR٢;BBHv})e߲>3sfsr=y3|\39>o4.iXkL)4Hڒ5p.9:>.iSI#@6%&N"c}viCL: zWF=Jvɪ7^)}xRJCPLLOSxXC훀͉)Ҡ4;p0Qyr>~ ,k{#?#zڽaejÀ )5E~HڶqtV*O\4@LѪ;G:nRպ$}W҇[lJPKt] z uh)RJ)5r/ .ZMJu?Xv{~ȩ;i*D8`6F(ۯ~h[Iݧ }h|La}oF߲}I;OY$%ТSцZO˿#X5%`7JX qRJco3_OO;>~pBʉǛ'"un*zG5Kg87F9ۯ6]`TۯHxJ=q_f}}C@Jd)lSJi+,7_MY(p"cNJCSC}~JeR/ǵ04< 8(IʩH;1mk[1oTlO|m$}ʔmD$wHӭ,_(]ܳ}x40+1uf,romV4uߩ1MӼ%@Ӓ6϶#B4,Mw۾lKAkAxO۶+b9ImI;UnO⸪tT(4L~xTA6bMO$vzW@9^Q㟮t{hY)1;] EɃa1>i{%H,}vÙ l8 zL\Z?=5xH}PA Q/p#V~/K "iaIGI=l <'i[IW߫~J 0QݓZfe5`VǒҴ(ɜuw$}Oʠ'vT9 O _V}.%I\88Vkk?֪)ڼRpٖs-q%t6I7߮?49cImwN}PA2f~>/%Od_Y3em]҄9ěZ$-hI&kϚLNFfz|qRyqY2&d>R1JÌOv-O$S>;)9ݿgzת^OOO([|Iԍ$G>ijzq ^ NyOÀ~:[w:gڮM|x{SDGg^O99npR& h`gIkپnZRة'=,Sl+` I~>Iҝ)nG [t{om݀KK.OQyTǛ4!ܱhCD$Ŏ)}}m_8J4x5$iCrr`1Ҕn;b/yWܟ&ؾ[ =Y &Qh5ɝR͵{BJG)H#W[3}D!rP{@ ~GfCu޲kI]RK{ϝU4.mOVscjJ]/$Kώ%[wb֡,[,S>v\13ՊiH%wh<3c?}rO;ak W"3?p Q1m6n;hyv=rz$ d !{blm7۾|وo$N3A_y-`2 0yoI2qq۷J𛚇|#&&wR6 _}IZ]T͔.[Oվ}TfqRCl(i r!4y8<p+k@4pD_˂RjyƓ;GaF\7Xj1eÒ#N7'DA}d|,xm*UNb&ncJz!^1 %P#D V򮳀$NT[IWrFWR^`>Is~Òސ,"K㻒HZ<ܙ8TI,R눫UbٜK$=HCuUҌU97$N‘4=QUumx>J$~|37mo[OI[vRS>Mr*c?,lO\%ڕH`|'5QY;5wt$ O60ޗhKWbH>Jӌڑ[VJׁ N\mGL&W\m{X/Uݫyyձm&wnpI:7$^sTk;Ӱ4Ez&'w^޺re￉J]-B$|j(˲h,}7˿?A#*Mѭö[$d{ǚm<c4%DB OҧoK299HL,k*w$C$.%s3e2v pWItЂ$]"a6;T8{KBuB,m[y_MERiI"N&a =U\][ɽsl,/D_ckVjowjV?k_}iY*5-9-LهgMپK}d= 7gR!z:ęуn*2 IDAT纖WT8WszIm * C5hlI |>s6]*c"h+iۏIHt%~ l)יzY ĺ߮+2eL b3Dwе@eMs(U0"V5zI,sN&'uq׋-o}%η:QQ13~T}?R)zO.oh:_vgҹ<ߏ߯1$v>H\XoG,'nE/%OJNұ1UW F}8/mPL|4k+g{6(,EJb,d- >AѨ\I/ߵByI'qbjO%@ D6/}n',ڒ[lb{,):TJtwc,(-J1`a%E3Q2diFk{^.uO,^uόDYDE %61oDcTj`g zzn{7۾kR9t_D*k:;?瀅%MWs^x&g<% i("siM@=KCxMwt IØJ\47{ۧRC hT#Rcz,$Ylw_Ro۷w&wԜ@۾S1iif eL}u,H6%wۉmw*~oD3o!>ATH\XG"aq"/iD3ǀ|#)ZX^=E9iIN$}WbcRIDHv]I,z XK׉j%$]JTS'$ET}9Q 0*\/S+dA1UeJRy>6a"IU0W`/II &ExRV*V>RF"%s5Ր4+є;Ҩ׉ߵ_~A1F%Ikmjʾ]Pq2]OtV*Սʪ}q I,\G'G+>JC9hߝbNoUo:iR壷d.]K^%t^+GiKjZ}!M 5e_K:l]"Yz])ލp8FKRw{=܉LM2i`{R8ݓ;x΍nx퉒:$䈮J.K&_~d{R8qa ) X&wҨTA̧Ԩ% \N,ۜT'%i=9 ,j+biDOHiJe &v?#M8X; {f BMi% {˫Yݍ8᥄$!i{&;ޢ L%brm&wRJCDl_ސF7IIϗ'^܄&i(u/H }K,\ =>O]Yz'؋؈;;?&4IkR4thZa(&wr'4پqvwDΊrsmw=F!I3_!uYƫ7odI )Ccr+%{qokK ʀoPy$(޳*eRl0bJɝRJJMe!b#z:F݈W>S#;KVaʫcM/VxhQ;׎jE1ML~~^x%aʋ )5]&wRJ) >HH4E8>6ױl lUET,R綥XJbyI:nܒo] 3aTk{:=҆(2;_4LR$-M,P!H8- yWK fk!ѥ̶S>;~dK*G=ؾWjm3m8{ xSҬ_v߸z;,u;I3Ի}^qRjX㵘R>3?:maFbcI˲F~ 88OiTV5;NIؖ)}Ul7RF1۷PI펩k6lo;ض/HHzv8QTT+5yE6FwW7Og/4 JLXyi(u?` 0y5 cۓ;XҊ7GVѫ G,wɝ2Iz=;XX>>gJi@ܲ,YCRJGX?sq<XPJWMl_^{M}kIQ0q*$B,!?p-)H\g 7~461zH'o&p mgs+wKZk>d펩KM^;=}"Ȕ ,@)FWK׈/foc\iĸx~}XnX)6.0GWCylDR=wJYH$]uTGH%V!r[>fw5#Oi*%plj|XXUr>yNUuM.ndrgVbQ[eRJ#%Ӗg)5$Ô=w6(Q(PzY_g$-oiG#z h>x' ? &5E\%ib˶aӵʿ7CJNCj7be8Dså >J3Sك^Sj1D52K5k0qTRJi;38xS;3c+r9K[>+0Ua=Qg$D$`!-.i#/HIM% ʒn}ojGc SbGҬ!KmJ }7$})me=3؇跳\J1C8fi_/M)4HX=jmgliDD!fzXhfI;UWgK$z"'i۷7.q}]9!jB%->wMmX6loIg7%z0T/v]}z_[H)4`f,'#VN3Zo۾UOZ9X,#o4seyyn"VmV ihTLlmȻ[5=U+IΦRu /fX* /r8iNJ) bRmm 0&r/I:XBKrBIJS4WO۾H|mr?Mn}д>o::+Y#˵ߪVO-II>y:KLJDbr9=. ;m,iv3 9$+iGIV0T&wRJ)5%GA4\>h^R}X5Ogn4`b_baρ-T$#HڭϙPxةyeu+ j ,/4I+JZ]) DpqXD%xs妃W,2RJÆOt6#.MŖ6cmC6KbT>C$vlvtbU@GVU,ʲRUǑ{Փ&9mN(`۾b`AJSmIӗ,H,aܯM}H:SlC=3W[H)TW2b2ˀmm4Jbg.bcmۢ-9@jjelڤ%Qt YVUHӛCzVVNt 19Zw <}C;~x$U6O-1ԓ;YRJCHY/'ML8<t_7۾\I%҇zU.͞I'~Fk>e<m?Yl+ _6ejzwn'%vj{x?q֒ QI<7@+x6^tp:IlI+$JCNb5LҐ }~@4I>Xzm2Jm{SZ*l7-3[$-*iFeAIw *4|s컌S%=V>44}C:+#깽m`GKZGϦ-)I;{3%i*bbɒf#~ikTi(/ɝRj+IH:h| Q'$yzR*li+V0yGW'Lۛʯ-}sr' W*-t p7Q p#O^IMZR8]fvv`#KZ+X1/~PJڠQ%$}4#w~ڶZR3 eYɝRjI'8wg~!)_| 8x>b6bi| brQ݊:Ico<+$u~I4fhԡ~k`~OJZ=m(ےn*']!~'7!>}Cߒ < }%yaJ}ʝRJ@4I/ ^iIЍG ~nגGADN$dX"s'ZmtOmj( JeQV ?pzz"AsĎߣMr1J=l ,a>xRʆv&wRJiH'?ӯ i&BTtKT % i6,b\I{$}VMZݍ.IRxm׏vV\؃?U7u~퓻ݵ;5oFZ/OlLiTɝ%@RJi$4'' '/!^ERެ : CR1v}%cl ,{mVc3;/wJ:ZҬ=l7EqI3˟#4m'#7@RzꝧHJ)$IYؽJsJ#Bp$m oF7 cz>_'r襇~@StV*v.Oɓfز<Ē|رai|8qDL#;J C9l_[&eDR;f) PQ!c #NoG3?4;iڕhK~ כmV'i}DGzu3}Yur7/[3L1D`F(A/\w!1UnŚҐ^5j4;)O>J\!=p[[J%R!rQR' ig6x>,%iOg;=POR1Qw?hQ8O˳zdrIG'K-3`qIZ@$6_ކ?/3$Ʀ,+FIK:X~!2FQ j?+fk` H:DҪl{ -)Db `$v$'5RH5jߎjUW$uA"tL/= |%03gj;v6+/ .Mhn7"~ p j'lYRJØ刓կcis\hTݶ_i8q$,}?wپ*');3o=:+·__&)~,,TNbcגfDۭY˔ v8SN󖆉L0T~Xt`*d"J㗱W~͡5% "dq9l/aY`dGzr{`3ns=$$-M,{&=tV*#*fntTqEOvXGl7e'ޗRj~u`vRJAZ) %SҹVl ;Xۇun!׻)i,kGo9QRGN[U:էZUپ_6v>`'$Z~c$8Dr}AIMJárgfIHJ)%}EU I7}~40$zBT:EL&c9ئM[m_G۾tu:+ ͏)$4J#OF IDATg۽hb\mVԈr|tV*wTlrHCI8a8!)oĹˀ eۉ`1\ZjH'wNJM$tc$& }RzJ9|WI _Fҭ .0um_JeijeZ=! 5'smw it(;KZK5ɂG\ͩYa!I ZTf#&?سZ=!  &NSjggIAm?vzi`vQ<=``ĞR ldsRH"0=pngl)Nu f É퇀$}8Xz8U:+ŁVobHÂJZpcJ##&6޹Vd7$xڭRY<%vN [$Ke$n{NJ:m G儲kWuք%+O+uV*+c;eb_$hZ"y_Hm;bYRJsGxCK)NIo },g -l#iUI>15Sg2q5{L[Ӈ;haiIK~YD+57U$l&?Ś.S ʝʿI)G&G%^~,`;I)U|s7ˉf$^\q>=^mw Y|X5-'^Wdbg`Jbg-."S;`iy5"DP{[-x4 ۓ$ XRJ'iyWװ i-jRKbN(T>4a!{ӭ wx(MA? i<RY84>π;Ivp9vF&ۖ0ƗOUm?uqwsK ;Kr'QLҺ Hٍel&;):>GzJu~҄U؁H(-IkSms(Y|R3@ؙvߴ)pH1ކ&.4#0Wmb><Ѥ6p&p'=lr2%"0m`RJ!i>bscmRJÏ%@1f&Ҭk9Ձ; :+f-KZɒt2m;4rؾX@tݦ=,_90rIKU~iTpJ8xFIM#dj; DI KNs~HҲ4?p1R؛`0IOZ&=^jDq!0pp.pX]|}U m?%8b(п}' sNJ#uJ)][/K>!;)i%iblިF(p'1:-:+:+wV*K,v9DU23lX nwN $?RJ#mlRbUI?#drlM9q5īzJEDn`c`l!G;\R14Jݾ@҈St,trۮL^(p4b{|#&-lے}$g;'fNJ$} ؑRS}6K)i0x3r, FGM򛪳RQX1Ul<~XYt%eV#s|fK7{(04R/[rgFRjG~Fˁ$ |X?{YYq²tdi{/RE h*"hPX"ȂHS#ґ"JHG:q$7ܹg\e`KS{kR Q-_Bc`{ AS߳4}kukɒ^+b9Y$}H-<[ԨՒ;YW%4<@=6+ n}%̌Q:v0k^Gmk{Αz U7%L5bZDO,VIԖ?NJPiD# )T H Q?XimԾ6#p3pTw0jhDYtkc^j4p~ 8HҒvϪ4lOMbu'wl?l,i5Z% ϋJr4-;) f#|h4o*cK)%>\VZ,Sez:%iWV ǡM"ޫ~2-m848l <پ@eKiDr,O&Ii@'<|D2R*lNTl01mtwNc%[I}7QV% 1gIL GW۾]hTPjmSI56}cz9䔦iN IR#$f'V:H@pQ &eD Յ7<7V.Ka*z)͌Sk]XSV}7BYmQx)nNL});).!K\aqnN) $>@4}h|>$-bžInj7FZ XXYfYُ!L&|'Wmk&ۋcR <a$[D_ھLQ%w:2ab eeQY`)Թu l?\%&>v̇8L5j^טywc!w*i)0WE%C"}ÀBh/ܙWr hM0RYeS)ˣ/nǽ ?\\_zy¨Q#Ոv9gNGSN.֖UCɒ֗bIJ=t3`tHy>#i7Lo^)k0`WJ)Ic{ͿZʒ?jDENɝ`9:8{ܐ 2aԨفehY_ͪ <ɪIYDVӕRffʿ>޳'\JՒ;}wZi4bISDJKSJU5&rZmD2M{¨Qs f_ UZGN.6xbllIKJ-UǔZS{äţ([dg{1:Jɝ\2$i=ζDUDlR+;6 _Vjiz'v >7؛gbmcg CƤ֖3IxW&`U`U`0}ϩ}4M+%w+wRJ= I%$oRJ6ۯw[1֒M-zӄQ/=3_EaΌdE͹U.% 7;l-nKΚ'K3zJ3*;) F_$[@,{p;-z헺ϫ )FS1Q,qSO0IϪcJkO]}g7Ez,;) b|= p$p-ݷL5F.=a$VϚ' *kZ3Y Nކ+hk+ک7-E,E7j9t[pI`1U/TRJhI$-A*0;,pRJݰ[?ư7SҌ{kapn'RitiPO7VKjU\O~(9\9';) "!|M4I\4fg3psם[}IzXX>^eJIKI:]UǔZ66~Sq@)u*;)$yKb嫏'4.RJ&grgF[vcUi~7$j{jǚLCaaEG *Lr;CJ,I,b۫- Tu T1jZ2gl[c=$v.~+QؾMR4;UǔZ<߀VՀ_dҀ2ɝr' qvD`;Lnۉ9qS$v)i}ۏTSj>Q`֊4{* )NZre2(Iv~,RJMܙC,-:c?"N&4[wks9ǁKbkW}}SR707\u1oV4{ppfofUǒmSÀWKJ)͔VKzYrG*1۾n Cx8 0+@Z؅3Ici`Ka ~6> PĐRJ0H}"> pMz|ML?}$M\L{Ҡ;)URJ3kX̠ pf;؞bY൲irc(U<"u+Wg <|I)r vLӧl_h{>g5yxm`N{H}|M)4JjTך(S{ْM-I=vtXAi`CۏTHJ)T܁nIJ:%m3Ut; iPwѓr$I4pܫIHD{Xt#p*wD)/o `;`QU ovf#dK7lO{BZ4꩒x 1kb*Dz)@EKvbG`=I̕Ro IHZ8l~RҘ(a0#;&"$o|h1G<%$\I\żHK4$jj6>QWu}H@mK{ۂ4t-B$u6#ZflQm8)u;/ެٍs p&'91q]M˚ʝ15>P =,T[1=˅yKt1N^Jqi]? >@$pF[}? $q43ɴڱF:?Ro?djK$m<&2Skihۋjä0:ՊɝZrW;V"V;Ul`{K^( ع%z2S-A$I1'=fO"զ uTT\LcA[%ǖjiy~xC4ŬUԦf{vcݙWۧ cm \R?4F/G^r[^~ƔIKyJ:xR6m"3i'wk0QWo*79f&RnM)<C[S[Fo-`qtTqΎip>͓?G{&"ٴU'wffZVGΖQO)4$Oρǀ}퀵m_Tip>LK{Y%4^So l-iT49ߣHlrGpIsӭNh?画;J̴/ ^Unh{+KZ~gI':/)0mn(ӽSM_V-RJi`o"g^ I5ID"`{IK[uY>\ ibn%/inSK> \$iWII $mF{) ֪>P;#'x]lhܕ.b.zD1uW">(n&"R۾G1&k~{񈤳Օ| *s]  &`bxnVӮA4cH:d%vm.)`R5p ŀh5AIho,=K)nJ)4;Qq/^[\<6?iw)Do5ޑ)4` Lk6X};= g/۷$t6gđ4xw* .nj eI,GTgn>z'Wخm8DI_hW} eIe#l.i;"95Q48H=N|vV&e)f@M{ą˿OkR%psԛl/i/UKJ)u;m>7x^n-_3y |RZ.S I+DmC,.'>h~RJ) F_!VM\ xzBYar0]? jBI)W}?Uq8ix>V\- aH~)[޴a5RJRFH p"0詳ab{ DsreX'%4@>!2IUOJ)5Ӫ;5RJI|Xq=߬2~r0Q {\6li}]1Un9`c5ǒRJѪW6^aTRJ?4{ @`Iۇma WOꄤ݀JZP;`qۙI) Hܙ,RJ)^bF[9YO!_2$_Xnbe4p=!ůG,e`J#Ki`"rwJRJi1IRi l`rVJi68U =[I$)uC&wObgR/!4DH[ҜUǑR$}X?ueld,ҠPz<*iI헀v:.>Um8)uU;/ܙV#U{"@0R $ 8XS,%VZ@Ҡ7`YIWHSÌVML厤hXIImPOܑ6p(6b~ /6s{ζ} !Dc私ٞҰr _la6ۯk~a9ve9l9#q*R$}8ؒx98ÕR$LJ7I|.N^W,&%i@jʝIUFίquՒ; ,}x:Ɓ%m Xq"pSK%'Jn_Ið?""iIOɧ%KI%]TOuԠN’Γg%%in>]$$xI?4L7$)*I?+ɸfǮ.[t/Hd%}^6*VGY旴H;ϥIi [͉+4TYtMzS'\u,OmpE`*I;Z5:qr'wlOڧeFپnZrg+oxj+DBeR2նo,@It_~n{7G؛H4'"IE%Qw=6x"_k?!~$b9wJ Ģ0}D >eXI7c#b9AvnA$~.-DBm?">9$)i1IHzh+ۧKI_bXSntsG R듴?՗VyT]Jx |klN|iWV>Ni@hN)}Hԩ8t4娖ܹu۟ dIm0ivnĵdkN'/ 6lc{jmCB{bNMN$~nNO%,/>=eڍe9y6ղ]=Qۗ>XuQ{>eq ELaw!J3&H^w_*wW> ,d{53e*Dl ۛv *j)= JTt|蛱pQÇ_ D7UjI+J:X6SzJ-l.wNiHZx AձnY&#+l۷]y~c))~lILG[3Z_NTA$iY(w~Hg b)DhO5>mnɒ$A7+ Tl6&i h.`/iid"A5%i^>?Iܴ'F뉫&\?@Z5@CB^TjL~$Z`I>Y5ڰGc]%SJ-LZ=y+˒r{}Mg=U'wf4n@ʝfɟM*E5P,>~Ogʒgpmع>S5ϭUǚxvwujfrS屟+bVtQTAMzq{,5사IiА(kDBZ"sM:FHp& )*"hцEˀӅZôn(uDp޻ e;rOvCKilK4UKdu{gI<,s7\Y8Hڨ,O4s,РVs_ݴzA}bIRr{logڞ`j8=w$;)8I I0mf7Nmir]W;]oRl)Z9JmN*J}mOcڗ:Hq*IL&iWI~8X$hF+C,n5hF8m"r&"AkIBU~Xk9I,iVbI lO u+[I*l%QCDr z?Usm]IH{l/eԢ$- i<ދXkKھ膔yך~Xu ipRRJjiY:ɝ !HJ@$Q#~& j%*g.#Px%EѿfLse(p:DgOחs*iGb9ڈ2ǖvlZVH9j.'&Vv5aKwW%arr̟Kk}'FW; T)Jbu%}u%]>A]D:N\Y[δzcpLGI*t+]oNbK)UD|J$ʷ_e/ ^|i_= n4~vDo=wU7'h6ՍwHxjvi^|}>ޓiuB\ T{o5xsՍ 9^77+1bKi`QbH-E?}ATLI%- ,M$˞,ˡ77hd yHKTݨ,j٧rp")5+aF_o=gc`yy׶_Ys=Doeʆc'S KDv۟t8S%wl˺DD6ε?$}K4zpki7m]9|H ,WJHMLHbP:XP+Jw`^j*z^6ƛB4?;ؠ IV$.x=t@oq1{9[O;Xu*M$>۞iO/o@PzniDEWmZu<5HH\ceH`VotrDen>ۏjwMdilEągJô62П@Uqw9LLa=6#hPRްeNǫ >MT=v@OTQ3/Qulٰw`y x W xWӎ{kJLww%Qc%z#ՎwQ[]Bw)1!2D{ "LJR6TNC%RJiI]~Dsןe_VL <7gv(J}Ux''XN]L ћLL{wjD|NV+Oz1D{TO$]E̡6+ ,4IMTGT<PR9-sو 6d}xU4ޣ'ƛ 9obgIPo"p=nȬ@ӲZS+'wS_d{I)&Wf" 8L 02RJ)%Njٞ;J9-+S|~ !,'[-RJ) >-)^!;)I#/s'V:y+RJ)YF IDAT RJ) m_~ , o{f=RJ)ԩY fTk3TBWVUJ)U^w"z,K/8̮RJ)RR4@za``/;~J)#p7p0?pC3RJ)`H[i3TGMbܔRJ+I;f?!:?zRJ)!i$wZr;(RJ)uI%CWel)RJih =w>L$}[~ U6lO>` 1ۏuq.~lNJ) p~aJK)RJҕ;^Nn"z+<^TQtrI4}^^tўiY)4HKUlRJ)4zrriYlf7ڎi{i_j;[ן@-%rvPoV!飒$V7\m?_mt) n~!IH| i?IX$雒Z㌐E$./:RJ3Փ;3s5#n;"mcj6>l_ _oްѶ-dr'*&i#I,k{/V]JCmoe{+"gs8{=w+.I'IPҟ%6' IWIw"n᷒>HZWZV% oJ) C:c{$--irufO`"djo 5l.ܰ+s畻9-+*"i=I>L$.!i80v+F(iqIJZ@52߲'!:^|}"QGۻ- fv94A56'dD"?N4L{:FHUzk̔RP=wf|⹶܎(_#VK<ݰLy1H&c=Snr'Fɟ$^'~RJ#K+nH%pdF)oD1"DŶp Gg8OI^'؏jiI;;O Y.f2;]RJ}+w^LϧeI?O7~ٻ kW&mCaNfjfNJ)R6` JgYbuJ$7>bp#^*-I_k;  !`$,S>T?D4af%ɘRJ_plO:=OlQnc{T)M˛|\?mp̘J)$ L88ERjbQI8 ( ulC$g>(i2yA`Kb۵s3H7q* jSl@[a?^-i9bM]m?*駴WO$6}?p9t/ls#}s$R}Z&"Iٮ=ϼ#kاϯ;7>A"޵p`$M}~yB|ROv3y%-@]&IۉJ Q!iKJb*ڃ8"QÉXY9Lѐj{ߖ4xXR-)^ɝ ?Vng*SO%+/j3RJ}D ?':wVXJ##m_ n2꒲zeD˃ l#8YJch16 *x>%i=6/tpWujmP#ۓ%H$~o؆?drrbK~Aҥ*fr\DZfӲn_>U~Y4? 񣉩kΕ`?53Dna/7Kښ(]$mB0=uMD[K/!$=*i%CG~ImD%Um14p)0~"1-priA.OJ)uէeA$wqe.-;K4eKSRJ)$IH:hx9ڶNJZTPn'cGC _ٮĴ\DG4|טhRKrQ^_>S}A'9$ѓ!z2I{x$іf0뵧Zn$8Ah6-;IY]F$>cG~nDU Ds$/@+68LX[@b|xLZYyMIOH9'Z$Uپa;\?H"}lN77s>ZmJ)S+;W?۷W]JJSl ir(`%oΣ%Fj_iCoO7յP[ iS7$Db'^lmvۻw>]u'K}R13PiZ[ށiL w^+f%G_ \ET&KjʟKZQbn9&Iچ(ܜX_Dy͈RJ)@!t$o4R^5#%]dm.x?t$Vμ gD%md?/."Ipt9hf+K-i[D]K%}X]u +pj~+a"A$p7`IH,Br\(0<Ɉw[H]\fi4TOT,KY&&SmD$"m.D3|ړ#1f21 Drj; hZZɈE`˪];S~+=O)N + T'[fHiXöf Ww1Tb>8R?r~@15 Ҁc<6E/޸K˛)T{#>Vr=Z6NTL%VAL zxygIq!ouo%צ|q!ٿKiD+C?._S|)@$nqA."=" 6;h>mbՁU%]I$5jMG~Mҙ̒DBI!</K诳PLxSI'*GɒBpê͒rAI\zp_Sm%6 Ct3EI 0[y%D҆D`S’`kܟ\2R)>z$? DD Թ ƞ>IIz 틻y4H,VȚ\wuɈcjri5 3D-bVDBOםgN"ɵ qA۷֝<77ĸk>><6Qa4=| nbj9I ɦeKG۞SpΖD"PۗHpѸym/Ne-Y#dWm,~r.0aK%]CrĒjRJMĊ* V[HZ\&w`%i4RĴI%i ȥig۫ Iar+w$,D{g$p`ZOΔ*ɝ4XeAϛ*Rj#V3܋{;ԹSJCZ>٪Sjג&h;U9 m勺퓉G4lw~/ǜR2RJi@40؛XFN@4RJC/mk>ڐRJ2RJi@4wUU!ɭ>8RK}%:ܙ(RJ) Is%gRJ)RʝRjaeoi{JRJ)4er'R$JT,<^=4L)RJ)u;'IzMH Lj#J)!i+}`a)`wTۓ-RJ)V2z+ 䎤a)S \|BFRJOHIӮ-}R&vRJ)R16>`g9 It3%M4&i'գK>JL)RJE`rdrgP4 CHYkVo~&h%CJB)A@A("4 )ݍ 1xמg:3g笵Z{\~xy-ISW~㟶o:_!~Cl"&aq[ :'mI$I$IK;KP]qgj06L{W;ݛ'vءDX\".)g~0Fa=܆?= ȯ3RI$I$IC_"ADʟIJ8`Iw߳D7'l[_> >mƸu{4pf$Ĭ;u=6_w)OsL`tGLJ^aW+t5% 6! g[7 .<l,J?o#NG k=:ٟ@xMG_ftp['&p+pOʘɁoѰr$-CU>{mʸ4ccIՕوwt(ی CĝwS6%r}@3:0I$I$I1yLpN:grj4|MةM۽MH2I*QZJ5ar޴GϵVI<{%y/~_oؘg'`u;6 hwNByXնo+%̆ҾI?گ*< lQ _EX؜^WmlDu^S"Dx'D3 l%B DߧiO&Y&#QPB ؆.&:o!B<{ag*($#}IoKzMҢe OQKC}{xmK I˟K[ҝnnL;Bܑ$]#nzUMHZG!6kv$I$IdWĝ7˹WIJzRң(ֆtWyGyZRVB eý\ ųz`)IIc$7ھ]%m.iwIk!֪>jWIcrn0Q47pٲU})05p注k iۉ.'+ޒީO-mHڌs5% K|pmUl mXK_AtUSY˽jX$I$IL¤3}/NtsHWz۝%kϒ}$mj2sUVCmCF{%5 W{VO)3]ʹGh$iZj|/@5+%j( ^PZ/+6*a'4u#V[sтRi*)mW~iIK"DD5-WN+V}آB9EZOxfE_U]F"*$ʍ񓵰 JS TLs>U$.<3gS<0H!Ja;H=""&Q%$"B%Ry5ݾ]Ty' ~=BQI0B n^5,I$I$I;S"%PN>0"DIKr&gJ)yzޒ4j2*\>u;ޮ Q}ѧI?GI+i_JZׂJE|H)әSKl}3l)k\әPwOkA :Dgʹ)ڍDWZC(BE YDURMykӴdf-7iM;]ϝVVa-.iIYȧSI$I$I >!𑏘pŝ<+KZH9Ц&'B%AGh7JJ؝8K$.p"ݰk`cSz}%̑4;WiW;!?!cM%#IU.}}UB?5_/E(VB-QV/X4/*B5Ig fx5/ʹ3 :Dr9*`!eo"6"I%JOj^"fiuA =k߇ʻ8:ᔭDىIKJL$^e[wm?I$I$I}B)aB0/Q{r`cÈpAxLI|.N|ОF|X.KŽ^+ִݬPՊP$]$顲DŠ=W%FT!yIHZKMWKْ4@wJ X^ IDAT!}IGJrv"*(".-bFMDMJ)J\beח2TvCh 0}ML9L"=Z-Fwv7JZrtGEI{@If\?$ծ ۼ-iZؒ"Nw9ۏ~{euBFRP״z͕5A#iQIpk]$I$I$Wr@|0O;j;h&;w1s0I3o6@!OsYJcP2)1/MrX"pF'ep:6"qZVƞwt'QQZF'IL|C;ՄskL0$I$ 3² 2RI$aDU K$I$I$I}ZLI$Ift4;RI$I$IE_I$$)9~JTu+{հ$I$I$I)$I$@TCnvzհ$I$I$I9}QܙWH$H!Q&~BԹW K$I$Idŝ#?pWJۚ.rcw.0_f. ع jq$I&$MK:?oU>I$I$IK&Ts6.Pk{|\%mktJ:I ISKx8 xXy)$I$I$ɤG_w,- Z5~?KZ5a]Mn#;'7 H(izIƙ%8^9?JmKHDE̒f-$M)ioB5!ho,f,{$I$I$Iz>#,~/o]5E'BMѸfb`[m"m$l_]RsnlXx'KG}׀A["81p u\1c"$iaWM!i/mN$I$I$})CZҌz`0x p!m6`2~(00ȇKwiѹfb``9i?>Dmm?6&*ol<}os+!<8"NWt,Lk /WCe-RƚSctq/{wN٘؞$I$I$Iߤ/; w5NmV Eܱ}kyl$Uq5+p:p`"lK5IW7~|SZEؘdwy&–[ '* |$v໶_l3=IG%Bܫ{lWaZuQk~h`2ť.m1ބ(2rjcYo.}!UC7m_S_G]jA"9w~۟ZyE_WلJ"r`j`Ʊ8eOũu; K<뽀;y/d\3bi6"I$I$霾($`KD~HZxX.[av"Θe|VZ}RnD[ۮM"-B8xl!o7l_RMb{oIޠ6߁o۾2ppA9Ozx[懲?m7Bg!pmWi8!XP!T,W7tYzY?B8{}E;!>D_tpeO|DsK4 xH{:!Ax|\W۝&r4 Fk~1"'>ZZp?YgB@\smXsGTĽRwl/:wW)ߟ Yw}Bs*Kr$I$I$0}&r-``-IW .Mjm[[+6jљPӮoL9j.KbH9P;%mod{eB<<ȡSq-!FY *Ax|0හnx5p_OS)"TtHst;!-B.PpQM.!5_U %=!aIja,.$$*iSIKFU]D⎤$YCy窊oHPy^ۿKa'I$I$IfE cNcp.,o +䄗Eĝ²FsF{w=O#iWII:OyDl̵k]3W6+z[y}J}j~JBNci6k(Si"=ӅmOiv%]W<Wm!D mӀE-moR B(lDH"rB|?%E q%﮲} OaxS?0'6ߟ%j`Ͱu-!5?]H$I$IdR/eAibbu?ά]ggfʳ!]W?t ^Bʶm_"*Ѥ>yJ˒6#Ym#6UҺtxI$I$I$&T!H=ͻuB|(*`CIKaHQwXVӻ]ҜDLOpZw"$A!TT^Ngt++E_@넇Her~ iP-s;VI(ZkIT+}e;-%d 2nJy!HVb{FNlhcyr>qG."w~5D kf$ >m#$I$ +qG_w;VU"hw+R]JV_*?um)i0ᥴMt5>|hKgtsǒO;@5UZ^ cCUY?z#`'"wOՏZ [R#{XU{1JjWent i[D #B4ؼ1;_P'xc#D>$I$Id"cwJegmZ뾄[ 8]> i׎KFe3Io%b%ss csG;:!1=loRљA+JcU||̈́ծZ]3:$I$I$I. {Uή720ҬӉ_/IkJ8$*D>uKd 45' IZ ,V'3r%M-ik9ToV!*Gȇۏ0dQ;v>Sx沧JzV;aouϚӉ𛗐HNNyFn:<5wjtUZ2:MXϫ ;DhL9ʨTIvXVgk1|_ 3u2oj_KȰ$I$I$I)&>n-`Fy5^#D"LDfrw!Bof03pv" oBtz(}NpQ{~ByNq2~$UyJkePpذsG)ʾ*J+*cI+U*З9IHڍjR r?&Ŝ,iZs"qDigUJU>} Q`߲Ncg}g3q)U"wƫwW ;I$I$I-)$I}~'  *M ګ%I$I$ItA_w&/\$I6Dյk%l݋%I$I$ItI_̹;" \_m{$޶#I$I$I mUŝNJ~y\V Jd!$I$I$I&6ӎEj8bBљy: FtQ~yl$I$I$I$K_͹;ﱽ 4t [.0;!mDS旴voۑ$I$I$I$},؍Ұ]+1W5IZ I$I$I$IF_wS}ŝ<00yŀ_ iO-,ѾOZ=yX ؃DŭEI:3'"%]K+Ӏ%[ĞᒆJLO%g7oo!IWHzx^ N4Sc(_$-"" =IH\gtI:$-,iIqo+J*iIJVҷ$m&i%m)闒~$M)iiIK'vMTb_gMƭZeÐqF$I$I$8/ev0aXCJXenC=\  `+Is!'?=\cogXK/Iڈ`*Kt|0 l lhvS%=fv2jcc۟KfZXEt /i5-\KE {>~<A^K]OI'BҿUcl;`n`SBXXYz/$8x/wml[Ƭܿkg Qpsۯmmh9`\ ؑ3?#ˁ+!$Bΰݭ86cgo OG%z{vP%mz$I$I$I_${%Ym?0A(pJtczsLW>T-mwm=5嚵S}ŵko}b-~Ul aKv``Ml]ڧ=\f/K6jqݍ`6xn.c~^nJલeKeO Ϫj\Tٱֶ8[߫oϝV*?KQWk,in'$<ǮlԞk-EmB8|Î?o7fB\8zLGyGyGy1Is7刏ĵ×*g<Ћl'i0!NL|x,V<{֎KmlIJvPæ m zIEKZ eS!ڰ^I6'yԵ;C7=rT^_t*i [PWLYnIڛm\g~s}XҏUl-`]Mޒ#mS2CJ'wc0V %njMl2;Q<~)f7vlfB;U IDAT`DI v`ʷ&O˸O {DR瓀Ng'I$I$ILh;=dA\DDό='m0B%|fjTr63!,,@CSk$lWyv4Dǒޗ%1𰙽[i1W%t&t+B9sT0WnE0@l.ג$I$I$I&4&uq7FDr+ls@3JY1Lilf{g߳=Ĩҋ 5U)ʹU]N%pIk/zjVV)#oieIHY5QT|!*|sm]DmRkۊ 7nArB||RIV$ۏ~6nrn%yUxPҺU-<ĦkU=z -*סּRB|Ȼs%EbԐw$I$I$$IW@+ѡ)j,JTjį P5SU rTR`dF'NӣšQIS{"t'EcjG u<Ug# Ϥ+ o3ϖ?gm1 j'6u*j6s &#BkfCKw8 s"g"BZv] ָ㺍!V+޲J3( :*c[ΓӉ,M;!%',BT9mۗ~B|(B$= '9Nj %i#I Kډ(Q5o'I{?_*}5˿^I;JY7h]ɑe{K 5׼zjRVj_3efXui:'~ 9ʍԊY[q# %My*㺹nuBxlIڪs1oLB*s'I$I$IIz,N- I(|{ZFrte t!ԔJ?j5gBSwIDc{kvco+^;̏bBTyhcOHZ3B8!l /sA|\曺}'peq*k'ʶlnܛW%LxS%Q«*(B ?V-J҇sK;eůt<ᥳ6#ҚD \%¡уOqqZX=%r~@xExW^o;%^oEIvN\~x_m'I$I$IL}$Ia7g^174 "!ī'V5v!G-Jo2`{" ҄GԄt"pd3Jv097!K3Gڭ m W / n?“7/cۇgt.9>x60! %`b׊ gbA[ ͓$I$I$I&XRIz׉B'6گ#El+ƍJէ-lE7m5Q"i:c-cnU;k#JOR#KDK?3ԿvaڜkI'#J_@Hs 1n'B@x^$I$I$I& RIzP oi o"gyca`zv7pz˾$I$I$I$Iq'@T[ȳ'/[%4fr"Dnm~,L$I$I$I&uRI.(9tV!ʋ #D}$5]Jmg'^Wc%=%鱒kf3Io%])eBN|Nl]P$]'IGKZGҷ%m-Ŧ9ksHZ㚹%-+K4y ZҖo/!UU;Ϭ;MIՋ1I$I$IIf 1ו1 7(ڦ">?r ]K፱aPce)}%Zucd~0}c5ox޵e@N\P\ ,m"< lKi?>7!\{~ N~uSV6~YN <6~[{د}V ;Yދvc+W_'r^?o9diX8bo #­){4Ym n"$Ɯ+6O Bk .<#<#m_|m "QDΝP8B%W7/c&}s3=$KgG"gOcsQ)>IiZX5ҽ+u$-gβm\:e9? MqY9?ލ}Di [DJH@x*{Q=oZ+Sd//ђ#'=[(;Dx"Yv{z^dxD L?B"eU3螐06skiۊfW$n%IS1Gw?"ta#JmvnG\K_&ƻ%I$I$ILLN%̌*H/~4x#@>|%ۻ8+㟇bo]1Qco`I$nY[$45^b^@." (* ;;;le̙3gf.y89ӠR݀;YymEL]*gsK$Nem='Fgs[ku挺*>䗕gw/M[tݎ4{"/09n'FF=F`fV9 g4e4Y0k1.NM} rmGw/`["#z#qo$5]j jJL!96lk3XIVfgfRԳ<2seѐsJ 15ʁ]lNwbNCJ{I4NXhvbRsg3=앫S!I ݿ"VwI:):1" Sl\߸9Dpk5,=yݷ!V 1Jhg9IȖ_hۍH<8HLDRCRimb]ee/˾97+l4}Y"zN,2afb]f6!?i(lY 3:SbfksOZWbai$./7-.(qIVe;Y$9i"1x>s})9MV)<JqJmU8^@(#"""""igf]=MτEALy;%ԧĒH*Zxx迳}\XMi9`pbfSú]եN1ոn)FZT"+K)^L[֧.Dk{"@s?xUbTnz>@&K>L4ZbCDn]`=bf 9XaZXlʎ k'F89qr僁l~݁59JLUX=It{C>CyogV̾^v }9V﹋7wډmnf;4-YXZIʯOm=)}vfKyuvV&*OmҞ V:TWb )fv 7*91lB9 FS?%<_P9WX6:A,;86y/qM":!Vڝ h DTw1D,?,Gvbfljr%uL;F7b'i\~[{IlSJW|6l `#b'Ϋ_%QWf0`WWbtli'fv/1i1mw%:jY"""""""";"""""""";"""""""";"""""""";u0y3dfl(SE>iB?3kU;4ͬW{EDDDDDD3Sp>>NE߶k[N{-/`vH֭;dV=v b]άSwl` p?WkvJGY` ,0xA>:epXX8&5;6pޛwl(pxXXv s.6H72R{Ӏ˲D@kbS'D`[>#̀qUI݀mՀw(3[5ӷG>ISJ &Ϲ{,3V!0&"""""""92玻Mpo#AfMaiYf6x,۹{3uOGSt{*>fa"PqO/383˞?ÀlBN !F]nfFg]^N(vV.>6ff/3{̺Yf&=ff߫rMDDDDDDD::rUw4+t)fv,pp pS>G>9Wd`h3rWͬGκGYf8Xǥ~ ̙l禲f:8tqS`~jj+p B:*7 {)b2ZI*e~t"$g`ڕau-՜Q?"""""""Id'J=80w6-+?rg1`00ݟ7N,UI;-Yu+gf``ﴼ3<<쒍1D=/P@:GqۙDN_e߈FcbzW`׹NDh1bPp'4sBA IDAT,^O>(3(pwR%$Ljݧ@/"3jffbOT`#1> TU޵硒} /g ϧERyZV3={>NYp'Sl%&aYit-"4D~s,GVLoVh,Еm/:sp';ln"1x#,jzq%dZV}Ic}:VZa{ *GBEȠ ]4תY"""""""hZl"mowi%/#R1J\Y[w*<^NSl^3$%fX"`]չʎUvZ1%mU;;"""""""(0%=(_a&wMp9<_̶V.L3ٔRni)MwO5%U.#.C$-ب<byUxGLZ*g`kch, ܁|f6̞^ r sf6a? . A2l_3;ppHدyo0խY3kfR2f6,~8("3[!?D,y5G|LK3F7k{dCJ- 4:-afWٮ%t*uw>f;p1p!O\ݹU`Co-dlN`\ e.M'm? f#}h6gHswf83ؼNvÚq; t[pli#f68 ORo p~[wPRovn2w?s./O5/ 0'(:҆mN_t`B>=3~N=kݯ2 G5W`!``%wX?Z7lzعީJ )pՒ6R;+}זkswTGÁ~R;Lo"""""tiYC݀rՁ}s 7F4 kK38XXJC@)3oKںX,H*24g:w?q m~J\OوMq@1}`)H>0x lXC~g>7m7!nROkc1ۧ|WMJT_k }#`gf;Fـ̝><lGq-ܾ4Gg d/` O=6cfk#H"?Rhw9?kN0ĨqF`x]}kkfv c6/^ vVop[q~Wt8q?o!kqlg3;{8wBSgS-^lͰ_+hW!<3d8Ȯ٢T`ϸiԜ љ;ҹ8iVEOx#fwڲUO/f>Iosi4ԟr+}" 1%lZ0eo/_Кi@-ۻ-Ϲm{?#Rg{`WJik}WEDDDDBgI|p|3"-"ɍrxT&FWp' ~*~-0x JL O":"FA"׀R[l`t.}wKzysQeD}}H]{31q[=j̶$ &=O~qSJ# v6rmE|o&WTʩ@LBܻ5L$í4DPmp؋#g FOPwpLoD̳t9mKLGT/3 X7}\#w?>r+AgwZV#KyK`E\ 0ۣ>N`'wl >g#m>pKЍps>jfsSfx|]w> X=-}Z/P DRDDDDdzW)3jf{ gfG{ro(ub_#sC$ kb"x烹X醴FMait{m=2, Ai,[3)iĔ.!@3;OK~EUT(?)T(?:w/(l[͇ʳRImX5ۦdt{qM^z饗^z饗^^ʹSAjpn>?'7s~R^ngx(gsGقUݯJ9/Or#lsX7h'H !$bDJq$]I`#7*/RZ; uNmCiN;ȾGh<1Ve{Q!ey8-TTm!jlF@4Z41 f;C+݋lKʲ%LN))ߒuFɶ& g;qXzUM-+ʮeͽE  1bjis TV_*~5j绉|3e*M|SlwrSH\jM)ֿZԣ6ffsD/ⵁY(ޢajkл^z3Cᵒlw{To+a4s;1cܩkJV*݋95F k$MMdwXwojyE{;5gz/ҷ'}Nf=p?Fܩ*S>cXgߐ/H+P'5fq\Nu5sXuJYrsSʗ#ܙ0I|A<4 auj8T؞3egf{,BLKk#u)0iԗ?阻{ o'"gh3M \̬{@3ꬪ~ln`>w}Ţǽ~MMdfi'Wv$#R|U`nw/~EDDDDڄ*Wr?Gi?@}.#qX~8s?o̶q'1 #AΘ-N,u{*K);D>IPl+"0t;v^)o~Ī>)lou#rJm7JB7%n/llVwyzߺ!(e#qq∦'Ou?8(g~?l^Fe׵OJb{0]ʁt';]X30%/Ϸ3ηVbtb&FʕmO:+qb5 $Á=[w:]pz*4}`V)ao FzB4OU$WoPmDq>VN ɶCW. b:KYQ$@k#tmo>A,^#&ooG_2 }3C~{dɶ.0-4f^#^z:x~?S`GDDDDfe#"̺V'CJ}W#cgτ>{("""";u2y X.W4?nɬ#M/<'WD:֚D^وOψ|T"""""5 ԐrA\D$} X7oA[7smjޝKOΈbfk7,?+IysVo9%vQk?}6 F)`("""""҉(NikdW!nlv`_b݈o;R;}X{S}ޫ#["}m;`^byӾ""""""quk-| Pk4{Vp}HKqJL/_̆ܮ5W~ gZ^JK1lfÀʖXw1fpA}>x^bj`_u Mt;iԶJ,wKz{KY >1fMln`k`mbEBy8S1ɱGժS?}zOvDiD>Nly"jj"1Dk+[[3uNm߂n7_-I)lܾkܖ"=wQ/Xhf]=-nrJ[ Xx x189w"mސ}ligwךq"""""":3[ 8g?3bzT40}Fh2:r-ZRp51ftgQɝ5&JmHs^J=f.NDꭁy{6fT_Sg7݉(%G QG;\$ͲfvT>fvp%0X)پ1Ma"`fv d:eS"0|`dy\3?.iT|OSDDDDDDڌw`C``a,oOhMu`T8#PS ;IDATASbE\t7-&Vؾ +1@aR_oS{YVS\ٺ즒v>ȕP'Bͼ/.,v%pzIω]ʾDȁ ȃB "u~K/K/K/jWg#1Fo:u$rw5pc*Tw4sG3bh{ Dݿ F? WasR}#F,DV[J?0o)l΂>bfVYw4=;q>"yWzuaz l.bԅ{H#u=lܦkv&(lٙH8>>HL{|$212f4֨>_Mjr̀' uV_z_5bGْ45-g$;+0DB㑹z+灮{rmp!Fu2ypFNb8˒kqF~o*bٶm;?""""""2tI23/bEBOOlR3ծ٤BwKOlk uڅi  _ˀ,K0#lTUWh{hI-\>GdIv,g@C>\=٨lErH;LlP {OgB_+w 5]SԽgzܚNU*lwc0bjMOo5ھb"з-of+++.?[ϧ>5+MZG}659 """"""n:SpHqCZ}Ab:3Suz17;-af fe/lUNZѧFl:V/ W;-w^o.ԩImNmW 6NL뼎esj}o>-l,D޹=YՃiJ,3w |M|!Hk}j+K>V7[}3ڢ:n5۶PhxIt`^btf6GI+ Iq`S"%>DAfDIۧ9d[KeS~ Fden5HG\A&r-b5Ͽ&h4O"""""":Mp_ gfe)IIJG{0[JBۣeqeyZ %<.zniGar!86?p&xξϯgGefũTK:HU8zf6,wnGkpWZV fJE|1_lEVfd:4EZ 7Y̺p`_,(K ߟ~n 2OL Rc |5H:g`N5ܚ3D%.WDDDDDDf"ܭKxJo:])ZEO:11+1&~7fo"8'+`0pOկBn>Pot=AË#\:`{bըsو=W{Tfu@mD,'ye"^JoT_p#V[Luz0z+o-wsʎ7"tdStRR(1L7e˘B"Ύm'#wqs>"""""":]p?/I,9ydEw AWz{mv]$4}-Y'Y߱j)@4T{-GټDvY0g HW ȬSwd)wڻ?"""""""u&玈w;&l3l3cDDDDDDD:X!IENDB`PKH:{.ʫqq-Pictures/10000201000004560000045AAD14F665.pngPNG  IHDRVZfsBIT|d pHYsgRtEXtSoftwarewww.inkscape.org< IDATxw$U<9#%)*YQ ԭ{:;UkVW:]Il*=_?\ȼvO0?X7Ltf6 xzs/r8KR |xpwybڨ30*f,`G &G63XX?;XX3Mw-{'y酙 |0f#˳w5 v^&3[3M+>s<(=ǼxEGl{"{QgRPJ^ 6TpEDk`̖gbJmE~Oicf/#J^kzҜ JlCQ{#pp̶p󇔏͈ŝTHy"^_<\@%V! ,;4%oFQȋ5dSk p33p:pre:+"xp|N# B&L,4Q3?DP1YZbV3;8 8QJCDdZq?ك]`Pۙ[قľX{ّ ^/j`ꈳӘüXYbZCͅLZ} SQjl`Jfi*3R#ͧ݀Ɩ5#}bfS3|x()982)-Q+eyo}Qŀ-DD?D2}vDU%o6Q#jjk`ÑHFDUL rGѹhY6{=lךWOU||&p,p)p 8#!Qm?"?ӈꙏ7t%jьmw 8Q.\h9`uʬȐٞJ; /2u~3t&`zٷf>r#4q&Gcf+3yznۯk dw?ݯt=W"$o :ݫ%Ն(?5l)3^>te\ l6`ϥU\DVMDqÉN!KfPjr٭y?1|Ȅ2_{f(23J~|0OQPED0zYl b ̬s2ƹx˨`f"j!\6D\Ȥ3"Y~ݷro=&m M&3hR]3!m^wPPED1J!Ss˛+y.pxIK~&]_=1>m.}twկmc.ƊRZ~W?2gau> Lg 3#""saVO9{Q^U3{5!^l `z;@H_+f+"#afÉ >,oyMsm>{xh9 3u"toϊLfȇ4Sᑋxldwxaɨ|ce&H9Bz6)ΉS.Lm٪fǭǯ9G+ǻC@k@XK56iL~@K&KpX[76[Dd4+ɯ|6xQ4O=x/{0o_M*"CefC/0ȼ^|dA,/2<27?^C\9|Lv5rS'Dbf[O|1Ǻ?) ׁMG wqӪ[އKl2{Fg*|DDdVC%Q3 _F`{%51w5+24fqoH}Z3꼈ffӁf~*+; 4S""s25wfQ=AՐ#N[Mwz~af$f?Lr,O #}p F9l{ Qk1?~eDGO5] k*Ow6tnr'CM.y;q,c71iOWUV!:\/5Xv fX|L!^n_'j1> ,,`ywzyYaYc;  Qw{kU_Ӱύ= Smfr9b`;J۝GL'Zw] <'>}fbf+5PL'%Q+o=3r w{mhMJzXh7dO?ڽJ?; ~Z/$:=1d6 _FfkgnC~^Hu/'oRbJ949Պ2Gu:f$뻈kUn]B*Ncf+mw$jW<OܽЙfp8{v2m'0SJF})3!Z;} _0PRĵ׍b D7 /Fֿh@ #k Qrm~l{2h]O:^EqK"SZ|O_{y_suy̮ԇke3b\*L~ A4;5hZeXa%ΤB 3Ŷ6@ܻ,rhv|z_zs'*ԫPgf_k3s.s ,z]o qN8[]/S o}g?YͨCw֯H5]#M+}Aqiߥ4#JUrۛ lmlw96}XYT.g^'pU)'SU>xNm8q/yaf-N}q%rmxF:X.Bth\~[7wHwO4Ml:-ZJs +#G==5}ns/c}zaZ|af8xj|}Ft^GufUE+T,rKN۹ XYxQi)"Ru.,{(X"<:ߩ{>:(ޘxږx}bM@i DfNhءLZok 6o" <yt[e&_,,w-m~4y%c^fvs"^QQh:Z=7|}þk[0Gi5vTZ"`rCatX~:XѤiOP+D%U7SH/īX%jjT~TuQV\;|,:?ө Rhӌ>1A-"i:" _N(VJoV}-N';~ƗLu[IQ`V!ϫyUIiפ Pu<Q+noƥR\O)cKw۾:ݫ{4^Z/4^Y̚Dm+۩ypd"Pp(9㑃8.l.;^ρMi_"^,jni׆zn%_$os;X99'ܬ5Q!EmVܟ/dlѴ<ۮD|zq̀6}ya'"FԀ܍xVh< |5י@+4MixC`hqW_!sgiWu4Lf[vΨ+_osL.V>]~S ]%fmۑKK}|P?Xs5p!QQaQ20_TgaƖ}}}ŶCДL:[VS"v^a߼L+1PkfB: :| zι4:V ־㖫>+/Yߨm1"ش.E iyk12^5t}fݓj~]xKw{1+VV' 8U.Iծ%I嫚>4γV tcpx6"Ӏ *wM*輿|T;V5UO ]lw](I$+D;v2?TZeˊ|D }`S}Zxxe:"bIt2||>i>WZ쬕;"#Z5ȕ*>E<Ժ.R>xxXJr|vWPє7TlK`%.FsA6knUUjxMwp|e8u 4Q[\7,cV,^#57si{X\^'ؤS;Xzs24߻W_]T":}Qg }c!oty֩Sr?T:n*?^cT"m~bb`}CU: J[5XѤiOaF~aC%F3ۊnqsV'~4&%|V5l/$^%:;x7TwY{vS1Mf@3[谴t1oǐ|p`drCS?HP]V3%eO΍DMC0$~תc.Ensr+5~_&CemGk将i4q4+B4M$ӿv?].? "yu/w2V/͟]2SuWwd-Vs]ߟ @wOr_ÙEaƏ"?_OSBiSvc3 X[>`f+%Wc9%E6gsҟ%:U//Kϕum1+3}4LjNvw'i5LGgf 7LsVsC[DIJÈ& ;2oOv {7W_I#9!T=T<t3nvw yKXoo.T l5Pf#pu' 6Nsnsl _gU(}!7)ҟǺ{%;\~uyk+3m,Z{uWN/C>Xg|Nf^Yޜ9@z7UW=vcQ۰[U۬&mݺ3aho5W=hX6HO]f6 TK4 N^ŋ^.~ѭna"2L}D>IM"f>aV]~m$&f-pKțjh`F,v7Ty[&/c 3[5+Zmm6 0C5xv3rqj73Sf 0t붊F!WޏGU>e:{?*-P] ,Iױ bv_DU̼Y QM3`F״] \'FdfѴ)ԭ{&)ZKK/njv`Y)==ls_Um"pѼxf˽8Ygt\$ ODdkm>GK(!Ʀ_ BoeS."_zZ~Im뺛HrMWu3?6|^ |sM)GI6Dmݽn5*vZͦUMQmͬ&Is4♲{҄ 2̹=H4!/t tTwI-pΉV)}|/dj~:~UrzؾL!Ҫ~5&2r/ݸK2HʪC%TV9)׌zH_r/U=bfڬۯnBT=TOfgA~φ^ J!DB~>C4dº?Nr'#lft-٪DG9/3uR$j[B4JSfv ;ۛNQ'R!Et׷{e?o͡R \C{ydpkiVvNiECso7?3ٷ7DG&D`e2I7r$횢qi%RU'vdfTtTO\wvM{ # L =Hrһw cU@WY؉~CyUC]3:\}}FimO2^'UK"Ei3F U޴ @'e'ⅲ7 Pه9ٮEt//e+aVjafԊ.BǚL۵ƛl`J~1x>;ጇ".:7+Z 3Pk#X^Տ}?^j]L6ivfrN$W6F1rFy4769(˽H6LL2b|7f#F_f:}wvmjL M QgkeN?o"}DԼxm*T;&_}9k:ن nw=N!j~cߡp.[16x4a3K,,]D&VWT,^sC1N4gl 3ƈM:7j6壌6Wd+3l/5ju ޹<ݯumΘfVg ̖H# 9?N/~sifvjqN c_sz&:yߠj΅V,u3{ +w_LByZh9AR`{Uч|UNvS.Lv@l/U#)ں1ϣ^X 4V3'XM`ŕ65ggVgG:5Zq'HǼ5*쀷;0f4sC*Mt2;N?!RGG<}-0IHU2іa\ˆ:=s ?YKٗr)uMuӜ^;2j>*7lXC$OJiH2̞W^OW~0WZ+;w!xs# 8Ww~kPS}w~:hrDYEwxojy; dONd# 'uDR\@5^ 70ooɽܛF0Wn^;>ރ3Q(ו*o@D-ƪg*AԞa< `ӨMfHrtOLJ~w?h3\9S{l '%ӹO,U 3w?"U/"BdG+gmoQ/fʶz͍3̾V>NMkr:\MlNK~1瞙cfNUzGD3UKRlQ3sT}͐rչ>&]˯,j,ӓɜkKMAܳܩe͒niwU܏_`f3 sefٟf.+"}6 zU`:Fuú \ >\w}CE:{7%}^n^K&2O,?GRf- _SۙD@igݽ\z~6gal=vUr~$D]ACT?O!:̾:[6~wMtC5^ȫ&4)ǥ;l_rV";JUW/wd?Dd-˝wZf$63{/rFϻ\a}5튀@;;,_u_NrA!^*DപEUe4bU%#b3{ݝh: &nfP4Ժ/fEM6j=/ ~ߜB>ՠʁ@kT]+i$JOtٌl kU0Η nfS7>sOD^1]9gW+e':|8"WW.A1c~i{gSw8JiuXgϊOe&'۬m;҅eh:e@y Qggt?OUTŽ}i0*klӈZUۘEve @y2`>{A^cit_"wֻA^XͻLkWcmJWud}aipjsQw4i4;܄73*rbL#(~Gc":On]voo":Hm}>0e{W6H ]1R.L:]ni]<΁]n{%ᱧ듨sOE:tD3\:o>SA\֭+xU45vDxi/cW:0[;N4=y"`+ҩuyYX2{|ˁ'_ƺ\8EWm֛N>ٚF ~[aEiY5A淇ht]:KẨJi.lmHO"fN`L`f ɜ;|}~ l_#zG4K^]t:Xq١mQxQa'-:c^VפIS4?~wC$̾2K[ӭN7WޚCJgy}]k?tHˈ&щ긵J \ ~uXw?`_1Lʼn0x0s i\-NܧHTuK=T{L)n:tX;DYݢwjOsT!^^Xv6G,Xc=ݽN`6뿢1saǒOl泈m2zsA߯5=M4mrϸ6F\G3cnf%kUDj݅R^H25{GTqekRMY^D^H|C:_M!y^V#}ءwoIOM,ngi7yyq"}~}}#%uJfu+L߯jۿ˦;颖h_D; ,t8f?^ѧ|nJN_M4b/}IS䛛ؠ6&;_IWt6ORnJybi_F4](?lUMOPdl'cʺr 40+5f_p_!#:<>L\?ZlXܚHsXa;isb_Ag/BG7=@ F1d3;h&3(Fݨݏ3#gVꎞ;i>I-:»8'- 83dazmI{w=:N&jmHCܽ<,D`y" sFRԉw>^@m_VDD~gX&` w۠3#""""27Q`EDd>`fgu!X"'-e+}r&""""2)""""""""Ґ4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC 4HC+uԙqz=΄7 8vԙq6XHDDDDDDD!VDDDDDDDDR`EDDDDDDDij.DDDm[u&DDDD{5RȐBX隙MpG ~52i~R7Of0@ Xtw3 <t`YݟC̖w:9f8?ևu0EGG칟;'l:! }45 ̖5}l IDAT)3[fe _fv-p/0#/[}l3X:,p3p€s4o3[M5ۀ7 (rf9b?}n^n2n cf!mq]o 3[mfg:?ef"3;' if9s}G0[if \YXn3*o`6kf#7 4+"""2!/wZˤ 'rovnGB=d3i n*08.T"P'O<\KKUPz5  my5=q0&3jf?WYeJ{>%q/Szz_\8}GJ˿xݟ!툗ˉN;&KTJW͛tm,\JmFaۉ&dNϪ{Szε`Ox{ıs_ ˤkuwmvĽKHCS1oӈ pjŽ}^Ht0]nVH}q6g%T:M-XX➿FZi=XO53gk Yxq=o3[ X=ߑ+;ݽX*Wnc6N5 ayD KTcEDDD&eۧW)/:pLq8'3;l7K'iVMMR~HxpVmcefyfvli{'[3-+}h?O_Nvg*OS df{[BRDG/~w3Qޔ޵ip ,j4]1gىċ;ӼUO٫g!ػǧK0ZM1? :ݘط-MnE3?pU ȴ^_~2ıdq*?D]ı-7p Dl~~)o{,:F=xYq q=7#3=x|gL#1ϐ0m&gJet"X #忎>+OR3[}珤|]lfN9pY|i_K6{XK_%,}qċIlt}Do1]k@3kQsň{J)o/--03DgLV,:=qzmu77Ľ4GH ´HyY8[hzYoxJ,J'm `BSS>WL(;]8*miDˀ|x93>-;acy~!1xyrw4iҤI&MÙ~f~_4|j"FMqL-!Er/T3 Q+ ^AtƷLaiCK9¼Հs!D1f{eݰٗ]x1IJKD&˕),d¼wyˤKTXf3"`xaKt,,+Z"ot8K˝R7l[Ҽ mS{RL_L-jy^;-snB{n?lF,)35Ӽeq8ܾi/J̫Ӽ+seN鳏?@O%j_f=7f%o;EoZ)ץu0o`5s)ÈZHR^_b q^Air?5Sv,, qyna^)ϧ`}u'jF~^gJx`4]iN{DB[Xn4of:7&tZyK0DV ˭Y\qWXstM""""sw(uݿ @T,/T)w?=SvUUKՏо?7 joGi5_OS ީ@Ī._&Oy]K< 1_NhzвWo|DE}>/yO/`7ҼG͕ 5^jf{efr!ڞ]ZnM"ط`oE-yrVa^)@;)g B:3[r[>Y[y\qNIy~rjit Z~!}KR"]x햾oQyJJJ_tFwߍx|Y~`ak#iߴα݉fT5!qkyDgxhq8[jmz/sӼ`Pk٦s:0ou2"@}^t[i^<Ӕ,JwΧf"@:nثλW߯5<"¼ҼSͲV Uyߦ}ۢDDw[6[&+E'MxH//"]>ۄ'"8F3.mfyQUM{ ;HoK4)JoһHJ N@8?Νd޲;|}}ܹsfݹ2U~ 튙b܆+f=k893os.A`5I3L zHW W2/xP^7fd`k7I$27LgN0O ns2}ϔ&ŀ+M)fv@r%w˞zK ~ʸÓ fv[IFߛ$[Uҳ#nsO*UxjxNxUpbBV:*+R.2El{^ƹ1y<@8ٙ06NdCrӭ$}+l_+.I4'|_odKu+ ߋў>c82  &j{EF5_bd}KeO VIV!@%3ۗ_qF:=W)]:|43۟\6R:-31՛u,Yl,OWntVnEFUνj4y­jxܗ$]l` rpĸײBEHc=[E!?-iȘFK1wc?Yq ri\QZãژ22e=S ]8g^Q~w'Wvq:x&izI7} 1 dny_ϲpsshů{۸j'WF9oTgTic +AALʨB A_V\hݻWef[A>s(qce i{IHX^VRV J:w%^+n7*^q,s_rՙMʴWsi`ﳒ3lw`mY L2onU \݇+.L+W9~_??Yeul8ʓ[d.Y?ʼOTQMhFqk7Hں@6攍3,7 7wٯ,e6+(uǧ>6pWpwj헞 ߚguXlse lZ\hORq  z̵_N=KtӠwR\ ̗&y! b;mj/n[j)C<5n5'P_O:„8|YrtxZLS2!_(' (s[N\}qןg`IG:wDٖr)^x;JZZ3l+V*.V{VQd}QNJ&R;3&py6&)JWCu6q1U/1%e[b&onTEj=kNήgv9'_2vA\[Ńqvu+4&yӛow8-SW((}NKu~eRcɗV'bqi{=YKRyKǫz >Tvs#_cfnnq{ TvaW?ȘY+25yeq^A(V  m,̨3lkl2MOn6\ULͩM9x̏GI;:GHVzn!H</'khWucfF{K%#D1Hh}񴣤l_|O)F#''w㓤?ůIgE3[F#ZSʹzj 3+ fn Jڰ. GKJ% a_=V V }+8.|t:L ]y?'y+U{`5p.Yyl̃nɸx#y^Kf+~`#,k,V+t/4ϙʖ'#pL!3_OI:x xIfMEqvD[|l+0Ǥ}<ɾ%{.!߯p˴Lbv֕vf+1L2㞤*i4ʾtbץ$l;sOUsqLX[LmƇCұ+Kuo-oXyXL]9q!n+fI$m!g$=2h~.$[MGqEfmd()nv%܈.e-Vfs ' &&F1*Z% s<$/m8ng)i>I:.u$)']~2W6z4y&G675*OE~u6NNW+MY~קgjR'-AA0ӬfN.uzJROIS2S4IRtN֔z>YLQ 9~i eTA  & R wNH#i+I)m?x_"%ۦt"UIdW봹?o?YtI񵯤gAII?n8m CI?otQ#>r)$x*nIӎg} & BA—wi1`xKl`[``҃Jka@ oQg(ۤD?)`mo>',G_5!.0(Z|}ߗ&q4[ JAf@(Ƙ٣ ֿON, l JS̵0w7f|6MM_ 3{Wjfk0w[{'`/bf"&7BA+߲7%mN>_ T7i)Xj[` u[f#( ^FKfvolz}9B;pǀͬ-} @X>Nۧ(f4:% 9nf6SՁ셒5.ԙşF xߘw!z̾mYwn6k*}T-h@< |2=py{ 3M8ǃұ[,Ɍd `{g-vYq IDAT[I6.T#x?O%ES〣O 3v!5 8%=+^v}<6G 6HVǯk`: g6S`;:HIs̩;x!)mj (Zmt/I/JzNҿ$-~<PIߛE ΖtpΏ;st?~k"ia\a6 {0*) *pgF|ގHJ|{ߧ`z2Gx'mV3qEhvVt;Q\bǸcK`T㕛-W3>1W~fKeۦܞ}RrTM,O$G~'OҭW\ })>ɛ nѓ::$Ε xPΒ+ Uv'ՐOgʮLΐ+R8WTOH}=PNv޹pcse-Po*[?,ʖHe]xp;Ћ߫ʔ _[eJm+ޠTvp*2Wo'ܢ%~\GGsI\ 7WTo\ҩ\p%, | ̚+!]yנּ{ C"pTvDj*ǽSn}qh#>O~@>/HXA翖3w2fs=*$㙒:nHW\+WO'wCȥ6o%ݍOn^uƇK̓+L[+ W0I(!xK%~#i.3{ʾgff~OqNGKz"մq0%][ndA暓at^:ߑRW!О-懸ESmU_+/`kwMy7}_kfS>-2^)1xƝqK{̃f܍+q'pswgkw煱ng'W'}h@pkV4𢤙qe s m*//r3|O<wy'W?naf}$R~|+"<ٽ=;7 OA7nAsId"B<IWzzƬN7~Bdn,J1{bBy+#7D={LOZDZwy]K) ʵ_+kW ^&c.-jN`91*L%(>y+[[T Izǻ8o$P6\yof e1XC8cI[|ܢi+3o/3**Ig+t%Abn';ot'GUE\ {?; (ٵy6.Lyw)0ǐ41C IkՒ!CXT9kf')x`SӞ/ ee9J}ONOS:g&,Ʋgor32W PTc';$e+8$Z?>NT&tyYw&)8V!i!}=CahAweI)TO6'\ЮXx>knO1C6SގE^_8 ƕ+q $VȬ MߋNfO3411:[=ǜ> J[_],Ve֬tb3FԸp3pn[Hj{]SF#%}ϠtsK:lf$~M㷬t,_#dڂB_,߫Hz l\cfY^4V_JzXŻRsnR eJeӶ8?'d}"; `fK: sڃfeW c\ƭ~2˔M_Y}vڃ+o 93}I`~IJ_JZ$)peNIv8^p`SIoʍʞ?Y_M$Y% )%A7kT  ,yݛ&kG)~ f6a0]n^:ڀ5}dQ"nEs=<ѝxRI4Ge%M'@\A2E1q Cf3<`K>|*ഊnYp; d<5g%]+tcfï\ltNQfB'́!Gt>Iߤ`e23{W-.BO⊦xt͎rnoqeb&=]/T"g\Mjk*kIqiĭ攴*~/Ej1 +}P*eIJZc2X8Y}x-IS'ˏ𴿳axܯ-2㔜 +sn+QŞƟMp7y~+F.0Cq]OesK)wK<M27Rtm!Y+Nc[<Tyhmh{ܒuzf6v=yx̞K\+RY3,ކ+VcL i`tm6CIGK35^ 0M||o 4$feff/|:1f<^4,J FXAA5I. 3!Rf]-䆙 APX    "X    "X    "X    "X    "X    "X    "X    "-@0ibf5[I32L*^^͖cRn&  `2',V    H(V    H(V    HX z54` }St[K[AA$O(V  Fk20'00>;M튖π:,4AAAPA]RWdwih7ct1Ǵ+Z.iik;  &BBAZdzҤKG-M%  b% RW,>K)DG   h.X hT`\% ͔k"&+AA9X iTJX#A  ɜPALBV*J3KSAA%+A)CiWL&Cbe"Ffne)CT@_39mwOҬf6Q'4}V(+7f4zmߛ.p /0lYƇͤaIfSY{B4[ qZ+%[+}[+k'm J3@RIwc{3IjM{?>./IKx<%͟~t"pzު ,\e%] O$&8`4pD/$|(if˒!k%m@>,XIvzP5ZYY=7!CPX $pɶ<͕)@§ A(Vz$]`fwC{CvC{ͷx0Wtq%擄x~=>Hfp@%}j~o^1'4/~MK\i9xI"1 \Qno \L{BfjV,zܮ#of=,id34N(V zJ_`M|+`Jyz-mm"BK[W@}[++Yzښ`D"*Βf^7u>o 3#4z}#Ih4=pae}& 1^>e-J'?nղGO+Uȳ f62LTH(V DkXWl nD| <8/+V>EUWT_@E2IrL8 0>$pe(3{1 įV|&? 5[TgZto{iuBqלscFVg [3%ia㞢bz7-6ßZ;Ol {ưB1cXfvO+l`;\o36r9A3$mcO/~&jfvi e/d}8P2΂e|0ܘrȳ67n, j;h>kDEkzkrp+lÀE[~ֶKK[Zچ=T z41Z!E'=(#exRܶx=-\Iأ߿?v́q7Gi9mGiŃKA_OOغ ~+ &HZ_%6'\ylLؿIVuԊ+Kʀ QJm85ta.x\H7J<;wI?*7n-".NrdlkB6ǃU ^ާOt֒t޷Hy)smW~r}yhÞ*F>턏a˧kWnK۳1ltMǯJu%ϱS$ X{7\XG%NUß{hwt(p0Wjg6Iac⊎rgkXKU9~ ] ܖuƔ!x=7Ƽ,)xy W]]BeXcfLc͖'>Ϥd.0`K xɟ/0`%d/0`f_(e?n`T㕛}^/G~ߕj \pA\|er{zE\1ߋɬE_WvHN<>(n*W͟8ǩpı|[+V㊉qe 횎ْ+;7{-:Opu\qKJi ˷ϖeAnh=ݸPw8ʴ\S9BީRuQw0{*:풫w n>!Y5WK*ۣp~S#qeud_ϗ͐$f*-]- ʮ\e~ȕn­Ef5ÕyR׶p}{1ܚg\<ݚ+[;; X0.\w pTrelAgs1_l ǰ8e$M)a>1Y cHYS=0_}|y+ [V}rs=\JCQ2-O߿M,+kMegSR*j֏Sѩ~vOXAL@Z+EZ+3󀥚 $-mmZچQ-mmlL`$FG/hb>`aIGHcf?lof7$egl~4g\, f2%Md5I{%lR H=uq1+|߹gp˂f6 _1^ O3`<u ӣs7-l[Kd;wɛ_86YN`n"c][Adf4 _Ȏ,YAT:f.YrYH>u+p~3%u.]v#H1Rr}pk\y͒矛q+玛ޠFGoY=[OD,35q!+O-ws1wKX_RfJKڛKҪ#B,":cب<3t^ưsc/ cǸ2ineܒCt>E}y;}\'| eFUtcO9;W5MtSfH IDATk6<} na+o{G'd @X fR-.gWN[^j A0lYH_t4 1 ܁ >!;̮l3{wa+'}2@QA@w;kwpB'O]4A3mOX3W㫼Y8' %fv[=dV] X V̆}#Q|y!̞tnp=q_t7"tv]A6qEO1!baq-vݕN #$N B_þb"S%St2|@Gp Ṳ2uu,(Me%+S 5hWQvoĕez60Mxl{$] gv| ;Nnp W.ưYp+r&?FdbS;8 M Ooxc1|3l0LO+ioܕiLT—3=l'VҀ$E+2,PwV-Ê"xm/',V JeJX|EjzNRH-mmR%8W>d7?y૜WHL<c(atp9?f7J>_q@6j"aB$ UJN~tyLҏ"+~Pdۢ#pws1ca]I|rYPL4 Ms=&ߥ S;oOFe9ﳙh1U`w,>7i,IgD~WָAxJFP0q#~Ⱦil ;^þx.h[(VVr|Y|+R>/[!?uLY}lj{KIi#Lv6&{ p*\i\i::4Kk4<%'tֵX'Z}'owb13E2=L(V :Ikfk2Y_e#ܔt3`pK[ێ-mmjik) q$[Z:G=Pj83AEAjOk;"גv~=q.˜ti)b^$-&0Y ՞>kI[SfcwL=>gp>`?gʘ8,gA8&ۂJ:WgMx:=ؑ|\1sl "':7$ Wx 2׈,5@ҠNх![o?oP,?xΟK?>k#3(lWDU%ݑxfZ C$Lf<>'vܐ5]JRgJ9JQ9%o\1{K^ҙnH{jlj,^Ixݙt+&ߧzJڰA$+A ZZ܎5}7fiik۹톖^wJlxJ*Z*R| 32MIm t% ,=N'/L#K+J= Aw'7__'aJh>Ejc|r895]e" 9놧pW3 W'‘I+#V6a3'5x*M661#MWfU +=5dɎu?>9(W VY@Ҏx6xfdTWJ 1ر"L&&6N+Gi$RvKx06x\"gW)Z>~/BY9O6p?li;cR|$Mo x0XUE*?3Kv@M9{gS ٿ$+iFJ*(]ۀ%]3<3ZҾ JE[X\c'Kレ ]#|Ƹc؁fvUÎ| lP2-F~_gR2]8ݽN=_gCd9R5a/qָw}_)_ \JNBҞr£q,@ 涃 `@ҏJ>W%b%ɞJE+f:iik ɒLfA'+ALִV*KVW7yQK[ۻn%Hn 1IrNnv^Y&@*)SN3 8eJUo mz@R?`(+ +&T_ `tALV*SV*Ҟ;PAt4P"E}x^Ss%M3HHZdxW:ْbu+{ʎ7}Y(`fi5P-`0ݸ(ip3)i-8E5Y$ǁF*w}&e _wyxJ `RR ?Gpnr^(U[x W6>7GW'D]N?Tز*ٗf]`1X7z ('l%~ ^7R1ڡ;Lpc7c4=&=[6Z3;zBȒ'wvL/)̶5?wǀ':+G=CXA0Z_OWǗӀ[:Am\ Q' ㋙]*iĈb`HI+KCZIkU|w/$]V>4fdQ%-FGeԫU~}14|//ğm%9>-5]U(ޯG}-nu{ɮ!Y̶8ytnt}V}ufWoVoH3ku>A4FA0Z<+U>WRkiku(U`'6C;Ippo?J%홶 O| I7KZ(98OKy1wŬJ&HZWn|ǿ% u0pQF>xp?ӤvVt EM+ENȉ pOZ1we<~,J|K)R@4 l(/RiKRs$6*+s!kKj:IuzO~V-U$ S෸K]fL PW92H7+H:W S[wï{Iƭ14g¯pqӒqfEηJ*QIvft1 p` %.H جR"]`[Retm_ v/|5 0+>/&_YKa0O> 0%ɀ \2`fS|z[͝*rϫ2m`p\`q%6:/mp_&-`'?_s7x.R8 W'ýu߿Om-+ xŴO&)d\%߃q˃Fw+X<=5nE4nICse/[4W~*[.w1%"\:;0ɊfeYl8Nݒ` D h%XІqܹ3cy[nU;NIs3`\SyBL?(MxX0ϻkҚRڍ)mɔ ]J;G7]Ie>,Ʀ?k~W5\Υ8l.W)<|~σk\F{Q܁p^:{Ų^.)V/ &}\,K5wD.mvU.mT= 8.K.TK; ۾BZ^ 7 =/t+ALV4J /һvh*i*{,@5 _vUAhitL[ϓ j) ^3C.iw`7|5R1~]y GmÅg—Mͬ*GN(iE`fZ+28%i_5s}i>ىz2S\T),x3{>1p#Z+IasR{7ƵKfYef/Y)ffv O21ʗq%S83{|nfS`EEW43{JR?} #WQ~(w7gOߛfmkL07wzpZj\G_sCHWG}7SBޤ8?Åp5CMˣv7M;t.d;|21\e33 2c%ɆRi|A1|T.~A<$EFŏ$: ->4;Jw6C e•"cq3 fqG;1$G=Zw!VS2\sۀ %I u$8Z{rM5:N\go\adz ͏kA܎ 2VLUhIGY _ᴇp3%qӍ>6NٶMȥeRɯy״ZqxrpAgR{.VLǵ5&afըBv;ͅ/ iuN_tV[ni>,.ʫ0I[}AtX `\*h..{B{%߄P%f0IswpZ%HZ7mxv"r#R2(~>訌S;ÒHk?т/9쐴`]/ fNiv͹*_e'mfPϖj4D&VisW}V Dz/ImIPͧ*QQ$cBbߎ}Tm/NcX }#܃ sA-©c4R} !o 4ͥB(`'`r2A;HR fv9{L'Yq墰ԃy-C|JK$ӚHKÅ=Y\fm.R\N-k, .Sr IZ̮u1Lm wR y7kv7M>NipÕƳj<ȇgcnNtG'ڹ t7Ie}xVZsIVGJˮgt\ajY0< dI踯: IDATnB9t]#i5/g}20̞Qs$-ϏD6<%탏oMIl|,ts)UfyIIKz7ti~Uw;=i6kIiS݇٩9=5ՙRq9AOsuGVҹN[IMju:PA8!X `@\*M\M:X\.: 1}t%/ < !ivIB-VwmC_;|7/zx0KҸ3ӹx(4-noTGte'\ԆhÁ3\H?L pqizԆ1rUOyШ+])ZI.IVGINv+ 9yu|,)~2Y<)w{0c^IM4_Hv6J}C\C詈Q)Q >64_j_ ?IG(&u|HB零WC0I$iF95pTq~]\sfq hZtώGyxG%ͳLT̞M|l.M6J3N"o+9l,dmo ƅEo㑀V5YJŸ &f;ck:/+]փ{}tsI?Os9=.}ƵffOHvT\^ ,lXtQm6`q t! LsΜAښ,ك hd$p=EwZ=G/iE3۬/W>I̬^pp$҆BvH2APR{؎V`rƵ*ޢ,lK;z^_=>h z(7|}%T)֛GBoaL)PRi1\ͼB!T E%]!id68Տ)͒69$-/M   HV W4JG5WMe nRAAAUBAT8 ب\M   IV 4J;wԷuܤ    J}Ns)pNN}X\~M   A\*\BG+P%  $+Aͥ t>rƷ*  ~BA\*-S~VAAAtA\* 4VAAAtX Wi.fnf7;P%  DV 5Kp=0G'Oآ\VAAAtAЛ ,s6l*=О   n zRi`N nSi4)  ۄ`%TZ8fSa4)  !`%T \LщVo*VAAA4Ac4JC$݉T.3   h=&X4r驺 q'T.C   h( HG-gCK[23Gs:pD'OYSPO'  'h`EHN`Tcfv "iFAT =c.j*&AAAX = 9 = 'iD\*:qn=Ӣ HRT}ݎz3c_?"i8Bj=z iկH!ip_#&C\$IE`AX?6n*A0@`]Z7f7Mܹ?O[=zDҴθ^`>mP?BrXn<Ѓu&ie3ꩣS?ů{4@<8ZRiLWHmf41ZlB7]oۆ/t}AE-X;-I~~CKs(m}+uMM=Ԥ f*w`(0̞t0X6('Ic9/2 Eޮ"i}ްVƻ[PW$ ٗ..9z.`0/$lpA-{9;pakAڅۀ}EH%sMl¡~wf]yZ7124 34Tbf6U /_? (ͥQ8_M=Ԥ 67% DP`9E 6I+K^REڒ&IM!i+II,iI$(5In.iIhER$-)itS%i IM%iTB J1}Kc$m^X撆$iwT_:gR[||C$)ikISW(g46{HZVҰi4[otl-$ZoCIsqX6͓Ne%Tb1uye=&#RڒN3p|g3҆JX΁4SGm6yip\0 ISw7E,=% qcKZAT+ٻf1 LT|7{!3;0 ` |815iSlOc?ʏ\,ܲpeU*,LL "%qI{Jg ˻&8H r5p%M OKZ0 Q:ct ՝$s/_}<k& AO+<[!]󣒎αxLǎĵ#)tVI}1j,ߤ_kY>4K9]帏$m cQ|]xDR54>`juI/ϱU.M\ yC. } P8$> `ZI^ǵfJi;`Vig}Jj^3+<IsgG$|dBQ1]Oo?s`L*g>IWqv)W`A9`WB3."izAP3}d_'>Æm1~0ns|o+?^tԟva1)}x2Me ̑Ji{\=_`LNJ睗K;8k6;wN;)]QpaT!KV\c|yr"\]P|P.)7 0aBoeiSᩜұ#ӱsҮÝ 3sB1ps(|~ (g. Y"}* }h.)4+t>ρQ#q.mJq\k4Ǟơ[{)S\Fi{|? XR~J%$]&EҶnCCs4 Npt5'ɋ n:;՗;(<3{=P%wd.;L^>ZMHsvp-ٹ+摎̛eZU_Pޙ%DkAsGJ#>TK\#ߟœ q֩fn \ a\9kըwn`?IKk('3˴;5w&\$#3Kɛdlf_fRJ{d^27||>JfUwtHwܼ)ɳ\N̕SOgfvu.3vp:oB҄Jdc54p!V8צ97|ʟ X6ia.7CSAt Vp֓*5jI-3vt4lO iz˼q팗p p :ٞnvX>[S+0~;}w9[}kpgCVcj!=*,OmNKN#잪 5vM6t&WCrYfVt.D˓jl|A1;L(0]7$$T`t(oUBƹ]UWwެ$]X)*][?6"] l[ҏ=lfgIZ$e_C ^5k0Vb7:MÒ֫cNAtބd?"鷹cR;e3XYB=Ԗ zRiU*ۿW㜦rAL"5npy(Gt)^UHia 6*|>N{bG; [+=M!= U !T[퐴n~1'YЮ*MB*U;ͽXNyz_^9/I\OLYc UivÅ;ErD{uun6U{qV5 m)iP-YI*83 h HZs~#>'n;:ZC1Ai.꘰}Aԍ=Rcl)iCI?Liۥd@s<.x^Ri6ό9<~K}$m& ܬ$gw&*jAk;<6fL]܉JΗtÒC٢)Wl i{ZCbDuV;̹7{JU5ʝ~ɏYVV]%>hfm|y_d%dV~==Y]pI5~;gkx /fAtF Vޣ?-iu3 Vf%=\J~\ a.c|W+K$mT^_B㒐`A|ւxq/. w[&-֒VN&B{$3%̒t==g3{51;n2 I%P!ɺ +9shJ0gRF/삛Q t.jxOq婌uqGwyY`>%q%m|?շqfu 3g| /fJLy9ygbfVVjW u<:,He= ~k:)6'HO> {I$"&?wW2wӵm;I[:֮e"i?~}X_ IҺݙ"=ȳfV]CҰ*>̾iVRC&Ap3;uDpmZ3;56# 3qz z[I}\U AY cI=5=~C nQI&Pɕ㋯]Xk4'?G2S73і=MI=MC+f;IvC;kI+;zjw7NkUnZP\9g8`rT/:8\ ge_6$1x%qSuA=HC+ɞq ܑ-q㪱-ɦ+|{ުI@uAcT.ٓ $G;%sL&?_⛈1[}AAh}&'y*f68u |IhwRije^~Sm ({Nwu@W՗_A0h#MM)rEzib9(sچŭM}g HZ!0f0bII:ՐzfȜ 2I:1#ihOO"gd!ޭyQsZL.HH3%q.;ww+2L.0!C.Fs4-mQwoz-A=pq #Szup_)"i xW:1$- <,`3;X3ᡐ{ISᡟ f{<) ߭#\> 06=38 vKH9%c^.I!3uz-]6)-㓯˙ϧoᎡ3SO)YbCoy),sqp^r! 4Kxp|0nRХ(@.A+T.?ғ !>3K5Jw~"iD-, L0 `\0K; 29axwY=_Z.)[׼I(\s~Q&hd%I|nu\/s᳎21p!ܙ'x'fvoQ`3&w|EC\aɅE6 󶡘ٿ$ MWG<%k|~ hf3Ai`ewo 9n^&O. ظ ͥh`:V=`afoH_ IDATP! I?hP=oIsoIÁu-:migcfOJza#3I@ffVO&v3;K~S]=-)_OLNafwQCA* ž%p1070 N;Tz-B}[5_W$$ #=-i gr&7lٞ=Վ4Zr+~M\چ>IcK/lR3{Z>Iw7%A0&rlLAi']O}]-m[`[Yq֢u̍E_P8料]5H|X7*$(>; >y32pU- ٫6kԙ"pRAf5ͥHV ~I__7#~xmS^,J'ia3%W+3zHJgGyρ_O lGK|4*=K[lf*f唀?臨7mz}7{7K׸"(nr{y5E9|sOnW|mf/k7}ifP$͗E|&u=H& :f |[7x9JHIҺY%3L\C璟Ol\U\{Lgf91pwq$- ,]q.]7MZ8ϭ=Y逕p-'v}#.F8 1NҮ@3p)F,ΩgfU:0m}-33\Y\pyfRor`&CS9#ϴgz'A>069Bg2s\9pfxr}Vi3+CRX?xήL:$_ 30g*Z3"8ܴM ϼeݓUgc-鹳*n2u[S7 .x̞Z; pHH6 !{)?Kz@ L Q;%Mrl Nr>1p#pP0|1>>r\?^8;*gN~a|r8hZGšp ӹ?ǵEf%= E2B2XCүӁ;\5MI(.gǝ_OM3qÁg$-X^$ 96PAR"<ע-vI]Vm؆ZZ$ Ks `'w;/I ${pwZy%2w! p1p2-ɸ>'y-:!Jm:iC^_KoIcu 4V8rlcTG(Ni.]ϭ'$p|]`<0I91DѴ͠tίx> H:ܠNp7G;:7URs௒S۞/g \smd*gy}?Hy4zۗ+giVZ\@s p*.xA.&>mދsϔÀ$mT8&>f#.IZ+I挻8k"ps+ŸhqW1qϞywI7IPo|<ŅwJzY ʙI3~ذa?lfau/[:{ `uMNAE36kJuܓRq;xk8ssSriZ&[Ҧ__w ~ X:sZ]'\Z0~X!͉^Ay3s+Ow\ ]=_3F *&3~ l~5[Y?յP=C}Y.)e\hqGgN nR*0,ש};+qCq-upZ.opǠ\Rri3Jsi&`!\8UR3A3m.T3$v[746*P)}ڳ_ʷ`!T.@jR0[!C\In_(4?)vd*泹B;.J]ޅk:g7ӆ)}o;rɔ8RJ 7;0kQIiK|W|+vۧ+%.IGI:V _D|rKHqKؼx cG\=\T.#A7_N32YXGa޼%XcvdN;U;1;'Rx,LB^#;v$*Sӟ&l {Ұ$w[W*E>kfW_h#Ѽ |1x 3{13{.HK\۷>Ju,-yqefك$iP|q79|dq C+Z*~K펹 qyS [_i;\#cF\(4kϞse_|.m72Zfs$3lfD/Zޝ&i4*nt:GyBsᡷ7He0u]MYl< gf]/32n셏馹q¥ɺ2M"uCf.:(MlNjf;.T̛dL칝$ "i^\Lw ?( iE _+APRiRZA9wjfٯSp B⚿f$݃;!:W>9LgT:̾Q-np:ǴҪEy OߙjXdnG$0G% -mvP$~3{ٟFX Tuvom Mdk<nz}>t;.ę_(13@Uh1IӘه)4oMz{*oZָI6JB₋<M]f>\1!}7*5/&'&¬Rd΋>]\ ^fU1ߧrV…|&sпҳ$I3i[3p͞G%ȕ(.)Iza9_0ݠ3_Jq?Nq %-a; Ξ[mf kR 7o7/X_~!\mB.m.E  ޡogg{fb2:pȓ+ U 6e\ əi+M (~pao3 |#Fonr1E!={a~|kF<^kVgZO9^̮k ^PS;JPiMip޴ѯ7c"S\ :m 3Z76GWWm,}ҒN o|W{u̞&AUƩmzH[`*utU$ 4c3\I3%xKkdUhw;?]׌Y_!Pe K)IcwA]NP|/6H컋}qcכ>Vr'uvC` nnXO9h4Z4pmbf'9\f)c$9dGs3KWT6 z3TTN*&Ե+Tެq^?!={Qjn2GRωx ^K[HZ)PBjfG- ~<-0N+l3?^K[U(wayTbbDWoΡJu a0(YQUjOqւ??kIڊ8k<ٟ5/hs9s({}UW_afk>fdf/L̜YxFJ;8T;κi6oZ!&=ؿ/$I fBI#$-- kB# ɘΨ`Jq;%m"ܙ>xLa=S,ޗm?Ҏx+s9PO9q!M]7!IikJZ'}#<[xfϏLp4>EwƟ9ܜK;?MU~Ew;4Ous$= "\uK@YH7iQ_>y X tp Ϋ>)j#i퉏o$݁ yJ<#i3y(tl=Y*\v}ίq36<{g\C%[` Ls͜s3{6;W}!=B\LN}5gx\2>QM m´=wX~tx2}zv^EVq݇k(i[7KZy,.|h`\΃k-BIJ:R˝w ţ u{-X Fgv}|}J7F- y#G?G0C A]TZV'`S|Wق 37O_\;c|dp\u;|qnI¤]Q) u`~IJ1ջtf?.inL}ϳ;&j^%~ _flkS₁2#+ayjz9 H8Oy5rZ_>?@x$:^9qoҵI?ވC/ ϔi=SRQU+i|,cT$t(ВʽR*ʒ\(<]{ښ G;G؃q]hIL8p\ Z?5?C_ L[ 3*8rl6.!]ef㬧iq)ִ:!1T;7WƱ Sf) 4JAS|cO'.5ŭfVkM,AQ]~\Ka 3~k܉|@WY=_Y.3C ~QZKZ}"j<x|_.ͥ2i=\Ճ pHZ7Rx:ATr3<x$}pK⎍G江] {^X0{cq`pG7u|l_:8uuOŊLg"T.phA$9;%} n2L${w^ KT+ޱ{/_^Ҿ ɉRi< E=\ԃ 3$jG 1wX7igmxQ d=4W!}g06:T):2<hH%lfo7$Sv~5y }!x V~ ,a{g-|xi AAk*ht8%v**<,)mtr"ӆyI  Zo+I 湻[^_ i!~x+9vDҌ~o Vմ4c𰬻Ǒ?')mJjh@;T Gۤ<zQW}ݞ o }+.1TC^JjHHY Tؼ&|A 3%Sl.:U 4BM` ۘ_gH C0 Rԋ&03m7.//zsipA\tmȋ+s0⽘@w5ڇM ~K1Jg4a𫊙mfIz` Kܓw=T.֋VAoq%f l 1g(O=3+|m?B{YgUjS†`fwmМ.af15\Z~2wQޫ= ohif/53{{!"|vٸTWq4۳S6d췙=M`r;;+%+X9XVI?𜤻% [𝥹Th3=؜ ^GҬ 'YZڄGߵϪb_`_6.HYk\SJZO/RZ{1=U~ḇBZ l)Kc&F,$iA`9\f~.@bIkPA]W<\lAIѪ0FybIc5A&M5,?E8QM3C I^L1+ VM^n/j+H*˦<7fHQ!V5JUmISZÁZf{ +3d6ŁqCO:f͋|Q IDATfjZϗ I+ߚY^ҘեyT'i`1`_kǙ:)3-KGo/V4?7T)̱js޾BwuW~65ؘb01`z BB@ =HB !^D {ok0 }?YkMҕ%>}4;;3;3w)s^74OX`3|R``+_fF/J/'?IGߚql8][:[+i(]-iʌE:ogms$/¯\>>[SIZX6/(_+ർgI#޿S8A`35Zx>1שּVM׹ǵڝHtFcŀ$.BIgK:Gҹ΋.IW!Dc5V'MNf?{3{hh`IRi6`:}%B|q.<@ɸIC7$;;gå9K3pX %]; aK6Ip׸fZt1nᜟyWM%7Kx lY-KI h\>)zi?ܙ׸iIe`RYgոx7Wjp&~k3ݵ'HZ]ҿpz!\K\Uܝ[Q{4XVұZ.v5GI,-(:e`{IMUQIŜ/\2`ɥ݉k߽W0"z;}.ҮxF.mH۸PޛfK>;k?/tw\ 9K9Y~~ϡ>W};o)˜}}}Z!~.0m„ijJKb,b? >?myX~7 1w:o;5GNU>fioIl|3qqNWafEfvddvNç>' lK"ѣi.wꡅ2NDbr%TyS<ΥeƧk^bǬ k|[ KK=v۳g].p8?WX|cQgfX…P8xښB\*>X ,%iI߯Ze~u~iDOJ#ɬx+4fv2!kl{Y+PZ~nxp-J$/Y:жr Ƶϐ恏|<ʤ}|k LG#W}UH^#>Ojǹu̻fv9+Ӈ3Ņ33ӳLcl0.H뗛׾x/y"WϣZ<}i nrv[}k[ βHP8.̖\$t=Qh)~3̬ERힳqf"1%p,G僮lL"H0'ג^4>u*3{IRyEpqg)_^t~(0Է9f]&|Xn,`Z` \((}݆?Ӂ&IGY5S Eۚa^55  .ty{ە܈k dBq-syT:\rחL[G{J%iSe8ܐpfps%]6nIR?I;㾚S5=riW6vom%d N Vp 3{Uҝatn<- ?rls=T;[΅kOq|O2aCg4Vs/^LhDI*,7/X)gbTZ1-}"HLId ^;$ \+ 3ۃ}I71x's9Hx@?Vɓ=rj>s?ŵn mFﺿD_pSeNB3Txu|DHZ1-'u;3JG҆kf;.Ȩ[09!}}%pkŀ%]#dl>HSoVnk̂[A-iSMw'. .RW,CIc=1I VQ+xanowO⪬sϔtkIrmmvɘڑ46ĔFp/x сAVsح7! 4-Ϗ]+Q'ҪΞ7)af77ݺZC#\l!iN`0:XXO, doC6Hw#K4.H<.+h4q2 J#a,ds=o֓֜@􊄦f/!,nz7&tv|^-3+slNx4CxY=?u"{ ytD"Xzدq;]p'i'_ЃBr4nP+K$&kKhQoq|D"19NK{_lZƏ<)Fz ⋶Ori6h}/+.D}lcj/>=X($YtM4Bk1nr>lk60b8 ãfNH9G\7 X^[p߁Z-xʜwJϷ^ğƛH)u_'P͕ZX*+իFJ?rg&+XH9#p͛JÖ́cޱxe|&!dT'YFHJ5;9pwCp5Ko[ =$-i^IZLў r_Q_hfOdל}HǢI­s2/;K !m|/4"sk/.r/gC,3ke!iyy.f +J,N,V'C[9Ͱ2.6gǫ l2ђ6tg͎:}W3G0ޯx?ΗmOq$i;\8J:N,IB-Q1ձdxسch Ӧb>G2Gw=#$eEZ^FvExnGs3ǹǹkp{$]'W/n%!ܧY]R f~L!9S*k\}ゖ+%=(we@7ŧV"1YVjf{w{-S4qAˢfvoi"1iwSg2H$_@Af8@DX_ ¥pzg\b$.`ذFW p핝7oR%0g%͊5J:(-8+1]1c=/_ V1>]| ظ_݂'Cm‘fܿS6S#$u?|֎k>vGIZ%*w07'l?xhME_Vfvg'Y _~"P3tqͩg,ӛ1H ąɷq$uffpb [:pgoI+=)1]7[/7rɌ,ѵyI\{ .9,2FҾD?鿕ha#9$mX77\wN|yTq5_b C7qYwv%{)4}axwA3Fs}V`ӺIdi !{ߞou=cM*E>IL$+|C4j]g6J lWR/жuO 꽎jBG>VOop} ap}Tx#8'!1i1YhHF҉ܡ$[nkHLMBH$+SKu"cG$<.J]uTYD/|6 UD} *a({bU4ІĤTLup#I\t)3ۭىdHs4 vrXSKKxD"HCfn4]\.'Y%'ĉ)Ik>a$ X4%%--i\ʒn;49/.T[n̾q{Uo"1 p>GJ$DHZVH+%eftw#=J$&Wm ~'\א ۠:~-n{"1\*;ԫCZZҏl"H$:=ff;l̾vM$sDт>yH;q80- ^6mP_j*]jPDT P/#ZZn$ĤY$H'5E)R-2UG˝RIjT c4<A OLH+i9;N֢Ye>k04i'HKWX$>Ҡ:̾^Z#a%IR~lQ~ӭ* i]_7˺{:C?g$̀x6n7ݖ#6Fl)wi?-,.<3;eWg:f_˜ 'p'=Icvy21 3艜B/=_Ҫ͕H$S,<mffkvK%f6&U#`fjn B@!۲Ik&e#-c>jt]z9I 6p#ߘ̞튲{2aqX35+4*]u5Tbf/gpH[94PR/DG?P0F՗HDKqʟZZ>$$HrZ 1RP+3IpN"|Xl33Ot=~K1f@W9X 8Ӯ(Ń|tSvn8NE\781³ˁ*E$D W%Mof_r9tv)W;I'~ɊR/sX4.jN"HXBsvyܴ~3;<.?pP YK%M l| ܝ X x x &K{&=-ia`rZ2jܫoÒ>4 j`m4pg[XHAf6BQ%/L~׃id/h[fVN+ kG? t~%`^}&-x&ٛq|f`]\bߍ 6HZXe]Xx4b~0Xte\Ib`I+>*Zh$Ԣ]6\ Lc_ϘI*+ K/~5 877lg[Ӈ=up_F,I+\)i.ؼ0VSss~*}$>މ"xxcfwUSsસ_qF?[ܚI=,iD)|{˥zWoE= ͸0`H(͖Wnu S:q!hOƟ n IDATĵqf廧LpA카qîo|aneH_'NqF#m(&wFޡQ(+Å|Ey~sm=\ pܯsisݞKp\Su'qzέQ7"vi!8㾛v̥ގ&Iٴ5ղ9Ҏ6 iGDҹpz#\#3Cpro\Ha̹|+.doƫZK^5TQƙCiFAJ.yv>e⼱O:lg.7vp]!߹'W*+1pSb{39sԸ̙1 w*|d%;?\03U.ȷS.mYm~lɥEyŎA3kJHǥ}p=:Y:U0IIyU7S)O"1\*EOS)?(D"1 W[?ߕ>w9ֲ f ,&@IM2Kk5˜m 5ڴuh^5,zsD{0GҺz3;=fh;R#ѹ$dk4\j<'"VVfvo%4#<߼lN ^h5|cJkkf M Sr<.v.Vs_q#3P@I;l"RNfVTeW]\=ӑ̟p_rpSKKmD'#i_B3EqG3b8g{KoaY8-ͥM&?hMff&B;_OLͽ}%|ÄRߐ+\cYn2$dfM1?3Ʉz(ڒEY|+~`B2 N3+kjG+Wgem! `$]>ة[ kSQ\.RMɮaX1}/._XcU\Sا:8cU~r6Þgjowq?-ąTE߂Iv6+]T(އpa]UF᧮wOq׬3)!$̆Ќv[%ی3{Sg,_9,_ |3z&IU4wM02ܵnXђ^VnkԚ wzMzD+KY&ڱLW޵k"wB{Bp5$-af˝z j8iK$&%KpJfI$&'Kp?c=ZZz ^"H43T|@"f9Ẉ Ž*VއH{5,r[,Vw4_-gPsIjU1{Q'1 pGKP\0yE';Dȓ(^ϛHv?BY=7O Gɓ-xM%|ZJ}*+k$'J5 eώ.3L`fν$ff;U=f?{wb߿.ӦB!\4Je毼0h|Evo|l u4+5wkܕ#ow绲zh`ߴmqufa3{Ô퀇]׌Y.5M$&3Nwu̦jgK$ɒÞ{e. ySʔ3A35l3۲{*V̏a}34&"ۍee/̾GGړ 6 %m/v"L6l#}=p%MEMtU|?)5A\F|{tntVycNZ<{w~ydhd U͜>LhwEmVH7uyޑLl ,0(|ȷ){R Kq+ß۸pgaC;-iFwŴUp?Fj}5? 2b.-7>#Ǜ;7wC`+3{|5^q4wk^3v+V%pe8.$J(#]pIyfnlg>|,om}{X+Ls_NkU܏Jlz {0;3U3W3{G߬_(i2GHטY{Uq3RFʇ~,O6I%2ͥҦ5<_"HLvIWC kf Zq2'Į-LwbY(vt%/6(gjricYoBVt%-i_vn|o)ÚR gēڇ%*&܉U*i[񘂹f.`pZV+oA]}&v6M_HnfEO{6Jri³~ iUQD/30>+)sf9>6n3#ø%-]b#Iqww9@DxH𓲾QJ;LOXl/F. @W#Oō;.l1-Ԩ080Au03fPZen[lw80 pUΑt?+|p[$݌oᒲ Vnr_5cޝS>;=q{$]3 %99kMHNVFKq'{JCxv\2GnsAQ|4%5]@`S$Ź+7G6w(zgļ46Ol[ gDyKߚV07K7~ΪC(\Tiv/UN^ݚˁ:b)-\x8̱̬JѺ+-6&]Is4aWs BSKKq'H4IӺ֯}n+$I7!e˟pfHf胇G= p%w2#np+z:_䬅=o,O6="it<eRym ]fã"\cA;S}Q G`3+:߷zoz7 Cp'7a}1 ߝ?֨ Я4;ٙ 3/"_Ȱ77vhw!F2ğ}x`~?l({82w}/|݀p2mJr@EikGMz>Xks}pxd٢Qoswj Bg~Of8ΘM~ #fZEyBO{w&ka틛~fC,\X./Գ&.|@kqlג?88wOw5>7.syK̅{DM;|ǣ63>1%rOq5,'xqm|rdK|z8ھ9>ws~ \i J .88%e帾ߌ|4 L`cfV1ҙ<wv67#/v:z?7{߻Ӭ?Fil|k];(~wCV%f(ge\ 45Fřqgg{oS|N[U V,-f^L1r=H: XfvI`%ѣi.n%kji9vD"`eBPhT>afCH{Y?> mי:lGRo{'hoc*'ۜ`L:rn53w %շr+jhL)^6_EYA $W;FQ0S}kH{ ww[IRi/'Ty #$Oz<Zww?*{fĻٕnabG;|GA.mv]mwEIG˫wo;Ӧ=֕ut{K1ah%vZA.6_|WϮIWVW㎭F/ y)>puH$Hs4nC]_}ZZK$Ds4`GTxtD}!im\C/qM DbR$vV$`ĤU;q#(m\fN5-h< SK}%6¥Tգ~"1I\*C ki74\5-J$D0wyj|q'DN<ә؆IU|4Db>VVwד)πM:PpGYT7}+!PlD"Ib r_`3o*u7ѵsNpެuH$JMCRe\}>$]Is[/$٩DbC/_KVQ1pc ܱf;C \XUfvzsCb.jN$D"Qтq۹;-qO?.HTTZ_]ўD"ԑ'S3MYFМOiixdl#+pL$]*r$McfNo}%?uD"HT>VI:5I5DbrT\KcD"HH"}"iU`h `\'ݒT>|ERN"0pHz wzH$D Zvӣv"1I\* #e`v'ĔفPfrJ>^b._ђ-EZMD"HL64(p_5pG6DbRT;g^l߮iU"HLHZ X*,iq+33XS6 eL 7i^̾RJOπ*:kzV'?&<ٱp?.ǚ eey>η5|l;x7V ~f|cfc$0H$O+F*o#.i]`E H9ȞM--)s"HTfc`x+U`EqIf]%8\;=8\.Mg;RҶfvE.J̸o p6 N}w˥WVǹ:.ĝ.;>~_J>CN\vfve#YL3I҇F3.$Z%|]-3:D_mfE 7%gf+ >a\;g"H$=VvU\wA3H^ڋV*] TRM$Rdr;~ur.hN"HLĂpd.,f=pI?Ƶ_F5Z8d !8)8|of8.`[X 3Zr}e]#n\\ a D"H$N+f 6ffW:^p3O'M$NstTɫuSKKD"ц%IPOB??j?;I!7x4woˣ|g=ɼwBf@?dAI(H$MÝ9|/H3.XkXCi9:P_"e4J'!0×M--_̙H$j,ӗ96 X'Ie73!^oHȷ\ݻuU"{j`U%D"1IQ Uœ( X腾V@Di.NkP%x% %*uZZjt{Db 3K{Pl"Xz4A6\dfƄ2zI+rLBazESj8wlwė+*^^$D"4Zce|oofVݭ<+&Fst<rfۓH$SsY(l~;`|Ϗ;C$݀G# /4.3QG0w[3Gҥv5$ 1sهʕUO =H3.g6&o?!m/\[8eܹ9 YBh8O%D"ѣi`e, |&} |X!i3[&F٣O$rHۓH$S旴pp%=|l $Ȍ$ WJ`sY&n=BsFJkinfTg{M௒if7$Gq<\f?0ãt.g(w#Ix4w]H@OkХ?.tɄH͕% $jf)c"H$z$M:v)i~`=3;J?x)io>7Ac ى5988}oTS.ͥR?BEԲo IDAT^Db"#b| pߞo+$IH$D"]>TD4;Lg71$%絉Js4IH$D"H$= V̬WG%`U=W1-`ۑm"!Kǁe:pM--5ID"H$D"h0 H@@[~lP%\H Lp[gpnD\*mkoȈ}ܤD"H$D"Htv^;p4Χq6TLL$\* ou6ED"H$D"J-XDy>6FTff%Op@4Kip'?`{6ӺJ$D'pƣͬ<+i@H<ʞ>TnFҴuODt!IR \(D"N(]f}4hftw[&6ݎBWVX+Np.'pW@=ەBh.n:I`$TI$AҴ;-@S+kK8ήQf`+`w`~`F^$-( XxHZxNҟN5 '2k3әvcܗ/X7LKtЯFWў"l53;fe| nC`&ˉPQ_Wz4+K| lyVVuM-p4-ڷp쩮oRтv#in`z3{r3INCsp5> }$D-p?0AkI+f+G7gJni[=`.lw| "3֪'x:[t p/<0JҼf6i{K mGipˉO⛟?ܗ,!\Ji `I@pJﮬ$7-*V m o='i4'`Hk&T<#C:hO^F"A+anIS[2ہ;SF"Q/asCU&C rICH$ EqXI TY׈6HzVG݂"I\Ӣl/'wx]}'.৸-M M߷HBϭܽ]ffN5!ԻvquZ@610%}B}| U0g$ I3!Q 6:i 3{W}]Y)76b-lKݍDp˒6u|'Ϸ#~|_PҮNI:o"PKUU>LBD",afߙZtB{"ݾa2T/ lx?Wɷۓ0LIEUO 线}dbYanm!}MNlJ<6wZ; ng:.{ᑋ?i:Zi8;&U})i73kTLh C*&M--6aD"Ef|'pŁ2\ aES=&7#.@h>"n?0 vskvV4U ɚqcqgsǵcfw{j8 ǃľ,~'聤UpŎri~I{=_i`-Ikĵװgv µ $͋:d/ֆ\Y ͹9P#l\,nf7 X̮Rݼ\,% ^4UO_ } l_)jÕG+9|D=4]gc♮?;ͬsL$Mk\Mɭ'/y7vH|Y%'ѯV^ $r&QײOrs]!t=:A{tWeϯ}q˔ ~;6=sz dy7>-k̏57 p%̎ z֪\07#}649c;axx (Yȼ1l \ ̆"@5pߒ / L~{?{gWq7&.E[(4-P"击fN ($8q޼M6>};v;ssM2W<7]HZVH`}Ik'$TRZJV6ީRwքoFf|u" xm@Iy$] ~yΛrNl$ŵ@."inIFLp6k5X2\X]ҵBl.^6 Lj$4X ;/Z'H:7½[!~xpoOJcCѸp|\xz;;MNQG~k\ {%>$*iw/<(iRG9+}w!H͉ oݟ`j('PI#XsepأKqI}$Dp-$-#܃rqӞkpyE<VR"cw-d I mٳx_lZID^[q="|@O+iO\x{9.)_pAI'|\< X qޡq=JҚ~0=l(i|/JmG*5I/Gox1[׃/33β|8¬Y%:QLXJpz퐯4Ц65};:ytЦ&u+_ u40 \SӅpy)w@"[pE؍X)~5WMm@~T$Nl>!藄K6%ߊzQߢ$JWHwz)蓌MVI I~ϊg;}agz-uw>јu$5(Win0\#m`Sw1\Y=/3~L߉I0\'oz][슏u"GIi8OF':g'akDڭEoG%oP0.X4*S ႎ@3*6?3J{ŌZhin9>XK5:${6_?Ds3J ?/ ?v~N4TDQM+`A`C$g_dViu\Sf$Nsbfٕ]`ImТJwt|if]ܤiyUBqb9^k%463Zw\Ej6|WV2176Xe66 \fmIop\10l3{4vMw6HqV9~UX?Nq<.$(4EKN^#3; 6QX:W<̾Egafff8Ϳx$ ~n<Ƹv>p">WD[€xpUq F(p| ԅccI <1̎1Lƽ&nwZ?Ÿ}D'}%_1p;Ż*Lk@*\$y͘٥o IG Y%' ÞS$3΋1*맸9o1mfwGx.Af{0S^+/daQX$.m{NQQ- m4n32222:0|}ifJ;SlrX)޵T-멲?qUE%,/NxHY0é_m%mfQWln2;~8k֜`gXuJ<L7~ cfD];x0/:?NDqaI0\n9sDSF_^CManZ)ވR<^.mo$}΄U G` K2Q'O|^i=\嶫΢~0(K\;i/(\ҜPfp(x; gv:7I#piP0$M+7)>?Wre.BY =ttox)*zI䄽 F]֚Ƣ®*}PyX6 o5|EtHzHoas=pj_)N9.R/֢6:#"Z{C}26^ݘ]!B8FYPφTaهUݫa(_{B*9aAUv $khfoJ*k W{B0^eZ> 7]_RaQs=­K#$y~R ǵ{vtd*}B<+.۳^}O hVE]<LLH)PEq!MOjb3(4 l1w|S.k|K>7Nv(n´.PXSҮfv^ysefɹ(3O%=k\M8؁֒ ʵI/^4Ѵz$`Bmf:\l uIHMCv1.&A%m\+I|TfEXjAe|ܬ 8J+JddddL>t[?d(`J6m }5]-7fU?ID&+;Hs4NުQs%M8?ߜ4Bhx7:¨~`py|pI?AyHHҒϒ~{y6SrBWv! jTFH|ʉۡyPW;V{NiHŽ{ڹ> ӕpmpp.'8رw)iAsiesPYc7cn(6tʹLIJr s7b+E3"+jQtfG\eҵNu |O︴\z-]WRCAzZ1P+.UBkV7-|b qHC~/IXX/>9pņ8NmMk3{ %zH 07a'W"V/Q3ͿһiDD}=n{ qI2T^E&@k*ԩڽW+RWe_KܖJ-ưyJxzs US񱴽Uv;m+sRCx+^W^P/N+=W9Yn9]l[pxE,50.Jkz?]z#IWz < vz8ntV?RG"+-# &LWG\6LCR\)L=蜣6 n_فPe`YT~R~6o>zJ%lM3̶7 5<)A4`+x†ra+8 WE_-F[*I22hin8ٵ'M)f7bKũa;IõnO ^ 97=%ܤ1Iww= 4 !8Ez?O|Ξ_(i0Y!~Y~-in k1d1IBHTB+@|wfi-7IVB]8>˚.9K~8oKi E%I[UG*%sp#$=ff7xgl$@fJ>[&~o$.KM B+wý7yIwBi:$}OԽIZRENREv9!ϩ8.>9og_M+J8F -%mz\ Inx9ίY% kޟ]!iVk#Uo%7ڤv ̕׿ܶVt>mfGV+0 -igsJ pKpKz?J HZ;sn^~V0[R}WNC#t qS8Qnowŵpwާ18mfvQ9p2p^8wu뱸cUI[ _f|Bbcpz|.(v͔>.2k"Faq\< '( o3drCB!&BVF|ٙ9^|,iN\`O|W4_1>\a4 M 727/qHBЂ v(L3)ho1Qܫm(;i+r_Ax?Z"C-"QLqM](wh5bj IDATG2Ղ\5qAQN?m$π:`e*FKsqFTAR`%h:\hf;wdv׳ft]u`i4NЙ&xJBAkfKqAlՉ-gRKx!i$pldQJ`$pf63f|wܼ2.Qޜ۱VCR4:Bw7FLwh94F)SOcPe`!TU-M>1PUk#RPjܽ}s0a]Tt¸_O\I2r47굍719Q+###c UqowsU2s;{;n25#n!Iw] >+)ymVWᾨk3:q2݁hCGp𻬥19 i)INE1%ax .y88oWKRAW V><t=P ARάgt/NLs^8Q]QfƔqұwx8tpkIwFFFFFFE8gݞ] U2A%w\ uwL $I+ ,]q&v3 7yFrS Znin>g?< l0Y\Ԗ;9ڻrT_ƤEnz\i?21}G.EnƉȯGwyJ/cC VCH+iiInz.Ůb wkV=$ReLz47ܼKKs#c ]\+ nm G)ip)\o^I{oQI'op%m+>+cCRdL4x} 1$iCIf;gI^ݩw)b\]{;,N>j;>%!IܝΩ#'S3&W>o|oU+K=V`!Sm˒>^ B'&GKs󼸋 Axxw~.N`8B!^zkz'à M(t3JS Z  %M5q@,& 5xUC|n|… DF3^50S.@?\8A"8f֥̾tpk3k+p#Ү,;cҠY8qdp,pN22222#sՒKz X1 CR"IQ^7.Y*|Ddu2[*cJto)<:8cfJzkkڮ~݋f f'|O]TJFHkm|/8Y=X/FΩt/2cfꢲ.-qM6I?wIy]qA/pɟM22222|`Xi_gJڈD1բڸlhJNd}|O&vZW'](m&[+S=&`6^ GR?te9]i3Y.N%파)R24l$ E{q*\=WJa0>πE 0'RTU%- =bfϕ 2KBLr>4U8b%`I]32?;]"i`= -{| x>=^JڦX?ofcz`A`dO'~S_^רTOqftr9HFHZ_zLfo*y8/ǙX[}\aঢ{[xF/ ifÃc=Z.y7)K>Lgf&6S fVFxkP*qꚘHZX2^Q ̊{hx X*@?3;c(gɐ7%́ #Ksqg3p}:C+*ZI/[h 𴙍ԓ1$0M2ƌI T!!eJҎ1gt3Zkin^yHKsc=hR U pk,TȘx|3|~lż;$<܁oN7À $cNLa7/OIKܛMҙ'\]8| EI/H7A҅>\+Rq;Ko )؜NnD)i 7CxMT!0Ix+onQ:b`t.^ 'b}HRAI[EHk.7Ձ%;hƅxN\S{EoR7{x_ck}cDzxWP.y$m5q!ChE$$7kz}@O$I ;O͉V8O$LgyG%X/qQ.qX>KEp>Ḫ<-)I{IT3GOJ^{{EK%q a')?|wlPay,π ԷEEo%aϕz(}/= Nyy܎oOf$Wuj)lR]Oί䷢ GsGvG7vS kuJ~y\}p$p69,0bY}\pfiޙ>1pl687}ic$l@PJ{6 p3-׏}p!]I Ii&uʽ H$l{sZIiz.s_p+gGx^9HyskϚѷi;G)||,  |Uwʁu@kM$RcAQN̮U ~<+~R\f݅aյ[[։1i<>ޓFn-i33U= v0-k|Q-.8\z5k'K\$y৒5#\ppIǀ̀%QI3*+S>MiIZ%KImn3Iz7=X.o7+s<.l8>2vMm 8 >5H3,#8xߜ(YI[HU0 UjV\(*.@+HO2\ƛg8&|#s$p7{9Bx[1y9)7OpAQGFJ}fvJ|8kNƅ,o7F/"ln f3TiAIJ=kq \Lyfv}&'MyOBe-A%"3+2Z T!Ӗ .,=:E9pڤw 3K˒3[Ch{`W\8x`g\[le/+_fv 1c+r{ShN\&'fjA0Jl^/R3J37@(jfc$S3NJQ+D~vqfU.vnt30;8<.bh3\s iM`#ohb D{q\fX6 s>DO5wR`A| B:?̈́uB.nTF#ո`eQ\cf1$MpWi]%0+Kh*砣88[fFX 7'CJ7b#W18 LS=4Ҟ5Tl)^gڽQ IkH;sVJٓrq!Z5%1jBfvkJ#;9;oicj>ΗrGI)ݯ9J w]-*Hky[ɊġI#\ߚٕg|70E=,%>WGv3p[PYx6@Ks ORdjJy{jpk"gdddd|afN7DKZ 21OTz"ܓzeZ 6:Z13{Zү `H5 7a%1 #1n‰[$YzE~䩧%ۅ!itfQS@+18p(`mI316~Mu͒Fz>U\VҢ)5{ {e}PN#nBt3`LWKB`3eB0b" fLR47iin^y˖C[/jin]\I\X.p\uJj8>[[<,Th\fpO%C+VGHupe8~zk0֣T5q3`8lꥶ]r{ۚٯ%W;H;-3(s}knvD]*yRg"P]`R$iąnlO3ۼPR(Po wN:3j=, Daz$LjIdUI[7%M4>|оU½z2F&䓨k|+~ 8BWƻ\|fv n.3 mnXid|UzFDP+ZKu:_Tֺ(SοҳSo;s]upwHz-%,51*ύ7څ۴{ wc>?׸i"N8IB='.*+c G5VV鞙}- 03`LG NQL׉4S$ZU촩r~!Nv#p؀fdddddFS0^kN\[m.;=kw:(6GkK,(dNfNM71Νpl2f3NM$@펟 _o04| yYo)ηw3̾tn~udhjMTl^]%{wI]. ̪62Sh΃y)iO3;SR3E}JTIhIG=v ӄJ_0[U(H禶ӆ7q3r *i} 6?Z&9w'H_L9e~\!w=&=@q%m4B'yvV!=IҤ/kJ-48%f6"ߏS% ~ogT:FN! 9` JJ uphOWҦOqGIUy'bjZ6`?9ύ>s3I̾ycvԋRp̐5δ+)~5{}%7xab7\h|b섛,́^Oㇰsͬ;q/N{'s{95A2!!T9d=sopq}C@4| {k#Θ11@3M`Bj-٤ezࢴNv477$\>3%>"ɁpA C[[zF,[pO)I%{,-ic3NҾ \wT̞*}J[UsI/$- {X׶ٿ\פνp5_$o7'3Z0(Id'ho.n?m~6bc ɍh/BhkU+?ĆV7Kuuϣ{vo8.^a)33o_]ߜwsԟ$=smlf27g,ڣt&¦[3o7\2_Tx.z8OҧN\pV<\a-u3ʜ-t縗Q67؄/̈́0{x!ԹP.`8psZ idžDޒ~wtc=~̛ 2_ү9fIҞ.|>_މ w>|apͽ`k9p\C!?Y\Wު#TxGҭ^_ CۜzffgI Υj^^i\ O@W ЬY=6(%ׂ$}_٥?MʣT~6>P#cqI#Sf^Ks"pVXFe|1apk\C9v3[#oF0!ftJEp,ȯI^%6릇RZ1jթt]4|߽>f^>-svzoJnϮ,ﴸ&YfgWS/I<]]rTM+mƔX):*5R rm:w56"x|>;32222'$<m^Vx(JZq=*'0sF+7ͫF`޲+u\uؓ='ʩO~wzBz+i3,L`e15+|a.PtU,󂕱Q~ ̉M Q2JO' ټ'#####;f9?s8icefCh47x__.B5&|șU(H|sLʅfGJst7پ(FܮhM{!ʣ[[$######cJ+ऴOCldwoO8V5_wS I+{{j$Ȩ 5~FSw#Xij]8QXgҙDfVuYc=Ľ3=9=ؙt(X1T![[;l=>z4 I3])r7w>jH2i|ֳ;S@]4wS*F,IžKVSZ“Wf5ˌ8$-tMv1p՚" iiu6cۺF -]*`t0])k43,6k;lm2x^繞6qMld.o,4=+|,}qH 8SҪfvRޫF{MU[1ni;ѝȂ]X“$MWxO 33QҩþEn$}P\L#Z8X'%Xx2O?=o7'Q]g|%bЌ{aNНxO) zu&q@m|tm5'`qLI+Ƈ5SR3222222&$?< ջRcp*0kh (axERk| :$uX- ff4|̞@4X& FVpd55gddddddLI I0nԔ)z('N[&< fvss$-kf_G:hr U2*ݕL#F)zn,Xi T ښɪ222222kì[π_& ia#e,ljuqnCނ0ۑ420/Wʻ6 *0>{gOWJ%=\ʳ73`1\ɴgEg4leÏ,Qy6mR4*tKZ$afVwQ`j$ gfFxߺJ6u M ^3#~eqoN`$'f6*ڿSrD<׎z<SěLi>pD6R3;O҆.1Qu <N(47$́hV`3H@G5!y- N`%i^|l:XN cp:~3{B-4QNC: R0Sq4;0gnfJj54$i1!*UB:5}/>}T7s݂ʗ}cjs)_W5_mM=Bw?vG7⚢'7, z܌2O/1H:~"oz&|vX2Xs$iZ70R7 Owp~ַ?mݗFިS["ޟi뿏F%:}4>Jm_+N8Tkq?;ֈv;F'a >G68pρ" ƀF-V*og|n[>u_EI+1r6>~Wkz9N ,_8PV [&2|#eg\hʥ|_U XN!mbn{Қ^c󮾲` ʂ|+_W/`epNI>HNs~vhS〫߳Ǣ$믱X ?%'q;]^+IdU:+\\6'f~o|}'%<N,e,e /]!ٽpqH;O4KS$cwМRwK,$n4^=o{D$i;] ʭ8嬸 k|[‘EFJ;uɱ60ڷ^V$!>s%lS]zl>µA:+.P4`PLYJyń 31KB Q?Ĺ@xF'aB-P-a;GX3p{3{F-~OLҮa?IyދB?&a;EwE;֊yc $]x_Q?`R_=Ș*G_'ON87k3  (cVw!0dSڻ,TO6/\s=&0[]+>z~^v-_!l_`3]|5Kio6#(u?4)~!E= &IsH*a@ ~Zzw)v{Y|s|W)q$l np9wĽ[-17C6-phfف\&|%&"JZ&kO4.7 ֣8*#M$㠨8m₇qhG/\{@a"3~-;&474V \kN*IU~+k39 x3 3v4wXwOx?,ƚJۘs| N1̨dzEX{pchٓQSxKM‹ k3C<xk߾Ƶg%i7I{43q]T $i>6Wsí:DEWOq(0c Qˆ풰"NE@]ۓx3{1pMyIu7\X7-c%######ch{%WSIB+&Ļ9c9fv})^%y)|qeX6 ߬}y K WQkeJmkQ%-xjE*eeY' `f.*6UUIK' KaJBO TrPlPʇc~hJ5#6[>`f_&>fN֡(x_x7/"<\?8ufD#2"&3sĭޥxI:9*p7._ .3p[qmu--by*WJ7) xO՜w|ȄccqLCh`pqrE-IXq? І%ajFM{TZTqQ#ppuqAGMw%a2f$efZJ}Gf4#!Σ.uIwzCY1`Zb(m=/qh`Vv|)|gOgI7ncw2wJg17)ؔLTD}&TF֢A\{i_`"m+eix|KӄntRߊ}*3 n^] %?)/~ /.i[3|T ́.ºщBgpnr&˽)/޷OǗ7v0׌Uiր;^3%q鯀$s>}[+=qSmɭp~|Wm>,Hdfo)E*2swKGYMjλ 5w!b\?0m稆 >E|'poR7m84y_gw!eddddddL0L]UHx :7$#IS(`6RNi|=A_?i&9¬ EY1W25hM[Cͩ6p.@&STH׃S=ȶ$ ޓX04RT{gOgGɍQ]%ݻFC3 ̆d?… oO kH$+븠}bfq/8kI4z8P辁kxTso͇ &&+$Xaiڸ 9+Yb~zB, w]>B>*Kyq nhzF~D[W4cqͶ%sqkv1ҹS\`M4P,( V2222222v<Ưn+S Ռ kt ae< o#i }㵝M*-0,Η4s~K$ܫBÊka+ʩ G-KuY8]M(cRFDVl yRRW-I;qUnµ() }mxmTS>U)n{q)̑.x+ۧza>L - Z(`HS(kf8EKjm>tkwI֩¸&_msp@}Tj]. q5U'Mݕsur)$9MLWjj[総 V]i;>,WٺfRgsbO9>6>er||p!31? , i M|iVD"Bt1)t8N( 4R!i1i?ƥ5 '-Si?Y1U#6 {㧹 OI'ٓYuSiN({Cҕ. AOLSKq%].As?cIIH?F%mo2=y8 \ENNpWYIn&sk 2FE;NOI%m*|ڞsc4hyUNF$paA `hB'\s'k-M{[/0Яt:]3v:[ bZf@dx;I[Eqo9B4lafgƳ=o~Gu\HiBVTnl nt.>FmD#M?J֨6fI Sw|1_}Дoe}2$%i`!<,wX$,,-/x`qKР]s:3wr'3ysVWuUO#ZW`I31`U.tKګu8>{/J7pO~2)h4u]k).i77>'@<_JLҼsHHwgo2ThKH#"wE@h٘ylݮ/psrro0ﻸ`qJ@$J"H$v?(j6f}p%-o~w9#O:.M7!GD{ÀSYƕpG7!o3ñm0̏/k 整Q9 H !馨 3mwd; UҎtp6\X.\3golJUK< ďfUsyefTO&2WZu~}£O)i |5 r#=}$U035. KK|_KavIZ7:6 `hߢqxuӪ*iO +q]nQA\{1 XI q תY3f4pq y7uyrR\FG^|Mds \0uC`;\3ܿ.֠(\>/p7qw$5b{: }}u. ^Û4Ce#qnC@B;6_ yC\[[|Lae똫GBB)p*wsp(k\vL0Jx&\s#.\h@ƺGIC.0ڷ\;3~{D&5c.(>/Ekc}Ʌqa,xy(q鹴?q5Fo7O{&z4gy<0`UIUiʕ5^!N,7 bR_\|1 VACJϬk\5I' ̬k'H$`Mr-pU_j&$scB5l~MmokzFIon6_CG&;ޅ^a=3ۤpl ik A}:[R͝OeeJԘ]Ke$D"H$ 6uƃ0.UKu,9!*0͗8! MkpMpc\"TWIRWcZBM{HD"H$DU4GafN$Z.sS$M|=Y&>۵^$XI$D"H$qs[z;Haf䡒Z})92DK+D"H$D*i3X0Wh{HLD"H$I3v:B^3 )?0XWs~mݽq;%𖙍F͌k,r>0#31HՏ~|;苿9K,{6<5q(yvI3ǫ5턏\yF4gq`Ra`]X#d4[I1?k:4( IDAT1k/d=d8o߀oz`fWƆ0M.9<' *@8bfwH=l='ɀے27[o݁Ŝ&]S?h).|̞,_71zWͬT;)Zў;l0,hYqY x x26ٱ݀#c|ofoV(ўu*}sVҧUqACfrYY!iK\hf*̖b,=BS%#ϡq}u11^ ۱>>ގ3k~|>>4O$m x+kccd|=^fjz?hI@16V?ΙnΥ2&n.`_NFT1pӝ8qkdF]L7+>˥O >/ٳnh5"iA3{ mHXI$D"n4p[$v7[HZ#I-[ϒZDes\ | ^ttKeY*Ccv5;֋ / ߜaRpsϢ-J: e('X;~ZKq3mIűy$݈l!is`(p0\W c Hzx0_  ~+!f͵a~H 7XEKˁ "O|86a{ᒶo#MXF~Z;xTҎqоwfnWOb`#|%N|^<'cʜbN 1{EҶlcK:'(Uq!u[ttپpx*\U z 7?pȟ2J{쒺wD3/~2)cIJz)}rzsBiݫu9{2.\ I厉2^kXl=ef[_7Z4E.<*6okꨣ3^Iu7I$]HZxp?9(g"5blRqkq_P*%stR!$q!y!\"|ގXԄpaZ/ &pi0|=m_k{aXcftp xۓ>>>ߌe?!0ݯ\^&{IqdvX\ۙP7Յm դ})oȷP!h+yx3g@T [x{?зqG\ߢ yϊ))sȷJ?ryy^֋ F8Ν=~ϕ?(U;=%n̕1u1-5h {`\o`(g\wS^qTe6iSocn~t]'w?r7e!ãt"`H7x Wܑ)`)\ |3D'ڍܵre\0I_?@·o w41Һ5/뛰5ˊY5V\ڳӅ+O-ؗɭH[3+wmVsv9sS7RQԅ}Jf8W6N>E.OZOÊf\ڲQyis\q wgܡ|%2ʺ0ǜ:&kB^5Di1ka ۝N j_ݫ#4 q-|yvNөB=D5'i$D"hU17(w{yx8of 5?㛖qC;7ț\oӾgTw!~HsѸĐHxƣM}7~)'S[^4B9HssAfrL ;M#B3efCl(20m6Gw_§33;;y vY;427VM_N@17y b &Dwwc";GnmhFY[zDʯf}of'Bn&`_ZokKfz|gdZcٻ1675wJz?Ks:Vk%7#wG 3yq}-'`\k-iY'3ߣʵVʜfXwO9rS5p!bs ǘ!4|LEAs0#bnVS!7|=nfE}wfTs9Ak|@t\]+ 9{^Ӧ9$+D"H$3ot-ptq UY swSl;t3M3y_!_%Mff?CzH iʼp?JzX3M&5pbhKN*(.XM7frT eә~Di+kcbPb(?8p͚qMCص9MKX&x Hx!PW,̷K惥+^q9w?\Kfh.PX|3oGSf2fjf_K6ꋛ1+|!U5+aV|. 陆nk/mX놙}#"lv2fZdTVi}$z\0J%S7p\+j1|s0%"BTGyss{h.kwcƠ=3Ồ㵒k<.94L@e}; ie#iqO?~ OM.g&J"H$̩zh3;P{X7D1~ ΦAs"S ;^s:BV4C!?LEeI>u+|3%J}{7XCRQkeN|C'{c9)oH!XmLH>nc|ˇ4nVʮIq>)ַ:>^yl4at'~F3{J?467' PứWc%gE6f-%ӥZA= M^ߛ̉;riQycbF`!|{<.Q<:~I_0 ͬh>Q6an(}r w6Z1rPSlCF>0 N 8W<:WZ1z.!1Ʀ13ղSZ-yjcKq\ؙ w5.QfodJk(IH$D=36{߈e&{ $=&rvCK=Am㥙@yP0 u/U;*3 gmsFI{8`SL3?uxwgGuJHm/icLLN!4n4i)f<4C&4l*9?{ ?I$Y%0e=Ƶ+~8O4(|?dwAZ{~J1g*O&Dϵl1yp'2xXuд}m \]L[fHZX2=yz#>v4 M52>߳J;n(n%Qxc=={؜+xIe66{C&Ds]%M}q'HzJeisըtx}05;kHe;6<# E?F.wN=v/FC&; 0'$Һ⾾l}7f>0X5ƹxΐD?bf_RxѥewYcƗDfGnnBm;ݱRHD"H$7ˏȝڭG .;O;29~͆SJ:84-29Xҳpj2<z3kOxd?!Ib0p$qq~W|S <^]b1*iwIC5k#i!߂]"maUg|^.fvuԱ.P"iQIKq9v4E̟?7J!̸&tgφfv[֗xC$uk瀁fGԹG9(JI\fQsN.i/I`u!0^Q S% cf{BjI<"TWM]l*yƩ+_le9=s2A!0{Ƿ͍뫵F[n[-~H vh4s#$D"H$&_[{l.0 O񩻎 ׾ƺNBijnf U_6WWk_ܶZhk4n2G=KD!iUIwø%IXe'D"h?HTғ7Y34%JɜNU5$L4c v6t# 57 3 N!`%ђ̌wy.OFW|,C#DIC&I+XnmI$sx3Z9?eܷ ! ֩fw@>&`E`p 𲙝J$rgYcLS5%D{a*x-a5trnH"Htd"2O#asV|$qϯ!(܉1kS&D=1πX#Ic%H$DF1Q# T i:5强TۚԃsJC$CQK"Hԝ$XI$D"C^£d$ |L> V&|݈m:Bn-Q:a1Ց0RݖARgII'T9uޒÝނM|B໛7jHԍ4D"HtMnf =mooH~g]g]ylC05v^}ԃ?hCWqy̿f?dY9 7mIOhC먹LB{q%$J"H$@_37-F8<%Иk4F̾5Z "^-PW͘5󃙍ުSޤ/>3UnKs43#&=,A5>fٻn"f3E&&K3{1f}3%$J"H$vYJUHtqJZب&TVP6ІDe1ckfŌV+$܂mo"*ݎ:QXKO?D"H$#/p 'T0ѹ|MmQ,gj`9`P:GWJ|!R., t5$́cYNj䡝L r_m[.f3}ZR @lƼ)^R,7~_* ,gfWfV5ˣk3.5:2ר;Pa|:Gsh}(i*\z1n"~O- ,iܤs\7deh"$i8.P%xX\]zxB!\pqvqBc>޾NEjkBw31sGsǥk;E}pb'k(sJ\8Yif2?Ι`buG|?mfxfp f<#37 3}on2s_)rq)]! DFMf=lf/Ug}|@h¬#\kK qlnu5 afDq>IZ) q$.cdfウe3u3{2z_ypv61{E(G 0?+6C mY ;3bfDW}5e2oわ>įZ| ff92.,+R;ri/6a|kNy2\8`$+D"HLDm߰?Hs/ZZbx18 WӯEpUwfWE%2qd>.37LafHǒS?d5|z!_G Ѐ8TW$}>McO% ,(iZr~&l) z銘0f oHkS4MߜHdf*ͮe\ރkd,Y;">G3ؖͷ /pA¹uKpS{%efT8Wpn23_XFi҆VG\V+7*k]Q%痭LSB~VÀo¼j \H=jq{a!6gRpb۠4сHD"H$&N7 2al'vdM@?~@x=%M{>{?!5\쎇..nf˘+nf6Z:Yyk#46γ3zŵµj6 !V뀭Y4G?J 4ebfȝ,_;4^Kf d£WlCKG^zsWDT'}<Ҭ^;?O`IxL:^DN?[!mcaw)`:b'|@8h&W@-a[%Z=3ìÀ[D=NCovn&C4t3U6 WeCcfӴPJK!Zfvc eeq^œ7mЭe>UZ4#(p;unnn:{f50&s<\P%_fqafeo[4y NZ腛;7[*GG|=OЍ4!*iY޸p1",ټ䜊H SmqH}P~({q#N2s&u-&c`IGQŦ5Zk]\86} rUv }fvkSef_Il&锼UmMDh_Tޮ釻  P/2o~^d^irG[f=UkG#<jc\zsHwؓ :>P~.|~L<Wbۇ$mg a(,)`qIk~FT,uZ~K+[X2 w||$M.,JLr=Sfx#}0P5/y#p_snmIO}#s9^v`%<PF5/ơ87zSdAg~x j²Sc4 !iq1^#a^O">ϋL]54wciŦ<:ӭ <Ӷ{ˇ\-.9w$ c%kfoI w;()306=sɀC;>7~bI+O ywBHxne՝塪ģ6A3 2Uޤ.3yMIFNI⑲ cY`eZg=⻢%>ןr$|mdz~Fv~rٗE}=3wN]oEߘpœ rbcs!!:71`B>h=Gy[Y yfVy"_&a`LCEH-L&\ofM:Ec9e-wg\ _7WϮY̱$moN/2%moN3n]_Ӌ[ҶP8Tw(3GIx4>syǯu.͹KT#rO6Eb\{=NpHٽqy=Mfw0 Q…GxLotGW3žϸ`k.z|Gy-wv]ܛqQ3YO+1m6\^|Ysyh%3/iNޗP\~=sKz”sl< e_Qp3k8oGkq6 (Fό~?n?q:w@|BM&x| /sfsM`_`\}C%peZM$XɑLO4pEyv~ @g_y.V`\Xhx]Oʺ^V0`j[3>UMP9C3DŽzKXle`̬[_BjiOSlKcTZsjGҥ ?$nu.}z|g{'6R?R[ȷO Dǥ)PѾC5K#ݵI[_c+c7>XkfxwuD38}6;7_f2Z۬Ҵq ,o"߀=Zc3Jo3\ҭvik5!j3^&}|m&d=k)-=7lSlKcTZsZOh l_7q 7Ƨ21^2R?R[ȷoB U&:.+1] \!Rr^;%6WB5k\-{pct=cc*Hbfv{ZxcMr-n?_ԺfKZRԺ!YdVݟG"*HJy 7}鍛nf׷^ Db&D"1* ܱf4mpp_pϏ@D"!HD"H$6};k<ےHT#L .O"HtX:5%H$D inCb'ͣD"X$J"H M%]/i$/k[- Β6t?<,III3ϑD"Ht)P"H6V!lx[ZiFF@OVmTbB"lw &3֪F7 "]<#U`(IO0} ^3{ut2fVcBnF/o:+fFك':0dH$z|X +kr\;ݡSbK@W3_R^}!7Ҿ77se,|mf/ZGUQN>ty;>3pq>75S8z|~| H}s^&Ag%Sz-8ppJ\<m;9Wyml N5$=< ,!bq|_i.o*4 x@Rp{n9 r:=9?~g>(¸l c0C\3 yB9p@JcH$v-϶v{& fnAsn"ЄkT8>'-#kYZ-8[-uTz%gĝo]?r!0=&le(AHo{^ |S8TBQ檹#s.mOp͒j x.oQ:#f\). sx\#YU\ ~w+a(cyr7|S˯i"%+ɷp{ צ2{*ܔnq}X:^x!wJsiD{]ϟsyD'Z{OOτD"Q3; X*ЛٛfvGM$&i&TafKo?1lo3[-o2JzS/|ILC.3+3; 7ݙ7)%_8t2.i,rT_` I8Z*Yri#3̮1'<K yWoJ9 o* }dc}bf_qqzUkL [{%3{̮4)7kZ}qHO\lISF9Ahv`>IKdfq!V~ն:&cfv_vyXLD"h$+D"Q3{~7IۼZ|/?ffcXޟ7FmKy2Vc_Gz!1ٵ~=n7Ws^'ه>5IGZG3@EgpBT?8OvQfvgvV 4ukY._ϢF~K+K:ɮ=IfvCypM0&V䗒D"Hc`%ђDXDe6̾@R?,+IcfNM4‡f=?KBp*%=<L`ߕ"РQ.>%,ۄlc3xGZ!m3rҸ,qO\s#T% r1cLSec(1E C3[__H%shFӻϕKRQos 2I]X6G&X7皀|L.PZDRoI=$Mkfp?4Fـ_l\U w-n 5W80.n"Ht `%Ht(pxk/fv_lo#O |%vI{KދL&bfcfvm`f3so;pxy=\'Iga͢G|L{. $#'6}q/pY*ܩ;䡁dl=w |q nsr^x(}KZ%9 ת#O{\SᅻW6_SS%_\pʖ6ʵ.5sd#3x:ק]I\SP` o=٣q-ҙqZEyD"HS`%H$Z3̮0p!K@}%< K>tM‡K`fo #wĥkG=yIIJRVk`BP3k Lmá޸y?NqD 3wW~Ʊ2/q!hfO7cqα3\GfviI7I19'p?!G_Eֈ&x_p 2m8"ɳy#2aD#o'ZIJH'gcA()qx8(M#0m.4 vM9](iKI„7'e:I #%O"H$%J"H!/s9)6xYVC8o4.`x|!$Z ,$};͜>cfF8CFQc3lą!62IKz7yآb\:w0?Ti`:wÕ,wL҃ } q@PF0^ңa`Un)xh3k|d9]D"HP$J"H x "id\|,ih17j#q3\ i^JJqU2AS,Z6ܝ<-Z4"iKXCx3Wz[ꞒK$D'+D"1bfcIEGlgD2kHJBQrC,HXUZMlE#`3hLt-f_w;D"H$J"H;J䡒6drp,JzRQ5njNdWy0$-E렸}(jy,\fX$.jf`bUy+)IYNlfZjH/zH-8;)LҠBD"ID"DX4%%z |$^\r[ y3{ x (Y4O4\P\3{s $- ՛Լ)O"ўS4:$D!<r_#]~4V)4 +. kyH:̎6;sK維< 33dN$=XI$f""xbpl?\ YJن)oSGi5̊{P,Hz\`tXK՚Up󀹉 ,+Rf.>]ɰ8T!i}ՉLoOKን<ÁSt~؟*Xh`I[*?;qLGmD/LCDb#)VD" 3?c$ ݆66IP LDNL'eXΆAAqwd))[5OlO쾬@xܫreQf6V҃eTW9!K-0%M5p9rIwMK,:1O8aMc_OIG)U < |"HL&)VD"Q'$+Y6]6(̊o3 $y,/IkPj~V]٫AW7U1%Knxtf_,ۉM, wչuPRm"gfv?$ L0rm|X 4+6IS'"]6@ pG'Gnf9<W=[<:z+fvEx6'1۶nlK۾ Wư}zge3fJq_ Ǝqoq6dOfv. :GI_q}-AfFOeݮ2^PRH}$Y[ 2 ZwR­8篇u{qD:oKeXOςߧ}Bցfx&ҧ$Dbf_]fv|Sqh>YmD/&(3;v1='g $=$iL;I: g9I+T88 W<'* .$rU(GE8o-qOr7WlW^lOO~+M6gl3y=:(\(d{7{<=w~.}񌤕 ӂ[t\6_ydqy$a|Ql`<0zANOIbzEdrڙx ,zL $-f~ ׋m[Jսxj=n3 X :xmI=-#Z<&^NS#X'}[+>Bw: 2+l▔g$H0]q\xSp!is\)y7~#ǒr c$-_h`k\yr_Z;'` p:7Z˓%-=y|W'yox<9k-k'es #Q7+.tp;>!۲0z> eFz[⩧>+~?|BHLrx0_9BπamW8;;kŶ&;UrQܱ*WvX!0X釗re D+{ [} }r .ƃ. e~ 4Jre}[ro-7 (*f` `Hex(Wgfdj߯x|>xV B17+ǸW,ȟs 8'W78 reG`([&\p+c`Sڒ5-iIKm H$. $pjOmhX&JI)c=2$&ə}w"0=/ |;ͰӼn0f6ADž2Ji\[$֐4U];w^I:%B3sy`փ{-\9Io=WV/d~wyyZ=+,πGm;B|,[Qa,c1f?n4Q@3¾]Qc \g:̋'Kz܍R\ UzR|y/p+ zdc&IzXSRspE? WMf,mQ.WVv y_:.;`l&w}(;IO]+D7&)VD"1]|E()Y6'8JRK̸RnbGt('⦳h'se8K>an|VMI}ŗV%lg9@6"j.ȹ,>i.p8+H(Q7Se>]OKj' : ¸ED>r&{}(fqW)bȼ^(Ք$ 8(;c\m,LL^&fϳJw;)WNM&vΥ|D[^e.L ͬ\˔\1C~ߘ7`Y+NM <Ӓ.ŭUMDb:+D" NWǕ,HzRlʠDP`BTL O1*bսڏ],nCA=6kƬqE2 Yi$O3Wh\3u5ʂV2Ak LҷlIO㊲?S3{>;2䏸+$TA)0'#iGܲb?3PҽҮ-vutQP K2kS6[H BO*;jcfIzIf6MiD]lD"ы1phfks~'%= 8I[D373j z 5Ρ%mU.#Ǹ.*x`uig3{Ě)*MЫ!4xWL9v-֬pESfvU &ia`wq?M??0mqWUڳ'2!, PY-^./$Ez M$D>1Wf(`<)IZ^D{采sJRLۆ󌂢Oh*Ql ٬X'`I2e8~PP;QFIZc%{0#ߧ'_Y3%ת%53; ?!RK'nHR$Dcfu<%[t-h"1197VP-^ۯW$nX|Bt8rIY>gQ>x`¦)d ,ʣQx|%|`f~ļy&'_S<_ KQp5zIJZ)bH,'iGIF9s&< x|e9yz#Ix$ QfV.ig_ iM+0ܡvNΖnrIp-)Y</~If*2~+ECֿ}zMD_t5g/tHZJD00>+M$DH+D"EDF<qKMYwpK{l|m$N$ӛqAE7H$)HD"HJzT,gȳR|=c$)\r7MԉD1ZD"H +P"H$}if١f 0Kz<ɱxևntWi2Ñ4h*Tt5IvJ]ҼefS)Et"H$z)b%H$2ٛ?Hꃧ܆ӹ"u Ytc"nOYt0gIk<:x=UOg$g3.Η=J``<I+}>nȉD"$D"H$&cfv0p`?4TҚB| OJ3RM{8x?ЯS~| |* I3I_(~zi`Booe}GҀZːH$݅XI$Dgfvof76N':IJZ& if6pEUF pmhfo fs;Łqן{I>4w)Cs{^BbS`0p5G%Uc#2 cfN<0h(,RO2+Iʘftsʵ4V\fvn4b|@vاnE40p0?wP&1%zB]o#C\)-۾6>Jlln Oٗs cpIi0149pyIH$dH$Dbffvcf 'ϫovk'nL_̕t*p> 9-6L\g*;t0>FnN^LCWCeB3HVRFJO/C-@S(Q}"p#_ĢcߗzBk*珤_rc3ƶ9% .i[Jw2,<)6l>.<}:u +0H'd XZ%dǻ~~+Hw!D`L(c]+F׿ w˶o +IJ|`Ux߭}H$=tOۀk-OZҒg,e;;_`*a3?Yj}3Lq-Vϕ (\OreV q];dʎy!0{5DQ6wrnMʱ>'.Wg3"wl.m[werh˭\fŕCseʕ]k~[oV1Y+B |\)QvEBOm\ףɼbpLQo([*mlۮ̵{Ϗi0o|W&͓~rW룀ڝܐoZiIKZ] H$D0`-қ|௬9w3A~%2ɶ pM.YA{B ܽ ] \f5TQdx=:"o3jC剰h pă4+>v)p)15ٻ^,xDbF%)VD"&́_X8'Eu gJzW^C[y1./̎++&cf+4%h;*VEv}W05}$!iS?g++Q8x.\ON3)T8$=>yپ @epצṲT"ܝh'Yb|v]☺W,+V*]ek8\9w+StpY(^g~<9W:p7D"HT XI$D]sGg9p1"/}IOI:]|+?28 ʶ>8>,VH ?2/P IDATtj!"ɝfv Q% B@3qӒhCpH`ڑ)``XfyNfv d 8,* Ɵٿ߅e\nr[ژYiD"ћI+3(usoofjǒ )nJYsCKMK"H$f>i@2 m˗w%C껰ܚLtkfyk{]:ڷH>}V*<Oq5{#8 rZ 8̮9\}-CRٳqmSfV4\ocq~q˓M'Kӳ~}N6v}3{fvCGN$H$ID}c@<ِ,~ևPO hx?q憖Z=$ ML/. U()Z6'U0 lq?U=I/'f2pWc$=ef׷! ʕo|IĘ#!Zѷʱ1IZ8 sޥ8L@`_I+(,6ĭ)3wr1b*5w{ґxJ\ i3 yJ.5+jl"O2嶵xZbb?Ÿ4VwHO}oGM?$m)$fɟG9W,AFwD"kInH}cxdpYk(C\ƺ-%)^Dbډ8OIid,2I-#θH2ϼo.WK w9W' ;YD~h􎙍"Z&\Y{rujFqכ%O,YؓΝYƚQXo3T?(>O %Δ[\3L\Ѳ MQeحr\Iaep>sIcfkI6 AxD"$J oXz2"frs72Q -H$1ρ[bAҢe`t;nUn_&`I~ss$~vO x UX}L38$i},\.m(J¯O0$XWڞ"jv(y]&DF7 TY_g$6(uKq/N \q-OʖwH$5Be=b4WvYs SXj\^#,g} KSk%iO\)c3{`Zik_>I$d҅DL peL_mH,euJZsCKz0H$v?24lHmhX+|•-#V4)9tk5{n}H$=Xd떣HYoNtͿ Q>ܬwTsCKzO$vA,%)Yí,O#.Cm譲 &"sjS'D+H}c *eXG?o7 Ǖ,ÚZzMD" %D"y$TRXn*S`(1'>@}cݻY577D"N[ˡ|+!JنNUk9D"ѵ$J) j,N}̏GUB2%D"'$@mh܂tCI3{6Ot4!V*EZ>HS!K0>hGs^݁XHhI/kRIEzDד+nE`?|r>[i/)eB;n69K+`b ] Q-K$=<IxmhX4R)ՁhO{M*J$Nhm[ _v I)sYr>!3;TBR=7o#t\%i3i:ct)ό%$ nI}4L$H7BE7#Xqee>?l9uihY$E`ݙx& d_M%K$F((2W $Oeh#X M0 g IKfIזQҀ\\w>]}.m0i Z8i} <_lGz+&tE]Ma Pʗ+ˑ}qkH$HG :߲V-0zLn eƛ憖obiƺ”-RN5}()YnLBD"q]2ರ!%EDqIPRkf]6rf8w*X?xؖgy(Iu^贴!ie`MN[cfKhs= N.>bDwOFhX1Cl n 2pYEqW}Xf!Dom_}qwVxmgl+M~B)#٘nC:`kJhوXWbt/ ڒ [>+)`zq%>F&ڙ eN>:fvU;xY-MlnbLNnnh٩ެTFsC -67вmsC¸f&AuF`D"HLf]lf;k'V[/Iz]Қ|brXʽ|Z[e : nݡ&kIxT` 'i!IX&i~ 0L1X 30%%S2L GQB*`M^IXx&u +&% ʅQz1I{J^g>a{%|YDž0R9m;Ŷ[}$p~ <+vy^[g!lW2n -^'!*x+Yl[A-55۾!.~ƹs+~.<)]EmyAaKUOIZ@<.c¯q7b%)AtqvUirGwpw :D{cn0߼a|.6E6ޯa뺈CH$$Nx{!%7:xJ[- >(Sm`33Vҹ!, fv)x7%OB l4PPMV6ף, {.-<;}8RC`pi[8 X̾ !OUKv.m`fIGqfaԹ ~m;w,wʛepߘ#k"Qkb%5Pz#9\H+n/FuvFĔ47|?t]PX%%ڱSXw)pQFJ$!&78%&2o^'xc%-/i> $dS%l>_$}ك*|QT6_`GI+}o"L(UgfO}Xfc J}p%Ƹ +nk x`OIr.?J?V'܌G,KUP=[ R~+\ qKSs3n,oT`1`}I{٥f#+@y7u wdmʜ=uX3$}J(@r}8?UR, y3{ WǙ Zzí\\;qfbN3h*M({MIO3kqviT [lj~['SRIfvrnq|4n&|}Marl>fvQlk4y̬]3Zҭ+gw;6~[*947>M-sEF5pv4;K:7nھH<&ƺ47?D"Zs.kAt1Vp=ޤ{< &Af2V㓺3m@[ .2K\Ʋ9'>gjO}@*J,fp/{q_ =vŭ~+Q*W y|0w.`vV 39]lx4ntZH\9תi8WIz W[nic,FEw(72X-COxuZh;Ų9~zqOy(0sC>IshnhDsC˩ -fO봲v}cݿAD"IYӍqkq"D5=Qr3Y5=pү)'ǥ3ned2;P+EZÍ* nQs*,T-.5Z!W'1ئ̘;W^Vjܢf2yW<`\|G*秔Htb%63mc:.ý`憖eZҕ&t@sC憖3ZVŕ,Go]EAzt}cuIH$5!1PNя)݈ʑMP bZn=[f/6~D>0fígvy9ĭ5%vb&;٢Xr\BϠS\ ]b/(!2E_"ŕV -IYns̔EgL9b<Ǎ=xUSR3dncw%Sf)_[zJL8BR j,Jn&$J8D᩿x杌}rJ5cPvx|+dn/S{/H\ 8Jog3#3{w}bc;0hЈ cZdqWZ`$??V_0qY(Gܓ:xqqnԇuq+N-ާW23>edJyr6)/]E;WlIYzK Xx5Sro:Sl7J1 -O^ޡ0ěQ>y={^6xDmnQoqZfA3?H៓ўHt& -,Go;`I$< ljp-xf1,iJm!p<hHI+I ?3; *`}a\֤|uH6&3m4J1>B1AI/~`f_1f'׵%PMhBVyg<͸Ífxp˟i $+s߳3.Jg ǖ>i•QI[osN4GU_s$]?{nj-jQ< uP/li IDATg%]ˍq_7ƕW['9E7F,~$6 ƴ(XҺ1os4P҉󒎗=I?V~!+c#&n.,hkn&\(O7w:rC}c~x.d -tAD tpm֑o?*وr3;x~I}(nE~b C{Z=I[VYtS{kq{1^j%8-m*ckHn2B@#݋t"47k t~dH$`tIW*U)X0k6͆^nc{ѓO:fw?K*n|]T{mЭ+qt%]#~Dinhz:n"ܙ~ ;D"H\f Q$ t4Vt{Ȟ rHCXKSAiWt\6t{m//'XKx"ѥt;Ŋ}ifWQt`f0=l`{IH憖Z-XN>f^oU}c]D!iLM:{gv]D?`W"i[`W3;Xk9&I}%e*O=C`9,uHݞ9^ij ȴ<,*>F7~>Ѿ)޿OtmKd]NOx(;`?IMoa憖ˉ'l=px}c]16C"H$IKef6 xvM5tUfc~OO|VHۀ'V>15Ji`NG`fyUV% Kҋzw4)( M*UE@ t.jUPu@7{s3}fy;o9e{)ORAa`fffJ/ }Xw:0_=#Rq7-l*durxSt3/l[3KO)i6-y OPl /j*;XY^-:GR+Xg,664WA0ݐ ~ MhF7-`O`#Yh|%~ ^{v.CI ,>HZyvY٩@1vI=q {}ɬ%ۓ=p3倫;%\tRKC֦o,~vtp|aAЯI O 𞙽I.+bz˹0ʅ~f6̬C.Zffa*XV:~wbkfoF|VGU#fnX,~,f%?cR>^Kurܽw+3$beLJ`3{(U쁒qLz=ۢxZe3$&n,dfwՐ p쿹lƙ٫>ew5<&ݧ#ٵU3(L9KHQ3{C@f}(i.`TV27 M I`>s˥=EtD ͎_VPrcgXC3{-ɳT*H{OwJR^j.3&w{ < mn7١fvp}6x'l~LQ|3=&U4;݁ګ6U:`?c^RE>u;lCqOuJqmW1TK _-\L,5~i|SpMڗcp;>߳[pXz\+Hvn˥O -p%xt~,6Luz>G?,p9~_"i*[qж~+7<)*9:yw'_l4rnǟU^_XCso%\sIwHs <W^~7qxiIKN~ĩ uسP{u{5m A\ :*kZTt5K;?ϛns|n;$]Y+kw{ǁm p/$ݏ?25hSX,a˜sԣ>GC [:clIھ[?NR;s'1͕݂%#//Tok X lڎ%<&ͬ'S?;B|vl8@B1rG1/OWZ9@imsesM> WxS-gp˝x|̆[,+Iv\3yPWj} |,{t;_l2)W6:Iǩl\VH}0D9%TeshT02;V"⇅ȀsaWq|q• ̟+?4m+)+kJe _?Km\"f\1P\Ԓ3 x1Y>O͕͞Ρ u}8qLf2 ̖ʎJek1\ټ96?..(y М~ʾw2ӿ+b+p unxJ[&Y0RKFt?ׁ[mnm* '35_@p\1DhIqˌ9eU-lUTQ8x=-U#{~>2뭆 0~o|Q9..*'ro9qա6+z$~dq2KzH&Y{3{19y>/OAO򺙝ƚ<̟>, ߶62w,;gVq 8_=:cfQy.}-s/Qo3$׬Ql9?7fك+.̕=S(`m\1Hcs,Ls4c1} 3*rgWjw2;;7s{WUy eܵa`x qppKk]>ω/҆cru>εojylyI2̬, Rd)Jmϗ'nnlL ۲\闑o1nr$_c+ϊ]R)Oc}:[0v\SiMg8w{T ט8+'˶ΤBێN =)Ig XM{{+T_33Ip"Sd,[݅[eIbRbEjgW+UtA6*l՞AKSź2/@ݶ"LAYA>:j2A_fDŽH܃+~'*bI9#e*I4++4*=p:@sj*Z># Z)9f6W&^[&tVDIg :ihUib;n[˼ifwiܪW_.E\5Ue4*Õ{$%YVUwc´A{twCy;*%[0F|7xsnA0=Qj)]j)t0֦j Ƨi,$}WlLJITko;xإL$iIUkEJok}U'gU\)+?f|4ϣRE/ |Xvd~ %͓==%$]AҎh_ ֛-+VQx^{I%ף/8̺u>Y|N ʅ6of2f.-j/3Ak6u13{?ÏSk5%M#[x}V:V'4b%~>kff7 FRK^qWxr5 LSRBRVQNHҸ R]+2&KJC|lbn.,D~C}F3䙉VeBAIk mO3pSHg<[\\F{RlEbfh?J[|I<ݹL9UDvN IrϩjY36}\f"y65;0v5x|^aLgqˍ-, \st쑔<(휂-ׁ<pC$ʳW% ̸UX4}*}TRX䙐>WUz=OfǸJVyd=_;}ʾdȹ [g0/Ex"s>TTb:жd&Onqq$<+~TT+&?Hp<}I 3RKL4`skSR4AcL l~#8 ٻx*91nt5j+)gY~P:^~cwIb 9w;7)𬤋%gx2Ucp_#=7n}p5;xe)|3פÀ쏩lz\\CxJZ"7wxP óM [p~+Vnhg_/DP "*i~ŷX,}6]L̥)O O +$c_ځw4{ڗtgK: ҘC_f NICf.'%'dJ2cx{sh"j:g67Sf>m%"ox\mJ3ӵ~'8OIi/, ~&id:v]80@.|C?/~ôRy<〳SpɒK򟊧:"Tx)ne)0"-nk4pV\ܾg:/Is1O;W]fen <[I\)?`<QO{k4DV \[\%)`f W>s xY?__oϧ>oH.Ve{AgcϱK))볁fv<~~ 0glSܚ+==_Gu۴)ϸ%FKAɊ{ZBR=pX`_IkOe+&2x0I$˟#RIK3)վ[!iζH[ŕf$eOR’v0kpkG9^w+l*iS!7jofOGÀWہ'%eO-Y2 n_dZxW<#`M^q:'\-HMp//G_ğr>=WЋ4b.323%wa IDAT%0 if7-ͬ+AҨ@<$]+Z ]ͭMd46mVj)AP I[,gA:SX&3k Ѝ7 C!m&A2EFt4k3SpO!pT_HyXC5 *2KoT!+4rfZ66t֍`m֦oZ_tATBBxUqӢ'ۗ/9&эԧllP 1Uz=)Hs3{1@3sfe* ifMo1rRT ߆@J(#{q`L< VM Yqj v.IsMF3$Y/@1%pc6.ȕ lfJqo-o1Sk$3f6I zsQ}dw>`k3(W5`tfM}Lns_T9*X¸^P'l\ݘoy35Cz9 dfc>'Oy}&6#?ʃd3$]7 web%}3Nb㒼+VɕMV90sK+JήELTIÈ$ۊAӹb3{B?X' o? mfL`u3{8#is2ݜϛd=k>5`\bftٟ }Iʻ3 g^N۞c_p}++_&w X w)jnmiRKJ=Cz}w-ZJ얶UmbUU[kLjun0ߑtks*NI73H :%`T>/A}w%Bң9"aYmaT*59I' C[Rby^Xxx+) T%Js)\4_KJR,W>, ݝ<28L҆f\bEոqQ*9`/I+p8p[aixы8'Oc ŏ=}6gJ곒3cj[810p7Msʈ$g54p' "x\y8TҮfvEkr"Se֪+y =98~NR{@+~̏׿HV]nv>E&)6J_@?K믒7Smsiq\aQU>/ "|=+~|.iK3{3Y?gÕF BG- _Ȟk}ʆv/;9q;}[6dߗK_!pha>.k?W}e/ȟ믩B eNHwȕL-)Y*pO}\QWr߇fΕڎʕm[-+[+ջ0WTv;t*<]c|?}$pZ"seCrߛy60_*[1 ջ4QGΓl?u6`寋'reK*80k .b3J[F ^.VtN{q0SqN]0󑟳Łm$kW+꧸Q>s],]\t9_J&\FK:_pό5Hn1cuq>W?Ǐ6fM޳.HWhIq*5Gb~+ʶ-*[ƕJߗDFt޵h] [!=m6i?2KݭP<^RfoYC3~8}.,>G%-J( į_'w*bàoi8ŊY$%CIIX'>/pӾ^=D|"`lܔC[ 7> Ẅ._`(d1orrXIktG3Y Z@l%U }/47Rk+Q}I%'(ܺg2cϕ&ZY[2$-$Xbڸfy%.<܂( \Հ IqI:oHEVLUYܔuseϝ+qK$ݝ\n.loEI;[..pkfٷUa$_wZ>u[l\10J[,+IIq{b6\h2t Ga?kuJmaJR[d<&2; w8MǘY^;WԍmGsV 'q f? Wh+3_e̞A0Qj)߁Od[v }jfO[D҂$ %mǢD2ZM3U#(e*-*O/*%ؽvIl5e?Lq;2*e"UQ<wI+*_eL2YYکQ׻ ;/L}W~:,yq&eBƃXIN3}7XI.l33vJǨ~NLʆKqw2ײc(i}ef''iښq]-n]ҏҟcR?|5Iu&ڎaj<9*~nLz)zSs0݁/Y]ok]. X)p){X|hA)/;vk[j *#}hsz{EJPp|a,;-r6]o!ďݹL9=ff\!T~SfJG Ɯ٧V7KjLT]IYX _-O^߯邹2Ÿ+G]eKs\-ؽrsuwWvٽ/&yW(6kFIZ?*/)e* ~ ntP;ڎ\4c&XII:WHz]WYØI%~Z9i-[ck2Uz 46 ZHApH7ug_/3YwٸJgDқR z'i@aqCO|h$R`/3+gÃo_uQ沑9>+ oRzTAU~Y +W465j -2} ۟*зs=y gQqJV.o5Rg.铆WfJeI3[ ^dM| i  6ӄ;A&mLAGY IJg%N!W|gFi^)xg-HArXF^~APg^kV;+y)??ɦg46m "A0b <AHfv S6eGfA ef\*iz 3x7;lpeskSG!ATb-n+ZHhfʛ !)FB2SVă mf[n;s*:iev3bz:# 1v*[TE?VJi?AAѨ+yvNvvJ4W:֦zA /FJjU*nU)>Yh>۱5qvxB1X.#q%+iM%=njD yM ہ끋soڏ̝SI퀻847WH5 XiIgWH;}oȹW\+2ҥ=(YI+88^`Xm_`|cз v3~NmJjM <'iZsA?+wٕ?AV'R/CoDMx0zG 6*Z.tI fvЂq̞v&2kćkfvrzY*x̖& ph38-ypD p, qՁp%.LfZ%Pfq-3;.n~.ivi-`W3|ؙif7J]p\Q2;<>-}98x̎Nco, 177rf׬sVr3~if.gթIfv=OA$-<+P R~#ؙksn< #UD /)HM|5qk2&cOwf6&[-pe\^ X W>afd{h23̙H!?ƻL˱fViw 6݂+twf\{ VfmfJ:infI%ƕMJBM8Qi>NHpnuT6\; %_c +fv0PHw2*XPj)͆465լF_n-]+e:w9@LqKϪ3}11fv%+x`xղϴhf\ڮ;M^5jdT[sǸ['}flR@ʗMc mk_ԁ^x|RJ 3]+wx c.A5hx =nfq RK"#ͮ IDAT3l \/IA \+i6`A)6fWXӎ|f3]'$ܸ MIn6sȔ-̓>4*ldSJeAO-8uspE,@ƞTen "&Wܕ !puZS-}~-$ 40ϖtp%t9̮#PAKRxPY,JU( nnm:v w$͇rVe~*a M,afqbȞTsՎ)>JX]>*UX^I;qwSX'C Z٢P|ASmZ2)>> 8@ҦS:1q[.OkU_>͕Ϝ܉^0e.~WA,AwtwuRI+qxskO{A rq(WTw;%]:,x'9 2R"iU hxJ- xbZ{ R gwbfOJgpwKx*o;fwʈ򅒖HWҜ<b< ~?w!iIGqTwSIIZWqXWp < </*fO3{9:4jvMcq$ړH:09x*੟oKU>O{$ 8#? 2MaTI'-k4iϻ~_qnUBA AFUiYDL3 c3{=63ѧl?fT[0;l"0Rw #~zmݙK〵 4K$=of=VrR6J61CzjzD-{sA!-Vך*Uh\ك (Pj)ؓe\ڴA͚ALWX+Mk"s;JYd5UAPKܯ:gAA}f3Q%- ,ЇAMJ-46746mTj)?KAx@n|bq܋|\efb  ? iaf7)jRKt<(dgi^)ƤvxŁR  ѐ _J-#;l~֦b OFD{3+fvl_AC(V kj֚%p˕5kAoIe0}9^AR"gzA('i5t*ͭMPA4 kwn@AAݢ!JZO\m[ x^2A=J-rskreN4iǤ `AAtTՕ S qJ-叚[DӑͭM{Zʑ3/F_[  Ш@03[-n,c=@.0MNq fS-?bf_[  А3FπR_ASj) Ӄ[y +V[  Ґ@>b,\^2AгZ46}܉46_j)_KAwD|   il l Z,+V (v&v[v [FKAAX~nfVQ0`hAQj)ڴ'p1n56Y|uIA/3x"ZAX)*U$ E%-U mJ-u@֦oHA2PATt0v90=(RKtN6˔+;HA.Y|\AA+P38xBAZʇwY\ "A{l>b% ~EPXx2ifg&YvFK \4جOٝvjew}$߯$-ifovO |ļ,} $-*P!i5Gxgjug^^{I+3π TgV@x0&3{e|X?޻;8iKzm>* |AЀtrͭMzV :`z h%YU(|qyQ\mɀ)` 4;TCHTӫ)_ %@{1: ݢ`bzTSLPE8g^+Y$#̙ٹ;gyz/Ɲ.=⑔I| ; E|y76)s{K-w;|Զ8vgf6WMs s3Jvƕ׷R% ~*w|{kU +(VJ<; Z-psm}ʹA.P@ڃ_f6i38#̾1WP6=[<Ic}K`g3lvmhf_WyKfF^m3;i2$ kL'}_fUۢ3 Wr _Cm}0lK3{;"0cf/M tt Gª xHƵl@!QfWdC@N!Zo'n=syj eiskfn鶒6H.1k;D!{>ɓ 9= 0zL̥uvKt[gfw'r8pVuv"t]獮RfzHtf xz-}U`Lm} ut |iOz&Jz&2ܷp͟$hfW&y?tsI7fǕO6,|<VfvՀ]'*`~ 3ml+#pq ؼ26>jfoGz-]gf/JZf][\>-Qf~3Ϣ;xK|# <>yu1  Ӎqׅq[UPp 4W4 7"'@B@5 i_.87xM<]]_}E.O]y_XnʞMa]/1Mߵ{qO$obYn1ru, ,mf#UzI}q׵ٺ$[||'l x9&$g7ƚ K(oyTM!1&7Ȟqm1&xwˢ~RYYK _o?2*#V}wnx >˕gr0 8/Lo>Wm ]fLt{ wzވߘ{$\]=KwݝΟ+ʉ)fP/ー͙ (@C]JyK5T $qn qzI#c1I\T~o+0] +^_\/i8V I$ _>/O60ȔoBIQ^Y\/HpI9G|nxyn~ W>sx!3kOܥ{x.'(%g ¡{8 gʟ+܎~,EI/HZ.6Oዠ1Ѧ3)$] pp!8Aqcj)T޿na5I{\rφ2/s. >Vekt6@( >< l:V \ <%ibNIՃ$ Cs2.+S$ccB( |6D_ ! ;7cRIJk 3߄8P=p~#$-s("\q۾8S58a9RGү$1)e@`x}U8]"kߑ{<+q$~%iI[ኡQ2{/4gG^^r^s}+g\yroʸO* q| #qeqo#g$i臁8!~ז盅qem=>nf]]#Y q C;5ntG88;W{]wx/k~V6G8?Ɩ=^}WӠnĨ'V"mA"m3 ^J{;D9jqz2nAf%>Y+[)nQ;,q|yG\!ۢISZ!}һ/)7/v%{$m|G9c;.m Jg|<π+!?(lr^#[a4-Ҵ8p$m͐o-x.{yn7e87 Nf-sʚ'6I59 iNS#ese. ;Ҷt#W+&i"R\Q3naI="V`@mi&.!| %~*.QC1$MSƘ=w< Wn>mwvKU`Fh[ǵe]A t '65NBh̍mb(P:Ěf6ќtMeDo0xxTB/BҩrpGʲoȰM"qmZxG!_szG6Ky7?g"ƸQ߼r*pJsx2xX0,u$ EXT[SFp:i;9R˧fv9pB @{s'G/٤jfcB=.o "c_|{Z d09\~!N/\Y޻:v29/nٓG3̝;7~{ț!kPFly1/L=R*j}`dJSSQP<.iYp^|~kvl\Y@ڝEiѷY%*Gd}iN>J2[Yrݍ[0=y=Y4Rs,UoN,6iaB2[FVs$eχg\,pRs+oIAW(P@[n `W| hVVY)w0S:pp.Ғ#m(Yrg487>vɣyT*cW~=[! I-$4݀[>\ϩto 37!fPESs0EA; Ih=rfv<(Weo+rI R̖ S"-Vzݟ-/g}AG*ۺfGWmfC={ZL|{vtMP^.\Ž+AJ=ipbIygǕj+ʋ+uRxy8f\FWpEqPe]]^3c-q6ܤ6݃Fȉ?l[P`N9x--.缣%Ƿ4Klo3 t.(+ Px=nؚkהd(P@+ίBR\ZwSK3@0$hܺ"L|K"ܝn4IG ܌D|$m3 )ooV5>5pb+U bRk ΋uA n%.QٖI钶w~6l3 YWƉ- 7p{v)u2K\+hݭ[\w ΄hV IDATU‹aa\~/m e%y pKJϹԳTE6? ??s˿+Ӝ =)F%Rr R.xHR吽 %LlHnGJRVmCXe(u̹@z=1?,mI|M,||ܝ]+?A'x0,:C^uq J,7'1cݗ)Β/]*ϕTP(P`CC]m8k筸}1`lm}͠@ ZZf >7%yf)&2R/>S/iKy8_ GkKz _ d_Yqn8)x.C%m/RgĉV ~"NbJMrWl#)+?#TLBnGWќ#ۊٱb L@_HҫEn65zK:J.6VCϝ?<']'p~" %f&*v#}]ܕ vT-#ı*0\Q?ƭ(vyj->yl!,bh?Kk&9! 8?C΋c6af pہ݁l\S`9|.!9w-y_%}!xI Mه$qKp#?xxrwYJsf'ȿ)X; sʬ\L}㊇y1+ }|5>7n%gP˓ 8^#ڿem_$iD`G$-$ZI'P9/xԗpMѲQnX ElА!S<[}+݉4^yY㭉\f8`sI9g.8\QүV5cpr!r׾L' /#ec\AX,[G+ʉI‡ʨ* KN(:=N{o{5YMKQmR]ߍq^ۙh8LT6r5Yt!1xY2۸417۲ t>̋/S)oPxlT "> wنd7u{ƶx rLtq+[a ,h5AV .ldkKbʄrJ{,wwEbxy,nr𛜒@<8-ł(K00;D&zny{nhr˳qǹ>#IZ-Vp[prZ*P@Ihk|պES[_sMm}MO@1ĵ-9~̝w L*RNy hZ &_-I*Z?V#[[ʟclTj묔r'}WNɉH+*Bafo2P|NdNKwȌ3eg]>dft[ Y+r%pgq썎@?O45/=K9n PS X@Ǵ$-P`(A3* `f_$'#t+ Cn -ډ*gg3=\vUV7?l-](P@Uhkgk gb&@Ӕ_@熤JBvtTT+W?OG] $mfJI[ඕ,}Zso>vvBg1ƧZtzmxm!S]} (j45>_[_0eo)ٶXD(X#dG R i~|l7biXlxՕpnmPfkh cI; xl>x+ɳ<>;3D0 ]b I#L}*U~hkR2ඓ@ I=p%ŎtnxĔi;.i^yso`<cx-8˔*fv50+TgUpގV0MJ΄i`flK 6qV1ו|0)fXY76:V LOhkƣ:܍5G MIV@ [(V t"eU<kˊc`C<Ё~\8+]K ܓDxRBBjЦYָ48j5#](crf=ն+p\ 2ah tyXE,٧񲶕@NՁG: s[<}˳*n>bx̞)ST}Xx\x \ x$ORk ߀K =یYK ٭ݭLJA03&eFY8x('JH: 8"}yYf5$\\.ies3o1?s{n3/g<6^5$- , efoW~{l(3 ]n< ߀_ȯÒ| ;naő^]}) \ wz8gm1',ou뀟b03]{Գ$^\n po3T9/D$,_g~MfsfM'ޟGik]#3pE^3{D5>.-W̸r5> 2I$.Ya?m `rn iVI?{b t>45> ,OhKm'Yp>07oV:BIkIzxW,\w)ny% 2|tpeluI˕K[6׏;pkj$+4>;J%:xTanWJɕs,`yIG|9έrg<3IP1ʵ8 _<$br3<'.s,-6KqޕzX􀖔$->X8WG wcǕ0yY{لP|L>;w?q+4|Hnƹv*HË. p-s<2OBѺF%s2@0,?nU{`vk(>itG88:wx}Ὤ{}ڤQS\`-$-{rG g`͙Pd$mA|G$mՐC|r#Óq4߹o* NҮず\F|tO{'&m{'<GEޭ5I^OIq,%򝐤φ_tk2|`?}{yOZx,I҆GYIMI8iEڡd7]+W2/E]z/s4SSM+q@H|ok+0}+(V48 (PCP0nnzO`WuF::RK-2@EG$~kqbl<\| d\ {;\.Y 7oF鍪Lɔ)uHZ݈W,[99۲n/0:9O4ז1-p7ף7H?*#mݷb9rmϳp3IH:8(Lnx= _Sa4¡%^N,IZmf?<^\w,x=A6gyMv.yL7W•md?$d418!0J-|TQ,\+ƑܽV#HB#&);Q~.|j5:\7#R@)k%xy}9pdX (hkf}|fpHC]4(P1x_EzђGZ kr)NzsqjSNvIaq N{G”Ϧ!] yV;/d4L-2˛x_ Y-V^'['ZךfR@킆Ɖ uG ׬f(ЁGOY]Ϸ%͘}OM#oš6ES;XT7&^YPIOpɗ'p Vq488}[/3 m(-Hвߍ!KK֮C..=JK!,^03ˆJѼ.%&&7}/e0npp!?fրG[ 9o6?y,ĿMGH#\uY\G8Aj.y.iD޾8 !OѶeI!par7ps(q=ři{qIKzx,8KWҁD83l eJ|5lUIX9>JzRR=L0( %m7enK1$k[}|l@\)s]W.fȔxޢB:{w@_O$VtŊ%%II)ضe+P@rhkllkZ`m}s(:ɡ`#6gw )XGISҡ,+'Wr$ERM%Zų< W,ff7Vh7]ƅ,0E6|Q'49f$&Ghb>ɝNmTP 3_ofK7@Am}8fV u#^m IW;lfOL`ƖUכYiIJގojњIV":Kk, ,w55t9~=7'Ui%Ow,!9%e\ LO+03{̞)I@:=?hk7jkuHW@b5|CU@G-.F[ӾrJ(UK֠3sPqS*U,.F-7ZSgz +KYXvdA (PS `)ܼxjdm}kk3bS&-P@r?y h{%4D- 7e*P@Vm`3p֠;]m}ͱ u?V@iq*e,P@m7윎@]bZ3[f6ϴzÏ(P@AC]08aԠ/S-Xmyԍ倇[@ tUso]be`.Epv¸(P@CC]5kHN#kKwP6@Jxx  i3kMy:@I3ٗ-Grc(\DD 6SQC}6oZX@:xڱi]og@{]be1`<}vlhljV@SFkk<+`jkN +P 4eO#bGr3K֐t\c$fڟ|gJ+H!Jx?ywI[Kx)7[DҙCi IzftMI4We[Hڠ;pU<ރ=Z Is'cQJ eӢ΄?΢珮X hf;gWSI}5کPȥi5t"iI[v\ (.hkP׸.>׽E Y[_s\m}M+403]g!% ZprC(.6í,^r$^3g2;Ui۩ iq`,f;{̞4JԷ =5ET_fSҊz3bXɟOfv{(`%-\R_>tzZ3{YҞY& 3+ (FC]kkni3vPXDh;_E@}8v뽁p5y[l2fXM~cf?%f-q Ձ3I}#m~3{ Wv`C`_蓸6p!0NҸkq}m3{4WfOw1 Tȳ 0.򰙥nrגM0LlI٣%-G rf6B //j}"i7bIK%p!i-|hۑ^K65$ y,3cZ36)S| }|x>,#I`\Z}_6u,EY-|Q=fF6̍,mx|$i|x-Ϳ'HK%-u ]/KޑG/rI3Ք/,bf.f6cUVXl[=}?OJԵ4n>_in>]WLJfNwiq!?1i ?/1߭Ϗf6g7~x?_1C RF4_Zq$PxX9e`| JgO湫/6z)b2ùI[:ڐ\_Wb>ϱu83[8+7A(P u uEW,:}kk.e(bp ;='Òoha{vw,+=pwKp}uQ 7C|h??xp%Pknu%= 2዁ˁbU%ƟzF.%-\Qg&þi<#Qݸ{Ez ZY|!rqW?K: ʸ%DێwWTAg gG.@Uђny3K$.wÕJO JX_X J9x}^Nz,?%C/0+>vpr]X瓴8; Q܄\;$m?pecr߲H|A׈'{KWv3i}'K\6➅|8_S|d>^Rttp6L,2$dhўKД0pb=>^IKH[Msm=~ qJaY=p9dpcr\q"W~(EI/H:$vŸ'k&eGs| >5 |fGykQkKz]/{pW6iuۛQK*w}=~ft]($e$}M̥WOH7-wC IH~ ;M8&zJ)s*>'fUBoرq:я1,5w/e3C]CE;8((;}z^ֆ};n_W=+ߏ[zH[xnTLJX@$O|J΋"HۨB;\2$QPt\ 0;WȻ{3q~jrϯ"mlE_q yoǁU#?yT>br$\`N[_v_?K{I<ǣI.c`lWX x5ko8'˗3J\/7GҦĘW2H /=X-9we.m{ly|V3㊷/cP{yܻ~3  \{G/H 8%[Ef%È9BiZq‘6(M[vϹ*՝WU ߃>q۸bg|s,I;5҆'cH&ɷk㖊}hkNÎ#߷$%U]\ڒ1HmIZ&s*vuHe. Gj&׏>Jڳ;>V\3\ prj)R fnfݿ_lg\90X?78OҞ'˘I]> Yy}?4Zfi1PҪmjfX뉁3룮ow<#['ͽͽ?G-\wu, u}6Y&>Nskɗge=bfOGoc 9 sR~~'o3{4:= ΍?&,\u::IdnMLב`sYl~a\3.s)rb|%I⊺%.p fܕj" - pK턛pfB[L"|Ak]3F9&du Y"8r䮎V{Sp4qρm-{RDC_WRT;g yiZCfYh&W@o716v֖t&p>Vv-V݄6LΝD4:I[6U\dwF)Hg(n1uW'RudJHS*K&͊ˡ\pR\,oN w3w%a)4>oIU0=%=/Nu^ `ܐxgwчߟ D9  &cI>&d0` "1Yd8ޞt}}vww] PI!*[@5j}bfcQOZҖVcߌ4-%IA;hwr3YN ݲI͆G}AS #[^iٲ`OWq^cSM 765A}g ffhf*ޥix~&5ٰC4E,<_ndfot^\UesdLd5# 9.IwOd=?w7;;slz.jhI#k٦lbh[3<.i_L:c<86sE=w8L5$͞L@-神^q=Zz^rUX9]o,ZlQes@RI@H̞ǭ8$7RJ[Rh7nmqa9ȳj`f'7=9"IN}lI]Exܜ60pˇRYy1~.yih7eO|ĕ '5ҡ+<$zcNBe_؎Kc9y3 -=o#Z}F}RmtIl Lj/ Rs*@ߦ=YFά:RЂӧMq,k3)VtX37"iy%}m7da'ׂlfq<,ġij:oJ%IRR6/.nI\]Ԛ|@Bv_2Ei;]*~?YU]Ѻ$|plt: hLȖh}r4:beƦ[mljXH2*U1Pg5pW` xƞ1|*md%^S60= IDATR4r~; !}1xïg$-撴FIV-OYs`H-|>#; ۱MP| -][,\ _T> <~ʲ0rG%%@+i#ckUbb]@kYo>ӈ%W?IVa&ZڢI1ɒnJ},)bڻl\s/V%cpi^c$-mmyJr=wܢiE%4 E`IK{7Ile +WEZD&)|HJq9/x霆IY?uUjcg\i6޵\qwڶPR t0h~||/ʙ |e`=/mAԋƦ9'⦧/hcpʇGL.N]tmfuho&IOuf5ZRw {#'Wi7z}oDR2DŔ6n)""y l[_ܪe%3;pLxzSwS- 2cb\(T At-cS4I `Z`~\2xydKKc{JOF*)OD t<.q3OIKVۓ%֛Dkn=:ߧzS+$+pك'yA=-565+WڙN޳_765<+ZiA7i&倥h=.uu yAS_'dܥ3UsS`_ XJRq?S6 yd˧NZG%FT>kd>c"_/o4l}]KcSD& DG|na6<xf&<M O珁<\,<;Hk0c=Oz ꤼvS$R%ނ݌gBRC.St=U0W}kG 6yA0<]Ʀp+m8 fw0}zQndƦܣԀgP\4[o9z jMEye TBL.zde3R%ofN 6G<<@`N<@i {tWҖnǃOg逃  @OX z#[77565 -YFn6S;gW 5bǴi.)5N7]E ^AX z&#[<-<šZ8+*ނL f=KNNʽI}f"$  j"+AD<-6lY_=!Z-V҂|)w}HZع en,l외 `J \ Iyd8" R^Rs@w $]z R I_V~^/hy%i``p}۷p5gf)IϚٷIf0@u!xJЇ.Fʏ љLY wU Ŋ6JYo@cg:Oތc}/ x̞/?]*i&`<.f] [R&Ld}1fjGrAAX 2tcȖG4 *.z/i-HU$m,Q`

xRe884کAEԧAAydgEcS }du<"ª'ǧ_={=LMfvc|%q7T~[u8JIn67$ԁwggmp4THwY4Y[M,\hyˏCk$?`.R(>T$%s_F}بPO3]XpeUf~*w+^ɂ_ +J vb% 4lW`<[*=+0>-H Oqeʛ{#[&ĕ#i~`6zR,nWW⊕*>~^oLc$7o+߄&)YC,\*bfHZs2_1b"u>N3'9gKe2Z}YKr9xAiIfx I$m_@?I2>X>SOAH(V OȖx:*t+=6J +)E2$J~0Gex֬$lf*54o0W1Ϭeˋ9Cbf݋g^kfJWmfJ8 8s0!Af eLܙ0#IY H `b+=6#P+YCzX0Gfpɾx%LkҼf6c4'Kf%s+NVuNW]mf7wf֌[me"iծn3 r JA^spp|V3Wl\G/ɕ2] NeGI .Ã͂giG غmgS { WrW$ ,ȟZ,QXzXG^6/eLORf oZf\Q_)R<[QJ*  hC(V  4{v9ɾ/pX!c\Hyk퓎}8)k<PpiǸĘ2]z^h3COQ)xK?7O"GOK:\Ҝ~$ս%H:@R3{ X8We4i?" *kK~mb)-{N5fVAy$]gpmfu W.o Tr`a3{TBOpm2.N,SK]Ao; JAT)cR:6ڜV A(V  wd.G  & X HӣH3}E6' )~  ^Ljޣ+Mx|p  JAeUs<{M̾ AAL+PA5#i~3_oy  M(V  n@AAB(V  %JAA  :[z AAJA5!IxGzAAJA`& ( `X V*U  D(V     b% Z9($$uC[AЫ JS+;gy2S.YccfWwG[̾0ӁIV13;w%tӛMvOFWط@7*FO^5o `]d3U SSi[fJ̇s̏3e4@wY ,˃cBAA%_E,gN 30>~̞1S3kv~%i4O lv4^3n֊AЛJA?PGvn֯VX҂ϳJB4w.$Q 19J-@Ҍ]LfK;jyJ[U+i /ZIZ@<!TigsNiN4_rTf$M; *J>$ ")5, ̗U,i*dH J\9 Uؽ'p=]M\SlՊ$ .>asMBiA J}eu48{}q*iT6~jgi$-]hAP/BAA;҂f13N2cG+WLr$*QII.= 7]`N ܱKJ -p%,)6p$#lIwPrtqVOۖtUvb켒Ɵ/5܍M'NT..FR K!-u tIڣ]Q`dIH4*)'*Ս򠨋IZEX`B~=8H;vBҘκHNKۖt!R?TwҾA$p9%=TnTTnrUdhǁ K:x+2'KxCN.I_7t}"J`8Ioe<_-Uҵ{yį6pKHxtw%8Y)i,t~vLvҶҼ&g0t_n(u`dZWҙxtMOe9.w+۹J`PKs?͕_,(mTnm͚ ݊6>8B=XSf6ÃT.*i{x Wtұ'3t0fK}Q\ٰpnۡilN_U< n!n1s=fs޹!\1I3 {Tns~߁\OCso,\;tn7Sfl,14Ɩg5W L紝g--ٷ3$y[f+^+AAWgڽff_O 3^lf"kZZ3hL'Ȼ7 )uS3{8||zZmǦ޿3's3|qC2mk[5_']of'KኀCiEhK"qjbY3kp_aJZ[eӘ`foQO7fooKj.aXZ>df7afvdɱ$߇+'83{ _טoiMxe fm'^o ]˗c**} [ISqf&f31\3{8: hQp%.Ǖvy)IZV?\tOݗeH)fų-Ꭶ7Xy%4]?3Ǐ$ sR}?l 3{^ 70NCLE?K+n1+AFBAA#V]+O@/<ǛȲ H I%GTL .!Nn6ާ`vPw*Sp㒶4px4̒K.7|ٿ)X>=Ol3=?5+2ĕy7qˍ|0dk}hzw _4p1/5Wd)zdT?I#2S1A]O]iF[[ m7`?S't=rE u?p^=EҲUuϊ56N-ƭNs3 W༆?z 3;u.p<$+d" b% "Y|(V܅eh3{xX^*Qvɍ%*K}Z9/'٪"o`O9<VR@&_.sɻϜ~.Tehyw:Tkt*.Ȕ?c,tI u5g7@nMfYTΎ+I߫k 81w6qS΃!_8R&64S}h|ɱZRx kaG\Y^mHq{ KT!q|'RJdzaf7\q**W湎KM ]P6݆Cu&[$3pģ~'O|p_.> @BJghuYB ;c\:ugr.W(iA܅ kvd[:=?Ée~Iy-pK|mS̞H}q++s;\A k,;{|'Xym>L?"8}^7ŝ8,yފkI? Zn-y>2&03PPnU4cqi$--i|vf+̳Ŷ])҇ PIw5XwJJc\'Z}Jgny4CW,,,~ID ` q9i a IeY5Y X0kyi"cmKu#p ׻QIlfwl/@-BFK:o'H^8hKZڛb vIfn3b/ަu`S3{nK5IϘ&pݕcf/K:7L9^x $[\+*'[vOS'%]na'P|'gG?FI:Oú_ڶwnJ+cPl4ؗkW3;K'If\oIs#:܂a[Ho`I+ճnap>nY>F %c_$YGQ(wQ*(VnVNJ/FNqωwfvYͥ%=YW\%+|7)v98ʋͳ i3~+[3[ m[d8Ij2j8*ENxs`G\ާ<}+I%KgfwnOpEg9kNH9i%n}T@i/P_w+m;"Yl);:3Pwv_.gө8S~~vO;zKϭv;>ρ3Kyp*fgAC`2r6I| ֆ炉\s.|7c<:d*C߯A>u/]~%udq9`tWpZ1H:0,F0Uӈ[lƃWSVg2] A#Yl!ifKLXlr2H:7x̖<I;uW#iF 9f{GʤMJ0`MfV?U27옾6:su]f71{ īIk5b  J+AAL}5E^Jibe.=?,B:Fx JZ$͊]>̮Rn`<&fV7။; J-iwG{f̜5_ GN.CnhBA+鸙c fvMPH{tq> SC/%MfffvĚ,Ed\w|pPl :}qmy+>~]5n]hf\R diR3=D+"9 =S(?<];jfvMvŊ7xH6f>L"Z$-'iI8쳙PAA: v}˧ ut3{rKՋH ڡ;1A Oؕ^`_B)̤bf%eHZ̺=y'}Ec'?\Jbfݪ[1S/1ԖJpW<=r,  U:bID’J ϙ&uI ?}}%͗>(ipIy$SE9%-\G.p켒W7aUi,Aj5V_C-Iꓮ I#}}m_v}%-\2/+7GYS@;fIm/Tq~IE%R7տpq4NiiUHzޤ,`TIoɣ .8|8\R^>>͗$Oxs;VPz, {9cgTf+x Iz/~]+?wO*- Qi܍SRH ?tObfMK2oR]J*GqC hI1r\$|*yn4fv_\qd.+.Kޖ_QimwVwJzXI/駒F"ޔtH?SqJA(bhd: Wt'k*tՉg GLrz_/Ϯ,rXe/܀-K_x-1kB+T8> HdOg߳߫ӀqYR~>IO/(S:q=gcgƃ;ρ N!7/ ~2TC~~<{cx207~?\+W۶ ~v]|WO=/HwMcfuNԘ+?ӎLx\ KgCig`wٸ:Wx3:s$ӳ1Pñ}qs($L9O/ % m s+ͬp]hf[R8X(]Y||a{_z/uɝԠw{mʋSұ S̓JKk_SVJ}SEn w $͒~3'N4̃#_/XJnɵ1_\/cf Mqc`[pHyIӾ~>6}3E\I8ef7ٖIC5CVws::6׈Uz8]8[훞lgrN6''d//_6cM3_θ0?Ǽ%k;$^yi0qf%:}+Pk2#C3{߼7 :>NOfv2_HU٪kTvNo㊚\ɺ]qr%u/0rrfv]_ָbq#3$Wm\)Sd-WgU3i阵_,,Opx>}; ~~`8 {mf;56ï᛹HeGVy`%4?ŭKu΅+zf6]čfv}2 5r^]žD$- l-E>Yqy)g3/iG|4Xb-q녥%`f"_jEw* X,) 1ӹ^+1pfEY?윮Ǖݮ~ 8yU2~_F۱sJḪrpHk|mx kt͒*(v#n#ʘ?mp+@%˙١|f!s{tmV5 zFqErq|wW¾0;Iwg/mwzd&9=y(V  @7eJ3%H5_yqE@G-%ٞ4Og[J#~9v mB9dd }6wG'CY}ٶx Y]iI5R͖K#p( SO‹r"iFB1w-S:͍y'?nfU`/IW9<+ep%<NKSق\wÕ;Yg[ܶ"%h;LԽcfKZ40RoGBnȳ7*֩43{N_FLQdUv H#>w.[,gfI:WoHݵ0S<оJ`5afc_}8թ{&>"0<;n5sE3a<':obk"\  dfe鍧$)7]ƻL*)ILJk%pge;I^ g͖ lLS!LQɤ -zZz%ܤ~c|[3 7;`Md\R FkvyJYw9grW*z3p%kQfv$n n9rUvj*SL#Z90JH3l[ oM'v )9.%|`f{*e-NŕPeˎ\~ϹKwBv*\[-[q+ƒ(_+_ogPǙ>warU| :2^I`Ώ.JQtЛtP A R^. 񞛽{33;%gf={9}Kr4޿- %{TR!(rnS͐,zPAt<=B/7lW uy}q>#صdV,UI 'm$}H}%<_nD1ɞfsL;pW>E sPw9ho IDATT <!Y-߮><-nUQqe(dH4r<[t"i \SIo̳]߀ .%1ӈIT<ʑ7cr3zZfkyx` 24Abhӈ|1OE믓+G~\6ĩtn7w n~+ֺ){s76=1*{9YvPAM>󜏽LNoIW~̫'-'w;Oȕ˔K?|]p^%m%O{)Yp-~%igy%<${[ Mik]2֓VH.Ǖ6sҞ䧼 Lqɔ1IaI-@M<)I%!G}gGqM$I7>V4wIu5Eqo"t=p=9e x;k5!)^ȍrzCbu?</2@YE v6qXe(riekat-[ ^WP܅34=&8_92Y dv<4@R e{`q= OSIN ZF8"`YR0d}43ǟ:,w|XHwAyjـ9=c)[9?&~IHMu -Df7qJAʗW,\TF9 cc݊ 9IJ_Iorxƪ"Gn.wK:^.Jm3n{ƟP/=JmxK6c_Uxq/q˓yx/I)Jkc $i<8!SsSh{n?#W x痀%RE(qg&p8'9l/ T\cuQ?ᩌW+m;WL3Iix"Y* *[X~ĭ2ƳIX:ohOii&l4y$\xNóV,g{*_MƒZ\tp[*X Ǻ_s[,]G ϲEJƟg}r5dIќ5Eܞu~Y:.Vů&WI}ͬ53X_ ܂g[4c] ȳU:׏t|oF\IُpIR9*R_˧eZW6[Y/s"RZƱj4ghmw'^xI1;p^\8X#=g ~Ǖ{-۶9)=|l~<*[ZL?3:Ã~!\}[ߠ C ugx&ѹky;9Oq~'2l6n4Wdst4R٧">פ~oMe9گ]r~fno'J3+ `jl/y27fVwAI4:^fU$=ifuZ#*}C,Gx֊!֞F3޲*g1&[dO߷Y <6eVfd 96j?U/kM4M Άg`;_D,.fhQdHc4?lJ7^G;l͎Gʥ%S*d뿓~cqsˮ%|aܚfkzIvYА( J(V `d <ׂO]3{N}^I} |?2ru^'?SQ̬c8 %Klfzwi==$5 !X  I'Y[_SY&[fnD҂ٶ2 8dϦfMSԐg|Uz}FJEz% :X ?7 GG),JfmXW$]RҼ5bH!i*uʒNi]W~, 24ᒖ4{mhRU+)iHZkAf@r Y^Q+ 2&?5rf,kx@>HO?Hc?'ef}+Y$|Yc}3DK= O7{~$I"\uL,RnfZ H(V (+VECCM7=zLv@ d'IqR34xThO(*;=?2ww$+.NgRko&c̊g!Zn-iv0?6=.I \I5{Wd.bp'$-kfWD3;?=*|W N((1% 3 ALWʕreRrX\W*W.+oVWV?V|,ÁА{|EY݄n/`a7-By)ualAy­Oj."S8c:8W|5x i)˝]0OZYϮwUl+V>óEOIY֬ydf/&UN+PPűAG0 TJ7Kʱr=5hܽdM\Qu4À=M\eM.)y R'9{f9%lRk7 Gk%).]jZ$3fA,#~)黵ɍanI;J-$V|n3ۜ%_vln_I%تZktx\e84ٿ'p䟫=\(lPJ v$v\uY~WӀg܊+l7 ׻I z.pth=IkKZHPII:A}̀#AR*WʕJrV<(!tjOhUt$$P܊eNII*KN I+ BzJ^tw)II /-2_˅' ۗ]mQҸ){mg4+DX:c&ڕK:I0IT->t)vHZ8>z:ǑnMS5;8]⒖#H<{$[ mfg}O:-pbf\I{qeveO:vaқ>Ń-$YfǕvߩ k Ĭ N#fB_A4N\Y_PoL5&~pٝ<6}6Wuҽj56ˤ{Yld1_/jfooUѸ}bڗ]$f֚>Gݾu)) rW ,7p3{[6/K OV+&z, 3Gkԛ%b+iHjql!|AD `R*WƟSN}ʛA`f_j-N߫ +UR6ky  5BALUJʶibz;-0p  BALJYz=eym-P"c{  BA:re7 B7$ `Z$+AAQ*WF&>ǷM/7Z  iPAB\YwY]']'$- \ײAALb% QJ twZwND  ^"+AAQ*W.v'=Z[mo"pmAA/3  JwGRSePcվ$ `Z%,V nS*WN{ {3RMHXe  JAeJl`nt O[k˵=#UX+G|  ^$+AA(+W=ן?|#By"pmAT +AAӔʕ%Ex*(2x̞kA  e"xmAre=^TyX)*l@AAN(V )+7vk<ףEn@AANA Q*Wb7Z[nAD  D(V N)+'?bۀZ[A>ׂ4$hfvo~ 9WtY4̮Sl lfm; ffAHdHZGs6}-OIu 6q]Iُ{TX{E`63ʶBfL~~efgf7n94{ZFt.0~zPA5)+b੔9z?w@;3wwKL//_ok0Ǥ26ΐt}`ܪTض<0c/4I״(^}_!i2*ɚ56 rK$--;}-G=l<IZXR(fb8ImY&\࿳ Y5:۷.0+%eq=,_f6 ]%- `fϛٱIx`%+Aʕ!g.4ب7=+U c@r=Y%3x~{ jN22uZaZ0MQ7GZH:us?PjKz"M9&uWBR_qn%Z(Lr<ػ7,%% gefv]Pn gC >νtxJAЁR2 3Y^ijg `- <%@K&O~+iI[KZ1oI3JZ[V͕`5W*)iSI%[ ۆEIkI5d+IZ9%m$m/i I3gOrsˍ[<t_ i%-j],+F6Po9 ۇc$M_ZfOg(T~(щ̳ԩ;eO:#Ra`ZuAӢZZ\uRgQI#)a.U}Xw3KZ4}1@e]IB5Tk0?6gťjó̞ x)8i' -[ZeB݅;+#\),,h7E IDATkN٠o JʕJ*reRRrR\E\٥Tl\*WV-+ ʕ!refF`.4XSkwH Y?s: DlZU?'!syIOYIʔqxWpRJ-p1nq 𦤼p\_w׍3Ő-<*Bi KZ"3KoI:+;'U[Xm>tZ. T*ǩ$%Wt_`4)X|}xAߔ i~Pl%=\/ivIsI7zz̑[ЯLO B\i> xI1,S2 ]ӱ;F R]PңV*l%O)|ڻq $PIFH:xUI=y$+{L M+̌X xxqk =̡=1tCG_:zء +^Wg8t_W =c~?lk*ǫwAe '1c{u]eҶ'ݜ맔fŃΞʞğގJɵ:MT&6[d6W204]wx7}LNeNe}880$U &HZ 'Li#j$z99J*=JpsKwSKʶq S 9p8Ӿĕj3p yҒ;20zRBT<霾(WZ`}엾9;$}F\p+se17+dB~qpnqIO+1`\?Nߣ\pN^ij \񬸫7=PA{;j8~M},>KoorM\}*ۆ~_Z#m] rey+'~@K_ůyXn ݯjs+\#w[t/ غϯҾv]sfY<^ aϲ9CFj)&~1LaZ[\ O{r/rǥreM >re($e.4خ%==JSȳ=|?}<&y']xKeo5@/qaf!~z7&fqϘ7|t_|a?dA"Lo5%[HwݜZfJHOw'x0tSsתl𠙵o f3{ޒV+E2Vz0ow1}r׀9rVcseWRN^Tٛ>ŭm'I/_&VV}ͤ^Mã1]ApepaI4!(.YگUcXA/秲e4X.m6-r>@{sZq|Pv椤x>'__3+֒]E`fŘK7ki.@y#]o(c5|>͕}ϕb$M+c~[˥2=צ5/3bMτb%Ǥ|)X-7J-ͱ( /(+BcZ[a1n5 1,n"T㞑m }>J窔afoH&Zp`Y2Bi RXU˔hY`F@ 2skԇA^kQe͏(ՓmN,C 3Y҉3O Yz4lqRpyu WR|8?Yet'gx뫴97I]:Ѳ#]q\N^1%]W fՕ/f iPΏwL]#ic\v*~=l,p&W6+k`d0Yy!\rX3ۄ:s|p>Q*Wׂ g5s҃Bҿh.܀/>fA`ߪT~2^W_մ_Rx섍qJ,Rs-P 0>/RM34_`f:f|b3˿#R.M^%H|{p@7 o&S i٩,Kً8loJJ:g_bfgn;g7>m ,31v=6;yKp;g㱝fJlOΝe:h.5}ٱ_ڼҔ E}-`E^y͕t=\+&w5unU;ƒjFoJI] TX*W )Jʉ9i3Lvokm9D Ǵ_E5> +ir'>gv^.GL{_ S$ 2:T"fƏ~9y2I=klc)mcfb#雹V`m;SBWfv'> pS\[q_/SIiuEL9]FK&lVEˉ9kt#K+^:n28j*Ɲs CISwRRgdqPQ gl]I_b>ڏ9nx̬c]sǙWd܊_GO 7$-b?Vh >pvO4* bȤ})PkE"ErvZbf6]~/d79ц/e<`=)|~g'ϕE4PLyb=T[I%y_҆ft5%e <<5ϫITt(2B VH?}`b$m-+qJ:Toݴv=+)4 #I%Eę1Hgq%il]c8LaeliisIyn<~Nb$+oo tϥ:-3n}Qfx%WbSbG\yGRjIKϑ,eCRIC ~G㙹n A/tg9?+˳d q+:_?Lsf4gߐpᱣ4#pk%#>TIҮ*cpI`Y5\ZMUkʜ{$7SDҖӶNSty9 ސt*TY1otB1(w;Lm&z8 WGtZw;JҬqx"Iԓ[xpo݁)][%&f=a:tAWgٛ5 ҨaAMJ&}ź\;R |$]L{Λͬ KIIw?'3WfIJqU^j)Kf1_Ӛ~o%!=OcBAǻسI [qYqWE!fNzG!rx̝gs$^ce$ƕ a,Ǫ)/>KGt_Sb70Ul-a)[Ox':u<>J\J._XAH_#Oˀ!)[3ԙ W_b#=qJYͅN X w zqH+H?ЄLL6p P+h(C=kZ\x|k_LWrhZZ[A0Q*WvZrF/4+1-4ʳo͵okm!,+#qoWO-wʕ_j =JܸI}JCB2 V7V4gAR% bΠW9fpZ[>ğ^6kvAg0N\ٱntD\ 7QmZ[g *`ܬ<Io >-YnK  #ڞݍm\[k>p?0xTMA@S?3Z[~=)zX#Z[>jkm9X] \_*WY `:%eOۆvP_ HZ9pc-lD[)-p-.}?ث_m<!.tS1"x#`xz_u8|^,&``"zJu#iY`S<},f|cs\5:*٦*V#׊x:>zzv hBǴ<2NT,SrA0p)+s|wZ[u8f]5/Z>bAs濭VQF3fve/5̾kfr`O36E ZhWofYlS 3 8zi*3 !L_"5ۏ=[L+/kbf:ԕ!=ajf'{b_=L{rLKbr9W'W\I H sI MYlYD|MZ_%-)i*s޵ƹ:, X5J±lT9:X/.t}QLiMevtRg%Xm0SwVI 1U&Ih7XbQsNI.iٔYmP6VI#$ZNY\$JrS.MjʓtV|p5CH/<_tGu27\iP3Z[&YY[Jʚ=+YRrg:ސ'*kAz *B+E*%]#VPq RE -&).l/K88xOnHEex̌?Jw&vO>I#%d92m21pc'`IoI@yI'yZ%m$<^Sn`3{ P-폀sӾgX+I: %AY_#i$/)X}4)r|_pI^Ύ}n.RK:~J{ΜŃž$lN&į|{HZ[sz:_gsnt\Hu:ETI⊵ E:H89Sҡ 96^ż:_gXQ!π :;Ω|~ki^tn3I7kra߁%)\IHBҷӽe` IGn/sZ.muH*ssIO4Md꧴[*WVăO~#KwZ[ɧAt$e:f75$I?Q 8̮JeK0m$?.է'm|ѷZ8]7y;3Jw<0E,;KZ'vLM$-pEؒfN*&,V1m-ÿB󙁛J=+Undڮ$fZs:ruV`fY}TÕjfGf\2} n,KuwrS?!GK7y`0̎/uuPwe)pp}np eS3GP\_ -iq&XY6clߩ^[Ro/i$=9-uuMcqHRa\5Ν8\LFv2nفf73_(4cc`aܒ$kۧN{3gJɸ&sI9ϼ3ylfʖ]b--4Sfv%? o!-`Isn>OAt’Ə7qeW޺xFΧs8)@Gd3̶27uPܮM1< n )mUNdu:<W<.wfBO\(i^ v*Jp뱱|}̶[hH4sk.YFjAX8=,EX-DP%QD@ Ab$AQA" Y$X* J dQI%vǭa{{'tT>t׭{f{v<|r [b`t/S»Iӣ_b 6PlSX5ҾBo2ӎW~ df+VBU?#P*wifVAZTxN=ٞdZ_+$g77~of[+IzR{¥ݒ|f*\֛NU;X'6pxoE/"7#laxksWgbf/oAqH[Fϒ> |adF6 >v?[W6ٞw_m܇ہi]]m˘%ը:Y: M.0ڎ9>E|BV~vیv1}KYg!x}Nm3:S+T"$Zu)ҳ`\}ۻKYTlIYP :8Ƶo}e=:ظjoaZqEEͣ碟6@Oz1QqF>#Ԋi5kv'Z/-q%܌?[Vv*S s~.{o_Bͬuxa>~ ZdPbeʳd a%6 V<X̶koN7}^"¶1-3g3с $\^ofG[h"N+h5Bו֯Yp1I e΄co}r `-H&.V3j/,V]N-rRq_Oߏzf} PtG3[؝K9Q՛I= 1-&g.R{ 3;]Jof~- 1?{[>kF6 {Pİڴ KX?3;v1o(~?Lxɍw') AD *u1{}칿ڞD;?efvIMw6E>w}̾hkۓE W&$lmE q3n6~(&Vly3ۦel~,y^ u`(N˶p.ũ/:б-AFZԏICJoi kf0ݿV#\lEXj 3M0}qf؈Bb[`wwbxwL̖_#t[92Ӌ?SCX*ݽIZ'efٿl a Å =+&F-BX&+a„ֶ \[ķr1}}-}a509넺1Ŷ+.%t9Oo\mNS^hv j1_F޿7c-^ؾїɺQt*V@|ÄzH(mP|f:^ I# iN{i73=l3;PDxQ3;&V|.2=+Vpo|ffeBB BBbC`{ !y 9 B{lPu3;̖h~\CHxNh}a .--ߘн_LioF8Bª;-l:i3ۯH^l' 1yF=g?fvaf[dfͬg%{ _!-_v_#$[c dx^ m^*Rdb"?k 1|{k5L +w|7tq tl7-,D)Q~BCVWfXT|zZf71cljW6>G"b|ۅ`78@Jo 9{+xZUӊ3=RibZi?Wr=!:H._ՕX!+ ?E[P`Cn#1b% lgG%"utuB}q[x XOj7g } ֓Xq%N;[8 $YYwT8DIQi-Κ"ŠFXrMl}Bu[DuXYxw*McJ2Ï0"ϒɕۭⴷ"=Τfh]FsZ郙nf"-`f nL1Cf vՑXB(ԣJO>Y4%.\i*"248()`aE;WfEWߡ:.ϒڍʨ߆; jIc%~lFt62mdp,yXS48`J&GWuXpMpAw3y<|5W $"tS`C^ɳ䭆B6 $VE-1wք+/SǼ2"iB2NtEq: 8䰽,yx;X#-*:("""=Z1`0%G mR3;TcY!Rac_DqfDq:8Xİ,9{L m@""""]@ ff3ۯŀMwq~G%wl,eJDzq8ht~myµ""""]|jc%\?|-PS 2%$[z <6Y}Aɳ(଒V.(?H~L.q,9`{EP}SNJy9ZBkOfoQY^%l @,"(N?Qbㄕ2XĊHtbq3[9m |xX2'-3GH<9,2mlG`ʳd*5CT*[&$;1 1ϒ5t!Rtせ I&l:P``3[ݟUeB3[8،/HnrYA%Fq&`COy{+2xPwt%l(^kތՒXq_|* of~]qӀ́xNn+ |p2,5t&8CP8eP̖#XyDDDD7utzz5;_˼.=ƚ83. UW,9HK;-՛Gdt.mz-ϒ2d3` O*aJlf 3[j+""""WV `7SO,i>l ẃۄD9(^=(׆ #2 ,S,y`;}B] nDDDDdf~!ty'$9ZC#~`ks@ B5f8,#ϒ78ݜ\3YFlE%\G"U rJDDDDzSrW_:+g>W3[89gydQnE󤧘m"b 9͚f]/{m+?EDDDN- lCHbA؎36xӓ/u;u9ɳ(N\g8G%4u}γ\D›""""e*wAf棘sOsgsj,99Uw(Nɳ䖦I8] دĐ4?=[V/tZ׺ǽ2w>~D72'ۀ+'?fvdQ0WoO%W1[Bsϝ} m`[x8kH+h}<[x.Y3fk]K~p;0;pb5 B%o.1f1-qykf+/DNrl-&Owku'3˳(NW\+S8'ϒ KdXcv @m?|9zspmq>`8]%ϒ' KdDq'YrwCለk+Pl}3%f`sׇcYIbQ1[%88vl, 2Xiט٭g ~Ps`;w j2˖Ҡ:qE5lU3m~_% UbG lEFc;5}{w_rKo0[=[!T݊rl~LD"NXQՉEDDDDD@ʍ~OLq?ɎwOUc{o|alq#1+_J?paGF(N'BuआĊI"4p 3;J4;J,y J [PvfQ8`g+k.|痢] if f3ffl>[Ю}[SC%OٖiA'D$#] niyP8"""""2BՕX`2p"-wt9f3m X 'Q9Yw`öM##WіL)""""""3+2phQ@iKX`=f=ywefcl^3%pvϙj^{'">yqqLl"]/YRSUWbſіX!,dW8J2^wW&?l{5LǟQ.P<2DqsSYۦjwVvN-'vSZt 54 _\qb[ pis7Qu8E`"Ċ,< jf)a%@D{rX)cS#u}1fF9Y?`s̪ [dֵ7Pw7,y`DDDDDdk y˄Z*[;j_qHw:P?c_Fqf%6t(N6-1znH' taB&k< x x=L#$r2BGg1mwgTBGJ 2ӉD%"K r[DDDDDdVgWk2OW<_q}bq['{K/,byu%V.2즶۝;*vű?8NFUbgS=H%HJ'Vq3[S>df괼BōV_vN,y+-+GYBN!$:uP1JDDDDDdjKt`MB*=hfߩ0by\l\bQQgɉ &%ImK aH-J[cff3=hfٓf2p$O).n8؊d˳ `#BA2~IJtQBҵS/Gt (`YB'wKV, /[+{rwSz{4 ls3Ml|1_, (~ ,TYhSȬTӄJNf4 Ǹ5͉m<\ l lf*6*ʳogBJ (Nw"$:uy%4̺JݯtWMwXe2 ef4f<`E;]*cIfo]sgE*2 8]8ĐݠDDDDDDjWKb/k~[2Eqikcfs8By_a+C(9 m;w%iU׊~elNHc0'*Sre X ,$+"""""RI-lw`=Br6d.w9 Uzޅa+PBŧu)X%鎄Ŗ%0SԊ9Q XbS #"""""ԔXV N[bXk`p_(gQn[|JKb%6H+(nn{e1wpKlK3h{E\I)H#Jt(N!$Jg/1ak_Y&D]-N:1`%L2jStre1(N7+U uU tlKcHDDDDD3u%Vv6Sl3la3 b\m>;u- l>¼")V#w+mQngꍮ{Eq:?p50,DDDDDDJ-o_9_3s_Vxۍ>>WaKyU$Wf/9|(N[\8] xɡYBĊmBh){_ofsu ԧk%b1 r71H)y< X+9|,pN֭AQ. \Tr蟀HDDDDDZך3-U`)wH¶chɜf*sTU] *b(Nw/PTI;,yDDDDDDkS3±@HǞ]ew~_D84!Q4lEWRiJ%DqarN1?p^[j,y9ӛ)_`A(NȳCl\ UrFyDDDDDDQ׊{ySn>4j}1wp.p\ܶ&$]tQ&.ϒ i6qEW(N~Iʛ*H}J|3X1́_]ZcXt`߶c~^|"gmQVYӸ(N'Wb-+,tZ+;;SR9fv'CuWxP''1fe17jWZ[Fn֫05`.d\]VefSw,p~IPSKyLͳ `cAnik(NtAXQ8 i x ϒkLDDDDD9%V*w_Ѝgw+uu*$\} !?rW.yx3nij"p$htّ(Ng`^BQ*˳oE&"""""ҼFV; أy#m 3[0'w-g NQjAr Mw]g]E !~-}vɳ䕚'"""""2*'Vl0'pfoi*:5_3끓lwśy6?SBr,T3XSC,9fUf.B2`{{l>JH 6hKp}{ByEgɋy|x/sHuyHI-J'Vz-z總[ہOmy73"ϒG,Xp3HWYrp""""""R*+VV~ Lt Ylm38D~=!$0+R *[f,ض.Qx+]aNN7OꦴOs+2 ȳ$R t"׆ Op`yfh#^%3yRN,&.o5)"&{}o;ߒRf.- `ifsHͶ ^>̼|Nmy2"rf~$IbƊ&(BRʈs1WGREħ{sA1vX?X9@byfO\ \GفLs)n8ΈuD<ť灷qO);_ED45sS"SS_7FћMI$I1(=̼.3EUtd.m`vfQf.YG?|j>P/5t,%`3[m{,?̻3 a 9E"J|te i%Ag3ifE~ `]y> pum ($I$I#&݄߫:; 83|(3Bɰ)"vd\,j̵zyb]V4EmCd>P5g7nDY^pf>OrvfYBsyc=;"xz>$I$iXcE~~35"KD'ydqVcvn0%vkf^q)Eonغ4:5[6w4ǽg{SjЬ,v#p)<͝~5`,-#I$I&\GADlMr8- =c.9)~ ]X]rtGDAsIDܕe NOsN05"\y(37)3_)?hMfu~$I$i$HZDLߥdHDdic5omf>=H t%{ds`i01 촑>x ؂+Oӛ!uz>H%I${V4DĤx}=ߚ `Jݑ/$׶'M̩2aŞ˭<lziη~_S,]D\@Y̼qz>zE~ub$I$i0t^\y}?ꘇ3׵y1ϸu ̼8O|?f W%3VP2Sv>N 읙 8N}}t^1gK$IҨ3nJ ԝwZ(cw}N@e;V6"b9'3h6M`j{FD,؈X* ".23?fiyFj dO)Kۄ $I$ ;+^8lʮWoխ3"b FGĔ8fw]On̫;홹XZ/VF1/"_c QJf̬db'P>1E,"Ԉ89"݀?ˀE!ODƺĈX/k%",+˨՝ Yߝ$I$i$XѸ{6#biD\GW#ʖ{77_VF(uA)m^WS2*3#bcnJ&̩=z%09rppmI- {Dcmc,1?"ǁ `ED,3%L>NfssA)j#`UDoͥH6 f5%[e58ܨ(:YDLAdI$IҰ[Z#2Mט=Ҏ.9H%psf.fw/i7S#?οױGD,xy[W2A'eR"3W]cNb`ǢEz%e_`ppIfnetḐ~@>٦̤|S/;d暈 .ZKpV2~ga&JR2ΤӸ^9Kղ>]Q$I4XWD̥dkM̼a4'MV$I^\ $|K Z($I$i0")U;.Tkl;Z$IbXO@Ҹu `WqvPZD$I+z̧#--ONk^G |432$Ijs#S3yff* fm)ndgqܖ]wGϻ[vmXUWaEP*62H܊^nz kYV겯tiV(t\q2faּX?mtgh{Q5˴sF,#D ;c e=q[6vq$&|xuE;PEZJU WnqN[I˨A\e@Ca,)M' QfU?G Y<Xo;5J{h+q3iNC@V[CH_L nú-HKA7UŬ`l}&+ց4֧\6O 1Dܾ]!3Lr VDdl5S&䦽VQdҰ죚}3y͕xQ/<DO#x$0Q&WNcTkd|- {ƒH[``y{ܯC#4‰! |:Ů -Q4(\rnKyUI;iӣޭ̌~""qw'iOh6❂6p_Ta#V-c*tHis!U1~]@ 1"@|DiF^ٙi2 J3UɹTe11Zb:׀)BVoRQO ςF#ݾp%_c /rr V}/8Ͼf'ڦR7 ^Q$7ad^ Կ(Zg1  .=}xO3>h?&_ sg ӫFydد7oWg=d x: &&,%4[?.?` I2eI]b*C!bitɐ bIQR&KVaꄖ>RoeVٗQVYfSvc/߰7,LXY!IP<~Y2vtw5eW/["d6x9v/qUI5L3JP w>]Gǽ;ɾDb''T$Y4#VA7_;ftmSLP | : yLl5 q@cC=ِ@kas/9&pdhS`|)SD&MnU6GdyԺwKKz&%N3N_Wc^`?d6f<\*)UԿy㐳r3_0B2,su]PncC;t@s-r!d%poψIDIa:Z[3)Hy̱gz՜dTRěd\ I6{H'v+W\rL/PShP%$UOt#HvClUQ%, :P_W1+JR xr'L9T^5T4)(Kf9оC9&#f|=rw-23S,p%榵3W.~BkVas/IPr\"8*wvT"?`iL}|>YwA׫ [O,!0ﰿ<ʜ,Ju(fo|d.glglT^ #Gӻ>k8F!RC2ԩ@8"|¢m>8v*=0;9zL-5{mc.fe|<wh~fl{D JpX-.,&T UEp*?d*R Rh |$eºLXח 2a^&˄LX +︺$,e ftC{B7I74odMJ'2曡O*}h3PK͏H"PKH:ccmeta.xml OpenOffice.org/3.0$Linux OpenOffice.org_project/300m21$Build-9319Unknown2007-07-19T15:04:032009-06-08T19:10:165PT00H02M32SBarth NetterfieldPKH:Thumbnails/thumbnail.pngzS@w;|xWitիׯP~y&08ON Le&#~2*|cPƈr&96|G~s-55ԑҖO9㢷+k+o'n/7]]~ߊ⿓HLqB^S'זD~zc+._$>@|A>|q!1"za A3 &o`YUy%7#tPiv_"Q6^.w.hI )KNL2;xk/2oSH {VX} ;~.Ξ'/r +M~PQeLʃ+wFa .E-7O |.2]r ϱw׃% f#xbB\n^F$E:I(Hof;8;:8!79 ?h$IkYq%%,=:nD,uNky3k7n 1# am\2<pץLx*q Aj Ӻl+5"nݎВvWI/n_|zJ]S6`+ 6#Jv5C◩t;s kU lfxak[<4YO#}@!$aN]A|nʖk wṞg8増].mH̒3EiA1G\(W8&V$VHq)탔J?9vzHaGq?]u>4++D,NLXڞRc=0!³ԬhvXxS>WJ9'/@Y5-1'Z˾Xw*O>EЙncprtsLq}GcGۈ/b"#,Na3ۏ̷4ʌ01VCλ;.Ɵ^>2 )K=[?Q ^N'M] spuM>{vzWJ87X*Z̰e8/B4 os)A#%\E6eSnyg*vT/Z5nGYWW U r\DV_W} scI7SN&ҡ),t!}=Q΂/7ps[ǠǀUv cox:F2[I4aRZ;" b-BݗCZo( 5״oh,1a),wE\D/;S %|r&՟ ^ΪGy/\P0͉p]V1X<5vg!=fjE!%0qK*=x:zSZR\xk/6ma&D!J3& 1gk A: ]QKGر)swɧ!6]@ Vܰ|<.Rmcq'¯l8/OE "?.dtXˠ|"n롮oDț-Xˇ頀Kq~O=覢H&/g)I/uQCgTǴj!U:|滫N}UsOAX&/^s wC={[hBoΕuE `6[])+V[?k|/jaɲNNڿ?H ]D͎w<|y5p?Q^-ߊ8gN*=P^b_jQF{dߏ v跐v ƂϾg[xMuDmwĦ5_~[*lÛ#}dcΫ&QO]vUŦDf,Js\.h"+0IkJ %j{$4s/&_dֽ[EOAu6!IVf 1dABٜi_ 6$̻V+-"C<%!MB#'JuŬLb'+A)(R[CzvaG :#qgUʹ7 =FJ9[@k'gv;=DŽCfO <2@'SPX:lDǢj)cp3~i&[脅D2'L=Ķ}3 kMz(g$Lp;31xE2CVG~V R3im-S=\IYZVBM60\&qK5-([ |&ωt`R&҅fYDZ.[k 7#x˧]HC;vt\ vXbS^`4R.YkE"\a/nETx);9Emq_=3޵+@0t:i8׀KOuPw`@}>N^5& aU0x|f"\?lr\DT_rY4kE|ԞsZkMm~xn8FBͦ_DZwơ]skO #VAl媰} pdr?ge=$V*ϑmV<+Eu؛Ѭ{J,,E?_Ԓs)uϽbN#э K_H~GW|*s'OW'AUF C Cm U / 17{9Onsm~ fNMZ~?9]B"[\AjEƕ~{T4}Ob;#~J\kcA8/*9_XчOGd0{m߳C%>OG[sDlH;u>)g>e6mYp0 #(H%GpʝRE'8d Uf h1kELAr+jHw'e3}q<睛i8mr,g}x1o8X;OcXϜ ٗ>Čt~|o'SVX]h0{A Q5A1y-Yp3bDk;p]bӪ >6dIUQ6)e8av@=x0g4Tie ؆JY1 Cl uXoJ.x2h3."'-$LXd1b:͸/"bl-/_QZ:͌s g&ť\T Qܘyo2Q۽6(!@[]h4T5y}C 2. ;wʨyxQRgbnʒ3hLa8Q?-M2 )h8',<; $i*OJ'obd啠p4+k)- mk$a#ϯg.HŮGXؙ)((_ F6Tp8"vݜ*<ث ŝUfwv4exz'#0J:4m+Ah<kC%XBGY., gs̨Ew:3J(KAblFK|E'{UIE?վ٠\ 蓥X_.`5C5xwr˵,p(~SS^ibmE%pMy &&?rhi]a`cT}j88>E0" M|Y $ -7 ; m ,Ɵ@vm|{u ?﬒ .{4;H. B $ilb?FƵ5ODElǼNT;qkpֶ3 ɶJ,v,xEׁ>߇U0$ꗯ/CqE[l@%jC -ol~l;u D|dqrޏ "gꑘ)')[bvΎ)ЇtQ7,Ud~0bEGda!&pa–s̈T(cj"tbgy愺Ƙ&/pyb#W.kp}wW?CgC9{՞(Is}'={ z}Jo%{%jL+懳֨%Ym}uT–c/{lm?c}@]=B4OMkD@Vuii T]iSì05jg zi7`GcC|$Z .)xEY|r(+ӺQ|}[VQi3F&ܯd ϛſ9KY.1pvaR8E+em[^(ye멡ﹱ[醼8\mZ}uwZjFn(n.+waLl|T i LC;΢Lv,1;T|rY ]e6K=i0i*>N޽ntWx$ ?үAV%_e-2RC'FL2đ4q >~"#ݜyY50[hSM/u ذhV%@P{7#z[%5E &*IC BBo^a sbL$vp?bn)!_>/axyK1nMA̦7h<^K2fEɪ} s Å uar3l#aVc.Dmh++0Kt^ vG4A6TaW[ /qSGcQk?˧F;orOkbl^vdr5i54*dr,z嗌U8?^:Ћ7#/zl,X~ƤiѪOl.e(BZ"ΒǴ^쵥U3g=*CsP'TrSwo ؖ^t>/+T Jo0Uï.ᩜ];,?_[qRgc -Lʵ??eC{QR-XPy e4E0DF)S;c.`݂.! cI)C,%PT(b\H^?|8)qo̷~L :{A7duo~T':3/6۰i^`^bdQd=;Deݮ(9z98}cYW3ADq⫬t`s274;m@\PƲXp{'wVBASs(G.lۖYd w]w ,B}eeҔ<]RUT:6עK70옥mg9?tSҮe..Ϡ㮉IϜ3!e9?||g&8FBm{<*+Ty|wpSL)A:v:f{,Jm|ݲz a^H 'OpjD%SBGQO*b)<&ܐFwI%2$3-`^H^Vu#h5bf5h0%+ EO{ _|W'o:\ 뻒WzeX%f[oىVrU{S1!ʌ]K, lBYjIU,߱H|{J;{gJ0m 2jvc@-) 3rU_w48J\"o`{Io0YfwWkNg'(j Ը~ɑkF&Ȋh0vvfXiJ$K@p>˗FeY"J~聾huIe N`A2S) E^Cj'e؟6$&$ +T#|C뙺1a)躍](*KfgrcD2 Cs!'D^l*0vDO{jB# {5Pyr#FdF2:~^O5 (j`?2mn M!?f4 /)zi>pBɬ o=u[/ko뽙SԀVs(S"hFT!tsP#uР?t0IgHS+L2ZV|EYi&'oaZiߚ!#X scOǸ컴ЙgVÔoY~+x܁LqePR\3$lajP!W6:g,eBIFHGAX 5QNHwd:e#wW3]P I{o˨H4 PKruA(]+PKH: settings.xmlY[s:~?"i`:40@9}:Iﻒ!I)H|޾v}qgP c.gq:SA3(K@S #^߾ 2%4MM51yS_Y .n1iV[,gwgfFQsw7F(|vתE}!?SvQ_!_"hm1uVr=m@*/^ |1 6w*;\ոn\v.SS$^N#ͼHr>~ո:Nh!ĔcЙ39`(ɠ5eBqJe[BW KOa 񮳊3̽CV>:67hd.}CS)GD@l'xHl;s͍#s'b2&Q6GUzl]UIo#>UVջ~Ƞ*>y ]E8zxx?/dX80ƌyʎ{ *%%c@hl`) lCu]GDekzD13EMr%)Ij%=˕6dSKs/}"l$U-KDFd/8AwuHRAWgŀlVa CtJpWKF 0q^EYbe(ޡL2W$%`:@Rs|t:~5!~Tꊕk>ɔ0٤hGhkxI ]Ή aŁb\yf74Lbݗ*xPl\jݻe)!Ԟ5!n KHKr+Հ&/_y#nEk=6)1u 4#CzIԏM$@5-4FY&Gsj*ꔈ/-Q-%p:h0~?4'L| L>]ٲя̿21V=;<Vr)6 ~k-|'̞*(2{2}*iAEO3ܻM:uwKsLndKK~B0*ޭk;k>~PKr PKH:META-INF/manifest.xmlr @ w ɍ%Gc9490^ ``D_&z:5{ Z^&`Ъ!E[<=^],{D J)l W+փڀj{PXڿMn4tCrV aH8f{W6Ud/H'M^^05zR )ߵjE>67za6qBS[ʽFwER3Hp7!3|$՝KG2\Go̸ٿo#ΫɼTo1(߇LG2yxf/VT"_e9+o2_z^77w,P`p/٠=0:G!Cs߹ hz~[l1wa1ܤޗvIH~PKDa PKH:^2 ''mimetypePKH:MConfigurations2/statusbar/PKH:'Configurations2/accelerator/current.xmlPKH:Configurations2/floater/PKH:Configurations2/popupmenu/PKH:JConfigurations2/progressbar/PKH:Configurations2/menubar/PKH:Configurations2/toolbar/PKH:Configurations2/images/Bitmaps/PKH:]--Pictures/1000020100000481000004573171E9D8.pngPKH: =X)X)-Pictures/1000020100000477000004626EB760F8.pngPKH:{.ʫqq-Pictures/10000201000004560000045AAD14F665.pngPKH:0(b,? > layout-cachePKH:*("gO" > content.xmlPKH:͏H" G styles.xmlPKH:ccO meta.xmlPKH:ruA(]+S Thumbnails/thumbnail.pngPKH:r | settings.xmlPKH:Da  META-INF/manifest.xmlPK9 Kst-2.0.8/devel-docs/Kst2Specs/src/UpdateConsiderations.odt0000644000175000017500000005330612277111530022660 0ustar synthsynthPK.V8^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK.V8Configurations2/statusbar/PK.V8'Configurations2/accelerator/current.xmlPKPK.V8Configurations2/floater/PK.V8Configurations2/popupmenu/PK.V8Configurations2/progressbar/PK.V8Configurations2/menubar/PK.V8Configurations2/toolbar/PK.V8Configurations2/images/Bitmaps/PK.V8 content.xmlZMoܸWs(ly{{d֨HԈ EjI=P/F=3ƅn$~>)ۯn A6\h= L&*rz2"OV'T$ x4@kL&a' I2YA|=qĥT"2uI4=&n2hQF,Ofg D%<Hb~<=-Cȯ b/-՗bB[k\\t 6JCΕTk= #)䜙qc:% TeoXβB.eN/+I>JԺX87xM5i?D:K+B&kNXE'ԔcŨ,SM˼ހ<㸇(xwt>a"*545m93$S޾1OqoDТ\L@η|Yc_X tF}0LXr@߬Y;>TO,UvG 4ņoU) ^<ܨQaZ.-M:FX#0qYN܍SA^h׽7NesսAWkƢupnA $I%o:4l?:2l,:$ ^`00z^ --rW5P=< Qt\3m`x@j牑HA~}Z_+H/jkow8z Rowx8z@y:|n|oF F_}g^N3l%y@֗]F-L%/a,®W_&/_*uQ7eJ-#gJ% OmyPPW}5)5/02X >%Zy~%d$*!))Ռʔ,c׌TTCOrI'B@@T A&4ɆhQ^8xZm]J\{kHⴗ` A*.߰Qi(\U"EZrKӕ$};8QA|//+낊j P5=bN~٤JKϡ-P⾴4:JiYל``_L#$ 2̗TAsRtel0N2ǵTb%8~h=Nh)Dc`-2:O[QȺĉC,/ 6UU-N%)@-XBC9֗SzQL*#dDQkb" p "RY'&f>/eD LZ!in$Tq%_0Y< cD04h%fÇ>*U/m%hRp9t zý7]:"Pd\ZQYB=IA5 i J Zp!rݤcxBeUfLiֈ`d}5hL_"TԞ OQ V IfNH9Ӻ7v/w.ȟ*>h,0N)gSr`l;s{ڐw/rpx5Cۛ>Xn-$4-VAyapwp]] *P:l4 VS׻ t@5n]s 9aR_c5G7b—ϲz\bau:,.vELahO ZD f%iVplI}gssm'̟pN&b>l~`h?cq<@@u F1 g"%\*r,^8cS`PyM^U *}̖ۗBtPQMPw>]'o{{}+cβg:*d4Ki4%lp5j->IFfz񼍭nyFEfrO%[G$WrHj~ڕ(9^yV (Լ!HR.;k:F{Ɂr7j˔:ਙ lGK~g}A7|At!1J*H|*lįz0>d(uzʜISi6"kǵܗ̀p m .M2 =:FcU zj\>tR",NYPziR9Lq;I<Dc!>- ch{@u9XIJ`P\0bD⥌ )v8#L=iQ+a;>9M(W(Z6W֢EG@kmJ7 f! }w|z;%ꌡ'Mǩwԏ#ٍ PGIwҎPьެy5&:?Dg LWrK`31+֝`d t*6|p90]@9I:ߤ}n Sy.f~.WPog>EC؏0qIZc]OFG,VBb:`A)I0?wXr(c-6TxaĻa7m<}%Q AuOJr/BpLW ,ޭDT*"̀jlsl/Їӹ%&M&ե2^\sS@5}B|;b&(uI&>s.>}18%|d |DO~A1%$3q(Iͳ\hdfQ5C1{S}ĝF߮(L;0eZYj@8q۠-F_0ᅠwƗ(l' 嘤Qf1A4ژ8ˤ(қLR)KDوxVʑò}Hw F~~mJN {et#ߙ.whřqU0lؠxgs :Eh 0#fbm rn_ Fg(VT +6m{hOuDq>O4!@ԣEzm'3yX,G̐u %]kKc<3< ^߃[:Uμ[dyk`*\lj'!,VWit 0Wʖ-}Noi ;ΟM׃v[[a> Kl WY eh=w(-A? qWDMonz>lV-O4@`s1'۩|z ۳0P bi*հ@ws[L Χ,b 3ȓYw 7Ju22=?.SP;q'OPv쳵#I?PK*jԤ&PK.V8meta.xmlOo0 i CJRsسmۗ? Zh{5\ I,Nlua[aOyNR9Ńri\Hpfhx8K{{|pl[ 5s.?xxϟWQ j mSYzQWhяarJnF^>)ڟU^Uwl_fie;_S(sҷsys|5 |Oqjh4u6y͵* tuМʝ|™PZqtw&pzn'H}]$Sԯ;Åw~=em)Qn+XK$ RqyEFs +w 5%A>rkI ~-)\ < XY,xq"/\e(8#҇;yfG8Λ a ᠿ]|.gf Md!zw YZ'=ëQ5LcCYJ414Y]u+TXr9ۚߠifgAa7U૿:;啕ŽŝњrFzH\EϏ(v>h;XBs"<݅^L,ě}\X n)<9ٖY!_ X+ŠGI+U^6,`.~Tڕq3ݒib-$WB.?s΢m> H!~+_uJH~7>ALUsPdu^RچSެiuZ^H%ڃA#'Jջ۪0ۯځ?AϬHR"DgK<ErT^, "sBvΥ1a\` Aװ!{-^ayMIA!2BQ p?!#>!vx+ 65dON{tUwW/>[*)y{". vC9qr~Mp@Nq7W>Vn ̽'nڷd]}Yƽ=>N&`߼O%í^픮 ڙ] /I3Ê6CO_E-Q\=0Ri^K` F^^Ia-s7{qb3֏#i)O@LQ )Y0km!ipWJC9nF=,]4T[ YtvOo.pcspQ* a8H`L}^˖`Ru~0k ߥ/:m-;U5->D mT&2A4kz}vKx'`.iOvǑ֊6wA/\H*;qsvδ񙆺QE`(d+}zcuBOp|s؞8IO]nf}y;gG0 '7[F^ݠ"rr: W񶂼Y{zAD*Up޾mq^rQC BTWlt| J=DJMTz>Lu2Gx4Cd7陖x +J]1uGMG<\T8{bAҳN4( ]6MF M 9w:Ƨs6:Z9#."?`r$ a6c}cڎLbs~P:C>ޑxWXq~@ßHKU 9Ҥ=<p+fcWxce37N4hi#nl|MΫ('~^"W0CQ!ZRemϮ&ݏCkdOA;Y 6hx2fOj8@}K8d5e|'srҶ}k0,>W91.1!CE貋yr2:%wV}SoX}.邢+l嵤a⨑gQHI8eO(rfZXsxY_//- f[SK},">uR[8$GMv.*&~,ta/u1pa5Zlu ")D^d/,XQřQhe*R=U-z0?@8G=]n FKhX1Rlҽ 5{-#WoTmvAz*. rXoo.B >6ϯd鹧(ڈuk>-{1?96|xqE)~{S lS5 {ɻ洨7|c'."Ao`Qqj o<_n3`kBW|bAnPZgA8˥5Tfuzyw8#3RMy?W)|*biDI(}ҭRbhW3c`MrL9 :Bye.рzV%ߦ{#R U(s& E7@'ո,fF;Q3bz&'Md+۷ٵڢڕ;MOŮh* 󄂲kh[؀AkU^1s& /T:f_Vhl]<-:: ץ"*ټ>,t="縻ْ'G| S]M^/4¶`sŮ tuF/Xbۡ쫪R Q7e"U$yx`_E%JU'o+~TcYz(۞t\v pEn0' 26Zۧ|M?^ S{$imc=86,je)2jγ 譤y'uXH.tKWXq;Ċ{a]WR[wG||dO[~jd*r); fQrz~V#9D경-S_}G1=JF-mzMr8'b+\+g4Vb4]5K7 n"6cMf'R{C0A, 2 v!4sɮWYaH8xxe)_P61F{HBV؈KL/<%v-@3\  r?ZP0==gj*r\HbJ9]uT@#ҷi ub.[:j\C@r(R f 1& 'B龲3?$еiAY5I.ɺ5hV$ۧ^[skj!2>Kd?u- Z p3Km|uC[CؼcbVs[-sX_Vi)O*{o3JUkqP<'mn&t6LH]Ի&m` dM9 7H<׊Nv;~'eO5mܑ9n: wO֤d~ǣyDs"\.%Sj6YN\0. <<\n5O2Gk>qcל\\ue~ `Fl.+{K Fcwtf 1H ue*Bf#5sDEP̹ ;╬5)ˤwPR,5(0R>w^ybӺuҐfSQɭg<;kI__T)&X4:MTEsMP 9]Lڸ@Pwtnb}K6jT1)^.[/ysըy`r5wbL]ZZZw}|dU}UO+2ZOwTհ{h%8=aA2ٯ r٢KҴVI4gK̵vI&;siiCSX=3wC6>#n[񤌋auN~քL4x{/GXlYf-XJAMe0іpxfp" [ Sg lF/˹N=>= ٽNcivV" 咧^Y hOb.0Ymk{q7quwy dXa+43 w:ںs$̬ }G3BE2:#UU߾u%I| Yљ}{EAVXVz _.F5K5:;hԷND#-c^^&p9E_뎷^]T_7nUYf#^{7V/r-4r zMsMY.yA%wsz rΝ`2lcm9qtHߠD$B{1@/~1SQKϫ:s7OAhDZ"ُuY&Cli|gi،s~nq[P'Y܏jJiF?~E+a!H<+A4ڡbϕ^tbA_ |c{9ƽhТ-̽0ݒT|%zڹp%N?`bS޸Jކcl,AFxEL< BNbцUxc'h* _3նv|:$8^&{ 6\W^7SH <.~:y[=쵧3K=2e:`rژ@% *뾂JG\Fk|$tLɥ/JQC71`^%,͙41l άymڜQ ۵R8Zӣ 0z3pm0&KEB -/iFxWxxsi [rMexRc*kʛ3˰cs5 fy߽o8>&_oCZv|w`Ei[4Z#2y:8q 3 `k'a]@mkq،uwbo[k=s<_7 ڔ)Cs# VXdn"4Ù[:D1 2[aW6x#BK< '-D)m˖L,(ΰW~wx4Ry>R1~k ? 07Ǽ] mvA,ZMZՓQ2%G'B>{Q]E P=G֊&JDZuʨS_%s\P}=XA@bdx zԗ: 6f iq"Z8Ґ3:wTV/XmF <5K93O)ظdɹUnno|N+;~g3N_:/k ɯ`Dž  D6"Y\AREL}T Cs rY\:1ab_>bMݚ?`{,WYB/n}oFN N*c{2ꭌ~@讗< h攑uhA2xwGR3KؖW\H~AKdrlZ!%I!YZi ,_}Z2^8L5Uj'oݍ}5swrmcu.q/&hu=33 I_3ܭV㯏uA#YLp ɟ_58ƥ@WǩZ|<;h^y9" %!0C~wm{,u؝3Pzc{4֘f6+ۍl1™ Q!> -lw#[Y_P3?~fU)"yd4_)$h/ש]_VK)[/kXDn‘;SE+ ctEYZ`l>0T>՚hݭn72&دd}j:g4 4r{|VBw IFQY}ڱ$z=DɌ./K8,&1&84+5;2Mv# Ytme}X;Zݻ,~*5C/X?$`~ ;St0ȨwS-ݝv[Kk>mY蝺="+SI:kT;%FG/F駢O2miV)jMt1-h@;Kး47@m#D_mvl#1Dq)h`tnvcF[h/KО3Mzjxu䞹C2r]'XE!EC@H<< ïs!` F_'{5:ܘa+,2d)L^.Ы *rlWP64YfN=;IݞMf=r;W٘ 3-u[fU?G=I}W9r=j>lNDJcOw4Op=MO^kLR¶Y7wUYQ[VHH{FAChfNCh`{d  UyBc檡EaxlCDL_+d)mh%]fdo2ɼ)5ᫎ|oSwUgw泒[n6^85Г VaEl6QN(3P320|Ri ]JJ=|pߒQ-TP[apO45d]™#E9+E!+<^a߻)a3fح43oˉPv}MmeT|V~)Imh%4&POoR4ImF8px '}?43mtHAK߲dAKb|A?ߛ3('6^ $V,ڸ|2;ȵ{S&$~&a`P<3HMǤ\^R?57A <+5Ь&668eԁN (>h0;xдBs/q~Tt݅Pſǽt!:_Cx.:/TcpwE/iuj ak,NHmn:Y9=Vݟ]C-z\oR9h^goN/=XYNPzu48(\#)1~lSAvn.~!Yrp>9ίH30}]ѵ|:.ɓ`.7Ttf k~+֫[VRA{g ͹v-尲DΠ դ&Tf悺VA1Iq`?nd~bՎ 7gߤ#n`gF|E9՗% fIY6^PAQa1 ~B{M9ɿ_H,xNX}rzEj=5m}dD*0[9:K n"Ӫ~ZljwCh4BKVfu (E([&(%FaKv⸧N){RdDSky6B)JPnmtth9Μ_yYFí5E:I>Q~,^|?'5p7GC.4 UX#Z;ΩO,8Z-csB"=F5xe{4T:YHcӃM%vv;n@z^х%^q43_9lQF&пM~+}_5;=>p=tgT5I[o#6YUͳ~h7FP LZ]d诀*ܷv‡30Ah- 2!7$̯4]eC"GeUKO 414QғϹZ$e03SRゝu?mK`Xuw|ܑo9WseK.0?wžҸ<=l;KW҃hCshɛ jN7ptQ>S1sgTS?G؀KbKFY )i<|t@l f{!d7T+7p|*2CO O>(n\d7:yH_B*\Su$Yptu%PdxH}G6DcPR%ˠkn~ϴ}\Z. 7%}w`fAA T'dRW3 ::#rKW{T--1.gI!1|eYf#|`Z'^/_{ρ%Pܤ䗸l6Jzd cG̜#-Gp!nA!12W RǟMI иx+-Qa[yAf?3G *td}NzE!I4kb*H-7LH~rvb "(9q{,k"[͕7x:7CmsJ$Oܞ7bzYTi8[ڷdaBȧ>f"iyZx %~rIYb sX2GrpUJ\ δ*ށ7s&$yr h/2%'ǐ얛\iBq3m@K\b$%r6YmE687_DJ{5mu Q$kMl~yOP~BUes.p/ ݲqYɥL!WZ+{2g XjkV<#jIM\b+ YLFroJ؃u"cyJ02uqІ`*8ߚFΚ9WG kٰ,~QMMRtBkhAG_t9|*'wEw^MЎ5zK(p }_)ok ɺ.qnasqmɲZV6- %1vŒ%ͺp~%O;AVL`ݭ/6;^bqFi܂jy8O;bf>v2-!* gR<)O<ܟq^ 5 ؝hxj}2O4(? tkuh M{%TGg^I6)rqG!GIm*t8z,CY[VG{i"泑/FUfX* <EiFi.f͏. ::Gy>93G Teh?y5 ۢJc#z5A3VX-7$@{O)$١MX5\m 0֫yiw[V4 z<]m(}8A/2|bxo=OP*vڔDQPQl*⏧$pQ S?zi0,Kzjmv 5( A z*BБwKSQ[Iׯ<ܩ0GulQ7e}z%C0hv-dN&" Mym+CΕt(yvg|'VYbh;7ް8d8\ mw3hj@g_IV3 74E[p%7shR:UWi ҃M7h[M?+ 4DtZXtMWo[H%f)%cףv+'.(-dy>>THe*jKD҈̛7Ϲ{r.H$`m$ t8]v:w?^9߿.-\/Ym|AzN}e\Tc}c"9Mlnmmʱ0;b*>s[l3D>u(~b, :LMqhPo.xZ7_ս1澈7Ldkm`#w7CpӂLT~chABV!;7dY6P s#״u^>; {[/j.&(n~u{˦ǍxF@*kjkd1#&F\/^+.k[ >g\m*c9.}gJK6pn?CػJX=+FU8HİN eIU5wPk sm7mF dinKōQ曭 &$=(9Y u9^d3I6eIyb@}#1;(Hi' 6E,)kAv1$(S憂D mO \m'ޓDlF'#4~&]=9N(D6bè%gH&&)dPPX 6RCg;ZgK l%jfJDv"e/H?4m;ꉦA{h=%$1\)e졕J *ٖRWDLx-h{):diUgr?cƤz 򞉘l3M2"noKT@l.涗K"<6k*6[KtWn_95Hrkiäv{6eEŚpoH:O$'7սoC_qPKVPK.V8META-INF/manifest.xmlKj0@=VU1q-&fW6X; F#h[S0Oͣ)k7vc^aaӠHѵHS"Z^%ۯɴ|.Ax.25| h;7GWsh,.dLB%Mync Y'@,`(Uq:bbqW`<0RO G?Fr7=^ ޛbpmaD-*긓_PrS4I7ZOHNzbK|0Hc-2xd7!ɧa87|"sϩ]PK5b9>JPK.V8^2 ''mimetypePK.V8MConfigurations2/statusbar/PK.V8'Configurations2/accelerator/current.xmlPK.V8Configurations2/floater/PK.V8Configurations2/popupmenu/PK.V8JConfigurations2/progressbar/PK.V8Configurations2/menubar/PK.V8Configurations2/toolbar/PK.V8Configurations2/images/Bitmaps/PK.V8褢 T- -content.xmlPK.V8*jԤ& styles.xmlPK.V8,)meta.xmlPK.V8й(@6S7Thumbnails/thumbnail.pngPK.V8V +Lsettings.xmlPK.V85b9>JAQMETA-INF/manifest.xmlPKRKst-2.0.8/devel-docs/Kst2Specs/src/Fonts.odt0000644000175000017500000005733112277111530017624 0ustar synthsynthPKl4<^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKl4< content.xmlr۸_v6(w7VfLf3fb7Dbeз/9I֍*MI=q&)ͥ8^0ʈy篗o΋8!;dL/oBNę3ASLx&3&J:V&-p۰at؞cGN"#,˶7:b VO3j-)n.;cc3ߟL&~Wv8\%* }0d%l m+Ey:dis^ףq=ZbpLUذMGݻqSjK|r⿇MY,-/m*TQ0UW4 +t.cU!+`-%.1K Іe:abT2Lܾ`(]KCD˫N*8Kʰ,)4Ay-2;a7JoڑC(M֍Az\jZy1 0у箄T]$_x:5(S*/@A(SL;u5_Ai:ҵ5d. UK6אyɍ6є|b CTEҤID 5U{:!_/SN.Ke|e{IOa6B]ұ4'N-wYR47гtl?~*^Uth6.7`gH{UQ/"NIB2(Lt&)/`&3ÙqGjJX:0A?3 Ue8$F Z?ʵ 1AQW͆yH@g֦J%ھZ,@wVށy~n|kzvr< :4BĺCmFrZay+,ʄ58;wHD6b9?wheJUjk+EN>_[ N]s}nJk,p=~v͒0Ofu{\%ӥptD;?+׸׼exodb]? r%tHb׼篲Կg;c;=}3߯Mtti~Bm:z tr[M'v'oϹPcκvѽwntvڍ}7FhwC^Q)"Si ;agf%S/bD i{͂Eg,SO&yOK:{M\Eٲ@| b;*D^DgN^hl>?wo ^K6\?[rPxwXhG4s z[CXID4dH&Ʒ2I1#Q$2T2R )@ TLɄNlGS{tȅ $Ұ%]Ϻ-VNbFdB^/nƌ÷xtdprxth upoB34Ak lo=fq/}rd#QFb#c8nxaB5Kw#K8*jV{73&@/?G$j Ө\@K>3k'uS5K,Zÿla%1 %$tv?͍ SG* Eel@*F5*|-n6#Yu:;٠gQ܀'Y]B(K||2- Vlmq4AaB5)ۤtC➫ Gg7뱒9Z詩\ 1ʺ- DŽ;y*1"IpMK.1 3KgS <3q+m1Zhu۪-S S5c*Z2E4fRO^Ʉ|ȇ s+dZ[@TӯRPJw$slb!׺0p,+Z5ֻ;zG .ܬ;@T&9;-j{b-rE4BP \YA3AjjU;3Xtͼ5:EX+NL1J e}yih{ŠSkؓGUj-]YBɉ"+DjR ~N+['w;=9 o:7گ2*g]=jg7?*1:ϑGLoPKS_ LPKl4< styles.xml\͎6S f=Ȗ?' !3ғ\Zmf$Q v;/}}IQlVD9$1Ub#ۮw>f'4(=4!jxиp..)|sd"N,G3hs#4gj*=W̶mɢE-0+,y!~iAL ccJs-D17hs5l5XQk㚯(YxS,'h okMlY V?zgê#4޹{_ޫĖ͐Xwտ>%y[)zmyJimT; ÷cd0"01J:4s 1pAfNc DmȲLY%N>R)5NKo|*tVqM%]RK q߿;giHEɽir#z7;#vsUS^oM-5N5ayb{ȲesךD +$!jqDİk#3{;Q;mx.lRL6-8;ŨOh ~9̩ >TոF+/QVhLZ1TIsP0L<$5J&q(ݧV8kJ5w&vB1wץ P lXo VZ _ T@idP)$jVz e`7X\c-5wyJVܝ{Yn!oke[o5OQ"Q)F=Q@e.?(Kj?  #CXr$4Dm#a?,Ci2F sc(vvVzMr."r6UjcJ; &BX1gQsJ*?KZ} >sw%4$_LV{LE;,M)?P*r*Ѳ!%,XZF`}imѠ8[~iR+!*T_-WĴۏؼoPE <58f>KxMّ%j3=!z;7^Y]NlUT}Q׊]Bs2 x\/$3[mC5cO[&OE UP }ƫm:o]Ug8m=F f]Nn^YӬiuMmpL8f$kYO aϼviOjXD 6=,걜:Ë|Y IweѤʧ3 |3oLtIO6bܜיr{^_._䒞LɅK<7E~.ۉ#&/#er` c0zNq5 iŀ/|1]!𧑯8 /ŀ,d1 gD_=]h4] b@ŀ.t2.\a+ ͳ(GMR؝>h=|0> K"b/ɪdWŲnH1G5CW l;EڿlG jf jXƭIULnL n2fCnbHqckEtu 6!ᩴ4aF*cs5e3It2u[ZPdM:[L;?W*]F~Hf:v:YAeArS&1v-4Ӓvݺ[$:jSD,Χ37c)ڴ8.:6$È^_z5ebv:%=\+hYc$[LcFkp_QkU2klՠJݟ6[IiW?PK)F [PKl4 OpenOffice.org/3.1$Unix OpenOffice.org_project/310m21$Build-9319Barth Netterfield2007-07-31T10:14:462010-01-19T22:59:25en-US7PT00H37M17SBarth NetterfieldUniversity of TorontoPKl4<Thumbnails/thumbnail.pngeP\6Cpwwww w KpwwwM[Sw/鵞~V2```r_AM```p0 500>39IoY7CW||ArhR!_(xȎ!:%Ĝa \7>Rׄ87mNҗ|Ե_56n^_^h`x 5CVZUaqe./JJ QcV{?7m {(|]h_H9݋1$t,]ߎ)q^/x1 >Kaw<~,)r2۶G]6XoTW~]BAdt,z& i/ΰogx kdxP ;Nc'o&M Qt^IEFs8Xu:ۚYM'?7hj\]sC~"5p8bl}a ìW;$#ts<&*ӝ7);Q@=LGdo5//+Fphl?k&p[wQN?,h ^zT+ \4>9{E,hUt-h2 sڷMsgh me$ghT"d ͈!N `P$E䬲oe:Ms FlgY8F q|*h3vsj_QEX9g$MZ$4)g|6$}M|b[U! B sb]7&v>`߈,8ldҀ¦ nn]Yd1v=Fo{A][c}0ªA!*ҷu}K$V{[lOzAPT퀂Y<#=|ŽizDtt 6H?[~~= =*߱  hZAM˻}"#v鋠`ۮrxÇtJ/ސ3܁E. R՛Xz^gU-B,i~O@taDK-;Q62e(C74(j5oqÉFxBd H_,uE*7VE?컞y5?Aa@P˅_+qzt9o{ ˪n6"‰{u=Cx"rN B}q^U(۸&[\M5>U.*muy~ ,h b#5uwdRcZS@I[I<|2ȉJSu';(~! m֕7M6y^l=E>7SWoQ=l 30ġs*"DСW?O\kB>PʜP|"%&?1]lW(kt6K%yFK3f~G{'WQȖ<󰣦i/7Rp.¨,G<|W;/Y4@/:72Zko0MўeSC H>y}pDvPN{Ámٷxho5yj)Fe40 v7~dlwi~1@_,|5cXwn3G1ʙx"IB};xx$/@Z4ҕp#H+x)Ε'haDƒڽmp  U_g O:( QF.;Ǘz~jܾHZ7&Lp}k7ȉ  n=J`> % 5 wqI,"vH&}+"%W4є tS@Vgߚ Wꢞmnsz߾# ߳6nNmeF\;-"}PħpqؓZw>>G 02 [uK[&?7Wu$F+6Nj?QBѾcQw& ['u9(:x)~ECHd:-W),Xxw{37L<쮇lO.4_jމϿUZ02 ja@2d Dg"x^C"k!fv]Lٞ阝Gз$:( 'Ō~:Ħtڀ=$méW^v8x x8 Tp|2sc$ F(x!ͼ1B%\GnWīKR\$tD qGm+t >,н䢶pPaaBL2χ:qjt?I)$g6kC ƈ=6rh22|  &Tć\r$ք!@EYn0 ǔ+ =?{+p& x}'~nJsL78;vuhЖhpC5С9k׮x+b[LAoZrҊho*ޑ qj >RgmpBAGRG#bs^%{|ՠsSj=@w;<XXխ>0  ,VBtIWʹyNԐiQe*p_&_OI8IuMP.򕒦HByB̢7(/aJ9KY4B~n v쮖l\~_][&NFjDD~܊|uGJ4û'ֶAf2u{N~>pZ2_" =RVǓ  |qaHjyE !pcX?'|>Yo dz 5^zj.qS~A &AYd&%)kǢTڡdnfeC 5 V/pс^aH\FF?bfn\>7dgiV+ 7Wv$2䦴[.EbaF8Q0mGN C>׎kI7h&|$t_b2^*:#GV0?)~4e$߈xp11}]ϏW1Oi!kf}Y)o,.4b]@S -xC=ڈw˫} u-K-Cq&z?Bf;.Ϡn,ߢzkH7t^w^e6jjԩhJkBp9FAB(i<RCi;.y0&/gV⦸5 ؈@Tdyà$ 2gC ;D`?Y OU(%1 ptt nQF@&A鏑D?܉td(Jُu4ejlQz{P9|Mf= &rnEuZ nlt}T-Y M]Z29͖@E8[~j,ՀvH %BFZPW Cumtk$RBo[S$mv9d4/>y$I*^M/ cض g(/ᗕΕcrcrA*%,EG#,-Sz5Eo vg-܈):'\ᑫ˶)v*CE xJ*+OqS4'30)Vj!y hp6/$8OaUNB3Qjv$VjF6<ԧdXeaAd^PZ#"ބt A*"e?L>D}D=T8pB#aF:FV3c_9lTѶ*7$yE<@_͋,|.?'"pЌ1s i|j2-DCacAI5dHH.Aڄm $r׻?#%}ɷr2 ()VzʽV@wH7 ?Ǵitg2qةܶuYFD85eS9NH<x=lM4s8h Q̲tO32$DB!m@+"):窘dvf:0`["0&fXm BPiCMN'/n륧P8{W~܎Y8J$V1074:o^!jrLIJ%*&38~aY-CМb>nsGw) "SlwBJru|9 x0=waJ_]$V@Z#˜C`7a ?ҁ<ϲ)e+#w*C?0ƕt1߰3ney4l h"^U)%7/ SFeƹ5g2ٝɚ?J$%{n`ΔI7}I?lSo"(uL2%YeNT ޟM97 +QROདྷͷK߫|GlTnK8ft^Qڴ#0"&.nT.PM2.<)*^F;\& & oРyO )XwD\?{[ qpXpRFIh>"%ݬm7{d6ZKX2V (0h% `"+Wɖћ/j}O@-L B'tvYn>\X(s6o^YnSZqMŏ:byޮ"|(9ݳq {-l5ƷI[S*xMr!/hJ5Z8rP5+q 64fHL`~)A`?[Dإ]N)s){/6}(\Eٳ/Ls6erWp*y`% 8 ֒-W1GM`~$*ڤ*]u_mpWN潟W7HųЈYJnX[DH0lP| FD3#!{l P Yz{@.W|=Zj&Ө. pyI& ȥ fD !ɿN,5Gs|sW;HxZSnjGCde֚Nx<3\|ߝ[ixΉggho Rz+b~&̝}*⫢Seu 7YaabG 1#V8}e9ܷ" Hړ6gw@yd5Fˌ }ƍMw#7E¦{NєbbD5D32n,SPtW*hbK!K&n?z`kQ]O2ScFVr-~;Uuʣ2[bj<VRw NAFTQ$H~? 6͘-teZZo%EÔaj@*5?0h =GN;>Ɲ|?0,Ш|dyY`B+Y <ݖ4ԘԧU/Tij)k;Noۛ;l-4(>_.^ST=חEenmv@.,(Sv)@~kU![DRH/Ƿ@bp63!Sb-_OKbrOJйi*oBdB%g~ $*u )B;=c@>Yt.wtl7{>\laݶS(dHm%Wə9h(3V)h. ӹ:9Uڠ.gc>/>p1g/<$m x?]kƒ^w] r{D Q.Ozpߪ}Zbb}5)@j&tH@%!ƂF "rr`{AfeG`u4픫v=?-}ci`˼ͲD1DmDÚ4۝i?#ǂ*>u5ιk<>7)pEHks~q'(X{x¾q`AU|\;_I }&@Bo[C=~ijBt}D&(/Ÿj~ &S#.V=$n

#" k!RUssΚJY<#^-uGYF)XOl$? @8DXؒKLUMWAYr[@!ͻGk$aNNl8D-2/e2NAļ阋GKkMʳ, ܈[*V:@7,LMo3UrXRS'=MiRě@đFs& 5ls5 ĺa;"{p5bnI7v5%^hG LBh"xz6*#~{8\Moź%F(@6M)?~d1P1GK"@YE3rXd/:Nk4,{uG/+)dǏؘXզ|A͑ DߪWlK!졎|B13fc߫btTW"Wu׸b6M2G􍍺ac@is=b>|J09 @$sp$n{6K,+\O8raC ;w9ֳ!o$Ȯ>1& 48$v0D K:GZY}O5"`2/Z`ܱ1gCU67DBVцÍSK֢g(=(JlqXI1`>uS'RfR L@NYC?v^+*JvBncbiU@E|Gh9\/qL42pc7K;_sD(IE~GnMMSyko1Ts+Y7}#*qﵡ/'%>MK}$hԿ-Y_Ӝ'xSG¸)2}g<Qw?NOϗLѺѥu?78X^E_DX0ӱneD;&wBp @LP4^ꇟ |iyƠ*|K#2޲, ͻq]3Dc~;Zͪ@  :1bߧY98kv-Q~-n6IWUFkߊ}=[ `zuV8tk<\ϩ]t4Zn}?QCpgvڛ0AkYp hV$jO ~m %P)I|մˊ~HV?]Uw'Xⅽ)/*q,5EͥyyiYʟ.j}\%s-NS]gX87hc4Q n-'/qӋE{׬`ξfdw\&5w-A?Bqânee68̷ݏf~޼Ѱ/ Fk['!y5kP>xGSO2<)0FWƤgu& EVgQj U]ȀPO}|Þ{q&iD>2eKdFtnƊ<&(6)x7N*0ړDaW{϶| KWF}t/;3QE/3CvP8Jșhd@܈o??˧5)2s^]%>}ng;&>~7!nd4~DܭɌͼE@K8d٠ESM8(Yˠmj{h UHgU-TA\?0:)E ,K˴8HՓ]m/Ol("5 c_'dIinH7co>OQ|PERZk'ﮟB5 bdyH%{kB'>LcO RkRơ0`s ΰh鷖czs1-n|3C6P죾nXj >z=b&](>a @^ }䤔%ōPK9ٗ`79PKl4<'Configurations2/accelerator/current.xmlPKPKl4<Configurations2/progressbar/PKl4<Configurations2/floater/PKl4<Configurations2/popupmenu/PKl4<Configurations2/menubar/PKl4<Configurations2/toolbar/PKl4<Configurations2/images/Bitmaps/PKl4<Configurations2/statusbar/PKl4< settings.xmlYr8}߯Hp̄J2d̈́ Ȥvބ݀7%\~ZfdYc=QRw/O7_7!XT[~Ys.@xbqZ)g o]_)&b8%Q)Dςb{PvYһ_(m Z&%=(`zsuZ MXd#1=bȾp:/2Bk9f$04b--s!o?e*VGMGVe> ^L]mR!TY\`rTO@ @ ˙xUR{1O V| #Tڜ K{3H8Pg") A0$(3zM~$5a`u aD`)[yt)&n\H׷ E0>:#C, l,M7Ycog:EfSڍ5Ie9 [ԮL<3 ?D2H rD#kT6966SKIq7UbJN0Ax-\01c[]BM4F#TGj;(1l0lt8rMxpڨ,Z{1,\ʝ! w"Kl=P[yV r B,q%*Q3*|Fs\UDVpK!wSpVXgL /&bWrm{LxW hs.Wki4ch~J z 򑉘jA>`FL1mJtna6,泖5%u&F䱱DChȄ3iYj 6u]μWVP&x $`3G1pݥ,$\i7 {azCmow?bRwQj6#V2C:,^WZW}PKQ PKl4<META-INF/manifest.xmln @{5I(qR$0%f[kn fzpC$Փ(o |/uX9<(uHi#R+2Tr@5_;c㱸ʠ5cFъ<䪦zs-]#w0 䰑44ƀ9G 4;a]r[Tƒ 3}DK GS]Y!>Vet+\P)~$g;fz fةYĊ#wߧcqVTz_6f`Kk^? PK`3fEaPKl4<^2 ''mimetypePKl4 image/svg+xml ViewObject Selected View Object(Resize Mode) Handles are centeredon boundries of objectTheir width is 0.4% of (W+H) of the screen.The handles areForegroundColor and!ForegroundColor.Alternatively, iconscould be used. Selection region is shown with dashed line outside of handles. A right clickanywhere inside theselection region brings upthe RMB menu.A left click-drag inside theselection region, exept ina handle, moves the object.A left click inside theselection region changesto rotation mode. Kst-2.0.8/devel-docs/Kst2Specs/src/commandline.odt0000644000175000017500000006300512277111530021014 0ustar synthsynthPKSl9^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKSl9Configurations2/statusbar/PKSl9'Configurations2/accelerator/current.xmlPKPKSl9Configurations2/floater/PKSl9Configurations2/popupmenu/PKSl9Configurations2/progressbar/PKSl9Configurations2/menubar/PKSl9Configurations2/toolbar/PKSl9Configurations2/images/Bitmaps/PKSl9 layout-cachecd`d(c``d``Q2PKC:?A ~%"c#)"I+:[m>'<=vLu)Ph9eu~+'`n EږZMStPqAkCf$q%@7F| DFZnUlڨLSpH$37!)Q&_̨7-4.@č4Wm>3l',MhW!v4!n² +zc4%>P<XF%=ײh%x]șp"nB| 6 wH2o5ΙG 8C,BgV _8FfACԂ 3L@_IF8M# zm(3{ b vw}eo"V*/U'Ѻdse%upQ0regr]"4ˣaU)fҠ[L?C!u!?&H@AR]mQ e侕J2RetӶϟwiYCi͘)9PWEH]$UΌO(S)>-Ff)T&Hh3D1EEq `;:Z27 r#1_K{E?g_[/g03OKyԲߨ ~r ['g9ZzKIX!j@X CƋ9..l>BAS }C'QcKl-p9ϥj;vt-EsIuMҘ+0٫=dN-=-z_t,W(  3r}C&M w0DwQrdY+%E;Gڛn .!z^8#)iDa+U;u[} ;go4|X;~{[H/LZ;\ϠznO+F/`2O21c7;a渁ͫkې"XN}ʒ^_g&3>& 2JX]ZܨNUAޢWs (>^0[G{CqSׂ^0CDe\;> ށ (=8}}}8 p,:\s1làʖ*FFmgTM6g;4噹.bupmNpxdWܧkG)ONB<9iTkG4>~Z uZ}o 7Fi2rgm A_/=tʻ~1ܯUmc"Z gQ«}X=ٯ$_PK B$&PKSl9 styles.xmlZ[6~0To-yf;fRlwQtXtD[l$R _7)[3d㹓ԛ_U9{\Fdff,'t}[|7l%^,k*Le,bXCpfHb-51u>Z/eF5?[⃜:Y5?;h?uӷl(-3VHCI觇^/~_-nxlKd,o%OhSm0$щUnGFZ6{"D&2WޒΧV m~T q AzB| ?@wL:H(($^hE2G({W_7C-jJo8Ҏ Yxg$П>- pQBIX(5;`dJ=a ȴj)a{"tD[T 5Hk׏!)55 HaEe]F06#6KGQ)_aXKM ͱDs7@:aY-n4^$DGR3?xϛwvAy>θkDЇ\ ] *~A69zfv8 \P^TEDSt/_*pЛ152>FcߴB-?wƖ(l%T gI1K^A}vtl['$i ]$1P%7#YyAFJHT#eBsm73.%6,}W筿>믦Z?23Ό3RSYG~] @}4Ց,x+p0b2s?Ѫ.sBcڛITYW*VOT්S :ߕRYWwV+R\+usn?OWJq_)dI>Z$P/Rg-!%s˘TC{63eOl*;&fH9@պl;0?HWXg;e?d{)X+tA> N1erme nOL OpenOffice.org/2.4$Linux OpenOffice.org_project/680m17$Build-93102008-01-25T19:46:002008-11-12T11:26:384PT15H35M48SPKSl9Thumbnails/thumbnail.pngweA5۶mNǶmN:mul۶O~{;p:ucUUV9Q080@@@Rb߿C@@@Pߣ=h! qpi1aUϜK=H_tqO}9h(`_s ` PlJ?PPAÀEhUjtc&JMD[ߘFd\ }[\_]\u82"FBBR[@O00C>u/iE;P 6^H)xp]P>0*9z ܦ+.Fd"Z22O],a$%2P$S/P 4XJw.lKpUCv}/vӉrڽG~P8qg!T |!/,[ؽlNY?p>7krA(ܟ}ە"V|<`WK0!g(բ'z_c^%YP~P 9fB+ȀY9 TSD Y,:a8N`-UYnH.UY-DɲhDMWir#9h.eeA?j0;do8cP40}&PHŎ3R/.ai^ig0)b`[.Y?-2v x] Oej~n4e?{ ,&E3؄ 5E@0粡^Fn|S&zGC A{^x+5[pd*T v*LN4Dm5y`4x_%3f}mF%$Cn2 euzM@:TऔQZ}paKL#Qq/BgïV8 !=PRaoA^'{QHU^LzU'oi7OCab7J.W0 y(W\u~3i|[ćMxv'xuCї=4E(ϼDiVWkWE8??38F_ 6 >GdZ갽i]$F*6XUMY;wYA܂ʶrRןP%Ev;u`lݙH[.Dp' kp [qHPjm0XBtCLcP.OςܓnQnp}\ul&iyþ%2}]E"6,ܠ7R*TQ}`8L]8UjfTT>FFɽ’tIO("aݸy?3!Ok]QC˸rap77 cv/y6_qkmܧ9>j뵴SwW ^~-AOo9l~cﬣ%_*i7*oCG)݄ vb=7u1|{f: m̝r;}ͮwtQwM?Y5oU}xpť##|cp ٍyVmJsxf*}CՍ=|R %H0P-蒹/+]N,B+ y{ђ6tI}̦Q{ĐJŐgl.$T z-%1#РPR|~XkAi'W318\V:lA\Hl7UPu|f޻>7r]s&@LbV g'>:`]T}N/'Vqp`>Ni|׫1),> #dgTyyЫk)1j_剟 StV$2/-GԛxA`1`feR0=Mq e]QtMP{=CnJdZ^q"u:_"RIwU h [9C'L_w /o`|c)7ݰxV0D_aI a 2_)~яXW^xg^OJ<Jۣݓzyb?]|F;O9f4ZEr1:}nC3_+ښ>bK=+$o gY]/XOOYtq|`uXe=Gh%aoܙ^_C7tgI @2_;Bg둏Xֺ>:!xcn;moчY#gn\Ub5rFL7gb_ Km(}ظFs6u;w}A &&*ơDzh Q`&xNȯhU3+ȓ ;֫"./ncNAbvԟ/ ] 7{4!<\db4aWljK[>^cOE.Ǝ2ڃ'[`J2м{F_ѭoI~;Wp,1 '^rsijiݗ5Ԅ@P X  ^#תi !MB'`]%~-TK+ q:hؑSuG^F"hÛ_Ixf _6y6獄`#/kMg |Ev[ZHUiE,URԢvjzip\HQ;N3rm7M2Ff8.^9Ɠ2rs$ {k'P25T A'"%>z$h7ut~ H0x攪8{M v}#s,r.[M<&U ~]Z"ǚ H4t8uH9N臭!V X!::ؠ8]s*:}' ŻG-$)<K}VI9S-;\c靪l@^[Ձdez1K꣎S3\ҔH}7 ?iSeyFR!_~q C%X^|xf`pSF^~y=IN(2^!EA.Gz'HOK&B'KЄI?]G s {ܽ)9=/ >2vAvdy/`[LX\=U}DhwͰ)0C;SgMRP Y.& wHMo=  )A;J]3MDϼt(oO~_FƵ&C7A?0ދ_ZZzྉ'p'hhpudV=+6Z~hr ?Hʲ?|zC]Dä@I5hfvjΎ6m7~givLLRǫ<_X"4tt1،K,gvgh@۬N2 >8 >`P%,TDbEpi*'~aX1`y{`;7NMhwrk645JWmAП'*(S%`Uc ?B"~MH('TxR&;g#ɣq q5RI9r6v02F+4IZ_+r6Sne$yQȩt5!P_ 8E .?ce[}J~AS)s]Ԛ;=|,:8n bQԂ>9 a0Ђq iw)/8|ZcT&grt865. ms<:pbjJKR{DE^yCS}KaBADie1^BXcEwX 7+J}ީAlwK Wx-@8)mtz>> ]Cdf~>f3ȝC }9MLZ9PBRBSuN]=G>,Wt+!S<ZtL˰3FrL _b$J;F^Rp$x;O~0FõvY %YZ+z/pP댫+^-trLn`,yA&7QT]0t_lۼr]H2=B%fjזpCI |]ra.rhD*٪c,S&6АTkU~YkTKJ%㱲 g`"/ekO_?g]r*HB @ȓ; 31.J7'4l2ke/,>X4$B "KFPu 6); 0̨CKӮ+ЮHtL0H-Z _;$_J[n( 6pׯx{ʪGhFtR?~&q3Fi _ k(K4![@ xeq;UY+f_y[Ŧ>Vd- `X*>*I8 X,EbT|^QfiKp 3F'KۥIO9Y>ی~S'P39%{I3ݝ7;ؠHzB9?'1]Ot[ϥ; k Tt.zo2X,YF~,ߎ *Hgl/Cptd19yRCx3}yK$'G o{ qEJ :,yB2]h*DHz=m<&oߔM: ڳ3Ծ"GtF<DyWf"ЅPj.@G c4 RKQ3GcO"K@x$yILd$Z=Qr-ppLUn'; mfnEҗx4MMEQMJIUZ(1dtsajޑ5Via5dI}͊~761+E38]\> PIV2'=ɻWj8}7,fQJ0y.XMY2 GXc*0pSPWtrSVtB5A)cSp _ .O:U8ՙeYU+*D*kjEKsBB2fZBZ}#`$#L| M)E \ni)"&G$#$b8wedM2:+l EX'YdjKNRfN&tVx GÞ_Vi1'%Qbb7Dvfv n`tUa^YQfJ%=c<1.B .} +ővʐJU FJMrPTڻ 鋷6'i5#-^ @8fW"$v%gv7']09~I†b׆5MuҬ X35{OL϶E HS>>\ e8Z7{ՉÍ/P0|~s?l&M. ']=dJah#=ozpr0F #}}%{M,9kPc)~a} .1-3+m^wj{\BFMl؀jhe&e km>%|bcܹ, '93Wg:O\6"*t4g#,6A: ԝ *?2 Evx~%Ld_lF;+]_wGHIODd_|S&F҅*nzߖKo#ˣ|- (Pʞ벆/rڌMF$} uS+]VUX~rX%UC{T, y1+{ݼTҡˢPGɺ{fY)},=PeS|OATuEa& ?ǘ51ъ6yɄRs[ڃй'PRA1?*؍TS']rd굉1bh O{/ ŮƥY8-F Ր^h 0b0p [@Mi9 팏nky܋Cck02ndCp8· eYZSq>c %0ATIAvCS)K'E }yd<!Vl~}[k>O,g_gƝZve]<\-Vf~_;*$iivl{OMojY@&98+ Ր%CV~vZ}T3Ӷ ZjzX^ZCY\CL}1t7޽$Tb|8o;@b޶NnOOQQ.W[Y nqpQ=c'k+[sѭA@ER`d^6GM\ Eḟ0QYNj zn3H-'3j! p%hl?C_z(eMB><WnNGf蘮=vd}PNɬ(8?PiޣDi%WJAƏ;mH#cZ(Zy\az9_O姒'囨Q^dn?J2Zt7>E֦UcsP$Jk ;Xuiէb}cCў,;nl M)PQt\&E#eqQ*zN4X@43} m%o8{%?xJeh6h@9j { ]3꧋3Ha-v)h }ޢnoj8U|Wc7_?BWRzy 6Lul>AjX4ͪxQr@jzܾE= 4ު:)fYSjHN#ه+[+INQj=0x' u͐~27(ag1/eVn"v6"j78uxQӉw@`6h,T9;<0H4įp%RjKw(FxZ.qJQ`V ~PO'4?HszlE{p`\x..iggg !+0TkD<'Dul#VC,Ez yܛu!,*GH߳V@6jDqtߚ] 9>d_s_D_upשn0}niڬ(9Y?eRN=omaOuSsqM#ixWYlgٍx?YEuu(AT)ǻH)^I [Pfh}VQV C1!ܖQ*Ojb |fZc.UI#e J}fS@N 7AbXqr~he<r<NJT>wqIIz8=gث9 NRlKHEl SjPL [x-Xp06A3d0rP1TspfG1蓂Pgo .98RHߴ[kftvs_I[|]hרS|B(_Sz.zCBN_"YY1잒 ~J2ƻ=ە4X+ TpC<Ï 福P|{>IBQ9?X,RDP>rRW{mY]  fVibސ)I2m3pC}-P|ܸA6hNY3 . RT_k}2m#nH*k+p|,oj!p#u'<]:ʬה83z!}a[wӿQ/`PFPntqEd%=m؞J KtaKNCI)VU-$6'Sy\-)DSP_mm|R[By:yj$±DiFU+/urBW[?WyT//gK?RNxnEyk3'Xz}vtm[eDRTG6{Sd=x8;La,Qw>I{FVLNR`'+nQhLoFt'y:&Ejl@"}c =U}jk.$x!o4w\0jlഺ E0CAQhhڼh--m 1}i'WuY2~X>WD.+PRgY }&љz,"r|[0>%<LlEm…7Q#:u pgW& Wyv m3w>_O%g%B8͛6vYp`I dKxǒN`#^}`=pB5sx9AGO9 FX .X3 䟟<(PS _V,.>8':>IǗK&X#VSb&NEqk S{b8zgy52Eeg(39dpG?ANFO\R $,ΈPª fby*ea&e;`x;'{mуr2Fj4vg5: %33YbrȈ17Zf$>+Ti_ =w7 X1xD[S)imq Do*7nw F&)$:[\!x50 B#-xţ09@Oz74zWtAY̓!!ušiB:JP}@D-׷clc8)oĝ@(m}6?g;# t7O5O*7.n4d'!lNy8-qP}6dl . bw7-ۖ oE X6 dl{ @3g ^{ 8zo8o+Mu>6s[x1O_n\diF/ԤOF(+>73*_C8; hbě#Rms<\%;ܞTVU|>I.bIkbEڰFD"6Tf`k$8ZA0#mmÈdߧ(z>ENAd;Q ~

8XqtqF3F{x ^ՋY@)}y?ۋnq(mtmܨ]ZO9U%h^p8V>Z Sӛd5.NuhK]r~]rHthw5go#d~Ks ,Sm L;]G w!-wb'Ɩ:ĘhV 4=|zǓqR&~D1þM04l2oM6AHb(vDlڨb4M1kfSpz49s^SxښKԫ߿9ZPVNJx|nF؃M 2 pݍD6\]'ciHntzdP^4 Ep W^6>dSgw_Dfz6}Bֽhng/sӲDWYb:ݒ;'OO{.b Jv)Z}۳ ;$kFA% |&pe]j{5|[{2X^VMomF" bOԻ0VurPĭT & JxgCZ*~~5tl~2kƣ1#7TSMo߃Wg0q! |i_N([w"og-SPN Q%ےg6QA)}jAwAb0#2534Opʰ+k >ҚzZu}䠿o /`oX9}3a %܇T> |":E,l\^]ҏ"bS#IL[Blg&sf?(Gb5Xe/.yl6D?\qU'=5bM ӾgvZO }~ҩ;~,8cZ R=zoE%ٓj#x2*J,'Eab? 6"mC4Xq0!͍.Wp꼷 -kp94ܜE?FSbvxEz@5*B5ӣEbTfdB,9dRW*Ǡ[J0k_fjVhvݮl9i9&^Dנ{]/yJј什nRBkGf)8[C|ϥQi m5"6F,DK?h'Y y$Q\^SQZ5,%&N5~+}GN8U6mrLMLA(ݿ^t-CYk  ׃E-Ebe>I%W޿ojh = F'&3״z)XiӮ[&Q]Nڭ]Oֱ!S}~k"DaWѳ2mz4gw\u̠]{Ożzɷε{wk]U8%^`;9 RWϗmYke#?\ԳVBCwNx.ѯ뎈7]Zc.{[Oſv'c]Үt:|kcԖYcc.áuS򰭽Ud|pޡ]O>~0h㚷*|=:k lvmtLLT|.\cy y5<1QV[/pNBs[/05)ML4X|8J8"-o+f<_/9)!Ў޻=>~dý,[>e¢_vᚒ3gyds~SVљYlXq'ລUF 3 Т!3n1 m<]\9%4PKƾ=D>EPKSl9 settings.xmlYs8 ~w W@nian$r5Vv ';BҀh[d$rO^AōW=x'  #1Fҕ5N&QdBhMK m)TA5tz[U>YHx3FX,N(j^/۷I4WU*D|Sd6*rwk^s퇵LAS4̍oNh7lFx󚗷_ޗF{7zӛHhY=կR܅]:?LsY/DYՋJ )ʠ=cb jC^S- .Ks"m_凘C!Wy.8Ғkh>+~BZ]Ջݕ+WRU4 U\mveyvj\zA?FHfPN6B;,(V+sY C!HzP s]t_@?4Wx>l(1 ,2z{aGDoKZ*;|eՅۉtM& 0!&2š/ou:p+٢7OamǷ2=&nX +o6ӛ{nR~{rWPKOPKSl9^2 ''mimetypePKSl9MConfigurations2/statusbar/PKSl9'Configurations2/accelerator/current.xmlPKSl9Configurations2/floater/PKSl9Configurations2/popupmenu/PKSl9JConfigurations2/progressbar/PKSl9Configurations2/menubar/PKSl9Configurations2/toolbar/PKSl9Configurations2/images/Bitmaps/PKSl9EThumbnails/thumbnail.pngPKSl9DUl [settings.xmlPKSl9O5`META-INF/manifest.xmlPK(aKst-2.0.8/devel-docs/Kst2Specs/src/MultiShared.svg0000644000175000017500000005310612277111530020761 0ustar synthsynth image/svg+xml Plot Geometry with shared Axis. Requires Large Label Region Requires small Label Region Requires Large Label Region Label Region If plots are placed inside a shard axis box, then their axis will beshared if the plots are aligned and adjacent.A shared axis box will have the options 'share X axis' and'share Y axis' settable from the object dialog.When plots are sharing their X axis: -all plots in the shared box will tie their X axis, so the X range for all tied plots will be, in all situations, the same. -changing the X-zoom mode for 1 plot, changes the X-zoom mode for all of them -if the plots are in Maximize Zoom 'm' mode, then the X axis range will be large enough to encompass all the linked plots. -on creation of a zoom box, the X axis zoom range/mode will be set to that of an arbitrary member plot (eg, the first one in the list). -the top and bottom label regions of the intermediate plots are suppressed. -The intermediate plots share axis lines -Tick marks are still present -If the plot view objects are the same size, then the outer boxes of the plots are adjusted within the column to maintain a constant Plot Region size. This is dynamic on resize. -'Share X axis' being set does nothing to Y axis sharing, range, or zoom mode. So X can be shared/tied, but not Y. -on creation, 'share X axis' will be set if the X ranges for the member plots are the same.Analogous behaviour applies for Y axis sharing.If, on creation, neither 'share X axis' nor 'share Y axis' were set, then'share X axis' will be set.Tolerances: Alignment needs to be within 1% of the size of the Top Level View to be considered aligned. Kst-2.0.8/devel-docs/Kst2Specs/src/selected_handles_rotated.svg0000644000175000017500000002661412277111530023554 0ustar synthsynth image/svg+xml ViewObject Selected Rotated Object(Resize Mode) The handles andselection region of a view object rotate with the view object. Kst-2.0.8/devel-docs/Kst2Specs/src/Automatic Labels.odt0000644000175000017500000001301512277111530021633 0ustar synthsynthPK G^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK G@.* settings.xmlMo0 f#v/CivVl:jI$ɿ/I.LI4h\x*21>dyNS2 hm$*08WQwZHEU 4\u, 4eSsz;k8i_j',ٗn.IVk eDs2T6*lҀH b΅dպJ%Cw k.k]5ɕ FtB*¸ieY y :&|t# S*ꋱ˅*\̸!z7jfN1ZzhgSazh{GA0~0衪eٲYz z*)ic~fe,YJ61~u?!z-pq[O7)Ss`ʘJ(k#6d )o,h&ϝ~)~rRRkg2W? .I] Q(I_X/h(kic>+ۋg/XP|3cq?P|V41)8"|y3gZŝd+[$]t.f3ruswh<,\SJ,IIJ8L\76u](`Kbn{)M:/]ޡ''שz"1 |E'YMG0/R,J >N}M@)PIRP[QQ /ZC.I hw 9'wfxmJE?=9zbh ho[_~9Ooo.6xý!TooAW9W!jbYV.+Yև}φww4==&=N4VBPfNeMp$f G,Uy(shj/T8Ý< )/l'䊄%y$CŠ bH#{+xJHaćI8{Vm2v@ݚ3NT/6D ڏ u^qv%xl~?[T퍡i!5hOc+ꋣƹ^_?!kmK k,ğ!YsB+@WSC` X+e) vJ{M$Z? PnahZe5Gwƾb3j隶)NO(Yc2m@tgbtSYs2J"Ehúi>O{=ӞK_3^Ag򒾼\jE3KBxAZZb< iL Z?WݤxH3w*F",/MwMyz;i`b..-f -A8 FH9)& K%Z S|s%h0_-oA;^-3U⇘frO> 8%K;3wĊWiO8U[ v\j-ܜ Ixy+1Ļ$^x7^*%N0\~/D<2"[Z:F搘WKnB=>Tl}RdئHI1o9?6'(gG%nu2\QՕB51Ӹ=7rW7/JFP_&s'pbY.QLbű [LÚ]|k!ouniD9 @1: '-aڼ15ubX$מb -ݞ4Z3t:\ᬾ@>n qf4avO9uj{hychISw5`-& [8')@eVU}"IbNYVeB}h7=ZK~ޕ%HYt#[ Qi)vb?U}#%'P0"KY5.!vұs:Еүa)3k;ɲ'DײE?WXfĹseTRؚfu"& ĖEb'C˶LYXq\|sL4):1+@y-CgF4?fl>{q %}vt$U9+x&*W,_<'Q1|-?VBˣ؉]{$b{[q\{R吝aL#{a ;]}jx*[@PK G=Ҽ~ styles.xmlY[6~_x'BP#UJ<9}0FlŰda|x ) %,6݅c%<%l߾hmO[e$Qʓ*LZN%2~ bdp ʜJ]hlj.= lsШ8=\-6Dv4F5G0ImK]'JC56mS0)PEۖk4cFαY 塷GB@BhTuK"63lCxa)v`\fk; . RyUH{lz8m"IxŤ={L~',Hv- El_ұYRba=cL mkOpqs 36G50SPt&':9{¬ZA2=/\鉶Zk d=iD"J?/){Wq{i+ M[`8biZ{]nASok`OvE: Ѷ6ꟍT4EYڸum,oGt&+A }f#;Džq[% L>so3KiZV|WQpM.iP%0ad̉8p"ɌAlm$IbQYD7!UY3(]o>Vb3X-Vn0znKnm] \9 W;T]gbqy5jm!\\HH+Q'fλٟ !GW"P6Nh~|PK G!Dmeta.xmlr E ="i#fn:np0GIMJ&Yu{}0ko2X,IPlm*piĥtD#=IU|MӫcAϝ 8#}d/=yolȹ<sgNbublKaJ)KW؇aH( ո^Eq~l㌭?N$OXI ;4%]KBT= 9 #4uOǡ]6,eI_w/9Z;MWPK GcNThumbnails/thumbnail.png sb``p  $%R,N!@PÑsxD30׌fe@.!^:`qdåiluu>  <  aؐ KYNj+) PK Gϥ"META-INF/manifest.xmlj0 y{ma's`&RJs m3VInw*_D R`yjE?u!Z#uI@NOnӭ[x]U)qOGmx`9xg {y Β+a ɖF(2[H,F\Fr\9q#1lZRf<,V] PK G^2 '' mimetypeUTPK G@.* Msettings.xmlUTPK G MH content.xmlUTPK G=Ҽ~ styles.xmlUTPK G!D meta.xmlUTPK GcN >Thumbnails/thumbnail.pngUTPK Gϥ" META-INF/manifest.xmlUTPKKst-2.0.8/devel-docs/Kst2Specs/src/PlotAxis.odt0000644000175000017500000062115012277111530020272 0ustar synthsynthPKl<^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKlks|ޯ^ڬڋשׂr v @2,$# @2,$# @2,$# @2,$# @2,$# @2,$# @2,$# @2,$# @2,$k X(rI,+ .KQ9̦b:H)_Pz C`Hf.GC?*F 7w9XqC` ~3`W0F ,$c٧~,Ӄ 4}(C+ ],X UE#Ґ^8dXN?V`"0;,h7Zdym۶W#tQQӹhѢyatfee-]4:: v3fL~~ȑ#ׯ2dȞ={Ө<~:GZJ1R ս{߿NN;qP՟{\pkԇ .^MR^z"R9X[ q:ĊǏZ[`9n4`5NEEEXXGr9G@Nu@SQ4n>j۶(Dwk׮ǎ3O}ǻ@3GV;ΚmKSz(C{l` <ɓĒ!ĠAS2+ Ґ^!āB7Xa>XV:8XE=$#jX~ۣhC Y3 {u޽cǎ2eJfffzzCnN:8әtR v3fL~~ȑ#ׯܳgO>}|*BAwCGZJ1wq'=py {`F֭[VV?\_#GkǏ_TTc+*$tݺuBh~X~ۣhYHMB۷$n&\Ƚp3I}BIc #uO3E(JsZnt:qqqǏQU޽ xvB#$w BBBڷombmmm-:vxi=xth*o),HBDFF ~K=l.}w:1Vyy0 hH/K <ɓĒ!ĠA|=lF{!p,"8p6qBq,,,c;6>>>77W4|pZ x0"t8ڵk߾mRSSo߮ O8qΝIII>ʴ6 _Et:9s/---,,̝'99y˖- .ܹsee(((HLLlpw"b ` {gF ,?PeR`vX`*GG#`Q9Lrs(헸,XVsFXk `W,?aop#4N dӏU̎ @2f'=9n9 + UX=N?V`"0;,h7ZޱcG}+--w# ~ =sGqHoꫯk5w۶m?YE=bW\ѨJѧOjJN/СC`X!BqYj=jժhz@`=::{Fnݲ~`W(,?aop`+**J]M)$M+El6Lrfp 7ԇ .^>h K7_-% ca"--W`Q/qӺ\4{9nECz`,,*=X555}tTTTa„Yf>|Xh&kSq&''kUUUMUt:rsseeesׯ_ZZZXX٦2t^zm_YCBMV\\~*QQQ&Mzw].ZxqFFFѕuAT2,?aop#4+z~iC~8K.O>[oU[[M֬YcpלnݺdddL0!..)e ڱ[-9XM{JJJzUW=?gۀU`kׇ;w^zڵ_~yFFFZZZNZ {h}Zh1jԨe˖g.((իJh,?aopiY7p 7PQQaP}lLYӸQ\J KaϭZ["Cc: '2g#VrerAx^*rss͛'VDe*Vfۋ-_ʣ&|5i5s̗^zW-*GE#FlݺM6t/OX+F , N5G9-n4k{xx5k<+B+a]&;֗}Sxg <3wQlI "3K.rpJ"Yov Q'aıc׆~K.]tݻwstPTDo{k9X~ҥ+r7S\.׉'^yE8!TA`ÖӦM{g۵k}o߾?,ߴCfE[^tꫯ&&&nݺUR=/3t:GG?pŃ]#!8 vG Gh]~˗/V\yu}O=0444a6tPAԿD큃47,!D_}[n宻ʕ#GR5ÞA|;?4C{0☖^/yׄ{~y7-;w073Nr˿⋖-]w]; {V̟F䝙fˌȑ#&Mt׻]YA1CEh!0)1?L,C,?'5!V=m# &ǸѤ˙^GW 0WGgބ?C }x˖-1cGX`Q!6lذm۶EDDV]]=a„k꭛)"r<8 h&L1KQ-[mN駁ݻGر(NsѢE ~[XX8o޼m۶ X@3a9Xϟ?szȲk׮1cӿ֯_?dȐ={N3++kҥMQQVGY={\pa쯲| .t_zisͰu!!!NSXQQwKP%&&ԟǙWДص+zž?s>|XGUTTy$)Ν3Fl| {3X!p=֫g{OGEEEx$VUU !"##xv;H J#wU;F A.=ڵkKJJ͙3g6mڤV:;N\\%=X@sB =X-u7=}hYhp@{yݭE&oeب`999+Vԩ-ܒqUW䨙aÆmذWG&M4iҤ>qhTT_ '$:tҥK>hcccx{s@8: S?իW[ptmĉW\qE7n0i@.͛7^zÆ [BBBFFnj-4 uf16 r:6lXz_YY)| @! eÞu뭷_ԩSFƲq?"}#wt 8lGO۷Q>NXU {~AzUÞ4=b,@ C{ֹhxxxFFƌ3 l ` v3:''SNǏ+^|_Ub>0Px^,^~e nӧ:thу XWHd,5Boݺ/袋RSSϟ9sFb8a#w+/U|Ͱ[m.첧zZvm.]?޽xm^91 )"w{Aevvzc .EVyΓUxܕ-)%+>{hB6:Xf\֭CBBN6""""..RR'S%V@lչл˽qwf)" 0D5ܹsrrAEvE#=Υ{[T /hH/2VTTTMMGbUU"22R].ĽްN=ji94O4e+>>tzDKœ*w*=X`uu34kunA7`UVV\rܸq=z袋&Nf͚˪kkkO}oə0aBRR?B!8Q!ĸq?z$C~ njݹlٌ{GuoyƍN:(,,;wǯ꯿ZbEǎMMJJ>|cMMʕ+ uW ҃́1D?}ٳEe]`9yvȐ!mڴp/|РA:ʯχ~w^M6EEE} oUVΝ.7unVw/(8 G#G ԣ=@{L2&;?O?뮻 qqq6m۷mF?w[lYpaΝ+++GAAAbb;C߾}cbbKt:Ԏ9s/--{NEX`YjTy*Ec:l0' `'O/Ru{}w%XBaÆmذW#]BI&M4!{12Uc+#=+F~KOedd|':ʇt,?aΫq[E]l%›a+l0_?#sǎ>\j#XQQQINiѢ͌m9%[יG `Ot06 Z3gDD-D̬޷ 4F&VRTܣjGWWX\y"KOug6p:uJGXT4:S={yIDATաi/Ԥi JKK۶m4]vgΜ^c~,:7qO_(:E mӦ1Kt:?|׷  7C%#clF{n>&l7poU*HQ.z,`*>8 ܁ZuFZh6':~}_~VM/++w޵k;ZU3bQIAߴ*}OݹeHЍFu"BtaΜ9zkll1bDqq;ۥ^ZTTNbuMEQ{С5u.Q&K;ǰf-;]a׮]?ٳgUmmmFFFqqq֭W^]QQq^zeggK+GGv@O9Z9ydӫkʕWX}v!Ě5k&NޣGիWRj LT{IyvwJ~i'~yO3 =V6mF_~;wb̙7x;=&&]v G#׭oW;K>b/kPp'r\_~С… =rrT`,Fy{IgWXͫ:{= !}:h}'jSjwzy葡Q609[n3fLXXXMMƍ[vmHȿµ'O9o:;VO}+}D&H>NOֵ^v^z\.hΜ9999誶vo$VԜ |rygDq&hM~￿gϞ={&$$ٳ}r7zcǏ@~fG'O"wՙو˨YD.kƍӦM;}sECUU՛oٿqƕJ/ZJ,_~Ylً/xIX{'66>ydTT׭[w_޽{ǎ;eʔCɺ U4'hh7Zԃr>%Klڴɝ/vmmڴ9p׮]cƌW^~!CӧOdәth? P'=XZ~FiӦ{XqwѕbԩV]]=uԔ5B0 33nj3G.Y$::I@W-\s\r?//+P=.w&B۷rWJBYm},0zz.5:uѣGΝںu &8Uj;Ms^xao֭[DQQ"66V'طo_ w+>tzDB|)w+VcG#`,ݺu{ԩS߾}]`aXRRRRPP0a„`WX|ggϞ'=9n9=R.hժs=(ݻM7 i7MQ' ͛m۶:_ݻw#<ұcGEQNE,ӟU؃tk`9άKFGGיa׮]cƌ9rbC ٳgO>}9pѣGWZ%?~LLLiiG޽{?''ǝ8zhQXX D``ҿ-"ֶhѢKOOw;/K3gܾ}ڧ:Cl½ .h Ir/&E/|`yRkɫV:|p=܉C {kwoڿR~h7ZјEEEBXmb\\b߾}RᎅiU|nȠ֭[8NmbEEEDDD\\ =YPQQ摨;wN#J) 4ECzv"HBDFFJy=XXK\zexc 3g,Fh7Z s5xړ'OjKJJ RJMƥ!p;X)))Bh/7n\p;oauuuϞ=GꫯoSN}gRvrw_mYXEo{2"44t999XBݻwXBh+CXC^Et:rsseeesׯ_ZZvk-[,\sΕ 111xg!`FۣhFs,]B\EѨeLBC"0;,,9X`*`G#Q9VB c!F$w,F͋ 2tQ`5 ,?aop! @2*B쁳̎ @2(" ` lF{Aѐ^8`~SUV>0 bs:W\aܿYdILLL݅;w#3V7T%>>ꫯ]ԇ__[[;u[otFe`Hh7Z尊Sttܹs/;ӝ:u v48qp^XWݻ՗UPXX\߫{;v)S233:T_UVܹS~}Q@}=tfee-]4:: v3fL~~ȑ#ׯ2dȞ={O>뮻?۷O>&L0,HN,s"+ V'=9nCb{@EiĥX`H:8XE=옃6 ]FV@r3O`{4r- `%LB-TU@9n4&dX`J"Oo3C4~}C @ i콍Of3W11'A014# "8J}~4[r#"," @2,$# @2,$# @2,$# @2,ۻwرcL~!-,,LNN6n@Ӡ%N|@>Ѥ\;wFDDl߾]qݺu۷ꫯٳ(111V0-v`{GUWWO:5%%eȑjJjj233].=dɒh%NlϺ? *{不;&Lp'K3gܾ}/>-Z)--5hɰ9|41z,lݺuBh~ɷad؉g>LVTT$& !:g`Y؉'"##´:tBRCo-XVQQ&PSΝ;g`YXTTTMMGbUU"2225|k!xV^^..l|k!֞xܵyfԩSӦMqAIy4ϟ?rȀR{)/(//w\8Nr`5jkk=R[lYYY}bO?b?CbbbmmwNZ[~~K/-++kԍ,ԢEݻc}Zf͚&^WVVv]w !VX @zÇܹsBÇחܹsn >Bжm3fTTTB{o:<?Ì3If"|aaa=.b!O_UԩSuug}֨G4: ٵk }饗<ةS.Q͛W\V !\ @Rg,HרQ6oެ~)S$&&/v^1/NS^^^~Ywy7[nB̝;O?u'~.]L<8qi~-u^ZW_}M6j'ԙ0r-[ !Μ9;"22Fh"ky233/bbj7؍7޸|zJݹcUW]%:uUf͚N?z'[*~Z: t:BvڹS#E=zw1tnccZly%7MwѾO姟~Bk)^g$w@7,MW^IMMUckgXgڽ{wzzmƌjkk/_޷o-Zi&55u{?裤-[zG {6qiժ(:t?rF^SSܪU+#t:ӯ/r#`(uEk׮* !Gff_~x`!$c@?fP?@HIENDB`PKl<9 .>.>-Pictures/1000000000000320000001D0D0271A33.pngPNG  IHDR  IDATxytU!@VHd7l& lyEpg8!8f@APE&(&8, E!F$$z-ݝx<ݷoW_'yUf  @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,tf vf΀%6l6}b^Ȉ B*/T 9?Wp@g,UЬ]HCݐ5!  @g]E.ZT^ɴ\JNN 5F., '`+'`J}H52 #`茀e~3f 55 D @g\m*BNV,$d!X:#`5o55 D @g\m*BU-!`茀e~\a HrH~Hr, @g,` :˜XEiWVCZ"\h(6"2Q!L;eM|\a HrH~樑.kq,`!`̜XE03.~@M{D<D!XFb/sH *j$9} d,0L9Wۙorv ṟ&*B۷Z|!X@jFӻロXsP#VCh߾SN:u*""B?'&&?~|K. \zkK,Qҕ"!!wBlٲ%Dv7oݻ <<W#eFׯ_|ݻϟ?ocbb4hжmۮ]ݻqս{[wk׮}%:aaa 6|GNZF w>;w;wNQ^{gȑ?=:y䣏>zĉP>x| +Hb0$(ܶe7/Be _e2b !33[n 4xO>}ͼVMh!Ć \nm߾}j6:lĉӟ*UԨQ/:o_߿\\ܬY9rƍ#Gqqq/yڵkÇ  ?wn-XBRͺh гgaÆ|ϟoРAnnܸ}m;wQF;tdvw_"xoܸѡC;… Ϻpwٲek׮9?{թSgǎ,%''{(9jЀܼw >ڵk,X$ƌsʕ>,**ю;N2šqĉڵ#yČ5WWznذ}„ /ԉ(ڵk\ɓ<Ν;>/ԯZ9F7m4tz3rHJ*-X $$dǏW333_}UZgn8p`ҥ jٲ'jj}ڵkWF @]6a„+Vԭ[7cI,[Lѯ_?}5jdw:OK.Ǐ/**zg{nҤI͚5~J6~GBx~|C; YHIΚ2@7n[o6޼y4ܹSѦM?;k֬5knݺUmZZO?4uT6ģG}T۸}v!D=?W頞kO7nܸYf)K%%%ٳB5k9s!&O/\J*<֭['O>}3:t0k,gΜBm =ztp$7&fWwyޒ5BB̟?EW\_Z~BVV… OҫW{?*"##|]aKLVZZZ`0yQFGx(!wWcB4o\jn?/^|y/Rhƍ>|%ŋJg_P8ʫϜ93::zÆ k=!KX8p:$ѣG cFfX(W%QСC|B^ӕa3&`  յk{lgU !.]ZXX6viVr:vXZZژ1c뮊(pQ`]/nܸ222;vرիWWZm[j5d+.]㏷mv޼yytX;1k늋۱cG&Mڴi3sC;wnGn޼yhhr,/I,?5jԺuԣG;v,55u֍7޼yO$/zK6nܸjժ3g <8>>>22uSNϟ;wnFF˝\O} m6Gccc׭[bŊ_}}Glf/ov rEWfR:xy'5L(+Z:HՁ)u؈Ɂ,`C` IH xbPB$gtF zH1@îwX膱XFG%#NB=@Qjs, 4m"WQA!BĚG7y QEk3( 3aBOytX^#g?,tFOytXY L{QS 5g^OytXQ@5 1?`e0*97k HrH~Hra30`MwLyf6؇usg۔}]7~!rǛw@pCݬtO`茀yp+ `k$G$GGP9̚"`AmrA I2Ak5 gڀeM@bIQ`Me\ h9^NLtXJYx@$GG$gGL4I2s~gE÷)\~˞EWJ>妜y9l.BLN0"TJQ@(Ih2 `5okdXcCLL3sc!@~ܭ4TyA6yEO ZE͎xVb!`ϼG2?k.0 $9 $?j$9k3fPw8g[i!EYsn@((T  dX,(2g"`璣@@xʟ`-( Y@,-CH0HA9h V\!9f|w`t_egk o-T{۲1>틇{.BmZzP%rsD= a8D,'ّe~\a HrH~ԨNY 0rNDn iWr!*B:M8)uO``-̀|HWXgB$GGtU U:hX E#``x:f bqsTUʳ_P*BP%`P,5}%*vx@ /P(@[X_#9 $9 $?j$Uއl5PkժUڲl+mw^-zxݫdO0`8uw=J=6n]|OrG<]ۏ1}ϝ=꒗m!wS;\3dv̞^>Zh= M=l`جv~7ʹ/~mt4oTN:u믿-{fσINONiQ- $9 $?j$'@ }oW^*[II׃ZJ×(ڨ~Ulr޾^M|9;4:nr`rڻoS (֧nhh?'*<2_e{OZn?>.}Ǚ˽p+T{]We[n}^{_hKFUad܍.8;s]}6r_4_f8es)77`޽{)z tϞ=)))6-77W_m޼p,0K w.]_~9$[999cƌ)؄bǎ7nѣbڵ]vݹsg˖-u>4ӕ;9 S'+BJQZ?ܺuk̘1Sҕ;v=z4Tc}(($.?VTTֿ_֭[wk wm۶ɟ44jԨ>QQQ~l5k;v6vI}N yF.-Z8qDaaa*U .ԭ[[n'l.vu7P\A>g̘ ,%8röY))U,"""$$$77WXPP"HN./Q >M,yθ7[pb!ԿlܸqݺuQQQZ߿~*U bcc٬|^@_u'%%-^~8z={>{}kpQQQ%%%ʷFFF*NBNHrH~H#/_Ueneށo>Cw}RÇ>o :dl!DBB./y<9\*<''G-׿]\\|ϟ?W^999?3w]ZZzmcffs>k :F LM_ _իWoٲeرmڴVZJbbbڷon޼y˖-+'8xBo"<5 çxgozg}6w{C{l޼y+W,o߾ 6LKK6o(uiodpѧOwHQrŋ{UZ6n.t Vյtrʺ\]ѫWof̙cǎ1b… wվ}{]6nLKIɏI.E(c]ƍv٣Re.5@m+..nÆ ev۸qc͚5F-U րƎѣGǍ7` a\rHrH~ޔG VJ׀5~;>۶myPaaΝ;{:?^`!>]%!/?vVllG}t , ]vdddAAK,Y$&&&0ěo}K>U?_*X?ɓJ[fM߾})es@@l2U˞ٳgw֭ZjBjժu-55ɓ>ރL:,Q"` vP/9IƏ?-W<7 $9 $?j$9POs Ж@H>o$VIIɴiVX@#NpO3Vffȑ#4h0jԨ_~E˗z_]<55Wv{NN# ֢E.]믿Ο?ܹs ,ovϟ?_~~Сl 0y;6 ֺuRSSG}g\_߿?BtmժUj}MY)&%G$Gg"I[ mT=c6>l0mۧc!]o"o+<<<66VRVƍWTwT>}Z1o+**ʹN:k׮0avzmժUt",HrH~& ] rss###[j޵W^/udU6vիW5jxDŅ/{ Vv7nݺUA7֜5 $9 $?p | X{͛=w+** u0@0k|TɊ 5bĈ2ӕJ*III 5;gy˞F}0kkd=-`ݻ7@g@fshXHɷbŊ7|33 $9 $?j$9kȷ%2eʐ!C1Pa ֋/xҥ5knzٲeN:UokȐ!qqq߸qoݷoߟeϴ4=Xsn@((Y V.];vj7lؠ0@9p4U9J*=ӵk8pĉu.]4u%K!Vb]ƇܬP Q Q# i'̬Y B͛7_dIhhhrrիWի} ̀03噃o3X_~eDDDrr[O:tЭjժ>nc0f-[ֿsNW'|RA֜5 $9 $?j{MQ LsVF-[v=xSV- m>Kb4:l Ԩ={UT)@J((-6*|;+99 | X<@`,o#,HrH~Hr,O?=w\>0VVl6f^ /|ŋׯoر@9ŷk !{ܹ!!իըQc۶m5f IɏIΚ2 zǖ.]F+!DݺujԨ{WrI)-`}K,Ѧ+!Dbb6] !FջwoFC0"xbfuڵr ܬP Q F24o+;;ۛnvŋ~If5ҟ~n\C06OףG;cŞ1"33s֭Z9lb[i+/nJUa[қ;ಛYGuO` <?| nϙ3O?MJJcx[3fgϞ+zIDATWԞɞqɓ'=Sz&(geq*5`EFFX",,l֭?x\\\Z5kvGGGoB|0|fB$GG$g]ݺu/_>y/|7Nxx'|2p@ I1cJ|{رShXXX֭_|cǎ9RA`i01j;V*BqOku͎x)&\E2tF2?k.0 $9 $?j$9k` PlblwD ٸ)*Br*B+"`茀e~\a HrH~H*Y Xc\m*B辊PY?tqe_Eb!fXgB$GG$gT< @g\m*BY V{U#``NF2 YsP Q YF&u EЙnڵ\r\\܈#222=(Od_msϥ{;v(,,Y={4hY" [*2=9-}7N:uTDDNLL<~ӗ.]&!˗/YDIWBwyGe˖ ֓O>Yvmm}' zز @@Ff>Dػwo7n!tRsm6v]17 nxyC-xJq#Y$!ehϞ,IHiӳfpx(%`ґN_jlңG8]kƌΟrȃI52I~<'{ln ҫWڵk/[s7XLfmڵYYYk֬ @<"`?~ܡE-_utttE R,ǻӉCk׮M0aŊu  &55 $E;>3nܸz+!!AmyfiiilR,ƍ7k֬ƍ%%%AAasխIvIII/^Ԧ+~駞z'`,]*BZ}aþ[!ÇaaaGΘ"uJKK |&9X(?k.0 $9 $?j$9k3̹ڎUca3C"d @g, ;Ϛ7 IɏIΚ"`|g,sP`}]*B+"`茀e~\a HrH~Hr,Ph(6oGj9 `mF<Q!LUmT=ls0:V?X:#`5o55 D @g\m*BUaЫTLb#`5o55 D @g\m*BNY6qb!X:#`5o55 D @g\m*BUXgB$GG$g{bv5*i wmT=ls0:P@~,Ϛ7 IɏIΚ"`tAЙ9W۱PX:#`5o55 D H͈k0j;V`2"4XgB$GG$gtFЙ9W۱a!tfڀeM|\a HrH~HrȦCuߢ$8 x g,`9W۱a!tF2?io@A$GG$gtFЙ9W۱a!tF2?k.0 $9 $?j$9k3̹ڎUmUE|@((Y iӦ{)`m۶7(`vׯ_OJJڿXXؕ+W=f9vu!n$7nw%7 n{C񤤤 c[qqqbbbzzr7.....gɿ_)999C'HrH~Hr:H|'۷e˖^m?Θ1cڵ!!` 2*PǏ;h"??ҤI+WT!HNݾ]vիWϹr?еk׊/ryY9Q+뮠08 ! $9 $?j$9kH,"""Zh!w2b L N91aa8D3YsP Q Q#Y@,` :+y28'knHIɏI}`茀3Xk*L:| $-'=3X:3) QX ?}9@q@g,tF @g,tF @g,tF @g,{(&4hPCCCgϞ>gϞx͖ꫯ6o\yn?x\0w};3^Zw_4htU-iӦ-Zݣ@effnڴŋ}ҥ!jh 1k֬3g΄OOP02!DjJKKڷoe5kbcc !*`"&LSΠAz]jU!D͚5Ϟ=Mըl9+֭[m6G*;w'hڴʕ+oݺ(5. 3g*˗/vTXUTTԤI!Ch{չsgY@ iӦļYvmm}' 7U^@˗ׯ_{Q }ZÇ-X@j#_ ʿ %%%JKZZbԨQj(Sh(jT9Pxy!DnݼV+˄ H(-͟?ذa=zP[ Ծ}l] \{B<-:rݻϜ9ӻwݻw}QpuaՕ+W~gϞ]TT`L(**J= R>葑ڵk,XmjT6@~]vM0C \.]Zĉmۦ޺u+%%ECkƍCݳgό3l6ۇ~8xb D2 :|F A4W^նq^n*33355믿vXMը;)P~~I.\]sS9BCC#""Ǜ'عsBʣ믓^~v%''_>,,lsUX@\݄Ç_p~jrsٳT{wT[*Wv]6a„+Vԭ[!oFe)O߿k׮z9?vJʩ?D 6<}tiicbbUFQO*))8pro߾o3}ڴi_#))UVsQyS5*@,;ҕ50aB5Nc[bbo-{+W4֫WE-Zh޼yƍ”WwDw=#A„6M>쩧:p@۶mW^\7Vl$++f͚B*U={N:/d۶m{!ĵkתW8qEB*U 'O|ر͛7 !f͛7G=|p%]9 5jo޼ԨQC+!D||zEEEԔ͛7*OWӕy汱BmBTZ^+0(O J*= }t۴i-ZP'Ntiٮ\XW_w?~… }7W@*Cwl.]jРAAAo1eG}GN:UNW:挏wn`ivSq{嗩۷o߲erw͚5=ϝ;O4mtʕn[nuxVZuyС5ԩӽ{w?ݺuq1_~ݏg}VQNƍ3gnsĉΜ93s̙3gm[TTԤI!Ch{չsRm;srr<诿zGFFj_qǎӦMsfQQQ͛mܵkWϞ=5fH<ԩS!!!Bŋ]|VZvViiKF5k֬r 2sRm_!>3m+Plv###۶mW >|֭qqqW`BHHH||ǀ7yVqᑑrB$%%3UVaaaw߶mU\\pƍgϞuhVVk-Zԇ7W@B~=w>ܴir۶mmڴ9x'3X]*0??_<-:rݻϜ9ӻwݻwkڷoߖ-[z+WԩS \>?mڴnݺӧOWf<^}s}i׮bȑk׾뮻ئfRn3gC`XQQQ)ZEEEBHKV:qDBm۶MMMuVJJq׮]% QTTzjΚ6m\Qzj7fȦTh3,P>6M9+##cen}''Nq'VÆ sss2rgL#!DhhhDD2BܹS?iҤ z8͛_>hР2{ׯRJ7nP[W@6Coܸ%rrr SN !Ֆ!C4lذM6}Qo޼#vXTT:fgg[O?tbb{H, .h333;wV6lƍʿY111ժUS߿׮]ճi\zիrʻ;(saaakV[W@999oСCn0`o~"++kΜ9U̙s_]yOSlTMVqoM6#eVvx!a>[nVߏܹr͚5+ZygYNLq!uV`zz!Cx K.{CCC\VfHVL >FmLqKy3fԪU+???'''###..VZEGGLJxdANb u3X߼ѨiJ_'b RLDi|)Ű R\EU1˂\%r X ˰10;,}|~ÂH1m) Â|2㌥FÕg}3 3Xag!>]fG2n ÂH1m) ÂHq d4X'uv d4XzaDiH1m/Dh$]= l$gh$"?)b RLK)dŎ <=+z2u"0;,h?O1,b _J1,W`i R,+t^4Xh.Bt`~E`v4X`Eݤ`Bx_sK)b RLK)*,HD >Ӊ}4۱tPJؑ 1X\@`H.Btz`ϴb#!f.BKҋ?)b RLK)*,h$cgEW`qh64X`#~bX) "ŴAbX)GKO",i..r/|/Y/<=ϰX(Oa O`)YO=4Ubq|iυ/DiH1m/))~` @2v4׷s]̎ @2,S "ŴA6ȗR "U4X`{kHiL`ٳ_~ÇOKKKMM=vX/p_ڵk6j+**2`R ivؑO{-6lXǎ>%gϞ;V:gΜ)S\rg4iE#~bX) "ŴAbX) 2 B#FHJJJHHPm6--m}ٳWX~ٽ{o}/1()`[ɓw۷غ+!DBBBxxx@)f)v6>8qDƍmwݱcϝ;י".\U:~3;4_"T_.B]h5kvرJ*;wN:]tꫯ*P\\]ʕ+ 9}8p`ɟ~i>}֭[;~>g=߼V^^+z_/Z( 000==cǎk˾DiH1m) ÂHq)Z`AA"<BqR)`= ,ʪW}ڵkϙ3:V5""" w4r&ЕoJJJB8p`ff"99:wE\E#3Eկ_ ZUu~iZ}݌ Jw7o.**2ev ?ݫIOOꫯ,X`gGx !˗TҦMtڿ?x]zj"?)b RLK) 2y3fԪU+???'''###..VZEGGLJ!Vz\2)))...>>QF[n]& y,!DΝ?w%ۗo[oe\`]uײs]K>NSh?O1,b _J1,WiY^F ma|3ѣÝɡCZjei0'S"lݺKݕEc@c#Kap+S!Kb HoTz5ڵk^?)b RLK)*- i*}$znH b!K/ÂH1m) ÂHq d4XV͵˛={utrfKNN>uTppgϞ]Z5!ݻ;vEpǎ5 `ȑG`^#~bX) "ŴAbX)r`͛7綾^*! TR@P)?>nݺ/%Kw}+Vy`њ?OCcx>Xzz,=zgϞ4iRFFFf$'S "ŴA6ȗR "UUZppp>}铗Ӏ<3LM*w>C'N4iDh:g8CH_ѣG֪U~iqƽ}{q,`]sСCNN򿊋4^PS "ŴA6ȗR "U+VDFF8nXRRR`a<^n] $\q+q׆K֭[nݺ͛7wtwЯF=rȗ_~J*jժf}<{˘<3j֬Yݺu.\eo5n^#~bX) "ŴAbX)`l1bDVV֝w_vMVppKQjՅ ׭[jݺmۤT:80`ժUW_hG6nf}Ecg ?FBղe˃c G/S~=3.rYȑ#7md;ҷoC_Hhm`ժU}ݭ[_KS "ŴA6ȗR "Ur'!!A&z嗝|o>WӲsΟyXXK׾E˚yrE)**2a.B`EةS>rʎ?tPMbZ`h"(,$$wx5- ւ jժnٲ3nju`^&7s=bX) "ŴAbX)`edd<6l;ԩ#رXSN3gGݺu_?gj05󅅅}ٲe֬Y?iȐ!Cmݺ9o`]e{?~ժUڵ{Wo͛vڗZ{YCsW%% Og :t̘1;vUpϞ=ӧOQb}bccDQ k۷>۠A o5Xc !XLn[|y͚5ߺu_~ss;vHHHx'{E 6cǎvG}tʔ)M4IHH?۟>}ZL<#` :499^ʚ:uڵkի+,,1bDRRRBBz$%%m۶iii n޼ĉ'NXr-[?ެY .L2EL x)- #<>NMMݲeo馔VZ͛7ʕ+.\nɓ'SSS޽۷o/UK,YhQʕ/cbb^{5!֭[]>\ڤY=/ÂH1m) ÂHq44idgΜ2eի֭|WNZfm۶oV۷t|Gn6!D@.,O HbJ*լY3,,,//oŋ/ѣ_|Q +_!ľ}{wQȵkׄ:t0|EQ:4aۺsiXs[Nw\gڴi6zg3/c@ӦM3ɔ聍awv1}#g|AA_Ql*w}feP/Tru5Y@LP#q&͇K=}%Z,0'_YyIv.ʗ\RaA6RaAJ%BogJn5z3Xfyz ٺ+W,{vz9!#/]):O` NV4X>UK/zh)=~bX) ÂHq d4X~ͭ5K,YzC]VZ[n%55AAVA)ocOf,B!DffO8a;rǏ/_UVK.mժȢѣG{qĉ_EEE999w\)LEKR5jZP'o`DiH1m/D4X/^vZO9a#;_t)**JP7pIlue HﱴX,F(JnnnAA [;U%%g',T,=zlܸuC 4*gEܫW/ wj<4X=3fG|ig[{<Ű RLK)*-aZ֊x/^p'L zi֭[gZ㎙3g֩SGQ[+6ժU{ꩧ !.\н{GڞV^{|+E]~d1g !4h7L4IzʕC IDAT+/[,//ĉ͚5:uıxk}݆ ھ\`֭[+V۷q˖-k۶Ax-g"##l_^|yBqƩݕ*::J*n[S "ŴA6ȗR "UZ,EQmǎ{jժ͘13\+..駟.((v?rJ!̙3Uf̙3r =߲eK^*UdZɫWVo֠:w\BBMYAa]={\zufE馛z˗ۺe˖i0 _BlڴiΝM6mڴiժUw_3X` Lr˱޽{Ϝ9sذa۷7awAyaA6RaA>b#=E~?xz 3;ҋ`+0!kT_~ȑ/^ԣ;Xew/XUPPx6m$''_tIz}Ye|o믟;wNbY" ѣG~8w\DDC=f͚={Je#DiH1m/D:(_|+lذv7߼"##E3X-[ 6=GB;V#F6R/e̙3x !ԩ3nܸ1cT^]_",770Z.֩SVZϟ1b[oUR%vZ.5۶mi߾;su#3gn4X,ݻw_ruN<O9sFG<Ű RLDi|)Ű R\mbbb^x4nܸB} sQFٳg^Æ 'NaÆ7|SJ}/˦~iΜ9NAA 7v ˆϼӟ^#GQtiT5z`N:6XB]kfX,cG<Ű RLDi|)Ű Lؑgz/,Ox+=g|tt",ϼc!?B(V ^?)b RLK)*,bY7Љ"*7E`v4XڳgO~z1_{DƦG<Ű RLDi|)Ű R\e"ܱcG^k׮رΝ;[hSLyWWn@}z+,a>S*,,1bDRR] !RRRڶmxO?+T^2.?855>=-"{V탩b$<> <x0}taKq"&&ƙ Bh'Y}ԩ#{bt|)Ű RLDi|)Ű OZ^^^JJT\~# VDDj-q@)N ^[n}С@|]v/+`XE(o .;w`VV]vz$FJJJB8p`ff"993c V~6lj*V֭j}w322<1@-lB}#b RLK)*S4X_|zC,!DzzW_}`UB˗9211Q}!DeGbb͛g̘QV8Zjb;n:իWz[neo' fXrAQ,]% g`YtW8K/D}w_?bX) "ŴAbX)B8wKhPkB*.BTm.BF m pP/:ξ[=\(kwGJO4xK) Â|2E#=O,ξ8VRw @?~g-˰>]0 P,h?O1,b _J1,W`HF\Zł-t"ș³`N");<,* ?qkqkeڹ9b _J1,W`A.rRϣ|\9\,J\ trk!$Aky?dG0?[3?m䢣xf@z,ı2{\<DiH1m/Dh$pt"4̀; <D8c\"ŴA6ȗR "U4X0u eSYAS),uO.B3c_!x"Z!`\lK<= G4}Di|)Ű R\E3XFx)O.BoB1jX,=/.XBvK$7%-K/jw~4~bX) ÂHq ޅ fǭG^Oᬽb;@:vJ@cid8bHpހ5Xza) BXVX/G)b _J1,W}lY |{䏫XW@X. r!1.r!`4XzaR=C~4~bX) ÂHq H=ڨ]Z73,&|Ob>9;Vʳ}? d~`ᘃvm$ByJrs/mG1gھtFYc]Ӽ.Ű RLK)*>(P=T19hJ,wH`дC/h*l@W# Fڨ9xp %(rK,$w"7jx'E5?)Rl[ ]X!CSXaty7|gޱ2Jq3=}WÂHq8K٦=T1%kn^Լ 3sz/p L ٚiIKE1NN ʼO 7s>4~W# gPey>ӳJ̢-X^Ҟ={O^F Œs:~ _e^j\'LfQﱹJD8V`;v+===!!Avڴ;whh"74[ɓw۷{jT^|lذa|'7nl;{;?~ܹИK]RaA6RaA>"=ڋoӰw^!D!K <&끍%L6Mc;fg̼cL6$S6F~@˫1ۥ_ Vʕrss充Ĝ>}RnX) "ŴA6ȗR >**UTz^`EDDX V+l?NAƤ8rcR|? A|ј!gzGx8ďFCt^`5l077D-X^`o߾ܹsڵРJJJB8p`ff"993c]M6ѣ… ms;+vD^` !>󔔔[Ӈ _{zhyw%xkժyzPy}`6^h$ @2,h$ @2,h$˓?!KߚܹH?b:-skϞ=>|xZZZjjc .qF3g1vޝfmdMGQ r-Æ ;}:p_ڵk6j+**2iBɓ'רQ:.;մG5g}vF5_R+WVJtN>=v؁u֭W^[lPjcZ͛w=<:tx'];ܜ?m,H,gZ;vիWzzzBBbڵiii;wlѢawnZlGzf͚:Unn)S^}ի_tI[wJɚθqVZչs;vtM{iРadٳ}IJJjժΝ_64{/Eb5mN_~0ag͚uwۗ5(Wr&MM6ݶmaL'33G&Lxg,('N|嗗,Yr=Tj~:ÇqG}pڵ=zX۷GEEVJ\*&1( 7ng3l0JI? !njL)S9sƥ8ǬV R3|sQO׫WϰRRXXm6#UV5iw߶mۢesܹH8p <}a·~O*~R)sXM[)(,,lٲeFEQFѩS'JIN݅wuWQQzdѢEB)SVMtUV`k֬1MbcPn*&+E_]t1Ԗ-[|:+.E# ~Q… Bm+\Vѣy6;_JtN:»`ZJ\$VVJ.]*h׮J)ժU3ga$N'33322RѧO .ر#::駟uHT8O /PJ\&1(7ZJ /qPۙ7K]xq֬Y3!!!.Ft?NJ9CR)sݻb۷/%e:EEEz:t; ;h$VV!GѲenmRz .8uLguBTZYfGPDJ5Sn]!0@997K3Il ʍR,K铓5j_3III.K%q:~{u2>l}Uݻ#ܜάYW`_JjJ3z&u ޵kGJь1[ouROgQF8Gbp5w3j(!?}BzQJ)ms)OƠh)UL.22+QmРGJXBh_f "o:k֬sW;dEQCկ__Ro߾$j;UJFn5m4@b>P/$y73??jժ^~^ʝlذQFӦMX,B{#iO?TjE9sgBzNV) s)OƠh)UL.... u_UѵkWqF``zkw2sRV˺SJ֏F駟 !BCC=UJt~oHb)?մ<ի*%ܰa~p4OgƍW\~}hhb!;?C۷rʡ~͛խRRޟ6ARzr2++޽{?JEFF֮]ۥfKq{:/_뮻N>RR~4ʕ+{رC8__J\WٟT%***00Ѓiii_,"iFqۑzKhj~?C!DZZK:Ik^$!āfff !=Rŋ׮]ٳKtrrrF=wܘ7n_JFQ.]xiH)_/%G#RЭ['N؎(RXXذaCOf^:55՝"RJiΙ3g#-/_aU˛6mZʕNRKJfr 61b޽{k{.\sNÇgggۿd֬Y {:>vX'xvs)aÆ/RRF)|u,\$VsQo/ڎ:uJ1i$=Jk~z!Ç)Ra)]{}ݶ#'y睮ra?c !/^NtKy$6FKb~}Yxx={/7l7Qjɒ%Bׯ+o>!DDDļy󊊊V~X~} tKBhQKt΍7zb'99e˖RqstRddd|| >Tʰ4 sXRzhyիf{?ג$2l.TJڵ+,,,!!A-^\\SO7Ir),,۝:K1%%6eKQ;w&%%5ONNou*FGGqY1ctMI&III3gμ|;svڇ~8p@ՓO>tRm+,t_PWk:SJ׹3&::bnzӧO_+eo=],]"Xֹsmv=z t*e̯Y~~~*UܥRzOo8p`֭~ 4ȝ5V37mӦMm۶ҥGɿ,۷lٲZjիu&)Eh$]F @2,h$ @2,h$ @2,hHйs`bXի׬Yf͚6j(44bc45KMM6qD!Ĝ9s:uoڴI;>رc&MU۹s9sTmݻwX,5jwJ(1ǎk֬ 88vN:駟&L`[}EK߲eˣ>ںug}v!!Y@:;IDAT!.QdӦMw}СC:td!ҥK-KmΏ=ڿ fV(!!E HMMMMMm޼bSN^^KIUZNСÖ-[#vzGիW4i /ݹsgEQΝ;?^Q;S۪lԨQVVuѶ'8RJ9H}]!DDD˗/><..N}^/c^sss׮]ʙJeРABɓ'ڵvl_֭[wذa.\2dȑ#~-˞… ###Ճ?q\ !\iBpjSQڵ?VvmfoV= ַoϞ=[si]tB1>8q矷Rq:jժ !Tb;rU#-w1jԨN:w}%:u*((N:&8Vz.oŋK_BGR2eJ},rtE@wy'%%E]z9gΜT_}Ujj1cߟxZ LII̴_|3糧oy*U2dHvvv۶m|Ɍ SNb.Z7lҤ3O6x.&,СCNvW*.Khx%!ի=ɓ]zUvvѣGuÇ9,ާ`ŊB,O?PRZ? .jrssOnٲc .rB^쐄999iii}]RR /,ɸD xáIENDB`PKl<}̸r]r]-Pictures/10000000000003200000023FECFC66BD.pngPNG  IHDR ?* IDATxy|T3c["1  % E&j1"UE6QpuaUhE0l" *$`%!L3d&3?.9o={MhOX#`h1X#`h1ƌv1k,d2FaGMbbbF("lԨ?\TT\S8pSNJ6_e˖-[$P!'Op…۟?^QI¯VVVgP{ ??{ ګ7J1_%%%n@@dR͜9d2EGG{~Ν;O4i̙~~~bB{ׯ_3gرc͛׽{G}4//OQPPiӦѣGgϞݻw```ΝLmܸqȑݺukҤɲeˬ6n8`'|rҤI#FXti\\3߫Uնm6p@Q]xq„ O<رc۶m3Ϩ?j|AblwuYf{ʄwu{キAfYQC^xPIqq(bĈٳGq-$%%>}_B=۳fRl2!{ァzg|{Uڕ+Wk^EQrrr5jo'u.I:t'&O\O *//f944رcB٥YrY+,6m*tR"`@_(͛ׯ_k׮aÆ9͛7w}SL2dF*L&SIIɏ?hX=:yd\կ_… xzYI&^͠kjs(QQQև+k7e~i4hРo6444--MݯN++ꫯmkݺg>;sС!zPes r0*bРAB˞~IX2?72b_3h |ʕQFYm߾bҤIGMII?_ݿYYٖ-[׿>]B/B]dO'?~/\xR%먋*L{n׮]jjj׮]/^bŊ9sK.SN ]|)S-[L>`x_M^ԬYW^yʕ+wy 0d+ ,{B?<^eeeAAAs=WVVf}4''硇 [Y5k6{쯿Z w}Ąl])))jՊڳgOo߾&M$&&^pa̜7o"$$d׮]{˖-+))9Onn#n喀֭[^ZmS%--C{ꩧrssUU^jpjժ .X6~ &1^+--U%//\vmhhիodG6t]w8qB`,FDV,eF x7lڴI{e7vmj"44433^z `hK {02m4` 1uA3X}۷/@t&h[m٫tt H!tm7 o"FfTGrHfTG+ӕ` xɯ `yWRN}ʘ?Va@h;E@fN6a !mdFu$GdFu;ԫӕ` +n<Й\a.Bc~q"IYGhf I2q>tB:4ȌHɌLM' xO\Ypqʠtt^"ОWL\!mdFu$GdfO1f6 >kej˭*df:ЊL\EdMX:|Q5g.B zh㍨(|:j+On,`*_&h4X Xyt`8\:,ERtB:AɌHMt坘@:D+oG@"D+ߠ[3(+V0Lkמ3gN=|{qqoGgiܸ3o 4 EQƌu6m!v1p ?ʷիhӦM-ZB9rd.]/:uTXypw+Hz7'N}޽{[v.^xڴiwڵ4hƍ{ܺuC=ԢEcǎL&g `$ĕ 4:t^~=))uֽz?nܸӧ;W\ٴi}ˋ0jxmP2:@2:CIWGqyи>|sssvi%%%F@+Q;Me!DLL!uTJJGFF !y빮;v!ڵkW~}m ,ъttXtggg?~\]nmÆ ի*SO-_\OرW_jժ1 y,/rvZ:urѴ￿QFgϞup¾}~BYf=M6}뭷gQ*xEQ,` 6`C uJav8XQQQBJGi&$$y_>dȐ?\c=\΂,0q%?",--U7*\F*sM7}G 4Pnݺ|F Xk:@^nEu +,,L(//?ZVV&<ݻw8p`rrrHH>tTj6 *<hWE@V ,HFQ@+ӕacL`!'[pw+Bm˭95Ax;E"thՑH]nʇ{` )AL&eۘ? `y3X*wgX'Us X0qA!C̨伷@&OW[T3X|!ZWИ_$ATx!f 9L\ "thՑRy5!su9fnǽCa4, ef:Xn/B!@vD+˭A!$D̨-OP1Ȍ_Ca PS\lG*df: A!@L\7`L7nT8{gX;PA62:sw,WjG6On,&phTA"* A!jD+Eih#3#0Aҕ;c(`XnhF5A@sm .B6xT3>>6lX@R,<@.BEQ֬Yӹs؎;sΝ;UFFٳ;t0tЯ\ۡhՑ\a:PRe̘1[nmӦbǎ .?~|ٳѣG~n2x= OZb{キ}v5] !z/O8{ڵ3'~k׮m۶gϞ/x7C36lؠA#GL&ˆ-[۷z>ܣGEQvնm[W@! Z<kƍ 6)*444..v|~ުF#Po.HWtX[lBԩ"%%f͚u]6#ogy Ѕk޽Bf͚B߿۳֬Y#x駫oD̨Νkyc-~} Ӌܯ]-?Z^=!ĩSaݺufϯvO=ԁ\?166v„ wu#0)b`C IÆ$azŻ_|A VΝ;\RmxzRF3gΨ[RRbB88Cn݄j?q .,YVZk֬qfp /P)#'PGdFudy0t3ɓ'f>K?~6Lf3.YdҤIwգGC{nA!Jv漾0,,Lݨ~eeeB`gBtfn PVVk3Ve VxxYBPC?⫯d - 9O U077ŋ5ʨ|Q]DeY Q91n+̴?%ܹΝ;gVZ-<:~ !:dH{B8po&o5ALWTT԰a͛Y/--lԨ- eee'O뮻=9995Wӧ-;U+W|'^z饿@!oA ^E( IJJڳgϾ}]6//W_}CBBBV"""fΜyܹKZ]QO8_Ct% 2eJppi,J'Yf7n۶m.]'g$G̨gT{1_~~~F5j-ZhѢEM&Sbbbbb{F` ,5K 5XAty0` .{4F}0q0}hфnNdFu ,uJ0q:x0h3xID+@Ba@h;ED+@ZI&l՜q˭#ҡFfTI++ $3c(NM6{w ^ĩ5bw S]&###=0&Ybvi 0`@߾}tTLq0&&s*`?~iii6lHHH8k֬Y@vD+r*`[ѠAO?t}y_]ch#3ca{ Ɍ߿-7j(CFy @\ X/… ˛4i$PKVԚ|Νcǎ=sL:u.]:|pO:uѢE"* /Њwy'55>Bt}Ս5yMlly0qUK+L6 g>XBƍݻwƌ> 9mdfMҕq 䍨8u0::zuuh@,PCN+FV$dХH`h>]h%HWc܀eSY1q<5gܖ@[4̗cy/+_*:Qh~rի_|E?t᥷`E X=ٳgGq8fhE>N۶m[@@[nk߹sgtĬs'-ZTyݻwk1p [n@fNu6lذ^zr";;;::%%%YYYf~P܂.>}3tRӦM ۡj.B''z4.ڵk=z8tGy䣏>RX!Z }n`^:w܂ Ӌ ŋk8,Kg8 IDATp˭H倵}Θ1#:::888$$}~c1>62:D+֨|Qcǎ7i2n&mFN *\~ʕj1 \^5~-[?>((H+gXx)wп… :uˋ/\ h޼޽{oV GV,]o~'O޷o+ޅ>A^%x뭷~W/sMh#3WGV+#3c(^skPFCཌ,,dCn}ʟAz .4Ɲ 5Z @?&t {n<6RӼ:܂A[ȌKQ{{Q>|رg}%M\E\XK.=zc,{ƍ2ĕpy|ƍg͚5|:uXo\w݂.B@/, !5j4a%%%sZ`h8\XM6SVVԮ][!A\`(.z衇y .!fwǻax0"mdVʓ1g w !BCCKJJmڴYp͸&s'xbذa;vPu={ |p if~޽eeeL.·~ԩS'[Ιt%(--U7쏪^:rdKaYnEu$GdFu c=V~U=,,L(//XeeeBޮ(GUybT3XAAAϜy{xxzydؚ5krrrfΜXwj;SpBǯ1gϞuy͚59ҿ|p۶me˖W\S~&7Vg~ /AZ pVF.6m8 gfdddff,!DΝ+{l_ ={Va.{ݪDضmۡC*+--uqB:t3>>8qG?:P!˽Cx)SBBBwu~6KKKm־}vYv;vL]h%,Hu$GdFu ũEl|r,BBBٳo>k׮{WoЪU+sZjr @+._J͝9sÇ_xڵkΟd„ OLLܺuzk]vM:u={$55Um۶"dzh\bvp2d6; vZc6W^rJٳg?ogԩ+V8q믿lp i \>]n>:u_YYܹs~p GV,{?*gϞ&)..nƍB~M>]ap rW[ްaÁSSSհ6`C Ց1GDDoロh@@u`F0kEu$GdFu ũTyfofoȐ!gn׮@0qƩlٲe˖ !BBBL>=**  SkM&SZ~ɓ'{`XF!ǣc4N`if֭8.{jr*`͛7tx8Eqm[:ނɌ Vr+1,@g\cf:!HB.B"Zo#`r+0OFĕ+o@2: !;ødqp3V\,I-'7fA@!V`d,@{,FxuuɌ 3X6& `5ŽC6 LG! "d5A@eXˈV"tdnQӕՁ@r: ,G+X@ՈV.B8hFy0` P)zDTh f m{*{u1f7!&ДA" -f;7`L70eHL\Y;PAm 'X=AIɌFɍ;b ,˭cf: +ct. ZtAoҪyIt9ڠ$GdFu , d@ @m0q AHoEHK.BEQ֬Yӹs؎;sΝο|ʕ111aaaݺu۴iW|C6JAIɌ>3X3&55u֭mڴBر#>>~…Ǐ HMMUXRR{ݻwO4in}86tGO+V{WVӕw/ĉSg̘qUV}… o6!ҥK?Q'@~:4]~aÆ 48rlSaaaDDD˖-`ܹs:to4ibٙߥKg"]^G5G` ƍlRThhh\\܁>ׯOJJNWB&M̚5Kq!wzQgHWCڲe"&&PN)))0fݻw`pe ]tX{B4kPTTb>cƌPB-Zh3Jgܹ,mP@2:.k׮egg !"""֫WOqԩjY}W|}˼E׆$(xذްdOկ_?Q-՝Μʕ+Æ [d]݅,`tEEE 6l޼yZZFAhՑ1.LVzh ms+}VH.BƽC0 ,}z;h#3#9 $3c(`˭0 ,r(vg2$.B+]#ZfV@E&AA62:@2: VM Vpw+`.j[0C"c,3"t܊t4ȌHɌ 3XUc  Tv*b T^^^v9sɷW,@8"BEQƌu6m!vp ԄW`'Nܾ}{޽-;/^|إf- X[lBԩ"%%YfHW@+޷o>~x-lmذazڱc㓘L&Z]-?Z^=!ĩS:!0Ψ(9ll36+f233%%%6G=ڦMBاO)SX*f͚Ν;vرgϞ;wt+W  ֭ۦME~#<ҧO0u$}7Xhd:qN 1{: :*//WS Z%Ktҥu͛7oܸϞ=k#5pt/ŋmQFկ_ȑ#۷X™3[=i$l͛7ކcAAAB _@u*]tiرO|QFk޿멎(o˗ !on7KKKO=TddU~n…vY}?οA6Wkw߭~PeT:rHÆ ?~嗎_I칯:<b޽;?s!D-Hb*7[omݺ?ׯ_]vN*8{mݖi333[oBtcc̘1,S!СCuԩ]Ç=#sSu._^+..yqΝsr$kPS֭[nիW]}ƍl 8p޾~&MXlҤɬYru<>IX۰aɓ'}YW`:(///!!~{뭷ڶm@*"8}u# !XÇ>_u[lBԩ"%%ƌc{ćX?}|-:ԪU+ 7 `AFڵ폪;srrq?VZO>dMgpTg޽?,YP_BtM'N9s}҆{s=nQh?CB/w:t w!`AF5Ů6''?~饗k8B#yu^:rZjcW]ԩS5j1iҤ>l?nZvM7}G 4Pnݺ|F "`AaaačT.IJJ4iR gp5(Ǐ5jT|Qs5Btfn PVVk3Vݻ80999$$Dgdddh:^  .8{ɎzE6mT~~~B W08_~|zf:k֬ə9sfϑ@B6~XW_9|TBdggw}uYh"##YYY=z xҀ ]PoVp( ͽm^xQΞ=ZNKkv˭mVrn!IDAT~2|)"""&2m㐪:B1cdeeZJj۷obcc/^x9sZʹo_7wq祥YYYBΝ;;y/5>P;tI_<8){=s/*aRU'???55UܸiiӦ ,1bb,J $ѯ_?Q-՝Μʕ+Æ [d]݅KjR'NTQ9\ }z-8p~M8 5e%RuҥKnEn֭>Ziimڷo߮];βcǎC 2_7̖-[v厑&Ձ԰@Æ ^~}m쾯ՉT̙3oWw+XMHHHRRҞ={gڵyyy݊Zje}޽{@@wV2>Ձ[հ@3g]~TGrHfTX,ԩ=6?W^_{ #9 $3X!X#`h1X#`h1X#`h1X#`uv^(ʚ5k:w۱cǞ={ܹW (>p@^kfQׯuVX+ ~^1c〵|r!ۭw~~~iiiX3)üdJKK6G_ްa 9rd2YFDDlr߾}~#XK!ݸqc~~~BBM ;pÇy% `Um˖-BC:uBJ`A޽{͚5?%ؿ?*\v-;;[a^zBSN Fڵ폪;srr J`URu# :XU S7폖 ! J`Up???!DAAQuDȯXU R, ]xQޛȯXUBdffBtܙW V'8t!ug||<NB5jZZ75XOYFmR8p_֪)//OiٲW޽[f'OE7mTo}dɒ _| +((5;vBt%77׭#בEK տGׯ_w>|_o*n8 U{_'h5͛7ᷩ㴚WB?ze… lÆ Bo{ɓ)2A-X6l9j6ww_rōk|R/ݻw= ti>NB:a#HuyoVwLznBB?~3gΌx!`N>=v ׯ_رhaa|еkד'O>} LLLt9wK/d(8x`>v-ZLƍ;-_~|^x Ӛ&_[[n1L&[o9r C;vTG׿vرM6ڵ{,TΝ{瞓'O⋍5o޼5kY\\/m1bݻ-dÇԩڳg /zE+_o#|m7XXogJx`¹u8*''gܸqz_SL:UXh(ևEYjСCԩcjiӦ޽{'NBk׮;5jUev[N?ZJ;8su._\ #F|AZje=t^eu곲_;ܲeK^^ޙ3gF![SE3gNddޝ;wFGGz |{mֽ{ *]*|DzĈ*{g E禧WKW޹4u[ ,KKdcM2@qDQ"Ct gA4l Ax8LNyL 0J'iqkomoA Wr^={f$ܹsV& ]fGGt-,,<<<կj({MMҥK_{@$)l،S5`4)^u]XR)7oެ=<*>>>؉(ꭷIII .22)[xnt>EQ 5dՌ2 :88=jZ!`4 JnzН4MGFFhShПZrɮ۷oN^xN:]RY[[;;;vHgg ;.??D轡<$Zu&fQx:X~H$G\8X3 ii8W\amkkc=;+S766c귵uuu>nqX%KU֭[syɸ][,EQC*3IOOe˖iV'7LT*O>KSwT\׸Ͼ۷oEѨ/cd 4ҨokRFwLsb~%%%IN8ammϏ,%4Y5cquualbZ9ɝccc'Z^^+փٹ466qD"h4UUU7o>uQz5:d<** =1R,Y/[ pEZ+7oXsϡh7 >^޿&fb>&b,qi94˨3 ^3( Lƺ&ޔ&6Fh4111nBQJKKϞ=k§8"PNrvV\\\CCC@R%&&^~}܌4M7/W(<ϪpWͼbmk3gΠM&ZA.eFaF $ȧW!'b]48bvSNܨЗ_~/ܼy@6ɪMQ233J//Ç#;&g>>[E7ݻw?~x5c f7č:^^^֭iĘݔɪMQcccwލ@ P(辝bULq5kE|_(ҥK 3;+~)>eiiޑuttuE蒣jfCBB;vm7 @ܗŠp>ho ̛74|Oxk,,,`b>xEkaZlJֆu<5daas#mhhKt/ 2Y ] 2 @fgg)qfx7I%ВۻbŊO޸q#""b`` 22Ι1>pK* .0/BB?k4qW_-={*JwwwHs\Xݽ{T*w^QQ3p~~ #g]̙3ؼqj5Zѣ={.܇踶0fuqoniiZԄ$iLaGQk)V <(]BBB`ڵD_2rj ݻ ^⣚QF]:fth4[l8y(`m89-w0KJJX4668H:BV˶ xO$*Kv}yp ^^^NNN8lEQ)))1(kk눈OOς %KBCC[[[Y3Tc(Y__ }r&ILqqWlkk_JrڵLc=|eǡ)HۋVsׯߺukRR\.Mk*^Ed;wPEQTccc@@@JJ 3@+!Ӂ־rJdu6M)53X𣪪_C$YXAﶴՂ粀Gk֬qrrng}_5F?wFc04##7511QV[t8X3x-Q$?~'8|||<>hmooo3UZZZ @B}ZZ pc7;+C[ 66["888**j2p'P#mll֭[GH$30U,5$$亍pH$e0n}}}-H$!!!EEELw ߻.w^wwwVV+RVV755@]촢rl*GkAAAvvv ,zn]41_릦&OOOKK@+Rl4SkfQgT 1--+-- E??? FFF 1yY@juFFX, k֬A&Qm\444|/> w\aaaSSJ nnnAAA+W~!AbJ@4% s@ L#E `fBl?{IENDB`PKl<e22-Pictures/1000000000000320000001D00F6D3EC4.pngPNG  IHDR  IDATxytU[! !$,B@C(bP< ! aQdGqEQ 8,l$ (, dt:շ߯3gNUV~-f w  @2d,X$#`HF  @2d,X$#`HF  @2d,X$#`HF  @2d,X$#`HF  @2dz`P]&j:(qÀ^./O S$#` X%^T/ @2d,ئN32|KC鞗:`_`tlw<3  @2rrr. @2dsMQJ!lय"$`f1'.?h{"iHX~fX ƗBBŽp U--{RV+!a]*dX Od}$-'?hAX~(aZ5V{B=Muitl}SKg.w| i`jL,O_у':Zd,'AHoos#K@G4:hfA2 bfaN#2HV]YHD<`YHAS,1 /XiXE:=@q 1 #0M.,acxC8a"5F[X a aPᮅ| HцwXX|r,**Bq,@HEE"`,*  f,V5VAE@b!XGXAB^"` a \ fsUT,*A"ܿ|Gz~nAAAjjjA4]?`!ܻw={te޼yZlBƱ4iF&N+!ȑ#SRR܏Oz˖-CPaDD+ e~'Nddd85jԁ>s7'va޼yO? Ș( X֭B8r/$41x4ktrъpsy睻w ^xѓSΟ?_}`|xfyNn"2MjҤIHHbqX`Yb؏/X` lѻNq,uy5`\ as z#FX]tO .,,>S0 3N6TVV\2>>>>>k׮^^_`=*ǽE 6~f>}zѢE/Ic  t! 0bRo哝k5kWIII}"sap {jQ.].]ڽ{[:ozԻ@ V"SV+;$Hu-|w'N,**{~Ჲ2Waaa_ϩ#Xd,KBB4o|ҥn=>3)WCYz%!`ԨweeeCY?ߎ|g },]NN#5`18I ^{5pB GX-k͚5׮]iUUUYA 2|Mˌ(111N{;X,&d  "t4 M7|ɓ'VM|ZΝ뮻$ sLьFվ}w熄p iiiZ ӟ  +)_\Ko6-tsKڌc5-ԅf,`0hƂ/h XǎǏp}Kz̏>HxU@C vڢz*/_qFMUWaAP ;v,!!qv4}V96ڤkXE>QH *ҿ`g۶mM4qLMUXfZzuZ22d/64)͛=z̘1$lS0R0i ޽{x7{qqq>]jjj$A0 5պs܏>ҥKqqqcƌիW,'d f#1!{_媪mۖnݺ:IGMZ,{˱.a1`ٕoڴ)77O>vZΝ333Mwhs)ڹ b|'7o~}? `|e4Xv͛7} 0v2C"&MW*7zXE'Bq Z?Y7zpw!@5n49eʔ޽{ScP/"~jժVZ5Go֯*&CYCK^{}Q!DUUp½{'OӧO` h1CY~fUǏ-[ֺu)S?e˖_VG,VXa):u`3g̛7oڵ<ݻ(hty XVZEFFwuWjjlX&%g@rժU_kHnݞ|qEDDx}c`P 9rk׮{7ްuwϜ9sȐ!E'|"8y?ޮ]zٳ5;vW_}}CEV6mtMɓ'O>]v>PLXEnCL?m۶ӧO4iRf$jD,!D?;6,,LnA.jb w֭QQQ( "K:CaÆ4E `dce X3T2!n3sL g5nXYa ! lԮ,ݛteJ BK{uuuCOl^ K.cH++1-#XgϞm0ѣG5^YgUhR%&& l6[IIj5QW=X+ e]mpLYXSCX 7 3!V0>V.JC` ,Lz˹te+_ `IޅC/yπwVȿ8F.у<^By8of,zF#y 8#,#q)2 L"P Kb2t,Su0QH yr|љ˫+V]eee-ZٳgFFƨQBCC%V"zÓO14Эr<rʤ$j $#I3qvm0J*,,ݻwIIѣ'NثWثW9rdݺuoVHH޽{u&V"`ӄ}w_ d,C,ַoÇY{ӧO6I&& a!!m܌itXh>۷o_]Jq#Gl߾ݻ[sû/~]f͚ &ԕT۷֬Y0D|zPOݽ__~7L0믿Z"|1Q~ӱ=X[.**p4ڦMkMO,Lx꽚iҿVմizӕQFQQQ:sejŒ޼KZz7n3###5\XBcUC_T+e… eeeVZZ/h cyS i X/^^ :I2fRiiR%,,,::&6bTVVU&wt侕Jz2D7mTo{UU՘1c4Uq,C%.Z}*°k>@wSD+a1E^:he{ҕ/h""(..Y~j4hs='`\TW !Zh1{?ڵB?m7pr)BQ۷os֬Yj,,,lҤInnnyyǻt2|O?t#->j"fmذ!;;… 1E@0aee|p뭷1ŋү`puҥ [Νp?]wuX,^xs*((;w5692uHM6ݦ( ,dsUV @2XE:"`HFr9G@qJ=։\@cQ3!`U#d,XE" xp/B#`HF `;1)IDAT!8~q6=X060ʹ*B  L"$#`HZ9XE@`!$#`Չ{XEq/B}Ѓ@^fZ9XE@`!$#`U#d,X+"0:d, 0tD=~GSPPwl%K3,,,66v„ Nһ(x=x &zWzL>Gܹ;} SzZ~'2225!C呮`סCy=zՊ+/_+!DBB›o)رcu~t%0`@TTTH߀[Nxnʥq]rwߵL@?npoРANGʄwq@?/SO=w-"QQQ[h!(**\!D6m"##뮝;wZ0 GyDB>|ŋw]Xz*//wJWBիW:K8pEqРAlcǎUWgo߾|򐐐FL)PO1118-(//l߾ɓ']zʕFGoCu0EQXEϛ7oϞ=2~Ȑ!EEE۶mӻSbbbZռvbڤI{B !J,XyfҕIum_j,=~555Νsaʕcǎmܸ˗###ՃӦM[reAAANl6ی36mTPPn WZZڬY͛zCyy#~gteN8OXܻtR:u:TQjܸq<رc+l4-[<_}EEEii޽{wnBRRRlllrrrDDoqM7effxUUU]wݞ={HWX,ׯWDgϞݳgڻdر[nB8mԸq㬬,}jg7o>v5k֤u=99cǎ;vhӦޥy,  @2d,X$#`HF  @2d,X|o߾aaa(Ҷm.]tҥs;vlܸ(CջFCS?3f̜9SꫯG=~7Ϛ5ѣ꓏=:k֬Ν;۷﫯ZKTTT̘1cW[b@`:zh.]aaa3g}tvN9}tJJJ"##=+W4m466ŋr#X|s͛7B8+!DDDċ/SQf:iҤILLm۶nPBDEEyQ&X|QF.GGG jr ^~Xw +,bŊ۷,,,ɹۯ]6~S'OڦM[o5//Ryyy̜0a„ >>}駟|I{/3Ϩ=NU***ncѣoӦMDDѣKJJ.y/333--;Xbbʕku^XX8jԨ%KxakݺuKOOڵ(qqq~xu xgbccZ'O;nݪٷoc=&hٲY^~ؾ}l}_l6[EEŽ+裏W{g:vXTT~z!Dll UUUNG5k瞛W9}e˄M6}.]cǎ#F!MxsvԩSwu>l˗/B .|衇tN{㫪ǿk||bÆ mX|HMfB(lҲzO۰a{ꏟ}Sު8z_ZuEș3g7x)#+WB/QR3͑#GO8p}tNgmڴxĉBl_6,>hO8l6:x/+@l#G*bXӠUԾBMMӑЊ u,W^BLؽ{w B_~~qy X,j{IIIYY*O^B̙3g߾}?`1>>~„ ϟ3fLvv n>Rrd\tittzj'>_eV^^*| !V^xAcꮻz'ڴic_7ߨ`Æ [x ԝK:N!ĉ?Ù3gG/}K֢E -Yf#-E4hC=ԧOq9տǏv{Ow eX.p(\F2 ,Q` eX.p(\F2 ,Q` eX.p(\F2 ,Q` eX.p(\F2 ,Q` eX.pY@|=P?(~|V_d /2aLXú&  eX~#kdG: uVY +CX.p5$9V"&Y%;Xnܸq=ČID$"k^E2 ,/_NX}dZYa#kdu ͚55ȚDdͫ(\FB Z9HNtBbF$"k5pY@b|rrr f3kB],_CbdvFⳏ:t 2*;OZ3WPbX}dZYa#k!5t"8),,:tḣF:G'}xϦ`iRXXI5ȚDd-A=XjGq kdG: u! ,hNj3ȚDdM"UX.㬣@r,/mID$"k5pF"!lZYa#kdu ##YIDּ eՠD!GF"&Yy(4A a@: uVY +CXЎȚDdM"UX.o]$d"ܸqcnnѣ cǎX#L8M6:'葑ID$"k^հ'źu ZdI߾}7lЭ[7֬YOnZ,,'O3&//ϨRYYY;tФI5kqjGq kdG: u֡..]k׮aÆY iӦ5k8pw<#M43A8BDdM"&Y./^ʲ˼޼y:tp饗j@X 7׵k;v?~q޽{۷o߿v^ƍ3'|@<|#0#)**R[%tլY `eeeӦM322vUUU>q.+WCBID$"k "ޕ9z NE ]`UUU 8qB)V~iII߮wrjGq kdG: u֡.:uTQQTc)222ѣwu̙3SROK*-YIDּ*>}TWWݻ:XZZݻw؛|g%%%gu0.:Hb }Zŋ o噃/7߼z߿p={ J۷+:vشiӰwI$:=77SN-.Z(33K.1YUUꫯl֬YUHᗶ$"k5ȚW%tըQYf-X`ӦMƈ_~}QQU ,;vlvvco5RJeggXbʔ)F9sfIIIffA= pi<ÒA a@: uVY +C ׯoڞ={FQά_HD$"k5Jwġo]$"7##YIDּ eXjGq kdG: u! ,hGDdM"&Y* ,7W.B]ȚDdM"UX.HV[=2Y +>AVX}dQ`A;zd$"k5ȚW x|o\1.WGL 2z]9hk:1}#`c9{i>@\ HNtBzd$"k5ȚWQ`K#Ym6dZYa:D葑ID$"k^E2jE@r##YIDּ eXjGq kdG: u! ,hGDdM"&Y* ,7W.B]ȚDdM"UX.HV[=2Y +>AVX}dQ`A;zd$"k5ȚWQ`t"AVX}dC"uo]$'!=25ȚDdͫ(\FzdAVX}dZYavҖDdM"&Y* ,7W.B]ȚDdM"UX.HV[=2Y +>AVX}dQ`A;zd$"k5ȚWQ`t"b_K˗w7r]H|1}#^Y#C5V8Ac?RRBe#Q1I_~j~wJ uVY +>AVX}dC"u#B7W.B]ȚDdM"UX.H֏+K[Y +>AVX}dQ`A;~iK"&Yy蛫A!IL'4E8HD$"k5U`k tX_|ȂjGq kdG: u֡~9;;ITUUuС'x##YIDּ*o˙6b>g~„ >`JJďnj#4,HNE#(l+T-O BDdM"&Y o1fx"AVX}dv{[nРA~J%KwÆ ݺu՝w޹hѢ~q֭3gΊ+6nرc8HD$"k5J"0h#EEE*nFM:~͛ϟ?k֬͛|ͮ/;;{ŊSLi۶KJJzinУGN;1bʕ+RA)ߤIWf`#s}kԩSJvڥVVV~W*,]477W|uTExUW;)V7|SZZjTW/X]Azd$"k5ȚW愤A}O?t[hjѢEN7\s5nO@Z}s=ׯ/++ eeeׯ{[jDA a@: uVY +CZ>SM!=25ȚDdͫtX< z'בG!ɩKKKo馎;fdd=o^o߾wO<{3xHDIDּ*K.y7SZZ_|dff~M47oU3OQ/b+^~eee?g̘w/ ?^wa4XYmzdu0ºu3ʚAb\OֆpQC9an|d-.¥KN:uԨQ-Zhٲ孷:iҤ p w}Sy欬,MӅD#q.z!tWI=!(kA{p6~zЇVX۶m1buo޼y R~a۶mݜ l%>zq%N%N]|Ʊ2Rw_4i=?z_DULJv]T'>SBcb+6mڲeKH۶m;wܠAӧK76wUԽ$''GǞzL}a] a~ua6u ,}YyӨb]Yް31w)&"l \0A;` ))jXoYo;kR֔xo߾=hp'N Sw}.L0|\c<.}ꊫǞ)...T>PT)U8e|ϻPi ajĺE j,f'{f$=!j>.TVqq)I{TБ$|jwuVv]_^.US ~guuO?t9.Y@AzЛ8L8A̡[kZnuY-;ه6ntmvk.Zc- Aa֥9]7'i;٥C*[",H_cEUl8py_Zb9c3%%M6֭s H]a-Hwju[9(6akQ[u?k<ȸ`ӊ5qkւ1'}A:Bou0 {ajCZg$Akhgd-&{cԏhX14nkv3x؝f6% *`ir-֝KN>f8^m`.Bs6a}z_ksq2z0:Y뾏-hg:,;[;1hÆ [nY֭5jcㆦtP6OA͠ȱkb/E"m)`8 [FޗP6t]GBapPZZ+-`4Ϩ{Bƾ*zspeYЧOs&A[2okQK4Aκ"sjE[%lbN#33oJA+ ~8p8PQQqu׹>׸ [HsG=^=8CeCaA<hBfnf4XwtQ8b7kHB}i赑F a7i ZyPD|c )] Y0vhev3͟o3#FlZH)>E;CuR9 E:ؼ -Wz^SZѠk^I-ҳ6u&}XG"(Ȅ랰G Dxg+t5ZعEici*$qa4hк DߺRAYy=ރR`$]{9,A#g'MXZʌtm\5&Ӟd㺬ͽ}yþxSټr &'!6ptQK[|y/dS2YИ:\y4]'Qg!^>vH3zj37)kt.k>lo⒦iSުw>Z5k1@AGƺ?=N7t?p|SlkU]-LzA; 6t IDAT@q+R7]_p}]1D;6rVF-"+P5ҍYhh;qM_qJ" ~*??&N8iҤg}vĈA_3oڹs$Ym {Qΐxh~|=N^E.kb+rNMZ/9щP #k g̘={rѢEnL^PXX4% ͚*o_EZ b} {YGnV`]tEƅ>(??/>}zuuM 8peܜ&<ī% 訓ψ,S n^x4h[k׮uq!VY +>AVX}dZYajX[<ٳRiiiv1O:}4/&QfJ6k_:uӻt2{ N|[lQJ^o~3yՕRjȑnL^@DdM"&Yڜu9̝;6m۶dp}uzdAVX}dZYa/|ѢE 44x=25ȚDdͫb{kTW蛫a]Eo\1.42#0# =ew+" 0/ABID$"k !9s|wu Xݻw7~pUV&L0~~С"++IKV[=2Y +>AVX}dV`=cJos=7OIIiժUzzzzzz֭?5kָ?YĻ5ȚDdͫb/k}J)վ}ny]veM@Nׯٳ;<%K#W\qㅓHN|?T])+TZZ4/x%YIDּ*f@~|ċ믣nuFvJ!-ƁuVY +>AVXb+.SF쩧ٳgmGF"&YyUlְaÊH'gyfΜ9vczv#G?ҁvm3=ztӦM[rezzΝ;[lgκE@r.7idÇOOOo۶ywg7o<77wʕJ^zI\u}葑ID$"k^o>0o߾oo5~iӦu]4͏=o3f̸ˍ4iңG{g7tۓJV[=2Y +>AVX}dS9f͚z뭷z'##YIDּ6`}s5" 9s!P HD$"k5pF"!lZYa#kdu ##YIDּ_U>ϸ 999)ASs^|s6m 1bY>oLxl7g/!'}蛫A!ɉ.BCDdM"&Y* ,Q`i$-ƁuVY +>AVX(=25ȚDdͫ(\F\ HNtBzd$"k5ȚWQ`K#Ym6dZYa:D葑ID$"k^E2jE@r##YIDּ eXjGq kdG: u! ,hGDdM"&Y=]6niUTT<]tI;u 48P)dɒ 6tVt"ɓcƌ3+T~~~VVVAASGF"&Yy Kڵkذa!Clڴi͚55+</h$ߚGkq+ljȬYj>#C9''GGd1RXXޫcD>oD+ni\>VTT&9M6MMM  @+X}޻wuT)ջwxDV[=2Y +>AVX}dySJmٲ:+\?sJnҖDdM"&Y*X:uZhupѢE\rI} $o}V2>׮]is+HNt:bŊ)S5j̙%%%GF"&YyЯ_~g7J"!lZYa#kdu ##YIDּ eՠD!GF"&Yy(4A a@: uVY +CXЎȚDdM"UX.o]$'!=25ȚDdͫ<[ ~߸c\0ϕc$ṠF:2t˗'|#擾67NGXY +l  kZ„u#BhGDdM"&Y* ,7W.B]ȚDdM"UX.H֏+K[Y +>AVX}dQ`A;zd$"k5ȚWQ`t"AVX(=25ȚDdͫ(\F\ HNtBzd$"k5ȚWQ`K#Ym6dZYa:D葑ID$"k^E2j|>7.waFaXRVDX5M y\&Y% Q`i$-ƁuVY +>AVX(~KD$"k5pu$w'C~iK"&Yy(4A a@: uVY +CXЎȚDdM"UX.o]$'!=25ȚDdͫ(\FzdAVX}dZYavHD$"k5p7>mڴ|>h.]o^y?۶mkѢW___;v]$"\n^{m٣F۷_~i;sҤI{92gΜ>}޽;>sFzd$"k5ȚW%tu1c 8*(()3WXsΝ;w.\pʕ_u׮]7iҤ8$..]k׮aÆY iӦ5kDռyfϞݬY3RV:P"!lZYa#kdu( ŋ+z2 kȑڵ 0@)##YIDּa}OΦMRg}u0##C)yH+F>袋ޣ  Hqqq-ne?R\\\\\\8:t999:"*A{/GȢ"/ 7׬Y `eeeӦM322^\\HD$"k5JҪO8JMMudɒ%9g ] W!N:UTTXeee3*--:uۼysקzdAVX}dZYaJw?s>}lݺu޽:t0*--UJ;j؃~o߾El葑ID$"k^`ByyyJ-[X7ϕRY^^>~iӦY:vXuu˳;yywe+`NNΏ?駟_PUUwҥ_~6G;v#||fڵM6]jŋlr۶m:&~gyСCN;M)_ې8ڷ~۳gω'Ν;wɧ~Rj„ A8sr4^:dM: ,)SLt͉'~__޽{WWWkwr{oРAG1{]*FenC,j뮯~jѢugN_|qjjjЖd(PKUUUQ6,\P)oZO2_u6=z޽{#+WTJu!k"RNl`FFRj3vW>|X)uE#d-UWW?C?o'ki/{ZgϞƍ[[j*--I֮]lْ;k֬umݺzYK@UUUrˋ/Y ,ԏ#1r͘1cĈ4GZbfϞҠA߷o_d-M:577[n6 kGiiiIV'NPJnj K,ٿd-1egg߷_^uU{ݻ&:x>]E_vvv&MOd-|g%%%gu0.NJyG^^Rj˖-?\)5x*//?~iӬ;V]]Ț@YK(o02._pyC}SF/6'NԩӘ1cW]uUff&SM***cSުY?˖-KIIYv9Bꋓ#e1Y ,Ԓq6@wFǴ￟qF˖-KKKܟ+~fcǎ]y={̷xС~F6mڜsN۶mUV8kԨq:k׮]vҥKΝ4ibز[n17>szꩿƵK.-((|7?~ŋu ?RQFYWuՆ R֭3G;ְaCTyy1RYYf͚#G*} _}q/ǏWVVq~;%%E)uUWYvm&M2h@ȫ1(nqרQ'OgM6^{ԣGZ<zx\rСCSRRVZiUV Ç [|P)q޽{[wÇ !|+J73&2ꪠ+lԕW^[o >֫4h&͛7/,, /2O8.((ˣ 9rʔ)J7|^dРAÆ ۹synIII={vͿ?OJ{Gi2C(~u 5fп'|2U=R'Z2Κm}{1\ǎ{UWUWWO2egqF P`H7...޽S8JÇ^YJJJ۶m_{58>g5.ϙ3v($-[.[m۶?+**jȑ#JVZ^evhWUU߿ԨQ6q? /TJ͚5kҥ D twi֬_|q7VUU+0$%%M66?xiiG}*,,ܷo_($^z͟??%%eҥ'NCen? M49sf˖-?~x ,^f+UMzꩧb XZZ:}ݻ_wuQ76~&<3o榛n7o^FFR}/RjҥEEE1@bak)k<pw}6Bٳꫯ|_`kceee&L6Git8}ݻv X<-JsoQJmݺ5M~k6hɓF`YY1R]]m۶z{vچ ziɉ'=z:^VV6m39-IDATڴ[neРALJ vѠӳ|> GoG@.xyԩS|  40ެ3g??O\sE]dy7֬Yc\O{u7O0AۚЋ{p eX.p(\'FIENDB`PKl|uWݼywޮu8999K,<| y䑼BVZشiS96ݺuKѺu/?שS';;$I?p8<(?%%%#sU2O)ƌs=L`!… =X%SXX#Z'lذO裏?.o}]!Daar\«S۷%Ǚ3gW^-ԩbvW2RgvѸqڵk;!vRX~~ݺu륗^z'79rdРAΝ?~|=33v%%%n9sFPWhxν\N999+!ď?X`zfXjrbñcǎ-[4n|;:w| +7n HLL_ԏi*$Ipf:t萒ҰaC̞=[!jI!P&k2@Bw}Z-Xb=X*n7ߔ9ypA|M= *t2k$$$g͛7Ȩr I@Ƥ-cB$g_ise?jdI-kyYЫJDWQgeeT6&wPVW`e?jd(@Gh4ĕ.B1q-0&L6V&MajjO?=~I&}W\|ˣFzG̙SXXP >e?jdten` 0 --uBSNuy۶mݻw/{;y={K]v.\X~@ D++P{+??ȑCӕUV1bD~~~-Zp8??m644>Ro(tejmڴ)>>>))O>ΓIII}ݰaC|||}cǎ}'O?"// ;sLO!@h-3X{Bl}^?i$!ȑ#ǬYׯi&U 2-Rރu9!DÆ ]O !222^?x^xǺuvٺuV$=p8 98@̓ rxy TZTTTzzzIIog%%%6EgϞ-YW~W۵k}Њ^%BCx7[II[gfS&3a``dAAy)[ooxb޽NP= Z+**JquדBȲ/Yd֬Y/޵kW||+W?3ZVAyg}ݺusLIIyꩧ6n8tR׷mĉjBܾ}aÆ%%%WY,4D2(//88xϞ='cccvv]~H^7qc:u4h Nj,UV]633S>f͚!… [j5w\ !VX!x~ܸq*J8w\ cǎӧO2e3fؽ{!!!dt =& X$LeK`v:~@P!zj 25yJtEtB7 b !`̏h.B@)lfG"]L\A+& ]AS,hCLG*r`%(5D0yJ0q& l=wt5*tM#]AX=5@5HidY,0qcHV0EfE(X" !@ ,hCLg9[HYL()a\,th3[]`hD+h"$II t5970`pVPk`P ejS~~~5s !6lz2((HQÇ !"""͛w…#F4hР+Iʞt8CpX''foySapPɁNc̓"V%IҥƍKJJ||~<+))l-Z8{lk׮]~l968p'ڵ+*{X;::o[Eo_PPK !>nݺe/)) tNJuرcsǕP!֘1cOu~]|5nnB\~dnn"22yyym6[ppp~~;C `n=z!4i'5W^ׯwOy={_wb9;ߥG}4;;ݻ'4i{AKQ&)*H 2YǷixWX/H{7ogדB~i.?4hР4+W|K.5+&C.͛:p8\2vX=,hVC=Đj,5AR>-JԾ}ŋ+:0 ykϹHOOߴiSPP7S%\&ҕL5e&gZ˗/x<P6?gj׮]*C z~hѢʯYYYtx]mڴw,ézm۶ wThƌ* kthX&L~駟VnT09zj A29"L&:T~O?T>-ps3; Ay|ܩS~׮[گ]v-EX`8p-[J>>>>}zv=>GR X˗/_|瞛]HW@GEX={Bl}*zVbbbǎ[hp% Sj/ʓOn$()ϟOII| Iʞt8mp; -hp !!AH&JJJl6[-Ξ=[իW7jH!Dhto=tHLG 267UP``y@Qnݲϛ7oȑrmE9r\!D/u}ʔ)Ǐ1cݻ xTCCTy+ʤ(5]ֵk׮]СCKrPsL\ihh0ۖp6o4 @}L\4@M+P FVJP&F@W!`fC͙.BXP t(W, ]a;4@O2e?jdɚX,!`HD+3Eӓ ]r"$??$-Wg`,r̊VAPk`PhұK*tFJ3aTC=XЀ zj-9Z+a252dM,cL\*!P%vA?R&!P PCf빣5D R52dM`X̄K$`MPg`ʋ,E'&nWmfCh xVA(5D3gW} `Xz"Z5G!L\tCb gtB5q~rAh}?jdɚa*0 W1[]Cx=X5X"~`P`AU*>52dM,˂c:B6=w- xԩS;tP3fO tԩ"4(@C HJJʀZn-8uTΝmֽ{;ww}[~zZj};v, XFDh+??iӦӟV\<9f̘̀R<7ߌB8^zi111w. XBm۶옘ד111/_޺ukܹӮ];9] !$Izׅ.\Pgts>52dMj{ !ZlzRq߾}.{Nz~BzȻwa ]LI.s !6lz2((HQӏ?.=zt%HTpm-l1{oySᠢ'{ओX !!AHKQQQ%%%>>Ml-Z={2n`k}Rm۝$$$sܵkjcF8'X{WZ5lذ1cH… g̘1gWzڵo-ӧ#G2mz:lٲɓ'wE~hӦMG^roݺթSSNz~˗/s=e_.Bc60"ߦfNjor)yCLG 2Y3X&(,T rmK8A ܡ1Ub ]ܥScI!P&kbUc PnsGX]P j!`4&!i``%1ʤ(5pK~]b3'X30x hXk`P=5@e&fL5AE26f빳r! ꡋ Z+,cUt*X zj 252dM`xqΙ]L\8+M@@L_i=eH[$yYL銞CLG 2B7i`1k3 ǵtq] &M+L#L\`gQ =5@e&f4ƚ CҒf3ܹ2J!W=X ]`n,eAL,XUe?jdɚRkX 똵js>]u2q!Eh+,%B8fFr=5@e&fC2Vz~! SE$?D+ku;wNѰaCדAAAB 6?_pspV;HHH* VTTTzzzIIoK%%%6EgϞ-(0=` !\O!֭͘?)gI!P&k|ϨQ֭[wҥ>,,,>>~Æ e !P&CLG 2fz)~݉唞.ѣ6cV~z299988866VQTNժUk׮̔Ϥ'&&Y& @۱T ÇZlYDDDQQQVVɓtR,ue2ʤ(!(^&U]?{#5ߋ7^HFjqHKFDP @a&܃@X"P @a,FP @a,FP ,_~zUشڷo?`zi="XP$IƍW^ttt=- xԩS;tP+ddd̘1O?-,,_ҩS'!ľ}>|ڵ+W jj^&W'NLNN>wLQF?C6lРA$5RPte˖z&99N:'Ooիr+̜9BԪU/tiӦѭվ}Sy.]tڵ QհL|$I_bĈP&fPX 3f5/bHHH^^^٧4ܹsn111DFFM հLNׯ_ /(S հFv'Uօ *z jTs5,<=]ڵk^C M &̛7˶mۖz2&&[n-u;wڵk'm"$_B\pAQ[7p8&L`ڵk+0VR8gŅ)5T+R yyy͚5Sb մt 6Ty޽{-[t=)(/-{Nz~Bz,o)11cǎ-Z0-K5_aÆ:ulM6_̈-Ke4ibȑiiic֬Yߴi2X.ysÆ ]O !222|DžG(SRR^~ey>,ؿɓ'kժ5bĈ$Uk]i6l{;uTnݳg϶mV«X;w!]O !n߾]W\9hР^zyixyZI&-]T$uFOk?;{iٲ˅/VeU_/rϞ=? M?ggg)((& (@!DQQWBuVyVVV%KT(K2͛7oȑ5Rp֡NJJJ k׮~~~ǎSC:er8ONNx?gϞ/"""BmhƱ~,7SS3rH!ĥK\_*++K_]xgyfه詩 e:zh߾}]gff:/LQW)$$I&g|}}]PJSwyGqQQ\\/ի5ɠX"JݚEQǎ>gϞ} NB|zjBB}*)--m-\deeeeehѢk׮^\fίң>}]דM4Q:e7ηiF|g^@P կ_={LNNBӧOv999 wzڵK1[Ge0aB;K.?xWiРA%%%iii򏅅W\yꩧTxZ&yƍu rsFwZjڵ5k.\تUsʏ~^{W_}5..2A}(..SN+))Bl߾N:fjiƏ/Xbӧqi1v(M~رcEEEYYYwҥhHHH@@< uVnN:u W~hP ZFIIISLӧODDDvv_|nVQbccwo6n8==>5jvÇb$ EIYj 7oݚLG 2",By׮]~^_~>1LG 2\,(履~%I2e/;eIsss|YˢLG 2\,(,FP @a,FP zڵZEȮ]ڴi#I$Iʧ~|觟~z4hp}ȑ#G Ҿ} zȥE7[n!!!~=}||zǏmڴK.$>Pĝ˕+Wz;w۷',hΝ 6z_ݻr;ϿznCCCJ]t &!2335k<6idѢE$:hJc 4nxB8׮] V{epnxׯc˦+!ĸq*4i_֭+**Zp! 0`93g8qC- xԩS;t`GvZhhhaaaFF "$i2Von۶~nݺ{.55u„ S:]3:r?^LNNSɓ'z߿߸K/ !ƌK.aaanhl999/ѣ6mL>֭[cŊC Bԭ[wȐ!C 9qD%>>>{7o~y3+s,Ñ߰aR+///88l/QgzuTIDATzVPPp8.]$>|RI sX\\zիM&˗ !֭[WrrrBCC,Y"x <#R[YfLNNv) {R'mۖz2&&[n5W iӦqqq˖-ϼcƌq]vkB4nX_W V?/'O8q)>>^wyי={vnn<&>}cVXQS:tO[ Xڻwe˖'gG=L6M߾};uTi|G= x}ݾ};88X{B``8sL~~~ًwѸqc9Qڵo=w:-X>+'k,y۩t$0⣞}~Pڷo߽{~i͚5W5jf+u͑#G t9z233k׮]RR:o^sm3Bݼy޽{o>w\1lذ7nTSЕ[۝;wDm???!oL#> մi8;;vԣ;v숋KMMرcMESN=î 5WW\~{nB{_̙3L0aǎ/¶m۸M`֚ B,((Bԭ[׈z޽{۶m/]Rѷ~m۶Byz%|||U_~Ep8r9s|{BܹyBލo q&M!|}}ׯ_'YƝWs XQQQBׯBDFFQ>?`4$M>]Qj{VZB=z4!!f]vĉ.\<$k߾bر'OܹsGy'ڵkܩSK\g9|ttt7}75k6o޼7o !ŋ?p@?~[[nw߬Y' !&LpISk={_wb9 !zaG=ٳ[neZ`Axx-[+ <_~_r7xCq…>BŋgƍO>ÇgϞݬY_~fݻw~)SV^?i޼y厧A_~e=z?k߾͛}||;k !.\W_}ܥKǏ_ڸqG}$^|b045Z 3wS87.888//ψz_xVXXTgΝ;?={^zIII}90--W_ܹs^:thٲeEEEYYY'Oҥb΀!kmrP @a$ E\rIENDB`PKlrm۶ 0^ھ}{vvڵk_ݻwt7tSԙf l0VXXhxV[[#swqGNNNΝ_r]wuر={)T? H+0//oϞ=鎹(4MKKK۵k͛=ަMfKJJ\+!Ě5k 7 ֭['>|saÄ-=Ƅ .B3glܸ1--lZP/ݻsgAAcM4InB>XvM6.=Ξ=ۡCsy^%ftM~76-USSS__/;;mVVֱN>iӦɓ'{ Y;=x_XA.ēןz`J+&&FrFrg+WH,TL4{ynf-\0))~;zhMӶnz幹Vڲe"55599y„ .'''l0VXXhxV[[#kA^^7sqԩ555O=Tn #|!D޽? 9''gݝ:u;XvB]:wEQZZȓUV !.Gyd̘1;w޽iӎ9q_ 501GA}2^wTwh۶{c\r;tߴiӎ;.B7spnڥr]F rCCCyy駟ֻGEE͚5{=~c=JϭP[[^SS#~cLѽ{wS !rrr%XBD!ĩS?vډ&['Nc8Y ʜ>,5jj6h !ѣG+**r\ XVUsNB!ĤI9%%EɓBGEE0 qQ@ Xƍ߿>ݨ8~x9s̞=ѳM/3fŽ+l߾]1sLi' P*X,˖-۱cի+V8nٲ%33ߴi\Z !wtO>'cӧO/X 55uA<%TK7bĈyeeel$III :ԑX^^&*1cFrr z^xO>y_tEgϞկ~5k,aCf%yh5==(>7LyR~pSzeZY`;K7B 7ej1!^}z~f̘s=}m6{5eʔ+W .<ԩSC7?(`ٳ'==1iiiivڼy۴iǏ{wR?ƿҲ)?pa[u"Mp\o:n XK-R *L ֭['>|saÄy^8rH|||rr>{ȑ3.Bψߤ XB޽{;'s}}+'Nxw>`]]] 4Kn8p@ѵkW.]!JKKƾUVǏ뭷LҺu놆?ϓ'OnhhpSK!1cpQ@Fu^/*VMMM}}"&&9m۶i~7x5\#ذaK/~GOՁMtEhX\sO>>>~ƍC B,]TV:U8!˝!Dll˝ifB/]|N7}=k6 1J](7J}HPm x:d-d%>"J%HLLB:u9Qo߾ҟ1B8!EkB2Ç !F%pHA@=0 ,*عssbaabҤIWTTk!KP! }hJkܸqקuX~ǏY__?gΜٳgCo߾;cŋwB(`Y,e˖رc̅UTTb -[dff>6mrٽBO NjZ{iӦ9sf˖-;v-RF.]C_3^J et3Tr1,?k!;_޵6[w}5bĈyeeel$III :ԑX^^j*3f$''O0!>>^OYh?|ĉzeˢ:}"=nEްaCKv.={hikkVDzDM~ Wd |o0(#> ՏQOǠK3,]&dХr򂗹>w{LqdGt2)I+Л!!X>i H_ٷ=q:Jͪ'a& `U{ԩSn m~( pB4vHENDΙF2Z9pJաo܇ r |fdD@󝑚"#U[5mڴZ[6o3fL p1D;ŷ[n7tS֭oiZ=n `T>"+2%% ʈwhRVRF`̑2TMIGBRk(xKQ 7: 1jwgO5V^ .5scʏ̦ kdee}ǎ={9rޯ_?3,+տI sPJ8 Zs)U-2ӹbB 6g}לݛOL>=33}Jf?OڟTnwϏϜ93vXnjs̙ pE_/0D oroK94:M)7jGt /`ƋG4p-CܱAAYRkΜ9Gںwߝ;wnϞ=wu}I/+Bskc]J%;j$|ybakPo|3f.\k=[nݪU.nXxgΜw RT[|o_n۶mK4iҊ+.A! LbDԿ"| nO=[n `093s G)s\]j03oֹs͖H[eX<޾iwʒg AZƏ!Q‹y+2)#_9dcM3楅 d5C^=H;8=m-Fo yg oGz#G,&;Ӌyr-9rEg=z_E06kɒ%?v^zg*4lS .y<\Ȏe2:s]Pi[5q+r#G\l_i}7ѣ+n]0~{û%>ZjE]g͘1#>>C }ԩSϞ=MVPPУG+W#( R9r'9~mC N/Y ޵䃔蔺! UQVZ}~E_}UUU_}Uiiӧ#Fl߾/XJG_@KZ\C@,]x[lͽ㣣o֜޽{K/(QDirKc.=|UC)72MOp(. NUo/pQ3TViUiVEfEY;`566 A@eA Ξ=CpO|/X6H.g-N=}$y9y9P b)%SM/^9bX*ɓ]v?Qmǚ+G\K3ߦiXfͤI,Y>y//{SNVb8TUU߿)bh,* fW:R\jA6O>;Ծ}{ŏt` b~(,,5jTjj Vȑ#~C\r֬Y=Ё<>x'|*P#/Ǭ7Bg:p_~3fS>}}6͎z2eʕ+9ǟz ;׌'.EvtBb-ZzXgdd"5|MMMmmߙ766N>ر;?`)RW; R7dEr~G^R!s|Z1X捐Qзrtu"'o^R93g,..^tC=z17'>㇎.=f 'p±cǎ1[5eMRSS_III[CaÆ rFrg{}ѧ~{0߯8 IDATp1?{`Z,Rϕ$|-`]veڵkOoݺ5\_:ofۏ;S扉BSN9'X-ڵkץ^ωҐ!CdrV 옌i4'sk['w^zinn\ƽѣG]pÇ !Fw6Gz'N9@S-ӿ)s(!VbΝΉBI&ƍ5TUUe,Xԅh"k76?Z:QQsSQsaN!||]bYlَ;VLSYYYEEE+Vp -ܲeKff?i&+**2`2Jݕ[%KokhhBtyɒ%v[Kϓ}-͈#͛e󓒒$%%%$$h6tPGbyyynnU?g̘x`7;t.={i =O~tr^x>BS^v1vX%wvKR3|\ +EΉ`lڴiܹ.󭛘i lBY"e1\5+*| d IH>1[/Ŏ[#3f7Nz!Tfӳ3Ϙ:aOK|h"Gx:v49C3Xm۶mnݺ#4P~10k&64ol׮iZjM71M6ZSFCUW]վ}wu]:th$===U} =G&XơW:M ]]gix9(4_9q6CqX/b_x7c KJJ-B鹛jZx(\ խOAY"g6C_c)RxX?#o{]x鯿XJo_fԢoֆ ;91**;hӦ#%::zܹ[nSFx&q+֘MID.믿%rI8p}*1`UTTt%1:o\(RP {ѠHNuF η+**of˲f/ R9X`<H%|:HLV q_<=0CFb7m?Fqgq?| sss277?_ERnMj<SO=UUU~ o>џI`Und1ɷ{)++ZNji'OZ;3_FU)\0 +255?K,XgϞF%W_-Z|UW]{A(0|lٲݻcbb?|RYYyY}nݺkCoIM;6Ky(R' C_F> wSTg^Bt>?C:K.d˖-zYLrLV؇̨E~ 'Hc|] ˇ~gb&Oul`J|!NӸJO0` !:w~?x}mݺiݺu^~?K/^P++XxIe`mަ9HR0K1¯yTQ^0+'e ل&4ݨh*Iq}-B+q_o< =hn(;nފX0>€ @`HF~tV/5aӠp>%T(CXUx*M" ?gPV`1n:q B6V1RTff!4$#`rEPm%"H!=!\$# "~9ZVA1LJR ː/Pd`&,N :u/Ge4DPT'>Ȝ<"P(ZXWoj_q$[bTjQ .!])*)U>ͰPB=,ɔ 'NbZVkII;VVV.^811 v}7wԩUVm6ZVaaQRSS7lؐmZGw^{:thʕfz衇86999ٳ/ⷿ 䟃(rFCG {E0'Bf>}z~f̘s=}jիה)SV\}݋//y}'xBM, BV^^ޞ={ik׮͛7{ܽM6nr^bEn)<!،cH"הPG`4t%ER(ZnbΉÆ B]6o /9Qq׷n:N͋W-"gH150RfbM*? Ql|!D޽? kٲe_~*7[Dv]޵kW.]!JKKv5v/x7|{ozPAh'@zǏ͠.>B;X555Bm~^z)))7nܴi<7x1@5Nq9BT ,t`SJds]wmڴ);;{СB^{ <[iNĔT bbb.wjjj.wsy7tӶmF!XtiJߟf 'eԃOgtݘl%R|GF)GA=`dJ%HLLB:u9Qo߾rBJ@(`=ZQVVxa!ĨQnȐ!N)`YV!Ν; &M~'N!n9Fagq_na?~g}}9sfϞ9t|]]ݑ#G\_};Qv)`Y,e˖رc ***Zbch-[233M6^QQ;VVWWdɒիWk ɇGFaVOPeQ݈#͛e󓒒$%%%$$hϳ+//]j3'Lu]}YAA# Էo &ݻ7666g' ɚkfvG +q,mÈ3բV%rm۶ 0^ھ}{vvڵkٳcǎݿ^:vXQQ+;A94uflnժUaaޙn6fZ,n!_jkk,YҮ];[oM6zҤI֭s)T?{q D ce/K^o|ٳ'==1TRӴ]vm޼mڴi6̙3ůJve>"77QTL>|saÄ-=ƾ}}< MKKB3@ꃕ/ݻsgAAَ=ibll/֟*HJe8 ڵsz.]v],{B~lzPze`DA]Dž*VMMR۶mW}إڵܹs=nI8q9pw.=R%r t-?tҕ+WR{LL>BmmszMM"66V+>k֬xR2pJ%HLLB:u9Qo߾=3III<B>ܯ9BQFI9īz̙K Y XVUsNB!ĤI7/|Ia'N8ydf Z f 4K.}#񪫮:sݻ?ngZj弻n׷iT"''?|眣9sҥK[rÔKxI7*eٲecǎ]z-"***ںuch-[233ǏOIIq޽BOmmKy .wq${キ ?ݡٽ{yZnm.\xo=zi[n=UVmٲE|saÄ<P/ݻsgAAAx;U:!vޥK!DiinA-izPze`D $T jjjz'tm:;ݴk: t00 U}ބZ!DlllXn_AK(8usg߾}  XGB9'>|X1jԨ  XVUsNB!ĤIS&)f4hP.]>#GUW]u̙ݻw~a3ϴjywݮofoqR9D3/cX-[cǎիW)YYYEEE+Vp -ܲeKff?i&+**tu2nĈʲluuuIII 4M:t#<77wժU3fHNN0aB||OH#0wxD@$,1)< MTi`HF dX`HFC %M,FY4)`HF dXh?!yM,FY4hf3 ޷!D޽?iGmڴi饼={?ڵko4gΜ)..~Wڵk'X,'O~gf4My8466fdddff6} MS\\zytС4Mi;w$C_4F֭B >9qذaBkz ڷoߣ>1z= ?O7xDӄEccԩSkjjznݺ5 M=oB!UW]IO !z휨YPP6k7pKbll/Sh0ߟ4MX޽SNwygK4aaX̙#?U?p^.]oC֏v]vuN׻TOU=nG{ !nvO&***͛׿,M.7%\#3sݻw6mڑ#G h0zǦOxwc ǎk.=i O?wΝOjjj&'`^6M|]8qB !99-i`kiz):u޽ᥗ^4GG4f=ϒ /wqDӘw~dX\s(lRB!Ǘ.]|rǔ 4M,\pر#Fhi&,~i{{TTԬYǏ?c 'O&''wѣ7xw߭OEӘ֏bbb^555Bؘo ]#n5koFG"M}ѧ~ن ǭݻ;O:U#h:w 7P\\gWo34 `DbbԩSΉ}:x gIJJ;wK:Mz-ڵkץ^ωҐ!CdAӄCLL>7t'Nпip?'x"***11q۶mEEEEMctX?1zh!DYYsÇF~ϫz̙7} =vر/J_~'M 4HqQt=ꊊWˡi¢bȐ!zJsȭYF4GVU2>7ɤIAo~n'Nݻ4#igyyynnUl"HMMMNN0aB||fw7o^֭m6[]]… \fx}]yzܦX-hټ|8VUUàhl۷?~E]tYf, zVmڴ֭[\\\nݮ޵ksڵ~жmۮ?ԩ~hM>}m۶M>u֎]~߬XBf͟?ᚦjjʔ)V A&_nGuN_nޯ_3g4Qwq۷Oo6ѣ+W5jooj!SXiZWΝ+X~3N>ݩS͛7[,͛77eZJ0p5k֤zTWUUw;vlԨQ[n1cƉ'z뭖"< DGGgee%$$lnȑ#du !zXMլ;.]T'B |% EhΝ;l{gT[B҇~ؿP5o޼oY_ȏ*++M:wnÇn׿ر3_{=?@X"by OpI_sعs+SO=՗^z_WVVs=?v>}'|-u`\qqqovN._wy:tiuGydݺuk߾e˄Ǐ9s&E "JӐ%!!aQQQ|O_3f̄ eɒ%999)GIOOLqΜ9S~_ݧ"P0gs466:w?/// ۵kt9s戟F`~Nnݺ555m۶?Dͦw{ov!CΝH>}:11}y^a,R^^믿vNυnԩ.?7n;/] \/=uoqWw]~EEE .t9nǎg͚%JOO(%:9׬Yovmuuu+W?!xe)M߿_ɓ/q^|||ǎkjj4MKHHꪫo>j(Ջ/~w?/ !jjj>bٲeʧ~*3gرc_/}ׯjvvΝ;G}Tjm.H#B$# @2,$nkf#TIENDB`PKl<fHH-Pictures/1000000000000320000001D04C6FC54B.pngPNG  IHDR  IDATxyx7R(e UAE@+o^APA\PPSx(O@EEMYD,\YbK[ZlMI2~d伓}9sj'"7$X#0 H F`0,` `$X#0 H F`0,` `$X#0 H F`0,` `$X#0 H F`0,` `$X#0 "=X,%V3b)d#g=tG|gݫ}}~_8E`0,i.δ8hw1'ecW6pQ8vebW2v7 3X#0XVjNuzQMW%''-LKؕ \]ؕTඩiJ,ˆ`,<12 lX[}ל4 H|7nܸ`!h]Eؕ \]In8,`,<" i L!!UfG`0,ߩ\jl. ǮlBJR6pÑ` `YmG!*B?ҒB`0,ߩ\jl. ǮlBJR6pÑ` ZvTl--־V~y/L.2YD#=Uor+( IV)[my&XB`𬶣ZWӦz`U"0ׅx#E)B`.V\}-lBJ2&), H72³.Eả/DžGM*B"09,`jxƓw/ ^ؕl#0 ­NC!3l@PPEnUJ3{eZΝۤI8q"؃p O?=vؿoڵOXZ@)~ \]I*>D=|nݺG=zdɒ"rɤC;vsZpyJDUoƍ:.wL]maÆ;ڶdggTVYBe*BG~"tzp L}.WH W#aj꧖Cj\r…۷o?{j-SL5jԢE;֪UKQm۶ݴibŊϟKQF׮]njs 77|Gmݺ̙3"RJ;GGtȑ]>|(,/I< %YJЇa)ڃk-eX֐_ƍorq*?pԩVZU^;vصk233C?7o|鸸8YjvYBTFNrrr>ꫯ+Vf͚Νsʕ+ݻwOHH7ނE>w{!o߾n?x ٳիWoժիW_ݹsc6"Rfͬ,5k6oM4Gf̘QLzږVk>|} }"VŊ/^|ȑaÆ9{mݺp ? ԩSSLYfv(-[]_~UTq#FuÇ/Zr,X "]tqM͚5ě7o>tׯ?z#yڵk{>-*Wm~("={to^D?k??+ p!`2dժU]VPPQ!mݺUD6lþ'O._M .]_3fWhQ׮]ml""M6u #0I7?'XC 55n{۴i~{_/^vYf͙3gv hF/ +I ӿ׋Ⱦ}lۣ 1~K,tݒ5BWb̙3֭{߅RSScǎ?CUV|T:--}8I`:Ztib\͚59ԩSG{jnΝ{w W_پZV}?}u9mcH>Ehṛ֭[Ȯ]&L[jDDݻw^i׮脲_xebW ҮqYn_~"ض?"_]6@@`AQ-ZѣǗ_~i/`*"ozhɒ%v3[dc`A] }7ܰa &ݻ7##gΜYrAԩm,a\\ܷ~[f L2YYYYYY2eJ jժaO0Zw$XPڍ7޸z%K?~O>ʕmР1c|'N,\qGVڦqqq7o{5>>~Ŋ-_:wߩS={,X`eʔq~-O@e,N/,pKfAAQ蕙 vT*Bϳ*BГAz^rح1 U&3ϐ`1sW$XSBؕ \]CD3bKnr$XS!1#eA`W.!M ]YmgGcPgl\ÍZogcЫX6[H2*<4 I,T.*:N;w$ʥƮlp.Į$-C`PUT" g``uX.^3[}mX-$?z>xEy0H)+;$XSD]Eؕ \]I)UI T  !/ss*$Ʒtl9%KgY[6:$[j9K ̀FU'wnMUNCvkM N@9Ø Ʈ^u/nBq-?>O=>u -=|У縱ѺAv'\ Ƈnmw3hwէ? a_as|̘1?zb.)ۘ+( +{=y`ua޽nM-e&J7nߪ=wڏof` nh6WӁtO.hx5lFqO)hnc=qI9wq);vLmwաO"W8sݐwz CCqrumCs/4ǒ+Qsz}u,;ovǷs\\}7tFg!)44%ApNp۷yb@w1~rY,I&թS.\`f &XCW%j͛? JD[.DDիWkND/_ޢE[֫Wϐy]yۭ٘\y}ĉ"&ҥKA%77w]tѲ+޽{bbA0Al(±+XEy`*Uꡇ*tݻ4bŊcǎǶgϞ?͛?u~ʐȗ4ԬYmJ*Cv-[&"v09SOgޭ ~IDn&jժΝ;k8'XQtl:'`ƍga做Mf9drfh7nq)<q㴪?W8/$Kc%}\\t{ }ѕ᫯ \)YdDDDFFmcvvvLLLjN8jG&gBB(txvWp &7|Mv%"=z1cŋ60Ν;רQcҥK.mڴi6m??x`;v̓yA;v!WTTԜ9s>sX"z~ܹ0 ejWIp/**ʐ+H֭[7a„|mۚ6mjHEr5&R6vecW6p!v%\]1u^jZ =*((j Ѳe˕+Wy7jժB7[zu}0/'L;ޭ2eo7ԯ_6С??zh#F & a4zu{RE*s"tm "·ݝ)UCOLL|'7o|5[1YfyyyC5pMR!' ڵYf͚Qbgj\7o^2e3` Ny}﫯ҖX={ȑ#NҲe˖uOȕZHؕ \]MsN!xHfIIIԩS[jUti)]tVLrȑ]=HCd`exƦiGNʔ) / Ǝ\x3yj911={*Bɹ*kgމmaxC*<"wGϻ;$U6mzby#0>-Zdx )NpSN=#իWVO>m _ݸʥƮlp.Į$f"6mooٲeϞ=Umַo߳gFGGᇆC] ٳSSSϟvʕ3g9sf֬YVj۶ٳgVO#/fLca[3߶mۿO=2q+VԪU?VZ-YB +TL*B7كU-rAWoȓSh'A"LII߿mСCwܩeW?~ x(û+&&&>>޶B j*V;/^\k?vac)%XJrlTˇn{ sɒ%E)[c" Ǯlp.f@RC7w VjjjFF]clllVҥK_}@IfKBTwitR\\c{͚5 0qayfbDFF.]MAjzjnnn"cmPEaE'[MW"ne˖6lq׃~,B?f}̝;r5:mڴO>[nF  x` jPw*`mhѢM6= *T]M7׹s׋|_4Q_ ecW6p!v%)ἾaVjժiO/\pȑӧOkƉ{e0S%_nܲe˃Μ9}%F4h /iWNð"0 T.P6vecW6p!v%)H *6Vz2Z"tڕvTD`0,ߩ\jl. ǮlBJ*z\t^C`0,SJAvTBUZ}D! "`3y$XSD]Eؕ \]In8,c`,<"KT )g T.P6vecW6p!v|E*W:eR5Ʈlp.Į$e7),ktC >}zjk׮|3EFff!C&O\V-1???999 (BqL]mݭ[sfWVرc>?jGů~Tuzaׯ_/"m4hPpPS'XK. f5Xfr+( +I G`0,gUB"d `$XBnw*Z(±+ p$X_=,gU ת?@E$X#ʥƮlp.Į$e7\d/_gjYP[(. =UMȫVxVQE@E`0,ߩ\jl. ǮlBJR6pÑ` `YmG!*Bѫ`&c#ʥƮlp.Į$e7 H vT괲A~*BE!ɑ`w*Z(±+ p$X#0XxVQE@E`0,ߩ\jl. ǮlBJR6pE{buX*C&XUWۦ '[YmG!i?J*B#0 T.P6vecW6p!v%)HiU``,<" T `$XSBؕ \]ؕl#0 0P^CxVQE@@i$X#ʥƮlp.Į$e7 H vTf"P 6or+( +I-6 <M5X T+lg%<" PE4,`NR ;Ʈlp.Į$e7 H vTf"P H|r+( +I G`0,gUb U"0 T.P6vecW6p!v%)B,z˕+QJ ͛{j?[nv튎x" PEh#FL81:::(Dh$X .Zj۶m=E{;qٳ׮]^Ůj<x$1%`斗=MHHHHH(tĕw1'ecW6p±+ؕds}7;t]Kݺuyŋ@H0Eu뭷ڵX]vm۶J*k -Zb|0ӵf͚5;@^{ܸq㠎J-Tl. ǮlBJR6pÙb˩%K֭[K3X$ĪW*BUB̏S#ʥƮlp.Į$e7  ~Z<0U^Jl. ǮlBJNFa `$X#0 v}^DEyweEl^wؕ ұQ:,`,};+{H Ӿ}{[RSSE^z܌+W\RRRzzo=YþrJ֭ccc]m[]|ڵIII'Nԭ[WD atׯ_kءCoP >};+{X壔9wޢN޽{ʕ+/]4... #FL81::: Λ7dɒjժ"qƠ/VXqر>}6~ڼysFDJ}nS""#Gk-K.sXCeffΚ5K VZm۶H<+Vm뮻D$"" ,[LDmo6PWjՆ z}8}Ʈ zo|ѱGӧOoӦʕ+v>|^xW=4/RRRn;3c 'N̞={ڵH@uѮի"-w 3?tMժU;wgL:sLvvۇӧm06p"aM4ٴiSʕڵk2￟4iRbł=4OERJ>h bbbZne˖`+xw}xKiSO=ɓvqٲeEԩSAH͟zw͚5/CM:T hgϞ۷?~cǎ۷onʔ);wW^|3g߿v=egg;)Z1" Oߑ?*7 V^ݯ_;v7b̝;O>yyyߝ?DO?6]רQ)S?>Cy۶mÇ@o婩f @TRJϧ`\ӷO ?:tȮE[ʚ5ku7iҤI&v[>}V\o=ڟ#5GFF,Ydh.]Dd֭xxVV3}ذa kԨqرN2eJ.!Wڵk۶mUTq|I?hÇ_hQʕ0.S;WZUoV_~vQPP?[˔)?-QQQ~Qb"~a{>H_ӧoذa.]2xdmmڴ9|ѣGk׮[F O^ެY5ji֮6$$xkӇ 2}tۉk׮(Q"J.]Νgk"ҭ[w.229KM~E= 2O5h@D٣Hƍ6@y/tk׮;x%Ku= -33sȐ!'OUޘ~&ܹs5+.]ڴi6mkTΧoKz5,kw}K/zꘘ:uԘ'{h~׼yÇ_ի7or-cƌ /={>>..#GN:cǎZKNNz۷ >#mzKDZl5VRnݺu֭SNZw ԑ`"*@ho:uG;::ZD,~g>Gݽ{wFDҥKʕzj%NRSS˗//"ŋ*UFVQF˗/-[Vk?|pݺuE$''x999F:x z3XB۵k CiٕڵkZ 7 "qqqzv%"ʕe^~]raÆHmw=:uNjmv%"%Jx׊E +VpM>}E]EKKKs75jݎo\\?^HQ8'XVuܹM4JHH0`'9qİaz=hР6m$%%_io?bꫯ;vܹ ԧOÇm?cƌ~=#͛7=zիW … O=TJ+VVI&y~XoޡC/g/M)4.<ˇ3}yFHhݺu޽؉l۶m-O'uԩcǎ۷o 駟NOO^:p = X+UԻw;jʗ/oڵL2&L(((Z?,\бg}6>>>''jnٲ%&&fƍK˖-OII7.((0`@>}Vkzzzbbb&MҊӧ6l//X 99L2"2rHOիW{9myEYi&S["Rtis/ׯ_ߐ*##CD~a0n>|'ERJٶ2dڴiV5!!7Ç뾅 ԅmvڤL'U зi߾ddd-"R^=*UcYׯ|}ݠC~{ɒ%"m6}oVDFQĞyCu[tB'L0aW{|Ywʕ֭[I\<˷Ϝ9cTof͚el$Xn62GFDDȜ9s.\PBH$Xϟ8pɓ  w_ժU *ѣGtV]o7nuY/BD>3 yQbŊiRҥK(Qʕ+>i&W bcc=:(Vk~~?-Ej>C6mJHHߓ#ȓ|"yFJJJLL}DEWjjԩ@[Ǐ=Z{&rD(+l`=+Vm뮻DDF9rvҥKEdv}7xw-"˖-D n6%پ}{ҥmK+Vnݜ͛7sddd۶mm_MMM9rD·U.\XjUN41p=zo_|QD>b Ξ={3Y|]ڮ+((Xnwܡ=^nĉ+VXx^z6ǏVic8wرc~HIJJJJJۏ;6dȐWXiӦK,_JKK{ɓ'iFD 7Bt AZhQPP.-| PN;s?W\YD֭{Akٲe4&&&66nmA?XJ_mի;(=v}}Y,޽?M'OoVoKJJו;&Xس'{yul9ӧOk%K8p'|gϞAH׮]f͚{>"K/i{?~\裏DTR<ȇ~qnݺ͵VU`;$ǿٻvjٲVkNNν+"z͗\pA{[n <,=Zvn޼aÆ{_<*((C}wl߾}{TTs8p*Ulٲvh'˕+=}DW_FcVsϚ 6<6O?yr)իW/Zvf^1c10.=#fAvΜ9JYYYZEQF^W\Ѿ?zvm؋/j-OoB;nܸ 6Ԟj?ptҤI~|H DD4iDDW~=nyw5uTcTI-[ְ՗IDATatUVժUkƍӮصk\}k׮.]jqqquڬIյ㣢͛}JիWg;)))7ttCX{޹sg.]lOE9&X>^lu}ڵ?-ZV|y۽K{{Տ6&X;wSڵU.[L;Qp 6> E .ڵkmԮnw;裏 K$B ɓ'[lXH_+VL/ꫯ[mL2E/۷- 6[u9iݺޒr,Y2::}֭Ӫ$h2=<-L`'{ֳȇ~ MfϞ-"?:TjU-'ԩmyam1**9m9fddkF?ޒ[F RYYYEmgsrrYLsǛoYx/°"]|y-ZzWQ"ҹsӧȼym>Ӛ5k~zwQPPvu)ݬ^zV̼v7|ޯ_?mY}QzӡChWEQhϻvڶm[*U,6.]t%?(^Dѣ6SΞ={_7nX{ ܞ={ӦMӮ׭[iӦ;v_z_{K.Hdd /'//oՃE_~3fٳg[[Tw7֮]Aջ馛ʖ-)wp Ͽzu1Ƭ,IkдUPA{Qd1c<\Ҷ>KI]v-,Y?=[ŋ-qC<(̃X[[\[VS`9c?N:ٍׯZ6lZߢE UV!xöyyyG,J'.^("{tѢE"b[@dZ_^F6w}M6uzaÆ>VK O=Y>ssa#f׳'{yY˷5XQQQ%J9&US?ڕfΜosŮ];wjnZQQQ)%ڵksOÆ ֭[:1&&]v߰1c)W֭zÆ ;vОZTRvrFnnȑ####?vzxb\\\ӦMWZs:u,XâM9^ÞO>.q3?tf#gO矅  \mYE$66Vrrr`AAVpuE[.mۏv2eؾ]VDd|ɨQ4L<ĉ-[ӧXBIۺu~РA*U&K6\|922$p6ٳSї.]7_zݨQ~uܹo߾ҕ+W/[v{ᇻu_fMbbbVs^^O<`X5j4p]ӕW.Xwqx饗-Z第ƍW^ԩSթgGUυgq]sNW"2iҤ#G߿Zs=/߿Ȑ!Z˔)S8p1"2zݻw;vZ&NxСC=⋧O_~[/=---11^ڶmfʕ9s4hPXݻ޽[!!!!**jcǎm߾ѣmq _a;w~*THJJjԨQ{%!!A;#e#, 7ܠ) #/8vС`"8!*?IENDB`PKl<pcY66-Pictures/1000000000000320000001D0B3231DCF.pngPNG  IHDR  IDATx\TUs DAߔH'ŲpERVZl퇚Z~YkV 45 qS+ LĖL,&|ߝfѣ̹sϹWl vdC @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,tF @g,y(dt<K#ͦ(JK0͚VHc/u;c\0:_t:!X:` T@39G'4aFtF @g,-ZM<~ 3Xe iu,$xbo789G'7X:c5"@&"u,$9G'7X:c5\㪪/_.HNN+^e!2=HcI$33󩧞JKKv[pYEEŘ1cfϞM-]4""bҤIn>Xx@?CͶv޽{_veڵ?~|EE ;?cYYYJJJaaaaagϞFa59rO>&Ijժy9sƩ "N: !DZ;QQQ{.))Ql={n SRRzu߾}'O̴)Ռ3V^nqm~ GZ,  QQQVسgϘ1c󓓓a>Gy_͛fr*`?~|ݺuQQQMS2eJZZcǎMJJ.,,TEOY|$\ gZ˝^ڸqcffo=a{+f̘sN{jŜN FXE،&͛7 ! /rK54ܗ˅"!Dllca\\bi'O;FFF !JKK(b ңjt%PKΝ; W w*ByE@B"B(*K/õӧO_tEW]uݻ?gСCVkYYc:jȐ!^j4! 8 HOONt+`:&&&9[(!=:Hfdv!dZjUNNzC,!D~~޽{W^Y%//O;wA222o͐,YK.555f !!{a5"@&"u,$9G'7X:c5"@&"u,$9G'7X:c5"@&"u,$9G'7X:c5"@&"u,$9G'7X:c5"@&"u,$9G'7X:c5"@&"u,$9G'7X:c5"@&"u,$9G'7 o7-߱cG۷Gԩ('ӧ4bY` /h={3&???99Y6O>߿uӫ?n:!… ˝*o999ѣGBEQtUĿVc?pS;X8nܸ?X:n逥 h7oB$%%9^~t&,qqqB[ljҀ~us_>ݵ'O;FFF !JKK9Xn3GRB-9wudp40""BQJݻ8qB:N1_oX ՜ΠұjZ YSC ѷ҄t,bnܸQC 4(## O=T.]jjjf?t(XELtf'(hA@&ܦ$9G'7-"ԩ5;|gih5jԨ-[Ç(p& ~饗(] !DF%`i&CKz5UUUa/ Op {k pX O" ,$9G'7Κ X}bTWW?3yyynQ3_8qd2MQL|q{ΝNKnÇgggm0%%ۭCڵkڵk:Ž;;wlیb~!oE7,PQ!9MX,555 "n-R7W` 6` p[|"`_Yրe 4'nлw'N!/++ꪫtl+4v@bsHNn8A7n\] 袋4 `M:͚`h]qfZs7>1 .huȑ޽{Sѣ\rSޥlhRFnbf͚KSsƍ=SxlB{!Yx?=iMNjeBvjODz#y??iӦ{[no?oݺ(b !***Ν;hР`o7 )Y#xKqqq [tR_~-r-niQEAqsf#9xcf\m*BL2a ?]? .u,M/"6'w*6Z տw 4IߐF=.5T3ұxK;v?~ĉGNؒL_"lWעËGK`P`"4DXPP~իWwnʺ+moz͟/;pݍ\ìa2ZOÇ?sw^~o/vuĉYYYC 1rB7X+94 L?p7o6=zP֥^*kb!zz۶mׯ~>}deeIy͘b|:`Y,{o~MM:oYtfȴow=}'I98i~pz'Ftc07-7n8~xwjvQ91c1--6lXLLlfW'-7)>7 ʚ>}ad]*sOb ~UW͞={Ϟ=oFΝO~뭷FFF,GQ,DZb=#{wW\YPPpM7M6m0E6HZ@UjBL۷:t /;v/_?D O$綛l,QswrYsK.g9uԂ 6m?y޽ .HZhYEؔΝ;VWWoƨQ>#O~qbux>Wkkksrr׿:tH-߿>x뭷9X|Ӷ |b7|ӯ_?uY:g>>ݿٵ\"|wĉ^xaժUE8q|p:MS 䵋/}{M6sXhkŬ=-hr,$f :֏?? !u6s;SC: 9*:l9f) ,@w裏r-&IڀUl4f5(i1b< C0%Bh'X76'Vnٲ%--MF \htFıFB[4˝)\u7"ijg͚avi ĪoRlL/ jt~j.^G'7-ϟ?]l6[MMsNkjͣcr8t 恡 h X?fkэKJJ4\ '0{r s| '\rQQo`*++륙,5lh2s}s1I2(M(!`L I†n75ԅ˦"Jo;-2i445\\L#3 ~Ҳ9uGw^u œ;2}ODsꝒSMcLnhlH^Tſ!` 9TVs d.;: _9;R<I4Q:RDxbXAzsH:H4u{0 ^yt*oFK\hBhĜJ\$\l^wiעm<[iطoߣ>کS'EQ,O<ѧO]rȅ߱chLSi]wW_}խ[l͛III_~%{U'!=:hk׮>_׵^h[8pǎGvEEEBX!ߚY Z.ZHݰ5 ;illxeG=SUUvZϟ? .X,աqqqZzdu4s/^lXtfr~ȑ}&M:t; ر?XhZ;ut{Ȓ,,^ZZzW4[meeen3<<ީV֚@3-+<<<$$j'x┄*++KiKۑ4ڵkfP7k:j:x ! ҚY\?CztrΜ9SUUl5|i7&8xcKۑ4#""tij 񹹹jAAAr4<^Ga2ܢaaaSܺukxxno !ڵkw9rJձcf/tfҐFm۶fM8æ|K,ҥKMMl.((HHHW8p`tttbb㩛:%//O誨;wA222Ԙ>-w}X|_wj\r-o>X'fBH'sHNn8=Ϝ9O?/˫=zc=ֵkW \qTF9wܛo966VO?]}jݺu+**袋tl`29XBݻsQӕj*.. ֯__]]}Ѿ}.ZHǶ>hԨQW^yeڴiB[p jٳgN8SS}#X'FڷolٳB̘1Þ:thu *,0-Wo>f̘ !7mڤެAUVV|)*1 kfӦM}l^xܹssrrj_~GѱFH'ݻO>{ر` r{&M4tP)ӕ~ g̳|l-[L:̙38w1 `Vmmo1xrݏt<ٳgW\L>#Xw}wll?\VV>mڴ͛7_s5~ U#X6>znj/|饗n E^{mРAG޺ukhhw]\\,뮻t%2en-0-s{+V>}Zѵk3fL>=**J:?5kDصk.]>}zʔ)/rpp 0:-oڵl6:W^9w-0(sEy睼cǎ%&&Ο?ԩS69G'7ަ!..nҥի׸q[l9믿> f@IDATںuK/ #?lٲW^yVv"@&{0(|w7pzs,l׳gϧ~sM XBczh Op< @gLւI'E/_.HNN+`$Fdff>Siiin 0`93fٳHW,}jkkM&bժU;sS521ҳBqЩS'!D]]RRR@KATTT޽KJJ/ӻk%!=:H SRRzu߾}'O̴F͘1cvAAwܡs[ QŲ`^x!** {3fL~~~rrw6l'|ҿFs=<<믿Λ7sR2dǏ[Npr uuu>b;yK;СCVkYYc:jȐ!^j+--MqA!ӽӦ9G'7Vjjj|||nncannnbbȑ#* 7lB8MRLUV7Bݻw՚WY,܍7 !zAedd8ݚ੧ҥKMMl~Zs^V EXȄ4:Xx@?C @gLւIȄI3Xx@?C @gӂUȄU3Xx@?C @gӂUȄU3Xx@?C @gӂUȄU3Xx@?C @gӂUȄU3Xx@?C @gs/XCcbb,YTUDo %E **u5љ!fO~xŸmܸ133ߞ0apŊ3fعs^SVk```tttyyg xqѥ[ɏ6!m޼YXx_r- ?wH ɸҭGɐqqqB{MOXXtɰ`H!Dii >eHNDŽjɹs"go,,C w*ByEXXoXUVV^HO~c!`СCVkYYcz ~Ȑ!^j7! !eH񹹹#GTW @ `dZjUNNz[!D~~޽{W^(Z3uԔ~iw,h8Y0:3$K@>`ɒ%]t1 NLL Z,<@s4hPFFFå3C2tf?;x!θD3X:#`茀3X:#`茀3X:#`茀30bɤ((ݺu۷o߾}ӳgv)r{>M}233Yf !-[6|pws)))Q+̙3O>#FXlYfΜyW+ҩS'J6 %%%}B֚L&{yMMͬY?{uDDDTTT(b/}tQᘮ!!!O>e$c\!֭[ja[aaah&!XR```۷;ڸ1rP#SR4O#` YYYn膀|;v,..^xСCn-$$䮻R_Mr<877Pcƌʚ4iҤI֭[7|pǏ?ۧO^p: Mf{綾^ZWW_|!!!Ǐt:?)+++--+x7oVtt(Yƍ3LWn٬gdddfffffOQ]VWW?bS__ĉ+bjg}v !̙t#Fl?|ĈOl555^{bƍ-\gϞyyyBh{::8} 8ɓ'_}U!Dxx5kܹ3==]1c ǃ̟?K.*!oa^{5!ȑ#\ow9ٽn:u_~Blٲp @Q@Cejkk|6l6WUUY.lڵj[lB$$$?ڵ)o4L N%Nٳ?^V^^:uJѫW/]%o*5|7 F\u N{m۶;=e!ԩS?7@scǎ%%%9,ͦ`9߿QYYiƎ(bq:NVgixTTSSx^dž=BiӦ? V;]~~[n-;k{^t45BO?᧘z={DDD͞v ! ‚ 6mڴkמ9sFaÆ6^WQQqw !V^^'//GιsGmBEEŹsKx5{7RYYYQQTӧWWWKB7vm9<?0}tuxYppxOC_|B]_~Q޹s纺-:h,o {oϜ9d2Xoܹ^آfҶm^}xbߩoBvK?kԨQ۶mSG}TgϞ^vocLL̤I~駉'N:.R~qp͚5۷W O<ON BϮ !˟x S몫z/bb/BVZ3Ϩw.u}W !LnݺYfӏz)-\Em[ddEѡC{IEEEEQF}>[ou~ĉ]oZ-=sL]~G!DHH)EJ,X:&A^y啱cǪkYl:;޽{333jӧOw?j]j۷o?v8G%&&=#kÔ_/88xĉIII=PAA=˱c>m=XqqqqqՒ9s:uJY^^~]wuYQ>}w y6]V\?yoV}o}gjՌ6mΝju]7~Ǐ;V]@(!(B_p5׼K\r;w}/8|p@@Jſ!`S}}ФiӦ͛7E{UVV{I68 7 nذAa6KKKݜO?m׮([{}}lvyyE}q+b٘:iҤ;vcZM4i֬Y~Ot%I|w,½>;}^ǝ>pNEǩHS4kڵBX~eݲe:v8tP;uI41' l B8pN裏>&=nP5L3f̐]`ƌZF4ҟ?ÿ̘1C ցX#iB7y0sL@41a0,O:ЅF1117ߔ%ϟ8w_54Eׂ&}||j5-eeeV.3gNbb핆!DPPhXYY) l誃[ξh"M`EDD ZX\]UWYY?>|M|3M"B!D믿 ,\p… ޽{u.hq7&.\x;:$HNN}=zVc=r{NUidMĈ$scVVVLL̐!CFҥKw>x`!D@@@dddwkvn@+[nMIIٶm<'3f̘*&&F>aw}ŋ뽉EHq)ͨM&F 7o~۵kWQQQRRm>W^!!!111N<9 hVFIYJ5,Fp3ѨwR1YN 2KE Wvd7,#`LBgwPEuƪ?E+:WKa@,І"QEu&c3w`L*B@x!K"`*NoyC UZGP PEU.2;A pTh @e: XU'37dAx~GÕgeP=ct ~"ldpwTh @e,C!gPLwA@i5`pTh @e,b!===--K~o۷ܹ/\]]퀮6@ v?^dɸq[̙3ÇoժܹsMv~ʔ)=QEcFUUUM0!)))>>^nIIIMOO߷o_C/3gʕ+w.8tп .|7mzib+;;ĉiiiyyy;vѣGӕ">>>00C&ڵk3.//CZ;wMn)B@ m"## ***|||̍EEE:tvjjj~Ν;?3 M){d2g̘!l@Z)M?2Wqp>9shH+ `0X6:u:u>jԨW_}wϷe ŋ  `[]䖲2nݺuɒ%999lx!!Drr1L5557pk*ֳsXYYYYYY111C 4/5Pw͛Mf[AX ,˓[rrrvڵpBU W\B\pe˖}ɑzO>䦛nr"1^x-6o/k׮$777::|B^BBBbbb|}}ZWZӹsm۶oy@,!?쳆~}y󏞞~~萮4&vrw0nZM;;!`a*t@w"LU\sYRpWJօ TPf~ذaׯ #GK#V ة܏*BIU{nRBDEE)xHW9;LJ>4D͕L*臃L422 T`k *--Up*B@ $`ol WP"QHiVTF;Tz*BXH2?`0ϙ3';;pU'O?~9sZn-طo]*B`ɡU>`HHHAAAqqw9yǏ 脵w~כ6m֭bĈ K,tT\-ZyGFFF~~C1=s~;zIѣ}||<<(?TtIZXIڲejjj,瞕+Wڹcښ믿>$$dرwygxx#eWR߮~y@4 6? y_~Eg;*gw8ɂ7iW_Xb͚5={;vѣ۶mzoÉ`@e9lذ9sfʔ)*v*B@ `mG5jԨr;uaͤp???u68?~k׮1ϳ{2F5X֦UVVs=b?܆6iҤߺ`K";wJJJLJ3翋wʕ%IJIIg\X#Uaaaڡ3@Z6TVV._<44444GͼX,9g'wt钓c}Qgdd-[U^f_ur#8hѢ-[XK.Ϳ?*B@Ϝ_Eh={~w&L(,,yRWͿ?kQ!` !ZjhѢ?w۷oW.GUSS#5KOO?ya˗/7 ]p=3HT Kz7xyZÜ|_~|%-.ro۶mFFƦM-z#GӛsBھ}ҥKoVZ-^x۶mͿ?)B@\Њx@7|3ϟ.MIZjՕ+W=rahS9SسgO-Zha`0TTT(R/^T+AanN{lVVV͛קO=zAfTk2gXbӦM߿42Uq b`Z+((讻ZnٳgqF!`o z*B_ܪU+piJK/tջs3 bҔÇw%==}Ϟ=*NX߿?11qiii^b2.\اOooqƝ:uJ8 E)B@ϴ;Ex7fffm655w~ܹ3>>dɒq 8￷~c=6mڴ]_|O?S4\;=M$`;699_/,,>}u:v옞l@j„ IIIrKJJJlllzzn޼Ǐ_jՖ-[;oM6MA4B\裏iii[loڔ^z;/^l O8f٘cǎZlْ%K}]!Ķmۚy4 PSiw]Ι3ӦM[fMhh}ݷk.֮]+lׯW{:˖oQa'BN]d,\i۶yy'|' 6/l¼tҿwyǼ3_ɓ'r-鹼>>>B2;w}t`oJg}֣G'OΛ7oȓ1c~}6AAAFVcee"00ƛ[ܹsVliCS%z!Ct6 O?O? ҕ"""`0XJFΙ3gӦM :}lȼ 9@֯믿 !:vO<-[lN'ۢ; o/>˗/СCs ;tiɒ%?ɓIIIBÇ[6:tHlڒ|߶rJMMM3{5޲eUUUխ[aÆ-Z8jԨg>>FZfyYQQQ||c4.BxbT 4RE8bĈ5kDFFLkg4+Vرc*v~0xr^Blڴiݺu޽{nZj/FF[f͚5nܸ8 +t; " YP),`az-@_%3Lׯ8w=_XUYY'799@^.\?{WTTm\:#X{ %Kg6lG?&LP.BɚYfgϞBtaҤI'NlӦ"|{S=("СCvΞ=;a„?G:%SÇo^RRG3CkIDAT`؃5X$ :tժU'NyN>n"1ݦ!<<|هҥKjjbo?vը߿;v|'Oްa|\]~駹s~G,*4W ˌ?@\]B믿;zhq-Ku^ɎKb+&I$INg3PE@S.Be^\tzƲUGa])zUzFB0" UƻP~˺跊U nQEu,i(`߿?11qiii_o߾ ;3|h];w9rdNNN||bݺuܽ{wTT ôi͛צMGt}[a VUUՄ t%HIIMOO짟~z뭷ڴiå@4QEz괴wyߟ4iҶm̩!555!!!ϟqT6 @ܳpڵBX~e&>LkaaaB㉒$ !$L&y՛nnpp=fΜ)ES?<<ԩSA$ tbƌ/\zS7{Nj[ʜ#4FcJ!D``3zSN .O+""`0XJ,P󃀞9@+..ȲPѿ{FF&IdzUK `V+lDMyCz{3UBX@ЈZA,E!aU]1p3TqR(tm!OZIWd/BHLa2HWVƨ" `StH5a;V4`؏N`SeXA!YBBP PE"pI,(פeX,"T-})<hUp1޺8@8KUo9˨7xTzF!\@v(=< @5X5hci! g/B$)*Z,gHN3{i"WDp9a@,8KDTzF!K"`i+=QEgbXp>2*B@Ϩ".k1 6Xp>&srv_P"2 G!XWG0Wp,hS7=XFv.JtT * z6cԐ?Et]  `'y@ T !WsaVj>`AX{3?cQ"w~jWgXy*B\8I  Xnʌ! Tg`%0?!Rb3|t,+𕜱8#XpOHX+l(7Lc;dL]k )0*B@Ϩ"Tf)Q,KݽlI.i~V+=.$}|X}8J"f+BHӀO hْXئA,4V1 \K,4J f^X1cn z6`;PVv|"XYM<EeL‘TF͙F}U2]a Xp -[ VAܒr[X?SOvuo9mPE@[TOu\T9ex#s^fhh 5[9]LVJ;kmSo`䯩`IeL(eyM\Y|KG4kjۿ̙3I /ܽ{w+:4DE{}[aqΝ;G/Xn]zzݻ\Er=Ep.""" CU\\,p Xqqq555EEEB;Sl|xIIɾ}$Irb8ƞ={[:#~O/BHHk`)'NY6رYHՙ3gvwO6gC'8 "`]Vkد_?#GdggϚ5cǎ]tyg~gw }yx4r taaaB8O0`?8gΜȍ7:_@k<<< ecyyxxS1v>W_---ݻwo>})"IRk t1U^^SQn)++sF85\3uԃvСbڴi'p@0E 2+++g_2opsΕ1XYYYYYY111C qV8d:zhIIe X. 233}/999vZp!_ƚe˖}999]vuv؋Uu ]%}W۵kWQQQRRK/EGG;S쮢'Xf͹st9`o 3 YYYWB<3}=zt tCSDP @e,TFP @e,TFP @e,TF{{{K$IRǎ######w޹sg???IF>jKKK{''O,;wAnݺM2@>`ʔ)ݻw;xs6'|':t$I\s}?odrvH!DeebG/;$E.]$XVVֲe9,,%?sNm˗BBBΟ?Nut޽UVBt%}W)W"ZhBѱcǺˍMJWBftMXTYo{pp<θ9r ^2~Xaر8 }-[l֭g̘wʕ{?>C ۷۷oVVV[eee9rرƍ7nܧ~:h W?O?m^}^xA^^& =b˖-=X޽^z~ŵniӦnmرIII Xlb!!!$W秦z{{/\FGEE=:-----G$uСO'$$$[h4{d曅W6^ܹsaacvv"$$|BUUU-[yBoѢE۶mKNNBL4&=\׮]O:%xM7 !>ɴd!Đ!C,ϟ?oOW I{ﭪP!m|FNudBHߚLҚҥKͧ_^-}ZynJR+4j!D``ӧO !tR뒜s˅o+9=z|°akOg=`YQ몍7'L ȰqBZĉd2#X-h(@LI C4)`5wՒUQQa\ˎBzH̙3555Vr`!:vxҥ&]@`/;wk4СCB={)عsg-@OiB}X6Zv졇jѢҥKϝ;'Xrezzk.] !.\(ϓp0뮻 b2!:ҥKeeeb>ƛ_tZh1q>@z{キ9OT੧:sĉEf|||jվ}{!\go۶mUUhѧ"""ޛܹ|Ox{{Gm۶^ۤn7ƍ/^!OV !LWp+LMװa|||6n(.\0~h!ٳ75/A^^\\\ZZj-Og;SNݻwqҥ?qocƌȰP+Rd\hQpp?+8=xБr///!ŋ& 4/tM7=S۷7?n ̙3G޹JnA1a„O?tW_}ռ}kݺAѲeKs˥KW.J4|РAsOe'OСy~?s^믿 !|}}-.+1mڴu,r슀@}QJJ]F1wZuv]vɧM8r 3888%%СC~111^^^?˗름?=z3fLqqqll3<[]]SN8O}5kV~~~~~ĉ)S>}Z>?p۶m%I޽[+,F=uTu?o6s3g? ~xׇ*v׿L&Ӷm[noSRRK25}0@z `Ĉ|A׮]m9E:  wӕ  K2B.]CM:IW۩K{<9SYYrJ!DIIIaa={IԺu/Mh4fG ={,  !<==׬Y??$==oMJJ={{iX*c@eDP%eIENDB`PKl< content.xml]KFHh0F]HJv5cL X,,2%&OsؽK6"%Rհ%2EDFol[zɜˎܓ:::3LgyMwÛ-Ng6uΜ%geg93?s4@1:QY%U;olgl=7N6N&kGn:/+SuJRRC'HquJtG@ !HOIzsRG^mE]ZVRsffԓBpy]$M2 ;I :̡s~`AsAʢ;?Z#J9ie/-Yvf$F" BU*F(=e4uUI9D0?5Hi?zӡ/iXgIܪ]~-舜WJ^V˯|O sc0^v|!^`ǻǒ(.PXW?zVj^ԻMN!XٚUìML"95g^<~] M.{yWba t2ϩi(xVd~ln T{OpWYD/R9Ugt5W]m^uQYD65.V6K(gJ/Ӭ'okCr_GW|Yn^>KcI.?f 88KcIV[I 5ۢ D\ksu'Vm:?$RoyХW m<-(6/`k+S3{`u!O!;v?ŮBMhݣbJjX8@M,N ^|jXMh.$zMVM||m*vGU% i581š/0&>3?,DϟUZزjn%f~>Z܊|Srg;6ےxaLl âbTL*͓wO0exR6D.sэ6>rkGHY~f̹ fxg<oH$: 3p5 w/?孡c V<ώCDi@ di¡fIlnN+낤z!M4x$.yH|[z::ٶƟތh1k:.DiXJ\M7-lf~T^Awsݦ4HOEJrssٛMbkӥbKm"Zمu)oSW^i`Gj,q5oy3<L„ vcvl_?bO̞Pz1o^e#?L?"O멿̧çgӠ]6a4<>g?ۤt'`'O6M;4=>O6 Q8%n ݕs~ϡICs~OOCs~ϡICs~OOCC@ oKG/]ig@m'5$~̳˳/quA}s>E?nS 0}^lPþx>x} G1lxܘˍ&e9KXs)0OhC9yťQ-cz%l/=LGC^^G/ƣ$S|_c R'$=@@*|fbЛ!ܼm@n[ZvX|S!-Qd5D% m,öe%G|]hQrD^~GV]\v~0`Q/K?E+ϥ|8nz.^U7蚿"E 6K В9&6~'iU B'hW_m`xƞfp+9i+m3#?~ $>-= P-ы(_MyW,`\{٣wIz!> B2܈ަRJc$4v!@8 ‚@XKCXe s%ocFލp1%A Vz=\&riչ˰s&29P@q. <^#ўMT7Jt#$`iOaSe]< s?FG\Orjrx4ܠ2+ Q@߃m`Ě(bJqFGh,6! K-\VYMjw7תv~< M̓e h# Y.@f_1xދGTJme.j)1uD̠ +bK7r"Msؓ໺N7j Q| tX<@_֛|J͟ yѧ9jO8FY>C尥S>`~M|sIWP6Fx *c\WO  u#p8L\ߛ>ՙc@Ḳ,WāėKEW;q] zSI8 Ăgؕz2$WT#CQizs=q+8n I4vp&zFA3K@Mܞȷnogwwb3I@(:i ` )1N%K?IY{T|N9,'a9gK?&j-O`*FM"1,ؔ,0Ce%Cw,uX9 LB+ ]pK   G0넝f6 Ҹt|$mO4IJ7*؀HڀL<ƈokoq} 0(B90t!2HהX+~7f73fS'4 <`R)807W pXid@r5i*ƣ4t_"u8h9SX v ہ2,4h^#o)5n&>m5CA[sx،S!Eoڧ‰ig>$( "6m?®p5sb1#5&X<\z3Uhr\XAjoe eZoQCC1ICg2RX F"窃#F~VBӘ:DR8#ZNr'[G}x)?ذfN.՗moKBTMGapU&:|A{b#X5 R.HuB||aJtp va>WfH{bܐ }<`I#A݂{!*V"'+{W(͢Dˣf9ei*zT[ne=UĖLQ4D\o/ „ʂF+嗣t94'I-L(պcf c9ؽ2 9Oxy}RKyĄ*D_7$c L7}=LF[;Fɴ02v7/ha{ĬG-Zy zE͝nbbaq+݇A1~*`x# xf0Uf^e.(+kWda_MzQ7^@D8-obBxY˵x0;8 K׏y% {H;y5XA6X9o>/^s.3X"ƫP$HKDZQ-JmNc&W\`F v&lh'GA&DA` >!|"q dwA| M<鮀RS%F@uKDm8q\M ?c:_KTIuZNaOUjU;&cO(D2 >ͷa><|xLJgvE- GI 4 +'< I< *ʖHi@{nD$+u)ɪ USWnh% hUѮz7FWZJ>%lUJ! HO.d(^I Q#O\.WuM[FNM?)f6Q|nBT8J'F>#dN,inb:̫vН74+C;+MNT`&' s;@`ѭAɷ݉ϟ̵a*3ģAx( yWlM}/R4_&^z^u՜3Rb}m%X:檒\.Vn'"EO𫜅@ǢV)VP&F6 hPyp}'@ܕv|H)T(bwi'!`=%tm hhggjրy6uRXZTʖ[+Pٶfq/p*cI#wBuORtOXI+|2'`_\,KڹͅK .:UUeʷəf.xSk 1mtgi_SYUʶ_z> \C6F-F5fֈ0&ȳy[C_}P䕓|b mEXUGXAw1l,<- K=Jz?w%D 3I"?ɥyqZ{WeYF!Q_3IHq_M޶nbƇ31}&&tFoPKAPKl< layout-cacheuMJALDE$zqx^@PDҥZ+HxW S m۲q\ BMu]@E()]E 8xRơ)dp@4D)hQMQ|˿M|Cʝ TԦ=+9;Euh 5\Xq]E #hz5'UtiބZ,So~oT(=i)ZYj$< iEj_U9}qp5A6oPKQPKl< styles.xmlZK6WڽA53q-'kvHHBL\I|I_7BY:y`ROb:a" ޓ{+[u"2cBBRVLYkKJ%-x4cZk3!zm#FXv5;̈m 8N=eF,4dʱ"%[IbTǔӽz>?Lu,l\m*V<L^Ud j].s;@kx|4YAC+\䛹bT+_:K?K~@3# +0L#IU⺜st+niHxfߨW>0c:@;PSHQSmd#% ^eFrGO\?(;24"EsC>Pű?F*Eӟd|sESa0bq*4˞S>qCWۦi--Ӫq+v{OMr@inb~=_0M,"롟tHKM` gi Kſhj9j`fI r\m˶4-TQcRxBK-q0i4FbZBྃe2Ti Rk< a=,AsL%4DZnը_@hk3R+0,V|g6W)aTUL g1ɽ}xGr<:R5)zbS%S{z\acaz6tSg:B)HJlfA+wy)b]Z CKK\LP$ᐡ'Y̮W˛:mAyBkl_3p"@+؇Xfsqe ' v(/} 0Ӱ, {vHQB&y1܉0όD{<b]8w":/R=u.u}ş+i<8% үnեQ,fmfVc5֑ڎ+IP) Eo\X*qq@OťpժuxZR,: 1VriYj=p Z>nUn>ߴL /hNZXLj(rt#"6O?0{w[b6ic^΂5=_w̕4ǂobg.V-5y d{ bw㯲|{"%h y'`2_%4n\g ȳC8ix|ƪ=e\L}^? cZgm[5@ESΚ[9ťlM]EMAGr;FmoP17YHYBE 1˟,.I.yᯫLUEtG@ibVxث3Xq1)dʓ g|hbɔϒP˞骮Y܉kZʴ4G nwYCeBx٨bm;&ײL|ZשTuu:z:պ}jݽNVShjBeԬmlw2&O yf+}zGՉ>?дDAX~ƵDǼאdHAޯ5ff?)0.X ^SÌiE"V@,7FZ>Lhvnz6vyM{@[C9?+3RQ4J:OO`rTp溧꫻4w)w$טH#ѯ{ P܉&6@a``@Wn/&xhoŽCܲǫ7n`=*i~]Au(vc"d2l JjDd$9 ZHPKi]Jc-PKl OpenOffice.org/3.1$Unix OpenOffice.org_project/310m21$Build-93192007-09-26T17:51:152010-03-12T11:31:53en-US13PT94H55M48SBarth NetterfieldPKl<Thumbnails/thumbnail.pngV{8m_T$sJz fDIBC&[IB'!u|}| ZmY9k3M@j0+ 71mr@&4om*#m6 OZa \lkI (q0P[3['mXd*<3e~, :aAƷq{ {}*]4LI[5+ԖGFAN]at5իipjW d׆9qէUsGҍCr:ޜ2㤂<IYPm,BFmSK DQ+Z%@S&pN{.s{o݃IA?@VZM!ar4U c3Oo2[*&!͢ITL^p 'OV,/Y ;l}zlao]LLƫ"l0| 9M6# Sج:޺i9Yw'SveT-ƦӮt8!-Gm@间gVSՇ X~^^C̝m-GڔIZ'$]`ٸEcG"O 2tEcH_hEe0W#l+T@(.#_N*gȞ\!]ox.~9J!/ʿ\?3Zh30_i}!s*DMhgkz* 汸e+t3#1AveXlq@dk!)@b|{#FT=>mvk[k]WD&f w.Oay ) ;n%.B2b0BuQG7`Eݘ=뷲eA)FV5ڸrqbduj"ѷ#zi 'XW:v~<-a_nl}D ]3ͪߢL96?'P#=BksX.ۼK[97E4-I;YJF(=X }liǭɯo je^P[l5?Bx$Y2\t(Ɏy.kXR-},rOQ~*AVwdkƶ9'e"fV/p ,4FӺ=] ќALw}&)WiP /wS ))֡[-X Ter{rcq蹚cI]yv$[bp|a3~]UxqDDsNZZtcHNcԄG] _-ţ/|K%Mt&΂}Q^s#ߘE1_ؒK*A߽日ꗿ,Txӆ^Wχ|SQ6F(=bjtbWfFt!h[΀\rZ /qHwDL3JwFʼ,?QcV$t L!Fs7$vյk>=S蔴i֟@ktk`ؽ?{=BnW#HnjctEdi{cPKm11 u PKl<'Configurations2/accelerator/current.xmlPKPKl<Configurations2/progressbar/PKl<Configurations2/floater/PKl<Configurations2/popupmenu/PKl<Configurations2/menubar/PKl<Configurations2/toolbar/PKl<Configurations2/images/Bitmaps/PKl<Configurations2/statusbar/PKl< settings.xmlYr8}߯HrJ2e0˄ Ȥvބ݀7%\~Zf̲zV_N,c~2"^;`:jWn/d1Hc@kZNhPJ@",AmϫVYd#~ʹNb8]\Vkzj߮(&PUϪCِc]VIn'ל{k?p+~*$lLHeckޮ}oFzQLMꮺ-p]ώzSqh:mvV/&}8BJ4h͘0Fe ttDSB3OquJ̒J$BXBYfP}a.*-#lC7juq{~vU/*s(\X7nE)Q5{|}u~Q"#u3(`ÁG|AbN%9@\qrj**R|$a9s+-Z|=BJqaFLD|%A@sZK3Fw=U:L[gL7%w*93jaYp4Tv& s1g1 -{.gTƦRx 1L+R30u9E[59 M;ibIOH̄uN3Wp< uk 9HDI]ڌ] 9꘲{^n]EPK/  PKl<META-INF/manifest.xmlŗ͒ wů׊J40*Kfw&njwbEE놦[-Wjd~:LRP?^˧EM$3 Gie:f:ɝfi\\0vlOvxpjXᒦvW,{*5^CXE7kr`r92 XiUUNbZtDp@㰜'^Ob)q^8K]&@*q0+- Xs^ OduaU>k,Q6j]G|Jt:ܦ?r\t I(GvW5,l̀ .r4V.4"'~R=?:BR&QӶv(U{ EejLcqfNyh4њCM/(!A_mNp_3㾉gj^HwPK p[ PKl<^2 ''mimetypePKl.>-V@Pictures/1000000000000320000001D0D0271A33.pngPKl<މ5G5G-~Pictures/1000000000000320000001D0F1C742FB.pngPKl<}̸r]r]-OPictures/10000000000003200000023FECFC66BD.pngPKl<e22- $Pictures/1000000000000320000001D00F6D3EC4.pngPKlConfigurations2/progressbar/PKl<xConfigurations2/floater/PKl<Configurations2/popupmenu/PKl<Configurations2/menubar/PKl<Configurations2/toolbar/PKl<RConfigurations2/images/Bitmaps/PKl<Configurations2/statusbar/PKl</  settings.xmlPKl< p[ META-INF/manifest.xmlPKAKst-2.0.8/devel-docs/Kst2Specs/src/resize_window_box.svg0000644000175000017500000001305412277111530022276 0ustar synthsynth image/svg+xml Resizing a windowwith a rotated box If the window is resized, the box is resized, but remains arectangle. The rotation of the box may need to change tokeep the same relative extents, and to remain a rectangle. Kst-2.0.8/devel-docs/Kst2Specs/src/SinglePlotGeometry.svg0000644000175000017500000005370612277111530022342 0ustar synthsynth image/svg+xml ViewObject points inside the plotrect are placedrelative to theplot rect. Multiple Plots can share the same Outer Box. -The PlotRects must all adjust to be the same size. -The first plot in the list that has use for it gets the Left and Bottom label regions. -The second gets the right and top label regions. -All subsequent plots don't get Label regions. -All plots may put axis lines and labels inside the Plot Region. -The axis lines and labels for all plots get printed on the bottom layer; the lines and matrixes get plotted abovethem (in order) and the child ViewObjects get plotted on top. -normally, zoom rects get interpreted by each plot separately. However, a UI must be provided to allow zooming of only one of the plots.Potential Simplification:Allow at most 2 plots to share the same outer box: -Would this be easier (including UI)? -Is there a use case to argue against it? Plot Rect ViewObject points outside the plotrect are placedrelative to theOuter Box. Outer Box Bottom Axis Label region Some projectionsmay put axis lines and labels inside the Plot Rect -10.0 10.0 0.0 Top Axis Label region Right Axis Label region Left Axis Label region Font sizes and line widths are caculated based on the width and height of the Plot Region, not the Outer Box. The sizes are calculated in double precision, allowing for the desired sizes to be determined without regenerating the labels. All dimensions saved in a plot are unitless and double precision. No reference may be made to the number of pixels. Single Plot Geometry Kst-2.0.8/devel-docs/Kst2Specs/src/Data source changes.odt0000644000175000017500000003575412277111530022263 0ustar synthsynthPKO8^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKO8JjNeS content.xmlr۸}CHŗ$:n܉XN݁HHBM\t }Kz@RD˴#v:-sP/_]E!dRq6^AX싀jb4>O#/b  U>m2 4bHX껳,;1MƹZduWzͮt8h@i8X.O$S0jùz۸kʠlA J PYfz$dTw1u*_vvig쮎hdmQM6&Z'v{:zMOq1<4_t J%{\5ls+~6fpu:Bb^L6 ][̽ y|q U^7$7I#DY+`~ yi ]%XuJt7C><s`KLEJNqpH9SŹ4p+ʖZ;p6To;hFk}#aAw ܯ2V35 ߸-m(۫|﬒%Hg` Y'LETy »^Y}/e_|YD7⧷, Vm{8e|<؇" nkK&`s ۂ* u@o M (Reum;}9]އ6w/h6vFǚ<54u`<0u2O)x]<4oܪ Flj!W%:ob % 3z 0d؇8nrx>jar+r}nSȎr8'`(ǻ 9ګ XحTTOP3>8X]9yB:1k$ڳklce0eOP9$8 ! 0BKUfi߽oˤt&\}dtIr$MX#]?19z؅'zB>&ɥ"1"y$khr6&Qꓣ/C?vI$ \Cͧmis()} O_qހYHH@@2qk$%}* r)pJԆ#op*BZB@& uwPp$ B &;ji2ЏIgm Njt28zNqTPߑhjc\(N%3V*"htNEu:l\n& Aآf .rQŚ,WBGd >'"5WG!t"ŰE0 fO qP("S @Ceb?W֔H?7ѝ 9sUeU9V8R9dhǧ  hq;5TƨPEn%SgnX*T2i\Fn$$өA'=>#Lx!\VX3-cHI6rG0Bww g,Yu,xX}I KBSKjpdVBɳ?t{\`5\5+sSiy?Ҧ0EFx:hrߐL/)}yLC#jѮRMVۣ8[CbZn?(P\QJ `Y;k_z%fs}|(iVct; t Y܏p0ވ)+ ՚;85WMoʍ2g$lhW`*f"UĺMr~=K^9mO=Ȑ=!ͪGWt=݆Hp-:r6pk.yJDS 2ƨܟCQU#Rد!شeS VlXAK}K%7=n~O۰Mܶ)Er;/urI7oWA[WANy.3 f^ݖȫجP#|yc֦1'4bZW\Ѭ+o|\ۖ13G2PGf2LCHVOh>i4k{w`e~pn]M{pc [wuc-Lq!xNøxwhb:]7-tc}&ض!O9߰0XI |Ge墬Iz>|HUEb@ ׳V5'a+w A|aB7+XabxRm,,bBX] h31Sɰ_jkI11p R[ ힸy€Λk0W-j,N/-Sb;UB[>~:e\s^εo#sPKO8BrC( styles.xmlZr6)8E,Kc'LɡNrHBD}>IA? EJ x4\.v?K,^'ع#J'l@zW4P! r!w0[=x=R@B[{Ҕ `+%m5)/཰y`V̦tV8+b rZ8;5LӔEho"l,0k)Q 缦,J ܑ"*w aq4ՈsW'A8!- |HJn.on-%nz~7~r^;2I@wtt`5_yQ.>/ +B IaI9M HBWMV&<["!<,t5߬WT{3hLnpRP{t@9f4#L4L"\6.3csȈx/l&ň;*;,&HVѢJjZ~¹X)H( Ҝʯұ{iw~M<ҡPf eD0 [Bm 4IoD!;j !CT̡^@ ĒI߃rikrGxzHYXBA%Ft$.r < >dJC2N×P +HF3gmaya^Ա'If)<=r9Z.6nfW 'l #e|(.i&2ax܈Й}1rdX.Kb9x2,rq,ϋdXFWY :7-PO/F{+N` Y}]u1cxN/YR^գr[ûhwk}:0Y&(0sd2nLqiU5ޡrU{liMl \luZ禧}έ[NQjjd(QPbJ\XWdnR_hS#t=1i<m|}6 Y0Qr@<=h/P,,˞ P,=X.?,Xk la[V?Nuܼv=/}%9#[#':eN6`YEn }ӥ\+Z%T@z2>lq7EEuj*nRbXUo>CUEq)do6$ahgZJٹrNP}Irmm:%A 0n1TN0eamM>mu~W{wɪ]iPF|zC66n8Rp)C7X)eꏗr q~kz1la2 _j͖*U*ּd18X2dQPs(hQ6qPKO8;KG- settings.xmlVn0}+"R}تJv?8%CJJ93K|8r@i* @S]O=GKY@KRq&`҅Κ$TgsЙ!,AμXc`p(a\"EA8PxÂ>;W%;>T-_07}0i4`U zp]HCjh,ݠ|s /٢P r٭Θ2Kt,6Iybs!-4&mWPGBposLfI_Õb89H)Zv'ȚynUEgun9OoJPZ9֤КerMѼaw6*!); {PB*xV)VmS]2|&hmToʺ8`ɵjXnpKLAM6+#62mS 0'wq:{M}>Iz_G>^o2@vh^8,-e֙޹֣PKO8hN - QsJ%OM{: #%?LܻV4}a)H(>44D&QCQ%k{A,nݚ$3|Jb`j{>=3 F_gIqP(x<`"XCKꌨKٓ}f?mb5(8柖jjw@+=W pP/]/T>b4 4xYI5κ첣]I5ͳ|u5\ 0%sb! MTMq][M+7mlXB.qŜ"'o$h\޼` ժ\uKWՀ-hPRROOO:v&[eZ zO{.KL xLLa&<$?Ii78 ֏,<q5 >3k=8@伆Md XS z(6\ ~y:9_sU1憴:(EQ *y&qgvш̡_zoc箰O{患eZLKb:MTbJٺ[dTi) I#ii\\}ȌNzqA\C'-2X$$M>WT{?0f/z74PPu㜂d^rpT&xc>zxw9at2;K͒;:ۛ7^c3q^p4nS%*T4E0'Rh'7?G~581SxM'&%đy$G1 9_gM&ư3}(ו:[AJf>w[պ ~OzcìFmރָ[w Y]D::9euxyxiSO "+XT͒q cyȜLe !w7kVo0 f;u,hLƬ g˰ȇ AGC.yM>H|?/#D˓>-,#C]77hڢp I? ^2I3ތ/>~s̮ D]ɓ<:#R(  Vs5`mDئr?S W)NRI] 쬖2s\i~+ V=MGT9hO:S0\w1ȈD}9f+(! 7~3MdП~/$N45}<+^b*{҄ytՏa%3*1Mhм"!-W?|0Н+ g|P q/2 &P 77깹9@wvX-pN$ x֪{) vP/ $8 F(9gϺU2\WI%-u-R5S-ę?HŠ2tQtѪ8c_qm닃y5_m.6DwO= x45߿6G9]iXphS_mrmA !{0dˊ hdy=O;m*;9 vPO3jW™M,Ж#18t%)c-ê21&(2G X1"]+8|OUmam:Oƒpn,lxEɒF҆\nKq/喓_]Zc}xl駰X`{g","( _/~;e v߬5ᮩ/H錱` 璭W]pޚu?*pushpwgh^G*S.fhcNIS]k d o=tYK GwNtKKdŚv0f'v밦T=wGlmojB gHO /6:3.lEdv.S4`"t$>@҄5mumj!] !ơ,l&|CXZq1V 56ׁEiRRYhY zE #,mAWÇ㢄'I^ -.,988qf띀PF 59-il\lVXë{@GPVMͺ܊c8baHKo;:(kcMwQEwúxh *ŽWRaJ2UcrÌF~zqf+Q{;,0Ė$'@ߜ@Yd 8+!U2s-rUMb*dd؞;<ִjVc\Wjqd?(4雚3.gy^ ]""cvHDlqrT_T'횷[1I]x:r wͥuT|HF -c'uM2'II6Y{; =DB؆F58"`cܗ,LE&+/_*6S(@$QWirK,Q[j,mGGjdD7J6Bج {25=D H~b(O>|' dP[&i@-V?CbŁYtk \oOŒe۷ -,, SN;<|4B)dSXA ar!ؤԞ[cK}ÓK`iյ>fV{ "}S`$;|.jQ@[~}J8H*\g,&2 >ˁ()02cGY>:4pvvFKAfjR֭\; G:>>>(4xؽ); nz4?5Y>UZ,K>c | - iAʼEQQJ*jkaP{MG9Lx՜0Y$SM`J**~JoȳQ%a-KkwLSc(8 c$~ZN45 CQΥJ֒죩R T`[6iKۛ/Ta_Y0V Afы !qr)@sM9{8R@L}^6c% 1(.ckm \J77}7$$)db])ꠑp)f2|h64iZp4c)eF:|nL:ӑ _ͬ>ߝpV,"hL[$;Ld1+-}ۄU0QD\uVTU޷|#eISURVh4މS"UOTxGG>pA3 sk~oV@JdtB.K#nxn{Kg-zμt+Y&OY*4̭ sx7)@m’x1ߟ;fS,{G_u@./,UݓPo\&GiSv/A PR({Ε6pG姿DӜqoPIж{(spY}aआʰGYr4s>Jx][.vۦv&WZr Y,+ *[JT9pÌ(U.'@1QɳG)0@<Mo`^߲ugIƾKf@1Z5% 'Dk(bbq- x\fGtdtݞ}DvyK !f]OvDL>B ?einaH||=?m݌._(%O}I5-tQJGoH+(tf֡GmZ2?x eS@5V`{5{YPTqw?- FSʼ56Qkh12X`VCFI/uZ~㐼k%inqN y19 DJb vgQ/NfZ,M 4?-ڎD#Þ21E錗=9 9kDsSq g3zSI3[ʾLMJQ˿$Ux^kj*vMTB@]M袌Uݨ醙B?۠ R{/6υotpd<{@5i&GkjhAUlez)Z[iK/!Lƕx`TĽ]0S!NQ܎=.C38.6Dsq\ZeOKoSvsMJ0li\Rl"2=K~X^G_)v%)qZPg{F_olų"~oa$Ҽ[6Rc!Zwa4l'_t|YVE)ttmz̲*G@gj>ds]JrkA#a}a(@psr׋3\ b/,~A R,E m{3~{,jܣ{$ΈUW"ԁF>{ӠmFC+Toc_TU@ Fg6I ;Ec^Ts‚ng^◇0(Gx] \JΑ Ū xH /-H&Ydd}bv393aѤGrT__筡2l2|Jf|pyNprVJ]QL˦橗 a㖠>cz]G.ĞOP.U*JQS*XXCZPu2gځb; L~3@: N9ܣ1cvݚVOV/%CB##\vρFĭRGۈdD*XC (MOQvH,2R{h][L 82p|TU@ETk5m6?S-;Ӄ/zjEc*Tbڿ8vD@ҧpǰ$&RLc/H`|Ҵ*>&?IU"џJjbJ "W"Ei ߔ|fm@a<(Nf/^_b/#ug~A@J'2e4 _nwAQq%)pXs9?m1i9dF$p | wuD Ld~^Yy[r*Bg"xd&ܤrxQfqĚ! g'wDbas'{K$^am!WW` ĦӴ 歹G}]Ñ3ou0W1P W3Ţ$< $iIӨ"] Y傲 l(pFxw6àӜBvb}q"""Gcv#/PZ.*xwXLVGjwѸ/ǮNBEbDR/^:]}}Lɤ)C6{U-V"[ I~13ЂtQJ&_f$Ľe͚z?y(EKw?PKO8^2 '' mimetypeUT1GPKO8JjNeS Mcontent.xmlUT1GPKO8BrC( Nstyles.xmlUT1GPKO8;KG- settings.xmlUT1GPKO8hӏ)fG-\[DBJ쵥zXa V+pkf4&[\%EK*R{$@iCV$n[9mN3$S*u*Ourp 'X?KTUҋݻ(NS Yܿ_z^ ti2;ERrÅR;d o*Mvge֦∔16c|2@B磢$p؞;GVZ:}2OhedAq=OkX z :x֮f]ztp*C,JoDlb[+Yun],ݻ: dK@, bC[,bnH.e"Ck ,x:o˿,eoا'NZƋLIkLl;_%f 1fҰaxpę˶cК߈Ηt##ݑu'R_s4|@ Hߠs{@sx:uNz/ پ︳ǩ\g7#}37# HfoFfoFT37#}3u4#}37# HfoFfoFT37#}3?H]MlayK_1~JH%H)>D!3|"znFa?L.<|ѣr:oԺfz< %Wﰃ>;% W,YGCC %6d{ɓ@[^͔iqTd̈T d\o$\wd!TܠV!V"ChsƟY`]1}&A{UvI94?R\ieq~5d0<@g"k4 Mi}8̹m1g]@H#7ٵD ?gO'prS%Kc^( tI̱sUI `ćv#w;Oxew<< X0vz8A1vG}e.0 #{nDx7Q/ PKƋ6 TUPK| 8 styles.xmlZ_6OaɲMq PtD[l$RGRk;fHJlVI Q^x E4<9㻇яoZl,\dME>T`3WkK|ׂ(֜TTu5Ͻ6G#lvnF^~awnF^Щ}+n>2ފ8UM4;Aq(Z$\]VP;YW74\yВa*IiVTׇějCdMάv=i7 royoňMw@4{UeՓiB*nj.i*="{FʬӸBJ4>F3BiMӖd4iV7ou3uEhfTm4Oj*VI->]b5j#ʀPxE{RrmOL+-)fPI2n;8j3p'"fk 췷ǂ_({lg C@ҴzJkpf矞E[E-iJ$uuZBAEq } !Zo2 OH:GcU k\>tR""Y!gNzR=LmXTk"ѐKB4Z,².:`h Y[ fdV2֛0S,iAKZmEA jD)UвbiY+ 5dKL4\KpVwKCy$X0O+~:Z;pB(|"v4#W [gCc]PqItf ~źLn=u8gI˻֠>d>ÿ<˅t?ǂL+"bzvRpޮVvۇdX9j`s~ w@GwGLv_?|A3#-QԔaNmvu~һzO4ՅJ3=uީ撀i0ƬX+-]d}X]T17 NQ^Sb6@}*q-_({Bqz_( ŕ.=!G˅ J߲]#3bWl;ATnݨZ(͇!30v'J(47| lţFzcF%;7ժZ(V;4{1'& TXnWq;X vr䓂pdИU]A ͓Yen!flW|u;\wNB2P"q^&$PKXL'ߚˤ`[%a\'TۉPb׬l0vJ?_ց % Jh9& ?ǰ1l`;Ev^PVu 4?y_t6w$Y4K˛RSj$=LtsL%JvqV'.PK LPK| 8Thumbnails/thumbnail.pngݺUT[C)).݊Cq n=@^@qZ36yYw%>?9Ĩ*``J~```a߿|ᢒ=5D/ ^GBPYT|1q.x&|x4x5TR&]l_>PFI!bsLnj9;:[Y{ݾ]w7g[!gkI|w؃C; W]گVfSQ亏s>=eґ\mi_Vl\ë"jݭ:+6tZLNر_~8v֜ijBr>Loh^o^Yl|=~^5xnfP"2˺b(R}VS,cr,|E`sS/^{*xH+a`m>g-OďoOV.HjJ.fhrݻK-PXfzB ~Gec{A͒ҋN]͞{3xgҦ!V.NMΰ3vWЖ )I_i" fU1 xx`t C,"a7}mU ظ꭯Z1tHƦ}ZJYeYbRLw6l&9coNc̉ff}Y.e)i@m&[1? 2C!6xL +"Q.5tkVؑk*e(|d:* =t\7o;oGB/!z#X(@OKJf?}11V:/2ig}=GDf}XyF\%6m47^PQy9R9wXCcM0J|xK.['hQTx㱽tk^IS|*&KdLu7;U04wȽN՜hjOj~EX[Y@KUf vUsY2|eÔ&_Tp9:b1MdHhs)⻇jU{wPżWS_NCèu|FC̿@Ij;?Z]5K3^(rdtj5&6% O h]\c!Y"܅/C0`0L=cd/ IE"h4X'Q5eL2w2 @_T8W*|8`<#5 ᠀wD.'cbBV'ǒ8k$RXO ZA`]{ D27h?=[y!$a8>q'\LdH>젵FN`E!E$ppMkޛ_(/'+K/|q~1BmpկQ+Q O]^ ueYm;0kvFYX30U,l02hyF,5],NE\#޻&2i6J$IxZjowS0,5~qF9?;iWع}jl!w3K Dl˴8U)u5-ȪGSF9_}"~+ν(\66B=7;2>o>.nZ+$<Rc} V#(ޚIIus;!lW#YBڝ2 F:}ǔ _tR"od^LtOuɐ9,! B>t^3*ZNd @{uCalhޥ V6J\) uWeW=,ҧ$A >ڶ%Q _5 N"pslB/,H!)ʍ >y&,*o)YSǚBKPp8*,ѕ?8w!Щ'QXv,w܎SPّisy0lW hb 4.G jfk2l!M2_}/k\DF"r/Q)d1n ^S_렼/9ά$sj+U)iTLV:MɆbTSn8-sM/N'ڙ]ÛËh>_Cԝ1`-wUx=ێ /1@qcTY׸||.pnwIt XJc3&~g)Z_AXC/|y fqPI`b_a'T ;QGE[5;C6o3ԭZ4o-B#vƿAO'?I=ĕcs"D}-%Rq~*ױfn`V}%b~ As3J{nQgS&`8opwknUmJ&hqL}wc ֠lK˞(L' ͮYm;ӻH)VD`2a?GoT HB)N52R& ֺbƾ}3 1BF(cKMZBa Zؖ9]'Ġ!ۚk֚GDW,0uhvj+c"{KpoDWo6`j+8BJT1B! { v)|ljݷ=SɁ#hFI)A&D.~@]KP놯.*&U8 J >5F:fS#(dN^{(500R $t*`s5ȡ[ rK4mTkw2 @P\~S ]W]J<O)JP~~d9fŻ:&V98W,%|hؿ"ͨRulmcSci>mLQP7#3pO1;w  |?by?k^+{y荰(cP'neg >H6"TB )Џlq2[)H᧾qoF"jsF)bGQB,U;Z:2N$z֚AϴgO$?$+ԗeŷDt2l ȋQw9t]-~@16z`3 u~fA{3-qzjqz]f 679#ZO$ʃT`VM:yh_SINw2G '.f.ve͌)i꜍Av\{- QYԌ!_<%Zvתg@PIxg|g_ L"oFBFz޹` A%"9nIJ_<a^8v#0IV*8[riAZ!IKb槁ң? ʕn'&Ƕ&|a<b誂gM<_+]ʧx;G9V[XT6Jӷe(=֭=/u]2*djK8g|!TyrQ /^S1"OR &^#s+*9YZdq~etr#;9AX'L"o fH&-O%\bovB pΥ}9#[l'HƒnS-#& ƶodz5[aJ`eGv h?exIZN2C C$ewIl`{]*cQP1=[罬ZJIJ-K$E(O^)c<2Le#49X y"\% .ُ>CnO;D5bIIP/Ғ! )EjgZyFjYj„%H\`*/cҷiSSlOӎIT荓{ڴP+gRH^m-V+55;!,\e>T P&ݾ|'vO=R`+7lG7Vsr+vixȸ7TcYGW 5G9?ZHw=IF1q%vKz?X mֵCr }3VĿט ,P֮ Dz-ҠR#nQdv)V3b 7{M&eUVɏZN1@sZ|M)/28uo:W^8\=_>@}/n_:v$*B wt]P}ww쉻=}T{.?6oyBn$n c{Q>U ;3͖WQYoy  .I տf#Mk"֔tSVuE(s\}K5\6m^R\ ZԖ1`pb&H|)`b4@|̰l4 kg8pDYoڇMIڟʗRNqpqelrg5lKk2{pJM,<.3l2y+)W(Pk87ы|~:" l7Yڣ dikS|q,F_l A; [Ϥ֔OHDy1,\]9/'-ľ!{g=%H!sRxt'}  624Q)Bnq*z1p5#O7H FȡjTR <ʬIJ=cY.P]6 Xiל=oLװ{z*=ygj ~<lHIU5 ?& ߰&ZY+Y*B6pWČU: GHMv3z\.]1dM" ]{M;f]% 3v/1@mdzJeRkY~wVf2l{ 9$"GU/Lw!b&Y"t| q(JR,k xQczP*X*^m3c'Mc[x547c,sniO\@mJHăԒxUֽ7;ʕF.Gosڴ*moQV D|LZr?jh|_ { q}`ExpA_P*K)9k"K<7z}ݷz<^SgƆƆE4|,E3 ?cDaÐ_j"}! yOKs(MV# Ii5CP(fY *0C :eN;7wciO}T:hZjd/3|צEX (Fq?ki}Rw'?X~H {YXx6fmAFGXTTbVbX{Mm,i5G}jF8Xbl3h 82(8H(>¥*W!Ho3o^rAfJ\en {ox-Y9 Tg4.ȡ \o1 uBuݷl; ?QKM°{ "+@Ұ NjbBCß#{٦BqM6SF'yaǒQ+~q ~LU 4"n Q v*lJP$ꁏ>^кyӲ<䙁2.%^ w;6U7L(nB|?TZ@|fs3W1|yPu8?MSE5 5*i9A2[AB1ژ6Ǯ 5Gr'"؋߫d|Z5ÞޯOScζ@p6IP[oňLN4mdyRL)gT#3I'Ou+ `qiwƳ7Dsej!씦*=f^ UhF1\/|<N/XIE!Rv&CGn%pX؋ј>I;ˠ0u0(/^HG6 AHl7=b8PS1ѕ%S8QveQ~lҪ纉܋+Ҙ x)ņ~i1%Et-&z9J)ΏjF ݮ:|rd'wMH0-$0TPi U߼_ M6>c#΄~:3Z͚!D1DD~nХ,˽ ͢՗%},n{Ǧw!{&OmG!67WIٽ^P9Ű &!.M֎L Z~@pZס&i4YÕ%=q.t`UTl 4\rD;՜VjL{e:씂,OEGbfP"KEsaJr^Ƨx֜.=vH˪E.~2h6Q+oV:$Et9fU.$2?JӪ+'&1cI)^YۺuhD3Ccpm70qˌ-Ku}mF {RFAl;QSpG Z;-uOϢLդ h5` DXxOӌ6׶VvF+rt8 su=^0CeBMhyhbp LsJiOut 떣q6Hnk|" 84k'Ё s o1TWk["SQZ`HSY-e&_>A. %D>T-qAee:I;օE@i>A spc2f\y %2QR0YSpU+Ȧlۄ_@oc{=g .! {#YMYsc&ؔL5M OBm޹in;(P:r!KP%[1YVVtԢpcJ<~OmѼdžjQ`/BYb[=-<μ@:cf߲;n6`"h-^q9u7r6nu' эj bW#3wfEYUfa1o9 Bgg&q$ 8 \1A(m=HءU`'hnn}.t;DRʳjޅ~lh~0B#kK8HK<-uvϳ^K-`d3YxH޺k=zlMC)[?aSQE~MFꣻn-#T ŏR`,Ediz6'IӈVZŞp^nclwepaj56k*vB]ZfHTmVœaZpW!ўx-RnQ~\O MQ{L_^{quLl4-Ԍ筡<%em6~";%?BH/e:UdOD .].`Q2|szVv> 23R"wȤhowN&a̴ONnD:6 u~y\(ܹĽO'-PM.Ls' Um<ådfT1^r#s"_8x*9,j#8IWpӮm} AtzU)S(iB-t.g0R#gZxBPIeyG]c<Ӻ[3FV,p|` o]{ZQ|n*9@;Q}(hZO遂L?iIZh M>-\ME9bx$"w 3wrH:j1lSZY?|W00K_΃N&͵.<{̢)oَvP\" 9ތpi)b:pKmN^C_^㒱"@;ׅ.u͗.41N,ZO@d%7XU-C 7K%jZq< ]Ӕs4bNjs*b|J08E*0Ì歸_'0#1<+p]SHPŲtlO4u*Uom2^c;(=^N\ެHnΥDæFBze5O٣IHEzaEԍmn'n TNTs# oE+#WʯY6\ xp@mwwPXU0JXa,A^/Co1 #^oc^Lۄ*ڸmNqU ~0:߉+:}^@7i dIPK˪53\4PK| 8 settings.xmlY]s:}"wIKK$7a/Y+d0)ĖήVg?|mP a-]zߚ\l}h!HS` -g]FƋl \7$ A7f[F",}\>x cF\.ϗsTrꪜ,QPQ귢Uݐ*T,Si;l߼?%n 9[n<x|GZR&y7f.׬VWW]Ñ03yХ/_*Őx`yŰ>_]^ǁA@ns[Fpl+\jϘ×B `},CѡևYl"֝ >߫U*PJHxOEt'}QrQ֊Fc0žժaF 'n T||*Z9 7t=8"s}p_@|>3>ZA0dM8bXƌ&_ئ= 6$AA>>8Li}*_JPK| 8^2 ''mimetypePK| 8MConfigurations2/statusbar/PK| 8'Configurations2/accelerator/current.xmlPK| 8Configurations2/floater/PK| 8Configurations2/popupmenu/PK| 8JConfigurations2/progressbar/PK| 8Configurations2/menubar/PK| 8Configurations2/toolbar/PK| 8Configurations2/images/Bitmaps/PK| 8Ƌ6 TU -content.xmlPK| 8sg%  styles.xmlPK| 8 Lmeta.xmlPK| 8˪53\4Thumbnails/thumbnail.pngPK| 81% Isettings.xmlPK| 85b9>J-NMETA-INF/manifest.xmlPKOKst-2.0.8/devel-docs/Kst2Specs/src/object names.odt0000644000175000017500000007127512277111530021070 0ustar synthsynthPKl9^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKl9Configurations2/statusbar/PKl9'Configurations2/accelerator/current.xmlPKPKl9Configurations2/floater/PKl9Configurations2/popupmenu/PKl9Configurations2/progressbar/PKl9Configurations2/menubar/PKl9Configurations2/toolbar/PKl9Configurations2/images/Bitmaps/PKl9 layout-cachecd`d(0d``e`P28 s20$@PK>sy#5PKl9 content.xml]o7p X.$M $/Vr)^AR]rJV~p-͐ʫKΡiwo3!۫0 #+.qUoVWu=|{od=񥗄L'%Zz\IbёTq4dH[u3}$([kv6FڙW~dCot\1}Y j} WǕQA]ƃF 5c$ 5Xp0h[6di,$챸44TZUAi 4.mxV~y!?IYLްqp9'ik&@xP,3$L>bm HRk)䭐sXqǕ祿\ȷsVf-9E.Td"#.(y,h1ږ!ǻYfɮ?zh40^y l,dDc:i4L? C-§_I;DbL !Lgj(a<`Wɱ@*BuA__zҟW&hId9e$jUk:coڽ1{jPjn%1aV#4~J:YF>8 ;ZCV{Zza7 ƒ@ȿk>G^b؇a_+VܛAc &GQG;Oy~ ߪVSؙ_iJ*2p `؏,b;C!.bR$aM%kuYrq=,œ` 5rQ hZUscqnEX,T{H}yZfWq 0OvuwPo=L'AQps~xԣOzQa 0VsA}YgKM[6'Քotnj^*X 6LW'q/(4P>FQ0LF@to z͗)(Lt9ZAtLq59%:릵zݺ<{S+ZtsdMi%i}3@q, G=_,ffQߺyCq>" X<4+TaLn3!#OB*`n(8zni \ݫ(|2$8IHDR_bFiy:[- szI[c0 (+"_p xBHwbcCr%A}=>W; 9P S"ڈ *p&Q2o$?=,H?If%%f#6PқKhVMC O0bBP2/ToSM\HGRbsD{L`4!U .mRG'4#*48e牐~K@6Ҟ]ޗZ* Y_1Q(LxwF\!DG8DEdS%TwqH 99H٣hTcS3>C I5+$ Ān}b3|'8&8kcqZH?SR >z$BRY}ݗ}N.}e., iX9 d{ +'_ x0sF'$bg u{b?YC6_Ir3/1gu khB|a~wfiDatC Y6}88h61vI=N`^C\#0D˲=X/n"G/Ȍ7g tI>pR"[eMmXG iWNN!MHS*'>>Xw)`ArZM}ۇ".@鶸x]kc~%.3QE-1./;7'% rpK\Zj&NyA2RˋhS"VbagKL1qButiaqGV$4fv]̓A %c]qr,K;[71ΰ+-;2-U1CL˨) 7 O/A~#'KBda6w+aak9Pkq6?)]L]$]Y tǴ.58UbfZ Yi*Ym{*IĈ`x0hzΊN kw-%~w,pEB醓vnhGn$[Pva"Rpsb(2-4ح#AI|MUKv \W.:n J6n[_\٢{Z׌(5bz6bo~mLC0PZ,ֹz6ʗM-P+Piy6]徳*2M[low=ʬi wT\,oAWS<7)u\FIz~nfcW1(eZx-5e%]YCa"EߩƖewHމfÝfQ:(_`9R~u074 F.]?Q06$ϳ3e'3 u2UduQN_^ݵݣۙ,|Sf[̣ՕY֫܁Uzul9ߴQfLe+&AU\O[ZwsZ4LoA_<&^",}\]ٞ;0RnVtT߷9:wG ADÔn,4j)#PhMR0/<62s6ymd*`=F3b]hgn;NT@t7䘜S7OLlb.v͡[{d=2bWAsc6nafH[oh6rjd4U6PKt2k$wiPKl9 styles.xml[_۸T\d[^fspɡ&}=m"I|IQdJڻ 9?CϘ cOfaiRBϿFOm6$%e%++r,V2YS;iWz)3lrdmE+k;;h?v‚N6vAdцE $IGCFp'eNd7a|;Z ԸFgX-&$Zl%+º"2_c>Z5Hhx&!>74m޻tyRwn&O@|Ǯ-U%i|X-`T;SA{N$<'(Kjܧ4S@DYiT)I[q A Rd;[p`~+=? s $Iv| &H8f$:ky:3l>Qa(`%'}LRa-y0dRi RoDTegUnP8y1r=baT %#4+B'3DqU*"gO72TfUb9W"m9*v$ -2:UWbζ2:<]rzb]FPq$ @'@t)~HNr=zxVj`{"w6( đ֐CR5 HFb9FЯ &M0\܀ZzOw3VH+#h`iV'bp%nJA TYU/A7#y UpÌD|Iy!XD[T$;|y%T+dP-aR񌠂#UfeQDzo%U Y eTG>X;LkmMӌjLv T;;Lc4P '(9w0&4 @&68֡@xRHk}bKe9g@eI.Tmr m"/H-ͨf^^+pgU7cj*;e}*g~ @M'ߠ-SʘLWex#u{xh'۝lңѧ0f TD-kM勫GlV)*=V!uw2Vc j4QgIS{lfYگd=!Yؠgv /1|H3|e6*l-/obaݞ.efΌ}ߪ]֛/*'w\ q1݂qM.WME~%-M=//1E6ʆYwiV62sR523\oV/dqAt2&;,Nf "{Q9X0^?YYؠG~~ۏZ/N^{Jh+vc8 \eZk?AhSE/xC(*hgG*n1Ԫ{ssдG"RGMU+F]US :)5PoJ}\>Ruwr-nTFzQMrU"D7d[r7 Qo{WMJ8-kU;k+>3JjJ&v@[ܚCm)~h]GԽyv$~-{F2W͕sܯIuW]M~LskޕiIj >ޣЃ震4eOR^xO\Câw?8ADCK _zpuu{?~So9I#&3ׇ,Xk$}&e# # $̹rSVvKQ-@8l2bhij؃AA韥M8qzdsf?N mF1uw 2j4*BDͣ^Tg+sNwOPKmr,@3PKl9Q*M'meta.xml OpenOffice.org/2.4$Linux OpenOffice.org_project/680m17$Build-93102008-02-19T11:22:232008-12-15T11:11:2511P2DT3H53M24SPKl9Thumbnails/thumbnail.pngzUXen!wwwm<[@p']h6.3bw_Գ^j׊VQAG!Ayw;wHVȟ߽ f"-<*UH elڅ1ZJ#[ +e5]B$H Rb#E#K$9!v}uʗZ]c]/v=Ϋ6a$ꤤ龾e$jjwLD88?,Zq'`sl*[m:X+|4ڟ/mCdDTu((;%lj@B8Yn |PT1;hF3_5#ݧxPd[yIkd*  zƧDwž󣁸lT򝯾1d` n4XZPat!h{ނN3xZpDx^c>Rn{ dH`Ƒ~DB'!F_-^_ |ڌ5W:D=pD:3#d9oMʹR:qӱZvߥ̤3ݖg*.˖[rbh'Umh@6p=t5_߇"&nkUP,nhM-ɠ)ʾ9W f$rVLps 'W c F$~ENzwA,FqcE]_]5>[uD-ty̰=S(kx֏'+2L KĭS;]V\ 3GPq/Q@VP m#s6Tyxq|Gɠ{CGoG5  !zhNqQlh~ Eyw@G[_LzeخV17ᦖ*W&__>(n%潼wȘj0Tl`DhyM_wadO%JN.p{>, Iߪ;JoZ{>җ@4zn#ؤK#Tq BgCc*?QP{)aYC;.cϰiJȮfSI_guaQ ) zM1tr0u OMٙ`^n[ =.=.|A|mc %|rxƪ9S$ya>ϒ"?\Ku?;em`fW{j~Zetat?Hv &5|o늜uʮ DG"mm7X*_{[ dz9z ndݟ_R>*JB} w12+ѫ4s*!}[ٙ-e 49+.6r{W~'75cFa1(,F4m:Uuڽ+vsd\4vV 3}!r[|oyRf H22jA/۟_P,QG"/.B">s=OI;]h+c%jQ(9䷃H ͼ?ҺrNt G2-KY @>X_[`'^i3v6GR)*fX.Ui tɡB*ioVJ.%|,D2 nj>mwd\. &(Fn/j"4x! znsb֚tp—0V,"]E\jw$oBk(Jqh 9I>#*s[cV͑bX̔wwrJz?rXQ3| X {{oX82NO7-K,JOƸ0I0Y@)˾["qƫ S1Ed4iV2N4{HIP!)En{RvzKM3U6FQIaQzywm[%!pi6\oW'2'/ŻT_[a%HYQd.{!? <)L_C߰/f-y4 ɄVc H÷6uĺZ#hOu@ݘ93Ob̛Y 7:3S]V=V.#wx腢:NU}x0&y|g/A m};} q/R%(basoqъH &9+ϯ5~Ć#aodED<7=ɇoB>*k9)-xU 3S^/YA(D?yC{=KJ.L?H 嗤V1ƾk7n3)o B[ȯAWETɕy1{Z g N]xtZ?­UwJ۸AuCkIB%IQ,"a!P8s=߈uG PMlѨ FW:cb>-A ]~ uDqr/\A}PDARUPxGQEs^  í^i&藠q60 6˯2z:DbNIw|[~v`}[3x̧ܶQ(Tk/(۲ү3G3_=""%m|Gg-ܔJVۊn@:->D PG(m !?H0^YR1 p-w+dW̤e97EfΏDDj܋o:E#xESHN:އd&?8CLM\zsmZqqW :d(lPΌӲӦȣD,K*4Ћs ǟZL}Nx!u6YBCۓ"Jı(㲴sL ,¿ ҟujDxW8YߒO@y5ʰQ}nŗH3ՋhIhȦLQHlĻ.XiYSQ.s\Xw>703¥b8E}A; iܹtƒx&p{4LgG v*KM?qVU/i>d6DȾ%3ӵs8Q@NیyZL:f1rEIEh~V!kMl0n<s|:Y`_LPV ;ի:ؤ5s? 's+rt€嵍,KbqMv;ǀ΋ZQK @m7$\T@tKL(il[m>u߈uBH95t+Z+S7U @r^hl o'`ӼR|gÛg[HD} gvҐJ-NxOc-3V/x"Orǁ?{:BA $ d9|뺚[4hCS@gy1n09OJ׸^o#MW /l^q.I_E7Du{ + Y$uE}.8'TZ+;'c Gl 6N aGl/s-DTdZqdUgpה{\9QH`N0);i7?{818Vt#|7ʿCƯY_4i)Z|w8`tb3M,50=hlWzE~hr868{B%/mcz3Q\\"tJ&Ȱ ]قlTiDCYF?55m(qb@mr.K3 ,}9OpJ[_KC1h&}C&mf~wqWzFupЦ;R+dNd-פ SZQ{t="` k ս%8Ls\X{(A;J~^a׏gYńØ}W`I{\J|α!ơeHX웦@SAgSBaDwzSN R z(ӟWmfR?(uR2j#}ZB#1ᘻ{ćvTfIqJyS՗̷ xr,>t0@a1jh`'PL>ݿ)ĵMkOWbͿ^m÷vjLfKz` s$3xҷN|BYSuRl#ܨjw*MK FFsjSyUE(V|7չR{{Bd0#[~ufQ;O#4cf_Q4ơ+mK8M@}_Iic5Fҵ8 ŴVjm-/8Kc74:RR.85krQ$I@nHtORq:ɓ)s9:"/3EHcP L p֛݋r5 +q&,zx4BEi$_ڇ.R& Y\Xsb*UCb@Yi 4 Ŷ8嘋a!N~ e(O.5ۆکib>tw!qW aꤜdNH&~jqzμ!o!,*د,FȐɔ ;! GpI_oDAٷuKLBU9{TIJc&z9 azhVv&hmW'D?^S_g}h Oo6 ma)U*s|4EOIkf`>+{.ӗDO=&)l<Xd45~;EE`ף-!kc3Z:Axovj7Bqi02X?ӝ}>'ى @.]tSG~n3AIUT !HFq;}9?ap~XIc36J_;+>hc]좿R螬hۍ)㔮"9̗Bx!7$ʫ #hr-r PUgHf s?+~ss%"XX{YJׄͿnoNG1r"WR]CX'+ݸ¶#OpcZׅD; ehШajӽ)ERqnKsJIaUižI0 }a7H(-bN.}Fj!Dq]#P o v-^sEZ% z+/E Յ'=Wg^gRQlG$b_S;ՓzN.e4g4rDzsŹux:g< hfvJ(2Aԇh]aMm-+aqNʴ|_O15x>1gJyE$ۇ> .Wl=rsmtYL&ԋFլ}|<S=CEv/Rت\DͯՆK78MH9& m΄'"k p2wPu>CޑѫMH]A-JX^KV2 SWr15\Ylѭ;胔kv8H̄Ŕx/#+ EgN6ЖOcI& wGny{Qȧ#;IS{ѕ}s`Qd^ U.5p˝UZ.q!DDL(kmg1ٺ_0Rgu%HAHb#@C|n2%:ua1-uϕo{}_ԉDd7YF09l*V}F@NןCRQ˃bE>]E}&T{<7jUpش*ʉ϶cÅ *Ur2R͎l0#mnݴjuֺXlx-ynE%U)Kltވ jCgdp%a}/ .>a.e1/Bv9c>&sW >P d8^>U~/lUf.SiN`2]nѺ!>TlUsG6D߲Sue1ۮ׉G6y…p&;"zX??yT-x%~@۵rz𭆼N Gi^Z-{GfjZ x<14O:~y!3mn67R'$zo5gDV||W$>\6Pz6%fE+ْ&R:pd"z) zP}aHD,`5 3H$KbY 1i@dϖU&චRv⺇msu\J܀:7n 37f+\lU1xº`9\p=BTzϷX /jDUiChڌH|ZBDtˎƫ3* ^Bw}B *ސ]-LnZoL"L{5fh!MOlKavi{w rEZ͊`k rfn{]9H2'/>˂qs/V}:{eSa?]?~ 0!#s'R.͑Ta?}:Ci-^VdlZ#ҋM0$Ψ!-%- 9t٫s%ԑ,xZ ɬ߫@:2*:\ [1.ˏ&B(je5XܜӗWz*ljp]0TP^9B2 .xND4fR*P_G_#V}ke侇2o,,:E~}="nxhqYt$RY#d~Sr3z3F2hJ%&^xi0|ovA+FAc9RF9Zs $25☮g|1hVG5PKQ-Yq~3N|(;؎8E?$ԞZ~&0I ٷNMo{;EH7kInR^߼=?%C4otLBq#Eaiu]A0)fEntuu"WELT Eژ,sv"̋'<+<սԔuhx|d^+i; $?jIfAݍ+DIdX7(ڕ+4aZZRTh,s9;2$W~H͊Y/vv=*XeBއbq/9!u,PMޖÃC8,HH8,1$w,CLy.ɽ߁ x/v=D=W{=C  '@VL=WԚLQ9{{seMk>Laܯ((ҥMaHxWn $(,GRmW}:!ѵ_zm\۲Is$}O> `Fq[H _4C]1$z=ig>`7ۥ=.V2όȈsw4SP|*#1gV:/ao09#WGI7p,k+j ٧|7@gQo87wFl KWu#r"IeA]` $&W`&5#"m՘B'*4e;e/r7N7)ʶcQCӰPT\XK֥Jy'oK;ucٴ?Zy`]'KhY3twa#W N}B{28"MT/ hTjݐ눤o3Ҏ-+U@l(1㥮L**)uS0>)i]bwE߷:&04#-U[`4k`QKsAG֚kVH:Bx :_}"v6&/ .=Z&d@IQͰkT>V}Ņaaܰ vTVC;K"/V{uA':˳L:|x-E]k3Gyܔ\:O:kӼW,V Guv! VWY6Ǻbϗ2J;/sc)bEt!(Q:UB,EAڛ5  ݱs^qmO? Oޜ1TxM:5ƺ 0+zq`#<rESo>k×,j>.™U2e%振֮fhPXWp` ml>oFGTwi^Gn%\4$SH޼qP;LH8@P@M^ -Cܛ聖OdK C l[̫dBzqҾ̺< Rg?%\W^Y s$iJ;މ#==5+l3.(i V:*Te5kl =/MZ0|<"VQ|8RQҰk]&'2lBgP'r$cZxΘ!\F'=3FJ'P%J]PhGW BZުWl"}S9٥0 3—NŠPػc) "gkH}um/Ⅺ.e&*{k戙Bzpjܰ+p1rl{UxyPGvFjWi(t]=䪅4߲qOvI |wwF=-gL0׏WmB?rOE"KXNwƦhm*DLI:~AΕ%7'#Ix1mG6V- cQzҷOAde=H7dDmV;;g ͗}J#3X8^Xsv4G7fu4[FZN'N,ly%$ereb Z>}Aq a[2,tk=O `ä7|q[ޝfz˕Tx PJ2rTT*g\F5"ʠ*&?qR򢱋{J3@q2VR.60dii9z+)=Ѵ| z>4vc@< XiaTRgXd`#[N i>AMzՇm0hw<6b3|S@K 7V>4KQ30J%x R0uPHt{sMxNRuq/'Id-1QozQ.'Ƥ G^b(1kϮ0JEC@VR˝5

Zoom ActionKeyboard ShortcutDescription
Zoom MaximumMSets both the x axis and the y axis scales so that all data points are displayed. This is equivalent to the AutoScale setting of the Plot Dialog.
Zoom Max Spike InsensitiveSSets both the x axis and the y axis scales so that most data points are displayed. Spikes, or sudden increases or decreases in x or y values, are excluded from the plot display.
Zoom PreviousRReturns to the most recent zoom setting used.
Y-Zoom Mean-centeredASets the Y axis so that the mean of the y values in the plot is centered vertically. The actual zoom level is not changed.
X-Zoom MaximumCtrl+MSets the x axis scale such that the x values for all data points are between the minimum and maximum of the x axis. The y axis scale is unaltered.
X-Zoom OutShift+RightFor a non-logarithmic x axis, increases the length of the x axis by a factor of approximately 0.5, without changing the midpoint of the x axis. The y axis scale is unaltered.
X-Zoom InShift+LeftFor a non-logarithmic x axis, decreases the length of the x axis by a factor of approximately 0.5, without changing the midpoint of the x axis. The y axis scale is unaltered.
Toggle Log X AxisGEnables or disables using a logarithmic scale for the x axis.
Y-Zoom MaximumShift+MSets the y axis scale such that the y values for all data points are between the minimum and maximum of the y axis. The x axis scale is unaltered.
Y-Zoom OutShift+UpFor a non-logarithmic y axis, increases the length of the y axis by a factor of approximately 0.5, without changing the midpoint of the y axis. The x axis scale is unaltered.
Y-Zoom InShift+DownFor a non-logarithmic y axis, decreases the length of the y axis by a factor of approximately 0.5, without changing the midpoint of the y axis. The x axis scale is unaltered.
Toggle Log Y AxisLEnables or disables using a logarithmic scale for the y axis.

Many of the zoom actions are best used in conjunction with the various mouse zoom modes.

Match Axis

To quickly change the axes of a plot to match those of another plot, right-click on the plot and select a different plot name from the Match Axis... menu. Both the x and y axes scales of the current plot will change to match those of the selected plot. Note that this does not permanently tie the axes scales together; changing the zoom on either plot will unmatch the axes scales again. To tie the axes scales of two or more plots together, use the Tied Zoom feature.

The Scroll Menu

Functions for scrolling a plot are available by right-clicking a plot and selecting the Scroll submenu from the context menu. Most scrolling functions and their keyboard shortcuts should be self-explanatory. To quickly jump to a plot marker, select Next Plot Marker (to jump right) or Previous Plot Marker (to jump left). For more information on plot markers, see the Markers section.

Assuming non-logarithmic axis scales are used, each function scrolls the plot in the indicated direction by 0.1 of the current length of the x axis (when scrolling left or right), or 0.25 of the current length of the y axis (when scrolling up or down).

Tip

You can also scroll left or right in a plot by using the mouse wheel (if available).

Tip

To quickly go forwards or backwards along the x axis, select Back 1 Screen or Advance 1 Screen from the Range menu. The keyboard shortcuts, Ctrl+Left and Ctrl+Right respectively, can be used as well.

Tied Zoom

When looking at two or more related plots (for example, two curves on separate plots both dependent on the same time vector), it can sometimes be useful to zoom or scroll the plots simultaneously. This is possible using Kst's tied zoom feature. To activate tied zoom, click the small square at the top-right corner of the plots you wish to tie together. The squares will change colour to indicate the plots are tied, as shown below.


Top of Plot Dialog

Zooming and scrolling actions performed on one plot in a group of tied plots will be performed on on all the plots in the group. To remove a plot from the tied group, simply click on the small square at the top-right corner of the plot again. The square will become transparent to indicate that the plot is not tied.

Tip

To quickly tie or untie all plots (including plots in other windows), select Tied Zoom from the Plots menu, or the corresponding icon on the Kst toolbar.

Working with Live Data

Kst features special zooming and scrolling functions designed to make it easy to work with “live” data, or data that is being updated while Kst is running. These features are designed to be used in conjunction with the regular zooming and scrolling functions.

Updating Plots Automatically

To have a plot automatically update as data is being added to a data file, choose Read From End from the Range menu. The plot will automatically scroll to the right periodically, to display new data points. The update interval can be changed by selecting Configure Kst... from the Settings menu. Specify the update interval in the Plot Update Timer field.

Pausing Plot Updates

To pause automatic updating of plots, select Pause from the Range menu. You can still perform zooming and scrolling functions while the updating is paused. Selecting Read From End from the Range menu will resume automatic updating.

Changing Data Sample Ranges

To quickly change sample range settings associated with vectors, select Change Data Sample Ranges from the Range menu. Select one or more vectors, change the desired settings for the vectors, and click Apply to save the settings. These settings are a subset of those found in the Edit Vectors dialog.

Manipulating Plot Layout

Plots in a Kst window are arranged in layers. Each plot is positioned on one layer, and each layer contains one plot. Thus, plots can overlap, with plots in higher layers taking precedence in visibility over those in lower ones. To change the layout of plots in Kst, layout mode must be activated. Layout mode can be toggled by selecting Layout Mode from the Plots menu.

Layout Mode Context Menu

While layout mode is activated, right-clicking on any plot displays a modified context menu. The selections available in this menu are listed below.

Delete

Deletes the plot.

Raise

Raises the plot one layer up.

Lower

Lowers the plot one layer down.

Raise to Top

Raises the plot to the top-most layer, guaranteeing it will be visible.

Lower to Bottom

Lowers the plot to the bottom-most layer.

Rename...

Selecting this item displays a dialog box that allows the unique name of the plot to be changed.

Move To

Selecting a window name from this submenu moves the plot to the window with the corresponding name.

Cleanup Layout

Arranges the plots in the current window in a tile type pattern, with no overlap between plots. This action applies to all plots in the current window.

Moving and Resizing Plots

Moving and resizing plots in layout mode is analogous to moving and resizing regular windows. To move a plot, simply click anywhere on the desired plot and drag the plot. An outline of the plot will appear, indicating where the plot will be placed. You can drag plots anywhere within the current window. To resize a plot, move the mouse cursor to any edge or corner of the plot. The cursor will change to indicate that the plot can be resized. Click and drag the outline of the plot until the plot is the desired shape and size.

Selecting Multiple Plots and Grouping Plots

Two or more plots can be selected together in layout mode. To select the plots, hold down the Shift key and either sequentially click on each plot you wish to select, or drag to draw a dotted rectangle around a group of plots. The selected plots will be indicated by a gray border around each plot:


Multiple Selected Plots

Multiple selected plots can be moved simultaneously by dragging any single plot that is part of the selection (note that resizing any plot in the selection removes the selection). In addition, the layout mode context menu contains three additional items when multiple plots are selected. These items are described below.

Make Same

Resizes all the selected plots in the chosen dimension(s) to match the dimension(s) of the plot from which the context menu was invoked. For example, right-clicking on a plot in the group and selecting Width from the Make Same submenu will match the width of all the plots in the group to the width of the first plot. If Size is chosen, both the width and height of each plot in the selection will change.

Align

Aligns all plots in the selection to the plot directly underneath the context menu. Select from Left, Right, Top, or Bottom.

Pack (submenu)

The Pack submenu contains two functions. Pack Horizontally divides the entire width of the plot group evenly between the individual plot widths, while Pack Vertically divides the entire height of the plot group evenly between the individual plot heights. Packing plots usually results in a staggered or “checkered” pattern. To align the plots in a grid, use the Cleanup Layout function of the layout mode context menu.

Group Objects

Groups all the selected plots together. A group of plots is indicated by a blue outline around the entire group. The layout of the plots within a group cannot be altered, but a group of plots can be resized or moved as a whole in the same way the layout of a single plot can be changed. Grouped plots remain grouped even when layout mode is exited, so the Maximize or Delete functions of the plot context menu can be used on an entire group.

To ungroup a group of plots, simply right-click on the group and select Ungroup.

Working with Windows

Kst has a flexible window layout that makes use of Kmdi. Organizing plots on different windows allows for efficient viewing and manipulating of plots.

MDI Modes

There is a choice of four different MDI (Multi-Document Interface) modes available. To select a mode, choose one of the menu items from the MDI Mode... submenu of the Window menu. The selected MDI mode will take effect immediately. The sections below provide more information on each mode.

Top Level Mode

Top level mode is the mode traditionally used by other KDE applications. In this mode, the parent window (the window containing all the main menus, toolbars, and status bars) is a separate window from the plot windows. The plot windows, while still functionally tied to the main window, appear as separate windows on the desktop.

To quickly switch between plot windows in top level mode, you can click the buttons on the parent window, as shown below.


Switching windows in top level mode

Childframe Mode

In childframe mode, all the plot windows appear inside the main Kst window and can be individually resized. Each plot window contains buttons for minimizing, maximizing, closing, and docking themselves. The main Kst window also contains functions for arranging the plot windows. The following lists the functionality of the buttons located in the top right corner of each plot window:

Undocks the plot window. An undocked window is not contained within the main Kst window, but is located directly on the desktop.

Tip

You can also undock or dock a window by selecting its name from the Dock/Undock submenu of the Window menu. This is also the only way to dock an undocked window.

Minimizes the plot window. Since the plot window is contained within the main Kst window, clicking this button will minimize the window to a titlebar within the Kst window.

Maximizes the plot window. The plot window will take up the entirety of the main Kst window.

Closes the plot window.

To quickly switch between plot windows in childframe mode, you can click the buttons on the parent window, as shown below.


Switching windows in top level mode

To easily organize the plot windows within the main Kst window, you can choose one of the tiling functions from the Tile... submenu of the Window menu. These functions are described below.

Cascade Windows

Cascades the windows starting from the top left corner, maintaining the original window sizes.

Cascade Windows

Cascades the windows starting from the top left corner, but resizes each window so that the bottom right corner of each window reaches the bottom right of the main Kst window.

Expand Vertically

Resizes each window to its maximum height. The widths of the windows are not changed.

Expand Horizontally

Resizes each window to its maximum width. The heights of the windows are not changed.

Tile Non-overlapped

Arranges the windows in a tile pattern, with no windows overlapping and each window being as close to a square as possible.

Tile Overlapped

Arranges the windows in three or four stacks, depending on the number of windows and the main Kst window size.

Tile Vertically

Arranges the windows in a tile pattern, with each window having maximum height and no windows overlapping.

Tab Page Mode

Tab page mode arranges each plot window on a separate tab within the main Kst window. In this mode, the plot windows are not independently resizeable or moveable—they conform to the size and shape of the main Kst window.

To switch between plot windows in tab page mode, you can click on the tabs corresponding to each window, as shown below.


Switching windows in tab page mode

IDEAl Mode

IDEAl mode seems to be identical to tab page mode.

Creating and Deleting Windows

New windows in Kst can be created in a number of ways. To create a new, empty, window, select New Window from the File menu. You will be prompted for a unique name for the new window. You can also create a new window while creating a new plottable data object. See Placement for the specific details.

To delete an existing window, simply select Close from the Window menu. To delete all current windows in Kst, select Close All from the Window menu. By default, Kst prompts for confirmation before closing any window. This behaviour can be changed by selecting Configure Kst... from the Settings menu and clicking on Prompt before closing windows.

Important

When a window is deleted, all plots within that window are deleted as well. However, data objects, such as curves, are not deleted.

Moving Plots Between Windows

To move a plot from one window to another, you can use the Move To function of the layout mode context menu.

Chapter 4. Saving and Printing

Kst provides various methods of saving and exporting data and plots. These methods are described below.

Saving Plot Definitions

A plot definition is essentially a capture of a Kst session. It contains all the plots, data objects, and plot layouts that are present at the time of saving.

To save a plot definition, simply select Save or Save As... (depending on whether or not you wish to save to a new file) from the File menu. Browse to the location you wish to save the plot definition, enter a filename, and click Save. The plot definition will be saved as a *.kst file.

Exporting Vectors and Plots

Vectors and plots in Kst can be exported to files. This can be useful, for example, in capturing plots of live data or using generated vectors in a different application.

Exporting Vectors

To export or save a vector to a file, select Save Vectors to Disk... from the File menu. The vector will be saved as an ASCII data file. The single column of the file will contain the elements of the selected vector. See below for an example of an exported vector.

3776
5380
5245
2942
1861
2424
2520
1868
1736
1736
1174
499

Exporting Plots

To export a Kst plot to a graphics file, select Export to Graphics File... from the File menu. The following dialog box will appear.


Export to Graphics File

The following settings and options are available when saving:

Save location

The path to the graphics file. Enter a location manually, or click the button to right of the text box to browse to a location.

File Format

The format to use for the saved graphics file. PNG is suggested if you are not sure which format to use.

Size

Select the dimensions, in pixels, of the graphic. Check the Square option if you wish for the length and width of the graphic to be equal.

Windows

Select whether to export only the plots in the current window, or all plots. If All is selected, one graphics file will be created for each window, each with filename file_n.fmt, where file is the filename specified in Save location, n is an index number assigned to each window, and fmt is an extension representing the selected file format.

Autosave

Check this option if you want Kst to automatically save the plot to the specified file on a specified time interval.

Save interval

The time interval used to perform autosave, in seconds.

Click Save Once to immediately perform a save with the specified options and settings. Click Close to close the dialog box (autosave will still be performed at the specified intervals, if selected).

Printing

To print all the plots in the current window, select Print... from the File menu. A standard KDE print dialog will be displayed. There are currently no options to select for printing. The printed page will be in landscape orientation and contain the arrangement of plots in the current window. A footer containing the page number, window name, and current date is included as well.

Chapter 5. Event Monitoring

An event monitor data object essentially keeps track of one or more vectors or scalars, and performs a specified action when a specified condition involving the vectors or scalars is true. Event monitors are usually used in conjunction with “live”, or streaming data. For example, an event monitor could be created to monitor whether or not elements of a data vector representing temperature exceed a predefined value.

Event Monitor Dialog

The following is a screenshot of the window displayed when creating or editing events. Explanations of the settings are listed below.


Event Monitor Window

Expression

The condition to monitor for, along with other event properties, can be modified in this section.

Operators

A list of available operators. Choosing an operator from the list inserts the operator at the current insertion point in the Expression text box.

Vectors

A list of the current vector objects in Kst. Choosing a vector from the list inserts the vector at the current insertion point in the Expression text box.

Scalars

A list of the available scalar values. This list is composed of both the scalar values in the current Kst session as well as some built-in constants. Choosing a scalar from the list inserts the scalar at the current insertion point in the Expression text box.

Expression

The expression to monitor. You may type directly in this textbox, or select items to insert using the above drop-down lists. Ensure that the expression entered in this textbox is a boolean expression (i.e. it evaluates to either true or false). This usually entails using an equality or inequality in the expression. Note that vectors entered in the textbox will be monitored according to their individual elements.

Whenever this expression is true, the event will be triggered. The action taken upon an event trigger depends on the settings specified in the next two sections.

Description

This textbox is used to store a short description of the event. The description is primarily available as a method for keeping track of multiple events. You can enter any text you wish in this textbox.

Kst Debug Log

This section specifies settings for entries added to the Kst debug log when events are triggered.

Log as:

Enable this checkbox to have entries added to the Kst debug log when this event is triggered. There are three types of entries in the debug log—notices, warnings, and errors. Select the desired type of entry using the corresponding radio button.

E-Mail Notification

In this section, settings for sending e-mail notifications of event triggers can be specified.

Notify

Enable this checkbox to have Kst send e-mail notifications to the specified address when this event is triggered. Also enter in the email address you would like to appear in the “From” field of the email in the Sender textbox.

ELOG

Kst supports adding entries to an ELOG logbook upon event triggers. This can be useful for remotely monitoring live data, or for obtaining summaries of event activity.

Notify

Selecting this checkbox enables ELOG logging functionality for this event monitor. Click Configure... to specify server and logging settings.

The ELOG Extension

The ELOG extension allows event monitors to create logbook entries on a server running the Electronic Logbook (ELOG) application. The created logbook entries can be used, for example, to remotely monitor Kst events or to produce periodical reports on data. For information on configuring and maintaining an ELOG server, please see the official ELOG Homepage. To enable the ELOG extension in Kst, select Extensions... from the Settings menu and ensure that “ELOG Extension” is checked.

Server and Logging Settings

Server and logging settings should be configured if ELOG functionality is enabled for an event monitor object. To configure logging settings, click the Configure... button in the ELOG section of the Event Monitor dialog. The ELOG Event Entry dialog should be displayed:


Event Monitor Logging Settings

Use the three checkboxes at the bottom to select the type of information to be logged. Include Kst capture specifies that a screen capture of the currently active window should be included in the entry. Include Kst configuration file specifies that *.kst save file should be attached to the entry. Finally, if Include Kst debugging information is checked, a copy of the debug log will be attached to the entry as well.

Additional fields will appear in this dialog once ELOG server settings are configured. To customize ELOG server settings, click the Configuration... button. The following dialog should be displayed:


Event Monitor Server Settings

Descriptions of the settings in this dialog follow.

Configuration, Save, and Load

The Configuration drop down list contains a list of saved ELOG server configurations. To load a set of configuration settings, select an item from the list and click the Load button. To save the current configuration settings in this dialog into a slot, select the desired slot and click the Save button.

Caution

Saving settings into a slot overwrites any existing settings in that slot.

IP address and Port number

Enter the IP address of the machine running the ELOG server application. The port number that the ELOG server listens on is configurable through the server, but by default it is 8080, so if you are unsure, enter 8080 as the port number.

Logbook

Each ELOG server can contain one or more logbooks, so the name of the logbook to write entries to must be specified. Ensure that the spelling of the logbook is correct.

User name, User password, and Write password

Depending on the how the ELOG server application is configured, these settings may or may not be necessary. If they are, enter the correct login credentials in the appropriate textboxes.

Capture size

Use this list box to select the size, in pixels, of the Kst screen capture to attach (if specified).

Submit as HTML text

If this checkbox is selected, HTML tags may be used in the logbook entry.

Suppress e-mail notification

If the logbook is configured to send e-mail notifications of new entries, selecting this checkbox will disable the notifications. Note that this option is not related to Kst's own e-mail notification setting for event monitors.

Click the Apply button to apply the entered settings. Click Update to update the ELOG Event Entry dialog (the previous dialog). Additional fields should appear in the ELOG Event Entry dialog. These fields are unique to the selected logbook. Once you are satisfied with the settings, the Test button can be used to send a test logbook entry. Click Close to exit the dialog.

Chapter 6. Plugins, Fits, and Filters

Plugins provide added functionality to Kst. By default, Kst comes packaged with an extensive selection of built-in plugins. In addition, a simple and consistent interface allows for easy creation of 3rd-party plugins. Fits and Filters are simply subsets of the set of plugins, and thus behave identically to plugins, with the exception of additional convenience dialog functionality accessible from the plot context menu.

Adding and Removing Plugins

By default, the built-in plugins are stored in /usr/lib/kde3/kstplugins/ (this directory may vary, depending on where you installed Kst). The Plugin Manager can be used to add and remove plugins. It can be acccessed by selecting Plugins... from the Settings menu. A list of the currently installed plugins is displayed in the Plugin Manager.

To add a plugin, click the Install... button. Browse to the directory containing both the plugin specification file (*.xml) and the object file (*.o). Click OK, and the plugin should be installed.

To remove a plugin, simply highlight the plugin in the Plugin Manager and click Remove. You will be prompted for confirmation.

To quickly refresh the list of plugins displayed in the Plugin Manager, click Rescan. Doing so will remove any plugins no longer present in their specified paths, and add any new plugins in the default plugins directory.

Built-in Plugins

To date, there are more than 25 built-in plugins available in Kst that perform functions from taking cross correlations of two vectors to producing periodograms of a data set. The settings window for every plugin consists of two main sections—an input section and an output section. Each section is composed of a set of scalars and/or vectors. The following screenshot shows the settings window for a typical plugin. The only difference between the different plugins is the set of inputs and outputs, and the mechanism for deriving the outputs from the inputs.


Plugins Windowpluginswindow

The following sections describe the purpose, key algorithms or formulas used to perform calculations, and inputs and outputs for each plugin. Note that fitting and filtering plugins are included in the following sections.

Autocorrelation

The autocorrelation plugin calculates correlation values between a series (vector) and a lagged version of itself, using lag values from floor(-(N-1)/2) to floor((N-1)/2), where N is the number of points in the data set. The time vector is not an input as it is assumed that the data is sampled at equal time intervals. The correlation value r at lag k is:

Autocorrelation formula

Inputs

X Array (vector)

The array x of values to calculate correlation values for.

Outputs

Step Number (vector)

The array of step, or lag values.

Correlation Value (vector)

The array of correlation values calculated using the corresponding step number in the Step Number vector.

Bin

The bin plugin bins elements of a single data vector into bins of a specified size. The value of each bin is the mean of the elements belonging to the bin. For example, if the bin size is 3, and the input vector is [9,2,7,3,4,74,5,322,444,2,1], then the outputted bins would be [6,27,257]. Note that any elements remaining at the end of the input vector that do not form a complete bin (in this case, elements 2 and 1), are simply discarded.

Inputs

Input Vector (vector)

The vector to bin.

Bin Size (scalar)

The size to use for each bin.

Outputs

Bins (vector)

The array of means for each bin.

Butterworth band-pass

The Butterworth band-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula

Autocorrelation formula

where f is the frequency, fc is the low frequency cutoff, b is the bandwidth of the band to pass, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses.

Inputs

X Array (vector)

The array of values to filter.

Order (scalar)

The order of the Butterworth filter to use.

Low cutoff frequency (scalar)

The low cutoff frequency of the Butterworth band pass filter.

Band width (scalar)

The width of the band to pass. This should be the difference between the desired high cutoff frequency and the low cutoff frequency.

Outputs

X Filtered (vector)

The array of filtered data values.

Butterworth band-stop

The Butterworth band-stop plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula

Autocorrelation formula

where f is the frequency, fc is the low frequency cutoff, b is the bandwidth of the band to stop, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses.

Inputs

X Array (vector)

The array of values to filter.

Order (scalar)

The order of the Butterworth filter to use.

Low cutoff frequency (scalar)

The low cutoff frequency of the Butterworth band stop filter.

Band width (scalar)

The width of the band to stop. This should be the difference between the desired high cutoff frequency and the low cutoff frequency.

Outputs

X Filtered (vector)

The array of filtered data values.

Butterworth high-pass

The Butterworth high-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula

Autocorrelation formula

where f is the frequency, fc is the high frequency cutoff, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses.

Inputs

X Array (vector)

The array of values to filter.

Order (scalar)

The order of the Butterworth filter to use.

Cutoff frequency (scalar)

The cutoff frequency of the Butterworth high pass filter.

Outputs

X Filtered (vector)

The array of filtered data values.

Butterworth low-pass

The Butterworth low-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula

Autocorrelation formula

where f is the frequency, fc is the low frequency cutoff, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses.

Inputs

X Array (vector)

The array of values to filter.

Order (scalar)

The order of the Butterworth filter to use.

Cutoff frequency (scalar)

The cutoff frequency of the Butterworth low pass filter.

Outputs

X Filtered (vector)

The array of filtered data values.

Chop

The chop plugin takes an input vector and divides it into two vectors. Every second element in the input vector is placed in one output vector, while all other elements from the input vector are placed in another output vector.

Inputs

Array (vector)

The array of values to perform the chop on.

Outputs

Odd Array (vector)

The array containing the odd part of the input array (i.e. it contains the first element of the input array).

Even Array (vector)

The array containing the even part of the input array (i.e. it does not contain the first element of the input array).

Difference Array (vector)

The array containing the elements of the odd array minus the respective elements of the even array.

Index Array (vector)

An index array the same length as the other three output arrays.

Convolution

The convolution plugin generates the convolution of one vector with another. The convolution of two functions f and g is given by:

The order of the vectors does not matter, since f*g=g*f. In addition, the vectors do not need to be of the same size, as the plugin will automatically extrapolate the smaller vector.

Inputs

Array One (vector)

One of the pair of arrays to take the convolution of.

Array Two (vector)

One of the pair of arrays to take the convolution of.

Outputs

Convolved (vector)

The convolution of the two input vectors.

Crosscorrelation

The crosscorrelation plugin calculates correlation values between two series (vectors) x and y, using lag values from floor(-(N-1)/2) to floor((N-1)/2), where N is the number of elements in the longer vector. The shorter vector is padded to the length of the longer vector using 0s. The time vector is not an input as it is assumed that the data is sampled at equal time intervals. The correlation value r at lag k is:

crosscorrelation formula

Inputs

X Array (vector)

The array x used in the cross-correlation formula.

Y Array (vector)

The array y used in the cross-correlation formula.

Outputs

Step Number (vector)

The array of step, or lag values.

Correlation Value (vector)

The array of correlation values calculated using the corresponding step number in the Step Number vector.

Deconvolution

The deconvolution plugin generates the deconvolution of one vector with another. Deconvolution is the inverse of convolution. Given the convolved vector h and another vector g, the deconvolution f is given by:

The vectors do not need to be of the same size, as the plugin will automatically extrapolate the shorter vector. The shorter vector is assumed to be the response function g.

Inputs

Array One (vector)

One of the pair of arrays to take the deconvolution of.

Array Two (vector)

One of the pair of arrays to take the deconvolution of.

Outputs

Deconvolved (vector)

The deconvolution of the two input vectors.

Fit exponential weighted

The Fit exponential weighted plugin performs a weighted non-linear least-squares fit to an exponential model:

An initial estimate of a=1.0, =0, and b=0 is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array of weights to use for the fit.

Outputs

Y Fitted (vector)

The array of fitted y values.

Residuals (vector)

The array of residuals.

Parameters (vector)

The best fit parameters a, , and b.

Covariance (vector)

The covariance matrix of the model parameters, returned row after row in the vector.

chi^2/nu (scalar)

The weighted sum of squares of the residuals, divided by the degrees of freedom.

Fit exponential

The Fit exponential plugin is identical in function to the Fit exponential weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit gaussian weighted

The Fit gaussian weighted plugin performs a weighted non-linear least-squares fit to a Gaussian model:

An initial estimate of a=(maximum of the y values), =(mean of the x values), and =(the midpoint of the x values) is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array of weights to use for the fit.

Outputs

Y Fitted (vector)

The array of fitted y values.

Residuals (vector)

The array of residuals.

Parameters (vector)

The best fit parameters , , and a.

Covariance (vector)

The covariance matrix of the model parameters, returned row after row in the vector.

chi^2/nu (scalar)

The weighted sum of squares of the residuals, divided by the degrees of freedom.

Fit gaussian

The Fit gaussian plugin is identical in function to the Fit gaussian weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit gradient weighted

The gradient weighted plugin performs a weighted least-squares fit to a straight line model without a constant term:

The best-fit is found by minimizing the weighted sum of squared residuals:

for b, where wi is the weight at index i.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array containing weights to be used for the fit.

Outputs

Y Fitted (vector)

The array of y values for the points representing the best-fit line.

Residuals (vector)

The array of residuals, or differences between the y values of the best-fit line and the y values of the data points.

Parameters (vector)

The parameter b of the best-fit.

Covariance (vector)

The estimated covariance matrix, returned row after row, starting with row 0.

Y Lo (vector)

The corresponding value in Y Fitted minus the standard deviation of the best-fit function at the corresponding x value.

Y Hi (vector)

The corresponding value in Y Fitted plus the standard deviation of the best-fit function at the corresponding x value.

chi^2/nu (scalar)

The value of the sum of squares of the residuals, divided by the degrees of freedom.

Fit gradient

The Fit linear plugin is identical in function to the Fit gradient weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit linear weighted

The Fit linear weighted plugin performs a weighted least-squares fit to a straight line model:

The best-fit is found by minimizing the weighted sum of squared residuals:

for a and b, where wi is the weight at index i.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array containing weights to be used for the fit.

Outputs

Y Fitted (vector)

The array of y values for the points representing the best-fit line.

Residuals (vector)

The array of residuals, or differences between the y values of the best-fit line and the y values of the data points.

Parameters (vector)

The parameters a and b of the best-fit.

Covariance (vector)

The estimated covariance matrix, returned row after row, starting with row 0.

Y Lo (vector)

The corresponding value in Y Fitted minus the standard deviation of the best-fit function at the corresponding x value.

Y Hi (vector)

The corresponding value in Y Fitted plus the standard deviation of the best-fit function at the corresponding x value.

chi^2/nu (scalar)

The value of the sum of squares of the residuals, divided by the degrees of freedom.

Fit linear

The Fit linear plugin is identical in function to the Fit linear weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit lorentzian weighted

The Fit lorentzian weighted plugin performs a weighted non-linear least-squares fit to a Lorentzian model:

An initial estimate of a=(maximum of the y values), x0=(mean of the x values), and =(the midpoint of the x values) is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array of weights to use for the fit.

Outputs

Y Fitted (vector)

The array of fitted y values.

Residuals (vector)

The array of residuals.

Parameters (vector)

The best fit parameters x0, , and a.

Covariance (vector)

The covariance matrix of the model parameters, returned row after row in the vector.

chi^2/nu (scalar)

The weighted sum of squares of the residuals, divided by the degrees of freedom.

Fit lorentzian

The Fit lorentzian plugin is identical in function to the Fit lorentzian weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit polynomial weighted

The Fit polynomial weighted plugin performs a weighted least-squares fit to a polynomial model:

where n is the degree of the polynomial model.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array of weights to use for the fit.

Order (scalar)

The order, or degree, of the polynomial model to use.

Outputs

Y Fitted (vector)

The array of fitted y values.

Residuals (vector)

The array of residuals.

Parameters (vector)

The best fit parameters c0, c1,..., cn.

Covariance (vector)

The covariance matrix of the model parameters, returned row after row in the vector.

chi^2/nu (scalar)

The weighted sum of squares of the residuals, divided by the degrees of freedom.

Fit polynomial

The Fit polynomial plugin is identical in function to the Fit polynomial weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Fit sinusoid weighted

The Fit sinusoid weighted plugin performs a least-squares fit to a sinusoid model:

where T is the specified period, and n=2+2H, where H is the specified number of harmonics.

Inputs

X Array (vector)

The array of x values for the data points to be fitted.

Y Array (vector)

The array of y values for the data points to be fitted.

Weights (vector)

The array of weights to use for the fit.

Harmonics (scalar)

The number of harmonics of the sinusoid to fit.

Period (scalar)

The period of the sinusoid to fit.

Outputs

Y Fitted (vector)

The array of fitted y values.

Residuals (vector)

The array of residuals.

Parameters (vector)

The best fit parameters c0, c1,..., cn.

Covariance (vector)

The covariance matrix of the model parameters, returned row after row in the vector.

chi^2/nu (scalar)

The weighted sum of squares of the residuals, divided by the degrees of freedom.

Fit sinusoid

The Fit sinusoid plugin is identical in function to the Fit sinusoid weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist.

Interpolation Akima spline

The Interpolation Akima spline plugin generates a non-rounded Akima spline interpolation for the supplied data set, using natural boundary conditions.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Interpolation Akima spline periodic

The kstinterp akima periodic plugin generates a non-rounded Akima spline interpolation for the supplied data set, using periodic boundary conditions.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Interpolation cubic spline

The Interpolation cubic spline plugin generates a cubic spline interpolation for the supplied data set, using natural boundary conditions.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Interpolation cubic spline periodic

The Interpolation cubic spline periodic plugin generates a cubic spline interpolation for the supplied data set, using periodic boundary conditions.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Interpolation linear

The Interpolation linear plugin generates a linear interpolation for the supplied data set.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Interpolation polynomial

The Interpolation polynomial plugin generates a polynomial interpolation for the supplied data set. The number of terms in the polynomial used is equal to the number of points in the supplied data set.

Inputs

X Array (vector)

The array of x values of the data points to generate the interpolation for.

Y Array (vector)

The array of y values of the data points to generate the interpolation for.

X' Array (vector)

The array of x values for which interpolated y values are desired.

Outputs

Y Interpolated (vector)

The interpolated y values.

Noise Addition

The Noise addition plugin adds a Gaussian random variable to each element of the input vector. The Gaussian distribution used has a mean of 0 and the specified standard deviation. The probability density function of a Gaussian random variable is:

Inputs

Array (vector)

The array of elements to which random noise is to be added.

Sigma (scalar)

The standard deviation to use for the Gaussian distribution.

Outputs

Output Array (vector)

The array of elements with Gaussian noise added.

Periodogram

The periodogram plugin produces the periodogram of a given data set. One of two algorithms is used depending on the size of the data set—a fast algorithm is used if there are greater than 100 data points, while a slower algorithm is used if there are less than or equal to 100 data points.

Inputs

Time Array (vector)

The array of time values of the data points to generate the interpolation for.

Data Array (vector)

The array of data values, dependent on the time values, of the data points to generate the interpolation for.

Oversampling factor (scalar)

The factor to oversample by.

Average Nyquist frequency factor (scalar)

The average Nyquist frequency factor.

Outputs

Frequency (vector)

The frequency vector.

Periodogram (vector)

The frequency response vector for the periodogram.

Statistics

The statistics plugin calculates statistics for a given data set. Most of the output scalars are named such that the values they represent should be apparent. Standard formulas are used to calculate the statistical values.

Inputs

Data Array (vector)

The array of data values to calculate statistics for.

Outputs

Mean (scalar)

The mean of the data values.

Minimum (scalar)

The minimum value found in the data array.

Maximum (scalar)

The maximum value found in the data array.

Variance (scalar)

The variance of the data set.

Standard deviation (scalar)

The standard deviation of the data set.

Median (scalar)

The median of the data set.

Absolute deviation (scalar)

The absolute deviation of the data set.

Skewness (scalar)

The skewness of the data set.

Kurtosis (scalar)

The kurtosis of the data set.

Chapter 7. The Toolbar and Keyboard Shortcuts

This chapter describes miscellaneous time-saving and convenience features available in Kst.

The Toolbar

The toolbar provides one-click access to commonly used menu functions in Kst. To toggle the toolbar, select Show Toolbar from the Settings menu.

The Toolbar Menu

The toolbar menu, accessible by right-clicking anywhere on the toolbar, contains functions for modifying the layout, appearance, and behaviour of the toolbar. The three submenus available are described below.

Orientation

The Orientation submenu contains layout options for the toolbar.

Top, Left, Right, and Bottom

Docks the toolbar at the corresponding edge of the Kst window.

Flat

Hides the toolbar and turns it into a slim bar at the top of Kst window. To unhide the toolbar, click on the “gripper” that is still visible.

You can also move the toolbar by dragging the gripper on the edge of the toolbar. Dragging the toolbar close to an edge of the Kst window docks it. Dragging the toolbar anywhere else turns it into a floating toolbar.

Text Position

The Text Position submenu specifies if and how text and icons should be displayed on the toolbar.

Icons Only

Does not display any text labels and only displays icons. However, the text for each icon is still available as a tooltip associated with the icon (viewable by momentarily holding the cursor of the icon).

Text Only

Does not display any icons on the toolbar, but displays all text labels.

Text Alongside Icons

Displays all icons. Text labels are displayed to the right of the icons.

Text Under Icons

Displays all icons. Text labels are displayed underneath the icons.

Icon Size

The Icon Size submenu specifies the size of the icons on the toolbar. Select a size from the submenu, or select Default to use the default size (usually the same as Medium). The options in this menu do not have any effect if Text Only is selected for Text Position.

Custom Shortcut Keys

You can create custom shortcut keys to make working in Kst more efficient. To modify the shortcut keys, select Configure Shortcuts... from the Settings menu. The following dialog will be displayed.


Configure Shortcuts Window

A list of available actions and their associated shortcuts are shown in the dialog. Each action is allowed two shortcuts—a primary shortcut and an alternate shortcut. Either shortcut can be used at any time. To define or change a shortcut for an action, simply highlight the appropriate row in the shortcut list. Under Shortcut for Selected Action, there are three choices:

None

Select this option to disable any shortcut keys for the selected action.

Default

Select this option to use the default shortcut key(s) for the selected action. Note that not all actions have default shortcuts defined.

Custom

Select this option to define a custom shortcut for the selected action.

If you select the Custom option, the Define Shortcut dialog will appear (alternatively, you can also click on the key-shaped button to open the dialog).


Define Shortcut Window

By default, the Auto-close option is checked, so once a key combination is entered, the key combination will be automatically saved and the dialog closed. You can uncheck this option if you wish to experiment with the dialog.

To define a key combination, select Primary or Alternate. If you wish to define a key sequence, check the Multi-key option. Now enter the key combination or sequence to be used for this action. Click OK when you are done.

Tip

When using shortcuts defined with the multi-key option, a small menu is displayed after the first key of the shortcut is pressed, showing the possible shortcut key completions. Pressing additional keys of the shortcut further filters the list. This list can be a useful reminder of the defined shortcuts.

Note

The action associated with a multi-key shortcut is performed as soon as only one action matches the keys pressed so far. For example, if a multi-key shortcut of A B C is defined, and no other multi-key shortcuts are defined, the action associated with the shortcut will be performed as soon as A is pressed.

Chapter 8. Licensing

This documentation is licensed under the terms of the GNU Free Documentation License.

Appendix A. Command Line Usage and Examples

Barth Netterfield <kst@omega.astro.utoronto.ca>

A typical use of kst is from the command line to make X-Y plots of data files. kst can read ascii data, or readdata compatible binary files.

Command Line Synopsis

The options are:

kst [Qt-options] [KDE-options] [options] [file...]

[file...]

A .kst file, or one or more data files. Supported formats are ASCII columns, BOOMERANG frame files, or BLAST dirfile files. A .kst files stores all options that can be set by other flags. The following flags can be used to override the options set in the .kst file: -F datafile, -n NS, -s NS, -f F0, -a. The rest can not be overridden. If an override flag is given, it is applied to all vectors in the plot.

ASCII data from stdin can be plotted by including "stdin" in the list [file...].

-y Y

The source for the Y axis data. For ASCII files, this is the column. For binary files, this is the field name. To plot multiple curves, this may be specified multiple times. The same source file, sample ranges, and X axis data are assumed.

-e E

Error bars for Y axis data. For ASCII file, refer to the column holding the data. For binary files use the field name. If multiple -y Y options are given, this may also be used multiple times. Individual Y entries are associated in order with multiple E entries.

-x X

The source for the X axis data. For ASCII files, this is the column. For readata files, this is the field name. If this option is not specified, the row number in the file is used. This option can only be given once.

-p P

The source for power spectra. For ASCII files, this is the column. For binary files, this is the field name. To plot power spectra of multiple curves, this may be specified multiple times. The same source file, sample ranges and fft lengths are used for all Power Spectra requested from the command line.

-l P

The length of the FFT used in power specra estimation is 2^P.

-h H

The source for histograms. For ASCII files, this is the column. For binary files, this is the field name. Multiple histograms can be defined from the command line.

-m NC

Used when multiple curves have been defined. Rather than plotting all curves in the same plot, plot each in its own plot,

-f F0

The starting frame number (for readdata files) or row (for ASCII files) to read.

-n

The number of frames (for readdata files) or rows (for ASCII files) to read.

-s NS

The number of frames or rows to skip each read. This is useful when working with very large data files, to speed up response and conserve memory, in the case that the data are slowly varying.

-a

Used in with the -s NS: rather than skipping each NS frames, average them. This provides a combination of very basic high pass filtering, and memory conservation.

-F Datafile

Override the file to read the data from for all vectors listed in the .kst file. Can only be used in conjunction with a kst file.

--print psfile

Rather than displaying the plot, export the image to a postscript file and exit. *BUG note: even though no windows are opened on screen, access to the X server is still required.*

--png pngfile

Rather than displaying the plot, export the image to a png file of dimensions 640x480 and exit. *BUG note: even though no windows are opened on screen, access to the X server is still required.*

Command Line Examples

Several examples of typical use follow.

To plot column 1 a file (tmp.dat) of ASCII data:

kst -y 1 tmp.dat

To plot column 2, 3, and 4 vs. column 1 of an ASCII file, in 1 plot:

kst -x 1 -y 2 -y 3 -y 4 tmp.dat

To plot column 2, 3, and 4 vs. column 1 of an ASCII file, in 3 plots, arranged in 1 column:

kst -x 1 -y 2 -y 3 -y 4 -m 1 tmp.dat

To plot 500 rows of column 2 of an ASCII file, starting at line 100:

kst -y 2 -f 100 -n 500 tmp.dat

To plot the first 100,000 rows of column 2 of an ASCII file, averaging every 100 rows:

kst -y 2 -f 0 -n 100000 -s 100 -a tmp.dat

Appendix B. Creating Additional Plugins

Kst has a simple and standardized interface that facilitates easy creation of additional plugins. In addition to detailing basic requirements for plugins, the following sections describe how to make use of pre-written header files to create certain types of plugins.

Creating a Basic Plugin

A Kst plugin consists of two files—an XML file and a shared object file.

The XML File

The XML file provide information about the plugin and describes its inputs and outputs. The following is an example of an XML file for a Kst plugin:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Module SYSTEM "file:/Repository/Level2/Soft/ProC/moduledef.dtd">

<module>

<intro>
<modulename name="testplugin"/>    <!-- The name of the module -->
<author name="Rick Chern"/> <!-- The name of the author -->
<description text="A test plugin for me"/> <!-- A description of the module -->
<version minor="1" major="0"/>  <!-- The version number of the module -->
<state devstate="release"/>     <!-- The development state of the module (optional)-->
</intro>

<interface>

<!--inputs here-->
<input>
<table type="float" name="Input Vector 1" descr="The first input vector" />
</input>

<input>
<float name="Input Scalar 1" descr="The first input scalar" />
</input>

<!--outputs here-->
<output>
<table type="float" name="Output Vector 1" descr="The first output vector" />
</output>

<output>
<float name="Output Scalar 1" descr="The first output scalar" />
</output>

</interface>

</module>

Generally, you can use the example above as a template and modify sections to fit your needs. As can be seen from the example, the XML file consists of one module node. The module node has an intro node and an interface node. You should modify the intro node appropriately using the comments in the above XML file as guides. It is important that modulename has the name attribute set to the same name that your shared object file will use.

The interface node describes the actual inputs and outputs of the plugin. Each input is described by an input node, and each output is described by an output node. Each input or output should have either a table or a float node as a child. The type attribute of a table must be set to "float". Note that the order of the inputs and outputs matters—the order is used to determine the index values for each input and output array of the object file, and is the same order used to display the input and output fields in the Kst plugin interface.

Once you have completed the XML file, save it as [modulename].xml, where [modulename] is the value of the name attribute of the modulename node.

The Shared Object File

The shared object file contains the actual functionality of the plugin. In other words, it determines how to derive the outputs from the given inputs. The following are the requirements for the shared object file:

  • The object must export the following C linkage symbol:

    int symbol(const double *const inArrays[],
               const int inArrayLens[],
               const double inScalars[],
               double *outArrays[],
               int outArrayLens[],
               double outScalars[])

    where symbol must be the value of the name attribute of the modulename node in the XML file. This is the only function that will be called by Kst (although you may have other functions). The following describes each argument of this function:

    const double *const inArrays[]

    The array of input arrays. Each input array corresponds to an input vector. The arrays are in the same order as the vectors are listed in the XML file, so inArrays[0] is the array representing the first input vector, inArrays[1] is the array representing the second input vector, and so on.

    const int inArraysLens[]

    The array containing array lengths for each input array. The lengths are stored in the same order as the arrays in inArrays[] (e.g. inArrayLens[0] is the length of inArrays[0]).

    const double inScalars[]

    The array of input scalars. The scalars are stored in the same order as they are listed in the XML file.

    double *outArrays[]

    The array of output arrays. Each output array corresponds to an output vector, and the arrays should be in the same order as the output vectors are listed in the XML file.

    int outArrayLens[]

    The array that should contain lengths of the output arrays. The lengths should be stored in the same order as the arrays in outArrays[].

    double outScalars[]

    The array of output scalars. The scalars should be in the same order they are listed in the XML file.

  • The function must return 0 if it executed successfully, and -1 otherwise.

  • The code for the object file must handle unexpected inputs, such as empty input arrays (in most cases a return value of -1 would be sufficient when such situations are encountered).

  • The number and type of outputs must be exactly as specified by the XML file.

  • You will probably need to resize the arrays in outArrays[]. To do so, use the realloc() function. E.g.,

    outArrays[0]=(double*)realloc(outArrays[0], 5*sizeof(double));
    

    will allocate space for 5 doubles for outArrays[0]. Do not use any memory allocator other than realloc().

  • The input arguments must remain constant. Do not cast them to non-constant types.

The following is an example of the shared object file source code for a simple plugin:

#include <stdlib.h>

extern "C" int testplugin(const double *const inArrays[], const int inArrayLens[],
                const double is[],
                double *outArrays[], int outArrayLens[],
                double outScalars[]);

int testplugin(const double *const inArrays[], const int inArrayLens[],
                const double is[],
                double *outArrays[], int outArrayLens[],
                double outScalars[])

//Accept 1 vector and 1 scalar. Multiply all elements of the vector by the
//scalar, and output the resulting vector. Also output the original scalar.
{
	//Set the outputs
	outArrayLens[0]=inArrayLens[0];

	//resize the output arrays
	outArrays[0]=(double*)realloc(outArrays[0], inArrayLens[0]*sizeof(double));

	//multiply each element of the input vector
	//by the scalar
	for (int i=0; i<inArrayLens[0]; i++)
	{
		outArrays[0][i]=inArrays[0][i] * is[0];
	}

	//now set the output scalar
	outScalars[0]=is[0];

	return 0;
}

Compiling the Plugin

If you are using gcc to compile your plugin, simply compile the object file:

cc -Wall -c -o myplugin.o myplugin.c -fPIC -DPIC

and then create the shared library:

ld -o myplugin.so -shared myplugin.o

The resulting *.so file and *.xml file must be put in the same directory. When you use Kst's Plugin Manager to load the XML file, it will automatically look for the shared object file in the same directory.

Creating Linear Fit Plugins

To create a linear fit plugin, you could implement your own fitting algorithms and output the appropriate vectors. However, Kst already comes with header files that make it easy for you to implement linear least-squares fit plugins by just providing a few functions. This section will describe how to take advantage of these files.

Header Files

Two header files are provided for performing linear fits, linear.h (for unweighted linear fits) and linear_weighted.h (for weighted linear fits). They are both located under kst/plugins/fits/ in the Kst source tarball. To use these files, include only one of them in the source code for your plugin:

#include <../linear.h>
or
#include <../linear_weighted.h>
(by convention, we will place the source code for the plugin one directory below where the header files are).

Implementing Required Functions

Given a general linear model:

where y is a vector of n observations, X is an n by p matrix of predictor variables, and c is the vector of p best-fit parameters that are to be estimated, the header files provide functions for estimating c for a given y and X. To provide X, the following function needs to be implemented in the source code for the plugin:

double calculate_matrix_entry( double dX, int iPos )

This function should return the value of the entry in column iPos of the matrix of predictor variables, using x value dX. This function will be called by linear.h or linear_weighted.h. The implementation of this function depends on the model you wish to use for the fit, and is unique to each linear fit plugin. For example, to fit to a polynomial model, calculate_matrix_entry could be implemented as follows:

double calculate_matrix_entry( double dX, int iPos ) {
  double dY;
  dY = pow( dX, (double)iPos );
  return dY;
}

Calling the Fitting Functions

Once the appropriate header file has been included and calculate_matrix_entry has been implemented, call the appropriate fitting function included from the header file:

kstfit_linear_unweighted( inArrays, inArrayLens,
                          outArrays, outArrayLens,
                          outScalars, iNumParams );
or
kstfit_linear_weighted( inArrays, inArrayLens,
                        outArrays, outArrayLens,
                        outScalars, iNumParams );

Each function will return 0 on success, or -1 on error, so it is a good idea to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows:

  • inArrays[0] must contain the array of x coordinates of the data points

  • inArrays[1] must contain the array of y coordinates of the data points

  • inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit.

The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin.

iNumParams is the number of parameters in the fitting model used, which should be equal to the number of columns in the matrix X of predictor variables. iNumParams must be set correctly before the fitting function is called.

After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows:

  • outArrays[0] will contain the array of fitted y values.

  • outArrays[1] will contain the array of residuals.

  • outArrays[2] will contain the array of best-fit parameters that were estimated.

  • outArrays[3] will contain the covariance matrix, returned row after row in an array.

  • outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom.

outArrayLens will be correctly set to indicate the length of each output array.

Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function).

Example

The following is an example of the source code for a linear fit plugin.

/*
 *  Polynomial fitting plugin for KST.
 *  Copyright 2004, The University of British Columbia
 *  Released under the terms of the GPL.
 */

#include "../linear.h"

double calculate_matrix_entry( double dX, int iPos ) {
  double dY;

  dY = pow( dX, (double)iPos );

  return dY;
}

extern "C" int kstfit_polynomial_unweighted(
  const double *const inArrays[],
  const int inArrayLens[],
  const double inScalars[],
  double *outArrays[], int outArrayLens[],
  double outScalars[]);

int kstfit_polynomial_unweighted(
  const double *const inArrays[],
  const int inArrayLens[],
	const double inScalars[],
	double *outArrays[], int outArrayLens[],
	double outScalars[])
{
  int iRetVal = -1;
  int iNumParams;

  iNumParams = 1 + (int)floor( inScalars[0] );
  if( iNumParams > 0 ) {
    iRetVal = kstfit_linear_unweighted( inArrays, inArrayLens,
                                        outArrays, outArrayLens,
                                        outScalars, iNumParams );
  }

  return iRetVal;
}

Creating Non-linear Fit Plugins

Kst provides header files designed to simplify the creation of non-linear least-squares fit plugins. The following sections detail the use of the header files.

Header Files and Definitions

The non-linear fit header files are located in kst/plugins/fits_nonlinear of the Kst source tarball. The files are named non_linear.h and non_linear_weighted.h for unweighted and weighted fits, respectively. To use these files, include only one of them in the source code for your plugin:

#include <../non_linear.h>
or
#include <../non_linear_weighted.h>
(by convention, we will place the source code for the plugin one directory below where the header files are).

As non-linear fitting is an iterative process, you must also define the maximum number of iterations that should be performed. The non-linear fitting algorithm will stop when at least one of the following conditions is true:

  • The maximum number of iterations has been reached.

  • A precision of 10-4 has been reached.

In addition, you need to define the number of parameters in the model, as it is not passed to the fitting function explicitly. To define these two values, include the following at the top of your source code:

#define NUM_PARAMS [num1]
#define MAX_NUM_ITERATIONS [num2]

replacing [num1] with the number of parameters in the model, and [num2] with the maximum number of iterations to perform.

Implementing Required Functions

To use the header files for non-linear fits, you must provide the function to use as the model, the partial derivatives of the function with respect to each parameter, and initial estimates of the best-fit parameters. To do this, three functions must be implemented. These functions are described below.

double function_calculate( double dX, double* pdParameters )

This function calculates the y value of the fitting model for a given x value dX, using the supplied array of parameters pdParameters. The order of parameters in pdParameters is arbitrary, but should be consistent with the other two implemented functions. For example, for an exponential model, function_calculate could be implemented as follows:

double function_calculate( double dX, double* pdParameters ) {
  double dScale	 = pdParameters[0];
  double dLambda = pdParameters[1];
  double dOffset = pdParameters[2];
  double dY;

  dY  = ( dScale * exp( -dLambda * dX ) ) + dOffset;

  return dY;
}
void function_derivative( double dX, double* pdParameters, double* pdDerivatives )

This function calculates the partial derivatives of the model function for a give value of x dX. The partial derivatives should be returned in pdDerivatives. The order of the partial derivatives in the array pdDerivatives should correspond to the order of the parameters in pdParameters (i.e. if pdParameters[0] contains the parameter lambda for an exponential model, pdDerivatives[0] should contain the derivative of the model with respect to lambda).

void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates )

This function provides an initial estimate of the best-fit parameters to the fitting function. The array of x values and y values of the data points are provided in pdX and pdY respectively, and the number of data points is provided by iLength. You can use any or none of these parameters at your discretion to calculate the initial estimate. The function should put the calculated initial estimates in pdParameterEstimates, with the order of the estimates corresponding to the order of the parameters in pdParameters of function_calculate and function_derivative. Keep in mind that the initial estimate is important in determining whether or not the fitting function converges to a solution.

Calling the Fitting Functions

Once all the required functions have been implemented, the fitting function from the included header file can be called:

kstfit_nonlinear( inArrays, inArrayLens,
		  inScalars, outArrays,
		  outArrayLens, outScalars );
or
kstfit_nonlinear_weighted( inArrays, inArrayLens,
                           inScalars, outArrays,
                           outArrayLens, outScalars );
depending on whether you are implementing a non-weighted fit or a weighted fit.

The function will return 0 on success, or -1 on error, so it is simplest to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows:

  • inArrays[0] must contain the array of x coordinates of the data points

  • inArrays[1] must contain the array of y coordinates of the data points

  • inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit.

The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin.

After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows:

  • outArrays[0] will contain the array of fitted y values.

  • outArrays[1] will contain the array of residuals.

  • outArrays[2] will contain the array of best-fit parameters that were estimated.

  • outArrays[3] will contain the covariance matrix, returned row after row in an array.

  • outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom.

outArrayLens will be correctly set to indicate the length of each output array.

Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function).

Example

The following is an example of a non-linear fit plugin that performs a fit to an exponential model.

/*
 *  Exponential fit plugin for KST.
 *  Copyright 2004, The University of British Columbia
 *  Released under the terms of the GPL.
 */

#define NUM_PARAMS 3
#define MAX_NUM_ITERATIONS 500

#include "../non_linear.h"

void function_initial_estimate( const double* pdX, const double* pdY,
                                int iLength, double* pdParameterEstimates ) {
  KST_UNUSED( pdX )
  KST_UNUSED( pdY )
  KST_UNUSED( iLength )

  pdParameterEstimates[0] =  1.0;
  pdParameterEstimates[1] =  0.0;
  pdParameterEstimates[2] =  0.0;
}

double function_calculate( double dX, double* pdParameters ) {
  double dScale	 = pdParameters[0];
  double dLambda = pdParameters[1];
  double dOffset = pdParameters[2];
  double dY;

  dY  = ( dScale * exp( -dLambda * dX ) ) + dOffset;

  return dY;
}

void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) {
  double dScale	 = pdParameters[0];
  double dLambda = pdParameters[1];
  double dExp;  
  double ddScale;
  double ddLambda;
  double ddOffset;
  
  dExp     = exp( -dLambda * dX );
  ddScale  = dExp;
  ddLambda = -dX * dScale * dExp;
  ddOffset = 1.0;

  pdDerivatives[0] = ddScale;
  pdDerivatives[1] = ddLambda;
  pdDerivatives[2] = ddOffset;
}

extern "C" int kstfit_exponential(const double *const inArrays[], const int inArrayLens[],
		const double inScalars[],
		double *outArrays[], int outArrayLens[],
		double outScalars[]);

int kstfit_exponential(const double *const inArrays[], const int inArrayLens[],
		const double inScalars[],
		double *outArrays[], int outArrayLens[],
		double outScalars[])
{
  return kstfit_nonlinear( inArrays, inArrayLens,
                           inScalars, outArrays,
			   outArrayLens, outScalars );
}

Creating Pass Filter Plugins

Kst provides header files to simplify the implementation of pass filter plugins. The use of these header files is described below.

Header Files

The pass filter header file is located in kst/plugins/pass_filters of the Kst source tarball. The file is named filters.h To use this file, include it in the source code for your plugin:

#include <../filters.h>
(by convention, we will place the source code for the plugin one directory below where the header files are).

Required Functions

The filters.h header file contains a single function that calculates the Fourier transform of a supplied function, applies the supplied filter to the Fourier transform, and then calculates the inverse Fourier transform of the filtered Fourier transform. To supply the filter, the following function needs to be implemented in the source code for your plugin:

double filter_calculate( double dFreqValue, const double inScalars[] )

This function should calculate the filtered amplitude for the frequency dFreqValue. inScalars[] will contain the unaltered input scalars for the plugin, specified in the XML file. Most likely inScalars[] will contain cutoff frequencies or other properties of the filter. For example, to implement a Butterworth high-pass filter, filter_calculate could be implemented as follows:

double filter_calculate( double dFreqValue, const double inScalars[] ) {
  double dValue;
  if( dFreqValue > 0.0 ) {
    dValue = 1.0 / ( 1.0 +
    		pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) );
  } else {
    dValue = 0.0;
  }
  return dValue;
}

Calling the Filter Function

Once the required filter_calculate has been implemented, the filter function from the header file can be called:

kst_pass_filter( inArrays,
                 inArrayLens,
                 inScalars,
                 outArrays,
                 outArrayLens,
                 outScalars );

The arguments supplied to the exported C function can usually be passed to kst_pass_filter without modification. However, there are a few restrictions on the arguments:

  • inArrays[0] must contain the array of data to filter.

  • inScalars should contain the filter-specific parameters to be used by the filter_calculate function.

After the function call, outArrays[0] will contain the filtered array of data, and outArrayLens will be set appropriately. The kst_pass_filter function does not use outScalars.

Example

The following is an example of a pass filter plugin that implements the Butterworth high-pass filter.

/*
 *  Butterworth low pass filter plugin for KST.
 *  Copyright 2004, The University of British Columbia
 *  Released under the terms of the GPL.
 */

#include <stdlib.h>
#include <math.h>
#include "../filters.h"

extern "C" int butterworth_highpass(const double *const inArrays[], const int inArrayLens[],
		const double inScalars[],
		double *outArrays[], int outArrayLens[],
		double outScalars[]);

int butterworth_highpass(const double *const inArrays[], const int inArrayLens[],
		const double inScalars[],
		double *outArrays[], int outArrayLens[],
		double outScalars[])
{
  int iReturn;

  iReturn = kst_pass_filter( inArrays,
                             inArrayLens,
                             inScalars,
                             outArrays,
                             outArrayLens,
                             outScalars );

  return iReturn;
}

double filter_calculate( double dFreqValue, const double inScalars[] ) {
  double dValue;

  if( dFreqValue > 0.0 ) {
    dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) );
  } else {
    dValue = 0.0;
  }

  return dValue;
}

Appendix C. Supporting Additional File Formats

This section describes how to create additional readers for unsupported file formats. If you are not already familiar with data source concepts, please read Data Source Concepts

Creating Datasource Readers

If you wish to use a file format other than those currently supported, you might choose to write custom datasource readers.

All Kst datasource readers are regular KDE plugins. Like all KDE plugins, each datasource reader must have a shared object file and a *.desktop file. Before writing the reader, the library name of the plugin must be decided. This name must be a valid variable name in C, as it will be used in the function names of the shared object. For example, the library name of the reader for ASCII files is “ascii”.

Note

KDE plugins are not the same as the Kst plugins used to manipulate data. All references to plugins in this section are to KDE plugins.

The Shared Object

A datasource reader should be a subclass of the abstract KstDataSource class. Ensure that you include the header file for KstDataSource in the source code for your datasource reader:

#include <kstdatasource.h>
There are certain requirements that a datasource reader must meet. One requirement concerns the presence of exported C functions. Other requirements are consequences of the fact that datasource readers inherit from KstDataSource. Both sets of requirements, along with suggestions and general explanations, are provided in the following sections.

Exported C Functions

The exported C functions are listed below. In the following examples, all instances of <libname> should be replaced with the actual library name of the plugin.

KstDataSource *create_<libname>(const QString& filename, const QString& type)

This function should create a new datasource reader of type <libname>, where <libname> is the library name of the plugin. A pointer of type KstDataSource to the new reader should be returned.

bool understands_<libname>(const QString& filename)

This function should return true if the file specified by filename is of a valid type supported by this reader, and false otherwise. The function should check the contents of the file for validity, and not rely on any filename extensions.

QStringList provides_<libname>()

This function should return a QStringList of the file types supported by this reader. The strings returned are arbitrary, but should be descriptive of and appropriate for the actual file types.

Protected Member Variables

KstDataSource contains various protected member variables that the custom datasource reader can use. These variables are described below.

bool _valid

This variable should be true if the custom datasource reader is valid. Most likely the reader will be valid, unless there is an error condition (such as the data file being unreadable by the reader). This variable is used by the isValid() function of KstDataSource, which is usually not reimplemented in subclasses.

QStringList _fieldList

This variable should hold a list of the field names in the data source.

QString _filename

This variable should hold the name of the data file this datasource reader is associated with.

QString _source

This variable should hold the type name of the source.

Virtual Functions

The KstDataSource class contains many virtual functions that should be redefined in the custom datasource reader. These functions are in the template files template.h and template.cpp, listed in the Example Templates section. Descriptions of the functions follow.

TemplateSource(const QString&amp; filename, const QString&amp; type)

The constructor for the datasource reader. filename is the name of the file to read data from, and type is the type of data the file contains. This constructor should most likely invoke the KstDataSource constructor in the constructor initializer list, and probably call the update function listed below to initialize member variables. In particular, the bool _valid variable should be set appropriately.

virtual ~TemplateSource()

The destructor for the datasource reader. Any dynamically allocated memory should be freed.

virtual KstObject::UpdateType update(int = -1)

This function should read any new data entered in the data file since the last time update was called, and update the member variables appropriately. The function should return KstObject::UPDATE if the file contained changes, or KstObject::NO_CHANGE otherwise.

virtual int readField(double *v, const QString &field, int s, int n)

This function should read n frames of data, starting at frame s from the field specified by the field name field, and return the contents in the array v. If n is less than 0, the function should instead read 1 sample starting at frame s. The number of frames that were read should be returned.

virtual bool isValidField(const QString &field) const

This function should return true of the field specified by the field name field is a valid field in the current data source, or false if the field is not a valid field.

virtual int samplesPerFrame(const QString& field)

This function should return the ratio of samples per frame for the field specified by the field name field. For data sources that do not make use of this concept, the number of samples per frame can be set to 1.

virtual int frameCount() const

This function should return the total number of frames in the data source, as of the last time update was called.

virtual QString fileType() const

This function should return the file type of the data file currently being used, usually the same as the type parameter that was passed to the constructor. Alternatively, it can contain an error message (to indicate, for example, that the file is not valid).

virtual void save(QTextStream &ts)

This function should save the file description information to ts. In most cases the implementation provided by KstDataSource should be sufficient.

Example Templates

In general, the following two template files can be used to create new shared object files. Simply modify the function bodies as appropriate for your particular data source.

/***************************************************************************
                  template.h  -  data source plugin template
                             -------------------
    begin                : Fri Oct 17 2003
    copyright            : (C) 2003 The University of Toronto
    email                :
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can 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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef TEMPLATE_H
#define TEMPLATE_H

#include &lt;kstdatasource.h&gt;


class TemplateSource : public KstDataSource {
public:
  TemplateSource(const QString& filename, const QString& type);

  virtual ~TemplateSource();

  virtual KstObject::UpdateType update(int = -1);

  virtual int readField(double *v, const QString &field, int s, int n);

  virtual bool isValidField(const QString &field) const;

  virtual int samplesPerFrame(const QString &field);

  virtual int frameCount() const;

  virtual QString fileType() const;

  virtual void save(QTextStream &ts);
};


#endif

/***************************************************************************
                    template.cpp  -  data source template
                             -------------------
    begin                : Fri Oct 17 2003
    copyright            : (C) 2003 The University of Toronto
    email                :
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can 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.                                   *
 *                                                                         *
 ***************************************************************************/

#include "template.h"


TemplateSource::TemplateSource(const QString& filename, const QString& type)
: KstDataSource(filename, type) {
}


TemplateSource::~TemplateSource() {
}


KstObject::UpdateType TemplateSource::update(int u) {
  Q_UNUSED(u)
  return KstObject::NO_CHANGE;
}


int TemplateSource::readField(double *v, const QString& field, int s, int n) {
  Q_UNUSED(v)
  Q_UNUSED(field)
  Q_UNUSED(s)
  Q_UNUSED(n)
  return -1;
}


bool TemplateSource::isValidField(const QString& field) const {
  Q_UNUSED(field)
  return false;
}


int TemplateSource::samplesPerFrame(const QString &field) {
  Q_UNUSED(field)
  return 0;
}


int TemplateSource::frameCount() const {
  return 0;
}


QString TemplateSource::fileType() const {
  return QString::null;
}


void TemplateSource::save(QTextStream &ts) {
  KstDataSource::save(ts);
}


extern "C" {
KstDataSource *create_template(const QString& filename, const QString& type) {
  return new TemplateSource(filename, type);
}

QStringList provides_template() {
  QStringList rc;
  // create the stringlist
  return rc;
}

bool understands_template(const QString& filename) {
  // determine if it is an X file
  Q_UNUSED(filename)
  return false;
}

}

The .desktop File

The following is an example of a .desktop file for the template plugin:

[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=Kst Data Source
X-KDE-ModuleType=Plugin
X-Kst-Plugin-Library=template
X-Kst-Plugin-Author=The University of Toronto
Name=File Reader Template
Comment=Long description of the file reader template.

You should add translations in additional languages for the Name and Comment fields by adding additional Name and Comment fields with [xx] appended to the end of the field names, where xx is the two-letter language code. For example, to add Spanish translations, the following lines would need to be added:

Name[es]=Plantilla de lectura de ficheros
Comment[es]=Plantilla de código para hacer un complemento de lectura de ficheros.

The field X-Kst-Plugin-Library should be exactly the same as the decided library name for the plugin.

Compiling and Copying

To compile and install the new custom datasource reader, create a new directory under kst/datasources of the source package. Place the source files for the object, along with the .desktop file in the new directory. Then, edit kst/datasources/Makefile.am so that SUBDIRS contains the name of the new subdirectory. For example, if the new subdirectory is called template, SUBDIRS might be changed to the following:

SUBDIRS=ascii dirfile frame indirect template $(PIOLIB_SUBDIR) $(FITSIO_SUBDIR)

After the required files are in the newly created subdirectory, a Makefile.am needs to be created in there as well. Use the following sample as a template, replacing all instances of “template” with your custom library name in kde_module_LTLIBRARIES, kstdata_template_la_SOURCES and services_DATA.

INCLUDES=-I$(srcdir)/../.. $(all_includes)

kde_module_LTLIBRARIES=kstdata_template.la

kstdata_template_la_LDFLAGS=$(all_libraries) -module -avoid-version
kstdata_template_la_SOURCES=template.cpp

METASOURCES=AUTO

services_DATA=kstdata_template.desktop
servicesdir=$(kde_servicesdir)/kst

Once this is done, you can compile and re-install Kst from the modified source package, or alternatively, only install the new libraries, like follows (using the “template” subdirectory as an example). First change to the root directory of the Kst source package. Then,

./configure --prefix=`kde-config --prefix`
cd ./kst/datasources/template
make
make install

Restart Kst and the new datasource reader should be loaded.

Appendix D. The Kst DCOP Interface

Kst provides an interface that acts as a client using the the KDE Desktop COmmunications Protocol (DCOP). The set of functions provided in the KstIface interface allows for easy control of Kst by other applications or scripts. For more information on DCOP, refer to this webpage.

Appendix E. The Debug Dialog

The Kst debug dialog can sometimes provide useful information about certain problems encountered, and contains all notices, warnings, and errors logged by Kst. To access the debug dialog, select Debug Kst... from the Help menu.

The Debug Log

The debug log is located on the Log tab of the debug dialog. The following lists the different messages that can appear in the log, with brief explanations and suggested actions (where appropriate).

TypeMessageExplanation/Suggested Action 
UnknownKst Extension %1 loadedNone. 
UnknownError trying to load Kst extension %1. Code=%2, \"%3\"Make sure extension exists, meets the requirements for a Kst extension, and is in the correct location. 
UnknownUnable to find required vector [%1] for data object %2.Ensure the indicated vector exists in the Data Manager. If so, try recreating the data object. 
UnknownUnable to find required scalar [%1] for data object %2.Ensure that the indicated scalar exists (try searching in View Scalars of the Data menu. 
UnknownError loading data-source plugin [%1]: %2A datasource reader (KDE plugin) could not be loaded. Make sure the data-source reader meets requirements described in Creating Datasource Readers and is compiled correctly. If it is a built-in datasource reader, try recompiling and installing it again from the source package. 
UnknownScanning for data-source plugins.Kst is scanning for datasource readers. No action required. 
UnknownNo data in file %1Make sure file is supported by one of the datasource readers, and that the data is formatted correctly and is not corrupt. 
UnknownUnsupported element '%1' in file %2Ensure that the file is not corrupt, and meets the specifications for the file format. 
UnknownUnable to find X vector for %2: [%1]??? 
UnknownUnable to find Y vector for %2: [%1]??? 
UnknownUndefined justification %1 in label \"%2\"This should not happen. Most likely it is the result of a bug. 
UnknownInternal error: No X scale type checked in %1.None. 
UnknownInternal error: No Y scale type checked in %1.None. 
UnknownUnable to load plugin %1 for \"%2\"Make sure that the plugin meets the requirements described in Creating Additional Plugins. In particular, make sure the shared object and *.xml file are in the same directory. If the plugin is a built-in plugin, try re-installing the plugin from the source package.  
UnknownInput vector [%1] for plugin %2 not found. Unable to continue.Ensure that the *.xml file for the plugin specifies all the inputs correctly and in the correct order. Check the source code for the shared object to ensure that it is using the correct arrays from the input array. Also ensure that the specified input vector still exists (check in the Data Manager). 
UnknownOutput vector [%1] for plugin %2 not found. Unable to continue.Ensure that the *.xml file for the plugin specifies all the outputs correctly and in the correct order. Check the source code for the shared object to ensure that it is outputting the correct arrays in the output array.  
UnknownData file for vector %1 was not opened.??? 
UnknownError parsing XML file '%1'; skipping.Check the XML file to make sure it has correct syntax and form for the intended use. If is an XML file for a plugin, check Creating Additional Plugins for more information.  
UnknownDetected disappearance of '%1'.None. 
UnknownCould not parse xml file '%1'.Check the XML file to make sure it has correct syntax and form for the intended use. If is an XML file for a plugin, check Creating Additional Plugins for more information. 
UnknownCould not find library '%1' while loading plugin.Make sure the library exists and is in the correct location. If this is a built-in plugin, try recompiling and installing the plugin again. 
UnknownCould not find symbol '%1' in plugin %2.A required C symbol could not be found in the plugin. Make sure the plugin meets the requirements described in Creating Additional Plugins. If this is a built-in plugin, try recompiling and re-installing the plugin. 
UnknownThe %1 font was not found and was replaced by the %2 font; as a result, some labels may not display correctly."If this causes problems, install the missing font. 

Appendix F. Installation

The following sections contain detailed instructions for obtaining, compiling, and installing Kst along with any optional libraries or packages. If you use a package management system, you may use it to install Kst instead.

Obtaining Kst

Kst is part of the kdeextragear-2 module of KDE. You can also download the latest version separately from the Kst website . If you wish to download Kst from CVS, it is available via anonymous CVS for KDE or via the KDE WebCVS repository.

Installing Kst from Source

The following sections detail how to compile and install Kst from source code.

Requirements

Kst v1.0.0 requires the KDE 3.1 libraries and Qt™ 3.1. Almost all major Linux® distributions have packages for KDE and Qt™. Since Qt™ is a dependency of KDE, having the required version of KDE should be sufficient. It is recommended that you refer to your particular distribution's documentation for KDE library installation. Note that the entire KDE desktop environment is not required—in most cases, look for packages called kdebase-* and kdelibs-*. Alternatively, more information is available on the KDE website.

Optional Libraries and Packages

The following libraries and packages are optional, but provide full plugin and data source functionality in Kst if installed. The installation instructions assume you have root access on your system.

Note

You may already have some or all of these libraries and packages installed, in which case there is no need to reinstall them. Also, check first to see if pre-compiled binaries for the libraries and packages exist in your distribution's package management system, as it may be easier to install the binary packages.

GNU Scientific Library (GSL)

The GNU Scientific Library provides a variety of mathematical operations for the built-in Kst plugins. Having GSL installed enables a variety of plugins such as linear and non-linear fitting, correlation, and interpolation plugins. The library can be found at ftp://ftp.gnu.org/gnu/gsl/. Alternatively, you can find GSL under /gnu/gsl on the mirrors listed at http://www.gnu.org/prep/ftp.html.

Download gsl-[ver].tar.gz, where [ver] is the greatest version number found in the directory.

Then unzip and untar the file:

tar -zxvf gsl-[ver].tar.gz

replacing [ver] with the version number of the downloaded file.

Read the INSTALL file in the resultant directory for detailed installation instructions. For most systems, the following will work:

cd gsl-[ver]
./configure
make
make install

CFITSIO

The CFITSIO library provides support for reading and writing to the FITS (Flexible Image Transport System) data format. The libary can be found at ftp://heasarc.gsfc.nasa.gov/software/fitsio/c/. You only need to install the library if you anticipate reading or writing to the FITS file format.

Download cfitsio[ver].tar.gz, where [ver] is the greatest version number found the directory.

Then unzip and untar the file:

tar -zxvf cfitsio[ver].tar.gz
replacing [ver] with the version number of the downloaded file.

Read the README file in the resultant directory for installation instructions. For most systems, the following will work:

cd cfitsio
./configure --prefix=/usr
make
make install

You may need to change the directory specified for the --prefix option, but the most common directory is /usr

Compiling and Installing

Once all of the prerequisites have been met on your system you can compile and install Kst. It is assumed that you have already downloaded the Kst source package. If not, please see Obtaining Kst.

The simplest way to install Kst is:

tar -zxvf kst-[ver].tar.gz
cd kst-[ver]
./configure --prefix=`kde-config --prefix`
make
make install
replacing [ver] with the version of Kst you have.

Important

Note that kde-config --prefix is surrounded by backquotes. It is very important that the kde-config utility returns the correct path (most likely /usr), otherwise Kst will not install properly. You can double-check by running it directly:

kde-config --prefix
Ensure that a non-null path is displayed.

You can read through the messages displayed by the configure script—if it reports any missing libraries (such as GSL) that should not be missing, please go back and ensure that the libraries and header files have been correctly installed in the appropriate locations.

Kst-2.0.8/docbook/kst/Screenshot-kst-datamanager.png0000644000175000017500000003631712277111530021474 0ustar synthsynthPNG  IHDRs.PLTEIV K @6 />*5(1)<1D)Q g U G6. "   , $-?H{C5 $ %!3k%>\"Fm GrHt#It4OrTXeZZZ[[NWG5]@(_7s# 0?AS"j-y<>ؗB&/bۥ͝ӌyc߰{ױ~ϬΨeɟg×gh\rquowqn~e%;^1b-e(h4u;sIxZIGSci]S,6@@@@?@EIJJJJQQQRTTSVYYZ^cccfru{ۀ쌿ٚʜş߹hhtRNS| 9xIDATxylWˀlbt Ǽx,j ]iļ B6(7Q"Mn换0 N{q, B,꒑R,K@G B֮ꮵ]O>t_e(3C@9C엻˟/(e{I54 (4:r@#LN`Yђ=xOǟAp]&'Z=={TCB]&' eZB>߷gw?^.4JalIᆱM>}bѣN/Lt]GÏ;rDwdyg?&:c|W[5S^gͫ+Y %m~,[@KyU fw0j!'n'd?77.vxCIMo.=xwsW0%͏?#hѴ`_wnӁo ؄v^;lNI;=[KrJ8or#a&}wFzԎ `lBZSڼԩGE+d- 6]b(lsI;=&;K0.z^;Py{ibRY~>,۫_=hg8BlI@AUC;Ӈ|I1?rL68c     A A [{@9 =@+FeT&\ NN=..Z`J [q_-'`7O`__/8? }6qfxR%]-g/:R[ ㍇؍C[7y-)t$CŽX4BY׿Q5^HAW xe3-z$DTK(8wtPP/n jq-J=iElґ4Ţ4м ՚{{|YV{\K7JBST#BCt9 jW'ԳtJ5ҿRˌ Bm`ׂ},w׾>el+Dh$ZIZl]P3::@>fYxxF 6E;??W}@r{ SJODgFȢ̬DR(Jdf&)~^ШW7+"v:r^ 1zR*v3:FvKRCseb5ni" MlW}@2-mpp`5J=?VCJ <+ uYRֽ#zX ;;27筞(W;6+/HҬ-URa e~G~ڗ1")WK zvbyalvY+ʩ%ӼBŽ l;KJ-"i/}]&[W>E| /i*I[/& ce+#yCuD n_`qh*-eJJ=bVnJrbE7T1Lߑ\Rjp~(&7RbJvp\'`oM,dcdAOrGR:c*VSK>W vád$;b4+"m]%˝J;,&jPq``Ւ_&H КZ9z4Tޣ)Dg'V/uHm%Q9Dys %jX1wDԔX 4ؗυPg2,P/lh[8 'غjp|=y.'~/9iGaz/9vjllu&j9{/9vNhV&ZN&\NMCX?n~\Sˢ݇,8׿tNA/n)xGk~e';>^Qz솷jXO1= eɎCJ;n(,;؜e+-OKC/ xGu@kg|ΐKk;DF(H2.-C1o2݃_UXzsNz{Y5tQ{v7d[$x oW~bgWk.xw u>ޔKBg\3jM2;- 2&=@_> MO};o&0B,NF7H(U+xRY_\V|Y~ן׾~)zڿI2cgk_L]{[kׯu580Yl+1+X)?|^[;g\9."\>MsőrF^& 'uМl4B\ȶ_ }MWkulgn Y4/%I>Nb'po7_|)' !v{,C-RwXr]|}f5YnMյwo:\KCRtD!~}7>a~ zl9_OLyOY;NWuun~Ed;2cpcg Lr 3EMSzo;B @^ÉP]c[X1 7W+߆c\}6k!=lAR8u?6|Ry,q$b7S S/w9c쯃c32wx,-T#{/P3!~쨂ʏM-윫%gk}-;؁`~:2 ʢǶeU3_;ӏc 2Qv o|7xM/Zƻ"ycGmUضiOh?UU=ǦEy-ͪu`G׏-{Uo;uYtDLm@=vcg7]Uu6}mץl9Wmz@Ώۄ~l{ҥlĿHĆcb^;T.ڥKؗê3zlm3d۟wc:ik.m` θcg;U[~lfwXT;t~lvht{l B`kwErΏ\y ؙ,Ď&vc6KycmllX^cY i=vڹ laUP  2h@vV{llBʧs cşwS=ϢNm1ޤN?Kcz1;{llBÚY󾁝E?&[ʗ]>5vƏ9lͿ ʳ{S(mXU97|;p?cyc~Mc9cv~c۱#676Wc;W?*Uc9cv~+YmXӑA zُM{lL?gΏp% ?- ::Ziy@ij[q<̠Q\6-ĵG ڏvw?Q73f[ kxi!:{{ k?\73fH>oU WK?vX?6W/_Ud•@c;͠Dla~y1p%9\ 91|eqp*9\̏ `gWšp%G`>9\)X= ;בDg}CE"a/#Q3R t,6 |ͼ!{ T/&guܑɎBOCp~lSsx"ZS6Ը%Gdg5 4`H;ĎR$6< ;؆l*wV޴5T^d ACCc`%)?RR>d=V- > H!;Z+O+痟߼|z ״-ڼ,m3hО=qNWzl5R>4lKzU?j!;BgmAlfѠ-!SAn2hct- qka"Mk rK-S_lI sE?NAcǦLɝE\n.o@rh-^!/Zde[,*co2{,-nfy/45:M S`PV fLQi60SpCQV rN;ي8lP:~̮۪91]*`9;-mRjhXMuUFtns*HA[csu\kI- 5Ejukk_-~lL;MEjA-'+?/cDf)Ua5ji?DAyqKc| oz݋d|dd!/ZesӶv~mݫe׏mќ`=}s/0i."X&YJtF-9 9swu7^fЖ -ބ+%#C y /kΦ۴9;݂8PDZʴYJr-i}vWo,gh͏{ ȠAxrBMt-e z;YRjX-fDԒ| W +k\`/i),DMY\~ZҀm/a} `` uPc8RKIJ3+ u2[JJ+eЀrnp%cؙÕPѹ uP |c6WB-9)- |9]+~[yTo m?:3>[ ?v-#疙(`cce9g|!/؁`G+\ɾ+S0;9 %};4N̾l>0?v-`c+S0:srnI?f?:3>!A`GsU~l̾cݒ#cp )9 %l1`qA=`GŏPK 象crh+A ~\ W x>!׿{2`G7\Ic+ä́F_ 6,@}&p+@k+4V^NtaNry7!WZ 36?ze35-u~l orؗVZp%TflVb͋n:Mٱ\SЇ+ٰ-fl&:{^}/0 ZjmZ[ W@[ |``۱\v4Õ[ |fv{(@f~lv,~pTqf6lWeξ u`۱\v•R{lnwΆm6c j ة~lv, |Uա|qw$;~lkf(/l`CAh~l'H=؊ycay}l?6LU4|uK4-~l8~ecx{z?6m3tY_ܿXs1[A>~cc#Ig ˾ m?vto鮠~2id;J`Wu3?Km?vtÕL7K?U13cqZvIc)Ǿ 3?6nΏm[{>FJ caX0. 6oP <~H 鿟]? |q?1=[csv獅z;ŏm6n.Ds: ~lŏV $M?p)Jc c{Wp @ Y҄kf[yFh'J ;sҨP*4K^8v~l;s$•jo)N$/iv/,4JtN5+|c:),xI}`m:@f~l7)-ب~Mϱs?T|6+m=CE v吜BUs2_5% GM۸??WJ_߈o"`;fP93ت{SJiq9 o`;,~l$Zܼg-g]̏]qjT?6~Jn 6 ~l /3(ЪuP$HH]褆jl+7U ~lĆ}o_6+8_؊A>~KZ*ɇӷ[EtRsltw&CY3.52뱃c_ V?7`_xIv^B"IJ"i*[wş MjB(K`p%$•4X>d,=qΜADo"egy/8.5͔+crH@m 5󪇔x%Ďp%PV•0[paiRCsntPj=}1\ Y^lJT I%v 3]1,%ʴ5% rݷ09'c^-(E*e) Zҝ `]c_ջ" c > ص˫X<{g-ؚ}+l W8L6&[J? kI6JLҦА}•@ W$XDYDŽ 5-h%,Wi&S!J ;S*ҕp E&V6 < I&^FzlB˼+! mdHK l{B•@Y<a~ldU]y;Wԇ۠C]yTolP>D6(`C(  `"6+rlm` 6A6ApnrlW$M!\ ` M<>•@'_G•@[+_ WElct^t;ؐA>\iԥJS]@?yҨWڷov|D@%/DC,"\IGN*m-b1J4? Ii `+J z<'!i`qmJ#@%IfƢ 6rtRJRbi&tMؤ_([Tұ+خ{lȠyK&tOp"%Pi~ojcf;F6y[*Vc8ص۪2(Awy{04 `pAE0|}a  EET{6(`C A2h@6 IaUPn cl`  >!\ `C(7PL`Eoe6(`vm.jp%Y*z;^GvZJ-•ގNl•@[3?vx J d( f4 `p%$•k= mJxkD/v2Zl]P#+INq2V=  [ W<`=^*r v#;ʕ|@Cs 2p/Mfz)CJS9$%$AY[W'u\zd`K_5_A6*_u{E+.H>$hAd( 6WBdg` 60# <疙ElWؐAlPDp%PN rl` 66A6 lP>5+1-jA`` 6} A A 7`_@uʗq7v]i߈اvX@\q1NxUe>$?ӟ7b PP.Gy`8qk=N.脟olv2WNfr]_G !4=SgL{30G汲uGj\9a]P_RH_jWN-+cCvvjz m$:R_q>` sv1Rx:}G8u.<ZS .\ fJj;uf^(ީ9eE[U+Ekfʗc&[\T⇯31b/glZ"}JԿOZPo$ )-%lpPj$G#M:HWOQSuA>my>.>-t#u[Xl9;q>]aljC;\źҿk7J+D8E26>#اg-Gc豿O?T\վ)yՀtϘ3}%g}Ħ[ش `H%뱇"Q+<IvJI&=lmt)C l yrT Z_ԇi%}׉4W~cxԿO[fjJ&Zҿ7`7JLJ&cxG"3E;#_t81ӗă+gcuZ2{ĝD[;9[UAKӽ4`ÝNԔW Ԕ>6?ҵ$j:H-,.lGL\r$jPqHᑎ6.a>w|+q_bLW%6-lCvNCs:tmƘKFOvnKT]w/{g,FtXS Xٺ-;`ocV}le% m$~=fg/>YWjDڂl< 9r _vy12ÒGd.loT= `G v,+?ӟ7b `G l)W; bl2c63A킩y&7n~=W6~l     A A A _`1~_ ?qDIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-eventmonitor.png0000644000175000017500000001441712277111530021756 0ustar synthsynthPNG  IHDR(PLTEE#'F炵{rocca^[ZZYTRRSUSQKJJJJIBAAAAA@:-99:<==84~5|;|BILNQYabbcjb:| u~^GxU_uMdKhJiIjEo;o7n7k0`/]-[%M|!L{!L{!L{!Kz Ky Ai =b;]3N-5>0/2-.1 %*8 tRNSߡ4:IDATxOiq2xs4GX>I_ _C3rL˘d"OyɅMoO9z(Kv0[8?M,wiwo{M yy=q+V<?Ioכ kܛH Xއ!FhKބ3EroIU(Ll\_߻޸OIr+ɗK&Er̳͓ '\9>x] q^v0͛)G7GF{㣻Ûtb emҵk\nuo>oۧ7>wsny'=]Oh?㣻F5$OKo3,yp26ɔ# Щnb\g]% r]'t/F9A9A9#ȑm>"ٌ棿z1%o=R/}r6(-%7uNK\mSGfB.+'HwC[oޒhFJɥ1r߅"' Α",9%$"0mA.)rU.RW1r:(ĄU.KFněKei%DYRGtheTIBPJs*'u)^碵MD]!cE-!WRN_Rk[ 9gȝ%erXRj쉵%4 ǖK+L.KBPj~*)OiӠWƿn\\4Tr5R&{rI\4TrER*Ƃj;qPZBC9r9ȼNO핳?ף#t:B+GGlWDGH;>2r`0h!f_PNKcbE9:B;>\)2PG ZCۈz ڊ'|"yZ:++-چny:BZJh(0TzVk'NGaLJ6e\J#ʔl[E#U{ijP)9r9r|Rk5-G/OKw] 9SNXu-a$'SW&$r'On8 Ÿ᰾y-!aG0JHqGO =ullՖJu\WdKPyw kD햔ZƵ5Qsiwi:\ [*XIc> rQkʉ&Wi@]n =vaPSc@vHCGONGϥCJV?+xsɱe‰@72`܎_nZB/OKRŸVRǓ[*ӇFGϥ0ij^^2=޷<_}y^2=-f^rc:cPEA rȑUwqýL&I}(.r! 9)upfZ$:m,Iׯu9Q+v6|k:r~m1̼ kl?gp.vn-, \sr-ǖcKa?C!G9CCp1 sS:Br!G#!ǻ)4:OCV3N6\[*}.sTVe'FtI4ȵAɞ9+ 9nsA$r]8,R~zlǖqlȵ33["rrTO Gu:u(=r!G#!G#Sہp;c<:p69҉ A A \(F>4''6HAriH e+}!I SD_2=XJcL's u}s9ֹE[>\wsbZ:sf-9-ɥ&ƢoC鎾I9܄^NVaTr:G#!G#!r9r r9'Ù _Ou0'kk9sdknz1$x3~aDi䞼{cܵcao X$ֹw<')T;ѳۦcq-(~#s$x13$rZRE~[/KoDZqsܐV/kqU&t' Q!S++2Cd )/'ݔKש\*w1ܭ'ҷ-. >VyzK֗eN=b 9mRrΐ-,rG/ɉcԪxRr"9,QJ.|Pr~L%X~.7dJSH8|Hr:/3BґcSq9c-O/ ZscK1sֿGϝYU}+Ԛ;᫮ 2zsi\ߦ= %XPE-asf}2>sfr9C GC GC9rc1B#4##+8wR<sGT874E쬐H"F1m19f%O;f[aװAN"sω+>8'o..rIxX(>1C5FH89aJbeֹ .~N]9k87dv##739A9##ȑn˩'5"e 2A9rTG%7s!7W1B,UzȵS.#lr%id5oVQ䎏̷ۣO.ر=J a\ry^ȵH. :*wf%/\2ƙ9JrMuEr1BR'sP 8[r|Wrݖp ׎ĩCj j9#]锛SΧ_!\DrVI.rOkv9`Eֹ2r<+CND97ȵYNHgkّs`':"G#!r9r9r!G#mۘy܆#g3˲ K3 rEr5kJε,J/Ky,EܱDN2rN^%{$~S+gBcqu.@" LSZ$nWpNEyA6tXk0rG"wrZV.•r٫|U˙}E^erPb"%[.r%h "g949!W(w*Ι@3-\G?ݒJ \%Uˏm;[-R~ɝKҮ˛qYQ#qVlɽf镙~Wpzuf,!|P.,ԡPA A rrr!A A rrr!A A rrt-#ё6FɑN9r9rDrܘy! 78+ؠCbL9Q.*8"r}>hq9ۘg1* \UQŶ1EK\(\MQcre ''Cnvrү&?Vِ+grV'YرbZ4+x9X4XGEܘQsJ> rq|%< \eQ6Rl*?Vp2Bp6~pՖ+3o层Ǐ \U*&V{Te*wz=+7ɘ+rCRmߴec#W/R'!G#!G#!r9rr3^tpW y'IENDB`Kst-2.0.8/docbook/kst/Formula-kst-lowpass.png0000644000175000017500000000171112277111530020176 0ustar synthsynthPNG  IHDRxXl8IDATh!̪P۷F"H$HI6Ha3b1L77/˞rto&Gy=?2|hg>E|_?;d~ ,y􇞶kZ̜IC~k>Nu6>5췂^[Np"4>&Srs0IW,\LZe=~-vq)owFH,mОq &N:3 F3_qn7 Nm1.Q'9@@zJg.:ʵ pج vD:J Kd>ei؈h[)5<}nƌLmQX7[>&e*f[t(}ZʇHd-94hP Uw$`O/y0!HB ?4ԟB_˨[Hb'$`?cFJa/f|(5JeH}7·꙰)V zYV{:WzhH_E RwlSyL] UvxŎUOA& @x nQx٨8n`.~hPds{ U:+ש؛qZyJy?_ (hx g/$N/ HR/0H}_6Iڄ_ t撀_( 5@/&*W$/: $q z WJV<؊_B/]}_C$̲~$Qև6\QWFyyI:ɹCvX <ɾ 1ǖ ύЙ >9.&89::AAAAABBIJJJJJJKOTSSRSUYZ[[_acdkrt{삵焷犽ƿ3KtRNS޹sqIDATxkGZ1,:a/ȑ 䲾 |!8C -)`r19 Ɓ 눵`FAC0 ګIYQ#3U]SN 𒩩3SYLʙO/YӸpoi5ڪ G+o&tȋ֕#ŕCs..nPb*uG+%ܗ˾!G\ ^NX3lV՚ȫp9yuV.9|ÓM/(%f#:Y&L\>l6#])gU#3"w. G\9^Մr.(%f#:('I9$_}_ XYr,arD^tfoU0)ܚo$6rw~lȃ>8%=z܏46WV6bs%y)f["/D抌s*ێW?$尧Ϲrtn?tr@vt:S\I3\\ο%Aȁ9r @yv dl䐙JALKfE'҂ 9D)Y1# 5jA\ \!8US>@rn^-4w|F-9WYrn^܌tɡuý,;{_[38{k[9r @3,ԝ,@n~uHiʾ浓zqr^ #vroNM~d{$rrlX9M~ 9LV+VNR.V 4#9'&\CCz^9EscTs>XNsZn؋K+~&c@Icȑ3^ܿ"7Cn~w9{Q#K@aC!';3^,jrXrctn9rc@Bk!X_CX%`anaow@9D\]?Uo-+7LC B쇭_9BpZr9/XN[lfr Udq5oP9/ cGZ$4 Sn[%&_s P^r? 7Z_rCCo_H}3vr ǟ(5(B9r @߀3>7YSzE'9 rȁ09ڗuo77P#ZQhn[v.,4M]wiQNZź/K+&LC~!:p+ķhq}:t7mV1=-ZPZurԞtE &ҭYt;ˉ_Z+[nZ^rȁ9 @ Pl |cPeo/OiC@ΨXO儞v0츔Kyv|5 $r| gN#3 99IhE`t$P9"ḓ @ rXh Sw|Y>9i9J6\:ÖXN9#;uH+1ɖs{y h9&DWjL!oANr H s(yONrCђn}Y [$ʥAN/r:-)ȐQ$XiIAYfWC\n,u(q#f!jN<_r]eʱBNribIUNcҪ!d9m6jiYGuh46L*z 9B99r4;Pr }9鎒sANw9/^%gr=> "4`ghCЋD߀ r@9 rȁ0/>^ETxhŋyIENDB`Kst-2.0.8/docbook/kst/Formula-kst-crosscorrelation.png0000644000175000017500000000221712277111530022103 0ustar synthsynthPNG  IHDR;͐@VIDAThZ=h*KXYYle:illla +6ꂅM H7==͇g29+Ӯ"].g,L\]jB=o94s}i,kͣVpwjU׻ֵ)5v@UDF+ ucV{ k:3ݾlpcW]h3 ( ~ g2 YD5VSAtFުۡx7N3c+m 8`GݽQ8eyn> L:ae|R+BpJ+8]m[R=G\{`V^[:gY`bdq* mV"@ 3퉟N`^rHunPqM(mߣ@U.y&2`]x7R;i.ۄ6ޛVɰ)-󫘝X)ShN3Zt&bٴ)g~PCV9:Os*Ѣ6!eŊ,S~>~}o+?Ե.=a% .K ;,ƷRB†FWiȲ,r-T,-6,vgPHW+_eIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-datawizard3.png0000644000175000017500000002200712277111530021434 0ustar synthsynthPNG  IHDR/2PLTEſſýŽƽƽż}~}||yy|rpniidgg`ce]_gZT`YLUWMSUSQUSRURRURRTRSPNNGEIAAH<>J7:8352121120/10/0**,   ,!:*K8Z=a >`"?c!Dj"Ky#L{!K{!L{!L{!M|#N}+X.\4]كos/}ЪDy<X J)fxjkŵ[kIr%:w97vǟɍ5y~^8(y)yo|S|%k~)?!>O9{c͌Ywvf4<_ 9g/޺v,>xgVNUz'/L$ۻYUT?XػU97J}4/?OQ2x޾mP?"yJq8r3ˮuͧp~?]x~X2x~,+f<?^v׶+f;">}]HyF<7L[/EQ^r/۾JL/$k׮]яύ<'yod\hNmAy1GRos3ca(PI,կWo\}޾ 흝'Ovӷ;;ћ{`@Nٓ* C5Tv~svw+/Υs7~&Si'zɃGe{xPVRRF@?Q|қ柋t*Z=BEJu hSEJ C?H3g!xF<#ug+{ԁM zuWL˳geH]VUX*cy( U;>iYlWD?zBxFYQyDDhΘ5ByZ. 5ag!xF<#u!OyN73B<#3B<#g!xF<#3BdҜܥo[U {P֫ )|+0u<zM_,OJg:K|ngW1IDZ.qM9׿Z;zcsWnZexNooo?:_z6sB=Zk=BWٚ6'I wfJ`2ߜ<)ЇY(y9`_o\!>^-Uh᭪߫-paNŘ ^Պ>3W[լZk0zh^wskyVs烃l#>O,T|^#>^-UϢʡCѫ~<9 W~5Q|k j7K\QV wwFJTW}tv~2HЭ-T(f'y9TلewX)Ssإz~zdl/pY-+!ơgzOx\z`k<׵ {ьz*xE{Uб\|"y~yf2xWW3Z3<3gxF TxgxF Ϩ9"4 l[ <8>2^2DLaD3룄\aLGa:Hs_Z9r]9ϧ[CȚ2aь(aY '( -u7"p1z(ϥao&'YNqpyH(i[-\' M<)ߘgJvJP|x 7~2Eo؇7F4cȟ(aʺg>ϑlX~;ϭ%1{p;<7G -2p7o37sSCe\`[A{5c*},") iy8-𼽝|>}= lf6˦Su 琟L<`lvIU1fY4ςYGjR8ܒ1̐yPπ>Wl׎ooȹo<~ XxN9xjX9Ak1򼱵 9xhܛNgxg3<3<3<#xg^gxF \WH<$a <gdyX?xxdl?xϾbϧ<'}߰d,gdy0<'<$<3gxg <3<#xgxgxg h<3 sOF nuγ'#Mx^(>TQxS|dJq\'ZE;s^NLCot}9/ϵ~2B\p -p^O6EfW#Zc .2 <goxF ψgxFSURS>>^\ڸ,e|6te4m)z$ql_/Ԩ`wyy׏ K[]45:onStgͪkЩRXg8_ijt/4ԏ%/sb,kn;5^?,^󜱴ѹ,MF-? Mų&<-&LKsFl4*v  ;lJFHg-#E*)xF-\%Ow_I3<5x)}9xnh8<S3<#xgxF ᙮Wy<3wy>tS'DSl ! Va*\hM7f8@-r.jK[ó%YZӦ !yvfmׂOujsgy2_=m*'qntUSofuي x>s`L bZe`.Y bsC1Yijl,hΟY%ղ!o*7lY81^>b?p(4JsqsKwfxNFA2!y.cYgxĢ^CBS E0>=f>Ҳǟr+B~l|<'_˔QZ8y2xOf(< ~2 y:sA[lS4ۅn*xF<#3gn!4 ΉwN?a:MhIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-multipleselectedplots.png0000644000175000017500000003207512277111530023653 0ustar synthsynthPNG  IHDR/ rPLTEjcn9-J%:]!=aypca\[Y[VRRQMKKJKIFAAAAA@<:98:9" ~0}9xBvG}DIUelkWzH}Fw>o9m;f:W(TQ5BOWZds1`.^-Z+E&5#<$K|(K{"K{!L{!Kz!Kz)Bm%>b>`4N9p:q?fFUOKTIP@M2R)fCq@r27тKЅ\ךdl}l[B ڀrprME>A@?B 9E1J&OU UL@ 8 . &=)S2-:10212;48YQWYY\[Z[gZcvPjsPtlWjkjwsw||{ üƻԾ׼۽ּB tRNS0IDATx}l׽7HUeUmrQ-+-b8r!UZ! !H ԦͅXn8xUk^bkcG2T! /3/;;;{fϙwΙ}?؂@??RU@U[~Ė1jHclKyNuUb)Hd> &鏔n^Z=Yrꕋw KQNi6Ny=Ͼi\Rv!tp,aK-ؼ9SOWL JMsy+1)d*YZJ,ɘ*dd'Wbu2q!ֹ` r}\n|yeQgÇgoUye@SqOKtRFYv:+M֩ƨ:+v גpP?4mY捘Jk*S}ڽ[g)d)rKzmuooLLMOM霯1:btrŠ5P>_F7$ktruuu2?VP?ڵz%***̱ѩ 7?O;uä3*eα>IoߛSL'˝}җC7GGK+ڝj}fwkɜN'a<Nct:nehWp67Gy9Ci~*>{(Yvu Zߦ:4M1\닽}{pօu1`gkR@ZUAìg+%ar,ayrN^ˆ2 hrP*m{RgvxuifsgR'éN>;e"v=_6dGTkV;}`;5߀nggl*:Gc$ghvt|Y3<;33BQjHX:UKǬkv}J9K+qhKغf'䜔mN*!MeeLP6=r҅j,\~u\:>Nﯖ&Mf32gwiggfekOzrN)sc|j+RÕn/G/so}ɾ>w#~x}>IgeyYiW:wn>~NWxitDM'ϸ1w_r`uܔ;uTS*m{R>?sEfˉQΝƺV=D$:cv<-,w.q V1.O\938ț3sxt`4:1ե y}? ?yޜ;9u޴k9s'yСÇuVSzLt.lwNcRɝ},"[AIԺݩO>[; ו~ ;8Ū:~-?Km31y]'eQc.EJKRNYO>glUuk4Asz3K~J6Nݹ}oJ͝q (oֹbQ:ZD9e_p2QC칧IDzg]~Mp%-#_C_w(=;g;y3Y}[#å 0~e;g3;s楞4:/٥#5;?cdE h9q0eOS -_\QQ>:30{QʾYS;u=zGfGX:6T^VKc5;ielkvS/఩5,_.3J^!u׹ Ͷtq&L QsEgZ9GY#ORu^,urrϾfA(YZV^Śhg&*K:YN .^NF/\5(ݧ"wNy|x #zSXthҡr>[ُ}nj仗 lo?y:#L^I~N;KFɛsqy ̝i3UHnscܩ!Juru4^;i^_#7|h~~hUσV;ڟ4:EYZO|RN kN?.G9rO>=iY| ”)/ЊYNd2&$ȏAgKZfMb9DD,tLYn{y5NM3q( YAF)1eGZk/Iewp}ZOq% hueWUV&6#;;|gP3N ONq}ݶTgOÏ/A_b?g)ǎwxuu*+k*&x)Ao'uNݎG-iWrm>)w^*WfvF+RZ:rE8*M"7l{ܤpӫO)޹\QCyF=ݵDd~N{r]f18ΏZ W띳 uԺIirsYAig{tXV/_{ clYi 6q`?{t˧w_,i7t}6+Iwi 6R{t =Cl9{={ޔt u$ :2UO= ow[e%f&JvbYS5ݟFi-[T{/I:ߔo;hZDS̴ MN&tB6:ҡ:ENЉ#JMQB7m"wB6SGP3 lxi  iB:umd߷s{6Sz-6mʻސ6SgRgsϙ}_t٤MNTЉ#J>M>щ%j:qOއp6/N5ǝmB'tj#< ND:N:MLuzBNhB'"3۽ tzKw:>DMl8M> {,@_Az"vn/M}6!*d,Mx,MQB^`Љչ+'G MNDX:; NN N \ّ֙;;QCgqB'tB't"::3x:q:: Ŋ:q&SX8܉ǎ>;5;tB't"S!NNNpB'tBcJЉ@N %NgNgGDNYT8;; ЉNNDN<]Ɖ Y: ǻّ;;~0xN :;:: ::62@ou:E3:gG.tE-DM mAަ No\gS}_toȝ߉O7qBG::gNDD@'tNO@$6HN~rNN$out[p٩s'xfOƃQ~mm1ymX7YO ia[Y{Y͚|RN;6\.jB'tJghc6#Y͚|R:f=]Y͚|RTfϙկ:8 NNNAϳ{:q ȝ ΢)<:::'Й žgNtϳC'r'r't":}::<ӟ:9NVg(ĿY@6^μYX&:Ӄ3Ag2;-P̊μLKO,T2μLz't :ӯ8::ӟ83IlЙ*ByYOIWEO<tz- 㻡ӅD$8R?XED̓Կy ;;::ӈsN4")FC?v:ܙsWMA,wm:SP)/t'ym+ Et#w*{ۓ 6O{$?|h! mӥA΢g;O#wBgt~G &d]Щ'OTzVΏ;= YtW\N{EϠ:]L6:ٻsYt:lu<{>{0ufҩ g]DЙ=E?N:3owҮUȝ^l0tf;O;8Й#6A 묢 wB}:oAgx: s. ЙBmxj[YÜϗ Nݯ E8ϞEӫ-N'tfqD)o::M:="ArgPt:LN'tB't^g7"|3<3$w:QCOpB'jvqqJg CY~f<~f%٨w x ?NB6΢z:~7!GVT4>V/-= cwA[P$:ӝ;|wρݗNwK7]>?0&`%;=M;X![~3ĖgSMI{mlp{80ЙfT?.6ֿIߡoїv\z?)@*ٹgO=Lw6 ͐(mŖxK~6I`-Y<]X"ѹ6}now! RsUtw]\*&`%l]tow+d#Ve|9{X2iwl) -c:39N=Q1qvd-f)htt\gb?|=ip=C#JN!NteD',:3i=LhFÎ&Nݷ:l7ݶhtgu>l+ٞm3:[s|pTg{ηmwI'AJߖmʝzX|vo¬ym;tBg(Nto:]gN̢Cn1r't B'tBg$赻^DweqDIp ˝~B'tB't ϐ+ Йڄ<\OV:ggvuȝ뜼6l"]$I >^toY. YGN"PA'<[3d>i9is/t>8=[CbX|<{h8'=]޼eYx<}/zS{X8+iέ*{SFis"ΐЩU^ b 9S#JAiN,4^('tZgzӽWg9y犊*1t,wҙFTIr^fBx<:IBޯh r< ] QNQyBg.:t)B,SfNN? QNN,ΜzE賻$ SH!UL>5(N⯖g(4ZV'#;]b1P9Ssus)uÅou2Zt4p)Ho3qaUC[;ot~{SIr/7y2( %}6(qQgq) 7G=ȝA[< 6};' :CNB"qQpt|RM>wf3هipQ93ci0wj{EBN"hӯ0ϳo;;? z͞Iү2;Y4^7N/sgWW7rg&.ӳ^w]]]_pҩ g3=bãO eFgfAUȝi ڝN;U'q'q!qZ}ci% :]|GI0aHW(n^qݹTM!uRP|czߙt-<ѣ:y+c8-%'6?TN5l)Mŷh`4U6e+lZ)Ms^öҜW-#Uy/#aPWď:'H¦T[4\=u(yU2\Xӹ˼QM=%>7*Js_Gr^ uE|;߿̋{h)MESYW@i+aPWďwz-9ji\wYeaVc< LRa|^ 63::&t"wZ-M_nq]=[GSƑ /6E_:W{KnΟI_@vgZ+f?&tBg!t:BM:akw?BZ\|b}%oJ:[O&/AtTK@( M"Tom=#_\2't!w)L|ߋ%nsjt XWHҩ|?%Ŧd5(EK[rz3GdȠ3KGyt('=y tfg(Mݭ͡3ӝ{4$v6'۝{Oр(yxkہyyg66N^=^6N^=[SWO{Nݭ "^=iNfbGyN<[X4wIu"U9wz}k]2@@ӲWAOxaO;63I =(~kw NG<§+:ag:+OAW(.*δZ\c.x̜&ue5'-Ԭ2ȉN*mBg{EiXŵrW$/aw&yW)x%Z\ZN4[2dڄN':W)x%[\r!*KSW)CKRHlq3 gA3lu"ԡU В>?I=u3d#!sHʬ?2>uR3qB>?Awh3#H>2O'O4CKlqY%:sHƬ?2(sI:Zmh"vt$dI'QҧN 3Os?Qߒ/9|$c GRfI9|;_p-ϺWG2iyڜHsgሒWGR%PRNOft|:Y\)UK^ڝ|e rgYYN|etfiXu(3:7%cwΜ΢k?j?|"zEEǽ"ٱogONgJ:ӗ:L3]Y |0;"{BG:wxaly;>ӳ]z牷3Fw <{B}v1oЉ#JGEMhw"w>: Y7V}B'tOWG[L҂^:-'g>`Y ZNɬʓB:qksG*O ĭͪ<)tz6w4NѬʓBǽ"4ELu~G<:3׹j iIbҵu1y8(Z" S\ -G%I>&Wl&5':^Nu1hbH:S[I^F7CD&Uꁔ:3:MN/K6W_ $lw?PJ'YNCD,IL^tv5305Vg,e :}3TIc[$ɮ]ϮLg^o1t ^1% 犊+<;tC:։+ST:E!___xtfC 7ApD }1<-\U[EIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-defineshortcutwindow.png0000644000175000017500000000600312277111530023473 0ustar synthsynthPNG  IHDRn>DPLTEf]\cajhwuÿŽtrldca[[[[[ZYSSSSRQKKKIIDBAA@;99:<@HQNI?6~8{9r7m:oEuyWYWSVSSUSQTQQTQORONSTHXf<]3^1^.]*\*Z(S'N|'Mz%Lz!Lz L{ L{ Kz Iu#?e!=a=a;]"3K-3@')3 "+   !` tRNSǤ7~IDATxKis{^I( =lw z{=,nYA"HAEc]J-BYRXcwߟwfޙi367f}y3LtLj 4`85*+˴R?k׍ҷ&ǰY 7AiTt&&ðukeUV;_ՙ4N 3 `*[{u @!zp?>@Wqb@DƖj}t~hk+B8{v>sja蔮tOZ u$޿GM 4I$) OiYhy˝zݣRu~i֖_D-a{Ui$ðN"J;>f[GYV4٩MA!WE^X&dbwS5Eݯة3JҴ˕OuaYcM̉ qOB.GNl.ENmd?MYc )y ,)(4Ƣb>Mgg˫ (1't:]ňesiK~~# _+ uLWe^sjswN3{l-,!6eI$# VV2 Ҙ٢Ub]+Y%b+ 5Lgg}ʴ˧ĜEI:7a^/@dj wj ) u2Jl1hxUv\, C# o.we3QrB6J>O.1 chtGrP矔6:_bhessY$uj(9˖\#e[{\1D@[̇.љ4NCUVBVIeAdVxA ߠ}-feh!=Vx, uc*(ɰΤq*kNw'N'_*{{5QUػ" vp 5vEf@d{mM%P|b9+eI㴲bXY9}_yp>h[X^RU.L'7>o-UEI, +a4``c4` 0` @I0 rM\w)FCtG?$9 (bA4{$0DN DW 8`0zOݓS)dg!7`]g) O2Rv؅a{0')dg1( p=p(N!5`7p XnnU   ߽aAiOJ&(I |VBK;nC-zQf cccަ& }   .M~j-^ccwG.uuQ `݈Oz?|?'Q^^[ ҅.Kf 'ud :BlwMia9)> PK.嫆f6^_렾ytA'B'YLط07eY& @r՘1Cpju 䪨{ȭKd;& Rb֤3 ¨7t G]`GWԁ+AzC'Ŋqi ul l4֡9~{&nrlܭG[ai{#nD-t8ߴN8%'u.]߲{@lA( )6F:+1o$rܛpcą><%hO+=zNfGT WʸY˝q‰} +8qDudx(fg&=֐k.\INS4~SŒ :#|ׅ&=͇LL- 7dQ]700DXuٹ 2WA 3M%SF+YMwG':[*6^nWCf^_ ki^\=|1~"[T5*IENDB`Kst-2.0.8/docbook/kst/Widget-kst-maximize.png0000644000175000017500000000044712277111530020154 0ustar synthsynthPNG  IHDRЭIDAT(ϝS [`B7?M:: opx = XH+Ie8q/T0?n  ЫއKC*awk7rϪ!LXe2] gŨ|? ^ S 2=`0ex1y?cʐ~0! 2h@T|j1?qj ٲ~p2[@~\6x19 v*]#f x4IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-filesave.png0000644000175000017500000002475412277111530021030 0ustar synthsynthPNG  IHDRpe\>%$PLTE &     .=T!I'7.-.7'E J%W6!j;7CU"AFf*;F֓KđQR}QyU}w`goa[YWTRONHFH@=;tEzJQI>=@AA@@@>AIJJJJJJKU]TSSSSSWYYZZYZ[cleccbccimttuzꃬ삵刻슽퍽ॸҟƜǝĆ~zrĢmͥkߡswp͓Խ NztRNSKY&IDATx L  5zMl_ooE47i6}bcM|6m&Ι橧^͐~8͈v{u?fH[=[ )?/4rvʕRUm&VN83G-K_"nWͯX)htTRĀ{W:Y /7ԲT*8ep,\:vW~!]9I ֑VVkI^C~,1Ge9pcJoՋ (Q% hs)W}--;;Ѕi5cg|g9k?IˡYf- ײJNk0UW&.Fet #k fnxz[nt圏dž;ޒ }:Im *,+r5ɀ#iTʀ{U,NL#`Vˌ4Ё^y |οj3 _UO;Q"TY "&jb"fkh7C"aik<}<ɸ=+{GY'BPmF4֮G9~x E+#wk_f;VZPdFv|g9GDEn-YҶmJ&*P| x1G6SXD8PЙqpَvz5(-#6hlklZ\6-|6Fɀ48SkGʵ3r(ѻ^Fl! efEQUF-B>l7Dq _44Ȑ-xx@gY3 f 6X닰MCvj_ߎ*2k3RVmF^f#h8ѵ;SeӬ?G%l#m,GzCqKIN9D"~Xm-B5ԍMe;0ZvZmFهf;txeY[W}\l,J] ^_-_ "[nfdQ4;{Z<ފs3 Nd*8'C.;##jb.,˅,,J[fmEJZZZr0hcdY9>+O}9޷`'i_v>6;kXaVN6p|jjMT S~,J OA ?KY*> !p @җp @ 8p @ 8X]*u4Nrϩsn76xv"56m@A\ܼú7r nzWD3Xk+ȲRu*ER l#3 [#'rnxS7kXmXso25}Ւnq}= kg$/JDףRF`lfFFRtf2_fq7&ʅ? ܓp'vuuZ;:KrYJu=hP^j8gaf 9[Οn%n bnfCvxC]#?4tCׁk1 v$yDnեT7:q-R^oEQ ťN Bv[67p ꗿ`_?kƘ>My* &8ǂQl S)RʵgUvgEf+nmaDn㕥.\2Bj&(FlbLi{Lѱ2q`׮]7m[8[gzϵ,\Un @+T9pv Tn2nRݛ'p]%xfh-IQQ#QO+USZpf14yyқ(ކc_g}cY{=VzJh]lc(tOo,#'96I4J-ЬUhaHd;,TV&lk:'YI=Ŷtu*F# N8܍ ,ק)һOgo~~aaaar*__FnRZ\\=yO]?O^i-V)FQ& FGTʶ98{O/f2>TRq/b\ݓ@ ܝF<Nh);Q+ˊu+{Q3`|bm96qdN\& #T+T@3I)vP7 [gNdﱚ_&^yQA7JhpW+~yYxoK-5"N֤hmDmٜ7LC`<`JnVKq_ShQ&>?QaoR\7<&p3LC@8p 8_vE=寧_`xk\eopz׏qg=n17%0ngqg Mkjjf88|W8p"nyr✁&5pW3֙,eW$TC8ea{TSzh"W \,0qϋM3N=4_vʕ+¬GqCu'qBҐf,z8g`! 8D Uw+W3879 9~B{6wꕚ/:b7+ 6qNy; e7f!/Nx gHA=s>==|øoݶ.[ͣzc:Ȫr'}N뭭uSϲrsLUi՝P/A 8U>1-n0nk۸{”ŕ P5d$"f7Ԗ[V pc8X]q=z ܽ 9ps~e./Z 9\~AG8,o+cK%xV-Yj{(~ߕgݻEARj pZH\ZinMA58.t`ںzJ {m󤡚9\'F널أB%q_g;o]hk?}HDžmOg?pt4Q*!F5kp\Rڮ''tk?UTߚ{ꮗprn/S[{ <_pG/WWۗŤt16uH8)jͲcȣ,- Iivp\R[gMؤKx!V&nUĶ$ oN"s>⟨/!px\A]eݥsuUՎ'ZCzag1u=Y_pC~2,bV+RX85TA6ki Iz[x+ e1oIy Eqo#嬂-g `kSbIQk69J\8c5<~8`ZJK}T  o#?K9eǁo0R| oM&' >Z  /KII]"f&݊G8Еi+W%vnXF}9CRg:Et?<~As:d6fԧs r?q{[HH}IK@qY$lo70ޤ85h64A9{Q ח/Z#W݆x1<]S[=S(18} 8CdYmonIjnϥnM!8(poL^/햔oL79 U51ݱ½% > `%k$cBS/P5Ik>7=~(pJiMo[兹ۯe6piig"o_8iMa<}8/?GM…^WߚÎSpm~xgimOP /(p_<~A f888ppp8@@8p@@p p p8p p 8ppp888ppp8@@8p@@p p p8p p 8ppȟo p8Kɛo <p 888pY8eYү@^E~7Eu!.0+O oT>D(L\՟-,e.g}sow_n'pLQ@NWq׉trx [Y+؀㼶p|ى7blvgUa(zfkG,Vw BMT1A !pGJY R Ɂ?*Sm \N37ȑ0Gk"̖!o5%p;͂U;DŽpspUW U ӜD2-E敥B͚Q$p%cdN5M\YFmn{ۜn-3_Jt }9|JNKӎ\>rYFKva`mA(#T7Ontǚj3e@S,"o$arwO!SJTH9sFsLyN 8cXWDq2d F7Bبوb1P+׆b9ccYi\"ƮI?p[)ùФj jt/_Vz0rI1<Å%ksGg\G~Jt%0R!CYY@ki: be`6qplh洲cc2Z*58MN<φs .os89ps~١˳!5q1B3s(1B`Ŵ[e`6W7pl]'q.+Mq1H#gX8I'%y^]1s`͑=`f u86:siwP9\ 4q0'V#¹y47S f \ܯ~gtNwwh) \L0R;p&V#K܃%ڿvX~FVȧ6d8. fs%pl]]_8 gÿ1)yqAskKd:]~FVȧ6,U^fPglif3m+z87éq漋cp#; ; l) [$pfC_`;ԃٔigx4M@~.p@@p p Mo3MPwj;^vrE Dݟjν9Vu.u2DU[Q{ bWn_ pt=dP4싺քf8A PS]T1N ,,0 DppG.MGyRpDdr&, YFsn R*HA6d$tK&iY=>nI](_ǣ7v2VEl[12tV"2Epok_ xR n.N'rAJ92&iox7Z'a79rpa*|(TҬ8Qi,e>2 T/X6(Smr+i ijTOlb~ a}↬n7{MF PɅp3 ,49:D44 pKp@@7q "@ @8@ @8Ќ uO=1=#8,IENDB`Kst-2.0.8/docbook/kst/eventmonitoring-chapter.docbook0000644000175000017500000002541412277111530022021 0ustar synthsynth Event Monitoring An event monitor data object essentially keeps track of one or more vectors or scalars, and performs a specified action when a specified condition involving the vectors or scalars is true. Event monitors are usually used in conjunction with live, or streaming data. For example, an event monitor could be created to monitor whether or not elements of a data vector representing temperature exceed a predefined value. Event Monitor Dialog The following is a screenshot of the window displayed when creating or editing events. Explanations of the settings are listed below. Event Monitor Window Event Monitor Window Expression The condition to monitor for, along with other event properties, can be modified in this section. Operators A list of available operators. Choosing an operator from the list inserts the operator at the current insertion point in the Expression text box. Vectors A list of the current vector objects in &kst;. Choosing a vector from the list inserts the vector at the current insertion point in the Expression text box. Scalars A list of the available scalar values. This list is composed of both the scalar values in the current &kst; session as well as some built-in constants. Choosing a scalar from the list inserts the scalar at the current insertion point in the Expression text box. Expression The expression to monitor. You may type directly in this textbox, or select items to insert using the above drop-down lists. Ensure that the expression entered in this textbox is a boolean expression (i.e. it evaluates to either true or false). This usually entails using an equality or inequality in the expression. Note that vectors entered in the textbox will be monitored according to their individual elements. Whenever this expression is true, the event will be triggered. The action taken upon an event trigger depends on the settings specified in the next two sections. Description This textbox is used to store a short description of the event. The description is primarily available as a method for keeping track of multiple events. You can enter any text you wish in this textbox. Kst Debug Log This section specifies settings for entries added to the &kst; debug log when events are triggered. Log as: Enable this checkbox to have entries added to the &kst; debug log when this event is triggered. There are three types of entries in the debug log—notices, warnings, and errors. Select the desired type of entry using the corresponding radio button. E-Mail Notification In this section, settings for sending e-mail notifications of event triggers can be specified. Notify Enable this checkbox to have &kst; send e-mail notifications to the specified address when this event is triggered. Also enter in the email address you would like to appear in the From field of the email in the Sender textbox. ELOG &kst; supports adding entries to an ELOG logbook upon event triggers. This can be useful for remotely monitoring live data, or for obtaining summaries of event activity. Notify Selecting this checkbox enables ELOG logging functionality for this event monitor. Click Configure... to specify server and logging settings. The ELOG Extension The ELOG extension allows event monitors to create logbook entries on a server running the Electronic Logbook (ELOG) application. The created logbook entries can be used, for example, to remotely monitor &kst; events or to produce periodical reports on data. For information on configuring and maintaining an ELOG server, please see the official ELOG Homepage. To enable the ELOG extension in &kst;, select Extensions... from the Settings menu and ensure that ELOG Extension is checked. Server and Logging Settings Server and logging settings should be configured if ELOG functionality is enabled for an event monitor object. To configure logging settings, click the Configure... button in the ELOG section of the Event Monitor dialog. The ELOG Event Entry dialog should be displayed: Event Monitor Logging Settings Event Monitor Logging Settings Use the three checkboxes at the bottom to select the type of information to be logged. Include Kst capture specifies that a screen capture of the currently active window should be included in the entry. Include Kst configuration file specifies that *.kst save file should be attached to the entry. Finally, if Include Kst debugging information is checked, a copy of the debug log will be attached to the entry as well. Additional fields will appear in this dialog once ELOG server settings are configured. To customize ELOG server settings, click the Configuration... button. The following dialog should be displayed: Event Monitor Server Settings Event Monitor Server Settings Descriptions of the settings in this dialog follow. Configuration, Save, and Load The Configuration drop down list contains a list of saved ELOG server configurations. To load a set of configuration settings, select an item from the list and click the Load button. To save the current configuration settings in this dialog into a slot, select the desired slot and click the Save button. Saving settings into a slot overwrites any existing settings in that slot. IP address and Port number Enter the IP address of the machine running the ELOG server application. The port number that the ELOG server listens on is configurable through the server, but by default it is 8080, so if you are unsure, enter 8080 as the port number. Logbook Each ELOG server can contain one or more logbooks, so the name of the logbook to write entries to must be specified. Ensure that the spelling of the logbook is correct. User name, User password, and Write password Depending on the how the ELOG server application is configured, these settings may or may not be necessary. If they are, enter the correct login credentials in the appropriate textboxes. Capture size Use this list box to select the size, in pixels, of the &kst; screen capture to attach (if specified). Submit as HTML text If this checkbox is selected, HTML tags may be used in the logbook entry. Suppress e-mail notification If the logbook is configured to send e-mail notifications of new entries, selecting this checkbox will disable the notifications. Note that this option is not related to &kst;'s own e-mail notification setting for event monitors. Click the Apply button to apply the entered settings. Click Update to update the ELOG Event Entry dialog (the previous dialog). Additional fields should appear in the ELOG Event Entry dialog. These fields are unique to the selected logbook. Once you are satisfied with the settings, the Test button can be used to send a test logbook entry. Click Close to exit the dialog. Kst-2.0.8/docbook/kst/Screenshot-kst-tutorial-gyro-multiple.png0000644000175000017500000004623012277111530023675 0ustar synthsynthPNG  IHDRM+bPLTE9׮ԟ݃HFɄ亅}جwˠnȒT" ˤ #xCn~¯߫в¾ÿۢڞڀd֑ԏҋυʀ}{wsnlj~c~_{\wXuPoSnVlHeCcDcEeFfGh2_a+Z=ZG^CX9S&Z4J{MYtorkkkfff^c^\]\[\[ZZZWXWTTTQRQQjQMNMF[FEEE0Bi*q|L 0s%ST`8~ۼLL&H‘!Z.SgwOjӳfv4=3o~R!dh,K+Pz2ԭitwݰy?vk߂@˸s /nmnFi׬Ya-[mѝc#;=]c;TI{qN8/]m/.oy`:]Mbqyٺu^KߺH{~Bw@k ڏ):i+Ih,}+Et{8."ֿD 5Y~{YNc[נS'5#oItX TVG Fsk*bnM/Ez9Rq8~F/ҥE7k$X]'moDBL_:F.[4rD4:Dŭhk+EzFItE4}e+ᕟ~l9y׿ֹ>x5z1h¢hФ'z'è!v)ҳp'3Vw<2oM8dx / w٤qm_3i4mVBe}Uu^>mM>A=M~߱p>mX=Ϟ>9~_zyiqstwOgq8]|qX]-M~.>to`QՂSdq٤MR?y9ߡ:<~_L}gNˉd{-/+$Ir %G^ye!H'q8ƯZ)x[gś/p-3߹lbjhm}~\tHߺK\ٝOzsk89;:}vvӂW]׉q9^|~GS']mvXDϦH߶Ko[:ѹsysgΝ;?Kw=ictaM}Hv9{=[4śe,xʼnWaQ¨rJ!SUxCxū겜2Rnorz%ů` 2Ry(p]XVe꼜e9el>Ab1] P]t { @A @A @4޷'d)],}j4)&Va *isVUz5dXt;'3 8DĔ{gڝ_'p& bQQPg@:Hҫ?nB{Mlܻe([*d&IT>2g}]>IH&ۛEbmހt mYd..ޱDְ);Db|3\wZ5Cвğ9SZ)&hX~lyH6Ƽm>=?p`(2@u;C+D[ɉܣ2c۳n+H=8'A:kJf)ֵ9voZewڷ'NJA[92OG#;i3Z۵if"k}e$˵Gvoe6rh8ilq~, VH[1ǮBKYH/ζy|XOAz7`Y8!hyl/ZtbE)ϏgG6ۊYý;{.',=>e:V;VecaV[1Ǯ V+V:2>JbEވvĖ]BU;Nev؝?D-&weH6bM;=-&D{=p3>IfW1{[9cbßːbx)+H\|"1 ^MM݂lڄu1fU8KDbBubwlb'Riۗ&gݾ}27 ؾ1'4] u~@"NmЎӉX+F޽Cq+=L}$\v2_:CV'j gVeP]HY&ɵF<۵yth3Bj_|ȑ B7Q9@[c9O $_X)iJtz9.\φ_VrzY?{оn?sFx55*O1@ϙ-G:i2ap…Iit'DϮ~Ϧ19 Ii7(Xi} ',qfBz`tI"'A#R]G#?:"Vћ_vDyײ|'"ȱ͵r4Kxg"}bD6L5gێഥbkLVJ }j.-󺻻*lZ\rE/`G~HC?ۍVn,Ңl˴7qLu1pVx#ɨ SEv)XG~f3)&߼%9.8|̂as$iT@:V6Ҍ/r^HtַH @7[D?~ƒSzdH;z֬3:4dyE#k|}W?""GOͳpHSl$>4 cɑrsT8j}Ij;hdH[ *wJʴ͛29@8#iH+*C L >WXJKSg̚s˭ Cx r [tum#7ahB&[?l*EzI߮]j"M0ML r/y忨z :&@wtԯ FH"L~:Ӈ_CI{VU4E-t6"l+MR_Dɭ׮]LpNE&Dc1& >-I4q+l +G-3b<4H]QC$my򿛻DI=q8F(tTQ L-`&HT\ .J:HT iM+}x$8,E}i3Um?_Y@:Laή 5>)>h#>x[7w~gő0<#}"ӔZG0(Gza[LK8Z8f44ɑ(tGyHǞȑS=w$A/)D_#M$WL2@a/Mx 0HKNR[o;~it²Iѣ$H\k]ӓ2-̙$ -ӼH?tE<:#WG;GHLxxdLj 7ns4eῩ;-3m-8p#?zK[z<9bA&#jW6҃XeV)--vF$û.:jn}Ҙ˗>dNA|SDzZsSFܷ籞&cގ5)`o6 ޯ Ռ]|k筴tﲘ>zǶ#Nhy.ԯXh VZ^3-:}v)ѵBC_Rf %wC/ݹO/~->jR7S>I񰏔:!]/mL*`&6yCKԇ8=s5Ķ֭ywUϊ"$Fl MH .[vϣcw_ Dwʟq#M /222B%QE| ;5FZ.q(FF&-q@mR9H.iJsT""_]5BND;cD+_XGF˷E{=* 4>i-"Kټ xo+LxK{ISDO{$sG6j/b!dKw2ԏّ<}32H'vؼi֭]{{|`RXcFf'kuG0bxJ\?/ƹY4) Z dr$b>#%GMK~i|vtD ֚]UdlHcg<Ԟ*\;>~n+[`*t隣Kʕ+hRi'K;h@)!^gV}, y%RF-6)h irEtG ,0^ i ?V4Ky?=kr)CեdP&"bKDs8N$_LΡ|n6 k_̗AKҠi   LM HNJN]iP(iA4H  \ A @A @A4H@4H@4ii     @A#}{HcHKi     A @R$*`w* &CZ N3֕A H[^$a2ޏxS2D_#.JFl0׌ $Px5/K_\ޏ"s2Llan>v1kD (=ܾD;AH\ NxE*!F PRt1ySF϶ *E6ʒUy.ۘ"+.;˥HB.@b'f)HWXPӨd )*.jtVq=UX`2* R3T57b-я 9E|<UJRJkKW\⁡t&]i!ҕd,NIW!Eqg!E'+-ť0]C)OVzL+B:* +ӕݥ%]H8HCNX ;HC+.uVbӡ":]aEzj^j! 1Q ɚJR:^z2+dK- ߡқ!]P\FBeSŐNct)+=Op2]U:fYMj@V4 i Hw)v49JtS t(ӥikӘH+KWR cqKK&YGiܐHOK s<8uZ5QOVV/]}NQ7(S)]Np\jATMQ ҷƳ ?1QJU"=844t((HHW:&\S&CZGLJ_~g<_2i uH+ۖt'@xzR)PVQX?]К&%HCs'7i: g: ͌\ȗ.&Ko5KHcZ/RK=UQЩa-/5xj!EtAq}2G qHitC{.ExEi:jxtZ\)*d[ iuz mȹWr}jtzYYF:M'hj6N<= MCr+]/'kxj<m~Q+z+/jMFa@;5Fqb2ӀtCSRNi@i4gY(mXR+]/=wZ\~W@x tà:TE5'WZEC']Ч<"U\mB.K &3nvoEQS+^kZdZ\$_ܤѥ6J" )i7j-cu5Tj $tJQ@'Me!6&Eڷnȍui(`—9ʑB!@H@Sik|oYz#QqY(ϓ=' (&$D KsnQQ#Qtys!c 2ԗ @ztq+Ϡ9x:d(BDM\&ΉDWghƶ`jH=/K`<4i>5qH'cN2dνC++iynV 5ҳNDܦMfG|$jⲐV'kNr^Q_I3D Gz>^f4n5H (ˈGy9QTgȎGy45-ɶRCfS Ώ߲G .+yDQ!;Jd38 j$@H@4H7HC ~Ds|+D?qs^(%@ΐFXHً'zf6Hңy6\($@ސޘt~$"Wg2? mzz8i2iHc/\i=hG|1{V4#v>]~b}M%}&_i] i] i]W^ҺZ#͇;uKgTЧi,<7onls#- iOIObV{g65K3Ri̚@ݑ\^Q`Tgp~to>.(+z1 ] Y 0򐖧3I=4Vi]( i?tUHˈ^R0+CZ|P -\41&îi %*ƘD/lAv۩e=iᵚҘg`p|o4-t1qHè#-#0zHEu_;Bn=0Wu7lu>YzeHKU;}yyҺ3g؞o_OKBXE1L~":U!}Fd:w^Q炕iH:?7j!]mF>/GYHUݗu7+ooXV4;"KN_H/C˃?H(Ҍc?S ҘJ$|ӭU!Ҝ3y B:i 4{i iq"]n:ǣ0Ŧ%芐.duP{]>"]8SgH9XiZBGHF;wKtҾXM/H{?"<*H U>a ;4w*CZ/i^mhKq"];4 ?in^ck!*>Pұ_ֽCRuH rH랔ruUHs}(Ɖi]̥E+>r1_i {x[ Ҿנo?ȍ.0^"zmKFZA!DZ41C:54+ג 9YHs1ʑeC7ttCtי.ltNN{q?j\jŷEU \D+xIƋ;! ơDHFxKWs3!-ݣspshki]=w(:d*p!\2I>xoX a~N-v(Hs0U?|4/JQ ekA _22{[ XTպo.>q$q/EH;qH3bn)RT4ƀt al4q]"]`őÉ4i6 r֕"]̥bJ4Lc#MlRu֥\X,ⷞ+ӽ *PcG_/P ?s >aҹHc#BXx}әޒ3ƎCbH녑ƀ4 17+y1tI^i_݁!-N5jH^jO_2ֽH3Eu, aғ|~c44תh*MsӥUMori&}"/SDOxőƁ#YKi H X43.neXi #ːii̞"]O1/KEӻ)>H vL 4g06VR}1%ځ~쒑f;AH뀴iq퐮`Ңrǘ2ǖkٮjʞT4^ٚ"]Fx2Wc:/Ni=H#M( 0&invxivAc͌/-i@{;G"qDdL|:C&BʀF~"]%HW7v2JWVH7 i\EGzrCε<W !'C׽"gJȓ.U@tIV w ]^tzMj> R[lG\bXmtJ!@KAEU`Ҟ?CgQFF lTtmdnlC6לl=v 7\*-OkKBZ>N>PJ HuxxFۋ_21S!FgO:mHY 4EZU:Lz @F=e'#SM HutɎ抨vcM#>%r)ҐKJ@9W4  @zH[w`Wa|C ܒDA\V:OB3伉fRCA M_yށ^5>5qYH+Γ o"i#mMncAZDI\Fkrky@#~Ůwм$A'jٔYfnX:NthZw9n :i+vlfx8ȹ1b#inxi6Ab~h8JoWĠyPI#~Ůeb(jP@HO&0ޑE DtWAi+v X*fbڨ.EAl¹iUYi+vNmo -x ҕ\p4 ]HxҀ'D5ҵA*_vtXk\44H XiwH4իvtkWGiP="V ^wHXiP]ZBwH¾hhF5XiwH6 + W_Ѷ^dҠEA?Nie3cya A`iP(4 _K &ս^Ze+ _+NH \+ _+LH VZ+M/ft iiP LGx-:q<O*fBҠőfF/ATC' MyiP" (XiԱҞ05 >tn?TV05 i@u<SӀJ{}B;`jPMLSӸH4zҸp?խa3GuҠ8]44( V}Vj_ДB`2TGѳ9`AE}int+ .*nRonXiPtqnK!a-c%*4gǣ0襖x{i J@ǣi3ӝy {󰄩iFiJҗ.4z<ʺҠ8~\24(VSӀJ{w4;`jP -;;`jP}8H~xw4 iNąfMJwF+o@B]k𥽃;&Ʈ"aZku8Hk%J 6Vei 3C65GlW]!%^=.@n$ZHkHu s*P'C)\h==$UiCfW.oHdpBڎ. 6=,Ks4nј"d8}C߇a\4Rqa#i-dHciHҭUXDͶ1h~²ߙ͚kzs7ui 2w4@pdVrÁ49Қxeo-BJ}q@ZcVaHc2;̪@C9ڋ\$MjqѸgKZ  ;מҔši ;i]w¤ɒ/Hk'襱l&uXV)%0Hx86%9J#05v]5_Lxk%]ߎ=k].̽\5<H[j\]LӸ0x1+c%({&59Ia1! `KB) R#4g[lScWLxĮʭ󖺣fl[걎asrI`[;,3"qNief=T=B[M=.sˎf4)i^_rcA,iy 1ŃӮgwqk&ʶғ̅zi~'f<(M㞾vIhb1qH˻۲U"=>5ӞkM޼GϳZγm7;\-56_ғ~Jo 93_Izߏ"fnsߎ;ziKSӒlK"t z|w)R,v9HIaMľBQiy1jI#]tX,B_x8LjKmHKZgl i%x?5hJIMN:uHɐּHK& [iUXNO&sO}GDM\pCy2?>CgvV4D 4}Ln=>瞢, Q[ItD5i1Qx Q!{D5i1[2(#Q<ٟQ!3;2dP^C8 PHiFiaۏz.Obch0n H ~<{Dt1ՌF:Cz4;F;\($@ސޘt~$Lb< ]wH?|mƉL+ ]HF釳N"PFt"=?;.{[CD&ҳJ/$C)4΍>~EFݭYp=iMY7@u.i!^4i|AbP¥ƅ@ȡED:RA!mHi@HҠ>QX H*B2"HJd m~sUi#McHt WO"}.4ßt WnҠ F|8o[-zlܾjVM8Kd HBz]]cO7$c{cNVD}6bO-U o׃OӚEsm7'<U41Bd'(%b&mY3hMU4Ü)O/FfұX]M~ґQglXUҩ.f|OoA>"=0`Ez,rbr{ZOm'A#qhDz>1H\|"XNc&NkD@MH|u<',tx>pvSU"/ZkeӠ@T5 j 5ҽb4 &z*9.,PIϦE@wHcYu@aWj2*S0&(zUAWmy#ȥH} j? DSJzym M_pˁ3IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-mditabpage.png0000644000175000017500000002046012277111530021315 0ustar synthsynthPNG  IHDRGPLTEq ~wusridcbbaZYYYZZZ[^_YTRRRRQQOJIJJJJJJEAAAA@@@:88:u;z7{BJViӎƮ˶̼˹Ϫđ魒נu}}}|s~9u adZMYXY]\\cehK_}/_!jS}M|"L|!L|!J|%6);j&=c9[B9C5<=533210()0 4?2tRNS;IDATx lE'@ :X2B!2 mZk'CfGAnVVVZYhHq#~@L;68؄2"3KWկ$d_?~\\QՖWVZ;.ըƫk5J,•bD$sT:Kc򟸸RLuIT%˃1ŕJ5YMI(:75ZmtD.PɐPBָ-wsDTN#N5<`:cZ~q I+5fVɹ>9'O "t$\ tBs]$^b$ FRQʅ5J#"9sʗ9#ߜP|-N'3=W̯WBd#H F\(Q#KgfsY-sbQrt*l"Lo< Xg1!W):=RBIc:kV3əS9oNhe4:  (1&B苓Jɚ7ި!&8҉ "KmY$e tR׉ x H6_t@s9<̬IH: y$g2a˱`Ps0kLd3‘Fȡu\pFmגTDd&Wue?IZȋ)Y-B%"ZeJRZ ysۉ\Zu:sy M:AZ2:^,Ȍ9NTM6I)(d"ʼnEr1i*rҍdcDS{+ȂėKz}ҙ+qǞ݄rmQ "VoR,ȉ+,O'Z[hƝ˜tch*,KK;Mm&^= }qNJoOևlwNٱNNL9v変W/'OM7O'sΕمDg2ߖ5ˌNviN4d%-ԸwWBS󇝳#?ٙ:OV q`md@͊XdW¤Ra9:=tɷJoNyٻ7E2˝r &r%X|Ǫ弓trq:8\NBi.&N\_[N[NQGk)Wzew2?~m=gw΀ft>.~F;v{v,z']Nr7B}WASCC[dp;S׹햘T1CFON0=!PK9>oq5-kβ𜢣pB ޸>iA' EXF컢ߪ;יN),]dx[Ԏq|,5{ܽmtwwNK(كl${މP/nSu_ U*--ij 0΁OesmLM :/𜢣qFD8[^k>;Z Bh}WPz;r\>Sǎ);>/9c>@fbFh]I{=tѱQEFxrދ3x,Ikm*)yr+B9PE@BqN #G D'j7E'N/LG)Qθש̲YWgǓ>Q p$wǂK13-dEakTdu"Sntv}ɤhx'?/^̳SA PY~ܝ;w旆BG뵣~8qtNZS_WizXf٨;w]μNt/.y SX0-dEªsF+_;t)xvz}{ߏFOi>fS"=tNi;Lz;N#B~tV4`T_jw[9sk>]^@8a iӧ8Xl'w:Y6{~A]ˆ~d\c @gp o?j {YQnRנoCyu76Am6:{$9s=;{&cNyg}rog'TUTTDEɾb0񢺺wE9#nz+WÄÉcf {tIׂ9;Y*/<^ͷ^8u#q6t~K'lھ]gswwIE/}ᇗt U|u`tvss6 g NGl>wʲDw.Vli"*J&,jB:&Ɲ">Ҿ)$Ϊr fFg:]L: .z(g*0a&QUAfJ䝶&j4Tس$K.='/*{9r@Ez^9I'V:wœ c:s`"5xZSqϯ''/E0{woSz.utxZƝ$Hzvr\xά+Q 'dU0u:f:ugE"QM9\_r+%>p{v.{n0:RWU_}=NRhBp(sDDgwGwtO`eYi$6ܤ;Qv!;7d]Nkk1n$5:< ;˸aWIM'Ѹe;]qMp>۸S/&zPF}1{Ji}5yV:8\Q-s5?_x ɯu 0Lj~<8wWkc8A̱6CCCmm3i:#ݑOh;msl1gww<9:ww {*1\* uW毠92\ҳ+H0~:YӢgǾW؄oqԫ=гSeW^K{W':pGƸC^/;H [3o=g9:ް*%.  f:j6F8kf4wQxʏOoxoݼ0Nk3 ]mpRNXtmPQ6wn!#SQ4Nٓ~zlos 3ccݝCC##i:9#wvw:'`kF'9Ee*C-u'u-= : |,<;帨W{/&c?AXfh}WtE]s~NC^(t8xgO:=ߩD}N's7l|!Fѣ; {$;E_b]_a/9|.CpNeN]<5OaNAY!pr:҄OEaҪҁ )s=фŠ9\) KReӥ%9?6e۰·dNJM2eQʋ!Ŕ fq:o}:i3%U~i^i-MfR6otsݸ`l=M,|ޓXL'fSכ$L;:?T O3d6T(әt.Lx_^XIk0.tiH4)dkS"Ng:)H H]NAs:sds81tr*:׾?0^Jq:93tނt'vH$ AiM'2VaX2ebPKQnG` Ej%PM 1tjR XV`i@0 z 9'7m.ֳ-Xz0X6HZ7l / +n)G~ _ !? $jL)JHJE1-zCI)uJ#WrE؈Q戾 jm赔Pw@ock戱u#]73Bե6:3tl@lA7mi`c5SÏLd5SYOqD };ʘJK%+;O?:z*: t>dW֓\){ =|{7x힇7x  {/w8P>= QHB2`OZ$J߅[W`WTFדOmO<ѕWJ|~Rѡў_)()E; {h>.%Ld>,pkY6W[㏿8WJ| j@_IuQ'jH|}!F >?@iC~qI}ȋz}B2{@TcYqD·>t/uCv0j?K__L]A}gAGB'dAl,Hkgȋ`G z:ǩO|1BCYqD·^ @2+'I*p^ܫ$*řY$y/,*ޯZ vR>\;m2qD7wZ5ق2Rmv:NZVBzm|AR"g:tCc`7`qE/oy+%rH#V2tj 8^~¨+hV֮-Y~eetФjLBUzHVQ_m4SENo V_il Z]7Z__Ff8Dj%P?@m*֪/ffz7grDgAyPRMSg9~Wg˖6oJCækҿeKN+;~q}\)a>rg_wߎlWΖ͛wܳ+%r>G6lHxvlޜ|=pFgc[6#}x309תtrqq:8\\N.Q4IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-tiedzoom.png0000644000175000017500000001145212277111530021053 0ustar synthsynthPNG  IHDR.QddPLTEȾvvvppplllhhhccc\\\QQQLLLHHHDDD>>>999444///***&&&###  2'ZyIDATx]˯]U^hQ4 ;!`82P&0qB8`)ҸH?B ZJ 4R9sco/!ַ~k^-T..TLcw]]t@t@@.0= wx`C5OF@[Oiu?@8[@ڣD5ӳKO|I{ i5gNtћ+.̡'&CZ]2DmteQ@*KΑHôRq ]ڕ[y LeMK1U[-e+]Lc.+yFըFduzP0cǽ⋁sq\*dSk;RSjLls1YQ[kXX 677LnF"ڜ` }0YnĬAٖfv8^wz)m{xЖ wȩ M4ғ.su&^gzFtvmȠϽt+.t K\ˠXk3C!m b]%)jKֳ慾Dl5FVwD*HԜ[/9qF~EkWTx5fc5{SE$c1Zh6םWڽʫMƱ(hljƪP+v_#ޥNP"о]d%e[!]1RNmTp2SzmfMڤmdH㵘w ;=0PIQB{d >fZneVj"'y%. KizS.|ٰ3޴rs5tYml[x$L`0 :v0]J9[ʁ/y%X_00x|+W JeHaD) B4Ԙ4xA˺wƸn8d%{K_rZXk.xI.EI+"-.c.:}oc<%k,5/c+͹Cx!v2w`(9\YsU=цra`"ZSR w#x5%ʒd(sONb?-^RVr'talц⯞EAPuN^\uK&y(., ֬,!i{.if2pBC {!u]xc$"Sv]xdž`t 'yM耲2DUܥK$//4Xҥȴ3J#V.BDI%>B`t81l&ݙ"w%{ᕺop»E/M]FZ.UM`0ޅqZ1WSQӥ%zk]P.K&tq(w@8dzV|鷝6۽eKm\ F.8x[DDtQU=Nȿy˳цR?gyᱣDOё#.ӫMH?-~ ;G!N}+ozUޒҖ;H?%~廿~tDD?@D ݧ 7Ə}ؿ! ŏ|gwٗ˻vEvHP}7}zeS%9OEΕ$=tg7Ϝav."AwD/<ħG[GQ+]8Jt]=]C|LGљl-GI(5}3Dt.C/^VqϽ"@#^;)'ŏ|WYZ>ѫD<}?w{RGrKNl-F)c(.@L16Gx[g\{}/.?7/-ky΋G߅ M>_%[a pozkO]soc5=r~؛9}S_{OAHuw҅я~vݯ:2n;@ ]+gN\&nts+?PD/Uh ꝷ +O:w ZA(e9;߻{VO/?U"o߶6']t@t@t@]|؆54A# .혻+# q=` >7>d\E.U\5^4&3l+}(c%뇦.z}6Klgm;_en-~4Z.6*8@w Y4m4cmqRoo E v6ް]빧3GuCS5^u0j l+^,lsv\Xfijur,- iu'l= יFuֈ gL } ; 1NnޥkJ,bq,J)MOnaIgJ0PZ2r-}0ˎjm)~ lK{h_oNdr:͙pP /!l/K%>9]KbHQ ƷcPb&IۥSTV  2[IlQ9 qXj+[ چ X kbs%wʍ mT* =l@جG t Bd)+9^ަEyqtn6@[RI\ʨޱ޵ͬʺUt)ǭggN*YUV*Eӥl(3} wVL 2Uk{l>PnOM%kjt,/gYХT DFZ!t/"lڻX\Pě\pK3O]N0=*l+Y٦ db%@p J Zvq"<:+m*XR45RUMUũ)1Z޸K&;_HiI7 Y̓m+Ɲ_٬I%PP( C 6QDlrU6hso1M#-+DZSĶbc!ͨ2L7|Q1.$TB![EjU2⠝(m,ɂ.^FyߥyUw;vvoD .\3l\ 30M|f,*b6Y-:TmysM`3#"}ܲ&jG*+FUf8Dz}@t F Ҭl>/5ZjxY=٭'-sوV0B}+ǭ s$FGW~cr^W]b+%u-ń*o0PyIĭyک\U:}0"Xn>"=vN bIENDB`Kst-2.0.8/docbook/kst/Formula-kst-highpass.png0000644000175000017500000000173212277111530020317 0ustar synthsynthPNG  IHDRxXl8IDATh!̲@os 4FR(2F#H4Dz#@0,B Ys r/|Sܷy'wP~ 8jC7 ?¡;@&/[On121l=S|yTNS$fm%>*{ԣh`7  "I%%e#0;E@E%q@?E!C8fyNZFrNU$A6P`;{ƞ7&0_ңz[\t}AxM 9}cTFCha^iǴFq(/́őK53jє@<Ж%"x- F%d #F` `5݂娙앶R0R8,Ą`<0Pɗ`){ W 8!9ƶ.R08B凰+ lUn!QRQ0e|K, |mm;&up\}75u\yiS CIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-curveoptions.png0000644000175000017500000001355512277111530021767 0ustar synthsynthPNG  IHDR1e!PLTEþż&%&026%Eh!Kz$O|GT^QVT^`_~<(IDATxMkG_@` 6AdDB:8`< ^2qBnFZ-ð,}c㱥,PɒbL%gޫz{5Mt3O5PԘxA̅DV'J n/r|qr\xAt #sXd,-.tuQ\ԊD-.Q~+HJSw @,  [ Zo@Sͽio (pgSRYa|#wpR[ Ex$7 U1G fo@,e;B2 ]9@fMp#2@b|H Ė7 / < HmK]o@b"mM $"y9iqfQ- H ( (hh /drR_ 6&b5H7 $q%o@( p+"ހFOV!͏l) b!<ˊ@*0o@xPހ:("%ʔC4T @o (X8Ղ nvպ-@p )`PыAYjǏLf y+ Ԣ[B]Z{߇e  %$yD* @A9_QhA@ @@F[sO;, G#܃ÊD~-~+asy_$cH- D2iv5͊u"DnW D@8D`mfB&(Q+ -JdPe4L 0@%mNle[/ @$w~ͰYd:6D1-I(GlcD  vVz@z@FYH?D.:B~+@d^@h H, :;#' Blg[ 3ԩhIb<*2@{yT #䷒ ]UhuRWZdީ?̣ SY  @hH}7Hm7HM Ejj G Yןvt`z^r8H@Z68 ˣ`ZO; 3pGpxω.\_8\K'EGdOW=O \E=D. BH.]aq٪P K6Ts Q@2nCZxtOGft{x[ l7x<(!&@k3 qXrO/1LzRs]dz:<66#,w&iaW$hHk" OcWYb!D8m/({glxzތ DF@q-E߇^̥=n tX489|p"ܩ82v.<LJaekУ$,a}lO{ݑTDo Gjh{xA@ []oϠ1~ *^8즤oF+cJzl!k $3^8N>xLtTȡQY@ 1;mXO::er;}MwaԌQ2FՌ@;dմ%tXLBSea xD^nLoW- l2uăR"3zQ* f%Vӷ!n5&r3iRF9YQ{q꛱ʊҵD& 4h@x N$DU& nLZ2KVjK %bi)ڐY҆v@ 1TY҅|@ִ@6č!jZGnvw^kDuezYTkzYnŃ!1qUdZI!'(>u߇Sqd̷ـlpjN߇} m@F\GgN)w*x> @ @*1[.+n=\  D;u lvݵj;mHuT'NiGt6%1| ՛i7q@7v8d+3$rc'"I#?W6Dbfid?7b! oT [:Qj+HvSf ,@@ @ @^C _נr%[ȏC%D~*Wrm|KQ?} *S?KO)O~mPut-Putx  Kq @nם@Sfl^ $<..قR,8 ,yrxdj ;)ԡ:׼k)|#Qq@w߽r_8#KV|%G6܁_!$p'>>H=4.Ǎ?}ҝBf9*>.ǍkkC Q"ZoM;O,GE ?$` SlԌLzԌ ~0r O3#HXa o![2$'jcCE~?}ȧL76aƣbA3htn 4<t/Q$M)!@&Akr6![tmup FT~U19ytڥˢE#BѸ$=Y|娎"+Ѹ\>~I:eQ}wT 6)RBsx >`+.Hv0c<0Etq;w.sAVSA/>Cg&R 8d+IENDB`Kst-2.0.8/docbook/kst/Formula-kst-exponentialfitequation.png0000644000175000017500000000111412277111530023302 0ustar synthsynthPNG  IHDRm%IDATHOd#qb !!,9\氇!=!s*01U#žrqRRr!CeR!*¨wj~v'6}m!Nz41ƶqd'yG?M4Mt8Fd;l6۰b@?އ{4M#aˬ^?Hҷ3aby?G4ۓr! \h_osM&iw3Ŋӧ95 CNwpOgiP6z^4?Yfyu'4T YdMiw%ot#.=ݶeL߀cc1  ͢@8P"Et5D85u;}xO ;`jݮ !O[$hf`X02K6Yopɴa4A?t#TZc^wWڛ܎|9O«J۹b͒ҟΙ_40k/%ie ߢl3IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-maxima-datapoints.png0000644000175000017500000002314012277111530022636 0ustar synthsynthPNG  IHDR` lPLTE:cAg@nG_PYvۄċԧtԚS:# vw1y&q(c#[ZWSL> | q3`9S5G)J L A.*      # + . 9 EA#;(*52//2/1212.24 =>?B>C 3O'`%s $,?S#S|!It It!Is"Hs&Hr$Gq!?^!=Y$=Z,<\7B]PQWYXYZZZ[X[WVf4b$ZY XYT =&k.w3o;s:w;z>wGzN{MTMKLJF9?AAAAA@ABIJJJJJJKQRRSSTXY[[[ZZZWaaccbdioprz|팿덡ֆ|ěĜƠɯʳغeNtRNSn#IDATx}LTgǻKEekk.aPnJKKYܪ(Jtc4QɦĈ mAwJ6vU6fgxyI9/sއ8x9sp`^v`/vU~-Tz]_`E^uD^0EFUs$5` qO9rTS=F0ks5F4zeڸ? OXk(AEB0BNozOg't>B(*;娰&&=Q)ceYP6 Kt@2MXtDY)+TN ehV5Ԯ|6)klC,PDȯsh,r:;HƩ\GYOw=**'V*ae_:a̯ZGF` Gݝl.q8Hn}EZ/?dQlNrG`T+"C#^q&)A_f[l8˟ u`Oوtd;XQprTX!_Ys-<A6A/R2>8 fHkf%A0Fϟ$sMMsLN aMJ0q 1ɰ aC`9E-h*5%&ov]+SvͶ>KbʊZnJ9RQ=`/&sQR"}E9O~')5)$;$ `DˊDcN=JrG`/^yO`]Xa[>&64Dksp_㍓[lcѩ`28);S+Kˋʏiڏ,~H]IskQS!LzeEɓ$b諬Y]35D]]EE #<תR'OeXk(Z,zEϳJ**NW>]^~xYEEpv%V4S8D3++SY&`_pѤ֞Sa`NU9ZAs nx> Q0  J@[wHeރv1Lg 'eLd\P> QVF~w$KxsKV:NYXW:5wx>`9]>. dH>!BXehkD)1;…JW\G-ܛ~ s_L+ﷺE+6T ٌaB̓A/MBq,߽`>n5 |oll {KM OXmib.yFWf^Ϣ&yRGdinM>Uo ^qz8k>6R0T ~{'ZKX b4x. K|ÉyJL˥eBVU/ K?޶L5M涺\gĴGdwyy_7O7{,j;|`AYVm088`3m(kvBD{S}H5MXϚv>4Gd齷/WWo ^q\^Kvj=qFG3k%-Q< !>Xͩ 6ZPǫf^M-]c8"MQ6l muݷNھ-U{Mcp#ifvYNڧ^0L7MY/m4CDnXw4J['nɕ["uX!-z.O;b&YNZx?`b.iZf뿷(/OZ&g8"MτՂIWGkf)[ gl=7t[WllfX%z_4d{6e{e>F{}Bq5n^KU_]Qp'OZ&g8"M3J~Me*^ie5#C"ݲ}Nb^s7|ۤabY{mg5faJņqDa+? av _[,qծc:N\56WcZD 3ņw'r 3 :L^NfY@uJK{<{K4?:l3#+UbDjض0PBt s9`4Gd-FezX||bXVψ;`}TVgz}/ȑ+rX3 թ9.Ox`9`BɪTzm"-NB8w#?9|Z0W3N.N{䔯"7$ZLjɑ˗ G1v;nQXinnir7!qG0!uoǷggւ_*-9Pq>蕴y"-yVN傫ȐF0'\!U>}^`r Ĵ!]dɇ'IHJJdK{eKF>z 8G Ӌ4֒]GG =6B[;B:[#Ç;#X?~5c K{ddxdd]l\yOH$z~] S 6zpM﨟򠷾x!m%$G%sA4uH#Kr?'}T:Ue6U,gg. 619qrϞɹ2`l%َGE\ /+!(fs`~ Dhy!,16[[|}h^y{ӺId0E0lϛB#^*ϻWHޒzjzO=-i!-\B򏇈`4xLw+.v^UWX!LtabO}0XZ7lhI0wetrRè_=BF0a#:rXst5Bfm0<Ӧ@xj]>^4b.X WB*XIR*DO~mG_Z`io2qGi/, b*X_iM_)?W_5lQEnݖU ,䪪WD]g:]I +ԧUp\*L7fUeiSshjjos &ɻZT#g`x]TzLS57>6>6ivk[ůVEl|Dk [Ll:1o_#Z\*moB_oowoSU^N5 &Geb%~RٹTM}"O~7t:5L6}7)E 挠I@ 2њ3GT.y-s~5Eɱ6jq"`T?z$R  k󌞩n%u5vw7V:1o"]Cg Xr8p85$Rh!L0Q0f?N)9Zq,ӥ -E.G$Nn{g&KERHI0ھyLB"OL4KO%X 6D2g\`m>:&2Yz<ʔa ]aT`Eӆ0>q+dYE084D*(oxr` r}"HQmfڋ*᫯ڿ_;:X5<2sv~6kB7 ЌzxbK IQD`K/Z27_h;#jj_{ XhlqRE0'a0by`؁[L`yLtHs`,^|M*qѡ^p1  - (eg3ySL{T?LMLMN6~pС}Wͷ:XӜEb?/آGƿ<i#lhJ1j`@K~J`dI2F*2Q[- DUi,+m sHbXrau"3LN&HKq0UCw8%x}*!%G`["a)L0tLUKc23Ԯ}W:[7GYn~X4}`W:<#Ê_\C (92j/zY,MUG0I&ɒE ,?bhM$jUulkjE01L~5QpISi8WL5`)RK#m庄@̪Hzqa,_Le~HL`ʹ˂y#_wJKfѤ\`m0U-yxƩi/*XZnvS~`mVҾojl:_妟o]1`b D~ZEcf,PO%  m">`exЋMY;VgյaW C"jQR`)9^4`;ϲI8|1N]s F2ߛK-T V/x464_iavvywZ0w}~&79L S^V~M1LzV,\$u͒Ed5LhCч,J>xHzk?.3T;rwM[gfnUlX̡B^O%qȩIIg5@_ETsj*RǢ|1էKνF@2jT.MLTWF7ɗHJmyfj>piiq>F-T0VC OS\v«˯ʴa6(RJK&D0?` V[p/R_iTZG[}MugæL֋G0*T+oI)d?fOh#X 'E/WH15L#6>J]R]절6~i"<~o>/ Ǝ~Y-NS㣣uDz9-_[T==VL ++//`G`t3ڋ%H_v `g.]N}f?a,m6IJP86,)B|%V!]xPmSZ2L8P"qfX? o7iiho֫-oV ƷUg[F07`-RY_`|h EX[íLMNַXgTWuF^dY}uE;)$UcFmLrb|mi+8&?cg.E0!}Ҏ˽HӑA0KhMжB?W+A#؀G~sE [U^G I homL2hX_{U#אcf,?D,^.}e%K,2F0V ul J%a|Uzs8ՓlxCSfLĪWۋLU"ypu .EOϖiD}ťK.c fL+53ᖯ;wAwwDLA05D10"<^Z0/)Nf+/{exuw;CW̐s^yz8?N¹<]¹ޖ>B]G ^$~m\'qA0YG.߰H 0ô+[400$ fB00s!A0 &SVLܘ d5pO_`8hup6"mlsd4A?Ys$ Yώ`9 ` @0`x\D"@  @0` @0 `A0 @Dn T  ` @03\ X4#؇I-O,* HzB2 Ek Ƒt*< k Uczh(M`hxK2 @0 `A0  N D0*@0 `  ` @0{ D0*@0 `  `,J 0` x#C,"7H` @0 ` h݆ v;l``Ks `3.ؚɻoSeDp)N-+1lSZ"{PE"Xڍ#l` @0 `@0)yoFbkƁ@8A0`A0  @0 x:y0`U$`@0< Wf_l0 `   @P%q`U$`'_i c v)D0*@0 `,a=zFc<*2veFLRr6A00-o$$Nl6  mu+ު\OH c1KyR?U%ᄏ)ʕ. qxb {(ثi=w7*U0D0ڭJ[BqM l&h=^$vD l, Q0|f`q-@0``kI\ Ji`6 $6Dz<"r XEB""X:{ˀ`&RM]M HP0zhx =];` @0`@Dn T  ` @0`Q`v`::`"`@0`  @0"l#I Gf l)G^zfVUtYV-+1nCT^$msG){Bfa C`h ` @0` @"  @0 ` @x\L=ߥEi   F`A0  @0 x뀈@" O0< `x[E/I+7 H0キ|+Nl6 [OH y>Hr˂RZVbL+ i=A hQ+#l``S @0 `A0 Xx!hFlM5(&f`` m0^$`@0  @0 x6nD0nEU$ýA?<ep8g#u+{S0B؂ @0%_e[l*zȶqؕ1h5vFZ]H0+l}MEd`*yM!gm%ň˞pgSKml݊l wΞ8ngv#,F>U ۮ8f64gmbdUdmU$-mO(&6rfw1FXv\Q4/m]%ӫam")3L @0`ֈf=˸$>Xy͘`[H|7ϙ`3&ؚ/8Fou`3'Xb"[AHH6iȇ`h0߶0P`  @0`) ;'.UWJ--,K` A0` =%lWr[i)n68^;e"&R{57[i)U6JCN?.`{U2ҒB)?`Q)pWjMӆJOM[~QXE$ĥmW,KZLH{E`Éy4t 40]6{9~,X[/J ", n.JfDŤM,:`=DHYAA`bT+ u_Ah` %}U`y7ܷ`m= qTUd"k:%ձ6W0K?[ޗV5yv) mhm䧞.u />"ԪF N\p)n%#WkK?`)4`x &jٌ1cYb=qټH~vM,S0_Hf` A0`OW0.~m_[ ``v |h‹vK*fIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-plotdialoglimits.png0000644000175000017500000002660312277111530022605 0ustar synthsynthPNG  IHDR8\FMPLTEĂcvdi]tXU`SVVSVSSVS:]2O(: 3P##a44Q66=662121/11/10.1+-1'2%4=a=a!>a"Bg!Go!Kx!Kz!Lz K{!K{!L{#L{#M|)U/\3`DgIhKeUMVMzVSfVWZSVSitÓĺŽ¾Ʊĝ_PIGF}?s7o6s5{4~8<:99=@AABDIJKKMRRSSVYZ[[_acht艼-tRNSԶkB* IDATxOY~cj}nĘ}X$#;$}-N:\0T63ӭn[09Ao,FPP"A@##OD~ReFDx/ދ|jꭷFzP-}xOG> :0?#TS=*etﮪ{C@ 8x4[-wWܽ:.;2vF?; k\9w 8̱MN5pؼ/ӟ|b}zow/ :V|:8 c].sY_"xL_w?/h/FKfG>M?6{Y!.?3nr|ȝy;I3cp~vv}}w`gF]0 nc/%\J4Ƚ* 8ɡn(NF7~3L^ͷ Ώ/K)%^LԥѧI9CE@ Bn'|oNNa< ?Lޝt:_l8?$M΅<ȅ4 ?dvr|w>9J߽;f_jgT9_ }?ޒݤ -ȥ4t_cNO'@ɭ* t~ bE_}1bGr0HEŃKtp Mp`S΃ФܞD/q2nss='8ESd8a;u:/;\ܙ|9ى+Cmq02ߘ-AAK`Bm!G.컸'.}DK\}}p10 2t1 B,&\rr3>՟~%˗lt(>z:d|||e{C@)sj pPcp_PM AB8-g/Jʳ7>}/)#YI]) קi/uL;E5t`L~QH<丹/Wwv.Q @dE}9>쥢jL8Rv}6Ӳ>KyK22s#&8P,x2XIQ;z-sk-)N{ +a87 dLkr'յi{׸ sVqc'9Φc؊Աm/o>8V8DNQ/ #9ǀANs}e胅ଌY,C 'o~ `g9i 88a,"n'Lfryu98ѥ]^#%-N' s]7솖{܆ּ18U[28 U7 ۙϹȱ^NZ 34MNLNW4]+8)!ٝ p Nց5F8]svcxٵ6pF},ㄕygׯQnxTV]見[tg,kzVy39NO}z{U[N8maZTe p ՑÜcAp App䇢{z 8wgvXqԚK+0ylVvXqlmyqf-3]mU|LIG5UR i Nۣ}rįtrΒɝ1 Dk}Q'~{ȣ&h>KQ.X£je!mua[4 AAuMvki8ecvJdfvO5grprʚx viܚ%L:$H D)8sRnf&\*8%}S9819MG*8e ,jq I 8px;4v kqDzi$^ҿt=LU+~Gr<8qG pT[uQmTѭwQɓHqc$ݚ[&*%,Q8y8FU3\歏\->9nA"pΟ> 3r'rsO֧ͪF'45}W,}t<ӞӾUg~pfc9vVJp*Gۿp=UyTsg n5qj3xp53p0p 8p YjtѤEXbUHSrVTH/}|tj"Fz*Rv{WH/VVS?Ez4t~PN=TxspNWΫՁҸEfKp.Bqzb7ԍ[uQZo8OWk=כ8|ٜoMe_Iz Wat{LzSⵏ+Wm#0gVR㪑:s]AѶڱWndr3c/8ꪴ)BLZF_W>yqjH~ -%R|\Ad23g*A)Brkj; Z;j]?z] ihMK˱", F}s}\{f;:/b=P8+)B<ί_`K._ u!,ծ1 3ou-jq|fsǨJ]sp•Њ}5TSbw԰b*8VylfBF2OwW8k'3BF*|Css<9h8p A8p ACl377V*7uAp A!A(5B[h&8MQ֨8hgƷf ?.2$@8Np_5pD[,Uc2,lq\ V-\oUs %è ps8p8pLb U'#㇁tHlo=p+9#NQ?|p UhQLjl/BWZ'g.q!DiTSMm=߂QUw<('zǨ"5{4T;^ϨʊG㔎 EXf& ո'.AkԊu?9/y]Du|_(XH3Y+8V8A8p Ap ALv{ l77{^3dpvovpg3UΰMl5KʒNqJfpӷ}mpVlD;ʊ2q\D5'=;g_˷Np&7ڶ+ⶫ5$m9N p6XV^7\max8r9d}8R7-i*mn ps 8**Y8MlrxkqB%MWK/Fq&:6p)pz3Ml ,SW稪 @LZ}TeUeTŭjC,9NsMgrx*i& ppguz!fn998p8pk/X66]銛eh\Wӑ< 64]Y (8`q;a sp ˮS..,LWbpZ37~ܹ릗rК7-롑nv.368979]iSkUcNgNW4]38-JgoXQQ9;K1ZqZVUܧ>Y9 +[@GU_ǣ*x*jͻ *nUxӝ )+r?9NO^vB;ߪguY\ Mp#9ǀ A A=goEp2. gvg{YzhcT>uΫzMK_JpVN4+Z7y>s3 p<[bNѰp8 "/̣s涫rM1ݹ3)3Rj{8]rc{tóoUNnq skspB-ʰ[ܒ^98OoK-'~g[Vpg]žp͢>NG|qkY>q\Y837fhm;5oyQDTmg0Z8KxR-~?p, Ro#~4p pp A A:&4Us󲱌S;%g{\zNN ^6Q05;G Zp}y1Nfjp7bpRnc ūU/N"N{~_ד\eʿ E5 K!*+d)$npN}~)8qNNs#hW Ȳ! }w1ϻN~Lϕ(g^2^ԗY'鮪ɹʾ1Ͽ(gBrpb7sMSrD([Kڳ[XB*6t0bF9Qp:8JZMkĮb7qNp  uhS CRhY9mQ$9J_x3 Ε; +_[3]98 eLU<~4 { NnM[R֊}pp $GɹG)7~3pLɹno8R)[`!8'Vc=^pNm1p:SܡℾnX#8'O#I8arX)>\՞>NfjVuTUiatbTu$Rܘ?IV6?"񾮇ɹ~ 8 U8ϓLUpMp>rDF^k C㦊1xqƍD#rɾy9Yo@rgړ~76l?ߪV aSEh#8q.l8{2NxƓcf88pHpn@6ss189hkrS8p8w77m>PEC8([]X Gqm,L#ekޠXAk!iिe=ުy /qC=T8QZ٭ pMNc04FUɭZsQ 8p 8plE[8[{8m-#pbⴃ8pp*sF)Y/8t'縹pێ(~3LWuC5BNqg؁#BBp^^qkJs8_<Nj7iV`Z4UNjVFFV8M<p A88p A8-87 gR B8;prCqGC-' փD\#wH)["*P3HpD]OH7Ĵ=T-88Gb66( 1{'uu%Z;pK{p_;{"#'8Y&'Ε[Uv_{x1GoNc,[զ|kFwu\[8JN#}T-.~bT5Xp*Hp꜋: <&rp8p 8p AS I9j,N^ '#;O `YP=QT|¥j=8N֧wYR|LW;wWy-VrF99U՟YH/ESo6$nb08Ӯ*zZp⤝nц$M8S Kwlizh RRײ0DD)dk&/Uy:|pNu-5y#K=p*]IUDK(sI n/>6cJH#+,IX :<J#VKbBp$j],JjQ~!8ee%&eC\oS%cQbckG +Zv%}0VC 82`pi5h͈򳎴7I8JcLIurrO@ِ#Z08'>p[vDJf NvJ@cRl8b5 u謞Uڑ$eR/JdǬːy)nwk%ٖxWyFSĖDRNN%JJ77W,Nm= J#Ҩ0771 ԌeOTI'UW3'iDE|c;&ɕjl8']ɶmHr$ FYϛ>fGդNqeFcܕ)o4q"乧OC2"g0{D|th_"Ԡ$r=޽x٬7|Ca9,ӑIy:R{>#=,GS'3#}YP"WfO;w| ci14+D;6dAi@U7cx4>#*F/*34c(C I Nw4fPo" CDc'.Ύx6'rl d !rA&É 3N?2,)r:QPDQ~rݻOdO쫿5 yGѼ9LI=CާpJlzT}b/;ET'7|YQ"S}01q~٧W=q:Phz YƍI>+3y^*e^CWC|{hGY͢48Fur&}hllݛ8nCd|tOQtp">VA./S,%:/"{z "G?!/H?e$201tl8q1HH&D" FK`t i,Dx@@r !I}$^߅ˆ ("OTaF bAⰥ,"D#kI>lbЍpDA}G(P"b?m"n}DrQ\<0"ȹyD^K飋~ 1L"zjC"NG7BB>HD"@";x [ =CA@DUG|2[ {c bct >oGʯ2[.wP D"~ 1,U_+¥KdAF͆G}$D1ݷ`?qB$ ^HÊ|۷ᦅ3@A$G#&D3N PMD@@ "@DPLSWHb@}9ID.Mx1a$(|ZH [0"< mOk˼Nם梨[b8m@!De7!d"2:u)%_knAFeԈl.Y}TD|G,sG 禳|9I ҂K,#_<)S"d=x;'s)4GW[](<2HQ8˭VÈHD...gk4v~u|Cd14|r(ij: WI@ "@4+Q@` fs3e3P"@D"D!4?%L("F<J]|  I(I^o0\'x"JEQRU.^k!y""5=~e@q)+s D@@ "@DH[Bf "5&>HƋQ9 D.j;_";&sb\WMȞ>N!WSϱNr(b BkBR# :(A"}4^N[D,' >өtg dI/}d#[GMkkj]2Bg-k quq\k!qe}e>:  Q/OD?\nk=lV~' s1 C#C_Hļgi~ ]h^d5Z׶ˆmD=;űؽL~#KE;oMؽLwpn3{5~˾vJ{-rNnYpMy~ $N${vڼL{vxx"@Dfz~w蛺HZo.xZ'"@>D=A7=S*ze2>Ռ1HlSgL$0ݨ撩O6{ZU楹s"v*0mB"sQǤm(!lWI>yLj"^È@~|a䮵\M}_xj0_򝳢V6Iɽ%zAes mPUs#K >j "ңVDPBgvy1' EaZ2adDjO~N_kOE﵀"@d[n.Sx^"@"9C`#~ԑK6]).-SV\5l%] wVֲ,7+REFƶh]vtF_!Dt}Q5Vc"/JE",&ђXl+)V'" 钵zXn*/)횛5̾fW)fES0L,+sDVqd4vUCrUZ%dUUՋ *AV,j@ZQkW1*[\5HT6(JUc)ʵDzeWgƌ`"xQ04vV)L;4"Z9Wѫ T3b4bhXmkzf##fئF}ӛ\Ճ1sz}y -@X1qBA7@߈]BAUģz \3_PFRW,[(N xW zc7Dm@Y`]LA#J yR\cn ͅ [a,.ֿJVغ<4j^[f1Z*+dbSŢ{fT7EVzVTԀQQ}Z5meja"LtwpI-45t%f"a*bӢ~v-,e5w<˲f0-˨ܲ A;gw6Aͣ~YZ^^"%),+4В%f%ˬWIJڄ)[ SUjHⒶ1E݆uC߶چXò{Ik%UdewR\5~-&H<(JO(K"= e.K/Y^X#%_\iE\\2W=[+m[Ԛj_S @3[ t]RMY:H|[LVj0[$2y:_RMT=W%F2߲'3Fi^浕E~^+-N趷JY%zCm:FDV^۔|`kvOQyvɇ /HLy#D +PDښYZK~/i0OМ-,|)]]0ͨV [Xτy1H`j S e+LCSSS?pٳgp}ѳgH@2ILR\éI\njUcOIœ܊YȵeM|-ZOB$MUFFEͤY&8lR }gkO9l^dy^~N7GWX˵EWr zl"""__ӸE2 dTp"|_,BsFE@ (K)+NLNz:gb9⛓7t߰4As"=Gs"53n8)K+W XFHYD\jseWfQ2s֍*6CM#<ڏ65Vo=Km妮5VE^˩l֏u,ZߚWwV?&#SjHԵY޻5o=nhn^KZ+RD" D@@DS 4̐IENDB`Kst-2.0.8/docbook/kst/Formula-kst-generallinearmodelexample.png0000644000175000017500000000266512277111530023724 0ustar synthsynthPNG  IHDR|IDATx?H#KLJG|B"uilHB8HcE" < mA@X8 9M+41ٝ};epɎ3*L6kZVEm6Y@gτrԵb}#6:r-`<$5qi`ZZVkeKً`6ۆi%/ zӺ:[ \mjx%h;cRehYVcY̭Z$=jkŞGnW׸B׷Z7Ͱ%u+5gSpnȅ~?݀V<գZ~ CDwQҥ`\O pu88i4Nb׺ނ*"{Tڮ?Yk*;ǝ0-E]Ɗ}u ᧿GQ ֪FA0>@ZCZZ `Z&@dnd`r]gtcfP`2cz+@­C\Xچ.VuRa Z/::֥By\['"MNGIFĵN/tjQ C#Zפ{6ЪE* ky@pkQ C#Z *E* HhՏ *E* k^ jf9c> j~rɘk=mYk2'h64.qkejfjœkjX2xmMKI׷e-YYV-?=Ѥ|}ui%_ߢ6[jZ~kơҿ-M-29Op-4O0$/nio!'\Bcd0WoM)0Z^o֘ A y?oQ5&B[86W}Z' a02k86*GQz ;1]-Ϙ,ש@t #E͚ B3ZT86i dc^<6G+aVjitZ1]O^kVPKTBڅ Ah.2U¸PPP0BPr,va<xS%xa<=/:ke:S5fU[jBPȡA Z[Z>[Z>cS6,ϒgI3BkZJG>7+&kB"C-ʵo c IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-labeleditor.png0000644000175000017500000001223212277111530021504 0ustar synthsynthPNG  IHDRFoPLTEk4vpnccaa[ZZUSSSRSTOKKJJJJIBAAAAA@=:99::7CLIFG@z>s8n7k6c2^.Z'S$M{$Lz!Lz!K{ KzJx=a.C[QTSSVTNPO;;;212+-2(5#*   єtRNSԷFN1 HIDATxMkH7u&!o}KX/:%Km0d2^;a:Ә,@`sXpbNfY'T*ՋZR륥nT*I%G;jssG;jsGOѹGj(+Y</m66U@ۯmK/>ŸfЄJ;彲,!|yf&Bj=#/ޮUoU/]{5pkӗWF㿿{,cR^=vxǯ7p5\[[?}!qЛsv!1ۼ_z1zx㾏5s!W֯=6 aco8tkK#hYBAX]g[*Ba@PG8\[뿭հ. ّ?:FCV?Y <1A#-xyEC=wk'+.;+q@Q;fܼC@NY~v ^Olkas3_{kk=4uŽ6|VqyᡠQ;8<`]MCX=!mw<_{&!|v }~M]uWC%5Fᎆp߇f߈pm :3ݱW\C!RuA(cc2n^kˍӧ׮{tÃ7>C>8؍V%祐0]wONOOOlkwjw2m^J[46f( F (4sqRQ3j DrJNMs3^甀 .y l(%(u Z\n2 Br3dqmOJ"Alfi H6ni Z FӾWr{B)к!f \Dh(a0R, "H.%aw1!T D/wUY]dUI$\Q/J r Q0J$)2}QlZbۃAa")2uL{VO3"厰7a( aQis!{zLҎ+"> ;;J!?ؠ#ZcڊF 5J`/+ RH%3`B@B@!B@!@!!P wB=ؾP|Ӏ QkbȾNBIp ~+|[J<#hЈfD7 "$> O@X2BzyL0@ %+y,b) Ls U%G)Em#EER@rte{}œWM>#ȗ(|oBaA3;8rT , af|yāB!ߌ<#H E 0‰9awg&!C>pb@99!C>|g 8!B@!B@!P~1&Br(- (Y=I΢{'ڳ3TQ:\Iֳ34q#]:aEy+8aXx;q !9~^gCDUUUU-#RǗ\X.TɡnzN*`VA<ƈFv\ J  f\n{snA[KGy` DsʹYְ'D|[6k=*` cyJ:V1U hzeU~f{_^Yܫi)Hsg 7.pTOl[ S@{7uX2C8=ӏ{ܶy*3U)^GZ;  Νpq &f]}$")䨈K+1n>;RU8r0bܛaB8}Xu[T݄t/#_X!?qn 'izƑ/߬@Zzc݆,~ #; m1Q+C_X>6d#Oqjw8IwwLk~>_Xt"]]{C֦^3QDk>xېU9gVŋ&蕣 ]SiU- Y oK+`cQz_XTŚn6dz "O`2rHGfbM7xڐU94@]c3ʑmJ9dӆ̦f} Hm"-6 !j-KRHtW# |EQ$(ՌE0x%-~.˽Bh8B%D<ВPߍ-$%Pi5&珐}+il\ՠ mW|ՠVmpU2aW ʐۆ_5Bn\ՠ mpU2B=`m @$ XL`52f_'h\N27k׈eƁĵWdƁĵZ)2d^ձ]ث|dˌ}c gP6cnB,u,QI/V u,( R"3"e2c_X*QZq-( +ؗ:pCfG\KG8` )3.5a`ʌkMjXGl(e^ŵ5l1bldŵ`+3( {q@qmD8ȌkQfP\ .2P$hPM(e+@7ٮ#ڛxrvj?@aٮ#M(er%(H H_ՋyyIENDB`Kst-2.0.8/docbook/kst/Formula-kst-linefitsumofsquaredresiduals.png0000644000175000017500000000232312277111530024513 0ustar synthsynthPNG  IHDR3%6IDATh1hPǿ Y%!SlNY\\dr 8dsrr")HJbRm3~y]FQETUDQETWt+]01s8ԑIHBCQ.(%H:Qz]?j_q/|1s,%d$HZ_yx5|/٥ڮ`3_hÞ` ˨J١zˑVT:3GlrDEPO5^U淔oMWcvjR xT*1 c&.Q+#%_}Kx˓Qٿ f~ B.n z>S*3Y b0Ie_ڝ~Ӭ 防…E]zNrߑ!Ux- 2'T*PHyb8TZAʟR1Q 趎E [De =׫ @KtP}_U\z梚=9P6eY'2TcF3W9q@{S'YţeeVf]e8ӧU݌2l R [J3ГXšfAٙEN?_N@tgi 릳9 L{)*FU}}E<-ݡv,Q2=Sf8֊q㘯T7O>:(yF7 muBjUnCEy4(;Ƨę~X)ڗCzb{ͳ7&[f`?_+`5]>yCecZߙxs`*%9tvC6a!>`!@d Iu Kz Kz L{ K{ K{ K{ L{!Lz!Mz#My(My(My)O}+V-[.\0^2^6^@ZOMZ@_4f:qByK~Vgx|Q{Dt9p7n9rA{FC:5?KQJ>:99:@AAAABIJJJKMQRSUZZ[]cpoU%tRNSѥ\+IDATxkWN9 ;,,$YY=ihM g.:m25&,X!Bb!u CaE7|0C&[U~UuUWT?_իzѫzWWjꫯV[WVo~ PWV@M睷)bm$G"%Χ)\^), ۟O]>43;ru8 /\zg|b]|Hg8|/RSMP #nlɤdF0-%0"ͥKוI/EM\$|^X<]`xN2o77)7Ɍ$I^Kq-%&S ~-N8_;x+W*_tͨ ;nFF{#$_D~u7.GR"c-(0Zl׭pT/~aK*[a'}70%}SvdԻRlF:+Non⼝'0G79q_ϣ*gyk53T&YSnvX7/oQ⼑ˈW?a ս/`TV<Šs838O{S_ GX4G[g2jW\)YL]+┈n8R',NESԘq$רK N$NҼ]^=I;/8].@2K_6\GyJ6&DC,w:IC/˱kGs#m Q=/8QRI8=SckŹ{g8zH^Qq-GĨj8=8FrTj='8*J \6_U_*ΡC;Gm۰88O-$m#.4 T :2T qq%֢vl(qN.G-hZf89-'9-9?~KvqFd4u5L4t&k"^xPqOvz8i>!(q6M}qD$Cm jb'.Mx,P/fUQi'oؖ7t߸*Q4m4ƛi Θ!o qv8g!hfc1ruU4~޷-r5 S:hyq6|GŌ88888888888i[ϻ:&7H,MJ3+4NF^]v#̱8BWT N=^)q:"ήɔX+e4J)!x%Ẅq$#ši8'ǃ)sWսTi1@c>_9@q"Th^fq8̛9AVs X82W wqFc28PXa8.qL8 %x8S) Gq'Q qǾq;U "U q88*Yhqp5q8qqq`Q985 AA8qA(GqVkPWk98 Wqqqq%┴'&Ĉr,I]G@qLBdtK9XIqfEYb gDҔLnos 9z#8 5|!Zrh8b_d)hg0т@_G(:tBPjL&MANU K㋳q|T5߱l9g0̩'Άu:,ANU\̩9ǾfwU"y⮪T@Y |L      TۈF ϔny;p)s#/{+X‚P VQ%GfyIPj986dKc#s]x .ŋڶCfk Yo=cFoGY'=hԾ~ 9 9Kr!3R`2?$R!#s{KG\[u3-8ggggQ9_r--lOٹЂAf[68Mp[`~;_qovSxtDF8Y,γg_a>˨$8L{Y|l3JvOnFW#qwW99+oU=~U=~U+qW8!Y8WZLn{?WոO yq/8qx73ۻqT~A-|_gkly5-8|Wh8        ,8Kތ߲z.]Zqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`őjJq&'^4EoLɉ<~%}" N8=@_ڈ1c,g,m8jqaN=q6]\tӜIwUwU_l8"gqqqqqq-A@@@@@A@@@@AAA@@@@AAA@@@@A@@@@@A@@@@AAA@@@@AAA@@@@ę2,SE]58C'\4]\L ;D=@Z>@F Ԩ w 5ovoE'ymӤ)IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-plotdialoglabels.png0000644000175000017500000002322512277111530022543 0ustar synthsynthPNG  IHDR8\FMPLTE$M|C]:_kE_ڀ;¾Ϫ{Ԩ^Қ>LJ+v+l@zjruGq7n7t3{>GOG;99:=AAAAEIJJKOQSXYY^cft燼튿읯oKhPR{#J|!K|K|FZ8;KΗ?셢+;F)e' ٽ{6\Zp=]>=p̟x'O|ۻ7 po)Cɹr'sp> sF8iO1։Ox/DLJ#;[[C%s&VhW!G9:yr>he<흹NKܾmى{k]vC <}RmB4`HQέ87ppv9d"k·wu8xg.$sy \:h'Z51-`Ktdn-[zv]=pnF}pksf+s}nz;s;{Acԋ7w;E^ j2jX?|}p5J`ӳe3&7]=pH{\jn[9z· pHe8R2!!!!!!n+U<[-[ֱg͌1ɒ).\89Y#"YER<, 2?/o{/E!9ȬtOiS^y ?9MJg>SKKK Ӟp)sO  qSpS.1iE7ŃO,|+]eY_L< K#g-qs yfÇڏ6^f,D˳N FRтJ7͏ ZYgُes& g?Q,D˳up6_yg}5N< Rp g)[*N:x*%-8+Azl3}VG7?>#O?਋'MYԉg bNy6>gpΜ8xGG?Oy52S8񩁄[!ݍ5tY'Yp2Mq$n$<lyYcS8w _Sfw=NO/xf885SzۯU_׶>Qq:K6GZ:NSK 96!Vl!!!!!Θ𘍖#mѵg׻7W'e52D8qupcqϘMU-[717IHbTϙxmI|C3Ϫ],B1xۆd9~Ko*bpJ6ec8.ɹ[r5EpwҶ)y{3c 8CmLJG{ȊkWeS+NYWq!eӸ5PI_R/oWU7ۑN3DNhNIUGI 2lFڜ7ǽV* Ƈ3q "Z!WѯyCښ(:iJ|8I MYcmMV,iL5+k CCCCCppHHjYh R-IkaID֬ G]Blk3`*<Qp%T4,lq?鹟@j>cϨuIC7YmsᯆN 819;*yVϪzUY pppppcjU+I&'9k2hr 'N|G&b83~ q ɹ2!p=[#%*77FCK4&cTI/ڛ6D~_d pƓkĄSidH򓼈5K8;Ky"COrߏ?SnpF.-C)8cӳ+])3t7p-x3pk[c3p9 7SP#<ʇc>2}-8 <Ƒq}SN~g2*g)Z FyqV7%^ 팛s,U9.<8^8:^GrI8Ǒ"|89Nyo gZJd8 N0?oc|q^1x&w s1pppppi8W@2L㕫!)  q>k *WN8P pVO+՚Q i=df+~tHpB KF/=e> 02*W[W(1*nJ\oXvƒh3cћU8TN5$oZpM 5ghpz]o-N*BK8)-⨐qQ*اc֮*9*uVU `u8gJqB9f8* 8}fc2p*W? ]5\sLB8'T&T 0r( **C`TL 0i>IT&=ƙl`܃IV&-L 0i1$v{`҆q&P47uS8k}S=kTN8T F)vC`B`BUpylKUG3Vmb4 h&6Xۿܸͨob4 pJQ DepU&e%ŨGj)t]Reb,v/F-NZ-&Wwź}Uҹ);Q^LS?iDTq_sT=N&9-/FcGgmrY ]܌6U%ŨX!0pqU{vcEDKO+8& Jy^MN%Gi3yƥdJj!wɫjo4(Md ,Z5nVzCb8AgnC&xEeñk Vj ;H.ir G{VOza'],AS)əhE993- Q*B%Frlޯ'}"Sg)=G?j]Hc)fR=&<ijUՂU-u-$q!D%iK"ኚl}ZHXB'l525LzQ]Li~g9;U9k鬓ćc|8 Ҁ5Vluϒ&XOkP888888!!S'Qy=)lUT5+w87}j ?L8ZK#}X?5#b<*H׮~ޠ5Jꘓ]Jʨ$c?/YGz+NN,y(%G;?a3f8֓yG#ǣX,z*c=38hPXOs?oh!qڧkƮ*iM\u8-NoC_8Ra3ʵ#eS-rp#KתI;=1O,y qhW1N}9CcUe*Wޮ|ޠuV~:=*Ϊ& g`_Te2 p*|́C VZO4͝){T^Xiˢ 5gytȠX}/֍LќΫ݇z޽{o?P6duS?$}q&KZFB+,ucyt7wϪ2sO`$*c}4ٵա=5f-qըբq½( ]m,+Q{=wk IDH =sgvՊ-~p~gs~8/y~p#J*pF=3pB|zW;+dW~2Q1Nʨ|[q19O> Ϫ>D9\;gU$I_bqnҳϪ*0 ǨEX#Y'.nY5D7͝i8,?Wd ; pϝEY(8fC᧥΢Fg8#Nߧtv$]Oz3p1 OI Y@ȁ1pYN^G[5%#8dYVX}3p"p$19YQ#k ^æ-ו}YVg +i;(gmNtCCg9pqPˁTCpppppipȰDO˖^SD; H)m"Uib88i[k*E)Uq{nUpxȶG8ƙ9À$rYpxppppf.p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p3ppSMT8(/_8ヿM[~{_y⫨G:;.lq ׏sxdJmqy:yO S/׏?(Z%^S/߽5po^Gͽ0_-148Gl8l[PSau|zͅX\8.lUIC{WB4x>K<ѧE=l%+NmP҅Tg'} 3'/ܿK?04Λ/Г㸌8ya {Xi)2Ecip~sՆζ P=2"o#[=sA>\8GK~:\9X$W%qjq*hp.|dIgzd{*uEPu;=.cDKdD>*"{ ;N4g"=t_hESr v)zu|  j:xG?>Vn{W'ݴv?8Y3]p tdWswU߅1ηU9¹( =Dݴu? '&qJߵΛK+328wvo:WT=FqJ|-Nc'pG?m ǎeyj\BV,Sw?;7Uˆ7=&&x\jPgU.{c5pw]Rq繭A~t{ϼl^cigU: ΪBDH8p^w_o4xX=l-M{AG"uJ=Ε"8o EH)9nr?qLN D pVgQRj=")gRur2(т d?}:p:Z$}ԦEOVsLeӈƕ2MQz=t4˓X^0#TjMC&#֤6J[US4dɤ 7VPЮ2e ұ>sE8X>pJ^"kX&-iA#JZ$r|LQZfxҋԖśĠãƧȭ˯Ƭ~rzftfn^]d[Z[YXYYXYSVVNTa>[3^-`itdF*"9!J#K!L!L!L~!L{!L{$Ix*Ak$ - u@Wo ܑ | tRNSI&IDATxlG+:pN>E%%/J WT۸8b8*:SAS/*B=Y4͉ V\BJ'T MH-ATBz\BIsUwfCzYwf<~; ˖ݾ#DHʲe/,ݽ7;~#H9,{v=B䠴~NwAcyWIi"t ;%!I:}XY?~ܨEeLS֏}'LN;^ns.;?aL""I7nu:ї:Hm:mG~]'gHI*ZNݯÌ@MB'8T :"Itva3: h~<Jj+;N=ڵ{N]3 X&PZjC `Om¥y,ؔ`W7nRGXcbomLj+r#1F=i`g'ɹK&LOJN5Uv vMIf'E67aݸya; ; cr,;I#Xy*oIəkZή7u*edvw ')EW&O{߂u8Fe[cGgƩi⼃#+"7ѩ)wvO$.]r+\jv9 ] y`Oފ$ݽCL6vXlLJ:=-;ڈu&C[h=ڵaW;`L ZI (5N>o[Rmz!DZOaIc' ԗ6l['Uj.`81r6ɰs_?Оf' ̭_H=NN8iSke59I9X1IWF92;"Ty71>޹s|m6׈3S\J'ѡ*;@ٕ{̍I].zCC ދ=| wt5nޱwv'h:aKMVp>juvv؝Q$~:!B+ jڏsvV;A@)DHǂB;YS`!Ow"<9,Y3)er+zme(J e}}JjuYLz'dD% 2A B9\sҔԾ -;<紹p2蝐w"G>f"i<sJb\º-훠E-,WAt%H^BM^!,ة2^/$KD*k;)%2i)m3D%>t}rȒL"B*;oR|Ep8][:^giICe8Xlͩ)ku,:;К -e2tDdK#d"md/N-^ilERc'مKs]T 4Υuq؞B1>*uU,(b|+z. 7wGoȑAaU.MA4:PLFʄqv!N!B;;"DB6;j6Dʩ+lBS;y-\;K\f˭2?}[B{;%[)ᴝjSo){pz~2ynOY! Mj$ӚiQk9Vn!ǠtB=2amɖ{mq2+X^TAT+S2VJ31V)Gq*MybXFcڳLTЕR'-3Z6_U[0ZHMT:Osk-0YH>))ـd-^?Sξ ƊJ&u;2~`ws 8%?yx9T)I,w:,;E #XCRDy]UJ=Ejʕ+,;}.Ԗخة q[HMTN}}e΀$Ζ((I---g=J] P2xA=y+k?LZ0ʠr8;\ >WQyhAg402쳺>;}~kvE/&-ٹyc{Y^Pbg+mp,^g&%ϭVr4$)1ɓ'v%NU$˶pEY-cVzΔ˪̂4NXEAгԊl$|K>²{27:(}C64jL}ڂ~N^vZrϹ itTο0RK~'\ty￷ٖ%²gYPݖwvjjjVǘo=IkW|ld2\e>;5Ӳ̂Zu NXeeE[_,{uQUS6Ζht:1uBѿE`L,w217EN9*lk6[FϟW;2az1"σl+ OwuJ^?.;{+++= ʊPg{y֓)eǏ `` $ZT_Y]fn}sbv >'f'f|QF=\hԬIݤ/2h;e|*q^xYԣi.zۋ ձsLNЮK|>N{AؽNltЃ2#;ñZաxZ>;=0)L=&|zpt3i-)$kQB^ ,Tq[iҒm&gS;M)~'̭NL?_ @0Mr qkR7ts_be|LP.Ί}[{zz4s޺ N2yyy_PPTTQu^5g೓i⏳1;l7f5R#7k64>>-/[UNbfͶb*5vO^7ܓ9e(+l!2A#G1{|y͛{OwKvCr<1TĠr ے(W;h>%!F&b0DmWع Y޻߹͖la-xEO(h R:Yޏg?^U }p#{k< w5]r8A炧lwmet=ڼd`;l*5y_'L `_y'I^j-){@SR#;%efu@_TbJfGjۮ-:q: oEx\a[a/bb6ef [;?HNhә:ih@l^)ߩ+(i%F}zAaTʭtN-rf[Lh@G'?;M.ѓPIp<-/f4ϓܖk1;g 0-` DRmmTةl;[G'8 Q@^ pcdYDSqt~=;q+C;pB9bu}^]P{Xj;iW Wvv)=D҃Fvk6TFh;fN}GN 굱k+…QJ)J&WI\~'1?{>[x̝ђmoyIvqrw#DAy)+&/#?FWu]v③ZqSUH)j 9ًM˗e9/4ݿu}lU?͙Y>+llMu)f9uS n=ʮ WS7񍠤upbj|hRvpw5ݠ4]q-ʱ;ГN;sG`3Qx.nص:PC솗1<)9 1k0rQk(TL]Ïz: Աmutgu.ɽߩ/cd'mΈ2;eSONTG}ٱm i֖FBʂ8w;g<ɎD ;{8/Lܛtx^Տr3OYO\;Yfﴁy𜍟 / q_ap髤ģ7DΏ5NC,q֬U 4Zim]f g=hK3J"h:ЏOL\ꫯ @=Bg9|wQ?Oeb'cƑ$d|D[j]_6ͶS;o3s;ճJyQRbX,v:k!,/ 6mލn޺֝0dryw=%k7" ҈XbY;ӱ3eML7lp139;V,oMPg7?C$-WS~nK?+s8YSmܰիWMI)5Ɲ2h?Mdzȶ]c:[33~o/Wo2__y#*e9q%jyN8Kmz<;K=y%y˼xwjp(˲ ؜6 3mnʲ\ٶuHYeh;nܸ1vpeYV v;);61R3teſ"˲`gTڬ&`,`gMj,/β/vg_29YN.!,!cZμ?wJ6F=# 3;ىHBQc^w;~F=IOJ8~}5;!j!!MjvZ'ؙO~sI694$Ejd",z;Wc#I?!$:ҷFZS[2PM-zɟ5N je]\}  vIbM5:Z*sT#/%ZZX?tFvTiIȮQhk`;1f7iTi)ZTb"BW$A/ӄNg1`j:ױS;^Vo~g>@>ُ4Ғ;dwV?!uԏQ9Z ؙFv,bvP&-\vCe;1fPaCV,58^qC5j,ߙ1˘vYMw__>V3kuCWJe~g5Y'suɹF3?Wm(ό֊@e74~6KN+"$Eeؗc_3IGIx::!~k_d3i5G%7l|e秅?w?|Z$%O.%y!}%G'cƥCG}bd `gZv{Gz2 ^;ӳspcCehّΏ;;3d`-]T_p!uT'عtiG(GeD'\,; Ji*NűH[ rS!l)t&#[l1S}!%!Br>H"\²wIL3MTIENDB`Kst-2.0.8/docbook/kst/kst.10000644000175000017500000001271112277111530014463 0ustar synthsynth.\"Generated by db2man.xsl. Don't modify this, modify the source. .de Sh \" Subsection .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .TH "KST COMMAND LINE" 1 "" "" "" .SH NAME kst \- A plotting and data viewing program .SH "SYNOPSIS" .PP The options are: .ad l .hy 0 .HP 4 \fBkst\fR [Qt\-options] [KDE\-options] [options] [\fIfile\fR...] .ad .hy .SH "OPTIONS" .TP \fB[file\&.\&.\&.]\fR A \&.kst file, or one or more data files\&. Supported formats are ASCII columns, BOOMERANG frame files, BLAST dirfile files, and other optionally supported types\&. A \&.kst files stores all options that can be set by other flags\&. The following flags can be used to override the options set in the \&.kst file: \fB\-F datafile\fR, \fB\-n NS\fR, \fB\-s NS\fR, \fB\-f F0\fR, \fB\-a\fR\&. The rest can not be overridden\&. If an override flag is given, it is applied to all vectors in the plot\&. ASCII data from stdin can be plotted by including "stdin" in the list \fB[file\&.\&.\&.]\fR\&. .TP \fB\-y Y\fR The source for the Y axis data\&. For ASCII files, this is the column\&. For binary files, this is the field name\&. To plot multiple curves, this may be specified multiple times\&. The same source file, sample ranges, and X axis data are assumed\&. .TP \fB\-e E\fR Error bars for Y axis data\&. For ASCII file, refer to the column holding the data\&. For binary files use the field name\&. If multiple \fB\-y Y\fR options are given, this may also be used multiple times\&. Individual Y entries are associated in order with multiple E entries\&. .TP \fB\-x X\fR The source for the X axis data\&. For ASCII files, this is the column\&. For readata files, this is the field name\&. If this option is not specified, the row number in the file is used\&. This option can only be given once\&. .TP \fB\-z Z\fR The source for the Z matrix data (which gets displayed as an image)\&. For ASCII files, this is the column containing the z data\&. For other optional formats (HEALPix, FITS image, etc), this is the name of the desired matrix field, as displayed in the matrix dialog\&. Some matrix\-compatible datasources also allow using an alias which is the number of the desired matrix field\&. To plot multiple matrices, this may be specified multiple times\&. .TP \fB\-p P\fR The source for power spectra\&. For ASCII files, this is the column\&. For binary files, this is the field name\&. To plot power spectra of multiple curves, this may be specified multiple times\&. The same source file, sample ranges and fft lengths are used for all Power Spectra requested from the command line\&. .TP \fB\-l P\fR The length of the FFT used in power specra estimation is 2^P\&. .TP \fB\-h H\fR The source for histograms\&. For ASCII files, this is the column\&. For binary files, this is the field name\&. Multiple histograms can be defined from the command line\&. .TP \fB\-m NC\fR Used when multiple curves have been defined\&. Rather than plotting all curves in the same plot, plot each in its own plot, .TP \fB\-f F0\fR The starting frame number (for readdata files) or row (for ASCII files) to read\&. .TP \fB\-n\fR The number of frames (for readdata files) or rows (for ASCII files) to read\&. .TP \fB\-s NS\fR The number of frames or rows to skip each read\&. This is useful when working with very large data files, to speed up response and conserve memory, in the case that the data are slowly varying\&. .TP \fB\-a\fR Used in with the \fB \-s NS\fR: rather than skipping each NS frames, average them\&. This provides a combination of very basic high pass filtering, and memory conservation\&. .TP \fB\-F Datafile\fR Override the file to read the data from for all vectors listed in the \&.kst file\&. Can only be used in conjunction with a kst file\&. .TP \fB\-\-print psfile\fR Rather than displaying the plot, export the image to a postscript file and exit\&. *BUG note: even though no windows are opened on screen, access to the X server is still required\&.* .TP \fB\-\-png pngfile\fR Rather than displaying the plot, export the image to a png file of dimensions 640x480 and exit\&. *BUG note: even though no windows are opened on screen, access to the X server is still required\&.* .SH "COMMAND LINE EXAMPLES" .PP Several examples of typical use follow\&. .IP .PP To plot column 1 a file (tmp\&.dat) of ASCII data: .IP \fB\fBkst \-y 1 tmp\&.dat\fR\fR .IP .PP To plot column 2, 3, and 4 vs\&. column 1 of an ASCII file, in 1 plot: .IP \fB\fBkst \-x 1 \-y 2 \-y 3 \-y 4 tmp\&.dat\fR\fR .IP .PP To plot column 2, 3, and 4 vs\&. column 1 of an ASCII file, in 3 plots, arranged in 1 column: .IP \fB\fBkst \-x 1 \-y 2 \-y 3 \-y 4 \-m 1 tmp\&.dat\fR\fR .IP .PP To plot 500 rows of column 2 of an ASCII file, starting at line 100: .IP \fB\fBkst \-y 2 \-f 100 \-n 500 tmp\&.dat\fR\fR .IP .PP To plot the first 100,000 rows of column 2 of an ASCII file, averaging every 100 rows: .IP \fB\fBkst \-y 2 \-f 0 \-n 100000 \-s 100 \-a tmp\&.dat\fR\fR .IP .PP (Using optional HEALPix Data Source) To plot the first 3 maps in a HEALPix FITS file in a 2x2 grid: .IP \fB\fBkst \-z 1 \-z 2 \-z 3 \-m 2 healpix_example_sm\&.fits\fR\fR .IP .PP (Using optional HEALPix Data Source) To plot a map with a specific field name in a HEALPix FITS file: .IP \fB\fBkst \-z "1 \- TEMPERATURE (Kelvin)" healpix_example_sm\&.fits\fR\fR .SH AUTHORS Rick Chern , Philip Rodrigues . Kst-2.0.8/docbook/kst/creatingplugins-chapter-new.docbook0000644000175000017500000006523512277111530022564 0ustar synthsynth Creating Additional Plugins &kst; has a simple and standardized interface that facilitates easy creation of additional plugins. In addition to detailing basic requirements for plugins, the following sections describe how to make use of pre-written header files to create certain types of plugins. Creating a Basic Plugin A &kst; plugin consists of two files—a KDE desktop service file and a shared object file. The KDE Desktop Service File The KDE desktop service file provides information about the plugin to the &kst; plugin loading infrastructure. The following is an example of a KDE desktop service file for a &kst; plugin: [Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=Kst Data Object X-KDE-ModuleType=Plugin X-KDE-Library=kst_FOO_plugin X-Kst-Plugin-Author=FOO Name=FOO Plugin Comment=The FOO algorithm for Kst. Generally, you can use the example above as a template and modify the FOO entries to fit your plugin. As can be seen from the example, the desktop service file consists of a series of key value pairs. The ServiceTypes entry should be left as seen above. This key indicates that the plugin inherits the KstDataObject class. See the API documentation for the interfaces this class exposes. The X-KDE-Library key points to the shared object file that implements your plugin. Do not include the shared object's file extension. Once you have completed the desktop file, save it as [X-KDE-LIBRARY].desktop, where [X-KDE-LIBRARY] is the value of the key in the desktop file. The Shared Object File The shared object file contains the actual functionality of the plugin. The following are the requirements for the shared object file: The object must inherit the KstDataObject class: #ifndef FOOPLUGIN_H #define FOOPLUGIN_H #include <kstdataobject.h> class FooPlugin : public KstDataObject { Q_OBJECT public: FooPlugin(QObject *parent, const char *name, const QStringList &args); virtual ~FooPlugin(); virtual KstObject::UpdateType update(int); virtual QString propertyString() const; virtual KstDataObjectPtr makeDuplicate(KstDataObjectDataObjectMap&); protected slots: virtual void _showDialog(); }; #endif The following is an example of the shared object file source code for a simple plugin: Compiling the Plugin If you are using &gcc; to compile your plugin, simply compile the object file: cc -Wall -c -o myplugin.o myplugin.c -fPIC -DPIC and then create the shared library: ld -o myplugin.so -shared myplugin.o The resulting *.so file and *.xml file must be put in the same directory. When you use &kst;'s Plugin Manager to load the XML file, it will automatically look for the shared object file in the same directory. Creating Linear Fit Plugins To create a linear fit plugin, you could implement your own fitting algorithms and output the appropriate vectors. However, &kst; already comes with header files that make it easy for you to implement linear least-squares fit plugins by just providing a few functions. This section will describe how to take advantage of these files. Header Files Two header files are provided for performing linear fits, linear.h (for unweighted linear fits) and linear_weighted.h (for weighted linear fits). They are both located under kst/plugins/fits/ in the &kst; source tarball. To use these files, include only one of them in the source code for your plugin: #include <../linear.h> or #include <../linear_weighted.h> (by convention, we will place the source code for the plugin one directory below where the header files are). Implementing Required Functions Given a general linear model: where y is a vector of n observations, X is an n by p matrix of predictor variables, and c is the vector of p best-fit parameters that are to be estimated, the header files provide functions for estimating c for a given y and X. To provide X, the following function needs to be implemented in the source code for the plugin: double calculate_matrix_entry( double dX, int iPos ) This function should return the value of the entry in column iPos of the matrix of predictor variables, using x value dX. This function will be called by linear.h or linear_weighted.h. The implementation of this function depends on the model you wish to use for the fit, and is unique to each linear fit plugin. For example, to fit to a polynomial model, calculate_matrix_entry could be implemented as follows: double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } Calling the Fitting Functions Once the appropriate header file has been included and calculate_matrix_entry has been implemented, call the appropriate fitting function included from the header file: kstfit_linear_unweighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); or kstfit_linear_weighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); Each function will return 0 on success, or -1 on error, so it is a good idea to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows: inArrays[0] must contain the array of x coordinates of the data points inArrays[1] must contain the array of y coordinates of the data points inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit. The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin. iNumParams is the number of parameters in the fitting model used, which should be equal to the number of columns in the matrix X of predictor variables. iNumParams must be set correctly before the fitting function is called. After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows: outArrays[0] will contain the array of fitted y values. outArrays[1] will contain the array of residuals. outArrays[2] will contain the array of best-fit parameters that were estimated. outArrays[3] will contain the covariance matrix, returned row after row in an array. outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom. outArrayLens will be correctly set to indicate the length of each output array. Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function). Example The following is an example of the source code for a linear fit plugin. /* * Polynomial fitting plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #include "../linear.h" double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } extern "C" int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { int iRetVal = -1; int iNumParams; iNumParams = 1 + (int)floor( inScalars[0] ); if( iNumParams > 0 ) { iRetVal = kstfit_linear_unweighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); } return iRetVal; } Creating Non-linear Fit Plugins &kst; provides header files designed to simplify the creation of non-linear least-squares fit plugins. The following sections detail the use of the header files. Header Files and Definitions The non-linear fit header files are located in kst/plugins/fits_nonlinear of the &kst; source tarball. The files are named non_linear.h and non_linear_weighted.h for unweighted and weighted fits, respectively. To use these files, include only one of them in the source code for your plugin: #include <../non_linear.h> or #include <../non_linear_weighted.h> (by convention, we will place the source code for the plugin one directory below where the header files are). As non-linear fitting is an iterative process, you must also define the maximum number of iterations that should be performed. The non-linear fitting algorithm will stop when at least one of the following conditions is true: The maximum number of iterations has been reached. A precision of 10-4 has been reached. In addition, you need to define the number of parameters in the model, as it is not passed to the fitting function explicitly. To define these two values, include the following at the top of your source code: #define NUM_PARAMS [num1] #define MAX_NUM_ITERATIONS [num2] replacing [num1] with the number of parameters in the model, and [num2] with the maximum number of iterations to perform. Implementing Required Functions To use the header files for non-linear fits, you must provide the function to use as the model, the partial derivatives of the function with respect to each parameter, and initial estimates of the best-fit parameters. To do this, three functions must be implemented. These functions are described below. double function_calculate( double dX, double* pdParameters ) This function calculates the y value of the fitting model for a given x value dX, using the supplied array of parameters pdParameters. The order of parameters in pdParameters is arbitrary, but should be consistent with the other two implemented functions. For example, for an exponential model, function_calculate could be implemented as follows: double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) This function calculates the partial derivatives of the model function for a give value of x dX. The partial derivatives should be returned in pdDerivatives. The order of the partial derivatives in the array pdDerivatives should correspond to the order of the parameters in pdParameters (i.e. if pdParameters[0] contains the parameter lambda for an exponential model, pdDerivatives[0] should contain the derivative of the model with respect to lambda). void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) This function provides an initial estimate of the best-fit parameters to the fitting function. The array of x values and y values of the data points are provided in pdX and pdY respectively, and the number of data points is provided by iLength. You can use any or none of these parameters at your discretion to calculate the initial estimate. The function should put the calculated initial estimates in pdParameterEstimates, with the order of the estimates corresponding to the order of the parameters in pdParameters of function_calculate and function_derivative. Keep in mind that the initial estimate is important in determining whether or not the fitting function converges to a solution. Calling the Fitting Functions Once all the required functions have been implemented, the fitting function from the included header file can be called: kstfit_nonlinear( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); or kstfit_nonlinear_weighted( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); depending on whether you are implementing a non-weighted fit or a weighted fit. The function will return 0 on success, or -1 on error, so it is simplest to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows: inArrays[0] must contain the array of x coordinates of the data points inArrays[1] must contain the array of y coordinates of the data points inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit. The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin. After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows: outArrays[0] will contain the array of fitted y values. outArrays[1] will contain the array of residuals. outArrays[2] will contain the array of best-fit parameters that were estimated. outArrays[3] will contain the covariance matrix, returned row after row in an array. outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom. outArrayLens will be correctly set to indicate the length of each output array. Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function). Example The following is an example of a non-linear fit plugin that performs a fit to an exponential model. /* * Exponential fit plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include "../non_linear.h" void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { KST_UNUSED( pdX ) KST_UNUSED( pdY ) KST_UNUSED( iLength ) pdParameterEstimates[0] = 1.0; pdParameterEstimates[1] = 0.0; pdParameterEstimates[2] = 0.0; } double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dExp; double ddScale; double ddLambda; double ddOffset; dExp = exp( -dLambda * dX ); ddScale = dExp; ddLambda = -dX * dScale * dExp; ddOffset = 1.0; pdDerivatives[0] = ddScale; pdDerivatives[1] = ddLambda; pdDerivatives[2] = ddOffset; } extern "C" int kstfit_exponential(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int kstfit_exponential(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { return kstfit_nonlinear( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); } Creating Pass Filter Plugins &kst; provides header files to simplify the implementation of pass filter plugins. The use of these header files is described below. Header Files The pass filter header file is located in kst/plugins/pass_filters of the &kst; source tarball. The file is named filters.h To use this file, include it in the source code for your plugin: #include <../filters.h> (by convention, we will place the source code for the plugin one directory below where the header files are). Required Functions The filters.h header file contains a single function that calculates the Fourier transform of a supplied function, applies the supplied filter to the Fourier transform, and then calculates the inverse Fourier transform of the filtered Fourier transform. To supply the filter, the following function needs to be implemented in the source code for your plugin: double filter_calculate( double dFreqValue, const double inScalars[] ) This function should calculate the filtered amplitude for the frequency dFreqValue. inScalars[] will contain the unaltered input scalars for the plugin, specified in the XML file. Most likely inScalars[] will contain cutoff frequencies or other properties of the filter. For example, to implement a Butterworth high-pass filter, filter_calculate could be implemented as follows: double filter_calculate( double dFreqValue, const double inScalars[] ) { double dValue; if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) ); } else { dValue = 0.0; } return dValue; } Calling the Filter Function Once the required filter_calculate has been implemented, the filter function from the header file can be called: kst_pass_filter( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); The arguments supplied to the exported C function can usually be passed to kst_pass_filter without modification. However, there are a few restrictions on the arguments: inArrays[0] must contain the array of data to filter. inScalars should contain the filter-specific parameters to be used by the filter_calculate function. After the function call, outArrays[0] will contain the filtered array of data, and outArrayLens will be set appropriately. The kst_pass_filter function does not use outScalars. Example The following is an example of a pass filter plugin that implements the Butterworth high-pass filter. /* * Butterworth low pass filter plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #include <stdlib.h> #include <math.h> #include "../filters.h" extern "C" int butterworth_highpass(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int butterworth_highpass(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { int iReturn; iReturn = kst_pass_filter( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); return iReturn; } double filter_calculate( double dFreqValue, const double inScalars[] ) { double dValue; if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) ); } else { dValue = 0.0; } return dValue; } Kst-2.0.8/docbook/kst/plugins-chapter.docbook0000644000175000017500000014472312277111530020260 0ustar synthsynth Plugins, Fits, and Filters Plugins provide added functionality to &kst;. By default, &kst; comes packaged with an extensive selection of built-in plugins. In addition, a simple and consistent interface allows for easy creation of 3rd-party plugins. Fits and Filters are simply subsets of the set of plugins, and thus behave identically to plugins, with the exception of additional convenience dialog functionality accessible from the plot context menu. Adding and Removing Plugins By default, the built-in plugins are stored in /usr/lib/kde3/kstplugins/ (this directory may vary, depending on where you installed &kst;). The Plugin Manager can be used to add and remove plugins. It can be accessed by selecting Plugins... from the Settings menu. A list of the currently installed plugins is displayed in the Plugin Manager. To add a plugin, click the Install... button. Browse to the directory containing both the plugin specification file (*.xml) and the object file (*.o). Click OK, and the plugin should be installed. To remove a plugin, simply highlight the plugin in the Plugin Manager and click Remove. You will be prompted for confirmation. To quickly refresh the list of plugins displayed in the Plugin Manager, click Rescan. Doing so will remove any plugins no longer present in their specified paths, and add any new plugins in the default plugins directory. Built-in Plugins To date, there are more than 25 built-in plugins available in &kst; that perform functions from taking cross correlations of two vectors to producing periodograms of a data set. The settings window for every plugin consists of two main sections—an input section and an output section. Each section is composed of a set of scalars and/or vectors. The following screenshot shows the settings window for a typical plugin. The only difference between the different plugins is the set of inputs and outputs, and the mechanism for deriving the outputs from the inputs. Plugins Window Plugins Windowpluginswindow The following sections describe the purpose, key algorithms or formulas used to perform calculations, and inputs and outputs for each plugin. Note that fitting and filtering plugins are included in the following sections. Autocorrelation The autocorrelation plugin calculates correlation values between a series (vector) and a lagged version of itself, using lag values from floor(-(N-1)/2) to floor((N-1)/2), where N is the number of points in the data set. The time vector is not an input as it is assumed that the data is sampled at equal time intervals. The correlation value r at lag k is: Autocorrelation formula Inputs X Array (vector) The array x of values to calculate correlation values for. Outputs Step Number (vector) The array of step, or lag values. Correlation Value (vector) The array of correlation values calculated using the corresponding step number in the Step Number vector. Bin The bin plugin bins elements of a single data vector into bins of a specified size. The value of each bin is the mean of the elements belonging to the bin. For example, if the bin size is 3, and the input vector is [9,2,7,3,4,74,5,322,444,2,1], then the outputted bins would be [6,27,257]. Note that any elements remaining at the end of the input vector that do not form a complete bin (in this case, elements 2 and 1), are simply discarded. Inputs Input Vector (vector) The vector to bin. Bin Size (scalar) The size to use for each bin. Outputs Bins (vector) The array of means for each bin. Butterworth band-pass The Butterworth band-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula Autocorrelation formula where f is the frequency, fc is the low frequency cutoff, b is the bandwidth of the band to pass, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses. Inputs X Array (vector) The array of values to filter. Order (scalar) The order of the Butterworth filter to use. Low cutoff frequency (scalar) The low cutoff frequency of the Butterworth band pass filter. Band width (scalar) The width of the band to pass. This should be the difference between the desired high cutoff frequency and the low cutoff frequency. Outputs X Filtered (vector) The array of filtered data values. Butterworth band-stop The Butterworth band-stop plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula Autocorrelation formula where f is the frequency, fc is the low frequency cutoff, b is the bandwidth of the band to stop, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses. Inputs X Array (vector) The array of values to filter. Order (scalar) The order of the Butterworth filter to use. Low cutoff frequency (scalar) The low cutoff frequency of the Butterworth band stop filter. Band width (scalar) The width of the band to stop. This should be the difference between the desired high cutoff frequency and the low cutoff frequency. Outputs X Filtered (vector) The array of filtered data values. Butterworth high-pass The Butterworth high-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula Autocorrelation formula where f is the frequency, fc is the high frequency cutoff, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses. Inputs X Array (vector) The array of values to filter. Order (scalar) The order of the Butterworth filter to use. Cutoff frequency (scalar) The cutoff frequency of the Butterworth high pass filter. Outputs X Filtered (vector) The array of filtered data values. Butterworth low-pass The Butterworth low-pass plugin filters a set of data by calculating the Fourier transform of the data and recalculating the the frequency responses using the following formula Autocorrelation formula where f is the frequency, fc is the low frequency cutoff, and n is the order of the Butterworth filter. The inverse Fourier transform is then calculated using the new filtered frequency responses. Inputs X Array (vector) The array of values to filter. Order (scalar) The order of the Butterworth filter to use. Cutoff frequency (scalar) The cutoff frequency of the Butterworth low pass filter. Outputs X Filtered (vector) The array of filtered data values. Chop The chop plugin takes an input vector and divides it into two vectors. Every second element in the input vector is placed in one output vector, while all other elements from the input vector are placed in another output vector. Inputs Array (vector) The array of values to perform the chop on. Outputs Odd Array (vector) The array containing the odd part of the input array (i.e. it contains the first element of the input array). Even Array (vector) The array containing the even part of the input array (i.e. it does not contain the first element of the input array). Difference Array (vector) The array containing the elements of the odd array minus the respective elements of the even array. Index Array (vector) An index array the same length as the other three output arrays. Convolution The convolution plugin generates the convolution of one vector with another. The convolution of two functions f and g is given by: The order of the vectors does not matter, since f*g=g*f. In addition, the vectors do not need to be of the same size, as the plugin will automatically extrapolate the smaller vector. Inputs Array One (vector) One of the pair of arrays to take the convolution of. Array Two (vector) One of the pair of arrays to take the convolution of. Outputs Convolved (vector) The convolution of the two input vectors. Crosscorrelation The crosscorrelation plugin calculates correlation values between two series (vectors) x and y, using lag values from floor(-(N-1)/2) to floor((N-1)/2), where N is the number of elements in the longer vector. The shorter vector is padded to the length of the longer vector using 0s. The time vector is not an input as it is assumed that the data is sampled at equal time intervals. The correlation value r at lag k is: crosscorrelation formula Inputs X Array (vector) The array x used in the cross-correlation formula. Y Array (vector) The array y used in the cross-correlation formula. Outputs Step Number (vector) The array of step, or lag values. Correlation Value (vector) The array of correlation values calculated using the corresponding step number in the Step Number vector. Deconvolution The deconvolution plugin generates the deconvolution of one vector with another. Deconvolution is the inverse of convolution. Given the convolved vector h and another vector g, the deconvolution f is given by: The vectors do not need to be of the same size, as the plugin will automatically extrapolate the shorter vector. The shorter vector is assumed to be the response function g. Inputs Array One (vector) One of the pair of arrays to take the deconvolution of. Array Two (vector) One of the pair of arrays to take the deconvolution of. Outputs Deconvolved (vector) The deconvolution of the two input vectors. Fit exponential weighted The Fit exponential weighted plugin performs a weighted non-linear least-squares fit to an exponential model: An initial estimate of a=1.0, =0, and b=0 is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array of weights to use for the fit. Outputs Y Fitted (vector) The array of fitted y values. Residuals (vector) The array of residuals. Parameters (vector) The best fit parameters a, , and b. Covariance (vector) The covariance matrix of the model parameters, returned row after row in the vector. chi^2/nu (scalar) The weighted sum of squares of the residuals, divided by the degrees of freedom. Fit exponential The Fit exponential plugin is identical in function to the Fit exponential weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit gaussian weighted The Fit gaussian weighted plugin performs a weighted non-linear least-squares fit to a Gaussian model: An initial estimate of a=(maximum of the y values), =(mean of the x values), and =(the midpoint of the x values) is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array of weights to use for the fit. Outputs Y Fitted (vector) The array of fitted y values. Residuals (vector) The array of residuals. Parameters (vector) The best fit parameters , , and a. Covariance (vector) The covariance matrix of the model parameters, returned row after row in the vector. chi^2/nu (scalar) The weighted sum of squares of the residuals, divided by the degrees of freedom. Fit gaussian The Fit gaussian plugin is identical in function to the Fit gaussian weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit gradient weighted The gradient weighted plugin performs a weighted least-squares fit to a straight line model without a constant term: The best-fit is found by minimizing the weighted sum of squared residuals: for b, where wi is the weight at index i. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array containing weights to be used for the fit. Outputs Y Fitted (vector) The array of y values for the points representing the best-fit line. Residuals (vector) The array of residuals, or differences between the y values of the best-fit line and the y values of the data points. Parameters (vector) The parameter b of the best-fit. Covariance (vector) The estimated covariance matrix, returned row after row, starting with row 0. Y Lo (vector) The corresponding value in Y Fitted minus the standard deviation of the best-fit function at the corresponding x value. Y Hi (vector) The corresponding value in Y Fitted plus the standard deviation of the best-fit function at the corresponding x value. chi^2/nu (scalar) The value of the sum of squares of the residuals, divided by the degrees of freedom. Fit gradient The Fit linear plugin is identical in function to the Fit gradient weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit linear weighted The Fit linear weighted plugin performs a weighted least-squares fit to a straight line model: The best-fit is found by minimizing the weighted sum of squared residuals: for a and b, where wi is the weight at index i. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array containing weights to be used for the fit. Outputs Y Fitted (vector) The array of y values for the points representing the best-fit line. Residuals (vector) The array of residuals, or differences between the y values of the best-fit line and the y values of the data points. Parameters (vector) The parameters a and b of the best-fit. Covariance (vector) The estimated covariance matrix, returned row after row, starting with row 0. Y Lo (vector) The corresponding value in Y Fitted minus the standard deviation of the best-fit function at the corresponding x value. Y Hi (vector) The corresponding value in Y Fitted plus the standard deviation of the best-fit function at the corresponding x value. chi^2/nu (scalar) The value of the sum of squares of the residuals, divided by the degrees of freedom. Fit linear The Fit linear plugin is identical in function to the Fit linear weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit lorentzian weighted The Fit lorentzian weighted plugin performs a weighted non-linear least-squares fit to a Lorentzian model: An initial estimate of a=(maximum of the y values), x0=(mean of the x values), and =(the midpoint of the x values) is used. The plugin subsequently iterates to the solution until a precision of 1.0e-4 is reached or 500 iterations have been performed. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array of weights to use for the fit. Outputs Y Fitted (vector) The array of fitted y values. Residuals (vector) The array of residuals. Parameters (vector) The best fit parameters x0, , and a. Covariance (vector) The covariance matrix of the model parameters, returned row after row in the vector. chi^2/nu (scalar) The weighted sum of squares of the residuals, divided by the degrees of freedom. Fit lorentzian The Fit lorentzian plugin is identical in function to the Fit lorentzian weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit polynomial weighted The Fit polynomial weighted plugin performs a weighted least-squares fit to a polynomial model: where n is the degree of the polynomial model. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array of weights to use for the fit. Order (scalar) The order, or degree, of the polynomial model to use. Outputs Y Fitted (vector) The array of fitted y values. Residuals (vector) The array of residuals. Parameters (vector) The best fit parameters c0, c1,..., cn. Covariance (vector) The covariance matrix of the model parameters, returned row after row in the vector. chi^2/nu (scalar) The weighted sum of squares of the residuals, divided by the degrees of freedom. Fit polynomial The Fit polynomial plugin is identical in function to the Fit polynomial weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Fit sinusoid weighted The Fit sinusoid weighted plugin performs a least-squares fit to a sinusoid model: where T is the specified period, and n=2+2H, where H is the specified number of harmonics. Inputs X Array (vector) The array of x values for the data points to be fitted. Y Array (vector) The array of y values for the data points to be fitted. Weights (vector) The array of weights to use for the fit. Harmonics (scalar) The number of harmonics of the sinusoid to fit. Period (scalar) The period of the sinusoid to fit. Outputs Y Fitted (vector) The array of fitted y values. Residuals (vector) The array of residuals. Parameters (vector) The best fit parameters c0, c1,..., cn. Covariance (vector) The covariance matrix of the model parameters, returned row after row in the vector. chi^2/nu (scalar) The weighted sum of squares of the residuals, divided by the degrees of freedom. Fit sinusoid The Fit sinusoid plugin is identical in function to the Fit sinusoid weighted plugin with the exception that the weight value wi is equal to 1 for all index values i. As a result, the Weights (vector) input does not exist. Interpolation Akima spline The Interpolation Akima spline plugin generates a non-rounded Akima spline interpolation for the supplied data set, using natural boundary conditions. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Interpolation Akima spline periodic The kstinterp akima periodic plugin generates a non-rounded Akima spline interpolation for the supplied data set, using periodic boundary conditions. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Interpolation cubic spline The Interpolation cubic spline plugin generates a cubic spline interpolation for the supplied data set, using natural boundary conditions. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Interpolation cubic spline periodic The Interpolation cubic spline periodic plugin generates a cubic spline interpolation for the supplied data set, using periodic boundary conditions. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Interpolation linear The Interpolation linear plugin generates a linear interpolation for the supplied data set. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Interpolation polynomial The Interpolation polynomial plugin generates a polynomial interpolation for the supplied data set. The number of terms in the polynomial used is equal to the number of points in the supplied data set. Inputs X Array (vector) The array of x values of the data points to generate the interpolation for. Y Array (vector) The array of y values of the data points to generate the interpolation for. X' Array (vector) The array of x values for which interpolated y values are desired. Outputs Y Interpolated (vector) The interpolated y values. Noise Addition The Noise addition plugin adds a Gaussian random variable to each element of the input vector. The Gaussian distribution used has a mean of 0 and the specified standard deviation. The probability density function of a Gaussian random variable is: Inputs Array (vector) The array of elements to which random noise is to be added. Sigma (scalar) The standard deviation to use for the Gaussian distribution. Outputs Output Array (vector) The array of elements with Gaussian noise added. Periodogram The periodogram plugin produces the periodogram of a given data set. One of two algorithms is used depending on the size of the data set—a fast algorithm is used if there are greater than 100 data points, while a slower algorithm is used if there are less than or equal to 100 data points. Inputs Time Array (vector) The array of time values of the data points to generate the interpolation for. Data Array (vector) The array of data values, dependent on the time values, of the data points to generate the interpolation for. Oversampling factor (scalar) The factor to oversample by. Average Nyquist frequency factor (scalar) The average Nyquist frequency factor. Outputs Frequency (vector) The frequency vector. Periodogram (vector) The frequency response vector for the periodogram. Statistics The statistics plugin calculates statistics for a given data set. Most of the output scalars are named such that the values they represent should be apparent. Standard formulas are used to calculate the statistical values. Inputs Data Array (vector) The array of data values to calculate statistics for. Outputs Mean (scalar) The mean of the data values. Minimum (scalar) The minimum value found in the data array. Maximum (scalar) The maximum value found in the data array. Variance (scalar) The variance of the data set. Standard deviation (scalar) The standard deviation of the data set. Median (scalar) The median of the data set. Absolute deviation (scalar) The absolute deviation of the data set. Skewness (scalar) The skewness of the data set. Kurtosis (scalar) The kurtosis of the data set. Kst-2.0.8/docbook/kst/miscfeatures-chapter.docbook0000644000175000017500000001666112277111530021270 0ustar synthsynth The Toolbar and Keyboard Shortcuts This chapter describes miscellaneous time-saving and convenience features available in &kst;. The Toolbar The toolbar provides one-click access to commonly used menu functions in &kst;. To toggle the toolbar, select Show Toolbar from the Settings menu. The Toolbar Menu The toolbar menu, accessible by right-clicking anywhere on the toolbar, contains functions for modifying the layout, appearance, and behaviour of the toolbar. The three submenus available are described below. Orientation The Orientation submenu contains layout options for the toolbar. Top, Left, Right, and Bottom Docks the toolbar at the corresponding edge of the &kst; window. Flat Hides the toolbar and turns it into a slim bar at the top of &kst; window. To unhide the toolbar, click on the gripper that is still visible. You can also move the toolbar by dragging the gripper on the edge of the toolbar. Dragging the toolbar close to an edge of the &kst; window docks it. Dragging the toolbar anywhere else turns it into a floating toolbar. Text Position The Text Position submenu specifies if and how text and icons should be displayed on the toolbar. Icons Only Does not display any text labels and only displays icons. However, the text for each icon is still available as a tooltip associated with the icon (viewable by momentarily holding the cursor of the icon). Text Only Does not display any icons on the toolbar, but displays all text labels. Text Alongside Icons Displays all icons. Text labels are displayed to the right of the icons. Text Under Icons Displays all icons. Text labels are displayed underneath the icons. Icon Size The Icon Size submenu specifies the size of the icons on the toolbar. Select a size from the submenu, or select Default to use the default size (usually the same as Medium). The options in this menu do not have any effect if Text Only is selected for Text Position. Custom Shortcut Keys You can create custom shortcut keys to make working in &kst; more efficient. To modify the shortcut keys, select Configure Shortcuts... from the Settings menu. The following dialog will be displayed. Configure Shortcuts Window Configure Shortcuts Window A list of available actions and their associated shortcuts are shown in the dialog. Each action is allowed two shortcuts—a primary shortcut and an alternate shortcut. Either shortcut can be used at any time. To define or change a shortcut for an action, simply highlight the appropriate row in the shortcut list. Under Shortcut for Selected Action, there are three choices: None Select this option to disable any shortcut keys for the selected action. Default Select this option to use the default shortcut key(s) for the selected action. Note that not all actions have default shortcuts defined. Custom Select this option to define a custom shortcut for the selected action. If you select the Custom option, the Define Shortcut dialog will appear (alternatively, you can also click on the key-shaped button to open the dialog). Define Shortcut Window Define Shortcut Window By default, the Auto-close option is checked, so once a key combination is entered, the key combination will be automatically saved and the dialog closed. You can uncheck this option if you wish to experiment with the dialog. To define a key combination, select Primary or Alternate. If you wish to define a key sequence, check the Multi-key option. Now enter the key combination or sequence to be used for this action. Click OK when you are done. When using shortcuts defined with the multi-key option, a small menu is displayed after the first key of the shortcut is pressed, showing the possible shortcut key completions. Pressing additional keys of the shortcut further filters the list. This list can be a useful reminder of the defined shortcuts. The action associated with a multi-key shortcut is performed as soon as only one action matches the keys pressed so far. For example, if a multi-key shortcut of ABC is defined, and no other multi-key shortcuts are defined, the action associated with the shortcut will be performed as soon as A is pressed. Kst-2.0.8/docbook/kst/Screenshot-kst-debuglog.png0000644000175000017500000002102612277111530021007 0ustar synthsynthPNG  IHDRPLTE¿֨آٛӔՑԏюύʛvuuBȃ}|yutf`{]wXtgr^lViPmKjFgEeCbDcEcP]N[MZKZKZ>[tz ZWhanhM CC8+>{ֻT<|[{',>#D?Ze|֘ڬUޢ(ts1tĖm֓+,7sXf&, aK rB0_, _Ba<>ݳ },WaϽ{Iy25:'K<&{ȟ{c\%>ysysy.WzWNJq[՗ e(/1[cO oga-+y]޽% ޗ>v2V#ߓoVɥҢ^d|H1Ŗˬ @b?o_d˥#w;W%J+6r>9R%?s,QjxgVxPL½mF㚹\/:ӷF[8Z exq`듖0+^:GD#Z&~\ "Ie k-xy#wM'"[}@K~>f_O.B| / GL#tsϭ3:˕>۞ 3޽S:'߄~BNé-hإ񭭅oOS>D_,k^xx \O[GW/N"v$nU,` JCi4w4h(=T_-EtJPRJ>JSu}zF{WTi~׶~88]DiG*(KiNApINT7H ȐMCi(m12cSܰ'*)f%ACe<pT m}AQ*4 AyU5?<'6^vb%oR YJA[+M^:w#T8@*~o=ud-c{U=˫(gys_&[[ӟ84;DvSg:Gti™_uڕqqG<st~^#`R}JћB+¾JQyUN?NJ{>j땂#;x tBcW:(M4W/irm{i4yU/08~ϒބBw/=LǘwXP:&/.oZ`#)kҶR=mӗcR'6^ ֟߯YÖKa(ݰ_cj`$Wt?٦=umv9+AvE7(>EV= (^մϵ#Ol)řc߁v`WMNxdٟ_iwRaxl(Oa)7zPҼǐysMM?Rv%RXBQ$ߨ(i(Jw<\7BJ㷇ޔ$THCiPJJ( 4PJTz49Sܤ 9SV`^p@i@i4P@i4P( Ʒb@MSJ;1V>Z pA>d;kت:ak*dUJCi( 4JCi.*8m9.( [鑶^ʟ.OmM%V*T nQ|UW/JPJL^aTR\nQkJTUiX QQe=t҆m|=yC N+JRqJPOb)G"m`,ne*kPKBWjPѕ5pyMS]LgehRe,<ºl[PSP+݂)(][uVYiALJoiX$i: ] (K'l%| (*S3(jw<&)-_^a{jt"IN vfҵGFi+- *QrXx$uP,Ht5ttw Fm\BQ)F BFxSF - !߮z +]#SzT (]j J5P^&PЕwtYN}LH~]T{V Ӯ|AI{ٳҥLm'YfvtLՙ՝+/l% 8o|xۏ-GH3'klvM"kgv2?S^7K/?w>O$%g_s[٥}444Ity&׹3ثZS@$$i:yΎLphUm[=FŔ^.ڂ[Iׯ9[P&ι.88ڣlKhee%쏬k{m<'{}q>Z5zhq"S %ޤ,MCDu[k5ғHJ^AJ61ްQ;һeZ|oU QKff ONh؁cړYu1u${o5l&Е{]򭓷&ctj9c)KfY䕓's.|Ys;N׍尶X\FvlF⊹ꮌcX/MmJ$Qn2i5D֔>| +=FGg= $)mcL*8-vە>.z̪4Oe%c&OXғ~]~dr#B!9#d6O3nO ONrkeKalRNط=Tڼk;̦mQ#_:HW= ^/JjZγf[NuI=VS6o.-TK1e,% g?d)~joVڪ0GlrV踶Qqsz0#+.m)FalͿaVb~uҺ{Ie3XgtZUz*#E&A~ ~/t+mJ,k8QP ڭH5J૖m2h7X^?u]_`ޭ*}Jqr_uް(s,Y] 2jd؆z 6 GVšqVb`ɫ(],x4R<;wm%f*Tr&%$o\ʫ4*GuQ}憦thw~INkKee~ǃ+Җ/PbvM|mw(oAiPsJQ-F` >/PPna!n,1c+:p1{u2PC=l{cT*1,mcb?;88cCM=dcYZ 7yPV{H60RQc$%'ڔú{8({+0O;=wdt(M뤕>l4ZKP}*M.[CQKX^';)4 ΕPzVW?E)MӖPҹkvsKl*.}J[f"tk?x+WgyݍtJoU/-㏓n1iX=[^K+-N[Vb}t]{LfyҖjm4H;Z:S|;FfoҰrWSe#-V_Jgv)v7gҰ + 4PJCi( 4PJ(͕vT( k@iLKiL KCJCi( 4PJ( PJCi( 4PJ!( 40( JCi4xàt* j(] Barth Netterfield
kst@omega.astro.utoronto.ca
Command Line Usage and Examples A typical use of kst is from the command line to make X-Y plots or Z images from data files. kst can read ascii data, readdata/dirfile compatible binary files, and optionally (with external libraries) FITS images, PIOLib files, netCDF files, and HEALPix FITS files. &kst; Command Line Synopsis kst A plotting and data viewing program The options are: kst Qt-options KDE-options options file Options A .kst file, or one or more data files. Supported formats are ASCII columns, BOOMERANG frame files, BLAST dirfile files, and other optionally supported types. A .kst files stores all options that can be set by other flags. The following flags can be used to override the options set in the .kst file: , , , , . The rest can not be overridden. If an override flag is given, it is applied to all vectors in the plot. ASCII data from stdin can be plotted by including "stdin" in the list . The source for the Y axis data. For ASCII files, this is the column. For binary files, this is the field name. To plot multiple curves, this may be specified multiple times. The same source file, sample ranges, and X axis data are assumed. Error bars for Y axis data. For ASCII file, refer to the column holding the data. For binary files use the field name. If multiple options are given, this may also be used multiple times. Individual Y entries are associated in order with multiple E entries. The source for the X axis data. For ASCII files, this is the column. For readata files, this is the field name. If this option is not specified, the row number in the file is used. This option can only be given once. The source for the Z matrix data (which gets displayed as an image). For ASCII files, this is the column containing the z data. For other optional formats (HEALPix, FITS image, etc), this is the name of the desired matrix field, as displayed in the matrix dialog. Some matrix-compatible datasources also allow using an alias which is the number of the desired matrix field. To plot multiple matrices, this may be specified multiple times. The source for power spectra. For ASCII files, this is the column. For binary files, this is the field name. To plot power spectra of multiple curves, this may be specified multiple times. The same source file, sample ranges and fft lengths are used for all Power Spectra requested from the command line. The length of the FFT used in power specra estimation is 2^P. The source for histograms. For ASCII files, this is the column. For binary files, this is the field name. Multiple histograms can be defined from the command line. Used when multiple curves have been defined. Rather than plotting all curves in the same plot, plot each in its own plot, The starting frame number (for readdata files) or row (for ASCII files) to read. The number of frames (for readdata files) or rows (for ASCII files) to read. The number of frames or rows to skip each read. This is useful when working with very large data files, to speed up response and conserve memory, in the case that the data are slowly varying. Used in with the : rather than skipping each NS frames, average them. This provides a combination of very basic high pass filtering, and memory conservation. Override the file to read the data from for all vectors listed in the .kst file. Can only be used in conjunction with a kst file. Rather than displaying the plot, export the image to a postscript file and exit. *BUG note: even though no windows are opened on screen, access to the X server is still required.* Rather than displaying the plot, export the image to a png file of dimensions 640x480 and exit. *BUG note: even though no windows are opened on screen, access to the X server is still required.* Command Line Examples Several examples of typical use follow. To plot column 1 a file (tmp.dat) of ASCII data: kst -y 1 tmp.dat To plot column 2, 3, and 4 vs. column 1 of an ASCII file, in 1 plot: kst -x 1 -y 2 -y 3 -y 4 tmp.dat To plot column 2, 3, and 4 vs. column 1 of an ASCII file, in 3 plots, arranged in 1 column: kst -x 1 -y 2 -y 3 -y 4 -m 1 tmp.dat To plot 500 rows of column 2 of an ASCII file, starting at line 100: kst -y 2 -f 100 -n 500 tmp.dat To plot the first 100,000 rows of column 2 of an ASCII file, averaging every 100 rows: kst -y 2 -f 0 -n 100000 -s 100 -a tmp.dat (Using optional HEALPix Data Source) To plot the first 3 maps in a HEALPix FITS file in a 2x2 grid: kst -z 1 -z 2 -z 3 -m 2 healpix_example_sm.fits (Using optional HEALPix Data Source) To plot a map with a specific field name in a HEALPix FITS file: kst -z "1 - TEMPERATURE (Kelvin)" healpix_example_sm.fits Kst-2.0.8/docbook/kst/Screenshot-kst-demo.png0000644000175000017500000003526012277111530020150 0ustar synthsynthPNG  IHDR_n PLTE?BFIQVZ^eudsszحǓ~Ɍ߱덽xnd`_^][[YXUURQONMLIJIGECA@>>A>2|_RUZ6a;k@v:|AwGP]lȘų˻н¾q•\;N(?^#Kv!Lz M|M|Z#I!;% MPhY\WmUEWfړ X |k% Z4;2&/1.!$: E . UKxtRNS &7XIDATxsŵU)r?AcW`,- 'qʁ"$K #ږ*LWc#"C*vϳgvfvfwv˫tOOOgN>o}DBkċ$$yGjh$$GmIH1%A= .oF#{8MB#eXGX|#9"!QeD3Fbb;K,jGBTuoXtW\I`d4S԰_ߓ36T%ґ!}97\&LNQv=t=6DȂ#!Cb\p+/xW:, o|xf xx㏝}D897xgCc"haxw&Ć&E) {I~ۍWM!cT,,G '8Qk!,uɋQ1x. ;t>ȮGv!kD};C;}ppKϿC|:gx' ^b5.66<>|[q;-.6߻G|9/,Nj`SI#Y.*_< t5^/}lGa/'_q˝e5/ᾍx[^{6_:N ]hBymxpp#=?֑WxS!+?ʃi6؉uD˝1CtD+G_q#slx||܎e5+  l?x#\~JIu q I2.+1g_?%!G,~BB_$yuT6 IR*拄$!H/⋄"i8f#˻Ruכ/Y?FA'o6}?"Wuķ[[~]) d3'Pt!U`00%{9_Ҟ+q2zwKghqz'O9d7#nJϗ][-<{V4Oiq.J?2iŰ=+V<鉨ˋ3pos"E1Q+#=P|QNzľ+S{.߂ mT. [I]~&\6rgv2^^ՋNj=RZ:"`߰}եҕҕ3.]}W>%`}/HDrҬw%9J|+ !^XjN2:_E.3 [޽nkP&bY]0km;ړǵKv !{ǼxNM.[Eg];CAnrKFR"S7 _|J'7\eE_n?4}fyҽW&7Cel-nk}-oC;l%7p8sղdx4-#u0_u s WV &H|<:o.Q8 6,?W/ŌqXש|KW"!HH/⋄"!{$$ً-%$5WC"_$UBwHI$_MWi}9~ŊS/o^|gׅ^Gw^ ^Off*ЏvMڼAQB.z)GzOB;%8|T_X!YekUԺy\<:֯{f":<51ebjt-y`O;_z&P,=(_J2_fݔP-H )?"C#ݖᓯpw8_\iu 2_]MT Md>s.\8sgϞook݆Mذ}AI|:mzz&ީї_8q}j6-;$4(wGGTzį̗8C#ݖ3omz-`>_wN>-E_sPCOc0{w@^I篛xmt!m%_mֻ}SL_&GWz(/佁RtzoX_%%lx# _"=\z69)ˡj׃8C|Pw_=6NG}VEどM;ۧ`-ă6^#́|:S`>_GwSOرcT5;mmmwe!tg^"/]i~;er_q*nr._O<Į|ݱ:muėiƖy&oOtJvun۱cdz^h<|B/ χۺ{mش-Fx>tԾg|u:u6ʗ@hD/JƹB͊|9)Gǩj߻/ҽ|n3_w\Ӯ|e/? ;w8yhFWWTos3Nζ|zzzx):yi)ãݹ6l:|aL->n6}’آ*񥵀_=_1$eճzCg{x9_}SO $=111y3f.LO}Hށ.w.VO? |ulRc-9x!ϋěo4uN5g6on;Y6#BܬΗeB[p?|up|PB{h]8&9^7q~񜦿P..p#k8|>u^çe&9\$:Y}n|C?R_j=|C@HFeN._sB7oR:>>Q7ts> G HGϙG떂 IQ_`YRuZݖOxX/}<ǧO N/Ud|zS/^ԨׅikA6OO.MZ;z+؏ZtQ_|;:vr>ikڨ:>1dey_uL *]!/e'PB{zS랼s>ײlŘ>2/0c1w}9:> fo.("7ǻ;:_<~/nf0u wvח+| %rTÀ^h_R$_s|ͩ|Ͽ@53_7'F|s," 0}B'wĬ`nhH*0kUoYo՜ o8Bzy)ȡ޹Xhwlk?{N狇i&#?"t}~))Ο?0c[|-ymOF9=_}׺N|i/{^:zSƝJQhK++~2/KKWN/k:d 5;$F,+f{a2Lxl[H)|Ϙz;ľFϻ_|`kV_]f+_Ryr^||oz -;{@h ??3MnnH_Տ6/.}F_}7<'6X:dv;mx+4@v}qqQ ƒ~;m # 7 o PU{w o<~umGt/{p'A䮓/nݟm)q/u羯"%G~$,׺M{n]]mU}7rL7=km j(#xo#t3! 턖 (.]z(:W6!'$};G 8?h}y\wU6ڛ1^$\{1=YG%&ck{/9d_ E=/FGtŋEgX 5y(&{X1zɨ8 utdڛmDGag~}rdqT m#O=NL(|]櫯%.gOkoe#3xwҽ|z'>O\ot-uIK̾},N 8W!Хy8|EFܻ×uROG|Yy'b/? OWǜS/صsZ{k+ Gw{޾މѣܳO{%|,LS1 CcT/Wx+r?p{\?-uU0Ʃq2_q?=לerǬٰݽ~N݉ҭ[|?7R(_v?|KKb,/)QS㣓eKl@IғP}TqЈ{w⣏o?_c'-L8rz,sNG: oGYo.M4JmckP2HHk~3'F x2T-xރ%ILqNbޞ秧g>oIXFj翚{wpty=b}GTW ?"-#I#IzD6se mUE_d+}u $c9|}m !V"!HCi&${oB)!78{8ܫWIZ$t#WBjjj_U71EE% OTxB q/%i$$"q^zNMDn G.冤lI|&BW (&A!2/HWP*yD%_\V~@ZC7]AS _(yh_RHcOֳ? 3#S f"*֍$%ɯZdj!$$fɆ*C(ق2/8 aIoҥܦ*g`KRf0.҃@FU/I[+ҲGZWQ*Wg'[لJBr9\)*|)_ F)KAOKIePvO Uye*ʵ/-|ɜ3Koԣi |+ 2@a˧} +r<)*WW"`1uUf|%/%a ±˿}LW9BEI2Wr}mu嫜rjWZ2X|Au|oR+*׎r-*GUNWL_=frrzR@J ˹U'_|U_W[r}\iWU&VEW9pdUr|a g:.HsU/9*GR_Br~teΙr2_ŷ W:[3ʅW1}/դ_G(c*טZ=kiۯ=_L_o? _U5/z᫜#_ `[/H}5嫜J +g+-_j[/8U}_n& Ԑ*?e_U}ʗ/ _P2_I_%Z o[/ȒE+"B" Wy _5'},5%|ezT|Acv /h >|AWƵ/v|AܐP -_Pw& Z/` މ|nc -WB 8oKׂ:\#HEB|_$$9U#HSZ0qCK0Д_3M܎F|_P"3%;Zb QsF(UX5x,GK|&sL6 ;+Ws/i[ I9mt"j /H/H$̗vj8_~u,+}l&I5'$>:\W㨧iK|O}U݅Iӎt*4?DR4hQ:Z͊ ! #3D|&Up0/p|hCK>JiJ4Tڄ|aN 5Z8/_W|ɻ{_>_Elez |`~W%*_Wz/+Wd_d_M։*/ '_d_/8Ht_U_d_d߷ _dk"bfV+}(ub _"?2.{k/3%fRXtjpO,-*MvqMWd*,m0C} cr}fB eEVV|oomV*V%‚|񓋕Pd:#a|əLyf[֙>rpen#c~YdR12TMy=㕞W11;t[ ӎ754cB) Զe><so X'$e\D̫Ɣ\0&g;._tsߩ$R A"K͠7-յW |aH׫]jLJ㫞&p.$n*CU Z*dl3Inݫ:SIhAo0/' T5@ZirtE(FL|!lg(#/CF Jp9+_%.Uo |VƴD`!nuB|E&M9h>(B^9(عSaq/HE/1<|j :A ,fKmPj#|Ik#\ B`LN}MW8ND2@_^عJƗ>#Bڜ_/]xNB*׻~l۱ηB/׿8ckmAd Ǘ{/Hs W.d+"֙G/ u;?V݃eܿ)EM_;JT̃ϰl|;Pf>(ȔkńR9?;!`怨M Jjm)k9kuh Z)cʃJ>nqf1}UʛN>T/E{#IU|"0?++ 맿XQ Vd>v bpRpܕ5q{,ODTo<): G'.3w>ǟ;7Gg14;ar$1D,2M <4R\77bO;O4ˁ7!^{ͅ?$O2eў)-ۻŞV|4g)LM[↡p(qְ[|9$ #|1_=N2iQܓp#y]q.p] |? nNܵ;ykQCiP˕S{c[36ӏӇv yǸ|N:r|Pܿ. +P89|l U 9N]M_d';BлI^j[o/_\()j|yug)(hxN:_,k+&|yLʏD[`=-0#\;z8󏾫s`mzzk*\5{;k x^ 4ZuO%y$t }E>1]́[u+wbn]L\g&?X{KY-(d>_!M іvh!J:,PdZ 54Xi̸Ve|!nT+uD2 Y 8|8U\o[lB,t+4kR,c_C 2-3/ՍWU %Ziog6aJNAn VA+ P,+- I# WsZc Fyx/!_ʹt<8/+#G+UG"R_Dt_QQk/sߗ"_ђ4<[_X'!>9IcTHWMމX\11$W^_Wm?{5_G4z)"/ʡ. _ŰZ&Ȅ&UAMy+gPJ$$$ EB|_ur#G$0(@ydus>j˸95ΈVT|aʳ|yjʶT/y /jȾ/V6h|"!HH"_ƎA۴omgu 4K }ʼ޿]=+B|_༼ WB;T唈/̗ue*_3E|Ѐ/+}[}ﵠ().E|e;4RA|_$ jhkՈ/|*V1L\ bY+/L"@ vGo>:U Y,⫹GK| sBGm|WwwZ~W|ቯ&_Ҷz]r8n -7$i!œPo@w"i>BG`Bo!xj/j[`|B*~U1#{ɝO6ɾo&0I3U{zGlHr +6$UZ1"`yǘx__O1Q7\_S\ş/~+3_יWs~2W`XU4O]^ub]!ڿ.9 yKJ^]bRްh|XQ*}|Qƈ p0nr03:_F|ir; WX@r*&0BA#L:d8|af4_(__ K,1Uś̴' %+cnxz fG_Q=nΥ!/p]4T] _UmRR;%/0 Jte=cS,_ cW_Iɀ2̺h Z2ZiVҴU*`gP?>+=!Y+0_v+i|1J>l}00Gk _u/5̗iFS2LVsRβ:Z]2FgvvCIG|!H/{ܯC/LW2HW0D  &Kugh /VP*W$g :Ukm | c#( ,/&UoEdةQ~IDATh/@H6͊ `jPu DUUWAaLM S $&+H6 !pB NNhr| e:޼ EWYIfD2X{N"MOfH"k}u9F:w9ލFY󄜗Y$GjN$mmX ٟGLR~w#39L8i3W%L<x9ܐ(xCIf0*q|0}WSRcގ=v>yz0*'?1 } ʩKf8ZiWc =n H.3%:ZC%dR(N,(ji+RA(|N_hua*tQW$+$toB6#c |Ʃ*ꨅo V^j8_-b2"I^.(Bn@_?5tx >xtjKl@*nKɣfRsDp+LnTLNA B {č z|7sRpRX./SCυ/&BRES1S>:GTlDw ʹm{6$CN[FWLBĶճw) ; yއ@JBdKb=a=a:^.H'; !( D'(:/0602846NCENNQuabnn}Š˝ÝżŽž8 tRNSŠrBIDATxOhG}AF;cg2x, 9  ف=q$Q,lh50|H N3w0aBAb#d1SU]ݯ~߯e_Uu߯zPYC}8Es*fu_|Cec)K(+le#Ǻ|CiDo\6䘲>(50|snh C)E>oV5[5krLYOAs~ݼ,6梋Bvrx^]0 6GVVɢ+~WᶷUΘy(~ӭo:s]H.*:d]yNxlk_ˏqevx{s^>ỉO"½ۢlO9PYOOmx-ِԮ[<ՉhcU}$D)'ƷQx*#X#Oy|-x'D|#ɴ Y"4O27PAؕA@J[R]u6(τ_cKxJ֑z{ iz2Ʒm 'xB xB 'F |"A2b|O}h흣 Պٟ+ gQ*x[gx\ xVEHyJNB-̱yi@󲞉)J;v#c>=]y84“YLS'رizȜ"-H*arNX%W 6}Wĥ/v-C3Z7gez|6ɢV'?{ԩ_ҥKw][GY=\gqg2y'/}uΝU+y6x +'IsJ̄(sqoD4;NW/7osT)O<tR499FNQ˫S8]qtpppZ,*x䉓r_EoV:֋k{{{;-my ^~湻+o|>]x/}Wv *>~*-Ͼu6`} PLO;x߯hM*)GTYrz߯oo$fTm{4 <ƕǕSb|<[[y6+,OL>!OOt<7c̃]N򬽴o ˪ct4KBul|K _lJE٩^ O2&yMe|;@TIt3>)%&8:?t$95 bfE7n~u BCs`D}~(3@D]xx6|v< 6 <;rZ?a*O<<O<~L<{ xΩw(ϒ;lXGOx8;ZRM'y;$&ukaׂWsM6/p3fxOcgD<+tW1%YK!ۗ*&'3v>}v3؄mЍ.߻LT38aޛ߇_mwJĆ roT~ڕjGXSxV`a'Ž>Dkaz>~46? Iy r֔`xrf$hY>M <դ mK{`F| Ġu撨%jg3 |UuB%H%'t)h]]mZC6#69K|i߇RZDjkLi̔ϰGi<g73̂>1JdoMmo['o+-m8s/eN<Mmo5lq;x: >C '9N8@ )zI3 ͳC֤qZcOk=6|'ޡ[0I x:S;'JOOO<<Ov"̳T:s$OgPI/3/ [Õ<;³kn/ކxj PP\}6w+<3γqggxJP&<ݤxvgbYusemggxVs<-׹'jheC@_ xB 'x'xB ' ʢ/ۿGnkyIENDB`Kst-2.0.8/docbook/kst/saving-chapter.docbook0000644000175000017500000001430612277111530020057 0ustar synthsynth Saving and Printing &kst; provides various methods of saving and exporting data and plots. These methods are described below. Saving Plot Definitions A plot definition is essentially a capture of a &kst; session. It contains all the plots, data objects, and plot layouts that are present at the time of saving. To save a plot definition, simply select Save or Save As... (depending on whether or not you wish to save to a new file) from the File menu. Browse to the location you wish to save the plot definition, enter a filename, and click Save. The plot definition will be saved as a *.kst file. Exporting Vectors and Plots Vectors and plots in &kst; can be exported to files. This can be useful, for example, in capturing plots of live data or using generated vectors in a different application. Exporting Vectors To export or save a vector to a file, select Save Vectors to Disk... from the File menu. The vector will be saved as an ASCII data file. The single column of the file will contain the elements of the selected vector. See below for an example of an exported vector. 3776 5380 5245 2942 1861 2424 2520 1868 1736 1736 1174 499 Exporting Plots To export a &kst; plot to a graphics file, select Export to Graphics File... from the File menu. The following dialog box will appear. Export to Graphics File Export to Graphics File The following settings and options are available when saving: Save location The path to the graphics file. Enter a location manually, or click the button to right of the text box to browse to a location. File Format The format to use for the saved graphics file. PNG is suggested if you are not sure which format to use. Size Select the dimensions, in pixels, of the graphic. Check the Square option if you wish for the length and width of the graphic to be equal. Windows Select whether to export only the plots in the current window, or all plots. If All is selected, one graphics file will be created for each window, each with filename file_n.fmt, where file is the filename specified in Save location, n is an index number assigned to each window, and fmt is an extension representing the selected file format. Autosave Check this option if you want &kst; to automatically save the plot to the specified file on a specified time interval. Save interval The time interval used to perform autosave, in seconds. Click Save Once to immediately perform a save with the specified options and settings. Click Close to close the dialog box (autosave will still be performed at the specified intervals, if selected). Printing To print all the plots in the current window, select Print... from the File menu. A standard &kde; print dialog will be displayed. Some &kst;-specific options can be set by clicking on the Options >> button, and selecting the Kst Options tab. The options are: Append plot information to each page If selected, a footer showing page number, plot name and the date and time is printed on each page. Maintain aspect ratio If selected, the aspect ratio of the plots in the &kst; window is retained in the print output. If unselected, the plots are resized to fill the printed page in both directions. Print in monochrome If selected, the plot is printed in monochrome (black-and-white). If not, the colors of the on-screen plot are used. Curve width adjustment Adjusts the width of all curves in the printed output by this number of pixels relative to the width of the curve in the plot window. You can set a negative value to reduce the width of the curves in the print output. Kst-2.0.8/docbook/kst/Screenshot-kst-eventmonitor-serversettings.png0000644000175000017500000001345512277111530025044 0ustar synthsynthPNG  IHDR 0(GPLTEtqldcba\[ZZZZSSRRQMJJJJJIEBAAAAAA@:999:;?HPRQOLGB;4~6{7x7u7o6n8n;oBsLx_t}thhbRPQQORTQSUSSVSLYb2^.^.[$N}#M{!L{!Kz Kz Cl>a!8T*.4 %+)#(  DtRNS&m8IDATxMkImz_a: k(E0E4ri`҇=hۨQ uitw#U[cffGDddeVUV)y䪈,/ǛqS~._t´ӿ߅_wQ)Mfξȱ2]ʻcwXg"B}VN=o{|||-4gȱзj߅_|s:Zss/5ִqOl1֊R} 4BsOyv?J{FE%GqIbaa{v_;뇍޽=< L=Poz~ygކ`AwgwGa,F%GG>LΗs{|6ov>;NO߼ $̛,ȪFva$ oZMy72TEZ(P}Fk&w_ {5+N7NTeT ߐ7I.Q$Azpxh,uTӁο/1V-:gǝW{;sQn j£zvV ;i@(LƋI:=h8~2OUљ:SEjt^?޽6wOv_}H'vhMu2*xS̢lvk_#OUљ:SEB?<~=M]Elӎ'W}wc3=DY2>L?4Ӏi4`0 L1=v{{nz)^-`seFjgޚp >.A|\Z\5J*"wi:7WŐFͦMVQ*ŏEz]״dEI0ʒ%mv~ga9@ņXmm$fѧ Lt|Mb@.摹`v_P7 Qӵ>Mt|XTWctt5o^MMUinq]`Z3amM VP:[\Ocg{ض8Vq^ \ي+6 w8߀9L%7OC ](_]}e(WVjs~jLojMx{[0 z>'#~d@/`4`0 44ro؋R.z؛o@Όѹ2XWc/]| Ǭ<'ꧦ\Әjik וL/8HW1q^1-hq&Λd믤Ɋ|/t"xtItLP-/JW L/9"k$ sEijNɧc0=nӋSIE{6L7Դ8sAMaL[rVYb\qkUO\<6/tE6;í18ح<45\B%mzy cz lzeH+4^gk ~d[}ǧ0F0i4`0 hxY1Ѐ8`Ә1?8HSaiVӢEԻi/h9O6q붆mHUJd3b<8Lkc3hI+Mg56=tɘ:ҍwG۴ݦo۴xniզ9UtsM8Ɓڕc8Y({O0=.56#1=X#McӀiX{$E4eя  L0]"Z ixY M qӣ2` LOi}*38BuJ&`:zxJlycq h:}w}N:&m\|1:&Ɍl^L`YhW4Q;>oz熦ՓgĎ;i@|_Lnf+ѦGeT~wi-GD3mF_f {dUV#ƪzz$7sJ6 {d7=ȒQ02sl #[:#Ӏi4LiցAcӘ-> 12F&φ4m cv 4 '۴55d6׺ oFA4Nߋ[P N *pwbDҴ"]%mft℞ =NKylڨt39sxޛIȒh#V l9i+Xas{ ]` cMȀi4`0 e,uh7`eE{41=M2w"􄙶v*0LӾk,6)b/RL7,7dNv8#iKH2Fc=wN$=ʟTkܛ{d<i4`0 5MΘDC?2o(`0 Lt*h Z tc8ӘF.1wJֵM5]%ZGȮkq< 0G⋻?'`+Z'􄞑DKbz{G#ZG|Q`ksreFjgޚpXK0:W~FQ2 { ѹE14`Wl6]nZhShmk>ئ52LceKm)(r,LjSgN6TjMMj'%Vkj:ӴI^  ^aW2eDPčbU}BYmf4^j1t bNW?NKI[T:q,70ߦbzh+J,>NKaz-@WKTjC[b>'ďwC{/>%I5#]؊+6|߀6otXlz+Մޘ _Y+0ބp˪[ x-V}CӀi4`0 L1W|C"hLfg|GAY2ccqD zCybL|2iԴ ghsjO/yjh='iIs}c2Y7Cq4׎Jc粍86K0BfD@uc}}c ==s/oϰLWav1r~Qd5?t qjh#!`z>X3|z_m[;LHKj:SBmtWfCC:){ULO6Bӹ6YBͱ\ Ϋ@i25m:=N_/ZeZJE{{)3]9*>N_ٴOP d%,m{ #֘ȽϽst0dA4"cxӽ8b|s*rS}4 LӀi4`0 4`0 LӀi4`Ӏi4`0 LӀiLӀi4`0 L1 LӀi4`0iLc0 LӀi4`Ә4`0 LӀi4Ӏi4`0 LӘLӀi4`0 Lc0 LӀi4`0i4`0 LӀi4Ӏi4`0 LӘLӀi4`0 Lc0 LӀi4`0i4`0 LӀi4Ӏi4`0 LӘLӀi4`0 Lc0 LӀi4`9{٣f}ƟF-*Lu>T_4/éMw, jӁ+Caz@:Tp̍t#40X]iͲ|yM/rGziQ=8L/`zӡ ~l%++i{ ګrӮmhC-p*{6Ej̒tͤ~LK[$eٯŴ?4Qer%WZ7L>Ӌح%o+8L/6б2vF9sc17XiJ+ַ4h۩*~5妵oO[CM7t`_Ӑ]$'I:'ct eFI6JD,mc:0!{#*#qh UdY#᠊iKYMLۦM^V8L%6Mlhո!d6c"3]bÃdkt21<[LVy735:p^t]"30⧛9Џ~d5:o(U7o(L'4`0 LӀi41i6L?8,o 8IENDB`Kst-2.0.8/docbook/kst/Widget-kst-minimize.png0000644000175000017500000000045612277111530020152 0ustar synthsynthPNG  IHDRЭIDAT(ϝS@ow  v~-&XXlAWlasT.*pYUu_OTDofW@p > ]i 3JR@eLuBT8Mԙc4L293̀鲉0vͱt`IC! π/e.}`2Ӥ!Әޘ MGgI飽3_Ǭ*FB-aI8|9?r}N\zbea|?SX|IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-tutorial-datawizard-done.png0000644000175000017500000005464112277111530024146 0ustar synthsynthPNG  IHDRC:[PLTE ~Ӧuϡ`ۢC) lW(O#M"U1h:yE{Unyq}tydTH=yAgFmCmIgJ_8\.Y(X L,  J][_m "9=9z=wBwH}D@@@A@??@ABEJJJJJJJJJKR[Z_TSRRRRSTWYZZZZYZ^bfdcbbbbciiowytx헼댽튿ꇾIJŎ{u۫ƽľǢƛĚ͎ȝbrn[WYAMd!GrItExZy=m$:\7S>A19120E5*"!3 @?+     *2Dr+ezȠo tRNSm]VDIDATx{l׽J>IpP"N$$9WW&p*U<$PhZ Ib&!?#`BDffϬ5ff{{7kg~|!J|AL /w..5AIt;!J~4 դX oѕ hA5'pڒ'11i jRK|Ŝ%RL4@z@T{ !)! !QDȒ'KϿߞ|obo#d)X4_|D?79ߦ4 C!KKB*}tc9@{!%KC7y4Մi6BdhK+ !/?v&v3!ۥێg?|`m62Bk'bCo.\YY߰ Q#*C0b}b]z ?~cE-[BZR0o[\}oב:~N "d9P)ds|asap|H+dO>BR_bK?oߛצ:tCпX,=ڿ@e_,h.5oTWlmtYㄜ\-C`^, 59-6d=D:`_xdͦ;j9!F]7/ij Piz;p[\z%~3d:իmPiɮ5ǹ_y+ț{9ybI˞ o}vL8*Co8&oli1):7iJ'!޻0[cGto~nquU8Fiqt\{|Z, ݐ2Thu,;{%TK/nnnjJ׹ؼ\qM5-1g$e"o:J Ʀ?_x:',^쾭36._%K,^nCW64_u?7CejUx@пBnuZ _ AJ3Z. APr AP`!C"Q';P"4*JsV>[SuoU5Vּ(;gvV_s*|eN7_fjG|oӐCScwCaI}e;v5_rMVJ Cv{u\~Bk^z.zk hz9Iگ.:;׭_ohW^ɢZ7+7/c:.L[$%{#m`}ԩ]˹á 9J9ūȖӆY;r14W ܼ1)7s\Ͻ7kÿ3Cf>`}O/Cr֊YyV>{bEMw4wn`},ïx 46-<24i~ +Mvތe4ayo=^|sÏ]n6ёkz3B%g׭1=8D3g;:(g'u죚QޭM~Zfc#wr!QC-{Ojz4\1o1n7Cm! i+ZS X${o{GwmxGh:U9(M& 杶=!L5q*O Osz]?t>m}̑0?d0bw[$ie­8ֽ}~a*4+?E߀EMzː:QܯCNe֔y?4ʶ^f1:VPMk%s 9T+R6{o:vUknrQz9k-Jr>߀EM߼N!{o7X虸[k"]@fרE( U;C}AURdVXoyArR[ }`~A`!CI3AI2 s4Bez!@tj "^d HZ>5X :K}:˱bS)U6*CH=&,[O?WXSgOI[--qΖ; DrjM=.sR{>w[?v#caE8kԋTя\yx\:{w.;v$wr d3tPc} S?6sJ]PWݐ!v_a"γKP.7=C?Xzz[{fK\`g 4m-} 6z4!󯷐2Cl2#j5k5/wjda Yeg@^;s 6|qCL$Cp@Bl5GuT`p ;'b?d-=rT5An#.C3ZxO?eO?S-qS]"γK5={=C=]u֒gfi]A { =D.8w[?|ܔ%]uC=D?3@X tg^ 9Km{KMf/a=!'K(CL:$hl_p_xaт-;wvH!A8z`  l\ CǏ CGs炞莶7[W3; M\fbژٰ̦= yR!_f|`$D=eˢX.tإֹwlٲcOo?~?UWC]ua~̟zh=c董ӡu7,zs{,/tЌ?wsu7lP:͘@!Ʊc9s/gDc[^yũ-oN"!sMOd ;P?DhD(C@tb C_N ,sœ{?A1dz!{>3! rNbDCzիV2Dɱt냟eg,cop-{n^dz9;;<^|-|>`Cй}8h㕞cP#Gf {::֟ڇ6j} 3["Ƕ̖;;3tʔm쳇˙ m7o~vsϮk Y^Ϙ1ヷ}m?h99C=rP?w"G8/C[?.?C;{- tPJ C6Dmm8b"?;.Ҵ=0?5Av0Ksc\.X ?RB/m'cի5!m5'Q4==dCrkMI{C*]=sK /HyZC)!P呂 /E!{Xv ްD^Q՚R?i| Yܙs7h f$q)zw;~m톇}\Tͨj]޲G?)ь~h<Xb!;M rO~+mN)HO};319os0`Bg\:pe'|7"&pN(5!x 6o¢uO-]ڸ8fQ5RZwC;,0Z~Ǯۑ-}Cz~XI<c3إ:j2D~@!;3u<#ꃛG>ȣF7XGFVA=s-LzM땇)ݥb?t)"2÷=$嬌u2R:wGV֕%Z%Sz':D }%!_,g-α!`,WV\/Vr{؎V K5,h8˖Vޅ ]nuV45.S/[G\2tÓǴg S}Z[vl}n/uCGgwC?`z\ZwhuV#]:GΣV*v<ڍz˷}yȈIr_yPOtg4õm ,CuC/9^$P*A Yнo/Ksr ~ .C/w|ɀYZ7ZC/l['CnG1C$=guRМzD۳ǐ,\аCgxཋ]tP惊rk9m7o~Z.p j[VZOc9O9sM uY 4Эo7ߒo+BO?q'04I(Ӝ>٣Z6C=\7XpKT˭oi-/>ڵ=vCi }ryLР韮~썭?wP4*P?wDes'nȆH1}{kjJ;fΩC{ּs+[7ʖg[uXX/7b~dfٽGxzM>ӎVzOܶ2|nsk@u~(jss/~4+Cxl N9Zx4BXYۚJ>kqJPx?Դ̖8cC}+Vh/\hn^ѴbrmC8ٽmP.lpA2 nv#u aB,CrM+)B~ȴ,iڭoԭ Cm2uD/9la+bhޤ| E}@uYK] 3p/Ͻ>dɏSr{':D Y6hT3䷐gZZ`_SR|VW1CVy1/\4a]!:HGQ Ѳ=4e(c2{)CTji9li{ܩ_gN ]`: a[G^ξ>ʅ!~na<=V7 hwHPG]~3>>ujfVP{j#Fz|}DZ:;>DFZ. ǩvrKz9~Z~iĹ;oذvU!!X.8 1~U?_C-~!ǏzeAEн7|C܃k֮]f5Ox`Ҝ:nw`T뇎CF+vl|MmSk:1!C"?$d;xՕloS8b̧#%So?CvAVСXɺOwWwG ٵs_p?D{X(Otw Ga'RaB-/YٟfֹuZ^e_.\<) C">a*̧˕J_TP Y:|*amrO7C&jH*8P>C 9tN"0*9ob4Xa_R62WcASC)N7Ve$/S&g{|lAM20CDQV₡*dHKA&gQk\WCr $TdTAHCftK`M"3D=ZvWj[0Tɤ*G,J,W?ĦY40TKD*IErF[k&OM%R\LUjUgrŰ֤*v,(CJ1TثaM~2!Y4ڶB !B(f,1H1TX..2F j4R!|2d" e|5sPI֮-b| "YːiLSt6g!D0Dʃ <*)`NwmY@Re|"Wy`q>0gHT&װC/n\PM.Y,VB!C lזɕj*uPn"1G/ <*["C#ʝZs^*v#ŨPќQbǬvb6Cη]:՗!h eo@pr(. }K4dTCkMLQm} ai8,sgAVSW֞0Ϭ!4r UZ{|tW[)i,W`I%mH}'f%1$UWC%0EO:cULx&v4 Rl[} e4ahekķkX.%HǮ'Sr+[PCtS%U9]eʃ!ɵiCEN|"ŽG1WDi5^L1ln-s&]h%49_}>[\JP+žjbί8MVV+Y~LiM>$CKR01/-CsɚjEdH ؛%yפT!a5 $ɐ;cq^:aZE'Uᨲ aKLs$1WHTe(/6X|L)8C!cY;Yjt+JbyƐo+L|x/rJXv[-&d(!BD34C7rnda $#x\-9CXD?ArT3*C!*;C7ɼMwkז1ȤaLkr9]-ÊPFLK;q4IIæl6q]br;~zeMfi$ݸ:֘IfjںV4ys=#_&Fed0ZInn?1I&51ÊiHxjI{& (33H A  A 0-Ʉݿ&3W YRRݮϏ#Y̐Xk~|CۆTCP?4~ Aj Ey A  AN'C$ǐ C!mHB %b$CN ,BPј!B!34YM0`XA:RLH̐5$j; H1w xDVCbP+YcYO/W_-^J]%C` M7 ~ ~¹_/a(KKOk_sZ4Cz ]2}VNyKIz I.]ށD0ĶZ~m>k_=1{c6lm]W^77uL-TA0'aHWNiI|)1zҍ ytNk" PKPgIzN?qr HRJֹ1&ait 0H2(]vz[]eHOPݥx.!ҫ! e!Gs.ս+[ؑBZoIag4C+lOts]WeHaH399C^~nr *Rtz:x?OjaHOɐ^.[UPi7^|%&xxZ:SҹcV: TmaC~u0Rgo28u"W:Q+s Cz`hHagY5!IF+0Yj),-:b)c5? ̐^^b1D;C$)Ubf()PQғ0D0<]!2 cHO1}c 'D(C@zңJWx2ۊKor!ѕRbHzxRdH%S0L ~m:SuN7 Jb0DdcS1LcŮF8 i~gH2P͐.ϐ.ϐɐZ͐,CDq u_9W(Q=FHb. ab">S$S$abVck+E/*ңU"YG^!Q%].!=_ֈV} 7 _`ȟκhSn9dYe6VCsG71nsf;$a*[,C\c"8/q d &O/ C"r IzlB l!^ J [!Z CަXwM5K3# ! {{QE՗Me(|х.-)Cz u Q\HI8!OB F v " 8mhWqrkcrIΦ 7W̐W|dF21=!梉f&jч%<2 vtJ:>du$ ycZM$E _덫c̜$a 1ek11a(].3KxlCȈ͐_gHgC }2*Hq=Ҷ~bkcٌ (!qA0@J +NC7O!",^J126C$ *Z2$ `H*JkE/!( 2CZt" 2ϖ  r 颠J!L CoVa(t v$W'BHC1 aQ3;FrB˦.PJruS2DR0DPYJH"0D”rDNPc=Sy'Z_/Nb!Cf5OfdUǴvm+!0THbЮ)Vk۾>Zn??W/_ڛxN}C`3|{/(R&GۦN P(>+얭*cRCZVSZ +7CfUCӇr!٫kդa:R,S~ _`l0A50A 0AUPM2o|dUr0:.#чeҰ]c͙4>*.[l!ؿ[FedӰ&I& Fi}T\ +V,㗬_L 2i,dҰW3i}T\ +C9LBHxjIhS@& X& ˘aEcht q4gҰk2i}T\ +C!C  A/kkh-/}2!xH00d_ruH0)3d7֚ж!U͇CCsQC C ӰI1$  APU1y8 )Z 2ak%aȞ~&x[YCk )VD iHPyv0+<z&,Mb FC&!uja!>CJ0drFn-Ȑ#sWcȐx5# CwbR>['CFr hO-I$(SUC^+}b Qhc-5CCiR;`\jcOQCNsaE YEB|XD^a=L0IJDX:ⲣkGJ0ffcv7$a2}=+w\22Ð10dp ӟb* al-. T:2 E^!@< q0FK1_KĸBPa0$2a/ ņ̻*C`coZ 2j! ` (}78!A7+]\].p 1 14q5u|r>C8Ac1dė:o|t뇔2X0dd!  SdHǐ!#}F~Dd KU C#Dtb({LxgVCbCI:ӲFuf :S~VX6XX$CR D)1!ȐQQ0!#!ː ^]y~3'CԸlop8&ϐ{hDe3x8`B&EfKHFCЃ_-5\G-oMTÉ!D#!O CDk9J愗y 1h"gC~h}f;cXxmR c?B&㦄 6!2 of29ZHLXFHpSbb.^r $$0" a] a1i{ >G}ԏ""H"͐܇z}seCXJ`H.""ƒOR$bϘ uT7[!WoꛄV]\BH4$0n2$!M(.k)J&djuۻ}}kC2DP"UIcƾF2d,x„㚂3=p߈CLKBH>ef>M*(L?w2r~SDmIP`s!"fjaw$ˆ}ISoD͙b0>i1Ba=81TbpՌ %`0D+@ +&IU.}U2GK|H(C2f!Sc nwTz *J"bh?T} 0$yT̉r~=ѥe2! "%/n d+C4LD #WER&&C,C !RYB,VC.CL?eyTFKS2ȔO?: /]2 C%MYLqm1D*C`H^v]4#V` $ "1DW@wR,D Z\ۇqZ(` Ms;bLKV53jvc*oc}&E& d01]-ÊPFs_-w ϤȦaoMLF{?fҰoeR+KV9/ۆgRdӰYɤac& i2fX"ayDS3)2im Ȥac& 8h +CG^ؿL$<5>"LF{?fҰyf6c!!C򗵵E>{d $ TZJ:q$ k͏ohې*`J!H(!C!CTi$1 9 o" ZgHI!g8a$P"Ce0PTks4&e~C<["̫FR'XjRՎaIw`Jǐ)0jϰT!HQl1Ua`3/0'4% .TSY AP A`H%˃!\*? !0Ad;D_wۮ XN!{}"`dHs53Zg;d~)CPEr c9{}=>~c( T; o P A(Ņ T%"i '$ #hQL|y0M{~wbd,P A˝xo`x"a )0S" B -L|(CviC$!# |eC`MX*"5p AӅ!m}G1"(_A A'3ן_ys8 !q\y#o!#.n0=u?DwGرq[!_|DK <ꞝ>Ycǖ }un"SQx&K$ L} qik)vwow=iXtu,s4fE.vw/aR%׷K=^-W3wv߉癌}̙K}H[r=^]جNd>ʞ>Vr7 kiHq ^pmk4( <!$&TќC %C{߿$ ]ix y~)O!JP=S~XN 3d{RC Юo< ^$D[BrBC a<\;A9S`huCMژؖMvGr3̖G3jخd6rfKPkj׉3z4tfKP ɪŽ:=cl! )h"9,-¥T+Zåe 0A`!jMb !cKݟZhvulSزNCfU!0 'ál !Hb1tcn~X2zC.014w|F5~9sڲvb90x3W:0A` :l~9!`AUeFC ir3B9GcR95qcYV%eȷʐ`JʐU`X*SC$2[ aUoBa`*P~ *!0MW<~bL0AedX2~HC2C!<,q,ڌCy ?Đ:OK j!{j=nCPEr c9{}u?I0])\c(|0!XN&`HCP3xpwIZC' "hz1sb9]! A˝xo`xғ1P Vǐ![AӇ僃gHW`HCP-rE#D 麰z@/(ң+ *B^,`aU|"hrs;OҘ,Dq"Ju4GCd}I^.:+9 vD:Wy3Ow|'P=ݭ)=z 8ֵWW]:O?L[_RQP`kT|+2p))ӉI-r{":|nU}QMGM`}RAP<$H4]KCck[@I~(~7AP-Fs ^C}`3t5r"k!JSP? (1CL!rb9 P !9! 35W0!:G! $< ? P,C7뛬E!BrB)r76"3 ~(!┇k' h:Gs 5~C7s5 SC4A*0A`2A]L RA  A 0A5P9(ŵa:I6u& ! ! A` A` :! 4{ձ r9끮ܮڕ7OmW߬` EۅB{\/V`+o/noy}` 2Vcsх}w?sWso<1_}N7a]wg`:5ޫOzddj{n[^770{g&Cf>#WoMzgPdhb߭M{g[lt9nk\Q\0TKf~g7\ۧ[ <{Zu-wE!&k󩭹]9<N2afy|9_P p7jΪIo^}aiWپ CUЛr{~u7JW7m{XfI&ڇSp.VȲ`hiˁ! ! ! A` A` a%̍ DC -Zp;߽APr}5U MIENDB`Kst-2.0.8/docbook/kst/Formula-kst-convolution.png0000644000175000017500000000215412277111530021067 0ustar synthsynthPNG  IHDR7X3IDATh-@oD(T]]U5UWSA kP !$ ɊM †m'Z9p%3L站_(SsG_-Z,@=LW,@#`0. U oc}WvTU@%6WfR }ɠ<@K2|CEۏs,?IE@Yꏮ}c`S7k(rԴ[9ʟ(h>@ *P$%eߐ+n-2uEr{tЀ"u3)c-0RJå)C5P$SrDJJ.,3XK[(&%6Ay p Ld"e<tU@q)4!i׻y"2A`ADmĽQ ӥ# GN#ӯP$u ;(fgL; 0'ZQmn%ʩȚ-9@SD땋މR&^ߘv(9e7l&jk^޲LHCn-l&} =b$!ЊdrRѝ6=@1 7v4Y /S7qd_d{ukBWnSNdWPLʭ/&q4g/z=g׈ b)\lPV ۫,ź<-ԥʜ6>)# P?eE{C !1p *P+c\J5`I}IK_gyl)c-_!c$Ss^>ɐZ1rW&q# S6Z_Q ;Bi^̞xStR^3(A\8 t+(f F6#5ʶjӴG[W[]ngp\D3եkkxn-+{h1=vPY Kst"> ]> The &kst; Handbook Rick Chern
kst@kde.org
Philip Rodrigues
phil@kde.org
2004 The University of British Columbia 2005 The University of Toronto &FDLNotice; 2005-04-14 1.2.0 &kst; is a data plotting and manipulation program with powerful plugin support. KDE kdeextragear kdeextragear-2 Kst plotting plot
&intro-chapter; &tutorial; &commontasks-chapter; &data-chapter; &plotsandwindows-chapter; &saving-chapter; &eventmonitoring-chapter; &plugins-chapter; &miscfeatures-chapter; &license-chapter; &commandline-chapter; &creatingplugins-chapter; &additionalformats-chapter; &dcop-chapter; &debuglog-chapter; &install-chapter;
Kst-2.0.8/docbook/kst/Icon-kst-layoutmode.png0000644000175000017500000000043612277111530020156 0ustar synthsynthPNG  IHDR/8 pHYsnd tIME +IDAT8˭[ C$ҲyXt1!@'% $I)%= NQ32P=T ?pdTf)߲eVXi~ l35O\IݠARSbՂW 8k(×L+4CM (shOEj8GPm?v0=|<c\ ^IENDB`Kst-2.0.8/docbook/kst/Icon-kst-datamanager.png0000644000175000017500000000067212277111530020242 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME$;ħ'YIDAT8˭1n@)srB|44).\d 9@Jvx +}ɻ,}ibV~eki? 閼J;NAxs({Z]{8}|Bqp,eGtwh0pT&Da .ʼn&ˍpp#~;zrr3Mq}'umk8AmE&\ęΓ87*W{K  GirtA8?,qV̪MR=3A['cA0\E9TJEKHGCCC>>?8:=1!d  >ZK'1&oZ dMZ,9* 1&"řyl!ʻ%៟"~&ZIaBBZ%-eJ8Z-,X > +M]km"$LuV; V݁1ZkKaHD_B\?s`ZkqBVQ7tKb<-B:bF6@ňjWGA~C<2>.!?Ft AF[ _)8T[_iVǃ58cs҅NňzoQxsUrD,RaKP6ŗYN9BA$'a#f!q$7]9>mw,|#*U0%;i? Ϻ0GQ^[΅Lu+~ v*GsB鳠C ŀ>gυ!x͇XFJH-ЙP,ˆvs!%VCQ7CXFg+Ÿt.FsdP&KxHy9& yFFشa!vE;Pl`SBbBM S,4)!1]H 3sZ),px&j!X{@WHF'é̽8;'%p}oƀI( ˞8' G}uN a1^6NR'Ąx.,{`i\'EY#O|U,$wBVRBJ.)EJHJ(L9MAJHJ(L9)!1aJ,xm&.~-hN\O5hW)|e.\k3l!tp"\W0ַK# @d./H#$z|tv -IZ&"teZ燗!#?8GL8T唿jGE[grގm=Z(:lp(7 {33S) i5^#T3 ᴐRX1=&&VJJXcK̿͘iT0o9H8CS\TD z!"N/2 rHA =M)(?.QQ}F EBJ OPBJFV[ pthMK aMe/_@C3.2G QFx. ;DzLx%B;KEI҆R0BxI7]"'LJxLkOa18fPOol=E'%} a 1uiP?I/.v[+z383df(4>Dx6l4˻F[7 LFSSӁ& ~0ƇM6d{rF.4߄_ Ljl_jط l^\4/s.ݦ=`/pTO6%yV~^vRhOthY*:wVbj.vq2_oOΨ4`ŽʳKQXkR8_k,Of T w 7'Jz51FhJ'9r~eO-@ETnN+oȕkUVR7Sqyݠ4Dp@;D@M4&h)&4 MhBЄ&4 MhBMM4!`qBThBЄ&4 MhBЄ&4S@h"&4D@q5)%44i5ьEdơ-4#1I @32{%4#1G?C32 dUhF&&A324#Dנk45dЌLk d\ͤm: d,uhF&Zh:ރfd2V 4#A321hF&cA32#4#q~fd2fd2ZQֳ) d\dЌLdyhF&5MB32'hF&c~ft2RtءSЌL{tX¡^ctɘaivs*42D5: B4EMcMtnIe,Vk4xOژ,U;]9VOJң%x N3^17VPL3hv1zK1Sޒw+* N /6&gcrxmʔO+͹uoeɝl=Ir\LUs|M֌:43h7&l=5C5hf LS]s$WSlt.t&oƳzD׼+ת;+%nV˧7ɛ.E=xfM]] jˀPƕL&ޮrtF٫Ĵ>HBS yZmJIxK^l4ORgZ!5+w"e+gbg|O.jQ5g5͓`q&w{NurE%JdoL抅f茪\4cqfoɮRNswLU5vZ@ˌyR3V}Jި_Q3V^!Xsѵi9b)4ISs%?%g`>j52kk^ݜ޶|b꣖1i>]LXwO.ۄ&g(MIW5TZ*̶sdzqI5493/'2 ˄2ZTe^8]L mYOwMΌE74^UO4 kIv;O5c+jUNc4A< Nv:^˘4McjѣV['X+0L3+41S3`f0f341kb3aFfY6ƌU&fc}&f_Y$ }h]v;Mnӟ6a+O0(hbU~dlgP+6>K:V:_q=BuoUihK 43Ϛ 436b 43L)6[T3H4Zhi&hBIMzͮNOVP49 j۝f'ASM ` a `Tci?0hqHQM%bGX4;iUMivЪ@S1z@MVJL8 QSU- `M%ӝj*Tk*T9^k *T핸AoUMYUο &gM%̗MVJAjUD._UkvJӽUt& 4زZ/n 4ؤBܪ@S}MV SM%>:8MV!P\[hjGCiת@SP roU;Yi٪@Siժ@So*T] VJ,/VJ<©֪@SժlB5c~ &ypOZSF"W4ŠC:dIhF&cfd2VC3dNC3ltɸO?C32NS@3dyA3l_5hF&ch-cz\h-c\h-CͰe\uf2Rtl?;4CFE٠tHcЌLƁz _G h/2 _}kQx&3dӻЌLƚ43 a]fd2&7hF'^fd2m gH4>t.ДdK%~CS63SHT8Cϟwkt(C{M hΐh~P^" ]OZ Dx5ս 9ߢ 4t?~كeSgV !寧LlcS:Q)RIHHAqX:-HLR)W 1n_N:zPF3GȭM,KȿϘ返Ko~w{YG~n^ϯt\v;ͪFvWَ19VJڭ?iڠ?͝NiUr!0v6# <~p؂g,|-3Չs"w{:Y;  99J'&/f,#)P>K'&'f?-)P>]K'&f-_>J'&f-[>J'&f-Y>]J'&,Υ]kO%)M ;KQ>J C|:NgMgLo-/{/^[^Mi_:40L.Ӷt:h:`ay4]ʧ]״i:Oiit*6N?KP>K Qӡ|ZNkMkL-/}*~[^VMiU:406ӢtZhZ`kڔϋE`X^jMyt^мKiU>/vvX^zM^:40d MV:͚f`YBӪ|KIӄ4KhZOsll %4-˧th`峵t65f[|kNzQsxg.i+_?0n@3JMh"&D@M4t ӒZ-±4f ô4٫#4%%<>iC-KJ(K5> RR~Ҿ*h.)hΞ|^'S:<@*mߒyo,)!Y|HUs|>DP2<>!#잾 ӒJ̚'kRc\)jfPp)yI 2W}ܶD}]"7n۪T"; NU/Y+|cbLo你9M4Є&h", }dc4t_s[*pKCSaB>>1Ue'זi[Jd/[{sݑ,4SeQz9)jgB+78wjWf}L!L=Zj)X1ęvR7/uM)v0r~ZjX1'u}3R:kMSԗne q|KC(,hs룖69FCIN̻=4=,#gLڨe*c!j􆾙{{hzS{HS"=4=d'ɠڃX$fA3JMh"cQIENDB`Kst-2.0.8/docbook/kst/intro-chapter.docbook0000644000175000017500000001312312277111530017717 0ustar synthsynth Introduction What is &kst;? &kst; is a data plotting and viewing program. Some of the features include: Robust plotting of live "streaming" data. Powerful keyboard and mouse plot manipulation. Powerful plugins and extensions support. Large selection of built-in plotting and data manipulation functions, such as histograms, equations, and power spectra. Color mapping and contour mapping capabilities for three-dimensional data. Monitoring of events and notifications support. Built-in filtering and curve fitting capabilities. Convenient command-line interface. Powerful graphical user interface. Getting Started There are two main methods of quickly obtaining plots in &kst;. The &kst; command-line interface provides quick access to the main &kst; features, while the graphical data wizard enables intuitive fine tuning of plot and data settings. We first need a data file. Copy and paste this simple 40-line set of data into a text file, and save it as simpledata.dat: -20 100 -19 90.25 -18 81 -17 72.25 -16 64 -15 56.25 -14 49 -13 42.25 -12 36 -11 30.25 -10 25 -9 20.25 -8 16 -7 12.25 -6 9 -5 6.25 -4 4 -3 2.25 -2 1 -1 0.25 0 0 1 0.25 2 1 3 2.25 4 4 5 6.25 6 9 7 12.25 8 16 9 20.25 10 25 11 30.25 12 36 13 42.25 14 49 15 56.25 16 64 17 72.25 18 81 19 90.25 20 100 simpledata.dat is an example of an ASCII data file, one of the many file types &kst; is capable of reading. For further details on file types, see Supported File Formats. To produce a simple plot using the first column (or field) of this file an x vector, and the second column as a y vector, enter the following: kst -x 1 -y 2 simpledata.dat &kst; should start with the plot displayed: Simpledata plot Simpledata plot Numerous other command-line options are available—using the command-line only, plots of data can be printed directly to files, and simple data manipulation such as creation of power spectra can be performed as well. For a complete list of command-line options, see Command Line Usage and Examples. If &kst; is started without any command-line options, a QuickStart dialog is shown by default: The QuickStart dialog The QuickStart dialog The QuickStart dialog provides both a convenient facility for opening previously saved &kst; sessions and a shortcut to the data wizard. To open an existing &kst; session, either select a file from the Recent files list, or enter a path in the textbox underneath, and click Open File. Clicking the button to the right of the textbox displays a file browser dialog that can be used to graphically browse to a &kst; file. If this is your first time using &kst;, you most likely will not have any saved sessions. In this case, the data wizard can be used to quickly import data and produce plots. To start the data wizard, click the Data Wizard... button. The data wizard walks through specification of a data file, selection of fields, and selection of plot options. For detailed descriptions of the data wizard options and settings, refer to the Data Wizard section. If you do not want the QuickStart dialog to be displayed at startup, simply uncheck Show this dialog at startup at the bottom of the QuickStart dialog. The QuickStart dialog can also be toggled by selecting Configure Kst... from the Settings menu and clicking on Show QuickStart dialog on startup. Any plot displayed in &kst; can be manipulated. For example, dragging a rectangle anywhere within a plot will zoom in to that section of the plot. Holding Ctrl or Shift while dragging will zoom in on the x or y axis only, respectively, and tapping the arrow keys scrolls a plot. See Working with Plots and Window for more details on manipulating plots and plot layout, as well as the different mouse modes. Kst-2.0.8/docbook/kst/Widget-kst-defaultcolours.png0000644000175000017500000000022712277111530021360 0ustar synthsynthPNG  IHDR s; pHYs  ~tIMESbKGD̿(IDATchg@r@?: F?P&TIENDB`Kst-2.0.8/docbook/kst/tutorial.docbook0000644000175000017500000010151012277111530017001 0ustar synthsynth Barth Netterfield
kst@kde.org
Rick Chern
kst@kde.org
2004 The University of British Columbia
The &kst; Tutorial Welcome Welcome to &kst;! In a few minutes, you will be on your way to exploring the rich features of this plotting and data manipulation package. Here are just some of the tasks you can accomplish using &kst;: Quickly plot multiple graphs using only the command-line. Analyze data using an extensive set of tools including histograms, power spectra, and custom equations. Effortlessly zoom in and out of interesting areas of plots using either the mouse or keyboard Monitor live streaming data using &kst;'s real-time plotting capabilities. This tutorial covers the basics of installing, running, and working with &kst;. It is based on the &kst; Quick Tour by Barth Netterfield. You are invited to further investigate any features at any time. All features are documented in the rest of this Handbook. Starting &kst; from the Command-line A common use of &kst; is to quickly produce plots of data from the command-line. This method of producing plots requires almost no knowledge of &kst;'s graphical user interface, yet produces immediate, useful results. This tutorial uses a demo package of data files which are installed with &kst; in $KDEDIR/share/apps/kst/tutorial, where $KDEDIR is the location in which &kde; is installed on your system (you can find this using the command kde-config --prefix). If you have a version of &kst; older than 1.1.0, you can find the tutorial data online at http://omega.astro.utoronto.ca/kst/tutorial/kst_tutorialdata.tgz. Download and untar the package, and change to the resulting directory: tar -zxvf kst_tutorialdata.tgz cd kst_tutorialdata To obtain an overview of all available &kst; command-line options, type: kst --help A syntax description and list of commands similar to the following will be displayed: Usage: kst [Qt-options] [KDE-options] [options] [Files] Kst: a data viewing program. Generic options: --help Show help about options --help-qt Show Qt specific options --help-kde Show KDE specific options --help-all Show all options --author Show author information -v, --version Show version information --license Show license information -- End of options Options: -F <dataFile> Specify data file: used to override a kst file default [|] -y <Y> Field for Y axis (multiple allowed) --ye <equation> Equation for Y axis (multiple allowed) -e <E> Field for Y errors (multiple allowed) -x <X> Field or range for X axis [INDEX] --xe <X> X vector for equations x0:x1:n [INDEX] -p <Y> Field for power spectrum (multiple allowed) -h <Y> Field for histogram (multiple allowed) -r <f> Sample rate for power spectrum [60.0] --ru <U> Units for psd sample rate [Hz] --yu <U> Units for y vectors [V] -l <P> Length of FFTs is 2^P [10] -f <F0> First frame to read [-2] -n <NS> Number of frames to read [-2] -s <NS> Number of frames to skip each read [-1] -a Apply boxcar filter before skipping frames -m <NC> Separate plots arranged in <NC> columns -d Display as points rather than curves -g Provide a legend box --print <file> Print to file and exit [<none>] --png <file> Save as a png file and exit [<none>] Arguments: Files Data files (if -y given) or *.kst file &kst; specific options are listed under the Options: section. Where appropriate, default values are indicated with square brackets at the end of the option descriptions—these values will be used for any unspecified options. We will first take a look at the ASCII file gyrodata.dat, included in the demo package. ASCII files are one of the many file types &kst; is capable of reading. In ASCII files, data is arranged in columns, with each column corresponding to a field, and the column numbers (beginning with 1 from left to right) corresponding to field names. This particular ASCII file contains 3 columns, and thus has field names 1, 2, and 3. To produce a plot of the first column, simply type: kst -y 1 gyrodata.dat All the data in the first column will be plotted: Note that no field was specified for the X axis of the plot, so &kst; used the default INDEX vector, as expected. The INDEX vector is a special vector in &kst; that contains integers from 0 to N-1, where N is the number of data values in the corresponding Y axis vector. Close &kst; by selecting Quit from the File menu, or by typing CtrlQ. gyrodata.dat contains 20000 frames, so you may wish to only look at a portion of the data. To only plot 10000 frames starting from frame 7000, type: kst -y 1 -f 7000 -n 10000 gyrodata.dat One of &kst;'s strengths is its ability to plot real-time data. Imagine that new data was being continually added to the end of gyrodata.dat. In such a scenario, it would be useful to only plot the most recent portion of the data. To plot only the last 10000 frames of gyrodata.dat, enter the following: kst -y 1 -n 10000 gyrodata.dat If gyrodata.dat was being updated, the plot would continuously scroll to display only the last 10000 frames. Instead of directly reading an input file, &kst; can use ASCII data from stdin as a data source. To specify stdin as an input, simply enter stdin as one of the filenames. There are many uses of this capability, such as using &kst; as part of a sequence of pipes: cat gyrodata.dat | awk '{print $1 + 2}' | kst -y 1 stdin The above command uses awk to add 2 to column one of gyrodata.dat before piping the result to &kst;. Note that the description of the option states that multiple instances of the option are allowed. This allows quick plotting of more than one curve, or even more than one plot. To plot all three fields in gyrodata.dat in separate plots, enter the following: kst -y 1 -y 2 -y 3 -m 1 gyrodata.dat The option specifies that separate plots should be used instead of one single plot, as shown below: A Quick Tour of the Data Wizard While using &kst; from the command-line is fast and convenient, there may be situations in which it is easier to import data from the graphical user interface—for example, if you already have &kst; open with other data loaded. Or, you may simply prefer using the graphical user interface. Becoming familiar with both methods of importing data will allow you to make more efficient use of &kst;. The Data Wizard provides a quick and easy way of creating vectors, curves, and plots in &kst; from data files. To launch the wizard, select Data Wizard... from the Data menu or click the button on the toolbar. You will be prompted to select a data source. Browse to the gyrodata.dat file used in the command-line examples and click Next. The following window will be displayed: Data Wizard Screen 2 Data Wizard Screen 2 The fields available in gyrodata.dat are listed to the left. You may filter the list of highlighted fields by entering a string to match (wildcards such as * are supported) into the text box above the list. Check the boxes for the 1, 2 and 3 fields. The Data Range section is used to specify the range of data to read from the selected vectors in the input file. The following discussion assumes knowledge of frames. In brief, a frame is simply a number of data samples, and each data file is composed of a number of frames. For a detailed description of this concept, see . Start, Count from end, Range, and Read to end Using these four settings, the lower and upper boundaries of the data range can be set. As an example, select Count from end and enter 10,000 for Range to read only the last 10,000 frames. If gyrodata.dat was being updated in real-time, subsequent additions to the end of the file would be read. Read 1 sample per N frames and Boxcar filter first In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per N frames (where N is the value entered) is not selected, all samples in the selected range will be read. Alternatively, frames in the data file can be skipped by selecting Read 1 sample per N frames For now, deselect Read 1 sample per N frames. Power Spectrum and X axis settings can be specified within the Plot Types section. XY, Power Spectrum, and XY and Power Spectrum Select XY and Power Spectrum to produce plots of both the data itself and its power spectrum. For more information on the options available for power spectra, see . X Axis Vector The vector to be used as the independent vector for the plots. You may select a field from your data file, or the INDEX vector. Since gyrodata.dat does not contain an X axis vector, leave the selection as INDEX. The FFT Options subsection in the Plot Types section is available only if a power spectrum is to be plotted. This tutorial will not deal with the details of power spectra, so use the default settings for this subsection. Once you are satisfied with all the settings, click Next to advance to the next window. Data Wizard Screen 3 Data Wizard Screen 3 From here, you can change general plotting settings. Most of the settings are self-explanatory. Select 1 new plot per curve for Curve Placement and In new window for Plot Placement. This will place all six plots (three curves and three power spectra) in the same window. Once you are satisfied with all the settings, click Finish and the plots will be generated: The Generated Plots The Generated Plots Generating these plots took a bit of effort, so we should save the current &kst; session (it will be used in the next section of this tutorial). Select Save As... from the File menu, and save the session as mykstsession.kst: Saving a KST session Saving a KST session Saving a &kst; session saves all the plots, data objects (you will learn about these later), and layouts that exist at the time of saving. Once the file has been saved, you can exit &kst;. The Basics of Plot Manipulation Now that you are comfortable with creating plots in &kst;, we can explore some of the plot manipulation features available through the &kst; graphical user interface. Start &kst; from the command-line with the mykstsession.kst file you saved earlier: kst mykstsession.kst All the plots you created earlier should now be loaded in &kst;. Examine the plot with the y axis label of PSD [V/Hz^{1/2}]. To take a closer look at the plot, right click on it and select the Maximize menu item, as shown below: Maximizing a plot Maximizing a plot The plot is now maximized within the current window. Note that the high x end of this plot is almost completely flat, so it would be useful to view only the area of the plot that looks interesting. To do so, make sure you are in XY Mouse Zoom mode (select XY Mouse Zoom from the Plots menu, or click the toolbar button). Then, simply drag a rectangle around the interesting-looking area. Note that the coordinates of the mouse cursor are displayed in the lower right corner of the &kst; window (if they are not, ensure that Show Statusbar is checked in the Settings menu). The plot axes will change to zoom in on the selected area of the plot. You may notice that there is a peak at the left end of the power spectrum that extends beyond the new upper y axis limit. Suppose that you wish to view the top of this peak. Right-click on the plot and select Up from the Scroll submenu. The plot should scroll upwards. Of course, it is most likely easier to use the shortcut key associated with the menu item; this is true for most of the zooming and scrolling functions. In this case, the shortcut key is Up Arrow, so the quickest way to scroll upwards would be to hold down the Up Arrow key. To return to maximum zoom at any time, right-click on the plot and select Zoom Maximum from the Zoom submenu (or type M, the shortcut key associated with Zoom Maximum). Restore the size of the power spectrum plot by right-clicking the plot and unchecking Maximize. Now look at the plots with y axes labeled Column 2 and Column 3. These are plots of the pitch gyro and roll gyro, respectively, from the 1998 BOOMERANG flight. Since these two plots are related, it can be useful to zoom and scroll them simultaneously. Click on the squares located at the top right corners of the two plots. They should turn dark in color to indicate that the two plots are now tied together: Tied Zoom Tied Zoom Before we try zooming in, we should delete all plots other than the two we are working with. Select Layout Mode from the Plots menu or click the toolbar button. For each plot other than the two we want to keep, right-click on the plot and select Delete. Then, right-click anywhere inside the current window and select Cleanup Layout. Now the two plots should share maximal space inside the window. Return to XY Mouse Zoom mode when you are done. Now try zooming in on any portion of the upper plot. You will find that the lower plot will become blank. This is because the lower plot axes have changed to match the upper plot axes, and there is no data in that particular region of the lower plot. Type M while the mouse cursor is over either plot to return to maximum zoom on both plots. Now hold down Ctrl (this is equivalent to selecting X Mouse Zoom Mode from the Plots menu or clicking the toolbar button). The mouse cursor will change shape as visual feedback. While keeping Ctrl held down, drag a rectangle in the upper plot. Note that the height of the dotted rectangle is restricted so that only the x axis will be zoomed. Now both plots will display data when zoomed in, as the y axis for either plot was not changed. You can quickly tie or untie all the plots in the window by selecting Tied Zoom from the Plots menu or by clicking the toolbar button. When you are finished experimenting with the zooming features, you can close &kst;. There is no need to save the plots this time (unless you wish to). A Brief Overview of Data Objects There is more to &kst; than simple plotting and viewing of data. From the data wizard, you have already seen that &kst; has the ability to create power spectra of data. In fact, &kst; is also capable of creating other data objects such as histograms, equations, and plugins. A utility called the Data Manager can help you keep track of all the data objects you create. Start &kst; with the file demo.kst, included in the demo package: kst demo.kst Kst with demo.kst Kst with demo.kst This &kst; session contains vectors and other data objects created from data in gyrodata.dat. The top plot contains the azimuth data, the middle plot contains the pitch data in blue, and the bottom plot shows the power spectrum of the pitch data in blue. Let us first examine the plots more closely. Tie the top two plots together using the techniques you learned in the previous section. Then hold down Ctrl to enter X Mouse Zoom mode. Now zoom in on a small region of the top plot (say from 50000 to 53000), to cause both tied plots to zoom. You will notice that the blue pitch curve is negatively correlated with the red azimuth curve. This is because the pitch gyro was slightly rotated relative to the azimuth axis (by -0.69 degrees). The true pitch p' is: where p is the original pitch, is the rotation of the pitch gyro relative to the azimuth axis, and a is the azimuth gyro. p' is plotted as the black curve in the middle plot. The power spectrum of p' is the black curve in the bottom plot. Now let us take a look at how the three plots were created. To display the Data Manager, select Data Manager... from the Data menu, or click the toolbar button: The Data Manager The Data Manager The Data Manager contains the definitive list of data objects in the current &kst; session. It also allows you edit or create new data objects. As you can see, there are six curves (each created from a pair of vectors), one equation, two power spectra, and four data vectors listed. Right-click on C2-GY_PITCH and select W1-P1 from the Remove From Plot submenu. This removes the curve from plot P1 in window W1. Also remove C-PSD2-V3-GY_PITCH from plot P3 in window W1 using the same procedure. Now only the corrected curves should be displayed in the plots: Corrected Curves Only Corrected Curves Only To see how the corrected pitch gyro was created, highlight C4-cleaned_pitch and click the Edit button. The Edit Equation dialog should be displayed: Edit Equation Edit Equation Note that the equation used to calculate p' was entered in the Equation text box (an approximation of 1 was used for cos(-0.69)). Feel free to experiment with the settings in this dialog. Click OK (to save any changes made) or Cancel when you are done. Note that all data objects have a number listed under the # Used column. This number indicates the number of times the data object is either used by other data objects or by plots. Since we removed a curve and a power spectrum, at least two data objects should have 0 listed under this column. Click Purge to permanently remove all unused data objects. Click Close to close the Data Manager. You can exit &kst; now if you wish. A Look at Plugins and Events We end our journey through &kst; by looking at two specific data types—plugins and event monitors. A plugin is a flexible data object whose behavior depends entirely on the specific plugin file selected. The plugin file can be one that is included with the standard &kst; distribution, or it can be a third-party plugin file. You can find instructions on how to write and compile custom plugin files in .. Plugins allow &kst; to perform arbitrary operations on a set of data, as the only requirements for a plugin file are that they receive a set of input vectors and scalars, and output a set of vectors and scalars. As an example, we will try fitting a simple line to a small set of data points. Start &kst; with a plot of the first field of the maxima.dat data file included in the demo package: kst -y 1 -d maxima.dat The option specifies that only points should be plotted, not lines. The plot of data points should now be displayed: Plot of Data Points Plot of Data Points Now, open the Data Manager. Click Plugin... in the New section to create a new plugin object. Under Plugin Selection, select the Fit linear plugin. This particular plugin requires two input vectors—one containing the x values and one containing the y values of the data points to be fitted. Select INDEX for Input Vector - X Array, and 1 for Input Vector - Y Array. Then, click OK. You will notice that the new plugin object has created slave vectors to store its outputs. Click on Curve... to create a new curve from the output vectors. Select V1-INDEX for X axis vector and P1-kstfit_linear_unweighted-Y Fitted for Y axis vector. We want to place the curve on top of the data points in the existing plot, so under Curve Placement, select Place in existing plot and deselect Place in new plot. Finally, click OK to create the curve. Close the data manager to view the fitted line: Fitted Line Fitted Line A procedure similar to the one you have just followed will allow you to create and plot the outputs of any type of plugin object. However, there is a shortcut for creating fit plugins. Right-clicking on a plot will display the context menu, which contains a Fit... submenu. Selecting a curve from the submenu will bring up the Fit Function dialog with the x and y vectors preselected. After the fit plugin is selected, a click of the OK button will create the plugin object, create the curve from the plugin outputs, and place the curve on the existing plot. Let us now take a look at events. Event objects usually monitor other vectors or scalars and perform specified actions when certain conditions involving those vectors or scalars are true. Click Event Monitor... in the New section of the Data Manager to create a new event: Event Monitor Event Monitor Suppose that the pitch gyro data was being updated in real time, and that we wanted to be notified whenever the corrected pitch gyro falls outside the range [-0.60, -0.40]. To set up the event in this manner, enter the following in the Expression textbox: [C4-cleaned_pitch-sv]>(-0.40) | [C4-cleaned_pitch-sv]<(-0.60) Note that anything entered as an expression must be a boolean expression. This particular expression will evaluate to true whenever either of the inequalities is true. Select both Log as and Notify, and enter in your email address to the right of the Notify checkbox. Click OK, and the event will be created. Now select Debug Kst... from the Help menu. Click the Log tab to view the debug log. If the event was set up correctly, you should see warnings indicating the x values for which the event was triggered. Check that the values roughly match those you would expect from looking at the plot: Debug Log Debug Log If the pitch gyro data was being updated in real-time, the event monitor would be triggered for any new data when appropriate as well. Once you are done, you can close &kst;. Conclusion This concludes the &kst; tutorial. Hopefully you have gained enough knowledge to become comfortable with &kst;. Keep in mind that this tutorial does not cover all the functionality of &kst;—there is still much to explore and experiment with. The rest of this Handbook is an in-depth guide to concepts ranging from window layout fundamentals to creation of custom plugins and data source readers. You are encouraged to use &kst; in interesting and innovative ways—you will most likely find that it not only meets, but exceeds your needs and requirements.
Kst-2.0.8/docbook/kst/Formula-kst-polynomialfitequation.png0000644000175000017500000000147712277111530023153 0ustar synthsynthPNG  IHDR#@%IDATh/@řKnM fE:E0UĊDUUm%@  $4d ¿8vK?фG rU&EHq8Qǩc"zI{SGwUb͚$Νk70j>&Dw?YFO((j<,e(ow*;X'לRe'CXp1=S<[X<9x,r142Ig(&^#+eϹ澊Ibb*{f| B9 #kz Cz@@T*h@njxE|M\68 uW,|o[ x^#l؛xB&gRB)T}xaÜ s"CPxkx s2i}ȞJ$[J@[ p#z s2'YXvS7ZNBW/&:- ÔD-G8}N4`(:"h Elc&5yzqԹg|,?vS`&-YDl=).yEM'? G=#>ٱgDS4**TmUe[u9 !Qk[|q{f?\tOz^P2wPi4}mK ՉZC9j(G̚Bt]F]5~/>A>5jʙOk2,''@0 >>LDB[и驄FU 64郧O{}*[{GN}0yLvOs23?]!S9=ão'ѴЪ*&ЊZC "s+J,ҥSv?c1+2#%|sOx}˶c|~fwϔ>}bw 3xS+G}¾?} <!?|}6aQO'ѧ~&c񷏟k *v},^7-.Y|C68N)45ШV5Ϋb_H_XԮ #֩'_G-{OoɿGϟ31{Ov91 w} O K#ܓ,+[3x3xD䁿Ů^obm,suJPrCr/.v^'֩DzsW#F_>/zĽxv~-}gepK5O&g_춹BB"Poˑ4o\X٭Sd1=b5Gݽ/N<xԃ̽OY_q_N|XHX)'zxҝŽB> RhMF%T]S@THߴ=u꾢l|=$ݿ?rܓOY|POO=` <'d|`Ķo}zZ vqO3B933[ۢ{]\|3Niћ7*i *#=m:ɦ/iћS4H_h :wr1@(G:뤭Sy:Lc,CѨ.iX^אHC/BDHH4DHH4DHN 7nġ+А^VIĭ u(ʬ8!%~Yl-i!K*RgI ;bRMU/M۰֠UUn>]1oH+6tHVNЭ ҫ/l3i՛;o(Xi~\(C|&~sy+eچjyd謄 d AZeu2 v$) oZڥ+l8WV rjFScTӹ-SD9_Ny.yi{^ʣT[ sfj[CZZ;ʋ7}1_Y&B@5{s C~l^vZķcb+I?__i҂R\%98EHH4DHi&i&| }DzY/ICikЯ"aARFC#]\zK.]pA_[^}CiQYc|3֜ٲ\?8#0rAWGVH9P 'B$,wG[<#u1L T"-;mقϮ] 0!DlY0gаOo+DHs\-Y_Te7e}̍ٹãڳLEYg 2_~ͲIIh窅_JD-G @@cO?YHHmoN![)o ׃Y+3ۊe4)g7ҟ]O>߮{Xi؎H[rFey#3id \ Jt ٳ6GIW>BF'ΝxAaq*Ѥ膃\^M1-g)w+ ˗/_XR{^Jg㢜helBDjM`^8!RLVZrL)JkxFz#}oȻ}r+*?>{K0lq<j1 H t:Y3\so* 1V]uDZSSg<|J*|~_2HG?J*&9I4˂]} i+"f{G,f*FuD-ϰ]z; 䄴Z /xF`w[.G =c7!-Ą'͎H냟;9Y.0$j\EX Ns.MO_yЊeeҗԁgѸ D3okʡs"gN󈚊4]4 *3]D H{.KSOcbݓm4_xbɗ&_cב1}}ˉixKre+gɘsviv)+Ktj*ӗր>{V+LHu++_iHG&L}Ȉ|mN-^uL4X}:#b[h:" {?eD1x/],Z}.F{^x4\:ew9ӌh[#]4l'&^?Sʹ1#|imH^fݐ[$f_ hr}3;Ӛ~ƨ`2YoߚJRAee{y/^SSёޖ}wލ҈-򝨣μ?m{OHio 9SNn vt<3v,fA6 Hs?i?hBŶ*f=}i~xϪOcX+HŤF4nB{GY'#b7~ytxܿmHsw9;[ՈJ+L[oE*?H`b?ؚ u!2fL,V[`6UAbV+m@Vzccw~C~x<3ɡ:q|`(&CTxaYak$t=}iD,:+Sw=uG;-$7w.V$ya~#oj[/^9YVjL߽}im]Zio~V+Ooc9RүUL[$Q5ܮjۖɉHDW[7ۥxRm}kYm i  d_;oY.KFo'&=?/-$kVY e `o(ovVJg ]!#|/~Q7#D2S9k{ȗHkn,ƒК Qntgͬi W Fݐ[e[J$':ҜϸDHcɛj,Jc8oZ/3ꞱVڳKk@G-e],(ױz̍v.9N-Hc.SdjcccŎtRztxxHɍ0p)dTܹ/w_OhdJXW0BᵭEFǛ,]Pi}sb_uTN}Yjr9;&}<o+Ѻ,3ŗf5O+bY69]ZNIl4ў<7&K,߾H$USo}}O# `ү_l[ofzz*</S_VZN(δJO\g'&r,۴r. yCLpњWmC7G^˧^GJ7XiHo]_V扫}_Wc!mI+>:غRa_<2N@3EzٝRӊ44H|ii4iiP"9j$ЋL'i!M"$!M"$!M"I$BD"I$BD"I4DHH4DHH4&i&i&$!M" _Ii \4it&$!M"$!M"$BD"I$BD"I!qJC Yr%;;%\)%^:.#RB5yuMɛOHҤm-&y̗IQlė_qc1y?.*Tt޲&书T"BL)ojHҷ625#w!mA:_ms)ޟ8FaYǒ4>+7gؗ*(IԸF)#wp u鵜-l < *)3S{$,(QW\|p| .0Ǣ$*DL;v(}~}zHaTb{@'*f3JVU?Gێ4ֺtJR~ZiL\^AZOIm$_*U+;UN ^.5:T,,H0M+Y͝_ìiS)"t\+KQؘO.%q\i>)bE%N Fm 0V&+[O#([Yri慈,%6Fe` e9s=X!8f*}*aMV*L^"LOH~IBZ:tX׎ ;iGzX(#q1dN$\˩aF+=-Xx7qegfpIN0׃}]YBeI.+%R-wFItT>/&R%bC:ScHo.3]5!=Aysr)wNwv_zCb%sq_Im( q}I[Ϭ?} o4)d;|s8F iH";F۟fq0!xl JiG/0!exAbQK8.*}\:ʯi%䴤TMpiL9/&Ҭ*7wfyfפZ❆$pWLHq%x*]i^ۢ77* `^g!Bwyu%0?KRfu1~1NkZ"dԆQRLEsH#4d٭Z5_^vTL,҄?>,-/eoLUm<jӓؐ?gJ9Vf{3PKi)iZ<]<!ҡU "ݣCToG!!M:!H+~?OA!_gPdկ׃{6ȦC"֜AK˲iR`5&:+~/=qC뺁4!VV͛8].MT^ a$45eK`/f{k& 5]$]K i_Y*^H7EuECpqݘ/Xu1XC=%ߣ ϟ/!t=1 ɢ5>>kÉRPrBEtv4c"^65H&\M`z!ZQ j:?ؑFW"Ѷ~?n6yb&n7.x"m_G;?9\tR6U#MvV\3w.q'Sp9B)Xi\7H7GzHHwi}n #ңa4tttiCZ65͈" Ҿ„4 җaBCm%!="HE3]ElF5 2ݹ/=&݆)rv<EâBC+RxLo6a1:H!lF/q N(#c!$n[1}?dV@vߺH7{4 3#|8myK#̗-E9LHnn=mm;HCvޣgO"G-->Í4]E€t,"M!'ÉJHi hTK[NB/npt`_[ i=ͮ ki {x i?A z?HcÊt@IH`HFH7zti!88ҁ@ HCGHwFVi#֞!È4#tFIH{"IǼLHEB4!=ZHi@ yo Ҿ4~@ .oC{]A.^=KwFv?#H7t3HCgHN"ik!=5/-&, #sְvn bƊ46 #|fǰ!-  ":tф!ݛΥ {\B: H 7Ev!E9jHdrH2`\"mlΑnMtWv)TȐvTKPv #]Ãt҄tn 5u# AZ~x80H!MHwp# ɳp# +-ҝ!4iA)^! Coȗ`-;i8YHCoZ _Z8% \B4BHt:ۍ4t?MBdmW[ٺ$+k 0-obce6֦;l|q5BH㺊tΦskznV b%o˹l+K9,\a!T QA:~Wua@ÆRqBlh }͙le5ύ]yT.3^mp‘^.Ce`IO,BHQhRF^Y1 ixlJ.ja.ngX$2'`%Ƿݑj&KBH_,Tu_B<[kưGG:_7<i%# _Y&z LDHwi@驴ӑ>]auWe83lѐJjH$%3K0#9/TpN!W]ZqBifjv |+b^$`?<&Dbe\(VaT n) Z'ǝ3Fޠ'4&i&i&tDH4DHH44u\ILg}wQrΒ4H#bϔ*oG+E*bϬb06Di/=bmH{e>ҙkFsV[: ^Y_랄tHn!=`x GR aЁj/jrVq?`g/ђ8w\>KFj x_ؔIZa>8SŌВW`YT]$ i }:^m H>.E`|Uv0ŷO]3`OHo޺y\Ԓn@#]Ԏ 1XF$JZbqy'n1YNL%N 4Fa+Ť}ZD5yL!݈.2ꡑD^N+ņPL-|"‡ND^h{ݳ$+=v9U4!>ʎEd+HdSF4U F9ULY}i!k5[8FVgbj1>$2މ%owϒt"f93қLW]DC:ښi!k599 Hkg֒8-zAxڢ뎇{F|y^Q(oK,\6672[4Ο퓹+*C_e\RS {yޞDFZNm ʄ WXj[H[mYNX0WN7l)1_^3H_Y,hUUeK$6RSUr(4 YkIHEo%wllOjx:Z܎-K BGKtH#tyu B :BHO4bЄ0T)iBz(Z5 Ţ42tH ݝΥ4G;4!=-4,҄WiΔ@HCyj̑5;LMX4)IJR=TgJFވBzvmIn!-)SKfX LelWLhθP3Bj7aK8lz_ K>^hoFi26^6x4GYvo4Ɍ@V$PK #)t26!-v?E_5z=A!_N-Hπsi[}bE4ԽѸ*r5:A4a[fv=OiqFb6  KG{QF(`_?9cT uѲ:z0yCNZLG쀎cH S\t4oH8'|09v-Vnx:cƵF>:BژPHt TJK1V'|U];:Fo 9IyY5f#t,aŒtοRg`o:tO_vi]:ۥzlvTn ͮԋyZP+rXR'|Ijkwk6F6z='I4DHH4DHH4#B"I$BD"IA }|Nb:`h{Cs|T'|=^Q-R~oZ+DAzc1y?H{e>ҙkEasV[: ^ٷ_"랄tZ71N\5H$ 20QW\mB*,\LU;Z ۇyiHm=ג rP4iC :XxQZ,g0 4B Oǫ 0!G%Q,5 vkq [7Z HpKゑQ!葽L1\A[V+~TY\b:./,-1q3[(#T^@cTfIYLڧET40ҍKOR.X=4WȫCJp'+|H䅖g;[H[˩ M,WvLb\A 3rQjHo0ͩbɗWSjdxFV Y6&^4- cϸwBLReHC!UAaum~@z`EDZImi!{599 Hkgݳג9-zAxڢ뎇wQFz#^/7%Q.[_-HYIρՕTSc2 {E K[<LFZNm ʄW Yk[H[mْNߕZpt3E̗׌F<3ת} 'lrD=YAa8bMkɜHEo%wl젅Ojx:Z܎-[WQ63RZ<GO]HtHOJtHxX>:A'E4$R?K5eQD||lUgCԉ]Si5`J]S_nԅmB: mK H:}i(gj#BkCFAiVBkFkbܗ6^ eX=A$ac?3x)& ݇_@[YO})δz>"MT%nC})㟲,Մt iugΠH([)CՄt7Z<!BmHFKzH[ZҔo}7C5>6؝K#0V+289z>JH`@uZw5p4v?=Cm?VlK@ګ> #m\@oxơAڟfGF!NZi p4ѩyy%ZvD?N=98nijв C c%и-! @=F&hq40VZ/m@3r+Pg_cWƶt{}P m4PkT69BmH.H^@/mZDGWCZoҾ|}d^P[F!)qNjFh dV޶>TԑF]MrDZy#fԆ_YՈgll5ZAܐF"&?4AQh'G I(b'Z09W{\ֶZO7BLwH+rpFWiui <'^ OD8%& /`o5EdoH W a@P:mv ]z ԹTkY$ mT˜z耴4Y~/L0-.qSҷ.҄ҖAlCEh6 c살pɀC kA/M:~X+֯m}|>'G脴a {m :vc 踇W+ӝm N  ҝ#&|&ha M94lYH<麹 mH +|1hCc0bc!m@bhGܐHHAZN=c*4Fw]A# 'iaic1KvDgZ[!TuP5ic!!HOaHC8v;qq0b''in#-2p@4}icI| yiPiaMic!!4x! -*{s hCu!!K y! VӪt1mޔNDm\/%4<G@w4F=clϐBd4# NHI;H{7!MiGi4t44 L~˓Hc,D Hc(6AFZ&z4 1H;yg H3Sϐ&`;a-v,G]f,'/?mNNH~@<iɞPl6Oi06X;ĥ\ H 悴8z(~K B#HP쟂8:J;  *ՒtϑVHC -#!Z`<%Wr @-!=@胿6eH isj_

/)>gMQ|O kB]3ztFl9.+{r Q=ԦBU@c==Bvrލ,5#GgĖcO8<ҁ hUӗч,5#GgĖcO8+ hǣYkF@Έ-ޟ|qy79Uч,5#GgĖcO8>ҾTjz{<δ٫3b˱'Ȓ6WMԿ,WȱwYٳ}^Sf+M"N4$ 4vIItSU;tH #I\yʂdy)!=H4!@:;%.W*<ʐ?%0k\UNuyU 7"f`A%G"4W"Wː@優HqϬ Rj*6;u2ū0tP 0XqؑjIm/̰c)-TB: HdKLp G:˨ϢHؑǕ|҉:[fWTQEx@HM(HIit瀎)!a\(Z_J~OΠjŅJ^r@~M:toѧV>jk>Bz^_Tצ 7xM" ,HHC/QiEHi&i+H%9"N~EH!BHiBDHҤ#x)DHҤe,#Ck&ie ܺd|5><\)4M~x#}ʘHUfWG!MҘ[M;nBVn6ݐnt4s{rzj~kRW+Z-lҤn!}:Zf%yu'W]/GR6KF7c61]1VUOV/&_FYftx&u43(Ս*ƣ;h6J ;Z*Ib#__ssXn3ZːAꚕfʫ!UZ*[l8'䗑k!M"\Bf@z; rCZK+#-Y5,ҋ,j+ߨRMocj B-]NDSk7:j`u 5Y5~6^eQsRn&u8t4QFJbLMVoG< ҤN<G i!OҤQBz-%I#xD iRHo'y"}-IagZzY3MzL`¯-Y䈐@Nr4ieDshuwIVDF4D~0r\5IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-zoomin.png0000644000175000017500000003161012277111530022375 0ustar synthsynthPNG  IHDR PLTEw88SSDD42$"tz XC:@@>E(;e);f*=g-=i-An0Es1Gy6Jz5M5M.Q k] N h@ 0 m  ! #$$(((,,,///00111145467=9:>;;:>=6AA?BBFDDEEEFGGHIIIJJJNPNPYPQTQRSRSSSSSQnZ;a-b[MXXXXXXZ[[\[[\\[[][\`\]_]```eeeiiilllqsptyycq\lWlOdMaG\CVWUkl?x&a䧜ZSm1صM --Z.\nbx_bo^[liR\)RJY,6)QUbX1)s E+X a]1$GXPT|=?ݲ=Z+ckۈd֊zz$51ߍ&)?yoY!@;Uh۷ѾP(OA6\#ta =}?M0QZYjڵVKrωm ի^hDѸ\qĿм02W#t}|btBG8?`{4AQ'toVzq-Z^+( JzF!Kgڷ5p"h:2[Q#4ۮ}4q;ߐ3ۂ02d }ƫ(kCM q$7!h`GnGo;q ➑n;|ud6 Ց;m?}۶Hovqo VZl帶mO[u #CIF7k4ruh׺tB(l- O'-ҿmys\/\H4)~"C k $J֯oˍT*`M{"L%>z%q;l =ޅ^78oAJKmqveJo{'V^gT AL~pV ÊIFUIFy׊#Eu[.C30=}{ //nN7uo\čb#Uo9o ߻Rz}C+1+`JJ]⳿'A3EjIFiyvm4! -}+PMĹ `wM[9?aN^qqI[y%o`üĹTfsFVV*DVlL|Bnr`?_N]o/W(e ahtᚄ_zl/C刡PWWa(QE153e a-7Mc>tXk?G(b$Zn~#5 }`.ckv3jie aMA0$D Sb@FFhp_㉲#n"5)G<M9!=8>0cώ$Uɿ4mj\ 4ݸc Hŭ32kʺa?{j=+~%-)I@ZuFKO͏M_fg4y쁝`+gk4ۺ~Ks@&9\jn5 Ǒ-2H5[zΰ5]LrS`Y.h+YZn#سSZiѸѹ$A!yIh]2v*n&-RVSRޭZH6o߰H. gVDV5[Kg(^L*7-(kȨ\Qk+p~hwFuc4+H`kNJˋڍz[_Tk [isg0ϒ}:Mw*j#˚qlE/hwz2BiaYFOWe=_'% -(s$vE[],}*}tFO-'u0p6V\4ޣְy4.tJ3Zŗ,\&.ު+y}Nkuk˻ԃmgGaZ!,9_Z>CǺLa]}IQ^jaWhGs&1ڑ&0j֮kE}fl]%h7"MKnOJa/juR 5Akֶﻣ=͙u-'e3{l%jkY-(_ *>gdhO\I=EF-J:|IO],Ynb4gpɒse}wl#k ŧ3iP1s=K=^Lr-({aWݕKhk6yݵZ2:ʐ"קT 4ZeЊ}QR#9t91oQO=e+>۫{Nil)_k_R=h~\ܾqG F5$fk -rT+tCQܷZjs˖fPQ']\m玗&e󗋵򢡓,\#SҥuI6NF_|fYE϶v{dM=h3:*oܑQ͓t% 3Tz\µ|NQܗAh25 wM`CO8o`ƪuS_A5f~1${Mvш^lًb})̂h`4h`40F7[Xyx۬C69' bt_`4IG@bhbMmE)I)E Q[9IٳPt42iqΓ?~FO Fsoao2S\jxIm0iΕ/&7|mtR:K ~.`@N嘔Vjt}T"}hR TIȢeڌT&!̈́V LnBt!|E&dTN:'npvXἙRہVs%Ǐ?13]BChY,/yO3 5D]z dҹcrP }T7$`8B_h7?/R;Ԋ TgT4V2*םB3 5Zۃ^E7/6Es}3 *3 VσFJJZ,Y\gǖ2O?>;d>ӈĕR ^ ,v5W*{KnjW5;8堭eTscnMV6jGzb4ov~jݼqцo`8idq\ ]1ZG[>W_.W(5)c迵ˆ*\Κy&m}+;3k֬%~btC?^aƌ~3 S?x؊6FVV.v5u֫i*ׂ.F>S#-iV'F$`e`{?w3UZ2Zb/1d Y$cꞚunBFkh+ո2I<ƭUvyTᒸQeff3h-zf3q=VēӤVtFskLiօdh6*RlvuVUtLksyu23Z>@Fnr;>-TiHhMNΙѺ<?kܲV?}c>7-)3/تVz߁E v3g.n1od8 ܊b%kO3/J*5FYYڬĸ'ϵg^4v;gd6yyyJtLi5vas>;rngZ,&efYgy7xOg=8kL wě>ą̙33!酡+Y{+̈́҅J?1ujZgi+ȕ-i}c>SnsԪBQ9a|۰FhC8F SZ_UZKfZc*n.[4fnd4?/S2ZG>Es\(_.3_rF=zP`tO}O=Zi0iTnOF)qkC 31Kl3*d, h*+M0\[||}4QHL hUkQ1Ĺ^an4S|Z}*E{)m:xMD-gף=য়>gF|ϕ ?hӌ 홞w|x¶f s!ߧOOŜ-w߻rRiWgѵ~R_,\xHnE5V̙3;*g܁+[C6& Wr<Љs`Y!1 sC1+}aTZ:*{ǹuFg*l4Zt(/6=bt!Y~|Iz1ڕЌЋы]1zl.c-)}_ NY^ZiŖ/^JM Amф˽u1F*iH1|OIX:L:$hѥi}F/ b|&i?:z, }W4Fgx:"ҿ1?<|gDUictNkulYq(1ml*υbh *5^n/HqXW4 zuotm kC3ZqC2zSKϕuYX)3,X F]k |St<<|3Xs3/ܔEV\MSS>8tlh&+E+`F6B ,F=k7ݵ6Gyy_őoQ4c:H&`H]̳i EY %i T:1+TD 'jxŐuÄuJpkkE*w\S %/kYeYb׬%naB1ZG2t9С24Wr_YRۤ5{(;vjFÞUU,qm?sznyΜί1x"'|.^,>ђϾiYJGj JcfeSrlO.{qy /6fN§Nod((4.UrimFBwTbW|4@"yɅ6^ayjtqdʞY8FG>2h4jg_\Y>13l_ihC?i7 l'F8<_R|:rJ+tmzT?ꟶd&s|MztrkٯNzf|8!v,Vl1;,1٧q \諜cF/U({'i $8OcYyOw1:\.W|qWi>gSڤNcgaR梡}ϡvoo{eW5zgSccsgk fqKE}b%ʾ+/+ic}qrh2 ,0mss ewN&]n!H+T7M8D '|^6+=>}f;}+kbtqįвѼq> 0dYx%qqO~n*Wt5zS:ח>Lۿ9o߅yf16@8VPzhvK>!v;q-~h#žsѪ՛l4gShvؒxbJ>]7[|WݕO*,Uϼ[Y7\5ڸ@莏1Z6Zl\N3سhRfs|_aFh:k+ ƫjogZpܹl`WbS+}V|eّy`8{7i̇™&Ff^2{&`1٣g;CK*Ռ J̻[*R 6 b7*( -^_nZ7ZsTJ}=Ay{mم?]tb2Zk9"YV&DpqY{z> wA-^l3>G11Z@XIeϩ4߄OU9ҟHS5ϰ( SGh;څȒ}5gk^yҖTA Z- 0F:0UN~r3\= Od2;4y.R`a M0i aF.Vspa'DTrVGFhb?FFX4:jyb|#:/`4h`40h `40 0F FFha4h"hK:z) qE+0 F F0h(`01ZN9`4h`40ܷF,hq=0HN%PڎX0+a4LDl^hG0h`4tgF # "=`40h `40 `40F F=F;aq@Fha4h`40h `41o4h `40 0F @_\vyeVvjtIXqv)2I FMm4KiC61j ҫYgY/hF(!Ɯtk71jt"swNFVm{ ,3IZikڨwM0AuPZS^\fӆa4Q,t&.e슬GX5:`0h`40h `40 0Fh|; FFhha40hbh{"30h`40 `40 0F  ƽw :; FFhJM`hFh[FLBmFh5ZFx2 ƽw :p!x F"qg4F hBb4!u`d`4Q<2$!0DK#Yu0ĆѾ7wjEwF{a4YFS[饴1Rv;K#C2HHw&9 Au(!ޥN,΃ & -{m{K,T7'S# \i`b*h߭Zikڨwi$mKE1ul]Z2VZBiMe'~j4.`ĥ,XehFlF f@0DqցϰˣCFh7ZF y4!ѡG{@uo b& A40DhFh/F% >bt߸ `40h `40-;:r F؏J ?F2hhC1߶ hh<  zctm;aCYQktmhWy4Qn4 @ *F#u " β|^C@GYh>hn42+PAs%qhFa4YGS[饴1RI=1G{  %g1;"ttzs)1kt"swQBUٽw͎0q] Vښ6][B͍%c,,T(Ebh6 ]/J,/hFlF @:HBhFP`4nCoF  t f4Sցςxˣ=279< +@ `40 G2:Զa4h`40ėT+E1{h|ƽw :Oh|* ĕiF @ݤ F`dh  J"$<* N@0Dw&0O; *w$4Ah `40F 'r4v4nDF0F 0F }kF @; &sshu `4b4ш1hі /SftAsU30]R2V\YjІ!hFKicaF1j ҫ[jLі/Seҩ]ca3CnܣY(m{B:h0)}FFִQ*>K(̈ :JKJK()/ٳGFf4b4lG~b4U `4 F `4b4ш1h}m4;hA#wYb4@ b4шF#F b4F#F `4b4@ށhF#F j- ލ1)3hp F01Ľ1DV{ u F0"F6ڂ h$Fl4b4F}ӳ1ĿhMF[ @| h˄ƧA02ш kh1D$d- ){dI-ՓmAїusSR- Z-oe H3mF[Amcц /jҭlDA;Zٲw`e"'G EGSl85ZQGG6 ~F[<i &Ļhc蒒R?F[B4Wpo:Bq<Ռ)},ڇ[i]x(uң]m,fWLɕEŻ?1|69{oѢ;}[WtN@:Gn TE蚱B[k)ͣ'0FKicWOAo7;*gt39hp>22Nl; IxhCPH(gty֥{h͵p4BD$#pR3E䌜)0Zs0ܪ!#rR8Ȝ(g4nV{h͵p?1OF舜htNV-2g$v3dowFS`a$"ctDNJ~{I Xk"4IEiNsFS`t$IGi;4v3];짟-4'%vgsa?#Qg#~h#spyV^K;I6ɴF~RkᰟQ(gyVe!/`4hq~0:}!M|eW!̐g5uxLa7EW(F8ӚiF64txLat绔GPZ|Y9;*B/e)2`4hXF F0i4ؾ({51:RL FǢ_ `40FߏFDˆ"56,{eT& hnkɕtkFrlfFǴk^yUQ5u|}qƲSEyke)^r]cNsuz3*k~+Z‘_Y~F7 ڊ3`tm/bV(O"F\ooVc*(owu;սvBA>y<](:5đhNIguKSSO B3oR gS{&c4yf9IS~1 FǤy읷%AubY"uLEAV&umK#,=+ق-/鲵 RʦuEy+p~Sm.I&atOyfUt*#ز{`t,EwNb,wb#OG#fm΂kF\wt nrIp$}#\^h AF&WlUU\8 '&xȅIdG,n~jam94"'O1W]#?q52yHYWyGKN-*#ȿv5homڵD\lb0I1N*6-\RsIݯ]׾2I$''z(6ɲAF&uQܠ{)u'ӗ9˓Q v%]U}2S7 zN8zmRyt˲Y?{R7{i FitwRvEf\4IY6$ ]|/f糅W% ̙ n%UeL~]Yϻf֥I '7f]YUwZR5ёa~j6(^I+{+z}͜.CJ-*j`J25F ˖f i|$)rէfԉEFǨkTW[v YuQF F+V4*{).M+c*oisšjFG`.`tݳ`7^6N/,ch/NG F7`t<=SjUTgjt)GqϾ$hb=Zjv֊L{@RU 9j@h=B@c&.7e q`4P1[Z4; @#mJQP2IENDB`Kst-2.0.8/docbook/kst/tutorial/Symbol-kst-theta.png0000644000175000017500000000037312277111530021321 0ustar synthsynthPNG  IHDR >֢0 pHYs  ~tIME3"bKGD̿IDATc_kgb?'"=3 U`:fsL_ 4r C2Sȹ سA,aG\dbq[ dx*96W$p~$I~{4IENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-tiedzoom.png0000644000175000017500000000043012277111530021463 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME"'ݟ\IDAT8˵ !DLˡ4ڠ #Ő8@oKef' 9c; 3ևṣ9gL@hlZgLp_*J<):KϦV̦dokx䈼cVE^U"B1yYۊ#')D֔IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-tutorial-gyro1.png0000644000175000017500000003215412277111530023770 0ustar synthsynthPNG  IHDR ?PLTE  ᡵۣ٢٠ٛ՗ՕՔՓՑԑԐӏЎώюыi[_끝Ά˄ɁȀÀ~}|{zywtrqonpo~l~igddb~`{_z^y^y\w\wXuWtWsXsZr[oXlTjRkPlPnPnOmLkHiHhGgGgFeEeEdDdCeAeBdB`@^>[=Y??BCCEEEJJKOOOQQQRSRSSSZSNvVCZWVXXX[[[\\\]]]bbbknkyvuј0učݺԮ\MtRNS>ţ1IDATx pչ'pU ݛA  ` $,/I IQ7I0!UrzrsUumr!PEZdY6xAyaRXGF:u*{N{!SO飙ߜg4 1Wɠ5b>[ P ?%>7oy/b^ʨ)i :`éc'NM6܇@c@b]׵ss#-d2:24<<2N=HLNߧ{=Sw;Zznim6-4=(Yɼo7tKX6]jiyɒVK5ٴ\OW+9-Z˵K^jJMN56 yN7#=?kvHPH۶HE%/?~l!E:+R 't*ҳG0o=-< _,7,Wѫ]Erܛh9r.N]|>&*a&a_/yoNɤ2Q?9U̢o*@*aSR3լ?Femggv%kj-])I ѹ]飫?& 3˪w?|ߊhuM'L' ML_R]bz>i e9==\{/U&'bZ]tu-I*i,K:Nd ih2jj(FC1IjL WܯNt"*͢?eʢ\2>\u a!K&/>9&|a96;y{4GԘiJ5?~OfN^vYC$CEYD`2MDOȤ}h[ˢ' Lf?9L=x|qr k͝'|xКOS1=I~fwM\}ov zქ==|Pf]s2M)^yvmmqmQLz*t''cU2::2ךϒsr1wэ!=ӥI2N.Y["^sl}7&~"`6}SO7t~~Kʞ|”-7+izBNtjt+K"yNV{bŽ{ݠi4۵]Ƶ\u[PZ;1Em[ӓ.zH=~.Iݭ;G~ 'It{]#nKtƻ^:M]wZP6]jS*)-7^IϲiKWzZj^:Ԝuw6(uQY]se\kO1ҧFGEvTlr:ͷ\N>LLHʾ#{\-j[SW7ЯѯN͞wyM>>,m:淞GN^s_2e9mZVN+t%-+i6/-3+rsZJ2=}COb-=9;VHcQWڥhTjy|oHOZ*~:a~ٹ|nԬ3WeJnӓߖ9y >_EQҊՔ琏W"ÏzVV%-7YMN\rsZJ2sKt%}_TW[Aد+ƵULz.^?˖լbٺeWy暚u˖)_XvOYwjm]t+D7_᚟-5Oҥ!&}^㳁Z)ٹ؆sy |>2Q^6lC =65X$I_B *bi (iH# @4H#!񱀍8p*!!W[s'\!t={Hi~K&lPo8LڡǑ[5Zc[i/7=4iTAւ+iUJZFYvp_C; r|+iHִa@^3"鱡 6hGN ~ò5HWiuN7D`YC¶^q)ԧ*֍$Elmⶃ[gƎJHv0Mle߲4(Z:jښ[ aiCi} .tcT:А4G:K4$ I!)ڨ|.7=ڭ0,u1u,;W Iitpr5r-h2>ӡ*a@oݑF@OGcBӸak'Ԏkk>X:W<#+W\"166RB纐XEtre.0O]z̡ }Ҙ oЙ,'iiF4H# @x }(0Ƨ^">0Ƴ"x%PI'p/!r F'9 vY8i;wjF۞jc$ҭkg.t$6I7Z; Ywlt"k0.YIjAN'LCu!#htQ‘#)[6JB=IPbjo߭=:A.iǒ[#8mfdӠ?TN:$?!(4Nnq&5?hqÏ7E-hg8#vTi9p ?{#?ۖ4VEi% zN=qJOJ|gh3z>v-}^x)'}_>b"&izd2I I[Ma4P&cxFS-ԲLKHr#mĵ14}1|KHRҵY&҆#g b"mܓ\Umy6Ҳ,yݦM0 M{CF睭>5991FgyfQ.d"z}-R'iڤ~5dg<{ZHGM3lh m~WˋԸXXdt,FAD_n$8&?ѡe Ͳ L\#Mf#gjc:+ic{ظ޵v^ZKk;3ثEc(l$}znF}L:ƄfZ 4/i>\kieNӪcӴHZ葭=z:5V^&;h/勾E"d;Qxm߾?~ǣ7m}֢E-+1ew%j/:w'U\ē-;tw2ikm`3F8ɦ:RX[xBD&i"O~HKǪ0S6jQO=`>2zЭJlڵVz__/YANkW1}R}y֗~!%=V):K# z7m Tm Нbꋔi,}q:KŴaVLGII,i7rfi?5N 3 L,-lfpfi)H:KY :OǪ?ެ,][k)3wAM뫝iLIH&&ȗO~r87of0izTxȍj zYx7HjNzf&7ZFGZ'_5ZΒKh\u=1Uǚ cgW_ Guu~_^>CS߳vMfbHoo^xto쥦_xYcW#"G\x(ܧׯNfgifZk?TOƧ#H Ӵ *ұ)X;3_ǧc|qxwcsm3FZHX}|hژM:M4,HD>=N{zbo6$dzzH:tb| $\wܔYIΝ>-#$I>F?K<^ ^_5L҄.5[<Ζ-}YZ17ܧN굴mhigשu~z3Oe,]ʴH r2ɖN jl+L4 DXsKoS`2֗Z6+#O>Em+<=G.ҞkNEd$/{m[YlN̥ҳ33УϙH۸i߾tzd(JHI2A!دx(;zʛ%w+}ɤ_nt%2uuҲwxGgiz6ɯ-h{5̝德a궽;o"ڻ[7K hE맟~]1S/*hsިOYڼevitKrf`g"\xȯ)'y-;5O;#zJ\OʫVS+>XCfH-?&#ALF3J:7_ ==|W_+1'BFҴt~5-ffN`zmp1~ZFc>69Tm#i'mDڭ=&1 hܹN<!iMƌN<ηIji&=ٳC/w%~o|Ey6,b?=g(-w7N}N^%csֆP pgݢdz :* 5}g9L~:F(U1ͼF^Ua;k%+ \*i(3iJcF~4{4t&_Z:uDKBTBmrI2mwdS⭶ 9#isNRB~~5?=H{t]H IAVn3NH6\xlo®u{jajWt)E۠o PKJxsoxɦ_j:)sH:]gi8;hzF'{ %C-}hc9酞؝r8F.ژcp%j,yEXK#OTK#0K#I;BH#ʒtp? Ƌ"'o1p+#trH#AzHA@iDEV҈J!BZ{H#PK44Z@-@-/{ZG@QA}/!4\kdClS@iDsmT +<0҈r-soGNEzdsfFm-=&6O&:2U3H#ʶk w΅{&@Qܞ}sH#*MnI6 AQ4^=DTZ- ҈ AQa4H#PK#C- ҈#-~iD HcEyD< iF @iH# @4H#@iF @H# @4F @Xxo#ef(iDeH#@i!dAǤDIUGI W"eE9J"h'mΣw=]]Go$W&Gz9" )y_iJ")ɶd,ZR'"dIJ"W<[dg8mښS:5-y{N:1kZ[`3pwȝt/Ȟp(Bv-Ĵ ҞWlE8L|_O-Ke6Iۗ]HZXIJ>0r<~kg̢iO)5qzBڸ$Ң+iѩb {q>OZsG_YTb>%m_ԥXiz\y[n]4HΤQZt!-U/i1߃y/O=]M幞 ;XRNKq>iWm-#-EZ,>i@W%-z!-$EZNZXeb8;U.\y?,iY r!-X΃葴i1Ҝ㜙i ?#S1T=Ϥ!-XJҖ!ĝ'iOҢ0[tH @Z,/i1HI;NxQ-$7IbAE~EEsgi1b9 SҢG"o 5&M@[SH{eғ%"Mr&m,| >ink*iхtҤ~Xi1ŒpsAs,KDڲHiby7w"-Viq&"H4H4H[bn"H4H4H>ii bŒ@1K致ҕ@ %-4HH ]EiiiiIOZܿ蟴E -SAځPѤE,]\"H4H/^"H_a  NhOK%A՘*X~E.X -V2iA iLZ%-q%-XgnaHtH. ~I* GZ,Qq,#bI ҁ'-4Hҥ#-Vi4HtH ŢKNZii.SbH1 E#MDr"-:/4H -t@H+i@s.k|U iף b,]J&1isdH =E.KAz^HPA A$-i^줉 ?imW٤.ip YABH?eI:AzH' N:A"mxT1HY+i#AAAt]b H/(i~A@Zi, ]\ Ң׮ʒtn׋4A+i/c_A:)iv# =,%0wOb= %'꺘'D#!t:Gf;iO &,-4HHc^(qZK{0Kt@Hǎ'i˕tE\i 4H4H4HYWt. ]8i+O ҂ C4Hiw% \߀4H,sKAzAI;H4Hw ]y\+5tٓ|lA1K4Hs-Eҕ@ڶ ALz^  ;=iы;AHH.,Y9&6HnAH:x fi頒.`msQA:i, Zu%͹@KOz^{4 훴O@ ]YQ4H)i&`QzLJW@ ji E'cxAAAAꡖ@:/Ҧ.  +IAb#5+4QmX0xAA}RDIiV |?Hii$Hte K9Ht%c_lҹH=&H< E4^ޤA*tj{hIAu2'oiixAt. ]s ]i˪% Ht~fAI ҥ%҈YAA2Ii@zI ҁ$3H%i@AAA:ot~ H4H4H4iB &MHH{XҒ@zѓ&E<&"#uk4i\ ҥ'H4i^T H4H4Ht IA:AA H/*$("YzIHtAI~AJ04Ht!|&K4HWib%M@|Hv M@AAAAˁ4{AA4H4H4Ht. Iib&"Mʉt(Ht& Dfߤ“&&E%M@:ͥ#=k?HtzH?{z(4H/0iI$iH"-/iĹ1MrQ(C iIsd&B/i4\ɘ&W^RlHʛII;IRp}A<&v}i\IHW9RDD&M~oAs'^H(/$(IHEi=&bGH.iJ'Mn,4ɅTIH4>yƯwT>I9&9HH+4v, r%o8G'˃YE& Hx%MYHMgU|1܍M PvCAtVLLڜbӃCq@&IP4@[#4)6ijVڞ]H[ R3)gYYPKHYD4!n9x9+SM돴˃$@" %EB MZ p$FN:{\t^j1n7Kq%iB}c;iE|> e:qfO1OYi>w>HF?SւzdΤr0rwϾI/[&PKA] HWR&9D;4[4^͸9Ԋe1A{tژί]Z.f z%U@!YXXPO%|4NW1S 9AisܛM~=qoF E!@<@I{D0tv*hO 082Vg4t~ %JytMLg}CNƜ?d93,)P:4J!7hs[sdvk I'VFgI"`F)۵?tS`girA%4oM}Csߊkx0ki2֬ΒE7 R ܷ+;w蝡,)(KvQC Ʈq]QaF @J _ e޾nB#u@LI_Qv$Ffqt&-]Gqt>zJ!^eo_HN6 ]I_BzEw %=ݦҽ*Tn.Wd|cGxZzo0nF |B <,i (iH# @4QoW"^Bb%=_ ^o5- iF4H# kiC ȋZjY/!Vfn۷u'͎Ж ȓ7ܰ~͞]cz }Hii|"M}te[__M-Qx48^iIhлU7jkmH#EhbH6С]CouHƨt!)36GtT.n[x{DƤx8H# %͂N\f"R!H0qJ$qiLHTK { ݲ72ҙh4x} /_ZHZ/C,=TP-jջUiRm ("tartQc/ŨSZƤڴ["IzHHhii8%%Fzvu)='ܚPUMoMcM AQ#l6R]۶۫:jɨݪkl=c (<ķ%FT $҃Q UxH (}ГcBx4-Dic<; UQL_h9DžEF#m"2\F3ڵ khF3`-~@>l-fdrIENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-datamanager.png0000644000175000017500000003426712277111530023341 0ustar synthsynthPNG  IHDR&PLTEzZhѢٜהՏӎ˂|~xspd^y^t^lUlRkNmGgEeDcDcLZO\LZI\A[>U7M1Gy-An)=h9Hjtttkkkccc]]]]]]\\\ZZZTTTRRROOOIIIEEE@@@999111(((!!! 5 tRNSOb5cIDATxOX8 ^,ͪBwRѨRGvj5j5۟}a)"J) VIНe݁ >>v쐄[ر/r?Pa .Qf~JпM[Y"5zꜚ|yf3[@u+Bstr[[J? ?}󠻓!o^.hHDZD/WD{ !{Sr!\tSpX%:"pȫ/ӈ&]={LCR QC!JyJt8 w~Wѫ$9F4h45t\ѵ< S_Eu(UCw~{h~o/$N{.X_E&7_]&H/wKGW?}|ul믁SW~ݼy.0P%w [/'q4[}Ӏ.z6W_^YQ_EI+uytynﯡ+箽\E?`~.DߤH3^2Cd[o߾}?.x:[(!9ɥHߞt S޽zRsivKZ[9ɝ&H#Af5KX~ HiiҀ4ii1  7* ԈHn>֩w$@|6cY :5',J#Ž_?iWDRWhRqol6Z;ŽT9wWHuj>fYؽ2<}#ʐv"'7.d afRQAi~K DOs$]r=^;!IiN=8Twn1tky k!Vj(l[֒iGN:Q)b2H`ɝAZs'` e&:UI9Q]f{&HO':8`v̖Kx4/= =&F̰ިX!OQ;&>9i^:g-"K?:Rf1׏&Er[EG(ijM#{$džRwy#4+&ެFӑ>H|ϐ&KbB4񜴱-ܑuo=MMmE*{L"Z냆td'~[n$ghx{p)H6U߆/d5HlECZ u@;QeΌK:}@܆#O]ZMBZ냆]S;Gks$ǖi7RMK-ٍ#?~4!}4~c.NvϜ'l8roJ*s܊I5kACtd[D@%[Ol+4ymkhTbS0sd6(4r'ro^:_?G/d@BKnĝtZ1zK,J )dߴ>N?#˕֤}]|HMGB\c,hTbSufyit>z#՗bϯ[i~0{鱘ѩ+xڲmI&S#M/}Єv_ZDQZ+edwr 59_Y`~c3OfSvyDo)ŏu/5)D %^m,M3:GڇWrXyu^GҠ:G5ف44xiЉE44n"0gcClכP1fj$S+mjfKEAlzwt#Z"ݴQ-Smބ653֥ZJPr wYZ^)20Ϧƺtm3WQTK .hz"ݼQ-m%_J~Ղ.f-M㥍Q-%F`ˤUፚQ-P #nlZ-#0Z.vH9{ H[Ւ?j&ʟ֦^:GTKiTۧ#u3%ZjjR@UG(cSlZ-⥍ZJh .;>@J^U2eI² wHBIk=6j)1[ <<@Jޛ0&E0Tkn1i\㡅Oh9+3&>@JnbK6AӑթFb͠%n BY,/'Jh9CT&ˣZ 9Q-Fܪ[Fzf Ƴl篇b=x ]#/y-xPH [><<j(6G&3ge 4Mm;{fGeH?H&zRi҂?,ᔰ=cH {2u,VKix^ԜHZ/rN3 T^Yݬxےv16{G&i'?=ėv)Hg Nq]5"H{ՎhJJ7 OrZŚ|-vHQIvx?"u@SXc#ҧzDQ9iJEڋpє(5V%6sz{$wגi}G%%AgD{O+Ik癷h Cw{IP *yK& yIh QQψn’7([gLս蒞H2SrhJ>'/ MliIHx&/]q\QP E"0҃A%SMb |->o@::Pej lґ>>}AGU=aw;\rٚTC-!$ϖkɅ!d;pMU'G.n;t523fcquzzP7S֧4ĥaH%K9G7H*~Km2K<MyHIx.qoI--ג iCtK vȣ%J^|$ϖVkaH{#;*%َ[;WL ̱1[5, *iaÉ-I!ߍFKk\@V[ {UFtEHhDXI-גKk;*%iqaϢ+Gn^ƛyCj1S)z,;n_[hЀpkPr&b0Yp ߫Pu,] D4!vb$X%'lG%%qe:ܹ֝EԦHgޗ%ؗTřqb }Io@'eP2,MI$ na{%fF NKDSXHPJɐ$kɍ(_ٴtdH;Y?űC(3%7U ?qL$6'\<A4xiPC# @͆qL/ q.5бDBK tlFn-A#ԣ~0$)ڕĹh}("9*p/P[*O} 92''ۦ iFSOqIn?m{ 6EP#W>t%F.&6 ]TUVBj{q4tUv4TDq$϶m`"5 Orr-釺%0B74EP#Ww_pd4›4EF9~cB=,gtCG/2'c'(kLĒT/MtZTO?b H82G=o=;|giJl4Eڡgǰ܎|ʐv>s'h|Or ]ȦjLĒT/'itY9>$ ǹQ-JJ~.,;3luc36$|"M#5TInM"H}a]X4͈J\YJ|>v#=x$]y-q)"Xr%^\ZX|w:HG2GD`|]x޽4)b%LK Bя` ׮46 !5c_UW,TŜZZ˿2ϰ`v}Z|6M,6hy?Xⷵ?[X[_] % "[XmjkDzvm#ۿ.3ͯ 1Bk3Kgi^.>'RgVWWuاۋ_擜=gS#k$?TKUjDc)uY$bR<;]k^l,^Ofie _:׵qacoW]Q|W W c&ϵmt?ӚHm-^_/~3m>ɳmnf5IFZ$q=cVt ~An,;Sإ~Oi狜SSi0vBZON|Ƌɍų]kk_/lN:Vӫw~ zllu}Em pVNNvU<ۂ` X" m/V$7yl^ 4Q-K={uXű5@zDagq^dcF6 ֫Jv}zRWⵍS?)\]@] 3V}Yb#Mg6nWt`i yE׺:䠣MkaPҚ4NtqL)1#$]z.ɲtmՓ=K] mcDƺZI=[zj iuR5 +ٳmYdK16)2ϴvhAa,mM`bY<סB]H3/q}-ZƑuquzLWMA:' h'o(PMim Z)W_V[7(/ _5rϮ])(n@m,z3tRX|kc}rmc_ۋ1m5KـwtU4m@O_S+ImJW ɨy_{gee١ǘE\?<05dgT?[)J׹Lmϔ^kcmmjSH rs!0(]M#mSa[iК ]6(UZ8A ]?/]3-t>/ : PZuA@/ GץͪqȨuTFUVȝ1 z/iZQe63Qީ4#jGOɧ)۴ff2IϺw1]+D,-C鰽$bI!m2g% '143ymvO d~.=sŕXZ폧w Or,;R聰:#Ց]نFhMM;FiFЅh-Af"v&'QҎ<%i]͢&w\ːt Pkr-& ;xA=q ;Z'=!1 OB,Ylif/V]MѢv˘_KBβ˫K&,~SH[4i9zj6t<9 f]̑EM“1#J階ב+nI o$N|)Z~NZj4lcRfbӢ֠H=bY#}-iKk6dLhx/FO4HiKӌ`]Ae8m.j&59e%wђ!#JiYp+?*4ɱ.ϗuPK:UiXRfbjTElXuEO^KڒM6Sr =3 ;q#Mӌt"n6t$l,,KQ\\+eHIbS<$Ǧ{s-::U iRfbj6T{L.,Eґ'$/ҽ3&Km,1{~%bX:bLNg]“jZ8Odoz&mh CZŘFO,Yltf/= MѢvIR&Qd"i&/icJ9\fn#)HI$}YXrIZ?.<ɾmw!BZŘFO,Yltf/Vhaq#ZIYFY<^a%!KiFh:Jky!SK+`Ih6,,H,RzIPΫP OR'=!1_Rdfёfk,E vOBDgY^eiyiɊ֮N 4/z=鬭{iH%`R30iC,S] ^X5\`R30KdҭX ؝t%\29^dFz?zE;&<"HGzx~#GKi6P'H;Ol*,ir SOKK P*RYIP&kU4Tw[d^Zɟ#؎k1oTKmiCmgHA2 ]0xIj)ryQ@ShY^IJ%_ˀtZD0EC{?@vWS $%*j$hy+~=9'j8w9o ψ"SIH[2֪E PbA# 8HhdÚDD4|T zv=F_^Ӊ-6:yv.ATKGM$p*2FDrQ-QbrFBrDkk.K Z'G'$/ sA4xi ^XZK05TKzi=d7ޣO)O[~ 879j)\NZ42bBzwt#'Ιsʑ\-kT1ˉjZcժW4\-=@T ¶m1{K^ҐZLj? D`Yŏiӆ6QeHCj1;E (Ւ(n34jZ?%'(6e, Z cGިH?KM?iQ-G~jɍ4 %q@U!W jK! \-Af#]—@ji/ *'U)W(/"yKɹ<Bǀ稿ѽsd֟gu[A5EYڬGx )W4!ҤYǃ^(VWHrXͻeȴ^tHlU;O Oā$PgjG}4=ݎ t=xi1"-˲?fDa?uM~KY q_l#l0 KPE> fiF=1!ьq= )zlԑvhKןNN,K%?Ǯ?;{R{^؈4ϴU6ZTXdfhQ-s;2Q-"[IEO°v ٱV{j-CZj1~jr&g}-jD4O' Cd7mujޭL[i*b(2.*^bQFjbͯEnAb(ra4C( 7LC\-Z*ApR-Ίji1~j>OiKsT?jKO$e~ji .^;Ӑ8WK}lŽHTKd,mmTKƏj1"Q-Ϗ&S>cZD42,dx GĿAHJOuO*/mmTK,2Q-~ B !3jxj<@" Ҁ4A4Hi@H @ilHWiUHcK @Ҁ4i Hi@H:iPS!4)晶q@THL[YiP"d"H+TH,'<MҠCfґ~BJE:wa@PHL[:Ϗz4焎r3 Hd^ 2=!(4ΐ }ҠGz\QJm;GF3gҠ@ZKŞ^I3gҠ:F:u ,HKH iH?g<@M4ǖ@4 A @HҠC2j ix#i@H @A4 i Hj4j6w4*% Hi@H@4A4 i |o;hZ}4.:] I*WrޜH t.M^-s>wC=*E|,='SvYx9t$h FxJ-t0:Hi,-de%zx,0!> Pݍw{%fөsB:[6.AuLC3^mtOr_T0BiB@TgH?H&eanH3=;>l֐]i s'A3N=:h{H H= Q):aD:(ϥ/̕d itƺixi@H@4A4 iP퐆Z&C^j.e @Ҁ4i Hi@H @A' 2 :* 2  A4 i Hi@Hi@H @Ҁ4ҍ.յ2:ېHM_9Z<4&ioEJ=iAt igzH4nxYCډ @45iynDK+D4.Ҹ!nHi ^/ cG4ă;p_Ҁ4 LH瑫mںzG:$;n8P=/ 1J A @A @A'ZA<Ƥjak; FBE\f[wtZi@i@i@i@:Khx%@15%V%\B+njt2Zn"M_;{VQqtuHsc露?2 UW5|X>QaP'~Kv~>O;=W&!͌m*[:@)ܭiGJvT_vw}.&x"v!%-*o\J\$8#EZ36I'3+!pw];)HsvcVHLTFGeHܺsd$d,oJً)F`I1G*0JAH#͍ T ٟ"-t:/vL2u fEZ9*/=GuUFcgX(`eYKGO_PQ ]>ҺU]3wDOHۜ_N}vωԹ>[XZfRݦ Ҍ>yM  !ttĽ@GG"!!L^8р:Nj;!J]BTt?"_^RtWzvKWMWfIV|yHީ: VxAbYmQ(`*ciW=I]5]Al+ ѣ9agXҥ"=]43a^6zd,愩lHۏ}!iNGeHϦ}=:IsݶiQ(`jJ As| %]mYEC%$R~es.ia/{" iIRy;Zn CN'bs? 9dM>iNGa 'tFR2 fx"!xt,Pd --9Rw|BU#?0 ]:gz0U ruVnHGrHWdLp x4'|4 HҀFzyM2&H/Ҁt3 I^&4[} x6ۺjiHkD^hTyS4ii    ҠGZyfڨY iZF Pk!Cht` j"" HMh4Jo>^Y@ 56l[^IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-eventmonitor.png0000644000175000017500000002574312277111530023625 0ustar synthsynthPNG  IHDR6rPLTE    """%%%''')))+++---///222444555777999;;;7;E+;b)j-@m.Bo/Dt0Fx1Hz2I}4K6M8P[C\G]EcDcDdEeFgHiLlOnRmXmXrXt\w^y`{c~e~jmosvz{|~€ŃȈɍΎяӑԒԔՖ֞٢٤٥ўy8` tRNS5e\(IDATxLTo?'!ƐI/! (ys{{7-7&SM* yb^K- h{{ާmA`ٮeQG K&7wfsv .2993|>(T1jn9_,<SH8ʄbimu<ynwLN5d} *OZN'now=}7xгNipgMp*<,T JIip\g$K`.'.%}~ǂ"xe5_IJӏLɔ= Z/3C|e^ `Wi}H(= Pi<&S^Zn L |&/)א$;?{e=7h/1zf.x.:#d5 C>Φ0s09;G| /;}v6֜BF4ٷu{10defvvNLXRE#C>tHw੒/=/ Qn/ll?/2|޻vkמ$4r̡Y)5!/ ;)t|?qN\Ag'#}ܹsi|_٧_$xׁ+xbΉ?I)%4Y?ǝWh~F_}0i OPʓO2d}9 |P~yjs볓Wg._{s7x9L.Ϥ-;=O4d:^\$$4UO=7g%+6:GG_Q.m'?br?:%q;GΒs_G.yrk7$/?Ɠ? g/d%$/9RU)u>w<},('^mB ` ~ w,kS^ .dia2vFHȎL|4牛ͳO_tN\u|Ne]7D襙:O^<&ͩK;{w$LCI2)'{\Th?\ Ȃk$_ૐ g{2ŕajZQwPxBK0k˔;q+%?G?{ɛ09t~|Edxf/]vēm I6q3J *UMp ^B :X5]%_e06Y<ِUDjӫN/;7muLrr)wG٥+v|$wK :zb/$'d{|s?iĝ:7{$t\G4VR1cpUg|A*{_R>Qŧ^*4KI!Ir.I)۟*BdB mW'LvNN;\>Ǐ\\vEϮt]WD%$9;'/_)-'7_&M|ߕKNgJEG])9$^~O*x HP5_hB.20)qY< y!B־]$(ٵwIEwWG.WTNEEyh׾kOMvRQ׾k$IMRH}$s9Y|-!:)˯ K&3P\s _{W!%`Uy.LFO(X_9־҅I)O8<ΆtaR5zj_S.BK BS o P    A@:Z-/e Z -7ere @(e 2PA@Y]!ЧWʲG7 } \]@yQcF1֖{joޱ~c O˒H5iqIO1M%F( fg7ǝhSFoe{rdHܗP+iY[M ֪׺ȐDWZ,w_%'XtGfrj=vDTbGn'aLm0k8تJ{ݜ&i\uFpʵ&SJ%!; 2K_"@ynN?:M퉍+86i6:i vڰ8, Jضʨ]ʙDLmG}yV OE=NhN)|>LEٖ1J\%:Xx]lbFdoPQifckG_RQq?Meχ5nr+SG@K/ e1^/e{lFAFl&py,FEv^>R}ٺOat㲃z\,6-ޯP-KIϖ:2ZpEs;ަgc߰~x `̴^*:*II%-35K|C)hDy P 7>ePePePe0S[ 4#&(O2WeP@(e 2Pʠl4fz~䔍qձ3YaPL*iX]3b[yu(X1!ܤFLdPeJ!ꦛψPFSe6.hWR,N\)g$iK0b]e6c43_ڲBnˏ0 صl/ݹH_[^h!233ju!ٌbR݃o(?ر5[6 bu& Ѯ0~٘iqB|uM*nK3/U).<a<e  2,/fX^l+b)D@(e   APzʳ;'!@y]@(s x6\e e 2P@9)+AEyl(N >ʾ,ں!D2+к ꒦Jk~ ew-zOZ) d?˧Mv;4/1gYN.[ e?}Y/$ERs.g.rzt8.*Q^dDbnyϰueEHA(@F7w׿PؙoȫYʹx܋m9#̃B$<պy`r]dEA7_&eD2n z~rmT4Y{Q{&;fa- DlnYLC-yFAtȔݒHCլTޟڲwkעJ^.1偈DMo!- ?E#JgBN y wEzq-eO?z)K6&ǫYUz闷z9eH偈ȚaQS6SK3wE ;kf}dzEيꢻ%Qk{Uzm{p^"?QOpW4_Jcl>U!zxUrsvJkUSˏcl{ xduB*m=)sPQ7e-ԯSv#W39xZ|j ՠ{9걕^_EOZy]ϭe.ΡK9sіCMs~((ere?/,&e3??`[Fh]P@(C7M@(e   +IAT~I\A-o7\߼ 2P@(ex?w|]ePVغv/nfxuk6DF t#d2Ćmp:q*ZM7;M=HK QEDj0y~C$WY~QXWIνKDYuU?ʊW7c\uu,u* YcGU:eM%Ivx$ê}T;#"TeњE(bm#Lk#ۊzvʬR37PVW(+^ݶziP{yt"QnI2(Uںmq.w,AdӥL:Em*WۋIyn,g<٣,|W]#m#9jץ܈`|s..95.14>r(,(?TR/>|QI%Ƽ`ʮdz7nn^݄aOW֦yR̗sۧ4gRq+rEN~KTޱ, )mhXmٻo7(իˢ;7٣|Ŗ}W7WyDpž5xEweg:}zl__G5DR"doOuUKF9bxԄu58TpT>bhG eṷlfWuKͳ%d=2AFڦF6L)UDo>rKIus%?<ɞ؈qIvGNVviZ4N΁@<96:idy2le0&CN,ʂ /WMQ^RSƙ{zEG/e{ B#&PnG"r?;o)_Z6ަJk;QlԗKhρ)|@( ~9n΃$N4.neRi/+/-$ʳJq-wB_ᬁ k˽Dy=c%EkcbP5䟀|Dش؛xdM #{N4K?;֤a)Gl9F)XS&1b<rcc6&|C)hW(뎱}f+ÎV޲Cm=GwY!*rPDt4ǎ1ѡ yTiǑ|MxԘqN-5/i>Z{~xt䡺GP~\lϸ8jc}n<.1Ũ\S AU_!>aA|2fR/h|jrcr*|=tK͋!.)/PDRyNa1mӞ~\ۿ`3>+cͥ 'kfL\;w63 JI5:ǣE*5<e s8a'c2(2(e;E*k8<e r@R^:3~To Xc" h)_!n '?)}}H=YꄗOfv]Pko|Wt+kLvb=i'AQ17}~Bg܍4obWڂ\&rV_8F1't_M {2w8ۗcl(vX%k8-e"rV6yexEbe{2w8Lq1h|=ھ\yu` Iَ8c$8=_VÄ7~3l *Dk8Oʏ ݥ=G, 3nDY^VkWpU(&rkMX)3і'mˌ2',q2e~M*(&rEk|Ɛ@AXl)s{2ʲq/٠yNT6٣aqAAۓid,ø}L$ePPRD(ï  90c2(2(2(e y"PH8eP( (ePePePeТR^m ^6fSnETƫ AAi}'4w2@9)$QV5:qS9A7Ŝ@CÖdԤ=>(7ѭj˒کo#<|Kh(eGPRRHir*C]H 9;QeWe}GJdޚ5UNeOpU1eQF}~^<+~l)Qu\g_TFɁJNi4%O}ӽtԖϟveMUT_=U={cJeź|P>[7ʮ!r91$A-ҢlU$yQUg/,''+%FWl,kn6A?b+h x~6@J:UbηnN%eexD4\#Y2$.9T^ZQf{2^:2͉RP{ YKYo4،:J2_3TJNGw0tQ(etLZRWlBX3N|W#XԭpdUesŜoݜJ-K5mOFO}Z)XpSOt^4u({β_l=߳C-++lDurq{i/J[S~Q Gpi(+ ~7e~Y3˚ zP?RԣzNey%P.f󭟓v-I[50S}*z}gYSFdoTCm-F)Mx^ |P>ۧShI(ѥ.cZZ4ik-vl׼s^f.c#eɮqse!m~if,JDgS0βJP@(2(2(2(e AN<`GP (ePePeP-Ч<l瀧qVuB,({ =kh( P8]^BEY3jqPKyHQe] i(F D>Kx 9dG.MPnDFi0 !jA4BGrH}ڏKMYΣYwK92XCMY3A$}H%%s}gҮȫ#w(=eg!~^u5'Beg֖]9SHY:(!CKY3-;>1wk?.#eRU0B7:A8e ;T94    @(G"+ (?-2$*! W*e? ϫy8~Δ@y)){u)Xj5OsE );O F}sVu})Ih֙37ʓJv[:f:{({m`t_튍~\ nLvi{b# WnL+)3x26kٕӷ)mCpb@ e<̱0+9xrm jֶ"AyNvLqGnh#)`|QwKgj-eS@Y@;a5GL;P^5FNokIbc$$uOaݶLy1@k{i8qMesl!|"bP8"9bW\q)ʰ{ʾ>I %_ظ`Ŧ>P>7U/w5.߼.1Hf)2_cl@yϱul_SbxIݻ۳U@9h)A&A@A+`'f݃2(2P@A@Af+(eP( (ePePeP^~7W)[P^͆H/͇օgrQ6UW@]3l 6枲r;[z~ .<]֤%U 3"Iңqt1kkP~>#O/-. tK =rs{GڥZ% (/v9iޅPnC`3u$"@Xl6RGJϓ֖m|N|ze+rM 5 }m^״+nNqsWF_7Ǝc{ ^`ojB")KyٶЦ#6<̈HC||rSBPb^TRAPˏcl[nl̦;@yy(E;8)#E@2P@(erY"P(,oJKRʥd |G_\)5P^ @A@A@A@2PʠР~cVr'0 2o4*UT߸A~AP *= YȔ wg[@)"eb|?''rIENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-datawizard3.png0000644000175000017500000003312612277111530023303 0ustar synthsynthPNG  IHDR\AVPLTEԢٜהՑԎѓƤ|xqld^yXsQnHiEeEdDcG^>ZMatttiii^^^[[[UUUSSSQQQNNNDDDAMgl!9jO~oi\k{#ڇGq~/W;x-]G/ݩнLhOeDK@QǰW@{ 4 /lܤieub:Q]z78Z[(0p .#zt.uN c路@eJoß?4릿/` iح12ЅɈ~ŁЅq.O_GH:{h`fF4 cw MpKi6Юq Υg!eÇWcMef@CN~8卋?B'lRl§k7qzOOܠ gG m mN;QܞۏɅ 9ғK-y^Ɩ(ymO~DyFCg+;OѳLhdTe6ONZHt%5ɏH2KF臻Wo.~}oO./Oš_Y)KhQVVX;xuoK~@rωFUCp ^~C$#~}\FQ}jA2r~\F\ݫ u\FA#^Ϻj%Z&tR_hDC  A  4`D4LD$ei|h%z7 R@T>#:EuBNr DPhB|R()JjΊaYGBmQF_JE!\bΕ+љ9PAKvJ.QF>?Ze0 KQ/#Cγz ulJnD?S? a ">:P]5W z"q 78ZݶfEPNJe"vE!$GZS䫕BgEQZzAE!_n]<" " @hF!DC@44jJ A(: !DC  A !DC  h!DC@4h&"9\Dc9D?~YP%v*[iP'MQ lXю|-j\ѥPAEV-p/ڃ0Ť/ı f A#j`U/;g^)VwCR&E!+դr^&OAlvt1K@wmG>)BWʪRf[V5&j|ʑjf{r[J hkm;eG>KZ^ ْyem;= qL['V5:?qSVwޯ h{Q1n'ֽq{ X%ržDۇ|y=Fo{aU*q4u%FN&mպ#{/iI/)ѻ|*`*} Y+;ȷX[J;Jy!L-WȰ)$SPʹoieY-"6c6K;6{ΫlC2\!þ_D!lwP_-q5qw$hB_q裇lh ! A4   DC Dh A4l,jFo9͂Jx 9\UMnT^k?>}={DTBҋv[ KA4\:8}%˹-+.,|՜TR|l?couJtv/ћW=n-((ńOK mX ܜQ{z|uѷ9V*Zi^d =:%:8=:z<#Zf)IüH1|s=<@TEA%ʁhna<=,6?@J/C/2}Yx]Y}!YD@\0$,D>-)<<@TcjJc&œ%gQ}HD0[[Aӣ}PS7xYbSr/@x>+=<@Ti+ݒ9GsO3gQAK[8Z_]|E!,DsmU >:Ch{k@bO"7! :( ΪbGDsmUu"[Y9GSOKDۣosr(2G؛LEKYDi {xfAiB0haw Ѷ@$u G7fJޣq Իj(ú:jD=4ww C({Nt0njҲ1gTD@t.a5VRk=Hh{Pk#vvU)KtC+->)._Un'NW9⮤f6_rVr%*n`f%7 ή36D70Zխ,U?x@t5[mq/O?Nj5#36}tEa5e1`+>zJ+*+nq_jl3tG0ݷ6GZQVS5D+qtZѺWc|<6_cIt#0=NtN݁WX D7jITuBuHka\guߢ7(]55n5~y鞹ch5r^awu Bt4r^a]SƷIhDhh h ! ! A4A4A4?@4nѾl Dv{1 zXvh'Dw%:Mܿ]e. \48+vթ] 5tu4&ň~%%E!$ / 37~oW!"KLʡX*@ 7ņDF͆W/o$Z5d:քhg:9e"@}̽G'Zs_lȉnMjoд3=괟{K0k;_`**Ҏ +hB:D7r ?+?/cUWM57ņn"$ExDxuV:]@QY7=Qǚ`X $ѫT|ĕtt^b%̴=L0W|nW_6a'HJbVCxuV:-X ض2uN4蠰QMxZ{_8S?XjLsX]}AtL/6}t]7t# hZY=q4_`iD:Ks6BQhGnF'YQG/ %QxNYv('E~0PЉܬnqt}7Qҽy7aYgm ݾtĪ9lv)+ŎqFLܸ{1nT=`jPʾN4w_l:꺉j>Hfwuo@nYG#dc.w_j_vj~x7A3k}GUQeu;)R\ѽex1; N~5]Ɉ+ʚ+6NoELt?ضeo&xCfm ZIŽb#"O{" n ok{-[[>﯏z@tS )_W@4ejx@44LD{ D}1*' DhDhDh h A4 уMt_ݢ]{۾7'dmSJ*VYt)37$u7{@4 ||C&65Ҍ&hV%cOdi,BDZ ≥F<3J*HG\Rւ5nܥutO$ϻ}V3µ8k)~,{@i%z4:"SZ456MQ'iCg5?"dvIrNM9fXâ:NiZRױ=n6\ئ|ӟ_بm ߽[K/(ˈNzI uhi{嘤C=]P@4 DhDhDA  Dh '_At{D,uW@4n~ڻh A4 D#W׼A] DMIWny !7) +r}cg1 6nMJ\ɤYD7tmbDCmYѺ=)ѬG`*澥­4 8j7DKzoRBIڕZ6I5%t'4%95MCW QNt$zoR|4}j!ڴ'DM/H,0!Λ>2Y6I0#8/ꞣi4*dX8ZD8Λԕ\'ߢIiOʬG5;j->d;Nt#с|2,p@:jIBLZњ=[jTRisbZKtQu@=$ޛ4d>]ao$ۓ֣SsebDC$ޛfeT;IuQlqf,sQii4DL z nuFjh1j+Ё(#5Q:'Vu`1 >$hDh A4'+ DI4<"zpb A4@4@4 Dh h h ! A4   DC Dh A4A4A4@4 DP%#iDP7*- A& h!DC DC hL7DSXv"h)yZ.|RZCk0hhe@tVs1op;'"fl6jQ:чerH*%ebFJ:v3,nEIͱJZLFhB|R  M]zZ-ᎪՄhDDt&BTzVzy mD(+Rm)buzJ1(\"FYe F>KDPyfp)Xnѷ}?w/#rޮdIiEY)2ζ)LR@y~ԪV>EmHe-/Iϖjm!ߏm^9G?fT{$q]+%gfuZiSr/ċokX65Y"j IȳQ=ߎtUSʹd*ř.Bl9T׺niU6Ye,53h{Gfv('vus9H"qp ([6:M>ƞz*nLL%v#3 Dہ}僃{竊E}_ JD*|7f [am͟Bm5DND +E{Jd+h+ʪ5maE{GP&?O,yK{o%Zcx2 \\IYDx0q|Cob-HWY`DD^uVK8baaF$YD7E[Ey qCNc(Q}=L(N236KFstz1-ͳIME Z#+;A4K%mf/`V?>wYG }>,Fl 'za2d],DM_Ypo$]VbQ(2ˈֲ$~YjK5_J+2eKj(= ,TK|>R#G'F}̂(cKڳ z'fA%FD9AW*9pWZV )/ʘӥ<f@4߿o#W:y;q않zWtoK8Z1h8ZC2C+]]Cyq?%HuɲhŸ<0Ey\ ̃h1] u֯j'SbTUׁAt3Kќ0uDXQ6&ѮDM+z':lIlkR%G:Cq٩phJt*(D7Br {+j)c:|XJ"@mGۉvJA"JcMTzӷ$NC5{RyģMD/I?눥ifדּwq4) or>{@Ȍ<^3Չy؂Vv/˳dQ6,MM/@4ist.~C5b1mh7DwQP )   DC Dh A4A4A4R:h} v [%j Dh!#vtRڣi\@m>Z,F2M:D[\|<+E=xj rdT3.a}7oRSkAڼmv#ItKo9\LI- Y m^D7!%lI+.a}7)w! ğp*JA͏tƂ;5%v]f}KX;DMNk.XؙN*WYx.,H' ~&Ճq%F4\!VoҀp!]IbJ'e'+jXIʸݶAi:2lJ4\o&]H0cfN'6AVҟfm8Za:GM3nlf}aJ)‰n۠ϟ K=x2KX/:n&.g.bD{|.'9 $Wqto&.!:n2T* ԚՂ4)O55(P7ݛ>~DsQ&Ω)a~ iCЦAi_dAtWױ6 Pw| E/L%#8& D ]@4 D{":ڏڮAtDS *7 DhDhD7ѷ= \š(3wkװ3HwpJ&`e`D$&`%5oh_:# hKA装N;'%he.F5śtnVCp҉qg7mj DG׻-ܿѣ ޤҝyؖ@t.a6G03X D3oWLiDw;wk^Շ7G O%RiX1|tHqW48ٓbϋ2m QT {i :8=:z{]lK~}H^كqb>TN(\"wp m}x_F7h~(&SiE۫R4ӣ>:e (JJ[g9ƉMUx42VWqt-$R#LU >:D"R^D{suDHdZ%a`A4x6$ZD:$椟DCouKh}D7&@ uO! ! A4A4A4@4@4~ֈbiO$E_#zSjA{uM=[m`_Mk-OGA64&+EL՛6XJ +hnÿRh~sz[m6s; ,%OJ9i])zd{D7Xh4+DߋK D7$Z̪[m6u'&jMzd9;I+bij7n{jEYm_,{JXO{-$џ6G_l[a8h}4_9uS+>|ɕ ד5bF^aJ[وT¯]I'5Dot6~Ľyp5UWsm`I?Ą_LL_luW3pVV"v6nwo`&DpA݄7=#Mw?3ٳyzelڝ5!Z!˖ Z;z{}h~SU̶hSw~(<ΐAmGD#g dN\GW<N,w·+j`3+QڵIhУL?Y&K ӗ x*JJ*HBT:(Pwmj?Mku06D=xJ"HakUUq)!z%<8G/rM1pvt egznsx="ÕwEomC/c$Di~&> {уLtJ0}H;ntM, ɤh sZIENkq%@눥iJyT3QO қ%^␶1^WGY?P}Ľ X D4S+OpCl,xlbe9✙џ1ckh9566 &kCd,=uo-iq %eY<'.nG/`'=D{0[jnDѽU`RRnڪ ~!<]2uA4@4FLA4  1 DCG DDo @4nB< Dh ! At[NhݗDK!NH\ݲ{4q5 hi)2!D?F%oh1х<$>Uu uDtf C(l-)F^VJ.2_F vVlV U3fN>,xEz)cc/h]YȾZ$/4/T2)WqmahF Vhd"@TVTԷf@K^9^)ў|VuhS/i*6K/O?~;'}u#ŀ=eX$-Cc'>fc3(`uH4ɫ)%6KJJ[A%n+9Nu#ŀ+~>5XEJCݓ'/y<BZ*;?ґY2GBJF  zkjB!ۯ#zPg+|Rah*>]g)}E[ܮTq[)[ *EPN[۷vIge9_`/hsI Rs"7"dX)[ *嫕BBu3|tIڕm\ٕ uFFtͨ)RDCN4fh h A4 D2X  CS A4A4A4@4 DhDhDh h A4  Dh ! ! A4A4h^ŴeeBP{ӖA@4h! ! A @4hDhDC  A 60H5%"^΂Qq4h! a'BZ'm7$ z! =i1 HD:ѽ'mhDh ! ! ! !X./њ+CAtJ Z שJj1A ]IvJI+{Dglx%Dh;`]y 4It)'j6S6jvJDѮ B!Kh┱lYUv] :$E:BTlKR(< PjDѮ>Rd!or Dkѣ$a.y _F!n)A5]ɂ zW .DVBfѣ9{K~;}t\?KIJ%89 y50;ԕys!}yA;zY GN5ay/?e(d8BH38K1 KîM%_*ѻ|*FPvآB̟!kAy2K\ :zyDvV]%d T9WHZ9,Uh/jyD фA/й@P4>#:RTRD)=DwU7th6-&iF(%裡?p|}L DC DC DC QNtaI #D݈h\hDC  A  VH[ AZjY@y:FhA]@F2 }! "-?~Wӟ$֘z)[IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-filesave.png0000644000175000017500000011144612277111530022666 0ustar synthsynthPNG  IHDRnGD:sBIT|dIDATxXOo511h-&ذXb。RT(FS ((*bNJb޻(%.ExyؗٙagϽcd.l6flgJ.X?> Kf?{o^J|~-\~9wr{+~ZoЂҳ`:kK"::WF||<eر8pRSSq >}.\իWqMܽ{>̂F"l6fwCh1*hb`qZ ֦Ql.ژfu{2ݬl=\BYn3|nu+]Bu DGhENVYlB7.#u?):NEWmJnV'zfжz4gqYNmuDWm.$Z':'566V2n аalW?|n7 jUi5^lit禭#}=թsXUL#&thնQ*mh@7=.Ⱦ|a@wζ#?=?VV/D93}TvVEcW ,l Q1qJ&*W߿/G(fdZivݸqci/]́ܔ~wz+XR;[,E=½lVbߑ+'X jJ'<+a*A)L .q8|y"uʼ9ES@vK\,'Nߐ&9).O}U>^\A 2֞q OQΜlWBX y`!gq,f`avK-yhb\w#O:g4޳9we嫷 v3t: \BqH&gUUXe`w9CB$cиϜen=qlUl̖vBտƢhPt]uTJ[Gm*]KkUUOSJ_tM5T @WW* t5jUi}֡*mUUUwUTjUZSTJUJ*]I+5PJ,(Z9ؐ:VXmhEG=h%hdui`RMo*qgixM,_3h`aNK-hb\NOO 4iׯƍYTT/YխΡfni2D͐PŬtGh6ȿ< s2َv?dC*K?[V >%>S&!% 12 ^FQa)ZK3o-aYܥ۲ C173nf>2 Y?gLY(*h=,,o-&Cnhob33YNC?=Pn W'&2kݬnWv`⫒MCOdI0jw*cVGo ƺ~SvgMefuIxuv1hnV%kgvSYU~u,dmUj"3v˪rhig. X7dEV?k>bVʬ5U2u0WݬAW/Q].Wr<]JzݬdQ ͌Ef1qny",Yꫛ.[nW\0SwڍmLFաKn$[t3Gz%dvaef>t6cEX7hPfZ"ki'͊uqgiFN.SdƙǭLʟġ91n^ĸ:M3t,S+y6CG+ޒزü|vDw^-Z:)dUwFq?̌/rYm1Mv^2I+uX+-ve$G. lE#Y_"#l$vi*Ѵ?Sn~>̜r h˵v&kc8揖:mg&q:Y[PsPdBq~F8B0in6t!*6Sf >;k=dY@V'3xl<Ys0E l"-V7k)2Sـ0uφOPdE6Q7tQݠaZ^毗mH͌n [4 :Y5Qu"͚`Y{fM{z ~Fu)zY޷IɢI/Ud{LY7.l+n`﫛5.*& L7s"'$E欗5qqgc:ٴC+uno%;qhv,&7mTqu ͛rņm@S\=mb=&S.#4&SwP2$} 9K93HCmu_Lwf [Ix+<`}@ .!5Ng?<}uD|pyg$n;6&Xp^ v7-pN5:r5,JTZͮߺt{VcS2[xR.X{CYۣ 1n蟍w>qvX."⟙u6_,Z وpqluN9+0$fDN/#:^uNaxhUPdfLfٰ o%Y'fC Vfs%gʠl"oLfaE6XdStg>DE6Cf.M٠颲x)*Y"fmԲu3?_ѳY7/2ݬUi FMUhNGTU2-K/kK38{2oQޢx)x`CZRyL*Z d5Ձh' Jv!+{nDSS͇ӮLKW :^ &ݍoI`\p `}qtEX)8$n?,])YLj6uD\=uf7 wD/cװm9@U"[%+DUtY%8,'Nz&޽[vDDO턬#e&*dfVϏ]_%OenyX>r*1ILm].+yzY.l<>3-UͨrEYSA/zY/\lt^SdԮ-V&+QHMϬEg#P ʺ Ud*DT ɂeeY/RdZ-VfAYd $kgd)/`Y7j>OVd#J^6M72b^dEk@f6[Vfd38㌳]81PĸJ0nNMѴrA4M'hIuΓ$b6WrP r'!E?4ZX܏n%*bm͔oSV(8Y{JbbT71CiMw7J_M1;t|ئqna/(X h%0IQ6J nzVeVzXG8mO 9nCkY'AW^*h@&_o28myf62eeU3;Ef&$l"sQV Rɔ9-#Lᙽ!Z*z)e~,Zd[2GCq"7$[9)a2m͜rfCE6N/@CR1&gqgٽ-ġσqu ڵkpB&@ݴz! 3_ޠlKmVO.2?lNF X[e|egN 6ec 0 *,A= {6@ y<ղz e ˜Uyf(21M^@3kx8㌳2LZL3u8)X@c:Mw : W?[b2/l)eE6_d;K~BsefX,![|ɓr?L8?k1aq3br zf͚I3ji$ISR{4u}qҰ'ڻǡ˔y 0:t;#vy^@ۡcPY;|^kblذgϞEttS:kԨ!WXB͛7k.,\)9_ݽ{{ŋ₥KѣGbX,T7X@!.UrT'mz 郀rt?GxyOT8\&oz:fBtG]{*4s>uM3#@A d(*"~/{ģu0V⼱ 0#h<4… r<`tgX}Zž&Gif;pDp:RRRdk -Co쉦swyV {EfH5 hvB ^ۃp;u"Dp>bL_9PM/4?/?/bDf S_.㚟oc0b.$M9'1,d>o]i*LU ɲՂ@^1&D5`N~2j7pwwL}{tnWw˾bso d13WOjDEQYaMؽhl6Q.T2قvn)=] s7  sl1p XqS?v|A9ЏZ,L-ڦT5o; t!Ȧ} ΂il-:No}*Wweߖݳgh#].ndn6 k!Ҡ"< $2Q}vIFϵ x*!÷$oy\|KXK4"1rЫ~Zo޿_b?`wٟqJzuqv-8뼢cU\9̙3G~Hiz>ٳ_sAtzzl5}q!e=2,cМ:OɄ3h <d_\8Vի'?͛9_}o9Eljժ%okC+(U "gO?F4ZjrvoVZPv*{o&ݾ )RD> ݮ\rTZ񡁩ӧOߺuKn^~ KmFv:z郞F9)SdFO>'sw=-[V~#Qviذ˪AfTTs:٭_1<*!hUC4L Xa;% n@*c h*W#~Tg>S/)%U(w 5-hMYΑ+I{-O~֩mdo3PLY99Sw&MnSM}E8M#8O _#nj MϠ_$@UOraݐcjaflSۭsAsAXw J#ߐR<+Õ*lQ6ד\)_s_o*D# naX8w,=q3,&͚J <~kwz6L&hx: j-5pU i,ݦ6RݺuThsCopB'` ᅬ={޽{i5#ِ7ߔPǏTgm:&9=f3Ŋ3U;>Czn| Oo2~(!.ҹDOAA,} V(/xHѳ֓rNg fw g٭_1䴬`WMQn  .t]1SqjM1az|M/:2hpM{FL5J'9>>^:?0ST djR&h2uyiQpy|!A{,K|,+ӹaV:cx^Ly&"\Ŏ zP&D(oi<m0v. ND6$_UO8XW Ԫۢ h[Vy>5=E?"xnD!n,.q  0`<6ѱ4 h< 7OD7\p~=g!:8mךjTI5oMkҥK7G_$cHo}] tLT׀P7v߳gmӮe ,'jߢa$`*smYy6C;8V;C!:cs:6j*!Z_h\,DsF DD;M[ 1o|ssњh'''.UP*Yi& r~ )ۚ ީh\u ~`w=/ٮmzEBz>r[mls Z_OcQ^#Bo:4@LX@v AM}4qBO_ J%_}R%SiqJ8_n֭!UbT^pF PA pn3ɾF11BLo;RNM'H;[VoHhvŕfGsCsDɘQ8K=ZVrD-\sNw$mYC @4P[FuL(CdWqn_v[{hm>t|OӔTAY~#U~}V~hg=tԮ][w.]Ӿk_Zh~[hhP;GE]vzINy4cg(D?g~cӲb>oP/+ZPrڄ͗6s H%8X ݁]Jr9pm~DXfTO f : jUnj7izzzk@!?SS뢒un䁒xcm"Mv{A_*ƋF%9u}C0v#,gH",Sdn(@scpLFk4`|JeĔ qGbK@T!=w$-t.WߚY8djc#FaX#,mFYS=eQغ7JX[!h^ GG<gI=LpqPÇg4>MQսvh*J=PihP;!$`b+Z2aFO5s;3}][tlmmQx*P=Dk*JtnӜ1iiYb.sL|Yb9 `E9!v+0/D?-["a<ͱ,~i:^ t589ڕnj7y<Ѳ-OeaN6}Acu\oX!+մ=s^ᮡ]A}k{x+):.߄3b{H~gV5:79 coM چѥ95ly_} M //zGgm8NGFs}8@S A3+zWCAtb%y q;N}MJNMBl+G!-ǢFahpbN A2_äOܱ]ň}iРIa`f'ۆT!:##Kok武_ҪU;4i"&0לVݟ%p$ǧ6K5&Mv4oz}#t.FӾӲtSaJ(s?Ghn=$j…!^Vt^ic\o^Ӝ1iǐӲj]! n4f.zZߨ0#/(c2!z,F` D^sㇲH5:;7u^"+jB4n͌yzcIUyIo!0h |SM"J~>N!HS)Eߔfd<oExѿ.@.9qS8 S9,|![e99FbcG\ ։a|T8rYx懦 }"hĬY䴈t,Cf_Fw3Fi б^ޏuNMSZMWc"$-B˲tjAxeX@!Mի㣏>gDk` zhF~As"]F*jsdm#7?4U`JPz|\n+ "or 9mF-sM6sw:hF fRJևg# =O9D@KHϒrY>t/_^VkrټΑs| -|X љ,|.3=D!c`iV &J臦V蠕1ef||W0$6 @$5OUc s}B+(,+-?@}e?ww>hQ5YHBun֫D٭z"?|T zy "vcl؋eSrvߡShӟ ]0,|W~L].O; jԨ?R%!j!b# 3:Ή?h < iVScYT7ig F {N4=E?/1i:yzd1D&#3.3MIU@4^o|_7%1xN|[\G~oUQhjtA,b:XE2Px40s-J=W)!hz w鹤 "Z"UJT nՠWTR`!@@' >2_|P(ONM1iJS$҇*r#z#7E?/bJ]XZvvvr꠼y~^l~7V@T 4+ۓ'bN:Ν`#Yح\;O s=ŝaϾAѲF ) `mZ$s׺W0RF~LͥǑ`ks# 7BJLn3'&QOr*GӐ,yǀ!!P'D.WSnyVjio` l(/>*z̹4 Rb@#+qiDX,.@H}b!*/_9@8?Zks:}: dfX,!~i[ l6ff o韛fl3C4]Ll6fl6fhh6fl6!fl6ffl6fl6flh6fl6!` Jy5qcfl6?h՛P76fF/D_dDX,b.bf0D:bX ςh <ϛ7!bX,C4C4CtN dRAӧO#tQHl pݺu yчZj2,bX ѯ7ņ7DYp2y ' Ɗ+^j6Y*(~7o+bX,iqM7Ǿ (mB\ +,bCoƽ}*:op~芐BмAl+W,m(Hϝ;eʔ/3g3D߻we˖EXXXߦL%KH"O- }pwwW bX /ک1}+~ U/= h >>rpۚ5k VBY}Yw_r'raƅ z0tRHNN9c…(QDcƍJbX,!yT^~&7*lk"m{8 wt^5kXY^ftah 0kô6<acc#믿UM4rheY)J.ׯQfRA4X,b1DWހen8/۸}wWmKbV3ýDP=iֵzuFc(鸸54DtnbX,!A 7"ΜGiҥb[DI8f&JhF9NG0?d8x'z,Y&9<|h񈔦@43bX,CBDICneƍ{]Kիwiw$H_>OV+@8[]5{A ]H\0" ɋ-fxfX,Bt-"$< @ 7ojtvWSbq5+2 h19 SQ0j'mZ(2a~## fX,b~ !:nC"&&ɖ9[n=Ůt` },q@Kbq*)!NM\!ԴMAձQm.8{+J1'r2bX,m6p? 7Cq{@|h۸r[ ~hm]pD2^MŮ9nؿfnGQgl :J>z7}WbŊr!]|e; :X,b1DmSL!x\Ǟ" *}"2Pj1lsOzZbbb E%Z3CGOՃbX,hh5&ˆO-)?Ez-qk@%`9Q>t >ijI_.SΝ.nNCMc0~2=hTTs:+O{HʗVq{CUKX,bt:UG`6UVu #( y8oA '=&@9(=8w_t?vg1zU:lcy Z 5 y>]͛bX,CthM^|9GЄ:;ngB Q'Du: tF'ݦcLۯ=BYQwf̞=hmxf~bX,C i5cbFH a'ǀwqV}d>~WAک+H6\|>ku<6k0nR6l(Gί<,b1D ?Q VżG9/9Ns)S[܅{,?Mw]B+G1eu>}nCmiӦIz%{AZ x&ZNOOGbׯ_0`>8|pru֕GϞ=qY5kZ'-7n8?^B :uϝ;'*od_xQ~,b_+HӬSb=:Fm@K=wQLy7cq80)4|o*1BD [> K9-/ۡ_eJ@zɒ%߿ .Ļヒ$&&JYMQ"okzi_UN0NK7nd T|rVN`ff&jbX,!h H`t ('%v|= JG{Ϻn0]^{ѫa<,+g͚%[mT2Mo9YТ _| {۷qddOmdA#Gߞ?^fxVBY&&Xv j`4##KFq5 }r$vqq-FÆ U0A<$''g>zBv%JdݏZ=6nȯ:,b1D鸸8,Z]gG7;E$hބ4v7((H$z Z0 φ .=U}Km/pLܦM|Gr~˖-5D;v իWt[ jMMM%S5E5 4;G*UdFbX,!h*@njC:|wG7QDk@bX,C4Ck@4bX,C4C4C4C4bX,C4!bX,!%2LY,b 4: ,bX х gxw8;D}3DX,b1DMI|Ζx1jԨ ѯR!bX,!0;l0|Ys;˖-+/=]hQ=:k!CȌ.L@+Moͪpo(YQ|yy[{=9 L:!bX,!hH /P裏0f3ff 7:zСsnŊѷo_ RJ: D.]w߽Ћ0DX,b1D?iF Y&S5\4h׮f͚j 6]<m Ӳt;:::kYOOO׆uhbX,erJA֭gzT^olnu.]uqt[ԟMi<ʿ1DX,b1D4=ԟL;;;K@&i=ݻ˾euO4 O3g%5k0DX,b1D[>}::ths"`8az_l^䌃k8$@hшNa[=-;[ۆhݬ.ܬ:!gvG:jxn ) XtEUQ֟45#`nn.+̖9r}zר/([,+yiq8C4bX,Ctw}F+9b#vGK wp&&&zذatbu8/1z 4+ ~J,)=b+,bX х+c9kZ{q3mp*f4SU+9*bT:`8x`t 5u~f_"g,k|ODK9"##Y,b D< (U8rVDZ%/3GZ?~qYnOѦ]("E>fbQݹ-8yY,b DgHHS };hfF?JϟbUUaTZ{ϰ{%ĸ%ֿ.[E/=,bX хGuEZjKY'N@f7UAo?nC=$ۈ1~s,[ a}pp6,5kmayE ,bX х1B,ú1uhX&?cem[G@Xk  ӈᭋ#ixeTh/DX,b1D&ڡeFhl\]w/_ZfϞ%KUV=$:HC`RX+ +^|1֝Ҳ8L*lbX,] LOsvˬ]+W =/XW^[¿÷W]9tߡ䗟A|obX,B 111X|9VXrTѦ ڊ9V vBưwInNjbX,] :7ߝڶB5жyCtI^饅fhbX,tBWvY,b ,bX lhbX,hWhbX,hhhbX,hhhhbX ѯD6hy|Yq ϣlٲ;vlZd[nwʔ)WM&BDY+AsaȐ!zHfzdDB!PJ׮]+/"ʕ+_O*%J@"EӧO+3qĔޥK믿~C۷/z->PK/+++4hTU/Ty={s7SWVRc,^8ϟO&B)]|ytM[BTדr]6j7n "Ç.]~Vڴi\;=}Y[[WZPvm`˞={`cc~3{}ʏ^{MWeی3PdI};J4!BH"vvv[lRn/U_9-2) = G}O9Rc*s)VNV%Y_zt%Z3}رO=TrFs7S"r~ݻ79!B DDiCEU*r~͚5>80EC$nݺ2a„,? 6EӓhMK\P16.٧.K 3O%[Jj gM-g}V 5%B!K +SB* 3%X'#w}'O<"3]%b]^=}ƳsHDEMnHof.B&B)nW;rhB!J4H[W)фB!hD,--1j(XH!Bf7!B%DB!P)єhB!J4%M&B%P !B( %B!P !B(єhJ4!B%M&BDS)єhB!J4C&BD3hB!Jtʖ-[`ii s3g.)фB!hJtlݺcƌA֭KNhު'| C]XS !B(хVE.]qơ_?Ѳ/hKWL[u#F/o}gC0uLJ4!B%pItJsC1q|,\l pq=GO"  Ŷ^t2 ӧ[P !B(_ΛN{R:w)n~<x&/^ĵkp%DEEܹs {4:uI&BDߠ9|?M~Z2za6S|ׯ֭[W#&&.\@dd$U5:˜e2Q !B(хAkm'c|g~w/$%%޽{sX\rEWI:$$X cv&R !B(хCkiA30y:8x HHHU踸8qeDGG#""BWp)ݏ!#ж8L%B!]$Ol7cU%ݻ}vJTCٳgu{15;%B!]$ffhIZsVvGt͛q^2PС Ǐz9d=ZE&BDVSUEzտطSW#R>q|||z7A#0u*%B!]$F&hv˼"*tZJxJ;B`BBxNc$B!P DW1Z+8 ԙ1},ry-OѰ(t 9%B!]$jjZZłnX,`mXeptL_IM9NIt.TI&BDR[|ߴ3\0aNމw1a9Ze! t.=QZ}SgP !B(_+W~s_wk9~uAB m:Ѓ Ϝ9][FƠu{ k؏M!B.]J=Պ+-{3h߱7GġC׿0tm4 @j-1s%B!]QJÔiD :...pvvF?ˊߡNе[oL>۷oDB!P D/^Xp#c ުz1vR-666Xnf͚ǣ_~ر# GG<(фB!Gkkk4j3v?UˀA.}1j(j mڴ1i$XYY!3%B!qrrB1b$)Sj3%B!X#/BAfJ4!B%DB!PJ4!B%M&BDS)фB!hJ4%M!B~ R)фBDSy><)єhB!P)Fd,MDB!P3hyܬDS !B(я@׮]e_Dry2d|M+V st[jЪUT=ŋ)фB!!˗Gnݴʿ*THu?Jm ڵÇ~gjۈ#k ^1cJ,r;J4!B%:Dn޶m>mggoٲEwppH }zӦM6GGGjJ4!B%@I ʔ)gY:H^ҳnH:+$͛73w)фB!'.㦶IW;rhB!J4%:+dTڔhB!JthyfiiQFqBB!Jth.M!BDS)фB!hM!Bf(фB!hM!BDS !B(хWD86Q !B(хSfNRObn$! ~ N&BD>v"{ x=nd5=znhB!J4%:-R֕$I鳪o$`wJ4!B%msVWCPdy-][P !B(_ݎd@(N '11xI߸\R-Q7/W wn;%B!]0% ;vBB"cӧq?6ovڵۀT$.<zF]%w`[j5]}hB!JthW}pr:O|]EA_sDK?ΞBmk ]~=NK--}ѪD0hB!JthWW7D!4h#y6}|]K@%!JÔLQOvW}+<1~-ŸqKy1C+'0G. 8pDB!PD;;#0,aá}. H&KHzoR5gxƭSvXYm&75OtfQ,۝ପҮ{> ˜Jn+<"DihUI h"ӧ*ʼnk8|~!hB!Jt|pU;#0&|tHm([">#Ii \Ͼ[s s7?fkc,ًv!SdS2G&BDo޿[aZ K3:&q¬YеkWËy^3.vh5[1rBD\s_o'8'@LI&BDo޸qZ\%Vyq&fLA>csXN1ig FlGoX]t a 3UOoqIe:4VLE&BDwv{oz71mM}=D$Bc_TvbLWöơX8˖m/~HGKU0'-AoS !B([9c0}S0,n!\ד>q#y;+5pөX|&s`Ke^_pEZW狖4xk0~ lD>{ T5Z;~5Z$Z:B/P !B(`NRtK)%nʁ|X/.+ʢ+"}0hJLJ(\tbn$Rl^0Js{e!%B!] $zWϼ ^^<+qHͤ9ZsPm,sTK5E-רe:Ss Wm.&i6F˔w7|+фB!hJt wc޼Qlv!P-KG m=yw`fi4i93QZ>ĉDD_,0 0 SBBmۡ^++{=djG̞NW%6X^ !s0v2G^uUJs\T}/z|0 0 PM 4tƢE֘}:^y'!CoXb;wnʶkעlٲxQ\9}vK/Æ |k᯿JoZjx?~%T%ӧO}<_~Y?6Jt%z֭ 0 -DSm۶i>|>tR цJuXίYFWjA2&M/ 4~D_W#q{{{n^%a*љ>zxgt<hJYB!''Ǐ#G˗ aaa.,cǎLoްaz)]-6Tm\6Dn'g}6663s077ܫW/ԩS' 3^Cd{ǎu?8%M&-٢P\C|Q2wN]<6mEJMv\>}%Z~;hذ]l?]$Z~AIŹM6QF6ѣֹsg}>%ֆ yua b쌢Ejm6Vݻw%hJ4%B(+mPR3;G6!#KDZq\yG<;aZlR}w1yITejժ HeL2z20PiNquA!K̄QjU=FFϡyZ^3[e0sd/iJtސ3gΝ;BZB(OR˖N]|"\~wIHH۷X\v 111tـ.ƠffXl%X桖diȫSSD1 ]_ B%IjC/+{Ht\\܃=YVVXd %"MR6lGn ,ONҧe}#d^}@{}vܔ'ZBH5(SN{3)-h*իWS… 6z+_nP-j֬װOzeH΃=bĈWdjQFD/88XP|V>T  Ѭ`B D.z5>/Sb [R*i:** o€P9hiyS)={z E΃<>tTEJ7lG-6Z6lee&=3gԗ׮][OOJ\پ}!D.o/YPx j7n?#v+_9x`*y^q6ZȪ2(U={\L~e H)SʊԶh#W_}UyIf!w3}-! HtzFkb5>+5F]M[S G@_|/^Dtth݀?xy;~\'N0y<^zRǃ^O9JW_镣{=}?h&OJH,}USɪ"r9xxxl9嗧ND_Z6?gQ1L]㣷D\"} ԩ#ҥ~<ȼ 8Cc̒"(}g( m6y6:H{-^=Q~mi%Z^$s7 ҕa䇃aS0!JtfϫcX|M[N+В~֢ϟkPzK|On`ӁvjZ8 A;7w?c5zF'Z |WPTz,4ghuQMNϟ?_o+#h&OI( r^i,\bn5v0+mj=G%qK+-JhAId.q9$&mi,˞&Mz-8ft]9|%SƑ6O RqLs $ѦzsCK}Z .̹j͝0B{..=,ЩLtb]k%g9*V)f#-"Yf͚H-֗Q) 5m4UdJ4'+Ѳ|.ʰ}n'E e#Jtzˋ-YEN-[> R ^ec䰚˂:cJo"HomKmZ/+ّ|-!Hj%>.U ^z&MwQىbڌŘ4y.-Ek0j44l AcХRYOq')[Ybiۘ>}J߇82'zذaZ IQde jx}K8rSoC;"Dg?S-}dh!ȡ%ZyʯfA (hJbH׹ 0 9ev] "䗺 &LԶzM7f}>#5}ǒ!P.і˭ewBLGW-rUš%bCt=q]}G_'ODY.Apno\ˑMiˤPD8;Y <Gկcظ)@V-ܗo%:mdf &+U+2+#< bvv~i^%i=Ѷ"HMXDZN+ѦgJssvJ   ӻy-Dxk  +[5Yyܹsgו9&#Q&ogj[+}j'/*|V$:mZBHAhXDaFѹ$-У':b.xօ-֟"G3,OuԪ7:WcvGJe+i94 $$ڵӷ6Ba {O#dС5%:]zJvx7;ʝQoDٳ+ /mBȓhUZh.1dNM Y#Fƾ} KRuU(':MOMfaJ4C~$ٵ@Wor .%(^UkxWo6C%fx~"`e唧抦D3 0LhgϜKqr:Q8Ls+ZcfꨚCA QoVY 3)v-%aa"LCΥnkh=u'W tQEsUDUߓ*U4 fSyjhJ40 \frJtvdۏbƖoǬ[Ϧak $;FhJ9+Tn5#VUץ HUgqj9X[[Saa H DswX}be ,0f5[獝.6|]Q tJe0jبfPЯ.Ufb,ڪcdJ40 0 %:JM~WfUxlQ? o1+p7vt@%jaEOEՔv67ת6+3QOcWfaWEQaa([=/`IXR|)dx Xr } h6VDXQ-]Fp||_@)튪6"¥bIrw„ ( 0 0+чp~׀UUV`ҡYtYE (َ̱Tkrt+ruh.]QRۂ1zV -֭D3 0 PD[CU- pMB fx]v끏 >(Ο2pNpkv༺mȹ$Xy'oQK}/,r ) 0 0lgs<;ނ"-&X~F~,O@zsy(nPUh5 Gp;(OV9Ia<˔ʳURaa(JeWdi,FjUW"O1Q`h1 ]}<[=c7KQ^lv#F8c2W,X 66~ha))9 %:4Z/x J"{]Gj5V v?|<}n`מ]$'˜v;Q Um Z$w): A"YM70 0chY*%: <,^n0:܃$x5v~@[q7¬Q)̶?}~\J#.*K¬U%zGDۻjv= LbӦMhcaGz@D?,p kEl=sOWO`U,wO$|+M:mNp? VvCN߁ k',Ŷp $3{w[5]@CJ4B!M~$ٱ{:̍Bp O ĨLv>> | Nua ȻX!Ç`@: 8Z:~:Oji/ϔhJ4!J4Cq,ZjNB߃Piw?+FJ-AaXnjlmmM&Bf(-;wOKC 6LebFLi_?+ޔhJ4!J4)яTeinl޼YɲmJm a#&NrUUͰηLDBD3h&Htdd$Ξ=K~$%%ݻnrY̙3sc!v>pHܹsH3lٲݞP'"oJC> e/_ƨQ|}ٗa;v/!PMKW(zbRhנv;9!$$s,,бVMj3m7Ų\D<ujfLƔȩS DAttt>4]ڵk&8>,>cXZZf[h/CRa$޽{_>pBlٲ={#f͚vUV$:e$}!Vk؆ pZ~_U: IcVˣh)dTƖ)RD!iqa&rMD(똟%:Jtڵ^zIvb%W_᭷{ァ%x&LпNeg^pS-eyV3g|E_ݳg֗7P/=˪@޸qC_ʏ5k׭VZˀJT!U@,YVVV~IԨQw֧cnĉ3n޼V+ !'(az-RܶjUQ1kj8_|kDw pW,(j2|)SF@R+7ԟƯL k9:۾}mҢE }^xA4~lH|T^C۷oD@NHgܹ3<wwVR}X"NAAAyRC e֖Ȁ:-"h߯rinݺ?~&?B\Dg$R S*7-Ҷyrŋ lܸFߥl7 mmp-~[B]%:3́ԑN_|7}ZUVJqJU˖޿=q~8M]xk)Mm^ HL IdD^'NH̳?(QBW ͍!_{CQzr޿Gvx;趄tVND… իW?MJ ɯ}"FA!iAr;C_T׮]Ooذ!~mŋu 9ymeFP'"i{"ǣ?>~U+ÿ|9e>Ǫ?@2ᨊyY( i]B;|B *RIG۔sP!r[J+=y]`>d,յ~[/"WT)EhSɪM愖_4;wNcZ!+tٲe+WN7o~!pZKPADM ˫I'*VF|0t&Ms|Fu8;m,a*r8L&Zn*A9 xr/Zz6!!A_okBHhSй)R?N|]UUKëg8Y)c,6ڪ6>99rdj=i֌jS ꜑rJt6$Z5ao]cG3|p}ҥK.9TV?UFi]Y6N\_wM+TmD /?zv L"~G^쉖履~-[f(\ɏB hCJtv%Z~<̐ M9%:2T^ѣG|ȑ?nΜ9oFRX1݋VrxYNKRD*-jcՑ\OCKsdƏoРAZ+E/KNK5P~HuQerH^F覷#{vyN.:uR t@PK?u Qy!т84iט1cWF-rTcǎїEEEeX&H#X>&BXwXV_OG;%`pz-ogwRiqgMSzrהDi92)cdpWfAAϱ|KY./o0 J{{ih֭ӭ"џƍӣG:>/_@y:j>Ƃ8P~ HA2G}y7@>}dF -C5H[ѕ.sCz-r>7ejvp#3O 駟2<?$#Ruk+BH~hØ<)磒zQ (_iчXTul}Mؽ:~TJ+;ٕ L& ^|LmPK$3?Q\ΑsPs 22SGpL%rXAa4kLNjT*цTSVJ,)o*C/v~^%/Xߐ2Æ-?dȐTrXZpҺ \$ZN5z̳M&B~PJ4%B%Mf(єhB!hJ4%MΧ0 0J4%M.-YaɫDSJthaDSJ40 05%D3 0 CD3haa8'g[؅헤 %0 0 >"^lF2aTDSaad?6t*6l0lDSaa(яXIބ0 0 %)8? 0 0chaaDSaa0 0 0haaD3 0 0 %aaa( 0 0 CD3 0 0 %aaa( 0 0 Cfaa(ц+q|L 0s%ST`8~ۼLL&H‘!Z.SgwOjӳfv4=3o~R!dh,K+Pz2ԭitwݰy?vk߂@˸s /nmnFi׬Ya-[mѝc#;=]c;TI{qN8/]m/.oy`:]Mbqyٺu^KߺH{~Bw@k ڏ):i+Ih,}+Et{8."ֿD 5Y~{YNc[נS'5#oItX TVG Fsk*bnM/Ez9Rq8~F/ҥE7k$X]'moDBL_:F.[4rD4:Dŭhk+EzFItE4}e+ᕟ~l9y׿ֹ>x5z1h¢hФ'z'è!v)ҳp'3Vw<2oM8dx / w٤qm_3i4mVBe}Uu^>mM>A=M~߱p>mX=Ϟ>9~_zyiqstwOgq8]|qX]-M~.>to`QՂSdq٤MR?y9ߡ:<~_L}gNˉd{-/+$Ir %G^ye!H'q8ƯZ)x[gś/p-3߹lbjhm}~\tHߺK\ٝOzsk89;:}vvӂW]׉q9^|~GS']mvXDϦH߶Ko[:ѹsysgΝ;?Kw=ictaM}Hv9{=[4śe,xʼnWaQ¨rJ!SUxCxū겜2Rnorz%ů` 2Ry(p]XVe꼜e9el>Ab1] P]t { @A @A @4޷'d)],}j4)&Va *isVUz5dXt;'3 8DĔ{gڝ_'p& bQQPg@:Hҫ?nB{Mlܻe([*d&IT>2g}]>IH&ۛEbmހt mYd..ޱDְ);Db|3\wZ5Cвğ9SZ)&hX~lyH6Ƽm>=?p`(2@u;C+D[ɉܣ2c۳n+H=8'A:kJf)ֵ9voZewڷ'NJA[92OG#;i3Z۵if"k}e$˵Gvoe6rh8ilq~, VH[1ǮBKYH/ζy|XOAz7`Y8!hyl/ZtbE)ϏgG6ۊYý;{.',=>e:V;VecaV[1Ǯ V+V:2>JbEވvĖ]BU;Nev؝?D-&weH6bM;=-&D{=p3>IfW1{[9cbßːbx)+H\|"1 ^MM݂lڄu1fU8KDbBubwlb'Riۗ&gݾ}27 ؾ1'4] u~@"NmЎӉX+F޽Cq+=L}$\v2_:CV'j gVeP]HY&ɵF<۵yth3Bj_|ȑ B7Q9@[c9O $_X)iJtz9.\φ_VrzY?{оn?sFx55*O1@ϙ-G:i2ap…Iit'DϮ~Ϧ19 Ii7(Xi} ',qfBz`tI"'A#R]G#?:"Vћ_vDyײ|'"ȱ͵r4Kxg"}bD6L5gێഥbkLVJ }j.-󺻻*lZ\rE/`G~HC?ۍVn,Ңl˴7qLu1pVx#ɨ SEv)XG~f3)&߼%9.8|̂as$iT@:V6Ҍ/r^HtַH @7[D?~ƒSzdH;z֬3:4dyE#k|}W?""GOͳpHSl$>4 cɑrsT8j}Ij;hdH[ *wJʴ͛29@8#iH+*C L >WXJKSg̚s˭ Cx r [tum#7ahB&[?l*EzI߮]j"M0ML r/y忨z :&@wtԯ FH"L~:Ӈ_CI{VU4E-t6"l+MR_Dɭ׮]LpNE&Dc1& >-I4q+l +G-3b<4H]QC$my򿛻DI=q8F(tTQ L-`&HT\ .J:HT iM+}x$8,E}i3Um?_Y@:Laή 5>)>h#>x[7w~gő0<#}"ӔZG0(Gza[LK8Z8f44ɑ(tGyHǞȑS=w$A/)D_#M$WL2@a/Mx 0HKNR[o;~it²Iѣ$H\k]ӓ2-̙$ -ӼH?tE<:#WG;GHLxxdLj 7ns4eῩ;-3m-8p#?zK[z<9bA&#jW6҃XeV)--vF$û.:jn}Ҙ˗>dNA|SDzZsSFܷ籞&cގ5)`o6 ޯ Ռ]|k筴tﲘ>zǶ#Nhy.ԯXh VZ^3-:}v)ѵBC_Rf %wC/ݹO/~->jR7S>I񰏔:!]/mL*`&6yCKԇ8=s5Ķ֭ywUϊ"$Fl MH .[vϣcw_ Dwʟq#M /222B%QE| ;5FZ.q(FF&-q@mR9H.iJsT""_]5BND;cD+_XGF˷E{=* 4>i-"Kټ xo+LxK{ISDO{$sG6j/b!dKw2ԏّ<}32H'vؼi֭]{{|`RXcFf'kuG0bxJ\?/ƹY4) Z dr$b>#%GMK~i|vtD ֚]UdlHcg<Ԟ*\;>~n+[`*t隣Kʕ+hRi'K;h@)!^gV}, y%RF-6)h irEtG ,0^ i ?V4Ky?=kr)CեdP&"bKDs8N$_LΡ|n6 k_̗AKҠi   LM HNJN]iP(iA4H  \ A @A @A4H@4H@4ii     @A#}{HcHKi     A @R$*`w* &CZ N3֕A H[^$a2ޏxS2D_#.JFl0׌ $Px5/K_\ޏ"s2Llan>v1kD (=ܾD;AH\ NxE*!F PRt1ySF϶ *E6ʒUy.ۘ"+.;˥HB.@b'f)HWXPӨd )*.jtVq=UX`2* R3T57b-я 9E|<UJRJkKW\⁡t&]i!ҕd,NIW!Eqg!E'+-ť0]C)OVzL+B:* +ӕݥ%]H8HCNX ;HC+.uVbӡ":]aEzj^j! 1Q ɚJR:^z2+dK- ߡқ!]P\FBeSŐNct)+=Op2]U:fYMj@V4 i Hw)v49JtS t(ӥikӘH+KWR cqKK&YGiܐHOK s<8uZ5QOVV/]}NQ7(S)]Np\jATMQ ҷƳ ?1QJU"=844t((HHW:&\S&CZGLJ_~g<_2i uH+ۖt'@xzR)PVQX?]К&%HCs'7i: g: ͌\ȗ.&Ko5KHcZ/RK=UQЩa-/5xj!EtAq}2G qHitC{.ExEi:jxtZ\)*d[ iuz mȹWr}jtzYYF:M'hj6N<= MCr+]/'kxj<m~Q+z+/jMFa@;5Fqb2ӀtCSRNi@i4gY(mXR+]/=wZ\~W@x tà:TE5'WZEC']Ч<"U\mB.K &3nvoEQS+^kZdZ\$_ܤѥ6J" )i7j-cu5Tj $tJQ@'Me!6&Eڷnȍui(`—9ʑB!@H@Sik|oYz#QqY(ϓ=' (&$D KsnQQ#Qtys!c 2ԗ @ztq+Ϡ9x:d(BDM\&ΉDWghƶ`jH=/K`<4i>5qH'cN2dνC++iynV 5ҳNDܦMfG|$jⲐV'kNr^Q_I3D Gz>^f4n5H (ˈGy9QTgȎGy45-ɶRCfS Ώ߲G .+yDQ!;Jd38 j$@H@4H7HC ~Ds|+D?qs^(%@ΐFXHً'zf6Hңy6\($@ސޘt~$"Wg2? mzz8i2iHc/\i=hG|1{V4#v>]~b}M%}&_i] i] i]W^ҺZ#͇;uKgTЧi,<7onls#- iOIObV{g65K3Ri̚@ݑ\^Q`Tgp~to>.(+z1 ] Y 0򐖧3I=4Vi]( i?tUHˈ^R0+CZ|P -\41&îi %*ƘD/lAv۩e=iᵚҘg`p|o4-t1qHè#-#0zHEu_;Bn=0Wu7lu>YzeHKU;}yyҺ3g؞o_OKBXE1L~":U!}Fd:w^Q炕iH:?7j!]mF>/GYHUݗu7+ooXV4;"KN_H/C˃?H(Ҍc?S ҘJ$|ӭU!Ҝ3y B:i 4{i iq"]n:ǣ0Ŧ%芐.duP{]>"]8SgH9XiZBGHF;wKtҾXM/H{?"<*H U>a ;4w*CZ/i^mhKq"];4 ?in^ck!*>Pұ_ֽCRuH rH랔ruUHs}(Ɖi]̥E+>r1_i {x[ Ҿנo?ȍ.0^"zmKFZA!DZ41C:54+ג 9YHs1ʑeC7ttCtי.ltNN{q?j\jŷEU \D+xIƋ;! ơDHFxKWs3!-ݣspshki]=w(:d*p!\2I>xoX a~N-v(Hs0U?|4/JQ ekA _22{[ XTպo.>q$q/EH;qH3bn)RT4ƀt al4q]"]`őÉ4i6 r֕"]̥bJ4Lc#MlRu֥\X,ⷞ+ӽ *PcG_/P ?s >aҹHc#BXx}әޒ3ƎCbH녑ƀ4 17+y1tI^i_݁!-N5jH^jO_2ֽH3Eu, aғ|~c44תh*MsӥUMori&}"/SDOxőƁ#YKi H X43.neXi #ːii̞"]O1/KEӻ)>H vL 4g06VR}1%ځ~쒑f;AH뀴iq퐮`Ңrǘ2ǖkٮjʞT4^ٚ"]Fx2Wc:/Ni=H#M( 0&invxivAc͌/-i@{;G"qDdL|:C&BʀF~"]%HW7v2JWVH7 i\EGzrCε<W !'C׽"gJȓ.U@tIV w ]^tzMj> R[lG\bXmtJ!@KAEU`Ҟ?CgQFF lTtmdnlC6לl=v 7\*-OkKBZ>N>PJ HuxxFۋ_21S!FgO:mHY 4EZU:Lz @F=e'#SM HutɎ抨vcM#>%r)ҐKJ@9W4  @zH[w`Wa|C ܒDA\V:OB3伉fRCA M_yށ^5>5qYH+Γ o"i#mMncAZDI\Fkrky@#~Ůwм$A'jٔYfnX:NthZw9n :i+vlfx8ȹ1b#inxi6Ab~h8JoWĠyPI#~Ůeb(jP@HO&0ޑE DtWAi+v X*fbڨ.EAl¹iUYi+vNmo -x ҕ\p4 ]HxҀ'D5ҵA*_vtXk\44H XiwH4իvtkWGiP="V ^wHXiP]ZBwH¾hhF5XiwH6 + W_Ѷ^dҠEA?Nie3cya A`iP(4 _K &ս^Ze+ _+NH \+ _+LH VZ+M/ft iiP LGx-:q<O*fBҠőfF/ATC' MyiP" (XiԱҞ05 >tn?TV05 i@u<SӀJ{}B;`jPMLSӸH4zҸp?խa3GuҠ8]44( V}Vj_ДB`2TGѳ9`AE}int+ .*nRonXiPtqnK!a-c%*4gǣ0襖x{i J@ǣi3ӝy {󰄩iFiJҗ.4z<ʺҠ8~\24(VSӀJ{w4;`jP -;;`jP}8H~xw4 iNąfMJwF+o@B]k𥽃;&Ʈ"aZku8Hk%J 6Vei 3C65GlW]!%^=.@n$ZHkHu s*P'C)\h==$UiCfW.oHdpBڎ. 6=,Ks4nј"d8}C߇a\4Rqa#i-dHciHҭUXDͶ1h~²ߙ͚kzs7ui 2w4@pdVrÁ49Қxeo-BJ}q@ZcVaHc2;̪@C9ڋ\$MjqѸgKZ  ;מҔši ;i]w¤ɒ/Hk'襱l&uXV)%0Hx86%9J#05v]5_Lxk%]ߎ=k].̽\5<H[j\]LӸ0x1+c%({&59Ia1! `KB) R#4g[lScWLxĮʭ󖺣fl[걎asrI`[;,3"qNief=T=B[M=.sˎf4)i^_rcA,iy 1ŃӮgwqk&ʶғ̅zi~'f<(M㞾vIhb1qH˻۲U"=>5ӞkM޼GϳZγm7;\-56_ғ~Jo 93_Izߏ"fnsߎ;ziKSӒlK"t z|w)R,v9HIaMľBQiy1jI#]tX,B_x8LjKmHKZgl i%x?5hJIMN:uHɐּHK& [iUXNO&sO}GDM\pCy2?>CgvV4D 4}Ln=>瞢, Q[ItD5i1Qx Q!{D5i1[2(#Q<ٟQ!3;2dP^C8 PHiFiaۏz.Obch0n H ~<{Dt1ՌF:Cz4;F;\($@ސޘt~$Lb< ]wH?|mƉL+ ]HF釳N"PFt"=?;.{[CD&ҳJ/$C)4΍>~EFݭYp=iMY7@u.i!^4i|AbP¥ƅ@ȡED:RA!mHi@HҠ>QX H*B2"HJd m~sUi#McHt WO"}.4ßt WnҠ F|8o[-zlܾjVM8Kd HBz]]cO7$c{cNVD}6bO-U o׃OӚEsm7'<U41Bd'(%b&mY3hMU4Ü)O/FfұX]M~ґQglXUҩ.f|OoA>"=0`Ez,rbr{ZOm'A#qhDz>1H\|"XNc&NkD@MH|u<',tx>pvSU"/ZkeӠ@T5 j 5ҽb4 &z*9.,PIϦE@wHcYu@aWj2*S0&(zUAWmy#ȥH} j? DSJzym M_pˁ3IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-tiedzoom.png0000644000175000017500000002564712277111530022731 0ustar synthsynthPNG  IHDR4HhrPLTEwqpqrz~}}~|||yyyxxxvvvuuutttsssrrrqqqpppllliiifffdddccc```^^^]]]]]]\\\\\\[[[ZZZWWWTTTQQQPPPOOOMMMLLLKKKJJJHHHEEEBBB>>>:::777666555333333111///...---,,,+++******)))((('''%%%### *d[ 4PPPPPP(bIDATxoG~HY2/@ "&+ i@%`l ҽ p$pm† ld,D6k#Ûzq=]O]U35OR2k?]=]_@BjaR" "! "! "! R%'Lqy>([bN_73ZFAjgǜNj*[~I/Vg'r%E2 VURlr$(VYϘ~eޚ 0\44`EYˑl[Nq5ꈥ%*U9QS 0h+!&J yO"/5ÛW@׉ӥ N_&F.ڷo6wFosz4/쓡/.VEbieGSk3g`0h{Lx%DIe[ Z0}^it)Hxf:ן!Z箥 ωba]} :YpnvTi߲s7$U^rlq|TkKͩ:(I,s3'n;W.}?LǞ/+FT7+!-ez~Ck Ha/s/kMQW-o=KQ>? Y{?f'j/3=ju/S9w] Hzӝ6N׵g}㇜XKD/ӛνB`9`i{B[xq^g ??{ oF7mFZ ~%.B=xu? h`4@@$s}K  P~Qfb0 NHHHEuW+J\-# Z<@@@@@ة0 WQ+'%": L`JLύ"8      6ɧ`1xUZ9{}:S<uz[ʼn 'V-<Λwjv(5ب_#Kctl(:z{]pQmm";`RQO~5`w NF}I0h`"6WWWeeit{/s >yПzrǵUs~Q<_Ypj_jz(s"L\TKrRmv3rPΞ jXRMF;^ :G0hW\1yZ/6uYjg   `\T 8 c F@@@l IUnPoCV1lBj9IQ=3KM˝>}Vr0`G,*7N{By]}[ZU;T d5Ь =AwoF˜@X4 `F@@R,@)yK&"v&#qRLFH : t7*֬a@ ͷ"qR6y[,*Bu'# Zk)!h`"Bj[ w<@D4 `oF@X͓&ې 7Qٖe{C|PkSpjZ={S_\2HʉHzeKI u,@@m 02 آi.O<e~ȳpͼܤe#1gD72g˹QH` ^.`$@b Hخ 0 | ʽ̳ л@`M  \5]cm (ٴZ̛[yS·Wf ;!Zf>0\6zԺ Y.w3'xn0})ɔ `WRHAS#K{;9L< E eM3 {7X`N4C2@ X{dH[65g|?P6;b's栥7&g#.5 `qyt޺i$;G'TN%N%9lFs]=XFJQ0VLw 0I`cZjYۑ 28@EH"@şfv@PT7i^H՝ fxR 5{ NxB#&T^}0; hA'#[<%I>@Υs)L\:_G?H;(jϗM`d:aK{B iϴ$cH* $=@c~&LgXݯmf`@+O9@}( `9}"  K4R @l F@Sp\qYj/`@wULJr#1RS0gsI9|9$'$,;IHR澐$3ٷV&Yy`4 `@+0 8:%w  FR8q nc*j@g3Y_zP yn7J7+ t671@HI Jz)#1HOHsS0``{_y# o @ޖ U@b:W\0_PȕuJ=2 fF>&^<@ s=\ul 0+X^}nTs72 ' e. N^ض&#==0 X8JOwӯ{ @kR{; t2? NDH? @IT♕iP`4LJ-+Wѯ 7Uj^6@^)8!u!zk03#w7zןy)Lz%ԃ- \dN&"7 hQ0`NHb@lPg7@" @^@@jT @2H4d2Z@hi0Ѷ &Gj닾Ao@VCRP0i*̘~Vd]uqX4قG@@@H!@@@h |Fː^hDsOm 7ab;pL;5;xF M&BSn, ZMg@kӡ)/_@Pr*`Y^T#`24ɯK @)'U@0܏f%!   :{3b@@$l@^8 X4 Rli$ FU0F6 BDбvz FB2KDB*$ ""^7Xl"+t jS3 Yӳ %Wj<|}ymzb{+R lBݭRe-|~\rY-^)nOM?<4f}N߫ )B~WhN;[Ec %*$/, ^!f˧9hs +x&.-s6zKT([p IuӟmvϬ|Tz/A{ӏ%PXot^;k;na=^)Œy?ho+%f/UhdbkV[%Wj?|_~cPXhfv so\a~WhNFB@$DB@$T9](W_t/ŅK['EX6'@_\/tnU|th:nyv<*!:ѱ>A44<ч@ +c? ҎW++`qzsz-iO? 3st" " " " " Rt&n<o-p1'/-O^YLKA 5cy3!:)/ ۙ$ZNHFުJYd`۝yjc:O[˂L(k9MoTw}Ezn'J?⮥x ~}൱ wGz/~pInҩ?#?ߟ?/Sn?;3br\ԖͩU%J%yj'D^'jNSxU;q:=VuNV y4?3䮥3Tyª~ͥߞ$ދ}fiJ~YyyNl>Q箅IڣߜZU _c}-7 kirx6jR{(A;] RNR+Nuv-W 9/ȥ7ϻk78<'!J|z%DI2[frxJ:QzOnܜ6=zׯskOg'{%eޓZCoh͓aW4:574VebNe3ڡmgi>X'!{F_Z]TE,;D/G+> FHQ\k)_ 2"*4ό l.1 Y3֧(zf.B6-cF@ G@D Lk2W%:*1 ګٽSޯp<kj?ͷE:^eYY` >@>l'zk|D}%)_Nt  xq^g ??Gow|N 1ص#{ okN~5tn)kvn`^}Rh`^][u܏evm=cif)aY~ oF@6(@ٸȬ_yEye;L>( NEO`liU0[U Sd>@ ?P +Sц7XKڿ @l)UYk2@ޙ@L42z',+~ĢYrUre%EVd\UN>@ П~Q5,z4h EEY-CwTh `">Nh`">şfv@f yO5 ˻@L\B.=bGZJxB#ZSz*q]JNdA,3/,\ PG1Ҭ)\AyN1/)F25,yf-~ 8xخ.}6> fYwt/iv;@7#  X"@>o+/+6Y @aTl4[1*UܩCP>_"3hS2t۔@@y hf2Y6@a@@@='l\==Kw} R|SU L1l@hz4b.KB2FdL/w@1 ) $Yd u2@T^-͚-Ƨ!K3s,0#k[aY779OG=M~`%h @lke^ bn P(v8@9*n2-@[*On8&њ\n`8Sh5e6:T[ߍZm ߽ {,2mKd PI_<9BTna=^@1R"@嚕C"-t|anM)@V0@ֽY[dr&{`{V,`n ;KcL ``~@u{)_lFH9 ]~'l}+#2l F@@Ⱥ @, kwA6@@liBѢ|#(w,L4Aϸ8 2՜rQFZY)筐RI#3"0Sxd0?>$e { @, (X*@W#`ehؕ-$窧pLۋ$7Oo6!!*%`lS(=S 3=s@+9F }5@HbHFg^ᱼZc v@K# o Ic 7 ){`4LןGz#t64͓ 0rk@ (/ #.K H$Dl:[g$*Hzқm4"]bzSp4J9E ~Ν %pp[`# u@i*8Hy Pyt G tOCKEԌ۹7p Gf'fM j+`:k#`@Rtr־ MX@޼m)#Ӳ1ԿJZdIyv> ˑvz?e5e 1N)cIN`[zB5fddx.!C?<A86S JzRf{#mȝ#JS$5@J$#P*1 φӫ` UQI  vE`G]Dg>I> 0_s{:&\̲;)RqEL_*%M:zD ^4 .i"bF@@9@  \N  tWh[G@{2~5Ey_4浘He{Iw~V{Izdn)Q}F0y[_lh@sД{f ZME:FR)ÏHL35Д Z( M9z{]pQ-.3)O~5 &U%r&=~3f7s]Iт)/˔`NfC0_spVۖfLL|IL<*5=Û5w3 N(HPoSIޙ=z c+j:ve-"F4![Ñb0՟Y uaZ@)t.Hٷ}u@"EVK:{?f_|,6t %Doju2iXU0; q @@l @JI5SD&CMAcRӛdQQ[ 9 S8@JTT`֏9#`">N8&h`2>`!@{^ EQ 5.(h4j>dewf1kx+gk# bX/ D|@@  6>HcR5| [1     ;*XiI { oP}Q h&G@$ @U0\bOo`LY-CwTh `"@Nh`"@şf ( PO4O9e P*/^-W̎j`:H=Ф,D@M݌=nF@;7  RMÔ)!v4 vut,gn fBB݃ AB2KDB*$ ""^+!Xl"?J+t j^ ==0ZrY-^&Ç7wߦwǏ~,"n, vslV(M§%WꞂnAVDcCsXǞf}x6{;W(o M~ig~,D ^!f"ބ-@:Z NNE`<;\lߐy@YlF@ZCO}i«@ ph8|=G4㇧ȟp}z   Iٕ˭'IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-maxima-datapoints.png0000644000175000017500000002603512277111530024507 0ustar synthsynthPNG  IHDR ?PLTEm    ) 5S^H1  #!&&%)**,,-///000112334667;;99<5(?3A=A?A>I-] '%C>_F޼ ʊDĜcԪs鶀佈ڷz}dyxvsrunmnhghccc```]]]\\\\\\[[\[[[XYZWWZWWX\WUtUC\SNSSSRSRQSQOPOMMMIJKEEECCCABA>?B7=Q,j-An.Cr2Fw2I{6K|*Vm1_BV|7>=u `2bB zjʿF+sx) u)(Mv_hl>RSaUFPSk1ԥ^/G愦]jkkoowut/w^떔~u $aw. ;{r ?^ P8 Ha`a1Mxx6$9mPr՝P6[[VuSbF?_ na=3;t/gYko61Tinv%jǯ:;B5z>4Fo20k x1,muyEiッ€Cg[aI=ituҲRҶRni.SQZ*QRBJ c%}nkG?%=(l< pAd40z ?CQct_T1D--J_& b_>=u- k6wJIټ[d"?=m_s]d)SF{Cb-)=H?&2w@L~O>|;?%4UQ;>|J7=CZ=5*G=Lfև63ڣͯ(\;+ / B~3tsBמMbzP|ӎ y[Mv~q--=^0yCsCFD^T^Z^P͔~QB,)A0m )iMJ?pKnRxKV>+7vBpj}o gAW}d_ع ŃpH/-p 'a/ a. :C+mT MlKKesuCbPMIJ{6I*w}|ͮC~6I ڵy?E{M7&o_}m8(,6GC ێ[[/І[JGJO&q~w-m9Fqiyz61go9Qz?cN?"c~~a` #?$Ko"\v?4Ls`;I7}"o%uVnA!2 Qʱ1r m8)#%| "#ܿo[W>XQZ*gnRT%+F_)?Zh~KDGσᡑ}qk᧯=^Ҽ H 5}BKdcaأX86pԆ۟ -|$?6VF׊6KϋK ѢFהM/}-ǏoD~߼0-hBSQ8vxcXJ_NHLJ>!.|5Oc '6a)U_N/ೀQ6a)Uo񈷦;6a)U:ˈrcǰ4(-s,IoQ/qtt<1+ۯkAF!;VvSKABRghIo^b1o\WW|~ƝNeJې__dkRTkKP:_БĂkFds v,mWD6Җ8>qmɆ RtS[-+qٳyߠd&٢Ek+;VZݿYq='sUkKPbjO:VmTKK#J3Uꄎf*mI]4~7+SDU|oߠ*]`n4cf}~JKom(u^t H<҈Ҷ]3VΤgZ̮QxLnώu8G{.W񾛺^r(Q=k/ίT4$7w Zőy%N"|J7$,h gQ-Cy dI5Fd^+\3xƣx$_H0ǚEskueTfKVn$"%T vAJ7?'ٚz6[ŭoUvL$oHȟOfK.ϳzmv"sxl{cK[!׌RzZng'h`1#6J+Y那} XH]ZyAI_4 {R¼M`JJ" yV4^8x*\xHJ;QcQR@4LfOEҜV[cZ]!vBM跥wMx;HA߭DJc(N&7^#ms SxRZX,;Eߤn"5`U(ŋVm sOu-Fk N_?/OAK##-'~ؔ&F+J}xAtkۯpv&Y'LQ5J`@|ӊ5k֬\ZJKH|JVU#,% 9m Hsd`Шh}ʕ. Jl4J9mfaȖN}#qN־hZ?#PSfvjۉ:i˜7Hi*_7V:EtysFccŷ~fŊ̥E׉H AH)M V6[rW59nLaҥ.Eߨx500p3]A4VYUyM;*,ɖN]#YsViZrwCTkEZ<3ɛ##ׇ:WWM"|AO4h"}8p!I K[3`/>PQ,v֋:K3m*|C'qM9sFɠLhkIq;dAV 8J>364tZTZ2z{eݤ]YWxFoUTwǬN >\,KC_(XTJDhdH.~JIƒICbziKZL˗Y늊^4JSmi2$ ;Sd˿ݚSoVki~l)4Sۜtv(m-M te%ɵLڹFinz@4JPTZSK2eQɕ?j)Ƴ_S#GJy\Ee`ñ$9EMl4~m0-^A^bon)"+*4gN[u*RyCiɚiP&-iو4װ;v; }}jjuNw}uebRxT|HwV=+]tݕ6w^i  _XKG4JRQش\=Č*m^& }+wV=G$YvaK`wsM18 wdi^g鎹s9,>3SDmWQsڪo I%9;]X!5 n)Mk1-PFΦIOoWqWkEiﴜ+TLgM_xFfPTҒЮ.ҏzG OY?Kh^^&ZzϜqd-Of#9"zsEp]L =ymxeJsܟpJڮ^^UJJ҂4ҠB~MA~J3Y&sZiÌ*M qJmvgqTliIirfʇIܺզb#cVⴾO9{ Z$dKk1e>ZOӳ+_dbte`0!LP;frx rYV;5y,WKA:!ݶwJĖ.4᫯-5;GtPGN#_s+e\b=qxc++M~Z+;]QS^? {VӠLW*qX-W؜dh_U?U;sr;=/K~o)i\g*n6ndY:F*z̴prtJ餷y _b#5ZAijt/j՗͗{ ɕQLjR1;+<- єf^|^%J!)Ms{E:0/ۯ|dnujdDLtg<=;ߊr%okȕ̌˗8dms\rmZpZV+ՖOirS|I ֯MjviIheJ˺R(;7Yٯs=W)]U)nĤS5yiq2@'cY:&"m{:㡭eai抌>?SCf}ħҪq0yG{^5@tvk٪uʕcMMtʍyy9j`~/fe2~ƹsZ9w"vdrF}Qt:=$zF^_x *:]r]e(>)кFNR}ƅjs-F+ɴb-MIe <7'(Ͷ;WJoF4yXVZ5*#mt4Ez$͡R_i*5D:o4\|' QZ?Fi(_=u}P%]ͪ?_WWYmϫJ j 9KLîsZ${\ڰ%>Pbw 7UظQUx7Ѡ3%Nrhji8u;'6*E B4Nwom6j4*BX%%鮯軥64ZRJwsmMV++ ߷uZ&7/(@Ww*[H_ֹz0D@i0g<$}㇆9(?K4[&􏘆[8?K,y̓{822bN_rqT( J>Ť*RBi( q-MDP8S5PƊF͠&2@XJCi@i4P@i43Ci\3.di( 4P( PJ( J05J8fqA KCi@i429 A+ _`§4M$; aVzW& 8K{L ({LKtm/ K/>=}Z PD?@i4P@iOMi\:3>N 4@i4P@i( 4P( ( `}q, JJCi@iFi\3.di( 4PDcQ4'@iP :( 4 4 YJ( J0Qʲ ,@iJ 4t*i3Y4^o]9(,-JBPt$), PK@iC W4<QqvLUY( @ؔFp$wBka? PDҖAl,@iqJ $ph#@@-YJdi"J0sƟїGAd Ҹ}BY`&+=J(  |JsrSh 0`јÁc>44qA4A|2@J@i4@i4S4.i4P( yJGׁрҷ‘PY@iPzҔC0>!@J@iurB( "^uPpNA+}LA ,@iJ/$HX5q0]2/VK, "ƃl_d-c!Z{n)C,ҷ1PY@iJ( JJj8f q, JJCi@iFi\3.di( 􌺳xAhd,FCidiQK(  J!fq KCi@i4P@i4PQ4 Yzf(w>hm0 K(ZRJgY˪Bka? DׅX`+`J/<G7A+]N ,@iJhXī&M tm -`YDz.[\V&Y X OC ( J( J"q5|L8> Fѥ4jiuP( 4PJhS34@JD\TC*Mg9<+4\{Uq\&~}JGFR C鰭:9f@iAps1\Ԇm j$w0e/\Wq: ؍q)-a8`߹&:ׅMiK05gP867XnKiõp }/lJ']+S%y氌ą .RZFs1Lk_ 9&[j?).ȍfiOزڰ ɴPRƊ8UP%ud/c-K1Z6\4Ű,mikB_\_1S+׌Gں0siKareAJ sذaC*(J' ,OJ+%Β(J%8y-JG҃DGďPJZc#VitO ppt*=Xs$K{[]сґpP7,x&Vr@iƤ%"D<y"( 4P( (lBKcBAEtv@u,( BSZJ(  JIAJ'4Bi0.w9iSZ΀u*]tdQ;8>}Ni8n w/ҍ|O[ Jp(Yb/bfulsm\l5oZhV=NDi??OV!-y!XOHt@i0YJgŒK_,>l87M@nܦl2uEPLTi IvpfȹE|<1+[\ӄji[-:U_>LZ&?mK6lF(mWD{ieYuBtڢN[quU6ӗ;rh4ȇKIENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-debuglog.png0000644000175000017500000002102612277111530022652 0ustar synthsynthPNG  IHDRPLTE¿֨آٛӔՑԏюύʛvuuBȃ}|yutf`{]wXtgr^lViPmKjFgEeCbDcEcP]N[MZKZKZ>[tz ZWhanhM CC8+>{ֻT<|[{',>#D?Ze|֘ڬUޢ(ts1tĖm֓+,7sXf&, aK rB0_, _Ba<>ݳ },WaϽ{Iy25:'K<&{ȟ{c\%>ysysy.WzWNJq[՗ e(/1[cO oga-+y]޽% ޗ>v2V#ߓoVɥҢ^d|H1Ŗˬ @b?o_d˥#w;W%J+6r>9R%?s,QjxgVxPL½mF㚹\/:ӷF[8Z exq`듖0+^:GD#Z&~\ "Ie k-xy#wM'"[}@K~>f_O.B| / GL#tsϭ3:˕>۞ 3޽S:'߄~BNé-hإ񭭅oOS>D_,k^xx \O[GW/N"v$nU,` JCi4w4h(=T_-EtJPRJ>JSu}zF{WTi~׶~88]DiG*(KiNApINT7H ȐMCi(m12cSܰ'*)f%ACe<pT m}AQ*4 AyU5?<'6^vb%oR YJA[+M^:w#T8@*~o=ud-c{U=˫(gys_&[[ӟ84;DvSg:Gti™_uڕqqG<st~^#`R}JћB+¾JQyUN?NJ{>j땂#;x tBcW:(M4W/irm{i4yU/08~ϒބBw/=LǘwXP:&/.oZ`#)kҶR=mӗcR'6^ ֟߯YÖKa(ݰ_cj`$Wt?٦=umv9+AvE7(>EV= (^մϵ#Ol)řc߁v`WMNxdٟ_iwRaxl(Oa)7zPҼǐysMM?Rv%RXBQ$ߨ(i(Jw<\7BJ㷇ޔ$THCiPJJ( 4PJTz49Sܤ 9SV`^p@i@i4P@i4P( Ʒb@MSJ;1V>Z pA>d;kت:ak*dUJCi( 4JCi.*8m9.( [鑶^ʟ.OmM%V*T nQ|UW/JPJL^aTR\nQkJTUiX QQe=t҆m|=yC N+JRqJPOb)G"m`,ne*kPKBWjPѕ5pyMS]LgehRe,<ºl[PSP+݂)(][uVYiALJoiX$i: ] (K'l%| (*S3(jw<&)-_^a{jt"IN vfҵGFi+- *QrXx$uP,Ht5ttw Fm\BQ)F BFxSF - !߮z +]#SzT (]j J5P^&PЕwtYN}LH~]T{V Ӯ|AI{ٳҥLm'YfvtLՙ՝+/l% 8o|xۏ-GH3'klvM"kgv2?S^7K/?w>O$%g_s[٥}444Ity&׹3ثZS@$$i:yΎLphUm[=FŔ^.ڂ[Iׯ9[P&ι.88ڣlKhee%쏬k{m<'{}q>Z5zhq"S %ޤ,MCDu[k5ғHJ^AJ61ްQ;һeZ|oU QKff ONh؁cړYu1u${o5l&Е{]򭓷&ctj9c)KfY䕓's.|Ys;N׍尶X\FvlF⊹ꮌcX/MmJ$Qn2i5D֔>| +=FGg= $)mcL*8-vە>.z̪4Oe%c&OXғ~]~dr#B!9#d6O3nO ONrkeKalRNط=Tڼk;̦mQ#_:HW= ^/JjZγf[NuI=VS6o.-TK1e,% g?d)~joVڪ0GlrV踶Qqsz0#+.m)FalͿaVb~uҺ{Ie3XgtZUz*#E&A~ ~/t+mJ,k8QP ڭH5J૖m2h7X^?u]_`ޭ*}Jqr_uް(s,Y] 2jd؆z 6 GVšqVb`ɫ(],x4R<;wm%f*Tr&%$o\ʫ4*GuQ}憦thw~INkKee~ǃ+Җ/PbvM|mw(oAiPsJQ-F` >/PPna!n,1c+:p1{u2PC=l{cT*1,mcb?;88cCM=dcYZ 7yPV{H60RQc$%'ڔú{8({+0O;=wdt(M뤕>l4ZKP}*M.[CQKX^';)4 ΕPzVW?E)MӖPҹkvsKl*.}J[f"tk?x+WgyݍtJoU/-㏓n1iX=[^K+-N[Vb}t]{LfyҖjm4H;Z:S|;FfoҰrWSe#-V_Jgv)v7gҰ + 4PJCi( 4PJ(͕vT( k@iLKiL KCJCi( 4PJ( PJCi( 4PJ!( 40( JCi4xàt* j(]j/Cp1Gx5K{,T{f+X7O7R/Xd[ K eGBLhkkkG  &! ###)))...///3349:: ;<A?&?>@@@DDDGGGKKKQQQRSRUVUfffjjjnnnts~tİ̪鿉svmtRNS<[6[IDATx}puKe(ǹdKtDl˶=vql9mRT}rlaLK.LJUʭc+K h| H%>KY#X\r uLt.!33{{ |H'2y,Z_%J"bLNJ&TS)ѩbfyeum}ckėQP*)&'`r*1.aL|yaaaqi)Cey9]YY5W_WuΟSkyߖu3uIy9"Dw>GG:^~Tgzw*vwLbsm$#_?O"!@FC:^z_9q3Vܗ1MRWmۣhH?#C>iO CBPjC^&?g1#/yYW6jiׁ?)i%AFPGR{/PCǤKY\2g4hF?_L_ܲGZ:VO\I@4'i_f{?H{r]U\#%5i&ktӗ!mLHH֮6"e˷򫦖OJ F'& j,M} ׿măF4p6iCj2˘ޚgiky"ݻN~R{CT\m<]ٻ[;nl>k7/ x,>&4ߡ*;wrG!:Vk'/|k/8 DS ~; rt͸ oZHoNxBFo~Ϟx➅r!ğ9mݝ"sn_JA=)%=y%7E3ė~?7iW62xo| =< 9c;uo#;w[G%;;K{A.:uO>ϟ0pv6ԙn ۟2.Զ흭}=pO)r#G܆74QG];Czsb P_z>d&s`9p>k9O+;P#r>,G;MO|C{ s~r>N8g$/ݲ1liz 'aGnև#xG|pc{qo>BiCO7?A|N^03yo}v#G t>w¹˹|^Ν|r>N·e#' -L M_nȾzъ30^u= +[͟gkMx@zP+;[;wn^g2߹G,%#|c4qd-4Ҁ?r8pG;c·e!|v~~=z)G}@]1ALtWHS6y~륓/}㾻??8=Kt/ѓ/}O{?J~%,{ M;io{c/w^r>ȝu;r>`9NQ{ 5!|kn!Pa];ֹ9w~9z36Nq 3ߟ<ʯЩG'8eL_pyN?PP*/'8eLdD Jir^((%tFAQPidFAAQ,WWk5W:+2'hh P> Lk룼DF<3;.dJT;FRM[H˙q)OZ39޴-ɱ/FU+My0=/ם̯.%FKCLؙdsF("lKryuq2%šټN+[Z st1mX"ƻt='Ѯبj:#4xm>#SLY mM&ZZv1Yǎw% Tcʱ9v_-7PUL9ǎRW 3i4+ƒpi,\j17j6wHWWfO[!;5M4\$2_z1{-˹%v+f;xSOEwJoc#mWMKx#s{s3fu3mh;3u={zdz)J%]t.7޼ ņ/VHB*8˜seJ7.,7Y-egf%xVw%VBL̝uML!yfc OdQ?6Eo%vtqN|^Ml!ǻWrb$2cYPje6(bOLs@ieXD蝐&SL3h^44W3s*i3}dp {mFm!ϱxe$ FAAQPidFAAQPiLϡԿHL㒘(/eR|Gm{L˄EOAQ]`;u4QGі7[.LJUjbcf`"듬oi8boL- hy`wxGLzrS D𜹓%|IwTP",,R( ̑y^&^ ;"e.k>Liߛ/va[1e6$ixn:Ѧ6rԷNZrS'=h\fTLވ6 {Wwx0=ş]:s NMT~sfQA}L$/ ֫plL tU\P:WE ̃+WnrŇ,;/2 }$@?UGwRƦ9cNX67ntwtiS߾ktʸ׮g:nqQ(@-5=:NzIQ~́7]Wh*=6ӌW_}Bd :-nU3n1GUc2qJǫ3}T\y{}4KvB;>eL;r&nբ9$[ܘ^Ot\&zkmq1$2áQVʝ}~]6$7PMd&5gϞ=塧>lwcozk?詈zZȑW,Dj\Ҷ6 ih&zFz֥}3aוPLHiO9l9ga cH!Bt.<ӂ=/o txǔ_OL(ѻ&eC:ʶSCݳL;R(^L^G#iy g&oE kn3Tc`TTʿh?u)hna(XP'w34}BPs Lyx1h8d*zbz+P6;Va{DLoo/wPvem{hyJg5Zr'|V9Md:;r,QP^מ7:ECZ#6ӷ߲ϑ^_bz!IFhֹ\bPz[*﬇Ι}E4c#oQ2n iС> Ӵ31OZ.{V | eUGY)LXH-UFxiG`s9 ި↚ibȤ|jNۃgY=i{dLg dZM37˶&LRG?-;Woe9cOpzڷHrsgLqY`O؋7QCEGǼ/~qȫ9sfLW9gih]QO;f)IC4EdތBU1=RR`^z 4m'd=mS#8iB3/e^쵙~(HXL.hڑ_z˯7&J*P}P$sӑ؋rqfR|tߘ0`>ϿwXLOz.wUG_^x/rJ Ax{Wou恨r x);GlBi{5X\M{0MԦq?~F+liZBcij_{h%)Ͼ;N}Gӏzv0o=LjZ >L_ -G*mLtw)_3 6X}t4ӻ s˙Btj4􆢮YgS.>}n_;楟_2~ӣ&gO㩳ߦϿmiVcǎ1nyfLӪ]z,MQ+䘞~#0_hgLs^L D] 0L3r7HL:{$u8Nq*KƩOMGf Ӿ=͉x.,`mob62c~ާ3OlY]yso/uSSS-Y ˩7=226wIz#2_H./ՃF~|÷_TO.n>-)o}lmD9mwi|B5jgkÉvkٸԶY>iV3it2-}$;l}h3oƧߞ([b0[zz|ctwv{qqa!N_XLO8`->KG3qSΎл_uwuE>.] T#J=)=Mk] nOϱ2^bzbs7njJכּCGQ8ykiG87jˁS7g݁ Vi9COy7n![.MYxpeCSHUŸ+>>tm6u.)0K{ rCS)ӽKLOeҩj E=`gD7‹˖x7m1=7)*?fBMX̴לip,0=W@zZgM屢f%nQ$[ߧߟ#ɴ1.O3$1YbZt[t.W8Ӓ=-a}:5d7sg~bO"=T&/?`]0.I">*YgGK@ X7ވw@٢x-n%e(gϞH`=)Ϻ:${ں<@/d| gZv 5DygPgUʰ%Cn{.JM5OOi#cO dz3-ɯFs-Y=gtvAM.;'$%k3SݮW|Ȼw{E15Ka"FJFtLJӬ5e̓SO P;+0E$9%0Pu [T!]y.~Jt )Z ~ӡ~QBD9wzگpe ,ruErkt#"1L=]]- -{L!Th y$TⓁo`•)4$5>VQPiɞFAi=iid;Rk4 (4 2L ((4 2L ((4 2L ((4 2L ((4 2L (4 2RLEfPP]iEdFAAQPidFAQPidFA)$V*DH󙔾1~}dùOt3y*IsupEkŃC7 2`zgX3C33mMi:sy0rL$1%m][c#oi wF!С3 DLnS˟EZᘦz&[fMn\84]Y>5nO/\hLǻiaBE(EiÔ#3g4۬wǒ(?q D֙$bSi$KIZcCi#=bΧM kvLƭ.4-7^l4=mz^73MvI: D֙LNw}y'wӱ4VGt6wPڕ@2GsYN<պ (i%TTT0M ?joQ񷞌iRZ@lߕ*(O'7z񢶧(BbQc?jBI)*7d`XD/obZ0(po\hЫBx\7eTug˫ejҢ8Lt w7D3q0O!U1-v7ڟ'z6 Euѓ̞&c:hPE )N)6\LG] Ͻ&3 *;Cqg:y*z^XGvl[@*07K^|0]Ly#tԓiPieByrROQf>9h٘tiЎdw?g?Y׾*P`{:!1>XwKG964x/Ӯi+<.C'y;ϸpmDbUh}3mn2?3!*u˃ȴ4:lB[oLG a:ZY3EZa#2]KLG1!&<2EC-QEg:Lݙ1mᙎ(2cap΅TioIBT/5M~a6`ax)7ӠFtus=")i/ |R\![y3auЗbPm|jIG8EO!W\邙+~7߃xqAr0E$~`Z\L[X8)) (E+R94q$UDɴ}I[;I!, N]h(*HqP9./X}]0 J$캦Ś5((5cO@#()L2HL=PPV@\Mdv;Eb hT^}y;C5tF(iKn~Eb hT^v[auʥTp~En Mk_A*XW $kؾU.L%4c b^&p,sSgYRn̴_Ѫ[B隭?} W,W{jM{:/rSeV[f bޡ6bnM1E.\M+ZuKh2]g.򊞻Eۚ#57r)7Un%KW PyE31>PSm vj./ZKhFo7Wy%cRSL ((􁕭R1W4iW9N6ȼoyƨ,N5evIǨ%޵GLt&=s8F$ `̘Lg`kiB>$bg1jIfNv.0[+x 20}c3 0g1 kхkXbz\4 %@Bװ\4fe03" uǺcGwhPet#!-]z.xv;_Qt0#sә feÙ}=* cNɮӃ _]#+ᑭTsb?!C#qB:Q*^d LPׂE=3| dF-ɶGpc6&40CbC# ,n2vh!؏҆M(th?gmWۗSKjQK;$5qMgfL,gV^چuz e` e-oѭ9 b{gz%6f+;;veHZfzg)`s ֨1׋.?:ǒ0u9jI`zF"3R]lӰ;xx}X5lo[W? KLWIvg9<<7ULWK4GQidFAAQPidFAQPidLk$G7+U-Di\ !gR^&<!|Z43ohtݏiP~Ytb >Lg,hIHLe]xiG"ӵ*oږMp`lŚ{6$}k.|~[:2B6?|f'qc#FCvy{mSW{.jibΤ4sYӊ0}3$wz2íp4$ș}$Ixͩ %oa|*:œ ic3#vjmYX"Y$.vN\^b^f,/g2a5+y3:Ioxfr L/1t{ꙦJuoz+d1}qShNڈvf|*YJۇ)C2}d;KwS=SS$%+g0 Cwvg.t?gzl0-6@i!k3,1m?K;XNGfD9L3tCd:E\d#>}f`fefz`f6fZLb/@Fb0b3͓xgr`A\d`%ݑ$ݱ|#,| e%1Κ'q5 ]!n{py‘Y3K3tڇaF+3 Vgx ۍBv U)16?LmsiYqgm%M-fW| #}fl+/,terڈ=im=4VKvýv_ZKsm-L7/ \&Qfjxs|=b<./oyĎb rdʹL*pGL+}[Qʧ鲩Nv],IT2xiRBv<"i~U0mַ͙D.49zV5D#2 W*HNiEQr^2XBW\y6_bZ/~ʻ]V|Lk R*t0"9U:NrrւT4ׇunW9\<.擵FL#VSDÈwrn bZS3gH4iYt|Lk6JgRBפi^V:M`h%ƃ^f8%Xlw~@8ēi\;\jsz.b#:V~fN&bmLo3m{vbeMf(bm`L^DluMŴQ} M. Xr~YR}[?ˉݎ.ɴP 4]ĦXe"d'iBY" 82jRQ8/>+(f_^3Me/XjTp%6shuUEzâGhvb?􆺩T82qDzj[֕w zWA0@tXuMRxCs֪pEUu彊fqLV.-\2YR~ƫ&g@)=աldO}8dO(t)a̠S6"g{2U/Cj2dZu{J: zҊP qy:Ԥב ߣI! X|&ՕT4w\I(\̑tB.k(!AL'q€+IS_/ı 3cw Sb+0DXL MY-Nn ͋i}Ҷ=`n1i6@5@cָ.C!9|,}c=<ۤq%AGtjUekf:q0GJ5FZh4wQ?zN4Xc8V܄AG- Gj !&fpk1ť[D}$^}^na T qӚU[0J#|x54a"` td0>1 an"F~0МI`->PfL$y3s8ŴI}|龐Fcޠ }Af<b͕!|j,1f+H49Z35Q7507]QslV033pDX59ѡ&u)bZsBϬ1/ )h\Hf }][ek]Ss} oi)D4 gA*KbZ9\>3Z@ MZDB[>ʃiiB&MO93ȹ&%ї0)H,>"\ TLAO,#3٢4]OLILOn,Ş4 Q֮۝iƳgRgLdtiMenL"kLCz$V2 ̬LO,LfL ٛɬH W WlylQ=7"Y ;4;Vosdp#6<,0FlMmkwip( tfiBA3l2hveflv0\Zo|ќXHԮ5%Gv.M=+d4=l#Zn1blQM[uk/E}y2k-=5Ʒ0ܗвnr43r,Gei"wKdn&boYL,xѦKlQ깍HjkR~P{ ޛ+GSkd(lL ޛ+G:9qa/Ji{87DXCr>^R2!‚H*I ‘"]x]+3PvV‚=L#ӕ̮=푿to=H+ӷϣL42L S2fAKtwgI*tKi=id`0[>腴QO#C1L׃1tFKgOE@Ocnx='D ,tۈdsϞ@lz)>@i{2W QCk^L0ٓ22m_Ud:t Ӟs#^ٙ>\G R/LGiؓ0sXHR(]r.-{2W kLG<*DtEQ\^46){D2A'{ՙиT[$Fdӑ ^raxƳm#`6YuzlLG*tN1Lz:3g|H1u%6wpe]#Ki,ӑR2]-e=a޴."%WYUa$ d:W/#ed:`/B5eKJnKP G折eX]`5UTø"zJe: uQLG&tUk=+QadRⱑ"3 7<c?7+v,~LGd:tt]Ane~m$tĈ1$W<".Tn&Go#u+7<}c:RLۑ]sjI%-_SPAoiCG1P>4tf3W+t}yƎk2@IT41Ml#"  fgi"P!f,Wpy9f:`:0*m{5"s*E;20M="ôD>hiG!|8u[JLf:iqTZ^XVk2@T_'71x4llBf=S 4i9ԢfZ^ RʹtMD"\/&TxN@uķL6?#bE۾6ӆ:Ls,DK`Vu#SG4HoKCNF. P9T"#D!3{jfXGMk@C j4 tDfnL-Lm⺇BVA.b&TkN@ڏĿDbL۝6ӆ{Lo''Ӭ=hpBHp:.ib2@TisĴH#px|s?b&a. f Ww(#Fc|LVwF")j^&Ugܺ&TuN@`4To,Ʀ48rdځza˜L;#18x<ԈX}*6J0ɹ)i8뚒 G7mlӼqbZ64v:\GbDAvVu|LuM]Lib1MӜP`ڴ$Ӥn.d4jbje/Lu$0ML)E,EI8 2 i]Sikʹ\4_L ŴLq]7`˄ |T'V5\&*yKRfhLZ4) PQNtyY 4ٍ>4&2dLGP{Qr&t9Od`+1{CŴՌE3 ܦp@D4A}.9bPy8v'Ӡ`j6\i;&@R>I}i{@僧L[a +"{YLiP2 n4)Pdc?}I@TLD|Cc3 2VI|=Lip0Mj@Ӿ,g,`E"˴1D46B\sQOi4bg3 :$bj i`Z.N)kpkx,#Um_cZnɴc?b3- |1Obڻn9 iAk/8LUw)fZe-]L{s97L/4Fc5C~Vl3~ 8L.-ڈ8'޽yLCLC^I"b Ӂie^9 t#fa&~L*i{n(](K3 L7ӤL`Ƒzf:DT`L[ޝKA.{=]P`3 Ŵ8X5cMQJ4D<=2؟gѭ/皟%s0M|r(45_{J`|5t3]7PO#Ӟ?dTLCLiP1m47"iLK3'MC%x+AeC49O/gl3fd:؜sh{ iB̯'枹gO )2ܔD=}.6 qA"k*fl `-yN@!d.`1 }ǙVoŐid:ʹO߄/(RR9&id:,i{h`I9t RNmDO{ %8dtsFc ӵ4POl=4ikRCLWhkU)d.ӡh0n\E4fw+&'x00 4f(ٕZx7;=2`v%.ܺa׬AACA_AQ Ӆ:uJ6"!T4J `q2+eb37f *crgYG>.W&qfN`37f *crgY:LKG0Vnrdcgae$˗;帄Ui#i჉Z!ˤ,=ۣLĕc\t LDT ;; s(%qX/$p ݋#B*g{钸r,՗ޏ^R,=ۣLĕcTzqVH3HN=Rt&b"54U*.1w4 _%A-3to(tm0ҔځkO`,i2sfd{o;{lWb̊^SdV޶.KbͽlÓǒj;ufzFbOa"5(< n]>d^>Gn9_NR1R`Eb:RL ((4 2R2WJ h^%X8T h^4J@9.4 2L 4J5~I*5t<2ROR eTtiq3Y;Կ\8,3)U8AQ e?$ca9 )P F$27.Mr=QՖtbOl ڧi1;Z̍|\u47CMTV@eTWWfOecIv׌VsS]WifBU$l D{rh-Q >C7x_(##΂r:LD_i[QD@t}rħQͤ51NӸēR ,twiH,uUzoݠ_$sѨ;ТD-h~7n*f$B4i-h"kB-RU_hN]HjPWǨлH~ +jA]X|$=ǽ{h&؄Ψ/EYSNw4 +2whS]/v\{p_[Ϣ _o+{[~OcB Laѝ ,=>7"hёGwQEU`睡ߣ;Ms!ޑ}ݾw&yc DWE=Ti4Mei7m fH>dM;'3!*.: $PM=ߢ ]=~h{$uָ}Kz|/qp3gyœ2-,;7+;7u,#[-i4&4*i7mUR a#Kt,"M0&HSc{]'Z>~xu{n[/oѻ;4 u8: yq[2έM<unhupvX',)4NiuBQMkf]|!ݯ?A.wD}O>xGDK/]8H޻sVERFWh{ 4s9Ŝ̹<97Nu=8ڜwFpJQ4"WeO,aۿk'ww]X (no}l#wH"աwn|>xBCs99|qn9:sչWvU,)4)M)4-ber\tr!&V,ׇߢt|wԾGImFuҷBWnyc*rsztnJ8t熠s ,,,)4^ЈWhT|˜ǕC;'nr{n->u"@ I[C$۷$,ඨsu|/,SڞF _.5e{Qٹ .q,iHwv|v78U9JK%|%|)m{[',iHOdbi ħQw qHSac H H 4 HB{ W& }WbLMk\B֡~ H+'{34DacuPL!`MY⌱B\G3[k[)S Zz86z?ccWr@AV.PgL_H4egzޟ٘qxvE] *ɵok6301jC>h ۘ4l9HZ:]^Lȴto^Fnw'[3Jrht~#,mft\Eh$B/ŖN$.wAPC-CK.+=:ɵ^Pbc 7#&vқK˕6"mߖ0L&񹉬!zjSċK};Z"K;F v1u j2f8=0Fgf79[Z!M+^/Z~㏏˕6"mߞp0۽=l[=C<.NdxZQ=YI;"]MOk|hH[1c$"ڸPa|h0?^/Wچ=Nj%W|#CZ-QMZհH/&É9x M қ3!Dc -LE뱑յq[Kݱ +xE'ccriGTߚH&Z=zZ/֢fYx%#4#|$@cq YmlO,T=Bs!5DUӛS룶BH&Y[ną@ҬqR5kB"52Zһ0 V 1'ksA W DGAVA @s!ra̤r 5c- d~Z\msTF`=`ksLs\ل富Y?㫟 #LBzF_^6*UCg*`X9ku*ZBLzzϞ-]1rA~vvD[҄2ҙD9ΣmEGt.%?^>=^ܞ@{@s c{C?>8;U1"z`iN=ґ!}IP>:U5PRE -۪8(rɗ.Hyɷx J͚@XD~*$DH>|Ww_0)r̘r[wuwbE 49QЇ*L0.=YݚO.^"z:UW֖"\HSl߼yaDj8 嗱UN cY]HB˶R#Վ+WrNdfnFR2kIaK ɕ-іΘ>d+_VMHǧi%[?xH{s-R$q3gF8':k=*4/_;hf.^ϯryr1ji#V%nҵ:՛Ј͆ qV[vt7WXv. *߾䞷-BrJC؋4[:=S.e𻿔忘dFЭ*ѝH +r,CMke1=MX V2OF8?_oYdDlJ/; 5!,#*rMB~YΡGL8o4? ! i4Sd 45H4!dXB!=(S`E)*Ҥġ_ɤYK+L`>MH%e!|E̴-.|ϣe/IQ k_Ԉ&3 2?O92~)nAHĽxy(6^m,=ט)kEjx(ƴAK+L_$UHr GKB>ؚ+ћ90,j:dS LuҦ.HȪMHJKw{j;/{9H`EK}k1<ޚ31`xLN sϯ^e|)џn"M#VcͼL\#'D|hbSy@eXڨH2ғnHO!8qQ*W?_``y-M*0A̴-M޿D[O2ҟJrY./~͛obu]= eo[ -]Є6;]]4uϗeZ47< O/+߼ֵ4eZ /+bs`!@dP왋8?IhxL*QONӇBRDZWJ'y#]V$Z&h8,t,Ͷ4z޶h=l䤎4%Ltu+L"#H$bGz}Ϗ^GtqKl=5 5K~=m әO?2=??\crUK|!i\jқ={LKUL[ aLS+2i\ DI )W|9n4yRI>j5|!Rr JH VbH#/aEXJutdxәKf{~\O <5+ҤDLC G<45Q&KX/ȿf>cX -A?^`F6ptyybKS VG|Vj|C!ZSpj!vu*DZp; VeRev!ZG:rYXƥp"t0ƪ/jʐv0ǕW?ƥk/ʟsJ3Uc?\<5Lq`A.Cۜ#CCԖ>iG:'MʼnM]ۏ0ih8<Oy Zz-dxA;20I%6҇1t ^Z`jx!s1b^ KՀbuHY! fŎ5+eÃhڷ-MzVղ ,oxKk@#O=RFY{梇NoQ;:ҷz{ëCg?9I l#ikic|iɼWK_bҤ5e fQ aB]vN1bDM*`D[*GK[eЇL2k<*$qXV<-mb.U!ZEf=a!lxgYJyN2_:Dnff.O0.ܾ=vj5:tldudD"Q}Cj0BNڐ&[NCx?_oۘthƍH!~.4ff*GC&oL@'e#mbB-3*,se&{ dBZ i==vD3&[Pz02qJt?OD?Lri5ΫYGf2OI?ɥ#d+M3T,- 2aMZPx:aWas)eX!a҇ͼ@U!E &OY%ZE`!e$=0#:̗VCl4;AB+f[Z?hI?dMd")3D J2l],Sx,k{ ٓؓ%HbtM%zm=,ɆLҴ#Q'60mEڭr5-,LuJH0- V`Zw Whf{7< tXJf:Q[)P]qNp1)L;9bDZ_oh{ *P?xHx|Nl;PHqt2G8ZayС(O\ (Xrޓ4rZ- HliA@vޡiJwO$HӋYKf %NH?QA4s1XVi@'A4H~H(94NAZH94Ҁ4 `K- tS17dz4Hs3ֽ8z1:4H㭧q/4HmZ/\*L ;n}ܚ'#4['ÛnGQ@d'ҭ=x9IrϒYLffY $#D#+IȷM\I^8G04,3wn?Y/GXkqfhd%&QQwp*62SS$m6Fo*ktHhGShO!V=s45cIx`NVh`"t:sYc=/i h`Y IӃH? R ,2U" iNVcF_SQ#!]9Gp!9w.G:'wgPH7 \4 -fKK^`:/>t0AHbx/}j4hi}bi :Q|rNVpc Tos\AK}D:Fe_<Ɖ#i@:@ZC5扥1&w)m y@Z7!]or9Η9vz;3'Gv|!Fjz@Ziox䃄 -]s-]K5B:sHگ\|񊴥0Ҩnry4ҹ!G}\*'j&*;65F0TٹHb}6M.w.yg4{tT17] eõ0<8zR\޹D:aH7ƝQRT޹i˟G>3DW?Zr)r"䤆Vp5V>)sc>t@֫iҀ4 -hKU2:ӐWΕ@#RsKjx*ݩHWXU<ĐF4rBEȉ.dټF9i_KPiE#-=TyzŲ*O@VH+jyߑ*գTZZ\ڛOjG]F̓Ԉ{P[-6!KSgZ ir@:9m-Նα!v--0 i'N,݊mDU Èid̙U0ȎSr7"m^lGjt6a\>4"v,Ҟ&Vp7!GOGyrimzS䄑M&BfkcVD:g0HMrs6s9y9! IJfr iFv3i6#mƎ4 t}Rϝ6 H$ؐ%li" -U)c@6jiHiFC>I}-ijAdZ0ِΙ{Vpƈt 1Hx7T6MiWA#H7硎i[J ii@H6^ã|ZZHqIp .7[+ #͏ͱF{6Y!s^GK#mi]qWHkV7<|H3F͂t3M:/2Kě}pigC%HsI-ԒA>&@":oXǶ4,V4Bj\+n:G[Zr!&@sji3ƲɓiU v'՞xcɸ4=iig+Frxl8hiэdrrfj c$ҕ'bT5y-mgͦ i$I,rid ==tfXHi%<wnV7"tZB7&5+S6>Az@ZG˦>XI -nK>hU7+j ñZ E]䐖Ra߮o ]% @ZJKˏxZZüQD/KiH 5ٺ  iu)N&9H#)X[# "I^-QH#AãFiu)jiIQC!Fѵt!mlrHb.O0Ed"m15mQ .ue1gܹg1 ^6.x(HK#ߵH{*LآH/' ]?-]^1 ui7ɡutQs}X>v+\X6yCb*hXzlstQăQY7=<'6,H.ƏHH.8FGk+iW;m{.x SU>7 M3T/]b%b<'- XK{6bstb*h@`\A@vO2OR7O^BpAl8:eW€"4p"yu6s S@"4p#^DRs@"4p3#ݝU~SJOvEh&FMKOzW0A@iL=m`@&-9 i@ii2@D"r{a+q_Nj}9%ٟdzi,e%T&!6,kTǾ$Fci@E6\h(cxl88U" w0b1c$/~Nb;#֌!ь$7NņQfjjtD4 "\hMךvvF{ e-hOM-'h-dG1 k OgI~QDp Y n\T&aZ}ܕH?=LBils1: HHz!"ݓxfezo*qt>5bvnJڗ~ {#K У dRQ)@#+ٱo3]Gt,11mпױa#]UyǢq%i;Dk5{g7G- D&@^l^l!F?C [w=9jl< my0[:@[JH[! XKK i'@C$HlyF9!] i~)ԥogĘt tjhiMQR7ͪKPKWD!ua݀8tK NJu [BuNH#]BC╵ce 1<7#M' -jx]"@:`x,;]J;Lo 8;#]2dZ2$jgW.!]oɡC?kx"iMK#ۊmD*tZ4o}hp"m1C0 m&jm.9!]rAL͌Z#4rX/ Y钱F,пk>lńwKhl`mi[% H #m6<-#Hг#]r欹K%'KHwLcGs6Ҁ4 Hi0<{ؐRUוxD|I.9 mi"khqG%0<SKH 0<1=ldK<iq@޸C^ ޱ2N7[A͉]m/~ĕ[:X[Z\elxiٻRug!]+Ҷ!vh`ꪳw逑'=HxHf !ͻEi~F|wNwS2tTƿK.]@:HMK՞DZ`U:{X4'=AKW1-ퟖƼmɥjO7+Cl1Cɜq9r'U ;N*QܖxD P%Ki@ǣJr3KS*u%,P :>j iںBZZd:/ ] 0mHimyli? :KmKG!+$[GhP-L{Kn4boU@4oP5imU*\>^H#9 -xty6ٔ`x4qB1<6hi42Yl9p@;Tn 9lsxrǼeVa[N lfyzHi,HF Ӗj=)JVw8ͺSG6YD9M|-͗DA < qF1himi\㡯GG0<@KW /Es}tF< =e3a%]if1x0"Z2RFz{8-.4t}ҍ4Z7mic'ijF<Fȉ#H w #dv)ϻ{mi@7[ڸ#[Җ޴%}9:{tZڰţg-Ug: Larڳ m|(.TR(XA%6+d[iٻfA"m\~;ysym_4 ͷC\-]Nwk7Ҿ-EF:! F6(/Ug#6jHWZ$t-]QK;q^*!9.ii@ڱx fxN%:ãI @ziiTB%Ŷ[li@گ j-M'ioҁ"KBKK3T* ]Z[i}&Vl# HWnK<@[4o}hpu! w6ZZ:sO1SU>BI0нąd14d1Zȥ,N AVi*VKLw|'XKKgz.xXǶtb*Q@GICH\ Q-9Cb79MLw|'XIKgz.x,>IxGf];՝bXgi" jpvEq wxlݩl@6\Bhjjl֢i5@_RޟLÜ*4Bͣ]`zL۸ OOCQL-7hiTҵ)4D']L*1mJƌL, ĝ)Sǔ`u8A~8kkҁ70 H t6jҀ4 H 4 HҀ440i@[50 Hӭ Blsehڽ؂n,+qqeq;h`TѭiߑV6e.\tR4&ʀ4\HӭZZܗ$ȊK7Wֵ44\Cղ'wil ͕= \  45펴@wzmq-jBK 50 \? H{mq[7[ji-- ງt 6- O3 khKߖSQ`x4ᡯ=lA6i-0./C#i@l馷 HҍhxhkÈZZp9-W+$n:L:# L{ai4tEZƥJHUt=xAx\@[?[n AKZK^4꺇չRd}+:2<܄}3<Z"]aڒ2U-A}[O[Msjv{XQiߴL<@3ikZ1C H73ƵL<z34 HWW1{h|AZ_{ñ.@nvm -RH MA#-6Ybr) {(8MKN.=ji@H nMH{EZl;4t{;-7=#-=v- H4`ҀnEw![Xijhi,C@ڳj`34*=#itHK*XI,DJB#siaoǥ'wSwZQ|Mܵ,_LJs<n)(ϒi:MP !R{z,+# ""2wxnLWȪxGka pӲHxl`/]@W'HEr 4p;}~I=$aCw+E,WXrNT77Ny#_t!b6ErНJa{ˎoI 4҃lrXII˖B"+$<,{itX,,,Y ۋX= \Sޱ%`br({KK@{o`oH{Se=aCw;\!˱ԄdA{o`iA@Ti@AvU7 8@@y~~ pW6p -):fX22Nwe78,KkzD:>G&;EcLn1NNM;]1>ކ ]MMN"֢)5tW6pSiibG0no!A6gNţjwfzh]MtO267ÙTcھ㙕MYtW6ps2SO:y F=@G:aKnŴlf{$hbR ~"=#1|ʀb2x01[Xnă "jjyk4 )O tрtb0Y,Gv\fӝ*lf S4htij ұ Z; H$G.&iex$iee}-A@]H9Fixb˴3olK r"jH &Gi4Y[o1ҏ>ixu1!!Mi~a0uX`WIENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-xmousezoom.png0000644000175000017500000000041412277111530022060 0ustar synthsynthPNG  IHDRʥ pHYsnd tIME!@"IDAT8˝a {cq?w%XQ*fEDۺd~'S9"X9C̰kE$`%=H 2@qfrl^[21X^S4}Y9$(ۖWȈJiRu $U* 5d&On0E6r_3IENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-layoutmode.png0000644000175000017500000000043612277111530022021 0ustar synthsynthPNG  IHDR/8 pHYsnd tIME +IDAT8˭[ C$ҲyXt1!@'% $I)%= NQ32P=T ?pdTf)߲eVXi~ l35O\IݠARSbՂW 8k(×L+4CM (shOEj8GPm?v0=|<c\ ^IENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-datamanager.png0000644000175000017500000000067212277111530022105 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME$;ħ'YIDAT8˭1n@)srB|44).\d 9@Jvx +}ɻ,}ibV~eki? 閼J;NAxs({Z]{8}|Bqp,eGtwh0pT&Da .ʼn&ˍpp#~;zrr3Mq}'umk8AmE&\ęΓ87*W{K  GirtA8?,qV̪MR=3A[B`Y@B M]3IcK,.B`fO֥̖ ߤiiLqXKX}{"J\e<6뾥1%b--B`Gc2'\i kgqИ!SdVQځD!v>3pR:u=g@ÑIVwB`9;EDdD4r JOXO-SdN..k* ?ٮt[#0]S 3VgA`1M C ;X!k<.n*} s"Րh fD2m@A`:ګe͠Kl<1'pf_FN~ 4~v@}3h+X.Q f V'ȁL(* D-S࿫B j'f͉@`ۜ[W,D_чߋ D-|ق@… |{||tx)O__>@Os1y|y/w!pwLa.<<\<<}ҋcQ -.z~]~\ =Xʁe#y"Q -Jk BT( Gp-čl@?9ZrMJmW30s0mXLOd/H6vp {fNoȁr`3'\C V>(9,jt=6N ԦLOi7M]3!Kxt;ߒ'oyL! |6@LD9Wo"S[%DDtT Me4S89Ҳ4&;4bOFGOL~{p}} ǷO%k1}z΀#hL|Sz )kR)W'9Jy!DZ<D[%p}"eȁXs;0׀ " Ɂ~5ɯ}"ȁs Bh0;E$ $2X&5URd])K1 x@u)))B9fLĮ>aJDy:iL^!I,z:FAxwɖD4V!Ҙ$ٕ6X@>5f0p "&mш:E=h/ r`y9j>Z7';E6r`*Ɵ up9+`4Nv҉9 CDyI`%A_x>G֐4NwJO©@&"a4d/ !0@5WYPe.eb494b*d!!0O[/_'9D!1x9! E!:6v4Ȝpݓ;mW8^xD ̜p_]`J4J t?S> fOZ%;L/,5K-?/%Gژ B؋6 hCr?O rXh̖@y|!nx_5Ҙ?O/2'\ M1Fnx#6x̜p=43R`0fہG@fN#Ln.G $A!OјV,xB r B B B B`]O3!!sCjҙ RPX7^@CxMfb} ,xV"^H5v(o]?B$,r@l͜HWw#D"ȁÜH`xځ,`!790(pt-!m9V ׼p Xi" B r`B B @҇㌜n4*CD-%h0x0B`a?-0@D!zs B`y#0ܾ)0ЊçzEIv̉D+c Mc"_0,A`!VgN$ )ƍ5҉@^ _~R`x9I IcMcfG\')0#NS`%cۊjX`ϷZ8G\+f; ڶP@`YoAk b]O {p%6s^> {>g>7Xc*"Lr㺼&T2->Nb}Kud]OaQ07Q`z5_Qn}-_8f]/ZYՑ}ku6S%+Cb w'̼kü|2Ý^9\׼ț׃|ۼݿ4<~}GSA`F`C8]M8'ғ;rt!/B!ǩ@]J[/A K(Mqqi8^!^?t_9SgueYBw~V RA`*K%!xe%P?@,.^UL}'r !:D<ף?nةR~ߧy?EW4,_,w~8z i@S 3su zG$*{&t7R1ѵ'c-ӝ4M,DؒLt<5X|;7d*]}xJ_OKҐ}N>cTϯ(.͔8ADKcFȁ *_;pl2~r;8!r ߒ>v 1is4 ہU$JG_KqQ[i*9&Q8!X@@@@@R~0 p3'Ri@!!rIENDB`Kst-2.0.8/docbook/kst/tutorial/tutorial.docbook0000644000175000017500000011537012277111530020655 0ustar synthsynth KST"> ]> The &kst; Tutorial Barth Netterfield

kst@kde.org
Rick Chern
kst@kde.org
2004 The University of British Columbia &FDLNotice; 2004-06-23 0.98 &kst; is a data plotting and manipulation program with powerful plugin support. KDE kdeextragear kdeextragear-2 Kst plotting plot Welcome Welcome to &kst;! In a few minutes, you will be on your way to exploring the rich features of this plotting and data manipulation package. Here are just some of the tasks you can accomplish using &kst;: Quickly plot multiple graphs using only the command-line. Analyze data using an extensive set of tools including histograms, power spectra, and custom equations. Effortlessly zoom in and out of interesting areas of plots using either the mouse or keyboard Monitor live streaming data using &kst;'s real-time plotting capabilities. This tutorial covers the basics of installing, running, and working with &kst;. You are invited to further investigate any features at any time. All features are documented in the official Kst Handbook, available by selecting Kst Handbook from the Help menu of &kst;. Installation In most cases, performing a basic installation of &kst; is easy. The only prerequisites for &kst; are versions 3.1 or greater of &kde; and &Qt;. However, optional libraries such as the &GNU; Scientific Library enable &kst; to be compiled with additional plugin and file support functionality, and are highly recommended as they are required for certain portions of this tutorial. If you use a package management system, you may use it to install &kst; instead. However, be aware that the version available in the repository may not be the latest version. First, you should make sure that the required &kde; and &Qt; libraries have been installed on your system. &kst; v0.99 requires &kde; 3.1 and &Qt; 3.1. Almost all major &Linux; distributions have packages for &kde; and &Qt;, so it is recommended that you refer to your particular distribution's documentation for &kde; installation. More information is available on the &kde; website. The &GNU; Scientific Library provides a variety of mathematical operations for the built-in &kst; plugins. The library can be found at ftp://ftp.gnu.org/gnu/gsl/. Alternatively, you can find GSL under /gnu/gsl on the mirrors listed at http://www.gnu.org/prep/ftp.html. Download gsl-[ver].tar.gz, where [ver] is the greatest version number found in the directory. Then unzip and untar the file: tar -zxvf gsl-[ver].tar.gz replacing [ver] with the version number of the downloaded file. Read the INSTALL file in the resultant directory for detailed installation instructions. For most systems, the following will work: cd gsl-[ver] ./configure make make install The second optional (but highly recommended) library is the CFITSIO library. It provides support for reading and writing to the FITS (Flexible Image Transport System) data format. The libary can be found at ftp://heasarc.gsfc.nasa.gov/software/fitsio/c/. Download cfitsio[ver].tar.gz, where [ver] is the greatest version number found the directory. Then unzip and untar the file: tar -zxvf cfitsio[ver].tar.gz replacing [ver] with the version number of the downloaded file. Read the README file in the resultant directory for installation instructions. For most systems, the following will work: cd cfitsio ./configure --prefix=/usr make make install You may need to modify the option for your particular system, but for most systems, /usr will work. Once all of the prerequisites have been met on your system you can compile and install &kst;. Download the latest source package separately from the &kst; website . Then, type the following: tar -zxvf kst-[ver].tar.gz cd kst-[ver] ./configure --enable-final --prefix=`kde-config --prefix` make make install replacing [ver] with the version of &kst; you have. Note that kde-config --prefix is surrounded by backquotes. It is very important that the kde-config utility returns the correct path (most likely /usr), otherwise &kst; will not install properly. You can double-check by running it directly: kde-config --prefix Ensure that a non-null path is displayed. You can read through the messages displayed by the configure script—if it reports any missing libraries (such as GSL) that should not be missing, please go back and ensure that the libraries and header files have been correctly installed in the appropriate locations. If installation was successful, you can now go on to the next section of this tutorial. Starting &kst; from the Command-line A common use of &kst; is to quickly produce plots of data from the command-line. This method of producing plots requires almost no knowledge of &kst;'s graphical user interface, yet produces immediate, useful results. This tutorial uses a demo package of data files available here. Download and untar the package, and change to the resulting directory: tar -zxvf kst_tutorialdata.tgz cd kst_tutorialdata To obtain an overview of all available &kst; command-line options, type: kst --help A syntax description and list of commands similar to the following will be displayed: Usage: kst [Qt-options] [KDE-options] [options] [Files] Kst: a data viewing program. Generic options: --help Show help about options --help-qt Show Qt specific options --help-kde Show KDE specific options --help-all Show all options --author Show author information -v, --version Show version information --license Show license information -- End of options Options: -F <dataFile> Specify data file: used to override a kst file default [|] -y <Y> Field for Y axis (multiple allowed) --ye <equation> Equation for Y axis (multiple allowed) -e <E> Field for Y errors (multiple allowed) -x <X> Field or range for X axis [INDEX] --xe <X> X vector for equations x0:x1:n [INDEX] -p <Y> Field for power spectrum (multiple allowed) -h <Y> Field for histogram (multiple allowed) -r <f> Sample rate for power spectrum [60.0] --ru <U> Units for psd sample rate [Hz] --yu <U> Units for y vectors [V] -l <P> Length of FFTs is 2^P [10] -f <F0> First frame to read [-2] -n <NS> Number of frames to read [-2] -s <NS> Number of frames to skip each read [-1] -a Apply boxcar filter before skipping frames -m <NC> Separate plots arranged in <NC> columns -d Display as points rather than curves -g Provide a legend box --print <file> Print to file and exit [<none>] --png <file> Save as a png file and exit [<none>] Arguments: Files Data files (if -y given) or *.kst file &kst; specific options are listed under the Options: section. Where appropriate, default values are indicated with square brackets at the end of the option descriptions—these values will be used for any unspecified options. We will first take a look at the ASCII file gyrodata.dat, included in the demo package. ASCII files are one of the many file types &kst; is capable of reading. In ASCII files, data is arranged in columns, with each column corresponding to a field, and the column numbers (beginning with 1 from left to right) corresponding to field names. This particular ASCII file contains 3 columns, and thus has field names 1, 2, and 3. To produce a plot of the first column, simply type: kst -y 1 gyrodata.dat All the data in the first column will be plotted: Note that no field was specified for the X axis of the plot, so &kst; used the default INDEX vector, as expected. The INDEX vector is a special vector in &kst; that contains integers from 0 to N-1, where N is the number of data values in the corresponding Y axis vector. Close &kst; by selecting Quit from the File menu, or by typing CtrlQ. gyrodata.dat contains 20000 frames, so you may wish to only look at a portion of the data. To only plot 10000 frames starting from frame 7000, type: kst -y 1 -f 7000 -n 10000 gyrodata.dat One of &kst;'s strengths is its ability to plot real-time data. Imagine that new data was being continually added to the end of gyrodata.dat. In such a scenario, it would be useful to only plot the most recent portion of the data. To plot only the last 10000 frames of gyrodata.dat, enter the following: kst -y 1 -n 10000 gyrodata.dat If gyrodata.dat was being updated, the plot would continuously scroll to display only the last 10000 frames. Instead of directly reading an input file, &kst; can use ASCII data from stdin as a data source. To specify stdin as an input, simply enter stdin as one of the filenames. There are many uses of this capability, such as using &kst; as part of a sequence of pipes: cat gyrodata.dat | awk '{print $1 + 2}' | kst -y 1 stdin The above command uses awk to add 2 to column one of gyrodata.dat before piping the result to &kst;. Note that the description of the option states that multiple instances of the option are allowed. This allows quick plotting of more than one curve, or even more than one plot. To plot all three fields in gyrodata.dat in separate plots, enter the following: kst -y 1 -y 2 -y 3 -m 1 gyrodata.dat The option specifies that separate plots should be used instead of one single plot, as shown below: A Quick Tour of the Data Wizard While using &kst; from the command-line is fast and convenient, there may be situations in which it is easier to import data from the graphical user interface—for example, if you already have &kst; open with other data loaded. Or, you may simply prefer using the graphical user interface. Becoming familiar with both methods of importing data will allow you to make more efficient use of &kst;. The Data Wizard provides a quick and easy way of creating vectors, curves, and plots in &kst; from data files. To launch the wizard, select Data Wizard... from the Data menu or click the button on the toolbar. You will be prompted to select a data source. Browse to the gyrodata.dat file used in the command-line examples and click Next. The following window will be displayed. Data Wizard Screen 2 Data Wizard Screen 2 The fields available in gyrodata.dat are listed to the left. You may filter the list of highlighted fields by entering a string to match (wildcards such as * are supported) into the text box above the list. Enter * to match anything (i.e. highlight all the available fields), and then click Check Selected to select all the highlighted fields (which in this case happens to be all the fields). The Data Range section is used to specify the range of data to read from the selected vectors in the input file. The following discussion assumes knowledge of frames. In brief, a frame is simply a number of data samples, and each data file is composed of a number of frames. For a detailed description of this concept, see the Kst Handbook. Starting frame, Count from end, Number of frames, and Read to end Using these four settings, the lower and upper boundaries of the data range can be set. As an example, select Count from end and enter 10000 for Number of frames to read only the last 10000 frames. If gyrodata.dat was being updated in real-time, subsequent additions to the end of the file would be read. Read 1 sample per N frames and Boxcar filter first In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per N frames (where N is the entered value) is not selected, all samples in the selected range will be read. Alternatively, frames in the data file can be skipped by selecting Read 1 sample per N frames For now, deselect Read 1 sample per N frames. Power Spectrum and X axis settings can be specified within the Plot Types section. XY, Power Spectrum, and XY and Power Spectrum Select XY and Power Spectrum to produce plots of both the data itself and its power spectrum. X Axis Vector The vector to be used as the independent vector for the plots. You may select a field from your data file, or the INDEX vector. Since gyrodata.dat does not contain an X axis vector, leave the selection as INDEX. The FFT Options subsection in the Plot Types section is available only if a power spectrum is to be plotted. This tutorial will not deal with the details of power spectra, so use the default settings for this subsection. Once you are satisfied with all the settings, click Next to advance to the next window. Data Wizard Screen 3 Data Wizard Screen 3 From here, you can change general plotting settings. Most of the settings are self-explanatory. Select 1 new plot per curve for Curve Placement and In new window for Plot Placement. This will place all six plots (three curves and three power spectra) in the same window. Once you are satisfied with all the settings, click Finish and the plots will be generated: The Generated Plots The Generated Plots Generating these plots took a bit of effort, so we should save the current &kst; session (it will be used in the next section of this tutorial). Select Save As... from the File menu, and save the session as mykstsession.kst: Saving a KST session Saving a KST session Saving a &kst; session saves all the plots, data objects (you will learn about these later), and layouts that exist at the time of saving. Once the file has been saved, you can exit &kst;. The Basics of Plot Manipulation Now that you are comfortable with creating plots in &kst;, we can explore some of the plot manipulation features available through the &kst; graphical user interface. Start &kst; from the command-line with the mykstsession.kst file you saved earlier: kst mykstsession.kst All the plots you created earlier should now be loaded in &kst;. Examine the plot with the y axis label of PSD of Column 2 (V/Hz^{1/2}). To take a closer look at the plot, right click on it and select the Maximize menu item, as shown below: Maximizing a plot Maximizing a plot The plot is now maximized within the current window. Note that anything beyond about 4 Hz does not look interesting in this plot, so it would be useful to view only the area of the plot that looks interesting. To do so, make sure you are in XY Mouse Zoom mode (select XY Mouse Zoom from the Plots menu, or click the toolbar button). Then, simply drag a rectangle from approximately (4, 0.025) to (0,0), as shown below. Note that the coordinates of the mouse cursor are displayed in the lower right corner of the &kst; window (if they are not, ensure that Show Statusbar is checked in the Settings menu). Zooming in on a plot Zooming in on a plot The plot axes will change to zoom in on the selected area of the plot. You may notice that there is a peak at the left end of the power spectrum that extends beyond the new upper y axis limit. Suppose that you wish to view the top of this peak. Right-click on the plot and select Up from the Scroll submenu. The plot should scroll upwards. Of course, it is most likely easier to use the shortcut key associated with the menu item; this is true for most of the zooming and scrolling functions. In this case, the shortcut key is Up Arrow, so the quickest way to scroll upwards would be to hold down the Up Arrow key. To return to maximum zoom at any time, right-click on the plot and select Zoom Maximum from the Zoom submenu (or type M, the shortcut key associated with Zoom Maximum). Restore the size of the power spectrum plot by right-clicking the plot and unchecking Maximize. Now look at the plots with y axes labelled Column 2 and Column 3. These are plots of the pitch gyro and roll gyro, respectively, from the 1998 BOOMERANG flight. Since these two plots are related, it can be useful to zoom and scroll them simultaneously. Click on the squares located at the top right corners of the two plots. They should turn dark in colour to indicate that the two plots are now tied together: Tied Zoom Tied Zoom Before we try zooming in, we should delete all plots other than the two we are working with. Select Layout Mode from the Plots menu or click the toolbar button. For each plot other than the two we want to keep, right-click on the plot and select Delete. Then, right-click anywhere inside the current window and select Cleanup Layout. Now the two plots should share maximal space inside the window. Return to XY Mouse Zoom mode when you are done. Now try zooming in on any portion of the upper plot. You will find that the lower plot will become blank. This is because the lower plot axes have changed to match the upper plot axes, and there is no data in that particular region of the lower plot. Type M while the mouse cursor is over either plot to return to maximum zoom on both plots. Now hold down Ctrl (this is equivalent to selecting X Mouse Zoom Mode from the Plots menu or clicking the toolbar button). The mouse cursor will change shape as visual feedback. While keeping Ctrl held down, drag a rectangle in the upper plot. Note that the height of the dotted rectangle is restricted so that only the x axis will be zoomed. Now both plots will display data when zoomed in, as the y axis for either plot was not changed. You can quickly tie or untie all the plots in the window by selecting Tied Zoom from the Plots menu or by clicking the toolbar button. When you are finished experimenting with the zooming features, you can close &kst;. There is no need to save the plots this time (unless you wish to). A Brief Overview of Data Objects There is more to &kst; than simple plotting and viewing of data. From the data wizard, you have already seen that &kst; has the ability to create power spectra of data. In fact, &kst; is also capable of creating other data objects such as histograms, equations, and plugins. A utility called the Data Manager can help you keep track of all the data objects you create. Start &kst; with the file demo.kst, included in the demo package: kst demo.kst Kst with demo.kst Kst with demo.kst This &kst; session contains vectors and other data objects created from data in gyrodata.dat. The top plot contains the azimuth data, the middle plot contains the pitch data in blue, and the bottom plot shows the power spectrum of the pitch data in blue. Let us first examine the plots more closely. Tie the top two plots together using the techniques you learned in the previous section. Then hold down Ctrl to enter X Mouse Zoom mode. Now zoom in on a small region of the top plot (say from 50000 to 53000), to cause both tied plots to zoom. You will notice that the blue pitch curve is negatively correlated with the red azimuth curve. This is because the pitch gyro was slightly rotated relative to the azimuth axis (by -0.69 degrees). The true pitch p' is: where p is the original pitch, is the rotation of the pitch gyro relative to the azimuth axis, and a is the azimuth gyro. p' is plotted as the black curve in the middle plot. The power spectrum of p' is the black curve in the bottom plot. Now let us take a look at how the three plots were created. To display the Data Manager, select Data Manager... from the Data menu, or click the toolbar button: The Data Manager The Data Manager The Data Manager contains the definitive list of data objects in the current &kst; session. It also allows you edit or create new data objects. As you can see, there are three curves (each created from a pair of vectors), one equation, two power spectra, and four data vectors listed. Right-click on C2-GY_PITCH and select W1-P1 from the Remove From Plot submenu. This removes the curve from plot P1 in window W1. Also remove PSD2-V3-GY_PITCH from plot P3 in window W1 using the same procedure. Now only the corrected curves should be displayed in the plots: Corrected Curves Only Corrected Curves Only To see how the corrected pitch gyro was created, highlight C4-cleaned_pitch and click the Edit button. The Edit Equation dialog should be displayed: Edit Equation Edit Equation Note that the equation used to calculate p' was entered in the Equation text box (an approximation of 1 was used for cos(-0.69)). Feel free to experiment with the settings in this dialog. Click OK (to save any changes made) or Cancel when you are done. Note that all data objects have a number listed under the # Used column. This number indicates the number of times the data object is either used by other data objects or by plots. Since we removed a curve and a power spectrum, at least two data objects should have 0 listed under this column. Click Purge to permanently remove all unused data objects. Click Close to close the Data Manager. You can exit &kst; now if you wish. A Look at Plugins and Events We end our journey through &kst; by looking at two specific data types—plugins and event monitors. A plugin is a flexible data object whose behaviour depends entirely on the specific plugin file selected. The plugin file can be one that is included with the standard &kst; distribution, or it can be a third-party plugin file. In fact, the Kst Handbook includes instructions on how to write and compile custom plugin files. Plugins allow &kst; to perform arbitrary operations on a set of data, as the only requirements for a plugin file are that they receive a set of input vectors and scalars, and output a set of vectors and scalars. As an example, we will try fitting a simple line to a small set of data points. Start &kst; with a plot of the first field of the maxima.dat data file included in the demo package: kst -y 1 -d maxima.dat The option specifies that only points should be plotted, not lines. The plot of data points should now be displayed: Plot of Data Points Plot of Data Points Now, open the Data Manager. Click Plugin... in the New section to create a new plugin object. Under Plugin Selection, select the Fit linear plugin. This particular plugin requires two input vectors—one containing the x values and one containing the y values of the data points to be fitted. Select V1-INDEX for Input Vector - X Array, and V2-1 for Input Vector - Y Array. Then, click OK. You will notice that the new plugin object has created slave vectors to store its outputs. Click on Curve... to create a new curve from the output vectors. Select V1-INDEX for X axis vector and P1-kstfit_linear_unweighted-Y Fitted for Y axis vector. We want to place the curve on top of the data points in the existing plot, so under Curve Placement, select Place in existing plot and deselect Place in new plot. Finally, click OK to create the curve. Close the data manager to view the fitted line: Fitted Line Fitted Line A procedure similar to the one you have just followed will allow you to create and plot the outputs of any type of plugin object. However, there is a shortcut for creating fit plugins. Right-clicking on a plot will display the context menu, which contains a Fit... submenu. Selecting a curve from the submenu will bring up the Fit Function dialog with the x and y vectors preselected. After the fit plugin is selected, a click of the OK button will create the plugin object, create the curve from the plugin outputs, and place the curve on the existing plot. Let us now take a look at events. Event objects usually monitor other vectors or scalars and perform specified actions when certain conditions involving those vectors or scalars are true. Click EventMonitor... in the New section of the Data Manager to create a new event: Event Monitor Event Monitor Suppose that the pitch gyro data was being updated in real time, and that we wanted to be notified whenever the corrected pitch gyro falls outside the range [-0.60, -0.40]. To set up the event in this manner, enter the following in the Expression textbox: [C4-cleaned_pitch-sv]>(-0.40) | [C4-cleaned_pitch-sv]<(-0.60) Note that anything entered as an expression must be a boolean expression. This particular expression will evaluate to true whenever either of the inequalities is true. Select both Log as and Notify, and enter in your email address to the right of the Notify checkbox. Click OK, and the event will be created. Now select Debug Kst... from the Help menu. Click the Log tab to view the debug log. If the event was set up correctly, you should see warnings indicating the x values for which the event was triggered. Check that the values roughly match those you would expect from looking at the plot: Debug Log Debug Log If the pitch gyro data was being updated in real-time, the event monitor would be triggered for any new data when appropriate as well. Once you are done, you can close &kst;. Conclusion This concludes the &kst; tutorial. Hopefully you have gained enough knowledge to become comfortable with &kst;. Keep in mind that this tutorial does not cover all the functionality of &kst;—there is still much to explore and experiment with. The Kst Handbook, available through the Help menu of &kst;, can be your in-depth guide to concepts ranging from window layout fundamentals to creation of custom plugins and data source readers. You are encouraged to use &kst; in interesting and innovative ways—you will most likely find that it not only meets, but exceeds your needs and requirements. Credits and Licensing This tutorial is based on the original &kst; Quick Tour written by Barth Netterfield. &underFDL; Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-datawizard2.png0000644000175000017500000003415712277111530023307 0ustar synthsynthPNG  IHDR\AVPLTEĢ٢٫ԑԏч˂~{xrle`{\wXtYpPmHgEeEdDcG^LZKZK[>ZF\7O3I|8M{]g{sttlllddd]]]\\\WWWSSSSSSQQQMMMDDD9CY-An)ȲTjx1d33 $!`gg&;L&aL 2Ɨ|JrC]կ8|JZ? jUa 4yuƵx4 M{]!=C~Z!t,/?盝D乖X6yF&O&E\4)J֘<(HU6_&9{H<8{oF"9=*@$sFeDs@ Fi@?n7AuXa n7RDʒ?-t2rL2pI\F hA:џ+ȏu3S>ef~4T?nz/cP7IŀN&NFk ɤt2Iڕ'8Z3M5_~2?.Dv~)w|LF W8 9u IUʐ/_~Gi]'S|3kNO2?xF.^r@#諌Q96XFԱn|׫ɋxW^w?yPL?W?!+C93vFGaP2~\?))?(?#R?U6={{'4'<zp(y\G咇K咟MvjM$*Jӓ{Hꔰ}`x~XQFŠ_&ԁ~L%ٳG2;e)+G_.5ٟg}[/!97gj<-yHK^Y%O<(.JWJ~2Xrb-OigٳC܂#R@3_\?|*_ghs{yBH7>{/?c~$v?Usyɓy:3_oJ%M}>̚GtoEɶ<_s9%(2%4&a;Te, 2iSzx?g?o_fqꢼ=#2?zL븼0os6i5&OI%?4\rIc46UpqaFo)C<~j{Ճ흝muQ?vnOvXv=O;<| [x>CܳHD ([g7|.d2hY ^]wȯd(\O(]"U_TlnSե(-%zGTEj+<DhOXц͉{|xpjxOÀu,>JOfNF:Z+͈.N^6{]nDznAY :/芓oh{׎znjAHt^=d}֗{5]y:yOBxV]M6s5m>fU{F:j|-QֺdzGZ:?B?t}&66qN2ޝ"zwUBz9׸QuLJ%ltG9GhQw7D6uzb Dwή{adط AtG62腟l* ]pDhNS}cFDL)Zy]'ۘF̈́@4ѝAtѕNu7ѭn>ѩTV D7l[Ndk#tU1 N$:TGN>ȑ- 3!Z;j$ԃm%Z}^_!NU6F:X+.~=pe +ɬfE^Gil*0:r-l>.A?%`HX v ёQDQQ/݂?i*\_΍yΔj~:F>HÆз2f#=ˠrBoSYhA&3b{mhGrt~uPtQz֗s:3U30QfGnE~+ghŜ7͓i\AWrmGK;P"Y­XG_|΀VϨkӉVFab޹Z_LZ)L4QGi'b# emjLDOJɶlKnrE97rQk|2z.N˴s:S98.D+&GU#2UPMM{ѥq^SY3jM48D^DN%6DVgJ;ve*0;ҰJo U#2UϐfS6c2qt\ 8 ѼDkD[ʑA44c&:S2-7 È6FiXҷZ51!#vq }(haAZ2e7 Y}عhsjfzDu#F'ۖ3l,7''Mo/ѧ39+uv\F3nou&tF4x nNBoxTW Dh}nc| DW&cAtW h h ?D-9D[~A4rcbFN@t%_mv ҆DrUx*̪\yM%_U%z3ѕևDVx2RK֛L6%wmC>$RШoJOfŘ*+TטFEV$Zɰʕ;L '6! hԆ7jSXdVD+/ &*[Bv%DC"F}~4MfE*+jḳ"+-gdXKL64DJmt؄7*oJ>c̊2UW֘GEZg!ɰʗ`W~47OGYyTo秺4ʘ̊2UW֘GEZaB'NUތDӣ=}*QK o秺MfE*ʛ[֘GEZ]|!ga-m#hKSqP':J*b,26fLeբh֭W};9-$gzS+tݎPwt"j4.x:eCH2_:!uX0'a;cN Ltځv4_j,r63Jˆ`sْ:2辰DDLK|Qx "QQ҂8ZaIMJvJDWDb@L/9ShdƜB!y5x9ҟ{i41ye?nh&ZɌKjIYpFr`p*4.1o? /]>Gfb#D 9J6z6 \J86x_%b6&P-&2ƜLVg]ՎX0 FbYS>&,򇴎:x$o ~bKqtqK]Jd"gHCN2NJDt}R#1sGFy) ژBtZcvOzm)mt5;BӂX+m7"Hk'%d#һ',G.2!ٜtIc+ٻq.$kBDfnN/ƣ3QD&P,GBb[-|:*v¼KRY>FWC62<%e8%]m=~/J kpLᷔh_JF%騽DWP:Zo+ÊvWc#᮹5cbȵ+CGODž]Ւ83'˓@'1;E{">J! #!`hO s^DGӤ;hGr|ez5z9r=dZ^YY#ԨZ-)kcL.#ED^'vBR.ohoD#>9S^>룓WTD'tT:;BlyB.:sf;G[ȹ>«-}u0Fi+Eًsf+uN'Qu|0эguD7ٻZWvx x•a cA'E ğt|DFDc,x#.DC DCmF5 u U't):hLWy up]hï _h[DC]G4DC DCtehg=h3:h<{h h h ŧ Pưxk u,ѥcX^|=N:,ưA2oC,sd/&ڗIfק}|taџDG97$~v!X$9ݵDѱ(V ư<|?o/PuLm1+Â8 Ԩd ˳l):6.Whz:t,8VD?| ug  u.pD@4@tfZgC97v9t}w'ˑAt;<{\/Z&|6]XȬ5rv"մzɦy`9jŦD U2?Edmx/-f'R哾ּ7x g')gۯ?;y}hD7 n/W3HT:9ql;|{Nz)D[CQDқd.Kܙjmesa.QP*%쑻sۼ._|tϪf:aʿ%Q y%uͮ6I7[_hN@hQND;r'wD|چ([QfWLn?oe DђA}͹5y>N%rk!O7E"X! ]Mgc>)O@M)6.3Ϭ7Kti9Szofm GE" *$4g[]9hV¾q+].ߜOݔbh ubiZS.-%EiӸنhަs\]Ur@rͧo@tl&t3[Lt3 -JW+Rܫrǃ!5~qF ɭ }h}^3Yƶy$ͨ+L4߲Kز]"3nAt=5u'!d+$q6Goij2e3yV 5hnV^ ׁmu9?G!DfQrxEA.Fy3Yf->8Ti96mCNɰDW25#$$LuAkic}X 鳚YLDms^P[K; m> )*"qו+Õd>qhR:I:YiHmԉ|j-khk)@tYMoFb!S÷>tc$e,gw3.hwFgǣ+CWU6kFӌ񊔿Èܜ64Q6ɢIʴ86Ss=>2]^H_J[uԃhf$`֡Y`Wl6t2u3u4kLl v;Dʰ 5-?:3FjڹJt DhDhQ Dh A&Xn":5F EDCT* Dh ! ! ! A4 DC DC DC ^DKW")geӘXLJ D5r(KWdE N=D7юWRd6rDb3dYLF$$Bbb|'#}txD 2{x ӕ^4.1BJƫI6N_SpIlӤĻ.zٻ~qNƉeVqGkA}mC`DOH6ne^G#FQ5\ <ѵF"Rݲ8:NJr#Ҽ#>zѼ_#YZ\׾b\1b r--ƣM4?+CA\  ;_ 1]3^ϥأI|!+L>9҆PZ5[8l7ȣp Z=)/jEFY݋9G%zB&a"8ZmK̾(#赡=xd|];Q>.ܭ\¥}ΠU`~D߰:ҕJegXTUB‘+&BQO/M6h\֛hP7Ԍ9JEb(a(NrV_E3S(җ&.JCTbLG&>elDw"ъS4lՌC΋_hX轨z=Ymm ,k|Q DEc6њ,< +C&y"6pC@t݈Vn82BCBYQbCQ7H>[ qtx-$Z/|ljLGkX8NEGbQi4Ѹ D0^S*  }ףv u?N&s OGmۜR1~23]L4skx ڡ]hXdX8x=20wY0) DhtA _ օԉ}=v2M^D+%Dݶw.wbH3^T^cꦬbFz'yUm4%tB mB4MOג5Xӏ Dve8BCg/qt\hd.($Ht'hqՉO4/Dh s\ChI 3jĨYGE:B- ls0M{# =]=UƑ~9$=45lX1z<S%v7+%wi↑6vhtsf(T৙ wAt=AtW=4 GhUD(@tˏ DhX"j@4    Dh A4A4[J4ԙe&DC DC DC DC Dh h h F u 3K4n!w 3K4 DC DC DC DC ߘUzWB DHT@tmzQ I$ynoXlj cdg+%; bXlF{vyʳ$&%;],~2iq* Ds1Ja[/2m))mm4p).&>DOΏB4Pxq;YWaǤFc>1枉 idy @t(10jtީx)KKD/$Ph|$Ӌ `CsଃʋukK6g)ѾDH4!\.kCR^&(B,"EDGB& \4!:gWwI=G.+&: NYkň4. sA%<;ml}WJ6DsrX, Dww Ք' s&u_!?{DC]Mt7 'DC  A @4!DC  A !DC  hl1}:ԑ*K4A(Dh!DCZ)*O4_ ] + s.4Ht*$;w  Dh A4A4A4+Jh-+:D bdSk DPqz[~~}D'\ ]7SO;VU6&[[Bﳹ$mSM}vn% n .T 8q:}tD'3y S[ 8r2Cu":i{Z , $d%3Bp+u% . Sʔ(9}ѾLOJt31fWg͉s=f#ghf*uS0h`BBp[=⍞/i2Ec 'o U@PgD )h\@П"9QeG8QN]=pQ9^Vd>\#јfNBg7OMd:ɉ*Sv*u`"F2.W{|lV[ rhr V?$ ̕ap?umƅaD^?-yNT9^Mέ*4k,9H|f3y?ȱKd6w ф,q4иPhOK4٥;.@vs7S޻ Dw)u *EmA4>5yIQ(PD u|Ǐ_2W h A4A4A4Q Én \}]h89B04ъhj @4h!m-?#m:fW*1&O^IZ%PB_q/_h ~M7 Urǩ@LCPKf`%?IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-fittedline.png0000644000175000017500000002672512277111530023224 0ustar synthsynthPNG  IHDRYPLTE!* Xh=kGjHhFgEeDeDcCcCa?]=Z>YH^J^BW8S([3L6Jy1Eu/Bo,>i(:j)=g'H^8;@U$jlnnB{U}PoPnPmSkYmZqWsXtZv\w^y_zb}dflpnqrtwz{|āǃʆ̌ώѐґԒՔՕ~\oޢۢ٢٥Яĩл- ȇI`٬t~仅ǐЛѨҳҿýͯzuvxhhh___]]][][[[[WXXpVFQQQNNNDDD=>=$@>??:<345000***@QJs7 t5.tRNS.$*IDATxsGCBr%'8 THxI;&$ld{d/+;T6nH&'[Y^Bž$* b0.*-*NU6Yd\A~ebKk }{^43ɒm~ŗg> x\ -h cXE7:CXS,PVJ^ #H=2Gҿw7n.x4!BL ] FeʐnD/4C]kM/?){Fl~!TcK-ed"g~S_{U݊!BL.\ D7p;xv-Vz?b}׉?O4][qy͋ի)†dU\ݸ:+WoYU?f=+ۯvjxgſd2~w2oE66u?'dUY.rzk͓Sٰ䦧e4*[\ĸ}mgL N(k7Ǯ25l*m-M[m{aGG֜r74ذVV֍Om="6XUݰqVZIؖfa iTaGcycxayQݸ\1x4[u~-O(DHK&RѓKʖy{SWsّ>h5}Y~PaEܚ,rۓv uƦ cTnMc[ I/urkʐY<AyW5YlQEAAE.k*4!HC A@;W`G\pTdo 7zд+{8e5|}Gzu8S2qd[Upģ}Ġh=~FNr.P#7 L;qhx_z(ڣ)s8udW>#^aszg?* Bߐio mH1 G%awKu/ɥMN5ZB#AMoR|﯈PH|Cn/brKa?}SEMEW|o(=F/VH=}\3.OM<.MrXp|1o~wUM6ǽI&܉ֱF|!9 E: + u@_;=~̴7/80(Gң\&]K}CKʥ|oJMS+jF9ÐKꔌǥa#DŽcZu: QYHO(  +b؛C^I'_$, G^}]! DŽ4HHzFR1;G ȍKTvAjs6Uƣvz'Wuթ~ƥY%U%]q#ҦI )Țߒoe\:lZWZ# A^nljnڶ%oJB, 7Gb8^.}Qfxxx,KW F>#<JҾ oE۪ى.HM NW< .́)K> KV6ɥ쒶0={j,VSR2>fJ<=ZM]٠˄5Һ\:hDMaiߟ(З۷o6#})BҚC7777M<844Y#r;cůydo,WZ1 ͰPi"G̴Lͧi\.iU̟sn; +Jt.i '齟dt钒t,ָi].vB Hklt<:I 4';+*upw}_Q@7llF:<~8KM|VHu8#iLja"EG?AZr%%nir.+H%c{28ASi+^,e6'&̠),2`ry-4L\ȈLڞOS'%.sְ*v 0V096c.2w;V 'KWEӄڈt#4]p`ZuJ-YmN?Czu&>t͛U^D߼y(%W|s6vQ _.~H^zlFJDuJl]L>CUyRzXkA+FZT&, gp)! i4i:`D%cH%Ҕ iF 'D2Y3ө$Ȑh\r!ҥisA*bH"dKYNJb$;o|^B<'ha>?^yeo{siaa)t1"Ǫ~NJ;/ߪa 38^~d'EU: I;V49:(T6M ZxHLo'B97۴X(0Saݖ!~Öȭ1 ‰$fģj9ss؍9Kh&״"md:m.-+T¡!_ C>BTXx׾fh5G;Wwɓ{VkgtQ~H~=W3A~NB9b+t ]ɦ]&&907K .K Ŭ\|{>keҳd]Ĕxd1!N%3605W<& iC,ۗZDfii={(s왮pB̕F>FƜ$ozS$GsX?%!)`t+ti[ZU:0VhEׁ7w gW.6mDڠNtwvH m'k{NY$YT,_6$PQU1ƥޚ 鴹4Ww+**h.M5ԐwMz;@vRmB4XGj *6yJGuuXshwc27g!}2VQ}/a_iO0~=8ӣ1_H'o ֥\ ~J՝u^r~]z\Py]윆\zfx,<6h!VĂ}\ ToTHriKCPH: %҅xTGC64i!HC@4i! A@4i A@4iHCG6HTҐtHC@4BҐ-! pҡ#d9@:IAņt '*tI v]Cj%mT>THKuK"6E=q6Qm?@4ހ56mPx(6KCiMlh5AEH ۢĸDcgX=/ iCLiZ|+v%8<@Hi9 } [vS4x<ЗN5Ay9/xW44!HC i iTHcAa 4!HC i }HC. وGsx`I!d31HX@*F'@Ð0Di(4\א4dc&4Hc=ӗ76H*6&=Q# m3?O}9PM>;g}3KCZpq[ۉKSD.$fbR/+ihHI,ltKҐm @U!ihH2 bi~ʹ^]T2cݙܧ0ˠL$hi@E +r 4dDS9^D!C A/dIENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-xymousezoom.png0000644000175000017500000000051212277111530022250 0ustar synthsynthPNG  IHDRʥ pHYsnd tIMENWnIDAT8˝ Dc01*uB>M>J&L ;8I!^FF VJ =S) `dֈ)2]# ;&\A"$3cQ`j_i UM`cĐOs6Ǒ˜;&xyZ8mV~c8b@O.`س6e7\$}>.M&&J`$o,?Kfzem=8IENDB`Kst-2.0.8/docbook/kst/tutorial/Equation-kst-correctedpitch.png0000644000175000017500000000144412277111530023536 0ustar synthsynthPNG  IHDRJOrIDATX?hp@@9 Appqppnppqrpps:t蔡 R28dp)tqsrq)(tD(ţXh 5 8 $uބ|cw/rD+ޠާ8ǀ':|"3;@>6S9TNhI{QWiZVAԥ  rfrg)&H P77Z'05{)dxL'MM͕݆zea4S$Ͽ-_UW޲Tpߗ1pb>:wt';bȹ睮1>fPMpUy<.=7:6h:rUۺ aQ޽G]r/֜3hbDmHiFz4S 뤚ҝ7A܄d@-?7~{.oA-i߱JreZ6>|e?YÞ}6IENDB`Kst-2.0.8/docbook/kst/tutorial/Icon-kst-datawizard.png0000644000175000017500000000111112277111530021760 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME$͊!IDAT8˭KQgC'GQ2#Y>zBD E}B60֮]kٺ EA=7gMǙǽ3ss{. $Hp|%4sh$^8֊;jBXXjjZҹ]iACmZGk1ήo9LT$ YJ0:B7#4T2ܐo館Eu Di|ŲG RU^^9s5z{0I0[\VN̶1qFs궂.\fI3[aqvd@rՍ[AUV^>]B꛵2<~/FdsG2(}My]3[*M^d#EW`VH95I@o]a8H}?i+[jQKCO˖׊B Zsv+8~4)ESe#7IENDB`Kst-2.0.8/docbook/kst/tutorial/Screenshot-kst-editequation.png0000644000175000017500000003742212277111530023564 0ustar synthsynthPNG  IHDR02PLTEwS;?Omc? Wآ٧Ѳyuy~7ʔՏӌЄ|xqjc~^yXuQmHgEeDdDcE\@\?UUcppqiii___]]][[[XXXSSSSSSQQQPPPLLLGGGBBB]U}_wTԏ*JŎ<tTedAe? <37Ǝ Bu$̆ P 0xܳ3驉qJlA]lU,ޓG;mMk╺Rszq?kzwSTڇ\<.?Uh56pJ ޴R :)CwJu8F7o[{r#nl:U M fYH%{gG[[/REެ $Vgwr~Dlp}I UdУ* Y5H)j5IݗC vFOP7" CJ0̣՞ 1G_ ޿UCPklȭ#|O.~tO?3_=K *vO *<\`X ~'͛7~QpNnvD}__"iEO__>t$&0x&Nkz䆞10L :3$&aFt?+F@~{5rI"?ӈwIPґioǏ?~:}ߒ?U,[kmŗ?O`'̆f{pVƎ3{R&m#}O>"ߓȭwwG$$NAy )⵶xE]8?kgAZGЦ+[J.P;zDNwoA!oߪdDo^H wY77$/[|`tJ]|li[lbco.~RZGU2fhJ1ױL^xG~OLׯI;g5\oAxF lPxMӽ""̿C@ՖKo?[,~GxH14(Д;sG*7cGo^xuM,#x =~Oӑ~|xw/.W,~oԽys MxppQ +Ew_^rׯ^joh$4/~zS9|JK_Ѽ^\cO?gŒG;E2⥾締:44%`x:j^:ő)nW ƎU|֑) +ŎdPo B!P)FL @@ gP'2@!`tY4K@@ :֗Da|AYS0^'RnljjVn׌.vY9Np$|E,'xZ%Rrr]6FH#ੜxtub}^ųp3b _Vcj̎cB#`VJ吒%AQJHd+N{]i֦+ 3Jr0+o!91r>ΊǺF8Dd%@5d[Yx)ZH:&!+QWvdӘ!}-h+Ԛw1_v HAKA<.č9J SJ޵,+5-{H64ZFn5`Lc"^J'SX/-Bq 0gy`|D#N/g{% O'1}t͆8QrjFUJAfzc8;"e/ Ě y(*vwՍgy`hjvrx <ػNO7=Ѧ`oGr8's~I'4kSfU ' ZEnX 7JWIb$`^`jp"NZ)Hn9L~Y>[R!-PT 7goW]2co'Lq~ OrD%Ld3<XHH= LKr~E,odUš)XKl(~CC_8qWG.wMu#V] >3 @@ Prwkuѷ3 Kb[(rXޤ!󢔛< z[2F,m4O'7.* [#`{4OCBmņ:?- ȁRfwP bsiC`z J?`Ӗ! 7 `*V:% (bMZx8@N@@ 9vq1q#Ura@eZ4   hTEs=Lpr1aM|2t/bDbDO"1cڀ1*HRjY0B'`r>nksxvަN"I}̘6`L\ Yf"f8`l%[ʯZpv|v~qa4wT'%[1cc9:'3K6,a̘ag}'T2 t5y>>$1À1(Ibֽ4G@+3@}M@n$P    O}#QCJWb}+vs OZ˭*WNMu@SƧV2҉$!͕J9TLs&$\͊팈c/Rm԰-QTהkI=emagiP.g@0/ClNu+hMJ\IyMw&锓./f4@]O-֋! iNJ=A[ _^+ 6Uy3pnjQ>/`=6Ex%Иa^Uא"sh\Fqg<|؎#i1F`E8qx># :i*$Q"/e)`?/ }j$mTВ^C:%`z!zlb_z-kVz(cE[Ku@=EVJIs]IF}(!1JqWt s:͉j¹}=b1AK(#RK\#5滮> BxL TԹu@m%V$b еJju@s$ŌG`@sUO?!kM9"p`$iL{7/ϊ@ҫvlZ S|'jۛ4(^+5Lb3dt[7Sl^@?ܕv=J ?'n4uLPǫr75OJ`=^NwPtc` S" t63JG~+ AX@u@@@puΝ)PG'O-  @th7,s5r%@ x\~cswTUAÛ:p7g_;֘Y!-eBNew.Ͳ/NO’nJff!{ H'8#9,oҐyQSbiN&;DQyHJ %ba7m4p|W76S9|]m F; j1"Rvx53ggn_u Pzg3yrSH|tzfމu!DŽN>"Z\F8 ~lv$ rANTM!hJz]В#F;bLYޝBXlx9W"*׽E%C|ِz2){9f~~B5xX¡`b/bP X'WEA6ͮ(*kDZ\^<Miג%@Q"hGB&v\RReٯlxFB@~)G:yooRn\*e3zq9"-S,5yO&o{][jJ:N4 k.kc}kZ֍^`tI;+1仮-|1}UL]ΩW3]L~St1;$8ރE\$bF܍Pvd6VIt< FV9sG w ^AؔA#O{ʼe0{v5J?Ќx/drkδٚV5"]J@u:zWrkĿ7C  a @}0 B F_Zj+@@@@ \l0HgP6$S`=%o=U%)(s>g(VY %d3x"*KGj'AR._ +b8A*Ҷ,@m.i{{@8%=VXVfMYx{_*eU)i lx0Ӆ$ݜi9D6}2 s,^ HB!.>V~%t@2m̢e2Q>NQu^!.N NVPq/EWWaeDq,0!*^(Vyl8M,7 ?=݌y"4T`A!"M@f XJг?%  Hnxm~3! U>\$>I'`{i[n j<{3j{[ ֧ãOZ*.ygɆL5UڬC_uYa +R~m?s$#³O_Eҙ.zMA=Y w&!S;iߏ|$Qp D"-⛑H[ B1@ T.#sJB=zь?8&Y5BR{3Bӡ10 8G&"؂yN^UBD~( #艟,<o wm lO<`|#"k@ !hG660 pDz4_  #v#gU0>8`Sy#NP> hwG"O8vuX!;PB#3 :Z?! ΁=A~O08#dI\Tu s>p/ N!`FiԃBf"V{,N%@ 4t 6&=Pn AC@kȩ  hsK#A:bz{Bh o^ @n ڠժN|u͘!PW  kw#&^d@,     "Æ&um@05#M&\oPW#L"HVlA%BvUxhT0R#@7P4cdB+rQsm0}h$dJ0pKIlHr{h½{J](5 qb. XJРRkl`U 8ܫ@@' B@ro7"I%Fl"biWJIKTL7KXLV,Kü n7fzZ!_[-qq2C ] ]n8]4WJ_}K(2%VŸSj!IdamkMG1#@ Vd-]wt@hu;X3+v:=$/E`R Vqk#Z9beDGfn^Y'HYh &#Z<#!Fɩupذ*i<]UC-, =@lXRDfB Iy\ fQ# "׾A sw"%TP\6O!6O lj坥5&sNaˏW=iQ-Td}#a#] lTw7sYŠ;c~q6{ 6"'TOO48@)o&Y>q[ۥB"[@iyZY;F65;46!ձꎃ76w!}NĐy!Bн*OGG|3]n`}7燘'iV8 9߈NĐ_8"}X'U "~z8SXә =*9b(8e7]? w#w"ȕQ?-)@_x*|nXܴqf N-~sCc;=j4w"XD 2m `*ĮnO.Cr%a`00?1C q/D;Tw"2[`}O>8G1Ȓ SHԕW!&;G7iw'GO|/0"4{~{}&ؕja8{N|}N:S%F0^@@K@7Ruw>+JTx@@p)_2MV3 Xo`5<=?&{z?HPhNcT ^;t 8 |?}LuP>x;x^76*Ɇ z?x&}Q?Gn0{_A8#z?}j?Go 0{_A-y#c~0Ѯ:@ -ɿO_`jE@`ß>&@jI@q=ӇalwmP:xx;wLb{ЃB؆ aOМ0@3=o;й   j C5    @@N6.HZRS8=I+ +wT$M7LgaSRa!{aO!&$:J' $F)yH~H%uu],"ޗJYd*axq1YEkǶY)CJt61VF)>:VcxFT#P$D(DRtud8kȇGO1%IVmuqxdh͎R7CBTFW@McKAcg\᠂V|yjn@>`CN$FIs(D2L;w?<d@*sP"vJ|8"r&$r1"by %YCxɾMvOǫ4~BVA6 u(p`˜+ӫ6c#* 'RևbTHd ,a轀^ hM ?@@gq@@v t%;~   h6@@7$   !   R_@@]D9 UA.#s hD@OuDVBR%*\ $WG@@aO<'`JW@@?Pu'yaƬ\o-ASNXyJkei!@@Qͦ9/JyORً ,JpRb3K9,oTARVdwTVi|h`-rʬm3v YDO 6%;D1Ĝ>B^+EZrmZ|F2wI?"#7'Y#gy+~6_ 'yTXa7',,[Sj Cٻu1iKqrU0/~Ve?`-{QlBE e%ժ_.tC_KEN<r ͌rʞ nynbnժM[lSh,2e @"-nMXCU),ܻy|U,a̧N*QO$1j}7Sp*/^4n f 2$!^{/`2B #O7RQfh0  V/{11C]G  `_$^TEkzFzan^$QBߡ /D -p[XDQlSyc uޛ#@-p qsi4VuQ^卣IvuAmD30#d/`bvQu(w2U-xuO]AXy0:ǃPAb ϡblz>r^7z0J `kk*,wa9D@yH, *qO!`P @mO[ 3. Q:<8X팜gz/дDS:. =z!iaLӱ#tbPK`[ &WjS[4`+#@؋إZ+~6_lFy\%X &Wj& \%U㼟P{AlGT8Ptcө"j , 0L zaӯĪq@,iu:!5YDi yh$TX?'Wx/F H,PnӖ&u^96ʢa@9~PM֦,0L,MOOiqX_[Di\崁 /O&@XLH^&K>tտ3?lvpo$}H@@@'zJ t1C=@S*P  腑@@w gnL^ z  Vo(rɆ{.)] \U~횙\ɸ Pr&<\rj8RTuF Gv{;` v|P9|h#?FRIJʀ(VQŨj t٥e,5 JpN.(I#jS8Qq#N4kP4\R،`)LH',ِN~>F(VZA?Q{׮^ :Kմj-*q+R~U'LH' LWZ :(>w~+ \5b#/;gPA r?9;qZZK`:=AJUH96]O-m/eN};[9j4݊z/ s/L.YEH!YtӞ(IbE7LHY_T t^~_EYSTptEJ)/AT1V?u[4 8jVNɢv D1PMKP7Q)4E9 b|@p5j~SFS7y$W[]:}=D@OV   3PmP&@@@@gV}_@78ϵT h_YZ*@@@p.! og'ʷ:pDsR.V2҉$]EpZXSޱ@|*]dYȫ32 YN#9w/ 'f\ ^`,aW(S{NM><`<`x,Y 8Y#{#k   QϵT |nJۏDp:P1!G" / ۏN@@ @@ }#`T {28?AX!',hzQV%q{acԇbvDIENDB`Kst-2.0.8/docbook/kst/Formula-kst-autocorrelation.png0000644000175000017500000000221512277111530021720 0ustar synthsynthPNG  IHDR;͐@TIDAThZ?h\A:N...\?pprCS,N.. BA(C_b{sn-ϼW=yӮ].u- -BgfxU7gO d2Į~{={t]i%M&ݥj w v ]/ !pYT6c}PyFV0pYT1PjY171F?W!)]EE#_9VpJ6D(csyy&h]{>;Շʂ8 Y`dS},0tZb{SLc',0|&*ܮpI,OyZ8%|Ee9^Skqc[98^OγG;)ǥa$#nRQ0u)59aܸ^kACp49U {}S}݆qIEUv-2#5 Vڶ}vVsQ^|MM* .-+{ٮw!0C'a3Јpj&Cn86!cށJECotIRPgPȧ w{ɁM* WfI;%t&?I=};#~KKrbCW%G!61l{ƷR__@3s ƹ*2-Ψ,8gts$!%fz8nq;!w`H4-dGpbe?8RH gTtP-g&@`éC^ dS~gÿ[,QQF^WmB\pu8V^ᔊ1o)p.v{Xl:ǰ/ Tnpfu&d@&0l)??~pp}7ѕt⢋CJ6.:tBLt9J_UF#]66uhݰft9JϸKbKGD̿tIDATcx DrA`7xgrv0q0rZ~8 @Mi! %(0-yà,!%- 0e(utQ(IENDB`Kst-2.0.8/docbook/kst/Formula-kst-gradientsumofsquares.png0000644000175000017500000000201012277111530022752 0ustar synthsynthPNG  IHDR6B5LGIDATh/Pg{c{D1LH$4"`LbzF0 l".8IνL%p \%p G*Xշ{xIyd c`N'a/=wb|ij<1j&aWgm"1H1ps=&Ipd2ֱۂ{VY=KaEQ;H@Z>TS1`m^dV:  x]'Hswu"^\2{V $ ,jK_Z?:E@BʄA&4rwD$ʰXꢌl G3吿Ř#.`plU)|=fYB*m|ԈX^2f(>.`T. /F4FrF Fk|R jt.bniM8QԶ&8%$6#RǵL2kwt*'XG|ݺT=&m I,q9(U>ک08ZYE^=J?M>1Z=H!_O~F[kd}_T4tgpqIi;̩ubOܨ8>+Z=t:-vx_껃fc0$U;^'Z94wz~S{SFc:'`(/㉵H>_=wwq/5tS՞N 3=祀  ZSYƥ<[;`c貛Vg5dci"Ğqy %ٻS7p݉廄pKZ!. 0ym`Y]k+ p*W.ż p.,%p \o pnPIENDB`Kst-2.0.8/docbook/kst/Diagram-kst-windowplotrelation.png0000644000175000017500000000743512277111530022422 0ustar synthsynthPNG  IHDRF譂IDATxOdw c saS9P]PVuZdKU%T rSinm\"1DD!! QZI*;̟̤Kf;I|]ݶy<:|ijrF.O`0"ug䦚4R>F0`####FFFF0`#F0"0"0"0`F0*!z$gIOeNя:#Wv~I9;0QYWҫ&ҷwF0*)a)r?̑FsX(h&EZZ#{HR5 #`ҡmC7$sdw M4N$Q wIWt| #Δ}Z {Fiv|c:hZ1t* #ΆMt+D#9EӦ}ms^wYA?F0.Pߘt4.d^K)iߤ=KktCykC64m:l^ . :`}ZۡosEҽ3!DoTc=4`}#IWvi3 5i?ٓ`####FFFF0`#F0"0"0"0`D`D`D`####FFFF0~pFiՖ1)k/|f#Q90`~P3W##F0`D`#F0`#F0"0`#FF0`#F0`##F0`D`#F0`#F0`#F0`#F0"0`#F0`#F0`##F0`#F0`#F0"0`bfQ/|0"0"0"0"0`D`D`D`#####FFFFF0"0"0"0"0Qކ*t-!#U]BF0QYIڲBF? \1ڳ^5v0Qٌe‰D8[ #h1JL=9hZ\`T;LZ2gӾI #UtQWҾo` 6J\`䊑DoT |*eiiISG0`D`D`D`D`#####FFFFF0"0"0"0bFFFF0"0"0"0"0F>kY^bfgR[^WV ,R #z\F,rdCiWwh[ Fo67ٰCo߆ӒwF_sb~ɽ,my܇!o6Vx~x(Ѩe?]GiHs>?z8T#ݳ)k?1{+`Lyք#OCdާDnGGoCVA'Mϛ#?m ۃHO/{3Vz2j/^mQ+n*Y/r^Oz .9#oR9Vzkf5~Fi`D/ #FF0b;a#^0b;a#^0jO0Fog5JF.9 F{^54m/_r?],1#hPCD"p4peHG=Pێ#h1JL=Aӊo>@Sq {%lV6E FSk Ϥiߤ}ܶ]k|ЯYj/Y05IIG}88Ps6 #yUZn>P';7|J䩟#H}N7*X[{ZL('NMGZZ"{R"Җݓt8y}5e?92}2z8uǷ;=rg|SF|6/=ݳk+\p.teQcGaI۾x@u-RԎx*VًͭNg;iuy7ST*a{,+RB<~YҽPWQ̜vLFgtuڙ+>P[kqp!ۙ햤Neiۅd#gɟ'홴f 'G 쩴aqۓj1*Ӛ%\._;Ѵ2!L*|63J/ݹg;i.Rv/jwj?^B;&Vi Sp)\#^wz͗:y>PF$'͗#dNVr _eF15G]>3zgk:y>PF{$[WzԔ/c'͗eIɜ)zt|+˨h5d՚#\.Nmjxr9<ŹQRy4)}{۴{^gȜI%a5zֲ+gv3獰-rZsKtuL-.=oevQ_۾NWJ>4l4-n4x$s'cu~M]mz4x_=#KזQ^kp |)籫>_gtd+3+_ TQq`;s~yvǞK?U hSFs_XK<5=ŮguCFr'އ}׷?z;_d Okf۟¨|Ha^{&7ҒdA:^'6'ʵί[oèOPu=KKSp#Qxť. Th˾m6m~4| ӉfV-r'0d^m* QbFetڣs{G$'ϮͿ͜0(F_B>_df֣v_l愹DF0:7\`t؂~ #Fˆ # #zavˆ0b;avFˆ^0uzͣ<0yKe&IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-datawizard2.png0000644000175000017500000003420412277111530021435 0ustar synthsynthPNG  IHDR=sHPLTE    (3' % /F 9H&M4S9"I9)951112&-6#8!@ Q b'j8Y![)>[(Cc'Ip,Ms!Is Ir HtGsCzA#R-]3e;mHrJmUhvbee]e[TVTSYRRTRUTP\Lz6v9z5.IDATx}liG-*2aZpאmѼtlr-]Nѝv733Rk9i`GjwgO,\DhvSA$HA%(a(" VGY${Ď]v~]O=qO}^ /|W?U>|ozo 2^BPe]yƚu7ٴ$lnĩJu9ˡgD#7 y_DNtgT*]҉SCL繦S%i3T:}lPH){WۻޓJ4T }sה/wyJ=S//~"V~Om)OTՏ>ɰ  oxy{o>Y /oxaD/XRףH^o{sJ6ЭYU|ėr#<\M6Ln8y>ʋ5{U5VKyv 54VHFsGͪ3(M!UFy߽SnCML˴G/hUuw/;Lj-S]g<γy/\S׬"(Ͽ"۫ߤ{~eo ixWڷ/>+Jnk92<'oM<煚k;u7:ayɯI# xI)<|oW8ʎvS_ Lݽ}͛7oz6ްljjhjvB+ ퟷ I |3Q|vQ+ 9 sNYWݍ{FIͬ_755]8_ j?B%5JR;)KDksr($xG>;ggY gX;(E⁷wNdD{L&9ųODFŴ߃JesʦoTOL7=8WSB/;k.xkpN?6wtsVEJllyM1oPtyh/tyFԮxJ:?o?^j%^zm+4ϳcyy6nkIz5ϒa+XbpnegˑC-9IAg>HۣƄKf']DvxgMckp!6<?C34ԛ>Fy-PYh3ee3{k%7O͊C\flY-!w'<C×R,?%Z9MJw6 &Kxd>y Bdӏ>(4]0XXyijgqcuyM3xPl<+M&ߓs!h-בpQ3ޡ Da|81q!Q#q +,eJȳ=(2y?`+JPyr K33lpqPx Wrs2Yqe9z=IyNOCZz7JFL g6C>ar(<!uspHL+g?ΝTr,T2AA+ ENjyaL~&ykn0nr(<5#Ni,Ől&,}wyOn\sWT"υ>\Uq=| x. 1Ĺҍd*ad9ҲpT'0JoxE=m$·8Wq[)Y{gGMxRT¨*RvgZg?I|I9{*R7 hyM;|gA_4&,MɛC]ZY2Nug+<3Qnhr4sJ" V[xѭHY2)eu}&#S 3e:jNٓ7eqow/S1S %TA2F-鶍"z,, bwViGr)i3x8J9_\G\o6.y{I}ɕgN͋<ݏ;uyI~UJ,ϺT<>-ΙS[)=Ӌ7,lN`qIi%0ymEƗZ?i.j);Ϧ39+bETMNq"_1ty^S~UʚG}R wT_=VIG|/ >l%46φ5XפR$MʃH Y%WN)ᘈN^Sh,vތYe<u Y wuLilAyޯrt8uyVI ӭܼ0yUY!F ɰM!= B|oHUQ^a,yc4tlJ_ϪnBV gs9MU}%=}ab1y&+ k0B2Ҿ43Yĕp7yZG"]Q!Om*CjXW9o2"mK2( &$I]Zꦎamxsziu/_W}=žʘlu2<[I!&`~v}V'Mo"ƺX6E(vrKο|vY\@NZz|\΢<ޯ Uv/TWx3\e3e3GU;a@+JZRt38:`iRxdgiEQ{3kh_ṭ\UKs~U_)lub<7Mΰ 3\es Io`&ȳdPNHyM]7ztiop}>{H~GٗR,:z2{*%:aub<^JTo(zjQI|3? <%?+igI_AM2T ,ƺC<I Btu?%j~}+Oj0 IU-jvVy\V׻:r{àk׻l w?w Ѿ^|P]yӮo}|K*%KR2}>{͍gnQ8ɿ9w|"r0^z5 Ww;N^Ŏ˸ ֺtylq 7Ww^yWk[K>>r8Ww^oyEݶebs9my)<|"q S=#[U0?eI<5;As 7wb~7x|su<͋+ܾrq}! !3x3xxv&.{od;U\E՝y&@C-PKn3TZ?CYS!]9xi<'k;٩qlĹs *񭮍os Ɵ-m6γyXT*{}luVZ 3ySobYBs_gY>oG /VV+Kd>]@go>촶oLi٥H ӭdԮxTjwmT W[y>UU*}ZQVGsyY5|'+/D-nq+*ggkf?JRj>3Y#P@%Q?/V&z\QdA&-ǤK,E+FVӶGJ4x^ U Ɩ0;+ᕯD( \~c$$<9Z-ܮ1xvmtL3_MoxMgM&&s>%EHҥ^ZJL9Cj)8uyj5N5I;'W#l{3fs>Neоk.qĔsKx$ȣvX$+y3h!׎PDEPj(-*EPCYiTOq9 H Z>i{2f&cTKOmZ9~dgKڻg#n8uxYPgٙADT<5N$"1Z%4q(󩟼IAP"(jzTQsHbDue7BPӴs! W>M "*X!MI16v&cʒ] CgyٶnhZr3 ɿp \dy!@LDÀ,`VIQp. Ef0gFg49 T:PXYM,7~3%vF'?h0e.3S:;(X9f Iyy.̦TQS5Չ0E9Ϟ噵9 FMX<)S a-g!a 0/~CGӡ,x) a@$;LX<d3?da`gYg?U0) Cp%\~3wfU4Me.3ow3>=f;au{js6ێ#FpbgLGsx `y+TbJ5<{:ү8]Ts|-Pލ7Н`>o,Py g 3x.w}}槀rC\V}b2_܀L$ղ){eiy>}Z ɇKIK9!`~>@,T/dff^dѡ},DNsx΂gG.nž2݋}f-sH-i9%gl~s/aiJ0 T iy06ŃlxΦ}v 4-W6[;.FNH-D\ ʳV+!u'3?mô T&_*<;p 4/.5lY츄62w-n%l39 /1]wlrE,i9›-ֻvV,xv2`Yl6[f;.r+}#s]mde {tD<<ϳ]y1} fl%Wnr/ g5JK$E߰] ϋ%.e2q ?0q# OY\ ~&^.ljy3ʳU3,fb}#s^dC_Xa7׈|V%>,6"goLІ47j|VJyqYmv\LqܨT%W`Y UILF_pF\OY>\^(#wzKwPKn7nը<Ӹ )spt(Ƴ%AX_сs xΒáCs̳WźZ,mtv*O%-<@,= T̨" hEG1At \:ptYB ռ$@ϸ 7ߛHwrRV23g! A3gx A3!3*8x^.1*XIxD:>q-jܨg%=5͟DʩH92DrتdEfg^7ْ(x^.<2]F(f): n[Hx)5KD$:RMsHbO^<Ϲ๲y|n-s5 :CGRH"Iw͕ϕs$Գ~Mtc*JY̱yyTg/`q e<%Dž$xhuy>~>r?(˅$xt1U!?@?A>F;U!=Y&>Z+>[+;j#8! 6 2/ -'       (0> N[#q+ |  W~ "8Zozу{Цnɜ[ŊK{=v)dTZUSrU6[XYZZZ[Z[ZX`TRhEMq5Lv&Kv!Hs Hr Hs ItHm?n?q=qRG䣋 N0&)Pʵ sؿ$6 Ȩr]W^*`f# V!*kIFm~A`{!*AҹUU՗ʐO3W|ӫ\ڒERʞ*[;Fْ "$L~P^W1O>S<ܫ },mt-`$Z*oR"H%쁐q]z"!j~I?~ݟNʧ٩_>sNN=hrW-`//4QJ 1_II7r_sVE& *$edX)~[ xQ%LK&x&=P>%qyINM|NxϋN^}|^-//[Ο/PI}.Ih")C6xs jAv^%Jԝ~3,;7I]V*i `WiqjJ X|SS0N% AdI+'IZx*IdN9PVRqw\gTqz1Rf_Ų\|`Մ $ǏԤ̒)(! ߜ!*+PEOo";.x3/Jz>Xe=/VB64Dk 񠪛u2QbaJO/( ) tޣQoNUg^]ԫ*-T`WFu/!Nf)KHLHH(+MLHL,)I,- J+JJhR3hƊW$$҄2LܫJ#{Bv:OUX]༌M'2wXg)޽—u. qش+A3*QKޚjEk-޿ne=GAw="c0 iUEC6UJقmBsx(O7ż-氉޼s< (ne:ŇonlaO+V:|ms2uU &P/v;#]׋G>? 6(_ZƉi`fQr=柶 gAVP'jV^=|Ʀ 03Sc\c鮻;ڡ&;+GmuZ'}J"rC!c-⶟ʳ|ҽQ^ɹ,U1)gdk+fEK ; wQsq孶*B9y/N9vq\ R;G+Nwx~^d -<; gLΥX4hhQ1i7Lw=(|zZ5?SFab<K~n/Rr2=n:vQ]Ds(Ln^%bмKlgދr)+4[`P9&-7?-}~MɏV͹0=`&A #t7*[p/%b88` A `0 A [h6UAQAfAa+S?5%D+S~t'rĩ(^XmzkxGWw{zzETy3rKoQ 9dɡR%v j|)`4gEt+10,71bXVʟ"1'$`_WT7F'JKR W+Ҧ b(&9>ٓ쮤@RɚTv} -d_BvYK^Ztqt/gTi'3i%7n*f3[+c;:3G9q}W[ssƨoX5`55gou45TF3 ~3ŠB`𸤔+$P&e, bZB.kih^Kdgg{\vlɒ%Y0`?x6O8V͠pKZZZr&''6vZg0 ` #>{M՝Q9g21|r :$IR6UC>U,eg.Qg+eʗ.83ʗa`趔ƔuE>95ilHqq[>4lr7cr[XޡCW=ϟʷp~-z>3Izkn_^Kk];;999[`C%X0Lu+I.ds7,LkJr 0l˓Ml Ybp06RkIJʺzK/={au.N&-7EbQ~v025uP??1B)`Skξ^qv6`5xudNvc )a/Zf$LG父$b6;+Y!lY6Uy^_zkX_,KIIDЋlK1. OvHyd`S>$L[uS{뭷8n 4 葦}5t[4WPzi"ߑw4.u"c0C#H (^fDi|lDZ6Uvg{{>]Xkz4qr0JXA[A/~s1 0-=1Zcc#c##v'ɿFF-b1I-a@mLrZc0zգ|]s޽zQW_r;;--5uJ&L,m|aDQPaٓ>''wrտRkGS͵+}rmԭX5F]J FMb0RR=^$u#&~is똮N$Uwo\o\Es;s>H ݭf63M{Hq&FHS@R}^ZBoގ[ =1i{HGRɍEy,Y@9`.Xc6]*X M݇01iڕ3k"?;[pr*شAiƔjh/͂|uޮ<3&NfiZZnM}l]W_}uWW|{c--E?Hߣlb{ggO{}&_q~%RG6±I@#Fƛkꨅ2:VVSc'SDNb0Bݙl>];CMDN0(|A`>a| `+eQ|Ym1L^`P`XLi0m 6Yd0e8z{NI! '1bd4I,`O8IGV Ca ` 00h&t("6`HA A ` ` $ap0(:z94W/q H}0/^  >=f(KXxE p&)X_X\'l"@&^6)-3;H!E P`e 4e/p0"NX^_|P`ГE}0/^  >=f/q A\—@|bPl(H/^  =fƾ/q A\`A3`_  xa' & /q Ab{͌}0/^ x=Ƿ|x0tI?n|0E8^0]'c{n1/" }0 /.^ ]GŬ}05+غ c0uo\X BW~=lJEр6!p-[`;m r0a 9Cl/x0 A1^0L}xJH—~l Mng _l_p0gl?Kb0#"Ob/=}0(`k:+"6`D¾` AX왤 f'`1|"_,vb{83G ah/L^M= ` 00(N 'lI8B `; 26V5l`+mr !l`}TXM/rKĆ B6E*A0c1k\`h3H\8{EGDl\ =Yga#3lקp0^$ X 0̦} b600&x"`|^ Xv!%`/܂i,: zM$n"Bf1` ``Y [ :$ը9Eg_{WĀM`ᵎ+b/8z%xU#-٤#l !ܼtprlMl7OOɓjj1"2̫wr*y7tLp9Z\/#4^BbZ,y`0n͜޶* ^(")3LA `̂Xc_K~}.ƍ`Ql,MN52 &yE*`lSn`Q444,xΕe]AQ+q AO0_pdǭ Ni _p¿S 0`sËEq(SI8/C(^P{ۅnr>4ſ:'斋bwbju]:Z`p`tyT:2^ō-ͪU}!Q)Ka мNQy>cC%{R&(},ˍ~!n-J筢XxS%Gȧ̬:KC Ϋ&%++e3[Hɤ.zLP[%>gkBwllDc`RR,+;TH/~Oۅdz6yu0Vk Oxu UVⴉ%}zgqO ѢfAZ2(fY5#H:,N|:b<ڙɂ/hXHWo~jՋTve/O9SL0:JGB~06B54M6Nzx404OZ `SZ` 2*wh9oCFe^$` 0 >qۀ|Ay#g?QZRIENDB`Kst-2.0.8/docbook/kst/creatingplugins-chapter.docbook0000644000175000017500000010066012277111530021765 0ustar synthsynth Creating Additional Plugins &kst; has a simple and standardized interface that facilitates easy creation of additional plugins. In addition to detailing basic requirements for plugins, the following sections describe how to make use of pre-written header files to create certain types of plugins. Creating a Basic Plugin A &kst; plugin consists of two files—an XML file and a shared object file. The XML File The XML file provide information about the plugin and describes its inputs and outputs. The following is an example of an XML file for a &kst; plugin: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Module SYSTEM "file:/Repository/Level2/Soft/ProC/moduledef.dtd"> <module> <intro> <modulename name="testplugin"/> <!-- The name of the module --> <author name="Rick Chern"/> <!-- The name of the author --> <description text="A test plugin for me"/> <!-- A description of the module --> <version minor="1" major="0"/> <!-- The version number of the module --> <state devstate="release"/> <!-- The development state of the module (optional)--> </intro> <interface> <!--inputs here--> <input> <table type="float" name="Input Vector 1" descr="The first input vector" /> </input> <input> <float name="Input Scalar 1" descr="The first input scalar" /> </input> <!--outputs here--> <output> <table type="float" name="Output Vector 1" descr="The first output vector" /> </output> <output> <float name="Output Scalar 1" descr="The first output scalar" /> </output> </interface> </module> Generally, you can use the example above as a template and modify sections to fit your needs. As can be seen from the example, the XML file consists of one module node. The module node has an intro node and an interface node. You should modify the intro node appropriately using the comments in the above XML file as guides. It is important that modulename has the name attribute set to the same name that your shared object file will use. The interface node describes the actual inputs and outputs of the plugin. Each input is described by an input node, and each output is described by an output node. Each input or output should have either a table or a float node as a child. The type attribute of a table must be set to "float". Note that the order of the inputs and outputs matters—the order is used to determine the index values for each input and output array of the object file, and is the same order used to display the input and output fields in the &kst; plugin interface. Once you have completed the XML file, save it as [modulename].xml, where [modulename] is the value of the name attribute of the modulename node. The Shared Object File The shared object file contains the actual functionality of the plugin. In other words, it determines how to derive the outputs from the given inputs. The following are the requirements for the shared object file: The object must export the following C linkage symbol: int symbol(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) where symbol must be the value of the name attribute of the modulename node in the XML file. This is the only function that will be called by &kst; (although you may have other functions). The following describes each argument of this function: const double *const inArrays[] The array of input arrays. Each input array corresponds to an input vector. The arrays are in the same order as the vectors are listed in the XML file, so inArrays[0] is the array representing the first input vector, inArrays[1] is the array representing the second input vector, and so on. const int inArraysLens[] The array containing array lengths for each input array. The lengths are stored in the same order as the arrays in inArrays[] (e.g. inArrayLens[0] is the length of inArrays[0]). const double inScalars[] The array of input scalars. The scalars are stored in the same order as they are listed in the XML file. double *outArrays[] The array of output arrays. Each output array corresponds to an output vector, and the arrays should be in the same order as the output vectors are listed in the XML file. int outArrayLens[] The array that should contain lengths of the output arrays. The lengths should be stored in the same order as the arrays in outArrays[]. double outScalars[] The array of output scalars. The scalars should be in the same order they are listed in the XML file. The function must return 0 if it executed successfully, and -1 otherwise. The code for the object file must handle unexpected inputs, such as empty input arrays (in most cases a return value of -1 would be sufficient when such situations are encountered). The number and type of outputs must be exactly as specified by the XML file. You will probably need to resize the arrays in outArrays[]. To do so, use the realloc() function. E.g., outArrays[0]=(double*)realloc(outArrays[0], 5*sizeof(double)); will allocate space for 5 doubles for outArrays[0]. Do not use any memory allocator other than realloc(). The input arguments must remain constant. Do not cast them to non-constant types. The following is an example of the shared object file source code for a simple plugin: #include <stdlib.h> extern "C" int testplugin(const double *const inArrays[], const int inArrayLens[], const double is[], double *outArrays[], int outArrayLens[], double outScalars[]); int testplugin(const double *const inArrays[], const int inArrayLens[], const double is[], double *outArrays[], int outArrayLens[], double outScalars[]) //Accept 1 vector and 1 scalar. Multiply all elements of the vector by the //scalar, and output the resulting vector. Also output the original scalar. { //Set the outputs outArrayLens[0]=inArrayLens[0]; //resize the output arrays outArrays[0]=(double*)realloc(outArrays[0], inArrayLens[0]*sizeof(double)); //multiply each element of the input vector //by the scalar for (int i=0; i<inArrayLens[0]; i++) { outArrays[0][i]=inArrays[0][i] * is[0]; } //now set the output scalar outScalars[0]=is[0]; return 0; } Compiling the Plugin If you are using &gcc; to compile your plugin, simply compile the object file: cc -Wall -c -o myplugin.o myplugin.c -fPIC -DPIC and then create the shared library: ld -o myplugin.so -shared myplugin.o The resulting *.so file and *.xml file must be put in the same directory. When you use &kst;'s Plugin Manager to load the XML file, it will automatically look for the shared object file in the same directory. Creating Linear Fit Plugins To create a linear fit plugin, you could implement your own fitting algorithms and output the appropriate vectors. However, &kst; already comes with header files that make it easy for you to implement linear least-squares fit plugins by just providing a few functions. This section will describe how to take advantage of these files. Header Files Two header files are provided for performing linear fits, linear.h (for unweighted linear fits) and linear_weighted.h (for weighted linear fits). They are both located under kst/plugins/fits/ in the &kst; source tarball. To use these files, include only one of them in the source code for your plugin: #include <../linear.h> or #include <../linear_weighted.h> (by convention, we will place the source code for the plugin one directory below where the header files are). Implementing Required Functions Given a general linear model: where y is a vector of n observations, X is an n by p matrix of predictor variables, and c is the vector of p best-fit parameters that are to be estimated, the header files provide functions for estimating c for a given y and X. To provide X, the following function needs to be implemented in the source code for the plugin: double calculate_matrix_entry( double dX, int iPos ) This function should return the value of the entry in column iPos of the matrix of predictor variables, using x value dX. This function will be called by linear.h or linear_weighted.h. The implementation of this function depends on the model you wish to use for the fit, and is unique to each linear fit plugin. For example, to fit to a polynomial model, calculate_matrix_entry could be implemented as follows: double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } Calling the Fitting Functions Once the appropriate header file has been included and calculate_matrix_entry has been implemented, call the appropriate fitting function included from the header file: kstfit_linear_unweighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); or kstfit_linear_weighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); Each function will return 0 on success, or -1 on error, so it is a good idea to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows: inArrays[0] must contain the array of x coordinates of the data points inArrays[1] must contain the array of y coordinates of the data points inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit. The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin. iNumParams is the number of parameters in the fitting model used, which should be equal to the number of columns in the matrix X of predictor variables. iNumParams must be set correctly before the fitting function is called. After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows: outArrays[0] will contain the array of fitted y values. outArrays[1] will contain the array of residuals. outArrays[2] will contain the array of best-fit parameters that were estimated. outArrays[3] will contain the covariance matrix, returned row after row in an array. outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom. outArrayLens will be correctly set to indicate the length of each output array. Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function). Example The following is an example of the source code for a linear fit plugin. /* * Polynomial fitting plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #include "../linear.h" double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } extern "C" int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { int iRetVal = -1; int iNumParams; iNumParams = 1 + (int)floor( inScalars[0] ); if( iNumParams > 0 ) { iRetVal = kstfit_linear_unweighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); } return iRetVal; } Creating Non-linear Fit Plugins &kst; provides header files designed to simplify the creation of non-linear least-squares fit plugins. The following sections detail the use of the header files. Header Files and Definitions The non-linear fit header files are located in kst/plugins/fits_nonlinear of the &kst; source tarball. The files are named non_linear.h and non_linear_weighted.h for unweighted and weighted fits, respectively. To use these files, include only one of them in the source code for your plugin: #include <../non_linear.h> or #include <../non_linear_weighted.h> (by convention, we will place the source code for the plugin one directory below where the header files are). As non-linear fitting is an iterative process, you must also define the maximum number of iterations that should be performed. The non-linear fitting algorithm will stop when at least one of the following conditions is true: The maximum number of iterations has been reached. A precision of 10-4 has been reached. In addition, you need to define the number of parameters in the model, as it is not passed to the fitting function explicitly. To define these two values, include the following at the top of your source code: #define NUM_PARAMS [num1] #define MAX_NUM_ITERATIONS [num2] replacing [num1] with the number of parameters in the model, and [num2] with the maximum number of iterations to perform. Implementing Required Functions To use the header files for non-linear fits, you must provide the function to use as the model, the partial derivatives of the function with respect to each parameter, and initial estimates of the best-fit parameters. To do this, three functions must be implemented. These functions are described below. double function_calculate( double dX, double* pdParameters ) This function calculates the y value of the fitting model for a given x value dX, using the supplied array of parameters pdParameters. The order of parameters in pdParameters is arbitrary, but should be consistent with the other two implemented functions. For example, for an exponential model, function_calculate could be implemented as follows: double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) This function calculates the partial derivatives of the model function for a give value of x dX. The partial derivatives should be returned in pdDerivatives. The order of the partial derivatives in the array pdDerivatives should correspond to the order of the parameters in pdParameters (i.e. if pdParameters[0] contains the parameter lambda for an exponential model, pdDerivatives[0] should contain the derivative of the model with respect to lambda). void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) This function provides an initial estimate of the best-fit parameters to the fitting function. The array of x values and y values of the data points are provided in pdX and pdY respectively, and the number of data points is provided by iLength. You can use any or none of these parameters at your discretion to calculate the initial estimate. The function should put the calculated initial estimates in pdParameterEstimates, with the order of the estimates corresponding to the order of the parameters in pdParameters of function_calculate and function_derivative. Keep in mind that the initial estimate is important in determining whether or not the fitting function converges to a solution. Calling the Fitting Functions Once all the required functions have been implemented, the fitting function from the included header file can be called: kstfit_nonlinear( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); or kstfit_nonlinear_weighted( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); depending on whether you are implementing a non-weighted fit or a weighted fit. The function will return 0 on success, or -1 on error, so it is simplest to set the return value of the exported C function to be equal to the return value of the fitting function. To maintain simplicity, the code for the plugin can simply pass the arguments given to the exported C function to the fitting function. Note, however, that inArrays must be structured as follows: inArrays[0] must contain the array of x coordinates of the data points inArrays[1] must contain the array of y coordinates of the data points inArrays[2] only exists if kstfit_linear_weighted is being called, and must contain the array of weights to use for the fit. The easiest way to ensure that inArrays is structured correctly is to specify the correct order of input vectors in the XML file for the plugin. After kstfit_linear_unweighted or kstfit_linear_weighted is called, outArrays and outScalars will be set as follows: outArrays[0] will contain the array of fitted y values. outArrays[1] will contain the array of residuals. outArrays[2] will contain the array of best-fit parameters that were estimated. outArrays[3] will contain the covariance matrix, returned row after row in an array. outScalars[0] will contain chi^2/nu, where chi^2 is the weighted sum of squares of the residuals, and nu is the degrees of freedom. outArrayLens will be correctly set to indicate the length of each output array. Ensure that the specified outputs in the XML file match those that the exported C function returns (which in most cases will simply be the outputs returned by the fitting function). Example The following is an example of a non-linear fit plugin that performs a fit to an exponential model. /* * Exponential fit plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #define NUM_PARAMS 3 #define MAX_NUM_ITERATIONS 500 #include "../non_linear.h" void function_initial_estimate( const double* pdX, const double* pdY, int iLength, double* pdParameterEstimates ) { KST_UNUSED( pdX ) KST_UNUSED( pdY ) KST_UNUSED( iLength ) pdParameterEstimates[0] = 1.0; pdParameterEstimates[1] = 0.0; pdParameterEstimates[2] = 0.0; } double function_calculate( double dX, double* pdParameters ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dOffset = pdParameters[2]; double dY; dY = ( dScale * exp( -dLambda * dX ) ) + dOffset; return dY; } void function_derivative( double dX, double* pdParameters, double* pdDerivatives ) { double dScale = pdParameters[0]; double dLambda = pdParameters[1]; double dExp; double ddScale; double ddLambda; double ddOffset; dExp = exp( -dLambda * dX ); ddScale = dExp; ddLambda = -dX * dScale * dExp; ddOffset = 1.0; pdDerivatives[0] = ddScale; pdDerivatives[1] = ddLambda; pdDerivatives[2] = ddOffset; } extern "C" int kstfit_exponential(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int kstfit_exponential(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { return kstfit_nonlinear( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); } Creating Pass Filter Plugins &kst; provides header files to simplify the implementation of pass filter plugins. The use of these header files is described below. Header Files The pass filter header file is located in kst/plugins/pass_filters of the &kst; source tarball. The file is named filters.h To use this file, include it in the source code for your plugin: #include <../filters.h> (by convention, we will place the source code for the plugin one directory below where the header files are). Required Functions The filters.h header file contains a single function that calculates the Fourier transform of a supplied function, applies the supplied filter to the Fourier transform, and then calculates the inverse Fourier transform of the filtered Fourier transform. To supply the filter, the following function needs to be implemented in the source code for your plugin: double filter_calculate( double dFreqValue, const double inScalars[] ) This function should calculate the filtered amplitude for the frequency dFreqValue. inScalars[] will contain the unaltered input scalars for the plugin, specified in the XML file. Most likely inScalars[] will contain cutoff frequencies or other properties of the filter. For example, to implement a Butterworth high-pass filter, filter_calculate could be implemented as follows: double filter_calculate( double dFreqValue, const double inScalars[] ) { double dValue; if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) ); } else { dValue = 0.0; } return dValue; } Calling the Filter Function Once the required filter_calculate has been implemented, the filter function from the header file can be called: kst_pass_filter( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); The arguments supplied to the exported C function can usually be passed to kst_pass_filter without modification. However, there are a few restrictions on the arguments: inArrays[0] must contain the array of data to filter. inScalars should contain the filter-specific parameters to be used by the filter_calculate function. After the function call, outArrays[0] will contain the filtered array of data, and outArrayLens will be set appropriately. The kst_pass_filter function does not use outScalars. Example The following is an example of a pass filter plugin that implements the Butterworth high-pass filter. /* * Butterworth low pass filter plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #include <stdlib.h> #include <math.h> #include "../filters.h" extern "C" int butterworth_highpass(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int butterworth_highpass(const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { int iReturn; iReturn = kst_pass_filter( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars ); return iReturn; } double filter_calculate( double dFreqValue, const double inScalars[] ) { double dValue; if( dFreqValue > 0.0 ) { dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) ); } else { dValue = 0.0; } return dValue; } Kst-2.0.8/docbook/kst/Screenshot-kst-datamode.png0000644000175000017500000000510412277111530020774 0ustar synthsynthPNG  IHDRPLTExxxiii^^^UUUDDD'''+bb+(k&IDATxGr:`r)XSTV8Oh&Dn\x# @r)ܜlC 4ps "yENP2A;oA 7 S#E(( t(#V IAMʏM^rq8q?(N= ڵ*XŬ)K8 #AQ,pi %t\wXg8 Am uP!輁ct=nuQ?ؘMCdu:;OT@Wh:,qA Z4S&N|ZAy-$v6O<+|Ỹ`Ez04Ih !tQ] *#P)SHڷI G7}@q;Z{6EN6 oy;Pn T} A -B4/n*ehi}tCȬ4Aہ6 A,8o(ASݧfJ-B 6:^V j*Àh AgбQ AQA-*E}uZY:!(AB AKZr 1':-J |JP7 Z- hPAu 67h²5 V@!%hRJӠBPWcd 0쎠Hc.Lhճ;J1@hŝ{ x!Z@Q _^==JЏ}-Rрq@CRuSм]psl>"1Z4A|:(|>h-Ь M?5Qt2#4;=,P!42^-3t2V_s@I ЄvиҍnPY$6}lz "r$,uʵ\C i/ų+4.@{^(&@cC!:ܸu:O&`.@vAa(A/{CyS݃-c#C^,yntתl'sA'kSA&AGc!@O Q<?@%T@KG@+Ag+5 N a# @1[5>Uߠmpp N{JɷuK=߰-e@ @dG{_8NzKwm&v[ P? c&Agwm"xAA-. :MALACNOeD J~mn6Ayv">NVIT~|!{_.śGK؉ވ܇[ _5x"r/-? DIENDB`Kst-2.0.8/docbook/kst/install-chapter.docbook0000644000175000017500000001576412277111530020247 0ustar synthsynth Installation The following sections contain detailed instructions for obtaining, compiling, and installing &kst; along with any optional libraries or packages. If you use a package management system, you may use it to install &kst; instead. Obtaining &kst; &kst; is part of the kdeextragear-2 module of &kde;. You can also download the latest version separately from the &kst; website . If you wish to download &kst; from CVS, it is available via anonymous CVS for &kde; or via the &kde; WebCVS repository. Installing &kst; from Source The following sections detail how to compile and install &kst; from source code. Requirements &kst; v1.2.0 requires the &kde; 3.1 libraries and &Qt; 3.1. Almost all major &Linux; distributions have packages for &kde; and &Qt;. Since &Qt; is a dependency of &kde;, having the required version of &kde; should be sufficient. It is recommended that you refer to your particular distribution's documentation for &kde; library installation. Note that the entire &kde; desktop environment is not required—in most cases, look for packages called kdebase-* and kdelibs-*. Alternatively, more information is available on the &kde; website. Optional Libraries and Packages The following libraries and packages are optional, but provide full plugin and data source functionality in &kst; if installed. The installation instructions assume you have root access on your system. You may already have some or all of these libraries and packages installed, in which case there is no need to reinstall them. Also, check first to see if pre-compiled binaries for the libraries and packages exist in your distribution's package management system, as it may be easier to install the binary packages. &GNU; Scientific Library (GSL) The &GNU; Scientific Library provides a variety of mathematical operations for the built-in &kst; plugins. Having GSL installed enables a variety of plugins such as linear and non-linear fitting, correlation, and interpolation plugins. The library can be found at ftp://ftp.gnu.org/gnu/gsl/. Alternatively, you can find GSL under /gnu/gsl on the mirrors listed at http://www.gnu.org/prep/ftp.html. Download gsl-version.tar.gz, where version is the greatest version number found in the directory. Then unzip and untar the file: tar -zxvf gsl-version.tar.gz replacing version with the version number of the downloaded file. Read the INSTALL file in the resultant directory for detailed installation instructions. For most systems, the following will work: cd gsl-version ./configure make make install CFITSIO The CFITSIO library provides support for reading and writing to the FITS (Flexible Image Transport System) data format. The libary can be found at ftp://heasarc.gsfc.nasa.gov/software/fitsio/c/. You only need to install the library if you anticipate reading or writing to the FITS file format. Download cfitsioversion.tar.gz, where version is the greatest version number found the directory. Then unzip and untar the file: tar -zxvf cfitsioversion.tar.gz replacing version with the version number of the downloaded file. Read the README file in the resultant directory for installation instructions. For most systems, the following will work: cd cfitsio ./configure --prefix=/usr make make install You may need to change the directory specified for the option, but the most common directory is /usr Compiling and Installing Once all of the prerequisites have been met on your system you can compile and install &kst;. It is assumed that you have already downloaded the &kst; source package. If not, please see Obtaining &kst;. The simplest way to install &kst; is: tar -zxvf kst-version.tar.gz cd kst-version ./configure --prefix=`kde-config --prefix` make make install replacing version with the version of &kst; you have. Note that kde-config --prefix is surrounded by backquotes. It is very important that the kde-config utility returns the correct path (most likely /usr), otherwise &kst; will not install properly. You can double-check by running it directly: kde-config --prefix Ensure that a non-null path is displayed. You can read through the messages displayed by the configure script—if it reports any missing libraries (such as GSL) that should not be missing, please go back and ensure that the libraries and header files have been correctly installed in the appropriate locations. Kst-2.0.8/docbook/kst/Screenshot-kst-histogramwindow.png0000644000175000017500000001250312277111530022444 0ustar synthsynthPNG  IHDR $$PLTE^saC  #$-%*0-.1//2+/5!1C4N9X<` =a=c?f Jy L{ L{ L{!L{$M{'Mz)O|,V/\.]2_6d7j6n9n=pArDqFmIjJiJiJiJiKhQVTRURRURRURRURSVSdfdŢzcccbbaZRQMFFID~;{5|3~588/ $s!T)h5999:@AAAAABIJJKKNSSSWYZ[^accekpt}ꃷ焷犽M!htRNS:IDATxOh_|j0 EY;ڪ)9 Dr6vRZ -!UECO0!Pp7NlcQCP6 8Ly쿙Wڙ7y}}x۶6oCwǽ7Pylε|\ײ300 Qj1_vĸNpա[#qG+`9Đ#A!NI|+;ƺD?t,dLȠ$Ν>d N#>XiN&=`ѴCLc- rF2NL(ɶXX~ccXC 8k* S\Js yFu4^?Pž' vE1bv;1ݻG@BXSFY;j(*_)ĩ<#Z^j#1Q'JZ,rDT_,,/4: 4HG yi^\lkiaG+jebx0K{B.d~\f2 J[ԓepug,+*|G1u !']+w*0+G?ut㊲0 D8_V10.b( kĀP1Èb8t֡ 1:-š0bA Gz' MbC{q b@Ȭ<"#1. 7CڂNCf+B "D[t@2=h ĠZ[,q@G*f& 1L b=B;Fh9[|Gr}CroFj M )9{C3FSУp `7XAeB xהb xw>A7]{(4A (ĀP1pb0µ{վ wbb7Ɏ 8Q7e0D2KꞞG \`ݡ5 VRkĠ Z F֝ho Df{(\R oq[904xq81#$v0 f7Q}R-Q 葒R21)O#| Cs_Cʳd17b@!ĀB \Ϝ!l)qhFP Щ*F("! i.?Bgop޽ _bUBpD,@?p6"eᎁA cX!1\x]*Z26(0ܶ/ϋa̞*I 4C!ĀB FC5:IfZwE!)u1T.gRBtQjĀC)'bYoo!$z +@fn> Π# ?^> ; qn>b ; /f'86lsPC Co@ Ԩ7 ߹( @cr:oS7x1)!ĀaV2Ox/zDE@1b@!ĐjwNs ơ61}+{ve0tt9r)wZC* •&٪3o!0j1v#hM'7_jc !=(voPt /E%p=]lt{@ 08|~|CK (ĀP1 Āb@ 1b@ {UjJCR VQ^&l1ZGU9J)kNU)`RjC9(q"􆃕 ػsνA?Ŷkbe?o/F$݁^uHNR۠Z%v?-bo[-3Uk 㦬:$°kCwbgO9G`P }u0k]g`z-mmp04CYbh(90`ZCHh9(A1B 577``8X_}TeD˳]pzS6~ [mխmˉk_]2iz=Lurݷ a;⌒Ue^Qo{^JկP*l]!װ]2k //~-kT [ul *[-N1|#ty7, ~q[ohy#F K3-6#S3k3)K;[zrT^P AO#b`/*o]~?T޺v;Tފ+ll1f}3*;]qax6#SmrjkPaxl6?^G{ͽM2$Ė61dޤA666iױ)!SU x1DᅕjbENM雲¢M9 *]|ۛWEM_[wkFZjFҍ\ԺI0lml~lRmm͒h!div,Y"xFi6M>J&L ;8I!^FF VJ =S) `dֈ)2]# ;&\A"$3cQ`j_i UM`cĐOs6Ǒ˜;&xyZ8mV~c8b@O.`س6e7\$}>.M&&J`$o,?Kfzem=8IENDB`Kst-2.0.8/docbook/kst/Formula-kst-gradientequation.png0000644000175000017500000000057412277111530022057 0ustar synthsynthPNG  IHDR? 8CIDAT8ԯ@{.(4r=X$v%]_N i~Oܯ\y󺎚LٝI.O?Rֳԁwp ɴ81_Y" L~{sZPTN>9jn?*6YQkZ/̓YCJKx`?QkŪv^tvnkGW8)`xkj`T0\Qxz~O0?[ipA=\ ;omL'2foh}f(YF=>;KfCIENDB`Kst-2.0.8/docbook/kst/license-chapter.docbook0000644000175000017500000000074012277111530020207 0ustar synthsynth Licensing &underFDL; Kst-2.0.8/docbook/kst/Equation-kst-correctedpitch.png0000644000175000017500000000144412277111530021673 0ustar synthsynthPNG  IHDRJOrIDATX?hp@@9 Appqppnppqrpps:t蔡 R28dp)tqsrq)(tD(ţXh 5 8 $uބ|cw/rD+ޠާ8ǀ':|"3;@>6S9TNhI{QWiZVAԥ  rfrg)&H P77Z'05{)dxL'MM͕݆zea4S$Ͽ-_UW޲Tpߗ1pb>:wt';bȹ睮1>fPMpUy<.=7:6h:rUۺ aQ޽G]r/֜3hbDmHiFz4S 뤚ҝ7A܄d@-?7~{.oA-i߱JreZ6>|e?YÞ}6IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-eventmonitor-loggingsettings.png0000644000175000017500000000645212277111530025163 0ustar synthsynthPNG  IHDRh'j;PLTEōvtsrnkihcbbba[ZZZZZZYVSRRRRRRRRQNKJJJJJIDBAAAAAAAA@:9999::=DIORRQNMJFCA=73~3|6z8z8w6r5n4m7n9o(-5"/':ltRNSdh IDATx?hU2R1.\P : 0#`V1΅" * 5nԨp H@ ba+#]aα nbnM޿yvx|{{g~4;NLN 皜lmrD%ȹZ/&W?JZ,NP^JNl=Y,NO O^Q|r'M;ʻc3Y<@/7)Z`f8i9;ovc=X'6-Ҙ=z@ Ƌ85'@>}(R1hFkoޑ9<$Bno%h5Gh]rBgͪlKӑ:&8;kN c3 TqWcbHu.x#7<x=Pع8̦*G47\o'~-Moֱ4 '>#pzX^b)aa\zš$gMZna`QGg5zK4[" +[>WݽMdqZZA/-9W׫<r^z]l& z%%u=,N#z%@/B9ur/hhh!hhhhhhhhhhhhhhhhhhhhhhhhB='uA} 4@C c c?c ɥc|2zitI^R62(}&Ji3Z}xpnW]2 $R)GL CqA_2(K:h$Z4H2Sr1}9gNK65c6vqp[F@E" Z:AK~UFk_$1EkFw\vLK햎q]Lftx֡YG!:0:uAIʘetz⍏ t:蛑JST:7h\pn$@f4@C @4@C @rE% h /Rj+݇jgP!idB3u< %xE@*Ral- h.tvS@(IާkS]۽ FpL\A6)wӿz5 #sMt۪AbYg4&]ѝAaF)I35Hp&tx99㼸_@[i¼6FpWhhh:zNsϹY5Kpڧ$;w娻NIϗvѹf(F!kCpbt{NA_e <% 'q}!.vBRvk8*4'hu@bnϤV)2gF#98:-Ll)%gGv "$7j_~|8 k1h{/كCd`# _L"ÞD dņuM4iG_{ЉP@_kF2jӇ\wSV9נ_}HTA\8%h nA_m6JB{K)bЅ(Đ>5VT+^'F"uȤ / UOR=R )Dv3⓻mXÉ(jHۥ`f4YA4ۋAJ='fiƜMSU8ד.&g}_jLܠ1 9J=wz:O_8}}_!81K;зsc7z}-Q 0gx{E o q< hhhhh%\d A7D/IENDB`Kst-2.0.8/docbook/kst/data-chapter.docbook0000644000175000017500000013565112277111530017510 0ustar synthsynth Working With Data Supported File Formats Currently, Kst supports ASCII text files, BOOMERANG frame files, and BLAST dirfile files as data sources, as well as PIOLib and FITS files with the appropriate libraries. This section describes basic data source concepts common to all file types, and specifically details the ASCII and BLAST dirfile file types. Data Source Concepts A data source in &kst; is simply a supported data file. The following concepts are important in understanding how &kst; works with different data sources. Some terminology is also introduced in this section. Samples A sample is considered to be the fundamental unit with respect to data files. Each sample consists of one data value in the file. Note, however, that one sample may not correspond to one value in a data vector in &kst;, due to the concept of frames. Fields A field usually corresponds to one vector in &kst;. For example, a column in an ASCII data file is considered to be one field. Each field can have an explicit or implicit name. Datasource readers provide functions for reading and obtaining fields and field names. Frames A frame corresponds to a set number of samples, and each field in a data file can have its own ratio of samples per frame. The size of a data file is measured by the number of frames it contains. For ASCII data files, the number of samples per frame is 1, but for some data files, there may be multiple samples per frame. In the below illustration, the first 3 frames of an imaginary data file are shown. In this particular data file, Field 1 has a ratio of 5 samples per frame, Field 2 has a ratio of 2 samples per frame, Field 3 has a ratio of 3 samples per frame, and Field 4 has a ratio of 1 sample per frame. Depending on the specific data vector settings in &kst;, data from files may be read as frames instead of samples, with either the first sample in a frame or the mean of all the samples in a frame representing the value of the frame. INDEX Field Some data files may not have a field that represents the x axis of a plot. However, &kst; implicitly creates an INDEX field for all data sources. The INDEX field simply contains integers from 0 to N-1, where N is the number of frames in the data file. ASCII Input Files The simplest input file format is the ASCII text file. These files are usually human-readable and can be easily created by hand or simple scripts if desired. The following is an example of an ASCII input file. 112.5 3776 428 187.5 5380 429 262.5 5245 345 337.5 2942 184 412.5 1861 119 487.5 2424 138 567.5 2520 162 637.5 1868 144 712.5 1736 211 787.5 1736 211 862.5 2172 292 937.5 1174 377 1000.5 499 623 Each column of this file represents a field, while each row represents one frame. Columns are separated by tabs or spaces, and rows are separated by carriage returns. Note that due to their structure, ASCII files cannot have multiple samples per frame. Also, since the columns do not have labels, field names are assigned by &kst; based on the order of the columns (the leftmost column has a field name of 1). Commented lines in ASCII files start with one of the characters in the set {#, !, /, ;, c}. All commented lines and empty lines are ignored by &kst;. Valid numbers include those with decimals, negative signs, or e, to indicate scientific notation. Invalid numbers (such as English words) are replaced with 0 by &kst;. BLAST Dirfiles BLAST dirfile data sources are actually directories of files. Each directory represents one data source, and each file in the directory, with the exception of a file called format, represents a single field. The file named format lists each field and its properties. Below is example of such a file: scount RAW f 1 fcount RAW f 20 sine RAW f 20 ssine RAW f 1 cos RAW f 20 In this example, scount, fcount, sine, ssine, and cos are field names. RAW indicates the file is written in raw format, and the last number in each row is the number of samples per frame. When selecting a BLAST dirfile for use in &kst;, the directory containing the field files should be selected. &kst; will when automatically look for a format file, if it exists, to determine the fields and their properties. The Data Wizard The Data Wizard provides a quick and easy way of creating vectors, curves, power spectra, and plots in &kst; from data files. To launch the wizard, select Data Wizard... from the Data menu. You will be prompted to select a data source. Browse to a valid data file (or enter in the path to a data file) and click Next. The following window will be displayed. Data Wizard Screen 2 Data Wizard Screen 2 Select the fields you wish to import into &kst;. You may filter the list of fields by entering a string to match (wildcards such as * are supported) into the text box above the list. The Data Range section is used to specify the range of data to read from the selected vectors in the input file. The following discussion assumes knowledge of frames. For a detailed description of this concept, see File Formats. Starting frame, Count from end, Number of frames, and Read to end Using these four settings, the lower and upper boundaries of the data range can be set. For example, to read from frame 10 to frame 900, enter 10 for Starting frame and 890 for Number of frames. To read from frame 500 to the end of the file, enter 500 for Starting frame and select the Read to end option. To read only the last 450 frames from the file, select the Count from end option and enter 450 for Number of frames. The combinations used in the previous two examples are often useful for reading data from a file that is being updated in real time. Subsequent additions to the file are read, causing associated vectors to be updated as well. Read 1 sample per N frames and Boxcar filter first In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per N frames (where N is the entered value) is not selected, all samples in the selected range will be read. Alternatively, frames in the data file can be skipped by selecting Read 1 sample per N frames The value of the 1 sample that is used to represent a frame depends on whether or not Boxcar filter first is selected. If Boxcar filter first is not selected, the value is the same as the value of the 1st sample in the frame. If Boxcar filter first is selected, the value is the mean (average) of all the samples in that particular frame. Power Spectrum and X axis settings can be specified within the Plot Types section. These settings are described below. XY, Power Spectrum, and XY and Power Spectrum Select whether to plot the power spectrum only, data (XY) only, or both. If the power spectrum is selected for plotting, additional settings in this section become available. X Axis Vector The vector to be used as the independent vector for the plots. You may select a field from your data file, or the INDEX vector. The INDEX vector is simply a vector containing elements from 0 to N-1, where N is the number of frames in the data file. The FFT Options subsection in the Plot Types section is available only if a power spectrum is to be plotted. The below definitions assume basic knowledge of power spectra—for further details, refer to Numerical Recipes in C: The Art of Scientific Computing, published by Cambridge University Press. Interleaved average and FFT Length The power spectrum is defined as the square root of the absolute value of the mean of the interleaved Fast Fourier Transforms of length 2^x, where x is the value entered in the FFT Length selection box. Selecting Interleaved average allows the length of the interleaved Fast Fourier Transforms to be specified. If Interleaved average is unchecked, &kst; will determine the length based on the length of the vector. Data units and Rate units The units specified in these textboxes are used for the purpose of auto-generating axes labels for the plots. Sample rate The sample rate is used to generate the X axis of power spectrum plots. Apodize If this option is selected, the data is apodized using a Hanning window, to reduce bin-to-bin leakage. Remove Mean Select this option to remove the mean from the selected data (i.e. translate the data so that the mean is zero). Once you are satisfied with all the settings, click Next to advance to the next window. Select any filters you wish to apply to the data, and click Next to advance to the final window. Data Wizard Screen 3 Data Wizard Screen 3 From here, you can change general plotting settings. Most of the settings are self-explanatory. A brief overview of each section is provided below. Curve Style Select whether to plot data points only, lines connecting the data points only, or both. By default, lines are continuous with weight 0, and data points are marked using crosses. Line and data point colours are chosen so that curves with identical colours are minimized. Note that the curve style settings apply to both Power Spectra and XY plots. Curve Placement Select the plots to place the new curves on. Cycle through distributes the curves on the plots by cycling through the plots. Note that the curve placement settings apply to both Power Spectra and XY plots. Label Generation Select the desired labels and legends to be placed on the plots. Plot Placement Select the desired window(s) to place the new plots on. New windows can be created for the plots by selecting In new window. Once you are satisfied with all the settings, click Finish and the plots will be generated. The Data Manager The Data Manager provides a central location for adding, deleting, and modifying all the data objects used in &kst;. It can be accessed by selecting Data Manager from the Data menu. Creating New Data Objects To create a new data object from the Data Manager, click on one of the buttons listed under New:. A new window will be displayed, allowing options and settings for the data object to be set. You can also create new curves by right-clicking on a vector and choosing Make Curve... Since you are creating a new data object, you may enter a unique name to identify the object. The default name can be used as well (if it is unique). The settings for all plottable data objects except images have two common sections—Appearance and Placement (images only have the Placement section). These sections are described below. For data-specific settings, see Data Types. Appearance The Appearance section allows you to change the appearance of the data object when it is plotted. Clicking this button displays a colour chooser dialog box, which can be used to change the colour of both the lines and points. Show points Selecting this checkbox shows the data points used to plot the data object. The drop-down list to the right allows the shape of the points to be changed. Show lines Selecting this checkbox shows the lines joining the data points for the data object. The thickness of the line as well as the line style can be changed. Placement The Placement section specifies the plotting location of new plottable data objects. Plot window Specify the window in which to plot the data object. You may create a new window by clicking the New... button. Place in existing plot, Place in new plot and Do not place in any plot You can choose whether or not to immediately plot the data object on a new or existing plot. If Place in new plot is selected, you can also choose to re-arrange the layout of the plots by selecting re-grid and entering the number of columns to use for the new layout grid. Once all the desired settings for the new data object have been set, click the OK button to create the new data object. Editing and Deleting Existing Data Objects To edit an existing data object, simply highlight it in the Data Manager window and click the Edit button. The settings window for the selected object will be displayed. This window is identical to the one displayed when creating new data objects (with the exception that the Placement section may be absent), so refer to Creating New Data Objects for more information on the settings and options. To delete a data object, highlight it in the Data Manager window and click the Delete button. Note that the entry in the # Used column for an object must be 0 before the object can be deleted. The # Used column indicates the number of times that a particular data object and its children (if any) are used by either other data objects or by plots. Listed below are some consequences of this restriction to keep in mind when attempting to delete data objects. All plottable objects (curves, equations, histograms, power spectra, and images) must be removed from plots before they can be deleted. An object can be removed from a plot by right-clicking on it in the Data Manager window and selecting the desired plot from the Remove From Plot submenu. All data objects that use a particular data vector must be deleted before the data vector can be deleted. All children of a parent data object must be unused before the parent data object can be deleted. After a sequence of deletions and removals of plottable data objects from plots, you may find that there are numerous unused data objects displayed in the Data Manager. To quickly remove these objects, you can click the Purge button. Data Types There are nine main types of data objects in &kst;. Data objects can contain other data objects, as represented by the tree structure view in the Data Manager. The following diagram illustrates the relationships between the different data types. &kst; Data Types As can be seen from the above diagram, the curve, equation, histogram, power spectrum and image data objects are the only data objects that are plottable. All data objects (other than vectors) have the capability of using vectors, while equations, power spectra, events, and plugins all contain slave vectors. Descriptions of each data type are provided below, along with overviews of the settings and options available when creating or editing each type of data object. Settings common to almost all data types have been omitted—see Creating New Data Objects for more information. Vectors Vectors are one of the most often-used data objects in &kst;. As their name implies, vectors are simply ordered lists of numbers. Most often they contain the x or y coordinates of a set of data points. As vectors can be potentially quite large, it is a good idea to be aware of the amount of memory &kst; has allocated for use. The current available memory is displayed in the lower right corner of the status bar of the main &kst; window. If the status bar is not available, ensure that Show Statusbar is checked in the Settings menu. The following is a screenshot of the window displayed when creating or editing vectors. Explanations of the settings are listed below. Edit Vectors Edit Vectors Data Vector Parameters The source file and field to read can be set using the following options. File name The path to the desired data file. Clicking the button to the right displays a file browser window that can be used to graphically browse to the file. Field or column The field or column to create a vector from. Data Range This section specifies the range of data to use from the selected field for the data vector. Starting frame, Count from end, Number of frames, and Read to end Using these four settings, the lower and upper boundaries of the data range can be set. For example, to read from frame 10 to frame 900, enter 10 for Starting frame and 890 for Number of frames. To read from frame 500 to the end of the file, enter 500 for Starting frame and select the Read to end option. To read only the last 450 frames from the file, select the Count from end option and enter 450 for Number of frames. The combinations used in the previous two examples are often useful for reading data from a file that is being updated in real time. Subsequent additions to the file are read, causing associated vectors to be updated as well. Read 1 sample per and Boxcar filter first In addition to the lower and upper range boundaries, the samples to read from the selected range can be set. If Read 1 sample per is not selected, all samples in the selected range will be read. If Read 1 sample per is selected, only 1 sample per N frames will be read, where N is the number entered in selection box to the right. The value of the 1 sample that is used to represent a frame depends on whether or not Boxcar filter first is selected. If Boxcar filter first is not selected, the value is the same as the value of the 1st sample in the frame. If Boxcar filter first is selected, the value is the mean (average) of all the samples in that particular frame. Curves Curves are primarily used to create plottable objects from vectors. Curves are created from two vectors - an X axis vector and a Y axis vector, that presumably provide a set of data points. Thus, a curve can be thought of as a set of data points and the lines that connect them (even though the points or lines may not be visible on plots). The following is a screenshot of the window displayed when creating or editing curves. Explanations of the settings are listed below. Edit Curves Edit Curves Curve Contents The contents of the curve can be set from this section. X axis vector The vector to use for the independent (horizontal) axis. Y axis vector The vector to use for the dependent (vertical) axis. +X error bar and +Y error bar The vectors containing error values corresponding to the X axis vector and Y axis vector, respectively. The vectors should contain the sizes of the error bars in the same order as the data points. Use +X/Y error bar for -X/Y If this item is checked, the error bars are drawn symmetrically about the data point. To draw asymmetric error bars in the x or y direction, uncheck the box, and choose a vector for the length of the error bar below the data point in the -X/Y error bar combo box. -X/Y error bar The vector to use for the error bar below the data point. See the previous entry for more detail on using asymmetric error bars. Equations An equation data object consists of a mathematical expression and an independent variable. The expression is built using a combination of scalars, vectors, and operators, and usually represents the values of the dependent variable. The independent variable can be an existing vector or it can be generated when the equation object is created or edited. Since an equation ultimately consists of a set of data points, an equation object is plottable. The following is a screenshot of the window displayed when creating or editing equations. Explanations of the settings are listed below. Edit Equation Edit Equation Equation The mathematical expression representing the dependent variable can be modified from this section. Operators A list of available operators. Choosing an operator from the list inserts the operator at the current insertion point in the Equation text box. Vectors A list of the current vector objects in &kst;. Choosing a vector from the list inserts the vector at the current insertion point in the Equation text box. Scalars A list of the available scalar values. This list is composed of both the scalar values in the current &kst; session as well as some built-in constants. Choosing a scalar from the list inserts the scalar at the current insertion point in the Equation text box. Equation The mathematical expression representing the independent variable. You may manually type in this text box or you may select items to insert using the above drop-down lists. Independent Variable This section is used to specify the source of the values for the independent variable. Use Select this option to use an existing vector as the independent variable. Select a vector from the drop-down list, or quickly create a new one by clicking the button to the right. Interpolate to highest resolution vector Selecting this option interpolates the selected vector to the greatest number of samples possible. Generate Select this to generate a set of values to use as the independent variable. Specify the lowest value to generate in the From field, and the highest value to generate in the to field. Set the value for Number of samples to be the number of equally spaced values to generate between the lowest value and the highest value (inclusive). Histograms A histogram data object simply represents a histogram of a particular vector. Histogram objects are plottable. The following is a screenshot of the window displayed when creating or editing histograms. Explanations of the settings are listed below. Edit Equation Edit Equation Histogram Properties The source vector, as well as basic histogram properties, can be modified from this section. You can either manually specify settings or use the Auto Bin button. Data vector The data vector to create the histogram from. Although a vector is needed to create a histogram, the vector is treated as an unordered set for the purposes of creating a histogram. From and to The From field contains the left bound for the leftmost bin in the histogram. The to field contains the right bound for the rightmost bin in the histogram. Num bins Enter the total number of bins to use in the Num bins field. Auto Bin Instead of specifying values for From, to, and Num bins, you can click Auto Bin to automatically generate values for all three fields based based on the lowest and highest values, as well as the number of elements found in the source vector. Y Axis Normalization This section is used to specify the type of normalization used for the y axis of the histogram. Number in bin Selecting this option causes the y axis to represent the number of elements in each bin. Fraction in bin Selecting this option causes the y axis to represent the fraction of elements in each bin out of the total number of elements. Percent in bin Selecting this option causes the y axis to represent the percentage of elements (out of the total number of elements) in each bin. Peak bin = 1.0 Selecting this option causes the y axis to represent the number of elements in each bin divided by the number of elements in the largest bin (the bin with the greatest number of elements). In other words, the y axis is normalized to 1.0. Power Spectra A power spectrum data object represents the power spectrum of a vector, defined as the square root of the absolute value of the mean of the interleaved Fast Fourier Transforms of length 2^x of the vector, where x is the value entered in the FFT Length selection box. The below definitions assume basic knowledge of power spectra—for further details, refer to Numerical Recipes in C: The Art of Scientific Computing, published by Cambridge University Press. Power Spectra Window Power Spectra Window Curve Contents The source vector, as well as basic power spectrum properties, can be modified from this section. Data vector The data vector to create a power spectrum from. Interleaved average and FFT Length Selecting Interleaved average allows the length of the interleaved Fast Fourier Transforms to be specified. The length is specified as a power of 2. If Interleaved average is unchecked, &kst; will determine the length based on the length of the vector. Data units and Rate units The units specified in these textboxes are used for the purpose of auto-generating axes labels for the plots. Sample rate The sample rate is used to generate the X axis of power spectrum plots. Apodize If this option is selected, the data is apodized using a Hanning window, to reduce bin-to-bin leakage. Remove Mean Select this option to remove the mean from the selected data (i.e. translate the data so that the mean is zero). Plugins A plugin data object represents a &kst; plugin. All plugins have a common format, and show up as type Plugin in the Data Manager. For more information about plugins, please see Plugins and Filters Event Monitors An event monitor data object represents an instance of an event monitor. For more information on monitoring of events, see Event Monitoring. Matrices A matrix represents a set of three-dimensional data points (x, y, z) arranged in a two-dimensional grid. The z values of the matrix are obtained from a vector, and the grid structure is manually specified using the Edit or New Matrix dialog. The descriptions below refer to the following diagram depicting &kst;'s matrix structure. A screenshot and explanation of the matrix dialog follow. Matrix Window Matrix Window Vector Selection Z Vector The data vector to obtain the z values from. Grid Parameters X Minimum and Y Minimum The origin of the matrix is specified by the coordinates (X Minimum, Y Minimum). The location of the origin is represented by a red circle in the above diagram. X Step Size and Y Step Size These two values specify the dimensions of each rectangular cell in the matrix grid. All cells in the matrix have identical dimensions. Dimensions and Use maximum x length Enter the number of steps for the x dimension of the matrix, followed by the number of steps for the y dimension of the matrix. If Use maximum x length is checked, the x dimension of the matrix will be determined based on the length of the vector and the entered y dimension. If this option is checked and the length of the vector subsequently changes, the x dimension of the matrix will be updated accordingly. Note that the minimum allowed y dimension is 1, while the minimum allowed x dimension is 0. Images Images are graphical representations of Matrices. Images can be plotted as color maps, contour maps, or both. Image Window Image Window Matrix Selection Matrix Select the matrix to use for this image. New matrices can be created by clicking on the button to the right. Image Type Color Map, Contour Map, and Color Map and Contour Map Select the type of image to be plotted. Changing this selection enables or disables sections of the image dialog as appropriate. Color Map Parameters A color map represents the z value of each cell in the matrix using a color. This section is only available if Color Map or Color Map and Contour Map is selected under Image Type. Color palette Select the color palette to use for the color map. By default, two palettes suitable for color maps are installed by &kst;—Kst Grayscale 256 (a 256 color grayscale palette) and Kst Spectrum 1021 (a 1021 color rainbow spectrum that ranges from blue to red). Additional palettes can be installed by simply copying GIMP compatible palette files to the colors subdirectory of the user configuration directory (for example, /usr/share/config/colors/). Note that saved images using a non-default palette may not be viewable by other users of &kst; if they do not have the required palette. In such cases, a default grayscale palette is used instead. Lower Z threshold, Upper Z threshold and Auto Threshold Enter the lower and upper thresholds to use for the mapping of colors. Palette colors are evenly distributed between Lower Z threshold and Upper Z threshold. Any cells in the selected matrix with z values less than Lower Z threshold are mapped to the first color in the palette. Any cells in the selected matrix with z values greater than Upper Z threshold are mapped to the last color in the palette. Clicking Auto Threshold will fill in the lower and upper threshold values using the least and greatest z values found in the selected matrix. Contour Map Parameters A contour map draws a set of lines, with each line representing a certain z value. This section is only available if Contour Map or Color Map and Contour Map is selected under Image Type. Number of contour levels Select the number of contour levels to use. The contour levels will be distributed evenly between the lowest and highest z values found in the matrix. Color Select the color to use for the contour lines. Clicking this button displays a standard &kde; color chooser dialog. Weight and Use variable line weight Select the weight, or thickness of the contour lines. If Use variable line weight is selected, contour lines representing higher elevations are drawn thicker than those representing lower elevations. Use discretion when selecting this option, as images with high contour line densities may become unreadable. The Data Menu The Data menu provides quick access to many features related to data objects in &kst;. Most of the menu functions duplicate functions found elsewhere, so only brief descriptions are provided below. Reload Reloads all data vectors from their source files. Data Wizard... Displays the Data Wizard. Data Manager Displays the Data Manager. New [data object] Displays the corresponding dialog for creating the data object. Refer to Data Types for descriptions of each dialog. View Scalars Displays a dialog from which the values of all the scalars in the current &kst; session can be viewed. The dialog is updated dynamically if the values change. View Vectors Displays a dialog from which the values in all the current vectors can be viewed. Select a vector to view using the drop-down list. The dialog is updated dynamically if the values change. View Fit Results Displays a dialog which shows all the resulting values from performed fits. Select a fit result to view using the drop-down list. The dialog is updated dynamically if the values change. Change Data File Displays a dialog for quickly changing data files that vectors are associated with. Select the vectors to change, and then browse to a different data file. Click Apply to save the changes. Kst-2.0.8/docbook/kst/Screenshot-kst-exportgraphics.png0000644000175000017500000001335012277111530022262 0ustar synthsynthPNG  IHDR }PLTE"*")/-.10/2002012/4:%3C2I6P;Y=`=a =b!>b#?c =j8336=E K| Kz Kz Kz!L{!L{%L{"M|#O~*Z+\/^2^2_3j5l8n;o@sEnIjJjKhKfOauUbpjnpɱʡvZSNHFI~E}?z:x8w5x4|8|=?;788::@AAABBIJJJJJKQRRRSVZZZ[]acdlr{섴牺 tRNSGIDATxk7#;Lz o gM9\AB/J`|\_NĽ$^ "4D IIllB^E"5腂/ aݙݙ_VڕD;gf:|xʖ>txr!%-O>4zʖNM\-Kϑ)R冬Kcĩ|D(*7jFE1[FT4nX< ԳnxZ:/7HTNXL.씋fL O3Abgb0UB,*ɑiC oQ_(SǎZrqIIfpJ;SXsEce'>:ujbpju\ߏ>2*:,ʚ?N֚)a3ݸo~zvzǽ,Ӗinu ɨ6ry`9kLN_qdrfy|Ch{LW7 599===M(wׄL6mfߔu՟dTrl1ŌL"etC'^,,;7*Gg3ͳ96͝I+㏘T*#+,tbff-< ') K}Are~*&Kep 0 vҲSu6\=V0582j$a-;G-s^LSa<2r{{Ǹ78FO^X_\N23qjvYŔ9R0gsm^|^1_v̈l^i]ZbQb}*z^̈`ѝ;]rg8kW<&]{WSSj ʬyԘ"Һf<2U*\KTTq aDVH3f˲~yanϜSfFYu!3k _@e:erGEԲJNT Z*SBb陁K leWַ]X.2,f?ū.v8x%}*몮4FJkXgmcVjdvvuPX]-XR`cyVWf +Uosڕ- );I-ȡV-rp%?З:/Qʨdħx:kja3t22{;\ + ۉʉoU+?Г+:/ѽ{2{ΜdyHzyaSTUKc2Dr1bU{iCĨ܇%P*m([ * @ @*P͗4e*3EALM٠Bܥq(*҃?Xn-.[|¨ԣPHQi#%*VecѿoLPaEDAsrڎqP[8CB<[هHd-?Y;c8N:T働_bP/]n6R_JUI;éDY"rNlLQ?9YTSuCӐV?NչK$پ&~`aR &4*)q5v-S?U}{7'2(FJ+/TyN=ԑΉL*Q=Q2_zy~Hhs{(= @* *P$>*OBåBhJlPifqӮp̝er 15Tƨ,~+V,PC$h55TD<LJgTG9ܧb.1؊)D?3YDAb"}35T5sN\bTXvʎk`l\GK9$ijl+ytd0.ӆio7SCDr45TTH9<8*SCe]QV҉CJcTB(vs&&X">A~NjNshŦr>d9|k% %'0Ks:ٷEY*oT#}u**r3TrN%7sA%*T򩈩,iN>5=ƸT@PP@T P(Tyi>w2@eT$2LT63ĺˁMl+㸟K/%"bn-e*H,TH,:`^w5I[7cb@3> !eO(&m'J;9$ $QLE.,j+4Tw}sFY]PSIXRHIs:L裢dVG8'PoAE&F MU.^ ͚~*J*3*NR_V8%QbVV60Bhkv*j*Ej5/QPFqڕ *J*1*x \VhCקîe+0*AY>/zۼٱо}T%ab{ǥڱ #ƜJyV8PiÁ&6Thby2_Qv"X}&@* * @**"9`M,РBQ.PT@P@y^> #lP!ϒ;YxViWv޿>!KoTk0EPP@T PT@T@P@T P@T\ds6^s[*Ҷa*z*RAר'*qrm#mrPCb-b bVZ7(^B|`l*׶KTL[ %aQMqP UIetql ?8$,A]AM*]Py*z%le *]+ +D`KA!q ?[uU ˖]m%KxJxI[Yz۳|/9E׎$ ** @* * @ @* * * @g*s2(Q+HAYZA @T PT@(JQ,=*c I+;D͝3'MS(tySyѸO5vE?ozBxP_{rAUo"(*v ½3v7}yFRA OWζ5T?}X *Ħ+<5XߩT@PP@T PqEPe.]W$c K7~'APK; kMa>X썊fmDÑUĚ%KT4k '-5Sr)]*Ţ;* Gjw7)|c9V|}r)e*wGEpÑCE9V|)xcF(+O_T4&EJR;pWBUfT,pvP!6 o*/+^uG%`mDÑh?W?GI%lӹ]-{8Rv%lv9 -8;XkJs ̱J:Kއ,~d-E%tct6^k %ti}ݵ} q1_=,"ATtYdL,xn @* * @** * @* ** @2TePVűW4| @*Jڱ̗|1hA*;YL]̗t);+(R1 SzK5Jk$|c'T^L5J (Jk4͆: JK1U- 3`FPFJSIU.}_Q<*R` !#~2.$&u4a84q* Ydo( gi;ɩԉC:?ƋJ'J0jzsO(*ͦDݱB^*;8uqYYöCӄT:T>*^r@]WD#[T'4@űvûghRiTsǕDښ8NȪ.icLIDC@|9Fq@mPQȹ磲U !FJsW˥.Kvr :T1hɥҪu)J1 F\*\*]jk FvLT=SiJijg1>s.>Yc\* @*@* *B?O$50WcMIENDB`Kst-2.0.8/docbook/kst/Icon-kst-datawizard.png0000644000175000017500000000111112277111530020115 0ustar synthsynthPNG  IHDRĴl; pHYsnd tIME$͊!IDAT8˭KQgC'GQ2#Y>zBD E}B60֮]kٺ EA=7gMǙǽ3ss{. $Hp|%4sh$^8֊;jBXXjjZҹ]iACmZGk1ήo9LT$ YJ0:B7#4T2ܐo館Eu Di|ŲG RU^^9s5z{0I0[\VN̶1qFs궂.\fI3[aqvd@rՍ[AUV^>]B꛵2<~/FdsG2(}My]3[*M^d#EW`VH95I@o]a8H}?i+[jQKCO˖׊B Zsv+8~4)ESe#7IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-pluginswindow.png0000644000175000017500000001356312277111530022137 0ustar synthsynthPNG  IHDR} 8PLTEtv     & +#+#*)$).$),%*&*1(0:)5C#6I!:Q=X>_=a=b!>c#@c#El"Is!Ky$L{&L{$L{!L{ L{ L{ L{!N}&S,Z.]1^5`:`@]}HZkQVWRURRTQQSQRURRURRURRURSVSVWV`XWocf~Y~Dt;p7n7q5x3|2~7>DIMOPJ=7+899:@AAAAADIJJJMQRSXYZ[^acdkpt0qtRNS) IDATxMkm&|$l, xdܜwV![,Nb.#92DBBa梋a.}g_kzOuuSݗ._ހ_^tyc?P=q3.m\xO.Q(k硪!׾uZ_CjV=uZNg<=4NBs0)uB.Q3Dtz j6wjs'~>scS[ xy}tӵu:o+"ǀ|iG=BzڋWK/E<5K⋇|W֔4>i<^{bg_N_Nf Zwen4^=z^y?_t)xJvRx}^wՖZ- ~"xHBrykFlG +k{=F۟VȾz['쉸׃YxԵ3DzuƳVU}Wz{Kĉ4^z~67m{K/\_1UyěsْsqZz[P aRy={v_ܛBebe!!^gyj<^/T^^^^N.Gw_AydK]/Z /RxՁWiEܹ2JATFɋ"H,yk$% ݙEK~x$22}H`SVTlj ? Iy^$C[R+X v[*Rx9V^R WsRhE( 4;RA$_F4+T2H"}9V21 `BԪ3ٗZI/_FjP9e䵄/=)>6ڇyAx^q+:Z2WKfA-WcuHEbp{ %_'^.J>/^ / /+ӧ;z?y>R7(-4^~dx"2{i~sls!3|_xV؋쎋Piw=iK&}(^wJ?߿k6ym UXw:(W +p<<ۇ>i5Be bj`_xA^xA^x5DY;agwT`xfgꩮDNgQ7skԝ뢈U5=H^g(7_B3T3aՠ"2;DI)27f&y~aN^lOʃŒ`(ce5)snun/A^^ ir!dbjψ%^lfENLP̔)mODYHƚ7+b]vb輔(EDFmLAf%#K&2[R fJK<$X8:e%1HNɜZ̴A|\$7kcRѡ( WaX)3Nrz(/xxXy0/%υ/(%7g##tdjO-sM/m_S@Xk[Zal.}}}^^ki.rx I3(|@-S>zFnDڒ};}k?`Scu-!H^ʿ~#t;JM(ȏ|ɒ/^-OJni{XTkhp kL?#{8<9Y9iEg2^^ɢirHHQǤrO'B%/ǬCVEk|..3P^^ッ0^^8::y+ī݇ )7gP B^xA^^x`JJ|JE٠* / / / /+&ZZ^bR/O!J)sCE;o ?*"BT範oZثj +5z=wWz^d/̋yQE+zdoC/|zWcU÷-5/ / / y.)]$%%JNJK}Xj)y9d)% .s{D`ٲJC=rg\DغXQP%_Q7]P#y9^V w ܅sUKWJú4Kwj:;A"o_WDYCӾؒ&B_ھo+aƶiƟv~ևdAPqGXf1_>f͋Aqa }8WR}9c$}H+F)/[| UڱF9Sj.Ik4W외.5r+xՁnW5yQ nڇU} 2 pN.Vu講oTΎw岴yRz4(Wa^@[m3JߊWLRC]FDk7l,#p(GK)'iXѣ;Dž_V %?"S D n_mSؗ=.S/!󐭋$WDСO2^:5s|(+}ǥK/Z[1^xA^xA<^+x> / /*~ת>xUVY5WQZ]IwVMuVH]tv^F;FݩԼu61<&:3x1XN_MKށ*H| L50 $s·x%<.u\Ƽ_ 1a)4\y^ ?o^4` &$LAY͐W1,#:Xx3xej s48WFrJ/}iƞdv!!=A d2ڇ q,W3V}x!xxW= ( /hyx}X3\ //O%pq2n^xߛ/\^} |J Ϋ,^c 2|sSȿ?}|+ - oQ/ڇe%6G_*ۿ׿Rʾ%WxFC/z/ÿ߀^xA^h}8\ //O ҝFk&GdG[{)pE D';ΫɌ"οe^[~;W^Y+54^(i+}91=þ}+}X2> ^3utcۇi+E/2xxտ߀( /B/oxxy*ۿ71W{Rz/D^}wP <t^*vK+_r }V|+ F{/xe/'}9E|{CY)D >JwCÂOrgs U+^x<xx5߀( / / /B1^x^x^x^x^x^x^x-[PUKq / / / / / / / / /:ϠCUWJ\} `J ׻bVw5W^&5'yMV2lxuU^ț]SA4/U3~^x5@s k^%"90Iklj["[LmWN^#U$$% ,H2ȃW9&QBRҍ4W,}^#V_ 0 >xk_">yMF[LU3DʇOErTxc\.XTJ54Ķs8Jh^u^xOԉM/4IAW x5Ju뤰+ xkA{ZA2x-Hy7 9? ./ / / /8^Em\G?a"yIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-configureshortcutswindow.png0000644000175000017500000002125112277111530024407 0ustar synthsynthPNG  IHDR PLTEՂ~|`I !#(&5*B&-:0/2503A46@99@>?B@@B@@GABKDFIHJJMONRQQTQRTRRTRSVSXWXeVVQQU\`ZeOVgFPe8Ab(?a!>`=b=c?f$Kz&Lz!L{!L{!L{!M|+[/\2^5`6k8n=nKqZocmnqmrtjttry}þԿfĐ˾ǿžžдѫȟ΋tiXNJC~;{8~7:@<:6:>@AABEJJJKNUSSWYZ[_achory< tRNS ~MOIDATx[h\GǓd{ٰIlGXi6G,-K%l/MN43J"ͺd!PN&ގAH!+3``0X A{ԹTթK/ԩ_Uu._ T׊Z/˭Xӭ/:Jkn}ZdHcR"]5RDbr^ۿBBsׅ6*H髯LH_2aB>|*K=uU"җ_rޣbD8ZGBX:Bb{4FSzCqT\KSH3Ǐm :vr!2#!}mZGN$uDȉ>=;)i#:=)0kV)0t{֍,cѐv}OMHjK$7MMEHk'0 yU?gZ̔ﶶ)ͨF{ꄛ¿fqJ]^7bXQs"m4ˏ=|9 һ'fgAъ2լj=aǛA)Iʠr3} ޛooZrH377>gAp>"evdF!%.H} YVV,k~ͬ'c) ,H2;,ɐѸ儴 Q%Hߚ\xG?y,>mEȱ6{m:ic^۷bit͓άʹP'ؤzm{}Tԙb?}΂a{X菌Ύ&?2zoƹK/Z3Zjʈ'I殝40WFb|ն9H}ǹG)fZ;mAaAG9H3f Ȣ4CSrH{._^&t5?,DXYK!]# |sԄzmcT}adS, iVx.' Dg`Ism1W$ZxjDHr3ɻZY4 oc(CU"{eӊ~"ˠڮzn+Nq3Ў>I !;ë,m2UMjHW)"} ɺ1JVt1 5>նjju\e!4Љn%t̻CwnnnRq.|KU"w`h~ݺ̫dH:IW%^ E$}!\nB @iQP ! !!$BB!$*G}"7T&eyQ" TΒ )=V"B$*wE2AڹwnR!$!%zz{{{KRY =6 ]$b\"@H14ٳpkuu 2(do !Rތ[2dP ٜ{ZR *Q.x$\߃ THV>6@q,DlXRHEpO JJ I@…J i,%CIʱ+]!m,r"m؋"$B4n%ii!!$T"<*,x2ݙg B!$BH(TUz.*Lz.*,Jt͹O<عjP$kΑsNl ܫBDJUBs6?{|Bgl =RH9OHwP*̹ H^ dW%WUȰ1g"C]*}[AΟWc-FX+2_HvV iц9AZ㏮]#JV,KᖉԊցrjJ+wKoB2BU6UbİOH )%$V@T~>O@[uhU2ZQrٮ1sũD>HUۑRМ FB3VGVW_FU3Bg/U H\PVjBZ3[y nU"]s>PgS!!$T1H` B! x|i1cLTH H Hr$JIΡtӺOr $m$kptWB> !OBH7wl6@UA. )>IiIS:;&Ȑr쓔485fkrBҥSYx$9G ' ZWG'qG؇ P4xRGG ܁S"$9f!@K>ظ$`k5$' M3Yg@, I)$ɬdgde`,#$ >y(7oOL1u|[&I$#Jܹr$H#&鰁BgzΫ+/$%= %&&'&'Ǧ&'ZƐxKB CS7'';($3IiGw"Ҏ1*6+yOȣ;υҜ'̬{2IԔe6w%<ʯ8L3с8Q \fTs/TTHDҒ_ ʒyI!iIZ(%U%S;~5 K`I Ąt$.4$_L I@JUkIYlOBK] Is#Z^CKBKBKBHe$WJɒ6G(BHET,idhhp> >11<488t𕡛3ɭ!% EGGbcWzJsO;O@YhtjTr(WH>^Vl< H4qehhhx8:9u}lHp1nܝ<-<518@H{A,itꊁht46i|XpM{o3G?.poR.OX7>:844::>oI#b*olMP}!ӯ K⚻X,:|{I灔Ss煴8@Ar R4>}ejjj~ff̙ID*%e$K阞F:N t.iGw$U`s_FwԉAnuρ"CitC`~~dIΜln>yd8ynp\WgW8^Ԓǣ^BH^2ΓFFGG%M?,_2qyyXtz %~$OK9$OK9'as '~x!`I - !VEyӯ??L~:>`6BҒ~I>LKnM $--)4h@!dd(ۗuK}{݁]2o~7B*% t쒿)@>-=ɭCH%dÒD<$Hl~ɺ'/#ñtI ̀%@>4R??n'BrIO H wekI'O4 (?N Gwe /z&.Bn/ďIeudx?|qt0Nr%ŢѡΡh;m|'Wx?IIxOgKgk~V~ $QR-X襗xHe3ߒLD%c3U:dI$ѕd=yuր%^bH}=@y2=zB ջ[N<!$-~`/GHzZxc%}YPHigTSyfI DH#5$C SR>HE.ӒnN<$nfDh9w Tn%P Hft湲& %xbR $u $xHXr:2Z=Y)f щ%9>5m'BoпzOzO1O8Bz '5m6yWˍ!Ϭg8n8U%b䦓++$n+h}ҡu|\"K5XOSٚ8f43aڒvwjIܯ!Ol +`])zBMC3XnSdr_zϓ %hI3[8wfIçz;IGK"$--I3뺾0%_Y=3?Q+8VYtgϭ8ِ{jLv7'RY MvɊt[H`!bM;NoZ̄ͥZҁ'?t@K)@pCRquBnjdIlOr=wfCo^Jt$@ {c`!٬fIkl}}@qn]4mO3B$KrO:7zg@CүSъ^!UdP4K}ۼ3khQ$hŚ;~t] ${g;y?xl?ytW>HyȐWΒ;xAGK"$-I34e,BBY$^نԣϬ>R3OM"3ߝE{>#,W)O%,᧦pw;h5 >=뽽ORg/6Tต / D? |fS;u۩D?誴);(. J4_Z3K,.$ݗC8(fՐ/?gv!gr. :?XRi~CN,/Hw@H~a'X]gtEE췰O*Hcg 9Oì8s6@UZR.>u&"æBٟ2 RwYS3׮%qwfkw3>3+3g}f|gwܡϬ>}f]gv3d[MړTb==gW덝CB<gvP59v}ffYgŃ g.+M_Hg][]YYZ\H,l7i@i3kx\`E $$ޗNp} =r3jhs_l! >I~b򔳒4&A 誹k˒R׌_4*!)uSt巄|7ZploY#͝3[ʹ=ݡH(n}37w^Ė{ & JSCѳѝK%o'UDMUIjIo?[>ݑ$pW7$s[+-)-\+)В8ޮPF ]oHl0Y3{';f~+L2e ;xNKg"<`0|,NE$ഐGZ:;[ #$ =NIhK!{.(>ih2UL%F_gVH>30RqFw?J&YON9wY- 3 8Klo_F~}p;Ϭ ؒBHHK}X+Ô|ŃP=l@!q>]G::;FPh?͠@z(3˵xVΒ[;nAS vۻ癭0oUp}yLSNyOc}Y-GhvamuUOBGw?iicɦx|f1gVH6;ÝMyaH+E =:^Ԓ ͝GZVm-ު8u~oU*p;}f5Tή/=vPօ J KdM !BB!$BBH(} t=Pg>'&DV/\ A)$f]1p ,ܚvEc /BǠ vo}*N6~IZC M| =qAKb$;j -&G@:X " ٿ& $<~Dj@Y@RT+Rv}ps$KhOa @ kPS $oBB!$BH !!$BBH !RF * B*!$ LM9!)\{ Ν #$!3JۦLVBBH !!COm J\\ˁw[f"1@(ڛf280Hx͡*|1##_)kE.f2/8)'N)֋¾q(]lX/#wTlԙ!)nq}!9b{L}٨ srb%Kk6`\l 铸>W )J(/b{BkkfɪSwO@J!&u-dOB&|&D;$X i_CqJ^|tL7ɟ)H x!Yg E۪| 9vY H ɌoT!1 '%$E.րBZ+ )oq\6!BCq"q܎%<⾙Z=)H؞Ioq}#žN%&vz6 $S.YKgq}#žWy_fdz9$~f.Zvܚ,U%OW*8BBH !!$T ŸBHet !2@:w!i+Y ॅ^(BB!$BH(P !!$BH P ! !!$BBH !RAB?"Ai P !!$BBH(*ǾHWI T+/#R_YTiJ.flJŨ^H>ίHU{J Fe-R*@*y!TfūRAZ!PL&GE/9BJqvU $濲ܕ&(Zs!@(Y@"RRCzxL,f )m5C*̐6| amY|J@ZmN q_JpH iC( HzY5j/A6{+>%bܖ4rk IA)@RV+B)y6%6@ZQu$u!J$cŶ^HM V$&KR6b W )vwk%[>Q[v!Z0X*imQ!բAVpA4% ɢA[cA*@F!\򌐜<iC1-CZ]eA%R* WHkΣ`RCZ[,4^.<.;[ɅTj5AJe-*B*ٟ{g>k>rqU, B(턐 !!$BB!$BH(P !41Z/؊\/?4"3IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-mainwindow.png0000644000175000017500000002071712277111530021401 0ustar synthsynthPNG  IHDR9aKXPLTE I   ( #8 X ! 43??;;6p73<4444111111///,,-'),-4=??@?A7ZU9~ҥ[g*<h5$g:Zn߶n? = Hm?YTA~3k+!;ii Y߆ # C;g#k=ts~`e3 >Dvak=洷._Q Bci s=Ԝ]ݽ}e.փ^jz+rcKGw=1Gp)#T`9W쌯3W>!'wdw.URqM-S3Tݨx>3eEjweDF]5x&?LFAQͅ4G*U\H,ĜZ7rE=ʹk0}) Yzft_wC(h(Ahsaz6̉9Tew[^g'afoGIKchA)ch v)}'ZͰliZ\J:֡_(}PeK))ź=& EۗVH=cvlC7-ۧ+1ۤJ.⼬rS fflVڙr]^NhM?\bslBsq؜T~_8m%vz@Gԩ鬎k9U=014ߕm1g[쮙.Mm=z9M΍VGXz~׽9%ѧ h2 K}.m%$-N5Ni˴>}^.'UfmԖߡңc&fE2GQ>-g`N#Xgx/E2'7,ah\/&J*DѮN5 !67nPZUOW qAnx !#+2ޢ-Cd{dִd`LI(5M$s\19IU+^lgKC'\"d0u5sӡzcGشb8[W=isLy}いlt1G~JEDpp]#;[zp[[XеlǒC< U>pjƆ-mXMS-HDGdAׯ9?$κo >0s+baEg@b9f+w7 9J3Ga9HU>v-f#j+GX/t#tfC~[a?sf،ݤ٨x`|M΁wY# ɼ펉okh,srQ+u4);F"v=s+礜PP+ 3pqTsB[]].9bTΛUgi ̑03G~(A=N 5Fsd!.>Z( /Vdi wһ韣v;dp9 eNW(4oU%d`͡{s;0w_曣G~c4͛SZ[5m^ap["95tw[']zv,sTǘxS#+Q$b\jG^^^ 9P9Zr@ӿjIqll eNb,o]%dᐮszocxwo(Gʜ3'^չ%0:: "m9ky '~ylItq̸qArG4V9QYBk1%2G@i et9y#G YlM9'DCqKv10 U&)Msx"NB9}竬Q !g+66$&FYZϏ"ǏM6/k/I̡v: M:W9 _wrja"f4R7=!+s eJ¡]dfĉ5c輠;~bwwWgGB9N6298dЭ3oMPiP2gtu#}t#}r+9HvL#,0u sӂ<'M.'uyx$M7:=!ߝh1[2bcc8uMw&њ#Ofs|"M8D69%T>\;i L&9gޮs>71Om$7WƏsw# %Us$;Qu8"S'X$\'OɅ_N:Ɨx#Rs܉BTxrX=iiTo8^#p97299G}Yi9ӈc0Ǒ^)K֔Gyɜ0谽6>4Y6B=]ĜԜc{+lǑ#y0'QB-6GZ)^Md%R:DXCtUV渙0̡OOBs|sjH&;}ɋz%䑏G(,\0V?q] ,᝼΋,oB.a؁;sBh'qǗ}2U?$ȔW1rȑVTsJG&TQ)<"X9T{Tsa^cPIǯ/IS=RيYV<-%ZlS':GZfT%ՓV7*rN!U2lo Xb&=,ͭufBrOj-=^UFYXLfŢSo2'*1Q~h N'gz\429Q銂!Qzs}KEB.etmѱ?%! U8JQgBM_>LK~O?`u5I e %ި##6̒|sw!kC,jnG9|TCa"T9 9o-朇aNʹÜY^7x~`s4[M"r#f+bu\[lBu0Buڬ_3&gU0hNlr#(\aE#Kglovpʶ^8t[(:Ǹ3ww6rRۧS77؛Q0`N-' Fi䲏?>19α凟*K'LO6D|Ao$rwȤ.vcQ9֟C,G,[w9*f<5ghZ& 2;{a Ơs YCy |[nqϟrCggm58ݖ/weg15 3;WIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-simpledata.png0000644000175000017500000002321612277111530021345 0ustar synthsynthPNG  IHDR2 biPLTE _;4%&,{Px)~\ºgsixr}y~~ƨǫƮȵ˼̿мλЯٞ掬~tgO ܁xր7_~ˣӯմ坯{hTD|5 s ZK  )=GW_p\[]gXQLQYKQ[IPYHNX.,q&9p4.w {D E{Nǻ7ZUU]]jv۽]>U̫W/ KJ##^|NH<2yy!qIeO Kθ A6d=-^cъE#!gsfkdb8Q K'Fɱkbe}^E,Xj5M;YW4d~?03/\5=i7g׬Y]ӯ7qXu bWO淥~uQZ( oDOĞs~͚5o55?ɈkV=VR4_B4b8="H^, tX5㛵5J V^n~"ɾֽj3b.Pq!\%C\~#ʠѮhGL&Xya] ë-lKBĮ XM-+y^ݫ| ђB/Ī|ymuQ%Q5:$ԣ=j^T_4Grj:.\, l# H%iVIiЯ5?P7},^nJL3T.bJ9j@KG5SyT8q4{(sx4~e.#+/J ]ie3-]#cH VVq~Y*/dJ/+NKqE?ӥ, vJ[;bwZ#WҞ8cKx>5%q.?KK'@-!qH{C,!1 b b A,!%%bF_,i[\u-DӕnU> oK۶rmVֵ*ZYpmgY7b*ܽ~PKBfTlSW|틉=nC,rٗ&Y'mKQ}uٖ+ix]CD4kR8 PTX4::c=b=?ʬ߅rRcE#~bm{/\VqxxR$=>(."}Ķ˟&r9XMw@~c}ǦMki_QA?H !X#I,z<73уTx\5VX e=b#B} Sh*hL]\lᇈF"65XBKKȮ=NHbAbsq, dbDliߞL迵Fk]^Fe"/Zkop?;tf}uȑ#]o.#b-7VmWknj-9\Y\m V4M`B|csCΟJRmM-sPZ5=9yXCG*2G|K6Wes-W?VQwꋲ]lO'[֯jZ+א6v# K`BOF~YZzQk9.UW̫/:zZUkE׳tE~'O>.a[%~7SeiW?1y,XaF+>%g:*WȮ[u;w;\VoӬ5Zbkk|аY\5ׁb drقjqqQ}.eQ̩/4X)l-xZX_t&VkE~C˱NmZ?^>{ڽA֭[kdo/^LMvUYخĨGۥZ%}iZ&V|ARqU?U:jUZsV5gk]l5L^;>YXMD^~%~5VbNX=t5Z[[vت[+r?\ߩs{boLA3}"޿Sig=8W2>qsbb͛mSc??Y__8jrdVqu`W5ZWk뭱4mm͛m1uP&(fs~5Wމ{T༇Qvu[{)+&Ǩy ^zunn͉)Zi%KSS/Xzcؙ_|Vn Ufc{\dbʂ$+1d&V:[Qkvwfql2M[m7>ndiaEL-bR^ubmPhk_QgؚXېʵ#{jrr!ÇsjϮ'ž+ԇoS>sZffFVɃ[ϑ܍7dffn/+ /˯Fw #2|9_dWݭ6}bQzUuQZ# iڪoؕ+c7 9&7Y[ek56 r./]/m].d{].=b|!jՒU-ʘ;44#!LɛhđSɉɉgJ;1NLL~{{5dq3XqzzrS~cm{Cf [[5P޿/lOUYXMG%jJlϺUk1{kc{ iշ}Tln׌ʪhcqRWY^._G'+a6zFYŞ)s\CƳ񹹹EQG^t =3x3Lq?D~w#;3Ϝjڈ=e懮Zo ^_^Pb &G _lV3QiUH4#룦bկܭs-[ VjU>z]z]~rŶuM.V5 $ؠM>bV=IQXfjz߹Ycn5nzj|iʵ?zs_ϞTr=fJel4};3PVsDoo|k~%penHfM1Iؕ/Gs_wt|j>[b{:/2B۷-/,[d}~$jc]d} d^H]]*T3g?Yya[|SMQcoڜ֜j{F_{rʕmLc{ٿƾP5vSc :IMfXg͹kLXX{ScUv+TvؑW^5vyY8ŊeG 5VlBٲ/Y߹Yck׮\~}]jfǾ(N횕Fffd譱N?|83gP3ZbGS ^[-*{( :g#63ZDZ"+pb(ƱEryZ.v^au>H삕~bUUEFI{*u2jkYdؠWc;,߷ƾ~MB.ئ ,Nv?|/W^t>|]ϵT@v[cSj5@@w@͟]F+k< -k>{6XE]+K Q<*(˨d=/5jetAb_Pꊒ[l-f([bƱIP ]U^umg/Ư^՟'+G]EͰjv<W5잿  q_c3hSȺkǮ%1 fkշj= sg^W W~be̺Q'Xר@oշgQ j+h魃ƱӯnIzyI9sz${?^x#]:rSco[XkR>Y󫱷G{W'{w޽pE':t4c w|uNJk*۷Pof+{Zof֫WY!=b!8W )X- UG-VcW_fW:Y(]5Vzy۬OUҦ,~xKtɨWj'O]/.{'P\{ey#sOzj]*-mtn alF |6_(UTW}FT rG5[;%`T`[&`Fkժo&mwuL.׼jY%qlV+:[lQ-HUu:Yc3z}1k6:hou.㮱ZmoS ^y\G{ǘme֏,>WXboN߯|ybQn55uP~]a@׉|.Rg'3Ӫ 's/oY+F?︂~QVe1US0iNj%ݙudU} Z^)akmۇnǶqJWO~cj|뾇Nzk8vKJ d%yBK Y^G,A,dIx%qBK YކXPEEĒhչwL,dX"Fl(5mX3%FvBq+@,bʚ Kvx/# $}XXȒ0b b!Kۿ%, o" $}XXȒldB% Q,dXXۚd5dѨElF,bIz D Kߟm YnC~%q,`ϼϘ+` FϼA,!%% 4}bG#6`ECtb#")lX?bXĒcؘE,A,bI\~wK$KH#Zb GKKb A,@|>=y)L9~}9n"vsq"vsOη%SE~2>EElb!? Qw7ºRB 61ΩoXpҵ}B 6b8-V8]Elj^ XZ.b*V/Kٳ {(#6X>:.k=֓n"6ʣnؠĦO5]FBl68cOi+M}FP[d2bS:b=E"6hGD,A&:X6DlrD7b1O]8k]=3s9;^g pŞ=!qɗW/ OX,`IENDB`Kst-2.0.8/docbook/kst/Formula-kst-generallinearmodel.png0000644000175000017500000000056012277111530022340 0ustar synthsynthPNG  IHDR8{!7IDAT8cO&`F20X1i61Lo֐Խ pXD*3\݈ŏoj_6n`浚m6nc8$t,~i|̚hX_q<0=)|ɏ/:CEY+#p1CSs W63o2YvF2m'2] C?{N ޣģ="!>UDјٍUK#2f~N27SG!+w|JF IEjixe(Wl/=RIENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-editequation.png0000644000175000017500000002450712277111530021721 0ustar synthsynthPNG  IHDR3/PLTE    $ 6/!& 1 B E;%7,%0/1(,:'DQ`)^%\*A_(Di$Jv#Ly"M|!L{!L{K|?;E#Q'[-]2`6f:m>qHvNzPwPmNkNjOkQgxTYYTVTWVRVVQVUQTTQUVQRSFNLALC6P=,U;&\<&h;!{44>IT#c,x9ˢ8 3zΔĎ׷Э{̢uşk___gg${>yxy~~xurhgffe^WTSPKGD=8}:=>>;$1@@ACEFHJKMOPQSUUWXY[\^_`dkr~腷扺ژĚȾԿ_:XtRNSVN%IDATx{pǽ5U.!DV# SI66H(BTʥnu 5$΍Or9I||9"1.h`tЪX1z~Lh4] J;ӟٙ߯;Ǟŋ[ؓ{>Ň%xݤLÇ@3KSAYe$2(_c-;U}uŴɫ~mrּ܃o,fj!͂_W{.\[٥Gъ:z:3-OY_zho0j|h'ߧaPK?~V=KH;*'E8qa} #x)p\GS^L;WWC;تX:8$]ByeQ^b|>;r8+=xͧ/[f]`rJ %ƫ$~Cj)u؉Sq`\t_[X<'Gs,srmK\%娖’R-`'}sY8!y2+ cDz?[ ,{ \ҁe=3*$̊Ѥ:D`NTW_O}#iiP.}r!M1dz}r\mv1sc:@S2^KY KZN"˕#G(1×>bʳ=/1^9+n.zyr6r^٥:`bQ^LJYkpx3眏s[S+  Qqux^S_^b|7~l @ xFvv2c-@eU`ٖGϩf [*m풧T3D-_zCI5mcܢ"hy!F@o|$ Axx7>l  J`#ypKo|m >zڙ@_;/~r[<'>sxك^^ @ h"WuxU{ C3&=Px jm] Pxک5j^[3Y4axu«N-󭭩UDo{u뚡E+/~۸cȪ׆`צbGR  ,tEi'5%TA %p[6Ũ ':ʻòyvP.vbGɋv.bUO k0yVļ|Ԡ;mǢUafƆ#uvmQyJ+@ ][}:'5%4]`ԆK"6*EC;]WO!Z:\X&W;-`h DR0y]`V fPx5کq7v^Wb+t^!«Ď%Px1Sx/ ?jǠ1L1{ e{6x/@cg x׋;L ~/0efM~2X3Dm;b ,0/3sXg  BuƎ;tM!KoPiP^xVq)MQxWdeDP ;v(Es a!#^ǟ _h ;f٨Cע_yz0;~aCa{]Ѵ/84_)/A-HQh^"fJ&Ǖ?dGEu!~[WqK!#P=W%ŋ::_ qBbF/,y@j'y巶&w/ظ80[L7D- 5nPR+$H1R!Ѵ4)c'&L~^շtR }#[Wŕ?CnQ_o6.VRC#/RDjC<@|-uܘlkN@be&Tyx;[%ry؂#bv 5KxB_8r!f`>^*ގke.|6Rv\RV:=`#ac/ow2H㰱Jh2Y7ccu> @ x^J>׫bpW xxGԣ ɰ2^1eՅPPr?^t>qoL] M gq!,>9eI0ӑe]}B i5."-)g:h,7Z9K[&o$ ɿZ9ȝõ%rOh[ބ QI#|,T %#-(-|_:.dZo[6o=wfK*n]9ήg&nLywS~0g^Isn`7(­vgC0(bQ>Es~VU}[kJ(^v*xivXKfmW® m 'o-卹o9ɢZK5+P/1 \Kp_Lb_za,{8 gbRHزnhQSlqNmK9_jGT?:6H~e ce 9iCr|ozJ?=3Χ `X#yiMٖotMY7g{H!v?.x34jqBB–@Ա}Z~aV9VUɅi/Y묱cћ7ž=3Ǵ`OG5^~m;x޷|-HH5 -7zd9|%Ptxo}ږ3hI9=tdK95s ( y\DJSW[?/O#,4:yC#4z}Cd8JJyՃ Պm~ZֿC4tqjnпżv25}ج/%Mncg/m,z3^r 6& ".)/A G?7To&ߓKT%E'JU UPRpǣ>e+b `fҫHB4K@ yR|8%li\i[\!6e%jB,ڶ9%m%P*{rQխW"#-hÜ"=+4*z{63^tJyJ41V}ۋJot`[7 (C~zIg|@b|iÜb!ÇOm(e8z)"IdS^\V-iG^!/^þzڱM Uw_iߗ$`\&yIъ] gLa^/zԌ}(Rʬ `l{ћ6ڹNH@2c?Cj^}A:^J2R~dLi`^wyi $:N(ڴڣ7m6Iơ+#ғF&+`̸=crJٿng_{mћI%v/}5_j^L&/Mv%_0[jL{q3 $F^E͗jz E$Zd&xzX X/&WM[ y CNVr_F֕h,^7%/F}K&#ǾDi;4n>Ր#Ee49u~L^L/lKj ihSI]5$ k~)TvܕN(xi+xSc,^_npؓWIhh/nAzzwfH^ BG]2I}4/sx'H:olKN=}^}ݫ 5~!MF15l0ˆq1وˆfXUWyە1GLŒ׈1u1AE_(a ` ^tcXbfX&KɬǰF ` s]N{*F1ݖcv~I4 le\1vo/f[丽?F y%&o4$ɊFk$ˉfxNbcrnj3ֵFD7N,wc?nS`bjUc&Ŷl/YmQ^ Jb1_dӭZkfcF7K-ìPb*$f@Zf#xI6xAo D=:Skeu&f S`jm+V/Y$I$%Z+f뱸>et$T!k ZhrluD?_guta܏Q x/$Orl6%~ƫ3/^ @ xًV >T@v^ ^ joTWDG #+e]D_Dvo4^ꉤhJY"yjFSʺ.ꍦu]k\f:N%"KkΕu|^:usԪN#k[ 5{::^CmŽQ:~eGwR?я :wutf д.AR}Q7]R_m+!sn;`p}]xм.[:!֞V2׼] *֔# i7oJ5"ծSh~DA'qI2D?.N_(@`,ͬ.Nm@g:g^R/BpR}deXHWC/y# GD[~t9VfoK>/n/[=jEEXlnj4M nݨnxgܼfʌ̐ʌ23H3jfOC3&Z2#9O rcC$qDd|E>ssdTJwp||:k|huIa򙛣|P@]"y$ _<Ƴy~I&yʇ( N:"+OJWO$6Iq@?F U/ }#CeapIȡA_gvv|M q>O,h;7/N/c}޼~Z*\S3p8XTOzyޝH듐)$Hn*|K}aYҥϟ?{Nz7d|o yVd../>>xnx))6:>̋PKao]{M>ddbFS&3]83*32~ 5}ehGy>\D}eiO!L<&![{x?M:Dr}lkZ3OqZ0&Iļ M@eު(3jf,}:)qP)M|zU9C ADo=|c$3ͣoߒ+6TJ5ea"'\ I7~bd1og1OԦQfz ϰV>9p>TrS|>9tQ eǂ B zXW|3\h5>AxXb?01`o&~Z?06fxb4P?̓>47Of@'N}j-<T/7~ Mi2=ʁ퓏r6U^2 e nC|PJOF >P8X/ Z:C\Tl'>ӄRPK,~N.!ջ!.뜏)2鳸PU2[( mE ށe>&gH|B(b2DXIȐ|s Ilz^P$ljT¾3Ct4Ws ZQK=sA`/$/O@ }{q @ `k@8;}M-?]{f^؉/i ȅkL]FWGUPt{OC|s-٣woEXIE,nC*(G@T<쬩.!@Qg ̬t17$awRAG$^U#Zfdŝ&Vռ$awR%&fڱl;.GFz,/IXd\TSB)6-4+{v|$/IXd# [n^BStD?[Ș x251xI"svJo DT%K咟tJ'4eO gPj~)&iу:TA y+, $4Se.X/+ HW'p-ziv@HY:u:&@HΌ[ xof@0Љ[ O    H׀G\ @@:s䚉mohsKқWx jlp7Wgs@Tnھu x<Ozka)DaYQJ|S ÓWYH)-^ 3 nE?`tcKكer[PǺ']6MG'x<uq31#J=lWɀ㟯m&6cӌ 7FR1قu->t9F)AOu3uhLQ59H"IgهnQ$Q\rr{غaeOcޙ"PP$%@RdE'H ưL'm#svg\&6E`WGI$4^7t h\%w؃!.뜏Ga!}$ɴD%7  i8UӃB>jB6@ T(ws5JZ3#K{,&/+eFHf7>cKb70u[o P|UT~jr}-S"bbs1ç41n5h]7@ȹ4[aoZi,%)- c[ڹclikuM 3s!cC(Tޒu_ _#W[krKJn䖦z EqԥpժzTqsu[Z3fܳdݿփ R4Mja&xK;A{Ԃ-QuKUZzn*X׋Hjw>ѻ-wj)N.QtYTD I±\&f/J:XK=@M@գo@(- f|VV`% :yN|n1|y>yw/j6ꍖ6.1|}ᅮt/j'+jfТn- zu (fg";avPz͎cH ~ġD> X?jv@ccVA",;TnuZ+U[*8IPw|K' 1ޘA].gQI~)MYmQ??+Yp:R΢[p3aA[BY@>A4SiBv1zVss-P,rOݱfD+!Nҹ!.#Ybf̚P#.,{}be`[،̤j{gtJ3c0TGe1 MWxZZm/ >_Zo^Fiu0 tjKi3t @ 68U:-WQ[܀\7#Ƚe.Eߡ]$"mOv _ MzsP)\uAڃA2@&m:4xqMV"-EDn,uI$y_+nɱNΓ)K  ɀ|ᰏ9]VWx7ލ~!I!Q*&׬Hޕ@)@ӄ䪝6Eb{k4 @RQ>S9DAÂ.TODF3RN2rWޯjge{k ?7 @  @ @y:9:AH'@bW5S6 -/(S43HkRS@ :Uy-:`IGe {akk xwwnx4n@ZZbτ.R@5+r/)+х>7y"tH@&Ʒ\z 7Q+хfgMvP3fӪ*Ѯ5s.bbB7wX):jj _9*xEb M BxZ_Μ& y"P# !@mt䳸{[?-q7wIx:7B}&wrG5Igqb"tp:{:@40BhP# h=4T zTh5@'@ @ : R+9PJ2IG y'l(O#!OA#?򮌉0D ;X <IENDB`Kst-2.0.8/docbook/kst/Screenshot-kst-quickstart.png0000644000175000017500000001305012277111530021407 0ustar synthsynthPNG  IHDRyPLTE3@.N9Y:b6j5l7m8o8t:x={B|GILQSTPKDA>:63~2}4}7|:;<;:77789999::AAAAAAAAAAAAAABFJJJJJJJJJJJKNPSUSRRRRRRRRUYYZZ[\[\\[ZZZZZ[_bbbbbbcdhijkqrsssstv闪攢ֈσecbbbbaWM{Cp=h5`.^-[#O~!M| L{!L{!L{"L{$L{$L{"Ht!Bi >a%?_/CY4@N59@/27%.9*:#/ W-mHpIqKrLqtRNS`M{IDATxMh׽v]9? ټM YHnVޘ$o)9Ik>Jr;iH73_|ݦNK W#HӮ777O{9kZ@Eq9hj:dho >N7>63ͭ{83~4xg݁(vڙ3i|t|~%[?l]:*)HPQ'3C`qqyO799p6l urrb":t6L;019DEp~)x9x~6jY% w.5TR+A~Xֽͅt]&>@] wWiI[6M Ѐj{qXq\%54ǣEփ ]4wlUm <> ea@CAPwriSU-PI*躯= 2޼uUt4záA_`<)كaNapщ!7~=j ]AojW/o^l.߻_( H1G2U| )u|j*JpͻiVI4aJ<>i?ZXhz^/a5t P:'mᇃ/*c5WIa`zbi\X2ɅRi`gߝ \02Mխh ˡW&î$GPL3l35KÑ#Q?y4؝}9<4?4Hp^x~u%9.^ Go ^[ܾ}{"ۍ{z}n:ġ=윞=rM-4L'o2 c־.hFnN$3#Zbyj@dؾ۳7#hAkOۙ>[3uݔchQfh=; j]Khv@;hCKsHWG񳶪hjo'J=YhENKJݹ^JQ,؞YX'P.c ]vs3/8[9LJRk6זkΙɗ];hv@;h]>__%@<{ڧ{uM{w=tuǫ_)qHԘŚ٨'[qC{]ng^.{fd\odlUmQN2)ih΍;L\dcbH˂]Wx*Q=y,/G>8ОJdF+kwiJ $5 HvwKt\4qiO`iOӍ(.[M[X 묖%(lusdwT7dSLeu.2n+2c6TK;ב;.f9H'vg;L^X:[&<,!k6Wi\WfEUZKWSҽS_/;[ '{.tuy=(1hG;ގvZ ֆ-鰜+IV~1̭B]5s{=l^<)qH4x+.5׳QO"ɱph^A׫^; Ub:ɤ 97 ܇3%wCZ,P5h펧Փ 쪌;황Dftv&vgj]D ۽]wَH{RK{nly.T[W({:vi9 []G~'ժoɦjG.D]ll]`lwj7HmkM5fwٙXf/4Gsdfy4+iގB.]A/ڣ;vޓ=yhڡ+B~2 r?-^eˮj,2˹~k/2 ~h^yY;yN,,SDzwV´2 <v@;JZ,oDiw"oF9eby^~:2 i:j`7^,Uf,e7%fzn[}Pbַ*юvv@;hCKhwlA]G=lVd)P%S)P== ­=]=Ir|m[*;k͟NF3xj䫢hv@;hAs6B_3X _;>?7kb2޷}o>g6Ƴ +hoS^phpQpk+@ Q[5X$[Kз?={hewk>|g׵{:\ÇW޻~myjWKWw՞$OIYqQyzњY.Z1WjF|aF%F?o=|G}RtIIDsngV%wCZLz>lo=ҵvSa^^}ph=3Ȍ.V>=A!H2|~?C"RmvEړ"Xtc+"r{~Wﻶ򤗭+^=rRqxϴ7Ouzy'}6ўXMՎ2]ԉ n+2c6TK;ב;J07G+V_l>fMxI9;k쥳h"X6osue֜_1YeOGϿO^ ;%Tч_=o컶TZ"ogc+}ui/o=z/wE;pz _x:h_YwS8p`}6R}n}>$v,kEU_g*(\B \0 zhvx^Es-ޡr]ڡv@;hC;BfBd̏9TyHAo߿sW?~?Wh#wYꓺ釽Hƙ$HzN!j%v{Dhg]G;uN׭ƹ`o}k]']>6ox򨟛t{}ښ~sǯ.p2unf={hv@;h}~W&rUY`ޓT^\alU'pVZ^\alUCڻо3=T^{*юvj}{;zͺi7kp *9"giG{o$_DӾ\q:H֔Ua9}UIKS_xUDT^{NճՎQ&먰̧j@$Ob]OIv>=[{Zjմe=TK|uRm[ی?ORg۫vHP %~8V KNOڋBIG sld.%_7 k=[J,(7δ'jz_f4T8zim?G{^TT.Mˈ>F[aZ(qdaڭmF'Y$Qa9SA־<>aPLTEÿĴ̱ԯܮ߱±|f~e}d}d}d}e}e|ovxptuqqqpppmmmllllllkkkkkk```[\\YZ[MZ_JZ`I[aI[aJZ`IQTCEF===888222***###-0 IDATxMOX.RRJtZf7 VgZ!aEQi#$6 "0mJss#:u0}m?'D ;e0lh~N_ J.^cl1@xeGmaf7ZuU\f##˺voپpm}KF [lo7\qoe}r޶ үxބ̧fΐ9vo%1bΐ^oDm2%~}!_QW]2HRBފI7 Ο@E{y_^ZHRrwu>-8y!MB{;t +?@n_Z]rx@ !0 C`C` !0C` E%M[7S &NY5ZG?GX{8uܺ.wprIC?g$u2a@&drIC?C` !uݺ;k~)r8Sy ڛ^ av-C` Qu\z ڜrˇ( ##|@q0C\˩+SǩDLJC!|DoC`N]Ʃp^9b?.iNy8u|ts<$ͩ6vҍy^yCӐcb}/G] q!"އr<=O@ϫFu4ؕ@~8$KʩϐxJ5~UWd4ؕ@. CR $)S2|Y;6C2a1-3h!΢Z-\ d4XTSwgSq"|>Do 8u C`/"Ykct!ҝ:H!"7cl!: !0Ɂv "۩cxg!:ni !0 /: qN]X    C`3-6N=@BS0 qYZaC ` !0C` !0C` ` !0P0C` !0 $ 0w=N][9M.@uusH:c u~'>?C`pq:q:qE!v-C` u8ua{ma';tȞOnSlFS"{.\|Tĵl_-2 h1xԋ>ݗnWp } 2N~gڧq _B&|`>r?ػŴI! )^Ư67z#lڿ HLNece(،vq40Y -3ȳh/o6ou ͐@rgQ.]~:g}b D|8uaԅ9k߀!|N!0ˁw"ݩct!}: "ۇ(dlC` !0Dr Bv"Ykck>>d[0DqC` !0D!Cp yCS>d!!!0 ~S0Ä3 $pzV0DXaC(C` !0C` !0C(C` ! !0C` !0DB ]So@NS{z(kl8uC1:$e!02\v~v~)z~Dq` !0gq=DS ]>DI  CS!02]N]ɝ?N]| 8>C'z Cpb5N]|8uafn7(M=p8f7] LH\oHzRǁ|XEKSiZ[W7KW\v=$>V>7iu.H gHJ5~UW8htT0$@YT6 _N͸F[0d 1}ew&yFA0@t3"YTKvtW%{>uqœ5N]o aNC` @;km 1DSW>DC} C2DS!0"9N]!Cd;uu וּ1D5C-"8!0!8S! aaC` Y|\ƩgaShpbd8N=@R+"`! !0C(?Z HIENDB`Kst-2.0.8/po/0000755000175000017500000000000012362706252012001 5ustar synthsynthKst-2.0.8/po/kst_common_pt_BR.po0000644000175000017500000111574612362706252015617 0ustar synthsynth# Translation of kst_common.po to Brazilian Portuguese # Copyright (C) 2014 This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # André Marcelo Alvarenga , 2014. msgid "" msgstr "" "Project-Id-Version: kst_common\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "PO-Revision-Date: 2014-06-08 00:47-0300\n" "Last-Translator: André Marcelo Alvarenga \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Aplicar estas definições por padrão" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Visualizar as primeiras 1.000 linhas em nova janela" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Primeiras linhas " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Visualização]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Cabeçalho" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Os dados começam na linha:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Ler os nomes dos campos a partir da linha:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Ler as unidades a partir da linha:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicadores de comentários:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Você pode usar mais de um símbolo aqui, como \"#!C\", por exemplo, mas irá " "tornar a leitura de arquivos ASCII mais lenta" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Separador decimal:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Ponto" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Vírgula" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Leiaute da coluna de dados" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Separados por espaços/tabulações" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Separador personalizado" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "A leitura será mais rápida se cada coluna tiver supostamente a sua própria " "largura constante." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Cada coluna tem a\n" "sua largura constante" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Largura fixa" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Opções gerais" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Limitar o tamanho do buffer:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Usar tarefas" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Sempre aceitar arquivos que correspondam a:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpretar um valor vazio como:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Valor anterior" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretação das datas/horas" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Valor" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Interpretar o campo" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "como:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Hora C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Segundos" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Índice com frequência" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "String formatada com:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Leia a documentação do QDateTime para mais detalhes.
Você pode usar uma " "combinação de y,M,d para as datas e h,m,s,z para as horas (z para os " "milissegundos).
É permitido o espaço entre as colunas de data e hora, " "mas você deverá selecionar a primeira coluna como o vetor X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dia, M=mês, y=ano, h=hora, m=minuto, s=segundo, z=milissegundo" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Deslocamento" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Data/hora:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Data do arquivo" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relativo" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Primeira linha do arquivo '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "A linha %1 não pode listar nomes E valores de campos!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "A linha %1 não pode listar unidades E valores!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "A linha %1 não pode listar nomes de campos E unidades!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Parâmetros inconsistentes" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Leitor de arquivos ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Analisando '%1'..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Análise concluída '%1'" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Analisando '%1': %2 linhas" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Lendo o campo: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "ÍNDICE criado" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Leitura concluída: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "lendo..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "analisando..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Coluna %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Leitor do DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Leitor de fontes de imagens FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Leitor de fontes de dados do Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Leitor de fontes de dados .mat do Matlab" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Leitor de netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Leitor de código do QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Leitor de fontes de dados de exemplo" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Leitor de listas de fontes" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Coluna %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "O arquivo de dados da matriz %1 não foi aberto." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "O arquivo de dados do vetor %1 não foi aberto." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Matriz de dados: %1\n" " %2\n" " Campo: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "O arquivo de dados do vetor %1 não foi aberto." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "O arquivo de dados do valor escalar %1 não foi aberto." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Escalar de dados: %1 = %4\n" " %2\n" " Campo: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 de %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "quadros" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Caminhos para pesquisa de plugins:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Analisando os plugins de fontes de dados." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Plugin carregado: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "a instância falhou para o %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "O arquivo '%1' não existe." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Não foi possível encontrar uma fonte de dados para o '%1' (%2), mas foi " "encontrada uma imediatamente anterior. Algo está errado com o Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "O arquivo de dados da string %1 não foi aberto." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "String de dados: %1 = %4\n" " %2\n" " Campo: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "O arquivo de dados do vetor %1 não foi aberto." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Vetor de dados: %1\n" " %2\n" " Campo: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Últimos %1 quadros." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Quadro %1 até ao fim." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 quadros começando em %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Ler 1 amostra por %1 quadros." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Média a cada %1 quadros." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 Q0: %3 N: %4 de %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Erro" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Aviso" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Observação" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Depuração" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Outro" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst versão %1\n" "\n" "\n" "Arquivo de registro do Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Plugins de fontes de dados:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Vetor editável: %1\n" " %2 valores" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Vetor gerado: %1\n" " %2 valores de %3 até %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 pontos de %1 até %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "A matriz salva contém menos dados do que afirma." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matriz: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Ocorreu um erro ao criar a matriz gerada a partir do arquivo Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Ocorreu um erro ao criar a matriz editável a partir do arquivo Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Ocorreu um erro ao criar a matriz de dados a partir do arquivo Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Escalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Escalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Valor: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Ocorreu um erro ao criar o escalar a partir do arquivo Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "String: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Ocorreu um erro ao criar a string a partir do arquivo Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Fornecedor: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vetor: %1\n" " %2 amostras\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Ocorreu um erro ao criar o vetor a partir do arquivo Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Ocorreu um erro ao criar o vetor gerado a partir do arquivo Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "O arquivo de dados do valor escalar %1 não foi aberto." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Escalar de dados: %1 = %4\n" " %2\n" " Campo: %3\n" " Quadro: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 quadro %3 de %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Um programa de visualização de dados.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revisão %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Página Web:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Por favor, relate os erros com o 'Assistente de Relatórios de Erros' do menu " "'Ajuda'.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autores e colaboradores (ordenados alfabeticamente):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Sobre o Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Configurações do Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Geral" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Escalonamento" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Grade" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Propriedades do leiaute" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Seta" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Ocorreu um erro ao criar o objeto de seta a partir do arquivo Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Criar uma seta" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Propriedades_Seta" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "&Seta no início" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Escala da se&ta inicial" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Tamanho da ponta da seta" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "O tamanho da ponta da seta é proporcional a este valor." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "S&eta no fim" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Escala da seta fi&nal" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Eixo" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Grosso" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fino" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Muito fino" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Linha sólida" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Linha tracejada" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Linha pontilhada" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Linha com traço e ponto" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha com traço, ponto e ponto" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Linha tracejada personalizada" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Ocultar à esquerda" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Ocultar à direita" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Ocultar as margens e legendas" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Ocultar a parte superior" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Ocultar a parte inferior" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotação da legenda" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotação:" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Modo Base/Deslocamento" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Automático" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Ligado" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Desligado" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Dígitos antes do modo base/deslocamento automático:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Se é necessário este número de dígitos para mostrar os números dos traços, " "então o eixo retornar ao modo Base/Deslocamento." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Forçar o deslocamento ao mínimo do eixo" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarítmica" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Inverte a direção do eixo, de modo que os números diminuam em vez de " "aumentar." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Inve&rter" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "O eixo é o tempo" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpretar o eixo como o tempo." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpretar como:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Tipo de codificação do tempo" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "O eixo representa o tempo, cuja codificação é selecionada aqui." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Exibir como:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Formato de apresentação do tempo" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Se o eixo for interpretado como tempo, então apresenta o tempo " "correspondente no eixo com este formato." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Fuso horário:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Formato de data/hora:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Data: y/M/d - Hora: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Traços e linhas maiores" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Desen&har traços" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Desenhar as linhas da &grade" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Es&paço maior:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Densidade dos traços maiores" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Indica a densidade dos traços maiores. O intervalo entre traços maiores será " "escolhido automaticamente, como uma potência de 10 elevado a 1, 2 ou 5. Isso " "muda o espaço-alvo entre traços dentro desta restrição." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "E&stilo da linha da grade:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "Estilo da &cor da grade:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Largura:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Traços maiores e menores" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Desenh&ar traços" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Desenhar as linhas da grade" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Número de &traços menores:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Automático" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Est&ilo de linha:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Cor da &linha:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: Arquivo não encontrado. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Janela" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "Etiqueta de texto" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Selecione o novo arquivo de dados:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Tipo de arquivo desconhecido" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Alterar" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Ignorar" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Plugin Básico" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Editar o plugin %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Novo plugin %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Não foi possível criar o objeto do plugin com os parâmetros indicados.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Entradas e saídas" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Caixa" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Ocorreu um erro ao criar o objeto de caixa a partir do arquivo Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Criar caixa" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-bits" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-bits" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistente de Relatório de Erros" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Versão do Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "SO:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Para enviar um relatório de erros, clique no botão abaixo.\n" "Isto abrirá uma janela do navegador web em http://bugs.kde.org, onde você " "encontrará um formulário para preencher.\n" "A informação exibida acima será transferida para este servidor." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Iniciar o Assistente de Relatório de Erros" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Botão" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Ocorreu um erro ao criar o objeto de botão a partir do arquivo Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Gráfico cartesiano" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "quadros" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Memória insuficiente" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Você solicitou a leitura de %1 MB de dados, mas parece que só há " "aproximadamente %2 MB de memória útil disponível. Não é possível carregar " "tantos dados." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Alterar as amostras de dados" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Seleção do vetor" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O arquivo de código para os vetores selecionados nesta lista será alterado." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Selecionar todos os vetores na lista." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "A&dicionar tudo" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Desmarcar todos os vetores na lista." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "&Remover tudo" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "O arquivo não pôde ser carregado ou não contém dados." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "O seguinte campo não está definido para o arquivo solicitado:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Os seguintes campos não estão definidos para o arquivo solicitado:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Alterar o arquivo de dados" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Selecionar por arquivo de origem" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "A&dicionar tudo a partir de:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Seleção de vetor e matriz" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O arquivo de código para os vetores selecionados nesta lista será alterado." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Selecionar todos os vetores na lista." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "A&dicionar tudo" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Desmarcar todos os vetores na lista." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "&Remover tudo" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Novo arquivo de dados" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Arquivo:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "A<erar os vetores e matrizes selecionados" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "Objetos derivados d&uplicados (curvas, equações, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplicar os vetores e matrizes selecionados" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Tipo de arquivo desconhecido" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Atribuir a cor da curva do arquivo" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Atribuir cores" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Basear a cor da curva em:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Vetor &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Vetor &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Raio" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centro" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a posição aos dados" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Círculo" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Ocorreu um erro ao criar o objeto do círculo a partir do arquivo Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Criar um círculo" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "fim" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Coluna %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Uso: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Uso: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Uso: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Uso: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Uso: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Uso: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Uso: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Uso: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Uso: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Não foram indicados arquivos de dados\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "o arquivo %1 não existe\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Uso: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Uso: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Uso: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Uso: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Uso: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Uso: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Elevar na ordem do gráfico: Alt+Seta para cima" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Baixar na ordem do gráfico: Alt+Seta para baixo" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Objetos &disponíveis:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Desmarcar tudo" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Selecionar tudo" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Elevar na ordem do gráfico: Alt+Seta para cima" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Seta para cima" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Baixar na ordem do gráfico: Alt+Seta para baixo" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Seta para baixo" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "O&bjetos visíveis:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "grupoBotoes" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "ISTO E TUDO O QUE ESTIVER ABAIXO É APENAS PARA CRIAÇÃO DE SCRIPTS E DEVERÁ " "ESTAR OCULTO!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Espectrograma" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Editar espectrograma" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Novo espectrograma" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Conteúdo do espectrograma" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Vetor de dados:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Tamanho da janela:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Opções da imagem" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Curva" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Editar curva" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Nova curva" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Conteúdo da curva" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Vetor do eixo &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Vetor do eixo &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Barra de e&rro +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Barra de erro &+Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Barra de erro -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Barra de erro &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Usar a barra de erro +X em -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "U&sar a barra de erro +Y em -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorar nos cálculos automáticos de gama de eixos" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nome:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Automático" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Editar vários >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Editar um %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Indique aqui o seu filtro (caracteres especiais permitidos)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Criar uma curva" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Criar um espectro de potência" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Criar um espectrograma" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Criar um histograma" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Aplicar filtro" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Criar uma imagem" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Adicionar ao gráfico" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Remover do gráfico" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Aplicar um ajuste" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Excluir" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gerenciador de dados" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtro por:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Todas as colunas" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nome" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Tipo" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Amostras" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Diferenciar maiúsculas de minúsculas" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Eliminar" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Ocorreu um erro ao criar a fonte de dados a partir do arquivo Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Intervalo de tempo" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Detecção de alterações" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Sem atualização" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Elevar na ordem do gráfico: Alt+Seta para cima" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Baixar na ordem do gráfico: Alt+Seta para baixo" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vetor(es) disponível(is)" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vetor(es) selecionado(s)" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Criar gráficos es&pectrais. Veja as opções do FFT abaixo:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Memória insuficiente" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Você solicitou a leitura de %1 MB de dados, mas parece que só há " "aproximadamente %2 MB de memória útil disponível. Não é possível carregar " "tantos dados." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "" "Criar gráficos &XY. Defina as propriedades do vetor no eixo do X abaixo:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Criar a partir d&o campo:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "&Usar o existente:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "O campo a ser usado como eixo X na curvas XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Selecione uma fonte de dados para " "trabalhar. Esta será normalmente o seu arquivo que contém vetores ou pontos " "de dados.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Tipo de arquivo desconhecido" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Tipo de atualização; use o 'Intervalo de tempo' para os dados não-locais" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtros" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Novo filtro..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Se desejar, selecione um " "filtro para ser aplicado aos campos lidos:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Colocação da curva" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "Tod&as as curvas em um gráfico" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 novo gráfico por curva" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Ci&rcular por" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " gráficos" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Circular pelos gráficos exis&tentes" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "To&das as curvas no gráfico" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Colocação do gráfico (abas)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Todas na aba a&tual" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Todas em uma no&va aba" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "Gráfico&s XY e espectros em novas abas separadas" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Leiaute do gráfico" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "&Leiaute automático" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Grade &personalizada" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Colunas:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&roteger o leiaute existente" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Ajustar a escala de todas as legendas na aba" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Compartilhar o eixo na aba" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Estilo da cur&va" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Apenas l&inhas" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Apenas &pontos" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "&Linhas e pontos" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Modo do eixo do espectro" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Eixo X lo&garítmico" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Eixo Y &logarítmico" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legendas" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Ligadas" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Desligadas" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&utomático" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertical" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Elevar na ordem do gráfico: (Alt+Seta para cima)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Seta para cima" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Seta para baixo" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Selecionar (Alt-S): Move os campos realçados da lista de dados Disponíveis " "para a Selecionados, de forma a criar o gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Remover (Alt-R): Move os campos realçados da lista de dados Selecionados " "para a Disponíveis, para que não sejam representados no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "" "Dados selecionados: Todos os campos desta lista são representados no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Dados selecionados: Todos os campos desta lista serão representados no " "gráfico. Para remover os campos desta lista, arraste-os para a lista de " "dados Disponíveis, como um clique duplo sobre eles ou selecione-os e use o " "botão Remover (ícone da seta à direita ou Alt-R). A ordem em que os campos " "aparecem nesta lista será a ordem de representação no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Dados selecionados:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vetor(es) selecionado(s)" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtro de pesquisa" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtro de pesquisa: Os campo que corresponde a este filtro serão " "selecionados e movidos para o topo da lista de dados Disponíveis. Podem ser " "utilizados os caracteres especiais '*' e '?'." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Adicionar o caractere especial '*' no início e no fim do filtro de pesquisa " "para corresponder a tudo o que contenha o texto de filtragem." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "P&esquisar" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Seleção de campo: Os campos selecionados são representados no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Dados disponíveis: Esta lista contém todos os campos que ainda não foram " "selecionados para o gráfico. Para selecionar um campo, mova-o para a lista " "de dados Selecionados, arrastando-o com o mouse, com duplo clique ou " "selecionando e clicando no botão de seleção (Seta à direita - o atalho é Alt-" "S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Dados disponíveis:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vetor(es) disponível(is)" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

versão %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

versão %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Janela de depuração do Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informações de compilação" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Enviar por e-mail as informações de depuração" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Registro" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Nível de registro: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Erro" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Aviso" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Observação" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Depuração" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Limpa&r" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Fontes de dados" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Instância carregada" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Fe&char" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Ocorreu um erro. Clique neste ícone para mais detalhes." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Fontes" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Carta" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Gráfico do jornal" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Personalizado" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "Tamanho &mínimo da fonte (pontos):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Ao redimensionar a janela, as fontes serão apresentados com no mínimo este " "tamanho." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Tamanho da janela de referência:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Quando a janela tiver este tamanho, as fontes terão o tamanho indicado." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "O tamanho das fontes será ajustado com o tamanho da janela ou da impressão. " "Quando tiver este tamanho, os valores aqui indicados serão os exatos." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Tamanho de referência personalizado (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Salvar como padrão" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Aplicar aos objetos existentes" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Mover para cima a propriedade selecionada na lista de prioridades" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Mover para baixo a propriedade selecionada na lista de prioridades" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "Adicionar a propriedade selecionada à lista de propriedades a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "Remover a propriedade selecionada da lista de propriedades a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Cor da linha" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Estilo dos pontos" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Estilo de linha" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Espessura da linha" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Diferenciar as curvas" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Seleção da propriedade e ordem do ciclo" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Elevar na ordem de seleção: Alt+Seta para cima" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Seta para cima" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Baixar na ordem de seleção: Alt+Seta para baixo" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Seta para baixo" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Disponível:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Selecionado:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opções" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Largura máxima da linha:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Densidade do ponto:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Tudo" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Alta" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Média" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Baixa" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotação:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Tamanho:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Posição:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Corrigir a proporção" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a posição aos dados" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Não foi possível abrir o arquivo para gravação." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Não foi possível abrir o arquivo para leitura." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "O arquivo está corrompido e ocorreu um erro na sua leitura." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Selecionar os objetos a editar" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtro:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Limpar" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Selecion&ar tudo" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Elipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Ocorreu um erro ao criar o objeto da elipse a partir do arquivo Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Criar uma elipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Equação" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Editar equação" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Nova equação" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Equação" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Eq&uação:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Indique aqui a equação a ser avaliada. Use o 'x' como variável independente. " "Os vetores e os operadores são selecionados nas listas acima." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Vetor &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpolar para o vetor de solução mais elevado" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Monitor de eventos" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Editar o monitor de eventos" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Novo monitor de eventos" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Notificação por e-mail" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "N&otificar:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expressão" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vetores:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operadores:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Escalares:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expressão:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Descrição:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Executar:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tificar:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configurar..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Registro de depuração do Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Aviso" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Erro" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Nota" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Registrar como:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exportar para um arquivo de gráfico" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "Nome &base:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Formato do arquivo:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Tamanho" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Largura:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Largura da imagem (em pixels)." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Altura:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Altura da imagem (em pixels)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "I&ndique:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largura, mantendo as proporções" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Altura, mantendo as proporções" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Largura e altura" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Tamanho do quadrado" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Opções de salvamento" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Não salvar automaticamente. Em vez disso, salvar ao clicar em OK ou Aplicar." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Sal&var uma vez" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Salvar a imagem com temporização" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Quando estiver assinalada, a imagem será salva automaticamente usando o " "período indicado. Isto é útil, por exemplo, para imagens em páginas Web." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "S&alvar automaticamente a cada" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Tempo para salvamento automático" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "&Extensão automática" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Incluir:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Formatos de vetor" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Formatos da imagem" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exportar vetores" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Seleção do vetor" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O arquivo de código para os vetores selecionados nesta lista será alterado." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Selecionar todos os vetores na lista." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "A&dicionar tudo" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Desmarcar todos os vetores na lista." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "&Remover tudo" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "&Salvar no local:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Preencher" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Sem pincel" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Padrão sólido" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Padrão denso 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Padrão denso 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Padrão denso 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Padrão denso 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Padrão denso 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Padrão denso 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Padrão denso 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Padrão horizontal" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Padrão vertical" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Padrão cruzado" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Padrão diagonal 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Padrão diagonal 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Padrão diagonal cruzado" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Cor:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "E&stilo:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Usar um gradiente &linear" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Restaurar gradiente" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Editar o plugin %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Novo plugin %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Não foi possível criar o objeto do plugin com os parâmetros indicados.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Seleção de plugins" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nome do plugin:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Descrição:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Entradas e saídas" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorar nos cálculos automáticos de gama de eixos" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Geral" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Atualiza os arquivos dinâmicos com base neste período." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Tempo mínimo entre as atualizações, ao olhar para os arquivos dinâmicos. Se " "existir muito processamento, isto poderá levar mais tempo." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Período entre atualizações (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Usar uma transparência ao arrastar" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Renderizar com \"raster\". Isto é sempre melhor." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "A renderização com \"raster\" é mais rápida em algumas arquiteturas, mas " "muito problemática em outras (dependendo do driver de vídeo). Isso poderá " "ajudar ou fazer com que as coisas fiquem horríveis." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Usar o mecanismo \"raster\" (é necessário reiniciar o Kst)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Su&avizar os gráficos" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Grade" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Mostrar &grade" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Aju&star à grade" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Espaçamento &horizontal da grade:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Espaçamento &vertical da grade:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histograma" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Editar histograma" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Novo histograma" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Propriedades do histograma" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Veto&r de dados:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "&Grupos de:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "O limite inferior do grupo mais baixo. Os valores abaixo desse limite não " "serão contados em nenhum grupo." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "até:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "O limite superior do grupo mais alto. Os valores acima desse limite não " "serão contados em nenhum grupo." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Número de grupo&s:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "O número de grupos no histograma." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Definir os limites inferior e superior, bem como o número de grupos para um " "padrão razoável." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "Grupos a&utomáticos" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "G&rupos automáticos em tempo real" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalização do eixo Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "O eixo Y do histograma indica a fração das amostras no grupo." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fração no grupo" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "O eixo Y do histograma indica o número de amostras no grupo." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "Nú&mero no grupo" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "O eixo Y do histograma é normalizado, de modo que o grupo mais alto seja " "igual a 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Grupo de pico = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "O eixo Y do histograma indica o percentual de amostras no grupo." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&tual no grupo" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Imagem" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Editar imagem" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Nova imagem" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Conteúdo da imagem" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matriz:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Tipo de imagem" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "M&apa de cores" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Mapa de con&torno" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Mapa de &cores e mapa de contorno" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Parâmetros do mapa de cores" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "S&uperior:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "&Limite - Inferior:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Inteligente" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&il:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Máx&/Mín" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Limite automático em tempo-&real" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Parâmetros do mapa de contorno" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "&Cor:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "&Número de níveis de contorno:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "Es&pessura:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Usar espessura de linha &variável" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Janela de criação de legenda" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Janela" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Bloquear a posição aos dados" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Direita" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Esquerda" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Ponto de referência:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " pontos" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "&Família da fonte:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Cor" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "&Tamanho da fonte:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Salvar como padrão" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a posição aos dados" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Direita" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Esquerda" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Ponto de referência da legenda:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotação" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Posição" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Legenda" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Criar legenda" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Propriedades da legenda" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um subconjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto em cores}, \\textbf{texto em negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Podem ser incorporados valores escalares, equações " "e elementos vetoriais. Escalar: [V1/Média]. Elemento de vetor: [V1" "[4]]. Equação: [=[V1/Média]^2]. Pode ser inserido um caractere " "'[' como \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "&Tamanho da fonte:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "&Família da fonte:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Tamanho da fonte padrão do &gráfico:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "pontos" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Ajustar automaticamente o tamanho das legendas dos eixos" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Legenda &superior:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automático" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Legenda i&nferior:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Legenda da esquerda:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Legenda da di&reita:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Mostrar le&genda" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&ditar" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Suporte a escalares & strings (nome entre colchetes) - p.ex., [ÍNDICE:Máx " "(X2)],\n" "equações incorporadas - p.ex., [=[ÍNDICE:Máx] / 2]\n" "e símbolos em LaTeX - p.ex., \\theta. Os nomes e símbolos são completados " "automaticamente." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Caixa de leiaute" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Leiaute" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Margem &horizontal:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Margem &vertical:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Espaçamento hori&zontal:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Espaçamento ver&tical:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Legenda vazia" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gráfico: %1 \n" "Conteúdo:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Elevar na ordem da lista: Alt+Seta para cima" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Baixar na ordem da lista: Alt+Seta para baixo" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Título:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Usar o conteúdo automático baseado no gráfico" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Mostrar na &vertical" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Objetos &disponíveis:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "O&bjetos visíveis:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Elevar na ordem do gráfico: Alt+Seta para cima" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Seta para cima" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Selecionar: Alt+S" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Baixar na ordem do gráfico: Alt+Seta para baixo" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Seta para baixo" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Configurações da fonte da legenda" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "&Tamanho da fonte:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Família da fonte" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a posição aos dados" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LinhaEdicao" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Ocorreu um erro ao criar o objeto linhaEdicao a partir do arquivo Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Linha" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Redimensionar" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Ocorreu um erro ao criar o objeto de linha a partir do arquivo Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Criar uma Linha" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script: Em execução" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script: Concluído" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script: Código de saída %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Erro do script: Falha ao iniciar" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Erro do script: Falhou" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Erro do script:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Criar um item no arquivo de registro" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Executa&r o script novamente" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Aplicar" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Fe&char" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Mensagem" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Mensagem:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Limpar" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Resultado do script:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuração" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Propriedades do gráfico" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Largura:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largura, mantendo as proporções" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Altura, mantendo as proporções" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Largura e altura" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Tamanho do quadrado" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Altura:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Altura da imagem (em pixels)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Formato do arquivo:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "I&ndicar:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Largura da imagem (em pixels)." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Pasta local de registro:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "As variáveis $user, $imagefile e $messagefile podem ser usadas na lista de " "argumentos." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "Nome de &usuário:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Mensagem de gravação" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Seu documento foi modificado.\n" "Deseja salvar as alterações?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Salvar o arquivo" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sessões do Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Abrir arquivo" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Limpar os arquivos inexistentes" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Para mais detalhes, procure em 'Ajuda->Janela de depuração->Registro'." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Erro ao abrir o documento:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Abrir..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Abre uma nova sessão" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Salvar" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Salva a sessão atual" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Salvar &como..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "No&va sessão" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Fecha a sessão atual e inicia uma nova e vazia" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Recarregar todas as fontes de &dados" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Recarrega todas as fontes de dados" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "Im&primir..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Imprime a visualização atual" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exportar como imagem..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exportar gráficos para o disco" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Salvar os &vetores em disco..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exportar os vetores como arquivo ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Item de ®istro..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Enviar um item de registro" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Nova aba" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Criar uma nova aba" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Fe&char aba" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Fechar a aba atual" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "Sai&r" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Sai do aplicativo" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vetores" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Mostra todos os vetores em uma planilha" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "E&scalares" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Mostra todos os escalares em uma planilha" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrizes" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Mostra todas as matrizes em uma planilha" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "S&trings" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Mostra todas as strings em uma planilha" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "&Retornar uma tela" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Retorna uma tela" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "A&vançar uma tela" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Avançar uma tela" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Contar a partir do fim" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Configurar todos os vetores de dados para contarem a partir do fim" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "Le&r até o fim" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Configurar todos os vetores de dados para lerem até o fim" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pausar" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Ativa/desativa a pausa das atualizações das fontes de dados" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Alterar os intervalo&s das amostras de dados..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Mostra a janela para alterar os intervalos de amostras de dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Gráfico" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Cria um gráfico na janela atual" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "E&scalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vetor" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matriz" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Strin&g" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Curva" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Equação" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Espectro de &potência" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histograma" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Imagem" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Espectr&ograma" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Mo&nitor de eventos" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Legenda" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Cria uma legenda na janela atual" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Caixa" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Cria uma caixa na janela atual" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Círculo" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Cria um círculo na janela atual" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Elipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Cria uma elipse na janela atual" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Linha" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Cria uma linha na janela atual" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "Set&a" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Cria uma seta na janela atual" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Imagem" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Cria uma imagem na janela atual" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Cria uma imagem SVG na janela atual" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Caixa do eixo compartilhada" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Cria uma caixa de eixo compartilhada para o item atual" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Al&ternar o zoom ligado" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Ativa/desativa o zoom ligado da janela atual" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Ligar entre tod&as as abas" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "O zoom ligado aplica-se entre as abas" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Realçar os pontos de dados" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Realça o ponto de dados mais próximo" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Zoom/Deslocar em X-Y" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Aplica zoom arbitrariamente na direção X ou Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Zoom apenas em &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoom apenas na direção do X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Zoom apenas em &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Modo de &leiaute" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Altera o modo do leiaute da janela atual" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Gerenciador de dados" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Mostra a janela de gerenciamento de dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Assistente de &Dados" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Mostra o Assistente de Dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "A<erar o arquivo de dados" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Mostra a janela para alterar o arquivo de dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Atribuir a &cor da curva por arquivo" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Mostra a janela de seleção de cores do Kst" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "D&iferenciar as curvas" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Mostra a janela para diferenciação das curvas do Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configurar o Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Mostra a janela de configuração do Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Tema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Mostra a janela de temas do Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Janela de &depuração" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Mostra a janela de depuração do Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "&Assistente de Relatório de Erros" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Mostra o Assistente de Relatório de Erros do Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Sobre" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Mostra a janela 'Sobre o Kst'" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Arquivo" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Sessões &recentes" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "A&rquivos de dados recentes" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Editar" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "E&xibir" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Inte&rvalo" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Criar" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "P&lugin padrão" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Pl&ugin de ajuste" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Plugin de fil&tro" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Anotação" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Modo" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Modo de interação" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "Ferramen&tas" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "&Configurações" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "Aj&uda" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Arquivo" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Ferramentas" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Intervalo de dados" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Modo" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Leiaute do gráfico" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Leiaute avançado" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Pronto" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Marcadores" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Linha sólida" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Linha tracejada" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Linha pontilhada" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Linha com traço e ponto" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha com traço, ponto e ponto" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Linha tracejada personalizada" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Já existe um marcador de gráfico com valor igual ou muito semelhante." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "O texto que você indicou não é um número válido." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Marcadores de eixos" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Novo ponto do marcador: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Marcadores at&uais" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Limpar" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Aparência do marcador" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Est&ilo de linha:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Cor da &linha:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Es&pessura da linha:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Marcadores automáticos" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "U&sar a curva como fonte dos marcadores:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Criar marcadores em:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "&Borda crescente" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "B&orda decrescente" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "Am&bos" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Usar o &vetor como fonte dos marcadores:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matriz" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Editar a matriz" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Nova matriz" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Escala e tradução" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "&Tamanho do passo em X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X mínimo:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y mínimo:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Tamanho do &passo em Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Parâmetros do gradiente" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Incrementar/decrementar os valores de Z ao longo de:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Eixo X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Eixo Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z mínimo:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Passos em X:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Passos em Y:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z máximo:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Intervalo de dados" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "&Quadro inicial do Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "&Número de quadros em X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "C&ontar a partir do fim" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "Le&r até o fim" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Nú&mero de quadros em Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "L&er até o fim" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Contar a partir &do fim" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Quadro &inicial do X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " quadros" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Primeiro o &filtro 'boxcar'" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Ler &1 amostra por" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Fonte" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Ler da fonte de dados" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Gerar um gradiente" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Parâmetros da fonte de dados" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "&Campo ou coluna:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nome do arquivo:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Conectar" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB disponíveis" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "&Tamanho da fonte:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "&Família da fonte:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Usar a fonte padrão do gráfico" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Imagem" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Abrir imagem" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Ocorreu um erro ao criar o objeto de imagem a partir do arquivo Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Criar imagem" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Anos]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dias]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Horas]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minutos]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Segundos]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Gráfico" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom máximo" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom máximo insensível a picos" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zoom anterior" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zoom ligado" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom ligado em X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom ligado em Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom em Y centralizado na média" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Zoom em X máximo" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Contorno automático do zoom em X" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Zoom máximo em X insensível a picos" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Zoom em X à direita" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Zoom em X à esquerda" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Redução em X" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Ampliação em X" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalizar o eixo X para o eixo Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Eixo X logarítmico" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Zoom local em Y máximo" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Zoom em Y máximo" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Contorno automático do zoom em Y" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Zoom máximo em Y insensível a picos" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Zoom em Y para cima" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Zoom em Y para baixo" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Redução em Y" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Ampliação em Y" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalizar o eixo Y para o eixo X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Eixo Y logarítmico" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Ajustar a escala de cores da imagem" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximizar o gráfico" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Compartilhar os gráficos no eixo X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Compartilhar os gráficos no eixo Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Quebrar a área compartilhada do eixo" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copiar coordenadas" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copiar a coordenada X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copiar a coordenada Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copiar" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtro" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Editar curva" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Ajustar" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Configuração da caixa compartilhada do eixo" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Informação copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Coordenada X copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Coordenada Y copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gráfico: %1 \n" "Conteúdo:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Gráfico vazio" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Ocorreu um erro ao criar o objeto do gráfico a partir do arquivo Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Criar gráfico" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Criar gráfico para a curva" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Zoom fixo da expressão" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Zoom em X do intervalo da expressão" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom máximo" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom máximo insensível a picos" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom centralizado na média" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom em X centralizado na média" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom em Y centralizado na média" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom em X máximo" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom em X com contorno automático" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom em X sem picos" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Deslocar o X para a direita" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Deslocar o X para a esquerda" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Redução em X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Ampliação em X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Normalizar o eixo X para o eixo Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom máximo local em Y" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom máximo em Y" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom em Y com contorno automático" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom em Y sem picos" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom em Y para cima" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom em Y para baixo" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Redução em Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Ampliação em Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Normalizar o eixo Y para o eixo X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom log. em X" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom log. em Y" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Editar o item do gráfico" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Conteúdo" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Fonte superior" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Fonte inferior" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Fonte da esquerda" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Fonte da direita" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Fonte do eixo" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Intervalo/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Eixo X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Eixo Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Marcadores do eixo X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Marcadores do eixo Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Fonte superior*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Fonte inferior*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Fonte da esquerda*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Fonte da direita*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Fonte do eixo*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Desenho do gráfico" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Modo de referência" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Espectro de potência" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Editar o espectro de potência" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Novo espectro de potência" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Conteúdo do espectro de potência" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Veto&r de dados:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nome" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Valor" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Intervalo" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Modo do zoom em X " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&utomático" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Automático com &contorno" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Automático insensível a &picos" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "C&entralizado na média, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "inter&valo: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ixo, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "&de: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "&até: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "DEVIA ESTAR OCULTO" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Modo do zoom em Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Automático" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Automático com &contorno" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Automático insensível a pico&s" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "&Centralizado na média, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "inte&rvalo: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fixo, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "d&e: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "a&té: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Escalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Editar escalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Novo escalar" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Ler da fonte de dado&s" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Gera um novo vetor com as propriedades aqui indicadas como sendo a variável " "independente." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Ler do &vetor de dados" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Ler da fonte de dados" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nome do arquivo:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Campo:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Conectar" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "Quad&ro:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Selecione isto para ler os dados a partir do fim do arquivo. Isto é útil " "para deslocar as visualizações durante a atualização de um arquivo por outro " "aplicativo." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "ú<imo quadro" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Gerar" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "V&alor: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Valor máximo da variável independente." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nome" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Tipo" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Amostras" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Caixa do eixo compartilhada" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Quebrar a caixa compartilhada do eixo" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Ocorreu um erro ao criar o objeto de caixa compartilhada a partir do arquivo " "Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Criar caixa de eixo compartilhada" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "String" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Editar string" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Nova string" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Ler da fonte de dado&s" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&Nome do arquivo:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "Ca&mpo:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Conectar" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Valor: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Traço" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Sem caneta" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Linha sólida" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Linha tracejada" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Linha pontilhada" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Linha com traço e ponto" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha com traço, ponto e ponto" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Linha tracejada personalizada" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Sem pincel" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Padrão sólido" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Padrão denso 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Padrão denso 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Padrão denso 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Padrão denso 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Padrão denso 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Padrão denso 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Padrão denso 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Padrão horizontal" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Padrão vertical" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Padrão cruzado" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Padrão diagonal 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Padrão diagonal 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Padrão diagonal cruzado" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Junção central" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Junção em cunha" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Junção arredondada" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Junção central em SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Extremo plano" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Extremo quadrado" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Extremo arredondado" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "E&stilo:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Largura:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Estilo da &cor:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Estilo do &pincel:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Estilo da &junção:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "E&stilo dos extremos:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Abrir imagem SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Ocorreu um erro ao criar o objeto SVG a partir do arquivo Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Criar SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Exibir &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Renomear aba" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Digite o nome de uma nova aba:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Adicionar aba" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Renomear aba" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Fe&char aba" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Editar visualização" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Limpar o leiaute" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automático" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Personalizado" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Tema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Preenchimento" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Traço" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Fontes" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "&Tamanho da fonte:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "&Família da fonte:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " pontos" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Salvar como padrão" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Aplicar aos objetos existentes" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vetor" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Intervalo de tempo" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Detecção de alterações" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Sem atualização" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Editar o vetor" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Novo vetor" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Número de amostras:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "O número de amostras para a nova variável independente." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&De:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Valor mínimo da variável independente." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "a&té:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Valor máximo da variável independente." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Ler da fonte de &dados" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nome do arquivo:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "&Campo ou coluna:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Conectar" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Tipo de atualização. Use o 'Intervalo de tempo' para os dados não-locais." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automático" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Proteger leiaute" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Personalizado" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Leiaute em colunas" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Leiaute em colunas por ordem de criação.\n" "Selecione o número de colunas:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Limpar o leiaute" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menu Exibir" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Editar visualização" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Preenchimento" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Excluir" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Elevar" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Baixar" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automático" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Proteger leiaute" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Colunas" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "B&loquear a posição aos dados" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Leiaute em colunas" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Leiaute em colunas por ordem de criação.\n" "Selecione o número de colunas:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menu %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Limpar o leiaute" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Redimensionar" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Escalar" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Rotacionar" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Criar leiaute" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Adicionar o item ao leiaute" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Redimensionar" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Remover" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Elevar" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Baixar" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Escalar" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Rotacionar" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Editar o item da visualização" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nome:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Editar vários >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Aparência" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Editar um" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Visualização da matriz" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Exibir os valores da string" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Exibir os valores escalares" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Exibir primitiva" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Atualizar" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Selecionar os vetores a exibir" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Exibir os vetores selecionados" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Remover os vetores selecionados da lista" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Remover" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Algarismos significativos" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Mostrar como inteiro" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (padrão)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Exibir os valores do vetor" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Mostrar a lista de vetores" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Ocultar a lista de vetores" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Reiniciar visualização" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Fechar" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Existe um erro no algoritmo %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Plugin: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Erro: Não foi possível criar o objeto de dados a partir do plugin" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Erro: Não foi possível encontrar o plugin do objeto de dados" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Ocorreu um erro ao criar o objeto do plugin a partir do arquivo Kst." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Não foi possível alocar memória suficiente para o espectrograma." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Espectrograma: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Densidade Espectral de Amplitude" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Densidade Espectral de Potência" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Espectro de amplitude" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Espectro de potência" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frequência" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Tempo" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Espectrograma: %1\n" " Tamanho da FFT: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Média; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodizar; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Remover a média;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Ocorreu um erro ao criar o espectrograma a partir do arquivo Kst." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar o espectrograma a partir do arquivo Kst. Não foi " "possível encontrar o vetor." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Curva" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Curva: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "Erro em X+: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "Erro em X-: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Erro em Y+: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Erro em Y-: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Linhas: Largura %1 e Estilo %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Pontos: Estilo %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Barras" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Ocorreu um erro ao criar a curva a partir do arquivo Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Ocorreu um erro ao criar a curva a partir do arquivo Kst. Não foi possível " "encontrar o xVector." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Ocorreu um erro ao criar a curva a partir do arquivo Kst. Não foi possível " "encontrar o yVector." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Analisando os plugins de objetos de dados." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() de tid=%2: gravando o resultado " "do bloqueio %3 (não é um fornecedor) -- isto é provavelmente um erro. Por " "favor, envie um e-mail com mais detalhes para kst@kde.org." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "A equação tem o objeto desconhecido [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Curva da equação" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "Ocorreu uma falha ao procurar os vetores da equação [%1] durante o " "reprocessamento." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Ocorreu uma falha ao procurar os vetores da equação [%1] durante o " "salvamento. O arquivo Kst resultante poderá ter problemas." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "A equação [%1] faz referência a objetos inexistentes." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "" "Ocorreu uma falha ao processar a equação [%1]. Os erros encontrados são " "apresentados a seguir." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Erro de análise: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Equação: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Ocorreu um erro ao criar a equação a partir do arquivo Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Ocorreu um erro ao criar a equação a partir do arquivo Kst. Não foi possível " "encontrar o xVector." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "evento" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Evento: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Ocorreu um erro ao criar o EventMonitorEntry a partir do arquivo Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Número" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Porcentagem" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fração" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Frequência normalizada" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histograma de %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histograma: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Auto-compartimentar" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 grupos de %2 até %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Ocorreu um erro ao criar o histograma a partir do arquivo Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar o histograma a partir do arquivo Kst. Não foi " "possível encontrar o vetor." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Imagem de %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Imagem: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Ocorreu um erro ao criar a imagem a partir do arquivo Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Ocorreu um erro ao criar a imagem a partir do arquivo Kst. Não foi possível " "encontrar a matriz." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Ano Juliano" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Tempo C normal" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Data Juliana" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Data Juliana modificada" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Data Juliana reduzida" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Tempo Atômico Internacional (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Hora do Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "AAAA/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/AAAA HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "String formatada" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Curva PSD" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Tentou-se criar uma PSD que usou toda a memória." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Densidade Espectral" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Espectro de amplitude" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Espectro de potência" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frequência" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Espectro: %1\n" " Dimensão da FFT: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Média; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodizar; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Remover a média;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "no PSDCalculator::calculatePowerSpectrum: foi recebida uma lista de " "resultado com o tamanho errado." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Ocorreu um erro ao criar o PSD a partir do arquivo Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar o PSD a partir do arquivo Kst. Não foi possível " "encontrar o vetor." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Nível de atividade de %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Nível de atividade" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Nível de atividade: %1\n" " Tempo de amostragem: %2 (s)\n" " Largura da janela: %3 (s)\n" " Limiar de ruído: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Erro: O vetor de entrada é muito curto." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Erro: A janela deve ser mais larga." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Nível de atividade" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Calcula o nível de atividade de um sinal como sendo o produto do desvio " "padrão com o número de reversões sobre uma janela deslizante." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Tempo de amostragem (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Largura da janela (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Limiar de ruído" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Objeto de plugin de compartimentos" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vetor de entrada é inválido" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Erro: Sem grupos" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Compartimento" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Agrupa os dados em compartimentos com o tamanho indicado. Cada compartimento " "contém a média dos elementos que pertencem a esse grupo." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Tamanho do grupo" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Objeto de plugin de recorte" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vetor de entrada é inválido" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Recorte" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Divide um determinado conjunto de dados em subconjuntos pares, ímpares, de " "diferenças e índices." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Objeto de plugin de convolução" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vetores de entrada - tamanho inválido" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho de entrada calculado é inválido" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convolução" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Gera a convolução de um vetor com outro." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Vetor de entrada 1" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Vetor de entrada 2" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Objeto de plugin de desconvolução" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vetores de entrada - tamanho inválido" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho de entrada calculado é inválido" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Desconvolução" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Gera a desconvolução de um vetor com outro." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Vetor de entrada 1" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Vetor de entrada 2" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Objeto de plugin de correlação automática" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vetor de entrada é inválido" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho de entrada calculado é inválido" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Correlação automática" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Gera a correlação automática de um vetor." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Correlação cruzada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vetores de entrada - tamanho inválido" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho de entrada calculado é inválido" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Correlação cruzada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Gera a correlação de um vetor com outro." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Vetor de entrada 1" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Vetor de entrada 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Objeto de plugin de espectro cruzado" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Plugin de objeto de dados de espectro cruzado" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Gera o espectro cruzado de potência de um vetor com outro." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Vetor de entrada 1" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Vetor de entrada 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Dimensão da FFT: 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Taxa de amostragem" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Objeto de plugin de largura de banda efetiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Erro: O tamanho do vetor de entrada em X é inválido" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "" "Erro: O tamanho dos vetores de entrada em X e em Y não tem o mesmo tamanho" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Erro: Os índices calculados são inválidos" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Largura de banda efetiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "" "Calcula a largura de banda efetiva a partir de um espectro de amplitude." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Freq. mín. ruído branco." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Frequência de amostragem (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Objeto de plugin de filtro genérico" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Erro: O numerador do texto de entrada está vazio" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Erro: O denominador do texto de entrada está vazio" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Filtro genérico" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Gera um filtro discreto a partir de uma definição de tempo contínuo." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Intervalo de amostragem (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numerador (ordem incremental)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Denominador (ordem incremental)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Objeto de plugin de interpolação Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Curva de interpolação Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "" "Gera uma interpolação de Akima não arredondada para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Objeto de plugin de interpolação Akima periódica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Curva de interpolação Akima periódica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Gera uma interpolação de Akima periódica não arredondada para um conjunto de " "dados." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Objeto de plugin de curva de interpolação Akima cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Curva de interpolação Akima cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Gera uma interpolação em curva para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Objeto de plugin de curva de interpolação Akima cúbica periódica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Curva de interpolação Akima cúbica periódica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Gera uma interpolação em curva cúbica para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Objeto de plugin de interpolação linear" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Curva de interpolação linear" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Gera uma interpolação linear para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Objeto de plugin de interpolação polinomial" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Curva de interpolação polinomial" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Gera uma interpolação polinomial para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Vetor de entrada X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Objeto de plugin de ajuste linear" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Erro: O tamanho do vetor de entrada em Y é inválido" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Erro: O tamanho do vetor de entrada em X é inválido" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Ajuste linear" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Gera uma linha de melhor ajuste para um conjunto de dados." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Plugin de objeto de dados de bloqueio" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vetores de entrada - tamanho inválido" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Bloqueio" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" "O bloqueio amplifica os dados de entrada usando uma onda portadora de " "referência" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Vetor de referência" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Objeto de plugin de adição de ruído" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vetor de entrada é inválido" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Adição de ruído" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Adiciona ruído Gaussiano a um conjunto de dados, com um determinado desvio " "padrão." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Objeto de plugin de periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Erro: O tamanho dos vetores de entrada não correspondem" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Retira o vetor do periodograma de um conjunto de dados de vetores de " "entrada. Os vetores de dados de entrada assumem-se como tendo sido usados " "como amostra em intervalos iguais ao do vetor temporal de entrada." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Tempo do vetor de entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Dados do vetor de entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Fator de sobre-amostragem" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Fator médio da frequência de Nyquist" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Objeto de plugin de fase" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Erro: A fase do valor escalar de entrada deve ser maior que zero." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Erro: O tamanho dos vetores de entrada não correspondem." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Ajusta a fase de um determinado conjunto de dados, com base no período de " "vetor de fase nula." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Tempo do vetor de entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Dados do vetor de entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Período" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Fase zero" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Objeto de plugin de desvio" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Desvio: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Desvio" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Desvia (e trunca) um vetor." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Valor do desvio (# pontos, negativo permitido)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Estatísticas de %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vetor de entrada é inválido" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Estatísticas" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Determina as estatísticas para um determinado vetor de entrada." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Vetor de entrada" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Objeto de plugin de compartimentos sincronizados" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Erro: O tamanho do vetor de entrada em X é inválido" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Erro: O tamanho dos vetores de entrada não correspondem" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Erro: Os grupos devem ser pelo menos 2" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Compartimentos sincronizados" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Adiciona de forma sincronizada o vetor Y aos compartimentos escalares de " "entrada definidos pelo vetor X, como se fosse um mapa em 1D." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Vetor de entrada X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Vetor de entrada Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Número de grupos" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X mín" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X máx" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Passagem de faixa %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Filtro de passagem de faixa" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vetor com um filtro de passagem de faixa de fase nula com uma " "resposta em amplitude Butterworth." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Vetor de entrada Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Ordem do filtro:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Frequência central / Taxa de amostragem:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Largura de banda:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Interrupção de faixa %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Filtro de interrupção de faixa" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtra um vetor com um filtro de interrupção de faixa de fase nula com uma " "resposta em amplitude Butterworth." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Vetor de entrada:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Ordem do filtro:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Frequência central / Taxa de amostragem:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Largura de banda:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Passagem elevada %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Filtro de passagem elevada" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vetor com um filtro de passagem elevada de fase nula com uma " "resposta em amplitude Butterworth." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Vetor de entrada:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Ordem do filtro:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Frequência de corte / Taxa de amostragem:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Passagem baixa %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Filtro de passagem baixa" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vetor com um filtro de passagem baixa de fase nula com uma " "resposta em amplitude Butterworth." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Vetor de entrada:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Ordem do filtro:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Frequência de corte / Taxa de amostragem:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Média acumulada %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Média acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Média acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Média acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Calcula a média acumulada do vetor de entrada." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Integral %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Soma acumulada" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Calcula a soma acumulada (integral) do vetor de entrada." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Passo (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 sem picos" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Remoção de picos" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtro de remoção de picos: %1\n" " Espaço: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Removeu-se os picos de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Filtro de remoção de picos" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Identifica e remove os picos usando uma diferença de 3 pontos." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Vetor de entrada:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Espaço:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Derivada de %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Derivada" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivada: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Erro: O passo do valor escalar de entrada não deve ser 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Derivação em passos fixos" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Calcula a derivada discreta de um determinado vetor de entrada" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Passo (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Passagem sobre %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Passagem sobre" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtro de passagem: %1\n" " %2 - %3\n" " Passo: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Passagem sobre %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Filtro de passagem sobre" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Passa sobre dados delimitados." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Vetor de entrada:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Mínimo:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Máximo:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Passo máx. (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Exponencial não-ponderado de %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Ajuste exponencial a %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Resíduo do ajuste exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Ajuste exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Gera um ajuste exponencial para um conjunto de dados." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Exponencial ponderado de %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Ajuste exponencial a %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Resíduo do ajuste exponencial" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Ajuste exponencial ponderado" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Gera um ajuste exponencial ponderado para um conjunto de dados." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Gaussiano não-ponderado de %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Ajuste gaussiano a %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Resíduo do ajuste gaussiano" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Ajuste gaussiano" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Gera um ajuste gaussiano para um conjunto de dados." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Gaussiano ponderado de %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Ajuste gaussiano a %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Resíduo do ajuste gaussiano" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Ajuste gaussiano ponderado" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Gera um ajuste gaussiano ponderado para um conjunto de dados." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "Gradiente não-ponderado de %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Ajuste gradiente a %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Resíduo do ajuste gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Limite inferior do ajuste gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Limite superior do ajuste gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Ajuste gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Gera um ajuste gradiente para um conjunto de dados." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Gradiente ponderado de %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Ajuste gradiente a %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Resíduo do ajuste gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Limite inferior do ajuste gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Limite superior do ajuste gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Ajuste gradiente ponderado" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Gera um ajuste gradiente ponderado para um conjunto de dados." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Plugin de ajuste de frequência de corte" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Erro: O tamanho dos vetores de entrada não correspondem" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Erro: O vetor de entrada em X é inválido" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Erro: As frequências de entrada são inválidas\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Erro: Os dados de entrada são inválidos.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Ajuste de frequência de corte" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Gera um ajuste de frequência de corte para um conjunto de dados." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Vetor de entrada - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Vetor de entrada - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Escalar de entrada - Freq. máx. 1/f^a" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Escalar de entrada - Freq. mín. ruído branco" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Escalar de entrada - Ruído branco C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "Linear não-ponderado de %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Ajuste linear a %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Resíduo do ajuste linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Limite inferior do ajuste linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Limite superior do ajuste linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Ajuste linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Gera um ajuste linear para um conjunto de dados." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "Linear ponderado de %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Ajuste linear a %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Resíduo do ajuste linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Limite inferior do ajuste linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Limite superior do ajuste linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Ajuste linear ponderado" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Gera um ajuste linear ponderado para um conjunto de dados." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Vetor de entrada - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vetor de entrada - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de entrada - Pesos" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Lorentz de %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajuste de Lorentz a %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Resíduo do ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Gera um ajuste de Lorentz para um conjunto de dados." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Lorentz ponderado de %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajuste de Lorentz a %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Resíduo do ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Ajuste de Lorentz ponderado" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Gera um ajuste de Lorentz ponderado para um conjunto de dados." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Vetor de entrada - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vetor de entrada - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de entrada - Pesos" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Polinomial de %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajuste polinomial a %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Resíduos do ajuste polinomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Ajuste polinomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Gera um ajuste polinomial para um conjunto de dados." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Ordem:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Polinomial ponderado de %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajuste polinomial a %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Resíduos do ajuste polinomial" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Ajuste polinomial ponderado" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Gera um ajuste polinomial ponderado para um conjunto de dados." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Vetor de entrada - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vetor de entrada - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de entrada - Pesos" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Escalar de entrada - Ordem" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Sinusoidal de %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Ajuste sinusoidal a %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Resíduo do ajuste sinusoidal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Ajuste sinusoidal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Gera um ajuste sinusoidal para um conjunto de dados." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmônicas:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Período:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Sinusoidal ponderado de %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Ajuste sinusoidal a %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Resíduo do ajuste sinusoidal" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Ajuste sinusoidal ponderado" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Gera um ajuste sinusoidal ponderado para um conjunto de dados." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Vetor de entrada - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vetor de entrada - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de entrada - Pesos" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Escalar de entrada - Harmônicas" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Escalar de entrada - Período" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Vetor de entrada da amostra" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Inserir um novo &vetor" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Inserir um novo e&scalar" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Editar" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Inserir um novo e&scalar" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Inserir uma nova string" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Editar" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Paleta de c&ores:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Aparência" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "Es&pessura:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Tipo de ponto" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Se a opção \"Mostrar pontos\" estiver assinalado, o tipo de ponto " "selecionado será desenhado em cada ponto de dados." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Tipo de linha" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Se a opção \"Mostrar linhas\" estiver assinalado, o estilo de linha " "selecionado será o usado." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "" "Assinale esta opção para que sejam desenhadas linhas entre os pontos de " "dados." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Linhas" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Assinale esta opção para que sejam desenhados os pontos selecionados em cada " "ponto de dados." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "&Pontos" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "Cabeçal&ho" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Gráfico de &barras" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Espessura da linha" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Se a opção \"Mostrar linhas\" estiver assinalada, será usada a espessura de " "linha selecionada." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Tamanho:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Densidade do ponto:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Tudo" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Alta" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Média" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Baixa" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Posicionamento" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Ajustar o tamanho da fonte" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Colocar em &novo gráfico" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "Em no&va aba" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "O nome do arquivo de dados que será lido para este vetor." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Colocar no gráfico &existente " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Não coloc&ar em nenhum gráfico" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Leiaute automáti&co" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "&Grade personalizada" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Colu&nas" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Proteger o leiaute existente" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Selecione uma curva para usar." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "quadros" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Intervalo de dados" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Selecione isto para definir a média dos quadros ignorados em conjunto. " "Possibilita um filtro passa-baixa simples." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Primeiro o &filtro 'boxcar'" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Economiza memória ao fazer uma amostra esparsa dos dados" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Selecione isto para ignorar alguns quadros, em vez de ler todos os dados. " "Isto é útil para ler arquivos de dados muito grandes, mas pouco alterados." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Ler &1 amostra por:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Selecione isto para ler todos os dados até ao fim do arquivo. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "L&er até o fim" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "ou" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Selecione isto para ler os dados a partir do fim do arquivo. Isto é útil " "para deslocar as visualizações durante a atualização de um arquivo por outro " "aplicativo." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "C&ontar a partir do fim" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Número de quadros a ignorar, se a opção \"Ler 1 amostra por\" estiver " "selecionada." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " quadro(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Início:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Inte&rvalo:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Indique um número (começando de 0 para o primeiro valor) ou uma data no " "formato [[[[AAAA:]MM:]DD:]HH:]MM[.SS]." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "O índice dos primeiros dados lidos. Para arquivos ASCII, este é o número de " "linha dos dados no arquivo. Para arquivos baseados em quadros, este é o " "primeiro quadro." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Quantidade de dados a ler para o vetor. Para arquivos ASCII, este é o número " "de linhas de dados. Para arquivos de quadros, poderá corresponder a mais do " "que uma amostra por quadro. As datas são inseridas no formato [[[[AAAA:]MM:]" "DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Arquivo não encontrado.\n" "Verifique se foi indicado um nome correto para o mesmo." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Opções do FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Padrão" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "cosseno" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussiano (Sigma personalizado)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Selecione da lista o vetor de origem para as barras de erro da curva no eixo " "Y. Se o \"\" estiver selecionado, nenhuma barra de erro do eixo Y " "será desenhada. Crie os novos vetores com a aba \"Vectores\"." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&zar" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "&Função:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Remo&ver a média" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Dimensão da FFT: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Define o tamanho das FFTs ao gerar o espectro de potência. 2^10 = 1024, etc. " "Quanto maior o número, maior o ruído e a resolução." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Mé&dia interpolada" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpolar sobre as &lacunas" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Taxa de a&mostragem:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "A taxa de amostragem com que foram adquiridas as medidas, para uma " "normalização conveniente." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Aplicar as novas especificações de amostras de dados aos vetores " "selecionados." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Unidades do vetor:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "As unidades do vetor de dados - para legendas automáticas." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Unidades da taxa:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "As unidades para a taxa de amostragem. Usadas nas legendas automáticas." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "S&aída:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Densidade Espectral de Amplitude (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Densidade Espectral de Potência" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Espectro de Amplitude (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Espectro de Potência (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Abrir arquivo" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Todos os arquivos (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Pasta dos arquivos de registro" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Salvar arquivo" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um subconjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto em cores}, \\textbf{texto em negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Podem ser incorporados valores escalares, equações " "e elementos vetoriais. Escalar: [V1/Média]. Elemento de vetor: [V1" "[4]]. Equação: [=[V1/Média]^2]. Pode ser inserido um caractere " "'[' como \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Texto da legenda. Há suporte para subconjunto do LaTeX. Clique em 'Ajuda' " "para obter auxílio." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Escalares e " "equações
Os escalares e as equações escalares podem ser vistos " "ao vivo em legendas. Quando o escalar é atualizado, a legenda também o é. Os " "nomes dos escalares estão sujeitos a completação automática. O formato é o " "seguinte:

Escalar: [scalarname], p.ex., " "[GYRO1:Mean(X4)]

Elemento de " "vetor:[vectorName[index]], " "p.ex., [GYRO1 (V2)[4]]

Equação: [=equation], e.g. [=[GYRO1:Mean(X4)]/[GYRO1:" "Sigma (X4)]]

Subconjunto de LaTeX suportado
As legendas no " "kst tem suporte a um subconjunto derivado do LaTeX. Por exemplo, para " "mostrar a equação para a área de um círculo, você poderia definir a legenda " "como sendo A=2\\pir^2. Ao contrário do desejado, isto deverá ser feito de " "forma explícita com o \\textit{}. As sequências suportadas são:

Letras gregas: \\name or \\Name. Por exemplo: \\alpha

Outros símbolos: \\approx,\\cdot,\\ge,\\geq,\\inf,\\int," "\\le,\\leq,\\ne," "\\partial,\\prod,\\pm," "\\sum,\\sqrt

>Efeitos das fontes: " "\\textcolor{colorname}{texto em cores}, " "\\textbf{texto em negrito},\\textit{texto em itálico},\\underline{texto sublinhado}," "\\overline{texto " "sobrelinhado}.

Outro:x^y,x_y, \\t,\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Suporte a símbolos de LaTeX, strings e escalares, assim como equações " "incorporadas." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "Eti&queta:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Ajuda" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um subconjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto em cores}, \\textbf{texto em negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Podem ser incorporados valores escalares, equações " "e elementos vetoriais. Escalar: [V1/Média]. Elemento de vetor: [V1" "[4]]. Equação: [=[V1/Média]^2]. Pode ser inserido um caractere " "'[' como \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "Texto da legenda. Há suporte para subconjunto do LaTeX. Veja a ajuda 'O que " "é isto?'." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Selecione um vetor a utilizar. Se você deseja criar um novo vetor, utilize o " "ícone à direita." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Criar um novo vetor." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Abre uma janela de vetor para criar um novo vetor, que se tornará o vetor " "selecionado." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Editar o vetor selecionado." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Aplicar uma janela de vetor para editar o vetor selecionado." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Janela" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Fechar" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Janela" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Pesquisar:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Selecione um escalar a utilizar. Se você deseja criar um novo escalar, " "utilize o ícone à direita." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Criar um novo escalar." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Editar o escalar selecionado." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Selecione uma string a utilizar. Se você deseja criar uma nova string, " "utilize o ícone à direita." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Criar uma nova string." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Editar a string selecionada." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Selecione um vetor a utilizar. Se você deseja criar um novo vetor, utilize o " "ícone à direita." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Criar um novo vetor" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Abre uma janela de vetor para criar um novo vetor, que se tornará o vetor " "selecionado." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Editar o vetor selecionado." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Aplicar uma janela de vetor para editar o vetor selecionado." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Widget do Kst" Kst-2.0.8/po/kst_common_nl.po0000644000175000017500000112134712362706252015214 0ustar synthsynth# Freek de Kruijf , 2014. # Jaap Woldringh , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-07-01 11:21+0200\n" "Last-Translator: Freek de Kruijf \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Deze instellingen toepassen als standaard" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Voorbeeld van de eerste 1000 regels in nieuw venster" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Eerste regels " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Voorbeeld]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Koptekst" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Gegevens beginnen op regel:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Veldnamen lezen vanaf regel:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Eenheden lezen vanaf regel:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicatoren voor commentaar:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "U kunt hier meer dan één symbool gebruiken, zoals bijvoorbeeld \"#!C\", maar " "dit vertraagt het lezen van ASCII-bestanden" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Decimaal scheidingsteken:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Punt" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Komma" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Opmaak van gegevenskolom" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Gescheiden door spatie/tab" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Aangepast eindteken" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "Lezen is sneller als elke kolom een eigen constante breedte heeft." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Elke kolom heeft zijn\n" "eigen constante breedte" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Vaste breedte" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Algemene opties" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Limiet buffergrootte:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Threads gebruiken" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Altijd bestanden accepteren met:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Lege waarde interpreteren als:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Nul" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Vorige waarde" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretatie datum/tijd" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Waarde" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Veld interpreteren" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "als:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "C-tijd" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Seconden" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Index met frequentie" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Opgemaakte string. Opmaak:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Voor details zie de documentatie van QDateTime.
U kunt een combinatie van " "y,M,d voor data en h,m,s,z (z voor milliseconden) voor tijden gebruiken.
" "Ruimte tussen datum- en tijdkolommen is toegestaan, maar u moet de eerste " "kolom als X-vector gebruiken." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dag, M=maand, y=jaar, h=uur, m=minuut, s=seconde, z=milliseconde" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Offset" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Datum/Tijd:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Bestanddatum" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relatief" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Eerste regels van bestand '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "Regel %1 kan niet de veldnamen EN waarden bevatten!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "Regel %1 kan niet de eenheden EN waarden bevatten!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "Regel %1 kan niet de veldnamen EN eenheden bevatten!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Inconsistente parameters" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Leesprogramma ASCII-bestanden" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Lezen van '%1' ..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Lezen van '%1' voltooid" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Lezen van '%1': %2 rijen" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Lezen van veld:" #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "INDEX aangemaakt" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Lezen beëindigd: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "lezen ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "inlezen..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Kolom %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Leesprogramma DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Leesprogramma FITS Image Source" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Leesprogramma Matlab Datasource" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Leesprogramma Matlab's .mat Datasource" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Leesprogramma netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Leesprogramma QImage Source" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Leesprogramma Sample Datasource" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Leesprogramma Source List" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Kolom %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Gegevensbestand voor matrix %1 is niet geopend." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Gegevensbestand voor vector %1 is niet geopend." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Gegevensmatrix: %1\n" " %2\n" " Veld: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 van %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Gegevensbestand voor vector %1 is niet geopend." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Gegevensbestand voor scalair %1 is niet geopend." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Gegevens van scalair: %1 = %4\n" " %2\n" " Veld: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%1 van %2 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "frames" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Zoekpaden plug-ins:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Zoeken naar plug-ins gegevensbronnen." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Plug-in gelezen: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "mislukt voor %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Bestand '%1' bestaat niet." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Kon geen gegevensbron voor '%1'(%2) vinden, maar er is wel een even eerder " "gevonden. Er klopt hier iets niet met Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Gegevensbestand voor string %1 is niet geopend." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Gegevensstring: %1 = %4\n" " %2\n" " Veld: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 van %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Gegevensbestand voor vector %1 is niet geopend." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Gegevens van vector: %1\n" " %2\n" " Veld: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Laatste %1 frames." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Vanaf frame %1 tot einde." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 frames vanaf %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Lees 1 sample per %1 frames." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Elke %1 frames middelen." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 van %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Fout" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Waarschuwing" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Opmerking" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Trace" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Overig" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst-versie %1\n" "\n" "\n" "Kst-log:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Plug-ins gegevensbronnen:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Bewerkbare vector: %1\n" " %2 waarden" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Aangemaakte vector: %1\n" " %2 waarden van %3 tot %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 punten van %1 tot %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "Opgeslagen matrix bevat minder gegevens dan gemeld." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matrix: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Fout in aangemaakte matrix uit Kst-bestand." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Fout bij aanmaken van bewerkbare matrix uit Kst-bestand." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Fout bij aanmaken van gegevensmatrix uit Kst-bestand." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Scalair: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Scalair: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Waarde: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Fout bij aanmaken van scalair uit Kst-bestand." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "String: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Fout bij aanmaken van string uit Kst-bestand." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Provider: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vector: %1\n" " %2 samples\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Fout bij aanmaken van vector uit Kst-bestand." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Fout in aangemaakte vector uit Kst-bestand." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Gegevensbestand voor scalair %1 is niet geopend." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Gegevensscalair: %1 = %4\n" " %2\n" " Veld: %3\n" " Frame: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 frame %3 van %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Een programma voor het tonen van gegevens.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revisie %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Homepage:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "Bugs graag melden met behulp van de assistent in het menu 'Help'
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Auteurs, en bijdragen van (alfabetisch):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Over Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Instellingen Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Algemeen" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Schalen" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Rooster" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Opmaakeigenschappen" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Pijl" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Fout bij aanmaken pijlobject uit Kst-bestand." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Pijl aanmaken" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Eigenschappen" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "ArrowProperties" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Pijl bij &begin" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "&Begin pijlschaal" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Puntgrootte pijl" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "De grootte van de pijlpunt is hieraan evenredig." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "&Einde pijl" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Ei&nde pijlschaal" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "As" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Grof" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normaal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fijn" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Erg fijn" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Doorgetrokken lijn" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Streepjeslijn" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Stippellijn" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Streep-puntlijn" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streep-punt-puntlijn" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Aangepaste streepjes-lijn" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Links verbergen" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Rechts verbergen" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Marges en teksten verbergen" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Bovenkant verbergen" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Onderkant verbergen" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotatie teksten" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotatie :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Basis/offset-modus" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Aan" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Uit" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Cijfers vóór automatische basis/offset-modus:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Indien dit aantal cijfers nodig is voor het tonen van getallen bij " "streepjes, wordt de as weergegeven in de basis/offset-modus." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Offset naar minimum forceren voor de as" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Schaal" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logaritmisch" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Keer de asrichting om, zodat de getallen afnemen, in plaats van toenemen." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "&Omkeren" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Dit is de tijdas" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Dit als tijdas beschouwen." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Beschouwen als:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Type tijdcodering" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "Dit is de tijdas, de codering van de tijd wordt hier geselecteerd." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Tonen als:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Opmaak van tijdweergave" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "Als dit de tijdas is, de tijd op de as met deze opmaak tonen." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Tijdzone:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Tijd/datumopmaak:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Datum: y/M/d - tijd: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Primaire streepjes en lijnen" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "&Streepjes tekenen" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "&Roosterlijnen tekenen" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Primaire s&patiëring:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Dichtheid van primaire streepjes" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Geef de dichtheid op van de primaire streepjes. De afstand tussen primaire " "streepjes wordt automatisch gekozen als een macht van 10, maal 1, 2, of 5. " "Hiermee wordt de de afstand tussen de streepjes gekozen binnen deze " "beperking." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "Lijn&stijl voor rooster:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "Lijn&kleur rooster:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Breedte:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Secundaire streepjes en lijnen" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "&Streepjes tekenen" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Roosterlijnen tekenen" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Aantal secundaire s&treepjes:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "L&ijnstijl:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Lijnkl&eur:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: Bestand niet gevonden. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Dialoog" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "TextLabel" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Selecteer nieuw gegevensbestand:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Onbekend bestandstype" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figureren..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Wijzigen" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Overslaan" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Basis plug-in" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Plugin %1 bewerken" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Nieuwe plugin %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Kan Plugin-object niet aanmaken met deze parameters.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "In- en uitvoer" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Vak" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Fout bij aanmaken vakobject van Kst-bestand." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Vak aanmaken" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-bits" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-bits" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistent bug melden" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Kst-versie:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "OS:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Voor het melden van een bug klik op onderstaande knop.\n" "Hierdoor wordt webpagina http://bugs.kde.org geopend waarin u een formulier " "kunt invullen.\n" "De hierboven getoonde informatie wordt dan gezonden naar deze server." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Assistent starten voor melden van een bug" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Knop" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Fout bij aanmaken van knopobject van Kst-bestand." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Cartesische plot" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "frames" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Onvoldoende geheugen" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "U wilt ongeveer %1 MB aan gegevens inlezen, maar er blijkt maar ongeveer %2 " "MB aan bruikbaar geheugen beschikbaar te zijn. U kunt zoveel gegevens niet " "inlezen." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Samples van gegevens wijzigen" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Vectorselectie" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Het bronbestand voor de in deze lijst geselecteerde vectoren wordt gewijzigd." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Selecteer alle vectoren in de lijst." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "A&lle toevoegen" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Toevoegen" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Alle vectoren in de lijst deselecteren." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Verwijderen" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "All&e verwijderen" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Het bestand kon niet worden ingelezen of bevat geen gegevens." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "Het volgende veld is niet gedefinieerd voor het gewenste bestand:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "De volgende velden zijn niet gedefinieerd voor het gewenste bestand:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Gegevensbestand wijzigen" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Selecteren naar bronbestand" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Alle toevoegen &uit:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Vector- en matrixselectie" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Het bronbestand voor de in deze lijst geselecteerde vectoren wordt gewijzigd." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Selecteer alle vectoren in de lijst." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "A&lle toevoegen" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Toevoegen" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Alle vectoren in de lijst deselecteren." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Verwijderen" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "All&e verwijderen" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Nieuw gegevensbestand" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Bestand:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Geselecteerde vectoren en matrices w&ijzigen" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "Afgeleide objecten &kopiëren (krommen, vergelijkingen, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "Geselecteerde vectoren en matrices k&opiëren" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Onbekend bestandstype" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figureren..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Kleur kromme toekennen uit bestand" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Kleuren toekennen" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Baseer krommekleur op: " #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "&X-vector" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "&Y-vector" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "St&raal" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Middelpunt" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Positie aan gegevens koppelen" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Cirkel" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Fout bij aanmaken cirkelobject uit Kst-bestand." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Cirkel aanmaken" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Grootte/positie" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "einde" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Kolom %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Gebruik: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Gebruik: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Gebruik: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Gebruik: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Gebruik: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Gebruik: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Gebruik: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Gebruik: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Gebruik: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Geen gegevensbestanden opgegeven\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "bestand %1 bestaat niet\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Gebruik: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Gebruik: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Gebruik: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Gebruik: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Gebruik: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Gebruik: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Omhoog in plotvolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Omlaag in plotvolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "&Beschikbare objecten:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Alle deselecteren" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Alle selecteren" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Bewerken" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Omhoog in plotvolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Pijl omhoog" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Omlaag in plotvolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Pijl omlaag" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Getoonde objecten: " #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "buttonGroup" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "DIT, EN ALLES HIERONDER, IS VOOR HET MAKEN VAN SCRIPTS EN MOET VERBORGEN " "ZIJN!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spectrogram" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Spectrogram bewerken" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Nieuw spectrogram" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Inhoud spectrogram" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Gegevensvector:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Venstergrootte:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Afbeeldingsopties" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Kromme" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Kromme bewerken" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Nieuwe kromme" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Inhoud kromme" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "&X-as vector:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "&Y-as vector:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "+X f&outbalk:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "&+Y foutbalk:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "-X foutbalk:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "&-Y foutbalk:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Gebruik +X foutbalk voor -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "G&ebruik +Y foutbalk voor -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "Ne&geren in automatische berekeningen asbereiken" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Naam:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Meervoudig bewerken >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Een bewerken %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Hier uw filter invoeren (jokertekens toegestaan)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Bewerken" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Kromme maken" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Energiespectrum maken" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Spectrogram maken" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Histogram maken" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Filter toepassen" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Afbeelding maken" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Aan plot toevoegen" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Uit plot verwijderen" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Aanpassing (curve fit) toepassen" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Verwijderen" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gegevensbeheer" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filteren op:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Alle kolommen" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Naam" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Type" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Samples" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Eigenschappen" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Hoofdlettergevoelig" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Opruimen" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Fout bij aanmaken gegevensbron uit Kst-bestand." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Tijdinterval" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Detectie wijzigen" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Geen update" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Omhoog in plotvolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Omlaag in plotvolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vector(en) beschikbaar" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vector(en) geselecteerd" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Aanmaken van plots van s&pectra. Stel hieronder FFT-opties in:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Onvoldoende geheugen" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "U wilt ongeveer %1 MB aan gegevens inlezen, maar er blijkt maar ongeveer %2 " "MB aan bruikbaar geheugen beschikbaar te zijn. U kunt zoveel gegevens niet " "inlezen." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Aanmaken van &XY-plots. Stel hieronder vectoreigenschappen X-as in: " #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Aanmaken &uit veld:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Bestaande &gebruiken:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "Het te gebruiken veld voor de X-as in XY-krommen." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Selecteer een gegevensbestand waarmee " "wordt gewerkt. Dit is bijvoorbeeld een bestand met gegeven punten of " "vectoren.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Onbekend bestandstype" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figureren..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "Type bijwerken; gebruik 'Tijdinterval' voor niet-lokale gegevens" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filters" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Nieuw filter..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Indien gewenst, een filter " "selecteren om te gebruiken voor de in te lezen velden:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Plaatsen van krommen" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Alle krommen in één plot" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 elke kromme een nieuwe plot" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "&Cyclisch kiezen:" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " plots" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Cyclisch kiezen uit bes&taande plots" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Alle &krommen in plot" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Plaatsen van plots (Tabs)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Alle in &huidig tabblad" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Alle in nieu&w tabblad" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY en spectra in &afzonderlijke nieuwe tabbladen" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Plotindeling" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Automatisch &indelen" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Aa&ngepast rooster" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Kolommen:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "Bestaande indeling besche&rmen" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Teksten" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Alle teksten in tabblad herschalen" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "As op tabblad delen" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Stijl &kromme" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Alleen l&ijnen" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Alleen &punten" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Lijnen e&n punten" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "As-modus van spectrum" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Lo&g X-as" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "&Log Y-as" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legenda's" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "Aa&n" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Uit" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Verticaal" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Hoger in plotvolgorde (Alt-Pijl omhoog)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Pijl omhoog" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Pijl omlaag" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Selecteren (Alt-S): verplaats geselecteerde velden vanuit de lijst van " "beschikbare gegevens naar de lijst van geselecteerde te plotten gegevens." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Verwijderen (Alt-R): verplaats geselecteerde velden vanuit de lijst van " "beschikbare gegevens naar de lijst van geselecteerde niet te plotten " "gegevens, zodat die niet worden geplot." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Geselecteerde gegevens: Alle velden in deze lijst worden geplot." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Geselecteerde gegevens: Alle velden in deze lijst worden geplot. U kunt " "velden uit deze lijst verwijderen, door ze te slepen naar de lijst van " "beschikbare gegevens, erop te dubbelklikken, of door ze te selecteren en de " "verwijderknop te gebruiken (pictogram met rechterpijl of Alt-R). De volgorde " "van de velden in deze lijst is de volgorde waarin die worden geplot." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Geselecteerde gegevens:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vector(en) geselecteerd" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Zoekfilter" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Zoekfilter: Velden die met dit filter overeenkomen lichten op, en worden " "verplaatst naar de top van de lijst van de beschikbare gegevens. De " "jokertekens '*' en '?' kunnen worden gebruikt." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Voegt het jokerteken '*' toe aan het begin en het einde van het zoekfilter, " "zodat alles dat de tekst in het zoekfilter bevat hiermee overeenkomt." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "Zo&eken" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Veldselectie: Gekozen velden worden geplot." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Beschikbare gegevens: Dit vak bevat alle velden die niet geselecteerd zijn " "voor plotten. U kunt een veld selecteren voor plotten, door het te " "verplaatsen naar de lijst van geselecteerde gegevens, door slepen met de " "muis, door dubbelklikken, of door het te selecteren, en te klikken op de " "selecteerknop (Rechterpijl - sneltoets is Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Beschikbare gegevens: " #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vector(en) beschikbaar" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Versie %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Versie %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Debugdialoog van Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Compileerinformatie" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Email debug-informatie" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Log" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Logniveau: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Fout" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Waarschuwing" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Opmerking" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Trace" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "&Wissen" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Gegevensbronnen" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Ingelezen instantie" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Sl&uiten" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Er is een fout. Klik op dit pictogram voor meer details." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Lettertypen" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Letter" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Journaal plot" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Aangepast" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Minimum lettergrootte (punten): " #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Bij wijziging venstergrootte, worden letters minstens zo groot weergegeven." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Referentie beeldgrootte:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "Bij deze grootte van venster, hebben letters de opgegeven grootte." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Grootte van lettertypen is afhankelijk van venster- of afdrukgrootte. Bij " "deze grootte van venster/afdruk, zijn de genoemde groottes van lettertypen " "accuraat." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Aangepaste referentiegrootte (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Opslaan als standaard" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Op bestaande objecten toepassen" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "De geselecteerde eigenschap omhoog verplaatsen in de voorkeurslijst" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "De geselecteerde eigenschap omlaag verplaatsen in de voorkeurslijst" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "De geselecteerde eigenschap toevoegen aan de lijst van eigenschappen, zodat " "hierin cyclisch kan worden gekozen." #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "De geselecteerde eigenschap verwijderen uit de lijst van eigenschappen" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Lijnkleur" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Puntstijl" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Lijnstijl" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Lijndikte" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Krommen onderscheiden" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Eigenschapselectie en kiesvolgorde" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Omhoog verplaatsen in keuzevolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Pijl omhoog" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Omlaag verplaatsen in selectievolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Pijl omlaag" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Beschikbaar:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Geselecteerd:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opties" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Grootste lijndikte:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Puntdichtheid:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Alle" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Hoog" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Midden" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Laag" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Grootte/positie" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotatie:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Grootte:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Positie:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Vaste beeldverhouding" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Positie aan gegevens koppelen" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Bestand kon niet worden geopend voor schrijven." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Bestand kon niet worden geopend voor lezen." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Bestand is corrupt en kan niet worden gelezen." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Te bewerken objecten selecteren" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filter:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Wissen" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "&Alle selecteren" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Ellips" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Fout bij het aanmaken van ellipsobject uit Kst-bestand." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Ellips aanmaken" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Vergelijking" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Vergelijking bewerken" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Nieuwe vergelijking" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Vergelijking" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "&Vergelijking:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Voer de te berekenen vergelijking hier in. Gebruik 'x' voor de " "onafhankelijke variabele. Vectoren en bewerkingen kunt u selecteren uit de " "lijsten hier boven." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "&X-vector:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpoleren naar vector met hoogste resolutie" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Events volgen" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Events volgen bewerken" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Opnieuw events volgen" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Melding per e-mail" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "&Melden:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expressie" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vectoren:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Bewerkingen:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Scalairen:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expressie:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Beschrijving:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Uitvoeren:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "&Melden:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configureren..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Debuglog Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Waarschuwing" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Fout" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Opmerking" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Loggen als:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exporteren naar grafisch bestand" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Basisnaam:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Bestandsformaat:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Grootte" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Breedte:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Breedte (in pixels) van de afbeelding." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Hoogte:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Hoogte (in pixels) van de afbeelding" #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "S&pecificeren:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Breedte met behoud beeldverhouding" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Hoogte met behoud beeldverhouding" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Breedte en hoogte" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Grootte van vierkant" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Opties opslaan" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Niet automatisch opslaan. In plaats daarvan, één keer opslaan na OK of " "Toepassen." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "&Eén keer opslaan" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Afbeelding regelmatig opslaan" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Bij deze keuze wordt de afbeelding herhaaldelijk na een opgegeven " "tijdinterval opgeslagen. Dit is bijvoorbeeld nuttig voor bewegende " "afbeeldingen op webpagina's." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "&Automatisch opslaan elke" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Tijdinterval automatisch opslaan" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Automatische &extensie" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Insluiten:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Vectoropmaak" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Bitmap-opmaak" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Vectoren exporteren" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Vectorselectie" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Het bronbestand voor de in deze lijst geselecteerde vectoren wordt gewijzigd." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Selecteer alle vectoren in de lijst." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "A&lle toevoegen" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Toevoegen" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Alle vectoren in de lijst deselecteren." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Verwijderen" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "All&e verwijderen" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Locatie op&slaan:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Opvullen" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Zonder penseel" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Opgevuld" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Dicht patroon 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Dicht patroon 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Dicht patroon 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Dicht patroon 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Dicht patroon 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Dicht patroon 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Dicht patroon 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Horizontaal patroon" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Verticaal patroon" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Kruispatroon" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonaal patroon 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonaal patroon 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonaal kruispatroon " #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Kleur:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Stijl:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "&Lineaire gradiënt gebruiken" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "Gradiënt he&rstellen" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Plugin %1 bewerken" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Nieuwe plugin %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Kan geen pluginobject aanmaken met de opgegeven parameters.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Plugin-selectie" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Naam plugin:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Beschrijving:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "in- en uitvoeren" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "Negeren bij automatische berekeningen asbereiken" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Algemeen" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Dynamische bestanden met deze snelheid of langzamer bijwerken." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Minimum tijd tussen bijwerken van dynamische bestanden. Indien er veel " "bewerkingen zijn, kan dit meer tijd kosten." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Periode voor bijwerken (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Transparant slepen" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Met \"raster\" renderen (weergeven). Dit is altijd beter." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Met \"raster\" renderen is sneller op sommige systemen, maar kan erg \"buggy" "\" zijn (afhankelijk van de videodriver). Dit kan helpen, maar kan ook erg " "fout gaan." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "\"Raster\"programma gebruiken op (herstarten Kst nodig)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Plots &antialiassen" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Rooster" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Roo&ster tonen" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Roo&ster magnetisch" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "&Horizontale spatiëring rooster:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "&Verticale spatiëring rooster:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogram" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Histogram bewerken" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Nieuw histogram" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Eigenschappen histogram" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Gegevensvecto&r" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Klassen van&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "De ondergrens van de laagste klasse. Lagere waarden worden niet meegenomen." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "aan:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "De bovengrens van de hoogste klasse. Hogere waarden worden niet meegenomen." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Aantal klasse&n:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Aantal klassen in histogram." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Geef een redelijke standaard op voor boven- en ondergrens, en van het aantal " "klassen." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "A&uto klassen" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Real&-time auto klassen" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Y-as normalisatie" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "" "Op de Y-as van het histogram wordt de fractie weergegeven van de samples in " "de klasse." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fractie in klasse" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "" "Op de Y-as van het histogram wordt de fractie weergegeven van de samples in " "de klasse." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "&Aantal in klasse" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "Normaliseren houdt in dat de fractie in de grootste klasse de waarde 1 heeft." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Grootste klasse = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "Op de Y-as van het histogram wordt het percentage weergegeven van de samples " "in de klasse." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&tage in klasse" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Afbeelding" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Afbeelding bewerken" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Nieuwe afbeelding" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Inhoud afbeelding" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matrix:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Afbeeldingstype" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "Kleurenk&aart" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Con&tourenkaart" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "&Kleuren- en contourenkaart" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Parameters kleurenkaart" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&Hoogste:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Drempel - &laagste:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "In&telligent" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&iel:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "&Real-time auto drempelwaarde" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Parameters contourenkaart" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "K&leur:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Aanta&l kleurniveaus:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "Ge&wicht:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "&Variabel lijngewicht gebruiken" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Tekstdialoog aanmaken" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Dialoog" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Positie aan gegevens koppelen" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Rechts" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Links" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Referentiepunt:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Vet" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " punten" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Familie Lettert&ype:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Kleur" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Teken&grootte:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Cursief" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Opslaan als standaard" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Positie aan gegevens koppelen" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Rechts" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Links" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Naam referentiepunt:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotatie" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Positie" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Naamtekst" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Naamtekst aanmaken" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Eigenschappen" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Grootte/positie" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Teksteigenschappen" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "De syntaxis voor tekst is afgeleid van een subset van LaTeX. " "Ondersteund wordt: \\[greeklettername] en \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{kleurnaam}{gekleurde tekst}, \\textbf{vette tekst}, \\textit{cursieve tekst}, \\t, \\sum, \\sqrt, \\underline{onderstreepte tekst}, " "x^y, x_y. Scalairen, vergelijkingen en vectorelementen " "kunnen worden ingevoegd. Scalair: [V1/Mean]. Vectorelement: [V1" "[4]]. Vergelijking: [=[V1/Mean]^2]. Een [ karakter kan worden " "ingevoegd als \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Teken&grootte:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Familie Lettert&ype:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Cursief" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Vet" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " punten" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Naamteksten" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Standaard letter&grootte plot:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "punten" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Automatisch schalen getalteksten bij as" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Tekst &boven:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Tekst &onder:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "Tekst &links:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Tekst &rechts:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Le&genda tonen" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "Be&werken" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Ondersteunt scalairen & strings (naam in vierkante haakjes) - bv, [INDEX:" "Max (X2)],\n" "ingebedde vergelijkingen - bv, [=[INDEX:Max] / 2]\n" "en LaTeX-tekens - bv, \\theta. Namen en symbolen worden automatisch " "aangevuld." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Opmaak van vak" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Opmaak" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "&Horizontale marge:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "&Verticale marge:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Hori&zontale spatiëring:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Ver&ticale spatiëring:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Lege legenda" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Inhoud:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Omhoog in lijstvolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Omlaag in lijstvolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Titel:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Automatisch op plot gebaseerde inhoud gebruiken" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "&Verticaal tonen" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "&Beschikbare objecten:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Getoonde objecten:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Omhoog in plotvolgorde: Alt+Pijl omhoog" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Pijl omhoog" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Verwijderen: Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Selecteren: Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Omlaag in plotvolgorde: Alt+Pijl omlaag" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Pijl omlaag" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Instellingen lettertekens legenda's" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Teken&grootte:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " punten" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Vet" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Cursief" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "Familie letter&type" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Positie aan gegevens koppelen" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LineEdit" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Fout bij aanmaken LineEdit-object uit Kst-bestand." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Lijn" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Verplaatsen" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Grootte wijzigen" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Fout bij aanmaken lijnobject uit Kst-bestand." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Lijn aanmaken" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Grootte/positie" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script: loopt" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script: gereed" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script: Geeft code %1 terug" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Scriptfout: start niet" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Scriptfout: vastgelopen" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Scriptfout:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "In log schrijven" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Script &herstarten" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Toepassen" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Sl&uiten" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Bericht" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Bericht:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Wissen" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Scriptuitvoer:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuratie" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Ploteigenschappen" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Breedte:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Breedte met behoud beeldverhouding" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Hoogte met behoud beeldverhouding" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Breedte en hoogte" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Grootte vierkant" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Hoogte:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Hoogte (in pixels) van de afbeelding." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Bestandsformaat:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "S&pecificeer:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Breedte (in pixels) van de afbeelding." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Map van lokale log:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "De variabelen $user, $imagefile en $messagefile kunnen in de argumentenlijst " "worden gebruikt." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "&Gebruikersnaam:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Prompt opslaan" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Document is gewijzigd.\n" "Wijzigingen opslaan?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Bestand opslaan" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Kst-sessies (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Bestand openen" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Opschonen niet-bestaande bestanden" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Voor details zie Help>Debugdialoog>Log." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Fout openen document:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Openen..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Een nieuwe sessie openen" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "Op&slaan" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "De huidige sessie opslaan" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Opslaan &als..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "Nieu&we sessie" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "De huidige sessie afsluiten en een nieuwe, lege starten" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Alle &gegevensbronnen opnieuw inlezen" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Alle gegevensbronnen opnieuw inlezen" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "Af&drukken..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Het huidige beeld afdrukken" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "Als afbeelding(en) &exporteren..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Grafieken naar schijf exporteren" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "&Vectoren op schijf opslaan..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Vectoren naar ascii-bestand exporteren" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "&Logitem..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Logitem vastleggen" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Nieuw tabblad" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Nieuw tabblad aanmaken" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Tabblad s&luiten" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Het huidige tabblad sluiten" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Afsluiten" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Programma afsluiten" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vectoren" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Alle vectoren in een rekenblad tonen" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Scalairen" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Alle scalairen in rekenblad tonen" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrices" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Alle matrices in een rekenblad tonen" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "S&trings" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Alle strings in een rekenblad tonen" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Eén scherm &teruggaan" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Eén scherm teruggaan" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "Eén scherm &verder gaan" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Eén scherm vooruit gaan" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Tellen vanaf einde" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Modus instellen, voor tellen vanaf einde voor alle gegevensvectoren" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Lezen tot einde" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Modus instellen, voor lezen tot einde voor alle gegevensvectoren" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Onderbreken" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Aan/uit gegevensbronnen bijwerken" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "&Sample-bereik gegevens wijzigen..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Dialoog tonen voor wijzigen samplebereik gegevens in Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Plot" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Een plot aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Scalair" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vector" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matrix" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Strin&g" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Kromme" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "V&ergelijking" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "&Energiespectrum" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histogram" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "Afbeeld&ing" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spectr&ogram" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Eve&nt Monitor" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Naamtekst" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Een naamtekst aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Vak" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Een vak aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Cirkel" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Een cirkel aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Ellips" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Een ellips aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Lijn" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Een lijn aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Pijl" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Een pijl aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Afbeelding" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Een afbeelding aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Een svg aanmaken voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "Gedeeld as&vak" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Een gedeeld asvak aanmaken voor huidig onderdeel" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "&Aan/uit gekoppeld zoomen" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Aan/uit gekoppeld zoomen voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "&Alle tabbladen koppelen" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Gekoppeld zoomen geldt voor alle tabbladen" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "Gegeven punten &selecteren" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Meest nabije gegeven punt selecteren" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "X-Y &Zoom/Scroll" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Willekeurig zoomen in X- of Y-richting" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Alleen &X-zoom" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Alleen in de X-richting zoomen" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Alleen &Y-zoom" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "&Opmaakmodus" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Aan/uit opmaakmodus voor huidig beeld" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "Gegevens&beheer" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Venster van gegevensbeheer Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "&Gegevensassistent" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Gegevensassistent Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Gegevens&bestand wijzigen" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Dialoog gegevensbestand Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Kromme&kleur per bestand toekennen" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Dialoog kleurenkiezer Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Krommen &onderscheiden" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Dialoog krommen onderscheiden Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "Kst &configureren" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Dialoog configureren Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Thema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Dialoog thema Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "&Debugdialoog" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Dialoog debuggen Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "&Assistent bug melden" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Assistent voor bug melden Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Over" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Informatievak Kst tonen" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Bestand" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "&Recente Sessies" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Recente gegevens&bestanden" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "Be&werken" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "Beel&d" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Be&reik" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Aanmaken" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Standaard p&lugin" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "&Fit plugin" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "F&ilter plugin " #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Annotatie" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Modus" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Interactiemodus" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Hulpmiddelen" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "&Instellingen" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Help" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Bestand" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Bewerken" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Hulpmiddelen" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Gegevensbereik" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Modus" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Plotopmaak" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Gevorderde opmaak" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Gereed" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Merkpunten" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Doorgetrokken lijn" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Streepjeslijn" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Stippellijn" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Streep-puntlijn" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streep-punt-puntlijn" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Aangepaste streepjeslijn" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Een (nagenoeg) zelfde merkpunt in de plot bestaat reeds." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "De door u ingevoerde tekst is geen geldig getal." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Merkpunten op as" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Nieuw merkpunt:" #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Toevoegen" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "H&uidige merkpunten" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Wissen" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Verwijderen" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Voorkomen merkpunten" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "L&ijnstijl:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "&Lijnkleur:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Lijn&dikte:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Automatische merkpunten" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Kromme gebruiken als &bron merkpunten:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Merkpunten aanmaken op:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "St&ijgende rand" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "&Dalende rand" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "&Beide" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "&Vector gebruiken als bron merkpunten:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matrix" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Matrix bewerken" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Nieuwe matrix" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Schalen en translatie" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "Stap&grootte X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "Minimum &X:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "Minimum &Y:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Sta&pgrootte Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Parameters gradiënt" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Verhoog/verlaag Z-waarden langs:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "X-as" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Y-as" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z op minimum:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "X stappen:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Y stappen:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z op maximum:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Gegevensbereik" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "of" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "S&tartframe Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "X &aantal frames:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "&Tellen vanaf einde" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Lezen tot einde" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Y aa&ntal frames:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "L&ezen tot einde" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Tellen vanaf ein&de" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "&Startframe X" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " frames" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Boxcar &filter eerst" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "&1 sample lezen per" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Bron" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Lezen uit gegevensbron" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Gradiënt aanmaken" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Parameters gegevensbron" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "&Veld of kolom:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Bestandsnaam:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "&Configureren..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB beschikbaar" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Teken&grootte:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Familie Lettert&ype:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Standaard lettertype voor plots gebruiken" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " punten" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Afbeelding" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: afbeelding openen" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Fout bij aanmaken afbeeldingobject uit Kst-bestand." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Afbeelding aanmaken" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Jaren]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dagen]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Uren]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minuten]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Seconden]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Plot" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom maximum" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Spike ongevoelig zoom maximum" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Vorige zoom" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Gekoppeld zoom" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom X gekoppeld" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom Y gekoppeld" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom rond Y gemiddeld" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "X-zoom maximum" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "X-zoom auto rand" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Spike ongevoelig X-zoom" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "X-zoom rechts" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "X-zoom links" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "X-zoom uit" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "X-zoom In" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "X-as naar Y-as normaliseren" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Log X-as" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Y-zoom lokaal maximum" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Y-zoom maximum" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Y-zoom auto rand" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Spike ongevoelig Y-zoom" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Y-zoom opwaarts" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Y-zoom neerwaarts" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Y-zoom uit" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Y-zoom in" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Y-as naar X-as normaliseren" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Log Y-as" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Kleurschaal afbeelding aanpassen" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Plot maximaliseren" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Plots op X-as delen" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Plots op Y-as delen" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Vak gedeelde as verbreken" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Coördinaten kopiëren" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "X-coördinaat kopiëren" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Y-coördinaat kopiëren" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Kopiëren" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoomen" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filteren" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Kromme bewerken" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Aanpassen" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Gedeelde instellingen asvak" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Info gekopieerd naar klembord:" #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "X-coördinaat gekopieerd naar klembord" #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Y-coördinaat gekopieerd naar klembord:" #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Inhoud:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Lege plot" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Fout bij het aanmaken van plotobject uit Kst-bestand." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Plot aanmaken" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Plot aanmaken voor kromme" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Expressie zoom vast" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Expressie zoom X-bereik" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom maximum" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Spike ongevoelig zoom max" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom om gemiddeld" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom om gemiddeld X" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom om gemiddeld Y" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom X maximum" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom X auto rand" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom X geen spike" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Scroll X rechts" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Scroll X links" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Zoom X uit" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Zoom X in" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom X naar Y normaliseren" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom Y lokaal maximum" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom Y maximum" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom Y auto rand" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom Y geen spike" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom Y opwaarts" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom Y neerwaarts" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Zoom Y uit" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Zoom Y in" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom Y naar X normaliseren" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X log" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y log" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Plot bewerken" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Inhoud" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Lettertype boven" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Lettertype onder" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Lettertype links" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Lettertype rechts" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Lettertype as" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Naamteksten" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Bereik/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "X-as" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Y-as" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Merkpunten X-as" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Merkpunten Y-as" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Lettertype* boven" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Lettertype* onder" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Lettertype* links" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Lettertype* rechts" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Lettertype* as" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Plotweergave" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Referentiemodus" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Energiespectrum " #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Energiespectrum bewerken" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Nieuw energiespectrum" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Inhoud energiespectrum" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Gegevensvecto&r:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Naam" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Waarde" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Bereik" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "X-zoom modus" #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Auto met &rand" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "S&pike-ongevoelig auto" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "Rondom g&emiddelde," #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "berei&k: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "Va&st, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "va&n: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "t&ot: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "MOET VERBORGEN ZIJN" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Y-zoom modus" #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "A&uto" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Auto met &rand" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "&Spike-ongevoelig auto" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Rondom &gemiddelde," #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "be&reik: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "Va&st, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "va&n: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&tot: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Scalair" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Scalair bewerken" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Nieuwe scalair" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Lezen uit gegevens&bron" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Een nieuwe vector aanmaken met de hier gegeven eigenschappen als " "onafhankelijke variabele." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Lezen uit gegevens&vector" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Aanmaken" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Lezen uit gegevensbron" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Bestandsnaam:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Veld:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigureren..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "F&rame:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "of" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Met deze keuze worden gegevens gelezen vanaf het einde van het bestand. Dit " "is nuttig wanneer achter aan het bestand wordt wordt toegevoegd door een " "andere applicatie, bij een doorlopende weergave." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&laatste frame" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Aanmaken" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "W&aarde: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "De maximum waarde van de onafhankelijke variabele." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Naam" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Type" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Samples" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Eigenschappen" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Vak gedeelde as" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Vak gedeelde as verbreken" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "Fout bij aanmaken sharedaxisbox-object uit Kst-bestand." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Vak gedeelde as aanmaken" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "String" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "String bewerken" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Nieuwe string" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Lezen uit gegevens&bron" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&Bestandsnaam:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "&Veld:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigureren..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Aanmaken" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Waarde: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Streek" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Zonder pen" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Doorgetrokken lijn" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Streepjeslijn" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Stippellijn" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Streep-puntlijn" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streep-punt-puntlijn" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Aangepaste streepjeslijn" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Zonder penseel" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Opgevuld patroon" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Dicht patroon 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Dicht patroon 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Dicht patroon 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Dicht patroon 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Dicht patroon 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Dicht patroon 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Dicht patroon 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Horizontaal patroon" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Verticaal patroon" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Kruispatroon" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonaal patroon 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonaal patroon 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonaal kruispatroon" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Verstekverbinding" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Gekante verbinding" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Ronde verbinding" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "SVG verstekverbinding" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Platte kap" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Vierkante kap" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Ronde kap" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Stijl:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Breedte:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Penseel&kleur:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "&Penseelstijl:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "&Verbindingstijl:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Ka&pstijl:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "Svg" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: SVG-afbeelding openen" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Fout bij aanmaken svg-object uit Kst-bestand." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Svg aanmaken" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Beeld &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Tabblad hernoemen" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Een nieuwe naam invoeren voor tabblad:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "Tabblad &toevoegen" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "Tabblad he&rnoemen" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Tabblad &sluiten" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "Beeld be&werken" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Opmaak opschonen" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Aangepast" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Thema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Opvullen" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Streek" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Lettertypen" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Teken&grootte:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Familie lettert&ype:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Cursief" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Vet" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " punten" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Opslaan als standaard" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Toepassen op bestaande objecten" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vector" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Tijdinterval" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Detectie wijzigen" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Geen update" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Vector bewerken" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Nieuwe vector" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Aanmaken" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Aantal samples:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Het aantal samples van de nieuwe onafhankelijke variabele." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&Van:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "De minimum waarde van de onafhankelijke variabele." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&tot::" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "De maximum waarde van de onafhankelijke variabele." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Lezen uit &gegevensbestand" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Bestandsnaam:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "V&eld of kolom:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigureren..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "Type van update. Gebruik 'Tijdinterval' voor niet-lokale gegevens." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Bewerken" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Opmaak beschermen" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Aangepast" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: kolomopmaak" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Opmaak in kolommen in volgorde van aanmaak.\n" "Selecteer aantal kolommen:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Opmaak opschonen" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menu Beeld" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Beeld bewerken" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Opvullen" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Bewerken" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Verwijderen" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Hoger" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Lager" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Opmaak beschermen" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Kolommen" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "&Positie aan gegevens koppelen" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Kolomopmaak" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Opmaak in kolommen in volgorde van aanmaak.\n" "Selecteer aantal kolommen:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menu %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Opmaak opschonen" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Verplaatsen" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Grootte wijzigen" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Schalen" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Roteren" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Opmaak aanmaken" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Dit aan opmaak toevoegen" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Verplaatsen" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Grootte wijzigen" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Verwijderen" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Hoger" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Lager" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Schalen" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Roteren" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Beeldobject bewerken" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Naam:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Meervoudig bewerken >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Uiterlijk" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Grootte/positie" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Eén bewerken" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Beeld matrix" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Beeld Stringwaarden" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Beeld scalaire waarden" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Primitief beeld" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Update" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Selecteer af te beelden vectoren" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Beeld geselecteerde vector(en)" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Geselecteerde vector(en) uit beeld verwijderen" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Verwijderen" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Significante cijfers" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Als int tonen" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (standaard)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Beeld vectorwaarden" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Vectorlijst tonen" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Vectorlijst verbergen" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Beeld herstellen" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Sluiten" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Er is een fout in algoritme %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Plugin: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Fout: kan geen gegevensobject aanmaken uit plugin." #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Fout: kan geen plugin vinden voor gegevensobject" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Fout bij aanmaken pluginobject uit Kst-bestand." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Onvoldoende geheugen aanwezig voor spectrogram. " #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spectrogram: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Amplitude spectrumdichtheid" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Energie spectrumdichtheid" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Amplitude spectrum" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Energie spectrum" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frequentie" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Tijd" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spectrogram: %1\n" " FFT-lengte: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Gemiddeld; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodiseren; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Gemiddelde aftrekken:" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Fout bij aanmaken van spectrogram uit Kst-bestand." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Fout bij het aanmaken van spectrogram uit Kst-bestand. Kan vector niet " "vinden." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Kromme" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Kromme: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ fout: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- fout: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ fout: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- fout: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Lijnen: dikte %1 en stijl %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punten: stijl %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Balken" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Fout bij aanmaken kromme uit Kst-bestand." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "Fout bij aanmaken kromme uit Kst-bestand. Kan xVector niet vinden." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "Fout bij aanmaken kromme uit Kst-bestand. Kan yVector niet vinden." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Zoeken naar plugins voor gegevensobjecten." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- dit is mogelijk een fout. Graag een email naar kst@kde." "org met details." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "Vergelijking bevat onbekend object [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Kromme vergelijking" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "Bij opnieuw lezen vergelijking [%1] de vectoren niet gevonden." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Bij opslaan van vergelijking [%1] de vectoren niet gevonden. Er kunnen " "problemen zijn met het resulterende Kst-bestand." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Vergelijking [%1] bevat referenties naar niet-bestaande objecten." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Kan vergelijking [%1] niet lezen. Fouten volgen." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Leesfout: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Vergelijking: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Fout bij het aanmaken van vergelijking uit Kst-bestand." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Fout bij het aanmaken van vergelijking uit Kst-bestand. Kan xVector niet " "vinden." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "event" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Event: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Fout bij aanmaken van EventMonitorEntry uit Kst-bestand." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Getal" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Procent" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fractie" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Genormaliseerde frequentie" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogram van %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogram: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Auto-klassen" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 klassen van %2 tot %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Fout bij aanmaken histogram uit Kst-bestand." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Fout bij het aanmaken van histogram uit Kst-bestand. Kan vector niet vinden." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Afbeelding van %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Afbeelding: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Fout bij het aanmaken van afbeelding uit Kst-bestand" #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Fout bij het aanmaken van afbeelding uit Kst-bestand. Kan matrix niet vinden." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Juliaans jaar" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Standaard C-tijd" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Juliaanse datum" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "MJD" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Gereduceerde Juliaanse datum" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "International Atomic Time (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Excel time (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Geformatteerde string" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "PSD-kromme" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Een PSD proberen te maken waarvoor het hele geheugen nodig was." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Spectrumdichtheid" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Amplitudespectrum" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Energiespectrum" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frequentie" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Spectrum: %1\n" " FFT-lengte: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Gemiddeld; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodiseren:" #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Gemiddelde aftrekken;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "in PSDCalculator::calculatePowerSpectrum: ontving uitvoer-array met een " "verkeerde lengte." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Fout bij het aanmaken van PSD uit Kst-bestand" #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Fout bij het aanmaken van PSD uit Kst-bestand. Kan vector niet vinden." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "%1 Activiteitniveau" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Activiteitniveau" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Activiteitniveau: %1\n" " Sample-tijd: %2 (s)\n" " Vensterbreedte: %3 (s)\n" " Ruisdrempel: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Fout: invoervector te kort." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Fout: het venster moet breder zijn." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Activiteitniveau" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Berekent activiteitniveau van een signaal als product van de standaard " "deviatie en het aantal omkeringen onder een erover glijdend venster." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Sample-tijd (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Window-breedte (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Ruisdrempel" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Bin-plug-in-object" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Fout: invoervector ongeldige grootte" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Fout: geen bins" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Klasse" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Verdeelt de gegevens over de gegeven klassen. Elke klasse bevat het " "gemiddelde van de gegevens erin." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Klassebreedte" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Chop Plugin Object" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Fout: invoervector ongeldige grootte" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Hakken" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Een gegeven gegevensverzameling wordt verdeeld in even, oneven, verschillen " "en index verzamelingen." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Convolve Plugin Object" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fout: invoervector - ongeldige grootte" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fout: ongeldige invoerlengte berekend" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convolutie" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Genereert de convolutie van de ene vector met een andere." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Invoervector één" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Invoervector twee" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Deconvolve Plugin Object" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fout: invoervector - ongeldige grootte" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fout: ongeldige invoerlengte berekend" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Deconvolutie" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Genereert de deconvolutie van de ene vector met een andere." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Invoervector één" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Invoervector twee" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Auto Correlation Plugin Object" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Fout: invoervector ongeldige grootte" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fout: ongeldige invoerlengte berekend" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Autcorrelatie" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Genereert de autocorrelatie van een vector." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Kruiscorrelatie" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fout: invoervector - ongeldige grootte" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fout: ongeldige invoerlengte berekend" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Kruiscorrelatie" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Genereert de kruiscorrelatie van de ene vector met een andere." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Invoervector één" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Invoervector twee" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Cross Spectrum Plugin Object" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Cross Spectrum DataObject Plugin" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Genereert het kruisenergiespectrum van de ene vector met een andere." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Invoervector één" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Invoervector twee" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "FFT-lengte = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Samplesnelheid" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Effective Bandwidth Plugin Object" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Fout: invoervector X ongeldige grootte" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Fout: invoervector X en invoervector Y hebben niet dezelfde lengte" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Fout: ongeldige berekende indices" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Effective Bandwidth" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Berekent de effectieve bandbreedte van een amplitudespectrum." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Min. witte ruis freq." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "SamplingFrequency (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Algemeen Filter Plugin Object" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Fout: nummering invoertekenreeks is leeg" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Fout: noemer van invoertekenreeks is leeg" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Algemeen filter" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Genereert een discreet filter vanuit een tijdscontinue definitie." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Sample interval (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Teller (toenemende volgorde)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Noemer (toenemende volgorde)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Interpolation Akima Plugin Object" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Interpolatie Akima Spline" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "" "Genereert een niet afgeronde Akima interpolatie voor een gegevensverzameling." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Interpolation Akima Periodic Plugin Object" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Interpolatie Akima Periodic Spline" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Genereert een niet afgeronde periodieke Akima interpolatie voor een " "gegevensverzameling." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Interpolation Cubic Spline Plugin Object" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Interpolatie Cubic Spline Spline" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Genereert een spline interpolatie voor een gegevensverzameling." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Interpolation Cubic Spline Periodic Plugin Object" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Interpolatie Cubic Spline Periodic Spline" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "" "Genereert een derdegraads spline interpolatie voor een gegevensverzameling." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Interpolation Linear Plugin Object" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Interpolatie Linear Spline" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Genereert een lineaire interpolatie voor een gegevensverzameling." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Interpolation Polynomial Plugin Object" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Interpolatie Polynomial Spline" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "" "Genereert een interpolatie naar een veelterm voor een gegevensverzameling." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Invoervector X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Line Fit Plugin Object" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Fout: invoervector Y ongeldige lengte" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Fout: invoervector X ongeldige lengte" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Lijnaanpassing" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "" "Genereert een beste aanpassing aan een lijn voor een gegevensverzameling." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Lock-In DataObject Plugin" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fout: invoervector - ongeldige grootte" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Lock-In" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" "Lock-in versterkt de invoer met behulp van een draaggolf als referentie" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Referentievector" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Noise Addition Plugin Object" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Fout: invoervector ongeldige grootte" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Ruis toevoegen" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Voegt Gaussische ruis toe aan een gegevensverzameling, met een opgegeven " "standaard deviatie." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Periodogram Plugin Object" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fout: lengtes van invoervector komen niet overeen" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodogram" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Bepaalt de outputVectorPeriodogram van een inputVectorData set " "(gegevensverzameling). De inputVectorData hoeft niet gesampled te zijn met " "gelijke intervallen van inputVectorTime." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Invoer vectortijd" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Input gegeven vector" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Oversampling factor" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Gemiddelde Nyquist frequency factor" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Fase-plug-in-object" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Fout: invoerscalarfase moet groter dan nul zijn." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Fout: lengtes van invoervector komen niet overeen." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Past fase gegevensverzameling aan, aan opgegeven periode en nulfase van " "outputVectorPhase." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Invoer vectortijd" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Invoer vectorgegevens" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Periode" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Nulfase" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Shift Plugin Object" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Shift: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Shift" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Verschuift (en kort in) een vector." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Shiftwaarde (# punten, negatief toegestaan)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "%1 Statistiek" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Fout: invoervector ongeldige grootte" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statistiek" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Bepaalt statistieken uit een gegeven inputVector verzameling." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Invoervector" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "SyncBin Plugin Object" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Fout: invoervector X ongeldige grootte" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fout: lengtes van invoervector komen niet overeen" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Fout: bins moet minstens 2 zijn" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "SyncBin" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Synchroon cotoevoegen vector Y in inputScalarBins gedefinieerd door vector X " "Zoals een 1D afbeelding." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Invoervector X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Invoervector Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Aantal klassen" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X min" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X max" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "%1 Band Pass" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Gefilterd %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Banddoorlaatfilter" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtert een vector met een nulfase banddoorlaatfilter met een Butterworth " "amplitude resultaat." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Invoervector - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Filtervolgorde:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Centrale frequentie / samplesnelheid:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Bandbreedte:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "%1 Band Stop" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Gefilterd %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Bandstopfilter" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtert een vector met een nulfase bandstopfilter met een Butterworth " "amplitude resultaat." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Invoervector:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Filtervolgorde:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Centrale frequentie / samplesnelheid:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Bandbreedte:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "%1 High Pass" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Gefilterd %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Hoogdoorlaatfilter" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtert een vector met een nulfase hoogdoorlaatfilter met een Butterworth " "amplitude resultaat." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Invoervector:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Filtervolgorde:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Afkapfrequentie / samplesnelheid:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "%1 Low Pass" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Gefilterd %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Laagdoorlaatfilter" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtert een vector met een nulfase laagdoorlaatfilter met een Butterworth " "amplitude resultaat." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Invoervector:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Filtervolgorde:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Afkapfrequentie / samplesnelheid:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "%1 Cumulative Average" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Cumulative Average" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Cumulatief gemiddelde: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Cumulatief gemiddelde" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Berekent het cumulatief gemiddelde van de invoervector." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "%1 Integraal" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integraal" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integraal: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Cumulatieve som" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Berekent de cumulatieve som (integraal) van de invoervector." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Stap (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 Despiked" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Pieken verwijderen" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Ontspike filter: %1\n" " Spatiëring: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Ontspiked %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Despike Filter" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Zoekt en verwijdert pieken met een verschil van 3 punten." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Invoervector:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Spatiëring:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "%1 Derivative" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Afgeleide" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Afgeleide: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Fout: invoerscalarstap mag niet nul zijn." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Differentiëren met vaste staplengte." #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Berekent de discrete afgeleide van een invoervector" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Stap (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "%1 Unwind" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Unwind" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Unwind filter: %1\n" " %2 - %3\n" " Stap: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Invoer: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Unwind %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Unwind Filter" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Ontwarren van gegevens (?)" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Invoervector:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maximum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Max stap (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "%1 Unweighted Exponential" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentiële aanpassing aan %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Restwaarden exponentiële aanpassing" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponential Fit" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Genereert een exponentiële aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "%1 Weighted Exponential" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentiële aanpassing aan %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Restwaarden exponentiële aanpassing" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Exponential Weighted Fit" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "" "Genereert een gewogen exponentiële aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichten:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "%1 Unweighted Gaussian" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussische (normale verdeling) aanpassing aan %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Restwaarden Gaussische aanpassing" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaussian Fit" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "" "Genereert een Gaussische (normale verdeling) aanpassing voor een " "gegevensverzameling." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "%1 Weighted Gaussian" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussische (normale verdeling) aanpassing aan %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Restwaarden gaussische (normale verdeling) aanpassing" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Gaussian Weighted Fit" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "" "Genereert een gewogen Gaussische (normale verdeling) aanpassing voor een " "gegevensverzameling." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichten:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "%1 Unweighted Gradient (helling)" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "" "Gradient Fit to %1 (aanpassing aan rechte lijn door de oorsprong, dus alleen " "de helling)." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Restwaarden gradiënt aanpassing" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Ondergrens gradiënt aanpassing" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Bovengrens gradiënt aanpassing" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr " Gradient Fit (aanpassing aan rechte door de oorsprong)" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "" "Genereert een gradiënt aanpassing voor een gegevensverzameling (aan rechte " "lijn door oorsprong)." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "%1 Weighted Gradient" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Gradiënt aanpassing aan %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Restwaarden gradiënt aanpassing" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Ondergrens gradiënt aanpassing" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Bovengrens gradiënt aanpassing" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Gradient Weighted Fit" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "" "Genereert een gewogen gradiënt aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichten:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Fit Knee Frequency Plugin" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Fout: grootten van invoervector komen niet overeen" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Fout: invoervector X ongeldig" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Fout: invoerfrequenties zijn ongeldig\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Fout: invoergegevens zijn ongeldig.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Knee Frequency Fit" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "" "Genereert een \"Knee\" frequentie aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Invoervector - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Invoervector - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Invoerscalar - max. 1/f^a freq" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Invoerscalar - min. witte ruis freq" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Invoerscalar - witte ruis C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "%1 Ongewogen lineair" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Lineaire aanpassing aan %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Restwaarden lineaire aanpassing" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Ondergrens lineaire aanpassing" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Bovengrens lineaire aanpassing" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Lineaire aanpassing" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Genereert een linaire aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "%1 Gewogen lineair" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Lineaire aanpassing aan %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Restwaarden lineaire aanpassing" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Ondergrens lineaire aanpassing" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Bovengrens lineaire aanpassing" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Lineaire gewogen aanpassing" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "" "Genereert een gewogen lineaire aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Invoervector - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Invoervector - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Invoervector - gewichten" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "%1 Lorentzian" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentz aanpassing aan %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Restwaarden Lorentz aanpassing" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Lorentz aanpassing aan %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Genereert een Lorentz aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "%1 Weighted Lorentzian" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentz aanpassing aan %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Restwaarden Lorentz aanpassing" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Lorentz aanpassing aan %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Genereert een gewogen Lorentz aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Invoervector - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Invoervector - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Invoervector - Gewichten" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "%1 Polynomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Veelterm aanpassing aan %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Restwaarden veelterm aanpassing" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Veelterm aanpassing" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Genereert een veelterm aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Volgorde:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "%1 Weighted Polynomial" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Veelterm aanpassing aan %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Restwaarden veelterm aanpassing" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Gewogen veelterm aanpassing" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "" "Genereert een gewogen veelterm aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Invoervector - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Invoervector - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Invoervector - Gewichten" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Invoerscalair - volgorde" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "%1 Sinusoid" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïde aanpassing aan %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Restwaarden sinusoïde aanpassing" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr " Sinusoïde aanpassing" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Genereert een sinusoïde aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmonischen:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Periode:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "%1 Weighted Sinusoid" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïde aanpassing aan %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Restwaarden sinusoïde aanpassing" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Gewogen sinusoïde aanpassing" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "" "Genereert een gewogen sinusoïde aanpassing voor een gegevensverzameling." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Invoervector - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Invoervector - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Invoervector - Gewichten" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Invoerscalair - Harmonischen" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Invoerscalair - Periode" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Sample invoervector" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Nieuwe &vector invoegen" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Nieuwe &scalair invoegen" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Bewerken" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Nieuwe &scalair invoegen" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Nieuwe &string invoegen" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Bewerken" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "&Kleurenpalet:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Uiterlijk" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "Ge&wicht:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Punttype" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Bij de keuze \"Punten tonen\", wordt voor elk gegeven punt het geselecteerde " "punttype getekend." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Lijntype" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Bij de keuze \"Lijnen tonen\". wordt de geselecteerde lijnstijl gebruikt." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "Kies dit zodat tussen gegeven punten lijnen worden getekend." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Lijnen" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Kies dit zodat de geselecteerde punten worden getekend voor elk gegeven punt." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "P&unten" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Kop" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "&Balkgrafiek" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Lijndikte" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "Bij de keuze \"Lijnen tonen\", de geselecteerde lijndikte." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Grootte:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "Punt&dichtheid:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Alle" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Hoog" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Middel" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Laag" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Plaatsing" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Lettertypen schalen" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "In &nieuwe plot plaatsen" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "In nieu&w tabblad plaatsen" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "De naam van het voor deze vector te lezen gegevensbestand." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "In bestaand&e plot plaatsen" #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "In geen enkele plot pl&aatsen" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Automatis&che opmaak" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "Aa&ngepast rooster" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Kolo&mmen" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "Bestaande opmaak &beschermen" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Een te gebruiken kromme selecteren." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "frames" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Gegevensbereik" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Door deze keuze wordt het gemiddelde berekend van de overgeslagen frames. " "Dit levert een eenvoudig laagfrequent filter." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Boxcar &filter eerst" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Spaart geheugen door zuinig gegevens te samplen" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Door deze keus worden frames overgeslagen, in plaats van alle gegevens te " "lezen. Te gebruiken voor het inlezen van erg grote bestanden, met slechts " "langzaam veranderende gegevens." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "&1 sample lezen per:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "" "Door deze keus worden alle gegevens gelezen tot aan het einde van het " "bestand." #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Lezen tot &einde" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "of" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Door deze keus worden gegevens gelezen vanaf het einde van het bestand. Te " "gebruiken voor het doorlopend tonen wanneer het bestand achteraan wordt " "toegevoegd door een andere applicatie." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "&Tellen vanaf het einde" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Aantal frames dat moeten worden overgeslagen, indien \"1 sample lezen per\" " "is gekozen." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " frame(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Begin:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Be&reik:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Een getal invoeren (te beginnen met 0 als eerste waarde), of de opmaak " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] voor data." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "De index van het eerste gelezen gegeven. In ASCII-bestanden is dit het " "rijnummer van de gegevens. In bestanden op basis van frames is dit het " "eerste frame." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "De hoeveelheid in de vector in te lezen gegevens. In ASCII-bestanden is dit " "het aantal rijnummers met gegevens. In bestanden op basis van frames kunnen " "er meerdere samples zijn in een frame. Gegevens worden ingevoerd in de " "opmaak [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Bestand niet gevonden.\n" "Verifieer op juiste bestandsnaam." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "FFT-opties" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Standaard" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "cosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussisch (aangepaste Sigma)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Selecteer in de keuzelijst de bronvector voor de foutbalken voor de y-as van " "de kromme. Indien wordt gekozen, worden deze foutbalken niet " "getekend. Maak nieuwe vectoren aan in het tabblad voor \"Vectoren\"." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&seren" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ctie:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "&Gemiddelde aftrekken" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "FFT-&lengte: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Bepaalt de lengte van de FFT's bij het aanmaken van het energiespectrum. " "2^10 = 1024, enz. Bij een grotere waarde hoort meer ruis en een hogere " "resolutie." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Gemi&ddelde met interleave" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Over &gaten interpoleren" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Sa&mplesnelheid:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "De samplesnelheid waarmee de metingen zijn gedaan, voor de juiste " "normalisatie." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Nieuwe specificaties voor samplen van gegevens toepassen op geselecteerde " "vectoren." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Vectoreenheden:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "De eenheden van de gegevensvector - voor automatische naamteksten." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Eenheden snelheid:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "De eenheden voor de samplesnelheid. Gebruikt voor automatische teksten." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Ui&tvoer:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Spectrale dichtheid amplitude (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Spectrale dichtheid energie (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Amplitudespectrum (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Energiespectrum (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Bestand openen" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Alle bestanden (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Map voor logfile" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Bestand opslaan" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "De syntaxis voor tekst is afgeleid van een subset van LaTeX. " "Ondersteund wordt: \\[greeklettername] en \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{kleurnaam}{gekleurde tekst}, \\textbf{vette tekst}, \\textit{cursieve tekst}, \\t, \\sum, \\sqrt, \\underline{onderstreepte tekst}, " "x^y, x_y. Scalairen, vergelijkingen en vectorelementen " "kunnen worden ingevoegd. Scalair: [V1/Mean]. Vectorelement: [V1" "[4]]. Vergelijking: [=[V1/Mean]^2]. Een [ karakter kan worden " "ingevoegd als \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Tekst. Een subset van LaTeX wordt ondersteund. Klik op 'Help' voor hulp." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Scalars & " "equations
Scalairen en scalaire vergelijkingen kunnen live " "worden getoond. Wanneer een scalair wijzigt, wordt de wijziging direct " "getoond. Namen van scalairen worden automatisch aangevuld. Het formaat is:

Scalar: [scalairnaam]" ", e.g. [GYRO1:Gemiddelde(X4)]

Vectorelement:[vectornaam[index]]" ", e.g., [GYRO1 (V2)[4]]

Vergelijking: [=equation], e.g. " "[=[GYRO1:Gemiddelde(X4)]/[GYRO1:Sigma " "(X4)]]

Ondersteunde subset van LaTeX
Teksten in kst " "ondersteunen een afgeleide subset van LaTeX. Bijvoorbeeld, om de " "vergelijking te tonen van een cirkeloppervlak, kunt u A=2\\pir^2 " "schrijven. Anders dan in LaTeX, is het niet nodig om '$' te gebruiken voor " "dewiskunde modus. Ook anders dan in LaTeX, worden variabelen niet " "automatisch cursief weergegeven. Indien gewenst, moet dit expliciet worden " "aangegeven met \\textit{}. Ondersteund worden :

Griekse letters: \\name or \\Naam. e." "g.: \\alpha

Andere tekens: \\approx,\\cdot,\\ge,\\geq,\\inf,\\int," "\\le,\\leq,\\ne," "\\partial,\\prod,\\pm," "\\sum,\\sqrt

Effecten: \\textcolor{kleurnaam}{kleurtekst}, \\textbf{vette tekst}," "\\textit{cursieve tekst}" ",\\underline{onderstreepte tekst},\\overline{streep " "boven tekst}.

Andere:x^y,x_y, \\t,\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Ondersteunt tekens van LaTeX, live strings & scalairen, en ingebedde " "vergelijkingen." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Naamtekst:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Help" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "De syntaxis voor tekst is afgeleid van een subset van LaTeX. " "Ondersteund wordt: \\[greeklettername] en \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{kleurnaam}{gekleurde tekst}, \\textbf{vette tekst}, \\textit{cursieve tekst}, \\t, \\sum, \\sqrt, \\underline{onderstreepte tekst}, " "x^y, x_y. Scalairen, vergelijkingen en vectorelementen " "kunnen worden ingevoegd. Scalair: [V1/Mean]. Vectorelement: [V1" "[4]]. Vergelijking: [=[V1/Mean]^2]. Een [ karakter kan worden " "ingevoegd als \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "Naamtekst. Een subset van LaTeX wordt ondersteund. Zie \"Wat is dit\"." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Selecteer een te gebruiken vector. Als u een nieuwe vector wilt aanmaken, " "klik op het pictogram rechts." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Een nieuwe vector aanmaken." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Opent een vectordialoog voor het aanmaken van een nieuwe vector, die daarna " "de geselecteerde vector wordt." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Geselecteerde vector bewerken." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Opent een vectordialoog voor het bewerken van de geselecteerde vector." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Dialoog" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Sluiten" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Dialoog" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Zoeken:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Selecteer een te gebruiken scalair. Als u een nieuwe scalair wilt aanmaken, " "klik op het pictogram rechts." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Een nieuwe scalair aanmaken." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Geselecteerde scalair bewerken." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Selecteer een te gebruiken string. Als u een nieuwe string wilt aanmaken, " "klik op het pictogram rechts." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Een nieuwe string aanmaken." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Geselecteerde string bewerken." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Selecteer een te gebruiken vector. Als u een nieuwe vector wilt aanmaken, " "klik op het pictogram rechts." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Een nieuwe vector aanmaken" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Opent een vectordialoog om een nieuwe vector aan te maken, die de " "geselecteerde vector zal worden." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Geselecteerde vector bewerken." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Opent een vectordialoog voor het bewerken van de geselecteerde vector." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Kst Widgets" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Cumulatief spectraal verval" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Cumulatief spectraal verval bewerken" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Nieuw cumulatief spectraal verval" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "CSD: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Fout bij aanmaken CSD uit Kst-bestand." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "Fout bij aanmaken CSD uit Kst-bestand. Kan vector niet vinden." #~ msgctxt "ActivityLevelSource|" #~ msgid "Actvity Level" #~ msgstr "Activiteitniveau" #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Bewerken " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Nieuw " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Bewerken " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Plugin" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Nieuw " #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "veld aan het lezen ..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "Naar rijen zoeken..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "Naar rijen zoeken is gereed" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Naar rijen zoeken: %1" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Debuggen" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Debug" #~ msgctxt "CircleDimensionsTab|" #~ msgid "geo X" #~ msgstr "geo-X" #~ msgctxt "CircleDimensionsTab|" #~ msgid "pos X" #~ msgstr "pos X" #~ msgctxt "CircleDimensionsTab|" #~ msgid "pos Y" #~ msgstr "pos Y" #~ msgctxt "ContentTab|" #~ msgid "insert object" #~ msgstr "object invoegen" #~ msgctxt "ContentTab|" #~ msgid "remove object" #~ msgstr "object verwijderen" #~ msgctxt "DimensionsTab|" #~ msgid "geo X" #~ msgstr "geo-X" #~ msgctxt "DimensionsTab|" #~ msgid "geo Y" #~ msgstr "geo-Y" #~ msgctxt "DimensionsTab|" #~ msgid "pos Y" #~ msgstr "pos Y" #~ msgctxt "DimensionsTab|" #~ msgid "pos X" #~ msgstr "pos X" #~ msgctxt "FillTab|" #~ msgid "fill color" #~ msgstr "vulkleur" #~ msgctxt "HistogramTab|" #~ msgid "-10.0" #~ msgstr "-10,0" #~ msgctxt "HistogramTab|" #~ msgid "10.0" #~ msgstr "10,0" #~ msgctxt "LabelCreator|" #~ msgid "label bold" #~ msgstr "label vet" #~ msgctxt "LabelCreator|" #~ msgid "label color" #~ msgstr "labelkleur" #~ msgctxt "LabelCreator|" #~ msgid "label italic" #~ msgstr "label cursief" #~ msgctxt "LabelDimensionsTab|" #~ msgid "geo X" #~ msgstr "geo-X" #~ msgctxt "LabelDimensionsTab|" #~ msgid "pos X" #~ msgstr "pos X" #~ msgctxt "LabelDimensionsTab|" #~ msgid "pos Y" #~ msgstr "pos Y" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label italic" #~ msgstr "label cursief" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label color" #~ msgstr "labelkleur" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label bold" #~ msgstr "label vet" #~ msgctxt "LabelTab|" #~ msgid "label bold" #~ msgstr "label vet" #~ msgctxt "LabelTab|" #~ msgid "label italic" #~ msgstr "label cursief" #~ msgctxt "LabelTab|" #~ msgid "label color" #~ msgstr "labelkleur" #~ msgctxt "LayoutTab|" #~ msgid "layout horizontal margin" #~ msgstr "opmaak horizontale marge" #~ msgctxt "LayoutTab|" #~ msgid "layout vertical margin" #~ msgstr "opmaak verticale marge" #~ msgctxt "LayoutTab|" #~ msgid "layout horizontal spacing" #~ msgstr "opmaak horizontale spatiëring" #~ msgctxt "LayoutTab|" #~ msgid "layout vertical spacing" #~ msgstr "opmaak verticale spatiëring" #~ msgctxt "LineDimensionsTab|" #~ msgid "pos X" #~ msgstr "pos X" #~ msgctxt "LineDimensionsTab|" #~ msgid "geo X" #~ msgstr "geo-X" #~ msgctxt "LineDimensionsTab|" #~ msgid "geo Y" #~ msgstr "geo-Y" #~ msgctxt "LineDimensionsTab|" #~ msgid "pos Y" #~ msgstr "pos Y" #~ msgctxt "MatrixTab|" #~ msgid "0" #~ msgstr "0" #~ msgctxt "MatrixTab|" #~ msgid "1" #~ msgstr "1" #~ msgctxt "MatrixTab|" #~ msgid "100" #~ msgstr "100" #~ msgctxt "Kst::PlotRenderItem|" #~ msgid "%1 vs %2" #~ msgstr "%1 tegen %2" #~ msgctxt "StrokeTab|" #~ msgid "stroke style" #~ msgstr "streekstijl" #~ msgctxt "StrokeTab|" #~ msgid "stroke width" #~ msgstr "streekdikte" #~ msgctxt "StrokeTab|" #~ msgid "stroke brush color" #~ msgstr "kleur van penseelstreek" #~ msgctxt "VectorTab|" #~ msgid "-10.0" #~ msgstr "-10.0" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "JD" #~ msgstr "JD" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "MJD" #~ msgstr "MJD" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "RJD" #~ msgstr "RJD" #~ msgctxt "CurveAppearance|" #~ msgid "line style" #~ msgstr "lijnstijl" #~ msgctxt "FFTOptions|" #~ msgid "60.0" #~ msgstr "60,0" #~ msgctxt "FFTOptions|" #~ msgid "Hz" #~ msgstr "Hz" #~ msgctxt "Kst|" #~ msgid "Matrix" #~ msgstr "Matrix" #~ msgctxt "Kst|" #~ msgid "Object" #~ msgstr "Object" #~ msgctxt "Kst|" #~ msgid "String" #~ msgstr "Tekenreeks" #~ msgctxt "Kst|" #~ msgid "string" #~ msgstr "tekenreeks" #~ msgctxt "Kst|" #~ msgid "Vector" #~ msgstr "Vector" #~ msgctxt "Kst|" #~ msgid "vector" #~ msgstr "vector" #~ msgctxt "PlotItem|" #~ msgid "" #~ "Plot: %1 \n" #~ "Contents:\n" #~ " %2" #~ msgstr "" #~ "Plot: %1 \n" #~ "Inhoud:\n" #~ " %2" #~ msgctxt "Kst|" #~ msgid "Plugin" #~ msgstr "Plugin" #~ msgctxt "Kst|" #~ msgid "plugin" #~ msgstr "plugin" #~ msgctxt "Kst|" #~ msgid "Curve" #~ msgstr "Kromme" #~ msgctxt "Kst|" #~ msgid "curve" #~ msgstr "kromme" #~ msgctxt "Kst|" #~ msgid "Equation" #~ msgstr "Vergelijking" #~ msgctxt "Kst|" #~ msgid "equation" #~ msgstr "vergelijking" #~ msgctxt "Kst|" #~ msgid "Histogram" #~ msgstr "Histogram" #~ msgctxt "Kst|" #~ msgid "histogram" #~ msgstr "histogram" #~ msgctxt "Kst|" #~ msgid "Image" #~ msgstr "Afbeelding" #~ msgctxt "Kst|" #~ msgid "image" #~ msgstr "afbeelding" #~ msgctxt "Kst|" #~ msgid "Relation" #~ msgstr "Relatie" Kst-2.0.8/po/kst_common_ca.po0000644000175000017500000112107712362706252015166 0ustar synthsynth# Translation of kst_common.po to Catalan # Copyright (C) 2014 This_file_is_part_of_KDE # This file is distributed under the license LGPL version 2.1 or # version 3 or later versions approved by the membership of KDE e.V. # # Josep Ma. Ferrer , 2014. msgid "" msgstr "" "Project-Id-Version: kst_common\n" "PO-Revision-Date: 2014-06-06 16:59+0200\n" "Last-Translator: Josep Ma. Ferrer \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "X-Generator: Lokalize 1.4\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Accelerator-Marker: &\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Aplica aquests paràmetres per defecte" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Vista prèvia de les primeres 1000 línies en una finestra nova" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Primeres línies " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Vista prèvia]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Capçalera" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Les dades comencen a la línia:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Llegeix els noms de camps des de la línia:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Llegeix les unitats des de la línia:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicadors de comentari:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Aquí podeu utilitzar més d'un símbol, com per exemple «#!C», però alentirà " "la lectura de fitxers ASCII" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Separador decimal:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Punt" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Coma" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Disposició de la columna de dades" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Delimitat per espai/tabulador" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Delimitador personalitzat" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "La lectura és més ràpida si es pot assumir que cada columna té la seva " "pròpia amplada constant." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Cada columna té la seva\n" "pròpia amplada constant" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Amplada fixa" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Opcions generals" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Mida del límit de la memòria intermèdia:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Utilitza fils" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Accepta sempre fitxers que coincideix:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpreta els valors buits com a:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Valor anterior" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretació de data/hora" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Valor" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Camp a interpretar" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "com a:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Hora C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Segons" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Índex amb freqüència" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Cadena amb format. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Recorreu a la documentació de QDateTime pels detalls.
Podeu utilitzar una " "combinació de y,M,d per les dates i h,m,s,z per les hores (z pels " "mil·lisegons).
Es permet un espai entre les columnes de data i hora, però " "cal seleccionar la primera columna com a vector X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dia, M=mes, y=any, h=hora, m=minut, s=segon, z=mil·lisegon" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Desplaçament" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Data/hora:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Data del fitxer" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relatiu" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Primeres línies del fitxer «%1»" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "La línia %1 no pot llistar noms de camps i valors!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "La línia %1 no pot llistar unitats i valors!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "La línia %1 no pot llistar noms de camps i unitats!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Paràmetres inconsistents" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Lector de fitxers ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "S'està analitzant «%1»..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Ha finalitzat l'anàlisi de «%1»" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "S'està analitzant «%1»: %2 files" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Camp de lectura: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "S'ha creat un INDEX" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Ha finalitzat la lectura: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "lectura..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "anàlisi..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Columna %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Lector de DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Lector de fonts d'imatges FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Lector de fonts de dades del Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Lector de fonts de dades .mat del Matlab" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Lector del netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Lector de codi del QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Lector de fonts de dades de mostres" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Lector de llistes de fonts" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Columna %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "No s'ha obert el fitxer de dades per la matriu %1." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Matriu de dades: %1\n" " %2\n" " Camp: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 de %2 " #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "No s'ha obert el fitxer de dades per l'escalar %1." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Escalar de dades: %1 = %4\n" " %2\n" " Camp: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 de %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "quadres" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Camins de cerca de connectors:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Explorant connectors de fonts de dades." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Connector carregat: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "la instància ha fallat per %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "El fitxer «%1» no existeix." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "No s'ha pogut trobar cap font de dades per «%1»(%2), per se n'ha trobat un " "just abans. Hi ha quelcom incorrecte amb el Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "No s'ha obert el fitxer de dades per la cadena %1." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Cadena de dades: %1 = %4\n" " %2\n" " Camp: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 de %2 " #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Vector de dades: %1\n" " %2\n" " Camp: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Darrers %1 quadres." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Quadre %1 fins al final." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 quadres començant a %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Llegeix 1 mostra per cada %1 quadre." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Mitjana cada %1 quadres." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 de %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Error" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Avís" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Nota" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Traça" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Altres" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst versió %1\n" "\n" "\n" "Registre del Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Connectors de fonts de dades:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Vector editable: %1\n" " %2 valors" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Vector generat: %1\n" " %2 valors des de %3 a %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 punts des de %1 a %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "La matriu desada conté menys dades que les que declara." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matriu: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Error en crear una matriu generada des del fitxer Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Error en crear una matriu editable des del fitxer Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Error en crear una matriu de dades des del fitxer Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Escalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Escalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Valor: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Error en crear un escalar des del fitxer Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Cadena: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Error en crear una cadena des del fitxer Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Proveïdor: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vector: %1\n" " %2 mostres\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Error en crear un vector des del fitxer Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Error en crear un vector generat des del fitxer Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "No s'ha obert el fitxer de dades per l'escalar %1." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Escalar de dades: %1 = %4\n" " %2\n" " Camp: %3\n" " Quadre: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 quadre %3 de %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Un programa de visualització de dades.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revisió %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Pàgina web:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Informeu dels errors amb l'«Assistent d'informe d'errors» del menú «Ajuda»." "
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autors i col·laboradors (ordenats alfabèticament):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Quant al Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Arranjament del Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "General" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Escalat" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Graella" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Propietats de la disposició" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Fletxa" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Error en crear un objecte de fletxa des del fitxer Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Crea una fletxa" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Propietats de la fletxa" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Flet&xa a l'inici" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Escala de la fle&txa a l'inici" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Mida de la punta de la fletxa" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "La mida de la punta de la fletxa és proporcional a aquest valor." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Flet&xa al final" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Escala de la fle&txa al final" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Eixos" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Gruixut" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fi" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Molt fi" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Oculta l'esquerra" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Oculta la dreta" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Oculta els marges i les etiquetes" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Oculta la part superior" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Oculta la part inferior" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotació d'etiquetes" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotació:" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Mode de base/desplaçament" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Automàtic" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Activa" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Inactiva" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Dígits abans del mode de base/desplaçament:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Cal aquest nombre de dígits per mostrar els números de les marques, llavors " "l'eix es retornarà al mode de base/desplaçament." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Força el desplaçament al mínim de l'eix" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarítmica" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Inverteix la direcció dels eixos, de manera que el números es redueixin en " "lloc d'augmentar." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Inve&rteix" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "L'eix és el temps" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpreta l'eix com el temps." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpreta com a:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Tipus de codificació del temps" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "L'eix representa el temps, i aquí se selecciona la seva codificació." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Mostra com a:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Format de visualització del temps" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Si l'eix s'interpretarà com a temps, llavors es visualitzarà el temps en " "l'eix amb aquest format." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Zona horària:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Format de data/hora:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Data: y/M/d - Hora: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Marques i línies més importants" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Dibui&xa les marques" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Dibuixa les línies de la &graella" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Es&paiat més important:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Densitat de les marques més importants" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Indica la densitat de les marques més importants, Se seleccionarà " "automàticament un interval entre les marques més importants com una potència " "de 10 elevat a 1, 2 o 5. Això canvia l'espaiat de destí entre marques dins " "d'aquesta restricció." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "E&stil de les línies de la graella:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Color de les línies de la graella:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Amplada:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Marques i línies menys importants" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Dibuix&a les marques" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Dibuixa les línies de la graella" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "&Comptador de les marques menys importants:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Automàtic" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Est&il de línia:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Color d&e línia:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: No s'ha trobat el fitxer. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Diàleg" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "EtiquetaDeText" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Seleccioneu un fitxer de dades nou:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Canvia" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Omet" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Connector bàsic" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Edita el connector %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Connector %1 nou" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "No s'ha pogut crear l'objecte connector usant els paràmetres subministrats.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Entrades i sortides" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Quadre" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Error en crear un objecte de quadre des del fitxer Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Crea un quadre" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bits" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bits" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistent d'informe d'errors" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Versió del Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "SO:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Per a enviar un informe d'error, cliqueu al botó de sota.\n" "Això obrirà una finestra del navegador web a http://bugs.kde.org on trobareu " "un formulari per a omplir.\n" "La informació que es mostra més amunt s'enviarà a aquest servidor." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Engega l'assistent d'informe d'errors" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Botó" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Error en crear un objecte botó des del fitxer Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Gràfic cartesià" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "quadres" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Memòria insuficient" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "S'ha sol·licitat llegir %1 MB de dades però sembla que només hi ha " "aproximadament %2 MB de memòria utilitzable disponible. No es pot carregar " "aquesta quantitat de dades." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Canvia les mostres de dades" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Selecció de vector" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en aquesta " "llista." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Afegeix-ho &tot" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Afegeix" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "El fitxer no s'ha pogut carregar o no conté dades." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "El camp següent no està definit en el fitxer sol·licitat:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Els camps següents no estan definits en el fitxer sol·licitat:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Canvi del fitxer de dades" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Selecció per fitxer d'origen" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "A&fegeix-ho tot des de:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Selecció de vector i matriu" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en aquesta " "llista." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Afegeix-ho &tot" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Afegeix" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Fitxer de dades nou" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Fitxer:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Can&via els vectors i matrius seleccionades" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "D&uplica els objectes derivats (corbes, equacions,...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplica els vectors i matrius seleccionades" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Assigna corba de color des de fitxer" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Assigna els colors" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Color de base de la corba a:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Vector &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Vector &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Radi" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centre" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Cercle" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Error en crear un objecte de cercle des del fitxer Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Crea un cercle" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "final" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Columna %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Ús: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Ús: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Ús: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Ús: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Ús: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Ús: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Ús: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Ús: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Ús: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "No s'ha especificat cap fitxer de dades\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "El fitxer %1 no existeix\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Ús: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Ús: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Ús: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Ús: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Ús: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Ús: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Eleva en ordre del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Abaixa en ordre del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Objectes &disponibles:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Desselecciona-ho tot" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Selecciona-ho tot" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Eleva en ordre del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Abaixa en ordre del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Objectes mostrats:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "grupBoto" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "AIXÒ, I TOT EL QUE SEGUEIX A SOTA ÉS PER A CREACIÓ D'SCRIPTS I HAURIA " "D'ESTAR OCULT!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Espectrograma" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Edita un espectrograma" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Espectrograma nou" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Contingut de l'espectrograma" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Vector de dades:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Mida de la finestra:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Opcions d'imatge" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Corba" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Edita una corba" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Corba nova" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Continguts de la corba" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Vector de l'eix &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Vector de l'eix &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Barra d'e&rror a +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Barra d'error a &+Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Barra d'error a -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Barra d'error a &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Usa la barra d'error +X per -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "U&sa la barra d'error +Y per -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnora en els càlculs automàtics d'abast dels eixos" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nom:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Automàtic" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Edició múltiple >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Edita un %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Introduïu aquí el filtre (es permeten comodins)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Fes una corba" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Fes un espectre de potència" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Fes un espectrograma" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Fes un histograma" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Aplica el filtre" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Fes una imatge" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Afegeix al gràfic" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Elimina del gràfic" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Aplica un ajust" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Suprimeix" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gestor de dades" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtra per:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Totes les columnes" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nom" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Tipus" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Mostres" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Distingeix entre majúscules i minúscules" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Purga" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Error en crear una font de dades des del fitxer Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Interval de temps" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Detecció de canvis" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "No actualitzis" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Eleva en ordre del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Abaixa en ordre del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vector/s disponible/s" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vector/s seleccionat/s" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Crea gràfics es&pectrals. Definiu a sota les opcions del FFT:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Memòria insuficient" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "S'ha sol·licitat llegir %1 MB de dades però sembla que només hi ha " "aproximadament %2 MB de memòria utilitzable disponible. No es pot carregar " "aquesta quantitat de dades." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Crea gràfics &XY. Definiu a sota les propietats de l'eix X:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Crea des del cam&p:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Usa l'e&xistent:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "El camp que s'utilitzarà com a eix X en les corbes XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Seleccioneu una font de dades per treballar-" "hi. Normalment, això serà el fitxer que conté punts de dades o vectors.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "Tipus d'actualització; useu «Interval de temps» per dades no locals" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtres" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "Filtre &nou..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Si voleu, seleccioneu un " "filtre per aplicar als camps que es llegeixin:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Posició de la corba" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Totes les corbes en un gràfic" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 gràfic nou per corba" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Circ&ula per" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " gràfics" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Circula pels gràfics exis&tents" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Totes les corb&es en el gràfic" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Posició del gràfic (pestanyes)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Tot en la pestanya a&ctual" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Tot en una pestanya no&va" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY i espectre en pestanyes noves &separades" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Disposició del gràfic" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Disposició &automàtica" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Grae&lla personalitzada" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Columnes:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&rotegeix la disposició existent" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Ajusta l'escala de totes les etiquetes de la pestanya" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Reparteix els eixos per la pestanya" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Estil de cor&ba" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Només lín&ies" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Només &punts" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Línies i punt&s" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Mode de l'eix de l'espectre" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Eix X lo&garítmic" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Eix Y &logarítmic" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Llegendes" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Activa" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Inactiva" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertical" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Eleva en ordre del gràfic: Alt+Fletxa amunt)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Selecciona (Alt-S): Mou els camps ressaltats des de la llista de dades " "disponibles a la llista de dades seleccionades per fer el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Elimina (Alt-R): Mou els camps ressaltats des de la llista de dades " "seleccionades a la llista de dades disponibles, de manera que no es " "mostraran en fer el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "" "Dades seleccionades: Tots els camps en aquesta llista es mostraran en el " "gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Dades seleccionades: Tots els camps en aquesta llista es mostraran en el " "gràfic. Per eliminar camps d'aquesta llista, arrossegueu-los a la llista de " "dades disponibles, feu un clic doble en ells, o seleccioneu-los i useu el " "botó Elimina (fletxa dreta o Alt-R). L'ordre en el que apareixen els camps " "en aquesta llista és l'ordre en que es dibuixaran." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Dades seleccionades:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vector/s seleccionat/s" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtre de cerca" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtre de cerca: Els camps que coincideixin amb aquest filtre es ressaltaran " "i es mouran a la part superior de la llista de dades disponibles. Es poden " "usar els comodins «*» i «?»." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Afegeix el comodí «*» al començament i al final del filtre de cerca per " "trobar tot el que contingui el text del filtre de cerca." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "C&erca" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Selecció de camps: Els camps activats es mostraran en el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Dades disponibles: Aquest quadre llista tots els camps que no s'han " "seleccionat per mostrar en el gràfic. Per seleccionar un camp per dibuixar, " "moveu-lo a la llista de dades seleccionades, arrossegant-lo amb el ratolí, " "fent un clic doble, o ressaltant-lo, i clicant en el botó de selecció " "(fletxa dreta o l'accelerador és Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Dades disponibles:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vector/s disponible/s" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Versió %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Versió %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Diàleg de depuració del Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informació de construcció" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Envia un correu amb la informació de depuració" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Registre" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Nivell de registre: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Avís" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Nota" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Traça" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Nete&ja" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Fonts de dades" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Connector" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Instància carregada" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Tan&ca" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "S'ha produït un error. Cliqueu en aquesta icona per a més detalls." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Tipus de lletres" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Carta" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Gràfic de diari" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Personalitzat" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Mida mínima del tipus de lletra (punts):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "En redimensionar la finestra, els tipus de lletra es mostraran amb aquesta " "mida mínima." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Mida de vista de referència:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Quan la finestra té aquesta mida, els tipus de lletra tindran aquesta mida " "fixada." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Els tipus de lletra s'escalaran amb la mida de la finestra o de la " "impressió. Quan la finestra/impressió tingui aquesta mida, les mides dels " "tipus de lletra fixades seran precises. " #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Mida de referència personalitzada (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Desa com a predeterminat" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Aplica als objectes existents" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Puja la propietat seleccionada en la llista de prioritats" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Baixa la propietat seleccionada en la llista de prioritats" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "Afegeix la propietat seleccionada a la llista de prioritats a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Elimina la propietat seleccionada de la llista de prioritats a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Color de línia" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Estil de punt" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Estil de línia" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Amplada de línia" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Diferencia les corbes" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Selecció de propietats i ordre de cicle" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Eleva en ordre de la selecció: Alt+Fletxa amunt" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Abaixa en ordre de la selecció: Alt+Fletxa avall" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Disponibles:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Seleccionats:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opcions" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Amplada màxima de línia:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Densitat dels punts:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Tots" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Alta" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Mitjana" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Baixa" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "Gi&r:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Mida:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Posició:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Fixa la relació d'aspecte" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "No s'ha pogut obrir el fitxer per escriptura." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "No s'ha pogut obrir el fitxer per lectura." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "El fitxer està mal format i s'ha trobat un error en la seva lectura." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Selecció d'objectes a editar" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtre:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Neteja" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Selecciona-ho &tot" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "El·lipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Error en crear un objecte d'el·lipse des del fitxer Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Crea una el·lipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Equació" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Edita l'equació" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Equació nova" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Equació" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Eq&uació:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Introduïu aquí l'equació a avaluar. Useu «x» com a variable independent. Els " "vectors and operadors se seleccionen de les llistes de dalt." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Vector &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpola a la resolució vectorial més alta" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Monitor d'esdeveniments" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Edita el monitor d'esdeveniments" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Monitor nou d'esdeveniments" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Notificació de correu" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "No&tifica:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expressió" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vectors:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operadors:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "Pi" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Escalars:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expressió:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Descripció:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Executa:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tifica:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configura..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Registre de depuració del Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Avís" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Nota" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Registra com a:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exporta a un fitxer gràfic" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "Nom &base:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Format de fitxer:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Mida" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Amplada (en píxels) de la imatge." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "A&lçada:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Alçada (en píxels) de la imatge." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "Es&pecificació:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Amplada i mantenir la relació d'aspecte" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Alçada i mantenir la relació d'aspecte" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Amplada i alçada" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Mida del quadrat" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Desa les opcions" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "No desis automàticament. En clicar D'acord o Aplica, desa una vegada." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Desa una &vegada" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Desa la imatge segons el temporitzador" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Quan està activada, la imatge es desarà repetidament usant el període " "indicat. Això és útil, per exemple, per imatges de pàgines web en directe." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Desa &automàticament cada" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Temporitzador de desat automàtic" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "&Extensió automàtica" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Inclusió:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Formats de vector" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Formats de mapa de bits" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exporta vectors" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Selecció de vector" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en aquesta " "llista." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "Afegeix-ho &tot" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Afegeix" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Ubicació de de&sat:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Sense pinzell" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Patró sòlid" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Patró dens 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Patró dens 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Patró dens 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Patró dens 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Patró dens 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Patró dens 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Patró dens 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Patró horitzontal" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Patró vertical" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Patró creuat" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Patró diagonal 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Patró diagonal 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Patró diagonal creuat" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Color:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "E&stil:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Usa un degradat &lineal" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Reincia el degradat" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Connector" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Edita el connector %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Connector %1 nou" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "No s'ha pogut crear l'objecte connector usant els paràmetres subministrats.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Selecció de connectors" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nom del connector:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Descripció:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Entrades i sortides" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnora en els càlculs automàtics d'abast dels eixos" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "General" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Velocitat d'actualització dels fitxers dinàmics." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Temps mínim entre actualitzacions en controlar els fitxers dinàmics. Si hi " "ha molt procés, pot trigar més." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Període entre actualitzacions (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Utilitza transparència en arrossegar" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Renderitza usant «raster». Això sempre és millor." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "La renderització usant el «raster» és més ràpida en algunes arquitectures, " "però molt defectuosa en altres (depenent del controlador de vídeo). Això " "podria ajudar o provocar que sigui pitjor." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Usa el motor «raster» (cal el reinici del Kst)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Gràfics amb &antialiàsing" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Graella" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Mostra la &graella" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Aju&sta a la graella" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Espaiat &horitzontal de la graella:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Espaiat &vertical de la graella:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histograma" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Edita histograma" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Histograma nou" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Propietats de l'histograma" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dades:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Compartiments des &de:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "El límit inferior del compartiment inferior. Els valors per sota d'aquest " "límit no es comptaran en cap compartiment." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "a:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "El límit superior del compartiment superior. Els valors per sobre d'aquest " "límit no es comptaran en cap compartiment." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Nombre de compartiment&s:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "El nombre de compartiments en l'histograma." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Definiu els límit superior i inferior, i el nombre de compartiments a un " "valor per defecte raonable." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "Compartiments a&utomàtics" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Compartiments automàtics en temps &real" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalització de l'eix Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "" "L'eix Y de l'histograma informa de la fracció de mostres del compartiment." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fracció en el compartiment" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "" "L'eix Y de l'histograma informa del nombre de mostres del compartiment." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "No&mbre en el compartiment" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "L'eix Y de l'histograma està normalitzat, per tant, el compartiment més gran " "és 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Pic de compartiment = &1,0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "L'eix Y de l'histograma informa del percentatge de mostres en el " "compartiment." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&tatge en el compartiment" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Imatge" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Edita la imatge" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Imatge nova" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Contingut de la imatge" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matriu:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Tipus d'imatge" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "M&apa de colors" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Mapa de con&torn" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Mapa de &colors i mapa de contorn" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Paràmetres del mapa de colors" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "S&uperior:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Llindar - &Inferior:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Intel·ligent" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&il: " #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Llindar automàtic en temps &real" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Paràmetres del mapa de contorn" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Co&lor:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Nom&bre de nivells de contorn:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Ponderació:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Usa ponderació de línia &variable" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Diàleg de creació d'etiqueta" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Diàleg" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Dreta" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Esquerra" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Punt de referència:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " punts" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Color" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Desa com a predeterminat" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Dreta" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Esquerra" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Punt de referència d'etiqueta:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Gir" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Posició" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Etiqueta" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Creació d'etiqueta" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Propietats de l'etiqueta" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}, x^y, x_y. Els escalars, equacions, i elements vectorials " "es poden incrustar. Escalar: [V1/Mitjana]. Element vectorial: [V1" "[4]]. Equació: [=[V1/Mitjana]^2]. El caràcter [ es pot inserir " "com a \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "&Mida del tipus de lletra del gràfic per defecte:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "punts" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Escala automàticament els números de les etiquetes dels eixos" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Etiqueta su&perior:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automàtica" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Etiqueta i&nferior:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "Etiqueta es&querra:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Etiqueta d&reta:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Mostra la lle&genda" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&dita" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Permet escalars i cadenes (nom entre claudàtors) - P. ex., [INDEX:Max " "(X2)],\n" "equations incrustades - P. ex, [=[INDEX:Max] / 2]\n" "i símbols del LaTeX - P. ex, \\theta. Els noms i els símbols es completen " "automàticament." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Disposició del quadre" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Disposició" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Marge &horitzontal:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Marge &vertical:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Espaiat horit&zontal:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Espaiat ver&tical:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Llegenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Llegenda buida" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gràfic: %1 \n" "Contingut:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Llegenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Eleva en ordre de la llista: Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Abaixa en ordre de la llista: Alt+Fletxa avall" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Títol:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Usar el contingut automàtic basat en el gràfic" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Mostra &verticalment" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Objectes &disponibles:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Objectes mostrats:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Eleva en ordre del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Abaixa en ordre del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Arranjament del tipus de lletra de la llegenda" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "&Mida del tipus de lletra:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Família del tipus de lletra" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LineEdit" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Error en crear un objecte de lineEdit des del fitxer Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Línia" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Error en crear un objecte de línia des del fitxer Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Crea una línia" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script: En execució" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script: Ha finalitzat" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script: Codi de retorn %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Error d'script: Ha fallat en iniciar" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Error d'script: Ha fallat" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Error d'script:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Fes una entrada al registre" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "To&rna a executar l'script" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Aplica" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Tan&ca" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Missatge" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Missatge:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Neteja" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Sortida de l'script:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuració" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Propietats del gràfic" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Amplada i mantenir la relació d'aspecte" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Alçada i mantenir la relació d'aspecte" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Amplada i alçada" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Mida del quadrat" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "A&lçada:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Alçada (en píxels) de la imatge." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Format de fitxer:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "Es&pecificació:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Amplada (en píxels) de la imatge." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Directori local del registre:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Les variables $user, $imagefile i $messagefile es poden utilitzar en la " "llista d'arguments." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "Nom d'&usuari:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Pregunta si es desa" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "El document s'ha modificat.\n" "Deso els canvis?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Fitxer desat" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sessions Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Obre un fitxer" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "Nete&ja dels fitxers inexistents" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Pels detalls vegeu Ajuda->Diàleg de depuració->Registre." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Error en obrir el document:\n" " «%1»\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Obre..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Obre una sessió nova" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "De&sa" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Desa la sessió actual" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Desa com &a..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "Sessió no&va" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Tanca la sessió actual i inicia una sessió nova i buida" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Recarrega totes les fonts de &dades" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Recarrega totes les fonts de dades" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Imprimeix..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Imprimeix la vista actual" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exporta com a imatge/s..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exporta els gràfics al disc" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Desa els &vectors al disc..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exporta els vectors a un fitxer ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Entrada de re&gistre..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Publica una entrada del registre" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "Pestanya &nova" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Crea una pestanya nova" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Tan&ca la pestanya" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Tanca la pestanya actual" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "S&urt" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+U" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Surt de l'aplicació" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Maj+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vectors" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Mostra tots els vectors en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "E&scalars" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Mostra tots els escalars en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrius" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Mostra totes les matrius en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "Ca&denes" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Mostra totes les cadenes en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Torna &enrere una pantalla" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Torna enrere una pantalla" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Avança una pantalla" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Avança una pantalla" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Compta des del final" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Configura tots els vectors de dades per comptar des del mode final" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Llegeix al final" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Configura tots els vectors de dades per llegir al mode final" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pausa" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Commuta la pausa d'actualitzacions de les fonts de dades" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Canvia l'interval de mo&stra de dades..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Mostra el diàleg del Kst de canvi d'interval de mostra de dades" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Dibuixa" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Crea un gràfic per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "E&scalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vector" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matriu" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Ca&dena" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Corba" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Equació" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Espectre de po&tència" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histograma" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Imatge" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Espectr&ograma" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Monitor d'esdeve&niments" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Etiqueta" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Crea una etiqueta per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Quadre" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Crea un quadre per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Cercle" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Crea un cercle per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&El·lipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Crea una el·lipse per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Línia" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Crea una línia per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Fletxa" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Crea una fletxa per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Imatge" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Crea una imatge per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Crea un SVG per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Quadre d'eix compartit" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Crea un quadre d'eix compartit per l'element actual" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Commu&ta el zoom lligat" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Commuta el zoom lligat de la vista actual" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Lliga per totes les pestanyes" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "El zoom lligat s'aplica entre les pestanyes" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Ressalta els punts de dades" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Ressalta el punt de dades més proper" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Zoom/Desplaçament X-Y " #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Zoom arbitrari en direcció X o Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Zoom només &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoom només en direcció X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Zoom només &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Mode de &disposició" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Commuta el mode de disposició de la vista actual" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Gestor de dades" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Mostra la finestra del gestor de dades del Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Assistent de &dades" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Mostra l'assistent de dades del Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Canvi del &fitxer de dades" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Mostra el diàleg del Kst de canvi del fitxer de dades" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Assigna corba de &color des de fitxer" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Mostra el diàleg del Kst de selecció de color" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "D&iferencia les corbes" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Mostra el diàleg del Kst de diferenciació de les corbes" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configura el Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Mostra el diàleg de configuració del Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Tema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Mostra el diàleg de tema del Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "&Diàleg de depuració" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Mostra el diàleg de depuració del Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Assistent d'informe d'e&rrors" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Mostra l'assistent d'informes d'error del Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Quant a" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Mostra el quadre quan a del Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Fitxer" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Sessions &recents" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "&Fitxers de dades recents" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Edita" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Visualitza" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Inte&rval" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Crea" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Co&nnector estàndard" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Connector d'aj&ust" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Connector de fil&tres" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Anotació" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Mode" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Mode d'interacció" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Eines" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "A&rranjament" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "A&juda" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Fitxer" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Eines" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Interval de dades" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Mode" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Disposició del gràfic" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Disposició avançada" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Preparat" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Marcadors" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "" "Ja existeix un marcador de gràfic amb un valor igual (o molt semblant)." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "El text que heu introduït no és nombre vàlid." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Marcadors d'eixos" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "Punt &nou de marcador: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Afegeix" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Marcadors act&uals" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Neteja" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Aparença del marcador" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Est&il de línia:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Co&lor de línia:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "A&mplada de línia:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Marcadors automàtics" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Usa una corba com a &font del marcador:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Crea marcadors a:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Aresta &ascendent" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "Aresta &descendent" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "Am&bdues" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Usa un &vector com a font del marcador:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matriu" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Edita matriu" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Matriu nova" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Escalat i translació" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "Mi&da del pas X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "Mínim &X:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "Mínim &Y:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Mida del &pas Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Paràmetres del gradient" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Increment/decrement dels valors de Z al llarg de:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Eix X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Eix Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z al mínim:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Passos X:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Passos Y:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z al màxim:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Interval de dades" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "o" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Quadre d'&inici Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "N&ombre de quadres X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "C&ompta des del final" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Llegeix al final" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "No&mbre de quadres Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Ll&egeix al final" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Compta &des del final" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Quadre d'i&nici X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " quadres" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Primer el &filtre «boxcar»" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Llegeix &1 mostra per" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Font" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Llegeix des de la font de dades" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Genera un gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Paràmetres de la font de dades" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "Ca&mp o columna:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB disponibles" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Usa el tipus de lletra per defecte del gràfic" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Imatge" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Obre imatge" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Error en crear un objecte d'imatge des del fitxer Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Crea una imatge" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Anys]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dies]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Hores]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minuts]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Segons]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Gràfic" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom màxim" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom màxim insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zoom anterior" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zoom ajustat" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom ajustat a X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom ajustat a Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom centrat a la mitjana d'Y" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Zoom màxim d'X" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Zoom d'X amb vora automàtica" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Zoom d'X insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Zoom d'X a la dreta" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Zoom d'X a l'esquerra" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Ampliació d'X" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Reducció d'X" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalitza l'eix X a l'eix Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Eix X logarítmic" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Zoom d'Y local màxim" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Zoom d'Y màxim" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Zoom d'Y amb vora automàtica" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Zoom d'Y insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Zoom d'Y cap a dalt" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Zoom d'Y cap a baix" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Ampliació d'Y" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Reducció d'Y" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalitza l'eix Y a l'eix X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Eix Y logarítmic" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Ajusta l'escala de color de la imatge" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximitza el gràfic" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Comparteix els gràfics en l'eix X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Comparteix els gràfics en l'eix Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Trenca el quadre d'eix compartit" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copia les coordenades" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copia la coordenada X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copia la coordenada Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copia" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtre" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Edita una corba" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Ajusta" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Paràmetres del quadre d'eix compartit" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Informació copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Coordenada X copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Coordenada Y copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gràfic: %1 \n" "Contingut:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Gràfic buit" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Error en crear un objecte de gràfic des del fitxer Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Crea un gràfic" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Crea un gràfic per la corba" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Expressió de zoom fixat" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Expressió d'interval de zoom X" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom màxim" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom màxim insensible a les puntes" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom centrat a la mitjana" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom centrat a la mitjana d'X" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom centrat a la mitjana d'Y" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom d'X màxim" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom d'X amb vora automàtica" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom d'X sense puntes" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Desplaçament d'X a la dreta" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Desplaçament d'Y a l'esquerra" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Redueix X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Amplia X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom normalitzat d'X a Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom d'Y local màxim" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom d'Y màxim" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom d'Y amb vora automàtica" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom d'Y sense puntes" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom d'Y cap a dalt" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom d'Y cap a baix" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Redueix Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Amplia Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom normalitzat d'Y a X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X logarítmic" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y logarítmic" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Edita element del gràfic" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Continguts" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Tipus de lletra superior" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Tipus de lletra inferior" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Tipus de lletra de l'esquerra" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Tipus de lletra de la dreta" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Tipus de lletra dels eixos" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Interval/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Eix X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Eix Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Marcadors de l'eix X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Marcadors de l'eix Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Tipus de lletra superior*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Tipus de lletra inferior*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Tipus de lletra de l'esquerra*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Tipus de lletra de la dreta*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Tipus de lletra dels eixos*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Representació del gràfic" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Mode de referència" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Edita l'espectre de potència" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Espectre de potència nou" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Contingut de l'espectre de potència" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dades:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Valor" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Interval" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Mode de zoom d'X" #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&utomàtic" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Automàtic amb vo&ra" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Automàtic insensible a les puntes" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "C&entrat a la mitjana, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "inter&val: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ix, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "&des de: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "&a:" #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "Hauria d'estar ocult" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Mode de zoom d'Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Automàtic" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Automàtic amb &vora" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Automàtic insensible a les &puntes" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "&Centrat a la mitjana, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "Inte&rval: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fix, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "D&es de: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&a:" #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Escalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Edició d'escalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Escalar nou" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Llegeix des de la &font de dades" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Genera un vector nou amb les propietats donades aquí com a variable " "independent." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Llegeix des del &vector de dades" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Llegeix des de la font de dades" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Camp:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "Fotog&rama:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "o" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccioneu això per llegir les dades des del final del fitxer. Això és útil " "per per desplaçar les visualitzacions quan el fitxer l'està actualitzant pel " "final una altra aplicació." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&Darrer marc" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Genera" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "V&alor: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "El valor màxim de la variable independent." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Tipus" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Mostres" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Quadre d'eix compartit" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Trenca el quadre d'eix compartit" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Error en crear un objecte de quadre d'eix compartit des del fitxer Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Crea un quadre d'eix compartit" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Cadena" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Edita una cadena" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Cadena nova" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Llegeix des de la &font de dades" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "Nom del &fitxer:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "Ca&mp:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Valor: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Traç" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Sense llapis" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Sense pinzell" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Patró sòlid" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Patró dens 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Patró dens 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Patró dens 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Patró dens 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Patró dens 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Patró dens 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Patró dens 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Patró horitzontal" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Patró vertical" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Patró creuat" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Patró diagonal 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Patró diagonal 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Patró diagonal creuat" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Unió en biaix" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Unió en bisell" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Unió arrodonida" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Unió en biaix SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Punta plana" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Punta quadrada" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Punta arrodonida" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "E&stil:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "&Color del pinzell:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Estil de &pinzell:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Estil d'&unió:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Estil de &punta:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Obre una imatge SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Error en crear un objecte SVG des del fitxer Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Crea un SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Visualitza &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Reanomena la pestanya" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Introduïu el nom nou de pestanya:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Afegeix una pestanya" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Reanomena la pestanya" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Tan&ca la pestanya" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "Vista d'&edició" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Personalitzada" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Tema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Traç" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Tipus de lletres" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " punts" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Desa com a predeterminat" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Aplica als objectes existents" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vector" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Interval de temps" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Detecció de canvis" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "No actualitzis" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Edició de vector" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Vector nou" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Nombre de mostres:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "El nombre de mostres de la variable independent nova." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&Des de:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "El valor mínim de la variable independent." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&a:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "El valor màxim de la variable independent." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Llegeix des de la &font de dades" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "Ca&mp o columna:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "Tipus d'actualització. Useu «Interval de temps» per dades no locals." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Protegeix una disposició" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Personalitzada" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Disposició de columna" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposició en columnes en ordre de creació.\n" "Seleccioneu el nombre de columnes:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menú visualitza" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Vista d'edició" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Suprimeix" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Eleva" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Baixa" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Protegeix una disposició" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Columnes" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "B&loqueja la posició a les dades" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Disposició de columna" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposició en columnes en ordre de creació.\n" "Seleccioneu el nombre de columnes:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menú %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Gira" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Crea una disposició" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Afegeix un element a la disposició" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Elimina" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Eleva" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Baixa" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Gira" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Edició d'element de vista" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nom:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Edició múltiple >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Aparença" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Edita un" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Vista de matriu" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Visualitza els valors de cadena" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Visualitza els valors d'escalar" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Vista de la primitiva" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Actualitza" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Selecció de vectors a visualitzar" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Visualitza el/s vector/s seleccionat/s" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Elimina el/s vector/s seleccionat/s de la llista" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Elimina" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Xifres significatives" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Mostra com a enter" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (per defecte)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Visualitza els valors del vector" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Mostra la llista de vectors" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Oculta la llista de vectors" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Restaura la vista" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Tanca" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Hi ha un error en l'algorisme %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Connector: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Error: No s'ha pogut crear cap objecte de dades des del connector" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Error: No s'ha pogut trobar cap connector per l'objecte de dades" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Error en crear un objecte connector des del fitxer Kst." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "No s'ha pogut assignar memòria suficient per a l'espectrograma." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Espectrograma: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Densitat espectral d'amplitud" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Densitat espectral de potència" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Espectre d'amplitud" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Freqüència" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Hora" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Espectrograma: %1\n" " Longitud FFT: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Mitjana; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apoditza; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Elimina la mitjana;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Error en crear un espectrograma des del fitxer Kst." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Error en crear un espectrograma des del fitxer Kst. No s'ha trobat cap " "Vector." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Corba" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Corba: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ Error: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- Error: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ Error: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- Error: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Línies: Amplada %1 i estil %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punts: Estil %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Barres" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Error en crear una corba des del fitxer Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Error en crear una corba des del fitxer Kst. No s'ha trobat cap xVector." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Error en crear una corba des del fitxer Kst. No s'ha trobat cap yVector." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Explorant connectors d'objectes de dades." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() del tid=%2: en escriure la " "sortida del bloqueig %3 (no és un proveïdor) -- probablement això és un " "error. Si us plau, envieu un correu a kst@kde.org amb els detalls." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "L'equació té un objecte desconegut [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Corba d'equació" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "L'equació [%1] ha fallat en trobar els seus vectors mentre es tornava a " "analitzar." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "L'equació [%1] ha fallat en trobar els seus vectors mentre es desava. El " "fitxer Kst resultant pot tenir problemes." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "L'equació [%1] té referències a objectes no existents." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "L'equació [%1] ha fallat en l'anàlisi. Els errors a sota." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Error d'anàlisi: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Equació: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Error en crear una equació des del fitxer Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Error en crear una equació des del fitxer Kst. No s'ha trobat cap xVector." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "Esdeveniment" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Esdeveniment: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Error en crear un EventMonitorEntry des del fitxer Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Número" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Percentatge" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fracció" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Freqüència normalitzada" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histograma de %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histograma: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Compartiments automàtics" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 compartiments des de %2 a %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Error en crear un histograma des del fitxer Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Error en crear un histograma des del fitxer Kst. No s'ha trobat cap Vector." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Imatge de %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Imatge: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Error en crear una imatge des del fitxer Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Error en crear una imatge des del fitxer Kst. No s'ha trobat cap matriu." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Any julià" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Hora estàndard C" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Data juliana" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Data juliana modificada" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Data juliana reduïda" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Temps atòmic internacional (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Hora de l'Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Cadena amb format" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Corba PSD" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "S'ha intentat crear un PSD que utilitza tota la memòria." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Densitat espectral" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Espectre d'amplitud" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Freqüència" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Espectre: %1\n" " Longitud FFT: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Mitjana; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apoditza; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Elimina la mitjana;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "En PSDCalculator::calculatePowerSpectrum: S'ha rebut una matriu de sortida " "amb una longitud errònia." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Error en crear un PSD des del fitxer Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Error en crear un PSD des del fitxer Kst. No s'ha trobat cap Vector." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Nivell d'activitat de %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Nivell d'activitat" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Nivell d'activitat: %1\n" " Temps de mostreig: %2 (s)\n" " Amplada de finestra: %3 (s)\n" " Llindar de soroll: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Error: Vector d'entrada massa curt." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Error: Cal que la finestra sigui més ampla." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Nivell d'activitat" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Calcula el nivell d'activitat d'un senyal com el producte de la desviació " "estàndard i el nombre d'inversions en una finestra lliscant." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Temps de mostreig (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Amplada de finestra (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Llindar de soroll" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Objecte connector de compartiments" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Mida no vàlida del vector d'entrada" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Error: Sense compartiments" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Compartiment" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Agrupa les dades en el compartiments de mida indicada. Cada compartiment " "conté la mitjana d'elements que pertanyen al compartiment." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Mida de compartiment" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Objecte connector de divisió" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Mida no vàlida del vector d'entrada" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Divisió" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Divideix un conjunt de dades indicat en conjunts de dades parells, senars, " "de diferències i índexs." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Objecte connector de convolució" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Vectors d'entrada - Mida no vàlida" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Longitud d'entrada calculada no vàlida" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convolució" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Genera la convolució d'un vector amb un altre." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Objecte connector desconvolució" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Vectors d'entrada - Mida no vàlida" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Longitud d'entrada calculada no vàlida" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Desconvolució" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Genera la desconvolució d'un vector amb un altre." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Objecte connector d'autocorrelacions" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Mida no vàlida del vector d'entrada" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Longitud d'entrada calculada no vàlida" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Autocorrelació" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Genera l'autocorrelació d'un vector." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Correlació creuada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Vectors d'entrada - Mida no vàlida" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Longitud d'entrada calculada no vàlida" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Correlació creuada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Genera la correlació d'un vector amb un altre." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Objecte connector d'espectre creuat" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Connector d'objecte de dades d'espectre creuat" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Genera l'espectre creuat de potència d'un vector amb un altre." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Longitud FFT = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Freqüència de mostreig" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Objecte connector d'amplada de banda efectiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Error: Mida no vàlida del vector d'entrada X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Error: Els vector d'entrada X i Y no tenen la mateixa longitud" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Error: Índexs calculats no vàlids" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Amplada de banda efectiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Calcula l'amplada de banda efectiva d'un espectre d'amplitud." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Freq. mín. soroll blanc" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Freqüència de mostreig (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Objecte connector genèric de filtres" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Error: El numerador de la cadena d'entrada està buit" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Error: El denominador de la cadena d'entrada està buit" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Filtre genèric" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Genera un filtre discret a partir d'una definició de temps continuo." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Temps de mostreig (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numerador (ordre incremental)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Denominador (ordre incremental)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Objecte connector d'interpolació Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Spline d'interpolació Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Genera una interpolació Akima no arrodonida per a un conjunt de dades." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Objecte connector d'interpolació Akima periòdica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Spline d'interpolació Akima periòdica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Genera una interpolació Akima periòdica no arrodonida per a un conjunt de " "dades." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Objecte connector d'spline d'interpolació cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Spline d'interpolació cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Genera una interpolació spline per a un conjunt de dades." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Objecte connector d'spline d'interpolació cúbica periòdica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Spline d'interpolació cúbica periòdica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Genera una interpolació spline cúbica per a un conjunt de dades." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Objecte connector d'interpolació lineal" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Spline d'interpolació lineal" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Genera una interpolació lineal per a un conjunt de dades." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Objecte connector d'interpolació polinòmica" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Spline d'interpolació polinòmica" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Genera una interpolació polinòmica per a un conjunt de dades." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Objecte connector d'ajust de línia" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Error: Longitud no vàlida del vector d'entrada Y" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Error: Longitud no vàlida del vector d'entrada X" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Ajust de línia" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Genera una línia d'ajust òptim per a un conjunt de dades." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Connector d'objecte de dades de «lock-in»" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Vectors d'entrada - Mida no vàlida" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "«Lock-in»" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" "El «lock-in» amplifica l'entrada utilitzant una ona portadora de referència" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Vector de referència" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Objecte connector d'addició de soroll" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Mida no vàlida del vector d'entrada" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Addició de soroll" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Afegeix soroll Gaussià a un conjunt de dades, d'una desviació estàndard " "específica." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Objecte connector de periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Error: Les longituds dels vectors d'entrada no coincideixen" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Pren el «outputVectorPeriodogram» d'un conjunt «inputVectorData» donat. No " "s'assumeix que el «inputVectorData» estigui mostrejat igual que els " "intervals del «inputVectorTime»." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Temps de vector d'entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Dades de vector d'entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Factor de sobre-mostreig" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Factor mitjà de freqüència de Nyquist" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Objecte connector de fase" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Error: La fase de l'escalar d'entrada ha de ser més gran que zero." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Error: Les longituds dels vectors d'entrada no coincideixen." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Ajusta la fase d'un conjunt de dades donat al període especificat i " "«outputVectorPhase» zero." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Temps de vector d'entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Dades de vector d'entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Període" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Fase zero" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Objecte connector de decalatge" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Decalatge: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Decalatge" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Decala (i trunca) un vector." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Valor de decalatge (punts, es permet negatiu)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Estadístiques de %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Mida no vàlida del vector d'entrada" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Estadístiques" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Determina les estadístiques d'un conjunt inputVector donat." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Objecte connector de compartiments sincronitzats" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Error: Mida no vàlida del vector d'entrada X" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Error: Les longituds dels vectors d'entrada no coincideixen" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Error: Com a mínim cal 2 compartiments" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Compartiments sincronitzats" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Afegeix de forma sincronitzada el vector Y en els compartiments escalars " "d'entrada definits pel vector X. Com un mapa en 1D." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Nombre de compartiments" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X mín" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X màx" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Passabanda %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Filtre passabanda" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtra un vector amb un filtre passabanda de fase zero amb una resposta " "d'amplitud «Butterworth»." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Vector d'entrada - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Ordre de filtratge:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Freqüència central / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Amplada de banda:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Banda eliminada %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Filtre de banda eliminada" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtra un vector amb un filtre de banda eliminada de fase zero amb una " "resposta d'amplitud «Butterworth»." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Ordre de filtratge:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Freqüència central / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Amplada de banda:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Passaalt %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Filtre passaalt" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtra un vector amb un filtre passaalt de fase zero amb una resposta " "d'amplitud «Butterworth»." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Ordre de filtratge:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Freqüència de tall / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Passabaix %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Filtre passabaix" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtra un vector amb un filtre passabaix de fase zero amb una resposta " "d'amplitud «Butterworth»." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Ordre de filtratge:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Freqüència de tall / Freqüència de mostreig:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Mitjana acumulada de %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Mitjana acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Mitjana acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Mitjana acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Calcula la mitjana acumulada del vector d'entrada." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Integral %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Suma acumulada" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Calcula la suma acumulada (integral) del vector d'entrada." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Pas (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "Eliminació de pics %1" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Eliminació de pics" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtre d'eliminació de pics: %1\n" " Espaiat: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "S'han eliminats pics de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Filtre d'eliminació de pics" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Cerca i elimina els pics usant una diferència de 3 punts." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Espaiat:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Derivada %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Derivada" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivada: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Error: El pas de l'escalar d'entrada no ha de ser 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Diferenciació en passos fixos" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Calcula la derivada discreta d'un vector d'entrada" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Pas (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Terminació %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Terminació" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtre de terminació: %1\n" " %2 - %3\n" " Pas: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Terminació de %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Filtre de terminació" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Termina les dades que s'han ajustat" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Mínim:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Màxim:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Pas màx. (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Exponencial no ponderat %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Residus d'ajustament exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponencial ajustat" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Genera un ajust exponencial per a un conjunt de dades." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Exponencial ponderat %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Residus d'ajustament exponencial" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Exponencial ponderat ajustat" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Genera un ajust ponderat exponencial per a un conjunt de dades." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Gaussià no ponderat %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residus d'ajustament gaussià" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaussià ajustat" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Genera una ajust gaussià per a un conjunt de dades." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Gaussià ponderat %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residus d'ajustament gaussià" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Gaussià ajustat ponderat" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Genera una ajust gaussià ponderat per a un conjunt de dades." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "Gradient no ponderat %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Residus d'ajustament de gradient" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient ajustat al límit inferior" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient ajustat al límit superior" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Gradient ajustat" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Genera una ajust de gradient per a un conjunt de dades." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Gradient ponderat %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Residus d'ajustament de gradient" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient ajustat al límit inferior" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient ajustat al límit superior" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Gradient ajustat ponderat" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Genera una ajust de gradient ponderat per a un conjunt de dades." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Connector d'ajust de freqüència de tall" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Error: Les mides dels vectors d'entrada no coincideixen" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Error: Vector d'entrada X no vàlid" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Error: Les freqüències d'entrada no són vàlides\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Error: Dades d'entrada no vàlides.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Ajust de freqüència de tall" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Genera una ajust de freqüència de tall per a un conjunt de dades." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Escalar d'entrada - Freq. màx. 1/f^a" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Escalar d'entrada - Freq mín. soroll blanc" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Escalar d'entrada - Soroll blanc C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "Lineal no ponderat %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Lineal ajustada a %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Residus d'ajustament lineal" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineal ajustada al límit inferior" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineal ajustada al límit superior" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Lineal ajustat" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Genera un ajust lineal per a un conjunt de dades." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "Lineal ponderat %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Lineal ajustat a %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Residus d'ajustament lineal" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineal ajustada al límit inferior" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineal ajustada al límit superior" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Lineal ajustat ponderat" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Genera un ajust lineal ajustat per a un conjunt de dades." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Lorentz %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residus d'ajustament de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Lorentz ajustat" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Genera un ajust de Lorentz per a un conjunt de dades." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Lorentz ponderat %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residus d'ajustament de Lorentz" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Ajustat de Lorentz ponderat" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Genera un ajust de Lorentz ponderat per a un conjunt de dades." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Polinòmic %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajust polinòmic a %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residus d'ajust polinòmic" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Ajust polinòmic" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Genera un ajust polinòmic per a un conjunt de dades." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Ordre:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Polinòmic ponderat %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajust polinòmic a %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residus d'ajust polinòmic" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Ajust polinòmic ponderat" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Genera un ajust polinòmic ponderat per a un conjunt de dades." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Escalar d'entrada - Ordre" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Sinusoïdal %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïdal ajustat a %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residus d'ajust sinusoïdal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Ajust sinusoïdal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Genera un ajust sinusoïdal per a un conjunt de dades." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmònics:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Període:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Sinusoïdal ponderat %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïdal ajustat a %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residus d'ajust sinusoïdal" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Ajust sinusoïdal ponderat" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Genera un ajust sinusoïdal ponderat per a un conjunt de dades." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Escalar d'entrada - Harmònics" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Escalar d'entrada - Període" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Mostra de vector d'entrada" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Insereix un &vector nou" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Insereix un e&scalar nou" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Edita" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Insereix un e&scalar nou" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Insereix una &cadena nova" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Edita" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Paleta de c&olors:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Aparença" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Ponderació:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Tipus de punt" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Si s'ha activat «Mostra els punts», es dibuixarà el tipus de punt " "seleccionat en cada punt de dades." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Tipus de línia" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Si s'ha activat «Mostra les línies», s'usarà l'estil de línia seleccionat." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "En activar això, es dibuixaran les línies entre els punts de dades." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Línies" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "En activar això, es dibuixaran els punts en cada punt de dades." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "P&unts" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Cap" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Gràfic de &barres" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Amplada de línia" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Si s'ha activat «Mostra les línies», s'usarà l'amplada de línia seleccionada." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Mida:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Densitat dels punts:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Tots" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Alta" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Mitjana" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Baixa" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Emplaçament" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Escala els tipus de lletra" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Situa en un gràfic &nou" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "En una pestanya no&va" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "El nom del fitxer de dades que es llegirà per aquest vector." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Situa en un gràfic &existent " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "No situïs en c&ap gràfic" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Disposició automàti&ca" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "&Graella personalitzada" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Colu&mnes" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Protegeix la disposició existent" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Selecciona la corba a utilitzar." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "quadres" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Interval de dades" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Seleccioneu això per fer la mitjana conjunta dels quadres omesos. " "Proporciona un filtratge de pas baix simple." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Primer el &filtre «boxcar»" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Estalvia memòria fent un mostreig dispers de dades" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Seleccioneu això per ometre quadres, en lloc de llegir totes les dades. És " "útil per llegir fitxers de dades molt llargs però amb canvis lents." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Llegeix &1 mostra per:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "" "Seleccioneu això per llegir totes les dades fins el final del fitxer. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Ll&egeix fins el final" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "o" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccioneu això per llegir les dades des del final del fitxer. Això és útil " "per per desplaçar les visualitzacions quan el fitxer l'està actualitzant pel " "final una altra aplicació." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "C&ompta des del final" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Nombre de quadres a ometre, si s'ha seleccionat «Llegeix 1 mostra per»." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " quadre(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Inici:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Inte&rval:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Introduïu un número (començant des de 0 pel primer valor), o el format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] per dates." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "L'índex de la primera dada llegida. Per fitxers ASCII, aquest és el numero " "de fila de la dada en el fitxer. Per fitxers basats en quadres, aquest és el " "primer quadre." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "La quantitat de dades a llegir en el vector. Per fitxers ASCII files, aquest " "és el nombre de files de dades. Per fitxers de quadres, pot haver-hi més " "d'una mostra per quadre. Les dates s'introdueixen en el format [[[[YYYY:]MM:]" "DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Fitxer no trobat.\n" "Verifiqueu el nom correcte de fitxer que s'ha indicat." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Opcions FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Per defecte" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "Cosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussià (Sigma personalitzada)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Seleccioneu de la llista desplegable l'origen per a les barres d'error de " "l'eix y de la corba. Si se selecciona «Cap», no es dibuixaran barres d'error " "de l'eix y. Crea vectors nous amb la pestanya «Vectors»." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodit&za" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ció:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "E&limina la mitjana" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Longitud FFT: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Defineix la longitud de les FFT en generar l'espectre de potència. 2^10 = " "1024, etc. Quan més gran és el nombre, més gran serà el soroll i la " "resolució." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Mitjana interpola&da" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpola sobre els &forats" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Freqüència de &mostreig:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "La freqüència de mostreig amb la que s'han adquirit les mesures, per a una " "normalització adequada." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Aplica noves especificacions de mostreig de dades als vectors seleccionats." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Unitats del vector:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Les unitats del vector de dades - per etiquetes automàtiques." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Unitats de velocitat" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "Les unitats de la velocitat de mostreig. Usada per les etiquetes " "automàtiques." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Sor&tida:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Densitat espectral d'amplitud (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Densitat espectral de potència (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Espectre d'amplitud (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Espectre de potència (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Obre un fitxer" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Tots els fitxers (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Directori de fitxers de registre" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Desa el fitxer" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}," "\\overline{text sobreratllat}, x^y, x_y. Els escalars, " "equacions, i elements vectorials es poden incrustar. Escalar: [V1/Mitjana]" ". Element vectorial: [V1[4]]. Equació: [=[V1/Mitjana]^2]. " "El caràcter [ es pot inserir com a \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "El text d'etiqueta. Es permet un subconjunt del LaTeX. Cliqueu «Ajuda» per a " "l'ajuda." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Escalars i " "equacions
Els escalars i les equacions escalars es poden " "visualitzar en etiquetes en directe. Quan l'escalar s'actualitza, l'etiqueta " "s'actualitza. Els noms d'escalars s'autocompleten. El format és:

Escalar: " "[nom_escalar], p. " "ex. [GYRO1:Mean(X4)]

Element de vector:[nomVector[index]], p. ex., [GYRO1 (V2)[4]]

Equació: [=equació], p. ex. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Subconjunt del LaTeX implementat
Les etiquetes en el " "kst accepten un subconjunt derivat del LaTeX. Per exemple, per " "mostrar l'equació de l'àrea d'un cercle, podeu definir l'etiqueta a " "A=2\\pir^2. A diferència del LaTeX, no és necessari introduir el mode " "matemàtic usant «$». També, a diferència del LaTeX, les variables no es " "mostren automàticament en tipus de lletra cursiva. Si es desitja, això es " "pot fer explícitament usant \\textit{}. Les seqüències implementades són:

Lletres gregues: \\nom o " "\\Nom. p. ex.: \\alpha

Altres símbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Efectes de tipus de lletra: \\textcolor{nomcolor}" "{text acolorit}, " "\\textbf{text negreta},\\textit{text cursiva},\\underline{text subratllat}," "\\overline{text " "sobreratllat}.

Altres:x^y,x_y, \\t,\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "Permet símbols del LaTeX, cadenes i escalars, i equacions incrustades." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "Eti&queta:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Ajuda" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}," "\\overline{text sobreratllat}, x^y, x_y. Els escalars, " "equacions, i elements vectorials es poden incrustar. Escalar: [V1/Mitjana]" ". Element vectorial: [V1[4]]. Equació: [=[V1/Mitjana]^2]. " "El caràcter [ es pot inserir com a \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "El text d'etiqueta. Es permet un subconjunt del LaTeX. Vegeu «Què és això»." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccioneu un vector a utilitzar. Si voleu crear un vector nou, cliqueu en " "la icona de la dreta." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Crea un vector nou." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Obre un diàleg de vector per crear un vector nou, que esdevindrà el vector " "seleccionat." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Edita el vector seleccionat." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Obre un diàleg de vector per editar el vector seleccionat." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Diàleg" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Tanca" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Diàleg" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Cerca:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Seleccioneu un escalar a utilitzar. Si voleu crear un escalar nou, " "seleccioneu la icona de la dreta." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Crea un escalar nou." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Edita l'escalar seleccionat." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Seleccioneu una cadena a utilitzar. Si voleu crear una cadena nova, " "seleccioneu la icona de la dreta." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Crea una cadena nova." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Edita la cadena seleccionada." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccioneu un vector a utilitzar. Si voleu crear un vector nou, cliqueu en " "la icona de la dreta." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Crea un vector nou" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Obre un diàleg de vector per crear un vector nou, que esdevindrà el vector " "seleccionat." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Edita el vector seleccionat." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Obre un diàleg de vector per editar el vector seleccionat." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Estris del Kst" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Decaïment espectral acumulat" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Edita un decaïment espectral acumulat" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Decaïment espectral acumulat nou" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "CSD: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Error en crear un CSD des del fitxer Kst." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "" #~ "Error en crear un CSD des del fitxer Kst. No s'ha trobat cap Vector." #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Edita " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Nou " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Edita " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Connector" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Nou " #, fuzzy # ~| msgctxt "AsciiSource|" # ~| msgid "reading field" #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "camp de lectura" #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Usa Open&GL" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "S'estan cercant les files..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "La cerca de files ha finalitzat" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Cerca de files: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "lectura de columna" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Depuració" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Depura" Kst-2.0.8/po/kst_common_pl.po0000644000175000017500000111764512362706252015224 0ustar synthsynth# Łukasz Wojniłowicz , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-06-29 14:19+0200\n" "Last-Translator: Łukasz Wojniłowicz \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Zastosuj te ustawienia jako domyślne" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Podejrzyj pierwszych 1000 wierszy w nowym oknie" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Pierwsze wiersze " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Podgląd]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Nagłówek" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Dane zaczynając się od wiersza:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Odczytaj nazwy pól z wiersza:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Odczytaj jednostki z wiersza:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Wskaźniki komentarza:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Tutaj możesz użyć więcej symboli niż jednego, jak np. \"#!C\", ale należy " "mieć na uwadze, że spowolni to odczytywanie plików ASCII" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Rozdzielnik dziesiętny:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Kropka" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Przecinek" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Układ kolumn danych" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Oddzielone odstępem/tabulatorem" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Własny rozdzielacz" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "Odczytanie może być szybsze, przy założeniu, że każda kolumna ma swoją stałą " "szerokość." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Każda kolumna ma\n" "swoją stałą szerokość" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Stała szerokość" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Opcje ogólne" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Ogranicz rozmiar bufora:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Użyj wątków" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Zawsze przyjmuj pliki pasujące do:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Puste wartości rozpoznaj jako:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Poprzednia wartość" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretacja Daty/Czasu" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Wartość" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Interpretuj pole" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "jako:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Czas C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Sekundy" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Indeks z częstotliwością" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Sformatowany ciąg znaków. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Odnieś się do dokumentacji QDateTime po szczegóły.
Możesz użyć połączenia " "y,M,d dla dat oraz h,m,s,z dla czasów (z dla milisekund).
Dozwolony jest " "odstęp pomiędzy kolumnami daty i czasu, ale pierwszą kolumnę należy wybrać " "jako wektor X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr "" " d=dzień, M=miesiąc, y=rok, h=godzina, m=minuta, s=sekunda, z=milisekunda" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Przesunięcie" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Data/Czas:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Data pliku" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Względny" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Pierwsze wiersze pliku '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "Wiersz %1 nie może wyszczególniać nazw pól ORAZ wartości!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "Wiersz %1 nie może wyszczególniać jednostek ORAZ wartości!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "Wiersz %1 nie może wyszczególniać nazw pól ORAZ jednostek!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Niespójne parametry" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Czytnik plików ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Przetwarzanie %1 ..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Ukończono przetwarzanie '%1'" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Przetwarzanie '%1': %2 wierszy" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Odczytywanie pola: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "Utworzono INDEKS" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Ukończono odczytywanie: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "odczytywanie ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "przetwarzanie ..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Kolumna %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Czytnik DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Czytnik źródła obrazów FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Czytnik źródeł danych Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Czytnik źródeł danych .mat z Matlaba" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Czytnik netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Czytnik źródła QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Czytnik źródeł danych próbek" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Czytnik wykazu źródłowego" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Kolumna %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Plik danych dla macierzy %1 nie został otworzony." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Plik danych dla wektora %1 nie został otworzony." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Macierz danych: %1\n" " %2\n" " Pole: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 z %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Plik danych dla wektora %1 nie został otworzony." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Plik danych dla skalara %1 nie został otworzony." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Skalar danych: %1 = %4\n" " %2\n" " Pole: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 z %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "klatki" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Ścieżki znajdywania wtyczek:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Poszukiwanie wtyczek źródeł danych." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Wczytano wtyczkę: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "nieudane wystąpienie dla %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Plik '%1' nie istnieje." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Nie można znaleźć źródła danych dla '%1'(%2), ale poprzednio takie " "znaleziono. Coś jest nie tak z Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Plik danych dla ciągu znaków %1 nie został otworzony." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Ciąg znaków danych: %1 = %4\n" " %2\n" " Pole: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 z %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Plik danych dla wektora %1 nie został otworzony." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Wektor danych: %1\n" " %2\n" " Pole: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Ostatnie %1 klatek." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Ramka %1 do końca." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 Klatki zaczynające się od %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Odczytaj 1 próbkę na %1 klatek." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Uśrednij każde %1 klatek." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 z %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Błąd" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Ostrzeżenie" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Uwaga" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Ślad" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Inne" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Wersja Kst %1\n" "\n" "\n" "Dziennik Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Wtyczki źródeł danych:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Edytowalny wektor: %1\n" " %2 wartości" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Wygenerowany wektor: %1\n" " %2 wartości od %3 do %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 punkty od %1 do %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "Zapisana macierz zawiera mniej danych niż twierdzi." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Macierz: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Błąd przy tworzeniu wygenerowanej macierzy z pliku Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Błąd przy tworzeniu edytowalnej macierzy z pliku Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Błąd przy tworzeniu macierzy danych z pliku Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Skalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Skalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Wartość: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Błąd przy tworzeniu skalara z pliku Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Ciąg znaków: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Błąd przy tworzeniu ciągu znaków z pliku Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Dostawca: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Wektor: %1\n" " %2 próbek\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Błąd przy tworzeniu wektora z pliku Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Błąd przy tworzeniu wygenerowanego wektora z pliku Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Plik danych dla skalara %1 nie został otworzony." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Dane skalara: %1 = %4\n" " %2\n" " Pole: %3:\n" " Ramka: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 ramka %3 z %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Program do przeglądania danych.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Poprawka %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Strona domowa:
http://kst-plot.kde.org/" "
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Proszę zgłaszać błędy za pośrednictwem 'Pomocnika Zgłaszania Błędów' z manu " "'Pomoc'.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autorzy i współtwórcy (uporządkowani alfabetycznie):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "O Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Ustawienia Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Ogólne" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Skalowanie" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Siatka" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Właściwości układu" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Strzałka" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Błąd przy tworzeniu obiektu strzałki z pliku Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Utwórz strzałkę" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Właściwości" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "WłaściwościStrzałki" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "&Strzałka na początku" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Skala początkowej s&trzałki" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Rozmiar grotu strzałki" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "Rozmiar grotu strzałki jest proporcjonalny do tej wartości." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "&Strzałka na końcu" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Skala &końcowej strzałki" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Oś" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Zgrubnie" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normalnie" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Drobno" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "BardzoDrobno" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Linia ciągła" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Linia kreskowana" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Linia kropkowana " #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Linia kreska-kropka" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linia kropka-kropka" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Własna linia kreskowana" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Ukryj lewo" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Ukryj prawo" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Ukryj marginesy i etykiety" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Ukryj górę" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Ukryj dół" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Obrót etykiety" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Obrót :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Tryb podstawy / przesunięcia" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Samoczynny" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Wł." #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Wył." #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Cyfr przed samoczynnym trybem podstawy/przesunięcia:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Jeśli tyle cyfr jest potrzebnych do wyświetlenia liczb kres, to oś przestawi " "się na tryb podstawa/przesunięcie." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Wymuś przesunięcie do minimum osi" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Skala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarytmiczna" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "Odwróć stronę na kierunku osi, tak że liczby maleją zamiast rosnąć." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Odw&róć" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Oś jest czasem" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpretuj oś jako czas." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpretuj jako:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Rodzaj kodowania czasu" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "Oś przedstawia czas, którego kodowanie zostało wybrane tutaj." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Wyświetl jako:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Format wyświetlania czasu" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Jeśli oś ma być interpretowana jako czas, to wyświetlaj czas na osi w tym " "formacie." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Strefa czasowa:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Format Czasu/Daty:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Data: y/M/d - Czas: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Główne kresy i linie" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "&Rysuj kresy" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Rysuj linie &siatki" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Główne odstę&py:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Gęstość głównych kres" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Określ gęstość głównych kres. Odstęp głównych kres zostanie samoczynnie " "wybrany jako potęga 10 razy 1, 2, lub 5. Zmienia to rozmieszczenie " "docelowych kres wewnątrz tego ograniczenia." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "Styl linii &siatki:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Kolor linii siatki:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Szerokość:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Pośrednie kresy i linie" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "&Rysuj kresy" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Rysuj linie siatki" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Liczba pośrednich &kres:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Samoczynnie" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "St&yl linii:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "&Kolor linii:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: Nie znaleziono pliku. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Okno dialogowe" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "EtykietaTekstowa" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Wybierz nowy plik danych:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Nieznany rodzaj pliku" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Kon&figuruj..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Zmień" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Pomiń" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Podstawowa wtyczka" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Edytuj wtyczkę %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Nowa wtyczka %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Nie można utworzyć obiektu wtyczki przy użyciu podanych parametrów.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Wejścia i wyjścia" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Pole" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Błąd przy tworzeniu obiektu pola z pliku Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Utwórz pole" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bit" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bit" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Pomocnik zgłaszania błędów" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Wersja Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "System:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Aby podesłać zgłoszenie błędu naciśnij na poniższym przycisku.\n" "Otworzy to okno przeglądarki sieciowej na http://bugs.kde.org gdzie będzie " "czekać formularz do wypełnienia.\n" "Informacje wyświetlone powyżej zostaną przesłane do tego serwera." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Uruchom pomocnika zgłaszania błędów" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Przycisk" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Błąd przy tworzeniu obiektu przycisku z pliku Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Wykres kartezjański" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "klatki" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Niewystarczająco pamięci" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Zażądano odczytu %1 MB danych, lecz wygląda na to, że masz w przybliżeniu %2 " "MB użytecznej pamięci. Nie możesz wczytać takiej ilości danych." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Zmień próbki danych" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Wybór wektora" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Plik źródłowy dla wektorów wybranych z tego wykazu zostanie zmieniony." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Wybierz wszystkie wektory z wykazu." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "&Dodaj wszystkie" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "Dod&aj" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Odznacz wszystkie wektory z wykazu." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Usuń" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "&Usuń wszystko" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Nie można wczytać pliku lub nie zawiera on danych." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "Następujące pole nie zostało określone dla żądanego pliku:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Następujące pola nie zostały określone dla żądanego pliku:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Zmień plik danych" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Wybierz po pliku źródłowym" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Dodaj &wszystkie od:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Wybór wektora i macierzy" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Plik źródłowy dla wektorów wybranych z tego wykazu zostanie zmieniony." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Wybierz wszystkie wektory z wykazu." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "&Dodaj wszystkie" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "Dod&aj" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Odznacz wszystkie wektory z wykazu." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Usuń" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "&Usuń wszystkie" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Nowy plik danych" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Plik" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "&Zmień wybrane wektory i macierze" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "&Powiel pochodne obiekty (krzywe, równania, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Powiel wybrane wektory i macierze" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Nieznany rodzaj pliku" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Kon&figuruj..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Przypisz kolor krzywej z pliku" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Przypisz kolory" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Kolor krzywej na podstawie:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Wektora &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Wektora &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "P&romienia" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "Śr&odka" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Zablokuj położenie do danych" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Okrąg" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Błąd przy tworzeniu obiektu okręgu z pliku Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Utwórz okrąg" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Rozmiar/Położenie" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "koniec" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Kolumna %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Użycie: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Użycie: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Użycie: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Użycie: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Użycie: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Użycie: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Użycie: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Użycie: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Użycie: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Nie podano plików danych\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "plik %1 nie istnieje\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Użycie: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Użycie: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Użycie: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Użycie: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Użycie: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Użycie: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Podwyższ w kolejności rysowania: Alt+Up" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Obniż w kolejności rysowania: Alt+Down" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "&Dostępne obiekty:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Odznacz wszystkie" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Zaznacz wszystkie" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Edytuj" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Podwyższ w kolejności rysowania: Alt+Up" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Obniż w kolejności rysowania: Alt+down" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Wyświetlane obiekty:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "grupaPrzyciskóww" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "TO I WSZYSTKO PONIŻEJ JEST DO TWORZENIA SKRYPTÓW I POWINNO BYĆ UKRYTE!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spektrogram" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Edytuj spektrogram" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Nowy spektrogram" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Zawartość spektrogramu" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Wektor danych:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Rozmiar okna:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Opcje obrazu" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Krzywa" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Edytuj krzywą" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Nowa krzywa" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Zawartość krzywej" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Wektor osi &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Wektor osi &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Słupek &błędu +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Słupek błędu &+Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Słupek błędu -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Słupek błędu &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Użyj słupka błędu +X dla -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "Użyj &słupka błędu +Y dla -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "&Pomiń w samoczynnie obliczonych zakresach osi" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nazwa:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "S&amoczynnie" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Edytuj wiele >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Edytuj jeden %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Tutaj podaj swój filtr (dozwolone symbole wieloznaczne)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Edytuj" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Stwórz krzywą" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Stwórz widmo mocy" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Stwórz spektrogram" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Stwórz histogram" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Zastosuj filtr" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Stwórz obraz" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Dodaj do wykresu" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Usuń z wykresu" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Zastosuj dopasowanie" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Usuń" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Zarządzanie danymi" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Odfiltruj:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Wszystkie kolumny" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nazwa" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Rodzaj" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Próbki" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Właściwości" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Uwzględnij wielkość liter" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Wyczyść" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Błąd przy tworzeniu źródła danych z pliku Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Przedział czasowy" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Zmień wykrywanie" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Brak uaktualnienia" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Podwyższ w kolejności rysowania: Alt+Up" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Obniż w kolejności rysowania: Alt+Down" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 dostępny wektor(y) " #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 wybrany wektor(y)" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Utwórz rysunki widm. Ustaw opcje FFT poniżej:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Niewystarczająco pamięci" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Zażądano odczytu %1 MB danych, lecz wygląda na to, że masz w przybliżeniu %2 " "MB użytecznej pamięci. Nie możesz wczytać takiej ilości danych." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Utwórz rysunki &XY. Ustaw właściwości wektora osi X poniżej:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Utwórz z p&ola:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Użyj istniejące&go:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "Pole używane jako oś X w krzywych XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Proszę wybrać źródło danych, na którym " "pracować. Zazwyczaj będzie to plik zawierający twoje dane punktów lub " "wektorów.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Nieznany rodzaj pliku" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Kon&figuruj..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Rodzaj uaktualnienia; użyj 'Przedziału czasowego' dla nielokalnych danych" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtry" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Nowy filtr" #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Jeśli chcesz, wybierz " "filtr do zastosowania na pola, które są odczytywane w:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Umieszczenie krzywej" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "Wszystkie krzywe n&a jednym wykresie" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 nowy wykres na krzywą" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "&Krąż po" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " wykresy" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Krąż po is&tniejących wykresach" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Wszystkie krzywe na wykresi&e" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Rozmieszczenie wykresu (Karty)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Wszystkie w bieżą&cej karcie" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Wszystkie w no&wej karcie" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY i widma w o&sobnych kartach" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Układ rysunku" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Samoczynny &układ" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Włas&na siatka" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Kolumny:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "Ch&roń istniejący układ" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Etykiety" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Przeskaluj wszystkie etykiety na karcie" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Współdziel oś na kracie" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Styl krzy&wej" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Tylko l&inie" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Tylko &punkty" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Linie i &punkty" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Tryb osi widma" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Oś X Lo&g" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Oś Y &Log" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legendy" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Wł." #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "W&ył." #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "&Samoczynnie" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "Pio&nowo" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Podwyższ w kolejności rysowania (Alt-up)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Wybierz (Alt-S): Przenieś podświetlone pola z wykazu dostępnych danych do " "wykazu danych wybranych do rysowania." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Usuń (Alt-R): Przenieś podświetlone pola z wykazu wybranych danych do wykazu " "dostępnych danych, tak aby nie były rysowane." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Wybrane dane: Wszystkie pola z wykazu zostaną narysowane." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Wybrane dane: Wszystkie pola z wykazu zostaną narysowane. Aby usunąć pola z " "tego wykazu, przeciągnij je na wykaz dostępnych danych, naciskając na nie " "podwójnie lub wybierając je z użyciem przycisku usuń (ikona z prawą strzałką " "lub Alt-R). Kolejność w jakiej pola są wyświetlone na tym wykazie jest " "kolejnością w jakiej zostaną narysowane." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Wybrane dane:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 wybranych wektorów" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtr znajdywania" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtr znajdywania: Pola pasujące do tego filtra zostaną podświetlone i " "przeniesione na górę wykazu dostępnych danych. Obsługiwane są symbole " "wieloznaczne '*' oraz '?' ." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Dołącza symbol wieloznaczny '*' do początku i końca filtra znajdywania, aby " "dopasować wszystko co zawiera w sobie tekst do znalezienia." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "&Znajdź" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Wybór pola: Zaznaczone pola zostaną narysowane." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Dostępne dane: To pole wyszczególnia wszystkie pola, które nie zostały " "wybrane do narysowania. Aby wybrać pole do narysowania, przenieś je do " "wykazu wybranych danych poprzez przeciągnięcie go myszą, podwójne " "naciśnięcie lub poprzez jego podświetlenie i naciśnięcie wybranego przycisku " "(prawa strzałka - jej skrót klawiszowy to Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Dostępne dane:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- wektor(y) dostępne" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Wersja %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Wersja %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Okno dialogowe debugowania Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informacja z budowy" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "Prześlij pocztą informacje debugowania" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Dziennik" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Poziom dziennika: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Błąd" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Ostrzeżenie" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Uwaga" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Ślad" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "&Wyczyść" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Źródła danych" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Wtyczka" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Wczytane wystąpienie" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "&Zamknij" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Wystąpił błąd. Naciśnij na tę ikonę po więcej szczegółów." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Czcionki" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "List" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Wykres dziennika" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Własny" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "Rozmiar naj&mniejszej czcionki (w punktach):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "Przy zmianie rozmiaru okna, rozmiar czcionki będzie co najmniej taki." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Rozmiar widoku odniesienia:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "W chwili gdy okno będzie tej wielkości, czcionki będą miały podany rozmiar." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Czcionki zostaną przeskalowane z rozmiarem okna lub wydruku. W chwili gdy " "okno/wydruk będzie tej wielkości, czcionki będą miały podany rozmiar." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Własny rozmiar odniesienia (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Zapisz jako domyślne" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Zastosuj do istniejących obiektów" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Przesuń wybraną właściwość w górę na wykazie priorytetów" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Przesuń wybraną właściwość w dół na wykazie priorytetów" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Dodaj wybraną właściwość do wykazu właściwości, po których można krążyć" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "Usuń wybraną właściwość z wykazu właściwości, po których można krążyć" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Kolor linii" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Styl punktu" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Styl linii" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Szerokość linii" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Różniczkuj krzywe" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Wybór właściwości i kolejność krążenia" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Podwyższ w kolejności wyboru: Alt+Up" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Obniż w kolejności wyboru: Alt+Down" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Dostępne:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Wybrane:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opcje" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Szerokość najszerszej linii:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Gęstość punktu:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Wszystkie" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Wysoka" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Średnia" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Niska" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Rozmiar/Położenie" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "Ob&rót:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Rozmiar:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Położenie" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Zablokuj współczynnik kształtu" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Zablokuj położenie do danych" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Nie można otworzyć pliku do zapisywania." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Nie można otworzyć pliku do odczytywania." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Plik jest zniekształcony i napotkano błąd przy jego odczytywaniu." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Wybierz obiekty do edytowania" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtr:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Wyczyść" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Z&aznacz wszystkie" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Elipsa" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Błąd przy tworzeniu elipsy z pliku Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Utwórz elipsę" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Równanie" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Edytuj równanie" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Nowe równanie" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Równanie" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "&Równanie:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Tutaj podaj równanie do obliczenia. Użyj 'x' jako niezależnej zmiennej. Z " "powyższej listy jest możliwość dobierania wektorów i operatorów." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Wektor &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpoluj do wektora o najwyższej rozdzielczości" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Monitor zdarzeń" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Edytuj monitor zdarzeń" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Nowy monitor zdarzeń" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Powiadamianie pocztą" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "P&owiadom:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Wyrażenie" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Wektory:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operatory:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Skalary:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Wyrażenie:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Opis:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "SkryptKst" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Wykonaj:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "&Powiadom:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Konfiguruj..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Dziennik debugowania Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Ostrzeżenie" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Błąd" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Uwaga" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Rejestruj jako:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Eksportuj do pliku graficznego" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Nazwa podstawowa:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Format pliku:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Rozmiar" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Szerokość:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Szerokość (w pikselach) obrazu." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Wysokość:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Wysokość (w pikselach) obrazu." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "&Podaj:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Szerokość i zachowaj współczynnik kształtu" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Wysokość i zachowaj współczynnik kształtu" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Szerokość i Wysokość" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Rozmiar kwadratu" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Opcje zapisu" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Nie zapisuj samoczynnie. Zamiast tego zapisz raz przy naciśnięciu OK lub " "Zastosuj." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "&Zapisz raz" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Zapisz obraz na czas" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Gdy zaznaczone, obraz będzie okresowo zapisywany w podanym odstępie czasu. " "Jest to użyteczne, na przykład dla obrazów ze stron sieciowych na żywo." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "S&amoczynny zapis co" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Czasomierz samoczynnego zapisu" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Samoczynne rozsz&erzenie" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Uwzględnij:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Formaty wektora" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Formaty bitmapy" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Eksportuj wektory" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Wybór wektora" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Plik źródłowy dla wektorów wybranych z tego wykazu zostanie zmieniony." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Wybierz wszystkie wektory z wykazu." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "&Dodaj wszystkie" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "Dod&aj" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Odznacz wszystkie wektory z wykazu." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Usuń" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "&Usuń wszystko" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Miejsce zapi&su:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Wypełnij" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Brak pędzla" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Jednolity wzorzec" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Gęsty wzorzec 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Gęsty wzorzec 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Gęsty wzorzec 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Gęsty wzorzec 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Gęsty wzorzec 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Gęsty wzorzec 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Gęsty wzorzec 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Poziomy wzorzec" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Pionowy wzorzec" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Krzyżowy wzorzec" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Wzorzec po przekątnej 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Wzorzec po przekątnej 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Krzyżowy wzorzec po przekątnej" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Kolor:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Styl:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Użyj &liniowego gradientu" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "Wyze&ruj gradient" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Wtyczka" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Edytuj wtyczkę %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Nowa wtyczka %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Nie można utworzyć obiektu wtyczki przy użyciu podanych parametrów.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Wybór wtyczki" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nazwa wtyczki:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Opis:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Wejścia i wyjścia" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "&Pomiń w samoczynnie obliczonych zakresach osi" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Ogólne" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Uaktualniaj dynamiczne pliki tak szybko lub wolniej." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Najkrótszy czas pomiędzy uaktualnieniami przy obserwowaniu dynamicznych " "plików. Jeśli będzie dużo do przetwarzania, to może to zająć dłużej." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "Okres &pomiędzy uaktualnieniami (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Użyj przezroczystości przy przeciąganiu" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Wyświetlanie wykorzystujące \"raster\". Zawsze jest to najlepsze." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Wyświetlanie wykorzystujące \"raser\" jest szybsze na niektórych " "architekturach, lecz ma dużo błędów na innych (w zależności od sterownika " "grafiki). To ustawienie może pomóc, ale może też sprawić, że sprawy będą " "się miały jeszcze gorzej." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Użyj silnika \"raster\" (wymagane ponowne uruchomienie)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Wygł&adzanie liniowe krzywych" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Siatka" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Pokaż &siatkę" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Przyciągaj do &siatki" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "P&oziome odstępy siatki:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "P&ionowe odstępy siatki:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogram" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Edytuj Histogram" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Nowy histogram" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Właściwości histogramu" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Wekto&r danych:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Przedział od&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "Niższa granica najniższego przedziału. Wartości poniżej tej granicy nie " "będą zaliczane do żadnego z przedziałów." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "do:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "Wyższa granica najwyższego przedziałów. Wartości powyżej tej granicy nie " "będą zaliczane do żadnego z przedziałów." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Liczba &przedziałów:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Liczba przedziałów na histogramie." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Ustaw górną i dolną granicę oraz liczbę przedziałów na rozsądną wartość " "domyślną." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "S&amoczynny przedział" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Samoczynny przedział w czasie &rzeczywistym" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalizacja osi Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "Oś Y na histogramie mówi o odsetku próbek w przedziale." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Odsetek w przedziale" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "Oś Y na histogramie mówi o liczbie próbek w przedziale." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "&Liczba w przedziale" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "Oś Y na histogramie jest znormalizowana tzn. że najwyższy przedział ma 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Szczytu przedział = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "Oś Y na histogramie mówi o procencie próbek w przedziale." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Procen&t w przedziale" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Obraz" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Edytuj obraz" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Nowy obraz" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Zawartość obrazu" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Macierz:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Rodzaj obrazka" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "Kolorowa m&apa" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Kon&turowa mapa" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "&Kolorowa mapa i konturowa mapa" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Parametry kolorowej mapy" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&Górna:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Próg - &niższy:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Inteligentny" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&yl: " #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Maks&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Samoczynny prób w czasie &rzeczywistym" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Parametry konturowej mapy" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Ko&lor:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Licz&ba poziomów konturów:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Waga:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Użyj zmiennej &wagi linii" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Okno dialogowe tworzenia etykiety" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Okno dialogowe" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Zablokuj położenie do danych" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Do prawej" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Do lewej" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Punkt odniesienia:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Pogrubienie" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " punkty" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "&Rodzina czcionek:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Kolor" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Rozmiar &czcionki:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Kursywa" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Zapisz jako domyślne" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Zablokuj położenie do danych" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Do prawej" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Do lewej" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Punkt odniesienia etykiety:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Obrót" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Położenie" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Etykieta" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Utwórz etykietę" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Właściwości" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Rozmiar/Położenie" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Właściwości etykiety" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "Składnia dla etykiet jest pochodną podzbioru LaTeX. Obsługiwana " "składnia to: \\[nazwa greckiej litery] i \\[Nazwa greckiej litery]" ", \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nazwa koloru}" "{tekst do zabarwienia}, \\textbf{tekst do wytłuszczenia}, " "\\textit{tekst do pochylenia}, \\t, \\sum, \\sqrt, " "\\underline{tekst do podkreślenia}, x^y, x_y. Jest " "możliwość osadzania elementów skalarnych, równań i wektorowych. Skalar: " "[V1/Średnia]. Element wektorowy: [V1[4]]. Równanie: [=[V1/" "Średnia]^2]. A [ Znaki można wstawiać jako \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Rozmiar &czcionki:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "&Rodzina czcionek:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Kursywa" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Pogrubienie" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " punkty" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Etykiety" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Domyślny rozmiar czcionki wykre&su:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "punkty" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Samoczynnie przeskaluj etykiety liczbowe osi" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Górna e&tykieta:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Samoczynnie" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Dol&na etykieta:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Lewa etykieta:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Pr&awa etykieta:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Pokaż le&gendę" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&dytuj" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Obsługuje skalary i ciągi znaków (nazwa w prostokątnych nawiasach) - np, " "[INDEKS:Maks (X2)],\n" "osadzone równania - np, [=[INDEKS:Maks] / 2]\n" "i symbole LaTeX - np,, \\theta. Nazwy i symbole są samoczynnie uzupełniane." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Pole układu" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Układ" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "P&oziomy margines:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "P&ionowy margines:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Po&ziomy odstęp:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Pionowy ods&tęp:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 względem %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Pusta legenda" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Wykres: %1 \n" "Zawartość:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Podwyższ w kolejności wykazu: Alt+Up" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Obniż w kolejności wykazu: Alt+Down" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Tytuł:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Samoczynnie użyj zawartości na podstawie wykresu" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Wyświetl w p&ionie" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "&Dostępne obiekty:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Wyświetlane obiekty:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Podwyższ w kolejności rysowania: Alt+Up" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Usuń: Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Wybierz: Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Obniż w kolejności rysowania: Alt+down" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Ustawienia czcionki legendy" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Rozmiar c&zcionki:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " punkty" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Pogrubienie" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Kursywa" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Rodzina czcionek" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Zablokuj położenie do danych" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "EdytowalnyWiersz" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Błąd przy tworzeniu obiektu EdytowalnyWiersz z pliku Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Linia" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Przenieś" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Zmień rozmiar" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Błąd przy tworzeniu obiektu linii z pliku Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Utwórz linię" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Rozmiar/Położenie" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Skrypt: Uruchomiony" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Skrypt: Ukończony" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Skrypt: zwrócony kod %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Błąd skryptu: Nieudane uruchomianie" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Błąd skryptu: Awaria" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Błąd skryptu:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Stwórz wpis dziennika" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Uruchom ponownie sk&rypt" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Skrypt" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "Z&astosuj" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "&Zamknij" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Wiadomość" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "Wiado&mość:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "Wy&czyść" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Wynik działania skryptu:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Konfiguracja" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Właściwości wykresu" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Szerokość:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Szerokość i zachowaj współczynnik kształtu" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Wysokość i zachowaj współczynnik kształtu" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Szerokość i Wysokość" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Rozmiar kwadratu" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Wysokość:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Wysokość (w pikselach) obrazu." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Format pliku:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "&Podaj:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Szerokość (w pikselach) obrazu." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Katalog lokalnego dziennika:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Skrypt:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Zmiennych $user, $imagefile oraz $messagefile można użyć w wykazie " "argumentów." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "Nazwa &użytkownika:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Pytanie o zapisanie" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Twój dokument został zmodyfikowany.\n" "Czy zachować zmiany?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Zapisz plik" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sesje Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Otwórz plik" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "Wy&czyść nieistniejące pliki" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Po szczegóły zobacz Pomoc->Okno dialogowe debugowania->Dziennik." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Błąd przy otwierania dokumentu:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Otwórz..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Otwórz nową sesję" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "Zapi&sz" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Zapisz bieżącą sesję" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Z&apisz jako..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "No&wa sesja" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Zakończ bieżącą sesję, a następnie uruchom nową i pustą" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Ponownie wczytaj wszystkie źró&dła danych" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Ponownie wczytaj wszystkie źródła danych" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Drukuj..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Wydrukuj bieżący widok" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Eksportuj jako obraz(y)..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Eksportuj grafikę na dysk" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Zapisz &wektory na dysk..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Eksportuj wektory do pliku ascii" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Wpis &dziennika..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Wyślij wpis dziennika" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Nowa karta" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Utwórz nową kartę" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "&Zamknij kartę" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Zamknij bieżącą kartę" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Wyjdź" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Wyjdź z programu" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Wektory" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Pokaż wszystkie wektory w arkuszu kalkulacyjnym" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Skalary" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Pokaż wszystkie skalary w arkuszu kalkulacyjnym" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Macierze" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Pokaż wszystkie macierze w arkuszu kalkulacyjnym" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "&Ciągi znaków" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Pokaż wszystkie ciągi znaków w arkuszu kalkulacyjnym" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "&Wstecz o jeden ekran" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Wstecz o jeden ekran" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "W&przód o jeden ekran" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Wprzód o jeden ekran" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "Li&cz od końca" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Ustaw wszystkie wektory danych na tryb liczenia od końca" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Czytaj do końca" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Ustaw wszystkie wektory danych na tryb czytania od końca" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Wstrzymaj" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Wstrzymuje uaktualnianie źródeł danych" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Zmień zakre&s próbek danych..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Pokaż okno dialogowe Kst zmiany zakresu próbek danych" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Wykres" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Utwórz wykres dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Skalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Wektor" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Macierz" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Cią&g znaków" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Krzywa" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "Równani&e" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "&Widmo mocy" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histogram" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Obraz" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spektr&ogram" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Mo&nitor zdarzeń" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Etykieta" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Utwórz etykietę dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Pole" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Utwórz pole dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Okrąg" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Utwórz okrąg dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Elipsa" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Utwórz elipsę dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Linia" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Utwórz linię dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "Strz&ałka" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Utwórz strzałkę dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Obraz" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Utwórz obraz dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&Svg" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Utwórz obraz svg dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Pole współdzielonej osi" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Utwórz pole współdzielonej osi dla bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "&Przełącz powiązane przybliżenie" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Przełącz powiązane przybliżenie bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Powiąż we wszystkich k&artach" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Powiązane przybliżenie ma zastosowanie w kartach" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Podświetl punkty danych" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Podświetl najbliższe punkty danych" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "Przewiń pr&zybliż X-Y" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Przybliż dowolnie w kierunku X lub Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Przybliż tylko w &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Przybliż tylko w kierunku X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Przybliż tylko w &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Tryb &układu" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Przełącz tryb układu bieżącego widoku" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "Zarządzanie &danymi" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Pokaż okno zarządzania danymi Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Pomocnik &danych" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Pokaż pomocnika danych Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Zmień &plik danych" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Pokaż okno dialogowe Kst zmiany pliku danych" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Przypisz &kolor krzywej na plik" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Pokaż okno dialogowe Kst wyboru koloru" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Różn&iczkuj krzywe" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Pokaż okno dialogowe Kst różniczkowania krzywych" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Konfiguracja Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Pokaż okno dialogowe Kst konfiguracji" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "Mo&tyw" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Pokaż okno dialogowe Kst motywu" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Okno dialogowe &debugowania" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Pokaż okno dialogowe Kst debugowania" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Pomocnik zgłaszania &błędów" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Pokaż pomocnika zgłaszania błędów Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "O progr&amie" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Pokaż pole o programie Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Plik" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "&Ostatni sesje" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Ostatnie &pliki danych" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Edycja" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Widok" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Zak&res" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Utwórz" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Standardowa &wtyczka" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Wtyczka &dopasowania" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Wtyczka fil&tra" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Przypis" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Tryb" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Tryb interakcji" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Narzędzia" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "U&stawienia" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Pomoc" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Plik" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Edycja" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Narzędzia" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Zakres danych" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Tryb" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Układ wykresu" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Zaawansowany układ" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Gotowy" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Znaczniki" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Linia ciągła" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Linia kreskowana" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Linia kropkowana " #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Linia kreska-kropka" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linia kropka-kropka" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Własna linia kreskowana" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Już istnieje znacznik wykresu z równą (lub bardzo bliską) wartością." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "Tekst, który wpisano, nie jest prawidłową liczbą." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Znaczniki osi" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Nowy punkt znaczący: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "Dod&aj" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "&Obecne znaczniki" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "Wy&czyść" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Usuń" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Wygląd znacznika" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "St&yl linii:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Ko&lor linii:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "&Szerokość linii:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Samoczynne znaczniki" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Użyj krzywej jako źródła &znacznika:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Utwórz znaczniki na:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Wschodzącej krawędz&i" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "Opadającej &krawędzi" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "O&bu" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Użyj &wektora jako źródła znacznika:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Macierz" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Edytuj macierz" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Nowa macierz" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Skalowanie i przesunięcie" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "Ro&zmiar kroku X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "Minimum &X:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "Minimum &Y:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Ro&zmiar kroku Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Parametry gradientu" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Zwiększ/zmniejsz wartości Z wzdłuż:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Osi X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Osi Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z przy minimum:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "X kroków:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Y kroków:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z przy maksimum:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Zakres danych" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "lub" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Początkowa r&amka Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "&Liczba klatek X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "Licz &od końca" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Czytaj do końca" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "L&iczba klatek Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "C&zytaj do końca" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Licz o&d końca" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Początkowa &ramka X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " klatki" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Najpierw od&filtruj boxcar" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Odczytaj &1 próbkę na" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Źródło" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Odczytaj ze źródła danych" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Utwórz gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Parametry źródła danych" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "&Pole lub kolumna:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nazwa pliku:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "Połą&cz" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Ko&nfiguracja..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "Dostępnych %1 MB" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Rozmiar c&zcionki:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "&Rodzina czcionek:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Użyj domyślnej czcionki wykresu" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " punkty" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Zdjęcie" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Otwórz obraz" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Błąd przy tworzeniu obiektu zdjęcia z pliku Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Utwórz zdjęcie" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Lat]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dni]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Godzin]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minut]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Sekund]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Wykres" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Przybliż maksymalnie" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Przybliżenie niewrażliwe na maksymalny impuls" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Przybliż poprzednią" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Powiązane przybliżenie" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Powiązane przybliżenie X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Powiązane przybliżenie Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Przybliżenie wyśrodkowane na średniej Y" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "X-Przybliż maksymalnie" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "X-Samoczynne obramowanie przybliżenia" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "X-Przybliżenie niewrażliwe na impuls" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "X-Przybliż na prawo" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "X-Przybliż na lewo" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "X-Oddal" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "X-Przybliż" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalizuj oś X do osi Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Logarytmiczna oś X" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Y-Przybliż do lokalnego maksimum" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Y-Przybliż do maksimum" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "X-Samoczynne obramowanie przybliżenia" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "X-Przybliżenie niewrażliwe na impuls" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Y-Przybliż w górę" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Y-Przybliż w dół" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Y-Oddal" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Y-Przybliż" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalizuj oś Y do osi X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Logarytmiczna oś Y" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Dostosuj skalę kolorów obrazu" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maksymalizuj wykres" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Wykresy współdzielące oś X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Wykresy współdzielące oś Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Pole zerwania współdzielenia osi" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Kopiuj współrzędne" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Kopiuj współrzędną X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Kopiuj współrzędną Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Kopiuj" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Powiększ" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtr" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Edytuj krzywą" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Dopasuj" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Ustawienia pola współdzielenia osi" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Informacje skopiowane do schowka: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Współrzędna X skopiowana do schowka: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Współrzędna Y skopiowana do schowka: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Wykres: %1 \n" "Zawartość:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Pusty wykres" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Błąd przy tworzeniu obiektu wykresu z pliku Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Utwórz wykres" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Utwórz wykres dla krzywej" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Stałe wyrażenie przybliżania" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Wyrażenie przybliżania zakresu X" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Przybliż maksymalnie" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Przybliżenie niewrażliwe na maksymalny impuls" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Przybliżenie wyśrodkowane na średniej" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Przybliżenie wyśrodkowane na średniej X" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Przybliżenie wyśrodkowane na średniej Y" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Przybliż maksymalnie X" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Samoczynne obramowanie przybliżenia X" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Przybliżenie niewrażliwe na impuls X" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Przewiń X w prawo" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Przewiń X w lewo" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Oddal X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Przybliż X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Przybliż normalizując X do Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Przybliż Y do lokalnego maksimum" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Przybliż Y do maksimum" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Samoczynne obramowanie przybliżenia Y" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Przybliżenie niewrażliwe na impuls Y" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Przybliż Y w górę" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Przybliż Y w dół" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Oddal Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Przybliż Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Przybliż normalizując Y do X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Przybliż logarytmując X" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Przybliż logarytmując Y" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Edytuj element wykresu" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Zawartość" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Czcionka na górze" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Czcionka na dole" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Czcionka po lewej" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Czcionka po prawej" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Czcionka osi" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Etykiety" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Zakres/przybliżenie" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Oś X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Oś Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Znaczniki osi X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Znaczniki osi Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Czcionka na górze*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Czcionka na dole*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Czcionka po lewej*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Czcionka po prawej*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Czcionka osi*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Wyświetlanie wykresu" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Tryb odniesienia" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 względem %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Widmo mocy" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Edytuj widmo mocy" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Nowe widmo mocy" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Zawartość widma mocy" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Wekto&r danych:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nazwa" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Wartość" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Zakres" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Tryb przybliżania X " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "&Samoczynny" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Samoczynny z o&bramowaniem" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Samoczynny niewrażliwy na im&puls" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "Wyśrodkowany na śr&edniej, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "za&kres: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "s&tały, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "o&d: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "d&o: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "TO POWINNO BYĆ UKRYTE" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Tryb przybliżania Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "S&amoczynny" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Samoczynny z o&bramowaniem" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Samoczynny niewrażliwy na impul&s" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Wyśrodkowany na śre&dniej, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "zak&res: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "st&ały, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "o&d: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "d&o: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Skalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Edytuj skalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Nowy skalar" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Odczytaj ze źródła &danych" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Utwórz nowy wektor z właściwościami danymi tutaj jako niezależne zmienne." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Odczytaj ze &wektora danych" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "Wy&generuj" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Odczytaj ze źródła danych" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nazwa pliku:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Pole:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "Połą&cz" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Ko&nfiguracja..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "&Ramka:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "lub" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Wybierz to, aby odczytywać dane z końca pliku. Jest to użyteczne do " "przewijania wyświetlaczy, gdy plik jest dołączony do innego programu." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "ostatnia ra&mka" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Generuj" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "W&artość: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Najwyższa wartość niezależnej zmiennej." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nazwa" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Rodzaj" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Próbki" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Właściwości" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Pole współdzielonej osi" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Pole zerwania współdzielenia osi" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "Błąd przy tworzeniu obiektu pola współdzielonej osi z pliku Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Utwórz pole współdzielonej osi" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Ciąg znaków" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Edytuj ciąg znaków" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Nowy ciąg znaków" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Odczytaj ze źródła &danych" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&Nazwa pliku:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "P&ole:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "Połą&cz" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Ko&nfiguracja..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "Wy&generuj" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Wartość: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Kreska" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Brak pióra" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Linia ciągła" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Linia kreskowana" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Linia kropkowana " #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Linia kreska-kropka" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linia kropka-kropka" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Własna linia kreskowana" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Brak pędzla" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Jednolity wzór" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Gęsty wzorzec 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Gęsty wzorzec 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Gęsty wzorzec 2" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Gęsty wzorzec 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Gęsty wzorzec 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Gęsty wzorzec 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Gęsty wzorzec 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Poziomy wzorzec" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Pionowy wzorzec" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Krzyżowy wzorzec" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Krzyżowy wzorzec" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Wzorzec po przekątnej 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Krzyżowy wzorzec po przekątnej" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Ostre połączenie" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Ścięte połączenie" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Zaokrąglone połączenia" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Ostre połączenie SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Płaskie zakończenie" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Kwadratowe zakończenie" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Zaokrąglone zakończenie" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Styl:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Szerokość:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "&Kolor pędzla:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "&Styl pędzla:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "&Styl połączenia:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Styl &zakończenia:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "Svg" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Otwórz obraz SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Błąd przy tworzeniu obiektu svg z pliku Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Utwórz Svg" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Widok &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Zmień nazwę karty" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Podaj nową nazwę karty:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "Dod&aj kartę" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Zmień nazwę karty" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "&Zamknij kartę" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Edycja widoku" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Uporządkuj układ" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Samoczynnie" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Własny" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Motyw" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Wypełnij" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Kreska" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Czcionki" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Rozmiar &czcionki:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "&Rodzina czcionek:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Kursywa" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Pogrubienie" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " punkty" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Zapisz jako domyślne" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Zastosuj do istniejących obiektów" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Wektor" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Przedział czasowy" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Zmień wykrywanie" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Brak uaktualnienia" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Edytuj wektor" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Nowy wektor" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "Wy&generuj" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Liczba próbek:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Liczba próbek dla nowej niezależnej zmiennej." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&Od:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Najmniejsza wartość niezależnej zmiennej." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&do:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Najwyższa wartość niezależnej zmiennej." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Odczytaj ze źródła &danych" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nazwa pliku:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "&Pole lub kolumna:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "Połą&cz" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Ko&nfiguracja..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Rodzaj uaktualnienia; użyj 'Przedziału czasowego' dla nielokalnych danych." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Edytuj" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Samoczynnie" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Chroń układ" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Własny" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Układ kolumn" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Układ w kolumnach w kolejności utworzenia.\n" "Wybierz liczbę kolumn:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Uporządkuj układ" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Widok menu" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Edytuj widok" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Wypełnij" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Edytuj" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Usuń" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Podnieś" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Obniż" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Samoczynnie" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Chroń układ" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Kolumny" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "Zab&lokuj położenie do danych" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Układ kolumn" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Układ w kolumnach w kolejności utworzenia.\n" "Wybierz liczbę kolumn:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menu %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Uporządkuj układ" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Przenieś" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Zmień rozmiar" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Przeskaluj" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Obróć" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Utwórz układ" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Dołącz element do układu" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Przenieś" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Zmień rozmiar" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Usuń" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Podnieś" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Obniż" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Przeskaluj" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Obróć" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Edytuj element widoku" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nazwa:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Edytuj wiele >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Wygląd" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Rozmiar/Położenie" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Edytuj jeden" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Widok macierzy" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Widok wartości ciągu znaków" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Widok wartości skalarów" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Widok prymitywów" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Uaktualnij" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Wybierz wektory do obejrzenia" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Obejrzyj wybrany wektor(y)" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Usuń wybrany wektor(y) z widoku" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Usuń" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Cyfry znaczące" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Pokaż jako całkowite" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (domyślnie)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Obejrzyj wartości wektorów" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Pokaż wykaz wektorów" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Ukryj wykaz wektorów" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Wyzeruj widok" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Zamknij" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Wystąpił błąd w algorytmie %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Wtyczka: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Błąd: nie można utworzyć obiektu danych z wtyczki" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Błąd: nie można znaleźć wtyczki dla obiektu danych" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Błąd przy tworzeniu obiektu wtyczki z pliku Kst." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Nie można przydzielić wystarczającej pamięci dla spektrogramu." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spektrogram: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Gęstość widmowa amplitud" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Gęstość widmowa mocy" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Widmo amplitud" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Widmo mocy" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Częstotliwość" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Czas" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spektrogram: %1\n" " Długość FFT: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Średnia; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodize; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Usuń średnią;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Błąd przy tworzeniu spektrogramu z pliku Kst." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Błąd przy tworzeniu spektrogramu z pliku Kst. Nie można znaleźć wektora." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Krzywa" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 względem %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 względem %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Krzywa: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "Błąd X+: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "Błąd X-: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Błąd Y+: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Błąd Y-: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Linie: Szerokość %1 i styl %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punkty: Styl %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Słupki" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Błąd przy tworzeniu krzywej z pliku Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "Błąd przy tworzeniu krzywej z pliku Kst. Nie można znaleźć wektora x." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "Błąd przy tworzeniu krzywej z pliku Kst. Nie można znaleźć wektora y." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Poszukiwanie wtyczek obiektów danych." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() przez tid=%2: wyjście " "blokowania zapisu%3 (nie dostawca) -- to prawdopodobnie błąd. Proszę " "wysłać wiadomość na kst@kde.org wraz ze szczegółami." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "Równanie zawiera nieznany obiekt [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Krzywa równania" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "Nie udało się znaleźć wektorów równania [%1] przy ponownym przetwarzaniu." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Nie udało się znaleźć wektorów równania [%1] przy zapisywaniu. W skutek tego " "plik wynikowy Kst może zawierać błędy." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Równanie [%1] odwołuje się do nieistniejących obiektów." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Nieudane przetwarzanie równania [%1]. Spodziewane błędy." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Błąd przetwarzania: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Równanie: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Błąd przy tworzeniu równania z pliku Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "Błąd przy tworzeniu równania z pliku Kst. Nie można znaleźć wektora x." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "zdarzenie" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Zdarzenie: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Błąd przy tworzeniu wpisu monitora zdarzeń z pliku Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Liczba" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Procent" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Ułamek" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Znormalizowana częstotliwość" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogram %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogram: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Samoczynny przedział " #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 przedziały do %2 do %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Błąd przy tworzeniu histogramu z pliku Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "Błąd przy tworzeniu histogramu z pliku Kst. Nie można znaleźć wektora." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Obraz %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Obraz: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Błąd przy tworzeniu obrazu z pliku Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "Błąd przy tworzeniu obrazu z pliku Kst. Nie można znaleźć macierzy." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Rok juliański" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Standardowy czas C" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Data juliańska" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Zmodyfikowana data juliańska" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Zredukowana data juliańska" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Międzynarodowy czas atomowy (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Czas Excela (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Sformatowany ciąg znaków" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Krzywa PSD" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Usiłowano utworzyć PSD, które wykorzystało całą pamięć." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Gęstość widmowa" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Widmo amplitud" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Widmo mocy" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Częstotliwość" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Widmo: %1\n" " Długość FFT: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Średnia; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodize; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Usuń średnią;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "w PSDCalculator::calculatePowerSpectrum: otrzymano macierz wyjściową ze złą " "długością." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Błąd przy tworzeniu PSD z pliku Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Błąd przy tworzeniu PSD z pliku Kst. Nie można znaleźć wektora." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Poziom aktywności %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Poziom aktywności" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Poziom aktywności: %1\n" " Czas próbkowania: %2 (s)\n" " Szerokość okna: %3 (s)\n" " Próg szumu: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Błąd: Wektor wejściowy zbyt krótki." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Błąd: okno musi być szersze." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Poziom aktywności" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Oblicza poziom aktywności sygnału jako wynik odchylenia standardowego i " "liczby zwrotów w przesuwającym się oknie." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Czas próbkowania (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Szerokość okna (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Próg szumu" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Obiekt wtyczki przedziału" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Błąd: Wektor wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Błąd: Brak przedziałów" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Przedział" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Umieszcza dane w przedziałach o podanym rozmiarze. Każdy przedział zawiera " "średnią elementów do niego należących." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Rozmiar przedziału" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Obiekt wtyczki Siekania" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Błąd: Wektor wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Siekaj" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Sieka zestaw danych w zestawy danych parzystych, nieparzystych, różnic oraz " "indeksów." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Obiekt wtyczki splotu" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Błąd: Wektory wejściowe o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Błąd: Obliczono nieprawidłową długość wejściową" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Spleć" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Tworzy splot jednego wektora z innym." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Wektor wejściowy pierwszy" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Wektor wejściowy drugi" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Obiekt wtyczki odplatania" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Błąd: Wektory wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Błąd: Obliczono nieprawidłową długość wejściową" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Odpleć" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Odplata jeden wektora względem innego." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Wektor wejściowy pierwszy" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Wektor wejściowy drugi" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Obiekt wtyczki autokorelacji" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Błąd: Wektor wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Błąd: Obliczono nieprawidłową długość wejściową" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Autokorelacja" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Tworzy autokorelację wektora." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Korelacja krzyżowa" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Błąd: Wektory wejściowe o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Błąd: Obliczono nieprawidłową długość wejściową" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Korelacja krzyżowa" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Tworzy korelację jednego wektora względem innego." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Wektor wejściowy pierwszy" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Wektor wejściowy drugi" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Obiekt wtyczki widma krzyżowego" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Wtyczka obiektu danych widma krzyżowego" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Tworzy widmo krzyżowe mocy jednego wektora względem innego." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Wektor wejściowy pierwszy" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Wektor wejściowy drugi" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Długość FFT = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Próbkowanie" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Obiekt wtyczki pasma efektywnego" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Błąd: Wektor wejściowy X o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "" "Błąd: Wektor wejściowy X i Wektor wejściowy Y nie są tej samej długości" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Błąd: Obliczone wskaźniki są nieprawidłowe" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Efektywne pasmo " #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Oblicza pasmo efektywne z widma amplitud." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Min. częst. białego szumu." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Częstotliwość próbkowania (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Obiekt wtyczki zwykłego filtra" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Błąd: Licznik wejściowego ciągu znaków jest pusty" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Błąd: Mianownik wejściowego ciągu znaków jest pusty" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Zwykły filtr" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Tworzy filtr dyskretny z definicji ciągłej w czasie." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Przedział próbkowania (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Licznik (kolejność wzrastająca)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Mianownik (kolejność wzrastająca)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Obiekt wtyczki interpolacji Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Krzywa sklejana interpolacji Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Tworzy niezaokrągloną interpolację Akima dla zestawu danych." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Obiekt wtyczki interpolacji okresowej Akima" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Krzywa sklejana interpolacji okresowej Akima" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "Tworzy niezaokrągloną interpolację okresową Akima dla zestawu danych." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Obiekt wtyczki interpolacji sześciennej krzywej sklejanej" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Krzywa sklejana interpolacji krzywą sklejaną" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Tworzy interpolację krzywą sklejaną dla zestawu danych." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Obiekt wtyczki interpolacji sześciennej krzywą sklejaną okresową" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Krzywa sklejana interpolacji sześcienną krzywą sklejaną" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Tworzy interpolację sześcienną krzywą sklejaną dla zestawu danych." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Obiekt wtyczki interpolacji liniowej" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Krzywa sklejana interpolacji liniowej" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Tworzy interpolację liniową dla zestawu danych." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Obiekt wtyczki interpolacji wielomianowej" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Krzywa sklejana interpolacji wielomianowej" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Tworzy interpolację wielomianową dla zestawu danych." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Wektor wejściowy X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Obiekt wtyczki dopasowania linii" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Błąd: Wektor wejściowy Y o nieprawidłowej długości" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Błąd: Wektor wejściowy X o nieprawidłowej długości" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Dopasowane linii" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Tworzy linię o najlepszym dopasowaniu do zestawu danych." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Wtyczka obiektu danych wzmacniacza z falą nośną" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Błąd: Wektory wejściowe o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Wzmacniacz z falą nośną" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" "Wzmacniacz z falą nośną wzmacnia wejście przy użyciu fali nośnej jako " "odniesienia" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Wektor odniesienia" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Obiekt wtyczki dodatku szumu" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Błąd: Wektor wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Dodatek szumu" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Dodaje szum Gaussa do zestawu danych o określonym odchyleniu standardowym." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Obiekt wtyczki periodogramu" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Błąd: Długości wektorów wejściowych nie są zgodne" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodogram" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Bierze periodogram wektora wyjściowego danego zestawu danych wektora " "wejściowego. Zakłada się, że dane wektora wejściowego nie są próbowane w " "równych odstępach czasu wektora wejściowego czasu." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Wektor wejściowy czasu" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Wektor wejściowy danych" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Współczynnik nadpróbkowania" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Przeciętny współczynnik częstotliwości Nyquista" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Obiekt wtyczki fazy" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Błąd: Faza skalara wejściowego musi być większa od zera." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Błąd: Długości wektorów wejściowych nie są zgodne." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Faza" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Przesuwa zestaw danych do podanego okresu i zera fazy wektora wyjściowego." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Wektor wejściowy czasu" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Wektor wejściowy danych" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Okres" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Zerowa faza" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Obiekt wtyczki przesunięcia" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Przesunięcie: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Przesunięcie" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Przesuwa (i obcina) wektor." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Wartość przesunięcia (# punktów, dozwolone ujemne)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Statystyka %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Błąd: Wektor wejściowy o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statystyki" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Określa statystyki dla danego zestawu wektora wejściowego." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Wektor wejściowy" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Obiekt wtyczki synchronizacji przedziałów" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Błąd: Wektor wejściowy X o nieprawidłowym rozmiarze" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Błąd: Długości wektorów wejściowych nie są zgodne" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Błąd: Przedziały muszą być co najmniej 2" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Synchronizacja przedziałów" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Dodaj synchronicznie wektor Y do przedziałów skalarów wejściowych " "określonych przez wektor X. Tak jak mapa 1D." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Wektor wejściowy X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Wektor wejściowy Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Liczba przedziałów" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "Min. X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "Maks. X" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Przepuszczanie pasma %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Odfiltrowany %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Filtr przepuszczania pasma" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Odfiltrowuje wektor filtrem przepuszczania pasma o zerowej fazie z " "odpowiedzią amplitudową butterwortha." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Wektor wejściowy - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Rząd filtra:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Częstotliwość środkowa / próbkowanie:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Szerokość pasma:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Zatrzymywanie pasma %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Odfiltrowany %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Filtr zatrzymywania pasma" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Odfiltrowuje wektor filtrem zatrzymywania pasma o zerowej fazie z " "odpowiedzią amplitudową butterwortha." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Wektor wejściowy:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Rząd filtra:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Częstotliwość środkowa / próbkowanie:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Szerokość pasma:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Przepuszczanie wyższych %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Odfiltrowany %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Filtr przepuszczania wyższych" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Odfiltrowuje wektor filtrem przepuszczania wyższego pasma o zerowej fazie z " "odpowiedzią amplitudową butterwortha." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Wektor wejściowy:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Rząd filtra:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Częstotliwość odcinania / próbkowanie:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Przepuszczanie niższych %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Odfiltrowany %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Filtr przepuszczania niższych" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Odfiltrowuje wektor filtrem przepuszczania niższego pasma o zerowej fazie z " "odpowiedzią amplitudową butterwortha." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Wektor wejściowy:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Rząd filtra:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Częstotliwość odcinania / próbkowanie:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Średnia skumulowana %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Średnia kumulowana" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Średnia kumulowana: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Średnia kumulowana" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Oblicza średnią skumulowaną wektora wejściowego." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Całka %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Całka" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Całka: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Suma skumulowana" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Oblicza sumę skumulowaną (całkę) wektora wejściowego." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Krok (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "Odimpulsowiony %1" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Odimpulsowienie" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtr odimpulsowienia: %1\n" " Ostęp: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Odimpulsowiony %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Filtr odimpulsowienia" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Znajduj i usuwa impulsy używając 3 punktowej różnicy." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Wektor wejściowy:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Odstępy:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Pochodna %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Pochodna" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Pochodna: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Błąd: Krok skalara wejściowego nie może być 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Różniczkowania o stałym kroku" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Oblicza pochodną dyskretną wektora wejściowego" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Krok (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Odwinięcie %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Odwinięcie " #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtr odwinięcia: %1\n" " %2 - %3\n" " Krok: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Wejście: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Odwinięcie %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Filtr odwinięcia" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Odwija dane, które zostały zawinięte." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Wektor wejściowy:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maksimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Maks. krok (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Nieważona wykładnicza %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Dopasuj wykładniczo do %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Reszty z dopasowania wykładniczego" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Dopasowanie wykładnicze" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Tworzy dopasowanie wykładnicze do zestawu danych." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Ważona wykładnicza %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Dopasowanie wykładnicze do %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Reszty z dopasowania wykładniczego" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Dopasowanie wykładnicze ważone" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie wykładnicze do zestawu danych." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Wagi:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Nieważona Gaussa %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Dopasowanie Gaussa do %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Reszty z dopasowania Gaussa" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Dopasowanie Gaussa" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Tworzy dopasowanie Gaussa do zestawu danych." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Ważona Gaussa %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Dopasowanie Gaussa do %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Reszty z dopasowania Gaussa" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Dopasowanie Gaussa ważone" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie Gaussa do zestawu danych." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Wagi:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "Nieważona gradientowa %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Dopasowanie gradientowe do %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Reszty z dopasowania gradientowego" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Dolna granica dopasowania gradientowego" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Górna granica dopasowania gradientowego" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Dopasowanie gradientowe" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Tworzy dopasowanie gradientowe do zestawu danych." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Ważona gradientowa %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Dopasowanie gradientowe do %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Reszty z dopasowania gradientowego" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Dolna granica dopasowania gradientowego" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Górna granica dopasowania gradientowego" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Dopasowanie gradientowe ważone" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie gradientowe do zestawu danych." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Wagi:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Wtyczka dopasowania częstotliwości kolana" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Błąd: Rozmiary wektorów wejściowych nie są zgodne" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Błąd: Wektor wejściowy X jest nieprawidłowy" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Błąd: Częstotliwości są nieprawidłowe\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Błąd: Dane wejściowe są nieprawidłowe.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Dopasowanie częstotliwości kolana" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Tworzy dopasowanie częstotliwości kolana do zestawu danych." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Wektor wejściowy - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Wektor wejściowy - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Skalar wejściowy - Maks. 1/f^a Częst." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Skalar wejściowy - Min. częst. białego szumu" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Skalar wejściowy - Min częst. szumu C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "Nieważona liniowa %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Dopasowanie liniowe do %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Reszty z dopasowania liniowego" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Dolna granica dopasowania liniowego" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Górna granica dopasowania liniowego" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Dopasowanie liniowe" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Tworzy dopasowanie linowe do zestawu danych." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "Ważona liniowa %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Dopasowanie liniowe do %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Reszty z dopasowania liniowego" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Dolna granica dopasowania liniowego" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Górna granica dopasowania liniowego" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Dopasowanie linowe ważone" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie linowe do zestawu danych." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Wektor wejściowy - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Wektor wejściowy - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Wektor wejściowy - Wagi" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Lorentz %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Dopasowanie Lorentza do %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Reszty z dopasowania Lorentza" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Dopasowanie Lorentza" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Tworzy dopasowanie Lorentza do zestawu danych." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Ważona Lorentza %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Dopasowanie Lorentza do %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Reszty z dopasowania Lorentza" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Dopasowanie Lorentza ważone" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie Lorentza do zestawu danych." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Wektor wejściowy - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Wektor wejściowy - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Wektor wejściowy - Wagi" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Wielomianowa %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Dopasowanie wielomianowe do %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Reszty z dopasowania wielomianowego" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Dopasowanie wielomianowe" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Tworzy dopasowanie wielomianowe do zestawu danych." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Rząd:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Ważona wielomianowa %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Dopasowanie wielomianowe do %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Reszty z dopasowania wielomianowego" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Dopasowanie wielomianowe ważone" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie wielomianowe do zestawu danych." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Wektor wejściowy - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Wektor wejściowy - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Wektor wejściowy - Wagi" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Skalar wejściowy - Rząd" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Sinusoidalna %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Dopasowanie sinusoidy do %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Reszty z dopasowania sinusoidalnego" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Dopasowanie sinusoidalne" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Tworzy dopasowanie sinusoidalne do zestawu danych." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmoniczne:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Okres:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Ważona sinusoidalna %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Dopasowanie sinusoidy do %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Reszty z dopasowania sinusoidalnego" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Dopasowanie sinusoidalne ważone" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Tworzy ważone dopasowanie sinusoidalne do zestawu danych." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Wektor wejściowy - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Wektor wejściowy - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Wektor wejściowy - Wagi" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Skalar wejściowy - Harmoniczne" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Skalar wejściowy - Okres" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Wektor wejściowy próbek" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Wstaw nowy &wektor" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Wstaw nowy &skalar" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Edytuj" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Wstaw nowy &skalar" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Nowy &ciąg znaków" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Edytuj" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Paletę k&olorów:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Wygląd" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Waga:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Rodzaj punktu" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Jeśli zaznaczone jest \"Pokaż punkty\", to wybrany rodzaj punktu zostanie " "narysowany na każdym punkcie danych." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Rodzaj linii" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Jeśli zaznaczone jest \"Pokaż linie\", to wybrany styl linii zostanie " "narysowany na każdej linii." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "" "Zaznacz to, aby sprawić, że zostaną narysowane linie pomiędzy punktami " "danych." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Linie" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Zaznacz to, aby sprawić, że zostaną narysowane wybrane punkty przy każdym " "punkcie danych." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "Pu&nkty" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Nagłówek" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "&Wykres słupkowy" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Szerokość linii" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Jeśli zaznaczone jest \"Pokaż linie\", to wybrana szerokość linii zostanie " "narysowana na każdej linii." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Rozmiar:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "Gęstość &punktów:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Wszystkie" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Wysoka" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Średnia" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Niska" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Rozmieszczenie" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Skalowanie czcionek" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Umieść na &nowym wykresie" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "W no&wej karcie" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "Nazwa pliku danych, który będzie odczytany dla tego wektora." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Umieść na istni&ejącym wykresie " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Nie umieszczaj na ż&adnym wykresie" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Samo&czynny układ" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "Włas&na siatka" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Kolu&mny:" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "Ch&roń istniejący układ" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Wybierz używaną krzywą" #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "klatki" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Zakres danych" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Wybierz to, aby uśrednić pominięte klatki. Zapewnia proste dolnoprzepustowe " "filtrowanie." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Najpierw od&filtruj boxcar" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Zachowaj pamięć rzadko próbkując dane" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Zaznacz to, aby pominąć klatki zamiast czytać wszystkie dane. Jest to " "użyteczne przy odczytywaniu bardzo długich lecz wolno zmieniających się " "plików danych." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Odczytaj &1 próbkę na:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Zaznacz to, aby odczytać wszystkie dane, aż do końca pliku. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Odczyt&aj do końca" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "lub" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Wybierz to, aby odczytywać dane z końca pliku. Jest to użyteczne do " "przewijania wyświetlaczy, gdy plik jest dołączony do innego programu." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "Licz &od końca" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "Liczba klatek do pominięcia, jeśli wybrano \"Odczytaj 1 próbkę na\"" #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " ramka(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Początek:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Zak&res:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Wprowadź liczbę (zaczynając od 0 dla pierwszej wartości), lub formatu " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] dla dat." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "Indeks pierwszej odczytywanej danej. Dla plików ASCII jest to numer wiersza " "w pliku. Dla plików opartych na ramkach jest to pierwsza ramka." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Ilość danych do wczytania do wektora. Dla plików ASCII jest to liczba " "wierszy danych. Dla plików opartych na ramkach może to być więcej niż jedna " "próbka na ramkę. Daty są wprowadzane w formacie [[[[YYYY:]MM:]DD:]HH:]MM[." "SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Nie znaleziono pliku.\n" "Proszę sprawdzić czy została podana poprawna nazwa pliku." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Opcje FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Domyślne" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "kosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussa (Własna Sigma)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Wybierz z tego menu rozwijanego wektor źródłowy dla słupków błędów dla osi " "y. Jeśli wybrano \"<Żaden>\", to słupki błędów na osi y nie " "zostaną narysowane. Twórz nowe wektory przy pomocy karty \"Wektory\"." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&ze" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Funk&cja:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "U&suń średnią" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "Dłu&gość FFT: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Ustawia długość transformaty FFT przy generowaniu widma mocy. 2^10 = 1024, " "itp. Im większa liczba, tym większy szum i rozdzielczość." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Przeplatana śre&dnia" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpolacja d&ziur" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Próbkowa&nie:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "Próbkowanie z jakim rejestrowano pomiary, do poprawnej normalizacji." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "Zastosuj specyfikacje nowej próbki danych do wybranych wektorów." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Jednostki wektora:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Jednostki wektora danych - do samoczynnych etykiet." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Jednostka próbkowania:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "Jednostki dla próbkowania. Używane do samoczynnych etykiet." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Wy&jście:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Gęstość widmowa amplitud (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Gęstość widmowa mocy (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Widmo amplitud (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Widmo mocy (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Otwórz plik" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Wszystkie pliki (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Katalog pliku dziennika" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Zapisz plik" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Składnia dla etykiet jest pochodną podzbioru LaTeX. Obsługiwana " "składnia to: \\[nazwa greckiej litery] i \\[Nazwa greckiej litery]" ", \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nazwa koloru}" "{tekst do zabarwienia}, \\textbf{tekst do wytłuszczenia}, " "\\textit{tekst do pochylenia}, \\t, \\sum, \\sqrt, " "\\underline{tekst do podkreślenia}, \\overline{tekst do " "nadkreślenia}, x^y, x_y. Jest możliwość osadzania " "elementów skalarnych, równań i wektorowych. Skalar: [V1/Średnia]. " "Element wektorowy: [V1[4]]. Równanie: [=[V1/Średnia]^2]. A " "[ Znaki można wstawiać jako \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Tekst etykiet. Podzbiór LaTeX jest obsługiwany. Naciśnij 'Pomoc' po pomoc." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Skalary i " "równania
Skalary i równania skalarne można wyświetlić jako " "etykiety w czasie rzeczywistym. Gdy skalar zmieni swoją wartość, to " "etykieta zostanie uaktualniona. Nazwy skalarów uzupełniają się " "samoczynnie. Format to:

Skalar: " "[nazwa_skalaru], np. [GYRO1:Mean(X4)]

Element " "wektorowy:[nazwa_wektora[indeks]],np., [GYRO1 (V2)[4]]

Równanie: [=równanie],np. [=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]

Obsługiwany podzestaw LaTeX
Etykiety w kst obsługują pochodne podzestawy LaTeX. Na " "przykład, aby wyświetlić równanie dla pola okręgu, możesz ustawić etykietę " "na A=2\\pir^2. Przeciwnie niż w LaTeX, nie trzeba wchodzić w tryb " "matematyczny przy użyciu '$'. Również, przeciwnie niż w LaTeX, zmienne nie " "są samoczynnie wyświetlane czcionką pochyłą. Jeśli chcesz, możesz to " "nakazać jednoznacznie poprzez użycie \\textit{}. Obsługiwane sekwencje to:

Litery Greckie: \\nazwa lub " "\\Nazwa. np.: \\alpha

Inne symbole: \\approx,\\cdot,\\ge,\\geq,\\inf,\\approx,\\cdot,\\ge," "\\geq,\\inf,\\int,\\le,\\leq," "\\ne,\\n," "\\partial," "\\prod,\\pm," "\\sum,\\sqrt

Efekty czcionki: \\textcolor{nazwa koloru}{zabarwiony tekst}, " "\\textbf{wytłuszczony tekst},\\textit{pochylony tekst}," "\\underline{podkreślony " "tekst},\\overline{nadkreślony tekst}.

Inne:" "x^y,x_y, \\t," "\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Obsługuje symbole LaTeX, ciągi znaków i skalary na żywo oraz osadzone " "równania." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "Etykie&ta:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Pomoc" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Składnia dla etykiet jest pochodną podzbioru LaTeX. Obsługiwana " "składnia to: \\[nazwa greckiej litery] i \\[Nazwa greckiej litery]" ", \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nazwa koloru}" "{tekst do zabarwienia}, \\textbf{tekst do wytłuszczenia}, " "\\textit{tekst do pochylenia}, \\t, \\sum, \\sqrt, " "\\underline{tekst do podkreślenia}, \\overline{tekst do " "nadkreślenia}, x^y, x_y. Jest możliwość osadzania " "elementów skalarnych, równań i wektorowych. Skalar: [V1/Średnia]. " "Element wektorowy: [V1[4]]. Równanie: [=[V1/Średnia]^2]. A " "[ Znaki można wstawiać jako \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "Tekst etykiety. Podzbiór LaTeX jest obsługiwany. Zobacz Co to." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Wybierz wektor do użycia. Jeśli chcesz utworzyć nowy wektor, naciśnij na " "ikonę po prawej." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Utwórz nowy wektor." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Otwiera okno dialogowe wektora do utworzenia nowego wektora, który stanie " "się wybranym wektorem." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Edytuj wybrany wektor." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Otwiera okno dialogowe wektora do edytowania wybranego wektora." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Okno dialogowe" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Zamknij" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Okno dialogowe" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Znajdź:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Wybierz skalara do użycia. Jeśli chcesz utworzyć nowego skalara, to wybierz " "ikonę po prawej." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Utwórz nowego skalara." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Edytuj wybranego skalara." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "<Żaden>" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Wybierz ciąg znaków do użycia. Jeśli chcesz utworzyć nowy ciąg znaków, to " "wybierz ikonę po prawej." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Utwórz nowy ciąg znaków." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Edytuj wybrany ciąg znaków." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "<Żaden>" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Wybierz wektor do użycia. Jeśli chcesz utworzyć nowy wektor, naciśnij na " "ikonę po prawej." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Utwórz nowy wektor" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Otwiera okno dialogowe wektora do utworzenia nowego wektora, który stanie " "się wybranym wektorem." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Edytuj wybrany wektor." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Otwiera okno dialogowe wektora do edytowania wybranego wektora." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Elementy interfejsu Kst" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Kumulatywne zanikanie widmowe" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Edytuj kumulatywne zanikanie widmowe" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Nowe kumulatywne zanikanie widmowe" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "CSD: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Błąd przy tworzeniu CSD z pliku Kst." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "Błąd przy tworzeniu CSD z pliku Kst. Nie można znaleźć wektora." #~ msgctxt "ActivityLevelSource|" #~ msgid "Actvity Level" #~ msgstr "Poziom aktywności" #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Edytuj " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Nowa " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Edytuj " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Wtyczka" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Nowy " #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "odczytywanie pola ..." #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Użyj Open&GL" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "Znajdywanie wierszy ..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "Ukończono znajdywanie wierszy " #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Znajdywanie wierszy: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "odczytana kolumna" Kst-2.0.8/po/kst_common_pt.po0000644000175000017500000112616612362706252015232 0ustar synthsynthmsgid "" msgstr "" "Project-Id-Version: kst\n" "POT-Creation-Date: 2008-06-25 20:14+0200\n" "PO-Revision-Date: 2014-06-06 09:29+0100\n" "Last-Translator: José Nuno Coelho Pires \n" "Language-Team: pt \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-POFile-IgnoreConsistency: input\n" "X-POFile-IgnoreConsistency: #, no-c-format\n" "X-POFile-IgnoreConsistency: Open File\n" "X-POFile-IgnoreConsistency: Open File\n" "X-POFile-IgnoreConsistency: Open File\n" "X-POFile-IgnoreConsistency: O&n\n" "X-POFile-SpellExtra: Kst PSD PSDs CSD CBRT COT Loaded DD Vhigh\n" "X-POFile-IgnoreConsistency: Coarse\n" "X-POFile-IgnoreConsistency: Fine\n" "X-POFile-IgnoreConsistency: Source\n" "X-POFile-IgnoreConsistency: New Item\n" "X-POFile-IgnoreConsistency: Down\n" "X-POFile-IgnoreConsistency: Alt+M\n" "X-POFile-IgnoreConsistency: Apply To\n" "X-POFile-IgnoreConsistency: Alt+C\n" "X-POFile-IgnoreConsistency: &None\n" "X-POFile-SpellExtra: nomeextensão EPS Barth COSH AAAA STEP Connes Vsky\n" "X-POFile-SpellExtra: SINH Blackman LOGIN writeLockInputsAndOutputs PLAIN\n" "X-POFile-SpellExtra: LOG kst Columbia TANH COS Tlow rácio SEC AutoFormato\n" "X-POFile-SpellExtra: boxcar tid TAN Vref UTC AC Netterfield ATAN ASIN\n" "X-POFile-SpellExtra: listaargumentos Vectors CSC FFTs Bartlett SS ABS\n" "X-POFile-SpellExtra: Hamming Enter Translacção Tref Vlow ACOS DIGEST\n" "X-POFile-SpellExtra: Thigh MD viewLabelWidget ELOG MM KstDataObject FFT\n" "X-POFile-SpellExtra: SIN HH SQRT Tsky Hanning Elog XY Welch CRAM EXP\n" "X-POFile-SpellExtra: Tdeslocamento Vdeslocamento Valta Theta Máx\n" "X-POFile-SpellExtra: radiométricos Phi Hann ScubaConfig Javascript GHz\n" "X-POFile-SpellExtra: KstScript Vbaixa Stokes EditMultipleWidget mHz Mín\n" "X-POFile-SpellExtra: Talta dB KJSEmbed Tbaixa Espectrograma\n" "X-POFile-IgnoreConsistency: Plot\n" "X-POFile-SpellExtra: CurveDialogWidget lorentz Lorentz CTRL QListViewCons\n" "X-POFile-SpellExtra: QtCons Jan ge Test underline le QMenuDataCons\n" "X-POFile-SpellExtra: atribute KJSEmbedPartImp Nov TAI geq DJR kdebase Sáb\n" "X-POFile-SpellExtra: Value QDirImp palete Embed DJM cdot QMenuItemCons KST\n" "X-POFile-SpellExtra: sum QMenuItemImp Qua Job QComboBoxImp prod Ago\n" "X-POFile-SpellExtra: JSFactoryImp tags js leq QtImp QComboBoxCons\n" "X-POFile-SpellExtra: QMenuDataImp QListViewItemCons Fev xy FD extcolor px\n" "X-POFile-SpellExtra: Jun Jul ASD pm calculatePowerSpectrum KJS Set\n" "X-POFile-SpellExtra: QListViewImp JSBuiltInImp Sex Seg ms QPopupMenuImp\n" "X-POFile-SpellExtra: Out QListViewItemImp DJ stream int SHIFT\n" "X-POFile-SpellExtra: PSDCalculator Abr inf id extit QPopupMenuCons sqrt\n" "X-POFile-SpellExtra: QObject application Mai ns exec object konsole\n" "X-POFile-SpellExtra: QCheckListItemCons extbf KJSCmd QFileCons QFileImp\n" "X-POFile-SpellExtra: approx partial QCheckListItemImpnão Element Form\n" "X-POFile-SpellExtra: VectorViewDialogWidget vs ViewLegendWidget GB\n" "X-POFile-SpellExtra: KstEditViewObjectDialog TB DPlotWidget View pre aa\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-POFile-SpellExtra: Log tabs PropriedadesSeta pos yyyy Nyquist wrap\n" "X-POFile-SpellExtra: QDateTime space NaN imagefile DEP print SO white\n" "X-POFile-SpellExtra: grupoBotoes zzz intervaloActualizacao dd NSigma hh\n" "X-POFile-SpellExtra: user geo ss Freq LegendaTexto dX lineEdit messagefile\n" "X-POFile-SpellExtra: heta LinhaEdicao raster mat Akima reversões netCDF\n" "X-POFile-SpellExtra: Matlab FITS QImage index sobrelinhado colorname\n" "X-POFile-SpellExtra: Butterworth Periodograma GYRO equation overline\n" "X-POFile-SpellExtra: periodograma text scalarname Lorentziano alpha pir\n" "X-POFile-SpellExtra: vectorName Mean Mac\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Aplicar estas definições por omissão" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Antever as Primeiras 1000 Linhas numa Nova Janela" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Primeiras linhas " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Antevisão]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Cabeçalho" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Os dados começam na linha:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Ler os nomes dos campos a partir da linha:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Ler as unidades a partir da linha:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicadores de comentários:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Poderá usar mais que um símbolo aqui, como por exemplo \"#!C\", mas irá " "tornar a leitura de ficheiros ASCII mais lenta" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Separador Decimal:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Ponto" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Vírgula" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Disposição em Colunas dos Dados" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Separados por espaços/tabs" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Separador personalizado" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "A leitura será mais rápida se cada coluna tiver supostamente o seu tamanho " "constante." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Cada coluna tem o\n" "seu tamanho constante" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Tamanho Fixo" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Opções Gerais" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Limitar o Tamanho do 'Buffer':" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Usar as tarefas" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Aceitar sempre os ficheiros correspondentes a:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpretar um valor vazio como:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Valor anterior" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretação das Datas/Horas" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Valor" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Interpretar o campo" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "como:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Hora C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Segundos" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Índice com frequência" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Texto Formatado. Formato:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Veja a documentação do QDateTime para mais detalhes.
Poderá usar uma " "combinação de y,M,d para as datas e h,m,s,z para as horas ('z' para os " "milisegundos).
É permitido o espaço entre as colunas de datas e horas, " "mas deverá seleccionar a primeira coluna como o vector em X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dia, M=mês, y=ano, h=hora, m=minuto, s=segundo, z=milisegundo" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Deslocamento" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Data/Hora:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Data do ficheiro" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relativo" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Primeiras linhas do ficheiro '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "A linha %1 não pode listar nomes E valores de campos!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "A linha %1 não pode listar unidades E valores!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "A linha %1 não pode listar nomes de campos E unidades!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Parâmetros inconsistentes" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Leitor de Ficheiros ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "A processar o '%1' ..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Terminou o processamento de '%1'" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "A processar o '%1': %2 linhas" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "A ler o campo: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "Foi criado o ÍNDICE" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Terminou a leitura: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "a ler ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "a processar ..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Coluna %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Leitor de Ficheiro de Pasta" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Leitor de Fontes de Imagens FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Leitor de Fontes de Dados do Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Leitor de Fontes de Dados .mat do Matlab" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Leitor de netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Leitor de Código do QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Leitor de Fontes de Dados de Exemplo" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Leitor de Listas de Fontes" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Coluna %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "O ficheiro de dados da matriz %1 não foi aberto." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "O ficheiro de dados do vector %1 não foi aberto." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Matriz de Dados: %1\n" " %2\n" " Campo: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "O ficheiro de dados do vector %1 não foi aberto." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "O ficheiro de dados do valor escalar %1 não foi aberto." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Escalar de Dados: %1 = %4\n" " %2\n" " Campo: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 de %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "tramas" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Localizações de Pesquisa de 'Plugins':" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "A analisar os 'plugins' de fontes de dados." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "'Plugin' carregado: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "a instância falhou para o %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "O ficheiro '%1' não existe." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Não foi possível encontrar uma fonte de dados para o '%1' (%2), mas " "encontrou-se uma imediatamente anterior. Algo se passa de errado com o Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "O ficheiro de dados do texto %1 não foi aberto." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Texto de Dados: %1 = %4\n" " %2\n" " Campo: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "O ficheiro de dados do vector %1 não foi aberto." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Vector de Dados: %1\n" " %2\n" " Campo: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Últimas %1 tramas." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Trama %1 até ao fim." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 Tramas a começar em %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Ler 1 amostra por %1 tramas." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Média a cada %1 tramas." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 T0: %3 N: %4 de %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Erro" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Aviso" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Informação" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Depuração" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Outro" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst versão %1\n" "\n" "\n" "Registo do Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "'Plugins' de fontes de dados:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Vector Editável: %1\n" " %2 valores" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Vector Gerado: %1\n" " %2 valores de %3 até %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 pontos de %1 até %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "A matriz gravada tem menos dados do que afirma ter." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matriz: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Ocorreu um erro ao criar a Matriz Gerada a partir do ficheiro do Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "" "Ocorreu um erro ao criar a Matriz Editável a partir do ficheiro do Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "" "Ocorreu um erro ao criar a Matriz de Dados a partir do ficheiro do Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Escalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Escalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Valor: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Ocorreu um erro ao criar o escalar a partir do ficheiro do Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Texto: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Erro ao criar o texto a partir do ficheiro do Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Fornecedor: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vector: %1\n" " %2 amostras\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Erro ao criar o vector a partir do ficheiro do Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Erro ao criar o vector gerado a partir do ficheiro do Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "O ficheiro de dados do valor escalar %1 não foi aberto." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Escalar de Dados: %1 = %4\n" " %2\n" " Campo: %3\n" " Trama: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 trama %3 de %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Um programa de visualização de dados.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revisão %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "'Copyright' © 2000-2014 de Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage: http://kst-plot.kde.org/
" msgstr "" "Página Web:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Por favor comunique os erros através do 'Assistente de Relatórios de Erros' " "do menu 'Ajuda'.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autores e contribuintes (ordenados alfabeticamente):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Acerca do Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Configuração do Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Geral" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Escala" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Grelha" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Propriedades da Disposição" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Seta" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto de seta a partir do ficheiro do Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Criar uma Seta" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "PropriedadesSeta" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Seta no &início" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Escala da seta i&nicial" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Tamanho da Ponta da Seta" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "O tamanho da ponta da seta é proporcional a este valor." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Seta no &fim" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Escala da seta fin&al" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Eixo" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Lato" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Refinado" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Muito Refinado" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Linha Sólida" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Linha Tracejada" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Linha Ponteada" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Linha Traço-Ponto" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha Traço-Ponto-Ponto" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Linha Tracejada Personalizada" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Esconder a esquerda" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Esconder a direita" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Esconder as Margens e Legendas" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Esconder o topo" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Esconder o fundo" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotação da Legenda" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotação :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Modo de Base / Deslocamento" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Ligado" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Desligado" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Algarismos entre o modo de base/deslocamento automático:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Se é necessário este número de algarismos para mostrar os números dos " "traços, então o eixo irá mudar de volta para o modo Base/Deslocamento." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Forçar o deslocamento ao mínimo do eixo" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarítmica" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Inverte a direcção do eixo, de modo a que os números diminuam em vez de " "aumentar." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Inve&rter" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "O eixo é o tempo" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpretar o eixo como o tempo." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpretar como:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Tipo de codificação do tempo" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "O eixo representa o tempo, cuja codificação é seleccionada aqui." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Mostrar como:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Formato de apresentação do tempo" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Se o eixo for interpretado como tempo, então mostra o tempo correspondente " "no eixo com este formato." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Fuso-horário:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Formato da data/hora:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Data: y/M/d - Hora: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Traços e Linhas Maiores" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Desen&har os traços" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Desenhar as linhas da &grelha" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Es&paço maior:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Densidade dos traços maiores" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Indica a densidade dos traços maiores. O intervalo entre traços maiores será " "escolhido automaticamente como uma potência de 10 elevado a 1, 2 ou 5. Isto " "muda o espaço-alvo entre traços dentro desta restrição." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "E&stilo da linha da grelha:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Cor da linha da grelha:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Largura:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Traços Maiores e Menores" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Desenhar os tr&aços" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Desenhar as linhas da grelha" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Número de tra&ços menores:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Est&ilo da linha:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Cor da &linha:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: O ficheiro não foi encontrado. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Janela" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "LegendaTexto" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Seleccione o novo ficheiro de dados:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Tipo de ficheiro desconhecido" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Modificar" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Ignorar" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "'Plugin' Básico" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Editar o 'Plugin' %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Novo 'Plugin' %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Não foi possível criar o objecto do 'plugin' com os parâmetros indicados.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Entradas e Saídas" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Caixa" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Erro ao criar o objecto de caixa a partir do ficheiro do Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Criar uma Caixa" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bits" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bits" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistente de Relatórios de Erros" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Versão do Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "SO:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Para comunicar um erro, carregue no botão abaixo.\n" "Isto irá abrir uma janela de navegador Web para http://bugs.kde.org, onde " "irá encontrar um formulário a preencher.\n" "A informação apresentada acima será transferida para o servidor." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Invocar o Assistente de Relatórios de Erros" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Botão" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto do botão a partir do ficheiro do Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Gráfico Cartesiano" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "tramas" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Memória Insuficiente" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Pediu a leitura de %1 MB de dados mas parece que só tem disponíveis " "aproximadamente %2 MB de memória útil. Não pode carregar tantos dados." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Modificar as Amostras de Dados" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Selecção do Vector" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O ficheiro de código para os vectores seleccionados nesta lista será " "alterado." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Seleccionar todos os vectores na lista." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Adicionar &Tudo" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Deseleccionar todos os vectores na lista." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "R&emover Tudo" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "O ficheiro não pôde ser carregado ou não contém dados." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "O seguinte campo não está definido para o ficheiro pedido:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Os seguintes campos não estão definidos para o ficheiro pedido:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Modificar o Ficheiro de Dados" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Seleccionar por Ficheiro de Origem" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Adicionar Tudo &De:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Selecção de Vector e Matriz" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O ficheiro de código para os vectores seleccionados nesta lista será " "alterado." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Seleccionar todos os vectores na lista." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Adicionar &Tudo" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Deseleccionar todos os vectores na lista." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "R&emover Tudo" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Novo Ficheiro de Dados" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Ficheiro:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "M&odificar os vectores e matrizes seleccionados" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "Objectos derivados d&uplicados (curvas, equações, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplicar os vectores e matrizes seleccionados" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Tipo de Ficheiro Desconhecido" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Atribuir a Cor da Curva do Ficheiro" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Atribuir as Cores" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Basear a Cor da Curva em:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Vector &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Vector &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Raio" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centro" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a Posição aos Dados" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Circunferência" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Erro ao criar o objecto do círculo a partir do ficheiro do Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Criar um Círculo" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "fim" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Coluna %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Utilização: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Utilização: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Utilização: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Utilização: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Utilização: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Utilização: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Utilização: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Utilização: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Utilização: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Não foram indicados ficheiros de dados\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "o ficheiro %1 não existe\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Utilização: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Utilização: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Utilização: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Utilização: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Utilização: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Utilização: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Elevar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Baixar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Objectos &disponíveis:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Deseleccionar Tudo" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Seleccionar Tudo" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Elevar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Cima" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Baixar na ordem do gráfico: Alt+Baixo" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Baixo" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "Objectos &visíveis:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "grupoBotoes" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "ISTO E O QUE ESTIVER ABAIXO É APENAS PARA PROGRAMAÇÃO E DEVERÁ ESTAR " "ESCONDIDO!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Espectrograma" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Editar o Espectrograma" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Novo Espectrograma" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Conteúdo do Espectrograma" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Vector de dados:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Tamanho da janela:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Opções da Imagem" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Curva" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Editar a Curva" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Nova Curva" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Conteúdo da Curva" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Vector do eixo &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Vector do eixo &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Barra de e&rro em +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Barra de erro em +&Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Barra de erro em -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Barra de erro em &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Usar a barra de erro +X em -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "U&sar a barra de erro +Y em -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorar nos cálculos automáticos de gama de eixos" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nome:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Editar Vários >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Editar um %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Indique aqui o seu filtro (caracteres especiais permitidos)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Criar uma Curva" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Criar um Espectro de Potência" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Criar um Espectrograma" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Criar um Histograma" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Aplicar o Filtro" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Criar uma Imagem" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Adicionar ao Gráfico" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Remover do Gráfico" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Aplicar um Ajuste" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Apagar" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gestor de Dados" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtro por:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Todas as Colunas" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nome" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Tipo" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Amostras" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Distinguir a capitalização" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Eliminar" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Ocorreu um erro ao criar a fonte de dados a partir do ficheiro do Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Intervalo de Tempo" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Detecção de Modificações" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Sem Actualização" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Elevar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Baixar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vectores disponíveis" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vectores seleccionados" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Criar Gráficos Es&pectrais. Veja as opções do FFT em baixo:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Memória Insuficiente" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Pediu a leitura de %1 MB de dados mas parece que só tem aproximadamente %2 " "MB de memória disponíveis. Não pode carregar tantos dados." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "" "Criar gráficos em &XY. Defina as propriedades do vector no eixo do X em " "baixo:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Criar a partir d&o campo:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Usar o &existente:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "O campo a ser utilizado no eixo X na curvas XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Seleccione por favor uma fonte de dados a " "partir da qual trabalhar. Esta será tipicamente o seu ficheiro que contém " "pontos ou vectores de dados.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Tipo de ficheiro desconhecido" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figurar..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Tipo de actualização; use o 'Intervalo de Tempo' para os dados não-locais" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtros" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Novo Filtro..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Se o desejar, seleccione " "um filtro a aplicar aos campos lidos:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Colocação da Curva" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "Tod&as as curvas num gráfico" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 novo gráfico por curva" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Circ&ular por" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " gráficos" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Circular pelo&s gráficos existentes" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Todas as curvas no grá&fico" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Colocação do Gráfico (Páginas)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Todas na página ac&tual" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Todas numa página no&va" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "Gráfico&s XY e espectros em páginas separadas" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Disposição do Gráfico" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "&Disposição automática" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Grelha &personalizada" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Colunas:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&roteger a disposição existente" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Ajustar a escala de todas as legendas na página" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Partilhar o eixo na página" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Estilo da Cur&va" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Apenas l&inhas" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Apenas &pontos" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Linhas &e pontos" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Modo do Eixo do Espectro" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Eixo X lo&garítmico" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Eixo Y l&ogarítmico" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legendas" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Ligadas" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Desligadas" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertical" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Elevar na ordem do gráfico (Alt-Cima)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Cima" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Baixo" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Seleccionar (Alt-S): Move os campos realçados da lista de dados Disponíveis " "para os Seleccionados, para o gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Remover (Alt-R): Move os campos realçados da lista de Seleccionados para os " "Disponíveis, para que não sejam representados no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Dados seleccionados: Todos os campos desta lista são desenhados." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Dados seleccionados: Todos os campos desta lista serão desenhados no " "gráfico. Para remover os campos desta lista, arraste-os para a lista de " "dados Disponíveis, faça duplo-click neles ou seleccione-os e use o botão " "Remover (ícone da seta direita ou Alt-R). A ordem pela qual os campos " "aparecem nesta lista será a ordem de representação no gráfico." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Dados seleccionados:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vectores seleccionados" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtro de Procura" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtro de Procura: Os campo condizentes com este filtro serão seleccionados " "e movidos para o topo da lista de Disponíveis. Pode utilizar '*' e '?'." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Adicionar o '*' ao início e fim do filtro de procura para condizer com tudo " "o que contenha o texto de filtragem." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "&Procurar" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Escolha de campos: Os campos seleccionados são desenhados." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Dados disponíveis: Esta lista contém todos os campos que não foram ainda " "seleccionados para o gráfico. Para seleccionar um campo para o gráfico, mova-" "o para a lista de dados Seleccionados, arrastando-o com o rato, fazendo " "duplo-click ou seleccionando-o e carregando no botão de selecção (Seta " "Direita - o atalho é o Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Dados disponíveis:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vectores disponíveis" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

versão %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

versão %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Janela de Depuração do Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informação de Compilação" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Enviar por E-mail a Informação de Depuração" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Registo" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Nível de depuração: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Erro" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "A&viso" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "I&nformação" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Depuração" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Limpa&r" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Fontes de Dados" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "'Plugin'" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Instância Carregada" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Fech&ar" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Ocorreu um erro. Carregue neste ícone para mais detalhes." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Tipos de letra" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Carta" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Gráfico do Jornal" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Personalizar" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "Tamanho de letra &mínimo (pontos):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Ao dimensionar a janela, os tipos de letra serão apresentados com este " "tamanho no mínimo." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Tamanho da janela de referência:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Quando a janela tiver este tamanho, os tipos de letra terão o tamanho " "indicado." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "O tamanho dos tipos de letra será ajustado com o tamanho da janela ou da " "impressão. Quando a mesma tiver este tamanho, os tamanhos aqui indicado " "serão os exactos." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Tamanho de referência personalizado (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Gravar por omissão" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Aplicar aos objectos existentes" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Subir a propriedade seleccionada na lista de prioridades" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Descer a propriedade seleccionada na lista de prioridades" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Adicionar a propriedade seleccionada à lista de propriedades a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "Remover a propriedade seleccionada da lista de propriedades a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Cor da Linha" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Estilo de Pontos" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Estilo de Linha" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Largura de Linha" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Diferenciar as Curvas" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Selecção da Propriedade e Ordem do Ciclo" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Elevar na Ordem de Selecção: Alt+Cima" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Cima" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Baixar na Ordem de Selecção: Alt+Baixo" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Baixo" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Disponíveis:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Seleccionados:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opções" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Largura máxima da linha:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Densidade do ponto:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Tudo" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Alta" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Média" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Baixa" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotação:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Tamanho:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Posição:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Corrigir as proporções de tamanho" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a Posição aos Dados" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Não foi possível aceder ao ficheiro para escrita." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Não foi possível aceder ao ficheiro para leitura." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "O ficheiro está corrompido e ocorreu um erro na sua leitura." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Seleccionar os Objectos a Editar" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtro:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Limpar" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Seleccion&ar Tudo" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Elipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Erro ao criar o objecto da elipse a partir do ficheiro do Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Criar uma Elipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Equação" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Editar a Equação" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Nova Equação" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Equação" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Eq&uação:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Indique a equação a ser avaliada aqui. Use o 'x' como sendo a variável " "independente. Os vectores e os operadores são seleccionados nas listas acima." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Vector &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpolar para o vector-solução mais elevado" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Monitor de Eventos" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Editar o Monitor do Evento" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Novo Monitor de Eventos" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Notificação por E-mail" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "N&otificar:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expressão" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vectores:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operadores:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Escalares:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expressão:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Descrição:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Executar:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tificar:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configurar..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Registo de Depuração do Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "A&viso" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Erro" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "I&nformação" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Registar como:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exportar para um Ficheiro Gráfico" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "Nome de &base:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Formato do ficheiro:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Tamanho" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Largura:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Largura, em pontos, da imagem." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Altura:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Altura da imagem (em pontos)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "&Indique:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largura, Mantendo as Proporções de Tamanho" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Altura, Mantendo as Proporções de Tamanho" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Largura e Altura" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Tamanho do Quadrado" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Gravar as Opções" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Não gravar automaticamente. Em vez disso, gravar ao carregar em OK ou " "Aplicar." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Gra&var uma vez" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Gravar a imagem com temporização" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Quando activado, a imagem será gravada automaticamente utilizando o período " "indicado. Isto é útil por exemplo para imagens em páginas Web." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Gr&avar automaticamente a cada" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Período de gravação automática" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "&Extensão automática" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Incluir:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Formatos do vector" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Formatos da imagem" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exportar os Vectores" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Selecção do Vector" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "O ficheiro de código para os vectores seleccionados nesta lista será " "alterado." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Seleccionar todos os vectores na lista." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "Adicionar &Tudo" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Deseleccionar todos os vectores na lista." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "Remover &Tudo" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Localização de &gravação:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Preencher" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Sem Pincel" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Padrão Sólido" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Padrão Denso 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Padrão Denso 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Padrão Denso 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Padrão Denso 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Padrão Denso 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Padrão Denso 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Padrão Denso 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Padrão Horizontal" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Padrão Vertical" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Padrão Cruzado" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Padrão Diagonal 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Padrão Diagonal 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Padrão Diagonal Cruzado" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Cor:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "E&stilo:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Usar um gradiente &linear" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Repor o Gradiente" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "'Plugin'" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Editar o 'Plugin' %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Novo 'Plugin' %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Não foi possível criar o objecto do 'plugin' com os parâmetros indicados.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Selecção do 'Plugin'" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nome do 'plugin':" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Descrição:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Entradas e Saídas" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorar nos cálculos automáticos de gama de eixos" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Geral" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Actualiza os ficheiros dinâmicos com base neste período." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "O tempo mínimo entre actualizações, ao olhar para os ficheiros dinâmicos. Se " "existir bastante processamento, isto poderá levar mais tempo." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Período entre actualizações (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Usar uma transparência ao arrastar" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Desenhar com o \"raster\". Nem sempre isto é melhor." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "O desenho com o \"raster\" é mais rápido em algumas arquitecturas, mas " "bastante problemático noutras (dependendo do controlador de vídeo). Isto " "tanto poderá ajudar como fazer com que as coisas corram realmente mal." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Usar o \"raster\" (reinício do Kst necessário)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Su&avizar os Gráficos" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Grelha" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Mostrar a &grelha" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Aju&star à grelha" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Intervalo &horizontal da grelha:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Intervalo &vertical da grelha:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histograma" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Editar o Histograma" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Novo Histograma" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Propriedades do Histograma" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dados:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Compartimentos de&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "O limite inferior do grupo mais baixo. Os valores abaixo deste limite não " "serão contados em nenhum grupo." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "até:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "O limite superior do grupo mais elevado. Os valores acima deste limite não " "serão contados em nenhum grupo." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Número de grupo&s:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "O número de grupos no histograma." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Definir os limites inferior e superior, bem como o número de grupos para uma " "predefinição razoável." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "Grupos A&utomáticos" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "G&rupos automáticos em tempo real" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalização do Eixo Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "O eixo dos Y do histograma indica a fracção das amostras no grupo." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fracção no grupo" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "O eixo dos Y no histograma indica o número de amostras no grupo." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "Nú&mero no grupo" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "O eixo dos Y do histograma é normalizado, de modo a que o grupo mais alto " "seja igual a 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Grupo de pico = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "O eixo dos Y do histograma indica a percentagem das amostras no grupo." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&tagem no grupo" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Imagem" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Editar a Imagem" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Nova Imagem" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Conteúdo da Imagem" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matriz:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Tipo de Imagem" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "&Mapa de cores" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Mapa de con&torno" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Mapa de &cores e mapa de contorno" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Parâmetros do Mapa de Cores" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "S&uperior:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Limite - &Inferior:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "Inteli&gente" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&il:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "&Máx/Mín" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Limite automático em tempo-&real" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Parâmetros do Mapa de Contorno" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "C&or:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Número de ní&veis de contorno:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "Es&pessura:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Utilizar espessura de linha &variável" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Janela de Criação de Legenda" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Janela" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Bloquear a Posição aos Dados" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Direita" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Esquerda" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Ponto de Referência:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " pontos" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "T&ipo de letra:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Cor" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Tamanho da &letra:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Gravar por omissão" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a Posição aos Dados" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Direita" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Esquerda" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Ponto de Referência da Legenda:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotação" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Posição" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Legenda" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Criar uma Legenda" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Propriedades da Legenda" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um sub-conjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto colorido}, \\textbf{texto a negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Poderá incorporar valores escalares, equações e " "elementos vectoriais. Escalar: [V1/Média]. Elemento de Vector: [V1" "[4]]. Equação: [=[V1/Media]^2]. Poderá introduzir um carácter '[' " "como \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Tamanho da &letra:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "T&ipo de letra:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Tamanho de letra predefinido do &gráfico:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "pontos" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Ajustar automaticamente o tamanho das legendas dos eixos" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Legenda do &topo:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Legenda do &fundo:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "Legendas da &esquerda:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Legenda da di&reita:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Mostrar a le&genda" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&ditar" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Suporta os escalares & textos (nome entre parêntesis rectos) - p.ex., " "[ÍNDICE:Máx (X2)],\n" "equações incorporadas - p.ex., [=[ÍNDICE:Máx] / 2]\n" "e símbolos de LaTeX - p.ex., \\theta. Os nomes e símbolos são finalizados " "automaticamente." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Caixa da Disposição" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Disposição" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Margem &horizontal:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Margem &vertical:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Espaço hori&zontal:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Espaço ver&tical:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Legenda Vazia" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gráfico: %1 \n" "Conteúdo:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Elevar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Baixar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Título:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Usar o conteúdo automático baseado no gráfico" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Mostrar na &vertical" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Objectos &disponíveis:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "Objectos &visíveis:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Elevar na ordem do gráfico: Alt+Cima" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Cima" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Remover: Alt+R" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Seleccionar: Alt+S" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Baixar na ordem do gráfico: Alt+Baixo" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Baixo" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Configuração do Tipo de Letra da Legenda" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Tamanho da &letra:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "T&ipo de letra" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloquear a Posição aos Dados" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LinhaEdicao" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto 'lineEdit' a partir do ficheiro do Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Linha" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Dimensionar" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Ocorreu um erro ao criar o objecto de linha do ficheiro do Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Criar uma Linha" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Programa: Em execução" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Programa: Terminado" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Programa: código de saída %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Erro do programa: Não foi possível iniciar" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Erro do programa: Estoirou" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Erro do programa:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Criar um item de registo" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Executar de &Novo o Programa" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Programa:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Aplicar" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Fe&char" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Mensagem" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Mensagem:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "Limpa&r" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Resultado do programa:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuração" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Propriedades do Gráfico" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Largura:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largura, Mantendo as Proporções de Tamanho" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Altura, Mantendo as Proporções de Tamanho" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Largura e Altura" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Tamanho do Quadrado" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Altura:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Altura da imagem (em pontos)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Formato do ficheiro:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "I&ndique:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Largura da imagem (em pontos)." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Pasta local de registo:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Programa:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Pode usar as variáveis '$user', '$imagefile' e '$messagefile' na lista de " "argumentos." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "&Utilizador:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Mensagem de Gravação" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "O seu documento foi modificado.\n" "Deseja gravar as alterações?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Gravar o Ficheiro" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sessões do Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Abrir um Ficheiro" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Limpar os Ficheiros Inexistentes" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Para mais detalhes, veja em 'Ajuda->Janela de Depuração->Registo'." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Erro ao abrir o documento:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Abrir..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Abrir uma nova sessão" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Gravar" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Gravar a sessão actual" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Gr&avar como..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "No&va Sessão" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Fechar a sessão actual e iniciar uma nova e vazia" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Recarregar Todas as Fontes de &Dados" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Recarregar todas as fontes de dados" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "Im&primir..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Imprimir a visualização actual" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exportar como Imagens..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exportar a imagem para o disco" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Gravar os &Vectores em Disco..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exportar os vectores para um ficheiro ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Item do &Registo..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Enviar um item do registo" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Nova Página" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Criar uma nova página" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Fe&char a Página" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Fechar a visualização actual" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Sair" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Sair da aplicação" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vectores:" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Mostrar todos os vectores numa folha de cálculo" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "E&scalares" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Mostrar todos os valores escalares numa folha de cálculo" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrizes" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Mostrar todas as matrizes numa folha de cálculo" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "Cadeias de Carac&teres" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Mostrar todos os textos numa folha de cálculo" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Re&cuar um Ecrã" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Recuar um ecrã" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Avançar um Ecrã" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Avançar um ecrã" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "A &Contar do Fim" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Configurar todos os vectores de dados para contarem a partir do fim" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "Le&r Até ao Fim" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Configurar todos os vectores de dados para contarem até ao fim" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pausa" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Activa/desactiva a pausa das actualizações das fontes de dados" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "&Modificar os Intervalos das Amostras de Dados..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "" "Mostrar a janela para modificar os intervalos de amostras de dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Gráfico" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Criar um novo gráfico na janela actual" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "E&scalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vector" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matriz" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "C&adeia de Caracteres" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Curva" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Equação" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Espectro de P&otência" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histograma" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Imagem" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Espectr&ograma" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Mo&nitor de Eventos" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Legenda" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Criar uma legenda para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Caixa" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Criar uma caixa para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Circunferência" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Criar uma circunferência para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Elipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Criar uma elipse para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Linha" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Criar uma linha para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "Set&a" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Criar uma seta para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "I&magem" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Criar uma imagem para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Criar um SVG para a janela actual" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Caixa do Eixo Partilhada" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Criar uma caixa partilhada de eixo para o item actual" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Comu&tar a Ampliação Ligada" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Activar/desactivar a ampliação ligada da janela actual" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Ligar Entre Tod&as as Páginas" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "A ampliação ligada aplica-se entre as páginas" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Realçar os Pontos de Dados" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Realçar o ponto de dados mais próximo" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Ampliar/Deslocar em X-Y" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Ampliar arbitrariamente na direcção X ou Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Ampliação Apenas em &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Ampliar apenas na direcção do X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Ampliação Apenas em &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Modo de &Disposição" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Comutar o modo de disposição da janela actual" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Gestor de Dados" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Mostrar a janela de gestão de dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Assistente de &Dados" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Mostrar o Assistente de Dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Modificar o &Ficheiro de Dados" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Mostrar a janela para Modificar o Ficheiro de Dados do Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Atribuir a &Cor da Curva por Ficheiro" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Mostrar a Janela de Selecção de Cores do Kst" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Der&ivar as Curvas" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Mostrar a Janela para Derivação das Curvas do Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configurar o Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Mostrar a Janela de Configuração do Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Tema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Mostrar a Janela de Temas do Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Janela de &Depuração" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Mostrar a janela de depuração do Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "&Assistente de Relatórios de Erros" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Mostrar o Assistente de Relatórios de Erros do Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Acerca" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Mostrar a janela 'Acerca do Kst'" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Ficheiro" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Sessões &Recentes" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "&Ficheiros de Dados Recentes" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Editar" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Ver" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Inte&rvalo" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Criar" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "'P&lugin' Normal" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "'Plugin' de Aj&uste" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "'Plugin' de &Filtragem" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Anotação" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Modo" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Modo de interacção" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "Ferramen&tas" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "&Configuração" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "A&juda" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Ficheiro" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Ferramentas" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Gama de Dados" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Modo" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Disposição do Gráfico" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Disposição Avançada" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Pronto" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Marcadores" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Linha Sólida" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Linha Tracejada" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Linha Ponteada" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Linha Traço-Ponto" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha Traço-Ponto-Ponto" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Linha Tracejada Personalizada" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Já existe um marcador de curva com um valor igual ou muito semelhante." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "O texto que indicou não é um número válido." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Marcadores de Eixos" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Novo ponto do marcador: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Adicionar" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Marcadores act&uais" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "Limpa&r" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Remover" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Aparência do Marcador" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Est&ilo da linha:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Co&r da linha:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Espessura da &linha:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Marcadores Automáticos" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "U&sar a curva como fonte dos marcadores:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Criar marcadores em:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Flanco &ascendente" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "Flanco &descendente" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "A&mbos" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Usar o &vector como fonte dos marcadores:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matriz" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Editar a Matriz" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Nova Matriz" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Escala e Translacção" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "T&amanho do passo em X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X mínimo:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y mínimo:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Ta&manho do passo em Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Parâmetros do Gradiente" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Incrementar/decrementar os valores de Z ao longo de:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Eixo dos X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Eixo dos Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z mínimo:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Passos em X:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Passos em Y:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z máximo:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Gama de Dados" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "&Trama inicial do Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "&Número de tramas em X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "A c&ontar do fim" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "Le&r até ao fim" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Número de tramas em &Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "L&er até ao fim" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "A contar do &fim" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Trama &inicial do X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " tramas" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Primeiro o &filtro 'boxcar'" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Ler &1 amostra por" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Fonte" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Ler da fonte de dados" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Gerar um gradiente" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Parâmetros da Fonte de Dados" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "&Campo ou coluna:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nome do ficheiro:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Ligar" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB disponíveis" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Tamanho da &letra:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "T&ipo de letra:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Usar o tipo de letra predefinido do gráfico" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " pontos" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Imagem" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Abrir uma Imagem" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Erro ao criar um objecto de imagem a partir do ficheiro do Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Criar uma Imagem" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Anos]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dias]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Horas]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minutos]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Segundos]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Gráfico" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Ampliação Máxima" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Ampliação Máxima Insensível a Picos" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Ampliação Anterior" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Ampliação Ligada" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Ampliação Ligada em X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Ampliação Ligada em Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Ampliação em Y Centrada na Média" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Ampliação em X Máxima" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Contorno Automático da Ampliação em X" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Ampliação Máxima em X Insensível a Picos" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Ampliação em X à Direita" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Ampliação em X à Esquerda" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Redução em X" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Ampliação em X" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalizar o Eixo X para o Eixo Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Eixo X logarítmico" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Ampliação Local em Y Máxima" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Ampliação em Y Máxima" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Contorno Automático em Y Automático" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Ampliação em Y Insensível a Picos" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Ampliação em Y para Cima" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Ampliação em Y para Baixo" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Redução em Y" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Ampliação em Y" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalizar o Eixo Y para o Eixo X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Eixo Y Logarítmico" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Ajustar a Escala de Cores da Imagem" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximizar o Gráfico" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Partilhar os Gráficos no Eixo do X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Partilhar os Gráficos no Eixo do Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Quebrar a Área Partilhada do Eixo" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copiar as Coordenadas" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copiar a Coordenada em X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copiar a Coordenada em Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copiar" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Ampliar" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtro" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Editar a Curva" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Ajustar" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Configuração da Caixa Partilhada do Eixo" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Informação copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Coordenada X copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Coordenada Y copiada para a área de transferência: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gráfico: %1 \n" "Conteúdo:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Gráfico Vazio" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto do gráfico a partir do ficheiro do Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Criar um Gráfico" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Criar um Gráfico para a Curva" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Ampliação Fixa da Expressão" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Ampliação em X do Intervalo da Expressão" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Ampliação Máxima" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Ampliação Máxima Insensível a Picos" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Ampliação Centrada na Média" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Ampliação em X Centrada na Média" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Ampliação em Y Centrada na Média" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Ampliação Máxima em X" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Ampliação em X com Contorno Automático" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Ampliação em X sem Picos" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Deslocar o X para a Direita" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Deslocamento em X à Esquerda" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Redução em X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Ampliação em X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Normalizar o Eixo X para o Eixo Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Ampliação Máxima Local em Y" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Ampliação Máxima em Y" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Ampliação em Y com Contorno Automático" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Ampliação em Y sem Picos" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Ampliação em Y para Cima" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Ampliação em Y para Baixo" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Redução em Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Ampliação em Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Normalizar o Eixo Y para o Eixo X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Ampliação Log. em X" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Ampliação Log. em Y" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Editar o Item do Gráfico" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Conteúdo" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Tipo de Letra do Topo" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Tipo de Letra do Fundo" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Tipo de Letra da Esquerda" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Tipo de Letra da Direita" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Tipo de Letra do Eixo" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Legendas" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Intervalo/Ampliação" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Eixo X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Eixo Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Marcadores do Eixo dos X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Marcadores do Eixo dos Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Tipo de Letra do Topo" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Tipo de Letra do Fundo*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Tipo de Letra da Esquerda*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Tipo de Letra da Direita*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Tipo de Letra do Eixo*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Desenho do Gráfico" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Modo de Referência" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Espectro de Potência" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Editar o Espectro de Potência" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Novo Espectro de Potência" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Conteúdo do Espectro de Potência" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dados:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nome" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Valor" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Intervalo" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Modo da Ampliação em X " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Auto com &contorno" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Auto insensível a &picos" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "C&entrado na média, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "&intervalo: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ixo, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "&de: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "&até: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "DEVIA ESTAR ESCONDIDO" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Modo da Ampliação em Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Auto com &contorno" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Auto in&sensível a picos" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "&Centrado na média, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "&intervalo: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fixo, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "&de: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&até: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Escalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Editar o Escalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Novo Escalar" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Ler da fonte de dado&s" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Gera um novo vector com as propriedades aqui indicadas como sendo a variável " "independente." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Ler do &vector de dados" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Ler da fonte de dados" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nome do ficheiro:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Campo:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Ligar" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "T&rama:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccione isto para ler os dados a partir do fim do ficheiro. Isto é útil " "para deslocar as visualizações quando o ficheiro está a ser actualizado por " "outra aplicação." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "ú<ima trama" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Gerar" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "V&alor: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "O valor máximo da variável independente." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nome" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Tipo" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Amostras" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Propriedades" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Caixa do Eixo Partilhada" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Quebrar a Caixa Partilhada do Eixo" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto de caixa partilhada a partir do ficheiro " "do Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Criar uma Caixa de Eixo Partilhado" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Cadeia de Caracteres" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Editar a Cadeia de Caracteres" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Nova Cadeia de Caracteres" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Ler da fonte de dado&s" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "Nome do &ficheiro:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "&Campo:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Ligar" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Valor: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Traço" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Sem Traço" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Linha Sólida" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Linha Tracejada" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Linha Ponteada" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Linha Traço-Ponto" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Linha Traço-Ponto-Ponto" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Linha Tracejada Personalizada" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Sem Pincel" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Padrão Sólido" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Padrão Denso 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Padrão Denso 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Padrão Denso 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Padrão Denso 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Padrão Denso 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Padrão Denso 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Padrão Denso 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Padrão Horizontal" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Padrão Vertical" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Padrão Cruzado" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Padrão Diagonal 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Padrão Diagonal 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Padrão Diagonal Cruzado" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Junção Central" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Junção em Cunha" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Junção Redonda" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Junção Central em SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Extremo Plano" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Extremo Quadrado" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Extremo Redondo" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "E&stilo:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "E&spessura:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "&Cor do pincel:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Estilo do &pincel:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Estilo da &junção:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "E&stilo dos extremos:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Abrir uma Imagem SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Erro ao criar o objecto SVG a partir do ficheiro do Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Criar um SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Ver o &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Mudar o Nome da Página" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Indique o novo nome da página:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Adicionar a página" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "Muda&r o nome da página" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Fe&char a página" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Editar a Vista" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Limpar a Disposição" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automática" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Personalizar" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Tema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Preenchimento" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Traço" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Tipos de letra" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "&Tamanho da letra:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "T&ipo de letra:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Itálico" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Negrito" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " pontos" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Gravar por omissão" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Aplicar aos objectos existentes" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vector" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Intervalo de Tempo" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Detecção de Modificações" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Sem Actualização" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Editar o Vector" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Novo Vector" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Gerar" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Número de amostras:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "O número de amostras para a nova variável independente." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&De:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "O valor mínimo da variável independente." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&até:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "O valor máximo da variável independente." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Ler da fonte de dado&s" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nome do ficheiro:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "&Campo ou coluna:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Ligar" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigurar..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Tipo de actualização. Use o 'Intervalo de Tempo' para os dados não locais." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automático" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Proteger a Disposição" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Personalizar" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Disposição em Colunas" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposição em colunas por ordem de criação.\n" "Seleccione o número de colunas:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Limpar a Disposição" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Ver o Menu" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Editar a Vista" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Preenchimento" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Editar" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Apagar" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Elevar" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Baixar" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automático" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Proteger a Disposição" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Colunas" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "B&loquear a Posição aos Dados" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Disposição em Colunas" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposição em colunas por ordem de criação.\n" "Seleccione o número de colunas:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menu de %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Limpar a Disposição" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Dimensionar" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Rodar" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Criar uma disposição" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Adicionar o Item à Disposição" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Mover" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Dimensionar" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Remover" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Elevar" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Baixar" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Rodar" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Editar o Item da Vista" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nome:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Editar Vários >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Aparência" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Tamanho/Posição" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Editar Uma" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Vista da Matriz" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Ver os Valores de Texto" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Ver os Valores Escalares" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Vista da Primitiva" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Actualizar" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Seleccionar os Vectors a Ver" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Ver os vectores seleccionados" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Remover os vectores seleccionados da lista" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Remover" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Algarismos significativos" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Mostrar como inteiro" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (por omissão)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Ver os Valores do Vector" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Mostrar a lista de vectores" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Esconder a lista de vectores" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Reiniciar a Vista" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Fechar" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Existe um erro no algoritmo %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "'Plugin': %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Erro: não foi possível criar o objecto de dados a partir do 'plugin'" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Erro: Não foi possível encontrar o 'plugin' para o objecto de dados" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Erro ao criar o objecto do 'plugin' a partir do ficheiro do Kst." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Não foi possível reservar memória suficiente para o Espectrograma." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Espectrograma: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Densidade Espectral da Amplitude" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Densidade Espectral da Potência" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Espectro de Amplitude" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Espectro de Potência" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frequência" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Tempo" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Espectrograma: %1\n" " Tamanho da FFT: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Média; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodizar; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Remover a Média;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Erro ao criar o espectrograma a partir do ficheiro do Kst." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar o espectrograma a partir do ficheiro do Kst. Não " "foi possível encontrar o Vector." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Curva" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 contra %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Curva: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "Erro em X+: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "Erro em X-: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Erro em Y+: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Erro em Y-: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Linhas: Largura %1 e Estilo %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Pontos: Estilo %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Barras" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Erro ao criar a curva a partir do ficheiro do Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Erro ao criar a curva a partir do ficheiro do Kst. Não foi possível " "encontrar o 'xVector'." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Erro ao criar a curva a partir do ficheiro do Kst. Não foi possível " "encontrar o 'yVector'." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "A analisar os 'plugins' de objectos de dados." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() de tid=%2: a gravar o resultado " "do bloqueio %3 (não é um fornecedor) -- provavelmente isto é um erro. Por " "favor, contacte o kst@kde.org com mais detalhes." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "A equação tem o objecto desconhecido [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Curva da Equação" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "Não foi possível encontrar os vectores da equação [%1] no seu novo " "processamento." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Não foi possível encontrar os vectores da equação [%1] na sua gravação. O " "ficheiro do Kst resultante poderá ter problemas." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "A equação [%1] faz referência a objectos inexistentes." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Não foi possível processar a equação [%1]. Seguem-se os erros." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Erro de Processamento: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Equação: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Ocorreu um erro ao criar a equação a partir do ficheiro do Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Erro ao criar a equação a partir do ficheiro do Kst. Não foi possível " "encontrar o 'xVector'." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "evento" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Evento: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "" "Ocorreu um erro ao criar o objecto EventMonitorEntry a partir do ficheiro do " "Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Número" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Percentagem" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fracção" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Frequência Normalizada" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histograma de %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histograma: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Auto-compartimentar" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 compartimentos de %2 até %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Ocorreu um erro ao criar o Histograma a partir do ficheiro do Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar o Histograma a partir do ficheiro do Kst. Não foi " "possível encontrar o Vector." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Imagem de %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Imagem: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Ocorreu um erro ao criar a Imagem a partir do ficheiro do Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Ocorreu um erro ao criar a Imagem a partir do ficheiro do Kst. Não foi " "possível encontrar a matriz." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Ano Juliano" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Tempo C normal" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Data Juliana" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Data Juliana Modificada" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Data Juliana Reduzida" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Tempo Atómico Internacional (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Hora do Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "AAAA/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/AAAA HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Texto Formatado" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Curva de DEP" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Tentou-se criar uma DEP que usou toda a memória." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "DEP: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Densidade Espectral" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "DEP" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Espectro de Amplitude" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Espectro de Potência" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frequência" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Espectro: %1\n" " Dimensão da FFT: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Média; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodizar; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Remover a Média;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "no PSDCalculator::calculatePowerSpectrum: foi recebida uma lista de " "resultado com o tamanho errado." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Ocorreu um erro ao criar a DEP a partir do ficheiro do Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "" "Ocorreu um erro ao criar a DEP a partir do ficheiro do Kst. Não foi possível " "encontrar o Vector." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Nível de Actividade de %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Nível de Actividade" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Nível de Actividade: %1\n" " Tempo de Amostragem: %2 (s)\n" " Largura da janela: %3 (s)\n" " Limiar do Ruído: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Erro: O vector de entrada é demasiado curto." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Erro: a janela deverá ser mais larga." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Nível de Actividade" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Calcula o nível de actividade de um sinal como sendo o produto do desvio-" "padrão com o número de reversões sobre uma janela deslizante." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Tempo de Amostragem (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Largura da Janela (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Limiar do Ruído" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Objecto de 'Plugin' de Compartimentos" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vector de entrada é inválido" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Erro: Sem Compartimentos" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Compartimento" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Agrupa os dados em compartimentos com o tamanho indicado. Cada compartimento " "contém a média dos elementos que pertencem a esse grupo." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Tamanho do Compartimento" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Objecto de 'Plugin' de Corte" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vector de entrada é inválido" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Corte" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Divide um dado conjunto de dados em sub-conjuntos pares, ímpares, de " "diferenças e índices." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Objecto de 'Plugin' de Convolução" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vectores de Entrada - tamanho inválido" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho de entrada calculado é inválido" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convolução" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Gera a convolução de um vector com outro." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Vector de Entrada 1" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Vector de Entrada 2" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Objecto de 'Plugin' de Desconvolução" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vectores de Entrada - tamanho inválido" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho da entrada calculado é inválido" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Desconvolução" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Gera a desconvolução de um vector com outro." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Vector de Entrada 1" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Vector de Entrada 2" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Objecto de 'Plugin' de Correlação Automática" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vector de entrada é inválido" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho da entrada calculado é inválido" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Correlação Automática" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Gera a correlação automática de um vector." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Correlação Cruzada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vectores de Entrada - tamanho inválido" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Erro: O tamanho da entrada calculado é inválido" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Correlação Cruzada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Gera a correlação de um vector com outro." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Vector de Entrada 1" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Vector de Entrada 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Objecto de 'Plugin' de Espectro Cruzado" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "'Plugin' de Objecto de Dados de Espectro Cruzado" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Gera o espectro cruzado de potência de um vector com outro." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Vector de Entrada 1" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Vector de Entrada 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Comprimento do FFT: 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Taxa de Amostragem" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Objecto de 'Plugin' de Largura da Banda Efectiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Erro: O tamanho do vector de entrada em X é inválido" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Erro: Os tamanhos dos vectores de entrada em X e em Y são diferentes" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Erro: Os índices calculados são inválidos" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Largura da Banda Efectiva" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "" "Calcula a largura de banda efectiva a partir de um espectro de amplitude." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Freq. Mín. Ruído Branco." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Frequência de Amostragem (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Objecto de 'Plugin' de Filtro Genérico" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Erro: O numerador do texto de entrada está vazio" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Erro: O denominador do texto de entrada está vazio" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Filtro Genérico" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Gera um filtro discreto a partir de uma definição de tempo contínuo." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Intervalo de amostragem (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numerador (ordem incremental)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Denominador (ordem incremental)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Objecto de 'Plugin' de Interpolação Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Curva de Interpolação Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "" "Gera uma interpolação de Akima não arredondada para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Objecto de 'Plugin' de Interpolação Akima Periódica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Curva de Interpolação Akima Periódica" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Gera uma interpolação de Akima periódica não arredondada para um conjunto de " "dados." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Objecto de 'Plugin' de Curva de Interpolação Akima Cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Curva de Interpolação Akima Cúbica" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Gera uma interpolação em curva para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Objecto de 'Plugin' de Curva de Interpolação Akima Cúbica Periódica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Curva de Interpolação Akima Cúbica Periódica" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Gera uma interpolação em curva cúbica para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Objecto de 'Plugin' de Interpolação Linear" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Curva de Interpolação Linear" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Gera uma interpolação linear para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Objecto de 'Plugin' de Interpolação Polinomial" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Curva de Interpolação Polinomial" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Gera uma interpolação polinomial para um conjunto de dados." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Vector de Entrada em X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Objecto de 'Plugin' de Ajuste Linear" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Erro: O tamanho do vector de entrada em Y é inválido" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Erro: O tamanho do vector de entrada em X é inválido" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Ajuste Linear" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Gera uma linha de ajuste óptimo para um conjunto de dados." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "'Plugin' de Objecto de Dados de Bloqueio" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Erro: Vectores de Entrada - tamanho inválido" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Bloqueio" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" "O Bloqueio amplifica os dados de entrada com uma onda portadora de referência" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Vector de Referência" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Objecto de 'Plugin' de Adição de Ruído" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vector de entrada é inválido" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Adição de Ruído" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Adiciona ruído Gaussiano a um conjunto de dados, com um dado desvio-padrão." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Objecto de 'Plugin' de Periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Erro: Os tamanhos dos vectores de entrada não correspondem" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodograma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Retira o vector do periodograma de um conjunto de dados de vectores de " "entrada. Os vectores de dados de entrada assumem-se como tendo sido " "amostrados com intervalos iguais do vector temporal de entrada." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Tempo do Vector de Entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Dados do Vector de Entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Factor de sobre-amostragem" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Factor médio da frequência de Nyquist" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Objecto de 'Plugin' de Fase" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Erro: a fase do valor escalar de entrada deverá ser maior que zero." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Erro: Os tamanhos dos vectores de entrada não correspondem." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Ajusta a fase de um dado conjunto de dados, com base no período de vector de " "fase nula." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Tempo do Vector de Entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Dados do Vector de Entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Período" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Fase a Zero" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Objecto de 'Plugin' de Desvio" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Desvio: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Desvio" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Desvia (e trunca) um vector." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Valor do desvio (# pontos, negativo permitido)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Estatísticas de %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Erro: O tamanho do vector de entrada é inválido" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Estatísticas" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Determina as estatísticas para um dado vector de entrada." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Vector de Entrada" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Objecto de 'Plugin' de Compartimentos Sincronizados" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Erro: O tamanho do vector de entrada em X é inválido" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Erro: Os tamanhos dos vectores de entrada não correspondem" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Erro: Os compartimentos deverão ser pelo menos 2" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Compartimentos Sincronizados" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Adiciona de forma sincronizada o vector Y aos compartimentos escalares de " "entrada definidos pelo vector X, como se fosse um mapa a 1D." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Vector de Entrada em X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Vector de Entrada em Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Número de Grupos" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X Mín" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X Máx" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Passa-Banda %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Filtro Passa-Banda" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vector com um filtro passa-banda de fase nula com uma resposta em " "amplitude Butterworth." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Vector de Entrada - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Ordem do Filtro:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Frequência Central / Taxa de Amostragem:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Largura de banda:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Corta-Banda %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Filtro Corta-Banda" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtra um vector com um filtro corta-banda de fase nula com uma resposta em " "amplitude Butterworth." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Vector de Entrada:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Ordem do Filtro:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Frequência Central / Taxa de Amostragem:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Largura de banda:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Passa-Alto %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Filtro Passa-Alto" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vector com um filtro passa-alto de fase nula com uma resposta em " "amplitude Butterworth." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Vector de Entrada:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Ordem do Filtro:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Frequência de Corte / Taxa de Amostragem:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Passa-Baixo %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtrado %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Filtro Passa-Baixo" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtra um vector com um filtro passa-baixo de fase nula com uma resposta em " "amplitude Butterworth." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Vector de Entrada:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Ordem do Filtro:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Frequência de Corte / Taxa de Amostragem:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Média Acumulada de %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Média Acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Média Acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Média Acumulada" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Calcula a média acumulada do vector de entrada." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Integral de %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Somatório Acumulado" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Calcula a soma acumulada (integral) do vector de entrada." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Passo (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 sem Picos" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Remoção de Picos" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtro de Remoção de Picos: %1\n" " Espaço: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Removeu-se os picos de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Filtro de Remoção de Picos" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Descobre e remove os picos, usando uma diferença de 3 pontos." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Vector de Entrada:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Espaçamento:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "N-Sigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Derivada de %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Derivada" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivada: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Erro: O passo do valor escalar de entrada não deverá ser 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Derivação em Passos Fixos" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Calcula a derivada discreta de um dado vector de entrada" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Passo (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Passagem Sobre %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Passagem" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtro de Passagem: %1\n" " %2 - %3\n" " Passo: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Passagem sobre %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Filtro de Passagem" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Passa sobre dados delimitados." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Vector de Entrada:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Mínimo:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Máximo:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Passo Máx (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Exponencial Não-Ponderado de %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Ajuste Exponencial a %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Resíduo do Ajuste Exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Ajuste Exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Gera um ajuste exponencial para um conjunto de dados." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Exponencial Ponderado de %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Ajuste Exponencial a %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Resíduo do Ajuste Exponencial" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Ajuste Exponencial Ponderado" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Gera um ajuste exponencial ponderado para um conjunto de dados." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Gaussiano Não-Ponderado de %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Ajuste Gaussiano a %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Resíduo do Ajuste Gaussiano" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Ajuste Gaussiano" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Gera um ajuste Gaussiano para um dado conjunto de dados." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Gaussiano Ponderado de %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Ajuste Gaussiano a %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr " Resíduo do Ajuste Gaussiano" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Ajuste Gaussiano Ponderado" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Gera um ajuste Gaussiano ponderado para um dado conjunto de dados." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "Gradiente Não-Ponderado de %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Ajuste Gradiente a %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr " Resíduo do Ajuste Gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Limite Inferior do Ajuste Gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Limite Superior do Ajuste Gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Ajuste Gradiente" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Gera um ajuste gradiente para um dado conjunto de dados." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Gradiente Ponderado de %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Ajuste Gradiente a %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Resíduo do Ajuste Gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Limite Inferior do Ajuste Gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Limite Superior do Ajuste Gradiente" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Ajuste Gradiente Ponderado" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Gera um ajuste gradiente ponderado para um dado conjunto de dados." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Pesos:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "'Plugin' de Filtragem por Frequência de Corte" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Erro: Os tamanhos dos vectores de entrada não correspondem" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Erro: O vector de entrada em X é inválido" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Erro: As frequências de entrada são inválidas\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Erro: Os dados de entrada são inválidos.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Ajuste por Frequência de Corte" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Gera um ajuste por frequência de corte para um dado conjunto de dados." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Vector de Entrada - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Vector de Entrada - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Escalar de Entrada - Máx. 1/f^a Freq" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Escalar de Entrada - Freq Mín Ruído Branco" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Escalar de Entrada - Ruído Branco C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "Linear Não-Ponderado de %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Ajuste Linear a %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Resíduo do Ajuste Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Limite Inferior do Ajuste Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Limite Superior do Ajuste Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Ajuste Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Gera um ajuste linear para um dado conjunto de dados." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "Linear Ponderado de %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Ajuste Linear a %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Resíduo do Ajuste Linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Limite Inferior do Ajuste Linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Limite Superior do Ajuste Linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Ajuste Linear Ponderado" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Gera um ajuste linear ponderado para um conjunto de dados." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector de Entrada - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector de Entrada - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de Entrada - Pesos" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Lorentziano de %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajuste de Lorentz a %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Resíduo do Ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Gera um ajuste de Lorentz para um dado conjunto de dados." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Lorentziano Ponderado de %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajuste de Lorentz a %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Resíduo do Ajuste de Lorentz" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Ajuste de Lorentz Ponderado" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Gera um ajuste de Lorentz ponderado para um dado conjunto de dados." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector de Entrada - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector de Entrada - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de Entrada - Pesos" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Polinomial de %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajuste Polinomial a %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Resíduos do Ajuste Polinomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Ajuste Polinomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Gera um ajuste polinomial para um dado conjunto de dados." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Ordem:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Polinomial Ponderado de %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajuste Polinomial a %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr " Resíduo do Ajuste Polinomial" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Ajuste Polinomial Ponderado" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Gera um ajuste polinomial ponderado para um dado conjunto de dados." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector de Entrada - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector de Entrada - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de Entrada - Pesos" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Escalar de Entrada - Ordem" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Sinusoidal de %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Ajuste Sinusoidal a %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Resíduo do Ajuste Sinusoidal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Ajuste Sinusoidal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Gera um ajuste sinusoidal para um dado conjunto de dados." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmónicas:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Período:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Sinusoidal Ponderado de %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Ajuste Sinusoidal a %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Resíduo do Ajuste Sinusoidal" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Ajuste Sinusoidal Ponderado" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Gera um ajuste sinusoidal ponderado para um dado conjunto de dados." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector de Entrada - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector de Entrada - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector de Entrada - Pesos" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Escalar de Entrada - Harmónicas" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Escalar de Entrada - Período" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Vector de Entrada da Amostra" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Inserir um Novo &Vector" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Inserir um Novo E&scalar" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Editar" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Inserir um Novo E&scalar" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Inserir um Novo &Texto" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Editar" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Paleta de c&ores:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Aparência" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "Es&pessura:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Tipo de Ponto" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Se o \"Mostrar os Pontos\" estiver assinalado, o tipo de ponto seleccionado " "será desenhado em cada ponto de dados." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Tipo de Linha" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Se o \"Mostrar as Linhas\" estiver assinalado, o estilo de linha " "seleccionado será o usado." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "" "Assinale esta opção para que sejam desenhadas linhas entre os pontos de " "dados." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Linhas" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Assinale esta opção para que sejam desenhados os pontos seleccionados em " "cada ponto de dados." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "P&ontos" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "Cabeçal&ho" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Gráfico de &Barras" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Espessura da Linha" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Se o \"Mostrar as Linhas\" estiver assinalado, será usada a largura de linha " "seleccionada." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Tamanho:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Densidade do Ponto:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Tudo" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Alta" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Média" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Baixa" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Colocação" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Ajustar os tamanhos de letra" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Colocar num &novo gráfico" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "Numa página no&va" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "O nome do ficheiro de dados que será lido para este vector." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Colocar no gráfico &existente " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Não coloc&ar em nenhum gráfico" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Disposição automáti&ca" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "&Grelha personalizada" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Colu&nas" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Proteger a disposição existente" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Seleccione uma curva a usar." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "tramas" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Gama de Dados" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Seleccione isto para definir a média das tramas ignoradas em conjunto. " "Possibilita uma filtragem passa-baixo simples." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Primeiro o &filtro 'boxcar'" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Poupa memória ao fazer uma amostra esparsa dos dados" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Seleccione isto para ignorar algumas tramas, em vez de ler todos os dados. " "Isto é útil para ler ficheiros de dados muito grandes mas pouco alterados." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Ler &1 amostra por:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Seleccione isto para ler todos os dados até ao fim do ficheiro. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "L&er até ao fim" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "ou" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccione isto para ler os dados a partir do fim do ficheiro. Isto é útil " "para deslocar as visualizações quando o ficheiro está a ser actualizado por " "outra aplicação." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "A c&ontar do fim" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Número de tramas a ignorar, se o \"Ler 1 amostra por\" estiver seleccionado." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " tramas" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Início:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Inte&rvalo:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Indique um número (a começar em 0 para o primeiro valor) ou uma data no " "formato [[[[AAAA:]MM:]DD:]HH:]MM[.SS]." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "O índice dos primeiros dados lidos. Para os ficheiros ASCII, este é o número " "de linha dos dados no ficheiro. Para os ficheiros baseados em tramas, esta é " "a primeira trama." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "A quantidade de dados a ler para o vector. Para os ficheiros ASCII, este é o " "número de linhas de dados. Para os ficheiros de tramas, poderá corresponder " "a mais do que uma amostra por trama. As datas são introduzidas no formato " "[[[[AAAA:]MM:]DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "O ficheiro não foi encontrado.\n" "Verifique por favor se foi indicado um nome correcto para o mesmo." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Opções do FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Por Omissão" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "coseno" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussiano (Sigma Personalizado)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Seleccione da lista o vector de origem para as barras de erro da curva no " "eixo dos Y. Se o \"\" estiver seleccionado, não serão desenhadas " "nenhumas barras de erro no eixo dos Y. Crie os novos vectores com a página " "\"Vectores\"." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&zar" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ção:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Remo&ver a média" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Comprimento do FFT: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Define o tamanho das FFTs ao gerar o espectro de potência. 2^10 = 1024, " "etc. Quanto maior o número, maior o ruído e a resolução." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Média i&nterpolada" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpolar sobre as &lacunas" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Taxa de a&mostragem:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "A taxa de amostragem com que foram adquiridas as medidas, para uma " "normalização conveniente." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Aplicar as novas especificações de amostras de dados aos vectores " "seleccionados." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Unidades do vector:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "As unidades do vector de dados - para legendas automáticas." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Unidades da taxa:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "As unidades para a taxa de amostragem. Usadas nas legendas automáticas." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "S&aída:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Densidade Espectral da Amplitude (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Densidade Espectral da Potência (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Espectro de Amplitude (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Espectro de Potência (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Abrir um Ficheiro" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Todos os Ficheiros (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Pasta dos Ficheiros de Registo" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Gravar o Ficheiro" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um sub-conjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto colorido}, \\textbf{texto a negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Poderá incorporar valores escalares, equações e " "elementos vectoriais. Escalar: [V1/Média]. Elemento de Vector: [V1" "[4]]. Equação: [=[V1/Media]^2]. Poderá introduzir um carácter '[' " "como \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "O texto da legenda. É suportado um sub-conjunto do LaTeX. Carregue em " "'Ajuda' para esclarecimentos." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Escalares " "& equações
Os escalares e as equações escalares podem ser " "vistos ao vivo em legendas. Quando o escalar é actualizado, a legenda também " "o é. Os nomes dos escalares estão sujeitos a completação automática. O " "formato é o seguinte:

Escalar: " "[scalarname], p.ex. [GYRO1:Mean(X4)]

Elemento de Vector:[vectorName[index]], p.ex., [GYRO1 (V2)[4]]

Equação: [=equation], p.ex. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Sub-" "Conjunto de LaTeX Suportado
As legendas no kst suportam " "um sub-conjunto derivado do LaTeX. Por exemplo, para mostrar a equação para " "a área de um círculo, poderia definir a legenda como sendo A=2\\pir^2. Ao " "contrário do desejado, isto deverá ser feito de forma explícita com o " "\\textit{}. As sequências suportadas são:

Letras gregas: \\nome ou \\Nome. p.ex.: \\alpha

Outros símbolos: \\approx,\\cdot,\\ge,\\geq," "\\inf,\\int,\\le," "\\leq,\\ne," "\\partial," "\\prod,\\pm," "\\sum,\\sqrt

Efeitos dos tipos de letra: " "\\textcolor{colorname}{texto colorido}, \\textbf{texto negrito},\\textit{texto " "itálico},\\underline{texto sublinhado},\\overline{texto sobrelinhado}.

Outro:x^y,x_y, \\t,\\n, " "\\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Suporta os símbolos de LaTeX, textos e escalares, assim como equações " "incorporadas." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Legenda:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Ajuda" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "A sintaxe das legendas é derivada de um sub-conjunto do LaTeX. A sintaxe " "suportada é: \\[nome-letra-grega] e \\[Nome-letra-grega], " "\\approx, \\cdot, \\ge, \\geq, \\inf, " "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{nome da cor}{texto colorido}, \\textbf{texto a negrito}, \\textit{texto em itálico}, " "\\t, \\sum, \\sqrt, \\underline{texto sublinhado}, " "x^y, x_y. Poderá incorporar valores escalares, equações e " "elementos vectoriais. Escalar: [V1/Média]. Elemento de Vector: [V1" "[4]]. Equação: [=[V1/Media]^2]. Poderá introduzir um carácter '[' " "como \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "O texto da legenda. É suportado um sub-conjunto do LaTeX. Veja a ajuda 'O " "que é Isto?'." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccione o vector a utilizar. Se deseja criar um novo vector, utilize o " "ícone à direita." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Criar um novo vector." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Abre uma janela de vector para criar um novo vector, que se torna o vector " "seleccionado." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Editar o vector seleccionado." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Aplicar uma janela de vector para editar o vector seleccionado." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Janela" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Fechar" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Janela" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Procurar:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Seleccione o escalar a utilizar. Se deseja criar um novo escalar, utilize o " "ícone à direita." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Criar um novo escalar." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Editar o escalar seleccionado." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Seleccione o texto a utilizar. Se deseja criar um novo texto, utilize o " "ícone à direita." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Criar um novo texto." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Editar o texto seleccionado." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccione o vector a utilizar. Se deseja criar um novo vector, utilize o " "ícone à direita." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Criar um novo vector" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Abre uma janela de vector para criar um novo vector, que se torna o vector " "seleccionado." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Editar o vector seleccionado." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Abre uma janela de vector para editar o vector seleccionado." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Elementos do Kst" Kst-2.0.8/po/kst_common_en_GB.po0000644000175000017500000106754412362706252015565 0ustar synthsynth# Steve Allewell , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-07-06 22:29+0100\n" "Last-Translator: Steve Allewell \n" "Language-Team: British English \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Apply these settings as default" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Preview First 1000 Lines in New Window" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "First lines " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Preview]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Header" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Data starts at line:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Read field names from line:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Read units from line:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Comment indicators:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Decimal Separator:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Dot" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Comma" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Data Column Layout" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Space/tab delimited" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Custom delimiter" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "Reading is faster if each column can be assumed to have its own constant " "width." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Each column has its\n" "own constant width" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Fixed Width" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "General Options" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Limit Buffer Size:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Use threads" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Always accept files matching:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpret empty value as:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Previous value" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Date/Time Interpretation" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Value" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Interpret field" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "as:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "C Time" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Seconds" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Index with frequency" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Formatted String. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Offset" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Date/Time:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "File date" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relative" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "First lines of file '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "Line %1 cannot list field names AND values!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "Line %1 cannot list units AND values!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "Line %1 cannot list field names AND units!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Inconsistent parameters" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "ASCII File Reader" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Parsing '%1' ..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Finished parsing '%1'" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Parsing '%1': %2 rows" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Reading field: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "INDEX created" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Finished reading: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "reading ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "parsing ..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Column %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "DirFile Reader" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "FITS Image Source Reader" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Matlab Datasource Reader" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Matlab's .mat Datasource Reader" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "netCDF Reader" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "QImage Source Reader" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Sample Datasource Reader" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Source List Reader" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Column %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Data file for matrix %1 was not opened." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Data file for vector %1 was not opened." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 of %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Data file for vector %1 was not opened." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Data file for scalar %1 was not opened." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 of %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "frames" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Plugin Search Paths:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Scanning for data-source plugins." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Plugin loaded: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "instance failed for %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "File '%1' does not exist." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Data file for string %1 was not opened." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Data String: %1 = %4\n" " %2\n" " Field: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 of %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Data file for vector %1 was not opened." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Data Vector: %1\n" " %2\n" " Field: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Last %1 frames." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Frame %1 to end." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 Frames starting at %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Read 1 sample per %1 frames." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Average each %1 frames." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 of %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Error" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Warning" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Notice" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Trace" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Other" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst version %1\n" "\n" "\n" "Kst log:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Data-source plugins:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Editable Vector: %1\n" " %2 values" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Generated Vector: %1\n" " %2 values from %3 to %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 points from %1 to %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "Saved matrix contains less data than it claims." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matrix: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Error creating Generated Matrix from Kst file." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Error creating Editable Matrix from Kst file." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Error creating Data Matrix from Kst file." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Scalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Scalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Value: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Error creating scalar from Kst file." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "String: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Error creating string from Kst file." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Provider: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vector: %1\n" " %2 samples\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Error creating vector from Kst file." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Error creating generated vector from Kst file." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Data file for scalar %1 was not opened." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 frame %3 of %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - A data viewing program.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revision %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Homepage:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Authors and contributors (sorted alphabetically):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "About Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Kst Settings" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "General" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Scaling" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Grid" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Layout Properties" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Arrow" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Error creating arrow object from Kst file." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Create Arrow" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Properties" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "ArrowProperties" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Arrow at &start" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "S&tart arrow scale" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Arrow Head Size" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "The size of the arrow head is proportional to this value." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Arrow at &end" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "E&nd arrow scale" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Axis" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Coarse" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fine" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Very Fine" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Solid Line" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Dash Line" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Dot Line" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Dash Dot Line" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Dash Dot Dot Line" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Custom Dash Line" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Hide left" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Hide right" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Hide Margins and Labels" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Hide top" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Hide bottom" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Label Rotation" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotation :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Base / Offset Mode" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "On" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Off" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Digits before automatic base/offset mode:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Force offset to axis minimum" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Scale" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarithmic" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "&Reverse" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Axis is time" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpret the axis as time." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpret as:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Time encoding type" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "The axis represents time, whose encoding is selected here." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Display as:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Time display format" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Timezone:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Time/Date format:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Date: y/M/d - Time: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Major Ticks and Lines" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Dra&w ticks" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Draw &grid lines" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Major s&pacing:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Density of major ticks" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "Grid line &style:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "Grid line &colour:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Width:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Minor Ticks and Lines" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Dr&aw ticks" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Draw grid lines" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Minor tic&k count:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Line st&yle:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Lin&e colour:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: File not found. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Dialog" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "TextLabel" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Select new data file:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Unknown file type" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figure..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Change" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Skip" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Basic Plugin" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Edit %1 Plugin" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "New %1 Plugin" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Unable to create Plugin Object using provided parameters.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Inputs and Outputs" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Box" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Error creating box object from Kst file." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Create Box" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bit" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bit" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Bug Report Wizard" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Kst version:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "OS:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Launch Bug Report Wizard" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Button" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Error creating button object from Kst file." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Cartesian Plot" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "frames" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Insufficient Memory" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Change Data Samples" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Vector Selection" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "The source file for the vectors selected in this list will be changed." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Select all vectors in the list." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Add A&ll" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Add" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Unselect all vectors in the list." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Remove" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "R&emove All" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "The file could not be loaded or contains no data." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "The following field is not defined for the requested file:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "The following fields are not defined for the requested file:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Change Data File" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Select by Source File" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Add All &From:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Vector and Matrix Selection" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "The source file for the vectors selected in this list will be changed." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Select all vectors in the list." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Add A&ll" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Add" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Unselect all vectors in the list." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Remove" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "R&emove All" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "New Data File" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&File:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "C&hange selected vectors and matrices" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "D&uplicate derived objects (curves, equations, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplicate selected vectors and matrices" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Unknown File Type" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figure..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Assign Curve Colour From File" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Assign Colours" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Base Curve Colour on:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "&X vector" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "&Y vector" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Radius" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centre" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Lock Position To Data" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Circle" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Error creating circle object from Kst file." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Create Circle" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Size/Position" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "end" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Column %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Usage: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Usage: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Usage: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Usage: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Usage: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Usage: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Usage: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Usage: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Usage: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "No data files specified\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "file %1 does not exist\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Usage: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Usage: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Usage: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Usage: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Usage: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Usage: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Raise in plot order: Alt+Up" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Lower in plot order: Alt+Down" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "&Available objects:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Deselect All" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Select All" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Edit" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Raise in plot order: Alt+up" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Lower in plot order: Alt+down" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Displayed objects:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "buttonGroup" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spectrogram" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Edit Spectrogram" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "New Spectrogram" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Spectrogram Contents" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Data vector:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Window size:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Image Options" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Curve" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Edit Curve" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "New Curve" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Curve Contents" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "&X-axis vector:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "&Y-axis vector:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "+X e&rror bar:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "&+Y error bar:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "-X error bar:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "&-Y error bar:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Use +X error bar for -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "U&se +Y error bar for -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnore in automatic axes range calculations" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Name:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Edit Multiple >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Edit one %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Enter your filter here (wildcards allowed)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Edit" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Make Curve" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Make Power Spectrum" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Make Spectrogram" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Make Histogram" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Apply Filter" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Make Image" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Add to Plot" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Remove From Plot" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Apply Fit" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Delete" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Data Manager" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filter on:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "All Columns" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Name" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Type" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Samples" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Properties" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Case sensitive" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Purge" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Error creating data source from Kst file." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Time Interval" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Change Detection" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "No Update" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Raise in plot order: Alt+Up" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Lower in plot order: Alt+Down" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vector(s) available" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vector(s) selected" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Create S&pectra Plots. Set FFT options below:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Insufficient Memory" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Create &XY plots. Set X-axis vector properties below:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Create fr&om field:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Use existin&g:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "The field to be used as the X-axis in XY curves." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Unknown file type" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figure..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "Update type; use 'Time Interval' for non-local data" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filters" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&New Filter..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Curve Placement" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&All curves in one plot" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 new plot per curve" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Cycle t&hrough" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " plots" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Cycle through exis&ting plots" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "All curv&es in plot" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Plot Placement (Tabs)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "All in ¤t tab" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "All in ne&w tab" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY and spectra in &separate new tabs" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Plot Layout" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Automatic &layout" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Custo&m grid" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Columns:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&rotect existing layout" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Labels" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Rescale all labels on tab" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Share axis on tab" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Cur&ve Style" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "L&ines only" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "&Points only" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Lines an&d points" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Spectrum Axis Mode" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Lo&g X-axis" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "&Log Y-axis" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legends" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "O&n" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Off" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertical" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Raise in plot order (Alt-up)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Selected data: All fields in this list are plotted." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Selected data:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vector(s) selected" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Search Filter" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "S&earch" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Field selection: Ticked fields are plotted." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Available data:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vector(s) available" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Version %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Version %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Kst Debug Dialog" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Build Information" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Email Debugging Information" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Log" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Log level: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Warning" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Notice" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Trace" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Clea&r" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Data Sources" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Loaded Instance" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "&Close" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "An error has occurred. Click on this icon for more details." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Fonts" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Letter" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Journal Plot" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Custom" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Minimum font size (points):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "On window resize, fonts will be displayed at least this large." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Reference view size:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "When the window is this large, fonts will have stated size." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Custom reference size (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Save as default" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Apply to existing objects" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Move the selected property up the priority list" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Move the selected property down the priority list" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "Add the selected property to the list of properties to cycle through" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Remove the selected property from the list of properties to cycle through" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Line Colour" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Point Style" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Line Style" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Line Width" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Differentiate Curves" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Property Selection and Cycle Order" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Raise in Selection Order: Alt+up" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Lower in Selection Order: Alt+down" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Available:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Selected:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Options" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Maximum line width:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Point density:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "All" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "High" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Medium" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Low" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Size/Position" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotation:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Size:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Position:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Fix aspect ratio" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Lock Position To Data" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "File could not be opened for writing." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "File could not be opened for reading." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "File is malformed and encountered an error while reading." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Select Objects to Edit" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filter:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Clear" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Select &All" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Ellipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Error creating ellipse object from Kst file." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Create Ellipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Equation" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Edit Equation" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "New Equation" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Equation" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Eq&uation:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "&X vector:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpolate to highest resolution vector" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Event Monitor" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Edit Event Monitor" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "New Event Monitor" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "E-Mail Notification" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "N&otify:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expression" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vectors:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operators:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Scalars:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expression:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Description:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Execute:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tify:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configure..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Kst Debug Log" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Warning" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Notice" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Log as:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Export to Graphics File" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Base name:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&File format:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Size" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Width:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Width (in Pixels) of the image." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Height:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Height of the image (in pixels)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "S&pecify:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Width and Maintain Aspect Ratio" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Height and Maintain Aspect Ratio" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Width and Height" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Size of Square" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Save Options" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "Do not autosave. Instead, on OK or Apply, save once." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Sa&ve once" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Save image on timer" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "When ticked, the image will be repeatedly saved using the indicated period. " "This is useful, for example, for live web page images." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "&Autosave every" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Autosave timer" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Automatic &extension" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Include:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Vector formats" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Bitmap formats" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Export Vectors" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Vector Selection" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "The source file for the vectors selected in this list will be changed." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Select all vectors in the list." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "Add A&ll" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Add" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Unselect all vectors in the list." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Remove" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "R&emove All" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "&Save location:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Fill" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "No Brush" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Solid Pattern" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Dense Pattern 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Dense Pattern 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Dense Pattern 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Dense Pattern 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Dense Pattern 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Dense Pattern 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Dense Pattern 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Horizontal Pattern" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Vertical Pattern" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Cross Pattern" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonal Pattern 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonal Pattern 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonal Cross Pattern" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Colour:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Style:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Use &linear gradient" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Reset Gradient" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Plugin" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Edit %1 Plugin" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "New %1 Plugin" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Unable to create Plugin Object using provided parameters.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Plugin Selection" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Plugin name:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Description:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Inputs and Outputs" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnore in automatic axes range calculations" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "General" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Dynamic files update this fast or slower." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Period between updates (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Use transparency when dragging" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Render using \"raster\". This is always better." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Use \"raster\" engine on (Kst restart needed)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "&Antialias Plots" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Grid" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Show &grid" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "&Snap to grid" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Grid &horizontal spacing:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Grid &vertical spacing:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogram" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Edit Histogram" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "New Histogram" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Histogram Properties" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Data vecto&r:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Bins from&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "to:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Num bin&s:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "The number of bins in the Histogram." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "A&uto Bin" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Real&-time auto bin" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Y-axis Normalisation" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "" "The Y axis of the histogram reports the fraction of samples in the bin." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fraction in bin" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "The Y axis of the histogram reports the number of samples in the bin." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "Nu&mber in bin" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "The Y axis of the histogram is normalised so that the highest bin is 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Peak bin = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "The Y axis of the histogram reports the percent of the samples in the bin." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&t in bin" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Image" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Edit Image" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "New Image" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Image Contents" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matrix:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Image Type" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "Colour m&ap" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Con&tour map" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "&Colour map and contour map" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Colour Map Parameters" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&Upper:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Threshold - &Lower:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Smart" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&ile:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "&Real-time auto threshold" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Contour Map Parameters" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Co&lour:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Num&ber of contour levels:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Weight:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Use &variable line weight" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Create Label Dialog" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Dialog" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Lock Position To Data" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Right" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Left" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Reference Point:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Bold" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " points" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Font famil&y:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Colour" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Font &size:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Italic" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Save as default" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Lock Position To Data" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Right" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Left" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Label Reference Point:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotation" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Position" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Label" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Create Label" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Properties" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Size/Position" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Label Properties" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Font &size:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Font famil&y:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Italic" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Bold" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " points" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Labels" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Default plot font &size:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "points" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Automatically scale number axis labels" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "&Top label:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Botto&m label:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Left label:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "&Right label:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Show le&gend" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&dit" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Layout Box" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Layout" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "&Horizontal margin:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "&Vertical margin:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Hori&zontal spacing:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Ver&tical spacing:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legend" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Empty Legend" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Contents:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legend" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Raise in list order: Alt+Up" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Lower in list order: Alt+Down" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Title:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Use automatic plot-based contents" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Display &vertically" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "&Available objects:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Displayed objects:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Raise in plot order: Alt+up" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Up" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Remove: Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Select: Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Lower in plot order: Alt+down" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Down" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Legend Font Settings" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Font si&ze:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " points" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Bold" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Italic" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Font family" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Lock Position To Data" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LineEdit" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Error creating lineEdit object from Kst file." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Line" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Move" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Resize" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Error creating line object from Kst file." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Create Line" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Size/Position" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script: Running" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script: Finished" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script: return code %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Script error: Failed to start" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Script error: Crashed" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Script error:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Make a log entry" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "&Rerun Script" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Apply" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "&Close" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Message" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Message:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Clear" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Script output:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuration" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Plot Properties" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Width:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Width and Maintain Aspect Ratio" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Height and Maintain Aspect Ratio" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Width and Height" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Size of Square" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Height:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Height of the image (in pixels)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&File format:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "S&pecify:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Width (in Pixels) of the image." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Local log directory:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "&User name:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Save Prompt" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Your document has been modified.\n" "Save changes?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Save File" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Kst Sessions (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Open File" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Cleanup Non-Existent Files" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "For details see Help->Debug Dialog->Log." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Error opening document:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Open..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Open a new session" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Save" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Save the current session" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Save &as..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "Ne&w Session" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Close current session and start a new, empty one" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Reload All &Data Sources" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Reload all data sources" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Print..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Print the current view" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Export as Image(s)..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Export graphics to disk" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Save &Vectors to Disk..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Export vectors to ascii file" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "&Log Entry..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Commit a log entry" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&New Tab" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Create a new tab" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "&Close Tab" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Close the current tab" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "E&xit" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Exit the application" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vectors" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Show all vectors in a spreadsheet" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Scalars" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Show all scalars in a spreadsheet" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrices" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Show all matrices in a spreadsheet" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "S&trings" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Show all strings in a spreadsheet" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "&Back One Screen" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Back one screen" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Forward One Screen" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Forward one screen" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Count from End" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Set all data vectors to count from end mode" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Read to End" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Set all data vectors to read to end mode" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pause" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Toggle pause updates of data sources" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Change Data &Sample Range..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Show Kst's Change Data Sample Range Dialog" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Plot" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Create a plot for the current view" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Scalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vector" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matrix" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Strin&g" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Curve" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Equation" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Po&wer Spectrum" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histogram" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Image" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spectr&ogram" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Eve&nt Monitor" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Label" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Create a label for the current view" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Box" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Create a box for the current view" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Circle" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Create a circle for the current view" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Ellipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Create an ellipse for the current view" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Line" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Create a line for the current view" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Arrow" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Create a arrow for the current view" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Picture" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Create a picture for the current view" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&Svg" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Create a svg for the current view" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "Shared Axis &Box" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Create a shared axis box for the current item" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "&Toggle Tied Zoom" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Toggle the current view's tied zoom" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Tie &Across All Tabs" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Tied zoom applies between tabs" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Highlight Data Points" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Highlight closest data point" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "X-Y &Zoom/Scroll" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Zoom arbitrarily in X- or Y-direction" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "&X-only Zoom" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoom only in X direction" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "&Y-only Zoom" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "&Layout Mode" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Toggle the current view's layout mode" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "Data &Manager" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Show Kst's data manager window" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "&Data Wizard" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Show Kst's Data Wizard" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Change Data &File" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Show Kst's Change Data File Dialog" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Assign Curve &Colour per File" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Show Kst's Choose Colour Dialog" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "D&ifferentiate Curves" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Show Kst's Differentiate Curves Dialog" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configure Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Show Kst's Configuration Dialog" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Theme" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Show Kst's Theme Dialog" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "&Debug Dialog" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Show the Kst debugging dialog" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "&Bug Report Wizard" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Show Kst's Bug Report Wizard" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&About" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Show Kst's About box" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&File" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "&Recent Sessions" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Recent Data &Files" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Edit" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&View" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "&Range" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Create" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Standard P&lugin" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Fit Pl&ugin" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Fil&ter Plugin" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Annotation" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Mode" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Interaction mode" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Tools" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "&Settings" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Help" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "File" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Edit" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Tools" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Data Range" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Mode" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Plot Layout" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Advanced Layout" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Ready" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Markers" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Solid Line" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Dash Line" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Dot Line" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Dash Dot Line" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Dash Dot Dot Line" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Custom Dash Line" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "A plot marker with equal (or very close) value already exists." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "The text you have entered is not a valid number." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Axis Markers" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&New marker point: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Add" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "C&urrent markers" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Clear" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Remove" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Marker Appearance" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Line st&yle:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Line co&lour:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Line &width:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Automatic Markers" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Use curve as marker &source:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Create markers on:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "R&ising edge" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "&Falling edge" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "&Both" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Use &vector as marker source:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matrix" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Edit Matrix" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "New Matrix" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Scaling and Translation" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "X step si&ze:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X minimum:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y minimum:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Y ste&p size:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Gradient Parameters" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Increment/decrement Z values along:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "X-axis" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Y-axis" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z at minimum:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "X steps:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Y steps:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z at maximum:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Data Range" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "or" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Y s&tarting frame:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "X n&umber of frames:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "C&ount from end" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Read to end" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Y nu&mber of frames:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "R&ead to end" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Count from en&d" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "X &starting frame:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " frames" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Boxcar &filter first" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Read &1 sample per" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Source" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Read from data source" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Generate gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Data Source Parameters" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "F&ield or column:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "File name:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Connect" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigure..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB available" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Font &size:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Font famil&y:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Use plot default font" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " points" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Picture" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Open Image" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Error creating picture object from Kst file." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Create Picture" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Years]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Days]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Hours]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minutes]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Seconds]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Plot" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom Maximum" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom Max Spike Insensitive" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zoom Previous" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zoom Tied" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom X Tied" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom Y Tied" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom Mean-centred Y" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "X-Zoom Maximum" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "X-Zoom Auto Border" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "X-Zoom Spike Insensitive" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "X-Zoom Right" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "X-Zoom Left" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "X-Zoom Out" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "X-Zoom In" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalise X-axis to Y-axis" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Log X-axis" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Y-Zoom Local Maximum" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Y-Zoom Maximum" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Y-Zoom Auto Border" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Y-Zoom Spike Insensitive" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Y-Zoom Up" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Y-Zoom Down" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Y-Zoom Out" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Y-Zoom In" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalise Y-axis to X-axis" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Log Y Axis" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Adjust Image Colour Scale" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximise Plot" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Share Plots on X-Axis" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Share Plots on Y-Axis" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Break Shared Axis Box" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copy Coordinates" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copy X Coordinate" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copy Y Coordinate" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copy" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filter" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Edit Curve" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Fit" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Shared Axis Box Settings" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Info copied to clipboard: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "X coordinate copied to clipboard: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Y coordinate copied to clipboard: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Contents:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Empty Plot" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Error creating plot object from Kst file." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Create Plot" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Create Plot For Curve" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Zoom Fixed Expression" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Zoom X Range Expression" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom Maximum" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom Max Spike Insensitive" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom Mean Centred" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom X Mean Centred" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom Y Mean Centred" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom X Maximum" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom X Auto Border" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom X No Spike" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Scroll X Right" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Scroll X Left" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Zoom X Out" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Zoom X In" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom Normalise X to Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom Y Local Maximum" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom Y Maximum" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom Y Auto Border" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom Y No Spike" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom Y Up" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom Y Down" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Zoom Y Out" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Zoom Y In" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom Normalise Y to X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X Log" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y Log" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Edit Plot Item" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Contents" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Top Font" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Bottom Font" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Left Font" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Right Font" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Axis Font" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Labels" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Range/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "X-Axis" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Y-Axis" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "X-Axis Markers" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Y-Axis Markers" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Top Font*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Bottom Font*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Left Font*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Right Font*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Axis Font*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Plot Render" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Reference Mode" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Power Spectrum" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Edit Power Spectrum" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "New Power Spectrum" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Power Spectrum Contents" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Data vecto&r:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Name" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Value" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Range" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "X Zoom Mode " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Auto with bor&der" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "S&pike insensitive auto" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "Mean c&entred, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "ran&ge: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ixed, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "fro&m: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "t&o: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "SHOULD BE HIDDEN" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Y Zoom Mode " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Auto with &border" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "&Spike insensitive auto" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Mean ¢red, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "&range: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fixed, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "f&rom: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&to: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Scalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Edit Scalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "New Scalar" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Read from data &source" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Generate a new vector with the properties given here as the independent " "variable." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Read from data &vector" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Generate" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Read from data source" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "File name:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Field:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Connect" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigure..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "F&rame:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "or" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&last frame" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Generate" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "V&alue: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "The maximum value of the independent variable." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Name" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Type" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Samples" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Properties" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Shared Axis Box" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Break Shared Axis Box" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "Error creating sharedaxisbox object from Kst file." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Create Shared Axis Box" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "String" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Edit String" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "New String" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Read from data &source" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&File name:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "F&ield:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Connect" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigure..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Generate" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Value: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Stroke" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "No Pen" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Solid Line" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Dash Line" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Dot Line" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Dash Dot Line" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Dash Dot Dot Line" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Custom Dash Line" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "No Brush" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Solid Pattern" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Dense Pattern 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Dense Pattern 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Dense Pattern 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Dense Pattern 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Dense Pattern 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Dense Pattern 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Dense Pattern 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Horizontal Pattern" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Vertical Pattern" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Cross Pattern" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonal Pattern 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonal Pattern 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonal Cross Pattern" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Mitre Join" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Bevel Join" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Round Join" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "SVG Mitre Join" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Flat Cap" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Square Cap" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Round Cap" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Style:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Width:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Brush &colour:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "&Brush style:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "&Join style:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Ca&p style:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Open SVG Image" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Error creating SVG object from Kst file." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Create SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "View &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Rename Tab" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Enter a new tab name:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Add tab" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Rename tab" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "&Close tab" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Edit View" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Cleanup Layout" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automatic" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Custom" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Theme" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Fill" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Stroke" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Fonts" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Font &size:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Font famil&y:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Italic" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Bold" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " points" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Save as default" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Apply to existing objects" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vector" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Time Interval" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Change Detection" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "No Update" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Edit Vector" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "New Vector" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Generate" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Number of samples:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "The number of samples for the new independent variable." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "Fro&m:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "The minimum value of the independent variable." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&to:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "The maximum value of the independent variable." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Read from &data source" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "File name:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "F&ield or column:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Connect" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigure..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "Update type. Use 'Time Interval' for non local data." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Edit" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automatic" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Protect Layout" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Custom" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Column Layout" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout in columns in order of creation.\n" "Select number of columns:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Cleanup Layout" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "View Menu" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Edit View" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Fill" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Edit" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Delete" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Raise" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Lower" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automatic" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Protect Layout" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Columns" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "&Lock Position to Data" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Column Layout" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout in columns in order of creation.\n" "Select number of columns:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "%1 Menu" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Cleanup Layout" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Move" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Resize" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Scale" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Rotate" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Create layout" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Append Item to Layout" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Move" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Resize" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Remove" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Raise" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Lower" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Scale" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Rotate" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Edit View Item" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Name:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Edit Multiple >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Appearance" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Size/Position" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Edit One" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Matrix View" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "View String Values" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "View Scalar Values" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Primitive View" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Update" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Select Vectors to View" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "View selected vector(s)" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Remove selected vector(s) from view" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Remove" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Significant digits" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Show as int" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (default)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "View Vector Values" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Show vector list" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Hide vector list" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Reset View" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Close" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "There is an error in the %1 algorithm." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Plugin: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Error: unable to create data object from plugin" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Error: unable to find plugin for data object" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Error creating Plugin Object from Kst file." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Could not allocate sufficient memory for Spectrogram." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spectrogram: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Amplitude Spectral Density" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Power Spectral Density" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Amplitude Spectrum" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Power Spectrum" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frequency" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Time" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spectrogram: %1\n" " FFT Length: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Average; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodise; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Remove Mean;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Error creating Spectrogram from Kst file." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "Error creating Spectrogram from Kst file. Could not find Vector." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Curve" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 vs %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Curve: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ Error: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- Error: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ Error: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- Error: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Lines: Width %1 and Style %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Points: Style %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Bars" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Error creating Curve from Kst file." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "Error creating Curve from Kst file. Could not find xVector." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "Error creating Curve from Kst file. Could not find yVector." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Scanning for data-object plugins." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "Equation has unknown object [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Equation Curve" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "Equation [%1] failed to find its vectors when reparsing." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Equation [%1] references non-existent objects." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Equation [%1] failed to parse. Errors follow." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Parse Error: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Equation: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Error creating equation from Kst file." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "Error creating equation from Kst file. Could not find xVector." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "event" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Event: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Error creating EventMonitorEntry from Kst file." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Number" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Percent" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fraction" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Normalised Frequency" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogram of %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogram: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Auto-bin" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 bins from %2 to %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Error creating Histogram from Kst file." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "Error creating Histogram from Kst file. Could not find Vector." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Image of %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Image: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Error creating Image from Kst file." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "Error creating Image from Kst file. Could not find matrix." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Julian Year" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Standard C time" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Julian Date" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Modified Julian Date" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Reduced Julian Date" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "International Atomic Time (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Excel time (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Formatted String" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "PSD Curve" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Attempted to create a PSD that used all memory." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Spectral Density" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Amplitude Spectrum" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Power Spectrum" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frequency" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Spectrum: %1\n" " FFT Length: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Average; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodise; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Remove Mean;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Error creating PSD from Kst file." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Error creating PSD from Kst file. Could not find Vector." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "%1 Activity Level" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Activity Level" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Error: Input vector too short." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Error: the window must be broader." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Activity Level" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Sampling Time (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Window Width (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Noise Threshold" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Bin Plugin Object" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Input Vector invalid size" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Error: No Bins" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Bin" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Bin Size" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Chop Plugin Object" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Input Vector invalid size" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Chop" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Chops a given data set into odd, even, difference, and Index data sets." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Convolve Plugin Object" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Input Vectors - invalid size" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Invalid Input length calculated" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convolve" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Generates the convolution of one vector with another." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Input Vector One" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Input Vector Two" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Deconvolve Plugin Object" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Input Vectors - invalid size" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Invalid Input length calculated" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Deconvolve" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Generates the deconvolution of one vector with another." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Input Vector One" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Input Vector Two" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Auto Correlation Plugin Object" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Input Vector invalid size" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Invalid Input length calculated" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Auto Correlation" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Generates the auto-correlation of a vector." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Cross Correlation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Input Vectors - invalid size" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Error: Invalid Input length calculated" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Cross Correlation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Generates the correlation of one vector with another." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Input Vector One" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Input Vector Two" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Cross Spectrum Plugin Object" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Cross Spectrum DataObject Plugin" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Generates the cross power spectrum of one vector with another." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Input Vector One" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Input Vector Two" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "FFT Length = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Sample Rate" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Effective Bandwidth Plugin Object" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Error: Input Vector X invalid size" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Error: Input Vector X and Input Vector Y are not the same length" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Error: Calculated Indices invalid" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Effective Bandwidth" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Calculates effective bandwidth from an amplitude spectrum." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Min. White Noise Freq." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Sampling Frequency (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Generic Filter Plugin Object" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Error: Input String Numerator is Empty" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Error: Input String Denominator is Empty" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Generic Filter" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Generates a discrete filter from a continuous-time definition." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Sampling interval (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numerator (increasing order)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Denominator (increasing order)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Interpolation Akima Plugin Object" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Interpolation Akima Spline" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Generates a non-rounded Akima interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Interpolation Akima Periodic Plugin Object" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Interpolation Akima Periodic Spline" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Generates a non-rounded periodic Akima interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Interpolation Cubic Spline Plugin Object" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Interpolation Cubic Spline Spline" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Generates a spline interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Interpolation Cubic Spline Periodic Plugin Object" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Interpolation Cubic Spline Periodic Spline" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Generates a cubic spline interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Interpolation Linear Plugin Object" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Interpolation Linear Spline" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Generates a linear interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Interpolation Polynomial Plugin Object" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Interpolation Polynomial Spline" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Generates a polynomial interpolation for a set of data." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Input Vector X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Line Fit Plugin Object" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Error: Input Vector Y Length invalid" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Error: Input Vector X Length invalid" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Line Fit" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Generates a line of best fit for a set of data." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Lock-In DataObject Plugin" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Error: Input Vectors - invalid size" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Lock-In" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "Lock-In amplifies Input using a Reference carrier wave" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Reference Vector" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Noise Addition Plugin Object" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Input Vector invalid size" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Noise Addition" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Adds Gaussian noise to a set of data, of a specified standard deviation." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Periodogram Plugin Object" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Error: Input Vector lengths do not match" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodogram" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Input Vector Time" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Input Vector Data" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Oversampling factor" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Average Nyquist frequency factor" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Phase Plugin Object" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Error: Input Scalar Phase must be greater than zero." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Error: Input Vector lengths do not match." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Phase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Phases a given data set to the specified period and zero outputVectorPhase." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Input Vector Time" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Input Vector Data" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Period" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Zero Phase" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Shift Plugin Object" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Shift: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Shift" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Shifts (and truncates) a vector." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Shift value (# points, negative allowed)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "%1 Statistics" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Error: Input Vector invalid size" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statistics" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Determines statistics for a given inputVector set." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Input Vector" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "SyncBin Plugin Object" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Error: Input Vector X invalid size" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Error: Input Vector lengths do not match" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Error: Bins must be at least 2" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "SyncBin" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Input Vector X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Input Vector Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Number of Bins" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X Min" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X Max" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "%1 Band Pass" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtered %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Band Pass Filter" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Input Vector - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Filter Order:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Central Frequency / Sample Rate:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Band width:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "%1 Band Stop" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtered %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Band Stop Filter" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Input Vector:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Filter Order:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Central Frequency / Sample Rate:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Band width:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "%1 High Pass" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtered %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "High Pass Filter" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Input Vector:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Filter Order:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Cutoff Frequency / Sample Rate:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "%1 Low Pass" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtered %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Low Pass Filter" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Input Vector:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Filter Order:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Cutoff Frequency / Sample Rate:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "%1 Cumulative Average" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Cumulative Average" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Cumulative Average: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Cumulative Average" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Computes the cumulative average of the input vector." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "%1 Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Cumulative Sum" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Computes the cumulative sum (integral) of the input vector." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Step (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 Despiked" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Despike" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Despiked %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Despike Filter" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Finds and removes spikes using a 3 point difference." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Input Vector:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Spacing:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "%1 Derivative" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Derivative" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivative: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Error: Input Scalar Step must be not be 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Fixed Step Differentiation" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Computes the discrete derivative of an input vector" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Step (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "%1 Unwind" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Unwind" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Input: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Unwind %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Unwind Filter" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Unwinds data that have wrapped." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Input Vector:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maximum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Max Step (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "%1 Unweighted Exponential" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponential Fit to %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Exponential Fit Residuals" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponential Fit" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Generates an exponential fit for a set of data." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "%1 Weighted Exponential" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponential Fit to %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Exponential Fit Residuals" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Exponential Weighted Fit" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Generates an exponential weighted fit for a set of data." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Weights:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "%1 Unweighted Gaussian" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussian Fit to %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Gaussian Fit Residuals" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaussian Fit" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Generates a gaussian fit for a set of data." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "%1 Weighted Gaussian" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussian Fit to %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Gaussian Fit Residuals" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Gaussian Weighted Fit" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Generates a gaussian weighted fit for a set of data." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Weights:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "%1 Unweighted Gradient" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient Fit to %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Gradient Fit Residuals" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient Fit Lower Limit" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient Fit Upper Limit" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Gradient Fit" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Generates a gradient fit for a set of data." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "%1 Weighted Gradient" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient Fit to %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Gradient Fit Residuals" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient Fit Lower Limit" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient Fit Upper Limit" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Gradient Weighted Fit" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Generates a gradient weighted fit for a set of data." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Weights:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Fit Knee Frequency Plugin" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Error: Input Vector Sizes do not match" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Error: Input Vector X invalid" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Error: Input Frequencies are Invalid\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Error: Input Data Invalid.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Knee Frequency Fit" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Generates a knee frequency fit for a set of data." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Input Vector - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Input Vector - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Input Scalar - Max. 1/f^a Freq" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Input Scalar - Min. White Noise Freq" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Input Scalar - White Noise C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "%1 Unweighted Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Linear Fit to %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Linear Fit Residuals" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Linear Fit Lower Limit" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Linear Fit Upper Limit" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Linear Fit" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Generates a linear fit for a set of data." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "%1 Weighted Linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Linear Fit to %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Linear Fit Residuals" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Linear Fit Lower Limit" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Linear Fit Upper Limit" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Linear Weighted Fit" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Generates a linear weighted fit for a set of data." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Input Vector - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Input Vector - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Input Vector - Weights" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "%1 Lorentzian" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzian Fit to %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Lorentzian Fit Residuals" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Lorentzian Fit" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Generates a Lorentzian fit for a set of data." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "%1 Weighted Lorentzian" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzian Fit to %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Lorentzian Fit Residuals" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Lorentzian Weighted Fit" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Generates a Lorentzian weighted fit for a set of data." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Input Vector - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Input Vector - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Input Vector - Weights" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "%1 Polynomial" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynomial Fit to %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Polynomial Fit Residuals" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Polynomial Fit" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Generates a polynomial fit for a set of data." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Order:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "%1 Weighted Polynomial" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynomial Fit to %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Polynomial Fit Residuals" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Polynomial Weighted Fit" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Generates a polynomial weighted fit for a set of data." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Input Vector - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Input Vector - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Input Vector - Weights" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Input Scalar - Order" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "%1 Sinusoid" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoidal Fit to %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Sinusoidal Fit Residuals" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Sinusoid Fit" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Generates a sinusoid fit for a set of data." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmonics:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Period:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "%1 Weighted Sinusoid" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoidal Fit to %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Sinusoidal Fit Residuals" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Sinusoid Weighted Fit" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Generates a sinusoid weighted fit for a set of data." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Input Vector - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Input Vector - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Input Vector - Weights" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Input Scalar - Harmonics" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Input Scalar - Period" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Sample Input Vector" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Insert New &Vector" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Insert New &Scalar" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Edit" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Insert New &Scalar" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Insert New &String" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Edit" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "C&olour palette:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Appearance" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Weight:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Point Type" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "If \"Show Points\" is ticked, the selected point type will be drawn at each " "data point." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Line Type" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "If \"Show Lines\" is ticked, the selected line style." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "Tick this to cause lines to be drawn between data points." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Lines" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "Tick this to cause the selected points to be drawn at each data point." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "Po&ints" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Head" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "&Bargraph" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Line Width" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "If \"Show Lines\" is ticked, the selected line width." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Size:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "Point &Density:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "All" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "High" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Medium" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Low" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Placement" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Scale fonts" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Place in &new plot" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "In ne&w tab" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "The name of the data file which will be read for this vector." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Place in &existing plot " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Do not pl&ace in any plot" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Automati&c layout" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "Custom &grid" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Colu&mns" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Protect existing layout" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Select a curve to utilise." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "frames" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Data Range" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Boxcar &filter first" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Save memory by sparsely sampling the data" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Read &1 sample per:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Select this to read all of the data up to the end of the file. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Read to &end" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "or" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "Co&unt from end" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "Number of frames to skip, if \"Read 1 sample per\" is selected." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " frame(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Start:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "&Range:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "File not found.\n" "Please verify the correct file name was given." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "FFT Options" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Default" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "cosine" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussian (Custom Sigma)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." # Check shortcut, was &z now &s #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&se" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ction:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Remo&ve mean" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "FFT &length: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Interleave&d average" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpolate over &holes" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Sa&mple rate:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "The sample rate at which the measurements were acquired, for proper " "normalisation." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "Apply new data sample specifications to selected vectors." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Vector units:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "The units of the Data Vector - for automatic labels." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Rate units:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "The units for the sample rate. Used for automatic labels." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Ou&tput:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Amplitude Spectral Density (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Power Spectral Density (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Amplitude Spectrum (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Power Spectrum (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Open File" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "All Files (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Logfile Directory" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Save File" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "Label text. A subset of LaTeX is supported. Click 'Help' for help." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{coloured text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Supports LaTeX symbols, live strings & scalars, and embedded equations." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Label:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Help" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "Label text. A subset of LaTeX is supported. See What's This." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Select a vector to utilise. If you wish to create a new vector, click on " "the icon to the right." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Create a new vector." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Edit selected vector." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Opens a vector dialog to edit selected vector." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Dialog" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Close" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Dialog" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Search:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Select a scalar to utilise. If you wish to create a new scalar, select the " "icon to the right." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Create a new scalar." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Edit selected scalar." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Select a string to utilise. If you wish to create a new string, select the " "icon to the right." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Create a new string." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Edit selected string." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Select a vector to utilise. If you wish to create a new vector, click on " "the icon to the right." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Create a new vector" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Edit selected vector." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Opens a vector dialog to edit selected vector." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Kst Widgets" Kst-2.0.8/po/kst_common_sv.po0000644000175000017500000111160112362706252015223 0ustar synthsynth# Stefan Asserhäll , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-06-11 18:19+0200\n" "Last-Translator: Stefan Asserhäll \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.4\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Verkställ inställningar som förval" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Förhandsgranska de första 1000 raderna i nytt fönster" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Första raderna " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Förhandsgranskning]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Huvud" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Data startar på rad:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Läs fältnamn från rad:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Läs enheter från rad:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Kommentarindikeringar:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Det går att använda mer än en symbol här, som exempelvis \"#!C\", men det " "gör läsning av ASCII-filer långsammare" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Decimaltecken:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Punkt" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Kommatecken" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Datakolumnlayout" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Avgränsad med mellanslag eller tabulator" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Eget avgränsningstecken" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "Läsning går snabbare om varje kolumn kan antas ha sin egen konstanta bredd." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Varje kolumn har sin\n" "egen konstanta bredd" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Fast bredd" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Allmänna alternativ" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Begränsa bufferstorlek:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " Mibyte" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Använd trådar" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Acceptera alltid filer som matchar:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Tolka tomt värde som:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Noll" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Föregående värde" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Tolkning av datum och tid:" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Värde" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Tolka fält" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "som:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "C-tid" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Sekunder" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Index med frekvens" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Formaterad sträng. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Se dokumentationen om QDataTime för detaljerad information.
Det går att " "använda en kombination av y (för år), M, d för datum och h (h för timmar), " "m, s, z (z för millisekunder).
Blanktecken tillåts mellan datum- och " "tidskolumnerna, men den första kolumnen måste väljas som X-vektor." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dag, M=månad, y=år, h=timma, m=minut, s=sekund, z=millisekund" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Avstånd" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Datum och tid:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Fildatum" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relativ" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Första raderna i filen '%1'" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "Rad %1 kan inte lista fältnamn OCH värden." #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "Rad %1 kan inte lista enheter OCH värden." #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "Rad %1 kan inte lista fältnamn OCH värden." #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Inkonsistenta parametrar" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "ASCII-filläsare" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Tolkar '%1'..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Tolkning av '%1' klar" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Tolkar '%1': %2 rader" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Läser fält: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "Index skapat" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Läsning klar: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "läser ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "tolkar ..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Kolumn %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "DirFile-läsare" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "FITS-källbildsläsare" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Matlab-källdataläsare" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Matlabs .mat källdataläsare" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "netCDF-läsare" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "QImage-källäsare" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Exempel på källdataläsare" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Källistläsare" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Kolumn %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Datafil för matris %1 var inte öppnad." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Datafil för vektor %1 var inte öppnad." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Datamatris: %1\n" " %2\n" " Fält: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 av %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Datafil för vektor %1 var inte öppnad." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Datafil för skalär %1 var inte öppnad." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Dataskalär: %1 = %4\n" " %2\n" " Fält: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 av %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "ramar" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Sökvägar för insticksprogram:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Söker efter insticksprogram för datakällor." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Insticksprogram laddat: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "instansiering misslyckades för %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Filen '%1' finns inte." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Kunde inte hitta datakälla för '%1' (%2), men en hittades precis innan. " "Någonting är fel med Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Datafil för sträng %1 var inte öppnad." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Datasträng: %1 = %4\n" " %2\n" " Fält: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 av %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Datafil för vektor %1 var inte öppnad." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Datavektor: %1\n" " %2\n" " Fält: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Sista %1 ramarna." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Ram %1 till slutet." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 ramar med början på %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Läs 1 sampling per %1 ramar." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Bilda medelvärde av %1 ramar." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 R0: %3 N: %4 av %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Fel" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Varning" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Notis" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Spåra" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Annat" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst-version %1\n" "\n" "\n" "Kst-logg:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Insticksprogram för datakälla:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Redigerbar vektor: %1\n" " %2 värden" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Skapad vektor: %1\n" " %2 värden från %3 till %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 punkter från %1 till %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "Sparad matris innehåller mindre data än den förespeglar" #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matris: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Fel när skapad matris skulle genereras från Kst-fil." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Fel när redigerbar matris skulle skapas från Kst-fil." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Fel när datamatris skulle skapas från Kst-fil." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Skalär: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Skalär: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Värde: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Fel när skalär skulle skapas från Kst-fil." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Sträng: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Fel när sträng skulle skapas från Kst-fil." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Leverantör: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vektor: %1\n" " %2 samplingar\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Fel när vektor skulle skapas från Kst-fil." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Fel när skapad vektor skulle genereras från Kst-fil." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Datafil för skalär %1 var inte öppnad." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Dataskalär: %1 = %4\n" " %2\n" " Fält: %3\n" " Ram: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 ram %3 av %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Ett datavisningsprogram.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Version %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Hemsida:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "Rapportera fel med 'Felrapportguiden' i menyn 'Hjälp'.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Upphovsmän och bidragsgivare (alfabetiskt sorterade):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Om Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Kst-inställningar" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Allmänt" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Skalning" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Rutnät" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Layoutegenskaper" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Pil" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Fel när pilobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Skapa pil" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Egenskaper" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Pilegenskaper" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Pil i &början" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "S&kala för pil i början" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Pilhuvudstorlek" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "Storleken på pilhuvudet är proportionell mot detta värde." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Pil i slut&et" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Ska&la för pil i slutet" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Axlar" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Grov" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fin" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Mycket fin" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Heldragen linje" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Streckad linje" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Punktlinje" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Streck-punktlinje" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streck-punkt-punktlinje" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Egen streckad linje" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Dölj vänster" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Dölj höger" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Dölj marginaler och beteckningar" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Dölj överkant" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Dölj underkant" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotera beteckningar" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotation: " #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Bas-avståndsläge" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Automatiskt" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "På" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Av" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Siffror före automatiskt bas-avståndsläge:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Om så här många siffror krävs för att visa graderingsvärden, går axeln " "tillbaka till bas-avståndsläge." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Tvinga avstånd till axelns minimum" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Skala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logaritmisk" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "Vänd axelns riktning så att talen minskas istället för ökas." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Om&vänd" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Axeln är tid." #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Tolka axeln som tid." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Tolka som:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Tidskodningstyp" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "Axeln representerar tid, vars kodning väljes här." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Visa som:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Tidsvisningsformat" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "Om axeln ska tolkas som tid, visa då tiden på axeln med detta format." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Tidszon:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Tid- och datumformat:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Datum: y/M/d - Tid: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Huvudgradering och linjer" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Rita &gradering" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Rita r&utnät" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Huvud&mellanrum:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Huvudgraderingens täthet" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Ange huvudgraderingarnas täthet. Huvudgraderingarnas intervall väljes " "automatiskt som 10 upphöjt till 1, 2 eller 5. Här ändras det slutliga " "graderingsmellanrummet givet denna begränsning." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "Rutnätets &stil:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "Rutnätets &färg:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Bredd:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Delgradering och linjer" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Rita gr&adering" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Rita rutnät" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Antal &delgraderingar:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Automatisk" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Lin&jestil:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Linj&efärg:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: Filen hittades inte. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Dialogruta" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "Textetikett" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Välj ny datafil:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Okänd filtyp" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "A&npassa..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Ändra" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Hoppa över" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Grundinsticksprogram" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Redigera insticksprogram %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Nytt insticksprogram %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Kan inte skapa insticksobjekt med tillhandahållna parametrar.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Indata och utdata" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Ruta" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Fel när rutobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Skapa ruta" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-bitar" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-bitar" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Felrapportguide" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Kst-version:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "Operativsystem:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Klicka på knappen nedan för att skicka in en felrapport.\n" "Det visar en webbläsarfönster med http://bugs.kde.org, där det finns ett " "formulär att fylla i.\n" "Informationen som visas ovan kommer att överföras till servern." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Starta felrapportguide" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Knapp" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Fel när knappobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Kartesiskt diagram" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "frames" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Otillräckligt minne" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Du begärde att %1 Mibyte data skulle läsas in, men det verkar som om du bara " "har ungefär %2 Mibyte användbart minne kvar. Du kan inte läsa in så mycket " "data." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Ändra datasamplingar" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Vektormarkering" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Källfilen för vektorerna markerade i listan kommer att ändras." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Markera alla vektorer i listan." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Lägg till a&lla" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Lägg till" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Avmarkera alla vektorer i listan." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Ta bort" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "Ta bort &alla" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Filen kunde inte läsas in eller innehåller inte någon data." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "Följande fält är inte definierade för den begärda filen:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Följande fält är inte definierade för den begärda filen:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Ändra datafil" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Välj enligt källfil" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Lägg till alla &från:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Vektor- och matrismarkering" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Källfilen för vektorerna markerade i listan kommer att ändras." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Markera alla vektorer i listan." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Lägg till a&lla" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Lägg till" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Avmarkera alla vektorer i listan." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Ta bort" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "Ta bort &alla" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Ny datafil" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Fil:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Ä&ndra markerade vektorer och matriser" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "D&uplicera härledda objekt (kurvor, ekvationer, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplicera markerade vektorer och matriser" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Okänd filtyp" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "A&npassa..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Tilldela kurvfärg från fil" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Tilldela färger" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Basera kurvfärg på:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "&X-vektor" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "&Y-vektor" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Radie" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centrum" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Lås position till data" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Cirkel" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Fel när cirkelobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Skapa cirkel" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Storlek och position" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "slut" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Kolumn %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Användning -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Användning: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Användning: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Användning: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Användning: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Användning: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Användning: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Användning: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Användning: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Inga datafiler angivna\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "filen %1 finns inte\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Användning: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Användning: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Användning: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Användning: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Användning: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Användning: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Höj i diagramordning: Alt+Uppåtpil" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Sänk i diagramordning: Alt+Neråtpil" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Tillgänglig&a objekt:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Avmarkera alla" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Markera alla" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Redigera" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Höj i diagramordning: Alt+Uppåtpil" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Uppåtpil" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Sänk i diagramordning: Alt+Neråtpil" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Neråtpil" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "Visa&de objekt:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "knappgrupp" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "DET HÄR, OCH ALLTING NEDAN, ÄR FÖR SKRIPTHANTERING OCH SKA DÖLJAS!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spektrogram" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Redigera spektrogram" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Nytt spektrogram" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Spektrograminnehåll" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Datavektor:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Fönsterstorlek:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Bildalternativ" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Kurva" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Redigera kurva" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Ny kurva" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Kurvans innehåll" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "&X-axelvektor:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "&Y-axelvektor:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "+X felsta&pel:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "&+Y felstapel:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "-X felstapel:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "&-Y felstapel:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "An&vänd +X felstapel för -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "A&nvänd +Y felstapel för -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorera vid automatiska beräkningar av axelintervall" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Namn:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Automatisk" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Redigera flera >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Redigera en %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Ange filter här (jokertecken tillåts)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Redigera" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Skapa kurva" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Skapa effektspektrum" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Skapa spektrogram" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Skapa histogram" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Verkställ filter" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Skapa bild" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Lägg till i diagram" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Ta bort från diagram" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Verkställ anpassning" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Ta bort" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Datahanterare" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtrera enligt:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Alla kolumner" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Namn" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Typ" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Samplingar" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Egenskaper" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Skiftlägeskänslig" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Rensa" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Fel när datakälla skulle skapas från Kst-fil." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Tidsintervall" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Ändra riktning" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Ingen uppdatering" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Höj i diagramordning: Alt+Uppåtpil" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Sänk i diagramordning: Alt+Neråtpil" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vektor(er) tillgängliga" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vektor(er) markerade" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Skapa s&pektraldiagram. Ställ in FFT-alternativ nedan:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Otillräckligt minne" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Du begärde att %1 Mibyte data skulle läsas in, men det verkar som om du bara " "har ungefär %2 Mibyte användbart minne kvar. Du kan inte läsa in så mycket " "data." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Skapa &XY-diagram. Ställ in X-axelns egenskaper nedan:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "S&kapa från fält:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Använd befintli&g:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "Fältet som ska användas som X-axel i XY-kurvor." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Välj en datakälla att arbeta med. Det är " "normalt din fil som innehåller datapunkter eller vektorer.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Okänd filtyp" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "A&npassa..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "Uppdatera typ. Använd 'Tidsintervall' för icke-lokal data." #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filter" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Nytt filter..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Om du så önskar, välj ett " "filter för fälten som läses in:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Kurvplacering" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Alla kurvor i ett diagram" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 nytt diagram per kurva" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Gå igenom c&ykliskt" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " diagram" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Gå igenom befin&tliga diagram" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Alla kurv&or i diagram" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Diagramplacering (flikar)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Alla under a&ktuell flik" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Alla under n&y flik" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY och spektra under &separata nya flikar" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Diagramlayout" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Automatisk &layout" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Eget rut&nät" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Kolumner:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "Sky&dda befintlig layout" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Beteckningar" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Skala om alla beteckningar under flik" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Dela axlar under flik" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Kur&vstil" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Bara l&injer" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Bara &punkter" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Lin&jer och punkter" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Spektrumaxelläge" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Lo&garitmisk X-axel" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Lo&garitmisk Y-axel" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Förklaringar" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&På" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Av" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&utomatisk" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertikal" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Höj i diagramordning (Alt+Uppåtpil)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Uppåtpil" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Neråtpil" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Välj (Alt+S): Flytta markerade fält från datalistan Tillgängliga till " "datalistan Valda för uppritning." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Ta bort (Alt+R): Flytta markerade fält från datalistan Valda till datalistan " "Tillgängliga så att de inte ritas upp." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Vald data: Alla fält i den här listan ritas upp." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Vald data: Alla fält i den här listan ritas upp. För att ta bort fält från " "listan, dra dem till listan Tillgänglig data, dubbelklicka på dem eller " "markera dem och använd knappen Ta bort (ikonen med högerpil eller Alt+R). " "Ordningen som fälten visas i listan är ordningen som de kommer att ritas upp " "med." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Vald data:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vektorer valda" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Sökfilter" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Sökfilter: Fält som motsvarar det här filtret markeras och flyttas längst " "upp i listan Tillgänglig data. Jokertecknen '*' och '?' stöds." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Lägger till jokertecknet '*' i början och slutet av sökfiltret för att " "matcha allting som innehåller sökfiltrets text." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "&Sök" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Fältval: Markerade fält ritas upp." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Tillgänglig data: Rutan listar alla fält som inte har valts för uppritning. " "För att välja ett fält för uppritning, flytta det till listan Vald data " "genom att dra det med musen, genom att dubbelklicka, eller genom att markera " "det och klicka på väljknappen (högerpil, snabbtangent är Alt+S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Tillgänglig data:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vektor(er) tillgängliga" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Version %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Version %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Kst-felsökningsdialogruta" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Bygginformation" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "Skicka felsökningsinformation med &e-post" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Logg" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Loggnivå: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Fel" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Varning" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Notis" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Spåra" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "&Rensa" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Datakällor" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Insticksprogram" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Laddad instans" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Stän&g" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Ett fel har uppstått. Klicka på ikonen för mer detaljerad information." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Teckensnitt" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Letter" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Journaldiagram" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Egen" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Minimal teckenstorlek (punkter)" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "När fönsterstorlek ändras, visas teckensnitt minst så här stora." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Referensstorlek för visning:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "När fönstret är så här stort, har teckensnitt angiven storlek." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Teckensnitt skalas med fönster- eller utskriftsstorlek. När fönstret eller " "utskriften är så här stor, är angivna teckenstorlekar riktiga." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Egen referensstorlek (cm)" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Spara som standard" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Verkställ för befintliga objekt" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Flytta markerad egenskap uppåt i prioritetslistan" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Flytta markerad egenskap neråt i prioritetslistan" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Lägg till markerad egenskap i listan med egenskaper att gå igenom cykliskt" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Ta bort markerad egenskap från listan med egenskaper att gå igenom cykliskt" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Linjefärg" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Punktstil" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Linjestil" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Linjebredd" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Derivera kurvor" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Egenskapsmarkering och cykelordning" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Höj i markeringsordning: Alt+Uppåtpil" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Uppåtpil" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Sänk i markeringsordning: Alt+Neråtpil" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Neråtpil" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Tillgängliga:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Valda:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Alternativ" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Maximal linjebredd:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Punkttäthet:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Alla" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Hög" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Medium" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Låg" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Storlek och position" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotation:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Storlek:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Position:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Fast proportion" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Lås position till data" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Filen kunde inte öppnas för skrivning." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Filen kunde inte öppnas för läsning." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Filen är felformad och ett fel stöttes på vid läsning." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Markera objekt att redigera" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filter:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Rensa" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Markera &alla" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Ellips" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Fel när ellipsobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Skapa ellips" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Ekvation" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Redigera ekvation" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Ny ekvation" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Ekvation" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Ek&vation:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Ange ekvationen som ska utvärderas här. Använd 'x' som oberoende variabel. " "Vektorer och operatorer kan väljas från listorna ovan." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "&X-vektor:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpolera till vektor med högst upplösning" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Händelseövervakning" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Redigera händelseövervakning" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Ny händelseövervakning" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Underrättelse via e-post" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "&Underrättelse:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Uttryck" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vektorer:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operatorer:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Skalärer:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Uttryck:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Beskrivning:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "Kst-skript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Kör:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "&Underrättelse:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "A&npassa..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Kst-felsökningslogg" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Varning" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Fel" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Notis" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Logga som:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exportera till grafikfil" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Basnamn:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Filformat:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Storlek" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Bredd:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Bildens bredd (i bildpunkter)." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Höjd:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Bildens höjd (i bildpunkter)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "An&ge:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Bredd och behåll proportion" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Höjd och behåll proportion" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Bredd och höjd" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Fyrkantstorlek" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Spara alternativ" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "Spara inte automatiskt. Spara istället en gång vid Ok eller Verkställ." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "S¶ en gång" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Spara bild periodiskt" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Om markerat, sparas bilden upprepade gånger med den angivna perioden. Det är " "exempelvis användbart för realtidsbilder på webbsidor." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Spara &automatiskt var" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Period för spara automatiskt" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Automatisk &filändelse" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Inkludera:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Vektorformat" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Punktavbildningsformat" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exportera vektorer" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Vektormarkering" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "Källfil för vektorerna markerade i den här listan kommer att ändras." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Markera alla vektorer i listan." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "&Lägg till alla" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "Lägg &till" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Avmarkera alla vektorer i listan." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Ta bort" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "Ta bort &alla" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Plats att &spara på:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Fyll" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Ingen pensel" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Fyllt mönster" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Tätt mönster 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Tätt mönster 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Tätt mönster 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Tätt mönster 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Tätt mönster 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Tätt mönster 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Tätt mönster 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Horisontellt mönster" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Vertikalt mönster" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Korsmönster" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonalt mönster 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonalt mönster 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonalt korsmönster" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Färg:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Stil:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Använd &linjär gradient" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "Åte&rställ gradient" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Insticksprogram" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Redigera insticksprogram %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Nytt insticksprogram %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Kan inte skapa insticksobjekt genom att använda angivna parametrar.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Insticksprogramval" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Insticksprogrammets namn:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Beskrivning:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "In- och utdata" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorera vid automatisk beräkning av axelintervall" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Allmänt" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Dynamiska filer uppdaterar detta snabbt eller långsammare." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Minimal tid mellan uppdateringar vid användning av dynamiska filer. Vid " "omfattande behandling, kan det ta längre tid." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Period mellan uppdateringar (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Använd genomskinlighet vid drag" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Återge med \"raster\". Det är alltid bättre." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Återgivning med \"raster\" är snabbare för vissa arkitekturer, men har många " "fel på andra (beroende på videodrivrutinen). Det kan hjälpa, eller kan " "orsaka att saker går fruktansvärt fel." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Använd \"raster\" gränssnitt på (omstart av Kst krävs)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "K&antutjämna diagram" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Rutnät" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Visa r&utnät" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "&Lås till rutnät" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Rutnätets &horisontella mellanrum:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Rutnätets &vertikala mellanrum:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogram" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Redigera histogram" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Nytt histogram" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Histogramegenskaper" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Datavekto&r:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Intervall från&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "Den lägsta gränsen för det lägsta intervallet. Värden under denna gräns " "räknas inte i något intervall." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "till:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "Den högsta gränsen för det högsta intervallet. Värden över denna gräns " "räknas inte i något intervall." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Antal inter&vall:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Antal intervall i histogrammet." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Ställ in lägsta och högsta gräns, och antal intervall till rimliga " "förinställda värden." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "A&utomatiska intervall" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Automatiska intervall i real&tid" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalisering av y-axel" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "Histogrammets Y-axel rapporterar bråkdelen samplingar i intervallet." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Bråkdel i intervall" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "Histogrammets Y-axel rapporterar antal samplingar i intervallet." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "A&ntal i intervall" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "Histogrammets Y-axel är normaliserad så att det högsta intervallet är 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Toppintervall = &1,0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "Histogrammets Y-axel rapporterar procent av samplingarna i intervallet." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Procen&t i intervall" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Bild" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Redigera bild" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Ny bild" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Bildinnehåll" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matris:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Bildtyp" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "Färg&avbildning" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Kon&turavbildning" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "&Färg- och konturavbildning" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Färgavbildningens parametrar" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "Ö&vre:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Tröskel - &undre:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Smart" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&il:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Automatisk &realtidströskel" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Konturavbildningens parametrar" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Fä&rg:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Antal &konturnivåer:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Vikt:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Använd &variabel linjebredd" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Dialogruta för att skapa beteckningar" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Dialogruta" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Lås position till data" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Höger" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Vänster" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Referenspunkt:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Fetstil" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " punkter" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Teckensnittsfamil&j:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Färg" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Tecken&storlek:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Spara som standard" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Lås position till data" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Höger" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Vänster" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Referenspunkt för beteckning:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotation" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Position" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Beteckning" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Skapa beteckning" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Egenskaper" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Storlek och position" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Beteckningsegenskaper" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "Syntaxen för beteckningar är härledd från en delmängd av Latex. " "Syntaxsom stöds är: \\[grekiskt bokstavsnamn] och \\[Grekiskt " "bokstavsnamn], \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, " "\\n, \\partial, \\prod, \\pm, \\textcolor" "{färgnamn}{färgad text}, \\textbf{text med fetstil}, \\textit" "{kursiv text}, \\t, \\sum, \\sqrt, \\underline" "{understruken text}, x^y, x_y. Skalärer, ekvationer och " "vektorelement kan inbäddas. Skalär: [V1/Mean]. Vektorelement: [V1" "[4]]. Ekvation: [=[V1/Mean]^2]. Tecknet [ kan infogas som " "\\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Tecken&storlek:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Teckensnittsfamil&j:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Fetstil" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " punkter" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Beteckningar" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Standardtecken&storlek för diagram:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "punkter" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Skala numeriska axelbeteckningar automatiskt" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Ö&vre beteckning:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automatisk" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "&Nedre beteckning:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Vänster beteckning:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "&Höger beteckning:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Visa för&klaring" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "&Redigera" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Stöder skalärer och strängar (namn i hakparenteser) - t.ex. [INDEX:Max " "(X2)],\n" "inbäddade ekvationer - t.ex. [=[INDEX:Max] / 2]\n" "och Latex-symboler - t.ex. \\theta. Namn och symboler kompletteras " "automatiskt." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Layoutruta" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Layout" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "&Horisontell marginal:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "&Vertikal marginal:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Hori&sontellt mellanrum:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Ver&tikalt mellanrum:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Förklaring" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 mot %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Tom förklaring" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Diagram: %1 \n" "Innehåll:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Förklaring" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Höj i listordning: Alt+Uppåtpil" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Sänk i listordning: Alt+Neråtpil" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Titel:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Använd automatiskt diagrambaserat innehåll" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Visa &vertikalt" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Tillgänglig&a objekt:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "Visa&de objekt:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Höj i diagramordning: Alt+Uppåtpil" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Uppåtpil" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Ta bort: Alt+R" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Välj: Alt+S" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Sänk i diagramordning: Alt+Neråtpil" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Neråtpil" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Teckensnittsinställningar för förklaring" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Te&ckenstorlek:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " punkter" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Fet" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "Teckensnitts&familj" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Lås position till data" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "Radeditor" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Fel när radeditorobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Linje" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Flytta" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Ändra storlek" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Fel när linjeobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Skapa linje" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Storlek och position" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Skript: Kör" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Skript: Klart" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Skript: returkod %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Skriptfel: Start misslyckades" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Skriptfel: Kraschade" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Skriptfel:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Skapa en loggpost" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Kö&r om skript" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Skript:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "V&erkställ" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Stän&g" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Meddelande" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Meddelande:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Rensa" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Skriptutmatning:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Inställning" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Diagramegenskaper" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Bredd:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Bredd och behåll proportion" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Höjd och behåll proportion" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Bredd och höjd" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Fyrkantstorlek" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Höjd:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Bildens höjd (i bildpunkter)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Filformat:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "An&ge:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Bildens bredd (i bildpunkter)." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Lokal loggkatalog:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Skript:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Variablerna $user, $imagefile och $messagefile kan användas i argumentlistan." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "An&vändarnamn:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Fråga om att spara" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Dokumentet har ändrats.\n" "Spara ändringar?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Spara fil" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Kst-sessioner (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Öppna fil" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Rensa icke-existerande filer" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "För detaljerad information, se Hjälp -> Felsökningsdialogruta -> Logg" #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Fel när dokumentet skulle öppnas:\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "Ö&ppna..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Öppna en ny session" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Spara" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Spara aktuell session" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Spara s&om..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "N&y session" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Spara aktuell session och starta en ny tom" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Ladda om alla &datakällor" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Ladda om alla datakällor" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "Skriv &ut..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Skriv ut aktuell vy" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exportera som bild(er)..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exportera grafik till disk" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Spara &vektorer på disk..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exportera vektorer till ASCII-fil" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "&Loggpost..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Spara en loggpost" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Ny flik" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Skapa en ny flik" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Stän&g flik" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Stäng aktuell flik" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Avsluta" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Avsluta programmet" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Skift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vektorer" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Visa alla vektorer i ett kalkylark" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Skalärer" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Visa alla skalärer i ett kalkylark" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matriser" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Visa alla matriser i ett kalkylark" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "S&trängar" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Visa alla strängar i ett kalkylark" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Till&baka en skärm" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Tillbaka en skärm" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Framåt en skärm" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Framåt en skärm" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "Räkna &från slutet" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Ställ in alla datavektorer till räkna från slutet" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Läs till slutet" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Ställ in alla datavektorer till läs till slutet" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Paus" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Ändra paus i uppdatering av datakällor" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Ändra data&samplingsintervall..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Visa dialogrutan för att ändra datasamplingsintervall i Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Rita" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Skapa ett diagram för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Skalär" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vektor" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matris" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Strän&g" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Kurva" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Ekvation" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "&Effektspektrum" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histogram" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "B&ild" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spektr&ogram" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Hä&ndelseövervakning" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Beteckning" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Skapa en beteckning för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Ruta" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Skapa en ruta för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Cirkel" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Skapa en cirkel för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Ellips" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Skapa en ellips för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Linje" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Skapa en linje för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Pil" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Skapa en pil för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Bild" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Skapa en bild för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Skapa en SVG för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "Delad axel&ruta" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Skapa en delad axelruta för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Ändra &bunden zoom" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Ändra bunden zoom för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Bind över &alla flikar" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Bunden zoom gäller mellan flikar" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Markera datapunkter" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Markera närmaste datapunkt" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "X-Y &zoom och rullning" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Zooma godtyckligt i X- eller Y-riktning" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Bara &X-zoom" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zooma bara i X-riktningen" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Bara &Y-zoom" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "&Layoutläge" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Ändra layoutläge för aktuell vy" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "Data&hanterare" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Visa datahanteringsfönstret i Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "&Dataguide" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Visa dataguiden i Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Ändra data&fil" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Visa dialogrutan för att ändra datafil i Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Tilldela kurv&färg per fil" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Visa dialogrutan för att välja färger i Kst" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Der&ivera kurvor" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Visa dialogrutan för derivera kurvor i Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "A&npassa Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Visa inställningsdialogrutan i Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Tema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Visa temadialogrutan i Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Felsöknings&dialogruta" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Visa felsökningsdialogrutan i Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Felrapport&guide" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Visa felrapportdialogrutan i Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Om" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Visa rutan Om Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Arkiv" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Senaste sessione&r" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Senaste data&filer" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Redigera" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Visa" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Inte&rvall" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "S&kapa" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Standard&insticksprogram" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Anpassnings&insticksprogram" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Fil&terinsticksprogram" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Kommentar" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Läge" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Interaktionsläge" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "Verk&tyg" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "In&ställningar" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Hjälp" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Arkiv" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Redigera" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Verktyg" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Dataintervall" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Läge" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Diagramlayout" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Avancerad layout" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Klar" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Markörer" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Heldragen linje" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Streckad linje" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Punktlinje" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Streck-punktlinje" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streck-punkt-punktlinje" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Egen streckad linje" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "En diagrammarkör med samma (eller nästan samma) värde finns redan." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "Texten du har skrivit in är inte ett giltigt tal." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Axelmarkörer" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Ny markörpunkt: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Lägg till" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Akt&uella markörer" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Rensa" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Ta bort" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Markörutseende" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Lin&jestil:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "&Linjefärg" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Linje&bredd:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Automatiska markörer" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Använd kurvor &som markörkälla:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Skapa markörer på:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "St&igande flank" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "&Fallande flank" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "&Båda" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Använd &vektor som markörkälla:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matris" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Redigera matris" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Ny matris" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Skalning och förflyttning" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "X-ste&gstorlek:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X-minimum:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y-minimum:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Y-stegstor&lek:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Gradientparametrar" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Öka eller minska Z-värden längs:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "X-axel" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Y-axel" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z vid minimum:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "X-steg:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Y-steg:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z vid maximum:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Dataintervall" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "eller" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Y-s&tartram:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "X a&ntal ramar:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "Räkna &från slutet" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Läs till slutet" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "X antal ra&mar:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Läs till slut&et" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Räkna från sl&utet" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "X-&startram:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " ramar" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "&Fyrkantfilter först" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Läs &1 sampling per" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Källa" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Läs från datakälla" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Skapa gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Parametrar för datakälla" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "Fält eller k&olumn:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Filnamn:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Anslut" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "A&npassa..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 Mibyte tillgängligt" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Tecken&storlek:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Teckensnittsfamil&j:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "An&vänd diagrammets standardteckensnitt" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " punkter" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Bild" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Öppna bild" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Fel när bildobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Skapa bild" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [År]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dagar]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Timmar]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minuter]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Sekunder]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Diagram" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zooma maximalt" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zooma maximalt toppokänsligt" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zooma till föregående" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zooma bundet" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zooma X bundet" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zooma Y bundet" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zooma medelvärde Y-centrerat" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "X-zoom maximalt" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "X-zoom automatisk kant" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "X-zoom toppokänsligt" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "X-zoom höger" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "X-zoom vänster" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "X-zoom ut" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "X-zoom in" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalisera X-axel till Y-axel" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Logaritmisk X-axel" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Y-zoom lokalt maximum" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Y-zoom maximalt" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Y-zoom automatisk kant" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Y-zoom toppokänsligt" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Y-zoom upp" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Y-zoom ner" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Y-zoom ut" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Y-zoom in" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalisera Y-axel till X-axel" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Logaritmisk Y-axel" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Justera färgskala för bild" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximera diagram" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Dela diagram på X-axeln" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Dela diagram på Y-axeln" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Bryt delad axelruta" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Kopiera koordinater" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Kopiera X-koordinat" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Kopiera Y-koordinat" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Kopiera" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zooma" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtrera" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Redigera kurva" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Anpassa" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Inställningar av delad axelruta" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Information kopierad till klippbordet: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "X-koordinat kopierad till klippbordet: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Y-koordinat kopierad till klippbordet: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Diagram: %1 \n" "Innehåll:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Tomt diagram" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Fel när diagramobjekt skulle skapas från Kst-fil." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Skapa diagram" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Skapa diagram för kurva" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Zooma fast uttryck" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Zooma X-intervalluttryck" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zooma maximalt" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zooma maximalt toppokänsligt" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zooma medelvärde centrerat" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zooma X medelvärde centrerat" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zooma Y medelvärde centrerat" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zooma X maximalt" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zooma X automatisk kant" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zooma X inga toppar" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Rulla X åt höger" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Rulla X åt vänster" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Zooma X ut" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Zooma X in" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zooma normalisera X till Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zooma Y lokalt maximum" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zooma Y maximalt" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zooma Y automatisk kant" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zooma Y inga toppar" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zooma Y upp" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zooma Y ner" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Zooma Y ut" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Zooma Y in" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zooma normalisera Y till X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zooma X logaritmiskt" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zooma Y logaritmiskt" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Redigera diagramobjekt" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Innehåll" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Övre teckensnitt" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Nedre teckensnitt" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Vänster teckensnitt" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Höger teckensnitt" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Axelteckensnitt" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Beteckningar" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Intervall, zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "X-axel" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Y-axel" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "X-axelmarkörer" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Y-axelmarkörer" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Övre teckensnitt*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Nedre teckensnitt*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Vänster teckensnitt*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Höger teckensnitt*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Axelteckensnitt*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Diagramåtergivning" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Referensläge" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 mot %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Effektspektrum" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Redigera effektspektrum" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Nytt effektspektrum" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Effektspektruminnehåll" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Datavekto&r:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Namn" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Värde" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Intervall" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "X-zoomläge " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&utomatiskt" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Automatiskt me&d kant" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Automatiskt to&ppokänsligt" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "Medelvärde c&entrerat, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "inter&vall: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ast, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "frå&n: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "t&ill: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "SKA VARA DOLD" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Y-zoomläge " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Automatiskt" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Automatiskt med &kant" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Automati&skt toppokänsligt" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Medelvärde ¢rerat, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "inte&rvall: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fast, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "f&rån: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&till: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Skalär" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Redigera skalär" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Ny skalär" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Läs från data&källa" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Skapa en ny vektor med egenskaperna som anges här som den oberoende " "variabeln." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Läs från data&vektor" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "S&kapa" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Läs från datakälla" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Filnamn:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Fält:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Anslut" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "A&npassa..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "&Ram:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "eller" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Markera det här för att läsa data från filens slut. Det är användbart för " "rullande visning där data läggs till sist i filen av ett annat program." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&Sista ram" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Skapa" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "Vär&de: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Den oberoende variabelns maximala värde." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Namn" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Typ" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Samplingar" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Egenskaper" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Delad axelruta" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Bryt delad axelruta" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "Fel när ett sharedaxisbox-objekt skulle skapas från Kst-fil." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Skapa delad axelruta" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Sträng" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Redigera sträng" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Ny sträng" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Läs från data&källa" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&Filnamn:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "Fä<:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Anslut" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "A&npassa..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "S&kapa" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Värde: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Streck" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Ingen penna" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Heldragen linje" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Streckad linje" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Punktlinje" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Streck-punktlinje" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Streck-punkt-punktlinje" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Egen streckad linje" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Ingen pensel" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Fyllt mönster" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Tätt mönster 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Tätt mönster 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Tätt mönster 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Tätt mönster 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Tätt mönster 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Tätt mönster 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Tätt mönster 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Horisontellt mönster" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Vertikalt mönster" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Diagonalt mönster" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonalt mönster 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonalt mönster 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonalt korsmönster" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Sned hopfogning" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Fasad hopfogning" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Rundad hopfogning" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "SVG sned hopfogning" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Platt ända" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Fyrkantig ända" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Rundad ända" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Stil:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Bredd:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Pensel&färg:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "&Penselstil:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "&Hopfogningsstil:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Än&dstil:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Öppna SVG-bild" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Fel när SVG-objekt skulle skapas från Kst-fil." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Skapa SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Visa &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Byt namn på flik" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Ange ett nytt fliknamn:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Lägg till flik" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Byt namn på flik" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Stän&g flik" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Redigera vy" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Städa layout" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automatisk" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Egen" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Tema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Fyll" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Streck" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Teckensnitt" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Tecken&storlek:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Teckensnittsfamil&j:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Fetstil" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " punkter" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Spara som standard" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Verkställ för befintliga objekt" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vektor" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Tidsintervall" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Ändra riktning" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Ingen uppdatering" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Redigera vektor" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Ny vektor" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "S&kapa" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "A&ntal samplingar:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Antal samplingar för den nya oberoende variabeln." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "Frå&n:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Den oberoende variabelns minimala värde." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&till:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Den oberoende variabelns maximala värde." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Läs från &datakälla" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Filnamn:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "Fä< eller kolumn:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Anslut" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "A&npassa..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "Uppdatera typ. Använd 'Tidsintervall' för icke-lokal data." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Redigera" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automatisk" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Skydda layout" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Egen" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Kolumnlayout" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout i kolumner enligt skapelseordning.\n" "Välj antal kolumner:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Städa layout" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menyn Visa" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Redigera vy" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Fyll" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Redigera" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Ta bort" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Höj" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Sänk" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automatiskt" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Skydda layout" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Kolumner" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "&Lås position till data" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Kolumnlayout" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout i kolumner i ordningen de skapas.\n" "Välj antal kolumner:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "%1 meny" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Städa layout" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Flytta" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Ändra storlek" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Skala" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Rotera" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Skapa layout" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Lägg till objekt i layout" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Flytta" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Ändra storlek" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Ta bort" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Höj" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Sänk" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Skala" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Rotera" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Redigera vyobjekt" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Namn:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Redigera flera >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Utseende" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Storlek och position" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Redigera en" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Matrisvy" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Visa strängvärden" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Visa skalärvärden" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Primitiv vy" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Uppdatera" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Markera vektorer att visa" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Visa markerad(e) vektor(er)" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Ta bort markerad(e) vektor(er) från visning" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Ta bort" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Signifikanta siffror" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Visa som heltal" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (förval)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Visa vektorvärden" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Visa vektorlista" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Dölj vektorlista" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Återställ vy" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Stäng" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Det finns ett fel i algoritmen %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Insticksprogram: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Fel: Kan inte skapa dataobjekt från insticksprogram" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Fel: Kan inte hitta insticksprogram för dataobjekt" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Fel när insticksobjekt skulle skapas från Kst-fil." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Kunde inte reservera tillräckligt minne för spektrogram." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spektrogram: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Amplitudspektraltäthet" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Effektspektraltäthet" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Amplitudspektrum" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Effektspektrum" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frekvens" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Tid" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spektrogram: %1\n" " FFT-längd: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Medelvärde; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodisera; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Ta bort medelvärde;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Fel när spektrogram skulle skapas från Kst-fil." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Fel när spektrogram skulle skapas från Kst-fil. Kunde inte hitta vektor." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Kurva" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 mot %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 mot %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Kurva: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ fel: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- fel: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ fel: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- fel: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Linjer: Bredd %1 och stil %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punkter: Stil %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Staplar" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Fel när kurva skulle skapas från Kst-fil." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "Fel när kurva skulle skapas från Kst-fil. Kunde inte hitta x-vektor." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "Fel när kurva skulle skapas från Kst-fil. Kunde inte hitta y-vektor." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Söker efter insticksprogram för dataobjekt." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() av tid=%2: låsning av utmatning " "för skrivning %3 (inte leverantör) -- det är troligen ett fel. Skicka gärna " "e-post till kst@kde.org med detaljerad information." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "Ekvationen har okända objekt [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Ekvationskurva" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "Ekvation [%1] misslyckades hitta sina vektorer vid omtolkning." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Ekvation [%1] misslyckades hitta sina vektorer vid spara. Resulterande Kst-" "fil kan ha felaktigheter." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Ekvation [%1] refererar till icke-existerande objekt." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Ekvation [%1] misslyckades tolka. Fel följer." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Tolkningsfel: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Ekvation: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Fel när ekvation skulle skapas från Kst-fil." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Fel när ekvation skulle skapas från Kst-fil. Kunde inte hitta x-vektor." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "händelse" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Händelse: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Fel när EventMonitorEntry skulle skapas från Kst-fil." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Nummer" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Procent" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Bråkdel" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Normaliserad frekvens" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogram av %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogram: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Automatiska intervall" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 intervall från %2 till %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Fel när histogram skulle skapas från Kst-fil." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "Fel när histogram skulle skapas från Kst-fil. Kunde inte hitta vektor." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Bild av %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Bild: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Fel när bild skulle skapas från Kst-fil." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "Fel när bild skulle skapas från Kst-fil. Kunde inte hitta matris." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Julianskt år" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "C-standardtid" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Julianskt datum" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Justerad Julianskt datum" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Reducerat Julianskt datum" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Internationell atomtid (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Excel-tid (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "ÅÅÅÅ/MM/DD TT:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/ÅÅÅÅ TT:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " TT:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " TT:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Formaterad sträng" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "PSD-kurva" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Försökte skapa en PSD som använde allt minne." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Spektraltäthet" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Amplitudspektrum" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Effektspektrum" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frekvens" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Spektrum: %1\n" " FFT-längd: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Medelvärde; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodisera; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Ta bort medelvärde;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "I PSDCalculator::calculatePowerSpectrum: Tog emot utdatafält med fel längd." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Fel när PSD skulle skapas från Kst-fil." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Fel när PSD skulle skapas från Kst-fil. Kunde inte hitta vektor." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "%1 aktivitetsnivå" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Aktivitetsnivå" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Aktivitetsnivå: %1\n" " Samplingstid: %2 (s)\n" " Fönsterbredd: %3 (s)\n" " Bruströskel: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Fel: Indatavektor för kort." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Fel: fönstret måste vara bredare." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Aktivitetsnivå" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Beräknar en signals aktivitetsnivå som produkten av standardavvikelsen och " "antal ändringar inom ett glidande fönster." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Samplingstid (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Fönsterbredd(er)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Bruströskel" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Intervall-insticksobjekt" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Fel: Indatavektor har ogiltig storlek" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Fel: Inga intervall" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Intervall" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Placerar data i de givna intervallen. Varje intervall innehåller medelvärdet " "av elementen som hör till intervallet." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Intervallstorlek" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Uppdelnings-insticksobjekt" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Fel: Indatavektor har ogiltig storlek" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Uppdelning" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Delar upp en given datamängd i udda, jämna, skillnads- och index-datamängder." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Faltnings-insticksobjekt" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fel: Indatavektorer - ogiltig storlek" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fel: Ogiltig indatalängd beräknad" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Faltning" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Skapar faltningen av en vektor med en annan." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Indatavektor ett" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Indatavektor två" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Dekonvolution-insticksobjekt" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fel: Indatavektorer - ogiltig storlek" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fel: Ogiltig indatalängd beräknad" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Dekonvolution" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Skapar dekonvolutionen av en vektor med en annan." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Indatavektor ett" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Indatavektor två" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Autokorrelations-insticksobjekt" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Fel: Indatavektor har ogiltig storlek" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fel: Ogiltig indatalängd beräknad" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Autokorrelation" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Skapar autokorrelationen av en vektor." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Korskorrelation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fel: Indatavektorer - ogiltig storlek" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fel: Ogiltig indatalängd beräknad" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Korskorrelation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Skapar en korskorrelation av en vektor med en annan." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Indatavektor ett" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Indatavektor två" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Korsspektrum-insticksobjekt" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Dataobjekt-insticksprogram för korsspektrum" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Skapar korseffektspektrum av en vektor med en annan." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Indatavektor ett" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Indatavektor två" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "FFT-längd = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Samplingsfrekvens" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Effektiv bandbredds-insticksobjekt" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Fel: Indatavektor X har ogiltig storlek" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Fel: Indatavektor X och indatavektor Y har inte samma längd" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Fel: Beräknade index ogiltiga" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Effektiv bandbredd" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Beräknar effektiv bandbredd från ett amplitudspektrum." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Min. vitt brus frek." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Samplingsfrekvens (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Generellt filter-insticksobjekt" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Fel: Indatasträngens täljare är tom" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Fel: Indatasträngens nämnare är tom" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Generellt filter" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Skapar ett diskret filter från en kontinuerlig tidsdefinition." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Samplingsintervall (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Täljare (ökande ordning)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Nämnare (ökande ordning)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Insticksobjekt för Akima-interpolation" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Akima spline-interpolation" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Skapar en icke-avrundad Akima-interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Insticksobjekt för periodisk Akima-interpolation" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Periodisk Akima spline-interpolation" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Skapar en icke-avrundad periodisk Akima-interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Insticksobjekt för kubisk spline-interpolation" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Kubisk spline-interpolation" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Skapar en spline-interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Insticksobjekt för periodisk kubisk spline-interpolation" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Periodisk kubisk spline-interpolation" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Skapar en kubisk spline-interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Insticksobjekt för linjär interpolation" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Linjär spline-interpolation" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Skapar en linjär spline-interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Insticksobjekt för polynomisk interpolation" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Polynomisk spline-interpolation" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Skapar en polynomisk interpolation för en datamängd." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Indatavektor X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Insticksobjekt för linjeanpassning" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Fel: Indatavektor Y har ogiltig storlek" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Fel: Indatavektor X har ogiltig längd" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Linjeanpassning" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Skapar en linje av bästa anpassning för en datamängd." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Dataobjekt-insticksprogram för inlåsning" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fel: Indatavektorer - ogiltig storlek" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Inlåsning" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "Inlåsning förstärker indata med användning av en referensbärvåg" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Referensvektor" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Brustillägg-insticksobjekt" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Fel: Indatavektor har ogiltig storlek" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Brustillägg" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Lägger till Gaussiskt brus till en datamängd, med en angiven " "standardavvikelse." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Periodogram-insticksobjekt" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fel: Indatavektorernas längder stämmer inte" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Periodogram" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Beräknar utdatavektorns periodogram för en given indatavektor-mängd. " "Indatavektorn antas inte vara samplad med identiska tidsintervall." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Indatavektor tid" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Indatavektor data" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Översamplingsfaktor" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Medelvärde av Nyquist-frekvensfaktor" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Fas-insticksobjekt" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Fel: Indataskalärfas måste vara större än noll." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Fel: Indatavektorernas längder stämmer inte." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fas" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Ändrar fas för en given datamängd till den angivna perioden och noll " "utdatavektorfas." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Indatavektor tid" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Indatavektor data" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Period" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Nollfas" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Skift-insticksobjekt" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Skift: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Skift" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Skiftar (och avkortar) en vektor." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Skiftvärde (antal punkter, negativa tillåtna)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "%1 statistik" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Fel: Indatavektor har ogiltig storlek" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statistik" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Bestämmer statistik för en given indatavektor-mängd." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Indatavektor" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Synkront intervall-insticksobjekt" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Fel: Indatavektor X har ogiltig storlek" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fel: Indatavektorernas längder stämmer inte" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Fel: Det måste finnas minst 2 intervall" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Synkront intervall" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Samaddera vektorn Y i skalära indataintervall definierade av vektorn X, likt " "en endimensionell avbildning." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Indatavektor X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Indatavektor Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Antal intervall" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X-min" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X-max" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "%1 bandpass" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtrerad %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Bandpassfilter" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtrerar en vektor med ett nollfas bandpassfilter med Butterworth " "amplitudsvar." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Indatavektor - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Filterordning:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Centrumfrekvens, samplingsfrekvens:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Bandbredd:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "%1 bandstopp" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtrerad %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Bandstoppfilter" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtrerar en vektor med ett nollfas bandstoppfilter med Butterworth " "amplitudsvar." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Indatavektor:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Filterordning:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Centrumfrekvens, samplingsfrekvens:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Bandbredd:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "%1 högpass" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtrerad %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Högpassfilter" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtrerar en vektor med ett nollfas högpassfilter med Butterworth " "amplitudsvar." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Indatavektor:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Filterordning:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Gränsfrekvens, samplingsfrekvens:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "%1 lågpass" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtrerad %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Lågpassfilter" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtrerar en vektor med ett nollfas lågpassfilter med Butterworth " "amplitudsvar." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Indatavektor:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Filterordning:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Gränsfrekvens, samplingsfrekvens:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "%1 ackumulerat medelvärde" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Ackumulerat medelvärde" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Ackumulerat medelvärde: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Ackumulerat medelvärde" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Beräknar indatavektorns ackumulerade medelvärde." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "%1 Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Ackumulerad summa" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Beräknar den ackumulerade summan (integralen) av indatavektorn." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Steg (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 toppborttagen" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Toppborttagning" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Toppborttagningsfilter: %1\n" " Mellanrum: %2\n" " N-sigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Toppborttagen %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Toppborttagningsfilter" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Hittar och tar bort toppar med en trepunktsskillnad." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Indatavektor:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Mellanrum:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "N-sigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "%1 derivatan" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Derivata" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivata: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "Fel: Indataskalärsteg får inte vara 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Differentiering med fast steg" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Beräknar den diskreta derivatan av en indatavektor" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Steg (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "%1 avnysta" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Avnysta" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Avnystningsfilter: %1\n" " %2 - %3\n" " Steg: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Indata: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Avnysta %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Avnystningsfilter" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Nystar upp data som har nystats." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Indatavektor:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maximum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Maximalt steg (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "%1 oviktad exponential" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentialanpassning till %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Residual vid exponentialanpassning" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponentialanpassning" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Skapar en exponentialanpassning för en datamängd." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "%1 viktad exponentiell" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentialanpassning till %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Residual vid exponentialanpassning" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Exponentiell viktad anpassning" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Skapar en exponentiell viktad anpassning för en datamängd." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Vikter:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "%1 oviktad Gauss" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussanpassning till %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residual vid Gaussanpassning" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaussanpassning" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Skapar en Gaussanpassning för en datamängd." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "%1 viktad Gauss" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussanpassning till %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residual vid Gaussanpassning" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Viktad Gaussanpassning" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Skapar en viktad Gaussanpassning för en datamängd." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Vikter:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "%1 oviktad gradient" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Gradientanpassning till %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Residual vid gradientanpassning" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradientanpassning undre gräns" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradientanpassning övre gräns" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Gradientanpassning" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Skapar en gradientanpassning för en datamängd." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "%1 viktad gradient" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Gradientanpassning till %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Residual vid gradientanpassning" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradientanpassning undre gräns" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradientanpassning övre gräns" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Viktad gradientanpassning" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Skapar en viktad gradientanpassning för en datamängd." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Vikter:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Insticksobjekt för knäfrekvens-anpassning" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Fel: Indatavektorernas storlekar stämmer inte" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Fel: Indatavektor X är ogiltig" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Fel: Indatafrekvenser är ogiltiga\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Fel: Indata ogiltig.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Knäfrekvensanpassning" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Skapar en knäfrekvensanpassning för en datamängd." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Indatavektor - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Indatavektor - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Indataskalär - Max 1/f^a frek" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Indataskalär - Min. vitt brus frek" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Indataskalär - vitt brus C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "%1 oviktad linjär" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Linjäranpassning till %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Residual vid linjäranpassning" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Undre gräns för linjäranpassning" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Övre gräns för linjäranpassning" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Linjäranpassning" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Skapar en linjäranpassning för en datamängd." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "%1 viktad linjär" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Linjäranpassning till %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Residual vid linjäranpassning" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Undre gräns för linjäranpassning" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Övre gräns för linjäranpassning" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Viktad linjäranpassning" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Skapar en viktad linjäranpassning för en datamängd." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Indatavektor - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Indatavektor - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Indatavektor - vikter" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "%1 Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzanpassning till %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residual vid Lorentzanpassning" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Lorentzanpassning" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Skapar en Lorenzanpassning för en datamängd." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "%1 Viktad Lorentzanpassning" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzanpassning till %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residual vid Lorentzanpassning" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Viktad Lorentzanpassning" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Skapar en viktad Lorenzanpassning för en datamängd." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Indatavektor - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Indatavektor - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Indatavektor - vikter" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "%1 polynom" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynomanpassning till %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residual vid polynomanpassning" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Polynomanpassning" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Skapar en polynomanpassning för en datamängd." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Ordning:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "%1 viktad polynom" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynomanpassning till %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residual vid polynomanpassning" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Viktad polynomanpassning" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Skapar en viktad polynomanpassning för en datamängd." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Indatavektor - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Indatavektor - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Indatavektor - vikter" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Indataskalär - ordning" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "%1 sinus" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusanpassning till %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residual vid sinusanpassning" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr " Sinusanpassning" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Skapar en sinusanpassning för en datamängd." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Övertoner:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Period:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "%1 viktad sinus" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusanpassning till %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residual vid sinusanpassning" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Viktad sinusanpassning" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Skapar en viktad sinusanpassning för en datamängd." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Indatavektor - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Indatavektor - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Indatavektor - vikter" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Indataskalär - övertoner" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Indataskalär - period" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Sampla indatavektor" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Infoga ny &vektor" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Infoga ny &skalär" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Redigera" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Infoga ny &skalär" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Infoga ny &sträng" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Redigera" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "&Färgpalett:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Utseende" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Vikt:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Punkttyp" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Den valda punkttypen ritas för varje datapunkt, om \"Visa punkter\" är " "markerat." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Linjetyp" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "Den valda linjestilen, om \"Visa linjer\" är markerat." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "Markera det här för att göra att linjer ritas mellan datapunkter." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Linjer" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Markera det här för att göra att de markerade punkterna ritas vid varje " "datapunkt." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "Pun&kter" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Huvud" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "&Stapeldiagram" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Linjebredd" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "Den valda linjebredden, om \"Visa linjer\" är markerat, " #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Storlek:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "Pun&kttäthet:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Alla" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Hög" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Medium" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Låg" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Placering" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Skala teckensnitt" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Placera i &nytt diagram" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "Under n&y flik" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "Namnet på datafilen som kommer att läsas för den här vektorn." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Plats i b&efintligt diagram " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Pl&acera inte i något diagram" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Automatis&k layout" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "E&get rutnät" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Kolu&mner" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "Sk&ydda befintlig layout" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Välj en kurva att utnyttja." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "ramar" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Dataintervall" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Markera det här för att beräkna medelvärdet av de överhoppade ramarna " "tillsammans. Tillhandahåller enkel lågpassfiltrering." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "&Fyrkantfilter först" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Spara minne genom gles sampling av data" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Markera det här för att hoppa över ramar istället för att läsa all data. Det " "är användbart för att läsa mycket långa men långsamt ändrade datafiler." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Läs &1 sampling per:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Markera det här för att läsa all data till filens slut. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Läs till slut&et" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "eller" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Markera det här för att läsa data från filens slut. Det är användbart för " "rullande visning där data läggs till sist i filen av ett annat program." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "Räkna från sl&utet" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "Antal ramar att hoppa över, om \"Läs 1 sampling per\" är vald." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " ram(ar)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Start:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Inte&rvall:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Mata in ett tal (med början på 0 för det första värdet), eller formatet " "[[[[ÅÅÅÅ:]MM:]DD:]TT:]MM[.SS] för datum." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "Index för första inlästa data. För ASCII-filer är det radnummer för data i " "filen. För rambaserade filer är det den första ramen." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Mängden data att läsa in i vektorn. För ASCII-filer är det antal datarader. " "För ramfiler kan det finnas mer än en sampling per ram. Datum matas in med " "formatet [[[[ÅÅÅÅ:]MM:]DD:]TT:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Filen hittades inte.\n" "Kontrollera att rätt filnamn angavs." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "FFT-alternativ" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Standard" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "cosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gauss (eget sigma)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Välj vektorkällan för felstaplar på kurvans y-axel från den här " "kombinationsrutan. Om \"\" väljes, ritas inga felstaplar på y-axeln. " "Skapa nya vektorer under fliken \"Vektorer\"." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&sera" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ktion:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Ta &bort medelvärde" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "FFT-&längd: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Ställer in längden hos FFT:er för att skapa effektspektrum. 2^10 = 1024, " "etc. Ju större tal, desto större brus och upplösning." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Interfolierat &medelvärde" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpolera över &hål" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Sa&mplingsfrekvens:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "Samplingsfrekvensen som mätningarna förvärvades med, för riktig " "normalisering." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "Verkställ nya datasamplingsspecifikationer för markerade vektorer." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Vektorenheter:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Datavektorns enheter, för automatiska beteckningar." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Frekvensenheter:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "Enheter för samplingsfrekvensen. Används för automatiska beteckningar." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "U&tmatning:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Amplitudspektraltäthet (V/Hz^½)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Effektspektraltäthet (V²/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Amplitudspektrum (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Effektspektrum (V²)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Öppna fil" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Alla filer (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Loggfilkatalog" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Spara fil" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Syntaxen för beteckningar är härledd från en delmängd av Latex. " "Syntaxsom stöds är: \\[grekiskt bokstavsnamn] och \\[Grekiskt " "bokstavsnamn], \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, " "\\n, \\partial, \\prod, \\pm, \\textcolor" "{färgnamn}{färgad text}, \\textbf{text med fetstil}, \\textit" "{kursiv text}, \\t, \\sum, \\sqrt, \\underline" "{understruken text}, \\overline{överstruken text}, x^y, " "x_y. Skalärer, ekvationer och vektorelement kan inbäddas. Skalär: " "[V1/Mean]. Vektorelement: [V1[4]]. Ekvation: [=[V1/Mean]" "^2]. Tecknet [ kan infogas som \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Beteckningens text. En delmängd av Latex stöds. Klicka på 'Hjälp' för att få " "hjälp." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Skalärer och " "ekvationer
Skalärer och skalära ekvationer kan visas direkt i " "beteckningar. När skalären uppdateras, uppdateras beteckningen. Namn på " "skalärer kompletteras automatiskt. Formatet är:

Skalär: [skalärnamn], t.ex. " "[GYRO1:Mean(X4)]

Vektorelement:[vektornamn" "[index]], t.ex., [GYRO1 (V2)[4]]

Ekvation: [=ekvation], t.ex. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Delmängd av Latex som stöds
Beteckningar i kst stöder en avledd delmängd av LaTeX. För att exempelvis visa ekvationen " "för en cirkels yta, kan man definiera betecknigen som A=2\\pir^2. Till " "skillnad från Latex, är det inte nödvändigt att gå till matematikläge genom " "att använda '$'. Också till skillnad från Latex, visas inte variabler " "automatiskt med kursiv stil. Om det önskas, måste det göras explicit genom " "att använda \\textit{}. Följder som stöds är:

Grekiska bokstäver: \\namn eller \\Namn. t.ex.: " "\\alpha

Andra symboler: " "\\approx,\\cdot,\\ge," "\\geq,\\inf,\\int," "\\le,\\leq,\\ne," "\\partial,\\prod,\\pm," "\\sum,\\sqrt

Teckeneffekter: \\textcolor" "{färgnamn}{färgad text}, \\textbf{text i fetstil},\\textit{kursiv text}" ",\\underline{understruken text}," "\\overline{overlined text}.

Annat:x^y,x_y, \\t,\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Stöder Latex-symboler, strängar och skalärer med uppdatering, samt inbäddade " "ekvationer." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Beteckning:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Hjälp" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Syntaxen för beteckningar är härledd från en delmängd av Latex. " "Syntaxsom stöds är: \\[grekiskt bokstavsnamn] och \\[Grekiskt " "bokstavsnamn], \\approx, \\cdot, \\ge, \\geq, \\inf ,\\int, \\le, \\leq, \\ne, " "\\n, \\partial, \\prod, \\pm, \\textcolor" "{färgnamn}{färgad text}, \\textbf{text med fetstil}, \\textit" "{kursiv text}, \\t, \\sum, \\sqrt, \\underline" "{understruken text}, \\overline{överstruken text}, x^y, " "x_y. Skalärer, ekvationer och vektorelement kan inbäddas. Skalär: " "[V1/Mean]. Vektorelement: [V1[4]]. Ekvation: [=[V1/Mean]" "^2]. Tecknet [ kan infogas som \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "Beteckningens text. En delmängd av Latex stöds. Se Vad är det här." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Markera en vektor att utnyttja. Om du vill skapa en ny vektor, klicka på " "ikonen till höger." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Skapa en ny vektor." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Öppnar en vektordialogruta för att redigera en ny vektor, som blir den " "markerade vektorn." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Redigera markerad vektor." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Öppnar en vektordialogruta för att redigera markerad vektor." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Dialogruta" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Stäng" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Dialogruta" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Sök:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Markera en skalär att utnyttja. Om du vill skapa en ny skalär, klicka på " "ikonen till höger." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Skapa en ny skalär." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Redigera markerad skalär." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Markera en sträng att utnyttja. Om du vill skapa en ny sträng, klicka på " "ikonen till höger." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Skapa en ny sträng." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Redigera markerad sträng." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Markera en vektor att utnyttja. Om du vill skapa en ny vektor, klicka på " "ikonen till höger." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Skapa en ny vektor" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Öppnar en vektordialogruta för att redigera en ny vektor, som blir den " "markerade vektorn." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Redigera markerad vektor." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Öppnar en vektordialogruta för att redigera markerad vektor." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Grafiska komponenter i Kst" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Ackumulerad spektralavklingning" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Redigera ackumulerad spektralavklingning" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Ny ackumulerad spektralavklingning" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "CSD: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Fel när CSD skulle skapas från Kst-fil." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "Fel när CSD skulle skapas från Kst-fil. Kunde inte hitta vektor." #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Redigera " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Ny " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Redigera " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Insticksprogram" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Ny " #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "läser fält..." #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Använd Open&GL" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "Söker efter rader..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "Sökning efter rader klar" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Söker efter rader: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "kolumn läst" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Felsök" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Felsök" #~ msgctxt "ContentTab|" #~ msgid "insert object" #~ msgstr "Infoga objekt" #~ msgctxt "ContentTab|" #~ msgid "remove object" #~ msgstr "ta bort objekt" #~ msgctxt "FillTab|" #~ msgid "fill color" #~ msgstr "fyllnadsfärg" #~ msgctxt "HistogramTab|" #~ msgid "-10.0" #~ msgstr "-10,0" #~ msgctxt "LabelCreator|" #~ msgid "label color" #~ msgstr "beteckningsfärg" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label color" #~ msgstr "beteckningsfärg" #~ msgctxt "LabelTab|" #~ msgid "label color" #~ msgstr "beteckningsfärg" #~ msgctxt "Kst::PlotRenderItem|" #~ msgid "%1 vs %2" #~ msgstr "%1 mot %2" #~ msgctxt "StrokeTab|" #~ msgid "stroke width" #~ msgstr "streckbredd" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "JD" #~ msgstr "JD" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "MJD" #~ msgstr "MJD" # ~| msgctxt "Julian Date|" # ~| msgid "JD" #~ msgctxt "AxisTab|" #~ msgid "RJD" #~ msgstr "RJD" #~ msgctxt "CurveAppearance|" #~ msgid "line style" #~ msgstr "linjestil" #~ msgctxt "FFTOptions|" #~ msgid "Hz" #~ msgstr "Hz" #~ msgctxt "Kst|" #~ msgid "Data Matrix" #~ msgstr "Datamatris" #~ msgctxt "Kst|" #~ msgid "datamatrix" #~ msgstr "datamatris" #~ msgctxt "Kst::DataPrimitive|" #~ msgid "Data file for vector %1 was not opened." #~ msgstr "Datafil för vektor %1 var inte öppnad." #~ msgctxt "Kst|" #~ msgid "Data Scalar" #~ msgstr "Dataskalär" #~ msgctxt "Kst|" #~ msgid "datascalar" #~ msgstr "dataskalär" #~ msgctxt "Kst|" #~ msgid "Data String" #~ msgstr "Datasträng" #~ msgctxt "Kst|" #~ msgid "datastring" #~ msgstr "datasträng" #~ msgctxt "Kst|" #~ msgid "Data Vector" #~ msgstr "Datavektor" #~ msgctxt "Kst|" #~ msgid "datavector" #~ msgstr "datavektor" #~ msgctxt "Kst|" #~ msgid "Editable Matrix" #~ msgstr "Redigerbar matris" #~ msgctxt "Kst|" #~ msgid "editablematrix" #~ msgstr "redigerbarmatris" #~ msgctxt "Kst|" #~ msgid "Editable Vector" #~ msgstr "Redigerbar vektor" #~ msgctxt "Kst|" #~ msgid "editablevector" #~ msgstr "redigerbarvektor" #~ msgctxt "Kst|" #~ msgid "Generated Matrix" #~ msgstr "Skapad matris" #~ msgctxt "Kst|" #~ msgid "Matrix" #~ msgstr "Matris" #~ msgctxt "Kst|" #~ msgid "Object" #~ msgstr "Objekt" #~ msgctxt "Kst|" #~ msgid "String" #~ msgstr "Sträng" #~ msgctxt "Kst|" #~ msgid "string" #~ msgstr "sträng" #~ msgctxt "Kst|" #~ msgid "Vector" #~ msgstr "Vektor" #~ msgctxt "Kst|" #~ msgid "vector" #~ msgstr "vektor" #~ msgctxt "Kst|" #~ msgid "Plugin" #~ msgstr "Insticksprogram" #~ msgctxt "Kst|" #~ msgid "plugin" #~ msgstr "insticksprogram" #~ msgctxt "Kst|" #~ msgid "Curve" #~ msgstr "Kurva" #~ msgctxt "Kst|" #~ msgid "curve" #~ msgstr "kurva" #~ msgctxt "Kst|" #~ msgid "Equation" #~ msgstr "Ekvation" #~ msgctxt "Kst|" #~ msgid "equation" #~ msgstr "ekvation" #~ msgctxt "Kst|" #~ msgid "Histogram" #~ msgstr "Histogram" #~ msgctxt "Kst|" #~ msgid "histogram" #~ msgstr "histogram" #~ msgctxt "Kst|" #~ msgid "Image" #~ msgstr "Bild" #~ msgctxt "Kst|" #~ msgid "image" #~ msgstr "bild" #~ msgctxt "Kst|" #~ msgid "Relation" #~ msgstr "Relation" Kst-2.0.8/po/kst_common_de.po0000644000175000017500000112407712362706252015176 0ustar synthsynth# Burkhard Lück , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-05-11 22:11+0200\n" "Last-Translator: Burkhard Lück \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Diese Einstellungen als Standard anwenden" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Vorschau der ersten 1000 Zeilen in einem neuen Fenster" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Erste Zeilen" #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Vorschau]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Vorspann" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Daten beginnen in Zeile:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Feldnamen einlesen von Zeile:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Einheiten einlesen von Zeile:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Kommentarzeichen:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Sie können hier auch mehr als ein Zeichen verwenden, wie zum Beispiel „#!C“, " "aber dies verlangsamt das Einlesen von ASCII-Dateien" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Dezimaltrennzeichen:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Punkt" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Komma" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Datenspalten-Layout" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Durch Leerzeichen/Tabulatorzeichen getrennt" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Benutzerdefiniertes Trennzeichen" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "Das Einlesen ist schneller, wenn angenommen werden kann, dass jede Spalte " "eine eigene konstante Breite hat." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Jede Spalte hat ihre\n" "eigene konstante Breite" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Feste Breite" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Allgemeine Einstellungen" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Grenzwert der Puffergröße:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Threads verwenden" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Auf folgendes Muster passende Dateien immer akzeptieren:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Leeren Wert interpretieren als:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Null" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "Nan" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Vorheriger Wert" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretation von Datum/Zeit" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Wert" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Feld interpretieren" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "als:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "C-Zeit" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Sekunden" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Index mit Frequenz" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Formatierte Zeichenkette. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Weitere Informationen finden Sie in der Dokumentation zu „QDateTime“.
Sie " "können eine Kombination von y,M,d für das Datum und von h,m,s,z (z für " "Millisekunden) für Zeiten verwenden.
Leerzeichen zwischen Spalten für " "Datum und Zeit sind erlaubt, aber Sie müssen die erste Spalte als X-Vektor " "auswählen." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr "" " d=Tag, M=Monat, y=Jahr, h=Stunde, m=Minute, s=Sekunde, z=Millisekunde" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Versatz" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Datum/Zeit:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Dateidatum" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relativ" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Erste Zeilen der Datei „%1“" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "Zeile %1 darf nicht Feldnamen und Werte enthalten" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "Zeile %1 darf nicht Einheiten und Werte enthalten" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "Zeile %1 darf nicht Feldnamen und Einheiten enthalten" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Inkonsistente Parameter" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "ASCII-Dateileser" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "„%1“ wird verarbeitet ..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Verarbeitung von „%1“ beendet" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "„%1“ wird verarbeitet: %2 Zeilen" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Feld wird eingelesen: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "Index erstellt" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Einlesen beendet:" #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "Einlesen ..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "Verarbeiten ..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Spalte %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "DirFile-Leser" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Matlab-Datenquellenleser" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Matlab-Datenquellenleser für das Format „.mat“" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "netCDF-Leser" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "QImage-Quellleser" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Beispiel-Datenquellenleser" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Spalte %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Datendatei für die Matrix %1 wurde nicht geöffnet." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Datendatei für den Vektor %1 wurde nicht geöffnet." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Datenmatrix: %1\n" " %2\n" " Feld: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 von %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Datendatei für den Vektor %1 wurde nicht geöffnet." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Datendatei für den Skalar %1 wurde nicht geöffnet." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Data-Skalar: %1 = %4\n" " %2\n" " Feld: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 von %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "Rahmen" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Modul-Suchpfade:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Es wird nach Datenquellen-Modulen gesucht." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Modul geladen: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "Erstellen einer Instanz ist fehlgeschlagen für %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Die Datei „%1“ existiert nicht." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Es wurde keine Datenquelle für '%1'(%2) gefunden, die vorher noch vorhanden " "war." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Datendatei für die Zeichenkette %1 wurde nicht geöffnet." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Daten-Zeichenkette: %1 = %4\n" " %2\n" " Feld: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 von %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Datendatei für den Vektor %1 wurde nicht geöffnet." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Datenvektor: %1\n" " %2\n" " Feld: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Letzte %1 Rahmen." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Rahmen %1 bis Ende." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 Rahmen ab %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " 1 Messwert pro %1 Rahmen lesen." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Durchschnitt je %1 Rahmen." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 of %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Fehler" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Warnung" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Hinweis" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Ablaufverfolgung" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Weitere" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst-Version %1\n" "\n" "\n" "Kst-Protokoll:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Datenquellen-Module:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Editierbarer Vektor: %1\n" " %2 Werte" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Generierter Vektor: %1\n" " %2 Werte von %3 bis %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 Punkte von %1 bis %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "Die gespeicherte Matrix enthält weniger Daten als angegeben." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matrix: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Fehler beim Erstellen der generierten Matrix aus der Kst-Datei." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Fehler beim Erstellen der editierbaren Matrix aus der Kst-Datei." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Fehler beim Erstellen der Daten-Matrix aus der Kst-Datei." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Skalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Skalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Wert: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Fehler beim Erstellen des Skalars aus der Kst-Datei." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Zeichenkette: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Fehler beim Erstellen der Zeichenkette aus der Kst-Datei." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Anbieter: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vektor: %1\n" " %2 Messwerte\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Fehler beim Erstellen des Vektors aus der Kst-Datei." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Fehler beim Erstellen des generierten Vektors aus der Kst-Datei." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Datendatei für den Skalar %1 wurde nicht geöffnet." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Datenskalar: %1 = %4\n" " %2\n" " Feld: %3\n" " Rahmen: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 Rahmen %3 von %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "" "

Kst %1 - ein Programm zur graphischen Darstellung von Daten

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revision %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Webseite:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Bitte melden Sie Problemberichte mit dem Assistenten im Menü „Hilfe“.
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autoren und Mitwirkende (Alphabetisch sortiert):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Über Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Kst-Einstellungen" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Allgemein" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Skalierung" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Gitter" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Layout-Eigenschaften" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Pfeil" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Fehler beim Erstellen des Pfeil-Objekts aus der Kst-Datei." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Pfeil erstellen" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Eigenschaften" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Pfeileigenschaften" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Pfeil am &Anfang" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Maßs&tab des Pfeils an Anfang" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Größe des Pfeilsymbols" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "Die Größe des Pfeilsymbols ist proportional zu diesem Wert." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Pfeil am &Ende" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Maßstab des Pfeils an E&nde" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Achse" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Grob" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fein" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Hochauflösend" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Durchgezogene Linie" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Gestrichelte Linie" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Gepunktete Linie" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Strich-Punkt-Linie" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Strich-Punkt-Punkt-Linie" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Benutzerdefinierte gestrichelte Linie" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Links ausblenden" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Rechts ausblenden" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Ränder und Beschriftungen ausblenden" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Oben ausblenden" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Unten ausblenden" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Drehung der Beschriftung" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Drehung :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Basis- / Versatzmodus" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Automatisch" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "An" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Aus" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Stellenanzahl vor automatischem Basis- / Versatzmodus:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Ist diese Anzahl von Stellen erforderlich, um die Zahlen an den Strichen " "anzuzeigen, dann wird zum Basis- / Versatzmodus gewechselt." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Versatz zum Achsenminimum erzwingen" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Skalierung" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarithmisch" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Kehrt die Richtung der Achse um, so dass die Zahlen absteigend statt " "aufsteigen sind." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Umgekeh&rt" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Achse ist Zeit" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpretiert die Achse als Zeit" #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpretieren als:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Zeit-Kodierungstyp" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "" "Auf der Achse wird die Zeit dargestellt, die Kodierung dafür kann hier " "ausgewählt werden." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "Anzei&gen als:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Anzeigeformat der Zeit" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Wenn die Achse als Zeit interpretiert wird, dann wird die Zeit auf der Achse " "in diesem Format angezeigt." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Zeitzone:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Zeit-/Datumsformat:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Datum: y/M/d - Zeit: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Hauptstriche und -linien" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Striche &zeichnen" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "&Gitterlinien zeichnen" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "A&stand der Hauptstriche:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Dichte der Hauptstriche" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Bestimmt die Dichte der Hauptstriche. De Abstand der Hauptstriche wird " "automatisch als 10 hoch 1,2 oder 5 gewählt. Dies ändert den Strichabstand " "mit dieser Einschränkung." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "Gitterlinien&stil:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "Gitterlinien&farbe:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Breite:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Nebenstriche und -linien" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Striche &zeichnen" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Gitterlinien zeichnen" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Anzahl &der Nebenstriche:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Automatisch" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "L&inienstil:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Linienfarb&e:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: Datei nicht gefunden. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Dialog" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "Textfeld" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Neue Datendatei auswählen:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Unbekannter Dateityp" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Einric&hten ..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Ändern" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Überspringen" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Basismodul" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Modul %1 bearbeiten" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Neues Modul %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Das Modulobjekt kann mit den angegebenen Parametern nicht erstellt werden.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Eingabe und Ausgabe" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Rechteck" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Fehler beim Erstellen des Rechteck-Objekts aus der Kst-Datei." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Rechteck erstellen" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bit" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bit" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistenten zum Berichten von Fehlern und Wünschen" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Kst-Version:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "Betriebssystem:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Um einen Fehlerbericht zu erstellen, klicken Sie bitte auf den Knopf unten.\n" "Danach öffnet sich ein Browser-Fenster für http://bugs.kde.org, worin Sie " "ein \n" "entsprechendes Formular ausfüllen können.\n" "Die oben angezeigte Information wird zum Server übertragen." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Assistenten zum Berichten von Fehlern und Wünschen starten" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Knopf" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Fehler beim Erstellen des Knopf-Objekts aus der Kst-Datei." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Kartesischer Plot" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "Rahmen" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Zu wenig Speicher" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Es wurden %1 MB Daten zum Lesen angefordert, aber anscheinend ist nur %2 MB " "als Arbeitsspeicher verfügbar. Daher können Sie diese Datenmenge nicht laden." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Daten-Messwerte ändern" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Vektorauswahl" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Die Quelldatei für die Vektoren, die in dieser Liste ausgewählt sind, wird " "geändert." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Alle Vektoren in der Liste auswählen." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "A&lle hinzufügen" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Hinzufügen" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Alle Vektoren in der Liste abwählen." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Entfernen" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "Alle &entfernen" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Die Datei lässt sich nicht laden oder enthält keine Daten." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "Das folgende Feld ist für die angeforderte Datei nicht definiert:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Das folgenden Felder sind für die angeforderte Datei nicht definiert:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Datendatei ändern" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Nach Quelldatei auswählen" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "A&lle hinzufügen von:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Vektor- und Matrixauswahl" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Die Quelldatei für die Vektoren, die in dieser Liste ausgewählt sind, wird " "geändert." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Alle Vektoren in der Liste auswählen." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "A&lle hinzufügen" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Hinzufügen" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Alle Vektoren in der Liste abwählen." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Entfernen" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "Alle &entfernen" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Neue Datendatei" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Datei:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Ausgewählte Vektoren und Matrizen &ändern" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "Abgeleitete Objekte (Kurven, Gleichungen ...) d&uplizieren" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Ausgewählte Vektoren und Matrizen duplizieren" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Unbekannter Dateityp" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Einr&ichten..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Kurvenfarbe aus Datei zuweisen " #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Farben zuweisen" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Kurvenfarbe basiert auf:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "&X-Vektor" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "&Y-Vektor" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Radius" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Zentriert" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Position zu Daten sperren" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Kreis" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Fehler beim Erstellen des Kreisobjekts aus der Kst-Datei." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Kreis erstellen" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Größe/Position" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "Ende" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Spalte %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Anwendung: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Anwendung: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Anwendung: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Anwendung: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Anwendung: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Anwendung: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Anwendung: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Anwendung: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Anwendung: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Keine Datendateien angegeben\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "Die Datei „%1“ existiert nicht\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Anwendung: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Anwendung: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Anwendung: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Anwendung: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Anwendung: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Anwendung: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "In Plot-Reihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "In Plot-Reihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "&Verfügbare Objekte:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Auswahl aufheben" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Alles auswählen" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Bearbeiten" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "In Plot-Reihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Pfeil aufwärts" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "In Plot-Reihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Pfeil abwärts" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Angezeigte Objekte:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "Knopfgruppe" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "Dies und alles weitere unten ist nur für Skripte und sollte ausgeblendet " "sein." #: ../src/libkstapp/csddialog.cpp:43 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spektr&ogramm" #: ../src/libkstapp/csddialog.cpp:132 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Spektr&ogramm" #: ../src/libkstapp/csddialog.cpp:134 #, fuzzy #| msgctxt "Kst::DataManager|" #| msgid "Make Spectrogram" msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Spektrogramm erzeugen" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Spektrogramm-Inhalte" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Daten-Vektor:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Fenstergröße:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Bildeinstellungen" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Kurve" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Kurve bearbeiten" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Neue Kurve" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Kurveninhalte" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "&X-Achsen-Vektor:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "&Y-Achsenvektor:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "+X-Fehlerbalken:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "&+Y-Fehlerbalken:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "-X-Fehlerbalken:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "&+Y-Fehlerbalken:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "+X-Fehlerleiste für -X ben&utzen" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "+Y-Fehlerlei&ste für -Y benutzen" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "In automatischen Achsenbereichsberechnun&gen ignorieren" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Name:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Automatisch" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Mehrere bearbeiten >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Ein %1 bearbeiten" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Geben Sie hier Ihren Filter ein, Platzhalter sind erlaubt" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Bearbeiten" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Kurve erzeugen" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Leistungsspektrum erstellen" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Spektrogramm erzeugen" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Histogramm erzeugen" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Filter anwenden" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Bild erzeugen" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Zum Plot hinzufügen" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Aus Plot entfernen" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Anpassung anwenden" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Löschen" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Datenverwaltung" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtern auf:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Alle Spalten" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Name" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Typ" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Messpunkte" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Eigenschaften" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Groß-/Kleinschreibung beachten" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Vollständig entfernen" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Fehler beim Erstellen der Datenquelle aus der Kst-Datei." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Zeitintervall" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Erkennung ändern" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Keine Aktualisierung" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "In Plot-Reihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "In Plot-Reihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 Vektor(en) verfügbar" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 Vektor(en) ausgewählt" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "S&pektral-Plots erstellen. Geben Sie die FFT-Einstellungen unten an:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Zu wenig Speicher" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Es wurden %1 MB Daten zum Lesen angefordert, aber anscheinend ist nur %2 MB " "als Arbeitsspeicher verfügbar. Daher können Sie diese Datenmenge nicht laden." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "" "&XY-Plots erstellen. Bestimmen Sie die Vektor-Eigenschaften der X-Achsen " "unten:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "A&us Feld erstellen:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "&Vorhandene verwenden:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "Das Feld, das als X-Achse in XY-Plots verwendet werden soll." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Bitte wählen Sie eine Datenquelle zur " "Bearbeitung. Dies ist normalerweise Ihre Datei mit Datenpunkten oder -" "vektoren.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Unbekannter Dateityp" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Einr&ichten ..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Aktualisierungstyp: Benutzen Sie „Zeitintervall“ für nicht lokale Daten" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filter" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Neuer Filter ..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Wenn Sie es wünschen, " "wählen Sie einen Filter für die Felder, die eingelesen werden:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Kurvenplatzierung" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Alle Kurven in einem Plot" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 neuer Plot pro Kurve" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "&Durchlaufen" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " Plots" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Existierende Plots &durchlaufen" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Alle Kurv&en im Plot" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Plot-Platzierung (Unterfenster)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Alle im aktuellem &Unterfenster" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Alle in neu&em Unterfenster" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY- und &Spektrum in getrennten neuen Unterfenstern" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Plot-Layout" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Automatisches Layout" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Benutzerdefiniertes &Gitter" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Spalten:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "Vo&rhandenes Layout schützen" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Beschriftungen" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Alle Beschriftungen im Unterfenster neu skalieren" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Gemeinsame Achse auf Unterfenster" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Kur&venstil" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Nur L&inien" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Nur &Punkte" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Linien un&d Punkte" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Achsenmodus für Spektrum" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "X-Achse lo&garithmisch" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Y-Achse &logarithmisch" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Legenden" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "A&n" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Aus" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&utomatisch" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Senkrecht" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "In Plot-Reihenfolge nach vorne (Alt+Pfeil aufwärts)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Pfeil aufwärts" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Pfeil abwärts" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Auswählen (Alt-S): Die ausgewählten Felder von der Liste der verfügbaren " "Daten in die Liste der für das Plotten ausgewählten Daten verschieben." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Entfernen (Alt-R): Die ausgewählten Felder von der Liste der ausgewählten " "Daten in die Liste der verfügbaren Daten verschieben, damit sie nicht " "geplottet werden." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Ausgewählte Daten: Alle Felder in dieser Liste werden geplottet." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Ausgewählte Daten: Alle Felder in dieser Liste werden geplottet. Um Felder " "aus dieser Liste zu entfernen, ziehen Sie sie in die Liste der verfügbaren " "Daten, doppelklicken sie oder wählen sie aus und drücken den Löschen-Knopf " "(das Symbol mit dem Pfeil nach links, Tastenkürzel Alt+R). Die Reihenfolge, " "in der die Felder in dieser Liste erscheinen, ist die Reihenfolge, in der " "sie geplottet werden." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Ausgewählte Daten:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 Vektor(en) ausgewählt" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Suchfilter" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Suchfilter: Felder, die mit diesem Filter übereinstimmen, werden markiert " "und an den Anfang der Liste der verfügbaren Daten verschoben. Die " "Platzhalter „*“ und „?“ werden unterstützt." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Fügt das Platzhalterzeichen „*“ an den Anfang und das Ende des Suchfilters " "ein, um alles zu finden, das den Suchfiltertext enthält." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "Such&en" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Feldauswahl: Ausgewählte Felder werden geplottet." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Verfügbare Daten: Diese Liste enthält alle Felder, die nicht für das Plotten " "ausgewählt wurden. Um ein Feld für das Plotten auszuwählen, verschieben Sie " "es in die Liste der ausgewählten Daten, indem Sie es mit der Maus " "hinüberziehen, es doppelklicken oder es auswählen und den Auswahlknopf " "drücken (das Symbol mit dem Pfeil nach rechts, Tastenkürzel: Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Verfügbare Daten:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- Vektor(en) verfügbar" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

-Version %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

-Version %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Kst-Fehlersuchdialog" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Kompilierungs-Informationen" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "Fehlersuche-Informationen per &E-Mail versenden" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Protokoll" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Protokollstufe: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Fehler" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Warnung" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Hinweis" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "Ab&laufverfolgung" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Lee&ren" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Datenquellen" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Modul" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Geladene Instanz" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "S&chließen" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "" "Ein Fehler ist aufgetreten. Klicken Sie auf dieses Symbol für weitere " "Details." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Schriftarten" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Buchstabe" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Zeitschriftendruck" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Benutzerdefiniert" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Minimale Schriftgröße (Punkt):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Beim Ändern der Fenstergröße werden Schriften mindestens in dieser Größe " "angezeigt." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Referenzgröße der Ansicht:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Hat das Fenster diese Größe, dann haben die Schriften die angegebene Größe." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Schriften werden mit der Fenster- oder Druckgröße skaliert. Wenn das Fenster " "bzw. der Druck diese Größe hat, dann sind die angegebenen Schriftgrößen " "richtig." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Benutzerdefinierte Referenzgröße (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Als Standard speichern" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Auf vorhandene Objekte anwenden" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "" "Ausgewählte Eigenschaften in der Priorotätenliste nach oben verschieben" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "" "Ausgewählte Eigenschaften in der Priorotätenliste nach unten verschieben" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Ausgewählte Eigenschaft zur Liste der zu durchlaufenden Eigenschaften " "hinzufügen" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Ausgewählte Eigenschaft aus Liste der zu durchlaufenden Eigenschaften " "entfernen" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Linienfarbe" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Punktstil" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Linienstil" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Linienbreite" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Kurven unterscheiden" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Eigenschaftsauswahl und Durchlaufreihenfolge" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "In der Auswahlreihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Pfeil aufwärts" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "In Auswahlreihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Pfeil abwärts" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Verfügbar:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Ausgewählt:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Einstellungen" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Maximale Linienstärke:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Punktdichte:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Alle" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Hoch" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Mittel" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Niedrig" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Größe/Position" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "D&rehung:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Größe:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Position:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "Seiten&verhältnis beibehalten" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Position zu Daten sperren" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Datei kann nicht zum Schreiben geöffnet werden." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Die Datei kann nicht zum Lesen geöffnet werden." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Die Datei ist fehlerhaft, beim Lesen trat ein Fehler auf." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Objekte zum Bearbeiten auswählen" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filter:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Leeren" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "&Alle auswählen" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Ellipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Fehler beim Erstellen des Ellipsenobjekts aus der Kst-Datei." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Ellipse erstellen" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Gleichung" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Gleichung bearbeiten" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Neue Gleichung" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Gleichung" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Gleich&ung:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Geben Sie die auszuwertende Gleichung ein. Verwenden Sie 'x' für die " "unabhängige Variable. Vektoren und Operatoren können aus der obigen Liste " "ausgewählt werden." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "&X-Vektor:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Zu dem Vektor mit de&r höchsten Auflösung interpolieren" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Ereignismonitor" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Ereignismonitor bearbeiten" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Neuer Ereignismonitor" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "E-Mailbenachrichtigung" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "&Benachrichtigen:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Ausdruck" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vektoren:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operatoren:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "Pi" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Skalare:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Ausdruck:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Beschreibung:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "Kst-Skript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Ausführen:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "Benachrich&tigen:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Einrichten..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Kst-Protokoll zur Fehlersuche" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Warnung" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Fehler" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Hinweis" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "Protoko&llieren als:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "In Grafikdatei exportieren" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Basisname:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "Datei&format:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Größe" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Breite:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Breite des Bildes in Pixeln." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Höhe:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Höhe des Bildes in Pixeln." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "An&geben:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Breite und Seitenverhältnis beibehalten" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Höhe und Seitenverhältnis beibehalten" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Breite und Höhe" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Größe des Quadrats" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Einstellungen speichern" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Nicht automatisch speichern. Stattdessen wird bei OK oder Übernehmen einmal " "gespeichert." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Ein&mal Speichern" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Bild mit Taktgeber speichern" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Wenn dies aktiviert ist, dann wird das Bild wiederkehrend nach der " "angegebenen Zeitdauer gespeichert. Das ist zum Beispiel nützlich, wenn Live-" "Bilder für Webseiten erzeugt werden." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "&Automatisch speichern alle" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Zeitgeber für automatische Speicherung" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Automatische &Erweiterung" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Einschließen:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Vektorformate" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Bitmapformate" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Vektoren exportieren" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Vektorauswahl" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Die Quelldatei für die Vektoren, die in dieser Liste ausgewählt sind, wird " "geändert." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Alle Vektoren in der Liste auswählen." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "A&lle hinzufügen" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Hinzufügen" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Alle Vektoren in der Liste abwählen." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Entfernen" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "Alle &entfernen" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Adresse &speichern:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Füllen" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Kein Pinsel" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Einfarbiges Muster" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Dichtemuster 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Dichtemuster 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Dichtemuster 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Dichtemuster 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Dichtemuster 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Dichtemuster 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Dichtemuster 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Waagerechtes Muster" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Senkrechtes Muster" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Kreuzmuster" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonalmuster 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonalmuster 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonales Kreuzmuster" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Farbe:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Stil:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "&Linearen Verlauf verwenden" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "Ve&rlauf zurücksetzen" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Modul" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Modul %1 bearbeiten" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Neues Modul %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Das Modulobjekt kann mit den angegebenen Parametern nicht erstellt werden.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Modulauswahl" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Modulname:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Beschreibung:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Eingabe und Ausgabe" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "In automatischen Achsenbereichsberechnun&gen ignorieren" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Allgemein" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "" "Dynamische Dateien werden im Verhältnis zu diesem Wert schneller oder " "langsamer aktualisiert." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Minimale Zeit zwischen Aktualisierungen bei dynamischen Dateien. Sind viele " "Daten zu verarbeiten, kann es länger dauern." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Zeitraum zwischen Aktualisierungen (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Transparenz beim Ziehen verwenden" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Rendern mit „Raster“ Dies funktioniert manchmal nicht richtig." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Das Rendern mit „Raster“ ist auf einigen Rechner schneller, kann aber auf " "anderen Rechner fehlerhaft sein, abhängig vom Videotreiber. Diese " "Einstellung kann nützlich sein, aber auch zu Problemen führen." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "„Raster“-Grafikmodul verwenden, Kst muss dazu neu gestartet werden" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Plots mit K&antenglättung" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Gitter" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "&Gitter anzeigen" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Am Gitter einra&sten" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Waagerechter &Gitterabstand:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Sen&krechter Gitterabstand:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogramm" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Histogram bearbeiten" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Neues Histogramm" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Histogramm-Eigenschaften" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Datenvekto&r:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Klassen von&:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "Die untere Grenze der untersten Klasse. Werte unter dieser Schranke werden " "in keiner Klasse mitgezählt." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "Bis:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "Die obere Grenze der obersten Klasse. Werte über dieser Schranke werden in " "keiner Klasse mitgezählt." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Anzahl Kla&ssen:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Die Anzahl der Klassen im Histogramm." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Setzt die obere und untere Grenze und die Anzahl der Klassen auf vernünftige " "Werte." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "A&utomatische Klassen" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Automatische Klassen in &Echtzeit" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalisierung der Y-Achse" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "" "Die Y-Achse des Histogramms zeigt den Bruchteil der Messwerte in der " "jeweiligen Klasse." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Bruchteil pro Klasse" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "" "Die Y-Achse des Histogramms zeigt die Anzahl der Messwerte in der jeweiligen " "Klasse." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "A&nzahl pro Klasse" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "Die Y-Achse des Histogramms wird so normalisiert, dass die höchste Klasse 1 " "ist." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Höchstwert-Klasse = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "Die Y-Achse des Histogramms zeigt den prozentualen Anteil der Messwerte in " "der jeweiligen Klasse." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Prozent pro Klasse" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Bild" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Bild bearbeiten" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Neues Bild" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Bildinhalte" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matrix:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Bildtyp" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "F&arbkarte" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "K&onturkarte" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Farb- und Kontur&karte" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Farbkartenparameter" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&Oberer:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Grenzwert - &Unterer:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Intelligent" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Perzent&il:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Automatische Schwellwerte in &Echtzeit" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Konturkartenparameter" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Fa&rbe:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Anzahl &der Konturstufen:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "Ge&wichtung:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "&Variable Linienstärke verwenden" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Beschriftungsdialog erstellen" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Dialog" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Position zu Daten sperren" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Rechts" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Links" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Referenzpunkt:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Fett" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " Punkte" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Schrift&familie:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Farbe" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "&Schriftgröße:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Als Standard speichern" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Position zu Daten sperren" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Rechts" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Links" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Referenzpunkt der Beschriftung:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Drehung" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Position" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Beschriftung" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Beschriftung erstellen" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Eigenschaften" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Größe/Position" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Eigenschaften der Beschriftung" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "Die Syntax für Beschriftungen ist von einer Untermenge von LaTeX " "abgeleitet.\n" "Unterstützt werden:

\\[griechischer Buchstabe] und " "\\[Griechischer Buchstabe], \\approx, \\cdot, \\ge, " "\\geq, \\inf, \\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{Farbe}{farbiger Text}, \\textbf{fetter Text}, " "\\textit{kursiver Text}, \\t, \\sum, \\sqrt, " "\\underline{unterstrichener Text}, x^y, x_y.

\n" "Skalare, Vektorelemente und Gleichungen können wie folgt eingebettet werden:" "
\n" "Skalar: [V1/Mean].
\n" "Vektorelement: [V1[4]].
\n" "Gleichung: [=[V1/Mean]^2].

\n" "Eine eckige Klammer ([) kann als \\[ eingefügt werden." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "&Schriftgröße:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Schrift&familie:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Fett" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " Punkte" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Beschriftungen" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "&Standard-Schriftgröße für Plot:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "Punkte" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Zahlenachsen automatisch skalieren" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Obere Beschrif&tung:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automatisch" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "U&ntere Beschriftung:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Linke Beschriftung:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "&Rechte Beschriftung:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Le&gende anzeigen" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "&Bearbeiten" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Unterstützt Skalare & Zeichenketten (Namen in eckigen Klammern) - z. B. " "[INDEX:Max (X2)],\n" "Eingebettete Gleichungen - z. B. [=[INDEX:Max] / 2]\n" "und LaTeX-Symbole - z. B. \\theta. Namen und Symbole werden automatisch " "vervollständigt." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Layoutfeld" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Layout" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Waa&gerechter Rand:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Sen&krechter Rand:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Waagerechte Ab&stände:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Senkrech&te Abstände:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Legende" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 zu %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Leere Legende" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Inhalte:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Legende" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "In Listen-Reihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "In Listen-Reihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Titel:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Automatisch Plot-basierte Inhalte verwenden" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Sen&krecht anzeigen" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "&Verfügbare Objekte:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Angezeigte Objekte:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "In Plot-Reihenfolge nach vorne: Alt+Pfeil aufwärts" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Pfeil aufwärts" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Entfernen: Alt+R" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Auswählen: Alt+S" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "In Plot-Reihenfolge nach hinten: Alt+Pfeil abwärts" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Pfeil abwärts" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Schriftarten-Einstellungen für Legenden" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Schrift&größe:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " Punkte" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Fett" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "Schrift&familie" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Position zu Daten sperren" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "Linienbearbeitung" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "" "Fehler beim Erstellen des Linienbearbeitungs-Objekts aus der Kst-Datei." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Linie" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Verschieben" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Größe ändern" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Fehler beim Erstellen des Linienobjekts aus der Kst-Datei." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Linie erstellen" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Größe/Position" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Skript: Wird ausgeführt" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Skript: Beendet" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Skript: Rückgabewert %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Skriptfehler: Start fehlgeschlagen" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Skriptfehler: Abgestürzt" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Skriptfehler:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Einen Protokolleintrag erstellen" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Skript e&rneut ausführen" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Skript:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Anwenden" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "S&chließen" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Nachricht" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Nachricht:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Leeren" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Skriptausgabe:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Einrichtung" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Plot-Eigenschaften" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Breite:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Breite und Seitenverhältnis beibehalten" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Höhe und Seitenverhältnis beibehalten" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Breite und Höhe" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Größe des Quadrats" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Höhe:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Höhe des Bildes in Pixeln." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "Datei&format:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "An&geben:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Breite des Bildes in Pixeln." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Lokaler Protokollordner:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Skript:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Die Variablen $user, $imagefile und $messagefile können in der Argumentliste " "verwendet werden." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "Ben&utzername:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Eingabeaufforderung zum Speichern" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Ihr Dokument wurde geändert.\n" "Möchten Sie die Änderungen speichern?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Datei speichern" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Kst-Sitzungen (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Datei öffnen" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "Ni&cht vorhandenen Dateien aufräumen" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Weitere Informationen siehe Hilfe->Fehlersuchdialog->Protokoll" #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Fehler beim Öffnen des Dokuments:\n" " „%1“\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Öffnen..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Öffnet eine neue Sitzung" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Strg+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Speichern" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Speichert die aktuelle Sitzung" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Strg+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Speichern &unter ..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "&Neue Sitzung" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Schließt die aktive Sitzung und öffnet eine neue leere Sitzung" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Alle &Datenquellen neu laden" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Lädt alle Datenquellen erneut" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Drucken ..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Druckt die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "Als Bild &exportieren ..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exportiert die Grafiken zur Festplatte" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "&Vektoren auf Festplatte speichern ..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exportiert Vektoren in eine ASCII-Datei" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Protoko&lleintrag ..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Fügt einen Protokolleintrag hinzu" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "Neues &Unterfenster" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Erstellt ein neues Unterfenster" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Unterfenster sch&ließen" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Schließt das aktuelle Unterfenster" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Beenden" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Strg+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Beendet die Anwendung" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Strg+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Strg+Umschalt+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vektoren" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Zeigt alle Vektoren in einer Tabelle" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Skalare" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Zeigt alle Skalare in einer Tabelle" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrizen" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Zeigt alle Matrizen in einer Tabelle" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "Zeichenke&tten" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Zeigt alle Zeichenketten in einer Tabelle" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Einen &Bildschirm zurück" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Einen Bildschirm zurück" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "Einen Bildschirm &vorwärts" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Einen Bildschirm vorwärts" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Vom Ende zählen" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Mit dieser Einstellung zählen alle Datenvektoren vom Endmodus" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Zum Ende lesen" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Mit dieser Einstellung lesen alle Datenvektoren zum Endmodus" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Anhalten" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Schaltet die Aktualisierung von Datenquellen ein oder aus" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Datenabta&stbereich ändern ..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Zeigt den Dialog „Datenabtastbereich ändern“ von Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Plot" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Erstellt einen Plot für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Skalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vektor" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matrix" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Zeic&henkette" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Kurve" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Gleichung" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Leis&tungsspektrum" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histogramm" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "B&ild" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spektr&ogramm" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Ereig&nismonitor" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Beschriftung" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Erstellt eine Beschriftung für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Rechteck" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Erstellt ein Rechteck für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Kreis" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Erstellt einen Kreis für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Ellipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Erstellt eine Ellipse für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Linie" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Erstellt eine Linie für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Pfeil" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Erstellt einen Pfeil für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Bild" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Erstellt ein Bild für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Erstellt eine SVG-Grafik für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "Gemeinsames &Achsenfeld" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Erstellt ein gemeinsames Achsenfeld für die aktuelle Ansicht" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Verbundenen Zoom ein-/ausschal&ten" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Schaltet den verbundenen Zoom der aktuellen Ansicht um" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Verbinden über &alle Unterfenster" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Verbundener Zoom wird zwischen Unterfenstern angewendet" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "Datenpunkte &hervorheben" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Hebt den nächstgelegenen Datenpunkt hervor" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "X-Y &Zoom/Rollen" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Willkürlicher Zoom in X- oder Y-Richtung" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Zoom nur &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoom nur in X-Richtung" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Zoom nur &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "&Layout-Modus" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Schaltet den Layout-Modus der aktuellen Ansicht um" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "Date&nverwaltung" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Zeigt das Datenverwaltungsfenster für Kst an" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "&Datenassistent" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Datenassistent von Kst anzeigen" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Da&tendatei ändern" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Zeigt den Dialog „Datendatei ändern“ von Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Kurven&farbe pro Datei zuweisen " #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Farbauswahldialog von Kst anzeigen" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Kurven untersche&iden" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Zeigt den Dialog „Kurven unterscheiden“ von Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "Kst &einrichten" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Öffnet den Einrichtungsdialog für Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Design" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Öffnet den Designdialog für Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Fehlersuch&dialog" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Öffnet den Fehlersuchdialog für Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Assistenten zum &Berichten von Fehlern und Wünschen" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Öffnet den Assistenten zum &Berichten von Fehlern und Wünschen für Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "Ü&ber" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Zeigt Informationen über Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Datei" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Zuletzt &geöffnete Sitzungen" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Zuletzt geö&ffnete Datendateien" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Bearbeiten" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Ansicht" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "&Bereich" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Erstellen" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Standardmodu&l" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Einpass&ungs-Modul" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Fil&termodul" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Anmerkung" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Modus" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Interaktionsmodus" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "E&xtras" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "&Einstellungen" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Hilfe" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Datei" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Bearbeiten" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Extras" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Datenbereich" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Modus" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Plot-Layout" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Erweitertes Layout" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Fertig" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Markierungen" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Durchgezogene Linie" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Gestrichelte Linie" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Gepunktete Linie" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Strich-Punkt-Linie" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Strich-Punkt-Punkt-Linie" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Benutzerdefinierte gestrichelte Linie" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "" "Eine Plot-Markierung mit gleichem oder annähernd gleichem Wert existiert " "bereits." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "Der eingegebene Text ist keine gültige Zahl." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Achsen-Markierungen" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Neuer Markierungspunkt: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Hinzufügen" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Akt&uelle Markierungen" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Leeren" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Entfernen" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Erscheinungsbild der Markierungen" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "L&inienstil:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "&Linienfarbe:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Linien&breite:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Automatische Markierungen" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Kurve al&s Markierungsquelle verwenden:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Markierungen erstellen auf:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Anste&igender Flanke" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "Abfallender &Flanke" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "&Beides" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "&Vektor als Markierungsquelle verwenden:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matrix" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Matrix bearbeiten" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Neue Matrix" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Skalierung und Translation" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "X-Schritt&weite:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X-Minimum:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y-Minimum:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Y-Schri&ttweite:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Verlaufsparameter" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Z-Werte erhöhen/erniedrigen entlang:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "X-Achse" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Y-Achse" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z am Minimum:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "X-Schritte:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Y-Schritte:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z am Maximum:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Datenbereich" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "oder" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Anfan&gsrahmen für Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "Rahmenanzahl f&ür X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "V&om Ende zählen" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Zum Ende lesen" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Rahmenanzahl f&ür Y" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Zum &Ende lesen" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Vom En&de zählen" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Anfang&srahmen für X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " Rahmen" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Boxcar-&Filter zuerst" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "&1 Messwert einlesen pro" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Quelle" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Aus der Datenquelle lesen" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Verlauf erzeugen" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Datenquellenparameter" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "F&eld oder Spalte:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Dateiname:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Einr&ichten..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB verfügbar" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "&Schriftgröße:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Schrift&familie:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "Standardschrift für Plot ben&utzen" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " Punkte" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Bild" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Bild öffnen" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Fehler beim Erstellen des Bildobjekts aus der Kst-Datei." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Bild erstellen" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Jahre]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Tage]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Stunden]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minuten]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Sekunden]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Plot" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom auf &Maximum" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom auf Maximum (unempfindlich für Spitzen)" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Vorherige Größe" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Verbundener Zoom" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Verbundener X Zoom" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Verbundener Y Zoom" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom Y auf Mitte zentriert" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "X-Zoom auf Maximum" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "X-Zoom auf automatischen Rahmen" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "X-Zoom unempfindlich für Spitzen" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "X-Zoom rechts" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "X-Zoom links" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "X-Achse verkleinern" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "X-Achse vergrößern" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "X-Achse zu Y-Achse normalisieren" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "X-Achse logarithmisch" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Y-Zoom auf lokales Maximum" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Y-Zoom auf Maximum" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Y-Zoom auf automatischen Rahmen" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Y-Zoom unempfindlich für Spitzen" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Y-Zoom nach oben" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Y-Zoom nach unten" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Y-Achse verkleinern" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Y-Achse vergrößern" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Y-Achse zu X-Achse normalisieren" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Y-Achse logarithmisch" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Farbskala des Bilds anpassen" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Plot maximieren" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Gemeinsame Plots auf X-Achse" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Gemeinsame Plots auf Y-Achse" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Gemeinsames Achsenfeld auflösen" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Koordinaten kopieren" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "X-Koordinate kopieren" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Y-Koordinate kopieren" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Kopieren" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filter" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Kurve bearbeiten" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Anpassen" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Einstellungen für Gemeinsames Achsenfeld" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Information, die in die Zwischenablage kopiert wurde: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "X-Koordinate, die in die Zwischenablage kopiert wurde: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Y-Koordinate, die in die Zwischenablage kopiert wurde: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Plot: %1 \n" "Inhalte:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Leerer Plot" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Fehler beim Erstellen des Plotobjekts aus der Kst-Datei." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Plot erstellen" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Plot für Kurve erstellen" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Zoom fester Ausdruck" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Zoom Ausdruck für X-Bereich" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom auf Maximum" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom auf Maximum (unempfindlich für Spitzen)" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom auf Mitte zentriert" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "X-Zoom auf Mitte zentriert" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Y-Zoom auf Mitte zentriert" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom auf X-Maximum" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom X auf automatischen Rahmen" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom X unempfindlich für Spitzen" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "X nach rechts rollen" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "X nach links rollen" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "X verkleinern" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "X vergrößern" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom X zu Y normalisiert" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Y-Zoom auf lokales Maximum" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Y-Zoom auf Maximum" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom Y auf automatischen Rahmen" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom Y unempfindlich für Spitzen" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom Y nach oben" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom Y nach unten" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Y verkleinern" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Y vergrößern" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom Y zu X normalisiert" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X Logarithmisch" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y Logarithmisch" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Plot-Element bearbeiten" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Inhalte" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Obere Schriftart" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Untere Schriftart" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Linke Schriftart" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Rechte Schriftart" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Achsenschriftart" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Beschriftungen" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Bereich/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "X-Achse" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Y-Achse" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "X-Achsen-Markierungen" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Y-Achsen-Markierungen" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Obere Schriftart*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Untere Schriftart*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Linke Schriftart*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Rechte Schriftart*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Achsenschriftart*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Plot rendern" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Referenz-Modus" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 zu %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Leistungsspektrum" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Leistungsspektrum bearbeiten" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Neues Leistungsspektrum" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Leistungsspektrum-Inhalte" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Datenvekto&r:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Name" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Wert" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Bereich" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "X-Zoom-Modus" #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&utomatisch" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Automatisch mit &Rahmen" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Automatisch, für S&pitzen unempfindlich" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "Mitte z&entriert, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "B&ereich: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&est, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "Vo&n: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "B&is: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "Sollte ausgeblendet sein" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Y-Zoom-Modus" #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Automatisch" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Automatisch mit &Rahmen" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Automatisch, für S&pitzen unempfindlich" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Mitte z&entriert, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "Be&reich: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fest, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "V&on: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&Bis:" #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Skalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Skalar bearbeiten" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Neuer Skalar" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Aus der Datenquelle le&sen" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Einen neuen Vektor mit den Eigenschaften für die unabhängige Variable " "erzeugen, die hier gegeben sind." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Aus Daten&vektor lesen" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Generieren" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Aus der Datenquelle lesen" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Dateiname:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Feld:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Ein&richten ..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "&Rahmen:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "oder" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Wählen Sie dies aus, damit die Daten vom Ende der Datei eingelesen werden. " "Dies ist hilfreich, um den Bildschirm weiterzurollen, wenn an die Datei " "durch ein anderes Programm angehängt wird." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&Letzter Rahmen" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Generieren" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "W&ert: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Der maximale Wert der unabhängigen Variable." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Name" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Typ" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Messpunkte" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Eigenschaften" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Gemeinsames Achsenfeld" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Gemeinsames Achsenfeld auflösen" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Fehler beim Erstellen des Objekts für ein gemeinsames Achsenfeld aus der Kst-" "Datei." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Gemeinsames Achsenfeld erstellen" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Zeichenkette" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Zeichenkette bearbeiten" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Neue Zeichenkette" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Aus der Datenquelle le&sen" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "&Dateiname:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "F&eld:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Einr&ichten ..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Generieren" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Wert: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Strich" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Kein Stift" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Durchgezogene Linie" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Gestrichelte Linie" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Gepunktete Linie" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Strich-Punkt-Linie" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Strich-Punkt-Punkt-Linie" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Benutzerdefinierte gestrichelte Linie" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Kein Pinsel" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Einfarbiges Muster" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Dichtemuster 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Dichtemuster 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Dichtemuster 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Dichtemuster 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Dichtemuster 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Dichtemuster 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Dichtemuster 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Waagerechtes Muster" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Senkrechtes Muster" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Kreuzmuster" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Diagonalmuster 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Diagonalmuster 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Diagonales Kreuzmuster" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Gehrungsverbindung" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Fasenverbindung" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Runde Verbindung" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "SVG-Gehrungsverbindung" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Flaches Ende" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Eckiges Ende" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Rundes Ende" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Stil:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Breite:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Pinsel&farbe:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "&Pinselstil:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Verb&indungsstil:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "En&dstil:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: SVG-Bild öffnen" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Fehler beim Erstellen des SVG-Objekts aus der Kst-Datei." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "SVG erstellen" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Ansicht &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Unterfenster umbenennen" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Geben Sie einen neuen Unterfensternamen an:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Unterfenster hinzufügen" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "Unter&fenster umbenennen" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Unterfenster sch&ließen" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "Ansicht b&earbeiten" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Layout aufräumen" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Benutzerdefiniert" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Design" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Füllen" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Strich" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Schriftarten" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "&Schriftgröße:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Schrift&familie:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Kursiv" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Fett" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " Punkte" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Als Standard speichern" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Auf vorhandene Objekte anwenden" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vektor" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Zeitintervall" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Erkennung ändern" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Keine Aktualisierung" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Vektor bearbeiten" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Neuer Vektor" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Generieren" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "A&nzahl der Messwerte:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Die Anzahl der Messwerte der neuen unabhängigen Variablen." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "Vo&n:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Der minimale Wert der unabhängigen Variable." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&Bis:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Der maximale Wert der unabhängigen Variable." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Aus der &Datenquelle lesen" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Dateiname:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "F&eld oder Spalte:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Verbinden" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Einr&ichten ..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Aktualisierungstyp: Benutzen Sie „Zeitintervall“ für nicht lokale Daten." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Bearbeiten" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Layout schützen" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Benutzerdefiniert" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Spalten-Layout" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout in Spalten in der Reihenfolge der Erstellung.\n" "Wählen Sie die Anzahl der Spalten:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Layout aufräumen" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Ansichtsmenü" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Ansicht bearbeiten" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Füllen" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Bearbeiten" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Löschen" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Nach vorne" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Nach hinten" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automatisch" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Layout schützen" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Spalten" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "&Position zu Daten sperren" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Spalten-Layout" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Layout in Spalten in der Reihenfolge der Erstellung.\n" "Wählen Sie die Anzahl der Spalten:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menü %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Layout aufräumen" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Verschieben" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Größe ändern" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Skalieren" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Drehen" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Layout erstellen" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Element zum Layout anhängen" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Verschieben" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Größe ändern" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Entfernen" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Nach vorne" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Nach hinten" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Skalieren" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Drehen" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Ansichtseintrag bearbeiten" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Name:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Mehrere bearbeiten >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Erscheinungsbild" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Größe/Position" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Eins bearbeiten" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Matrix-Ansicht" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Z&eichenketten-Werte anzeigen" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Skalar-Werte anzeigen" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Einfache Ansicht" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Aktualisieren" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Vektoren zur Anzeige auswählen" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Ausgewählten Vektor(en) anzeigen" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Ausgewählte Vektor(en) aus der Ansicht entfernen" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Entfernen" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Signifikante Stellen" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Als Ganzzahl anzeigen" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (Standard)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Vektor-Werte anzeigen" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Vektorliste anzeigen" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Vektorliste ausblenden" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Ansicht zurücksetzen" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Schließen" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Es ist ein Fehler im Algorithmus %1 aufgetreten." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Modul: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Fehler: Das Datenobjekt kann nicht vom Modul erstellt werden" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Fehler: Das Modul für das Datenobjekt wurde nicht gefunden" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Fehler beim Erstellen des Modulobjekts aus der Kst-Datei." #: ../src/libkstmath/csd.cpp:130 #, fuzzy #| msgctxt "Kst::CSD|" #| msgid "Could not allocate sufficient memory for CSD." msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "" "Es konnte nicht genügend Speicher für das Kumulierte Dämpfungsspektrum " "reserviert werden." #: ../src/libkstmath/csd.cpp:195 #, fuzzy, qt-format #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spektr&ogramm" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Spektrale Amplitudendichte" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Spektrale Leistungsdichte" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Amplitudenspektrum" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Leistungsspektrum" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Frequenz" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Zeit" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spektrogramm: %1\n" " FFT-Länge: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Durchschnitt; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apodisieren; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Mittel abziehen;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/libkstmath/csdfactory.cpp:71 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating vector from Kst file." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Fehler beim Erstellen des Vektors aus der Kst-Datei." #: ../src/libkstmath/csdfactory.cpp:88 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating Histogram from Kst file. Could not find Vector." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Fehler beim Erstellen des Histogramms aus der Kst-Datei. Der Vektor wurde " "nicht gefunden." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Kurve" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 zu %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 gegen %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Kurve: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ Fehler: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- Fehler: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ Fehler: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- Fehler: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Zeile: Breite %1 und Stil %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punkte: Stil %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Balken" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Fehler beim Erstellen der Kurve aus der Kst-Datei." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Fehler beim Erstellen der Kurve aus der Kst-Datei. X-Vektor wurde nicht " "gefunden." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Fehler beim Erstellen der Kurve aus der Kst-Datei. Y-Vektor wurde nicht " "gefunden." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Suche nach Datenobjekt-Modulen." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- dies ist wahrscheinlich ein Fehler. Bitte senden Sie " "eine E-Mail mit den Details an kst@kde.org." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "Die Gleichung enthält ein unbekanntes Objekt [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Gleichungskurve" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "Gleichung [%1] konnte seine Vektoren beim erneuten Einlesen nicht finden." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Gleichung [%1] konnte seine Vektoren beim Speichern nicht finden. Die " "ausgegebene Kst_Datei ist möglicherweise fehlerhaft." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Gleichung [%1] verweist auf nicht existierende Objekte." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "" "Gleichung [%1] konnte nicht verarbeitet werden. Fehlermeldungen folgen." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Verarbeitungsfehler: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Gleichung: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Fehler beim Erstellen der Gleichung aus der Kst-Datei." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Fehler beim Erstellen der Gleichung aus der Kst-Datei.X-Vektor wurde nicht " "gefunden." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "Ereignis" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Ereignis: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Fehler beim Erstellen des Ereignismonitor-Eintrags aus der Kst-Datei." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Zahl" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Prozent" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Bruch" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Normalisierte Frequenz" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogramm von %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogramm: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" "Automatische Klassen" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 Klassen von %2 bis %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Fehler beim Erstellen des Histogramms aus der Kst-Datei." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Fehler beim Erstellen des Histogramms aus der Kst-Datei. Der Vektor wurde " "nicht gefunden." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Bild von %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Bild: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Fehler beim Erstellen des Bilds aus der Kst-Datei." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Fehler beim Erstellen des Bilds aus der Kst-Datei. Matrix wurde nicht " "gefunden." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Julianisches Jahr" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Standard-C-Zeit" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Julianischer Datum" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Geändertes Julianisches Datum" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Reduziertes Julianisches Datum" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Internationale Atomzeit (TAI = Temps Atomique International)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Excel-Zeit (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "JJJJ/MM/TT HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "TT/MM/JJJJ HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Formatierte Zeichenkette" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "SLD-Kurve" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "" "Es wurde versucht, ein SLD (spektrale Leistungsdichte) zu erzeugen, das den " "ganzen Speicher gebraucht hat." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "SLD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Spektrale Dichte" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "SLD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Amplitudenspektrum" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Leistungsspektrum" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Frequenz" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Spektrum: %1\n" " FFT-Länge: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Durchschnitt; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apodisieren; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Mittel abziehen;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "In PSDCalculator::calculatePowerSpectrum: Ausgabedatenfeld hat die falsche " "Größe." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Fehler beim Erstellen der SLD aus der Kst-Datei." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "" "Fehler beim Erstellen der SLD aus der Kst-Datei. Der Vektor wurde nicht " "gefunden." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Aktivitätsstufe %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Aktivitätsstufe" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Aktivitätsstufe: %1\n" " Stichproben-Zeit: %2 (s)\n" " Fensterbreite: %3 (s)\n" " Rausch-Grenzwert: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Fehler: Der Eingabe-Vektor ist zu kurz." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Fehler: Das Fenster muss breiter sein." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Aktivitätsstufe" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Stichproben-Zeit (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Fensterbreite (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Rausch-Grenzwert" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Klassen-Modulobjekt" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Fehler: Keine Klassen" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Klasse" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Teilt Daten in Klassen mit vorgegebener Größe ein. Jede Klasse enthält den " "Mittelwert der Elemente, die ihr angehören." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Klassengröße" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Teilungs-Modulobjekt" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Teilung" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Teilt die gegebenen Daten in gerade, ungerade, Differenz- und " "Indexdatenmengen." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fehler: Ungültige Eingabelänge berechnet" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Faltung" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Erzeugt die Faltung eines Vektors mit einem anderen." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Eingabe-Vektor Eins" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Eingabe-Vektor Zwei" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Dekonvolutions-Modulobjekt" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Fehler: Ungültige Eingabelänge berechnet" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Entfaltung" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Erzeugt die Entfaltung eines Vektors mit einem anderen." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Eingabe-Vektor Eins" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Eingabe-Vektor Zwei" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Autokorrelation-Modulobjekt" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fehler: Ungültige Eingabelänge berechnet" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Autokorrelation" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Erzeugt die Autokorrelation eines Vektors." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Kreuzkorrelation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Fehler: Ungültige Eingabelänge berechnet" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Kreuzkorrelation" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Erzeugt die Kreuzkorrelation eines Vektors mit einem anderen." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Eingabe-Vektor Eins" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Eingabe-Vektor Zwei" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Kreuzspektrum-Modulobjekt" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Kreuzspektrum-Datenobjekt-Modul" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "" "Erzeugt das Kreuzleistungsdichtespektrum eines Vektors mit einem anderen." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Eingabe-Vektor Eins" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Eingabe-Vektor Zwei" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "FFT-Länge = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Abtastrate" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Modulobjekt für effektive Bandbreite" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Fehler: Ungültige X-Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "" "Fehler: Eingabe-Vektor X und Eingabe-Vektor Y haben nicht die gleiche Länge" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Fehler: Die berechneten Indizes sind ungültig" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Effektive Bandbreite" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Berechnet die effektive Bandbreite aus einem Amplitudenspektrum." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Min. Frequenz für Weißes Rauschen" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Stichproben-Frequenz (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Allgemeines Filtermodulobjekt" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Fehler: Nenner in der Zeichenkette ist leer" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Fehler: Zähler in der Zeichenkette ist leer" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Allgemeiner Filter" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Erzeugt einen diskreten Filter aus einer stetigen Zeitdefinition." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Stichproben-Intervall (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Zähler (aufsteigende Reihenfolge)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Nenner (absteigende Reihenfolge)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Interpolations-Modulobjekt nach Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Spline-Interpolation nach Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Erzeugt eine nicht gerundete Akima-Interpolation für einen Datensatz." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Periodisches Interpolations-Modulobjekt nach Akima" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Periodische Spline-Interpolation nach Akima" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Erzeugt eine nicht gerundete periodische Akima-Interpolation für einen " "Datensatz." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Periodische kubische Spline-Interpolation" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Erzeugt eine kubische Spline-Interpolation für einen Datensatz." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Erzeugt eine kubische Spline-Interpolation für einen Datensatz." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Lineares Interpolations-Modulobjekt" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Lineare Spline-Interpolation" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Erzeugt eine lineare Interpolation für einen Datensatz." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Erzeugt eine Interpolation durch ein Polynom für den Datensatz." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Eingabe-Vektor X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Fit Pl&ugin" msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Einpass&ungs-Modul" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Fehler: Ungültige Y-Länge des Eingabe-Vektors" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Fehler: Ungültige X-Länge des Eingabe-Vektors" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 #, fuzzy #| msgctxt "Kst::DifferentiateCurvesDialog|" #| msgid "Line Width" msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Linienbreite" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Erzeugt eine lineare beste Anpassung für einen Datensatz." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Referenz-Vektor" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Gauß'sches Rauschen" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Fügt der Datenmenge Gauß'sches Rauschen mit einer angegeben " "Standardabweichung hinzu." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Wellenschaubild-Modulobjekt" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fehler: Längen des Eingabe-Vektors stimmen nicht überein" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Wellenschaubild" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Eingabe-Vektorzeit" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Eingabe-Vektordaten" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Überabtastungs-Faktor" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Durchschnittlicher Nyquist-Frequenzfaktor" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Phasen-Modulobjekt" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Fehler: Längen des Eingabe-Vektors stimmen nicht überein." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Phase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Eingabe-Vektorzeit" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Eingabe-Vektordaten" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Schwingungszeit" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Nullphase" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Verschiebungs-Modulobjekt" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Verschiebung: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Verschiebung" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Verschiebt und schneidet einen Vektor ab." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Verschiebungswert (# Punkte, negative Werte zulässig)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Statistik %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Fehler: Ungültige Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statistik" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Berechnet Statistiken für eine Datenmenge." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Eingabe-Vektor" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Fehler: Ungültige X-Größe des Eingabe-Vektors" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Fehler: Längen des Eingabe-Vektors stimmen nicht überein" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Fehler: Es sind mindestens 2 Klassen erforderlich" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Addiert den Vektor Y synchron in Skalareingabe-Klassen, die durch den Vektor " "X definiert sind. Wie eine eindimensionale Abbildung." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Eingabe-Vektor X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Eingabe-Vektor Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Anzahl der Klassen" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X-Min" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X-Max" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Bandpass %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Gefiltert %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Bandpassfilter" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Eingabe-Vektor - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Filterreihenfolge:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Mittenfrequenz / Abtastrate" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Bandbreite:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Bandstopp %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Gefiltert %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Bandstoppfilter" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Eingabe-Vektor:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Filterreihenfolge:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Mittenfrequenz / Abtastrate" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Bandbreite:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Hochpass %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Gefiltert %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Hochpassfilter" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Eingabe-Vektor:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Filterreihenfolge:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Grenzfrequenz / Abtastrate" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Tiefpass %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Gefiltert %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Tiefpassfilter" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Eingabe-Vektor:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Filterreihenfolge:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Grenzfrequenz / Abtastrate" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Kumulierter Durchschnitt %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Kumulierter Durchschnitt" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Kumulierter Durchschnitt: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Kumulierter Durchschnitt" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Berechnet den kumulierten Durchschnitt des Eingabe-Vektors." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Integral %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Integral" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Kumulierte Summe" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Berechnet die kumulierte Summe (Integral) des Eingabe-Vektors." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Schritt (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, fuzzy, qt-format #| msgctxt "FilterDespikeSource|" #| msgid "Despiked %1" msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "Messspitzen entfernt %1" #: ../src/plugins/filters/despike/filterdespike.cpp:144 #, fuzzy #| msgctxt "FilterDespikeSource|" #| msgid "Despiked %1" msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Messspitzen entfernt %1" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Messspitzen-Filter: %1\n" " Abstand: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Messspitzen entfernt %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Messspitzen-Filter" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Findet und entfernt Messspitzen mit Hilfe einer 3-Punktdifferenz." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Eingabe-Vektor:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Abstand:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Ableitung %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Ableitung" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Ableitung: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "" #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Ableitung mit fester Schrittweite" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Berechnet die diskrete Ableitung eines Eingabe-Vektors." #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Schritt (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Abwicklung %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Abwicklung" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Abwicklungs-Filter: %1\n" " %2 - %3\n" " Schritt: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Eingabe: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Abwicklung %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Abwicklungs-Filter" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Eingabe-Vektor:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maximum:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Max Schritt (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Ungewichtete Exponentialkurve %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentialkurven-Anpassung auf %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Exponentialkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponentialkurven-Anpassung" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Erzeugt eine Exponentialkurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Gewichtete Exponentialkurve %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponentialkurven-Anpassung auf %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Exponentialkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Gewichtete Exponentialkurven-Anpassung" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "" "Erzeugt eine gewichtete Exponentialkurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichtung:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Ungewichtete Gaußkurve %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaußkurven-Anpassung auf %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Gaußkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaußkurven-Anpassung" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Erzeugt eine Gaußkurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Gewichtete Gaußkurve %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaußkurven-Anpassung auf %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Gaußkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Gaußkurven-Anpassung" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Erzeugt eine gewichtete Gaußkurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichtung:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr " Ungewichteter Verlauf %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Verlaufs-Anpassung auf %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Verlaufs-Anpassung auf Restwerte" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Verlaufs-Anpassung unterer Grenzwert" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Verlaufs-Anpassung oberer Grenzwert" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Verlaufs-Anpassung" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Erzeugt eine Verlaufs-Anpassung für einen Datensatz." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Gewichteter Verlauf %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Verlaufs-Anpassung auf %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Verlaufs-Anpassung auf Restwerte" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Verlaufs-Anpassung unterer Grenzwert" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Verlaufs-Anpassung oberer Grenzwert" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Gewichtete Verlaufs-Anpassung" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Erzeugt eine gewichtete Verlaufs-Anpassung für einen Datensatz." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Gewichtung:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Grenzfrequenz-Anpassungs-Modul" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Fehler: Größen des Eingabe-Vektors stimmen nicht überein" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Fehler: Der Eingabe-Vektor X ist ungültig" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Fehler: Der Eingabe-Frequenzen sind ungültig\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Fehler: Die Eingabe-Daten sind ungültig\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Grenzfrequenz-Anpassung" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Erzeugt eine lineare Grenzfrequenz-Anpassung für einen Datensatz." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Eingabe-Vektor - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Eingabe-Vektor - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Eingabe-Skalar - Max. 1/f^a Frequenz" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Eingabe-Skalar - Min. Frequenz für Weißes Rauschen" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Eingabe-Skalar - Weißes Rauschen C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, fuzzy, qt-format #| msgctxt "FitLinearUnweightedSource|" #| msgid " Unweighted Linear" msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr " Ungewichtet Linear" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Lineare Anpassung auf %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Lineare Anpassung auf Restwerte" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineare Anpassung unterer Grenzwert" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineare Anpassung oberer Grenzwert" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Lineare Anpassung" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Erzeugt eine lineare Anpassung für einen Datensatz." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitLinearWeightedSource|" #| msgid " Weighted Linear" msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr " Gewichtet Linear" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Lineare Anpassung auf %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Lineare Anpassung auf Restwerte" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineare Anpassung unterer Grenzwert" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineare Anpassung oberer Grenzwert" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Gewichtete lineare Anpassung" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Erzeugt eine gewichtete lineare Anpassung für einen Datensatz." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Eingabe-Vektor - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Eingabe-Vektor - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Eingabe-Vektor - Gewichtungen" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Lorentzkurve %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzkurven-Anpassung auf %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Lorentzkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Lorentzkurven-Anpassung" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Erzeugt eine gewichtete Anpassung für einen Datensatz." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Gewichtete Lorentzkurve %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Lorentzkurven-Anpassung auf %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Lorentzkurven-Anpassung auf Restwerte" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Gewichtete Lorentzkurven-Anpassung" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Erzeugt eine gewichtete Lorentzkurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Eingabe-Vektor - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Eingabe-Vektor - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Eingabe-Vektor - Gewichtungen" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Polynom %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynom-Anpassung auf %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Polynom-Anpassung auf Restwerte" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Polynom-Anpassung" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Erzeugt eine Polynom-Anpassung für einen Datensatz." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Reihenfolge:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Gewichtetes Polynom %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Polynom-Anpassung auf %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Polynom-Anpassung auf Restwerte" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Gewichtete Polynom-Anpassung" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Erzeugt eine gewichtete Polynom-Anpassung für einen Datensatz." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Eingabe-Vektor - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Eingabe-Vektor - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Eingabe-Vektor - Gewichtungen" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Eingabe-Skalar - Reihenfolge" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Sinuskurve %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinuskurven-Anpassung auf %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Sinuskurven-Anpassung auf Restwerte" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Sinuskurven-Anpassung" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Erzeugt eine Sinuskurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Oberschwingung:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Schwingungszeit:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Gewichtete Sinuskurve %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinuskurven-Anpassung auf %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Sinuskurven-Anpassung auf Restwerte" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Gewichtete Sinuskurven-Anpassung" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Erzeugt eine gewichtete Sinuskurven-Anpassung für einen Datensatz." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Eingabe-Vektor - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Eingabe-Vektor - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Eingabe-Vektor - Gewichtungen" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Eingabe-Skalar - Harmonisch" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Eingabe-Skalar - Schwingungszeit" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Beispiel-Eingabe-Vektor" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Neuen &Vektor einfügen" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Neuen &Skalar einfügen" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Bearbeiten" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Neuen &Skalar einfügen" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Neue &Zeichenkette einfügen" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Bearbeiten" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "F&arbpalette:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Erscheinungsbild" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "Ge&wichtung:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Punkttyp" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Falls „Punkte anzeigen“ ausgewählt ist, wird der ausgewählte Punkttyp an " "jedem Datenpunkt gezeichnet." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Linientyp" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Wenn „Linien anzeigen“ aktiviert ist, wird hier der Linienstil eingestellt." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "" "Wählen Sie dies aus, damit Linien zischen Datenpunkten gezeichnet werden." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Linien" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Wählen Sie dies, damit die ausgewählten Punkte an jedem Datenpunkt " "gezeichnet werden." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "Pu&nkte" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Kopf" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "&Balkendiagramm" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Linienstärke" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Wenn „Linien anzeigen“ aktiviert ist, wird hier die Linienstärke eingestellt." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Größe:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "Punkt&dichte:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Alle" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Hoch" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Mittel" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Niedrig" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Platzierung" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Schriftarten skalieren" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "In &neuem Plot platzieren" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "In neue&m Unterfenster" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "Der Name der Datendatei, die für diesen Vektor gelesen wird." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "In &existierendem Plot platzieren " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "In keinem Plot pl&atzieren" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Automatis&ches Layout" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "Benutzerdefiniertes &Gitter" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Spalte&n" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "Vo&rhandenes Layout schützen" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Wählen Sie eine Kurve zur Anwendung." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "Rahmen" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Datenbereich" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Wählen Sie dies aus, um den Durchschnitt der übersprungenen Rahmen zu " "berechnen. Dies bietet eine einfache Tiefpassfilterung." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Boxcar-&Filter zuerst" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Speicher sparen durch nur teilweises Lesen der Daten" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Wählen Sie dies aus, damit Rahmen übersprungen werden, anstatt alle Daten " "einzulesen. Dies ist hilfreich für sehr lange aber sich nur langsam ändernde " "Datendateien." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "&1 Messwert einlesen pro:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "" "Wählen Sie dies aus, damit alle Daten bis zum Ende der Datei eingelesen " "werden. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Zum &Ende lesen" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "oder" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Wählen Sie dies aus, damit die Daten vom Ende der Datei eingelesen werden. " "Dies ist hilfreich, um den Bildschirm weiterzurollen, wenn an die Datei " "durch ein anderes Programm angehängt wird." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "&Vom Ende zählen" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Anzahl der zu überspringenden Rahmen, wenn „1 Messwert pro x Rahmen lesen“ " "ausgewählt ist." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " Rahmen" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Start:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Be&reich:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Geben Sie eine Zahl beginnend von 0 für den ersten Wert ein, oder Datum im " "Format [[[[JJJJ:]MM:]TT:]HH:]MM[.SS]" #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "Der Index der ersten gelesenen Daten. Für ASCII-Dateien ist dies die " "Zeilennummer in der Datei. Für rahmenbasierte Dateien ist dies der erste " "Rahmen." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Die Menge der Daten, die in den Vektor gelesen werden soll. Für ASCII-" "Dateien ist dies die Anzahl der Datenzeilen. Für Rahmendateien kann mehr als " "ein Messwert pro Rahmen vorliegen. Datumsangaben sind im Eingabeformat " "[[[[JJJJ:]MM:]TT:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Die Datei wurde nicht gefunden.\n" "Bitte überprüfen Sie, ob der richtige Name angegeben wurde." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "FFT-Optionen" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Standard" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "Kosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gauss (benutzerdefiniertes Sigma)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "Sigma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Wählen Sie in diesem Auswahlfeld den Quellvektor für den Fehlerbalken der Y-" "Achse der Kurve. Ist „“ ausgewählte, werden keine Fehlerbalken für " "die Y-Achse gezeichnet. Erstellen Sie neue Vektoren auf der Karteikarte " "„Vektor“." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodi&sieren" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ktion:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Mi&ttel abziehen" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "FFT-&Länge: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Setzt die Länge der FFTs bei der Erzeugung des Leistungsspektrums. 2^10 = " "1024, etc. Je größer die Zahl, desto größer ist das Rauschen und die " "Auflösung." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Überlappender &Durchschnitt" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Über Löc&her interpolieren" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "&Abtastrate:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "Die Abtastrate, mit der die Messungen durchgeführt wurden, für richtige " "Normalisierung." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Die neuen Vorgaben für die Datenaufnahme auf die ausgewählten Vektoren " "anwenden." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Vektoreinheiten:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Die Einheiten des Datenvektors - für automatische Beschriftungen." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Einheiten der Abtastrate:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "Die Einheiten der Abtastrate. Wird für die automatischen Beschriftungen " "verwendet." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "A&usgabe:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Spektrale Amplitudendichte (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Spektrale Leistungsdichte (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Amplitudenspektrum (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Leistungsspektrum (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Datei öffnen" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Alle Dateien (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Order der Protokolldatei" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Datei speichern" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Die Syntax für Beschriftungen ist von einer Untermenge von LaTeX " "abgeleitet.\n" "Unterstützt werden:

\\[griechischer Buchstabe] und " "\\[Griechischer Buchstabe], \\approx, \\cdot, \\ge, " "\\geq, \\inf, \\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{Farbe}{farbiger Text}, \\textbf{fetter Text}, " "\\textit{kursiver Text}, \\t, \\sum, \\sqrt, " "\\underline{unterstrichener Text}, \\overline{überstrichener Text}, x^y, x_y.

\n" "Skalare, Vektorelemente und Gleichungen können wie folgt eingebettet werden:" "
\n" "Skalar: [V1/Mean].
\n" "Vektorelement: [V1[4]].
\n" "Gleichung: [=[V1/Mean]^2].

\n" "Eine eckige Klammer ([) kann als \\[ eingefügt werden." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Beschriftungstext Es wird eine Teilmenge von LaTeX unterstützt. Klicken Sie " "auf „Hilfe“ für weitere Informationen." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Unterstützt LaTeX-Symbole, Zeichenketten & Skalare und eingebettete " "Gleichungen." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "Besc&hriftung:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Hilfe" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Die Syntax für Beschriftungen ist von einer Untermenge von LaTeX " "abgeleitet.\n" "Unterstützt werden:

\\[griechischer Buchstabe] und " "\\[Griechischer Buchstabe], \\approx, \\cdot, \\ge, " "\\geq, \\inf, \\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{Farbe}{farbiger Text}, \\textbf{fetter Text}, " "\\textit{kursiver Text}, \\t, \\sum, \\sqrt, " "\\underline{unterstrichener Text}, \\overline{überstrichener Text}, x^y, x_y.

\n" "Skalare, Vektorelemente und Gleichungen können wie folgt eingebettet werden:" "
\n" "Skalar: [V1/Mean].
\n" "Vektorelement: [V1[4]].
\n" "Gleichung: [=[V1/Mean]^2].

\n" "Eine eckige Klammer ([) kann als \\[ eingefügt werden." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "Beschriftungstext. Es wird eine Teilmenge von LaTeX unterstützt. Siehe „Was " "ist das?“-Hilfe" #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Bitte wählen Sie den Vektor aus, der verwendet werden soll. Wenn Sie einen " "neuen Vektor erzeugen möchten, klicken Sie auf das Symbol rechts." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Einen neuen Vektor erzeugen." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Öffnet einen Vektordialog zum Erzeugen eines neuen Vektors, der der " "ausgewählte Vektor wird." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Den ausgewählten Vektor bearbeiten." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Öffnet einen Vektordialog, um den ausgewählten Vektor zu bearbeiten." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Dialog" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Schließen" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Dialog" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Suchen:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Bitte wählen Sie den Skalar aus, der verwendet werden soll. Wenn Sie einen " "neuen Skalar erzeugen möchten, klicken Sie auf das Symbol rechts." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Einen neuen Skalar erzeugen." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Den ausgewählten Skalar bearbeiten." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Bitte wählen Sie die Zeichenkette aus, die verwendet werden soll. Wenn Sie " "eine neue Zeichenkette erzeugen möchten, klicken Sie auf das Symbol rechts." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Eine neue Zeichenkette erzeugen." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Die ausgewählte Zeichenkette bearbeiten." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Bitte wählen Sie den Vektor aus, der verwendet werden soll. Wenn Sie einen " "neuen Vektor erzeugen möchten, klicken Sie auf das Symbol rechts." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Einen neuen Vektor erzeugen" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Öffnet einen Vektordialog zum Erzeugen eines neuen Vektors, der der " "ausgewählte Vektor wird." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Den ausgewählten Vektor bearbeiten." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Öffnet einen Vektordialog, um den ausgewählten Vektor zu bearbeiten." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Kst-Bedienelemente" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Kumuliertes Dämpfungsspektrum" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Kumuliertes Dämpfungsspektrum bearbeiten" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Neues kumuliertes Dämpfungsspektrum" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "Kumuliertes Dämpfungsspektrum: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "" #~ "Fehler beim Erstellen des Kumuliertes Dämpfungsspektrums aus der Kst-" #~ "Datei." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "" #~ "Fehler beim Erstellen des Kumuliertes Dämpfungsspektrums aus der Kst-" #~ "Datei. Der Vektor wurde nicht gefunden." #~ msgctxt "ActivityLevelSource|" #~ msgid "Actvity Level" #~ msgstr "Aktivitätsstufe" #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Bearbeiten " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Neu " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Bearbeiten " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Modul" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Neu " #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "Feld wird eingelesen ..." #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Open&GL verwenden" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "Es wird nach Zeilen gesucht ..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "Die Suche nach Zeilen wurde beendet" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Es wird nach Zeilen gesucht: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "Spalte einlesen" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Fehlersuche" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Fehlersuche" #, fuzzy # ~| msgctxt "FillTab|" # ~| msgid "fill reset gradient" #~ msgctxt "FillTab|" #~ msgid "reset fill gradient" #~ msgstr "Verlauf für Füllung zurücksetzen" #~ msgctxt "CurveAppearance|" #~ msgid "curve color" #~ msgstr "Kurvenfarbe" #~ msgctxt "ContentTab|" #~ msgid "insert object" #~ msgstr "Objekt einfügen" #~ msgctxt "ContentTab|" #~ msgid "remove object" #~ msgstr "Objekt entfernen" #~ msgctxt "FillTab|" #~ msgid "fill color" #~ msgstr "Füllfarbe" #~ msgctxt "FillTab|" #~ msgid "fill style" #~ msgstr "Füllstil" #~ msgctxt "FillTab|" #~ msgid "fill use linear gradient" #~ msgstr "Linearen Verlauf für Füllung verwenden" #~ msgctxt "HistogramTab|" #~ msgid "-10.0" #~ msgstr "-10.0" #~ msgctxt "HistogramTab|" #~ msgid "10.0" #~ msgstr "10.0" #~ msgctxt "ImageTab|" #~ msgid "image contour color" #~ msgstr "Bildumrissfarbe" #~ msgctxt "Kst::LogWidget|" #~ msgid "%1%2 %3" #~ msgstr "%1%2 %3" #~ msgctxt "MarkersTab|" #~ msgid "marker color" #~ msgstr "Markierungsfarbe" #~ msgctxt "MatrixTab|" #~ msgid "0" #~ msgstr "0" #~ msgctxt "MatrixTab|" #~ msgid "1" #~ msgstr "1" #~ msgctxt "MatrixTab|" #~ msgid "100" #~ msgstr "100" #~ msgctxt "MatrixTab|" #~ msgid "count X From End" #~ msgstr "Zählt X vom Ende" #~ msgctxt "MatrixTab|" #~ msgid "read x to end" #~ msgstr "Liest X bis zum Ende" #~ msgctxt "MatrixTab|" #~ msgid "read Y To End" #~ msgstr "Liest Y bis zum Ende" #~ msgctxt "MatrixTab|" #~ msgid "count Y From End" #~ msgstr "Zählt Y vom Ende" #~ msgctxt "Kst::PlotRenderItem|" #~ msgid "%1 vs %2" #~ msgstr "%1 gegen %2" #~ msgctxt "ScalarTab|" #~ msgid "Data Source Field" #~ msgstr "Datenquellenfeld" #~ msgctxt "ScalarTab|" #~ msgid "data vector field" #~ msgstr "Datenvektorfeld" #~ msgctxt "StrokeTab|" #~ msgid "stroke style" #~ msgstr "Strichstil" #~ msgctxt "StrokeTab|" #~ msgid "stroke width" #~ msgstr "Strichbreite" #~ msgctxt "VectorTab|" #~ msgid "-10.0" #~ msgstr "-10.0" #~ msgctxt "VectorTab|" #~ msgid "10.0" #~ msgstr "10.0" #~ msgctxt "CurveAppearance|" #~ msgid "line style" #~ msgstr "Linienstil" #~ msgctxt "CurvePlacement|" #~ msgid "place In Existing Plot" #~ msgstr "In existierendem Plot platzieren" #~ msgctxt "DataRange|" #~ msgid "start units" #~ msgstr "Starteinheiten" #~ msgctxt "DataRange|" #~ msgid "range units" #~ msgstr "Bereichseinheiten" #~ msgctxt "FFTOptions|" #~ msgid "60.0" #~ msgstr "60.0" #~ msgctxt "FFTOptions|" #~ msgid "Hz" #~ msgstr "Hz" #~ msgctxt "Kst|" #~ msgid "Data Matrix" #~ msgstr "Datenmatrix" #~ msgctxt "Kst|" #~ msgid "datamatrix" #~ msgstr "Datenmatrix" #~ msgctxt "Kst::DataPrimitive|" #~ msgid "Data file for vector %1 was not opened." #~ msgstr "Datendatei für den Vektor %1 wurde nicht geöffnet." #~ msgctxt "Kst|" #~ msgid "Data Scalar" #~ msgstr "Daten-Skalar" #~ msgctxt "Kst|" #~ msgid "datascalar" #~ msgstr "Daten-Skalar" #~ msgctxt "Kst|" #~ msgid "Data String" #~ msgstr "Daten-Zeichenkette" #~ msgctxt "Kst|" #~ msgid "datastring" #~ msgstr "Daten-Zeichenkette" #~ msgctxt "Kst|" #~ msgid "Data Vector" #~ msgstr "Datenvektor" #~ msgctxt "Kst|" #~ msgid "datavector" #~ msgstr "Datenvektor" #~ msgctxt "Kst|" #~ msgid "Editable Matrix" #~ msgstr "Editierbare Matrix" #~ msgctxt "Kst|" #~ msgid "editablematrix" #~ msgstr "Editierbare Matrix" #~ msgctxt "Kst|" #~ msgid "Editable Vector" #~ msgstr "Editierbarer Vektor" #~ msgctxt "Kst|" #~ msgid "editablevector" #~ msgstr "Editierbarer Vektor" #~ msgctxt "Kst|" #~ msgid "Generated Matrix" #~ msgstr "Generierte Matrix" #~ msgctxt "Kst|" #~ msgid "generatedmatrix" #~ msgstr "Generierte Matrix" #~ msgctxt "Kst|" #~ msgid "Generated Vector" #~ msgstr "Generierter Vektor" #~ msgctxt "Kst|" #~ msgid "generatedvector" #~ msgstr "Generierter Vektor" #~ msgctxt "Kst|" #~ msgid "Matrix" #~ msgstr "Matrix" #~ msgctxt "Kst|" #~ msgid "Object" #~ msgstr "Objekt" #~ msgctxt "Kst|" #~ msgid "Primitive" #~ msgstr "Grundtyp" #~ msgctxt "Kst|" #~ msgid "Scalar" #~ msgstr "Skalar" #~ msgctxt "Kst|" #~ msgid "scalar" #~ msgstr "Skalar" #~ msgctxt "Kst|" #~ msgid "String" #~ msgstr "Zeichenkette" #~ msgctxt "Kst|" #~ msgid "string" #~ msgstr "Zeichenkette" #~ msgctxt "Kst|" #~ msgid "Vector" #~ msgstr "Vektor" #~ msgctxt "Kst|" #~ msgid "vector" #~ msgstr "Vektor" #~ msgctxt "PlotItem|" #~ msgid "" #~ "Plot: %1 \n" #~ "Contents:\n" #~ " %2" #~ msgstr "" #~ "Plot: %1 \n" #~ "Inhalte:\n" #~ " %2" #~ msgctxt "Kst|" #~ msgid "Plugin" #~ msgstr "Modul" #~ msgctxt "Kst|" #~ msgid "plugin" #~ msgstr "Modul" #~ msgctxt "Kst|" #~ msgid "Curve" #~ msgstr "Kurve" #~ msgctxt "Kst|" #~ msgid "curve" #~ msgstr "Kurve" #~ msgctxt "Kst|" #~ msgid "Equation" #~ msgstr "Gleichung" #~ msgctxt "Kst|" #~ msgid "equation" #~ msgstr "Gleichung" #~ msgctxt "Kst|" #~ msgid "Event Monitor" #~ msgstr "Ereignismonitor" #~ msgctxt "Kst|" #~ msgid "eventmonitor" #~ msgstr "Ereignismonitor" #~ msgctxt "Kst|" #~ msgid "Histogram" #~ msgstr "Histogramm" #~ msgctxt "Kst|" #~ msgid "histogram" #~ msgstr "Histogramm" #~ msgctxt "Kst|" #~ msgid "Image" #~ msgstr "Bild" #~ msgctxt "Kst|" #~ msgid "image" #~ msgstr "Bild" #~ msgctxt "Kst|" #~ msgid "Power Spectrum" #~ msgstr "Leistungsspektrum" #~ msgctxt "Kst|" #~ msgid "powerspectrum" #~ msgstr "Leistungsspektrum" #~ msgctxt "Kst|" #~ msgid "Relation" #~ msgstr "Beziehung" Kst-2.0.8/po/kst_common_ca@valencia.po0000644000175000017500000110671012362706252016766 0ustar synthsynth# Translation of kst_common.po to Catalan # Copyright (C) 2014 This_file_is_part_of_KDE # This file is distributed under the license LGPL version 2.1 or # version 3 or later versions approved by the membership of KDE e.V. # # Josep Ma. Ferrer , 2014. msgid "" msgstr "" "Project-Id-Version: kst_common\n" "PO-Revision-Date: 2014-03-23 20:17+0100\n" "Last-Translator: Josep Ma. Ferrer \n" "Language-Team: Catalan \n" "Language: ca@valencia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "X-Generator: Lokalize 1.4\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Accelerator-Marker: &\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Aplica estos paràmetres per defecte" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Vista prèvia de les primeres 1000 línies en una finestra nova" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Primeres línies " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Vista prèvia]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Capçalera" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Les dades comencen a la línia:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Llig els noms de camps des de la línia:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Llig les unitats des de la línia:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicadors de comentari:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Ací podeu utilitzar més d'un símbol, com per exemple «#!C», però alentirà la " "lectura de fitxers ASCII" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Separador decimal:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Punt" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Coma" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Disposició de la columna de dades" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Delimitat per espai/tabulador" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Delimitador personalitzat" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "La lectura és més ràpida si es pot assumir que cada columna té la seua " "pròpia amplada constant." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Cada columna té la seua\n" "pròpia amplada constant" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Amplada fixa" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Opcions generals" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Mida del límit de la memòria intermèdia:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " MB" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Utilitza fils" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Accepta sempre fitxers que coincideix:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpreta els valors buits com a:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zero" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Valor anterior" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interpretació de data/hora" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Valor" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Camp a interpretar" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "com a:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Hora C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Segons" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Índex amb freqüència" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Cadena amb format. Format:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Recorreu a la documentació de QDateTime pels detalls.
Podeu utilitzar una " "combinació de y,M,d per les dates i h,m,s,z per les hores (z pels " "mil·lisegons).
Es permet un espai entre les columnes de data i hora, però " "cal seleccionar la primera columna com a vector X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr " d=dia, M=mes, y=any, h=hora, m=minut, s=segon, z=mil·lisegon" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Desplaçament" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Data/hora:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Data del fitxer" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relatiu" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, fuzzy, qt-format #| msgctxt "AsciiConfig|" #| msgid "First lines " msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Primeres línies " #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 #, fuzzy #| msgctxt "MatrixTab|" #| msgid "Gradient Parameters" msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Paràmetres del gradient" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "S'està analitzant «%1»..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Ha finalitzat l'anàlisi de «%1»" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "S'està analitzant «%1»: %2 files" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Camp de lectura: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "S'ha creat un INDEX" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Ha finalitzat la lectura: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "lectura..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "anàlisi..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Columna %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 #, fuzzy #| msgctxt "AsciiConfig|" #| msgid "File date" msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Data del fitxer" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Columna %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "No s'ha obert el fitxer de dades per la matriu %1." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Matriu de dades: %1\n" " %2\n" " Camp: %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 de %2 " #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "No s'ha obert el fitxer de dades per l'escalar %1." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Escalar de dades: %1 = %4\n" " %2\n" " Camp: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 de %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "quadres" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Camins de cerca de connectors:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Explorant connectors de fonts de dades." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Connector carregat: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "la instància ha fallat per %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "El fitxer «%1» no existeix." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "No s'ha pogut trobar cap font de dades per «%1»(%2), per se n'ha trobat un " "just abans. Hi ha quelcom incorrecte amb el Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "No s'ha obert el fitxer de dades per la cadena %1." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Cadena de dades: %1 = %4\n" " %2\n" " Camp: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 de %2 " #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "No s'ha obert el fitxer de dades pel vector %1." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Vector de dades: %1\n" " %2\n" " Camp: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Darrers %1 quadres." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Quadre %1 fins al final." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 quadres començant a %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Llig 1 mostra per cada %1 quadre." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Mitjana cada %1 quadres." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 de %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Error" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Avís" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Nota" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Traça" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Altres" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst versió %1\n" "\n" "\n" "Registre del Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Connectors de fonts de dades:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Vector editable: %1\n" " %2 valors" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Vector generat: %1\n" " %2 valors des de %3 a %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 punts des de %1 a %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "La matriu guardada conté menys dades que les que declara." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matriu: %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Error en crear una matriu generada des del fitxer Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Error en crear una matriu editable des del fitxer Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Error en crear una matriu de dades des del fitxer Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Escalar: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Escalar: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Valor: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Error en crear un escalar des del fitxer Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Cadena: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Error en crear una cadena des del fitxer Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Proveïdor: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vector: %1\n" " %2 mostres\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Error en crear un vector des del fitxer Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Error en crear un vector generat des del fitxer Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "No s'ha obert el fitxer de dades per l'escalar %1." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Escalar de dades: %1 = %4\n" " %2\n" " Camp: %3\n" " Quadre: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 quadre %3 de %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "" #: ../src/libkstapp/aboutdialog.cpp:67 #, fuzzy, qt-format #| msgctxt "Kst::AboutDialog|" #| msgid "Revision " msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Revisió " #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Pàgina web:
http://kst-plot.kde.org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Informeu dels errors amb l'«Assistent d'informe d'errors» del menú «Ajuda»." "
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Autors i col·laboradors (ordenats alfabèticament):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Quant al Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Arranjament del Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "General" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Escalat" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Graella" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Propietats de la disposició" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Fletxa" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Error en crear un objecte de fletxa des del fitxer Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Crea una fletxa" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Propietats de la fletxa" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Flet&xa a l'inici" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Escala de la fle&txa a l'inici" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Mida de la punta de la fletxa" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "La mida de la punta de la fletxa és proporcional a este valor." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Flet&xa al final" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Escala de la fle&txa al final" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Eixos" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Gruixut" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fi" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Molt fi" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Oculta l'esquerra" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Oculta la dreta" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Oculta els marges i les etiquetes" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Oculta la part superior" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Oculta la part inferior" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotació d'etiquetes" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Rotació:" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Mode de base/desplaçament" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Automàtic" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Activa" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Inactiva" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Dígits abans del mode de base/desplaçament:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Cal este nombre de dígits per mostrar els números de les marques, llavors " "l'eix es retornarà al mode de base/desplaçament." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Força el desplaçament al mínim de l'eix" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarítmica" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Inverteix la direcció dels eixos, de manera que el números es reduïsquen en " "lloc d'augmentar." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Inve&rteix" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "L'eix és el temps" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpreta l'eix com el temps." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpreta com a:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Tipus de codificació del temps" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "L'eix representa el temps, i ací se selecciona la seua codificació." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Mostra com a:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Format de visualització del temps" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Si l'eix s'interpretarà com a temps, llavors es visualitzarà el temps en " "l'eix amb este format." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Zona horària:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Format de data/hora:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Data: y/M/d - Hora: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Marques i línies més importants" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Dibui&xa les marques" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Dibuixa les línies de la &graella" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Es&paiat més important:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Densitat de les marques més importants" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Indica la densitat de les marques més importants, Se seleccionarà " "automàticament un interval entre les marques més importants com una potència " "de 10 elevat a 1, 2 o 5. Això canvia l'espaiat de destí entre marques dins " "d'esta restricció." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "E&stil de les línies de la graella:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Color de les línies de la graella:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Amplada:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Marques i línies menys importants" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Dibuix&a les marques" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Dibuixa les línies de la graella" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "&Comptador de les marques menys importants:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Automàtic" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Est&il de línia:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Color d&e línia:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, fuzzy, qt-format #| msgctxt "Kst::BadDatasourceDialog|" #| msgid ": File not found. " msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr ": No s'ha trobat el fitxer. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Diàleg" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "EtiquetaDeText" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Seleccioneu un fitxer de dades nou:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Canvia" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Omet" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Connector bàsic" #: ../src/libkstapp/basicplugindialog.cpp:55 #, fuzzy, qt-format #| msgctxt "Kst::MainWindow|" #| msgid "Fit Pl&ugin" msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Connector d'aj&ust" #: ../src/libkstapp/basicplugindialog.cpp:57 #, fuzzy, qt-format #| msgctxt "Kst::BasicPluginDialog|" #| msgid " Plugin" msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr " Connector" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "No s'ha pogut crear l'objecte connector usant els paràmetres subministrats.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Entrades i eixides" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Quadre" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Error en crear un objecte de quadre des del fitxer Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Crea un quadre" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "" #: ../src/libkstapp/bugreportwizard.cpp:31 #, fuzzy #| msgctxt "CSDTab|" #| msgid "Window size:" msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Mida de la finestra:" #: ../src/libkstapp/bugreportwizard.cpp:32 #, fuzzy #| msgctxt "CSDTab|" #| msgid "Window size:" msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Mida de la finestra:" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistent d'informe d'errors" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Versió del Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "SO:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Per a enviar un informe d'error, cliqueu al botó de sota.\n" "Això obrirà una finestra del navegador web a http://bugs.kde.org on trobareu " "un formulari per a omplir.\n" "La informació que es mostra més amunt s'enviarà a este servidor." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Engega l'assistent d'informe d'errors" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Botó" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Error en crear un objecte botó des del fitxer Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Gràfic cartesià" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "quadres" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Memòria insuficient" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "S'ha sol·licitat llegir %1 MB de dades però pareix que només hi ha " "aproximadament %2 MB de memòria utilitzable disponible. No es pot carregar " "esta quantitat de dades." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Canvia les mostres de dades" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Selecció de vector" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en esta llista." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Afig-ho &tot" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Afig" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "El fitxer no s'ha pogut carregar o no conté dades." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "El camp següent no està definit en el fitxer sol·licitat:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Els camps següents no estan definits en el fitxer sol·licitat:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Canvi del fitxer de dades" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Selecció per fitxer d'origen" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "A&fig-ho tot des de:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Selecció de vector i matriu" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en esta llista." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Afig-ho &tot" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Afig" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Fitxer de dades nou" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Fitxer:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Can&via els vectors i matrius seleccionades" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "D&uplica els objectes derivats (corbes, equacions,...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Duplica els vectors i matrius seleccionades" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Assigna corba de color des de fitxer" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Assigna els colors" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Color de base de la corba a:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Vector &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Vector &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Radi" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centre" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Cercle" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Error en crear un objecte de cercle des del fitxer Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Crea un cercle" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "final" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Columna %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Ús: -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Ús: -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Ús: -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Ús: -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Ús: -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Ús: -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Ús: -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Ús: -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Ús: -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "No s'ha especificat cap fitxer de dades\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "El fitxer %1 no existeix\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Ús: -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Ús: -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Ús: -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Ús: -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Ús: --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Ús: --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Eleva en orde del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Abaixa en orde del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Objectes &disponibles:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Desselecciona-ho tot" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Selecciona-ho tot" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Eleva en orde del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Abaixa en orde del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Objectes mostrats:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "grupBoto" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "AIXÒ, I TOT EL QUE SEGUEIX A SOTA ÉS PER A CREACIÓ D'SCRIPTS I HAURIA " "D'ESTAR OCULT!" #: ../src/libkstapp/csddialog.cpp:43 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Espectr&ograma" #: ../src/libkstapp/csddialog.cpp:132 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Espectr&ograma" #: ../src/libkstapp/csddialog.cpp:134 #, fuzzy #| msgctxt "Kst::DataManager|" #| msgid "Make Spectrogram" msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Fes un espectrograma" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Contingut de l'espectrograma" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Vector de dades:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Mida de la finestra:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Opcions d'imatge" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Corba" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Edita una corba" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Corba nova" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Continguts de la corba" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Vector de l'eix &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Vector de l'eix &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Barra d'e&rror a +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Barra d'error a &+Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Barra d'error a -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Barra d'error a &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Usa la barra d'error +X per -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "U&sa la barra d'error +Y per -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnora en els càlculs automàtics d'abast dels eixos" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nom:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Automàtic" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Edició múltiple >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Edita un %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Introduïu ací el filtre (es permeten comodins)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Fes una corba" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Fes un espectre de potència" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Fes un espectrograma" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Fes un histograma" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Aplica el filtre" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Fes una imatge" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Afig al gràfic" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Elimina del gràfic" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Aplica un ajust" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Suprimeix" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gestor de dades" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtra per:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Totes les columnes" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nom" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Tipus" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Mostres" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Distingeix entre majúscules i minúscules" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Purga" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Error en crear una font de dades des del fitxer Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Interval de temps" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Detecció de canvis" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "No actualitzes" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Eleva en orde del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Abaixa en orde del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, fuzzy, qt-format #| msgctxt "Kst::DataWizardPageVectors|" #| msgid " vector(s) available" msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr " vector/s disponible/s" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, fuzzy, qt-format #| msgctxt "Kst::DataWizardPageVectors|" #| msgid " vector(s) selected" msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr " vector/s seleccionat/s" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Crea gràfics es&pectrals. Definiu a sota les opcions del FFT:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Memòria insuficient" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "S'ha sol·licitat llegir %1 MB de dades però pareix que només hi ha " "aproximadament %2 MB de memòria utilitzable disponible. No es pot carregar " "esta quantitat de dades." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Crea gràfics &XY. Definiu a sota les propietats de l'eix X:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Crea des del cam&p:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Usa l'e&xistent:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "El camp que s'utilitzarà com a eix X en les corbes XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Seleccioneu una font de dades per treballar-" "hi. Normalment, això serà el fitxer que conté punts de dades o vectors.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Tipus de fitxer desconegut" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figura..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "Tipus d'actualització; useu «Interval de temps» per dades no locals" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtres" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "Filtre &nou..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Si voleu, seleccioneu un " "filtre per aplicar als camps que es lligen:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Posició de la corba" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Totes les corbes en un gràfic" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 gràfic nou per corba" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Circ&ula per" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " gràfics" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Circula pels gràfics exis&tents" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Totes les corb&es en el gràfic" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Posició del gràfic (pestanyes)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Tot en la pestanya a&ctual" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Tot en una pestanya no&va" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY i espectre en pestanyes noves &separades" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Disposició del gràfic" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Disposició &automàtica" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Grae&lla personalitzada" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Columnes:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&rotegeix la disposició existent" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Ajusta l'escala de totes les etiquetes de la pestanya" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Reparteix els eixos per la pestanya" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Estil de cor&ba" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Només lín&ies" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Només &punts" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Línies i punt&s" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Mode de l'eix de l'espectre" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Eix X lo&garítmic" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Eix Y &logarítmic" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Llegendes" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Activa" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Inactiva" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Vertical" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Eleva en orde del gràfic: Alt+Fletxa amunt)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Selecciona (Alt-S): Mou els camps ressaltats des de la llista de dades " "disponibles a la llista de dades seleccionades per fer el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Elimina (Alt-R): Mou els camps ressaltats des de la llista de dades " "seleccionades a la llista de dades disponibles, de manera que no es " "mostraran en fer el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "" "Dades seleccionades: Tots els camps en esta llista es mostraran en el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Dades seleccionades: Tots els camps en esta llista es mostraran en el " "gràfic. Per eliminar camps d'esta llista, arrossegueu-los a la llista de " "dades disponibles, feu un clic doble en ells, o seleccioneu-los i useu el " "botó Elimina (fletxa dreta o Alt-R). L'orde en el que apareixen els camps en " "esta llista és l'orde en que es dibuixaran." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Dades seleccionades:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vector/s seleccionat/s" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtre de cerca" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtre de cerca: Els camps que coincidisquen amb este filtre es ressaltaran " "i es mouran a la part superior de la llista de dades disponibles. Es poden " "usar els comodins «*» i «?»." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Afig el comodí «*» al començament i al final del filtre de cerca per trobar " "tot el que continga el text del filtre de cerca." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "C&erca" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Selecció de camps: Els camps activats es mostraran en el gràfic." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Dades disponibles: Este quadre llista tots els camps que no s'han " "seleccionat per mostrar en el gràfic. Per seleccionar un camp per dibuixar, " "moveu-lo a la llista de dades seleccionades, arrossegant-lo amb el ratolí, " "fent un clic doble, o ressaltant-lo, i clicant en el botó de selecció " "(fletxa dreta o l'accelerador és Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Dades disponibles:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vector/s disponible/s" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Versió %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Versió %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Diàleg de depuració del Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informació de construcció" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Envia un correu amb la informació de depuració" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Registre" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Nivell de registre: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Avís" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Nota" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Traça" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Nete&ja" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Fonts de dades" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Connector" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Instància carregada" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "Tan&ca" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "S'ha produït un error. Cliqueu en esta icona per a més detalls." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Tipus de lletres" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Carta" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Gràfic de diari" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Personalitzat" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Mida mínima del tipus de lletra (punts):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "En redimensionar la finestra, els tipus de lletra es mostraran amb esta mida " "mínima." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Mida de vista de referència:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Quan la finestra té esta mida, els tipus de lletra tindran esta mida fixada." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Els tipus de lletra s'escalaran amb la mida de la finestra o de la " "impressió. Quan la finestra/impressió tinga esta mida, les mides dels tipus " "de lletra fixades seran precises. " #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Mida de referència personalitzada (cm):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Guarda com a predeterminat" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Aplica als objectes existents" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Puja la propietat seleccionada en la llista de prioritats" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Baixa la propietat seleccionada en la llista de prioritats" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "Afig la propietat seleccionada a la llista de prioritats a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Elimina la propietat seleccionada de la llista de prioritats a circular" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Color de línia" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Estil de punt" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Estil de línia" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Amplada de línia" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Diferencia les corbes" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Selecció de propietats i orde de cicle" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Eleva en orde de la selecció: Alt+Fletxa amunt" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Abaixa en orde de la selecció: Alt+Fletxa avall" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Disponibles:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Seleccionats:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Opcions" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Amplada màxima de línia:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Densitat dels punts:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Tots" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Alta" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Mitjana" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Baixa" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "Gi&r:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Mida:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Posició:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Fixa la relació d'aspecte" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "No s'ha pogut obrir el fitxer per escriptura." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "No s'ha pogut obrir el fitxer per lectura." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "El fitxer està mal format i s'ha trobat un error en la seua lectura." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Selecció d'objectes a editar" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtre:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Neteja" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Selecciona-ho &tot" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "El·lipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Error en crear un objecte d'el·lipse des del fitxer Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Crea una el·lipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Equació" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Edita l'equació" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Equació nova" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Equació" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Eq&uació:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Introduïu ací l'equació a avaluar. Useu «x» com a variable independent. Els " "vectors and operadors se seleccionen de les llistes de dalt." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Vector &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpola a la resolució vectorial més alta" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Monitor d'esdeveniments" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Edita el monitor d'esdeveniments" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Monitor nou d'esdeveniments" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Notificació de correu" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "No&tifica:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expressió" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vectors:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Operadors:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "Pi" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Escalars:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expressió:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Descripció:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Executa:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tifica:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configura..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Registre de depuració del Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Avís" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Error" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Nota" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Registra com a:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exporta a un fitxer gràfic" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "Nom &base:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Format de fitxer:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Mida" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Amplada (en píxels) de la imatge." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "A&lçada:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Alçada (en píxels) de la imatge." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "Es&pecificació:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Amplada i mantindre la relació d'aspecte" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Alçada i mantindre la relació d'aspecte" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Amplada i alçada" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Mida del quadrat" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Guarda les opcions" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "No guardes automàticament. En clicar D'acord o Aplica, guarda una vegada." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "Guarda una &vegada" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Guarda la imatge segons el temporitzador" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Quan està activada, la imatge es guardarà repetidament usant el període " "indicat. Això és útil, per exemple, per imatges de pàgines web en directe." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Guarda &automàticament cada" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Temporitzador de guardat automàtic" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "&Extensió automàtica" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Inclusió:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Formats de vector" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Formats de mapa de bits" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exporta vectors" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Selecció de vector" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Es canviarà el fitxer de codi font pels vectors seleccionat en esta llista." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Selecciona tots els vectors de la llista." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "Afig-ho &tot" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Afig" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Desselecciona tots els vectors de la llista." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "&Elimina-ho tot" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "Ubicació de de&sat:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Sense pinzell" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Patró sòlid" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Patró dens 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Patró dens 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Patró dens 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Patró dens 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Patró dens 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Patró dens 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Patró dens 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Patró horitzontal" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Patró vertical" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Patró creuat" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Patró diagonal 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Patró diagonal 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Patró diagonal creuat" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Color:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "E&stil:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Usa un degradat &lineal" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Reincia el degradat" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Connector" #: ../src/libkstapp/filterfitdialog.cpp:159 #, fuzzy, qt-format #| msgctxt "Kst::MainWindow|" #| msgid "Fit Pl&ugin" msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Connector d'aj&ust" #: ../src/libkstapp/filterfitdialog.cpp:161 #, fuzzy, qt-format #| msgctxt "Kst::BasicPluginDialog|" #| msgid " Plugin" msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr " Connector" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "No s'ha pogut crear l'objecte connector usant els paràmetres subministrats.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Selecció de connectors" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nom del connector:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Descripció:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Entrades i eixides" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnora en els càlculs automàtics d'abast dels eixos" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "General" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Velocitat d'actualització dels fitxers dinàmics." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Temps mínim entre actualitzacions en controlar els fitxers dinàmics. Si hi " "ha molt procés, pot trigar més." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Període entre actualitzacions (ms):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Utilitza transparència en arrossegar" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Renderitza usant «raster». Això sempre és millor." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "La renderització usant el «raster» és més ràpida en algunes arquitectures, " "però molt defectuosa en altres (depenent del controlador de vídeo). Això " "podria ajudar o provocar que siga pitjor." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Usa el motor «raster» (cal el reinici del Kst)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "Gràfics amb &antialiàsing" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Graella" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Mostra la &graella" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "Aju&sta a la graella" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Espaiat &horitzontal de la graella:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Espaiat &vertical de la graella:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histograma" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Edita histograma" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Histograma nou" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Propietats de l'histograma" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dades:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Grups des &de:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "El límit inferior del grup inferior. Els valors per sota d'este límit no es " "comptaran en cap grup." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "a:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "El límit superior del grup superior. Els valors per sobre d'este límit no es " "comptaran en cap grup." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "Nombre de grup&s:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "El nombre de grups en l'histograma." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Definiu els límit superior i inferior, i el nombre de grups a un valor per " "defecte raonable." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "Grups a&utomàtics" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Grups automàtics en temps &real" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalització de l'eix Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "L'eix Y de l'histograma informa de la fracció de mostres del grup." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Fracció en el grup" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "L'eix Y de l'histograma informa del nombre de mostres del grup." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "No&mbre en el grup" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "L'eix Y de l'histograma està normalitzat, per tant, el grup més gran és 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Pic de grup = &1,0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "L'eix Y de l'histograma informa del percentatge de mostres en el grup." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Percen&tatge en el grup" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Imatge" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Edita la imatge" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Imatge nova" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Contingut de la imatge" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matriu:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Tipus d'imatge" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "M&apa de colors" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Mapa de con&torn" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Mapa de &colors i mapa de contorn" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Paràmetres del mapa de colors" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "S&uperior:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Llindar - &Inferior:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Intel·ligent" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&il: " #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Llindar automàtic en temps &real" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Paràmetres del mapa de contorn" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Co&lor:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Nom&bre de nivells de contorn:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Ponderació:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Usa ponderació de línia &variable" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Diàleg de creació d'etiqueta" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Diàleg" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Dreta" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Esquerra" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Punt de referència:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " punts" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Color" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Guarda com a predeterminat" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "Dreta" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "Esquerra" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Punt de referència d'etiqueta:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Gir" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Posició" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Etiqueta" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Creació d'etiqueta" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Propietats de l'etiqueta" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}, x^y, x_y. Els escalars, equacions, i elements vectorials " "es poden incrustar. Escalar: [V1/Mitjana]. Element vectorial: [V1" "[4]]. Equació: [=[V1/Mitjana]^2]. El caràcter [ es pot inserir " "com a \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "&Mida del tipus de lletra del gràfic per defecte:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "punts" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Escala automàticament els números de les etiquetes dels eixos" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Etiqueta su&perior:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automàtica" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Etiqueta i&nferior:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "Etiqueta es&querra:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Etiqueta d&reta:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Mostra la lle&genda" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "E&dita" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Permet escalars i cadenes (nom entre claudàtors) - P. ex., [INDEX:Max " "(X2)],\n" "equations incrustades - P. ex, [=[INDEX:Max] / 2]\n" "i símbols del LaTeX - P. ex, \\theta. Els noms i els símbols es completen " "automàticament." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Disposició del quadre" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Disposició" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Marge &horitzontal:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Marge &vertical:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Espaiat horit&zontal:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Espaiat ver&tical:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Llegenda" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Llegenda buida" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gràfic: %1 \n" "Contingut:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Llegenda" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Eleva en orde de la llista: Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Abaixa en orde de la llista: Alt+Fletxa avall" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Títol:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Usar el contingut automàtic basat en el gràfic" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Mostra &verticalment" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Objectes &disponibles:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Objectes mostrats:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Eleva en orde del gràfic: Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Fletxa amunt" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Elimina: Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Selecció: Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Abaixa en orde del gràfic: Alt+Fletxa avall" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Fletxa avall" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Arranjament del tipus de lletra de la llegenda" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "&Mida del tipus de lletra:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Família del tipus de lletra" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Bloqueja la posició a les dades" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LineEdit" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Error en crear un objecte de lineEdit des del fitxer Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Línia" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Error en crear un objecte de línia des del fitxer Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Crea una línia" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script: En execució" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script: Ha finalitzat" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script: Codi de retorn %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Error d'script: Ha fallat en iniciar" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Error d'script: Ha fallat" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Error d'script:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Fes una entrada al registre" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "To&rna a executar l'script" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Aplica" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "Tan&ca" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Missatge" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Missatge:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "&Neteja" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Eixida de l'script:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuració" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Propietats del gràfic" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Amplada i mantindre la relació d'aspecte" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Alçada i mantindre la relació d'aspecte" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Amplada i alçada" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Mida del quadrat" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "A&lçada:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Alçada (en píxels) de la imatge." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Format de fitxer:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "Es&pecificació:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Amplada (en píxels) de la imatge." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Directori local del registre:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Les variables $user, $imagefile i $messagefile es poden utilitzar en la " "llista d'arguments." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "Nom d'&usuari:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: Pregunta si es guarda" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "El document s'ha modificat.\n" "Deso els canvis?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: Fitxer guardat" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sessions Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: Obri un fitxer" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "Nete&ja dels fitxers inexistents" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Pels detalls vegeu Ajuda->Diàleg de depuració->Registre." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Error en obrir el document:\n" " «%1»\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Obri..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Obri una sessió nova" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "Al&ça" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Guarda la sessió actual" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Guarda com &a..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "Sessió no&va" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Tanca la sessió actual i inicia una sessió nova i buida" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Recarrega totes les fonts de &dades" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Recarrega totes les fonts de dades" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Imprimeix..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Imprimeix la vista actual" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exporta com a imatge/s..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Exporta els gràfics al disc" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Guarda els &vectors al disc..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exporta els vectors a un fitxer ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Entrada de re&gistre..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Publica una entrada del registre" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "Pestanya &nova" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Crea una pestanya nova" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "Tan&ca la pestanya" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Tanca la pestanya actual" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "I&x" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+U" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Ix de l'aplicació" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Maj+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vectors" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Mostra tots els vectors en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "E&scalars" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Mostra tots els escalars en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrius" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Mostra totes les matrius en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "Ca&denes" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Mostra totes les cadenes en un full de càlcul" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "Torna &enrere una pantalla" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Torna arrere una pantalla" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Avança una pantalla" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Avança una pantalla" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Compta des del final" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Configura tots els vectors de dades per comptar des del mode final" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "&Llig al final" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Configura tots els vectors de dades per llegir al mode final" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pausa" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Commuta la pausa d'actualitzacions de les fonts de dades" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Canvia l'interval de mo&stra de dades..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Mostra el diàleg del Kst de canvi d'interval de mostra de dades" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Dibuixa" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Crea un gràfic per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "E&scalar" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vector" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matriu" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "Ca&dena" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Corba" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Equació" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Espectre de po&tència" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Histograma" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Imatge" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Espectr&ograma" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Monitor d'esdeve&niments" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Etiqueta" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Crea una etiqueta per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Quadre" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Crea un quadre per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Cercle" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Crea un cercle per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&El·lipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Crea una el·lipse per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Línia" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Crea una línia per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Fletxa" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Crea una fletxa per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Imatge" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Crea una imatge per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Crea un SVG per la vista actual" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Quadre d'eix compartit" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Crea un quadre d'eix compartit per l'element actual" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Commu&ta el zoom lligat" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Commuta el zoom lligat de la vista actual" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Lliga per totes les pestanyes" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "El zoom lligat s'aplica entre les pestanyes" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Ressalta els punts de dades" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Ressalta el punt de dades més proper" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Zoom/Desplaçament X-Y " #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Zoom arbitrari en direcció X o Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Zoom només &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoom només en direcció X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Zoom només &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Mode de &disposició" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Commuta el mode de disposició de la vista actual" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Gestor de dades" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Mostra la finestra del gestor de dades del Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Assistent de &dades" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Mostra l'assistent de dades del Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Canvi del &fitxer de dades" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Mostra el diàleg del Kst de canvi del fitxer de dades" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Assigna corba de &color des de fitxer" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Mostra el diàleg del Kst de selecció de color" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "D&iferencia les corbes" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Mostra el diàleg del Kst de diferenciació de les corbes" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configura el Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Mostra el diàleg de configuració del Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Tema" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Mostra el diàleg de tema del Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "&Diàleg de depuració" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Mostra el diàleg de depuració del Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Assistent d'informe d'e&rrors" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Mostra l'assistent d'informes d'error del Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&Quant a" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Mostra el quadre quan a del Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Fitxer" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Sessions &recents" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "&Fitxers de dades recents" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Edita" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Visualitza" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "Inte&rval" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Crea" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Co&nnector estàndard" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Connector d'aj&ust" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Connector de fil&tres" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Anotació" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Mode" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Mode d'interacció" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Eines" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "A&rranjament" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "A&juda" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Fitxer" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Eines" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Interval de dades" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Mode" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Disposició del gràfic" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Disposició avançada" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Preparat" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Marcadors" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Ja existeix un marcador de gràfic amb un valor igual (o molt paregut)." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "El text que heu introduït no és nombre vàlid." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Marcadors d'eixos" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "Punt &nou de marcador: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Afig" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Marcadors act&uals" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "&Neteja" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "&Elimina" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Aparença del marcador" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Est&il de línia:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Co&lor de línia:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "A&mplada de línia:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Marcadors automàtics" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Usa una corba com a &font del marcador:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Crea marcadors a:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Aresta &ascendent" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "Aresta &descendent" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "Am&bdues" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Usa un &vector com a font del marcador:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matriu" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Edita matriu" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Matriu nova" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Escalat i translació" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "Mi&da del pas X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "Mínim &X:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "Mínim &Y:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Mida del &pas Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Paràmetres del gradient" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Increment/decrement dels valors de Z al llarg de:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Eix X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Eix Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z al mínim:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Passos X:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Passos Y:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z al màxim:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Interval de dades" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "o" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "Quadre d'&inici Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "N&ombre de quadres X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "C&ompta des del final" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Llig al final" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "No&mbre de quadres Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Ll&egeix al final" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Compta &des del final" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Quadre d'i&nici X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " quadres" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Primer el &filtre «boxcar»" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Llig &1 mostra per" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Font" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Llig des de la font de dades" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Genera un gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Paràmetres de la font de dades" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "Ca&mp o columna:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 MB disponibles" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Usa el tipus de lletra per defecte del gràfic" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " punts" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Imatge" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: Obri imatge" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Error en crear un objecte d'imatge des del fitxer Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Crea una imatge" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Anys]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Dies]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Hores]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minuts]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Segons]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Gràfic" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom màxim" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom màxim insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zoom anterior" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zoom ajustat" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom ajustat a X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom ajustat a Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom centrat a la mitjana d'Y" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Zoom màxim d'X" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Zoom d'X amb vora automàtica" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Zoom d'X insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Zoom d'X a la dreta" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Zoom d'X a l'esquerra" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Ampliació d'X" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Reducció d'X" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normalitza l'eix X a l'eix Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Eix X logarítmic" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Zoom d'Y local màxim" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Zoom d'Y màxim" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Zoom d'Y amb vora automàtica" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Zoom d'Y insensible a les puntes" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Zoom d'Y cap a dalt" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Zoom d'Y cap a baix" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Ampliació d'Y" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Reducció d'Y" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normalitza l'eix Y a l'eix X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Eix Y logarítmic" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Ajusta l'escala de color de la imatge" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximitza el gràfic" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Comparteix els gràfics en l'eix X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Comparteix els gràfics en l'eix Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Trenca el quadre d'eix compartit" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copia les coordenades" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copia la coordenada X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copia la coordenada Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copia" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtre" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Edita una corba" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Ajusta" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Paràmetres del quadre d'eix compartit" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Informació copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Coordenada X copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Coordenada Y copiada al porta-retalls: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Gràfic: %1 \n" "Contingut:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Gràfic buit" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Error en crear un objecte de gràfic des del fitxer Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Crea un gràfic" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Crea un gràfic per la corba" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Expressió de zoom fixat" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Expressió d'interval de zoom X" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom màxim" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom màxim insensible a les puntes" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom centrat a la mitjana" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom centrat a la mitjana d'X" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom centrat a la mitjana d'Y" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom d'X màxim" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom d'X amb vora automàtica" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom d'X sense puntes" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Desplaçament d'X a la dreta" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Desplaçament d'Y a l'esquerra" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Redueix X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Amplia X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom normalitzat d'X a Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom d'Y local màxim" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom d'Y màxim" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom d'Y amb vora automàtica" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom d'Y sense puntes" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom d'Y cap a dalt" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom d'Y cap a baix" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Redueix Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Amplia Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom normalitzat d'Y a X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X logarítmic" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y logarítmic" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Edita element del gràfic" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Continguts" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Tipus de lletra superior" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Tipus de lletra inferior" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Tipus de lletra de l'esquerra" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Tipus de lletra de la dreta" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Tipus de lletra dels eixos" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Etiquetes" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Interval/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Eix X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Eix Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Marcadors de l'eix X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Marcadors de l'eix Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Tipus de lletra superior*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Tipus de lletra inferior*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Tipus de lletra de l'esquerra*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Tipus de lletra de la dreta*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Tipus de lletra dels eixos*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Representació del gràfic" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Mode de referència" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Edita l'espectre de potència" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Espectre de potència nou" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Contingut de l'espectre de potència" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Vecto&r de dades:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Valor" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Interval" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Mode de zoom d'X" #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&utomàtic" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Automàtic amb vo&ra" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Automàtic insensible a les puntes" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "C&entrat a la mitjana, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "inter&val: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ix, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "&des de: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "&a:" #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "Hauria d'estar ocult" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Mode de zoom d'Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Automàtic" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Automàtic amb &vora" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Automàtic insensible a les &puntes" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "&Centrat a la mitjana, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "Inte&rval: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fix, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "D&es de: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&a:" #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Escalar" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Edició d'escalar" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Escalar nou" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Llig des de la &font de dades" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "" "Genera un vector nou amb les propietats donades ací com a variable " "independent." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Llig des del &vector de dades" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Llig des de la font de dades" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Camp:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "Fotog&rama:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "o" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccioneu això per llegir les dades des del final del fitxer. Això és útil " "per per desplaçar les visualitzacions quan el fitxer l'està actualitzant pel " "final una altra aplicació." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&Darrer marc" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Genera" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "V&alor: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "El valor màxim de la variable independent." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Tipus" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Mostres" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Propietats" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Quadre d'eix compartit" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Trenca el quadre d'eix compartit" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Error en crear un objecte de quadre d'eix compartit des del fitxer Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Crea un quadre d'eix compartit" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Cadena" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Edita una cadena" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Cadena nova" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Llig des de la &font de dades" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "Nom del &fitxer:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "Ca&mp:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Valor: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Traç" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Sense llapis" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Línia contínua" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Línia de guions" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Línia de punts" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Línia guió-punt" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Línia guió-punt-punt" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Línia de guions personalitzada" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Sense pinzell" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Patró sòlid" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Patró dens 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Patró dens 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Patró dens 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Patró dens 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Patró dens 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Patró dens 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Patró dens 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Patró horitzontal" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Patró vertical" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Patró creuat" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Patró diagonal 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Patró diagonal 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Patró diagonal creuat" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Unió en biaix" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Unió en bisell" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Unió arrodonida" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Unió en biaix SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Punta plana" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Punta quadrada" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Punta arrodonida" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "E&stil:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Amplada:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "&Color del pinzell:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Estil de &pinzell:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Estil d'&unió:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Estil de &punta:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: Obri una imatge SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Error en crear un objecte SVG des del fitxer Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Crea un SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Visualitza &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Reanomena la pestanya" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Introduïu el nom nou de pestanya:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Afig una pestanya" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Reanomena la pestanya" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "Tan&ca la pestanya" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "Vista d'&edició" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Personalitzada" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Tema" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Traç" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Tipus de lletres" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Mida del tipu&s de lletra:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Famíl&ia del tipus de lletra:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Cursiva" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Negreta" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " punts" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Guarda com a predeterminat" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Aplica als objectes existents" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vector" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Interval de temps" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Detecció de canvis" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "No actualitzes" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Edició de vector" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Vector nou" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Genera" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Nombre de mostres:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "El nombre de mostres de la variable independent nova." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&Des de:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "El valor mínim de la variable independent." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&a:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "El valor màxim de la variable independent." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Llig des de la &font de dades" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nom del fitxer:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "Ca&mp o columna:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Connecta" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigura..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "Tipus d'actualització. Useu «Interval de temps» per dades no locals." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Protegeix una disposició" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Personalitzada" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: Disposició de columna" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposició en columnes en orde de creació.\n" "Seleccioneu el nombre de columnes:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menú visualitza" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Vista d'edició" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Omple" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Edita" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Suprimeix" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Eleva" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Baixa" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automàtica" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Protegeix una disposició" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Columnes" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "B&loqueja la posició a les dades" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: Disposició de columna" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Disposició en columnes en orde de creació.\n" "Seleccioneu el nombre de columnes:" #: ../src/libkstapp/viewitem.cpp:1189 #, fuzzy, qt-format #| msgctxt "Kst::ViewItem|" #| msgid " Menu" msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr " Menú" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Neteja de disposició" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Gira" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Crea una disposició" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Afig un element a la disposició" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Mou" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Redimensiona" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Elimina" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Eleva" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Baixa" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Escala" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Gira" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Edició d'element de vista" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nom:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Edició múltiple >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Aparença" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Mida i posició" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Edita un" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Vista de matriu" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Visualitza els valors de cadena" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Visualitza els valors d'escalar" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Vista de la primitiva" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Actualitza" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Selecció de vectors a visualitzar" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Visualitza el/s vector/s seleccionat/s" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Elimina el/s vector/s seleccionat/s de la llista" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Elimina" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Xifres significatives" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Mostra com a enter" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (per defecte)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Visualitza els valors del vector" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Mostra la llista de vectors" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Oculta la llista de vectors" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Restaura la vista" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Tanca" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Hi ha un error en l'algorisme %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Connector: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Error: No s'ha pogut crear cap objecte de dades des del connector" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Error: No s'ha pogut trobar cap connector per l'objecte de dades" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Error en crear un objecte connector des del fitxer Kst." #: ../src/libkstmath/csd.cpp:130 #, fuzzy #| msgctxt "Kst::CSD|" #| msgid "Could not allocate sufficient memory for CSD." msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "" "No s'ha pogut assignar memòria suficient per al CSD (Decaïment espectral " "acumulat)." #: ../src/libkstmath/csd.cpp:195 #, fuzzy, qt-format #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Espectr&ograma" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Densitat espectral d'amplitud" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Densitat espectral de potència" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Espectre d'amplitud" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Freqüència" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Hora" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Espectrograma: %1\n" " Longitud FFT: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Mitjana; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Apoditza; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Elimina la mitjana;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/csdfactory.cpp:71 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating vector from Kst file." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Error en crear un vector des del fitxer Kst." #: ../src/libkstmath/csdfactory.cpp:88 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating Histogram from Kst file. Could not find Vector." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Error en crear un histograma des del fitxer Kst. No s'ha trobat cap Vector." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Corba" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 per %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Corba: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "X+ Error: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "X- Error: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Y+ Error: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Y- Error: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Línies: Amplada %1 i estil %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Punts: Estil %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Barres" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Error en crear una corba des del fitxer Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Error en crear una corba des del fitxer Kst. No s'ha trobat cap xVector." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Error en crear una corba des del fitxer Kst. No s'ha trobat cap yVector." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Explorant connectors d'objectes de dades." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() del tid=%2: en escriure la " "eixida del bloqueig %3 (no és un proveïdor) -- probablement això és un " "error. Per favor, envieu un correu a kst@kde.org amb els detalls." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "L'equació té un objecte desconegut [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Corba d'equació" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "L'equació [%1] ha fallat en trobar els seus vectors mentre es tornava a " "analitzar." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "L'equació [%1] ha fallat en trobar els seus vectors mentre es desava. El " "fitxer Kst resultant pot tindre problemes." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "L'equació [%1] té referències a objectes no existents." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "L'equació [%1] ha fallat en l'anàlisi. Els errors a sota." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Error d'anàlisi: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Equació: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Error en crear una equació des del fitxer Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Error en crear una equació des del fitxer Kst. No s'ha trobat cap xVector." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "Esdeveniment" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Esdeveniment: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Error en crear un EventMonitorEntry des del fitxer Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Número" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Percentatge" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fracció" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Freqüència normalitzada" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histograma de %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histograma: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Grups automàtics" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 grups des de %2 a %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Error en crear un histograma des del fitxer Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Error en crear un histograma des del fitxer Kst. No s'ha trobat cap Vector." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Imatge de %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Imatge: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Error en crear una imatge des del fitxer Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Error en crear una imatge des del fitxer Kst. No s'ha trobat cap matriu." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Any julià" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Hora estàndard C" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Data juliana" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Data juliana modificada" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Data juliana reduïda" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Temps atòmic internacional (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Hora de l'Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Cadena amb format" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Corba PSD" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "S'ha intentat crear un PSD que utilitza tota la memòria." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "PSD: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Densitat espectral" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "PSD" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Espectre d'amplitud" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Espectre de potència" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Freqüència" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Espectre: %1\n" " Longitud FFT: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Mitjana; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Apoditza; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Elimina la mitjana;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "En PSDCalculator::calculatePowerSpectrum: S'ha rebut una matriu d'eixida amb " "una longitud errònia." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Error en crear un PSD des del fitxer Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "Error en crear un PSD des del fitxer Kst. No s'ha trobat cap Vector." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, fuzzy, qt-format #| msgctxt "ActivityLevelSource|" #| msgid "" #| "Activity Level: %1\n" #| " Sampling Time: %2 (ms)\n" #| " Window width: %3 (s)\n" #| " Noise Threshold: %4 \n" msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Nivell d'activitat: %1\n" " Temps de mostreig: %2 (ms)\n" " Amplada de finestra: %3 (s)\n" " Llindar de soroll: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating vector from Kst file." msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Error en crear un vector des del fitxer Kst." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Temps de mostreig (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Amplada de finestra (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Llindar de soroll" #: ../src/plugins/dataobject/bin/bin.cpp:121 #, fuzzy #| msgctxt "Kst::BasicPluginTab|" #| msgid "Basic Plugin" msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Connector bàsic" #: ../src/plugins/dataobject/bin/bin.cpp:145 #, fuzzy #| msgctxt "ConvolveConfig|" #| msgid "Input Vector One" msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Mida de grup" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "" #: ../src/plugins/dataobject/chop/chop.cpp:142 #, fuzzy #| msgctxt "ConvolveConfig|" #| msgid "Input Vector One" msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating Plugin Object from Kst file." msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Error en crear un objecte connector des del fitxer Kst." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 #, fuzzy #| msgctxt "ConvolveConfig|" #| msgid "Input Vector One" msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Vector d'entrada dos" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Longitud FFT = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Freqüència de mostreig" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Freq. mín. soroll blanc" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Freqüència de mostreig (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Fil&ter Plugin" msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Connector de fil&tres" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 #, fuzzy #| msgctxt "DataWizardPageVectors|" #| msgid "Search Filter" msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Filtre de cerca" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Temps de mostreig (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numerador (orde incremental)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Denominador (orde incremental)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Interaction mode" msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Mode d'interacció" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 #, fuzzy #| msgctxt "EquationTab|" #| msgid "Inte&rpolate to highest resolution vector" msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Inte&rpola a la resolució vectorial més alta" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 #, fuzzy #| msgctxt "FFTOptions|" #| msgid "Interpolate over &holes" msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Interpola sobre els &forats" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Vector d'entrada X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Fit Pl&ugin" msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Connector d'aj&ust" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 #, fuzzy #| msgctxt "Kst::DifferentiateCurvesDialog|" #| msgid "Line Width" msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Amplada de línia" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Vector de referència" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 #, fuzzy #| msgctxt "ConvolveConfig|" #| msgid "Input Vector One" msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 #, fuzzy #| msgctxt "LabelDimensionsTab|" #| msgid "Position" msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Posició" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 #, fuzzy #| msgctxt "PhaseConfig|" #| msgid "Period" msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Període" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Temps de vector d'entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Dades de vector d'entrada" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Factor de sobre-mostreig" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Factor mitjà de freqüència de Nyquist" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:339 #, fuzzy #| msgctxt "PhaseConfig|" #| msgid "Zero Phase" msgctxt "PhasePlugin|" msgid "Phase" msgstr "Fase zero" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Temps de vector d'entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Dades de vector d'entrada" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Període" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Fase zero" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Decalatge: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "" #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Valor de decalatge (punts, es permet negatiu)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 #, fuzzy #| msgctxt "ConvolveConfig|" #| msgid "Input Vector One" msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Vector d'entrada u" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "" #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Vector d'entrada" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Vector d'entrada X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Vector d'entrada Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Nombre de grups" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X mín" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X màx" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Vector d'entrada - Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Orde de filtratge:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Freqüència central / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Amplada de banda:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Orde de filtratge:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Freqüència central / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Amplada de banda:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Orde de filtratge:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Freqüència de tall / Freqüència de mostreig:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Filtratge %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Orde de filtratge:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Freqüència de tall / Freqüència de mostreig:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, fuzzy, qt-format #| msgctxt "CumulativeAverageSource|" #| msgid "Cumulative Average: %1\n" msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Mitjana acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 #, fuzzy #| msgctxt "CumulativeAverageSource|" #| msgid "Cumulative Average: %1\n" msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Mitjana acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Mitjana acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 #, fuzzy #| msgctxt "CumulativeAverageSource|" #| msgid "Cumulative Average: %1\n" msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Mitjana acumulada: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, fuzzy, qt-format #| msgctxt "Kst::DataWizardPageDataSource|update periodically" #| msgid "Time Interval" msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Interval de temps" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 #, fuzzy #| msgctxt "Kst::DataWizardPageDataSource|update periodically" #| msgid "Time Interval" msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Interval de temps" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Integral: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 #, fuzzy #| msgctxt "Kst::CSDTab|" #| msgid "Cumulative Spectral Decay" msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Decaïment espectral acumulat" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "" #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Pas (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, fuzzy, qt-format #| msgctxt "FilterDespikeSource|" #| msgid "Despiked %1" msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "S'han eliminats pics de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:144 #, fuzzy #| msgctxt "FilterDespikeSource|" #| msgid "Despiked %1" msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "S'han eliminats pics de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtre d'eliminació de pics: %1\n" " Espaiat: %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "S'han eliminats pics de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 #, fuzzy #| msgctxt "FilterDespikeSource|" #| msgid "Despiked %1" msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "S'han eliminats pics de %1" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Espaiat:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 #, fuzzy #| msgctxt "AsciiConfig|relative offset" #| msgid "Relative" msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Relatiu" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivada: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "" #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Pas (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, fuzzy, qt-format #| msgctxt "FilterUnwindSource|" #| msgid "Unwind %1" msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Terminació de %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 #, fuzzy #| msgctxt "FilterUnwindSource|" #| msgid "Unwind %1" msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Terminació de %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtre de terminació: %1\n" " %2 - %3\n" " Pas: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrada: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Terminació de %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 #, fuzzy #| msgctxt "FilterUnwindSource|" #| msgid "Unwind %1" msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Terminació de %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Vector d'entrada:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Mínim:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Màxim:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Pas màx. (%):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, fuzzy, qt-format #| msgctxt "FitExponentialUnweightedSource|" #| msgid " Unweighted Exponential" msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr " Exponencial no ponderat" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Residus d'ajustament exponencial" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 #, fuzzy #| msgctxt "FitExponentialUnweightedSource|" #| msgid "Exponential Fit to %1" msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitExponentialWeightedSource|" #| msgid " Weighted Exponential" msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr " Exponencial ponderat" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Residus d'ajustament exponencial" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 #, fuzzy #| msgctxt "FitExponentialUnweightedSource|" #| msgid "Exponential Fit to %1" msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Exponencial ajustat a %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, fuzzy, qt-format #| msgctxt "FitGaussianUnweightedSource|" #| msgid " Unweighted Gaussian" msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr " Gaussià no ponderat" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residus d'ajustament gaussià" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 #, fuzzy #| msgctxt "FitGaussianUnweightedSource|" #| msgid "Gaussian Fit to %1" msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitGaussianWeightedSource|" #| msgid " Weighted Gaussian" msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr " Gaussià ponderat" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Residus d'ajustament gaussià" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 #, fuzzy #| msgctxt "FitGaussianUnweightedSource|" #| msgid "Gaussian Fit to %1" msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Gaussià ajustat a %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, fuzzy, qt-format #| msgctxt "FitGradientUnweightedSource|" #| msgid " Unweighted Gradient" msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr " Gradient no ponderat" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Residus d'ajustament de gradient" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient ajustat al límit inferior" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient ajustat al límit superior" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 #, fuzzy #| msgctxt "FitGradientUnweightedSource|" #| msgid "Gradient Fit to %1" msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitGradientWeightedSource|" #| msgid " Weighted Gradient" msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr " Gradient ponderat" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Residus d'ajustament de gradient" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Gradient ajustat al límit inferior" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Gradient ajustat al límit superior" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 #, fuzzy #| msgctxt "FitGradientUnweightedSource|" #| msgid "Gradient Fit to %1" msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Gradient ajustat a %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ponderacions:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Fil&ter Plugin" msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Connector de fil&tres" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 #, fuzzy #| msgctxt "EffectiveBandwidthConfig|" #| msgid "Input Vector X" msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Vector d'entrada X" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 #, fuzzy #| msgctxt "Kst::CSD|" #| msgid "Frequency" msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Freqüència" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Escalar d'entrada - Freq. màx. 1/f^a" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Escalar d'entrada - Freq mín. soroll blanc" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Escalar d'entrada - Soroll blanc C" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, fuzzy, qt-format #| msgctxt "FitLinearUnweightedSource|" #| msgid " Unweighted Linear" msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr " Lineal no ponderada" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Lineal ajustada a %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Residus d'ajustament lineal" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineal ajustada al límit inferior" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineal ajustada al límit superior" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 #, fuzzy #| msgctxt "FitLinearUnweightedSource|" #| msgid "Linear Fit to %1" msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Lineal ajustada a %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitLinearWeightedSource|" #| msgid " Weighted Linear" msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr " Lineal ponderada" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Lineal ajustada a %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Residus d'ajustament lineal" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Lineal ajustada al límit inferior" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Lineal ajustada al límit superior" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 #, fuzzy #| msgctxt "FitGradientWeightedSource|" #| msgid " Weighted Gradient" msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr " Gradient ponderat" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, fuzzy, qt-format #| msgctxt "FitLorentzianUnweightedSource|" #| msgid " Lorentzian" msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr " Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residus d'ajustament de Lorentz" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 #, fuzzy #| msgctxt "FitLorentzianUnweightedSource|" #| msgid "Lorentzian Fit to %1" msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, fuzzy, qt-format #| msgctxt "FitLorentzianWeightedSource|" #| msgid " Weighted Lorentzian" msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr " Lorentz ponderada" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Residus d'ajustament de Lorentz" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 #, fuzzy #| msgctxt "FitLorentzianUnweightedSource|" #| msgid "Lorentzian Fit to %1" msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Ajustament de Lorentz a %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, fuzzy, qt-format #| msgctxt "FitPolynomialUnweightedSource|" #| msgid " Polynomial" msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr " Polinòmica" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajustament polinòmica a %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residus d'ajustament polinòmic" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 #, fuzzy #| msgctxt "FitPolynomialUnweightedSource|" #| msgid "Polynomial Fit to %1" msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Ajustament polinòmica a %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Orde:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, fuzzy, qt-format #| msgctxt "FitPolynomialWeightedSource|" #| msgid " Weighted Polynomial" msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr " Polinòmica ponderada" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Ajustament polinòmica a %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Residus d'ajustament polinòmic" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 #, fuzzy #| msgctxt "FitPolynomialUnweightedSource|" #| msgid "Polynomial Fit to %1" msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Ajustament polinòmica a %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Escalar d'entrada - Orde" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, fuzzy, qt-format #| msgctxt "FitSinusoidUnweightedSource|" #| msgid " Sinusoid" msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr " Sinusoïdal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïdal ajustada a %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residus d'ajustament sinusoïdal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 #, fuzzy #| msgctxt "FitSinusoidUnweightedSource|" #| msgid " Sinusoid" msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr " Sinusoïdal" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Harmònics:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Període:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, fuzzy, qt-format #| msgctxt "FitSinusoidWeightedSource|" #| msgid " Weighted Sinusoid" msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr " Sinusoïdal ponderada" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Sinusoïdal ajustada a %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Residus d'ajustament sinusoïdal" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 #, fuzzy #| msgctxt "FitSinusoidUnweightedSource|" #| msgid "Sinusoidal Fit to %1" msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Sinusoïdal ajustada a %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Vector d'entrada - X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vector d'entrada - Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Vector d'entrada - Pesos" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Escalar d'entrada - Harmònics" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Escalar d'entrada - Període" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Mostra de vector d'entrada" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Insereix un &vector nou" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Insereix un e&scalar nou" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Edita" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Insereix un e&scalar nou" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Insereix una &cadena nova" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Edita" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Paleta de c&olors:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Aparença" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Ponderació:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Tipus de punt" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Si s'ha activat «Mostra els punts», es dibuixarà el tipus de punt " "seleccionat en cada punt de dades." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Tipus de línia" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "" "Si s'ha activat «Mostra les línies», s'usarà l'estil de línia seleccionat." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "En activar això, es dibuixaran les línies entre els punts de dades." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Línies" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "En activar això, es dibuixaran els punts en cada punt de dades." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "P&unts" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Cap" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Gràfic de &barres" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Amplada de línia" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "" "Si s'ha activat «Mostra les línies», s'usarà l'amplada de línia seleccionada." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Mida:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Densitat dels punts:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Tots" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Alta" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Mitjana" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Baixa" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Emplaçament" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Escala els tipus de lletra" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Situa en un gràfic &nou" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "En una pestanya no&va" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "El nom del fitxer de dades que es llegirà per este vector." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Situa en un gràfic &existent " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "No situes en c&ap gràfic" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Disposició automàti&ca" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "&Graella personalitzada" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "Colu&mnes" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Protegeix la disposició existent" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Selecciona la corba a utilitzar." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "quadres" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Interval de dades" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Seleccioneu això per fer la mitjana conjunta dels quadres omesos. " "Proporciona un filtratge de pas baix simple." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Primer el &filtre «boxcar»" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Estalvia memòria fent un mostreig dispers de dades" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Seleccioneu això per ometre quadres, en lloc de llegir totes les dades. És " "útil per llegir fitxers de dades molt llargs però amb canvis lents." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Llig &1 mostra per:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "" "Seleccioneu això per llegir totes les dades fins el final del fitxer. " #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Ll&egeix fins el final" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "o" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Seleccioneu això per llegir les dades des del final del fitxer. Això és útil " "per per desplaçar les visualitzacions quan el fitxer l'està actualitzant pel " "final una altra aplicació." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "C&ompta des del final" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "Nombre de quadres a ometre, si s'ha seleccionat «Llig 1 mostra per»." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " quadre(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Inici:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "Inte&rval:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Introduïu un número (començant des de 0 pel primer valor), o el format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] per dates." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "L'índex de la primera dada llegida. Per fitxers ASCII, este és el numero de " "fila de la dada en el fitxer. Per fitxers basats en quadres, este és el " "primer quadre." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "La quantitat de dades a llegir en el vector. Per fitxers ASCII files, este " "és el nombre de files de dades. Per fitxers de quadres, pot haver-hi més " "d'una mostra per quadre. Les dates s'introdueixen en el format [[[[YYYY:]MM:]" "DD:]HH:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Fitxer no trobat.\n" "Verifiqueu el nom correcte de fitxer que s'ha indicat." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Opcions FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Per defecte" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "Cosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussià (Sigma personalitzada)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "Seleccioneu de la llista desplegable l'origen per a les barres d'error de " "l'eix y de la corba. Si se selecciona «Cap», no es dibuixaran barres d'error " "de l'eix y. Crea vectors nous amb la pestanya «Vectors»." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "Apodit&za" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "Fun&ció:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "E&limina la mitjana" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Longitud FFT: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Defineix la longitud de les FFT en generar l'espectre de potència. 2^10 = " "1024, etc. Quan més gran és el nombre, més gran serà el soroll i la " "resolució." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Mitjana interpola&da" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpola sobre els &forats" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Freqüència de &mostreig:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "La freqüència de mostreig amb la que s'han adquirit les mesures, per a una " "normalització adequada." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "" "Aplica noves especificacions de mostreig de dades als vectors seleccionats." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Unitats del vector:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Les unitats del vector de dades - per etiquetes automàtiques." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Unitats de velocitat" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "Les unitats de la velocitat de mostreig. Usada per les etiquetes " "automàtiques." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Sor&tida:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Densitat espectral d'amplitud (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Densitat espectral de potència (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Espectre d'amplitud (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Espectre de potència (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Obri un fitxer" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Tots els fitxers (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Directori de fitxers de registre" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Guarda el fitxer" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}," "\\overline{text supraratllat}, x^y, x_y. Els escalars, " "equacions, i elements vectorials es poden incrustar. Escalar: [V1/Mitjana]" ". Element vectorial: [V1[4]]. Equació: [=[V1/Mitjana]^2]. " "El caràcter [ es pot inserir com a \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "El text d'etiqueta. Es permet un subconjunt del LaTeX. Cliqueu «Ajuda» per a " "l'ajuda." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "Permet símbols del LaTeX, cadenes i escalars, i equacions incrustades." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "Eti&queta:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Ajuda" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La sintaxi per les etiquetes és un subconjunt derivat del LaTeX. La " "sintaxi acceptada és: \\[greeklettername] i \\[Greeklettername], \\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, " "\\partial, \\prod, \\pm, \\textcolor{nom color}{text " "acolorit}, \\textbf{text negreta}, \\textit{text cursiva}, " "\\t, \\sum, \\sqrt, \\underline{text subratllat}," "\\overline{text supraratllat}, x^y, x_y. Els escalars, " "equacions, i elements vectorials es poden incrustar. Escalar: [V1/Mitjana]" ". Element vectorial: [V1[4]]. Equació: [=[V1/Mitjana]^2]. " "El caràcter [ es pot inserir com a \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "El text d'etiqueta. Es permet un subconjunt del LaTeX. Vegeu «Què és això»." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccioneu un vector a utilitzar. Si voleu crear un vector nou, cliqueu en " "la icona de la dreta." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Crea un vector nou." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Obri un diàleg de vector per crear un vector nou, que esdevindrà el vector " "seleccionat." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Edita el vector seleccionat." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Obri un diàleg de vector per editar el vector seleccionat." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Diàleg" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Tanca" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Diàleg" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Cerca:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Seleccioneu un escalar a utilitzar. Si voleu crear un escalar nou, " "seleccioneu la icona de la dreta." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Crea un escalar nou." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Edita l'escalar seleccionat." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Seleccioneu una cadena a utilitzar. Si voleu crear una cadena nova, " "seleccioneu la icona de la dreta." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Crea una cadena nova." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Edita la cadena seleccionada." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Seleccioneu un vector a utilitzar. Si voleu crear un vector nou, cliqueu en " "la icona de la dreta." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Crea un vector nou" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Obri un diàleg de vector per crear un vector nou, que esdevindrà el vector " "seleccionat." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Edita el vector seleccionat." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Obri un diàleg de vector per editar el vector seleccionat." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Estris del Kst" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Decaïment espectral acumulat" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Edita un decaïment espectral acumulat" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Decaïment espectral acumulat nou" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "CSD: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Error en crear un CSD des del fitxer Kst." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "" #~ "Error en crear un CSD des del fitxer Kst. No s'ha trobat cap Vector." #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Edita " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Nou " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Edita " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " Connector" #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Nou " #, fuzzy # ~| msgctxt "AsciiSource|" # ~| msgid "reading field" #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "camp de lectura" #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Usa Open&GL" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "S'estan cercant les files..." #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "La cerca de files ha finalitzat" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Cerca de files: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "lectura de columna" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Depuració" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Depura" Kst-2.0.8/po/kst_common_uk.po0000644000175000017500000126755212362706252015233 0ustar synthsynth# Yuri Chornoivan , 2014. msgid "" msgstr "" "Project-Id-Version: kst_common\n" "PO-Revision-Date: 2014-06-06 07:44+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 1.5\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Застосувати ці параметри як типові" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Попередньо переглянути перші 1000 рядків у новому вікні" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Перші рядки " #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Перегляд]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "Заголовок" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Дані починаються з рядка:" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Читати назви полів з рядка:" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Читати одиниці з рядка:" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Позначки коментарів:" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Тут можна вказати декілька символів, наприклад «#!C», але це уповільнює " "читання файлів ASCII" #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Десятковий роздільник:" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Крапка" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Кома" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Компонування стовпчиків даних" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Відокремлення пробілами або табуляціями" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Нетиповий роздільник" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "Читання пришвидшиться, якщо кожному стовпчику буде призначено власну сталу " "ширину." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "" "Кожен стовпчик має\n" "власну сталу ширину" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Фіксована ширина" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Загальні параметри" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Обмеження розміру буфера:" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " МБ" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Використовувати потоки обробки" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Завжди приймати такі файли:" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Порожнє значення це:" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Нуль" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "Не число" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Попереднє значення" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Обробка дати і часу" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Значення" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Вважати вміст поля" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "значенням:" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Часу у форматі C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "секундами" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Індексом з частотою" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Гц" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Рядок форматування. Формат:" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Докладніший опис можна знайти у документації до QDateTime.
Ви можете " "скористатися комбінацією замінників y, M, d для дат і h, m, s, z для часу (z " "позначає мілісекунди).
Між стовпчиками дати і часу можна використовувати " "пробіли, але вам слід вибрати перший стовпчик для вектора X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr "" " d=день, M=місяць, y=рік, h=години, m=хвилини, s=секунди, z=мілісекунди" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Відступ" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Дата/Час:" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd-MM-yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Дата файла" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Відносно" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Перші рядки файла «%1»" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "У рядку %1 не може бути одразу назв полів та значень!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "У рядку %1 не може бути одразу списку одиниць та значень!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "У рядку %1 не може бути одночасно назв полів та одиниць!" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Несумісні параметри" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Засіб читання файлів ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Обробляємо «%1»…" #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Обробку «%1» завершено" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Обробка «%1»: %2 рядків" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Читання поля: " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "Створено INDEX" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Читання завершено: " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "читання…" #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "обробка…" #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Стовпчик %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Засіб читання DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Засіб читання даних зображень FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Засіб читання джерел даних Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Засіб читання джерел даних .mat Matlab" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Засіб читання netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Засіб читання даних QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Зразок засобу читання джерела даних" #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Засіб читання списку джерел" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Стовпчик %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Файл даних для матриці %1 не відкрито." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Файл даних для вектора %1 не відкрито." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Матриця даних: %1\n" " %2\n" " Поле: %3\n" " %4 ⨯ %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 з %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Файл даних для вектора %1 не відкрито." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Файл даних для числа %1 не відкрито." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Числові дані: %1 = %4\n" " %2\n" " Поле: %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%1 з %2 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "кадрів" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Шляхи пошуку додатків:" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Шукаємо додатки об’єктів даних." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Завантажено додаток: %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "помилка екземпляра для %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Файла «%1» не існує." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Не вдалося знайти джерело даних для «%1» (%2), але раніше його було " "знайдено. Щось не так з Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Файл даних для рядка %1 не відкрито." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Рядок даних: %1 = %4\n" " %2\n" " Поле: %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 з %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Файл даних для вектора %1 не відкрито." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Вектор даних: %1\n" " %2\n" " Поле: %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " Останні %1 кадрів." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Від кадру %1 до кінця." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 кадрів, починаючи з %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Читати 1 вибірку на %1 кадрів." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Осереднювати кожні %1 кадрів." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 з %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Помилка" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Попередження" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Зауваження" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Трасування" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Інше" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Версія Kst %1\n" "\n" "\n" "Журнал Kst:\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Додатки джерел даних:" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Придатний до редагування вектор: %1\n" " %2 значень" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Створений вектор: %1\n" " %2 значень від %3 до %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 точок від %1 до %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "У збереженій матриці міститься менше даних, ніж це було оголошено." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Матриця: %1\n" " %2 ⨯ %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Помилка під час створення матриці на основі файла Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "" "Помилка під час створення придатної до редагування матриці на основі файла " "Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Помилка під час створення матриці з даними на основі файла Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Число: %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Число: %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Значення: %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Помилка під час створення числа на основі файла Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Рядок: %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Помилка під час створення рядка на основі файла Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Постачальник: %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Вектор: %1\n" " %2 вибірок\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Помилка під час створення вектора на основі файла Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Помилка під час створення матриці на основі файла Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Файл даних для числа %1 не відкрито." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Числові дані: %1 = %4\n" " %2\n" " Поле: %3\n" " Кадр: %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 кадр %3 з %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 — програма для перегляду даних.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Модифікація %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Авторські права належать Barth Netterfield, 2000–2014

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage:
http://kst-plot.kde.org/
" msgstr "" "Домашня сторінка:
http://kst-plot.kde." "org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Будь ласка, повідомляйте про вади за допомогою пункту майстра звітування " "щодо вад у меню «Довідка».
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Автори і учасники розробки (упорядковано за абеткою):" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "Про Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Параметри Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Загальні" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Масштабування" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Сітка" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Властивості компонування" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Стрілка" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Помилка під час спроби створити об’єкт-стрілку на основі файла Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Створення стрілки" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Властивості" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Властивості стрілки" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Стрілка на &початку" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "Масштаб по&чаткової стрілки" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Розмір кінчика стрілки" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "Розмір кінчика стрілки буде пропорційним до цього значення." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Стрілка на &кінці" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "Масштаб кі&нцевої стрілки" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Вісь" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Грубо" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Звичайний" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Точно" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Дуже точно" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Суцільна лінія" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Штрихова лінія" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Пунктир" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Штрих-пунктир" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Штрих-подвійний пунктир" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Нетипова штрихова лінія" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Приховати ліву" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Приховати праву" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Приховування полів та міток" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Приховувати верхні" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Приховувати нижні" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Обертання міток" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Обертання:" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Режим основи/відступу" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Авто" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Увімкнено" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Вимкнено" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "К-ть цифр для вмикання автоматичного режиму основа/відступ:" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Гранична кількість цифр, потрібних для показу чисел для позначок, у разі " "перевищення якої програма повернеться до режиму «основа/відступ»." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Примусово встановлювати мінімальний для вісі відступ" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Масштаб" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Логарифмічний" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "Інвертувати напрям вісі, щоб значення спадали, а не зростали." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "У з&воротному порядку" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "Вісь є віссю часу" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Вважати значення з віссю значеннями часу." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Інтерпретація:" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Тип кодування часу" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "За віссю відкладається час, кодування якого можна вибрати тут." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Показ:" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Формат показу часу" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Якщо значення за віссю буде інтерпретовано як значення часу, показувати час " "за віссю у цьому форматі." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Часовий пояс:" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Формат дати і часу:" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm.ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Дата: y-M-d - Час: h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Основні позначки і лінії" #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "&Малювати позначки" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Малювати &лінії сітки" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "І&нтервал між основними:" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Щільність основних позначок" #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Вкажіть щільність основних позначок. Інтервал між основним позначками буде " "автоматично вибрано як 10 помножене на 1, 2 або 5. За допомогою цього пункту " "можна змінити інтервал між позначками у межах вказаного обмеження." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "С&тиль ліній сітки:" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Колір ліній сітки:" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Товщина:" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Допоміжні позначки і лінії" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Мал&ювати позначки" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Малювати лінії сітки" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Кі&лькість допоміжних позначок:" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Авто" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "Ст&иль ліній:" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Колі&р ліній:" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1: файл не знайдено. " #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Діалогове вікно" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "TextLabel" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Виберіть новий файл даних:" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Невідомий тип файла" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "&Налаштувати…" #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Змінити" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Пропустити" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Базовий додаток" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Редагування додатка %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Новий додаток %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Не вдалося створити об’єкт додатка з використанням наданих параметрів.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Вхідні і вихідні дані" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Прямокутник" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "" "Помилка під час спроби створити об’єкт-прямокутник на основі файла Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Створити прямокутник" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "32-бітова Windows" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "64-бітова Windows" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Майстер звітування щодо вад" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Версія Kst:" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "ОС:" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Щоб надіслати звіт про помилку, натисніть кнопку, розташовану нижче.\n" "Буде відкрите вікно навігатора на сторінці http://bugs.kde.org, де ви " "знайдете бланк, який треба заповнити.\n" "Інформацію, показану вище, буде надіслано на сервер." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Запустити майстра звітування про помилку" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Кнопка" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Помилка під час спроби створити об’єкт кнопки на основі файла Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Графік у декартовій системі" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "кадрів" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Недостатньо пам’яті" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Ви наказали програмі виконати читання %1 МБ даних, але, здається, у " "операційної системи є лише %2 МБ придатної до використання пам’яті. " "Потрібний обсяг даних завантажити неможливо." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Змінити вибірки даних" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Вибір векторів" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Файл початкових даних для векторів, позначених у цьому списку, буде змінено." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Вибрати усі вектори у списку." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "Дод&ати всі" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Додати" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Скасувати позначення усіх векторів у списку." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "Ви&лучити" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "Ви&лучити всі" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Файл не вдалося завантажити або у файлі не міститься даних." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "У потрібному вам файлі не визначено таке поле:\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "У потрібному вам файлі не визначено такі поля:\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Зміна файла даних" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Вибір за файлом походження" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Додати усі &з:" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Позначених векторів і матриць" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Файл початкових даних для векторів, позначених у цьому списку, буде змінено." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Вибрати усі вектори у списку." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "Дод&ати всі" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Додати" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Скасувати позначення усіх векторів у списку." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "Ви&лучити" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "Ви&лучити всі" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Новий файл даних" #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Файл:" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "З&мінити позначені вектори і матриці" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "Д&ублювати похідні об’єкти (криві, рівняння...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Дублювати позначені вектори і матриці" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Невідомий тип файлів" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "&Налаштувати…" #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Призначення кольорів кривої з файла" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Призначення кольорів" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Колір кривої на основі:" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "вектора &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "вектора &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Радіус" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "За &центром" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Пов’язати розташування з даними" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Коло" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Помилка під час спроби створити об’єкт кола на основі файла Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Створити коло" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Розмір і розташування" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "кінець" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Стовпчик %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Користування: -f <початковий кадр>\n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Користування: -n <кількість кадрів>\n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Користування: -s <кадрів на вибірку>\n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Користування: -P <назва графіка>\n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Користування: -T <назва вкладки>\n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Користування: -x <назва x-поля>\n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Користування: -e <назва поля помилки>\n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Користування: -r <частота вибірки>\n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Користування: -y <назва поля>\n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Не вказано файлів даних\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "файла %1 не існує\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Користування: -p <назва поля>\n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Користування: -h <назва поля>\n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Користування: -z <назва поля>\n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Користування: -F <файл даних>\n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Користування: --png <назва файла>\n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Користування: --print <назва файла>\n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Підняти у списку графіка: Alt+↑" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Опустити у списку графіка: Alt+↓" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Д&оступні об’єкти:" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Зняти позначення з усіх" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Позначити все" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Змінити" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Підняти у списку графіка: Alt+↑" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+↑" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Опустити у списку графіка: Alt+↓" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+↓" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "&Показані об’єкти:" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "buttonGroup" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "ЦЕ, І ВСЕ, ЩО НИЖЧЕ, ДЛЯ СКРИПТІВ. ЦЕ НЕ ПОВИННО БУТИ ПОКАЗАНО!" #: ../src/libkstapp/csddialog.cpp:43 msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Спектрограма" #: ../src/libkstapp/csddialog.cpp:132 msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Зміна спектрограми" #: ../src/libkstapp/csddialog.cpp:134 msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Нова спектрограма" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Вміст спектрограми" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Вектор даних:" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Розмір вікна:" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Параметри зображення" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Крива" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Редагування кривої" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Нова крива" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Вміст кривої" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Вектор вісі &X:" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Вектор вісі &Y:" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Поз&начка похибки +X:" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Позначка похибки &+Y:" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "Позначка похибки -X:" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Позначка похибки &-Y:" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "Ви&користовувати позначку похибки +X для -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "В&икористовувати позначку похибки +Y для -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "І&гнорувати під час автоматичного обчислення діапазонів за осями" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Назва:" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Авто" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Змінити декілька >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Змінити один %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Тут можна вказати фільтр (можна використовувати шаблони заміни)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Змінити" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Створити криву" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Створити спектр потужності" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Створити спектрограму" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Створити гістограму" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Застосувати фільтр" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Створити зображення" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Додати на графік" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Вилучити з графіка" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Застосувати апроксимацію" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Вилучити" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Керування даними" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Фільтрування:" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Всі стовпчики" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Назва" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Тип" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Вибірки" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Властивості" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "З врахуванням регістру" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Очистити" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Помилка під час спроби створити джерело даних на основі файла Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Періодично" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Виявлення змін" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Не оновлювати" #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Підняти у списку графіка: Alt+↑" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Опустити у списку графіка: Alt+↓" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "Доступно %1 векторів" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "Позначено %1 векторів" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Створити с&пектральні графіки. Параметри ШПФ можна вказати нижче:" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Недостатньо пам’яті" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Ви наказали програмі виконати читання %1 МБ даних, але, здається, у " "операційної системи є лише %2 МБ придатної до використання пам’яті. " "Потрібний обсяг даних завантажити неможливо." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "Створити графіки &XY. Властивості вектора вісі X можна вказати нижче:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Створити &з поля:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Використати &наявний:" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "" "Поле, у якому зберігаються значення за віссю X для кривих у системі " "координат XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Будь ласка, виберіть джерело даних, з яким " "має працювати програма. Типово, таким джерелом є файл, що містить точки або " "вектори даних.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Невідомий тип файлів" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Нала&штувати…" #: ../src/libkstapp/datawizardpagedatasource.ui:134 msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Тип оновлення. Скористайтеся пунктом «Інтерва часу» для нелокальних даних." #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Фільтри" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "С&творити фільтр…" #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Якщо хочете, виберіть " "фільтр, який слід застосувати до полів, дані яких буде прочитано:

" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Розташування кривих" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Усі криві на одному кресленні" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 новий графік на кожну криву" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "Циклі&чний перехід на" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " графіків" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "&Циклічний перехід між наявними графіками" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "&Усі криві на графіку" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Розташування графіків (вкладки)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Усі на &поточній вкладці" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Кожен на о&кремій вкладці" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY і спектри на &окремих нових вкладках" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Компонування графіка" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Автоматичне &компонування" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "&Нетипова сітка" #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "Стовпчики:" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "За&фіксувати наявне компонування" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Мітки" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Масштабувати усі мітки на вкладці" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Спільна вісь на вкладці" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Стиль к&ривих" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "Ли&ше лінії" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "Лише &точки" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Лі&нії і точки" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Режим вісі спектра" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "&Логарифмічна вісь X" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Ло&гарифмічна вісь Y" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Умовні позначення" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Увімкн." #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Вимкн." #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "&Авто" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "В&ертикально" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Підняти у списку графіка (Alt+↑)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+↑" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+↓" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Позначити (Alt-S): пересунути підсвічені поля зі списку доступних даних до " "списку позначених для креслення даних." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Вилучити (Alt-R): пересунути підсвічені поля зі списку позначених для " "креслення даних до списку доступних даних, які не буде накреслено." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Позначені дані: буде накреслено усі значення полів з цього списку." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Позначені дані: буде накреслено усіх поля з цього списку. Щоб вилучити поля " "з цього списку, перетягніть ці поля до списку доступних даних, двічі " "клацніть на пункті поля або позначте пункт поля і натисніть кнопку " "«Вилучити» (піктограму зі стрілочкою праворуч або комбінацію клавіш Alt-R). " "Порядок, у якому пункти полів показано у списку, відповідає порядку, у якому " "буде накреслено графіки." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Позначені дані:" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "Позначено 0 векторів" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Фільтр пошуку" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Фільтр пошуку: поля, які відповідають цьому фільтру, буде підсвічено і " "пересунуто на верхівку списку доступних даних. Передбачено підтримку " "шаблонів заміни «*» та «?»." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Додати напочатку і наприкінці критерію пошуку за фільтром замінник «*», щоб " "було знайдено усі запис, що містять критерій пошуку." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "По&шук" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "Вибір полів: буде накреслено дані з позначених полів." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Доступні дані: на цій панелі показано усі поля, які було вибрано для " "креслення. Щоб вибрати поле для креслення, пересуньте його до списку " "позначених даних: перетягніть його за допомогою миші, двічі клацніть на " "пункті у списку або позначте пункт поля і натисніть кнопку позначення " "(кнопка зі стрілкою праворуч або комбінація клавіш Alt-S)." #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Доступні дані:" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "— векторів доступно" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Версія %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Версія %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Діагностичне вікно Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Інформація про випуск" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Надіслати діагностичну інформацію поштою" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Журнал" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Рівень журналювання: " #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Помилка" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "П&опередження" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "За&уваження" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Трасування" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "Спо&рожнити" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Джерела даних" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Додаток" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Завантажений екземпляр" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "За&крити" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "Сталася помилка. Натисніть цю піктограму, щоб дізнатися більше." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Шрифти" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Letter" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Графік для журналу" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Нетипове" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "&Мінімальний розмір шрифту (у точках):" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Під час змін розміру вікна, розмір символів не буде меншим за це значення." #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Еталонний розмір панелі перегляду:" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "Якщо вікно матиме такі розміри, шрифти матимуть вказаний розмір." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Масштаб шрифтів змінюватиметься з розміром вікна або області друку. Якщо " "розміри вікна або області друку будуть такими, вказані розміри шрифтів " "будуть точними." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Нетиповий еталонний розмір (у см):" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Зберегти як типове" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Застосувати до наявних об’єктів" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Пересунути позначену властивість вище у списку пріоритетності" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Пересунути позначену властивість нижче у списку пріоритетності" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Додати позначену властивість до списку властивостей для циклічного переходу" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Вилучити позначену властивість зі списку властивостей для циклічного переходу" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Колір лінії" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Стиль точки" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Стиль лінії" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Товщина лінії" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Диференціювання кривих" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Позначення властивостей і порядок циклічного переходу" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Підняти у порядку позначення: Alt+↑" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+↑" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Опустити у порядку позначення: Alt+↓" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+↓" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Доступно:" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Вибрані:" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Параметри" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Максимальна товщина лінії:" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Щільність точок:" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "усі" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "висока" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "середня" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "низька" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Розмір і розташування" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Обертання:" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Розмір:" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "Р&озташування:" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "За&фіксувати співвідношення розмірів" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Пов’язати розташування з даними" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Не вдалося відкрити файл для записування." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Не вдалося відкрити файл для читання." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Форматування файла є помилковим. Під час його читання сталася помилка." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Виберіть об’єкти для редагування" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Фільтр:" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Очистити" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "Позна&чити все" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Еліпс" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Помилка під час спроби створити об’єкт еліпса на основі файла Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Створити еліпс" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Рівняння" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Редагування рівняння" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Нове рівняння" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Рівняння" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Р&івняння:" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Тут вкажіть формулу, до якої слід підставити змінну. Цією незалежною змінною " "має бути «x». Вектори і оператори можна вибрати з наведених вище списків." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Вектор значень &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Інте&рполювати до вектора з найвищою роздільністю" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Спостереження за подіями" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Редагування спостереження за подіями" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Монітор нових подій" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Сповіщення електронної поштою" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "С&повіщення:" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Вираз" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Вектори:" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Оператори:" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "π" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "SQRT()" #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "CBRT()" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "SEC()" #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "CSC()" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Числа:" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Вираз:" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Опис:" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Виконати:" #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "ELOG" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "С&повіщення:" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Налаштувати…" #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Журнал діагностики Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "П&опередження" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Помилка" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "За&уваження" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "&Записувати як:" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Експортування до файла графічних даних" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "&Базова назва:" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Формат файла:" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Розмір" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Ширина:" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Ширина зображення (у пікселях)." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Висота:" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Висота зображення (у пікселях)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "В&казати:" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "ширину і співвідношення розмірів" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "висоту і співвідношення розмірів" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Ширина і висота" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "розмір квадрата" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Збереження параметрів" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Не зберігати автоматично. Після натискання кнопки «Гаразд» або «Застосувати» " "зберегти одноразово." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "О&дноразове збереження" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Зберігати зображення за таймером" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Якщо позначено, зображення буде регулярно зберігатися із вказаним інтервалом " "між сеансами збереження. Це корисно, наприклад, для створення інтерактивних " "інтернет-зображень." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Автоз&береження кожні" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Таймер автозбереження" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "с" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Автоматично визначати с&уфікс" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Включити:" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "Формати векторних зображень" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "Формати растрових зображень" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Експортування векторів" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Вибір векторів" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Файл початкових даних для векторів, позначених у цьому списку, буде змінено." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Вибрати усі вектори у списку." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "Дод&ати всі" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Додати" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Скасувати позначення усіх векторів у списку." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "Ви&лучити" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "Ви&лучити всі" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "&Місце зберігання:" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Заповнення" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Без пензля" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Суцільне заповнення" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Щільний візерунок 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Щільний візерунок 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Щільний візерунок 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Щільний візерунок 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Щільний візерунок 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Щільний візерунок 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Щільний візерунок 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Горизонтальний візерунок" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Вертикальний візерунок" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Перехресний візерунок" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Діагональний візерунок 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Діагональний візерунок 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Діагональний перехресний візерунок" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Колір:" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "С&тиль:" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "&Лінійний градієнт" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "С&кинути градієнт" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Додаток" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Редагування додатка %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Новий додаток %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Не вдалося створити об’єкт додатка з використанням наданих параметрів.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Вибір додатків" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Назва додатка:" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Опис:" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Вхідні і вихідні дані" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "І&гнорувати під час автоматичного обчислення діапазонів за осями" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Загальне" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Оновлення файлів з динамічним вмістом з цією швидкістю або повільніше." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Мінімальний час між оновленням під час пошуку даних у файлах з динамічним " "вмістом. Якщо навантаження на систему буде значним, оновлення " "відбуватиметься повільніше." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Інтервал між оновленням (у мс):" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Використовувати прозорість під час перетягування" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "Показ за допомогою «raster». Працює завжди." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Обробка зображення з використанням можливостей рушія растрової побудови " "зображення («raster») на певних архітектурах може бути швидшою. Втім, вона " "може призвести до значних проблем (залежно від якості драйвера до " "відеокартки) на інших архітектурах. Використання цього рушія може допомогти, " "а може і призвести до того, що все піде зовсім не так, як вам того хочеться." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "Використовувати рушій «raster» (Kst доведеться перезапустити)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "З&гладжувати графіки" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Сітка" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Показувати с&ітку" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "&Чіплятися до сітки" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "&Горизонтальний інтервал сітки:" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "&Вертикальний інтервал сітки:" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Гістограма" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Редагування гістограми" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Нова гістограма" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Властивості гістограми" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Ве&ктор даних:" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "Інтервали ві&д:" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "Нижня межа інтервалу найменших значень. Значення, менші за це значення, не " "буде враховано у жодному з інтервалів." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "до:" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "Верхня межа інтервалу найбільших значень. Значення, більші за це значення, " "не буде враховано у жодному з інтервалів." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "К-ть і&нтервалів:" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Кількість інтервалів на гістограмі." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "" "Встановити верхню і нижню межі, а також кількість інтервалів у прийнятні " "типові значення." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "А&втоінтервали" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "&Інтерактивні автоінтервали" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Нормалізація за віссю Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "Вісь Y гістограми відповідає за частку значень вибірок у інтервалі." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Частка у інтервалі" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "Вісь Y гістограми відповідає за кількість значень вибірок у інтервалі." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "&Кількість у інтервалі" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "" "Значення за віссю Y на гістограмі нормалізовано так, щоб найбільше значення " "на інтервалах дорівнює 1." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "Піковий стовпчик = &1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "Вісь Y гістограми відповідає за відсоткове значення вибірок у інтервалі." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Відс&оток у інтервалі" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Зображення" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Редагування зображення" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Нове зображення" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Вміст зображення" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Матриця:" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Тип зображення" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "К&ольорова карта" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Ко&нтурна карта" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "Ко&льорова і контурна карта" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Параметри кольорової карти" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&верхнє:" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Порогові значення — &нижнє:" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Кмітливо" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Про&центиль:" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "М&акс./Мін." #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "&Інтерактивне автоматичне порогове значення" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Параметри контурної карти" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Ко&лір:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Кі&лькість контурів рівнів:" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Вага:" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "З&мінна товщина лінії" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Діалогове вікно створення мітки" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Діалогове вікно" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Пов’язати розташування з даними" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "Праворуч" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "Ліворуч" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Точка відліку:" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Напівжирний" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " точок" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "&Гарнітура шрифту:" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Колір" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Розмір шри&фту:" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Курсив" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Зберегти як типове" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Пов’язати розташування з даними" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "праворуч" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "ліворуч" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Точка відліку мітки:" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Обертання" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Позиція" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Мітка" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Створення мітки" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Властивості" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Розмір і розташування" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Властивості мітки" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "Синтаксис міток запозичено як підмножину команд LaTeX. Підтримувані " "синтаксичні конструкції: \\[назва грецької літери] і \\[Назва " "прописної грецької літери], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{назва кольору}{фрагмент розфарбованого тексту}, \\textbf" "{текст напівжирним}, \\textit{текст курсивом}, \\t, " "\\sum, \\sqrt, \\underline{підкреслений фрагмент тексту}, " "x^y, x_y. Можна вбудовувати числа, рівняння та елементи " "векторів. Число: [V1/Mean]. Елемент вектора: [V1[4]]. " "Рівняння: [=[V1/Mean]^2]. Символ [ можна ввести так: \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Розмір шри&фту:" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "&Гарнітура шрифту:" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Курсив" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Напівжирний" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " точок" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Мітки" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "Типовий &розмір шрифту на графіку:" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "точки" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Автоматичне масштабування числових міток на осях" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "&Верхня мітка:" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Авто" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "&Нижня мітка:" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "&Ліва мітка:" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "&Права мітка:" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Показати &умовні позначення" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "З&мінити" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Передбачено підтримку чисел і рядків (назви у квадратних дужках), наприклад " "[INDEX:Max (X2)],\n" "вбудованих рівнянь, наприклад [=[INDEX:Max] / 2]\n" "та символів LaTeX, наприклад \\theta. Також передбачено підтримку " "автоматичного доповнення назв та символів." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Панель компонування" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Компонування" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "&Горизонтальне поле:" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "&Вертикальне поле:" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "&Горизонтальний інтервал:" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "В&ертикальний інтервал:" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Умовні позначення" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 від %2" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Порожні умовні позначення" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Графік: %1 \n" "Вміст:\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Умовні позначення" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Підняти у списку: Alt+↑" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Опустити у списку: Alt+↓" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Заголовок:" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Використовувати автоматичний вміст на основі графіка" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Показувати &вертикально" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Д&оступні об’єкти:" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "&Показані об’єкти:" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Підняти у списку графіка: Alt+↑" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+↑" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Вилучити: Alt+R" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Позначити: Alt+S" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Опустити у списку графіка: Alt+↓" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+↓" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Параметри шрифтів умовних позначень" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "Ро&змір шрифту:" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " точки" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Напівжирний" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Курсив" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Гарнітура шрифту" #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "Т1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "Т2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Пов’язати розташування з даними" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "LineEdit" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "" "Помилка під час спроби створити об’єкт рядка редагування на основі файла Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Пряма" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Пересунути" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Змінити розмір" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Помилка під час спроби створити об’єкт прямої на основі файла Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Створити пряму" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Розмір і розташування" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Скрипт: виконується" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Скрипт: виконано" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Скрипт: повернуто код %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Помилка скрипту: не вдалося запустити" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Помилка скрипту: аварійне завершення" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Помилка скрипту:" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Створити запис журналу" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "Запустити скрип &ще раз" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Скрипт:" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Застосувати" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "&Закрити" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Повідомлення" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "П&овідомлення:" #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "Сп&орожнити" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Дані, виведені скриптом:" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Налаштування" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Властивості графіка" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Ширина:" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "ширину і співвідношення розмірів" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "висоту і співвідношення розмірів" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "ширину і висоту" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "розмір квадрата" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Висота:" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Висота зображення (у пікселях)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Формат файла:" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "Вк&азати:" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Ширина зображення (у пікселях)." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Локальний каталогу журналу:" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "Ск&рипт:" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "У списку аргументів можна використовувати замінники $user (користувач), " "$imagefile (файл зображення) і $messagefile (файл повідомлень)." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "&Користувач:" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst: запит щодо збереження" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "До документа внесено зміни.\n" "Зберегти зміни?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst: збереження файла" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "сеанси Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst: відкриття файла" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "Ви&лучити файли, яких не існує" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Докладніший опис: Довідка → Діагностичне вікно → Журнал." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Помилка під час спроби відкрити документ:\n" " «%1»\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Відкрити…" #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Відкрити новий сеанс" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Зберегти" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Зберегти поточний сеанс" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Зберегти &як…" #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "С&творити сеанс" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Завершити поточний сеанс і розпочати новий, порожній сеанс" #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Перезавантажити усі &джерела даних" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Перезавантажити джерела даних" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "&Надрукувати…" #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Надрукувати вміст поточної області перегляду" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Експортувати як зображення…" #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Експортувати графіку на диск" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Зберегти &вектори на диск…" #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Експортувати вектори до файла ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "З&аписати до журналу…" #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Внести запис до журналу" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "Н&ова вкладка" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Створити нову вкладку" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "З&акрити вкладку" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Закрити поточну вкладку" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "Ви&йти" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Завершити роботу програми" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Вектори" #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Показати усі вектори у електронній таблиці" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Числа" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Показати усі числа у електронній таблиці" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Матриці" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Показати усі матриці у електронній таблиці" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "&Рядки" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Показати усі рядки у електронній таблиці" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "&Назад на один екран" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Назад на один екран" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Вперед на один екран" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Вперед на один екран" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "Ві&длік з кінця" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "Встановити для усіх векторів даних режим відліку від кінця" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "Читати до кін&ця" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Встановити для усіх векторів даних режим читання до кінця" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Пауза" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Призупинити або поновити оновлення джерел даних" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Змінити діапазон ви&бірок даних…" #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Показати діалогове вікно зміни діапазону вибірок даних Kst" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Графік" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Створити графік на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Число" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Вектор" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Матриця" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "&Рядок" #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Крива" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "Р&івняння" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Спектр по&тужності" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "&Гістограма" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "З&ображення" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Спект&рограма" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Спостереження за по&діями" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Мітка" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Створити мітку на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "Пр&ямокутник" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Створити прямокутник на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "Ко&ло" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Створити коло на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Еліпс" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Створити еліпс на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "П&ряма" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Створити лінію на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "С&трілка" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Створити стрілку на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Малюнок" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Створити малюнок на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Створити рисунок svg на поточній панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "&Панель спільної вісі" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Створити панель спільної вісі для поточного запису" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "&Увімкнути або вимкнути пов’язане масштабування" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "" "Увімкнути або вимкнути режим пов’язаного масштабування для поточної панелі " "перегляду" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Пов’&язати на усіх вкладках" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Пов’язане масштабування із синхронізацією за усіма вкладками" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Підсвічувати точки даних" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Підсвітити найближчу точку даних" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Масштабування/Гортання за X і Y" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Довільне масштабування у напрямках X та Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Масштабування лише за &X" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Масштабування лише у напрямку X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Масштабування лише за &Y" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Ре&жим компонування" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Увімкнути або вимкнути режим компонування поточної панелі перегляду" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Керування даними" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Показати вікно керування даними Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Майстер &даних" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Показати вікно майстра даних Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Змінити &файл даних" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "Показати вікно зміни файла даних Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Призначити &колір кривої для окремого файла" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Показати діалогове вікно вибору кольору Kst" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "&Диференціювання кривих" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Показати діалогове вікно диференціювання кривих Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Налаштувати Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Показати діалогове вікно налаштовування Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Тема" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Показати діалогове вікно вибору теми Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Ді&агностичне вікно" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Показати діалогове вікно діагностики роботи Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Ма&йстер звітування щодо вад" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Показати вікно майстра звітування щодо вад у Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "Пр&о програму" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Показати панель даних щодо Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Файл" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "&Останні сеанси" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "Нещодавні &файли даних" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "З&міни" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "П&ерегляд" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "&Діапазон" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "С&творити" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "С&тандартний додаток" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Д&одаток апроксимації" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Додаток фі&льтрування" #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Анотація" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Режим" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Режим взаємодії" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "&Інструменти" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "П&араметри" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "&Довідка" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Файл" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Змінити" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Інструменти" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Діапазон даних" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Режим" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Компонування графіка" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Розширене компонування" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Готово" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Маркери" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Суцільна лінія" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Штрихова лінія" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Пунктир" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Штрих-пунктир" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Штрих-подвійний пунктир" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Нетипова штрихова лінія" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "На графіку вже існує маркер для рівного (або дуже близького) значення." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "Введений вами текст не є коректним записом числа." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Маркери осей" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Нова точка з маркером: " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Додати" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "По&точні маркери" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "Сп&орожнити" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "Ви&лучити" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Вигляд маркера" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "Ст&иль ліній:" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Колі&р ліній:" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "&Товщина ліній:" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Автоматичне маркування" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Використовувати криву як &джерело маркерів:" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Створити маркери:" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "з к&раю зростання" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "з кра&ю спадання" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "на &обох краях" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Використовувати в&ектор як джерело маркерів:" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Матриця" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Редагування матриці" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Нова матриця" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Масштабування і перенесення" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "Роз&мір кроку за X:" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "Мінімальне &X:" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "Мінімальне &Y:" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Розмір &кроку за Y:" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Параметри градієнта" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Збільшувати або зменшувати значення Z вздовж:" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "вісі X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "вісі Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z у мінімумі:" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Кроків за X:" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Кроків за Y:" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z у максимумі:" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Діапазон даних" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "або" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "По&чатковий кадр за Y:" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "К&ількість кадрів за X:" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "Від&лік з кінця" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "&Читати до кінця" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "Кі&лькість кадрів за Y:" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Ч&итати до кінця" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "В&ідлік з кінця" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "Початкови&й кадр за X:" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " кадрів" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Спочатк&у фільтрування серій імпульсів" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Читати &1 вибірку на" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Джерело" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Читати з джерела даних" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Створити градієнт" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Параметри джерела даних" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "По&ле або стовпчик:" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Назва файла:" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "З’&єднати" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "На&лаштувати…" #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "Доступно %1 МБ" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "Ро&змір шрифту:" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "&Гарнітура шрифту:" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "Ви&користати типовий шрифт графіка" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " точки" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Малюнок" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst: відкриття зображення" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Помилка під час спроби створити об’єкт малюнка на основі файла Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Створення малюнка" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [років]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [днів]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [годин]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [хвилин]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [секунд]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Графік" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Максимальний масштаб" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Масштабування без врахування максимальних піків" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Попередній масштаб" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Пов’язаний масштаб" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Пов’язаний масштаб за X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Пов’язаний масштаб за Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Масштабування за середнім центрованим Y" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Максимальний масштаб за X" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Масштабування за X з автоматичною рамкою" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Масштабування за X без врахування максимальних піків" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Масштабування за X праворуч" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Масштабування за X ліворуч" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Зменшення за X" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Збільшення за X" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Нормалізувати вісь X відповідно до вісі Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Логарифмічна вісь X" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Масштабування за Y, локальний максимум" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Максимальний масштаб за Y" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Масштабування за Y з автоматичною рамкою" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Масштабування за Y без врахування максимальних піків" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Масштабування за Y, вгору" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Масштабування за Y вниз" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Зменшення за Y" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Збільшення за Y" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Нормалізувати масштаб за Y до масштабу за X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Логарифмічна вісь Y" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Скоригувати масштаб кольорів зображення" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Максимізувати графік" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Спільні графіки на вісі X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Спільні графіки на вісі Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Розділити панель спільної вісі" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Копіювати координати" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Копіювати координату X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Копіювати координату Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Копіювати" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Масштабування" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Фільтрування" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Редагування кривої" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Апроксимація" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Параметри панелі спільної вісі" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Дані, скопійовані до буфера: " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Координата X, скопійована до буфера: " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Координата Y, скопійована до буфера: " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Графік: %1 \n" "Вміст:\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Порожній графік" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Помилка під час спроби створити об’єкт графіка на основі файла Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Створення графіка" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Створити графік для кривої" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Вираз фіксованого масштабу" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Вираз діапазону масштабу за X" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Максимальний масштаб" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Масштабування без врахування максимальних піків" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Масштабування за середнім центрованим" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Масштабування за середнім центрованим X" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Масштабування за середнім центрованим Y" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Максимальний масштаб за X" #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Масштабування за X з автоматичною рамкою" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Масштабування X без піків" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Гортати за X праворуч" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Гортати за X ліворуч" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Зменшити за X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Збільшити за X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Нормалізація X до Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Масштабування за Y, локальний максимум" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Максимальний масштаб за Y" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Масштабування за Y з автоматичною рамкою" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Масштабування Y без піків" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Масштабування Y вгору" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Масштабування Y вниз" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Зменшити за Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Збільшити за Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Нормалізація Y до X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Логарифмічне масштабування за X" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Логарифмічне масштабування за Y" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Редагування запису графіка" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Вміст" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Шрифт згори" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Шрифт внизу" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Шрифт ліворуч" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Шрифт праворуч" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Шрифт вісі" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Мітки" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Діапазон/Масштаб" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Вісь X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Вісь Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Маркери вісі X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Маркери вісі Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Шрифт згори*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Шрифт внизу*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Шрифт ліворуч*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Шрифт праворуч*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Шрифт вісі*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Обробка графіка" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Еталонний режим" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 від %2" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Спектр потужності" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Редагування спектра потужності" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Новий спектр потужності" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Вміст спектра потужності" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "&Вектор даних:" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Назва" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Значення" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Діапазон" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Режим масштабування за X " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "&Авто" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Автоматичний з &рамкою" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Ав&томатичний з усуванням піків" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "&Центрування за серединою, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "ді&апазон: " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "&Фіксований, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "ві&д: " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "д&о: " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "МАЄ БУТИ ПРИХОВАНО" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Режим масштабування за Y " #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Авто" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Автоматичний з &рамкою" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Авто&матичний з усуванням піків" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "Це&нтрування за серединою, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "&діапазон: " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "Фі&ксований, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "в&ід: " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&до: " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Число" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Редагування числа" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Нове число" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Читати з джерела дани&х" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "Створити вектор з вказаними тут властивостями як незалежну змінну." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Читати з &вектора даних" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "С&творити" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Читання з джерела даних" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Назва файла:" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "&Поле:" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "З’&єднати" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "&Налаштувати…" #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "&Кадр:" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "або" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Позначте цей пункт, щоб читання даних виконувалося з кінця файла. Таке " "читання може бути корисним для інтерактивного показу даних, які дописуються " "до файла іншою програмою." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&останній кадр" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Створити" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "З&начення: " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Максимальне значення незалежної змінної." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Назва" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Тип" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Вибірки" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Властивості" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Панель спільної вісі" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Розділити панель спільної вісі" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "" "Помилка під час спроби створити об’єкт sharedaxisbox на основі файла Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Створити панель спільної вісі" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Рядок" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Редагування рядка" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Новий рядок" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Читати з джерела дани&х" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "Назва &файла:" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "По&ле:" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "З'&єднати" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "&Налаштувати…" #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "С&творити" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "З&начення: " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Штрих" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Без пера" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Суцільна лінія" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Штрихова лінія" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Пунктир" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Штрих-пунктир" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Штрих-подвійний пунктир" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Нетипова штрихова лінія" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Без пензля" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Суцільне заповнення" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Щільний візерунок 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Щільний візерунок 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Щільний візерунок 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Щільний візерунок 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Щільний візерунок 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Щільний візерунок 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Щільний візерунок 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Горизонтальний візерунок" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Вертикальний візерунок" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Перехресний візерунок" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Діагональний візерунок 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Діагональний візерунок 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Діагональний перехресний візерунок" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "З’єднання під кутом" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Скісне з’єднання" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Скруглене з’єднання" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "З’єднання під кутом (SVG)" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Плоска вершина" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "квадратний кінчик" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "круглий кінчик" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "С&тиль:" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Товщина:" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "Колір п&ензля:" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Стиль &пензля:" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Стиль &з’єднання:" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Стиль &кінчика:" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst: відкриття зображення SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Помилка під час спроби створити об’єкт SVG на основі файла Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Створення SVG" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Переглянути &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Перейменувати вкладку" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Вкажіть нову назву вкладки:" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Додати вкладку" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "Пере&йменувати вкладку" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "&Закрити вкладку" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "З&мінити панель перегляду" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Спорожнити компонування" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Автоматично" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Нетипове" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Тема" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Заповнення" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Штрих" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Шрифти" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "Розмір &шрифту:" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "&Гарнітура шрифту:" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Курсив" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Напівжирний" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " пунктів" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Зберегти як типове" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Застосувати до наявних об’єктів" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Вектор" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Періодично" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Виявлення змін" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Не оновлювати" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Редагування вектора" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Новий вектор" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "С&творити" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Кількість вибірок:" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Кількість вибірок для нової незалежної змінної." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&Від:" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Мінімальне значення незалежної змінної." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&до:" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Мінімальне значення незалежної змінної." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Читати з д&жерела даних" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Назва файла:" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "По&ле або стовпчик:" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "З’&єднати" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "&Налаштувати…" #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Тип оновлення. Скористайтеся пунктом «Інтерва часу» для нелокальних даних.." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Змінити" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Автоматично" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Зафіксувати компонування" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Нетипова" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst: компонування стовпчиків" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Компонування у стовпчики за порядком створення.\n" "Виберіть кількість стовпчиків:" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Спорожнити компонування" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Меню перегляду" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Редагування панелі перегляду" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Заповнення" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Змінити" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Вилучити" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Підняти" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Опустити" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Автоматично" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Зафіксувати компонування" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Стовпчики" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "Пов’&язати розташування з даними" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst: компонування стовпчиків" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Компонування у стовпчики за порядком створення.\n" "Виберіть кількість стовпчиків:" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Меню %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Спорожнити компонування" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Пересунути" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Змінити розмір" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Масштаб" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Обертати" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Створити компонування" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Долучити елемент до компонування" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Пересунути" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Змінити розмір" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Вилучити" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Підняти" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Опустити" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Змінити масштаб" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Обертати" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Редагування запису перегляду" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Назва:" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Змінити декілька >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Вигляд" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Розмір і розташування" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Змінити один" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Перегляд матриці" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Перегляд значень рядків" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Перегляд числових значень" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Перегляд примітива" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Оновити" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Виберіть вектори для перегляду" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Перегляд позначених векторів" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Вилучити позначені вектори з перегляду" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Вилучити" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Кількість значимих цифр після коми" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Показувати як ціле" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (типово)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Перегляд значень векторів" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Показати список векторів" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Приховати список векторів" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Оновити перегляд" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Закрити" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Помилка у алгоритмі %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Додаток: %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Помилка: не вдалося створити об’єкт даних з додатка" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Помилка: не вдалося знайти додаток для обробки об’єкта даних" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Помилка під час спроби створити об’єкт додатка на основі файла Kst." #: ../src/libkstmath/csd.cpp:130 msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Не вдалося отримати достатньо пам’яті для побудови спектрограми." #: ../src/libkstmath/csd.cpp:195 #, qt-format msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Спектрограма: %1" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Спектральна щільність амплітуди" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Спектральна щільність потужності" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Спектр амплітуди" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Спектр потужності" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Частота" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Час" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Спекторограма: %1\n" " Довжина ШПФ: 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Середнє; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Аподизація; " #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Вилучити середнє;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/libkstmath/csdfactory.cpp:71 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Помилка під час створення спектрограми на основі файла Kst." #: ../src/libkstmath/csdfactory.cpp:88 msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Помилка під час створення спектрограми на основі файла Kst. Не вдалося " "знайти вектор." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Крива" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 від %2" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 від %2" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Крива: %1\n" "X: %2\n" "Y: %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "Похибка X+: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "Похибка X-: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Похибка Y+: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Похибка Y-: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Лінії: товщина %1 і стиль %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Точки: стиль %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Стовпчики" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Помилка під час спроби створення кривої на основі файла Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Помилка під час створення кривої на основі файла Kst. Не вдалося знайти " "xVector." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Помилка під час створення кривої на основі файла Kst. Не вдалося знайти " "yVector." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Шукаємо додатки об’єктів даних." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() за tid=%2: запис блокування " "виведення %3 (не є надавачем) — ймовірно, це помилка. Будь ласка, повідомте " "про неї до kst@kde.org із зазначенням подробиць." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "У рівнянні виявлено невідомий об’єкт [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Крива за рівнянням" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "Не вдалося знайти вектори рівняння [%1] під час його повторної обробки." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "Не вдалося знайти вектори рівняння [%1] під час спроби його зберегти. " "Збережений файл Kst може виявитися проблемним." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "Рівняння [%1] посилається на об’єкти, яких не існує." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "Не вдалося обробити рівняння [%1]. Нижче наведено список помилок." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Помилка обробки: %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Рівняння: %1\n" " %2\n" "X: %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Помилка під час створення рівняння на основі файла Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Помилка під час створення рівняння на основі файла Kst. Не вдалося знайти " "xVector." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "подія" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Подія: %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "Помилка під час спроби створити EventMonitorEntry на основі файла Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Число" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Відсоток" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Частка" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Нормалізована частота" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Гістограма %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Гістограма: %1" #: ../src/libkstmath/histogram.cpp:414 msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" " Автоінтервали" #: ../src/libkstmath/histogram.cpp:416 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" " %1 інтервалів від %2 до %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Помилка під час створення гістограми на основі файла Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Помилка під час створення гістограми на основі файла Kst. Не вдалося знайти " "вектор." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Зображення %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Зображення: %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Помилка під час спроби створення зображення на основі файла Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Помилка під час спроби створення зображення на основі файла Kst. Не вдалося " "знайти матрицю." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Юліанський рік" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Стандартний час C" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Дата за юліанським календарем" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Дата за модифікованим юліанським календарем" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Скорочена дата за юліанським календарем" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Міжнародний атомний час (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Час Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY-MM-DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD-MM-YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr "<Текстова дата Qt> HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr "<Місцева дата Qt> HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Форматований рядок" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Крива СЩП" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "Спроба створити СЩП з використанням усього обсягу пам’яті." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "СЩП: %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Спектральна щільність" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "СЩП" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Спектр амплітуди" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Спектр потужності" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Частота" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Спектр: %1\n" " Довжина ШПФ: 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Середнє; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Аподизація; " #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Вилучити середнє;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "у PSDCalculator::calculatePowerSpectrum: отримано виведений масив помилкової " "довжини." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Помилка під час спроби створити діаграму СЩП на основі файла Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "" "Помилка під час створення діаграми СЩП на основі файла Kst. Не вдалося " "знайти вектор." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Рівень активності %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Рівень активності" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Рівень активності: %1\n" " Час дискретизації: %2 (с)\n" " Ширина вікна: %3 (с)\n" " Порогове значення шуму: %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Помилка: вектор вхідних даних є надто коротким." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Помилка: вікно має бути ширшим." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Рівень активності" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Обчислює рівень активності сигналу як добуток стандартного відхилення на " "кількість змін напрямку кривої у рухомому вікні." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Час вибірки (у сек.)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Ширина вікна (у сек.)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Порогове значення шуму" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "Об’єкт бінарного додатка" #: ../src/plugins/dataobject/bin/bin.cpp:145 msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "Помилка: немає інтервалів" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "Комбінування" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" "Комбінує дані до елементів вказаної місткості. У кожному елементі буде " "збережено середню величину значень, які містяться у цьому елементі." #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "Розмір інтервалу" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "Об’єкт додатка розрізання" #: ../src/plugins/dataobject/chop/chop.cpp:142 msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "Розрізання" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" "Розрізає вказаний набір даних на множини парних, непарних елементів, різниць " "та індексу." #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Об’єкт додатка згортання" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Помилка: вектори вхідних даних — некоректний розмір" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Помилка: обчислено некоректну довжину вхідних даних" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Згортання" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Створює згортання одного вектора з іншим." #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Перший вектор вхідних даних" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Другий вектор вхідних даних" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Об’єкт додатка розгортання" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "Помилка: вектори вхідних даних — некоректний розмір" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "Помилка: обчислено некоректну довжину вхідних даних" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Розгортання" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Створює розгортання одного вектора з іншим." #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Перший вектор вхідних даних" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Другий вектор вхідних даних" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Об’єкт додатка автокореляції" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Помилка: обчислено некоректну довжину вхідних даних" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Автокореляція" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Створює дані автокореляції вектора." #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Перехресна кореляція" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "Помилка: вектори вхідних даних — некоректний розмір" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "Помилка: обчислено некоректну довжину вхідних даних" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Перехресна кореляція" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Створює дані щодо перехресної кореляції одного вектора даних з іншим." #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Перший вектор вхідних даних" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Другий вектор вхідних даних" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Об’єкт додатка перехресного спектра даних" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Додаток об’єкта даних перехресного спектра" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "" "Створює дані перехресного степеневого спектра одного вектора даних з іншим." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Перший вектор вхідних даних" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Другий вектор вхідних даних" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Довжина ШПФ = 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Частота дискретизації" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Об’єкт додатка ефективної смуги даних" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "Помилка: довжини векторів вхідних даних X та Y є різними" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "Помилка: некоректні обчислені індекси" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Ефективна смуга" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Обчислює ефективну смугу на основі спектра амплітуд." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Мін. частота білого шуму" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Частота дискретизації (Гц)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Об’єкт додатка загального фільтрування" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "Помилка: рядок вхідних даних чисельника є порожнім" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "Помилка: рядок вхідних даних знаменника є порожнім" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Загальне фільтрування" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Створює дискретний фільтр на основі неперервного за часом визначення." #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Інтервал вибірки (у с)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Чисельник (у порядку зростання)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Знаменник (у порядку зростання)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Об’єкт додатка інтерполяції за Акімою" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Інтерполяція сплайнами за Акімою" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "Створює незгладжену інтерполяцію за Акімою для набору даних." #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Об’єкт додатка періодичної інтерполяції за Акімою" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Інтерполяція періодичними сплайнами за Акімою" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Створює незгладжену періодичну інтерполяцію за Акімою для набору даних." #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Об’єкт додатка інтерполяції кубічними сплайнами" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Сплайн інтерполяції кубічними сплайнами" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Створює інтерполяцію сплайнами для набору даних." #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Об’єкт додатка інтерполяції періодичними кубічними сплайнами" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Сплайн інтерполяції періодичними кубічними сплайнами" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Створює інтерполяцію кубічними сплайнами для набору даних." #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Об’єкт додатка лінійної інтерполяції" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Лінійна інтерполяція сплайнами" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Створює лінійну інтерполяцію для набору даних." #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Об’єкт додатка поліноміальної інтерполяції" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Сплайн поліноміальної інтерполяції" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Створює поліноміальну інтерполяцію для набору даних." #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Вектор вхідних даних — X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Об’єкт додатка лінійної апроксимації" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "Помилка: некоректна довжина вектора вхідних даних Y" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "Помилка: некоректна довжина вектора вхідних даних X" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Лінійна апроксимація" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Визначає найкращу апроксимацію прямою для вказаного набору даних." #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "Додаток об’єкта даних замикання" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "Помилка: вектори вхідних даних — некоректний розмір" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "Замикання" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "Замикання підсилює вхідні дані на основі еталонної хвилі-носія сигналу" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Еталонний вектор" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Об’єкт додатка додавання шуму" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Додавання шуму" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Додає гаусовий шум із вказаним стандартним відхиленням до набору даних." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "σ" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Об’єкт додатка періодограми" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "Помилка: довжини векторів вхідних даних є різними" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Періодограма" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" "Отримує outputVectorPeriodogram для вказаного набору inputVectorData. " "Вибірка inputVectorData не повинна бути розподілена на рівні інтервали " "inputVectorTime." #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Час з вектора вхідних даних" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Дані вектора вхідних даних" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Коефіцієнт передискретизації" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "Коефіцієнт середньої частоти Найквіста" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Об’єкти додатка фази" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "Помилка: вхідне скалярне значення фази має бути більшим за нуль." #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "Помилка: довжини векторів вхідних даних є різними." #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Фаза" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" "Розподіляє за фазами вхідні дані за вказаним періодом та нульовим значенням " "outputVectorPhase." #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Час з вектора вхідних даних" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Дані вектора вхідних даних" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Період" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Нульова фаза" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Об’єкт додатка зсуву" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Зсув: %1\n" " dX: %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Зсув" #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Зсуває (або обрізає) вектор." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Значення зсуву (к-ть точок, можна від’ємну)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Статистика %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Статистика" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Визначає статистику для вказаного вхідного вектора даних." #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Вектор вхідних даних" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "Об’єкт додатка синхронного комбінування" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "Помилка: некоректний розмір вектора вхідних даних X" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "Помилка: довжини векторів вхідних даних є різними" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "Помилка: інтервалів має бути принаймні 2" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "Синхронне комбінування" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" "Синхронне виконання дії coadd для комбінування вектора Y з inputScalarBins, " "визначеними вектором X. Подібне до одновимірного відображення." #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "Кількість інтервалів" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "Мін. X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "Макс. X" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "Смуга пропускання %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "Фільтрована %1" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Фільтр діапазону частот" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Фільтрує вектор вхідних даних за допомогою смугового фільтра з нульовою " "фазою та амплітудною відповіддю Баттерфорта." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Вектор вхідних даних – Y:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Порядок фільтрування:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Центральна частота/Частота дискретизації:" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Смуга пропускання:" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "Режекторне фільтрування %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "Фільтрована %1" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Режекторний фільтр" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Фільтрує вектор вхідних даних за допомогою смугового фільтра з нульовою " "фазою та амплітудною відповіддю Баттерфорта." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Вектор вхідних даних:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Порядок фільтрування:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Центральна частота/Частота дискретизації:" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Смуга пропускання:" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "Високі частоти %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "Фільтрована %1" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Фільтр високих частот" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Фільтрує вектор вхідних даних за допомогою фільтра високих частот з нульовою " "фазою та амплітудною відповіддю Баттерфорта." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Вектор вхідних даних:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Порядок фільтрування:" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Частота обрізання/Частота дискретизації:" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "Низькі частоти %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "Фільтрована %1" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Низькочастотний фільтр" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Фільтрує вектор вхідних даних за допомогою фільтра низьких частот з нульовою " "фазою та амплітудною відповіддю Баттерфорта." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Вектор вхідних даних:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Порядок фільтрування:" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Частота обрізання/Частота дискретизації:" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Накопичувальне середнє %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Накопичувальне середнє" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Накопичувальне середнє: %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Накопичувальне середнє" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Обчислює накопичувальне середнє для вектора вхідних даних." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Інтеграл %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Інтеграл" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Інтеграл: %1\n" " dX: %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Накопичувальна сума" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Обчислює накопичувальну суму (інтеграл) для вектора вхідних даних." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Крок (dX): " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y: " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "Згладжений %1" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Згладження" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Фільтр згладжування: %1\n" " Інтервал: %2\n" " Сигма обрізання: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "Згладжений %1" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Фільтр згладжування" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Знаходить і усуває піки за допомогою триточкових різниць." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Вектор вхідних даних:" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Інтервал: " #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "Сигма обрізання:" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Похідна %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Похідна" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Похідна: %1\n" " dX: %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "" "Помилка: значення кроку скалярних вхідних даних не повинне дорівнювати 0." #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Диференціювання зі сталим кроком" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Обчислює дискретну похідну за вектором вхідних значень функції" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y:" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Крок (dX):" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Розгортання %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Розгортання" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Фільтр розгортання: %1\n" " %2 — %3\n" " Крок: %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Вхід: %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Розгортання %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Фільтр розгортання" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Розгортає дані, які було згорнуто." #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Вектор вхідних даних:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Мінімум:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Максимум:" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Макс. крок (у %):" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "Незважена експоненційна %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "Експоненційна апроксимація %1" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "Лишки експоненційної апроксимації" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "Експоненційна апроксимація" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "Створює експоненційну апроксимацію для набору даних." #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "Зважена експоненційна %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "Експоненційна апроксимація %1" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "Лишки експоненційної апроксимації" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "Зважена експоненційна апроксимація" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "Створює зважену експоненційну апроксимацію для набору даних." #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ваги:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "Незважена гаусова %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "Гаусова апроксимація %1" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "Лишки гаусової апроксимації" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "Гаусова апроксимація" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "Створює гаусову апроксимацію для набору даних." #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "Зважена гаусова %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "Гаусова апроксимація %1" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "Лишки гаусової апроксимації" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "Зважена гаусова апроксимація" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "Створює зважену гаусову апроксимацію для набору даних." #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ваги:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "Незважена градієнтна %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "Градієнтна апроксимація %1" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "Лишки градієнтної апроксимації" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Нижня межа градієнтної апроксимації" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Верхня межа градієнтної апроксимації" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "Градієнтна апроксимація" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "Створює градієнтну апроксимацію для набору даних." #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "Зважена градієнтна %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "Градієнтна апроксимація %1" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "Лишки градієнтної апроксимації" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "Нижня межа градієнтної апроксимації" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "Верхня межа градієнтної апроксимації" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "Зважена градієнтна апроксимація" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "Створює зважену градієнтну апроксимацію для набору даних." #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Ваги:" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "Додаток наближення частоти зламів" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "Помилка: розміри векторів вхідних даних є різними" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Помилка: некоректний вектор вхідних даних X" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "Помилка: вхідні дані частот є некоректними\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "Помилка: некоректні вхідні дані.\n" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "Апроксимація частоти зламів" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "Створює наближення частоти зламів для набору даних." #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "Вхідне число — максимальна частота 1/f^a" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "Вхідне число — мін. частота білого шуму" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "Вхідне число — C білого шуму" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "Незважена лінійна %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "Лінійна апроксимація %1" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "Лишки лінійної апроксимації" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "Нижня межа лінійної апроксимації" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "Верхня межа лінійної апроксимації" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "Лінійна апроксимація" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "Створює лінійну апроксимацію для набору даних." #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "Зважена лінійна %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "Лінійна апроксимація %1" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "Лишки лінійної апроксимації" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "Нижня межа лінійної апроксимації" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "Верхня межа лінійної апроксимації" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "Зважена лінійна апроксимація" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "Створює зважену лінійну апроксимацію для набору даних." #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Вектор вхідних даних — значення ваги" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "Лоренцева %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "Лоренцева апроксимація %1" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Лишки лоренцевої апроксимації" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "Лоренцева апроксимація" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "Створює лоренцеву апроксимацію для набору даних." #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "Зважена лоренцева %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "Лоренцева апроксимація %1" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "Лишки лоренцевої апроксимації" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "Зважена лоренцева апроксимація" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "Створює зважену лоренцеву апроксимацію для набору даних." #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Вектор вхідних даних — значення ваги" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "Поліноміальна %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "Поліноміальна апроксимація %1" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "Лишки поліноміальної апроксимації" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "Поліноміальна апроксимація" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "Створює поліноміальну апроксимацію набору даних." #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Порядок:" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "Зважена поліноміальна %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "Поліноміальна апроксимація %1" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "Лишки поліноміальної апроксимації" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "Зважена поліноміальна апроксимація" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "Створює зважену поліноміальну апроксимацію набору даних." #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Вектор вхідних даних — значення ваги" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "Введіть число — порядок" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "Синусоїдальна %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Синусоїдальна апроксимація %1" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Лишки синусоїдальної апроксимації" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "Синусоїдальна апроксимація" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "Створює синусоїдальну апроксимацію для набору даних." #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "Гармоніка:" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Період:" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "Зважена синусоїдальна %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "Синусоїдальна апроксимація %1" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "Лишки синусоїдальної апроксимації" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "Зважена синусоїдальна апроксимація" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "Створює зважену синусоїдальну апроксимацію для набору даних." #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Вектор вхідних даних — X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Вектор вхідних даних — Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "Вектор вхідних даних — значення ваги" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "Введіть число — гармоніка" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "Введіть число — період" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "Зразок вектора вхідних даних" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Вставити новий &вектор" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Вставити нове &число" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Змінити" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Вставити нове &число" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Вставити новий &рядок" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Змінити" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Па&літра кольорів:" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Вигляд" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "&Вага:" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Тип точки" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Якщо позначено пункт «Показувати точки», кожну з точок даних буде " "намальовано з використанням вибраного тут типу точки." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Тип ліній" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "Якщо позначено пункт «Показувати лінії», стиль позначеної лінії." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "Позначте, щоб точки даних було з’єднано лініями." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Лінії" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "" "Позначте цей пункт, щоб позначені точки було намальовано для кожної точки з " "даних." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "&Точки" #: ../src/widgets/curveappearance.ui:164 msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Вершина" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Стовп&чикова діаграма" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Товщина лінії" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "Якщо позначено пункт «Показувати лінії», товщина позначеної лінії." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Розмір:" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Щільність точок:" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "усі" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "висока" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "середня" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "низька" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Розташування" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Масштабувати шрифти" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "Розташувати на &новому графіку" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "На нові&й вкладці" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "Назва файла даних, з якого буде прочитано цей вектор." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Розташувати на &наявному графіку " #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Не р&озташовувати на жодному графіку" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Автоматичне &компонування" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "&Нетипова сітка" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "С&товпчики" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "З&афіксувати наявне компонування" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "<Немає>" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Виберіть криву для використання." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "кадрів" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Діапазон даних" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Позначте для осереднення пропущених кадрів. Надає змогу скористатися " "фільтруванням низьких частот." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "Спочатк&у фільтрування серій імпульсів" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Зберегти пам’ять економним поділом даних на вибірки" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Позначте цей пункт, якщо слід пропускати кадри, а не читати усі дані. " "Корисно для читання дуже великих файлів з повільною зміною значень даних." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Читати &1 вибірку на:" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "Позначте цей пункт, якщо слід прочитати усі дані, аж до кінця файла." #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "&Читати до кінця" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "або" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Позначте цей пункт, щоб читання даних виконувалося з кінця файла. Таке " "читання може бути корисним для інтерактивного показу даних, які дописуються " "до файла іншою програмою." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "&Відлік з кінця" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Кількість кадрів, які слід пропустити, якщо позначено пункт «Читати 1 " "вибірку на»." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " кадрів" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Початок:" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "&Діапазон:" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Введіть число (від 0 до першого значення) або дані у форматі [[[[РРРР:]ММ:]" "ДД:]ГГ:]ХХ[.СС] для дат." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "Номер першого елемента даних для читання. Для файлів ASCII це номер рядка " "даних у файлі. Для файлів з поділом за кадрами, позиція першого кадру." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Обсяг даних, які слід прочитати до вектора. Для файлів ASCII це кількість " "рядків даних. Для файлів на основі кадрів, у кожному кадрі може бути " "декілька вибірок. Дати слід вводити у форматі [[[[РРРР:]ММ:]ДД:]ГГ:]ХХ[.СС]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Файл не знайдено.\n" "Перевірте, чи правильно вказано назву файла." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Параметри ШПФ" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Типова" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Бартлета" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Блекмена" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Конна" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "косинус" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Гаусова (нетипове СКВ)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Гаммінґа" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Ганна" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Велча" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "С&КВ:" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "" "З цього спадного списку виберіть вектор джерела даних для позначок похибок " "за віссю y для кривої. Якщо буде вибрано «<Немає>», позначки похибок для " "вісі y не буде намальовано. Нові вектори можна створити за допомогою вкладки " "«Вектори»." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "&Аподизація" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr "&Функція:" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "Ви&лучити середнє" #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Довжина ШПФ: 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Встановити довжину швидких перетворень Фур’є під час створення спектрального " "розкладу. 2^10 = 1024, тощо. Чим більшим буде це число, тим більшим буде шум " "і роздільна здатність." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Пере&міжне середнє" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Інтерполювати п&ропуски" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "&Частота дискретизації:" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "Частота, з якою відбувається вимірювання. Призначено для належної " "нормалізації" #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "Застосувати нові специфікації вибірок даних до позначених векторів." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "Одиниці векторів:" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "Одиниці вектора даних для автоматичного додавання міток." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "В" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Одиниці частоти:" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "" "Одиниці для частоти вибірки. Використовуються для створення автоматичних " "міток." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Гц" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "В&иведення:" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Спектральна щільність амплітуди (V/Гц^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Спектральна щільність потужності (V²/Гц)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Спектр амплітуди (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Спектр потужності (V²)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Відкриття файла" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "усі файли (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Каталог файлів журналу" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Збереження файла" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Синтаксис міток запозичено як підмножину команд LaTeX. Підтримувані " "синтаксичні конструкції: \\[назва грецької літери] і \\[Назва " "прописної грецької літери], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{назва кольору}{фрагмент розфарбованого тексту}, \\textbf" "{текст напівжирним}, \\textit{текст курсивом}, \\t, " "\\sum, \\sqrt, \\underline{підкреслений фрагмент тексту}, " "\\overline{надкреслений текст}, x^y, x_y. Можна " "вбудовувати числа, рівняння та елементи векторів. Число: [V1/Mean]. " "Елемент вектора: [V1[4]]. Рівняння: [=[V1/Mean]^2]. Символ " "[ можна ввести так: \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Текст мітки. Можна використовувати підмножину команд LaTeX. Натисніть кнопку " "«Довідка», щоб дізнатися більше." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Скаляри і " "рівняння
Скаляри і скалярні залежності може бути показано на " "мітках зображення у інтерактивному режимі. У разі зміни скаляра, таку мітку " "буде інтерактивно оновлено. Програма може автоматично доповнювати назви " "скалярів. Формат запису:

Скаляр: " "[назва_скаляра], наприклад [GYRO1:Mean(X4)]

Координата вектора:[назваВектора[індекс]], наприклад [GYRO1 (V2)[4]]

Залежність: [=залежність], " "наприклад [=[GYRO1:Mean(X4)]/[GYRO1:" "Sigma (X4)]]

Підтримувана підмножина команд LaTeX
Для міток у " "kst передбачено можливість використання підмножини команд LaTeX. " "Наприклад, для того, щоб записати рівняння для площі кола, ви можете " "скористатися міткою S=2\\pir^2. На відміну від класичного коду LaTeX для " "запису формули не потрібно додавати обмежувальні $. Крім того, на відміну " "від класичного LaTeX, змінні не буде автоматично показано курсивом. Якщо " "потрібно використати курсив у якійсь з частин формули, скористайтеся " "командою \\textit{}. Передбачено підтримку таких команд:

Грецькі літери: \\назва_літери або " "\\Назва_літери. Приклад: " "\\alpha

Інші символи: " "\\approx, \\cdot, \\ge,\\geq, \\inf, \\int, " "\\le, \\leq, \\ne, " "\\partial,\\prod, \\pm,\\sum, \\sqrt

Стиль тексту: \\textcolor{назва кольору}{текст, який слід розфарбувати}, \\textbf{текст напівжирним},\\textit{текст курсивом}," "\\underline{підкреслений " "текст},\\overline{надкреслений текст}.

Інше:" "x^y,x_y, \\t," "\\n, \\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Передбачено підтримку символів LaTeX, інтерактивних рядків та чисел та " "вбудовування рівнянь." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Мітка:" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Довідка" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "Синтаксис міток запозичено як підмножину команд LaTeX. Підтримувані " "синтаксичні конструкції: \\[назва грецької літери] і \\[Назва " "прописної грецької літери], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, " "\\ne, \\n, \\partial, \\prod, \\pm, " "\\textcolor{назва кольору}{фрагмент розфарбованого тексту}, \\textbf" "{текст напівжирним}, \\textit{текст курсивом}, \\t, " "\\sum, \\sqrt, \\underline{підкреслений фрагмент тексту}, " "\\overline{надкреслений текст}, x^y, x_y. Можна " "вбудовувати числа, рівняння та елементи векторів. Число: [V1/Mean]. " "Елемент вектора: [V1[4]]. Рівняння: [=[V1/Mean]^2]. Символ " "[ можна ввести так: \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "Текст мітки. Передбачено підтримку підмножини команд LaTeX. Див. довідку «Що " "це?»." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Виберіть вектор для використання. Якщо ви хочете створити вектор, натисніть " "піктограму, розташовану праворуч." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Створити вектор." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Відкрити діалогове вікно роботи з векторами для створення вектора, який " "стане новим позначеним вектором." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Внести зміни до позначеного вектора." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Відкрити діалогове вікно редагування поточного позначеного вектора." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Діалогове вікно" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Закрити" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Діалогове вікно" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Шукати:" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Виберіть число для використання. Якщо ви хочете створити число, натисніть " "піктограму, розташовану праворуч." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "…" #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Створити число." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Змінити позначене число." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "<Немає>" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Виберіть рядок для використання. Якщо ви хочете створити рядок, натисніть " "піктограму, розташовану праворуч." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "…" #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Створити рядок." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Редагувати позначений рядок." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "<Немає>" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Виберіть вектор для використання. Якщо ви хочете створити вектор, натисніть " "піктограму, розташовану праворуч." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Створити вектор" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Відкрити діалогове вікно роботи з векторами для створення вектора, який " "стане новим позначеним вектором." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Внести зміни до позначеного вектора." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Відкрити діалогове вікно редагування поточного позначеного вектора." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Віджети Kst" #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Кумулятивне затухання спектра" #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Редагування кумулятивного затухання спектра" #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Нове кумулятивне затухання спектра" #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "КЗС: %1" #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Помилка під час спроби створити діаграму КЗС на основі файла Kst." #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "" #~ "Помилка під час створення діаграми кумулятивного затухання спектра на " #~ "основі файла Kst. Не вдалося знайти вектор." #~ msgctxt "ActivityLevelSource|" #~ msgid "Actvity Level" #~ msgstr "Рівень активності" #~ msgctxt "Kst::AboutDialog|" #~ msgid "

Kst " #~ msgstr "

Kst " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "Edit " #~ msgstr "Редагувати додаток " #~ msgctxt "Kst::BasicPluginDialog|" #~ msgid "New " #~ msgstr "Новий додаток " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "Edit " #~ msgstr "Змінити додаток " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid " Plugin" #~ msgstr " " #~ msgctxt "Kst::FilterFitDialog|" #~ msgid "New " #~ msgstr "Створити " #~ msgctxt "AsciiSource|" #~ msgid "reading field ..." #~ msgstr "читаємо поле…" #~ msgctxt "GeneralTab|" #~ msgid "Use Open&GL" #~ msgstr "Вико&ристовувати OpenGL" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows ..." #~ msgstr "Шукаємо рядки…" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows finished" #~ msgstr "Пошук за рядками завершено" #~ msgctxt "AsciiSource|" #~ msgid "Searching for rows: %1" #~ msgstr "Пошук за рядками: %1" #~ msgctxt "AsciiSource|" #~ msgid "column read" #~ msgstr "читання стовпчиків" #~ msgctxt "Kst::Debug|" #~ msgid "Debug" #~ msgstr "Діагностика" #~ msgctxt "DebugDialog|" #~ msgid "&Debug" #~ msgstr "&Діагностика" #~ msgctxt "FillTab|" #~ msgid "reset fill gradient" #~ msgstr "скинути заповнення градієнтом" #~ msgctxt "CurveAppearance|" #~ msgid "curve color" #~ msgstr "колір кривої" #~ msgctxt "CircleDimensionsTab|" #~ msgid "geo X" #~ msgstr "геометрія за X" #~ msgctxt "CircleDimensionsTab|" #~ msgid "pos X" #~ msgstr "розташування за X" #~ msgctxt "CircleDimensionsTab|" #~ msgid "pos Y" #~ msgstr "розташування за Y" #~ msgctxt "ContentTab|" #~ msgid "insert object" #~ msgstr "вставити об’єкт" #~ msgctxt "ContentTab|" #~ msgid "remove object" #~ msgstr "вилучити об’єкт" #~ msgctxt "DimensionsTab|" #~ msgid "geo X" #~ msgstr "геометрія за X" #~ msgctxt "DimensionsTab|" #~ msgid "geo Y" #~ msgstr "геометрія за Y" #~ msgctxt "DimensionsTab|" #~ msgid "pos Y" #~ msgstr "розташування за Y" #~ msgctxt "DimensionsTab|" #~ msgid "pos X" #~ msgstr "розташування за X" #~ msgctxt "FillTab|" #~ msgid "fill color" #~ msgstr "колір заповнення" #~ msgctxt "FillTab|" #~ msgid "fill style" #~ msgstr "стиль заповнення" #~ msgctxt "FillTab|" #~ msgid "fill use linear gradient" #~ msgstr "заповнити за допомогою лінійного градієнта" #~ msgctxt "HistogramTab|" #~ msgid "-10.0" #~ msgstr "-10,0" #~ msgctxt "HistogramTab|" #~ msgid "10.0" #~ msgstr "10,0" #~ msgctxt "ImageTab|" #~ msgid "image contour color" #~ msgstr "колір контуру зображення" #~ msgctxt "LabelCreator|" #~ msgid "label bold" #~ msgstr "напівжирний для мітки" #~ msgctxt "LabelCreator|" #~ msgid "label color" #~ msgstr "колір мітки" #~ msgctxt "LabelCreator|" #~ msgid "label italic" #~ msgstr "курсив для мітки" #~ msgctxt "LabelDimensionsTab|" #~ msgid "geo X" #~ msgstr "геометрія за X" #~ msgctxt "LabelDimensionsTab|" #~ msgid "pos X" #~ msgstr "розташування за X" #~ msgctxt "LabelDimensionsTab|" #~ msgid "pos Y" #~ msgstr "розташування за Y" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label italic" #~ msgstr "курсив для мітки" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label color" #~ msgstr "колір мітки" #~ msgctxt "LabelPropertiesTab|" #~ msgid "label bold" #~ msgstr "напівжирний для мітки" #~ msgctxt "LabelTab|" #~ msgid "label bold" #~ msgstr "напівжирний для мітки" #~ msgctxt "LabelTab|" #~ msgid "label italic" #~ msgstr "курсив для мітки" #~ msgctxt "LabelTab|" #~ msgid "label color" #~ msgstr "колір мітки" #~ msgctxt "LayoutTab|" #~ msgid "layout horizontal margin" #~ msgstr "горизонтальне поле у компонуванні" #~ msgctxt "LayoutTab|" #~ msgid "layout vertical margin" #~ msgstr "вертикальне поле у компонуванні" #~ msgctxt "LayoutTab|" #~ msgid "layout horizontal spacing" #~ msgstr "горизонтальний інтервал у компонуванні" #~ msgctxt "LayoutTab|" #~ msgid "layout vertical spacing" #~ msgstr "вертикальний інтервал у компонуванні" #~ msgctxt "LegendTab|" #~ msgid "legend bold" #~ msgstr "напівжирний для умовних позначень" #~ msgctxt "LegendTab|" #~ msgid "legend italic" #~ msgstr "курсив для умовних позначень" #~ msgctxt "LegendTab|" #~ msgid "legend color" #~ msgstr "колір для умовних позначень" #~ msgctxt "LineDimensionsTab|" #~ msgid "pos X" #~ msgstr "розташування за X" #~ msgctxt "LineDimensionsTab|" #~ msgid "geo X" #~ msgstr "геометрія за X" #~ msgctxt "LineDimensionsTab|" #~ msgid "geo Y" #~ msgstr "геометрія за Y" #~ msgctxt "LineDimensionsTab|" #~ msgid "pos Y" #~ msgstr "розташування за Y" #~ msgctxt "Kst::LogWidget|" #~ msgid "%1%2 %3" #~ msgstr "%1%2 %3" #~ msgctxt "MarkersTab|" #~ msgid "marker color" #~ msgstr "колір маркера" #~ msgctxt "MarkersTab|" #~ msgid "SHOULD NOT BE VISIBLE" #~ msgstr "ЦЕ МАЄ БУТИ НЕ ВИДНО" #~ msgctxt "MatrixTab|" #~ msgid "0" #~ msgstr "0" #~ msgctxt "MatrixTab|" #~ msgid "1" #~ msgstr "1" #~ msgctxt "MatrixTab|" #~ msgid "100" #~ msgstr "100" #~ msgctxt "MatrixTab|" #~ msgid "count X From End" #~ msgstr "відлік X з кінця" #~ msgctxt "MatrixTab|" #~ msgid "read x to end" #~ msgstr "читати X до кінця" #~ msgctxt "MatrixTab|" #~ msgid "read Y To End" #~ msgstr "читати Y до кінця" #~ msgctxt "MatrixTab|" #~ msgid "count Y From End" #~ msgstr "відлік Y з кінця" #~ msgctxt "OverrideLabelTab|" #~ msgid "override label italic" #~ msgstr "примусово зробити мітку курсивною" #~ msgctxt "OverrideLabelTab|" #~ msgid "override label bold" #~ msgstr "примусово зробити мітку напівжирною" #~ msgctxt "OverrideLabelTab|" #~ msgid "override label color" #~ msgstr "примусово визначити колір мітки" #~ msgctxt "Kst::PlotRenderItem|" #~ msgid "%1 vs %2" #~ msgstr "%1 від %2" #~ msgctxt "ScalarTab|" #~ msgid "Data Source Field" #~ msgstr "Поле джерела даних" #~ msgctxt "ScalarTab|" #~ msgid "data vector field" #~ msgstr "поле вектора даних" #~ msgctxt "StrokeTab|" #~ msgid "stroke style" #~ msgstr "стиль штриха" #~ msgctxt "StrokeTab|" #~ msgid "stroke width" #~ msgstr "товщина штриха" #~ msgctxt "StrokeTab|" #~ msgid "stroke brush color" #~ msgstr "колір пензля для штриха" #~ msgctxt "StrokeTab|" #~ msgid "stroke brush style" #~ msgstr "стиль пензля для штриха" #~ msgctxt "StrokeTab|" #~ msgid "stroke join style" #~ msgstr "стиль з’єднання штрихів" #~ msgctxt "StrokeTab|" #~ msgid "stroke cap style" #~ msgstr "стиль кінчика штриха" #~ msgctxt "ThemeDialog|" #~ msgid "theme italic" #~ msgstr "курсив для теми" #~ msgctxt "ThemeDialog|" #~ msgid "theme color" #~ msgstr "колір для теми" #~ msgctxt "ThemeDialog|" #~ msgid "theme bold" #~ msgstr "напівжирний для теми" #~ msgctxt "VectorTab|" #~ msgid "-10.0" #~ msgstr "-10,0" #~ msgctxt "VectorTab|" #~ msgid "10.0" #~ msgstr "10,0" #~ msgctxt "AxisTab|" #~ msgid "JD" #~ msgstr "ЮД" #~ msgctxt "AxisTab|" #~ msgid "MJD" #~ msgstr "ЗЮД" #~ msgctxt "AxisTab|" #~ msgid "RJD" #~ msgstr "СЮД" #~ msgctxt "AxisTab|" #~ msgid "TAI" #~ msgstr "МАЧ" #~ msgctxt "CurveAppearance|" #~ msgid "line style" #~ msgstr "стиль лінії" #~ msgctxt "CurveAppearance|" #~ msgid "curve bar fill" #~ msgstr "заповнення площі під кривою" #~ msgctxt "CurveAppearance|" #~ msgid "curve head color" #~ msgstr "колір вершини кривої" #~ msgctxt "CurvePlacement|" #~ msgid "place In Existing Plot" #~ msgstr "розташувати на наявному графіку" #~ msgctxt "DataRange|" #~ msgid "start units" #~ msgstr "одиниці початку" #~ msgctxt "DataRange|" #~ msgid "range units" #~ msgstr "одиниці діапазону" #~ msgctxt "FFTOptions|" #~ msgid "60.0" #~ msgstr "60,0" #~ msgctxt "FFTOptions|" #~ msgid "Hz" #~ msgstr "Гц" Kst-2.0.8/po/kst_common_fr.po0000644000175000017500000111600412362706252015204 0ustar synthsynth# Vincent PINON , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "PO-Revision-Date: 2014-04-25 18:25+0200\n" "Last-Translator: Vincent PINON \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 1.5\n" "X-Environment: kde\n" "X-Accelerator-Marker: &\n" "X-Text-Markup: kde4\n" "X-Qt-Contexts: true\n" "X-Language: fr_FR\n" "X-Source-Language: C\n" "X-Qt-Contexts: true\n" #: ../src/datasources/ascii/asciiconfig.ui:40 msgctxt "AsciiConfig|" msgid "Apply these settings as default" msgstr "Appliquer ces paramètres par défaut" #: ../src/datasources/ascii/asciiconfig.ui:60 msgctxt "AsciiConfig|" msgid "Preview First 1000 Lines in New Window" msgstr "Afficher un aperçu des 1000 premières lignes dans une nouvelle fenêtre" #: ../src/datasources/ascii/asciiconfig.ui:69 msgctxt "AsciiConfig|" msgid "First lines " msgstr "Premières lignes" #: ../src/datasources/ascii/asciiconfig.ui:88 msgctxt "AsciiConfig|" msgid "[Preview]" msgstr "[Aperçu]" #: ../src/datasources/ascii/asciiconfig.ui:104 msgctxt "AsciiConfig|" msgid "Header" msgstr "En-tête" #: ../src/datasources/ascii/asciiconfig.ui:121 msgctxt "AsciiConfig|" msgid "Data starts at line:" msgstr "Début des données ligne :" #: ../src/datasources/ascii/asciiconfig.ui:153 msgctxt "AsciiConfig|" msgid "Read field names from line:" msgstr "Noms des variables ligne :" #: ../src/datasources/ascii/asciiconfig.ui:185 msgctxt "AsciiConfig|" msgid "Read units from line:" msgstr "Unités ligne :" #: ../src/datasources/ascii/asciiconfig.ui:214 msgctxt "AsciiConfig|" msgid "Comment indicators:" msgstr "Indicateurs de commentaire :" #: ../src/datasources/ascii/asciiconfig.ui:230 msgctxt "AsciiConfig|" msgid "" "You can use more than one symbol here, like \"#!C\" for instance, but it " "will slow down reading ASCII files" msgstr "" "Vous pouvez utiliser plus d'un symbole ici, comme « #!C » par exemple, mais " "cela ralentira la lecture des fichiers ASCII." #: ../src/datasources/ascii/asciiconfig.ui:241 msgctxt "AsciiConfig|" msgid "Decimal Separator:" msgstr "Séparateur décimal :" #: ../src/datasources/ascii/asciiconfig.ui:251 msgctxt "AsciiConfig|the . character" msgid "Dot" msgstr "Point" #: ../src/datasources/ascii/asciiconfig.ui:261 msgctxt "AsciiConfig|the , character" msgid "Comma" msgstr "Virgule" #: ../src/datasources/ascii/asciiconfig.ui:302 msgctxt "AsciiConfig|" msgid "Data Column Layout" msgstr "Format des colonnes de données" #: ../src/datasources/ascii/asciiconfig.ui:317 msgctxt "AsciiConfig|" msgid "Space/tab delimited" msgstr "Délimitées par espace/tabulation" #: ../src/datasources/ascii/asciiconfig.ui:335 msgctxt "AsciiConfig|" msgid "Custom delimiter" msgstr "Délimiteur personnalisé :" #: ../src/datasources/ascii/asciiconfig.ui:382 msgctxt "AsciiConfig|" msgid "" "Reading is faster if each column can be assumed to have its own constant " "width." msgstr "" "La lecture est plus rapide si chaque colonne a une largeur constante (pas " "forcément identique pour toutes les colonnes)." #: ../src/datasources/ascii/asciiconfig.ui:385 msgctxt "AsciiConfig|" msgid "" "Each column has its\n" "own constant width" msgstr "Chaque colonne a une largeur constante" #: ../src/datasources/ascii/asciiconfig.ui:401 msgctxt "AsciiConfig|" msgid "Fixed Width" msgstr "Largeur fixe :" #: ../src/datasources/ascii/asciiconfig.ui:467 msgctxt "AsciiConfig|" msgid "General Options" msgstr "Options générales" #: ../src/datasources/ascii/asciiconfig.ui:478 msgctxt "AsciiConfig|" msgid "Limit Buffer Size:" msgstr "Limiter la taille mémoire :" #: ../src/datasources/ascii/asciiconfig.ui:488 msgctxt "AsciiConfig|" msgid " MB" msgstr " Mo" #: ../src/datasources/ascii/asciiconfig.ui:509 msgctxt "AsciiConfig|" msgid "Use threads" msgstr "Utiliser plusieurs threads" #: ../src/datasources/ascii/asciiconfig.ui:524 msgctxt "AsciiConfig|" msgid "Always accept files matching:" msgstr "Associer aux fichiers correspondants à :" #: ../src/datasources/ascii/asciiconfig.ui:539 msgctxt "AsciiConfig|" msgid "Interpret empty value as:" msgstr "Interpréter les valeurs manquantes comme :" #: ../src/datasources/ascii/asciiconfig.ui:561 msgctxt "AsciiConfig|" msgid "Zero" msgstr "Zéro" #: ../src/datasources/ascii/asciiconfig.ui:571 msgctxt "AsciiConfig|" msgid "NaN" msgstr "NaN" #: ../src/datasources/ascii/asciiconfig.ui:581 msgctxt "AsciiConfig|" msgid "Previous value" msgstr "Valeur précédente" #: ../src/datasources/ascii/asciiconfig.ui:624 msgctxt "AsciiConfig|" msgid "Date/Time Interpretation" msgstr "Interprétation des dates et heures" #: ../src/datasources/ascii/asciiconfig.ui:638 msgctxt "AsciiConfig|" msgid "Value" msgstr "Valeur" #: ../src/datasources/ascii/asciiconfig.ui:649 msgctxt "AsciiConfig|" msgid "Interpret field" msgstr "Interpréter la variable" #: ../src/datasources/ascii/asciiconfig.ui:666 msgctxt "AsciiConfig|" msgid "as:" msgstr "comme :" #: ../src/datasources/ascii/asciiconfig.ui:693 msgctxt "AsciiConfig|" msgid "C Time" msgstr "Temps C" #: ../src/datasources/ascii/asciiconfig.ui:703 #: ../src/datasources/ascii/asciiconfig.ui:939 msgctxt "AsciiConfig|" msgid "Seconds" msgstr "Secondes" #: ../src/datasources/ascii/asciiconfig.ui:723 msgctxt "AsciiConfig|" msgid "Index with frequency" msgstr "Index de fréquence :" #: ../src/datasources/ascii/asciiconfig.ui:736 msgctxt "AsciiConfig|" msgid "Hz" msgstr "Hz" #: ../src/datasources/ascii/asciiconfig.ui:765 msgctxt "AsciiConfig|" msgid "Formatted String. Format:" msgstr "Chaîne formatée suivant le schéma :" #: ../src/datasources/ascii/asciiconfig.ui:781 msgctxt "AsciiConfig|" msgid "" "Refer to the documentation of QDateTime for details.
You can use a " "combination of y,M,d for dates and h,m,s,z for times (z for milliseconds)." "
Space is allowed between date and time columns, but you must select the " "first column as X vector." msgstr "" "Veuillez vous référer à la documentation de QDateTime pour plus de détails." "
Vous pouvez utiliser une combinaison de y, M, d pour les dates et h, m, " "s, z pour les heures (z représentant les milli-secondes).
Un espace est " "autorisé entre les colonnes de dates et heures, mais vous devez sélectionner " "la première colonne comme vecteur X." #: ../src/datasources/ascii/asciiconfig.ui:784 msgctxt "AsciiConfig|" msgid "hh:mm:ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:814 msgctxt "AsciiConfig|" msgid " d=day, M=month, y=year, h=hour, m=minute, s=second, z=millisecond" msgstr "" " d=jour, M=mois, y=année, h=heures, m=minutes, s=secondes, z=milli-secondes" #: ../src/datasources/ascii/asciiconfig.ui:839 msgctxt "AsciiConfig|" msgid "Offset" msgstr "Décalage" #: ../src/datasources/ascii/asciiconfig.ui:859 msgctxt "AsciiConfig|" msgid "Date/Time:" msgstr "Date et heure :" #: ../src/datasources/ascii/asciiconfig.ui:893 msgctxt "AsciiConfig|" msgid "dd/MM/yyyy HH:mm:ss.zzz" msgstr "dd/MM/yyyy HH:mm:ss.zzz" #: ../src/datasources/ascii/asciiconfig.ui:908 msgctxt "AsciiConfig|" msgid "File date" msgstr "Date du fichier" #: ../src/datasources/ascii/asciiconfig.ui:920 msgctxt "AsciiConfig|relative offset" msgid "Relative" msgstr "Relatif :" #: ../src/datasources/ascii/asciiconfigwidget.cpp:77 #, qt-format msgctxt "AsciiConfigWidgetInternal|" msgid "First lines of file '%1'" msgstr "Premières lignes du fichier « %1 »" #: ../src/datasources/ascii/asciiconfigwidget.cpp:399 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND values!" msgstr "La ligne %1 ne peut contenir à la fois les noms ET des données !" #: ../src/datasources/ascii/asciiconfigwidget.cpp:403 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list units AND values!" msgstr "La ligne %1 ne peut contenir à la fois les unités ET des données !" #: ../src/datasources/ascii/asciiconfigwidget.cpp:406 #, qt-format msgctxt "AsciiConfigWidget|" msgid "Line %1 can not list field names AND units!" msgstr "" "La ligne %1 ne peut contenir à la fois les noms de variables ET les unités !" #: ../src/datasources/ascii/asciiconfigwidget.cpp:411 msgctxt "AsciiConfigWidget|" msgid "Inconsistent parameters" msgstr "Paramètres incohérents" #: ../src/datasources/ascii/asciiplugin.cpp:23 #: ../src/datasources/ascii/asciiplugin.cpp:24 msgctxt "AsciiPlugin|" msgid "ASCII File Reader" msgstr "Lecteur de fichier ASCII" #: ../src/datasources/ascii/asciisource.cpp:238 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1' ..." msgstr "Analyse de « %1 »..." #: ../src/datasources/ascii/asciisource.cpp:250 #, qt-format msgctxt "AsciiSource|" msgid "Finished parsing '%1'" msgstr "Analyse de « %1 » terminée" #: ../src/datasources/ascii/asciisource.cpp:253 #, qt-format msgctxt "AsciiSource|" msgid "Parsing '%1': %2 rows" msgstr "Analyse de « %1 » : %2 lignes" #: ../src/datasources/ascii/asciisource.cpp:298 msgctxt "AsciiSource|" msgid "Reading field: " msgstr "Lecture de la variable : " #: ../src/datasources/ascii/asciisource.cpp:394 msgctxt "AsciiSource|" msgid "INDEX created" msgstr "INDEX créé" #: ../src/datasources/ascii/asciisource.cpp:497 msgctxt "AsciiSource|" msgid "Finished reading: " msgstr "Lecture terminée : " #: ../src/datasources/ascii/asciisource.cpp:527 #: ../src/datasources/ascii/asciisource.cpp:533 msgctxt "AsciiSource|" msgid "reading ..." msgstr "Lecture..." #: ../src/datasources/ascii/asciisource.cpp:536 #: ../src/datasources/ascii/asciisource.cpp:544 msgctxt "AsciiSource|" msgid "parsing ..." msgstr "Analyse..." #: ../src/datasources/ascii/asciisource.cpp:757 #, qt-format msgctxt "AsciiSource|" msgid "Column %1" msgstr "Colonne %1" #: ../src/datasources/dirfilesource/dirfilesource.cpp:441 #: ../src/datasources/dirfilesource/dirfilesource.cpp:442 msgctxt "DirFilePlugin|" msgid "DirFile Reader" msgstr "Lecteur DirFile" #: ../src/datasources/fitsimage/fitsimage.cpp:473 #: ../src/datasources/fitsimage/fitsimage.cpp:474 msgctxt "FitsImagePlugin|" msgid "FITS Image Source Reader" msgstr "Lecteur d'image FITS" #: ../src/datasources/matlab/matlab.cpp:745 msgctxt "MatlabSourcePlugin|" msgid "Matlab Datasource Reader" msgstr "Lecteur de fichier Matlab" #: ../src/datasources/matlab/matlab.cpp:746 msgctxt "MatlabSourcePlugin|" msgid "Matlab's .mat Datasource Reader" msgstr "Lecteur de source de donnée *.mat de Matlab" #: ../src/datasources/netcdf/netcdfplugin.cpp:29 #: ../src/datasources/netcdf/netcdfplugin.cpp:30 msgctxt "NetCdfPlugin|" msgid "netCDF Reader" msgstr "Lecteur de fichier netCDF" #: ../src/datasources/qimagesource/qimagesource.cpp:407 #: ../src/datasources/qimagesource/qimagesource.cpp:408 msgctxt "QImageSourcePlugin|" msgid "QImage Source Reader" msgstr "Lecteur de fichier QImage" #: ../src/datasources/sampledatasource/sampledatasource.cpp:121 #: ../src/datasources/sampledatasource/sampledatasource.cpp:122 msgctxt "SampleDatasourcePlugin|" msgid "Sample Datasource Reader" msgstr "Exemple de lecteur de source de donnée " #: ../src/datasources/sourcelist/sourcelist.cpp:327 #: ../src/datasources/sourcelist/sourcelist.cpp:328 msgctxt "SourceListPlugin|" msgid "Source List Reader" msgstr "Lecteur de liste de sources" #: ../src/libkst/datamatrix.cpp:177 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Column %1" msgstr "Colonne %1" #: ../src/libkst/datamatrix.cpp:594 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for matrix %1 was not opened." msgstr "Le fichier de données pour la matrice %1 n'a pas été ouvert." #: ../src/libkst/datamatrix.cpp:653 #, qt-format msgctxt "Kst::DataMatrix|" msgid "Data file for vector %1 was not opened." msgstr "Le fichier de données pour le vecteur %1 n'a pas été ouvert." #: ../src/libkst/datamatrix.cpp:676 #, qt-format msgctxt "Kst::DataMatrix|" msgid "" "Data Matrix: %1\n" " %2\n" " Field: %3\n" " %4 x %5" msgstr "" "Matrice de données : %1\n" " %2\n" " Champ : %3\n" " %4 x %5" #: ../src/libkst/datamatrix.cpp:686 #, qt-format msgctxt "Kst::DataMatrix|field %1 from file %2" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/dataprimitive.cpp:73 #, qt-format msgctxt "Kst::Primitive|" msgid "Data file for vector %1 was not opened." msgstr "Le fichier de données pour le vecteur %1 n'a pas été ouvert." #: ../src/libkst/datascalar.cpp:98 #, qt-format msgctxt "Kst::DataScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Le fichier de données pour le scalaire %1 n'a pas été ouvert." #: ../src/libkst/datascalar.cpp:161 #, qt-format msgctxt "Kst::DataScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Donnée scalaire : %1 = %4\n" " %2\n" " Variable : %3" #: ../src/libkst/datascalar.cpp:171 #, qt-format msgctxt "Kst::DataScalar|" msgid "%2 of %1 = %3" msgstr "%2 de %1 = %3" #: ../src/libkst/datasource.cpp:521 msgctxt "Kst::DataSource|" msgid "frames" msgstr "sections" #: ../src/libkst/datasourcepluginmanager.cpp:68 msgctxt "Kst::DataSource|" msgid "" "\n" "Plugin Search Paths:" msgstr "" "\n" "Emplacements de recherche de modules :" #: ../src/libkst/datasourcepluginmanager.cpp:163 msgctxt "Kst::DataSource|" msgid "Scanning for data-source plugins." msgstr "Recherche de modules de source de données." #: ../src/libkst/datasourcepluginmanager.cpp:186 #, qt-format msgctxt "Kst::DataSource|" msgid "Plugin loaded: %1" msgstr "Module chargé : %1" #: ../src/libkst/datasourcepluginmanager.cpp:189 #, qt-format msgctxt "Kst::DataSource|" msgid "instance failed for %1 (%2)" msgstr "l'instanciation a échoué pour %1 (%2)" #: ../src/libkst/datasourcepluginmanager.cpp:337 #, qt-format msgctxt "QObject|" msgid "File '%1' does not exist." msgstr "Le fichier « %1 » n'existe pas." #: ../src/libkst/datasourcepluginmanager.cpp:438 #: ../src/libkst/datasourcepluginmanager.cpp:460 #, qt-format msgctxt "Kst::DataSource|" msgid "" "Could not find a datasource for '%1'(%2), but we found one just prior. " "Something is wrong with Kst." msgstr "" "Impossible de trouver une source de données pour « %1 » (%2), alors qu'une " "avait été trouvée juste avant. Il y a un problème avec Kst." #: ../src/libkst/datastring.cpp:99 #, qt-format msgctxt "Kst::DataString|" msgid "Data file for string %1 was not opened." msgstr "Le fichier de données pour la chaîne %1 n'a pas été ouvert." #: ../src/libkst/datastring.cpp:164 #, qt-format msgctxt "Kst::DataString|" msgid "" "Data String: %1 = %4\n" " %2\n" " Field: %3" msgstr "" "Chaîne de caractères : %1 = %4\n" " %2\n" " Variable : %3" #: ../src/libkst/datastring.cpp:174 #, qt-format msgctxt "Kst::DataString|" msgid "%1 of %2" msgstr "%1 de %2" #: ../src/libkst/datavector.cpp:173 #, qt-format msgctxt "Kst::DataVector|" msgid "Data file for vector %1 was not opened." msgstr "Le fichier de données pour le vecteur %1 n'a pas été ouvert." #: ../src/libkst/datavector.cpp:827 #, qt-format msgctxt "Kst::DataVector|" msgid "" "Data Vector: %1\n" " %2\n" " Field: %3" msgstr "" "Vecteur de données : %1\n" " %2\n" " Variable : %3" #: ../src/libkst/datavector.cpp:834 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Last %1 frames." msgstr "" "\n" " %1 dernières sections." #: ../src/libkst/datavector.cpp:836 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Frame %1 to end." msgstr "" "\n" " Section %1 jusqu'à la fin." #: ../src/libkst/datavector.cpp:838 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " %1 Frames starting at %2." msgstr "" "\n" " %1 sections à partir de la %2." #: ../src/libkst/datavector.cpp:842 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Read 1 sample per %1 frames." msgstr "" "\n" " Lecture d'1 échantillon pour %1 sections." #: ../src/libkst/datavector.cpp:844 #, qt-format msgctxt "Kst::DataVector|" msgid "" "\n" " Average each %1 frames." msgstr "" "\n" " Moyenne toutes les %1 sections." #: ../src/libkst/datavector.cpp:851 #, qt-format msgctxt "" "Kst::DataVector|%2 is a variable name. F0 is short for the first element. " "N is the number of elements" msgid "%2 F0: %3 N: %4 of %1" msgstr "%2 F0: %3 N: %4 de %1" #: ../src/libkst/debug.cpp:132 msgctxt "Kst::Debug|" msgid "Error" msgstr "Erreur" #: ../src/libkst/debug.cpp:134 msgctxt "Kst::Debug|" msgid "Warning" msgstr "Avertissement" #: ../src/libkst/debug.cpp:136 msgctxt "Kst::Debug|" msgid "Notice" msgstr "Information" #: ../src/libkst/debug.cpp:138 msgctxt "Kst::Debug|" msgid "Trace" msgstr "Trace" #: ../src/libkst/debug.cpp:140 msgctxt "Kst::Debug|" msgid "Other" msgstr "Autre" #: ../src/libkst/debug.cpp:147 #, qt-format msgctxt "Kst::Debug|" msgid "" "Kst version %1\n" "\n" "\n" "Kst log:\n" msgstr "" "Kst version %1\n" "\n" "\n" "Messages de Kst :\n" #: ../src/libkst/debug.cpp:154 msgctxt "Kst::Debug|" msgid "" "\n" "\n" "Data-source plugins:" msgstr "" "\n" "\n" "Modules de source de données :" #: ../src/libkst/editablevector.cpp:124 #, qt-format msgctxt "Kst::EditableVector|" msgid "" "Editable Vector: %1\n" " %2 values" msgstr "" "Vecteur modifiable : %1\n" " %2 valeurs" #: ../src/libkst/generatedvector.cpp:95 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "" "Generated Vector: %1\n" " %2 values from %3 to %4" msgstr "" "Vecteur généré : %1\n" " %2 valeurs de %3 à %4" #: ../src/libkst/generatedvector.cpp:100 #, qt-format msgctxt "Kst::GeneratedVector|" msgid "%3 points from %1 to %2" msgstr "%3 points de %1 à %2" #: ../src/libkst/matrix.cpp:638 msgctxt "Kst::Matrix|" msgid "Saved matrix contains less data than it claims." msgstr "" "La matrice enregistrée contient moins de données qu'elle ne le déclare." #: ../src/libkst/matrix.cpp:645 #, qt-format msgctxt "Kst::Matrix|%1 is the matrix name. %2 and %3 are its dimensions." msgid "" "Matrix: %1\n" " %2 x %3" msgstr "" "Matrice : %1\n" " %2 x %3" #: ../src/libkst/matrixfactory.cpp:70 msgctxt "QObject|" msgid "Error creating Generated Matrix from Kst file." msgstr "Erreur à la création de la matrice générée depuis le fichier Kst." #: ../src/libkst/matrixfactory.cpp:139 msgctxt "QObject|" msgid "Error creating Editable Matrix from Kst file." msgstr "Erreur à la création de la matrice modifiable depuis le fichier Kst." #: ../src/libkst/matrixfactory.cpp:214 msgctxt "QObject|" msgid "Error creating Data Matrix from Kst file." msgstr "Erreur à la création de la matrice de données depuis le fichier Kst." #: ../src/libkst/scalar.cpp:143 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "" "Scalar: %1 = %2\n" "%3" msgstr "" "Scalaire : %1 = %2\n" "%3" #: ../src/libkst/scalar.cpp:145 #, qt-format msgctxt "Kst::Scalar|%1 is the variable name. %2 is its value" msgid "Scalar: %1 = %2" msgstr "Scalaire : %1 = %2" #: ../src/libkst/scalar.cpp:162 #, qt-format msgctxt "Kst::Scalar|" msgid "Value: %1" msgstr "Valeur : %1" #: ../src/libkst/scalarfactory.cpp:64 ../src/libkst/scalarfactory.cpp:123 #: ../src/libkst/scalarfactory.cpp:192 msgctxt "QObject|" msgid "Error creating scalar from Kst file." msgstr "Erreur à la création du scalaire depuis le fichier Kst." #: ../src/libkst/string_kst.cpp:110 #, qt-format msgctxt "Kst::String|" msgid "String: %1" msgstr "Chaîne : %1" #: ../src/libkst/stringfactory.cpp:59 msgctxt "QObject|" msgid "Error creating string from Kst file." msgstr "Erreur à la création de la chaîne depuis le fichier Kst." #: ../src/libkst/vector.cpp:662 #, qt-format msgctxt "Kst::Vector|" msgid "Provider: %1" msgstr "Fournisseur : %1" #: ../src/libkst/vector.cpp:669 #, qt-format msgctxt "Kst::Vector|" msgid "" "Vector: %1\n" " %2 samples\n" "%3" msgstr "" "Vecteur : %1\n" " %2 échantillons\n" "%3" #: ../src/libkst/vectorfactory.cpp:65 ../src/libkst/vectorfactory.cpp:184 #: ../src/libkst/vectorfactory.cpp:282 msgctxt "QObject|" msgid "Error creating vector from Kst file." msgstr "Erreur à la création du vecteur depuis le fichier Kst." #: ../src/libkst/vectorfactory.cpp:126 msgctxt "QObject|" msgid "Error creating generated vector from Kst file." msgstr "Erreur à la création du vecteur généré depuis le fichier Kst." #: ../src/libkst/vscalar.cpp:77 #, qt-format msgctxt "Kst::VScalar|" msgid "Data file for scalar %1 was not opened." msgstr "Le fichier de données pour le scalaire %1 n'a pas été ouvert." #: ../src/libkst/vscalar.cpp:178 #, qt-format msgctxt "Kst::VScalar|" msgid "" "Data Scalar: %1 = %4\n" " %2\n" " Field: %3\n" " Frame: %5" msgstr "" "Donnée scalaire : %1 = %4\n" " %2\n" " Variable : %3\n" " Section : %5" #: ../src/libkst/vscalar.cpp:212 #, qt-format msgctxt "" "Kst::VScalar|%2 is field name. %3 is frame/index. %1 is the file name. %4 " "is the value" msgid "%2 frame %3 of %1 = %4" msgstr "%2 section %3 de %1 = %4" #: ../src/libkstapp/aboutdialog.cpp:65 #, qt-format msgctxt "Kst::AboutDialog|" msgid "

Kst %1 - A data viewing program.

" msgstr "

Kst %1 - Un programme de visualisation de données.

" #: ../src/libkstapp/aboutdialog.cpp:67 #, qt-format msgctxt "Kst::AboutDialog|" msgid "Revision %1

" msgstr "Version %1

" #: ../src/libkstapp/aboutdialog.cpp:69 msgctxt "Kst::AboutDialog|" msgid "Copyright © 2000-2014 Barth Netterfield

" msgstr "Copyright © 2000-2014 Barth Netterfield

" #: ../src/libkstapp/aboutdialog.cpp:70 msgctxt "Kst::AboutDialog|" msgid "" "Homepage: http://kst-plot.kde.org/
" msgstr "" "Page d'accueil :
http://kst-plot.kde." "org/
" #: ../src/libkstapp/aboutdialog.cpp:71 msgctxt "Kst::AboutDialog|" msgid "Please report bugs with the 'Bug Report Wizard' of the 'Help' menu.
" msgstr "" "Veuillez signaler les bogues avec l'assistant « Rapport de bogue » du menu " "« Aide ».
" #: ../src/libkstapp/aboutdialog.cpp:72 msgctxt "Kst::AboutDialog|" msgid "
Authors and contributors (sorted alphabetically):" msgstr "
Auteurs et contributeurs (triés alphabétiquement) :" #: ../src/libkstapp/aboutdialog.ui:14 msgctxt "AboutDialog|kst is the name of the app." msgid "About Kst" msgstr "À propos de Kst" #: ../src/libkstapp/aboutdialog.ui:37 msgctxt "AboutDialog|the name of the app, but no other meaning." msgid "Kst" msgstr "Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:29 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Kst Settings" msgstr "Paramètres de Kst" #: ../src/libkstapp/applicationsettingsdialog.cpp:43 msgctxt "Kst::ApplicationSettingsDialog|" msgid "General" msgstr "Général" #: ../src/libkstapp/applicationsettingsdialog.cpp:48 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Scaling" msgstr "Echelle" #: ../src/libkstapp/applicationsettingsdialog.cpp:53 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Grid" msgstr "Grille" #: ../src/libkstapp/applicationsettingsdialog.cpp:58 msgctxt "Kst::ApplicationSettingsDialog|" msgid "Layout Properties" msgstr "Mise en page" #: ../src/libkstapp/arrowitem.cpp:37 msgctxt "Kst::ArrowItem|" msgid "Arrow" msgstr "Flèche" #: ../src/libkstapp/arrowitem.cpp:208 msgctxt "QObject|" msgid "Error creating arrow object from Kst file." msgstr "Erreur à la création de l'objet flèche depuis le fichier Kst." #: ../src/libkstapp/arrowitem.h:73 ../src/libkstapp/arrowitem.h:74 msgctxt "QObject|" msgid "Create Arrow" msgstr "Créer une flèche" #: ../src/libkstapp/arrowitemdialog.cpp:31 msgctxt "Kst::ArrowItemDialog|" msgid "Properties" msgstr "Propriétés" #: ../src/libkstapp/arrowpropertiestab.cpp:21 msgctxt "Kst::ArrowPropertiesTab|" msgid "ArrowProperties" msgstr "Propriétés de la flèche" #: ../src/libkstapp/arrowpropertiestab.ui:20 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &start" msgstr "Flèche au &début" #: ../src/libkstapp/arrowpropertiestab.ui:33 msgctxt "ArrowPropertiesTab|" msgid "S&tart arrow scale" msgstr "&Taille de la flèche au début" #: ../src/libkstapp/arrowpropertiestab.ui:52 #: ../src/libkstapp/arrowpropertiestab.ui:88 msgctxt "ArrowPropertiesTab|" msgid "Arrow Head Size" msgstr "Taille de la flèche" #: ../src/libkstapp/arrowpropertiestab.ui:55 #: ../src/libkstapp/arrowpropertiestab.ui:91 msgctxt "ArrowPropertiesTab|" msgid "The size of the arrow head is proportional to this value." msgstr "" "La taille de la pointe de la flèche est proportionnelle à cette valeur." #: ../src/libkstapp/arrowpropertiestab.ui:62 msgctxt "ArrowPropertiesTab|" msgid "Arrow at &end" msgstr "Flèche à la &fin" #: ../src/libkstapp/arrowpropertiestab.ui:75 msgctxt "ArrowPropertiesTab|" msgid "E&nd arrow scale" msgstr "T&aille de la flèche à la fin" #: ../src/libkstapp/axistab.cpp:23 msgctxt "Kst::AxisTab|" msgid "Axis" msgstr "Axe" #: ../src/libkstapp/axistab.cpp:25 msgctxt "Kst::AxisTab|" msgid "Coarse" msgstr "Espacé" #: ../src/libkstapp/axistab.cpp:26 msgctxt "Kst::AxisTab|" msgid "Normal" msgstr "Normal" #: ../src/libkstapp/axistab.cpp:27 msgctxt "Kst::AxisTab|" msgid "Fine" msgstr "Fin" #: ../src/libkstapp/axistab.cpp:28 msgctxt "Kst::AxisTab|" msgid "VeryFine" msgstr "Très fin" #: ../src/libkstapp/axistab.cpp:31 ../src/libkstapp/axistab.cpp:39 msgctxt "Kst::AxisTab|Pen type" msgid "Solid Line" msgstr "Ligne pleine" #: ../src/libkstapp/axistab.cpp:32 ../src/libkstapp/axistab.cpp:40 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Line" msgstr "Ligne en tirets" #: ../src/libkstapp/axistab.cpp:33 ../src/libkstapp/axistab.cpp:41 msgctxt "Kst::AxisTab|Pen type" msgid "Dot Line" msgstr "Ligne pointillée" #: ../src/libkstapp/axistab.cpp:34 ../src/libkstapp/axistab.cpp:42 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Line" msgstr "Ligne tiret-point" #: ../src/libkstapp/axistab.cpp:35 ../src/libkstapp/axistab.cpp:43 msgctxt "Kst::AxisTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Ligne tiret-point-point" #: ../src/libkstapp/axistab.cpp:36 ../src/libkstapp/axistab.cpp:44 msgctxt "Kst::AxisTab|Pen type" msgid "Custom Dash Line" msgstr "Ligne en tirets personnalisés" #: ../src/libkstapp/axistab.cpp:660 msgctxt "Kst::AxisTab|" msgid "Hide left" msgstr "Masquer à gauche" #: ../src/libkstapp/axistab.cpp:661 msgctxt "Kst::AxisTab|" msgid "Hide right" msgstr "Masquer à droite" #: ../src/libkstapp/axistab.ui:25 msgctxt "AxisTab|" msgid "Hide Margins and Labels" msgstr "Masquer les marges et les libellés" #: ../src/libkstapp/axistab.ui:31 msgctxt "AxisTab|" msgid "Hide top" msgstr "Masquer en haut" #: ../src/libkstapp/axistab.ui:38 msgctxt "AxisTab|" msgid "Hide bottom" msgstr "Masquer en bas" #: ../src/libkstapp/axistab.ui:61 msgctxt "AxisTab|" msgid "Label Rotation" msgstr "Rotation du libellé" #: ../src/libkstapp/axistab.ui:69 msgctxt "AxisTab|" msgid "Rotation :" msgstr "Angle :" #: ../src/libkstapp/axistab.ui:104 msgctxt "AxisTab|" msgid "Base / Offset Mode" msgstr "Mode référence / delta" #: ../src/libkstapp/axistab.ui:112 msgctxt "AxisTab|Automatically enable or disable an option" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:119 msgctxt "AxisTab|Enable an option" msgid "On" msgstr "Activé" #: ../src/libkstapp/axistab.ui:126 msgctxt "AxisTab|Disable an option" msgid "Off" msgstr "Désactivé" #: ../src/libkstapp/axistab.ui:150 msgctxt "AxisTab|" msgid "Digits before automatic base/offset mode:" msgstr "Chiffres activant le mode référence / delta :" #: ../src/libkstapp/axistab.ui:163 msgctxt "AxisTab|" msgid "" "If this many digits are required to display the tick numbers, then the axis " "will revert to Base/Offset mode." msgstr "" "Si ce nombre de chiffres est nécessaire pour afficher les numéros de " "graduation, alors l'axe repassera en mode référence / delta." #: ../src/libkstapp/axistab.ui:196 msgctxt "AxisTab|" msgid "Force offset to axis minimum" msgstr "Aligner la référence sur le zéro de l'axe" #: ../src/libkstapp/axistab.ui:208 msgctxt "AxisTab|" msgid "Scale" msgstr "Échelle" #: ../src/libkstapp/axistab.ui:217 msgctxt "AxisTab|" msgid "&Logarithmic" msgstr "&Logarithmique" #: ../src/libkstapp/axistab.ui:224 msgctxt "AxisTab|" msgid "" "Reverse the direction of the axis, so the numbers are decreasing, rather " "than increasing." msgstr "" "Inverser la direction de l'axe, pour que les nombres soient décroissants, " "plutôt que croissants." #: ../src/libkstapp/axistab.ui:227 msgctxt "AxisTab|" msgid "&Reverse" msgstr "Inve&rser" #: ../src/libkstapp/axistab.ui:253 msgctxt "AxisTab|" msgid "Axis is time" msgstr "L'axe est un temps" #: ../src/libkstapp/axistab.ui:256 msgctxt "AxisTab|" msgid "Interpret the axis as time." msgstr "Interpréter l'axe comme un temps." #: ../src/libkstapp/axistab.ui:259 msgctxt "AxisTab|" msgid "&Interpret as:" msgstr "&Interpréter comme :" #: ../src/libkstapp/axistab.ui:269 ../src/libkstapp/axistab.ui:346 msgctxt "AxisTab|" msgid "Time encoding type" msgstr "Type de codage du temps" #: ../src/libkstapp/axistab.ui:272 ../src/libkstapp/axistab.ui:349 msgctxt "AxisTab|" msgid "The axis represents time, whose encoding is selected here." msgstr "Cet axe représente un temps, dont le codage est choisi ici." #: ../src/libkstapp/axistab.ui:301 msgctxt "AxisTab|" msgid "&Display as:" msgstr "&Afficher au format :" #: ../src/libkstapp/axistab.ui:317 msgctxt "AxisTab|" msgid "Time display format" msgstr "Format d'affichage" #: ../src/libkstapp/axistab.ui:320 msgctxt "AxisTab|" msgid "" "If the axis is to be interpreted as time, then display the time on the axis " "with this format." msgstr "" "Si l'axe doit être interprété comme un temps, afficher le le temps sur cet " "axe selon ce format." #: ../src/libkstapp/axistab.ui:336 msgctxt "AxisTab|" msgid "Timezone:" msgstr "Fuseau horaire :" #: ../src/libkstapp/axistab.ui:378 msgctxt "AxisTab|" msgid "Time/Date format:" msgstr "Format de date/heure :" #: ../src/libkstapp/axistab.ui:397 msgctxt "AxisTab|" msgid "hh:mm.ss.zzz" msgstr "hh:mm:ss.zzz" #: ../src/libkstapp/axistab.ui:404 msgctxt "AxisTab|" msgid "Date: y/M/d - Time: h/m/s/z" msgstr "Date : y/M/d - Heure : h/m/s/z" #: ../src/libkstapp/axistab.ui:444 msgctxt "AxisTab|" msgid "Major Ticks and Lines" msgstr "Graduations et grille principales " #: ../src/libkstapp/axistab.ui:458 msgctxt "AxisTab|" msgid "Dra&w ticks" msgstr "Afficher les &graduations" #: ../src/libkstapp/axistab.ui:474 msgctxt "AxisTab|" msgid "Draw &grid lines" msgstr "Afficher la &grille" #: ../src/libkstapp/axistab.ui:492 msgctxt "AxisTab|" msgid "Major s&pacing:" msgstr "Es&pacement principal :" #: ../src/libkstapp/axistab.ui:511 msgctxt "AxisTab|" msgid "Density of major ticks" msgstr "Densité des graduations principales " #: ../src/libkstapp/axistab.ui:514 msgctxt "AxisTab|" msgid "" "Specify the density of major ticks. The major tick interval will " "automatically be chosen as a power of 10 times 1, 2, or 5. This changes the " "target tick spacing within this constraint." msgstr "" "Spécifier la densité des graduations principales. L'intervalle des " "graduations principales sera choisi automatiquement pour tomber sur une " "puissance de 10 multipliée par 1, 2 ou 5. Ce réglage influence l'espacement " "entre les graduations tout en respectant cette contrainte." #: ../src/libkstapp/axistab.ui:527 msgctxt "AxisTab|" msgid "Grid line &style:" msgstr "&Style de ligne :" #: ../src/libkstapp/axistab.ui:556 msgctxt "AxisTab|" msgid "Grid line &color:" msgstr "&Couleur de ligne :" #: ../src/libkstapp/axistab.ui:578 ../src/libkstapp/axistab.ui:723 msgctxt "AxisTab|" msgid "Width:" msgstr "Largeur :" #: ../src/libkstapp/axistab.ui:591 msgctxt "AxisTab|" msgid "Minor Ticks and Lines" msgstr "Graduations et grille secondaires" #: ../src/libkstapp/axistab.ui:605 msgctxt "AxisTab|" msgid "Dr&aw ticks" msgstr "Afficher les gr&aduations" #: ../src/libkstapp/axistab.ui:621 msgctxt "AxisTab|" msgid "Draw grid lines" msgstr "Afficher la g&rille" #: ../src/libkstapp/axistab.ui:639 msgctxt "AxisTab|" msgid "Minor tic&k count:" msgstr "Graduations sec&ondaires :" #: ../src/libkstapp/axistab.ui:671 msgctxt "AxisTab|" msgid "Auto" msgstr "Auto" #: ../src/libkstapp/axistab.ui:678 msgctxt "AxisTab|" msgid "Line st&yle:" msgstr "St&yle de ligne :" #: ../src/libkstapp/axistab.ui:701 msgctxt "AxisTab|" msgid "Lin&e color:" msgstr "Couleur de lign&e :" #: ../src/libkstapp/baddatasourcedialog.cpp:34 #, qt-format msgctxt "Kst::BadDatasourceDialog|" msgid "%1: File not found. " msgstr "%1 : impossible de trouver le fichier." #: ../src/libkstapp/baddatasourcedialog.ui:20 msgctxt "BadDatasourceDialog|" msgid "Dialog" msgstr "Boîte de dialogue" #: ../src/libkstapp/baddatasourcedialog.ui:32 msgctxt "BadDatasourceDialog|" msgid "TextLabel" msgstr "Libellé de texte" #: ../src/libkstapp/baddatasourcedialog.ui:45 msgctxt "BadDatasourceDialog|" msgid "Select new data file:" msgstr "Sélectionner le nouveau fichier de données :" #: ../src/libkstapp/baddatasourcedialog.ui:90 msgctxt "BadDatasourceDialog|" msgid "Unknown file type" msgstr "Type de fichier inconnu" #: ../src/libkstapp/baddatasourcedialog.ui:109 msgctxt "BadDatasourceDialog|" msgid "Con&figure..." msgstr "Con&figurer..." #: ../src/libkstapp/baddatasourcedialog.ui:132 msgctxt "BadDatasourceDialog|" msgid "Change" msgstr "Modifier" #: ../src/libkstapp/baddatasourcedialog.ui:145 msgctxt "BadDatasourceDialog|" msgid "Skip" msgstr "Sauter" #: ../src/libkstapp/basicplugindialog.cpp:31 msgctxt "Kst::BasicPluginTab|" msgid "Basic Plugin" msgstr "Module basique" #: ../src/libkstapp/basicplugindialog.cpp:55 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "Edit %1 Plugin" msgstr "Modifier le module %1" #: ../src/libkstapp/basicplugindialog.cpp:57 #, qt-format msgctxt "Kst::BasicPluginDialog|arg1 is a plugin name" msgid "New %1 Plugin" msgstr "Nouveau module %1" #: ../src/libkstapp/basicplugindialog.cpp:87 msgctxt "Kst::BasicPluginDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Impossible de créer l'objet module avec les paramètres fournis.\n" "\n" #: ../src/libkstapp/basicplugindialog.cpp:89 msgctxt "Kst::BasicPluginDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/basicplugintab.ui:26 msgctxt "BasicPluginTab|" msgid "Inputs and Outputs" msgstr "Entrées et sorties" #: ../src/libkstapp/boxitem.cpp:24 msgctxt "Kst::BoxItem|a box in a picture" msgid "Box" msgstr "Rectangle" #: ../src/libkstapp/boxitem.cpp:97 ../src/libkstapp/labelitem.cpp:388 msgctxt "QObject|" msgid "Error creating box object from Kst file." msgstr "Erreur à la création de l'objet rectangle depuis le fichier Kst." #: ../src/libkstapp/boxitem.h:42 ../src/libkstapp/boxitem.h:43 msgctxt "QObject|" msgid "Create Box" msgstr "Créer un rectangle" #: ../src/libkstapp/bugreportwizard.cpp:29 msgctxt "Kst::BugReportWizard|" msgid "Mac OS 9" msgstr "Mac OS 9" #: ../src/libkstapp/bugreportwizard.cpp:30 msgctxt "Kst::BugReportWizard|" msgid "Mac OS X" msgstr "Mac OS X" #: ../src/libkstapp/bugreportwizard.cpp:31 msgctxt "Kst::BugReportWizard|" msgid "Windows 32-Bit" msgstr "Windows 32-Bit" #: ../src/libkstapp/bugreportwizard.cpp:32 msgctxt "Kst::BugReportWizard|" msgid "Windows 64-Bit" msgstr "Windows 64-Bit" #: ../src/libkstapp/bugreportwizard.cpp:33 msgctxt "Kst::BugReportWizard|" msgid "Linux" msgstr "Linux" #: ../src/libkstapp/bugreportwizard.ui:14 msgctxt "BugReportWizard|" msgid "Bug Report Wizard" msgstr "Assistant de rapport de bogues" #: ../src/libkstapp/bugreportwizard.ui:24 msgctxt "BugReportWizard|" msgid "Kst version:" msgstr "Version de Kst :" #: ../src/libkstapp/bugreportwizard.ui:38 msgctxt "BugReportWizard|" msgid "OS:" msgstr "Système d'exploitation :" #: ../src/libkstapp/bugreportwizard.ui:69 msgctxt "BugReportWizard|" msgid "" "To submit a bug click on the button below.\n" "This will open a web browser window on http://bugs.kde.org where you will " "find a form to fill in.\n" "The information displayed above will be transferred to that server." msgstr "" "Pour soumettre un rapport de bogue, cliquez sur le bouton ci-dessous.\n" "Une fenêtre de navigateur web s'ouvrira sur http://bugs.kde.org, où vous trouverez un formulaire à remplir.\n" "Les informations affichées ci-dessus seront transférées vers ce serveur." #: ../src/libkstapp/bugreportwizard.ui:80 msgctxt "BugReportWizard|" msgid "Launch Bug Report Wizard" msgstr "Lancer l'assistant de rapport de bogues" #: ../src/libkstapp/buttonitem.cpp:25 msgctxt "Kst::ButtonItem|" msgid "Button" msgstr "Bouton" #: ../src/libkstapp/buttonitem.cpp:118 msgctxt "QObject|" msgid "Error creating button object from Kst file." msgstr "Erreur à la création de l'objet bouton depuis le fichier Kst." #: ../src/libkstapp/cartesianrenderitem.cpp:28 msgctxt "Kst::CartesianRenderItem|" msgid "Cartesian Plot" msgstr "Graphique cartésien" #: ../src/libkstapp/changedatasampledialog.cpp:260 #: ../src/libkstapp/changedatasampledialog.cpp:261 msgctxt "Kst::ChangeDataSampleDialog|" msgid "frames" msgstr "sections" #: ../src/libkstapp/changedatasampledialog.cpp:333 msgctxt "Kst::ChangeDataSampleDialog|" msgid "Insufficient Memory" msgstr "Mémoire insuffisante" #: ../src/libkstapp/changedatasampledialog.cpp:333 #, qt-format msgctxt "Kst::ChangeDataSampleDialog|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Vous avez demandé de lire %1 Mo de données, mais il semble que vous ayez " "environ %2 Mo de mémoire disponible. Vous ne pouvez pas charger autant de " "données." #: ../src/libkstapp/changedatasampledialog.ui:14 msgctxt "ChangeDataSampleDialog|" msgid "Change Data Samples" msgstr "Modifier les plages de données" #: ../src/libkstapp/changedatasampledialog.ui:20 msgctxt "ChangeDataSampleDialog|" msgid "Vector Selection" msgstr "Sélection des vecteurs" #: ../src/libkstapp/changedatasampledialog.ui:34 #: ../src/libkstapp/changedatasampledialog.ui:123 msgctxt "ChangeDataSampleDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Les vecteurs sélectionnés dans cette liste seront lus depuis un nouveau " "fichier." #: ../src/libkstapp/changedatasampledialog.ui:59 #: ../src/libkstapp/changedatasampledialog.ui:69 msgctxt "ChangeDataSampleDialog|" msgid "Select all vectors in the list." msgstr "Sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/changedatasampledialog.ui:62 msgctxt "ChangeDataSampleDialog|" msgid "Add A&ll" msgstr "&Tout ajouter" #: ../src/libkstapp/changedatasampledialog.ui:72 msgctxt "ChangeDataSampleDialog|" msgid "&Add" msgstr "&Ajouter" #: ../src/libkstapp/changedatasampledialog.ui:79 #: ../src/libkstapp/changedatasampledialog.ui:89 msgctxt "ChangeDataSampleDialog|" msgid "Unselect all vectors in the list." msgstr "Dé-sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/changedatasampledialog.ui:82 msgctxt "ChangeDataSampleDialog|" msgid "&Remove" msgstr "Supp&rimer" #: ../src/libkstapp/changedatasampledialog.ui:92 msgctxt "ChangeDataSampleDialog|" msgid "R&emove All" msgstr "Tout supprim&er" #: ../src/libkstapp/changefiledialog.cpp:302 #: ../src/libkstapp/changefiledialog.cpp:481 #: ../src/libkstapp/changefiledialog.cpp:483 msgctxt "Kst::ChangeFileDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/changefiledialog.cpp:302 msgctxt "Kst::ChangeFileDialog|" msgid "The file could not be loaded or contains no data." msgstr "Le fichier n'a pas pu être chargé ou ne contient aucune donnée." #: ../src/libkstapp/changefiledialog.cpp:481 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following field is not defined for the requested file:\n" "%1" msgstr "" "La variable suivante n'a pas été trouvée dans le fichier demandé :\n" "%1" #: ../src/libkstapp/changefiledialog.cpp:483 #, qt-format msgctxt "Kst::ChangeFileDialog|" msgid "" "The following fields are not defined for the requested file:\n" "%1" msgstr "" "Les variables suivantes n'ont pas été trouvées dans le fichier demandé :\n" "%1" #: ../src/libkstapp/changefiledialog.ui:14 msgctxt "ChangeFileDialog|" msgid "Change Data File" msgstr "Modifier le fichier de données" #: ../src/libkstapp/changefiledialog.ui:20 msgctxt "ChangeFileDialog|" msgid "Select by Source File" msgstr "Sélectionner par fichier source" #: ../src/libkstapp/changefiledialog.ui:29 msgctxt "ChangeFileDialog|" msgid "Add All &From:" msgstr "Sélectionner les variables &de :" #: ../src/libkstapp/changefiledialog.ui:52 msgctxt "ChangeFileDialog|" msgid "Vector and Matrix Selection" msgstr "Sélection des vecteurs et matrices" #: ../src/libkstapp/changefiledialog.ui:66 #: ../src/libkstapp/changefiledialog.ui:155 msgctxt "ChangeFileDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Les vecteurs sélectionnés dans cette liste seront relus depuis un nouveau " "fichier de données." #: ../src/libkstapp/changefiledialog.ui:91 #: ../src/libkstapp/changefiledialog.ui:101 msgctxt "ChangeFileDialog|" msgid "Select all vectors in the list." msgstr "Sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/changefiledialog.ui:94 msgctxt "ChangeFileDialog|" msgid "Add A&ll" msgstr "&Tout ajouter" #: ../src/libkstapp/changefiledialog.ui:104 msgctxt "ChangeFileDialog|" msgid "&Add" msgstr "&Ajouter" #: ../src/libkstapp/changefiledialog.ui:111 #: ../src/libkstapp/changefiledialog.ui:121 msgctxt "ChangeFileDialog|" msgid "Unselect all vectors in the list." msgstr "Dé-sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/changefiledialog.ui:114 msgctxt "ChangeFileDialog|" msgid "&Remove" msgstr "Supp&rimer" #: ../src/libkstapp/changefiledialog.ui:124 msgctxt "ChangeFileDialog|" msgid "R&emove All" msgstr "Tout supprim&er" #: ../src/libkstapp/changefiledialog.ui:170 msgctxt "ChangeFileDialog|" msgid "New Data File" msgstr "Nouveau fichier de données " #: ../src/libkstapp/changefiledialog.ui:190 msgctxt "ChangeFileDialog|" msgid "&File:" msgstr "&Fichier :" #: ../src/libkstapp/changefiledialog.ui:220 msgctxt "ChangeFileDialog|" msgid "C&hange selected vectors and matrices" msgstr "Re&mplacer les vecteurs et matrices sélectionnés" #: ../src/libkstapp/changefiledialog.ui:272 msgctxt "ChangeFileDialog|" msgid "D&uplicate derived objects (curves, equations, ...)" msgstr "D&upliquer les objets dérivés (courbes, équations, ...)" #: ../src/libkstapp/changefiledialog.ui:282 msgctxt "ChangeFileDialog|" msgid "&Duplicate selected vectors and matrices" msgstr "&Dupliquer les vecteurs et matrices sélectionnés" #: ../src/libkstapp/changefiledialog.ui:312 msgctxt "ChangeFileDialog|" msgid "Unknown File Type" msgstr "Type de fichier inconnu" #: ../src/libkstapp/changefiledialog.ui:331 msgctxt "ChangeFileDialog|" msgid "Con&figure..." msgstr "Con&figurer..." #: ../src/libkstapp/choosecolordialog.ui:14 msgctxt "ChooseColorDialog|" msgid "Assign Curve Color From File" msgstr "Affecter les couleurs des courbes en fonction du fichier de données" #: ../src/libkstapp/choosecolordialog.ui:20 msgctxt "ChooseColorDialog|" msgid "Assign Colors" msgstr "Affecter les couleurs" #: ../src/libkstapp/choosecolordialog.ui:55 msgctxt "ChooseColorDialog|" msgid "Base Curve Color on:" msgstr "Baser les couleurs des courbes sur :" #: ../src/libkstapp/choosecolordialog.ui:64 msgctxt "ChooseColorDialog|" msgid "&X vector" msgstr "Le vecteur &X" #: ../src/libkstapp/choosecolordialog.ui:74 msgctxt "ChooseColorDialog|" msgid "&Y vector" msgstr "Le vecteur &Y" #: ../src/libkstapp/circledimensionstab.ui:19 msgctxt "CircleDimensionsTab|" msgid "&Radius" msgstr "&Rayon" #: ../src/libkstapp/circledimensionstab.ui:54 msgctxt "CircleDimensionsTab|" msgid "&Center" msgstr "&Centre" #: ../src/libkstapp/circledimensionstab.ui:76 msgctxt "CircleDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/circledimensionstab.ui:102 msgctxt "CircleDimensionsTab|" msgid "Lock Position To Data" msgstr "Position fixe par rapport aux données" #: ../src/libkstapp/circleitem.cpp:26 msgctxt "Kst::CircleItem|a circle in a picture" msgid "Circle" msgstr "Cercle" #: ../src/libkstapp/circleitem.cpp:150 msgctxt "QObject|" msgid "Error creating circle object from Kst file." msgstr "Erreur à la création de l'objet cercle depuis le fichier Kst." #: ../src/libkstapp/circleitem.h:53 ../src/libkstapp/circleitem.h:54 msgctxt "QObject|" msgid "Create Circle" msgstr "Créer un cercle" #: ../src/libkstapp/circleitemdialog.cpp:31 msgctxt "Kst::CircleItemDialog|" msgid "Size/Position" msgstr "Taille/position" #: ../src/libkstapp/commandlineparser.cpp:179 msgctxt "Kst::CommandLineParser|" msgid "end" msgstr "fin" #: ../src/libkstapp/commandlineparser.cpp:232 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "Column %1" msgstr "Colonne %1" #: ../src/libkstapp/commandlineparser.cpp:441 msgctxt "Kst::CommandLineParser|" msgid "Usage: -f \n" msgstr "Usage : -f \n" #: ../src/libkstapp/commandlineparser.cpp:444 msgctxt "Kst::CommandLineParser|" msgid "Usage: -n \n" msgstr "Usage : -n \n" #: ../src/libkstapp/commandlineparser.cpp:447 msgctxt "Kst::CommandLineParser|" msgid "Usage: -s \n" msgstr "Usage : -s \n" #: ../src/libkstapp/commandlineparser.cpp:454 msgctxt "Kst::CommandLineParser|" msgid "Usage: -P \n" msgstr "Usage : -P \n" #: ../src/libkstapp/commandlineparser.cpp:462 msgctxt "Kst::CommandLineParser|" msgid "Usage: -T \n" msgstr "Usage : -T \n" #: ../src/libkstapp/commandlineparser.cpp:484 msgctxt "Kst::CommandLineParser|" msgid "Usage: -x \n" msgstr "Usage : -x \n" #: ../src/libkstapp/commandlineparser.cpp:486 msgctxt "Kst::CommandLineParser|" msgid "Usage: -e \n" msgstr "Usage : -e \n" #: ../src/libkstapp/commandlineparser.cpp:488 msgctxt "Kst::CommandLineParser|" msgid "Usage: -r \n" msgstr "Usage : -r \n" #: ../src/libkstapp/commandlineparser.cpp:491 msgctxt "Kst::CommandLineParser|" msgid "Usage: -y \n" msgstr "Usage : -y \n" #: ../src/libkstapp/commandlineparser.cpp:494 msgctxt "Kst::CommandLineParser|" msgid "No data files specified\n" msgstr "Aucun fichier de données spécifié\n" #: ../src/libkstapp/commandlineparser.cpp:502 #: ../src/libkstapp/commandlineparser.cpp:545 #: ../src/libkstapp/commandlineparser.cpp:594 #: ../src/libkstapp/commandlineparser.cpp:634 #, qt-format msgctxt "Kst::CommandLineParser|" msgid "file %1 does not exist\n" msgstr "Le fichier « %1 » n'existe pas\n" #: ../src/libkstapp/commandlineparser.cpp:538 msgctxt "Kst::CommandLineParser|" msgid "Usage: -p \n" msgstr "Usage : -p \n" #: ../src/libkstapp/commandlineparser.cpp:587 msgctxt "Kst::CommandLineParser|" msgid "Usage: -h \n" msgstr "Usage : -h \n" #: ../src/libkstapp/commandlineparser.cpp:628 msgctxt "Kst::CommandLineParser|" msgid "Usage: -z \n" msgstr "Usage : -z \n" #: ../src/libkstapp/commandlineparser.cpp:655 msgctxt "Kst::CommandLineParser|" msgid "Usage: -F \n" msgstr "Usage : -F \n" #: ../src/libkstapp/commandlineparser.cpp:657 msgctxt "Kst::CommandLineParser|" msgid "Usage: --png \n" msgstr "Usage : --png \n" #: ../src/libkstapp/commandlineparser.cpp:660 msgctxt "Kst::CommandLineParser|" msgid "Usage: --print \n" msgstr "Usage : --print \n" #: ../src/libkstapp/contenttab.cpp:32 msgctxt "Kst::ContentTab|" msgid "Raise in plot order: Alt+Up" msgstr "Monter dans l'ordre des graphiques : Alt+haut" #: ../src/libkstapp/contenttab.cpp:33 msgctxt "Kst::ContentTab|" msgid "Lower in plot order: Alt+Down" msgstr "Descendre dans l'ordre des graphiques : Alt+bas" #: ../src/libkstapp/contenttab.cpp:34 msgctxt "Kst::ContentTab|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/contenttab.cpp:35 msgctxt "Kst::ContentTab|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/contenttab.ui:30 msgctxt "ContentTab|" msgid "&Available objects:" msgstr "Objets disp&onibles :" #: ../src/libkstapp/contenttab.ui:52 ../src/libkstapp/contenttab.ui:232 msgctxt "ContentTab|" msgid "Deselect All" msgstr "Tout désélectionner" #: ../src/libkstapp/contenttab.ui:59 ../src/libkstapp/contenttab.ui:242 msgctxt "ContentTab|" msgid "Select All" msgstr "Tout sélectionner" #: ../src/libkstapp/contenttab.ui:66 ../src/libkstapp/contenttab.ui:252 msgctxt "ContentTab|" msgid "Edit" msgstr "Modifier" #: ../src/libkstapp/contenttab.ui:109 msgctxt "ContentTab|" msgid "Raise in plot order: Alt+up" msgstr "Monter dans l'ordre des objets : Alt+Haut" #: ../src/libkstapp/contenttab.ui:115 msgctxt "ContentTab|" msgid "Alt+Up" msgstr "Alt+Haut" #: ../src/libkstapp/contenttab.ui:131 msgctxt "ContentTab|" msgid "Lower in plot order: Alt+down" msgstr "Descendre dans l'ordre des objets : Alt+Bas" #: ../src/libkstapp/contenttab.ui:137 msgctxt "ContentTab|" msgid "Alt+Down" msgstr "Alt+Bas" #: ../src/libkstapp/contenttab.ui:153 msgctxt "ContentTab|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/contenttab.ui:172 msgctxt "ContentTab|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/contenttab.ui:210 msgctxt "ContentTab|" msgid "&Displayed objects:" msgstr "Objets &affichés :" #: ../src/libkstapp/contenttab.ui:235 ../src/libkstapp/contenttab.ui:245 #: ../src/libkstapp/contenttab.ui:255 msgctxt "ContentTab|" msgid "buttonGroup" msgstr "groupe de boutons" #: ../src/libkstapp/contenttab.ui:274 msgctxt "ContentTab|" msgid "THIS, AND EVERYTHING BELOW IS FOR SCRIPTING AND SHOULD BE HIDDEN!" msgstr "" "CECI, ET TOUT CE QUI SUIT EST UTILE À L'ÉCRITURE DE SCRIPTS ET DEVRAIT ÊTRE " "MASQUÉ !" #: ../src/libkstapp/csddialog.cpp:43 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDTab|" msgid "Spectrogram" msgstr "Spectr&ogramme" #: ../src/libkstapp/csddialog.cpp:132 #, fuzzy #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSDDialog|" msgid "Edit Spectrogram" msgstr "Spectr&ogramme" #: ../src/libkstapp/csddialog.cpp:134 #, fuzzy #| msgctxt "Kst::DataManager|" #| msgid "Make Spectrogram" msgctxt "Kst::CSDDialog|" msgid "New Spectrogram" msgstr "Créer un spectrogramme" #: ../src/libkstapp/csdtab.ui:17 msgctxt "CSDTab|" msgid "Spectrogram Contents" msgstr "Contenu du spectrogramme" #: ../src/libkstapp/csdtab.ui:29 msgctxt "CSDTab|" msgid "Data vector:" msgstr "Vecteur de données :" #: ../src/libkstapp/csdtab.ui:42 msgctxt "CSDTab|" msgid "Window size:" msgstr "Taille de la fenêtre :" #: ../src/libkstapp/csdtab.ui:80 msgctxt "CSDTab|" msgid "Image Options" msgstr "Options des images" #: ../src/libkstapp/curvedialog.cpp:40 msgctxt "Kst::CurveTab|" msgid "Curve" msgstr "Courbe" #: ../src/libkstapp/curvedialog.cpp:297 msgctxt "Kst::CurveDialog|" msgid "Edit Curve" msgstr "Modifier la courbe" #: ../src/libkstapp/curvedialog.cpp:299 msgctxt "Kst::CurveDialog|" msgid "New Curve" msgstr "Nouvelle courbe" #: ../src/libkstapp/curvetab.ui:17 msgctxt "CurveTab|" msgid "Curve Contents" msgstr "Contenu de la courbe" #: ../src/libkstapp/curvetab.ui:38 msgctxt "CurveTab|" msgid "&X-axis vector:" msgstr "Vecteur de l'axe &X :" #: ../src/libkstapp/curvetab.ui:57 msgctxt "CurveTab|" msgid "&Y-axis vector:" msgstr "Vecteur de l'axe &Y :" #: ../src/libkstapp/curvetab.ui:76 msgctxt "CurveTab|" msgid "+X e&rror bar:" msgstr "Barre d'e&rreur +X :" #: ../src/libkstapp/curvetab.ui:95 msgctxt "CurveTab|" msgid "&+Y error bar:" msgstr "Barre d'erreur &+Y :" #: ../src/libkstapp/curvetab.ui:114 msgctxt "CurveTab|" msgid "-X error bar:" msgstr "&Barre d'erreur -X :" #: ../src/libkstapp/curvetab.ui:133 msgctxt "CurveTab|" msgid "&-Y error bar:" msgstr "Barre d'erreur &-Y :" #: ../src/libkstapp/curvetab.ui:148 msgctxt "CurveTab|" msgid "&Use +X error bar for -X" msgstr "&Utiliser l'erreur +X pour -X" #: ../src/libkstapp/curvetab.ui:155 msgctxt "CurveTab|" msgid "U&se +Y error bar for -Y" msgstr "Utili&ser l'erreur +Y pour -Y" #: ../src/libkstapp/curvetab.ui:197 msgctxt "CurveTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorer dans le calcul de l'échelle automatique" #: ../src/libkstapp/datadialog.cpp:89 msgctxt "Kst::DataDialog|" msgid "&Name:" msgstr "&Nom :" #: ../src/libkstapp/datadialog.cpp:97 msgctxt "Kst::DataDialog|automatic" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/datadialog.cpp:103 ../src/libkstapp/datadialog.cpp:232 msgctxt "Kst::DataDialog|" msgid "Edit Multiple >>" msgstr "Modification multiple >>" #: ../src/libkstapp/datadialog.cpp:243 #, qt-format msgctxt "Kst::DataDialog|" msgid "<< Edit one %1" msgstr "<< Modifier un(e) %1" #: ../src/libkstapp/datamanager.cpp:67 msgctxt "Kst::DataManager|" msgid "Enter your filter here (wildcards allowed)" msgstr "Saisissez ici votre filtre (caractères spéciaux autorisés)" #: ../src/libkstapp/datamanager.cpp:121 msgctxt "Kst::DataManager|" msgid "Edit" msgstr "Modifier" #: ../src/libkstapp/datamanager.cpp:127 ../src/libkstapp/datamanager.cpp:220 msgctxt "Kst::DataManager|" msgid "Make Curve" msgstr "Créer une courbe" #: ../src/libkstapp/datamanager.cpp:131 ../src/libkstapp/datamanager.cpp:224 msgctxt "Kst::DataManager|" msgid "Make Power Spectrum" msgstr "Créer un spectre" #: ../src/libkstapp/datamanager.cpp:135 ../src/libkstapp/datamanager.cpp:228 msgctxt "Kst::DataManager|" msgid "Make Spectrogram" msgstr "Créer un spectrogramme" #: ../src/libkstapp/datamanager.cpp:139 ../src/libkstapp/datamanager.cpp:232 msgctxt "Kst::DataManager|" msgid "Make Histogram" msgstr "Créer un histogramme" #: ../src/libkstapp/datamanager.cpp:144 ../src/libkstapp/datamanager.cpp:195 #: ../src/libkstapp/datamanager.cpp:237 msgctxt "Kst::DataManager|" msgid "Apply Filter" msgstr "Appliquer le filtre" #: ../src/libkstapp/datamanager.cpp:149 ../src/libkstapp/datamanager.cpp:243 msgctxt "Kst::DataManager|" msgid "Make Image" msgstr "Créer une image" #: ../src/libkstapp/datamanager.cpp:176 msgctxt "Kst::DataManager|" msgid "Add to Plot" msgstr "Ajouter au graphique" #: ../src/libkstapp/datamanager.cpp:182 msgctxt "Kst::DataManager|" msgid "Remove From Plot" msgstr "Supprimer du graphique" #: ../src/libkstapp/datamanager.cpp:189 msgctxt "Kst::DataManager|" msgid "Apply Fit" msgstr "Appliquer la régression" #: ../src/libkstapp/datamanager.cpp:202 msgctxt "Kst::DataManager|" msgid "Delete" msgstr "Supprimer" #: ../src/libkstapp/datamanager.ui:14 msgctxt "DataManager|" msgid "Data Manager" msgstr "Gestionnaire de données" #: ../src/libkstapp/datamanager.ui:22 msgctxt "DataManager|" msgid "Filter on:" msgstr "Filtrer sur :" #: ../src/libkstapp/datamanager.ui:30 msgctxt "DataManager|" msgid "All Columns" msgstr "Toutes les colonnes" #: ../src/libkstapp/datamanager.ui:35 msgctxt "DataManager|the name of the item (noun)" msgid "Name" msgstr "Nom" #: ../src/libkstapp/datamanager.ui:40 msgctxt "DataManager|the type of the item (noun)" msgid "Type" msgstr "Type" #: ../src/libkstapp/datamanager.ui:45 msgctxt "DataManager|" msgid "Samples" msgstr "Échantillons" #: ../src/libkstapp/datamanager.ui:50 msgctxt "DataManager|" msgid "Properties" msgstr "Propriétés" #: ../src/libkstapp/datamanager.ui:65 msgctxt "DataManager|" msgid "Case sensitive" msgstr "Sensible à la casse" #: ../src/libkstapp/datamanager.ui:113 msgctxt "DataManager|" msgid "Purge" msgstr "Purger" #: ../src/libkstapp/datasourcepluginfactory.cpp:65 msgctxt "QObject|" msgid "Error creating data source from Kst file." msgstr "Erreur à la création de la source de données depuis le fichier Kst." #: ../src/libkstapp/datawizard.cpp:64 msgctxt "Kst::DataWizardPageDataSource|update periodically" msgid "Time Interval" msgstr "Intervalle de temps" #: ../src/libkstapp/datawizard.cpp:65 msgctxt "Kst::DataWizardPageDataSource|update when a change is detected" msgid "Change Detection" msgstr "Modifications du fichier" #: ../src/libkstapp/datawizard.cpp:66 msgctxt "Kst::DataWizardPageDataSource|do not update the file" msgid "No Update" msgstr "Aucune mise à jour " #: ../src/libkstapp/datawizard.cpp:188 msgctxt "Kst::DataWizardPageVectors|" msgid "Raise in plot order: Alt+Up" msgstr "Monter dans l'ordre des graphiques : Alt+Haut" #: ../src/libkstapp/datawizard.cpp:189 msgctxt "Kst::DataWizardPageVectors|" msgid "Lower in plot order: Alt+Down" msgstr "Descendre dans l'ordre des graphiques : Alt+Bas" #: ../src/libkstapp/datawizard.cpp:190 msgctxt "Kst::DataWizardPageVectors|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/datawizard.cpp:191 msgctxt "Kst::DataWizardPageVectors|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/datawizard.cpp:221 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) available" msgstr "%1 vecteur(s) disponible(s)" #: ../src/libkstapp/datawizard.cpp:246 ../src/libkstapp/datawizard.cpp:262 #, qt-format msgctxt "Kst::DataWizardPageVectors|" msgid "%1 vector(s) selected" msgstr "%1 vecteur(s) sélectionné(s)" #: ../src/libkstapp/datawizard.cpp:590 msgctxt "Kst::DataWizardPageDataPresentation|" msgid "Create S&pectra Plots. Set FFT options below:" msgstr "Créer des s&pectres de fréquence. Voir les options de FFT ci-dessous :" #: ../src/libkstapp/datawizard.cpp:881 msgctxt "Kst::DataWizard|" msgid "Insufficient Memory" msgstr "Mémoire insuffisante" #: ../src/libkstapp/datawizard.cpp:881 #, qt-format msgctxt "Kst::DataWizard|" msgid "" "You requested to read in %1 MB of data but it seems that you only have " "approximately %2 MB of usable memory available. You cannot load this much " "data." msgstr "" "Vous avez demandé de lire %1 Mo de données d'entrée, mais il semble que vous " "ayez environ %2 Mo de mémoire disponible. Vous ne pouvez charger autant de " "données." #: ../src/libkstapp/datawizardpagedatapresentation.ui:23 msgctxt "DataWizardPageDataPresentation|" msgid "Create &XY plots. Set X-axis vector properties below:" msgstr "" "Créer des graphiques &XY. Définir les propriétés du vecteur de l'axe X ci-" "dessous :" #: ../src/libkstapp/datawizardpagedatapresentation.ui:38 msgctxt "DataWizardPageDataPresentation|" msgid "Create fr&om field:" msgstr "Créer à partir de la &variable :" #: ../src/libkstapp/datawizardpagedatapresentation.ui:54 msgctxt "DataWizardPageDataPresentation|" msgid "Use existin&g:" msgstr "Utiliser un vecteur &existant :" #: ../src/libkstapp/datawizardpagedatapresentation.ui:67 msgctxt "DataWizardPageDataPresentation|" msgid "The field to be used as the X-axis in XY curves." msgstr "Le champ à utiliser comme axe X dans les courbes XY." #: ../src/libkstapp/datawizardpagedatasource.ui:29 msgctxt "DataWizardPageDataSource|" msgid "" "\n" "\n" "

Please select a data source to work from. " "This will typically be your file containing data points or vectors." msgstr "" "\n" "\n" "

Veuillez sélectionner une source de données depuis laquelle travailler. Ce sera typiquement un fichier contenant des " "points de données ou des vecteurs.

" #: ../src/libkstapp/datawizardpagedatasource.ui:85 msgctxt "DataWizardPageDataSource|" msgid "Unknown file type" msgstr "Type de fichier inconnu" #: ../src/libkstapp/datawizardpagedatasource.ui:104 msgctxt "DataWizardPageDataSource|" msgid "Con&figure..." msgstr "Con&figurer..." #: ../src/libkstapp/datawizardpagedatasource.ui:134 #, fuzzy msgctxt "DataWizardPageDataSource|" msgid "Update type; use 'Time Interval' for non-local data" msgstr "" "Méthode de mise à jour des données ; utiliser « Intervalle de temps » pour " "des données non locales" #: ../src/libkstapp/datawizardpagefilters.ui:14 msgctxt "DataWizardPageFilters|" msgid "Filters" msgstr "Filtres" #: ../src/libkstapp/datawizardpagefilters.ui:28 msgctxt "DataWizardPageFilters|" msgid "&New Filter..." msgstr "&Nouveau filtre..." #: ../src/libkstapp/datawizardpagefilters.ui:56 msgctxt "DataWizardPageFilters|" msgid "" "\n" "\n" "

If you wish, select a " "filter to apply to the fields that are read in:

" msgstr "" "\n" "\n" "

Si vous le désirez," "sélectionnez un filtre à appliquer aux variables qui sont lues en entrée :" #: ../src/libkstapp/datawizardpageplot.ui:17 msgctxt "DataWizardPagePlot|" msgid "Curve Placement" msgstr "Placement des courbes" #: ../src/libkstapp/datawizardpageplot.ui:23 msgctxt "DataWizardPagePlot|" msgid "&All curves in one plot" msgstr "&Toutes les courbes dans un graphique" #: ../src/libkstapp/datawizardpageplot.ui:33 msgctxt "DataWizardPagePlot|" msgid "&1 new plot per curve" msgstr "&1 nouveau graphique par courbe" #: ../src/libkstapp/datawizardpageplot.ui:36 msgctxt "DataWizardPagePlot|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/datawizardpageplot.ui:51 msgctxt "DataWizardPagePlot|" msgid "Cycle t&hrough" msgstr "&Répartir sur" #: ../src/libkstapp/datawizardpageplot.ui:64 msgctxt "DataWizardPagePlot|" msgid " plots" msgstr " graphiques" #: ../src/libkstapp/datawizardpageplot.ui:79 msgctxt "DataWizardPagePlot|" msgid "Cycle through exis&ting plots" msgstr "Répartir sur les graphiques exis&tants" #: ../src/libkstapp/datawizardpageplot.ui:94 msgctxt "DataWizardPagePlot|" msgid "All curv&es in plot" msgstr "Toutes les courb&es dans le graphique" #: ../src/libkstapp/datawizardpageplot.ui:113 msgctxt "DataWizardPagePlot|" msgid "Plot Placement (Tabs)" msgstr "Placement des graphiques (onglets)" #: ../src/libkstapp/datawizardpageplot.ui:119 msgctxt "DataWizardPagePlot|" msgid "All in ¤t tab" msgstr "Tous dans l'onglet a&ctuel" #: ../src/libkstapp/datawizardpageplot.ui:129 msgctxt "DataWizardPagePlot|" msgid "All in ne&w tab" msgstr "Tous dans un nou&vel onglet" #: ../src/libkstapp/datawizardpageplot.ui:136 msgctxt "DataWizardPagePlot|" msgid "XY and spectra in &separate new tabs" msgstr "XY et spectres dans de nouveaux onglets &séparés" #: ../src/libkstapp/datawizardpageplot.ui:146 msgctxt "DataWizardPagePlot|" msgid "Plot Layout" msgstr "Mise en page des graphiques" #: ../src/libkstapp/datawizardpageplot.ui:152 msgctxt "DataWizardPagePlot|" msgid "Automatic &layout" msgstr "Mise en page automati&que" #: ../src/libkstapp/datawizardpageplot.ui:162 msgctxt "DataWizardPagePlot|" msgid "Custo&m grid" msgstr "Grille &personnalisée - " #: ../src/libkstapp/datawizardpageplot.ui:171 msgctxt "DataWizardPagePlot|" msgid "Columns:" msgstr "colonnes :" #: ../src/libkstapp/datawizardpageplot.ui:193 msgctxt "DataWizardPagePlot|" msgid "P&rotect existing layout" msgstr "P&rotéger la mise en page existante" #: ../src/libkstapp/datawizardpageplot.ui:203 msgctxt "DataWizardPagePlot|" msgid "Labels" msgstr "Libellés" #: ../src/libkstapp/datawizardpageplot.ui:209 msgctxt "DataWizardPagePlot|" msgid "Rescale all labels on tab" msgstr "Redimensionner tous les libellés de l'onglet" #: ../src/libkstapp/datawizardpageplot.ui:219 msgctxt "DataWizardPagePlot|" msgid "Share axis on tab" msgstr "Partager l'axe dans cet onglet" #: ../src/libkstapp/datawizardpageplot.ui:229 msgctxt "DataWizardPagePlot|" msgid "Cur&ve Style" msgstr "Style de cour&be" #: ../src/libkstapp/datawizardpageplot.ui:235 msgctxt "DataWizardPagePlot|" msgid "L&ines only" msgstr "&Lignes" #: ../src/libkstapp/datawizardpageplot.ui:245 msgctxt "DataWizardPagePlot|" msgid "&Points only" msgstr "&Points" #: ../src/libkstapp/datawizardpageplot.ui:252 msgctxt "DataWizardPagePlot|" msgid "Lines an&d points" msgstr "Lignes &et points" #: ../src/libkstapp/datawizardpageplot.ui:262 msgctxt "DataWizardPagePlot|" msgid "Spectrum Axis Mode" msgstr "Options d'axes pour les spectres" #: ../src/libkstapp/datawizardpageplot.ui:268 msgctxt "DataWizardPagePlot|" msgid "Lo&g X-axis" msgstr "Axe X logarith&mique" #: ../src/libkstapp/datawizardpageplot.ui:275 msgctxt "DataWizardPagePlot|" msgid "&Log Y-axis" msgstr "Axe Y lo&garithmique" #: ../src/libkstapp/datawizardpageplot.ui:298 msgctxt "DataWizardPagePlot|" msgid "Legends" msgstr "Légendes" #: ../src/libkstapp/datawizardpageplot.ui:304 msgctxt "DataWizardPagePlot|" msgid "O&n" msgstr "&Activées" #: ../src/libkstapp/datawizardpageplot.ui:311 msgctxt "DataWizardPagePlot|" msgid "&Off" msgstr "&Désactivées" #: ../src/libkstapp/datawizardpageplot.ui:318 msgctxt "DataWizardPagePlot|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/datawizardpageplot.ui:328 msgctxt "DataWizardPagePlot|" msgid "&Vertical" msgstr "&Verticales" #: ../src/libkstapp/datawizardpagevectors.ui:47 msgctxt "DataWizardPageVectors|" msgid "Raise in plot order (Alt-up)" msgstr "Monter dans l'ordre des graphiques (Alt+Haut)" #: ../src/libkstapp/datawizardpagevectors.ui:53 msgctxt "DataWizardPageVectors|" msgid "Alt+Up" msgstr "Alt+Haut" #: ../src/libkstapp/datawizardpagevectors.ui:69 msgctxt "DataWizardPageVectors|" msgid "Alt+Down" msgstr "Alt+Bas" #: ../src/libkstapp/datawizardpagevectors.ui:82 msgctxt "DataWizardPageVectors|" msgid "" "Select (Alt-S): Move highlighted fields from the Available data list to the " "Selected data list for plotting." msgstr "" "Sélectionner (Alt-S) : déplace les variables surlignées depuis la liste de " "données disponibles vers la liste de données sélectionnées pour être tracées." #: ../src/libkstapp/datawizardpagevectors.ui:98 msgctxt "DataWizardPageVectors|" msgid "" "Remove (Alt-R): Move highlighted fields from the Selected data list to the " "Available data list so that they will not be plotted." msgstr "" "Supprimer (Alt-R) : supprime les variables surlignées de la liste de données " "sélectionnées pour être tracées." #: ../src/libkstapp/datawizardpagevectors.ui:131 msgctxt "DataWizardPageVectors|" msgid "Selected data: All fields in this list are plotted." msgstr "Données sélectionnées : les variables dans cette liste seront tracées." #: ../src/libkstapp/datawizardpagevectors.ui:134 msgctxt "DataWizardPageVectors|" msgid "" "Selected data: All fields in this list are plotted. To remove fields from " "this list, drag them to the Available data list, double click on them, or " "select them and use the Remove button (right arrow icon or Alt-R). The " "order in which fields appear in this list is the order in which they will be " "plotted." msgstr "" "Données sélectionnées : les variables dans cette liste seront tracées. Pour " "supprimer des variables de cette liste, il est possible de les glisser-" "déposer dans la liste des données disponibles, de double-cliquer dessus ou " "de les surligner et d'utiliser le bouton Supprimer (flèche vers la gauche, " "ou Alt+r). L'ordre dans la liste correspond à l'ordre dans lequel les " "données seront tracées." #: ../src/libkstapp/datawizardpagevectors.ui:144 msgctxt "DataWizardPageVectors|" msgid "Selected data:" msgstr "Données sélectionnées :" #: ../src/libkstapp/datawizardpagevectors.ui:154 msgctxt "DataWizardPageVectors|" msgid "0 vector(s) selected" msgstr "0 vecteur sélectionné" #: ../src/libkstapp/datawizardpagevectors.ui:168 msgctxt "DataWizardPageVectors|" msgid "Search Filter" msgstr "Filtre de recherche" #: ../src/libkstapp/datawizardpagevectors.ui:171 msgctxt "DataWizardPageVectors|" msgid "" "Search Filter: Fields matching this filter will be highlighted and moved to " "the top of the Available data list. '*' and '?' wild cards are supported." msgstr "" "Filtre de recherche : les variables correspondant au filtre seront " "surlignées et mises en haut de la liste. Les caractères * et ? sont acceptés." #: ../src/libkstapp/datawizardpagevectors.ui:184 msgctxt "DataWizardPageVectors|" msgid "" "Appends the '*' wild card to the beginning and end of the search filter to " "match everything containing the search filter text." msgstr "" "Ajoute le caractère spécial * en début et fin de liste pour trouver toutes " "les variables contenant la chaîne indiquée." #: ../src/libkstapp/datawizardpagevectors.ui:187 msgctxt "DataWizardPageVectors|" msgid "S&earch" msgstr "R&echercher" #: ../src/libkstapp/datawizardpagevectors.ui:194 msgctxt "DataWizardPageVectors|" msgid "Field selection: Checked fields are plotted." msgstr "" "Sélection des variables : les variables sélectionnées peuvent être ajoutées " "au graphique via le bouton fléche vers la droite ou le raccourci clavier Alt" "+s." #: ../src/libkstapp/datawizardpagevectors.ui:197 msgctxt "DataWizardPageVectors|" msgid "" "Available data: This box lists all fields which have not been selected for " "plotting. To select a field for plotting, move it to the Selected data " "list, by dragging it with the mouse, by double clicking, or by highlighting " "it, and clicking on the select button (Right Arrow - accelerator is Alt-S)." msgstr "" "Données disponibles : cette liste contient toutes les variables qui n'ont " "pas été sélectionnées pour être tracées. Pour ajouter des variables à la " "liste des données à tracer, il est possible de les glisser-déposer dans la " "liste des données sélectionnées, de double-cliquer dessus ou de les " "surligner et d'utiliser le bouton Ajouter (flèche vers la droite, ou Alt+s)" #: ../src/libkstapp/datawizardpagevectors.ui:207 msgctxt "DataWizardPageVectors|" msgid "Available data:" msgstr "Données disponibles :" #: ../src/libkstapp/datawizardpagevectors.ui:217 msgctxt "DataWizardPageVectors|" msgid "- vector(s) available" msgstr "- vecteur(s) disponible(s)" #: ../src/libkstapp/debugdialog.cpp:42 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1 (%2)" msgstr "

Kst

Version %1 (%2)" #: ../src/libkstapp/debugdialog.cpp:44 #, qt-format msgctxt "Kst::DebugDialog|" msgid "

Kst

Version %1" msgstr "

Kst

Version %1" #: ../src/libkstapp/debugdialog.ui:14 msgctxt "DebugDialog|" msgid "Kst Debug Dialog" msgstr "Fenêtre de débogage de Kst" #: ../src/libkstapp/debugdialog.ui:24 msgctxt "DebugDialog|" msgid "Build Information" msgstr "Informations de compilation" #: ../src/libkstapp/debugdialog.ui:65 msgctxt "DebugDialog|" msgid "&Email Debugging Information" msgstr "&Envoyer les informations de débogage" #: ../src/libkstapp/debugdialog.ui:89 msgctxt "DebugDialog|" msgid "Log" msgstr "Journal" #: ../src/libkstapp/debugdialog.ui:100 msgctxt "DebugDialog|" msgid "Log level: " msgstr "Niveau de journalisation :" #: ../src/libkstapp/debugdialog.ui:107 msgctxt "DebugDialog|" msgid "&Error" msgstr "&Erreur" #: ../src/libkstapp/debugdialog.ui:117 msgctxt "DebugDialog|" msgid "&Warning" msgstr "&Avertissement" #: ../src/libkstapp/debugdialog.ui:127 msgctxt "DebugDialog|" msgid "&Notice" msgstr "&Information" #: ../src/libkstapp/debugdialog.ui:140 msgctxt "DebugDialog|" msgid "&Trace" msgstr "&Trace" #: ../src/libkstapp/debugdialog.ui:163 msgctxt "DebugDialog|" msgid "Clea&r" msgstr "E&ffacer" #: ../src/libkstapp/debugdialog.ui:173 msgctxt "DebugDialog|" msgid "Data Sources" msgstr "Sources de données" #: ../src/libkstapp/debugdialog.ui:189 msgctxt "DebugDialog|" msgid "Plugin" msgstr "Module" #: ../src/libkstapp/debugdialog.ui:194 msgctxt "DebugDialog|" msgid "Loaded Instance" msgstr "Instance chargée" #: ../src/libkstapp/debugdialog.ui:224 msgctxt "DebugDialog|" msgid "&Close" msgstr "&Fermer" #: ../src/libkstapp/debugnotifier.cpp:33 msgctxt "Kst::DebugNotifier|" msgid "An error has occurred. Click on this icon for more details." msgstr "" "Une erreur est survenue. Cliquer sur cette icône pour obtenir plus de " "détails." #: ../src/libkstapp/defaultlabelpropertiestab.cpp:31 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Fonts" msgstr "Polices" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:33 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Letter" msgstr "Lettre" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:34 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "A4" msgstr "A4" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:35 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Journal Plot" msgstr "Graphique pour un journal" #: ../src/libkstapp/defaultlabelpropertiestab.cpp:36 msgctxt "Kst::DefaultLabelPropertiesTab|" msgid "Custom" msgstr "Personnalisé" #: ../src/libkstapp/defaultlabelpropertiestab.ui:19 msgctxt "DefaultLabelPropertiesTab|" msgid "&Minimum font size (points):" msgstr "Taille de police minimale (points) :" #: ../src/libkstapp/defaultlabelpropertiestab.ui:38 msgctxt "DefaultLabelPropertiesTab|" msgid "On window resize, fonts will be displayed at least this large." msgstr "" "Lors du redimensionnement de la fenêtre, les polices seront affichées avec " "au moins cette taille" #: ../src/libkstapp/defaultlabelpropertiestab.ui:45 msgctxt "DefaultLabelPropertiesTab|" msgid "Reference view size:" msgstr "Taille de référence pour la page :" #: ../src/libkstapp/defaultlabelpropertiestab.ui:55 msgctxt "DefaultLabelPropertiesTab|" msgid "When the window is this large, fonts will have stated size." msgstr "" "Quand la fenêtre est de cette taille, les polices ont exactement la taille " "spécifiée." #: ../src/libkstapp/defaultlabelpropertiestab.ui:58 msgctxt "DefaultLabelPropertiesTab|" msgid "" "Fonts are scaled with the window or print size. When the window/print is " "this large, the font sizes stated will be accurate." msgstr "" "Les polices sont mises à l'échelle en fonction de la taille de la fenêtre ou " "de la page lors de l'impression. Lorsque la taille de la fenêtre ou de la " "page correspond à cette valeur, les polices ont exactement les tailles " "spécifiées." #: ../src/libkstapp/defaultlabelpropertiestab.ui:65 msgctxt "DefaultLabelPropertiesTab|" msgid "Custom reference size (cm):" msgstr "Taille de référence personnalisée (cm) :" #: ../src/libkstapp/dialog.ui:133 msgctxt "Dialog|" msgid "Save as default" msgstr "Appliquer par défaut" #: ../src/libkstapp/dialog.ui:150 msgctxt "Dialog|" msgid "Apply to existing objects" msgstr "Appliquer aux objets existants" #: ../src/libkstapp/differentiatecurvesdialog.cpp:55 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property up the priority list" msgstr "Déplacer la propriété sélectionnée vers le haut de la liste" #: ../src/libkstapp/differentiatecurvesdialog.cpp:56 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Move the selected property down the priority list" msgstr "Déplacer la propriété sélectionnée vers le bas de la liste" #: ../src/libkstapp/differentiatecurvesdialog.cpp:57 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Add the selected property to the list of properties to cycle through" msgstr "" "Ajouter la propriété sélectionnée à la liste des propriétés à parcourir" #: ../src/libkstapp/differentiatecurvesdialog.cpp:58 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "" "Remove the selected property from the list of properties to cycle through" msgstr "" "Supprimer la propriété sélectionnée de la liste des propriétés à parcourir" #: ../src/libkstapp/differentiatecurvesdialog.cpp:77 #: ../src/libkstapp/differentiatecurvesdialog.cpp:164 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Color" msgstr "Couleur de ligne" #: ../src/libkstapp/differentiatecurvesdialog.cpp:78 #: ../src/libkstapp/differentiatecurvesdialog.cpp:165 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Point Style" msgstr "Style de point" #: ../src/libkstapp/differentiatecurvesdialog.cpp:79 #: ../src/libkstapp/differentiatecurvesdialog.cpp:166 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Style" msgstr "Style de ligne" #: ../src/libkstapp/differentiatecurvesdialog.cpp:80 #: ../src/libkstapp/differentiatecurvesdialog.cpp:167 msgctxt "Kst::DifferentiateCurvesDialog|" msgid "Line Width" msgstr "Largeur de ligne" #: ../src/libkstapp/differentiatecurvesdialog.ui:14 msgctxt "DifferentiateCurvesDialog|" msgid "Differentiate Curves" msgstr "Différencier les courbes" #: ../src/libkstapp/differentiatecurvesdialog.ui:20 msgctxt "DifferentiateCurvesDialog|" msgid "Property Selection and Cycle Order" msgstr "Sélection des propriétés et ordre de variation" #: ../src/libkstapp/differentiatecurvesdialog.ui:40 msgctxt "DifferentiateCurvesDialog|" msgid "Raise in Selection Order: Alt+up" msgstr "Monter dans l'ordre de sélection : Alt+Haut" #: ../src/libkstapp/differentiatecurvesdialog.ui:46 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Up" msgstr "Alt+Haut" #: ../src/libkstapp/differentiatecurvesdialog.ui:59 msgctxt "DifferentiateCurvesDialog|" msgid "Lower in Selection Order: Alt+down" msgstr "Descendre dans l'ordre de sélection : Alt+Bas" #: ../src/libkstapp/differentiatecurvesdialog.ui:65 msgctxt "DifferentiateCurvesDialog|" msgid "Alt+Down" msgstr "Alt+Bas" #: ../src/libkstapp/differentiatecurvesdialog.ui:78 msgctxt "DifferentiateCurvesDialog|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/differentiatecurvesdialog.ui:94 msgctxt "DifferentiateCurvesDialog|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/differentiatecurvesdialog.ui:111 msgctxt "DifferentiateCurvesDialog|The items which are available" msgid "Available:" msgstr "Disponibles :" #: ../src/libkstapp/differentiatecurvesdialog.ui:131 msgctxt "DifferentiateCurvesDialog|the items which have been selected" msgid "Selected:" msgstr "Sélectionnées :" #: ../src/libkstapp/differentiatecurvesdialog.ui:181 msgctxt "DifferentiateCurvesDialog|" msgid "Options" msgstr "Options" #: ../src/libkstapp/differentiatecurvesdialog.ui:218 msgctxt "DifferentiateCurvesDialog|" msgid "Maximum line width:" msgstr "Largeur de ligne maximale :" #: ../src/libkstapp/differentiatecurvesdialog.ui:235 msgctxt "DifferentiateCurvesDialog|" msgid "Point density:" msgstr "Densité de points :" #: ../src/libkstapp/differentiatecurvesdialog.ui:246 msgctxt "DifferentiateCurvesDialog|all of the points" msgid "All" msgstr "Tous" #: ../src/libkstapp/differentiatecurvesdialog.ui:251 msgctxt "DifferentiateCurvesDialog|high point density" msgid "High" msgstr "Élevée" #: ../src/libkstapp/differentiatecurvesdialog.ui:256 msgctxt "DifferentiateCurvesDialog|medium point density" msgid "Medium" msgstr "Moyenne" #: ../src/libkstapp/differentiatecurvesdialog.ui:261 msgctxt "DifferentiateCurvesDialog|low point density" msgid "Low" msgstr "Faible" #: ../src/libkstapp/dimensionstab.cpp:20 msgctxt "Kst::DimensionsTab|" msgid "Size/Position" msgstr "Taille/position" #: ../src/libkstapp/dimensionstab.ui:25 msgctxt "DimensionsTab|" msgid "&Rotation:" msgstr "&Rotation :" #: ../src/libkstapp/dimensionstab.ui:45 msgctxt "DimensionsTab|" msgid "&Size:" msgstr "&Taille :" #: ../src/libkstapp/dimensionstab.ui:80 msgctxt "DimensionsTab|" msgid "&x" msgstr "&x" #: ../src/libkstapp/dimensionstab.ui:99 msgctxt "DimensionsTab|" msgid "&," msgstr "&," #: ../src/libkstapp/dimensionstab.ui:125 msgctxt "DimensionsTab|" msgid "&Position:" msgstr "&Position :" #: ../src/libkstapp/dimensionstab.ui:154 msgctxt "DimensionsTab|" msgid "&Fix aspect ratio" msgstr "&Fixer les proportions" #: ../src/libkstapp/dimensionstab.ui:174 msgctxt "DimensionsTab|" msgid "Lock Position To Data" msgstr "Position fixe par rapport aux données" #: ../src/libkstapp/document.cpp:118 msgctxt "QObject|" msgid "File could not be opened for writing." msgstr "Impossible d'ouvrir le fichier en écriture." #: ../src/libkstapp/document.cpp:234 msgctxt "QObject|" msgid "File could not be opened for reading." msgstr "Impossible d'ouvrir le fichier en lecture." #: ../src/libkstapp/document.cpp:400 msgctxt "QObject|" msgid "File is malformed and encountered an error while reading." msgstr "Le fichier est malformé et une erreur est survenue lors de la lecture." #: ../src/libkstapp/editmultiplewidget.ui:31 msgctxt "EditMultipleWidget|" msgid "Select Objects to Edit" msgstr "Sélectionner les objets à modifier" #: ../src/libkstapp/editmultiplewidget.ui:49 msgctxt "EditMultipleWidget|" msgid "Filter:" msgstr "Filtre :" #: ../src/libkstapp/editmultiplewidget.ui:73 msgctxt "EditMultipleWidget|clear the list" msgid "Clear" msgstr "Effa&cer" #: ../src/libkstapp/editmultiplewidget.ui:80 msgctxt "EditMultipleWidget|" msgid "Select &All" msgstr "&Tout sélectionner" #: ../src/libkstapp/ellipseitem.cpp:25 msgctxt "Kst::EllipseItem|an ellipse in a picture" msgid "Ellipse" msgstr "Ellipse" #: ../src/libkstapp/ellipseitem.cpp:106 msgctxt "QObject|" msgid "Error creating ellipse object from Kst file." msgstr "Erreur à la création de l'objet ellipse depuis le fichier Kst." #: ../src/libkstapp/ellipseitem.h:43 ../src/libkstapp/ellipseitem.h:44 msgctxt "QObject|" msgid "Create Ellipse" msgstr "Créer une ellipse" #: ../src/libkstapp/equationdialog.cpp:39 msgctxt "Kst::EquationTab|" msgid "Equation" msgstr "Équation" #: ../src/libkstapp/equationdialog.cpp:238 msgctxt "Kst::EquationDialog|" msgid "Edit Equation" msgstr "Modifier l'équation" #: ../src/libkstapp/equationdialog.cpp:240 msgctxt "Kst::EquationDialog|" msgid "New Equation" msgstr "Nouvelle équation" #: ../src/libkstapp/equationtab.ui:17 msgctxt "EquationTab|" msgid "Equation" msgstr "Équation" #: ../src/libkstapp/equationtab.ui:29 msgctxt "EquationTab|" msgid "Eq&uation:" msgstr "Éq&uation :" #: ../src/libkstapp/equationtab.ui:48 msgctxt "EquationTab|" msgid "" "Enter the equation to be evaluated here. Use 'x' as the independent " "variable. Vectors and operators are selected from the above lists." msgstr "" "Veuillez saisir ici l'équation à évaluer. Utilisez « x » comme variable " "indépendante. Les vecteurs et opérateurs sont sélectionnés dans la liste ci-" "dessus." #: ../src/libkstapp/equationtab.ui:55 msgctxt "EquationTab|" msgid "&X vector:" msgstr "Vecteur &X:" #: ../src/libkstapp/equationtab.ui:78 msgctxt "EquationTab|" msgid "Inte&rpolate to highest resolution vector" msgstr "Inte&rpoler tous les vecteurs à la plus grande longueur" #: ../src/libkstapp/eventmonitordialog.cpp:31 msgctxt "Kst::EventMonitorTab|" msgid "Event Monitor" msgstr "Moniteur d'évènements" #: ../src/libkstapp/eventmonitordialog.cpp:250 msgctxt "Kst::EventMonitorDialog|" msgid "Edit Event Monitor" msgstr "Modifier le moniteur d'évènements" #: ../src/libkstapp/eventmonitordialog.cpp:252 msgctxt "Kst::EventMonitorDialog|" msgid "New Event Monitor" msgstr "Nouveau moniteur d'évènements" #: ../src/libkstapp/eventmonitortab.ui:29 msgctxt "EventMonitorTab|" msgid "E-Mail Notification" msgstr "Notification par message électronique" #: ../src/libkstapp/eventmonitortab.ui:35 msgctxt "EventMonitorTab|" msgid "N&otify:" msgstr "Notifier :" #: ../src/libkstapp/eventmonitortab.ui:58 msgctxt "EventMonitorTab|" msgid "Expression" msgstr "Expression" #: ../src/libkstapp/eventmonitortab.ui:64 msgctxt "EventMonitorTab|" msgid "Vectors:" msgstr "Vecteurs :" #: ../src/libkstapp/eventmonitortab.ui:74 msgctxt "EventMonitorTab|" msgid "Operators:" msgstr "Opérateurs :" #: ../src/libkstapp/eventmonitortab.ui:88 msgctxt "EventMonitorTab|" msgid "+" msgstr "+" #: ../src/libkstapp/eventmonitortab.ui:93 msgctxt "EventMonitorTab|" msgid "-" msgstr "-" #: ../src/libkstapp/eventmonitortab.ui:98 msgctxt "EventMonitorTab|" msgid "*" msgstr "*" #: ../src/libkstapp/eventmonitortab.ui:103 msgctxt "EventMonitorTab|" msgid "/" msgstr "/" #: ../src/libkstapp/eventmonitortab.ui:108 msgctxt "EventMonitorTab|" msgid "^" msgstr "^" #: ../src/libkstapp/eventmonitortab.ui:113 msgctxt "EventMonitorTab|Number: 3.14159265...." msgid "PI" msgstr "PI" #: ../src/libkstapp/eventmonitortab.ui:118 msgctxt "EventMonitorTab|Euler's number " msgid "e" msgstr "e" #: ../src/libkstapp/eventmonitortab.ui:123 msgctxt "EventMonitorTab|" msgid "=" msgstr "=" #: ../src/libkstapp/eventmonitortab.ui:128 msgctxt "EventMonitorTab|" msgid "<" msgstr "<" #: ../src/libkstapp/eventmonitortab.ui:133 msgctxt "EventMonitorTab|" msgid "<=" msgstr "<=" #: ../src/libkstapp/eventmonitortab.ui:138 msgctxt "EventMonitorTab|" msgid ">" msgstr ">" #: ../src/libkstapp/eventmonitortab.ui:143 msgctxt "EventMonitorTab|" msgid ">=" msgstr ">=" #: ../src/libkstapp/eventmonitortab.ui:148 msgctxt "EventMonitorTab|" msgid "&" msgstr "&" #: ../src/libkstapp/eventmonitortab.ui:153 msgctxt "EventMonitorTab|" msgid "|" msgstr "|" #: ../src/libkstapp/eventmonitortab.ui:158 msgctxt "EventMonitorTab|" msgid "!" msgstr "!" # Ne pas traduire, sinon l'interpréteur ne reconnaîtra plus les expressions #: ../src/libkstapp/eventmonitortab.ui:163 msgctxt "EventMonitorTab|A mathematical function" msgid "STEP()" msgstr "STEP()" #: ../src/libkstapp/eventmonitortab.ui:168 msgctxt "EventMonitorTab|" msgid "ABS()" msgstr "ABS()" # Ne pas traduire, sinon l'interpréteur ne reconnaîtra plus les expressions #: ../src/libkstapp/eventmonitortab.ui:173 msgctxt "EventMonitorTab|" msgid "SQRT()" msgstr "" # Ne pas traduire, sinon l'interpréteur ne reconnaîtra plus les expressions #: ../src/libkstapp/eventmonitortab.ui:178 msgctxt "EventMonitorTab|" msgid "CBRT()" msgstr "" #: ../src/libkstapp/eventmonitortab.ui:183 msgctxt "EventMonitorTab|" msgid "SIN()" msgstr "SIN()" #: ../src/libkstapp/eventmonitortab.ui:188 msgctxt "EventMonitorTab|" msgid "COS()" msgstr "COS()" #: ../src/libkstapp/eventmonitortab.ui:193 msgctxt "EventMonitorTab|a mathematical function" msgid "TAN()" msgstr "TAN()" #: ../src/libkstapp/eventmonitortab.ui:198 msgctxt "EventMonitorTab|" msgid "ASIN()" msgstr "ASIN()" #: ../src/libkstapp/eventmonitortab.ui:203 msgctxt "EventMonitorTab|" msgid "ACOS()" msgstr "ACOS()" #: ../src/libkstapp/eventmonitortab.ui:208 msgctxt "EventMonitorTab|" msgid "ATAN()" msgstr "ATAN()" # Ne pas traduire, sinon l'interpréteur ne reconnaîtra plus les expressions #: ../src/libkstapp/eventmonitortab.ui:213 msgctxt "EventMonitorTab|" msgid "SEC()" msgstr "" # Ne pas traduire, sinon l'interpréteur ne reconnaîtra plus les expressions #: ../src/libkstapp/eventmonitortab.ui:218 msgctxt "EventMonitorTab|" msgid "CSC()" msgstr "" #: ../src/libkstapp/eventmonitortab.ui:223 msgctxt "EventMonitorTab|" msgid "COT()" msgstr "COT()" #: ../src/libkstapp/eventmonitortab.ui:228 msgctxt "EventMonitorTab|" msgid "SINH()" msgstr "SINH()" #: ../src/libkstapp/eventmonitortab.ui:233 msgctxt "EventMonitorTab|" msgid "COSH()" msgstr "COSH()" #: ../src/libkstapp/eventmonitortab.ui:238 msgctxt "EventMonitorTab|" msgid "TANH()" msgstr "TANH()" #: ../src/libkstapp/eventmonitortab.ui:243 msgctxt "EventMonitorTab|" msgid "EXP()" msgstr "EXP()" #: ../src/libkstapp/eventmonitortab.ui:248 msgctxt "EventMonitorTab|" msgid "LN()" msgstr "LN()" #: ../src/libkstapp/eventmonitortab.ui:253 msgctxt "EventMonitorTab|" msgid "LOG()" msgstr "LOG()" #: ../src/libkstapp/eventmonitortab.ui:264 msgctxt "EventMonitorTab|" msgid "Scalars:" msgstr "Scalaires :" #: ../src/libkstapp/eventmonitortab.ui:280 msgctxt "EventMonitorTab|" msgid "Expression:" msgstr "Expression :" #: ../src/libkstapp/eventmonitortab.ui:293 msgctxt "EventMonitorTab|" msgid "Description:" msgstr "Description :" #: ../src/libkstapp/eventmonitortab.ui:312 msgctxt "EventMonitorTab|" msgid "KstScript" msgstr "KstScript" #: ../src/libkstapp/eventmonitortab.ui:318 msgctxt "EventMonitorTab|" msgid "Execute:" msgstr "Exécuter :" # ELOG est un outil de journalisation, ne pas traduire #: ../src/libkstapp/eventmonitortab.ui:335 msgctxt "EventMonitorTab|" msgid "ELOG" msgstr "" #: ../src/libkstapp/eventmonitortab.ui:341 msgctxt "EventMonitorTab|" msgid "No&tify:" msgstr "No&tifier :" #: ../src/libkstapp/eventmonitortab.ui:351 msgctxt "EventMonitorTab|" msgid "&Configure..." msgstr "&Configurer..." #: ../src/libkstapp/eventmonitortab.ui:383 msgctxt "EventMonitorTab|" msgid "Kst Debug Log" msgstr "Journal de débogage de Kst" #: ../src/libkstapp/eventmonitortab.ui:408 msgctxt "EventMonitorTab|" msgid "&Warning" msgstr "&Avertissement" #: ../src/libkstapp/eventmonitortab.ui:418 msgctxt "EventMonitorTab|" msgid "&Error" msgstr "&Erreur" #: ../src/libkstapp/eventmonitortab.ui:428 msgctxt "EventMonitorTab|" msgid "&Notice" msgstr "&Information" #: ../src/libkstapp/eventmonitortab.ui:438 msgctxt "EventMonitorTab|" msgid "&Log as:" msgstr "Enregistrer comme :" #: ../src/libkstapp/exportgraphicsdialog.ui:14 msgctxt "ExportGraphicsDialog|" msgid "Export to Graphics File" msgstr "Exporter vers un fichier graphique" #: ../src/libkstapp/exportgraphicsdialog.ui:32 msgctxt "ExportGraphicsDialog|" msgid "&Base name:" msgstr "Nom de &base :" #: ../src/libkstapp/exportgraphicsdialog.ui:45 msgctxt "ExportGraphicsDialog|" msgid "&File format:" msgstr "&Format de fichier :" #: ../src/libkstapp/exportgraphicsdialog.ui:71 msgctxt "ExportGraphicsDialog|" msgid "Size" msgstr "Taille" #: ../src/libkstapp/exportgraphicsdialog.ui:97 msgctxt "ExportGraphicsDialog|" msgid "&Width:" msgstr "&Largeur :" #: ../src/libkstapp/exportgraphicsdialog.ui:110 msgctxt "ExportGraphicsDialog|" msgid "Width (in Pixels) of the image." msgstr "Largeur de l'image (en pixels)." #: ../src/libkstapp/exportgraphicsdialog.ui:135 msgctxt "ExportGraphicsDialog|" msgid "&Height:" msgstr "&Hauteur :" #: ../src/libkstapp/exportgraphicsdialog.ui:148 msgctxt "ExportGraphicsDialog|" msgid "Height of the image (in pixels)." msgstr "Hauteur de l'image (en pixels)." #: ../src/libkstapp/exportgraphicsdialog.ui:193 msgctxt "ExportGraphicsDialog|" msgid "S&pecify:" msgstr "S&pécifier :" #: ../src/libkstapp/exportgraphicsdialog.ui:210 msgctxt "ExportGraphicsDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largeur et conserver les proportions" #: ../src/libkstapp/exportgraphicsdialog.ui:215 msgctxt "ExportGraphicsDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Hauteur et conserver les proportions" #: ../src/libkstapp/exportgraphicsdialog.ui:220 msgctxt "ExportGraphicsDialog|" msgid "Width and Height" msgstr "Largeur et hauteur" #: ../src/libkstapp/exportgraphicsdialog.ui:225 msgctxt "ExportGraphicsDialog|" msgid "Size of Square" msgstr "Taille du carré" #: ../src/libkstapp/exportgraphicsdialog.ui:254 msgctxt "ExportGraphicsDialog|" msgid "Save Options" msgstr "Options d'enregistrement" #: ../src/libkstapp/exportgraphicsdialog.ui:266 msgctxt "ExportGraphicsDialog|" msgid "Do not autosave. Instead, on OK or Apply, save once." msgstr "" "Ne pas enregistrer automatiquement. Enregistrer une seule fois sur l'appui " "de « OK » ou « Appliquer »." #: ../src/libkstapp/exportgraphicsdialog.ui:269 msgctxt "ExportGraphicsDialog|" msgid "Sa&ve once" msgstr "&Enregistrer une fois" #: ../src/libkstapp/exportgraphicsdialog.ui:279 msgctxt "ExportGraphicsDialog|" msgid "Save image on timer" msgstr "Enregistrer toutes les" #: ../src/libkstapp/exportgraphicsdialog.ui:282 msgctxt "ExportGraphicsDialog|" msgid "" "When checked, the image will be repeatedly saved using the indicated " "period. This is useful, for example, for live web page images." msgstr "" "Si cette option est cochée, l'image est enregistrée en continu avec " "l'intervalle spécifié. Utile par exemple pour des images animées sur une " "page web." #: ../src/libkstapp/exportgraphicsdialog.ui:285 msgctxt "ExportGraphicsDialog|" msgid "&Autosave every" msgstr "Enregistrer &automatiquement toutes les :" #: ../src/libkstapp/exportgraphicsdialog.ui:295 msgctxt "ExportGraphicsDialog|" msgid "Autosave timer" msgstr "Intervalle d'enregistrement automatique" #: ../src/libkstapp/exportgraphicsdialog.ui:298 msgctxt "ExportGraphicsDialog|" msgid "s" msgstr "s" #: ../src/libkstapp/exportgraphicsdialog.ui:343 msgctxt "ExportGraphicsDialog|" msgid "Automatic &extension" msgstr "Extension automatique" #: ../src/libkstapp/exportgraphicsdialog.ui:353 msgctxt "ExportGraphicsDialog|" msgid "Include:" msgstr "Lister les formats :" #: ../src/libkstapp/exportgraphicsdialog.ui:363 msgctxt "ExportGraphicsDialog|" msgid "Vector formats" msgstr "vectoriels" #: ../src/libkstapp/exportgraphicsdialog.ui:370 msgctxt "ExportGraphicsDialog|" msgid "Bitmap formats" msgstr "bitmap" #: ../src/libkstapp/exportvectorsdialog.ui:14 msgctxt "ExportVectorsDialog|" msgid "Export Vectors" msgstr "Exporter les vecteurs" #: ../src/libkstapp/exportvectorsdialog.ui:20 msgctxt "ExportVectorsDialog|" msgid "Vector Selection" msgstr "Sélection de vecteur" #: ../src/libkstapp/exportvectorsdialog.ui:34 #: ../src/libkstapp/exportvectorsdialog.ui:123 msgctxt "ExportVectorsDialog|" msgid "The source file for the vectors selected in this list will be changed." msgstr "" "Le fichier source pour les vecteurs sélectionnés dans cette liste seront " "modifiés." #: ../src/libkstapp/exportvectorsdialog.ui:59 #: ../src/libkstapp/exportvectorsdialog.ui:69 msgctxt "ExportVectorsDialog|" msgid "Select all vectors in the list." msgstr "Sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/exportvectorsdialog.ui:62 msgctxt "ExportVectorsDialog|" msgid "Add A&ll" msgstr "&Tout ajouter" #: ../src/libkstapp/exportvectorsdialog.ui:72 msgctxt "ExportVectorsDialog|" msgid "&Add" msgstr "&Ajouter" #: ../src/libkstapp/exportvectorsdialog.ui:79 #: ../src/libkstapp/exportvectorsdialog.ui:89 msgctxt "ExportVectorsDialog|" msgid "Unselect all vectors in the list." msgstr "Dé-sélectionner tous les vecteurs de la liste." #: ../src/libkstapp/exportvectorsdialog.ui:82 msgctxt "ExportVectorsDialog|" msgid "&Remove" msgstr "Supp&rimer" #: ../src/libkstapp/exportvectorsdialog.ui:92 msgctxt "ExportVectorsDialog|" msgid "R&emove All" msgstr "Tout supprim&er" #: ../src/libkstapp/exportvectorsdialog.ui:144 msgctxt "ExportVectorsDialog|" msgid "&Save location:" msgstr "&Emplacement de l'enregistrement :" #: ../src/libkstapp/filltab.cpp:24 msgctxt "Kst::FillTab|" msgid "Fill" msgstr "Remplissage" #: ../src/libkstapp/filltab.cpp:26 msgctxt "Kst::FillTab|Brush type" msgid "No Brush" msgstr "Aucun" #: ../src/libkstapp/filltab.cpp:27 msgctxt "Kst::FillTab|Brush type" msgid "Solid Pattern" msgstr "Motif plein" #: ../src/libkstapp/filltab.cpp:28 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 1" msgstr "Motif dense 1" #: ../src/libkstapp/filltab.cpp:29 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 2" msgstr "Motif dense 2" #: ../src/libkstapp/filltab.cpp:30 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 3" msgstr "Motif dense 3" #: ../src/libkstapp/filltab.cpp:31 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 4" msgstr "Motif dense 4" #: ../src/libkstapp/filltab.cpp:32 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 5" msgstr "Motif dense 5" #: ../src/libkstapp/filltab.cpp:33 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 6" msgstr "Motif dense 6" #: ../src/libkstapp/filltab.cpp:34 msgctxt "Kst::FillTab|Brush type" msgid "Dense Pattern 7" msgstr "Motif dense 7" #: ../src/libkstapp/filltab.cpp:35 msgctxt "Kst::FillTab|Brush type" msgid "Horizontal Pattern" msgstr "Motif horizontal" #: ../src/libkstapp/filltab.cpp:36 msgctxt "Kst::FillTab|Brush type" msgid "Vertical Pattern" msgstr "Motif vertical" #: ../src/libkstapp/filltab.cpp:37 msgctxt "Kst::FillTab|Brush type" msgid "Cross Pattern" msgstr "Motif croisé" #: ../src/libkstapp/filltab.cpp:38 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Motif diagonal 1" #: ../src/libkstapp/filltab.cpp:39 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Motif diagonal 2" #: ../src/libkstapp/filltab.cpp:40 msgctxt "Kst::FillTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Motif diagonal croisé" #: ../src/libkstapp/filltab.ui:31 msgctxt "FillTab|" msgid "&Color:" msgstr "&Couleur :" #: ../src/libkstapp/filltab.ui:57 msgctxt "FillTab|" msgid "&Style:" msgstr "&Style :" #: ../src/libkstapp/filltab.ui:76 msgctxt "FillTab|" msgid "Use &linear gradient" msgstr "Utiliser un dégradé &linéaire" #: ../src/libkstapp/filltab.ui:89 msgctxt "FillTab|" msgid "&Reset Gradient" msgstr "&Réinitialiser le dégradé" #: ../src/libkstapp/filterfitdialog.cpp:33 msgctxt "Kst::FilterFitTab|" msgid "Plugin" msgstr "Module" #: ../src/libkstapp/filterfitdialog.cpp:159 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "Edit %1 Plugin" msgstr "Modifier le module %1" #: ../src/libkstapp/filterfitdialog.cpp:161 #, qt-format msgctxt "Kst::FilterFitDialog|Arg1 is a plugin" msgid "New %1 Plugin" msgstr "Nouveau module %1" #: ../src/libkstapp/filterfitdialog.cpp:213 msgctxt "Kst::FilterFitDialog|" msgid "" "Unable to create Plugin Object using provided parameters.\n" "\n" msgstr "" "Impossible de créer l'objet module avec les paramètres fournis.\n" "\n" #: ../src/libkstapp/filterfitdialog.cpp:215 msgctxt "Kst::FilterFitDialog|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/filterfittab.ui:23 msgctxt "FilterFitTab|" msgid "Plugin Selection" msgstr "Sélection du module" #: ../src/libkstapp/filterfittab.ui:45 msgctxt "FilterFitTab|" msgid "Plugin name:" msgstr "Nom du module :" #: ../src/libkstapp/filterfittab.ui:62 msgctxt "FilterFitTab|" msgid "Description:" msgstr "Description :" #: ../src/libkstapp/filterfittab.ui:82 msgctxt "FilterFitTab|" msgid "Inputs and Outputs" msgstr "Entrées et sorties" #: ../src/libkstapp/filterfittab.ui:96 msgctxt "FilterFitTab|" msgid "I&gnore in automatic axes range calculations" msgstr "I&gnorer dans les calculs de plage automatique des axes" #: ../src/libkstapp/generaltab.cpp:24 msgctxt "Kst::GeneralTab|" msgid "General" msgstr "Général" #: ../src/libkstapp/generaltab.ui:23 msgctxt "GeneralTab|" msgid "Dynamic files update this fast or slower." msgstr "Timer de mise à jour autoamtique des sources de données." #: ../src/libkstapp/generaltab.ui:26 msgctxt "GeneralTab|" msgid "" "Minimum time between updates when looking at dynamic files. If there is a " "lot of processing, it might take longer." msgstr "" "Temps minimum entre les mises à jour de données. En fonction de la charge " "de la machine, la mise à jour peut prendre plus longtemps." #: ../src/libkstapp/generaltab.ui:45 msgctxt "GeneralTab|" msgid "&Period between updates (ms):" msgstr "&Période entre les mises à jour (ms) :" #: ../src/libkstapp/generaltab.ui:58 msgctxt "GeneralTab|" msgid "Use transparency when dragging" msgstr "Objets transparents lors des déplacements" #: ../src/libkstapp/generaltab.ui:65 msgctxt "GeneralTab|" msgid "Render using \"raster\". This is always better." msgstr "" "Rendu en utilisant le système « raster ». Le résultat est toujours meilleur." #: ../src/libkstapp/generaltab.ui:68 msgctxt "GeneralTab|" msgid "" "Rendering using \"raster\" is faster on some architectures, but very buggy " "on others (depending on the video driver). This might help, or might cause " "things to go horribly wrong." msgstr "" "Le rendu en utilisant le système « raster » est plus rapide sur certaines " "architectures, mais très bogué sur d'autres (cela dépend du pilote vidéo). " "Cette option peut améliorer les choses, ou au contraire tout faire " "dysfonctionner." #: ../src/libkstapp/generaltab.ui:71 msgctxt "GeneralTab|" msgid "Use \"raster\" engine on (Kst restart needed)" msgstr "" "Utiliser le système graphique « raster » (redémarrage de Kst nécessaire)" #: ../src/libkstapp/generaltab.ui:91 msgctxt "GeneralTab|" msgid "&Antialias Plots" msgstr "&Anti-crénelage des graphiques" #: ../src/libkstapp/gridtab.cpp:21 msgctxt "Kst::GridTab|" msgid "Grid" msgstr "Grille" #: ../src/libkstapp/gridtab.ui:17 msgctxt "GridTab|" msgid "Show &grid" msgstr "Afficher la &grille" #: ../src/libkstapp/gridtab.ui:24 msgctxt "GridTab|" msgid "&Snap to grid" msgstr "&Aligner sur la grille" #: ../src/libkstapp/gridtab.ui:31 msgctxt "GridTab|" msgid "Grid &horizontal spacing:" msgstr "Espacement horizontal de la grille :" #: ../src/libkstapp/gridtab.ui:44 msgctxt "GridTab|" msgid "Grid &vertical spacing:" msgstr "Espacement vertical de la grille :" #: ../src/libkstapp/histogramdialog.cpp:40 msgctxt "Kst::HistogramTab|" msgid "Histogram" msgstr "Histogramme" #: ../src/libkstapp/histogramdialog.cpp:286 msgctxt "Kst::HistogramDialog|" msgid "Edit Histogram" msgstr "Modifier l'histogramme" #: ../src/libkstapp/histogramdialog.cpp:288 msgctxt "Kst::HistogramDialog|" msgid "New Histogram" msgstr "Nouvel histogramme" #: ../src/libkstapp/histogramtab.ui:51 msgctxt "HistogramTab|" msgid "Histogram Properties" msgstr "Propriétés de l'histogramme" #: ../src/libkstapp/histogramtab.ui:63 msgctxt "HistogramTab|" msgid "Data vecto&r:" msgstr "Vecteu&r de données :" #: ../src/libkstapp/histogramtab.ui:92 msgctxt "HistogramTab|" msgid "Bins from&:" msgstr "&Intervalle pour les catégories :" #: ../src/libkstapp/histogramtab.ui:114 msgctxt "HistogramTab|" msgid "" "The lower limit of the lowest bin. Values below this limit will not be " "counted in any bin." msgstr "" "Valeur minimale pour l'histogramme. Les valeurs plus faibles seront " "ignorées." #: ../src/libkstapp/histogramtab.ui:130 msgctxt "HistogramTab|from: 333 to: 555" msgid "to:" msgstr "à :" #: ../src/libkstapp/histogramtab.ui:149 msgctxt "HistogramTab|" msgid "" "The upper limit of the highest bin. Values above this limit will not be " "counted in any bin." msgstr "" "Valeur maximale pour l'histogramme. Les valeurs plus élevées seront " "ignorées." #: ../src/libkstapp/histogramtab.ui:165 msgctxt "HistogramTab|" msgid "Num bin&s:" msgstr "&Nombre de catégories :" #: ../src/libkstapp/histogramtab.ui:187 msgctxt "HistogramTab|" msgid "The number of bins in the Histogram." msgstr "Nombre de catégories dans l'histogramme." #: ../src/libkstapp/histogramtab.ui:214 msgctxt "HistogramTab|" msgid "" "Set the upper and lower limits, and the number of bins to a reasonable " "default." msgstr "Calcul automatique des valeurs min et max et du nombre de catégories." #: ../src/libkstapp/histogramtab.ui:217 msgctxt "HistogramTab|" msgid "A&uto Bin" msgstr "Catégories &auto" #: ../src/libkstapp/histogramtab.ui:224 msgctxt "HistogramTab|" msgid "Real&-time auto bin" msgstr "Recalculer en temps &réel" #: ../src/libkstapp/histogramtab.ui:242 msgctxt "HistogramTab|" msgid "Y-axis Normalization" msgstr "Normalisation de l'axe Y" #: ../src/libkstapp/histogramtab.ui:248 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the fraction of samples in the bin." msgstr "" "La valeur de l'axe Y représente la proportion d'éléments dans chaque " "catégorie." #: ../src/libkstapp/histogramtab.ui:251 msgctxt "HistogramTab|" msgid "&Fraction in bin" msgstr "&Proportion" #: ../src/libkstapp/histogramtab.ui:258 msgctxt "HistogramTab|" msgid "The Y axis of the histogram reports the number of samples in the bin." msgstr "" "La valeur de l'axe Y représente le nombre d'éléments dans chaque catégorie." #: ../src/libkstapp/histogramtab.ui:261 msgctxt "HistogramTab|" msgid "Nu&mber in bin" msgstr "No&mbre" #: ../src/libkstapp/histogramtab.ui:271 msgctxt "HistogramTab|" msgid "The Y axis of the histogram is normalized so that the highest bin is 1." msgstr "La valeur de l'axe Y est normalisée pour que le max vaille 1.0." #: ../src/libkstapp/histogramtab.ui:274 msgctxt "HistogramTab|" msgid "Peak bin = &1.0" msgstr "&Normalisé à 1.0" #: ../src/libkstapp/histogramtab.ui:277 msgctxt "HistogramTab|" msgid "Alt+1" msgstr "Alt+1" #: ../src/libkstapp/histogramtab.ui:284 msgctxt "HistogramTab|" msgid "" "The Y axis of the histogram reports the percent of the samples in the bin." msgstr "" "La valeur de l'axe Y représente le pourcentage d'éléments dans chaque " "catégorie." #: ../src/libkstapp/histogramtab.ui:287 msgctxt "HistogramTab|" msgid "Percen&t in bin" msgstr "Pour¢age" #: ../src/libkstapp/imagedialog.cpp:39 msgctxt "Kst::ImageTab|" msgid "Image" msgstr "Image" #: ../src/libkstapp/imagedialog.cpp:349 msgctxt "Kst::ImageDialog|" msgid "Edit Image" msgstr "Modifier l'image" #: ../src/libkstapp/imagedialog.cpp:351 msgctxt "Kst::ImageDialog|" msgid "New Image" msgstr "Nouvelle Image" #: ../src/libkstapp/imagetab.ui:17 msgctxt "ImageTab|" msgid "Image Contents" msgstr "Contenu de l'image" #: ../src/libkstapp/imagetab.ui:31 msgctxt "ImageTab|" msgid "&Matrix:" msgstr "&Matrice :" #: ../src/libkstapp/imagetab.ui:53 msgctxt "ImageTab|" msgid "Image Type" msgstr "Type d'image" #: ../src/libkstapp/imagetab.ui:65 msgctxt "ImageTab|" msgid "Color m&ap" msgstr "C&arte en couleurs" #: ../src/libkstapp/imagetab.ui:75 msgctxt "ImageTab|" msgid "Con&tour map" msgstr "Car&te en courbes de niveaux" #: ../src/libkstapp/imagetab.ui:82 msgctxt "ImageTab|" msgid "&Color map and contour map" msgstr "&Carte en couleur et courbes de niveaux" #: ../src/libkstapp/imagetab.ui:98 msgctxt "ImageTab|" msgid "Color Map Parameters" msgstr "Paramètres de la carte en couleurs" #: ../src/libkstapp/imagetab.ui:112 msgctxt "ImageTab|" msgid "&Upper:" msgstr "&Haut :" #: ../src/libkstapp/imagetab.ui:145 msgctxt "ImageTab|" msgid "Threshold - &Lower:" msgstr "Seuil - bas :" #: ../src/libkstapp/imagetab.ui:187 msgctxt "ImageTab|" msgid "&Smart" msgstr "&Intelligent" #: ../src/libkstapp/imagetab.ui:200 msgctxt "ImageTab|" msgid "Percent&ile:" msgstr "Percent&ile :" #: ../src/libkstapp/imagetab.ui:266 msgctxt "ImageTab|" msgid "Max&/Min" msgstr "Max&/Min" #: ../src/libkstapp/imagetab.ui:273 msgctxt "ImageTab|" msgid "&Real-time auto threshold" msgstr "Seuil automatique en temps réel" #: ../src/libkstapp/imagetab.ui:289 msgctxt "ImageTab|" msgid "Contour Map Parameters" msgstr "Paramètres de la carte en courbes de niveaux" #: ../src/libkstapp/imagetab.ui:309 msgctxt "ImageTab|" msgid "Co&lor:" msgstr "Cou&leur:" #: ../src/libkstapp/imagetab.ui:352 msgctxt "ImageTab|" msgid "Num&ber of contour levels:" msgstr "Nombre de courbes de niveaux :" #: ../src/libkstapp/imagetab.ui:394 msgctxt "ImageTab|" msgid "&Weight:" msgstr "&Épaisseur :" #: ../src/libkstapp/imagetab.ui:424 msgctxt "ImageTab|" msgid "Use &variable line weight" msgstr "Utiliser une épaisseur de ligne &variable" #: ../src/libkstapp/labelcreator.cpp:30 msgctxt "Kst::LabelCreator|" msgid "Create Label Dialog" msgstr "Boîte de dialogue de création de libellé" #: ../src/libkstapp/labelcreator.ui:14 msgctxt "LabelCreator|" msgid "Dialog" msgstr "Boîte de dialogue" #: ../src/libkstapp/labelcreator.ui:35 msgctxt "LabelCreator|" msgid "Lock Position To Data" msgstr "Position fixe par rapport aux données" #: ../src/libkstapp/labelcreator.ui:42 msgctxt "LabelCreator|The right side" msgid "Right" msgstr "À droite" #: ../src/libkstapp/labelcreator.ui:55 msgctxt "LabelCreator|The left side" msgid "Left" msgstr "À gauche" #: ../src/libkstapp/labelcreator.ui:71 msgctxt "LabelCreator|" msgid "Reference Point:" msgstr "Point de référence :" #: ../src/libkstapp/labelcreator.ui:85 msgctxt "LabelCreator|bold font" msgid "Bold" msgstr "Gras" #: ../src/libkstapp/labelcreator.ui:107 msgctxt "LabelCreator|" msgid " points" msgstr " points" #: ../src/libkstapp/labelcreator.ui:120 msgctxt "LabelCreator|" msgid "Font famil&y:" msgstr "Famille de police :" #: ../src/libkstapp/labelcreator.ui:136 msgctxt "LabelCreator|The color of the object" msgid "Color" msgstr "Couleur" #: ../src/libkstapp/labelcreator.ui:146 msgctxt "LabelCreator|" msgid "Font &size:" msgstr "Taille de police :" #: ../src/libkstapp/labelcreator.ui:172 msgctxt "LabelCreator|" msgid "Italic" msgstr "Italique" #: ../src/libkstapp/labelcreator.ui:190 msgctxt "LabelCreator|" msgid "Save as default" msgstr "Appliquer par défaut" #: ../src/libkstapp/labeldimensionstab.ui:19 msgctxt "LabelDimensionsTab|" msgid "Lock Position To Data" msgstr "Position fixe par rapport aux données" #: ../src/libkstapp/labeldimensionstab.ui:26 msgctxt "LabelDimensionsTab|the right side" msgid "Right" msgstr "À droite" #: ../src/libkstapp/labeldimensionstab.ui:39 msgctxt "LabelDimensionsTab|the left side" msgid "Left" msgstr "À gauche" #: ../src/libkstapp/labeldimensionstab.ui:52 msgctxt "LabelDimensionsTab|" msgid "Label Reference Point:" msgstr "Point de référence du libellé :" #: ../src/libkstapp/labeldimensionstab.ui:66 msgctxt "LabelDimensionsTab|" msgid "Rotation" msgstr "Rotation" #: ../src/libkstapp/labeldimensionstab.ui:104 msgctxt "LabelDimensionsTab|" msgid "Position" msgstr "Position" #: ../src/libkstapp/labeldimensionstab.ui:126 msgctxt "LabelDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/labelitem.cpp:39 msgctxt "Kst::LabelItem|a label in a plot" msgid "Label" msgstr "Libellé" #: ../src/libkstapp/labelitem.h:105 ../src/libkstapp/labelitem.h:106 msgctxt "QObject|" msgid "Create Label" msgstr "Créer un libellé" #: ../src/libkstapp/labelitemdialog.cpp:33 msgctxt "Kst::LabelItemDialog|" msgid "Properties" msgstr "Propriétés" #: ../src/libkstapp/labelitemdialog.cpp:45 msgctxt "Kst::LabelItemDialog|" msgid "Size/Position" msgstr "Taille/position" #: ../src/libkstapp/labelpropertiestab.cpp:26 msgctxt "Kst::LabelPropertiesTab|" msgid "Label Properties" msgstr "Propriétés du libellé" #: ../src/libkstapp/labelpropertiestab.cpp:30 msgctxt "Kst::LabelPropertiesTab|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "x^y, x_y. Scalars, equations, and vector elements can be " "embedded. Scalar: [V1/Mean]. Vector Element: [V1[4]]. " "Equation: [=[V1/Mean]^2]. A [ character can be inserted as \\[." msgstr "" "La syntaxe pour les libellés est dérivée d'un sous-ensemble LaTeX. Les " "éléments pris en charge sont : \\[nom de lettre grecque] et \\[Nom " "de lettre grecque], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor" "{nom de couleur}{texte en couleur}, \\textbf{texte en gras}, " "\\textit{texte en italique}, \\t, \\sum, \\sqrt, " "\\underline{texte souligné}, x^y, x_y. Les scalaires, " "équations et éléments de vecteurs peuvent être intégrés. Scalaire : [V1/" "Mean]. Éléments de vecteurs : [V1[4]]. Équation : [=[V1/Mean]" "^2]. Un caractère [ peut être inséré par \\[." #: ../src/libkstapp/labelpropertiestab.ui:25 msgctxt "LabelPropertiesTab|" msgid "Font &size:" msgstr "Taille de police :" #: ../src/libkstapp/labelpropertiestab.ui:51 msgctxt "LabelPropertiesTab|" msgid "Font famil&y:" msgstr "Famille de police :" #: ../src/libkstapp/labelpropertiestab.ui:67 msgctxt "LabelPropertiesTab|italic font" msgid "Italic" msgstr "Italique" #: ../src/libkstapp/labelpropertiestab.ui:90 msgctxt "LabelPropertiesTab|bold font" msgid "Bold" msgstr "Gras" #: ../src/libkstapp/labelpropertiestab.ui:106 msgctxt "LabelPropertiesTab|" msgid " points" msgstr " points" #: ../src/libkstapp/labeltab.cpp:36 msgctxt "Kst::LabelTab|" msgid "Labels" msgstr "Libellés" #: ../src/libkstapp/labeltab.ui:17 msgctxt "LabelTab|" msgid "Default plot font &size:" msgstr "&Taille de police par défaut pour les graphiques :" #: ../src/libkstapp/labeltab.ui:40 msgctxt "LabelTab|" msgid "points" msgstr "points" #: ../src/libkstapp/labeltab.ui:101 msgctxt "LabelTab|" msgid "Automatically scale number axis labels" msgstr "Redimensionner automatiquement les chiffres sur les axes" #: ../src/libkstapp/labeltab.ui:121 msgctxt "LabelTab|" msgid "&Top label:" msgstr "Libellé en &haut :" #: ../src/libkstapp/labeltab.ui:134 ../src/libkstapp/labeltab.ui:157 #: ../src/libkstapp/labeltab.ui:180 ../src/libkstapp/labeltab.ui:203 msgctxt "LabelTab|" msgid "Auto" msgstr "Automatique" #: ../src/libkstapp/labeltab.ui:144 msgctxt "LabelTab|" msgid "Botto&m label:" msgstr "Libellé en &bas :" #: ../src/libkstapp/labeltab.ui:167 msgctxt "LabelTab|" msgid "&Left label:" msgstr "Libellé à &gauche :" #: ../src/libkstapp/labeltab.ui:190 msgctxt "LabelTab|" msgid "&Right label:" msgstr "Libellé à &droite :" #: ../src/libkstapp/labeltab.ui:237 msgctxt "LabelTab|" msgid "Show le&gend" msgstr "Afficher la lé&gende" #: ../src/libkstapp/labeltab.ui:250 msgctxt "LabelTab|" msgid "E&dit" msgstr "É&dition" #: ../src/libkstapp/labeltab.ui:402 msgctxt "LabelTab|" msgid "" "Supports scalars & strings (name in square brackets) - eg, [INDEX:Max " "(X2)],\n" "embedded equations - eg, [=[INDEX:Max] / 2]\n" "and LaTeX symbols - eg, \\theta. Names and symbols are autocompleted." msgstr "" "Les chaînes et scalaires sont supportés (nom entre crochets) - ex. : [INDEX:" "Max (X2)],\n" "ainsi que les équations - ex. : [=[INDEX:Max]/2]\n" "et les symboles LaTeX - ex. : \\theta. La saisie des noms et symboles est " "semi-automatique." #: ../src/libkstapp/layoutboxitem.cpp:30 msgctxt "Kst::LayoutBoxItem|a box for laying out other items" msgid "Layout Box" msgstr "Boîte de mise en page" #: ../src/libkstapp/layouttab.cpp:21 msgctxt "Kst::LayoutTab|" msgid "Layout" msgstr "Mise en page" #: ../src/libkstapp/layouttab.ui:19 msgctxt "LayoutTab|" msgid "&Horizontal margin:" msgstr "Marge &horizontale :" #: ../src/libkstapp/layouttab.ui:45 msgctxt "LayoutTab|" msgid "&Vertical margin:" msgstr "Marge &verticale :" #: ../src/libkstapp/layouttab.ui:71 msgctxt "LayoutTab|" msgid "Hori&zontal spacing:" msgstr "Espacement hori&zontal :" #: ../src/libkstapp/layouttab.ui:97 msgctxt "LayoutTab|" msgid "Ver&tical spacing:" msgstr "Espacement ver&tical :" #: ../src/libkstapp/legenditem.cpp:35 msgctxt "Kst::LegendItem|a legend in a plot" msgid "Legend" msgstr "Légende" #: ../src/libkstapp/legenditem.cpp:130 #, qt-format msgctxt "" "Kst::LegendItem|axis labels. %1 is quantity, %2 is units. eg Time [s]. " "'[' must be escaped." msgid "%1 \\[%2\\]" msgstr "%1 \\[%2\\]" #: ../src/libkstapp/legenditem.cpp:136 ../src/libkstapp/legenditem.cpp:140 #, qt-format msgctxt "Kst::LegendItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%2 = f(%1)" #: ../src/libkstapp/legenditem.cpp:519 msgctxt "Kst::LegendItem|" msgid "Empty Legend" msgstr "Légende vide" #: ../src/libkstapp/legenditem.cpp:538 #, qt-format msgctxt "Kst::LegendItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Graphique : %1 \n" "Contenu :\n" " %2" #: ../src/libkstapp/legenditemdialog.cpp:40 msgctxt "Kst::LegendItemDialog|" msgid "Legend" msgstr "Légende" #: ../src/libkstapp/legendtab.cpp:31 msgctxt "Kst::LegendTab|" msgid "Raise in list order: Alt+Up" msgstr "Monter dans l'ordre de la liste : Alt+Haut" #: ../src/libkstapp/legendtab.cpp:32 msgctxt "Kst::LegendTab|" msgid "Lower in list order: Alt+Down" msgstr "Descendre dans l'ordre de la liste : Alt+Bas" #: ../src/libkstapp/legendtab.cpp:33 msgctxt "Kst::LegendTab|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/legendtab.cpp:34 msgctxt "Kst::LegendTab|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/legendtab.ui:19 msgctxt "LegendTab|" msgid "Title:" msgstr "Titre :" #: ../src/libkstapp/legendtab.ui:31 msgctxt "LegendTab|" msgid "Use automatic plot-based contents" msgstr "Liste automatique basés sur le contenu du graphique" #: ../src/libkstapp/legendtab.ui:44 msgctxt "LegendTab|" msgid "Display &vertically" msgstr "Afficher &verticalement" #: ../src/libkstapp/legendtab.ui:63 msgctxt "LegendTab|" msgid "&Available objects:" msgstr "Objets &disponibles :" #: ../src/libkstapp/legendtab.ui:98 msgctxt "LegendTab|" msgid "&Displayed objects:" msgstr "Objets &affichés :" #: ../src/libkstapp/legendtab.ui:126 msgctxt "LegendTab|" msgid "Raise in plot order: Alt+up" msgstr "Monter dans l'ordre des graphiques : Alt+Haut" #: ../src/libkstapp/legendtab.ui:132 msgctxt "LegendTab|" msgid "Alt+Up" msgstr "Alt+Haut" #: ../src/libkstapp/legendtab.ui:148 msgctxt "LegendTab|" msgid "Remove: Alt+r" msgstr "Supprimer : Alt+r" #: ../src/libkstapp/legendtab.ui:167 msgctxt "LegendTab|" msgid "Select: Alt+s" msgstr "Sélectionner : Alt+s" #: ../src/libkstapp/legendtab.ui:186 msgctxt "LegendTab|" msgid "Lower in plot order: Alt+down" msgstr "Descendre dans l'ordre des graphiques : Alt+Bas" #: ../src/libkstapp/legendtab.ui:192 msgctxt "LegendTab|" msgid "Alt+Down" msgstr "Alt+Bas" #: ../src/libkstapp/legendtab.ui:218 msgctxt "LegendTab|" msgid "Legend Font Settings" msgstr "Options de police pour la légende" #: ../src/libkstapp/legendtab.ui:230 msgctxt "LegendTab|" msgid "Font si&ze:" msgstr "&Taille de police :" #: ../src/libkstapp/legendtab.ui:262 msgctxt "LegendTab|" msgid " points" msgstr " points" #: ../src/libkstapp/legendtab.ui:269 msgctxt "LegendTab|Bold Font" msgid "Bold" msgstr "Gras" #: ../src/libkstapp/legendtab.ui:285 msgctxt "LegendTab|Italic font" msgid "Italic" msgstr "Italique" #: ../src/libkstapp/legendtab.ui:308 msgctxt "LegendTab|" msgid "&Font family" msgstr "&Famille de police " #: ../src/libkstapp/linedimensionstab.ui:25 msgctxt "LineDimensionsTab|" msgid "P1" msgstr "P1" #: ../src/libkstapp/linedimensionstab.ui:54 msgctxt "LineDimensionsTab|" msgid "P2" msgstr "P2" #: ../src/libkstapp/linedimensionstab.ui:96 msgctxt "LineDimensionsTab|" msgid "Lock Position To Data" msgstr "Position fixe par rapport aux données" #: ../src/libkstapp/linedimensionstab.ui:109 #: ../src/libkstapp/linedimensionstab.ui:128 msgctxt "LineDimensionsTab|" msgid " , " msgstr " , " #: ../src/libkstapp/lineedititem.cpp:25 msgctxt "Kst::LineEditItem|scripting interface for editing lines" msgid "LineEdit" msgstr "Ligne d'édition" #: ../src/libkstapp/lineedititem.cpp:117 msgctxt "QObject|" msgid "Error creating lineEdit object from Kst file." msgstr "Erreur à la création de l'objet mini-éditeur depuis le fichier Kst." #: ../src/libkstapp/lineitem.cpp:33 msgctxt "Kst::LineItem|a line in a picture" msgid "Line" msgstr "Ligne" #: ../src/libkstapp/lineitem.cpp:178 msgctxt "Kst::LineItem|" msgid "Move" msgstr "Déplacer" #: ../src/libkstapp/lineitem.cpp:181 msgctxt "Kst::LineItem|" msgid "Resize" msgstr "Redimensionner" #: ../src/libkstapp/lineitem.cpp:393 msgctxt "QObject|" msgid "Error creating line object from Kst file." msgstr "Erreur à la création de l'objet ligne depuis le fichier Kst." #: ../src/libkstapp/lineitem.h:81 ../src/libkstapp/lineitem.h:82 msgctxt "QObject|" msgid "Create Line" msgstr "Créer une ligne" #: ../src/libkstapp/lineitemdialog.cpp:30 msgctxt "Kst::LineItemDialog|" msgid "Size/Position" msgstr "Taille/position" #: ../src/libkstapp/logdialog.cpp:154 msgctxt "Kst::LogDialog|" msgid "Script: Running" msgstr "Script : en cours d'exécution" #: ../src/libkstapp/logdialog.cpp:160 msgctxt "Kst::LogDialog|" msgid "Script: Finished" msgstr "Script : terminé" #: ../src/libkstapp/logdialog.cpp:162 #, qt-format msgctxt "Kst::LogDialog|" msgid "Script: return code %1" msgstr "Script : code de retour %1" #: ../src/libkstapp/logdialog.cpp:169 msgctxt "Kst::LogDialog|" msgid "Script error: Failed to start" msgstr "Erreur de script : le démarrage a échoué" #: ../src/libkstapp/logdialog.cpp:171 msgctxt "Kst::LogDialog|" msgid "Script error: Crashed" msgstr "Erreur de script : plantage" #: ../src/libkstapp/logdialog.cpp:173 msgctxt "Kst::LogDialog|" msgid "Script error:" msgstr "Erreur de script :" #: ../src/libkstapp/logdialog.ui:14 msgctxt "LogDialog|" msgid "Make a log entry" msgstr "Créer une entrée de journal" #: ../src/libkstapp/logdialog.ui:29 msgctxt "LogDialog|" msgid "&Rerun Script" msgstr "&Réexécuter le script" #: ../src/libkstapp/logdialog.ui:36 msgctxt "LogDialog|" msgid "Script:" msgstr "Script :" #: ../src/libkstapp/logdialog.ui:56 msgctxt "LogDialog|" msgid "&Apply" msgstr "&Appliquer" #: ../src/libkstapp/logdialog.ui:63 msgctxt "LogDialog|" msgid "&Close" msgstr "&Fermer" #: ../src/libkstapp/logdialog.ui:74 msgctxt "LogDialog|" msgid "Message" msgstr "Message" #: ../src/libkstapp/logdialog.ui:82 msgctxt "LogDialog|" msgid "&Message:" msgstr "&Message : " #: ../src/libkstapp/logdialog.ui:92 msgctxt "LogDialog|" msgid "&Clear" msgstr "Effa&cer" #: ../src/libkstapp/logdialog.ui:104 msgctxt "LogDialog|" msgid "Script output:" msgstr "Sortie du script :" #: ../src/libkstapp/logdialog.ui:115 msgctxt "LogDialog|" msgid "Configuration" msgstr "Configuration" #: ../src/libkstapp/logdialog.ui:121 msgctxt "LogDialog|" msgid "Plot Properties" msgstr "Propriétés du graphique" #: ../src/libkstapp/logdialog.ui:127 msgctxt "LogDialog|" msgid "&Width:" msgstr "&Largeur :" #: ../src/libkstapp/logdialog.ui:160 msgctxt "LogDialog|" msgid "Width and Maintain Aspect Ratio" msgstr "Largeur et garder les proportions" #: ../src/libkstapp/logdialog.ui:165 msgctxt "LogDialog|" msgid "Height and Maintain Aspect Ratio" msgstr "Hauteur et garder les proportions" #: ../src/libkstapp/logdialog.ui:170 msgctxt "LogDialog|" msgid "Width and Height" msgstr "Largeur et hauteur" #: ../src/libkstapp/logdialog.ui:175 msgctxt "LogDialog|" msgid "Size of Square" msgstr "Taille du carré" #: ../src/libkstapp/logdialog.ui:189 msgctxt "LogDialog|" msgid "&Height:" msgstr "&Hauteur :" #: ../src/libkstapp/logdialog.ui:202 msgctxt "LogDialog|" msgid "Height of the image (in pixels)." msgstr "Hauteur de l'image (en pixels)." #: ../src/libkstapp/logdialog.ui:227 msgctxt "LogDialog|" msgid "&File format:" msgstr "&Format de fichier :" #: ../src/libkstapp/logdialog.ui:249 msgctxt "LogDialog|" msgid "S&pecify:" msgstr "S&pécifier :" #: ../src/libkstapp/logdialog.ui:265 msgctxt "LogDialog|" msgid "Width (in Pixels) of the image." msgstr "Largeur de l'image (en pixels)." #: ../src/libkstapp/logdialog.ui:295 msgctxt "LogDialog|" msgid "Local log directory:" msgstr "Dossier local pour le journal :" #: ../src/libkstapp/logdialog.ui:308 msgctxt "LogDialog|" msgid "&Script:" msgstr "&Script :" #: ../src/libkstapp/logdialog.ui:321 msgctxt "LogDialog|" msgid "" "The variables $user, $imagefile and $messagefile can be used in the argument " "list." msgstr "" "Il est possible d'utiliser les variables suivantes en tant qu'arguments : " "$user, $imagefile et $messagefile." #: ../src/libkstapp/logdialog.ui:328 msgctxt "LogDialog|" msgid "&User name:" msgstr "&Nom d'utilisateur :" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "Kst: Save Prompt" msgstr "Kst : document modifié" #: ../src/libkstapp/mainwindow.cpp:226 msgctxt "Kst::MainWindow|" msgid "" "Your document has been modified.\n" "Save changes?" msgstr "" "Votre document a été modifié.\n" "Voulez-vous enregistrer vos changements ?" #: ../src/libkstapp/mainwindow.cpp:273 msgctxt "Kst::MainWindow|" msgid "Kst: Save File" msgstr "Kst : enregistrer le fichier" #: ../src/libkstapp/mainwindow.cpp:273 ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst Sessions (*.kst)" msgstr "Sessions Kst (*.kst)" #: ../src/libkstapp/mainwindow.cpp:320 msgctxt "Kst::MainWindow|" msgid "Kst: Open File" msgstr "Kst : ouvrir un fichier" #: ../src/libkstapp/mainwindow.cpp:333 #, qt-format msgctxt "Kst::MainWindow|Part of a list. %1 is an index. %2 is a file name" msgid "&%1 %2" msgstr "&%1 %2" #: ../src/libkstapp/mainwindow.cpp:383 msgctxt "Kst::MainWindow|" msgid "&Cleanup Non-Existent Files" msgstr "&Nettoyer les fichiers inexistants" #: ../src/libkstapp/mainwindow.cpp:466 msgctxt "Kst::MainWindow|" msgid "For details see Help->Debug Dialog->Log." msgstr "Pour plus de détails consulter Aide->Fenêtre de débogage->Journal." #: ../src/libkstapp/mainwindow.cpp:467 msgctxt "Kst::MainWindow|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/mainwindow.cpp:467 #, qt-format msgctxt "Kst::MainWindow|" msgid "" "Error opening document:\n" " '%1'\n" "%2\n" msgstr "" "Erreur à l'ouverture du document :\n" " '%1'\n" "%2\n" #: ../src/libkstapp/mainwindow.cpp:963 msgctxt "Kst::MainWindow|" msgid "&Open..." msgstr "&Ouvrir..." #: ../src/libkstapp/mainwindow.cpp:964 msgctxt "Kst::MainWindow|" msgid "Open a new session" msgstr "Ouvrir une nouvelle session" #: ../src/libkstapp/mainwindow.cpp:965 msgctxt "Kst::MainWindow|Shortcut for Open" msgid "Ctrl+O" msgstr "Ctrl+O" #: ../src/libkstapp/mainwindow.cpp:969 msgctxt "Kst::MainWindow|" msgid "&Save" msgstr "&Enregistrer" #: ../src/libkstapp/mainwindow.cpp:970 ../src/libkstapp/mainwindow.cpp:976 msgctxt "Kst::MainWindow|" msgid "Save the current session" msgstr "Enregistrer la session actuelle" #: ../src/libkstapp/mainwindow.cpp:971 msgctxt "Kst::MainWindow|Shortcut for Save" msgid "Ctrl+S" msgstr "Ctrl+S" #: ../src/libkstapp/mainwindow.cpp:975 msgctxt "Kst::MainWindow|" msgid "Save &as..." msgstr "Enregistrer &sous..." #: ../src/libkstapp/mainwindow.cpp:980 msgctxt "Kst::MainWindow|" msgid "Ne&w Session" msgstr "Nou&velle session" #: ../src/libkstapp/mainwindow.cpp:981 msgctxt "Kst::MainWindow|" msgid "Close current session and start a new, empty one" msgstr "Ferme la session courante et en démarre une nouvelle, vide." #: ../src/libkstapp/mainwindow.cpp:985 msgctxt "Kst::MainWindow|" msgid "Reload All &Data Sources" msgstr "Recharger toutes les sources de &données" #: ../src/libkstapp/mainwindow.cpp:986 msgctxt "Kst::MainWindow|" msgid "Reload all data sources" msgstr "Recharger toutes les sources de données" #: ../src/libkstapp/mainwindow.cpp:990 msgctxt "Kst::MainWindow|" msgid "&Print..." msgstr "Im&primer..." #: ../src/libkstapp/mainwindow.cpp:991 msgctxt "Kst::MainWindow|" msgid "Print the current view" msgstr "Imprime la session courante" #: ../src/libkstapp/mainwindow.cpp:998 msgctxt "Kst::MainWindow|" msgid "&Export as Image(s)..." msgstr "&Exporter comme image(s)..." #: ../src/libkstapp/mainwindow.cpp:999 msgctxt "Kst::MainWindow|" msgid "Export graphics to disk" msgstr "Sauver les graphiques en tant qu'images sur le disque" #: ../src/libkstapp/mainwindow.cpp:1003 msgctxt "Kst::MainWindow|" msgid "Save &Vectors to Disk..." msgstr "Enregistrer les &vecteurs sur le disque..." #: ../src/libkstapp/mainwindow.cpp:1004 msgctxt "Kst::MainWindow|" msgid "Export vectors to ascii file" msgstr "Exporter les vecteurs vers un fichier ASCII" #: ../src/libkstapp/mainwindow.cpp:1008 msgctxt "Kst::MainWindow|" msgid "&Log Entry..." msgstr "Entrée de journa&l..." #: ../src/libkstapp/mainwindow.cpp:1009 msgctxt "Kst::MainWindow|" msgid "Commit a log entry" msgstr "Déclencher une entrée de journal" #: ../src/libkstapp/mainwindow.cpp:1013 msgctxt "Kst::MainWindow|" msgid "&New Tab" msgstr "&Nouvel onglet" #: ../src/libkstapp/mainwindow.cpp:1014 msgctxt "Kst::MainWindow|" msgid "Create a new tab" msgstr "Créer un nouvel onglet" #: ../src/libkstapp/mainwindow.cpp:1018 msgctxt "Kst::MainWindow|" msgid "&Close Tab" msgstr "&Fermer l'onglet" #: ../src/libkstapp/mainwindow.cpp:1019 msgctxt "Kst::MainWindow|" msgid "Close the current tab" msgstr "Fermer l'onglet courant" #: ../src/libkstapp/mainwindow.cpp:1023 msgctxt "Kst::MainWindow|" msgid "E&xit" msgstr "&Quitter" #: ../src/libkstapp/mainwindow.cpp:1024 msgctxt "Kst::MainWindow|Shortcut for Quit" msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../src/libkstapp/mainwindow.cpp:1025 msgctxt "Kst::MainWindow|" msgid "Exit the application" msgstr "Quitter l'application" #: ../src/libkstapp/mainwindow.cpp:1031 msgctxt "Kst::MainWindow|Shortcut for undo" msgid "Ctrl+Z" msgstr "Ctrl+Z" #: ../src/libkstapp/mainwindow.cpp:1034 msgctxt "Kst::MainWindow|Shortcut for redo" msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: ../src/libkstapp/mainwindow.cpp:1038 msgctxt "Kst::MainWindow|" msgid "&Vectors" msgstr "&Vecteurs " #: ../src/libkstapp/mainwindow.cpp:1039 msgctxt "Kst::MainWindow|" msgid "Show all vectors in a spreadsheet" msgstr "Afficher les vecteurs sous forme de tableau" #: ../src/libkstapp/mainwindow.cpp:1042 msgctxt "Kst::MainWindow|" msgid "&Scalars" msgstr "&Scalaires" #: ../src/libkstapp/mainwindow.cpp:1043 msgctxt "Kst::MainWindow|" msgid "Show all scalars in a spreadsheet" msgstr "Afficher les scalaires dans un tableau" #: ../src/libkstapp/mainwindow.cpp:1046 msgctxt "Kst::MainWindow|" msgid "&Matrices" msgstr "&Matrices" #: ../src/libkstapp/mainwindow.cpp:1047 msgctxt "Kst::MainWindow|" msgid "Show all matrices in a spreadsheet" msgstr "Afficher les matrices dans un tableau" #: ../src/libkstapp/mainwindow.cpp:1050 msgctxt "Kst::MainWindow|" msgid "S&trings" msgstr "Chaînes" #: ../src/libkstapp/mainwindow.cpp:1051 msgctxt "Kst::MainWindow|" msgid "Show all strings in a spreadsheet" msgstr "Afficher les chaînes dans un tableau" #: ../src/libkstapp/mainwindow.cpp:1055 msgctxt "Kst::MainWindow|" msgid "&Back One Screen" msgstr "&Reculer d'un écran" #: ../src/libkstapp/mainwindow.cpp:1056 msgctxt "Kst::MainWindow|" msgid "Back one screen" msgstr "Reculer d'un écran" #: ../src/libkstapp/mainwindow.cpp:1060 msgctxt "Kst::MainWindow|" msgid "&Forward One Screen" msgstr "&Avancer d'un écran" #: ../src/libkstapp/mainwindow.cpp:1061 msgctxt "Kst::MainWindow|" msgid "Forward one screen" msgstr "Avancer d'un écran" #: ../src/libkstapp/mainwindow.cpp:1065 msgctxt "Kst::MainWindow|" msgid "&Count from End" msgstr "&Compter depuis la fin" #: ../src/libkstapp/mainwindow.cpp:1066 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to count from end mode" msgstr "" "Compter le nombre d'échantillons depuis la fin pour tous les vecteurs de " "données" #: ../src/libkstapp/mainwindow.cpp:1070 msgctxt "Kst::MainWindow|" msgid "&Read to End" msgstr "Li&re jusqu'à la fin" #: ../src/libkstapp/mainwindow.cpp:1071 msgctxt "Kst::MainWindow|" msgid "Set all data vectors to read to end mode" msgstr "Lire tous les vecteurs de données jusqu'au dernier échantillon" #: ../src/libkstapp/mainwindow.cpp:1075 msgctxt "Kst::MainWindow|" msgid "&Pause" msgstr "&Pause" #: ../src/libkstapp/mainwindow.cpp:1076 msgctxt "Kst::MainWindow|" msgid "Toggle pause updates of data sources" msgstr "Basculer pause on/off pour la mise à jour des sources de données" #: ../src/libkstapp/mainwindow.cpp:1082 msgctxt "Kst::MainWindow|" msgid "Change Data &Sample Range..." msgstr "Changer les &plages de données..." #: ../src/libkstapp/mainwindow.cpp:1083 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data Sample Range Dialog" msgstr "Afficher la boîte de dialogue de changement des plages de données" #: ../src/libkstapp/mainwindow.cpp:1088 msgctxt "Kst::MainWindow|" msgid "&Plot" msgstr "&Graphique" #: ../src/libkstapp/mainwindow.cpp:1089 msgctxt "Kst::MainWindow|" msgid "Create a plot for the current view" msgstr "Créer un graphique dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1095 msgctxt "Kst::MainWindow|" msgid "&Scalar" msgstr "&Scalaire" #: ../src/libkstapp/mainwindow.cpp:1098 msgctxt "Kst::MainWindow|" msgid "&Vector" msgstr "&Vecteur" #: ../src/libkstapp/mainwindow.cpp:1101 msgctxt "Kst::MainWindow|" msgid "&Matrix" msgstr "&Matrice" #: ../src/libkstapp/mainwindow.cpp:1104 msgctxt "Kst::MainWindow|" msgid "Strin&g" msgstr "C&haîne " #: ../src/libkstapp/mainwindow.cpp:1107 msgctxt "Kst::MainWindow|" msgid "&Curve" msgstr "&Courbe" #: ../src/libkstapp/mainwindow.cpp:1110 msgctxt "Kst::MainWindow|" msgid "&Equation" msgstr "&Équation" #: ../src/libkstapp/mainwindow.cpp:1113 msgctxt "Kst::MainWindow|" msgid "Po&wer Spectrum" msgstr "Spectre de p&uissance" #: ../src/libkstapp/mainwindow.cpp:1116 msgctxt "Kst::MainWindow|" msgid "&Histogram" msgstr "His&togramme" #: ../src/libkstapp/mainwindow.cpp:1119 msgctxt "Kst::MainWindow|" msgid "&Image" msgstr "&Image" #: ../src/libkstapp/mainwindow.cpp:1122 msgctxt "Kst::MainWindow|" msgid "Spectr&ogram" msgstr "Spectr&ogramme" #: ../src/libkstapp/mainwindow.cpp:1125 msgctxt "Kst::MainWindow|" msgid "Eve&nt Monitor" msgstr "Moniteur d'évè&nements" #: ../src/libkstapp/mainwindow.cpp:1129 msgctxt "Kst::MainWindow|" msgid "&Label" msgstr "&Libellé" #: ../src/libkstapp/mainwindow.cpp:1130 msgctxt "Kst::MainWindow|" msgid "Create a label for the current view" msgstr "Créer un libellé dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1136 msgctxt "Kst::MainWindow|" msgid "&Box" msgstr "&Rectangle" #: ../src/libkstapp/mainwindow.cpp:1137 msgctxt "Kst::MainWindow|" msgid "Create a box for the current view" msgstr "Créer un rectangle dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1143 msgctxt "Kst::MainWindow|" msgid "&Circle" msgstr "&Cercle" #: ../src/libkstapp/mainwindow.cpp:1144 msgctxt "Kst::MainWindow|" msgid "Create a circle for the current view" msgstr "Créer un cercle dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1150 msgctxt "Kst::MainWindow|" msgid "&Ellipse" msgstr "&Ellipse" #: ../src/libkstapp/mainwindow.cpp:1151 msgctxt "Kst::MainWindow|" msgid "Create an ellipse for the current view" msgstr "Créer une ellipse dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1157 msgctxt "Kst::MainWindow|" msgid "&Line" msgstr "&Ligne" #: ../src/libkstapp/mainwindow.cpp:1158 msgctxt "Kst::MainWindow|" msgid "Create a line for the current view" msgstr "Créer une ligne dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1164 msgctxt "Kst::MainWindow|" msgid "&Arrow" msgstr "&Flèche" #: ../src/libkstapp/mainwindow.cpp:1165 msgctxt "Kst::MainWindow|" msgid "Create a arrow for the current view" msgstr "Créer une flèche dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1171 msgctxt "Kst::MainWindow|" msgid "&Picture" msgstr "&Image" #: ../src/libkstapp/mainwindow.cpp:1172 msgctxt "Kst::MainWindow|" msgid "Create a picture for the current view" msgstr "Créer une image dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1179 msgctxt "Kst::MainWindow|" msgid "&Svg" msgstr "&SVG" #: ../src/libkstapp/mainwindow.cpp:1180 msgctxt "Kst::MainWindow|" msgid "Create a svg for the current view" msgstr "Créer un SVG (dessin vectoriel) dans la vue courante" #: ../src/libkstapp/mainwindow.cpp:1187 msgctxt "Kst::MainWindow|" msgid "Shared Axis &Box" msgstr "Groupe d'axes &partagés" #: ../src/libkstapp/mainwindow.cpp:1188 msgctxt "Kst::MainWindow|" msgid "Create a shared axis box for the current item" msgstr "Créer un groupe d'axes partagés pour plusieurs graphiques" #: ../src/libkstapp/mainwindow.cpp:1196 msgctxt "Kst::MainWindow|" msgid "&Toggle Tied Zoom" msgstr "Zoom &lié" #: ../src/libkstapp/mainwindow.cpp:1197 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's tied zoom" msgstr "Bascule le mode zoom lié on/off pour l'onglet courant" #: ../src/libkstapp/mainwindow.cpp:1203 msgctxt "Kst::MainWindow|" msgid "Tie &Across All Tabs" msgstr "Appliquer à tous les &onglets" #: ../src/libkstapp/mainwindow.cpp:1204 msgctxt "Kst::MainWindow|" msgid "Tied zoom applies between tabs" msgstr "Appliquer le mode zoom lié à tous les onglets" #: ../src/libkstapp/mainwindow.cpp:1210 msgctxt "Kst::MainWindow|" msgid "&Highlight Data Points" msgstr "&Surligner les points de données" #: ../src/libkstapp/mainwindow.cpp:1211 msgctxt "Kst::MainWindow|" msgid "Highlight closest data point" msgstr "Mettre en évidence le point de donnée le plus proche du curseur" #: ../src/libkstapp/mainwindow.cpp:1220 msgctxt "Kst::MainWindow|" msgid "X-Y &Zoom/Scroll" msgstr "&Zoom/défilement X-Y" #: ../src/libkstapp/mainwindow.cpp:1221 msgctxt "Kst::MainWindow|" msgid "Zoom arbitrarily in X- or Y-direction" msgstr "Zoomer arbitrairement dans la direction X ou Y" #: ../src/libkstapp/mainwindow.cpp:1227 msgctxt "Kst::MainWindow|" msgid "&X-only Zoom" msgstr "Zoom selon &X uniquement" #: ../src/libkstapp/mainwindow.cpp:1228 ../src/libkstapp/mainwindow.cpp:1235 msgctxt "Kst::MainWindow|" msgid "Zoom only in X direction" msgstr "Zoomer uniquement suivant l'axe X" #: ../src/libkstapp/mainwindow.cpp:1234 msgctxt "Kst::MainWindow|" msgid "&Y-only Zoom" msgstr "Zoom selon &Y uniquement" #: ../src/libkstapp/mainwindow.cpp:1241 msgctxt "Kst::MainWindow|" msgid "&Layout Mode" msgstr "Mode &mise en page" #: ../src/libkstapp/mainwindow.cpp:1242 msgctxt "Kst::MainWindow|" msgid "Toggle the current view's layout mode" msgstr "Change le mode d'interaction de l'onglet courant" #: ../src/libkstapp/mainwindow.cpp:1252 msgctxt "Kst::MainWindow|" msgid "Data &Manager" msgstr "&Gestionnaire de données" #: ../src/libkstapp/mainwindow.cpp:1253 msgctxt "Kst::MainWindow|" msgid "Show Kst's data manager window" msgstr "Afficher la fenêtre du gestionnaire de données de Kst" #: ../src/libkstapp/mainwindow.cpp:1258 msgctxt "Kst::MainWindow|" msgid "&Data Wizard" msgstr "Assistant d'import de &données" #: ../src/libkstapp/mainwindow.cpp:1259 msgctxt "Kst::MainWindow|" msgid "Show Kst's Data Wizard" msgstr "Afficher l'assistant de données de Kst" #: ../src/libkstapp/mainwindow.cpp:1264 msgctxt "Kst::MainWindow|" msgid "Change Data &File" msgstr "Modifier le &fichier de données" #: ../src/libkstapp/mainwindow.cpp:1265 msgctxt "Kst::MainWindow|" msgid "Show Kst's Change Data File Dialog" msgstr "" "Afficher la boîte de dialogue de changement du fichier de données de Kst" #: ../src/libkstapp/mainwindow.cpp:1270 msgctxt "Kst::MainWindow|" msgid "Assign Curve &Color per File" msgstr "Assigner les &couleurs de courbes en fonction du fichier" #: ../src/libkstapp/mainwindow.cpp:1271 msgctxt "Kst::MainWindow|" msgid "Show Kst's Choose Color Dialog" msgstr "Afficher la boîte de dialogue de choix de couleur de Kst" #: ../src/libkstapp/mainwindow.cpp:1275 msgctxt "Kst::MainWindow|" msgid "D&ifferentiate Curves" msgstr "Di&fférencier les courbes" #: ../src/libkstapp/mainwindow.cpp:1276 msgctxt "Kst::MainWindow|" msgid "Show Kst's Differentiate Curves Dialog" msgstr "Afficher la boîte de dialogue de différentiation de courbes de Kst" #: ../src/libkstapp/mainwindow.cpp:1281 msgctxt "Kst::MainWindow|" msgid "&Configure Kst" msgstr "&Configurer Kst" #: ../src/libkstapp/mainwindow.cpp:1282 msgctxt "Kst::MainWindow|" msgid "Show Kst's Configuration Dialog" msgstr "Afficher la boîte de dialogue de configuration de Kst" #: ../src/libkstapp/mainwindow.cpp:1286 msgctxt "Kst::MainWindow|" msgid "&Theme" msgstr "&Thème" #: ../src/libkstapp/mainwindow.cpp:1287 msgctxt "Kst::MainWindow|" msgid "Show Kst's Theme Dialog" msgstr "Afficher la boîte de dialogue de thème de Kst" #: ../src/libkstapp/mainwindow.cpp:1292 msgctxt "Kst::MainWindow|" msgid "&Debug Dialog" msgstr "Fenêtre de &débogage" #: ../src/libkstapp/mainwindow.cpp:1293 msgctxt "Kst::MainWindow|" msgid "Show the Kst debugging dialog" msgstr "Afficher la boîte de dialogue de débogage de Kst" #: ../src/libkstapp/mainwindow.cpp:1297 msgctxt "Kst::MainWindow|" msgid "&Bug Report Wizard" msgstr "Assistant de rapport de &bogues" #: ../src/libkstapp/mainwindow.cpp:1298 msgctxt "Kst::MainWindow|" msgid "Show Kst's Bug Report Wizard" msgstr "Afficher l'assistant de rapport de &bogues de Kst" #: ../src/libkstapp/mainwindow.cpp:1302 msgctxt "Kst::MainWindow|" msgid "&About" msgstr "&À propos" #: ../src/libkstapp/mainwindow.cpp:1303 msgctxt "Kst::MainWindow|" msgid "Show Kst's About box" msgstr "Afficher la boîte d'informations sur Kst" #: ../src/libkstapp/mainwindow.cpp:1310 msgctxt "Kst::MainWindow|" msgid "&File" msgstr "&Fichier" #: ../src/libkstapp/mainwindow.cpp:1317 msgctxt "Kst::MainWindow|" msgid "&Recent Sessions" msgstr "Sessions &récentes" #: ../src/libkstapp/mainwindow.cpp:1318 msgctxt "Kst::MainWindow|" msgid "Recent Data &Files" msgstr "&Fichiers de données récents" #: ../src/libkstapp/mainwindow.cpp:1340 msgctxt "Kst::MainWindow|" msgid "&Edit" msgstr "&Édition" #: ../src/libkstapp/mainwindow.cpp:1345 msgctxt "Kst::MainWindow|" msgid "&View" msgstr "&Affichage" #: ../src/libkstapp/mainwindow.cpp:1351 msgctxt "Kst::MainWindow|" msgid "&Range" msgstr "&Plage" #: ../src/libkstapp/mainwindow.cpp:1361 msgctxt "Kst::MainWindow|" msgid "&Create" msgstr "&Créer" #: ../src/libkstapp/mainwindow.cpp:1382 msgctxt "Kst::MainWindow|" msgid "Standard P&lugin" msgstr "Modu&le standard" #: ../src/libkstapp/mainwindow.cpp:1383 msgctxt "Kst::MainWindow|" msgid "Fit Pl&ugin" msgstr "Module de &régression" #: ../src/libkstapp/mainwindow.cpp:1384 msgctxt "Kst::MainWindow|" msgid "Fil&ter Plugin" msgstr "Module de &filtrage " #: ../src/libkstapp/mainwindow.cpp:1403 msgctxt "Kst::MainWindow|" msgid "&Annotation" msgstr "&Annotation" #: ../src/libkstapp/mainwindow.cpp:1415 msgctxt "Kst::MainWindow|" msgid "&Mode" msgstr "&Mode" #: ../src/libkstapp/mainwindow.cpp:1417 msgctxt "Kst::MainWindow|" msgid "Interaction mode" msgstr "Mode d'interaction" #: ../src/libkstapp/mainwindow.cpp:1431 msgctxt "Kst::MainWindow|" msgid "&Tools" msgstr "Ou&tils" #: ../src/libkstapp/mainwindow.cpp:1440 msgctxt "Kst::MainWindow|" msgid "&Settings" msgstr "Pa&ramètres" #: ../src/libkstapp/mainwindow.cpp:1446 msgctxt "Kst::MainWindow|" msgid "&Help" msgstr "Ai&de" #: ../src/libkstapp/mainwindow.cpp:1458 msgctxt "Kst::MainWindow|" msgid "File" msgstr "Fichier" #: ../src/libkstapp/mainwindow.cpp:1466 msgctxt "Kst::MainWindow|" msgid "Edit" msgstr "Édition" #: ../src/libkstapp/mainwindow.cpp:1471 msgctxt "Kst::MainWindow|" msgid "Tools" msgstr "Outils" #: ../src/libkstapp/mainwindow.cpp:1478 msgctxt "Kst::MainWindow|" msgid "Data Range" msgstr "Plage de données" #: ../src/libkstapp/mainwindow.cpp:1486 msgctxt "Kst::MainWindow|" msgid "Mode" msgstr "Mode" #: ../src/libkstapp/mainwindow.cpp:1496 msgctxt "Kst::MainWindow|" msgid "Plot Layout" msgstr "Mise en page des graphiques" #: ../src/libkstapp/mainwindow.cpp:1501 msgctxt "Kst::MainWindow|" msgid "Advanced Layout" msgstr "Mise en page avancée" #: ../src/libkstapp/mainwindow.cpp:1518 msgctxt "Kst::MainWindow|" msgid "Ready" msgstr "Prêt" #: ../src/libkstapp/markerstab.cpp:25 msgctxt "Kst::MarkersTab|" msgid "Markers" msgstr "Marqueurs" #: ../src/libkstapp/markerstab.cpp:27 msgctxt "Kst::MarkersTab|Pen type" msgid "Solid Line" msgstr "Ligne pleine" #: ../src/libkstapp/markerstab.cpp:28 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Line" msgstr "Ligne en tirets" #: ../src/libkstapp/markerstab.cpp:29 msgctxt "Kst::MarkersTab|Pen type" msgid "Dot Line" msgstr "Ligne pointillée" #: ../src/libkstapp/markerstab.cpp:30 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Line" msgstr "Ligne tiret-point" #: ../src/libkstapp/markerstab.cpp:31 msgctxt "Kst::MarkersTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Ligne tiret-point-point" #: ../src/libkstapp/markerstab.cpp:32 msgctxt "Kst::MarkersTab|Pen type" msgid "Custom Dash Line" msgstr "Ligne en tirets personnalisés" #: ../src/libkstapp/markerstab.cpp:243 ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "Kst" msgstr "Kst" #: ../src/libkstapp/markerstab.cpp:243 msgctxt "Kst::MarkersTab|" msgid "A plot marker with equal (or very close) value already exists." msgstr "Un marqueur avec cette valeur (ou une valeur très proche) existe déjà." #: ../src/libkstapp/markerstab.cpp:246 msgctxt "Kst::MarkersTab|" msgid "The text you have entered is not a valid number." msgstr "Le texte que vous avez saisi n'est pas un nombre valide." #: ../src/libkstapp/markerstab.ui:17 msgctxt "MarkersTab|" msgid "Axis Markers" msgstr "Marqueurs d'axe" #: ../src/libkstapp/markerstab.ui:42 msgctxt "MarkersTab|" msgid "&New marker point: " msgstr "&Nouveau marqueur : " #: ../src/libkstapp/markerstab.ui:62 msgctxt "MarkersTab|" msgid "&Add" msgstr "&Ajouter" #: ../src/libkstapp/markerstab.ui:88 msgctxt "MarkersTab|" msgid "C&urrent markers" msgstr "Marqueurs co&urants" #: ../src/libkstapp/markerstab.ui:122 msgctxt "MarkersTab|" msgid "&Clear" msgstr "Effa&cer" #: ../src/libkstapp/markerstab.ui:129 msgctxt "MarkersTab|" msgid "&Remove" msgstr "Supp&rimer" #: ../src/libkstapp/markerstab.ui:156 msgctxt "MarkersTab|" msgid "Marker Appearance" msgstr "Apparence des marqueurs" #: ../src/libkstapp/markerstab.ui:162 msgctxt "MarkersTab|" msgid "Line st&yle:" msgstr "St&yle de ligne :" #: ../src/libkstapp/markerstab.ui:185 msgctxt "MarkersTab|" msgid "Line co&lor:" msgstr "Cou&leur de ligne :" #: ../src/libkstapp/markerstab.ui:205 msgctxt "MarkersTab|" msgid "Line &width:" msgstr "Large&ur de ligne :" #: ../src/libkstapp/markerstab.ui:224 msgctxt "MarkersTab|" msgid "Automatic Markers" msgstr "Marqueurs automatiques" #: ../src/libkstapp/markerstab.ui:230 msgctxt "MarkersTab|" msgid "Use curve as marker &source:" msgstr "Utiliser une courbe comme &source pour le marqueur :" #: ../src/libkstapp/markerstab.ui:253 msgctxt "MarkersTab|" msgid "Create markers on:" msgstr "Créer des marqueurs sur :" #: ../src/libkstapp/markerstab.ui:260 msgctxt "MarkersTab|" msgid "R&ising edge" msgstr "Front &montant" #: ../src/libkstapp/markerstab.ui:267 msgctxt "MarkersTab|" msgid "&Falling edge" msgstr "&Front descendant" #: ../src/libkstapp/markerstab.ui:274 msgctxt "MarkersTab|" msgid "&Both" msgstr "&Les deux" #: ../src/libkstapp/markerstab.ui:281 msgctxt "MarkersTab|" msgid "Use &vector as marker source:" msgstr "Utiliser un &vecteur comme source pour le marqueur :" #: ../src/libkstapp/matrixdialog.cpp:44 msgctxt "Kst::MatrixTab|" msgid "Matrix" msgstr "Matrice" #: ../src/libkstapp/matrixdialog.cpp:613 msgctxt "Kst::MatrixDialog|" msgid "Edit Matrix" msgstr "Modifier la matrice" #: ../src/libkstapp/matrixdialog.cpp:615 msgctxt "Kst::MatrixDialog|" msgid "New Matrix" msgstr "Nouvelle matrice" #: ../src/libkstapp/matrixtab.ui:26 msgctxt "MatrixTab|" msgid "Scaling and Translation" msgstr "Homothétie et translation" #: ../src/libkstapp/matrixtab.ui:44 msgctxt "MatrixTab|" msgid "X step si&ze:" msgstr "&Taille de pas X :" #: ../src/libkstapp/matrixtab.ui:63 msgctxt "MatrixTab|" msgid "&X minimum:" msgstr "&X minimum :" #: ../src/libkstapp/matrixtab.ui:124 msgctxt "MatrixTab|" msgid "&Y minimum:" msgstr "&Y minimum :" #: ../src/libkstapp/matrixtab.ui:143 msgctxt "MatrixTab|" msgid "Y ste&p size:" msgstr "Taille de &pas Y :" #: ../src/libkstapp/matrixtab.ui:207 msgctxt "MatrixTab|" msgid "Gradient Parameters" msgstr "Paramètres de gradient" #: ../src/libkstapp/matrixtab.ui:221 msgctxt "MatrixTab|" msgid "Increment/decrement Z values along:" msgstr "Incrémenter/décrémenter les valeurs Z selon :" #: ../src/libkstapp/matrixtab.ui:231 msgctxt "MatrixTab|" msgid "X-axis" msgstr "Axe X" #: ../src/libkstapp/matrixtab.ui:257 msgctxt "MatrixTab|" msgid "Y-axis" msgstr "Axe Y" #: ../src/libkstapp/matrixtab.ui:298 msgctxt "MatrixTab|" msgid "Z at minimum:" msgstr "Z au minimum :" #: ../src/libkstapp/matrixtab.ui:311 msgctxt "MatrixTab|" msgid "X steps:" msgstr "Pas en X :" #: ../src/libkstapp/matrixtab.ui:324 msgctxt "MatrixTab|" msgid "Y steps:" msgstr "Pas en Y :" #: ../src/libkstapp/matrixtab.ui:337 msgctxt "MatrixTab|" msgid "Z at maximum:" msgstr "Z au maximum :" #: ../src/libkstapp/matrixtab.ui:362 msgctxt "MatrixTab|" msgid "Data Range" msgstr "Plage de données" #: ../src/libkstapp/matrixtab.ui:382 ../src/libkstapp/matrixtab.ui:433 #: ../src/libkstapp/matrixtab.ui:526 ../src/libkstapp/matrixtab.ui:599 msgctxt "MatrixTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/matrixtab.ui:411 msgctxt "MatrixTab|" msgid "Y s&tarting frame:" msgstr "1ère sec&tion en Y :" #: ../src/libkstapp/matrixtab.ui:449 msgctxt "MatrixTab|" msgid "X n&umber of frames:" msgstr "N&ombre de sections en X :" #: ../src/libkstapp/matrixtab.ui:491 msgctxt "MatrixTab|" msgid "C&ount from end" msgstr "C&ompter depuis la fin" #: ../src/libkstapp/matrixtab.ui:507 msgctxt "MatrixTab|" msgid "&Read to end" msgstr "Li&re jusqu'à la fin" #: ../src/libkstapp/matrixtab.ui:542 msgctxt "MatrixTab|" msgid "Y nu&mber of frames:" msgstr "No&mbre de sections en Y :" #: ../src/libkstapp/matrixtab.ui:564 msgctxt "MatrixTab|" msgid "R&ead to end" msgstr "Lir&e jusqu'à la fin" #: ../src/libkstapp/matrixtab.ui:583 msgctxt "MatrixTab|" msgid "Count from en&d" msgstr "Compter &depuis la fin" #: ../src/libkstapp/matrixtab.ui:622 msgctxt "MatrixTab|" msgid "X &starting frame:" msgstr "1ère sect&ion en X :" #: ../src/libkstapp/matrixtab.ui:645 msgctxt "MatrixTab|" msgid " frames" msgstr " section(s)" #: ../src/libkstapp/matrixtab.ui:661 msgctxt "MatrixTab|" msgid "Boxcar &filter first" msgstr "Pré&filtrer" #: ../src/libkstapp/matrixtab.ui:668 msgctxt "MatrixTab|" msgid "Read &1 sample per" msgstr "Lire &1 échantillon par" #: ../src/libkstapp/matrixtab.ui:680 msgctxt "MatrixTab|the source of the item" msgid "Source" msgstr "Source" #: ../src/libkstapp/matrixtab.ui:692 msgctxt "MatrixTab|" msgid "Read from data source" msgstr "Lire depuis la source de données" #: ../src/libkstapp/matrixtab.ui:702 msgctxt "MatrixTab|" msgid "Generate gradient" msgstr "Générer un gradient" #: ../src/libkstapp/matrixtab.ui:734 msgctxt "MatrixTab|" msgid "Data Source Parameters" msgstr "Paramètres de la source de données" #: ../src/libkstapp/matrixtab.ui:746 msgctxt "MatrixTab|" msgid "F&ield or column:" msgstr "C&hamp ou colonne :" #: ../src/libkstapp/matrixtab.ui:765 msgctxt "MatrixTab|" msgid "File name:" msgstr "Nom du fichier :" #: ../src/libkstapp/matrixtab.ui:815 msgctxt "MatrixTab|" msgid "&Connect" msgstr "&Connecter" #: ../src/libkstapp/matrixtab.ui:825 msgctxt "MatrixTab|" msgid "Co&nfigure..." msgstr "Co&nfigurer..." #: ../src/libkstapp/memorywidget.cpp:38 #, qt-format msgctxt "Kst::MemoryWidget|" msgid "%1 MB available" msgstr "%1 Mo disponibles" #: ../src/libkstapp/overridelabeltab.ui:37 msgctxt "OverrideLabelTab|" msgid "Font &size:" msgstr "&Taille de police :" #: ../src/libkstapp/overridelabeltab.ui:100 msgctxt "OverrideLabelTab|" msgid "Font famil&y:" msgstr "&Famille de police :" #: ../src/libkstapp/overridelabeltab.ui:145 msgctxt "OverrideLabelTab|" msgid "&Use plot default font" msgstr "&Utiliser la police par défaut du graphique" #: ../src/libkstapp/overridelabeltab.ui:165 msgctxt "OverrideLabelTab|" msgid " points" msgstr " points" #: ../src/libkstapp/pictureitem.cpp:32 msgctxt "Kst::PictureItem|a picture or an image" msgid "Picture" msgstr "Image" #: ../src/libkstapp/pictureitem.cpp:81 msgctxt "Kst::CreatePictureCommand|" msgid "Kst: Open Image" msgstr "Kst : ouvrir l'image" #: ../src/libkstapp/pictureitem.cpp:154 msgctxt "QObject|" msgid "Error creating picture object from Kst file." msgstr "Erreur à la création de l'objet image depuis le fichier Kst." #: ../src/libkstapp/pictureitem.h:49 ../src/libkstapp/pictureitem.h:50 msgctxt "QObject|" msgid "Create Picture" msgstr "Créer une image" #: ../src/libkstapp/plotaxis.cpp:829 msgctxt "Kst::PlotAxis|" msgid " [Years]" msgstr " [Années]" #: ../src/libkstapp/plotaxis.cpp:836 msgctxt "Kst::PlotAxis|" msgid " [Days]" msgstr " [Jours]" #: ../src/libkstapp/plotaxis.cpp:843 msgctxt "Kst::PlotAxis|" msgid " [Hours]" msgstr " [Heures]" #: ../src/libkstapp/plotaxis.cpp:851 msgctxt "Kst::PlotAxis|" msgid " [Minutes]" msgstr " [Minutes]" #: ../src/libkstapp/plotaxis.cpp:858 msgctxt "Kst::PlotAxis|" msgid " [Seconds]" msgstr " [Secondes]" #: ../src/libkstapp/plotitem.cpp:103 msgctxt "Kst::PlotItem|a plot of data" msgid "Plot" msgstr "Graphique" #: ../src/libkstapp/plotitem.cpp:376 msgctxt "Kst::PlotItem|" msgid "Zoom Maximum" msgstr "Zoom maximum" #: ../src/libkstapp/plotitem.cpp:381 msgctxt "Kst::PlotItem|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom max insensible aux pics" #: ../src/libkstapp/plotitem.cpp:386 msgctxt "Kst::PlotItem|" msgid "Zoom Previous" msgstr "Zoom précédent" #: ../src/libkstapp/plotitem.cpp:390 msgctxt "Kst::PlotItem|" msgid "Zoom Tied" msgstr "Zoom lié" #: ../src/libkstapp/plotitem.cpp:396 msgctxt "Kst::PlotItem|" msgid "Zoom X Tied" msgstr "Zoom lié en X" #: ../src/libkstapp/plotitem.cpp:402 msgctxt "Kst::PlotItem|" msgid "Zoom Y Tied" msgstr "Zoom lié en Y" #: ../src/libkstapp/plotitem.cpp:408 msgctxt "Kst::PlotItem|" msgid "Zoom Mean-centered Y" msgstr "Zoom Y centré sur la moyenne" #: ../src/libkstapp/plotitem.cpp:413 msgctxt "Kst::PlotItem|" msgid "X-Zoom Maximum" msgstr "Zoom X maximum" #: ../src/libkstapp/plotitem.cpp:418 msgctxt "Kst::PlotItem|" msgid "X-Zoom Auto Border" msgstr "Zoom X bordure automatique" #: ../src/libkstapp/plotitem.cpp:423 msgctxt "Kst::PlotItem|" msgid "X-Zoom Spike Insensitive" msgstr "Zoom X insensible aux pics" #: ../src/libkstapp/plotitem.cpp:428 msgctxt "Kst::PlotItem|" msgid "X-Zoom Right" msgstr "Défilement X vers la droite" #: ../src/libkstapp/plotitem.cpp:433 msgctxt "Kst::PlotItem|" msgid "X-Zoom Left" msgstr "Défilement X vers la gauche" #: ../src/libkstapp/plotitem.cpp:438 msgctxt "Kst::PlotItem|" msgid "X-Zoom Out" msgstr "Zoom X arrière" #: ../src/libkstapp/plotitem.cpp:443 msgctxt "Kst::PlotItem|" msgid "X-Zoom In" msgstr "Zoom X avant" #: ../src/libkstapp/plotitem.cpp:448 msgctxt "Kst::PlotItem|" msgid "Normalize X-axis to Y-axis" msgstr "Normaliser l'axe X par rapport à l'axe Y" #: ../src/libkstapp/plotitem.cpp:453 msgctxt "Kst::PlotItem|" msgid "Log X-axis" msgstr "Axe X logarithmique" #: ../src/libkstapp/plotitem.cpp:459 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Local Maximum" msgstr "Zoom Y maximum local" #: ../src/libkstapp/plotitem.cpp:464 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Maximum" msgstr "Zoom Y maximum" #: ../src/libkstapp/plotitem.cpp:469 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Auto Border" msgstr "Zoom Y bordure automatique" #: ../src/libkstapp/plotitem.cpp:474 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Spike Insensitive" msgstr "Zoom Y insensible aux pics" #: ../src/libkstapp/plotitem.cpp:479 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Up" msgstr "Défilement Y vers le haut" #: ../src/libkstapp/plotitem.cpp:484 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Down" msgstr "Défilement Y vers le bas" #: ../src/libkstapp/plotitem.cpp:489 msgctxt "Kst::PlotItem|" msgid "Y-Zoom Out" msgstr "Zoom Y arrière" #: ../src/libkstapp/plotitem.cpp:494 msgctxt "Kst::PlotItem|" msgid "Y-Zoom In" msgstr "Zoom Y avant" #: ../src/libkstapp/plotitem.cpp:499 msgctxt "Kst::PlotItem|" msgid "Normalize Y-axis to X-axis" msgstr "Normaliser l'axe Y par rapport à l'axe X" #: ../src/libkstapp/plotitem.cpp:504 msgctxt "Kst::PlotItem|" msgid "Log Y Axis" msgstr "Axe Y logarithmique" #: ../src/libkstapp/plotitem.cpp:510 msgctxt "Kst::PlotItem|" msgid "Adjust Image Color Scale" msgstr "Ajuster la plage de couleurs de l'image" #: ../src/libkstapp/plotitem.cpp:517 msgctxt "Kst::PlotItem|" msgid "Maximize Plot" msgstr "Maximiser le graphique" #: ../src/libkstapp/plotitem.cpp:524 msgctxt "Kst::PlotItem|" msgid "Share Plots on X-Axis" msgstr "Partager les axes X" #: ../src/libkstapp/plotitem.cpp:530 msgctxt "Kst::PlotItem|" msgid "Share Plots on Y-Axis" msgstr "Partager les axes Y" #: ../src/libkstapp/plotitem.cpp:536 msgctxt "Kst::PlotItem|" msgid "Break Shared Axis Box" msgstr "Ne plus partager les axes" #: ../src/libkstapp/plotitem.cpp:541 msgctxt "Kst::PlotItem|" msgid "Copy Coordinates" msgstr "Copier les coordonnées" #: ../src/libkstapp/plotitem.cpp:546 msgctxt "Kst::PlotItem|" msgid "Copy X Coordinate" msgstr "Copier la coordonnée X" #: ../src/libkstapp/plotitem.cpp:551 msgctxt "Kst::PlotItem|" msgid "Copy Y Coordinate" msgstr "Copier la coordonnée Y" #: ../src/libkstapp/plotitem.cpp:565 msgctxt "Kst::PlotItem|" msgid "Copy" msgstr "Copier" #: ../src/libkstapp/plotitem.cpp:579 msgctxt "Kst::PlotItem|" msgid "Zoom" msgstr "Zoom" #: ../src/libkstapp/plotitem.cpp:648 msgctxt "Kst::PlotItem|" msgid "Filter" msgstr "Filtre" #: ../src/libkstapp/plotitem.cpp:664 msgctxt "Kst::PlotItem|" msgid "Edit Curve" msgstr "Modifier la courbe" #: ../src/libkstapp/plotitem.cpp:680 msgctxt "Kst::PlotItem|" msgid "Fit" msgstr "Régression" #: ../src/libkstapp/plotitem.cpp:696 msgctxt "Kst::PlotItem|" msgid "Shared Axis Box Settings" msgstr "Paramètres d'axes partagés" #: ../src/libkstapp/plotitem.cpp:3326 msgctxt "Kst::PlotItem|" msgid "Info copied to clipboard: " msgstr "Information copiée dans le presse-papiers : " #: ../src/libkstapp/plotitem.cpp:3332 msgctxt "Kst::PlotItem|" msgid "X coordinate copied to clipboard: " msgstr "Coordonnée X copiée dans le presse-papiers : " #: ../src/libkstapp/plotitem.cpp:3338 msgctxt "Kst::PlotItem|" msgid "Y coordinate copied to clipboard: " msgstr "Coordonnée Y copiée dans le presse-papiers : " #: ../src/libkstapp/plotitem.cpp:3349 #, qt-format msgctxt "Kst::PlotItem|" msgid "" "Plot: %1 \n" "Contents:\n" " %2" msgstr "" "Graphique : %1 \n" "Contenu :\n" " %2" #: ../src/libkstapp/plotitem.cpp:3354 msgctxt "Kst::PlotItem|" msgid "Empty Plot" msgstr "Graphique vide" #: ../src/libkstapp/plotitem.cpp:3839 msgctxt "QObject|" msgid "Error creating plot object from Kst file." msgstr "Erreur à la création de l'objet graphique depuis le fichier Kst." #: ../src/libkstapp/plotitem.h:605 ../src/libkstapp/plotitem.h:606 msgctxt "QObject|" msgid "Create Plot" msgstr "Créer un graphique" #: ../src/libkstapp/plotitem.h:615 ../src/libkstapp/plotitem.h:617 msgctxt "QObject|" msgid "Create Plot For Curve" msgstr "Créer un graphique pour la courbe" #: ../src/libkstapp/plotitem.h:654 msgctxt "QObject|" msgid "Zoom Fixed Expression" msgstr "Zoom valeur fixe" #: ../src/libkstapp/plotitem.h:669 ../src/libkstapp/plotitem.h:684 msgctxt "QObject|" msgid "Zoom X Range Expression" msgstr "Zoom fixe en X" #: ../src/libkstapp/plotitem.h:699 msgctxt "QObject|" msgid "Zoom Maximum" msgstr "Zoom maximum" #: ../src/libkstapp/plotitem.h:710 msgctxt "QObject|" msgid "Zoom Max Spike Insensitive" msgstr "Zoom max insensible aux pics" #: ../src/libkstapp/plotitem.h:721 msgctxt "QObject|" msgid "Zoom Mean Centered" msgstr "Zoom centré sur la moyenne" #: ../src/libkstapp/plotitem.h:733 msgctxt "QObject|" msgid "Zoom X Mean Centered" msgstr "Zoom en X centré sur la moyenne" #: ../src/libkstapp/plotitem.h:747 msgctxt "QObject|" msgid "Zoom Y Mean Centered" msgstr "Zoom en Y centré sur la moyenne" #: ../src/libkstapp/plotitem.h:761 msgctxt "QObject|" msgid "Zoom X Maximum" msgstr "Zoom maximum en X " #: ../src/libkstapp/plotitem.h:772 msgctxt "QObject|" msgid "Zoom X Auto Border" msgstr "Zoom en X avec marge" #: ../src/libkstapp/plotitem.h:783 msgctxt "QObject|" msgid "Zoom X No Spike" msgstr "Zoom en X sans pic" #: ../src/libkstapp/plotitem.h:794 msgctxt "QObject|" msgid "Scroll X Right" msgstr "Défilement en X vers la droite" #: ../src/libkstapp/plotitem.h:805 msgctxt "QObject|" msgid "Scroll X Left" msgstr "Défilement en X vers la gauche" #: ../src/libkstapp/plotitem.h:816 msgctxt "QObject|" msgid "Zoom X Out" msgstr "Zoom arrière en X" #: ../src/libkstapp/plotitem.h:827 msgctxt "QObject|" msgid "Zoom X In" msgstr "Zoom avant en X" #: ../src/libkstapp/plotitem.h:838 msgctxt "QObject|" msgid "Zoom Normalize X to Y" msgstr "Zoom normalisant X sur Y" #: ../src/libkstapp/plotitem.h:849 msgctxt "QObject|" msgid "Zoom Y Local Maximum" msgstr "Zoom en Y maximum local" #: ../src/libkstapp/plotitem.h:860 msgctxt "QObject|" msgid "Zoom Y Maximum" msgstr "Zoom maximum en Y" #: ../src/libkstapp/plotitem.h:871 msgctxt "QObject|" msgid "Zoom Y Auto Border" msgstr "Zoom en Y avec marge" #: ../src/libkstapp/plotitem.h:882 msgctxt "QObject|" msgid "Zoom Y No Spike" msgstr "Zoom en Y sans pic" #: ../src/libkstapp/plotitem.h:893 msgctxt "QObject|" msgid "Zoom Y Up" msgstr "Zoom en Y vers le haut" #: ../src/libkstapp/plotitem.h:904 msgctxt "QObject|" msgid "Zoom Y Down" msgstr "Zoom en Y vers le bas" #: ../src/libkstapp/plotitem.h:915 msgctxt "QObject|" msgid "Zoom Y Out" msgstr "Zoom arrière en Y" #: ../src/libkstapp/plotitem.h:926 msgctxt "QObject|" msgid "Zoom Y In" msgstr "Zoom avant en Y" #: ../src/libkstapp/plotitem.h:937 msgctxt "QObject|" msgid "Zoom Normalize Y to X" msgstr "Zoom normalisant Y sur X" #: ../src/libkstapp/plotitem.h:948 msgctxt "QObject|" msgid "Zoom X Log" msgstr "Zoom X logarithmique" #: ../src/libkstapp/plotitem.h:962 msgctxt "QObject|" msgid "Zoom Y Log" msgstr "Zoom Y logarithmique" #: ../src/libkstapp/plotitemdialog.cpp:49 msgctxt "Kst::PlotItemDialog|" msgid "Edit Plot Item" msgstr "Modifier le graphique" #: ../src/libkstapp/plotitemdialog.cpp:54 msgctxt "Kst::PlotItemDialog|" msgid "Contents" msgstr "Contenu" #: ../src/libkstapp/plotitemdialog.cpp:59 #: ../src/libkstapp/plotitemdialog.cpp:917 msgctxt "Kst::PlotItemDialog|" msgid "Top Font" msgstr "Police du haut" #: ../src/libkstapp/plotitemdialog.cpp:60 #: ../src/libkstapp/plotitemdialog.cpp:927 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font" msgstr "Police du bas" #: ../src/libkstapp/plotitemdialog.cpp:61 #: ../src/libkstapp/plotitemdialog.cpp:937 msgctxt "Kst::PlotItemDialog|" msgid "Left Font" msgstr "Police à gauche" #: ../src/libkstapp/plotitemdialog.cpp:62 #: ../src/libkstapp/plotitemdialog.cpp:947 msgctxt "Kst::PlotItemDialog|" msgid "Right Font" msgstr "Police à droite" #: ../src/libkstapp/plotitemdialog.cpp:63 #: ../src/libkstapp/plotitemdialog.cpp:957 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font" msgstr "Police de l'axe" #: ../src/libkstapp/plotitemdialog.cpp:66 msgctxt "Kst::PlotItemDialog|" msgid "Labels" msgstr "Libellés" #: ../src/libkstapp/plotitemdialog.cpp:88 msgctxt "Kst::PlotItemDialog|" msgid "Range/Zoom" msgstr "Plage/Zoom" #: ../src/libkstapp/plotitemdialog.cpp:95 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis" msgstr "Axe X" #: ../src/libkstapp/plotitemdialog.cpp:103 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis" msgstr "Axe Y" #: ../src/libkstapp/plotitemdialog.cpp:110 msgctxt "Kst::PlotItemDialog|" msgid "X-Axis Markers" msgstr "Marqueurs de l'axe X" #: ../src/libkstapp/plotitemdialog.cpp:118 msgctxt "Kst::PlotItemDialog|" msgid "Y-Axis Markers" msgstr "Marqueurs de l'axe Y" #: ../src/libkstapp/plotitemdialog.cpp:920 msgctxt "Kst::PlotItemDialog|" msgid "Top Font*" msgstr "Police du haut*" #: ../src/libkstapp/plotitemdialog.cpp:930 msgctxt "Kst::PlotItemDialog|" msgid "Bottom Font*" msgstr "Police du bas*" #: ../src/libkstapp/plotitemdialog.cpp:940 msgctxt "Kst::PlotItemDialog|" msgid "Left Font*" msgstr "Police à gauche*" #: ../src/libkstapp/plotitemdialog.cpp:950 msgctxt "Kst::PlotItemDialog|" msgid "Right Font*" msgstr "Police à droite*" #: ../src/libkstapp/plotitemdialog.cpp:960 msgctxt "Kst::PlotItemDialog|" msgid "Axis Font*" msgstr "Police de l'axe*" #: ../src/libkstapp/plotrenderitem.cpp:40 msgctxt "Kst::PlotRenderItem|" msgid "Plot Render" msgstr "Rendu du graphique" #: ../src/libkstapp/plotrenderitem.cpp:56 #: ../src/libkstapp/plotrenderitem.cpp:61 msgctxt "Kst::PlotRenderItem|" msgid "Reference Mode" msgstr "Mode de référence" #: ../src/libkstapp/plotrenderitem.cpp:444 #, qt-format msgctxt "Kst::PlotRenderItem|describes a plot. %1 is X axis. %2 is Y axis" msgid "%1 vs %2" msgstr "%1 = f(%2)" #: ../src/libkstapp/powerspectrumdialog.cpp:39 msgctxt "Kst::PowerSpectrumTab|" msgid "Power Spectrum" msgstr "Spectre de puissance" #: ../src/libkstapp/powerspectrumdialog.cpp:114 msgctxt "Kst::PowerSpectrumDialog|" msgid "Edit Power Spectrum" msgstr "Modifier le spectre de puissance" #: ../src/libkstapp/powerspectrumdialog.cpp:116 msgctxt "Kst::PowerSpectrumDialog|" msgid "New Power Spectrum" msgstr "Nouveau spectre de puissance" #: ../src/libkstapp/powerspectrumtab.ui:17 msgctxt "PowerSpectrumTab|" msgid "Power Spectrum Contents" msgstr "Contenu du spectre de puissance" #: ../src/libkstapp/powerspectrumtab.ui:31 msgctxt "PowerSpectrumTab|" msgid "Data vecto&r:" msgstr "Vecteu&r de données :" #: ../src/libkstapp/primitivemodel.cpp:182 msgctxt "Kst::PrimitiveModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/primitivemodel.cpp:184 msgctxt "Kst::PrimitiveModel|" msgid "Value" msgstr "Valeur" #: ../src/libkstapp/rangetab.cpp:26 msgctxt "Kst::RangeTab|" msgid "Range" msgstr "Plage" #: ../src/libkstapp/rangetab.ui:17 msgctxt "RangeTab|" msgid "X Zoom Mode " msgstr "Mode de zoom X " #: ../src/libkstapp/rangetab.ui:26 msgctxt "RangeTab|" msgid "A&uto" msgstr "A&uto" #: ../src/libkstapp/rangetab.ui:36 msgctxt "RangeTab|" msgid "Auto with bor&der" msgstr "Auto avec &marge" #: ../src/libkstapp/rangetab.ui:43 msgctxt "RangeTab|" msgid "S&pike insensitive auto" msgstr "Auto insensible aux &pics" #: ../src/libkstapp/rangetab.ui:58 msgctxt "RangeTab|" msgid "Mean c&entered, " msgstr "C&entré sur la moyenne, " #: ../src/libkstapp/rangetab.ui:74 msgctxt "RangeTab|" msgid "ran&ge: " msgstr "pla&ge : " #: ../src/libkstapp/rangetab.ui:101 msgctxt "RangeTab|" msgid "F&ixed, " msgstr "F&ixe, " #: ../src/libkstapp/rangetab.ui:117 msgctxt "RangeTab|" msgid "fro&m: " msgstr "&de : " #: ../src/libkstapp/rangetab.ui:143 msgctxt "RangeTab|" msgid "t&o: " msgstr "&à : " #: ../src/libkstapp/rangetab.ui:168 ../src/libkstapp/rangetab.ui:329 msgctxt "RangeTab|" msgid "SHOULD BE HIDDEN" msgstr "DEVRAIT ÊTRE MASQUÉ" #: ../src/libkstapp/rangetab.ui:178 msgctxt "RangeTab|" msgid "Y Zoom Mode " msgstr "Mode de zoom Y" #: ../src/libkstapp/rangetab.ui:187 msgctxt "RangeTab|" msgid "&Auto" msgstr "&Auto" #: ../src/libkstapp/rangetab.ui:197 msgctxt "RangeTab|" msgid "Auto with &border" msgstr "Auto avec ma&rge" #: ../src/libkstapp/rangetab.ui:204 msgctxt "RangeTab|" msgid "&Spike insensitive auto" msgstr "Auto insensible aux pic&s" #: ../src/libkstapp/rangetab.ui:219 msgctxt "RangeTab|" msgid "Mean ¢ered, " msgstr "&Centré sur la moyenne, " #: ../src/libkstapp/rangetab.ui:235 msgctxt "RangeTab|" msgid "&range: " msgstr "&plage : " #: ../src/libkstapp/rangetab.ui:262 msgctxt "RangeTab|" msgid "&Fixed, " msgstr "&Fixe, " #: ../src/libkstapp/rangetab.ui:278 msgctxt "RangeTab|" msgid "f&rom: " msgstr "d&e : " #: ../src/libkstapp/rangetab.ui:304 msgctxt "RangeTab|" msgid "&to: " msgstr "&à : " #: ../src/libkstapp/scalardialog.cpp:35 msgctxt "Kst::ScalarTab|" msgid "Scalar" msgstr "Scalaire" #: ../src/libkstapp/scalardialog.cpp:243 msgctxt "Kst::ScalarDialog|" msgid "Edit Scalar" msgstr "Modifier le scalaire" #: ../src/libkstapp/scalardialog.cpp:245 msgctxt "Kst::ScalarDialog|" msgid "New Scalar" msgstr "Nouveau scalaire" #: ../src/libkstapp/scalartab.ui:17 msgctxt "ScalarTab|" msgid "Read from data &source" msgstr "Lire depuis la &source de données" #: ../src/libkstapp/scalartab.ui:27 ../src/libkstapp/scalartab.ui:37 msgctxt "ScalarTab|" msgid "" "Generate a new vector with the properties given here as the independent " "variable." msgstr "Générer un vecteur de données avec les propriétés ci-dessous." #: ../src/libkstapp/scalartab.ui:30 msgctxt "ScalarTab|" msgid "Read from data &vector" msgstr "Lire depuis le &vecteur de données" #: ../src/libkstapp/scalartab.ui:40 msgctxt "ScalarTab|" msgid "&Generate" msgstr "&Générer" #: ../src/libkstapp/scalartab.ui:47 msgctxt "ScalarTab|" msgid "Read from data source" msgstr "Lire depuis la source de données" #: ../src/libkstapp/scalartab.ui:59 msgctxt "ScalarTab|" msgid "File name:" msgstr "Nom du fichier :" #: ../src/libkstapp/scalartab.ui:81 ../src/libkstapp/scalartab.ui:113 msgctxt "ScalarTab|" msgid "&Field:" msgstr "V&ariable :" #: ../src/libkstapp/scalartab.ui:163 msgctxt "ScalarTab|" msgid "&Connect" msgstr "&Connecter" #: ../src/libkstapp/scalartab.ui:173 msgctxt "ScalarTab|" msgid "Co&nfigure..." msgstr "Co&nfigurer..." #: ../src/libkstapp/scalartab.ui:187 msgctxt "ScalarTab|" msgid "F&rame:" msgstr "S&ection :" #: ../src/libkstapp/scalartab.ui:222 msgctxt "ScalarTab|" msgid "or" msgstr "ou" #: ../src/libkstapp/scalartab.ui:235 msgctxt "ScalarTab|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Sélectionner cette option pour lire la fin du fichier. Utile pour les " "courbes défilantes où une autre application écrit dans le fichier de " "données." #: ../src/libkstapp/scalartab.ui:238 msgctxt "ScalarTab|" msgid "&last frame" msgstr "&Dernière" #: ../src/libkstapp/scalartab.ui:253 msgctxt "ScalarTab|" msgid "Generate" msgstr "Générer" #: ../src/libkstapp/scalartab.ui:276 msgctxt "ScalarTab|" msgid "V&alue: " msgstr "Va&leur : " #: ../src/libkstapp/scalartab.ui:289 msgctxt "ScalarTab|" msgid "The maximum value of the independent variable." msgstr "Valeur du scalaire." #: ../src/libkstapp/sessionmodel.cpp:325 msgctxt "Kst::SessionModel|" msgid "Name" msgstr "Nom" #: ../src/libkstapp/sessionmodel.cpp:327 msgctxt "Kst::SessionModel|" msgid "Type" msgstr "Type" #: ../src/libkstapp/sessionmodel.cpp:329 msgctxt "Kst::SessionModel|" msgid "Samples" msgstr "Échantillons" #: ../src/libkstapp/sessionmodel.cpp:331 msgctxt "Kst::SessionModel|" msgid "Properties" msgstr "Propriétés" #: ../src/libkstapp/sharedaxisboxitem.cpp:47 msgctxt "" "Kst::SharedAxisBoxItem|plots inside a shared axis box share the same axis" msgid "Shared Axis Box" msgstr "Groupe d'axes partagés" #: ../src/libkstapp/sharedaxisboxitem.cpp:50 msgctxt "Kst::SharedAxisBoxItem|" msgid "Break Shared Axis Box" msgstr "Ne plus partager les axes" #: ../src/libkstapp/sharedaxisboxitem.cpp:1269 msgctxt "QObject|" msgid "Error creating sharedaxisbox object from Kst file." msgstr "Erreur à la création du groupe d'axes partagés depuis le fichier Kst." #: ../src/libkstapp/sharedaxisboxitem.h:137 #: ../src/libkstapp/sharedaxisboxitem.h:138 msgctxt "QObject|" msgid "Create Shared Axis Box" msgstr "Créer un groupe d'axes partagés" #: ../src/libkstapp/stringdialog.cpp:32 msgctxt "Kst::StringTab|" msgid "String" msgstr "Chaîne" #: ../src/libkstapp/stringdialog.cpp:201 msgctxt "Kst::StringDialog|" msgid "Edit String" msgstr "Éditer la chaîne" #: ../src/libkstapp/stringdialog.cpp:203 msgctxt "Kst::StringDialog|" msgid "New String" msgstr "Nouvelle chaîne" #: ../src/libkstapp/stringtab.ui:17 msgctxt "StringTab|" msgid "Read from data &source" msgstr "Lire depuis la &source de données" #: ../src/libkstapp/stringtab.ui:32 msgctxt "StringTab|" msgid "&File name:" msgstr "Nom du &fichier :" #: ../src/libkstapp/stringtab.ui:48 msgctxt "StringTab|" msgid "F&ield:" msgstr "&Variable :" #: ../src/libkstapp/stringtab.ui:95 msgctxt "StringTab|" msgid "&Connect" msgstr "&Connecter" #: ../src/libkstapp/stringtab.ui:105 msgctxt "StringTab|" msgid "Co&nfigure..." msgstr "Co&nfigurer..." #: ../src/libkstapp/stringtab.ui:117 msgctxt "StringTab|" msgid "&Generate" msgstr "&Générer" #: ../src/libkstapp/stringtab.ui:146 msgctxt "StringTab|" msgid "&Value: " msgstr "&Valeur : " #: ../src/libkstapp/stroketab.cpp:21 msgctxt "Kst::StrokeTab|" msgid "Stroke" msgstr "Barre" #: ../src/libkstapp/stroketab.cpp:23 msgctxt "Kst::StrokeTab|Pen type" msgid "No Pen" msgstr "Pas de trait" #: ../src/libkstapp/stroketab.cpp:24 msgctxt "Kst::StrokeTab|Pen type" msgid "Solid Line" msgstr "Ligne pleine" #: ../src/libkstapp/stroketab.cpp:25 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Line" msgstr "Ligne en tirets" #: ../src/libkstapp/stroketab.cpp:26 msgctxt "Kst::StrokeTab|Pen type" msgid "Dot Line" msgstr "Ligne pointillée" #: ../src/libkstapp/stroketab.cpp:27 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Line" msgstr "Ligne tiret-point" #: ../src/libkstapp/stroketab.cpp:28 msgctxt "Kst::StrokeTab|Pen type" msgid "Dash Dot Dot Line" msgstr "Ligne tiret-point-point" #: ../src/libkstapp/stroketab.cpp:29 msgctxt "Kst::StrokeTab|Pen type" msgid "Custom Dash Line" msgstr "Ligne en tirets personnalisés" #: ../src/libkstapp/stroketab.cpp:31 msgctxt "Kst::StrokeTab|Brush type" msgid "No Brush" msgstr "Pas de remplissage" #: ../src/libkstapp/stroketab.cpp:32 msgctxt "Kst::StrokeTab|Brush type" msgid "Solid Pattern" msgstr "Motif plein" #: ../src/libkstapp/stroketab.cpp:33 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 1" msgstr "Motif dense 1" #: ../src/libkstapp/stroketab.cpp:34 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 2" msgstr "Motif dense 2" #: ../src/libkstapp/stroketab.cpp:35 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 3" msgstr "Motif dense 3" #: ../src/libkstapp/stroketab.cpp:36 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 4" msgstr "Motif dense 4" #: ../src/libkstapp/stroketab.cpp:37 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 5" msgstr "Motif dense 5" #: ../src/libkstapp/stroketab.cpp:38 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 6" msgstr "Motif dense 6" #: ../src/libkstapp/stroketab.cpp:39 msgctxt "Kst::StrokeTab|Brush type" msgid "Dense Pattern 7" msgstr "Motif dense 7" #: ../src/libkstapp/stroketab.cpp:40 msgctxt "Kst::StrokeTab|Brush type" msgid "Horizontal Pattern" msgstr "Motif horizontal" #: ../src/libkstapp/stroketab.cpp:41 msgctxt "Kst::StrokeTab|Brush type" msgid "Vertical Pattern" msgstr "Motif vertical" #: ../src/libkstapp/stroketab.cpp:42 msgctxt "Kst::StrokeTab|Brush type" msgid "Cross Pattern" msgstr "Motif croisé" #: ../src/libkstapp/stroketab.cpp:43 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 1" msgstr "Motif diagonal 1" #: ../src/libkstapp/stroketab.cpp:44 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Pattern 2" msgstr "Motif diagonal 2" #: ../src/libkstapp/stroketab.cpp:45 msgctxt "Kst::StrokeTab|Brush type" msgid "Diagonal Cross Pattern" msgstr "Motif diagonal croisé" #: ../src/libkstapp/stroketab.cpp:47 msgctxt "Kst::StrokeTab|line join style" msgid "Miter Join" msgstr "Raccord droit" #: ../src/libkstapp/stroketab.cpp:48 msgctxt "Kst::StrokeTab|line join style" msgid "Bevel Join" msgstr "Raccord en biseau" #: ../src/libkstapp/stroketab.cpp:49 msgctxt "Kst::StrokeTab|line join style" msgid "Round Join" msgstr "Raccord arrondi" #: ../src/libkstapp/stroketab.cpp:50 msgctxt "Kst::StrokeTab|line join style based on SVG files" msgid "SVG Miter Join" msgstr "Raccord style SVG" #: ../src/libkstapp/stroketab.cpp:52 msgctxt "Kst::StrokeTab|line cap style" msgid "Flat Cap" msgstr "Bout plat" #: ../src/libkstapp/stroketab.cpp:53 msgctxt "Kst::StrokeTab|line cap style" msgid "Square Cap" msgstr "Bout carré" #: ../src/libkstapp/stroketab.cpp:54 msgctxt "Kst::StrokeTab|line cap style" msgid "Round Cap" msgstr "Bout arrondi" #: ../src/libkstapp/stroketab.ui:17 msgctxt "StrokeTab|" msgid "&Style:" msgstr "&Style :" #: ../src/libkstapp/stroketab.ui:43 msgctxt "StrokeTab|" msgid "&Width:" msgstr "&Largeur :" #: ../src/libkstapp/stroketab.ui:62 msgctxt "StrokeTab|" msgid "Brush &color:" msgstr "&Couleur de la brosse :" #: ../src/libkstapp/stroketab.ui:82 msgctxt "StrokeTab|" msgid "&Brush style:" msgstr "Style de &brosse :" #: ../src/libkstapp/stroketab.ui:101 msgctxt "StrokeTab|" msgid "&Join style:" msgstr "Style de &raccord :" #: ../src/libkstapp/stroketab.ui:120 msgctxt "StrokeTab|" msgid "Ca&p style:" msgstr "Style de bout :" #: ../src/libkstapp/svgitem.cpp:39 msgctxt "Kst::SvgItem|an svg picture" msgid "Svg" msgstr "SVG" #: ../src/libkstapp/svgitem.cpp:90 msgctxt "Kst::CreateSvgCommand|" msgid "Kst: Open SVG Image" msgstr "Kst : ouvrir l'image SVG" #: ../src/libkstapp/svgitem.cpp:152 msgctxt "QObject|" msgid "Error creating svg object from Kst file." msgstr "Erreur à la création de l'objet SVG depuis le fichier Kst." #: ../src/libkstapp/svgitem.h:52 ../src/libkstapp/svgitem.h:53 msgctxt "QObject|" msgid "Create Svg" msgstr "Créer une image vectorielle (SVG)" #: ../src/libkstapp/tabwidget.cpp:112 #, qt-format msgctxt "Kst::TabWidget|" msgid "View &%1" msgstr "Vue &%1" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Rename Tab" msgstr "Renommer l'onglet" #: ../src/libkstapp/tabwidget.cpp:167 msgctxt "Kst::TabWidget|" msgid "Enter a new tab name:" msgstr "Saisissez un nouveau nom d'onglet :" #: ../src/libkstapp/tabwidget.cpp:190 msgctxt "Kst::TabWidget|" msgid "&Add tab" msgstr "&Ajouter un onglet" #: ../src/libkstapp/tabwidget.cpp:191 msgctxt "Kst::TabWidget|" msgid "&Rename tab" msgstr "&Renommer l'onglet" #: ../src/libkstapp/tabwidget.cpp:192 msgctxt "Kst::TabWidget|" msgid "&Close tab" msgstr "&Fermer l'onglet" #: ../src/libkstapp/tabwidget.cpp:194 msgctxt "Kst::TabWidget|" msgid "&Edit View" msgstr "&Modifier la vue" #: ../src/libkstapp/tabwidget.cpp:197 msgctxt "Kst::TabWidget|" msgid "Cleanup Layout" msgstr "Nettoyer la mise en page" #: ../src/libkstapp/tabwidget.cpp:198 msgctxt "Kst::TabWidget|" msgid "Automatic" msgstr "Automatique" #: ../src/libkstapp/tabwidget.cpp:199 msgctxt "Kst::TabWidget|" msgid "Custom" msgstr "Personnalisé" #: ../src/libkstapp/themedialog.cpp:40 msgctxt "Kst::ThemeDialog|" msgid "Theme" msgstr "Thème" #: ../src/libkstapp/themedialog.ui:19 msgctxt "ThemeDialog|" msgid "Fill" msgstr "Remplissage" #: ../src/libkstapp/themedialog.ui:29 msgctxt "ThemeDialog|" msgid "Stroke" msgstr "Trait" #: ../src/libkstapp/themedialog.ui:47 msgctxt "ThemeDialog|" msgid "Fonts" msgstr "Polices" #: ../src/libkstapp/themedialog.ui:58 msgctxt "ThemeDialog|" msgid "Font &size:" msgstr "&Taille de police :" #: ../src/libkstapp/themedialog.ui:84 msgctxt "ThemeDialog|" msgid "Font famil&y:" msgstr "Fam&ille de police :" #: ../src/libkstapp/themedialog.ui:100 msgctxt "ThemeDialog|italic font" msgid "Italic" msgstr "Italique" #: ../src/libkstapp/themedialog.ui:123 msgctxt "ThemeDialog|bold font" msgid "Bold" msgstr "Gras" #: ../src/libkstapp/themedialog.ui:139 msgctxt "ThemeDialog|" msgid " points" msgstr " points" #: ../src/libkstapp/themedialog.ui:153 msgctxt "ThemeDialog|" msgid "Save as default" msgstr "Appliquer par défaut" #: ../src/libkstapp/themedialog.ui:160 msgctxt "ThemeDialog|" msgid "Apply to existing objects" msgstr "Appliquer aux objets existants" #: ../src/libkstapp/vectordialog.cpp:38 msgctxt "Kst::VectorTab|" msgid "Vector" msgstr "Vecteur" #: ../src/libkstapp/vectordialog.cpp:60 msgctxt "Kst::VectorTab|update periodically" msgid "Time Interval" msgstr "Intervalle de temps" #: ../src/libkstapp/vectordialog.cpp:61 msgctxt "Kst::VectorTab|update when a change is detected" msgid "Change Detection" msgstr "Détection de modification" #: ../src/libkstapp/vectordialog.cpp:62 msgctxt "Kst::VectorTab|do not update the file" msgid "No Update" msgstr "Aucune mise à jour" #: ../src/libkstapp/vectordialog.cpp:320 msgctxt "Kst::VectorDialog|" msgid "Edit Vector" msgstr "Modifier le vecteur" #: ../src/libkstapp/vectordialog.cpp:322 msgctxt "Kst::VectorDialog|" msgid "New Vector" msgstr "Nouveau vecteur" #: ../src/libkstapp/vectortab.ui:23 msgctxt "VectorTab|" msgid "&Generate" msgstr "&Générer" #: ../src/libkstapp/vectortab.ui:45 msgctxt "VectorTab|" msgid "&Number of samples:" msgstr "&Nombre d'échantillons :" #: ../src/libkstapp/vectortab.ui:64 msgctxt "VectorTab|" msgid "The number of samples for the new independent variable." msgstr "Le nombre d'échantillons à générer." #: ../src/libkstapp/vectortab.ui:90 msgctxt "VectorTab|" msgid "Fro&m:" msgstr "&De :" #: ../src/libkstapp/vectortab.ui:103 msgctxt "VectorTab|" msgid "The minimum value of the independent variable." msgstr "Valeur minimale du vecteur à créer." #: ../src/libkstapp/vectortab.ui:119 msgctxt "VectorTab|" msgid "&to:" msgstr "&à :" #: ../src/libkstapp/vectortab.ui:132 msgctxt "VectorTab|" msgid "The maximum value of the independent variable." msgstr "Valeur maximale du vecteur à créer." #: ../src/libkstapp/vectortab.ui:149 msgctxt "VectorTab|" msgid "Read from &data source" msgstr "Lire depuis la source de &données" #: ../src/libkstapp/vectortab.ui:158 msgctxt "VectorTab|" msgid "File name:" msgstr "Nom du fichier :" #: ../src/libkstapp/vectortab.ui:180 msgctxt "VectorTab|" msgid "F&ield or column:" msgstr "Var&iable ou colonne :" #: ../src/libkstapp/vectortab.ui:223 msgctxt "VectorTab|" msgid "&Connect" msgstr "&Connecter" #: ../src/libkstapp/vectortab.ui:233 msgctxt "VectorTab|" msgid "Co&nfigure..." msgstr "Co&nfigurer..." #: ../src/libkstapp/vectortab.ui:263 msgctxt "VectorTab|" msgid "Update type. Use 'Time Interval' for non local data." msgstr "" "Type de mise à jour. Utiliser « Intervalle de temps » pour des données non " "locales." #: ../src/libkstapp/view.cpp:91 msgctxt "Kst::View|" msgid "Edit" msgstr "Modifier" #: ../src/libkstapp/view.cpp:96 msgctxt "Kst::View|" msgid "Automatic" msgstr "Automatique" #: ../src/libkstapp/view.cpp:99 msgctxt "Kst::View|" msgid "Protect Layout" msgstr "Protéger la mise en page" #: ../src/libkstapp/view.cpp:102 msgctxt "Kst::View|" msgid "Custom" msgstr "Personnalisée" #: ../src/libkstapp/view.cpp:348 msgctxt "Kst::View|" msgid "Kst: Column Layout" msgstr "Kst : disposition en colonne" #: ../src/libkstapp/view.cpp:349 msgctxt "Kst::View|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Mise en page en colonnes, dans l'ordre de création des graphiques.\n" "Définir le nombre de colonnes :" #: ../src/libkstapp/view.cpp:669 msgctxt "Kst::View|" msgid "Cleanup Layout" msgstr "Nettoyer la mise en page" #: ../src/libkstapp/view.cpp:683 msgctxt "Kst::View|" msgid "View Menu" msgstr "Menu de la vue" #: ../src/libkstapp/viewdialog.cpp:31 msgctxt "Kst::ViewDialog|" msgid "Edit View" msgstr "Modifier la vue" #: ../src/libkstapp/viewdialog.cpp:40 msgctxt "Kst::ViewDialog|" msgid "Fill" msgstr "Remplissage" #: ../src/libkstapp/viewitem.cpp:106 msgctxt "Kst::ViewItem|" msgid "Edit" msgstr "Modifier" #: ../src/libkstapp/viewitem.cpp:111 msgctxt "Kst::ViewItem|" msgid "Delete" msgstr "Supprimer" #: ../src/libkstapp/viewitem.cpp:116 msgctxt "Kst::ViewItem|" msgid "Raise" msgstr "Monter" #: ../src/libkstapp/viewitem.cpp:119 msgctxt "Kst::ViewItem|" msgid "Lower" msgstr "Descendre" #: ../src/libkstapp/viewitem.cpp:122 msgctxt "Kst::ViewItem|" msgid "Automatic" msgstr "Automatique" #: ../src/libkstapp/viewitem.cpp:125 msgctxt "Kst::ViewItem|" msgid "Protect Layout" msgstr "Protéger la mise en page" #: ../src/libkstapp/viewitem.cpp:128 msgctxt "Kst::ViewItem|" msgid "Columns" msgstr "Colonnes" #: ../src/libkstapp/viewitem.cpp:131 msgctxt "Kst::ViewItem|" msgid "&Lock Position to Data" msgstr "&Position fixe par rapport aux données" #: ../src/libkstapp/viewitem.cpp:1048 msgctxt "Kst::ViewItem|" msgid "Kst: Column Layout" msgstr "Kst : disposition en colonnes" #: ../src/libkstapp/viewitem.cpp:1049 msgctxt "Kst::ViewItem|" msgid "" "Layout in columns in order of creation.\n" "Select number of columns:" msgstr "" "Mise en page en colonnes, dans l'ordre de création des graphiques.\n" "Définir le nombre de colonnes :" #: ../src/libkstapp/viewitem.cpp:1189 #, qt-format msgctxt "Kst::ViewItem|title of menu for object type arg1" msgid "%1 Menu" msgstr "Menu %1" #: ../src/libkstapp/viewitem.cpp:1214 msgctxt "Kst::ViewItem|" msgid "Cleanup Layout" msgstr "Nettoyer la mise en page" #: ../src/libkstapp/viewitem.cpp:1359 msgctxt "Kst::ViewItem|" msgid "Move" msgstr "Déplacer" #: ../src/libkstapp/viewitem.cpp:1362 msgctxt "Kst::ViewItem|" msgid "Resize" msgstr "Redimensionner" #: ../src/libkstapp/viewitem.cpp:1365 msgctxt "Kst::ViewItem|" msgid "Scale" msgstr "Échelle" #: ../src/libkstapp/viewitem.cpp:1368 msgctxt "Kst::ViewItem|" msgid "Rotate" msgstr "Rotation" #: ../src/libkstapp/viewitem.h:455 msgctxt "QObject|" msgid "Create layout" msgstr "Créer une mise en page" #: ../src/libkstapp/viewitem.h:470 msgctxt "QObject|" msgid "Append Item to Layout" msgstr "Ajouter l'élément à la mise en page" #: ../src/libkstapp/viewitem.h:486 msgctxt "QObject|" msgid "Move" msgstr "Déplacer" #: ../src/libkstapp/viewitem.h:504 msgctxt "QObject|" msgid "Resize" msgstr "Redimensionner" #: ../src/libkstapp/viewitem.h:522 msgctxt "QObject|" msgid "Remove" msgstr "Supprimer" #: ../src/libkstapp/viewitem.h:534 msgctxt "QObject|" msgid "Raise" msgstr "Monter" #: ../src/libkstapp/viewitem.h:546 msgctxt "QObject|" msgid "Lower" msgstr "Descendre" #: ../src/libkstapp/viewitem.h:576 msgctxt "QObject|" msgid "Scale" msgstr "Mettre à l'échelle" #: ../src/libkstapp/viewitem.h:585 msgctxt "QObject|" msgid "Rotate" msgstr "Tourner" #: ../src/libkstapp/viewitemdialog.cpp:40 msgctxt "Kst::ViewItemDialog|" msgid "Edit View Item" msgstr "Modifier la vue" #: ../src/libkstapp/viewitemdialog.cpp:65 msgctxt "Kst::ViewItemDialog|" msgid "&Name:" msgstr "&Nom :" #: ../src/libkstapp/viewitemdialog.cpp:71 #: ../src/libkstapp/viewitemdialog.cpp:406 msgctxt "Kst::ViewItemDialog|" msgid "Edit Multiple >>" msgstr "Modification multiple >>" #: ../src/libkstapp/viewitemdialog.cpp:95 msgctxt "Kst::ViewItemDialog|" msgid "Appearance" msgstr "Apparence" #: ../src/libkstapp/viewitemdialog.cpp:109 msgctxt "Kst::ViewItemDialog|" msgid "Size/Position" msgstr "Taille/position" #: ../src/libkstapp/viewitemdialog.cpp:422 msgctxt "Kst::ViewItemDialog|" msgid "<< Edit One" msgstr "<< Modification simple" #: ../src/libkstapp/viewmatrixdialog.ui:13 msgctxt "ViewMatrixDialog|" msgid "Matrix View" msgstr "Affichage de matrice" #: ../src/libkstapp/viewprimitivedialog.cpp:67 msgctxt "Kst::ViewStringDialog|" msgid "View String Values" msgstr "Afficher les chaînes" #: ../src/libkstapp/viewprimitivedialog.cpp:81 msgctxt "Kst::ViewScalarDialog|" msgid "View Scalar Values" msgstr "Afficher les scalaires" #: ../src/libkstapp/viewprimitivedialog.ui:14 msgctxt "ViewPrimitiveDialog|" msgid "Primitive View" msgstr "Affichage de primitive" #: ../src/libkstapp/viewprimitivedialog.ui:28 msgctxt "ViewPrimitiveDialog|" msgid "Update" msgstr "Mettre à jour" #: ../src/libkstapp/viewvectordialog.cpp:57 msgctxt "Kst::ViewVectorDialog|" msgid "Select Vectors to View" msgstr "Sélectionner les vecteurs à afficher" #: ../src/libkstapp/viewvectordialog.cpp:66 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+S" msgstr "Alt+S" #: ../src/libkstapp/viewvectordialog.cpp:67 msgctxt "Kst::ViewVectorDialog|" msgid "View selected vector(s)" msgstr "Afficher le(s) vecteur(s) sélectionné(s)" #: ../src/libkstapp/viewvectordialog.cpp:71 msgctxt "Kst::ViewVectorDialog|" msgid "Alt+R" msgstr "Alt+R" #: ../src/libkstapp/viewvectordialog.cpp:72 msgctxt "Kst::ViewVectorDialog|" msgid "Remove selected vector(s) from view" msgstr "Supprimer le(s) vecteur(s) sélectionné(s) de l'affichage" #: ../src/libkstapp/viewvectordialog.cpp:109 msgctxt "Kst::ViewVectorDialog|" msgid "Remove" msgstr "Supprimer" #: ../src/libkstapp/viewvectordialog.cpp:111 msgctxt "Kst::ViewVectorDialog|" msgid "Significant digits" msgstr "Nombre de chiffres" #: ../src/libkstapp/viewvectordialog.cpp:112 msgctxt "Kst::ViewVectorDialog|" msgid "Show as int" msgstr "Afficher comme un entier" #: ../src/libkstapp/viewvectordialog.cpp:114 msgctxt "Kst::ViewVectorDialog|" msgid "6 (default)" msgstr "6 (par défaut)" #: ../src/libkstapp/viewvectordialog.ui:20 msgctxt "ViewVectorDialog|" msgid "View Vector Values" msgstr "Afficher les valeurs du vecteur" #: ../src/libkstapp/viewvectordialog.ui:50 msgctxt "ViewVectorDialog|" msgid "Show vector list" msgstr "Afficher la liste de vecteurs" #: ../src/libkstapp/viewvectordialog.ui:66 msgctxt "ViewVectorDialog|" msgid "Hide vector list" msgstr "Masquer la liste de vecteurs" #: ../src/libkstapp/viewvectordialog.ui:143 msgctxt "ViewVectorDialog|" msgid "Reset View" msgstr "Réinitialiser l'affichage" #: ../src/libkstapp/viewvectordialog.ui:150 msgctxt "ViewVectorDialog|" msgid "Close" msgstr "Fermer" #: ../src/libkstmath/basicplugin.cpp:186 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "There is an error in the %1 algorithm." msgstr "Il y a eu une erreur dans l'algorithme %1." #: ../src/libkstmath/basicplugin.cpp:343 #, qt-format msgctxt "Kst::BasicPlugin|" msgid "Plugin: %1" msgstr "Module : %1" #: ../src/libkstmath/basicpluginfactory.cpp:54 msgctxt "QObject|" msgid "Error: unable to create data object from plugin" msgstr "Erreur : impossible de créer les données du plugin" #: ../src/libkstmath/basicpluginfactory.cpp:62 msgctxt "QObject|" msgid "Error: unable to find plugin for data object" msgstr "Erreur : impossible de trouver un module pour les données dérivées" #: ../src/libkstmath/basicpluginfactory.cpp:130 msgctxt "QObject|" msgid "Error creating Plugin Object from Kst file." msgstr "Erreur à la création de l'objet module depuis le fichier Kst." #: ../src/libkstmath/csd.cpp:130 #, fuzzy msgctxt "Kst::CSD|" msgid "Could not allocate sufficient memory for Spectrogram." msgstr "Impossible d'allouer assez de mémoire pour le spectrogramme." #: ../src/libkstmath/csd.cpp:195 #, fuzzy, qt-format #| msgctxt "Kst::MainWindow|" #| msgid "Spectr&ogram" msgctxt "Kst::CSD|" msgid "Spectrogram: %1" msgstr "Spectr&ogramme" #: ../src/libkstmath/csd.cpp:356 msgctxt "Kst::CSD|" msgid "Amplitude Spectral Density" msgstr "Densité spectrale d'amplitude" #: ../src/libkstmath/csd.cpp:360 msgctxt "Kst::CSD|" msgid "Power Spectral Density" msgstr "Densité spectrale de puissance" #: ../src/libkstmath/csd.cpp:364 msgctxt "Kst::CSD|" msgid "Amplitude Spectrum" msgstr "Spectre d'amplitude" #: ../src/libkstmath/csd.cpp:368 msgctxt "Kst::CSD|" msgid "Power Spectrum" msgstr "Spectre de puissance" #: ../src/libkstmath/csd.cpp:377 msgctxt "Kst::CSD|" msgid "Frequency" msgstr "Fréquence" #: ../src/libkstmath/csd.cpp:380 msgctxt "Kst::CSD|" msgid "Time" msgstr "Temps" #: ../src/libkstmath/csd.cpp:393 #, qt-format msgctxt "Kst::CSD|" msgid "" "Spectrogram: %1\n" " FFT Length: 2^%2" msgstr "" "Spectrogramme : %1\n" " Longueur de FFT : 2^%2" #: ../src/libkstmath/csd.cpp:397 msgctxt "Kst::CSD|" msgid "Average; " msgstr "Moyenne ; " #: ../src/libkstmath/csd.cpp:398 msgctxt "Kst::CSD|" msgid "Apodize; " msgstr "Lisser ;" #: ../src/libkstmath/csd.cpp:399 msgctxt "Kst::CSD|" msgid "Remove Mean;" msgstr "Supprimer la moyenne ;" #: ../src/libkstmath/csd.cpp:401 #, qt-format msgctxt "Kst::CSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/libkstmath/csdfactory.cpp:71 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating vector from Kst file." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file." msgstr "Erreur à la création du vecteur depuis le fichier Kst." #: ../src/libkstmath/csdfactory.cpp:88 #, fuzzy #| msgctxt "QObject|" #| msgid "Error creating Histogram from Kst file. Could not find Vector." msgctxt "QObject|" msgid "Error creating Spectrogram from Kst file. Could not find Vector." msgstr "" "Erreur à la création de l'histogramme depuis le fichier Kst. Impossible de " "trouver le vecteur." #: ../src/libkstmath/curve.cpp:84 msgctxt "Kst::Curve|" msgid "Curve" msgstr "Courbe" #: ../src/libkstmath/curve.cpp:401 #, qt-format msgctxt "Kst::Curve|a plot of arg1 vs arg2" msgid "%1 vs %2" msgstr "%1 = f(%2)" #: ../src/libkstmath/curve.cpp:1627 #, qt-format msgctxt "Kst::Curve|" msgid "%1 vs %2" msgstr "%1 = f(%2)" #: ../src/libkstmath/curve.cpp:1633 #, qt-format msgctxt "Kst::Curve|" msgid "" "Curve: %1\n" "X: %2\n" "Y: %3" msgstr "" "Courbe : %1\n" "X : %2\n" "Y : %3" #: ../src/libkstmath/curve.cpp:1636 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X+ Error: %1" msgstr "" "\n" "Erreur X+: %1" #: ../src/libkstmath/curve.cpp:1640 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "X- Error: %1" msgstr "" "\n" "Erreur X-: %1" #: ../src/libkstmath/curve.cpp:1644 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y+ Error: %1" msgstr "" "\n" "Erreur Y+: %1" #: ../src/libkstmath/curve.cpp:1648 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Y- Error: %1" msgstr "" "\n" "Erreur Y-: %1" #: ../src/libkstmath/curve.cpp:1652 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Lines: Width %1 and Style %2" msgstr "" "\n" "Lignes : largeur %1 et style %2" #: ../src/libkstmath/curve.cpp:1656 #, qt-format msgctxt "Kst::Curve|" msgid "" "\n" "Points: Style %1" msgstr "" "\n" "Points : style %1" #: ../src/libkstmath/curve.cpp:1660 msgctxt "Kst::Curve|" msgid "" "\n" "Bars" msgstr "" "\n" "Barres" #: ../src/libkstmath/curvefactory.cpp:112 msgctxt "QObject|" msgid "Error creating Curve from Kst file." msgstr "Erreur à la création de la courbe depuis le fichier Kst." #: ../src/libkstmath/curvefactory.cpp:129 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find xVector." msgstr "" "Erreur à la création de la courbe depuis le fichier Kst. Impossible de " "trouver le vecteur X." #: ../src/libkstmath/curvefactory.cpp:139 msgctxt "QObject|" msgid "Error creating Curve from Kst file. Could not find yVector." msgstr "" "Erreur à la création de la courbe depuis le fichier Kst. Impossible de " "trouver le vecteur Y." #: ../src/libkstmath/dataobject.cpp:264 ../src/libkstmath/dataobject.cpp:270 msgctxt "Kst::DataObject|" msgid "Scanning for data-object plugins." msgstr "Recherche de modules de calcul." #: ../src/libkstmath/dataobject.cpp:605 #, qt-format msgctxt "Kst::DataObject|" msgid "" "(%1) DataObject::writeLockInputsAndOutputs() by tid=%2: write locking output " "%3 (not provider) -- this is probably an error. Please email kst@kde.org " "with details." msgstr "" "(%1) DataObject::writeLockInputsAndOutputs() de tid = %2 : verrouillage en " "écriture par %3 (pas fournisseur) - cela est vraisemblablement une erreur. " "Merci d'envoyer un mail avec les détails à kst@kde.org." #: ../src/libkstmath/enodes.cpp:834 #, qt-format msgctxt "Kst::Debug|" msgid "Equation has unknown object [%1]." msgstr "L'équation contient un objet inconnu [%1]." #: ../src/libkstmath/equation.cpp:109 msgctxt "Kst::Equation|" msgid "Equation Curve" msgstr "Courbe de l'équation" #: ../src/libkstmath/equation.cpp:160 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to find its vectors when reparsing." msgstr "" "L'équation [%1] n'a pas trouvé ses vecteurs lors de la nouvelle analyse." #: ../src/libkstmath/equation.cpp:207 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation [%1] failed to find its vectors when saving. Resulting Kst file " "may have issues." msgstr "" "L'équation [%1] n'a pas trouvé ses vecteurs lors de l'enregistrement. Le " "fichier Kst résultant risque de présenter des problèmes." #: ../src/libkstmath/equation.cpp:258 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] references non-existent objects." msgstr "L'équation [%1] fait référence à des objets inexistants." #: ../src/libkstmath/equation.cpp:265 #, qt-format msgctxt "Kst::Equation|" msgid "Equation [%1] failed to parse. Errors follow." msgstr "L'équation [%1] n'a pas pu être analysée. Voir les erreurs ci-dessous." #: ../src/libkstmath/equation.cpp:267 #, qt-format msgctxt "Kst::Equation|" msgid "Parse Error: %1" msgstr "Erreur d'analyse : %1" #: ../src/libkstmath/equation.cpp:587 #, qt-format msgctxt "Kst::Equation|" msgid "" "Equation: %1\n" " %2\n" "X: %3" msgstr "" "Équation : %1\n" " %2\n" "X : %3" #: ../src/libkstmath/equationfactory.cpp:60 msgctxt "QObject|" msgid "Error creating equation from Kst file." msgstr "Erreur à la création de l'équation depuis le fichier Kst." #: ../src/libkstmath/equationfactory.cpp:77 msgctxt "QObject|" msgid "Error creating equation from Kst file. Could not find xVector." msgstr "" "Erreur à la création de l'équation depuis le fichier Kst. Impossible de " "trouver le vecteur X." #: ../src/libkstmath/eventmonitorentry.cpp:437 msgctxt "Kst::EventMonitorEntry|" msgid "event" msgstr "évènement" #: ../src/libkstmath/eventmonitorentry.cpp:441 #, qt-format msgctxt "Kst::EventMonitorEntry|" msgid "Event: %1" msgstr "Évènement : %1" #: ../src/libkstmath/eventmonitorfactory.cpp:60 msgctxt "QObject|" msgid "Error creating EventMonitorEntry from Kst file." msgstr "" "Erreur à la création de l'entrée de moniteur d'événement depuis le fichier " "Kst." #: ../src/libkstmath/histogram.cpp:176 ../src/libkstmath/histogram.cpp:204 msgctxt "Kst::Histogram|" msgid "Number" msgstr "Nombre" #: ../src/libkstmath/histogram.cpp:184 msgctxt "Kst::Histogram|" msgid "Percent" msgstr "Pourcentage" #: ../src/libkstmath/histogram.cpp:192 msgctxt "Kst::Histogram|" msgid "Fraction" msgstr "Fraction" #: ../src/libkstmath/histogram.cpp:200 msgctxt "Kst::Histogram|" msgid "Normalized Frequency" msgstr "Fréquence normalisée" #: ../src/libkstmath/histogram.cpp:212 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram of %1" msgstr "Histogramme de %1" #: ../src/libkstmath/histogram.cpp:306 ../src/libkstmath/histogram.cpp:412 #, qt-format msgctxt "Kst::Histogram|" msgid "Histogram: %1" msgstr "Histogramme : %1" #: ../src/libkstmath/histogram.cpp:414 #, fuzzy msgctxt "Kst::Histogram|" msgid "" "\n" " Auto-bin" msgstr "" "\n" "..Catégories automatiques" #: ../src/libkstmath/histogram.cpp:416 #, fuzzy, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" " %1 bins from %2 to %3" msgstr "" "\n" "..%1 catégories entre %2 et %3" #: ../src/libkstmath/histogram.cpp:418 #, qt-format msgctxt "Kst::Histogram|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/libkstmath/histogramfactory.cpp:64 msgctxt "QObject|" msgid "Error creating Histogram from Kst file." msgstr "Erreur à la création de l'histogramme depuis le fichier Kst." #: ../src/libkstmath/histogramfactory.cpp:81 msgctxt "QObject|" msgid "Error creating Histogram from Kst file. Could not find Vector." msgstr "" "Erreur à la création de l'histogramme depuis le fichier Kst. Impossible de " "trouver le vecteur." #: ../src/libkstmath/image.cpp:147 #, qt-format msgctxt "Kst::Image|" msgid "Image of %1" msgstr "Image de %1" #: ../src/libkstmath/image.cpp:818 #, qt-format msgctxt "Kst::Image|" msgid "Image: %1\n" msgstr "Image : %1\n" #: ../src/libkstmath/imagefactory.cpp:73 msgctxt "QObject|" msgid "Error creating Image from Kst file." msgstr "Erreur à la création de l'image depuis le fichier Kst." #: ../src/libkstmath/imagefactory.cpp:90 msgctxt "QObject|" msgid "Error creating Image from Kst file. Could not find matrix." msgstr "" "Erreur à la création de l'image depuis le fichier Kst. Impossible de trouver " "la matrice." #: ../src/libkstmath/plotdefines.h:54 ../src/libkstmath/plotdefines.h:64 msgctxt "AxisTab|" msgid "Julian Year" msgstr "Année julienne" #: ../src/libkstmath/plotdefines.h:55 msgctxt "AxisTab|" msgid "Standard C time" msgstr "Temps au standard C" #: ../src/libkstmath/plotdefines.h:56 ../src/libkstmath/plotdefines.h:69 msgctxt "AxisTab|" msgid "Julian Date" msgstr "Date julienne" #: ../src/libkstmath/plotdefines.h:57 ../src/libkstmath/plotdefines.h:70 msgctxt "AxisTab|" msgid "Modified Julian Date" msgstr "Date julienne modifiée" #: ../src/libkstmath/plotdefines.h:58 ../src/libkstmath/plotdefines.h:71 msgctxt "AxisTab|" msgid "Reduced Julian Date" msgstr "Date julienne réduite" #: ../src/libkstmath/plotdefines.h:59 msgctxt "AxisTab|" msgid "International Atomic Time (TAI)" msgstr "Temps atomique international (TAI)" #: ../src/libkstmath/plotdefines.h:60 msgctxt "AxisTab|" msgid "Excel time (Windows)" msgstr "Temps Excel (Windows)" #: ../src/libkstmath/plotdefines.h:65 msgctxt "AxisTab|" msgid "YYYY/MM/DD HH:MM:SS.SS" msgstr "YYYY/MM/DD HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:66 msgctxt "AxisTab|" msgid "DD/MM/YYYY HH:MM:SS.SS" msgstr "DD/MM/YYYY HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:67 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:68 msgctxt "AxisTab|" msgid " HH:MM:SS.SS" msgstr " HH:MM:SS.SS" #: ../src/libkstmath/plotdefines.h:72 msgctxt "AxisTab|" msgid "Formatted String" msgstr "Chaîne formatée" #: ../src/libkstmath/psd.cpp:131 msgctxt "Kst::PSD|" msgid "PSD Curve" msgstr "Spectre" #: ../src/libkstmath/psd.cpp:203 msgctxt "Kst::PSD|" msgid "Attempted to create a PSD that used all memory." msgstr "La tentative de création du spectre a consommé toute la mémoire." #: ../src/libkstmath/psd.cpp:335 #, qt-format msgctxt "Kst::PSD|" msgid "PSD: %1" msgstr "Spectre : %1" #: ../src/libkstmath/psd.cpp:441 msgctxt "Kst::PSD|" msgid "Spectral Density" msgstr "Densité spectrale" #: ../src/libkstmath/psd.cpp:449 msgctxt "Kst::PSD|" msgid "PSD" msgstr "Spectre" #: ../src/libkstmath/psd.cpp:457 msgctxt "Kst::PSD|" msgid "Amplitude Spectrum" msgstr "Spectre d'amplitude" #: ../src/libkstmath/psd.cpp:465 msgctxt "Kst::PSD|" msgid "Power Spectrum" msgstr "Spectre de puissance" #: ../src/libkstmath/psd.cpp:476 msgctxt "Kst::PSD|" msgid "Frequency" msgstr "Fréquence" #: ../src/libkstmath/psd.cpp:495 #, qt-format msgctxt "Kst::PSD|" msgid "" "Spectrum: %1\n" " FFT Length: 2^%2" msgstr "" "Spectre : %1\n" " Longueur de FFT : 2^%2" #: ../src/libkstmath/psd.cpp:499 msgctxt "Kst::PSD|" msgid "Average; " msgstr "Moyenner ; " #: ../src/libkstmath/psd.cpp:500 msgctxt "Kst::PSD|" msgid "Apodize; " msgstr "Lisser ;" #: ../src/libkstmath/psd.cpp:501 msgctxt "Kst::PSD|" msgid "Remove Mean;" msgstr "Supprimer la moyenne ;" #: ../src/libkstmath/psd.cpp:503 #, qt-format msgctxt "Kst::PSD|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/libkstmath/psdcalculator.cpp:168 msgctxt "Kst::Debug|" msgid "" "in PSDCalculator::calculatePowerSpectrum: received output array with wrong " "length." msgstr "" "La longueur du vecteur de sortie est incorrecte dans la méthode " "PSDCalculator::calculatePowerSpectrum." #: ../src/libkstmath/psdfactory.cpp:72 msgctxt "QObject|" msgid "Error creating PSD from Kst file." msgstr "Erreur à la création du spectre depuis le fichier Kst." #: ../src/libkstmath/psdfactory.cpp:89 msgctxt "QObject|" msgid "Error creating PSD from Kst file. Could not find Vector." msgstr "" "Erreur à la création du spectre depuis le fichier Kst. Impossible de trouver " "le vecteur." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:154 #, qt-format msgctxt "ActivityLevelSource|" msgid "%1 Activity Level" msgstr "Niveau d'activité de %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:156 msgctxt "ActivityLevelSource|" msgid "Activity Level" msgstr "Niveau d'activité" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:163 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "Activity Level: %1\n" " Sampling Time: %2 (s)\n" " Window width: %3 (s)\n" " Noise Threshold: %4 \n" msgstr "" "Niveau d'activité : %1\n" " Echantillonnage : %2 (s)\n" " Largeur de fenêtre : %3 (s)\n" " Seuil de bruit : %4 \n" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:165 #, qt-format msgctxt "ActivityLevelSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:211 msgctxt "ActivityLevelSource|" msgid "Error: Input vector too short." msgstr "Erreur : vecteur d'entrée trop court." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:215 msgctxt "ActivityLevelSource|" msgid "Error: the window must be broader." msgstr "Erreur : largeur de fenêtre insuffisante." #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:404 msgctxt "ActivityLevelPlugin|" msgid "Activity Level" msgstr "Niveau d'activité" #: ../src/plugins/dataobject/activitylevel/activitylevel.cpp:405 msgctxt "ActivityLevelPlugin|" msgid "" "Computes the activity level of a signal as the product of standard deviation " "and number of reversals over a sliding window." msgstr "" "Calcule le niveau d'activité d'un signal en tant que produit de la variance " "et du nombre de changements de direction sur une fenêtre glissante." #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:31 msgctxt "ActivityLevelConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:61 msgctxt "ActivityLevelConfig|" msgid "Sampling Time (s)" msgstr "Echantillonage (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:84 msgctxt "ActivityLevelConfig|" msgid "Window Width (s)" msgstr "Largeur de fenêtre (s)" #: ../src/plugins/dataobject/activitylevel/activitylevel.ui:107 msgctxt "ActivityLevelConfig|" msgid "Noise Threshold" msgstr "Seuil de bruit" #: ../src/plugins/dataobject/bin/bin.cpp:121 msgctxt "BinSource|" msgid "Bin Plugin Object" msgstr "" #: ../src/plugins/dataobject/bin/bin.cpp:145 #, fuzzy #| msgid "Input Vector One" msgctxt "BinSource|" msgid "Error: Input Vector invalid size" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/bin/bin.cpp:150 msgctxt "BinSource|" msgid "Error: No Bins" msgstr "" #: ../src/plugins/dataobject/bin/bin.cpp:219 msgctxt "BinPlugin|" msgid "Bin" msgstr "" #: ../src/plugins/dataobject/bin/bin.cpp:220 msgctxt "BinPlugin|" msgid "" "Bins data into the given size bins. Each bin contains the mean of the " "elements belonging to the bin." msgstr "" #: ../src/plugins/dataobject/bin/binconfig.ui:31 msgctxt "BinConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/bin/binconfig.ui:61 msgctxt "BinConfig|" msgid "Bin Size" msgstr "" #: ../src/plugins/dataobject/chop/chop.cpp:114 msgctxt "ChopSource|" msgid "Chop Plugin Object" msgstr "" #: ../src/plugins/dataobject/chop/chop.cpp:142 #, fuzzy #| msgid "Input Vector One" msgctxt "ChopSource|" msgid "Error: Input Vector invalid size" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/chop/chop.cpp:210 msgctxt "ChopPlugin|" msgid "Chop" msgstr "" #: ../src/plugins/dataobject/chop/chop.cpp:211 msgctxt "ChopPlugin|" msgid "Chops a given data set into odd, even, difference, and Index data sets." msgstr "" #: ../src/plugins/dataobject/chop/chopconfig.ui:30 msgctxt "ChopConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:123 msgctxt "ConvolveSource|" msgid "Convolve Plugin Object" msgstr "Objet module de convolution" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:146 msgctxt "ConvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:188 msgctxt "ConvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:312 msgctxt "ConvolvePlugin|" msgid "Convolve" msgstr "Convoluer" #: ../src/plugins/dataobject/convolution/convolve/convolve.cpp:313 msgctxt "ConvolvePlugin|" msgid "Generates the convolution of one vector with another." msgstr "Génère la convolution d'un vecteur avec un autre" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:30 msgctxt "ConvolveConfig|" msgid "Input Vector One" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/convolution/convolve/convolveconfig.ui:60 msgctxt "ConvolveConfig|" msgid "Input Vector Two" msgstr "Vecteur d'entrée 2" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:123 msgctxt "DeconvolveSource|" msgid "Deconvolve Plugin Object" msgstr "Objet module de déconvolution" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:146 msgctxt "DeconvolveSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:189 msgctxt "DeconvolveSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:318 msgctxt "DeconvolvePlugin|" msgid "Deconvolve" msgstr "Déconvoluer" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolve.cpp:319 msgctxt "DeconvolvePlugin|" msgid "Generates the deconvolution of one vector with another." msgstr "Génère la déconvolution d'un vecteur avec un autre" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:30 msgctxt "DeconvolveConfig|" msgid "Input Vector One" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/convolution/deconvolve/deconvolveconfig.ui:60 msgctxt "DeconvolveConfig|" msgid "Input Vector Two" msgstr "Vecteur d'entrée 2" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:109 msgctxt "AutoCorrelationSource|" msgid "Auto Correlation Plugin Object" msgstr "Objet module d'auto-corrélation" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:133 #, fuzzy #| msgid "Input Vector One" msgctxt "AutoCorrelationSource|" msgid "Error: Input Vector invalid size" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:167 msgctxt "AutoCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:279 msgctxt "AutoCorrelationPlugin|" msgid "Auto Correlation" msgstr "Auto-corrélation" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelation.cpp:280 msgctxt "AutoCorrelationPlugin|" msgid "Generates the auto-correlation of a vector." msgstr "Génère l'auto-corrélation d'un vecteur" #: ../src/plugins/dataobject/correlation/autocorrelation/autocorrelationconfig.ui:30 msgctxt "AutoCorrelationConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:124 msgctxt "CrossCorrelationSource|" msgid "Cross Correlation" msgstr "Corrélation croisée" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:149 msgctxt "CrossCorrelationSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:183 msgctxt "CrossCorrelationSource|" msgid "Error: Invalid Input length calculated" msgstr "" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:309 msgctxt "CrossCorrelationPlugin|" msgid "Cross Correlation" msgstr "Corrélation croisée" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelation.cpp:310 msgctxt "CrossCorrelationPlugin|" msgid "Generates the correlation of one vector with another." msgstr "Génère la corrélation d'un vecteur avec un autre" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:30 msgctxt "CrossCorrelationConfig|" msgid "Input Vector One" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/correlation/crosscorrelation/crosscorrelationconfig.ui:60 msgctxt "CrossCorrelationConfig|" msgid "Input Vector Two" msgstr "Vecteur d'entrée 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:151 msgctxt "CrossSpectrumSource|" msgid "Cross Spectrum Plugin Object" msgstr "Objet module de spectre croisé" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:359 msgctxt "CrossSpectrumPlugin|" msgid "Cross Spectrum DataObject Plugin" msgstr "Module objet de données de spectre croisé" #: ../src/plugins/dataobject/crossspectrum/crossspectrum.cpp:360 msgctxt "CrossSpectrumPlugin|" msgid "Generates the cross power spectrum of one vector with another." msgstr "Génère le spectre de puissance croisé d'un vecteur avec un autre." #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:29 msgctxt "CrossSpectrumConfig|" msgid "Input Vector One" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:55 msgctxt "CrossSpectrumConfig|" msgid "Input Vector Two" msgstr "Vecteur d'entrée 2" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:84 msgctxt "CrossSpectrumConfig|" msgid "FFT Length = 2^" msgstr "Longueur de FFT : 2^" #: ../src/plugins/dataobject/crossspectrum/crossspectrumconfig.ui:106 msgctxt "CrossSpectrumConfig|" msgid "Sample Rate" msgstr "Taux d'échantillonnage" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:168 msgctxt "EffectiveBandwidthSource|" msgid "Effective Bandwidth Plugin Object" msgstr "Objet module de bande passante effective" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:203 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X invalid size" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:209 msgctxt "EffectiveBandwidthSource|" msgid "Error: Input Vector X and Input Vector Y are not the same length" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:238 msgctxt "EffectiveBandwidthSource|" msgid "Error: Calculated Indices invalid" msgstr "" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:340 msgctxt "EffectiveBandwidthPlugin|" msgid "Effective Bandwidth" msgstr "Bande passante effective" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp:341 msgctxt "EffectiveBandwidthPlugin|" msgid "Calculates effective bandwidth from an amplitude spectrum." msgstr "Calcule la bande passante effective à partir d'un spectre d'amplitude." #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:29 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:58 msgctxt "EffectiveBandwidthConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:87 msgctxt "EffectiveBandwidthConfig|" msgid "Min. White Noise Freq." msgstr "Fréquence min. du bruit blanc" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:109 msgctxt "EffectiveBandwidthConfig|" msgid "SamplingFrequency (Hz)" msgstr "Fréquence d'échantillonnage (Hz)" #: ../src/plugins/dataobject/effectivebandwidth/effectivebandwidthconfig.ui:128 msgctxt "EffectiveBandwidthConfig|Abbreviation for Kelvin (unit)" msgid "K" msgstr "K" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:156 msgctxt "GenericFilterSource|" msgid "Generic Filter Plugin Object" msgstr "Objet module de filtre générique" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:184 msgctxt "GenericFilterSource|" msgid "Error: Input String Numerator is Empty" msgstr "" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:190 msgctxt "GenericFilterSource|" msgid "Error: Input String Denominator is Empty" msgstr "" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:293 msgctxt "GenericFilterPlugin|" msgid "Generic Filter" msgstr "Filtre générique" #: ../src/plugins/dataobject/genericfilter/genericfilter.cpp:294 msgctxt "GenericFilterPlugin|" msgid "Generates a discrete filter from a continuous-time definition." msgstr "Génère un filtre discret à partir d'une définition en temps continu" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:30 msgctxt "GenericFilterConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:73 msgctxt "GenericFilterConfig|" msgid "Sampling interval (s)" msgstr "Période d'échantillonage (s)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:109 msgctxt "GenericFilterConfig|" msgid "Numerator (increasing order)" msgstr "Numérateur (ordre croissant)" #: ../src/plugins/dataobject/genericfilter/genericfilterconfig.ui:145 msgctxt "GenericFilterConfig|" msgid "Denominator (increasing order)" msgstr "Dénominateur (ordre croissant)" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:136 msgctxt "AkimaSource|" msgid "Interpolation Akima Plugin Object" msgstr "Objet module d'interpolation Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:218 msgctxt "AkimaPlugin|" msgid "Interpolation Akima Spline" msgstr "Interpolation Spline d'Akima" #: ../src/plugins/dataobject/interpolations/akima/akima.cpp:219 msgctxt "AkimaPlugin|" msgid "Generates a non-rounded Akima interpolation for a set of data." msgstr "" "Génère une interpolation Akima non-arrondie pour un ensemble de données" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:30 msgctxt "AkimaConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:60 msgctxt "AkimaConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/akima/akimaconfig.ui:90 msgctxt "AkimaConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:136 msgctxt "AkimaPeriodicSource|" msgid "Interpolation Akima Periodic Plugin Object" msgstr "Objet module d'interpolation Akima périodique" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:218 msgctxt "AkimaPeriodicPlugin|" msgid "Interpolation Akima Periodic Spline" msgstr "Interpolation Spline d'Akima périodique" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodic.cpp:219 msgctxt "AkimaPeriodicPlugin|" msgid "Generates a non-rounded periodic Akima interpolation for a set of data." msgstr "" "Génère une interpolation Akima périodique non-arrondie pour un ensemble de " "données" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:30 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:60 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/akimaperiodic/akimaperiodicconfig.ui:90 msgctxt "AkimaPeriodicConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:136 msgctxt "CubicSplineSource|" msgid "Interpolation Cubic Spline Plugin Object" msgstr "Objet module d'interpolation Spline cubique" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:218 msgctxt "CubicSplinePlugin|" msgid "Interpolation Cubic Spline Spline" msgstr "Interpolation Spline cubique" #: ../src/plugins/dataobject/interpolations/cspline/cspline.cpp:219 msgctxt "CubicSplinePlugin|" msgid "Generates a spline interpolation for a set of data." msgstr "Génère une interpolation Spline pour un ensemble de données" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:30 msgctxt "CubicSplineConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:60 msgctxt "CubicSplineConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/cspline/csplineconfig.ui:90 msgctxt "CubicSplineConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:136 msgctxt "CubicSplinePeriodicSource|" msgid "Interpolation Cubic Spline Periodic Plugin Object" msgstr "Objet module d'interpolation Spline cubique périodique" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:218 msgctxt "CubicSplinePeriodicPlugin|" msgid "Interpolation Cubic Spline Periodic Spline" msgstr "Interpolation Spline cubique périodique" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodic.cpp:219 msgctxt "CubicSplinePeriodicPlugin|" msgid "Generates a cubic spline interpolation for a set of data." msgstr "Génère une interpolation Spline cubique pour un ensemble de données" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:30 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:60 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/csplineperiodic/csplineperiodicconfig.ui:90 msgctxt "CubicSplinePeriodicConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:136 msgctxt "LinearSource|" msgid "Interpolation Linear Plugin Object" msgstr "Objet module d'interpolation linéaire" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:218 msgctxt "LinearPlugin|" msgid "Interpolation Linear Spline" msgstr "Interpolation Spline linéaire" #: ../src/plugins/dataobject/interpolations/linear/linear.cpp:219 msgctxt "LinearPlugin|" msgid "Generates a linear interpolation for a set of data." msgstr "Génère une interpolation linéaire pour un ensemble de données" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:30 msgctxt "LinearConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:60 msgctxt "LinearConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/linear/linearconfig.ui:90 msgctxt "LinearConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:136 msgctxt "PolynomialSource|" msgid "Interpolation Polynomial Plugin Object" msgstr "Objet module d'interpolation polynomiale" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:218 msgctxt "PolynomialPlugin|" msgid "Interpolation Polynomial Spline" msgstr "Interpolation Spline polynomiale" #: ../src/plugins/dataobject/interpolations/polynomial/polynomial.cpp:219 msgctxt "PolynomialPlugin|" msgid "Generates a polynomial interpolation for a set of data." msgstr "Génère une interpolation polynomiale pour un ensemble de données" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:30 msgctxt "PolynomialConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:60 msgctxt "PolynomialConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/interpolations/polynomial/polynomialconfig.ui:90 msgctxt "PolynomialConfig|" msgid "Input Vector X'" msgstr "Vecteur d'entrée X'" #: ../src/plugins/dataobject/linefit/linefit.cpp:127 msgctxt "LineFitSource|" msgid "Line Fit Plugin Object" msgstr "Objet module de régression linéaire" #: ../src/plugins/dataobject/linefit/linefit.cpp:163 msgctxt "LineFitSource|" msgid "Error: Input Vector Y Length invalid" msgstr "" #: ../src/plugins/dataobject/linefit/linefit.cpp:168 msgctxt "LineFitSource|" msgid "Error: Input Vector X Length invalid" msgstr "" #: ../src/plugins/dataobject/linefit/linefit.cpp:293 msgctxt "LineFitPlugin|" msgid "Line Fit" msgstr "Régression linéaire" #: ../src/plugins/dataobject/linefit/linefit.cpp:294 msgctxt "LineFitPlugin|" msgid "Generates a line of best fit for a set of data." msgstr "Génère une ligne qui approche au mieux un ensemble de données" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:30 msgctxt "LineFitConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/linefit/linefitconfig.ui:60 msgctxt "LineFitConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/lockin/lockin.cpp:134 msgctxt "LockInSource|" msgid "Lock-In DataObject Plugin" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:247 msgctxt "LockInSource|" msgid "Error: Input Vectors - invalid size" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:344 msgctxt "LockInPlugin|" msgid "Lock-In" msgstr "" #: ../src/plugins/dataobject/lockin/lockin.cpp:345 msgctxt "LockInPlugin|" msgid "Lock-In amplifies Input using a Reference carrier wave" msgstr "" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:29 msgctxt "LockInConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/lockin/lockinconfig.ui:58 msgctxt "LockInConfig|" msgid "Reference Vector" msgstr "Vecteur de référence" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:123 msgctxt "NoiseAdditionSource|" msgid "Noise Addition Plugin Object" msgstr "Objet module d'ajout de bruit" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:147 #, fuzzy #| msgid "Input Vector One" msgctxt "NoiseAdditionSource|" msgid "Error: Input Vector invalid size" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:223 msgctxt "NoiseAdditionPlugin|" msgid "Noise Addition" msgstr "Ajout de bruit" #: ../src/plugins/dataobject/noiseaddition/noiseaddition.cpp:224 msgctxt "NoiseAdditionPlugin|" msgid "" "Adds Gaussian noise to a set of data, of a specified standard deviation." msgstr "" "Ajoute un bruit gaussien à un ensemble de données, avec un écart type donné." #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:31 msgctxt "NoiseAdditionConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/noiseaddition/noiseadditionconfig.ui:61 msgctxt "NoiseAdditionConfig|" msgid "Sigma" msgstr "Sigma" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:157 msgctxt "PeriodogramSource|" msgid "Periodogram Plugin Object" msgstr "Objet module périodogramme" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:199 msgctxt "PeriodogramSource|" msgid "Error: Input Vector lengths do not match" msgstr "" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:825 msgctxt "PeriodogramPlugin|" msgid "Periodogram" msgstr "Périodogramme" #: ../src/plugins/dataobject/periodogram/periodogram.cpp:826 msgctxt "PeriodogramPlugin|" msgid "" "Takes the outputVectorPeriodogram of a given inputVectorData set. The " "inputVectorData is not assumed to be sampled at equal inputVectorTime " "intervals." msgstr "" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:29 msgctxt "PeriodogramConfig|" msgid "Input Vector Time" msgstr "Vecteur d'entrée temps" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:58 msgctxt "PeriodogramConfig|" msgid "Input Vector Data" msgstr "Vecteur d'entrée données" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:87 msgctxt "PeriodogramConfig|" msgid "Oversampling factor" msgstr "Facteur de sur-échantillonnage" #: ../src/plugins/dataobject/periodogram/periodogramconfig.ui:109 msgctxt "PeriodogramConfig|" msgid "Average Nyquist frequency factor" msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:153 msgctxt "PhaseSource|" msgid "Phase Plugin Object" msgstr "Objet module de phase" #: ../src/plugins/dataobject/phase/phase.cpp:190 msgctxt "PhaseSource|" msgid "Error: Input Scalar Phase must be greater than zero." msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:195 msgctxt "PhaseSource|" msgid "Error: Input Vector lengths do not match." msgstr "" #: ../src/plugins/dataobject/phase/phase.cpp:339 msgctxt "PhasePlugin|" msgid "Phase" msgstr "Phase" #: ../src/plugins/dataobject/phase/phase.cpp:340 msgctxt "PhasePlugin|" msgid "" "Phases a given data set to the specified period and zero outputVectorPhase." msgstr "" #: ../src/plugins/dataobject/phase/phaseconfig.ui:29 msgctxt "PhaseConfig|" msgid "Input Vector Time" msgstr "Vecteur d'entrée temps" #: ../src/plugins/dataobject/phase/phaseconfig.ui:55 msgctxt "PhaseConfig|" msgid "Input Vector Data" msgstr "Vecteur d'entrée données" #: ../src/plugins/dataobject/phase/phaseconfig.ui:84 msgctxt "PhaseConfig|" msgid "Period" msgstr "Période" #: ../src/plugins/dataobject/phase/phaseconfig.ui:106 msgctxt "PhaseConfig|" msgid "Zero Phase" msgstr "Phase zéro" #: ../src/plugins/dataobject/shift/shift.cpp:135 msgctxt "ShiftSource|" msgid "Shift Plugin Object" msgstr "Objet module de décalage" #: ../src/plugins/dataobject/shift/shift.cpp:141 #, qt-format msgctxt "ShiftSource|Phase shift. dX is the amount of the shift" msgid "" "Shift: %1\n" " dX: %2\n" msgstr "" "Décalage : %1\n" " dX : %2\n" #: ../src/plugins/dataobject/shift/shift.cpp:143 #, qt-format msgctxt "ShiftSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/dataobject/shift/shift.cpp:253 msgctxt "ShiftPlugin|" msgid "Shift" msgstr "Décalage " #: ../src/plugins/dataobject/shift/shift.cpp:254 msgctxt "ShiftPlugin|" msgid "Shifts (and truncates) a vector." msgstr "Décale (et tronque) un vecteur." #: ../src/plugins/dataobject/shift/shiftconfig.ui:29 msgctxt "ShiftConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/shift/shiftconfig.ui:58 msgctxt "ShiftConfig|" msgid "Shift value (# points, negative allowed)" msgstr "Valeur de décalage (nombre de points, négatif possible)" #: ../src/plugins/dataobject/statistics/statistics.cpp:113 #, qt-format msgctxt "StatisticsSource|arg1 is a vector" msgid "%1 Statistics" msgstr "Statistiques de %1" #: ../src/plugins/dataobject/statistics/statistics.cpp:151 #, fuzzy #| msgid "Input Vector One" msgctxt "StatisticsSource|" msgid "Error: Input Vector invalid size" msgstr "Vecteur d'entrée 1" #: ../src/plugins/dataobject/statistics/statistics.cpp:317 msgctxt "StatisticsPlugin|" msgid "Statistics" msgstr "Statistiques" #: ../src/plugins/dataobject/statistics/statistics.cpp:318 msgctxt "StatisticsPlugin|" msgid "Determines statistics for a given inputVector set." msgstr "Détermine les statistiques pour un ensemble vecteur d'entrée" #: ../src/plugins/dataobject/statistics/statisticsconfig.ui:30 msgctxt "StatisticsConfig|" msgid "Input Vector" msgstr "Vecteur d'entrée" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:176 msgctxt "SyncBinSource|" msgid "SyncBin Plugin Object" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:219 msgctxt "SyncBinSource|" msgid "Error: Input Vector X invalid size" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:223 msgctxt "SyncBinSource|" msgid "Error: Input Vector lengths do not match" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:228 msgctxt "SyncBinSource|" msgid "Error: Bins must be at least 2" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:387 msgctxt "SyncBinPlugin|" msgid "SyncBin" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbin.cpp:388 msgctxt "SyncBinPlugin|" msgid "" "Synchronously coadd vector Y into inputScalarBins defined by vector X. Like " "a 1D map." msgstr "" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:29 msgctxt "SyncBinConfig|" msgid "Input Vector X" msgstr "Vecteur d'entrée X" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:58 msgctxt "SyncBinConfig|" msgid "Input Vector Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:87 msgctxt "SyncBinConfig|" msgid "Number of Bins" msgstr "" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:113 msgctxt "SyncBinConfig|" msgid "X Min" msgstr "X min" #: ../src/plugins/dataobject/syncbin/syncbinconfig.ui:135 msgctxt "SyncBinConfig|" msgid "X Max" msgstr "X max" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:156 #, qt-format msgctxt "FilterButterworthBandPassSource|arg1 is a vector" msgid "%1 Band Pass" msgstr "%1 filtré passe-bande" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:224 #, qt-format msgctxt "FilterButterworthBandPassSource|" msgid "Filtered %1" msgstr "%1 filtré" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:291 msgctxt "ButterworthBandPassPlugin|" msgid "Band Pass Filter" msgstr "Filtre passe-bande" #: ../src/plugins/filters/butterworth_bandpass/butterworth_bandpass.cpp:292 msgctxt "ButterworthBandPassPlugin|" msgid "" "Filters a vector with a zero phase band pass filter with a butterworth " "amplitude response." msgstr "" "Filtre un vecteur avec un filtre passe-bande à phase nulle avec une réponse " "en amplitude de Butterworth." #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:41 msgctxt "FilterButterworthBandPassConfig|" msgid "Input Vector - Y:" msgstr "Vecteur d'entrée Y :" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:63 msgctxt "FilterButterworthBandPassConfig|" msgid "Filter Order:" msgstr "Ordre du filtre :" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:85 msgctxt "FilterButterworthBandPassConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Fréquence centrale / taux d'échantillonnage :" #: ../src/plugins/filters/butterworth_bandpass/filterbutterworthbandpassconfig.ui:104 msgctxt "FilterButterworthBandPassConfig|" msgid "Band width:" msgstr "Largeur de bande :" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:155 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "%1 Band Stop" msgstr "%1 filtré coupe-bande" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:216 #, qt-format msgctxt "FilterButterworthBandStopSource|" msgid "Filtered %1" msgstr "%1 filtré" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:283 msgctxt "ButterworthBandStopPlugin|" msgid "Band Stop Filter" msgstr "Filtre coupe-bande" #: ../src/plugins/filters/butterworth_bandstop/butterworth_bandstop.cpp:284 msgctxt "ButterworthBandStopPlugin|" msgid "" "Filters a vector with a zero phase band stop filter with a butterworth " "amplitude response." msgstr "" "Filtre un vecteur avec un filtre coupe-bande à phase nulle avec une réponse " "en amplitude de Butterworth." #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:29 msgctxt "FilterButterworthBandStopConfig|" msgid "Input Vector:" msgstr "Vecteur d'entrée :" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:58 msgctxt "FilterButterworthBandStopConfig|" msgid "Filter Order:" msgstr "Ordre du filtre :" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:87 msgctxt "FilterButterworthBandStopConfig|" msgid "Central Frequency / Sample Rate:" msgstr "Fréquence centrale / taux d'échantillonnage :" #: ../src/plugins/filters/butterworth_bandstop/filterbutterworthbandstopconfig.ui:116 msgctxt "FilterButterworthBandStopConfig|" msgid "Band width:" msgstr "Largeur de bande :" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:143 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "%1 High Pass" msgstr "%1 filtré passe-haut" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:202 #, qt-format msgctxt "FilterButterworthHighPassSource|" msgid "Filtered %1" msgstr "%1 filtré" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:263 msgctxt "ButterworthHighPassPlugin|" msgid "High Pass Filter" msgstr "Filtre passe-haut" #: ../src/plugins/filters/butterworth_highpass/butterworth_highpass.cpp:264 msgctxt "ButterworthHighPassPlugin|" msgid "" "Filters a vector with a zero phase high pass filter with a butterworth " "amplitude response." msgstr "" "Filtre un vecteur avec un filtre passe-haut à phase nulle avec une réponse " "en amplitude de Butterworth." #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:29 msgctxt "FilterButterworthHighPassConfig|" msgid "Input Vector:" msgstr "Vecteur d'entrée :" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:58 msgctxt "FilterButterworthHighPassConfig|" msgid "Filter Order:" msgstr "Ordre du filtre :" #: ../src/plugins/filters/butterworth_highpass/filterbutterworthhighpassconfig.ui:80 msgctxt "FilterButterworthHighPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Fréquence de coupure / taux d'échantillonnage :" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:144 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "%1 Low Pass" msgstr "%1 filtré passe-bas" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:192 #, qt-format msgctxt "FilterButterworthLowPassSource|" msgid "Filtered %1" msgstr "%1 filtré" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:252 msgctxt "ButterworthLowPassPlugin|" msgid "Low Pass Filter" msgstr "Filtre passe-bas" #: ../src/plugins/filters/butterworth_lowpass/butterworth_lowpass.cpp:253 msgctxt "ButterworthLowPassPlugin|" msgid "" "Filters a vector with a zero phase low pass filter with a butterworth " "amplitude response." msgstr "" "Filtre un vecteur avec un filtre passe-bas à phase nulle avec une réponse en " "amplitude de Butterworth." #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:29 msgctxt "FilterButterworthLowPassConfig|" msgid "Input Vector:" msgstr "Vecteur d'entrée :" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:58 msgctxt "FilterButterworthLowPassConfig|" msgid "Filter Order:" msgstr "Ordre du filtre :" #: ../src/plugins/filters/butterworth_lowpass/filterbutterworthlowpassconfig.ui:80 msgctxt "FilterButterworthLowPassConfig|" msgid "Cutoff Frequency / Sample Rate:" msgstr "Fréquence de coupure / taux d'échantillonnage :" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:118 #, qt-format msgctxt "CumulativeAverageSource|" msgid "%1 Cumulative Average" msgstr "Moyenne cumulée de %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:120 msgctxt "CumulativeAverageSource|" msgid "Cumulative Average" msgstr "Moyenne cumulée" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:127 #, qt-format msgctxt "CumulativeAverageSource|" msgid "Cumulative Average: %1\n" msgstr "Moyenne cumulée : %1\n" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:129 #, qt-format msgctxt "CumulativeAverageSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:212 msgctxt "CumulativeAveragePlugin|" msgid "Cumulative Average" msgstr "Moyenne cumulée" #: ../src/plugins/filters/cumulativeaverage/cumulativeaverage.cpp:213 msgctxt "CumulativeAveragePlugin|" msgid "Computes the cumulative average of the input vector." msgstr "Calcule la moyenne cumulée du vecteur d'entrée." #: ../src/plugins/filters/cumulativeaverage/cumulativeaverageconfig.ui:39 msgctxt "CumulativeAverageConfig|" msgid "Y: " msgstr "Y : " #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:129 #, qt-format msgctxt "CumulativeSumSource|" msgid "%1 Integral" msgstr "Intégrale de %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:131 msgctxt "CumulativeSumSource|" msgid "Integral" msgstr "Intégrale" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:138 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "Integral: %1\n" " dX: %2\n" msgstr "" "Intégrale : %1\n" " dX : %2\n" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:140 #, qt-format msgctxt "CumulativeSumSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:229 msgctxt "CumulativeSumPlugin|" msgid "Cumulative Sum" msgstr "Somme cumulée" #: ../src/plugins/filters/cumulativesum/cumulativesum.cpp:230 msgctxt "CumulativeSumPlugin|" msgid "Computes the cumulative sum (integral) of the input vector." msgstr "Calcule la somme cumulée du vecteur d'entrée." #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:39 msgctxt "CumulativeSumConfig|" msgid "Step (dX): " msgstr "Pas (dX) : " #: ../src/plugins/filters/cumulativesum/cumulativesumconfig.ui:58 msgctxt "CumulativeSumConfig|" msgid "Y: " msgstr "Y : " #: ../src/plugins/filters/despike/filterdespike.cpp:142 #, qt-format msgctxt "" "FilterDespikeSource|arg 1 is the name of the vector which has been despiked" msgid "%1 Despiked" msgstr "%1 pics supprimés" #: ../src/plugins/filters/despike/filterdespike.cpp:144 msgctxt "FilterDespikeSource|" msgid "Despike" msgstr "Suppression de pic" #: ../src/plugins/filters/despike/filterdespike.cpp:152 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "Despike Filter: %1\n" " Spacing: %2\n" " NSigma: %3" msgstr "" "Filtre de suppression de pic : %1\n" " Espacement : %2\n" " NSigma: %3" #: ../src/plugins/filters/despike/filterdespike.cpp:154 #, qt-format msgctxt "FilterDespikeSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/filters/despike/filterdespike.cpp:287 #, qt-format msgctxt "FilterDespikeSource|" msgid "Despiked %1" msgstr "%1 pics supprimés" #: ../src/plugins/filters/despike/filterdespike.cpp:348 msgctxt "FilterDespikePlugin|" msgid "Despike Filter" msgstr "Filtre de suppression de pic" #: ../src/plugins/filters/despike/filterdespike.cpp:349 msgctxt "FilterDespikePlugin|" msgid "Finds and removes spikes using a 3 point difference." msgstr "Trouve et supprime les pics en utilisant une différence à 3 points." #: ../src/plugins/filters/despike/filterdespikeconfig.ui:29 msgctxt "FilterDespikeConfig|" msgid "Input Vector:" msgstr "Vecteur d'entrée :" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:58 msgctxt "FilterDespikeConfig|" msgid "Spacing:" msgstr "Espacement :" #: ../src/plugins/filters/despike/filterdespikeconfig.ui:80 msgctxt "FilterDespikeConfig|" msgid "NSigma:" msgstr "NSigma :" #: ../src/plugins/filters/differentiation/differentiation.cpp:130 #, qt-format msgctxt "DifferentiationSource|" msgid "%1 Derivative" msgstr "Dérivée de %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:132 msgctxt "DifferentiationSource|" msgid "Derivative" msgstr "Dérivée" #: ../src/plugins/filters/differentiation/differentiation.cpp:139 #, qt-format msgctxt "DifferentiationSource|" msgid "" "Derivative: %1\n" " dX: %2\n" msgstr "" "Derivée : %1\n" " dX : %2\n" #: ../src/plugins/filters/differentiation/differentiation.cpp:141 #, qt-format msgctxt "DifferentiationSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/filters/differentiation/differentiation.cpp:165 msgctxt "DifferentiationSource|" msgid "Error: Input Scalar Step must be not be 0." msgstr "" #: ../src/plugins/filters/differentiation/differentiation.cpp:229 msgctxt "DifferentiationPlugin|" msgid "Fixed Step Differentiation" msgstr "Différentiation à pas fixe" #: ../src/plugins/filters/differentiation/differentiation.cpp:230 msgctxt "DifferentiationPlugin|" msgid "Computes the discrete derivative of an input vector" msgstr "Calcule la dérivée discrète d'un vecteur d'entrée" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:29 msgctxt "DifferentiationConfig|" msgid "Y:" msgstr "Y :" #: ../src/plugins/filters/differentiation/differentiationconfig.ui:58 msgctxt "DifferentiationConfig|" msgid "Step (dX):" msgstr "Pas (dX) :" #: ../src/plugins/filters/unwind/filterunwind.cpp:154 #, qt-format msgctxt "FilterUnwindSource|" msgid "%1 Unwind" msgstr "Angle de %1 déroulé" #: ../src/plugins/filters/unwind/filterunwind.cpp:156 msgctxt "FilterUnwindSource|" msgid "Unwind" msgstr "Déroulage d'angle" #: ../src/plugins/filters/unwind/filterunwind.cpp:164 #, qt-format msgctxt "FilterUnwindSource|%2 - %3 specifies a numerical range" msgid "" "Unwind Filter: %1\n" " %2 - %3\n" " Step: %4 %" msgstr "" "Filtre de déroulage d'angle : %1\n" " %2 - %3\n" " Pas : %4 %" #: ../src/plugins/filters/unwind/filterunwind.cpp:166 #, qt-format msgctxt "FilterUnwindSource|" msgid "" "\n" "Input: %1" msgstr "" "\n" "Entrée : %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:239 #, qt-format msgctxt "FilterUnwindSource|" msgid "Unwind %1" msgstr "Angle de déroulé %1" #: ../src/plugins/filters/unwind/filterunwind.cpp:306 msgctxt "FilterUnwindPlugin|" msgid "Unwind Filter" msgstr "Filtre de déroulage d'angle" #: ../src/plugins/filters/unwind/filterunwind.cpp:307 msgctxt "FilterUnwindPlugin|" msgid "Unwinds data that have wrapped." msgstr "Déplie des données qui se sont repliées" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:29 msgctxt "FilterUnwindConfig|" msgid "Input Vector:" msgstr "Vecteur d'entrée :" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:58 msgctxt "FilterUnwindConfig|the minimum value" msgid "Minimum:" msgstr "Minimum :" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:80 msgctxt "FilterUnwindConfig|the maximum value" msgid "Maximum:" msgstr "Maximum :" #: ../src/plugins/filters/unwind/filterunwindconfig.ui:102 msgctxt "FilterUnwindConfig|" msgid "Max Step (%):" msgstr "Pas max (%) :" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:143 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "%1 Unweighted Exponential" msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:217 #, qt-format msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit to %1" msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:220 msgctxt "FitExponentialUnweightedSource|" msgid "Exponential Fit Residuals" msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:304 msgctxt "FitExponentialUnweightedPlugin|" msgid "Exponential Fit" msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweighted.cpp:305 msgctxt "FitExponentialUnweightedPlugin|" msgid "Generates an exponential fit for a set of data." msgstr "" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:31 msgctxt "FitExponential_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/exponential_unweighted/fitexponential_unweightedconfig.ui:61 msgctxt "FitExponential_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:156 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "%1 Weighted Exponential" msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:232 #, qt-format msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit to %1" msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:235 msgctxt "FitExponentialWeightedSource|" msgid "Exponential Fit Residuals" msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:326 msgctxt "FitExponentialWeightedPlugin|" msgid "Exponential Weighted Fit" msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weighted.cpp:327 msgctxt "FitExponentialWeightedPlugin|" msgid "Generates an exponential weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:23 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:52 msgctxt "FitExponential_WeightedConfig|The X axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/exponential_weighted/fitexponential_weightedconfig.ui:81 msgctxt "FitExponential_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Poids :" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:143 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "%1 Unweighted Gaussian" msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:262 #, qt-format msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit to %1" msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:265 msgctxt "FitGaussianUnweightedSource|" msgid "Gaussian Fit Residuals" msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:352 msgctxt "FitGaussianUnweightedPlugin|" msgid "Gaussian Fit" msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweighted.cpp:353 msgctxt "FitGaussianUnweightedPlugin|" msgid "Generates a gaussian fit for a set of data." msgstr "" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:31 msgctxt "FitGaussian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/gaussian_unweighted/fitgaussian_unweightedconfig.ui:61 msgctxt "FitGaussian_UnweightedConfig|The Y axis of a plo" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:156 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "%1 Weighted Gaussian" msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:237 #, qt-format msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit to %1" msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:240 msgctxt "FitGaussianWeightedSource|" msgid "Gaussian Fit Residuals" msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:331 msgctxt "FitGaussianWeightedPlugin|" msgid "Gaussian Weighted Fit" msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weighted.cpp:332 msgctxt "FitGaussianWeightedPlugin|" msgid "Generates a gaussian weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:29 msgctxt "FitGaussian_WeightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:58 msgctxt "FitGaussian_WeightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/gaussian_weighted/fitgaussian_weightedconfig.ui:87 msgctxt "FitGaussian_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Poids :" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:141 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "%1 Unweighted Gradient" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:178 #, qt-format msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit to %1" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:181 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Residuals" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:184 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Lower Limit" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:187 msgctxt "FitGradientUnweightedSource|" msgid "Gradient Fit Upper Limit" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:295 msgctxt "FitGradientUnweightedPlugin|" msgid "Gradient Fit" msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweighted.cpp:296 msgctxt "FitGradientUnweightedPlugin|" msgid "Generates a gradient fit for a set of data." msgstr "" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:31 msgctxt "FitGradient_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/gradient_unweighted/fitgradient_unweightedconfig.ui:61 msgctxt "FitGradient_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:156 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "%1 Weighted Gradient" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:194 #, qt-format msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit to %1" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:197 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Residuals" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:200 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Lower Limit" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:203 msgctxt "FitGradientWeightedSource|" msgid "Gradient Fit Upper Limit" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:318 msgctxt "FitGradientWeightedPlugin|" msgid "Gradient Weighted Fit" msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weighted.cpp:319 msgctxt "FitGradientWeightedPlugin|" msgid "Generates a gradient weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:29 msgctxt "FitGradient_WeightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:58 msgctxt "FitGradient_WeightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/gradient_weighted/fitgradient_weightedconfig.ui:87 msgctxt "FitGradient_WeightedConfig|statistical weights" msgid "Weights:" msgstr "Poids :" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:182 msgctxt "FitKneeFrequencySource|" msgid "Fit Knee Frequency Plugin" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:216 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector Sizes do not match" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:220 #, fuzzy #| msgid "Input Vector X" msgctxt "FitKneeFrequencySource|" msgid "Error: Input Vector X invalid" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:270 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Frequencies are Invalid\n" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:298 msgctxt "FitKneeFrequencySource|" msgid "Error: Input Data Invalid.\n" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:436 msgctxt "FitKneeFrequencyPlugin|" msgid "Knee Frequency Fit" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequency.cpp:437 msgctxt "FitKneeFrequencyPlugin|" msgid "Generates a knee frequency fit for a set of data." msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:31 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - X" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:61 msgctxt "FitKneeFrequencyConfig|" msgid "Input Vector - Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:91 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Max. 1/f^a Freq" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:114 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - Min. White Noise Freq" msgstr "" #: ../src/plugins/fits/kneefrequency/fitkneefrequencyconfig.ui:137 msgctxt "FitKneeFrequencyConfig|" msgid "Input Scalar - White Noise C" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:141 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "%1 Unweighted Linear" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:190 #, qt-format msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit to %1" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:193 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Residuals" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:196 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Lower Limit" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:199 msgctxt "FitLinearUnweightedSource|" msgid "Linear Fit Upper Limit" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:301 msgctxt "FitLinearUnweightedPlugin|" msgid "Linear Fit" msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweighted.cpp:302 msgctxt "FitLinearUnweightedPlugin|" msgid "Generates a linear fit for a set of data." msgstr "" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:31 msgctxt "FitLinear_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/linear_unweighted/fitlinear_unweightedconfig.ui:64 msgctxt "FitLinear_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:156 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "%1 Weighted Linear" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:194 #, qt-format msgctxt "FitLinearWeightedSource|" msgid "Linear Fit to %1" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:197 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Residuals" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:200 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Lower Limit" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:203 msgctxt "FitLinearWeightedSource|" msgid "Linear Fit Upper Limit" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:324 msgctxt "FitLinearWeightedPlugin|" msgid "Linear Weighted Fit" msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weighted.cpp:325 msgctxt "FitLinearWeightedPlugin|" msgid "Generates a linear weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:29 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - X" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:58 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/fits/linear_weighted/fitlinear_weightedconfig.ui:87 msgctxt "FitLinear_WeightedConfig|" msgid "Input Vector - Weights" msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:143 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "%1 Lorentzian" msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:263 #, qt-format msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit to %1" msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:266 msgctxt "FitLorentzianUnweightedSource|" msgid "Lorentzian Fit Residuals" msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:353 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Lorentzian Fit" msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweighted.cpp:354 msgctxt "FitLorentzianUnweightedPlugin|" msgid "Generates a lorentzian fit for a set of data." msgstr "" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:31 msgctxt "FitLorentzian_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/lorentzian_unweighted/fitlorentzian_unweightedconfig.ui:61 msgctxt "FitLorentzian_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:156 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "%1 Weighted Lorentzian" msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:236 #, qt-format msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit to %1" msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:239 msgctxt "FitLorentzianWeightedSource|" msgid "Lorentzian Fit Residuals" msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:330 msgctxt "FitLorentzianWeightedPlugin|" msgid "Lorentzian Weighted Fit" msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weighted.cpp:331 msgctxt "FitLorentzianWeightedPlugin|" msgid "Generates a lorentzian weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:30 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - X" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:60 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/fits/lorentzian_weighted/fitlorentzian_weightedconfig.ui:90 msgctxt "FitLorentzian_WeightedConfig|" msgid "Input Vector - Weights" msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:155 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "%1 Polynomial" msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:198 #, qt-format msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit to %1" msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:201 msgctxt "FitPolynomialUnweightedSource|" msgid "Polynomial Fit Residuals" msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:316 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Polynomial Fit" msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweighted.cpp:317 msgctxt "FitPolynomialUnweightedPlugin|" msgid "Generates a polynomial fit for a set of data." msgstr "" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:31 msgctxt "FitPolynomial_UnweightedConfig|The X (horizontal) axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:61 msgctxt "FitPolynomial_UnweightedConfig|The Y (vertical) axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/polynomial_unweighted/fitpolynomial_unweightedconfig.ui:91 msgctxt "FitPolynomial_UnweightedConfig|the order of a polynomial" msgid "Order:" msgstr "Ordre :" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:169 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "%1 Weighted Polynomial" msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:214 #, qt-format msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit to %1" msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:217 msgctxt "FitPolynomialWeightedSource|" msgid "Polynomial Fit Residuals" msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:336 msgctxt "FitPolynomialWeightedPlugin|" msgid "Polynomial Weighted Fit" msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weighted.cpp:337 msgctxt "FitPolynomialWeightedPlugin|" msgid "Generates a polynomial weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:30 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - X" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:73 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:116 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Vector - Weights" msgstr "" #: ../src/plugins/fits/polynomial_weighted/fitpolynomial_weightedconfig.ui:159 msgctxt "FitPolynomial_WeightedConfig|" msgid "Input Scalar - Order" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:170 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "%1 Sinusoid" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:222 #, qt-format msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit to %1" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:225 msgctxt "FitSinusoidUnweightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:333 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Sinusoid Fit" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweighted.cpp:334 msgctxt "FitSinusoidUnweightedPlugin|" msgid "Generates a sinusoid fit for a set of data." msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:29 msgctxt "FitSinusoid_UnweightedConfig|The X axis of a plot" msgid "X:" msgstr "X :" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:58 msgctxt "FitSinusoid_UnweightedConfig|The Y axis of a plot" msgid "Y:" msgstr "Y :" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:87 msgctxt "FitSinusoid_UnweightedConfig|" msgid "Harmonics:" msgstr "" #: ../src/plugins/fits/sinusoid_unweighted/fitsinusoid_unweightedconfig.ui:106 msgctxt "FitSinusoid_UnweightedConfig|the period of a wave." msgid "Period:" msgstr "Période :" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:184 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "%1 Weighted Sinusoid" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:239 #, qt-format msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit to %1" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:242 msgctxt "FitSinusoidWeightedSource|" msgid "Sinusoidal Fit Residuals" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:356 msgctxt "FitSinusoidWeightedPlugin|" msgid "Sinusoid Weighted Fit" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weighted.cpp:357 msgctxt "FitSinusoidWeightedPlugin|" msgid "Generates a sinusoid weighted fit for a set of data." msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:30 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - X" msgstr "Vecteur d'entrée X" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:73 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Y" msgstr "Vecteur d'entrée Y" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:116 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Vector - Weights" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:159 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Harmonics" msgstr "" #: ../src/plugins/fits/sinusoid_weighted/fitsinusoid_weightedconfig.ui:195 msgctxt "FitSinusoid_WeightedConfig|" msgid "Input Scalar - Period" msgstr "" #: ../src/plugins/sampleplugin/samplepluginconfig.ui:30 msgctxt "SamplePluginConfig|" msgid "Sample Input Vector" msgstr "" #: ../src/widgets/cclineedit.cpp:701 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Vector" msgstr "Insérer un nouveau &vecteur" #: ../src/widgets/cclineedit.cpp:705 msgctxt "Kst::SVCCLineEdit|" msgid "Insert New &Scalar" msgstr "Insérer un nouveau &scalaire" #: ../src/widgets/cclineedit.cpp:732 msgctxt "Kst::SVCCLineEdit|" msgid "Edit" msgstr "Modifier" #: ../src/widgets/cclineedit.cpp:759 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &Scalar" msgstr "Insérer un nouveau &scalaire" #: ../src/widgets/cclineedit.cpp:763 msgctxt "Kst::SVCCTextEdit|" msgid "Insert New &String" msgstr "Insérer une nouvelle &chaîne" #: ../src/widgets/cclineedit.cpp:789 msgctxt "Kst::SVCCTextEdit|" msgid "Edit" msgstr "Modifier" #: ../src/widgets/colorpalette.ui:29 msgctxt "ColorPalette|" msgid "C&olor palette:" msgstr "Palette de c&ouleur :" #: ../src/widgets/curveappearance.ui:38 msgctxt "CurveAppearance|" msgid "Appearance" msgstr "Apparence" #: ../src/widgets/curveappearance.ui:50 msgctxt "CurveAppearance|" msgid "&Weight:" msgstr "L&argeur :" #: ../src/widgets/curveappearance.ui:69 ../src/widgets/curveappearance.ui:261 msgctxt "CurveAppearance|" msgid "Point Type" msgstr "Type de point" #: ../src/widgets/curveappearance.ui:72 ../src/widgets/curveappearance.ui:264 msgctxt "CurveAppearance|" msgid "" "If \"Show Points\" is checked, the selected point type will be drawn at each " "data point." msgstr "" "Permet de définir le symbole utilisé pour représenter les points de données " "lorsrque ceux-ci sont affichés." #: ../src/widgets/curveappearance.ui:79 msgctxt "CurveAppearance|" msgid "Line Type" msgstr "Type de ligne" #: ../src/widgets/curveappearance.ui:82 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line style." msgstr "Définit le style de ligne utilisé lorsque les lignes sont affichées." #: ../src/widgets/curveappearance.ui:129 ../src/widgets/curveappearance.ui:177 msgctxt "CurveAppearance|" msgid "Check this to cause lines to be drawn between data points." msgstr "Active le tracé de lignes entre les points de données." #: ../src/widgets/curveappearance.ui:132 msgctxt "CurveAppearance|" msgid "&Lines" msgstr "&Lignes" #: ../src/widgets/curveappearance.ui:148 msgctxt "CurveAppearance|" msgid "Check this to cause the selected points to be drawn at each data point." msgstr "Active le tracé d'un symbole sur chaque point de données." #: ../src/widgets/curveappearance.ui:151 msgctxt "CurveAppearance|" msgid "Po&ints" msgstr "Po&ints" #: ../src/widgets/curveappearance.ui:164 #, fuzzy msgctxt "CurveAppearance|" msgid "&Head" msgstr "&Bout de ligne" #: ../src/widgets/curveappearance.ui:180 msgctxt "CurveAppearance|" msgid "&Bargraph" msgstr "Graphique en ba&rres" #: ../src/widgets/curveappearance.ui:216 msgctxt "CurveAppearance|" msgid "Line Width" msgstr "Largeur de ligne" #: ../src/widgets/curveappearance.ui:219 msgctxt "CurveAppearance|" msgid "If \"Show Lines\" is checked, the selected line width." msgstr "Largeur de trait lorsque les lignes sont affichées." #: ../src/widgets/curveappearance.ui:229 msgctxt "CurveAppearance|" msgid "&Size:" msgstr "&Taille :" #: ../src/widgets/curveappearance.ui:242 msgctxt "CurveAppearance|" msgid "Point &Density:" msgstr "&Densité de points :" #: ../src/widgets/curveappearance.ui:268 msgctxt "CurveAppearance|show every point" msgid "All" msgstr "Tous" #: ../src/widgets/curveappearance.ui:273 msgctxt "CurveAppearance|high density of points" msgid "High" msgstr "Élevée" #: ../src/widgets/curveappearance.ui:278 msgctxt "CurveAppearance|medium density of points" msgid "Medium" msgstr "Moyenne" #: ../src/widgets/curveappearance.ui:283 msgctxt "CurveAppearance|low density of points" msgid "Low" msgstr "Faible" #: ../src/widgets/curveplacement.ui:23 msgctxt "CurvePlacement|" msgid "Placement" msgstr "Placement" #: ../src/widgets/curveplacement.ui:31 msgctxt "CurvePlacement|" msgid "Scale fonts" msgstr "Adapter la &taille des polices" #: ../src/widgets/curveplacement.ui:47 msgctxt "CurvePlacement|" msgid "Place in &new plot" msgstr "&Nouveau graphique" #: ../src/widgets/curveplacement.ui:63 msgctxt "CurvePlacement|" msgid "In ne&w tab" msgstr "Dans un nouvel &onglet" #: ../src/widgets/curveplacement.ui:79 msgctxt "CurvePlacement|" msgid "The name of the data file which will be read for this vector." msgstr "Nom du graphique dans lequel placer la courbe." #: ../src/widgets/curveplacement.ui:110 msgctxt "CurvePlacement|" msgid "Place in &existing plot " msgstr "Graphique &existant" #: ../src/widgets/curveplacement.ui:123 msgctxt "CurvePlacement|" msgid "Do not pl&ace in any plot" msgstr "Ne pas &afficher" #: ../src/widgets/curveplacement.ui:177 msgctxt "CurvePlacement|" msgid "Automati&c layout" msgstr "Mise en page automati&que" #: ../src/widgets/curveplacement.ui:195 msgctxt "CurvePlacement|" msgid "Custom &grid" msgstr "Grille &personnalisée" #: ../src/widgets/curveplacement.ui:224 msgctxt "CurvePlacement|" msgid "Colu&mns" msgstr "colo&nne(s)" #: ../src/widgets/curveplacement.ui:236 msgctxt "CurvePlacement|" msgid "&Protect existing layout" msgstr "&Protéger la mise en page existante" #: ../src/widgets/curveselector.cpp:86 ../src/widgets/curveselector.cpp:91 msgctxt "Kst::CurveSelector|" msgid "" msgstr "" #: ../src/widgets/curveselector.ui:13 msgctxt "CurveSelector|" msgid "Select a curve to utilize." msgstr "Sélectionner une courbe à utiliser." #: ../src/widgets/datarange.cpp:262 ../src/widgets/datarange.cpp:263 msgctxt "Kst::DataRange|" msgid "frames" msgstr "sections" #: ../src/widgets/datarange.ui:29 msgctxt "DataRange|" msgid "Data Range" msgstr "Plages de données" #: ../src/widgets/datarange.ui:44 ../src/widgets/datarange.ui:181 msgctxt "DataRange|" msgid "" "Select this to average the skipped frames together. Provides simple low " "pass filtering." msgstr "" "Sélectionner cette option pour moyenner les sections non affichées. Fait un " "filtre passe-bas." #: ../src/widgets/datarange.ui:47 msgctxt "DataRange|" msgid "Boxcar &filter first" msgstr "&Moyenner par paquets" #: ../src/widgets/datarange.ui:60 msgctxt "DataRange|" msgid "Save memory by sparsely sampling the data" msgstr "Economiser la mémoire en ne lisant pas toutes les données" #: ../src/widgets/datarange.ui:63 msgctxt "DataRange|" msgid "" "Select this to skip frames, rather than reading all of the data. This is " "useful for reading very long but slowly changing data files." msgstr "" "Sélectionner cette option pour sous-échantillonner les données. Utile pour " "lire de grosses quantités variant lentement." #: ../src/widgets/datarange.ui:66 msgctxt "DataRange|" msgid "Read &1 sample per:" msgstr "Lire &1 échantillon par :" #: ../src/widgets/datarange.ui:79 msgctxt "DataRange|" msgid "Select this to read all of the data up to the end of the file. " msgstr "" "Sélectionner cette option pour lire les données jusqu'à la fin du fichier." #: ../src/widgets/datarange.ui:82 msgctxt "DataRange|" msgid "Read to &end" msgstr "Lire jusqu'à la &fin" #: ../src/widgets/datarange.ui:98 ../src/widgets/datarange.ui:114 msgctxt "DataRange|" msgid "or" msgstr "ou" #: ../src/widgets/datarange.ui:124 msgctxt "DataRange|" msgid "" "Select this to read data from the end of the file. This is useful for " "scrolling displays when the file is being appended by another application." msgstr "" "Sélectionner cette option pour lire les données depuis la fin du fichier. " "Utile pour réaliser des courbes défilantes lorsque des données sont ajoutées " "à la fin du fichier." #: ../src/widgets/datarange.ui:127 msgctxt "DataRange|" msgid "Co&unt from end" msgstr "C&ompter depuis la fin" #: ../src/widgets/datarange.ui:137 msgctxt "DataRange|" msgid "Number of frames to skip, if \"Read 1 sample per\" is selected." msgstr "" "Nombre d'échantillons à sauter lorsque l'option \"Lire 1 échantillon par\" " "est cochée." #: ../src/widgets/datarange.ui:140 msgctxt "DataRange|" msgid " frame(s)" msgstr " section(s)" #: ../src/widgets/datarange.ui:159 msgctxt "DataRange|" msgid "&Start:" msgstr "&Début :" #: ../src/widgets/datarange.ui:184 msgctxt "DataRange|" msgid "&Range:" msgstr "&Nombre :" #: ../src/widgets/datarange.ui:200 ../src/widgets/datarange.ui:216 msgctxt "DataRange|" msgid "" "Input a number (starting from 0 for the first value), or the format " "[[[[YYYY:]MM:]DD:]HH:]MM[.SS] for dates." msgstr "" "Entrer un nombre (0 pour la première valeur), ou le format [[[[YYYY:]MM:]DD:]" "MM[.SS] pour les dates." #: ../src/widgets/datarange.ui:203 msgctxt "DataRange|" msgid "" "The index of the first data read. For ASCII files, this is the data row " "number in the file. For frame based files, this is the first frame." msgstr "" "Indice du premier échantillon lu. Pour les fichiers SCII, ce nombre " "correspond à la ligne de données dans le fichier. For des fichiers en " "sections, il s'agit de la première section." #: ../src/widgets/datarange.ui:206 msgctxt "DataRange|" msgid "0" msgstr "0" #: ../src/widgets/datarange.ui:219 msgctxt "DataRange|" msgid "" "The amount of data to read into the vector. For ASCII files, this is the " "number of data rows. For frame files there may be more than one sample per " "frame. Dates are input in the format [[[[YYYY:]MM:]DD:]HH:]MM[.SS]." msgstr "" "Nombre d'échantillons à lire. Pour les fichiers ASCII, correspond à un " "nombre de lignes. Pour des fichiers basés sur des sections, il est possible " "d'avoir plusieurs échantillons par section. Format de date : [[[[YYYY:]MM:]" "DD:]MM[.SS]." #: ../src/widgets/datasourceselectordialog.cpp:81 #, qt-format msgctxt "Kst::DataSourceSelectorDialog|" msgid "" "%1\n" "File not found.\n" "Please verify the correct file name was given." msgstr "" "%1\n" "Impossible de trouver le fichier.\n" "Veuillez vérifier que le bon nom de fichier a été indiqué." #: ../src/widgets/fftoptions.ui:29 msgctxt "FFTOptions|" msgid "FFT Options" msgstr "Options FFT" #: ../src/widgets/fftoptions.ui:41 msgctxt "FFTOptions|Use the application default option" msgid "Default" msgstr "Par défaut" #: ../src/widgets/fftoptions.ui:46 msgctxt "FFTOptions|" msgid "Bartlett" msgstr "Bartlett" #: ../src/widgets/fftoptions.ui:51 msgctxt "FFTOptions|" msgid "Blackman" msgstr "Blackman" #: ../src/widgets/fftoptions.ui:56 msgctxt "FFTOptions|" msgid "Connes" msgstr "Connes" #: ../src/widgets/fftoptions.ui:61 msgctxt "FFTOptions|" msgid "cosine" msgstr "cosinus" #: ../src/widgets/fftoptions.ui:66 msgctxt "FFTOptions|" msgid "Gaussian (Custom Sigma)" msgstr "Gaussienne (Sigma réglable)" #: ../src/widgets/fftoptions.ui:71 msgctxt "FFTOptions|" msgid "Hamming" msgstr "Hamming" #: ../src/widgets/fftoptions.ui:76 msgctxt "FFTOptions|" msgid "Hann" msgstr "Hann" #: ../src/widgets/fftoptions.ui:81 msgctxt "FFTOptions|" msgid "Welch" msgstr "Welch" #: ../src/widgets/fftoptions.ui:98 msgctxt "FFTOptions|" msgid "S&igma:" msgstr "S&igma :" #: ../src/widgets/fftoptions.ui:127 msgctxt "FFTOptions|" msgid "" "Select from this pulldown the source vector for the Curve's y axis error " "bars. If \"\" is selected, there will be no y axis error bars drawn. " "Create new vectors with the \"Vectors\" tab." msgstr "Sélectionner la fonction de fenêtrage dans le menu déroulant." #: ../src/widgets/fftoptions.ui:130 msgctxt "FFTOptions|" msgid "Apodi&ze" msgstr "&Fenêtrage" #: ../src/widgets/fftoptions.ui:146 msgctxt "FFTOptions|" msgid "Fun&ction:" msgstr " - fon&ction :" #: ../src/widgets/fftoptions.ui:159 msgctxt "FFTOptions|" msgid "Remo&ve mean" msgstr "S&upprimer la moyenne " #: ../src/widgets/fftoptions.ui:182 msgctxt "FFTOptions|" msgid "FFT &length: 2^" msgstr "&Longueur de FFT : 2^" #: ../src/widgets/fftoptions.ui:198 msgctxt "FFTOptions|" msgid "" "Sets the length of the FFTs in generating the power spectrum. 2^10 = 1024, " "etc. The larger the number, the larger the noise and resolution." msgstr "" "Definit la longueur de la FFT utilisée dans le calcul du spectre. 2^10 = " "1024, etc. Augmenter ce nombre améliore la résolution au détriment du bruit." #: ../src/widgets/fftoptions.ui:214 msgctxt "FFTOptions|" msgid "Interleave&d average" msgstr "Moyenne &glissante" #: ../src/widgets/fftoptions.ui:224 msgctxt "FFTOptions|" msgid "Interpolate over &holes" msgstr "Interpoler les données &manquantes" #: ../src/widgets/fftoptions.ui:247 msgctxt "FFTOptions|" msgid "Sa&mple rate:" msgstr "Taux d'écha&ntillonnage :" #: ../src/widgets/fftoptions.ui:263 msgctxt "FFTOptions|" msgid "" "The sample rate at which the measurements were acquired, for proper " "normalization." msgstr "" "Indiquer ici la fréquence d'échantillonnage des données pour garantir une " "normalisation correcte." #: ../src/widgets/fftoptions.ui:279 msgctxt "FFTOptions|" msgid "Apply new data sample specifications to selected vectors." msgstr "Définir l'unité de la grandeur mesurée par les vecteurs." #: ../src/widgets/fftoptions.ui:282 msgctxt "FFTOptions|" msgid "Vector units:" msgstr "&Unité des vecteurs :" #: ../src/widgets/fftoptions.ui:298 msgctxt "FFTOptions|" msgid "The units of the Data Vector - for automatic labels." msgstr "" "Unité des vecteurs - utile pour la légende et les libellés automatiques." #: ../src/widgets/fftoptions.ui:301 msgctxt "FFTOptions|Abbreviation for Volts" msgid "V" msgstr "V" #: ../src/widgets/fftoptions.ui:314 msgctxt "FFTOptions|" msgid "Rate units:" msgstr "Unité de l'&échantillonnage :" #: ../src/widgets/fftoptions.ui:330 msgctxt "FFTOptions|" msgid "The units for the sample rate. Used for automatic labels." msgstr "Unité du taux d'échantillonage - utilisé dans le libellé automatique." #: ../src/widgets/fftoptions.ui:333 msgctxt "FFTOptions|Abbreviation for Hertz (unit)" msgid "Hz" msgstr "Hz" #: ../src/widgets/fftoptions.ui:353 msgctxt "FFTOptions|" msgid "Ou&tput:" msgstr "Sor&tie :" #: ../src/widgets/fftoptions.ui:367 msgctxt "FFTOptions|" msgid "Amplitude Spectral Density (V/Hz^1/2)" msgstr "Densité spectrale d'amplitude (V/Hz^1/2)" #: ../src/widgets/fftoptions.ui:372 msgctxt "FFTOptions|" msgid "Power Spectral Density (V^2/Hz)" msgstr "Densité spectrale de puissance (V^2/Hz)" #: ../src/widgets/fftoptions.ui:377 msgctxt "FFTOptions|" msgid "Amplitude Spectrum (V)" msgstr "Spectre d'amplitude (V)" #: ../src/widgets/fftoptions.ui:382 msgctxt "FFTOptions|" msgid "Power Spectrum (V^2)" msgstr "Spectre de puissance (V^2)" #: ../src/widgets/filerequester.cpp:106 msgctxt "Kst::FileRequester|" msgid "Open File" msgstr "Ouvrir un fichier" #: ../src/widgets/filerequester.cpp:106 ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "All Files (*)" msgstr "Tous les fichiers (*)" #: ../src/widgets/filerequester.cpp:108 msgctxt "Kst::FileRequester|" msgid "Logfile Directory" msgstr "Dossier du fichier journal" #: ../src/widgets/filerequester.cpp:110 msgctxt "Kst::FileRequester|" msgid "Save File" msgstr "Enregistrer le fichier" #: ../src/widgets/labelbuilder.cpp:24 msgctxt "Kst::LabelBuilder|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La syntaxe pour les libellés est dérivée d'un sous-ensemble LaTeX. Les " "éléments pris en charge sont : \\[nom de lettre grecque] et \\[Nom " "de lettre grecque], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor" "{nom de couleur}{texte en couleur}, \\textbf{texte en gras}, " "\\textit{texte en italique}, \\t, \\sum, \\sqrt, " "\\underline{texte souligné}, \\overline{texte surligné}, x^y, x_y. Les scalaires, équations et éléments de vecteurs peuvent " "être intégrés. Scalaire : [V1/Mean]. Éléments de vecteurs : [V1" "[4]]. Équation : [=[V1/Mean]^2]. Un caractère [ peut être " "inséré par \\[." #: ../src/widgets/labelbuilder.cpp:37 msgctxt "Kst::LabelBuilder|" msgid "Label text. A subset of LaTeX is supported. Click 'Help' for help." msgstr "" "Texte du libellé. Un sous-ensemble de LaTeX permet de faire des libellés " "avancés. Cliquer sur \"Aide\" pour les détails." #: ../src/widgets/labelbuilder.cpp:59 msgctxt "Kst::LabelBuilder|" msgid "" "

Scalars & " "equations
Scalars and scalar equations can be displayed live " "in labels. When the scalar is updated, the label is updated. Scalar names " "are autocompleted. The format is:

Scalar: [scalarname], e.g. " "[GYRO1:Mean(X4)]

Vector Element:[vectorName" "[index]], e.g., [GYRO1 (V2)[4]]

Equation: [=equation], e.g. " "[=[GYRO1:Mean(X4)]/[GYRO1:Sigma (X4)]]" "

Supported LaTeX Subset
Labels in kst support " "a derivative subset of LaTeX. For example, to display the equation for the " "area of a circle, you could set the label to A=2\\pir^2. Unlike LaTeX, it " "is not necessary to enter math mode using '$'. Also, unlike LaTeX, " "variables are not automatically displayed in italic font. If desired, this " "must be done explicitly using \\textit{}. Supported sequences are:

Greek letters: \\name or " "\\Name. e.g.: \\alpha

Other symbols: \\approx,\\cdot," "\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Font effects: \\textcolor" "{colorname}{colored text}, " "\\textbf{bold text},\\textit{italicized text},\\underline{underlined text}," "\\overline{overlined text}.

Other:x^y,x_y, \\t,\\n, \\[

" msgstr "" "

Scalaires " "& équations
Les scalaires et équations peuvent être " "interprétés directement dans les libellés. Le texte est mis à jour " "automatiquement dès que le scalaire change de valeur. .L'édition est semi-" "automatique pour faciliter la saisie. Le format est le suivant :

Scalaire: [nom du scalaire], ex. [GYRO1:Mean (X4)]

Elément de vecteur :[nom de vecteur[indice]], ex. [GYRO1 (V2)[4]]

Equation : [=équation], ex. [=[GYRO1:Mean (X4)]/[GYRO1:" "Sigma (X4)]]

Sous-" "ensemble de LaTeX supportéLes libellés dans Kst " "supportent un dérivé de syntaxe LaTeX.
Par exemple, pour " "afficher l'équation donnant l'air d'un cercle vous pouvez utiliser le " "libellé A=2\\pir^2. Contrairement à LaTeX, il n'est pas nécessaire de " "passer en mode mathématique avec '$'. Par ailleurs, les variables ne sont " "pas affichées en italique par défaut. Si c'est ce que vous voulez, il faut " "le spécifier explicitement avec \\textit{}. Les séquences supportées sont :" "

Lettres grecques : \\nom " "ou \\Nom. ex. : \\alpha

Autres symboles : \\approx,\\cdot,\\ge,\\geq,\\inf," "\\int,\\le," "\\leq,\\ne,\\partial,\\prod,\\pm,\\sum,\\sqrt

Effets de police : " "\\textcolor{nom de couleur}{texte coloré}, \\textbf{texte en " "gras},\\textit{texte en italique}," "\\underline{texte souligné},\\overline{texte " "surligné}.

Autres : x^y,x_y, \\t,\\n, " "\\[

" #: ../src/widgets/labelbuilder.ui:40 msgctxt "LabelBuilder|" msgid "Supports LaTeX symbols, live strings & scalars, and embedded equations." msgstr "" "Supporte un sous-ensemble de LaTeX, les chaînes actualisées automatiquement " "et les équations." #: ../src/widgets/labelbuilder.ui:53 msgctxt "LabelBuilder|" msgid "&Label:" msgstr "&Libellé :" #: ../src/widgets/labelbuilder.ui:72 msgctxt "LabelBuilder|" msgid "Help" msgstr "Aide" #: ../src/widgets/labellineedit.cpp:21 msgctxt "Kst::LabelLineEdit|" msgid "" "The syntax for labels is a derivative of a subset of LaTeX. Supported " "syntax is: \\[greeklettername] and \\[Greeklettername], " "\\approx, \\cdot, \\ge, \\geq, \\inf ," "\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor{color name}{colored text}, \\textbf{bold text}, \\textit{italicized text}, \\t, \\sum, \\sqrt, \\underline{underlined text}, " "\\overline{overlined text}, x^y, x_y. Scalars, equations, " "and vector elements can be embedded. Scalar: [V1/Mean]. Vector " "Element: [V1[4]]. Equation: [=[V1/Mean]^2]. A [ character " "can be inserted as \\[." msgstr "" "La syntaxe pour les libellés est dérivée d'un sous-ensemble LaTeX. Les " "éléments pris en charge sont : \\[nom de lettre grecque] et \\[Nom " "de lettre grecque], \\approx, \\cdot, \\ge, " "\\geq, \\inf ,\\int, \\le, \\leq, \\ne, \\n, \\partial, \\prod, \\pm, \\textcolor" "{nom de couleur}{texte en couleur}, \\textbf{texte en gras}, " "\\textit{texte en italique}, \\t, \\sum, \\sqrt, " "\\underline{texte souligné}, \\overline{texte surligné}, x^y, x_y. Les scalaires, équations et éléments de vecteurs peuvent " "être intégrés. Scalaire : [V1/Mean]. Éléments de vecteurs : [V1" "[4]]. Équation : [=[V1/Mean]^2]. Un caractère [ peut être " "inséré par \\[." #: ../src/widgets/labellineedit.cpp:34 msgctxt "Kst::LabelLineEdit|" msgid "Label text. A subset of LaTeX is supported. See What's This." msgstr "" "Texte du libellé. Un sous-ensemble de LaTeX permet de faire des libellés " "avancés. Voir l'aide \"Qu'est-ce que c'est ?\" pour les détails." #: ../src/widgets/matrixselector.ui:14 msgctxt "MatrixSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Sélectionner un vecteur à utiliser. Pour créer un nouveau vecteur, cliquer " "sur l'icône avec l'étoile à droite." #: ../src/widgets/matrixselector.ui:39 msgctxt "MatrixSelector|" msgid "Create a new vector." msgstr "Créer un nouveau vecteur." #: ../src/widgets/matrixselector.ui:42 msgctxt "MatrixSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Ouvrir le dialogue de création de vecteur. Le vecteur créé sera " "automatiquement sélectionné." #: ../src/widgets/matrixselector.ui:61 msgctxt "MatrixSelector|" msgid "Edit selected vector." msgstr "Modifier le vecteur sélectionné." #: ../src/widgets/matrixselector.ui:64 msgctxt "MatrixSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Ouvre un dialogue pour modifier les propriétés du vecteur sélectionné." #: ../src/widgets/modelessinfobox.ui:14 msgctxt "ModelessInfoBox|" msgid "Dialog" msgstr "Boîte de dialogue" #: ../src/widgets/modelessinfobox.ui:46 msgctxt "ModelessInfoBox|" msgid "Close" msgstr "Fermer" #: ../src/widgets/scalarlistselector.ui:14 msgctxt "ScalarListSelector|" msgid "Dialog" msgstr "Boîte de dialogue" #: ../src/widgets/scalarlistselector.ui:42 msgctxt "ScalarListSelector|enter a search term" msgid "Search:" msgstr "Chercher :" #: ../src/widgets/scalarselector.ui:14 msgctxt "ScalarSelector|" msgid "" "Select a scalar to utilize. If you wish to create a new scalar, select the " "icon to the right." msgstr "" "Sélectionner un scalaire à utiliser. Pour créer un nouveau scalaire, cliquer " "sur l'icône avec l'étoile à droite." #: ../src/widgets/scalarselector.ui:39 msgctxt "ScalarSelector|" msgid "..." msgstr "..." #: ../src/widgets/scalarselector.ui:52 msgctxt "ScalarSelector|" msgid "Create a new scalar." msgstr "Créer un nouveau scalaire." #: ../src/widgets/scalarselector.ui:71 msgctxt "ScalarSelector|" msgid "Edit selected scalar." msgstr "Modifier le scalaire sélectionné." #: ../src/widgets/stringselector.cpp:154 ../src/widgets/stringselector.cpp:159 msgctxt "Kst::StringSelector|" msgid "" msgstr "" #: ../src/widgets/stringselector.ui:20 msgctxt "StringSelector|" msgid "" "Select a string to utilize. If you wish to create a new string, select the " "icon to the right." msgstr "" "Sélectionner une chaîne à utiliser. Pour créer une nouvelle chaîne, cliquer " "sur l'icône avec l'étoile à droite." #: ../src/widgets/stringselector.ui:48 msgctxt "StringSelector|" msgid "..." msgstr "..." #: ../src/widgets/stringselector.ui:61 msgctxt "StringSelector|" msgid "Create a new string." msgstr "Créer une nouvelle chaîne." #: ../src/widgets/stringselector.ui:80 msgctxt "StringSelector|" msgid "Edit selected string." msgstr "Modifier la chaîne sélectionnée." #: ../src/widgets/vectorselector.cpp:130 ../src/widgets/vectorselector.cpp:135 msgctxt "Kst::VectorSelector|" msgid "" msgstr "" #: ../src/widgets/vectorselector.ui:14 msgctxt "VectorSelector|" msgid "" "Select a vector to utilize. If you wish to create a new vector, click on " "the icon to the right." msgstr "" "Sélectionner un vecteur à utiliser. Pour créer un nouveau vecteur, cliquer " "sur l'icône avec l'étoile à droite." #: ../src/widgets/vectorselector.ui:45 msgctxt "VectorSelector|" msgid "Create a new vector" msgstr "Créer un nouveau vecteur" #: ../src/widgets/vectorselector.ui:48 msgctxt "VectorSelector|" msgid "" "Opens a vector dialog to create a new vector, which will become the selected " "vector." msgstr "" "Ouvrir le dialogue de création de vecteur. Le vecteur créé sera " "automatiquement sélectionné." #: ../src/widgets/vectorselector.ui:67 msgctxt "VectorSelector|" msgid "Edit selected vector." msgstr "Modifier le vecteur sélectionné." #: ../src/widgets/vectorselector.ui:70 msgctxt "VectorSelector|" msgid "Opens a vector dialog to edit selected vector." msgstr "Ouvre un dialogue pour modifier les propriétés du vecteur sélectionné." #: ../src/widgets/widgets.cpp:54 msgctxt "Kst::WidgetPlugin|" msgid "Kst Widgets" msgstr "Composants graphiques Kst" #, fuzzy #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file." #~ msgstr "Erreur à la création du spectrogramme depuis le fichier Kst." #, fuzzy #~ msgctxt "QObject|" #~ msgid "Error creating CSD from Kst file. Could not find Vector." #~ msgstr "" #~ "Erreur à la création du spectrogramme depuis le fichier Kst. Impossible " #~ "de trouver le vecteur." #, fuzzy #~ msgctxt "Kst::CSDTab|" #~ msgid "Cumulative Spectral Decay" #~ msgstr "Spectrogramme" #, fuzzy #~ msgctxt "Kst::CSDDialog|" #~ msgid "Edit Cumulative Spectral Decay" #~ msgstr "Modifier le spectrogramme" #, fuzzy #~ msgctxt "Kst::CSDDialog|" #~ msgid "New Cumulative Spectral Decay" #~ msgstr "Nouveau spectrogramme" #, fuzzy #~ msgctxt "Kst::CSD|" #~ msgid "CSD: %1" #~ msgstr "Spectrogramme: %1"